From 936b1707baabf06bf7b0bc57a0179e0526ad34d4 Mon Sep 17 00:00:00 2001 From: Bryan Chen Date: Sun, 21 Jun 2020 16:35:22 +1200 Subject: [PATCH 001/192] update scheduler --- Cargo.lock | 4 ++-- runtime/common/src/parachains.rs | 2 +- runtime/kusama/src/lib.rs | 3 +++ runtime/polkadot/src/lib.rs | 3 +++ runtime/westend/src/lib.rs | 3 +++ 5 files changed, 12 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 55b417c691..a1b5111acf 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3873,9 +3873,9 @@ dependencies = [ [[package]] name = "parity-scale-codec" -version = "1.3.0" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "329c8f7f4244ddb5c37c103641027a76c530e65e8e4b8240b29f81ea40508b17" +checksum = "a74f02beb35d47e0706155c9eac554b50c671e0d868fe8296bcdf44a9a4847bf" dependencies = [ "arrayvec 0.5.1", "bitvec", diff --git a/runtime/common/src/parachains.rs b/runtime/common/src/parachains.rs index ef67adb031..04b7802456 100644 --- a/runtime/common/src/parachains.rs +++ b/runtime/common/src/parachains.rs @@ -300,7 +300,7 @@ pub trait Trait: CreateSignedTransaction> + attestations::Trait + ses } /// Origin for the parachains module. -#[derive(PartialEq, Eq, Clone)] +#[derive(PartialEq, Eq, Clone, Encode, Decode)] #[cfg_attr(feature = "std", derive(Debug))] pub enum Origin { /// It comes from a parachain. diff --git a/runtime/kusama/src/lib.rs b/runtime/kusama/src/lib.rs index 8437603237..f0e5852c0f 100644 --- a/runtime/kusama/src/lib.rs +++ b/runtime/kusama/src/lib.rs @@ -149,8 +149,10 @@ impl system::Trait for Runtime { impl scheduler::Trait for Runtime { type Event = Event; type Origin = Origin; + type PalletsOrigin = OriginCaller; type Call = Call; type MaximumWeight = MaximumBlockWeight; + type ScheduleOrigin = EnsureRoot; } parameter_types! { @@ -365,6 +367,7 @@ impl democracy::Trait for Runtime { type PreimageByteDeposit = PreimageByteDeposit; type Slash = Treasury; type Scheduler = Scheduler; + type PalletsOrigin = OriginCaller; type MaxVotes = MaxVotes; type OperationalPreimageOrigin = collective::EnsureMember; } diff --git a/runtime/polkadot/src/lib.rs b/runtime/polkadot/src/lib.rs index 6b05529f61..ba3b90fae5 100644 --- a/runtime/polkadot/src/lib.rs +++ b/runtime/polkadot/src/lib.rs @@ -175,8 +175,10 @@ impl system::Trait for Runtime { impl scheduler::Trait for Runtime { type Event = Event; type Origin = Origin; + type PalletsOrigin = OriginCaller; type Call = Call; type MaximumWeight = MaximumBlockWeight; + type ScheduleOrigin = EnsureRoot; } parameter_types! { @@ -411,6 +413,7 @@ impl democracy::Trait for Runtime { type OperationalPreimageOrigin = collective::EnsureMember; type Slash = Treasury; type Scheduler = Scheduler; + type PalletsOrigin = OriginCaller; type MaxVotes = MaxVotes; } diff --git a/runtime/westend/src/lib.rs b/runtime/westend/src/lib.rs index 4214ece1c4..3844a69139 100644 --- a/runtime/westend/src/lib.rs +++ b/runtime/westend/src/lib.rs @@ -58,6 +58,7 @@ use im_online::sr25519::AuthorityId as ImOnlineId; use authority_discovery_primitives::AuthorityId as AuthorityDiscoveryId; use transaction_payment_rpc_runtime_api::RuntimeDispatchInfo; use session::historical as session_historical; +use system::EnsureRoot; #[cfg(feature = "std")] pub use staking::StakerStatus; @@ -138,8 +139,10 @@ impl system::Trait for Runtime { impl scheduler::Trait for Runtime { type Event = Event; type Origin = Origin; + type PalletsOrigin = OriginCaller; type Call = Call; type MaximumWeight = MaximumBlockWeight; + type ScheduleOrigin = EnsureRoot; } parameter_types! { -- GitLab From f65761943e359cd74690eb1eb805e98ee2a61a17 Mon Sep 17 00:00:00 2001 From: Pierre Krieger Date: Mon, 22 Jun 2020 19:19:50 +0200 Subject: [PATCH 002/192] Use /dns/ rather than /dns4/ (#1275) * Use /dns4/ rather than /dns/ * Update polkadot.json --- docker/sentry-docker-compose.yml | 4 ++-- service/res/kusama.json | 18 +++++++++--------- service/res/polkadot.json | 16 ++++++++-------- 3 files changed, 19 insertions(+), 19 deletions(-) diff --git a/docker/sentry-docker-compose.yml b/docker/sentry-docker-compose.yml index 18e7621fe7..af0510592d 100644 --- a/docker/sentry-docker-compose.yml +++ b/docker/sentry-docker-compose.yml @@ -47,7 +47,7 @@ services: - "--name" - "${VALIDATOR_NANE:-AlicesNode}" - "--reserved-nodes" - - "${VALIDATOR_RESERVED_NODES:-/dns4/sentry/tcp/30333/p2p/QmV7EhW6J6KgmNdr558RH1mPx2xGGznW7At4BhXzntRFsi}" + - "${VALIDATOR_RESERVED_NODES:-/dns/sentry/tcp/30333/p2p/QmV7EhW6J6KgmNdr558RH1mPx2xGGznW7At4BhXzntRFsi}" # Not only bind to localhost. - "--ws-external" - "--rpc-external" @@ -90,7 +90,7 @@ services: - "--name" - "${SENTRY_NAME:-CharliesNode}" - "--bootnodes" - - "${SENTRY_BOOTNODES:-/dns4/validator-a/tcp/30333/p2p/QmRpheLN4JWdAnY7HGJfWFNbfkQCb6tFf4vvA6hgjMZKrR}" + - "${SENTRY_BOOTNODES:-/dns/validator-a/tcp/30333/p2p/QmRpheLN4JWdAnY7HGJfWFNbfkQCb6tFf4vvA6hgjMZKrR}" - "--no-telemetry" - "--rpc-cors" - "all" diff --git a/service/res/kusama.json b/service/res/kusama.json index 9b377ab392..64e14b9ec8 100644 --- a/service/res/kusama.json +++ b/service/res/kusama.json @@ -2,15 +2,15 @@ "name": "Kusama", "id": "ksmcc3", "bootNodes": [ - "/dns4/p2p.cc3-0.kusama.network/tcp/30100/p2p/12D3KooWDgtynm4S9M3m6ZZhXYu2RrWKdvkCSScc25xKDVSg1Sjd", - "/dns4/p2p.cc3-1.kusama.network/tcp/30100/p2p/12D3KooWNpGriWPmf621Lza9UWU9eLLBdCFaErf6d4HSK7Bcqnv4", - "/dns4/p2p.cc3-2.kusama.network/tcp/30100/p2p/12D3KooWLmLiB4AenmN2g2mHbhNXbUcNiGi99sAkSk1kAQedp8uE", - "/dns4/p2p.cc3-3.kusama.network/tcp/30100/p2p/12D3KooWEGHw84b4hfvXEfyq4XWEmWCbRGuHMHQMpby4BAtZ4xJf", - "/dns4/p2p.cc3-4.kusama.network/tcp/30100/p2p/12D3KooWF9KDPRMN8WpeyXhEeURZGP8Dmo7go1tDqi7hTYpxV9uW", - "/dns4/p2p.cc3-5.kusama.network/tcp/30100/p2p/12D3KooWDiwMeqzvgWNreS9sV1HW3pZv1PA7QGA7HUCo7FzN5gcA", - "/dns4/kusama-bootnode-0.paritytech.net/tcp/30333/p2p/QmTFUXWi98EADXdsUxvv7t9fhJG1XniRijahDXxdv1EbAW", - "/dns4/kusama-bootnode-0.paritytech.net/tcp/30334/ws/p2p/QmTFUXWi98EADXdsUxvv7t9fhJG1XniRijahDXxdv1EbAW", - "/dns4/kusama-bootnode-1.paritytech.net/tcp/30333/p2p/Qmf58BhdDSkHxGy1gX5YUuHCpdYYGACxQM3nGWa7xJa5an" + "/dns/p2p.cc3-0.kusama.network/tcp/30100/p2p/12D3KooWDgtynm4S9M3m6ZZhXYu2RrWKdvkCSScc25xKDVSg1Sjd", + "/dns/p2p.cc3-1.kusama.network/tcp/30100/p2p/12D3KooWNpGriWPmf621Lza9UWU9eLLBdCFaErf6d4HSK7Bcqnv4", + "/dns/p2p.cc3-2.kusama.network/tcp/30100/p2p/12D3KooWLmLiB4AenmN2g2mHbhNXbUcNiGi99sAkSk1kAQedp8uE", + "/dns/p2p.cc3-3.kusama.network/tcp/30100/p2p/12D3KooWEGHw84b4hfvXEfyq4XWEmWCbRGuHMHQMpby4BAtZ4xJf", + "/dns/p2p.cc3-4.kusama.network/tcp/30100/p2p/12D3KooWF9KDPRMN8WpeyXhEeURZGP8Dmo7go1tDqi7hTYpxV9uW", + "/dns/p2p.cc3-5.kusama.network/tcp/30100/p2p/12D3KooWDiwMeqzvgWNreS9sV1HW3pZv1PA7QGA7HUCo7FzN5gcA", + "/dns/kusama-bootnode-0.paritytech.net/tcp/30333/p2p/QmTFUXWi98EADXdsUxvv7t9fhJG1XniRijahDXxdv1EbAW", + "/dns/kusama-bootnode-0.paritytech.net/tcp/30334/ws/p2p/QmTFUXWi98EADXdsUxvv7t9fhJG1XniRijahDXxdv1EbAW", + "/dns/kusama-bootnode-1.paritytech.net/tcp/30333/p2p/Qmf58BhdDSkHxGy1gX5YUuHCpdYYGACxQM3nGWa7xJa5an" ], "telemetryEndpoints": [ [ diff --git a/service/res/polkadot.json b/service/res/polkadot.json index 07c26f2e78..90e3f529a8 100644 --- a/service/res/polkadot.json +++ b/service/res/polkadot.json @@ -3,14 +3,14 @@ "id": "polkadot", "chainType": "Live", "bootNodes": [ - "/dns4/p2p.cc1-0.polkadot.network/tcp/30100/p2p/12D3KooWEdsXX9657ppNqqrRuaCHFvuNemasgU5msLDwSJ6WqsKc", - "/dns4/p2p.cc1-1.polkadot.network/tcp/30100/p2p/12D3KooWAtx477KzC8LwqLjWWUG6WF4Gqp2eNXmeqAG98ehAMWYH", - "/dns4/p2p.cc1-2.polkadot.network/tcp/30100/p2p/12D3KooWAGCCPZbr9UWGXPtBosTZo91Hb5M3hU8v6xbKgnC5LVao", - "/dns4/p2p.cc1-3.polkadot.network/tcp/30100/p2p/12D3KooWJ4eyPowiVcPU46pXuE2cDsiAmuBKXnFcFPapm4xKFdMJ", - "/dns4/p2p.cc1-4.polkadot.network/tcp/30100/p2p/12D3KooWNMUcqwSj38oEq1zHeGnWKmMvrCFnpMftw7JzjAtRj2rU", - "/dns4/p2p.cc1-5.polkadot.network/tcp/30100/p2p/12D3KooWDs6LnpmWDWgZyGtcLVr3E75CoBxzg1YZUPL5Bb1zz6fM", - "/dns4/cc1-0.parity.tech/tcp/30333/p2p/12D3KooWSz8r2WyCdsfWHgPyvD8GKQdJ1UAiRmrcrs8sQB3fe2KU", - "/dns4/cc1-1.parity.tech/tcp/30333/p2p/12D3KooWFN2mhgpkJsDBuNuE5427AcDrsib8EoqGMZmkxWwx3Md4" + "/dns/p2p.cc1-0.polkadot.network/tcp/30100/p2p/12D3KooWEdsXX9657ppNqqrRuaCHFvuNemasgU5msLDwSJ6WqsKc", + "/dns/p2p.cc1-1.polkadot.network/tcp/30100/p2p/12D3KooWAtx477KzC8LwqLjWWUG6WF4Gqp2eNXmeqAG98ehAMWYH", + "/dns/p2p.cc1-2.polkadot.network/tcp/30100/p2p/12D3KooWAGCCPZbr9UWGXPtBosTZo91Hb5M3hU8v6xbKgnC5LVao", + "/dns/p2p.cc1-3.polkadot.network/tcp/30100/p2p/12D3KooWJ4eyPowiVcPU46pXuE2cDsiAmuBKXnFcFPapm4xKFdMJ", + "/dns/p2p.cc1-4.polkadot.network/tcp/30100/p2p/12D3KooWNMUcqwSj38oEq1zHeGnWKmMvrCFnpMftw7JzjAtRj2rU", + "/dns/p2p.cc1-5.polkadot.network/tcp/30100/p2p/12D3KooWDs6LnpmWDWgZyGtcLVr3E75CoBxzg1YZUPL5Bb1zz6fM", + "/dns/cc1-0.parity.tech/tcp/30333/p2p/12D3KooWSz8r2WyCdsfWHgPyvD8GKQdJ1UAiRmrcrs8sQB3fe2KU", + "/dns/cc1-1.parity.tech/tcp/30333/p2p/12D3KooWFN2mhgpkJsDBuNuE5427AcDrsib8EoqGMZmkxWwx3Md4" ], "telemetryEndpoints": [ [ -- GitLab From 1a0c1e9fe57c941e8de7a80ef6890cc3c3750d7b Mon Sep 17 00:00:00 2001 From: s3krit Date: Mon, 22 Jun 2020 19:24:12 +0200 Subject: [PATCH 003/192] [CI] Refactor publish_draft_release.sh (#1289) * Refactor publish_draft_release.sh * Switch to using arrays for storing labelled changes * Combine changes for Polkadot and Substrate * Change sanitised_git_logs in `lib.sh` to drop `*`s at the start * Only look for priorities of medium or above (presence of one or more C1 label is enforeced by check-labels anyway, saves us some API calls) * Ensure priorities >C1-low aren't labelled B0-silent --- scripts/gitlab/check_labels.sh | 22 +++-- scripts/gitlab/lib.sh | 4 +- scripts/gitlab/publish_draft_release.sh | 107 +++++++++++------------- 3 files changed, 65 insertions(+), 68 deletions(-) diff --git a/scripts/gitlab/check_labels.sh b/scripts/gitlab/check_labels.sh index 36cbcadbc0..b2feebc09c 100755 --- a/scripts/gitlab/check_labels.sh +++ b/scripts/gitlab/check_labels.sh @@ -3,9 +3,11 @@ #shellcheck source=lib.sh source "$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )/lib.sh" +repo='paritytech/polkadot' + ensure_labels() { for label in "$@"; do - if has_label 'paritytech/polkadot' "$CI_COMMIT_BRANCH" "$label"; then + if has_label "$repo" "$CI_COMMIT_BRANCH" "$label"; then return 0 fi done @@ -19,7 +21,7 @@ releasenotes_labels=( 'B2-runtimenoteworthy' ) -criticality_labels=( +priority_labels=( 'C1-low' 'C3-medium' 'C7-high' @@ -34,11 +36,19 @@ else exit 1 fi -echo "[+] Checking release criticality (C) labels for $CI_COMMIT_BRANCH" -if ensure_labels "${criticality_labels[@]}"; then - echo "[+] Release criticality label detected. All is well." +echo "[+] Checking release priority (C) labels for $CI_COMMIT_BRANCH" +if ensure_labels "${priority_labels[@]}"; then + echo "[+] Release priority label detected. All is well." else - echo "[!] Release criticality label not detected. Please add one of: ${criticality_labels[*]}" + echo "[!] Release priority label not detected. Please add one of: ${priority_labels[*]}" + exit 1 +fi + +# If the priority is anything other than C1-low, we *must not* have a B0-silent +# label +if has_label "$repo" "$CI_COMMIT_BRANCH" 'B0-silent' && + ! has_label "$repo" "$CI_COMMIT_BRANCH" 'C1-low' ; then + echo "[!] Changes with a priority higher than C1-low *MUST* have a B- label that is not B0-Silent" exit 1 fi diff --git a/scripts/gitlab/lib.sh b/scripts/gitlab/lib.sh index 32e1827d25..0f1c74193b 100755 --- a/scripts/gitlab/lib.sh +++ b/scripts/gitlab/lib.sh @@ -9,9 +9,7 @@ sanitised_git_logs(){ # Only find messages referencing a PR grep -E '\(#[0-9]+\)' | # Strip any asterisks - sed 's/^* //g' | - # And add them all back - sed 's/^/* /g' + sed 's/^* //g' } # Checks whether a tag on github has been verified diff --git a/scripts/gitlab/publish_draft_release.sh b/scripts/gitlab/publish_draft_release.sh index e9bf69c79d..c91846bc88 100755 --- a/scripts/gitlab/publish_draft_release.sh +++ b/scripts/gitlab/publish_draft_release.sh @@ -50,7 +50,9 @@ This release was built with the following versions of \`rustc\`. Other versions - $nightly_rustc " -runtime_changes="" +declare -a misc_changes +declare -a runtime_changes +declare -a client_changes # Following variables are for tracking the priority of the release (i.e., # how important it is for the user to upgrade). @@ -72,7 +74,9 @@ declare -A priority_descriptions=( ['C9-critical']="Upgrade priority: ❗❗ **URGENT** ❗❗ PLEASE UPGRADE IMMEDIATELY" ) -max_label=-1 +# We don't actually take any action on C1-low, so we can start at medium +# But set C1-low as the default +max_label=1 priority="${priority_descriptions['C1-low']}" declare -a priority_changes @@ -93,6 +97,7 @@ while IFS= read -r line; do prev_label="$max_label" max_label="$index" priority="${priority_descriptions[$cur_label]}" + # If it's not an increase in priority, we just append the PR to the list if [ "$prev_label" == "$max_label" ]; then priority_changes+=("${line/\* /}") @@ -101,6 +106,12 @@ while IFS= read -r line; do if [ "$prev_label" != "$max_label" ]; then priority_changes=("${line/\* /}") fi + + # Append priority to change + # Skip first 3 chars + note=${cur_label:3} + # And capitalise + line=" \`${note^}\` $line" fi done @@ -111,26 +122,16 @@ while IFS= read -r line; do # If the PR has a runtimenoteworthy label, add to the runtime_changes section if has_label 'paritytech/polkadot' "$pr_id" 'B2-runtimenoteworthy'; then - runtime_changes="$runtime_changes -$line" + runtime_changes+=("$line") fi # If the PR has a releasenotes label, add to the release section if has_label 'paritytech/polkadot' "$pr_id" 'B1-releasenotes'; then - release_text="$release_text -$line" + misc_changes+=("$line") fi done <<< "$(sanitised_git_logs "$last_version" "$version" | \ sed '/^\[contracts\].*/d' | \ sed '/^contracts:.*/d' )" -if [ -n "$runtime_changes" ]; then - release_text="$release_text - -## Runtime -$runtime_changes" -fi -echo "$release_text" - # Get substrate changes between last polkadot version and current # By grepping the Cargo.lock for a substrate crate, and grepping out the commit hash cur_substrate_commit=$(grep -A 2 'name = "sc-cli"' Cargo.lock | grep -E -o '[a-f0-9]{40}') @@ -140,10 +141,6 @@ pushd $substrate_dir || exit git checkout master > /dev/null git pull > /dev/null all_substrate_changes="$(sanitised_git_logs "$old_substrate_commit" "$cur_substrate_commit" | sed 's/(#/(paritytech\/substrate#/')" - substrate_runtime_changes="" - substrate_api_changes="" - substrate_client_changes="" - substrate_changes="" echo "[+] Iterating through substrate changes to find labelled PRs" while IFS= read -r line; do @@ -159,6 +156,7 @@ pushd $substrate_dir || exit prev_label="$max_label" max_label="$index" priority="${priority_descriptions[$cur_label]}" + # If it's not an increase in priority, we just append if [ "$prev_label" == "$max_label" ]; then priority_changes+=("${line/\* /}") @@ -167,6 +165,12 @@ pushd $substrate_dir || exit if [ "$prev_label" != "$max_label" ]; then priority_changes=("${line/\* /}") fi + + # Append priority to change + # Skip first 3 chars + note=${cur_label:3} + # And capitalise + line=" \`${note^}\` $line" fi done @@ -174,55 +178,17 @@ pushd $substrate_dir || exit if has_label 'paritytech/substrate' "$pr_id" 'B0-silent'; then continue fi - if has_label 'paritytech/substrate' "$pr_id" 'B3-apinoteworthy' ; then - substrate_api_changes="$substrate_api_changes -$line" - continue - fi if has_label 'paritytech/substrate' "$pr_id" 'B5-clientnoteworthy'; then - substrate_client_changes="$substrate_client_changes -$line" + client_changes+=("$line") fi if has_label 'paritytech/substrate' "$pr_id" 'B7-runtimenoteworthy'; then - substrate_runtime_changes="$substrate_runtime_changes -$line" + runtime_changes+=("$line") fi done <<< "$all_substrate_changes" popd || exit -# Make the substrate section if there are any substrate changes -if [ -n "$substrate_runtime_changes" ] || - [ -n "$substrate_api_changes" ] || - [ -n "$substrate_client_changes" ]; then - substrate_changes=$(cat << EOF -# Substrate changes - -EOF -) - if [ -n "$substrate_runtime_changes" ]; then - substrate_changes="$substrate_changes - -## Runtime -$substrate_runtime_changes" - fi - if [ -n "$substrate_client_changes" ]; then - substrate_changes="$substrate_changes - -## Client -$substrate_client_changes" - fi - if [ -n "$substrate_api_changes" ]; then - substrate_changes="$substrate_changes - -## API -$substrate_api_changes" - fi - release_text="$release_text - -$substrate_changes" -fi -# Finally, add the priorities to the *start* of the release notes +# Add the priorities to the *start* of the release notes # If polkadot and substrate priority = low, no need for list of changes if [ "$priority" == "${priority_descriptions['C1-low']}" ]; then release_text="$priority @@ -234,6 +200,29 @@ else $release_text" fi +# Append all notable changes to the release notes + +if [ "${#misc_changes[*]}" -gt 0 ] ; then + release_text="$release_text + +## Changes +$(printf '* %s\n' "${misc_changes[@]}")" +fi + +if [ "${#client_changes[*]}" -gt 0 ] ; then + release_text="$release_text + +## Client +$(printf '* %s\n' "${client_changes[@]}")" +fi + +if [ "${#runtime_changes[*]}" -gt 0 ] ; then + release_text="$release_text + +## Runtime +$(printf '* %s\n' "${runtime_changes[@]}")" +fi + echo "[+] Release text generated: " echo "$release_text" -- GitLab From 963d31b857c4b036653d6a43ee9eb5858454cbc6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Silva?= <123550+andresilva@users.noreply.github.com> Date: Mon, 22 Jun 2020 18:27:38 +0100 Subject: [PATCH 004/192] node: spawn babe and grandpa as blocking tasks (#1292) * node: spawn babe and grandpa as blocking tasks * update to latest substrate --- Cargo.lock | 276 ++++++++++++++++++++-------------------- node/service/src/lib.rs | 6 +- service/src/lib.rs | 8 +- 3 files changed, 145 insertions(+), 145 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 55b417c691..9c2511c039 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1172,7 +1172,7 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "fork-tree" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#31c3e06ded197bdf28130ac0c5310283b2d1b5b3" +source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" dependencies = [ "parity-scale-codec", ] @@ -1180,7 +1180,7 @@ dependencies = [ [[package]] name = "frame-benchmarking" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#31c3e06ded197bdf28130ac0c5310283b2d1b5b3" +source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" dependencies = [ "frame-support", "frame-system", @@ -1197,7 +1197,7 @@ dependencies = [ [[package]] name = "frame-benchmarking-cli" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#31c3e06ded197bdf28130ac0c5310283b2d1b5b3" +source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" dependencies = [ "frame-benchmarking", "parity-scale-codec", @@ -1215,7 +1215,7 @@ dependencies = [ [[package]] name = "frame-executive" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#31c3e06ded197bdf28130ac0c5310283b2d1b5b3" +source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" dependencies = [ "frame-support", "frame-system", @@ -1230,7 +1230,7 @@ dependencies = [ [[package]] name = "frame-metadata" version = "11.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#31c3e06ded197bdf28130ac0c5310283b2d1b5b3" +source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" dependencies = [ "parity-scale-codec", "serde", @@ -1241,7 +1241,7 @@ dependencies = [ [[package]] name = "frame-support" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#31c3e06ded197bdf28130ac0c5310283b2d1b5b3" +source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" dependencies = [ "bitmask", "frame-metadata", @@ -1266,7 +1266,7 @@ dependencies = [ [[package]] name = "frame-support-procedural" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#31c3e06ded197bdf28130ac0c5310283b2d1b5b3" +source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" dependencies = [ "frame-support-procedural-tools", "proc-macro2 1.0.18", @@ -1277,7 +1277,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#31c3e06ded197bdf28130ac0c5310283b2d1b5b3" +source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" dependencies = [ "frame-support-procedural-tools-derive", "proc-macro-crate", @@ -1289,7 +1289,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools-derive" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#31c3e06ded197bdf28130ac0c5310283b2d1b5b3" +source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" dependencies = [ "proc-macro2 1.0.18", "quote 1.0.7", @@ -1299,7 +1299,7 @@ dependencies = [ [[package]] name = "frame-system" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#31c3e06ded197bdf28130ac0c5310283b2d1b5b3" +source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" dependencies = [ "frame-support", "impl-trait-for-tuples", @@ -1315,7 +1315,7 @@ dependencies = [ [[package]] name = "frame-system-benchmarking" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#31c3e06ded197bdf28130ac0c5310283b2d1b5b3" +source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" dependencies = [ "frame-benchmarking", "frame-support", @@ -1329,7 +1329,7 @@ dependencies = [ [[package]] name = "frame-system-rpc-runtime-api" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#31c3e06ded197bdf28130ac0c5310283b2d1b5b3" +source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" dependencies = [ "parity-scale-codec", "sp-api", @@ -3266,7 +3266,7 @@ dependencies = [ [[package]] name = "pallet-authority-discovery" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#31c3e06ded197bdf28130ac0c5310283b2d1b5b3" +source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" dependencies = [ "frame-support", "frame-system", @@ -3282,7 +3282,7 @@ dependencies = [ [[package]] name = "pallet-authorship" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#31c3e06ded197bdf28130ac0c5310283b2d1b5b3" +source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" dependencies = [ "frame-support", "frame-system", @@ -3297,7 +3297,7 @@ dependencies = [ [[package]] name = "pallet-babe" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#31c3e06ded197bdf28130ac0c5310283b2d1b5b3" +source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" dependencies = [ "frame-support", "frame-system", @@ -3319,7 +3319,7 @@ dependencies = [ [[package]] name = "pallet-balances" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#31c3e06ded197bdf28130ac0c5310283b2d1b5b3" +source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" dependencies = [ "frame-benchmarking", "frame-support", @@ -3333,7 +3333,7 @@ dependencies = [ [[package]] name = "pallet-collective" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#31c3e06ded197bdf28130ac0c5310283b2d1b5b3" +source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" dependencies = [ "frame-benchmarking", "frame-support", @@ -3349,7 +3349,7 @@ dependencies = [ [[package]] name = "pallet-democracy" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#31c3e06ded197bdf28130ac0c5310283b2d1b5b3" +source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" dependencies = [ "frame-benchmarking", "frame-support", @@ -3364,7 +3364,7 @@ dependencies = [ [[package]] name = "pallet-elections-phragmen" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#31c3e06ded197bdf28130ac0c5310283b2d1b5b3" +source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" dependencies = [ "frame-benchmarking", "frame-support", @@ -3379,7 +3379,7 @@ dependencies = [ [[package]] name = "pallet-finality-tracker" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#31c3e06ded197bdf28130ac0c5310283b2d1b5b3" +source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" dependencies = [ "frame-support", "frame-system", @@ -3395,7 +3395,7 @@ dependencies = [ [[package]] name = "pallet-grandpa" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#31c3e06ded197bdf28130ac0c5310283b2d1b5b3" +source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" dependencies = [ "frame-support", "frame-system", @@ -3415,7 +3415,7 @@ dependencies = [ [[package]] name = "pallet-identity" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#31c3e06ded197bdf28130ac0c5310283b2d1b5b3" +source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" dependencies = [ "enumflags2", "frame-benchmarking", @@ -3431,7 +3431,7 @@ dependencies = [ [[package]] name = "pallet-im-online" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#31c3e06ded197bdf28130ac0c5310283b2d1b5b3" +source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" dependencies = [ "frame-benchmarking", "frame-support", @@ -3451,7 +3451,7 @@ dependencies = [ [[package]] name = "pallet-indices" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#31c3e06ded197bdf28130ac0c5310283b2d1b5b3" +source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" dependencies = [ "frame-support", "frame-system", @@ -3467,7 +3467,7 @@ dependencies = [ [[package]] name = "pallet-membership" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#31c3e06ded197bdf28130ac0c5310283b2d1b5b3" +source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" dependencies = [ "frame-support", "frame-system", @@ -3481,7 +3481,7 @@ dependencies = [ [[package]] name = "pallet-multisig" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#31c3e06ded197bdf28130ac0c5310283b2d1b5b3" +source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" dependencies = [ "frame-support", "frame-system", @@ -3496,7 +3496,7 @@ dependencies = [ [[package]] name = "pallet-nicks" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#31c3e06ded197bdf28130ac0c5310283b2d1b5b3" +source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" dependencies = [ "frame-support", "frame-system", @@ -3510,7 +3510,7 @@ dependencies = [ [[package]] name = "pallet-offences" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#31c3e06ded197bdf28130ac0c5310283b2d1b5b3" +source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" dependencies = [ "frame-support", "frame-system", @@ -3525,7 +3525,7 @@ dependencies = [ [[package]] name = "pallet-offences-benchmarking" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#31c3e06ded197bdf28130ac0c5310283b2d1b5b3" +source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" dependencies = [ "frame-benchmarking", "frame-support", @@ -3546,7 +3546,7 @@ dependencies = [ [[package]] name = "pallet-proxy" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#31c3e06ded197bdf28130ac0c5310283b2d1b5b3" +source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" dependencies = [ "frame-support", "frame-system", @@ -3561,7 +3561,7 @@ dependencies = [ [[package]] name = "pallet-randomness-collective-flip" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#31c3e06ded197bdf28130ac0c5310283b2d1b5b3" +source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" dependencies = [ "frame-support", "frame-system", @@ -3574,7 +3574,7 @@ dependencies = [ [[package]] name = "pallet-recovery" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#31c3e06ded197bdf28130ac0c5310283b2d1b5b3" +source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" dependencies = [ "enumflags2", "frame-support", @@ -3589,7 +3589,7 @@ dependencies = [ [[package]] name = "pallet-scheduler" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#31c3e06ded197bdf28130ac0c5310283b2d1b5b3" +source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" dependencies = [ "frame-benchmarking", "frame-support", @@ -3604,7 +3604,7 @@ dependencies = [ [[package]] name = "pallet-session" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#31c3e06ded197bdf28130ac0c5310283b2d1b5b3" +source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" dependencies = [ "frame-support", "frame-system", @@ -3624,7 +3624,7 @@ dependencies = [ [[package]] name = "pallet-session-benchmarking" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#31c3e06ded197bdf28130ac0c5310283b2d1b5b3" +source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" dependencies = [ "frame-benchmarking", "frame-support", @@ -3638,7 +3638,7 @@ dependencies = [ [[package]] name = "pallet-society" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#31c3e06ded197bdf28130ac0c5310283b2d1b5b3" +source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" dependencies = [ "frame-support", "frame-system", @@ -3652,7 +3652,7 @@ dependencies = [ [[package]] name = "pallet-staking" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#31c3e06ded197bdf28130ac0c5310283b2d1b5b3" +source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" dependencies = [ "frame-benchmarking", "frame-support", @@ -3674,7 +3674,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-curve" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#31c3e06ded197bdf28130ac0c5310283b2d1b5b3" +source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -3685,7 +3685,7 @@ dependencies = [ [[package]] name = "pallet-sudo" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#31c3e06ded197bdf28130ac0c5310283b2d1b5b3" +source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" dependencies = [ "frame-support", "frame-system", @@ -3699,7 +3699,7 @@ dependencies = [ [[package]] name = "pallet-timestamp" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#31c3e06ded197bdf28130ac0c5310283b2d1b5b3" +source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" dependencies = [ "frame-benchmarking", "frame-support", @@ -3717,7 +3717,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#31c3e06ded197bdf28130ac0c5310283b2d1b5b3" +source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" dependencies = [ "frame-support", "frame-system", @@ -3732,7 +3732,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#31c3e06ded197bdf28130ac0c5310283b2d1b5b3" +source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" dependencies = [ "jsonrpc-core", "jsonrpc-core-client", @@ -3750,7 +3750,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc-runtime-api" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#31c3e06ded197bdf28130ac0c5310283b2d1b5b3" +source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" dependencies = [ "frame-support", "parity-scale-codec", @@ -3763,7 +3763,7 @@ dependencies = [ [[package]] name = "pallet-treasury" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#31c3e06ded197bdf28130ac0c5310283b2d1b5b3" +source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" dependencies = [ "frame-benchmarking", "frame-support", @@ -3778,7 +3778,7 @@ dependencies = [ [[package]] name = "pallet-utility" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#31c3e06ded197bdf28130ac0c5310283b2d1b5b3" +source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" dependencies = [ "frame-benchmarking", "frame-support", @@ -3794,7 +3794,7 @@ dependencies = [ [[package]] name = "pallet-vesting" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#31c3e06ded197bdf28130ac0c5310283b2d1b5b3" +source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" dependencies = [ "enumflags2", "frame-benchmarking", @@ -3873,9 +3873,9 @@ dependencies = [ [[package]] name = "parity-scale-codec" -version = "1.3.0" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "329c8f7f4244ddb5c37c103641027a76c530e65e8e4b8240b29f81ea40508b17" +checksum = "a74f02beb35d47e0706155c9eac554b50c671e0d868fe8296bcdf44a9a4847bf" dependencies = [ "arrayvec 0.5.1", "bitvec", @@ -5531,7 +5531,7 @@ dependencies = [ [[package]] name = "sc-authority-discovery" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#31c3e06ded197bdf28130ac0c5310283b2d1b5b3" +source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" dependencies = [ "bytes 0.5.4", "derive_more 0.99.8", @@ -5558,7 +5558,7 @@ dependencies = [ [[package]] name = "sc-basic-authorship" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#31c3e06ded197bdf28130ac0c5310283b2d1b5b3" +source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -5582,7 +5582,7 @@ dependencies = [ [[package]] name = "sc-block-builder" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#31c3e06ded197bdf28130ac0c5310283b2d1b5b3" +source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" dependencies = [ "parity-scale-codec", "sc-client-api", @@ -5598,7 +5598,7 @@ dependencies = [ [[package]] name = "sc-chain-spec" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#31c3e06ded197bdf28130ac0c5310283b2d1b5b3" +source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" dependencies = [ "impl-trait-for-tuples", "sc-chain-spec-derive", @@ -5614,7 +5614,7 @@ dependencies = [ [[package]] name = "sc-chain-spec-derive" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#31c3e06ded197bdf28130ac0c5310283b2d1b5b3" +source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -5625,7 +5625,7 @@ dependencies = [ [[package]] name = "sc-cli" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#31c3e06ded197bdf28130ac0c5310283b2d1b5b3" +source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" dependencies = [ "ansi_term 0.12.1", "atty", @@ -5665,7 +5665,7 @@ dependencies = [ [[package]] name = "sc-client-api" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#31c3e06ded197bdf28130ac0c5310283b2d1b5b3" +source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" dependencies = [ "derive_more 0.99.8", "fnv", @@ -5701,7 +5701,7 @@ dependencies = [ [[package]] name = "sc-client-db" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#31c3e06ded197bdf28130ac0c5310283b2d1b5b3" +source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" dependencies = [ "blake2-rfc", "hash-db", @@ -5730,7 +5730,7 @@ dependencies = [ [[package]] name = "sc-consensus" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#31c3e06ded197bdf28130ac0c5310283b2d1b5b3" +source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" dependencies = [ "sc-client-api", "sp-blockchain", @@ -5741,7 +5741,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#31c3e06ded197bdf28130ac0c5310283b2d1b5b3" +source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" dependencies = [ "derive_more 0.99.8", "fork-tree", @@ -5783,7 +5783,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe-rpc" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#31c3e06ded197bdf28130ac0c5310283b2d1b5b3" +source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" dependencies = [ "derive_more 0.99.8", "futures 0.3.5", @@ -5807,7 +5807,7 @@ dependencies = [ [[package]] name = "sc-consensus-epochs" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#31c3e06ded197bdf28130ac0c5310283b2d1b5b3" +source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" dependencies = [ "fork-tree", "parity-scale-codec", @@ -5820,7 +5820,7 @@ dependencies = [ [[package]] name = "sc-consensus-slots" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#31c3e06ded197bdf28130ac0c5310283b2d1b5b3" +source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -5842,7 +5842,7 @@ dependencies = [ [[package]] name = "sc-consensus-uncles" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#31c3e06ded197bdf28130ac0c5310283b2d1b5b3" +source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" dependencies = [ "log 0.4.8", "sc-client-api", @@ -5856,7 +5856,7 @@ dependencies = [ [[package]] name = "sc-executor" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#31c3e06ded197bdf28130ac0c5310283b2d1b5b3" +source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" dependencies = [ "derive_more 0.99.8", "lazy_static", @@ -5884,7 +5884,7 @@ dependencies = [ [[package]] name = "sc-executor-common" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#31c3e06ded197bdf28130ac0c5310283b2d1b5b3" +source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" dependencies = [ "derive_more 0.99.8", "log 0.4.8", @@ -5901,7 +5901,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmi" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#31c3e06ded197bdf28130ac0c5310283b2d1b5b3" +source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" dependencies = [ "log 0.4.8", "parity-scale-codec", @@ -5916,7 +5916,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmtime" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#31c3e06ded197bdf28130ac0c5310283b2d1b5b3" +source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" dependencies = [ "cranelift-codegen", "cranelift-wasm", @@ -5937,7 +5937,7 @@ dependencies = [ [[package]] name = "sc-finality-grandpa" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#31c3e06ded197bdf28130ac0c5310283b2d1b5b3" +source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" dependencies = [ "assert_matches", "derive_more 0.99.8", @@ -5975,7 +5975,7 @@ dependencies = [ [[package]] name = "sc-finality-grandpa-rpc" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#31c3e06ded197bdf28130ac0c5310283b2d1b5b3" +source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" dependencies = [ "derive_more 0.99.8", "finality-grandpa", @@ -5992,7 +5992,7 @@ dependencies = [ [[package]] name = "sc-informant" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#31c3e06ded197bdf28130ac0c5310283b2d1b5b3" +source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" dependencies = [ "ansi_term 0.12.1", "futures 0.3.5", @@ -6011,7 +6011,7 @@ dependencies = [ [[package]] name = "sc-keystore" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#31c3e06ded197bdf28130ac0c5310283b2d1b5b3" +source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" dependencies = [ "derive_more 0.99.8", "hex", @@ -6027,7 +6027,7 @@ dependencies = [ [[package]] name = "sc-light" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#31c3e06ded197bdf28130ac0c5310283b2d1b5b3" +source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" dependencies = [ "hash-db", "lazy_static", @@ -6046,7 +6046,7 @@ dependencies = [ [[package]] name = "sc-network" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#31c3e06ded197bdf28130ac0c5310283b2d1b5b3" +source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" dependencies = [ "bitflags", "bs58", @@ -6098,7 +6098,7 @@ dependencies = [ [[package]] name = "sc-network-gossip" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#31c3e06ded197bdf28130ac0c5310283b2d1b5b3" +source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6113,7 +6113,7 @@ dependencies = [ [[package]] name = "sc-network-test" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#31c3e06ded197bdf28130ac0c5310283b2d1b5b3" +source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" dependencies = [ "env_logger", "futures 0.3.5", @@ -6140,7 +6140,7 @@ dependencies = [ [[package]] name = "sc-offchain" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#31c3e06ded197bdf28130ac0c5310283b2d1b5b3" +source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" dependencies = [ "bytes 0.5.4", "fnv", @@ -6167,7 +6167,7 @@ dependencies = [ [[package]] name = "sc-peerset" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#31c3e06ded197bdf28130ac0c5310283b2d1b5b3" +source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" dependencies = [ "futures 0.3.5", "libp2p", @@ -6180,7 +6180,7 @@ dependencies = [ [[package]] name = "sc-proposer-metrics" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#31c3e06ded197bdf28130ac0c5310283b2d1b5b3" +source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" dependencies = [ "log 0.4.8", "substrate-prometheus-endpoint", @@ -6189,7 +6189,7 @@ dependencies = [ [[package]] name = "sc-rpc" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#31c3e06ded197bdf28130ac0c5310283b2d1b5b3" +source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" dependencies = [ "futures 0.3.5", "hash-db", @@ -6221,7 +6221,7 @@ dependencies = [ [[package]] name = "sc-rpc-api" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#31c3e06ded197bdf28130ac0c5310283b2d1b5b3" +source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" dependencies = [ "derive_more 0.99.8", "futures 0.3.5", @@ -6245,7 +6245,7 @@ dependencies = [ [[package]] name = "sc-rpc-server" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#31c3e06ded197bdf28130ac0c5310283b2d1b5b3" +source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" dependencies = [ "jsonrpc-core", "jsonrpc-http-server", @@ -6261,7 +6261,7 @@ dependencies = [ [[package]] name = "sc-service" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#31c3e06ded197bdf28130ac0c5310283b2d1b5b3" +source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" dependencies = [ "derive_more 0.99.8", "directories", @@ -6324,7 +6324,7 @@ dependencies = [ [[package]] name = "sc-state-db" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#31c3e06ded197bdf28130ac0c5310283b2d1b5b3" +source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" dependencies = [ "log 0.4.8", "parity-scale-codec", @@ -6338,7 +6338,7 @@ dependencies = [ [[package]] name = "sc-telemetry" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#31c3e06ded197bdf28130ac0c5310283b2d1b5b3" +source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" dependencies = [ "bytes 0.5.4", "futures 0.3.5", @@ -6360,7 +6360,7 @@ dependencies = [ [[package]] name = "sc-tracing" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#31c3e06ded197bdf28130ac0c5310283b2d1b5b3" +source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" dependencies = [ "erased-serde", "log 0.4.8", @@ -6377,7 +6377,7 @@ dependencies = [ [[package]] name = "sc-transaction-graph" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#31c3e06ded197bdf28130ac0c5310283b2d1b5b3" +source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" dependencies = [ "derive_more 0.99.8", "futures 0.3.5", @@ -6397,7 +6397,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#31c3e06ded197bdf28130ac0c5310283b2d1b5b3" +source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" dependencies = [ "derive_more 0.99.8", "futures 0.3.5", @@ -6784,7 +6784,7 @@ dependencies = [ [[package]] name = "sp-allocator" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#31c3e06ded197bdf28130ac0c5310283b2d1b5b3" +source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" dependencies = [ "derive_more 0.99.8", "log 0.4.8", @@ -6796,7 +6796,7 @@ dependencies = [ [[package]] name = "sp-api" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#31c3e06ded197bdf28130ac0c5310283b2d1b5b3" +source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" dependencies = [ "hash-db", "parity-scale-codec", @@ -6811,7 +6811,7 @@ dependencies = [ [[package]] name = "sp-api-proc-macro" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#31c3e06ded197bdf28130ac0c5310283b2d1b5b3" +source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" dependencies = [ "blake2-rfc", "proc-macro-crate", @@ -6823,7 +6823,7 @@ dependencies = [ [[package]] name = "sp-application-crypto" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#31c3e06ded197bdf28130ac0c5310283b2d1b5b3" +source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" dependencies = [ "parity-scale-codec", "serde", @@ -6835,7 +6835,7 @@ dependencies = [ [[package]] name = "sp-arithmetic" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#31c3e06ded197bdf28130ac0c5310283b2d1b5b3" +source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" dependencies = [ "integer-sqrt", "num-traits 0.2.12", @@ -6848,7 +6848,7 @@ dependencies = [ [[package]] name = "sp-authority-discovery" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#31c3e06ded197bdf28130ac0c5310283b2d1b5b3" +source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" dependencies = [ "parity-scale-codec", "sp-api", @@ -6860,7 +6860,7 @@ dependencies = [ [[package]] name = "sp-authorship" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#31c3e06ded197bdf28130ac0c5310283b2d1b5b3" +source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" dependencies = [ "parity-scale-codec", "sp-inherents", @@ -6871,7 +6871,7 @@ dependencies = [ [[package]] name = "sp-block-builder" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#31c3e06ded197bdf28130ac0c5310283b2d1b5b3" +source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" dependencies = [ "parity-scale-codec", "sp-api", @@ -6883,7 +6883,7 @@ dependencies = [ [[package]] name = "sp-blockchain" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#31c3e06ded197bdf28130ac0c5310283b2d1b5b3" +source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" dependencies = [ "derive_more 0.99.8", "log 0.4.8", @@ -6899,7 +6899,7 @@ dependencies = [ [[package]] name = "sp-chain-spec" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#31c3e06ded197bdf28130ac0c5310283b2d1b5b3" +source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" dependencies = [ "serde", "serde_json", @@ -6908,7 +6908,7 @@ dependencies = [ [[package]] name = "sp-consensus" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#31c3e06ded197bdf28130ac0c5310283b2d1b5b3" +source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" dependencies = [ "derive_more 0.99.8", "futures 0.3.5", @@ -6931,7 +6931,7 @@ dependencies = [ [[package]] name = "sp-consensus-aura" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#31c3e06ded197bdf28130ac0c5310283b2d1b5b3" +source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" dependencies = [ "parity-scale-codec", "sp-api", @@ -6945,7 +6945,7 @@ dependencies = [ [[package]] name = "sp-consensus-babe" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#31c3e06ded197bdf28130ac0c5310283b2d1b5b3" +source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" dependencies = [ "merlin", "parity-scale-codec", @@ -6963,7 +6963,7 @@ dependencies = [ [[package]] name = "sp-consensus-vrf" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#31c3e06ded197bdf28130ac0c5310283b2d1b5b3" +source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" dependencies = [ "parity-scale-codec", "schnorrkel", @@ -6975,7 +6975,7 @@ dependencies = [ [[package]] name = "sp-core" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#31c3e06ded197bdf28130ac0c5310283b2d1b5b3" +source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" dependencies = [ "base58", "blake2-rfc", @@ -7017,7 +7017,7 @@ dependencies = [ [[package]] name = "sp-database" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#31c3e06ded197bdf28130ac0c5310283b2d1b5b3" +source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" dependencies = [ "kvdb", "parking_lot 0.10.2", @@ -7026,7 +7026,7 @@ dependencies = [ [[package]] name = "sp-debug-derive" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#31c3e06ded197bdf28130ac0c5310283b2d1b5b3" +source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" dependencies = [ "proc-macro2 1.0.18", "quote 1.0.7", @@ -7036,7 +7036,7 @@ dependencies = [ [[package]] name = "sp-externalities" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#31c3e06ded197bdf28130ac0c5310283b2d1b5b3" +source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" dependencies = [ "environmental", "parity-scale-codec", @@ -7047,7 +7047,7 @@ dependencies = [ [[package]] name = "sp-finality-grandpa" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#31c3e06ded197bdf28130ac0c5310283b2d1b5b3" +source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" dependencies = [ "finality-grandpa", "log 0.4.8", @@ -7063,7 +7063,7 @@ dependencies = [ [[package]] name = "sp-finality-tracker" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#31c3e06ded197bdf28130ac0c5310283b2d1b5b3" +source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" dependencies = [ "parity-scale-codec", "sp-inherents", @@ -7073,7 +7073,7 @@ dependencies = [ [[package]] name = "sp-inherents" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#31c3e06ded197bdf28130ac0c5310283b2d1b5b3" +source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" dependencies = [ "derive_more 0.99.8", "parity-scale-codec", @@ -7085,7 +7085,7 @@ dependencies = [ [[package]] name = "sp-io" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#31c3e06ded197bdf28130ac0c5310283b2d1b5b3" +source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" dependencies = [ "futures 0.3.5", "hash-db", @@ -7106,7 +7106,7 @@ dependencies = [ [[package]] name = "sp-keyring" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#31c3e06ded197bdf28130ac0c5310283b2d1b5b3" +source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" dependencies = [ "lazy_static", "sp-core", @@ -7117,7 +7117,7 @@ dependencies = [ [[package]] name = "sp-npos-elections" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#31c3e06ded197bdf28130ac0c5310283b2d1b5b3" +source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" dependencies = [ "parity-scale-codec", "serde", @@ -7129,7 +7129,7 @@ dependencies = [ [[package]] name = "sp-npos-elections-compact" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#31c3e06ded197bdf28130ac0c5310283b2d1b5b3" +source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -7140,7 +7140,7 @@ dependencies = [ [[package]] name = "sp-offchain" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#31c3e06ded197bdf28130ac0c5310283b2d1b5b3" +source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" dependencies = [ "sp-api", "sp-core", @@ -7150,7 +7150,7 @@ dependencies = [ [[package]] name = "sp-panic-handler" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#31c3e06ded197bdf28130ac0c5310283b2d1b5b3" +source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" dependencies = [ "backtrace", "log 0.4.8", @@ -7159,7 +7159,7 @@ dependencies = [ [[package]] name = "sp-rpc" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#31c3e06ded197bdf28130ac0c5310283b2d1b5b3" +source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" dependencies = [ "serde", "sp-core", @@ -7168,7 +7168,7 @@ dependencies = [ [[package]] name = "sp-runtime" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#31c3e06ded197bdf28130ac0c5310283b2d1b5b3" +source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" dependencies = [ "either", "hash256-std-hasher", @@ -7190,7 +7190,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#31c3e06ded197bdf28130ac0c5310283b2d1b5b3" +source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" dependencies = [ "parity-scale-codec", "primitive-types", @@ -7205,7 +7205,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#31c3e06ded197bdf28130ac0c5310283b2d1b5b3" +source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" dependencies = [ "Inflector", "proc-macro-crate", @@ -7217,7 +7217,7 @@ dependencies = [ [[package]] name = "sp-serializer" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#31c3e06ded197bdf28130ac0c5310283b2d1b5b3" +source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" dependencies = [ "serde", "serde_json", @@ -7226,7 +7226,7 @@ dependencies = [ [[package]] name = "sp-session" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#31c3e06ded197bdf28130ac0c5310283b2d1b5b3" +source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" dependencies = [ "parity-scale-codec", "sp-api", @@ -7239,7 +7239,7 @@ dependencies = [ [[package]] name = "sp-staking" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#31c3e06ded197bdf28130ac0c5310283b2d1b5b3" +source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" dependencies = [ "parity-scale-codec", "sp-runtime", @@ -7249,7 +7249,7 @@ dependencies = [ [[package]] name = "sp-state-machine" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#31c3e06ded197bdf28130ac0c5310283b2d1b5b3" +source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" dependencies = [ "hash-db", "log 0.4.8", @@ -7268,12 +7268,12 @@ dependencies = [ [[package]] name = "sp-std" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#31c3e06ded197bdf28130ac0c5310283b2d1b5b3" +source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" [[package]] name = "sp-storage" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#31c3e06ded197bdf28130ac0c5310283b2d1b5b3" +source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" dependencies = [ "impl-serde 0.2.3", "ref-cast", @@ -7285,7 +7285,7 @@ dependencies = [ [[package]] name = "sp-timestamp" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#31c3e06ded197bdf28130ac0c5310283b2d1b5b3" +source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -7299,7 +7299,7 @@ dependencies = [ [[package]] name = "sp-tracing" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#31c3e06ded197bdf28130ac0c5310283b2d1b5b3" +source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" dependencies = [ "log 0.4.8", "rental", @@ -7309,7 +7309,7 @@ dependencies = [ [[package]] name = "sp-transaction-pool" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#31c3e06ded197bdf28130ac0c5310283b2d1b5b3" +source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" dependencies = [ "derive_more 0.99.8", "futures 0.3.5", @@ -7325,7 +7325,7 @@ dependencies = [ [[package]] name = "sp-trie" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#31c3e06ded197bdf28130ac0c5310283b2d1b5b3" +source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" dependencies = [ "hash-db", "memory-db", @@ -7339,7 +7339,7 @@ dependencies = [ [[package]] name = "sp-utils" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#31c3e06ded197bdf28130ac0c5310283b2d1b5b3" +source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" dependencies = [ "futures 0.3.5", "futures-core", @@ -7351,7 +7351,7 @@ dependencies = [ [[package]] name = "sp-version" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#31c3e06ded197bdf28130ac0c5310283b2d1b5b3" +source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" dependencies = [ "impl-serde 0.2.3", "parity-scale-codec", @@ -7363,7 +7363,7 @@ dependencies = [ [[package]] name = "sp-wasm-interface" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#31c3e06ded197bdf28130ac0c5310283b2d1b5b3" +source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -7494,7 +7494,7 @@ dependencies = [ [[package]] name = "substrate-browser-utils" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#31c3e06ded197bdf28130ac0c5310283b2d1b5b3" +source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" dependencies = [ "chrono", "clear_on_drop", @@ -7521,7 +7521,7 @@ dependencies = [ [[package]] name = "substrate-build-script-utils" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#31c3e06ded197bdf28130ac0c5310283b2d1b5b3" +source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" dependencies = [ "platforms", ] @@ -7529,7 +7529,7 @@ dependencies = [ [[package]] name = "substrate-frame-rpc-system" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#31c3e06ded197bdf28130ac0c5310283b2d1b5b3" +source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" dependencies = [ "frame-system-rpc-runtime-api", "futures 0.3.5", @@ -7552,7 +7552,7 @@ dependencies = [ [[package]] name = "substrate-prometheus-endpoint" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#31c3e06ded197bdf28130ac0c5310283b2d1b5b3" +source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" dependencies = [ "async-std", "derive_more 0.99.8", @@ -7566,7 +7566,7 @@ dependencies = [ [[package]] name = "substrate-test-client" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#31c3e06ded197bdf28130ac0c5310283b2d1b5b3" +source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" dependencies = [ "futures 0.3.5", "hash-db", @@ -7588,7 +7588,7 @@ dependencies = [ [[package]] name = "substrate-test-runtime" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#31c3e06ded197bdf28130ac0c5310283b2d1b5b3" +source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" dependencies = [ "cfg-if", "frame-executive", @@ -7628,7 +7628,7 @@ dependencies = [ [[package]] name = "substrate-test-runtime-client" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#31c3e06ded197bdf28130ac0c5310283b2d1b5b3" +source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" dependencies = [ "futures 0.3.5", "parity-scale-codec", @@ -7649,7 +7649,7 @@ dependencies = [ [[package]] name = "substrate-wasm-builder-runner" version = "1.0.6" -source = "git+https://github.com/paritytech/substrate#31c3e06ded197bdf28130ac0c5310283b2d1b5b3" +source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" [[package]] name = "substrate-wasm-builder-runner" diff --git a/node/service/src/lib.rs b/node/service/src/lib.rs index 939170e7f5..e7fb7c5026 100644 --- a/node/service/src/lib.rs +++ b/node/service/src/lib.rs @@ -358,7 +358,7 @@ macro_rules! new_full { let (overseer, handler) = real_overseer(leaves, spawner)?; - service.spawn_essential_task("overseer", Box::pin(async move { + service.spawn_essential_task_handle().spawn("overseer", Box::pin(async move { use futures::{pin_mut, select, FutureExt}; let forward = overseer::forward_events(overseer_client, handler); @@ -404,7 +404,7 @@ macro_rules! new_full { }; let babe = babe::start_babe(babe_config)?; - service.spawn_essential_task("babe", babe); + service.spawn_essential_task_handle().spawn_blocking("babe", babe); } // if the node isn't actively participating in consensus then it doesn't @@ -464,7 +464,7 @@ macro_rules! new_full { shared_voter_state, }; - service.spawn_essential_task( + service.spawn_essential_task_handle().spawn_blocking( "grandpa-voter", grandpa::run_grandpa_voter(grandpa_config)? ); diff --git a/service/src/lib.rs b/service/src/lib.rs index 42eeadf0d3..0f64f41bf9 100644 --- a/service/src/lib.rs +++ b/service/src/lib.rs @@ -389,7 +389,7 @@ macro_rules! new_full { max_block_data_size, }.build(); - service.spawn_essential_task("validation-service", Box::pin(validation_service)); + service.spawn_essential_task_handle().spawn("validation-service", Box::pin(validation_service)); handles.validation_service_handle = Some(validation_service_handle.clone()); @@ -436,7 +436,7 @@ macro_rules! new_full { }; let babe = babe::start_babe(babe_config)?; - service.spawn_essential_task("babe", babe); + service.spawn_essential_task_handle().spawn_blocking("babe", babe); } if matches!(role, Role::Authority{..} | Role::Sentry{..}) { @@ -470,7 +470,7 @@ macro_rules! new_full { service.prometheus_registry(), ); - service.spawn_task("authority-discovery", authority_discovery); + service.spawn_task_handle().spawn("authority-discovery", authority_discovery); } } @@ -531,7 +531,7 @@ macro_rules! new_full { shared_voter_state, }; - service.spawn_essential_task( + service.spawn_essential_task_handle().spawn_blocking( "grandpa-voter", grandpa::run_grandpa_voter(grandpa_config)? ); -- GitLab From 013e645750b8297e251c0cf0456dcac557c777fb Mon Sep 17 00:00:00 2001 From: Robert Habermeier Date: Mon, 22 Jun 2020 15:01:38 -0400 Subject: [PATCH 005/192] Expand PoV Distribution section and improve candidate types (#1294) * rejig candidate types a bit * adjust doc * describe basic PoV distribution * replace some straggling html links * address grumbles from review and fix links --- .../availability/availability-distribution.md | 2 +- .../src/node/backing/candidate-backing.md | 2 +- .../src/node/backing/pov-distribution.md | 114 +++++++++++++++++- .../node/backing/statement-distribution.md | 4 +- .../src/runtime/inclusion.md | 14 ++- .../implementors-guide/src/runtime/router.md | 4 +- .../src/types/availability.md | 2 +- .../implementors-guide/src/types/backing.md | 10 +- .../implementors-guide/src/types/candidate.md | 85 ++++++++----- .../src/types/overseer-protocol.md | 24 +++- 10 files changed, 206 insertions(+), 55 deletions(-) diff --git a/roadmap/implementors-guide/src/node/availability/availability-distribution.md b/roadmap/implementors-guide/src/node/availability/availability-distribution.md index a916b3766b..008f3e91fb 100644 --- a/roadmap/implementors-guide/src/node/availability/availability-distribution.md +++ b/roadmap/implementors-guide/src/node/availability/availability-distribution.md @@ -26,7 +26,7 @@ Register on startup an event producer with `NetworkBridge::RegisterEventProduce For each relay-parent in our local view update, look at all backed candidates pending availability. Distribute via gossip all erasure chunks for all candidates that we have to peers. -We define an operation `live_candidates(relay_heads) -> Set` which returns a set of candidates a given set of relay chain heads that implies a set of candidates whose availability chunks should be currently gossiped. This is defined as all candidates pending availability in any of those relay-chain heads or any of their last `K` ancestors. We assume that state is not pruned within `K` blocks of the chain-head. +We define an operation `live_candidates(relay_heads) -> Set` which returns a set of [`CommittedCandidateReceipt`s](../../types/candidate.md#committed-candidate-receipt) a given set of relay chain heads that implies a set of candidates whose availability chunks should be currently gossiped. This is defined as all candidates pending availability in any of those relay-chain heads or any of their last `K` ancestors. We assume that state is not pruned within `K` blocks of the chain-head. We will send any erasure-chunks that correspond to candidates in `live_candidates(peer_most_recent_view_update)`. Likewise, we only accept and forward messages pertaining to a candidate in `live_candidates(current_heads)`. Each erasure chunk should be accompanied by a merkle proof that it is committed to by the erasure trie root in the candidate receipt, and this gossip system is responsible for checking such proof. diff --git a/roadmap/implementors-guide/src/node/backing/candidate-backing.md b/roadmap/implementors-guide/src/node/backing/candidate-backing.md index c57680e635..1490bb074c 100644 --- a/roadmap/implementors-guide/src/node/backing/candidate-backing.md +++ b/roadmap/implementors-guide/src/node/backing/candidate-backing.md @@ -12,7 +12,7 @@ Once a sufficient quorum has agreed that a candidate is valid, this subsystem no The [Candidate Selection subsystem](candidate-selection.md) is the primary source of non-overseer messages into this subsystem. That subsystem generates appropriate [`CandidateBackingMessage`s](../../types/overseer-protocol.md#candidate-backing-message), and passes them to this subsystem. -This subsystem validates the candidates and generates an appropriate [`Statement`](../../types/backing.md#statement-type). All `Statement`s are then passed on to the [Statement Distribution subsystem](statement-distribution.md) to be gossiped to peers. When this subsystem decides that a candidate is invalid, and it was recommended to us to second by our own Candidate Selection subsystem, a message is sent to the Candidate Selection subsystem with the candidate's hash so that the collator which recommended it can be penalized. +This subsystem validates the candidates and generates an appropriate [`SignedStatement`](../../types/backing.md#signed-statement-type). All `SignedStatement`s are then passed on to the [Statement Distribution subsystem](statement-distribution.md) to be gossiped to peers. All [Proofs of Validity](../../types/availability.md#proof-of-validity) should be distributed via the [PoV Distribution](pov-distribution.md) subsystem. When this subsystem decides that a candidate is invalid, and it was recommended to us to second by our own Candidate Selection subsystem, a message is sent to the Candidate Selection subsystem with the candidate's hash so that the collator which recommended it can be penalized. ## Functionality diff --git a/roadmap/implementors-guide/src/node/backing/pov-distribution.md b/roadmap/implementors-guide/src/node/backing/pov-distribution.md index d7290cbfbf..1cede76674 100644 --- a/roadmap/implementors-guide/src/node/backing/pov-distribution.md +++ b/roadmap/implementors-guide/src/node/backing/pov-distribution.md @@ -4,10 +4,118 @@ This subsystem is responsible for distributing PoV blocks. For now, unified with ## Protocol -Handle requests for PoV block by candidate hash and relay-parent. +`ProtocolId`: `b"povd"` + +Input: [`PoVDistributionMessage`](../../types/overseer-protocol.md#pov-distribution-message) + + +Output: + +- NetworkBridge::RegisterEventProducer(`ProtocolId`) +- NetworkBridge::SendMessage(`[PeerId]`, `ProtocolId`, `Bytes`) +- NetworkBridge::ReportPeer(PeerId, cost_or_benefit) + ## Functionality -Implemented as a gossip system, where `PoV`s are not accepted unless we know a `Seconded` message. +This network protocol is responsible for distributing [`PoV`s](../../types/availability.md#proof-of-validity) by gossip. Since PoVs are heavy in practice, gossip is far from the most efficient way to distribute them. In the future, this should be replaced by a better network protocol that finds validators who have validated the block and connects to them directly. This protocol is descrbied + +This protocol is described in terms of "us" and our peers, with the understanding that this is the procedure that any honest node will run. It has the following goals: + - We never have to buffer an unbounded amount of data + - PoVs will flow transitively across a network of honest nodes, stemming from the validators that originally seconded candidates requiring those PoVs. + +As we are gossiping, we need to track which PoVs our peers are waiting for to avoid sending them data that they are not expecting. It is not reasonable to expect our peers to buffer unexpected PoVs, just as we will not buffer unexpected PoVs. So notifying our peers about what is being awaited is key. However it is important that the notifications system is also bounded. + +For this, in order to avoid reaching into the internals of the [Statement Distribution](statement-distribution.md) Subsystem, we can rely on an expected propery of candidate backing: that each validator can only second one candidate at each chain head. So we can set a cap on the number of PoVs each peer is allowed to notify us that they are waiting for at a given relay-parent. This cap will be the number of validators at that relay-parent. And the view update mechanism of the [Network Bridge](../utility/network-bridge.md) ensures that peers are only allowed to consider a certain set of relay-parents as live. So this bounding mechanism caps the amount of data we need to store per peer at any time at `sum({ n_validators_at_head(head) | head in view_heads })`. Additionally, peers should only be allowed to notify us of PoV hashes they are waiting for in the context of relay-parents in our own local view, which means that `n_validators_at_head` is implied to be `0` for relay-parents not in our own local view. + +View updates from peers and our own view updates are received from the network bridge. These will lag somewhat behind the `StartWork` and `StopWork` messages received from the overseer, which will influence the actual data we store. The `OurViewUpdate`s from the [`NetworkBridgeEvent`](../../types/overseer-protocol.md#network-bridge-update) must be considered canonical in terms of our peers' perception of us. + +Lastly, the system needs to be bootstrapped with our own perception of which PoVs we are cognizant of but awaiting data for. This is done by receipt of the [`PoVDistributionMessage`](../../types/overseer-protocol.md#pov-distribution-message)::ValidatorStatement variant. We can ignore anything except for `Seconded` statements. + +## Formal Description + +This protocol can be implemented as a state machine with the following state: + +```rust +struct State { + relay_parent_state: Map, + peer_state: Map, + our_view: View, +} + +struct BlockBasedState { + known: Map, // should be a shared PoV in practice. these things are heavy. + awaited: Set, // awaited PoVs by blake2-256 hash. + fetching: Map]>, + n_validators: usize, +} + +struct PeerState { + awaited: Map>, +} +``` + +We also assume the following network messages, which are sent and received by the [Network Bridge](../utility/network-bridge.md) + +```rust +enum NetworkMessage { + /// Notification that we are awaiting the given PoVs (by hash) against a + /// specific relay-parent hash. + Awaiting(Hash, Vec), + /// Notification of an awaited PoV, in a given relay-parent context. + /// (relay_parent, pov_hash, pov) + SendPoV(Hash, Hash, PoV), +} +``` + +Here is the logic of the state machine: + +*Overseer Signals* +- On `StartWork(relay_parent)`: + - Get the number of validators at that relay parent by querying the [Runtime API](../utility/runtime-api.md) for the validators and then counting them. + - Create a blank entry in `relay_parent_state` under `relay_parent` with correct `n_validators` set. +- On `StopWork(relay_parent)`: + - Remove the entry for `relay_parent` from `relay_parent_state`. +- On `Concluded`: conclude. + +*PoV Distribution Messages* +- On `ValidatorStatement(relay_parent, statement)` + - If this is not `Statement::Seconded`, ignore. + - If there is an entry under `relay_parent` in `relay_parent_state`, add the `pov_hash` of the seconded Candidate's [`CandidateDescriptor`](../../types/candidate.md#candidate-descriptor) to the `awaited` set of the entry. + - If the `pov_hash` was not previously awaited and there are `n_validators` or fewer entries in the `awaited` set, send `NetworkMessage::Awaiting(relay_parent, vec![pov_hash])` to all peers. +- On `FetchPoV(relay_parent, descriptor, response_channel)` + - If there is no entry in `relay_parent_state` under `relay_parent`, ignore. + - If there is a PoV under `descriptor.pov_hash` in the `known` map, send that PoV on the channel and return. + - Otherwise, place the `response_channel` in the `fetching` map under `descriptor.pov_hash`. +- On `DistributePoV(relay_parent, descriptor, PoV)` + - If there is no entry in `relay_parent_state` under `relay_parent`, ignore. + - Complete and remove any channels under `descriptor.pov_hash` in the `fetching` map. + - Send `NetworkMessage::SendPoV(relay_parent, descriptor.pov_hash, PoV)` to all peers who have the `descriptor.pov_hash` in the set under `relay_parent` in the `peer.awaited` map and remove the entry from `peer.awaited`. + - Note the PoV under `descriptor.pov_hash` in `known`. + +*Network Bridge Updates* +- On `PeerConnected(peer_id, observed_role)` + - Make a fresh entry in the `peer_state` map for the `peer_id`. +- On `PeerDisconnected(peer_id) + - Remove the entry for `peer_id` from the `peer_state` map. +- On `PeerMessage(peer_id, bytes)` + - If the bytes do not decode to a `NetworkMessage` or the `peer_id` has no entry in the `peer_state` map, report and ignore. + - If this is `NetworkMessage::Awaiting(relay_parent, pov_hashes)`: + - If there is no entry under `peer_state.awaited` for the `relay_parent`, report and ignore. + - If `relay_parent` is not contained within `our_view`, report and ignore. + - Otherwise, if the `awaited` map combined with the `pov_hashes` would have more than `relay_parent_state[relay_parent].n_validators` entries, report and ignore. Note that we are leaning on the property of the network bridge that it sets our view based on `StartWork` messages. + - For each new `pov_hash` in `pov_hashes`, if there is a `pov` under `pov_hash` in the `known` map, send the peer a `NetworkMessage::SendPoV(relay_parent, pov_hash, pov)`. + - Otherwise, add the `pov_hash` to the `awaited` map + - If this is `NetworkMessage::SendPoV(relay_parent, pov_hash, pov)`: + - If there is no entry under `relay_parent` in `relay_parent_state` or no entry under `pov_hash` in our `awaited` map for that `relay_parent`, report and ignore. + - If the blake2-256 hash of the pov doesn't equal `pov_hash`, report and ignore. + - Complete and remove any listeners in the `fetching` map under `pov_hash`. + - Add to `known` map. + - Send `NetworkMessage::SendPoV(relay_parent, descriptor.pov_hash, PoV)` to all peers who have the `descriptor.pov_hash` in the set under `relay_parent` in the `peer.awaited` map and remove the entry from `peer.awaited`. +- On `PeerViewChange(peer_id, view)` + - If Peer is unknown, ignore. + - Ensure there is an entry under `relay_parent` for each `relay_parent` in `view` within the `peer.awaited` map, creating blank `awaited` lists as necessary. + - Remove all entries under `peer.awaited` that are not within `view`. +- On `OurViewChange(view)` + - Update `our_view` to `view` -> TODO: this requires a lot of cross-contamination with statement distribution even if we don't implement this as a gossip system. In a point-to-point implementation, we still have to know _who to ask_, which means tracking who's submitted `Seconded`, `Valid`, or `Invalid` statements - by validator and by peer. One approach is to have the Statement gossip system to just send us this information and then we can separate the systems from the beginning instead of combining them diff --git a/roadmap/implementors-guide/src/node/backing/statement-distribution.md b/roadmap/implementors-guide/src/node/backing/statement-distribution.md index b77ee7464f..59e5244d0d 100644 --- a/roadmap/implementors-guide/src/node/backing/statement-distribution.md +++ b/roadmap/implementors-guide/src/node/backing/statement-distribution.md @@ -22,7 +22,7 @@ Implemented as a gossip protocol. Register a network event producer on startup. Statement Distribution is the only backing subsystem which has any notion of peer nodes, who are any full nodes on the network. Validators will also act as peer nodes. -It is responsible for signing statements that we have generated and forwarding them, and for detecting a variety of Validator misbehaviors for reporting to [Misbehavior Arbitration](../utility/misbehavior-arbitration.md). During the Backing stage of the inclusion pipeline, it's the main point of contact with peer nodes, who distribute statements by validators. On receiving a signed statement from a peer, assuming the peer receipt state machine is in an appropriate state, it sends the Candidate Receipt to the [Candidate Backing subsystem](candidate-backing.md) to handle the validator's statement. +It is responsible for distributing signed statements that we have generated and forwarding them, and for detecting a variety of Validator misbehaviors for reporting to [Misbehavior Arbitration](../utility/misbehavior-arbitration.md). During the Backing stage of the inclusion pipeline, it's the main point of contact with peer nodes. On receiving a signed statement from a peer, assuming the peer receipt state machine is in an appropriate state, it sends the Candidate Receipt to the [Candidate Backing subsystem](candidate-backing.md) to handle the validator's statement. Track equivocating validators and stop accepting information from them. Forward double-vote proofs to the double-vote reporting system. Establish a data-dependency order: @@ -37,7 +37,7 @@ The Statement Distribution subsystem sends statements to peer nodes and detects There is a very simple state machine which governs which messages we are willing to receive from peers. Not depicted in the state machine: on initial receipt of any [`SignedFullStatement`](../../types/backing.md#signed-statement-type), validate that the provided signature does in fact sign the included data. Note that each individual parablock candidate gets its own instance of this state machine; it is perfectly legal to receive a `Valid(X)` before a `Seconded(Y)`, as long as a `Seconded(X)` has been received. -A: Initial State. Receive `SignedFullStatement(Statement::Second)`: extract `Statement`, forward to Candidate Backing, proceed to B. Receive any other `SignedFullStatement` variant: drop it. +A: Initial State. Receive `SignedFullStatement(Statement::Second)`: extract `Statement`, forward to Candidate Backing and PoV Distribution, proceed to B. Receive any other `SignedFullStatement` variant: drop it. B: Receive any `SignedFullStatement`: check signature, forward to Candidate Backing. Receive `OverseerMessage::StopWork`: proceed to C. diff --git a/roadmap/implementors-guide/src/runtime/inclusion.md b/roadmap/implementors-guide/src/runtime/inclusion.md index e2d2747696..d201e3ed51 100644 --- a/roadmap/implementors-guide/src/runtime/inclusion.md +++ b/roadmap/implementors-guide/src/runtime/inclusion.md @@ -14,7 +14,7 @@ struct AvailabilityBitfield { struct CandidatePendingAvailability { core: CoreIndex, // availability core - receipt: AbridgedCandidateReceipt, + receipt: CandidateReceipt, availability_votes: Bitfield, // one bit per validator. relay_parent_number: BlockNumber, // number of the relay-parent. backed_in_number: BlockNumber, @@ -28,6 +28,8 @@ Storage Layout: bitfields: map ValidatorIndex => AvailabilityBitfield; /// Candidates pending availability. PendingAvailability: map ParaId => CandidatePendingAvailability; +/// The commitments of candidates pending availability, by ParaId. +PendingAvailabilityCommitments: map ParaId => CandidateCommitments; /// The current validators, by their parachain session keys. Validators: Vec; @@ -36,8 +38,6 @@ Validators: Vec; CurrentSessionIndex: SessionIndex; ``` -> TODO: `CandidateReceipt` and `AbridgedCandidateReceipt` can contain code upgrades which make them very large. the code entries should be split into a different storage map with infrequent access patterns - ## Session Change 1. Clear out all candidates pending availability. @@ -64,15 +64,17 @@ All failed checks should lead to an unrecoverable error making the block invalid 1. check that there is no candidate pending availability for any scheduled `ParaId`. 1. If the core assignment includes a specific collator, ensure the backed candidate is issued by that collator. 1. Ensure that any code upgrade scheduled by the candidate does not happen within `config.validation_upgrade_frequency` of `Paras::last_code_upgrade(para_id, true)`, if any, comparing against the value of `Paras::FutureCodeUpgrades` for the given para ID. - 1. Check the collator's signature on the pov block. + 1. Check the collator's signature on the candidate data. + 1. Transform each [`CommittedCandidateReceipt`](../types/candidate.md#committed-candidate-receipt) into the corresponding [`CandidateReceipt`](../types/candidate.md#candidate-receipt), setting the commitments aside. 1. check the backing of the candidate using the signatures and the bitfields, comparing against the validators assigned to the groups, fetched with the `group_validators` lookup. 1. check that the upward messages, when combined with the existing queue size, are not exceeding `config.max_upward_queue_count` and `config.watermark_upward_queue_size` parameters. 1. create an entry in the `PendingAvailability` map for each backed candidate with a blank `availability_votes` bitfield. + 1. create a corresponding entry in the `PendingAvailabilityCommitments` with the commitments. 1. Return a `Vec` of all scheduled cores of the list of passed assignments that a candidate was successfully backed for, sorted ascending by CoreIndex. -* `enact_candidate(relay_parent_number: BlockNumber, AbridgedCandidateReceipt)`: +* `enact_candidate(relay_parent_number: BlockNumber, CommittedCandidateReceipt)`: 1. If the receipt contains a code upgrade, Call `Paras::schedule_code_upgrade(para_id, code, relay_parent_number + config.validationl_upgrade_delay)`. > TODO: Note that this is safe as long as we never enact candidates where the relay parent is across a session boundary. In that case, which we should be careful to avoid with contextual execution, the configuration might have changed and the para may de-sync from the host's understanding of it. - 1. call `Router::queue_upward_messages` for each backed candidate. + 1. call `Router::queue_upward_messages` for each backed candidate, using the [`UpwardMessage`s](../types/messages.md#upward-message) from the [`CandidateCommitments`](../types/candidate.md#candidate-commitments). 1. Call `Paras::note_new_head` using the `HeadData` from the receipt and `relay_parent_number`. * `collect_pending`: diff --git a/roadmap/implementors-guide/src/runtime/router.md b/roadmap/implementors-guide/src/runtime/router.md index fff8e78920..4f7adeaa04 100644 --- a/roadmap/implementors-guide/src/runtime/router.md +++ b/roadmap/implementors-guide/src/runtime/router.md @@ -27,9 +27,9 @@ No initialization routine runs for this module. ## Routines -* `queue_upward_messages(AbridgedCandidateReceipt)`: +* `queue_upward_messages(ParaId, Vec)`: 1. Updates `NeedsDispatch`, and enqueues upward messages into `RelayDispatchQueue` and modifies the respective entry in `RelayDispatchQueueSize`. -## Finalization +## Finalization 1. Dispatch queued upward messages from `RelayDispatchQueues` in a FIFO order applying the `config.watermark_upward_queue_size` and `config.max_upward_queue_count` limits. diff --git a/roadmap/implementors-guide/src/types/availability.md b/roadmap/implementors-guide/src/types/availability.md index 4fd3128513..3362908d6b 100644 --- a/roadmap/implementors-guide/src/types/availability.md +++ b/roadmap/implementors-guide/src/types/availability.md @@ -5,7 +5,7 @@ candidates for the duration of a challenge period. This is done via an erasure-c ## Signed Availability Bitfield -A bitfield [signed](backing.html#signed-wrapper) by a particular validator about the availability of pending candidates. +A bitfield [signed](backing.md#signed-wrapper) by a particular validator about the availability of pending candidates. ```rust diff --git a/roadmap/implementors-guide/src/types/backing.md b/roadmap/implementors-guide/src/types/backing.md index a963d0ee96..22799f2573 100644 --- a/roadmap/implementors-guide/src/types/backing.md +++ b/roadmap/implementors-guide/src/types/backing.md @@ -44,7 +44,7 @@ impl, RealPayload: Encode> Signed`. Therefore, for the generic case where `RealPayload = Payload`, it changes nothing. However, we `impl EncodeAs for Statement`, which helps efficiency. @@ -61,7 +61,7 @@ enum Statement { /// second only 1 candidate; this places an upper bound on the total number of candidates whose validity /// needs to be checked. A validator who seconds more than 1 parachain candidate per relay head is subject /// to slashing. - Seconded(CandidateReceipt), + Seconded(CommittedCandidateReceipt), /// A statement about the validity of a candidate, based on candidate's hash. Valid(Hash), /// A statement about the invalidity of a candidate. @@ -91,7 +91,7 @@ enum CompactStatement { A statement which has been [cryptographically signed](#signed-wrapper) by a validator. ```rust -/// A signed statement, containing the abridged candidate receipt in the `Seconded` variant. +/// A signed statement, containing the committed candidate receipt in the `Seconded` variant. pub type SignedFullStatement = Signed; /// A signed statement, containing only the hash. @@ -102,11 +102,11 @@ Munging the signed `Statement` into a `CompactStatement` before signing allows t ## Backed Candidate -An [`AbridgedCandidateReceipt`](candidate.md#abridgedcandidatereceipt) along with all data necessary to prove its backing. This is submitted to the relay-chain to process and move along the candidate to the pending-availability stage. +An [`CommittedCandidateReceipt`](candidate.md#committed-candidate-receipt) along with all data necessary to prove its backing. This is submitted to the relay-chain to process and move along the candidate to the pending-availability stage. ```rust struct BackedCandidate { - candidate: AbridgedCandidateReceipt, + candidate: CommittedCandidateReceipt, validity_votes: Vec, // the indices of validators who signed the candidate within the group. There is no need to include // bit for any validators who are not in the group, so this is more compact. diff --git a/roadmap/implementors-guide/src/types/candidate.md b/roadmap/implementors-guide/src/types/candidate.md index ff09365c93..fdba6919e5 100644 --- a/roadmap/implementors-guide/src/types/candidate.md +++ b/roadmap/implementors-guide/src/types/candidate.md @@ -4,18 +4,34 @@ Para candidates are some of the most common types, both within the runtime and o In a way, this entire guide is about these candidates: how they are scheduled, constructed, backed, included, and challenged. -This section will describe the base candidate type, its components, and abridged counterpart. +This section will describe the base candidate type, its components, and variants that contain extra data. -## CandidateReceipt +## Candidate Receipt -This is the base receipt type. The `GlobalValidationSchedule` and the `LocalValidationData` are technically redundant with the `inner.relay_parent`, which uniquely describes the a block in the blockchain from whose state these values are derived. The [`AbridgedCandidateReceipt`](#abridgedcandidatereceipt) variant is often used instead for this reason. +Much info in a [`FullCandidateReceipt`](#full-candidate-receipt) is duplicated from the relay-chain state. When the corresponding relay-chain state is considered widely available, the Candidate Receipt should be favored over the `FullCandidateReceipt`. -However, the full CandidateReceipt type is useful as a means of avoiding the implicit dependency on availability of old blockchain state. In situations such as availability and approval, having the full description of the candidate within a self-contained struct is convenient. +Examples of situations where the state is readily available includes within the scope of work done by subsystems working on a given relay-parent, or within the logic of the runtime importing a backed candidate. ```rust -/// All data pertaining to the execution of a para candidate. +/// A candidate-receipt. struct CandidateReceipt { - inner: AbridgedCandidateReceipt, + /// The descriptor of the candidate. + descriptor: CandidateDescriptor, + /// The hash of the encoded commitments made as a result of candidate execution. + commitments_hash: Hash, +} +``` + +## Full Candidate Receipt + +This is the full receipt type. The `GlobalValidationSchedule` and the `LocalValidationData` are technically redundant with the `inner.relay_parent`, which uniquely describes the a block in the blockchain from whose state these values are derived. The [`CandidateReceipt`](#candidate-receipt) variant is often used instead for this reason. + +However, the Full Candidate Receipt type is useful as a means of avoiding the implicit dependency on availability of old blockchain state. In situations such as availability and approval, having the full description of the candidate within a self-contained struct is convenient. + +```rust +/// All data pertaining to the execution of a para candidate. +struct FullCandidateReceipt { + inner: CandidateReceipt, /// The global validation schedule. global_validation: GlobalValidationSchedule, /// The local validation data. @@ -23,38 +39,49 @@ struct CandidateReceipt { } ``` -## AbridgedCandidateReceipt +## Committed Candidate Receipt -Much info in a [`CandidateReceipt`](#candidatereceipt) is duplicated from the relay-chain state. When the corresponding relay-chain state is considered widely available, the Abridged Candidate Receipt should be favored. +This is a variant of the candidate receipt which includes the commitments of the candidate receipt alongside the descriptor. This should be favored over the [`Candidate Receipt`](#candidate-receipt) in situations where the candidate is not going to be executed but the actual data committed to is important. This is often the case in the backing phase. -Examples of situations where the state is readily available includes within the scope of work done by subsystems working on a given relay-parent, or within the logic of the runtime importing a backed candidate. +The hash of the committed candidate receipt will be the same as the corresponding [`Candidate Receipt`](#candidate-receipt), because it is computed by first hashing the encoding of the commitments to form a plain [`Candidate Receipt`](#candidate-receipt). + +```rust +/// A candidate-receipt with commitments directly included. +struct CommittedCandidateReceipt { + /// The descriptor of the candidate. + descriptor: CandidateDescriptor, + /// The commitments of the candidate receipt. + commitments: CandidateCommitments, +} +``` + +## Candidate Descriptor + +This struct is pure description of the candidate, in a lightweight format. ```rust -/// An abridged candidate-receipt. -struct AbridgedCandidateReceipt { +/// A unique descriptor of the candidate receipt. +struct CandidateDescriptor { /// The ID of the para this is a candidate for. para_id: Id, /// The hash of the relay-chain block this is executed in the context of. relay_parent: Hash, - /// The head-data produced as a result of execution. - head_data: HeadData, /// The collator's sr25519 public key. collator: CollatorId, /// Signature on blake2-256 of components of this receipt: - /// The parachain index, the relay parent, the head data, and the pov_hash. + /// The parachain index, the relay parent, and the pov_hash. signature: CollatorSignature, /// The blake2-256 hash of the pov-block. pov_hash: Hash, - /// Commitments made as a result of validation. - commitments: CandidateCommitments, } ``` + ## GlobalValidationSchedule The global validation schedule comprises of information describing the global environment for para execution, as derived from a particular relay-parent. These are parameters that will apply to all parablocks executed in the context of this relay-parent. -> TODO: message queue watermarks (first upward messages, then XCMP channels) +> TODO: message queue watermarks (first downward messages, then XCMP channels) ```rust /// Extra data that is needed along with the other fields in a `CandidateReceipt` @@ -88,13 +115,13 @@ Para validation happens optimistically before the block is authored, so it is no ```rust /// Extra data that is needed along with the other fields in a `CandidateReceipt` /// to fully validate the candidate. These fields are parachain-specific. -pub struct LocalValidationData { +struct LocalValidationData { /// The parent head-data. - pub parent_head: HeadData, + parent_head: HeadData, /// The balance of the parachain at the moment of validation. - pub balance: Balance, + balance: Balance, /// The blake2-256 hash of the validation code used to execute the candidate. - pub validation_code_hash: Hash, + validation_code_hash: Hash, /// Whether the parachain is allowed to upgrade its validation code. /// /// This is `Some` if so, and contains the number of the minimum relay-chain @@ -106,7 +133,7 @@ pub struct LocalValidationData { /// height. This may be equal to the current perceived relay-chain block height, in /// which case the code upgrade should be applied at the end of the signaling /// block. - pub code_upgrade_allowed: Option, + code_upgrade_allowed: Option, } ``` @@ -118,7 +145,7 @@ Head data is a type-safe abstraction around bytes (`Vec`) for the purposes o struct HeadData(Vec); ``` -## CandidateCommitments +## Candidate Commitments The execution and validation of parachain or parathread candidates produces a number of values which either must be committed to on the relay chain or committed to the state of the relay chain. @@ -126,15 +153,17 @@ The execution and validation of parachain or parathread candidates produces a nu /// Commitments made in a `CandidateReceipt`. Many of these are outputs of validation. #[derive(PartialEq, Eq, Clone, Encode, Decode)] #[cfg_attr(feature = "std", derive(Debug, Default))] -pub struct CandidateCommitments { +struct CandidateCommitments { /// Fees paid from the chain to the relay chain validators. - pub fees: Balance, + fees: Balance, /// Messages destined to be interpreted by the Relay chain itself. - pub upward_messages: Vec, + upward_messages: Vec, /// The root of a block's erasure encoding Merkle tree. - pub erasure_root: Hash, + erasure_root: Hash, /// New validation code. - pub new_validation_code: Option, + new_validation_code: Option, + /// The head-data produced as a result of execution. + head_data: HeadData, } ``` diff --git a/roadmap/implementors-guide/src/types/overseer-protocol.md b/roadmap/implementors-guide/src/types/overseer-protocol.md index 6a1bdfa96e..7b211bd14f 100644 --- a/roadmap/implementors-guide/src/types/overseer-protocol.md +++ b/roadmap/implementors-guide/src/types/overseer-protocol.md @@ -90,8 +90,8 @@ enum CandidateBackingMessage { /// in a child of the given relay-parent, referenced by its hash. RegisterBackingWatcher(Hash, TODO), /// Note that the Candidate Backing subsystem should second the given candidate in the context of the - /// given relay-parent (ref. by hash). This candidate must be validated. - Second(Hash, CandidateReceipt), + /// given relay-parent (ref. by hash). This candidate must be validated using the provided PoV. + Second(Hash, CandidateReceipt, PoV), /// Note a peer validator's statement about a particular candidate. Disagreements about validity must be escalated /// to a broader check by Misbehavior Arbitration. Agreements are simply tallied until a quorum is reached. Statement(Statement), @@ -168,11 +168,23 @@ enum MisbehaviorReport { If this subsystem chooses to second a parachain block, it dispatches a `CandidateBackingSubsystemMessage`. -## PoV Distribution +## PoV Distribution Message -Messages received by the PoV Distribution subsystem are unspecified and highly tied to gossip. - -> TODO +```rust +enum PoVDistributionMessage { + /// Note a statement by a validator on a relay-parent. `Seconded` statements must always + /// have been passed in before `Valid` or `Invalid` statements. + ValidatorStatement(Hash, SignedFullStatement), + /// Fetch a PoV from the network. + /// (relay_parent, PoV-hash, Response channel). + FetchPoV(Hash, CandidateDescriptor, ResponseChannel), + /// Distribute a PoV for the given relay-parent and CandidateDescriptor. + /// The PoV should correctly hash to the PoV hash mentioned in the CandidateDescriptor + DistributePoV(Hash, CandidateDescriptor, PoV), + /// An update from the network bridge. + NetworkBridgeUpdate(NetworkBridgeEvent), +} +``` ## Provisioner Message -- GitLab From 70fd43927411954a1e4c57352aeb1754d355245f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20Thei=C3=9Fen?= Date: Tue, 23 Jun 2020 12:50:29 +0200 Subject: [PATCH 006/192] Companion for Substrate #6269 (nested storage tx) (#1210) * Companion for Substrate #6269 (nested storage tx) * Adjust to PR changes * Bump to newest substrate * Bump spec --- Cargo.lock | 274 +++++++++++++++-------------- parachain/src/wasm_executor/mod.rs | 12 ++ runtime/kusama/src/lib.rs | 2 +- runtime/polkadot/src/lib.rs | 2 +- runtime/westend/src/lib.rs | 2 +- 5 files changed, 153 insertions(+), 139 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 9c2511c039..fb420eebd6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1172,7 +1172,7 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "fork-tree" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" +source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" dependencies = [ "parity-scale-codec", ] @@ -1180,7 +1180,7 @@ dependencies = [ [[package]] name = "frame-benchmarking" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" +source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" dependencies = [ "frame-support", "frame-system", @@ -1197,7 +1197,7 @@ dependencies = [ [[package]] name = "frame-benchmarking-cli" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" +source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" dependencies = [ "frame-benchmarking", "parity-scale-codec", @@ -1215,7 +1215,7 @@ dependencies = [ [[package]] name = "frame-executive" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" +source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" dependencies = [ "frame-support", "frame-system", @@ -1230,7 +1230,7 @@ dependencies = [ [[package]] name = "frame-metadata" version = "11.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" +source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" dependencies = [ "parity-scale-codec", "serde", @@ -1241,7 +1241,7 @@ dependencies = [ [[package]] name = "frame-support" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" +source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" dependencies = [ "bitmask", "frame-metadata", @@ -1266,7 +1266,7 @@ dependencies = [ [[package]] name = "frame-support-procedural" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" +source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" dependencies = [ "frame-support-procedural-tools", "proc-macro2 1.0.18", @@ -1277,7 +1277,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" +source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" dependencies = [ "frame-support-procedural-tools-derive", "proc-macro-crate", @@ -1289,7 +1289,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools-derive" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" +source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" dependencies = [ "proc-macro2 1.0.18", "quote 1.0.7", @@ -1299,7 +1299,7 @@ dependencies = [ [[package]] name = "frame-system" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" +source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" dependencies = [ "frame-support", "impl-trait-for-tuples", @@ -1315,7 +1315,7 @@ dependencies = [ [[package]] name = "frame-system-benchmarking" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" +source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" dependencies = [ "frame-benchmarking", "frame-support", @@ -1329,7 +1329,7 @@ dependencies = [ [[package]] name = "frame-system-rpc-runtime-api" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" +source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" dependencies = [ "parity-scale-codec", "sp-api", @@ -3266,7 +3266,7 @@ dependencies = [ [[package]] name = "pallet-authority-discovery" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" +source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" dependencies = [ "frame-support", "frame-system", @@ -3282,7 +3282,7 @@ dependencies = [ [[package]] name = "pallet-authorship" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" +source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" dependencies = [ "frame-support", "frame-system", @@ -3297,7 +3297,7 @@ dependencies = [ [[package]] name = "pallet-babe" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" +source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" dependencies = [ "frame-support", "frame-system", @@ -3319,7 +3319,7 @@ dependencies = [ [[package]] name = "pallet-balances" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" +source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" dependencies = [ "frame-benchmarking", "frame-support", @@ -3333,7 +3333,7 @@ dependencies = [ [[package]] name = "pallet-collective" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" +source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" dependencies = [ "frame-benchmarking", "frame-support", @@ -3349,7 +3349,7 @@ dependencies = [ [[package]] name = "pallet-democracy" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" +source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" dependencies = [ "frame-benchmarking", "frame-support", @@ -3364,7 +3364,7 @@ dependencies = [ [[package]] name = "pallet-elections-phragmen" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" +source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" dependencies = [ "frame-benchmarking", "frame-support", @@ -3379,7 +3379,7 @@ dependencies = [ [[package]] name = "pallet-finality-tracker" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" +source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" dependencies = [ "frame-support", "frame-system", @@ -3395,7 +3395,7 @@ dependencies = [ [[package]] name = "pallet-grandpa" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" +source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" dependencies = [ "frame-support", "frame-system", @@ -3415,7 +3415,7 @@ dependencies = [ [[package]] name = "pallet-identity" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" +source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" dependencies = [ "enumflags2", "frame-benchmarking", @@ -3431,7 +3431,7 @@ dependencies = [ [[package]] name = "pallet-im-online" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" +source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" dependencies = [ "frame-benchmarking", "frame-support", @@ -3451,7 +3451,7 @@ dependencies = [ [[package]] name = "pallet-indices" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" +source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" dependencies = [ "frame-support", "frame-system", @@ -3467,7 +3467,7 @@ dependencies = [ [[package]] name = "pallet-membership" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" +source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" dependencies = [ "frame-support", "frame-system", @@ -3481,7 +3481,7 @@ dependencies = [ [[package]] name = "pallet-multisig" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" +source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" dependencies = [ "frame-support", "frame-system", @@ -3496,7 +3496,7 @@ dependencies = [ [[package]] name = "pallet-nicks" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" +source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" dependencies = [ "frame-support", "frame-system", @@ -3510,7 +3510,7 @@ dependencies = [ [[package]] name = "pallet-offences" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" +source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" dependencies = [ "frame-support", "frame-system", @@ -3525,7 +3525,7 @@ dependencies = [ [[package]] name = "pallet-offences-benchmarking" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" +source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" dependencies = [ "frame-benchmarking", "frame-support", @@ -3546,7 +3546,7 @@ dependencies = [ [[package]] name = "pallet-proxy" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" +source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" dependencies = [ "frame-support", "frame-system", @@ -3561,7 +3561,7 @@ dependencies = [ [[package]] name = "pallet-randomness-collective-flip" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" +source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" dependencies = [ "frame-support", "frame-system", @@ -3574,7 +3574,7 @@ dependencies = [ [[package]] name = "pallet-recovery" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" +source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" dependencies = [ "enumflags2", "frame-support", @@ -3589,7 +3589,7 @@ dependencies = [ [[package]] name = "pallet-scheduler" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" +source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" dependencies = [ "frame-benchmarking", "frame-support", @@ -3604,7 +3604,7 @@ dependencies = [ [[package]] name = "pallet-session" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" +source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" dependencies = [ "frame-support", "frame-system", @@ -3624,7 +3624,7 @@ dependencies = [ [[package]] name = "pallet-session-benchmarking" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" +source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" dependencies = [ "frame-benchmarking", "frame-support", @@ -3638,7 +3638,7 @@ dependencies = [ [[package]] name = "pallet-society" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" +source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" dependencies = [ "frame-support", "frame-system", @@ -3652,7 +3652,7 @@ dependencies = [ [[package]] name = "pallet-staking" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" +source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" dependencies = [ "frame-benchmarking", "frame-support", @@ -3674,7 +3674,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-curve" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" +source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -3685,7 +3685,7 @@ dependencies = [ [[package]] name = "pallet-sudo" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" +source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" dependencies = [ "frame-support", "frame-system", @@ -3699,7 +3699,7 @@ dependencies = [ [[package]] name = "pallet-timestamp" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" +source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" dependencies = [ "frame-benchmarking", "frame-support", @@ -3717,7 +3717,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" +source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" dependencies = [ "frame-support", "frame-system", @@ -3732,7 +3732,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" +source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" dependencies = [ "jsonrpc-core", "jsonrpc-core-client", @@ -3750,7 +3750,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc-runtime-api" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" +source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" dependencies = [ "frame-support", "parity-scale-codec", @@ -3763,7 +3763,7 @@ dependencies = [ [[package]] name = "pallet-treasury" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" +source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" dependencies = [ "frame-benchmarking", "frame-support", @@ -3778,7 +3778,7 @@ dependencies = [ [[package]] name = "pallet-utility" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" +source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" dependencies = [ "frame-benchmarking", "frame-support", @@ -3794,7 +3794,7 @@ dependencies = [ [[package]] name = "pallet-vesting" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" +source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" dependencies = [ "enumflags2", "frame-benchmarking", @@ -5531,7 +5531,7 @@ dependencies = [ [[package]] name = "sc-authority-discovery" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" +source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" dependencies = [ "bytes 0.5.4", "derive_more 0.99.8", @@ -5558,7 +5558,7 @@ dependencies = [ [[package]] name = "sc-basic-authorship" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" +source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -5582,7 +5582,7 @@ dependencies = [ [[package]] name = "sc-block-builder" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" +source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" dependencies = [ "parity-scale-codec", "sc-client-api", @@ -5598,7 +5598,7 @@ dependencies = [ [[package]] name = "sc-chain-spec" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" +source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" dependencies = [ "impl-trait-for-tuples", "sc-chain-spec-derive", @@ -5614,7 +5614,7 @@ dependencies = [ [[package]] name = "sc-chain-spec-derive" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" +source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -5625,7 +5625,7 @@ dependencies = [ [[package]] name = "sc-cli" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" +source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" dependencies = [ "ansi_term 0.12.1", "atty", @@ -5665,7 +5665,7 @@ dependencies = [ [[package]] name = "sc-client-api" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" +source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" dependencies = [ "derive_more 0.99.8", "fnv", @@ -5701,7 +5701,7 @@ dependencies = [ [[package]] name = "sc-client-db" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" +source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" dependencies = [ "blake2-rfc", "hash-db", @@ -5730,7 +5730,7 @@ dependencies = [ [[package]] name = "sc-consensus" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" +source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" dependencies = [ "sc-client-api", "sp-blockchain", @@ -5741,7 +5741,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" +source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" dependencies = [ "derive_more 0.99.8", "fork-tree", @@ -5783,7 +5783,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe-rpc" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" +source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" dependencies = [ "derive_more 0.99.8", "futures 0.3.5", @@ -5807,7 +5807,7 @@ dependencies = [ [[package]] name = "sc-consensus-epochs" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" +source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" dependencies = [ "fork-tree", "parity-scale-codec", @@ -5820,7 +5820,7 @@ dependencies = [ [[package]] name = "sc-consensus-slots" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" +source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -5842,7 +5842,7 @@ dependencies = [ [[package]] name = "sc-consensus-uncles" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" +source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" dependencies = [ "log 0.4.8", "sc-client-api", @@ -5856,7 +5856,7 @@ dependencies = [ [[package]] name = "sc-executor" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" +source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" dependencies = [ "derive_more 0.99.8", "lazy_static", @@ -5884,7 +5884,7 @@ dependencies = [ [[package]] name = "sc-executor-common" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" +source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" dependencies = [ "derive_more 0.99.8", "log 0.4.8", @@ -5901,7 +5901,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmi" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" +source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" dependencies = [ "log 0.4.8", "parity-scale-codec", @@ -5916,7 +5916,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmtime" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" +source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" dependencies = [ "cranelift-codegen", "cranelift-wasm", @@ -5937,7 +5937,7 @@ dependencies = [ [[package]] name = "sc-finality-grandpa" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" +source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" dependencies = [ "assert_matches", "derive_more 0.99.8", @@ -5975,7 +5975,7 @@ dependencies = [ [[package]] name = "sc-finality-grandpa-rpc" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" +source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" dependencies = [ "derive_more 0.99.8", "finality-grandpa", @@ -5992,7 +5992,7 @@ dependencies = [ [[package]] name = "sc-informant" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" +source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" dependencies = [ "ansi_term 0.12.1", "futures 0.3.5", @@ -6011,7 +6011,7 @@ dependencies = [ [[package]] name = "sc-keystore" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" +source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" dependencies = [ "derive_more 0.99.8", "hex", @@ -6027,7 +6027,7 @@ dependencies = [ [[package]] name = "sc-light" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" +source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" dependencies = [ "hash-db", "lazy_static", @@ -6046,7 +6046,7 @@ dependencies = [ [[package]] name = "sc-network" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" +source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" dependencies = [ "bitflags", "bs58", @@ -6098,7 +6098,7 @@ dependencies = [ [[package]] name = "sc-network-gossip" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" +source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6113,7 +6113,7 @@ dependencies = [ [[package]] name = "sc-network-test" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" +source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" dependencies = [ "env_logger", "futures 0.3.5", @@ -6140,7 +6140,7 @@ dependencies = [ [[package]] name = "sc-offchain" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" +source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" dependencies = [ "bytes 0.5.4", "fnv", @@ -6167,7 +6167,7 @@ dependencies = [ [[package]] name = "sc-peerset" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" +source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" dependencies = [ "futures 0.3.5", "libp2p", @@ -6180,7 +6180,7 @@ dependencies = [ [[package]] name = "sc-proposer-metrics" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" +source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" dependencies = [ "log 0.4.8", "substrate-prometheus-endpoint", @@ -6189,7 +6189,7 @@ dependencies = [ [[package]] name = "sc-rpc" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" +source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" dependencies = [ "futures 0.3.5", "hash-db", @@ -6221,7 +6221,7 @@ dependencies = [ [[package]] name = "sc-rpc-api" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" +source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" dependencies = [ "derive_more 0.99.8", "futures 0.3.5", @@ -6245,7 +6245,7 @@ dependencies = [ [[package]] name = "sc-rpc-server" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" +source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" dependencies = [ "jsonrpc-core", "jsonrpc-http-server", @@ -6261,7 +6261,7 @@ dependencies = [ [[package]] name = "sc-service" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" +source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" dependencies = [ "derive_more 0.99.8", "directories", @@ -6324,7 +6324,7 @@ dependencies = [ [[package]] name = "sc-state-db" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" +source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" dependencies = [ "log 0.4.8", "parity-scale-codec", @@ -6338,7 +6338,7 @@ dependencies = [ [[package]] name = "sc-telemetry" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" +source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" dependencies = [ "bytes 0.5.4", "futures 0.3.5", @@ -6360,7 +6360,7 @@ dependencies = [ [[package]] name = "sc-tracing" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" +source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" dependencies = [ "erased-serde", "log 0.4.8", @@ -6377,7 +6377,7 @@ dependencies = [ [[package]] name = "sc-transaction-graph" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" +source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" dependencies = [ "derive_more 0.99.8", "futures 0.3.5", @@ -6397,7 +6397,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" +source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" dependencies = [ "derive_more 0.99.8", "futures 0.3.5", @@ -6784,7 +6784,7 @@ dependencies = [ [[package]] name = "sp-allocator" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" +source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" dependencies = [ "derive_more 0.99.8", "log 0.4.8", @@ -6796,7 +6796,7 @@ dependencies = [ [[package]] name = "sp-api" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" +source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" dependencies = [ "hash-db", "parity-scale-codec", @@ -6811,7 +6811,7 @@ dependencies = [ [[package]] name = "sp-api-proc-macro" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" +source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" dependencies = [ "blake2-rfc", "proc-macro-crate", @@ -6823,7 +6823,7 @@ dependencies = [ [[package]] name = "sp-application-crypto" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" +source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" dependencies = [ "parity-scale-codec", "serde", @@ -6835,7 +6835,7 @@ dependencies = [ [[package]] name = "sp-arithmetic" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" +source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" dependencies = [ "integer-sqrt", "num-traits 0.2.12", @@ -6848,7 +6848,7 @@ dependencies = [ [[package]] name = "sp-authority-discovery" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" +source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" dependencies = [ "parity-scale-codec", "sp-api", @@ -6860,7 +6860,7 @@ dependencies = [ [[package]] name = "sp-authorship" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" +source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" dependencies = [ "parity-scale-codec", "sp-inherents", @@ -6871,7 +6871,7 @@ dependencies = [ [[package]] name = "sp-block-builder" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" +source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" dependencies = [ "parity-scale-codec", "sp-api", @@ -6883,7 +6883,7 @@ dependencies = [ [[package]] name = "sp-blockchain" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" +source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" dependencies = [ "derive_more 0.99.8", "log 0.4.8", @@ -6899,7 +6899,7 @@ dependencies = [ [[package]] name = "sp-chain-spec" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" +source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" dependencies = [ "serde", "serde_json", @@ -6908,7 +6908,7 @@ dependencies = [ [[package]] name = "sp-consensus" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" +source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" dependencies = [ "derive_more 0.99.8", "futures 0.3.5", @@ -6931,7 +6931,7 @@ dependencies = [ [[package]] name = "sp-consensus-aura" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" +source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" dependencies = [ "parity-scale-codec", "sp-api", @@ -6945,7 +6945,7 @@ dependencies = [ [[package]] name = "sp-consensus-babe" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" +source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" dependencies = [ "merlin", "parity-scale-codec", @@ -6963,7 +6963,7 @@ dependencies = [ [[package]] name = "sp-consensus-vrf" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" +source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" dependencies = [ "parity-scale-codec", "schnorrkel", @@ -6975,7 +6975,7 @@ dependencies = [ [[package]] name = "sp-core" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" +source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" dependencies = [ "base58", "blake2-rfc", @@ -7017,7 +7017,7 @@ dependencies = [ [[package]] name = "sp-database" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" +source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" dependencies = [ "kvdb", "parking_lot 0.10.2", @@ -7026,7 +7026,7 @@ dependencies = [ [[package]] name = "sp-debug-derive" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" +source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" dependencies = [ "proc-macro2 1.0.18", "quote 1.0.7", @@ -7036,7 +7036,7 @@ dependencies = [ [[package]] name = "sp-externalities" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" +source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" dependencies = [ "environmental", "parity-scale-codec", @@ -7047,7 +7047,7 @@ dependencies = [ [[package]] name = "sp-finality-grandpa" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" +source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" dependencies = [ "finality-grandpa", "log 0.4.8", @@ -7063,7 +7063,7 @@ dependencies = [ [[package]] name = "sp-finality-tracker" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" +source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" dependencies = [ "parity-scale-codec", "sp-inherents", @@ -7073,7 +7073,7 @@ dependencies = [ [[package]] name = "sp-inherents" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" +source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" dependencies = [ "derive_more 0.99.8", "parity-scale-codec", @@ -7085,7 +7085,7 @@ dependencies = [ [[package]] name = "sp-io" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" +source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" dependencies = [ "futures 0.3.5", "hash-db", @@ -7106,7 +7106,7 @@ dependencies = [ [[package]] name = "sp-keyring" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" +source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" dependencies = [ "lazy_static", "sp-core", @@ -7117,7 +7117,7 @@ dependencies = [ [[package]] name = "sp-npos-elections" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" +source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" dependencies = [ "parity-scale-codec", "serde", @@ -7129,7 +7129,7 @@ dependencies = [ [[package]] name = "sp-npos-elections-compact" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" +source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -7140,7 +7140,7 @@ dependencies = [ [[package]] name = "sp-offchain" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" +source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" dependencies = [ "sp-api", "sp-core", @@ -7150,7 +7150,7 @@ dependencies = [ [[package]] name = "sp-panic-handler" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" +source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" dependencies = [ "backtrace", "log 0.4.8", @@ -7159,7 +7159,7 @@ dependencies = [ [[package]] name = "sp-rpc" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" +source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" dependencies = [ "serde", "sp-core", @@ -7168,7 +7168,7 @@ dependencies = [ [[package]] name = "sp-runtime" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" +source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" dependencies = [ "either", "hash256-std-hasher", @@ -7190,7 +7190,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" +source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" dependencies = [ "parity-scale-codec", "primitive-types", @@ -7205,7 +7205,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" +source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" dependencies = [ "Inflector", "proc-macro-crate", @@ -7217,7 +7217,7 @@ dependencies = [ [[package]] name = "sp-serializer" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" +source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" dependencies = [ "serde", "serde_json", @@ -7226,7 +7226,7 @@ dependencies = [ [[package]] name = "sp-session" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" +source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" dependencies = [ "parity-scale-codec", "sp-api", @@ -7239,7 +7239,7 @@ dependencies = [ [[package]] name = "sp-staking" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" +source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" dependencies = [ "parity-scale-codec", "sp-runtime", @@ -7249,14 +7249,16 @@ dependencies = [ [[package]] name = "sp-state-machine" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" +source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" dependencies = [ "hash-db", + "itertools 0.9.0", "log 0.4.8", "num-traits 0.2.12", "parity-scale-codec", "parking_lot 0.10.2", "rand 0.7.3", + "smallvec 1.4.0", "sp-core", "sp-externalities", "sp-panic-handler", @@ -7268,12 +7270,12 @@ dependencies = [ [[package]] name = "sp-std" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" +source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" [[package]] name = "sp-storage" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" +source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" dependencies = [ "impl-serde 0.2.3", "ref-cast", @@ -7285,7 +7287,7 @@ dependencies = [ [[package]] name = "sp-timestamp" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" +source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -7299,7 +7301,7 @@ dependencies = [ [[package]] name = "sp-tracing" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" +source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" dependencies = [ "log 0.4.8", "rental", @@ -7309,7 +7311,7 @@ dependencies = [ [[package]] name = "sp-transaction-pool" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" +source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" dependencies = [ "derive_more 0.99.8", "futures 0.3.5", @@ -7325,7 +7327,7 @@ dependencies = [ [[package]] name = "sp-trie" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" +source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" dependencies = [ "hash-db", "memory-db", @@ -7339,7 +7341,7 @@ dependencies = [ [[package]] name = "sp-utils" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" +source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" dependencies = [ "futures 0.3.5", "futures-core", @@ -7351,7 +7353,7 @@ dependencies = [ [[package]] name = "sp-version" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" +source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" dependencies = [ "impl-serde 0.2.3", "parity-scale-codec", @@ -7363,7 +7365,7 @@ dependencies = [ [[package]] name = "sp-wasm-interface" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" +source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -7494,7 +7496,7 @@ dependencies = [ [[package]] name = "substrate-browser-utils" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" +source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" dependencies = [ "chrono", "clear_on_drop", @@ -7521,7 +7523,7 @@ dependencies = [ [[package]] name = "substrate-build-script-utils" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" +source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" dependencies = [ "platforms", ] @@ -7529,7 +7531,7 @@ dependencies = [ [[package]] name = "substrate-frame-rpc-system" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" +source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" dependencies = [ "frame-system-rpc-runtime-api", "futures 0.3.5", @@ -7552,7 +7554,7 @@ dependencies = [ [[package]] name = "substrate-prometheus-endpoint" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" +source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" dependencies = [ "async-std", "derive_more 0.99.8", @@ -7566,7 +7568,7 @@ dependencies = [ [[package]] name = "substrate-test-client" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" +source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" dependencies = [ "futures 0.3.5", "hash-db", @@ -7588,7 +7590,7 @@ dependencies = [ [[package]] name = "substrate-test-runtime" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" +source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" dependencies = [ "cfg-if", "frame-executive", @@ -7628,7 +7630,7 @@ dependencies = [ [[package]] name = "substrate-test-runtime-client" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" +source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" dependencies = [ "futures 0.3.5", "parity-scale-codec", @@ -7649,7 +7651,7 @@ dependencies = [ [[package]] name = "substrate-wasm-builder-runner" version = "1.0.6" -source = "git+https://github.com/paritytech/substrate#6f86bdd897ce06c0169dcbd2454dc7587cb8461f" +source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" [[package]] name = "substrate-wasm-builder-runner" diff --git a/parachain/src/wasm_executor/mod.rs b/parachain/src/wasm_executor/mod.rs index b0dd127f40..2a9c9569be 100644 --- a/parachain/src/wasm_executor/mod.rs +++ b/parachain/src/wasm_executor/mod.rs @@ -276,6 +276,18 @@ impl sp_externalities::Externalities for ValidationExternalities { panic!("storage_append: unsupported feature for parachain validation") } + fn storage_start_transaction(&mut self) { + panic!("storage_start_transaction: unsupported feature for parachain validation") + } + + fn storage_rollback_transaction(&mut self) -> Result<(), ()> { + panic!("storage_rollback_transaction: unsupported feature for parachain validation") + } + + fn storage_commit_transaction(&mut self) -> Result<(), ()> { + panic!("storage_commit_transaction: unsupported feature for parachain validation") + } + fn wipe(&mut self) { panic!("wipe: unsupported feature for parachain validation") } diff --git a/runtime/kusama/src/lib.rs b/runtime/kusama/src/lib.rs index 8437603237..64909f2bb5 100644 --- a/runtime/kusama/src/lib.rs +++ b/runtime/kusama/src/lib.rs @@ -86,7 +86,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("kusama"), impl_name: create_runtime_str!("parity-kusama"), authoring_version: 2, - spec_version: 2011, + spec_version: 2012, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 1, diff --git a/runtime/polkadot/src/lib.rs b/runtime/polkadot/src/lib.rs index 6b05529f61..3d11c65f67 100644 --- a/runtime/polkadot/src/lib.rs +++ b/runtime/polkadot/src/lib.rs @@ -91,7 +91,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("polkadot"), impl_name: create_runtime_str!("parity-polkadot"), authoring_version: 0, - spec_version: 11, + spec_version: 12, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 0, diff --git a/runtime/westend/src/lib.rs b/runtime/westend/src/lib.rs index 4214ece1c4..bc05f943ae 100644 --- a/runtime/westend/src/lib.rs +++ b/runtime/westend/src/lib.rs @@ -81,7 +81,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("westend"), impl_name: create_runtime_str!("parity-westend"), authoring_version: 2, - spec_version: 31, + spec_version: 32, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 1, -- GitLab From 1cd96bb68b47b728ef2181a1394715c40995beb2 Mon Sep 17 00:00:00 2001 From: Cecile Tonglet Date: Tue, 23 Jun 2020 13:12:34 +0200 Subject: [PATCH 007/192] Companion PR for https://github.com/paritytech/substrate/pull/6400 (#1287) * Initial commit Forked at: f351f42cdb07265d8d5802470758776e2e3eef1d Parent branch: origin/master * Substrate companion PR impl Debug for sc_service::Configuration Related to: https://github.com/paritytech/substrate/pull/6400 * Bump Co-authored-by: Gav Wood --- Cargo.lock | 272 ++++++++++++++++++++++---------------------- collator/src/lib.rs | 6 +- 2 files changed, 139 insertions(+), 139 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index fb420eebd6..5defb28cb8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1172,7 +1172,7 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "fork-tree" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" +source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" dependencies = [ "parity-scale-codec", ] @@ -1180,7 +1180,7 @@ dependencies = [ [[package]] name = "frame-benchmarking" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" +source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" dependencies = [ "frame-support", "frame-system", @@ -1197,7 +1197,7 @@ dependencies = [ [[package]] name = "frame-benchmarking-cli" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" +source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" dependencies = [ "frame-benchmarking", "parity-scale-codec", @@ -1215,7 +1215,7 @@ dependencies = [ [[package]] name = "frame-executive" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" +source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" dependencies = [ "frame-support", "frame-system", @@ -1230,7 +1230,7 @@ dependencies = [ [[package]] name = "frame-metadata" version = "11.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" +source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" dependencies = [ "parity-scale-codec", "serde", @@ -1241,7 +1241,7 @@ dependencies = [ [[package]] name = "frame-support" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" +source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" dependencies = [ "bitmask", "frame-metadata", @@ -1266,7 +1266,7 @@ dependencies = [ [[package]] name = "frame-support-procedural" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" +source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" dependencies = [ "frame-support-procedural-tools", "proc-macro2 1.0.18", @@ -1277,7 +1277,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" +source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" dependencies = [ "frame-support-procedural-tools-derive", "proc-macro-crate", @@ -1289,7 +1289,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools-derive" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" +source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" dependencies = [ "proc-macro2 1.0.18", "quote 1.0.7", @@ -1299,7 +1299,7 @@ dependencies = [ [[package]] name = "frame-system" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" +source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" dependencies = [ "frame-support", "impl-trait-for-tuples", @@ -1315,7 +1315,7 @@ dependencies = [ [[package]] name = "frame-system-benchmarking" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" +source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" dependencies = [ "frame-benchmarking", "frame-support", @@ -1329,7 +1329,7 @@ dependencies = [ [[package]] name = "frame-system-rpc-runtime-api" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" +source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" dependencies = [ "parity-scale-codec", "sp-api", @@ -3266,7 +3266,7 @@ dependencies = [ [[package]] name = "pallet-authority-discovery" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" +source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" dependencies = [ "frame-support", "frame-system", @@ -3282,7 +3282,7 @@ dependencies = [ [[package]] name = "pallet-authorship" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" +source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" dependencies = [ "frame-support", "frame-system", @@ -3297,7 +3297,7 @@ dependencies = [ [[package]] name = "pallet-babe" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" +source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" dependencies = [ "frame-support", "frame-system", @@ -3319,7 +3319,7 @@ dependencies = [ [[package]] name = "pallet-balances" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" +source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" dependencies = [ "frame-benchmarking", "frame-support", @@ -3333,7 +3333,7 @@ dependencies = [ [[package]] name = "pallet-collective" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" +source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" dependencies = [ "frame-benchmarking", "frame-support", @@ -3349,7 +3349,7 @@ dependencies = [ [[package]] name = "pallet-democracy" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" +source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" dependencies = [ "frame-benchmarking", "frame-support", @@ -3364,7 +3364,7 @@ dependencies = [ [[package]] name = "pallet-elections-phragmen" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" +source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" dependencies = [ "frame-benchmarking", "frame-support", @@ -3379,7 +3379,7 @@ dependencies = [ [[package]] name = "pallet-finality-tracker" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" +source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" dependencies = [ "frame-support", "frame-system", @@ -3395,7 +3395,7 @@ dependencies = [ [[package]] name = "pallet-grandpa" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" +source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" dependencies = [ "frame-support", "frame-system", @@ -3415,7 +3415,7 @@ dependencies = [ [[package]] name = "pallet-identity" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" +source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" dependencies = [ "enumflags2", "frame-benchmarking", @@ -3431,7 +3431,7 @@ dependencies = [ [[package]] name = "pallet-im-online" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" +source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" dependencies = [ "frame-benchmarking", "frame-support", @@ -3451,7 +3451,7 @@ dependencies = [ [[package]] name = "pallet-indices" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" +source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" dependencies = [ "frame-support", "frame-system", @@ -3467,7 +3467,7 @@ dependencies = [ [[package]] name = "pallet-membership" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" +source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" dependencies = [ "frame-support", "frame-system", @@ -3481,7 +3481,7 @@ dependencies = [ [[package]] name = "pallet-multisig" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" +source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" dependencies = [ "frame-support", "frame-system", @@ -3496,7 +3496,7 @@ dependencies = [ [[package]] name = "pallet-nicks" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" +source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" dependencies = [ "frame-support", "frame-system", @@ -3510,7 +3510,7 @@ dependencies = [ [[package]] name = "pallet-offences" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" +source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" dependencies = [ "frame-support", "frame-system", @@ -3525,7 +3525,7 @@ dependencies = [ [[package]] name = "pallet-offences-benchmarking" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" +source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" dependencies = [ "frame-benchmarking", "frame-support", @@ -3546,7 +3546,7 @@ dependencies = [ [[package]] name = "pallet-proxy" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" +source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" dependencies = [ "frame-support", "frame-system", @@ -3561,7 +3561,7 @@ dependencies = [ [[package]] name = "pallet-randomness-collective-flip" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" +source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" dependencies = [ "frame-support", "frame-system", @@ -3574,7 +3574,7 @@ dependencies = [ [[package]] name = "pallet-recovery" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" +source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" dependencies = [ "enumflags2", "frame-support", @@ -3589,7 +3589,7 @@ dependencies = [ [[package]] name = "pallet-scheduler" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" +source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" dependencies = [ "frame-benchmarking", "frame-support", @@ -3604,7 +3604,7 @@ dependencies = [ [[package]] name = "pallet-session" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" +source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" dependencies = [ "frame-support", "frame-system", @@ -3624,7 +3624,7 @@ dependencies = [ [[package]] name = "pallet-session-benchmarking" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" +source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" dependencies = [ "frame-benchmarking", "frame-support", @@ -3638,7 +3638,7 @@ dependencies = [ [[package]] name = "pallet-society" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" +source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" dependencies = [ "frame-support", "frame-system", @@ -3652,7 +3652,7 @@ dependencies = [ [[package]] name = "pallet-staking" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" +source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" dependencies = [ "frame-benchmarking", "frame-support", @@ -3674,7 +3674,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-curve" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" +source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -3685,7 +3685,7 @@ dependencies = [ [[package]] name = "pallet-sudo" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" +source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" dependencies = [ "frame-support", "frame-system", @@ -3699,7 +3699,7 @@ dependencies = [ [[package]] name = "pallet-timestamp" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" +source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" dependencies = [ "frame-benchmarking", "frame-support", @@ -3717,7 +3717,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" +source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" dependencies = [ "frame-support", "frame-system", @@ -3732,7 +3732,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" +source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" dependencies = [ "jsonrpc-core", "jsonrpc-core-client", @@ -3750,7 +3750,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc-runtime-api" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" +source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" dependencies = [ "frame-support", "parity-scale-codec", @@ -3763,7 +3763,7 @@ dependencies = [ [[package]] name = "pallet-treasury" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" +source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" dependencies = [ "frame-benchmarking", "frame-support", @@ -3778,7 +3778,7 @@ dependencies = [ [[package]] name = "pallet-utility" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" +source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" dependencies = [ "frame-benchmarking", "frame-support", @@ -3794,7 +3794,7 @@ dependencies = [ [[package]] name = "pallet-vesting" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" +source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" dependencies = [ "enumflags2", "frame-benchmarking", @@ -5531,7 +5531,7 @@ dependencies = [ [[package]] name = "sc-authority-discovery" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" +source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" dependencies = [ "bytes 0.5.4", "derive_more 0.99.8", @@ -5558,7 +5558,7 @@ dependencies = [ [[package]] name = "sc-basic-authorship" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" +source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -5582,7 +5582,7 @@ dependencies = [ [[package]] name = "sc-block-builder" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" +source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" dependencies = [ "parity-scale-codec", "sc-client-api", @@ -5598,7 +5598,7 @@ dependencies = [ [[package]] name = "sc-chain-spec" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" +source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" dependencies = [ "impl-trait-for-tuples", "sc-chain-spec-derive", @@ -5614,7 +5614,7 @@ dependencies = [ [[package]] name = "sc-chain-spec-derive" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" +source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -5625,7 +5625,7 @@ dependencies = [ [[package]] name = "sc-cli" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" +source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" dependencies = [ "ansi_term 0.12.1", "atty", @@ -5665,7 +5665,7 @@ dependencies = [ [[package]] name = "sc-client-api" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" +source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" dependencies = [ "derive_more 0.99.8", "fnv", @@ -5701,7 +5701,7 @@ dependencies = [ [[package]] name = "sc-client-db" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" +source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" dependencies = [ "blake2-rfc", "hash-db", @@ -5730,7 +5730,7 @@ dependencies = [ [[package]] name = "sc-consensus" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" +source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" dependencies = [ "sc-client-api", "sp-blockchain", @@ -5741,7 +5741,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" +source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" dependencies = [ "derive_more 0.99.8", "fork-tree", @@ -5783,7 +5783,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe-rpc" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" +source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" dependencies = [ "derive_more 0.99.8", "futures 0.3.5", @@ -5807,7 +5807,7 @@ dependencies = [ [[package]] name = "sc-consensus-epochs" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" +source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" dependencies = [ "fork-tree", "parity-scale-codec", @@ -5820,7 +5820,7 @@ dependencies = [ [[package]] name = "sc-consensus-slots" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" +source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -5842,7 +5842,7 @@ dependencies = [ [[package]] name = "sc-consensus-uncles" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" +source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" dependencies = [ "log 0.4.8", "sc-client-api", @@ -5856,7 +5856,7 @@ dependencies = [ [[package]] name = "sc-executor" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" +source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" dependencies = [ "derive_more 0.99.8", "lazy_static", @@ -5884,7 +5884,7 @@ dependencies = [ [[package]] name = "sc-executor-common" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" +source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" dependencies = [ "derive_more 0.99.8", "log 0.4.8", @@ -5901,7 +5901,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmi" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" +source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" dependencies = [ "log 0.4.8", "parity-scale-codec", @@ -5916,7 +5916,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmtime" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" +source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" dependencies = [ "cranelift-codegen", "cranelift-wasm", @@ -5937,7 +5937,7 @@ dependencies = [ [[package]] name = "sc-finality-grandpa" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" +source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" dependencies = [ "assert_matches", "derive_more 0.99.8", @@ -5975,7 +5975,7 @@ dependencies = [ [[package]] name = "sc-finality-grandpa-rpc" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" +source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" dependencies = [ "derive_more 0.99.8", "finality-grandpa", @@ -5992,7 +5992,7 @@ dependencies = [ [[package]] name = "sc-informant" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" +source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" dependencies = [ "ansi_term 0.12.1", "futures 0.3.5", @@ -6011,7 +6011,7 @@ dependencies = [ [[package]] name = "sc-keystore" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" +source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" dependencies = [ "derive_more 0.99.8", "hex", @@ -6027,7 +6027,7 @@ dependencies = [ [[package]] name = "sc-light" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" +source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" dependencies = [ "hash-db", "lazy_static", @@ -6046,7 +6046,7 @@ dependencies = [ [[package]] name = "sc-network" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" +source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" dependencies = [ "bitflags", "bs58", @@ -6098,7 +6098,7 @@ dependencies = [ [[package]] name = "sc-network-gossip" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" +source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6113,7 +6113,7 @@ dependencies = [ [[package]] name = "sc-network-test" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" +source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" dependencies = [ "env_logger", "futures 0.3.5", @@ -6140,7 +6140,7 @@ dependencies = [ [[package]] name = "sc-offchain" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" +source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" dependencies = [ "bytes 0.5.4", "fnv", @@ -6167,7 +6167,7 @@ dependencies = [ [[package]] name = "sc-peerset" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" +source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" dependencies = [ "futures 0.3.5", "libp2p", @@ -6180,7 +6180,7 @@ dependencies = [ [[package]] name = "sc-proposer-metrics" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" +source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" dependencies = [ "log 0.4.8", "substrate-prometheus-endpoint", @@ -6189,7 +6189,7 @@ dependencies = [ [[package]] name = "sc-rpc" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" +source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" dependencies = [ "futures 0.3.5", "hash-db", @@ -6221,7 +6221,7 @@ dependencies = [ [[package]] name = "sc-rpc-api" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" +source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" dependencies = [ "derive_more 0.99.8", "futures 0.3.5", @@ -6245,7 +6245,7 @@ dependencies = [ [[package]] name = "sc-rpc-server" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" +source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" dependencies = [ "jsonrpc-core", "jsonrpc-http-server", @@ -6261,7 +6261,7 @@ dependencies = [ [[package]] name = "sc-service" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" +source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" dependencies = [ "derive_more 0.99.8", "directories", @@ -6324,7 +6324,7 @@ dependencies = [ [[package]] name = "sc-state-db" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" +source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" dependencies = [ "log 0.4.8", "parity-scale-codec", @@ -6338,7 +6338,7 @@ dependencies = [ [[package]] name = "sc-telemetry" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" +source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" dependencies = [ "bytes 0.5.4", "futures 0.3.5", @@ -6360,7 +6360,7 @@ dependencies = [ [[package]] name = "sc-tracing" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" +source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" dependencies = [ "erased-serde", "log 0.4.8", @@ -6377,7 +6377,7 @@ dependencies = [ [[package]] name = "sc-transaction-graph" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" +source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" dependencies = [ "derive_more 0.99.8", "futures 0.3.5", @@ -6397,7 +6397,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" +source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" dependencies = [ "derive_more 0.99.8", "futures 0.3.5", @@ -6784,7 +6784,7 @@ dependencies = [ [[package]] name = "sp-allocator" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" +source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" dependencies = [ "derive_more 0.99.8", "log 0.4.8", @@ -6796,7 +6796,7 @@ dependencies = [ [[package]] name = "sp-api" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" +source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" dependencies = [ "hash-db", "parity-scale-codec", @@ -6811,7 +6811,7 @@ dependencies = [ [[package]] name = "sp-api-proc-macro" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" +source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" dependencies = [ "blake2-rfc", "proc-macro-crate", @@ -6823,7 +6823,7 @@ dependencies = [ [[package]] name = "sp-application-crypto" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" +source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" dependencies = [ "parity-scale-codec", "serde", @@ -6835,7 +6835,7 @@ dependencies = [ [[package]] name = "sp-arithmetic" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" +source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" dependencies = [ "integer-sqrt", "num-traits 0.2.12", @@ -6848,7 +6848,7 @@ dependencies = [ [[package]] name = "sp-authority-discovery" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" +source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" dependencies = [ "parity-scale-codec", "sp-api", @@ -6860,7 +6860,7 @@ dependencies = [ [[package]] name = "sp-authorship" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" +source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" dependencies = [ "parity-scale-codec", "sp-inherents", @@ -6871,7 +6871,7 @@ dependencies = [ [[package]] name = "sp-block-builder" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" +source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" dependencies = [ "parity-scale-codec", "sp-api", @@ -6883,7 +6883,7 @@ dependencies = [ [[package]] name = "sp-blockchain" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" +source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" dependencies = [ "derive_more 0.99.8", "log 0.4.8", @@ -6899,7 +6899,7 @@ dependencies = [ [[package]] name = "sp-chain-spec" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" +source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" dependencies = [ "serde", "serde_json", @@ -6908,7 +6908,7 @@ dependencies = [ [[package]] name = "sp-consensus" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" +source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" dependencies = [ "derive_more 0.99.8", "futures 0.3.5", @@ -6931,7 +6931,7 @@ dependencies = [ [[package]] name = "sp-consensus-aura" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" +source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" dependencies = [ "parity-scale-codec", "sp-api", @@ -6945,7 +6945,7 @@ dependencies = [ [[package]] name = "sp-consensus-babe" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" +source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" dependencies = [ "merlin", "parity-scale-codec", @@ -6963,7 +6963,7 @@ dependencies = [ [[package]] name = "sp-consensus-vrf" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" +source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" dependencies = [ "parity-scale-codec", "schnorrkel", @@ -6975,7 +6975,7 @@ dependencies = [ [[package]] name = "sp-core" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" +source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" dependencies = [ "base58", "blake2-rfc", @@ -7017,7 +7017,7 @@ dependencies = [ [[package]] name = "sp-database" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" +source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" dependencies = [ "kvdb", "parking_lot 0.10.2", @@ -7026,7 +7026,7 @@ dependencies = [ [[package]] name = "sp-debug-derive" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" +source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" dependencies = [ "proc-macro2 1.0.18", "quote 1.0.7", @@ -7036,7 +7036,7 @@ dependencies = [ [[package]] name = "sp-externalities" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" +source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" dependencies = [ "environmental", "parity-scale-codec", @@ -7047,7 +7047,7 @@ dependencies = [ [[package]] name = "sp-finality-grandpa" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" +source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" dependencies = [ "finality-grandpa", "log 0.4.8", @@ -7063,7 +7063,7 @@ dependencies = [ [[package]] name = "sp-finality-tracker" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" +source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" dependencies = [ "parity-scale-codec", "sp-inherents", @@ -7073,7 +7073,7 @@ dependencies = [ [[package]] name = "sp-inherents" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" +source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" dependencies = [ "derive_more 0.99.8", "parity-scale-codec", @@ -7085,7 +7085,7 @@ dependencies = [ [[package]] name = "sp-io" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" +source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" dependencies = [ "futures 0.3.5", "hash-db", @@ -7106,7 +7106,7 @@ dependencies = [ [[package]] name = "sp-keyring" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" +source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" dependencies = [ "lazy_static", "sp-core", @@ -7117,7 +7117,7 @@ dependencies = [ [[package]] name = "sp-npos-elections" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" +source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" dependencies = [ "parity-scale-codec", "serde", @@ -7129,7 +7129,7 @@ dependencies = [ [[package]] name = "sp-npos-elections-compact" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" +source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -7140,7 +7140,7 @@ dependencies = [ [[package]] name = "sp-offchain" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" +source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" dependencies = [ "sp-api", "sp-core", @@ -7150,7 +7150,7 @@ dependencies = [ [[package]] name = "sp-panic-handler" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" +source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" dependencies = [ "backtrace", "log 0.4.8", @@ -7159,7 +7159,7 @@ dependencies = [ [[package]] name = "sp-rpc" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" +source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" dependencies = [ "serde", "sp-core", @@ -7168,7 +7168,7 @@ dependencies = [ [[package]] name = "sp-runtime" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" +source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" dependencies = [ "either", "hash256-std-hasher", @@ -7190,7 +7190,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" +source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" dependencies = [ "parity-scale-codec", "primitive-types", @@ -7205,7 +7205,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" +source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" dependencies = [ "Inflector", "proc-macro-crate", @@ -7217,7 +7217,7 @@ dependencies = [ [[package]] name = "sp-serializer" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" +source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" dependencies = [ "serde", "serde_json", @@ -7226,7 +7226,7 @@ dependencies = [ [[package]] name = "sp-session" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" +source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" dependencies = [ "parity-scale-codec", "sp-api", @@ -7239,7 +7239,7 @@ dependencies = [ [[package]] name = "sp-staking" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" +source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" dependencies = [ "parity-scale-codec", "sp-runtime", @@ -7249,7 +7249,7 @@ dependencies = [ [[package]] name = "sp-state-machine" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" +source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" dependencies = [ "hash-db", "itertools 0.9.0", @@ -7270,12 +7270,12 @@ dependencies = [ [[package]] name = "sp-std" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" +source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" [[package]] name = "sp-storage" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" +source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" dependencies = [ "impl-serde 0.2.3", "ref-cast", @@ -7287,7 +7287,7 @@ dependencies = [ [[package]] name = "sp-timestamp" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" +source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -7301,7 +7301,7 @@ dependencies = [ [[package]] name = "sp-tracing" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" +source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" dependencies = [ "log 0.4.8", "rental", @@ -7311,7 +7311,7 @@ dependencies = [ [[package]] name = "sp-transaction-pool" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" +source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" dependencies = [ "derive_more 0.99.8", "futures 0.3.5", @@ -7327,7 +7327,7 @@ dependencies = [ [[package]] name = "sp-trie" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" +source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" dependencies = [ "hash-db", "memory-db", @@ -7341,7 +7341,7 @@ dependencies = [ [[package]] name = "sp-utils" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" +source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" dependencies = [ "futures 0.3.5", "futures-core", @@ -7353,7 +7353,7 @@ dependencies = [ [[package]] name = "sp-version" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" +source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" dependencies = [ "impl-serde 0.2.3", "parity-scale-codec", @@ -7365,7 +7365,7 @@ dependencies = [ [[package]] name = "sp-wasm-interface" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" +source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -7496,7 +7496,7 @@ dependencies = [ [[package]] name = "substrate-browser-utils" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" +source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" dependencies = [ "chrono", "clear_on_drop", @@ -7523,7 +7523,7 @@ dependencies = [ [[package]] name = "substrate-build-script-utils" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" +source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" dependencies = [ "platforms", ] @@ -7531,7 +7531,7 @@ dependencies = [ [[package]] name = "substrate-frame-rpc-system" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" +source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" dependencies = [ "frame-system-rpc-runtime-api", "futures 0.3.5", @@ -7554,7 +7554,7 @@ dependencies = [ [[package]] name = "substrate-prometheus-endpoint" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" +source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" dependencies = [ "async-std", "derive_more 0.99.8", @@ -7568,7 +7568,7 @@ dependencies = [ [[package]] name = "substrate-test-client" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" +source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" dependencies = [ "futures 0.3.5", "hash-db", @@ -7590,7 +7590,7 @@ dependencies = [ [[package]] name = "substrate-test-runtime" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" +source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" dependencies = [ "cfg-if", "frame-executive", @@ -7630,7 +7630,7 @@ dependencies = [ [[package]] name = "substrate-test-runtime-client" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" +source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" dependencies = [ "futures 0.3.5", "parity-scale-codec", @@ -7651,7 +7651,7 @@ dependencies = [ [[package]] name = "substrate-wasm-builder-runner" version = "1.0.6" -source = "git+https://github.com/paritytech/substrate#5a102f7c984a7e7c169cf2b74df24e35a20710a2" +source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" [[package]] name = "substrate-wasm-builder-runner" diff --git a/collator/src/lib.rs b/collator/src/lib.rs index 932648f3e1..fbc5b90634 100644 --- a/collator/src/lib.rs +++ b/collator/src/lib.rs @@ -501,14 +501,14 @@ mod tests { } } - // Make sure that the future returned by `start_collator` implementes `Send`. + // Make sure that the future returned by `start_collator` implements `Send`. #[test] fn start_collator_is_send() { fn check_send(_: T) {} let cli = Cli::from_iter(&["-dev"]); - let task_executor = Arc::new(|_, _| unimplemented!()); - let config = cli.create_configuration(&cli.run.base, task_executor).unwrap(); + let task_executor = |_, _| unimplemented!(); + let config = cli.create_configuration(&cli.run.base, task_executor.into()).unwrap(); check_send(start_collator( BuildDummyParachainContext, -- GitLab From cf9f06e10afb1fc1c5b0199e3f7c0361cb7e77bf Mon Sep 17 00:00:00 2001 From: Shawn Tabrizi Date: Tue, 23 Jun 2020 13:14:38 +0200 Subject: [PATCH 008/192] Make Proxy `NonTransfer` filter explicit (#1303) * Make kusama proxy explicit * Make polkadot explicit * Make westend explicit * bump spec --- runtime/kusama/src/lib.rs | 47 ++++++++++++++++++++++++++++++++++--- runtime/polkadot/src/lib.rs | 40 ++++++++++++++++++++++++++++--- runtime/westend/src/lib.rs | 38 ++++++++++++++++++++++++++++-- 3 files changed, 117 insertions(+), 8 deletions(-) diff --git a/runtime/kusama/src/lib.rs b/runtime/kusama/src/lib.rs index 64909f2bb5..bfeb0af2b0 100644 --- a/runtime/kusama/src/lib.rs +++ b/runtime/kusama/src/lib.rs @@ -800,9 +800,50 @@ impl InstanceFilter for ProxyType { fn filter(&self, c: &Call) -> bool { match self { ProxyType::Any => true, - ProxyType::NonTransfer => !matches!(c, - Call::Balances(..) | Call::Vesting(vesting::Call::vested_transfer(..)) - | Call::Indices(indices::Call::transfer(..)) + ProxyType::NonTransfer => matches!(c, + Call::System(..) | + Call::Babe(..) | + Call::Timestamp(..) | + Call::Indices(indices::Call::claim(..)) | + Call::Indices(indices::Call::free(..)) | + Call::Indices(indices::Call::freeze(..)) | + // Specifically omitting Indices `transfer`, `force_transfer` + // Specifically omitting the entire Balances pallet + Call::Authorship(..) | + Call::Staking(..) | + Call::Offences(..) | + Call::Session(..) | + Call::FinalityTracker(..) | + Call::Grandpa(..) | + Call::ImOnline(..) | + Call::AuthorityDiscovery(..) | + Call::Democracy(..) | + Call::Council(..) | + Call::TechnicalCommittee(..) | + Call::ElectionsPhragmen(..) | + Call::TechnicalMembership(..) | + Call::Treasury(..) | + Call::Claims(..) | + Call::Parachains(..) | + Call::Attestations(..) | + Call::Slots(..) | + Call::Registrar(..) | + Call::Utility(..) | + Call::Identity(..) | + Call::Society(..) | + Call::Recovery(recovery::Call::as_recovered(..)) | + Call::Recovery(recovery::Call::vouch_recovery(..)) | + Call::Recovery(recovery::Call::claim_recovery(..)) | + Call::Recovery(recovery::Call::close_recovery(..)) | + Call::Recovery(recovery::Call::remove_recovery(..)) | + Call::Recovery(recovery::Call::cancel_recovered(..)) | + // Specifically omitting Recovery `create_recovery`, `initiate_recovery` + Call::Vesting(vesting::Call::vest(..)) | + Call::Vesting(vesting::Call::vest_other(..)) | + // Specifically omitting Vesting `vested_transfer`, and `force_vested_transfer` + Call::Scheduler(..) | + Call::Proxy(..) | + Call::Multisig(..) ), ProxyType::Governance => matches!(c, Call::Democracy(..) | Call::Council(..) | Call::TechnicalCommittee(..) diff --git a/runtime/polkadot/src/lib.rs b/runtime/polkadot/src/lib.rs index 3d11c65f67..0fa870d0e4 100644 --- a/runtime/polkadot/src/lib.rs +++ b/runtime/polkadot/src/lib.rs @@ -784,9 +784,43 @@ impl InstanceFilter for ProxyType { fn filter(&self, c: &Call) -> bool { match self { ProxyType::Any => true, - ProxyType::NonTransfer => !matches!(c, - Call::Balances(..) | Call::Vesting(vesting::Call::vested_transfer(..)) - | Call::Indices(indices::Call::transfer(..)) + ProxyType::NonTransfer => matches!(c, + Call::System(..) | + Call::Scheduler(..) | + Call::Babe(..) | + Call::Timestamp(..) | + Call::Indices(indices::Call::claim(..)) | + Call::Indices(indices::Call::free(..)) | + Call::Indices(indices::Call::freeze(..)) | + // Specifically omitting Indices `transfer`, `force_transfer` + // Specifically omitting the entire Balances pallet + Call::Authorship(..) | + Call::Staking(..) | + Call::Offences(..) | + Call::Session(..) | + Call::FinalityTracker(..) | + Call::Grandpa(..) | + Call::ImOnline(..) | + Call::AuthorityDiscovery(..) | + Call::Democracy(..) | + Call::Council(..) | + Call::TechnicalCommittee(..) | + Call::ElectionsPhragmen(..) | + Call::TechnicalMembership(..) | + Call::Treasury(..) | + Call::Parachains(..) | + Call::Attestations(..) | + Call::Slots(..) | + Call::Registrar(..) | + Call::Claims(..) | + Call::Vesting(vesting::Call::vest(..)) | + Call::Vesting(vesting::Call::vest_other(..)) | + // Specifically omitting Vesting `vested_transfer`, and `force_vested_transfer` + Call::Utility(..) | + // Specifically omitting Sudo pallet + Call::Identity(..) | + Call::Proxy(..) | + Call::Multisig(..) ), ProxyType::Governance => matches!(c, Call::Democracy(..) | Call::Council(..) | Call::TechnicalCommittee(..) diff --git a/runtime/westend/src/lib.rs b/runtime/westend/src/lib.rs index bc05f943ae..8b02d369b6 100644 --- a/runtime/westend/src/lib.rs +++ b/runtime/westend/src/lib.rs @@ -587,8 +587,42 @@ impl InstanceFilter for ProxyType { fn filter(&self, c: &Call) -> bool { match self { ProxyType::Any => true, - ProxyType::NonTransfer => !matches!(c, - Call::Balances(..) | Call::Indices(indices::Call::transfer(..)) + ProxyType::NonTransfer => matches!(c, + Call::System(..) | + Call::Babe(..) | + Call::Timestamp(..) | + Call::Indices(indices::Call::claim(..)) | + Call::Indices(indices::Call::free(..)) | + Call::Indices(indices::Call::freeze(..)) | + // Specifically omitting Indices `transfer`, `force_transfer` + // Specifically omitting the entire Balances pallet + Call::Authorship(..) | + Call::Staking(..) | + Call::Offences(..) | + Call::Session(..) | + Call::FinalityTracker(..) | + Call::Grandpa(..) | + Call::ImOnline(..) | + Call::AuthorityDiscovery(..) | + Call::Parachains(..) | + Call::Attestations(..) | + Call::Registrar(..) | + Call::Utility(..) | + Call::Identity(..) | + Call::Recovery(recovery::Call::as_recovered(..)) | + Call::Recovery(recovery::Call::vouch_recovery(..)) | + Call::Recovery(recovery::Call::claim_recovery(..)) | + Call::Recovery(recovery::Call::close_recovery(..)) | + Call::Recovery(recovery::Call::remove_recovery(..)) | + Call::Recovery(recovery::Call::cancel_recovered(..)) | + // Specifically omitting Recovery `create_recovery`, `initiate_recovery` + Call::Vesting(vesting::Call::vest(..)) | + Call::Vesting(vesting::Call::vest_other(..)) | + // Specifically omitting Vesting `vested_transfer`, and `force_vested_transfer` + Call::Scheduler(..) | + // Specifically omitting Sudo pallet + Call::Proxy(..) | + Call::Multisig(..) ), ProxyType::Staking => matches!(c, Call::Staking(..) | Call::Utility(utility::Call::batch(..)) -- GitLab From ff6dc9a9e0d0375d3d91cf9dd938859fba783a28 Mon Sep 17 00:00:00 2001 From: Gavin Wood Date: Tue, 23 Jun 2020 17:40:41 +0200 Subject: [PATCH 009/192] Update staking reward curves (#1302) * Update staking reward curve for pre-parachain situation. * Bump runtime. * Bump versions --- Cargo.lock | 312 ++++++++++----------- Cargo.toml | 2 +- availability-store/Cargo.toml | 2 +- cli/Cargo.toml | 2 +- collator/Cargo.toml | 2 +- erasure-coding/Cargo.toml | 2 +- network/Cargo.toml | 2 +- network/test/Cargo.toml | 2 +- parachain/Cargo.toml | 2 +- parachain/test-parachains/adder/Cargo.toml | 2 +- parachain/test-parachains/halt/Cargo.toml | 2 +- primitives/Cargo.toml | 2 +- rpc/Cargo.toml | 2 +- runtime/common/Cargo.toml | 2 +- runtime/kusama/Cargo.toml | 2 +- runtime/kusama/src/lib.rs | 7 +- runtime/polkadot/Cargo.toml | 2 +- runtime/polkadot/src/lib.rs | 7 +- runtime/test-runtime/Cargo.toml | 2 +- runtime/westend/Cargo.toml | 2 +- service/Cargo.toml | 2 +- statement-table/Cargo.toml | 2 +- validation/Cargo.toml | 2 +- 23 files changed, 188 insertions(+), 178 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 5defb28cb8..004438a55e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1172,7 +1172,7 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "fork-tree" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" +source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" dependencies = [ "parity-scale-codec", ] @@ -1180,7 +1180,7 @@ dependencies = [ [[package]] name = "frame-benchmarking" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" +source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" dependencies = [ "frame-support", "frame-system", @@ -1197,7 +1197,7 @@ dependencies = [ [[package]] name = "frame-benchmarking-cli" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" +source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" dependencies = [ "frame-benchmarking", "parity-scale-codec", @@ -1215,7 +1215,7 @@ dependencies = [ [[package]] name = "frame-executive" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" +source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" dependencies = [ "frame-support", "frame-system", @@ -1230,7 +1230,7 @@ dependencies = [ [[package]] name = "frame-metadata" version = "11.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" +source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" dependencies = [ "parity-scale-codec", "serde", @@ -1241,7 +1241,7 @@ dependencies = [ [[package]] name = "frame-support" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" +source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" dependencies = [ "bitmask", "frame-metadata", @@ -1266,7 +1266,7 @@ dependencies = [ [[package]] name = "frame-support-procedural" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" +source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" dependencies = [ "frame-support-procedural-tools", "proc-macro2 1.0.18", @@ -1277,7 +1277,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" +source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" dependencies = [ "frame-support-procedural-tools-derive", "proc-macro-crate", @@ -1289,7 +1289,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools-derive" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" +source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" dependencies = [ "proc-macro2 1.0.18", "quote 1.0.7", @@ -1299,7 +1299,7 @@ dependencies = [ [[package]] name = "frame-system" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" +source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" dependencies = [ "frame-support", "impl-trait-for-tuples", @@ -1315,7 +1315,7 @@ dependencies = [ [[package]] name = "frame-system-benchmarking" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" +source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" dependencies = [ "frame-benchmarking", "frame-support", @@ -1329,7 +1329,7 @@ dependencies = [ [[package]] name = "frame-system-rpc-runtime-api" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" +source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" dependencies = [ "parity-scale-codec", "sp-api", @@ -2237,7 +2237,7 @@ dependencies = [ [[package]] name = "kusama-runtime" -version = "0.8.11" +version = "0.8.12" dependencies = [ "bitvec", "frame-benchmarking", @@ -3266,7 +3266,7 @@ dependencies = [ [[package]] name = "pallet-authority-discovery" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" +source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" dependencies = [ "frame-support", "frame-system", @@ -3282,7 +3282,7 @@ dependencies = [ [[package]] name = "pallet-authorship" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" +source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" dependencies = [ "frame-support", "frame-system", @@ -3297,7 +3297,7 @@ dependencies = [ [[package]] name = "pallet-babe" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" +source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" dependencies = [ "frame-support", "frame-system", @@ -3319,7 +3319,7 @@ dependencies = [ [[package]] name = "pallet-balances" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" +source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" dependencies = [ "frame-benchmarking", "frame-support", @@ -3333,7 +3333,7 @@ dependencies = [ [[package]] name = "pallet-collective" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" +source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" dependencies = [ "frame-benchmarking", "frame-support", @@ -3349,7 +3349,7 @@ dependencies = [ [[package]] name = "pallet-democracy" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" +source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" dependencies = [ "frame-benchmarking", "frame-support", @@ -3364,7 +3364,7 @@ dependencies = [ [[package]] name = "pallet-elections-phragmen" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" +source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" dependencies = [ "frame-benchmarking", "frame-support", @@ -3379,7 +3379,7 @@ dependencies = [ [[package]] name = "pallet-finality-tracker" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" +source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" dependencies = [ "frame-support", "frame-system", @@ -3395,7 +3395,7 @@ dependencies = [ [[package]] name = "pallet-grandpa" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" +source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" dependencies = [ "frame-support", "frame-system", @@ -3415,7 +3415,7 @@ dependencies = [ [[package]] name = "pallet-identity" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" +source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" dependencies = [ "enumflags2", "frame-benchmarking", @@ -3431,7 +3431,7 @@ dependencies = [ [[package]] name = "pallet-im-online" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" +source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" dependencies = [ "frame-benchmarking", "frame-support", @@ -3451,7 +3451,7 @@ dependencies = [ [[package]] name = "pallet-indices" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" +source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" dependencies = [ "frame-support", "frame-system", @@ -3467,7 +3467,7 @@ dependencies = [ [[package]] name = "pallet-membership" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" +source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" dependencies = [ "frame-support", "frame-system", @@ -3481,7 +3481,7 @@ dependencies = [ [[package]] name = "pallet-multisig" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" +source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" dependencies = [ "frame-support", "frame-system", @@ -3496,7 +3496,7 @@ dependencies = [ [[package]] name = "pallet-nicks" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" +source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" dependencies = [ "frame-support", "frame-system", @@ -3510,7 +3510,7 @@ dependencies = [ [[package]] name = "pallet-offences" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" +source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" dependencies = [ "frame-support", "frame-system", @@ -3525,7 +3525,7 @@ dependencies = [ [[package]] name = "pallet-offences-benchmarking" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" +source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" dependencies = [ "frame-benchmarking", "frame-support", @@ -3546,7 +3546,7 @@ dependencies = [ [[package]] name = "pallet-proxy" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" +source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" dependencies = [ "frame-support", "frame-system", @@ -3561,7 +3561,7 @@ dependencies = [ [[package]] name = "pallet-randomness-collective-flip" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" +source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" dependencies = [ "frame-support", "frame-system", @@ -3574,7 +3574,7 @@ dependencies = [ [[package]] name = "pallet-recovery" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" +source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" dependencies = [ "enumflags2", "frame-support", @@ -3589,7 +3589,7 @@ dependencies = [ [[package]] name = "pallet-scheduler" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" +source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" dependencies = [ "frame-benchmarking", "frame-support", @@ -3604,7 +3604,7 @@ dependencies = [ [[package]] name = "pallet-session" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" +source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" dependencies = [ "frame-support", "frame-system", @@ -3624,7 +3624,7 @@ dependencies = [ [[package]] name = "pallet-session-benchmarking" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" +source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" dependencies = [ "frame-benchmarking", "frame-support", @@ -3638,7 +3638,7 @@ dependencies = [ [[package]] name = "pallet-society" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" +source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" dependencies = [ "frame-support", "frame-system", @@ -3652,7 +3652,7 @@ dependencies = [ [[package]] name = "pallet-staking" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" +source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" dependencies = [ "frame-benchmarking", "frame-support", @@ -3674,7 +3674,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-curve" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" +source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -3685,7 +3685,7 @@ dependencies = [ [[package]] name = "pallet-sudo" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" +source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" dependencies = [ "frame-support", "frame-system", @@ -3699,7 +3699,7 @@ dependencies = [ [[package]] name = "pallet-timestamp" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" +source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" dependencies = [ "frame-benchmarking", "frame-support", @@ -3717,7 +3717,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" +source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" dependencies = [ "frame-support", "frame-system", @@ -3732,7 +3732,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" +source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" dependencies = [ "jsonrpc-core", "jsonrpc-core-client", @@ -3750,7 +3750,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc-runtime-api" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" +source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" dependencies = [ "frame-support", "parity-scale-codec", @@ -3763,7 +3763,7 @@ dependencies = [ [[package]] name = "pallet-treasury" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" +source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" dependencies = [ "frame-benchmarking", "frame-support", @@ -3778,7 +3778,7 @@ dependencies = [ [[package]] name = "pallet-utility" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" +source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" dependencies = [ "frame-benchmarking", "frame-support", @@ -3794,7 +3794,7 @@ dependencies = [ [[package]] name = "pallet-vesting" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" +source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" dependencies = [ "enumflags2", "frame-benchmarking", @@ -4119,7 +4119,7 @@ checksum = "feb3b2b1033b8a60b4da6ee470325f887758c95d5320f52f9ce0df055a55940e" [[package]] name = "polkadot" -version = "0.8.11" +version = "0.8.12" dependencies = [ "assert_cmd", "futures 0.3.5", @@ -4133,7 +4133,7 @@ dependencies = [ [[package]] name = "polkadot-availability-store" -version = "0.8.11" +version = "0.8.12" dependencies = [ "derive_more 0.99.8", "exit-future", @@ -4159,7 +4159,7 @@ dependencies = [ [[package]] name = "polkadot-cli" -version = "0.8.11" +version = "0.8.12" dependencies = [ "frame-benchmarking-cli", "futures 0.3.5", @@ -4184,7 +4184,7 @@ dependencies = [ [[package]] name = "polkadot-collator" -version = "0.8.11" +version = "0.8.12" dependencies = [ "futures 0.3.5", "futures-timer 2.0.2", @@ -4212,7 +4212,7 @@ dependencies = [ [[package]] name = "polkadot-erasure-coding" -version = "0.8.11" +version = "0.8.12" dependencies = [ "derive_more 0.15.0", "parity-scale-codec", @@ -4224,7 +4224,7 @@ dependencies = [ [[package]] name = "polkadot-network" -version = "0.8.11" +version = "0.8.12" dependencies = [ "arrayvec 0.4.12", "bytes 0.5.4", @@ -4252,7 +4252,7 @@ dependencies = [ [[package]] name = "polkadot-network-test" -version = "0.8.11" +version = "0.8.12" dependencies = [ "futures 0.3.5", "log 0.4.8", @@ -4309,7 +4309,7 @@ dependencies = [ [[package]] name = "polkadot-parachain" -version = "0.8.11" +version = "0.8.12" dependencies = [ "derive_more 0.99.8", "log 0.4.8", @@ -4328,7 +4328,7 @@ dependencies = [ [[package]] name = "polkadot-primitives" -version = "0.8.11" +version = "0.8.12" dependencies = [ "bitvec", "frame-system", @@ -4350,7 +4350,7 @@ dependencies = [ [[package]] name = "polkadot-rpc" -version = "0.8.11" +version = "0.8.12" dependencies = [ "jsonrpc-core", "pallet-transaction-payment-rpc", @@ -4376,7 +4376,7 @@ dependencies = [ [[package]] name = "polkadot-runtime" -version = "0.8.11" +version = "0.8.12" dependencies = [ "bitvec", "frame-benchmarking", @@ -4450,7 +4450,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-common" -version = "0.8.11" +version = "0.8.12" dependencies = [ "bitvec", "frame-benchmarking", @@ -4537,7 +4537,7 @@ dependencies = [ [[package]] name = "polkadot-service" -version = "0.8.11" +version = "0.8.12" dependencies = [ "env_logger", "frame-benchmarking", @@ -4655,7 +4655,7 @@ dependencies = [ [[package]] name = "polkadot-statement-table" -version = "0.8.11" +version = "0.8.12" dependencies = [ "parity-scale-codec", "polkadot-primitives", @@ -4664,7 +4664,7 @@ dependencies = [ [[package]] name = "polkadot-test-runtime" -version = "0.8.11" +version = "0.8.12" dependencies = [ "bitvec", "frame-executive", @@ -4741,7 +4741,7 @@ dependencies = [ [[package]] name = "polkadot-validation" -version = "0.8.11" +version = "0.8.12" dependencies = [ "bitvec", "derive_more 0.14.1", @@ -5531,7 +5531,7 @@ dependencies = [ [[package]] name = "sc-authority-discovery" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" +source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" dependencies = [ "bytes 0.5.4", "derive_more 0.99.8", @@ -5558,7 +5558,7 @@ dependencies = [ [[package]] name = "sc-basic-authorship" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" +source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -5582,7 +5582,7 @@ dependencies = [ [[package]] name = "sc-block-builder" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" +source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" dependencies = [ "parity-scale-codec", "sc-client-api", @@ -5598,7 +5598,7 @@ dependencies = [ [[package]] name = "sc-chain-spec" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" +source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" dependencies = [ "impl-trait-for-tuples", "sc-chain-spec-derive", @@ -5614,7 +5614,7 @@ dependencies = [ [[package]] name = "sc-chain-spec-derive" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" +source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -5625,7 +5625,7 @@ dependencies = [ [[package]] name = "sc-cli" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" +source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" dependencies = [ "ansi_term 0.12.1", "atty", @@ -5665,7 +5665,7 @@ dependencies = [ [[package]] name = "sc-client-api" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" +source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" dependencies = [ "derive_more 0.99.8", "fnv", @@ -5701,7 +5701,7 @@ dependencies = [ [[package]] name = "sc-client-db" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" +source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" dependencies = [ "blake2-rfc", "hash-db", @@ -5730,7 +5730,7 @@ dependencies = [ [[package]] name = "sc-consensus" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" +source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" dependencies = [ "sc-client-api", "sp-blockchain", @@ -5741,7 +5741,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" +source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" dependencies = [ "derive_more 0.99.8", "fork-tree", @@ -5783,7 +5783,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe-rpc" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" +source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" dependencies = [ "derive_more 0.99.8", "futures 0.3.5", @@ -5807,7 +5807,7 @@ dependencies = [ [[package]] name = "sc-consensus-epochs" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" +source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" dependencies = [ "fork-tree", "parity-scale-codec", @@ -5820,7 +5820,7 @@ dependencies = [ [[package]] name = "sc-consensus-slots" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" +source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -5842,7 +5842,7 @@ dependencies = [ [[package]] name = "sc-consensus-uncles" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" +source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" dependencies = [ "log 0.4.8", "sc-client-api", @@ -5856,7 +5856,7 @@ dependencies = [ [[package]] name = "sc-executor" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" +source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" dependencies = [ "derive_more 0.99.8", "lazy_static", @@ -5884,7 +5884,7 @@ dependencies = [ [[package]] name = "sc-executor-common" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" +source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" dependencies = [ "derive_more 0.99.8", "log 0.4.8", @@ -5901,7 +5901,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmi" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" +source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" dependencies = [ "log 0.4.8", "parity-scale-codec", @@ -5916,7 +5916,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmtime" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" +source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" dependencies = [ "cranelift-codegen", "cranelift-wasm", @@ -5937,7 +5937,7 @@ dependencies = [ [[package]] name = "sc-finality-grandpa" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" +source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" dependencies = [ "assert_matches", "derive_more 0.99.8", @@ -5975,7 +5975,7 @@ dependencies = [ [[package]] name = "sc-finality-grandpa-rpc" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" +source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" dependencies = [ "derive_more 0.99.8", "finality-grandpa", @@ -5992,7 +5992,7 @@ dependencies = [ [[package]] name = "sc-informant" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" +source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" dependencies = [ "ansi_term 0.12.1", "futures 0.3.5", @@ -6011,7 +6011,7 @@ dependencies = [ [[package]] name = "sc-keystore" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" +source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" dependencies = [ "derive_more 0.99.8", "hex", @@ -6027,7 +6027,7 @@ dependencies = [ [[package]] name = "sc-light" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" +source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" dependencies = [ "hash-db", "lazy_static", @@ -6046,7 +6046,7 @@ dependencies = [ [[package]] name = "sc-network" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" +source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" dependencies = [ "bitflags", "bs58", @@ -6098,7 +6098,7 @@ dependencies = [ [[package]] name = "sc-network-gossip" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" +source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6113,7 +6113,7 @@ dependencies = [ [[package]] name = "sc-network-test" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" +source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" dependencies = [ "env_logger", "futures 0.3.5", @@ -6140,7 +6140,7 @@ dependencies = [ [[package]] name = "sc-offchain" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" +source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" dependencies = [ "bytes 0.5.4", "fnv", @@ -6167,7 +6167,7 @@ dependencies = [ [[package]] name = "sc-peerset" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" +source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" dependencies = [ "futures 0.3.5", "libp2p", @@ -6180,7 +6180,7 @@ dependencies = [ [[package]] name = "sc-proposer-metrics" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" +source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" dependencies = [ "log 0.4.8", "substrate-prometheus-endpoint", @@ -6189,7 +6189,7 @@ dependencies = [ [[package]] name = "sc-rpc" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" +source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" dependencies = [ "futures 0.3.5", "hash-db", @@ -6221,7 +6221,7 @@ dependencies = [ [[package]] name = "sc-rpc-api" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" +source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" dependencies = [ "derive_more 0.99.8", "futures 0.3.5", @@ -6245,7 +6245,7 @@ dependencies = [ [[package]] name = "sc-rpc-server" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" +source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" dependencies = [ "jsonrpc-core", "jsonrpc-http-server", @@ -6261,7 +6261,7 @@ dependencies = [ [[package]] name = "sc-service" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" +source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" dependencies = [ "derive_more 0.99.8", "directories", @@ -6324,7 +6324,7 @@ dependencies = [ [[package]] name = "sc-state-db" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" +source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" dependencies = [ "log 0.4.8", "parity-scale-codec", @@ -6338,7 +6338,7 @@ dependencies = [ [[package]] name = "sc-telemetry" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" +source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" dependencies = [ "bytes 0.5.4", "futures 0.3.5", @@ -6360,7 +6360,7 @@ dependencies = [ [[package]] name = "sc-tracing" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" +source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" dependencies = [ "erased-serde", "log 0.4.8", @@ -6377,7 +6377,7 @@ dependencies = [ [[package]] name = "sc-transaction-graph" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" +source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" dependencies = [ "derive_more 0.99.8", "futures 0.3.5", @@ -6397,7 +6397,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" +source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" dependencies = [ "derive_more 0.99.8", "futures 0.3.5", @@ -6784,7 +6784,7 @@ dependencies = [ [[package]] name = "sp-allocator" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" +source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" dependencies = [ "derive_more 0.99.8", "log 0.4.8", @@ -6796,7 +6796,7 @@ dependencies = [ [[package]] name = "sp-api" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" +source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" dependencies = [ "hash-db", "parity-scale-codec", @@ -6811,7 +6811,7 @@ dependencies = [ [[package]] name = "sp-api-proc-macro" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" +source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" dependencies = [ "blake2-rfc", "proc-macro-crate", @@ -6823,7 +6823,7 @@ dependencies = [ [[package]] name = "sp-application-crypto" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" +source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" dependencies = [ "parity-scale-codec", "serde", @@ -6835,7 +6835,7 @@ dependencies = [ [[package]] name = "sp-arithmetic" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" +source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" dependencies = [ "integer-sqrt", "num-traits 0.2.12", @@ -6848,7 +6848,7 @@ dependencies = [ [[package]] name = "sp-authority-discovery" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" +source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" dependencies = [ "parity-scale-codec", "sp-api", @@ -6860,7 +6860,7 @@ dependencies = [ [[package]] name = "sp-authorship" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" +source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" dependencies = [ "parity-scale-codec", "sp-inherents", @@ -6871,7 +6871,7 @@ dependencies = [ [[package]] name = "sp-block-builder" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" +source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" dependencies = [ "parity-scale-codec", "sp-api", @@ -6883,7 +6883,7 @@ dependencies = [ [[package]] name = "sp-blockchain" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" +source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" dependencies = [ "derive_more 0.99.8", "log 0.4.8", @@ -6899,7 +6899,7 @@ dependencies = [ [[package]] name = "sp-chain-spec" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" +source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" dependencies = [ "serde", "serde_json", @@ -6908,7 +6908,7 @@ dependencies = [ [[package]] name = "sp-consensus" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" +source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" dependencies = [ "derive_more 0.99.8", "futures 0.3.5", @@ -6931,7 +6931,7 @@ dependencies = [ [[package]] name = "sp-consensus-aura" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" +source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" dependencies = [ "parity-scale-codec", "sp-api", @@ -6945,7 +6945,7 @@ dependencies = [ [[package]] name = "sp-consensus-babe" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" +source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" dependencies = [ "merlin", "parity-scale-codec", @@ -6963,7 +6963,7 @@ dependencies = [ [[package]] name = "sp-consensus-vrf" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" +source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" dependencies = [ "parity-scale-codec", "schnorrkel", @@ -6975,7 +6975,7 @@ dependencies = [ [[package]] name = "sp-core" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" +source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" dependencies = [ "base58", "blake2-rfc", @@ -7017,7 +7017,7 @@ dependencies = [ [[package]] name = "sp-database" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" +source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" dependencies = [ "kvdb", "parking_lot 0.10.2", @@ -7026,7 +7026,7 @@ dependencies = [ [[package]] name = "sp-debug-derive" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" +source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" dependencies = [ "proc-macro2 1.0.18", "quote 1.0.7", @@ -7036,7 +7036,7 @@ dependencies = [ [[package]] name = "sp-externalities" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" +source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" dependencies = [ "environmental", "parity-scale-codec", @@ -7047,7 +7047,7 @@ dependencies = [ [[package]] name = "sp-finality-grandpa" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" +source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" dependencies = [ "finality-grandpa", "log 0.4.8", @@ -7063,7 +7063,7 @@ dependencies = [ [[package]] name = "sp-finality-tracker" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" +source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" dependencies = [ "parity-scale-codec", "sp-inherents", @@ -7073,7 +7073,7 @@ dependencies = [ [[package]] name = "sp-inherents" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" +source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" dependencies = [ "derive_more 0.99.8", "parity-scale-codec", @@ -7085,7 +7085,7 @@ dependencies = [ [[package]] name = "sp-io" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" +source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" dependencies = [ "futures 0.3.5", "hash-db", @@ -7106,7 +7106,7 @@ dependencies = [ [[package]] name = "sp-keyring" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" +source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" dependencies = [ "lazy_static", "sp-core", @@ -7117,7 +7117,7 @@ dependencies = [ [[package]] name = "sp-npos-elections" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" +source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" dependencies = [ "parity-scale-codec", "serde", @@ -7129,7 +7129,7 @@ dependencies = [ [[package]] name = "sp-npos-elections-compact" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" +source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -7140,7 +7140,7 @@ dependencies = [ [[package]] name = "sp-offchain" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" +source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" dependencies = [ "sp-api", "sp-core", @@ -7150,7 +7150,7 @@ dependencies = [ [[package]] name = "sp-panic-handler" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" +source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" dependencies = [ "backtrace", "log 0.4.8", @@ -7159,7 +7159,7 @@ dependencies = [ [[package]] name = "sp-rpc" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" +source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" dependencies = [ "serde", "sp-core", @@ -7168,7 +7168,7 @@ dependencies = [ [[package]] name = "sp-runtime" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" +source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" dependencies = [ "either", "hash256-std-hasher", @@ -7190,7 +7190,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" +source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" dependencies = [ "parity-scale-codec", "primitive-types", @@ -7205,7 +7205,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" +source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" dependencies = [ "Inflector", "proc-macro-crate", @@ -7217,7 +7217,7 @@ dependencies = [ [[package]] name = "sp-serializer" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" +source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" dependencies = [ "serde", "serde_json", @@ -7226,7 +7226,7 @@ dependencies = [ [[package]] name = "sp-session" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" +source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" dependencies = [ "parity-scale-codec", "sp-api", @@ -7239,7 +7239,7 @@ dependencies = [ [[package]] name = "sp-staking" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" +source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" dependencies = [ "parity-scale-codec", "sp-runtime", @@ -7249,7 +7249,7 @@ dependencies = [ [[package]] name = "sp-state-machine" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" +source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" dependencies = [ "hash-db", "itertools 0.9.0", @@ -7270,12 +7270,12 @@ dependencies = [ [[package]] name = "sp-std" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" +source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" [[package]] name = "sp-storage" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" +source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" dependencies = [ "impl-serde 0.2.3", "ref-cast", @@ -7287,7 +7287,7 @@ dependencies = [ [[package]] name = "sp-timestamp" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" +source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -7301,7 +7301,7 @@ dependencies = [ [[package]] name = "sp-tracing" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" +source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" dependencies = [ "log 0.4.8", "rental", @@ -7311,7 +7311,7 @@ dependencies = [ [[package]] name = "sp-transaction-pool" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" +source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" dependencies = [ "derive_more 0.99.8", "futures 0.3.5", @@ -7327,7 +7327,7 @@ dependencies = [ [[package]] name = "sp-trie" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" +source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" dependencies = [ "hash-db", "memory-db", @@ -7341,7 +7341,7 @@ dependencies = [ [[package]] name = "sp-utils" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" +source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" dependencies = [ "futures 0.3.5", "futures-core", @@ -7353,7 +7353,7 @@ dependencies = [ [[package]] name = "sp-version" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" +source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" dependencies = [ "impl-serde 0.2.3", "parity-scale-codec", @@ -7365,7 +7365,7 @@ dependencies = [ [[package]] name = "sp-wasm-interface" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" +source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -7496,7 +7496,7 @@ dependencies = [ [[package]] name = "substrate-browser-utils" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" +source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" dependencies = [ "chrono", "clear_on_drop", @@ -7523,7 +7523,7 @@ dependencies = [ [[package]] name = "substrate-build-script-utils" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" +source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" dependencies = [ "platforms", ] @@ -7531,7 +7531,7 @@ dependencies = [ [[package]] name = "substrate-frame-rpc-system" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" +source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" dependencies = [ "frame-system-rpc-runtime-api", "futures 0.3.5", @@ -7554,7 +7554,7 @@ dependencies = [ [[package]] name = "substrate-prometheus-endpoint" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" +source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" dependencies = [ "async-std", "derive_more 0.99.8", @@ -7568,7 +7568,7 @@ dependencies = [ [[package]] name = "substrate-test-client" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" +source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" dependencies = [ "futures 0.3.5", "hash-db", @@ -7590,7 +7590,7 @@ dependencies = [ [[package]] name = "substrate-test-runtime" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" +source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" dependencies = [ "cfg-if", "frame-executive", @@ -7630,7 +7630,7 @@ dependencies = [ [[package]] name = "substrate-test-runtime-client" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" +source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" dependencies = [ "futures 0.3.5", "parity-scale-codec", @@ -7651,7 +7651,7 @@ dependencies = [ [[package]] name = "substrate-wasm-builder-runner" version = "1.0.6" -source = "git+https://github.com/paritytech/substrate#6221146c42ec20288880aab4fd39941920a3151f" +source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" [[package]] name = "substrate-wasm-builder-runner" @@ -7877,7 +7877,7 @@ dependencies = [ [[package]] name = "test-parachain-adder" -version = "0.8.11" +version = "0.8.12" dependencies = [ "dlmalloc", "parity-scale-codec", @@ -7916,7 +7916,7 @@ dependencies = [ [[package]] name = "test-parachain-halt" -version = "0.8.11" +version = "0.8.12" dependencies = [ "substrate-wasm-builder-runner 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -8825,7 +8825,7 @@ dependencies = [ [[package]] name = "westend-runtime" -version = "0.8.11" +version = "0.8.12" dependencies = [ "bitvec", "frame-benchmarking", diff --git a/Cargo.toml b/Cargo.toml index 705262f5a2..f320492418 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,7 +4,7 @@ path = "src/main.rs" [package] name = "polkadot" -version = "0.8.11" +version = "0.8.12" authors = ["Parity Technologies "] edition = "2018" diff --git a/availability-store/Cargo.toml b/availability-store/Cargo.toml index 417d600ca4..69defcfeb2 100644 --- a/availability-store/Cargo.toml +++ b/availability-store/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "polkadot-availability-store" description = "Persistent database for parachain data" -version = "0.8.11" +version = "0.8.12" authors = ["Parity Technologies "] edition = "2018" diff --git a/cli/Cargo.toml b/cli/Cargo.toml index 5dcaadd57b..ff67b236c5 100644 --- a/cli/Cargo.toml +++ b/cli/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-cli" -version = "0.8.11" +version = "0.8.12" authors = ["Parity Technologies "] description = "Polkadot Relay-chain Client Node" edition = "2018" diff --git a/collator/Cargo.toml b/collator/Cargo.toml index a183901bb4..2c47f20dbb 100644 --- a/collator/Cargo.toml +++ b/collator/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-collator" -version = "0.8.11" +version = "0.8.12" authors = ["Parity Technologies "] description = "Collator node implementation" edition = "2018" diff --git a/erasure-coding/Cargo.toml b/erasure-coding/Cargo.toml index 8d4aef5308..6368a1787b 100644 --- a/erasure-coding/Cargo.toml +++ b/erasure-coding/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-erasure-coding" -version = "0.8.11" +version = "0.8.12" authors = ["Parity Technologies "] edition = "2018" diff --git a/network/Cargo.toml b/network/Cargo.toml index 96546dfbd6..f3ca97dcda 100644 --- a/network/Cargo.toml +++ b/network/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-network" -version = "0.8.11" +version = "0.8.12" authors = ["Parity Technologies "] description = "Polkadot-specific networking protocol" edition = "2018" diff --git a/network/test/Cargo.toml b/network/test/Cargo.toml index 4cd342aef0..c8549924ce 100644 --- a/network/test/Cargo.toml +++ b/network/test/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-network-test" -version = "0.8.11" +version = "0.8.12" license = "GPL-3.0" authors = ["Parity Technologies "] edition = "2018" diff --git a/parachain/Cargo.toml b/parachain/Cargo.toml index 28f7d6ca0d..5846105a93 100644 --- a/parachain/Cargo.toml +++ b/parachain/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-parachain" -version = "0.8.11" +version = "0.8.12" authors = ["Parity Technologies "] description = "Types and utilities for creating and working with parachains" edition = "2018" diff --git a/parachain/test-parachains/adder/Cargo.toml b/parachain/test-parachains/adder/Cargo.toml index 1856e4d58c..3a636fca68 100644 --- a/parachain/test-parachains/adder/Cargo.toml +++ b/parachain/test-parachains/adder/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "test-parachain-adder" -version = "0.8.11" +version = "0.8.12" authors = ["Parity Technologies "] description = "Test parachain which adds to a number as its state transition" edition = "2018" diff --git a/parachain/test-parachains/halt/Cargo.toml b/parachain/test-parachains/halt/Cargo.toml index 930b4dc32d..cf3fb26555 100644 --- a/parachain/test-parachains/halt/Cargo.toml +++ b/parachain/test-parachains/halt/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "test-parachain-halt" -version = "0.8.11" +version = "0.8.12" authors = ["Parity Technologies "] description = "Test parachain which executes forever" edition = "2018" diff --git a/primitives/Cargo.toml b/primitives/Cargo.toml index e318d1cfec..b38d5cc97d 100644 --- a/primitives/Cargo.toml +++ b/primitives/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-primitives" -version = "0.8.11" +version = "0.8.12" authors = ["Parity Technologies "] edition = "2018" diff --git a/rpc/Cargo.toml b/rpc/Cargo.toml index a7c6dd33a2..6826900da7 100644 --- a/rpc/Cargo.toml +++ b/rpc/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-rpc" -version = "0.8.11" +version = "0.8.12" authors = ["Parity Technologies "] edition = "2018" diff --git a/runtime/common/Cargo.toml b/runtime/common/Cargo.toml index e533de8e37..4dba004540 100644 --- a/runtime/common/Cargo.toml +++ b/runtime/common/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-runtime-common" -version = "0.8.11" +version = "0.8.12" authors = ["Parity Technologies "] edition = "2018" diff --git a/runtime/kusama/Cargo.toml b/runtime/kusama/Cargo.toml index cae1628cce..9f599233f0 100644 --- a/runtime/kusama/Cargo.toml +++ b/runtime/kusama/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "kusama-runtime" -version = "0.8.11" +version = "0.8.12" authors = ["Parity Technologies "] edition = "2018" build = "build.rs" diff --git a/runtime/kusama/src/lib.rs b/runtime/kusama/src/lib.rs index bfeb0af2b0..3b81392994 100644 --- a/runtime/kusama/src/lib.rs +++ b/runtime/kusama/src/lib.rs @@ -266,11 +266,16 @@ impl session::historical::Trait for Runtime { type FullIdentificationOf = staking::ExposureOf; } +// TODO #6469: This shouldn't be static, but a lazily cached value, not built unless needed, and +// re-built in case input parameters have changed. The `ideal_stake` should be determined by the +// amount of parachain slots being bid on: this should be around `(75 - 25.min(slots / 4))%`. pallet_staking_reward_curve::build! { const REWARD_CURVE: PiecewiseLinear<'static> = curve!( min_inflation: 0_025_000, max_inflation: 0_100_000, - ideal_stake: 0_500_000, + // 3:2:1 staked : parachains : float. + // while there's no parachains, then this is 75% staked : 25% float. + ideal_stake: 0_750_000, falloff: 0_050_000, max_piece_count: 40, test_precision: 0_005_000, diff --git a/runtime/polkadot/Cargo.toml b/runtime/polkadot/Cargo.toml index 180e4c8bfe..ce3e9efc93 100644 --- a/runtime/polkadot/Cargo.toml +++ b/runtime/polkadot/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-runtime" -version = "0.8.11" +version = "0.8.12" authors = ["Parity Technologies "] edition = "2018" build = "build.rs" diff --git a/runtime/polkadot/src/lib.rs b/runtime/polkadot/src/lib.rs index 0fa870d0e4..a88373f3fe 100644 --- a/runtime/polkadot/src/lib.rs +++ b/runtime/polkadot/src/lib.rs @@ -288,11 +288,16 @@ impl session::historical::Trait for Runtime { type FullIdentificationOf = staking::ExposureOf; } +// TODO #6469: This shouldn't be static, but a lazily cached value, not built unless needed, and +// re-built in case input parameters have changed. The `ideal_stake` should be determined by the +// amount of parachain slots being bid on: this should be around `(75 - 25.min(slots / 4))%`. pallet_staking_reward_curve::build! { const REWARD_CURVE: PiecewiseLinear<'static> = curve!( min_inflation: 0_025_000, max_inflation: 0_100_000, - ideal_stake: 0_500_000, + // 3:2:1 staked : parachains : float. + // while there's no parachains, then this is 75% staked : 25% float. + ideal_stake: 0_750_000, falloff: 0_050_000, max_piece_count: 40, test_precision: 0_005_000, diff --git a/runtime/test-runtime/Cargo.toml b/runtime/test-runtime/Cargo.toml index 296b1f7610..4326e11dff 100644 --- a/runtime/test-runtime/Cargo.toml +++ b/runtime/test-runtime/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-test-runtime" -version = "0.8.11" +version = "0.8.12" authors = ["Parity Technologies "] edition = "2018" build = "build.rs" diff --git a/runtime/westend/Cargo.toml b/runtime/westend/Cargo.toml index 18d32a81f1..3743d765d3 100644 --- a/runtime/westend/Cargo.toml +++ b/runtime/westend/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "westend-runtime" -version = "0.8.11" +version = "0.8.12" authors = ["Parity Technologies "] edition = "2018" build = "build.rs" diff --git a/service/Cargo.toml b/service/Cargo.toml index 95ac10bfa4..bdd869da46 100644 --- a/service/Cargo.toml +++ b/service/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-service" -version = "0.8.11" +version = "0.8.12" authors = ["Parity Technologies "] edition = "2018" diff --git a/statement-table/Cargo.toml b/statement-table/Cargo.toml index 3494d8e296..209397056a 100644 --- a/statement-table/Cargo.toml +++ b/statement-table/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-statement-table" -version = "0.8.11" +version = "0.8.12" authors = ["Parity Technologies "] edition = "2018" diff --git a/validation/Cargo.toml b/validation/Cargo.toml index cbd5c7aee4..be07d4ce52 100644 --- a/validation/Cargo.toml +++ b/validation/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-validation" -version = "0.8.11" +version = "0.8.12" authors = ["Parity Technologies "] edition = "2018" -- GitLab From 39a3605224791f0b8fcd41af2f9636b83403780e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Wed, 24 Jun 2020 01:04:45 +0200 Subject: [PATCH 010/192] Make `produce_candidate` return an `Option` (#1309) * Make `produce_candidate` return an `Option` Instead of `produce_candidate` returning a `Result`, it should return an `Option`. The only supported error was `InvalidHead` anyway and Cumulus will take care to print appropriate information on what failed and Polkadot can just ignore it. * Fix warning --- collator/src/lib.rs | 33 +++++++++---------- .../adder/collator/src/main.rs | 16 ++++----- 2 files changed, 22 insertions(+), 27 deletions(-) diff --git a/collator/src/lib.rs b/collator/src/lib.rs index fbc5b90634..7214731e0c 100644 --- a/collator/src/lib.rs +++ b/collator/src/lib.rs @@ -50,7 +50,7 @@ use std::sync::Arc; use std::time::Duration; use std::pin::Pin; -use futures::{future, Future, Stream, FutureExt, TryFutureExt, StreamExt, task::Spawn}; +use futures::{future, Future, Stream, FutureExt, StreamExt, task::Spawn}; use log::warn; use sc_client_api::{StateBackend, BlockchainEvents}; use sp_blockchain::HeaderBackend; @@ -100,24 +100,17 @@ impl Network for polkadot_network::protocol::Service { } } -/// Error to return when the head data was invalid. -#[derive(Clone, Copy, Debug)] -pub struct InvalidHead; - /// Collation errors. #[derive(Debug)] pub enum Error { /// Error on the relay-chain side of things. Polkadot(String), - /// Error on the collator side of things. - Collator(InvalidHead), } impl fmt::Display for Error { 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"), } } } @@ -147,7 +140,7 @@ pub trait BuildParachainContext { /// 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 { - type ProduceCandidate: Future>; + type ProduceCandidate: Future>; /// Produce a candidate, given the relay parent hash, the latest ingress queue information /// and the last parachain head. @@ -167,8 +160,7 @@ pub async fn collate

( local_validation_data: LocalValidationData, mut para_context: P, key: Arc, -) - -> Result +) -> Option where P: ParachainContext, P::ProduceCandidate: Send, @@ -177,7 +169,7 @@ pub async fn collate

( relay_parent, global_validation, local_validation_data, - ).map_err(Error::Collator).await?; + ).await?; let pov_block = PoVBlock { block_data, @@ -204,7 +196,7 @@ pub async fn collate

( pov: pov_block, }; - Ok(collation) + Some(collation) } #[cfg(feature = "service-rewr")] @@ -341,8 +333,13 @@ fn build_collator_service( local_validation, parachain_context, key, - ).map_ok(move |collation| { - network.distribute_collation(targets, collation) + ).map(move |collation| { + match collation { + Some(collation) => network.distribute_collation(targets, collation), + None => log::trace!("Skipping collation as `collate` returned `None`"), + } + + Ok(()) }); future::Either::Right(collation_work) @@ -470,7 +467,7 @@ mod tests { struct DummyParachainContext; impl ParachainContext for DummyParachainContext { - type ProduceCandidate = future::Ready>; + type ProduceCandidate = future::Ready>; fn produce_candidate( &mut self, @@ -479,10 +476,10 @@ mod tests { _local_validation: LocalValidationData, ) -> Self::ProduceCandidate { // send messages right back. - future::ok(( + future::ready(Some(( BlockData(vec![1, 2, 3, 4, 5,]), HeadData(vec![9, 9, 9]), - )) + ))) } } diff --git a/parachain/test-parachains/adder/collator/src/main.rs b/parachain/test-parachains/adder/collator/src/main.rs index e0a78b1745..d69e4e3d92 100644 --- a/parachain/test-parachains/adder/collator/src/main.rs +++ b/parachain/test-parachains/adder/collator/src/main.rs @@ -26,11 +26,9 @@ use primitives::{ Hash, parachain::{HeadData, BlockData, Id as ParaId, LocalValidationData, GlobalValidationSchedule}, }; -use collator::{ - InvalidHead, ParachainContext, Network, BuildParachainContext, Cli, SubstrateCli, -}; +use collator::{ParachainContext, Network, BuildParachainContext, Cli, SubstrateCli}; use parking_lot::Mutex; -use futures::future::{Ready, ok, err, TryFutureExt}; +use futures::future::{Ready, ready, TryFutureExt}; const GENESIS: AdderHead = AdderHead { number: 0, @@ -55,7 +53,7 @@ struct AdderContext { /// The parachain context. impl ParachainContext for AdderContext { - type ProduceCandidate = Ready>; + type ProduceCandidate = Ready>; fn produce_candidate( &mut self, @@ -64,9 +62,9 @@ impl ParachainContext for AdderContext { local_validation: LocalValidationData, ) -> Self::ProduceCandidate { - let adder_head = match AdderHead::decode(&mut &local_validation.parent_head.0[..]) { - Ok(adder_head) => adder_head, - Err(_) => return err(InvalidHead) + let adder_head = match AdderHead::decode(&mut &local_validation.parent_head.0[..]).ok() { + Some(res) => res, + None => return ready(None), }; let mut db = self.db.lock(); @@ -94,7 +92,7 @@ impl ParachainContext for AdderContext { next_head.number, next_body.state.overflowing_add(next_body.add).0); db.insert(next_head.clone(), next_body); - ok((encoded_body, encoded_head)) + ready(Some((encoded_body, encoded_head))) } } -- GitLab From b05bb8f6336928dd9fb5711036f98c38a854650a Mon Sep 17 00:00:00 2001 From: Ashley Date: Wed, 24 Jun 2020 12:04:07 +0200 Subject: [PATCH 011/192] Companion PR for `Fix the browser node and ensure it doesn't colour the informant output` #6457 (#1307) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Companion for Substrate #6269 (nested storage tx) * Adjust to PR changes * Bump to newest substrate * Bump spec * Switch branch * Remove redundant informant_prefix * Fix collator tests * Update branch * Revert "Switch branch" This reverts commit bcce560c51fbc9db604cf3b0f615bfd21419f87d. Co-authored-by: Alexander Theißen --- cli/src/command.rs | 3 --- collator/src/lib.rs | 5 ----- node/service/src/lib.rs | 14 +++----------- .../test-parachains/adder/collator/src/main.rs | 1 - service/src/lib.rs | 14 +++----------- 5 files changed, 6 insertions(+), 31 deletions(-) diff --git a/cli/src/command.rs b/cli/src/command.rs index 5e9d783828..714e3c2dda 100644 --- a/cli/src/command.rs +++ b/cli/src/command.rs @@ -128,7 +128,6 @@ pub fn run() -> Result<()> { authority_discovery_enabled, 6000, grandpa_pause, - None, ).map(|(s, _, _)| s) }, service::KusamaExecutor::native_version().runtime_version @@ -146,7 +145,6 @@ pub fn run() -> Result<()> { authority_discovery_enabled, 6000, grandpa_pause, - None, ).map(|(s, _, _)| s) }, service::WestendExecutor::native_version().runtime_version @@ -164,7 +162,6 @@ pub fn run() -> Result<()> { authority_discovery_enabled, 6000, grandpa_pause, - None, ).map(|(s, _, _)| s) }, service::PolkadotExecutor::native_version().runtime_version diff --git a/collator/src/lib.rs b/collator/src/lib.rs index 7214731e0c..063bdb1735 100644 --- a/collator/src/lib.rs +++ b/collator/src/lib.rs @@ -373,7 +373,6 @@ pub async fn start_collator

( para_id: ParaId, key: Arc, config: Configuration, - informant_prefix: Option, ) -> Result<(), polkadot_service::Error> where P: 'static + BuildParachainContext, @@ -394,7 +393,6 @@ where false, 6000, None, - informant_prefix, )?; let spawn_handle = service.spawn_task_handle(); build_collator_service( @@ -413,7 +411,6 @@ where false, 6000, None, - informant_prefix, )?; let spawn_handle = service.spawn_task_handle(); build_collator_service( @@ -432,7 +429,6 @@ where false, 6000, None, - informant_prefix, )?; let spawn_handle = service.spawn_task_handle(); build_collator_service( @@ -512,7 +508,6 @@ mod tests { 0.into(), Arc::new(CollatorPair::generate().0), config, - None, )); } } diff --git a/node/service/src/lib.rs b/node/service/src/lib.rs index e7fb7c5026..620850b3bd 100644 --- a/node/service/src/lib.rs +++ b/node/service/src/lib.rs @@ -153,7 +153,7 @@ fn set_prometheus_registry(config: &mut Configuration) -> Result<(), ServiceErro /// Use this macro if you don't actually need the full service, but just the builder in order to /// be able to perform chain operations. macro_rules! new_full_start { - ($config:expr, $runtime:ty, $executor:ty, $informant_prefix:expr $(,)?) => {{ + ($config:expr, $runtime:ty, $executor:ty) => {{ set_prometheus_registry(&mut $config)?; let mut import_setup = None; @@ -162,7 +162,6 @@ macro_rules! new_full_start { let builder = service::ServiceBuilder::new_full::< Block, $runtime, $executor >($config)? - .with_informant_prefix($informant_prefix.unwrap_or_default())? .with_select_chain(|_, backend| { Ok(sc_consensus::LongestChain::new(backend.clone())) })? @@ -308,7 +307,6 @@ macro_rules! new_full { $grandpa_pause:expr, $runtime:ty, $dispatch:ty, - $informant_prefix:expr $(,)? ) => {{ use sc_client_api::ExecutorProvider; use sp_core::traits::BareCryptoStorePtr; @@ -321,7 +319,7 @@ macro_rules! new_full { let name = $config.network.node_name.clone(); let (builder, mut import_setup, inherent_data_providers, mut rpc_setup) = - new_full_start!($config, $runtime, $dispatch, $informant_prefix); + new_full_start!($config, $runtime, $dispatch); let service = builder .with_finality_proof_provider(|client, backend| { @@ -583,7 +581,7 @@ where >::StateBackend: sp_api::StateBackend, { config.keystore = service::config::KeystoreConfig::InMemory; - Ok(new_full_start!(config, Runtime, Dispatch, None).0) + Ok(new_full_start!(config, Runtime, Dispatch).0) } /// Create a new Polkadot service for a full node. @@ -595,7 +593,6 @@ pub fn polkadot_new_full( _authority_discovery_enabled: bool, _slot_duration: u64, grandpa_pause: Option<(u32, u32)>, - informant_prefix: Option, ) -> Result<( impl AbstractService, @@ -614,7 +611,6 @@ pub fn polkadot_new_full( grandpa_pause, polkadot_runtime::RuntimeApi, PolkadotExecutor, - informant_prefix, ); Ok((service, client, FullNodeHandles)) @@ -629,7 +625,6 @@ pub fn kusama_new_full( _authority_discovery_enabled: bool, _slot_duration: u64, grandpa_pause: Option<(u32, u32)>, - informant_prefix: Option, ) -> Result<( impl AbstractService, Arc, - informant_prefix: Option, ) -> Result<( impl AbstractService, @@ -682,7 +675,6 @@ pub fn westend_new_full( grandpa_pause, westend_runtime::RuntimeApi, WestendExecutor, - informant_prefix, ); Ok((service, client, FullNodeHandles)) diff --git a/parachain/test-parachains/adder/collator/src/main.rs b/parachain/test-parachains/adder/collator/src/main.rs index d69e4e3d92..a32b6e4ca4 100644 --- a/parachain/test-parachains/adder/collator/src/main.rs +++ b/parachain/test-parachains/adder/collator/src/main.rs @@ -139,7 +139,6 @@ fn main() -> Result<(), Box> { id, key, config, - None, ).map_err(|e| e.into()) })?; diff --git a/service/src/lib.rs b/service/src/lib.rs index 0f64f41bf9..82e8460437 100644 --- a/service/src/lib.rs +++ b/service/src/lib.rs @@ -149,7 +149,7 @@ fn set_prometheus_registry(config: &mut Configuration) -> Result<(), ServiceErro /// Use this macro if you don't actually need the full service, but just the builder in order to /// be able to perform chain operations. macro_rules! new_full_start { - ($config:expr, $runtime:ty, $executor:ty, $informant_prefix:expr $(,)?) => {{ + ($config:expr, $runtime:ty, $executor:ty) => {{ set_prometheus_registry(&mut $config)?; let mut import_setup = None; @@ -158,7 +158,6 @@ macro_rules! new_full_start { let builder = service::ServiceBuilder::new_full::< Block, $runtime, $executor >($config)? - .with_informant_prefix($informant_prefix.unwrap_or_default())? .with_select_chain(|_, backend| { Ok(sc_consensus::LongestChain::new(backend.clone())) })? @@ -276,7 +275,6 @@ macro_rules! new_full { $grandpa_pause:expr, $runtime:ty, $dispatch:ty, - $informant_prefix:expr $(,)? ) => {{ use sc_network::Event; use sc_client_api::ExecutorProvider; @@ -298,7 +296,7 @@ macro_rules! new_full { let slot_duration = $slot_duration; let (builder, mut import_setup, inherent_data_providers, mut rpc_setup) = - new_full_start!($config, $runtime, $dispatch, $informant_prefix); + new_full_start!($config, $runtime, $dispatch); let service = builder .with_finality_proof_provider(|client, backend| { @@ -649,7 +647,7 @@ where >::StateBackend: sp_api::StateBackend, { config.keystore = service::config::KeystoreConfig::InMemory; - Ok(new_full_start!(config, Runtime, Dispatch, None).0) + Ok(new_full_start!(config, Runtime, Dispatch).0) } /// Create a new Polkadot service for a full node. @@ -661,7 +659,6 @@ pub fn polkadot_new_full( authority_discovery_enabled: bool, slot_duration: u64, grandpa_pause: Option<(u32, u32)>, - informant_prefix: Option, ) -> Result<( impl AbstractService, @@ -682,7 +679,6 @@ pub fn polkadot_new_full( grandpa_pause, polkadot_runtime::RuntimeApi, PolkadotExecutor, - informant_prefix, ); Ok((service, client, handles)) @@ -697,7 +693,6 @@ pub fn kusama_new_full( authority_discovery_enabled: bool, slot_duration: u64, grandpa_pause: Option<(u32, u32)>, - informant_prefix: Option, ) -> Result<( impl AbstractService, Arc, - informant_prefix: Option, ) -> Result<( impl AbstractService, @@ -754,7 +747,6 @@ pub fn westend_new_full( grandpa_pause, westend_runtime::RuntimeApi, WestendExecutor, - informant_prefix, ); Ok((service, client, handles)) -- GitLab From c948d2c92c541c5e4ab03d94c3e76181f741d866 Mon Sep 17 00:00:00 2001 From: Sergei Shulepov Date: Wed, 24 Jun 2020 16:14:41 +0200 Subject: [PATCH 012/192] Exploration of using graphwiz (#1298) * Experiment with graphwiz * Convert parachain overview diagrams * add install note for mdbook-graphviz Co-authored-by: Robert Habermeier --- roadmap/implementors-guide/.gitignore | 1 + roadmap/implementors-guide/README.md | 2 +- roadmap/implementors-guide/book.toml | 3 + .../implementors-guide/src/architecture.md | 63 ++++++-------- .../src/parachains-overview.md | 85 ++++++++----------- 5 files changed, 65 insertions(+), 89 deletions(-) diff --git a/roadmap/implementors-guide/.gitignore b/roadmap/implementors-guide/.gitignore index 3006b271da..ac55c8234c 100644 --- a/roadmap/implementors-guide/.gitignore +++ b/roadmap/implementors-guide/.gitignore @@ -1 +1,2 @@ book/ +*.generated.svg diff --git a/roadmap/implementors-guide/README.md b/roadmap/implementors-guide/README.md index 33bc0a0912..909e505597 100644 --- a/roadmap/implementors-guide/README.md +++ b/roadmap/implementors-guide/README.md @@ -3,7 +3,7 @@ The implementers' guide is compiled from several source files with [mdBook](https://github.com/rust-lang/mdBook). To view it live, locally, from the repo root: ```sh -cargo install mdbook mdbook-linkcheck +cargo install mdbook mdbook-linkcheck mdbook-graphviz mdbook serve roadmap/implementors-guide open http://localhost:3000 ``` diff --git a/roadmap/implementors-guide/book.toml b/roadmap/implementors-guide/book.toml index dd2ec97902..ac2ccdc8ce 100644 --- a/roadmap/implementors-guide/book.toml +++ b/roadmap/implementors-guide/book.toml @@ -5,5 +5,8 @@ multilingual = false src = "src" title = "The Polkadot Parachain Host Implementers' Guide" +[preprocessor.graphviz] +command = "mdbook-graphviz" + [output.html] [output.linkcheck] diff --git a/roadmap/implementors-guide/src/architecture.md b/roadmap/implementors-guide/src/architecture.md index d81e6826b0..fabca609c1 100644 --- a/roadmap/implementors-guide/src/architecture.md +++ b/roadmap/implementors-guide/src/architecture.md @@ -2,25 +2,22 @@ Our Parachain Host includes a blockchain known as the relay-chain. A blockchain is a Directed Acyclic Graph (DAG) of state transitions, where every block can be considered to be the head of a linked-list (known as a "chain" or "fork") with a cumulative state which is determined by applying the state transition of each block in turn. All paths through the DAG terminate at the Genesis Block. In fact, the blockchain is a tree, since each block can have only one parent. -```text - +----------------+ +----------------+ - | Block 4 | | Block 5 | - +----------------+ +----------------+ - \ / - V V - +---------------+ - | Block 3 | - +---------------+ - | - V - +----------------+ +----------------+ - | Block 1 | | Block 2 | - +----------------+ +----------------+ - \ / - V V - +----------------+ - | Genesis | - +----------------+ +```dot process +digraph { + node [shape=box]; + genesis [label = Genesis] + b1 [label = "Block 1"] + b2 [label = "Block 2"] + b3 [label = "Block 3"] + b4 [label = "Block 4"] + b5 [label = "Block 5"] + + b5 -> b3 + b4 -> b3 + b3 -> b1 + b2 -> genesis + b1 -> genesis +} ``` A blockchain network is comprised of nodes. These nodes each have a view of many different forks of a blockchain and must decide which forks to follow and what actions to take based on the forks of the chain that they are aware of. @@ -34,26 +31,16 @@ The first category of questions will be addressed by the Runtime, which defines The second category of questions addressed by Node-side behavior. Node-side behavior defines all activities that a node undertakes, given its view of the blockchain/block-DAG. Node-side behavior can take into account all or many of the forks of the blockchain, and only conditionally undertake certain activities based on which forks it is aware of, as well as the state of the head of those forks. -```text +```dot process +digraph G { + Runtime [shape=box] + "Node" [shape=box margin=0.5] + Transport [shape=rectangle width=5] + + Runtime -> "Node" [dir=both label="Runtime API"] - __________________________________ - / \ - | Runtime | - | | - \_________(Runtime API )___________/ - | ^ - V | - +----------------------------------------------+ - | | - | Node | - | | - | | - +----------------------------------------------+ - + + - | | - --------------------+ +------------------------ - Transport - ------------------------------------------------ + "Node" -> Transport [penwidth=1] +} ``` diff --git a/roadmap/implementors-guide/src/parachains-overview.md b/roadmap/implementors-guide/src/parachains-overview.md index 43ab974962..8eff666225 100644 --- a/roadmap/implementors-guide/src/parachains-overview.md +++ b/roadmap/implementors-guide/src/parachains-overview.md @@ -60,61 +60,46 @@ Reiterating the lifecycle of a candidate: It is also important to take note of the fact that the relay-chain is extended by BABE, which is a forkful algorithm. That means that different block authors can be chosen at the same time, and may not be building on the same block parent. Furthermore, the set of validators is not fixed, nor is the set of parachains. And even with the same set of validators and parachains, the validators' assignments to parachains is flexible. This means that the architecture proposed in the next chapters must deal with the variability and multiplicity of the network state. -```text - - ....... Validator Group 1 .......... - . . - . (Validator 4) . - . (Validator 1) (Validator 2) . - . (Validator 5) . - . . - ..........Building on C ........... ........ Validator Group 2 ........... - +----------------------+ . . - | Relay Block C | . (Validator 7) . - +----------------------+ . ( Validator 3) (Validator 6) . - \ . . - \ ......... Building on B ............. - \ - +----------------------+ - | Relay Block B | - +----------------------+ - | - +----------------------+ - | Relay Block A | - +----------------------+ +```dot process +digraph { + rca [label = "Relay Block A" shape=rectangle] + rcb [label = "Relay Block B" shape=rectangle] + rcc [label = "Relay Block C" shape=rectangle] + + vg1 [label =<Validator Group 1

(Validator 4)
(Validator 1) (Validator 2)
(Validator 5)
>] + vg2 [label =<Validator Group 2

(Validator 7)
(Validator 3) (Validator 6)
>] + + rcb -> rca + rcc -> rcb + + vg1 -> rcc [label="Building on C" style=dashed arrowhead=none] + vg2 -> rcb [label="Building on B" style=dashed arrowhead=none] +} ``` In this example, group 1 has received block C while the others have not due to network asynchrony. Now, a validator from group 2 may be able to build another block on top of B, called C'. Assume that afterwards, some validators become aware of both C and C', while others remain only aware of one. -```text - ....... Validator Group 1 .......... ........ Validator Group 2 ........... - . . . . - . (Validator 4) (Validator 1) . . (Validator 7) (Validator 6) . - . . . . - .......... Building on C .......... ......... Building on C' ............. - - - ....... Validator Group 3 .......... - . . - . (Validator 2) (Validator 3) . - . (Validator 5) . - . . - ....... Building on C and C' ....... - - +----------------------+ +----------------------+ - | Relay Block C | | Relay Block C' | - +----------------------+ +----------------------+ - \ / - \ / - \ / - +----------------------+ - | Relay Block B | - +----------------------+ - | - +----------------------+ - | Relay Block A | - +----------------------+ +```dot process +digraph { + rca [label = "Relay Block A" shape=rectangle] + rcb [label = "Relay Block B" shape=rectangle] + rcc [label = "Relay Block C" shape=rectangle] + rcc_prime [label = "Relay Block C'" shape=rectangle] + + vg1 [label =<Validator Group 1

(Validator 4) (Validator 1)>] + vg2 [label =<Validator Group 2

(Validator 7) (Validator 6)>] + vg3 [label =<Validator Group 3

(Validator 2) (Validator 3)
(Validator 5)
>] + + rcb -> rca + rcc -> rcb + rcc_prime -> rcb + + vg1 -> rcc [style=dashed arrowhead=none] + vg2 -> rcc_prime [style=dashed arrowhead=none] + vg3 -> rcc_prime [style=dashed arrowhead=none] + vg3 -> rcc [style=dashed arrowhead=none] +} ``` Those validators that are aware of many competing heads must be aware of the work happening on each one. They may contribute to some or a full extent on both. It is possible that due to network asynchrony two forks may grow in parallel for some time, although in the absence of an adversarial network this is unlikely in the case where there are validators who are aware of both chain heads. -- GitLab From 04e6c92971fa2bcb6ef0c463ff018c4a36c6200a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20Drwi=C4=99ga?= Date: Wed, 24 Jun 2020 17:25:02 +0200 Subject: [PATCH 013/192] CheckEra -> CheckMortality (#1306) * CheckEra -> CheckMortality * Update substrate. --- Cargo.lock | 273 ++++++++++++++++---------------- runtime/kusama/src/lib.rs | 4 +- runtime/polkadot/src/lib.rs | 4 +- runtime/test-runtime/src/lib.rs | 4 +- runtime/westend/src/lib.rs | 4 +- 5 files changed, 145 insertions(+), 144 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 004438a55e..76a1a543d2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1172,7 +1172,7 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "fork-tree" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" +source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" dependencies = [ "parity-scale-codec", ] @@ -1180,7 +1180,7 @@ dependencies = [ [[package]] name = "frame-benchmarking" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" +source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" dependencies = [ "frame-support", "frame-system", @@ -1197,7 +1197,7 @@ dependencies = [ [[package]] name = "frame-benchmarking-cli" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" +source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" dependencies = [ "frame-benchmarking", "parity-scale-codec", @@ -1215,7 +1215,7 @@ dependencies = [ [[package]] name = "frame-executive" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" +source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" dependencies = [ "frame-support", "frame-system", @@ -1230,7 +1230,7 @@ dependencies = [ [[package]] name = "frame-metadata" version = "11.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" +source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" dependencies = [ "parity-scale-codec", "serde", @@ -1241,7 +1241,7 @@ dependencies = [ [[package]] name = "frame-support" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" +source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" dependencies = [ "bitmask", "frame-metadata", @@ -1266,7 +1266,7 @@ dependencies = [ [[package]] name = "frame-support-procedural" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" +source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" dependencies = [ "frame-support-procedural-tools", "proc-macro2 1.0.18", @@ -1277,7 +1277,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" +source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" dependencies = [ "frame-support-procedural-tools-derive", "proc-macro-crate", @@ -1289,7 +1289,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools-derive" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" +source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" dependencies = [ "proc-macro2 1.0.18", "quote 1.0.7", @@ -1299,7 +1299,7 @@ dependencies = [ [[package]] name = "frame-system" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" +source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" dependencies = [ "frame-support", "impl-trait-for-tuples", @@ -1315,7 +1315,7 @@ dependencies = [ [[package]] name = "frame-system-benchmarking" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" +source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" dependencies = [ "frame-benchmarking", "frame-support", @@ -1329,7 +1329,7 @@ dependencies = [ [[package]] name = "frame-system-rpc-runtime-api" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" +source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" dependencies = [ "parity-scale-codec", "sp-api", @@ -3266,7 +3266,7 @@ dependencies = [ [[package]] name = "pallet-authority-discovery" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" +source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" dependencies = [ "frame-support", "frame-system", @@ -3282,7 +3282,7 @@ dependencies = [ [[package]] name = "pallet-authorship" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" +source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" dependencies = [ "frame-support", "frame-system", @@ -3297,7 +3297,7 @@ dependencies = [ [[package]] name = "pallet-babe" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" +source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" dependencies = [ "frame-support", "frame-system", @@ -3319,7 +3319,7 @@ dependencies = [ [[package]] name = "pallet-balances" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" +source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" dependencies = [ "frame-benchmarking", "frame-support", @@ -3333,7 +3333,7 @@ dependencies = [ [[package]] name = "pallet-collective" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" +source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" dependencies = [ "frame-benchmarking", "frame-support", @@ -3349,7 +3349,7 @@ dependencies = [ [[package]] name = "pallet-democracy" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" +source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" dependencies = [ "frame-benchmarking", "frame-support", @@ -3364,7 +3364,7 @@ dependencies = [ [[package]] name = "pallet-elections-phragmen" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" +source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" dependencies = [ "frame-benchmarking", "frame-support", @@ -3379,7 +3379,7 @@ dependencies = [ [[package]] name = "pallet-finality-tracker" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" +source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" dependencies = [ "frame-support", "frame-system", @@ -3395,7 +3395,7 @@ dependencies = [ [[package]] name = "pallet-grandpa" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" +source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" dependencies = [ "frame-support", "frame-system", @@ -3415,7 +3415,7 @@ dependencies = [ [[package]] name = "pallet-identity" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" +source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" dependencies = [ "enumflags2", "frame-benchmarking", @@ -3431,7 +3431,7 @@ dependencies = [ [[package]] name = "pallet-im-online" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" +source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" dependencies = [ "frame-benchmarking", "frame-support", @@ -3451,7 +3451,7 @@ dependencies = [ [[package]] name = "pallet-indices" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" +source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" dependencies = [ "frame-support", "frame-system", @@ -3467,7 +3467,7 @@ dependencies = [ [[package]] name = "pallet-membership" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" +source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" dependencies = [ "frame-support", "frame-system", @@ -3481,7 +3481,7 @@ dependencies = [ [[package]] name = "pallet-multisig" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" +source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" dependencies = [ "frame-support", "frame-system", @@ -3496,7 +3496,7 @@ dependencies = [ [[package]] name = "pallet-nicks" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" +source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" dependencies = [ "frame-support", "frame-system", @@ -3510,7 +3510,7 @@ dependencies = [ [[package]] name = "pallet-offences" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" +source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" dependencies = [ "frame-support", "frame-system", @@ -3525,7 +3525,7 @@ dependencies = [ [[package]] name = "pallet-offences-benchmarking" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" +source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" dependencies = [ "frame-benchmarking", "frame-support", @@ -3546,7 +3546,7 @@ dependencies = [ [[package]] name = "pallet-proxy" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" +source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" dependencies = [ "frame-support", "frame-system", @@ -3561,7 +3561,7 @@ dependencies = [ [[package]] name = "pallet-randomness-collective-flip" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" +source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" dependencies = [ "frame-support", "frame-system", @@ -3574,7 +3574,7 @@ dependencies = [ [[package]] name = "pallet-recovery" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" +source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" dependencies = [ "enumflags2", "frame-support", @@ -3589,7 +3589,7 @@ dependencies = [ [[package]] name = "pallet-scheduler" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" +source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" dependencies = [ "frame-benchmarking", "frame-support", @@ -3604,7 +3604,7 @@ dependencies = [ [[package]] name = "pallet-session" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" +source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" dependencies = [ "frame-support", "frame-system", @@ -3624,7 +3624,7 @@ dependencies = [ [[package]] name = "pallet-session-benchmarking" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" +source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" dependencies = [ "frame-benchmarking", "frame-support", @@ -3638,7 +3638,7 @@ dependencies = [ [[package]] name = "pallet-society" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" +source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" dependencies = [ "frame-support", "frame-system", @@ -3652,7 +3652,7 @@ dependencies = [ [[package]] name = "pallet-staking" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" +source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" dependencies = [ "frame-benchmarking", "frame-support", @@ -3674,7 +3674,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-curve" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" +source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -3685,7 +3685,7 @@ dependencies = [ [[package]] name = "pallet-sudo" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" +source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" dependencies = [ "frame-support", "frame-system", @@ -3699,7 +3699,7 @@ dependencies = [ [[package]] name = "pallet-timestamp" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" +source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" dependencies = [ "frame-benchmarking", "frame-support", @@ -3717,7 +3717,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" +source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" dependencies = [ "frame-support", "frame-system", @@ -3732,7 +3732,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" +source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" dependencies = [ "jsonrpc-core", "jsonrpc-core-client", @@ -3750,7 +3750,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc-runtime-api" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" +source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" dependencies = [ "frame-support", "parity-scale-codec", @@ -3763,7 +3763,7 @@ dependencies = [ [[package]] name = "pallet-treasury" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" +source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" dependencies = [ "frame-benchmarking", "frame-support", @@ -3778,7 +3778,7 @@ dependencies = [ [[package]] name = "pallet-utility" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" +source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" dependencies = [ "frame-benchmarking", "frame-support", @@ -3794,7 +3794,7 @@ dependencies = [ [[package]] name = "pallet-vesting" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" +source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" dependencies = [ "enumflags2", "frame-benchmarking", @@ -5531,7 +5531,7 @@ dependencies = [ [[package]] name = "sc-authority-discovery" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" +source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" dependencies = [ "bytes 0.5.4", "derive_more 0.99.8", @@ -5558,7 +5558,7 @@ dependencies = [ [[package]] name = "sc-basic-authorship" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" +source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -5582,7 +5582,7 @@ dependencies = [ [[package]] name = "sc-block-builder" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" +source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" dependencies = [ "parity-scale-codec", "sc-client-api", @@ -5598,7 +5598,7 @@ dependencies = [ [[package]] name = "sc-chain-spec" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" +source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" dependencies = [ "impl-trait-for-tuples", "sc-chain-spec-derive", @@ -5614,7 +5614,7 @@ dependencies = [ [[package]] name = "sc-chain-spec-derive" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" +source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -5625,7 +5625,7 @@ dependencies = [ [[package]] name = "sc-cli" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" +source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" dependencies = [ "ansi_term 0.12.1", "atty", @@ -5665,7 +5665,7 @@ dependencies = [ [[package]] name = "sc-client-api" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" +source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" dependencies = [ "derive_more 0.99.8", "fnv", @@ -5701,7 +5701,7 @@ dependencies = [ [[package]] name = "sc-client-db" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" +source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" dependencies = [ "blake2-rfc", "hash-db", @@ -5730,7 +5730,7 @@ dependencies = [ [[package]] name = "sc-consensus" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" +source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" dependencies = [ "sc-client-api", "sp-blockchain", @@ -5741,7 +5741,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" +source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" dependencies = [ "derive_more 0.99.8", "fork-tree", @@ -5783,7 +5783,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe-rpc" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" +source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" dependencies = [ "derive_more 0.99.8", "futures 0.3.5", @@ -5807,7 +5807,7 @@ dependencies = [ [[package]] name = "sc-consensus-epochs" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" +source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" dependencies = [ "fork-tree", "parity-scale-codec", @@ -5820,7 +5820,7 @@ dependencies = [ [[package]] name = "sc-consensus-slots" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" +source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -5842,7 +5842,7 @@ dependencies = [ [[package]] name = "sc-consensus-uncles" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" +source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" dependencies = [ "log 0.4.8", "sc-client-api", @@ -5856,7 +5856,7 @@ dependencies = [ [[package]] name = "sc-executor" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" +source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" dependencies = [ "derive_more 0.99.8", "lazy_static", @@ -5884,7 +5884,7 @@ dependencies = [ [[package]] name = "sc-executor-common" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" +source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" dependencies = [ "derive_more 0.99.8", "log 0.4.8", @@ -5901,7 +5901,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmi" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" +source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" dependencies = [ "log 0.4.8", "parity-scale-codec", @@ -5916,7 +5916,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmtime" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" +source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" dependencies = [ "cranelift-codegen", "cranelift-wasm", @@ -5937,7 +5937,7 @@ dependencies = [ [[package]] name = "sc-finality-grandpa" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" +source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" dependencies = [ "assert_matches", "derive_more 0.99.8", @@ -5975,7 +5975,7 @@ dependencies = [ [[package]] name = "sc-finality-grandpa-rpc" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" +source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" dependencies = [ "derive_more 0.99.8", "finality-grandpa", @@ -5992,7 +5992,7 @@ dependencies = [ [[package]] name = "sc-informant" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" +source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" dependencies = [ "ansi_term 0.12.1", "futures 0.3.5", @@ -6011,7 +6011,7 @@ dependencies = [ [[package]] name = "sc-keystore" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" +source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" dependencies = [ "derive_more 0.99.8", "hex", @@ -6027,7 +6027,7 @@ dependencies = [ [[package]] name = "sc-light" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" +source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" dependencies = [ "hash-db", "lazy_static", @@ -6046,7 +6046,7 @@ dependencies = [ [[package]] name = "sc-network" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" +source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" dependencies = [ "bitflags", "bs58", @@ -6098,7 +6098,7 @@ dependencies = [ [[package]] name = "sc-network-gossip" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" +source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6113,7 +6113,7 @@ dependencies = [ [[package]] name = "sc-network-test" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" +source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" dependencies = [ "env_logger", "futures 0.3.5", @@ -6140,7 +6140,7 @@ dependencies = [ [[package]] name = "sc-offchain" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" +source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" dependencies = [ "bytes 0.5.4", "fnv", @@ -6167,7 +6167,7 @@ dependencies = [ [[package]] name = "sc-peerset" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" +source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" dependencies = [ "futures 0.3.5", "libp2p", @@ -6180,7 +6180,7 @@ dependencies = [ [[package]] name = "sc-proposer-metrics" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" +source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" dependencies = [ "log 0.4.8", "substrate-prometheus-endpoint", @@ -6189,7 +6189,7 @@ dependencies = [ [[package]] name = "sc-rpc" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" +source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" dependencies = [ "futures 0.3.5", "hash-db", @@ -6221,7 +6221,7 @@ dependencies = [ [[package]] name = "sc-rpc-api" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" +source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" dependencies = [ "derive_more 0.99.8", "futures 0.3.5", @@ -6245,7 +6245,7 @@ dependencies = [ [[package]] name = "sc-rpc-server" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" +source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" dependencies = [ "jsonrpc-core", "jsonrpc-http-server", @@ -6261,7 +6261,7 @@ dependencies = [ [[package]] name = "sc-service" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" +source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" dependencies = [ "derive_more 0.99.8", "directories", @@ -6324,7 +6324,7 @@ dependencies = [ [[package]] name = "sc-state-db" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" +source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" dependencies = [ "log 0.4.8", "parity-scale-codec", @@ -6338,7 +6338,7 @@ dependencies = [ [[package]] name = "sc-telemetry" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" +source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" dependencies = [ "bytes 0.5.4", "futures 0.3.5", @@ -6360,7 +6360,7 @@ dependencies = [ [[package]] name = "sc-tracing" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" +source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" dependencies = [ "erased-serde", "log 0.4.8", @@ -6377,7 +6377,7 @@ dependencies = [ [[package]] name = "sc-transaction-graph" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" +source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" dependencies = [ "derive_more 0.99.8", "futures 0.3.5", @@ -6397,7 +6397,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" +source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" dependencies = [ "derive_more 0.99.8", "futures 0.3.5", @@ -6784,7 +6784,7 @@ dependencies = [ [[package]] name = "sp-allocator" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" +source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" dependencies = [ "derive_more 0.99.8", "log 0.4.8", @@ -6796,7 +6796,7 @@ dependencies = [ [[package]] name = "sp-api" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" +source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" dependencies = [ "hash-db", "parity-scale-codec", @@ -6811,7 +6811,7 @@ dependencies = [ [[package]] name = "sp-api-proc-macro" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" +source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" dependencies = [ "blake2-rfc", "proc-macro-crate", @@ -6823,7 +6823,7 @@ dependencies = [ [[package]] name = "sp-application-crypto" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" +source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" dependencies = [ "parity-scale-codec", "serde", @@ -6835,7 +6835,7 @@ dependencies = [ [[package]] name = "sp-arithmetic" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" +source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" dependencies = [ "integer-sqrt", "num-traits 0.2.12", @@ -6848,7 +6848,7 @@ dependencies = [ [[package]] name = "sp-authority-discovery" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" +source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" dependencies = [ "parity-scale-codec", "sp-api", @@ -6860,7 +6860,7 @@ dependencies = [ [[package]] name = "sp-authorship" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" +source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" dependencies = [ "parity-scale-codec", "sp-inherents", @@ -6871,7 +6871,7 @@ dependencies = [ [[package]] name = "sp-block-builder" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" +source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" dependencies = [ "parity-scale-codec", "sp-api", @@ -6883,7 +6883,7 @@ dependencies = [ [[package]] name = "sp-blockchain" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" +source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" dependencies = [ "derive_more 0.99.8", "log 0.4.8", @@ -6899,7 +6899,7 @@ dependencies = [ [[package]] name = "sp-chain-spec" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" +source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" dependencies = [ "serde", "serde_json", @@ -6908,7 +6908,7 @@ dependencies = [ [[package]] name = "sp-consensus" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" +source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" dependencies = [ "derive_more 0.99.8", "futures 0.3.5", @@ -6926,12 +6926,13 @@ dependencies = [ "sp-utils", "sp-version", "substrate-prometheus-endpoint", + "wasm-timer", ] [[package]] name = "sp-consensus-aura" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" +source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" dependencies = [ "parity-scale-codec", "sp-api", @@ -6945,7 +6946,7 @@ dependencies = [ [[package]] name = "sp-consensus-babe" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" +source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" dependencies = [ "merlin", "parity-scale-codec", @@ -6963,7 +6964,7 @@ dependencies = [ [[package]] name = "sp-consensus-vrf" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" +source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" dependencies = [ "parity-scale-codec", "schnorrkel", @@ -6975,7 +6976,7 @@ dependencies = [ [[package]] name = "sp-core" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" +source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" dependencies = [ "base58", "blake2-rfc", @@ -7017,7 +7018,7 @@ dependencies = [ [[package]] name = "sp-database" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" +source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" dependencies = [ "kvdb", "parking_lot 0.10.2", @@ -7026,7 +7027,7 @@ dependencies = [ [[package]] name = "sp-debug-derive" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" +source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" dependencies = [ "proc-macro2 1.0.18", "quote 1.0.7", @@ -7036,7 +7037,7 @@ dependencies = [ [[package]] name = "sp-externalities" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" +source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" dependencies = [ "environmental", "parity-scale-codec", @@ -7047,7 +7048,7 @@ dependencies = [ [[package]] name = "sp-finality-grandpa" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" +source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" dependencies = [ "finality-grandpa", "log 0.4.8", @@ -7063,7 +7064,7 @@ dependencies = [ [[package]] name = "sp-finality-tracker" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" +source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" dependencies = [ "parity-scale-codec", "sp-inherents", @@ -7073,7 +7074,7 @@ dependencies = [ [[package]] name = "sp-inherents" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" +source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" dependencies = [ "derive_more 0.99.8", "parity-scale-codec", @@ -7085,7 +7086,7 @@ dependencies = [ [[package]] name = "sp-io" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" +source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" dependencies = [ "futures 0.3.5", "hash-db", @@ -7106,7 +7107,7 @@ dependencies = [ [[package]] name = "sp-keyring" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" +source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" dependencies = [ "lazy_static", "sp-core", @@ -7117,7 +7118,7 @@ dependencies = [ [[package]] name = "sp-npos-elections" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" +source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" dependencies = [ "parity-scale-codec", "serde", @@ -7129,7 +7130,7 @@ dependencies = [ [[package]] name = "sp-npos-elections-compact" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" +source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -7140,7 +7141,7 @@ dependencies = [ [[package]] name = "sp-offchain" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" +source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" dependencies = [ "sp-api", "sp-core", @@ -7150,7 +7151,7 @@ dependencies = [ [[package]] name = "sp-panic-handler" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" +source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" dependencies = [ "backtrace", "log 0.4.8", @@ -7159,7 +7160,7 @@ dependencies = [ [[package]] name = "sp-rpc" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" +source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" dependencies = [ "serde", "sp-core", @@ -7168,7 +7169,7 @@ dependencies = [ [[package]] name = "sp-runtime" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" +source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" dependencies = [ "either", "hash256-std-hasher", @@ -7190,7 +7191,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" +source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" dependencies = [ "parity-scale-codec", "primitive-types", @@ -7205,7 +7206,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" +source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" dependencies = [ "Inflector", "proc-macro-crate", @@ -7217,7 +7218,7 @@ dependencies = [ [[package]] name = "sp-serializer" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" +source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" dependencies = [ "serde", "serde_json", @@ -7226,7 +7227,7 @@ dependencies = [ [[package]] name = "sp-session" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" +source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" dependencies = [ "parity-scale-codec", "sp-api", @@ -7239,7 +7240,7 @@ dependencies = [ [[package]] name = "sp-staking" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" +source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" dependencies = [ "parity-scale-codec", "sp-runtime", @@ -7249,7 +7250,7 @@ dependencies = [ [[package]] name = "sp-state-machine" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" +source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" dependencies = [ "hash-db", "itertools 0.9.0", @@ -7270,12 +7271,12 @@ dependencies = [ [[package]] name = "sp-std" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" +source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" [[package]] name = "sp-storage" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" +source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" dependencies = [ "impl-serde 0.2.3", "ref-cast", @@ -7287,7 +7288,7 @@ dependencies = [ [[package]] name = "sp-timestamp" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" +source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -7301,7 +7302,7 @@ dependencies = [ [[package]] name = "sp-tracing" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" +source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" dependencies = [ "log 0.4.8", "rental", @@ -7311,7 +7312,7 @@ dependencies = [ [[package]] name = "sp-transaction-pool" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" +source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" dependencies = [ "derive_more 0.99.8", "futures 0.3.5", @@ -7327,7 +7328,7 @@ dependencies = [ [[package]] name = "sp-trie" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" +source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" dependencies = [ "hash-db", "memory-db", @@ -7341,7 +7342,7 @@ dependencies = [ [[package]] name = "sp-utils" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" +source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" dependencies = [ "futures 0.3.5", "futures-core", @@ -7353,7 +7354,7 @@ dependencies = [ [[package]] name = "sp-version" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" +source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" dependencies = [ "impl-serde 0.2.3", "parity-scale-codec", @@ -7365,7 +7366,7 @@ dependencies = [ [[package]] name = "sp-wasm-interface" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" +source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -7496,7 +7497,7 @@ dependencies = [ [[package]] name = "substrate-browser-utils" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" +source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" dependencies = [ "chrono", "clear_on_drop", @@ -7523,7 +7524,7 @@ dependencies = [ [[package]] name = "substrate-build-script-utils" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" +source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" dependencies = [ "platforms", ] @@ -7531,7 +7532,7 @@ dependencies = [ [[package]] name = "substrate-frame-rpc-system" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" +source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" dependencies = [ "frame-system-rpc-runtime-api", "futures 0.3.5", @@ -7554,7 +7555,7 @@ dependencies = [ [[package]] name = "substrate-prometheus-endpoint" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" +source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" dependencies = [ "async-std", "derive_more 0.99.8", @@ -7568,7 +7569,7 @@ dependencies = [ [[package]] name = "substrate-test-client" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" +source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" dependencies = [ "futures 0.3.5", "hash-db", @@ -7590,7 +7591,7 @@ dependencies = [ [[package]] name = "substrate-test-runtime" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" +source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" dependencies = [ "cfg-if", "frame-executive", @@ -7630,7 +7631,7 @@ dependencies = [ [[package]] name = "substrate-test-runtime-client" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" +source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" dependencies = [ "futures 0.3.5", "parity-scale-codec", @@ -7651,7 +7652,7 @@ dependencies = [ [[package]] name = "substrate-wasm-builder-runner" version = "1.0.6" -source = "git+https://github.com/paritytech/substrate#c771821cae2dcb5a8808a19fae8122c0b9ae8499" +source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" [[package]] name = "substrate-wasm-builder-runner" diff --git a/runtime/kusama/src/lib.rs b/runtime/kusama/src/lib.rs index 3b81392994..a1f1367fcd 100644 --- a/runtime/kusama/src/lib.rs +++ b/runtime/kusama/src/lib.rs @@ -610,7 +610,7 @@ impl system::offchain::CreateSignedTransaction for Runtime system::CheckSpecVersion::::new(), system::CheckTxVersion::::new(), system::CheckGenesis::::new(), - system::CheckEra::::from(generic::Era::mortal(period, current_block)), + system::CheckMortality::::from(generic::Era::mortal(period, current_block)), system::CheckNonce::::from(nonce), system::CheckWeight::::new(), transaction_payment::ChargeTransactionPayment::::from(tip), @@ -971,7 +971,7 @@ pub type SignedExtra = ( system::CheckSpecVersion, system::CheckTxVersion, system::CheckGenesis, - system::CheckEra, + system::CheckMortality, system::CheckNonce, system::CheckWeight, transaction_payment::ChargeTransactionPayment, diff --git a/runtime/polkadot/src/lib.rs b/runtime/polkadot/src/lib.rs index a88373f3fe..2079a3c8ba 100644 --- a/runtime/polkadot/src/lib.rs +++ b/runtime/polkadot/src/lib.rs @@ -657,7 +657,7 @@ impl system::offchain::CreateSignedTransaction for Runtime system::CheckSpecVersion::::new(), system::CheckTxVersion::::new(), system::CheckGenesis::::new(), - system::CheckEra::::from(generic::Era::mortal(period, current_block)), + system::CheckMortality::::from(generic::Era::mortal(period, current_block)), system::CheckNonce::::from(nonce), system::CheckWeight::::new(), transaction_payment::ChargeTransactionPayment::::from(tip), @@ -948,7 +948,7 @@ pub type SignedExtra = ( system::CheckSpecVersion, system::CheckTxVersion, system::CheckGenesis, - system::CheckEra, + system::CheckMortality, system::CheckNonce, system::CheckWeight, transaction_payment::ChargeTransactionPayment, diff --git a/runtime/test-runtime/src/lib.rs b/runtime/test-runtime/src/lib.rs index 51b6b4bbde..8b79ff22d6 100644 --- a/runtime/test-runtime/src/lib.rs +++ b/runtime/test-runtime/src/lib.rs @@ -401,7 +401,7 @@ impl system::offchain::CreateSignedTransaction for Runtime system::CheckSpecVersion::::new(), system::CheckTxVersion::::new(), system::CheckGenesis::::new(), - system::CheckEra::::from(generic::Era::mortal(period, current_block)), + system::CheckMortality::::from(generic::Era::mortal(period, current_block)), system::CheckNonce::::from(nonce), system::CheckWeight::::new(), transaction_payment::ChargeTransactionPayment::::from(tip), @@ -545,7 +545,7 @@ pub type SignedExtra = ( system::CheckSpecVersion, system::CheckTxVersion, system::CheckGenesis, - system::CheckEra, + system::CheckMortality, system::CheckNonce, system::CheckWeight, transaction_payment::ChargeTransactionPayment::, diff --git a/runtime/westend/src/lib.rs b/runtime/westend/src/lib.rs index 8b02d369b6..334a041baa 100644 --- a/runtime/westend/src/lib.rs +++ b/runtime/westend/src/lib.rs @@ -440,7 +440,7 @@ impl system::offchain::CreateSignedTransaction for Runtime system::CheckSpecVersion::::new(), system::CheckTxVersion::::new(), system::CheckGenesis::::new(), - system::CheckEra::::from(generic::Era::mortal(period, current_block)), + system::CheckMortality::::from(generic::Era::mortal(period, current_block)), system::CheckNonce::::from(nonce), system::CheckWeight::::new(), transaction_payment::ChargeTransactionPayment::::from(tip), @@ -732,7 +732,7 @@ pub type SignedExtra = ( system::CheckSpecVersion, system::CheckTxVersion, system::CheckGenesis, - system::CheckEra, + system::CheckMortality, system::CheckNonce, system::CheckWeight, transaction_payment::ChargeTransactionPayment, -- GitLab From 03067290b4b31a04d671a18bb8a78da59a28208b Mon Sep 17 00:00:00 2001 From: Shawn Tabrizi Date: Thu, 25 Jun 2020 10:04:34 +0200 Subject: [PATCH 014/192] Companion PR for #6386 (Read/Write Tracking) (#1284) * add new apis to externalities * Update mod.rs * update for new host function * Rename unused * cargo update -p sp-io * Add whitelists * Apply changes to polkadot runtime as well Co-authored-by: kianenigma --- Cargo.lock | 272 ++++++++++++++--------------- parachain/src/wasm_executor/mod.rs | 12 ++ runtime/kusama/Cargo.toml | 2 + runtime/kusama/src/lib.rs | 20 ++- runtime/polkadot/Cargo.toml | 2 + runtime/polkadot/src/lib.rs | 20 ++- runtime/westend/Cargo.toml | 2 + runtime/westend/src/lib.rs | 20 ++- 8 files changed, 211 insertions(+), 139 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 76a1a543d2..27217d39da 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1172,7 +1172,7 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "fork-tree" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" +source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" dependencies = [ "parity-scale-codec", ] @@ -1180,7 +1180,7 @@ dependencies = [ [[package]] name = "frame-benchmarking" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" +source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" dependencies = [ "frame-support", "frame-system", @@ -1197,7 +1197,7 @@ dependencies = [ [[package]] name = "frame-benchmarking-cli" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" +source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" dependencies = [ "frame-benchmarking", "parity-scale-codec", @@ -1215,7 +1215,7 @@ dependencies = [ [[package]] name = "frame-executive" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" +source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" dependencies = [ "frame-support", "frame-system", @@ -1230,7 +1230,7 @@ dependencies = [ [[package]] name = "frame-metadata" version = "11.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" +source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" dependencies = [ "parity-scale-codec", "serde", @@ -1241,7 +1241,7 @@ dependencies = [ [[package]] name = "frame-support" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" +source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" dependencies = [ "bitmask", "frame-metadata", @@ -1266,7 +1266,7 @@ dependencies = [ [[package]] name = "frame-support-procedural" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" +source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" dependencies = [ "frame-support-procedural-tools", "proc-macro2 1.0.18", @@ -1277,7 +1277,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" +source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" dependencies = [ "frame-support-procedural-tools-derive", "proc-macro-crate", @@ -1289,7 +1289,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools-derive" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" +source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" dependencies = [ "proc-macro2 1.0.18", "quote 1.0.7", @@ -1299,7 +1299,7 @@ dependencies = [ [[package]] name = "frame-system" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" +source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" dependencies = [ "frame-support", "impl-trait-for-tuples", @@ -1315,7 +1315,7 @@ dependencies = [ [[package]] name = "frame-system-benchmarking" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" +source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" dependencies = [ "frame-benchmarking", "frame-support", @@ -1329,7 +1329,7 @@ dependencies = [ [[package]] name = "frame-system-rpc-runtime-api" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" +source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" dependencies = [ "parity-scale-codec", "sp-api", @@ -3266,7 +3266,7 @@ dependencies = [ [[package]] name = "pallet-authority-discovery" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" +source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" dependencies = [ "frame-support", "frame-system", @@ -3282,7 +3282,7 @@ dependencies = [ [[package]] name = "pallet-authorship" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" +source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" dependencies = [ "frame-support", "frame-system", @@ -3297,7 +3297,7 @@ dependencies = [ [[package]] name = "pallet-babe" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" +source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" dependencies = [ "frame-support", "frame-system", @@ -3319,7 +3319,7 @@ dependencies = [ [[package]] name = "pallet-balances" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" +source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" dependencies = [ "frame-benchmarking", "frame-support", @@ -3333,7 +3333,7 @@ dependencies = [ [[package]] name = "pallet-collective" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" +source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" dependencies = [ "frame-benchmarking", "frame-support", @@ -3349,7 +3349,7 @@ dependencies = [ [[package]] name = "pallet-democracy" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" +source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" dependencies = [ "frame-benchmarking", "frame-support", @@ -3364,7 +3364,7 @@ dependencies = [ [[package]] name = "pallet-elections-phragmen" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" +source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" dependencies = [ "frame-benchmarking", "frame-support", @@ -3379,7 +3379,7 @@ dependencies = [ [[package]] name = "pallet-finality-tracker" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" +source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" dependencies = [ "frame-support", "frame-system", @@ -3395,7 +3395,7 @@ dependencies = [ [[package]] name = "pallet-grandpa" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" +source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" dependencies = [ "frame-support", "frame-system", @@ -3415,7 +3415,7 @@ dependencies = [ [[package]] name = "pallet-identity" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" +source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" dependencies = [ "enumflags2", "frame-benchmarking", @@ -3431,7 +3431,7 @@ dependencies = [ [[package]] name = "pallet-im-online" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" +source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" dependencies = [ "frame-benchmarking", "frame-support", @@ -3451,7 +3451,7 @@ dependencies = [ [[package]] name = "pallet-indices" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" +source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" dependencies = [ "frame-support", "frame-system", @@ -3467,7 +3467,7 @@ dependencies = [ [[package]] name = "pallet-membership" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" +source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" dependencies = [ "frame-support", "frame-system", @@ -3481,7 +3481,7 @@ dependencies = [ [[package]] name = "pallet-multisig" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" +source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" dependencies = [ "frame-support", "frame-system", @@ -3496,7 +3496,7 @@ dependencies = [ [[package]] name = "pallet-nicks" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" +source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" dependencies = [ "frame-support", "frame-system", @@ -3510,7 +3510,7 @@ dependencies = [ [[package]] name = "pallet-offences" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" +source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" dependencies = [ "frame-support", "frame-system", @@ -3525,7 +3525,7 @@ dependencies = [ [[package]] name = "pallet-offences-benchmarking" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" +source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" dependencies = [ "frame-benchmarking", "frame-support", @@ -3546,7 +3546,7 @@ dependencies = [ [[package]] name = "pallet-proxy" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" +source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" dependencies = [ "frame-support", "frame-system", @@ -3561,7 +3561,7 @@ dependencies = [ [[package]] name = "pallet-randomness-collective-flip" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" +source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" dependencies = [ "frame-support", "frame-system", @@ -3574,7 +3574,7 @@ dependencies = [ [[package]] name = "pallet-recovery" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" +source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" dependencies = [ "enumflags2", "frame-support", @@ -3589,7 +3589,7 @@ dependencies = [ [[package]] name = "pallet-scheduler" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" +source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" dependencies = [ "frame-benchmarking", "frame-support", @@ -3604,7 +3604,7 @@ dependencies = [ [[package]] name = "pallet-session" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" +source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" dependencies = [ "frame-support", "frame-system", @@ -3624,7 +3624,7 @@ dependencies = [ [[package]] name = "pallet-session-benchmarking" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" +source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" dependencies = [ "frame-benchmarking", "frame-support", @@ -3638,7 +3638,7 @@ dependencies = [ [[package]] name = "pallet-society" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" +source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" dependencies = [ "frame-support", "frame-system", @@ -3652,7 +3652,7 @@ dependencies = [ [[package]] name = "pallet-staking" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" +source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" dependencies = [ "frame-benchmarking", "frame-support", @@ -3674,7 +3674,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-curve" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" +source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -3685,7 +3685,7 @@ dependencies = [ [[package]] name = "pallet-sudo" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" +source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" dependencies = [ "frame-support", "frame-system", @@ -3699,7 +3699,7 @@ dependencies = [ [[package]] name = "pallet-timestamp" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" +source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" dependencies = [ "frame-benchmarking", "frame-support", @@ -3717,7 +3717,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" +source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" dependencies = [ "frame-support", "frame-system", @@ -3732,7 +3732,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" +source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" dependencies = [ "jsonrpc-core", "jsonrpc-core-client", @@ -3750,7 +3750,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc-runtime-api" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" +source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" dependencies = [ "frame-support", "parity-scale-codec", @@ -3763,7 +3763,7 @@ dependencies = [ [[package]] name = "pallet-treasury" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" +source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" dependencies = [ "frame-benchmarking", "frame-support", @@ -3778,7 +3778,7 @@ dependencies = [ [[package]] name = "pallet-utility" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" +source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" dependencies = [ "frame-benchmarking", "frame-support", @@ -3794,7 +3794,7 @@ dependencies = [ [[package]] name = "pallet-vesting" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" +source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" dependencies = [ "enumflags2", "frame-benchmarking", @@ -5531,7 +5531,7 @@ dependencies = [ [[package]] name = "sc-authority-discovery" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" +source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" dependencies = [ "bytes 0.5.4", "derive_more 0.99.8", @@ -5558,7 +5558,7 @@ dependencies = [ [[package]] name = "sc-basic-authorship" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" +source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -5582,7 +5582,7 @@ dependencies = [ [[package]] name = "sc-block-builder" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" +source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" dependencies = [ "parity-scale-codec", "sc-client-api", @@ -5598,7 +5598,7 @@ dependencies = [ [[package]] name = "sc-chain-spec" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" +source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" dependencies = [ "impl-trait-for-tuples", "sc-chain-spec-derive", @@ -5614,7 +5614,7 @@ dependencies = [ [[package]] name = "sc-chain-spec-derive" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" +source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -5625,7 +5625,7 @@ dependencies = [ [[package]] name = "sc-cli" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" +source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" dependencies = [ "ansi_term 0.12.1", "atty", @@ -5665,7 +5665,7 @@ dependencies = [ [[package]] name = "sc-client-api" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" +source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" dependencies = [ "derive_more 0.99.8", "fnv", @@ -5701,7 +5701,7 @@ dependencies = [ [[package]] name = "sc-client-db" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" +source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" dependencies = [ "blake2-rfc", "hash-db", @@ -5730,7 +5730,7 @@ dependencies = [ [[package]] name = "sc-consensus" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" +source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" dependencies = [ "sc-client-api", "sp-blockchain", @@ -5741,7 +5741,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" +source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" dependencies = [ "derive_more 0.99.8", "fork-tree", @@ -5783,7 +5783,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe-rpc" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" +source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" dependencies = [ "derive_more 0.99.8", "futures 0.3.5", @@ -5807,7 +5807,7 @@ dependencies = [ [[package]] name = "sc-consensus-epochs" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" +source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" dependencies = [ "fork-tree", "parity-scale-codec", @@ -5820,7 +5820,7 @@ dependencies = [ [[package]] name = "sc-consensus-slots" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" +source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -5842,7 +5842,7 @@ dependencies = [ [[package]] name = "sc-consensus-uncles" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" +source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" dependencies = [ "log 0.4.8", "sc-client-api", @@ -5856,7 +5856,7 @@ dependencies = [ [[package]] name = "sc-executor" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" +source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" dependencies = [ "derive_more 0.99.8", "lazy_static", @@ -5884,7 +5884,7 @@ dependencies = [ [[package]] name = "sc-executor-common" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" +source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" dependencies = [ "derive_more 0.99.8", "log 0.4.8", @@ -5901,7 +5901,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmi" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" +source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" dependencies = [ "log 0.4.8", "parity-scale-codec", @@ -5916,7 +5916,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmtime" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" +source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" dependencies = [ "cranelift-codegen", "cranelift-wasm", @@ -5937,7 +5937,7 @@ dependencies = [ [[package]] name = "sc-finality-grandpa" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" +source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" dependencies = [ "assert_matches", "derive_more 0.99.8", @@ -5975,7 +5975,7 @@ dependencies = [ [[package]] name = "sc-finality-grandpa-rpc" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" +source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" dependencies = [ "derive_more 0.99.8", "finality-grandpa", @@ -5992,7 +5992,7 @@ dependencies = [ [[package]] name = "sc-informant" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" +source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" dependencies = [ "ansi_term 0.12.1", "futures 0.3.5", @@ -6011,7 +6011,7 @@ dependencies = [ [[package]] name = "sc-keystore" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" +source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" dependencies = [ "derive_more 0.99.8", "hex", @@ -6027,7 +6027,7 @@ dependencies = [ [[package]] name = "sc-light" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" +source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" dependencies = [ "hash-db", "lazy_static", @@ -6046,7 +6046,7 @@ dependencies = [ [[package]] name = "sc-network" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" +source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" dependencies = [ "bitflags", "bs58", @@ -6098,7 +6098,7 @@ dependencies = [ [[package]] name = "sc-network-gossip" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" +source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6113,7 +6113,7 @@ dependencies = [ [[package]] name = "sc-network-test" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" +source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" dependencies = [ "env_logger", "futures 0.3.5", @@ -6140,7 +6140,7 @@ dependencies = [ [[package]] name = "sc-offchain" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" +source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" dependencies = [ "bytes 0.5.4", "fnv", @@ -6167,7 +6167,7 @@ dependencies = [ [[package]] name = "sc-peerset" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" +source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" dependencies = [ "futures 0.3.5", "libp2p", @@ -6180,7 +6180,7 @@ dependencies = [ [[package]] name = "sc-proposer-metrics" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" +source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" dependencies = [ "log 0.4.8", "substrate-prometheus-endpoint", @@ -6189,7 +6189,7 @@ dependencies = [ [[package]] name = "sc-rpc" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" +source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" dependencies = [ "futures 0.3.5", "hash-db", @@ -6221,7 +6221,7 @@ dependencies = [ [[package]] name = "sc-rpc-api" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" +source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" dependencies = [ "derive_more 0.99.8", "futures 0.3.5", @@ -6245,7 +6245,7 @@ dependencies = [ [[package]] name = "sc-rpc-server" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" +source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" dependencies = [ "jsonrpc-core", "jsonrpc-http-server", @@ -6261,7 +6261,7 @@ dependencies = [ [[package]] name = "sc-service" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" +source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" dependencies = [ "derive_more 0.99.8", "directories", @@ -6324,7 +6324,7 @@ dependencies = [ [[package]] name = "sc-state-db" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" +source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" dependencies = [ "log 0.4.8", "parity-scale-codec", @@ -6338,7 +6338,7 @@ dependencies = [ [[package]] name = "sc-telemetry" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" +source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" dependencies = [ "bytes 0.5.4", "futures 0.3.5", @@ -6360,7 +6360,7 @@ dependencies = [ [[package]] name = "sc-tracing" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" +source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" dependencies = [ "erased-serde", "log 0.4.8", @@ -6377,7 +6377,7 @@ dependencies = [ [[package]] name = "sc-transaction-graph" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" +source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" dependencies = [ "derive_more 0.99.8", "futures 0.3.5", @@ -6397,7 +6397,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" +source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" dependencies = [ "derive_more 0.99.8", "futures 0.3.5", @@ -6784,7 +6784,7 @@ dependencies = [ [[package]] name = "sp-allocator" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" +source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" dependencies = [ "derive_more 0.99.8", "log 0.4.8", @@ -6796,7 +6796,7 @@ dependencies = [ [[package]] name = "sp-api" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" +source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" dependencies = [ "hash-db", "parity-scale-codec", @@ -6811,7 +6811,7 @@ dependencies = [ [[package]] name = "sp-api-proc-macro" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" +source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" dependencies = [ "blake2-rfc", "proc-macro-crate", @@ -6823,7 +6823,7 @@ dependencies = [ [[package]] name = "sp-application-crypto" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" +source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" dependencies = [ "parity-scale-codec", "serde", @@ -6835,7 +6835,7 @@ dependencies = [ [[package]] name = "sp-arithmetic" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" +source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" dependencies = [ "integer-sqrt", "num-traits 0.2.12", @@ -6848,7 +6848,7 @@ dependencies = [ [[package]] name = "sp-authority-discovery" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" +source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" dependencies = [ "parity-scale-codec", "sp-api", @@ -6860,7 +6860,7 @@ dependencies = [ [[package]] name = "sp-authorship" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" +source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" dependencies = [ "parity-scale-codec", "sp-inherents", @@ -6871,7 +6871,7 @@ dependencies = [ [[package]] name = "sp-block-builder" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" +source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" dependencies = [ "parity-scale-codec", "sp-api", @@ -6883,7 +6883,7 @@ dependencies = [ [[package]] name = "sp-blockchain" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" +source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" dependencies = [ "derive_more 0.99.8", "log 0.4.8", @@ -6899,7 +6899,7 @@ dependencies = [ [[package]] name = "sp-chain-spec" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" +source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" dependencies = [ "serde", "serde_json", @@ -6908,7 +6908,7 @@ dependencies = [ [[package]] name = "sp-consensus" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" +source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" dependencies = [ "derive_more 0.99.8", "futures 0.3.5", @@ -6932,7 +6932,7 @@ dependencies = [ [[package]] name = "sp-consensus-aura" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" +source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" dependencies = [ "parity-scale-codec", "sp-api", @@ -6946,7 +6946,7 @@ dependencies = [ [[package]] name = "sp-consensus-babe" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" +source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" dependencies = [ "merlin", "parity-scale-codec", @@ -6964,7 +6964,7 @@ dependencies = [ [[package]] name = "sp-consensus-vrf" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" +source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" dependencies = [ "parity-scale-codec", "schnorrkel", @@ -6976,7 +6976,7 @@ dependencies = [ [[package]] name = "sp-core" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" +source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" dependencies = [ "base58", "blake2-rfc", @@ -7018,7 +7018,7 @@ dependencies = [ [[package]] name = "sp-database" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" +source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" dependencies = [ "kvdb", "parking_lot 0.10.2", @@ -7027,7 +7027,7 @@ dependencies = [ [[package]] name = "sp-debug-derive" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" +source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" dependencies = [ "proc-macro2 1.0.18", "quote 1.0.7", @@ -7037,7 +7037,7 @@ dependencies = [ [[package]] name = "sp-externalities" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" +source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" dependencies = [ "environmental", "parity-scale-codec", @@ -7048,7 +7048,7 @@ dependencies = [ [[package]] name = "sp-finality-grandpa" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" +source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" dependencies = [ "finality-grandpa", "log 0.4.8", @@ -7064,7 +7064,7 @@ dependencies = [ [[package]] name = "sp-finality-tracker" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" +source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" dependencies = [ "parity-scale-codec", "sp-inherents", @@ -7074,7 +7074,7 @@ dependencies = [ [[package]] name = "sp-inherents" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" +source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" dependencies = [ "derive_more 0.99.8", "parity-scale-codec", @@ -7086,7 +7086,7 @@ dependencies = [ [[package]] name = "sp-io" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" +source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" dependencies = [ "futures 0.3.5", "hash-db", @@ -7107,7 +7107,7 @@ dependencies = [ [[package]] name = "sp-keyring" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" +source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" dependencies = [ "lazy_static", "sp-core", @@ -7118,7 +7118,7 @@ dependencies = [ [[package]] name = "sp-npos-elections" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" +source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" dependencies = [ "parity-scale-codec", "serde", @@ -7130,7 +7130,7 @@ dependencies = [ [[package]] name = "sp-npos-elections-compact" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" +source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -7141,7 +7141,7 @@ dependencies = [ [[package]] name = "sp-offchain" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" +source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" dependencies = [ "sp-api", "sp-core", @@ -7151,7 +7151,7 @@ dependencies = [ [[package]] name = "sp-panic-handler" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" +source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" dependencies = [ "backtrace", "log 0.4.8", @@ -7160,7 +7160,7 @@ dependencies = [ [[package]] name = "sp-rpc" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" +source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" dependencies = [ "serde", "sp-core", @@ -7169,7 +7169,7 @@ dependencies = [ [[package]] name = "sp-runtime" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" +source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" dependencies = [ "either", "hash256-std-hasher", @@ -7191,7 +7191,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" +source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" dependencies = [ "parity-scale-codec", "primitive-types", @@ -7206,7 +7206,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" +source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" dependencies = [ "Inflector", "proc-macro-crate", @@ -7218,7 +7218,7 @@ dependencies = [ [[package]] name = "sp-serializer" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" +source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" dependencies = [ "serde", "serde_json", @@ -7227,7 +7227,7 @@ dependencies = [ [[package]] name = "sp-session" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" +source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" dependencies = [ "parity-scale-codec", "sp-api", @@ -7240,7 +7240,7 @@ dependencies = [ [[package]] name = "sp-staking" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" +source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" dependencies = [ "parity-scale-codec", "sp-runtime", @@ -7250,7 +7250,7 @@ dependencies = [ [[package]] name = "sp-state-machine" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" +source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" dependencies = [ "hash-db", "itertools 0.9.0", @@ -7271,12 +7271,12 @@ dependencies = [ [[package]] name = "sp-std" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" +source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" [[package]] name = "sp-storage" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" +source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" dependencies = [ "impl-serde 0.2.3", "ref-cast", @@ -7288,7 +7288,7 @@ dependencies = [ [[package]] name = "sp-timestamp" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" +source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -7302,7 +7302,7 @@ dependencies = [ [[package]] name = "sp-tracing" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" +source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" dependencies = [ "log 0.4.8", "rental", @@ -7312,7 +7312,7 @@ dependencies = [ [[package]] name = "sp-transaction-pool" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" +source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" dependencies = [ "derive_more 0.99.8", "futures 0.3.5", @@ -7328,7 +7328,7 @@ dependencies = [ [[package]] name = "sp-trie" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" +source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" dependencies = [ "hash-db", "memory-db", @@ -7342,7 +7342,7 @@ dependencies = [ [[package]] name = "sp-utils" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" +source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" dependencies = [ "futures 0.3.5", "futures-core", @@ -7354,7 +7354,7 @@ dependencies = [ [[package]] name = "sp-version" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" +source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" dependencies = [ "impl-serde 0.2.3", "parity-scale-codec", @@ -7366,7 +7366,7 @@ dependencies = [ [[package]] name = "sp-wasm-interface" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" +source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -7497,7 +7497,7 @@ dependencies = [ [[package]] name = "substrate-browser-utils" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" +source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" dependencies = [ "chrono", "clear_on_drop", @@ -7524,7 +7524,7 @@ dependencies = [ [[package]] name = "substrate-build-script-utils" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" +source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" dependencies = [ "platforms", ] @@ -7532,7 +7532,7 @@ dependencies = [ [[package]] name = "substrate-frame-rpc-system" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" +source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" dependencies = [ "frame-system-rpc-runtime-api", "futures 0.3.5", @@ -7555,7 +7555,7 @@ dependencies = [ [[package]] name = "substrate-prometheus-endpoint" version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" +source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" dependencies = [ "async-std", "derive_more 0.99.8", @@ -7569,7 +7569,7 @@ dependencies = [ [[package]] name = "substrate-test-client" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" +source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" dependencies = [ "futures 0.3.5", "hash-db", @@ -7591,7 +7591,7 @@ dependencies = [ [[package]] name = "substrate-test-runtime" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" +source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" dependencies = [ "cfg-if", "frame-executive", @@ -7631,7 +7631,7 @@ dependencies = [ [[package]] name = "substrate-test-runtime-client" version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" +source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" dependencies = [ "futures 0.3.5", "parity-scale-codec", @@ -7652,7 +7652,7 @@ dependencies = [ [[package]] name = "substrate-wasm-builder-runner" version = "1.0.6" -source = "git+https://github.com/paritytech/substrate#d17396cebe11dce352aeeaac0b2645354cb2b328" +source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" [[package]] name = "substrate-wasm-builder-runner" diff --git a/parachain/src/wasm_executor/mod.rs b/parachain/src/wasm_executor/mod.rs index 2a9c9569be..2410da844f 100644 --- a/parachain/src/wasm_executor/mod.rs +++ b/parachain/src/wasm_executor/mod.rs @@ -296,6 +296,18 @@ impl sp_externalities::Externalities for ValidationExternalities { panic!("commit: unsupported feature for parachain validation") } + fn read_write_count(&self) -> (u32, u32, u32, u32) { + panic!("read_write_count: unsupported feature for parachain validation") + } + + fn reset_read_write_count(&mut self) { + panic!("reset_read_write_count: unsupported feature for parachain validation") + } + + fn set_whitelist(&mut self, _: Vec>) { + panic!("set_whitelist: unsupported feature for parachain validation") + } + fn set_offchain_storage(&mut self, _: &[u8], _: std::option::Option<&[u8]>) { panic!("set_offchain_storage: unsupported feature for parachain validation") } diff --git a/runtime/kusama/Cargo.toml b/runtime/kusama/Cargo.toml index 9f599233f0..ee608f37db 100644 --- a/runtime/kusama/Cargo.toml +++ b/runtime/kusama/Cargo.toml @@ -69,6 +69,7 @@ frame-benchmarking = { git = "https://github.com/paritytech/substrate", branch = frame-system-benchmarking = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false, optional = true } pallet-offences-benchmarking = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false, optional = true } pallet-session-benchmarking = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false, optional = true } +hex-literal = { version = "0.2.1", optional = true } runtime-common = { package = "polkadot-runtime-common", path = "../common", default-features = false } primitives = { package = "polkadot-primitives", path = "../../primitives", default-features = false } @@ -167,4 +168,5 @@ runtime-benchmarks = [ "vesting/runtime-benchmarks", "pallet-offences-benchmarking", "pallet-session-benchmarking", + "hex-literal", ] diff --git a/runtime/kusama/src/lib.rs b/runtime/kusama/src/lib.rs index a1f1367fcd..9b00eda2b2 100644 --- a/runtime/kusama/src/lib.rs +++ b/runtime/kusama/src/lib.rs @@ -1198,8 +1198,26 @@ sp_api::impl_runtime_apis! { impl pallet_offences_benchmarking::Trait for Runtime {} impl frame_system_benchmarking::Trait for Runtime {} + let whitelist: Vec> = vec![ + // Block Number + // frame_system::Number::::hashed_key().to_vec(), + hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef702a5c1b19ab7a04f536c519aca4983ac").to_vec(), + // Total Issuance + hex_literal::hex!("c2261276cc9d1f8598ea4b6a74b15c2f57c875e4cff74148e4628f264b974c80").to_vec(), + // Execution Phase + hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef7ff553b5a9862a516939d82b3d3d8661a").to_vec(), + // Event Count + hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef70a98fdbe9ce6c55837576c60c7af3850").to_vec(), + // System Events + hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef780d41e5e16056765bc8461851072c9d7").to_vec(), + // Caller 0 Account + hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da946c154ffd9992e395af90b5b13cc6f295c77033fce8a9045824a6690bbf99c6db269502f0a8d1d2a008542d5690a0749").to_vec(), + // Treasury Account + hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da95ecffd7b6c0f78751baa9d281e0bfa3a6d6f646c70792f74727372790000000000000000000000000000000000000000").to_vec(), + ]; + let mut batches = Vec::::new(); - let params = (&pallet, &benchmark, &lowest_range_values, &highest_range_values, &steps, repeat); + let params = (&pallet, &benchmark, &lowest_range_values, &highest_range_values, &steps, repeat, &whitelist); // Polkadot add_benchmark!(params, batches, b"claims", Claims); // Substrate diff --git a/runtime/polkadot/Cargo.toml b/runtime/polkadot/Cargo.toml index ce3e9efc93..ae3a7e05b8 100644 --- a/runtime/polkadot/Cargo.toml +++ b/runtime/polkadot/Cargo.toml @@ -67,6 +67,7 @@ frame-benchmarking = { git = "https://github.com/paritytech/substrate", branch = frame-system-benchmarking = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false, optional = true } pallet-offences-benchmarking = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false, optional = true } pallet-session-benchmarking = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false, optional = true } +hex-literal = { version = "0.2.1", optional = true } runtime-common = { package = "polkadot-runtime-common", path = "../common", default-features = false } primitives = { package = "polkadot-primitives", path = "../../primitives", default-features = false } @@ -161,4 +162,5 @@ runtime-benchmarks = [ "vesting/runtime-benchmarks", "pallet-offences-benchmarking", "pallet-session-benchmarking", + "hex-literal", ] diff --git a/runtime/polkadot/src/lib.rs b/runtime/polkadot/src/lib.rs index 2079a3c8ba..38ca6527fa 100644 --- a/runtime/polkadot/src/lib.rs +++ b/runtime/polkadot/src/lib.rs @@ -1176,8 +1176,26 @@ sp_api::impl_runtime_apis! { impl pallet_offences_benchmarking::Trait for Runtime {} impl frame_system_benchmarking::Trait for Runtime {} + let whitelist: Vec> = vec![ + // Block Number + // frame_system::Number::::hashed_key().to_vec(), + hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef702a5c1b19ab7a04f536c519aca4983ac").to_vec(), + // Total Issuance + hex_literal::hex!("c2261276cc9d1f8598ea4b6a74b15c2f57c875e4cff74148e4628f264b974c80").to_vec(), + // Execution Phase + hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef7ff553b5a9862a516939d82b3d3d8661a").to_vec(), + // Event Count + hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef70a98fdbe9ce6c55837576c60c7af3850").to_vec(), + // System Events + hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef780d41e5e16056765bc8461851072c9d7").to_vec(), + // Caller 0 Account + hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da946c154ffd9992e395af90b5b13cc6f295c77033fce8a9045824a6690bbf99c6db269502f0a8d1d2a008542d5690a0749").to_vec(), + // Treasury Account + hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da95ecffd7b6c0f78751baa9d281e0bfa3a6d6f646c70792f74727372790000000000000000000000000000000000000000").to_vec(), + ]; + let mut batches = Vec::::new(); - let params = (&pallet, &benchmark, &lowest_range_values, &highest_range_values, &steps, repeat); + let params = (&pallet, &benchmark, &lowest_range_values, &highest_range_values, &steps, repeat, &whitelist); // Polkadot add_benchmark!(params, batches, b"claims", Claims); // Substrate diff --git a/runtime/westend/Cargo.toml b/runtime/westend/Cargo.toml index 3743d765d3..d32def670f 100644 --- a/runtime/westend/Cargo.toml +++ b/runtime/westend/Cargo.toml @@ -70,6 +70,7 @@ frame-benchmarking = { git = "https://github.com/paritytech/substrate", branch = frame-system-benchmarking = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false, optional = true } pallet-offences-benchmarking = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false, optional = true } pallet-session-benchmarking = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false, optional = true } +hex-literal = { version = "0.2.1", optional = true } runtime-common = { package = "polkadot-runtime-common", path = "../common", default-features = false } primitives = { package = "polkadot-primitives", path = "../../primitives", default-features = false } @@ -171,4 +172,5 @@ runtime-benchmarks = [ "vesting/runtime-benchmarks", "pallet-offences-benchmarking", "pallet-session-benchmarking", + "hex-literal", ] diff --git a/runtime/westend/src/lib.rs b/runtime/westend/src/lib.rs index 334a041baa..bb3d745503 100644 --- a/runtime/westend/src/lib.rs +++ b/runtime/westend/src/lib.rs @@ -959,8 +959,26 @@ sp_api::impl_runtime_apis! { impl pallet_offences_benchmarking::Trait for Runtime {} impl frame_system_benchmarking::Trait for Runtime {} + let whitelist: Vec> = vec![ + // Block Number + // frame_system::Number::::hashed_key().to_vec(), + hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef702a5c1b19ab7a04f536c519aca4983ac").to_vec(), + // Total Issuance + hex_literal::hex!("c2261276cc9d1f8598ea4b6a74b15c2f57c875e4cff74148e4628f264b974c80").to_vec(), + // Execution Phase + hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef7ff553b5a9862a516939d82b3d3d8661a").to_vec(), + // Event Count + hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef70a98fdbe9ce6c55837576c60c7af3850").to_vec(), + // System Events + hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef780d41e5e16056765bc8461851072c9d7").to_vec(), + // Caller 0 Account + hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da946c154ffd9992e395af90b5b13cc6f295c77033fce8a9045824a6690bbf99c6db269502f0a8d1d2a008542d5690a0749").to_vec(), + // Treasury Account + hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da95ecffd7b6c0f78751baa9d281e0bfa3a6d6f646c70792f74727372790000000000000000000000000000000000000000").to_vec(), + ]; + let mut batches = Vec::::new(); - let params = (&pallet, &benchmark, &lowest_range_values, &highest_range_values, &steps, repeat); + let params = (&pallet, &benchmark, &lowest_range_values, &highest_range_values, &steps, repeat, &whitelist); add_benchmark!(params, batches, b"balances", Balances); add_benchmark!(params, batches, b"identity", Identity); -- GitLab From ecc5b41f0ddff498e69b3980201e747b197d722f Mon Sep 17 00:00:00 2001 From: Gavin Wood Date: Fri, 26 Jun 2020 12:08:43 +0200 Subject: [PATCH 015/192] Companion for #6503 (#1315) * Companion for #6503 * Remove old filtering * Bump tx version * Bump version * Bump --- Cargo.lock | 582 ++++++++++----------- Cargo.toml | 2 +- availability-store/Cargo.toml | 2 +- cli/Cargo.toml | 2 +- collator/Cargo.toml | 2 +- erasure-coding/Cargo.toml | 2 +- network/Cargo.toml | 2 +- network/test/Cargo.toml | 2 +- parachain/Cargo.toml | 2 +- parachain/test-parachains/adder/Cargo.toml | 2 +- parachain/test-parachains/halt/Cargo.toml | 2 +- primitives/Cargo.toml | 2 +- rpc/Cargo.toml | 2 +- runtime/common/Cargo.toml | 2 +- runtime/kusama/Cargo.toml | 2 +- runtime/kusama/src/lib.rs | 11 +- runtime/polkadot/Cargo.toml | 2 +- runtime/polkadot/src/lib.rs | 13 +- runtime/test-runtime/Cargo.toml | 2 +- runtime/westend/Cargo.toml | 2 +- runtime/westend/src/lib.rs | 9 +- service/Cargo.toml | 2 +- statement-table/Cargo.toml | 2 +- validation/Cargo.toml | 2 +- 24 files changed, 324 insertions(+), 331 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 27217d39da..eb9ef2b19a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1171,16 +1171,16 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "fork-tree" -version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" +version = "2.0.0-rc4" +source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" dependencies = [ "parity-scale-codec", ] [[package]] name = "frame-benchmarking" -version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" +version = "2.0.0-rc4" +source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" dependencies = [ "frame-support", "frame-system", @@ -1196,8 +1196,8 @@ dependencies = [ [[package]] name = "frame-benchmarking-cli" -version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" +version = "2.0.0-rc4" +source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" dependencies = [ "frame-benchmarking", "parity-scale-codec", @@ -1214,8 +1214,8 @@ dependencies = [ [[package]] name = "frame-executive" -version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" +version = "2.0.0-rc4" +source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" dependencies = [ "frame-support", "frame-system", @@ -1229,8 +1229,8 @@ dependencies = [ [[package]] name = "frame-metadata" -version = "11.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" +version = "11.0.0-rc4" +source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" dependencies = [ "parity-scale-codec", "serde", @@ -1240,8 +1240,8 @@ dependencies = [ [[package]] name = "frame-support" -version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" +version = "2.0.0-rc4" +source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" dependencies = [ "bitmask", "frame-metadata", @@ -1265,8 +1265,8 @@ dependencies = [ [[package]] name = "frame-support-procedural" -version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" +version = "2.0.0-rc4" +source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" dependencies = [ "frame-support-procedural-tools", "proc-macro2 1.0.18", @@ -1276,8 +1276,8 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools" -version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" +version = "2.0.0-rc4" +source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" dependencies = [ "frame-support-procedural-tools-derive", "proc-macro-crate", @@ -1288,8 +1288,8 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools-derive" -version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" +version = "2.0.0-rc4" +source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" dependencies = [ "proc-macro2 1.0.18", "quote 1.0.7", @@ -1298,8 +1298,8 @@ dependencies = [ [[package]] name = "frame-system" -version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" +version = "2.0.0-rc4" +source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" dependencies = [ "frame-support", "impl-trait-for-tuples", @@ -1314,8 +1314,8 @@ dependencies = [ [[package]] name = "frame-system-benchmarking" -version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" +version = "2.0.0-rc4" +source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" dependencies = [ "frame-benchmarking", "frame-support", @@ -1328,8 +1328,8 @@ dependencies = [ [[package]] name = "frame-system-rpc-runtime-api" -version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" +version = "2.0.0-rc4" +source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" dependencies = [ "parity-scale-codec", "sp-api", @@ -2237,7 +2237,7 @@ dependencies = [ [[package]] name = "kusama-runtime" -version = "0.8.12" +version = "0.8.13" dependencies = [ "bitvec", "frame-benchmarking", @@ -3265,8 +3265,8 @@ dependencies = [ [[package]] name = "pallet-authority-discovery" -version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" +version = "2.0.0-rc4" +source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" dependencies = [ "frame-support", "frame-system", @@ -3281,8 +3281,8 @@ dependencies = [ [[package]] name = "pallet-authorship" -version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" +version = "2.0.0-rc4" +source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" dependencies = [ "frame-support", "frame-system", @@ -3296,8 +3296,8 @@ dependencies = [ [[package]] name = "pallet-babe" -version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" +version = "2.0.0-rc4" +source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" dependencies = [ "frame-support", "frame-system", @@ -3318,8 +3318,8 @@ dependencies = [ [[package]] name = "pallet-balances" -version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" +version = "2.0.0-rc4" +source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" dependencies = [ "frame-benchmarking", "frame-support", @@ -3332,8 +3332,8 @@ dependencies = [ [[package]] name = "pallet-collective" -version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" +version = "2.0.0-rc4" +source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" dependencies = [ "frame-benchmarking", "frame-support", @@ -3348,8 +3348,8 @@ dependencies = [ [[package]] name = "pallet-democracy" -version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" +version = "2.0.0-rc4" +source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" dependencies = [ "frame-benchmarking", "frame-support", @@ -3363,8 +3363,8 @@ dependencies = [ [[package]] name = "pallet-elections-phragmen" -version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" +version = "2.0.0-rc4" +source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" dependencies = [ "frame-benchmarking", "frame-support", @@ -3378,8 +3378,8 @@ dependencies = [ [[package]] name = "pallet-finality-tracker" -version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" +version = "2.0.0-rc4" +source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" dependencies = [ "frame-support", "frame-system", @@ -3394,8 +3394,8 @@ dependencies = [ [[package]] name = "pallet-grandpa" -version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" +version = "2.0.0-rc4" +source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" dependencies = [ "frame-support", "frame-system", @@ -3414,8 +3414,8 @@ dependencies = [ [[package]] name = "pallet-identity" -version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" +version = "2.0.0-rc4" +source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" dependencies = [ "enumflags2", "frame-benchmarking", @@ -3430,8 +3430,8 @@ dependencies = [ [[package]] name = "pallet-im-online" -version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" +version = "2.0.0-rc4" +source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" dependencies = [ "frame-benchmarking", "frame-support", @@ -3450,8 +3450,8 @@ dependencies = [ [[package]] name = "pallet-indices" -version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" +version = "2.0.0-rc4" +source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" dependencies = [ "frame-support", "frame-system", @@ -3466,8 +3466,8 @@ dependencies = [ [[package]] name = "pallet-membership" -version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" +version = "2.0.0-rc4" +source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" dependencies = [ "frame-support", "frame-system", @@ -3480,8 +3480,8 @@ dependencies = [ [[package]] name = "pallet-multisig" -version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" +version = "2.0.0-rc4" +source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" dependencies = [ "frame-support", "frame-system", @@ -3495,8 +3495,8 @@ dependencies = [ [[package]] name = "pallet-nicks" -version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" +version = "2.0.0-rc4" +source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" dependencies = [ "frame-support", "frame-system", @@ -3509,8 +3509,8 @@ dependencies = [ [[package]] name = "pallet-offences" -version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" +version = "2.0.0-rc4" +source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" dependencies = [ "frame-support", "frame-system", @@ -3524,8 +3524,8 @@ dependencies = [ [[package]] name = "pallet-offences-benchmarking" -version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" +version = "2.0.0-rc4" +source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" dependencies = [ "frame-benchmarking", "frame-support", @@ -3545,8 +3545,8 @@ dependencies = [ [[package]] name = "pallet-proxy" -version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" +version = "2.0.0-rc4" +source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" dependencies = [ "frame-support", "frame-system", @@ -3560,8 +3560,8 @@ dependencies = [ [[package]] name = "pallet-randomness-collective-flip" -version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" +version = "2.0.0-rc4" +source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" dependencies = [ "frame-support", "frame-system", @@ -3573,8 +3573,8 @@ dependencies = [ [[package]] name = "pallet-recovery" -version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" +version = "2.0.0-rc4" +source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" dependencies = [ "enumflags2", "frame-support", @@ -3588,8 +3588,8 @@ dependencies = [ [[package]] name = "pallet-scheduler" -version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" +version = "2.0.0-rc4" +source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" dependencies = [ "frame-benchmarking", "frame-support", @@ -3603,8 +3603,8 @@ dependencies = [ [[package]] name = "pallet-session" -version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" +version = "2.0.0-rc4" +source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" dependencies = [ "frame-support", "frame-system", @@ -3623,8 +3623,8 @@ dependencies = [ [[package]] name = "pallet-session-benchmarking" -version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" +version = "2.0.0-rc4" +source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" dependencies = [ "frame-benchmarking", "frame-support", @@ -3637,8 +3637,8 @@ dependencies = [ [[package]] name = "pallet-society" -version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" +version = "2.0.0-rc4" +source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" dependencies = [ "frame-support", "frame-system", @@ -3651,8 +3651,8 @@ dependencies = [ [[package]] name = "pallet-staking" -version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" +version = "2.0.0-rc4" +source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" dependencies = [ "frame-benchmarking", "frame-support", @@ -3673,8 +3673,8 @@ dependencies = [ [[package]] name = "pallet-staking-reward-curve" -version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" +version = "2.0.0-rc4" +source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -3684,8 +3684,8 @@ dependencies = [ [[package]] name = "pallet-sudo" -version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" +version = "2.0.0-rc4" +source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" dependencies = [ "frame-support", "frame-system", @@ -3698,8 +3698,8 @@ dependencies = [ [[package]] name = "pallet-timestamp" -version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" +version = "2.0.0-rc4" +source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" dependencies = [ "frame-benchmarking", "frame-support", @@ -3716,8 +3716,8 @@ dependencies = [ [[package]] name = "pallet-transaction-payment" -version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" +version = "2.0.0-rc4" +source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" dependencies = [ "frame-support", "frame-system", @@ -3731,8 +3731,8 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc" -version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" +version = "2.0.0-rc4" +source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" dependencies = [ "jsonrpc-core", "jsonrpc-core-client", @@ -3749,8 +3749,8 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc-runtime-api" -version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" +version = "2.0.0-rc4" +source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" dependencies = [ "frame-support", "parity-scale-codec", @@ -3762,8 +3762,8 @@ dependencies = [ [[package]] name = "pallet-treasury" -version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" +version = "2.0.0-rc4" +source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" dependencies = [ "frame-benchmarking", "frame-support", @@ -3777,8 +3777,8 @@ dependencies = [ [[package]] name = "pallet-utility" -version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" +version = "2.0.0-rc4" +source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" dependencies = [ "frame-benchmarking", "frame-support", @@ -3793,8 +3793,8 @@ dependencies = [ [[package]] name = "pallet-vesting" -version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" +version = "2.0.0-rc4" +source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" dependencies = [ "enumflags2", "frame-benchmarking", @@ -4119,7 +4119,7 @@ checksum = "feb3b2b1033b8a60b4da6ee470325f887758c95d5320f52f9ce0df055a55940e" [[package]] name = "polkadot" -version = "0.8.12" +version = "0.8.13" dependencies = [ "assert_cmd", "futures 0.3.5", @@ -4133,7 +4133,7 @@ dependencies = [ [[package]] name = "polkadot-availability-store" -version = "0.8.12" +version = "0.8.13" dependencies = [ "derive_more 0.99.8", "exit-future", @@ -4159,7 +4159,7 @@ dependencies = [ [[package]] name = "polkadot-cli" -version = "0.8.12" +version = "0.8.13" dependencies = [ "frame-benchmarking-cli", "futures 0.3.5", @@ -4184,7 +4184,7 @@ dependencies = [ [[package]] name = "polkadot-collator" -version = "0.8.12" +version = "0.8.13" dependencies = [ "futures 0.3.5", "futures-timer 2.0.2", @@ -4212,7 +4212,7 @@ dependencies = [ [[package]] name = "polkadot-erasure-coding" -version = "0.8.12" +version = "0.8.13" dependencies = [ "derive_more 0.15.0", "parity-scale-codec", @@ -4224,7 +4224,7 @@ dependencies = [ [[package]] name = "polkadot-network" -version = "0.8.12" +version = "0.8.13" dependencies = [ "arrayvec 0.4.12", "bytes 0.5.4", @@ -4252,7 +4252,7 @@ dependencies = [ [[package]] name = "polkadot-network-test" -version = "0.8.12" +version = "0.8.13" dependencies = [ "futures 0.3.5", "log 0.4.8", @@ -4309,7 +4309,7 @@ dependencies = [ [[package]] name = "polkadot-parachain" -version = "0.8.12" +version = "0.8.13" dependencies = [ "derive_more 0.99.8", "log 0.4.8", @@ -4328,7 +4328,7 @@ dependencies = [ [[package]] name = "polkadot-primitives" -version = "0.8.12" +version = "0.8.13" dependencies = [ "bitvec", "frame-system", @@ -4350,7 +4350,7 @@ dependencies = [ [[package]] name = "polkadot-rpc" -version = "0.8.12" +version = "0.8.13" dependencies = [ "jsonrpc-core", "pallet-transaction-payment-rpc", @@ -4376,7 +4376,7 @@ dependencies = [ [[package]] name = "polkadot-runtime" -version = "0.8.12" +version = "0.8.13" dependencies = [ "bitvec", "frame-benchmarking", @@ -4450,7 +4450,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-common" -version = "0.8.12" +version = "0.8.13" dependencies = [ "bitvec", "frame-benchmarking", @@ -4537,7 +4537,7 @@ dependencies = [ [[package]] name = "polkadot-service" -version = "0.8.12" +version = "0.8.13" dependencies = [ "env_logger", "frame-benchmarking", @@ -4655,7 +4655,7 @@ dependencies = [ [[package]] name = "polkadot-statement-table" -version = "0.8.12" +version = "0.8.13" dependencies = [ "parity-scale-codec", "polkadot-primitives", @@ -4664,7 +4664,7 @@ dependencies = [ [[package]] name = "polkadot-test-runtime" -version = "0.8.12" +version = "0.8.13" dependencies = [ "bitvec", "frame-executive", @@ -4741,7 +4741,7 @@ dependencies = [ [[package]] name = "polkadot-validation" -version = "0.8.12" +version = "0.8.13" dependencies = [ "bitvec", "derive_more 0.14.1", @@ -5530,8 +5530,8 @@ dependencies = [ [[package]] name = "sc-authority-discovery" -version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" +version = "0.8.0-rc4" +source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" dependencies = [ "bytes 0.5.4", "derive_more 0.99.8", @@ -5557,8 +5557,8 @@ dependencies = [ [[package]] name = "sc-basic-authorship" -version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" +version = "0.8.0-rc4" +source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -5581,8 +5581,8 @@ dependencies = [ [[package]] name = "sc-block-builder" -version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" +version = "0.8.0-rc4" +source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" dependencies = [ "parity-scale-codec", "sc-client-api", @@ -5597,8 +5597,8 @@ dependencies = [ [[package]] name = "sc-chain-spec" -version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" +version = "2.0.0-rc4" +source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" dependencies = [ "impl-trait-for-tuples", "sc-chain-spec-derive", @@ -5613,8 +5613,8 @@ dependencies = [ [[package]] name = "sc-chain-spec-derive" -version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" +version = "2.0.0-rc4" +source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -5624,8 +5624,8 @@ dependencies = [ [[package]] name = "sc-cli" -version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" +version = "0.8.0-rc4" +source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" dependencies = [ "ansi_term 0.12.1", "atty", @@ -5664,8 +5664,8 @@ dependencies = [ [[package]] name = "sc-client-api" -version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" +version = "2.0.0-rc4" +source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" dependencies = [ "derive_more 0.99.8", "fnv", @@ -5700,8 +5700,8 @@ dependencies = [ [[package]] name = "sc-client-db" -version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" +version = "0.8.0-rc4" +source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" dependencies = [ "blake2-rfc", "hash-db", @@ -5729,8 +5729,8 @@ dependencies = [ [[package]] name = "sc-consensus" -version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" +version = "0.8.0-rc4" +source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" dependencies = [ "sc-client-api", "sp-blockchain", @@ -5740,8 +5740,8 @@ dependencies = [ [[package]] name = "sc-consensus-babe" -version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" +version = "0.8.0-rc4" +source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" dependencies = [ "derive_more 0.99.8", "fork-tree", @@ -5782,8 +5782,8 @@ dependencies = [ [[package]] name = "sc-consensus-babe-rpc" -version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" +version = "0.8.0-rc4" +source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" dependencies = [ "derive_more 0.99.8", "futures 0.3.5", @@ -5806,8 +5806,8 @@ dependencies = [ [[package]] name = "sc-consensus-epochs" -version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" +version = "0.8.0-rc4" +source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" dependencies = [ "fork-tree", "parity-scale-codec", @@ -5819,8 +5819,8 @@ dependencies = [ [[package]] name = "sc-consensus-slots" -version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" +version = "0.8.0-rc4" +source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -5841,8 +5841,8 @@ dependencies = [ [[package]] name = "sc-consensus-uncles" -version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" +version = "0.8.0-rc4" +source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" dependencies = [ "log 0.4.8", "sc-client-api", @@ -5855,8 +5855,8 @@ dependencies = [ [[package]] name = "sc-executor" -version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" +version = "0.8.0-rc4" +source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" dependencies = [ "derive_more 0.99.8", "lazy_static", @@ -5883,8 +5883,8 @@ dependencies = [ [[package]] name = "sc-executor-common" -version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" +version = "0.8.0-rc4" +source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" dependencies = [ "derive_more 0.99.8", "log 0.4.8", @@ -5900,8 +5900,8 @@ dependencies = [ [[package]] name = "sc-executor-wasmi" -version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" +version = "0.8.0-rc4" +source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" dependencies = [ "log 0.4.8", "parity-scale-codec", @@ -5915,8 +5915,8 @@ dependencies = [ [[package]] name = "sc-executor-wasmtime" -version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" +version = "0.8.0-rc4" +source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" dependencies = [ "cranelift-codegen", "cranelift-wasm", @@ -5936,8 +5936,8 @@ dependencies = [ [[package]] name = "sc-finality-grandpa" -version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" +version = "0.8.0-rc4" +source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" dependencies = [ "assert_matches", "derive_more 0.99.8", @@ -5974,8 +5974,8 @@ dependencies = [ [[package]] name = "sc-finality-grandpa-rpc" -version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" +version = "0.8.0-rc4" +source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" dependencies = [ "derive_more 0.99.8", "finality-grandpa", @@ -5991,8 +5991,8 @@ dependencies = [ [[package]] name = "sc-informant" -version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" +version = "0.8.0-rc4" +source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" dependencies = [ "ansi_term 0.12.1", "futures 0.3.5", @@ -6010,8 +6010,8 @@ dependencies = [ [[package]] name = "sc-keystore" -version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" +version = "2.0.0-rc4" +source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" dependencies = [ "derive_more 0.99.8", "hex", @@ -6026,8 +6026,8 @@ dependencies = [ [[package]] name = "sc-light" -version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" +version = "2.0.0-rc4" +source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" dependencies = [ "hash-db", "lazy_static", @@ -6045,8 +6045,8 @@ dependencies = [ [[package]] name = "sc-network" -version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" +version = "0.8.0-rc4" +source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" dependencies = [ "bitflags", "bs58", @@ -6097,8 +6097,8 @@ dependencies = [ [[package]] name = "sc-network-gossip" -version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" +version = "0.8.0-rc4" +source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6112,8 +6112,8 @@ dependencies = [ [[package]] name = "sc-network-test" -version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" +version = "0.8.0-rc4" +source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" dependencies = [ "env_logger", "futures 0.3.5", @@ -6139,8 +6139,8 @@ dependencies = [ [[package]] name = "sc-offchain" -version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" +version = "2.0.0-rc4" +source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" dependencies = [ "bytes 0.5.4", "fnv", @@ -6166,8 +6166,8 @@ dependencies = [ [[package]] name = "sc-peerset" -version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" +version = "2.0.0-rc4" +source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" dependencies = [ "futures 0.3.5", "libp2p", @@ -6179,8 +6179,8 @@ dependencies = [ [[package]] name = "sc-proposer-metrics" -version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" +version = "0.8.0-rc4" +source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" dependencies = [ "log 0.4.8", "substrate-prometheus-endpoint", @@ -6188,8 +6188,8 @@ dependencies = [ [[package]] name = "sc-rpc" -version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" +version = "2.0.0-rc4" +source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" dependencies = [ "futures 0.3.5", "hash-db", @@ -6220,8 +6220,8 @@ dependencies = [ [[package]] name = "sc-rpc-api" -version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" +version = "0.8.0-rc4" +source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" dependencies = [ "derive_more 0.99.8", "futures 0.3.5", @@ -6244,8 +6244,8 @@ dependencies = [ [[package]] name = "sc-rpc-server" -version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" +version = "2.0.0-rc4" +source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" dependencies = [ "jsonrpc-core", "jsonrpc-http-server", @@ -6260,8 +6260,8 @@ dependencies = [ [[package]] name = "sc-service" -version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" +version = "0.8.0-rc4" +source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" dependencies = [ "derive_more 0.99.8", "directories", @@ -6323,8 +6323,8 @@ dependencies = [ [[package]] name = "sc-state-db" -version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" +version = "0.8.0-rc4" +source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" dependencies = [ "log 0.4.8", "parity-scale-codec", @@ -6337,8 +6337,8 @@ dependencies = [ [[package]] name = "sc-telemetry" -version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" +version = "2.0.0-rc4" +source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" dependencies = [ "bytes 0.5.4", "futures 0.3.5", @@ -6359,8 +6359,8 @@ dependencies = [ [[package]] name = "sc-tracing" -version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" +version = "2.0.0-rc4" +source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" dependencies = [ "erased-serde", "log 0.4.8", @@ -6376,8 +6376,8 @@ dependencies = [ [[package]] name = "sc-transaction-graph" -version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" +version = "2.0.0-rc4" +source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" dependencies = [ "derive_more 0.99.8", "futures 0.3.5", @@ -6396,8 +6396,8 @@ dependencies = [ [[package]] name = "sc-transaction-pool" -version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" +version = "2.0.0-rc4" +source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" dependencies = [ "derive_more 0.99.8", "futures 0.3.5", @@ -6783,8 +6783,8 @@ dependencies = [ [[package]] name = "sp-allocator" -version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" +version = "2.0.0-rc4" +source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" dependencies = [ "derive_more 0.99.8", "log 0.4.8", @@ -6795,8 +6795,8 @@ dependencies = [ [[package]] name = "sp-api" -version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" +version = "2.0.0-rc4" +source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" dependencies = [ "hash-db", "parity-scale-codec", @@ -6810,8 +6810,8 @@ dependencies = [ [[package]] name = "sp-api-proc-macro" -version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" +version = "2.0.0-rc4" +source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" dependencies = [ "blake2-rfc", "proc-macro-crate", @@ -6822,8 +6822,8 @@ dependencies = [ [[package]] name = "sp-application-crypto" -version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" +version = "2.0.0-rc4" +source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" dependencies = [ "parity-scale-codec", "serde", @@ -6834,8 +6834,8 @@ dependencies = [ [[package]] name = "sp-arithmetic" -version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" +version = "2.0.0-rc4" +source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" dependencies = [ "integer-sqrt", "num-traits 0.2.12", @@ -6847,8 +6847,8 @@ dependencies = [ [[package]] name = "sp-authority-discovery" -version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" +version = "2.0.0-rc4" +source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" dependencies = [ "parity-scale-codec", "sp-api", @@ -6859,8 +6859,8 @@ dependencies = [ [[package]] name = "sp-authorship" -version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" +version = "2.0.0-rc4" +source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" dependencies = [ "parity-scale-codec", "sp-inherents", @@ -6870,8 +6870,8 @@ dependencies = [ [[package]] name = "sp-block-builder" -version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" +version = "2.0.0-rc4" +source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" dependencies = [ "parity-scale-codec", "sp-api", @@ -6882,8 +6882,8 @@ dependencies = [ [[package]] name = "sp-blockchain" -version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" +version = "2.0.0-rc4" +source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" dependencies = [ "derive_more 0.99.8", "log 0.4.8", @@ -6898,8 +6898,8 @@ dependencies = [ [[package]] name = "sp-chain-spec" -version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" +version = "2.0.0-rc4" +source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" dependencies = [ "serde", "serde_json", @@ -6907,8 +6907,8 @@ dependencies = [ [[package]] name = "sp-consensus" -version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" +version = "0.8.0-rc4" +source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" dependencies = [ "derive_more 0.99.8", "futures 0.3.5", @@ -6931,8 +6931,8 @@ dependencies = [ [[package]] name = "sp-consensus-aura" -version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" +version = "0.8.0-rc4" +source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" dependencies = [ "parity-scale-codec", "sp-api", @@ -6945,8 +6945,8 @@ dependencies = [ [[package]] name = "sp-consensus-babe" -version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" +version = "0.8.0-rc4" +source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" dependencies = [ "merlin", "parity-scale-codec", @@ -6963,8 +6963,8 @@ dependencies = [ [[package]] name = "sp-consensus-vrf" -version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" +version = "0.8.0-rc4" +source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" dependencies = [ "parity-scale-codec", "schnorrkel", @@ -6975,8 +6975,8 @@ dependencies = [ [[package]] name = "sp-core" -version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" +version = "2.0.0-rc4" +source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" dependencies = [ "base58", "blake2-rfc", @@ -7017,8 +7017,8 @@ dependencies = [ [[package]] name = "sp-database" -version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" +version = "2.0.0-rc4" +source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" dependencies = [ "kvdb", "parking_lot 0.10.2", @@ -7026,8 +7026,8 @@ dependencies = [ [[package]] name = "sp-debug-derive" -version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" +version = "2.0.0-rc4" +source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" dependencies = [ "proc-macro2 1.0.18", "quote 1.0.7", @@ -7036,8 +7036,8 @@ dependencies = [ [[package]] name = "sp-externalities" -version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" +version = "0.8.0-rc4" +source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" dependencies = [ "environmental", "parity-scale-codec", @@ -7047,8 +7047,8 @@ dependencies = [ [[package]] name = "sp-finality-grandpa" -version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" +version = "2.0.0-rc4" +source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" dependencies = [ "finality-grandpa", "log 0.4.8", @@ -7063,8 +7063,8 @@ dependencies = [ [[package]] name = "sp-finality-tracker" -version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" +version = "2.0.0-rc4" +source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" dependencies = [ "parity-scale-codec", "sp-inherents", @@ -7073,8 +7073,8 @@ dependencies = [ [[package]] name = "sp-inherents" -version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" +version = "2.0.0-rc4" +source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" dependencies = [ "derive_more 0.99.8", "parity-scale-codec", @@ -7085,8 +7085,8 @@ dependencies = [ [[package]] name = "sp-io" -version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" +version = "2.0.0-rc4" +source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" dependencies = [ "futures 0.3.5", "hash-db", @@ -7106,8 +7106,8 @@ dependencies = [ [[package]] name = "sp-keyring" -version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" +version = "2.0.0-rc4" +source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" dependencies = [ "lazy_static", "sp-core", @@ -7117,8 +7117,8 @@ dependencies = [ [[package]] name = "sp-npos-elections" -version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" +version = "2.0.0-rc4" +source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" dependencies = [ "parity-scale-codec", "serde", @@ -7129,8 +7129,8 @@ dependencies = [ [[package]] name = "sp-npos-elections-compact" -version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" +version = "2.0.0-rc4" +source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -7140,8 +7140,8 @@ dependencies = [ [[package]] name = "sp-offchain" -version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" +version = "2.0.0-rc4" +source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" dependencies = [ "sp-api", "sp-core", @@ -7150,8 +7150,8 @@ dependencies = [ [[package]] name = "sp-panic-handler" -version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" +version = "2.0.0-rc4" +source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" dependencies = [ "backtrace", "log 0.4.8", @@ -7159,8 +7159,8 @@ dependencies = [ [[package]] name = "sp-rpc" -version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" +version = "2.0.0-rc4" +source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" dependencies = [ "serde", "sp-core", @@ -7168,8 +7168,8 @@ dependencies = [ [[package]] name = "sp-runtime" -version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" +version = "2.0.0-rc4" +source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" dependencies = [ "either", "hash256-std-hasher", @@ -7190,8 +7190,8 @@ dependencies = [ [[package]] name = "sp-runtime-interface" -version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" +version = "2.0.0-rc4" +source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" dependencies = [ "parity-scale-codec", "primitive-types", @@ -7205,8 +7205,8 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" -version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" +version = "2.0.0-rc4" +source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" dependencies = [ "Inflector", "proc-macro-crate", @@ -7217,8 +7217,8 @@ dependencies = [ [[package]] name = "sp-serializer" -version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" +version = "2.0.0-rc4" +source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" dependencies = [ "serde", "serde_json", @@ -7226,8 +7226,8 @@ dependencies = [ [[package]] name = "sp-session" -version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" +version = "2.0.0-rc4" +source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" dependencies = [ "parity-scale-codec", "sp-api", @@ -7239,8 +7239,8 @@ dependencies = [ [[package]] name = "sp-staking" -version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" +version = "2.0.0-rc4" +source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" dependencies = [ "parity-scale-codec", "sp-runtime", @@ -7249,8 +7249,8 @@ dependencies = [ [[package]] name = "sp-state-machine" -version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" +version = "0.8.0-rc4" +source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" dependencies = [ "hash-db", "itertools 0.9.0", @@ -7270,13 +7270,13 @@ dependencies = [ [[package]] name = "sp-std" -version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" +version = "2.0.0-rc4" +source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" [[package]] name = "sp-storage" -version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" +version = "2.0.0-rc4" +source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" dependencies = [ "impl-serde 0.2.3", "ref-cast", @@ -7287,8 +7287,8 @@ dependencies = [ [[package]] name = "sp-timestamp" -version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" +version = "2.0.0-rc4" +source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -7301,8 +7301,8 @@ dependencies = [ [[package]] name = "sp-tracing" -version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" +version = "2.0.0-rc4" +source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" dependencies = [ "log 0.4.8", "rental", @@ -7311,8 +7311,8 @@ dependencies = [ [[package]] name = "sp-transaction-pool" -version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" +version = "2.0.0-rc4" +source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" dependencies = [ "derive_more 0.99.8", "futures 0.3.5", @@ -7327,8 +7327,8 @@ dependencies = [ [[package]] name = "sp-trie" -version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" +version = "2.0.0-rc4" +source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" dependencies = [ "hash-db", "memory-db", @@ -7341,8 +7341,8 @@ dependencies = [ [[package]] name = "sp-utils" -version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" +version = "2.0.0-rc4" +source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" dependencies = [ "futures 0.3.5", "futures-core", @@ -7353,8 +7353,8 @@ dependencies = [ [[package]] name = "sp-version" -version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" +version = "2.0.0-rc4" +source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" dependencies = [ "impl-serde 0.2.3", "parity-scale-codec", @@ -7365,8 +7365,8 @@ dependencies = [ [[package]] name = "sp-wasm-interface" -version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" +version = "2.0.0-rc4" +source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -7496,8 +7496,8 @@ dependencies = [ [[package]] name = "substrate-browser-utils" -version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" +version = "0.8.0-rc4" +source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" dependencies = [ "chrono", "clear_on_drop", @@ -7523,16 +7523,16 @@ dependencies = [ [[package]] name = "substrate-build-script-utils" -version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" +version = "2.0.0-rc4" +source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" dependencies = [ "platforms", ] [[package]] name = "substrate-frame-rpc-system" -version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" +version = "2.0.0-rc4" +source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" dependencies = [ "frame-system-rpc-runtime-api", "futures 0.3.5", @@ -7554,8 +7554,8 @@ dependencies = [ [[package]] name = "substrate-prometheus-endpoint" -version = "0.8.0-rc3" -source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" +version = "0.8.0-rc4" +source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" dependencies = [ "async-std", "derive_more 0.99.8", @@ -7568,8 +7568,8 @@ dependencies = [ [[package]] name = "substrate-test-client" -version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" +version = "2.0.0-rc4" +source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" dependencies = [ "futures 0.3.5", "hash-db", @@ -7590,8 +7590,8 @@ dependencies = [ [[package]] name = "substrate-test-runtime" -version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" +version = "2.0.0-rc4" +source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" dependencies = [ "cfg-if", "frame-executive", @@ -7630,8 +7630,8 @@ dependencies = [ [[package]] name = "substrate-test-runtime-client" -version = "2.0.0-rc3" -source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" +version = "2.0.0-rc4" +source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" dependencies = [ "futures 0.3.5", "parity-scale-codec", @@ -7652,7 +7652,7 @@ dependencies = [ [[package]] name = "substrate-wasm-builder-runner" version = "1.0.6" -source = "git+https://github.com/paritytech/substrate#7f5dd736f42a408b62885669f7d76ef5baa13572" +source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" [[package]] name = "substrate-wasm-builder-runner" @@ -7878,7 +7878,7 @@ dependencies = [ [[package]] name = "test-parachain-adder" -version = "0.8.12" +version = "0.8.13" dependencies = [ "dlmalloc", "parity-scale-codec", @@ -7917,7 +7917,7 @@ dependencies = [ [[package]] name = "test-parachain-halt" -version = "0.8.12" +version = "0.8.13" dependencies = [ "substrate-wasm-builder-runner 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -8826,7 +8826,7 @@ dependencies = [ [[package]] name = "westend-runtime" -version = "0.8.12" +version = "0.8.13" dependencies = [ "bitvec", "frame-benchmarking", diff --git a/Cargo.toml b/Cargo.toml index f320492418..34f9f14e4e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,7 +4,7 @@ path = "src/main.rs" [package] name = "polkadot" -version = "0.8.12" +version = "0.8.13" authors = ["Parity Technologies "] edition = "2018" diff --git a/availability-store/Cargo.toml b/availability-store/Cargo.toml index 69defcfeb2..503e897cea 100644 --- a/availability-store/Cargo.toml +++ b/availability-store/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "polkadot-availability-store" description = "Persistent database for parachain data" -version = "0.8.12" +version = "0.8.13" authors = ["Parity Technologies "] edition = "2018" diff --git a/cli/Cargo.toml b/cli/Cargo.toml index ff67b236c5..b395ccba9d 100644 --- a/cli/Cargo.toml +++ b/cli/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-cli" -version = "0.8.12" +version = "0.8.13" authors = ["Parity Technologies "] description = "Polkadot Relay-chain Client Node" edition = "2018" diff --git a/collator/Cargo.toml b/collator/Cargo.toml index 2c47f20dbb..42e733419f 100644 --- a/collator/Cargo.toml +++ b/collator/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-collator" -version = "0.8.12" +version = "0.8.13" authors = ["Parity Technologies "] description = "Collator node implementation" edition = "2018" diff --git a/erasure-coding/Cargo.toml b/erasure-coding/Cargo.toml index 6368a1787b..9c49e33f40 100644 --- a/erasure-coding/Cargo.toml +++ b/erasure-coding/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-erasure-coding" -version = "0.8.12" +version = "0.8.13" authors = ["Parity Technologies "] edition = "2018" diff --git a/network/Cargo.toml b/network/Cargo.toml index f3ca97dcda..0735fec590 100644 --- a/network/Cargo.toml +++ b/network/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-network" -version = "0.8.12" +version = "0.8.13" authors = ["Parity Technologies "] description = "Polkadot-specific networking protocol" edition = "2018" diff --git a/network/test/Cargo.toml b/network/test/Cargo.toml index c8549924ce..ad8cafe3f4 100644 --- a/network/test/Cargo.toml +++ b/network/test/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-network-test" -version = "0.8.12" +version = "0.8.13" license = "GPL-3.0" authors = ["Parity Technologies "] edition = "2018" diff --git a/parachain/Cargo.toml b/parachain/Cargo.toml index 5846105a93..e401e2baa5 100644 --- a/parachain/Cargo.toml +++ b/parachain/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-parachain" -version = "0.8.12" +version = "0.8.13" authors = ["Parity Technologies "] description = "Types and utilities for creating and working with parachains" edition = "2018" diff --git a/parachain/test-parachains/adder/Cargo.toml b/parachain/test-parachains/adder/Cargo.toml index 3a636fca68..7f04dc5946 100644 --- a/parachain/test-parachains/adder/Cargo.toml +++ b/parachain/test-parachains/adder/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "test-parachain-adder" -version = "0.8.12" +version = "0.8.13" authors = ["Parity Technologies "] description = "Test parachain which adds to a number as its state transition" edition = "2018" diff --git a/parachain/test-parachains/halt/Cargo.toml b/parachain/test-parachains/halt/Cargo.toml index cf3fb26555..b595b245d0 100644 --- a/parachain/test-parachains/halt/Cargo.toml +++ b/parachain/test-parachains/halt/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "test-parachain-halt" -version = "0.8.12" +version = "0.8.13" authors = ["Parity Technologies "] description = "Test parachain which executes forever" edition = "2018" diff --git a/primitives/Cargo.toml b/primitives/Cargo.toml index b38d5cc97d..d327429b64 100644 --- a/primitives/Cargo.toml +++ b/primitives/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-primitives" -version = "0.8.12" +version = "0.8.13" authors = ["Parity Technologies "] edition = "2018" diff --git a/rpc/Cargo.toml b/rpc/Cargo.toml index 6826900da7..ce2f6382b4 100644 --- a/rpc/Cargo.toml +++ b/rpc/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-rpc" -version = "0.8.12" +version = "0.8.13" authors = ["Parity Technologies "] edition = "2018" diff --git a/runtime/common/Cargo.toml b/runtime/common/Cargo.toml index 4dba004540..2b31e989c8 100644 --- a/runtime/common/Cargo.toml +++ b/runtime/common/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-runtime-common" -version = "0.8.12" +version = "0.8.13" authors = ["Parity Technologies "] edition = "2018" diff --git a/runtime/kusama/Cargo.toml b/runtime/kusama/Cargo.toml index ee608f37db..b5494ab625 100644 --- a/runtime/kusama/Cargo.toml +++ b/runtime/kusama/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "kusama-runtime" -version = "0.8.12" +version = "0.8.13" authors = ["Parity Technologies "] edition = "2018" build = "build.rs" diff --git a/runtime/kusama/src/lib.rs b/runtime/kusama/src/lib.rs index 9b00eda2b2..4017a051a1 100644 --- a/runtime/kusama/src/lib.rs +++ b/runtime/kusama/src/lib.rs @@ -86,10 +86,10 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("kusama"), impl_name: create_runtime_str!("parity-kusama"), authoring_version: 2, - spec_version: 2012, + spec_version: 2013, impl_version: 0, apis: RUNTIME_API_VERSIONS, - transaction_version: 1, + transaction_version: 2, }; /// Native version. @@ -852,13 +852,10 @@ impl InstanceFilter for ProxyType { ), ProxyType::Governance => matches!(c, Call::Democracy(..) | Call::Council(..) | Call::TechnicalCommittee(..) - | Call::ElectionsPhragmen(..) | Call::Treasury(..) - | Call::Utility(utility::Call::batch(..)) - | Call::Utility(utility::Call::as_limited_sub(..)) + | Call::ElectionsPhragmen(..) | Call::Treasury(..) | Call::Utility(..) ), ProxyType::Staking => matches!(c, - Call::Staking(..) | Call::Utility(utility::Call::batch(..)) - | Call::Utility(utility::Call::as_limited_sub(..)) + Call::Staking(..) | Call::Utility(..) ), } } diff --git a/runtime/polkadot/Cargo.toml b/runtime/polkadot/Cargo.toml index ae3a7e05b8..471efb0bac 100644 --- a/runtime/polkadot/Cargo.toml +++ b/runtime/polkadot/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-runtime" -version = "0.8.12" +version = "0.8.13" authors = ["Parity Technologies "] edition = "2018" build = "build.rs" diff --git a/runtime/polkadot/src/lib.rs b/runtime/polkadot/src/lib.rs index 38ca6527fa..200ba5ec5c 100644 --- a/runtime/polkadot/src/lib.rs +++ b/runtime/polkadot/src/lib.rs @@ -91,10 +91,10 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("polkadot"), impl_name: create_runtime_str!("parity-polkadot"), authoring_version: 0, - spec_version: 12, + spec_version: 13, impl_version: 0, apis: RUNTIME_API_VERSIONS, - transaction_version: 0, + transaction_version: 2, }; /// Native version. @@ -829,17 +829,14 @@ impl InstanceFilter for ProxyType { ), ProxyType::Governance => matches!(c, Call::Democracy(..) | Call::Council(..) | Call::TechnicalCommittee(..) - | Call::ElectionsPhragmen(..) | Call::Treasury(..) - | Call::Utility(utility::Call::batch(..)) - | Call::Utility(utility::Call::as_limited_sub(..)) + | Call::ElectionsPhragmen(..) | Call::Treasury(..) | Call::Utility(..) ), ProxyType::Staking => matches!(c, - Call::Staking(..) | Call::Utility(utility::Call::batch(..)) - | Call::Utility(utility::Call::as_limited_sub(..)) + Call::Staking(..) | Call::Utility(utility::Call::batch(..)) | Call::Utility(..) ), ProxyType::SudoBalances => match c { Call::Sudo(sudo::Call::sudo(ref x)) => matches!(x.as_ref(), &Call::Balances(..)), - Call::Utility(utility::Call::batch(..)) => true, + Call::Utility(..) => true, _ => false, }, } diff --git a/runtime/test-runtime/Cargo.toml b/runtime/test-runtime/Cargo.toml index 4326e11dff..ba2f0f1a61 100644 --- a/runtime/test-runtime/Cargo.toml +++ b/runtime/test-runtime/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-test-runtime" -version = "0.8.12" +version = "0.8.13" authors = ["Parity Technologies "] edition = "2018" build = "build.rs" diff --git a/runtime/westend/Cargo.toml b/runtime/westend/Cargo.toml index d32def670f..deab7e0109 100644 --- a/runtime/westend/Cargo.toml +++ b/runtime/westend/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "westend-runtime" -version = "0.8.12" +version = "0.8.13" authors = ["Parity Technologies "] edition = "2018" build = "build.rs" diff --git a/runtime/westend/src/lib.rs b/runtime/westend/src/lib.rs index bb3d745503..a172e41162 100644 --- a/runtime/westend/src/lib.rs +++ b/runtime/westend/src/lib.rs @@ -81,10 +81,10 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("westend"), impl_name: create_runtime_str!("parity-westend"), authoring_version: 2, - spec_version: 32, + spec_version: 33, impl_version: 0, apis: RUNTIME_API_VERSIONS, - transaction_version: 1, + transaction_version: 2, }; /// Native version. @@ -625,12 +625,11 @@ impl InstanceFilter for ProxyType { Call::Multisig(..) ), ProxyType::Staking => matches!(c, - Call::Staking(..) | Call::Utility(utility::Call::batch(..)) - | Call::Utility(utility::Call::as_limited_sub(..)) + Call::Staking(..) | Call::Utility(..) ), ProxyType::SudoBalances => match c { Call::Sudo(sudo::Call::sudo(ref x)) => matches!(x.as_ref(), &Call::Balances(..)), - Call::Utility(utility::Call::batch(..)) => true, + Call::Utility(..) => true, _ => false, }, } diff --git a/service/Cargo.toml b/service/Cargo.toml index bdd869da46..5eb47ec887 100644 --- a/service/Cargo.toml +++ b/service/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-service" -version = "0.8.12" +version = "0.8.13" authors = ["Parity Technologies "] edition = "2018" diff --git a/statement-table/Cargo.toml b/statement-table/Cargo.toml index 209397056a..831ae6cd43 100644 --- a/statement-table/Cargo.toml +++ b/statement-table/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-statement-table" -version = "0.8.12" +version = "0.8.13" authors = ["Parity Technologies "] edition = "2018" diff --git a/validation/Cargo.toml b/validation/Cargo.toml index be07d4ce52..42e417fef6 100644 --- a/validation/Cargo.toml +++ b/validation/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-validation" -version = "0.8.12" +version = "0.8.13" authors = ["Parity Technologies "] edition = "2018" -- GitLab From 0762de59f975fe2392fd6ca28dc3bd904df7f3a8 Mon Sep 17 00:00:00 2001 From: s3krit Date: Sat, 27 Jun 2020 02:14:02 +0200 Subject: [PATCH 016/192] add burnin-label-notification.yml (#1324) --- .github/workflows/burnin-label-notification.yml | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 .github/workflows/burnin-label-notification.yml diff --git a/.github/workflows/burnin-label-notification.yml b/.github/workflows/burnin-label-notification.yml new file mode 100644 index 0000000000..203685b706 --- /dev/null +++ b/.github/workflows/burnin-label-notification.yml @@ -0,0 +1,17 @@ +name: Notify devops when burn-in label applied +on: + pull_request: + types: [labeled] + +jobs: + notify-devops: + runs-on: ubuntu-latest + steps: + - name: Notify devops + if: github.event.label.name == 'A1-needsburnin' + uses: s3krit/matrix-message-action@v0.0.2 + with: + room_id: ${{ secrets.POLKADOT_DEVOPS_MATRIX_ROOM_ID }} + access_token: ${{ secrets.POLKADOT_DEVOPS_MATRIX_ACCESS_TOKEN }} + message: "@room Burn-in request received for the following PR: ${{ github.event.pull_request.html_url }}" + server: "matrix.parity.io" -- GitLab From 3703dcea2d4d6d9bf4d7736bdc22be3bb6cde7f3 Mon Sep 17 00:00:00 2001 From: Bryan Chen Date: Sat, 27 Jun 2020 12:59:51 +1200 Subject: [PATCH 017/192] add runtime upgrade --- runtime/kusama/src/lib.rs | 20 +++++++++++++++++++- runtime/polkadot/src/lib.rs | 20 +++++++++++++++++++- 2 files changed, 38 insertions(+), 2 deletions(-) diff --git a/runtime/kusama/src/lib.rs b/runtime/kusama/src/lib.rs index 40478fe0d8..daa19477b5 100644 --- a/runtime/kusama/src/lib.rs +++ b/runtime/kusama/src/lib.rs @@ -883,6 +883,17 @@ impl proxy::Trait for Runtime { type MaxProxies = MaxProxies; } +pub struct CustomOnRuntimeUpgrade; + impl frame_support::traits::OnRuntimeUpgrade for CustomOnRuntimeUpgrade { + fn on_runtime_upgrade() -> frame_support::weights::Weight { + if scheduler::Module::::migrate_v1_to_t2() { + ::MaximumBlockWeight::get() + } else { + ::DbWeight::get().reads(1) + } + } +} + construct_runtime! { pub enum Runtime where Block = Block, @@ -984,7 +995,14 @@ pub type UncheckedExtrinsic = generic::UncheckedExtrinsic; /// Executive: handles dispatch to the various modules. -pub type Executive = executive::Executive, Runtime, AllModules>; +pub type Executive = executive::Executive< + Runtime, + Block, + system::ChainContext, + Runtime, + AllModules, + CustomOnRuntimeUpgrade +>; /// The payload being signed in the transactions. pub type SignedPayload = generic::SignedPayload; diff --git a/runtime/polkadot/src/lib.rs b/runtime/polkadot/src/lib.rs index 599912ea83..b21ad3bdbc 100644 --- a/runtime/polkadot/src/lib.rs +++ b/runtime/polkadot/src/lib.rs @@ -865,6 +865,17 @@ impl proxy::Trait for Runtime { type MaxProxies = MaxProxies; } +pub struct CustomOnRuntimeUpgrade; + impl frame_support::traits::OnRuntimeUpgrade for CustomOnRuntimeUpgrade { + fn on_runtime_upgrade() -> frame_support::weights::Weight { + if scheduler::Module::::migrate_v1_to_t2() { + ::MaximumBlockWeight::get() + } else { + ::DbWeight::get().reads(1) + } + } +} + construct_runtime! { pub enum Runtime where Block = Block, @@ -962,7 +973,14 @@ pub type UncheckedExtrinsic = generic::UncheckedExtrinsic; /// Executive: handles dispatch to the various modules. -pub type Executive = executive::Executive, Runtime, AllModules>; +pub type Executive = executive::Executive< + Runtime, + Block, + system::ChainContext, + Runtime, + AllModules, + CustomOnRuntimeUpgrade +>; /// The payload being signed in transactions. pub type SignedPayload = generic::SignedPayload; -- GitLab From 51ce2b31230d6debdcd04f6bf9b345ec92544b94 Mon Sep 17 00:00:00 2001 From: Ashley Date: Tue, 30 Jun 2020 14:06:55 +0200 Subject: [PATCH 018/192] Companion PR for `Remove the service, replacing it with a struct of individual chain components` (#1288) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Switch branch * Fix service things * Fix browser node compilation * Update branch * fixed new service * Update for new branch * Fix browser node * Update branch * Revert "Switch branch" This reverts commit 3623adff7681124a1539a385a718c34e85931254. * Update cargo.lock Co-authored-by: Bastian Köcher --- Cargo.lock | 543 +++++++++++++++++++++++++--------------- cli/src/browser.rs | 4 +- cli/src/command.rs | 97 ++++--- cli/src/lib.rs | 4 +- collator/src/lib.rs | 14 +- node/service/src/lib.rs | 90 +++---- service/src/lib.rs | 104 ++++---- 7 files changed, 475 insertions(+), 381 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index eb9ef2b19a..b1a7eba99d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -25,6 +25,61 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "567b077b825e468cc974f0020d4082ee6e03132512f207ef1a02fd5d00d1f32d" +[[package]] +name = "aead" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cf01b9b56e767bb57b94ebf91a58b338002963785cdd7013e21c0d4679471e4" +dependencies = [ + "generic-array", +] + +[[package]] +name = "aes" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54eb1d8fe354e5fc611daf4f2ea97dd45a765f4f1e4512306ec183ae2e8f20c9" +dependencies = [ + "aes-soft", + "aesni", + "block-cipher-trait", +] + +[[package]] +name = "aes-gcm" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "834a6bda386024dbb7c8fc51322856c10ffe69559f972261c868485f5759c638" +dependencies = [ + "aead", + "aes", + "block-cipher-trait", + "ghash", + "subtle 2.2.3", + "zeroize", +] + +[[package]] +name = "aes-soft" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfd7e7ae3f9a1fb5c03b389fc6bb9a51400d0c13053f0dca698c832bfd893a0d" +dependencies = [ + "block-cipher-trait", + "byteorder", + "opaque-debug", +] + +[[package]] +name = "aesni" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f70a6b5f971e473091ab7cfb5ffac6cde81666c4556751d8d5620ead8abf100" +dependencies = [ + "block-cipher-trait", + "opaque-debug", +] + [[package]] name = "ahash" version = "0.2.18" @@ -368,6 +423,15 @@ dependencies = [ "generic-array", ] +[[package]] +name = "block-cipher-trait" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c924d49bd09e7c06003acda26cd9742e796e34282ec6c1189404dee0c1f4774" +dependencies = [ + "generic-array", +] + [[package]] name = "block-padding" version = "0.1.5" @@ -478,12 +542,26 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" [[package]] -name = "chacha20-poly1305-aead" -version = "0.1.2" +name = "chacha20" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77d2058ba29594f69c75e8a9018e0485e3914ca5084e3613cd64529042f5423b" +checksum = "f6a7ae4c498f8447d86baef0fa0831909333f558866fabcb21600625ac5a31c7" dependencies = [ - "constant_time_eq", + "stream-cipher", + "zeroize", +] + +[[package]] +name = "chacha20poly1305" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48901293601228db2131606f741db33561f7576b5d19c99cd66222380a7dc863" +dependencies = [ + "aead", + "chacha20", + "poly1305", + "stream-cipher", + "zeroize", ] [[package]] @@ -1172,7 +1250,7 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "fork-tree" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" +source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" dependencies = [ "parity-scale-codec", ] @@ -1180,7 +1258,7 @@ dependencies = [ [[package]] name = "frame-benchmarking" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" +source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" dependencies = [ "frame-support", "frame-system", @@ -1197,7 +1275,7 @@ dependencies = [ [[package]] name = "frame-benchmarking-cli" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" +source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" dependencies = [ "frame-benchmarking", "parity-scale-codec", @@ -1215,7 +1293,7 @@ dependencies = [ [[package]] name = "frame-executive" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" +source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" dependencies = [ "frame-support", "frame-system", @@ -1230,7 +1308,7 @@ dependencies = [ [[package]] name = "frame-metadata" version = "11.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" +source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" dependencies = [ "parity-scale-codec", "serde", @@ -1241,7 +1319,7 @@ dependencies = [ [[package]] name = "frame-support" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" +source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" dependencies = [ "bitmask", "frame-metadata", @@ -1266,7 +1344,7 @@ dependencies = [ [[package]] name = "frame-support-procedural" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" +source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" dependencies = [ "frame-support-procedural-tools", "proc-macro2 1.0.18", @@ -1277,7 +1355,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" +source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" dependencies = [ "frame-support-procedural-tools-derive", "proc-macro-crate", @@ -1289,7 +1367,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools-derive" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" +source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" dependencies = [ "proc-macro2 1.0.18", "quote 1.0.7", @@ -1299,7 +1377,7 @@ dependencies = [ [[package]] name = "frame-system" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" +source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" dependencies = [ "frame-support", "impl-trait-for-tuples", @@ -1315,7 +1393,7 @@ dependencies = [ [[package]] name = "frame-system-benchmarking" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" +source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" dependencies = [ "frame-benchmarking", "frame-support", @@ -1329,7 +1407,7 @@ dependencies = [ [[package]] name = "frame-system-rpc-runtime-api" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" +source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" dependencies = [ "parity-scale-codec", "sp-api", @@ -1559,6 +1637,18 @@ dependencies = [ "pin-project", ] +[[package]] +name = "futures_codec" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce54d63f8b0c75023ed920d46fd71d0cbbb830b0ee012726b5b4f506fb6dea5b" +dependencies = [ + "bytes 0.5.4", + "futures 0.3.5", + "memchr", + "pin-project", +] + [[package]] name = "gcc" version = "0.3.55" @@ -1608,6 +1698,15 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "ghash" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f0930ed19a7184089ea46d2fedead2f6dc2b674c5db4276b7da336c7cd83252" +dependencies = [ + "polyval", +] + [[package]] name = "gimli" version = "0.20.0" @@ -2435,9 +2534,9 @@ checksum = "c7d73b3f436185384286bd8098d17ec07c9a7d2388a6599f824d8502b529702a" [[package]] name = "libp2p" -version = "0.19.1" +version = "0.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "057eba5432d3e740e313c6e13c9153d0cb76b4f71bfc2e5242ae5bdb7d41af67" +checksum = "db81113df355dea9dddfcb01cd867555298dca29d915f25d1b1a0aad2e29338b" dependencies = [ "bytes 0.5.4", "futures 0.3.5", @@ -2457,7 +2556,7 @@ dependencies = [ "libp2p-websocket", "libp2p-yamux", "multihash", - "parity-multiaddr 0.9.0", + "parity-multiaddr 0.9.1", "parking_lot 0.10.2", "pin-project", "smallvec 1.4.0", @@ -2466,9 +2565,9 @@ dependencies = [ [[package]] name = "libp2p-core" -version = "0.19.1" +version = "0.19.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f5e30dcd8cb13a02ad534e214da234eca1595a76b5788b645dfa5c734d2124b" +checksum = "3a0387b930c3d4c2533dc4893c1e0394185ddcc019846121b1b27491e45a2c08" dependencies = [ "asn1_der", "bs58", @@ -2482,7 +2581,7 @@ dependencies = [ "log 0.4.8", "multihash", "multistream-select", - "parity-multiaddr 0.9.0", + "parity-multiaddr 0.9.1", "parking_lot 0.10.2", "pin-project", "prost", @@ -2493,7 +2592,7 @@ dependencies = [ "sha2", "smallvec 1.4.0", "thiserror", - "unsigned-varint", + "unsigned-varint 0.4.0", "void", "zeroize", ] @@ -2521,9 +2620,9 @@ dependencies = [ [[package]] name = "libp2p-identify" -version = "0.19.1" +version = "0.19.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6438ed8ca240c7635c9caa3be6c5258bc0058553ae97ba81737f04e5d33804f5" +checksum = "62f76075b170d908bae616f550ade410d9d27c013fa69042551dbfc757c7c094" dependencies = [ "futures 0.3.5", "libp2p-core", @@ -2537,16 +2636,16 @@ dependencies = [ [[package]] name = "libp2p-kad" -version = "0.19.0" +version = "0.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41d6c1d5100973527ae70d82687465b17049c1b717a7964de38b8e65000878ff" +checksum = "f7c819a5425b2eb3416d67e9c868c5c1e922b6658655e06b9eeafaa41304b876" dependencies = [ "arrayvec 0.5.1", "bytes 0.5.4", "either", "fnv", "futures 0.3.5", - "futures_codec", + "futures_codec 0.4.1", "libp2p-core", "libp2p-swarm", "log 0.4.8", @@ -2557,16 +2656,16 @@ dependencies = [ "sha2", "smallvec 1.4.0", "uint", - "unsigned-varint", + "unsigned-varint 0.4.0", "void", "wasm-timer", ] [[package]] name = "libp2p-mdns" -version = "0.19.1" +version = "0.19.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51b00163d13f705aae67c427bea0575f8aaf63da6524f9bd4a5a093b8bda0b38" +checksum = "7f55b2d4b80986e5bf158270ab23268ec0e7f644ece5436fbaabc5155472f357" dependencies = [ "async-std", "data-encoding", @@ -2586,25 +2685,25 @@ dependencies = [ [[package]] name = "libp2p-mplex" -version = "0.19.1" +version = "0.19.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34ce63313ad4bce2d76e54c292a1293ea47a0ebbe16708f1513fa62184992f53" +checksum = "be7d913a4cd57de2013257ec73f07d77bfce390b370023e2d59083e5ca079864" dependencies = [ "bytes 0.5.4", "fnv", "futures 0.3.5", - "futures_codec", + "futures_codec 0.4.1", "libp2p-core", "log 0.4.8", "parking_lot 0.10.2", - "unsigned-varint", + "unsigned-varint 0.4.0", ] [[package]] name = "libp2p-noise" -version = "0.19.0" +version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84fd504e27b0eadd451e06b67694ef714bd8374044e7db339bb0cdb83755ddf4" +checksum = "a03db664653369f46ee03fcec483a378c20195089bb43a26cb9fb0058009ac88" dependencies = [ "curve25519-dalek", "futures 0.3.5", @@ -2623,9 +2722,9 @@ dependencies = [ [[package]] name = "libp2p-ping" -version = "0.19.2" +version = "0.19.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffb3c4f9273313357d4977799aec69f581cfe9568854919c5b8066018ccf59f5" +checksum = "b8dedd34e35a9728d52d59ef36a218e411359a353f9011b2574b86ee790978f6" dependencies = [ "futures 0.3.5", "libp2p-core", @@ -2638,9 +2737,9 @@ dependencies = [ [[package]] name = "libp2p-swarm" -version = "0.19.0" +version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4a8101a0e0d5f04562137a476bf5f5423cd5bdab2f7e43a75909668e63cb102" +checksum = "ce53ff4d127cf8b39adf84dbd381ca32d49bd85788cee08e6669da2495993930" dependencies = [ "futures 0.3.5", "libp2p-core", @@ -2653,9 +2752,9 @@ dependencies = [ [[package]] name = "libp2p-tcp" -version = "0.19.1" +version = "0.19.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "309f95fce9bec755eff5406f8b822fd3969990830c2b54f752e1fc181d5ace3e" +checksum = "9481500c5774c62e8c413e9535b3f33a0e3dbacf2da63b8d3056c686a9df4146" dependencies = [ "async-std", "futures 0.3.5", @@ -2683,12 +2782,11 @@ dependencies = [ [[package]] name = "libp2p-websocket" -version = "0.19.0" +version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "085fbe4c05c4116c2164ab4d5a521eb6e00516c444f61b3ee9f68c7b1e53580b" +checksum = "7e4440551bf6519e0a684cd859ea809aec6d798f686e0d6ed03a28c3e76849b8" dependencies = [ "async-tls", - "bytes 0.5.4", "either", "futures 0.3.5", "libp2p-core", @@ -2704,9 +2802,9 @@ dependencies = [ [[package]] name = "libp2p-yamux" -version = "0.19.0" +version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b305d3a8981e68f11c0e17f2d11d5c52fae95e0d7c283f9e462b5b2dab413b2" +checksum = "8da33e7b5f49c75c6a8afb0b8d1e229f5fa48be9f39bd14cdbc21459a02ac6fc" dependencies = [ "futures 0.3.5", "libp2p-core", @@ -3014,7 +3112,7 @@ dependencies = [ "sha-1", "sha2", "sha3", - "unsigned-varint", + "unsigned-varint 0.3.3", ] [[package]] @@ -3025,16 +3123,16 @@ checksum = "d8883adfde9756c1d30b0f519c9b8c502a94b41ac62f696453c37c7fc0a958ce" [[package]] name = "multistream-select" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "991c33683908c588b8f2cf66c221d8f390818c1bdcd13fce55208408e027a796" +checksum = "c9157e87afbc2ef0d84cc0345423d715f445edde00141c93721c162de35a05e5" dependencies = [ "bytes 0.5.4", "futures 0.3.5", "log 0.4.8", "pin-project", "smallvec 1.4.0", - "unsigned-varint", + "unsigned-varint 0.4.0", ] [[package]] @@ -3266,7 +3364,7 @@ dependencies = [ [[package]] name = "pallet-authority-discovery" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" +source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" dependencies = [ "frame-support", "frame-system", @@ -3282,7 +3380,7 @@ dependencies = [ [[package]] name = "pallet-authorship" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" +source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" dependencies = [ "frame-support", "frame-system", @@ -3297,7 +3395,7 @@ dependencies = [ [[package]] name = "pallet-babe" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" +source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" dependencies = [ "frame-support", "frame-system", @@ -3319,7 +3417,7 @@ dependencies = [ [[package]] name = "pallet-balances" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" +source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" dependencies = [ "frame-benchmarking", "frame-support", @@ -3333,7 +3431,7 @@ dependencies = [ [[package]] name = "pallet-collective" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" +source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" dependencies = [ "frame-benchmarking", "frame-support", @@ -3349,7 +3447,7 @@ dependencies = [ [[package]] name = "pallet-democracy" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" +source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" dependencies = [ "frame-benchmarking", "frame-support", @@ -3364,7 +3462,7 @@ dependencies = [ [[package]] name = "pallet-elections-phragmen" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" +source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" dependencies = [ "frame-benchmarking", "frame-support", @@ -3379,7 +3477,7 @@ dependencies = [ [[package]] name = "pallet-finality-tracker" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" +source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" dependencies = [ "frame-support", "frame-system", @@ -3395,7 +3493,7 @@ dependencies = [ [[package]] name = "pallet-grandpa" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" +source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" dependencies = [ "frame-support", "frame-system", @@ -3415,7 +3513,7 @@ dependencies = [ [[package]] name = "pallet-identity" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" +source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" dependencies = [ "enumflags2", "frame-benchmarking", @@ -3431,7 +3529,7 @@ dependencies = [ [[package]] name = "pallet-im-online" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" +source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" dependencies = [ "frame-benchmarking", "frame-support", @@ -3451,7 +3549,7 @@ dependencies = [ [[package]] name = "pallet-indices" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" +source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" dependencies = [ "frame-support", "frame-system", @@ -3467,7 +3565,7 @@ dependencies = [ [[package]] name = "pallet-membership" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" +source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" dependencies = [ "frame-support", "frame-system", @@ -3481,7 +3579,7 @@ dependencies = [ [[package]] name = "pallet-multisig" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" +source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" dependencies = [ "frame-support", "frame-system", @@ -3496,7 +3594,7 @@ dependencies = [ [[package]] name = "pallet-nicks" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" +source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" dependencies = [ "frame-support", "frame-system", @@ -3510,7 +3608,7 @@ dependencies = [ [[package]] name = "pallet-offences" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" +source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" dependencies = [ "frame-support", "frame-system", @@ -3525,7 +3623,7 @@ dependencies = [ [[package]] name = "pallet-offences-benchmarking" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" +source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" dependencies = [ "frame-benchmarking", "frame-support", @@ -3546,7 +3644,7 @@ dependencies = [ [[package]] name = "pallet-proxy" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" +source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" dependencies = [ "frame-support", "frame-system", @@ -3561,7 +3659,7 @@ dependencies = [ [[package]] name = "pallet-randomness-collective-flip" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" +source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" dependencies = [ "frame-support", "frame-system", @@ -3574,7 +3672,7 @@ dependencies = [ [[package]] name = "pallet-recovery" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" +source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" dependencies = [ "enumflags2", "frame-support", @@ -3589,7 +3687,7 @@ dependencies = [ [[package]] name = "pallet-scheduler" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" +source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" dependencies = [ "frame-benchmarking", "frame-support", @@ -3604,7 +3702,7 @@ dependencies = [ [[package]] name = "pallet-session" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" +source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" dependencies = [ "frame-support", "frame-system", @@ -3624,7 +3722,7 @@ dependencies = [ [[package]] name = "pallet-session-benchmarking" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" +source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" dependencies = [ "frame-benchmarking", "frame-support", @@ -3638,7 +3736,7 @@ dependencies = [ [[package]] name = "pallet-society" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" +source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" dependencies = [ "frame-support", "frame-system", @@ -3652,7 +3750,7 @@ dependencies = [ [[package]] name = "pallet-staking" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" +source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" dependencies = [ "frame-benchmarking", "frame-support", @@ -3674,7 +3772,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-curve" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" +source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -3685,7 +3783,7 @@ dependencies = [ [[package]] name = "pallet-sudo" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" +source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" dependencies = [ "frame-support", "frame-system", @@ -3699,7 +3797,7 @@ dependencies = [ [[package]] name = "pallet-timestamp" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" +source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" dependencies = [ "frame-benchmarking", "frame-support", @@ -3717,7 +3815,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" +source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" dependencies = [ "frame-support", "frame-system", @@ -3732,7 +3830,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" +source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" dependencies = [ "jsonrpc-core", "jsonrpc-core-client", @@ -3750,7 +3848,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc-runtime-api" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" +source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" dependencies = [ "frame-support", "parity-scale-codec", @@ -3763,7 +3861,7 @@ dependencies = [ [[package]] name = "pallet-treasury" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" +source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" dependencies = [ "frame-benchmarking", "frame-support", @@ -3778,7 +3876,7 @@ dependencies = [ [[package]] name = "pallet-utility" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" +source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" dependencies = [ "frame-benchmarking", "frame-support", @@ -3794,7 +3892,7 @@ dependencies = [ [[package]] name = "pallet-vesting" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" +source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" dependencies = [ "enumflags2", "frame-benchmarking", @@ -3834,15 +3932,15 @@ dependencies = [ "percent-encoding 2.1.0", "serde", "static_assertions", - "unsigned-varint", + "unsigned-varint 0.3.3", "url 2.1.1", ] [[package]] name = "parity-multiaddr" -version = "0.9.0" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12ca96399f4a01aa89c59220c4f52ac371940eb4e53e3ce990da796f364bdf69" +checksum = "cc20af3143a62c16e7c9e92ea5c6ae49f7d271d97d4d8fe73afc28f0514a3d0f" dependencies = [ "arrayref", "bs58", @@ -3852,7 +3950,7 @@ dependencies = [ "percent-encoding 2.1.0", "serde", "static_assertions", - "unsigned-varint", + "unsigned-varint 0.4.0", "url 2.1.1", ] @@ -3868,7 +3966,7 @@ dependencies = [ "sha-1", "sha2", "sha3", - "unsigned-varint", + "unsigned-varint 0.3.3", ] [[package]] @@ -4777,6 +4875,25 @@ dependencies = [ "tokio 0.2.21", ] +[[package]] +name = "poly1305" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5829f50f48e9ddb79f3f7c3097029d0caee30f8286accb241416df603b080b8" +dependencies = [ + "universal-hash", +] + +[[package]] +name = "polyval" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ec3341498978de3bfd12d1b22f1af1de22818f5473a11e8a6ef997989e3a212" +dependencies = [ + "cfg-if", + "universal-hash", +] + [[package]] name = "ppv-lite86" version = "0.2.8" @@ -5531,7 +5648,7 @@ dependencies = [ [[package]] name = "sc-authority-discovery" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" +source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" dependencies = [ "bytes 0.5.4", "derive_more 0.99.8", @@ -5558,7 +5675,7 @@ dependencies = [ [[package]] name = "sc-basic-authorship" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" +source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -5582,7 +5699,7 @@ dependencies = [ [[package]] name = "sc-block-builder" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" +source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" dependencies = [ "parity-scale-codec", "sc-client-api", @@ -5598,7 +5715,7 @@ dependencies = [ [[package]] name = "sc-chain-spec" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" +source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" dependencies = [ "impl-trait-for-tuples", "sc-chain-spec-derive", @@ -5614,7 +5731,7 @@ dependencies = [ [[package]] name = "sc-chain-spec-derive" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" +source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -5625,7 +5742,7 @@ dependencies = [ [[package]] name = "sc-cli" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" +source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" dependencies = [ "ansi_term 0.12.1", "atty", @@ -5665,7 +5782,7 @@ dependencies = [ [[package]] name = "sc-client-api" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" +source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" dependencies = [ "derive_more 0.99.8", "fnv", @@ -5701,7 +5818,7 @@ dependencies = [ [[package]] name = "sc-client-db" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" +source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" dependencies = [ "blake2-rfc", "hash-db", @@ -5730,7 +5847,7 @@ dependencies = [ [[package]] name = "sc-consensus" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" +source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" dependencies = [ "sc-client-api", "sp-blockchain", @@ -5741,7 +5858,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" +source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" dependencies = [ "derive_more 0.99.8", "fork-tree", @@ -5783,7 +5900,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe-rpc" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" +source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" dependencies = [ "derive_more 0.99.8", "futures 0.3.5", @@ -5807,7 +5924,7 @@ dependencies = [ [[package]] name = "sc-consensus-epochs" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" +source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" dependencies = [ "fork-tree", "parity-scale-codec", @@ -5820,7 +5937,7 @@ dependencies = [ [[package]] name = "sc-consensus-slots" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" +source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -5842,7 +5959,7 @@ dependencies = [ [[package]] name = "sc-consensus-uncles" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" +source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" dependencies = [ "log 0.4.8", "sc-client-api", @@ -5856,7 +5973,7 @@ dependencies = [ [[package]] name = "sc-executor" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" +source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" dependencies = [ "derive_more 0.99.8", "lazy_static", @@ -5884,7 +6001,7 @@ dependencies = [ [[package]] name = "sc-executor-common" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" +source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" dependencies = [ "derive_more 0.99.8", "log 0.4.8", @@ -5901,7 +6018,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmi" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" +source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" dependencies = [ "log 0.4.8", "parity-scale-codec", @@ -5916,7 +6033,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmtime" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" +source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" dependencies = [ "cranelift-codegen", "cranelift-wasm", @@ -5937,7 +6054,7 @@ dependencies = [ [[package]] name = "sc-finality-grandpa" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" +source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" dependencies = [ "assert_matches", "derive_more 0.99.8", @@ -5975,7 +6092,7 @@ dependencies = [ [[package]] name = "sc-finality-grandpa-rpc" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" +source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" dependencies = [ "derive_more 0.99.8", "finality-grandpa", @@ -5992,7 +6109,7 @@ dependencies = [ [[package]] name = "sc-informant" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" +source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" dependencies = [ "ansi_term 0.12.1", "futures 0.3.5", @@ -6011,7 +6128,7 @@ dependencies = [ [[package]] name = "sc-keystore" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" +source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" dependencies = [ "derive_more 0.99.8", "hex", @@ -6027,7 +6144,7 @@ dependencies = [ [[package]] name = "sc-light" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" +source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" dependencies = [ "hash-db", "lazy_static", @@ -6046,7 +6163,7 @@ dependencies = [ [[package]] name = "sc-network" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" +source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" dependencies = [ "bitflags", "bs58", @@ -6058,7 +6175,7 @@ dependencies = [ "fork-tree", "futures 0.3.5", "futures-timer 3.0.2", - "futures_codec", + "futures_codec 0.3.4", "hex", "ip_network", "libp2p", @@ -6089,7 +6206,7 @@ dependencies = [ "sp-utils", "substrate-prometheus-endpoint", "thiserror", - "unsigned-varint", + "unsigned-varint 0.3.3", "void", "wasm-timer", "zeroize", @@ -6098,7 +6215,7 @@ dependencies = [ [[package]] name = "sc-network-gossip" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" +source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6113,7 +6230,7 @@ dependencies = [ [[package]] name = "sc-network-test" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" +source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" dependencies = [ "env_logger", "futures 0.3.5", @@ -6140,7 +6257,7 @@ dependencies = [ [[package]] name = "sc-offchain" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" +source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" dependencies = [ "bytes 0.5.4", "fnv", @@ -6167,7 +6284,7 @@ dependencies = [ [[package]] name = "sc-peerset" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" +source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" dependencies = [ "futures 0.3.5", "libp2p", @@ -6180,7 +6297,7 @@ dependencies = [ [[package]] name = "sc-proposer-metrics" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" +source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" dependencies = [ "log 0.4.8", "substrate-prometheus-endpoint", @@ -6189,7 +6306,7 @@ dependencies = [ [[package]] name = "sc-rpc" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" +source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" dependencies = [ "futures 0.3.5", "hash-db", @@ -6221,7 +6338,7 @@ dependencies = [ [[package]] name = "sc-rpc-api" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" +source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" dependencies = [ "derive_more 0.99.8", "futures 0.3.5", @@ -6245,7 +6362,7 @@ dependencies = [ [[package]] name = "sc-rpc-server" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" +source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" dependencies = [ "jsonrpc-core", "jsonrpc-http-server", @@ -6261,7 +6378,7 @@ dependencies = [ [[package]] name = "sc-service" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" +source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" dependencies = [ "derive_more 0.99.8", "directories", @@ -6324,7 +6441,7 @@ dependencies = [ [[package]] name = "sc-state-db" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" +source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" dependencies = [ "log 0.4.8", "parity-scale-codec", @@ -6338,9 +6455,8 @@ dependencies = [ [[package]] name = "sc-telemetry" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" +source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" dependencies = [ - "bytes 0.5.4", "futures 0.3.5", "futures-timer 3.0.2", "libp2p", @@ -6360,7 +6476,7 @@ dependencies = [ [[package]] name = "sc-tracing" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" +source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" dependencies = [ "erased-serde", "log 0.4.8", @@ -6377,7 +6493,7 @@ dependencies = [ [[package]] name = "sc-transaction-graph" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" +source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" dependencies = [ "derive_more 0.99.8", "futures 0.3.5", @@ -6397,7 +6513,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" +source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" dependencies = [ "derive_more 0.99.8", "futures 0.3.5", @@ -6589,12 +6705,6 @@ dependencies = [ "opaque-debug", ] -[[package]] -name = "sha1" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2579985fda508104f7587689507983eadd6a6e84dd35d6d115361f530916fa0d" - [[package]] name = "sha2" version = "0.8.2" @@ -6733,13 +6843,13 @@ checksum = "c7cb5678e1615754284ec264d9bb5b4c27d2018577fd90ac0ceb578591ed5ee4" [[package]] name = "snow" -version = "0.6.2" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afb767eee7d257ba202f0b9b08673bc13b22281632ef45267b19f13100accd2f" +checksum = "ce0f91be479494dd92e69d9971bd23ed27037dd1c94fcf558f6c6e74e6afa654" dependencies = [ - "arrayref", - "blake2-rfc", - "chacha20-poly1305-aead", + "aes-gcm", + "blake2", + "chacha20poly1305", "rand 0.7.3", "rand_core 0.5.1", "ring", @@ -6763,28 +6873,24 @@ dependencies = [ [[package]] name = "soketto" -version = "0.3.2" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c9dab3f95c9ebdf3a88268c19af668f637a3c5039c2c56ff2d40b1b2d64a25b" +checksum = "85457366ae0c6ce56bf05a958aef14cd38513c236568618edbcd9a8c52cb80b0" dependencies = [ - "base64 0.11.0", + "base64 0.12.2", "bytes 0.5.4", "flate2", "futures 0.3.5", - "http 0.2.1", "httparse", "log 0.4.8", "rand 0.7.3", - "sha1", - "smallvec 1.4.0", - "static_assertions", - "thiserror", + "sha-1", ] [[package]] name = "sp-allocator" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" +source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" dependencies = [ "derive_more 0.99.8", "log 0.4.8", @@ -6796,7 +6902,7 @@ dependencies = [ [[package]] name = "sp-api" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" +source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" dependencies = [ "hash-db", "parity-scale-codec", @@ -6811,7 +6917,7 @@ dependencies = [ [[package]] name = "sp-api-proc-macro" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" +source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" dependencies = [ "blake2-rfc", "proc-macro-crate", @@ -6823,7 +6929,7 @@ dependencies = [ [[package]] name = "sp-application-crypto" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" +source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" dependencies = [ "parity-scale-codec", "serde", @@ -6835,7 +6941,7 @@ dependencies = [ [[package]] name = "sp-arithmetic" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" +source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" dependencies = [ "integer-sqrt", "num-traits 0.2.12", @@ -6848,7 +6954,7 @@ dependencies = [ [[package]] name = "sp-authority-discovery" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" +source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" dependencies = [ "parity-scale-codec", "sp-api", @@ -6860,7 +6966,7 @@ dependencies = [ [[package]] name = "sp-authorship" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" +source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" dependencies = [ "parity-scale-codec", "sp-inherents", @@ -6871,7 +6977,7 @@ dependencies = [ [[package]] name = "sp-block-builder" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" +source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" dependencies = [ "parity-scale-codec", "sp-api", @@ -6883,7 +6989,7 @@ dependencies = [ [[package]] name = "sp-blockchain" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" +source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" dependencies = [ "derive_more 0.99.8", "log 0.4.8", @@ -6899,7 +7005,7 @@ dependencies = [ [[package]] name = "sp-chain-spec" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" +source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" dependencies = [ "serde", "serde_json", @@ -6908,7 +7014,7 @@ dependencies = [ [[package]] name = "sp-consensus" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" +source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" dependencies = [ "derive_more 0.99.8", "futures 0.3.5", @@ -6932,7 +7038,7 @@ dependencies = [ [[package]] name = "sp-consensus-aura" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" +source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" dependencies = [ "parity-scale-codec", "sp-api", @@ -6946,7 +7052,7 @@ dependencies = [ [[package]] name = "sp-consensus-babe" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" +source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" dependencies = [ "merlin", "parity-scale-codec", @@ -6964,7 +7070,7 @@ dependencies = [ [[package]] name = "sp-consensus-vrf" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" +source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" dependencies = [ "parity-scale-codec", "schnorrkel", @@ -6976,7 +7082,7 @@ dependencies = [ [[package]] name = "sp-core" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" +source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" dependencies = [ "base58", "blake2-rfc", @@ -7018,7 +7124,7 @@ dependencies = [ [[package]] name = "sp-database" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" +source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" dependencies = [ "kvdb", "parking_lot 0.10.2", @@ -7027,7 +7133,7 @@ dependencies = [ [[package]] name = "sp-debug-derive" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" +source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" dependencies = [ "proc-macro2 1.0.18", "quote 1.0.7", @@ -7037,7 +7143,7 @@ dependencies = [ [[package]] name = "sp-externalities" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" +source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" dependencies = [ "environmental", "parity-scale-codec", @@ -7048,7 +7154,7 @@ dependencies = [ [[package]] name = "sp-finality-grandpa" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" +source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" dependencies = [ "finality-grandpa", "log 0.4.8", @@ -7064,7 +7170,7 @@ dependencies = [ [[package]] name = "sp-finality-tracker" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" +source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" dependencies = [ "parity-scale-codec", "sp-inherents", @@ -7074,7 +7180,7 @@ dependencies = [ [[package]] name = "sp-inherents" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" +source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" dependencies = [ "derive_more 0.99.8", "parity-scale-codec", @@ -7086,7 +7192,7 @@ dependencies = [ [[package]] name = "sp-io" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" +source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" dependencies = [ "futures 0.3.5", "hash-db", @@ -7107,7 +7213,7 @@ dependencies = [ [[package]] name = "sp-keyring" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" +source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" dependencies = [ "lazy_static", "sp-core", @@ -7118,7 +7224,7 @@ dependencies = [ [[package]] name = "sp-npos-elections" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" +source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" dependencies = [ "parity-scale-codec", "serde", @@ -7130,7 +7236,7 @@ dependencies = [ [[package]] name = "sp-npos-elections-compact" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" +source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -7141,7 +7247,7 @@ dependencies = [ [[package]] name = "sp-offchain" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" +source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" dependencies = [ "sp-api", "sp-core", @@ -7151,7 +7257,7 @@ dependencies = [ [[package]] name = "sp-panic-handler" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" +source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" dependencies = [ "backtrace", "log 0.4.8", @@ -7160,7 +7266,7 @@ dependencies = [ [[package]] name = "sp-rpc" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" +source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" dependencies = [ "serde", "sp-core", @@ -7169,7 +7275,7 @@ dependencies = [ [[package]] name = "sp-runtime" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" +source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" dependencies = [ "either", "hash256-std-hasher", @@ -7191,7 +7297,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" +source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" dependencies = [ "parity-scale-codec", "primitive-types", @@ -7206,7 +7312,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" +source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" dependencies = [ "Inflector", "proc-macro-crate", @@ -7218,7 +7324,7 @@ dependencies = [ [[package]] name = "sp-serializer" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" +source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" dependencies = [ "serde", "serde_json", @@ -7227,7 +7333,7 @@ dependencies = [ [[package]] name = "sp-session" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" +source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" dependencies = [ "parity-scale-codec", "sp-api", @@ -7240,7 +7346,7 @@ dependencies = [ [[package]] name = "sp-staking" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" +source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" dependencies = [ "parity-scale-codec", "sp-runtime", @@ -7250,7 +7356,7 @@ dependencies = [ [[package]] name = "sp-state-machine" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" +source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" dependencies = [ "hash-db", "itertools 0.9.0", @@ -7271,12 +7377,12 @@ dependencies = [ [[package]] name = "sp-std" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" +source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" [[package]] name = "sp-storage" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" +source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" dependencies = [ "impl-serde 0.2.3", "ref-cast", @@ -7288,7 +7394,7 @@ dependencies = [ [[package]] name = "sp-timestamp" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" +source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -7302,7 +7408,7 @@ dependencies = [ [[package]] name = "sp-tracing" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" +source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" dependencies = [ "log 0.4.8", "rental", @@ -7312,7 +7418,7 @@ dependencies = [ [[package]] name = "sp-transaction-pool" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" +source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" dependencies = [ "derive_more 0.99.8", "futures 0.3.5", @@ -7328,7 +7434,7 @@ dependencies = [ [[package]] name = "sp-trie" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" +source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" dependencies = [ "hash-db", "memory-db", @@ -7342,7 +7448,7 @@ dependencies = [ [[package]] name = "sp-utils" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" +source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" dependencies = [ "futures 0.3.5", "futures-core", @@ -7354,7 +7460,7 @@ dependencies = [ [[package]] name = "sp-version" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" +source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" dependencies = [ "impl-serde 0.2.3", "parity-scale-codec", @@ -7366,7 +7472,7 @@ dependencies = [ [[package]] name = "sp-wasm-interface" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" +source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -7401,6 +7507,15 @@ dependencies = [ "rand 0.5.6", ] +[[package]] +name = "stream-cipher" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8131256a5896cabcf5eb04f4d6dacbe1aefda854b0d9896e09cb58829ec5638c" +dependencies = [ + "generic-array", +] + [[package]] name = "streamunordered" version = "0.5.1" @@ -7497,7 +7612,7 @@ dependencies = [ [[package]] name = "substrate-browser-utils" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" +source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" dependencies = [ "chrono", "clear_on_drop", @@ -7524,7 +7639,7 @@ dependencies = [ [[package]] name = "substrate-build-script-utils" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" +source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" dependencies = [ "platforms", ] @@ -7532,7 +7647,7 @@ dependencies = [ [[package]] name = "substrate-frame-rpc-system" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" +source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" dependencies = [ "frame-system-rpc-runtime-api", "futures 0.3.5", @@ -7555,7 +7670,7 @@ dependencies = [ [[package]] name = "substrate-prometheus-endpoint" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" +source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" dependencies = [ "async-std", "derive_more 0.99.8", @@ -7569,7 +7684,7 @@ dependencies = [ [[package]] name = "substrate-test-client" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" +source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" dependencies = [ "futures 0.3.5", "hash-db", @@ -7591,7 +7706,7 @@ dependencies = [ [[package]] name = "substrate-test-runtime" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" +source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" dependencies = [ "cfg-if", "frame-executive", @@ -7631,7 +7746,7 @@ dependencies = [ [[package]] name = "substrate-test-runtime-client" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" +source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" dependencies = [ "futures 0.3.5", "parity-scale-codec", @@ -7652,7 +7767,7 @@ dependencies = [ [[package]] name = "substrate-wasm-builder-runner" version = "1.0.6" -source = "git+https://github.com/paritytech/substrate#93a6a53061b9ecb8660c291ab43d083cf51c1f89" +source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" [[package]] name = "substrate-wasm-builder-runner" @@ -8504,6 +8619,16 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "826e7639553986605ec5979c7dd957c7895e93eabed50ab2ffa7f6128a75097c" +[[package]] +name = "universal-hash" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df0c900f2f9b4116803415878ff48b63da9edb268668e08cf9292d7503114a01" +dependencies = [ + "generic-array", + "subtle 2.2.3", +] + [[package]] name = "unsigned-varint" version = "0.3.3" @@ -8513,7 +8638,17 @@ dependencies = [ "bytes 0.5.4", "futures-io", "futures-util", - "futures_codec", + "futures_codec 0.3.4", +] + +[[package]] +name = "unsigned-varint" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "669d776983b692a906c881fcd0cfb34271a48e197e4d6cb8df32b05bfc3d3fa5" +dependencies = [ + "bytes 0.5.4", + "futures_codec 0.4.1", ] [[package]] diff --git a/cli/src/browser.rs b/cli/src/browser.rs index 6f3a400084..becd340530 100644 --- a/cli/src/browser.rs +++ b/cli/src/browser.rs @@ -46,8 +46,8 @@ async fn start_inner(chain_spec: String, log_level: String) -> Result Option { @@ -75,6 +74,16 @@ impl SubstrateCli for Cli { path => Box::new(service::PolkadotChainSpec::from_json_file(std::path::PathBuf::from(path))?), }) } + + fn native_runtime_version(spec: &Box) -> &'static RuntimeVersion { + if spec.is_kusama() { + &service::kusama_runtime::VERSION + } else if spec.is_westend() { + &service::westend_runtime::VERSION + } else { + &service::polkadot_runtime::VERSION + } + } } /// Parses polkadot specific CLI arguments and run the service. @@ -116,56 +125,44 @@ pub fn run() -> Result<()> { info!(" KUSAMA FOUNDATION "); info!("----------------------------"); - runtime.run_node( - |config| { - service::kusama_new_light(config) - }, - |config| { - service::kusama_new_full( - config, - None, - None, - authority_discovery_enabled, - 6000, - grandpa_pause, - ).map(|(s, _, _)| s) - }, - service::KusamaExecutor::native_version().runtime_version - ) + runtime.run_node_until_exit(|config| match config.role { + Role::Light => service::kusama_new_light(config) + .map(|(components, _)| components), + _ => service::kusama_new_full( + config, + None, + None, + authority_discovery_enabled, + 6000, + grandpa_pause, + ).map(|(components, _, _)| components) + }) } else if chain_spec.is_westend() { - runtime.run_node( - |config| { - service::westend_new_light(config) - }, - |config| { - service::westend_new_full( - config, - None, - None, - authority_discovery_enabled, - 6000, - grandpa_pause, - ).map(|(s, _, _)| s) - }, - service::WestendExecutor::native_version().runtime_version - ) + runtime.run_node_until_exit(|config| match config.role { + Role::Light => service::westend_new_light(config) + .map(|(components, _)| components), + _ => service::westend_new_full( + config, + None, + None, + authority_discovery_enabled, + 6000, + grandpa_pause, + ).map(|(components, _, _)| components) + }) } else { - runtime.run_node( - |config| { - service::polkadot_new_light(config) - }, - |config| { - service::polkadot_new_full( - config, - None, - None, - authority_discovery_enabled, - 6000, - grandpa_pause, - ).map(|(s, _, _)| s) - }, - service::PolkadotExecutor::native_version().runtime_version - ) + runtime.run_node_until_exit(|config| match config.role { + Role::Light => service::polkadot_new_light(config) + .map(|(components, _)| components), + _ => service::polkadot_new_full( + config, + None, + None, + authority_discovery_enabled, + 6000, + grandpa_pause, + ).map(|(components, _, _)| components) + }) } }, Some(Subcommand::Base(subcommand)) => { diff --git a/cli/src/lib.rs b/cli/src/lib.rs index be2f3c6cd6..385a24d364 100644 --- a/cli/src/lib.rs +++ b/cli/src/lib.rs @@ -28,14 +28,14 @@ mod command; #[cfg(not(feature = "service-rewr"))] pub use service::{ - AbstractService, ProvideRuntimeApi, CoreApi, ParachainHost, IdentifyVariant, + ProvideRuntimeApi, CoreApi, ParachainHost, IdentifyVariant, Block, self, RuntimeApiCollection, TFullClient }; #[cfg(feature = "service-rewr")] pub use service_new::{ self as service, - AbstractService, ProvideRuntimeApi, CoreApi, ParachainHost, IdentifyVariant, + ProvideRuntimeApi, CoreApi, ParachainHost, IdentifyVariant, Block, self, RuntimeApiCollection, TFullClient }; diff --git a/collator/src/lib.rs b/collator/src/lib.rs index 063bdb1735..e2778238ce 100644 --- a/collator/src/lib.rs +++ b/collator/src/lib.rs @@ -63,7 +63,7 @@ use polkadot_primitives::{ } }; use polkadot_cli::{ - ProvideRuntimeApi, AbstractService, ParachainHost, IdentifyVariant, + ProvideRuntimeApi, ParachainHost, IdentifyVariant, service::{self, Role} }; pub use polkadot_cli::service::Configuration; @@ -386,7 +386,7 @@ where } if config.chain_spec.is_kusama() { - let (service, client, handlers) = service::kusama_new_full( + let (task_manager, client, handlers) = service::kusama_new_full( config, Some((key.public(), para_id)), None, @@ -394,7 +394,7 @@ where 6000, None, )?; - let spawn_handle = service.spawn_task_handle(); + let spawn_handle = task_manager.spawn_handle(); build_collator_service( spawn_handle, handlers, @@ -404,7 +404,7 @@ where build_parachain_context )?.await; } else if config.chain_spec.is_westend() { - let (service, client, handlers) = service::westend_new_full( + let (task_manager, client, handlers) = service::westend_new_full( config, Some((key.public(), para_id)), None, @@ -412,7 +412,7 @@ where 6000, None, )?; - let spawn_handle = service.spawn_task_handle(); + let spawn_handle = task_manager.spawn_handle(); build_collator_service( spawn_handle, handlers, @@ -422,7 +422,7 @@ where build_parachain_context )?.await; } else { - let (service, client, handles) = service::polkadot_new_full( + let (task_manager, client, handles) = service::polkadot_new_full( config, Some((key.public(), para_id)), None, @@ -430,7 +430,7 @@ where 6000, None, )?; - let spawn_handle = service.spawn_task_handle(); + let spawn_handle = task_manager.spawn_handle(); build_collator_service( spawn_handle, handles, diff --git a/node/service/src/lib.rs b/node/service/src/lib.rs index 620850b3bd..2c3d77605e 100644 --- a/node/service/src/lib.rs +++ b/node/service/src/lib.rs @@ -35,9 +35,9 @@ use polkadot_overseer::{ CandidateValidationMessage, CandidateBackingMessage, }; pub use service::{ - AbstractService, Role, PruningMode, TransactionPoolOptions, Error, RuntimeGenesis, + Role, PruningMode, TransactionPoolOptions, Error, RuntimeGenesis, TFullClient, TLightClient, TFullBackend, TLightBackend, TFullCallExecutor, TLightCallExecutor, - Configuration, ChainSpec, ServiceBuilderCommand, + Configuration, ChainSpec, ServiceBuilderCommand, ServiceComponents, TaskManager, }; pub use service::config::{DatabaseConfig, PrometheusConfig}; pub use sc_executor::NativeExecutionDispatch; @@ -321,7 +321,10 @@ macro_rules! new_full { let (builder, mut import_setup, inherent_data_providers, mut rpc_setup) = new_full_start!($config, $runtime, $dispatch); - let service = builder + let ServiceComponents { + client, network, select_chain, keystore, transaction_pool, prometheus_registry, + task_manager, telemetry_on_connect_sinks, .. + } = builder .with_finality_proof_provider(|client, backend| { let provider = client as Arc>; Ok(Arc::new(GrandpaFinalityProofProvider::new(backend, provider)) as _) @@ -334,11 +337,9 @@ macro_rules! new_full { let shared_voter_state = rpc_setup.take() .expect("The SharedVoterState is present for Full Services or setup failed before. qed"); - let client = service.client(); - - let overseer_client = service.client(); - let spawner = service.spawn_task_handle(); - let leaves: Vec<_> = service.select_chain().ok_or(ServiceError::SelectChainRequired)? + let overseer_client = client.clone(); + let spawner = task_manager.spawn_handle(); + let leaves: Vec<_> = select_chain.clone().ok_or(ServiceError::SelectChainRequired)? .leaves() .unwrap_or_else(|_| vec![]) .into_iter() @@ -356,7 +357,7 @@ macro_rules! new_full { let (overseer, handler) = real_overseer(leaves, spawner)?; - service.spawn_essential_task_handle().spawn("overseer", Box::pin(async move { + task_manager.spawn_essential_handle().spawn_blocking("overseer", Box::pin(async move { use futures::{pin_mut, select, FutureExt}; let forward = overseer::forward_events(overseer_client, handler); @@ -377,24 +378,24 @@ macro_rules! new_full { })); if role.is_authority() { - let select_chain = service.select_chain().ok_or(ServiceError::SelectChainRequired)?; + let select_chain = select_chain.ok_or(ServiceError::SelectChainRequired)?; let can_author_with = consensus_common::CanAuthorWithNativeVersion::new(client.executor().clone()); // TODO: custom proposer (https://github.com/paritytech/polkadot/issues/1248) let proposer = sc_basic_authorship::ProposerFactory::new( client.clone(), - service.transaction_pool(), + transaction_pool, None, ); let babe_config = babe::BabeParams { - keystore: service.keystore(), + keystore: keystore.clone(), client: client.clone(), select_chain, block_import, env: proposer, - sync_oracle: service.network(), + sync_oracle: network.clone(), inherent_data_providers: inherent_data_providers.clone(), force_authoring, babe_link, @@ -402,13 +403,13 @@ macro_rules! new_full { }; let babe = babe::start_babe(babe_config)?; - service.spawn_essential_task_handle().spawn_blocking("babe", babe); + task_manager.spawn_essential_handle().spawn_blocking("babe", babe); } // if the node isn't actively participating in consensus then it doesn't // need a keystore, regardless of which protocol we use below. let keystore = if is_authority { - Some(service.keystore() as BareCryptoStorePtr) + Some(keystore.clone() as BareCryptoStorePtr) } else { None }; @@ -454,15 +455,15 @@ macro_rules! new_full { let grandpa_config = grandpa::GrandpaParams { config, link: link_half, - network: service.network(), + network: network.clone(), inherent_data_providers: inherent_data_providers.clone(), - telemetry_on_connect: Some(service.telemetry_on_connect_stream()), + telemetry_on_connect: Some(telemetry_on_connect_sinks.on_connect_stream()), voting_rule, - prometheus_registry: service.prometheus_registry(), + prometheus_registry: prometheus_registry, shared_voter_state, }; - service.spawn_essential_task_handle().spawn_blocking( + task_manager.spawn_essential_handle().spawn_blocking( "grandpa-voter", grandpa::run_grandpa_voter(grandpa_config)? ); @@ -470,11 +471,11 @@ macro_rules! new_full { grandpa::setup_disabled_grandpa( client.clone(), &inherent_data_providers, - service.network(), + network.clone(), )?; } - (service, client) + (task_manager, client) }} } @@ -566,6 +567,7 @@ macro_rules! new_light { Ok(polkadot_rpc::create_light(light_deps)) })? .build_light() + .map(|ServiceComponents { task_manager, .. }| task_manager) }} } @@ -595,7 +597,7 @@ pub fn polkadot_new_full( grandpa_pause: Option<(u32, u32)>, ) -> Result<( - impl AbstractService, + TaskManager, Arc, @@ -604,7 +606,7 @@ pub fn polkadot_new_full( FullNodeHandles, ), ServiceError> { - let (service, client) = new_full!( + let (components, client) = new_full!( config, collating_for, authority_discovery_enabled, @@ -613,7 +615,7 @@ pub fn polkadot_new_full( PolkadotExecutor, ); - Ok((service, client, FullNodeHandles)) + Ok((components, client, FullNodeHandles)) } /// Create a new Kusama service for a full node. @@ -626,7 +628,7 @@ pub fn kusama_new_full( _slot_duration: u64, grandpa_pause: Option<(u32, u32)>, ) -> Result<( - impl AbstractService, + TaskManager, Arc, @@ -636,7 +638,7 @@ pub fn kusama_new_full( FullNodeHandles, ), ServiceError> { - let (service, client) = new_full!( + let (components, client) = new_full!( config, collating_for, authority_discovery_enabled, @@ -645,7 +647,7 @@ pub fn kusama_new_full( KusamaExecutor, ); - Ok((service, client, FullNodeHandles)) + Ok((components, client, FullNodeHandles)) } /// Create a new Kusama service for a full node. @@ -659,7 +661,7 @@ pub fn westend_new_full( grandpa_pause: Option<(u32, u32)>, ) -> Result<( - impl AbstractService, + TaskManager, Arc, @@ -668,7 +670,7 @@ pub fn westend_new_full( FullNodeHandles, ), ServiceError> { - let (service, client) = new_full!( + let (components, client) = new_full!( config, collating_for, authority_discovery_enabled, @@ -677,45 +679,23 @@ pub fn westend_new_full( WestendExecutor, ); - Ok((service, client, FullNodeHandles)) + Ok((components, client, FullNodeHandles)) } /// Create a new Polkadot service for a light client. -pub fn polkadot_new_light(mut config: Configuration) -> Result< - impl AbstractService< - Block = Block, - RuntimeApi = polkadot_runtime::RuntimeApi, - Backend = TLightBackend, - SelectChain = LongestChain, Block>, - CallExecutor = TLightCallExecutor, - >, ServiceError> +pub fn polkadot_new_light(mut config: Configuration) -> Result { new_light!(config, polkadot_runtime::RuntimeApi, PolkadotExecutor) } /// Create a new Kusama service for a light client. -pub fn kusama_new_light(mut config: Configuration) -> Result< - impl AbstractService< - Block = Block, - RuntimeApi = kusama_runtime::RuntimeApi, - Backend = TLightBackend, - SelectChain = LongestChain, Block>, - CallExecutor = TLightCallExecutor, - >, ServiceError> +pub fn kusama_new_light(mut config: Configuration) -> Result { new_light!(config, kusama_runtime::RuntimeApi, KusamaExecutor) } /// Create a new Westend service for a light client. -pub fn westend_new_light(mut config: Configuration, ) -> Result< - impl AbstractService< - Block = Block, - RuntimeApi = westend_runtime::RuntimeApi, - Backend = TLightBackend, - SelectChain = LongestChain, Block>, - CallExecutor = TLightCallExecutor - >, - ServiceError> +pub fn westend_new_light(mut config: Configuration, ) -> Result { new_light!(config, westend_runtime::RuntimeApi, KusamaExecutor) } diff --git a/service/src/lib.rs b/service/src/lib.rs index 82e8460437..5cf371ebec 100644 --- a/service/src/lib.rs +++ b/service/src/lib.rs @@ -30,9 +30,9 @@ use grandpa::{self, FinalityProofProvider as GrandpaFinalityProofProvider}; use sc_executor::native_executor_instance; use log::info; pub use service::{ - AbstractService, Role, PruningMode, TransactionPoolOptions, Error, RuntimeGenesis, + Role, PruningMode, TransactionPoolOptions, Error, RuntimeGenesis, RpcHandlers, TFullClient, TLightClient, TFullBackend, TLightBackend, TFullCallExecutor, TLightCallExecutor, - Configuration, ChainSpec, ServiceBuilderCommand, + Configuration, ChainSpec, ServiceBuilderCommand, ServiceComponents, TaskManager, }; pub use service::config::{DatabaseConfig, PrometheusConfig}; pub use sc_executor::NativeExecutionDispatch; @@ -298,7 +298,10 @@ macro_rules! new_full { let (builder, mut import_setup, inherent_data_providers, mut rpc_setup) = new_full_start!($config, $runtime, $dispatch); - let service = builder + let ServiceComponents { + client, network, select_chain, keystore, transaction_pool, prometheus_registry, + task_manager, telemetry_on_connect_sinks, .. + } = builder .with_finality_proof_provider(|client, backend| { let provider = client as Arc>; Ok(Arc::new(GrandpaFinalityProofProvider::new(backend, provider)) as _) @@ -311,16 +314,10 @@ macro_rules! new_full { let shared_voter_state = rpc_setup.take() .expect("The SharedVoterState is present for Full Services or setup failed before. qed"); - let client = service.client(); let known_oracle = client.clone(); let mut handles = FullNodeHandles::default(); - let select_chain = if let Some(select_chain) = service.select_chain() { - select_chain - } else { - info!("The node cannot start as an authority because it can't select chain."); - return Ok((service, client, handles)); - }; + let select_chain = select_chain.ok_or(ServiceError::SelectChainRequired)?; let gossip_validator_select_chain = select_chain.clone(); let is_known = move |block_hash: &Hash| { @@ -343,13 +340,13 @@ macro_rules! new_full { }; let polkadot_network_service = network_protocol::start( - service.network(), + network.clone(), network_protocol::Config { collating_for: $collating_for, }, (is_known, client.clone()), client.clone(), - service.spawn_task_handle(), + task_manager.spawn_handle(), ).map_err(|e| format!("Could not spawn network worker: {:?}", e))?; let authority_handles = if is_collator || role.is_authority() { @@ -380,14 +377,14 @@ macro_rules! new_full { client: client.clone(), network: polkadot_network_service.clone(), collators: polkadot_network_service.clone(), - spawner: service.spawn_task_handle(), + spawner: task_manager.spawn_handle(), availability_store: availability_store.clone(), select_chain: select_chain.clone(), - keystore: service.keystore(), + keystore: keystore.clone(), max_block_data_size, }.build(); - service.spawn_essential_task_handle().spawn("validation-service", Box::pin(validation_service)); + task_manager.spawn_essential_handle().spawn("validation-service", Box::pin(validation_service)); handles.validation_service_handle = Some(validation_service_handle.clone()); @@ -403,30 +400,29 @@ macro_rules! new_full { let proposer = consensus::ProposerFactory::new( client.clone(), - service.transaction_pool(), + transaction_pool, validation_service_handle, slot_duration, - service.prometheus_registry().as_ref(), + prometheus_registry.as_ref(), ); - let select_chain = service.select_chain().ok_or(ServiceError::SelectChainRequired)?; let can_author_with = consensus_common::CanAuthorWithNativeVersion::new(client.executor().clone()); let block_import = availability_store.block_import( block_import, client.clone(), - service.spawn_task_handle(), - service.keystore(), + task_manager.spawn_handle(), + keystore.clone(), )?; let babe_config = babe::BabeParams { - keystore: service.keystore(), + keystore: keystore.clone(), client: client.clone(), select_chain, block_import, env: proposer, - sync_oracle: service.network(), + sync_oracle: network.clone(), inherent_data_providers: inherent_data_providers.clone(), force_authoring, babe_link, @@ -434,7 +430,7 @@ macro_rules! new_full { }; let babe = babe::start_babe(babe_config)?; - service.spawn_essential_task_handle().spawn_blocking("babe", babe); + task_manager.spawn_essential_handle().spawn_blocking("babe", babe); } if matches!(role, Role::Authority{..} | Role::Sentry{..}) { @@ -443,7 +439,7 @@ macro_rules! new_full { Role::Authority { ref sentry_nodes } => ( sentry_nodes.clone(), authority_discovery::Role::Authority ( - service.keystore(), + keystore.clone(), ), ), Role::Sentry {..} => ( @@ -453,29 +449,28 @@ macro_rules! new_full { _ => unreachable!("Due to outer matches! constraint; qed."), }; - let network = service.network(); let network_event_stream = network.event_stream("authority-discovery"); let dht_event_stream = network_event_stream.filter_map(|e| async move { match e { Event::Dht(e) => Some(e), _ => None, }}).boxed(); let authority_discovery = authority_discovery::AuthorityDiscovery::new( - service.client(), - network, + client.clone(), + network.clone(), sentries, dht_event_stream, authority_discovery_role, - service.prometheus_registry(), + prometheus_registry.clone(), ); - service.spawn_task_handle().spawn("authority-discovery", authority_discovery); + task_manager.spawn_handle().spawn("authority-discovery", authority_discovery); } } // if the node isn't actively participating in consensus then it doesn't // need a keystore, regardless of which protocol we use below. let keystore = if is_authority { - Some(service.keystore() as BareCryptoStorePtr) + Some(keystore as BareCryptoStorePtr) } else { None }; @@ -521,15 +516,15 @@ macro_rules! new_full { let grandpa_config = grandpa::GrandpaParams { config, link: link_half, - network: service.network(), + network: network.clone(), inherent_data_providers: inherent_data_providers.clone(), - telemetry_on_connect: Some(service.telemetry_on_connect_stream()), + telemetry_on_connect: Some(telemetry_on_connect_sinks.on_connect_stream()), voting_rule, - prometheus_registry: service.prometheus_registry(), + prometheus_registry: prometheus_registry.clone(), shared_voter_state, }; - service.spawn_essential_task_handle().spawn_blocking( + task_manager.spawn_essential_handle().spawn_blocking( "grandpa-voter", grandpa::run_grandpa_voter(grandpa_config)? ); @@ -537,12 +532,12 @@ macro_rules! new_full { grandpa::setup_disabled_grandpa( client.clone(), &inherent_data_providers, - service.network(), + network.clone(), )?; } handles.polkadot_network = Some(polkadot_network_service); - (service, client, handles) + (task_manager, client, handles) }} } @@ -632,6 +627,9 @@ macro_rules! new_light { Ok(polkadot_rpc::create_light(light_deps)) })? .build_light() + .map(|ServiceComponents { task_manager, rpc_handlers, .. }| { + (task_manager, rpc_handlers) + }) }} } @@ -661,7 +659,7 @@ pub fn polkadot_new_full( grandpa_pause: Option<(u32, u32)>, ) -> Result<( - impl AbstractService, + TaskManager, Arc, @@ -694,7 +692,7 @@ pub fn kusama_new_full( slot_duration: u64, grandpa_pause: Option<(u32, u32)>, ) -> Result<( - impl AbstractService, + TaskManager, Arc, @@ -729,7 +727,7 @@ pub fn westend_new_full( grandpa_pause: Option<(u32, u32)>, ) -> Result<( - impl AbstractService, + TaskManager, Arc, @@ -765,40 +763,24 @@ pub struct FullNodeHandles { /// Create a new Polkadot service for a light client. pub fn polkadot_new_light(mut config: Configuration) -> Result< - impl AbstractService< - Block = Block, - RuntimeApi = polkadot_runtime::RuntimeApi, - Backend = TLightBackend, - SelectChain = LongestChain, Block>, - CallExecutor = TLightCallExecutor, - >, ServiceError> + (TaskManager, Arc), ServiceError +> { new_light!(config, polkadot_runtime::RuntimeApi, PolkadotExecutor) } /// Create a new Kusama service for a light client. pub fn kusama_new_light(mut config: Configuration) -> Result< - impl AbstractService< - Block = Block, - RuntimeApi = kusama_runtime::RuntimeApi, - Backend = TLightBackend, - SelectChain = LongestChain, Block>, - CallExecutor = TLightCallExecutor, - >, ServiceError> + (TaskManager, Arc), ServiceError +> { new_light!(config, kusama_runtime::RuntimeApi, KusamaExecutor) } /// Create a new Westend service for a light client. pub fn westend_new_light(mut config: Configuration, ) -> Result< - impl AbstractService< - Block = Block, - RuntimeApi = westend_runtime::RuntimeApi, - Backend = TLightBackend, - SelectChain = LongestChain, Block>, - CallExecutor = TLightCallExecutor - >, - ServiceError> + (TaskManager, Arc), ServiceError +> { new_light!(config, westend_runtime::RuntimeApi, KusamaExecutor) } -- GitLab From 7aa95b191aa12f70741445a4144972b0536cc916 Mon Sep 17 00:00:00 2001 From: Peter Goodspeed-Niklaus Date: Tue, 30 Jun 2020 17:07:59 +0200 Subject: [PATCH 019/192] impl ProvideInherent for InclusionInherent (#1318) * impl ProvideInherent for InclusionInherent * reduce import churn; correct expect message * move inclusion inherent identifier into primitives It's not clear precisely why this is desired, but it's a pattern I've seen in several places, so I'm going this to be on the safe side. Worst case, we can revert this commit pretty easily. * bump kusama spec_version to placate CI * add license header * empty commit; maybe github will notice the one with changes * add sanity check to only include valid inherents --- primitives/src/inclusion_inherent.rs | 23 +++++++++++++++ primitives/src/lib.rs | 1 + primitives/src/parachain.rs | 6 ++++ runtime/parachains/src/inclusion_inherent.rs | 31 ++++++++++++++++++-- 4 files changed, 58 insertions(+), 3 deletions(-) create mode 100644 primitives/src/inclusion_inherent.rs diff --git a/primitives/src/inclusion_inherent.rs b/primitives/src/inclusion_inherent.rs new file mode 100644 index 0000000000..ca3f5ec23a --- /dev/null +++ b/primitives/src/inclusion_inherent.rs @@ -0,0 +1,23 @@ +// Copyright 2017-2020 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 . + +//! Inclusion Inherent primitives define types and constants which can be imported +//! without needing to import the entire inherent module. + +use inherents::InherentIdentifier; + +/// Unique identifier for the Inclusion Inherent +pub const INHERENT_IDENTIFIER: InherentIdentifier = *b"inclusn0"; diff --git a/primitives/src/lib.rs b/primitives/src/lib.rs index 9167d9910e..24ed6e1eb3 100644 --- a/primitives/src/lib.rs +++ b/primitives/src/lib.rs @@ -23,6 +23,7 @@ use runtime_primitives::{generic, MultiSignature}; pub use runtime_primitives::traits::{BlakeTwo256, Hash as HashT, Verify, IdentifyAccount}; +pub mod inclusion_inherent; pub mod parachain; pub use parity_scale_codec::Compact; diff --git a/primitives/src/parachain.rs b/primitives/src/parachain.rs index a24cb5b612..52306174be 100644 --- a/primitives/src/parachain.rs +++ b/primitives/src/parachain.rs @@ -722,6 +722,12 @@ pub type SignedAvailabilityBitfield = Signed; #[derive(Encode, Decode, Clone, PartialEq, Eq, RuntimeDebug)] pub struct SignedAvailabilityBitfields(pub Vec); +impl From> for SignedAvailabilityBitfields { + fn from(fields: Vec) -> SignedAvailabilityBitfields { + SignedAvailabilityBitfields(fields) + } +} + /// A backed (or backable, depending on context) candidate. // TODO: yes, this is roughly the same as AttestedCandidate. // After https://github.com/paritytech/polkadot/issues/1250 diff --git a/runtime/parachains/src/inclusion_inherent.rs b/runtime/parachains/src/inclusion_inherent.rs index 46fe1fee46..ac092f6b48 100644 --- a/runtime/parachains/src/inclusion_inherent.rs +++ b/runtime/parachains/src/inclusion_inherent.rs @@ -23,18 +23,23 @@ use sp_std::prelude::*; use primitives::{ + inclusion_inherent, parachain::{BackedCandidate, SignedAvailabilityBitfields}, }; use frame_support::{ - decl_storage, decl_module, decl_error, ensure, + decl_error, decl_module, decl_storage, ensure, dispatch::DispatchResult, weights::{DispatchClass, Weight}, traits::Get, }; use system::ensure_none; -use crate::{inclusion, scheduler::{self, FreedReason}}; +use crate::{ + inclusion, + scheduler::{self, FreedReason}, +}; +use inherents::{InherentIdentifier, InherentData, MakeFatalError, ProvideInherent}; -pub trait Trait: inclusion::Trait + scheduler::Trait { } +pub trait Trait: inclusion::Trait + scheduler::Trait {} decl_storage! { trait Store for Module as ParaInclusionInherent { @@ -118,3 +123,23 @@ decl_module! { } } } + +impl ProvideInherent for Module { + type Call = Call; + type Error = MakeFatalError<()>; + const INHERENT_IDENTIFIER: InherentIdentifier = inclusion_inherent::INHERENT_IDENTIFIER; + + fn create_inherent(data: &InherentData) -> Option { + data.get_data(&Self::INHERENT_IDENTIFIER) + .expect("inclusion inherent data failed to decode") + .map(|(signed_bitfields, backed_candidates): (SignedAvailabilityBitfields, Vec>)| { + // Sanity check: session changes can invalidate an inherent, and we _really_ don't want that to happen. + // See github.com/paritytech/polkadot/issues/1327 + if Self::inclusion(system::RawOrigin::None.into(), signed_bitfields.clone(), backed_candidates.clone()).is_ok() { + Call::inclusion(signed_bitfields, backed_candidates) + } else { + Call::inclusion(Vec::new().into(), Vec::new()) + } + }) + } +} -- GitLab From eaae865331b85b8336a6f2774c82c7c152b8b142 Mon Sep 17 00:00:00 2001 From: Robert Habermeier Date: Tue, 30 Jun 2020 11:21:40 -0400 Subject: [PATCH 020/192] Implement Network Bridge (#1280) * network bridge skeleton * move some primitives around and add debug impls * protocol registration glue & abstract network interface * add send_msgs to subsystemctx * select logic * transform different events into actions and handle * implement remaining network bridge state machine * start test skeleton * make network methods asynchronous * extract subsystem out to subsystem crate * port over overseer to subsystem context trait * fix minimal example * fix overseer doc test * update network-bridge crate * write a subsystem test-helpers crate * write a network test helper for network-bridge * set up (broken) view test * Revamp network to be more async-friendly and not require Sync * fix spacing * fix test compilation * insert side-channel for actions * Add some more message types to AllMessages * introduce a test harness * add some tests * ensure service compiles and passes tests * fix typo * fix service-new compilation * Subsystem test helpers send messages synchronously * remove smelly action inspector * remove superfluous let binding * fix warnings * Update node/network/bridge/src/lib.rs Co-authored-by: Peter Goodspeed-Niklaus * fix compilation Co-authored-by: Peter Goodspeed-Niklaus --- Cargo.lock | 60 +- Cargo.toml | 4 +- node/network/bridge/Cargo.toml | 22 + node/network/bridge/src/lib.rs | 912 ++++++++++++++++++ node/overseer/Cargo.toml | 3 +- node/overseer/examples/minimal-example.rs | 25 +- node/overseer/src/lib.rs | 176 ++-- node/primitives/Cargo.toml | 1 + node/primitives/src/lib.rs | 10 + node/service/Cargo.toml | 1 + node/service/src/lib.rs | 20 +- node/{messages => subsystem}/Cargo.toml | 5 +- node/subsystem/src/lib.rs | 150 +++ .../src/lib.rs => subsystem/src/messages.rs} | 64 +- node/test-helpers/subsystem/Cargo.toml | 12 + node/test-helpers/subsystem/src/lib.rs | 229 +++++ 16 files changed, 1529 insertions(+), 165 deletions(-) create mode 100644 node/network/bridge/Cargo.toml create mode 100644 node/network/bridge/src/lib.rs rename node/{messages => subsystem}/Cargo.toml (77%) create mode 100644 node/subsystem/src/lib.rs rename node/{messages/src/lib.rs => subsystem/src/messages.rs} (87%) create mode 100644 node/test-helpers/subsystem/Cargo.toml create mode 100644 node/test-helpers/subsystem/src/lib.rs diff --git a/Cargo.lock b/Cargo.lock index b1a7eba99d..ed39f79eab 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -256,6 +256,17 @@ dependencies = [ "webpki-roots 0.19.0", ] +[[package]] +name = "async-trait" +version = "0.1.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a265e3abeffdce30b2e26b7a11b222fe37c6067404001b434101457d0385eb92" +dependencies = [ + "proc-macro2 1.0.18", + "quote 1.0.7", + "syn 1.0.31", +] + [[package]] name = "atty" version = "0.2.14" @@ -4348,6 +4359,25 @@ dependencies = [ "wasm-timer", ] +[[package]] +name = "polkadot-network-bridge" +version = "0.1.0" +dependencies = [ + "assert_matches", + "futures 0.3.5", + "futures-timer 3.0.2", + "log 0.4.8", + "parity-scale-codec", + "parking_lot 0.10.2", + "polkadot-node-primitives", + "polkadot-node-subsystem", + "polkadot-primitives", + "polkadot-subsystem-test-helpers", + "sc-network", + "sp-runtime", + "streamunordered", +] + [[package]] name = "polkadot-network-test" version = "0.8.13" @@ -4370,36 +4400,39 @@ dependencies = [ ] [[package]] -name = "polkadot-node-messages" +name = "polkadot-node-primitives" version = "0.1.0" dependencies = [ - "futures 0.3.5", - "polkadot-node-primitives", + "async-trait", + "parity-scale-codec", "polkadot-primitives", "polkadot-statement-table", - "sc-network", + "sp-runtime", ] [[package]] -name = "polkadot-node-primitives" +name = "polkadot-node-subsystem" version = "0.1.0" dependencies = [ - "parity-scale-codec", + "async-trait", + "futures 0.3.5", + "polkadot-node-primitives", "polkadot-primitives", "polkadot-statement-table", - "sp-runtime", + "sc-network", ] [[package]] name = "polkadot-overseer" version = "0.1.0" dependencies = [ + "async-trait", "femme", "futures 0.3.5", "futures-timer 3.0.2", "kv-log-macro", "log 0.4.8", - "polkadot-node-messages", + "polkadot-node-subsystem", "polkadot-primitives", "sc-client-api", "streamunordered", @@ -4711,6 +4744,7 @@ dependencies = [ "parity-scale-codec", "parking_lot 0.9.0", "polkadot-network", + "polkadot-node-subsystem", "polkadot-overseer", "polkadot-primitives", "polkadot-rpc", @@ -4760,6 +4794,16 @@ dependencies = [ "sp-core", ] +[[package]] +name = "polkadot-subsystem-test-helpers" +version = "0.1.0" +dependencies = [ + "async-trait", + "futures 0.3.5", + "parking_lot 0.10.2", + "polkadot-node-subsystem", +] + [[package]] name = "polkadot-test-runtime" version = "0.8.13" diff --git a/Cargo.toml b/Cargo.toml index 34f9f14e4e..4a72ae8dc6 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -42,10 +42,12 @@ members = [ "service", "validation", - "node/messages", + "node/network/bridge", "node/overseer", "node/primitives", "node/service", + "node/subsystem", + "node/test-helpers/subsystem", "parachain/test-parachains", "parachain/test-parachains/adder", diff --git a/node/network/bridge/Cargo.toml b/node/network/bridge/Cargo.toml new file mode 100644 index 0000000000..4f6c8631e2 --- /dev/null +++ b/node/network/bridge/Cargo.toml @@ -0,0 +1,22 @@ +[package] +name = "polkadot-network-bridge" +version = "0.1.0" +authors = ["Parity Technologies "] +edition = "2018" + +[dependencies] +futures = "0.3.5" +log = "0.4.8" +futures-timer = "3.0.2" +streamunordered = "0.5.1" +polkadot-primitives = { path = "../../../primitives" } +node-primitives = { package = "polkadot-node-primitives", path = "../../primitives" } +parity-scale-codec = "1.3.0" +sc-network = { git = "https://github.com/paritytech/substrate", branch = "master" } +sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "master" } +polkadot-subsystem = { package = "polkadot-node-subsystem", path = "../../subsystem" } + +[dev-dependencies] +parking_lot = "0.10.0" +subsystem-test = { package = "polkadot-subsystem-test-helpers", path = "../../test-helpers/subsystem" } +assert_matches = "1.3.0" diff --git a/node/network/bridge/src/lib.rs b/node/network/bridge/src/lib.rs new file mode 100644 index 0000000000..aef1632a94 --- /dev/null +++ b/node/network/bridge/src/lib.rs @@ -0,0 +1,912 @@ +// Copyright 2020 Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Polkadot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . + +//! The Network Bridge Subsystem - protocol multiplexer for Polkadot. + +use parity_scale_codec::{Encode, Decode}; +use futures::prelude::*; +use futures::future::BoxFuture; +use futures::stream::BoxStream; + +use sc_network::{ + ObservedRole, ReputationChange, PeerId, + Event as NetworkEvent, +}; +use sp_runtime::ConsensusEngineId; + +use polkadot_subsystem::{ + FromOverseer, OverseerSignal, Subsystem, SubsystemContext, SpawnedSubsystem, SubsystemError, + SubsystemResult, +}; +use polkadot_subsystem::messages::{NetworkBridgeEvent, NetworkBridgeMessage, AllMessages}; +use node_primitives::{ProtocolId, View}; +use polkadot_primitives::{Block, Hash}; + +use std::collections::btree_map::{BTreeMap, Entry as BEntry}; +use std::collections::hash_map::{HashMap, Entry as HEntry}; +use std::pin::Pin; +use std::sync::Arc; + +/// The maximum amount of heads a peer is allowed to have in their view at any time. +/// +/// We use the same limit to compute the view sent to peers locally. +const MAX_VIEW_HEADS: usize = 5; + +/// The engine ID of the polkadot network protocol. +pub const POLKADOT_ENGINE_ID: ConsensusEngineId = *b"dot2"; +/// The protocol name. +pub const POLKADOT_PROTOCOL_NAME: &[u8] = b"/polkadot/2"; + +const MALFORMED_MESSAGE_COST: ReputationChange + = ReputationChange::new(-500, "Malformed Network-bridge message"); +const UNKNOWN_PROTO_COST: ReputationChange + = ReputationChange::new(-50, "Message sent to unknown protocol"); +const MALFORMED_VIEW_COST: ReputationChange + = ReputationChange::new(-500, "Malformed view"); + +/// Messages received on the network. +#[derive(Debug, Encode, Decode, Clone)] +pub enum WireMessage { + /// A message from a peer on a specific protocol. + #[codec(index = "1")] + ProtocolMessage(ProtocolId, Vec), + /// A view update from a peer. + #[codec(index = "2")] + ViewUpdate(View), +} + +/// Information about the notifications protocol. Should be used during network configuration +/// or shortly after startup to register the protocol with the network service. +pub fn notifications_protocol_info() -> (ConsensusEngineId, std::borrow::Cow<'static, [u8]>) { + (POLKADOT_ENGINE_ID, POLKADOT_PROTOCOL_NAME.into()) +} + +/// An action to be carried out by the network. +#[derive(PartialEq)] +pub enum NetworkAction { + /// Note a change in reputation for a peer. + ReputationChange(PeerId, ReputationChange), + /// Write a notification to a given peer. + WriteNotification(PeerId, Vec), +} + +/// An abstraction over networking for the purposes of this subsystem. +pub trait Network: Send + 'static { + /// Get a stream of all events occurring on the network. This may include events unrelated + /// to the Polkadot protocol - the user of this function should filter only for events related + /// to the [`POLKADOT_ENGINE_ID`](POLKADOT_ENGINE_ID). + fn event_stream(&mut self) -> BoxStream<'static, NetworkEvent>; + + /// Get access to an underlying sink for all network actions. + fn action_sink<'a>(&'a mut self) -> Pin< + Box + Send + 'a> + >; + + /// Report a given peer as either beneficial (+) or costly (-) according to the given scalar. + fn report_peer(&mut self, who: PeerId, cost_benefit: ReputationChange) + -> BoxFuture> + { + async move { + self.action_sink().send(NetworkAction::ReputationChange(who, cost_benefit)).await + }.boxed() + } + + /// Write a notification to a peer on the [`POLKADOT_ENGINE_ID`](POLKADOT_ENGINE_ID) topic. + fn write_notification(&mut self, who: PeerId, message: Vec) + -> BoxFuture> + { + async move { + self.action_sink().send(NetworkAction::WriteNotification(who, message)).await + }.boxed() + } +} + +impl Network for Arc> { + fn event_stream(&mut self) -> BoxStream<'static, NetworkEvent> { + sc_network::NetworkService::event_stream(self, "polkadot-network-bridge").boxed() + } + + fn action_sink<'a>(&'a mut self) + -> Pin + Send + 'a>> + { + use futures::task::{Poll, Context}; + + // wrapper around a NetworkService to make it act like a sink. + struct ActionSink<'b>(&'b sc_network::NetworkService); + + impl<'b> Sink for ActionSink<'b> { + type Error = SubsystemError; + + fn poll_ready(self: Pin<&mut Self>, _: &mut Context) -> Poll> { + Poll::Ready(Ok(())) + } + + fn start_send(self: Pin<&mut Self>, action: NetworkAction) -> SubsystemResult<()> { + match action { + NetworkAction::ReputationChange(peer, cost_benefit) => self.0.report_peer( + peer, + cost_benefit, + ), + NetworkAction::WriteNotification(peer, message) => self.0.write_notification( + peer, + POLKADOT_ENGINE_ID, + message, + ), + } + + Ok(()) + } + + fn poll_flush(self: Pin<&mut Self>, _: &mut Context) -> Poll> { + Poll::Ready(Ok(())) + } + + fn poll_close(self: Pin<&mut Self>, _: &mut Context) -> Poll> { + Poll::Ready(Ok(())) + } + } + + Box::pin(ActionSink(&**self)) + } +} + +/// The network bridge subsystem. +pub struct NetworkBridge(Option); + +impl NetworkBridge { + /// Create a new network bridge subsystem with underlying network service. + /// + /// This assumes that the network service has had the notifications protocol for the network + /// bridge already registered. See [`notifications_protocol_info`](notifications_protocol_info). + pub fn new(net_service: N) -> Self { + NetworkBridge(Some(net_service)) + } +} + +impl Subsystem for NetworkBridge + where + Net: Network, + Context: SubsystemContext, +{ + fn start(&mut self, mut ctx: Context) -> SpawnedSubsystem { + SpawnedSubsystem(match self.0.take() { + None => async move { for _ in ctx.recv().await { } }.boxed(), + Some(net) => { + // Swallow error because failure is fatal to the node and we log with more precision + // within `run_network`. + run_network(net, ctx).map(|_| ()).boxed() + } + }) + + + + } +} + +struct PeerData { + /// Latest view sent by the peer. + view: View, + /// The role of the peer. + role: ObservedRole, +} + +#[derive(Debug)] +enum Action { + RegisterEventProducer(ProtocolId, fn(NetworkBridgeEvent) -> AllMessages), + SendMessage(Vec, ProtocolId, Vec), + ReportPeer(PeerId, ReputationChange), + StartWork(Hash), + StopWork(Hash), + + PeerConnected(PeerId, ObservedRole), + PeerDisconnected(PeerId), + PeerMessages(PeerId, Vec), + + Abort, +} + +fn action_from_overseer_message( + res: polkadot_subsystem::SubsystemResult>, +) -> Action { + match res { + Ok(FromOverseer::Signal(OverseerSignal::StartWork(relay_parent))) + => Action::StartWork(relay_parent), + Ok(FromOverseer::Signal(OverseerSignal::StopWork(relay_parent))) + => Action::StopWork(relay_parent), + Ok(FromOverseer::Signal(OverseerSignal::Conclude)) => Action::Abort, + Ok(FromOverseer::Communication { msg }) => match msg { + NetworkBridgeMessage::RegisterEventProducer(protocol_id, message_producer) + => Action::RegisterEventProducer(protocol_id, message_producer), + NetworkBridgeMessage::ReportPeer(peer, rep) => Action::ReportPeer(peer, rep), + NetworkBridgeMessage::SendMessage(peers, protocol, message) + => Action::SendMessage(peers, protocol, message), + }, + Err(e) => { + log::warn!("Shutting down Network Bridge due to error {:?}", e); + Action::Abort + } + } +} + +fn action_from_network_message(event: Option) -> Option { + match event { + None => { + log::info!("Shutting down Network Bridge: underlying event stream concluded"); + Some(Action::Abort) + } + Some(NetworkEvent::Dht(_)) => None, + Some(NetworkEvent::NotificationStreamOpened { remote, engine_id, role }) => { + if engine_id == POLKADOT_ENGINE_ID { + Some(Action::PeerConnected(remote, role)) + } else { + None + } + } + Some(NetworkEvent::NotificationStreamClosed { remote, engine_id }) => { + if engine_id == POLKADOT_ENGINE_ID { + Some(Action::PeerDisconnected(remote)) + } else { + None + } + } + Some(NetworkEvent::NotificationsReceived { remote, messages }) => { + let v: Result, _> = messages.iter() + .filter(|(engine_id, _)| engine_id == &POLKADOT_ENGINE_ID) + .map(|(_, msg_bytes)| WireMessage::decode(&mut msg_bytes.as_ref())) + .collect(); + + match v { + Err(_) => Some(Action::ReportPeer(remote, MALFORMED_MESSAGE_COST)), + Ok(v) => if v.is_empty() { + None + } else { + Some(Action::PeerMessages(remote, v)) + } + } + } + } +} + +fn construct_view(live_heads: &[Hash]) -> View { + View(live_heads.iter().rev().take(MAX_VIEW_HEADS).cloned().collect()) +} + +async fn dispatch_update_to_all( + update: NetworkBridgeEvent, + event_producers: impl IntoIterator AllMessages>, + ctx: &mut impl SubsystemContext, +) -> polkadot_subsystem::SubsystemResult<()> { + // collect messages here to avoid the borrow lasting across await boundary. + let messages: Vec<_> = event_producers.into_iter() + .map(|producer| producer(update.clone())) + .collect(); + + ctx.send_messages(messages).await +} + +async fn update_view( + peers: &HashMap, + live_heads: &[Hash], + net: &mut impl Network, + local_view: &mut View, +) -> SubsystemResult> { + let new_view = construct_view(live_heads); + if *local_view == new_view { return Ok(None) } + *local_view = new_view.clone(); + + let message = WireMessage::ViewUpdate(new_view.clone()).encode(); + + let notifications = peers.keys().cloned() + .map(move |peer| Ok(NetworkAction::WriteNotification(peer, message.clone()))); + + net.action_sink().send_all(&mut stream::iter(notifications)).await?; + + Ok(Some(NetworkBridgeEvent::OurViewChange(local_view.clone()))) +} + +async fn run_network( + mut net: N, + mut ctx: impl SubsystemContext, +) -> SubsystemResult<()> { + let mut event_stream = net.event_stream().fuse(); + + // Most recent heads are at the back. + let mut live_heads = Vec::with_capacity(MAX_VIEW_HEADS); + let mut local_view = View(Vec::new()); + + let mut peers: HashMap = HashMap::new(); + let mut event_producers = BTreeMap::new(); + + loop { + let action = { + let subsystem_next = ctx.recv().fuse(); + let mut net_event_next = event_stream.next().fuse(); + futures::pin_mut!(subsystem_next); + + let action = futures::select! { + subsystem_msg = subsystem_next => Some(action_from_overseer_message(subsystem_msg)), + net_event = net_event_next => action_from_network_message(net_event), + }; + + match action { + Some(a) => a, + None => continue, + } + }; + + match action { + Action::RegisterEventProducer(protocol_id, event_producer) => { + // insert only if none present. + if let BEntry::Vacant(entry) = event_producers.entry(protocol_id) { + let event_producer = entry.insert(event_producer); + + // send the event producer information on all connected peers. + let mut messages = Vec::with_capacity(peers.len() * 2); + for (peer, data) in &peers { + messages.push(event_producer( + NetworkBridgeEvent::PeerConnected(peer.clone(), data.role.clone()) + )); + + messages.push(event_producer( + NetworkBridgeEvent::PeerViewChange(peer.clone(), data.view.clone()) + )); + } + + ctx.send_messages(messages).await?; + } + } + Action::SendMessage(peers, protocol, message) => { + let mut message_producer = stream::iter({ + let n_peers = peers.len(); + let mut message = Some( + WireMessage::ProtocolMessage(protocol, message).encode() + ); + + peers.iter().cloned().enumerate().map(move |(i, peer)| { + // optimization: avoid cloning the message for the last peer in the + // list. The message payload can be quite large. If the underlying + // network used `Bytes` this would not be necessary. + let message = if i == n_peers - 1 { + message.take() + .expect("Only taken in last iteration of loop, never afterwards; qed") + } else { + message.as_ref() + .expect("Only taken in last iteration of loop, we are not there yet; qed") + .clone() + }; + + Ok(NetworkAction::WriteNotification(peer, message)) + }) + }); + + net.action_sink().send_all(&mut message_producer).await?; + } + Action::ReportPeer(peer, rep) => { + net.report_peer(peer, rep).await?; + } + Action::StartWork(relay_parent) => { + live_heads.push(relay_parent); + if let Some(view_update) + = update_view(&peers, &live_heads, &mut net, &mut local_view).await? + { + if let Err(e) = dispatch_update_to_all( + view_update, + event_producers.values(), + &mut ctx, + ).await { + log::warn!("Aborting - Failure to dispatch messages to overseer"); + return Err(e) + } + } + } + Action::StopWork(relay_parent) => { + live_heads.retain(|h| h != &relay_parent); + if let Some(view_update) + = update_view(&peers, &live_heads, &mut net, &mut local_view).await? + { + if let Err(e) = dispatch_update_to_all( + view_update, + event_producers.values(), + &mut ctx, + ).await { + log::warn!("Aborting - Failure to dispatch messages to overseer"); + return Err(e) + } + } + } + + Action::PeerConnected(peer, role) => { + match peers.entry(peer.clone()) { + HEntry::Occupied(_) => continue, + HEntry::Vacant(vacant) => { + vacant.insert(PeerData { + view: View(Vec::new()), + role: role.clone(), + }); + + if let Err(e) = dispatch_update_to_all( + NetworkBridgeEvent::PeerConnected(peer, role), + event_producers.values(), + &mut ctx, + ).await { + log::warn!("Aborting - Failure to dispatch messages to overseer"); + return Err(e) + } + } + } + } + Action::PeerDisconnected(peer) => { + if peers.remove(&peer).is_some() { + if let Err(e) = dispatch_update_to_all( + NetworkBridgeEvent::PeerDisconnected(peer), + event_producers.values(), + &mut ctx, + ).await { + log::warn!("Aborting - Failure to dispatch messages to overseer"); + return Err(e) + } + } + }, + Action::PeerMessages(peer, messages) => { + let peer_data = match peers.get_mut(&peer) { + None => continue, + Some(d) => d, + }; + + let mut outgoing_messages = Vec::with_capacity(messages.len()); + for message in messages { + match message { + WireMessage::ViewUpdate(new_view) => { + if new_view.0.len() > MAX_VIEW_HEADS { + net.report_peer( + peer.clone(), + MALFORMED_VIEW_COST, + ).await?; + + continue + } + + if new_view == peer_data.view { continue } + peer_data.view = new_view; + + let update = NetworkBridgeEvent::PeerViewChange( + peer.clone(), + peer_data.view.clone(), + ); + + outgoing_messages.extend( + event_producers.values().map(|producer| producer(update.clone())) + ); + } + WireMessage::ProtocolMessage(protocol, message) => { + let message = match event_producers.get(&protocol) { + Some(producer) => Some(producer( + NetworkBridgeEvent::PeerMessage(peer.clone(), message) + )), + None => { + net.report_peer( + peer.clone(), + UNKNOWN_PROTO_COST, + ).await?; + + None + } + }; + + if let Some(message) = message { + outgoing_messages.push(message); + } + } + } + } + + let send_messages = ctx.send_messages(outgoing_messages); + if let Err(e) = send_messages.await { + log::warn!("Aborting - Failure to dispatch messages to overseer"); + return Err(e) + } + }, + + Action::Abort => return Ok(()), + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + use futures::channel::mpsc; + use futures::executor::{self, ThreadPool}; + + use std::sync::Arc; + use parking_lot::Mutex; + use assert_matches::assert_matches; + + use polkadot_subsystem::messages::{StatementDistributionMessage, BitfieldDistributionMessage}; + use subsystem_test::{SingleItemSink, SingleItemStream}; + + // The subsystem's view of the network - only supports a single call to `event_stream`. + struct TestNetwork { + net_events: Arc>>>, + action_tx: mpsc::UnboundedSender, + } + + // The test's view of the network. This receives updates from the subsystem in the form + // of `NetworkAction`s. + struct TestNetworkHandle { + action_rx: mpsc::UnboundedReceiver, + net_tx: SingleItemSink, + } + + fn new_test_network() -> ( + TestNetwork, + TestNetworkHandle, + ) { + let (net_tx, net_rx) = subsystem_test::single_item_sink(); + let (action_tx, action_rx) = mpsc::unbounded(); + + ( + TestNetwork { + net_events: Arc::new(Mutex::new(Some(net_rx))), + action_tx, + }, + TestNetworkHandle { + action_rx, + net_tx, + }, + ) + } + + impl Network for TestNetwork { + fn event_stream(&mut self) -> BoxStream<'static, NetworkEvent> { + self.net_events.lock() + .take() + .expect("Subsystem made more than one call to `event_stream`") + .boxed() + } + + fn action_sink<'a>(&'a mut self) + -> Pin + Send + 'a>> + { + Box::pin((&mut self.action_tx).sink_map_err(Into::into)) + } + } + + impl TestNetworkHandle { + // Get the next network action. + async fn next_network_action(&mut self) -> NetworkAction { + self.action_rx.next().await.expect("subsystem concluded early") + } + + // Wait for the next N network actions. + async fn next_network_actions(&mut self, n: usize) -> Vec { + let mut v = Vec::with_capacity(n); + for _ in 0..n { + v.push(self.next_network_action().await); + } + + v + } + + async fn connect_peer(&mut self, peer: PeerId, role: ObservedRole) { + self.send_network_event(NetworkEvent::NotificationStreamOpened { + remote: peer, + engine_id: POLKADOT_ENGINE_ID, + role, + }).await; + } + + async fn disconnect_peer(&mut self, peer: PeerId) { + self.send_network_event(NetworkEvent::NotificationStreamClosed { + remote: peer, + engine_id: POLKADOT_ENGINE_ID, + }).await; + } + + async fn peer_message(&mut self, peer: PeerId, message: Vec) { + self.send_network_event(NetworkEvent::NotificationsReceived { + remote: peer, + messages: vec![(POLKADOT_ENGINE_ID, message.into())], + }).await; + } + + async fn send_network_event(&mut self, event: NetworkEvent) { + self.net_tx.send(event).await.expect("subsystem concluded early"); + } + } + + // network actions are sensitive to ordering of `PeerId`s within a `HashMap`, so + // we need to use this to prevent fragile reliance on peer ordering. + fn network_actions_contains(actions: &[NetworkAction], action: &NetworkAction) -> bool { + actions.iter().find(|&x| x == action).is_some() + } + + struct TestHarness { + network_handle: TestNetworkHandle, + virtual_overseer: subsystem_test::TestSubsystemContextHandle, + } + + fn test_harness>(test: impl FnOnce(TestHarness) -> T) { + let pool = ThreadPool::new().unwrap(); + + let (network, network_handle) = new_test_network(); + let (context, virtual_overseer) = subsystem_test::make_subsystem_context(pool); + + let network_bridge = run_network( + network, + context, + ) + .map_err(|_| panic!("subsystem execution failed")) + .map(|_| ()); + + let test_fut = test(TestHarness { + network_handle, + virtual_overseer, + }); + + futures::pin_mut!(test_fut); + futures::pin_mut!(network_bridge); + + executor::block_on(future::select(test_fut, network_bridge)); + } + + #[test] + fn sends_view_updates_to_peers() { + test_harness(|test_harness| async move { + let TestHarness { mut network_handle, mut virtual_overseer } = test_harness; + + let peer_a = PeerId::random(); + let peer_b = PeerId::random(); + + network_handle.connect_peer(peer_a.clone(), ObservedRole::Full).await; + network_handle.connect_peer(peer_b.clone(), ObservedRole::Full).await; + + let hash_a = Hash::from([1; 32]); + + virtual_overseer.send(FromOverseer::Signal(OverseerSignal::StartWork(hash_a))).await; + + let actions = network_handle.next_network_actions(2).await; + let wire_message = WireMessage::ViewUpdate(View(vec![hash_a])).encode(); + assert!(network_actions_contains( + &actions, + &NetworkAction::WriteNotification(peer_a, wire_message.clone()), + )); + + assert!(network_actions_contains( + &actions, + &NetworkAction::WriteNotification(peer_b, wire_message.clone()), + )); + }); + } + + #[test] + fn peer_view_updates_sent_via_overseer() { + test_harness(|test_harness| async move { + let TestHarness { + mut network_handle, + mut virtual_overseer, + } = test_harness; + + let peer = PeerId::random(); + + let proto_statement = *b"abcd"; + let proto_bitfield = *b"wxyz"; + + network_handle.connect_peer(peer.clone(), ObservedRole::Full).await; + + virtual_overseer.send(FromOverseer::Communication { + msg: NetworkBridgeMessage::RegisterEventProducer( + proto_statement, + |event| AllMessages::StatementDistribution( + StatementDistributionMessage::NetworkBridgeUpdate(event) + ) + ), + }).await; + + virtual_overseer.send(FromOverseer::Communication { + msg: NetworkBridgeMessage::RegisterEventProducer( + proto_bitfield, + |event| AllMessages::BitfieldDistribution( + BitfieldDistributionMessage::NetworkBridgeUpdate(event) + ) + ), + }).await; + + let view = View(vec![Hash::from([1u8; 32])]); + + // bridge will inform about all previously-connected peers. + { + assert_matches!( + virtual_overseer.recv().await, + AllMessages::StatementDistribution( + StatementDistributionMessage::NetworkBridgeUpdate( + NetworkBridgeEvent::PeerConnected(p, ObservedRole::Full) + ) + ) if p == peer + ); + + assert_matches!( + virtual_overseer.recv().await, + AllMessages::StatementDistribution( + StatementDistributionMessage::NetworkBridgeUpdate( + NetworkBridgeEvent::PeerViewChange(p, v) + ) + ) if p == peer && v == View(Default::default()) + ); + + assert_matches!( + virtual_overseer.recv().await, + AllMessages::BitfieldDistribution( + BitfieldDistributionMessage::NetworkBridgeUpdate( + NetworkBridgeEvent::PeerConnected(p, ObservedRole::Full) + ) + ) if p == peer + ); + + assert_matches!( + virtual_overseer.recv().await, + AllMessages::BitfieldDistribution( + BitfieldDistributionMessage::NetworkBridgeUpdate( + NetworkBridgeEvent::PeerViewChange(p, v) + ) + ) if p == peer && v == View(Default::default()) + ); + } + + network_handle.peer_message( + peer.clone(), + WireMessage::ViewUpdate(view.clone()).encode(), + ).await; + + // statement distribution message comes first because handlers are ordered by + // protocol ID. + + assert_matches!( + virtual_overseer.recv().await, + AllMessages::StatementDistribution( + StatementDistributionMessage::NetworkBridgeUpdate( + NetworkBridgeEvent::PeerViewChange(p, v) + ) + ) => { + assert_eq!(p, peer); + assert_eq!(v, view); + } + ); + + assert_matches!( + virtual_overseer.recv().await, + AllMessages::BitfieldDistribution( + BitfieldDistributionMessage::NetworkBridgeUpdate( + NetworkBridgeEvent::PeerViewChange(p, v) + ) + ) => { + assert_eq!(p, peer); + assert_eq!(v, view); + } + ); + }); + } + + #[test] + fn peer_messages_sent_via_overseer() { + test_harness(|test_harness| async move { + let TestHarness { + mut network_handle, + mut virtual_overseer, + } = test_harness; + + let peer = PeerId::random(); + + let proto_statement = *b"abcd"; + let proto_bitfield = *b"wxyz"; + + network_handle.connect_peer(peer.clone(), ObservedRole::Full).await; + + virtual_overseer.send(FromOverseer::Communication { + msg: NetworkBridgeMessage::RegisterEventProducer( + proto_statement, + |event| AllMessages::StatementDistribution( + StatementDistributionMessage::NetworkBridgeUpdate(event) + ) + ), + }).await; + + virtual_overseer.send(FromOverseer::Communication { + msg: NetworkBridgeMessage::RegisterEventProducer( + proto_bitfield, + |event| AllMessages::BitfieldDistribution( + BitfieldDistributionMessage::NetworkBridgeUpdate(event) + ) + ), + }).await; + + // bridge will inform about all previously-connected peers. + { + assert_matches!( + virtual_overseer.recv().await, + AllMessages::StatementDistribution( + StatementDistributionMessage::NetworkBridgeUpdate( + NetworkBridgeEvent::PeerConnected(p, ObservedRole::Full) + ) + ) if p == peer + ); + + assert_matches!( + virtual_overseer.recv().await, + AllMessages::StatementDistribution( + StatementDistributionMessage::NetworkBridgeUpdate( + NetworkBridgeEvent::PeerViewChange(p, v) + ) + ) if p == peer && v == View(Default::default()) + ); + + assert_matches!( + virtual_overseer.recv().await, + AllMessages::BitfieldDistribution( + BitfieldDistributionMessage::NetworkBridgeUpdate( + NetworkBridgeEvent::PeerConnected(p, ObservedRole::Full) + ) + ) if p == peer + ); + + assert_matches!( + virtual_overseer.recv().await, + AllMessages::BitfieldDistribution( + BitfieldDistributionMessage::NetworkBridgeUpdate( + NetworkBridgeEvent::PeerViewChange(p, v) + ) + ) if p == peer && v == View(Default::default()) + ); + } + + let payload = vec![1, 2, 3]; + + network_handle.peer_message( + peer.clone(), + WireMessage::ProtocolMessage(proto_statement, payload.clone()).encode(), + ).await; + + network_handle.disconnect_peer(peer.clone()).await; + + // statement distribution message comes first because handlers are ordered by + // protocol ID, and then a disconnection event comes - indicating that the message + // was only sent to the correct protocol. + + assert_matches!( + virtual_overseer.recv().await, + AllMessages::StatementDistribution( + StatementDistributionMessage::NetworkBridgeUpdate( + NetworkBridgeEvent::PeerMessage(p, m) + ) + ) => { + assert_eq!(p, peer); + assert_eq!(m, payload); + } + ); + + assert_matches!( + virtual_overseer.recv().await, + AllMessages::StatementDistribution( + StatementDistributionMessage::NetworkBridgeUpdate( + NetworkBridgeEvent::PeerDisconnected(p) + ) + ) => { + assert_eq!(p, peer); + } + ); + }); + } +} diff --git a/node/overseer/Cargo.toml b/node/overseer/Cargo.toml index 88626e2e05..6c6ce304e6 100644 --- a/node/overseer/Cargo.toml +++ b/node/overseer/Cargo.toml @@ -11,7 +11,8 @@ futures-timer = "3.0.2" streamunordered = "0.5.1" polkadot-primitives = { path = "../../primitives" } client = { package = "sc-client-api", git = "https://github.com/paritytech/substrate", branch = "master" } -messages = { package = "polkadot-node-messages", path = "../messages" } +polkadot-subsystem = { package = "polkadot-node-subsystem", path = "../subsystem" } +async-trait = "0.1" [dev-dependencies] futures = { version = "0.3.5", features = ["thread-pool"] } diff --git a/node/overseer/examples/minimal-example.rs b/node/overseer/examples/minimal-example.rs index 77b99a3a3b..0edc87a6b8 100644 --- a/node/overseer/examples/minimal-example.rs +++ b/node/overseer/examples/minimal-example.rs @@ -28,16 +28,17 @@ use futures_timer::Delay; use kv_log_macro as log; use polkadot_primitives::parachain::{BlockData, PoVBlock}; -use polkadot_overseer::{Overseer, Subsystem, SubsystemContext, SpawnedSubsystem}; +use polkadot_overseer::Overseer; -use messages::{ - AllMessages, CandidateBackingMessage, FromOverseer, CandidateValidationMessage +use polkadot_subsystem::{Subsystem, SubsystemContext, SpawnedSubsystem, FromOverseer}; +use polkadot_subsystem::messages::{ + AllMessages, CandidateBackingMessage, CandidateValidationMessage }; struct Subsystem1; impl Subsystem1 { - async fn run(mut ctx: SubsystemContext) { + async fn run(mut ctx: impl SubsystemContext) { loop { match ctx.try_recv().await { Ok(Some(msg)) => { @@ -56,7 +57,7 @@ impl Subsystem1 { Delay::new(Duration::from_secs(1)).await; let (tx, _) = oneshot::channel(); - ctx.send_msg(AllMessages::CandidateValidation( + ctx.send_message(AllMessages::CandidateValidation( CandidateValidationMessage::Validate( Default::default(), Default::default(), @@ -70,8 +71,10 @@ impl Subsystem1 { } } -impl Subsystem for Subsystem1 { - fn start(&mut self, ctx: SubsystemContext) -> SpawnedSubsystem { +impl Subsystem for Subsystem1 + where C: SubsystemContext +{ + fn start(&mut self, ctx: C) -> SpawnedSubsystem { SpawnedSubsystem(Box::pin(async move { Self::run(ctx).await; })) @@ -81,7 +84,7 @@ impl Subsystem for Subsystem1 { struct Subsystem2; impl Subsystem2 { - async fn run(mut ctx: SubsystemContext) { + async fn run(mut ctx: impl SubsystemContext) { ctx.spawn(Box::pin(async { loop { log::info!("Job tick"); @@ -105,8 +108,10 @@ impl Subsystem2 { } } -impl Subsystem for Subsystem2 { - fn start(&mut self, ctx: SubsystemContext) -> SpawnedSubsystem { +impl Subsystem for Subsystem2 + where C: SubsystemContext +{ + fn start(&mut self, ctx: C) -> SpawnedSubsystem { SpawnedSubsystem(Box::pin(async move { Self::run(ctx).await; })) diff --git a/node/overseer/src/lib.rs b/node/overseer/src/lib.rs index 0d3c9b7b50..8fb8706be4 100644 --- a/node/overseer/src/lib.rs +++ b/node/overseer/src/lib.rs @@ -65,8 +65,8 @@ use futures::channel::{mpsc, oneshot}; use futures::{ pending, poll, select, future::{BoxFuture, RemoteHandle}, - stream::FuturesUnordered, - task::{Spawn, SpawnError, SpawnExt}, + stream::{self, FuturesUnordered}, + task::{Spawn, SpawnExt}, Future, FutureExt, SinkExt, StreamExt, }; use futures_timer::Delay; @@ -75,50 +75,14 @@ use streamunordered::{StreamYield, StreamUnordered}; use polkadot_primitives::{Block, BlockNumber, Hash}; use client::{BlockImportNotification, BlockchainEvents, FinalityNotification}; -pub use messages::{ - OverseerSignal, CandidateValidationMessage, CandidateBackingMessage, AllMessages, - FromOverseer, +use polkadot_subsystem::messages::{ + CandidateValidationMessage, CandidateBackingMessage, AllMessages +}; +pub use polkadot_subsystem::{ + Subsystem, SubsystemContext, OverseerSignal, FromOverseer, SubsystemError, SubsystemResult, + SpawnedSubsystem, }; -/// An error type that describes faults that may happen -/// -/// These are: -/// * Channels being closed -/// * Subsystems dying when they are not expected to -/// * Subsystems not dying when they are told to die -/// * etc. -#[derive(Debug)] -pub struct SubsystemError; - -impl From for SubsystemError { - fn from(_: mpsc::SendError) -> Self { - Self - } -} - -impl From for SubsystemError { - fn from(_: oneshot::Canceled) -> Self { - Self - } -} - -impl From for SubsystemError { - fn from(_: SpawnError) -> Self { - Self - } -} - -/// A `Result` type that wraps [`SubsystemError`]. -/// -/// [`SubsystemError`]: struct.SubsystemError.html -pub type SubsystemResult = Result; - -/// An asynchronous subsystem task that runs inside and being overseen by the [`Overseer`]. -/// -/// In essence it's just a newtype wrapping a `BoxFuture`. -/// -/// [`Overseer`]: struct.Overseer.html -pub struct SpawnedSubsystem(pub BoxFuture<'static, ()>); // A capacity of bounded channels inside the overseer. const CHANNEL_CAPACITY: usize = 1024; @@ -278,7 +242,7 @@ impl Debug for ToOverseer { /// A running instance of some [`Subsystem`]. /// /// [`Subsystem`]: trait.Subsystem.html -struct SubsystemInstance { +struct SubsystemInstance { tx: mpsc::Sender>, } @@ -289,17 +253,17 @@ struct SubsystemInstance { /// [`Overseer`]: struct.Overseer.html /// [`Subsystem`]: trait.Subsystem.html /// [`SubsystemJob`]: trait.SubsystemJob.html -pub struct SubsystemContext{ +#[derive(Debug)] +pub struct OverseerSubsystemContext{ rx: mpsc::Receiver>, tx: mpsc::Sender, } -impl SubsystemContext { - /// Try to asyncronously receive a message. - /// - /// This has to be used with caution, if you loop over this without - /// using `pending!()` macro you will end up with a busy loop! - pub async fn try_recv(&mut self) -> Result>, ()> { +#[async_trait::async_trait] +impl SubsystemContext for OverseerSubsystemContext { + type Message = M; + + async fn try_recv(&mut self) -> Result>, ()> { match poll!(self.rx.next()) { Poll::Ready(Some(msg)) => Ok(Some(msg)), Poll::Ready(None) => Err(()), @@ -307,13 +271,11 @@ impl SubsystemContext { } } - /// Receive a message. - pub async fn recv(&mut self) -> SubsystemResult> { + async fn recv(&mut self) -> SubsystemResult> { self.rx.next().await.ok_or(SubsystemError) } - /// Spawn a child task on the executor. - pub async fn spawn(&mut self, s: Pin + Send>>) -> SubsystemResult<()> { + async fn spawn(&mut self, s: Pin + Send>>) -> SubsystemResult<()> { let (tx, rx) = oneshot::channel(); self.tx.send(ToOverseer::SpawnJob { s, @@ -323,33 +285,25 @@ impl SubsystemContext { rx.await? } - /// Send a direct message to some other `Subsystem`, routed based on message type. - pub async fn send_msg(&mut self, msg: AllMessages) -> SubsystemResult<()> { + async fn send_message(&mut self, msg: AllMessages) -> SubsystemResult<()> { self.tx.send(ToOverseer::SubsystemMessage(msg)).await?; Ok(()) } - fn new(rx: mpsc::Receiver>, tx: mpsc::Sender) -> Self { - Self { - rx, - tx, - } + async fn send_messages(&mut self, msgs: T) -> SubsystemResult<()> + where T: IntoIterator + Send, T::IntoIter: Send + { + let mut msgs = stream::iter(msgs.into_iter().map(ToOverseer::SubsystemMessage).map(Ok)); + self.tx.send_all(&mut msgs).await?; + + Ok(()) } } -/// A trait that describes the [`Subsystem`]s that can run on the [`Overseer`]. -/// -/// It is generic over the message type circulating in the system. -/// The idea that we want some type contaning persistent state that -/// can spawn actually running subsystems when asked to. -/// -/// [`Overseer`]: struct.Overseer.html -/// [`Subsystem`]: trait.Subsystem.html -pub trait Subsystem { - /// Start this `Subsystem` and return `SpawnedSubsystem`. - fn start(&mut self, ctx: SubsystemContext) -> SpawnedSubsystem; -} +/// A subsystem compatible with the overseer - one which can be run in the context of the +/// overseer. +pub type CompatibleSubsystem = Box> + Send>; /// A subsystem that we oversee. /// @@ -359,8 +313,8 @@ pub trait Subsystem { /// /// [`Subsystem`]: trait.Subsystem.html #[allow(dead_code)] -struct OverseenSubsystem { - subsystem: Box + Send>, +struct OverseenSubsystem { + subsystem: CompatibleSubsystem, instance: Option>, } @@ -441,16 +395,20 @@ where /// # use std::time::Duration; /// # use futures::{executor, pin_mut, select, FutureExt}; /// # use futures_timer::Delay; - /// # use polkadot_overseer::{ - /// # Overseer, Subsystem, SpawnedSubsystem, SubsystemContext, - /// # CandidateValidationMessage, CandidateBackingMessage, + /// # use polkadot_overseer::Overseer; + /// # use polkadot_subsystem::{ + /// # Subsystem, SpawnedSubsystem, SubsystemContext, + /// # messages::{CandidateValidationMessage, CandidateBackingMessage}, /// # }; /// /// struct ValidationSubsystem; - /// impl Subsystem for ValidationSubsystem { + /// + /// impl Subsystem for ValidationSubsystem + /// where C: SubsystemContext + /// { /// fn start( /// &mut self, - /// mut ctx: SubsystemContext, + /// mut ctx: C, /// ) -> SpawnedSubsystem { /// SpawnedSubsystem(Box::pin(async move { /// loop { @@ -461,10 +419,12 @@ where /// } /// /// struct CandidateBackingSubsystem; - /// impl Subsystem for CandidateBackingSubsystem { + /// impl Subsystem for CandidateBackingSubsystem + /// where C: SubsystemContext + /// { /// fn start( /// &mut self, - /// mut ctx: SubsystemContext, + /// mut ctx: C, /// ) -> SpawnedSubsystem { /// SpawnedSubsystem(Box::pin(async move { /// loop { @@ -498,8 +458,8 @@ where /// ``` pub fn new( leaves: impl IntoIterator, - validation: Box + Send>, - candidate_backing: Box + Send>, + validation: CompatibleSubsystem, + candidate_backing: CompatibleSubsystem, mut s: S, ) -> SubsystemResult<(Self, OverseerHandler)> { let (events_tx, events_rx) = mpsc::channel(CHANNEL_CAPACITY); @@ -680,6 +640,12 @@ where let _ = s.tx.send(FromOverseer::Communication { msg }).await; } } + _ => { + // TODO: temporary catch-all until all subsystems are integrated with overseer. + // The overseer is not complete until this is an exhaustive match with all + // messages targeting an included subsystem. + // https://github.com/paritytech/polkadot/issues/1317 + } } } @@ -688,15 +654,15 @@ where } } -fn spawn( +fn spawn( spawner: &mut S, futures: &mut FuturesUnordered>, streams: &mut StreamUnordered>, - mut s: Box + Send>, + mut s: CompatibleSubsystem, ) -> SubsystemResult> { let (to_tx, to_rx) = mpsc::channel(CHANNEL_CAPACITY); let (from_tx, from_rx) = mpsc::channel(CHANNEL_CAPACITY); - let ctx = SubsystemContext::new(to_rx, from_tx); + let ctx = OverseerSubsystemContext { rx: to_rx, tx: from_tx }; let f = s.start(ctx); let handle = spawner.spawn_with_handle(f.0)?; @@ -723,8 +689,10 @@ mod tests { struct TestSubsystem1(mpsc::Sender); - impl Subsystem for TestSubsystem1 { - fn start(&mut self, mut ctx: SubsystemContext) -> SpawnedSubsystem { + impl Subsystem for TestSubsystem1 + where C: SubsystemContext + { + fn start(&mut self, mut ctx: C) -> SpawnedSubsystem { let mut sender = self.0.clone(); SpawnedSubsystem(Box::pin(async move { let mut i = 0; @@ -746,14 +714,16 @@ mod tests { struct TestSubsystem2(mpsc::Sender); - impl Subsystem for TestSubsystem2 { - fn start(&mut self, mut ctx: SubsystemContext) -> SpawnedSubsystem { + impl Subsystem for TestSubsystem2 + where C: SubsystemContext + { + fn start(&mut self, mut ctx: C) -> SpawnedSubsystem { SpawnedSubsystem(Box::pin(async move { let mut c: usize = 0; loop { if c < 10 { let (tx, _) = oneshot::channel(); - ctx.send_msg( + ctx.send_message( AllMessages::CandidateValidation( CandidateValidationMessage::Validate( Default::default(), @@ -786,8 +756,10 @@ mod tests { struct TestSubsystem4; - impl Subsystem for TestSubsystem4 { - fn start(&mut self, mut _ctx: SubsystemContext) -> SpawnedSubsystem { + impl Subsystem for TestSubsystem4 + where C: SubsystemContext + { + fn start(&mut self, mut _ctx: C) -> SpawnedSubsystem { SpawnedSubsystem(Box::pin(async move { // Do nothing and exit. })) @@ -871,8 +843,10 @@ mod tests { struct TestSubsystem5(mpsc::Sender); - impl Subsystem for TestSubsystem5 { - fn start(&mut self, mut ctx: SubsystemContext) -> SpawnedSubsystem { + impl Subsystem for TestSubsystem5 + where C: SubsystemContext + { + fn start(&mut self, mut ctx: C) -> SpawnedSubsystem { let mut sender = self.0.clone(); SpawnedSubsystem(Box::pin(async move { @@ -895,8 +869,10 @@ mod tests { struct TestSubsystem6(mpsc::Sender); - impl Subsystem for TestSubsystem6 { - fn start(&mut self, mut ctx: SubsystemContext) -> SpawnedSubsystem { + impl Subsystem for TestSubsystem6 + where C: SubsystemContext + { + fn start(&mut self, mut ctx: C) -> SpawnedSubsystem { let mut sender = self.0.clone(); SpawnedSubsystem(Box::pin(async move { diff --git a/node/primitives/Cargo.toml b/node/primitives/Cargo.toml index f317565b2e..b2bc9231ae 100644 --- a/node/primitives/Cargo.toml +++ b/node/primitives/Cargo.toml @@ -10,3 +10,4 @@ polkadot-primitives = { path = "../../primitives" } polkadot-statement-table = { path = "../../statement-table" } parity-scale-codec = { version = "1.3.0", default-features = false, features = ["derive"] } runtime_primitives = { package = "sp-runtime", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +async-trait = "0.1" diff --git a/node/primitives/src/lib.rs b/node/primitives/src/lib.rs index bd43748ab2..527e6aaea2 100644 --- a/node/primitives/src/lib.rs +++ b/node/primitives/src/lib.rs @@ -64,6 +64,7 @@ impl EncodeAs for Statement { pub type SignedFullStatement = Signed; /// A misbehaviour report. +#[derive(Debug)] pub enum MisbehaviorReport { /// These validator nodes disagree on this candidate's validity, please figure it out /// @@ -79,3 +80,12 @@ pub enum MisbehaviorReport { /// This peer has seconded more than one parachain candidate for this relay parent head DoubleVote(CandidateReceipt, SignedFullStatement, SignedFullStatement), } + +/// A unique identifier for a network protocol. +pub type ProtocolId = [u8; 4]; + +/// A succinct representation of a peer's view. This consists of a bounded amount of chain heads. +/// +/// Up to `N` (5?) chain heads. +#[derive(Debug, Clone, PartialEq, Eq, Encode, Decode)] +pub struct View(pub Vec); diff --git a/node/service/Cargo.toml b/node/service/Cargo.toml index 74069f0233..f1a56acfad 100644 --- a/node/service/Cargo.toml +++ b/node/service/Cargo.toml @@ -15,6 +15,7 @@ hex-literal = "0.2.1" polkadot-primitives = { path = "../../primitives" } polkadot-runtime = { path = "../../runtime/polkadot" } polkadot-overseer = { path = "../overseer" } +polkadot-subsystem = { package = "polkadot-node-subsystem", path = "../subsystem" } kusama-runtime = { path = "../../runtime/kusama" } westend-runtime = { path = "../../runtime/westend" } polkadot-network = { path = "../../network", optional = true } diff --git a/node/service/src/lib.rs b/node/service/src/lib.rs index 2c3d77605e..8b0e27b8a6 100644 --- a/node/service/src/lib.rs +++ b/node/service/src/lib.rs @@ -29,10 +29,10 @@ use grandpa::{self, FinalityProofProvider as GrandpaFinalityProofProvider}; use sc_executor::native_executor_instance; use log::info; use sp_blockchain::HeaderBackend; -use polkadot_overseer::{ - self as overseer, - BlockInfo, Overseer, OverseerHandler, Subsystem, SubsystemContext, SpawnedSubsystem, - CandidateValidationMessage, CandidateBackingMessage, +use polkadot_overseer::{self as overseer, BlockInfo, Overseer, OverseerHandler}; +use polkadot_subsystem::{ + Subsystem, SubsystemContext, SpawnedSubsystem, + messages::{CandidateValidationMessage, CandidateBackingMessage}, }; pub use service::{ Role, PruningMode, TransactionPoolOptions, Error, RuntimeGenesis, @@ -269,8 +269,10 @@ macro_rules! new_full_start { struct CandidateValidationSubsystem; -impl Subsystem for CandidateValidationSubsystem { - fn start(&mut self, mut ctx: SubsystemContext) -> SpawnedSubsystem { +impl Subsystem for CandidateValidationSubsystem + where C: SubsystemContext +{ + fn start(&mut self, mut ctx: C) -> SpawnedSubsystem { SpawnedSubsystem(Box::pin(async move { while let Ok(_) = ctx.recv().await {} })) @@ -279,8 +281,10 @@ impl Subsystem for CandidateValidationSubsystem { struct CandidateBackingSubsystem; -impl Subsystem for CandidateBackingSubsystem { - fn start(&mut self, mut ctx: SubsystemContext) -> SpawnedSubsystem { +impl Subsystem for CandidateBackingSubsystem + where C: SubsystemContext +{ + fn start(&mut self, mut ctx: C) -> SpawnedSubsystem { SpawnedSubsystem(Box::pin(async move { while let Ok(_) = ctx.recv().await {} })) diff --git a/node/messages/Cargo.toml b/node/subsystem/Cargo.toml similarity index 77% rename from node/messages/Cargo.toml rename to node/subsystem/Cargo.toml index 9edb5a0519..43712319cb 100644 --- a/node/messages/Cargo.toml +++ b/node/subsystem/Cargo.toml @@ -1,9 +1,9 @@ [package] -name = "polkadot-node-messages" +name = "polkadot-node-subsystem" version = "0.1.0" authors = ["Parity Technologies "] edition = "2018" -description = "Message types used by Subsystems" +description = "Subsystem traits and message definitions" [dependencies] polkadot-primitives = { path = "../../primitives" } @@ -11,3 +11,4 @@ polkadot-statement-table = { path = "../../statement-table" } polkadot-node-primitives = { path = "../primitives" } sc-network = { git = "https://github.com/paritytech/substrate", branch = "master" } futures = "0.3.5" +async-trait = "0.1" diff --git a/node/subsystem/src/lib.rs b/node/subsystem/src/lib.rs new file mode 100644 index 0000000000..31d094907f --- /dev/null +++ b/node/subsystem/src/lib.rs @@ -0,0 +1,150 @@ +// Copyright 2017-2020 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 . + +//! Subsystem trait definitions and message types. +//! +//! Node-side logic for Polkadot is mostly comprised of Subsystems, which are discrete components +//! that communicate via message-passing. They are coordinated by an overseer, provided by a +//! separate crate. + +use std::pin::Pin; + +use futures::prelude::*; +use futures::channel::{mpsc, oneshot}; +use futures::future::BoxFuture; + +use polkadot_primitives::Hash; +use async_trait::async_trait; + +use crate::messages::AllMessages; + +pub mod messages; + +/// Signals sent by an overseer to a subsystem. +#[derive(PartialEq, Clone, Debug)] +pub enum OverseerSignal { + /// `Subsystem` should start working on block-based work, given by the relay-chain block hash. + StartWork(Hash), + /// `Subsystem` should stop working on block-based work specified by the relay-chain block hash. + StopWork(Hash), + /// Conclude the work of the `Overseer` and all `Subsystem`s. + Conclude, +} + +/// A message type that a subsystem receives from an overseer. +/// It wraps signals from an overseer and messages that are circulating +/// between subsystems. +/// +/// It is generic over over the message type `M` that a particular `Subsystem` may use. +#[derive(Debug)] +pub enum FromOverseer { + /// Signal from the `Overseer`. + Signal(OverseerSignal), + + /// Some other `Subsystem`'s message. + Communication { + msg: M, + }, +} + +/// An error type that describes faults that may happen +/// +/// These are: +/// * Channels being closed +/// * Subsystems dying when they are not expected to +/// * Subsystems not dying when they are told to die +/// * etc. +#[derive(Debug)] +pub struct SubsystemError; + +impl From for SubsystemError { + fn from(_: mpsc::SendError) -> Self { + Self + } +} + +impl From for SubsystemError { + fn from(_: oneshot::Canceled) -> Self { + Self + } +} + +impl From for SubsystemError { + fn from(_: futures::task::SpawnError) -> Self { + Self + } +} + +impl From for SubsystemError { + fn from(e: std::convert::Infallible) -> Self { + match e {} + } +} + +/// An asynchronous subsystem task.. +/// +/// In essence it's just a newtype wrapping a `BoxFuture`. +pub struct SpawnedSubsystem(pub BoxFuture<'static, ()>); + +/// A `Result` type that wraps [`SubsystemError`]. +/// +/// [`SubsystemError`]: struct.SubsystemError.html +pub type SubsystemResult = Result; + +/// A context type that is given to the [`Subsystem`] upon spawning. +/// It can be used by [`Subsystem`] to communicate with other [`Subsystem`]s +/// or spawn jobs. +/// +/// [`Overseer`]: struct.Overseer.html +/// [`SubsystemJob`]: trait.SubsystemJob.html +#[async_trait] +pub trait SubsystemContext: Send + 'static { + /// The message type of this context. Subsystems launched with this context will expect + /// to receive messages of this type. + type Message: Send; + + /// Try to asynchronously receive a message. + /// + /// This has to be used with caution, if you loop over this without + /// using `pending!()` macro you will end up with a busy loop! + async fn try_recv(&mut self) -> Result>, ()>; + + /// Receive a message. + async fn recv(&mut self) -> SubsystemResult>; + + /// Spawn a child task on the executor. + async fn spawn(&mut self, s: Pin + Send>>) -> SubsystemResult<()>; + + /// Send a direct message to some other `Subsystem`, routed based on message type. + async fn send_message(&mut self, msg: AllMessages) -> SubsystemResult<()>; + + /// Send multiple direct messages to other `Subsystem`s, routed based on message type. + async fn send_messages(&mut self, msgs: T) -> SubsystemResult<()> + where T: IntoIterator + Send, T::IntoIter: Send; +} + +/// A trait that describes the [`Subsystem`]s that can run on the [`Overseer`]. +/// +/// It is generic over the message type circulating in the system. +/// The idea that we want some type contaning persistent state that +/// can spawn actually running subsystems when asked to. +/// +/// [`Overseer`]: struct.Overseer.html +/// [`Subsystem`]: trait.Subsystem.html +pub trait Subsystem { + /// Start this `Subsystem` and return `SpawnedSubsystem`. + fn start(&mut self, ctx: C) -> SpawnedSubsystem; +} diff --git a/node/messages/src/lib.rs b/node/subsystem/src/messages.rs similarity index 87% rename from node/messages/src/lib.rs rename to node/subsystem/src/messages.rs index 3a413f2c67..c225813490 100644 --- a/node/messages/src/lib.rs +++ b/node/subsystem/src/messages.rs @@ -24,27 +24,16 @@ use futures::channel::{mpsc, oneshot}; -use sc_network::{ObservedRole, ReputationChange, PeerId, config::ProtocolId}; +use sc_network::{ObservedRole, ReputationChange, PeerId}; use polkadot_primitives::{BlockNumber, Hash, Signature}; use polkadot_primitives::parachain::{ AbridgedCandidateReceipt, PoVBlock, ErasureChunk, BackedCandidate, Id as ParaId, SignedAvailabilityBitfield, SigningContext, ValidatorId, ValidationCode, ValidatorIndex, }; use polkadot_node_primitives::{ - MisbehaviorReport, SignedFullStatement, + MisbehaviorReport, SignedFullStatement, View, ProtocolId, }; -/// Signals sent by an overseer to a subsystem. -#[derive(PartialEq, Clone, Debug)] -pub enum OverseerSignal { - /// `Subsystem` should start working on block-based work, given by the relay-chain block hash. - StartWork(Hash), - /// `Subsystem` should stop working on block-based work specified by the relay-chain block hash. - StopWork(Hash), - /// Conclude the work of the `Overseer` and all `Subsystem`s. - Conclude, -} - /// A notification of a new backed candidate. #[derive(Debug)] pub struct NewBackedCandidate(pub BackedCandidate); @@ -90,12 +79,8 @@ pub enum CandidateValidationMessage { ), } -/// Chain heads. -/// -/// Up to `N` (5?) chain heads. -pub struct View(pub Vec); - /// Events from network. +#[derive(Debug, Clone)] pub enum NetworkBridgeEvent { /// A peer has connected. PeerConnected(PeerId, ObservedRole), @@ -114,7 +99,8 @@ pub enum NetworkBridgeEvent { } /// Messages received by the network bridge subsystem. -pub enum NetworkBridgeSubsystemMessage { +#[derive(Debug)] +pub enum NetworkBridgeMessage { /// Register an event producer on startup. RegisterEventProducer(ProtocolId, fn(NetworkBridgeEvent) -> AllMessages), @@ -126,6 +112,7 @@ pub enum NetworkBridgeSubsystemMessage { } /// Availability Distribution Message. +#[derive(Debug)] pub enum AvailabilityDistributionMessage { /// Distribute an availability chunk to other validators. DistributeChunk(Hash, ErasureChunk), @@ -138,6 +125,7 @@ pub enum AvailabilityDistributionMessage { } /// Bitfield distribution message. +#[derive(Debug)] pub enum BitfieldDistributionMessage { /// Distribute a bitfield via gossip to other validators. DistributeBitfield(Hash, SignedAvailabilityBitfield), @@ -147,6 +135,7 @@ pub enum BitfieldDistributionMessage { } /// Availability store subsystem message. +#[derive(Debug)] pub enum AvailabilityStoreMessage { /// Query a `PoVBlock` from the AV store. QueryPoV(Hash, oneshot::Sender>), @@ -159,6 +148,7 @@ pub enum AvailabilityStoreMessage { } /// A request to the Runtime API subsystem. +#[derive(Debug)] pub enum RuntimeApiRequest { /// Get the current validator set. Validators(oneshot::Sender>), @@ -171,19 +161,24 @@ pub enum RuntimeApiRequest { } /// A message to the Runtime API subsystem. +#[derive(Debug)] pub enum RuntimeApiMessage { /// Make a request of the runtime API against the post-state of the given relay-parent. Request(Hash, RuntimeApiRequest), } /// Statement distribution message. +#[derive(Debug)] pub enum StatementDistributionMessage { /// We have originated a signed statement in the context of /// given relay-parent hash and it should be distributed to other validators. Share(Hash, SignedFullStatement), + /// Event from the network bridge. + NetworkBridgeUpdate(NetworkBridgeEvent), } /// This data becomes intrinsics or extrinsics which should be included in a future relay chain block. +#[derive(Debug)] pub enum ProvisionableData { /// This bitfield indicates the availability of various candidate blocks. Bitfield(Hash, SignedAvailabilityBitfield), @@ -198,6 +193,7 @@ pub enum ProvisionableData { /// Message to the Provisioner. /// /// In all cases, the Hash is that of the relay parent. +#[derive(Debug)] pub enum ProvisionerMessage { /// This message allows potential block authors to be kept updated with all new authorship data /// as it becomes available. @@ -213,20 +209,18 @@ pub enum AllMessages { CandidateValidation(CandidateValidationMessage), /// Message for the candidate backing subsystem. CandidateBacking(CandidateBackingMessage), -} - -/// A message type that a subsystem receives from an overseer. -/// It wraps signals from an overseer and messages that are circulating -/// between subsystems. -/// -/// It is generic over over the message type `M` that a particular `Subsystem` may use. -#[derive(Debug)] -pub enum FromOverseer { - /// Signal from the `Overseer`. - Signal(OverseerSignal), - - /// Some other `Subsystem`'s message. - Communication { - msg: M, - }, + /// Message for the candidate selection subsystem. + CandidateSelection(CandidateSelectionMessage), + /// Message for the statement distribution subsystem. + StatementDistribution(StatementDistributionMessage), + /// Message for the availability distribution subsystem. + AvailabilityDistribution(AvailabilityDistributionMessage), + /// Message for the bitfield distribution subsystem. + BitfieldDistribution(BitfieldDistributionMessage), + /// Message for the Provisioner subsystem. + Provisioner(ProvisionerMessage), + /// Message for the Runtime API subsystem. + RuntimeApi(RuntimeApiMessage), + /// Message for the availability store subsystem. + AvailabilityStore(AvailabilityStoreMessage), } diff --git a/node/test-helpers/subsystem/Cargo.toml b/node/test-helpers/subsystem/Cargo.toml new file mode 100644 index 0000000000..0fc26a24ea --- /dev/null +++ b/node/test-helpers/subsystem/Cargo.toml @@ -0,0 +1,12 @@ +[package] +name = "polkadot-subsystem-test-helpers" +version = "0.1.0" +authors = ["Parity Technologies "] +edition = "2018" +description = "Helpers for testing subsystems" + +[dependencies] +futures = "0.3.5" +async-trait = "0.1" +polkadot-subsystem = { package = "polkadot-node-subsystem", path = "../../subsystem" } +parking_lot = "0.10.0" diff --git a/node/test-helpers/subsystem/src/lib.rs b/node/test-helpers/subsystem/src/lib.rs new file mode 100644 index 0000000000..c99a33c78d --- /dev/null +++ b/node/test-helpers/subsystem/src/lib.rs @@ -0,0 +1,229 @@ +// Copyright 2017-2020 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 . + +//! Utilities for testing subsystems. + +use polkadot_subsystem::{SubsystemContext, FromOverseer, SubsystemResult, SubsystemError}; +use polkadot_subsystem::messages::AllMessages; + +use futures::prelude::*; +use futures::channel::mpsc; +use futures::task::{Spawn, SpawnExt}; +use futures::poll; +use parking_lot::Mutex; + +use std::convert::Infallible; +use std::pin::Pin; +use std::sync::Arc; +use std::task::{Context, Poll, Waker}; + +enum SinkState { + Empty { + read_waker: Option, + }, + Item { + item: T, + ready_waker: Option, + flush_waker: Option, + }, +} + +/// The sink half of a single-item sink that does not resolve until the item has been read. +pub struct SingleItemSink(Arc>>); + +/// The stream half of a single-item sink. +pub struct SingleItemStream(Arc>>); + +impl Sink for SingleItemSink { + type Error = Infallible; + + fn poll_ready( + self: Pin<&mut Self>, + cx: &mut Context, + ) -> Poll> { + let mut state = self.0.lock(); + match *state { + SinkState::Empty { .. } => Poll::Ready(Ok(())), + SinkState::Item { ref mut ready_waker, .. } => { + *ready_waker = Some(cx.waker().clone()); + Poll::Pending + } + } + } + + fn start_send( + self: Pin<&mut Self>, + item: T, + ) -> Result<(), Infallible> { + let mut state = self.0.lock(); + + match *state { + SinkState::Empty { ref mut read_waker } => { + if let Some(waker) = read_waker.take() { + waker.wake(); + } + } + _ => panic!("start_send called outside of empty sink state ensured by poll_ready"), + } + + *state = SinkState::Item { + item, + ready_waker: None, + flush_waker: None, + }; + + Ok(()) + } + + fn poll_flush( + self: Pin<&mut Self>, + cx: &mut Context, + ) -> Poll> { + let mut state = self.0.lock(); + match *state { + SinkState::Empty { .. } => Poll::Ready(Ok(())), + SinkState::Item { ref mut flush_waker, .. } => { + *flush_waker = Some(cx.waker().clone()); + Poll::Pending + } + } + } + + fn poll_close( + self: Pin<&mut Self>, + cx: &mut Context, + ) -> Poll> { + self.poll_flush(cx) + } +} + +impl Stream for SingleItemStream { + type Item = T; + + fn poll_next(self: Pin<&mut Self>, cx: &mut Context) -> Poll> { + let mut state = self.0.lock(); + + let read_waker = Some(cx.waker().clone()); + + match std::mem::replace(&mut *state, SinkState::Empty { read_waker }) { + SinkState::Empty { .. } => Poll::Pending, + SinkState::Item { item, ready_waker, flush_waker } => { + if let Some(waker) = ready_waker { + waker.wake(); + } + + if let Some(waker) = flush_waker { + waker.wake(); + } + + Poll::Ready(Some(item)) + } + } + } +} + +/// Create a single-item Sink/Stream pair. +/// +/// The sink's send methods resolve at the point which the stream reads the item, +/// not when the item is buffered. +pub fn single_item_sink() -> (SingleItemSink, SingleItemStream) { + let inner = Arc::new(Mutex::new(SinkState::Empty { read_waker: None })); + ( + SingleItemSink(inner.clone()), + SingleItemStream(inner), + ) +} + +/// A test subsystem context. +pub struct TestSubsystemContext { + tx: mpsc::UnboundedSender, + rx: SingleItemStream>, + spawn: S, +} + +#[async_trait::async_trait] +impl SubsystemContext for TestSubsystemContext { + type Message = M; + + async fn try_recv(&mut self) -> Result>, ()> { + match poll!(self.rx.next()) { + Poll::Ready(Some(msg)) => Ok(Some(msg)), + Poll::Ready(None) => Err(()), + Poll::Pending => Ok(None), + } + } + + async fn recv(&mut self) -> SubsystemResult> { + self.rx.next().await.ok_or(SubsystemError) + } + + async fn spawn(&mut self, s: Pin + Send>>) -> SubsystemResult<()> { + self.spawn.spawn(s).map_err(Into::into) + } + + async fn send_message(&mut self, msg: AllMessages) -> SubsystemResult<()> { + self.tx.send(msg).await.expect("test overseer no longer live"); + Ok(()) + } + + async fn send_messages(&mut self, msgs: T) -> SubsystemResult<()> + where T: IntoIterator + Send, T::IntoIter: Send + { + let mut iter = stream::iter(msgs.into_iter().map(Ok)); + self.tx.send_all(&mut iter).await.expect("test overseer no longer live"); + + Ok(()) + } +} + +/// A handle for interacting with the subsystem context. +pub struct TestSubsystemContextHandle { + tx: SingleItemSink>, + rx: mpsc::UnboundedReceiver, +} + +impl TestSubsystemContextHandle { + /// Send a message or signal to the subsystem. This resolves at the point in time where the + /// subsystem has _read_ the message. + pub async fn send(&mut self, from_overseer: FromOverseer) { + self.tx.send(from_overseer).await.expect("Test subsystem no longer live"); + } + + /// Receive the next message from the subsystem. + pub async fn recv(&mut self) -> AllMessages { + self.rx.next().await.expect("Test subsystem no longer live") + } +} + +/// Make a test subsystem context. +pub fn make_subsystem_context(spawn: S) + -> (TestSubsystemContext, TestSubsystemContextHandle) +{ + let (overseer_tx, overseer_rx) = single_item_sink(); + let (all_messages_tx, all_messages_rx) = mpsc::unbounded(); + + ( + TestSubsystemContext { + tx: all_messages_tx, + rx: overseer_rx, + spawn, + }, + TestSubsystemContextHandle { + tx: overseer_tx, + rx: all_messages_rx + }, + ) +} -- GitLab From d1ce37339808f8ff9873c9f0c44cb32593743db4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Tue, 30 Jun 2020 17:21:45 +0200 Subject: [PATCH 021/192] Companion for Substrate #6508 (#1329) * Companion for Substrate #6508 * Update Cargo.lock --- Cargo.lock | 272 +++++++++++++++---------------- network/test/src/block_import.rs | 8 +- network/test/src/lib.rs | 6 +- 3 files changed, 143 insertions(+), 143 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index ed39f79eab..9463440019 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1261,7 +1261,7 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "fork-tree" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" +source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" dependencies = [ "parity-scale-codec", ] @@ -1269,7 +1269,7 @@ dependencies = [ [[package]] name = "frame-benchmarking" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" +source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" dependencies = [ "frame-support", "frame-system", @@ -1286,7 +1286,7 @@ dependencies = [ [[package]] name = "frame-benchmarking-cli" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" +source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" dependencies = [ "frame-benchmarking", "parity-scale-codec", @@ -1304,7 +1304,7 @@ dependencies = [ [[package]] name = "frame-executive" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" +source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" dependencies = [ "frame-support", "frame-system", @@ -1319,7 +1319,7 @@ dependencies = [ [[package]] name = "frame-metadata" version = "11.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" +source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" dependencies = [ "parity-scale-codec", "serde", @@ -1330,7 +1330,7 @@ dependencies = [ [[package]] name = "frame-support" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" +source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" dependencies = [ "bitmask", "frame-metadata", @@ -1355,7 +1355,7 @@ dependencies = [ [[package]] name = "frame-support-procedural" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" +source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" dependencies = [ "frame-support-procedural-tools", "proc-macro2 1.0.18", @@ -1366,7 +1366,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" +source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" dependencies = [ "frame-support-procedural-tools-derive", "proc-macro-crate", @@ -1378,7 +1378,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools-derive" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" +source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" dependencies = [ "proc-macro2 1.0.18", "quote 1.0.7", @@ -1388,7 +1388,7 @@ dependencies = [ [[package]] name = "frame-system" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" +source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" dependencies = [ "frame-support", "impl-trait-for-tuples", @@ -1404,7 +1404,7 @@ dependencies = [ [[package]] name = "frame-system-benchmarking" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" +source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" dependencies = [ "frame-benchmarking", "frame-support", @@ -1418,7 +1418,7 @@ dependencies = [ [[package]] name = "frame-system-rpc-runtime-api" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" +source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" dependencies = [ "parity-scale-codec", "sp-api", @@ -3375,7 +3375,7 @@ dependencies = [ [[package]] name = "pallet-authority-discovery" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" +source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" dependencies = [ "frame-support", "frame-system", @@ -3391,7 +3391,7 @@ dependencies = [ [[package]] name = "pallet-authorship" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" +source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" dependencies = [ "frame-support", "frame-system", @@ -3406,7 +3406,7 @@ dependencies = [ [[package]] name = "pallet-babe" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" +source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" dependencies = [ "frame-support", "frame-system", @@ -3428,7 +3428,7 @@ dependencies = [ [[package]] name = "pallet-balances" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" +source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" dependencies = [ "frame-benchmarking", "frame-support", @@ -3442,7 +3442,7 @@ dependencies = [ [[package]] name = "pallet-collective" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" +source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" dependencies = [ "frame-benchmarking", "frame-support", @@ -3458,7 +3458,7 @@ dependencies = [ [[package]] name = "pallet-democracy" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" +source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" dependencies = [ "frame-benchmarking", "frame-support", @@ -3473,7 +3473,7 @@ dependencies = [ [[package]] name = "pallet-elections-phragmen" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" +source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" dependencies = [ "frame-benchmarking", "frame-support", @@ -3488,7 +3488,7 @@ dependencies = [ [[package]] name = "pallet-finality-tracker" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" +source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" dependencies = [ "frame-support", "frame-system", @@ -3504,7 +3504,7 @@ dependencies = [ [[package]] name = "pallet-grandpa" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" +source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" dependencies = [ "frame-support", "frame-system", @@ -3524,7 +3524,7 @@ dependencies = [ [[package]] name = "pallet-identity" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" +source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" dependencies = [ "enumflags2", "frame-benchmarking", @@ -3540,7 +3540,7 @@ dependencies = [ [[package]] name = "pallet-im-online" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" +source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" dependencies = [ "frame-benchmarking", "frame-support", @@ -3560,7 +3560,7 @@ dependencies = [ [[package]] name = "pallet-indices" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" +source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" dependencies = [ "frame-support", "frame-system", @@ -3576,7 +3576,7 @@ dependencies = [ [[package]] name = "pallet-membership" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" +source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" dependencies = [ "frame-support", "frame-system", @@ -3590,7 +3590,7 @@ dependencies = [ [[package]] name = "pallet-multisig" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" +source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" dependencies = [ "frame-support", "frame-system", @@ -3605,7 +3605,7 @@ dependencies = [ [[package]] name = "pallet-nicks" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" +source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" dependencies = [ "frame-support", "frame-system", @@ -3619,7 +3619,7 @@ dependencies = [ [[package]] name = "pallet-offences" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" +source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" dependencies = [ "frame-support", "frame-system", @@ -3634,7 +3634,7 @@ dependencies = [ [[package]] name = "pallet-offences-benchmarking" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" +source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" dependencies = [ "frame-benchmarking", "frame-support", @@ -3655,7 +3655,7 @@ dependencies = [ [[package]] name = "pallet-proxy" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" +source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" dependencies = [ "frame-support", "frame-system", @@ -3670,7 +3670,7 @@ dependencies = [ [[package]] name = "pallet-randomness-collective-flip" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" +source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" dependencies = [ "frame-support", "frame-system", @@ -3683,7 +3683,7 @@ dependencies = [ [[package]] name = "pallet-recovery" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" +source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" dependencies = [ "enumflags2", "frame-support", @@ -3698,7 +3698,7 @@ dependencies = [ [[package]] name = "pallet-scheduler" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" +source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" dependencies = [ "frame-benchmarking", "frame-support", @@ -3713,7 +3713,7 @@ dependencies = [ [[package]] name = "pallet-session" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" +source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" dependencies = [ "frame-support", "frame-system", @@ -3733,7 +3733,7 @@ dependencies = [ [[package]] name = "pallet-session-benchmarking" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" +source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" dependencies = [ "frame-benchmarking", "frame-support", @@ -3747,7 +3747,7 @@ dependencies = [ [[package]] name = "pallet-society" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" +source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" dependencies = [ "frame-support", "frame-system", @@ -3761,7 +3761,7 @@ dependencies = [ [[package]] name = "pallet-staking" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" +source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" dependencies = [ "frame-benchmarking", "frame-support", @@ -3783,7 +3783,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-curve" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" +source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -3794,7 +3794,7 @@ dependencies = [ [[package]] name = "pallet-sudo" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" +source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" dependencies = [ "frame-support", "frame-system", @@ -3808,7 +3808,7 @@ dependencies = [ [[package]] name = "pallet-timestamp" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" +source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" dependencies = [ "frame-benchmarking", "frame-support", @@ -3826,7 +3826,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" +source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" dependencies = [ "frame-support", "frame-system", @@ -3841,7 +3841,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" +source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" dependencies = [ "jsonrpc-core", "jsonrpc-core-client", @@ -3859,7 +3859,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc-runtime-api" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" +source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" dependencies = [ "frame-support", "parity-scale-codec", @@ -3872,7 +3872,7 @@ dependencies = [ [[package]] name = "pallet-treasury" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" +source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" dependencies = [ "frame-benchmarking", "frame-support", @@ -3887,7 +3887,7 @@ dependencies = [ [[package]] name = "pallet-utility" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" +source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" dependencies = [ "frame-benchmarking", "frame-support", @@ -3903,7 +3903,7 @@ dependencies = [ [[package]] name = "pallet-vesting" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" +source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" dependencies = [ "enumflags2", "frame-benchmarking", @@ -5692,7 +5692,7 @@ dependencies = [ [[package]] name = "sc-authority-discovery" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" +source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" dependencies = [ "bytes 0.5.4", "derive_more 0.99.8", @@ -5719,7 +5719,7 @@ dependencies = [ [[package]] name = "sc-basic-authorship" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" +source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -5743,7 +5743,7 @@ dependencies = [ [[package]] name = "sc-block-builder" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" +source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" dependencies = [ "parity-scale-codec", "sc-client-api", @@ -5759,7 +5759,7 @@ dependencies = [ [[package]] name = "sc-chain-spec" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" +source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" dependencies = [ "impl-trait-for-tuples", "sc-chain-spec-derive", @@ -5775,7 +5775,7 @@ dependencies = [ [[package]] name = "sc-chain-spec-derive" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" +source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -5786,7 +5786,7 @@ dependencies = [ [[package]] name = "sc-cli" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" +source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" dependencies = [ "ansi_term 0.12.1", "atty", @@ -5826,7 +5826,7 @@ dependencies = [ [[package]] name = "sc-client-api" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" +source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" dependencies = [ "derive_more 0.99.8", "fnv", @@ -5862,7 +5862,7 @@ dependencies = [ [[package]] name = "sc-client-db" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" +source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" dependencies = [ "blake2-rfc", "hash-db", @@ -5891,7 +5891,7 @@ dependencies = [ [[package]] name = "sc-consensus" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" +source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" dependencies = [ "sc-client-api", "sp-blockchain", @@ -5902,7 +5902,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" +source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" dependencies = [ "derive_more 0.99.8", "fork-tree", @@ -5944,7 +5944,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe-rpc" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" +source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" dependencies = [ "derive_more 0.99.8", "futures 0.3.5", @@ -5968,7 +5968,7 @@ dependencies = [ [[package]] name = "sc-consensus-epochs" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" +source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" dependencies = [ "fork-tree", "parity-scale-codec", @@ -5981,7 +5981,7 @@ dependencies = [ [[package]] name = "sc-consensus-slots" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" +source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6003,7 +6003,7 @@ dependencies = [ [[package]] name = "sc-consensus-uncles" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" +source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" dependencies = [ "log 0.4.8", "sc-client-api", @@ -6017,7 +6017,7 @@ dependencies = [ [[package]] name = "sc-executor" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" +source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" dependencies = [ "derive_more 0.99.8", "lazy_static", @@ -6045,7 +6045,7 @@ dependencies = [ [[package]] name = "sc-executor-common" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" +source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" dependencies = [ "derive_more 0.99.8", "log 0.4.8", @@ -6062,7 +6062,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmi" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" +source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" dependencies = [ "log 0.4.8", "parity-scale-codec", @@ -6077,7 +6077,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmtime" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" +source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" dependencies = [ "cranelift-codegen", "cranelift-wasm", @@ -6098,7 +6098,7 @@ dependencies = [ [[package]] name = "sc-finality-grandpa" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" +source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" dependencies = [ "assert_matches", "derive_more 0.99.8", @@ -6136,7 +6136,7 @@ dependencies = [ [[package]] name = "sc-finality-grandpa-rpc" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" +source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" dependencies = [ "derive_more 0.99.8", "finality-grandpa", @@ -6153,7 +6153,7 @@ dependencies = [ [[package]] name = "sc-informant" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" +source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" dependencies = [ "ansi_term 0.12.1", "futures 0.3.5", @@ -6172,7 +6172,7 @@ dependencies = [ [[package]] name = "sc-keystore" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" +source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" dependencies = [ "derive_more 0.99.8", "hex", @@ -6188,7 +6188,7 @@ dependencies = [ [[package]] name = "sc-light" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" +source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" dependencies = [ "hash-db", "lazy_static", @@ -6207,7 +6207,7 @@ dependencies = [ [[package]] name = "sc-network" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" +source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" dependencies = [ "bitflags", "bs58", @@ -6259,7 +6259,7 @@ dependencies = [ [[package]] name = "sc-network-gossip" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" +source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6274,7 +6274,7 @@ dependencies = [ [[package]] name = "sc-network-test" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" +source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" dependencies = [ "env_logger", "futures 0.3.5", @@ -6301,7 +6301,7 @@ dependencies = [ [[package]] name = "sc-offchain" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" +source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" dependencies = [ "bytes 0.5.4", "fnv", @@ -6328,7 +6328,7 @@ dependencies = [ [[package]] name = "sc-peerset" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" +source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" dependencies = [ "futures 0.3.5", "libp2p", @@ -6341,7 +6341,7 @@ dependencies = [ [[package]] name = "sc-proposer-metrics" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" +source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" dependencies = [ "log 0.4.8", "substrate-prometheus-endpoint", @@ -6350,7 +6350,7 @@ dependencies = [ [[package]] name = "sc-rpc" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" +source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" dependencies = [ "futures 0.3.5", "hash-db", @@ -6382,7 +6382,7 @@ dependencies = [ [[package]] name = "sc-rpc-api" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" +source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" dependencies = [ "derive_more 0.99.8", "futures 0.3.5", @@ -6406,7 +6406,7 @@ dependencies = [ [[package]] name = "sc-rpc-server" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" +source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" dependencies = [ "jsonrpc-core", "jsonrpc-http-server", @@ -6422,7 +6422,7 @@ dependencies = [ [[package]] name = "sc-service" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" +source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" dependencies = [ "derive_more 0.99.8", "directories", @@ -6485,7 +6485,7 @@ dependencies = [ [[package]] name = "sc-state-db" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" +source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" dependencies = [ "log 0.4.8", "parity-scale-codec", @@ -6499,7 +6499,7 @@ dependencies = [ [[package]] name = "sc-telemetry" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" +source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6520,7 +6520,7 @@ dependencies = [ [[package]] name = "sc-tracing" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" +source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" dependencies = [ "erased-serde", "log 0.4.8", @@ -6537,7 +6537,7 @@ dependencies = [ [[package]] name = "sc-transaction-graph" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" +source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" dependencies = [ "derive_more 0.99.8", "futures 0.3.5", @@ -6557,7 +6557,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" +source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" dependencies = [ "derive_more 0.99.8", "futures 0.3.5", @@ -6934,7 +6934,7 @@ dependencies = [ [[package]] name = "sp-allocator" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" +source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" dependencies = [ "derive_more 0.99.8", "log 0.4.8", @@ -6946,7 +6946,7 @@ dependencies = [ [[package]] name = "sp-api" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" +source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" dependencies = [ "hash-db", "parity-scale-codec", @@ -6961,7 +6961,7 @@ dependencies = [ [[package]] name = "sp-api-proc-macro" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" +source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" dependencies = [ "blake2-rfc", "proc-macro-crate", @@ -6973,7 +6973,7 @@ dependencies = [ [[package]] name = "sp-application-crypto" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" +source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" dependencies = [ "parity-scale-codec", "serde", @@ -6985,7 +6985,7 @@ dependencies = [ [[package]] name = "sp-arithmetic" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" +source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" dependencies = [ "integer-sqrt", "num-traits 0.2.12", @@ -6998,7 +6998,7 @@ dependencies = [ [[package]] name = "sp-authority-discovery" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" +source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" dependencies = [ "parity-scale-codec", "sp-api", @@ -7010,7 +7010,7 @@ dependencies = [ [[package]] name = "sp-authorship" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" +source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" dependencies = [ "parity-scale-codec", "sp-inherents", @@ -7021,7 +7021,7 @@ dependencies = [ [[package]] name = "sp-block-builder" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" +source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" dependencies = [ "parity-scale-codec", "sp-api", @@ -7033,7 +7033,7 @@ dependencies = [ [[package]] name = "sp-blockchain" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" +source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" dependencies = [ "derive_more 0.99.8", "log 0.4.8", @@ -7049,7 +7049,7 @@ dependencies = [ [[package]] name = "sp-chain-spec" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" +source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" dependencies = [ "serde", "serde_json", @@ -7058,7 +7058,7 @@ dependencies = [ [[package]] name = "sp-consensus" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" +source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" dependencies = [ "derive_more 0.99.8", "futures 0.3.5", @@ -7082,7 +7082,7 @@ dependencies = [ [[package]] name = "sp-consensus-aura" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" +source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" dependencies = [ "parity-scale-codec", "sp-api", @@ -7096,7 +7096,7 @@ dependencies = [ [[package]] name = "sp-consensus-babe" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" +source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" dependencies = [ "merlin", "parity-scale-codec", @@ -7114,7 +7114,7 @@ dependencies = [ [[package]] name = "sp-consensus-vrf" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" +source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" dependencies = [ "parity-scale-codec", "schnorrkel", @@ -7126,7 +7126,7 @@ dependencies = [ [[package]] name = "sp-core" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" +source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" dependencies = [ "base58", "blake2-rfc", @@ -7168,7 +7168,7 @@ dependencies = [ [[package]] name = "sp-database" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" +source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" dependencies = [ "kvdb", "parking_lot 0.10.2", @@ -7177,7 +7177,7 @@ dependencies = [ [[package]] name = "sp-debug-derive" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" +source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" dependencies = [ "proc-macro2 1.0.18", "quote 1.0.7", @@ -7187,7 +7187,7 @@ dependencies = [ [[package]] name = "sp-externalities" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" +source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" dependencies = [ "environmental", "parity-scale-codec", @@ -7198,7 +7198,7 @@ dependencies = [ [[package]] name = "sp-finality-grandpa" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" +source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" dependencies = [ "finality-grandpa", "log 0.4.8", @@ -7214,7 +7214,7 @@ dependencies = [ [[package]] name = "sp-finality-tracker" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" +source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" dependencies = [ "parity-scale-codec", "sp-inherents", @@ -7224,7 +7224,7 @@ dependencies = [ [[package]] name = "sp-inherents" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" +source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" dependencies = [ "derive_more 0.99.8", "parity-scale-codec", @@ -7236,7 +7236,7 @@ dependencies = [ [[package]] name = "sp-io" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" +source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" dependencies = [ "futures 0.3.5", "hash-db", @@ -7257,7 +7257,7 @@ dependencies = [ [[package]] name = "sp-keyring" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" +source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" dependencies = [ "lazy_static", "sp-core", @@ -7268,7 +7268,7 @@ dependencies = [ [[package]] name = "sp-npos-elections" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" +source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" dependencies = [ "parity-scale-codec", "serde", @@ -7280,7 +7280,7 @@ dependencies = [ [[package]] name = "sp-npos-elections-compact" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" +source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -7291,7 +7291,7 @@ dependencies = [ [[package]] name = "sp-offchain" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" +source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" dependencies = [ "sp-api", "sp-core", @@ -7301,7 +7301,7 @@ dependencies = [ [[package]] name = "sp-panic-handler" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" +source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" dependencies = [ "backtrace", "log 0.4.8", @@ -7310,7 +7310,7 @@ dependencies = [ [[package]] name = "sp-rpc" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" +source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" dependencies = [ "serde", "sp-core", @@ -7319,7 +7319,7 @@ dependencies = [ [[package]] name = "sp-runtime" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" +source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" dependencies = [ "either", "hash256-std-hasher", @@ -7341,7 +7341,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" +source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" dependencies = [ "parity-scale-codec", "primitive-types", @@ -7356,7 +7356,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" +source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" dependencies = [ "Inflector", "proc-macro-crate", @@ -7368,7 +7368,7 @@ dependencies = [ [[package]] name = "sp-serializer" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" +source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" dependencies = [ "serde", "serde_json", @@ -7377,7 +7377,7 @@ dependencies = [ [[package]] name = "sp-session" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" +source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" dependencies = [ "parity-scale-codec", "sp-api", @@ -7390,7 +7390,7 @@ dependencies = [ [[package]] name = "sp-staking" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" +source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" dependencies = [ "parity-scale-codec", "sp-runtime", @@ -7400,7 +7400,7 @@ dependencies = [ [[package]] name = "sp-state-machine" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" +source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" dependencies = [ "hash-db", "itertools 0.9.0", @@ -7421,12 +7421,12 @@ dependencies = [ [[package]] name = "sp-std" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" +source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" [[package]] name = "sp-storage" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" +source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" dependencies = [ "impl-serde 0.2.3", "ref-cast", @@ -7438,7 +7438,7 @@ dependencies = [ [[package]] name = "sp-timestamp" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" +source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -7452,7 +7452,7 @@ dependencies = [ [[package]] name = "sp-tracing" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" +source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" dependencies = [ "log 0.4.8", "rental", @@ -7462,7 +7462,7 @@ dependencies = [ [[package]] name = "sp-transaction-pool" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" +source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" dependencies = [ "derive_more 0.99.8", "futures 0.3.5", @@ -7478,7 +7478,7 @@ dependencies = [ [[package]] name = "sp-trie" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" +source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" dependencies = [ "hash-db", "memory-db", @@ -7492,7 +7492,7 @@ dependencies = [ [[package]] name = "sp-utils" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" +source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" dependencies = [ "futures 0.3.5", "futures-core", @@ -7504,7 +7504,7 @@ dependencies = [ [[package]] name = "sp-version" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" +source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" dependencies = [ "impl-serde 0.2.3", "parity-scale-codec", @@ -7516,7 +7516,7 @@ dependencies = [ [[package]] name = "sp-wasm-interface" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" +source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -7656,7 +7656,7 @@ dependencies = [ [[package]] name = "substrate-browser-utils" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" +source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" dependencies = [ "chrono", "clear_on_drop", @@ -7683,7 +7683,7 @@ dependencies = [ [[package]] name = "substrate-build-script-utils" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" +source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" dependencies = [ "platforms", ] @@ -7691,7 +7691,7 @@ dependencies = [ [[package]] name = "substrate-frame-rpc-system" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" +source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" dependencies = [ "frame-system-rpc-runtime-api", "futures 0.3.5", @@ -7714,7 +7714,7 @@ dependencies = [ [[package]] name = "substrate-prometheus-endpoint" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" +source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" dependencies = [ "async-std", "derive_more 0.99.8", @@ -7728,7 +7728,7 @@ dependencies = [ [[package]] name = "substrate-test-client" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" +source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" dependencies = [ "futures 0.3.5", "hash-db", @@ -7750,7 +7750,7 @@ dependencies = [ [[package]] name = "substrate-test-runtime" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" +source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" dependencies = [ "cfg-if", "frame-executive", @@ -7790,7 +7790,7 @@ dependencies = [ [[package]] name = "substrate-test-runtime-client" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" +source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" dependencies = [ "futures 0.3.5", "parity-scale-codec", @@ -7811,7 +7811,7 @@ dependencies = [ [[package]] name = "substrate-wasm-builder-runner" version = "1.0.6" -source = "git+https://github.com/paritytech/substrate#ec2ab7978a54e7f20af2f9ac12bde7719bb744fb" +source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" [[package]] name = "substrate-wasm-builder-runner" diff --git a/network/test/src/block_import.rs b/network/test/src/block_import.rs index ce4c9f8ba0..ec848609cd 100644 --- a/network/test/src/block_import.rs +++ b/network/test/src/block_import.rs @@ -60,7 +60,7 @@ fn import_single_good_block_works() { let mut expected_aux = ImportedAux::default(); expected_aux.is_new_best = true; - match import_single_block(&mut polkadot_test_runtime_client::new(), BlockOrigin::File, block, &mut PassThroughVerifier(true)) { + match import_single_block(&mut polkadot_test_runtime_client::new(), BlockOrigin::File, block, &mut PassThroughVerifier::new(true)) { Ok(BlockImportResult::ImportedUnknown(ref num, ref aux, ref org)) if *num == number as u32 && *aux == expected_aux && *org == Some(peer_id) => {} r @ _ => panic!("{:?}", r) @@ -70,7 +70,7 @@ fn import_single_good_block_works() { #[test] fn import_single_good_known_block_is_ignored() { let (mut client, _hash, number, _, block) = prepare_good_block(); - match import_single_block(&mut client, BlockOrigin::File, block, &mut PassThroughVerifier(true)) { + match import_single_block(&mut client, BlockOrigin::File, block, &mut PassThroughVerifier::new(true)) { Ok(BlockImportResult::ImportedKnown(ref n)) if *n == number as u32 => {} _ => panic!() } @@ -80,7 +80,7 @@ fn import_single_good_known_block_is_ignored() { fn import_single_good_block_without_header_fails() { let (_, _, _, peer_id, mut block) = prepare_good_block(); block.header = None; - match import_single_block(&mut polkadot_test_runtime_client::new(), BlockOrigin::File, block, &mut PassThroughVerifier(true)) { + match import_single_block(&mut polkadot_test_runtime_client::new(), BlockOrigin::File, block, &mut PassThroughVerifier::new(true)) { Err(BlockImportError::IncompleteHeader(ref org)) if *org == Some(peer_id) => {} _ => panic!() } @@ -91,7 +91,7 @@ fn async_import_queue_drops() { let executor = sp_core::testing::SpawnBlockingExecutor::new(); // Perform this test multiple times since it exhibits non-deterministic behavior. for _ in 0..100 { - let verifier = PassThroughVerifier(true); + let verifier = PassThroughVerifier::new(true); let queue = BasicQueue::new( verifier, diff --git a/network/test/src/lib.rs b/network/test/src/lib.rs index c48bfabdfb..f8afc4fb0c 100644 --- a/network/test/src/lib.rs +++ b/network/test/src/lib.rs @@ -600,7 +600,7 @@ pub trait TestNetFactory: Sized { transaction_pool: Arc::new(EmptyTransactionPool), protocol_id: ProtocolId::from(&b"test-protocol-name"[..]), import_queue, - block_announce_validator: Box::new(DefaultBlockAnnounceValidator::new(client.clone())), + block_announce_validator: Box::new(DefaultBlockAnnounceValidator), metrics_registry: None, }).unwrap(); @@ -677,7 +677,7 @@ pub trait TestNetFactory: Sized { transaction_pool: Arc::new(EmptyTransactionPool), protocol_id: ProtocolId::from(&b"test-protocol-name"[..]), import_queue, - block_announce_validator: Box::new(DefaultBlockAnnounceValidator::new(client.clone())), + block_announce_validator: Box::new(DefaultBlockAnnounceValidator), metrics_registry: None, }).unwrap(); @@ -804,7 +804,7 @@ impl TestNetFactory for TestNet { fn make_verifier(&self, _client: PeersClient, _config: &ProtocolConfig, _peer_data: &()) -> Self::Verifier { - PassThroughVerifier(false) + PassThroughVerifier::new(false) } fn peer(&mut self, i: usize) -> &mut Peer<()> { -- GitLab From f930c7bda694b6f17e93cc5338b7f5f51d773621 Mon Sep 17 00:00:00 2001 From: Shawn Tabrizi Date: Tue, 30 Jun 2020 18:50:20 +0200 Subject: [PATCH 022/192] Companion for #6511 (#1321) * Add custom runtime upgrade for retract tip * cargo update -p sp-io --- runtime/kusama/src/lib.rs | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/runtime/kusama/src/lib.rs b/runtime/kusama/src/lib.rs index 4017a051a1..c60e31eddd 100644 --- a/runtime/kusama/src/lib.rs +++ b/runtime/kusama/src/lib.rs @@ -880,6 +880,14 @@ impl proxy::Trait for Runtime { type MaxProxies = MaxProxies; } +pub struct CustomOnRuntimeUpgrade; +impl frame_support::traits::OnRuntimeUpgrade for CustomOnRuntimeUpgrade { + fn on_runtime_upgrade() -> frame_support::weights::Weight { + treasury::Module::::migrate_retract_tip_for_tip_new(); + 500_000_000 + } +} + construct_runtime! { pub enum Runtime where Block = Block, @@ -981,7 +989,14 @@ pub type UncheckedExtrinsic = generic::UncheckedExtrinsic; /// Executive: handles dispatch to the various modules. -pub type Executive = executive::Executive, Runtime, AllModules>; +pub type Executive = executive::Executive< + Runtime, + Block, + system::ChainContext, + Runtime, + AllModules, + CustomOnRuntimeUpgrade +>; /// The payload being signed in the transactions. pub type SignedPayload = generic::SignedPayload; -- GitLab From 7a7d41c236d070da7ba42f4bcf6e7dbc7432d255 Mon Sep 17 00:00:00 2001 From: Cecile Tonglet Date: Tue, 30 Jun 2020 19:04:50 +0200 Subject: [PATCH 023/192] Use spawner to spawn work task instead of tokio (#1328) * Use spawner to spawn work task instead of tokio This allows the caller to choose the runtime they want (instead of tokio). * Replace generic by actual type --- collator/src/lib.rs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/collator/src/lib.rs b/collator/src/lib.rs index e2778238ce..f790d70557 100644 --- a/collator/src/lib.rs +++ b/collator/src/lib.rs @@ -81,6 +81,7 @@ use polkadot_service_new::{ self as polkadot_service, Error as ServiceError, FullNodeHandles, PolkadotClient, }; +use sc_service::SpawnTaskHandle; const COLLATION_TIMEOUT: Duration = Duration::from_secs(30); @@ -236,8 +237,8 @@ fn build_collator_service( #[cfg(not(feature = "service-rewr"))] -fn build_collator_service( - spawner: SP, +fn build_collator_service( + spawner: SpawnTaskHandle, handles: FullNodeHandles, client: Arc, para_id: ParaId, @@ -265,7 +266,6 @@ fn build_collator_service( P::ParachainContext: Send + 'static, ::ProduceCandidate: Send, Extrinsic: service::Codec + Send + Sync + 'static, - SP: Spawn + Clone + Send + Sync + 'static, { let polkadot_network = handles.polkadot_network .ok_or_else(|| "Collator cannot run when Polkadot-specific networking has not been started")?; @@ -278,7 +278,7 @@ fn build_collator_service( let parachain_context = match build_parachain_context.build( client.clone(), - spawner, + spawner.clone(), polkadot_network.clone(), ) { Ok(ctx) => ctx, @@ -359,7 +359,7 @@ fn build_collator_service( let future = silenced.map(drop); - tokio::spawn(future); + spawner.spawn("collation-work", future); } }.boxed(); -- GitLab From 17650cefab8118468025e7101d839edcf70fe34a Mon Sep 17 00:00:00 2001 From: Robert Habermeier Date: Tue, 30 Jun 2020 15:16:37 -0400 Subject: [PATCH 024/192] Subsystem::start takes self by-value (#1325) * Subsystem::start takes self by-value * fix doc-test compilation --- node/network/bridge/src/lib.rs | 20 +++------- node/overseer/examples/minimal-example.rs | 8 ++-- node/overseer/src/lib.rs | 46 +++++++++++------------ node/service/src/lib.rs | 8 ++-- node/subsystem/src/lib.rs | 2 +- 5 files changed, 38 insertions(+), 46 deletions(-) diff --git a/node/network/bridge/src/lib.rs b/node/network/bridge/src/lib.rs index aef1632a94..6f90779afe 100644 --- a/node/network/bridge/src/lib.rs +++ b/node/network/bridge/src/lib.rs @@ -164,7 +164,7 @@ impl Network for Arc> { } /// The network bridge subsystem. -pub struct NetworkBridge(Option); +pub struct NetworkBridge(N); impl NetworkBridge { /// Create a new network bridge subsystem with underlying network service. @@ -172,7 +172,7 @@ impl NetworkBridge { /// This assumes that the network service has had the notifications protocol for the network /// bridge already registered. See [`notifications_protocol_info`](notifications_protocol_info). pub fn new(net_service: N) -> Self { - NetworkBridge(Some(net_service)) + NetworkBridge(net_service) } } @@ -181,18 +181,10 @@ impl Subsystem for NetworkBridge Net: Network, Context: SubsystemContext, { - fn start(&mut self, mut ctx: Context) -> SpawnedSubsystem { - SpawnedSubsystem(match self.0.take() { - None => async move { for _ in ctx.recv().await { } }.boxed(), - Some(net) => { - // Swallow error because failure is fatal to the node and we log with more precision - // within `run_network`. - run_network(net, ctx).map(|_| ()).boxed() - } - }) - - - + fn start(self, ctx: Context) -> SpawnedSubsystem { + // Swallow error because failure is fatal to the node and we log with more precision + // within `run_network`. + SpawnedSubsystem(run_network(self.0, ctx).map(|_| ()).boxed()) } } diff --git a/node/overseer/examples/minimal-example.rs b/node/overseer/examples/minimal-example.rs index 0edc87a6b8..cdef0340d0 100644 --- a/node/overseer/examples/minimal-example.rs +++ b/node/overseer/examples/minimal-example.rs @@ -74,7 +74,7 @@ impl Subsystem1 { impl Subsystem for Subsystem1 where C: SubsystemContext { - fn start(&mut self, ctx: C) -> SpawnedSubsystem { + fn start(self, ctx: C) -> SpawnedSubsystem { SpawnedSubsystem(Box::pin(async move { Self::run(ctx).await; })) @@ -111,7 +111,7 @@ impl Subsystem2 { impl Subsystem for Subsystem2 where C: SubsystemContext { - fn start(&mut self, ctx: C) -> SpawnedSubsystem { + fn start(self, ctx: C) -> SpawnedSubsystem { SpawnedSubsystem(Box::pin(async move { Self::run(ctx).await; })) @@ -129,8 +129,8 @@ fn main() { let (overseer, _handler) = Overseer::new( vec![], - Box::new(Subsystem2), - Box::new(Subsystem1), + Subsystem2, + Subsystem1, spawner, ).unwrap(); let overseer_fut = overseer.run().fuse(); diff --git a/node/overseer/src/lib.rs b/node/overseer/src/lib.rs index 8fb8706be4..706ba58a5e 100644 --- a/node/overseer/src/lib.rs +++ b/node/overseer/src/lib.rs @@ -314,7 +314,6 @@ pub type CompatibleSubsystem = Box> /// [`Subsystem`]: trait.Subsystem.html #[allow(dead_code)] struct OverseenSubsystem { - subsystem: CompatibleSubsystem, instance: Option>, } @@ -407,7 +406,7 @@ where /// where C: SubsystemContext /// { /// fn start( - /// &mut self, + /// self, /// mut ctx: C, /// ) -> SpawnedSubsystem { /// SpawnedSubsystem(Box::pin(async move { @@ -423,7 +422,7 @@ where /// where C: SubsystemContext /// { /// fn start( - /// &mut self, + /// self, /// mut ctx: C, /// ) -> SpawnedSubsystem { /// SpawnedSubsystem(Box::pin(async move { @@ -438,8 +437,8 @@ where /// let spawner = executor::ThreadPool::new().unwrap(); /// let (overseer, _handler) = Overseer::new( /// vec![], - /// Box::new(ValidationSubsystem), - /// Box::new(CandidateBackingSubsystem), + /// ValidationSubsystem, + /// CandidateBackingSubsystem, /// spawner, /// ).unwrap(); /// @@ -458,8 +457,8 @@ where /// ``` pub fn new( leaves: impl IntoIterator, - validation: CompatibleSubsystem, - candidate_backing: CompatibleSubsystem, + validation: impl Subsystem> + Send, + candidate_backing: impl Subsystem> + Send, mut s: S, ) -> SubsystemResult<(Self, OverseerHandler)> { let (events_tx, events_rx) = mpsc::channel(CHANNEL_CAPACITY); @@ -658,7 +657,7 @@ fn spawn( spawner: &mut S, futures: &mut FuturesUnordered>, streams: &mut StreamUnordered>, - mut s: CompatibleSubsystem, + s: impl Subsystem>, ) -> SubsystemResult> { let (to_tx, to_rx) = mpsc::channel(CHANNEL_CAPACITY); let (from_tx, from_rx) = mpsc::channel(CHANNEL_CAPACITY); @@ -675,7 +674,6 @@ fn spawn( }); Ok(OverseenSubsystem { - subsystem: s, instance, }) } @@ -692,8 +690,8 @@ mod tests { impl Subsystem for TestSubsystem1 where C: SubsystemContext { - fn start(&mut self, mut ctx: C) -> SpawnedSubsystem { - let mut sender = self.0.clone(); + fn start(self, mut ctx: C) -> SpawnedSubsystem { + let mut sender = self.0; SpawnedSubsystem(Box::pin(async move { let mut i = 0; loop { @@ -717,8 +715,10 @@ mod tests { impl Subsystem for TestSubsystem2 where C: SubsystemContext { - fn start(&mut self, mut ctx: C) -> SpawnedSubsystem { + fn start(self, mut ctx: C) -> SpawnedSubsystem { + let sender = self.0.clone(); SpawnedSubsystem(Box::pin(async move { + let _sender = sender; let mut c: usize = 0; loop { if c < 10 { @@ -759,7 +759,7 @@ mod tests { impl Subsystem for TestSubsystem4 where C: SubsystemContext { - fn start(&mut self, mut _ctx: C) -> SpawnedSubsystem { + fn start(self, mut _ctx: C) -> SpawnedSubsystem { SpawnedSubsystem(Box::pin(async move { // Do nothing and exit. })) @@ -777,8 +777,8 @@ mod tests { let (overseer, mut handler) = Overseer::new( vec![], - Box::new(TestSubsystem1(s1_tx)), - Box::new(TestSubsystem2(s2_tx)), + TestSubsystem1(s1_tx), + TestSubsystem2(s2_tx), spawner, ).unwrap(); let overseer_fut = overseer.run().fuse(); @@ -827,8 +827,8 @@ mod tests { let (s1_tx, _) = mpsc::channel(64); let (overseer, _handle) = Overseer::new( vec![], - Box::new(TestSubsystem1(s1_tx)), - Box::new(TestSubsystem4), + TestSubsystem1(s1_tx), + TestSubsystem4, spawner, ).unwrap(); let overseer_fut = overseer.run().fuse(); @@ -846,7 +846,7 @@ mod tests { impl Subsystem for TestSubsystem5 where C: SubsystemContext { - fn start(&mut self, mut ctx: C) -> SpawnedSubsystem { + fn start(self, mut ctx: C) -> SpawnedSubsystem { let mut sender = self.0.clone(); SpawnedSubsystem(Box::pin(async move { @@ -872,7 +872,7 @@ mod tests { impl Subsystem for TestSubsystem6 where C: SubsystemContext { - fn start(&mut self, mut ctx: C) -> SpawnedSubsystem { + fn start(self, mut ctx: C) -> SpawnedSubsystem { let mut sender = self.0.clone(); SpawnedSubsystem(Box::pin(async move { @@ -925,8 +925,8 @@ mod tests { let (overseer, mut handler) = Overseer::new( vec![first_block], - Box::new(TestSubsystem5(tx_5)), - Box::new(TestSubsystem6(tx_6)), + TestSubsystem5(tx_5), + TestSubsystem6(tx_6), spawner, ).unwrap(); @@ -1010,8 +1010,8 @@ mod tests { // start with two forks of different height. let (overseer, mut handler) = Overseer::new( vec![first_block, second_block], - Box::new(TestSubsystem5(tx_5)), - Box::new(TestSubsystem6(tx_6)), + TestSubsystem5(tx_5), + TestSubsystem6(tx_6), spawner, ).unwrap(); diff --git a/node/service/src/lib.rs b/node/service/src/lib.rs index 8b0e27b8a6..c798d3e9aa 100644 --- a/node/service/src/lib.rs +++ b/node/service/src/lib.rs @@ -272,7 +272,7 @@ struct CandidateValidationSubsystem; impl Subsystem for CandidateValidationSubsystem where C: SubsystemContext { - fn start(&mut self, mut ctx: C) -> SpawnedSubsystem { + fn start(self, mut ctx: C) -> SpawnedSubsystem { SpawnedSubsystem(Box::pin(async move { while let Ok(_) = ctx.recv().await {} })) @@ -284,7 +284,7 @@ struct CandidateBackingSubsystem; impl Subsystem for CandidateBackingSubsystem where C: SubsystemContext { - fn start(&mut self, mut ctx: C) -> SpawnedSubsystem { + fn start(self, mut ctx: C) -> SpawnedSubsystem { SpawnedSubsystem(Box::pin(async move { while let Ok(_) = ctx.recv().await {} })) @@ -295,8 +295,8 @@ fn real_overseer( leaves: impl IntoIterator, s: S, ) -> Result<(Overseer, OverseerHandler), ServiceError> { - let validation = Box::new(CandidateValidationSubsystem); - let candidate_backing = Box::new(CandidateBackingSubsystem); + let validation = CandidateValidationSubsystem; + let candidate_backing = CandidateBackingSubsystem; Overseer::new(leaves, validation, candidate_backing, s) .map_err(|e| ServiceError::Other(format!("Failed to create an Overseer: {:?}", e))) } diff --git a/node/subsystem/src/lib.rs b/node/subsystem/src/lib.rs index 31d094907f..fd32d7cfdb 100644 --- a/node/subsystem/src/lib.rs +++ b/node/subsystem/src/lib.rs @@ -146,5 +146,5 @@ pub trait SubsystemContext: Send + 'static { /// [`Subsystem`]: trait.Subsystem.html pub trait Subsystem { /// Start this `Subsystem` and return `SpawnedSubsystem`. - fn start(&mut self, ctx: C) -> SpawnedSubsystem; + fn start(self, ctx: C) -> SpawnedSubsystem; } -- GitLab From 40861d195dcacdd93cbea991b3dbe8c9bd4a02f7 Mon Sep 17 00:00:00 2001 From: Gavin Wood Date: Wed, 1 Jul 2020 15:35:57 +0200 Subject: [PATCH 025/192] Allow voting in democracy (#1331) * Allow voting in democracy. * Ensire Root can begin referenda --- runtime/polkadot/src/lib.rs | 37 ++++++++++++++++++++++++++++++------- 1 file changed, 30 insertions(+), 7 deletions(-) diff --git a/runtime/polkadot/src/lib.rs b/runtime/polkadot/src/lib.rs index 200ba5ec5c..6e42c53657 100644 --- a/runtime/polkadot/src/lib.rs +++ b/runtime/polkadot/src/lib.rs @@ -110,7 +110,12 @@ pub struct BaseFilter; impl Filter for BaseFilter { fn filter(call: &Call) -> bool { match call { - Call::Parachains(parachains::Call::set_heads(..)) => true, + Call::Parachains(parachains::Call::set_heads(..)) + | Call::Democracy(democracy::Call::vote(..)) + | Call::Democracy(democracy::Call::remove_vote(..)) + | Call::Democracy(democracy::Call::delegate(..)) + | Call::Democracy(democracy::Call::undelegate(..)) + => true, // Governance stuff Call::Democracy(_) | Call::Council(_) | Call::TechnicalCommittee(_) | @@ -394,20 +399,38 @@ impl democracy::Trait for Runtime { type VotingPeriod = VotingPeriod; type MinimumDeposit = MinimumDeposit; /// A straight majority of the council can decide what their next motion is. - type ExternalOrigin = collective::EnsureProportionAtLeast<_1, _2, AccountId, CouncilCollective>; + type ExternalOrigin = system::EnsureOneOf, + system::EnsureRoot, + >; /// A 60% super-majority can have the next scheduled referendum be a straight majority-carries vote. - type ExternalMajorityOrigin = collective::EnsureProportionAtLeast<_3, _5, AccountId, CouncilCollective>; + type ExternalMajorityOrigin = system::EnsureOneOf, + system::EnsureRoot, + >; /// A unanimous council can have the next scheduled referendum be a straight default-carries /// (NTB) vote. - type ExternalDefaultOrigin = collective::EnsureProportionAtLeast<_1, _1, AccountId, CouncilCollective>; + type ExternalDefaultOrigin = system::EnsureOneOf, + system::EnsureRoot, + >; /// Two thirds of the technical committee can have an ExternalMajority/ExternalDefault vote /// be tabled immediately and with a shorter voting/enactment period. - type FastTrackOrigin = collective::EnsureProportionAtLeast<_2, _3, AccountId, TechnicalCollective>; - type InstantOrigin = collective::EnsureProportionAtLeast<_1, _1, AccountId, TechnicalCollective>; + type FastTrackOrigin = system::EnsureOneOf, + system::EnsureRoot, + >; + type InstantOrigin = system::EnsureOneOf, + system::EnsureRoot, + >; type InstantAllowed = InstantAllowed; type FastTrackVotingPeriod = FastTrackVotingPeriod; // To cancel a proposal which has been passed, 2/3 of the council must agree to it. - type CancellationOrigin = collective::EnsureProportionAtLeast<_2, _3, AccountId, CouncilCollective>; + type CancellationOrigin = system::EnsureOneOf, + system::EnsureRoot, + >; // Any single technical committee member may veto a coming council proposal, however they can // only do it once and it lasts only for the cooloff period. type VetoOrigin = collective::EnsureMember; -- GitLab From c6b29c7bc6a4e02133da77e6bcad6495d6653aa2 Mon Sep 17 00:00:00 2001 From: Chevdor Date: Wed, 1 Jul 2020 15:36:54 +0200 Subject: [PATCH 026/192] Add registrar proxy (#1296) * Add registrar proxy * Add proxy filter for registrar for polkadot and westend * Renaming + allow batch calls for Kusama * Add batch calls for other chains --- runtime/kusama/src/lib.rs | 5 +++++ runtime/polkadot/src/lib.rs | 5 +++++ runtime/westend/src/lib.rs | 5 +++++ 3 files changed, 15 insertions(+) diff --git a/runtime/kusama/src/lib.rs b/runtime/kusama/src/lib.rs index c60e31eddd..81755c5f4e 100644 --- a/runtime/kusama/src/lib.rs +++ b/runtime/kusama/src/lib.rs @@ -799,6 +799,7 @@ pub enum ProxyType { NonTransfer, Governance, Staking, + IdentityJudgement, } impl Default for ProxyType { fn default() -> Self { Self::Any } } impl InstanceFilter for ProxyType { @@ -857,6 +858,10 @@ impl InstanceFilter for ProxyType { ProxyType::Staking => matches!(c, Call::Staking(..) | Call::Utility(..) ), + ProxyType::IdentityJudgement => matches!(c, + Call::Identity(identity::Call::provide_judgement(..)) + | Call::Utility(utility::Call::batch(..)) + ) } } fn is_superset(&self, o: &Self) -> bool { diff --git a/runtime/polkadot/src/lib.rs b/runtime/polkadot/src/lib.rs index 6e42c53657..90b9ad6395 100644 --- a/runtime/polkadot/src/lib.rs +++ b/runtime/polkadot/src/lib.rs @@ -806,6 +806,7 @@ pub enum ProxyType { Governance, Staking, SudoBalances, + IdentityJudgement, } impl Default for ProxyType { fn default() -> Self { Self::Any } } impl InstanceFilter for ProxyType { @@ -862,6 +863,10 @@ impl InstanceFilter for ProxyType { Call::Utility(..) => true, _ => false, }, + ProxyType::IdentityJudgement => matches!(c, + Call::Identity(identity::Call::provide_judgement(..)) + | Call::Utility(utility::Call::batch(..)) + ) } } fn is_superset(&self, o: &Self) -> bool { diff --git a/runtime/westend/src/lib.rs b/runtime/westend/src/lib.rs index a172e41162..6e8bd9ad3c 100644 --- a/runtime/westend/src/lib.rs +++ b/runtime/westend/src/lib.rs @@ -581,6 +581,7 @@ pub enum ProxyType { NonTransfer, Staking, SudoBalances, + IdentityJudgement, } impl Default for ProxyType { fn default() -> Self { Self::Any } } impl InstanceFilter for ProxyType { @@ -632,6 +633,10 @@ impl InstanceFilter for ProxyType { Call::Utility(..) => true, _ => false, }, + ProxyType::IdentityJudgement => matches!(c, + Call::Identity(identity::Call::provide_judgement(..)) + | Call::Utility(utility::Call::batch(..)) + ) } } fn is_superset(&self, o: &Self) -> bool { -- GitLab From 90d5dbe564ae795d68aff1c936cbdd1f98c9d536 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Wed, 1 Jul 2020 16:20:38 +0200 Subject: [PATCH 027/192] Downward & Upward messages (#1266) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Downward messages, the front-end. * Move types around to make them accessible from Parachains * Fix compilation * Fix branch * Make it compile for Cumulus * Update the branch names * Add default generic parameter * Implement `Partialeq` * Move upward messages into the `ValidationResult` * Support disabling of the runtime api * Update branch * Adds support for handling downward messages * Implement sending XCMP messages as up/downward messages * service: update to latest ServiceBuilder changes * Make it compile * Initial commit Forked at: b2c9c14971f1f06400c6522e40d02e79c0f11a05 Parent branch: origin/master * Update substrate branch to cecton-update-polkadot-substrate * Update substrate & polkadot to cumulus-branch * Reset branch * Update primitives/src/parachain.rs Co-authored-by: Robert Habermeier * Update runtime/common/src/parachains.rs Co-authored-by: Robert Habermeier * Update runtime/common/src/parachains.rs Co-authored-by: Robert Habermeier * Minor fixes * Fix wasm build Co-authored-by: Gav Wood Co-authored-by: André Silva Co-authored-by: Cecile Tonglet Co-authored-by: Robert Habermeier --- Cargo.lock | 15 +- Cargo.toml | 1 + availability-store/src/lib.rs | 4 +- availability-store/src/store.rs | 2 +- collator/src/lib.rs | 8 +- core-primitives/Cargo.toml | 20 +++ core-primitives/src/lib.rs | 96 +++++++++++ network/src/protocol/tests.rs | 3 + parachain/Cargo.toml | 6 +- parachain/src/primitives.rs | 19 +-- parachain/src/wasm_api.rs | 23 --- parachain/src/wasm_executor/mod.rs | 40 +---- .../src/wasm_executor/validation_host.rs | 77 ++------- parachain/test-parachains/adder/Cargo.toml | 6 +- .../adder/collator/src/main.rs | 3 +- .../adder/src/wasm_validation.rs | 18 +-- .../test-parachains/code-upgrader/Cargo.toml | 6 +- .../code-upgrader/src/wasm_validation.rs | 18 +-- parachain/test-parachains/tests/adder/mod.rs | 17 +- .../tests/code_upgrader/mod.rs | 18 +-- parachain/test-parachains/tests/lib.rs | 11 +- .../tests/wasm_executor/mod.rs | 8 +- primitives/Cargo.toml | 7 +- primitives/src/lib.rs | 53 +------ primitives/src/parachain.rs | 7 + runtime/common/src/parachains.rs | 149 ++++++++++++++++-- runtime/common/src/registrar.rs | 1 + runtime/kusama/Cargo.toml | 8 +- runtime/kusama/src/lib.rs | 7 + runtime/polkadot/Cargo.toml | 8 +- runtime/polkadot/src/lib.rs | 7 + runtime/test-runtime/src/lib.rs | 3 + runtime/westend/Cargo.toml | 6 + runtime/westend/src/lib.rs | 7 + validation/src/error.rs | 5 +- validation/src/pipeline.rs | 147 ++++++----------- validation/src/validation_service/mod.rs | 3 + 37 files changed, 460 insertions(+), 377 deletions(-) create mode 100644 core-primitives/Cargo.toml create mode 100644 core-primitives/src/lib.rs diff --git a/Cargo.lock b/Cargo.lock index 9463440019..e9756cfd53 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4319,6 +4319,16 @@ dependencies = [ "tokio 0.2.21", ] +[[package]] +name = "polkadot-core-primitives" +version = "0.7.30" +dependencies = [ + "parity-scale-codec", + "sp-core", + "sp-runtime", + "sp-std", +] + [[package]] name = "polkadot-erasure-coding" version = "0.8.13" @@ -4446,13 +4456,13 @@ dependencies = [ "log 0.4.8", "parity-scale-codec", "parking_lot 0.10.2", + "polkadot-core-primitives", "sc-executor", "serde", "shared_memory", "sp-core", "sp-externalities", "sp-io", - "sp-runtime-interface", "sp-std", "sp-wasm-interface", ] @@ -4464,6 +4474,7 @@ dependencies = [ "bitvec", "frame-system", "parity-scale-codec", + "polkadot-core-primitives", "polkadot-parachain", "pretty_assertions", "serde", @@ -8043,6 +8054,7 @@ dependencies = [ "parity-scale-codec", "polkadot-parachain", "sp-io", + "sp-std", "substrate-wasm-builder-runner 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "tiny-keccak 1.5.0", ] @@ -8070,6 +8082,7 @@ dependencies = [ "parity-scale-codec", "polkadot-parachain", "sp-io", + "sp-std", "substrate-wasm-builder-runner 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "tiny-keccak 1.5.0", ] diff --git a/Cargo.toml b/Cargo.toml index 4a72ae8dc6..f6632f77a1 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -26,6 +26,7 @@ members = [ "availability-store", "cli", "collator", + "core-primitives", "erasure-coding", "network", "network/test", diff --git a/availability-store/src/lib.rs b/availability-store/src/lib.rs index 8e9feea687..281441fb5e 100644 --- a/availability-store/src/lib.rs +++ b/availability-store/src/lib.rs @@ -33,7 +33,7 @@ use polkadot_primitives::{ }, }; use sp_runtime::traits::HashFor; -use sp_blockchain::{Result as ClientResult}; +use sp_blockchain::Result as ClientResult; use client::{ BlockchainEvents, BlockBackend, }; @@ -58,7 +58,7 @@ use worker::{ Worker, WorkerHandle, IncludedParachainBlocks, WorkerMsg, MakeAvailable, Chunks }; -use store::{Store as InnerStore}; +use store::Store as InnerStore; const LOG_TARGET: &str = "availability"; diff --git a/availability-store/src/store.rs b/availability-store/src/store.rs index e3b1e35929..851beabc6a 100644 --- a/availability-store/src/store.rs +++ b/availability-store/src/store.rs @@ -18,7 +18,7 @@ use kvdb_rocksdb::{Database, DatabaseConfig}; use kvdb::{KeyValueDB, DBTransaction}; use codec::{Encode, Decode}; -use polkadot_erasure_coding::{self as erasure}; +use polkadot_erasure_coding as erasure; use polkadot_primitives::{ Hash, parachain::{ diff --git a/collator/src/lib.rs b/collator/src/lib.rs index f790d70557..51f3255a74 100644 --- a/collator/src/lib.rs +++ b/collator/src/lib.rs @@ -56,7 +56,7 @@ use sc_client_api::{StateBackend, BlockchainEvents}; use sp_blockchain::HeaderBackend; use sp_core::Pair; use polkadot_primitives::{ - BlockId, Hash, Block, + BlockId, Hash, Block, DownwardMessage, parachain::{ self, BlockData, DutyRoster, HeadData, Id as ParaId, PoVBlock, ValidatorId, CollatorPair, LocalValidationData, GlobalValidationSchedule, @@ -150,6 +150,7 @@ pub trait ParachainContext: Clone { relay_parent: Hash, global_validation: GlobalValidationSchedule, local_validation: LocalValidationData, + downward_messages: Vec, ) -> Self::ProduceCandidate; } @@ -159,6 +160,7 @@ pub async fn collate

( local_id: ParaId, global_validation: GlobalValidationSchedule, local_validation_data: LocalValidationData, + downward_messages: Vec, mut para_context: P, key: Arc, ) -> Option @@ -170,6 +172,7 @@ pub async fn collate

( relay_parent, global_validation, local_validation_data, + downward_messages, ).await?; let pov_block = PoVBlock { @@ -317,6 +320,7 @@ fn build_collator_service( Some(local_validation) => local_validation, None => return future::Either::Left(future::ok(())), }; + let downward_messages = try_fr!(api.downward_messages(&id, para_id)); let validators = try_fr!(api.validators(&id)); @@ -331,6 +335,7 @@ fn build_collator_service( para_id, global_validation, local_validation, + downward_messages, parachain_context, key, ).map(move |collation| { @@ -470,6 +475,7 @@ mod tests { _relay_parent: Hash, _global: GlobalValidationSchedule, _local_validation: LocalValidationData, + _: Vec, ) -> Self::ProduceCandidate { // send messages right back. future::ready(Some(( diff --git a/core-primitives/Cargo.toml b/core-primitives/Cargo.toml new file mode 100644 index 0000000000..b0f5971e2a --- /dev/null +++ b/core-primitives/Cargo.toml @@ -0,0 +1,20 @@ +[package] +name = "polkadot-core-primitives" +version = "0.7.30" +authors = ["Parity Technologies "] +edition = "2018" + +[dependencies] +sp-core = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +sp-std = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = [ "derive" ] } + +[features] +default = [ "std" ] +std = [ + "sp-core/std", + "sp-runtime/std", + "sp-std/std", + "codec/std", +] diff --git a/core-primitives/src/lib.rs b/core-primitives/src/lib.rs new file mode 100644 index 0000000000..d91ed3cfc1 --- /dev/null +++ b/core-primitives/src/lib.rs @@ -0,0 +1,96 @@ +// Copyright 2020 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 . + +#![cfg_attr(not(feature = "std"), no_std)] + +//! Core Polkadot types. +//! +//! These core Polkadot types are used by the relay chain and the Parachains. + +use sp_runtime::{generic, MultiSignature, traits::{Verify, BlakeTwo256, IdentifyAccount}}; + +/// The block number type used by Polkadot. +/// 32-bits will allow for 136 years of blocks assuming 1 block per second. +pub type BlockNumber = u32; + +/// An instant or duration in time. +pub type Moment = u64; + +/// Alias to type for a signature for a transaction on the relay chain. This allows one of several +/// kinds of underlying crypto to be used, so isn't a fixed size when encoded. +pub type Signature = MultiSignature; + +/// Alias to the public key used for this chain, actually a `MultiSigner`. Like the signature, this +/// also isn't a fixed size when encoded, as different cryptos have different size public keys. +pub type AccountPublic = ::Signer; + +/// Alias to the opaque account ID type for this chain, actually a `AccountId32`. This is always +/// 32 bytes. +pub type AccountId = ::AccountId; + +/// The type for looking up accounts. We don't expect more than 4 billion of them. +pub type AccountIndex = u32; + +/// Identifier 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 = sp_core::H256; + +/// Index of a transaction in the relay chain. 32-bit should be plenty. +pub type Nonce = u32; + +/// 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; + +/// Header type. +pub type Header = generic::Header; +/// Block type. +pub type Block = generic::Block; +/// Block ID. +pub type BlockId = generic::BlockId; + +/// Opaque, encoded, unchecked extrinsic. +pub use sp_runtime::OpaqueExtrinsic as UncheckedExtrinsic; + +/// The information that goes alongside a transfer_into_parachain operation. Entirely opaque, it +/// will generally be used for identifying the reason for the transfer. Typically it will hold the +/// destination account to which the transfer should be credited. If still more information is +/// needed, then this should be a hash with the pre-image presented via an off-chain mechanism on +/// the parachain. +pub type Remark = [u8; 32]; + +/// These are special "control" messages that can be passed from the Relaychain to a parachain. +/// They should be handled by all parachains. +#[derive(codec::Encode, codec::Decode, Clone, sp_runtime::RuntimeDebug, PartialEq)] +pub enum DownwardMessage { + /// Some funds were transferred into the parachain's account. The hash is the identifier that + /// was given with the transfer. + TransferInto(AccountId, Balance, Remark), + /// An opaque blob of data. The relay chain must somehow know how to form this so that the + /// destination parachain does something sensible. + /// + /// NOTE: Be very careful not to allow users to place arbitrary size information in here. + Opaque(sp_std::vec::Vec), + /// XCMP message for the Parachain. + XCMPMessage(sp_std::vec::Vec), +} diff --git a/network/src/protocol/tests.rs b/network/src/protocol/tests.rs index a1cad24be3..0e78479fb2 100644 --- a/network/src/protocol/tests.rs +++ b/network/src/protocol/tests.rs @@ -185,6 +185,9 @@ sp_api::mock_impl_runtime_apis! { parent_hash: Default::default(), } } + fn downward_messages(_: ParaId) -> Vec { + Vec::new() + } } } diff --git a/parachain/Cargo.toml b/parachain/Cargo.toml index e401e2baa5..fb1e1ce503 100644 --- a/parachain/Cargo.toml +++ b/parachain/Cargo.toml @@ -13,11 +13,11 @@ codec = { package = "parity-scale-codec", version = "1.1.0", default-features = sp-std = { package = "sp-std", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } sp-core = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } sp-wasm-interface = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +polkadot-core-primitives = { path = "../core-primitives", default-features = false } # all optional crates. derive_more = { version = "0.99.2", optional = true } serde = { version = "1.0.102", default-features = false, features = [ "derive" ], optional = true } -sp-runtime-interface = { git = "https://github.com/paritytech/substrate", branch = "master", optional = true, default-features = false } sp-externalities = { git = "https://github.com/paritytech/substrate", branch = "master", optional = true } sc-executor = { git = "https://github.com/paritytech/substrate", branch = "master", optional = true } sp-io = { git = "https://github.com/paritytech/substrate", branch = "master", optional = true } @@ -29,7 +29,7 @@ shared_memory = { version = "0.10.0", optional = true } [features] default = ["std"] -wasm-api = ["sp-runtime-interface"] +wasm-api = [] std = [ "codec/std", "derive_more", @@ -39,8 +39,8 @@ std = [ "sp-core/std", "parking_lot", "log", - "sp-runtime-interface/std", "sp-externalities", "sc-executor", "sp-io", + "polkadot-core-primitives/std", ] diff --git a/parachain/src/primitives.rs b/parachain/src/primitives.rs index 54c6907f42..f6b69cd894 100644 --- a/parachain/src/primitives.rs +++ b/parachain/src/primitives.rs @@ -28,9 +28,8 @@ use serde::{Serialize, Deserialize}; #[cfg(feature = "std")] use sp_core::bytes; -/// The block number of the relay chain. -/// 32-bits will allow for 136 years of blocks assuming 1 block per second. -pub type RelayChainBlockNumber = u32; +/// Block number type used by the relay chain. +pub use polkadot_core_primitives::BlockNumber as RelayChainBlockNumber; /// Parachain head data included in the chain. #[derive(PartialEq, Eq, Clone, PartialOrd, Ord, Encode, Decode, RuntimeDebug)] @@ -186,10 +185,6 @@ impl sp_std::convert::TryFrom for ParachainDispatchOrigin { /// A message from a parachain to its Relay Chain. #[derive(Clone, PartialEq, Eq, Encode, Decode)] -#[cfg_attr( - any(feature = "std", feature = "wasm-api"), - derive(sp_runtime_interface::pass_by::PassByCodec, -))] #[cfg_attr(feature = "std", derive(Debug))] pub struct UpwardMessage { /// The origin for the message to be sent from. @@ -212,13 +207,13 @@ pub struct ValidationParams { /// The maximum head-data size permitted, in bytes. pub max_head_data_size: u32, /// The current relay-chain block number. - pub relay_chain_height: RelayChainBlockNumber, + pub relay_chain_height: polkadot_core_primitives::BlockNumber, /// Whether a code upgrade is allowed or not, and at which height the upgrade /// would be applied after, if so. The parachain logic should apply any upgrade /// issued in this block after the first block /// with `relay_chain_height` at least this value, if `Some`. if `None`, issue /// no upgrade. - pub code_upgrade_allowed: Option, + pub code_upgrade_allowed: Option, } /// The result of parachain validation. @@ -230,4 +225,10 @@ pub struct ValidationResult { pub head_data: HeadData, /// An update to the validation code that should be scheduled in the relay chain. pub new_validation_code: Option, + /// Upward messages send by the Parachain. + pub upward_messages: Vec, + /// Number of downward messages that were processed by the Parachain. + /// + /// It is expected that the Parachain processes them from first to last. + pub processed_downward_messages: u32, } diff --git a/parachain/src/wasm_api.rs b/parachain/src/wasm_api.rs index f5a82f5781..9c7eac25f1 100644 --- a/parachain/src/wasm_api.rs +++ b/parachain/src/wasm_api.rs @@ -16,29 +16,6 @@ //! Utilities for writing parachain WASM. -#[cfg(any(feature = "std", all(not(feature = "std"), feature = "wasm-api")))] -use crate::primitives::UpwardMessage; -#[cfg(any(feature = "std", all(not(feature = "std"), feature = "wasm-api")))] -use sp_runtime_interface::runtime_interface; -#[cfg(feature = "std")] -use sp_externalities::ExternalitiesExt; - -/// The parachain api for posting messages. -// Either activate on `std` to get access to the `HostFunctions` or when `wasm-api` is given and on -// `no_std`. -#[cfg(any(feature = "std", all(not(feature = "std"), feature = "wasm-api")))] -#[runtime_interface] -pub trait Parachain { - /// Post a message to this parachain's relay chain. - #[allow(dead_code)] - fn post_upward_message(&mut self, msg: UpwardMessage) { - self.extension::() - .expect("No `ParachainExt` associated with the current context.") - .post_upward_message(msg) - .expect("Failed to post upward message") - } -} - /// Load the validation params from memory when implementing a Rust parachain. /// /// Offset and length must have been provided by the validation diff --git a/parachain/src/wasm_executor/mod.rs b/parachain/src/wasm_executor/mod.rs index 2410da844f..e617a4c474 100644 --- a/parachain/src/wasm_executor/mod.rs +++ b/parachain/src/wasm_executor/mod.rs @@ -21,12 +21,12 @@ //! a WASM VM for re-execution of a parachain candidate. use std::any::{TypeId, Any}; -use crate::primitives::{ValidationParams, ValidationResult, UpwardMessage}; +use crate::primitives::{ValidationParams, ValidationResult}; use codec::{Decode, Encode}; use sp_core::storage::ChildInfo; use sp_core::traits::CallInWasm; -use sp_wasm_interface::HostFunctions as _; use sp_externalities::Extensions; +use sp_wasm_interface::HostFunctions as _; #[cfg(not(any(target_os = "android", target_os = "unknown")))] pub use validation_host::{run_worker, ValidationPool, EXECUTION_TIMEOUT_SEC}; @@ -37,18 +37,6 @@ mod validation_host; const MAX_RUNTIME_MEM: usize = 1024 * 1024 * 1024; // 1 GiB const MAX_CODE_MEM: usize = 16 * 1024 * 1024; // 16 MiB -sp_externalities::decl_extension! { - /// The extension that is registered at the `Externalities` when validating a parachain state - /// transition. - pub(crate) struct ParachainExt(Box); -} - -impl ParachainExt { - pub fn new(ext: T) -> Self { - Self(Box::new(ext)) - } -} - /// A stub validation-pool defined when compiling for Android or WASM. #[cfg(any(target_os = "android", target_os = "unknown"))] #[derive(Clone)] @@ -124,32 +112,25 @@ impl std::error::Error for Error { } } -/// Externalities for parachain validation. -pub trait Externalities: Send { - /// Called when a message is to be posted to the parachain's relay chain. - fn post_upward_message(&mut self, message: UpwardMessage) -> Result<(), String>; -} - /// 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( +pub fn validate_candidate( validation_code: &[u8], params: ValidationParams, - ext: E, options: ExecutionMode<'_>, ) -> Result { match options { ExecutionMode::Local => { - validate_candidate_internal(validation_code, ¶ms.encode(), ext) + validate_candidate_internal(validation_code, ¶ms.encode()) }, #[cfg(not(any(target_os = "android", target_os = "unknown")))] ExecutionMode::Remote(pool) => { - pool.validate_candidate(validation_code, params, ext, false) + pool.validate_candidate(validation_code, params, false) }, #[cfg(not(any(target_os = "android", target_os = "unknown")))] ExecutionMode::RemoteTest(pool) => { - pool.validate_candidate(validation_code, params, ext, true) + pool.validate_candidate(validation_code, params, true) }, #[cfg(any(target_os = "android", target_os = "unknown"))] ExecutionMode::Remote(pool) => @@ -165,21 +146,16 @@ pub fn validate_candidate( } /// The host functions provided by the wasm executor to the parachain wasm blob. -type HostFunctions = ( - sp_io::SubstrateHostFunctions, - crate::wasm_api::parachain::HostFunctions, -); +type HostFunctions = sp_io::SubstrateHostFunctions; /// 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_internal( +pub fn validate_candidate_internal( validation_code: &[u8], encoded_call_data: &[u8], - externalities: E, ) -> Result { let mut extensions = Extensions::new(); - extensions.register(ParachainExt::new(externalities)); extensions.register(sp_core::traits::TaskExecutorExt(sp_core::tasks::executor())); let mut ext = ValidationExternalities(extensions); diff --git a/parachain/src/wasm_executor/validation_host.rs b/parachain/src/wasm_executor/validation_host.rs index 0f123349e3..d780d5b86b 100644 --- a/parachain/src/wasm_executor/validation_host.rs +++ b/parachain/src/wasm_executor/validation_host.rs @@ -16,18 +16,15 @@ #![cfg(not(any(target_os = "android", target_os = "unknown")))] -use std::{process, env, sync::Arc, sync::atomic, mem}; -use codec::{Decode, Encode, EncodeAppend}; -use crate::primitives::{ValidationParams, ValidationResult, UpwardMessage}; -use super::{validate_candidate_internal, Error, Externalities}; +use std::{process, env, sync::Arc, sync::atomic}; +use codec::{Decode, Encode}; +use crate::primitives::{ValidationParams, ValidationResult}; +use super::{validate_candidate_internal, Error}; use super::{MAX_CODE_MEM, MAX_RUNTIME_MEM}; use shared_memory::{SharedMem, SharedMemConf, EventState, WriteLockable, EventWait, EventSet}; use parking_lot::Mutex; use log::{debug, trace}; -// Message data limit -const MAX_MESSAGE_MEM: usize = 16 * 1024 * 1024; // 16 MiB - const WORKER_ARGS_TEST: &[&'static str] = &["--nocapture", "validation_worker"]; /// CLI Argument to start in validation worker mode. const WORKER_ARG: &'static str = "validation-worker"; @@ -40,27 +37,6 @@ pub const EXECUTION_TIMEOUT_SEC: u64 = 30; #[cfg(not(debug_assertions))] pub const EXECUTION_TIMEOUT_SEC: u64 = 5; -#[derive(Default)] -struct WorkerExternalitiesInner { - up_data: Vec, -} - -#[derive(Default, Clone)] -struct WorkerExternalities { - inner: Arc>, -} - -impl Externalities for WorkerExternalities { - fn post_upward_message(&mut self, message: UpwardMessage) -> Result<(), String> { - let mut inner = self.inner.lock(); - inner.up_data = as EncodeAppend>::append_or_new( - mem::replace(&mut inner.up_data, Vec::new()), - std::iter::once(message), - ).map_err(|e| e.what())?; - Ok(()) - } -} - enum Event { CandidateReady = 0, ResultReady = 1, @@ -87,21 +63,20 @@ impl ValidationPool { /// free validation host. /// /// This will fail if the validation code is not a proper parachain validation module. - pub fn validate_candidate( + pub fn validate_candidate( &self, validation_code: &[u8], params: ValidationParams, - externalities: E, test_mode: bool, ) -> Result { for host in self.hosts.iter() { if let Some(mut host) = host.try_lock() { - return host.validate_candidate(validation_code, params, externalities, test_mode); + return host.validate_candidate(validation_code, params, test_mode); } } // all workers are busy, just wait for the first one - self.hosts[0].lock().validate_candidate(validation_code, params, externalities, test_mode) + self.hosts[0].lock().validate_candidate(validation_code, params, test_mode) } } @@ -116,8 +91,6 @@ pub fn run_worker(mem_id: &str) -> Result<(), String> { } }; - let worker_ext = WorkerExternalities::default(); - let exit = Arc::new(atomic::AtomicBool::new(false)); // spawn parent monitor thread let watch_exit = exit.clone(); @@ -166,21 +139,11 @@ pub fn run_worker(mem_id: &str) -> Result<(), String> { let (call_data, _) = rest.split_at_mut(MAX_RUNTIME_MEM); let (call_data, _) = call_data.split_at_mut(header.params_size as usize); - let result = validate_candidate_internal(code, call_data, worker_ext.clone()); + let result = validate_candidate_internal(code, call_data); debug!("{} Candidate validated: {:?}", process::id(), result); match result { - Ok(r) => { - let inner = worker_ext.inner.lock(); - let up_data = &inner.up_data; - let up_len = up_data.len(); - - if up_len > MAX_MESSAGE_MEM { - ValidationResultHeader::Error("Message data is too large".into()) - } else { - ValidationResultHeader::Ok(r) - } - }, + Ok(r) => ValidationResultHeader::Ok(r), Err(e) => ValidationResultHeader::Error(e.to_string()), } }; @@ -226,7 +189,7 @@ impl Drop for ValidationHost { impl ValidationHost { fn create_memory() -> Result { - let mem_size = MAX_RUNTIME_MEM + MAX_CODE_MEM + MAX_MESSAGE_MEM + 1024; + let mem_size = MAX_RUNTIME_MEM + MAX_CODE_MEM + 1024; let mem_config = SharedMemConf::default() .set_size(mem_size) .add_lock(shared_memory::LockType::Mutex, 0, mem_size)? @@ -268,11 +231,10 @@ impl ValidationHost { /// 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( + pub fn validate_candidate( &mut self, validation_code: &[u8], params: ValidationParams, - mut externalities: E, test_mode: bool, ) -> Result { if validation_code.len() > MAX_CODE_MEM { @@ -322,24 +284,11 @@ impl ValidationHost { { debug!("{} Reading results", self.id); let data: &[u8] = &**memory.wlock_as_slice(0)?; - let (header_buf, rest) = data.split_at(1024); - let (_, rest) = rest.split_at(MAX_CODE_MEM); - let (_, message_data) = rest.split_at(MAX_RUNTIME_MEM); + let (header_buf, _) = data.split_at(1024); let mut header_buf: &[u8] = header_buf; - let mut message_data: &[u8] = message_data; let header = ValidationResultHeader::decode(&mut header_buf).unwrap(); match header { - ValidationResultHeader::Ok(result) => { - let upwards = Vec::::decode(&mut message_data) - .map_err(|e| - Error::External( - format!("Could not decode upward messages: {}", e.what()) - ) - )?; - upwards.into_iter().try_for_each(|msg| externalities.post_upward_message(msg))?; - - Ok(result) - } + ValidationResultHeader::Ok(result) => Ok(result), ValidationResultHeader::Error(message) => { debug!("{} Validation error: {}", self.id, message); Err(Error::External(message).into()) diff --git a/parachain/test-parachains/adder/Cargo.toml b/parachain/test-parachains/adder/Cargo.toml index 7f04dc5946..2cfb77566d 100644 --- a/parachain/test-parachains/adder/Cargo.toml +++ b/parachain/test-parachains/adder/Cargo.toml @@ -9,6 +9,7 @@ build = "build.rs" [dependencies] parachain = { package = "polkadot-parachain", path = "../../", default-features = false, features = [ "wasm-api" ] } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } +sp-std = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } tiny-keccak = "1.5.0" dlmalloc = { version = "0.1.3", features = [ "global" ] } @@ -20,4 +21,7 @@ wasm-builder-runner = { package = "substrate-wasm-builder-runner", version = "1. [features] default = [ "std" ] -std = ["parachain/std"] +std = [ + "parachain/std", + "sp-std/std", +] diff --git a/parachain/test-parachains/adder/collator/src/main.rs b/parachain/test-parachains/adder/collator/src/main.rs index a32b6e4ca4..326549fda7 100644 --- a/parachain/test-parachains/adder/collator/src/main.rs +++ b/parachain/test-parachains/adder/collator/src/main.rs @@ -23,7 +23,7 @@ use adder::{HeadData as AdderHead, BlockData as AdderBody}; use sp_core::Pair; use codec::{Encode, Decode}; use primitives::{ - Hash, + Hash, DownwardMessage, parachain::{HeadData, BlockData, Id as ParaId, LocalValidationData, GlobalValidationSchedule}, }; use collator::{ParachainContext, Network, BuildParachainContext, Cli, SubstrateCli}; @@ -60,6 +60,7 @@ impl ParachainContext for AdderContext { _relay_parent: Hash, _global_validation: GlobalValidationSchedule, local_validation: LocalValidationData, + _: Vec, ) -> Self::ProduceCandidate { let adder_head = match AdderHead::decode(&mut &local_validation.parent_head.0[..]).ok() { diff --git a/parachain/test-parachains/adder/src/wasm_validation.rs b/parachain/test-parachains/adder/src/wasm_validation.rs index eaa5101ba9..c0f3b56dc8 100644 --- a/parachain/test-parachains/adder/src/wasm_validation.rs +++ b/parachain/test-parachains/adder/src/wasm_validation.rs @@ -21,22 +21,6 @@ use core::{intrinsics, panic}; use parachain::primitives::{ValidationResult, HeadData as GenericHeadData}; use codec::{Encode, Decode}; -#[panic_handler] -#[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_block(params: *const u8, len: usize) -> u64 { let params = unsafe { parachain::load_params(params, len) }; @@ -53,6 +37,8 @@ pub extern fn validate_block(params: *const u8, len: usize) -> u64 { &ValidationResult { head_data: GenericHeadData(new_head.encode()), new_validation_code: None, + upward_messages: sp_std::vec::Vec::new(), + processed_downward_messages: 0, } ), Err(_) => panic!("execution failure"), diff --git a/parachain/test-parachains/code-upgrader/Cargo.toml b/parachain/test-parachains/code-upgrader/Cargo.toml index 4dfcde274a..6f673adbf8 100644 --- a/parachain/test-parachains/code-upgrader/Cargo.toml +++ b/parachain/test-parachains/code-upgrader/Cargo.toml @@ -9,6 +9,7 @@ build = "build.rs" [dependencies] parachain = { package = "polkadot-parachain", path = "../../", default-features = false, features = [ "wasm-api" ] } codec = { package = "parity-scale-codec", version = "1.1.0", default-features = false, features = ["derive"] } +sp-std = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } tiny-keccak = "1.5.0" dlmalloc = { version = "0.1.3", features = [ "global" ] } @@ -20,4 +21,7 @@ wasm-builder-runner = { package = "substrate-wasm-builder-runner", version = "1. [features] default = [ "std" ] -std = ["parachain/std"] +std = [ + "parachain/std", + "sp-std/std", +] diff --git a/parachain/test-parachains/code-upgrader/src/wasm_validation.rs b/parachain/test-parachains/code-upgrader/src/wasm_validation.rs index 8ebc3ae3c6..3f4d0c44f8 100644 --- a/parachain/test-parachains/code-upgrader/src/wasm_validation.rs +++ b/parachain/test-parachains/code-upgrader/src/wasm_validation.rs @@ -21,22 +21,6 @@ use core::{intrinsics, panic}; use parachain::primitives::{ValidationResult, HeadData as GenericHeadData}; use codec::{Encode, Decode}; -#[panic_handler] -#[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_block(params: *const u8, len: usize) -> u64 { let params = unsafe { parachain::load_params(params, len) }; @@ -64,6 +48,8 @@ pub extern fn validate_block(params: *const u8, len: usize) -> u64 { &ValidationResult { head_data: GenericHeadData(output.head_data.encode()), new_validation_code: output.new_validation_code, + upward_messages: sp_std::vec::Vec::new(), + processed_downward_messages: 0, } ), Err(_) => panic!("execution failure"), diff --git a/parachain/test-parachains/tests/adder/mod.rs b/parachain/test-parachains/tests/adder/mod.rs index d97db998fd..b0b53dc4dc 100644 --- a/parachain/test-parachains/tests/adder/mod.rs +++ b/parachain/test-parachains/tests/adder/mod.rs @@ -16,15 +16,11 @@ //! Basic parachain that adds a number as part of its state. -use crate::{ - DummyExt, - parachain, - parachain::primitives::{ - RelayChainBlockNumber, - BlockData as GenericBlockData, - HeadData as GenericHeadData, - ValidationParams, - }, +use parachain::primitives::{ + RelayChainBlockNumber, + BlockData as GenericBlockData, + HeadData as GenericHeadData, + ValidationParams, }; use codec::{Decode, Encode}; @@ -83,7 +79,6 @@ pub fn execute_good_on_parent() { relay_chain_height: 1, code_upgrade_allowed: None, }, - DummyExt, parachain::wasm_executor::ExecutionMode::RemoteTest(&pool), ).unwrap(); @@ -123,7 +118,6 @@ fn execute_good_chain_on_parent() { relay_chain_height: number as RelayChainBlockNumber + 1, code_upgrade_allowed: None, }, - DummyExt, parachain::wasm_executor::ExecutionMode::RemoteTest(&pool), ).unwrap(); @@ -164,7 +158,6 @@ fn execute_bad_on_parent() { relay_chain_height: 1, code_upgrade_allowed: None, }, - DummyExt, parachain::wasm_executor::ExecutionMode::RemoteTest(&pool), ).unwrap_err(); } diff --git a/parachain/test-parachains/tests/code_upgrader/mod.rs b/parachain/test-parachains/tests/code_upgrader/mod.rs index c59e44fc12..89f6065cf1 100644 --- a/parachain/test-parachains/tests/code_upgrader/mod.rs +++ b/parachain/test-parachains/tests/code_upgrader/mod.rs @@ -16,15 +16,10 @@ //! Basic parachain that adds a number as part of its state. -use parachain; - -use crate::{ - DummyExt, - parachain::primitives::{ - BlockData as GenericBlockData, - HeadData as GenericHeadData, - ValidationParams, ValidationCode, - }, +use parachain::primitives::{ + BlockData as GenericBlockData, + HeadData as GenericHeadData, + ValidationParams, ValidationCode, }; use codec::{Decode, Encode}; use code_upgrader::{hash_state, HeadData, BlockData, State}; @@ -56,7 +51,6 @@ pub fn execute_good_no_upgrade() { relay_chain_height: 1, code_upgrade_allowed: None, }, - DummyExt, parachain::wasm_executor::ExecutionMode::RemoteTest(&pool), ).unwrap(); @@ -93,7 +87,6 @@ pub fn execute_good_with_upgrade() { relay_chain_height: 1, code_upgrade_allowed: Some(20), }, - DummyExt, parachain::wasm_executor::ExecutionMode::RemoteTest(&pool), ).unwrap(); @@ -137,7 +130,6 @@ pub fn code_upgrade_not_allowed() { relay_chain_height: 1, code_upgrade_allowed: None, }, - DummyExt, parachain::wasm_executor::ExecutionMode::RemoteTest(&pool), ).unwrap(); } @@ -168,7 +160,6 @@ pub fn applies_code_upgrade_after_delay() { relay_chain_height: 1, code_upgrade_allowed: Some(2), }, - DummyExt, parachain::wasm_executor::ExecutionMode::RemoteTest(&pool), ).unwrap(); @@ -204,7 +195,6 @@ pub fn applies_code_upgrade_after_delay() { relay_chain_height: 2, code_upgrade_allowed: None, }, - DummyExt, parachain::wasm_executor::ExecutionMode::RemoteTest(&pool), ).unwrap(); diff --git a/parachain/test-parachains/tests/lib.rs b/parachain/test-parachains/tests/lib.rs index cf6d63fd2a..692c04c10c 100644 --- a/parachain/test-parachains/tests/lib.rs +++ b/parachain/test-parachains/tests/lib.rs @@ -18,16 +18,7 @@ mod adder; mod code_upgrader; mod wasm_executor; -use parachain::{ - self, primitives::UpwardMessage, wasm_executor::{Externalities, run_worker}, -}; - -struct DummyExt; -impl Externalities for DummyExt { - fn post_upward_message(&mut self, _: UpwardMessage) -> Result<(), String> { - Ok(()) - } -} +use parachain::wasm_executor::run_worker; // This is not an actual test, but rather an entry point for out-of process WASM executor. // When executing tests the executor spawns currently executing binary, which happens to be test binary. diff --git a/parachain/test-parachains/tests/wasm_executor/mod.rs b/parachain/test-parachains/tests/wasm_executor/mod.rs index c6cf2407b3..6ba8ddefec 100644 --- a/parachain/test-parachains/tests/wasm_executor/mod.rs +++ b/parachain/test-parachains/tests/wasm_executor/mod.rs @@ -16,9 +16,8 @@ //! Basic parachain that adds a number as part of its state. -use parachain; -use crate::{adder, DummyExt}; -use crate::parachain::{ +use crate::adder; +use parachain::{ primitives::{BlockData, ValidationParams}, wasm_executor::EXECUTION_TIMEOUT_SEC, }; @@ -40,7 +39,6 @@ fn terminates_on_timeout() { relay_chain_height: 1, code_upgrade_allowed: None, }, - DummyExt, parachain::wasm_executor::ExecutionMode::RemoteTest(&pool), ); match result { @@ -70,7 +68,6 @@ fn parallel_execution() { relay_chain_height: 1, code_upgrade_allowed: None, }, - DummyExt, parachain::wasm_executor::ExecutionMode::RemoteTest(&pool2), ).ok()); let _ = parachain::wasm_executor::validate_candidate( @@ -83,7 +80,6 @@ fn parallel_execution() { relay_chain_height: 1, code_upgrade_allowed: None, }, - DummyExt, parachain::wasm_executor::ExecutionMode::RemoteTest(&pool), ); thread.join().unwrap(); diff --git a/primitives/Cargo.toml b/primitives/Cargo.toml index d327429b64..f3bc264c8c 100644 --- a/primitives/Cargo.toml +++ b/primitives/Cargo.toml @@ -8,7 +8,6 @@ edition = "2018" serde = { version = "1.0.102", optional = true, features = ["derive"] } parity-scale-codec = { version = "1.3.0", default-features = false, features = ["bit-vec", "derive"] } primitives = { package = "sp-core", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -system = { package = "frame-system", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } inherents = { package = "sp-inherents", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } application-crypto = { package = "sp-application-crypto", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } sp-api = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } @@ -17,8 +16,10 @@ sp-std = { package = "sp-std", git = "https://github.com/paritytech/substrate", sp-staking = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } runtime_primitives = { package = "sp-runtime", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } polkadot-parachain = { path = "../parachain", default-features = false } +polkadot-core-primitives = { path = "../core-primitives", default-features = false } trie = { package = "sp-trie", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } bitvec = { version = "0.17.4", default-features = false, features = ["alloc"] } +frame-system = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } [dev-dependencies] sp-serializer = { git = "https://github.com/paritytech/substrate", branch = "master" } @@ -27,9 +28,9 @@ pretty_assertions = "0.5.1" [features] default = ["std"] std = [ + "application-crypto/std", "parity-scale-codec/std", "primitives/std", - "system/std", "inherents/std", "trie/std", "sp-api/std", @@ -39,5 +40,7 @@ std = [ "runtime_primitives/std", "serde", "polkadot-parachain/std", + "polkadot-core-primitives/std", "bitvec/std", + "frame-system/std", ] diff --git a/primitives/src/lib.rs b/primitives/src/lib.rs index 24ed6e1eb3..6f0a0986c9 100644 --- a/primitives/src/lib.rs +++ b/primitives/src/lib.rs @@ -20,63 +20,14 @@ #![cfg_attr(not(feature = "std"), no_std)] -use runtime_primitives::{generic, MultiSignature}; pub use runtime_primitives::traits::{BlakeTwo256, Hash as HashT, Verify, IdentifyAccount}; +pub use polkadot_core_primitives::*; pub mod inclusion_inherent; pub mod parachain; pub use parity_scale_codec::Compact; -/// An index to a block. -pub type BlockNumber = polkadot_parachain::primitives::RelayChainBlockNumber; - -/// An instant or duration in time. -pub type Moment = u64; - -/// Alias to type for a signature for a transaction on the relay chain. This allows one of several -/// kinds of underlying crypto to be used, so isn't a fixed size when encoded. -pub type Signature = MultiSignature; - -/// Alias to the public key used for this chain, actually a `MultiSigner`. Like the signature, this -/// also isn't a fixed size when encoded, as different cryptos have different size public keys. -pub type AccountPublic = ::Signer; - -/// Alias to the opaque account ID type for this chain, actually a `AccountId32`. This is always -/// 32 bytes. -pub type AccountId = ::AccountId; - -/// The type for looking up accounts. We don't expect more than 4 billion of them. -pub type AccountIndex = u32; - -/// Identifier 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 Nonce = u32; - -/// 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; - -/// Header type. -pub type Header = generic::Header; -/// Block type. -pub type Block = generic::Block; -/// Block ID. -pub type BlockId = generic::BlockId; - -/// Opaque, encoded, unchecked extrinsic. -pub use runtime_primitives::OpaqueExtrinsic as UncheckedExtrinsic; - /// Custom validity errors used in Polkadot while validating transactions. #[repr(u8)] pub enum ValidityError { @@ -118,7 +69,7 @@ pub mod fisherman { /// An `AppCrypto` type to allow submitting signed transactions using the fisherman /// application key as signer. pub struct FishermanAppCrypto; - impl system::offchain::AppCrypto<::Signer, Signature> for FishermanAppCrypto { + impl frame_system::offchain::AppCrypto<::Signer, Signature> for FishermanAppCrypto { type RuntimeAppPublic = FishermanId; type GenericSignature = primitives::sr25519::Signature; type GenericPublic = primitives::sr25519::Public; diff --git a/primitives/src/parachain.rs b/primitives/src/parachain.rs index 52306174be..33a0f0363d 100644 --- a/primitives/src/parachain.rs +++ b/primitives/src/parachain.rs @@ -32,6 +32,7 @@ use primitives::RuntimeDebug; use runtime_primitives::traits::{AppVerify, Block as BlockT}; use inherents::InherentIdentifier; use application_crypto::KeyTypeId; +use polkadot_core_primitives::DownwardMessage; pub use polkadot_parachain::primitives::{ Id, ParachainDispatchOrigin, LOWEST_USER_ID, UpwardMessage, HeadData, BlockData, @@ -220,6 +221,10 @@ pub struct CandidateCommitments { pub erasure_root: H, /// New validation code. pub new_validation_code: Option, + /// Number of `DownwardMessage`'s that were processed by the Parachain. + /// + /// It is expected that the Parachain processes them from first to last. + pub processed_downward_messages: u32, } /// Get a collator signature payload on a relay-parent, block-data combo. @@ -814,6 +819,8 @@ sp_api::decl_runtime_apis! { -> Option>; /// Get a `SigningContext` with current `SessionIndex` and parent hash. fn signing_context() -> SigningContext; + /// Get the `DownwardMessage`'s for the given parachain. + fn downward_messages(id: Id) -> Vec; } } diff --git a/runtime/common/src/parachains.rs b/runtime/common/src/parachains.rs index ef67adb031..0753f74e63 100644 --- a/runtime/common/src/parachains.rs +++ b/runtime/common/src/parachains.rs @@ -34,7 +34,7 @@ use sp_staking::{ }; use frame_support::{ traits::KeyOwnerProofSystem, - dispatch::{IsSubType}, + dispatch::IsSubType, weights::{DispatchClass, Weight}, }; use primitives::{ @@ -47,14 +47,13 @@ use primitives::{ LocalValidationData, Scheduling, ValidityAttestation, NEW_HEADS_IDENTIFIER, PARACHAIN_KEY_TYPE_ID, ValidatorSignature, SigningContext, HeadData, ValidationCode, }, + Remark, DownwardMessage }; use frame_support::{ Parameter, dispatch::DispatchResult, decl_storage, decl_module, decl_error, ensure, traits::{Currency, Get, WithdrawReason, ExistenceRequirement, Randomness}, }; -use sp_runtime::{ - transaction_validity::InvalidTransaction, -}; +use sp_runtime::transaction_validity::InvalidTransaction; use inherents::{ProvideInherent, InherentData, MakeFatalError, InherentIdentifier}; @@ -91,6 +90,18 @@ impl Iterator for BlockNum pub trait ParachainCurrency { fn free_balance(para_id: ParaId) -> Balance; fn deduct(para_id: ParaId, amount: Balance) -> DispatchResult; + fn transfer_in( + source: &AccountId, + dest: ParaId, + amount: Balance, + existence_requirement: ExistenceRequirement, + ) -> DispatchResult; + fn transfer_out( + source: ParaId, + dest: &AccountId, + amount: Balance, + existence_requirement: ExistenceRequirement, + ) -> DispatchResult; } impl> ParachainCurrency for T where @@ -102,6 +113,8 @@ impl> ParachainCurrency for T where T::free_balance(¶_account).into() } + // TODO: this should really be the same API as `withdraw`, having NegativeImbalance as an + // associated type. fn deduct(para_id: ParaId, amount: Balance) -> DispatchResult { let para_account = para_id.into_account(); @@ -115,6 +128,24 @@ impl> ParachainCurrency for T where Ok(()) } + + fn transfer_in( + source: &AccountId, + dest: ParaId, + amount: Balance, + existence_requirement: ExistenceRequirement, + ) -> DispatchResult { + T::transfer(source, &dest.into_account(), amount.into(), existence_requirement) + } + + fn transfer_out( + source: ParaId, + dest: &AccountId, + amount: Balance, + existence_requirement: ExistenceRequirement, + ) -> DispatchResult { + T::transfer(&source.into_account(), dest, amount.into(), existence_requirement) + } } /// Interface to the persistent (stash) identities of the current validators. @@ -226,12 +257,14 @@ pub trait Trait: CreateSignedTransaction> + attestations::Trait + ses type AuthorityId: system::offchain::AppCrypto; /// The outer origin type. - type Origin: From + From>; + type Origin: From + + From<::Origin> + + Into::Origin>>; /// The outer call dispatch type. type Call: Parameter + Dispatchable::Origin> + From>; - /// Some way of interacting with balances for fees. + /// Some way of interacting with balances for fees and transfers. type ParachainCurrency: ParachainCurrency; /// Polkadot in practice will always use the `BlockNumber` type. @@ -345,6 +378,8 @@ impl Offence for DoubleVoteOffence { } } +/// Total number of individual messages allowed in the relay-chain -> parachain message queue. +const MAX_DOWNWARD_QUEUE_COUNT: usize = 10; /// Total number of individual messages allowed in the parachain -> relay-chain message queue. const MAX_QUEUE_COUNT: usize = 100; /// Total size of messages allowed in the parachain -> relay-chain message queue before which no @@ -445,8 +480,7 @@ impl ParaPastCodeMeta { } decl_storage! { - trait Store for Module as Parachains - { + trait Store for Module as Parachains { /// All authorities' keys at the moment. pub Authorities get(fn authorities): Vec; /// The active code of a currently-registered parachain. @@ -484,6 +518,9 @@ decl_storage! { /// /// `None` if not yet updated. pub DidUpdate: Option>; + + /// Messages waiting to be delivered from the Relay chain into the parachain. + pub DownwardMessageQueue: map hasher(twox_64_concat) ParaId => Vec>; } add_extra_genesis { config(authorities): Vec; @@ -531,6 +568,8 @@ decl_error! { CannotPayFees, /// Unexpected relay-parent for a candidate receipt. UnexpectedRelayParent, + /// Downward message queue is full for the Parachain. + DownwardMessageQueueFull, } } @@ -596,6 +635,11 @@ decl_module! { WATERMARK_QUEUE_SIZE, )?; + Self::remove_processed_downward_messages( + id, + head.candidate.commitments.processed_downward_messages as usize, + ); + let id = head.parachain_index(); proceeded.push(id); last_id = Some(id); @@ -668,6 +712,36 @@ decl_module! { Ok(()) } + + /// Transfer some tokens into a parachain and leave a message in the downward queue for it. + #[weight = 100_000] + pub fn transfer_to_parachain( + origin, + to: ParaId, + amount: Balance, + remark: Remark, + ) { + let who = ensure_signed(origin)?; + let downward_queue_count = DownwardMessageQueue::::decode_len(to).unwrap_or(0); + ensure!(downward_queue_count < MAX_DOWNWARD_QUEUE_COUNT, Error::::DownwardMessageQueueFull); + T::ParachainCurrency::transfer_in(&who, to, amount, ExistenceRequirement::AllowDeath)?; + DownwardMessageQueue::::append(to, DownwardMessage::TransferInto(who, amount, remark)); + } + + /// Send a XCMP message to the given parachain. + /// + /// The origin must be another parachain. + #[weight = 100_000] + pub fn send_xcmp_message( + origin, + to: ParaId, + msg: Vec, + ) { + ensure_parachain(::Origin::from(origin))?; + let downward_queue_count = DownwardMessageQueue::::decode_len(to).unwrap_or(0); + ensure!(downward_queue_count < MAX_DOWNWARD_QUEUE_COUNT, Error::::DownwardMessageQueueFull); + DownwardMessageQueue::::append(to, DownwardMessage::XCMPMessage(msg)); + } } } @@ -814,11 +888,11 @@ impl Module { if let Ok(message_call) = ::Call::decode(&mut &data[..]) { let origin: ::Origin = match origin { ParachainDispatchOrigin::Signed => - system::RawOrigin::Signed(id.into_account()).into(), + ::Origin::from(::Origin::from(system::RawOrigin::Signed(id.into_account()))), ParachainDispatchOrigin::Parachain => Origin::Parachain(id).into(), ParachainDispatchOrigin::Root => - system::RawOrigin::Root.into(), + ::Origin::from(::Origin::from(system::RawOrigin::Root)), }; let _ok = message_call.dispatch(origin).is_ok(); // Not much to do with the result as it is. It's up to the parachain to ensure that the @@ -862,6 +936,17 @@ impl Module { Ok(()) } + /// Remove processed downward messages from the `DownwardMessageQueue`. + fn remove_processed_downward_messages(id: ParaId, processed: usize) { + DownwardMessageQueue::::mutate(id, |v| { + if processed > v.len() { + v.clear(); + } else { + *v = v.split_off(processed); + } + }); + } + /// Update routing information from the parachain heads. This queues upwards /// messages to the relay chain as well. fn update_routing( @@ -1079,6 +1164,11 @@ impl Module { }) } + /// Returns the `DownwardMessage`'s for the given parachain. + pub fn downward_messages(id: ParaId) -> Vec> { + DownwardMessageQueue::::get(id) + } + /// Get the local validation data for a particular parent w.r.t. the current /// block height. pub fn current_local_validation_data(id: &ParaId) -> Option { @@ -1113,8 +1203,7 @@ impl Module { schedule: &GlobalValidationSchedule, attested_candidates: &[AttestedCandidate], active_parachains: &[(ParaId, Option<(CollatorId, Retriable)>)] - ) -> sp_std::result::Result, sp_runtime::DispatchError> - { + ) -> sp_std::result::Result, sp_runtime::DispatchError> { // returns groups of slices that have the same chain ID. // assumes the inner slice is sorted by id. struct GroupedDutyIter<'a> { @@ -3511,4 +3600,40 @@ mod tests { } }); } + + #[test] + fn downward_message_removal_works() { + let id = ParaId::from(0); + + // That the list of egress queue roots is in ascending order by `ParaId`. + let parachains = vec![ + (id, vec![].into(), vec![].into()), + ]; + + new_test_ext(parachains).execute_with(|| { + run_to_block(2); + + DownwardMessageQueue::::insert( + &id, + vec![ + DownwardMessage::Opaque(vec![1]), + DownwardMessage::Opaque(vec![2]), + DownwardMessage::Opaque(vec![3]) + ] + ); + + let mut raw_candidate = raw_candidate(id); + raw_candidate.commitments.processed_downward_messages = 2; + + let candidate = make_blank_attested(raw_candidate); + let mut candidates = vec![candidate]; + candidates.iter_mut().for_each(make_attestations); + + assert_ok!(Parachains::set_heads(Origin::none(), candidates)); + assert_eq!( + vec![DownwardMessage::Opaque(vec![3])], + DownwardMessageQueue::::get(&id), + ); + }); + } } diff --git a/runtime/common/src/registrar.rs b/runtime/common/src/registrar.rs index b5fbddb49e..248371d256 100644 --- a/runtime/common/src/registrar.rs +++ b/runtime/common/src/registrar.rs @@ -1074,6 +1074,7 @@ mod tests { upward_messages: vec![], erasure_root: [1; 32].into(), new_validation_code: None, + processed_downward_messages: 0, }, }; let (candidate, _) = candidate.abridge(); diff --git a/runtime/kusama/Cargo.toml b/runtime/kusama/Cargo.toml index b5494ab625..dbe3934dd3 100644 --- a/runtime/kusama/Cargo.toml +++ b/runtime/kusama/Cargo.toml @@ -66,9 +66,9 @@ utility = { package = "pallet-utility", git = "https://github.com/paritytech/sub vesting = { package = "pallet-vesting", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } frame-benchmarking = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false, optional = true } -frame-system-benchmarking = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false, optional = true } pallet-offences-benchmarking = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false, optional = true } pallet-session-benchmarking = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false, optional = true } +frame-system-benchmarking = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false, optional = true } hex-literal = { version = "0.2.1", optional = true } runtime-common = { package = "polkadot-runtime-common", path = "../common", default-features = false } @@ -170,3 +170,9 @@ runtime-benchmarks = [ "pallet-session-benchmarking", "hex-literal", ] +# When enabled, the runtime api will not be build. +# +# This is required by Cumulus to access certain types of the +# runtime without clashing with the runtime api exported functions +# in WASM. +disable-runtime-api = [] diff --git a/runtime/kusama/src/lib.rs b/runtime/kusama/src/lib.rs index 81755c5f4e..8e91f8f829 100644 --- a/runtime/kusama/src/lib.rs +++ b/runtime/kusama/src/lib.rs @@ -88,7 +88,10 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { authoring_version: 2, spec_version: 2013, impl_version: 0, + #[cfg(not(feature = "disable-runtime-api"))] apis: RUNTIME_API_VERSIONS, + #[cfg(feature = "disable-runtime-api")] + apis: version::create_apis_vec![[]], transaction_version: 2, }; @@ -1005,6 +1008,7 @@ pub type Executive = executive::Executive< /// The payload being signed in the transactions. pub type SignedPayload = generic::SignedPayload; +#[cfg(not(feature = "disable-runtime-api"))] sp_api::impl_runtime_apis! { impl sp_api::Core for Runtime { fn version() -> RuntimeVersion { @@ -1103,6 +1107,9 @@ sp_api::impl_runtime_apis! { fn signing_context() -> SigningContext { Parachains::signing_context() } + fn downward_messages(id: parachain::Id) -> Vec { + Parachains::downward_messages(id) + } } impl fg_primitives::GrandpaApi for Runtime { diff --git a/runtime/polkadot/Cargo.toml b/runtime/polkadot/Cargo.toml index 471efb0bac..96ec48d318 100644 --- a/runtime/polkadot/Cargo.toml +++ b/runtime/polkadot/Cargo.toml @@ -60,8 +60,8 @@ system_rpc_runtime_api = { package = "frame-system-rpc-runtime-api", git = "http timestamp = { package = "pallet-timestamp", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } treasury = { package = "pallet-treasury", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } sudo = { package = "pallet-sudo", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -utility = { package = "pallet-utility", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } vesting = { package = "pallet-vesting", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +utility = { package = "pallet-utility", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } frame-benchmarking = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false, optional = true } frame-system-benchmarking = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false, optional = true } @@ -164,3 +164,9 @@ runtime-benchmarks = [ "pallet-session-benchmarking", "hex-literal", ] +# When enabled, the runtime api will not be build. +# +# This is required by Cumulus to access certain types of the +# runtime without clashing with the runtime api exported functions +# in WASM. +disable-runtime-api = [] diff --git a/runtime/polkadot/src/lib.rs b/runtime/polkadot/src/lib.rs index 90b9ad6395..dd9a365545 100644 --- a/runtime/polkadot/src/lib.rs +++ b/runtime/polkadot/src/lib.rs @@ -93,7 +93,10 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { authoring_version: 0, spec_version: 13, impl_version: 0, + #[cfg(not(feature = "disable-runtime-api"))] apis: RUNTIME_API_VERSIONS, + #[cfg(feature = "disable-runtime-api")] + apis: version::create_apis_vec![[]], transaction_version: 2, }; @@ -991,6 +994,7 @@ pub type Executive = executive::Executive; +#[cfg(not(feature = "disable-runtime-api"))] sp_api::impl_runtime_apis! { impl sp_api::Core for Runtime { fn version() -> RuntimeVersion { @@ -1089,6 +1093,9 @@ sp_api::impl_runtime_apis! { fn signing_context() -> SigningContext { Parachains::signing_context() } + fn downward_messages(id: parachain::Id) -> Vec { + Parachains::downward_messages(id) + } } impl fg_primitives::GrandpaApi for Runtime { diff --git a/runtime/test-runtime/src/lib.rs b/runtime/test-runtime/src/lib.rs index 8b79ff22d6..84bf487382 100644 --- a/runtime/test-runtime/src/lib.rs +++ b/runtime/test-runtime/src/lib.rs @@ -656,6 +656,9 @@ sp_api::impl_runtime_apis! { fn signing_context() -> SigningContext { Parachains::signing_context() } + fn downward_messages(id: parachain::Id) -> Vec { + Parachains::downward_messages(id) + } } impl fg_primitives::GrandpaApi for Runtime { diff --git a/runtime/westend/Cargo.toml b/runtime/westend/Cargo.toml index deab7e0109..9e6af55afc 100644 --- a/runtime/westend/Cargo.toml +++ b/runtime/westend/Cargo.toml @@ -174,3 +174,9 @@ runtime-benchmarks = [ "pallet-session-benchmarking", "hex-literal", ] +# When enabled, the runtime api will not be build. +# +# This is required by Cumulus to access certain types of the +# runtime without clashing with the runtime api exported functions +# in WASM. +disable-runtime-api = [] diff --git a/runtime/westend/src/lib.rs b/runtime/westend/src/lib.rs index 6e8bd9ad3c..7aaa05eaaf 100644 --- a/runtime/westend/src/lib.rs +++ b/runtime/westend/src/lib.rs @@ -83,7 +83,10 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { authoring_version: 2, spec_version: 33, impl_version: 0, + #[cfg(not(feature = "disable-runtime-api"))] apis: RUNTIME_API_VERSIONS, + #[cfg(feature = "disable-runtime-api")] + apis: version::create_apis_vec![[]], transaction_version: 2, }; @@ -753,6 +756,7 @@ pub type Executive = executive::Executive; +#[cfg(not(feature = "disable-runtime-api"))] sp_api::impl_runtime_apis! { impl sp_api::Core for Runtime { fn version() -> RuntimeVersion { @@ -851,6 +855,9 @@ sp_api::impl_runtime_apis! { fn signing_context() -> SigningContext { Parachains::signing_context() } + fn downward_messages(id: parachain::Id) -> Vec { + Parachains::downward_messages(id) + } } impl fg_primitives::GrandpaApi for Runtime { diff --git a/validation/src/error.rs b/validation/src/error.rs index 834270151f..83b51ed236 100644 --- a/validation/src/error.rs +++ b/validation/src/error.rs @@ -81,7 +81,10 @@ pub enum Error { /// Block data is too big #[display(fmt = "Block data is too big (maximum allowed size: {}, actual size: {})", size, max_size)] BlockDataTooBig { size: u64, max_size: u64 }, - Join(tokio::task::JoinError) + Join(tokio::task::JoinError), + /// Could not cover fee for an operation e.g. for sending `UpwardMessage`. + #[display(fmt = "Parachain could not cover fee for an operation e.g. for sending an `UpwardMessage`.")] + CouldNotCoverFee, } impl std::error::Error for Error { diff --git a/validation/src/pipeline.rs b/validation/src/pipeline.rs index 52a724fca9..b29285716d 100644 --- a/validation/src/pipeline.rs +++ b/validation/src/pipeline.rs @@ -17,8 +17,6 @@ //! The pipeline of validation functions a parachain block must pass through before //! it can be voted for. -use std::sync::Arc; - use codec::Encode; use polkadot_erasure_coding as erasure; use polkadot_primitives::parachain::{ @@ -33,7 +31,6 @@ use parachain::{ }; use runtime_primitives::traits::{BlakeTwo256, Hash as HashT}; use sp_api::ProvideRuntimeApi; -use parking_lot::Mutex; use crate::Error; pub use parachain::wasm_executor::ValidationPool; @@ -67,67 +64,6 @@ pub fn basic_checks( Ok(()) } -struct ExternalitiesInner { - upward: Vec, - fees_charged: Balance, - free_balance: Balance, - fee_schedule: FeeSchedule, -} - -impl wasm_executor::Externalities for ExternalitiesInner { - fn post_upward_message(&mut self, message: UpwardMessage) -> Result<(), String> { - self.apply_message_fee(message.data.len())?; - - self.upward.push(message); - - Ok(()) - } -} - -impl ExternalitiesInner { - fn new(free_balance: Balance, fee_schedule: FeeSchedule) -> Self { - Self { - free_balance, - fee_schedule, - fees_charged: 0, - upward: Vec::new(), - } - } - - fn apply_message_fee(&mut self, message_len: usize) -> Result<(), String> { - let fee = self.fee_schedule.compute_message_fee(message_len); - let new_fees_charged = self.fees_charged.saturating_add(fee); - if new_fees_charged > self.free_balance { - Err("could not cover fee.".into()) - } else { - self.fees_charged = new_fees_charged; - Ok(()) - } - } - - // Returns the noted outputs of execution so far - upward messages and balances. - fn outputs(self) -> (Vec, Balance) { - (self.upward, self.fees_charged) - } -} - -#[derive(Clone)] -struct Externalities(Arc>); - -impl Externalities { - fn new(free_balance: Balance, fee_schedule: FeeSchedule) -> Self { - Self(Arc::new(Mutex::new( - ExternalitiesInner::new(free_balance, fee_schedule) - ))) - } -} - -impl wasm_executor::Externalities for Externalities { - fn post_upward_message(&mut self, message: UpwardMessage) -> Result<(), String> { - self.0.lock().post_upward_message(message) - } -} - /// Data from a fully-outputted validation of a parachain candidate. This contains /// all outputs and commitments of the validation as well as all additional data to make available. pub struct FullOutput { @@ -163,6 +99,7 @@ pub struct ValidatedCandidate<'a> { local_validation: &'a LocalValidationData, upward_messages: Vec, fees: Balance, + processed_downward_messages: u32, } impl<'a> ValidatedCandidate<'a> { @@ -175,6 +112,7 @@ impl<'a> ValidatedCandidate<'a> { local_validation, upward_messages, fees, + processed_downward_messages, } = self; let omitted_validation = OmittedValidationData { @@ -212,6 +150,7 @@ impl<'a> ValidatedCandidate<'a> { fees, erasure_root, new_validation_code: None, + processed_downward_messages, }; Ok(FullOutput { @@ -223,6 +162,27 @@ impl<'a> ValidatedCandidate<'a> { } } +/// Validate that the given `UpwardMessage`s are covered by the given `free_balance`. +/// +/// Will return an error if the `free_balance` does not cover the required fees to the +/// given `msgs`. On success it returns the fees that need to be charged for the `msgs`. +fn validate_upward_messages( + msgs: &[UpwardMessage], + fee_schedule: FeeSchedule, + free_balance: Balance, +) -> Result { + msgs.iter().try_fold(Balance::from(0u128), |fees_charged, msg| { + let fees = fee_schedule.compute_message_fee(msg.data.len()); + let fees_charged = fees_charged.saturating_add(fees); + + if fees_charged > free_balance { + Err(Error::CouldNotCoverFee) + } else { + Ok(fees_charged) + } + }) +} + /// Does full checks of a collation, with provided PoV-block and contextual data. pub fn validate<'a>( validation_pool: Option<&'_ ValidationPool>, @@ -258,28 +218,26 @@ pub fn validate<'a>( .map(ExecutionMode::Remote) .unwrap_or(ExecutionMode::Local); - let ext = Externalities::new(local_validation.balance, fee_schedule); match wasm_executor::validate_candidate( &validation_code.0, params, - ext.clone(), execution_mode, ) { Ok(result) => { if result.head_data == collation.head_data { - let (upward_messages, fees) = Arc::try_unwrap(ext.0) - .map_err(|_| "") - .expect("Wasm executor drops passed externalities on completion; \ - call has concluded; qed") - .into_inner() - .outputs(); + let fees = validate_upward_messages( + &result.upward_messages, + fee_schedule, + local_validation.balance, + )?; Ok(ValidatedCandidate { pov_block, global_validation, local_validation, - upward_messages, + upward_messages: result.upward_messages, fees, + processed_downward_messages: result.processed_downward_messages, }) } else { Err(Error::HeadDataMismatch) @@ -368,37 +326,34 @@ pub fn full_output_validation_with_api

( #[cfg(test)] mod tests { use super::*; - use parachain::wasm_executor::Externalities as ExternalitiesTrait; use parachain::primitives::ParachainDispatchOrigin; + fn add_msg(size: usize, msgs: &mut Vec) { + let msg = UpwardMessage { data: vec![0; size], origin: ParachainDispatchOrigin::Parachain }; + msgs.push(msg); + } + #[test] - fn ext_checks_fees_and_updates_correctly() { - let mut ext = ExternalitiesInner { - upward: vec![ - UpwardMessage { data: vec![42], origin: ParachainDispatchOrigin::Parachain }, - ], - fees_charged: 0, - free_balance: 1_000_000, - fee_schedule: FeeSchedule { - base: 1000, - per_byte: 10, - }, + fn validate_upward_messages_works() { + let fee_schedule = FeeSchedule { + base: 1000, + per_byte: 10, }; + let free_balance = 1_000_000; + let mut msgs = Vec::new(); - ext.apply_message_fee(100).unwrap(); - assert_eq!(ext.fees_charged, 2000); - - ext.post_upward_message(UpwardMessage { - origin: ParachainDispatchOrigin::Signed, - data: vec![0u8; 100], - }).unwrap(); - assert_eq!(ext.fees_charged, 4000); + add_msg(100, &mut msgs); + assert_eq!(2000, validate_upward_messages(&msgs, fee_schedule, free_balance).unwrap()); + add_msg(100, &mut msgs); + assert_eq!(4000, validate_upward_messages(&msgs, fee_schedule, free_balance).unwrap()); - ext.apply_message_fee((1_000_000 - 4000 - 1000) / 10).unwrap(); - assert_eq!(ext.fees_charged, 1_000_000); + add_msg((1_000_000 - 4000 - 1000) / 10, &mut msgs); + assert_eq!(1_000_000, validate_upward_messages(&msgs, fee_schedule, free_balance).unwrap()); // cannot pay fee. - assert!(ext.apply_message_fee(1).is_err()); + add_msg(1, &mut msgs); + let err = validate_upward_messages(&msgs, fee_schedule, free_balance).unwrap_err(); + assert!(matches!(err, Error::CouldNotCoverFee)); } } diff --git a/validation/src/validation_service/mod.rs b/validation/src/validation_service/mod.rs index a19e2f0e3b..650950f24e 100644 --- a/validation/src/validation_service/mod.rs +++ b/validation/src/validation_service/mod.rs @@ -704,6 +704,9 @@ mod tests { fn signing_context() -> SigningContext { Default::default() } + fn downward_messages(_: ParaId) -> Vec { + Vec::new() + } } } -- GitLab From ad6619d8ef643d89ce5d7fb1daf4f5cf3e237234 Mon Sep 17 00:00:00 2001 From: Gavin Wood Date: Thu, 2 Jul 2020 15:09:03 +0200 Subject: [PATCH 028/192] Revert "Companion PR for Allow specify schedule dispatch origin #6387" (#1340) --- runtime/common/src/parachains.rs | 2 +- runtime/kusama/src/lib.rs | 11 ++--------- runtime/polkadot/src/lib.rs | 23 +---------------------- runtime/westend/src/lib.rs | 3 --- 4 files changed, 4 insertions(+), 35 deletions(-) diff --git a/runtime/common/src/parachains.rs b/runtime/common/src/parachains.rs index 031ffaf3d0..0753f74e63 100644 --- a/runtime/common/src/parachains.rs +++ b/runtime/common/src/parachains.rs @@ -333,7 +333,7 @@ pub trait Trait: CreateSignedTransaction> + attestations::Trait + ses } /// Origin for the parachains module. -#[derive(PartialEq, Eq, Clone, Encode, Decode)] +#[derive(PartialEq, Eq, Clone)] #[cfg_attr(feature = "std", derive(Debug))] pub enum Origin { /// It comes from a parachain. diff --git a/runtime/kusama/src/lib.rs b/runtime/kusama/src/lib.rs index 74b5785b3a..8e91f8f829 100644 --- a/runtime/kusama/src/lib.rs +++ b/runtime/kusama/src/lib.rs @@ -152,10 +152,8 @@ impl system::Trait for Runtime { impl scheduler::Trait for Runtime { type Event = Event; type Origin = Origin; - type PalletsOrigin = OriginCaller; type Call = Call; type MaximumWeight = MaximumBlockWeight; - type ScheduleOrigin = EnsureRoot; } parameter_types! { @@ -375,7 +373,6 @@ impl democracy::Trait for Runtime { type PreimageByteDeposit = PreimageByteDeposit; type Slash = Treasury; type Scheduler = Scheduler; - type PalletsOrigin = OriginCaller; type MaxVotes = MaxVotes; type OperationalPreimageOrigin = collective::EnsureMember; } @@ -892,14 +889,10 @@ impl proxy::Trait for Runtime { } pub struct CustomOnRuntimeUpgrade; - impl frame_support::traits::OnRuntimeUpgrade for CustomOnRuntimeUpgrade { +impl frame_support::traits::OnRuntimeUpgrade for CustomOnRuntimeUpgrade { fn on_runtime_upgrade() -> frame_support::weights::Weight { treasury::Module::::migrate_retract_tip_for_tip_new(); - if scheduler::Module::::migrate_v1_to_t2() { - ::MaximumBlockWeight::get() - } else { - ::DbWeight::get().reads(1) + 500_000_000 - } + 500_000_000 } } diff --git a/runtime/polkadot/src/lib.rs b/runtime/polkadot/src/lib.rs index e2eb26fced..dd9a365545 100644 --- a/runtime/polkadot/src/lib.rs +++ b/runtime/polkadot/src/lib.rs @@ -183,10 +183,8 @@ impl system::Trait for Runtime { impl scheduler::Trait for Runtime { type Event = Event; type Origin = Origin; - type PalletsOrigin = OriginCaller; type Call = Call; type MaximumWeight = MaximumBlockWeight; - type ScheduleOrigin = EnsureRoot; } parameter_types! { @@ -444,7 +442,6 @@ impl democracy::Trait for Runtime { type OperationalPreimageOrigin = collective::EnsureMember; type Slash = Treasury; type Scheduler = Scheduler; - type PalletsOrigin = OriginCaller; type MaxVotes = MaxVotes; } @@ -896,17 +893,6 @@ impl proxy::Trait for Runtime { type MaxProxies = MaxProxies; } -pub struct CustomOnRuntimeUpgrade; - impl frame_support::traits::OnRuntimeUpgrade for CustomOnRuntimeUpgrade { - fn on_runtime_upgrade() -> frame_support::weights::Weight { - if scheduler::Module::::migrate_v1_to_t2() { - ::MaximumBlockWeight::get() - } else { - ::DbWeight::get().reads(1) - } - } -} - construct_runtime! { pub enum Runtime where Block = Block, @@ -1004,14 +990,7 @@ pub type UncheckedExtrinsic = generic::UncheckedExtrinsic; /// Executive: handles dispatch to the various modules. -pub type Executive = executive::Executive< - Runtime, - Block, - system::ChainContext, - Runtime, - AllModules, - CustomOnRuntimeUpgrade ->; +pub type Executive = executive::Executive, Runtime, AllModules>; /// The payload being signed in transactions. pub type SignedPayload = generic::SignedPayload; diff --git a/runtime/westend/src/lib.rs b/runtime/westend/src/lib.rs index 34bbd55597..7aaa05eaaf 100644 --- a/runtime/westend/src/lib.rs +++ b/runtime/westend/src/lib.rs @@ -58,7 +58,6 @@ use im_online::sr25519::AuthorityId as ImOnlineId; use authority_discovery_primitives::AuthorityId as AuthorityDiscoveryId; use transaction_payment_rpc_runtime_api::RuntimeDispatchInfo; use session::historical as session_historical; -use system::EnsureRoot; #[cfg(feature = "std")] pub use staking::StakerStatus; @@ -142,10 +141,8 @@ impl system::Trait for Runtime { impl scheduler::Trait for Runtime { type Event = Event; type Origin = Origin; - type PalletsOrigin = OriginCaller; type Call = Call; type MaximumWeight = MaximumBlockWeight; - type ScheduleOrigin = EnsureRoot; } parameter_types! { -- GitLab From aeb79d47345e2e5d6320e0f2c11cb70df1e614e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Fri, 3 Jul 2020 10:02:55 +0200 Subject: [PATCH 029/192] Check candidate signatures before including them in `set_heads` (#1335) * Check candidate signatures before including them in `set_heads` This work around the bug described in: https://github.com/paritytech/polkadot/issues/1327 We check the candidate signatures in `create_inherent` to ensure that all are valid. If one isn't valid, we don't include any candidate for the current inherent. * Bump runtimes --- runtime/common/src/parachains.rs | 260 ++++++++++++++++++------------- runtime/kusama/src/lib.rs | 2 +- runtime/polkadot/src/lib.rs | 2 +- runtime/westend/src/lib.rs | 2 +- 4 files changed, 152 insertions(+), 114 deletions(-) diff --git a/runtime/common/src/parachains.rs b/runtime/common/src/parachains.rs index 0753f74e63..36c3242c3a 100644 --- a/runtime/common/src/parachains.rs +++ b/runtime/common/src/parachains.rs @@ -758,6 +758,69 @@ fn localized_payload( encoded } +/// Iterator that returns groups of validators that are assigned to the same chain. +/// +/// Assumes that the inner validators are sorted by chain id. +struct GroupedDutyIter<'a> { + next_idx: usize, + inner: &'a [(usize, ParaId)], +} + +impl<'a> GroupedDutyIter<'a> { + fn new(inner: &'a [(usize, ParaId)]) -> Self { + GroupedDutyIter { next_idx: 0, inner } + } + + fn group_for(&mut self, wanted_id: ParaId) -> Option<&'a [(usize, ParaId)]> { + while let Some((id, keys)) = self.next() { + if wanted_id == id { + return Some(keys) + } + } + + None + } +} + +impl<'a> Iterator for GroupedDutyIter<'a> { + type Item = (ParaId, &'a [(usize, ParaId)]); + + fn next(&mut self) -> Option { + if self.next_idx == self.inner.len() { return None } + let start_idx = self.next_idx; + self.next_idx += 1; + let start_id = self.inner[start_idx].1; + + while self.inner.get(self.next_idx).map_or(false, |&(_, ref id)| id == &start_id) { + self.next_idx += 1; + } + + Some((start_id, &self.inner[start_idx..self.next_idx])) + } +} + +/// Convert a duty roster, which is originally a Vec, where each +/// item corresponds to the same position in the session keys, into +/// a list containing (index, parachain duty) where indices are into the session keys. +/// This list is sorted ascending by parachain duty, just like the +/// parachain candidates are. +fn make_sorted_duties(duty: &[Chain]) -> Vec<(usize, ParaId)> { + let mut sorted_duties = Vec::with_capacity(duty.len()); + for (val_idx, duty) in duty.iter().enumerate() { + let id = match duty { + Chain::Relay => continue, + Chain::Parachain(id) => id, + }; + + let idx = sorted_duties.binary_search_by_key(&id, |&(_, ref id)| id) + .unwrap_or_else(|idx| idx); + + sorted_duties.insert(idx, (val_idx, *id)); + } + + sorted_duties +} + impl Module { /// Initialize the state of a new parachain/parathread. pub fn initialize_para( @@ -1197,78 +1260,78 @@ impl Module { T::ActiveParachains::active_paras() } - // check the attestations on these candidates. The candidates should have been checked - // that each candidates' chain ID is valid. - fn check_candidates( - schedule: &GlobalValidationSchedule, - attested_candidates: &[AttestedCandidate], - active_parachains: &[(ParaId, Option<(CollatorId, Retriable)>)] - ) -> sp_std::result::Result, sp_runtime::DispatchError> { - // returns groups of slices that have the same chain ID. - // assumes the inner slice is sorted by id. - struct GroupedDutyIter<'a> { - next_idx: usize, - inner: &'a [(usize, ParaId)], - } - - impl<'a> GroupedDutyIter<'a> { - fn new(inner: &'a [(usize, ParaId)]) -> Self { - GroupedDutyIter { next_idx: 0, inner } - } + /// Verify the signatures of all candidates. + /// + /// Returns `false` if a signature is not correct. + fn verify_candidate_signatures( + candidate: &AttestedCandidate, + authorities: &[ValidatorId], + validator_group: &[(usize, ParaId)], + signing_context: &SigningContext, + ) -> DispatchResult { + let mut expected_votes_len = 0; + let mut encoded_implicit = None; + let mut encoded_explicit = None; + let candidate_hash = candidate.candidate().hash(); - fn group_for(&mut self, wanted_id: ParaId) -> Option<&'a [(usize, ParaId)]> { - while let Some((id, keys)) = self.next() { - if wanted_id == id { - return Some(keys) - } + for (vote_index, (auth_index, _)) in candidate.validator_indices + .iter() + .enumerate() + .filter(|(_, bit)| **bit) + .enumerate() + { + let validity_attestation = match candidate.validity_votes.get(vote_index) { + None => Err(Error::::NotEnoughValidityVotes)?, + Some(v) => { + expected_votes_len = vote_index + 1; + v } + }; - None + if validator_group.iter().find(|&(idx, _)| *idx == auth_index).is_none() { + Err(Error::::WrongValidatorAttesting)? } - } - impl<'a> Iterator for GroupedDutyIter<'a> { - type Item = (ParaId, &'a [(usize, ParaId)]); + let (payload, sig) = match validity_attestation { + ValidityAttestation::Implicit(sig) => { + let payload = encoded_implicit.get_or_insert_with(|| localized_payload( + Statement::Candidate(candidate_hash), signing_context, + )); - fn next(&mut self) -> Option { - if self.next_idx == self.inner.len() { return None } - let start_idx = self.next_idx; - self.next_idx += 1; - let start_id = self.inner[start_idx].1; + (payload, sig) + } + ValidityAttestation::Explicit(sig) => { + let payload = encoded_explicit.get_or_insert_with(|| localized_payload( + Statement::Valid(candidate_hash), signing_context, + )); - while self.inner.get(self.next_idx).map_or(false, |&(_, ref id)| id == &start_id) { - self.next_idx += 1; + (payload, sig) } + }; - Some((start_id, &self.inner[start_idx..self.next_idx])) - } + ensure!( + sig.verify(&payload[..], &authorities[auth_index]), + Error::::InvalidSignature, + ); + } + + if candidate.validity_votes.len() == expected_votes_len { + Ok(()) + } else { + Err(Error::::UntaggedVotes.into()) } + } + // check the attestations on these candidates. The candidates should have been checked + // that each candidates' chain ID is valid. + fn check_candidates( + schedule: &GlobalValidationSchedule, + attested_candidates: &[AttestedCandidate], + active_parachains: &[(ParaId, Option<(CollatorId, Retriable)>)] + ) -> sp_std::result::Result, sp_runtime::DispatchError> { let authorities = Self::authorities(); let (duty_roster, random_seed) = Self::calculate_duty_roster(); - // convert a duty roster, which is originally a Vec, where each - // item corresponds to the same position in the session keys, into - // a list containing (index, parachain duty) where indices are into the session keys. - // this list is sorted ascending by parachain duty, just like the - // parachain candidates are. - let make_sorted_duties = |duty: &[Chain]| { - let mut sorted_duties = Vec::with_capacity(duty.len()); - for (val_idx, duty) in duty.iter().enumerate() { - let id = match duty { - Chain::Relay => continue, - Chain::Parachain(id) => id, - }; - - let idx = sorted_duties.binary_search_by_key(&id, |&(_, ref id)| id) - .unwrap_or_else(|idx| idx); - - sorted_duties.insert(idx, (val_idx, *id)); - } - - sorted_duties - }; - // computes the omitted validation data for a particular parachain. // // pass the perceived relay chain height of the para-block. This is the block number of @@ -1296,7 +1359,6 @@ impl Module { let relay_height_now = >::block_number(); let parent_hash = >::parent_hash(); let signing_context = Self::signing_context(); - let localized_payload = |statement: Statement| localized_payload(statement, &signing_context); let code_upgrade_delay = T::ValidationUpgradeDelay::get(); let mut validator_groups = GroupedDutyIter::new(&sorted_validators[..]); @@ -1386,58 +1448,9 @@ impl Module { T::ParachainCurrency::deduct(para_id, fees)?; - let candidate_hash = candidate.candidate().hash(); - let mut encoded_implicit = None; - let mut encoded_explicit = None; - - let mut expected_votes_len = 0; - for (vote_index, (auth_index, _)) in candidate.validator_indices - .iter() - .enumerate() - .filter(|(_, bit)| **bit) - .enumerate() - { - let validity_attestation = match candidate.validity_votes.get(vote_index) { - None => Err(Error::::NotEnoughValidityVotes)?, - Some(v) => { - expected_votes_len = vote_index + 1; - v - } - }; - - if validator_group.iter().find(|&(idx, _)| *idx == auth_index).is_none() { - Err(Error::::WrongValidatorAttesting)? - } - - let (payload, sig) = match validity_attestation { - ValidityAttestation::Implicit(sig) => { - let payload = encoded_implicit.get_or_insert_with(|| localized_payload( - Statement::Candidate(candidate_hash), - )); - - (payload, sig) - } - ValidityAttestation::Explicit(sig) => { - let payload = encoded_explicit.get_or_insert_with(|| localized_payload( - Statement::Valid(candidate_hash), - )); - - (payload, sig) - } - }; - - ensure!( - sig.verify(&payload[..], &authorities[auth_index]), - Error::::InvalidSignature, - ); - } + Self::verify_candidate_signatures(candidate, &authorities, validator_group, &signing_context)?; - ensure!( - candidate.validity_votes.len() == expected_votes_len, - Error::::UntaggedVotes - ); - - para_block_hashes.push(candidate_hash); + para_block_hashes.push(candidate.candidate.hash()); } Ok(IncludedBlocks { @@ -1449,6 +1462,25 @@ impl Module { }) } + /// Checks all signatures from all given `candidates`. + /// + /// Returns an error if any signature verification failed. + fn check_candidates_signatures(candidates: &[AttestedCandidate]) -> DispatchResult { + let authorities = Self::authorities(); + let duty_roster = Self::calculate_duty_roster().0; + let sorted_validators = make_sorted_duties(&duty_roster.validator_duty); + let signing_context = Self::signing_context(); + let mut validator_groups = GroupedDutyIter::new(&sorted_validators[..]); + + candidates.iter().try_for_each(|c| { + let para_id = c.parachain_index(); + let validator_group = validator_groups.group_for(para_id) + .ok_or(Error::::NoValidatorGroup)?; + + Self::verify_candidate_signatures(c, &authorities, validator_group, &signing_context) + }) + } + fn initialize_authorities(authorities: &[ValidatorId]) { if !authorities.is_empty() { assert!(Authorities::get().is_empty(), "Authorities are already initialized!"); @@ -1509,7 +1541,13 @@ impl ProvideInherent for Module { .expect("Parachain heads could not be decoded.") .expect("No parachain heads found in inherent data."); - Some(Call::set_heads(data)) + // Temporary solution for: + // https://github.com/paritytech/polkadot/issues/1327 + if Self::check_candidates_signatures(&data).is_ok() { + Some(Call::set_heads(data)) + } else { + Some(Call::set_heads(Vec::new())) + } } } diff --git a/runtime/kusama/src/lib.rs b/runtime/kusama/src/lib.rs index 8e91f8f829..17a5393758 100644 --- a/runtime/kusama/src/lib.rs +++ b/runtime/kusama/src/lib.rs @@ -86,7 +86,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("kusama"), impl_name: create_runtime_str!("parity-kusama"), authoring_version: 2, - spec_version: 2013, + spec_version: 2014, impl_version: 0, #[cfg(not(feature = "disable-runtime-api"))] apis: RUNTIME_API_VERSIONS, diff --git a/runtime/polkadot/src/lib.rs b/runtime/polkadot/src/lib.rs index dd9a365545..e71d38759c 100644 --- a/runtime/polkadot/src/lib.rs +++ b/runtime/polkadot/src/lib.rs @@ -91,7 +91,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("polkadot"), impl_name: create_runtime_str!("parity-polkadot"), authoring_version: 0, - spec_version: 13, + spec_version: 14, impl_version: 0, #[cfg(not(feature = "disable-runtime-api"))] apis: RUNTIME_API_VERSIONS, diff --git a/runtime/westend/src/lib.rs b/runtime/westend/src/lib.rs index 7aaa05eaaf..25d5e22e85 100644 --- a/runtime/westend/src/lib.rs +++ b/runtime/westend/src/lib.rs @@ -81,7 +81,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("westend"), impl_name: create_runtime_str!("parity-westend"), authoring_version: 2, - spec_version: 33, + spec_version: 34, impl_version: 0, #[cfg(not(feature = "disable-runtime-api"))] apis: RUNTIME_API_VERSIONS, -- GitLab From 0a7d04d00edc50488b2d6c34db685dac2234d749 Mon Sep 17 00:00:00 2001 From: Gavin Wood Date: Fri, 3 Jul 2020 15:35:36 +0200 Subject: [PATCH 030/192] Reduce Westend deposit requirements (#1341) * Switch branch * Return chain ops parts in new_chain_ops * Remove where param from new_chain_ops * Add task manager to new_chain_ops return * Revert branch switch * Revert "Revert branch switch" This reverts commit 7c7900c047abd794ddc759aa092811db4961a7a6. * network/test/src/lib: Adjust network worker polling Companion for https://github.com/paritytech/substrate/pull/6552. * Fix adder parachain * Fix collator tests * Revert branch switch * Bump everything - Remove old migration code - Reduce deposit requried for westend * Reapply fixes * Bump locl * Fix for #6550 * Fix message Co-authored-by: Ashley Ruglys Co-authored-by: Max Inden --- Cargo.lock | 327 +++++++++--------- Cargo.toml | 2 +- availability-store/Cargo.toml | 2 +- cli/Cargo.toml | 2 +- cli/src/command.rs | 12 +- collator/Cargo.toml | 2 +- collator/src/lib.rs | 28 +- erasure-coding/Cargo.toml | 2 +- network/Cargo.toml | 2 +- network/test/Cargo.toml | 2 +- network/test/src/lib.rs | 6 +- node/service/Cargo.toml | 1 + node/service/src/lib.rs | 18 +- parachain/Cargo.toml | 2 +- parachain/test-parachains/adder/Cargo.toml | 2 +- .../adder/collator/src/main.rs | 8 +- parachain/test-parachains/halt/Cargo.toml | 2 +- primitives/Cargo.toml | 2 +- rpc/Cargo.toml | 2 +- runtime/common/Cargo.toml | 2 +- runtime/common/src/parachains.rs | 2 +- runtime/kusama/Cargo.toml | 2 +- runtime/kusama/src/lib.rs | 10 +- runtime/polkadot/Cargo.toml | 2 +- runtime/polkadot/src/lib.rs | 23 +- runtime/test-runtime/Cargo.toml | 2 +- runtime/westend/Cargo.toml | 2 +- runtime/westend/src/constants.rs | 2 +- runtime/westend/src/lib.rs | 5 +- service/Cargo.toml | 3 +- service/src/lib.rs | 18 +- statement-table/Cargo.toml | 2 +- validation/Cargo.toml | 3 +- validation/src/validation_service/mod.rs | 19 +- 34 files changed, 299 insertions(+), 222 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index e9756cfd53..22c14cc8b3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1261,7 +1261,7 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "fork-tree" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" +source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" dependencies = [ "parity-scale-codec", ] @@ -1269,7 +1269,7 @@ dependencies = [ [[package]] name = "frame-benchmarking" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" +source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" dependencies = [ "frame-support", "frame-system", @@ -1286,7 +1286,7 @@ dependencies = [ [[package]] name = "frame-benchmarking-cli" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" +source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" dependencies = [ "frame-benchmarking", "parity-scale-codec", @@ -1304,7 +1304,7 @@ dependencies = [ [[package]] name = "frame-executive" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" +source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" dependencies = [ "frame-support", "frame-system", @@ -1319,7 +1319,7 @@ dependencies = [ [[package]] name = "frame-metadata" version = "11.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" +source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" dependencies = [ "parity-scale-codec", "serde", @@ -1330,7 +1330,7 @@ dependencies = [ [[package]] name = "frame-support" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" +source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" dependencies = [ "bitmask", "frame-metadata", @@ -1355,7 +1355,7 @@ dependencies = [ [[package]] name = "frame-support-procedural" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" +source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" dependencies = [ "frame-support-procedural-tools", "proc-macro2 1.0.18", @@ -1366,7 +1366,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" +source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" dependencies = [ "frame-support-procedural-tools-derive", "proc-macro-crate", @@ -1378,7 +1378,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools-derive" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" +source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" dependencies = [ "proc-macro2 1.0.18", "quote 1.0.7", @@ -1388,7 +1388,7 @@ dependencies = [ [[package]] name = "frame-system" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" +source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" dependencies = [ "frame-support", "impl-trait-for-tuples", @@ -1404,7 +1404,7 @@ dependencies = [ [[package]] name = "frame-system-benchmarking" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" +source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" dependencies = [ "frame-benchmarking", "frame-support", @@ -1418,7 +1418,7 @@ dependencies = [ [[package]] name = "frame-system-rpc-runtime-api" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" +source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" dependencies = [ "parity-scale-codec", "sp-api", @@ -2347,7 +2347,7 @@ dependencies = [ [[package]] name = "kusama-runtime" -version = "0.8.13" +version = "0.8.14" dependencies = [ "bitvec", "frame-benchmarking", @@ -3375,7 +3375,7 @@ dependencies = [ [[package]] name = "pallet-authority-discovery" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" +source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" dependencies = [ "frame-support", "frame-system", @@ -3391,7 +3391,7 @@ dependencies = [ [[package]] name = "pallet-authorship" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" +source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" dependencies = [ "frame-support", "frame-system", @@ -3406,7 +3406,7 @@ dependencies = [ [[package]] name = "pallet-babe" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" +source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" dependencies = [ "frame-support", "frame-system", @@ -3428,7 +3428,7 @@ dependencies = [ [[package]] name = "pallet-balances" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" +source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" dependencies = [ "frame-benchmarking", "frame-support", @@ -3442,7 +3442,7 @@ dependencies = [ [[package]] name = "pallet-collective" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" +source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" dependencies = [ "frame-benchmarking", "frame-support", @@ -3458,7 +3458,7 @@ dependencies = [ [[package]] name = "pallet-democracy" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" +source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" dependencies = [ "frame-benchmarking", "frame-support", @@ -3473,7 +3473,7 @@ dependencies = [ [[package]] name = "pallet-elections-phragmen" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" +source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" dependencies = [ "frame-benchmarking", "frame-support", @@ -3488,7 +3488,7 @@ dependencies = [ [[package]] name = "pallet-finality-tracker" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" +source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" dependencies = [ "frame-support", "frame-system", @@ -3504,7 +3504,7 @@ dependencies = [ [[package]] name = "pallet-grandpa" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" +source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" dependencies = [ "frame-support", "frame-system", @@ -3524,7 +3524,7 @@ dependencies = [ [[package]] name = "pallet-identity" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" +source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" dependencies = [ "enumflags2", "frame-benchmarking", @@ -3540,7 +3540,7 @@ dependencies = [ [[package]] name = "pallet-im-online" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" +source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" dependencies = [ "frame-benchmarking", "frame-support", @@ -3560,7 +3560,7 @@ dependencies = [ [[package]] name = "pallet-indices" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" +source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" dependencies = [ "frame-support", "frame-system", @@ -3576,7 +3576,7 @@ dependencies = [ [[package]] name = "pallet-membership" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" +source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" dependencies = [ "frame-support", "frame-system", @@ -3590,7 +3590,7 @@ dependencies = [ [[package]] name = "pallet-multisig" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" +source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" dependencies = [ "frame-support", "frame-system", @@ -3605,7 +3605,7 @@ dependencies = [ [[package]] name = "pallet-nicks" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" +source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" dependencies = [ "frame-support", "frame-system", @@ -3619,7 +3619,7 @@ dependencies = [ [[package]] name = "pallet-offences" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" +source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" dependencies = [ "frame-support", "frame-system", @@ -3634,7 +3634,7 @@ dependencies = [ [[package]] name = "pallet-offences-benchmarking" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" +source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" dependencies = [ "frame-benchmarking", "frame-support", @@ -3655,7 +3655,7 @@ dependencies = [ [[package]] name = "pallet-proxy" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" +source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" dependencies = [ "frame-support", "frame-system", @@ -3670,7 +3670,7 @@ dependencies = [ [[package]] name = "pallet-randomness-collective-flip" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" +source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" dependencies = [ "frame-support", "frame-system", @@ -3683,7 +3683,7 @@ dependencies = [ [[package]] name = "pallet-recovery" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" +source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" dependencies = [ "enumflags2", "frame-support", @@ -3698,7 +3698,7 @@ dependencies = [ [[package]] name = "pallet-scheduler" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" +source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" dependencies = [ "frame-benchmarking", "frame-support", @@ -3713,7 +3713,7 @@ dependencies = [ [[package]] name = "pallet-session" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" +source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" dependencies = [ "frame-support", "frame-system", @@ -3733,7 +3733,7 @@ dependencies = [ [[package]] name = "pallet-session-benchmarking" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" +source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" dependencies = [ "frame-benchmarking", "frame-support", @@ -3747,7 +3747,7 @@ dependencies = [ [[package]] name = "pallet-society" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" +source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" dependencies = [ "frame-support", "frame-system", @@ -3761,7 +3761,7 @@ dependencies = [ [[package]] name = "pallet-staking" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" +source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" dependencies = [ "frame-benchmarking", "frame-support", @@ -3783,7 +3783,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-curve" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" +source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -3794,7 +3794,7 @@ dependencies = [ [[package]] name = "pallet-sudo" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" +source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" dependencies = [ "frame-support", "frame-system", @@ -3808,7 +3808,7 @@ dependencies = [ [[package]] name = "pallet-timestamp" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" +source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" dependencies = [ "frame-benchmarking", "frame-support", @@ -3826,7 +3826,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" +source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" dependencies = [ "frame-support", "frame-system", @@ -3841,7 +3841,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" +source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" dependencies = [ "jsonrpc-core", "jsonrpc-core-client", @@ -3859,7 +3859,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc-runtime-api" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" +source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" dependencies = [ "frame-support", "parity-scale-codec", @@ -3872,7 +3872,7 @@ dependencies = [ [[package]] name = "pallet-treasury" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" +source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" dependencies = [ "frame-benchmarking", "frame-support", @@ -3887,7 +3887,7 @@ dependencies = [ [[package]] name = "pallet-utility" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" +source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" dependencies = [ "frame-benchmarking", "frame-support", @@ -3903,7 +3903,7 @@ dependencies = [ [[package]] name = "pallet-vesting" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" +source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" dependencies = [ "enumflags2", "frame-benchmarking", @@ -4228,7 +4228,7 @@ checksum = "feb3b2b1033b8a60b4da6ee470325f887758c95d5320f52f9ce0df055a55940e" [[package]] name = "polkadot" -version = "0.8.13" +version = "0.8.14" dependencies = [ "assert_cmd", "futures 0.3.5", @@ -4242,7 +4242,7 @@ dependencies = [ [[package]] name = "polkadot-availability-store" -version = "0.8.13" +version = "0.8.14" dependencies = [ "derive_more 0.99.8", "exit-future", @@ -4268,7 +4268,7 @@ dependencies = [ [[package]] name = "polkadot-cli" -version = "0.8.13" +version = "0.8.14" dependencies = [ "frame-benchmarking-cli", "futures 0.3.5", @@ -4293,7 +4293,7 @@ dependencies = [ [[package]] name = "polkadot-collator" -version = "0.8.13" +version = "0.8.14" dependencies = [ "futures 0.3.5", "futures-timer 2.0.2", @@ -4331,7 +4331,7 @@ dependencies = [ [[package]] name = "polkadot-erasure-coding" -version = "0.8.13" +version = "0.8.14" dependencies = [ "derive_more 0.15.0", "parity-scale-codec", @@ -4343,7 +4343,7 @@ dependencies = [ [[package]] name = "polkadot-network" -version = "0.8.13" +version = "0.8.14" dependencies = [ "arrayvec 0.4.12", "bytes 0.5.4", @@ -4390,7 +4390,7 @@ dependencies = [ [[package]] name = "polkadot-network-test" -version = "0.8.13" +version = "0.8.14" dependencies = [ "futures 0.3.5", "log 0.4.8", @@ -4450,7 +4450,7 @@ dependencies = [ [[package]] name = "polkadot-parachain" -version = "0.8.13" +version = "0.8.14" dependencies = [ "derive_more 0.99.8", "log 0.4.8", @@ -4469,7 +4469,7 @@ dependencies = [ [[package]] name = "polkadot-primitives" -version = "0.8.13" +version = "0.8.14" dependencies = [ "bitvec", "frame-system", @@ -4492,7 +4492,7 @@ dependencies = [ [[package]] name = "polkadot-rpc" -version = "0.8.13" +version = "0.8.14" dependencies = [ "jsonrpc-core", "pallet-transaction-payment-rpc", @@ -4518,7 +4518,7 @@ dependencies = [ [[package]] name = "polkadot-runtime" -version = "0.8.13" +version = "0.8.14" dependencies = [ "bitvec", "frame-benchmarking", @@ -4592,7 +4592,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-common" -version = "0.8.13" +version = "0.8.14" dependencies = [ "bitvec", "frame-benchmarking", @@ -4679,7 +4679,7 @@ dependencies = [ [[package]] name = "polkadot-service" -version = "0.8.13" +version = "0.8.14" dependencies = [ "env_logger", "frame-benchmarking", @@ -4732,6 +4732,7 @@ dependencies = [ "sp-runtime", "sp-session", "sp-transaction-pool", + "sp-trie", "substrate-prometheus-endpoint", "westend-runtime", ] @@ -4792,13 +4793,14 @@ dependencies = [ "sp-runtime", "sp-session", "sp-transaction-pool", + "sp-trie", "substrate-prometheus-endpoint", "westend-runtime", ] [[package]] name = "polkadot-statement-table" -version = "0.8.13" +version = "0.8.14" dependencies = [ "parity-scale-codec", "polkadot-primitives", @@ -4817,7 +4819,7 @@ dependencies = [ [[package]] name = "polkadot-test-runtime" -version = "0.8.13" +version = "0.8.14" dependencies = [ "bitvec", "frame-executive", @@ -4894,8 +4896,9 @@ dependencies = [ [[package]] name = "polkadot-validation" -version = "0.8.13" +version = "0.8.14" dependencies = [ + "ansi_term 0.12.1", "bitvec", "derive_more 0.14.1", "exit-future", @@ -5703,7 +5706,7 @@ dependencies = [ [[package]] name = "sc-authority-discovery" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" +source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" dependencies = [ "bytes 0.5.4", "derive_more 0.99.8", @@ -5730,7 +5733,7 @@ dependencies = [ [[package]] name = "sc-basic-authorship" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" +source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -5754,7 +5757,7 @@ dependencies = [ [[package]] name = "sc-block-builder" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" +source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" dependencies = [ "parity-scale-codec", "sc-client-api", @@ -5763,6 +5766,7 @@ dependencies = [ "sp-blockchain", "sp-consensus", "sp-core", + "sp-inherents", "sp-runtime", "sp-state-machine", ] @@ -5770,7 +5774,7 @@ dependencies = [ [[package]] name = "sc-chain-spec" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" +source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" dependencies = [ "impl-trait-for-tuples", "sc-chain-spec-derive", @@ -5786,7 +5790,7 @@ dependencies = [ [[package]] name = "sc-chain-spec-derive" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" +source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -5797,7 +5801,7 @@ dependencies = [ [[package]] name = "sc-cli" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" +source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" dependencies = [ "ansi_term 0.12.1", "atty", @@ -5819,6 +5823,7 @@ dependencies = [ "sc-service", "sc-telemetry", "sc-tracing", + "serde", "serde_json", "sp-blockchain", "sp-core", @@ -5837,7 +5842,7 @@ dependencies = [ [[package]] name = "sc-client-api" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" +source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" dependencies = [ "derive_more 0.99.8", "fnv", @@ -5873,7 +5878,7 @@ dependencies = [ [[package]] name = "sc-client-db" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" +source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" dependencies = [ "blake2-rfc", "hash-db", @@ -5902,7 +5907,7 @@ dependencies = [ [[package]] name = "sc-consensus" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" +source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" dependencies = [ "sc-client-api", "sp-blockchain", @@ -5913,7 +5918,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" +source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" dependencies = [ "derive_more 0.99.8", "fork-tree", @@ -5955,7 +5960,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe-rpc" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" +source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" dependencies = [ "derive_more 0.99.8", "futures 0.3.5", @@ -5979,7 +5984,7 @@ dependencies = [ [[package]] name = "sc-consensus-epochs" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" +source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" dependencies = [ "fork-tree", "parity-scale-codec", @@ -5992,7 +5997,7 @@ dependencies = [ [[package]] name = "sc-consensus-slots" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" +source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6014,7 +6019,7 @@ dependencies = [ [[package]] name = "sc-consensus-uncles" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" +source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" dependencies = [ "log 0.4.8", "sc-client-api", @@ -6028,7 +6033,7 @@ dependencies = [ [[package]] name = "sc-executor" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" +source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" dependencies = [ "derive_more 0.99.8", "lazy_static", @@ -6056,7 +6061,7 @@ dependencies = [ [[package]] name = "sc-executor-common" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" +source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" dependencies = [ "derive_more 0.99.8", "log 0.4.8", @@ -6073,7 +6078,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmi" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" +source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" dependencies = [ "log 0.4.8", "parity-scale-codec", @@ -6088,7 +6093,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmtime" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" +source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" dependencies = [ "cranelift-codegen", "cranelift-wasm", @@ -6109,7 +6114,7 @@ dependencies = [ [[package]] name = "sc-finality-grandpa" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" +source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" dependencies = [ "assert_matches", "derive_more 0.99.8", @@ -6147,7 +6152,7 @@ dependencies = [ [[package]] name = "sc-finality-grandpa-rpc" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" +source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" dependencies = [ "derive_more 0.99.8", "finality-grandpa", @@ -6164,7 +6169,7 @@ dependencies = [ [[package]] name = "sc-informant" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" +source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" dependencies = [ "ansi_term 0.12.1", "futures 0.3.5", @@ -6183,7 +6188,7 @@ dependencies = [ [[package]] name = "sc-keystore" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" +source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" dependencies = [ "derive_more 0.99.8", "hex", @@ -6199,7 +6204,7 @@ dependencies = [ [[package]] name = "sc-light" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" +source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" dependencies = [ "hash-db", "lazy_static", @@ -6218,7 +6223,7 @@ dependencies = [ [[package]] name = "sc-network" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" +source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" dependencies = [ "bitflags", "bs58", @@ -6270,7 +6275,7 @@ dependencies = [ [[package]] name = "sc-network-gossip" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" +source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6285,7 +6290,7 @@ dependencies = [ [[package]] name = "sc-network-test" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" +source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" dependencies = [ "env_logger", "futures 0.3.5", @@ -6312,7 +6317,7 @@ dependencies = [ [[package]] name = "sc-offchain" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" +source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" dependencies = [ "bytes 0.5.4", "fnv", @@ -6339,7 +6344,7 @@ dependencies = [ [[package]] name = "sc-peerset" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" +source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" dependencies = [ "futures 0.3.5", "libp2p", @@ -6352,7 +6357,7 @@ dependencies = [ [[package]] name = "sc-proposer-metrics" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" +source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" dependencies = [ "log 0.4.8", "substrate-prometheus-endpoint", @@ -6361,7 +6366,7 @@ dependencies = [ [[package]] name = "sc-rpc" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" +source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" dependencies = [ "futures 0.3.5", "hash-db", @@ -6393,7 +6398,7 @@ dependencies = [ [[package]] name = "sc-rpc-api" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" +source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" dependencies = [ "derive_more 0.99.8", "futures 0.3.5", @@ -6417,7 +6422,7 @@ dependencies = [ [[package]] name = "sc-rpc-server" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" +source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" dependencies = [ "jsonrpc-core", "jsonrpc-http-server", @@ -6433,7 +6438,7 @@ dependencies = [ [[package]] name = "sc-service" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" +source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" dependencies = [ "derive_more 0.99.8", "directories", @@ -6496,7 +6501,7 @@ dependencies = [ [[package]] name = "sc-state-db" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" +source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" dependencies = [ "log 0.4.8", "parity-scale-codec", @@ -6510,7 +6515,7 @@ dependencies = [ [[package]] name = "sc-telemetry" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" +source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6531,7 +6536,7 @@ dependencies = [ [[package]] name = "sc-tracing" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" +source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" dependencies = [ "erased-serde", "log 0.4.8", @@ -6548,7 +6553,7 @@ dependencies = [ [[package]] name = "sc-transaction-graph" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" +source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" dependencies = [ "derive_more 0.99.8", "futures 0.3.5", @@ -6568,7 +6573,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" +source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" dependencies = [ "derive_more 0.99.8", "futures 0.3.5", @@ -6661,6 +6666,15 @@ dependencies = [ "untrusted", ] +[[package]] +name = "secrecy" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9182278ed645df3477a9c27bfee0621c621aa16f6972635f7f795dae3d81070f" +dependencies = [ + "zeroize", +] + [[package]] name = "security-framework" version = "0.4.4" @@ -6945,7 +6959,7 @@ dependencies = [ [[package]] name = "sp-allocator" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" +source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" dependencies = [ "derive_more 0.99.8", "log 0.4.8", @@ -6957,7 +6971,7 @@ dependencies = [ [[package]] name = "sp-api" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" +source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" dependencies = [ "hash-db", "parity-scale-codec", @@ -6972,7 +6986,7 @@ dependencies = [ [[package]] name = "sp-api-proc-macro" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" +source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" dependencies = [ "blake2-rfc", "proc-macro-crate", @@ -6984,7 +6998,7 @@ dependencies = [ [[package]] name = "sp-application-crypto" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" +source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" dependencies = [ "parity-scale-codec", "serde", @@ -6996,7 +7010,7 @@ dependencies = [ [[package]] name = "sp-arithmetic" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" +source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" dependencies = [ "integer-sqrt", "num-traits 0.2.12", @@ -7009,7 +7023,7 @@ dependencies = [ [[package]] name = "sp-authority-discovery" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" +source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" dependencies = [ "parity-scale-codec", "sp-api", @@ -7021,7 +7035,7 @@ dependencies = [ [[package]] name = "sp-authorship" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" +source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" dependencies = [ "parity-scale-codec", "sp-inherents", @@ -7032,7 +7046,7 @@ dependencies = [ [[package]] name = "sp-block-builder" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" +source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" dependencies = [ "parity-scale-codec", "sp-api", @@ -7044,7 +7058,7 @@ dependencies = [ [[package]] name = "sp-blockchain" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" +source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" dependencies = [ "derive_more 0.99.8", "log 0.4.8", @@ -7060,7 +7074,7 @@ dependencies = [ [[package]] name = "sp-chain-spec" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" +source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" dependencies = [ "serde", "serde_json", @@ -7069,7 +7083,7 @@ dependencies = [ [[package]] name = "sp-consensus" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" +source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" dependencies = [ "derive_more 0.99.8", "futures 0.3.5", @@ -7093,7 +7107,7 @@ dependencies = [ [[package]] name = "sp-consensus-aura" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" +source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" dependencies = [ "parity-scale-codec", "sp-api", @@ -7107,7 +7121,7 @@ dependencies = [ [[package]] name = "sp-consensus-babe" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" +source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" dependencies = [ "merlin", "parity-scale-codec", @@ -7125,7 +7139,7 @@ dependencies = [ [[package]] name = "sp-consensus-vrf" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" +source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" dependencies = [ "parity-scale-codec", "schnorrkel", @@ -7137,7 +7151,7 @@ dependencies = [ [[package]] name = "sp-core" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" +source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" dependencies = [ "base58", "blake2-rfc", @@ -7161,6 +7175,7 @@ dependencies = [ "rand 0.7.3", "regex", "schnorrkel", + "secrecy", "serde", "sha2", "sp-debug-derive", @@ -7179,7 +7194,7 @@ dependencies = [ [[package]] name = "sp-database" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" +source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" dependencies = [ "kvdb", "parking_lot 0.10.2", @@ -7188,7 +7203,7 @@ dependencies = [ [[package]] name = "sp-debug-derive" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" +source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" dependencies = [ "proc-macro2 1.0.18", "quote 1.0.7", @@ -7198,7 +7213,7 @@ dependencies = [ [[package]] name = "sp-externalities" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" +source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" dependencies = [ "environmental", "parity-scale-codec", @@ -7209,7 +7224,7 @@ dependencies = [ [[package]] name = "sp-finality-grandpa" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" +source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" dependencies = [ "finality-grandpa", "log 0.4.8", @@ -7225,7 +7240,7 @@ dependencies = [ [[package]] name = "sp-finality-tracker" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" +source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" dependencies = [ "parity-scale-codec", "sp-inherents", @@ -7235,7 +7250,7 @@ dependencies = [ [[package]] name = "sp-inherents" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" +source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" dependencies = [ "derive_more 0.99.8", "parity-scale-codec", @@ -7247,7 +7262,7 @@ dependencies = [ [[package]] name = "sp-io" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" +source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" dependencies = [ "futures 0.3.5", "hash-db", @@ -7268,7 +7283,7 @@ dependencies = [ [[package]] name = "sp-keyring" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" +source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" dependencies = [ "lazy_static", "sp-core", @@ -7279,7 +7294,7 @@ dependencies = [ [[package]] name = "sp-npos-elections" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" +source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" dependencies = [ "parity-scale-codec", "serde", @@ -7291,7 +7306,7 @@ dependencies = [ [[package]] name = "sp-npos-elections-compact" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" +source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -7302,7 +7317,7 @@ dependencies = [ [[package]] name = "sp-offchain" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" +source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" dependencies = [ "sp-api", "sp-core", @@ -7312,7 +7327,7 @@ dependencies = [ [[package]] name = "sp-panic-handler" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" +source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" dependencies = [ "backtrace", "log 0.4.8", @@ -7321,7 +7336,7 @@ dependencies = [ [[package]] name = "sp-rpc" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" +source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" dependencies = [ "serde", "sp-core", @@ -7330,7 +7345,7 @@ dependencies = [ [[package]] name = "sp-runtime" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" +source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" dependencies = [ "either", "hash256-std-hasher", @@ -7352,7 +7367,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" +source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" dependencies = [ "parity-scale-codec", "primitive-types", @@ -7367,7 +7382,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" +source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" dependencies = [ "Inflector", "proc-macro-crate", @@ -7379,7 +7394,7 @@ dependencies = [ [[package]] name = "sp-serializer" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" +source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" dependencies = [ "serde", "serde_json", @@ -7388,7 +7403,7 @@ dependencies = [ [[package]] name = "sp-session" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" +source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" dependencies = [ "parity-scale-codec", "sp-api", @@ -7401,7 +7416,7 @@ dependencies = [ [[package]] name = "sp-staking" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" +source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" dependencies = [ "parity-scale-codec", "sp-runtime", @@ -7411,7 +7426,7 @@ dependencies = [ [[package]] name = "sp-state-machine" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" +source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" dependencies = [ "hash-db", "itertools 0.9.0", @@ -7432,12 +7447,12 @@ dependencies = [ [[package]] name = "sp-std" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" +source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" [[package]] name = "sp-storage" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" +source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" dependencies = [ "impl-serde 0.2.3", "ref-cast", @@ -7449,7 +7464,7 @@ dependencies = [ [[package]] name = "sp-timestamp" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" +source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -7463,7 +7478,7 @@ dependencies = [ [[package]] name = "sp-tracing" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" +source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" dependencies = [ "log 0.4.8", "rental", @@ -7473,7 +7488,7 @@ dependencies = [ [[package]] name = "sp-transaction-pool" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" +source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" dependencies = [ "derive_more 0.99.8", "futures 0.3.5", @@ -7489,7 +7504,7 @@ dependencies = [ [[package]] name = "sp-trie" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" +source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" dependencies = [ "hash-db", "memory-db", @@ -7503,7 +7518,7 @@ dependencies = [ [[package]] name = "sp-utils" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" +source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" dependencies = [ "futures 0.3.5", "futures-core", @@ -7515,7 +7530,7 @@ dependencies = [ [[package]] name = "sp-version" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" +source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" dependencies = [ "impl-serde 0.2.3", "parity-scale-codec", @@ -7527,7 +7542,7 @@ dependencies = [ [[package]] name = "sp-wasm-interface" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" +source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -7667,7 +7682,7 @@ dependencies = [ [[package]] name = "substrate-browser-utils" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" +source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" dependencies = [ "chrono", "clear_on_drop", @@ -7694,7 +7709,7 @@ dependencies = [ [[package]] name = "substrate-build-script-utils" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" +source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" dependencies = [ "platforms", ] @@ -7702,7 +7717,7 @@ dependencies = [ [[package]] name = "substrate-frame-rpc-system" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" +source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" dependencies = [ "frame-system-rpc-runtime-api", "futures 0.3.5", @@ -7725,7 +7740,7 @@ dependencies = [ [[package]] name = "substrate-prometheus-endpoint" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" +source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" dependencies = [ "async-std", "derive_more 0.99.8", @@ -7739,7 +7754,7 @@ dependencies = [ [[package]] name = "substrate-test-client" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" +source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" dependencies = [ "futures 0.3.5", "hash-db", @@ -7761,7 +7776,7 @@ dependencies = [ [[package]] name = "substrate-test-runtime" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" +source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" dependencies = [ "cfg-if", "frame-executive", @@ -7801,7 +7816,7 @@ dependencies = [ [[package]] name = "substrate-test-runtime-client" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" +source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" dependencies = [ "futures 0.3.5", "parity-scale-codec", @@ -7822,7 +7837,7 @@ dependencies = [ [[package]] name = "substrate-wasm-builder-runner" version = "1.0.6" -source = "git+https://github.com/paritytech/substrate#e8f901868997be15635cba9b21a99b212009adc8" +source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" [[package]] name = "substrate-wasm-builder-runner" @@ -8048,7 +8063,7 @@ dependencies = [ [[package]] name = "test-parachain-adder" -version = "0.8.13" +version = "0.8.14" dependencies = [ "dlmalloc", "parity-scale-codec", @@ -8089,7 +8104,7 @@ dependencies = [ [[package]] name = "test-parachain-halt" -version = "0.8.13" +version = "0.8.14" dependencies = [ "substrate-wasm-builder-runner 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -9018,7 +9033,7 @@ dependencies = [ [[package]] name = "westend-runtime" -version = "0.8.13" +version = "0.8.14" dependencies = [ "bitvec", "frame-benchmarking", diff --git a/Cargo.toml b/Cargo.toml index f6632f77a1..2723f0fa79 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,7 +4,7 @@ path = "src/main.rs" [package] name = "polkadot" -version = "0.8.13" +version = "0.8.14" authors = ["Parity Technologies "] edition = "2018" diff --git a/availability-store/Cargo.toml b/availability-store/Cargo.toml index 503e897cea..369e184b3b 100644 --- a/availability-store/Cargo.toml +++ b/availability-store/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "polkadot-availability-store" description = "Persistent database for parachain data" -version = "0.8.13" +version = "0.8.14" authors = ["Parity Technologies "] edition = "2018" diff --git a/cli/Cargo.toml b/cli/Cargo.toml index b395ccba9d..ed97adc85a 100644 --- a/cli/Cargo.toml +++ b/cli/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-cli" -version = "0.8.13" +version = "0.8.14" authors = ["Parity Technologies "] description = "Polkadot Relay-chain Client Node" edition = "2018" diff --git a/cli/src/command.rs b/cli/src/command.rs index 7b437a2c35..d518b94ccf 100644 --- a/cli/src/command.rs +++ b/cli/src/command.rs @@ -30,19 +30,19 @@ fn get_exec_name() -> Option { } impl SubstrateCli for Cli { - fn impl_name() -> &'static str { "Parity Polkadot" } + fn impl_name() -> String { "Parity Polkadot".into() } - fn impl_version() -> &'static str { env!("SUBSTRATE_CLI_IMPL_VERSION") } + fn impl_version() -> String { env!("SUBSTRATE_CLI_IMPL_VERSION").into() } - fn description() -> &'static str { env!("CARGO_PKG_DESCRIPTION") } + fn description() -> String { env!("CARGO_PKG_DESCRIPTION").into() } - fn author() -> &'static str { env!("CARGO_PKG_AUTHORS") } + fn author() -> String { env!("CARGO_PKG_AUTHORS").into() } - fn support_url() -> &'static str { "https://github.com/paritytech/polkadot/issues/new" } + fn support_url() -> String { "https://github.com/paritytech/polkadot/issues/new".into() } fn copyright_start_year() -> i32 { 2017 } - fn executable_name() -> &'static str { "polkadot" } + fn executable_name() -> String { "polkadot".into() } fn load_spec(&self, id: &str) -> std::result::Result, String> { let id = if id == "" { diff --git a/collator/Cargo.toml b/collator/Cargo.toml index 42e733419f..c00b24d072 100644 --- a/collator/Cargo.toml +++ b/collator/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-collator" -version = "0.8.13" +version = "0.8.14" authors = ["Parity Technologies "] description = "Collator node implementation" edition = "2018" diff --git a/collator/src/lib.rs b/collator/src/lib.rs index 51f3255a74..7e3e0bd342 100644 --- a/collator/src/lib.rs +++ b/collator/src/lib.rs @@ -373,12 +373,15 @@ fn build_collator_service( /// Async function that will run the collator node with the given `RelayChainContext` and `ParachainContext` /// built by the given `BuildParachainContext` and arguments to the underlying polkadot node. -pub async fn start_collator

( +pub fn start_collator

( build_parachain_context: P, para_id: ParaId, key: Arc, config: Configuration, -) -> Result<(), polkadot_service::Error> +) -> Result< + (Pin + Send>>, sc_service::TaskManager), + polkadot_service::Error +> where P: 'static + BuildParachainContext, P::ParachainContext: Send + 'static, @@ -400,14 +403,15 @@ where None, )?; let spawn_handle = task_manager.spawn_handle(); - build_collator_service( + let future = build_collator_service( spawn_handle, handlers, client, para_id, key, build_parachain_context - )?.await; + )?; + Ok((future.boxed(), task_manager)) } else if config.chain_spec.is_westend() { let (task_manager, client, handlers) = service::westend_new_full( config, @@ -418,14 +422,15 @@ where None, )?; let spawn_handle = task_manager.spawn_handle(); - build_collator_service( + let future = build_collator_service( spawn_handle, handlers, client, para_id, key, build_parachain_context - )?.await; + )?; + Ok((future.boxed(), task_manager)) } else { let (task_manager, client, handles) = service::polkadot_new_full( config, @@ -436,17 +441,16 @@ where None, )?; let spawn_handle = task_manager.spawn_handle(); - build_collator_service( + let future = build_collator_service( spawn_handle, handles, client, para_id, key, - build_parachain_context, - )?.await; + build_parachain_context + )?; + Ok((future.boxed(), task_manager)) } - - Ok(()) } #[cfg(not(feature = "service-rewr"))] @@ -506,7 +510,7 @@ mod tests { fn check_send(_: T) {} let cli = Cli::from_iter(&["-dev"]); - let task_executor = |_, _| unimplemented!(); + let task_executor = |_, _| {}; let config = cli.create_configuration(&cli.run.base, task_executor.into()).unwrap(); check_send(start_collator( diff --git a/erasure-coding/Cargo.toml b/erasure-coding/Cargo.toml index 9c49e33f40..614017000d 100644 --- a/erasure-coding/Cargo.toml +++ b/erasure-coding/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-erasure-coding" -version = "0.8.13" +version = "0.8.14" authors = ["Parity Technologies "] edition = "2018" diff --git a/network/Cargo.toml b/network/Cargo.toml index 0735fec590..804cdcb3f1 100644 --- a/network/Cargo.toml +++ b/network/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-network" -version = "0.8.13" +version = "0.8.14" authors = ["Parity Technologies "] description = "Polkadot-specific networking protocol" edition = "2018" diff --git a/network/test/Cargo.toml b/network/test/Cargo.toml index ad8cafe3f4..5e14454e2c 100644 --- a/network/test/Cargo.toml +++ b/network/test/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-network-test" -version = "0.8.13" +version = "0.8.14" license = "GPL-3.0" authors = ["Parity Technologies "] edition = "2018" diff --git a/network/test/src/lib.rs b/network/test/src/lib.rs index f8afc4fb0c..14463d7a42 100644 --- a/network/test/src/lib.rs +++ b/network/test/src/lib.rs @@ -758,13 +758,13 @@ pub trait TestNetFactory: Sized { futures::executor::block_on(futures::future::poll_fn::<(), _>(|cx| self.poll_until_idle(cx))); } - /// Polls the testnet. Processes all the pending actions and returns `NotReady`. + /// Polls the testnet. Processes all the pending actions. fn poll(&mut self, cx: &mut FutureContext) { self.mut_peers(|peers| { for peer in peers { trace!(target: "sync", "-- Polling {}", peer.id()); - if let Poll::Ready(res) = Pin::new(&mut peer.network).poll(cx) { - res.unwrap(); + if let Poll::Ready(()) = peer.network.poll_unpin(cx) { + panic!("NetworkWorker has terminated unexpectedly.") } trace!(target: "sync", "-- Polling complete {}", peer.id()); diff --git a/node/service/Cargo.toml b/node/service/Cargo.toml index f1a56acfad..1036cff494 100644 --- a/node/service/Cargo.toml +++ b/node/service/Cargo.toml @@ -31,6 +31,7 @@ sc-chain-spec = { git = "https://github.com/paritytech/substrate", branch = "mas sc-executor = { git = "https://github.com/paritytech/substrate", branch = "master" } sc-consensus = { git = "https://github.com/paritytech/substrate", branch = "master" } sc-network = { git = "https://github.com/paritytech/substrate", branch = "master" } +sp-trie = { git = "https://github.com/paritytech/substrate", branch = "master" } consensus_common = { package = "sp-consensus", git = "https://github.com/paritytech/substrate", branch = "master" } grandpa = { package = "sc-finality-grandpa", git = "https://github.com/paritytech/substrate", branch = "master" } grandpa_primitives = { package = "sp-finality-grandpa", git = "https://github.com/paritytech/substrate", branch = "master" } diff --git a/node/service/src/lib.rs b/node/service/src/lib.rs index c798d3e9aa..c478e00754 100644 --- a/node/service/src/lib.rs +++ b/node/service/src/lib.rs @@ -34,10 +34,11 @@ use polkadot_subsystem::{ Subsystem, SubsystemContext, SpawnedSubsystem, messages::{CandidateValidationMessage, CandidateBackingMessage}, }; +use sp_trie::PrefixedMemoryDB; pub use service::{ Role, PruningMode, TransactionPoolOptions, Error, RuntimeGenesis, TFullClient, TLightClient, TFullBackend, TLightBackend, TFullCallExecutor, TLightCallExecutor, - Configuration, ChainSpec, ServiceBuilderCommand, ServiceComponents, TaskManager, + Configuration, ChainSpec, ServiceComponents, TaskManager, }; pub use service::config::{DatabaseConfig, PrometheusConfig}; pub use sc_executor::NativeExecutionDispatch; @@ -576,18 +577,25 @@ macro_rules! new_light { } /// Builds a new object suitable for chain operations. -pub fn new_chain_ops(mut config: Configuration) - -> Result, ServiceError> +pub fn new_chain_ops(mut config: Configuration) -> Result< + ( + Arc>, + Arc>, + consensus_common::import_queue::BasicQueue>, + TaskManager, + ), + ServiceError +> where Runtime: ConstructRuntimeApi> + Send + Sync + 'static, Runtime::RuntimeApi: RuntimeApiCollection, Block>>, Dispatch: NativeExecutionDispatch + 'static, Extrinsic: RuntimeExtrinsic, - >::StateBackend: sp_api::StateBackend, { config.keystore = service::config::KeystoreConfig::InMemory; - Ok(new_full_start!(config, Runtime, Dispatch).0) + let (builder, _, _, _) = new_full_start!(config, Runtime, Dispatch); + Ok(builder.to_chain_ops_parts()) } /// Create a new Polkadot service for a full node. diff --git a/parachain/Cargo.toml b/parachain/Cargo.toml index fb1e1ce503..2e0e0efff0 100644 --- a/parachain/Cargo.toml +++ b/parachain/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-parachain" -version = "0.8.13" +version = "0.8.14" authors = ["Parity Technologies "] description = "Types and utilities for creating and working with parachains" edition = "2018" diff --git a/parachain/test-parachains/adder/Cargo.toml b/parachain/test-parachains/adder/Cargo.toml index 2cfb77566d..1ec9e0a119 100644 --- a/parachain/test-parachains/adder/Cargo.toml +++ b/parachain/test-parachains/adder/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "test-parachain-adder" -version = "0.8.13" +version = "0.8.14" authors = ["Parity Technologies "] description = "Test parachain which adds to a number as its state transition" edition = "2018" diff --git a/parachain/test-parachains/adder/collator/src/main.rs b/parachain/test-parachains/adder/collator/src/main.rs index 326549fda7..42c3c82400 100644 --- a/parachain/test-parachains/adder/collator/src/main.rs +++ b/parachain/test-parachains/adder/collator/src/main.rs @@ -28,7 +28,7 @@ use primitives::{ }; use collator::{ParachainContext, Network, BuildParachainContext, Cli, SubstrateCli}; use parking_lot::Mutex; -use futures::future::{Ready, ready, TryFutureExt}; +use futures::future::{Ready, ready, FutureExt}; const GENESIS: AdderHead = AdderHead { number: 0, @@ -135,12 +135,14 @@ fn main() -> Result<(), Box> { let cli = Cli::from_iter(&["-dev"]); let runner = cli.create_runner(&cli.run.base)?; runner.async_run(|config| { - collator::start_collator( + let (future, task_manager) = collator::start_collator( context, id, key, config, - ).map_err(|e| e.into()) + )?; + + Ok((future.map(Ok), task_manager)) })?; Ok(()) diff --git a/parachain/test-parachains/halt/Cargo.toml b/parachain/test-parachains/halt/Cargo.toml index b595b245d0..93e36b4837 100644 --- a/parachain/test-parachains/halt/Cargo.toml +++ b/parachain/test-parachains/halt/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "test-parachain-halt" -version = "0.8.13" +version = "0.8.14" authors = ["Parity Technologies "] description = "Test parachain which executes forever" edition = "2018" diff --git a/primitives/Cargo.toml b/primitives/Cargo.toml index f3bc264c8c..c7eb22b32c 100644 --- a/primitives/Cargo.toml +++ b/primitives/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-primitives" -version = "0.8.13" +version = "0.8.14" authors = ["Parity Technologies "] edition = "2018" diff --git a/rpc/Cargo.toml b/rpc/Cargo.toml index ce2f6382b4..c92b706c0e 100644 --- a/rpc/Cargo.toml +++ b/rpc/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-rpc" -version = "0.8.13" +version = "0.8.14" authors = ["Parity Technologies "] edition = "2018" diff --git a/runtime/common/Cargo.toml b/runtime/common/Cargo.toml index 2b31e989c8..58e20ce9c7 100644 --- a/runtime/common/Cargo.toml +++ b/runtime/common/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-runtime-common" -version = "0.8.13" +version = "0.8.14" authors = ["Parity Technologies "] edition = "2018" diff --git a/runtime/common/src/parachains.rs b/runtime/common/src/parachains.rs index 36c3242c3a..0c353a45f9 100644 --- a/runtime/common/src/parachains.rs +++ b/runtime/common/src/parachains.rs @@ -333,7 +333,7 @@ pub trait Trait: CreateSignedTransaction> + attestations::Trait + ses } /// Origin for the parachains module. -#[derive(PartialEq, Eq, Clone)] +#[derive(PartialEq, Eq, Clone, Encode, Decode)] #[cfg_attr(feature = "std", derive(Debug))] pub enum Origin { /// It comes from a parachain. diff --git a/runtime/kusama/Cargo.toml b/runtime/kusama/Cargo.toml index dbe3934dd3..371d9fc537 100644 --- a/runtime/kusama/Cargo.toml +++ b/runtime/kusama/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "kusama-runtime" -version = "0.8.13" +version = "0.8.14" authors = ["Parity Technologies "] edition = "2018" build = "build.rs" diff --git a/runtime/kusama/src/lib.rs b/runtime/kusama/src/lib.rs index 17a5393758..f9ba963f04 100644 --- a/runtime/kusama/src/lib.rs +++ b/runtime/kusama/src/lib.rs @@ -152,8 +152,10 @@ impl system::Trait for Runtime { impl scheduler::Trait for Runtime { type Event = Event; type Origin = Origin; + type PalletsOrigin = OriginCaller; type Call = Call; type MaximumWeight = MaximumBlockWeight; + type ScheduleOrigin = EnsureRoot; } parameter_types! { @@ -373,6 +375,7 @@ impl democracy::Trait for Runtime { type PreimageByteDeposit = PreimageByteDeposit; type Slash = Treasury; type Scheduler = Scheduler; + type PalletsOrigin = OriginCaller; type MaxVotes = MaxVotes; type OperationalPreimageOrigin = collective::EnsureMember; } @@ -891,8 +894,11 @@ impl proxy::Trait for Runtime { pub struct CustomOnRuntimeUpgrade; impl frame_support::traits::OnRuntimeUpgrade for CustomOnRuntimeUpgrade { fn on_runtime_upgrade() -> frame_support::weights::Weight { - treasury::Module::::migrate_retract_tip_for_tip_new(); - 500_000_000 + if scheduler::Module::::migrate_v1_to_t2() { + ::MaximumBlockWeight::get() + } else { + ::DbWeight::get().reads(1) + 500_000_000 + } } } diff --git a/runtime/polkadot/Cargo.toml b/runtime/polkadot/Cargo.toml index 96ec48d318..9df821f918 100644 --- a/runtime/polkadot/Cargo.toml +++ b/runtime/polkadot/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-runtime" -version = "0.8.13" +version = "0.8.14" authors = ["Parity Technologies "] edition = "2018" build = "build.rs" diff --git a/runtime/polkadot/src/lib.rs b/runtime/polkadot/src/lib.rs index e71d38759c..cd63dfce02 100644 --- a/runtime/polkadot/src/lib.rs +++ b/runtime/polkadot/src/lib.rs @@ -183,8 +183,10 @@ impl system::Trait for Runtime { impl scheduler::Trait for Runtime { type Event = Event; type Origin = Origin; + type PalletsOrigin = OriginCaller; type Call = Call; type MaximumWeight = MaximumBlockWeight; + type ScheduleOrigin = EnsureRoot; } parameter_types! { @@ -442,6 +444,7 @@ impl democracy::Trait for Runtime { type OperationalPreimageOrigin = collective::EnsureMember; type Slash = Treasury; type Scheduler = Scheduler; + type PalletsOrigin = OriginCaller; type MaxVotes = MaxVotes; } @@ -893,6 +896,17 @@ impl proxy::Trait for Runtime { type MaxProxies = MaxProxies; } +pub struct CustomOnRuntimeUpgrade; +impl frame_support::traits::OnRuntimeUpgrade for CustomOnRuntimeUpgrade { + fn on_runtime_upgrade() -> frame_support::weights::Weight { + if scheduler::Module::::migrate_v1_to_t2() { + ::MaximumBlockWeight::get() + } else { + ::DbWeight::get().reads(1) + } + } +} + construct_runtime! { pub enum Runtime where Block = Block, @@ -990,7 +1004,14 @@ pub type UncheckedExtrinsic = generic::UncheckedExtrinsic; /// Executive: handles dispatch to the various modules. -pub type Executive = executive::Executive, Runtime, AllModules>; +pub type Executive = executive::Executive< + Runtime, + Block, + system::ChainContext, + Runtime, + AllModules, + CustomOnRuntimeUpgrade +>; /// The payload being signed in transactions. pub type SignedPayload = generic::SignedPayload; diff --git a/runtime/test-runtime/Cargo.toml b/runtime/test-runtime/Cargo.toml index ba2f0f1a61..e60473158e 100644 --- a/runtime/test-runtime/Cargo.toml +++ b/runtime/test-runtime/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-test-runtime" -version = "0.8.13" +version = "0.8.14" authors = ["Parity Technologies "] edition = "2018" build = "build.rs" diff --git a/runtime/westend/Cargo.toml b/runtime/westend/Cargo.toml index 9e6af55afc..0f00ede723 100644 --- a/runtime/westend/Cargo.toml +++ b/runtime/westend/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "westend-runtime" -version = "0.8.13" +version = "0.8.14" authors = ["Parity Technologies "] edition = "2018" build = "build.rs" diff --git a/runtime/westend/src/constants.rs b/runtime/westend/src/constants.rs index 57250b6d9e..ac25d621d8 100644 --- a/runtime/westend/src/constants.rs +++ b/runtime/westend/src/constants.rs @@ -24,7 +24,7 @@ pub mod currency { pub const MILLICENTS: Balance = CENTS / 1_000; pub const fn deposit(items: u32, bytes: u32) -> Balance { - items as Balance * 20 * DOLLARS + (bytes as Balance) * 100 * MILLICENTS + items as Balance * 1 * DOLLARS + (bytes as Balance) * 5 * MILLICENTS } } diff --git a/runtime/westend/src/lib.rs b/runtime/westend/src/lib.rs index 25d5e22e85..3029c96d6a 100644 --- a/runtime/westend/src/lib.rs +++ b/runtime/westend/src/lib.rs @@ -58,6 +58,7 @@ use im_online::sr25519::AuthorityId as ImOnlineId; use authority_discovery_primitives::AuthorityId as AuthorityDiscoveryId; use transaction_payment_rpc_runtime_api::RuntimeDispatchInfo; use session::historical as session_historical; +use system::EnsureRoot; #[cfg(feature = "std")] pub use staking::StakerStatus; @@ -141,8 +142,10 @@ impl system::Trait for Runtime { impl scheduler::Trait for Runtime { type Event = Event; type Origin = Origin; + type PalletsOrigin = OriginCaller; type Call = Call; type MaximumWeight = MaximumBlockWeight; + type ScheduleOrigin = EnsureRoot; } parameter_types! { @@ -288,7 +291,7 @@ impl staking::Trait for Runtime { type BondingDuration = BondingDuration; type SlashDeferDuration = SlashDeferDuration; // A majority of the council can cancel the slash. - type SlashCancelOrigin = system::EnsureRoot; + type SlashCancelOrigin = EnsureRoot; type SessionInterface = Self; type RewardCurve = RewardCurve; type MaxNominatorRewardedPerValidator = MaxNominatorRewardedPerValidator; diff --git a/service/Cargo.toml b/service/Cargo.toml index 5eb47ec887..6a82aff1e1 100644 --- a/service/Cargo.toml +++ b/service/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-service" -version = "0.8.13" +version = "0.8.14" authors = ["Parity Technologies "] edition = "2018" @@ -31,6 +31,7 @@ sc-chain-spec = { git = "https://github.com/paritytech/substrate", branch = "mas sc-executor = { git = "https://github.com/paritytech/substrate", branch = "master" } sc-consensus = { git = "https://github.com/paritytech/substrate", branch = "master" } sc-network = { git = "https://github.com/paritytech/substrate", branch = "master" } +sp-trie = { git = "https://github.com/paritytech/substrate", branch = "master" } consensus_common = { package = "sp-consensus", git = "https://github.com/paritytech/substrate", branch = "master" } grandpa = { package = "sc-finality-grandpa", git = "https://github.com/paritytech/substrate", branch = "master" } grandpa_primitives = { package = "sp-finality-grandpa", git = "https://github.com/paritytech/substrate", branch = "master" } diff --git a/service/src/lib.rs b/service/src/lib.rs index 5cf371ebec..70d04df630 100644 --- a/service/src/lib.rs +++ b/service/src/lib.rs @@ -29,10 +29,11 @@ use service::{error::Error as ServiceError, ServiceBuilder}; use grandpa::{self, FinalityProofProvider as GrandpaFinalityProofProvider}; use sc_executor::native_executor_instance; use log::info; +use sp_trie::PrefixedMemoryDB; pub use service::{ Role, PruningMode, TransactionPoolOptions, Error, RuntimeGenesis, RpcHandlers, TFullClient, TLightClient, TFullBackend, TLightBackend, TFullCallExecutor, TLightCallExecutor, - Configuration, ChainSpec, ServiceBuilderCommand, ServiceComponents, TaskManager, + Configuration, ChainSpec, ServiceComponents, TaskManager, }; pub use service::config::{DatabaseConfig, PrometheusConfig}; pub use sc_executor::NativeExecutionDispatch; @@ -634,18 +635,25 @@ macro_rules! new_light { } /// Builds a new object suitable for chain operations. -pub fn new_chain_ops(mut config: Configuration) - -> Result, ServiceError> +pub fn new_chain_ops(mut config: Configuration) -> Result< + ( + Arc>, + Arc>, + consensus_common::import_queue::BasicQueue>, + TaskManager, + ), + ServiceError +> where Runtime: ConstructRuntimeApi> + Send + Sync + 'static, Runtime::RuntimeApi: RuntimeApiCollection, Block>>, Dispatch: NativeExecutionDispatch + 'static, Extrinsic: RuntimeExtrinsic, - >::StateBackend: sp_api::StateBackend, { config.keystore = service::config::KeystoreConfig::InMemory; - Ok(new_full_start!(config, Runtime, Dispatch).0) + let (builder, _, _, _) = new_full_start!(config, Runtime, Dispatch); + Ok(builder.to_chain_ops_parts()) } /// Create a new Polkadot service for a full node. diff --git a/statement-table/Cargo.toml b/statement-table/Cargo.toml index 831ae6cd43..18ac58931c 100644 --- a/statement-table/Cargo.toml +++ b/statement-table/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-statement-table" -version = "0.8.13" +version = "0.8.14" authors = ["Parity Technologies "] edition = "2018" diff --git a/validation/Cargo.toml b/validation/Cargo.toml index 42e417fef6..1b0db38d55 100644 --- a/validation/Cargo.toml +++ b/validation/Cargo.toml @@ -1,10 +1,11 @@ [package] name = "polkadot-validation" -version = "0.8.13" +version = "0.8.14" authors = ["Parity Technologies "] edition = "2018" [dependencies] +ansi_term = "0.12.1" futures = "0.3.4" futures-timer = "2.0" parking_lot = "0.9.0" diff --git a/validation/src/validation_service/mod.rs b/validation/src/validation_service/mod.rs index 650950f24e..a67088ff50 100644 --- a/validation/src/validation_service/mod.rs +++ b/validation/src/validation_service/mod.rs @@ -43,6 +43,7 @@ use sp_api::{ProvideRuntimeApi, ApiExt}; use runtime_primitives::traits::HashFor; use availability_store::Store as AvailabilityStore; +use ansi_term::Colour; use log::{warn, error, info, debug, trace}; use super::{Network, Collators, SharedTable, TableRouter}; @@ -373,12 +374,18 @@ impl ParachainValidationInstances where sign_with.as_ref().map(|k| k.public()), )?; - info!( - "Starting parachain attestation session on top of parent {:?}. Local parachain duty is {:?}", - parent_hash, - local_duty, - ); - + if let Some(ref duty) = local_duty { + info!( + "✍️ Starting parachain attestation session (parent: {}) with active duty {}", + parent_hash, + Colour::Red.bold().paint(format!("{:?}", duty)), + ); + } else { + debug!( + "✍️ Starting parachain attestation session (parent: {}). No local duty..", + parent_hash, + ); + } let active_parachains = self.client.runtime_api().active_parachains(&id)?; debug!(target: "validation", "Active parachains: {:?}", active_parachains); -- GitLab From 21f31f78de36c6a36defb0fa0ee0052df35a0d0f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Sat, 4 Jul 2020 02:10:47 +0200 Subject: [PATCH 031/192] Make a collator send a collation as backup as well (#1353) Currently a collator will only send a collation to validators it is a primary for. While testing this could lead to the situation that the same collator was registered as prime for all Parachain validators but failed for other reasons to generate a PoVBlock. However no other collator was sending a collation, which stopped the Parachain until the faulty collator was stopped. This pr solves this problem by making sure that every collator sends a collation to one of his validators he is connected to, but registered as backup. --- Cargo.lock | 1 + network/Cargo.toml | 1 + network/src/legacy/local_collations.rs | 18 +++++++++++++----- 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 22c14cc8b3..61f29625af 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4358,6 +4358,7 @@ dependencies = [ "polkadot-erasure-coding", "polkadot-primitives", "polkadot-validation", + "rand 0.7.3", "sc-network", "sc-network-gossip", "sp-api", diff --git a/network/Cargo.toml b/network/Cargo.toml index 804cdcb3f1..bfee6f3455 100644 --- a/network/Cargo.toml +++ b/network/Cargo.toml @@ -26,6 +26,7 @@ futures-timer = "2.0" sp-blockchain = { git = "https://github.com/paritytech/substrate", branch = "master" } sp-api = { git = "https://github.com/paritytech/substrate", branch = "master" } wasm-timer = "0.2.4" +rand = "0.7.3" [dev-dependencies] sp-keyring = { git = "https://github.com/paritytech/substrate", branch = "master" } diff --git a/network/src/legacy/local_collations.rs b/network/src/legacy/local_collations.rs index f1a6615e88..6bc9b985a7 100644 --- a/network/src/legacy/local_collations.rs +++ b/network/src/legacy/local_collations.rs @@ -24,6 +24,7 @@ use crate::legacy::collator_pool::Role; use std::collections::{HashMap, HashSet}; use std::time::Duration; use wasm_timer::Instant; +use rand::seq::SliceRandom; const LIVE_FOR: Duration = Duration::from_secs(60 * 5); @@ -106,9 +107,7 @@ impl LocalCollations { relay_parent: Hash, targets: HashSet, collation: C - ) - -> impl Iterator + 'a - { + ) -> impl Iterator + 'a { self.local_collations.insert(relay_parent, LocalCollation { targets, collation, @@ -119,8 +118,17 @@ impl LocalCollations { .expect("just inserted to this key; qed"); let borrowed_collation = &local.collation; + + // If we are conected to multiple validators, + // make sure we always send the collation to one of the validators + // we are registered as backup. This ensures that one collator that + // is primary at multiple validators, desn't block the Parachain from progressing. + let mut rng = rand::thread_rng(); + let diff = local.targets.difference(&self.primary_for).collect::>(); + local.targets .intersection(&self.primary_for) + .chain(diff.choose(&mut rng).map(|r| r.clone())) .map(move |k| (k.clone(), borrowed_collation.clone())) } @@ -149,7 +157,7 @@ mod tests { }; let mut tracker = LocalCollations::new(); - assert!(tracker.add_collation(relay_parent, targets, 5).next().is_none()); + assert!(tracker.add_collation(relay_parent, targets, 5).next().is_some()); assert_eq!(tracker.note_validator_role(key, Role::Primary), vec![(relay_parent, 5)]); } @@ -165,7 +173,7 @@ mod tests { }; let mut tracker: LocalCollations = LocalCollations::new(); - assert!(tracker.add_collation(relay_parent, targets, 5).next().is_none()); + assert!(tracker.add_collation(relay_parent, targets, 5).next().is_some()); assert!(tracker.note_validator_role(orig_key.clone(), Role::Primary).is_empty()); assert_eq!(tracker.fresh_key(&orig_key, &new_key), vec![(relay_parent, 5u8)]); } -- GitLab From 78e6e08e9e4524faddad463bbadbaf2c70e47256 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Silva?= <123550+andresilva@users.noreply.github.com> Date: Sat, 4 Jul 2020 14:19:58 +0100 Subject: [PATCH 032/192] babe: enable equivocation reporting on all runtimes (#1330) * enable BABE equivocation reporting on all runtimes * runtime: fix parachains mock test runtime * cargo update -p sp-io Co-authored-by: Shawn Tabrizi --- Cargo.lock | 290 ++++++++++++++++--------------- node/service/src/lib.rs | 10 +- runtime/common/src/parachains.rs | 14 ++ runtime/kusama/src/lib.rs | 40 ++++- runtime/polkadot/src/lib.rs | 40 ++++- runtime/test-runtime/src/lib.rs | 28 +++ runtime/westend/src/lib.rs | 40 ++++- service/src/lib.rs | 10 +- 8 files changed, 329 insertions(+), 143 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 61f29625af..a345a467c6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1261,7 +1261,7 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "fork-tree" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" +source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" dependencies = [ "parity-scale-codec", ] @@ -1269,7 +1269,7 @@ dependencies = [ [[package]] name = "frame-benchmarking" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" +source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" dependencies = [ "frame-support", "frame-system", @@ -1286,7 +1286,7 @@ dependencies = [ [[package]] name = "frame-benchmarking-cli" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" +source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" dependencies = [ "frame-benchmarking", "parity-scale-codec", @@ -1304,7 +1304,7 @@ dependencies = [ [[package]] name = "frame-executive" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" +source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" dependencies = [ "frame-support", "frame-system", @@ -1319,7 +1319,7 @@ dependencies = [ [[package]] name = "frame-metadata" version = "11.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" +source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" dependencies = [ "parity-scale-codec", "serde", @@ -1330,7 +1330,7 @@ dependencies = [ [[package]] name = "frame-support" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" +source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" dependencies = [ "bitmask", "frame-metadata", @@ -1355,7 +1355,7 @@ dependencies = [ [[package]] name = "frame-support-procedural" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" +source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" dependencies = [ "frame-support-procedural-tools", "proc-macro2 1.0.18", @@ -1366,7 +1366,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" +source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" dependencies = [ "frame-support-procedural-tools-derive", "proc-macro-crate", @@ -1378,7 +1378,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools-derive" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" +source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" dependencies = [ "proc-macro2 1.0.18", "quote 1.0.7", @@ -1388,7 +1388,7 @@ dependencies = [ [[package]] name = "frame-system" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" +source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" dependencies = [ "frame-support", "impl-trait-for-tuples", @@ -1404,7 +1404,7 @@ dependencies = [ [[package]] name = "frame-system-benchmarking" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" +source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" dependencies = [ "frame-benchmarking", "frame-support", @@ -1418,7 +1418,7 @@ dependencies = [ [[package]] name = "frame-system-rpc-runtime-api" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" +source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" dependencies = [ "parity-scale-codec", "sp-api", @@ -3375,7 +3375,7 @@ dependencies = [ [[package]] name = "pallet-authority-discovery" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" +source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" dependencies = [ "frame-support", "frame-system", @@ -3391,7 +3391,7 @@ dependencies = [ [[package]] name = "pallet-authorship" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" +source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" dependencies = [ "frame-support", "frame-system", @@ -3406,10 +3406,12 @@ dependencies = [ [[package]] name = "pallet-babe" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" +source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" dependencies = [ + "frame-benchmarking", "frame-support", "frame-system", + "pallet-authorship", "pallet-session", "pallet-timestamp", "parity-scale-codec", @@ -3420,6 +3422,7 @@ dependencies = [ "sp-inherents", "sp-io", "sp-runtime", + "sp-session", "sp-staking", "sp-std", "sp-timestamp", @@ -3428,7 +3431,7 @@ dependencies = [ [[package]] name = "pallet-balances" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" +source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" dependencies = [ "frame-benchmarking", "frame-support", @@ -3442,7 +3445,7 @@ dependencies = [ [[package]] name = "pallet-collective" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" +source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" dependencies = [ "frame-benchmarking", "frame-support", @@ -3458,7 +3461,7 @@ dependencies = [ [[package]] name = "pallet-democracy" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" +source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" dependencies = [ "frame-benchmarking", "frame-support", @@ -3473,7 +3476,7 @@ dependencies = [ [[package]] name = "pallet-elections-phragmen" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" +source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" dependencies = [ "frame-benchmarking", "frame-support", @@ -3488,7 +3491,7 @@ dependencies = [ [[package]] name = "pallet-finality-tracker" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" +source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" dependencies = [ "frame-support", "frame-system", @@ -3504,7 +3507,7 @@ dependencies = [ [[package]] name = "pallet-grandpa" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" +source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" dependencies = [ "frame-support", "frame-system", @@ -3524,7 +3527,7 @@ dependencies = [ [[package]] name = "pallet-identity" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" +source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" dependencies = [ "enumflags2", "frame-benchmarking", @@ -3540,7 +3543,7 @@ dependencies = [ [[package]] name = "pallet-im-online" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" +source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" dependencies = [ "frame-benchmarking", "frame-support", @@ -3560,7 +3563,7 @@ dependencies = [ [[package]] name = "pallet-indices" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" +source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" dependencies = [ "frame-support", "frame-system", @@ -3576,7 +3579,7 @@ dependencies = [ [[package]] name = "pallet-membership" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" +source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" dependencies = [ "frame-support", "frame-system", @@ -3590,7 +3593,7 @@ dependencies = [ [[package]] name = "pallet-multisig" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" +source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" dependencies = [ "frame-support", "frame-system", @@ -3605,7 +3608,7 @@ dependencies = [ [[package]] name = "pallet-nicks" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" +source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" dependencies = [ "frame-support", "frame-system", @@ -3619,7 +3622,7 @@ dependencies = [ [[package]] name = "pallet-offences" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" +source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" dependencies = [ "frame-support", "frame-system", @@ -3634,7 +3637,7 @@ dependencies = [ [[package]] name = "pallet-offences-benchmarking" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" +source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" dependencies = [ "frame-benchmarking", "frame-support", @@ -3655,7 +3658,7 @@ dependencies = [ [[package]] name = "pallet-proxy" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" +source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" dependencies = [ "frame-support", "frame-system", @@ -3670,7 +3673,7 @@ dependencies = [ [[package]] name = "pallet-randomness-collective-flip" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" +source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" dependencies = [ "frame-support", "frame-system", @@ -3683,7 +3686,7 @@ dependencies = [ [[package]] name = "pallet-recovery" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" +source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" dependencies = [ "enumflags2", "frame-support", @@ -3698,7 +3701,7 @@ dependencies = [ [[package]] name = "pallet-scheduler" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" +source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" dependencies = [ "frame-benchmarking", "frame-support", @@ -3713,7 +3716,7 @@ dependencies = [ [[package]] name = "pallet-session" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" +source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" dependencies = [ "frame-support", "frame-system", @@ -3733,21 +3736,23 @@ dependencies = [ [[package]] name = "pallet-session-benchmarking" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" +source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" dependencies = [ "frame-benchmarking", "frame-support", "frame-system", "pallet-session", "pallet-staking", + "rand 0.7.3", "sp-runtime", + "sp-session", "sp-std", ] [[package]] name = "pallet-society" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" +source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" dependencies = [ "frame-support", "frame-system", @@ -3761,7 +3766,7 @@ dependencies = [ [[package]] name = "pallet-staking" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" +source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" dependencies = [ "frame-benchmarking", "frame-support", @@ -3783,7 +3788,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-curve" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" +source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -3794,7 +3799,7 @@ dependencies = [ [[package]] name = "pallet-sudo" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" +source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" dependencies = [ "frame-support", "frame-system", @@ -3808,7 +3813,7 @@ dependencies = [ [[package]] name = "pallet-timestamp" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" +source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" dependencies = [ "frame-benchmarking", "frame-support", @@ -3826,7 +3831,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" +source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" dependencies = [ "frame-support", "frame-system", @@ -3841,7 +3846,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" +source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" dependencies = [ "jsonrpc-core", "jsonrpc-core-client", @@ -3859,7 +3864,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc-runtime-api" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" +source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" dependencies = [ "frame-support", "parity-scale-codec", @@ -3872,7 +3877,7 @@ dependencies = [ [[package]] name = "pallet-treasury" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" +source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" dependencies = [ "frame-benchmarking", "frame-support", @@ -3887,7 +3892,7 @@ dependencies = [ [[package]] name = "pallet-utility" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" +source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" dependencies = [ "frame-benchmarking", "frame-support", @@ -3903,7 +3908,7 @@ dependencies = [ [[package]] name = "pallet-vesting" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" +source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" dependencies = [ "enumflags2", "frame-benchmarking", @@ -5707,7 +5712,7 @@ dependencies = [ [[package]] name = "sc-authority-discovery" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" +source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" dependencies = [ "bytes 0.5.4", "derive_more 0.99.8", @@ -5734,7 +5739,7 @@ dependencies = [ [[package]] name = "sc-basic-authorship" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" +source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -5758,7 +5763,7 @@ dependencies = [ [[package]] name = "sc-block-builder" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" +source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" dependencies = [ "parity-scale-codec", "sc-client-api", @@ -5775,7 +5780,7 @@ dependencies = [ [[package]] name = "sc-chain-spec" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" +source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" dependencies = [ "impl-trait-for-tuples", "sc-chain-spec-derive", @@ -5791,7 +5796,7 @@ dependencies = [ [[package]] name = "sc-chain-spec-derive" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" +source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -5802,7 +5807,7 @@ dependencies = [ [[package]] name = "sc-cli" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" +source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" dependencies = [ "ansi_term 0.12.1", "atty", @@ -5843,7 +5848,7 @@ dependencies = [ [[package]] name = "sc-client-api" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" +source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" dependencies = [ "derive_more 0.99.8", "fnv", @@ -5879,7 +5884,7 @@ dependencies = [ [[package]] name = "sc-client-db" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" +source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" dependencies = [ "blake2-rfc", "hash-db", @@ -5908,7 +5913,7 @@ dependencies = [ [[package]] name = "sc-consensus" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" +source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" dependencies = [ "sc-client-api", "sp-blockchain", @@ -5919,7 +5924,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" +source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" dependencies = [ "derive_more 0.99.8", "fork-tree", @@ -5961,7 +5966,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe-rpc" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" +source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" dependencies = [ "derive_more 0.99.8", "futures 0.3.5", @@ -5985,7 +5990,7 @@ dependencies = [ [[package]] name = "sc-consensus-epochs" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" +source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" dependencies = [ "fork-tree", "parity-scale-codec", @@ -5998,7 +6003,7 @@ dependencies = [ [[package]] name = "sc-consensus-slots" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" +source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6011,6 +6016,7 @@ dependencies = [ "sp-application-crypto", "sp-blockchain", "sp-consensus", + "sp-consensus-slots", "sp-core", "sp-inherents", "sp-runtime", @@ -6020,7 +6026,7 @@ dependencies = [ [[package]] name = "sc-consensus-uncles" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" +source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" dependencies = [ "log 0.4.8", "sc-client-api", @@ -6034,7 +6040,7 @@ dependencies = [ [[package]] name = "sc-executor" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" +source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" dependencies = [ "derive_more 0.99.8", "lazy_static", @@ -6062,7 +6068,7 @@ dependencies = [ [[package]] name = "sc-executor-common" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" +source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" dependencies = [ "derive_more 0.99.8", "log 0.4.8", @@ -6079,7 +6085,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmi" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" +source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" dependencies = [ "log 0.4.8", "parity-scale-codec", @@ -6094,7 +6100,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmtime" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" +source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" dependencies = [ "cranelift-codegen", "cranelift-wasm", @@ -6115,7 +6121,7 @@ dependencies = [ [[package]] name = "sc-finality-grandpa" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" +source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" dependencies = [ "assert_matches", "derive_more 0.99.8", @@ -6153,7 +6159,7 @@ dependencies = [ [[package]] name = "sc-finality-grandpa-rpc" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" +source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" dependencies = [ "derive_more 0.99.8", "finality-grandpa", @@ -6170,7 +6176,7 @@ dependencies = [ [[package]] name = "sc-informant" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" +source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" dependencies = [ "ansi_term 0.12.1", "futures 0.3.5", @@ -6189,7 +6195,7 @@ dependencies = [ [[package]] name = "sc-keystore" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" +source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" dependencies = [ "derive_more 0.99.8", "hex", @@ -6205,7 +6211,7 @@ dependencies = [ [[package]] name = "sc-light" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" +source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" dependencies = [ "hash-db", "lazy_static", @@ -6224,7 +6230,7 @@ dependencies = [ [[package]] name = "sc-network" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" +source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" dependencies = [ "bitflags", "bs58", @@ -6276,7 +6282,7 @@ dependencies = [ [[package]] name = "sc-network-gossip" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" +source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6291,7 +6297,7 @@ dependencies = [ [[package]] name = "sc-network-test" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" +source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" dependencies = [ "env_logger", "futures 0.3.5", @@ -6318,7 +6324,7 @@ dependencies = [ [[package]] name = "sc-offchain" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" +source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" dependencies = [ "bytes 0.5.4", "fnv", @@ -6345,7 +6351,7 @@ dependencies = [ [[package]] name = "sc-peerset" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" +source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" dependencies = [ "futures 0.3.5", "libp2p", @@ -6358,7 +6364,7 @@ dependencies = [ [[package]] name = "sc-proposer-metrics" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" +source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" dependencies = [ "log 0.4.8", "substrate-prometheus-endpoint", @@ -6367,7 +6373,7 @@ dependencies = [ [[package]] name = "sc-rpc" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" +source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" dependencies = [ "futures 0.3.5", "hash-db", @@ -6399,7 +6405,7 @@ dependencies = [ [[package]] name = "sc-rpc-api" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" +source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" dependencies = [ "derive_more 0.99.8", "futures 0.3.5", @@ -6423,7 +6429,7 @@ dependencies = [ [[package]] name = "sc-rpc-server" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" +source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" dependencies = [ "jsonrpc-core", "jsonrpc-http-server", @@ -6439,7 +6445,7 @@ dependencies = [ [[package]] name = "sc-service" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" +source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" dependencies = [ "derive_more 0.99.8", "directories", @@ -6502,7 +6508,7 @@ dependencies = [ [[package]] name = "sc-state-db" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" +source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" dependencies = [ "log 0.4.8", "parity-scale-codec", @@ -6516,7 +6522,7 @@ dependencies = [ [[package]] name = "sc-telemetry" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" +source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6537,7 +6543,7 @@ dependencies = [ [[package]] name = "sc-tracing" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" +source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" dependencies = [ "erased-serde", "log 0.4.8", @@ -6554,7 +6560,7 @@ dependencies = [ [[package]] name = "sc-transaction-graph" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" +source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" dependencies = [ "derive_more 0.99.8", "futures 0.3.5", @@ -6574,7 +6580,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" +source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" dependencies = [ "derive_more 0.99.8", "futures 0.3.5", @@ -6960,7 +6966,7 @@ dependencies = [ [[package]] name = "sp-allocator" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" +source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" dependencies = [ "derive_more 0.99.8", "log 0.4.8", @@ -6972,7 +6978,7 @@ dependencies = [ [[package]] name = "sp-api" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" +source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" dependencies = [ "hash-db", "parity-scale-codec", @@ -6987,7 +6993,7 @@ dependencies = [ [[package]] name = "sp-api-proc-macro" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" +source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" dependencies = [ "blake2-rfc", "proc-macro-crate", @@ -6999,7 +7005,7 @@ dependencies = [ [[package]] name = "sp-application-crypto" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" +source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" dependencies = [ "parity-scale-codec", "serde", @@ -7011,7 +7017,7 @@ dependencies = [ [[package]] name = "sp-arithmetic" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" +source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" dependencies = [ "integer-sqrt", "num-traits 0.2.12", @@ -7024,7 +7030,7 @@ dependencies = [ [[package]] name = "sp-authority-discovery" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" +source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" dependencies = [ "parity-scale-codec", "sp-api", @@ -7036,7 +7042,7 @@ dependencies = [ [[package]] name = "sp-authorship" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" +source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" dependencies = [ "parity-scale-codec", "sp-inherents", @@ -7047,7 +7053,7 @@ dependencies = [ [[package]] name = "sp-block-builder" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" +source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" dependencies = [ "parity-scale-codec", "sp-api", @@ -7059,7 +7065,7 @@ dependencies = [ [[package]] name = "sp-blockchain" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" +source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" dependencies = [ "derive_more 0.99.8", "log 0.4.8", @@ -7075,7 +7081,7 @@ dependencies = [ [[package]] name = "sp-chain-spec" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" +source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" dependencies = [ "serde", "serde_json", @@ -7084,7 +7090,7 @@ dependencies = [ [[package]] name = "sp-consensus" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" +source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" dependencies = [ "derive_more 0.99.8", "futures 0.3.5", @@ -7108,7 +7114,7 @@ dependencies = [ [[package]] name = "sp-consensus-aura" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" +source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" dependencies = [ "parity-scale-codec", "sp-api", @@ -7122,13 +7128,14 @@ dependencies = [ [[package]] name = "sp-consensus-babe" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" +source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" dependencies = [ "merlin", "parity-scale-codec", "sp-api", "sp-application-crypto", "sp-consensus", + "sp-consensus-slots", "sp-consensus-vrf", "sp-core", "sp-inherents", @@ -7137,10 +7144,19 @@ dependencies = [ "sp-timestamp", ] +[[package]] +name = "sp-consensus-slots" +version = "0.8.0-rc4" +source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +dependencies = [ + "parity-scale-codec", + "sp-runtime", +] + [[package]] name = "sp-consensus-vrf" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" +source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" dependencies = [ "parity-scale-codec", "schnorrkel", @@ -7152,7 +7168,7 @@ dependencies = [ [[package]] name = "sp-core" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" +source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" dependencies = [ "base58", "blake2-rfc", @@ -7195,7 +7211,7 @@ dependencies = [ [[package]] name = "sp-database" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" +source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" dependencies = [ "kvdb", "parking_lot 0.10.2", @@ -7204,7 +7220,7 @@ dependencies = [ [[package]] name = "sp-debug-derive" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" +source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" dependencies = [ "proc-macro2 1.0.18", "quote 1.0.7", @@ -7214,7 +7230,7 @@ dependencies = [ [[package]] name = "sp-externalities" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" +source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" dependencies = [ "environmental", "parity-scale-codec", @@ -7225,7 +7241,7 @@ dependencies = [ [[package]] name = "sp-finality-grandpa" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" +source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" dependencies = [ "finality-grandpa", "log 0.4.8", @@ -7241,7 +7257,7 @@ dependencies = [ [[package]] name = "sp-finality-tracker" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" +source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" dependencies = [ "parity-scale-codec", "sp-inherents", @@ -7251,7 +7267,7 @@ dependencies = [ [[package]] name = "sp-inherents" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" +source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" dependencies = [ "derive_more 0.99.8", "parity-scale-codec", @@ -7263,7 +7279,7 @@ dependencies = [ [[package]] name = "sp-io" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" +source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" dependencies = [ "futures 0.3.5", "hash-db", @@ -7284,7 +7300,7 @@ dependencies = [ [[package]] name = "sp-keyring" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" +source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" dependencies = [ "lazy_static", "sp-core", @@ -7295,7 +7311,7 @@ dependencies = [ [[package]] name = "sp-npos-elections" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" +source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" dependencies = [ "parity-scale-codec", "serde", @@ -7307,7 +7323,7 @@ dependencies = [ [[package]] name = "sp-npos-elections-compact" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" +source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -7318,7 +7334,7 @@ dependencies = [ [[package]] name = "sp-offchain" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" +source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" dependencies = [ "sp-api", "sp-core", @@ -7328,7 +7344,7 @@ dependencies = [ [[package]] name = "sp-panic-handler" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" +source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" dependencies = [ "backtrace", "log 0.4.8", @@ -7337,7 +7353,7 @@ dependencies = [ [[package]] name = "sp-rpc" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" +source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" dependencies = [ "serde", "sp-core", @@ -7346,7 +7362,7 @@ dependencies = [ [[package]] name = "sp-runtime" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" +source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" dependencies = [ "either", "hash256-std-hasher", @@ -7368,7 +7384,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" +source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" dependencies = [ "parity-scale-codec", "primitive-types", @@ -7383,7 +7399,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" +source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" dependencies = [ "Inflector", "proc-macro-crate", @@ -7395,7 +7411,7 @@ dependencies = [ [[package]] name = "sp-serializer" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" +source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" dependencies = [ "serde", "serde_json", @@ -7404,7 +7420,7 @@ dependencies = [ [[package]] name = "sp-session" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" +source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" dependencies = [ "parity-scale-codec", "sp-api", @@ -7417,7 +7433,7 @@ dependencies = [ [[package]] name = "sp-staking" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" +source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" dependencies = [ "parity-scale-codec", "sp-runtime", @@ -7427,7 +7443,7 @@ dependencies = [ [[package]] name = "sp-state-machine" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" +source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" dependencies = [ "hash-db", "itertools 0.9.0", @@ -7448,12 +7464,12 @@ dependencies = [ [[package]] name = "sp-std" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" +source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" [[package]] name = "sp-storage" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" +source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" dependencies = [ "impl-serde 0.2.3", "ref-cast", @@ -7465,7 +7481,7 @@ dependencies = [ [[package]] name = "sp-timestamp" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" +source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -7479,7 +7495,7 @@ dependencies = [ [[package]] name = "sp-tracing" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" +source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" dependencies = [ "log 0.4.8", "rental", @@ -7489,7 +7505,7 @@ dependencies = [ [[package]] name = "sp-transaction-pool" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" +source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" dependencies = [ "derive_more 0.99.8", "futures 0.3.5", @@ -7505,7 +7521,7 @@ dependencies = [ [[package]] name = "sp-trie" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" +source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" dependencies = [ "hash-db", "memory-db", @@ -7519,7 +7535,7 @@ dependencies = [ [[package]] name = "sp-utils" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" +source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" dependencies = [ "futures 0.3.5", "futures-core", @@ -7531,7 +7547,7 @@ dependencies = [ [[package]] name = "sp-version" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" +source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" dependencies = [ "impl-serde 0.2.3", "parity-scale-codec", @@ -7543,7 +7559,7 @@ dependencies = [ [[package]] name = "sp-wasm-interface" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" +source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -7683,7 +7699,7 @@ dependencies = [ [[package]] name = "substrate-browser-utils" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" +source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" dependencies = [ "chrono", "clear_on_drop", @@ -7710,7 +7726,7 @@ dependencies = [ [[package]] name = "substrate-build-script-utils" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" +source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" dependencies = [ "platforms", ] @@ -7718,7 +7734,7 @@ dependencies = [ [[package]] name = "substrate-frame-rpc-system" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" +source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" dependencies = [ "frame-system-rpc-runtime-api", "futures 0.3.5", @@ -7741,7 +7757,7 @@ dependencies = [ [[package]] name = "substrate-prometheus-endpoint" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" +source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" dependencies = [ "async-std", "derive_more 0.99.8", @@ -7755,10 +7771,12 @@ dependencies = [ [[package]] name = "substrate-test-client" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" +source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" dependencies = [ + "futures 0.1.29", "futures 0.3.5", "hash-db", + "hex", "parity-scale-codec", "sc-client-api", "sc-client-db", @@ -7777,7 +7795,7 @@ dependencies = [ [[package]] name = "substrate-test-runtime" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" +source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" dependencies = [ "cfg-if", "frame-executive", @@ -7817,7 +7835,7 @@ dependencies = [ [[package]] name = "substrate-test-runtime-client" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" +source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" dependencies = [ "futures 0.3.5", "parity-scale-codec", @@ -7838,7 +7856,7 @@ dependencies = [ [[package]] name = "substrate-wasm-builder-runner" version = "1.0.6" -source = "git+https://github.com/paritytech/substrate#cf2367f6d9a75feafe78f621f13ca60c75da9fc5" +source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" [[package]] name = "substrate-wasm-builder-runner" diff --git a/node/service/src/lib.rs b/node/service/src/lib.rs index c478e00754..69cdc1b229 100644 --- a/node/service/src/lib.rs +++ b/node/service/src/lib.rs @@ -196,7 +196,7 @@ macro_rules! new_full_start { grandpa::block_import_with_authority_set_hard_forks( client.clone(), &(client.clone() as Arc<_>), - select_chain, + select_chain.clone(), grandpa_hard_forks, )?; @@ -214,6 +214,7 @@ macro_rules! new_full_start { Some(Box::new(justification_import)), None, client, + select_chain, inherent_data_providers.clone(), spawn_task_handle, registry, @@ -517,14 +518,18 @@ macro_rules! new_light { client, backend, fetcher, - _select_chain, + mut select_chain, _, spawn_task_handle, registry, | { + let select_chain = select_chain.take() + .ok_or_else(|| service::Error::SelectChainRequired)?; + let fetch_checker = fetcher .map(|fetcher| fetcher.checker().clone()) .ok_or_else(|| "Trying to start light import queue without active fetch checker")?; + let grandpa_block_import = grandpa::light_block_import( client.clone(), backend, &(client.clone() as Arc<_>), Arc::new(fetch_checker) )?; @@ -546,6 +551,7 @@ macro_rules! new_light { None, Some(Box::new(finality_proof_import)), client, + select_chain, inherent_data_providers.clone(), spawn_task_handle, registry, diff --git a/runtime/common/src/parachains.rs b/runtime/common/src/parachains.rs index 0c353a45f9..819ce685cc 100644 --- a/runtime/common/src/parachains.rs +++ b/runtime/common/src/parachains.rs @@ -1834,6 +1834,20 @@ mod tests { // session module is the trigger type EpochChangeTrigger = babe::ExternalTrigger; + + type KeyOwnerProofSystem = (); + + type KeyOwnerProof = >::Proof; + + type KeyOwnerIdentification = >::IdentificationTuple; + + type HandleEquivocation = (); } parameter_types! { diff --git a/runtime/kusama/src/lib.rs b/runtime/kusama/src/lib.rs index f9ba963f04..7163fd869c 100644 --- a/runtime/kusama/src/lib.rs +++ b/runtime/kusama/src/lib.rs @@ -169,6 +169,21 @@ impl babe::Trait for Runtime { // session module is the trigger type EpochChangeTrigger = babe::ExternalTrigger; + + type KeyOwnerProofSystem = Historical; + + type KeyOwnerProof = >::Proof; + + type KeyOwnerIdentification = >::IdentificationTuple; + + type HandleEquivocation = + babe::EquivocationHandler; } parameter_types! { @@ -913,7 +928,7 @@ construct_runtime! { RandomnessCollectiveFlip: randomness_collective_flip::{Module, Storage}, // Must be before session. - Babe: babe::{Module, Call, Storage, Config, Inherent(Timestamp)}, + Babe: babe::{Module, Call, Storage, Config, Inherent(Timestamp), ValidateUnsigned}, Timestamp: timestamp::{Module, Call, Storage, Inherent}, Indices: indices::{Module, Call, Storage, Config, Event}, @@ -1170,6 +1185,29 @@ sp_api::impl_runtime_apis! { fn current_epoch_start() -> babe_primitives::SlotNumber { Babe::current_epoch_start() } + + fn generate_key_ownership_proof( + _slot_number: babe_primitives::SlotNumber, + authority_id: babe_primitives::AuthorityId, + ) -> Option { + use codec::Encode; + + Historical::prove((babe_primitives::KEY_TYPE, authority_id)) + .map(|p| p.encode()) + .map(babe_primitives::OpaqueKeyOwnershipProof::new) + } + + fn submit_report_equivocation_unsigned_extrinsic( + equivocation_proof: babe_primitives::EquivocationProof<::Header>, + key_owner_proof: babe_primitives::OpaqueKeyOwnershipProof, + ) -> Option<()> { + let key_owner_proof = key_owner_proof.decode()?; + + Babe::submit_unsigned_equivocation_report( + equivocation_proof, + key_owner_proof, + ) + } } impl authority_discovery_primitives::AuthorityDiscoveryApi for Runtime { diff --git a/runtime/polkadot/src/lib.rs b/runtime/polkadot/src/lib.rs index cd63dfce02..b84734726b 100644 --- a/runtime/polkadot/src/lib.rs +++ b/runtime/polkadot/src/lib.rs @@ -200,6 +200,21 @@ impl babe::Trait for Runtime { // session module is the trigger type EpochChangeTrigger = babe::ExternalTrigger; + + type KeyOwnerProofSystem = Historical; + + type KeyOwnerProof = >::Proof; + + type KeyOwnerIdentification = >::IdentificationTuple; + + type HandleEquivocation = + babe::EquivocationHandler; } parameter_types! { @@ -919,7 +934,7 @@ construct_runtime! { Scheduler: scheduler::{Module, Call, Storage, Event}, // Must be before session. - Babe: babe::{Module, Call, Storage, Config, Inherent(Timestamp)}, + Babe: babe::{Module, Call, Storage, Config, Inherent(Timestamp), ValidateUnsigned}, Timestamp: timestamp::{Module, Call, Storage, Inherent}, Indices: indices::{Module, Call, Storage, Config, Event}, @@ -1171,6 +1186,29 @@ sp_api::impl_runtime_apis! { fn current_epoch_start() -> babe_primitives::SlotNumber { Babe::current_epoch_start() } + + fn generate_key_ownership_proof( + _slot_number: babe_primitives::SlotNumber, + authority_id: babe_primitives::AuthorityId, + ) -> Option { + use codec::Encode; + + Historical::prove((babe_primitives::KEY_TYPE, authority_id)) + .map(|p| p.encode()) + .map(babe_primitives::OpaqueKeyOwnershipProof::new) + } + + fn submit_report_equivocation_unsigned_extrinsic( + equivocation_proof: babe_primitives::EquivocationProof<::Header>, + key_owner_proof: babe_primitives::OpaqueKeyOwnershipProof, + ) -> Option<()> { + let key_owner_proof = key_owner_proof.decode()?; + + Babe::submit_unsigned_equivocation_report( + equivocation_proof, + key_owner_proof, + ) + } } impl authority_discovery_primitives::AuthorityDiscoveryApi for Runtime { diff --git a/runtime/test-runtime/src/lib.rs b/runtime/test-runtime/src/lib.rs index 84bf487382..bd3e6459f5 100644 --- a/runtime/test-runtime/src/lib.rs +++ b/runtime/test-runtime/src/lib.rs @@ -175,6 +175,20 @@ impl babe::Trait for Runtime { // session module is the trigger type EpochChangeTrigger = babe::ExternalTrigger; + + type KeyOwnerProofSystem = (); + + type KeyOwnerProof = >::Proof; + + type KeyOwnerIdentification = >::IdentificationTuple; + + type HandleEquivocation = (); } parameter_types! { @@ -704,6 +718,20 @@ sp_api::impl_runtime_apis! { fn current_epoch_start() -> babe_primitives::SlotNumber { Babe::current_epoch_start() } + + fn generate_key_ownership_proof( + _slot_number: babe_primitives::SlotNumber, + _authority_id: babe_primitives::AuthorityId, + ) -> Option { + None + } + + fn submit_report_equivocation_unsigned_extrinsic( + _equivocation_proof: babe_primitives::EquivocationProof<::Header>, + _key_owner_proof: babe_primitives::OpaqueKeyOwnershipProof, + ) -> Option<()> { + None + } } impl sp_session::SessionKeys for Runtime { diff --git a/runtime/westend/src/lib.rs b/runtime/westend/src/lib.rs index 3029c96d6a..14793d0d6c 100644 --- a/runtime/westend/src/lib.rs +++ b/runtime/westend/src/lib.rs @@ -159,6 +159,21 @@ impl babe::Trait for Runtime { // session module is the trigger type EpochChangeTrigger = babe::ExternalTrigger; + + type KeyOwnerProofSystem = Historical; + + type KeyOwnerProof = >::Proof; + + type KeyOwnerIdentification = >::IdentificationTuple; + + type HandleEquivocation = + babe::EquivocationHandler; } parameter_types! { @@ -677,7 +692,7 @@ construct_runtime! { RandomnessCollectiveFlip: randomness_collective_flip::{Module, Storage}, // Must be before session. - Babe: babe::{Module, Call, Storage, Config, Inherent(Timestamp)}, + Babe: babe::{Module, Call, Storage, Config, Inherent(Timestamp), ValidateUnsigned}, Timestamp: timestamp::{Module, Call, Storage, Inherent}, Indices: indices::{Module, Call, Storage, Config, Event}, @@ -915,6 +930,29 @@ sp_api::impl_runtime_apis! { fn current_epoch_start() -> babe_primitives::SlotNumber { Babe::current_epoch_start() } + + fn generate_key_ownership_proof( + _slot_number: babe_primitives::SlotNumber, + authority_id: babe_primitives::AuthorityId, + ) -> Option { + use codec::Encode; + + Historical::prove((babe_primitives::KEY_TYPE, authority_id)) + .map(|p| p.encode()) + .map(babe_primitives::OpaqueKeyOwnershipProof::new) + } + + fn submit_report_equivocation_unsigned_extrinsic( + equivocation_proof: babe_primitives::EquivocationProof<::Header>, + key_owner_proof: babe_primitives::OpaqueKeyOwnershipProof, + ) -> Option<()> { + let key_owner_proof = key_owner_proof.decode()?; + + Babe::submit_unsigned_equivocation_report( + equivocation_proof, + key_owner_proof, + ) + } } impl authority_discovery_primitives::AuthorityDiscoveryApi for Runtime { diff --git a/service/src/lib.rs b/service/src/lib.rs index 70d04df630..c7f2bd8b82 100644 --- a/service/src/lib.rs +++ b/service/src/lib.rs @@ -192,7 +192,7 @@ macro_rules! new_full_start { grandpa::block_import_with_authority_set_hard_forks( client.clone(), &(client.clone() as Arc<_>), - select_chain, + select_chain.clone(), grandpa_hard_forks, )?; @@ -210,6 +210,7 @@ macro_rules! new_full_start { Some(Box::new(justification_import)), None, client, + select_chain, inherent_data_providers.clone(), spawn_task_handle, registry, @@ -573,14 +574,18 @@ macro_rules! new_light { client, backend, fetcher, - _select_chain, + mut select_chain, _, spawn_task_handle, registry, | { + let select_chain = select_chain.take() + .ok_or_else(|| service::Error::SelectChainRequired)?; + let fetch_checker = fetcher .map(|fetcher| fetcher.checker().clone()) .ok_or_else(|| "Trying to start light import queue without active fetch checker")?; + let grandpa_block_import = grandpa::light_block_import( client.clone(), backend, &(client.clone() as Arc<_>), Arc::new(fetch_checker) )?; @@ -602,6 +607,7 @@ macro_rules! new_light { None, Some(Box::new(finality_proof_import)), client, + select_chain, inherent_data_providers.clone(), spawn_task_handle, registry, -- GitLab From 69ce9ff36417873af70a5569407dbce19097fe0c Mon Sep 17 00:00:00 2001 From: Peter Goodspeed-Niklaus Date: Sun, 5 Jul 2020 19:22:52 +0200 Subject: [PATCH 033/192] implement custom proposer (#1320) * network bridge skeleton * move some primitives around and add debug impls * protocol registration glue & abstract network interface * add send_msgs to subsystemctx * select logic * transform different events into actions and handle * implement remaining network bridge state machine * start test skeleton * make network methods asynchronous * extract subsystem out to subsystem crate * port over overseer to subsystem context trait * fix minimal example * fix overseer doc test * update network-bridge crate * write a subsystem test-helpers crate * write a network test helper for network-bridge * set up (broken) view test * Revamp network to be more async-friendly and not require Sync * fix spacing * fix test compilation * insert side-channel for actions * Add some more message types to AllMessages * introduce a test harness * impl ProvideInherent for InclusionInherent * reduce import churn; correct expect message * move inclusion inherent identifier into primitives It's not clear precisely why this is desired, but it's a pattern I've seen in several places, so I'm going this to be on the safe side. Worst case, we can revert this commit pretty easily. * bump kusama spec_version to placate CI * copy sc_basic_authorship::{ProposerFactory, Proposer} We have from the problem description: > This Proposer will require an OverseerHandle to make requests via. That's next on the plate. * use polkadot custom proposer instead of basic-authorship one * add some tests * ensure service compiles and passes tests * fix typo * fix service-new compilation * Subsystem test helpers send messages synchronously * remove smelly action inspector * remove superfluous let binding * fix warnings * add license header * empty commit; maybe github will notice the one with changes * Update node/network/bridge/src/lib.rs Co-authored-by: Peter Goodspeed-Niklaus * add sanity check to only include valid inherents * stub: encapsulate block production mechanics instead of copying them The goal is to end up with something like what's in validation::block_production::*, which encapsulates basic block production mechanics. This is a better idea than just straight-up copying those mechanics. * partial implementation of propose fn Doesn't actually compile yet; need to bring in some other commits to ensure ProvisionerMessage is a thing, and also figure out how to get the block hash given the current context. * fix compilation * clear a few more compile errors * finish fn propose * broken: add timeout to proposal * add timeout to proposal * guide: provisioner is responsible for selecting parachain candidates * implement ProvisionerMessage::RequestInherentData & update fn propose * impl CreateProposer::init; clean up * impl std::error::Error for Error * document error-handling rationale * cause polkadot-service-new to compile correctly * Move potentially-blocking call from fn init -> fn propose This means that we can wrap the delayed call into the same timeout check used elsewhere. * document struct Proposer * extract provisioner data fetch This satisfies two requirements: - only applies the timeout to actually fetching the provisioner data, not to constructing the block after - simplifies the problem of injecting default data if we could not get the real provisioner data in time. Co-authored-by: Robert Habermeier Co-authored-by: Gavin Wood --- Cargo.lock | 28 +- Cargo.toml | 1 + node/core/proposer/Cargo.toml | 27 ++ node/core/proposer/src/lib.rs | 262 ++++++++++++++++++ node/service/Cargo.toml | 2 +- node/service/src/lib.rs | 7 +- node/subsystem/src/messages.rs | 13 +- primitives/src/parachain.rs | 2 +- .../src/node/utility/provisioner.md | 6 + .../src/types/overseer-protocol.md | 11 + 10 files changed, 352 insertions(+), 7 deletions(-) create mode 100644 node/core/proposer/Cargo.toml create mode 100644 node/core/proposer/src/lib.rs diff --git a/Cargo.lock b/Cargo.lock index a345a467c6..35c9415c5a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4415,6 +4415,32 @@ dependencies = [ "sp-runtime", ] +[[package]] +name = "polkadot-node-core-proposer" +version = "0.1.0" +dependencies = [ + "futures 0.3.5", + "futures-timer 3.0.2", + "log 0.4.8", + "parity-scale-codec", + "polkadot-node-subsystem", + "polkadot-overseer", + "polkadot-primitives", + "sc-basic-authorship", + "sc-block-builder", + "sc-client-api", + "sc-telemetry", + "sp-api", + "sp-blockchain", + "sp-consensus", + "sp-core", + "sp-inherents", + "sp-runtime", + "sp-transaction-pool", + "tokio-executor 0.2.0-alpha.6", + "wasm-timer", +] + [[package]] name = "polkadot-node-primitives" version = "0.1.0" @@ -4762,6 +4788,7 @@ dependencies = [ "parity-scale-codec", "parking_lot 0.9.0", "polkadot-network", + "polkadot-node-core-proposer", "polkadot-node-subsystem", "polkadot-overseer", "polkadot-primitives", @@ -4769,7 +4796,6 @@ dependencies = [ "polkadot-runtime", "polkadot-test-runtime-client", "sc-authority-discovery", - "sc-basic-authorship", "sc-block-builder", "sc-chain-spec", "sc-client-api", diff --git a/Cargo.toml b/Cargo.toml index 2723f0fa79..5bf037cfc8 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -43,6 +43,7 @@ members = [ "service", "validation", + "node/core/proposer", "node/network/bridge", "node/overseer", "node/primitives", diff --git a/node/core/proposer/Cargo.toml b/node/core/proposer/Cargo.toml new file mode 100644 index 0000000000..3723b80bfe --- /dev/null +++ b/node/core/proposer/Cargo.toml @@ -0,0 +1,27 @@ +[package] +name = "polkadot-node-core-proposer" +version = "0.1.0" +authors = ["Parity Technologies "] +edition = "2018" + +[dependencies] +futures = "0.3.4" +futures-timer = "3.0.1" +log = "0.4.8" +parity-scale-codec = "1.3.0" +polkadot-node-subsystem = { path = "../../subsystem" } +polkadot-overseer = { path = "../../overseer" } +polkadot-primitives = { path = "../../../primitives" } +sc-basic-authorship = { git = "https://github.com/paritytech/substrate", branch = "master" } +sc-block-builder = { git = "https://github.com/paritytech/substrate", branch = "master" } +sc-client-api = { git = "https://github.com/paritytech/substrate", branch = "master" } +sc-telemetry = { git = "https://github.com/paritytech/substrate", branch = "master" } +sp-api = { git = "https://github.com/paritytech/substrate", branch = "master" } +sp-blockchain = { git = "https://github.com/paritytech/substrate", branch = "master" } +sp-consensus = { git = "https://github.com/paritytech/substrate", branch = "master" } +sp-core = { git = "https://github.com/paritytech/substrate", branch = "master" } +sp-inherents = { git = "https://github.com/paritytech/substrate", branch = "master" } +sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "master" } +sp-transaction-pool = { git = "https://github.com/paritytech/substrate", branch = "master" } +tokio-executor = { version = "0.2.0-alpha.6", features = ["blocking"] } +wasm-timer = "0.2.4" diff --git a/node/core/proposer/src/lib.rs b/node/core/proposer/src/lib.rs new file mode 100644 index 0000000000..b53ac5729f --- /dev/null +++ b/node/core/proposer/src/lib.rs @@ -0,0 +1,262 @@ +use futures::prelude::*; +use futures::select; +use polkadot_node_subsystem::{messages::{AllMessages, ProvisionerInherentData, ProvisionerMessage}, SubsystemError}; +use polkadot_overseer::OverseerHandler; +use polkadot_primitives::{ + inclusion_inherent, + parachain::ParachainHost, + Block, Hash, Header, +}; +use sc_block_builder::{BlockBuilderApi, BlockBuilderProvider}; +use sp_api::{ApiExt, ProvideRuntimeApi}; +use sp_blockchain::HeaderBackend; +use sp_consensus::{Proposal, RecordProof}; +use sp_inherents::InherentData; +use sp_runtime::traits::{DigestFor, HashFor}; +use sp_transaction_pool::TransactionPool; +use std::{fmt, pin::Pin, sync::Arc, time}; + +/// How long proposal can take before we give up and err out +const PROPOSE_TIMEOUT: core::time::Duration = core::time::Duration::from_secs(2); + +/// Custom Proposer factory for Polkadot +pub struct ProposerFactory { + inner: sc_basic_authorship::ProposerFactory, + overseer: OverseerHandler, +} + +impl ProposerFactory { + pub fn new( + client: Arc, + transaction_pool: Arc, + overseer: OverseerHandler, + ) -> Self { + ProposerFactory { + inner: sc_basic_authorship::ProposerFactory::new( + client, + transaction_pool, + None, + ), + overseer, + } + } +} + +impl sp_consensus::Environment + for ProposerFactory +where + TxPool: 'static + TransactionPool, + Client: 'static + + BlockBuilderProvider + + ProvideRuntimeApi + + HeaderBackend + + Send + + Sync, + Client::Api: + ParachainHost + BlockBuilderApi + ApiExt, + Backend: + 'static + sc_client_api::Backend>, + // Rust bug: https://github.com/rust-lang/rust/issues/24159 + sp_api::StateBackendFor: sp_api::StateBackend> + Send, +{ + type CreateProposer = Pin> + Send + 'static, + >>; + type Proposer = Proposer; + type Error = Error; + + fn init(&mut self, parent_header: &Header) -> Self::CreateProposer { + // create the inner proposer + let proposer = self.inner.init(parent_header).into_inner(); + + // data to be moved into the future + let overseer = self.overseer.clone(); + let parent_header_hash = parent_header.hash(); + + async move { + Ok(Proposer { + inner: proposer?, + overseer, + parent_header_hash, + }) + }.boxed() + } +} + +/// Custom Proposer for Polkadot. +/// +/// This proposer gets the ProvisionerInherentData and injects it into the wrapped +/// proposer's inherent data, then delegates the actual proposal generation. +pub struct Proposer, Backend, Client> { + inner: sc_basic_authorship::Proposer, + overseer: OverseerHandler, + parent_header_hash: Hash, +} + +// This impl has the same generic bounds as the Proposer impl. +impl Proposer +where + TxPool: 'static + TransactionPool, + Client: 'static + + BlockBuilderProvider + + ProvideRuntimeApi + + HeaderBackend + + Send + + Sync, + Client::Api: + ParachainHost + BlockBuilderApi + ApiExt, + Backend: + 'static + sc_client_api::Backend>, + // Rust bug: https://github.com/rust-lang/rust/issues/24159 + sp_api::StateBackendFor: sp_api::StateBackend> + Send, +{ + /// Get provisioner inherent data + /// + /// This function has a constant timeout: `PROPOSE_TIMEOUT`. + fn get_provisioner_data(&self) -> impl Future> { + // clone this (lightweight) data because we're going to move it into the future + let mut overseer = self.overseer.clone(); + let parent_header_hash = self.parent_header_hash.clone(); + + let mut provisioner_inherent_data = async move { + let (sender, receiver) = futures::channel::oneshot::channel(); + + // strictly speaking, we don't _have_ to .await this send_msg before opening the + // receiver; it's possible that the response there would be ready slightly before + // this call completes. IMO it's not worth the hassle or overhead of spawning a + // distinct task for that kind of miniscule efficiency improvement. + overseer.send_msg(AllMessages::Provisioner( + ProvisionerMessage::RequestInherentData(parent_header_hash, sender), + )).await?; + + receiver.await.map_err(Error::ClosedChannelFromProvisioner) + } + .boxed() + .fuse(); + + let mut timeout = wasm_timer::Delay::new(PROPOSE_TIMEOUT).fuse(); + + async move { + select! { + pid = provisioner_inherent_data => pid, + _ = timeout => Err(Error::Timeout), + } + } + } +} + +impl sp_consensus::Proposer for Proposer +where + TxPool: 'static + TransactionPool, + Client: 'static + + BlockBuilderProvider + + ProvideRuntimeApi + + HeaderBackend + + Send + + Sync, + Client::Api: + ParachainHost + BlockBuilderApi + ApiExt, + Backend: + 'static + sc_client_api::Backend>, + // Rust bug: https://github.com/rust-lang/rust/issues/24159 + sp_api::StateBackendFor: sp_api::StateBackend> + Send, +{ + type Transaction = sc_client_api::TransactionFor; + type Proposal = Pin>, Error>> + Send, + >>; + type Error = Error; + + fn propose( + self, + mut inherent_data: InherentData, + inherent_digests: DigestFor, + max_duration: time::Duration, + record_proof: RecordProof, + ) -> Self::Proposal { + let provisioner_data = self.get_provisioner_data(); + + async move { + let provisioner_data = match provisioner_data.await { + Ok(pd) => pd, + Err(err) => { + log::warn!("could not get provisioner inherent data; injecting default data: {}", err); + Default::default() + } + }; + + inherent_data.put_data( + inclusion_inherent::INHERENT_IDENTIFIER, + &provisioner_data, + )?; + + self.inner + .propose(inherent_data, inherent_digests, max_duration, record_proof) + .await + .map_err(Into::into) + } + .boxed() + } +} + +// It would have been more ergonomic to use thiserror to derive the +// From implementations, Display, and std::error::Error, but unfortunately +// two of the wrapped errors (sp_inherents::Error, SubsystemError) also +// don't impl std::error::Error, which breaks the thiserror derive. +#[derive(Debug)] +pub enum Error { + Consensus(sp_consensus::Error), + Blockchain(sp_blockchain::Error), + Inherent(sp_inherents::Error), + Timeout, + ClosedChannelFromProvisioner(futures::channel::oneshot::Canceled), + Subsystem(SubsystemError) +} + +impl From for Error { + fn from(e: sp_consensus::Error) -> Error { + Error::Consensus(e) + } +} + +impl From for Error { + fn from(e: sp_blockchain::Error) -> Error { + Error::Blockchain(e) + } +} + +impl From for Error { + fn from(e: sp_inherents::Error) -> Error { + Error::Inherent(e) + } +} + +impl From for Error { + fn from(e: SubsystemError) -> Error { + Error::Subsystem(e) + } +} + +impl fmt::Display for Error { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + match self { + Self::Consensus(err) => write!(f, "consensus error: {}", err), + Self::Blockchain(err) => write!(f, "blockchain error: {}", err), + Self::Inherent(err) => write!(f, "inherent error: {:?}", err), + Self::Timeout => write!(f, "timeout: provisioner did not return inherent data after {:?}", PROPOSE_TIMEOUT), + Self::ClosedChannelFromProvisioner(err) => write!(f, "provisioner closed inherent data channel before sending: {}", err), + Self::Subsystem(err) => write!(f, "subsystem error: {:?}", err), + } + } +} + +impl std::error::Error for Error { + fn source(&self) -> Option<&(dyn std::error::Error + 'static)> { + match self { + Self::Consensus(err) => Some(err), + Self::Blockchain(err) => Some(err), + Self::ClosedChannelFromProvisioner(err) => Some(err), + _ => None + } + } +} diff --git a/node/service/Cargo.toml b/node/service/Cargo.toml index 1036cff494..a9552b56ad 100644 --- a/node/service/Cargo.toml +++ b/node/service/Cargo.toml @@ -20,6 +20,7 @@ kusama-runtime = { path = "../../runtime/kusama" } westend-runtime = { path = "../../runtime/westend" } polkadot-network = { path = "../../network", optional = true } polkadot-rpc = { path = "../../rpc" } +polkadot-node-core-proposer = { path = "../core/proposer" } sp-io = { git = "https://github.com/paritytech/substrate", branch = "master" } sp-api = { git = "https://github.com/paritytech/substrate", branch = "master" } sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "master" } @@ -57,7 +58,6 @@ sp-session = { git = "https://github.com/paritytech/substrate", branch = "master sp-offchain = { package = "sp-offchain", git = "https://github.com/paritytech/substrate", branch = "master" } prometheus-endpoint = { package = "substrate-prometheus-endpoint", git = "https://github.com/paritytech/substrate", branch = "master" } frame-benchmarking = { git = "https://github.com/paritytech/substrate", branch = "master" } -sc-basic-authorship = { git = "https://github.com/paritytech/substrate", branch = "master" } [dev-dependencies] polkadot-test-runtime-client = { path = "../../runtime/test-runtime/client" } diff --git a/node/service/src/lib.rs b/node/service/src/lib.rs index 69cdc1b229..4ea8ddd50b 100644 --- a/node/service/src/lib.rs +++ b/node/service/src/lib.rs @@ -34,6 +34,7 @@ use polkadot_subsystem::{ Subsystem, SubsystemContext, SpawnedSubsystem, messages::{CandidateValidationMessage, CandidateBackingMessage}, }; +use polkadot_node_core_proposer::ProposerFactory; use sp_trie::PrefixedMemoryDB; pub use service::{ Role, PruningMode, TransactionPoolOptions, Error, RuntimeGenesis, @@ -362,6 +363,7 @@ macro_rules! new_full { .collect(); let (overseer, handler) = real_overseer(leaves, spawner)?; + let handler_clone = handler.clone(); task_manager.spawn_essential_handle().spawn_blocking("overseer", Box::pin(async move { use futures::{pin_mut, select, FutureExt}; @@ -388,11 +390,10 @@ macro_rules! new_full { let can_author_with = consensus_common::CanAuthorWithNativeVersion::new(client.executor().clone()); - // TODO: custom proposer (https://github.com/paritytech/polkadot/issues/1248) - let proposer = sc_basic_authorship::ProposerFactory::new( + let proposer = ProposerFactory::new( client.clone(), transaction_pool, - None, + handler_clone, ); let babe_config = babe::BabeParams { diff --git a/node/subsystem/src/messages.rs b/node/subsystem/src/messages.rs index c225813490..b8732d5aa5 100644 --- a/node/subsystem/src/messages.rs +++ b/node/subsystem/src/messages.rs @@ -28,7 +28,7 @@ use sc_network::{ObservedRole, ReputationChange, PeerId}; use polkadot_primitives::{BlockNumber, Hash, Signature}; use polkadot_primitives::parachain::{ AbridgedCandidateReceipt, PoVBlock, ErasureChunk, BackedCandidate, Id as ParaId, - SignedAvailabilityBitfield, SigningContext, ValidatorId, ValidationCode, ValidatorIndex, + SignedAvailabilityBitfield, SignedAvailabilityBitfields, SigningContext, ValidatorId, ValidationCode, ValidatorIndex, }; use polkadot_node_primitives::{ MisbehaviorReport, SignedFullStatement, View, ProtocolId, @@ -190,6 +190,11 @@ pub enum ProvisionableData { Dispute(Hash, Signature), } +/// This data needs to make its way from the provisioner into the InherentData. +/// +/// There, it is used to construct the InclusionInherent. +pub type ProvisionerInherentData = (SignedAvailabilityBitfields, Vec); + /// Message to the Provisioner. /// /// In all cases, the Hash is that of the relay parent. @@ -198,6 +203,12 @@ pub enum ProvisionerMessage { /// This message allows potential block authors to be kept updated with all new authorship data /// as it becomes available. RequestBlockAuthorshipData(Hash, mpsc::Sender), + /// This message allows external subsystems to request the set of bitfields and backed candidates + /// associated with a particular potential block hash. + /// + /// This is expected to be used by a proposer, to inject that information into the InherentData + /// where it can be assembled into the InclusionInherent. + RequestInherentData(Hash, oneshot::Sender), /// This data should become part of a relay chain block ProvisionableData(ProvisionableData), } diff --git a/primitives/src/parachain.rs b/primitives/src/parachain.rs index 33a0f0363d..03448a29fa 100644 --- a/primitives/src/parachain.rs +++ b/primitives/src/parachain.rs @@ -724,7 +724,7 @@ impl From> for AvailabilityBitfield { pub type SignedAvailabilityBitfield = Signed; /// A set of signed availability bitfields. Should be sorted by validator index, ascending. -#[derive(Encode, Decode, Clone, PartialEq, Eq, RuntimeDebug)] +#[derive(Encode, Decode, Clone, PartialEq, Eq, RuntimeDebug, Default)] pub struct SignedAvailabilityBitfields(pub Vec); impl From> for SignedAvailabilityBitfields { diff --git a/roadmap/implementors-guide/src/node/utility/provisioner.md b/roadmap/implementors-guide/src/node/utility/provisioner.md index 33fb394f1b..f646e738c4 100644 --- a/roadmap/implementors-guide/src/node/utility/provisioner.md +++ b/roadmap/implementors-guide/src/node/utility/provisioner.md @@ -38,6 +38,12 @@ At initialization, this subsystem has no outputs. Block authors can send a `Prov Note that block authors must re-send a `ProvisionerMessage::RequestBlockAuthorshipData` for each relay parent they are interested in receiving provisionable data for. +## Block Production + +When a validator is selected by BABE to author a block, it becomes a block producer. The provisioner is the subsystem best suited to choosing which specific backed candidates and availability bitfields should be assembled into the block. To engage this functionality, a `ProvisionerMessage::RequestInherentData` is sent; the response is a set of non-conflicting candidates and the appropriate bitfields. Non-conflicting generally means that there are never two distinct parachain candidates included for the same parachain. + +One might ask: given `ProvisionerMessage::RequestInherentData`, what's the point of `ProvisionerMessage::RequestBlockAuthorshipData`? The answer is that the block authorship data includes more information than is present in the inherent data; disputes, for example. + ## Functionality The subsystem should maintain a set of handles to Block Authorship Provisioning Jobs that are currently live. diff --git a/roadmap/implementors-guide/src/types/overseer-protocol.md b/roadmap/implementors-guide/src/types/overseer-protocol.md index 7b211bd14f..7908def940 100644 --- a/roadmap/implementors-guide/src/types/overseer-protocol.md +++ b/roadmap/implementors-guide/src/types/overseer-protocol.md @@ -201,6 +201,11 @@ enum ProvisionableData { Dispute(Hash, Signature), } +/// This data needs to make its way from the provisioner into the InherentData. +/// +/// There, it is used to construct the InclusionInherent. +type ProvisionerInherentData = (SignedAvailabilityBitfields, Vec); + /// Message to the Provisioner. /// /// In all cases, the Hash is that of the relay parent. @@ -208,6 +213,12 @@ enum ProvisionerMessage { /// This message allows potential block authors to be kept updated with all new authorship data /// as it becomes available. RequestBlockAuthorshipData(Hash, Sender), + /// This message allows external subsystems to request the set of bitfields and backed candidates + /// associated with a particular potential block hash. + /// + /// This is expected to be used by a proposer, to inject that information into the InherentData + /// where it can be assembled into the InclusionInherent. + RequestInherentData(Hash, oneshot::Sender), /// This data should become part of a relay chain block ProvisionableData(ProvisionableData), } -- GitLab From 7afb386d33be0d6dc359f5cac1a2fb3c8e06c099 Mon Sep 17 00:00:00 2001 From: Shawn Tabrizi Date: Mon, 6 Jul 2020 12:06:02 +0200 Subject: [PATCH 034/192] Companion for #6567 (Benchmark Writer CLI) (#1349) * Update usage of macro * 'Update substrate' * cargo update -p sp-io Co-authored-by: parity-processbot <> --- Cargo.lock | 275 ++++++++++++++++++------------------ runtime/kusama/src/lib.rs | 32 ++--- runtime/polkadot/src/lib.rs | 28 ++-- runtime/westend/src/lib.rs | 22 +-- 4 files changed, 179 insertions(+), 178 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 35c9415c5a..bd48b8ab47 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1261,7 +1261,7 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "fork-tree" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" dependencies = [ "parity-scale-codec", ] @@ -1269,7 +1269,7 @@ dependencies = [ [[package]] name = "frame-benchmarking" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" dependencies = [ "frame-support", "frame-system", @@ -1286,8 +1286,9 @@ dependencies = [ [[package]] name = "frame-benchmarking-cli" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" dependencies = [ + "Inflector", "frame-benchmarking", "parity-scale-codec", "sc-cli", @@ -1304,7 +1305,7 @@ dependencies = [ [[package]] name = "frame-executive" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" dependencies = [ "frame-support", "frame-system", @@ -1319,7 +1320,7 @@ dependencies = [ [[package]] name = "frame-metadata" version = "11.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" dependencies = [ "parity-scale-codec", "serde", @@ -1330,7 +1331,7 @@ dependencies = [ [[package]] name = "frame-support" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" dependencies = [ "bitmask", "frame-metadata", @@ -1355,7 +1356,7 @@ dependencies = [ [[package]] name = "frame-support-procedural" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" dependencies = [ "frame-support-procedural-tools", "proc-macro2 1.0.18", @@ -1366,7 +1367,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" dependencies = [ "frame-support-procedural-tools-derive", "proc-macro-crate", @@ -1378,7 +1379,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools-derive" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" dependencies = [ "proc-macro2 1.0.18", "quote 1.0.7", @@ -1388,7 +1389,7 @@ dependencies = [ [[package]] name = "frame-system" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" dependencies = [ "frame-support", "impl-trait-for-tuples", @@ -1404,7 +1405,7 @@ dependencies = [ [[package]] name = "frame-system-benchmarking" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" dependencies = [ "frame-benchmarking", "frame-support", @@ -1418,7 +1419,7 @@ dependencies = [ [[package]] name = "frame-system-rpc-runtime-api" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" dependencies = [ "parity-scale-codec", "sp-api", @@ -3375,7 +3376,7 @@ dependencies = [ [[package]] name = "pallet-authority-discovery" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" dependencies = [ "frame-support", "frame-system", @@ -3391,7 +3392,7 @@ dependencies = [ [[package]] name = "pallet-authorship" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" dependencies = [ "frame-support", "frame-system", @@ -3406,7 +3407,7 @@ dependencies = [ [[package]] name = "pallet-babe" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" dependencies = [ "frame-benchmarking", "frame-support", @@ -3431,7 +3432,7 @@ dependencies = [ [[package]] name = "pallet-balances" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" dependencies = [ "frame-benchmarking", "frame-support", @@ -3445,7 +3446,7 @@ dependencies = [ [[package]] name = "pallet-collective" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" dependencies = [ "frame-benchmarking", "frame-support", @@ -3461,7 +3462,7 @@ dependencies = [ [[package]] name = "pallet-democracy" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" dependencies = [ "frame-benchmarking", "frame-support", @@ -3476,7 +3477,7 @@ dependencies = [ [[package]] name = "pallet-elections-phragmen" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" dependencies = [ "frame-benchmarking", "frame-support", @@ -3491,7 +3492,7 @@ dependencies = [ [[package]] name = "pallet-finality-tracker" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" dependencies = [ "frame-support", "frame-system", @@ -3507,7 +3508,7 @@ dependencies = [ [[package]] name = "pallet-grandpa" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" dependencies = [ "frame-support", "frame-system", @@ -3527,7 +3528,7 @@ dependencies = [ [[package]] name = "pallet-identity" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" dependencies = [ "enumflags2", "frame-benchmarking", @@ -3543,7 +3544,7 @@ dependencies = [ [[package]] name = "pallet-im-online" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" dependencies = [ "frame-benchmarking", "frame-support", @@ -3563,7 +3564,7 @@ dependencies = [ [[package]] name = "pallet-indices" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" dependencies = [ "frame-support", "frame-system", @@ -3579,7 +3580,7 @@ dependencies = [ [[package]] name = "pallet-membership" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" dependencies = [ "frame-support", "frame-system", @@ -3593,7 +3594,7 @@ dependencies = [ [[package]] name = "pallet-multisig" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" dependencies = [ "frame-support", "frame-system", @@ -3608,7 +3609,7 @@ dependencies = [ [[package]] name = "pallet-nicks" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" dependencies = [ "frame-support", "frame-system", @@ -3622,7 +3623,7 @@ dependencies = [ [[package]] name = "pallet-offences" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" dependencies = [ "frame-support", "frame-system", @@ -3637,7 +3638,7 @@ dependencies = [ [[package]] name = "pallet-offences-benchmarking" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" dependencies = [ "frame-benchmarking", "frame-support", @@ -3658,7 +3659,7 @@ dependencies = [ [[package]] name = "pallet-proxy" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" dependencies = [ "frame-support", "frame-system", @@ -3673,7 +3674,7 @@ dependencies = [ [[package]] name = "pallet-randomness-collective-flip" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" dependencies = [ "frame-support", "frame-system", @@ -3686,7 +3687,7 @@ dependencies = [ [[package]] name = "pallet-recovery" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" dependencies = [ "enumflags2", "frame-support", @@ -3701,7 +3702,7 @@ dependencies = [ [[package]] name = "pallet-scheduler" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" dependencies = [ "frame-benchmarking", "frame-support", @@ -3716,7 +3717,7 @@ dependencies = [ [[package]] name = "pallet-session" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" dependencies = [ "frame-support", "frame-system", @@ -3736,7 +3737,7 @@ dependencies = [ [[package]] name = "pallet-session-benchmarking" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" dependencies = [ "frame-benchmarking", "frame-support", @@ -3752,7 +3753,7 @@ dependencies = [ [[package]] name = "pallet-society" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" dependencies = [ "frame-support", "frame-system", @@ -3766,7 +3767,7 @@ dependencies = [ [[package]] name = "pallet-staking" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" dependencies = [ "frame-benchmarking", "frame-support", @@ -3788,7 +3789,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-curve" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -3799,7 +3800,7 @@ dependencies = [ [[package]] name = "pallet-sudo" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" dependencies = [ "frame-support", "frame-system", @@ -3813,7 +3814,7 @@ dependencies = [ [[package]] name = "pallet-timestamp" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" dependencies = [ "frame-benchmarking", "frame-support", @@ -3831,7 +3832,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" dependencies = [ "frame-support", "frame-system", @@ -3846,7 +3847,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" dependencies = [ "jsonrpc-core", "jsonrpc-core-client", @@ -3864,7 +3865,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc-runtime-api" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" dependencies = [ "frame-support", "parity-scale-codec", @@ -3877,7 +3878,7 @@ dependencies = [ [[package]] name = "pallet-treasury" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" dependencies = [ "frame-benchmarking", "frame-support", @@ -3892,7 +3893,7 @@ dependencies = [ [[package]] name = "pallet-utility" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" dependencies = [ "frame-benchmarking", "frame-support", @@ -3908,7 +3909,7 @@ dependencies = [ [[package]] name = "pallet-vesting" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" dependencies = [ "enumflags2", "frame-benchmarking", @@ -5738,7 +5739,7 @@ dependencies = [ [[package]] name = "sc-authority-discovery" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" dependencies = [ "bytes 0.5.4", "derive_more 0.99.8", @@ -5765,7 +5766,7 @@ dependencies = [ [[package]] name = "sc-basic-authorship" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -5789,7 +5790,7 @@ dependencies = [ [[package]] name = "sc-block-builder" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" dependencies = [ "parity-scale-codec", "sc-client-api", @@ -5806,7 +5807,7 @@ dependencies = [ [[package]] name = "sc-chain-spec" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" dependencies = [ "impl-trait-for-tuples", "sc-chain-spec-derive", @@ -5822,7 +5823,7 @@ dependencies = [ [[package]] name = "sc-chain-spec-derive" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -5833,7 +5834,7 @@ dependencies = [ [[package]] name = "sc-cli" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" dependencies = [ "ansi_term 0.12.1", "atty", @@ -5874,7 +5875,7 @@ dependencies = [ [[package]] name = "sc-client-api" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" dependencies = [ "derive_more 0.99.8", "fnv", @@ -5910,7 +5911,7 @@ dependencies = [ [[package]] name = "sc-client-db" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" dependencies = [ "blake2-rfc", "hash-db", @@ -5939,7 +5940,7 @@ dependencies = [ [[package]] name = "sc-consensus" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" dependencies = [ "sc-client-api", "sp-blockchain", @@ -5950,7 +5951,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" dependencies = [ "derive_more 0.99.8", "fork-tree", @@ -5992,7 +5993,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe-rpc" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" dependencies = [ "derive_more 0.99.8", "futures 0.3.5", @@ -6016,7 +6017,7 @@ dependencies = [ [[package]] name = "sc-consensus-epochs" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" dependencies = [ "fork-tree", "parity-scale-codec", @@ -6029,7 +6030,7 @@ dependencies = [ [[package]] name = "sc-consensus-slots" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6052,7 +6053,7 @@ dependencies = [ [[package]] name = "sc-consensus-uncles" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" dependencies = [ "log 0.4.8", "sc-client-api", @@ -6066,7 +6067,7 @@ dependencies = [ [[package]] name = "sc-executor" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" dependencies = [ "derive_more 0.99.8", "lazy_static", @@ -6094,7 +6095,7 @@ dependencies = [ [[package]] name = "sc-executor-common" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" dependencies = [ "derive_more 0.99.8", "log 0.4.8", @@ -6111,7 +6112,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmi" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" dependencies = [ "log 0.4.8", "parity-scale-codec", @@ -6126,7 +6127,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmtime" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" dependencies = [ "cranelift-codegen", "cranelift-wasm", @@ -6147,7 +6148,7 @@ dependencies = [ [[package]] name = "sc-finality-grandpa" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" dependencies = [ "assert_matches", "derive_more 0.99.8", @@ -6185,7 +6186,7 @@ dependencies = [ [[package]] name = "sc-finality-grandpa-rpc" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" dependencies = [ "derive_more 0.99.8", "finality-grandpa", @@ -6202,7 +6203,7 @@ dependencies = [ [[package]] name = "sc-informant" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" dependencies = [ "ansi_term 0.12.1", "futures 0.3.5", @@ -6221,7 +6222,7 @@ dependencies = [ [[package]] name = "sc-keystore" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" dependencies = [ "derive_more 0.99.8", "hex", @@ -6237,7 +6238,7 @@ dependencies = [ [[package]] name = "sc-light" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" dependencies = [ "hash-db", "lazy_static", @@ -6256,7 +6257,7 @@ dependencies = [ [[package]] name = "sc-network" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" dependencies = [ "bitflags", "bs58", @@ -6308,7 +6309,7 @@ dependencies = [ [[package]] name = "sc-network-gossip" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6323,7 +6324,7 @@ dependencies = [ [[package]] name = "sc-network-test" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" dependencies = [ "env_logger", "futures 0.3.5", @@ -6350,7 +6351,7 @@ dependencies = [ [[package]] name = "sc-offchain" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" dependencies = [ "bytes 0.5.4", "fnv", @@ -6377,7 +6378,7 @@ dependencies = [ [[package]] name = "sc-peerset" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" dependencies = [ "futures 0.3.5", "libp2p", @@ -6390,7 +6391,7 @@ dependencies = [ [[package]] name = "sc-proposer-metrics" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" dependencies = [ "log 0.4.8", "substrate-prometheus-endpoint", @@ -6399,7 +6400,7 @@ dependencies = [ [[package]] name = "sc-rpc" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" dependencies = [ "futures 0.3.5", "hash-db", @@ -6431,7 +6432,7 @@ dependencies = [ [[package]] name = "sc-rpc-api" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" dependencies = [ "derive_more 0.99.8", "futures 0.3.5", @@ -6455,7 +6456,7 @@ dependencies = [ [[package]] name = "sc-rpc-server" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" dependencies = [ "jsonrpc-core", "jsonrpc-http-server", @@ -6471,7 +6472,7 @@ dependencies = [ [[package]] name = "sc-service" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" dependencies = [ "derive_more 0.99.8", "directories", @@ -6534,7 +6535,7 @@ dependencies = [ [[package]] name = "sc-state-db" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" dependencies = [ "log 0.4.8", "parity-scale-codec", @@ -6548,7 +6549,7 @@ dependencies = [ [[package]] name = "sc-telemetry" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6569,7 +6570,7 @@ dependencies = [ [[package]] name = "sc-tracing" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" dependencies = [ "erased-serde", "log 0.4.8", @@ -6586,7 +6587,7 @@ dependencies = [ [[package]] name = "sc-transaction-graph" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" dependencies = [ "derive_more 0.99.8", "futures 0.3.5", @@ -6606,7 +6607,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" dependencies = [ "derive_more 0.99.8", "futures 0.3.5", @@ -6992,7 +6993,7 @@ dependencies = [ [[package]] name = "sp-allocator" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" dependencies = [ "derive_more 0.99.8", "log 0.4.8", @@ -7004,7 +7005,7 @@ dependencies = [ [[package]] name = "sp-api" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" dependencies = [ "hash-db", "parity-scale-codec", @@ -7019,7 +7020,7 @@ dependencies = [ [[package]] name = "sp-api-proc-macro" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" dependencies = [ "blake2-rfc", "proc-macro-crate", @@ -7031,7 +7032,7 @@ dependencies = [ [[package]] name = "sp-application-crypto" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" dependencies = [ "parity-scale-codec", "serde", @@ -7043,7 +7044,7 @@ dependencies = [ [[package]] name = "sp-arithmetic" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" dependencies = [ "integer-sqrt", "num-traits 0.2.12", @@ -7056,7 +7057,7 @@ dependencies = [ [[package]] name = "sp-authority-discovery" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" dependencies = [ "parity-scale-codec", "sp-api", @@ -7068,7 +7069,7 @@ dependencies = [ [[package]] name = "sp-authorship" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" dependencies = [ "parity-scale-codec", "sp-inherents", @@ -7079,7 +7080,7 @@ dependencies = [ [[package]] name = "sp-block-builder" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" dependencies = [ "parity-scale-codec", "sp-api", @@ -7091,7 +7092,7 @@ dependencies = [ [[package]] name = "sp-blockchain" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" dependencies = [ "derive_more 0.99.8", "log 0.4.8", @@ -7107,7 +7108,7 @@ dependencies = [ [[package]] name = "sp-chain-spec" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" dependencies = [ "serde", "serde_json", @@ -7116,7 +7117,7 @@ dependencies = [ [[package]] name = "sp-consensus" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" dependencies = [ "derive_more 0.99.8", "futures 0.3.5", @@ -7140,7 +7141,7 @@ dependencies = [ [[package]] name = "sp-consensus-aura" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" dependencies = [ "parity-scale-codec", "sp-api", @@ -7154,7 +7155,7 @@ dependencies = [ [[package]] name = "sp-consensus-babe" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" dependencies = [ "merlin", "parity-scale-codec", @@ -7173,7 +7174,7 @@ dependencies = [ [[package]] name = "sp-consensus-slots" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" dependencies = [ "parity-scale-codec", "sp-runtime", @@ -7182,7 +7183,7 @@ dependencies = [ [[package]] name = "sp-consensus-vrf" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" dependencies = [ "parity-scale-codec", "schnorrkel", @@ -7194,7 +7195,7 @@ dependencies = [ [[package]] name = "sp-core" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" dependencies = [ "base58", "blake2-rfc", @@ -7237,7 +7238,7 @@ dependencies = [ [[package]] name = "sp-database" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" dependencies = [ "kvdb", "parking_lot 0.10.2", @@ -7246,7 +7247,7 @@ dependencies = [ [[package]] name = "sp-debug-derive" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" dependencies = [ "proc-macro2 1.0.18", "quote 1.0.7", @@ -7256,7 +7257,7 @@ dependencies = [ [[package]] name = "sp-externalities" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" dependencies = [ "environmental", "parity-scale-codec", @@ -7267,7 +7268,7 @@ dependencies = [ [[package]] name = "sp-finality-grandpa" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" dependencies = [ "finality-grandpa", "log 0.4.8", @@ -7283,7 +7284,7 @@ dependencies = [ [[package]] name = "sp-finality-tracker" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" dependencies = [ "parity-scale-codec", "sp-inherents", @@ -7293,7 +7294,7 @@ dependencies = [ [[package]] name = "sp-inherents" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" dependencies = [ "derive_more 0.99.8", "parity-scale-codec", @@ -7305,7 +7306,7 @@ dependencies = [ [[package]] name = "sp-io" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" dependencies = [ "futures 0.3.5", "hash-db", @@ -7326,7 +7327,7 @@ dependencies = [ [[package]] name = "sp-keyring" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" dependencies = [ "lazy_static", "sp-core", @@ -7337,7 +7338,7 @@ dependencies = [ [[package]] name = "sp-npos-elections" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" dependencies = [ "parity-scale-codec", "serde", @@ -7349,7 +7350,7 @@ dependencies = [ [[package]] name = "sp-npos-elections-compact" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -7360,7 +7361,7 @@ dependencies = [ [[package]] name = "sp-offchain" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" dependencies = [ "sp-api", "sp-core", @@ -7370,7 +7371,7 @@ dependencies = [ [[package]] name = "sp-panic-handler" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" dependencies = [ "backtrace", "log 0.4.8", @@ -7379,7 +7380,7 @@ dependencies = [ [[package]] name = "sp-rpc" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" dependencies = [ "serde", "sp-core", @@ -7388,7 +7389,7 @@ dependencies = [ [[package]] name = "sp-runtime" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" dependencies = [ "either", "hash256-std-hasher", @@ -7410,7 +7411,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" dependencies = [ "parity-scale-codec", "primitive-types", @@ -7425,7 +7426,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" dependencies = [ "Inflector", "proc-macro-crate", @@ -7437,7 +7438,7 @@ dependencies = [ [[package]] name = "sp-serializer" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" dependencies = [ "serde", "serde_json", @@ -7446,7 +7447,7 @@ dependencies = [ [[package]] name = "sp-session" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" dependencies = [ "parity-scale-codec", "sp-api", @@ -7459,7 +7460,7 @@ dependencies = [ [[package]] name = "sp-staking" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" dependencies = [ "parity-scale-codec", "sp-runtime", @@ -7469,7 +7470,7 @@ dependencies = [ [[package]] name = "sp-state-machine" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" dependencies = [ "hash-db", "itertools 0.9.0", @@ -7490,12 +7491,12 @@ dependencies = [ [[package]] name = "sp-std" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" [[package]] name = "sp-storage" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" dependencies = [ "impl-serde 0.2.3", "ref-cast", @@ -7507,7 +7508,7 @@ dependencies = [ [[package]] name = "sp-timestamp" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -7521,7 +7522,7 @@ dependencies = [ [[package]] name = "sp-tracing" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" dependencies = [ "log 0.4.8", "rental", @@ -7531,7 +7532,7 @@ dependencies = [ [[package]] name = "sp-transaction-pool" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" dependencies = [ "derive_more 0.99.8", "futures 0.3.5", @@ -7547,7 +7548,7 @@ dependencies = [ [[package]] name = "sp-trie" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" dependencies = [ "hash-db", "memory-db", @@ -7561,7 +7562,7 @@ dependencies = [ [[package]] name = "sp-utils" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" dependencies = [ "futures 0.3.5", "futures-core", @@ -7573,7 +7574,7 @@ dependencies = [ [[package]] name = "sp-version" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" dependencies = [ "impl-serde 0.2.3", "parity-scale-codec", @@ -7585,7 +7586,7 @@ dependencies = [ [[package]] name = "sp-wasm-interface" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -7725,7 +7726,7 @@ dependencies = [ [[package]] name = "substrate-browser-utils" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" dependencies = [ "chrono", "clear_on_drop", @@ -7752,7 +7753,7 @@ dependencies = [ [[package]] name = "substrate-build-script-utils" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" dependencies = [ "platforms", ] @@ -7760,7 +7761,7 @@ dependencies = [ [[package]] name = "substrate-frame-rpc-system" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" dependencies = [ "frame-system-rpc-runtime-api", "futures 0.3.5", @@ -7783,7 +7784,7 @@ dependencies = [ [[package]] name = "substrate-prometheus-endpoint" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" dependencies = [ "async-std", "derive_more 0.99.8", @@ -7797,7 +7798,7 @@ dependencies = [ [[package]] name = "substrate-test-client" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" dependencies = [ "futures 0.1.29", "futures 0.3.5", @@ -7821,7 +7822,7 @@ dependencies = [ [[package]] name = "substrate-test-runtime" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" dependencies = [ "cfg-if", "frame-executive", @@ -7861,7 +7862,7 @@ dependencies = [ [[package]] name = "substrate-test-runtime-client" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" dependencies = [ "futures 0.3.5", "parity-scale-codec", @@ -7882,7 +7883,7 @@ dependencies = [ [[package]] name = "substrate-wasm-builder-runner" version = "1.0.6" -source = "git+https://github.com/paritytech/substrate#18334ee173f0ec4b62d2ca05c5b0c1f0b05b1b17" +source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" [[package]] name = "substrate-wasm-builder-runner" diff --git a/runtime/kusama/src/lib.rs b/runtime/kusama/src/lib.rs index 7163fd869c..521791982c 100644 --- a/runtime/kusama/src/lib.rs +++ b/runtime/kusama/src/lib.rs @@ -1287,23 +1287,23 @@ sp_api::impl_runtime_apis! { let mut batches = Vec::::new(); let params = (&pallet, &benchmark, &lowest_range_values, &highest_range_values, &steps, repeat, &whitelist); // Polkadot - add_benchmark!(params, batches, b"claims", Claims); + add_benchmark!(params, batches, claims, Claims); // Substrate - add_benchmark!(params, batches, b"balances", Balances); - add_benchmark!(params, batches, b"collective", Council); - add_benchmark!(params, batches, b"democracy", Democracy); - add_benchmark!(params, batches, b"elections-phragmen", ElectionsPhragmen); - add_benchmark!(params, batches, b"identity", Identity); - add_benchmark!(params, batches, b"im-online", ImOnline); - add_benchmark!(params, batches, b"offences", OffencesBench::); - add_benchmark!(params, batches, b"scheduler", Scheduler); - add_benchmark!(params, batches, b"session", SessionBench::); - add_benchmark!(params, batches, b"staking", Staking); - add_benchmark!(params, batches, b"system", SystemBench::); - add_benchmark!(params, batches, b"timestamp", Timestamp); - add_benchmark!(params, batches, b"treasury", Treasury); - add_benchmark!(params, batches, b"utility", Utility); - add_benchmark!(params, batches, b"vesting", Vesting); + add_benchmark!(params, batches, balances, Balances); + add_benchmark!(params, batches, collective, Council); + add_benchmark!(params, batches, democracy, Democracy); + add_benchmark!(params, batches, elections_phragmen, ElectionsPhragmen); + add_benchmark!(params, batches, identity, Identity); + add_benchmark!(params, batches, im_online, ImOnline); + add_benchmark!(params, batches, offences, OffencesBench::); + add_benchmark!(params, batches, scheduler, Scheduler); + add_benchmark!(params, batches, session, SessionBench::); + add_benchmark!(params, batches, staking, Staking); + add_benchmark!(params, batches, system, SystemBench::); + add_benchmark!(params, batches, timestamp, Timestamp); + add_benchmark!(params, batches, treasury, Treasury); + add_benchmark!(params, batches, utility, Utility); + add_benchmark!(params, batches, vesting, Vesting); if batches.is_empty() { return Err("Benchmark not found for this pallet.".into()) } Ok(batches) diff --git a/runtime/polkadot/src/lib.rs b/runtime/polkadot/src/lib.rs index b84734726b..50405f537c 100644 --- a/runtime/polkadot/src/lib.rs +++ b/runtime/polkadot/src/lib.rs @@ -1288,21 +1288,21 @@ sp_api::impl_runtime_apis! { let mut batches = Vec::::new(); let params = (&pallet, &benchmark, &lowest_range_values, &highest_range_values, &steps, repeat, &whitelist); // Polkadot - add_benchmark!(params, batches, b"claims", Claims); + add_benchmark!(params, batches, claims, Claims); // Substrate - add_benchmark!(params, batches, b"balances", Balances); - add_benchmark!(params, batches, b"collective", Council); - add_benchmark!(params, batches, b"democracy", Democracy); - add_benchmark!(params, batches, b"elections-phragmen", ElectionsPhragmen); - add_benchmark!(params, batches, b"im-online", ImOnline); - add_benchmark!(params, batches, b"offences", OffencesBench::); - add_benchmark!(params, batches, b"scheduler", Scheduler); - add_benchmark!(params, batches, b"session", SessionBench::); - add_benchmark!(params, batches, b"staking", Staking); - add_benchmark!(params, batches, b"system", SystemBench::); - add_benchmark!(params, batches, b"timestamp", Timestamp); - add_benchmark!(params, batches, b"treasury", Treasury); - add_benchmark!(params, batches, b"vesting", Vesting); + add_benchmark!(params, batches, balances, Balances); + add_benchmark!(params, batches, collective, Council); + add_benchmark!(params, batches, democracy, Democracy); + add_benchmark!(params, batches, elections_phragmen, ElectionsPhragmen); + add_benchmark!(params, batches, im_online, ImOnline); + add_benchmark!(params, batches, offences, OffencesBench::); + add_benchmark!(params, batches, scheduler, Scheduler); + add_benchmark!(params, batches, session, SessionBench::); + add_benchmark!(params, batches, staking, Staking); + add_benchmark!(params, batches, system, SystemBench::); + add_benchmark!(params, batches, timestamp, Timestamp); + add_benchmark!(params, batches, treasury, Treasury); + add_benchmark!(params, batches, vesting, Vesting); if batches.is_empty() { return Err("Benchmark not found for this pallet.".into()) } Ok(batches) diff --git a/runtime/westend/src/lib.rs b/runtime/westend/src/lib.rs index 14793d0d6c..37844284f4 100644 --- a/runtime/westend/src/lib.rs +++ b/runtime/westend/src/lib.rs @@ -1032,17 +1032,17 @@ sp_api::impl_runtime_apis! { let mut batches = Vec::::new(); let params = (&pallet, &benchmark, &lowest_range_values, &highest_range_values, &steps, repeat, &whitelist); - add_benchmark!(params, batches, b"balances", Balances); - add_benchmark!(params, batches, b"identity", Identity); - add_benchmark!(params, batches, b"im-online", ImOnline); - add_benchmark!(params, batches, b"offences", OffencesBench::); - add_benchmark!(params, batches, b"scheduler", Scheduler); - add_benchmark!(params, batches, b"session", SessionBench::); - add_benchmark!(params, batches, b"staking", Staking); - add_benchmark!(params, batches, b"system", SystemBench::); - add_benchmark!(params, batches, b"timestamp", Timestamp); - add_benchmark!(params, batches, b"utility", Utility); - add_benchmark!(params, batches, b"vesting", Vesting); + add_benchmark!(params, batches, balances,Balances); + add_benchmark!(params, batches, identity,Identity); + add_benchmark!(params, batches, im_online,ImOnline); + add_benchmark!(params, batches, offences,OffencesBench::); + add_benchmark!(params, batches, scheduler, Scheduler); + add_benchmark!(params, batches, session, SessionBench::); + add_benchmark!(params, batches, staking, Staking); + add_benchmark!(params, batches, system, SystemBench::); + add_benchmark!(params, batches, timestamp, Timestamp); + add_benchmark!(params, batches, utility, Utility); + add_benchmark!(params, batches, vesting, Vesting); if batches.is_empty() { return Err("Benchmark not found for this pallet.".into()) } Ok(batches) -- GitLab From 0499212fae1ca68d40ec5a7d593995d678f6245b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Mon, 6 Jul 2020 13:36:00 +0200 Subject: [PATCH 035/192] Companion for #6576 (#1351) * Companion for #6576 * 'Update substrate' Co-authored-by: parity-processbot <> --- Cargo.lock | 274 +++++++++++++++---------------- runtime/common/src/claims.rs | 8 +- runtime/common/src/parachains.rs | 2 +- runtime/common/src/registrar.rs | 8 +- runtime/kusama/src/lib.rs | 2 +- runtime/polkadot/src/lib.rs | 2 +- runtime/test-runtime/src/lib.rs | 2 +- runtime/westend/src/lib.rs | 2 +- 8 files changed, 150 insertions(+), 150 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index bd48b8ab47..6adfa89b26 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1261,7 +1261,7 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "fork-tree" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" +source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" dependencies = [ "parity-scale-codec", ] @@ -1269,7 +1269,7 @@ dependencies = [ [[package]] name = "frame-benchmarking" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" +source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" dependencies = [ "frame-support", "frame-system", @@ -1286,7 +1286,7 @@ dependencies = [ [[package]] name = "frame-benchmarking-cli" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" +source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" dependencies = [ "Inflector", "frame-benchmarking", @@ -1305,7 +1305,7 @@ dependencies = [ [[package]] name = "frame-executive" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" +source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" dependencies = [ "frame-support", "frame-system", @@ -1320,7 +1320,7 @@ dependencies = [ [[package]] name = "frame-metadata" version = "11.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" +source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" dependencies = [ "parity-scale-codec", "serde", @@ -1331,7 +1331,7 @@ dependencies = [ [[package]] name = "frame-support" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" +source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" dependencies = [ "bitmask", "frame-metadata", @@ -1356,7 +1356,7 @@ dependencies = [ [[package]] name = "frame-support-procedural" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" +source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" dependencies = [ "frame-support-procedural-tools", "proc-macro2 1.0.18", @@ -1367,7 +1367,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" +source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" dependencies = [ "frame-support-procedural-tools-derive", "proc-macro-crate", @@ -1379,7 +1379,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools-derive" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" +source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" dependencies = [ "proc-macro2 1.0.18", "quote 1.0.7", @@ -1389,7 +1389,7 @@ dependencies = [ [[package]] name = "frame-system" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" +source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" dependencies = [ "frame-support", "impl-trait-for-tuples", @@ -1405,7 +1405,7 @@ dependencies = [ [[package]] name = "frame-system-benchmarking" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" +source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" dependencies = [ "frame-benchmarking", "frame-support", @@ -1419,7 +1419,7 @@ dependencies = [ [[package]] name = "frame-system-rpc-runtime-api" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" +source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" dependencies = [ "parity-scale-codec", "sp-api", @@ -3376,7 +3376,7 @@ dependencies = [ [[package]] name = "pallet-authority-discovery" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" +source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" dependencies = [ "frame-support", "frame-system", @@ -3392,7 +3392,7 @@ dependencies = [ [[package]] name = "pallet-authorship" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" +source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" dependencies = [ "frame-support", "frame-system", @@ -3407,7 +3407,7 @@ dependencies = [ [[package]] name = "pallet-babe" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" +source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" dependencies = [ "frame-benchmarking", "frame-support", @@ -3432,7 +3432,7 @@ dependencies = [ [[package]] name = "pallet-balances" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" +source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" dependencies = [ "frame-benchmarking", "frame-support", @@ -3446,7 +3446,7 @@ dependencies = [ [[package]] name = "pallet-collective" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" +source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" dependencies = [ "frame-benchmarking", "frame-support", @@ -3462,7 +3462,7 @@ dependencies = [ [[package]] name = "pallet-democracy" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" +source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" dependencies = [ "frame-benchmarking", "frame-support", @@ -3477,7 +3477,7 @@ dependencies = [ [[package]] name = "pallet-elections-phragmen" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" +source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" dependencies = [ "frame-benchmarking", "frame-support", @@ -3492,7 +3492,7 @@ dependencies = [ [[package]] name = "pallet-finality-tracker" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" +source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" dependencies = [ "frame-support", "frame-system", @@ -3508,7 +3508,7 @@ dependencies = [ [[package]] name = "pallet-grandpa" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" +source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" dependencies = [ "frame-support", "frame-system", @@ -3528,7 +3528,7 @@ dependencies = [ [[package]] name = "pallet-identity" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" +source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" dependencies = [ "enumflags2", "frame-benchmarking", @@ -3544,7 +3544,7 @@ dependencies = [ [[package]] name = "pallet-im-online" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" +source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" dependencies = [ "frame-benchmarking", "frame-support", @@ -3564,7 +3564,7 @@ dependencies = [ [[package]] name = "pallet-indices" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" +source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" dependencies = [ "frame-support", "frame-system", @@ -3580,7 +3580,7 @@ dependencies = [ [[package]] name = "pallet-membership" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" +source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" dependencies = [ "frame-support", "frame-system", @@ -3594,7 +3594,7 @@ dependencies = [ [[package]] name = "pallet-multisig" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" +source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" dependencies = [ "frame-support", "frame-system", @@ -3609,7 +3609,7 @@ dependencies = [ [[package]] name = "pallet-nicks" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" +source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" dependencies = [ "frame-support", "frame-system", @@ -3623,7 +3623,7 @@ dependencies = [ [[package]] name = "pallet-offences" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" +source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" dependencies = [ "frame-support", "frame-system", @@ -3638,7 +3638,7 @@ dependencies = [ [[package]] name = "pallet-offences-benchmarking" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" +source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" dependencies = [ "frame-benchmarking", "frame-support", @@ -3659,7 +3659,7 @@ dependencies = [ [[package]] name = "pallet-proxy" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" +source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" dependencies = [ "frame-support", "frame-system", @@ -3674,7 +3674,7 @@ dependencies = [ [[package]] name = "pallet-randomness-collective-flip" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" +source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" dependencies = [ "frame-support", "frame-system", @@ -3687,7 +3687,7 @@ dependencies = [ [[package]] name = "pallet-recovery" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" +source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" dependencies = [ "enumflags2", "frame-support", @@ -3702,7 +3702,7 @@ dependencies = [ [[package]] name = "pallet-scheduler" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" +source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" dependencies = [ "frame-benchmarking", "frame-support", @@ -3717,7 +3717,7 @@ dependencies = [ [[package]] name = "pallet-session" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" +source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" dependencies = [ "frame-support", "frame-system", @@ -3737,7 +3737,7 @@ dependencies = [ [[package]] name = "pallet-session-benchmarking" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" +source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" dependencies = [ "frame-benchmarking", "frame-support", @@ -3753,7 +3753,7 @@ dependencies = [ [[package]] name = "pallet-society" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" +source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" dependencies = [ "frame-support", "frame-system", @@ -3767,7 +3767,7 @@ dependencies = [ [[package]] name = "pallet-staking" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" +source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" dependencies = [ "frame-benchmarking", "frame-support", @@ -3789,7 +3789,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-curve" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" +source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -3800,7 +3800,7 @@ dependencies = [ [[package]] name = "pallet-sudo" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" +source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" dependencies = [ "frame-support", "frame-system", @@ -3814,7 +3814,7 @@ dependencies = [ [[package]] name = "pallet-timestamp" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" +source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" dependencies = [ "frame-benchmarking", "frame-support", @@ -3832,7 +3832,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" +source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" dependencies = [ "frame-support", "frame-system", @@ -3847,7 +3847,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" +source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" dependencies = [ "jsonrpc-core", "jsonrpc-core-client", @@ -3865,7 +3865,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc-runtime-api" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" +source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" dependencies = [ "frame-support", "parity-scale-codec", @@ -3878,7 +3878,7 @@ dependencies = [ [[package]] name = "pallet-treasury" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" +source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" dependencies = [ "frame-benchmarking", "frame-support", @@ -3893,7 +3893,7 @@ dependencies = [ [[package]] name = "pallet-utility" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" +source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" dependencies = [ "frame-benchmarking", "frame-support", @@ -3909,7 +3909,7 @@ dependencies = [ [[package]] name = "pallet-vesting" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" +source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" dependencies = [ "enumflags2", "frame-benchmarking", @@ -5739,7 +5739,7 @@ dependencies = [ [[package]] name = "sc-authority-discovery" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" +source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" dependencies = [ "bytes 0.5.4", "derive_more 0.99.8", @@ -5766,7 +5766,7 @@ dependencies = [ [[package]] name = "sc-basic-authorship" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" +source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -5790,7 +5790,7 @@ dependencies = [ [[package]] name = "sc-block-builder" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" +source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" dependencies = [ "parity-scale-codec", "sc-client-api", @@ -5807,7 +5807,7 @@ dependencies = [ [[package]] name = "sc-chain-spec" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" +source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" dependencies = [ "impl-trait-for-tuples", "sc-chain-spec-derive", @@ -5823,7 +5823,7 @@ dependencies = [ [[package]] name = "sc-chain-spec-derive" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" +source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -5834,7 +5834,7 @@ dependencies = [ [[package]] name = "sc-cli" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" +source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" dependencies = [ "ansi_term 0.12.1", "atty", @@ -5875,7 +5875,7 @@ dependencies = [ [[package]] name = "sc-client-api" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" +source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" dependencies = [ "derive_more 0.99.8", "fnv", @@ -5911,7 +5911,7 @@ dependencies = [ [[package]] name = "sc-client-db" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" +source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" dependencies = [ "blake2-rfc", "hash-db", @@ -5940,7 +5940,7 @@ dependencies = [ [[package]] name = "sc-consensus" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" +source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" dependencies = [ "sc-client-api", "sp-blockchain", @@ -5951,7 +5951,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" +source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" dependencies = [ "derive_more 0.99.8", "fork-tree", @@ -5993,7 +5993,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe-rpc" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" +source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" dependencies = [ "derive_more 0.99.8", "futures 0.3.5", @@ -6017,7 +6017,7 @@ dependencies = [ [[package]] name = "sc-consensus-epochs" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" +source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" dependencies = [ "fork-tree", "parity-scale-codec", @@ -6030,7 +6030,7 @@ dependencies = [ [[package]] name = "sc-consensus-slots" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" +source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6053,7 +6053,7 @@ dependencies = [ [[package]] name = "sc-consensus-uncles" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" +source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" dependencies = [ "log 0.4.8", "sc-client-api", @@ -6067,7 +6067,7 @@ dependencies = [ [[package]] name = "sc-executor" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" +source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" dependencies = [ "derive_more 0.99.8", "lazy_static", @@ -6095,7 +6095,7 @@ dependencies = [ [[package]] name = "sc-executor-common" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" +source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" dependencies = [ "derive_more 0.99.8", "log 0.4.8", @@ -6112,7 +6112,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmi" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" +source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" dependencies = [ "log 0.4.8", "parity-scale-codec", @@ -6127,7 +6127,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmtime" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" +source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" dependencies = [ "cranelift-codegen", "cranelift-wasm", @@ -6148,7 +6148,7 @@ dependencies = [ [[package]] name = "sc-finality-grandpa" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" +source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" dependencies = [ "assert_matches", "derive_more 0.99.8", @@ -6186,7 +6186,7 @@ dependencies = [ [[package]] name = "sc-finality-grandpa-rpc" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" +source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" dependencies = [ "derive_more 0.99.8", "finality-grandpa", @@ -6203,7 +6203,7 @@ dependencies = [ [[package]] name = "sc-informant" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" +source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" dependencies = [ "ansi_term 0.12.1", "futures 0.3.5", @@ -6222,7 +6222,7 @@ dependencies = [ [[package]] name = "sc-keystore" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" +source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" dependencies = [ "derive_more 0.99.8", "hex", @@ -6238,7 +6238,7 @@ dependencies = [ [[package]] name = "sc-light" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" +source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" dependencies = [ "hash-db", "lazy_static", @@ -6257,7 +6257,7 @@ dependencies = [ [[package]] name = "sc-network" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" +source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" dependencies = [ "bitflags", "bs58", @@ -6309,7 +6309,7 @@ dependencies = [ [[package]] name = "sc-network-gossip" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" +source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6324,7 +6324,7 @@ dependencies = [ [[package]] name = "sc-network-test" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" +source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" dependencies = [ "env_logger", "futures 0.3.5", @@ -6351,7 +6351,7 @@ dependencies = [ [[package]] name = "sc-offchain" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" +source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" dependencies = [ "bytes 0.5.4", "fnv", @@ -6378,7 +6378,7 @@ dependencies = [ [[package]] name = "sc-peerset" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" +source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" dependencies = [ "futures 0.3.5", "libp2p", @@ -6391,7 +6391,7 @@ dependencies = [ [[package]] name = "sc-proposer-metrics" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" +source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" dependencies = [ "log 0.4.8", "substrate-prometheus-endpoint", @@ -6400,7 +6400,7 @@ dependencies = [ [[package]] name = "sc-rpc" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" +source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" dependencies = [ "futures 0.3.5", "hash-db", @@ -6432,7 +6432,7 @@ dependencies = [ [[package]] name = "sc-rpc-api" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" +source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" dependencies = [ "derive_more 0.99.8", "futures 0.3.5", @@ -6456,7 +6456,7 @@ dependencies = [ [[package]] name = "sc-rpc-server" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" +source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" dependencies = [ "jsonrpc-core", "jsonrpc-http-server", @@ -6472,7 +6472,7 @@ dependencies = [ [[package]] name = "sc-service" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" +source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" dependencies = [ "derive_more 0.99.8", "directories", @@ -6535,7 +6535,7 @@ dependencies = [ [[package]] name = "sc-state-db" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" +source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" dependencies = [ "log 0.4.8", "parity-scale-codec", @@ -6549,7 +6549,7 @@ dependencies = [ [[package]] name = "sc-telemetry" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" +source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6570,7 +6570,7 @@ dependencies = [ [[package]] name = "sc-tracing" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" +source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" dependencies = [ "erased-serde", "log 0.4.8", @@ -6587,7 +6587,7 @@ dependencies = [ [[package]] name = "sc-transaction-graph" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" +source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" dependencies = [ "derive_more 0.99.8", "futures 0.3.5", @@ -6607,7 +6607,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" +source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" dependencies = [ "derive_more 0.99.8", "futures 0.3.5", @@ -6993,7 +6993,7 @@ dependencies = [ [[package]] name = "sp-allocator" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" +source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" dependencies = [ "derive_more 0.99.8", "log 0.4.8", @@ -7005,7 +7005,7 @@ dependencies = [ [[package]] name = "sp-api" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" +source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" dependencies = [ "hash-db", "parity-scale-codec", @@ -7020,7 +7020,7 @@ dependencies = [ [[package]] name = "sp-api-proc-macro" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" +source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" dependencies = [ "blake2-rfc", "proc-macro-crate", @@ -7032,7 +7032,7 @@ dependencies = [ [[package]] name = "sp-application-crypto" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" +source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" dependencies = [ "parity-scale-codec", "serde", @@ -7044,7 +7044,7 @@ dependencies = [ [[package]] name = "sp-arithmetic" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" +source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" dependencies = [ "integer-sqrt", "num-traits 0.2.12", @@ -7057,7 +7057,7 @@ dependencies = [ [[package]] name = "sp-authority-discovery" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" +source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" dependencies = [ "parity-scale-codec", "sp-api", @@ -7069,7 +7069,7 @@ dependencies = [ [[package]] name = "sp-authorship" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" +source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" dependencies = [ "parity-scale-codec", "sp-inherents", @@ -7080,7 +7080,7 @@ dependencies = [ [[package]] name = "sp-block-builder" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" +source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" dependencies = [ "parity-scale-codec", "sp-api", @@ -7092,7 +7092,7 @@ dependencies = [ [[package]] name = "sp-blockchain" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" +source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" dependencies = [ "derive_more 0.99.8", "log 0.4.8", @@ -7108,7 +7108,7 @@ dependencies = [ [[package]] name = "sp-chain-spec" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" +source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" dependencies = [ "serde", "serde_json", @@ -7117,7 +7117,7 @@ dependencies = [ [[package]] name = "sp-consensus" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" +source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" dependencies = [ "derive_more 0.99.8", "futures 0.3.5", @@ -7141,7 +7141,7 @@ dependencies = [ [[package]] name = "sp-consensus-aura" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" +source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" dependencies = [ "parity-scale-codec", "sp-api", @@ -7155,7 +7155,7 @@ dependencies = [ [[package]] name = "sp-consensus-babe" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" +source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" dependencies = [ "merlin", "parity-scale-codec", @@ -7174,7 +7174,7 @@ dependencies = [ [[package]] name = "sp-consensus-slots" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" +source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" dependencies = [ "parity-scale-codec", "sp-runtime", @@ -7183,7 +7183,7 @@ dependencies = [ [[package]] name = "sp-consensus-vrf" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" +source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" dependencies = [ "parity-scale-codec", "schnorrkel", @@ -7195,7 +7195,7 @@ dependencies = [ [[package]] name = "sp-core" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" +source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" dependencies = [ "base58", "blake2-rfc", @@ -7238,7 +7238,7 @@ dependencies = [ [[package]] name = "sp-database" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" +source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" dependencies = [ "kvdb", "parking_lot 0.10.2", @@ -7247,7 +7247,7 @@ dependencies = [ [[package]] name = "sp-debug-derive" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" +source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" dependencies = [ "proc-macro2 1.0.18", "quote 1.0.7", @@ -7257,7 +7257,7 @@ dependencies = [ [[package]] name = "sp-externalities" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" +source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" dependencies = [ "environmental", "parity-scale-codec", @@ -7268,7 +7268,7 @@ dependencies = [ [[package]] name = "sp-finality-grandpa" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" +source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" dependencies = [ "finality-grandpa", "log 0.4.8", @@ -7284,7 +7284,7 @@ dependencies = [ [[package]] name = "sp-finality-tracker" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" +source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" dependencies = [ "parity-scale-codec", "sp-inherents", @@ -7294,7 +7294,7 @@ dependencies = [ [[package]] name = "sp-inherents" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" +source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" dependencies = [ "derive_more 0.99.8", "parity-scale-codec", @@ -7306,7 +7306,7 @@ dependencies = [ [[package]] name = "sp-io" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" +source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" dependencies = [ "futures 0.3.5", "hash-db", @@ -7327,7 +7327,7 @@ dependencies = [ [[package]] name = "sp-keyring" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" +source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" dependencies = [ "lazy_static", "sp-core", @@ -7338,7 +7338,7 @@ dependencies = [ [[package]] name = "sp-npos-elections" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" +source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" dependencies = [ "parity-scale-codec", "serde", @@ -7350,7 +7350,7 @@ dependencies = [ [[package]] name = "sp-npos-elections-compact" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" +source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -7361,7 +7361,7 @@ dependencies = [ [[package]] name = "sp-offchain" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" +source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" dependencies = [ "sp-api", "sp-core", @@ -7371,7 +7371,7 @@ dependencies = [ [[package]] name = "sp-panic-handler" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" +source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" dependencies = [ "backtrace", "log 0.4.8", @@ -7380,7 +7380,7 @@ dependencies = [ [[package]] name = "sp-rpc" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" +source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" dependencies = [ "serde", "sp-core", @@ -7389,7 +7389,7 @@ dependencies = [ [[package]] name = "sp-runtime" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" +source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" dependencies = [ "either", "hash256-std-hasher", @@ -7411,7 +7411,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" +source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" dependencies = [ "parity-scale-codec", "primitive-types", @@ -7426,7 +7426,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" +source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" dependencies = [ "Inflector", "proc-macro-crate", @@ -7438,7 +7438,7 @@ dependencies = [ [[package]] name = "sp-serializer" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" +source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" dependencies = [ "serde", "serde_json", @@ -7447,7 +7447,7 @@ dependencies = [ [[package]] name = "sp-session" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" +source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" dependencies = [ "parity-scale-codec", "sp-api", @@ -7460,7 +7460,7 @@ dependencies = [ [[package]] name = "sp-staking" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" +source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" dependencies = [ "parity-scale-codec", "sp-runtime", @@ -7470,7 +7470,7 @@ dependencies = [ [[package]] name = "sp-state-machine" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" +source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" dependencies = [ "hash-db", "itertools 0.9.0", @@ -7491,12 +7491,12 @@ dependencies = [ [[package]] name = "sp-std" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" +source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" [[package]] name = "sp-storage" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" +source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" dependencies = [ "impl-serde 0.2.3", "ref-cast", @@ -7508,7 +7508,7 @@ dependencies = [ [[package]] name = "sp-timestamp" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" +source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -7522,7 +7522,7 @@ dependencies = [ [[package]] name = "sp-tracing" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" +source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" dependencies = [ "log 0.4.8", "rental", @@ -7532,7 +7532,7 @@ dependencies = [ [[package]] name = "sp-transaction-pool" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" +source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" dependencies = [ "derive_more 0.99.8", "futures 0.3.5", @@ -7548,7 +7548,7 @@ dependencies = [ [[package]] name = "sp-trie" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" +source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" dependencies = [ "hash-db", "memory-db", @@ -7562,7 +7562,7 @@ dependencies = [ [[package]] name = "sp-utils" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" +source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" dependencies = [ "futures 0.3.5", "futures-core", @@ -7574,7 +7574,7 @@ dependencies = [ [[package]] name = "sp-version" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" +source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" dependencies = [ "impl-serde 0.2.3", "parity-scale-codec", @@ -7586,7 +7586,7 @@ dependencies = [ [[package]] name = "sp-wasm-interface" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" +source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -7726,7 +7726,7 @@ dependencies = [ [[package]] name = "substrate-browser-utils" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" +source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" dependencies = [ "chrono", "clear_on_drop", @@ -7753,7 +7753,7 @@ dependencies = [ [[package]] name = "substrate-build-script-utils" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" +source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" dependencies = [ "platforms", ] @@ -7761,7 +7761,7 @@ dependencies = [ [[package]] name = "substrate-frame-rpc-system" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" +source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" dependencies = [ "frame-system-rpc-runtime-api", "futures 0.3.5", @@ -7784,7 +7784,7 @@ dependencies = [ [[package]] name = "substrate-prometheus-endpoint" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" +source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" dependencies = [ "async-std", "derive_more 0.99.8", @@ -7798,7 +7798,7 @@ dependencies = [ [[package]] name = "substrate-test-client" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" +source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" dependencies = [ "futures 0.1.29", "futures 0.3.5", @@ -7822,7 +7822,7 @@ dependencies = [ [[package]] name = "substrate-test-runtime" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" +source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" dependencies = [ "cfg-if", "frame-executive", @@ -7862,7 +7862,7 @@ dependencies = [ [[package]] name = "substrate-test-runtime-client" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" +source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" dependencies = [ "futures 0.3.5", "parity-scale-codec", @@ -7883,7 +7883,7 @@ dependencies = [ [[package]] name = "substrate-wasm-builder-runner" version = "1.0.6" -source = "git+https://github.com/paritytech/substrate#b851b755dbf338c69d3bae8c1215d8e7d8010b77" +source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" [[package]] name = "substrate-wasm-builder-runner" diff --git a/runtime/common/src/claims.rs b/runtime/common/src/claims.rs index 8811e04943..7c3f4e42e1 100644 --- a/runtime/common/src/claims.rs +++ b/runtime/common/src/claims.rs @@ -539,10 +539,10 @@ impl sp_runtime::traits::ValidateUnsigned for Module { /// otherwise free to place on chain. #[derive(Encode, Decode, Clone, Eq, PartialEq)] pub struct PrevalidateAttests(sp_std::marker::PhantomData) where - ::Call: IsSubType, T>; + ::Call: IsSubType>; impl Debug for PrevalidateAttests where - ::Call: IsSubType, T> + ::Call: IsSubType> { #[cfg(feature = "std")] fn fmt(&self, f: &mut sp_std::fmt::Formatter) -> sp_std::fmt::Result { @@ -556,7 +556,7 @@ impl Debug for PrevalidateAttests where } impl PrevalidateAttests where - ::Call: IsSubType, T> + ::Call: IsSubType> { /// Create new `SignedExtension` to check runtime version. pub fn new() -> Self { @@ -565,7 +565,7 @@ impl PrevalidateAttests where } impl SignedExtension for PrevalidateAttests where - ::Call: IsSubType, T> + ::Call: IsSubType> { type AccountId = T::AccountId; type Call = ::Call; diff --git a/runtime/common/src/parachains.rs b/runtime/common/src/parachains.rs index 819ce685cc..0d2c900002 100644 --- a/runtime/common/src/parachains.rs +++ b/runtime/common/src/parachains.rs @@ -1605,7 +1605,7 @@ pub enum DoubleVoteValidityError { } impl SignedExtension for ValidateDoubleVoteReports where - ::Call: IsSubType, T> + ::Call: IsSubType> { const IDENTIFIER: &'static str = "ValidateDoubleVoteReports"; type AccountId = T::AccountId; diff --git a/runtime/common/src/registrar.rs b/runtime/common/src/registrar.rs index 248371d256..3a20f08f5b 100644 --- a/runtime/common/src/registrar.rs +++ b/runtime/common/src/registrar.rs @@ -561,10 +561,10 @@ impl ActiveParas for Module { /// Ensure that parathread selections happen prioritized by fees. #[derive(Encode, Decode, Clone, Eq, PartialEq)] pub struct LimitParathreadCommits(sp_std::marker::PhantomData) where - ::Call: IsSubType, T>; + ::Call: IsSubType>; impl LimitParathreadCommits where - ::Call: IsSubType, T> + ::Call: IsSubType> { /// Create a new `LimitParathreadCommits` struct. pub fn new() -> Self { @@ -573,7 +573,7 @@ impl LimitParathreadCommits where } impl sp_std::fmt::Debug for LimitParathreadCommits where - ::Call: IsSubType, T> + ::Call: IsSubType> { fn fmt(&self, f: &mut sp_std::fmt::Formatter) -> sp_std::fmt::Result { write!(f, "LimitParathreadCommits") @@ -590,7 +590,7 @@ pub enum ValidityError { } impl SignedExtension for LimitParathreadCommits where - ::Call: IsSubType, T> + ::Call: IsSubType> { const IDENTIFIER: &'static str = "LimitParathreadCommits"; type AccountId = T::AccountId; diff --git a/runtime/kusama/src/lib.rs b/runtime/kusama/src/lib.rs index 521791982c..4b238ba677 100644 --- a/runtime/kusama/src/lib.rs +++ b/runtime/kusama/src/lib.rs @@ -928,7 +928,7 @@ construct_runtime! { RandomnessCollectiveFlip: randomness_collective_flip::{Module, Storage}, // Must be before session. - Babe: babe::{Module, Call, Storage, Config, Inherent(Timestamp), ValidateUnsigned}, + Babe: babe::{Module, Call, Storage, Config, Inherent, ValidateUnsigned}, Timestamp: timestamp::{Module, Call, Storage, Inherent}, Indices: indices::{Module, Call, Storage, Config, Event}, diff --git a/runtime/polkadot/src/lib.rs b/runtime/polkadot/src/lib.rs index 50405f537c..de34a6f061 100644 --- a/runtime/polkadot/src/lib.rs +++ b/runtime/polkadot/src/lib.rs @@ -934,7 +934,7 @@ construct_runtime! { Scheduler: scheduler::{Module, Call, Storage, Event}, // Must be before session. - Babe: babe::{Module, Call, Storage, Config, Inherent(Timestamp), ValidateUnsigned}, + Babe: babe::{Module, Call, Storage, Config, Inherent, ValidateUnsigned}, Timestamp: timestamp::{Module, Call, Storage, Inherent}, Indices: indices::{Module, Call, Storage, Config, Event}, diff --git a/runtime/test-runtime/src/lib.rs b/runtime/test-runtime/src/lib.rs index bd3e6459f5..90b0562521 100644 --- a/runtime/test-runtime/src/lib.rs +++ b/runtime/test-runtime/src/lib.rs @@ -513,7 +513,7 @@ construct_runtime! { RandomnessCollectiveFlip: randomness_collective_flip::{Module, Storage}, // Must be before session. - Babe: babe::{Module, Call, Storage, Config, Inherent(Timestamp)}, + Babe: babe::{Module, Call, Storage, Config, Inherent}, Timestamp: timestamp::{Module, Call, Storage, Inherent}, Indices: indices::{Module, Call, Storage, Config, Event}, diff --git a/runtime/westend/src/lib.rs b/runtime/westend/src/lib.rs index 37844284f4..1b8c365c28 100644 --- a/runtime/westend/src/lib.rs +++ b/runtime/westend/src/lib.rs @@ -692,7 +692,7 @@ construct_runtime! { RandomnessCollectiveFlip: randomness_collective_flip::{Module, Storage}, // Must be before session. - Babe: babe::{Module, Call, Storage, Config, Inherent(Timestamp), ValidateUnsigned}, + Babe: babe::{Module, Call, Storage, Config, Inherent, ValidateUnsigned}, Timestamp: timestamp::{Module, Call, Storage, Inherent}, Indices: indices::{Module, Call, Storage, Config, Event}, -- GitLab From 8348cc4cb0aea625cd6868dcc4faa6633d0f8d9e Mon Sep 17 00:00:00 2001 From: Robert Habermeier Date: Mon, 6 Jul 2020 11:16:17 -0400 Subject: [PATCH 036/192] Implement the Statement Distribution Subsystem (#1326) * set up data types and control flow for statement distribution * add some set-like methods to View * implement sending to peers * start fixing equivocation handling * Add a section to the statement distribution subsystem on equivocations and flood protection * fix typo and amend wording * implement flood protection * have peer knowledge tracker follow when peer first learns about a candidate * send dependents after circulating * add another TODO * trigger send in one more place * refactors from review * send new statements to candidate backing * instantiate active head data with runtime API values * track our view changes and peer view changes * apply a benefit to peers who send us statements we want * remove unneeded TODO * add some comments and improve Hash implementation * start tests and fix `note_statement` * test active_head seconding logic * test that the per-peer tracking logic works * test per-peer knowledge tracker * test that peer view updates lead to messages being sent * test statement circulation * address review comments * have view set methods return references --- Cargo.lock | 22 + Cargo.toml | 1 + .../network/statement-distribution/Cargo.toml | 26 + .../network/statement-distribution/src/lib.rs | 1380 +++++++++++++++++ node/primitives/src/lib.rs | 40 +- node/subsystem/src/messages.rs | 5 +- primitives/src/parachain.rs | 14 +- .../node/backing/statement-distribution.md | 23 +- 8 files changed, 1496 insertions(+), 15 deletions(-) create mode 100644 node/network/statement-distribution/Cargo.toml create mode 100644 node/network/statement-distribution/src/lib.rs diff --git a/Cargo.lock b/Cargo.lock index 6adfa89b26..8c691f25c1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4831,6 +4831,28 @@ dependencies = [ "westend-runtime", ] +[[package]] +name = "polkadot-statement-distribution" +version = "0.1.0" +dependencies = [ + "arrayvec 0.5.1", + "assert_matches", + "futures 0.3.5", + "futures-timer 3.0.2", + "indexmap", + "log 0.4.8", + "parity-scale-codec", + "parking_lot 0.10.2", + "polkadot-node-primitives", + "polkadot-node-subsystem", + "polkadot-primitives", + "polkadot-subsystem-test-helpers", + "sp-keyring", + "sp-runtime", + "sp-staking", + "streamunordered", +] + [[package]] name = "polkadot-statement-table" version = "0.8.14" diff --git a/Cargo.toml b/Cargo.toml index 5bf037cfc8..622355ecb3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -45,6 +45,7 @@ members = [ "node/core/proposer", "node/network/bridge", + "node/network/statement-distribution", "node/overseer", "node/primitives", "node/service", diff --git a/node/network/statement-distribution/Cargo.toml b/node/network/statement-distribution/Cargo.toml new file mode 100644 index 0000000000..2f8da8ee3d --- /dev/null +++ b/node/network/statement-distribution/Cargo.toml @@ -0,0 +1,26 @@ +[package] +name = "polkadot-statement-distribution" +version = "0.1.0" +authors = ["Parity Technologies "] +description = "Statement Distribution Subsystem" +edition = "2018" + +[dependencies] +futures = "0.3.5" +log = "0.4.8" +futures-timer = "3.0.2" +streamunordered = "0.5.1" +polkadot-primitives = { path = "../../../primitives" } +node-primitives = { package = "polkadot-node-primitives", path = "../../primitives" } +parity-scale-codec = "1.3.0" +sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "master" } +sp-staking = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +polkadot-subsystem = { package = "polkadot-node-subsystem", path = "../../subsystem" } +arrayvec = "0.5.1" +indexmap = "1.4.0" + +[dev-dependencies] +parking_lot = "0.10.0" +subsystem-test = { package = "polkadot-subsystem-test-helpers", path = "../../test-helpers/subsystem" } +assert_matches = "1.3.0" +sp-keyring = { git = "https://github.com/paritytech/substrate", branch = "master" } diff --git a/node/network/statement-distribution/src/lib.rs b/node/network/statement-distribution/src/lib.rs new file mode 100644 index 0000000000..f3d2653266 --- /dev/null +++ b/node/network/statement-distribution/src/lib.rs @@ -0,0 +1,1380 @@ +// Copyright 2020 Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Polkadot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . + +//! The Statement Distribution Subsystem. +//! +//! This is responsible for distributing signed statements about candidate +//! validity amongst validators. + +use polkadot_subsystem::{ + Subsystem, SubsystemResult, SubsystemContext, SpawnedSubsystem, + FromOverseer, OverseerSignal, +}; +use polkadot_subsystem::messages::{ + AllMessages, NetworkBridgeMessage, NetworkBridgeEvent, StatementDistributionMessage, + PeerId, ReputationChange as Rep, CandidateBackingMessage, RuntimeApiMessage, + RuntimeApiRequest, +}; +use node_primitives::{ProtocolId, View, SignedFullStatement}; +use polkadot_primitives::Hash; +use polkadot_primitives::parachain::{ + CompactStatement, ValidatorIndex, ValidatorId, SigningContext, ValidatorSignature, +}; +use parity_scale_codec::{Encode, Decode}; + +use futures::prelude::*; +use futures::channel::oneshot; +use indexmap::IndexSet; + +use std::collections::{HashMap, HashSet}; + +const PROTOCOL_V1: ProtocolId = *b"sdn1"; + +const COST_UNEXPECTED_STATEMENT: Rep = Rep::new(-100, "Unexpected Statement"); +const COST_INVALID_SIGNATURE: Rep = Rep::new(-500, "Invalid Statement Signature"); +const COST_INVALID_MESSAGE: Rep = Rep::new(-500, "Invalid message"); +const COST_DUPLICATE_STATEMENT: Rep = Rep::new(-250, "Statement sent more than once by peer"); +const COST_APPARENT_FLOOD: Rep = Rep::new(-1000, "Peer appears to be flooding us with statements"); + +const BENEFIT_VALID_STATEMENT: Rep = Rep::new(5, "Peer provided a valid statement"); +const BENEFIT_VALID_STATEMENT_FIRST: Rep = Rep::new( + 25, + "Peer was the first to provide a valid statement", +); + +/// The maximum amount of candidates each validator is allowed to second at any relay-parent. +/// Short for "Validator Candidate Threshold". +/// +/// This is the amount of candidates we keep per validator at any relay-parent. +/// Typically we will only keep 1, but when a validator equivocates we will need to track 2. +const VC_THRESHOLD: usize = 2; + +/// The statement distribution subsystem. +pub struct StatementDistribution; + +impl Subsystem for StatementDistribution + where C: SubsystemContext +{ + fn start(self, ctx: C) -> SpawnedSubsystem { + // Swallow error because failure is fatal to the node and we log with more precision + // within `run`. + SpawnedSubsystem(run(ctx).map(|_| ()).boxed()) + } +} + +fn network_update_message(n: NetworkBridgeEvent) -> AllMessages { + AllMessages::StatementDistribution(StatementDistributionMessage::NetworkBridgeUpdate(n)) +} + +/// Tracks our impression of a single peer's view of the candidates a validator has seconded +/// for a given relay-parent. +/// +/// It is expected to receive at most `VC_THRESHOLD` from us and be aware of at most `VC_THRESHOLD` +/// via other means. +#[derive(Default)] +struct VcPerPeerTracker { + local_observed: arrayvec::ArrayVec<[Hash; VC_THRESHOLD]>, + remote_observed: arrayvec::ArrayVec<[Hash; VC_THRESHOLD]>, +} + +impl VcPerPeerTracker { + // Note that the remote should now be aware that a validator has seconded a given candidate (by hash) + // based on a message that we have sent it from our local pool. + fn note_local(&mut self, h: Hash) { + if !note_hash(&mut self.local_observed, h) { + log::warn!("Statement distribution is erroneously attempting to distribute more \ + than {} candidate(s) per validator index. Ignoring", VC_THRESHOLD); + } + } + + // Note that the remote should now be aware that a validator has seconded a given candidate (by hash) + // based on a message that it has sent us. + // + // Returns `true` if the peer was allowed to send us such a message, `false` otherwise. + fn note_remote(&mut self, h: Hash) -> bool { + note_hash(&mut self.remote_observed, h) + } +} + +fn note_hash( + observed: &mut arrayvec::ArrayVec<[Hash; VC_THRESHOLD]>, + h: Hash, +) -> bool { + if observed.contains(&h) { return true; } + + if observed.is_full() { + false + } else { + observed.try_push(h).expect("length of storage guarded above; \ + only panics if length exceeds capacity; qed"); + + true + } +} + +/// knowledge that a peer has about goings-on in a relay parent. +#[derive(Default)] +struct PeerRelayParentKnowledge { + /// candidates that the peer is aware of. This indicates that we can + /// send other statements pertaining to that candidate. + known_candidates: HashSet, + /// fingerprints of all statements a peer should be aware of: those that + /// were sent to the peer by us. + sent_statements: HashSet<(CompactStatement, ValidatorIndex)>, + /// fingerprints of all statements a peer should be aware of: those that + /// were sent to us by the peer. + received_statements: HashSet<(CompactStatement, ValidatorIndex)>, + /// How many candidates this peer is aware of for each given validator index. + seconded_counts: HashMap, + /// How many statements we've received for each candidate that we're aware of. + received_message_count: HashMap, +} + +impl PeerRelayParentKnowledge { + /// Attempt to update our view of the peer's knowledge with this statement's fingerprint based + /// on something that we would like to send to the peer. + /// + /// This returns `None` if the peer cannot accept this statement, without altering internal + /// state. + /// + /// If the peer can accept the statement, this returns `Some` and updates the internal state. + /// Once the knowledge has incorporated a statement, it cannot be incorporated again. + /// + /// This returns `Some(true)` if this is the first time the peer has become aware of a + /// candidate with the given hash. + fn send(&mut self, fingerprint: &(CompactStatement, ValidatorIndex)) -> Option { + let already_known = self.sent_statements.contains(fingerprint) + || self.received_statements.contains(fingerprint); + + if already_known { + return None; + } + + let new_known = match fingerprint.0 { + CompactStatement::Candidate(ref h) => { + self.seconded_counts.entry(fingerprint.1) + .or_default() + .note_local(h.clone()); + + self.known_candidates.insert(h.clone()) + }, + CompactStatement::Valid(ref h) | CompactStatement::Invalid(ref h) => { + // The peer can only accept Valid and Invalid statements for which it is aware + // of the corresponding candidate. + if !self.known_candidates.contains(h) { + return None; + } + + false + } + }; + + self.sent_statements.insert(fingerprint.clone()); + + Some(new_known) + } + + /// Attempt to update our view of the peer's knowledge with this statement's fingerprint based on + /// a message we are receiving from the peer. + /// + /// Provide the maximum message count that we can receive per candidate. In practice we should + /// not receive more statements for any one candidate than there are members in the group assigned + /// to that para, but this maximum needs to be lenient to account for equivocations that may be + /// cross-group. As such, a maximum of 2 * n_validators is recommended. + /// + /// This returns an error if the peer should not have sent us this message according to protocol + /// rules for flood protection. + /// + /// If this returns `Ok`, the internal state has been altered. After `receive`ing a new + /// candidate, we are then cleared to send the peer further statements about that candidate. + /// + /// This returns `Ok(true)` if this is the first time the peer has become aware of a + /// candidate with given hash. + fn receive( + &mut self, + fingerprint: &(CompactStatement, ValidatorIndex), + max_message_count: usize, + ) -> Result { + // We don't check `sent_statements` because a statement could be in-flight from both + // sides at the same time. + if self.received_statements.contains(fingerprint) { + return Err(COST_DUPLICATE_STATEMENT); + } + + let candidate_hash = match fingerprint.0 { + CompactStatement::Candidate(ref h) => { + let allowed_remote = self.seconded_counts.entry(fingerprint.1) + .or_insert_with(Default::default) + .note_remote(h.clone()); + + if !allowed_remote { + return Err(COST_UNEXPECTED_STATEMENT); + } + + h + } + CompactStatement::Valid(ref h)| CompactStatement::Invalid(ref h) => { + if !self.known_candidates.contains(&h) { + return Err(COST_UNEXPECTED_STATEMENT); + } + + h + } + }; + + { + let received_per_candidate = self.received_message_count + .entry(candidate_hash.clone()) + .or_insert(0); + + if *received_per_candidate >= max_message_count { + return Err(COST_APPARENT_FLOOD); + } + + *received_per_candidate += 1; + } + + self.received_statements.insert(fingerprint.clone()); + Ok(self.known_candidates.insert(candidate_hash.clone())) + } +} + +struct PeerData { + view: View, + view_knowledge: HashMap, +} + +impl PeerData { + /// Attempt to update our view of the peer's knowledge with this statement's fingerprint based + /// on something that we would like to send to the peer. + /// + /// This returns `None` if the peer cannot accept this statement, without altering internal + /// state. + /// + /// If the peer can accept the statement, this returns `Some` and updates the internal state. + /// Once the knowledge has incorporated a statement, it cannot be incorporated again. + /// + /// This returns `Some(true)` if this is the first time the peer has become aware of a + /// candidate with the given hash. + fn send( + &mut self, + relay_parent: &Hash, + fingerprint: &(CompactStatement, ValidatorIndex), + ) -> Option { + self.view_knowledge.get_mut(relay_parent).map_or(None, |k| k.send(fingerprint)) + } + + /// Attempt to update our view of the peer's knowledge with this statement's fingerprint based on + /// a message we are receiving from the peer. + /// + /// Provide the maximum message count that we can receive per candidate. In practice we should + /// not receive more statements for any one candidate than there are members in the group assigned + /// to that para, but this maximum needs to be lenient to account for equivocations that may be + /// cross-group. As such, a maximum of 2 * n_validators is recommended. + /// + /// This returns an error if the peer should not have sent us this message according to protocol + /// rules for flood protection. + /// + /// If this returns `Ok`, the internal state has been altered. After `receive`ing a new + /// candidate, we are then cleared to send the peer further statements about that candidate. + /// + /// This returns `Ok(true)` if this is the first time the peer has become aware of a + /// candidate with given hash. + fn receive( + &mut self, + relay_parent: &Hash, + fingerprint: &(CompactStatement, ValidatorIndex), + max_message_count: usize, + ) -> Result { + self.view_knowledge.get_mut(relay_parent).ok_or(COST_UNEXPECTED_STATEMENT)? + .receive(fingerprint, max_message_count) + } +} + +// A statement stored while a relay chain head is active. +#[derive(Debug)] +struct StoredStatement { + comparator: StoredStatementComparator, + statement: SignedFullStatement, +} + +// A value used for comparison of stored statements to each other. +// +// The compact version of the statement, the validator index, and the signature of the validator +// is enough to differentiate between all types of equivocations, as long as the signature is +// actually checked to be valid. The same statement with 2 signatures and 2 statements with +// different (or same) signatures wll all be correctly judged to be unequal with this comparator. +#[derive(PartialEq, Eq, Hash, Clone, Debug)] +struct StoredStatementComparator { + compact: CompactStatement, + validator_index: ValidatorIndex, + signature: ValidatorSignature, +} + +impl StoredStatement { + fn compact(&self) -> &CompactStatement { + &self.comparator.compact + } + + fn fingerprint(&self) -> (CompactStatement, ValidatorIndex) { + (self.comparator.compact.clone(), self.statement.validator_index()) + } +} + +impl std::borrow::Borrow for StoredStatement { + fn borrow(&self) -> &StoredStatementComparator { + &self.comparator + } +} + +impl std::hash::Hash for StoredStatement { + fn hash(&self, state: &mut H) { + self.comparator.hash(state) + } +} + +impl std::cmp::PartialEq for StoredStatement { + fn eq(&self, other: &Self) -> bool { + &self.comparator == &other.comparator + } +} + +impl std::cmp::Eq for StoredStatement {} + +#[derive(Debug)] +enum NotedStatement<'a> { + NotUseful, + Fresh(&'a StoredStatement), + UsefulButKnown +} + +struct ActiveHeadData { + /// All candidates we are aware of for this head, keyed by hash. + candidates: HashSet, + /// Stored statements for circulation to peers. + /// + /// These are iterable in insertion order, and `Seconded` statements are always + /// accepted before dependent statements. + statements: IndexSet, + /// The validators at this head. + validators: Vec, + /// The session index this head is at. + session_index: sp_staking::SessionIndex, + /// How many `Seconded` statements we've seen per validator. + seconded_counts: HashMap, +} + +impl ActiveHeadData { + fn new(validators: Vec, session_index: sp_staking::SessionIndex) -> Self { + ActiveHeadData { + candidates: Default::default(), + statements: Default::default(), + validators, + session_index, + seconded_counts: Default::default(), + } + } + + /// Note the given statement. + /// + /// If it was not already known and can be accepted, returns `NotedStatement::Fresh`, + /// with a handle to the statement. + /// + /// If it can be accepted, but we already know it, returns `NotedStatement::UsefulButKnown`. + /// + /// We accept up to `VC_THRESHOLD` (2 at time of writing) `Seconded` statements + /// per validator. These will be the first ones we see. The statement is assumed + /// to have been checked, including that the validator index is not out-of-bounds and + /// the signature is valid. + /// + /// Any other statements or those that reference a candidate we are not aware of cannot be accepted + /// and will return `NotedStatement::NotUseful`. + fn note_statement(&mut self, statement: SignedFullStatement) -> NotedStatement { + let validator_index = statement.validator_index(); + let comparator = StoredStatementComparator { + compact: statement.payload().to_compact(), + validator_index, + signature: statement.signature().clone(), + }; + + let stored = StoredStatement { + comparator: comparator.clone(), + statement, + }; + + match comparator.compact { + CompactStatement::Candidate(h) => { + let seconded_so_far = self.seconded_counts.entry(validator_index).or_insert(0); + if *seconded_so_far >= VC_THRESHOLD { + return NotedStatement::NotUseful; + } + + self.candidates.insert(h); + if self.statements.insert(stored) { + *seconded_so_far += 1; + + // This will always return `Some` because it was just inserted. + NotedStatement::Fresh(self.statements.get(&comparator) + .expect("Statement was just inserted; qed")) + } else { + NotedStatement::UsefulButKnown + } + } + CompactStatement::Valid(h) | CompactStatement::Invalid(h) => { + if !self.candidates.contains(&h) { + return NotedStatement::NotUseful; + } + + if self.statements.insert(stored) { + // This will always return `Some` because it was just inserted. + NotedStatement::Fresh(self.statements.get(&comparator) + .expect("Statement was just inserted; qed")) + } else { + NotedStatement::UsefulButKnown + } + } + } + } + + /// Get an iterator over all statements for the active head. Seconded statements come first. + fn statements(&self) -> impl Iterator + '_ { + self.statements.iter() + } + + /// Get an iterator over all statements for the active head that are for a particular candidate. + fn statements_about(&self, candidate_hash: Hash) + -> impl Iterator + '_ + { + self.statements().filter(move |s| s.compact().candidate_hash() == &candidate_hash) + } +} + +/// Check a statement signature under this parent hash. +fn check_statement_signature( + head: &ActiveHeadData, + relay_parent: Hash, + statement: &SignedFullStatement, +) -> Result<(), ()> { + let signing_context = SigningContext { + session_index: head.session_index, + parent_hash: relay_parent, + }; + + head.validators.get(statement.validator_index() as usize) + .ok_or(()) + .and_then(|v| statement.check_signature(&signing_context, v)) +} + +#[derive(Encode, Decode)] +enum WireMessage { + /// relay-parent, full statement. + #[codec(index = "0")] + Statement(Hash, SignedFullStatement), +} + +/// Places the statement in storage if it is new, and then +/// circulates the statement to all peers who have not seen it yet, and +/// sends all statements dependent on that statement to peers who could previously not receive +/// them but now can. +async fn circulate_statement_and_dependents( + peers: &mut HashMap, + active_heads: &mut HashMap, + ctx: &mut impl SubsystemContext, + relay_parent: Hash, + statement: SignedFullStatement, +) -> SubsystemResult<()> { + if let Some(active_head)= active_heads.get_mut(&relay_parent) { + + // First circulate the statement directly to all peers needing it. + // The borrow of `active_head` needs to encompass only this (Rust) statement. + let outputs: Option<(Hash, Vec)> = { + match active_head.note_statement(statement) { + NotedStatement::Fresh(stored) => Some(( + stored.compact().candidate_hash().clone(), + circulate_statement(peers, ctx, relay_parent, stored).await?, + )), + _ => None, + } + }; + + // Now send dependent statements to all peers needing them, if any. + if let Some((candidate_hash, peers_needing_dependents)) = outputs { + for peer in peers_needing_dependents { + if let Some(peer_data) = peers.get_mut(&peer) { + // defensive: the peer data should always be some because the iterator + // of peers is derived from the set of peers. + send_statements_about( + peer, + peer_data, + ctx, + relay_parent, + candidate_hash, + &*active_head + ).await?; + } + } + } + } + + Ok(()) +} + +/// Circulates a statement to all peers who have not seen it yet, and returns +/// an iterator over peers who need to have dependent statements sent. +async fn circulate_statement( + peers: &mut HashMap, + ctx: &mut impl SubsystemContext, + relay_parent: Hash, + stored: &StoredStatement, +) -> SubsystemResult> { + let fingerprint = stored.fingerprint(); + + let mut peers_to_send = HashMap::new(); + + for (peer, data) in peers.iter_mut() { + if let Some(new_known) = data.send(&relay_parent, &fingerprint) { + peers_to_send.insert(peer.clone(), new_known); + } + } + + // Send all these peers the initial statement. + if !peers_to_send.is_empty() { + let payload = WireMessage::Statement(relay_parent, stored.statement.clone()).encode(); + ctx.send_message(AllMessages::NetworkBridge(NetworkBridgeMessage::SendMessage( + peers_to_send.keys().cloned().collect(), + PROTOCOL_V1, + payload, + ))).await?; + } + + Ok(peers_to_send.into_iter().filter_map(|(peer, needs_dependent)| if needs_dependent { + Some(peer) + } else { + None + }).collect()) +} + +/// Send all statements about a given candidate hash to a peer. +async fn send_statements_about( + peer: PeerId, + peer_data: &mut PeerData, + ctx: &mut impl SubsystemContext, + relay_parent: Hash, + candidate_hash: Hash, + active_head: &ActiveHeadData, +) -> SubsystemResult<()> { + for statement in active_head.statements_about(candidate_hash) { + if peer_data.send(&relay_parent, &statement.fingerprint()).is_some() { + let payload = WireMessage::Statement( + relay_parent, + statement.statement.clone(), + ).encode(); + + ctx.send_message(AllMessages::NetworkBridge(NetworkBridgeMessage::SendMessage( + vec![peer.clone()], + PROTOCOL_V1, + payload, + ))).await?; + } + } + + Ok(()) +} + +/// Send all statements at a given relay-parent to a peer. +async fn send_statements( + peer: PeerId, + peer_data: &mut PeerData, + ctx: &mut impl SubsystemContext, + relay_parent: Hash, + active_head: &ActiveHeadData +) -> SubsystemResult<()> { + for statement in active_head.statements() { + if peer_data.send(&relay_parent, &statement.fingerprint()).is_some() { + let payload = WireMessage::Statement( + relay_parent, + statement.statement.clone(), + ).encode(); + + ctx.send_message(AllMessages::NetworkBridge(NetworkBridgeMessage::SendMessage( + vec![peer.clone()], + PROTOCOL_V1, + payload, + ))).await?; + } + } + + Ok(()) +} + +async fn report_peer( + ctx: &mut impl SubsystemContext, + peer: PeerId, + rep: Rep, +) -> SubsystemResult<()> { + ctx.send_message(AllMessages::NetworkBridge( + NetworkBridgeMessage::ReportPeer(peer, rep) + )).await +} + +// Handle an incoming wire message. Returns a reference to a newly-stored statement +// if we were not already aware of it, along with the corresponding relay-parent. +// +// This function checks the signature and ensures the statement is compatible with our +// view. +async fn handle_incoming_message<'a>( + peer: PeerId, + peer_data: &mut PeerData, + our_view: &View, + active_heads: &'a mut HashMap, + ctx: &mut impl SubsystemContext, + message: Vec, +) -> SubsystemResult> { + let (relay_parent, statement) = match WireMessage::decode(&mut &message[..]) { + Err(_) => return report_peer(ctx, peer, COST_INVALID_MESSAGE).await.map(|_| None), + Ok(WireMessage::Statement(r, s)) => (r, s), + }; + + if !our_view.contains(&relay_parent) { + return report_peer(ctx, peer, COST_UNEXPECTED_STATEMENT).await.map(|_| None); + } + + let active_head = match active_heads.get_mut(&relay_parent) { + Some(h) => h, + None => { + // This should never be out-of-sync with our view if the view updates + // correspond to actual `StartWork` messages. So we just log and ignore. + log::warn!("Our view out-of-sync with active heads. Head {} not found", relay_parent); + return Ok(None); + } + }; + + // check the signature on the statement. + if let Err(()) = check_statement_signature(&active_head, relay_parent, &statement) { + return report_peer(ctx, peer, COST_INVALID_SIGNATURE).await.map(|_| None); + } + + // Ensure the statement is stored in the peer data. + // + // Note that if the peer is sending us something that is not within their view, + // it will not be kept within their log. + let fingerprint = (statement.payload().to_compact(), statement.validator_index()); + let max_message_count = active_head.validators.len() * 2; + match peer_data.receive(&relay_parent, &fingerprint, max_message_count) { + Err(rep) => { + report_peer(ctx, peer, rep).await?; + return Ok(None) + } + Ok(true) => { + // Send the peer all statements concerning the candidate that we have, + // since it appears to have just learned about the candidate. + send_statements_about( + peer.clone(), + peer_data, + ctx, + relay_parent, + fingerprint.0.candidate_hash().clone(), + &*active_head, + ).await? + } + Ok(false) => {} + } + + // Note: `peer_data.receive` already ensures that the statement is not an unbounded equivocation + // or unpinned to a seconded candidate. So it is safe to place it into the storage. + match active_head.note_statement(statement) { + NotedStatement::NotUseful => Ok(None), + NotedStatement::UsefulButKnown => { + report_peer(ctx, peer, BENEFIT_VALID_STATEMENT).await?; + Ok(None) + } + NotedStatement::Fresh(statement) => { + report_peer(ctx, peer, BENEFIT_VALID_STATEMENT_FIRST).await?; + Ok(Some((relay_parent, statement))) + } + } +} + +/// Update a peer's view. Sends all newly unlocked statements based on the previous +async fn update_peer_view_and_send_unlocked( + peer: PeerId, + peer_data: &mut PeerData, + ctx: &mut impl SubsystemContext, + active_heads: &HashMap, + new_view: View, +) -> SubsystemResult<()> { + let old_view = std::mem::replace(&mut peer_data.view, new_view); + + // Remove entries for all relay-parents in the old view but not the new. + for removed in old_view.difference(&peer_data.view) { + let _ = peer_data.view_knowledge.remove(removed); + } + + // Add entries for all relay-parents in the new view but not the old. + // Furthermore, send all statements we have for those relay parents. + let new_view = peer_data.view.difference(&old_view).copied().collect::>(); + for new in new_view.iter().copied() { + peer_data.view_knowledge.insert(new, Default::default()); + + if let Some(active_head) = active_heads.get(&new) { + send_statements( + peer.clone(), + peer_data, + ctx, + new, + active_head, + ).await?; + } + } + + Ok(()) +} + +async fn handle_network_update( + peers: &mut HashMap, + active_heads: &mut HashMap, + ctx: &mut impl SubsystemContext, + our_view: &mut View, + update: NetworkBridgeEvent, +) -> SubsystemResult<()> { + match update { + NetworkBridgeEvent::PeerConnected(peer, _role) => { + peers.insert(peer, PeerData { + view: Default::default(), + view_knowledge: Default::default(), + }); + + Ok(()) + } + NetworkBridgeEvent::PeerDisconnected(peer) => { + peers.remove(&peer); + Ok(()) + } + NetworkBridgeEvent::PeerMessage(peer, message) => { + match peers.get_mut(&peer) { + Some(data) => { + let new_stored = handle_incoming_message( + peer, + data, + &*our_view, + active_heads, + ctx, + message, + ).await?; + + if let Some((relay_parent, new)) = new_stored { + // When we receive a new message from a peer, we forward it to the + // candidate backing subsystem. + let message = AllMessages::CandidateBacking( + CandidateBackingMessage::Statement(relay_parent, new.statement.clone()) + ); + ctx.send_message(message).await?; + } + + Ok(()) + } + None => Ok(()), + } + + } + NetworkBridgeEvent::PeerViewChange(peer, view) => { + match peers.get_mut(&peer) { + Some(data) => { + update_peer_view_and_send_unlocked( + peer, + data, + ctx, + &*active_heads, + view, + ).await + } + None => Ok(()), + } + } + NetworkBridgeEvent::OurViewChange(view) => { + let old_view = std::mem::replace(our_view, view); + active_heads.retain(|head, _| our_view.contains(head)); + + for new in our_view.difference(&old_view) { + if !active_heads.contains_key(&new) { + log::warn!(target: "statement_distribution", "Our network bridge view update \ + inconsistent with `StartWork` messages we have received from overseer. \ + Contains unknown hash {}", new); + } + } + + Ok(()) + } + } + +} + +async fn run( + mut ctx: impl SubsystemContext, +) -> SubsystemResult<()> { + // startup: register the network protocol with the bridge. + ctx.send_message(AllMessages::NetworkBridge(NetworkBridgeMessage::RegisterEventProducer( + PROTOCOL_V1, + network_update_message, + ))).await?; + + let mut peers: HashMap = HashMap::new(); + let mut our_view = View::default(); + let mut active_heads: HashMap = HashMap::new(); + + loop { + let message = ctx.recv().await?; + match message { + FromOverseer::Signal(OverseerSignal::StartWork(relay_parent)) => { + let (validators, session_index) = { + let (val_tx, val_rx) = oneshot::channel(); + let (session_tx, session_rx) = oneshot::channel(); + + let val_message = AllMessages::RuntimeApi( + RuntimeApiMessage::Request(relay_parent, RuntimeApiRequest::Validators(val_tx)), + ); + let session_message = AllMessages::RuntimeApi( + RuntimeApiMessage::Request(relay_parent, RuntimeApiRequest::SigningContext(session_tx)), + ); + + ctx.send_messages( + std::iter::once(val_message).chain(std::iter::once(session_message)) + ).await?; + + (val_rx.await?, session_rx.await?.session_index) + }; + + active_heads.entry(relay_parent) + .or_insert(ActiveHeadData::new(validators, session_index)); + } + FromOverseer::Signal(OverseerSignal::StopWork(_relay_parent)) => { + // do nothing - we will handle this when our view changes. + } + FromOverseer::Signal(OverseerSignal::Conclude) => break, + FromOverseer::Communication { msg } => match msg { + StatementDistributionMessage::Share(relay_parent, statement) => + circulate_statement_and_dependents( + &mut peers, + &mut active_heads, + &mut ctx, + relay_parent, + statement, + ).await?, + StatementDistributionMessage::NetworkBridgeUpdate(event) => handle_network_update( + &mut peers, + &mut active_heads, + &mut ctx, + &mut our_view, + event, + ).await?, + } + } + } + Ok(()) +} + +#[cfg(test)] +mod tests { + use super::*; + use sp_keyring::Sr25519Keyring; + use node_primitives::Statement; + use polkadot_primitives::parachain::{AbridgedCandidateReceipt}; + use assert_matches::assert_matches; + use futures::executor::{self, ThreadPool}; + + #[test] + fn active_head_accepts_only_2_seconded_per_validator() { + let validators = vec![ + Sr25519Keyring::Alice.public().into(), + Sr25519Keyring::Bob.public().into(), + Sr25519Keyring::Charlie.public().into(), + ]; + let parent_hash: Hash = [1; 32].into(); + + let session_index = 1; + let signing_context = SigningContext { + parent_hash, + session_index, + }; + + let candidate_a = { + let mut c = AbridgedCandidateReceipt::default(); + c.relay_parent = parent_hash; + c.parachain_index = 1.into(); + c + }; + + let candidate_b = { + let mut c = AbridgedCandidateReceipt::default(); + c.relay_parent = parent_hash; + c.parachain_index = 2.into(); + c + }; + + let candidate_c = { + let mut c = AbridgedCandidateReceipt::default(); + c.relay_parent = parent_hash; + c.parachain_index = 3.into(); + c + }; + + let mut head_data = ActiveHeadData::new(validators, session_index); + + // note A + let a_seconded_val_0 = SignedFullStatement::sign( + Statement::Seconded(candidate_a.clone()), + &signing_context, + 0, + &Sr25519Keyring::Alice.pair().into(), + ); + let noted = head_data.note_statement(a_seconded_val_0.clone()); + + assert_matches!(noted, NotedStatement::Fresh(_)); + + // note A (duplicate) + let noted = head_data.note_statement(a_seconded_val_0); + + assert_matches!(noted, NotedStatement::UsefulButKnown); + + // note B + let noted = head_data.note_statement(SignedFullStatement::sign( + Statement::Seconded(candidate_b.clone()), + &signing_context, + 0, + &Sr25519Keyring::Alice.pair().into(), + )); + + assert_matches!(noted, NotedStatement::Fresh(_)); + + // note C (beyond 2 - ignored) + let noted = head_data.note_statement(SignedFullStatement::sign( + Statement::Seconded(candidate_c.clone()), + &signing_context, + 0, + &Sr25519Keyring::Alice.pair().into(), + )); + + assert_matches!(noted, NotedStatement::NotUseful); + + // note B (new validator) + let noted = head_data.note_statement(SignedFullStatement::sign( + Statement::Seconded(candidate_b.clone()), + &signing_context, + 1, + &Sr25519Keyring::Bob.pair().into(), + )); + + assert_matches!(noted, NotedStatement::Fresh(_)); + + // note C (new validator) + let noted = head_data.note_statement(SignedFullStatement::sign( + Statement::Seconded(candidate_c.clone()), + &signing_context, + 1, + &Sr25519Keyring::Bob.pair().into(), + )); + + assert_matches!(noted, NotedStatement::Fresh(_)); + } + + #[test] + fn note_local_works() { + let hash_a: Hash = [1; 32].into(); + let hash_b: Hash = [2; 32].into(); + + let mut per_peer_tracker = VcPerPeerTracker::default(); + per_peer_tracker.note_local(hash_a.clone()); + per_peer_tracker.note_local(hash_b.clone()); + + assert!(per_peer_tracker.local_observed.contains(&hash_a)); + assert!(per_peer_tracker.local_observed.contains(&hash_b)); + + assert!(!per_peer_tracker.remote_observed.contains(&hash_a)); + assert!(!per_peer_tracker.remote_observed.contains(&hash_b)); + } + + #[test] + fn note_remote_works() { + let hash_a: Hash = [1; 32].into(); + let hash_b: Hash = [2; 32].into(); + let hash_c: Hash = [3; 32].into(); + + let mut per_peer_tracker = VcPerPeerTracker::default(); + assert!(per_peer_tracker.note_remote(hash_a.clone())); + assert!(per_peer_tracker.note_remote(hash_b.clone())); + assert!(!per_peer_tracker.note_remote(hash_c.clone())); + + assert!(per_peer_tracker.remote_observed.contains(&hash_a)); + assert!(per_peer_tracker.remote_observed.contains(&hash_b)); + assert!(!per_peer_tracker.remote_observed.contains(&hash_c)); + + assert!(!per_peer_tracker.local_observed.contains(&hash_a)); + assert!(!per_peer_tracker.local_observed.contains(&hash_b)); + assert!(!per_peer_tracker.local_observed.contains(&hash_c)); + } + + #[test] + fn per_peer_relay_parent_knowledge_send() { + let mut knowledge = PeerRelayParentKnowledge::default(); + + let hash_a: Hash = [1; 32].into(); + + // Sending an un-pinned statement should not work and should have no effect. + assert!(knowledge.send(&(CompactStatement::Valid(hash_a), 0)).is_none()); + assert!(!knowledge.known_candidates.contains(&hash_a)); + assert!(knowledge.sent_statements.is_empty()); + assert!(knowledge.received_statements.is_empty()); + assert!(knowledge.seconded_counts.is_empty()); + assert!(knowledge.received_message_count.is_empty()); + + // Make the peer aware of the candidate. + assert_eq!(knowledge.send(&(CompactStatement::Candidate(hash_a), 0)), Some(true)); + assert_eq!(knowledge.send(&(CompactStatement::Candidate(hash_a), 1)), Some(false)); + assert!(knowledge.known_candidates.contains(&hash_a)); + assert_eq!(knowledge.sent_statements.len(), 2); + assert!(knowledge.received_statements.is_empty()); + assert_eq!(knowledge.seconded_counts.len(), 2); + assert!(knowledge.received_message_count.get(&hash_a).is_none()); + + // And now it should accept the dependent message. + assert_eq!(knowledge.send(&(CompactStatement::Valid(hash_a), 0)), Some(false)); + assert!(knowledge.known_candidates.contains(&hash_a)); + assert_eq!(knowledge.sent_statements.len(), 3); + assert!(knowledge.received_statements.is_empty()); + assert_eq!(knowledge.seconded_counts.len(), 2); + assert!(knowledge.received_message_count.get(&hash_a).is_none()); + } + + #[test] + fn cant_send_after_receiving() { + let mut knowledge = PeerRelayParentKnowledge::default(); + + let hash_a: Hash = [1; 32].into(); + assert!(knowledge.receive(&(CompactStatement::Candidate(hash_a), 0), 3).unwrap()); + assert!(knowledge.send(&(CompactStatement::Candidate(hash_a), 0)).is_none()); + } + + #[test] + fn per_peer_relay_parent_knowledge_receive() { + let mut knowledge = PeerRelayParentKnowledge::default(); + + let hash_a: Hash = [1; 32].into(); + + assert_eq!( + knowledge.receive(&(CompactStatement::Valid(hash_a), 0), 3), + Err(COST_UNEXPECTED_STATEMENT), + ); + + assert_eq!( + knowledge.receive(&(CompactStatement::Candidate(hash_a), 0), 3), + Ok(true), + ); + + // Push statements up to the flood limit. + assert_eq!( + knowledge.receive(&(CompactStatement::Valid(hash_a), 1), 3), + Ok(false), + ); + + assert!(knowledge.known_candidates.contains(&hash_a)); + assert_eq!(*knowledge.received_message_count.get(&hash_a).unwrap(), 2); + + assert_eq!( + knowledge.receive(&(CompactStatement::Valid(hash_a), 2), 3), + Ok(false), + ); + + assert_eq!(*knowledge.received_message_count.get(&hash_a).unwrap(), 3); + + assert_eq!( + knowledge.receive(&(CompactStatement::Valid(hash_a), 7), 3), + Err(COST_APPARENT_FLOOD), + ); + + assert_eq!(*knowledge.received_message_count.get(&hash_a).unwrap(), 3); + assert_eq!(knowledge.received_statements.len(), 3); // number of prior `Ok`s. + + // Now make sure that the seconding limit is respected. + let hash_b: Hash = [2; 32].into(); + let hash_c: Hash = [3; 32].into(); + + assert_eq!( + knowledge.receive(&(CompactStatement::Candidate(hash_b), 0), 3), + Ok(true), + ); + + assert_eq!( + knowledge.receive(&(CompactStatement::Candidate(hash_c), 0), 3), + Err(COST_UNEXPECTED_STATEMENT), + ); + + // Last, make sure that already-known statements are disregarded. + assert_eq!( + knowledge.receive(&(CompactStatement::Valid(hash_a), 2), 3), + Err(COST_DUPLICATE_STATEMENT), + ); + + assert_eq!( + knowledge.receive(&(CompactStatement::Candidate(hash_b), 0), 3), + Err(COST_DUPLICATE_STATEMENT), + ); + } + + #[test] + fn peer_view_update_sends_messages() { + let hash_a = [1; 32].into(); + let hash_b = [2; 32].into(); + let hash_c = [3; 32].into(); + + let candidate = { + let mut c = AbridgedCandidateReceipt::default(); + c.relay_parent = hash_c; + c.parachain_index = 1.into(); + c + }; + let candidate_hash = candidate.hash(); + + let old_view = View(vec![hash_a, hash_b]); + let new_view = View(vec![hash_b, hash_c]); + + let mut active_heads = HashMap::new(); + let validators = vec![ + Sr25519Keyring::Alice.public().into(), + Sr25519Keyring::Bob.public().into(), + Sr25519Keyring::Charlie.public().into(), + ]; + + let session_index = 1; + let signing_context = SigningContext { + parent_hash: hash_c, + session_index, + }; + + let new_head_data = { + let mut data = ActiveHeadData::new(validators, session_index); + + let noted = data.note_statement(SignedFullStatement::sign( + Statement::Seconded(candidate.clone()), + &signing_context, + 0, + &Sr25519Keyring::Alice.pair().into(), + )); + + assert_matches!(noted, NotedStatement::Fresh(_)); + + let noted = data.note_statement(SignedFullStatement::sign( + Statement::Valid(candidate_hash), + &signing_context, + 1, + &Sr25519Keyring::Bob.pair().into(), + )); + + assert_matches!(noted, NotedStatement::Fresh(_)); + + let noted = data.note_statement(SignedFullStatement::sign( + Statement::Valid(candidate_hash), + &signing_context, + 2, + &Sr25519Keyring::Charlie.pair().into(), + )); + + assert_matches!(noted, NotedStatement::Fresh(_)); + + data + }; + + active_heads.insert(hash_c, new_head_data); + + let mut peer_data = PeerData { + view: old_view, + view_knowledge: { + let mut k = HashMap::new(); + + k.insert(hash_a, Default::default()); + k.insert(hash_b, Default::default()); + + k + }, + }; + + let pool = ThreadPool::new().unwrap(); + let (mut ctx, mut handle) = subsystem_test::make_subsystem_context(pool); + let peer = PeerId::random(); + + executor::block_on(async move { + update_peer_view_and_send_unlocked( + peer.clone(), + &mut peer_data, + &mut ctx, + &active_heads, + new_view.clone(), + ).await.unwrap(); + + assert_eq!(peer_data.view, new_view); + assert!(!peer_data.view_knowledge.contains_key(&hash_a)); + assert!(peer_data.view_knowledge.contains_key(&hash_b)); + + let c_knowledge = peer_data.view_knowledge.get(&hash_c).unwrap(); + + assert!(c_knowledge.known_candidates.contains(&candidate_hash)); + assert!(c_knowledge.sent_statements.contains( + &(CompactStatement::Candidate(candidate_hash), 0) + )); + assert!(c_knowledge.sent_statements.contains( + &(CompactStatement::Valid(candidate_hash), 1) + )); + assert!(c_knowledge.sent_statements.contains( + &(CompactStatement::Valid(candidate_hash), 2) + )); + + // now see if we got the 3 messages from the active head data. + let active_head = active_heads.get(&hash_c).unwrap(); + + // semi-fragile because hashmap iterator ordering is undefined, but in practice + // it will not change between runs of the program. + for statement in active_head.statements_about(candidate_hash) { + let message = handle.recv().await; + let expected_to = vec![peer.clone()]; + let expected_protocol = PROTOCOL_V1; + let expected_payload + = WireMessage::Statement(hash_c, statement.statement.clone()).encode(); + + assert_matches!( + message, + AllMessages::NetworkBridge(NetworkBridgeMessage::SendMessage( + to, + protocol, + payload, + )) => { + assert_eq!(to, expected_to); + assert_eq!(protocol, expected_protocol); + assert_eq!(payload, expected_payload) + } + ) + } + }); + } + + #[test] + fn circulated_statement_goes_to_all_peers_with_view() { + let hash_a = [1; 32].into(); + let hash_b = [2; 32].into(); + let hash_c = [3; 32].into(); + + let candidate = { + let mut c = AbridgedCandidateReceipt::default(); + c.relay_parent = hash_b; + c.parachain_index = 1.into(); + c + }; + + let peer_a = PeerId::random(); + let peer_b = PeerId::random(); + let peer_c = PeerId::random(); + + let peer_a_view = View(vec![hash_a]); + let peer_b_view = View(vec![hash_a, hash_b]); + let peer_c_view = View(vec![hash_b, hash_c]); + + let session_index = 1; + + let peer_data_from_view = |view: View| PeerData { + view: view.clone(), + view_knowledge: view.0.iter().map(|v| (v.clone(), Default::default())).collect(), + }; + + let mut peer_data: HashMap<_, _> = vec![ + (peer_a.clone(), peer_data_from_view(peer_a_view)), + (peer_b.clone(), peer_data_from_view(peer_b_view)), + (peer_c.clone(), peer_data_from_view(peer_c_view)), + ].into_iter().collect(); + + let pool = ThreadPool::new().unwrap(); + let (mut ctx, mut handle) = subsystem_test::make_subsystem_context(pool); + + executor::block_on(async move { + let statement = { + let signing_context = SigningContext { + parent_hash: hash_b, + session_index, + }; + + let statement = SignedFullStatement::sign( + Statement::Seconded(candidate), + &signing_context, + 0, + &Sr25519Keyring::Alice.pair().into(), + ); + + StoredStatement { + comparator: StoredStatementComparator { + compact: statement.payload().to_compact(), + validator_index: 0, + signature: statement.signature().clone() + }, + statement, + } + }; + + let needs_dependents = circulate_statement( + &mut peer_data, + &mut ctx, + hash_b, + &statement, + ).await.unwrap(); + + { + assert_eq!(needs_dependents.len(), 2); + assert!(needs_dependents.contains(&peer_b)); + assert!(needs_dependents.contains(&peer_c)); + } + + let fingerprint = (statement.compact().clone(), 0); + + assert!( + peer_data.get(&peer_b).unwrap() + .view_knowledge.get(&hash_b).unwrap() + .sent_statements.contains(&fingerprint), + ); + + assert!( + peer_data.get(&peer_c).unwrap() + .view_knowledge.get(&hash_b).unwrap() + .sent_statements.contains(&fingerprint), + ); + + let message = handle.recv().await; + assert_matches!( + message, + AllMessages::NetworkBridge(NetworkBridgeMessage::SendMessage( + to, + protocol, + payload, + )) => { + assert_eq!(to.len(), 2); + assert!(to.contains(&peer_b)); + assert!(to.contains(&peer_c)); + + assert_eq!(protocol, PROTOCOL_V1); + assert_eq!( + payload, + WireMessage::Statement(hash_b, statement.statement.clone()).encode(), + ); + } + ) + }); + } +} diff --git a/node/primitives/src/lib.rs b/node/primitives/src/lib.rs index 527e6aaea2..921f620ea9 100644 --- a/node/primitives/src/lib.rs +++ b/node/primitives/src/lib.rs @@ -29,7 +29,7 @@ use polkadot_primitives::{Hash, }; /// A statement, where the candidate receipt is included in the `Seconded` variant. -#[derive(Debug, Clone, PartialEq, Encode, Decode)] +#[derive(Debug, Clone, PartialEq, Eq, Encode, Decode)] pub enum Statement { /// A statement that a validator seconds a candidate. #[codec(index = "1")] @@ -42,16 +42,19 @@ pub enum Statement { Invalid(Hash), } +impl Statement { + pub fn to_compact(&self) -> CompactStatement { + match *self { + Statement::Seconded(ref c) => CompactStatement::Candidate(c.hash()), + Statement::Valid(hash) => CompactStatement::Valid(hash), + Statement::Invalid(hash) => CompactStatement::Invalid(hash), + } + } +} + impl EncodeAs for Statement { fn encode_as(&self) -> Vec { - let statement = match *self { - Statement::Seconded(ref c) => { - polkadot_primitives::parachain::CompactStatement::Candidate(c.hash()) - } - Statement::Valid(hash) => polkadot_primitives::parachain::CompactStatement::Valid(hash), - Statement::Invalid(hash) => polkadot_primitives::parachain::CompactStatement::Invalid(hash), - }; - statement.encode() + self.to_compact().encode() } } @@ -87,5 +90,22 @@ pub type ProtocolId = [u8; 4]; /// A succinct representation of a peer's view. This consists of a bounded amount of chain heads. /// /// Up to `N` (5?) chain heads. -#[derive(Debug, Clone, PartialEq, Eq, Encode, Decode)] +#[derive(Default, Debug, Clone, PartialEq, Eq, Encode, Decode)] pub struct View(pub Vec); + +impl View { + /// Returns an iterator of the hashes present in `Self` but not in `other`. + pub fn difference<'a>(&'a self, other: &'a View) -> impl Iterator + 'a { + self.0.iter().filter(move |h| !other.contains(h)) + } + + /// An iterator containing hashes present in both `Self` and in `other`. + pub fn intersection<'a>(&'a self, other: &'a View) -> impl Iterator + 'a { + self.0.iter().filter(move |h| other.contains(h)) + } + + /// Whether the view contains a given hash. + pub fn contains(&self, hash: &Hash) -> bool { + self.0.contains(hash) + } +} diff --git a/node/subsystem/src/messages.rs b/node/subsystem/src/messages.rs index b8732d5aa5..fb4300f561 100644 --- a/node/subsystem/src/messages.rs +++ b/node/subsystem/src/messages.rs @@ -24,7 +24,6 @@ use futures::channel::{mpsc, oneshot}; -use sc_network::{ObservedRole, ReputationChange, PeerId}; use polkadot_primitives::{BlockNumber, Hash, Signature}; use polkadot_primitives::parachain::{ AbridgedCandidateReceipt, PoVBlock, ErasureChunk, BackedCandidate, Id as ParaId, @@ -34,6 +33,8 @@ use polkadot_node_primitives::{ MisbehaviorReport, SignedFullStatement, View, ProtocolId, }; +pub use sc_network::{ObservedRole, ReputationChange, PeerId}; + /// A notification of a new backed candidate. #[derive(Debug)] pub struct NewBackedCandidate(pub BackedCandidate); @@ -234,4 +235,6 @@ pub enum AllMessages { RuntimeApi(RuntimeApiMessage), /// Message for the availability store subsystem. AvailabilityStore(AvailabilityStoreMessage), + /// Message for the network bridge subsystem. + NetworkBridge(NetworkBridgeMessage), } diff --git a/primitives/src/parachain.rs b/primitives/src/parachain.rs index 03448a29fa..4a10fea699 100644 --- a/primitives/src/parachain.rs +++ b/primitives/src/parachain.rs @@ -595,7 +595,7 @@ pub struct Activity(#[cfg_attr(feature = "std", serde(with="bytes"))] pub Vec &Hash { + match *self { + CompactStatement::Candidate(ref h) + | CompactStatement::Valid(ref h) + | CompactStatement::Invalid(ref h) + => h + } + } +} + /// A signed compact statement, suitable to be sent to the chain. pub type SignedStatement = Signed; diff --git a/roadmap/implementors-guide/src/node/backing/statement-distribution.md b/roadmap/implementors-guide/src/node/backing/statement-distribution.md index 59e5244d0d..d05c68f7af 100644 --- a/roadmap/implementors-guide/src/node/backing/statement-distribution.md +++ b/roadmap/implementors-guide/src/node/backing/statement-distribution.md @@ -24,14 +24,14 @@ Statement Distribution is the only backing subsystem which has any notion of pee It is responsible for distributing signed statements that we have generated and forwarding them, and for detecting a variety of Validator misbehaviors for reporting to [Misbehavior Arbitration](../utility/misbehavior-arbitration.md). During the Backing stage of the inclusion pipeline, it's the main point of contact with peer nodes. On receiving a signed statement from a peer, assuming the peer receipt state machine is in an appropriate state, it sends the Candidate Receipt to the [Candidate Backing subsystem](candidate-backing.md) to handle the validator's statement. -Track equivocating validators and stop accepting information from them. Forward double-vote proofs to the double-vote reporting system. Establish a data-dependency order: +Track equivocating validators and stop accepting information from them. Establish a data-dependency order: - In order to receive a `Seconded` message we have the on corresponding chain head in our view - In order to receive an `Invalid` or `Valid` message we must have received the corresponding `Seconded` message. And respect this data-dependency order from our peers by respecting their views. This subsystem is responsible for checking message signatures. -The Statement Distribution subsystem sends statements to peer nodes and detects double-voting by validators. When validators conflict with each other or themselves, the Misbehavior Arbitration system is notified. +The Statement Distribution subsystem sends statements to peer nodes. ## Peer Receipt State Machine @@ -53,4 +53,21 @@ This system implies a certain level of duplication of messages--we received X's And respect this data-dependency order from our peers. This subsystem is responsible for checking message signatures. -No jobs, `StartWork` and `StopWork` pulses are used to control neighbor packets and what we are currently accepting. +No jobs. We follow view changes from the [`NetworkBridge`](../utility/network-bridge.md), which in turn is updated by the overseer. + +## Equivocations and Flood Protection + +An equivocation is a double-vote by a validator. The [Candidate Backing](candidate-backing.md) Subsystem is better-suited than this one to detect equivocations as it adds votes to quorum trackers. + +At this level, we are primarily concerned about flood-protection, and to some extent, detecting equivocations is a part of that. In particular, we are interested in detecting equivocations of `Seconded` statements. Since every other statement is dependent on `Seconded` statements, ensuring that we only ever hold a bounded number of `Seconded` statements is sufficient for flood-protection. + +The simple approach is to say that we only receive up to two `Seconded` statements per validator per chain head. However, the marginal cost of equivocation, conditional on having already equivocated, is close to 0, since a single double-vote offence is counted as all double-vote offences for a particular chain-head. Even if it were not, there is some amount of equivocations that can be done such that the marginal cost of issuing further equivocations is close to 0, as there would be an amount of equivocations necessary to be completely and totally obliterated by the slashing algorithm. We fear the validator with nothing left to lose. + +With that in mind, this simple approach has a caveat worth digging deeper into. + +First: We may be aware of two equivocated `Seconded` statements issued by a validator. A totally honest peer of ours can also be aware of one or two different `Seconded` statements issued by the same validator. And yet another peer may be aware of one or two _more_ `Seconded` statements. And so on. This interacts badly with pre-emptive sending logic. Upon sending a `Seconded` statement to a peer, we will want to pre-emptively follow up with all statements relative to that candidate. Waiting for acknowledgement introduces latency at every hop, so that is best avoided. What can happen is that upon receipt of the `Seconded` statement, the peer will discard it as it falls beyond the bound of 2 that it is allowed to store. It cannot store anything in memory about discarded candidates as that would introduce a DoS vector. Then, the peer would receive from us all of the statements pertaining to that candidate, which, from its perspective, would be undesired - they are data-dependent on the `Seconded` statement we sent them, but they have erased all record of that from their memory. Upon receiving a potential flood of undesired statements, this 100% honest peer may choose to disconnect from us. In this way, an adversary may be able to partition the network with careful distribution of equivocated `Seconded` statements. + +The fix is to track, per-peer, the hashes of up to 4 candidates per validator (per relay-parent) that the peer is aware of. It is 4 because we may send them 2 and they may send us 2 different ones. We track the data that they are aware of as the union of things we have sent them and things they have sent us. If we receive a 1st or 2nd `Seconded` statement from a peer, we note it in the peer's known candidates even if we do disregard the data locally. And then, upon receipt of any data dependent on that statement, we do not reduce that peer's standing in our eyes, as the data was not undesired. + +There is another caveat to the fix: we don't want to allow the peer to flood us because it has set things up in a way that it knows we will drop all of its traffic. +We also track how many statements we have received per peer, per candidate, and per chain-head. This is any statement concerning a particular candidate: `Seconded`, `Valid`, or `Invalid`. If we ever receive a statement from a peer which would push any of these counters beyond twice the amount of validators at the chain-head, we begin to lower the peer's standing and eventually disconnect. This bound is a massive overestimate and could be reduced to twice the number of validators in the corresponding validator group. It is worth noting that the goal at the time of writing is to ensure any finite bound on the amount of stored data, as any equivocation results in a large slash. -- GitLab From 68b48d9e3d0aedb848073df13c6c93c35b1ba0b1 Mon Sep 17 00:00:00 2001 From: Peter Goodspeed-Niklaus Date: Tue, 7 Jul 2020 10:01:15 +0200 Subject: [PATCH 037/192] convert SignedAvailabilityBitfields from newtype to typedef (#1342) Closes #1339. --- node/subsystem/src/messages.rs | 4 ++-- primitives/src/parachain.rs | 9 +-------- runtime/parachains/src/inclusion.rs | 18 +++++++++--------- 3 files changed, 12 insertions(+), 19 deletions(-) diff --git a/node/subsystem/src/messages.rs b/node/subsystem/src/messages.rs index fb4300f561..1ff4986b06 100644 --- a/node/subsystem/src/messages.rs +++ b/node/subsystem/src/messages.rs @@ -27,7 +27,7 @@ use futures::channel::{mpsc, oneshot}; use polkadot_primitives::{BlockNumber, Hash, Signature}; use polkadot_primitives::parachain::{ AbridgedCandidateReceipt, PoVBlock, ErasureChunk, BackedCandidate, Id as ParaId, - SignedAvailabilityBitfield, SignedAvailabilityBitfields, SigningContext, ValidatorId, ValidationCode, ValidatorIndex, + SignedAvailabilityBitfield, SigningContext, ValidatorId, ValidationCode, ValidatorIndex, }; use polkadot_node_primitives::{ MisbehaviorReport, SignedFullStatement, View, ProtocolId, @@ -194,7 +194,7 @@ pub enum ProvisionableData { /// This data needs to make its way from the provisioner into the InherentData. /// /// There, it is used to construct the InclusionInherent. -pub type ProvisionerInherentData = (SignedAvailabilityBitfields, Vec); +pub type ProvisionerInherentData = (Vec, Vec); /// Message to the Provisioner. /// diff --git a/primitives/src/parachain.rs b/primitives/src/parachain.rs index 4a10fea699..b187d488e1 100644 --- a/primitives/src/parachain.rs +++ b/primitives/src/parachain.rs @@ -736,14 +736,7 @@ impl From> for AvailabilityBitfield { pub type SignedAvailabilityBitfield = Signed; /// A set of signed availability bitfields. Should be sorted by validator index, ascending. -#[derive(Encode, Decode, Clone, PartialEq, Eq, RuntimeDebug, Default)] -pub struct SignedAvailabilityBitfields(pub Vec); - -impl From> for SignedAvailabilityBitfields { - fn from(fields: Vec) -> SignedAvailabilityBitfields { - SignedAvailabilityBitfields(fields) - } -} +pub type SignedAvailabilityBitfields = Vec; /// A backed (or backable, depending on context) candidate. // TODO: yes, this is roughly the same as AttestedCandidate. diff --git a/runtime/parachains/src/inclusion.rs b/runtime/parachains/src/inclusion.rs index c31c4a62e6..f9696bb33c 100644 --- a/runtime/parachains/src/inclusion.rs +++ b/runtime/parachains/src/inclusion.rs @@ -190,7 +190,7 @@ impl Module { session_index, }; - for signed_bitfield in &signed_bitfields.0 { + for signed_bitfield in &signed_bitfields { ensure!( signed_bitfield.payload().0.len() == n_bits, Error::::WrongBitfieldSize, @@ -220,7 +220,7 @@ impl Module { } let now = >::block_number(); - for signed_bitfield in signed_bitfields.0 { + for signed_bitfield in signed_bitfields { for (bit_idx, _) in signed_bitfield.payload().0.iter().enumerate().filter(|(_, is_av)| **is_av) { @@ -755,7 +755,7 @@ mod tests { ); assert!(Inclusion::process_bitfields( - SignedAvailabilityBitfields(vec![signed]), + vec![signed], &core_lookup, ).is_err()); } @@ -771,7 +771,7 @@ mod tests { ); assert!(Inclusion::process_bitfields( - SignedAvailabilityBitfields(vec![signed.clone(), signed]), + vec![signed.clone(), signed], &core_lookup, ).is_err()); } @@ -794,7 +794,7 @@ mod tests { ); assert!(Inclusion::process_bitfields( - SignedAvailabilityBitfields(vec![signed_1, signed_0]), + vec![signed_1, signed_0], &core_lookup, ).is_err()); } @@ -811,7 +811,7 @@ mod tests { ); assert!(Inclusion::process_bitfields( - SignedAvailabilityBitfields(vec![signed]), + vec![signed], &core_lookup, ).is_err()); } @@ -827,7 +827,7 @@ mod tests { ); assert!(Inclusion::process_bitfields( - SignedAvailabilityBitfields(vec![signed]), + vec![signed], &core_lookup, ).is_ok()); } @@ -855,7 +855,7 @@ mod tests { ); assert!(Inclusion::process_bitfields( - SignedAvailabilityBitfields(vec![signed]), + vec![signed], &core_lookup, ).is_ok()); } @@ -959,7 +959,7 @@ mod tests { }).collect(); assert!(Inclusion::process_bitfields( - SignedAvailabilityBitfields(signed_bitfields), + signed_bitfields, &core_lookup, ).is_ok()); -- GitLab From 891767bcd28a4a53fbc17ba87c2cc2d48758e35f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Tue, 7 Jul 2020 12:06:57 +0200 Subject: [PATCH 038/192] Companion for #6589 (#1367) https://github.com/paritytech/substrate/pull/6589 --- Cargo.lock | 54 ++++++++++++++++----------------- runtime/kusama/Cargo.toml | 2 +- runtime/polkadot/Cargo.toml | 2 +- runtime/test-runtime/Cargo.toml | 2 +- runtime/westend/Cargo.toml | 2 +- 5 files changed, 31 insertions(+), 31 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 8c691f25c1..2a9acaf6cf 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -718,7 +718,7 @@ dependencies = [ "log 0.4.8", "regalloc", "serde", - "smallvec 1.4.0", + "smallvec 1.4.1", "target-lexicon", "thiserror", ] @@ -756,7 +756,7 @@ checksum = "e45f82e3446dd1ebb8c2c2f6a6b0e6cd6cd52965c7e5f7b1b35e9a9ace31ccde" dependencies = [ "cranelift-codegen", "log 0.4.8", - "smallvec 1.4.0", + "smallvec 1.4.1", "target-lexicon", ] @@ -1342,7 +1342,7 @@ dependencies = [ "parity-scale-codec", "paste", "serde", - "smallvec 1.4.0", + "smallvec 1.4.1", "sp-arithmetic", "sp-core", "sp-inherents", @@ -1729,7 +1729,7 @@ dependencies = [ "byteorder", "fallible-iterator", "indexmap", - "smallvec 1.4.0", + "smallvec 1.4.1", "stable_deref_trait", ] @@ -2399,7 +2399,7 @@ dependencies = [ "serde", "serde_derive", "serde_json", - "smallvec 1.4.0", + "smallvec 1.4.1", "sp-api", "sp-authority-discovery", "sp-block-builder", @@ -2437,7 +2437,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e763b2a9b500ba47948061d1e8bc3b5f03a8a1f067dbcf822a4d2c84d2b54a3a" dependencies = [ "parity-util-mem", - "smallvec 1.4.0", + "smallvec 1.4.1", ] [[package]] @@ -2466,7 +2466,7 @@ dependencies = [ "parking_lot 0.10.2", "regex", "rocksdb", - "smallvec 1.4.0", + "smallvec 1.4.1", ] [[package]] @@ -2571,7 +2571,7 @@ dependencies = [ "parity-multiaddr 0.9.1", "parking_lot 0.10.2", "pin-project", - "smallvec 1.4.0", + "smallvec 1.4.1", "wasm-timer", ] @@ -2602,7 +2602,7 @@ dependencies = [ "ring", "rw-stream-sink", "sha2", - "smallvec 1.4.0", + "smallvec 1.4.1", "thiserror", "unsigned-varint 0.4.0", "void", @@ -2642,7 +2642,7 @@ dependencies = [ "log 0.4.8", "prost", "prost-build", - "smallvec 1.4.0", + "smallvec 1.4.1", "wasm-timer", ] @@ -2666,7 +2666,7 @@ dependencies = [ "prost-build", "rand 0.7.3", "sha2", - "smallvec 1.4.0", + "smallvec 1.4.1", "uint", "unsigned-varint 0.4.0", "void", @@ -2690,7 +2690,7 @@ dependencies = [ "log 0.4.8", "net2", "rand 0.7.3", - "smallvec 1.4.0", + "smallvec 1.4.1", "void", "wasm-timer", ] @@ -2757,7 +2757,7 @@ dependencies = [ "libp2p-core", "log 0.4.8", "rand 0.7.3", - "smallvec 1.4.0", + "smallvec 1.4.1", "void", "wasm-timer", ] @@ -3143,7 +3143,7 @@ dependencies = [ "futures 0.3.5", "log 0.4.8", "pin-project", - "smallvec 1.4.0", + "smallvec 1.4.1", "unsigned-varint 0.4.0", ] @@ -3839,7 +3839,7 @@ dependencies = [ "pallet-transaction-payment-rpc-runtime-api", "parity-scale-codec", "serde", - "smallvec 1.4.0", + "smallvec 1.4.1", "sp-runtime", "sp-std", ] @@ -4048,7 +4048,7 @@ dependencies = [ "parity-util-mem-derive", "parking_lot 0.10.2", "primitive-types", - "smallvec 1.4.0", + "smallvec 1.4.1", "winapi 0.3.8", ] @@ -4115,7 +4115,7 @@ dependencies = [ "cloudabi", "libc", "redox_syscall", - "smallvec 1.4.0", + "smallvec 1.4.1", "winapi 0.3.8", ] @@ -4601,7 +4601,7 @@ dependencies = [ "serde", "serde_derive", "serde_json", - "smallvec 1.4.0", + "smallvec 1.4.1", "sp-api", "sp-authority-discovery", "sp-block-builder", @@ -4908,7 +4908,7 @@ dependencies = [ "serde", "serde_derive", "serde_json", - "smallvec 1.4.0", + "smallvec 1.4.1", "sp-api", "sp-block-builder", "sp-consensus-babe", @@ -5527,7 +5527,7 @@ version = "4.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a415a013dd7c5d4221382329a5a3482566da675737494935cbbbcdec04662f9d" dependencies = [ - "smallvec 1.4.0", + "smallvec 1.4.1", ] [[package]] @@ -5558,7 +5558,7 @@ checksum = "b27b256b41986ac5141b37b8bbba85d314fbf546c182eb255af6720e07e4f804" dependencies = [ "log 0.4.8", "rustc-hash", - "smallvec 1.4.0", + "smallvec 1.4.1", ] [[package]] @@ -6962,9 +6962,9 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.4.0" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7cb5678e1615754284ec264d9bb5b4c27d2018577fd90ac0ceb578591ed5ee4" +checksum = "3757cb9d89161a2f24e1cf78efa0c1fcff485d18e3f55e0aa3480824ddaa0f3f" [[package]] name = "snow" @@ -7501,7 +7501,7 @@ dependencies = [ "parity-scale-codec", "parking_lot 0.10.2", "rand 0.7.3", - "smallvec 1.4.0", + "smallvec 1.4.1", "sp-core", "sp-externalities", "sp-panic-handler", @@ -8644,7 +8644,7 @@ dependencies = [ "hashbrown", "log 0.4.8", "rustc-hex", - "smallvec 1.4.0", + "smallvec 1.4.1", ] [[package]] @@ -8657,7 +8657,7 @@ dependencies = [ "hashbrown", "log 0.4.8", "rustc-hex", - "smallvec 1.4.0", + "smallvec 1.4.1", ] [[package]] @@ -9154,7 +9154,7 @@ dependencies = [ "serde", "serde_derive", "serde_json", - "smallvec 1.4.0", + "smallvec 1.4.1", "sp-api", "sp-authority-discovery", "sp-block-builder", diff --git a/runtime/kusama/Cargo.toml b/runtime/kusama/Cargo.toml index 371d9fc537..ef0517d3e5 100644 --- a/runtime/kusama/Cargo.toml +++ b/runtime/kusama/Cargo.toml @@ -13,7 +13,7 @@ rustc-hex = { version = "2.0.1", default-features = false } serde = { version = "1.0.102", default-features = false } serde_derive = { version = "1.0.102", optional = true } static_assertions = "1.1.0" -smallvec = "1.4.0" +smallvec = "1.4.1" authority-discovery-primitives = { package = "sp-authority-discovery", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } babe-primitives = { package = "sp-consensus-babe", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } diff --git a/runtime/polkadot/Cargo.toml b/runtime/polkadot/Cargo.toml index 9df821f918..50081c6811 100644 --- a/runtime/polkadot/Cargo.toml +++ b/runtime/polkadot/Cargo.toml @@ -13,7 +13,7 @@ rustc-hex = { version = "2.0.1", default-features = false } serde = { version = "1.0.102", default-features = false } serde_derive = { version = "1.0.102", optional = true } static_assertions = "1.1.0" -smallvec = "1.4.0" +smallvec = "1.4.1" authority-discovery-primitives = { package = "sp-authority-discovery", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } babe-primitives = { package = "sp-consensus-babe", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } diff --git a/runtime/test-runtime/Cargo.toml b/runtime/test-runtime/Cargo.toml index e60473158e..c4bf27750a 100644 --- a/runtime/test-runtime/Cargo.toml +++ b/runtime/test-runtime/Cargo.toml @@ -12,7 +12,7 @@ log = { version = "0.3.9", optional = true } rustc-hex = { version = "2.0.1", default-features = false } serde = { version = "1.0.102", default-features = false } serde_derive = { version = "1.0.102", optional = true } -smallvec = "1.4.0" +smallvec = "1.4.1" babe-primitives = { package = "sp-consensus-babe", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } sp-api = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } diff --git a/runtime/westend/Cargo.toml b/runtime/westend/Cargo.toml index 0f00ede723..51b3d8caf1 100644 --- a/runtime/westend/Cargo.toml +++ b/runtime/westend/Cargo.toml @@ -12,7 +12,7 @@ log = { version = "0.3.9", optional = true } rustc-hex = { version = "2.0.1", default-features = false } serde = { version = "1.0.102", default-features = false } serde_derive = { version = "1.0.102", optional = true } -smallvec = "1.4.0" +smallvec = "1.4.1" static_assertions = "1.1.0" authority-discovery-primitives = { package = "sp-authority-discovery", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -- GitLab From 482abf8c6b1029ebd716a47ab480c7b41a1f0182 Mon Sep 17 00:00:00 2001 From: Robert Habermeier Date: Tue, 7 Jul 2020 10:10:36 -0400 Subject: [PATCH 039/192] I am dumb and can't spell (#1366) * rename implementor's guide to implementer's guide * fix typos in more places --- .gitlab-ci.yml | 2 +- availability-store/src/worker.rs | 2 +- node/overseer/src/lib.rs | 2 +- roadmap/{implementors-guide => implementers-guide}/.gitignore | 0 roadmap/{implementors-guide => implementers-guide}/README.md | 2 +- roadmap/{implementors-guide => implementers-guide}/book.toml | 0 .../{implementors-guide => implementers-guide}/src/README.md | 2 +- .../{implementors-guide => implementers-guide}/src/SUMMARY.md | 0 .../src/architecture.md | 0 .../src/further-reading.md | 0 .../{implementors-guide => implementers-guide}/src/glossary.md | 0 .../src/node/README.md | 0 .../src/node/availability/README.md | 0 .../src/node/availability/availability-distribution.md | 0 .../src/node/availability/bitfield-distribution.md | 0 .../src/node/availability/bitfield-signing.md | 0 .../src/node/backing/README.md | 0 .../src/node/backing/candidate-backing.md | 0 .../src/node/backing/candidate-selection.md | 0 .../src/node/backing/pov-distribution.md | 0 .../src/node/backing/statement-distribution.md | 0 .../src/node/collators/README.md | 0 .../src/node/collators/collation-distribution.md | 0 .../src/node/collators/collation-generation.md | 0 .../src/node/overseer.md | 0 .../src/node/subsystems-and-jobs.md | 0 .../src/node/utility/README.md | 0 .../src/node/utility/availability-store.md | 0 .../src/node/utility/candidate-validation.md | 0 .../src/node/utility/misbehavior-arbitration.md | 0 .../src/node/utility/network-bridge.md | 0 .../src/node/utility/peer-set-manager.md | 0 .../src/node/utility/provisioner.md | 0 .../src/node/utility/runtime-api.md | 0 .../src/node/validity/README.md | 0 .../src/parachains-overview.md | 0 .../src/runtime/README.md | 0 .../src/runtime/configuration.md | 0 .../src/runtime/inclusion.md | 0 .../src/runtime/inclusioninherent.md | 0 .../src/runtime/initializer.md | 0 .../src/runtime/paras.md | 0 .../src/runtime/router.md | 0 .../src/runtime/scheduler.md | 0 .../src/runtime/validity.md | 0 .../src/types/README.md | 0 .../src/types/availability.md | 0 .../src/types/backing.md | 0 .../src/types/candidate.md | 0 .../src/types/chain.md | 0 .../src/types/messages.md | 0 .../src/types/overseer-protocol.md | 0 .../src/types/runtime.md | 0 .../src/whence-parachains.md | 0 54 files changed, 5 insertions(+), 5 deletions(-) rename roadmap/{implementors-guide => implementers-guide}/.gitignore (100%) rename roadmap/{implementors-guide => implementers-guide}/README.md (88%) rename roadmap/{implementors-guide => implementers-guide}/book.toml (100%) rename roadmap/{implementors-guide => implementers-guide}/src/README.md (79%) rename roadmap/{implementors-guide => implementers-guide}/src/SUMMARY.md (100%) rename roadmap/{implementors-guide => implementers-guide}/src/architecture.md (100%) rename roadmap/{implementors-guide => implementers-guide}/src/further-reading.md (100%) rename roadmap/{implementors-guide => implementers-guide}/src/glossary.md (100%) rename roadmap/{implementors-guide => implementers-guide}/src/node/README.md (100%) rename roadmap/{implementors-guide => implementers-guide}/src/node/availability/README.md (100%) rename roadmap/{implementors-guide => implementers-guide}/src/node/availability/availability-distribution.md (100%) rename roadmap/{implementors-guide => implementers-guide}/src/node/availability/bitfield-distribution.md (100%) rename roadmap/{implementors-guide => implementers-guide}/src/node/availability/bitfield-signing.md (100%) rename roadmap/{implementors-guide => implementers-guide}/src/node/backing/README.md (100%) rename roadmap/{implementors-guide => implementers-guide}/src/node/backing/candidate-backing.md (100%) rename roadmap/{implementors-guide => implementers-guide}/src/node/backing/candidate-selection.md (100%) rename roadmap/{implementors-guide => implementers-guide}/src/node/backing/pov-distribution.md (100%) rename roadmap/{implementors-guide => implementers-guide}/src/node/backing/statement-distribution.md (100%) rename roadmap/{implementors-guide => implementers-guide}/src/node/collators/README.md (100%) rename roadmap/{implementors-guide => implementers-guide}/src/node/collators/collation-distribution.md (100%) rename roadmap/{implementors-guide => implementers-guide}/src/node/collators/collation-generation.md (100%) rename roadmap/{implementors-guide => implementers-guide}/src/node/overseer.md (100%) rename roadmap/{implementors-guide => implementers-guide}/src/node/subsystems-and-jobs.md (100%) rename roadmap/{implementors-guide => implementers-guide}/src/node/utility/README.md (100%) rename roadmap/{implementors-guide => implementers-guide}/src/node/utility/availability-store.md (100%) rename roadmap/{implementors-guide => implementers-guide}/src/node/utility/candidate-validation.md (100%) rename roadmap/{implementors-guide => implementers-guide}/src/node/utility/misbehavior-arbitration.md (100%) rename roadmap/{implementors-guide => implementers-guide}/src/node/utility/network-bridge.md (100%) rename roadmap/{implementors-guide => implementers-guide}/src/node/utility/peer-set-manager.md (100%) rename roadmap/{implementors-guide => implementers-guide}/src/node/utility/provisioner.md (100%) rename roadmap/{implementors-guide => implementers-guide}/src/node/utility/runtime-api.md (100%) rename roadmap/{implementors-guide => implementers-guide}/src/node/validity/README.md (100%) rename roadmap/{implementors-guide => implementers-guide}/src/parachains-overview.md (100%) rename roadmap/{implementors-guide => implementers-guide}/src/runtime/README.md (100%) rename roadmap/{implementors-guide => implementers-guide}/src/runtime/configuration.md (100%) rename roadmap/{implementors-guide => implementers-guide}/src/runtime/inclusion.md (100%) rename roadmap/{implementors-guide => implementers-guide}/src/runtime/inclusioninherent.md (100%) rename roadmap/{implementors-guide => implementers-guide}/src/runtime/initializer.md (100%) rename roadmap/{implementors-guide => implementers-guide}/src/runtime/paras.md (100%) rename roadmap/{implementors-guide => implementers-guide}/src/runtime/router.md (100%) rename roadmap/{implementors-guide => implementers-guide}/src/runtime/scheduler.md (100%) rename roadmap/{implementors-guide => implementers-guide}/src/runtime/validity.md (100%) rename roadmap/{implementors-guide => implementers-guide}/src/types/README.md (100%) rename roadmap/{implementors-guide => implementers-guide}/src/types/availability.md (100%) rename roadmap/{implementors-guide => implementers-guide}/src/types/backing.md (100%) rename roadmap/{implementors-guide => implementers-guide}/src/types/candidate.md (100%) rename roadmap/{implementors-guide => implementers-guide}/src/types/chain.md (100%) rename roadmap/{implementors-guide => implementers-guide}/src/types/messages.md (100%) rename roadmap/{implementors-guide => implementers-guide}/src/types/overseer-protocol.md (100%) rename roadmap/{implementors-guide => implementers-guide}/src/types/runtime.md (100%) rename roadmap/{implementors-guide => implementers-guide}/src/whence-parachains.md (100%) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index f2de0fa0a8..d0c057b32c 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -195,7 +195,7 @@ generate-impl-guide: name: michaelfbryan/mdbook-docker-image:latest entrypoint: [""] script: - - mdbook build roadmap/implementors-guide + - mdbook build roadmap/implementers-guide .publish-build: &publish-build stage: publish diff --git a/availability-store/src/worker.rs b/availability-store/src/worker.rs index 0ff59a9fca..01872c177c 100644 --- a/availability-store/src/worker.rs +++ b/availability-store/src/worker.rs @@ -531,7 +531,7 @@ impl Worker { } } -/// Implementor of the [`BlockImport`] trait. +/// Implementer of the [`BlockImport`] trait. /// /// Used to embed `availability-store` logic into the block imporing pipeline. /// diff --git a/node/overseer/src/lib.rs b/node/overseer/src/lib.rs index 706ba58a5e..70de3c1d86 100644 --- a/node/overseer/src/lib.rs +++ b/node/overseer/src/lib.rs @@ -17,7 +17,7 @@ //! # Overseer //! //! `overseer` implements the Overseer architecture described in the -//! [implementors-guide](https://github.com/paritytech/polkadot/blob/master/roadmap/implementors-guide/guide.md). +//! [implementers-guide](https://github.com/paritytech/polkadot/blob/master/roadmap/implementers-guide/guide.md). //! For the motivations behind implementing the overseer itself you should //! check out that guide, documentation in this crate will be mostly discussing //! technical stuff. diff --git a/roadmap/implementors-guide/.gitignore b/roadmap/implementers-guide/.gitignore similarity index 100% rename from roadmap/implementors-guide/.gitignore rename to roadmap/implementers-guide/.gitignore diff --git a/roadmap/implementors-guide/README.md b/roadmap/implementers-guide/README.md similarity index 88% rename from roadmap/implementors-guide/README.md rename to roadmap/implementers-guide/README.md index 909e505597..0bbc077469 100644 --- a/roadmap/implementors-guide/README.md +++ b/roadmap/implementers-guide/README.md @@ -4,6 +4,6 @@ The implementers' guide is compiled from several source files with [mdBook](http ```sh cargo install mdbook mdbook-linkcheck mdbook-graphviz -mdbook serve roadmap/implementors-guide +mdbook serve roadmap/implementers-guide open http://localhost:3000 ``` diff --git a/roadmap/implementors-guide/book.toml b/roadmap/implementers-guide/book.toml similarity index 100% rename from roadmap/implementors-guide/book.toml rename to roadmap/implementers-guide/book.toml diff --git a/roadmap/implementors-guide/src/README.md b/roadmap/implementers-guide/src/README.md similarity index 79% rename from roadmap/implementors-guide/src/README.md rename to roadmap/implementers-guide/src/README.md index 9bc4430bda..64bff6cb6e 100644 --- a/roadmap/implementors-guide/src/README.md +++ b/roadmap/implementers-guide/src/README.md @@ -1,5 +1,5 @@ # Preamble -This document aims to describe the purpose, functionality, and implementation of a host for Polkadot's _parachains_. It is not for the implementor of a specific parachain but rather for the implementor of the Parachain Host, which provides security and advancement for constituent parachains. In practice, this is for the implementors of Polkadot. +This document aims to describe the purpose, functionality, and implementation of a host for Polkadot's _parachains_. It is not for the implementer of a specific parachain but rather for the implementer of the Parachain Host, which provides security and advancement for constituent parachains. In practice, this is for the implementers of Polkadot. There are a number of other documents describing the research in more detail. All referenced documents will be linked here and should be read alongside this document for the best understanding of the full picture. However, this is the only document which aims to describe key aspects of Polkadot's particular instantiation of much of that research down to low-level technical details and software architecture. diff --git a/roadmap/implementors-guide/src/SUMMARY.md b/roadmap/implementers-guide/src/SUMMARY.md similarity index 100% rename from roadmap/implementors-guide/src/SUMMARY.md rename to roadmap/implementers-guide/src/SUMMARY.md diff --git a/roadmap/implementors-guide/src/architecture.md b/roadmap/implementers-guide/src/architecture.md similarity index 100% rename from roadmap/implementors-guide/src/architecture.md rename to roadmap/implementers-guide/src/architecture.md diff --git a/roadmap/implementors-guide/src/further-reading.md b/roadmap/implementers-guide/src/further-reading.md similarity index 100% rename from roadmap/implementors-guide/src/further-reading.md rename to roadmap/implementers-guide/src/further-reading.md diff --git a/roadmap/implementors-guide/src/glossary.md b/roadmap/implementers-guide/src/glossary.md similarity index 100% rename from roadmap/implementors-guide/src/glossary.md rename to roadmap/implementers-guide/src/glossary.md diff --git a/roadmap/implementors-guide/src/node/README.md b/roadmap/implementers-guide/src/node/README.md similarity index 100% rename from roadmap/implementors-guide/src/node/README.md rename to roadmap/implementers-guide/src/node/README.md diff --git a/roadmap/implementors-guide/src/node/availability/README.md b/roadmap/implementers-guide/src/node/availability/README.md similarity index 100% rename from roadmap/implementors-guide/src/node/availability/README.md rename to roadmap/implementers-guide/src/node/availability/README.md diff --git a/roadmap/implementors-guide/src/node/availability/availability-distribution.md b/roadmap/implementers-guide/src/node/availability/availability-distribution.md similarity index 100% rename from roadmap/implementors-guide/src/node/availability/availability-distribution.md rename to roadmap/implementers-guide/src/node/availability/availability-distribution.md diff --git a/roadmap/implementors-guide/src/node/availability/bitfield-distribution.md b/roadmap/implementers-guide/src/node/availability/bitfield-distribution.md similarity index 100% rename from roadmap/implementors-guide/src/node/availability/bitfield-distribution.md rename to roadmap/implementers-guide/src/node/availability/bitfield-distribution.md diff --git a/roadmap/implementors-guide/src/node/availability/bitfield-signing.md b/roadmap/implementers-guide/src/node/availability/bitfield-signing.md similarity index 100% rename from roadmap/implementors-guide/src/node/availability/bitfield-signing.md rename to roadmap/implementers-guide/src/node/availability/bitfield-signing.md diff --git a/roadmap/implementors-guide/src/node/backing/README.md b/roadmap/implementers-guide/src/node/backing/README.md similarity index 100% rename from roadmap/implementors-guide/src/node/backing/README.md rename to roadmap/implementers-guide/src/node/backing/README.md diff --git a/roadmap/implementors-guide/src/node/backing/candidate-backing.md b/roadmap/implementers-guide/src/node/backing/candidate-backing.md similarity index 100% rename from roadmap/implementors-guide/src/node/backing/candidate-backing.md rename to roadmap/implementers-guide/src/node/backing/candidate-backing.md diff --git a/roadmap/implementors-guide/src/node/backing/candidate-selection.md b/roadmap/implementers-guide/src/node/backing/candidate-selection.md similarity index 100% rename from roadmap/implementors-guide/src/node/backing/candidate-selection.md rename to roadmap/implementers-guide/src/node/backing/candidate-selection.md diff --git a/roadmap/implementors-guide/src/node/backing/pov-distribution.md b/roadmap/implementers-guide/src/node/backing/pov-distribution.md similarity index 100% rename from roadmap/implementors-guide/src/node/backing/pov-distribution.md rename to roadmap/implementers-guide/src/node/backing/pov-distribution.md diff --git a/roadmap/implementors-guide/src/node/backing/statement-distribution.md b/roadmap/implementers-guide/src/node/backing/statement-distribution.md similarity index 100% rename from roadmap/implementors-guide/src/node/backing/statement-distribution.md rename to roadmap/implementers-guide/src/node/backing/statement-distribution.md diff --git a/roadmap/implementors-guide/src/node/collators/README.md b/roadmap/implementers-guide/src/node/collators/README.md similarity index 100% rename from roadmap/implementors-guide/src/node/collators/README.md rename to roadmap/implementers-guide/src/node/collators/README.md diff --git a/roadmap/implementors-guide/src/node/collators/collation-distribution.md b/roadmap/implementers-guide/src/node/collators/collation-distribution.md similarity index 100% rename from roadmap/implementors-guide/src/node/collators/collation-distribution.md rename to roadmap/implementers-guide/src/node/collators/collation-distribution.md diff --git a/roadmap/implementors-guide/src/node/collators/collation-generation.md b/roadmap/implementers-guide/src/node/collators/collation-generation.md similarity index 100% rename from roadmap/implementors-guide/src/node/collators/collation-generation.md rename to roadmap/implementers-guide/src/node/collators/collation-generation.md diff --git a/roadmap/implementors-guide/src/node/overseer.md b/roadmap/implementers-guide/src/node/overseer.md similarity index 100% rename from roadmap/implementors-guide/src/node/overseer.md rename to roadmap/implementers-guide/src/node/overseer.md diff --git a/roadmap/implementors-guide/src/node/subsystems-and-jobs.md b/roadmap/implementers-guide/src/node/subsystems-and-jobs.md similarity index 100% rename from roadmap/implementors-guide/src/node/subsystems-and-jobs.md rename to roadmap/implementers-guide/src/node/subsystems-and-jobs.md diff --git a/roadmap/implementors-guide/src/node/utility/README.md b/roadmap/implementers-guide/src/node/utility/README.md similarity index 100% rename from roadmap/implementors-guide/src/node/utility/README.md rename to roadmap/implementers-guide/src/node/utility/README.md diff --git a/roadmap/implementors-guide/src/node/utility/availability-store.md b/roadmap/implementers-guide/src/node/utility/availability-store.md similarity index 100% rename from roadmap/implementors-guide/src/node/utility/availability-store.md rename to roadmap/implementers-guide/src/node/utility/availability-store.md diff --git a/roadmap/implementors-guide/src/node/utility/candidate-validation.md b/roadmap/implementers-guide/src/node/utility/candidate-validation.md similarity index 100% rename from roadmap/implementors-guide/src/node/utility/candidate-validation.md rename to roadmap/implementers-guide/src/node/utility/candidate-validation.md diff --git a/roadmap/implementors-guide/src/node/utility/misbehavior-arbitration.md b/roadmap/implementers-guide/src/node/utility/misbehavior-arbitration.md similarity index 100% rename from roadmap/implementors-guide/src/node/utility/misbehavior-arbitration.md rename to roadmap/implementers-guide/src/node/utility/misbehavior-arbitration.md diff --git a/roadmap/implementors-guide/src/node/utility/network-bridge.md b/roadmap/implementers-guide/src/node/utility/network-bridge.md similarity index 100% rename from roadmap/implementors-guide/src/node/utility/network-bridge.md rename to roadmap/implementers-guide/src/node/utility/network-bridge.md diff --git a/roadmap/implementors-guide/src/node/utility/peer-set-manager.md b/roadmap/implementers-guide/src/node/utility/peer-set-manager.md similarity index 100% rename from roadmap/implementors-guide/src/node/utility/peer-set-manager.md rename to roadmap/implementers-guide/src/node/utility/peer-set-manager.md diff --git a/roadmap/implementors-guide/src/node/utility/provisioner.md b/roadmap/implementers-guide/src/node/utility/provisioner.md similarity index 100% rename from roadmap/implementors-guide/src/node/utility/provisioner.md rename to roadmap/implementers-guide/src/node/utility/provisioner.md diff --git a/roadmap/implementors-guide/src/node/utility/runtime-api.md b/roadmap/implementers-guide/src/node/utility/runtime-api.md similarity index 100% rename from roadmap/implementors-guide/src/node/utility/runtime-api.md rename to roadmap/implementers-guide/src/node/utility/runtime-api.md diff --git a/roadmap/implementors-guide/src/node/validity/README.md b/roadmap/implementers-guide/src/node/validity/README.md similarity index 100% rename from roadmap/implementors-guide/src/node/validity/README.md rename to roadmap/implementers-guide/src/node/validity/README.md diff --git a/roadmap/implementors-guide/src/parachains-overview.md b/roadmap/implementers-guide/src/parachains-overview.md similarity index 100% rename from roadmap/implementors-guide/src/parachains-overview.md rename to roadmap/implementers-guide/src/parachains-overview.md diff --git a/roadmap/implementors-guide/src/runtime/README.md b/roadmap/implementers-guide/src/runtime/README.md similarity index 100% rename from roadmap/implementors-guide/src/runtime/README.md rename to roadmap/implementers-guide/src/runtime/README.md diff --git a/roadmap/implementors-guide/src/runtime/configuration.md b/roadmap/implementers-guide/src/runtime/configuration.md similarity index 100% rename from roadmap/implementors-guide/src/runtime/configuration.md rename to roadmap/implementers-guide/src/runtime/configuration.md diff --git a/roadmap/implementors-guide/src/runtime/inclusion.md b/roadmap/implementers-guide/src/runtime/inclusion.md similarity index 100% rename from roadmap/implementors-guide/src/runtime/inclusion.md rename to roadmap/implementers-guide/src/runtime/inclusion.md diff --git a/roadmap/implementors-guide/src/runtime/inclusioninherent.md b/roadmap/implementers-guide/src/runtime/inclusioninherent.md similarity index 100% rename from roadmap/implementors-guide/src/runtime/inclusioninherent.md rename to roadmap/implementers-guide/src/runtime/inclusioninherent.md diff --git a/roadmap/implementors-guide/src/runtime/initializer.md b/roadmap/implementers-guide/src/runtime/initializer.md similarity index 100% rename from roadmap/implementors-guide/src/runtime/initializer.md rename to roadmap/implementers-guide/src/runtime/initializer.md diff --git a/roadmap/implementors-guide/src/runtime/paras.md b/roadmap/implementers-guide/src/runtime/paras.md similarity index 100% rename from roadmap/implementors-guide/src/runtime/paras.md rename to roadmap/implementers-guide/src/runtime/paras.md diff --git a/roadmap/implementors-guide/src/runtime/router.md b/roadmap/implementers-guide/src/runtime/router.md similarity index 100% rename from roadmap/implementors-guide/src/runtime/router.md rename to roadmap/implementers-guide/src/runtime/router.md diff --git a/roadmap/implementors-guide/src/runtime/scheduler.md b/roadmap/implementers-guide/src/runtime/scheduler.md similarity index 100% rename from roadmap/implementors-guide/src/runtime/scheduler.md rename to roadmap/implementers-guide/src/runtime/scheduler.md diff --git a/roadmap/implementors-guide/src/runtime/validity.md b/roadmap/implementers-guide/src/runtime/validity.md similarity index 100% rename from roadmap/implementors-guide/src/runtime/validity.md rename to roadmap/implementers-guide/src/runtime/validity.md diff --git a/roadmap/implementors-guide/src/types/README.md b/roadmap/implementers-guide/src/types/README.md similarity index 100% rename from roadmap/implementors-guide/src/types/README.md rename to roadmap/implementers-guide/src/types/README.md diff --git a/roadmap/implementors-guide/src/types/availability.md b/roadmap/implementers-guide/src/types/availability.md similarity index 100% rename from roadmap/implementors-guide/src/types/availability.md rename to roadmap/implementers-guide/src/types/availability.md diff --git a/roadmap/implementors-guide/src/types/backing.md b/roadmap/implementers-guide/src/types/backing.md similarity index 100% rename from roadmap/implementors-guide/src/types/backing.md rename to roadmap/implementers-guide/src/types/backing.md diff --git a/roadmap/implementors-guide/src/types/candidate.md b/roadmap/implementers-guide/src/types/candidate.md similarity index 100% rename from roadmap/implementors-guide/src/types/candidate.md rename to roadmap/implementers-guide/src/types/candidate.md diff --git a/roadmap/implementors-guide/src/types/chain.md b/roadmap/implementers-guide/src/types/chain.md similarity index 100% rename from roadmap/implementors-guide/src/types/chain.md rename to roadmap/implementers-guide/src/types/chain.md diff --git a/roadmap/implementors-guide/src/types/messages.md b/roadmap/implementers-guide/src/types/messages.md similarity index 100% rename from roadmap/implementors-guide/src/types/messages.md rename to roadmap/implementers-guide/src/types/messages.md diff --git a/roadmap/implementors-guide/src/types/overseer-protocol.md b/roadmap/implementers-guide/src/types/overseer-protocol.md similarity index 100% rename from roadmap/implementors-guide/src/types/overseer-protocol.md rename to roadmap/implementers-guide/src/types/overseer-protocol.md diff --git a/roadmap/implementors-guide/src/types/runtime.md b/roadmap/implementers-guide/src/types/runtime.md similarity index 100% rename from roadmap/implementors-guide/src/types/runtime.md rename to roadmap/implementers-guide/src/types/runtime.md diff --git a/roadmap/implementors-guide/src/whence-parachains.md b/roadmap/implementers-guide/src/whence-parachains.md similarity index 100% rename from roadmap/implementors-guide/src/whence-parachains.md rename to roadmap/implementers-guide/src/whence-parachains.md -- GitLab From 1e1169d4a2a8d33eb36e73a002864329fb8530a1 Mon Sep 17 00:00:00 2001 From: Shaopeng Wang Date: Wed, 8 Jul 2020 19:07:19 +1200 Subject: [PATCH 040/192] Companion for #6500 (decl_module: frame_system as default ident) (#1314) * Update decl_storage usage with frame_system as default ident. * More decl_module usage update. * 'Update substrate' Co-authored-by: parity-processbot <> --- Cargo.lock | 275 +++++++++---------- runtime/common/src/attestations.rs | 2 +- runtime/common/src/claims.rs | 2 +- runtime/common/src/crowdfund.rs | 2 +- runtime/common/src/parachains.rs | 2 +- runtime/common/src/registrar.rs | 2 +- runtime/common/src/slots.rs | 2 +- runtime/parachains/src/configuration.rs | 2 +- runtime/parachains/src/inclusion.rs | 2 +- runtime/parachains/src/inclusion_inherent.rs | 2 +- runtime/parachains/src/initializer.rs | 2 +- runtime/parachains/src/paras.rs | 2 +- runtime/parachains/src/scheduler.rs | 2 +- 13 files changed, 149 insertions(+), 150 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 2a9acaf6cf..756385e253 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1261,7 +1261,7 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "fork-tree" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" +source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" dependencies = [ "parity-scale-codec", ] @@ -1269,7 +1269,7 @@ dependencies = [ [[package]] name = "frame-benchmarking" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" +source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" dependencies = [ "frame-support", "frame-system", @@ -1286,7 +1286,7 @@ dependencies = [ [[package]] name = "frame-benchmarking-cli" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" +source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" dependencies = [ "Inflector", "frame-benchmarking", @@ -1305,7 +1305,7 @@ dependencies = [ [[package]] name = "frame-executive" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" +source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" dependencies = [ "frame-support", "frame-system", @@ -1320,7 +1320,7 @@ dependencies = [ [[package]] name = "frame-metadata" version = "11.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" +source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" dependencies = [ "parity-scale-codec", "serde", @@ -1331,7 +1331,7 @@ dependencies = [ [[package]] name = "frame-support" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" +source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" dependencies = [ "bitmask", "frame-metadata", @@ -1356,7 +1356,7 @@ dependencies = [ [[package]] name = "frame-support-procedural" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" +source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" dependencies = [ "frame-support-procedural-tools", "proc-macro2 1.0.18", @@ -1367,7 +1367,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" +source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" dependencies = [ "frame-support-procedural-tools-derive", "proc-macro-crate", @@ -1379,7 +1379,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools-derive" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" +source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" dependencies = [ "proc-macro2 1.0.18", "quote 1.0.7", @@ -1389,7 +1389,7 @@ dependencies = [ [[package]] name = "frame-system" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" +source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" dependencies = [ "frame-support", "impl-trait-for-tuples", @@ -1405,7 +1405,7 @@ dependencies = [ [[package]] name = "frame-system-benchmarking" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" +source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" dependencies = [ "frame-benchmarking", "frame-support", @@ -1419,7 +1419,7 @@ dependencies = [ [[package]] name = "frame-system-rpc-runtime-api" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" +source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" dependencies = [ "parity-scale-codec", "sp-api", @@ -3376,7 +3376,7 @@ dependencies = [ [[package]] name = "pallet-authority-discovery" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" +source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" dependencies = [ "frame-support", "frame-system", @@ -3392,7 +3392,7 @@ dependencies = [ [[package]] name = "pallet-authorship" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" +source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" dependencies = [ "frame-support", "frame-system", @@ -3407,7 +3407,7 @@ dependencies = [ [[package]] name = "pallet-babe" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" +source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" dependencies = [ "frame-benchmarking", "frame-support", @@ -3432,7 +3432,7 @@ dependencies = [ [[package]] name = "pallet-balances" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" +source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" dependencies = [ "frame-benchmarking", "frame-support", @@ -3446,7 +3446,7 @@ dependencies = [ [[package]] name = "pallet-collective" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" +source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" dependencies = [ "frame-benchmarking", "frame-support", @@ -3462,7 +3462,7 @@ dependencies = [ [[package]] name = "pallet-democracy" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" +source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" dependencies = [ "frame-benchmarking", "frame-support", @@ -3477,7 +3477,7 @@ dependencies = [ [[package]] name = "pallet-elections-phragmen" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" +source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" dependencies = [ "frame-benchmarking", "frame-support", @@ -3492,7 +3492,7 @@ dependencies = [ [[package]] name = "pallet-finality-tracker" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" +source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" dependencies = [ "frame-support", "frame-system", @@ -3508,7 +3508,7 @@ dependencies = [ [[package]] name = "pallet-grandpa" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" +source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" dependencies = [ "frame-support", "frame-system", @@ -3528,7 +3528,7 @@ dependencies = [ [[package]] name = "pallet-identity" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" +source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" dependencies = [ "enumflags2", "frame-benchmarking", @@ -3544,7 +3544,7 @@ dependencies = [ [[package]] name = "pallet-im-online" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" +source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" dependencies = [ "frame-benchmarking", "frame-support", @@ -3564,7 +3564,7 @@ dependencies = [ [[package]] name = "pallet-indices" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" +source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" dependencies = [ "frame-support", "frame-system", @@ -3580,7 +3580,7 @@ dependencies = [ [[package]] name = "pallet-membership" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" +source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" dependencies = [ "frame-support", "frame-system", @@ -3594,7 +3594,7 @@ dependencies = [ [[package]] name = "pallet-multisig" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" +source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" dependencies = [ "frame-support", "frame-system", @@ -3609,7 +3609,7 @@ dependencies = [ [[package]] name = "pallet-nicks" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" +source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" dependencies = [ "frame-support", "frame-system", @@ -3623,7 +3623,7 @@ dependencies = [ [[package]] name = "pallet-offences" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" +source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" dependencies = [ "frame-support", "frame-system", @@ -3638,7 +3638,7 @@ dependencies = [ [[package]] name = "pallet-offences-benchmarking" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" +source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" dependencies = [ "frame-benchmarking", "frame-support", @@ -3659,7 +3659,7 @@ dependencies = [ [[package]] name = "pallet-proxy" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" +source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" dependencies = [ "frame-support", "frame-system", @@ -3674,7 +3674,7 @@ dependencies = [ [[package]] name = "pallet-randomness-collective-flip" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" +source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" dependencies = [ "frame-support", "frame-system", @@ -3687,7 +3687,7 @@ dependencies = [ [[package]] name = "pallet-recovery" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" +source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" dependencies = [ "enumflags2", "frame-support", @@ -3702,7 +3702,7 @@ dependencies = [ [[package]] name = "pallet-scheduler" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" +source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" dependencies = [ "frame-benchmarking", "frame-support", @@ -3717,7 +3717,7 @@ dependencies = [ [[package]] name = "pallet-session" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" +source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" dependencies = [ "frame-support", "frame-system", @@ -3737,7 +3737,7 @@ dependencies = [ [[package]] name = "pallet-session-benchmarking" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" +source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" dependencies = [ "frame-benchmarking", "frame-support", @@ -3753,7 +3753,7 @@ dependencies = [ [[package]] name = "pallet-society" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" +source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" dependencies = [ "frame-support", "frame-system", @@ -3767,7 +3767,7 @@ dependencies = [ [[package]] name = "pallet-staking" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" +source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" dependencies = [ "frame-benchmarking", "frame-support", @@ -3789,7 +3789,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-curve" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" +source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -3800,7 +3800,7 @@ dependencies = [ [[package]] name = "pallet-sudo" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" +source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" dependencies = [ "frame-support", "frame-system", @@ -3814,7 +3814,7 @@ dependencies = [ [[package]] name = "pallet-timestamp" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" +source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" dependencies = [ "frame-benchmarking", "frame-support", @@ -3832,7 +3832,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" +source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" dependencies = [ "frame-support", "frame-system", @@ -3847,7 +3847,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" +source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" dependencies = [ "jsonrpc-core", "jsonrpc-core-client", @@ -3865,7 +3865,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc-runtime-api" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" +source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" dependencies = [ "frame-support", "parity-scale-codec", @@ -3878,7 +3878,7 @@ dependencies = [ [[package]] name = "pallet-treasury" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" +source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" dependencies = [ "frame-benchmarking", "frame-support", @@ -3893,7 +3893,7 @@ dependencies = [ [[package]] name = "pallet-utility" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" +source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" dependencies = [ "frame-benchmarking", "frame-support", @@ -3909,7 +3909,7 @@ dependencies = [ [[package]] name = "pallet-vesting" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" +source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" dependencies = [ "enumflags2", "frame-benchmarking", @@ -5761,7 +5761,7 @@ dependencies = [ [[package]] name = "sc-authority-discovery" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" +source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" dependencies = [ "bytes 0.5.4", "derive_more 0.99.8", @@ -5788,7 +5788,7 @@ dependencies = [ [[package]] name = "sc-basic-authorship" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" +source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -5812,7 +5812,7 @@ dependencies = [ [[package]] name = "sc-block-builder" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" +source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" dependencies = [ "parity-scale-codec", "sc-client-api", @@ -5829,7 +5829,7 @@ dependencies = [ [[package]] name = "sc-chain-spec" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" +source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" dependencies = [ "impl-trait-for-tuples", "sc-chain-spec-derive", @@ -5845,7 +5845,7 @@ dependencies = [ [[package]] name = "sc-chain-spec-derive" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" +source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -5856,7 +5856,7 @@ dependencies = [ [[package]] name = "sc-cli" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" +source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" dependencies = [ "ansi_term 0.12.1", "atty", @@ -5897,7 +5897,7 @@ dependencies = [ [[package]] name = "sc-client-api" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" +source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" dependencies = [ "derive_more 0.99.8", "fnv", @@ -5933,7 +5933,7 @@ dependencies = [ [[package]] name = "sc-client-db" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" +source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" dependencies = [ "blake2-rfc", "hash-db", @@ -5962,7 +5962,7 @@ dependencies = [ [[package]] name = "sc-consensus" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" +source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" dependencies = [ "sc-client-api", "sp-blockchain", @@ -5973,7 +5973,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" +source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" dependencies = [ "derive_more 0.99.8", "fork-tree", @@ -6015,7 +6015,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe-rpc" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" +source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" dependencies = [ "derive_more 0.99.8", "futures 0.3.5", @@ -6039,7 +6039,7 @@ dependencies = [ [[package]] name = "sc-consensus-epochs" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" +source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" dependencies = [ "fork-tree", "parity-scale-codec", @@ -6052,7 +6052,7 @@ dependencies = [ [[package]] name = "sc-consensus-slots" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" +source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6075,7 +6075,7 @@ dependencies = [ [[package]] name = "sc-consensus-uncles" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" +source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" dependencies = [ "log 0.4.8", "sc-client-api", @@ -6089,7 +6089,7 @@ dependencies = [ [[package]] name = "sc-executor" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" +source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" dependencies = [ "derive_more 0.99.8", "lazy_static", @@ -6117,7 +6117,7 @@ dependencies = [ [[package]] name = "sc-executor-common" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" +source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" dependencies = [ "derive_more 0.99.8", "log 0.4.8", @@ -6134,7 +6134,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmi" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" +source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" dependencies = [ "log 0.4.8", "parity-scale-codec", @@ -6149,7 +6149,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmtime" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" +source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" dependencies = [ "cranelift-codegen", "cranelift-wasm", @@ -6170,7 +6170,7 @@ dependencies = [ [[package]] name = "sc-finality-grandpa" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" +source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" dependencies = [ "assert_matches", "derive_more 0.99.8", @@ -6208,7 +6208,7 @@ dependencies = [ [[package]] name = "sc-finality-grandpa-rpc" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" +source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" dependencies = [ "derive_more 0.99.8", "finality-grandpa", @@ -6225,13 +6225,12 @@ dependencies = [ [[package]] name = "sc-informant" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" +source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" dependencies = [ "ansi_term 0.12.1", "futures 0.3.5", "log 0.4.8", "parity-util-mem", - "parking_lot 0.10.2", "sc-client-api", "sc-network", "sp-blockchain", @@ -6244,7 +6243,7 @@ dependencies = [ [[package]] name = "sc-keystore" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" +source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" dependencies = [ "derive_more 0.99.8", "hex", @@ -6260,7 +6259,7 @@ dependencies = [ [[package]] name = "sc-light" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" +source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" dependencies = [ "hash-db", "lazy_static", @@ -6279,7 +6278,7 @@ dependencies = [ [[package]] name = "sc-network" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" +source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" dependencies = [ "bitflags", "bs58", @@ -6331,7 +6330,7 @@ dependencies = [ [[package]] name = "sc-network-gossip" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" +source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6346,7 +6345,7 @@ dependencies = [ [[package]] name = "sc-network-test" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" +source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" dependencies = [ "env_logger", "futures 0.3.5", @@ -6373,7 +6372,7 @@ dependencies = [ [[package]] name = "sc-offchain" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" +source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" dependencies = [ "bytes 0.5.4", "fnv", @@ -6400,7 +6399,7 @@ dependencies = [ [[package]] name = "sc-peerset" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" +source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" dependencies = [ "futures 0.3.5", "libp2p", @@ -6413,7 +6412,7 @@ dependencies = [ [[package]] name = "sc-proposer-metrics" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" +source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" dependencies = [ "log 0.4.8", "substrate-prometheus-endpoint", @@ -6422,7 +6421,7 @@ dependencies = [ [[package]] name = "sc-rpc" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" +source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" dependencies = [ "futures 0.3.5", "hash-db", @@ -6454,7 +6453,7 @@ dependencies = [ [[package]] name = "sc-rpc-api" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" +source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" dependencies = [ "derive_more 0.99.8", "futures 0.3.5", @@ -6478,7 +6477,7 @@ dependencies = [ [[package]] name = "sc-rpc-server" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" +source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" dependencies = [ "jsonrpc-core", "jsonrpc-http-server", @@ -6494,7 +6493,7 @@ dependencies = [ [[package]] name = "sc-service" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" +source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" dependencies = [ "derive_more 0.99.8", "directories", @@ -6557,7 +6556,7 @@ dependencies = [ [[package]] name = "sc-state-db" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" +source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" dependencies = [ "log 0.4.8", "parity-scale-codec", @@ -6571,7 +6570,7 @@ dependencies = [ [[package]] name = "sc-telemetry" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" +source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6592,7 +6591,7 @@ dependencies = [ [[package]] name = "sc-tracing" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" +source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" dependencies = [ "erased-serde", "log 0.4.8", @@ -6609,7 +6608,7 @@ dependencies = [ [[package]] name = "sc-transaction-graph" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" +source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" dependencies = [ "derive_more 0.99.8", "futures 0.3.5", @@ -6629,7 +6628,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" +source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" dependencies = [ "derive_more 0.99.8", "futures 0.3.5", @@ -7015,7 +7014,7 @@ dependencies = [ [[package]] name = "sp-allocator" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" +source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" dependencies = [ "derive_more 0.99.8", "log 0.4.8", @@ -7027,7 +7026,7 @@ dependencies = [ [[package]] name = "sp-api" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" +source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" dependencies = [ "hash-db", "parity-scale-codec", @@ -7042,7 +7041,7 @@ dependencies = [ [[package]] name = "sp-api-proc-macro" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" +source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" dependencies = [ "blake2-rfc", "proc-macro-crate", @@ -7054,7 +7053,7 @@ dependencies = [ [[package]] name = "sp-application-crypto" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" +source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" dependencies = [ "parity-scale-codec", "serde", @@ -7066,7 +7065,7 @@ dependencies = [ [[package]] name = "sp-arithmetic" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" +source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" dependencies = [ "integer-sqrt", "num-traits 0.2.12", @@ -7079,7 +7078,7 @@ dependencies = [ [[package]] name = "sp-authority-discovery" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" +source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" dependencies = [ "parity-scale-codec", "sp-api", @@ -7091,7 +7090,7 @@ dependencies = [ [[package]] name = "sp-authorship" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" +source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" dependencies = [ "parity-scale-codec", "sp-inherents", @@ -7102,7 +7101,7 @@ dependencies = [ [[package]] name = "sp-block-builder" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" +source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" dependencies = [ "parity-scale-codec", "sp-api", @@ -7114,7 +7113,7 @@ dependencies = [ [[package]] name = "sp-blockchain" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" +source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" dependencies = [ "derive_more 0.99.8", "log 0.4.8", @@ -7130,7 +7129,7 @@ dependencies = [ [[package]] name = "sp-chain-spec" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" +source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" dependencies = [ "serde", "serde_json", @@ -7139,7 +7138,7 @@ dependencies = [ [[package]] name = "sp-consensus" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" +source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" dependencies = [ "derive_more 0.99.8", "futures 0.3.5", @@ -7163,7 +7162,7 @@ dependencies = [ [[package]] name = "sp-consensus-aura" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" +source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" dependencies = [ "parity-scale-codec", "sp-api", @@ -7177,7 +7176,7 @@ dependencies = [ [[package]] name = "sp-consensus-babe" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" +source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" dependencies = [ "merlin", "parity-scale-codec", @@ -7196,7 +7195,7 @@ dependencies = [ [[package]] name = "sp-consensus-slots" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" +source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" dependencies = [ "parity-scale-codec", "sp-runtime", @@ -7205,7 +7204,7 @@ dependencies = [ [[package]] name = "sp-consensus-vrf" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" +source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" dependencies = [ "parity-scale-codec", "schnorrkel", @@ -7217,7 +7216,7 @@ dependencies = [ [[package]] name = "sp-core" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" +source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" dependencies = [ "base58", "blake2-rfc", @@ -7260,7 +7259,7 @@ dependencies = [ [[package]] name = "sp-database" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" +source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" dependencies = [ "kvdb", "parking_lot 0.10.2", @@ -7269,7 +7268,7 @@ dependencies = [ [[package]] name = "sp-debug-derive" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" +source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" dependencies = [ "proc-macro2 1.0.18", "quote 1.0.7", @@ -7279,7 +7278,7 @@ dependencies = [ [[package]] name = "sp-externalities" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" +source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" dependencies = [ "environmental", "parity-scale-codec", @@ -7290,7 +7289,7 @@ dependencies = [ [[package]] name = "sp-finality-grandpa" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" +source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" dependencies = [ "finality-grandpa", "log 0.4.8", @@ -7306,7 +7305,7 @@ dependencies = [ [[package]] name = "sp-finality-tracker" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" +source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" dependencies = [ "parity-scale-codec", "sp-inherents", @@ -7316,7 +7315,7 @@ dependencies = [ [[package]] name = "sp-inherents" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" +source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" dependencies = [ "derive_more 0.99.8", "parity-scale-codec", @@ -7328,7 +7327,7 @@ dependencies = [ [[package]] name = "sp-io" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" +source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" dependencies = [ "futures 0.3.5", "hash-db", @@ -7349,7 +7348,7 @@ dependencies = [ [[package]] name = "sp-keyring" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" +source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" dependencies = [ "lazy_static", "sp-core", @@ -7360,7 +7359,7 @@ dependencies = [ [[package]] name = "sp-npos-elections" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" +source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" dependencies = [ "parity-scale-codec", "serde", @@ -7372,7 +7371,7 @@ dependencies = [ [[package]] name = "sp-npos-elections-compact" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" +source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -7383,7 +7382,7 @@ dependencies = [ [[package]] name = "sp-offchain" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" +source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" dependencies = [ "sp-api", "sp-core", @@ -7393,7 +7392,7 @@ dependencies = [ [[package]] name = "sp-panic-handler" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" +source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" dependencies = [ "backtrace", "log 0.4.8", @@ -7402,7 +7401,7 @@ dependencies = [ [[package]] name = "sp-rpc" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" +source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" dependencies = [ "serde", "sp-core", @@ -7411,7 +7410,7 @@ dependencies = [ [[package]] name = "sp-runtime" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" +source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" dependencies = [ "either", "hash256-std-hasher", @@ -7433,7 +7432,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" +source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" dependencies = [ "parity-scale-codec", "primitive-types", @@ -7448,7 +7447,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" +source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" dependencies = [ "Inflector", "proc-macro-crate", @@ -7460,7 +7459,7 @@ dependencies = [ [[package]] name = "sp-serializer" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" +source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" dependencies = [ "serde", "serde_json", @@ -7469,7 +7468,7 @@ dependencies = [ [[package]] name = "sp-session" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" +source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" dependencies = [ "parity-scale-codec", "sp-api", @@ -7482,7 +7481,7 @@ dependencies = [ [[package]] name = "sp-staking" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" +source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" dependencies = [ "parity-scale-codec", "sp-runtime", @@ -7492,7 +7491,7 @@ dependencies = [ [[package]] name = "sp-state-machine" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" +source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" dependencies = [ "hash-db", "itertools 0.9.0", @@ -7513,12 +7512,12 @@ dependencies = [ [[package]] name = "sp-std" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" +source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" [[package]] name = "sp-storage" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" +source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" dependencies = [ "impl-serde 0.2.3", "ref-cast", @@ -7530,7 +7529,7 @@ dependencies = [ [[package]] name = "sp-timestamp" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" +source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -7544,7 +7543,7 @@ dependencies = [ [[package]] name = "sp-tracing" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" +source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" dependencies = [ "log 0.4.8", "rental", @@ -7554,7 +7553,7 @@ dependencies = [ [[package]] name = "sp-transaction-pool" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" +source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" dependencies = [ "derive_more 0.99.8", "futures 0.3.5", @@ -7570,7 +7569,7 @@ dependencies = [ [[package]] name = "sp-trie" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" +source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" dependencies = [ "hash-db", "memory-db", @@ -7584,7 +7583,7 @@ dependencies = [ [[package]] name = "sp-utils" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" +source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" dependencies = [ "futures 0.3.5", "futures-core", @@ -7596,7 +7595,7 @@ dependencies = [ [[package]] name = "sp-version" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" +source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" dependencies = [ "impl-serde 0.2.3", "parity-scale-codec", @@ -7608,7 +7607,7 @@ dependencies = [ [[package]] name = "sp-wasm-interface" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" +source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -7748,7 +7747,7 @@ dependencies = [ [[package]] name = "substrate-browser-utils" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" +source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" dependencies = [ "chrono", "clear_on_drop", @@ -7775,7 +7774,7 @@ dependencies = [ [[package]] name = "substrate-build-script-utils" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" +source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" dependencies = [ "platforms", ] @@ -7783,7 +7782,7 @@ dependencies = [ [[package]] name = "substrate-frame-rpc-system" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" +source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" dependencies = [ "frame-system-rpc-runtime-api", "futures 0.3.5", @@ -7806,7 +7805,7 @@ dependencies = [ [[package]] name = "substrate-prometheus-endpoint" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" +source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" dependencies = [ "async-std", "derive_more 0.99.8", @@ -7820,7 +7819,7 @@ dependencies = [ [[package]] name = "substrate-test-client" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" +source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" dependencies = [ "futures 0.1.29", "futures 0.3.5", @@ -7844,7 +7843,7 @@ dependencies = [ [[package]] name = "substrate-test-runtime" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" +source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" dependencies = [ "cfg-if", "frame-executive", @@ -7884,7 +7883,7 @@ dependencies = [ [[package]] name = "substrate-test-runtime-client" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" +source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" dependencies = [ "futures 0.3.5", "parity-scale-codec", @@ -7905,7 +7904,7 @@ dependencies = [ [[package]] name = "substrate-wasm-builder-runner" version = "1.0.6" -source = "git+https://github.com/paritytech/substrate#c5368a1f1e1ee285ce40dc0d9198abbf3425cca9" +source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" [[package]] name = "substrate-wasm-builder-runner" diff --git a/runtime/common/src/attestations.rs b/runtime/common/src/attestations.rs index 97080fc64a..f27874117a 100644 --- a/runtime/common/src/attestations.rs +++ b/runtime/common/src/attestations.rs @@ -130,7 +130,7 @@ decl_error! { decl_module! { /// Parachain-attestations module. - pub struct Module for enum Call where origin: ::Origin { + pub struct Module for enum Call where origin: ::Origin, system = system { type Error = Error; /// Provide candidate receipts for parachains, in ascending order by id. diff --git a/runtime/common/src/claims.rs b/runtime/common/src/claims.rs index 7c3f4e42e1..8d063534a8 100644 --- a/runtime/common/src/claims.rs +++ b/runtime/common/src/claims.rs @@ -194,7 +194,7 @@ decl_storage! { } decl_module! { - pub struct Module for enum Call where origin: T::Origin { + pub struct Module for enum Call where origin: T::Origin, system = system { type Error = Error; /// The Prefix that is used in signed Ethereum messages for this network diff --git a/runtime/common/src/crowdfund.rs b/runtime/common/src/crowdfund.rs index 15160f7fc0..be187e1c0e 100644 --- a/runtime/common/src/crowdfund.rs +++ b/runtime/common/src/crowdfund.rs @@ -244,7 +244,7 @@ decl_error! { } decl_module! { - pub struct Module for enum Call where origin: T::Origin { + pub struct Module for enum Call where origin: T::Origin, system = system { type Error = Error; const ModuleId: ModuleId = T::ModuleId::get(); diff --git a/runtime/common/src/parachains.rs b/runtime/common/src/parachains.rs index 0d2c900002..0fb600cfdb 100644 --- a/runtime/common/src/parachains.rs +++ b/runtime/common/src/parachains.rs @@ -575,7 +575,7 @@ decl_error! { decl_module! { /// Parachains module. - pub struct Module for enum Call where origin: ::Origin { + pub struct Module for enum Call where origin: ::Origin, system = system { type Error = Error; fn on_initialize(now: T::BlockNumber) -> Weight { diff --git a/runtime/common/src/registrar.rs b/runtime/common/src/registrar.rs index 3a20f08f5b..60f35131dc 100644 --- a/runtime/common/src/registrar.rs +++ b/runtime/common/src/registrar.rs @@ -254,7 +254,7 @@ decl_error! { decl_module! { /// Parachains module. - pub struct Module for enum Call where origin: ::Origin { + pub struct Module for enum Call where origin: ::Origin, system = system { type Error = Error; fn deposit_event() = default; diff --git a/runtime/common/src/slots.rs b/runtime/common/src/slots.rs index b3140278f9..0abed1f85f 100644 --- a/runtime/common/src/slots.rs +++ b/runtime/common/src/slots.rs @@ -262,7 +262,7 @@ decl_error! { } decl_module! { - pub struct Module for enum Call where origin: T::Origin { + pub struct Module for enum Call where origin: T::Origin, system = system { type Error = Error; fn deposit_event() = default; diff --git a/runtime/parachains/src/configuration.rs b/runtime/parachains/src/configuration.rs index 01d379fbee..792dfe89a7 100644 --- a/runtime/parachains/src/configuration.rs +++ b/runtime/parachains/src/configuration.rs @@ -79,7 +79,7 @@ decl_error! { decl_module! { /// The parachains configuration module. - pub struct Module for enum Call where origin: ::Origin { + pub struct Module for enum Call where origin: ::Origin, system = system { type Error = Error; /// Set the validation upgrade frequency. diff --git a/runtime/parachains/src/inclusion.rs b/runtime/parachains/src/inclusion.rs index f9696bb33c..5819e3a06c 100644 --- a/runtime/parachains/src/inclusion.rs +++ b/runtime/parachains/src/inclusion.rs @@ -127,7 +127,7 @@ decl_error! { decl_module! { /// The parachain-candidate inclusion module. - pub struct Module for enum Call where origin: ::Origin { + pub struct Module for enum Call where origin: ::Origin, system = system { type Error = Error; } } diff --git a/runtime/parachains/src/inclusion_inherent.rs b/runtime/parachains/src/inclusion_inherent.rs index ac092f6b48..282b6f3b8a 100644 --- a/runtime/parachains/src/inclusion_inherent.rs +++ b/runtime/parachains/src/inclusion_inherent.rs @@ -62,7 +62,7 @@ decl_error! { decl_module! { /// The inclusion inherent module. - pub struct Module for enum Call where origin: ::Origin { + pub struct Module for enum Call where origin: ::Origin, system = system { type Error = Error; fn on_initialize() -> Weight { diff --git a/runtime/parachains/src/initializer.rs b/runtime/parachains/src/initializer.rs index 5668a216f0..0f7f4b74ec 100644 --- a/runtime/parachains/src/initializer.rs +++ b/runtime/parachains/src/initializer.rs @@ -73,7 +73,7 @@ decl_error! { decl_module! { /// The initializer module. - pub struct Module for enum Call where origin: ::Origin { + pub struct Module for enum Call where origin: ::Origin, system = system { type Error = Error; fn on_initialize(now: T::BlockNumber) -> Weight { diff --git a/runtime/parachains/src/paras.rs b/runtime/parachains/src/paras.rs index 3bd55e2778..8c095751b3 100644 --- a/runtime/parachains/src/paras.rs +++ b/runtime/parachains/src/paras.rs @@ -240,7 +240,7 @@ decl_error! { decl_module! { /// The parachains configuration module. - pub struct Module for enum Call where origin: ::Origin { + pub struct Module for enum Call where origin: ::Origin, system = system { type Error = Error; } } diff --git a/runtime/parachains/src/scheduler.rs b/runtime/parachains/src/scheduler.rs index 6539915946..212c782d64 100644 --- a/runtime/parachains/src/scheduler.rs +++ b/runtime/parachains/src/scheduler.rs @@ -227,7 +227,7 @@ decl_error! { decl_module! { /// The scheduler module. - pub struct Module for enum Call where origin: ::Origin { + pub struct Module for enum Call where origin: ::Origin, system = system { type Error = Error; } } -- GitLab From 5a3e236d07b738cedd8968ae3b2bd45ba43b3abf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Wed, 8 Jul 2020 11:42:46 +0200 Subject: [PATCH 041/192] Companion for #6584 (#1373) * Companion for #6584 https://github.com/paritytech/substrate/pull/6584 * updating sp-io * Update dev-dependency, too * update lockfile Co-authored-by: Benjamin Kampmann --- Cargo.lock | 351 +++++++++++++++++----------------- availability-store/Cargo.toml | 6 +- runtime/common/Cargo.toml | 2 +- runtime/polkadot/Cargo.toml | 2 +- 4 files changed, 182 insertions(+), 179 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 756385e253..2fb1cab8fc 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -89,6 +89,12 @@ dependencies = [ "const-random", ] +[[package]] +name = "ahash" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8fd72866655d1904d6b0997d0b07ba561047d070fbe29de039031c641b61217" + [[package]] name = "aho-corasick" version = "0.7.10" @@ -1261,7 +1267,7 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "fork-tree" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" +source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" dependencies = [ "parity-scale-codec", ] @@ -1269,7 +1275,7 @@ dependencies = [ [[package]] name = "frame-benchmarking" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" +source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" dependencies = [ "frame-support", "frame-system", @@ -1286,7 +1292,7 @@ dependencies = [ [[package]] name = "frame-benchmarking-cli" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" +source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" dependencies = [ "Inflector", "frame-benchmarking", @@ -1305,7 +1311,7 @@ dependencies = [ [[package]] name = "frame-executive" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" +source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" dependencies = [ "frame-support", "frame-system", @@ -1320,7 +1326,7 @@ dependencies = [ [[package]] name = "frame-metadata" version = "11.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" +source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" dependencies = [ "parity-scale-codec", "serde", @@ -1331,7 +1337,7 @@ dependencies = [ [[package]] name = "frame-support" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" +source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" dependencies = [ "bitmask", "frame-metadata", @@ -1356,7 +1362,7 @@ dependencies = [ [[package]] name = "frame-support-procedural" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" +source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" dependencies = [ "frame-support-procedural-tools", "proc-macro2 1.0.18", @@ -1367,7 +1373,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" +source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" dependencies = [ "frame-support-procedural-tools-derive", "proc-macro-crate", @@ -1379,7 +1385,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools-derive" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" +source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" dependencies = [ "proc-macro2 1.0.18", "quote 1.0.7", @@ -1389,7 +1395,7 @@ dependencies = [ [[package]] name = "frame-system" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" +source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" dependencies = [ "frame-support", "impl-trait-for-tuples", @@ -1405,7 +1411,7 @@ dependencies = [ [[package]] name = "frame-system-benchmarking" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" +source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" dependencies = [ "frame-benchmarking", "frame-support", @@ -1419,7 +1425,7 @@ dependencies = [ [[package]] name = "frame-system-rpc-runtime-api" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" +source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" dependencies = [ "parity-scale-codec", "sp-api", @@ -1840,10 +1846,20 @@ version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e6073d0ca812575946eb5f35ff68dbe519907b25c42530389ff946dc84c6ead" dependencies = [ - "ahash", + "ahash 0.2.18", "autocfg 0.1.7", ] +[[package]] +name = "hashbrown" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab9b7860757ce258c89fd48d28b68c41713e597a7b09e793f6c6a6e2ea37c827" +dependencies = [ + "ahash 0.3.8", + "autocfg 1.0.0", +] + [[package]] name = "heck" version = "0.3.1" @@ -2432,9 +2448,9 @@ dependencies = [ [[package]] name = "kvdb" -version = "0.6.0" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e763b2a9b500ba47948061d1e8bc3b5f03a8a1f067dbcf822a4d2c84d2b54a3a" +checksum = "0315ef2f688e33844400b31f11c263f2b3dc21d8b9355c6891c5f185fae43f9a" dependencies = [ "parity-util-mem", "smallvec 1.4.1", @@ -2442,9 +2458,9 @@ dependencies = [ [[package]] name = "kvdb-memorydb" -version = "0.6.0" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73027d5e228de6f503b5b7335d530404fc26230a6ae3e09b33ec6e45408509a4" +checksum = "73de822b260a3bdfb889dbbb65bb2d473eee2253973d6fa4a5d149a2a4a7c66e" dependencies = [ "kvdb", "parity-util-mem", @@ -2453,9 +2469,9 @@ dependencies = [ [[package]] name = "kvdb-rocksdb" -version = "0.8.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84384eca250c7ff67877eda5336f28a86586aaee24acb945643590671f6bfce1" +checksum = "7c341ef15cfb1f923fa3b5138bfbd2d4813a2c1640b473727a53351c7f0b0fa2" dependencies = [ "fs-swap", "kvdb", @@ -2471,9 +2487,9 @@ dependencies = [ [[package]] name = "kvdb-web" -version = "0.6.0" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c7f36acb1841d4c701d30ae1f2cfd242e805991443f75f6935479ed3de64903" +checksum = "2701a1369d6ea4f1b9f606db46e5e2a4a8e47f22530a07823d653f85ab1f6c34" dependencies = [ "futures 0.3.5", "js-sys", @@ -2924,7 +2940,7 @@ version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0609345ddee5badacf857d4f547e0e5a2e987db77085c24cd887f73573a04237" dependencies = [ - "hashbrown", + "hashbrown 0.6.3", ] [[package]] @@ -2984,13 +3000,12 @@ dependencies = [ [[package]] name = "memory-db" -version = "0.21.0" +version = "0.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb2999ff7a65d5a1d72172f6d51fa2ea03024b51aee709ba5ff81c3c629a2410" +checksum = "0777fbb396f666701d939e9b3876c18ada6b3581257d88631f2590bc366d8ebe" dependencies = [ - "ahash", "hash-db", - "hashbrown", + "hashbrown 0.8.0", "parity-util-mem", ] @@ -3376,7 +3391,7 @@ dependencies = [ [[package]] name = "pallet-authority-discovery" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" +source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" dependencies = [ "frame-support", "frame-system", @@ -3392,7 +3407,7 @@ dependencies = [ [[package]] name = "pallet-authorship" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" +source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" dependencies = [ "frame-support", "frame-system", @@ -3407,7 +3422,7 @@ dependencies = [ [[package]] name = "pallet-babe" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" +source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" dependencies = [ "frame-benchmarking", "frame-support", @@ -3432,7 +3447,7 @@ dependencies = [ [[package]] name = "pallet-balances" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" +source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" dependencies = [ "frame-benchmarking", "frame-support", @@ -3446,7 +3461,7 @@ dependencies = [ [[package]] name = "pallet-collective" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" +source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" dependencies = [ "frame-benchmarking", "frame-support", @@ -3462,7 +3477,7 @@ dependencies = [ [[package]] name = "pallet-democracy" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" +source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" dependencies = [ "frame-benchmarking", "frame-support", @@ -3477,7 +3492,7 @@ dependencies = [ [[package]] name = "pallet-elections-phragmen" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" +source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" dependencies = [ "frame-benchmarking", "frame-support", @@ -3492,7 +3507,7 @@ dependencies = [ [[package]] name = "pallet-finality-tracker" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" +source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" dependencies = [ "frame-support", "frame-system", @@ -3508,7 +3523,7 @@ dependencies = [ [[package]] name = "pallet-grandpa" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" +source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" dependencies = [ "frame-support", "frame-system", @@ -3528,7 +3543,7 @@ dependencies = [ [[package]] name = "pallet-identity" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" +source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" dependencies = [ "enumflags2", "frame-benchmarking", @@ -3544,7 +3559,7 @@ dependencies = [ [[package]] name = "pallet-im-online" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" +source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" dependencies = [ "frame-benchmarking", "frame-support", @@ -3564,7 +3579,7 @@ dependencies = [ [[package]] name = "pallet-indices" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" +source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" dependencies = [ "frame-support", "frame-system", @@ -3580,7 +3595,7 @@ dependencies = [ [[package]] name = "pallet-membership" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" +source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" dependencies = [ "frame-support", "frame-system", @@ -3594,7 +3609,7 @@ dependencies = [ [[package]] name = "pallet-multisig" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" +source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" dependencies = [ "frame-support", "frame-system", @@ -3609,7 +3624,7 @@ dependencies = [ [[package]] name = "pallet-nicks" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" +source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" dependencies = [ "frame-support", "frame-system", @@ -3623,7 +3638,7 @@ dependencies = [ [[package]] name = "pallet-offences" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" +source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" dependencies = [ "frame-support", "frame-system", @@ -3638,7 +3653,7 @@ dependencies = [ [[package]] name = "pallet-offences-benchmarking" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" +source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" dependencies = [ "frame-benchmarking", "frame-support", @@ -3659,7 +3674,7 @@ dependencies = [ [[package]] name = "pallet-proxy" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" +source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" dependencies = [ "frame-support", "frame-system", @@ -3674,7 +3689,7 @@ dependencies = [ [[package]] name = "pallet-randomness-collective-flip" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" +source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" dependencies = [ "frame-support", "frame-system", @@ -3687,7 +3702,7 @@ dependencies = [ [[package]] name = "pallet-recovery" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" +source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" dependencies = [ "enumflags2", "frame-support", @@ -3702,7 +3717,7 @@ dependencies = [ [[package]] name = "pallet-scheduler" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" +source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" dependencies = [ "frame-benchmarking", "frame-support", @@ -3717,7 +3732,7 @@ dependencies = [ [[package]] name = "pallet-session" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" +source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" dependencies = [ "frame-support", "frame-system", @@ -3737,7 +3752,7 @@ dependencies = [ [[package]] name = "pallet-session-benchmarking" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" +source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" dependencies = [ "frame-benchmarking", "frame-support", @@ -3753,7 +3768,7 @@ dependencies = [ [[package]] name = "pallet-society" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" +source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" dependencies = [ "frame-support", "frame-system", @@ -3767,7 +3782,7 @@ dependencies = [ [[package]] name = "pallet-staking" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" +source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" dependencies = [ "frame-benchmarking", "frame-support", @@ -3789,7 +3804,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-curve" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" +source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -3800,7 +3815,7 @@ dependencies = [ [[package]] name = "pallet-sudo" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" +source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" dependencies = [ "frame-support", "frame-system", @@ -3814,7 +3829,7 @@ dependencies = [ [[package]] name = "pallet-timestamp" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" +source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" dependencies = [ "frame-benchmarking", "frame-support", @@ -3832,7 +3847,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" +source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" dependencies = [ "frame-support", "frame-system", @@ -3847,7 +3862,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" +source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" dependencies = [ "jsonrpc-core", "jsonrpc-core-client", @@ -3865,7 +3880,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc-runtime-api" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" +source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" dependencies = [ "frame-support", "parity-scale-codec", @@ -3878,7 +3893,7 @@ dependencies = [ [[package]] name = "pallet-treasury" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" +source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" dependencies = [ "frame-benchmarking", "frame-support", @@ -3893,7 +3908,7 @@ dependencies = [ [[package]] name = "pallet-utility" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" +source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" dependencies = [ "frame-benchmarking", "frame-support", @@ -3909,7 +3924,7 @@ dependencies = [ [[package]] name = "pallet-vesting" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" +source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" dependencies = [ "enumflags2", "frame-benchmarking", @@ -4038,11 +4053,12 @@ dependencies = [ [[package]] name = "parity-util-mem" -version = "0.6.1" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c6e2583649a3ca84894d1d71da249abcfda54d5aca24733d72ca10d0f02361c" +checksum = "297ff91fa36aec49ce183484b102f6b75b46776822bd81525bfc4cc9b0dd0f5c" dependencies = [ "cfg-if", + "hashbrown 0.8.0", "impl-trait-for-tuples", "jemallocator", "parity-util-mem-derive", @@ -4620,7 +4636,7 @@ dependencies = [ "static_assertions", "substrate-wasm-builder-runner 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "tiny-keccak 1.5.0", - "trie-db 0.20.1", + "trie-db", ] [[package]] @@ -4664,7 +4680,7 @@ dependencies = [ "sp-std", "sp-trie", "static_assertions", - "trie-db 0.21.0", + "trie-db", ] [[package]] @@ -5761,7 +5777,7 @@ dependencies = [ [[package]] name = "sc-authority-discovery" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" +source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" dependencies = [ "bytes 0.5.4", "derive_more 0.99.8", @@ -5788,7 +5804,7 @@ dependencies = [ [[package]] name = "sc-basic-authorship" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" +source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -5812,7 +5828,7 @@ dependencies = [ [[package]] name = "sc-block-builder" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" +source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" dependencies = [ "parity-scale-codec", "sc-client-api", @@ -5829,7 +5845,7 @@ dependencies = [ [[package]] name = "sc-chain-spec" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" +source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" dependencies = [ "impl-trait-for-tuples", "sc-chain-spec-derive", @@ -5845,7 +5861,7 @@ dependencies = [ [[package]] name = "sc-chain-spec-derive" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" +source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -5856,7 +5872,7 @@ dependencies = [ [[package]] name = "sc-cli" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" +source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" dependencies = [ "ansi_term 0.12.1", "atty", @@ -5897,7 +5913,7 @@ dependencies = [ [[package]] name = "sc-client-api" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" +source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" dependencies = [ "derive_more 0.99.8", "fnv", @@ -5933,7 +5949,7 @@ dependencies = [ [[package]] name = "sc-client-db" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" +source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" dependencies = [ "blake2-rfc", "hash-db", @@ -5962,7 +5978,7 @@ dependencies = [ [[package]] name = "sc-consensus" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" +source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" dependencies = [ "sc-client-api", "sp-blockchain", @@ -5973,7 +5989,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" +source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" dependencies = [ "derive_more 0.99.8", "fork-tree", @@ -6015,7 +6031,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe-rpc" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" +source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" dependencies = [ "derive_more 0.99.8", "futures 0.3.5", @@ -6039,7 +6055,7 @@ dependencies = [ [[package]] name = "sc-consensus-epochs" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" +source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" dependencies = [ "fork-tree", "parity-scale-codec", @@ -6052,7 +6068,7 @@ dependencies = [ [[package]] name = "sc-consensus-slots" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" +source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6075,7 +6091,7 @@ dependencies = [ [[package]] name = "sc-consensus-uncles" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" +source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" dependencies = [ "log 0.4.8", "sc-client-api", @@ -6089,7 +6105,7 @@ dependencies = [ [[package]] name = "sc-executor" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" +source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" dependencies = [ "derive_more 0.99.8", "lazy_static", @@ -6117,7 +6133,7 @@ dependencies = [ [[package]] name = "sc-executor-common" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" +source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" dependencies = [ "derive_more 0.99.8", "log 0.4.8", @@ -6134,7 +6150,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmi" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" +source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" dependencies = [ "log 0.4.8", "parity-scale-codec", @@ -6149,7 +6165,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmtime" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" +source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" dependencies = [ "cranelift-codegen", "cranelift-wasm", @@ -6170,7 +6186,7 @@ dependencies = [ [[package]] name = "sc-finality-grandpa" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" +source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" dependencies = [ "assert_matches", "derive_more 0.99.8", @@ -6208,7 +6224,7 @@ dependencies = [ [[package]] name = "sc-finality-grandpa-rpc" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" +source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" dependencies = [ "derive_more 0.99.8", "finality-grandpa", @@ -6225,7 +6241,7 @@ dependencies = [ [[package]] name = "sc-informant" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" +source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" dependencies = [ "ansi_term 0.12.1", "futures 0.3.5", @@ -6243,7 +6259,7 @@ dependencies = [ [[package]] name = "sc-keystore" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" +source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" dependencies = [ "derive_more 0.99.8", "hex", @@ -6259,7 +6275,7 @@ dependencies = [ [[package]] name = "sc-light" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" +source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" dependencies = [ "hash-db", "lazy_static", @@ -6278,7 +6294,7 @@ dependencies = [ [[package]] name = "sc-network" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" +source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" dependencies = [ "bitflags", "bs58", @@ -6330,7 +6346,7 @@ dependencies = [ [[package]] name = "sc-network-gossip" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" +source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6345,7 +6361,7 @@ dependencies = [ [[package]] name = "sc-network-test" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" +source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" dependencies = [ "env_logger", "futures 0.3.5", @@ -6372,7 +6388,7 @@ dependencies = [ [[package]] name = "sc-offchain" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" +source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" dependencies = [ "bytes 0.5.4", "fnv", @@ -6399,7 +6415,7 @@ dependencies = [ [[package]] name = "sc-peerset" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" +source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" dependencies = [ "futures 0.3.5", "libp2p", @@ -6412,7 +6428,7 @@ dependencies = [ [[package]] name = "sc-proposer-metrics" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" +source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" dependencies = [ "log 0.4.8", "substrate-prometheus-endpoint", @@ -6421,7 +6437,7 @@ dependencies = [ [[package]] name = "sc-rpc" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" +source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" dependencies = [ "futures 0.3.5", "hash-db", @@ -6453,7 +6469,7 @@ dependencies = [ [[package]] name = "sc-rpc-api" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" +source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" dependencies = [ "derive_more 0.99.8", "futures 0.3.5", @@ -6477,7 +6493,7 @@ dependencies = [ [[package]] name = "sc-rpc-server" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" +source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" dependencies = [ "jsonrpc-core", "jsonrpc-http-server", @@ -6493,7 +6509,7 @@ dependencies = [ [[package]] name = "sc-service" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" +source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" dependencies = [ "derive_more 0.99.8", "directories", @@ -6556,7 +6572,7 @@ dependencies = [ [[package]] name = "sc-state-db" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" +source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" dependencies = [ "log 0.4.8", "parity-scale-codec", @@ -6570,7 +6586,7 @@ dependencies = [ [[package]] name = "sc-telemetry" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" +source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6591,7 +6607,7 @@ dependencies = [ [[package]] name = "sc-tracing" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" +source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" dependencies = [ "erased-serde", "log 0.4.8", @@ -6608,7 +6624,7 @@ dependencies = [ [[package]] name = "sc-transaction-graph" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" +source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" dependencies = [ "derive_more 0.99.8", "futures 0.3.5", @@ -6628,7 +6644,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" +source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" dependencies = [ "derive_more 0.99.8", "futures 0.3.5", @@ -7014,7 +7030,7 @@ dependencies = [ [[package]] name = "sp-allocator" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" +source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" dependencies = [ "derive_more 0.99.8", "log 0.4.8", @@ -7026,7 +7042,7 @@ dependencies = [ [[package]] name = "sp-api" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" +source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" dependencies = [ "hash-db", "parity-scale-codec", @@ -7041,7 +7057,7 @@ dependencies = [ [[package]] name = "sp-api-proc-macro" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" +source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" dependencies = [ "blake2-rfc", "proc-macro-crate", @@ -7053,7 +7069,7 @@ dependencies = [ [[package]] name = "sp-application-crypto" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" +source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" dependencies = [ "parity-scale-codec", "serde", @@ -7065,7 +7081,7 @@ dependencies = [ [[package]] name = "sp-arithmetic" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" +source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" dependencies = [ "integer-sqrt", "num-traits 0.2.12", @@ -7078,7 +7094,7 @@ dependencies = [ [[package]] name = "sp-authority-discovery" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" +source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" dependencies = [ "parity-scale-codec", "sp-api", @@ -7090,7 +7106,7 @@ dependencies = [ [[package]] name = "sp-authorship" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" +source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" dependencies = [ "parity-scale-codec", "sp-inherents", @@ -7101,7 +7117,7 @@ dependencies = [ [[package]] name = "sp-block-builder" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" +source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" dependencies = [ "parity-scale-codec", "sp-api", @@ -7113,7 +7129,7 @@ dependencies = [ [[package]] name = "sp-blockchain" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" +source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" dependencies = [ "derive_more 0.99.8", "log 0.4.8", @@ -7129,7 +7145,7 @@ dependencies = [ [[package]] name = "sp-chain-spec" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" +source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" dependencies = [ "serde", "serde_json", @@ -7138,7 +7154,7 @@ dependencies = [ [[package]] name = "sp-consensus" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" +source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" dependencies = [ "derive_more 0.99.8", "futures 0.3.5", @@ -7162,7 +7178,7 @@ dependencies = [ [[package]] name = "sp-consensus-aura" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" +source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" dependencies = [ "parity-scale-codec", "sp-api", @@ -7176,7 +7192,7 @@ dependencies = [ [[package]] name = "sp-consensus-babe" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" +source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" dependencies = [ "merlin", "parity-scale-codec", @@ -7195,7 +7211,7 @@ dependencies = [ [[package]] name = "sp-consensus-slots" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" +source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" dependencies = [ "parity-scale-codec", "sp-runtime", @@ -7204,7 +7220,7 @@ dependencies = [ [[package]] name = "sp-consensus-vrf" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" +source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" dependencies = [ "parity-scale-codec", "schnorrkel", @@ -7216,7 +7232,7 @@ dependencies = [ [[package]] name = "sp-core" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" +source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" dependencies = [ "base58", "blake2-rfc", @@ -7259,7 +7275,7 @@ dependencies = [ [[package]] name = "sp-database" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" +source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" dependencies = [ "kvdb", "parking_lot 0.10.2", @@ -7268,7 +7284,7 @@ dependencies = [ [[package]] name = "sp-debug-derive" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" +source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" dependencies = [ "proc-macro2 1.0.18", "quote 1.0.7", @@ -7278,7 +7294,7 @@ dependencies = [ [[package]] name = "sp-externalities" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" +source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" dependencies = [ "environmental", "parity-scale-codec", @@ -7289,7 +7305,7 @@ dependencies = [ [[package]] name = "sp-finality-grandpa" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" +source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" dependencies = [ "finality-grandpa", "log 0.4.8", @@ -7305,7 +7321,7 @@ dependencies = [ [[package]] name = "sp-finality-tracker" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" +source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" dependencies = [ "parity-scale-codec", "sp-inherents", @@ -7315,7 +7331,7 @@ dependencies = [ [[package]] name = "sp-inherents" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" +source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" dependencies = [ "derive_more 0.99.8", "parity-scale-codec", @@ -7327,7 +7343,7 @@ dependencies = [ [[package]] name = "sp-io" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" +source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" dependencies = [ "futures 0.3.5", "hash-db", @@ -7348,7 +7364,7 @@ dependencies = [ [[package]] name = "sp-keyring" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" +source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" dependencies = [ "lazy_static", "sp-core", @@ -7359,7 +7375,7 @@ dependencies = [ [[package]] name = "sp-npos-elections" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" +source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" dependencies = [ "parity-scale-codec", "serde", @@ -7371,7 +7387,7 @@ dependencies = [ [[package]] name = "sp-npos-elections-compact" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" +source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -7382,7 +7398,7 @@ dependencies = [ [[package]] name = "sp-offchain" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" +source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" dependencies = [ "sp-api", "sp-core", @@ -7392,7 +7408,7 @@ dependencies = [ [[package]] name = "sp-panic-handler" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" +source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" dependencies = [ "backtrace", "log 0.4.8", @@ -7401,7 +7417,7 @@ dependencies = [ [[package]] name = "sp-rpc" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" +source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" dependencies = [ "serde", "sp-core", @@ -7410,7 +7426,7 @@ dependencies = [ [[package]] name = "sp-runtime" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" +source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" dependencies = [ "either", "hash256-std-hasher", @@ -7432,7 +7448,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" +source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" dependencies = [ "parity-scale-codec", "primitive-types", @@ -7447,7 +7463,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" +source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" dependencies = [ "Inflector", "proc-macro-crate", @@ -7459,7 +7475,7 @@ dependencies = [ [[package]] name = "sp-serializer" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" +source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" dependencies = [ "serde", "serde_json", @@ -7468,7 +7484,7 @@ dependencies = [ [[package]] name = "sp-session" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" +source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" dependencies = [ "parity-scale-codec", "sp-api", @@ -7481,7 +7497,7 @@ dependencies = [ [[package]] name = "sp-staking" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" +source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" dependencies = [ "parity-scale-codec", "sp-runtime", @@ -7491,7 +7507,7 @@ dependencies = [ [[package]] name = "sp-state-machine" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" +source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" dependencies = [ "hash-db", "itertools 0.9.0", @@ -7505,19 +7521,19 @@ dependencies = [ "sp-externalities", "sp-panic-handler", "sp-trie", - "trie-db 0.21.0", + "trie-db", "trie-root", ] [[package]] name = "sp-std" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" +source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" [[package]] name = "sp-storage" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" +source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" dependencies = [ "impl-serde 0.2.3", "ref-cast", @@ -7529,7 +7545,7 @@ dependencies = [ [[package]] name = "sp-timestamp" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" +source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -7543,7 +7559,7 @@ dependencies = [ [[package]] name = "sp-tracing" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" +source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" dependencies = [ "log 0.4.8", "rental", @@ -7553,7 +7569,7 @@ dependencies = [ [[package]] name = "sp-transaction-pool" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" +source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" dependencies = [ "derive_more 0.99.8", "futures 0.3.5", @@ -7569,21 +7585,21 @@ dependencies = [ [[package]] name = "sp-trie" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" +source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" dependencies = [ "hash-db", "memory-db", "parity-scale-codec", "sp-core", "sp-std", - "trie-db 0.21.0", + "trie-db", "trie-root", ] [[package]] name = "sp-utils" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" +source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" dependencies = [ "futures 0.3.5", "futures-core", @@ -7595,7 +7611,7 @@ dependencies = [ [[package]] name = "sp-version" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" +source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" dependencies = [ "impl-serde 0.2.3", "parity-scale-codec", @@ -7607,7 +7623,7 @@ dependencies = [ [[package]] name = "sp-wasm-interface" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" +source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -7747,7 +7763,7 @@ dependencies = [ [[package]] name = "substrate-browser-utils" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" +source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" dependencies = [ "chrono", "clear_on_drop", @@ -7774,7 +7790,7 @@ dependencies = [ [[package]] name = "substrate-build-script-utils" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" +source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" dependencies = [ "platforms", ] @@ -7782,7 +7798,7 @@ dependencies = [ [[package]] name = "substrate-frame-rpc-system" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" +source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" dependencies = [ "frame-system-rpc-runtime-api", "futures 0.3.5", @@ -7805,7 +7821,7 @@ dependencies = [ [[package]] name = "substrate-prometheus-endpoint" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" +source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" dependencies = [ "async-std", "derive_more 0.99.8", @@ -7819,7 +7835,7 @@ dependencies = [ [[package]] name = "substrate-test-client" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" +source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" dependencies = [ "futures 0.1.29", "futures 0.3.5", @@ -7843,7 +7859,7 @@ dependencies = [ [[package]] name = "substrate-test-runtime" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" +source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" dependencies = [ "cfg-if", "frame-executive", @@ -7877,13 +7893,13 @@ dependencies = [ "sp-trie", "sp-version", "substrate-wasm-builder-runner 1.0.6 (git+https://github.com/paritytech/substrate)", - "trie-db 0.21.0", + "trie-db", ] [[package]] name = "substrate-test-runtime-client" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" +source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" dependencies = [ "futures 0.3.5", "parity-scale-codec", @@ -7904,7 +7920,7 @@ dependencies = [ [[package]] name = "substrate-wasm-builder-runner" version = "1.0.6" -source = "git+https://github.com/paritytech/substrate#4e0a1b1a2a9922e1356d5c9bd8e35fb24a823fc1" +source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" [[package]] name = "substrate-wasm-builder-runner" @@ -8635,25 +8651,12 @@ checksum = "a7f741b240f1a48843f9b8e0444fb55fb2a4ff67293b50a9179dfd5ea67f8d41" [[package]] name = "trie-db" -version = "0.20.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bcc309f34008563989045a4c4dbcc5770467f3a3785ee80a9b5cc0d83362475f" -dependencies = [ - "hash-db", - "hashbrown", - "log 0.4.8", - "rustc-hex", - "smallvec 1.4.1", -] - -[[package]] -name = "trie-db" -version = "0.21.0" +version = "0.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb230c24c741993b04cfccbabb45acff6f6480c5f00d3ed8794ea43db3a9d727" +checksum = "39f1a9a9252d38c5337cf0c5392988821a5cf1b2103245016968f2ab41de9e38" dependencies = [ "hash-db", - "hashbrown", + "hashbrown 0.8.0", "log 0.4.8", "rustc-hex", "smallvec 1.4.1", diff --git a/availability-store/Cargo.toml b/availability-store/Cargo.toml index 369e184b3b..6cc380b235 100644 --- a/availability-store/Cargo.toml +++ b/availability-store/Cargo.toml @@ -23,8 +23,8 @@ sp-blockchain = { git = "https://github.com/paritytech/substrate", branch = "mas sp-api = { git = "https://github.com/paritytech/substrate", branch = "master" } keystore = { package = "sc-keystore", git = "https://github.com/paritytech/substrate", branch = "master" } sp-core = { git = "https://github.com/paritytech/substrate", branch = "master" } -kvdb = "0.6.0" -kvdb-memorydb = "0.6.0" +kvdb = "0.7.0" +kvdb-memorydb = "0.7.0" [target.'cfg(not(target_os = "unknown"))'.dependencies] -kvdb-rocksdb = "0.8.0" +kvdb-rocksdb = "0.9.0" diff --git a/runtime/common/Cargo.toml b/runtime/common/Cargo.toml index 58e20ce9c7..f0f0041d0c 100644 --- a/runtime/common/Cargo.toml +++ b/runtime/common/Cargo.toml @@ -46,7 +46,7 @@ sp-application-crypto = { git = "https://github.com/paritytech/substrate", branc randomness-collective-flip = { package = "pallet-randomness-collective-flip", git = "https://github.com/paritytech/substrate", branch = "master" } pallet-staking-reward-curve = { git = "https://github.com/paritytech/substrate", branch = "master" } treasury = { package = "pallet-treasury", git = "https://github.com/paritytech/substrate", branch = "master" } -trie-db = "0.21.0" +trie-db = "0.22.0" serde_json = "1.0.41" libsecp256k1 = "0.3.2" diff --git a/runtime/polkadot/Cargo.toml b/runtime/polkadot/Cargo.toml index 50081c6811..bad45c6aa1 100644 --- a/runtime/polkadot/Cargo.toml +++ b/runtime/polkadot/Cargo.toml @@ -78,7 +78,7 @@ libsecp256k1 = "0.3.2" tiny-keccak = "1.5.0" keyring = { package = "sp-keyring", git = "https://github.com/paritytech/substrate", branch = "master" } sp-trie = { git = "https://github.com/paritytech/substrate", branch = "master" } -trie-db = "0.20.0" +trie-db = "0.22.0" serde_json = "1.0.41" [build-dependencies] -- GitLab From 8d9bc1161eada40e32c3966f69658251eec2cee3 Mon Sep 17 00:00:00 2001 From: pscott <30843220+pscott@users.noreply.github.com> Date: Wed, 8 Jul 2020 14:05:41 +0200 Subject: [PATCH 042/192] Companion PR for #6564 (#1350) * Add log_rotation_opt * Update Cargo lock * Use SubstrateCli's log-directory instead of re-defining it --- Cargo.lock | 296 ++++++++++++++++++++++++--------------------- cli/src/cli.rs | 2 - cli/src/command.rs | 4 +- 3 files changed, 160 insertions(+), 142 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 2fb1cab8fc..c97a1bad55 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1258,6 +1258,20 @@ dependencies = [ "miniz_oxide", ] +[[package]] +name = "flexi_logger" +version = "0.15.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33897654c23a50cebab45e18356f69fb771c9949a6928344fb1f01ffccc7c5f3" +dependencies = [ + "chrono", + "glob", + "log 0.4.8", + "regex", + "thiserror", + "yansi", +] + [[package]] name = "fnv" version = "1.0.7" @@ -1267,7 +1281,7 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "fork-tree" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" +source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" dependencies = [ "parity-scale-codec", ] @@ -1275,7 +1289,7 @@ dependencies = [ [[package]] name = "frame-benchmarking" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" +source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" dependencies = [ "frame-support", "frame-system", @@ -1292,7 +1306,7 @@ dependencies = [ [[package]] name = "frame-benchmarking-cli" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" +source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" dependencies = [ "Inflector", "frame-benchmarking", @@ -1311,7 +1325,7 @@ dependencies = [ [[package]] name = "frame-executive" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" +source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" dependencies = [ "frame-support", "frame-system", @@ -1326,7 +1340,7 @@ dependencies = [ [[package]] name = "frame-metadata" version = "11.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" +source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" dependencies = [ "parity-scale-codec", "serde", @@ -1337,7 +1351,7 @@ dependencies = [ [[package]] name = "frame-support" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" +source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" dependencies = [ "bitmask", "frame-metadata", @@ -1362,7 +1376,7 @@ dependencies = [ [[package]] name = "frame-support-procedural" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" +source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" dependencies = [ "frame-support-procedural-tools", "proc-macro2 1.0.18", @@ -1373,7 +1387,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" +source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" dependencies = [ "frame-support-procedural-tools-derive", "proc-macro-crate", @@ -1385,7 +1399,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools-derive" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" +source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" dependencies = [ "proc-macro2 1.0.18", "quote 1.0.7", @@ -1395,7 +1409,7 @@ dependencies = [ [[package]] name = "frame-system" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" +source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" dependencies = [ "frame-support", "impl-trait-for-tuples", @@ -1411,7 +1425,7 @@ dependencies = [ [[package]] name = "frame-system-benchmarking" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" +source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" dependencies = [ "frame-benchmarking", "frame-support", @@ -1425,7 +1439,7 @@ dependencies = [ [[package]] name = "frame-system-rpc-runtime-api" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" +source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" dependencies = [ "parity-scale-codec", "sp-api", @@ -3391,7 +3405,7 @@ dependencies = [ [[package]] name = "pallet-authority-discovery" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" +source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" dependencies = [ "frame-support", "frame-system", @@ -3407,7 +3421,7 @@ dependencies = [ [[package]] name = "pallet-authorship" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" +source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" dependencies = [ "frame-support", "frame-system", @@ -3422,7 +3436,7 @@ dependencies = [ [[package]] name = "pallet-babe" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" +source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" dependencies = [ "frame-benchmarking", "frame-support", @@ -3447,7 +3461,7 @@ dependencies = [ [[package]] name = "pallet-balances" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" +source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" dependencies = [ "frame-benchmarking", "frame-support", @@ -3461,7 +3475,7 @@ dependencies = [ [[package]] name = "pallet-collective" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" +source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" dependencies = [ "frame-benchmarking", "frame-support", @@ -3477,7 +3491,7 @@ dependencies = [ [[package]] name = "pallet-democracy" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" +source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" dependencies = [ "frame-benchmarking", "frame-support", @@ -3492,7 +3506,7 @@ dependencies = [ [[package]] name = "pallet-elections-phragmen" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" +source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" dependencies = [ "frame-benchmarking", "frame-support", @@ -3507,7 +3521,7 @@ dependencies = [ [[package]] name = "pallet-finality-tracker" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" +source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" dependencies = [ "frame-support", "frame-system", @@ -3523,7 +3537,7 @@ dependencies = [ [[package]] name = "pallet-grandpa" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" +source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" dependencies = [ "frame-support", "frame-system", @@ -3543,7 +3557,7 @@ dependencies = [ [[package]] name = "pallet-identity" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" +source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" dependencies = [ "enumflags2", "frame-benchmarking", @@ -3559,7 +3573,7 @@ dependencies = [ [[package]] name = "pallet-im-online" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" +source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" dependencies = [ "frame-benchmarking", "frame-support", @@ -3579,7 +3593,7 @@ dependencies = [ [[package]] name = "pallet-indices" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" +source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" dependencies = [ "frame-support", "frame-system", @@ -3595,7 +3609,7 @@ dependencies = [ [[package]] name = "pallet-membership" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" +source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" dependencies = [ "frame-support", "frame-system", @@ -3609,7 +3623,7 @@ dependencies = [ [[package]] name = "pallet-multisig" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" +source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" dependencies = [ "frame-support", "frame-system", @@ -3624,7 +3638,7 @@ dependencies = [ [[package]] name = "pallet-nicks" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" +source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" dependencies = [ "frame-support", "frame-system", @@ -3638,7 +3652,7 @@ dependencies = [ [[package]] name = "pallet-offences" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" +source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" dependencies = [ "frame-support", "frame-system", @@ -3653,7 +3667,7 @@ dependencies = [ [[package]] name = "pallet-offences-benchmarking" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" +source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" dependencies = [ "frame-benchmarking", "frame-support", @@ -3674,7 +3688,7 @@ dependencies = [ [[package]] name = "pallet-proxy" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" +source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" dependencies = [ "frame-support", "frame-system", @@ -3689,7 +3703,7 @@ dependencies = [ [[package]] name = "pallet-randomness-collective-flip" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" +source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" dependencies = [ "frame-support", "frame-system", @@ -3702,7 +3716,7 @@ dependencies = [ [[package]] name = "pallet-recovery" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" +source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" dependencies = [ "enumflags2", "frame-support", @@ -3717,7 +3731,7 @@ dependencies = [ [[package]] name = "pallet-scheduler" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" +source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" dependencies = [ "frame-benchmarking", "frame-support", @@ -3732,7 +3746,7 @@ dependencies = [ [[package]] name = "pallet-session" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" +source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" dependencies = [ "frame-support", "frame-system", @@ -3752,7 +3766,7 @@ dependencies = [ [[package]] name = "pallet-session-benchmarking" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" +source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" dependencies = [ "frame-benchmarking", "frame-support", @@ -3768,7 +3782,7 @@ dependencies = [ [[package]] name = "pallet-society" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" +source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" dependencies = [ "frame-support", "frame-system", @@ -3782,7 +3796,7 @@ dependencies = [ [[package]] name = "pallet-staking" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" +source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" dependencies = [ "frame-benchmarking", "frame-support", @@ -3804,7 +3818,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-curve" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" +source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -3815,7 +3829,7 @@ dependencies = [ [[package]] name = "pallet-sudo" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" +source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" dependencies = [ "frame-support", "frame-system", @@ -3829,7 +3843,7 @@ dependencies = [ [[package]] name = "pallet-timestamp" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" +source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" dependencies = [ "frame-benchmarking", "frame-support", @@ -3847,7 +3861,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" +source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" dependencies = [ "frame-support", "frame-system", @@ -3862,7 +3876,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" +source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" dependencies = [ "jsonrpc-core", "jsonrpc-core-client", @@ -3880,7 +3894,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc-runtime-api" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" +source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" dependencies = [ "frame-support", "parity-scale-codec", @@ -3893,7 +3907,7 @@ dependencies = [ [[package]] name = "pallet-treasury" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" +source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" dependencies = [ "frame-benchmarking", "frame-support", @@ -3908,7 +3922,7 @@ dependencies = [ [[package]] name = "pallet-utility" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" +source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" dependencies = [ "frame-benchmarking", "frame-support", @@ -3924,7 +3938,7 @@ dependencies = [ [[package]] name = "pallet-vesting" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" +source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" dependencies = [ "enumflags2", "frame-benchmarking", @@ -5777,7 +5791,7 @@ dependencies = [ [[package]] name = "sc-authority-discovery" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" +source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" dependencies = [ "bytes 0.5.4", "derive_more 0.99.8", @@ -5804,7 +5818,7 @@ dependencies = [ [[package]] name = "sc-basic-authorship" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" +source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -5828,7 +5842,7 @@ dependencies = [ [[package]] name = "sc-block-builder" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" +source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" dependencies = [ "parity-scale-codec", "sc-client-api", @@ -5845,7 +5859,7 @@ dependencies = [ [[package]] name = "sc-chain-spec" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" +source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" dependencies = [ "impl-trait-for-tuples", "sc-chain-spec-derive", @@ -5861,7 +5875,7 @@ dependencies = [ [[package]] name = "sc-chain-spec-derive" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" +source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -5872,14 +5886,14 @@ dependencies = [ [[package]] name = "sc-cli" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" +source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" dependencies = [ "ansi_term 0.12.1", "atty", "chrono", "derive_more 0.99.8", - "env_logger", "fdlimit", + "flexi_logger", "futures 0.3.5", "lazy_static", "log 0.4.8", @@ -5913,7 +5927,7 @@ dependencies = [ [[package]] name = "sc-client-api" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" +source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" dependencies = [ "derive_more 0.99.8", "fnv", @@ -5949,7 +5963,7 @@ dependencies = [ [[package]] name = "sc-client-db" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" +source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" dependencies = [ "blake2-rfc", "hash-db", @@ -5978,7 +5992,7 @@ dependencies = [ [[package]] name = "sc-consensus" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" +source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" dependencies = [ "sc-client-api", "sp-blockchain", @@ -5989,7 +6003,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" +source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" dependencies = [ "derive_more 0.99.8", "fork-tree", @@ -6031,7 +6045,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe-rpc" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" +source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" dependencies = [ "derive_more 0.99.8", "futures 0.3.5", @@ -6055,7 +6069,7 @@ dependencies = [ [[package]] name = "sc-consensus-epochs" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" +source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" dependencies = [ "fork-tree", "parity-scale-codec", @@ -6068,7 +6082,7 @@ dependencies = [ [[package]] name = "sc-consensus-slots" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" +source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6091,7 +6105,7 @@ dependencies = [ [[package]] name = "sc-consensus-uncles" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" +source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" dependencies = [ "log 0.4.8", "sc-client-api", @@ -6105,7 +6119,7 @@ dependencies = [ [[package]] name = "sc-executor" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" +source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" dependencies = [ "derive_more 0.99.8", "lazy_static", @@ -6133,7 +6147,7 @@ dependencies = [ [[package]] name = "sc-executor-common" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" +source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" dependencies = [ "derive_more 0.99.8", "log 0.4.8", @@ -6150,7 +6164,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmi" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" +source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" dependencies = [ "log 0.4.8", "parity-scale-codec", @@ -6165,7 +6179,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmtime" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" +source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" dependencies = [ "cranelift-codegen", "cranelift-wasm", @@ -6186,7 +6200,7 @@ dependencies = [ [[package]] name = "sc-finality-grandpa" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" +source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" dependencies = [ "assert_matches", "derive_more 0.99.8", @@ -6224,7 +6238,7 @@ dependencies = [ [[package]] name = "sc-finality-grandpa-rpc" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" +source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" dependencies = [ "derive_more 0.99.8", "finality-grandpa", @@ -6241,7 +6255,7 @@ dependencies = [ [[package]] name = "sc-informant" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" +source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" dependencies = [ "ansi_term 0.12.1", "futures 0.3.5", @@ -6259,7 +6273,7 @@ dependencies = [ [[package]] name = "sc-keystore" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" +source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" dependencies = [ "derive_more 0.99.8", "hex", @@ -6275,7 +6289,7 @@ dependencies = [ [[package]] name = "sc-light" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" +source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" dependencies = [ "hash-db", "lazy_static", @@ -6294,7 +6308,7 @@ dependencies = [ [[package]] name = "sc-network" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" +source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" dependencies = [ "bitflags", "bs58", @@ -6346,7 +6360,7 @@ dependencies = [ [[package]] name = "sc-network-gossip" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" +source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6361,7 +6375,7 @@ dependencies = [ [[package]] name = "sc-network-test" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" +source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" dependencies = [ "env_logger", "futures 0.3.5", @@ -6388,7 +6402,7 @@ dependencies = [ [[package]] name = "sc-offchain" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" +source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" dependencies = [ "bytes 0.5.4", "fnv", @@ -6415,7 +6429,7 @@ dependencies = [ [[package]] name = "sc-peerset" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" +source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" dependencies = [ "futures 0.3.5", "libp2p", @@ -6428,7 +6442,7 @@ dependencies = [ [[package]] name = "sc-proposer-metrics" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" +source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" dependencies = [ "log 0.4.8", "substrate-prometheus-endpoint", @@ -6437,7 +6451,7 @@ dependencies = [ [[package]] name = "sc-rpc" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" +source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" dependencies = [ "futures 0.3.5", "hash-db", @@ -6469,7 +6483,7 @@ dependencies = [ [[package]] name = "sc-rpc-api" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" +source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" dependencies = [ "derive_more 0.99.8", "futures 0.3.5", @@ -6493,7 +6507,7 @@ dependencies = [ [[package]] name = "sc-rpc-server" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" +source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" dependencies = [ "jsonrpc-core", "jsonrpc-http-server", @@ -6509,7 +6523,7 @@ dependencies = [ [[package]] name = "sc-service" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" +source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" dependencies = [ "derive_more 0.99.8", "directories", @@ -6572,7 +6586,7 @@ dependencies = [ [[package]] name = "sc-state-db" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" +source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" dependencies = [ "log 0.4.8", "parity-scale-codec", @@ -6586,7 +6600,7 @@ dependencies = [ [[package]] name = "sc-telemetry" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" +source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6607,7 +6621,7 @@ dependencies = [ [[package]] name = "sc-tracing" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" +source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" dependencies = [ "erased-serde", "log 0.4.8", @@ -6624,7 +6638,7 @@ dependencies = [ [[package]] name = "sc-transaction-graph" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" +source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" dependencies = [ "derive_more 0.99.8", "futures 0.3.5", @@ -6644,7 +6658,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" +source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" dependencies = [ "derive_more 0.99.8", "futures 0.3.5", @@ -7030,7 +7044,7 @@ dependencies = [ [[package]] name = "sp-allocator" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" +source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" dependencies = [ "derive_more 0.99.8", "log 0.4.8", @@ -7042,7 +7056,7 @@ dependencies = [ [[package]] name = "sp-api" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" +source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" dependencies = [ "hash-db", "parity-scale-codec", @@ -7057,7 +7071,7 @@ dependencies = [ [[package]] name = "sp-api-proc-macro" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" +source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" dependencies = [ "blake2-rfc", "proc-macro-crate", @@ -7069,7 +7083,7 @@ dependencies = [ [[package]] name = "sp-application-crypto" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" +source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" dependencies = [ "parity-scale-codec", "serde", @@ -7081,7 +7095,7 @@ dependencies = [ [[package]] name = "sp-arithmetic" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" +source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" dependencies = [ "integer-sqrt", "num-traits 0.2.12", @@ -7094,7 +7108,7 @@ dependencies = [ [[package]] name = "sp-authority-discovery" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" +source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" dependencies = [ "parity-scale-codec", "sp-api", @@ -7106,7 +7120,7 @@ dependencies = [ [[package]] name = "sp-authorship" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" +source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" dependencies = [ "parity-scale-codec", "sp-inherents", @@ -7117,7 +7131,7 @@ dependencies = [ [[package]] name = "sp-block-builder" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" +source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" dependencies = [ "parity-scale-codec", "sp-api", @@ -7129,7 +7143,7 @@ dependencies = [ [[package]] name = "sp-blockchain" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" +source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" dependencies = [ "derive_more 0.99.8", "log 0.4.8", @@ -7145,7 +7159,7 @@ dependencies = [ [[package]] name = "sp-chain-spec" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" +source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" dependencies = [ "serde", "serde_json", @@ -7154,7 +7168,7 @@ dependencies = [ [[package]] name = "sp-consensus" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" +source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" dependencies = [ "derive_more 0.99.8", "futures 0.3.5", @@ -7178,7 +7192,7 @@ dependencies = [ [[package]] name = "sp-consensus-aura" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" +source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" dependencies = [ "parity-scale-codec", "sp-api", @@ -7192,7 +7206,7 @@ dependencies = [ [[package]] name = "sp-consensus-babe" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" +source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" dependencies = [ "merlin", "parity-scale-codec", @@ -7211,7 +7225,7 @@ dependencies = [ [[package]] name = "sp-consensus-slots" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" +source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" dependencies = [ "parity-scale-codec", "sp-runtime", @@ -7220,7 +7234,7 @@ dependencies = [ [[package]] name = "sp-consensus-vrf" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" +source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" dependencies = [ "parity-scale-codec", "schnorrkel", @@ -7232,7 +7246,7 @@ dependencies = [ [[package]] name = "sp-core" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" +source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" dependencies = [ "base58", "blake2-rfc", @@ -7275,7 +7289,7 @@ dependencies = [ [[package]] name = "sp-database" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" +source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" dependencies = [ "kvdb", "parking_lot 0.10.2", @@ -7284,7 +7298,7 @@ dependencies = [ [[package]] name = "sp-debug-derive" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" +source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" dependencies = [ "proc-macro2 1.0.18", "quote 1.0.7", @@ -7294,7 +7308,7 @@ dependencies = [ [[package]] name = "sp-externalities" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" +source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" dependencies = [ "environmental", "parity-scale-codec", @@ -7305,7 +7319,7 @@ dependencies = [ [[package]] name = "sp-finality-grandpa" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" +source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" dependencies = [ "finality-grandpa", "log 0.4.8", @@ -7321,7 +7335,7 @@ dependencies = [ [[package]] name = "sp-finality-tracker" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" +source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" dependencies = [ "parity-scale-codec", "sp-inherents", @@ -7331,7 +7345,7 @@ dependencies = [ [[package]] name = "sp-inherents" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" +source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" dependencies = [ "derive_more 0.99.8", "parity-scale-codec", @@ -7343,7 +7357,7 @@ dependencies = [ [[package]] name = "sp-io" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" +source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" dependencies = [ "futures 0.3.5", "hash-db", @@ -7364,7 +7378,7 @@ dependencies = [ [[package]] name = "sp-keyring" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" +source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" dependencies = [ "lazy_static", "sp-core", @@ -7375,7 +7389,7 @@ dependencies = [ [[package]] name = "sp-npos-elections" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" +source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" dependencies = [ "parity-scale-codec", "serde", @@ -7387,7 +7401,7 @@ dependencies = [ [[package]] name = "sp-npos-elections-compact" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" +source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -7398,7 +7412,7 @@ dependencies = [ [[package]] name = "sp-offchain" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" +source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" dependencies = [ "sp-api", "sp-core", @@ -7408,7 +7422,7 @@ dependencies = [ [[package]] name = "sp-panic-handler" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" +source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" dependencies = [ "backtrace", "log 0.4.8", @@ -7417,7 +7431,7 @@ dependencies = [ [[package]] name = "sp-rpc" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" +source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" dependencies = [ "serde", "sp-core", @@ -7426,7 +7440,7 @@ dependencies = [ [[package]] name = "sp-runtime" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" +source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" dependencies = [ "either", "hash256-std-hasher", @@ -7448,7 +7462,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" +source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" dependencies = [ "parity-scale-codec", "primitive-types", @@ -7463,7 +7477,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" +source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" dependencies = [ "Inflector", "proc-macro-crate", @@ -7475,7 +7489,7 @@ dependencies = [ [[package]] name = "sp-serializer" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" +source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" dependencies = [ "serde", "serde_json", @@ -7484,7 +7498,7 @@ dependencies = [ [[package]] name = "sp-session" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" +source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" dependencies = [ "parity-scale-codec", "sp-api", @@ -7497,7 +7511,7 @@ dependencies = [ [[package]] name = "sp-staking" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" +source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" dependencies = [ "parity-scale-codec", "sp-runtime", @@ -7507,7 +7521,7 @@ dependencies = [ [[package]] name = "sp-state-machine" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" +source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" dependencies = [ "hash-db", "itertools 0.9.0", @@ -7528,12 +7542,12 @@ dependencies = [ [[package]] name = "sp-std" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" +source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" [[package]] name = "sp-storage" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" +source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" dependencies = [ "impl-serde 0.2.3", "ref-cast", @@ -7545,7 +7559,7 @@ dependencies = [ [[package]] name = "sp-timestamp" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" +source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -7559,7 +7573,7 @@ dependencies = [ [[package]] name = "sp-tracing" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" +source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" dependencies = [ "log 0.4.8", "rental", @@ -7569,7 +7583,7 @@ dependencies = [ [[package]] name = "sp-transaction-pool" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" +source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" dependencies = [ "derive_more 0.99.8", "futures 0.3.5", @@ -7585,7 +7599,7 @@ dependencies = [ [[package]] name = "sp-trie" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" +source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" dependencies = [ "hash-db", "memory-db", @@ -7599,7 +7613,7 @@ dependencies = [ [[package]] name = "sp-utils" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" +source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" dependencies = [ "futures 0.3.5", "futures-core", @@ -7611,7 +7625,7 @@ dependencies = [ [[package]] name = "sp-version" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" +source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" dependencies = [ "impl-serde 0.2.3", "parity-scale-codec", @@ -7623,7 +7637,7 @@ dependencies = [ [[package]] name = "sp-wasm-interface" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" +source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -7763,7 +7777,7 @@ dependencies = [ [[package]] name = "substrate-browser-utils" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" +source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" dependencies = [ "chrono", "clear_on_drop", @@ -7790,7 +7804,7 @@ dependencies = [ [[package]] name = "substrate-build-script-utils" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" +source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" dependencies = [ "platforms", ] @@ -7798,7 +7812,7 @@ dependencies = [ [[package]] name = "substrate-frame-rpc-system" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" +source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" dependencies = [ "frame-system-rpc-runtime-api", "futures 0.3.5", @@ -7821,7 +7835,7 @@ dependencies = [ [[package]] name = "substrate-prometheus-endpoint" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" +source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" dependencies = [ "async-std", "derive_more 0.99.8", @@ -7835,7 +7849,7 @@ dependencies = [ [[package]] name = "substrate-test-client" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" +source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" dependencies = [ "futures 0.1.29", "futures 0.3.5", @@ -7859,7 +7873,7 @@ dependencies = [ [[package]] name = "substrate-test-runtime" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" +source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" dependencies = [ "cfg-if", "frame-executive", @@ -7899,7 +7913,7 @@ dependencies = [ [[package]] name = "substrate-test-runtime-client" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" +source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" dependencies = [ "futures 0.3.5", "parity-scale-codec", @@ -7920,7 +7934,7 @@ dependencies = [ [[package]] name = "substrate-wasm-builder-runner" version = "1.0.6" -source = "git+https://github.com/paritytech/substrate#660ca2712a02d7ca6944bb7ee8cd3345b9540eb5" +source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" [[package]] name = "substrate-wasm-builder-runner" @@ -9283,6 +9297,12 @@ dependencies = [ "static_assertions", ] +[[package]] +name = "yansi" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fc79f4a1e39857fc00c3f662cbf2651c771f00e9c15fe2abc341806bd46bd71" + [[package]] name = "zeroize" version = "1.1.0" diff --git a/cli/src/cli.rs b/cli/src/cli.rs index 85e8481819..b3a149c9a3 100644 --- a/cli/src/cli.rs +++ b/cli/src/cli.rs @@ -84,11 +84,9 @@ pub struct RunCmd { #[allow(missing_docs)] #[derive(Debug, StructOpt)] pub struct Cli { - #[allow(missing_docs)] #[structopt(subcommand)] pub subcommand: Option, - #[allow(missing_docs)] #[structopt(flatten)] pub run: RunCmd, } diff --git a/cli/src/command.rs b/cli/src/command.rs index d518b94ccf..076ddb86f3 100644 --- a/cli/src/command.rs +++ b/cli/src/command.rs @@ -19,7 +19,7 @@ use log::info; use service::{IdentifyVariant, self}; #[cfg(feature = "service-rewr")] use service_new::{IdentifyVariant, self as service}; -use sc_cli::{SubstrateCli, Result, RuntimeVersion, Role}; +use sc_cli::{CliConfiguration, SubstrateCli, Result, RuntimeVersion, Role}; use crate::cli::{Cli, Subcommand}; fn get_exec_name() -> Option { @@ -198,7 +198,7 @@ pub fn run() -> Result<()> { } }, Some(Subcommand::ValidationWorker(cmd)) => { - sc_cli::init_logger(""); + sc_cli::init_logger("", cli.run.base.log_rotation_opt()?)?; if cfg!(feature = "browser") { Err(sc_cli::Error::Input("Cannot run validation worker in browser".into())) -- GitLab From 8ab7370ed28b5229897602714758de8bc7008255 Mon Sep 17 00:00:00 2001 From: Pierre Krieger Date: Wed, 8 Jul 2020 17:21:37 +0200 Subject: [PATCH 043/192] Update to substrate#59ee76a0 (#1380) --- Cargo.lock | 442 +++++++++++++++++++++++++++++------------------------ 1 file changed, 244 insertions(+), 198 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index c97a1bad55..7f488fd2b0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -216,39 +216,33 @@ checksum = "7deb0a829ca7bcfaf5da70b073a8d128619259a7be8216a355e23f00763059e5" [[package]] name = "async-std" -version = "1.5.0" +version = "1.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "538ecb01eb64eecd772087e5b6f7540cbc917f047727339a472dafed2185b267" +checksum = "00d68a33ebc8b57800847d00787307f84a562224a14db069b0acefe4c2abbf5d" dependencies = [ "async-task", - "broadcaster", - "crossbeam-channel", - "crossbeam-deque", "crossbeam-utils", + "futures-channel", "futures-core", "futures-io", - "futures-timer 2.0.2", + "futures-timer 3.0.2", "kv-log-macro", "log 0.4.8", "memchr", - "mio", - "mio-uds", "num_cpus", "once_cell", "pin-project-lite", "pin-utils", "slab", + "smol", + "wasm-bindgen-futures", ] [[package]] name = "async-task" -version = "1.3.1" +version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ac2c016b079e771204030951c366db398864f5026f84a44dafb0ff20f02085d" -dependencies = [ - "libc", - "winapi 0.3.8", -] +checksum = "c17772156ef2829aadc587461c7753af20b7e8db1529bc66855add962a3b35d3" [[package]] name = "async-tls" @@ -459,17 +453,16 @@ dependencies = [ ] [[package]] -name = "broadcaster" -version = "1.0.0" +name = "blocking" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9c972e21e0d055a36cf73e4daae870941fe7a8abcd5ac3396aab9e4c126bd87" +checksum = "9d17efb70ce4421e351d61aafd90c16a20fb5bfe339fcdc32a86816280e62ce0" dependencies = [ "futures-channel", - "futures-core", - "futures-sink", "futures-util", - "parking_lot 0.10.2", - "slab", + "once_cell", + "parking", + "waker-fn", ] [[package]] @@ -534,6 +527,12 @@ version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4964518bd3b4a8190e832886cdc0da9794f12e8e6c1613a9e90ff331c4c8724b" +[[package]] +name = "cache-padded" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "631ae5198c9be5e753e5cc215e1bd73c2b466a3565173db433f52bb9d3e66dba" + [[package]] name = "cc" version = "1.0.54" @@ -638,6 +637,15 @@ dependencies = [ "bitflags", ] +[[package]] +name = "concurrent-queue" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f83c06aff61f2d899eb87c379df3cbf7876f14471dcab474e0b6dc90ab96c080" +dependencies = [ + "cache-padded", +] + [[package]] name = "console_error_panic_hook" version = "0.1.6" @@ -801,16 +809,6 @@ dependencies = [ "cfg-if", ] -[[package]] -name = "crossbeam-channel" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cced8691919c02aac3cb0a1bc2e9b73d89e832bf9a06fc579d4e71b68a2da061" -dependencies = [ - "crossbeam-utils", - "maybe-uninit", -] - [[package]] name = "crossbeam-deque" version = "0.7.3" @@ -1178,6 +1176,12 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7" +[[package]] +name = "fastrand" +version = "1.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36a9cb09840f81cd211e435d00a4e487edd263dc3c8ff815c32dd76ad668ebed" + [[package]] name = "fdlimit" version = "0.1.4" @@ -1281,7 +1285,7 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "fork-tree" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" +source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" dependencies = [ "parity-scale-codec", ] @@ -1289,7 +1293,7 @@ dependencies = [ [[package]] name = "frame-benchmarking" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" +source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" dependencies = [ "frame-support", "frame-system", @@ -1306,7 +1310,7 @@ dependencies = [ [[package]] name = "frame-benchmarking-cli" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" +source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" dependencies = [ "Inflector", "frame-benchmarking", @@ -1325,7 +1329,7 @@ dependencies = [ [[package]] name = "frame-executive" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" +source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" dependencies = [ "frame-support", "frame-system", @@ -1340,7 +1344,7 @@ dependencies = [ [[package]] name = "frame-metadata" version = "11.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" +source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" dependencies = [ "parity-scale-codec", "serde", @@ -1351,7 +1355,7 @@ dependencies = [ [[package]] name = "frame-support" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" +source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" dependencies = [ "bitmask", "frame-metadata", @@ -1376,7 +1380,7 @@ dependencies = [ [[package]] name = "frame-support-procedural" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" +source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" dependencies = [ "frame-support-procedural-tools", "proc-macro2 1.0.18", @@ -1387,7 +1391,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" +source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" dependencies = [ "frame-support-procedural-tools-derive", "proc-macro-crate", @@ -1399,7 +1403,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools-derive" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" +source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" dependencies = [ "proc-macro2 1.0.18", "quote 1.0.7", @@ -1409,7 +1413,7 @@ dependencies = [ [[package]] name = "frame-system" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" +source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" dependencies = [ "frame-support", "impl-trait-for-tuples", @@ -1425,7 +1429,7 @@ dependencies = [ [[package]] name = "frame-system-benchmarking" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" +source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" dependencies = [ "frame-benchmarking", "frame-support", @@ -1439,7 +1443,7 @@ dependencies = [ [[package]] name = "frame-system-rpc-runtime-api" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" +source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" dependencies = [ "parity-scale-codec", "sp-api", @@ -2576,9 +2580,9 @@ checksum = "c7d73b3f436185384286bd8098d17ec07c9a7d2388a6599f824d8502b529702a" [[package]] name = "libp2p" -version = "0.20.1" +version = "0.21.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db81113df355dea9dddfcb01cd867555298dca29d915f25d1b1a0aad2e29338b" +checksum = "6d743d03fab397cde23925a17cb87b35b25994f44ab8c6a9e46a7e953ec739cd" dependencies = [ "bytes 0.5.4", "futures 0.3.5", @@ -2607,9 +2611,9 @@ dependencies = [ [[package]] name = "libp2p-core" -version = "0.19.2" +version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a0387b930c3d4c2533dc4893c1e0394185ddcc019846121b1b27491e45a2c08" +checksum = "11ca8d5a64a5d19b45e00e8f24afda6b8e1b605fb25ad7bcf62a42ecf19d7ff3" dependencies = [ "asn1_der", "bs58", @@ -2641,9 +2645,9 @@ dependencies = [ [[package]] name = "libp2p-core-derive" -version = "0.19.1" +version = "0.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f09548626b737ed64080fde595e06ce1117795b8b9fc4d2629fa36561c583171" +checksum = "515c4a7cba5d321bb88ed3ed803997bdd5634ce35c9c5e8e9ace9c512e57eceb" dependencies = [ "quote 1.0.7", "syn 1.0.31", @@ -2651,9 +2655,9 @@ dependencies = [ [[package]] name = "libp2p-dns" -version = "0.19.0" +version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3cc186d9a941fd0207cf8f08ef225a735e2d7296258f570155e525f6ee732f87" +checksum = "f751924b6b98e350005e0b87a822beb246792a3fb878c684e088f866158120ac" dependencies = [ "futures 0.3.5", "libp2p-core", @@ -2662,9 +2666,9 @@ dependencies = [ [[package]] name = "libp2p-identify" -version = "0.19.2" +version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62f76075b170d908bae616f550ade410d9d27c013fa69042551dbfc757c7c094" +checksum = "912c00a7bf67e0e765daf0cc37e08f675ea26aba3d6d1fbfaee81f19a4c23049" dependencies = [ "futures 0.3.5", "libp2p-core", @@ -2678,9 +2682,9 @@ dependencies = [ [[package]] name = "libp2p-kad" -version = "0.20.1" +version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7c819a5425b2eb3416d67e9c868c5c1e922b6658655e06b9eeafaa41304b876" +checksum = "44ed3a4c8111c570ab2bffb30c6353178d7603ce3787e3c5f2493c8d3d16d1f0" dependencies = [ "arrayvec 0.5.1", "bytes 0.5.4", @@ -2705,9 +2709,9 @@ dependencies = [ [[package]] name = "libp2p-mdns" -version = "0.19.2" +version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f55b2d4b80986e5bf158270ab23268ec0e7f644ece5436fbaabc5155472f357" +checksum = "cd004c668160fd922f7268b2cd1e4550ff69165d9c744e9eb5770086eb753d02" dependencies = [ "async-std", "data-encoding", @@ -2727,9 +2731,9 @@ dependencies = [ [[package]] name = "libp2p-mplex" -version = "0.19.2" +version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be7d913a4cd57de2013257ec73f07d77bfce390b370023e2d59083e5ca079864" +checksum = "14ae0ffacd30f073f96cd518b2c9cd2cb18ac27c3d136a4b23cf1af99f33e541" dependencies = [ "bytes 0.5.4", "fnv", @@ -2743,9 +2747,9 @@ dependencies = [ [[package]] name = "libp2p-noise" -version = "0.19.1" +version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a03db664653369f46ee03fcec483a378c20195089bb43a26cb9fb0058009ac88" +checksum = "f6ad6b67d802de8b5ddc5e8b0ff55a0d0a6a737c2c5c174601dbb9d24e0ad5cb" dependencies = [ "curve25519-dalek", "futures 0.3.5", @@ -2764,9 +2768,9 @@ dependencies = [ [[package]] name = "libp2p-ping" -version = "0.19.3" +version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8dedd34e35a9728d52d59ef36a218e411359a353f9011b2574b86ee790978f6" +checksum = "70130cf130e4ba6dc177366e72dd9f86f9e3588fa1a0c4145247e676f16affad" dependencies = [ "futures 0.3.5", "libp2p-core", @@ -2779,9 +2783,9 @@ dependencies = [ [[package]] name = "libp2p-swarm" -version = "0.19.1" +version = "0.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce53ff4d127cf8b39adf84dbd381ca32d49bd85788cee08e6669da2495993930" +checksum = "f88d5e2a090a2aadf042cd33484e2f015c6dab212567406a59deece5dedbd133" dependencies = [ "futures 0.3.5", "libp2p-core", @@ -2794,9 +2798,9 @@ dependencies = [ [[package]] name = "libp2p-tcp" -version = "0.19.2" +version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9481500c5774c62e8c413e9535b3f33a0e3dbacf2da63b8d3056c686a9df4146" +checksum = "9b1fa2bbad054020cb875546a577a66a65a5bf42eff55ed5265f92ffee3cc052" dependencies = [ "async-std", "futures 0.3.5", @@ -2810,9 +2814,9 @@ dependencies = [ [[package]] name = "libp2p-wasm-ext" -version = "0.19.0" +version = "0.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f59fdbb5706f2723ca108c088b1c7a37f735a8c328021f0508007162627e9885" +checksum = "0feb99e32fea20ffb1bbf56a6fb2614bff7325ff44a515728385170b3420d2c3" dependencies = [ "futures 0.3.5", "js-sys", @@ -2824,9 +2828,9 @@ dependencies = [ [[package]] name = "libp2p-websocket" -version = "0.20.0" +version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e4440551bf6519e0a684cd859ea809aec6d798f686e0d6ed03a28c3e76849b8" +checksum = "bd3a13025c0f621647ed2c5147615468e7b3cd1a5c7f26f2a6f6f8eafc9c1950" dependencies = [ "async-tls", "either", @@ -2844,9 +2848,9 @@ dependencies = [ [[package]] name = "libp2p-yamux" -version = "0.19.1" +version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8da33e7b5f49c75c6a8afb0b8d1e229f5fa48be9f39bd14cdbc21459a02ac6fc" +checksum = "46ae9bf2f7d8a4be9c7e9b61df9de9dc1bd66419d669098f22f81f8d9571029a" dependencies = [ "futures 0.3.5", "libp2p-core", @@ -3405,7 +3409,7 @@ dependencies = [ [[package]] name = "pallet-authority-discovery" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" +source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" dependencies = [ "frame-support", "frame-system", @@ -3421,7 +3425,7 @@ dependencies = [ [[package]] name = "pallet-authorship" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" +source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" dependencies = [ "frame-support", "frame-system", @@ -3436,7 +3440,7 @@ dependencies = [ [[package]] name = "pallet-babe" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" +source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" dependencies = [ "frame-benchmarking", "frame-support", @@ -3461,7 +3465,7 @@ dependencies = [ [[package]] name = "pallet-balances" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" +source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" dependencies = [ "frame-benchmarking", "frame-support", @@ -3475,7 +3479,7 @@ dependencies = [ [[package]] name = "pallet-collective" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" +source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" dependencies = [ "frame-benchmarking", "frame-support", @@ -3491,7 +3495,7 @@ dependencies = [ [[package]] name = "pallet-democracy" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" +source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" dependencies = [ "frame-benchmarking", "frame-support", @@ -3506,7 +3510,7 @@ dependencies = [ [[package]] name = "pallet-elections-phragmen" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" +source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" dependencies = [ "frame-benchmarking", "frame-support", @@ -3521,7 +3525,7 @@ dependencies = [ [[package]] name = "pallet-finality-tracker" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" +source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" dependencies = [ "frame-support", "frame-system", @@ -3537,7 +3541,7 @@ dependencies = [ [[package]] name = "pallet-grandpa" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" +source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" dependencies = [ "frame-support", "frame-system", @@ -3557,7 +3561,7 @@ dependencies = [ [[package]] name = "pallet-identity" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" +source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" dependencies = [ "enumflags2", "frame-benchmarking", @@ -3573,7 +3577,7 @@ dependencies = [ [[package]] name = "pallet-im-online" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" +source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" dependencies = [ "frame-benchmarking", "frame-support", @@ -3593,7 +3597,7 @@ dependencies = [ [[package]] name = "pallet-indices" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" +source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" dependencies = [ "frame-support", "frame-system", @@ -3609,7 +3613,7 @@ dependencies = [ [[package]] name = "pallet-membership" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" +source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" dependencies = [ "frame-support", "frame-system", @@ -3623,7 +3627,7 @@ dependencies = [ [[package]] name = "pallet-multisig" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" +source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" dependencies = [ "frame-support", "frame-system", @@ -3638,7 +3642,7 @@ dependencies = [ [[package]] name = "pallet-nicks" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" +source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" dependencies = [ "frame-support", "frame-system", @@ -3652,7 +3656,7 @@ dependencies = [ [[package]] name = "pallet-offences" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" +source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" dependencies = [ "frame-support", "frame-system", @@ -3667,7 +3671,7 @@ dependencies = [ [[package]] name = "pallet-offences-benchmarking" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" +source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" dependencies = [ "frame-benchmarking", "frame-support", @@ -3688,7 +3692,7 @@ dependencies = [ [[package]] name = "pallet-proxy" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" +source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" dependencies = [ "frame-support", "frame-system", @@ -3703,7 +3707,7 @@ dependencies = [ [[package]] name = "pallet-randomness-collective-flip" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" +source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" dependencies = [ "frame-support", "frame-system", @@ -3716,7 +3720,7 @@ dependencies = [ [[package]] name = "pallet-recovery" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" +source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" dependencies = [ "enumflags2", "frame-support", @@ -3731,7 +3735,7 @@ dependencies = [ [[package]] name = "pallet-scheduler" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" +source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" dependencies = [ "frame-benchmarking", "frame-support", @@ -3746,7 +3750,7 @@ dependencies = [ [[package]] name = "pallet-session" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" +source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" dependencies = [ "frame-support", "frame-system", @@ -3766,7 +3770,7 @@ dependencies = [ [[package]] name = "pallet-session-benchmarking" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" +source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" dependencies = [ "frame-benchmarking", "frame-support", @@ -3782,7 +3786,7 @@ dependencies = [ [[package]] name = "pallet-society" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" +source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" dependencies = [ "frame-support", "frame-system", @@ -3796,7 +3800,7 @@ dependencies = [ [[package]] name = "pallet-staking" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" +source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" dependencies = [ "frame-benchmarking", "frame-support", @@ -3818,7 +3822,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-curve" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" +source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -3829,7 +3833,7 @@ dependencies = [ [[package]] name = "pallet-sudo" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" +source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" dependencies = [ "frame-support", "frame-system", @@ -3843,7 +3847,7 @@ dependencies = [ [[package]] name = "pallet-timestamp" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" +source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" dependencies = [ "frame-benchmarking", "frame-support", @@ -3861,7 +3865,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" +source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" dependencies = [ "frame-support", "frame-system", @@ -3876,7 +3880,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" +source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" dependencies = [ "jsonrpc-core", "jsonrpc-core-client", @@ -3894,7 +3898,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc-runtime-api" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" +source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" dependencies = [ "frame-support", "parity-scale-codec", @@ -3907,7 +3911,7 @@ dependencies = [ [[package]] name = "pallet-treasury" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" +source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" dependencies = [ "frame-benchmarking", "frame-support", @@ -3922,7 +3926,7 @@ dependencies = [ [[package]] name = "pallet-utility" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" +source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" dependencies = [ "frame-benchmarking", "frame-support", @@ -3938,7 +3942,7 @@ dependencies = [ [[package]] name = "pallet-vesting" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" +source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" dependencies = [ "enumflags2", "frame-benchmarking", @@ -4099,6 +4103,12 @@ version = "0.41.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ddfc878dac00da22f8f61e7af3157988424567ab01d9920b962ef7dcbd7cd865" +[[package]] +name = "parking" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1efcee3c6d23b94012e240525f131c6abaa9e5eeb8f211002d93beec3b7be350" + [[package]] name = "parking_lot" version = "0.9.0" @@ -5791,7 +5801,7 @@ dependencies = [ [[package]] name = "sc-authority-discovery" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" +source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" dependencies = [ "bytes 0.5.4", "derive_more 0.99.8", @@ -5818,7 +5828,7 @@ dependencies = [ [[package]] name = "sc-basic-authorship" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" +source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -5842,7 +5852,7 @@ dependencies = [ [[package]] name = "sc-block-builder" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" +source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" dependencies = [ "parity-scale-codec", "sc-client-api", @@ -5859,7 +5869,7 @@ dependencies = [ [[package]] name = "sc-chain-spec" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" +source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" dependencies = [ "impl-trait-for-tuples", "sc-chain-spec-derive", @@ -5875,7 +5885,7 @@ dependencies = [ [[package]] name = "sc-chain-spec-derive" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" +source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -5886,7 +5896,7 @@ dependencies = [ [[package]] name = "sc-cli" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" +source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" dependencies = [ "ansi_term 0.12.1", "atty", @@ -5927,7 +5937,7 @@ dependencies = [ [[package]] name = "sc-client-api" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" +source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" dependencies = [ "derive_more 0.99.8", "fnv", @@ -5963,7 +5973,7 @@ dependencies = [ [[package]] name = "sc-client-db" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" +source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" dependencies = [ "blake2-rfc", "hash-db", @@ -5992,7 +6002,7 @@ dependencies = [ [[package]] name = "sc-consensus" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" +source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" dependencies = [ "sc-client-api", "sp-blockchain", @@ -6003,7 +6013,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" +source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" dependencies = [ "derive_more 0.99.8", "fork-tree", @@ -6045,7 +6055,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe-rpc" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" +source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" dependencies = [ "derive_more 0.99.8", "futures 0.3.5", @@ -6069,7 +6079,7 @@ dependencies = [ [[package]] name = "sc-consensus-epochs" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" +source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" dependencies = [ "fork-tree", "parity-scale-codec", @@ -6082,7 +6092,7 @@ dependencies = [ [[package]] name = "sc-consensus-slots" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" +source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6105,7 +6115,7 @@ dependencies = [ [[package]] name = "sc-consensus-uncles" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" +source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" dependencies = [ "log 0.4.8", "sc-client-api", @@ -6119,7 +6129,7 @@ dependencies = [ [[package]] name = "sc-executor" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" +source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" dependencies = [ "derive_more 0.99.8", "lazy_static", @@ -6147,7 +6157,7 @@ dependencies = [ [[package]] name = "sc-executor-common" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" +source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" dependencies = [ "derive_more 0.99.8", "log 0.4.8", @@ -6164,7 +6174,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmi" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" +source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" dependencies = [ "log 0.4.8", "parity-scale-codec", @@ -6179,7 +6189,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmtime" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" +source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" dependencies = [ "cranelift-codegen", "cranelift-wasm", @@ -6200,7 +6210,7 @@ dependencies = [ [[package]] name = "sc-finality-grandpa" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" +source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" dependencies = [ "assert_matches", "derive_more 0.99.8", @@ -6238,7 +6248,7 @@ dependencies = [ [[package]] name = "sc-finality-grandpa-rpc" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" +source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" dependencies = [ "derive_more 0.99.8", "finality-grandpa", @@ -6255,7 +6265,7 @@ dependencies = [ [[package]] name = "sc-informant" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" +source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" dependencies = [ "ansi_term 0.12.1", "futures 0.3.5", @@ -6273,7 +6283,7 @@ dependencies = [ [[package]] name = "sc-keystore" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" +source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" dependencies = [ "derive_more 0.99.8", "hex", @@ -6289,7 +6299,7 @@ dependencies = [ [[package]] name = "sc-light" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" +source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" dependencies = [ "hash-db", "lazy_static", @@ -6308,7 +6318,7 @@ dependencies = [ [[package]] name = "sc-network" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" +source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" dependencies = [ "bitflags", "bs58", @@ -6360,7 +6370,7 @@ dependencies = [ [[package]] name = "sc-network-gossip" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" +source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6375,7 +6385,7 @@ dependencies = [ [[package]] name = "sc-network-test" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" +source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" dependencies = [ "env_logger", "futures 0.3.5", @@ -6402,7 +6412,7 @@ dependencies = [ [[package]] name = "sc-offchain" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" +source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" dependencies = [ "bytes 0.5.4", "fnv", @@ -6429,7 +6439,7 @@ dependencies = [ [[package]] name = "sc-peerset" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" +source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" dependencies = [ "futures 0.3.5", "libp2p", @@ -6442,7 +6452,7 @@ dependencies = [ [[package]] name = "sc-proposer-metrics" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" +source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" dependencies = [ "log 0.4.8", "substrate-prometheus-endpoint", @@ -6451,7 +6461,7 @@ dependencies = [ [[package]] name = "sc-rpc" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" +source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" dependencies = [ "futures 0.3.5", "hash-db", @@ -6483,7 +6493,7 @@ dependencies = [ [[package]] name = "sc-rpc-api" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" +source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" dependencies = [ "derive_more 0.99.8", "futures 0.3.5", @@ -6507,7 +6517,7 @@ dependencies = [ [[package]] name = "sc-rpc-server" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" +source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" dependencies = [ "jsonrpc-core", "jsonrpc-http-server", @@ -6523,7 +6533,7 @@ dependencies = [ [[package]] name = "sc-service" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" +source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" dependencies = [ "derive_more 0.99.8", "directories", @@ -6586,7 +6596,7 @@ dependencies = [ [[package]] name = "sc-state-db" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" +source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" dependencies = [ "log 0.4.8", "parity-scale-codec", @@ -6600,7 +6610,7 @@ dependencies = [ [[package]] name = "sc-telemetry" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" +source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6621,7 +6631,7 @@ dependencies = [ [[package]] name = "sc-tracing" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" +source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" dependencies = [ "erased-serde", "log 0.4.8", @@ -6638,7 +6648,7 @@ dependencies = [ [[package]] name = "sc-transaction-graph" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" +source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" dependencies = [ "derive_more 0.99.8", "futures 0.3.5", @@ -6658,7 +6668,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" +source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" dependencies = [ "derive_more 0.99.8", "futures 0.3.5", @@ -6995,6 +7005,27 @@ version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3757cb9d89161a2f24e1cf78efa0c1fcff485d18e3f55e0aa3480824ddaa0f3f" +[[package]] +name = "smol" +version = "0.1.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "620cbb3c6e34da57d3a248cda0cd01cd5848164dc062e764e65d06fe3ea7aed5" +dependencies = [ + "async-task", + "blocking", + "concurrent-queue", + "fastrand", + "futures-io", + "futures-util", + "libc", + "once_cell", + "scoped-tls", + "slab", + "socket2", + "wepoll-sys-stjepang", + "winapi 0.3.8", +] + [[package]] name = "snow" version = "0.7.0" @@ -7044,7 +7075,7 @@ dependencies = [ [[package]] name = "sp-allocator" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" +source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" dependencies = [ "derive_more 0.99.8", "log 0.4.8", @@ -7056,7 +7087,7 @@ dependencies = [ [[package]] name = "sp-api" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" +source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" dependencies = [ "hash-db", "parity-scale-codec", @@ -7071,7 +7102,7 @@ dependencies = [ [[package]] name = "sp-api-proc-macro" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" +source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" dependencies = [ "blake2-rfc", "proc-macro-crate", @@ -7083,7 +7114,7 @@ dependencies = [ [[package]] name = "sp-application-crypto" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" +source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" dependencies = [ "parity-scale-codec", "serde", @@ -7095,7 +7126,7 @@ dependencies = [ [[package]] name = "sp-arithmetic" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" +source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" dependencies = [ "integer-sqrt", "num-traits 0.2.12", @@ -7108,7 +7139,7 @@ dependencies = [ [[package]] name = "sp-authority-discovery" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" +source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" dependencies = [ "parity-scale-codec", "sp-api", @@ -7120,7 +7151,7 @@ dependencies = [ [[package]] name = "sp-authorship" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" +source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" dependencies = [ "parity-scale-codec", "sp-inherents", @@ -7131,7 +7162,7 @@ dependencies = [ [[package]] name = "sp-block-builder" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" +source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" dependencies = [ "parity-scale-codec", "sp-api", @@ -7143,7 +7174,7 @@ dependencies = [ [[package]] name = "sp-blockchain" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" +source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" dependencies = [ "derive_more 0.99.8", "log 0.4.8", @@ -7159,7 +7190,7 @@ dependencies = [ [[package]] name = "sp-chain-spec" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" +source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" dependencies = [ "serde", "serde_json", @@ -7168,7 +7199,7 @@ dependencies = [ [[package]] name = "sp-consensus" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" +source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" dependencies = [ "derive_more 0.99.8", "futures 0.3.5", @@ -7192,7 +7223,7 @@ dependencies = [ [[package]] name = "sp-consensus-aura" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" +source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" dependencies = [ "parity-scale-codec", "sp-api", @@ -7206,7 +7237,7 @@ dependencies = [ [[package]] name = "sp-consensus-babe" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" +source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" dependencies = [ "merlin", "parity-scale-codec", @@ -7225,7 +7256,7 @@ dependencies = [ [[package]] name = "sp-consensus-slots" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" +source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" dependencies = [ "parity-scale-codec", "sp-runtime", @@ -7234,7 +7265,7 @@ dependencies = [ [[package]] name = "sp-consensus-vrf" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" +source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" dependencies = [ "parity-scale-codec", "schnorrkel", @@ -7246,7 +7277,7 @@ dependencies = [ [[package]] name = "sp-core" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" +source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" dependencies = [ "base58", "blake2-rfc", @@ -7289,7 +7320,7 @@ dependencies = [ [[package]] name = "sp-database" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" +source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" dependencies = [ "kvdb", "parking_lot 0.10.2", @@ -7298,7 +7329,7 @@ dependencies = [ [[package]] name = "sp-debug-derive" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" +source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" dependencies = [ "proc-macro2 1.0.18", "quote 1.0.7", @@ -7308,7 +7339,7 @@ dependencies = [ [[package]] name = "sp-externalities" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" +source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" dependencies = [ "environmental", "parity-scale-codec", @@ -7319,7 +7350,7 @@ dependencies = [ [[package]] name = "sp-finality-grandpa" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" +source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" dependencies = [ "finality-grandpa", "log 0.4.8", @@ -7335,7 +7366,7 @@ dependencies = [ [[package]] name = "sp-finality-tracker" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" +source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" dependencies = [ "parity-scale-codec", "sp-inherents", @@ -7345,7 +7376,7 @@ dependencies = [ [[package]] name = "sp-inherents" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" +source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" dependencies = [ "derive_more 0.99.8", "parity-scale-codec", @@ -7357,7 +7388,7 @@ dependencies = [ [[package]] name = "sp-io" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" +source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" dependencies = [ "futures 0.3.5", "hash-db", @@ -7378,7 +7409,7 @@ dependencies = [ [[package]] name = "sp-keyring" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" +source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" dependencies = [ "lazy_static", "sp-core", @@ -7389,7 +7420,7 @@ dependencies = [ [[package]] name = "sp-npos-elections" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" +source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" dependencies = [ "parity-scale-codec", "serde", @@ -7401,7 +7432,7 @@ dependencies = [ [[package]] name = "sp-npos-elections-compact" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" +source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -7412,7 +7443,7 @@ dependencies = [ [[package]] name = "sp-offchain" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" +source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" dependencies = [ "sp-api", "sp-core", @@ -7422,7 +7453,7 @@ dependencies = [ [[package]] name = "sp-panic-handler" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" +source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" dependencies = [ "backtrace", "log 0.4.8", @@ -7431,7 +7462,7 @@ dependencies = [ [[package]] name = "sp-rpc" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" +source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" dependencies = [ "serde", "sp-core", @@ -7440,7 +7471,7 @@ dependencies = [ [[package]] name = "sp-runtime" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" +source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" dependencies = [ "either", "hash256-std-hasher", @@ -7462,7 +7493,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" +source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" dependencies = [ "parity-scale-codec", "primitive-types", @@ -7477,7 +7508,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" +source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" dependencies = [ "Inflector", "proc-macro-crate", @@ -7489,7 +7520,7 @@ dependencies = [ [[package]] name = "sp-serializer" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" +source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" dependencies = [ "serde", "serde_json", @@ -7498,7 +7529,7 @@ dependencies = [ [[package]] name = "sp-session" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" +source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" dependencies = [ "parity-scale-codec", "sp-api", @@ -7511,7 +7542,7 @@ dependencies = [ [[package]] name = "sp-staking" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" +source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" dependencies = [ "parity-scale-codec", "sp-runtime", @@ -7521,7 +7552,7 @@ dependencies = [ [[package]] name = "sp-state-machine" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" +source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" dependencies = [ "hash-db", "itertools 0.9.0", @@ -7542,12 +7573,12 @@ dependencies = [ [[package]] name = "sp-std" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" +source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" [[package]] name = "sp-storage" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" +source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" dependencies = [ "impl-serde 0.2.3", "ref-cast", @@ -7559,7 +7590,7 @@ dependencies = [ [[package]] name = "sp-timestamp" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" +source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -7573,7 +7604,7 @@ dependencies = [ [[package]] name = "sp-tracing" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" +source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" dependencies = [ "log 0.4.8", "rental", @@ -7583,7 +7614,7 @@ dependencies = [ [[package]] name = "sp-transaction-pool" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" +source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" dependencies = [ "derive_more 0.99.8", "futures 0.3.5", @@ -7599,7 +7630,7 @@ dependencies = [ [[package]] name = "sp-trie" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" +source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" dependencies = [ "hash-db", "memory-db", @@ -7613,7 +7644,7 @@ dependencies = [ [[package]] name = "sp-utils" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" +source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" dependencies = [ "futures 0.3.5", "futures-core", @@ -7625,7 +7656,7 @@ dependencies = [ [[package]] name = "sp-version" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" +source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" dependencies = [ "impl-serde 0.2.3", "parity-scale-codec", @@ -7637,7 +7668,7 @@ dependencies = [ [[package]] name = "sp-wasm-interface" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" +source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -7777,7 +7808,7 @@ dependencies = [ [[package]] name = "substrate-browser-utils" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" +source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" dependencies = [ "chrono", "clear_on_drop", @@ -7804,7 +7835,7 @@ dependencies = [ [[package]] name = "substrate-build-script-utils" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" +source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" dependencies = [ "platforms", ] @@ -7812,7 +7843,7 @@ dependencies = [ [[package]] name = "substrate-frame-rpc-system" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" +source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" dependencies = [ "frame-system-rpc-runtime-api", "futures 0.3.5", @@ -7835,7 +7866,7 @@ dependencies = [ [[package]] name = "substrate-prometheus-endpoint" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" +source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" dependencies = [ "async-std", "derive_more 0.99.8", @@ -7849,7 +7880,7 @@ dependencies = [ [[package]] name = "substrate-test-client" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" +source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" dependencies = [ "futures 0.1.29", "futures 0.3.5", @@ -7873,7 +7904,7 @@ dependencies = [ [[package]] name = "substrate-test-runtime" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" +source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" dependencies = [ "cfg-if", "frame-executive", @@ -7913,7 +7944,7 @@ dependencies = [ [[package]] name = "substrate-test-runtime-client" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" +source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" dependencies = [ "futures 0.3.5", "parity-scale-codec", @@ -7934,7 +7965,7 @@ dependencies = [ [[package]] name = "substrate-wasm-builder-runner" version = "1.0.6" -source = "git+https://github.com/paritytech/substrate#802a0d0b0ade796a3b2d4663212518315923fe8a" +source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" [[package]] name = "substrate-wasm-builder-runner" @@ -8868,6 +8899,12 @@ dependencies = [ "libc", ] +[[package]] +name = "waker-fn" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9571542c2ce85ce642e6b58b3364da2fb53526360dfb7c211add4f5c23105ff7" + [[package]] name = "want" version = "0.2.0" @@ -9115,6 +9152,15 @@ dependencies = [ "webpki", ] +[[package]] +name = "wepoll-sys-stjepang" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fd319e971980166b53e17b1026812ad66c6b54063be879eb182342b55284694" +dependencies = [ + "cc", +] + [[package]] name = "westend-runtime" version = "0.8.14" -- GitLab From 9ba989ddafc19c0949fa89e964fdf88640386d89 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Wed, 8 Jul 2020 17:42:29 +0200 Subject: [PATCH 044/192] Use `SpawnNamed` to give tasks names (#1379) --- availability-store/src/lib.rs | 5 +- availability-store/src/worker.rs | 11 +- collator/src/lib.rs | 7 +- network/src/legacy/gossip/mod.rs | 9 +- network/src/protocol/mod.rs | 176 +++++++++++++---------- network/src/protocol/tests.rs | 21 ++- validation/src/validation_service/mod.rs | 31 ++-- 7 files changed, 141 insertions(+), 119 deletions(-) diff --git a/availability-store/src/lib.rs b/availability-store/src/lib.rs index 281441fb5e..7abc444758 100644 --- a/availability-store/src/lib.rs +++ b/availability-store/src/lib.rs @@ -23,7 +23,7 @@ #![warn(missing_docs)] use futures::prelude::*; -use futures::{channel::{mpsc, oneshot}, task::Spawn}; +use futures::channel::{mpsc, oneshot}; use keystore::KeyStorePtr; use polkadot_primitives::{ Hash, Block, @@ -39,6 +39,7 @@ use client::{ }; use sp_api::{ApiExt, ProvideRuntimeApi}; use codec::{Encode, Decode}; +use sp_core::traits::SpawnNamed; use log::warn; @@ -174,7 +175,7 @@ impl Store { &self, wrapped_block_import: I, client: Arc

, - spawner: impl Spawn, + spawner: impl SpawnNamed, keystore: KeyStorePtr, ) -> ClientResult> where diff --git a/availability-store/src/worker.rs b/availability-store/src/worker.rs index 01872c177c..8a3898579f 100644 --- a/availability-store/src/worker.rs +++ b/availability-store/src/worker.rs @@ -20,7 +20,7 @@ use std::sync::Arc; use std::thread; use log::{error, info, trace, warn}; -use sp_blockchain::{Result as ClientResult}; +use sp_blockchain::Result as ClientResult; use sp_runtime::traits::{Header as HeaderT, Block as BlockT, HashFor, BlakeTwo256}; use sp_api::{ApiExt, ProvideRuntimeApi}; use client::{ @@ -32,12 +32,13 @@ use consensus_common::{ ImportResult, import_queue::CacheKeyId, }; +use sp_core::traits::SpawnNamed; use polkadot_primitives::{Block, BlockId, Hash}; use polkadot_primitives::parachain::{ ParachainHost, ValidatorId, AbridgedCandidateReceipt, AvailableData, ValidatorPair, ErasureChunk, }; -use futures::{prelude::*, future::select, channel::{mpsc, oneshot}, task::{Spawn, SpawnExt}}; +use futures::{prelude::*, future::select, channel::{mpsc, oneshot}}; use futures::future::AbortHandle; use keystore::KeyStorePtr; @@ -641,7 +642,7 @@ impl AvailabilityBlockImport { pub(crate) fn new( client: Arc

, block_import: I, - spawner: impl Spawn, + spawner: impl SpawnNamed, keystore: KeyStorePtr, to_worker: mpsc::UnboundedSender, ) -> Self @@ -662,9 +663,7 @@ impl AvailabilityBlockImport { to_worker.clone(), )); - if let Err(_) = spawner.spawn(prune_available.map(drop)) { - error!(target: LOG_TARGET, "Failed to spawn availability pruning task"); - } + spawner.spawn("polkadot-prune-availibility", prune_available.map(drop).boxed()); AvailabilityBlockImport { client, diff --git a/collator/src/lib.rs b/collator/src/lib.rs index 7e3e0bd342..0215b33ee6 100644 --- a/collator/src/lib.rs +++ b/collator/src/lib.rs @@ -50,7 +50,7 @@ use std::sync::Arc; use std::time::Duration; use std::pin::Pin; -use futures::{future, Future, Stream, FutureExt, StreamExt, task::Spawn}; +use futures::{future, Future, Stream, FutureExt, StreamExt}; use log::warn; use sc_client_api::{StateBackend, BlockchainEvents}; use sp_blockchain::HeaderBackend; @@ -82,6 +82,7 @@ use polkadot_service_new::{ Error as ServiceError, FullNodeHandles, PolkadotClient, }; use sc_service::SpawnTaskHandle; +use sp_core::traits::SpawnNamed; const COLLATION_TIMEOUT: Duration = Duration::from_secs(30); @@ -133,7 +134,7 @@ pub trait BuildParachainContext { Client::Api: RuntimeApiCollection, >::StateBackend: StateBackend>, Extrinsic: codec::Codec + Send + Sync + 'static, - SP: Spawn + Clone + Send + Sync + 'static; + SP: SpawnNamed + Clone + Send + Sync + 'static; } /// Parachain context needed for collation. @@ -233,7 +234,7 @@ fn build_collator_service( P::ParachainContext: Send + 'static, ::ProduceCandidate: Send, Extrinsic: service::Codec + Send + Sync + 'static, - SP: Spawn + Clone + Send + Sync + 'static, + SP: SpawnNamed + Clone + Send + Sync + 'static, { Err("Collator is not functional with the new service yet".into()) } diff --git a/network/src/legacy/gossip/mod.rs b/network/src/legacy/gossip/mod.rs index 7e97eb688b..7dea996566 100644 --- a/network/src/legacy/gossip/mod.rs +++ b/network/src/legacy/gossip/mod.rs @@ -295,7 +295,7 @@ pub(crate) fn pov_block_topic(parent_hash: Hash) -> Hash { pub fn register_validator( service: Arc>, chain: C, - executor: &impl futures::task::Spawn, + executor: &impl sp_core::traits::SpawnNamed, ) -> RegisteredMessageValidator { let s = service.clone(); @@ -331,12 +331,7 @@ pub fn register_validator( let fut = futures::future::poll_fn(move |cx| { gossip_engine.lock().poll_unpin(cx) }); - let spawn_res = executor.spawn_obj(futures::task::FutureObj::from(Box::new(fut))); - - // Note: we consider the chances of an error to spawn a background task almost null. - if spawn_res.is_err() { - log::error!(target: "polkadot-gossip", "Failed to spawn background task"); - } + executor.spawn("polkadot-legacy-gossip-engine", fut.boxed()); } RegisteredMessageValidator { diff --git a/network/src/protocol/mod.rs b/network/src/protocol/mod.rs index 0ed2d9ac43..c36dbf1945 100644 --- a/network/src/protocol/mod.rs +++ b/network/src/protocol/mod.rs @@ -26,7 +26,7 @@ use codec::{Decode, Encode}; use futures::channel::{mpsc, oneshot}; use futures::future::Either; use futures::prelude::*; -use futures::task::{Spawn, SpawnExt, Context, Poll}; +use futures::task::{Context, Poll}; use futures::stream::{FuturesUnordered, StreamFuture}; use log::{debug, trace}; @@ -44,6 +44,7 @@ use polkadot_validation::{ use sc_network::{ObservedRole, Event, PeerId}; use sp_api::ProvideRuntimeApi; use sp_runtime::ConsensusEngineId; +use sp_core::traits::SpawnNamed; use std::collections::{hash_map::{Entry, HashMap}, HashSet}; use std::pin::Pin; @@ -126,7 +127,9 @@ enum ServiceToWorkerMsg { /// Messages from a background task to the main worker task. enum BackgroundToWorkerMsg { // Spawn a given future. - Spawn(future::BoxFuture<'static, ()>), + // + // The name is used for the future task. + Spawn(&'static str, future::BoxFuture<'static, ()>), } /// Operations that a handle to an underlying network service should provide. @@ -221,7 +224,7 @@ pub fn start( C: ChainContext + 'static, Api: ProvideRuntimeApi + Send + Sync + 'static, Api::Api: ParachainHost, - SP: Spawn + Clone + Send + 'static, + SP: SpawnNamed + Clone + Send + 'static, { const SERVICE_TO_WORKER_BUF: usize = 256; @@ -234,67 +237,73 @@ pub fn start( chain_context, &executor, ); - executor.spawn(worker_loop( - config, - service.clone(), - gossip_validator, - api, - worker_receiver, - executor.clone(), - ))?; + executor.spawn( + "polkadot-network-worker", + worker_loop( + config, + service.clone(), + gossip_validator, + api, + worker_receiver, + executor.clone(), + ).boxed(), + ); let polkadot_service = Service { sender: worker_sender.clone(), network_service: service.clone(), }; - executor.spawn(async move { - while let Some(event) = event_stream.next().await { - let res = match event { - Event::Dht(_) => continue, - Event::NotificationStreamOpened { - remote, - engine_id, - role, - } => { - if engine_id != POLKADOT_ENGINE_ID { continue } - - worker_sender.send(ServiceToWorkerMsg::PeerConnected(remote, role)).await - }, - Event::NotificationStreamClosed { - remote, - engine_id, - } => { - if engine_id != POLKADOT_ENGINE_ID { continue } - - worker_sender.send(ServiceToWorkerMsg::PeerDisconnected(remote)).await - }, - Event::NotificationsReceived { - remote, - messages, - } => { - let our_notifications = messages.into_iter() - .filter_map(|(engine, message)| if engine == POLKADOT_ENGINE_ID { - Some(message) - } else { - None - }) - .collect(); + executor.spawn( + "polkadot-network-notifications", + async move { + while let Some(event) = event_stream.next().await { + let res = match event { + Event::Dht(_) => continue, + Event::NotificationStreamOpened { + remote, + engine_id, + role, + } => { + if engine_id != POLKADOT_ENGINE_ID { continue } + + worker_sender.send(ServiceToWorkerMsg::PeerConnected(remote, role)).await + }, + Event::NotificationStreamClosed { + remote, + engine_id, + } => { + if engine_id != POLKADOT_ENGINE_ID { continue } - worker_sender.send( - ServiceToWorkerMsg::PeerMessage(remote, our_notifications) - ).await - } - }; + worker_sender.send(ServiceToWorkerMsg::PeerDisconnected(remote)).await + }, + Event::NotificationsReceived { + remote, + messages, + } => { + let our_notifications = messages.into_iter() + .filter_map(|(engine, message)| if engine == POLKADOT_ENGINE_ID { + Some(message) + } else { + None + }) + .collect(); + + worker_sender.send( + ServiceToWorkerMsg::PeerMessage(remote, our_notifications) + ).await + } + }; - if let Err(e) = res { - // full is impossible here, as we've `await`ed the value being sent. - if e.is_disconnected() { - break + if let Err(e) = res { + // full is impossible here, as we've `await`ed the value being sent. + if e.is_disconnected() { + break + } } } - } - })?; + }.boxed(), + ); Ok(polkadot_service) } @@ -845,7 +854,7 @@ struct Worker { impl Worker where Api: ProvideRuntimeApi + Send + Sync + 'static, Api::Api: ParachainHost, - Sp: Spawn + Clone, + Sp: SpawnNamed + Clone, Gossip: GossipOps, { // spawns a background task to spawn consensus networking. @@ -888,14 +897,17 @@ impl Worker where // glue the incoming messages, shared table, and validation // work together. - let _ = self.executor.spawn(statement_import_loop( - relay_parent, - table, - self.api.clone(), - self.gossip_handle.clone(), - self.background_to_main_sender.clone(), - exit, - )); + self.executor.spawn( + "polkadot-statement-import-loop", + statement_import_loop( + relay_parent, + table, + self.api.clone(), + self.gossip_handle.clone(), + self.background_to_main_sender.clone(), + exit, + ).boxed(), + ); } fn handle_service_message(&mut self, message: ServiceToWorkerMsg) { @@ -932,12 +944,15 @@ impl Worker where // before placing in the pool, so we can safely check by candidate hash. let get_msg = fetch_pov_from_gossip(&candidate, &self.gossip_handle); - let _ = self.executor.spawn(async move { - let res = future::select(get_msg, AwaitCanceled { inner: &mut sender }).await; - if let Either::Left((pov_block, _)) = res { - let _ = sender.send(pov_block); - } - }); + self.executor.spawn( + "polkadot-fetch-pov-block", + async move { + let res = future::select(get_msg, AwaitCanceled { inner: &mut sender }).await; + if let Either::Left((pov_block, _)) = res { + let _ = sender.send(pov_block); + } + }.boxed(), + ); } ServiceToWorkerMsg::FetchErasureChunk(candidate_hash, validator_index, mut sender) => { let topic = crate::erasure_coding_topic(&candidate_hash); @@ -963,12 +978,15 @@ impl Worker where "gossip message streams do not conclude early; qed" )); - let _ = self.executor.spawn(async move { - let res = future::select(get_msg, AwaitCanceled { inner: &mut sender }).await; - if let Either::Left((chunk, _)) = res { - let _ = sender.send(chunk); - } - }); + self.executor.spawn( + "polkadot-fetch-erasure-chunk", + async move { + let res = future::select(get_msg, AwaitCanceled { inner: &mut sender }).await; + if let Either::Left((chunk, _)) = res { + let _ = sender.send(chunk); + } + }.boxed(), + ); } ServiceToWorkerMsg::DistributeErasureChunk(candidate_hash, erasure_chunk) => { let topic = crate::erasure_coding_topic(&candidate_hash); @@ -1017,8 +1035,8 @@ impl Worker where fn handle_background_message(&mut self, message: BackgroundToWorkerMsg) { match message { - BackgroundToWorkerMsg::Spawn(task) => { - let _ = self.executor.spawn(task); + BackgroundToWorkerMsg::Spawn(name, task) => { + let _ = self.executor.spawn(name, task); } } } @@ -1068,7 +1086,7 @@ async fn worker_loop( ) where Api: ProvideRuntimeApi + Send + Sync + 'static, Api::Api: ParachainHost, - Sp: Spawn + Clone, + Sp: SpawnNamed + Clone, { const BACKGROUND_TO_MAIN_BUF: usize = 16; @@ -1250,7 +1268,7 @@ async fn statement_import_loop( let work = future::select(work.boxed(), exit.clone()).map(drop); if let Err(_) = to_worker.send( - BackgroundToWorkerMsg::Spawn(work.boxed()) + BackgroundToWorkerMsg::Spawn("polkadot-statement-import-loop-sub-task", work.boxed()) ).await { // can fail only if remote has hung up - worker is dead, // we should die too. this is defensive, since the exit future diff --git a/network/src/protocol/tests.rs b/network/src/protocol/tests.rs index 0e78479fb2..049af3f5ac 100644 --- a/network/src/protocol/tests.rs +++ b/network/src/protocol/tests.rs @@ -30,11 +30,24 @@ use av_store::{Store as AvailabilityStore, ErasureNetworking}; use sc_network_gossip::TopicNotification; use sp_api::{ApiRef, ProvideRuntimeApi}; use sp_runtime::traits::Block as BlockT; -use sp_core::crypto::Pair; +use sp_core::{crypto::Pair, traits::SpawnNamed}; use sp_keyring::Sr25519Keyring; -use futures::executor::LocalPool; -use futures::task::LocalSpawnExt; +use futures::executor::{LocalPool, LocalSpawner}; +use futures::task::{LocalSpawnExt, SpawnExt}; + +#[derive(Clone)] +struct Executor(LocalSpawner); + +impl SpawnNamed for Executor { + fn spawn(&self, _: &'static str, future: futures::future::BoxFuture<'static, ()>) { + self.0.spawn_local(future).unwrap(); + } + + fn spawn_blocking(&self, name: &'static str, future: futures::future::BoxFuture<'static, ()>) { + self.spawn(name, future); + } +} #[derive(Default)] pub struct MockNetworkOps { @@ -243,7 +256,7 @@ fn test_setup(config: Config) -> ( mock_gossip.clone(), api.clone(), worker_rx, - pool.spawner(), + Executor(pool.spawner()), ); let service = Service { diff --git a/validation/src/validation_service/mod.rs b/validation/src/validation_service/mod.rs index a67088ff50..d84b1be078 100644 --- a/validation/src/validation_service/mod.rs +++ b/validation/src/validation_service/mod.rs @@ -26,13 +26,12 @@ //! //! These attestation sessions are kept live until they are periodically garbage-collected. -use std::{time::{Duration, Instant}, sync::Arc, pin::Pin}; -use std::collections::HashMap; +use std::{time::{Duration, Instant}, sync::Arc, pin::Pin, collections::HashMap}; use crate::pipeline::FullOutput; use sc_client_api::{BlockchainEvents, BlockBackend}; use consensus::SelectChain; -use futures::{prelude::*, task::{Spawn, SpawnExt}}; +use futures::prelude::*; use polkadot_primitives::{Block, Hash, BlockId}; use polkadot_primitives::parachain::{ Chain, ParachainHost, Id as ParaId, ValidatorIndex, ValidatorId, ValidatorPair, @@ -42,17 +41,15 @@ use keystore::KeyStorePtr; use sp_api::{ProvideRuntimeApi, ApiExt}; use runtime_primitives::traits::HashFor; use availability_store::Store as AvailabilityStore; +use primitives::traits::SpawnNamed; use ansi_term::Colour; -use log::{warn, error, info, debug, trace}; +use log::{warn, info, debug, trace}; use super::{Network, Collators, SharedTable, TableRouter}; use crate::Error; use crate::pipeline::ValidationPool; -/// A handle to spawn background tasks onto. -pub type TaskExecutor = Arc; - // Remote processes may request for a validation instance to be cloned or instantiated. // They send a oneshot channel. type ValidationInstanceRequest = ( @@ -148,7 +145,7 @@ impl ServiceBuilder where N::BuildTableRouter: Send + Unpin + 'static, ::SendLocalCollation: Send, SC: SelectChain + 'static, - SP: Spawn + Send + 'static, + SP: SpawnNamed + Send + 'static, // Rust bug: https://github.com/rust-lang/rust/issues/24159 sp_api::StateBackendFor: sp_api::StateBackend>, { @@ -337,7 +334,7 @@ impl ParachainValidationInstances where N::TableRouter: Send + 'static + Sync, ::SendLocalCollation: Send, N::BuildTableRouter: Unpin + Send + 'static, - SP: Spawn + Send + 'static, + SP: SpawnNamed + Send + 'static, CF: CollationFetch + Clone + Send + Sync + 'static, // Rust bug: https://github.com/rust-lang/rust/issues/24159 sp_api::StateBackendFor: sp_api::StateBackend>, @@ -453,19 +450,16 @@ impl ParachainValidationInstances where let collation_fetch = self.collation_fetch.clone(); let router = router.clone(); - let res = self.spawner.spawn( + self.spawner.spawn( + "polkadot-parachain-validation-work", launch_work( move || collation_fetch.collation_fetch(id, parent_hash, client, max_block_data_size, n_validators), availability_store, router, n_validators, index, - ), + ).boxed(), ); - - if let Err(e) = res { - error!(target: "validation", "Failed to launch work: {:?}", e); - } } let tracker = ValidationInstanceHandle { @@ -549,7 +543,7 @@ async fn launch_work( #[cfg(test)] mod tests { use super::*; - use futures::{executor::{ThreadPool, self}, future::ready, channel::mpsc}; + use futures::{executor, future::ready, channel::mpsc}; use availability_store::ErasureNetworking; use polkadot_primitives::parachain::{ PoVBlock, AbridgedCandidateReceipt, ErasureChunk, ValidatorIndex, @@ -559,6 +553,7 @@ mod tests { use runtime_primitives::traits::Block as BlockT; use std::pin::Pin; use sp_keyring::sr25519::Keyring; + use primitives::testing::SpawnBlockingExecutor; /// Events fired while running mock implementations to follow execution. enum Events { @@ -719,7 +714,7 @@ mod tests { #[test] fn launch_work_is_executed_properly() { - let executor = ThreadPool::new().unwrap(); + let executor = SpawnBlockingExecutor::new(); let keystore = keystore::Store::new_in_memory(); // Make sure `Bob` key is in the keystore, so this mocked node will be a parachain validator. @@ -759,7 +754,7 @@ mod tests { #[test] fn router_is_built_on_relay_chain_validator() { - let executor = ThreadPool::new().unwrap(); + let executor = SpawnBlockingExecutor::new(); let keystore = keystore::Store::new_in_memory(); // Make sure `Alice` key is in the keystore, so this mocked node will be a relay-chain validator. -- GitLab From 9cc8c576d08431b5c836f9dfffa629a7f90b4663 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Wed, 8 Jul 2020 18:15:59 +0200 Subject: [PATCH 045/192] Companion for #6599 (#1371) * Companion for #6599 https://github.com/paritytech/substrate/pull/6599 * Update Substrate ref --- Cargo.lock | 276 ++++++++++++++++++++-------------------- node/service/src/lib.rs | 5 +- service/src/lib.rs | 5 +- 3 files changed, 146 insertions(+), 140 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 7f488fd2b0..e4b7b08dd1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1285,7 +1285,7 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "fork-tree" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" +source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" dependencies = [ "parity-scale-codec", ] @@ -1293,7 +1293,7 @@ dependencies = [ [[package]] name = "frame-benchmarking" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" +source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" dependencies = [ "frame-support", "frame-system", @@ -1310,7 +1310,7 @@ dependencies = [ [[package]] name = "frame-benchmarking-cli" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" +source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" dependencies = [ "Inflector", "frame-benchmarking", @@ -1329,7 +1329,7 @@ dependencies = [ [[package]] name = "frame-executive" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" +source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" dependencies = [ "frame-support", "frame-system", @@ -1344,7 +1344,7 @@ dependencies = [ [[package]] name = "frame-metadata" version = "11.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" +source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" dependencies = [ "parity-scale-codec", "serde", @@ -1355,7 +1355,7 @@ dependencies = [ [[package]] name = "frame-support" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" +source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" dependencies = [ "bitmask", "frame-metadata", @@ -1380,7 +1380,7 @@ dependencies = [ [[package]] name = "frame-support-procedural" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" +source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" dependencies = [ "frame-support-procedural-tools", "proc-macro2 1.0.18", @@ -1391,7 +1391,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" +source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" dependencies = [ "frame-support-procedural-tools-derive", "proc-macro-crate", @@ -1403,7 +1403,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools-derive" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" +source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" dependencies = [ "proc-macro2 1.0.18", "quote 1.0.7", @@ -1413,7 +1413,7 @@ dependencies = [ [[package]] name = "frame-system" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" +source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" dependencies = [ "frame-support", "impl-trait-for-tuples", @@ -1429,7 +1429,7 @@ dependencies = [ [[package]] name = "frame-system-benchmarking" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" +source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" dependencies = [ "frame-benchmarking", "frame-support", @@ -1443,7 +1443,7 @@ dependencies = [ [[package]] name = "frame-system-rpc-runtime-api" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" +source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" dependencies = [ "parity-scale-codec", "sp-api", @@ -3409,7 +3409,7 @@ dependencies = [ [[package]] name = "pallet-authority-discovery" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" +source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" dependencies = [ "frame-support", "frame-system", @@ -3425,7 +3425,7 @@ dependencies = [ [[package]] name = "pallet-authorship" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" +source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" dependencies = [ "frame-support", "frame-system", @@ -3440,7 +3440,7 @@ dependencies = [ [[package]] name = "pallet-babe" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" +source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" dependencies = [ "frame-benchmarking", "frame-support", @@ -3465,7 +3465,7 @@ dependencies = [ [[package]] name = "pallet-balances" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" +source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" dependencies = [ "frame-benchmarking", "frame-support", @@ -3479,7 +3479,7 @@ dependencies = [ [[package]] name = "pallet-collective" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" +source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" dependencies = [ "frame-benchmarking", "frame-support", @@ -3495,7 +3495,7 @@ dependencies = [ [[package]] name = "pallet-democracy" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" +source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" dependencies = [ "frame-benchmarking", "frame-support", @@ -3510,7 +3510,7 @@ dependencies = [ [[package]] name = "pallet-elections-phragmen" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" +source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" dependencies = [ "frame-benchmarking", "frame-support", @@ -3525,7 +3525,7 @@ dependencies = [ [[package]] name = "pallet-finality-tracker" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" +source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" dependencies = [ "frame-support", "frame-system", @@ -3541,7 +3541,7 @@ dependencies = [ [[package]] name = "pallet-grandpa" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" +source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" dependencies = [ "frame-support", "frame-system", @@ -3561,7 +3561,7 @@ dependencies = [ [[package]] name = "pallet-identity" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" +source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" dependencies = [ "enumflags2", "frame-benchmarking", @@ -3577,7 +3577,7 @@ dependencies = [ [[package]] name = "pallet-im-online" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" +source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" dependencies = [ "frame-benchmarking", "frame-support", @@ -3597,7 +3597,7 @@ dependencies = [ [[package]] name = "pallet-indices" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" +source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" dependencies = [ "frame-support", "frame-system", @@ -3613,7 +3613,7 @@ dependencies = [ [[package]] name = "pallet-membership" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" +source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" dependencies = [ "frame-support", "frame-system", @@ -3627,7 +3627,7 @@ dependencies = [ [[package]] name = "pallet-multisig" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" +source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" dependencies = [ "frame-support", "frame-system", @@ -3642,7 +3642,7 @@ dependencies = [ [[package]] name = "pallet-nicks" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" +source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" dependencies = [ "frame-support", "frame-system", @@ -3656,7 +3656,7 @@ dependencies = [ [[package]] name = "pallet-offences" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" +source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" dependencies = [ "frame-support", "frame-system", @@ -3671,7 +3671,7 @@ dependencies = [ [[package]] name = "pallet-offences-benchmarking" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" +source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" dependencies = [ "frame-benchmarking", "frame-support", @@ -3692,7 +3692,7 @@ dependencies = [ [[package]] name = "pallet-proxy" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" +source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" dependencies = [ "frame-support", "frame-system", @@ -3707,7 +3707,7 @@ dependencies = [ [[package]] name = "pallet-randomness-collective-flip" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" +source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" dependencies = [ "frame-support", "frame-system", @@ -3720,7 +3720,7 @@ dependencies = [ [[package]] name = "pallet-recovery" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" +source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" dependencies = [ "enumflags2", "frame-support", @@ -3735,7 +3735,7 @@ dependencies = [ [[package]] name = "pallet-scheduler" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" +source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" dependencies = [ "frame-benchmarking", "frame-support", @@ -3750,7 +3750,7 @@ dependencies = [ [[package]] name = "pallet-session" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" +source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" dependencies = [ "frame-support", "frame-system", @@ -3770,7 +3770,7 @@ dependencies = [ [[package]] name = "pallet-session-benchmarking" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" +source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" dependencies = [ "frame-benchmarking", "frame-support", @@ -3786,7 +3786,7 @@ dependencies = [ [[package]] name = "pallet-society" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" +source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" dependencies = [ "frame-support", "frame-system", @@ -3800,7 +3800,7 @@ dependencies = [ [[package]] name = "pallet-staking" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" +source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" dependencies = [ "frame-benchmarking", "frame-support", @@ -3822,7 +3822,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-curve" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" +source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -3833,7 +3833,7 @@ dependencies = [ [[package]] name = "pallet-sudo" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" +source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" dependencies = [ "frame-support", "frame-system", @@ -3847,7 +3847,7 @@ dependencies = [ [[package]] name = "pallet-timestamp" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" +source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" dependencies = [ "frame-benchmarking", "frame-support", @@ -3865,7 +3865,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" +source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" dependencies = [ "frame-support", "frame-system", @@ -3880,7 +3880,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" +source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" dependencies = [ "jsonrpc-core", "jsonrpc-core-client", @@ -3898,7 +3898,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc-runtime-api" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" +source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" dependencies = [ "frame-support", "parity-scale-codec", @@ -3911,7 +3911,7 @@ dependencies = [ [[package]] name = "pallet-treasury" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" +source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" dependencies = [ "frame-benchmarking", "frame-support", @@ -3926,7 +3926,7 @@ dependencies = [ [[package]] name = "pallet-utility" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" +source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" dependencies = [ "frame-benchmarking", "frame-support", @@ -3942,7 +3942,7 @@ dependencies = [ [[package]] name = "pallet-vesting" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" +source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" dependencies = [ "enumflags2", "frame-benchmarking", @@ -5801,7 +5801,7 @@ dependencies = [ [[package]] name = "sc-authority-discovery" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" +source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" dependencies = [ "bytes 0.5.4", "derive_more 0.99.8", @@ -5828,7 +5828,7 @@ dependencies = [ [[package]] name = "sc-basic-authorship" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" +source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -5852,7 +5852,7 @@ dependencies = [ [[package]] name = "sc-block-builder" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" +source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" dependencies = [ "parity-scale-codec", "sc-client-api", @@ -5869,7 +5869,7 @@ dependencies = [ [[package]] name = "sc-chain-spec" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" +source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" dependencies = [ "impl-trait-for-tuples", "sc-chain-spec-derive", @@ -5885,7 +5885,7 @@ dependencies = [ [[package]] name = "sc-chain-spec-derive" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" +source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -5896,7 +5896,7 @@ dependencies = [ [[package]] name = "sc-cli" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" +source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" dependencies = [ "ansi_term 0.12.1", "atty", @@ -5937,7 +5937,7 @@ dependencies = [ [[package]] name = "sc-client-api" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" +source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" dependencies = [ "derive_more 0.99.8", "fnv", @@ -5973,7 +5973,7 @@ dependencies = [ [[package]] name = "sc-client-db" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" +source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" dependencies = [ "blake2-rfc", "hash-db", @@ -6002,7 +6002,7 @@ dependencies = [ [[package]] name = "sc-consensus" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" +source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" dependencies = [ "sc-client-api", "sp-blockchain", @@ -6013,7 +6013,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" +source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" dependencies = [ "derive_more 0.99.8", "fork-tree", @@ -6055,7 +6055,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe-rpc" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" +source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" dependencies = [ "derive_more 0.99.8", "futures 0.3.5", @@ -6079,7 +6079,7 @@ dependencies = [ [[package]] name = "sc-consensus-epochs" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" +source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" dependencies = [ "fork-tree", "parity-scale-codec", @@ -6092,7 +6092,7 @@ dependencies = [ [[package]] name = "sc-consensus-slots" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" +source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6115,7 +6115,7 @@ dependencies = [ [[package]] name = "sc-consensus-uncles" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" +source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" dependencies = [ "log 0.4.8", "sc-client-api", @@ -6129,7 +6129,7 @@ dependencies = [ [[package]] name = "sc-executor" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" +source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" dependencies = [ "derive_more 0.99.8", "lazy_static", @@ -6157,7 +6157,7 @@ dependencies = [ [[package]] name = "sc-executor-common" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" +source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" dependencies = [ "derive_more 0.99.8", "log 0.4.8", @@ -6174,7 +6174,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmi" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" +source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" dependencies = [ "log 0.4.8", "parity-scale-codec", @@ -6189,7 +6189,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmtime" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" +source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" dependencies = [ "cranelift-codegen", "cranelift-wasm", @@ -6210,7 +6210,7 @@ dependencies = [ [[package]] name = "sc-finality-grandpa" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" +source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" dependencies = [ "assert_matches", "derive_more 0.99.8", @@ -6248,7 +6248,7 @@ dependencies = [ [[package]] name = "sc-finality-grandpa-rpc" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" +source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" dependencies = [ "derive_more 0.99.8", "finality-grandpa", @@ -6265,7 +6265,7 @@ dependencies = [ [[package]] name = "sc-informant" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" +source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" dependencies = [ "ansi_term 0.12.1", "futures 0.3.5", @@ -6283,7 +6283,7 @@ dependencies = [ [[package]] name = "sc-keystore" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" +source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" dependencies = [ "derive_more 0.99.8", "hex", @@ -6299,7 +6299,7 @@ dependencies = [ [[package]] name = "sc-light" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" +source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" dependencies = [ "hash-db", "lazy_static", @@ -6318,7 +6318,7 @@ dependencies = [ [[package]] name = "sc-network" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" +source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" dependencies = [ "bitflags", "bs58", @@ -6370,7 +6370,7 @@ dependencies = [ [[package]] name = "sc-network-gossip" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" +source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6385,7 +6385,7 @@ dependencies = [ [[package]] name = "sc-network-test" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" +source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" dependencies = [ "env_logger", "futures 0.3.5", @@ -6412,7 +6412,7 @@ dependencies = [ [[package]] name = "sc-offchain" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" +source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" dependencies = [ "bytes 0.5.4", "fnv", @@ -6439,7 +6439,7 @@ dependencies = [ [[package]] name = "sc-peerset" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" +source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" dependencies = [ "futures 0.3.5", "libp2p", @@ -6452,7 +6452,7 @@ dependencies = [ [[package]] name = "sc-proposer-metrics" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" +source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" dependencies = [ "log 0.4.8", "substrate-prometheus-endpoint", @@ -6461,7 +6461,7 @@ dependencies = [ [[package]] name = "sc-rpc" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" +source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" dependencies = [ "futures 0.3.5", "hash-db", @@ -6493,7 +6493,7 @@ dependencies = [ [[package]] name = "sc-rpc-api" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" +source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" dependencies = [ "derive_more 0.99.8", "futures 0.3.5", @@ -6517,7 +6517,7 @@ dependencies = [ [[package]] name = "sc-rpc-server" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" +source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" dependencies = [ "jsonrpc-core", "jsonrpc-http-server", @@ -6533,7 +6533,7 @@ dependencies = [ [[package]] name = "sc-service" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" +source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" dependencies = [ "derive_more 0.99.8", "directories", @@ -6596,7 +6596,7 @@ dependencies = [ [[package]] name = "sc-state-db" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" +source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" dependencies = [ "log 0.4.8", "parity-scale-codec", @@ -6610,7 +6610,7 @@ dependencies = [ [[package]] name = "sc-telemetry" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" +source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6631,7 +6631,7 @@ dependencies = [ [[package]] name = "sc-tracing" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" +source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" dependencies = [ "erased-serde", "log 0.4.8", @@ -6648,7 +6648,7 @@ dependencies = [ [[package]] name = "sc-transaction-graph" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" +source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" dependencies = [ "derive_more 0.99.8", "futures 0.3.5", @@ -6668,7 +6668,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" +source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" dependencies = [ "derive_more 0.99.8", "futures 0.3.5", @@ -7075,7 +7075,7 @@ dependencies = [ [[package]] name = "sp-allocator" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" +source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" dependencies = [ "derive_more 0.99.8", "log 0.4.8", @@ -7087,7 +7087,7 @@ dependencies = [ [[package]] name = "sp-api" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" +source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" dependencies = [ "hash-db", "parity-scale-codec", @@ -7102,7 +7102,7 @@ dependencies = [ [[package]] name = "sp-api-proc-macro" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" +source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" dependencies = [ "blake2-rfc", "proc-macro-crate", @@ -7114,7 +7114,7 @@ dependencies = [ [[package]] name = "sp-application-crypto" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" +source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" dependencies = [ "parity-scale-codec", "serde", @@ -7126,7 +7126,7 @@ dependencies = [ [[package]] name = "sp-arithmetic" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" +source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" dependencies = [ "integer-sqrt", "num-traits 0.2.12", @@ -7139,7 +7139,7 @@ dependencies = [ [[package]] name = "sp-authority-discovery" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" +source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" dependencies = [ "parity-scale-codec", "sp-api", @@ -7151,7 +7151,7 @@ dependencies = [ [[package]] name = "sp-authorship" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" +source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" dependencies = [ "parity-scale-codec", "sp-inherents", @@ -7162,7 +7162,7 @@ dependencies = [ [[package]] name = "sp-block-builder" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" +source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" dependencies = [ "parity-scale-codec", "sp-api", @@ -7174,7 +7174,7 @@ dependencies = [ [[package]] name = "sp-blockchain" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" +source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" dependencies = [ "derive_more 0.99.8", "log 0.4.8", @@ -7190,7 +7190,7 @@ dependencies = [ [[package]] name = "sp-chain-spec" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" +source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" dependencies = [ "serde", "serde_json", @@ -7199,7 +7199,7 @@ dependencies = [ [[package]] name = "sp-consensus" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" +source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" dependencies = [ "derive_more 0.99.8", "futures 0.3.5", @@ -7223,7 +7223,7 @@ dependencies = [ [[package]] name = "sp-consensus-aura" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" +source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" dependencies = [ "parity-scale-codec", "sp-api", @@ -7237,7 +7237,7 @@ dependencies = [ [[package]] name = "sp-consensus-babe" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" +source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" dependencies = [ "merlin", "parity-scale-codec", @@ -7256,7 +7256,7 @@ dependencies = [ [[package]] name = "sp-consensus-slots" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" +source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" dependencies = [ "parity-scale-codec", "sp-runtime", @@ -7265,7 +7265,7 @@ dependencies = [ [[package]] name = "sp-consensus-vrf" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" +source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" dependencies = [ "parity-scale-codec", "schnorrkel", @@ -7277,7 +7277,7 @@ dependencies = [ [[package]] name = "sp-core" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" +source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" dependencies = [ "base58", "blake2-rfc", @@ -7320,7 +7320,7 @@ dependencies = [ [[package]] name = "sp-database" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" +source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" dependencies = [ "kvdb", "parking_lot 0.10.2", @@ -7329,7 +7329,7 @@ dependencies = [ [[package]] name = "sp-debug-derive" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" +source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" dependencies = [ "proc-macro2 1.0.18", "quote 1.0.7", @@ -7339,7 +7339,7 @@ dependencies = [ [[package]] name = "sp-externalities" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" +source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" dependencies = [ "environmental", "parity-scale-codec", @@ -7350,7 +7350,7 @@ dependencies = [ [[package]] name = "sp-finality-grandpa" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" +source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" dependencies = [ "finality-grandpa", "log 0.4.8", @@ -7366,7 +7366,7 @@ dependencies = [ [[package]] name = "sp-finality-tracker" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" +source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" dependencies = [ "parity-scale-codec", "sp-inherents", @@ -7376,7 +7376,7 @@ dependencies = [ [[package]] name = "sp-inherents" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" +source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" dependencies = [ "derive_more 0.99.8", "parity-scale-codec", @@ -7388,7 +7388,7 @@ dependencies = [ [[package]] name = "sp-io" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" +source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" dependencies = [ "futures 0.3.5", "hash-db", @@ -7409,7 +7409,7 @@ dependencies = [ [[package]] name = "sp-keyring" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" +source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" dependencies = [ "lazy_static", "sp-core", @@ -7420,7 +7420,7 @@ dependencies = [ [[package]] name = "sp-npos-elections" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" +source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" dependencies = [ "parity-scale-codec", "serde", @@ -7432,7 +7432,7 @@ dependencies = [ [[package]] name = "sp-npos-elections-compact" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" +source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -7443,7 +7443,7 @@ dependencies = [ [[package]] name = "sp-offchain" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" +source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" dependencies = [ "sp-api", "sp-core", @@ -7453,7 +7453,7 @@ dependencies = [ [[package]] name = "sp-panic-handler" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" +source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" dependencies = [ "backtrace", "log 0.4.8", @@ -7462,7 +7462,7 @@ dependencies = [ [[package]] name = "sp-rpc" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" +source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" dependencies = [ "serde", "sp-core", @@ -7471,7 +7471,7 @@ dependencies = [ [[package]] name = "sp-runtime" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" +source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" dependencies = [ "either", "hash256-std-hasher", @@ -7493,7 +7493,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" +source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" dependencies = [ "parity-scale-codec", "primitive-types", @@ -7508,7 +7508,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" +source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" dependencies = [ "Inflector", "proc-macro-crate", @@ -7520,7 +7520,7 @@ dependencies = [ [[package]] name = "sp-serializer" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" +source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" dependencies = [ "serde", "serde_json", @@ -7529,7 +7529,7 @@ dependencies = [ [[package]] name = "sp-session" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" +source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" dependencies = [ "parity-scale-codec", "sp-api", @@ -7542,7 +7542,7 @@ dependencies = [ [[package]] name = "sp-staking" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" +source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" dependencies = [ "parity-scale-codec", "sp-runtime", @@ -7552,7 +7552,7 @@ dependencies = [ [[package]] name = "sp-state-machine" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" +source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" dependencies = [ "hash-db", "itertools 0.9.0", @@ -7573,12 +7573,12 @@ dependencies = [ [[package]] name = "sp-std" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" +source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" [[package]] name = "sp-storage" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" +source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" dependencies = [ "impl-serde 0.2.3", "ref-cast", @@ -7590,7 +7590,7 @@ dependencies = [ [[package]] name = "sp-timestamp" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" +source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -7604,7 +7604,7 @@ dependencies = [ [[package]] name = "sp-tracing" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" +source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" dependencies = [ "log 0.4.8", "rental", @@ -7614,7 +7614,7 @@ dependencies = [ [[package]] name = "sp-transaction-pool" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" +source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" dependencies = [ "derive_more 0.99.8", "futures 0.3.5", @@ -7630,7 +7630,7 @@ dependencies = [ [[package]] name = "sp-trie" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" +source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" dependencies = [ "hash-db", "memory-db", @@ -7644,7 +7644,7 @@ dependencies = [ [[package]] name = "sp-utils" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" +source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" dependencies = [ "futures 0.3.5", "futures-core", @@ -7656,7 +7656,7 @@ dependencies = [ [[package]] name = "sp-version" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" +source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" dependencies = [ "impl-serde 0.2.3", "parity-scale-codec", @@ -7668,7 +7668,7 @@ dependencies = [ [[package]] name = "sp-wasm-interface" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" +source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -7808,7 +7808,7 @@ dependencies = [ [[package]] name = "substrate-browser-utils" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" +source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" dependencies = [ "chrono", "clear_on_drop", @@ -7835,7 +7835,7 @@ dependencies = [ [[package]] name = "substrate-build-script-utils" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" +source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" dependencies = [ "platforms", ] @@ -7843,7 +7843,7 @@ dependencies = [ [[package]] name = "substrate-frame-rpc-system" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" +source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" dependencies = [ "frame-system-rpc-runtime-api", "futures 0.3.5", @@ -7866,7 +7866,7 @@ dependencies = [ [[package]] name = "substrate-prometheus-endpoint" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" +source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" dependencies = [ "async-std", "derive_more 0.99.8", @@ -7880,7 +7880,7 @@ dependencies = [ [[package]] name = "substrate-test-client" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" +source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" dependencies = [ "futures 0.1.29", "futures 0.3.5", @@ -7904,7 +7904,7 @@ dependencies = [ [[package]] name = "substrate-test-runtime" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" +source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" dependencies = [ "cfg-if", "frame-executive", @@ -7937,14 +7937,14 @@ dependencies = [ "sp-transaction-pool", "sp-trie", "sp-version", - "substrate-wasm-builder-runner 1.0.6 (git+https://github.com/paritytech/substrate)", + "substrate-wasm-builder-runner 1.0.6 (git+https://github.com/paritytech/substrate?branch=master)", "trie-db", ] [[package]] name = "substrate-test-runtime-client" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" +source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" dependencies = [ "futures 0.3.5", "parity-scale-codec", @@ -7965,7 +7965,7 @@ dependencies = [ [[package]] name = "substrate-wasm-builder-runner" version = "1.0.6" -source = "git+https://github.com/paritytech/substrate#59ee76a0f342ae0dc1c6a6777d24d7811d9261ef" +source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" [[package]] name = "substrate-wasm-builder-runner" diff --git a/node/service/src/lib.rs b/node/service/src/lib.rs index 4ea8ddd50b..23a6dbfd41 100644 --- a/node/service/src/lib.rs +++ b/node/service/src/lib.rs @@ -168,7 +168,10 @@ macro_rules! new_full_start { Ok(sc_consensus::LongestChain::new(backend.clone())) })? .with_transaction_pool(|builder| { - let pool_api = sc_transaction_pool::FullChainApi::new(builder.client().clone()); + let pool_api = sc_transaction_pool::FullChainApi::new( + builder.client().clone(), + builder.prometheus_registry(), + ); let pool = sc_transaction_pool::BasicPool::new( builder.config().transaction_pool.clone(), std::sync::Arc::new(pool_api), diff --git a/service/src/lib.rs b/service/src/lib.rs index c7f2bd8b82..33d02f5315 100644 --- a/service/src/lib.rs +++ b/service/src/lib.rs @@ -163,7 +163,10 @@ macro_rules! new_full_start { Ok(sc_consensus::LongestChain::new(backend.clone())) })? .with_transaction_pool(|builder| { - let pool_api = sc_transaction_pool::FullChainApi::new(builder.client().clone()); + let pool_api = sc_transaction_pool::FullChainApi::new( + builder.client().clone(), + builder.prometheus_registry(), + ); let pool = sc_transaction_pool::BasicPool::new( builder.config().transaction_pool.clone(), std::sync::Arc::new(pool_api), -- GitLab From e3d83c1d05eb9b11ea4f68b05bb72376f3efe0af Mon Sep 17 00:00:00 2001 From: Shawn Tabrizi Date: Wed, 8 Jul 2020 18:22:22 +0200 Subject: [PATCH 046/192] Companion for #6575 (Add `WeightInfo`) (#1352) * Add `WeightInfo` * fix test * fix tests * fix more tests --- runtime/common/src/claims.rs | 3 +++ runtime/common/src/crowdfund.rs | 3 +++ runtime/common/src/lib.rs | 1 + runtime/common/src/parachains.rs | 6 ++++++ runtime/common/src/registrar.rs | 5 +++++ runtime/common/src/slots.rs | 2 ++ runtime/kusama/src/lib.rs | 19 +++++++++++++++++++ runtime/parachains/src/mock.rs | 1 + runtime/polkadot/src/lib.rs | 20 +++++++++++++++++++- runtime/test-runtime/src/lib.rs | 9 +++++++++ runtime/westend/src/lib.rs | 14 ++++++++++++++ 11 files changed, 82 insertions(+), 1 deletion(-) diff --git a/runtime/common/src/claims.rs b/runtime/common/src/claims.rs index 8d063534a8..fd8c1c1c88 100644 --- a/runtime/common/src/claims.rs +++ b/runtime/common/src/claims.rs @@ -690,6 +690,7 @@ mod tests { type AccountData = balances::AccountData; type OnNewAccount = (); type OnKilledAccount = Balances; + type SystemWeightInfo = (); } parameter_types! { @@ -704,6 +705,7 @@ mod tests { type DustRemoval = (); type ExistentialDeposit = ExistentialDeposit; type AccountStore = System; + type WeightInfo = (); } impl vesting::Trait for Test { @@ -711,6 +713,7 @@ mod tests { type Currency = Balances; type BlockNumberToBalance = Identity; type MinVestedTransfer = MinVestedTransfer; + type WeightInfo = (); } parameter_types!{ diff --git a/runtime/common/src/crowdfund.rs b/runtime/common/src/crowdfund.rs index be187e1c0e..ee2b740745 100644 --- a/runtime/common/src/crowdfund.rs +++ b/runtime/common/src/crowdfund.rs @@ -617,6 +617,7 @@ mod tests { type AccountData = balances::AccountData; type OnNewAccount = (); type OnKilledAccount = Balances; + type SystemWeightInfo = (); } parameter_types! { pub const ExistentialDeposit: u64 = 1; @@ -627,6 +628,7 @@ mod tests { type DustRemoval = (); type ExistentialDeposit = ExistentialDeposit; type AccountStore = System; + type WeightInfo = (); } parameter_types! { @@ -667,6 +669,7 @@ mod tests { type TipReportDepositBase = TipReportDepositBase; type TipReportDepositPerByte = TipReportDepositPerByte; type ModuleId = TreasuryModuleId; + type WeightInfo = (); } thread_local! { diff --git a/runtime/common/src/lib.rs b/runtime/common/src/lib.rs index 49a6dcced0..da6fc5fcc2 100644 --- a/runtime/common/src/lib.rs +++ b/runtime/common/src/lib.rs @@ -141,6 +141,7 @@ mod multiplier_tests { type AccountData = (); type OnNewAccount = (); type OnKilledAccount = (); + type SystemWeightInfo = (); } type System = system::Module; diff --git a/runtime/common/src/parachains.rs b/runtime/common/src/parachains.rs index 0fb600cfdb..25d93b6fde 100644 --- a/runtime/common/src/parachains.rs +++ b/runtime/common/src/parachains.rs @@ -1760,6 +1760,7 @@ mod tests { type AccountData = balances::AccountData; type OnNewAccount = (); type OnKilledAccount = (); + type SystemWeightInfo = (); } impl system::offchain::SendTransactionTypes for Test where @@ -1799,6 +1800,7 @@ mod tests { type SessionHandler = TestSessionHandler; type Keys = TestSessionKeys; type DisabledValidatorsThreshold = DisabledValidatorsThreshold; + type WeightInfo = (); } impl session::historical::Trait for Test { @@ -1813,6 +1815,7 @@ mod tests { type Moment = u64; type OnTimestampSet = (); type MinimumPeriod = MinimumPeriod; + type WeightInfo = (); } mod time { @@ -1860,6 +1863,7 @@ mod tests { type Event = (); type ExistentialDeposit = ExistentialDeposit; type AccountStore = System; + type WeightInfo = (); } pallet_staking_reward_curve::build! { @@ -1915,6 +1919,7 @@ mod tests { type UnsignedPriority = StakingUnsignedPriority; type MaxIterations = (); type MinSolutionScoreBump = (); + type WeightInfo = (); } impl attestations::Trait for Test { @@ -1962,6 +1967,7 @@ mod tests { type IdentificationTuple = session::historical::IdentificationTuple; type OnOffenceHandler = Staking; type WeightSoftLimit = OffencesWeightSoftLimit; + type WeightInfo = (); } parameter_types! { diff --git a/runtime/common/src/registrar.rs b/runtime/common/src/registrar.rs index 60f35131dc..de152d9379 100644 --- a/runtime/common/src/registrar.rs +++ b/runtime/common/src/registrar.rs @@ -747,6 +747,7 @@ mod tests { type AccountData = balances::AccountData; type OnNewAccount = (); type OnKilledAccount = Balances; + type SystemWeightInfo = (); } impl system::offchain::SendTransactionTypes for Test where @@ -766,6 +767,7 @@ mod tests { type Event = (); type ExistentialDeposit = ExistentialDeposit; type AccountStore = System; + type WeightInfo = (); } parameter_types!{ @@ -814,6 +816,7 @@ mod tests { type ValidatorId = u64; type ValidatorIdOf = (); type DisabledValidatorsThreshold = DisabledValidatorsThreshold; + type WeightInfo = (); } parameter_types! { @@ -848,12 +851,14 @@ mod tests { type UnsignedPriority = StakingUnsignedPriority; type MaxIterations = (); type MinSolutionScoreBump = (); + type WeightInfo = (); } impl timestamp::Trait for Test { type Moment = u64; type OnTimestampSet = (); type MinimumPeriod = MinimumPeriod; + type WeightInfo = (); } impl session::historical::Trait for Test { diff --git a/runtime/common/src/slots.rs b/runtime/common/src/slots.rs index 0abed1f85f..5618a680c5 100644 --- a/runtime/common/src/slots.rs +++ b/runtime/common/src/slots.rs @@ -933,6 +933,7 @@ mod tests { type AccountData = balances::AccountData; type OnNewAccount = (); type OnKilledAccount = Balances; + type SystemWeightInfo = (); } parameter_types! { @@ -945,6 +946,7 @@ mod tests { type DustRemoval = (); type ExistentialDeposit = ExistentialDeposit; type AccountStore = System; + type WeightInfo = (); } thread_local! { diff --git a/runtime/kusama/src/lib.rs b/runtime/kusama/src/lib.rs index 4b238ba677..ee25e8961d 100644 --- a/runtime/kusama/src/lib.rs +++ b/runtime/kusama/src/lib.rs @@ -147,6 +147,7 @@ impl system::Trait for Runtime { type AccountData = balances::AccountData; type OnNewAccount = (); type OnKilledAccount = (); + type SystemWeightInfo = (); } impl scheduler::Trait for Runtime { @@ -156,6 +157,7 @@ impl scheduler::Trait for Runtime { type Call = Call; type MaximumWeight = MaximumBlockWeight; type ScheduleOrigin = EnsureRoot; + type WeightInfo = (); } parameter_types! { @@ -195,6 +197,7 @@ impl indices::Trait for Runtime { type Currency = Balances; type Deposit = IndexDeposit; type Event = Event; + type WeightInfo = (); } parameter_types! { @@ -215,6 +218,7 @@ impl balances::Trait for Runtime { type Event = Event; type ExistentialDeposit = ExistentialDeposit; type AccountStore = System; + type WeightInfo = (); } parameter_types! { @@ -236,6 +240,7 @@ impl timestamp::Trait for Runtime { type Moment = u64; type OnTimestampSet = Babe; type MinimumPeriod = MinimumPeriod; + type WeightInfo = (); } parameter_types! { @@ -279,6 +284,7 @@ impl session::Trait for Runtime { type SessionHandler = ::KeyTypeIdProviders; type Keys = SessionKeys; type DisabledValidatorsThreshold = DisabledValidatorsThreshold; + type WeightInfo = (); } impl session::historical::Trait for Runtime { @@ -345,6 +351,7 @@ impl staking::Trait for Runtime { type UnsignedPriority = StakingUnsignedPriority; type MaxIterations = MaxIterations; type MinSolutionScoreBump = MinSolutionScoreBump; + type WeightInfo = (); } parameter_types! { @@ -393,6 +400,7 @@ impl democracy::Trait for Runtime { type PalletsOrigin = OriginCaller; type MaxVotes = MaxVotes; type OperationalPreimageOrigin = collective::EnsureMember; + type WeightInfo = (); } parameter_types! { @@ -407,6 +415,7 @@ impl collective::Trait for Runtime { type Event = Event; type MotionDuration = CouncilMotionDuration; type MaxProposals = CouncilMaxProposals; + type WeightInfo = (); } parameter_types! { @@ -436,6 +445,7 @@ impl elections_phragmen::Trait for Runtime { type DesiredRunnersUp = DesiredRunnersUp; type TermDuration = TermDuration; type ModuleId = ElectionsPhragmenModuleId; + type WeightInfo = (); } parameter_types! { @@ -450,6 +460,7 @@ impl collective::Trait for Runtime { type Event = Event; type MotionDuration = TechnicalMotionDuration; type MaxProposals = TechnicalMaxProposals; + type WeightInfo = (); } impl membership::Trait for Runtime { @@ -498,6 +509,7 @@ impl treasury::Trait for Runtime { type SpendPeriod = SpendPeriod; type Burn = Burn; type ModuleId = TreasuryModuleId; + type WeightInfo = (); } parameter_types! { @@ -509,6 +521,7 @@ impl offences::Trait for Runtime { type IdentificationTuple = session::historical::IdentificationTuple; type OnOffenceHandler = Staking; type WeightSoftLimit = OffencesWeightSoftLimit; + type WeightInfo = (); } impl authority_discovery::Trait for Runtime {} @@ -528,6 +541,7 @@ impl im_online::Trait for Runtime { type ReportUnresponsiveness = Offences; type SessionDuration = SessionDuration; type UnsignedPriority = ImOnlineUnsignedPriority; + type WeightInfo = (); } impl grandpa::Trait for Runtime { @@ -725,11 +739,13 @@ impl identity::Trait for Runtime { type MaxRegistrars = MaxRegistrars; type RegistrarOrigin = MoreThanHalfCouncil; type ForceOrigin = MoreThanHalfCouncil; + type WeightInfo = (); } impl utility::Trait for Runtime { type Event = Event; type Call = Call; + type WeightInfo = (); } parameter_types! { @@ -747,6 +763,7 @@ impl multisig::Trait for Runtime { type DepositBase = DepositBase; type DepositFactor = DepositFactor; type MaxSignatories = MaxSignatories; + type WeightInfo = (); } parameter_types! { @@ -803,6 +820,7 @@ impl vesting::Trait for Runtime { type Currency = Balances; type BlockNumberToBalance = ConvertInto; type MinVestedTransfer = MinVestedTransfer; + type WeightInfo = (); } parameter_types! { @@ -904,6 +922,7 @@ impl proxy::Trait for Runtime { type ProxyDepositBase = ProxyDepositBase; type ProxyDepositFactor = ProxyDepositFactor; type MaxProxies = MaxProxies; + type WeightInfo = (); } pub struct CustomOnRuntimeUpgrade; diff --git a/runtime/parachains/src/mock.rs b/runtime/parachains/src/mock.rs index fd0d8e75e2..9cc9f2329b 100644 --- a/runtime/parachains/src/mock.rs +++ b/runtime/parachains/src/mock.rs @@ -87,6 +87,7 @@ impl system::Trait for Test { type AccountData = balances::AccountData; type OnNewAccount = (); type OnKilledAccount = (); + type SystemWeightInfo = (); } impl crate::initializer::Trait for Test { diff --git a/runtime/polkadot/src/lib.rs b/runtime/polkadot/src/lib.rs index de34a6f061..abd9687164 100644 --- a/runtime/polkadot/src/lib.rs +++ b/runtime/polkadot/src/lib.rs @@ -178,6 +178,7 @@ impl system::Trait for Runtime { type AccountData = balances::AccountData; type OnNewAccount = (); type OnKilledAccount = (); + type SystemWeightInfo = (); } impl scheduler::Trait for Runtime { @@ -187,6 +188,7 @@ impl scheduler::Trait for Runtime { type Call = Call; type MaximumWeight = MaximumBlockWeight; type ScheduleOrigin = EnsureRoot; + type WeightInfo = (); } parameter_types! { @@ -226,6 +228,7 @@ impl indices::Trait for Runtime { type Currency = Balances; type Deposit = IndexDeposit; type Event = Event; + type WeightInfo = (); } parameter_types! { @@ -246,13 +249,13 @@ impl balances::Trait for Runtime { type Event = Event; type ExistentialDeposit = ExistentialDeposit; type AccountStore = System; + type WeightInfo = (); } parameter_types! { pub const TransactionByteFee: Balance = 10 * MILLICENTS; } - impl transaction_payment::Trait for Runtime { type Currency = Balances; type OnTransactionPayment = DealWithFees; @@ -268,6 +271,7 @@ impl timestamp::Trait for Runtime { type Moment = u64; type OnTimestampSet = Babe; type MinimumPeriod = MinimumPeriod; + type WeightInfo = (); } parameter_types! { @@ -306,6 +310,7 @@ impl session::Trait for Runtime { type SessionHandler = ::KeyTypeIdProviders; type Keys = SessionKeys; type DisabledValidatorsThreshold = DisabledValidatorsThreshold; + type WeightInfo = (); } impl session::historical::Trait for Runtime { @@ -371,6 +376,7 @@ impl staking::Trait for Runtime { type UnsignedPriority = StakingUnsignedPriority; type MaxIterations = MaxIterations; type MinSolutionScoreBump = MinSolutionScoreBump; + type WeightInfo = (); } parameter_types! { @@ -395,6 +401,7 @@ impl identity::Trait for Runtime { type Slashed = Treasury; type ForceOrigin = MoreThanHalfCouncil; type RegistrarOrigin = MoreThanHalfCouncil; + type WeightInfo = (); } parameter_types! { @@ -461,6 +468,7 @@ impl democracy::Trait for Runtime { type Scheduler = Scheduler; type PalletsOrigin = OriginCaller; type MaxVotes = MaxVotes; + type WeightInfo = (); } parameter_types! { @@ -475,6 +483,7 @@ impl collective::Trait for Runtime { type Event = Event; type MotionDuration = CouncilMotionDuration; type MaxProposals = CouncilMaxProposals; + type WeightInfo = (); } parameter_types! { @@ -505,6 +514,7 @@ impl elections_phragmen::Trait for Runtime { type DesiredMembers = DesiredMembers; type DesiredRunnersUp = DesiredRunnersUp; type TermDuration = TermDuration; + type WeightInfo = (); } parameter_types! { @@ -519,6 +529,7 @@ impl collective::Trait for Runtime { type Event = Event; type MotionDuration = TechnicalMotionDuration; type MaxProposals = TechnicalMaxProposals; + type WeightInfo = (); } impl membership::Trait for Runtime { @@ -567,6 +578,7 @@ impl treasury::Trait for Runtime { type ProposalBondMinimum = ProposalBondMinimum; type SpendPeriod = SpendPeriod; type Burn = Burn; + type WeightInfo = (); } parameter_types! { @@ -578,6 +590,7 @@ impl offences::Trait for Runtime { type IdentificationTuple = session::historical::IdentificationTuple; type OnOffenceHandler = Staking; type WeightSoftLimit = OffencesWeightSoftLimit; + type WeightInfo = (); } impl authority_discovery::Trait for Runtime {} @@ -597,6 +610,7 @@ impl im_online::Trait for Runtime { type SessionDuration = SessionDuration; type ReportUnresponsiveness = Offences; type UnsignedPriority = ImOnlineUnsignedPriority; + type WeightInfo = (); } impl grandpa::Trait for Runtime { @@ -782,11 +796,13 @@ impl vesting::Trait for Runtime { type Currency = Balances; type BlockNumberToBalance = ConvertInto; type MinVestedTransfer = MinVestedTransfer; + type WeightInfo = (); } impl utility::Trait for Runtime { type Event = Event; type Call = Call; + type WeightInfo = (); } parameter_types! { @@ -804,6 +820,7 @@ impl multisig::Trait for Runtime { type DepositBase = DepositBase; type DepositFactor = DepositFactor; type MaxSignatories = MaxSignatories; + type WeightInfo = (); } impl sudo::Trait for Runtime { @@ -909,6 +926,7 @@ impl proxy::Trait for Runtime { type ProxyDepositBase = ProxyDepositBase; type ProxyDepositFactor = ProxyDepositFactor; type MaxProxies = MaxProxies; + type WeightInfo = (); } pub struct CustomOnRuntimeUpgrade; diff --git a/runtime/test-runtime/src/lib.rs b/runtime/test-runtime/src/lib.rs index 90b0562521..31b17002fe 100644 --- a/runtime/test-runtime/src/lib.rs +++ b/runtime/test-runtime/src/lib.rs @@ -155,6 +155,7 @@ impl system::Trait for Runtime { type AccountData = balances::AccountData; type OnNewAccount = (); type OnKilledAccount = (); + type SystemWeightInfo = (); } impl system::offchain::SendTransactionTypes for Runtime where @@ -200,6 +201,7 @@ impl indices::Trait for Runtime { type Currency = Balances; type Deposit = IndexDeposit; type Event = Event; + type WeightInfo = (); } parameter_types! { @@ -212,6 +214,7 @@ impl balances::Trait for Runtime { type Event = Event; type ExistentialDeposit = ExistentialDeposit; type AccountStore = System; + type WeightInfo = (); } parameter_types! { @@ -233,6 +236,7 @@ impl timestamp::Trait for Runtime { type Moment = u64; type OnTimestampSet = Babe; type MinimumPeriod = MinimumPeriod; + type WeightInfo = (); } parameter_types! { @@ -274,6 +278,7 @@ impl session::Trait for Runtime { type SessionHandler = ::KeyTypeIdProviders; type Keys = SessionKeys; type DisabledValidatorsThreshold = DisabledValidatorsThreshold; + type WeightInfo = (); } impl session::historical::Trait for Runtime { @@ -329,6 +334,8 @@ impl staking::Trait for Runtime { type UnsignedPriority = StakingUnsignedPriority; type MaxIterations = MaxIterations; type MinSolutionScoreBump = MinSolutionScoreBump; + type WeightInfo = (); + } impl grandpa::Trait for Runtime { @@ -448,6 +455,7 @@ impl offences::Trait for Runtime { type IdentificationTuple = session::historical::IdentificationTuple; type OnOffenceHandler = Staking; type WeightSoftLimit = OffencesWeightSoftLimit; + type WeightInfo = (); } parameter_types! { @@ -500,6 +508,7 @@ impl vesting::Trait for Runtime { type Currency = Balances; type BlockNumberToBalance = ConvertInto; type MinVestedTransfer = MinVestedTransfer; + type WeightInfo = (); } construct_runtime! { diff --git a/runtime/westend/src/lib.rs b/runtime/westend/src/lib.rs index 1b8c365c28..41613bbb01 100644 --- a/runtime/westend/src/lib.rs +++ b/runtime/westend/src/lib.rs @@ -137,6 +137,7 @@ impl system::Trait for Runtime { type AccountData = balances::AccountData; type OnNewAccount = (); type OnKilledAccount = (); + type SystemWeightInfo = (); } impl scheduler::Trait for Runtime { @@ -146,6 +147,7 @@ impl scheduler::Trait for Runtime { type Call = Call; type MaximumWeight = MaximumBlockWeight; type ScheduleOrigin = EnsureRoot; + type WeightInfo = (); } parameter_types! { @@ -185,6 +187,7 @@ impl indices::Trait for Runtime { type Currency = Balances; type Deposit = IndexDeposit; type Event = Event; + type WeightInfo = (); } parameter_types! { @@ -197,6 +200,7 @@ impl balances::Trait for Runtime { type Event = Event; type ExistentialDeposit = ExistentialDeposit; type AccountStore = System; + type WeightInfo = (); } parameter_types! { @@ -218,6 +222,7 @@ impl timestamp::Trait for Runtime { type Moment = u64; type OnTimestampSet = Babe; type MinimumPeriod = MinimumPeriod; + type WeightInfo = (); } parameter_types! { @@ -261,6 +266,7 @@ impl session::Trait for Runtime { type SessionHandler = ::KeyTypeIdProviders; type Keys = SessionKeys; type DisabledValidatorsThreshold = DisabledValidatorsThreshold; + type WeightInfo = (); } impl session::historical::Trait for Runtime { @@ -316,6 +322,7 @@ impl staking::Trait for Runtime { type UnsignedPriority = StakingUnsignedPriority; type MaxIterations = MaxIterations; type MinSolutionScoreBump = MinSolutionScoreBump; + type WeightInfo = (); } parameter_types! { @@ -339,6 +346,7 @@ impl offences::Trait for Runtime { type IdentificationTuple = session::historical::IdentificationTuple; type OnOffenceHandler = Staking; type WeightSoftLimit = OffencesWeightSoftLimit; + type WeightInfo = (); } impl authority_discovery::Trait for Runtime {} @@ -358,6 +366,7 @@ impl im_online::Trait for Runtime { type ReportUnresponsiveness = Offences; type SessionDuration = SessionDuration; type UnsignedPriority = StakingUnsignedPriority; + type WeightInfo = (); } impl grandpa::Trait for Runtime { @@ -530,11 +539,13 @@ impl identity::Trait for Runtime { type MaxRegistrars = MaxRegistrars; type RegistrarOrigin = system::EnsureRoot; type ForceOrigin = system::EnsureRoot; + type WeightInfo = (); } impl utility::Trait for Runtime { type Event = Event; type Call = Call; + type WeightInfo = (); } parameter_types! { @@ -552,6 +563,7 @@ impl multisig::Trait for Runtime { type DepositBase = DepositBase; type DepositFactor = DepositFactor; type MaxSignatories = MaxSignatories; + type WeightInfo = (); } parameter_types! { @@ -580,6 +592,7 @@ impl vesting::Trait for Runtime { type Currency = Balances; type BlockNumberToBalance = ConvertInto; type MinVestedTransfer = MinVestedTransfer; + type WeightInfo = (); } impl sudo::Trait for Runtime { @@ -679,6 +692,7 @@ impl proxy::Trait for Runtime { type ProxyDepositBase = ProxyDepositBase; type ProxyDepositFactor = ProxyDepositFactor; type MaxProxies = MaxProxies; + type WeightInfo = (); } construct_runtime! { -- GitLab From 8939dab8ef302f3e054023fc84f3636c4466cf57 Mon Sep 17 00:00:00 2001 From: Pierre Krieger Date: Wed, 8 Jul 2020 18:24:38 +0200 Subject: [PATCH 047/192] Update the Kusama bootnode IDs (#1377) --- service/res/kusama.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/service/res/kusama.json b/service/res/kusama.json index 64e14b9ec8..34c2180184 100644 --- a/service/res/kusama.json +++ b/service/res/kusama.json @@ -8,9 +8,9 @@ "/dns/p2p.cc3-3.kusama.network/tcp/30100/p2p/12D3KooWEGHw84b4hfvXEfyq4XWEmWCbRGuHMHQMpby4BAtZ4xJf", "/dns/p2p.cc3-4.kusama.network/tcp/30100/p2p/12D3KooWF9KDPRMN8WpeyXhEeURZGP8Dmo7go1tDqi7hTYpxV9uW", "/dns/p2p.cc3-5.kusama.network/tcp/30100/p2p/12D3KooWDiwMeqzvgWNreS9sV1HW3pZv1PA7QGA7HUCo7FzN5gcA", - "/dns/kusama-bootnode-0.paritytech.net/tcp/30333/p2p/QmTFUXWi98EADXdsUxvv7t9fhJG1XniRijahDXxdv1EbAW", - "/dns/kusama-bootnode-0.paritytech.net/tcp/30334/ws/p2p/QmTFUXWi98EADXdsUxvv7t9fhJG1XniRijahDXxdv1EbAW", - "/dns/kusama-bootnode-1.paritytech.net/tcp/30333/p2p/Qmf58BhdDSkHxGy1gX5YUuHCpdYYGACxQM3nGWa7xJa5an" + "/dns/kusama-bootnode-0.paritytech.net/tcp/30333/p2p/12D3KooWSueCPH3puP2PcvqPJdNaDNF3jMZjtJtDiSy35pWrbt5h", + "/dns/kusama-bootnode-0.paritytech.net/tcp/30334/ws/p2p/12D3KooWSueCPH3puP2PcvqPJdNaDNF3jMZjtJtDiSy35pWrbt5h", + "/dns/kusama-bootnode-1.paritytech.net/tcp/30333/p2p/12D3KooWQKqane1SqWJNWMQkbia9qiMWXkcHtAdfW5eVF8hbwEDw" ], "telemetryEndpoints": [ [ -- GitLab From edd8f3b22b36f850cece13a81aa8f6cb9f8532a3 Mon Sep 17 00:00:00 2001 From: Gavin Wood Date: Wed, 8 Jul 2020 18:48:48 +0200 Subject: [PATCH 048/192] Bump Substrate (#1382) --- Cargo.lock | 276 ++++++++++++++++++++++++++--------------------------- 1 file changed, 138 insertions(+), 138 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index e4b7b08dd1..e10ee33e1c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1285,7 +1285,7 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "fork-tree" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" +source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" dependencies = [ "parity-scale-codec", ] @@ -1293,7 +1293,7 @@ dependencies = [ [[package]] name = "frame-benchmarking" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" +source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" dependencies = [ "frame-support", "frame-system", @@ -1310,7 +1310,7 @@ dependencies = [ [[package]] name = "frame-benchmarking-cli" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" +source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" dependencies = [ "Inflector", "frame-benchmarking", @@ -1329,7 +1329,7 @@ dependencies = [ [[package]] name = "frame-executive" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" +source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" dependencies = [ "frame-support", "frame-system", @@ -1344,7 +1344,7 @@ dependencies = [ [[package]] name = "frame-metadata" version = "11.0.0-rc4" -source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" +source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" dependencies = [ "parity-scale-codec", "serde", @@ -1355,7 +1355,7 @@ dependencies = [ [[package]] name = "frame-support" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" +source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" dependencies = [ "bitmask", "frame-metadata", @@ -1380,7 +1380,7 @@ dependencies = [ [[package]] name = "frame-support-procedural" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" +source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" dependencies = [ "frame-support-procedural-tools", "proc-macro2 1.0.18", @@ -1391,7 +1391,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" +source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" dependencies = [ "frame-support-procedural-tools-derive", "proc-macro-crate", @@ -1403,7 +1403,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools-derive" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" +source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" dependencies = [ "proc-macro2 1.0.18", "quote 1.0.7", @@ -1413,7 +1413,7 @@ dependencies = [ [[package]] name = "frame-system" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" +source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" dependencies = [ "frame-support", "impl-trait-for-tuples", @@ -1429,7 +1429,7 @@ dependencies = [ [[package]] name = "frame-system-benchmarking" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" +source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" dependencies = [ "frame-benchmarking", "frame-support", @@ -1443,7 +1443,7 @@ dependencies = [ [[package]] name = "frame-system-rpc-runtime-api" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" +source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" dependencies = [ "parity-scale-codec", "sp-api", @@ -3409,7 +3409,7 @@ dependencies = [ [[package]] name = "pallet-authority-discovery" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" +source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" dependencies = [ "frame-support", "frame-system", @@ -3425,7 +3425,7 @@ dependencies = [ [[package]] name = "pallet-authorship" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" +source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" dependencies = [ "frame-support", "frame-system", @@ -3440,7 +3440,7 @@ dependencies = [ [[package]] name = "pallet-babe" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" +source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" dependencies = [ "frame-benchmarking", "frame-support", @@ -3465,7 +3465,7 @@ dependencies = [ [[package]] name = "pallet-balances" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" +source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" dependencies = [ "frame-benchmarking", "frame-support", @@ -3479,7 +3479,7 @@ dependencies = [ [[package]] name = "pallet-collective" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" +source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" dependencies = [ "frame-benchmarking", "frame-support", @@ -3495,7 +3495,7 @@ dependencies = [ [[package]] name = "pallet-democracy" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" +source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" dependencies = [ "frame-benchmarking", "frame-support", @@ -3510,7 +3510,7 @@ dependencies = [ [[package]] name = "pallet-elections-phragmen" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" +source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" dependencies = [ "frame-benchmarking", "frame-support", @@ -3525,7 +3525,7 @@ dependencies = [ [[package]] name = "pallet-finality-tracker" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" +source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" dependencies = [ "frame-support", "frame-system", @@ -3541,7 +3541,7 @@ dependencies = [ [[package]] name = "pallet-grandpa" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" +source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" dependencies = [ "frame-support", "frame-system", @@ -3561,7 +3561,7 @@ dependencies = [ [[package]] name = "pallet-identity" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" +source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" dependencies = [ "enumflags2", "frame-benchmarking", @@ -3577,7 +3577,7 @@ dependencies = [ [[package]] name = "pallet-im-online" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" +source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" dependencies = [ "frame-benchmarking", "frame-support", @@ -3597,7 +3597,7 @@ dependencies = [ [[package]] name = "pallet-indices" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" +source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" dependencies = [ "frame-support", "frame-system", @@ -3613,7 +3613,7 @@ dependencies = [ [[package]] name = "pallet-membership" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" +source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" dependencies = [ "frame-support", "frame-system", @@ -3627,7 +3627,7 @@ dependencies = [ [[package]] name = "pallet-multisig" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" +source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" dependencies = [ "frame-support", "frame-system", @@ -3642,7 +3642,7 @@ dependencies = [ [[package]] name = "pallet-nicks" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" +source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" dependencies = [ "frame-support", "frame-system", @@ -3656,7 +3656,7 @@ dependencies = [ [[package]] name = "pallet-offences" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" +source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" dependencies = [ "frame-support", "frame-system", @@ -3671,7 +3671,7 @@ dependencies = [ [[package]] name = "pallet-offences-benchmarking" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" +source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" dependencies = [ "frame-benchmarking", "frame-support", @@ -3692,7 +3692,7 @@ dependencies = [ [[package]] name = "pallet-proxy" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" +source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" dependencies = [ "frame-support", "frame-system", @@ -3707,7 +3707,7 @@ dependencies = [ [[package]] name = "pallet-randomness-collective-flip" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" +source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" dependencies = [ "frame-support", "frame-system", @@ -3720,7 +3720,7 @@ dependencies = [ [[package]] name = "pallet-recovery" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" +source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" dependencies = [ "enumflags2", "frame-support", @@ -3735,7 +3735,7 @@ dependencies = [ [[package]] name = "pallet-scheduler" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" +source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" dependencies = [ "frame-benchmarking", "frame-support", @@ -3750,7 +3750,7 @@ dependencies = [ [[package]] name = "pallet-session" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" +source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" dependencies = [ "frame-support", "frame-system", @@ -3770,7 +3770,7 @@ dependencies = [ [[package]] name = "pallet-session-benchmarking" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" +source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" dependencies = [ "frame-benchmarking", "frame-support", @@ -3786,7 +3786,7 @@ dependencies = [ [[package]] name = "pallet-society" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" +source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" dependencies = [ "frame-support", "frame-system", @@ -3800,7 +3800,7 @@ dependencies = [ [[package]] name = "pallet-staking" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" +source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" dependencies = [ "frame-benchmarking", "frame-support", @@ -3822,7 +3822,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-curve" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" +source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -3833,7 +3833,7 @@ dependencies = [ [[package]] name = "pallet-sudo" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" +source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" dependencies = [ "frame-support", "frame-system", @@ -3847,7 +3847,7 @@ dependencies = [ [[package]] name = "pallet-timestamp" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" +source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" dependencies = [ "frame-benchmarking", "frame-support", @@ -3865,7 +3865,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" +source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" dependencies = [ "frame-support", "frame-system", @@ -3880,7 +3880,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" +source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" dependencies = [ "jsonrpc-core", "jsonrpc-core-client", @@ -3898,7 +3898,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc-runtime-api" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" +source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" dependencies = [ "frame-support", "parity-scale-codec", @@ -3911,7 +3911,7 @@ dependencies = [ [[package]] name = "pallet-treasury" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" +source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" dependencies = [ "frame-benchmarking", "frame-support", @@ -3926,7 +3926,7 @@ dependencies = [ [[package]] name = "pallet-utility" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" +source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" dependencies = [ "frame-benchmarking", "frame-support", @@ -3942,7 +3942,7 @@ dependencies = [ [[package]] name = "pallet-vesting" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" +source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" dependencies = [ "enumflags2", "frame-benchmarking", @@ -5801,7 +5801,7 @@ dependencies = [ [[package]] name = "sc-authority-discovery" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" +source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" dependencies = [ "bytes 0.5.4", "derive_more 0.99.8", @@ -5828,7 +5828,7 @@ dependencies = [ [[package]] name = "sc-basic-authorship" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" +source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -5852,7 +5852,7 @@ dependencies = [ [[package]] name = "sc-block-builder" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" +source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" dependencies = [ "parity-scale-codec", "sc-client-api", @@ -5869,7 +5869,7 @@ dependencies = [ [[package]] name = "sc-chain-spec" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" +source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" dependencies = [ "impl-trait-for-tuples", "sc-chain-spec-derive", @@ -5885,7 +5885,7 @@ dependencies = [ [[package]] name = "sc-chain-spec-derive" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" +source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -5896,7 +5896,7 @@ dependencies = [ [[package]] name = "sc-cli" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" +source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" dependencies = [ "ansi_term 0.12.1", "atty", @@ -5937,7 +5937,7 @@ dependencies = [ [[package]] name = "sc-client-api" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" +source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" dependencies = [ "derive_more 0.99.8", "fnv", @@ -5973,7 +5973,7 @@ dependencies = [ [[package]] name = "sc-client-db" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" +source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" dependencies = [ "blake2-rfc", "hash-db", @@ -6002,7 +6002,7 @@ dependencies = [ [[package]] name = "sc-consensus" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" +source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" dependencies = [ "sc-client-api", "sp-blockchain", @@ -6013,7 +6013,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" +source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" dependencies = [ "derive_more 0.99.8", "fork-tree", @@ -6055,7 +6055,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe-rpc" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" +source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" dependencies = [ "derive_more 0.99.8", "futures 0.3.5", @@ -6079,7 +6079,7 @@ dependencies = [ [[package]] name = "sc-consensus-epochs" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" +source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" dependencies = [ "fork-tree", "parity-scale-codec", @@ -6092,7 +6092,7 @@ dependencies = [ [[package]] name = "sc-consensus-slots" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" +source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6115,7 +6115,7 @@ dependencies = [ [[package]] name = "sc-consensus-uncles" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" +source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" dependencies = [ "log 0.4.8", "sc-client-api", @@ -6129,7 +6129,7 @@ dependencies = [ [[package]] name = "sc-executor" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" +source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" dependencies = [ "derive_more 0.99.8", "lazy_static", @@ -6157,7 +6157,7 @@ dependencies = [ [[package]] name = "sc-executor-common" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" +source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" dependencies = [ "derive_more 0.99.8", "log 0.4.8", @@ -6174,7 +6174,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmi" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" +source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" dependencies = [ "log 0.4.8", "parity-scale-codec", @@ -6189,7 +6189,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmtime" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" +source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" dependencies = [ "cranelift-codegen", "cranelift-wasm", @@ -6210,7 +6210,7 @@ dependencies = [ [[package]] name = "sc-finality-grandpa" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" +source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" dependencies = [ "assert_matches", "derive_more 0.99.8", @@ -6248,7 +6248,7 @@ dependencies = [ [[package]] name = "sc-finality-grandpa-rpc" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" +source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" dependencies = [ "derive_more 0.99.8", "finality-grandpa", @@ -6265,7 +6265,7 @@ dependencies = [ [[package]] name = "sc-informant" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" +source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" dependencies = [ "ansi_term 0.12.1", "futures 0.3.5", @@ -6283,7 +6283,7 @@ dependencies = [ [[package]] name = "sc-keystore" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" +source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" dependencies = [ "derive_more 0.99.8", "hex", @@ -6299,7 +6299,7 @@ dependencies = [ [[package]] name = "sc-light" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" +source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" dependencies = [ "hash-db", "lazy_static", @@ -6318,7 +6318,7 @@ dependencies = [ [[package]] name = "sc-network" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" +source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" dependencies = [ "bitflags", "bs58", @@ -6370,7 +6370,7 @@ dependencies = [ [[package]] name = "sc-network-gossip" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" +source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6385,7 +6385,7 @@ dependencies = [ [[package]] name = "sc-network-test" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" +source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" dependencies = [ "env_logger", "futures 0.3.5", @@ -6412,7 +6412,7 @@ dependencies = [ [[package]] name = "sc-offchain" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" +source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" dependencies = [ "bytes 0.5.4", "fnv", @@ -6439,7 +6439,7 @@ dependencies = [ [[package]] name = "sc-peerset" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" +source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" dependencies = [ "futures 0.3.5", "libp2p", @@ -6452,7 +6452,7 @@ dependencies = [ [[package]] name = "sc-proposer-metrics" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" +source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" dependencies = [ "log 0.4.8", "substrate-prometheus-endpoint", @@ -6461,7 +6461,7 @@ dependencies = [ [[package]] name = "sc-rpc" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" +source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" dependencies = [ "futures 0.3.5", "hash-db", @@ -6493,7 +6493,7 @@ dependencies = [ [[package]] name = "sc-rpc-api" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" +source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" dependencies = [ "derive_more 0.99.8", "futures 0.3.5", @@ -6517,7 +6517,7 @@ dependencies = [ [[package]] name = "sc-rpc-server" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" +source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" dependencies = [ "jsonrpc-core", "jsonrpc-http-server", @@ -6533,7 +6533,7 @@ dependencies = [ [[package]] name = "sc-service" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" +source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" dependencies = [ "derive_more 0.99.8", "directories", @@ -6596,7 +6596,7 @@ dependencies = [ [[package]] name = "sc-state-db" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" +source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" dependencies = [ "log 0.4.8", "parity-scale-codec", @@ -6610,7 +6610,7 @@ dependencies = [ [[package]] name = "sc-telemetry" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" +source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6631,7 +6631,7 @@ dependencies = [ [[package]] name = "sc-tracing" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" +source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" dependencies = [ "erased-serde", "log 0.4.8", @@ -6648,7 +6648,7 @@ dependencies = [ [[package]] name = "sc-transaction-graph" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" +source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" dependencies = [ "derive_more 0.99.8", "futures 0.3.5", @@ -6668,7 +6668,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" +source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" dependencies = [ "derive_more 0.99.8", "futures 0.3.5", @@ -7075,7 +7075,7 @@ dependencies = [ [[package]] name = "sp-allocator" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" +source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" dependencies = [ "derive_more 0.99.8", "log 0.4.8", @@ -7087,7 +7087,7 @@ dependencies = [ [[package]] name = "sp-api" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" +source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" dependencies = [ "hash-db", "parity-scale-codec", @@ -7102,7 +7102,7 @@ dependencies = [ [[package]] name = "sp-api-proc-macro" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" +source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" dependencies = [ "blake2-rfc", "proc-macro-crate", @@ -7114,7 +7114,7 @@ dependencies = [ [[package]] name = "sp-application-crypto" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" +source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" dependencies = [ "parity-scale-codec", "serde", @@ -7126,7 +7126,7 @@ dependencies = [ [[package]] name = "sp-arithmetic" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" +source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" dependencies = [ "integer-sqrt", "num-traits 0.2.12", @@ -7139,7 +7139,7 @@ dependencies = [ [[package]] name = "sp-authority-discovery" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" +source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" dependencies = [ "parity-scale-codec", "sp-api", @@ -7151,7 +7151,7 @@ dependencies = [ [[package]] name = "sp-authorship" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" +source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" dependencies = [ "parity-scale-codec", "sp-inherents", @@ -7162,7 +7162,7 @@ dependencies = [ [[package]] name = "sp-block-builder" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" +source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" dependencies = [ "parity-scale-codec", "sp-api", @@ -7174,7 +7174,7 @@ dependencies = [ [[package]] name = "sp-blockchain" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" +source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" dependencies = [ "derive_more 0.99.8", "log 0.4.8", @@ -7190,7 +7190,7 @@ dependencies = [ [[package]] name = "sp-chain-spec" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" +source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" dependencies = [ "serde", "serde_json", @@ -7199,7 +7199,7 @@ dependencies = [ [[package]] name = "sp-consensus" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" +source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" dependencies = [ "derive_more 0.99.8", "futures 0.3.5", @@ -7223,7 +7223,7 @@ dependencies = [ [[package]] name = "sp-consensus-aura" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" +source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" dependencies = [ "parity-scale-codec", "sp-api", @@ -7237,7 +7237,7 @@ dependencies = [ [[package]] name = "sp-consensus-babe" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" +source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" dependencies = [ "merlin", "parity-scale-codec", @@ -7256,7 +7256,7 @@ dependencies = [ [[package]] name = "sp-consensus-slots" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" +source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" dependencies = [ "parity-scale-codec", "sp-runtime", @@ -7265,7 +7265,7 @@ dependencies = [ [[package]] name = "sp-consensus-vrf" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" +source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" dependencies = [ "parity-scale-codec", "schnorrkel", @@ -7277,7 +7277,7 @@ dependencies = [ [[package]] name = "sp-core" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" +source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" dependencies = [ "base58", "blake2-rfc", @@ -7320,7 +7320,7 @@ dependencies = [ [[package]] name = "sp-database" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" +source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" dependencies = [ "kvdb", "parking_lot 0.10.2", @@ -7329,7 +7329,7 @@ dependencies = [ [[package]] name = "sp-debug-derive" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" +source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" dependencies = [ "proc-macro2 1.0.18", "quote 1.0.7", @@ -7339,7 +7339,7 @@ dependencies = [ [[package]] name = "sp-externalities" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" +source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" dependencies = [ "environmental", "parity-scale-codec", @@ -7350,7 +7350,7 @@ dependencies = [ [[package]] name = "sp-finality-grandpa" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" +source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" dependencies = [ "finality-grandpa", "log 0.4.8", @@ -7366,7 +7366,7 @@ dependencies = [ [[package]] name = "sp-finality-tracker" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" +source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" dependencies = [ "parity-scale-codec", "sp-inherents", @@ -7376,7 +7376,7 @@ dependencies = [ [[package]] name = "sp-inherents" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" +source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" dependencies = [ "derive_more 0.99.8", "parity-scale-codec", @@ -7388,7 +7388,7 @@ dependencies = [ [[package]] name = "sp-io" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" +source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" dependencies = [ "futures 0.3.5", "hash-db", @@ -7409,7 +7409,7 @@ dependencies = [ [[package]] name = "sp-keyring" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" +source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" dependencies = [ "lazy_static", "sp-core", @@ -7420,7 +7420,7 @@ dependencies = [ [[package]] name = "sp-npos-elections" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" +source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" dependencies = [ "parity-scale-codec", "serde", @@ -7432,7 +7432,7 @@ dependencies = [ [[package]] name = "sp-npos-elections-compact" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" +source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -7443,7 +7443,7 @@ dependencies = [ [[package]] name = "sp-offchain" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" +source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" dependencies = [ "sp-api", "sp-core", @@ -7453,7 +7453,7 @@ dependencies = [ [[package]] name = "sp-panic-handler" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" +source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" dependencies = [ "backtrace", "log 0.4.8", @@ -7462,7 +7462,7 @@ dependencies = [ [[package]] name = "sp-rpc" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" +source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" dependencies = [ "serde", "sp-core", @@ -7471,7 +7471,7 @@ dependencies = [ [[package]] name = "sp-runtime" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" +source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" dependencies = [ "either", "hash256-std-hasher", @@ -7493,7 +7493,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" +source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" dependencies = [ "parity-scale-codec", "primitive-types", @@ -7508,7 +7508,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" +source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" dependencies = [ "Inflector", "proc-macro-crate", @@ -7520,7 +7520,7 @@ dependencies = [ [[package]] name = "sp-serializer" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" +source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" dependencies = [ "serde", "serde_json", @@ -7529,7 +7529,7 @@ dependencies = [ [[package]] name = "sp-session" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" +source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" dependencies = [ "parity-scale-codec", "sp-api", @@ -7542,7 +7542,7 @@ dependencies = [ [[package]] name = "sp-staking" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" +source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" dependencies = [ "parity-scale-codec", "sp-runtime", @@ -7552,7 +7552,7 @@ dependencies = [ [[package]] name = "sp-state-machine" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" +source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" dependencies = [ "hash-db", "itertools 0.9.0", @@ -7573,12 +7573,12 @@ dependencies = [ [[package]] name = "sp-std" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" +source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" [[package]] name = "sp-storage" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" +source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" dependencies = [ "impl-serde 0.2.3", "ref-cast", @@ -7590,7 +7590,7 @@ dependencies = [ [[package]] name = "sp-timestamp" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" +source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -7604,7 +7604,7 @@ dependencies = [ [[package]] name = "sp-tracing" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" +source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" dependencies = [ "log 0.4.8", "rental", @@ -7614,7 +7614,7 @@ dependencies = [ [[package]] name = "sp-transaction-pool" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" +source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" dependencies = [ "derive_more 0.99.8", "futures 0.3.5", @@ -7630,7 +7630,7 @@ dependencies = [ [[package]] name = "sp-trie" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" +source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" dependencies = [ "hash-db", "memory-db", @@ -7644,7 +7644,7 @@ dependencies = [ [[package]] name = "sp-utils" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" +source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" dependencies = [ "futures 0.3.5", "futures-core", @@ -7656,7 +7656,7 @@ dependencies = [ [[package]] name = "sp-version" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" +source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" dependencies = [ "impl-serde 0.2.3", "parity-scale-codec", @@ -7668,7 +7668,7 @@ dependencies = [ [[package]] name = "sp-wasm-interface" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" +source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -7808,7 +7808,7 @@ dependencies = [ [[package]] name = "substrate-browser-utils" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" +source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" dependencies = [ "chrono", "clear_on_drop", @@ -7835,7 +7835,7 @@ dependencies = [ [[package]] name = "substrate-build-script-utils" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" +source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" dependencies = [ "platforms", ] @@ -7843,7 +7843,7 @@ dependencies = [ [[package]] name = "substrate-frame-rpc-system" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" +source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" dependencies = [ "frame-system-rpc-runtime-api", "futures 0.3.5", @@ -7866,7 +7866,7 @@ dependencies = [ [[package]] name = "substrate-prometheus-endpoint" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" +source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" dependencies = [ "async-std", "derive_more 0.99.8", @@ -7880,7 +7880,7 @@ dependencies = [ [[package]] name = "substrate-test-client" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" +source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" dependencies = [ "futures 0.1.29", "futures 0.3.5", @@ -7904,7 +7904,7 @@ dependencies = [ [[package]] name = "substrate-test-runtime" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" +source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" dependencies = [ "cfg-if", "frame-executive", @@ -7937,14 +7937,14 @@ dependencies = [ "sp-transaction-pool", "sp-trie", "sp-version", - "substrate-wasm-builder-runner 1.0.6 (git+https://github.com/paritytech/substrate?branch=master)", + "substrate-wasm-builder-runner 1.0.6 (git+https://github.com/paritytech/substrate)", "trie-db", ] [[package]] name = "substrate-test-runtime-client" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" +source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" dependencies = [ "futures 0.3.5", "parity-scale-codec", @@ -7965,7 +7965,7 @@ dependencies = [ [[package]] name = "substrate-wasm-builder-runner" version = "1.0.6" -source = "git+https://github.com/paritytech/substrate?branch=master#d076f4705ee257b61c02c918755e63e3b34272ad" +source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" [[package]] name = "substrate-wasm-builder-runner" -- GitLab From b651e4af3b88e7038cf59b3d2198ae518e421270 Mon Sep 17 00:00:00 2001 From: Robert Habermeier Date: Wed, 8 Jul 2020 18:15:39 -0400 Subject: [PATCH 049/192] Implement PoV Distribution Subsystem (#1344) * introduce candidatedescriptor type * add PoVDistribution message type * loosen bound on PoV Distribution to account for equivocations * re-export some types from the messages module * begin PoV Distribution subsystem * remove redundant index from PoV distribution * define state machine for pov distribution * handle overseer signals * set up control flow * remove `ValidatorStatement` section * implement PoV fetching * implement distribution logic * add missing ` * implement some network bridge event handlers * stub for message processing, handle our view change * control flow for handling messages * handle `awaiting` message * handle any incoming PoVs and redistribute * actually provide a subsystem implementation * remove set-builder notation * begin testing PoV distribution * test that we send awaiting messages only to peers with same view * ensure we distribute awaited PoVs to peers on view changes * test that peers can complete fetch and are rewarded * test some reporting logic * ensure peer is reported for flooding * test punishing peers diverging from awaited protocol * test that we eagerly complete peers' awaited PoVs based on what we receive * test that we prune the awaited set after receiving * expand pov-distribution in guide to match a change I made * remove unneeded import --- Cargo.lock | 19 + Cargo.toml | 1 + node/network/README.md | 2 +- node/network/pov-distribution/Cargo.toml | 22 + node/network/pov-distribution/src/lib.rs | 1457 +++++++++++++++++ node/subsystem/src/messages.rs | 20 + primitives/src/parachain.rs | 31 + .../src/node/backing/pov-distribution.md | 22 +- .../src/types/overseer-protocol.md | 7 +- 9 files changed, 1565 insertions(+), 16 deletions(-) create mode 100644 node/network/pov-distribution/Cargo.toml create mode 100644 node/network/pov-distribution/src/lib.rs diff --git a/Cargo.lock b/Cargo.lock index e10ee33e1c..9b53e65c3f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4540,6 +4540,25 @@ dependencies = [ "sp-wasm-interface", ] +[[package]] +name = "polkadot-pov-distribution" +version = "0.1.0" +dependencies = [ + "assert_matches", + "futures 0.3.5", + "futures-timer 3.0.2", + "log 0.4.8", + "parity-scale-codec", + "parking_lot 0.10.2", + "polkadot-node-primitives", + "polkadot-node-subsystem", + "polkadot-primitives", + "polkadot-subsystem-test-helpers", + "sc-network", + "sp-runtime", + "streamunordered", +] + [[package]] name = "polkadot-primitives" version = "0.8.14" diff --git a/Cargo.toml b/Cargo.toml index 622355ecb3..fa5fa16279 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -45,6 +45,7 @@ members = [ "node/core/proposer", "node/network/bridge", + "node/network/pov-distribution", "node/network/statement-distribution", "node/overseer", "node/primitives", diff --git a/node/network/README.md b/node/network/README.md index 64f0f11af5..e035485b85 100644 --- a/node/network/README.md +++ b/node/network/README.md @@ -1 +1 @@ -Stub - This folder will hold networking subsystem implementations, each with their own crate. +This folder holds all networking subsystem implementations, each with their own crate. diff --git a/node/network/pov-distribution/Cargo.toml b/node/network/pov-distribution/Cargo.toml new file mode 100644 index 0000000000..a99e5e3d56 --- /dev/null +++ b/node/network/pov-distribution/Cargo.toml @@ -0,0 +1,22 @@ +[package] +name = "polkadot-pov-distribution" +version = "0.1.0" +authors = ["Parity Technologies "] +edition = "2018" + +[dependencies] +futures = "0.3.5" +log = "0.4.8" +futures-timer = "3.0.2" +streamunordered = "0.5.1" +polkadot-primitives = { path = "../../../primitives" } +node-primitives = { package = "polkadot-node-primitives", path = "../../primitives" } +parity-scale-codec = "1.3.0" +sc-network = { git = "https://github.com/paritytech/substrate", branch = "master" } +sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "master" } +polkadot-subsystem = { package = "polkadot-node-subsystem", path = "../../subsystem" } + +[dev-dependencies] +parking_lot = "0.10.0" +subsystem-test = { package = "polkadot-subsystem-test-helpers", path = "../../test-helpers/subsystem" } +assert_matches = "1.3.0" diff --git a/node/network/pov-distribution/src/lib.rs b/node/network/pov-distribution/src/lib.rs new file mode 100644 index 0000000000..589e33fde0 --- /dev/null +++ b/node/network/pov-distribution/src/lib.rs @@ -0,0 +1,1457 @@ +// Copyright 2020 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 . + +//! PoV Distribution Subsystem of Polkadot. +//! +//! This is a gossip implementation of code that is responsible for distributing PoVs +//! among validators. + +use polkadot_primitives::Hash; +use polkadot_primitives::parachain::{PoVBlock as PoV, CandidateDescriptor}; +use polkadot_subsystem::{ + OverseerSignal, SubsystemContext, Subsystem, SubsystemResult, FromOverseer, SpawnedSubsystem, +}; +use polkadot_subsystem::messages::{ + PoVDistributionMessage, NetworkBridgeEvent, ReputationChange as Rep, PeerId, + RuntimeApiMessage, RuntimeApiRequest, AllMessages, NetworkBridgeMessage, +}; +use node_primitives::{View, ProtocolId}; + +use futures::prelude::*; +use futures::channel::oneshot; +use parity_scale_codec::{Encode, Decode}; + +use std::collections::{hash_map::{Entry, HashMap}, HashSet}; +use std::sync::Arc; + +const COST_APPARENT_FLOOD: Rep = Rep::new(-500, "Peer appears to be flooding us with PoV requests"); +const COST_UNEXPECTED_POV: Rep = Rep::new(-500, "Peer sent us an unexpected PoV"); +const COST_MALFORMED_MESSAGE: Rep = Rep::new(-500, "Peer sent us a malformed message"); +const COST_AWAITED_NOT_IN_VIEW: Rep + = Rep::new(-100, "Peer claims to be awaiting something outside of its view"); + +const BENEFIT_FRESH_POV: Rep = Rep::new(25, "Peer supplied us with an awaited PoV"); +const BENEFIT_LATE_POV: Rep = Rep::new(10, "Peer supplied us with an awaited PoV, \ + but was not the first to do so"); + +const PROTOCOL_V1: ProtocolId = *b"pvd1"; + +#[derive(Encode, Decode)] +enum WireMessage { + /// Notification that we are awaiting the given PoVs (by hash) against a + /// specific relay-parent hash. + #[codec(index = "0")] + Awaiting(Hash, Vec), + /// Notification of an awaited PoV, in a given relay-parent context. + /// (relay_parent, pov_hash, pov) + #[codec(index = "1")] + SendPoV(Hash, Hash, PoV), +} + +/// The PoV Distribution Subsystem. +pub struct PoVDistribution; + +impl Subsystem for PoVDistribution + where C: SubsystemContext +{ + fn start(self, ctx: C) -> SpawnedSubsystem { + // Swallow error because failure is fatal to the node and we log with more precision + // within `run`. + SpawnedSubsystem(run(ctx).map(|_| ()).boxed()) + } +} + +struct State { + relay_parent_state: HashMap, + peer_state: HashMap, + our_view: View, +} + +struct BlockBasedState { + known: HashMap>, + /// All the PoVs we are or were fetching, coupled with channels expecting the data. + /// + /// This may be an empty list, which indicates that we were once awaiting this PoV but have + /// received it already. + fetching: HashMap>>>, + n_validators: usize, +} + +#[derive(Default)] +struct PeerState { + /// A set of awaited PoV-hashes for each relay-parent in the peer's view. + awaited: HashMap>, +} + +/// Handles the signal. If successful, returns `true` if the subsystem should conclude, +/// `false` otherwise. +async fn handle_signal( + state: &mut State, + ctx: &mut impl SubsystemContext, + signal: OverseerSignal, +) -> SubsystemResult { + match signal { + OverseerSignal::Conclude => Ok(true), + OverseerSignal::StartWork(relay_parent) => { + let (vals_tx, vals_rx) = oneshot::channel(); + ctx.send_message(AllMessages::RuntimeApi(RuntimeApiMessage::Request( + relay_parent, + RuntimeApiRequest::Validators(vals_tx), + ))).await?; + + state.relay_parent_state.insert(relay_parent, BlockBasedState { + known: HashMap::new(), + fetching: HashMap::new(), + n_validators: vals_rx.await?.len(), + }); + + Ok(false) + } + OverseerSignal::StopWork(relay_parent) => { + state.relay_parent_state.remove(&relay_parent); + + Ok(false) + } + } +} + +/// Notify peers that we are awaiting a given PoV hash. +/// +/// This only notifies peers who have the relay parent in their view. +async fn notify_all_we_are_awaiting( + peers: &mut HashMap, + ctx: &mut impl SubsystemContext, + relay_parent: Hash, + pov_hash: Hash, +) -> SubsystemResult<()> { + // We use `awaited` as a proxy for which heads are in the peer's view. + let peers_to_send: Vec<_> = peers.iter() + .filter_map(|(peer, state)| if state.awaited.contains_key(&relay_parent) { + Some(peer.clone()) + } else { + None + }) + .collect(); + + if peers_to_send.is_empty() { return Ok(()) } + + let payload = WireMessage::Awaiting(relay_parent, vec![pov_hash]).encode(); + + ctx.send_message(AllMessages::NetworkBridge(NetworkBridgeMessage::SendMessage( + peers_to_send, + PROTOCOL_V1, + payload, + ))).await +} + +/// Notify one peer about everything we're awaiting at a given relay-parent. +async fn notify_one_we_are_awaiting_many( + peer: &PeerId, + ctx: &mut impl SubsystemContext, + relay_parent_state: &HashMap, + relay_parent: Hash, +) -> SubsystemResult<()> { + let awaiting_hashes = relay_parent_state.get(&relay_parent).into_iter().flat_map(|s| { + // Send the peer everything we are fetching at this relay-parent + s.fetching.iter() + .filter(|(_, senders)| !senders.is_empty()) // that has not been completed already. + .map(|(pov_hash, _)| *pov_hash) + }).collect::>(); + + if awaiting_hashes.is_empty() { return Ok(()) } + + let payload = WireMessage::Awaiting(relay_parent, awaiting_hashes).encode(); + + ctx.send_message(AllMessages::NetworkBridge(NetworkBridgeMessage::SendMessage( + vec![peer.clone()], + PROTOCOL_V1, + payload, + ))).await +} + +/// Distribute a PoV to peers who are awaiting it. +async fn distribute_to_awaiting( + peers: &mut HashMap, + ctx: &mut impl SubsystemContext, + relay_parent: Hash, + pov_hash: Hash, + pov: &PoV, +) -> SubsystemResult<()> { + // Send to all peers who are awaiting the PoV and have that relay-parent in their view. + // + // Also removes it from their awaiting set. + let peers_to_send: Vec<_> = peers.iter_mut() + .filter_map(|(peer, state)| state.awaited.get_mut(&relay_parent).and_then(|awaited| { + if awaited.remove(&pov_hash) { + Some(peer.clone()) + } else { + None + } + })) + .collect(); + + if peers_to_send.is_empty() { return Ok(()) } + + let payload = WireMessage::SendPoV(relay_parent, pov_hash, pov.clone()).encode(); + + ctx.send_message(AllMessages::NetworkBridge(NetworkBridgeMessage::SendMessage( + peers_to_send, + PROTOCOL_V1, + payload, + ))).await +} + +/// Handles a `FetchPoV` message. +async fn handle_fetch( + state: &mut State, + ctx: &mut impl SubsystemContext, + relay_parent: Hash, + descriptor: CandidateDescriptor, + response_sender: oneshot::Sender>, +) -> SubsystemResult<()> { + let relay_parent_state = match state.relay_parent_state.get_mut(&relay_parent) { + Some(s) => s, + None => return Ok(()), + }; + + if let Some(pov) = relay_parent_state.known.get(&descriptor.pov_hash) { + let _ = response_sender.send(pov.clone()); + return Ok(()); + } + + { + match relay_parent_state.fetching.entry(descriptor.pov_hash) { + Entry::Occupied(mut e) => { + // we are already awaiting this PoV if there is an entry. + e.get_mut().push(response_sender); + return Ok(()); + } + Entry::Vacant(e) => { + e.insert(vec![response_sender]); + } + } + } + + if relay_parent_state.fetching.len() > 2 * relay_parent_state.n_validators { + log::warn!("Other subsystems have requested PoV distribution to \ + fetch more PoVs than reasonably expected: {}", relay_parent_state.fetching.len()); + return Ok(()); + } + + // Issue an `Awaiting` message to all peers with this in their view. + notify_all_we_are_awaiting( + &mut state.peer_state, + ctx, + relay_parent, + descriptor.pov_hash + ).await +} + +/// Handles a `DistributePoV` message. +async fn handle_distribute( + state: &mut State, + ctx: &mut impl SubsystemContext, + relay_parent: Hash, + descriptor: CandidateDescriptor, + pov: Arc, +) -> SubsystemResult<()> { + let relay_parent_state = match state.relay_parent_state.get_mut(&relay_parent) { + None => return Ok(()), + Some(s) => s, + }; + + if let Some(our_awaited) = relay_parent_state.fetching.get_mut(&descriptor.pov_hash) { + // Drain all the senders, but keep the entry in the map around intentionally. + // + // It signals that we were at one point awaiting this, so we will be able to tell + // why peers are sending it to us. + for response_sender in our_awaited.drain(..) { + let _ = response_sender.send(pov.clone()); + } + } + + relay_parent_state.known.insert(descriptor.pov_hash, pov.clone()); + + distribute_to_awaiting( + &mut state.peer_state, + ctx, + relay_parent, + descriptor.pov_hash, + &*pov, + ).await +} + +/// Report a reputation change for a peer. +async fn report_peer( + ctx: &mut impl SubsystemContext, + peer: PeerId, + rep: Rep, +) -> SubsystemResult<()> { + ctx.send_message(AllMessages::NetworkBridge(NetworkBridgeMessage::ReportPeer(peer, rep))).await +} + +/// Handle a notification from a peer that they are awaiting some PoVs. +async fn handle_awaiting( + state: &mut State, + ctx: &mut impl SubsystemContext, + peer: PeerId, + relay_parent: Hash, + pov_hashes: Vec, +) -> SubsystemResult<()> { + if !state.our_view.0.contains(&relay_parent) { + report_peer(ctx, peer, COST_AWAITED_NOT_IN_VIEW).await?; + return Ok(()); + } + + let relay_parent_state = match state.relay_parent_state.get_mut(&relay_parent) { + None => { + log::warn!("PoV Distribution relay parent state out-of-sync with our view"); + return Ok(()); + } + Some(s) => s, + }; + + let peer_awaiting = match + state.peer_state.get_mut(&peer).and_then(|s| s.awaited.get_mut(&relay_parent)) + { + None => { + report_peer(ctx, peer, COST_AWAITED_NOT_IN_VIEW).await?; + return Ok(()); + } + Some(a) => a, + }; + + let will_be_awaited = peer_awaiting.len() + pov_hashes.len(); + if will_be_awaited <= 2 * relay_parent_state.n_validators { + for pov_hash in pov_hashes { + // For all requested PoV hashes, if we have it, we complete the request immediately. + // Otherwise, we note that the peer is awaiting the PoV. + if let Some(pov) = relay_parent_state.known.get(&pov_hash) { + ctx.send_message(AllMessages::NetworkBridge(NetworkBridgeMessage::SendMessage( + vec![peer.clone()], + PROTOCOL_V1, + WireMessage::SendPoV(relay_parent, pov_hash, (&**pov).clone()).encode(), + ))).await?; + } else { + peer_awaiting.insert(pov_hash); + } + } + } else { + report_peer(ctx, peer, COST_APPARENT_FLOOD).await?; + } + + Ok(()) +} + +/// Handle an incoming PoV from our peer. Reports them if unexpected, rewards them if not. +/// +/// Completes any requests awaiting that PoV. +async fn handle_incoming_pov( + state: &mut State, + ctx: &mut impl SubsystemContext, + peer: PeerId, + relay_parent: Hash, + pov_hash: Hash, + pov: PoV, +) -> SubsystemResult<()> { + let relay_parent_state = match state.relay_parent_state.get_mut(&relay_parent) { + None => { + report_peer(ctx, peer, COST_UNEXPECTED_POV).await?; + return Ok(()); + }, + Some(r) => r, + }; + + let pov = { + // Do validity checks and complete all senders awaiting this PoV. + let fetching = match relay_parent_state.fetching.get_mut(&pov_hash) { + None => { + report_peer(ctx, peer, COST_UNEXPECTED_POV).await?; + return Ok(()); + } + Some(f) => f, + }; + + let hash = pov.hash(); + if hash != pov_hash { + report_peer(ctx, peer, COST_UNEXPECTED_POV).await?; + return Ok(()); + } + + let pov = Arc::new(pov); + + if fetching.is_empty() { + // fetching is empty whenever we were awaiting something and + // it was completed afterwards. + report_peer(ctx, peer.clone(), BENEFIT_LATE_POV).await?; + } else { + // fetching is non-empty when the peer just provided us with data we needed. + report_peer(ctx, peer.clone(), BENEFIT_FRESH_POV).await?; + } + + for response_sender in fetching.drain(..) { + let _ = response_sender.send(pov.clone()); + } + + pov + }; + + // make sure we don't consider this peer as awaiting that PoV anymore. + if let Some(peer_state) = state.peer_state.get_mut(&peer) { + peer_state.awaited.remove(&pov_hash); + } + + // distribute the PoV to all other peers who are awaiting it. + distribute_to_awaiting( + &mut state.peer_state, + ctx, + relay_parent, + pov_hash, + &*pov, + ).await +} + +/// Handles a network bridge update. +async fn handle_network_update( + state: &mut State, + ctx: &mut impl SubsystemContext, + update: NetworkBridgeEvent, +) -> SubsystemResult<()> { + match update { + NetworkBridgeEvent::PeerConnected(peer, _observed_role) => { + state.peer_state.insert(peer, PeerState { awaited: HashMap::new() }); + Ok(()) + } + NetworkBridgeEvent::PeerDisconnected(peer) => { + state.peer_state.remove(&peer); + Ok(()) + } + NetworkBridgeEvent::PeerViewChange(peer_id, view) => { + if let Some(peer_state) = state.peer_state.get_mut(&peer_id) { + // prune anything not in the new view. + peer_state.awaited.retain(|relay_parent, _| view.0.contains(&relay_parent)); + + // introduce things from the new view. + for relay_parent in view.0.iter() { + if let Entry::Vacant(entry) = peer_state.awaited.entry(*relay_parent) { + entry.insert(HashSet::new()); + + // Notify the peer about everything we're awaiting at the new relay-parent. + notify_one_we_are_awaiting_many( + &peer_id, + ctx, + &state.relay_parent_state, + *relay_parent, + ).await?; + } + } + } + + Ok(()) + } + NetworkBridgeEvent::PeerMessage(peer, bytes) => { + match WireMessage::decode(&mut &bytes[..]) { + Ok(msg) => match msg { + WireMessage::Awaiting(relay_parent, pov_hashes) => handle_awaiting( + state, + ctx, + peer, + relay_parent, + pov_hashes, + ).await, + WireMessage::SendPoV(relay_parent, pov_hash, pov) => handle_incoming_pov( + state, + ctx, + peer, + relay_parent, + pov_hash, + pov, + ).await, + }, + Err(_) => { + report_peer(ctx, peer, COST_MALFORMED_MESSAGE).await?; + Ok(()) + } + } + } + NetworkBridgeEvent::OurViewChange(view) => { + state.our_view = view; + Ok(()) + } + } +} + +fn network_update_message(update: NetworkBridgeEvent) -> AllMessages { + AllMessages::PoVDistribution(PoVDistributionMessage::NetworkBridgeUpdate(update)) +} + +async fn run( + mut ctx: impl SubsystemContext, +) -> SubsystemResult<()> { + // startup: register the network protocol with the bridge. + ctx.send_message(AllMessages::NetworkBridge(NetworkBridgeMessage::RegisterEventProducer( + PROTOCOL_V1, + network_update_message, + ))).await?; + + let mut state = State { + relay_parent_state: HashMap::new(), + peer_state: HashMap::new(), + our_view: View(Vec::new()), + }; + + loop { + match ctx.recv().await? { + FromOverseer::Signal(signal) => if handle_signal(&mut state, &mut ctx, signal).await? { + return Ok(()); + }, + FromOverseer::Communication { msg } => match msg { + PoVDistributionMessage::FetchPoV(relay_parent, descriptor, response_sender) => + handle_fetch( + &mut state, + &mut ctx, + relay_parent, + descriptor, + response_sender, + ).await?, + PoVDistributionMessage::DistributePoV(relay_parent, descriptor, pov) => + handle_distribute( + &mut state, + &mut ctx, + relay_parent, + descriptor, + pov, + ).await?, + PoVDistributionMessage::NetworkBridgeUpdate(event) => + handle_network_update( + &mut state, + &mut ctx, + event, + ).await?, + }, + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + use futures::executor::{self, ThreadPool}; + use polkadot_primitives::parachain::BlockData; + use assert_matches::assert_matches; + + fn make_pov(data: Vec) -> PoV { + PoV { block_data: BlockData(data) } + } + + fn make_peer_state(awaited: Vec<(Hash, Vec)>) + -> PeerState + { + PeerState { + awaited: awaited.into_iter().map(|(rp, h)| (rp, h.into_iter().collect())).collect() + } + } + + #[test] + fn distributes_to_those_awaiting_and_completes_local() { + let hash_a: Hash = [0; 32].into(); + let hash_b: Hash = [1; 32].into(); + + let peer_a = PeerId::random(); + let peer_b = PeerId::random(); + let peer_c = PeerId::random(); + + let (pov_send, pov_recv) = oneshot::channel(); + let pov = make_pov(vec![1, 2, 3]); + let pov_hash = pov.hash(); + + let mut state = State { + relay_parent_state: { + let mut s = HashMap::new(); + let mut b = BlockBasedState { + known: HashMap::new(), + fetching: HashMap::new(), + n_validators: 10, + }; + + b.fetching.insert(pov_hash, vec![pov_send]); + s.insert(hash_a, b); + s + }, + peer_state: { + let mut s = HashMap::new(); + + // peer A has hash_a in its view and is awaiting the PoV. + s.insert( + peer_a.clone(), + make_peer_state(vec![(hash_a, vec![pov_hash])]), + ); + + // peer B has hash_a in its view but is not awaiting. + s.insert( + peer_b.clone(), + make_peer_state(vec![(hash_a, vec![])]), + ); + + // peer C doesn't have hash_a in its view but is awaiting the PoV under hash_b. + s.insert( + peer_c.clone(), + make_peer_state(vec![(hash_b, vec![pov_hash])]), + ); + + s + }, + our_view: View(vec![hash_a, hash_b]), + }; + + let pool = ThreadPool::new().unwrap(); + let (mut ctx, mut handle) = subsystem_test::make_subsystem_context(pool); + let mut descriptor = CandidateDescriptor::default(); + descriptor.pov_hash = pov_hash; + + executor::block_on(async move { + handle_distribute( + &mut state, + &mut ctx, + hash_a, + descriptor, + Arc::new(pov.clone()), + ).await.unwrap(); + + assert!(!state.peer_state[&peer_a].awaited[&hash_a].contains(&pov_hash)); + assert!(state.peer_state[&peer_c].awaited[&hash_b].contains(&pov_hash)); + + // our local sender also completed + assert_eq!(&*pov_recv.await.unwrap(), &pov); + + assert_matches!( + handle.recv().await, + AllMessages::NetworkBridge( + NetworkBridgeMessage::SendMessage(peers, protocol, message) + ) => { + assert_eq!(peers, vec![peer_a.clone()]); + assert_eq!(protocol, PROTOCOL_V1); + assert_eq!( + message, + WireMessage::SendPoV(hash_a, pov_hash, pov.clone()).encode(), + ); + } + ) + }); + } + + #[test] + fn we_inform_peers_with_same_view_we_are_awaiting() { + let hash_a: Hash = [0; 32].into(); + let hash_b: Hash = [1; 32].into(); + + let peer_a = PeerId::random(); + let peer_b = PeerId::random(); + + let (pov_send, _) = oneshot::channel(); + let pov = make_pov(vec![1, 2, 3]); + let pov_hash = pov.hash(); + + let mut state = State { + relay_parent_state: { + let mut s = HashMap::new(); + let b = BlockBasedState { + known: HashMap::new(), + fetching: HashMap::new(), + n_validators: 10, + }; + + s.insert(hash_a, b); + s + }, + peer_state: { + let mut s = HashMap::new(); + + // peer A has hash_a in its view. + s.insert( + peer_a.clone(), + make_peer_state(vec![(hash_a, vec![])]), + ); + + // peer B doesn't have hash_a in its view. + s.insert( + peer_b.clone(), + make_peer_state(vec![(hash_b, vec![])]), + ); + + s + }, + our_view: View(vec![hash_a]), + }; + + let pool = ThreadPool::new().unwrap(); + let (mut ctx, mut handle) = subsystem_test::make_subsystem_context(pool); + let mut descriptor = CandidateDescriptor::default(); + descriptor.pov_hash = pov_hash; + + executor::block_on(async move { + handle_fetch( + &mut state, + &mut ctx, + hash_a, + descriptor, + pov_send, + ).await.unwrap(); + + assert_eq!(state.relay_parent_state[&hash_a].fetching[&pov_hash].len(), 1); + + assert_matches!( + handle.recv().await, + AllMessages::NetworkBridge( + NetworkBridgeMessage::SendMessage(peers, protocol, message) + ) => { + assert_eq!(peers, vec![peer_a.clone()]); + assert_eq!(protocol, PROTOCOL_V1); + assert_eq!( + message, + WireMessage::Awaiting(hash_a, vec![pov_hash]).encode(), + ); + } + ) + }); + } + + #[test] + fn peer_view_change_leads_to_us_informing() { + let hash_a: Hash = [0; 32].into(); + let hash_b: Hash = [1; 32].into(); + + let peer_a = PeerId::random(); + + let (pov_a_send, _) = oneshot::channel(); + + let pov_a = make_pov(vec![1, 2, 3]); + let pov_a_hash = pov_a.hash(); + + let pov_b = make_pov(vec![4, 5, 6]); + let pov_b_hash = pov_b.hash(); + + let mut state = State { + relay_parent_state: { + let mut s = HashMap::new(); + let mut b = BlockBasedState { + known: HashMap::new(), + fetching: HashMap::new(), + n_validators: 10, + }; + + // pov_a is still being fetched, whereas the fetch of pov_b has already + // completed, as implied by the empty vector. + b.fetching.insert(pov_a_hash, vec![pov_a_send]); + b.fetching.insert(pov_b_hash, vec![]); + + s.insert(hash_a, b); + s + }, + peer_state: { + let mut s = HashMap::new(); + + // peer A doesn't yet have hash_a in its view. + s.insert( + peer_a.clone(), + make_peer_state(vec![(hash_b, vec![])]), + ); + + s + }, + our_view: View(vec![hash_a]), + }; + + let pool = ThreadPool::new().unwrap(); + let (mut ctx, mut handle) = subsystem_test::make_subsystem_context(pool); + + executor::block_on(async move { + handle_network_update( + &mut state, + &mut ctx, + NetworkBridgeEvent::PeerViewChange(peer_a.clone(), View(vec![hash_a, hash_b])), + ).await.unwrap(); + + assert_matches!( + handle.recv().await, + AllMessages::NetworkBridge( + NetworkBridgeMessage::SendMessage(peers, protocol, message) + ) => { + assert_eq!(peers, vec![peer_a.clone()]); + assert_eq!(protocol, PROTOCOL_V1); + assert_eq!( + message, + WireMessage::Awaiting(hash_a, vec![pov_a_hash]).encode(), + ); + } + ) + }); + } + + #[test] + fn peer_complete_fetch_and_is_rewarded() { + let hash_a: Hash = [0; 32].into(); + + let peer_a = PeerId::random(); + let peer_b = PeerId::random(); + + let (pov_send, pov_recv) = oneshot::channel(); + + let pov = make_pov(vec![1, 2, 3]); + let pov_hash = pov.hash(); + + let mut state = State { + relay_parent_state: { + let mut s = HashMap::new(); + let mut b = BlockBasedState { + known: HashMap::new(), + fetching: HashMap::new(), + n_validators: 10, + }; + + // pov is being fetched. + b.fetching.insert(pov_hash, vec![pov_send]); + + s.insert(hash_a, b); + s + }, + peer_state: { + let mut s = HashMap::new(); + + // peers A and B are functionally the same. + s.insert( + peer_a.clone(), + make_peer_state(vec![(hash_a, vec![])]), + ); + + s.insert( + peer_b.clone(), + make_peer_state(vec![(hash_a, vec![])]), + ); + + s + }, + our_view: View(vec![hash_a]), + }; + + let pool = ThreadPool::new().unwrap(); + let (mut ctx, mut handle) = subsystem_test::make_subsystem_context(pool); + + executor::block_on(async move { + // Peer A answers our request before peer B. + handle_network_update( + &mut state, + &mut ctx, + NetworkBridgeEvent::PeerMessage( + peer_a.clone(), + WireMessage::SendPoV(hash_a, pov_hash, pov.clone()).encode(), + ), + ).await.unwrap(); + + handle_network_update( + &mut state, + &mut ctx, + NetworkBridgeEvent::PeerMessage( + peer_b.clone(), + WireMessage::SendPoV(hash_a, pov_hash, pov.clone()).encode(), + ), + ).await.unwrap(); + + assert_eq!(&*pov_recv.await.unwrap(), &pov); + + assert_matches!( + handle.recv().await, + AllMessages::NetworkBridge( + NetworkBridgeMessage::ReportPeer(peer, rep) + ) => { + assert_eq!(peer, peer_a); + assert_eq!(rep, BENEFIT_FRESH_POV); + } + ); + + assert_matches!( + handle.recv().await, + AllMessages::NetworkBridge( + NetworkBridgeMessage::ReportPeer(peer, rep) + ) => { + assert_eq!(peer, peer_b); + assert_eq!(rep, BENEFIT_LATE_POV); + } + ); + }); + } + + #[test] + fn peer_punished_for_sending_bad_pov() { + let hash_a: Hash = [0; 32].into(); + + let peer_a = PeerId::random(); + + let (pov_send, _) = oneshot::channel(); + + let pov = make_pov(vec![1, 2, 3]); + let pov_hash = pov.hash(); + + let bad_pov = make_pov(vec![6, 6, 6]); + + let mut state = State { + relay_parent_state: { + let mut s = HashMap::new(); + let mut b = BlockBasedState { + known: HashMap::new(), + fetching: HashMap::new(), + n_validators: 10, + }; + + // pov is being fetched. + b.fetching.insert(pov_hash, vec![pov_send]); + + s.insert(hash_a, b); + s + }, + peer_state: { + let mut s = HashMap::new(); + + s.insert( + peer_a.clone(), + make_peer_state(vec![(hash_a, vec![])]), + ); + + s + }, + our_view: View(vec![hash_a]), + }; + + let pool = ThreadPool::new().unwrap(); + let (mut ctx, mut handle) = subsystem_test::make_subsystem_context(pool); + + executor::block_on(async move { + // Peer A answers our request: right relay parent, awaited hash, wrong PoV. + handle_network_update( + &mut state, + &mut ctx, + NetworkBridgeEvent::PeerMessage( + peer_a.clone(), + WireMessage::SendPoV(hash_a, pov_hash, bad_pov.clone()).encode(), + ), + ).await.unwrap(); + + // didn't complete our sender. + assert_eq!(state.relay_parent_state[&hash_a].fetching[&pov_hash].len(), 1); + + assert_matches!( + handle.recv().await, + AllMessages::NetworkBridge( + NetworkBridgeMessage::ReportPeer(peer, rep) + ) => { + assert_eq!(peer, peer_a); + assert_eq!(rep, COST_UNEXPECTED_POV); + } + ); + }); + } + + #[test] + fn peer_punished_for_sending_unexpected_pov() { + let hash_a: Hash = [0; 32].into(); + + let peer_a = PeerId::random(); + + let pov = make_pov(vec![1, 2, 3]); + let pov_hash = pov.hash(); + + let mut state = State { + relay_parent_state: { + let mut s = HashMap::new(); + let b = BlockBasedState { + known: HashMap::new(), + fetching: HashMap::new(), + n_validators: 10, + }; + + s.insert(hash_a, b); + s + }, + peer_state: { + let mut s = HashMap::new(); + + s.insert( + peer_a.clone(), + make_peer_state(vec![(hash_a, vec![])]), + ); + + s + }, + our_view: View(vec![hash_a]), + }; + + let pool = ThreadPool::new().unwrap(); + let (mut ctx, mut handle) = subsystem_test::make_subsystem_context(pool); + + executor::block_on(async move { + // Peer A answers our request: right relay parent, awaited hash, wrong PoV. + handle_network_update( + &mut state, + &mut ctx, + NetworkBridgeEvent::PeerMessage( + peer_a.clone(), + WireMessage::SendPoV(hash_a, pov_hash, pov.clone()).encode(), + ), + ).await.unwrap(); + + assert_matches!( + handle.recv().await, + AllMessages::NetworkBridge( + NetworkBridgeMessage::ReportPeer(peer, rep) + ) => { + assert_eq!(peer, peer_a); + assert_eq!(rep, COST_UNEXPECTED_POV); + } + ); + }); + } + + #[test] + fn peer_punished_for_sending_pov_out_of_our_view() { + let hash_a: Hash = [0; 32].into(); + let hash_b: Hash = [1; 32].into(); + + let peer_a = PeerId::random(); + + let pov = make_pov(vec![1, 2, 3]); + let pov_hash = pov.hash(); + + let mut state = State { + relay_parent_state: { + let mut s = HashMap::new(); + let b = BlockBasedState { + known: HashMap::new(), + fetching: HashMap::new(), + n_validators: 10, + }; + + s.insert(hash_a, b); + s + }, + peer_state: { + let mut s = HashMap::new(); + + s.insert( + peer_a.clone(), + make_peer_state(vec![(hash_a, vec![])]), + ); + + s + }, + our_view: View(vec![hash_a]), + }; + + let pool = ThreadPool::new().unwrap(); + let (mut ctx, mut handle) = subsystem_test::make_subsystem_context(pool); + + executor::block_on(async move { + // Peer A answers our request: right relay parent, awaited hash, wrong PoV. + handle_network_update( + &mut state, + &mut ctx, + NetworkBridgeEvent::PeerMessage( + peer_a.clone(), + WireMessage::SendPoV(hash_b, pov_hash, pov.clone()).encode(), + ), + ).await.unwrap(); + + assert_matches!( + handle.recv().await, + AllMessages::NetworkBridge( + NetworkBridgeMessage::ReportPeer(peer, rep) + ) => { + assert_eq!(peer, peer_a); + assert_eq!(rep, COST_UNEXPECTED_POV); + } + ); + }); + } + + #[test] + fn peer_reported_for_awaiting_too_much() { + let hash_a: Hash = [0; 32].into(); + + let peer_a = PeerId::random(); + let n_validators = 10; + + let mut state = State { + relay_parent_state: { + let mut s = HashMap::new(); + let b = BlockBasedState { + known: HashMap::new(), + fetching: HashMap::new(), + n_validators, + }; + + s.insert(hash_a, b); + s + }, + peer_state: { + let mut s = HashMap::new(); + + s.insert( + peer_a.clone(), + make_peer_state(vec![(hash_a, vec![])]), + ); + + s + }, + our_view: View(vec![hash_a]), + }; + + let pool = ThreadPool::new().unwrap(); + let (mut ctx, mut handle) = subsystem_test::make_subsystem_context(pool); + + executor::block_on(async move { + let max_plausibly_awaited = n_validators * 2; + + // The peer awaits a plausible (albeit unlikely) amount of PoVs. + for i in 0..max_plausibly_awaited { + let pov_hash = make_pov(vec![i as u8; 32]).hash(); + handle_network_update( + &mut state, + &mut ctx, + NetworkBridgeEvent::PeerMessage( + peer_a.clone(), + WireMessage::Awaiting(hash_a, vec![pov_hash]).encode(), + ), + ).await.unwrap(); + } + + assert_eq!(state.peer_state[&peer_a].awaited[&hash_a].len(), max_plausibly_awaited); + + // The last straw: + let last_pov_hash = make_pov(vec![max_plausibly_awaited as u8; 32]).hash(); + handle_network_update( + &mut state, + &mut ctx, + NetworkBridgeEvent::PeerMessage( + peer_a.clone(), + WireMessage::Awaiting(hash_a, vec![last_pov_hash]).encode(), + ), + ).await.unwrap(); + + // No more bookkeeping for you! + assert_eq!(state.peer_state[&peer_a].awaited[&hash_a].len(), max_plausibly_awaited); + + assert_matches!( + handle.recv().await, + AllMessages::NetworkBridge( + NetworkBridgeMessage::ReportPeer(peer, rep) + ) => { + assert_eq!(peer, peer_a); + assert_eq!(rep, COST_APPARENT_FLOOD); + } + ); + }); + } + + #[test] + fn peer_reported_for_awaiting_outside_their_view() { + let hash_a: Hash = [0; 32].into(); + let hash_b: Hash = [1; 32].into(); + + let peer_a = PeerId::random(); + + let mut state = State { + relay_parent_state: { + let mut s = HashMap::new(); + s.insert(hash_a, BlockBasedState { + known: HashMap::new(), + fetching: HashMap::new(), + n_validators: 10, + }); + + s.insert(hash_b, BlockBasedState { + known: HashMap::new(), + fetching: HashMap::new(), + n_validators: 10, + }); + + s + }, + peer_state: { + let mut s = HashMap::new(); + + // Peer has only hash A in its view. + s.insert( + peer_a.clone(), + make_peer_state(vec![(hash_a, vec![])]), + ); + + s + }, + our_view: View(vec![hash_a, hash_b]), + }; + + let pool = ThreadPool::new().unwrap(); + let (mut ctx, mut handle) = subsystem_test::make_subsystem_context(pool); + + executor::block_on(async move { + let pov_hash = make_pov(vec![1, 2, 3]).hash(); + + // Hash B is in our view but not the peer's + handle_network_update( + &mut state, + &mut ctx, + NetworkBridgeEvent::PeerMessage( + peer_a.clone(), + WireMessage::Awaiting(hash_b, vec![pov_hash]).encode(), + ), + ).await.unwrap(); + + assert!(state.peer_state[&peer_a].awaited.get(&hash_b).is_none()); + + assert_matches!( + handle.recv().await, + AllMessages::NetworkBridge( + NetworkBridgeMessage::ReportPeer(peer, rep) + ) => { + assert_eq!(peer, peer_a); + assert_eq!(rep, COST_AWAITED_NOT_IN_VIEW); + } + ); + }); + } + + #[test] + fn peer_reported_for_awaiting_outside_our_view() { + let hash_a: Hash = [0; 32].into(); + let hash_b: Hash = [1; 32].into(); + + let peer_a = PeerId::random(); + + let mut state = State { + relay_parent_state: { + let mut s = HashMap::new(); + s.insert(hash_a, BlockBasedState { + known: HashMap::new(), + fetching: HashMap::new(), + n_validators: 10, + }); + + s + }, + peer_state: { + let mut s = HashMap::new(); + + // Peer has hashes A and B in their view. + s.insert( + peer_a.clone(), + make_peer_state(vec![(hash_a, vec![]), (hash_b, vec![])]), + ); + + s + }, + our_view: View(vec![hash_a]), + }; + + let pool = ThreadPool::new().unwrap(); + let (mut ctx, mut handle) = subsystem_test::make_subsystem_context(pool); + + executor::block_on(async move { + let pov_hash = make_pov(vec![1, 2, 3]).hash(); + + // Hash B is in peer's view but not ours. + handle_network_update( + &mut state, + &mut ctx, + NetworkBridgeEvent::PeerMessage( + peer_a.clone(), + WireMessage::Awaiting(hash_b, vec![pov_hash]).encode(), + ), + ).await.unwrap(); + + // Illegal `awaited` is ignored. + assert!(state.peer_state[&peer_a].awaited[&hash_b].is_empty()); + + assert_matches!( + handle.recv().await, + AllMessages::NetworkBridge( + NetworkBridgeMessage::ReportPeer(peer, rep) + ) => { + assert_eq!(peer, peer_a); + assert_eq!(rep, COST_AWAITED_NOT_IN_VIEW); + } + ); + }); + } + + #[test] + fn peer_complete_fetch_leads_to_us_completing_others() { + let hash_a: Hash = [0; 32].into(); + + let peer_a = PeerId::random(); + let peer_b = PeerId::random(); + + let (pov_send, pov_recv) = oneshot::channel(); + + let pov = make_pov(vec![1, 2, 3]); + let pov_hash = pov.hash(); + + let mut state = State { + relay_parent_state: { + let mut s = HashMap::new(); + let mut b = BlockBasedState { + known: HashMap::new(), + fetching: HashMap::new(), + n_validators: 10, + }; + + // pov is being fetched. + b.fetching.insert(pov_hash, vec![pov_send]); + + s.insert(hash_a, b); + s + }, + peer_state: { + let mut s = HashMap::new(); + + s.insert( + peer_a.clone(), + make_peer_state(vec![(hash_a, vec![])]), + ); + + // peer B is awaiting peer A's request. + s.insert( + peer_b.clone(), + make_peer_state(vec![(hash_a, vec![pov_hash])]), + ); + + s + }, + our_view: View(vec![hash_a]), + }; + + let pool = ThreadPool::new().unwrap(); + let (mut ctx, mut handle) = subsystem_test::make_subsystem_context(pool); + + executor::block_on(async move { + handle_network_update( + &mut state, + &mut ctx, + NetworkBridgeEvent::PeerMessage( + peer_a.clone(), + WireMessage::SendPoV(hash_a, pov_hash, pov.clone()).encode(), + ), + ).await.unwrap(); + + assert_eq!(&*pov_recv.await.unwrap(), &pov); + + assert_matches!( + handle.recv().await, + AllMessages::NetworkBridge( + NetworkBridgeMessage::ReportPeer(peer, rep) + ) => { + assert_eq!(peer, peer_a); + assert_eq!(rep, BENEFIT_FRESH_POV); + } + ); + + assert_matches!( + handle.recv().await, + AllMessages::NetworkBridge( + NetworkBridgeMessage::SendMessage(peers, protocol, message) + ) => { + assert_eq!(peers, vec![peer_b.clone()]); + assert_eq!(protocol, PROTOCOL_V1); + assert_eq!( + message, + WireMessage::SendPoV(hash_a, pov_hash, pov.clone()).encode(), + ); + } + ); + + assert!(!state.peer_state[&peer_b].awaited[&hash_a].contains(&pov_hash)); + }); + } + + // TODO [now] awaiting peer sending us something is no longer awaiting. + #[test] + fn peer_completing_request_no_longer_awaiting() { + let hash_a: Hash = [0; 32].into(); + + let peer_a = PeerId::random(); + + let (pov_send, pov_recv) = oneshot::channel(); + + let pov = make_pov(vec![1, 2, 3]); + let pov_hash = pov.hash(); + + let mut state = State { + relay_parent_state: { + let mut s = HashMap::new(); + let mut b = BlockBasedState { + known: HashMap::new(), + fetching: HashMap::new(), + n_validators: 10, + }; + + // pov is being fetched. + b.fetching.insert(pov_hash, vec![pov_send]); + + s.insert(hash_a, b); + s + }, + peer_state: { + let mut s = HashMap::new(); + + // peer A is registered as awaiting. + s.insert( + peer_a.clone(), + make_peer_state(vec![(hash_a, vec![pov_hash])]), + ); + + s + }, + our_view: View(vec![hash_a]), + }; + + let pool = ThreadPool::new().unwrap(); + let (mut ctx, mut handle) = subsystem_test::make_subsystem_context(pool); + + executor::block_on(async move { + handle_network_update( + &mut state, + &mut ctx, + NetworkBridgeEvent::PeerMessage( + peer_a.clone(), + WireMessage::SendPoV(hash_a, pov_hash, pov.clone()).encode(), + ), + ).await.unwrap(); + + assert_eq!(&*pov_recv.await.unwrap(), &pov); + + assert_matches!( + handle.recv().await, + AllMessages::NetworkBridge( + NetworkBridgeMessage::ReportPeer(peer, rep) + ) => { + assert_eq!(peer, peer_a); + assert_eq!(rep, BENEFIT_FRESH_POV); + } + ); + + // We received the PoV from peer A, so we do not consider it awaited by peer A anymore. + assert!(!state.peer_state[&peer_a].awaited[&hash_a].contains(&pov_hash)); + }); + } +} diff --git a/node/subsystem/src/messages.rs b/node/subsystem/src/messages.rs index 1ff4986b06..73371e28fd 100644 --- a/node/subsystem/src/messages.rs +++ b/node/subsystem/src/messages.rs @@ -28,11 +28,14 @@ use polkadot_primitives::{BlockNumber, Hash, Signature}; use polkadot_primitives::parachain::{ AbridgedCandidateReceipt, PoVBlock, ErasureChunk, BackedCandidate, Id as ParaId, SignedAvailabilityBitfield, SigningContext, ValidatorId, ValidationCode, ValidatorIndex, + CandidateDescriptor, }; use polkadot_node_primitives::{ MisbehaviorReport, SignedFullStatement, View, ProtocolId, }; +use std::sync::Arc; + pub use sc_network::{ObservedRole, ReputationChange, PeerId}; /// A notification of a new backed candidate. @@ -214,6 +217,21 @@ pub enum ProvisionerMessage { ProvisionableData(ProvisionableData), } +/// Message to the PoV Distribution Subsystem. +#[derive(Debug)] +pub enum PoVDistributionMessage { + /// Fetch a PoV from the network. + /// + /// This `CandidateDescriptor` should correspond to a candidate seconded under the provided + /// relay-parent hash. + FetchPoV(Hash, CandidateDescriptor, oneshot::Sender>), + /// Distribute a PoV for the given relay-parent and CandidateDescriptor. + /// The PoV should correctly hash to the PoV hash mentioned in the CandidateDescriptor + DistributePoV(Hash, CandidateDescriptor, Arc), + /// An update from the network bridge. + NetworkBridgeUpdate(NetworkBridgeEvent), +} + /// A message type tying together all message types that are used across Subsystems. #[derive(Debug)] pub enum AllMessages { @@ -231,6 +249,8 @@ pub enum AllMessages { BitfieldDistribution(BitfieldDistributionMessage), /// Message for the Provisioner subsystem. Provisioner(ProvisionerMessage), + /// Message for the PoV Distribution subsystem. + PoVDistribution(PoVDistributionMessage), /// Message for the Runtime API subsystem. RuntimeApi(RuntimeApiMessage), /// Message for the availability store subsystem. diff --git a/primitives/src/parachain.rs b/primitives/src/parachain.rs index b187d488e1..d0d3dce558 100644 --- a/primitives/src/parachain.rs +++ b/primitives/src/parachain.rs @@ -460,6 +460,17 @@ impl AbridgedCandidateReceipt { pov_block_hash: *pov_block_hash, } } + + /// Clone the relevant portions of the `AbridgedCandidateReceipt` to form a `CandidateDescriptor`. + pub fn to_descriptor(&self) -> CandidateDescriptor { + CandidateDescriptor { + para_id: self.parachain_index, + relay_parent: self.relay_parent, + collator: self.collator.clone(), + signature: self.signature.clone(), + pov_hash: self.pov_block_hash.clone(), + } + } } @@ -478,6 +489,26 @@ impl Ord for AbridgedCandidateReceipt { } } +/// A unique descriptor of the candidate receipt, in a lightweight format. +#[derive(PartialEq, Eq, Clone, Encode, Decode)] +#[cfg_attr(feature = "std", derive(Debug, Default))] +pub struct CandidateDescriptor { + /// The ID of the para this is a candidate for. + pub para_id: Id, + /// The hash of the relay-chain block this should be executed in + /// the context of. + // NOTE: the fact that the hash includes this value means that code depends + // on this for deduplication. Removing this field is likely to break things. + pub relay_parent: H, + /// The collator's relay-chain account ID + pub collator: CollatorId, + /// Signature on blake2-256 of components of this receipt: + /// The para ID, the relay parent, and the pov_hash. + pub signature: CollatorSignature, + /// The hash of the pov-block. + pub pov_hash: H, +} + /// A collation sent by a collator. #[derive(PartialEq, Eq, Clone, Encode, Decode)] #[cfg_attr(feature = "std", derive(Debug, Default))] diff --git a/roadmap/implementers-guide/src/node/backing/pov-distribution.md b/roadmap/implementers-guide/src/node/backing/pov-distribution.md index 1cede76674..32c8fd3788 100644 --- a/roadmap/implementers-guide/src/node/backing/pov-distribution.md +++ b/roadmap/implementers-guide/src/node/backing/pov-distribution.md @@ -26,11 +26,13 @@ This protocol is described in terms of "us" and our peers, with the understandin As we are gossiping, we need to track which PoVs our peers are waiting for to avoid sending them data that they are not expecting. It is not reasonable to expect our peers to buffer unexpected PoVs, just as we will not buffer unexpected PoVs. So notifying our peers about what is being awaited is key. However it is important that the notifications system is also bounded. -For this, in order to avoid reaching into the internals of the [Statement Distribution](statement-distribution.md) Subsystem, we can rely on an expected propery of candidate backing: that each validator can only second one candidate at each chain head. So we can set a cap on the number of PoVs each peer is allowed to notify us that they are waiting for at a given relay-parent. This cap will be the number of validators at that relay-parent. And the view update mechanism of the [Network Bridge](../utility/network-bridge.md) ensures that peers are only allowed to consider a certain set of relay-parents as live. So this bounding mechanism caps the amount of data we need to store per peer at any time at `sum({ n_validators_at_head(head) | head in view_heads })`. Additionally, peers should only be allowed to notify us of PoV hashes they are waiting for in the context of relay-parents in our own local view, which means that `n_validators_at_head` is implied to be `0` for relay-parents not in our own local view. +For this, in order to avoid reaching into the internals of the [Statement Distribution](statement-distribution.md) Subsystem, we can rely on an expected propery of candidate backing: that each validator can second up to 2 candidates per chain head. This will typically be only one, because they are only supposed to issue one, but they can equivocate if they are willing to be slashed. So we can set a cap on the number of PoVs each peer is allowed to notify us that they are waiting for at a given relay-parent. This cap will be twice the number of validators at that relay-parent. In practice, this is a very lax upper bound that can be reduced much further if desired. + +The view update mechanism of the [Network Bridge](../utility/network-bridge.md) ensures that peers are only allowed to consider a certain set of relay-parents as live. So this bounding mechanism caps the amount of data we need to store per peer at any time at `sum({ 2 * n_validators_at_head(head) * sizeof(hash) for head in view_heads })`. Additionally, peers should only be allowed to notify us of PoV hashes they are waiting for in the context of relay-parents in our own local view, which means that `n_validators_at_head` is implied to be `0` for relay-parents not in our own local view. View updates from peers and our own view updates are received from the network bridge. These will lag somewhat behind the `StartWork` and `StopWork` messages received from the overseer, which will influence the actual data we store. The `OurViewUpdate`s from the [`NetworkBridgeEvent`](../../types/overseer-protocol.md#network-bridge-update) must be considered canonical in terms of our peers' perception of us. -Lastly, the system needs to be bootstrapped with our own perception of which PoVs we are cognizant of but awaiting data for. This is done by receipt of the [`PoVDistributionMessage`](../../types/overseer-protocol.md#pov-distribution-message)::ValidatorStatement variant. We can ignore anything except for `Seconded` statements. +Lastly, the system needs to be bootstrapped with our own perception of which PoVs we are cognizant of but awaiting data for. This is done by receipt of the [`PoVDistributionMessage`](../../types/overseer-protocol.md#pov-distribution-message)::FetchPoV variant. Proper operation of this subsystem depends on the descriptors passed faithfully representing candidates which have been seconded by other validators. ## Formal Description @@ -45,7 +47,6 @@ struct State { struct BlockBasedState { known: Map, // should be a shared PoV in practice. these things are heavy. - awaited: Set, // awaited PoVs by blake2-256 hash. fetching: Map]>, n_validators: usize, } @@ -79,14 +80,11 @@ Here is the logic of the state machine: - On `Concluded`: conclude. *PoV Distribution Messages* -- On `ValidatorStatement(relay_parent, statement)` - - If this is not `Statement::Seconded`, ignore. - - If there is an entry under `relay_parent` in `relay_parent_state`, add the `pov_hash` of the seconded Candidate's [`CandidateDescriptor`](../../types/candidate.md#candidate-descriptor) to the `awaited` set of the entry. - - If the `pov_hash` was not previously awaited and there are `n_validators` or fewer entries in the `awaited` set, send `NetworkMessage::Awaiting(relay_parent, vec![pov_hash])` to all peers. - On `FetchPoV(relay_parent, descriptor, response_channel)` - If there is no entry in `relay_parent_state` under `relay_parent`, ignore. - If there is a PoV under `descriptor.pov_hash` in the `known` map, send that PoV on the channel and return. - Otherwise, place the `response_channel` in the `fetching` map under `descriptor.pov_hash`. + - If the `pov_hash` had no previous entry in `fetching` and there are `2 * n_validators` or fewer entries in the `fetching` set, send `NetworkMessage::Awaiting(relay_parent, vec![pov_hash])` to all peers. - On `DistributePoV(relay_parent, descriptor, PoV)` - If there is no entry in `relay_parent_state` under `relay_parent`, ignore. - Complete and remove any channels under `descriptor.pov_hash` in the `fetching` map. @@ -96,26 +94,28 @@ Here is the logic of the state machine: *Network Bridge Updates* - On `PeerConnected(peer_id, observed_role)` - Make a fresh entry in the `peer_state` map for the `peer_id`. -- On `PeerDisconnected(peer_id) +- On `PeerDisconnected(peer_id)` - Remove the entry for `peer_id` from the `peer_state` map. - On `PeerMessage(peer_id, bytes)` - If the bytes do not decode to a `NetworkMessage` or the `peer_id` has no entry in the `peer_state` map, report and ignore. - If this is `NetworkMessage::Awaiting(relay_parent, pov_hashes)`: - If there is no entry under `peer_state.awaited` for the `relay_parent`, report and ignore. - If `relay_parent` is not contained within `our_view`, report and ignore. - - Otherwise, if the `awaited` map combined with the `pov_hashes` would have more than `relay_parent_state[relay_parent].n_validators` entries, report and ignore. Note that we are leaning on the property of the network bridge that it sets our view based on `StartWork` messages. + - Otherwise, if the peer's `awaited` map combined with the `pov_hashes` would have more than ` 2 * relay_parent_state[relay_parent].n_validators` entries, report and ignore. Note that we are leaning on the property of the network bridge that it sets our view based on `StartWork` messages. - For each new `pov_hash` in `pov_hashes`, if there is a `pov` under `pov_hash` in the `known` map, send the peer a `NetworkMessage::SendPoV(relay_parent, pov_hash, pov)`. - Otherwise, add the `pov_hash` to the `awaited` map - If this is `NetworkMessage::SendPoV(relay_parent, pov_hash, pov)`: - - If there is no entry under `relay_parent` in `relay_parent_state` or no entry under `pov_hash` in our `awaited` map for that `relay_parent`, report and ignore. + - If there is no entry under `relay_parent` in `relay_parent_state` or no entry under `pov_hash` in our `fetching` map for that `relay_parent`, report and ignore. - If the blake2-256 hash of the pov doesn't equal `pov_hash`, report and ignore. - - Complete and remove any listeners in the `fetching` map under `pov_hash`. + - Complete and remove any listeners in the `fetching` map under `pov_hash`. However, leave an empty set of listeners in the `fetching` map to denote that this was something we once awaited. This will allow us to recognize peers who have sent us something we were expecting, but just a little late. - Add to `known` map. + - Remove the `pov_hash` from the `peer.awaited` map, if any. - Send `NetworkMessage::SendPoV(relay_parent, descriptor.pov_hash, PoV)` to all peers who have the `descriptor.pov_hash` in the set under `relay_parent` in the `peer.awaited` map and remove the entry from `peer.awaited`. - On `PeerViewChange(peer_id, view)` - If Peer is unknown, ignore. - Ensure there is an entry under `relay_parent` for each `relay_parent` in `view` within the `peer.awaited` map, creating blank `awaited` lists as necessary. - Remove all entries under `peer.awaited` that are not within `view`. + - For all hashes in `view` but were not within the old, send the peer all the keys in our `fetching` map under the block-based state for that hash - i.e. notify the peer of everything we are awaiting at that hash. - On `OurViewChange(view)` - Update `our_view` to `view` diff --git a/roadmap/implementers-guide/src/types/overseer-protocol.md b/roadmap/implementers-guide/src/types/overseer-protocol.md index 7908def940..799d1e2a7f 100644 --- a/roadmap/implementers-guide/src/types/overseer-protocol.md +++ b/roadmap/implementers-guide/src/types/overseer-protocol.md @@ -172,11 +172,10 @@ If this subsystem chooses to second a parachain block, it dispatches a `Candidat ```rust enum PoVDistributionMessage { - /// Note a statement by a validator on a relay-parent. `Seconded` statements must always - /// have been passed in before `Valid` or `Invalid` statements. - ValidatorStatement(Hash, SignedFullStatement), /// Fetch a PoV from the network. - /// (relay_parent, PoV-hash, Response channel). + /// + /// This `CandidateDescriptor` should correspond to a candidate seconded under the provided + /// relay-parent hash. FetchPoV(Hash, CandidateDescriptor, ResponseChannel), /// Distribute a PoV for the given relay-parent and CandidateDescriptor. /// The PoV should correctly hash to the PoV hash mentioned in the CandidateDescriptor -- GitLab From 308e8b4b43f30dcc6d55216ca67a249151a82f00 Mon Sep 17 00:00:00 2001 From: Pierre Krieger Date: Thu, 9 Jul 2020 13:25:39 +0200 Subject: [PATCH 050/192] Remove AwaitCanceled (#1375) --- network/Cargo.toml | 2 +- network/src/protocol/mod.rs | 26 ++------------------------ 2 files changed, 3 insertions(+), 25 deletions(-) diff --git a/network/Cargo.toml b/network/Cargo.toml index bfee6f3455..a18115ac6d 100644 --- a/network/Cargo.toml +++ b/network/Cargo.toml @@ -19,7 +19,7 @@ sc-network = { git = "https://github.com/paritytech/substrate", branch = "master sc-network-gossip = { git = "https://github.com/paritytech/substrate", branch = "master" } sp-core = { git = "https://github.com/paritytech/substrate", branch = "master" } sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "master" } -futures = "0.3.4" +futures = "0.3.5" log = "0.4.8" exit-future = "0.2.0" futures-timer = "2.0" diff --git a/network/src/protocol/mod.rs b/network/src/protocol/mod.rs index c36dbf1945..9a94065e5b 100644 --- a/network/src/protocol/mod.rs +++ b/network/src/protocol/mod.rs @@ -404,28 +404,6 @@ struct ConsensusNetworkingInstance { _drop_signal: exit_future::Signal, } -/// A utility future that resolves when the receiving end of a channel has hung up. -/// -/// This is an `.await`-friendly interface around `poll_canceled`. -// TODO: remove in favor of https://github.com/rust-lang/futures-rs/pull/2092/ -// once published. -#[must_use = "futures do nothing unless you `.await` or poll them"] -#[derive(Debug)] -pub struct AwaitCanceled<'a, T> { - inner: &'a mut oneshot::Sender, -} - -impl Future for AwaitCanceled<'_, T> { - type Output = (); - - fn poll( - mut self: Pin<&mut Self>, - cx: &mut futures::task::Context<'_>, - ) -> futures::task::Poll<()> { - self.inner.poll_canceled(cx) - } -} - /// Protocol configuration. #[derive(Default)] pub struct Config { @@ -947,7 +925,7 @@ impl Worker where self.executor.spawn( "polkadot-fetch-pov-block", async move { - let res = future::select(get_msg, AwaitCanceled { inner: &mut sender }).await; + let res = future::select(get_msg, sender.cancellation()).await; if let Either::Left((pov_block, _)) = res { let _ = sender.send(pov_block); } @@ -981,7 +959,7 @@ impl Worker where self.executor.spawn( "polkadot-fetch-erasure-chunk", async move { - let res = future::select(get_msg, AwaitCanceled { inner: &mut sender }).await; + let res = future::select(get_msg, sender.cancellation()).await; if let Either::Left((chunk, _)) = res { let _ = sender.send(chunk); } -- GitLab From 3f8cfb7d806802915a396087fcd346522d27f76a Mon Sep 17 00:00:00 2001 From: Cecile Tonglet Date: Thu, 9 Jul 2020 15:12:52 +0200 Subject: [PATCH 051/192] Make a test crate to make the runtime-test usable (#1258) Fixes #833 --- Cargo.lock | 342 ++++++++++++++--------- Cargo.toml | 1 + network/test/src/block_import.rs | 2 +- node/service/src/grandpa_support.rs | 8 +- node/test-service/Cargo.toml | 56 ++++ node/test-service/src/chain_spec.rs | 184 ++++++++++++ node/test-service/src/lib.rs | 307 ++++++++++++++++++++ node/test-service/tests/build-blocks.rs | 78 ++++++ node/test-service/tests/call-function.rs | 73 +++++ runtime/test-runtime/Cargo.toml | 7 + runtime/test-runtime/client/Cargo.toml | 25 +- runtime/test-runtime/client/src/lib.rs | 47 ++-- runtime/test-runtime/src/genesismap.rs | 75 ----- runtime/test-runtime/src/lib.rs | 83 ++++-- service/src/grandpa_support.rs | 10 +- service/src/lib.rs | 220 +++++++++------ 16 files changed, 1161 insertions(+), 357 deletions(-) create mode 100644 node/test-service/Cargo.toml create mode 100644 node/test-service/src/chain_spec.rs create mode 100644 node/test-service/src/lib.rs create mode 100644 node/test-service/tests/build-blocks.rs create mode 100644 node/test-service/tests/call-function.rs delete mode 100644 runtime/test-runtime/src/genesismap.rs diff --git a/Cargo.lock b/Cargo.lock index 9b53e65c3f..894eeab6f4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1285,7 +1285,7 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "fork-tree" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" +source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" dependencies = [ "parity-scale-codec", ] @@ -1293,7 +1293,7 @@ dependencies = [ [[package]] name = "frame-benchmarking" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" +source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" dependencies = [ "frame-support", "frame-system", @@ -1310,7 +1310,7 @@ dependencies = [ [[package]] name = "frame-benchmarking-cli" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" +source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" dependencies = [ "Inflector", "frame-benchmarking", @@ -1329,7 +1329,7 @@ dependencies = [ [[package]] name = "frame-executive" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" +source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" dependencies = [ "frame-support", "frame-system", @@ -1344,7 +1344,7 @@ dependencies = [ [[package]] name = "frame-metadata" version = "11.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" +source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" dependencies = [ "parity-scale-codec", "serde", @@ -1355,7 +1355,7 @@ dependencies = [ [[package]] name = "frame-support" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" +source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" dependencies = [ "bitmask", "frame-metadata", @@ -1380,7 +1380,7 @@ dependencies = [ [[package]] name = "frame-support-procedural" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" +source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" dependencies = [ "frame-support-procedural-tools", "proc-macro2 1.0.18", @@ -1391,7 +1391,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" +source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" dependencies = [ "frame-support-procedural-tools-derive", "proc-macro-crate", @@ -1403,7 +1403,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools-derive" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" +source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" dependencies = [ "proc-macro2 1.0.18", "quote 1.0.7", @@ -1413,7 +1413,7 @@ dependencies = [ [[package]] name = "frame-system" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" +source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" dependencies = [ "frame-support", "impl-trait-for-tuples", @@ -1429,7 +1429,7 @@ dependencies = [ [[package]] name = "frame-system-benchmarking" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" +source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" dependencies = [ "frame-benchmarking", "frame-support", @@ -1443,7 +1443,7 @@ dependencies = [ [[package]] name = "frame-system-rpc-runtime-api" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" +source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" dependencies = [ "parity-scale-codec", "sp-api", @@ -3409,7 +3409,7 @@ dependencies = [ [[package]] name = "pallet-authority-discovery" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" +source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" dependencies = [ "frame-support", "frame-system", @@ -3425,7 +3425,7 @@ dependencies = [ [[package]] name = "pallet-authorship" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" +source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" dependencies = [ "frame-support", "frame-system", @@ -3440,7 +3440,7 @@ dependencies = [ [[package]] name = "pallet-babe" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" +source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" dependencies = [ "frame-benchmarking", "frame-support", @@ -3465,7 +3465,7 @@ dependencies = [ [[package]] name = "pallet-balances" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" +source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" dependencies = [ "frame-benchmarking", "frame-support", @@ -3479,7 +3479,7 @@ dependencies = [ [[package]] name = "pallet-collective" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" +source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" dependencies = [ "frame-benchmarking", "frame-support", @@ -3495,7 +3495,7 @@ dependencies = [ [[package]] name = "pallet-democracy" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" +source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" dependencies = [ "frame-benchmarking", "frame-support", @@ -3510,7 +3510,7 @@ dependencies = [ [[package]] name = "pallet-elections-phragmen" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" +source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" dependencies = [ "frame-benchmarking", "frame-support", @@ -3525,7 +3525,7 @@ dependencies = [ [[package]] name = "pallet-finality-tracker" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" +source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" dependencies = [ "frame-support", "frame-system", @@ -3541,7 +3541,7 @@ dependencies = [ [[package]] name = "pallet-grandpa" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" +source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" dependencies = [ "frame-support", "frame-system", @@ -3561,7 +3561,7 @@ dependencies = [ [[package]] name = "pallet-identity" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" +source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" dependencies = [ "enumflags2", "frame-benchmarking", @@ -3577,7 +3577,7 @@ dependencies = [ [[package]] name = "pallet-im-online" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" +source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" dependencies = [ "frame-benchmarking", "frame-support", @@ -3597,7 +3597,7 @@ dependencies = [ [[package]] name = "pallet-indices" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" +source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" dependencies = [ "frame-support", "frame-system", @@ -3613,7 +3613,7 @@ dependencies = [ [[package]] name = "pallet-membership" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" +source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" dependencies = [ "frame-support", "frame-system", @@ -3627,7 +3627,7 @@ dependencies = [ [[package]] name = "pallet-multisig" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" +source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" dependencies = [ "frame-support", "frame-system", @@ -3642,7 +3642,7 @@ dependencies = [ [[package]] name = "pallet-nicks" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" +source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" dependencies = [ "frame-support", "frame-system", @@ -3656,7 +3656,7 @@ dependencies = [ [[package]] name = "pallet-offences" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" +source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" dependencies = [ "frame-support", "frame-system", @@ -3671,7 +3671,7 @@ dependencies = [ [[package]] name = "pallet-offences-benchmarking" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" +source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" dependencies = [ "frame-benchmarking", "frame-support", @@ -3692,7 +3692,7 @@ dependencies = [ [[package]] name = "pallet-proxy" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" +source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" dependencies = [ "frame-support", "frame-system", @@ -3707,7 +3707,7 @@ dependencies = [ [[package]] name = "pallet-randomness-collective-flip" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" +source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" dependencies = [ "frame-support", "frame-system", @@ -3720,7 +3720,7 @@ dependencies = [ [[package]] name = "pallet-recovery" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" +source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" dependencies = [ "enumflags2", "frame-support", @@ -3735,7 +3735,7 @@ dependencies = [ [[package]] name = "pallet-scheduler" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" +source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" dependencies = [ "frame-benchmarking", "frame-support", @@ -3750,7 +3750,7 @@ dependencies = [ [[package]] name = "pallet-session" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" +source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" dependencies = [ "frame-support", "frame-system", @@ -3770,7 +3770,7 @@ dependencies = [ [[package]] name = "pallet-session-benchmarking" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" +source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" dependencies = [ "frame-benchmarking", "frame-support", @@ -3786,7 +3786,7 @@ dependencies = [ [[package]] name = "pallet-society" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" +source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" dependencies = [ "frame-support", "frame-system", @@ -3800,7 +3800,7 @@ dependencies = [ [[package]] name = "pallet-staking" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" +source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" dependencies = [ "frame-benchmarking", "frame-support", @@ -3822,7 +3822,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-curve" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" +source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -3833,7 +3833,7 @@ dependencies = [ [[package]] name = "pallet-sudo" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" +source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" dependencies = [ "frame-support", "frame-system", @@ -3847,7 +3847,7 @@ dependencies = [ [[package]] name = "pallet-timestamp" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" +source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" dependencies = [ "frame-benchmarking", "frame-support", @@ -3865,7 +3865,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" +source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" dependencies = [ "frame-support", "frame-system", @@ -3880,7 +3880,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" +source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" dependencies = [ "jsonrpc-core", "jsonrpc-core-client", @@ -3898,7 +3898,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc-runtime-api" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" +source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" dependencies = [ "frame-support", "parity-scale-codec", @@ -3911,7 +3911,7 @@ dependencies = [ [[package]] name = "pallet-treasury" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" +source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" dependencies = [ "frame-benchmarking", "frame-support", @@ -3926,7 +3926,7 @@ dependencies = [ [[package]] name = "pallet-utility" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" +source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" dependencies = [ "frame-benchmarking", "frame-support", @@ -3942,7 +3942,7 @@ dependencies = [ [[package]] name = "pallet-vesting" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" +source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" dependencies = [ "enumflags2", "frame-benchmarking", @@ -4943,6 +4943,7 @@ dependencies = [ "hex-literal", "libsecp256k1", "log 0.3.9", + "pallet-authority-discovery", "pallet-authorship", "pallet-babe", "pallet-balances", @@ -4955,6 +4956,7 @@ dependencies = [ "pallet-session", "pallet-staking", "pallet-staking-reward-curve", + "pallet-sudo", "pallet-timestamp", "pallet-transaction-payment", "pallet-transaction-payment-rpc-runtime-api", @@ -4969,12 +4971,14 @@ dependencies = [ "serde_json", "smallvec 1.4.1", "sp-api", + "sp-authority-discovery", "sp-block-builder", "sp-consensus-babe", "sp-core", "sp-inherents", "sp-io", "sp-keyring", + "sp-offchain", "sp-runtime", "sp-session", "sp-staking", @@ -4996,6 +5000,7 @@ dependencies = [ "polkadot-primitives", "polkadot-runtime-common", "polkadot-test-runtime", + "polkadot-test-service", "sc-block-builder", "sc-client-api", "sc-consensus", @@ -5008,6 +5013,55 @@ dependencies = [ "substrate-test-client", ] +[[package]] +name = "polkadot-test-service" +version = "0.8.2" +dependencies = [ + "frame-benchmarking", + "frame-system", + "futures 0.1.29", + "futures 0.3.5", + "hex", + "log 0.4.8", + "pallet-balances", + "pallet-staking", + "pallet-transaction-payment", + "polkadot-availability-store", + "polkadot-network", + "polkadot-primitives", + "polkadot-rpc", + "polkadot-runtime-common", + "polkadot-service", + "polkadot-test-runtime", + "polkadot-validation", + "rand 0.7.3", + "sc-authority-discovery", + "sc-chain-spec", + "sc-client-api", + "sc-consensus", + "sc-consensus-babe", + "sc-executor", + "sc-finality-grandpa", + "sc-informant", + "sc-network", + "sc-service", + "sc-transaction-pool", + "serde_json", + "sp-arithmetic", + "sp-blockchain", + "sp-consensus", + "sp-consensus-babe", + "sp-core", + "sp-finality-grandpa", + "sp-inherents", + "sp-keyring", + "sp-runtime", + "sp-state-machine", + "substrate-test-client", + "tempfile", + "tokio 0.2.21", +] + [[package]] name = "polkadot-validation" version = "0.8.14" @@ -5820,7 +5874,7 @@ dependencies = [ [[package]] name = "sc-authority-discovery" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" +source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" dependencies = [ "bytes 0.5.4", "derive_more 0.99.8", @@ -5847,7 +5901,7 @@ dependencies = [ [[package]] name = "sc-basic-authorship" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" +source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -5871,7 +5925,7 @@ dependencies = [ [[package]] name = "sc-block-builder" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" +source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" dependencies = [ "parity-scale-codec", "sc-client-api", @@ -5888,7 +5942,7 @@ dependencies = [ [[package]] name = "sc-chain-spec" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" +source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" dependencies = [ "impl-trait-for-tuples", "sc-chain-spec-derive", @@ -5904,7 +5958,7 @@ dependencies = [ [[package]] name = "sc-chain-spec-derive" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" +source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -5915,7 +5969,7 @@ dependencies = [ [[package]] name = "sc-cli" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" +source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" dependencies = [ "ansi_term 0.12.1", "atty", @@ -5956,7 +6010,7 @@ dependencies = [ [[package]] name = "sc-client-api" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" +source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" dependencies = [ "derive_more 0.99.8", "fnv", @@ -5992,7 +6046,7 @@ dependencies = [ [[package]] name = "sc-client-db" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" +source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" dependencies = [ "blake2-rfc", "hash-db", @@ -6021,7 +6075,7 @@ dependencies = [ [[package]] name = "sc-consensus" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" +source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" dependencies = [ "sc-client-api", "sp-blockchain", @@ -6032,7 +6086,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" +source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" dependencies = [ "derive_more 0.99.8", "fork-tree", @@ -6074,7 +6128,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe-rpc" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" +source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" dependencies = [ "derive_more 0.99.8", "futures 0.3.5", @@ -6098,7 +6152,7 @@ dependencies = [ [[package]] name = "sc-consensus-epochs" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" +source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" dependencies = [ "fork-tree", "parity-scale-codec", @@ -6111,7 +6165,7 @@ dependencies = [ [[package]] name = "sc-consensus-slots" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" +source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6134,7 +6188,7 @@ dependencies = [ [[package]] name = "sc-consensus-uncles" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" +source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" dependencies = [ "log 0.4.8", "sc-client-api", @@ -6148,7 +6202,7 @@ dependencies = [ [[package]] name = "sc-executor" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" +source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" dependencies = [ "derive_more 0.99.8", "lazy_static", @@ -6176,7 +6230,7 @@ dependencies = [ [[package]] name = "sc-executor-common" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" +source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" dependencies = [ "derive_more 0.99.8", "log 0.4.8", @@ -6193,7 +6247,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmi" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" +source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" dependencies = [ "log 0.4.8", "parity-scale-codec", @@ -6208,7 +6262,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmtime" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" +source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" dependencies = [ "cranelift-codegen", "cranelift-wasm", @@ -6229,7 +6283,7 @@ dependencies = [ [[package]] name = "sc-finality-grandpa" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" +source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" dependencies = [ "assert_matches", "derive_more 0.99.8", @@ -6267,7 +6321,7 @@ dependencies = [ [[package]] name = "sc-finality-grandpa-rpc" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" +source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" dependencies = [ "derive_more 0.99.8", "finality-grandpa", @@ -6284,7 +6338,7 @@ dependencies = [ [[package]] name = "sc-informant" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" +source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" dependencies = [ "ansi_term 0.12.1", "futures 0.3.5", @@ -6302,7 +6356,7 @@ dependencies = [ [[package]] name = "sc-keystore" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" +source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" dependencies = [ "derive_more 0.99.8", "hex", @@ -6318,7 +6372,7 @@ dependencies = [ [[package]] name = "sc-light" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" +source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" dependencies = [ "hash-db", "lazy_static", @@ -6337,7 +6391,7 @@ dependencies = [ [[package]] name = "sc-network" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" +source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" dependencies = [ "bitflags", "bs58", @@ -6389,7 +6443,7 @@ dependencies = [ [[package]] name = "sc-network-gossip" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" +source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6404,7 +6458,7 @@ dependencies = [ [[package]] name = "sc-network-test" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" +source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" dependencies = [ "env_logger", "futures 0.3.5", @@ -6431,7 +6485,7 @@ dependencies = [ [[package]] name = "sc-offchain" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" +source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" dependencies = [ "bytes 0.5.4", "fnv", @@ -6458,7 +6512,7 @@ dependencies = [ [[package]] name = "sc-peerset" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" +source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" dependencies = [ "futures 0.3.5", "libp2p", @@ -6471,7 +6525,7 @@ dependencies = [ [[package]] name = "sc-proposer-metrics" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" +source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" dependencies = [ "log 0.4.8", "substrate-prometheus-endpoint", @@ -6480,7 +6534,7 @@ dependencies = [ [[package]] name = "sc-rpc" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" +source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" dependencies = [ "futures 0.3.5", "hash-db", @@ -6512,7 +6566,7 @@ dependencies = [ [[package]] name = "sc-rpc-api" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" +source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" dependencies = [ "derive_more 0.99.8", "futures 0.3.5", @@ -6536,7 +6590,7 @@ dependencies = [ [[package]] name = "sc-rpc-server" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" +source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" dependencies = [ "jsonrpc-core", "jsonrpc-http-server", @@ -6552,7 +6606,7 @@ dependencies = [ [[package]] name = "sc-service" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" +source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" dependencies = [ "derive_more 0.99.8", "directories", @@ -6615,7 +6669,7 @@ dependencies = [ [[package]] name = "sc-state-db" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" +source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" dependencies = [ "log 0.4.8", "parity-scale-codec", @@ -6629,7 +6683,7 @@ dependencies = [ [[package]] name = "sc-telemetry" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" +source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6650,7 +6704,7 @@ dependencies = [ [[package]] name = "sc-tracing" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" +source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" dependencies = [ "erased-serde", "log 0.4.8", @@ -6667,7 +6721,7 @@ dependencies = [ [[package]] name = "sc-transaction-graph" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" +source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" dependencies = [ "derive_more 0.99.8", "futures 0.3.5", @@ -6687,7 +6741,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" +source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" dependencies = [ "derive_more 0.99.8", "futures 0.3.5", @@ -7094,7 +7148,7 @@ dependencies = [ [[package]] name = "sp-allocator" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" +source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" dependencies = [ "derive_more 0.99.8", "log 0.4.8", @@ -7106,7 +7160,7 @@ dependencies = [ [[package]] name = "sp-api" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" +source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" dependencies = [ "hash-db", "parity-scale-codec", @@ -7121,7 +7175,7 @@ dependencies = [ [[package]] name = "sp-api-proc-macro" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" +source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" dependencies = [ "blake2-rfc", "proc-macro-crate", @@ -7133,7 +7187,7 @@ dependencies = [ [[package]] name = "sp-application-crypto" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" +source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" dependencies = [ "parity-scale-codec", "serde", @@ -7145,7 +7199,7 @@ dependencies = [ [[package]] name = "sp-arithmetic" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" +source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" dependencies = [ "integer-sqrt", "num-traits 0.2.12", @@ -7158,7 +7212,7 @@ dependencies = [ [[package]] name = "sp-authority-discovery" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" +source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" dependencies = [ "parity-scale-codec", "sp-api", @@ -7170,7 +7224,7 @@ dependencies = [ [[package]] name = "sp-authorship" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" +source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" dependencies = [ "parity-scale-codec", "sp-inherents", @@ -7181,7 +7235,7 @@ dependencies = [ [[package]] name = "sp-block-builder" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" +source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" dependencies = [ "parity-scale-codec", "sp-api", @@ -7193,7 +7247,7 @@ dependencies = [ [[package]] name = "sp-blockchain" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" +source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" dependencies = [ "derive_more 0.99.8", "log 0.4.8", @@ -7209,7 +7263,7 @@ dependencies = [ [[package]] name = "sp-chain-spec" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" +source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" dependencies = [ "serde", "serde_json", @@ -7218,7 +7272,7 @@ dependencies = [ [[package]] name = "sp-consensus" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" +source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" dependencies = [ "derive_more 0.99.8", "futures 0.3.5", @@ -7242,7 +7296,7 @@ dependencies = [ [[package]] name = "sp-consensus-aura" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" +source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" dependencies = [ "parity-scale-codec", "sp-api", @@ -7256,7 +7310,7 @@ dependencies = [ [[package]] name = "sp-consensus-babe" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" +source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" dependencies = [ "merlin", "parity-scale-codec", @@ -7275,7 +7329,7 @@ dependencies = [ [[package]] name = "sp-consensus-slots" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" +source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" dependencies = [ "parity-scale-codec", "sp-runtime", @@ -7284,7 +7338,7 @@ dependencies = [ [[package]] name = "sp-consensus-vrf" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" +source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" dependencies = [ "parity-scale-codec", "schnorrkel", @@ -7296,7 +7350,7 @@ dependencies = [ [[package]] name = "sp-core" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" +source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" dependencies = [ "base58", "blake2-rfc", @@ -7339,7 +7393,7 @@ dependencies = [ [[package]] name = "sp-database" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" +source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" dependencies = [ "kvdb", "parking_lot 0.10.2", @@ -7348,7 +7402,7 @@ dependencies = [ [[package]] name = "sp-debug-derive" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" +source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" dependencies = [ "proc-macro2 1.0.18", "quote 1.0.7", @@ -7358,7 +7412,7 @@ dependencies = [ [[package]] name = "sp-externalities" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" +source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" dependencies = [ "environmental", "parity-scale-codec", @@ -7369,7 +7423,7 @@ dependencies = [ [[package]] name = "sp-finality-grandpa" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" +source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" dependencies = [ "finality-grandpa", "log 0.4.8", @@ -7385,7 +7439,7 @@ dependencies = [ [[package]] name = "sp-finality-tracker" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" +source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" dependencies = [ "parity-scale-codec", "sp-inherents", @@ -7395,7 +7449,7 @@ dependencies = [ [[package]] name = "sp-inherents" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" +source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" dependencies = [ "derive_more 0.99.8", "parity-scale-codec", @@ -7407,7 +7461,7 @@ dependencies = [ [[package]] name = "sp-io" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" +source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" dependencies = [ "futures 0.3.5", "hash-db", @@ -7428,7 +7482,7 @@ dependencies = [ [[package]] name = "sp-keyring" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" +source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" dependencies = [ "lazy_static", "sp-core", @@ -7439,7 +7493,7 @@ dependencies = [ [[package]] name = "sp-npos-elections" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" +source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" dependencies = [ "parity-scale-codec", "serde", @@ -7451,7 +7505,7 @@ dependencies = [ [[package]] name = "sp-npos-elections-compact" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" +source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -7462,7 +7516,7 @@ dependencies = [ [[package]] name = "sp-offchain" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" +source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" dependencies = [ "sp-api", "sp-core", @@ -7472,7 +7526,7 @@ dependencies = [ [[package]] name = "sp-panic-handler" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" +source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" dependencies = [ "backtrace", "log 0.4.8", @@ -7481,7 +7535,7 @@ dependencies = [ [[package]] name = "sp-rpc" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" +source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" dependencies = [ "serde", "sp-core", @@ -7490,7 +7544,7 @@ dependencies = [ [[package]] name = "sp-runtime" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" +source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" dependencies = [ "either", "hash256-std-hasher", @@ -7512,7 +7566,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" +source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" dependencies = [ "parity-scale-codec", "primitive-types", @@ -7527,7 +7581,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" +source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" dependencies = [ "Inflector", "proc-macro-crate", @@ -7539,7 +7593,7 @@ dependencies = [ [[package]] name = "sp-serializer" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" +source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" dependencies = [ "serde", "serde_json", @@ -7548,7 +7602,7 @@ dependencies = [ [[package]] name = "sp-session" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" +source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" dependencies = [ "parity-scale-codec", "sp-api", @@ -7561,7 +7615,7 @@ dependencies = [ [[package]] name = "sp-staking" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" +source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" dependencies = [ "parity-scale-codec", "sp-runtime", @@ -7571,7 +7625,7 @@ dependencies = [ [[package]] name = "sp-state-machine" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" +source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" dependencies = [ "hash-db", "itertools 0.9.0", @@ -7592,12 +7646,12 @@ dependencies = [ [[package]] name = "sp-std" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" +source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" [[package]] name = "sp-storage" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" +source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" dependencies = [ "impl-serde 0.2.3", "ref-cast", @@ -7609,7 +7663,7 @@ dependencies = [ [[package]] name = "sp-timestamp" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" +source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -7623,7 +7677,7 @@ dependencies = [ [[package]] name = "sp-tracing" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" +source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" dependencies = [ "log 0.4.8", "rental", @@ -7633,7 +7687,7 @@ dependencies = [ [[package]] name = "sp-transaction-pool" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" +source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" dependencies = [ "derive_more 0.99.8", "futures 0.3.5", @@ -7649,7 +7703,7 @@ dependencies = [ [[package]] name = "sp-trie" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" +source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" dependencies = [ "hash-db", "memory-db", @@ -7663,7 +7717,7 @@ dependencies = [ [[package]] name = "sp-utils" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" +source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" dependencies = [ "futures 0.3.5", "futures-core", @@ -7675,7 +7729,7 @@ dependencies = [ [[package]] name = "sp-version" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" +source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" dependencies = [ "impl-serde 0.2.3", "parity-scale-codec", @@ -7687,7 +7741,7 @@ dependencies = [ [[package]] name = "sp-wasm-interface" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" +source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -7827,7 +7881,7 @@ dependencies = [ [[package]] name = "substrate-browser-utils" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" +source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" dependencies = [ "chrono", "clear_on_drop", @@ -7854,7 +7908,7 @@ dependencies = [ [[package]] name = "substrate-build-script-utils" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" +source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" dependencies = [ "platforms", ] @@ -7862,7 +7916,7 @@ dependencies = [ [[package]] name = "substrate-frame-rpc-system" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" +source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" dependencies = [ "frame-system-rpc-runtime-api", "futures 0.3.5", @@ -7885,7 +7939,7 @@ dependencies = [ [[package]] name = "substrate-prometheus-endpoint" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" +source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" dependencies = [ "async-std", "derive_more 0.99.8", @@ -7899,7 +7953,7 @@ dependencies = [ [[package]] name = "substrate-test-client" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" +source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" dependencies = [ "futures 0.1.29", "futures 0.3.5", @@ -7912,6 +7966,8 @@ dependencies = [ "sc-executor", "sc-light", "sc-service", + "serde", + "serde_json", "sp-blockchain", "sp-consensus", "sp-core", @@ -7923,7 +7979,7 @@ dependencies = [ [[package]] name = "substrate-test-runtime" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" +source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" dependencies = [ "cfg-if", "frame-executive", @@ -7963,7 +8019,7 @@ dependencies = [ [[package]] name = "substrate-test-runtime-client" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" +source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" dependencies = [ "futures 0.3.5", "parity-scale-codec", @@ -7984,7 +8040,7 @@ dependencies = [ [[package]] name = "substrate-wasm-builder-runner" version = "1.0.6" -source = "git+https://github.com/paritytech/substrate#e824e8ab0fadec9949ebb8b9e14d98703d6b8d44" +source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" [[package]] name = "substrate-wasm-builder-runner" @@ -8419,6 +8475,7 @@ dependencies = [ "pin-project-lite", "signal-hook-registry", "slab", + "tokio-macros", "winapi 0.3.8", ] @@ -8497,6 +8554,17 @@ dependencies = [ "log 0.4.8", ] +[[package]] +name = "tokio-macros" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0c3acc6aa564495a0f2e1d59fab677cd7f81a19994cfc7f3ad0e64301560389" +dependencies = [ + "proc-macro2 1.0.18", + "quote 1.0.7", + "syn 1.0.31", +] + [[package]] name = "tokio-named-pipes" version = "0.1.0" diff --git a/Cargo.toml b/Cargo.toml index fa5fa16279..fe5bbcf2f9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -52,6 +52,7 @@ members = [ "node/service", "node/subsystem", "node/test-helpers/subsystem", + "node/test-service", "parachain/test-parachains", "parachain/test-parachains/adder", diff --git a/network/test/src/block_import.rs b/network/test/src/block_import.rs index ec848609cd..68b0291e50 100644 --- a/network/test/src/block_import.rs +++ b/network/test/src/block_import.rs @@ -29,7 +29,7 @@ fn prepare_good_block() -> (TestClient, Hash, u64, PeerId, IncomingBlock) let mut client = polkadot_test_runtime_client::new(); let mut builder = client.new_block(Default::default()).unwrap(); - let extrinsics = polkadot_test_runtime_client::needed_extrinsics(vec![]); + let extrinsics = polkadot_test_runtime_client::needed_extrinsics(vec![], 0); for extrinsic in &extrinsics { builder.push(extrinsic.clone()).unwrap(); diff --git a/node/service/src/grandpa_support.rs b/node/service/src/grandpa_support.rs index a875c4b45a..806a189d9f 100644 --- a/node/service/src/grandpa_support.rs +++ b/node/service/src/grandpa_support.rs @@ -250,17 +250,21 @@ mod tests { let mut push_blocks = { let mut client = client.clone(); + let mut base = 0; + move |n| { - for _ in 0..n { + for i in 0..n { let mut builder = client.new_block(Default::default()).unwrap(); - for extrinsic in polkadot_test_runtime_client::needed_extrinsics(vec![]) { + for extrinsic in polkadot_test_runtime_client::needed_extrinsics(vec![], base + i) { builder.push(extrinsic).unwrap() } let block = builder.build().unwrap().block; client.import(BlockOrigin::Own, block).unwrap(); } + + base += n; } }; diff --git a/node/test-service/Cargo.toml b/node/test-service/Cargo.toml new file mode 100644 index 0000000000..db6328a9aa --- /dev/null +++ b/node/test-service/Cargo.toml @@ -0,0 +1,56 @@ +[package] +name = "polkadot-test-service" +version = "0.8.2" +authors = ["Parity Technologies "] +edition = "2018" + +[dependencies] +futures = "0.3.4" +futures01 = { package = "futures", version = "0.1.29" } +hex = "0.4" +log = "0.4.8" +rand = "0.7.3" +tempfile = "3.1.0" + +# Polkadot dependencies +av_store = { package = "polkadot-availability-store", path = "../../availability-store" } +consensus = { package = "polkadot-validation", path = "../../validation" } +polkadot-network = { path = "../../network" } +polkadot-primitives = { path = "../../primitives" } +polkadot-rpc = { path = "../../rpc" } +polkadot-runtime-common = { path = "../../runtime/common" } +polkadot-service = { path = "../../service" } +polkadot-test-runtime = { path = "../../runtime/test-runtime" } + +# Substrate dependencies +authority-discovery = { package = "sc-authority-discovery", git = "https://github.com/paritytech/substrate", branch = "master" } +babe = { package = "sc-consensus-babe", git = "https://github.com/paritytech/substrate", branch = "master" } +babe-primitives = { package = "sp-consensus-babe", git = "https://github.com/paritytech/substrate", branch = "master" } +consensus_common = { package = "sp-consensus", git = "https://github.com/paritytech/substrate", branch = "master" } +frame-benchmarking = { git = "https://github.com/paritytech/substrate", branch = "master" } +frame-system = { git = "https://github.com/paritytech/substrate", branch = "master" } +grandpa = { package = "sc-finality-grandpa", git = "https://github.com/paritytech/substrate", branch = "master" } +grandpa_primitives = { package = "sp-finality-grandpa", git = "https://github.com/paritytech/substrate", branch = "master" } +inherents = { package = "sp-inherents", git = "https://github.com/paritytech/substrate", branch = "master" } +pallet-staking = { git = "https://github.com/paritytech/substrate", branch = "master" } +pallet-transaction-payment = { git = "https://github.com/paritytech/substrate", branch = "master" } +sc-chain-spec = { git = "https://github.com/paritytech/substrate", branch = "master" } +sc-client-api = { git = "https://github.com/paritytech/substrate", branch = "master" } +sc-consensus = { git = "https://github.com/paritytech/substrate", branch = "master" } +sc-executor = { git = "https://github.com/paritytech/substrate", branch = "master" } +sc-informant = { git = "https://github.com/paritytech/substrate", branch = "master" } +sc-network = { git = "https://github.com/paritytech/substrate", branch = "master" } +sc-transaction-pool = { git = "https://github.com/paritytech/substrate", branch = "master" } +service = { package = "sc-service", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +sp-arithmetic = { git = "https://github.com/paritytech/substrate", branch = "master" } +sp-blockchain = { git = "https://github.com/paritytech/substrate", branch = "master" } +sp-core = { git = "https://github.com/paritytech/substrate", branch = "master" } +sp-keyring = { git = "https://github.com/paritytech/substrate", branch = "master" } +sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "master" } +sp-state-machine = { git = "https://github.com/paritytech/substrate", branch = "master" } +substrate-test-client = { git = "https://github.com/paritytech/substrate", branch = "master" } + +[dev-dependencies] +pallet-balances = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +serde_json = "1.0" +tokio = { version = "0.2", features = ["macros"] } diff --git a/node/test-service/src/chain_spec.rs b/node/test-service/src/chain_spec.rs new file mode 100644 index 0000000000..cbb08c470f --- /dev/null +++ b/node/test-service/src/chain_spec.rs @@ -0,0 +1,184 @@ +// Copyright 2020 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 . + +use babe_primitives::AuthorityId as BabeId; +use grandpa::AuthorityId as GrandpaId; +use pallet_staking::Forcing; +use polkadot_primitives::{parachain::ValidatorId, AccountId}; +use polkadot_service::chain_spec::{get_account_id_from_seed, get_from_seed, Extensions}; +use polkadot_test_runtime::constants::currency::DOTS; +use sc_chain_spec::{ChainSpec, ChainType}; +use sp_core::{sr25519, ChangesTrieConfiguration}; +use sp_runtime::Perbill; + +const DEFAULT_PROTOCOL_ID: &str = "dot"; + +/// The `ChainSpec parametrised for polkadot runtime`. +pub type PolkadotChainSpec = + service::GenericChainSpec; + +/// Polkadot local testnet config (multivalidator Alice + Bob) +pub fn polkadot_local_testnet_config() -> PolkadotChainSpec { + PolkadotChainSpec::from_genesis( + "Local Testnet", + "local_testnet", + ChainType::Local, + || polkadot_local_testnet_genesis(None), + vec![], + None, + Some(DEFAULT_PROTOCOL_ID), + None, + Default::default(), + ) +} + +/// Polkadot local testnet genesis config (multivalidator Alice + Bob) +pub fn polkadot_local_testnet_genesis( + changes_trie_config: Option, +) -> polkadot_test_runtime::GenesisConfig { + polkadot_testnet_genesis( + vec![ + get_authority_keys_from_seed("Alice"), + get_authority_keys_from_seed("Bob"), + get_authority_keys_from_seed("Charlie"), + ], + get_account_id_from_seed::("Alice"), + None, + changes_trie_config, + ) +} + +/// Helper function to generate stash, controller and session key from seed +fn get_authority_keys_from_seed( + seed: &str, +) -> (AccountId, AccountId, BabeId, GrandpaId, ValidatorId) { + ( + get_account_id_from_seed::(&format!("{}//stash", seed)), + get_account_id_from_seed::(seed), + get_from_seed::(seed), + get_from_seed::(seed), + get_from_seed::(seed), + ) +} + +fn testnet_accounts() -> Vec { + vec![ + get_account_id_from_seed::("Alice"), + get_account_id_from_seed::("Bob"), + get_account_id_from_seed::("Charlie"), + get_account_id_from_seed::("Dave"), + get_account_id_from_seed::("Eve"), + get_account_id_from_seed::("Ferdie"), + get_account_id_from_seed::("Alice//stash"), + get_account_id_from_seed::("Bob//stash"), + get_account_id_from_seed::("Charlie//stash"), + get_account_id_from_seed::("Dave//stash"), + get_account_id_from_seed::("Eve//stash"), + get_account_id_from_seed::("Ferdie//stash"), + ] +} + +/// Helper function to create polkadot GenesisConfig for testing +fn polkadot_testnet_genesis( + initial_authorities: Vec<(AccountId, AccountId, BabeId, GrandpaId, ValidatorId)>, + root_key: AccountId, + endowed_accounts: Option>, + changes_trie_config: Option, +) -> polkadot_test_runtime::GenesisConfig { + use polkadot_test_runtime as polkadot; + + let endowed_accounts: Vec = endowed_accounts.unwrap_or_else(testnet_accounts); + + const ENDOWMENT: u128 = 1_000_000 * DOTS; + const STASH: u128 = 100 * DOTS; + + polkadot::GenesisConfig { + system: Some(polkadot::SystemConfig { + code: polkadot::WASM_BINARY.to_vec(), + changes_trie_config, + }), + indices: Some(polkadot::IndicesConfig { indices: vec![] }), + balances: Some(polkadot::BalancesConfig { + balances: endowed_accounts + .iter() + .map(|k| (k.clone(), ENDOWMENT)) + .collect(), + }), + session: Some(polkadot::SessionConfig { + keys: initial_authorities + .iter() + .map(|x| { + ( + x.0.clone(), + x.0.clone(), + polkadot_test_runtime::SessionKeys { + babe: x.2.clone(), + grandpa: x.3.clone(), + parachain_validator: x.4.clone(), + }, + ) + }) + .collect::>(), + }), + staking: Some(polkadot::StakingConfig { + minimum_validator_count: 1, + validator_count: 2, + stakers: initial_authorities + .iter() + .map(|x| { + ( + x.0.clone(), + x.1.clone(), + STASH, + polkadot::StakerStatus::Validator, + ) + }) + .collect(), + invulnerables: initial_authorities.iter().map(|x| x.0.clone()).collect(), + force_era: Forcing::NotForcing, + slash_reward_fraction: Perbill::from_percent(10), + ..Default::default() + }), + babe: Some(Default::default()), + grandpa: Some(Default::default()), + authority_discovery: Some(polkadot::AuthorityDiscoveryConfig { keys: vec![] }), + parachains: Some(polkadot::ParachainsConfig { + authorities: vec![], + }), + registrar: Some(polkadot::RegistrarConfig { + parachains: vec![], + _phdata: Default::default(), + }), + claims: Some(polkadot::ClaimsConfig { + claims: vec![], + vesting: vec![], + }), + vesting: Some(polkadot::VestingConfig { vesting: vec![] }), + sudo: Some(polkadot::SudoConfig { key: root_key }), + } +} + +/// Can be called for a `Configuration` to check if it is a configuration for the `Test` network. +pub trait IdentifyVariant { + /// Returns if this is a configuration for the `Test` network. + fn is_test(&self) -> bool; +} + +impl IdentifyVariant for Box { + fn is_test(&self) -> bool { + self.id().starts_with("test") + } +} diff --git a/node/test-service/src/lib.rs b/node/test-service/src/lib.rs new file mode 100644 index 0000000000..7fc75d9f37 --- /dev/null +++ b/node/test-service/src/lib.rs @@ -0,0 +1,307 @@ +// Copyright 2020 Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Polkadot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . + +//! Polkadot test service only. + +#![warn(missing_docs)] + +mod chain_spec; + +pub use chain_spec::*; +use consensus_common::{block_validation::Chain, SelectChain}; +use futures::future::Future; +use grandpa::FinalityProofProvider as GrandpaFinalityProofProvider; +use log::info; +use polkadot_network::{legacy::gossip::Known, protocol as network_protocol}; +use polkadot_primitives::{ + parachain::{self, CollatorId}, + Block, BlockId, Hash, +}; +use polkadot_runtime_common::{parachains, registrar, BlockHashCount}; +use polkadot_service::{ + new_full, new_full_start, FullNodeHandles, PolkadotClient, ServiceComponents, +}; +use polkadot_test_runtime::{RestrictFunctionality, Runtime, SignedExtra, SignedPayload, VERSION}; +use sc_chain_spec::ChainSpec; +use sc_client_api::{execution_extensions::ExecutionStrategies, BlockchainEvents}; +use sc_executor::native_executor_instance; +use sc_informant::OutputFormat; +use sc_network::{ + config::{NetworkConfiguration, TransportConfig}, + multiaddr, NetworkService, +}; +use service::{ + config::{DatabaseConfig, KeystoreConfig, MultiaddrWithPeerId, WasmExecutionMethod}, + error::Error as ServiceError, + RpcHandlers, TaskExecutor, TaskManager, +}; +use service::{BasePath, Configuration, Role, TFullBackend}; +use sp_arithmetic::traits::SaturatedConversion; +use sp_blockchain::HeaderBackend; +use sp_keyring::Sr25519Keyring; +use sp_runtime::{codec::Encode, generic}; +use sp_state_machine::BasicExternalities; +use std::sync::Arc; +use std::time::Duration; +use substrate_test_client::{BlockchainEventsExt, RpcHandlersExt, RpcTransactionOutput, RpcTransactionError}; + +native_executor_instance!( + pub PolkadotTestExecutor, + polkadot_test_runtime::api::dispatch, + polkadot_test_runtime::native_version, + frame_benchmarking::benchmarking::HostFunctions, +); + +/// Create a new Polkadot test service for a full node. +pub fn polkadot_test_new_full( + config: Configuration, + collating_for: Option<(CollatorId, parachain::Id)>, + max_block_data_size: Option, + authority_discovery_enabled: bool, + slot_duration: u64, +) -> Result< + ( + TaskManager, + Arc, polkadot_test_runtime::RuntimeApi>>, + FullNodeHandles, + Arc>, + Arc, + ), + ServiceError, +> { + let (task_manager, client, handles, network, rpc_handlers) = new_full!(test + config, + collating_for, + max_block_data_size, + authority_discovery_enabled, + slot_duration, + polkadot_test_runtime::RuntimeApi, + PolkadotTestExecutor, + ); + + Ok((task_manager, client, handles, network, rpc_handlers)) +} + +/// Create a Polkadot `Configuration`. By default an in-memory socket will be used, therefore you need to provide boot +/// nodes if you want the future node to be connected to other nodes. The `storage_update_func` can be used to make +/// adjustements to the runtime before the node starts. +pub fn node_config( + storage_update_func: impl Fn(), + task_executor: TaskExecutor, + key: Sr25519Keyring, + boot_nodes: Vec, +) -> Configuration { + let base_path = BasePath::new_temp_dir().expect("could not create temporary directory"); + let root = base_path.path(); + let role = Role::Authority { + sentry_nodes: Vec::new(), + }; + let key_seed = key.to_seed(); + let mut spec = polkadot_local_testnet_config(); + let mut storage = spec + .as_storage_builder() + .build_storage() + .expect("could not build storage"); + + BasicExternalities::execute_with_storage(&mut storage, storage_update_func); + spec.set_storage(storage); + + let mut network_config = NetworkConfiguration::new( + format!("Polkadot Test Node for: {}", key_seed), + "network/test/0.1", + Default::default(), + None, + ); + let informant_output_format = OutputFormat { + enable_color: false, + prefix: format!("[{}] ", key_seed), + }; + + network_config.boot_nodes = boot_nodes; + + network_config.allow_non_globals_in_dht = true; + + network_config + .listen_addresses + .push(multiaddr::Protocol::Memory(rand::random()).into()); + + network_config.transport = TransportConfig::MemoryOnly; + + Configuration { + impl_name: "polkadot-test-node".to_string(), + impl_version: "0.1".to_string(), + role, + task_executor, + transaction_pool: Default::default(), + network: network_config, + keystore: KeystoreConfig::Path { + path: root.join("key"), + password: None, + }, + database: DatabaseConfig::RocksDb { + path: root.join("db"), + cache_size: 128, + }, + state_cache_size: 16777216, + state_cache_child_ratio: None, + pruning: Default::default(), + chain_spec: Box::new(spec), + wasm_method: WasmExecutionMethod::Interpreted, + // NOTE: we enforce the use of the native runtime to make the errors more debuggable + execution_strategies: ExecutionStrategies { + syncing: sc_client_api::ExecutionStrategy::NativeWhenPossible, + importing: sc_client_api::ExecutionStrategy::NativeWhenPossible, + block_construction: sc_client_api::ExecutionStrategy::NativeWhenPossible, + offchain_worker: sc_client_api::ExecutionStrategy::NativeWhenPossible, + other: sc_client_api::ExecutionStrategy::NativeWhenPossible, + }, + rpc_http: None, + rpc_ws: None, + rpc_ipc: None, + rpc_ws_max_connections: None, + rpc_cors: None, + rpc_methods: Default::default(), + prometheus_config: None, + telemetry_endpoints: None, + telemetry_external_transport: None, + default_heap_pages: None, + offchain_worker: Default::default(), + force_authoring: false, + disable_grandpa: false, + dev_key_seed: Some(key_seed), + tracing_targets: None, + tracing_receiver: Default::default(), + max_runtime_instances: 8, + announce_block: true, + base_path: Some(base_path), + informant_output_format, + } +} + +/// Run a Polkadot test node using the Polkadot test runtime. The node will be using an in-memory socket, therefore you +/// need to provide boot nodes if you want it to be connected to other nodes. The `storage_update_func` can be used to +/// make adjustements to the runtime before the node starts. +pub fn run_test_node( + task_executor: TaskExecutor, + key: Sr25519Keyring, + storage_update_func: impl Fn(), + boot_nodes: Vec, +) -> PolkadotTestNode< + TaskManager, + impl PolkadotClient, polkadot_test_runtime::RuntimeApi>, +> { + let config = node_config(storage_update_func, task_executor, key, boot_nodes); + let multiaddr = config.network.listen_addresses[0].clone(); + let authority_discovery_enabled = false; + let (task_manager, client, handles, network, rpc_handlers) = + polkadot_test_new_full(config, None, None, authority_discovery_enabled, 6000) + .expect("could not create Polkadot test service"); + + let peer_id = network.local_peer_id().clone(); + let addr = MultiaddrWithPeerId { multiaddr, peer_id }; + + PolkadotTestNode { + task_manager, + client, + handles, + addr, + rpc_handlers, + } +} + +/// A Polkadot test node instance used for testing. +pub struct PolkadotTestNode { + /// TaskManager's instance. + pub task_manager: S, + /// Client's instance. + pub client: Arc, + /// Node's handles. + pub handles: FullNodeHandles, + /// The `MultiaddrWithPeerId` to this node. This is useful if you want to pass it as "boot node" to other nodes. + pub addr: MultiaddrWithPeerId, + /// RPCHandlers to make RPC queries. + pub rpc_handlers: Arc, +} + +impl PolkadotTestNode +where + C: HeaderBackend, +{ + /// Send a transaction through RPCHandlers to call a function. + pub async fn call_function( + &self, + function: polkadot_test_runtime::Call, + caller: Sr25519Keyring, + ) -> Result { + let current_block_hash = self.client.info().best_hash; + let current_block = self.client.info().best_number.saturated_into(); + let genesis_block = self.client.hash(0).unwrap().unwrap(); + let nonce = 0; + let period = BlockHashCount::get() + .checked_next_power_of_two() + .map(|c| c / 2) + .unwrap_or(2) as u64; + let tip = 0; + let extra: SignedExtra = ( + RestrictFunctionality, + frame_system::CheckSpecVersion::::new(), + frame_system::CheckTxVersion::::new(), + frame_system::CheckGenesis::::new(), + frame_system::CheckEra::::from(generic::Era::mortal(period, current_block)), + frame_system::CheckNonce::::from(nonce), + frame_system::CheckWeight::::new(), + pallet_transaction_payment::ChargeTransactionPayment::::from(tip), + registrar::LimitParathreadCommits::::new(), + parachains::ValidateDoubleVoteReports::::new(), + ); + let raw_payload = SignedPayload::from_raw( + function.clone(), + extra.clone(), + ( + (), + VERSION.spec_version, + VERSION.transaction_version, + genesis_block, + current_block_hash, + (), + (), + (), + (), + (), + ), + ); + let signature = raw_payload.using_encoded(|e| caller.sign(e)); + let extrinsic = polkadot_test_runtime::UncheckedExtrinsic::new_signed( + function.clone(), + polkadot_test_runtime::Address::Id(caller.public().into()), + polkadot_primitives::Signature::Sr25519(signature.clone()), + extra.clone(), + ); + + self.rpc_handlers.send_transaction(extrinsic.into()).await + } +} + +impl PolkadotTestNode +where + C: BlockchainEvents, +{ + /// Wait for `count` blocks to be imported in the node and then exit. This function will not return if no blocks + /// are ever created, thus you should restrict the maximum amount of time of the test execution. + pub fn wait_for_blocks(&self, count: usize) -> impl Future { + self.client.wait_for_blocks(count) + } +} diff --git a/node/test-service/tests/build-blocks.rs b/node/test-service/tests/build-blocks.rs new file mode 100644 index 0000000000..65771dda05 --- /dev/null +++ b/node/test-service/tests/build-blocks.rs @@ -0,0 +1,78 @@ +// Copyright 2020 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 . + +use tokio::{time::delay_for as sleep, task::spawn}; +use futures::{future, pin_mut, select, FutureExt as _}; +use polkadot_test_service::*; +use service::TaskExecutor; +use sp_keyring::Sr25519Keyring; +use std::time::Duration; + +static INTEGRATION_TEST_ALLOWED_TIME: Option<&str> = option_env!("INTEGRATION_TEST_ALLOWED_TIME"); + +#[tokio::test] +async fn ensure_test_service_build_blocks() { + let task_executor: TaskExecutor = (move |fut, _| { + spawn(fut); + }) + .into(); + let mut alice = run_test_node( + task_executor.clone(), + Sr25519Keyring::Alice, + || {}, + Vec::new(), + ); + let mut bob = run_test_node( + task_executor.clone(), + Sr25519Keyring::Bob, + || {}, + vec![alice.addr.clone()], + ); + let t1 = sleep(Duration::from_secs( + INTEGRATION_TEST_ALLOWED_TIME + .and_then(|x| x.parse().ok()) + .unwrap_or(600), + )) + .fuse(); + let t2 = async { + { + let t1 = future::join(alice.wait_for_blocks(3), bob.wait_for_blocks(3)).fuse(); + let t2 = alice.task_manager.future().fuse(); + let t3 = bob.task_manager.future().fuse(); + + pin_mut!(t1, t2, t3); + + select! { + _ = t1 => {}, + _ = t2 => panic!("service Alice failed"), + _ = t3 => panic!("service Bob failed"), + } + } + + alice.task_manager.terminate(); + bob.task_manager.terminate(); + } + .fuse(); + + pin_mut!(t1, t2); + + select! { + _ = t1 => { + panic!("the test took too long, maybe no blocks have been produced"); + }, + _ = t2 => {}, + } +} diff --git a/node/test-service/tests/call-function.rs b/node/test-service/tests/call-function.rs new file mode 100644 index 0000000000..b7b191fdab --- /dev/null +++ b/node/test-service/tests/call-function.rs @@ -0,0 +1,73 @@ +// Copyright 2020 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 . + +use tokio::{time::delay_for as sleep, task::spawn}; +use futures::{pin_mut, select, FutureExt as _}; +use polkadot_test_service::*; +use sp_keyring::Sr25519Keyring::{Alice, Bob}; +use std::time::Duration; + +static INTEGRATION_TEST_ALLOWED_TIME: Option<&str> = option_env!("INTEGRATION_TEST_ALLOWED_TIME"); + +#[tokio::test] +async fn call_function_actually_work() { + let mut alice = run_test_node( + (move |fut, _| { + spawn(fut); + }) + .into(), + Alice, + || {}, + Vec::new(), + ); + let t1 = sleep(Duration::from_secs( + INTEGRATION_TEST_ALLOWED_TIME + .and_then(|x| x.parse().ok()) + .unwrap_or(600), + )) + .fuse(); + let t2 = async { + let function = polkadot_test_runtime::Call::Balances(pallet_balances::Call::transfer( + Default::default(), + 1, + )); + let output = alice.call_function(function, Bob).await.unwrap(); + + let res = output.result.expect("return value expected"); + let json = serde_json::from_str::(res.as_str()).expect("valid JSON"); + let object = json.as_object().expect("JSON is an object"); + assert!(object.contains_key("jsonrpc"), "key jsonrpc exists"); + let result = object.get("result"); + let result = result.expect("key result exists"); + assert_eq!( + result.as_str().map(|x| x.starts_with("0x")), + Some(true), + "result starts with 0x" + ); + + alice.task_manager.terminate(); + } + .fuse(); + + pin_mut!(t1, t2); + + select! { + _ = t1 => { + panic!("the test took too long, maybe no blocks have been produced"); + }, + _ = t2 => {}, + } +} diff --git a/runtime/test-runtime/Cargo.toml b/runtime/test-runtime/Cargo.toml index c4bf27750a..ceac5dc134 100644 --- a/runtime/test-runtime/Cargo.toml +++ b/runtime/test-runtime/Cargo.toml @@ -14,9 +14,11 @@ serde = { version = "1.0.102", default-features = false } serde_derive = { version = "1.0.102", optional = true } smallvec = "1.4.1" +authority-discovery-primitives = { package = "sp-authority-discovery", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } babe-primitives = { package = "sp-consensus-babe", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } sp-api = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } inherents = { package = "sp-inherents", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +offchain-primitives = { package = "sp-offchain", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } rstd = { package = "sp-std", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } sp-io = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } @@ -27,6 +29,7 @@ version = { package = "sp-version", git = "https://github.com/paritytech/substra tx-pool-api = { package = "sp-transaction-pool", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } block-builder-api = { package = "sp-block-builder", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +authority-discovery = { package = "pallet-authority-discovery", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } authorship = { package = "pallet-authorship", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } babe = { package = "pallet-babe", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } balances = { package = "pallet-balances", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } @@ -46,6 +49,7 @@ pallet-staking-reward-curve = { git = "https://github.com/paritytech/substrate", system = { package = "frame-system", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } system_rpc_runtime_api = { package = "frame-system-rpc-runtime-api", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } timestamp = { package = "pallet-timestamp", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +sudo = { package = "pallet-sudo", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } vesting = { package = "pallet-vesting", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } runtime-common = { package = "polkadot-runtime-common", path = "../common", default-features = false } @@ -68,6 +72,8 @@ default = ["std"] no_std = [] only-staking = [] std = [ + "authority-discovery-primitives/std", + "authority-discovery/std", "bitvec/std", "primitives/std", "rustc-hex/std", @@ -78,6 +84,7 @@ std = [ "sp-api/std", "tx-pool-api/std", "block-builder-api/std", + "offchain-primitives/std", "rstd/std", "sp-io/std", "frame-support/std", diff --git a/runtime/test-runtime/client/Cargo.toml b/runtime/test-runtime/client/Cargo.toml index a9439e0609..7dbb7d5ec5 100644 --- a/runtime/test-runtime/client/Cargo.toml +++ b/runtime/test-runtime/client/Cargo.toml @@ -6,19 +6,24 @@ edition = "2018" license = "GPL-3.0" [dependencies] +futures = "0.3.1" +codec = { package = "parity-scale-codec", version = "1.0.0" } + +# Polkadot dependencies +polkadot-primitives = { path = "../../../primitives" } +polkadot-runtime-common = { path = "../../common" } +polkadot-test-runtime = { path = ".." } +polkadot-test-service = { path = "../../../node/test-service" } + +# Substrate dependencies +pallet-timestamp = { git = "https://github.com/paritytech/substrate", branch = "master" } sc-block-builder = { git = "https://github.com/paritytech/substrate", branch = "master" } +sc-client-api = { git = "https://github.com/paritytech/substrate", branch = "master" } sc-consensus = { git = "https://github.com/paritytech/substrate", branch = "master" } sc-light = { git = "https://github.com/paritytech/substrate", branch = "master" } sc-service = { git = "https://github.com/paritytech/substrate", branch = "master", features = ["test-helpers"], default-features = false } -substrate-test-client = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-core = { git = "https://github.com/paritytech/substrate", branch = "master" } -polkadot-test-runtime = { path = ".." } -polkadot-runtime-common = { path = "../../common" } -polkadot-primitives = { path = "../../../primitives" } -sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "master" } sp-api = { git = "https://github.com/paritytech/substrate", branch = "master" } sp-blockchain = { git = "https://github.com/paritytech/substrate", branch = "master" } -codec = { package = "parity-scale-codec", version = "1.0.0" } -sc-client-api = { git = "https://github.com/paritytech/substrate", branch = "master" } -pallet-timestamp = { git = "https://github.com/paritytech/substrate", branch = "master" } -futures = "0.3.1" +sp-core = { git = "https://github.com/paritytech/substrate", branch = "master" } +sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "master" } +substrate-test-client = { git = "https://github.com/paritytech/substrate", branch = "master" } diff --git a/runtime/test-runtime/client/src/lib.rs b/runtime/test-runtime/client/src/lib.rs index 2e02664719..2554f4f1c8 100644 --- a/runtime/test-runtime/client/src/lib.rs +++ b/runtime/test-runtime/client/src/lib.rs @@ -20,13 +20,18 @@ use std::sync::Arc; use std::collections::BTreeMap; +use std::convert::TryFrom; pub use substrate_test_client::*; pub use polkadot_test_runtime as runtime; -use sp_core::{sr25519, ChangesTrieConfiguration, map, twox_128}; +use sp_core::{ChangesTrieConfiguration, map, twox_128}; use sp_core::storage::{ChildInfo, Storage, StorageChild}; -use polkadot_test_runtime::genesismap::GenesisConfig; -use sp_runtime::traits::{Block as BlockT, Header as HeaderT, Hash as HashT, HashFor}; +use polkadot_test_runtime::GenesisConfig; +use polkadot_test_service::polkadot_local_testnet_genesis; +use sp_runtime::{ + traits::{Block as BlockT, Header as HeaderT, Hash as HashT, HashFor}, + BuildStorage, +}; use sc_consensus::LongestChain; use sc_client_api::light::{RemoteCallRequest, RemoteBodyRequest}; use sc_service::client::{ @@ -89,16 +94,10 @@ pub struct GenesisParameters { impl GenesisParameters { fn genesis_config(&self) -> GenesisConfig { - GenesisConfig::new( - self.changes_trie_config.clone(), - vec![ - sr25519::Public::from(Sr25519Keyring::Alice).into(), - sr25519::Public::from(Sr25519Keyring::Bob).into(), - sr25519::Public::from(Sr25519Keyring::Charlie).into(), - ], - 1000, - self.extra_storage.clone(), - ) + let config = polkadot_local_testnet_genesis(self.changes_trie_config.clone()); + config.assimilate_storage(&mut self.extra_storage.clone()).expect("Adding `system::GensisConfig` to the genesis"); + + config } } @@ -112,7 +111,7 @@ impl substrate_test_client::GenesisInit for GenesisParameters { fn genesis_storage(&self) -> Storage { use codec::Encode; - let mut storage = self.genesis_config().genesis_map(); + let mut storage = self.genesis_config().build_storage().unwrap(); let child_roots = storage.children_default.iter().map(|(sk, child_content)| { let state_root = <<::Header as HeaderT>::Hashing as HashT>::trie_root( @@ -323,20 +322,28 @@ pub fn new_native_executor() -> sc_executor::NativeExecutor { } /// Extrinsics that must be included in each block. -pub fn needed_extrinsics(heads: Vec) -> Vec { +/// +/// The index of the block must be provided to calculate a valid timestamp for the block. The value starts at 0 and +/// should be incremented by one for every block produced. +pub fn needed_extrinsics( + heads: Vec, + i: u64, +) -> Vec { use polkadot_runtime_common::parachains; + let timestamp = std::time::SystemTime::now().duration_since(std::time::UNIX_EPOCH) + .expect("now always later than unix epoch; qed") + .as_millis() + (i * polkadot_test_runtime::constants::time::SLOT_DURATION / 2) as u128; + vec![ polkadot_test_runtime::UncheckedExtrinsic { function: polkadot_test_runtime::Call::Parachains(parachains::Call::set_heads(heads)), signature: None, }, polkadot_test_runtime::UncheckedExtrinsic { - function: polkadot_test_runtime::Call::Timestamp(pallet_timestamp::Call::set({ - std::time::SystemTime::now().duration_since(std::time::UNIX_EPOCH) - .expect("now always later than unix epoch; qed") - .as_millis() as u64 - })), + function: polkadot_test_runtime::Call::Timestamp(pallet_timestamp::Call::set( + u64::try_from(timestamp).expect("unexpected big timestamp"), + )), signature: None, } ] diff --git a/runtime/test-runtime/src/genesismap.rs b/runtime/test-runtime/src/genesismap.rs deleted file mode 100644 index f3ae9693d1..0000000000 --- a/runtime/test-runtime/src/genesismap.rs +++ /dev/null @@ -1,75 +0,0 @@ -// Copyright 2020 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 . - -//! Tool for creating the genesis block. - -use std::collections::BTreeMap; -use super::{AccountId, WASM_BINARY, constants::currency}; -use sp_core::ChangesTrieConfiguration; -use sp_core::storage::Storage; -use sp_runtime::BuildStorage; - -/// Configuration of a general Substrate test genesis block. -pub struct GenesisConfig { - changes_trie_config: Option, - balances: Vec<(AccountId, u128)>, - /// Additional storage key pairs that will be added to the genesis map. - extra_storage: Storage, -} - -impl GenesisConfig { - pub fn new( - changes_trie_config: Option, - endowed_accounts: Vec, - balance: u128, - extra_storage: Storage, - ) -> Self { - GenesisConfig { - changes_trie_config, - balances: endowed_accounts.into_iter().map(|a| (a, balance * currency::DOLLARS)).collect(), - extra_storage, - } - } - - pub fn genesis_map(&self) -> Storage { - // Assimilate the system genesis config. - let mut storage = Storage { - top: BTreeMap::new(), - children_default: self.extra_storage.children_default.clone(), - }; - let config = crate::GenesisConfig { - system: Some(system::GenesisConfig { - changes_trie_config: self.changes_trie_config.clone(), - code: WASM_BINARY.to_vec(), - }), - babe: None, - indices: None, - balances: Some(balances::GenesisConfig { - balances: self.balances.clone() - }), - staking: None, - session: None, - grandpa: None, - claims: None, - parachains: None, - registrar: None, - vesting: None, - }; - config.assimilate_storage(&mut storage).expect("Adding `system::GensisConfig` to the genesis"); - - storage - } -} diff --git a/runtime/test-runtime/src/lib.rs b/runtime/test-runtime/src/lib.rs index 31b17002fe..57ceffa4a9 100644 --- a/runtime/test-runtime/src/lib.rs +++ b/runtime/test-runtime/src/lib.rs @@ -55,6 +55,7 @@ use frame_support::{ traits::{KeyOwnerProofSystem, Randomness}, weights::Weight, }; +use authority_discovery_primitives::AuthorityId as AuthorityDiscoveryId; use pallet_transaction_payment_rpc_runtime_api::RuntimeDispatchInfo; use session::historical as session_historical; @@ -69,8 +70,6 @@ pub use parachains::Call as ParachainsCall; /// Constant values used within the runtime. pub mod constants; -#[cfg(feature = "std")] -pub mod genesismap; use constants::{time::*, currency::*, fee::*}; // Make the WASM binary available. @@ -166,8 +165,8 @@ impl system::offchain::SendTransactionTypes for Runtime where } parameter_types! { - pub const EpochDuration: u64 = EPOCH_DURATION_IN_BLOCKS as u64; - pub const ExpectedBlockTime: Moment = MILLISECS_PER_BLOCK; + pub storage EpochDuration: u64 = EPOCH_DURATION_IN_BLOCKS as u64; + pub storage ExpectedBlockTime: Moment = MILLISECS_PER_BLOCK; } impl babe::Trait for Runtime { @@ -193,7 +192,7 @@ impl babe::Trait for Runtime { } parameter_types! { - pub const IndexDeposit: Balance = 1 * DOLLARS; + pub storage IndexDeposit: Balance = 1 * DOLLARS; } impl indices::Trait for Runtime { @@ -205,7 +204,7 @@ impl indices::Trait for Runtime { } parameter_types! { - pub const ExistentialDeposit: Balance = 1 * CENTS; + pub storage ExistentialDeposit: Balance = 1 * CENTS; } impl balances::Trait for Runtime { @@ -218,7 +217,7 @@ impl balances::Trait for Runtime { } parameter_types! { - pub const TransactionByteFee: Balance = 10 * MILLICENTS; + pub storage TransactionByteFee: Balance = 10 * MILLICENTS; } impl transaction_payment::Trait for Runtime { @@ -230,7 +229,8 @@ impl transaction_payment::Trait for Runtime { } parameter_types! { - pub const MinimumPeriod: u64 = 0; + pub storage SlotDuration: u64 = SLOT_DURATION; + pub storage MinimumPeriod: u64 = SlotDuration::get() / 2; } impl timestamp::Trait for Runtime { type Moment = u64; @@ -240,7 +240,7 @@ impl timestamp::Trait for Runtime { } parameter_types! { - pub const UncleGenerations: u32 = 0; + pub storage UncleGenerations: u32 = 0; } // TODO: substrate#2986 implement this properly @@ -252,8 +252,8 @@ impl authorship::Trait for Runtime { } parameter_types! { - pub const Period: BlockNumber = 10 * MINUTES; - pub const Offset: BlockNumber = 0; + pub storage Period: BlockNumber = 10 * MINUTES; + pub storage Offset: BlockNumber = 0; } impl_opaque_keys! { @@ -265,7 +265,7 @@ impl_opaque_keys! { } parameter_types! { - pub const DisabledValidatorsThreshold: Perbill = Perbill::from_percent(17); + pub storage DisabledValidatorsThreshold: Perbill = Perbill::from_percent(17); } impl session::Trait for Runtime { @@ -299,16 +299,16 @@ pallet_staking_reward_curve::build! { parameter_types! { // Six sessions in an era (6 hours). - pub const SessionsPerEra: SessionIndex = 6; + pub storage SessionsPerEra: SessionIndex = 6; // 28 eras for unbonding (7 days). - pub const BondingDuration: staking::EraIndex = 28; + pub storage BondingDuration: staking::EraIndex = 28; // 28 eras in which slashes can be cancelled (7 days). - pub const SlashDeferDuration: staking::EraIndex = 28; + pub storage SlashDeferDuration: staking::EraIndex = 28; pub const RewardCurve: &'static PiecewiseLinear<'static> = &REWARD_CURVE; - pub const MaxNominatorRewardedPerValidator: u32 = 64; - pub const ElectionLookahead: BlockNumber = 0; - pub const StakingUnsignedPriority: TransactionPriority = TransactionPriority::max_value() / 2; - pub const MaxIterations: u32 = 10; + pub storage MaxNominatorRewardedPerValidator: u32 = 64; + pub storage ElectionLookahead: BlockNumber = 0; + pub storage StakingUnsignedPriority: TransactionPriority = TransactionPriority::max_value() / 2; + pub storage MaxIterations: u32 = 10; pub MinSolutionScoreBump: Perbill = Perbill::from_rational_approximation(5u32, 10_000); } @@ -366,12 +366,12 @@ impl attestations::Trait for Runtime { } parameter_types! { - pub const MaxCodeSize: u32 = 10 * 1024 * 1024; // 10 MB - pub const MaxHeadDataSize: u32 = 20 * 1024; // 20 KB + pub storage MaxCodeSize: u32 = 10 * 1024 * 1024; // 10 MB + pub storage MaxHeadDataSize: u32 = 20 * 1024; // 20 KB - pub const ValidationUpgradeFrequency: BlockNumber = 2; - pub const ValidationUpgradeDelay: BlockNumber = 1; - pub const SlashPeriod: BlockNumber = 1 * MINUTES; + pub storage ValidationUpgradeFrequency: BlockNumber = 2; + pub storage ValidationUpgradeDelay: BlockNumber = 1; + pub storage SlashPeriod: BlockNumber = 1 * MINUTES; } impl parachains::Trait for Runtime { @@ -447,7 +447,7 @@ impl system::offchain::SigningTypes for Runtime { } parameter_types! { - pub OffencesWeightSoftLimit: Weight = Perbill::from_percent(60) * MaximumBlockWeight::get(); + pub storage OffencesWeightSoftLimit: Weight = Perbill::from_percent(60) * MaximumBlockWeight::get(); } impl offences::Trait for Runtime { @@ -458,10 +458,12 @@ impl offences::Trait for Runtime { type WeightInfo = (); } +impl authority_discovery::Trait for Runtime {} + parameter_types! { - pub const ParathreadDeposit: Balance = 5 * DOLLARS; + pub storage ParathreadDeposit: Balance = 5 * DOLLARS; pub const QueueSize: usize = 2; - pub const MaxRetries: u32 = 3; + pub storage MaxRetries: u32 = 3; } impl registrar::Trait for Runtime { @@ -475,8 +477,8 @@ impl registrar::Trait for Runtime { } parameter_types! { - pub const LeasePeriod: BlockNumber = 100_000; - pub const EndingPeriod: BlockNumber = 1000; + pub storage LeasePeriod: BlockNumber = 100_000; + pub storage EndingPeriod: BlockNumber = 1000; } impl slots::Trait for Runtime { @@ -500,7 +502,7 @@ impl claims::Trait for Runtime { } parameter_types! { - pub const MinVestedTransfer: Balance = 100 * DOLLARS; + pub storage MinVestedTransfer: Balance = 100 * DOLLARS; } impl vesting::Trait for Runtime { @@ -511,6 +513,11 @@ impl vesting::Trait for Runtime { type WeightInfo = (); } +impl sudo::Trait for Runtime { + type Event = Event; + type Call = Call; +} + construct_runtime! { pub enum Runtime where Block = Block, @@ -536,6 +543,7 @@ construct_runtime! { Historical: session_historical::{Module}, Session: session::{Module, Call, Storage, Event, Config}, Grandpa: grandpa::{Module, Call, Storage, Config, Event}, + AuthorityDiscovery: authority_discovery::{Module, Call, Config}, // Claims. Usable initially. Claims: claims::{Module, Call, Storage, Event, Config, ValidateUnsigned}, @@ -549,6 +557,9 @@ construct_runtime! { // Vesting. Usable initially, but removed once all vesting is finished. Vesting: vesting::{Module, Call, Storage, Event, Config}, + + // Sudo. Last module. + Sudo: sudo::{Module, Call, Storage, Config, Event}, } } @@ -642,6 +653,18 @@ sp_api::impl_runtime_apis! { } } + impl offchain_primitives::OffchainWorkerApi for Runtime { + fn offchain_worker(header: &::Header) { + Executive::offchain_worker(header) + } + } + + impl authority_discovery_primitives::AuthorityDiscoveryApi for Runtime { + fn authorities() -> Vec { + Vec::new() + } + } + impl parachain::ParachainHost for Runtime { fn validators() -> Vec { Parachains::authorities() diff --git a/service/src/grandpa_support.rs b/service/src/grandpa_support.rs index a875c4b45a..794b4e4fc1 100644 --- a/service/src/grandpa_support.rs +++ b/service/src/grandpa_support.rs @@ -23,7 +23,7 @@ use sp_runtime::traits::{Block as BlockT, NumberFor}; /// same last finalized block) after a given block at height `N` has been /// finalized and for a delay of `M` blocks, i.e. until the best block reaches /// `N` + `M`, the voter will keep voting for block `N`. -pub(crate) struct PauseAfterBlockFor(pub(crate) N, pub(crate) N); +pub struct PauseAfterBlockFor(pub N, pub N); impl grandpa::VotingRule for PauseAfterBlockFor> where Block: BlockT, @@ -250,17 +250,21 @@ mod tests { let mut push_blocks = { let mut client = client.clone(); + let mut base = 0; + move |n| { - for _ in 0..n { + for i in 0..n { let mut builder = client.new_block(Default::default()).unwrap(); - for extrinsic in polkadot_test_runtime_client::needed_extrinsics(vec![]) { + for extrinsic in polkadot_test_runtime_client::needed_extrinsics(vec![], base + i) { builder.push(extrinsic).unwrap() } let block = builder.build().unwrap().block; client.import(BlockOrigin::Own, block).unwrap(); } + + base += n; } }; diff --git a/service/src/lib.rs b/service/src/lib.rs index 33d02f5315..313791611b 100644 --- a/service/src/lib.rs +++ b/service/src/lib.rs @@ -17,7 +17,7 @@ //! Polkadot service. Specialized wrapper over substrate service. pub mod chain_spec; -mod grandpa_support; +pub mod grandpa_support; mod client; use std::sync::Arc; @@ -136,27 +136,20 @@ impl IdentifyVariant for Box { } } -// If we're using prometheus, use a registry with a prefix of `polkadot`. -fn set_prometheus_registry(config: &mut Configuration) -> Result<(), ServiceError> { - if let Some(PrometheusConfig { registry, .. }) = config.prometheus_config.as_mut() { - *registry = Registry::new_custom(Some("polkadot".into()), None)?; - } - - Ok(()) -} - /// Starts a `ServiceBuilder` for a full service. /// /// Use this macro if you don't actually need the full service, but just the builder in order to /// be able to perform chain operations. +#[macro_export] macro_rules! new_full_start { - ($config:expr, $runtime:ty, $executor:ty) => {{ - set_prometheus_registry(&mut $config)?; - - let mut import_setup = None; - let mut rpc_setup = None; - let inherent_data_providers = inherents::InherentDataProviders::new(); - let builder = service::ServiceBuilder::new_full::< + (prometheus_setup $config:expr) => {{ + // If we're using prometheus, use a registry with a prefix of `polkadot`. + if let Some(PrometheusConfig { registry, .. }) = $config.prometheus_config.as_mut() { + *registry = Registry::new_custom(Some("polkadot".into()), None)?; + } + }}; + (start_builder $config:expr, $runtime:ty, $executor:ty $(,)?) => {{ + service::ServiceBuilder::new_full::< Block, $runtime, $executor >($config)? .with_select_chain(|_, backend| { @@ -174,56 +167,58 @@ macro_rules! new_full_start { ); Ok(pool) })? - .with_import_queue(| - config, - client, - mut select_chain, - _, - spawn_task_handle, - registry, - | { - let select_chain = select_chain.take() - .ok_or_else(|| service::Error::SelectChainRequired)?; - - let grandpa_hard_forks = if config.chain_spec.is_kusama() { - grandpa_support::kusama_hard_forks() - } else { - Vec::new() - }; + }}; + (import_queue_setup + $builder:expr, $inherent_data_providers:expr, $import_setup:expr, $grandpa_hard_forks:expr, $(,)? + ) => {{ + $builder.with_import_queue(| + _config, + client, + mut select_chain, + _, + spawn_task_handle, + registry, + | { + let select_chain = select_chain.take() + .ok_or_else(|| service::Error::SelectChainRequired)?; + + let (grandpa_block_import, grandpa_link) = + grandpa::block_import_with_authority_set_hard_forks( + client.clone(), + &(client.clone() as Arc<_>), + select_chain.clone(), + $grandpa_hard_forks, + )?; - let (grandpa_block_import, grandpa_link) = - grandpa::block_import_with_authority_set_hard_forks( - client.clone(), - &(client.clone() as Arc<_>), - select_chain.clone(), - grandpa_hard_forks, - )?; + let justification_import = grandpa_block_import.clone(); - let justification_import = grandpa_block_import.clone(); + let (block_import, babe_link) = babe::block_import( + babe::Config::get_or_compute(&*client)?, + grandpa_block_import, + client.clone(), + )?; - let (block_import, babe_link) = babe::block_import( - babe::Config::get_or_compute(&*client)?, - grandpa_block_import, - client.clone(), - )?; + let import_queue = babe::import_queue( + babe_link.clone(), + block_import.clone(), + Some(Box::new(justification_import)), + None, + client, + select_chain, + $inherent_data_providers.clone(), + spawn_task_handle, + registry, + )?; - let import_queue = babe::import_queue( - babe_link.clone(), - block_import.clone(), - Some(Box::new(justification_import)), - None, - client, - select_chain, - inherent_data_providers.clone(), - spawn_task_handle, - registry, - )?; + $import_setup = Some((block_import, grandpa_link, babe_link)); + Ok(import_queue) + })? + }}; + (finish_builder_setup $builder:expr, $inherent_data_providers:expr, $import_setup:expr) => {{ + let mut rpc_setup = None; - import_setup = Some((block_import, grandpa_link, babe_link)); - Ok(import_queue) - })? - .with_rpc_extensions_builder(|builder| { - let grandpa_link = import_setup.as_ref().map(|s| &s.1) + let builder = $builder.with_rpc_extensions_builder(|builder| { + let grandpa_link = $import_setup.as_ref().map(|s| &s.1) .expect("GRANDPA LinkHalf is present for full services or set up failed; qed."); let shared_authority_set = grandpa_link.shared_authority_set().clone(); @@ -231,7 +226,7 @@ macro_rules! new_full_start { rpc_setup = Some((shared_voter_state.clone())); - let babe_link = import_setup.as_ref().map(|s| &s.2) + let babe_link = $import_setup.as_ref().map(|s| &s.2) .expect("BabeLink is present for full services or set up faile; qed."); let babe_config = babe_link.config().clone(); @@ -264,22 +259,47 @@ macro_rules! new_full_start { }) })?; - (builder, import_setup, inherent_data_providers, rpc_setup) - }} + (builder, $import_setup, $inherent_data_providers, rpc_setup) + }}; + ($config:expr, $runtime:ty, $executor:ty $(,)?) => {{ + let inherent_data_providers = inherents::InherentDataProviders::new(); + let mut import_setup = None; + new_full_start!(prometheus_setup $config); + let grandpa_hard_forks = if $config.chain_spec.is_kusama() { + $crate::grandpa_support::kusama_hard_forks() + } else { + Vec::new() + }; + let builder = new_full_start!(start_builder $config, $runtime, $executor); + let builder = new_full_start!(import_queue_setup + builder, inherent_data_providers, import_setup, grandpa_hard_forks, + ); + new_full_start!(finish_builder_setup builder, inherent_data_providers, import_setup) + }}; + (test $config:expr, $runtime:ty, $executor:ty $(,)?) => {{ + let inherent_data_providers = inherents::InherentDataProviders::new(); + let mut import_setup = None; + let grandpa_hard_forks = Vec::new(); + let builder = new_full_start!(start_builder $config, $runtime, $executor); + let builder = new_full_start!(import_queue_setup + builder, inherent_data_providers, import_setup, grandpa_hard_forks, + ); + new_full_start!(finish_builder_setup builder, inherent_data_providers, import_setup) + }}; } /// Builds a new service for a full client. #[macro_export] macro_rules! new_full { ( + with_full_start $config:expr, $collating_for:expr, $max_block_data_size:expr, $authority_discovery_enabled:expr, $slot_duration:expr, $grandpa_pause:expr, - $runtime:ty, - $dispatch:ty, + $new_full_start:expr $(,)? ) => {{ use sc_network::Event; use sc_client_api::ExecutorProvider; @@ -290,22 +310,21 @@ macro_rules! new_full { let role = $config.role.clone(); let is_authority = role.is_authority() && !is_collator; let force_authoring = $config.force_authoring; - let max_block_data_size = $max_block_data_size; let db_path = match $config.database.path() { Some(path) => std::path::PathBuf::from(path), None => return Err("Starting a Polkadot service with a custom database isn't supported".to_string().into()), }; + let max_block_data_size = $max_block_data_size; let disable_grandpa = $config.disable_grandpa; let name = $config.network.node_name.clone(); let authority_discovery_enabled = $authority_discovery_enabled; let slot_duration = $slot_duration; - let (builder, mut import_setup, inherent_data_providers, mut rpc_setup) = - new_full_start!($config, $runtime, $dispatch); + let (builder, mut import_setup, inherent_data_providers, mut rpc_setup) = $new_full_start; let ServiceComponents { client, network, select_chain, keystore, transaction_pool, prometheus_registry, - task_manager, telemetry_on_connect_sinks, .. + task_manager, telemetry_on_connect_sinks, rpc_handlers, .. } = builder .with_finality_proof_provider(|client, backend| { let provider = client as Arc>; @@ -510,7 +529,7 @@ macro_rules! new_full { ); grandpa::VotingRulesBuilder::default() - .add(grandpa_support::PauseAfterBlockFor(block, delay)) + .add($crate::grandpa_support::PauseAfterBlockFor(block, delay)) .build() }, None => @@ -542,15 +561,58 @@ macro_rules! new_full { } handles.polkadot_network = Some(polkadot_network_service); - (task_manager, client, handles) - }} + (task_manager, client, handles, network, rpc_handlers) + }}; + ( + $config:expr, + $collating_for:expr, + $max_block_data_size:expr, + $authority_discovery_enabled:expr, + $slot_duration:expr, + $grandpa_pause:expr, + $runtime:ty, + $dispatch:ty, + ) => {{ + new_full!(with_full_start + $config, + $collating_for, + $max_block_data_size, + $authority_discovery_enabled, + $slot_duration, + $grandpa_pause, + new_full_start!($config, $runtime, $dispatch), + ) + }}; + ( + test + $config:expr, + $collating_for:expr, + $max_block_data_size:expr, + $authority_discovery_enabled:expr, + $slot_duration:expr, + $runtime:ty, + $dispatch:ty, + ) => {{ + new_full!(with_full_start + $config, + $collating_for, + $max_block_data_size, + $authority_discovery_enabled, + $slot_duration, + None, + new_full_start!(test $config, $runtime, $dispatch), + ) + }}; } /// Builds a new service for a light client. #[macro_export] macro_rules! new_light { ($config:expr, $runtime:ty, $dispatch:ty) => {{ - crate::set_prometheus_registry(&mut $config)?; + // If we're using prometheus, use a registry with a prefix of `polkadot`. + if let Some(PrometheusConfig { registry, .. }) = $config.prometheus_config.as_mut() { + *registry = Registry::new_custom(Some("polkadot".into()), None)?; + } let inherent_data_providers = inherents::InherentDataProviders::new(); ServiceBuilder::new_light::($config)? @@ -646,7 +708,7 @@ macro_rules! new_light { /// Builds a new object suitable for chain operations. pub fn new_chain_ops(mut config: Configuration) -> Result< ( - Arc>, + Arc>, Arc>, consensus_common::import_queue::BasicQueue>, TaskManager, @@ -685,7 +747,7 @@ pub fn polkadot_new_full( FullNodeHandles, ), ServiceError> { - let (service, client, handles) = new_full!( + let (service, client, handles, _, _) = new_full!( config, collating_for, max_block_data_size, @@ -719,7 +781,7 @@ pub fn kusama_new_full( FullNodeHandles ), ServiceError> { - let (service, client, handles) = new_full!( + let (service, client, handles, _, _) = new_full!( config, collating_for, max_block_data_size, @@ -753,7 +815,7 @@ pub fn westend_new_full( FullNodeHandles, ), ServiceError> { - let (service, client, handles) = new_full!( + let (service, client, handles, _, _) = new_full!( config, collating_for, max_block_data_size, -- GitLab From da2376768a65fe51d749b94b6bb0000a5c9b2e82 Mon Sep 17 00:00:00 2001 From: Robert Habermeier Date: Thu, 9 Jul 2020 09:43:26 -0400 Subject: [PATCH 052/192] Delay session changes' effects on parachains by 1 block (#1354) * note that the initializer is responsible for buffering session changes * amend initializer definition to include session change buffering * support buffered changes before `on_initialize` * implement and test session buffering * Update roadmap/implementors-guide/src/runtime/README.md Co-authored-by: Bernhard Schuster * expand on how this affects misbehavior reports * fix typo Co-authored-by: Bernhard Schuster --- .../implementers-guide/src/runtime/README.md | 13 +- .../src/runtime/initializer.md | 16 ++- runtime/parachains/src/initializer.rs | 114 ++++++++++++++---- 3 files changed, 106 insertions(+), 37 deletions(-) diff --git a/roadmap/implementers-guide/src/runtime/README.md b/roadmap/implementers-guide/src/runtime/README.md index 2a806d4c2d..5279752e91 100644 --- a/roadmap/implementers-guide/src/runtime/README.md +++ b/roadmap/implementers-guide/src/runtime/README.md @@ -23,17 +23,13 @@ We will split the logic of the runtime up into these modules: The [Initializer module](initializer.md) is special - it's responsible for handling the initialization logic of the other modules to ensure that the correct initialization order and related invariants are maintained. The other modules won't specify a on-initialize logic, but will instead expose a special semi-private routine that the initialization module will call. The other modules are relatively straightforward and perform the roles described above. -The Parachain Host operates under a changing set of validators. Time is split up into periodic sessions, where each session brings a potentially new set of validators. Sessions are buffered by one, meaning that the validators of the upcoming session are fixed and always known. Parachain Host runtime modules need to react to changes in the validator set, as it will affect the runtime logic for processing candidate backing, availability bitfields, and misbehavior reports. The Parachain Host modules can't determine ahead-of-time exactly when session change notifications are going to happen within the block (note: this depends on module initialization order again - better to put session before parachains modules). Ideally, session changes are always handled before initialization. It is clearly a problem if we compute validator assignments to parachains during initialization and then the set of validators changes. In the best case, we can recognize that re-initialization needs to be done. In the worst case, bugs would occur. +The Parachain Host operates under a changing set of validators. Time is split up into periodic sessions, where each session brings a potentially new set of validators. Sessions are buffered by one, meaning that the validators of the upcoming session `n+1` are determined at the end of session `n-1`, right before session `n` starts. Parachain Host runtime modules need to react to changes in the validator set, as it will affect the runtime logic for processing candidate backing, availability bitfields, and misbehavior reports. The Parachain Host modules can't determine ahead-of-time exactly when session change notifications are going to happen within the block (note: this depends on module initialization order again - better to put session before parachains modules). -There are 3 main ways that we can handle this issue: +The relay chain is intended to use BABE or SASSAFRAS, which both have the property that a session changing at a block is determined not by the number of the block but instead by the time the block is authored. In some sense, sessions change in-between blocks, not at blocks. This has the side effect that the session of a child block cannot be determined solely by the parent block's identifier. Being able to unilaterally determine the validator-set at a specific block based on its parent hash would make a lot of Node-side logic much simpler. -1. Establish an invariant that session change notifications always happen after initialization. This means that when we receive a session change notification before initialization, we call the initialization routines before handling the session change. -1. Require that session change notifications always occur before initialization. Brick the chain if session change notifications ever happen after initialization. -1. Handle both the before and after cases. +In order to regain the property that the validator set of a block is predictable by its parent block, we delay session changes' application to Parachains by 1 block. This means that if there is a session change at block X, that session change will be stored and applied during initialization of direct descendents of X. This principal side effect of this change is that the Parachains runtime can disagree with session or consensus modules about which session it currently is. Misbehavior reporting routines in particular will be affected by this, although not severely. The parachains runtime might believe it is the last block of the session while the system is really in the first block of the next session. In such cases, a historical validator-set membership proof will need to accompany any misbehavior report, although they typically do not need to during current-session misbehavior reports. -Although option 3 is the most comprehensive, it runs counter to our goal of simplicity. Option 1 means requiring the runtime to do redundant work at all sessions and will also mean, like option 3, that designing things in such a way that initialization can be rolled back and reapplied under the new environment. That leaves option 2, although it is a "nuclear" option in a way and requires us to constrain the parachain host to only run in full runtimes with a certain order of operations. - -So the other role of the initializer module is to forward session change notifications to modules in the initialization order, throwing an unrecoverable error if the notification is received after initialization. Session change is the point at which the [Configuration Module](configuration.md) updates the configuration. Most of the other modules will handle changes in the configuration during their session change operation, so the initializer should provide both the old and new configuration to all the other +So the other role of the initializer module is to forward session change notifications to modules in the initialization order. Session change is also the point at which the [Configuration Module](configuration.md) updates the configuration. Most of the other modules will handle changes in the configuration during their session change operation, so the initializer should provide both the old and new configuration to all the other modules alongside the session change notification. This means that a session change notification should consist of the following data: ```rust @@ -53,5 +49,4 @@ struct SessionChangeNotification { } ``` -> REVIEW: other options? arguments in favor of going for options 1 or 3 instead of 2. we could do a "soft" version of 2 where we note that the chain is potentially broken due to bad initialization order > TODO Diagram: order of runtime operations (initialization, session change) diff --git a/roadmap/implementers-guide/src/runtime/initializer.md b/roadmap/implementers-guide/src/runtime/initializer.md index aba4d5f352..5fd2bc3bd6 100644 --- a/roadmap/implementers-guide/src/runtime/initializer.md +++ b/roadmap/implementers-guide/src/runtime/initializer.md @@ -1,16 +1,23 @@ # Initializer Module -This module is responsible for initializing the other modules in a deterministic order. It also has one other purpose as described above: accepting and forwarding session change notifications. +This module is responsible for initializing the other modules in a deterministic order. It also has one other purpose as described in the overview of the runtime: accepting and forwarding session change notifications. ## Storage ```rust -HasInitialized: bool +HasInitialized: bool; +// buffered session changes along with the block number at which they should be applied. +// +// typically this will be empty or one element long. ordered ascending by BlockNumber and insertion +// order. +BufferedSessionChanges: Vec<(BlockNumber, ValidatorSet, ValidatorSet)>; ``` ## Initialization -The other modules are initialized in this order: +Before initializing modules, remove all changes from the `BufferedSessionChanges` with number less than or equal to the current block number, and apply the last one. The session change is applied to all modules in the same order as initialization. + +The other parachains modules are initialized in this order: 1. Configuration 1. Paras @@ -25,8 +32,7 @@ Set `HasInitialized` to true. ## Session Change -If `HasInitialized` is true, throw an unrecoverable error (panic). -Otherwise, forward the session change notification to other modules in initialization order. +Store the session change information in `BufferedSessionChange` along with the block number at which it was submitted, plus one. Although the expected operational parameters of the block authorship system should prevent more than one change from being buffered at any time, it may occur. Regardless, we always need to track the block number at which the session change can be applied so as to remain flexible over session change notifications being issued before or after initialization of the current block. ## Finalization diff --git a/runtime/parachains/src/initializer.rs b/runtime/parachains/src/initializer.rs index 0f7f4b74ec..9c0cda2969 100644 --- a/runtime/parachains/src/initializer.rs +++ b/runtime/parachains/src/initializer.rs @@ -27,6 +27,8 @@ use primitives::{ use frame_support::{ decl_storage, decl_module, decl_error, traits::Randomness, }; +use sp_runtime::traits::One; +use codec::{Encode, Decode}; use crate::{configuration::{self, HostConfiguration}, paras, scheduler, inclusion}; /// Information about a session change that has just occurred. @@ -46,6 +48,14 @@ pub struct SessionChangeNotification { pub session_index: sp_staking::SessionIndex, } +#[derive(Encode, Decode)] +struct BufferedSessionChange { + apply_at: N, + validators: Vec, + queued: Vec, + session_index: sp_staking::SessionIndex, +} + pub trait Trait: system::Trait + configuration::Trait + paras::Trait + scheduler::Trait + inclusion::Trait { @@ -64,6 +74,14 @@ decl_storage! { /// them writes to the trie and one does not. This confusion makes `Option<()>` more suitable for /// the semantics of this variable. HasInitialized: Option<()>; + /// Buffered session changes along with the block number at which they should be applied. + /// + /// Typically this will be empty or one element long, with the single element having a block + /// number of the next block. + /// + /// However this is a `Vec` regardless to handle various edge cases that may occur at runtime + /// upgrade boundaries or if governance intervenes. + BufferedSessionChanges: Vec>; } } @@ -77,6 +95,21 @@ decl_module! { type Error = Error; fn on_initialize(now: T::BlockNumber) -> Weight { + // Apply buffered session changes before initializing modules, so they + // can be initialized with respect to the current validator set. + >::mutate(|v| { + let drain_up_to = v.iter().take_while(|b| b.apply_at <= now).count(); + + // apply only the last session as all others lasted less than a block (weirdly). + if let Some(buffered) = v.drain(..drain_up_to).last() { + Self::apply_new_session( + buffered.session_index, + buffered.validators, + buffered.queued, + ); + } + }); + // The other modules are initialized in this order: // - Configuration // - Paras @@ -106,27 +139,11 @@ decl_module! { } impl Module { - /// Should be called when a new session occurs. Forwards the session notification to all - /// wrapped modules. If `queued` is `None`, the `validators` are considered queued. - /// - /// Panics if the modules have already been initialized. - fn on_new_session<'a, I: 'a>( - _changed: bool, + fn apply_new_session( session_index: sp_staking::SessionIndex, - validators: I, - queued: Option, - ) - where I: Iterator - { - assert!(HasInitialized::get().is_none()); - - let validators: Vec<_> = validators.map(|(_, v)| v).collect(); - let queued: Vec<_> = if let Some(queued) = queued { - queued.map(|(_, v)| v).collect() - } else { - validators.clone() - }; - + validators: Vec, + queued: Vec, + ) { let prev_config = >::config(); let random_seed = { @@ -156,6 +173,31 @@ impl Module { scheduler::Module::::initializer_on_new_session(¬ification); inclusion::Module::::initializer_on_new_session(¬ification); } + + /// Should be called when a new session occurs. Buffers the session notification to be applied + /// at the next block. If `queued` is `None`, the `validators` are considered queued. + fn on_new_session<'a, I: 'a>( + _changed: bool, + session_index: sp_staking::SessionIndex, + validators: I, + queued: Option, + ) + where I: Iterator + { + let validators: Vec<_> = validators.map(|(_, v)| v).collect(); + let queued: Vec<_> = if let Some(queued) = queued { + queued.map(|(_, v)| v).collect() + } else { + validators.clone() + }; + + >::mutate(|v| v.push(BufferedSessionChange { + apply_at: >::block_number() + One::one(), + validators, + queued, + session_index, + })); + } } impl sp_runtime::BoundToRuntimeAppPublic for Module { @@ -184,21 +226,47 @@ impl session::OneSessionHandler for Mod #[cfg(test)] mod tests { use super::*; - use crate::mock::{new_test_ext, Initializer}; + use crate::mock::{new_test_ext, Initializer, Test, System}; use frame_support::traits::{OnFinalize, OnInitialize}; #[test] - #[should_panic] - fn panics_if_session_changes_after_on_initialize() { + fn session_change_before_initialize_is_still_buffered_after() { + new_test_ext(Default::default()).execute_with(|| { + Initializer::on_new_session( + false, + 1, + Vec::new().into_iter(), + Some(Vec::new().into_iter()), + ); + + let now = System::block_number(); + Initializer::on_initialize(now); + + let v = >::get(); + assert_eq!(v.len(), 1); + + let apply_at = now + 1; + assert_eq!(v[0].apply_at, apply_at); + }); + } + + #[test] + fn session_change_applied_on_initialize() { new_test_ext(Default::default()).execute_with(|| { Initializer::on_initialize(1); + + let now = System::block_number(); Initializer::on_new_session( false, 1, Vec::new().into_iter(), Some(Vec::new().into_iter()), ); + + Initializer::on_initialize(now + 1); + + assert!(>::get().is_empty()); }); } -- GitLab From 8347bf8ee4174cdef85dcf1a6967c5c910b00c51 Mon Sep 17 00:00:00 2001 From: Ashley Date: Thu, 9 Jul 2020 16:59:58 +0200 Subject: [PATCH 053/192] Companion PR for ' Simplify a few chain components creation APIs related to the service' (#1384) * Switch branch * Fix service creation * Revert "Switch branch" This reverts commit a706335821eb1553e48f86e0b0c5b3c11d589a1d. * Switch branch again * Revert "Switch branch again" This reverts commit 04afc5095e408ff9a116c526ef84f6b101482ee1. * Update substrate branch --- Cargo.lock | 276 ++++++++++++++++++++-------------------- node/service/src/lib.rs | 10 +- service/src/lib.rs | 10 +- 3 files changed, 151 insertions(+), 145 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 894eeab6f4..0c344600c2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1285,7 +1285,7 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "fork-tree" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" +source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" dependencies = [ "parity-scale-codec", ] @@ -1293,7 +1293,7 @@ dependencies = [ [[package]] name = "frame-benchmarking" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" +source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" dependencies = [ "frame-support", "frame-system", @@ -1310,7 +1310,7 @@ dependencies = [ [[package]] name = "frame-benchmarking-cli" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" +source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" dependencies = [ "Inflector", "frame-benchmarking", @@ -1329,7 +1329,7 @@ dependencies = [ [[package]] name = "frame-executive" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" +source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" dependencies = [ "frame-support", "frame-system", @@ -1344,7 +1344,7 @@ dependencies = [ [[package]] name = "frame-metadata" version = "11.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" +source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" dependencies = [ "parity-scale-codec", "serde", @@ -1355,7 +1355,7 @@ dependencies = [ [[package]] name = "frame-support" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" +source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" dependencies = [ "bitmask", "frame-metadata", @@ -1380,7 +1380,7 @@ dependencies = [ [[package]] name = "frame-support-procedural" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" +source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" dependencies = [ "frame-support-procedural-tools", "proc-macro2 1.0.18", @@ -1391,7 +1391,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" +source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" dependencies = [ "frame-support-procedural-tools-derive", "proc-macro-crate", @@ -1403,7 +1403,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools-derive" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" +source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" dependencies = [ "proc-macro2 1.0.18", "quote 1.0.7", @@ -1413,7 +1413,7 @@ dependencies = [ [[package]] name = "frame-system" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" +source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" dependencies = [ "frame-support", "impl-trait-for-tuples", @@ -1429,7 +1429,7 @@ dependencies = [ [[package]] name = "frame-system-benchmarking" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" +source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" dependencies = [ "frame-benchmarking", "frame-support", @@ -1443,7 +1443,7 @@ dependencies = [ [[package]] name = "frame-system-rpc-runtime-api" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" +source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" dependencies = [ "parity-scale-codec", "sp-api", @@ -3409,7 +3409,7 @@ dependencies = [ [[package]] name = "pallet-authority-discovery" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" +source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" dependencies = [ "frame-support", "frame-system", @@ -3425,7 +3425,7 @@ dependencies = [ [[package]] name = "pallet-authorship" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" +source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" dependencies = [ "frame-support", "frame-system", @@ -3440,7 +3440,7 @@ dependencies = [ [[package]] name = "pallet-babe" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" +source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" dependencies = [ "frame-benchmarking", "frame-support", @@ -3465,7 +3465,7 @@ dependencies = [ [[package]] name = "pallet-balances" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" +source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" dependencies = [ "frame-benchmarking", "frame-support", @@ -3479,7 +3479,7 @@ dependencies = [ [[package]] name = "pallet-collective" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" +source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" dependencies = [ "frame-benchmarking", "frame-support", @@ -3495,7 +3495,7 @@ dependencies = [ [[package]] name = "pallet-democracy" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" +source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" dependencies = [ "frame-benchmarking", "frame-support", @@ -3510,7 +3510,7 @@ dependencies = [ [[package]] name = "pallet-elections-phragmen" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" +source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" dependencies = [ "frame-benchmarking", "frame-support", @@ -3525,7 +3525,7 @@ dependencies = [ [[package]] name = "pallet-finality-tracker" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" +source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" dependencies = [ "frame-support", "frame-system", @@ -3541,7 +3541,7 @@ dependencies = [ [[package]] name = "pallet-grandpa" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" +source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" dependencies = [ "frame-support", "frame-system", @@ -3561,7 +3561,7 @@ dependencies = [ [[package]] name = "pallet-identity" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" +source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" dependencies = [ "enumflags2", "frame-benchmarking", @@ -3577,7 +3577,7 @@ dependencies = [ [[package]] name = "pallet-im-online" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" +source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" dependencies = [ "frame-benchmarking", "frame-support", @@ -3597,7 +3597,7 @@ dependencies = [ [[package]] name = "pallet-indices" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" +source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" dependencies = [ "frame-support", "frame-system", @@ -3613,7 +3613,7 @@ dependencies = [ [[package]] name = "pallet-membership" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" +source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" dependencies = [ "frame-support", "frame-system", @@ -3627,7 +3627,7 @@ dependencies = [ [[package]] name = "pallet-multisig" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" +source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" dependencies = [ "frame-support", "frame-system", @@ -3642,7 +3642,7 @@ dependencies = [ [[package]] name = "pallet-nicks" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" +source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" dependencies = [ "frame-support", "frame-system", @@ -3656,7 +3656,7 @@ dependencies = [ [[package]] name = "pallet-offences" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" +source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" dependencies = [ "frame-support", "frame-system", @@ -3671,7 +3671,7 @@ dependencies = [ [[package]] name = "pallet-offences-benchmarking" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" +source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" dependencies = [ "frame-benchmarking", "frame-support", @@ -3692,7 +3692,7 @@ dependencies = [ [[package]] name = "pallet-proxy" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" +source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" dependencies = [ "frame-support", "frame-system", @@ -3707,7 +3707,7 @@ dependencies = [ [[package]] name = "pallet-randomness-collective-flip" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" +source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" dependencies = [ "frame-support", "frame-system", @@ -3720,7 +3720,7 @@ dependencies = [ [[package]] name = "pallet-recovery" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" +source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" dependencies = [ "enumflags2", "frame-support", @@ -3735,7 +3735,7 @@ dependencies = [ [[package]] name = "pallet-scheduler" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" +source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" dependencies = [ "frame-benchmarking", "frame-support", @@ -3750,7 +3750,7 @@ dependencies = [ [[package]] name = "pallet-session" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" +source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" dependencies = [ "frame-support", "frame-system", @@ -3770,7 +3770,7 @@ dependencies = [ [[package]] name = "pallet-session-benchmarking" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" +source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" dependencies = [ "frame-benchmarking", "frame-support", @@ -3786,7 +3786,7 @@ dependencies = [ [[package]] name = "pallet-society" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" +source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" dependencies = [ "frame-support", "frame-system", @@ -3800,7 +3800,7 @@ dependencies = [ [[package]] name = "pallet-staking" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" +source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" dependencies = [ "frame-benchmarking", "frame-support", @@ -3822,7 +3822,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-curve" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" +source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -3833,7 +3833,7 @@ dependencies = [ [[package]] name = "pallet-sudo" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" +source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" dependencies = [ "frame-support", "frame-system", @@ -3847,7 +3847,7 @@ dependencies = [ [[package]] name = "pallet-timestamp" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" +source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" dependencies = [ "frame-benchmarking", "frame-support", @@ -3865,7 +3865,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" +source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" dependencies = [ "frame-support", "frame-system", @@ -3880,7 +3880,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" +source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" dependencies = [ "jsonrpc-core", "jsonrpc-core-client", @@ -3898,7 +3898,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc-runtime-api" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" +source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" dependencies = [ "frame-support", "parity-scale-codec", @@ -3911,7 +3911,7 @@ dependencies = [ [[package]] name = "pallet-treasury" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" +source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" dependencies = [ "frame-benchmarking", "frame-support", @@ -3926,7 +3926,7 @@ dependencies = [ [[package]] name = "pallet-utility" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" +source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" dependencies = [ "frame-benchmarking", "frame-support", @@ -3942,7 +3942,7 @@ dependencies = [ [[package]] name = "pallet-vesting" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" +source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" dependencies = [ "enumflags2", "frame-benchmarking", @@ -5874,7 +5874,7 @@ dependencies = [ [[package]] name = "sc-authority-discovery" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" +source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" dependencies = [ "bytes 0.5.4", "derive_more 0.99.8", @@ -5901,7 +5901,7 @@ dependencies = [ [[package]] name = "sc-basic-authorship" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" +source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -5925,7 +5925,7 @@ dependencies = [ [[package]] name = "sc-block-builder" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" +source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" dependencies = [ "parity-scale-codec", "sc-client-api", @@ -5942,7 +5942,7 @@ dependencies = [ [[package]] name = "sc-chain-spec" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" +source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" dependencies = [ "impl-trait-for-tuples", "sc-chain-spec-derive", @@ -5958,7 +5958,7 @@ dependencies = [ [[package]] name = "sc-chain-spec-derive" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" +source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -5969,7 +5969,7 @@ dependencies = [ [[package]] name = "sc-cli" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" +source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" dependencies = [ "ansi_term 0.12.1", "atty", @@ -6010,7 +6010,7 @@ dependencies = [ [[package]] name = "sc-client-api" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" +source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" dependencies = [ "derive_more 0.99.8", "fnv", @@ -6046,7 +6046,7 @@ dependencies = [ [[package]] name = "sc-client-db" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" +source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" dependencies = [ "blake2-rfc", "hash-db", @@ -6075,7 +6075,7 @@ dependencies = [ [[package]] name = "sc-consensus" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" +source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" dependencies = [ "sc-client-api", "sp-blockchain", @@ -6086,7 +6086,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" +source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" dependencies = [ "derive_more 0.99.8", "fork-tree", @@ -6128,7 +6128,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe-rpc" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" +source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" dependencies = [ "derive_more 0.99.8", "futures 0.3.5", @@ -6152,7 +6152,7 @@ dependencies = [ [[package]] name = "sc-consensus-epochs" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" +source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" dependencies = [ "fork-tree", "parity-scale-codec", @@ -6165,7 +6165,7 @@ dependencies = [ [[package]] name = "sc-consensus-slots" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" +source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6188,7 +6188,7 @@ dependencies = [ [[package]] name = "sc-consensus-uncles" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" +source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" dependencies = [ "log 0.4.8", "sc-client-api", @@ -6202,7 +6202,7 @@ dependencies = [ [[package]] name = "sc-executor" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" +source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" dependencies = [ "derive_more 0.99.8", "lazy_static", @@ -6230,7 +6230,7 @@ dependencies = [ [[package]] name = "sc-executor-common" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" +source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" dependencies = [ "derive_more 0.99.8", "log 0.4.8", @@ -6247,7 +6247,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmi" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" +source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" dependencies = [ "log 0.4.8", "parity-scale-codec", @@ -6262,7 +6262,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmtime" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" +source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" dependencies = [ "cranelift-codegen", "cranelift-wasm", @@ -6283,7 +6283,7 @@ dependencies = [ [[package]] name = "sc-finality-grandpa" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" +source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" dependencies = [ "assert_matches", "derive_more 0.99.8", @@ -6321,7 +6321,7 @@ dependencies = [ [[package]] name = "sc-finality-grandpa-rpc" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" +source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" dependencies = [ "derive_more 0.99.8", "finality-grandpa", @@ -6338,7 +6338,7 @@ dependencies = [ [[package]] name = "sc-informant" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" +source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" dependencies = [ "ansi_term 0.12.1", "futures 0.3.5", @@ -6356,7 +6356,7 @@ dependencies = [ [[package]] name = "sc-keystore" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" +source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" dependencies = [ "derive_more 0.99.8", "hex", @@ -6372,7 +6372,7 @@ dependencies = [ [[package]] name = "sc-light" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" +source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" dependencies = [ "hash-db", "lazy_static", @@ -6391,7 +6391,7 @@ dependencies = [ [[package]] name = "sc-network" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" +source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" dependencies = [ "bitflags", "bs58", @@ -6443,7 +6443,7 @@ dependencies = [ [[package]] name = "sc-network-gossip" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" +source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6458,7 +6458,7 @@ dependencies = [ [[package]] name = "sc-network-test" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" +source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" dependencies = [ "env_logger", "futures 0.3.5", @@ -6485,7 +6485,7 @@ dependencies = [ [[package]] name = "sc-offchain" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" +source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" dependencies = [ "bytes 0.5.4", "fnv", @@ -6512,7 +6512,7 @@ dependencies = [ [[package]] name = "sc-peerset" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" +source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" dependencies = [ "futures 0.3.5", "libp2p", @@ -6525,7 +6525,7 @@ dependencies = [ [[package]] name = "sc-proposer-metrics" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" +source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" dependencies = [ "log 0.4.8", "substrate-prometheus-endpoint", @@ -6534,7 +6534,7 @@ dependencies = [ [[package]] name = "sc-rpc" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" +source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" dependencies = [ "futures 0.3.5", "hash-db", @@ -6566,7 +6566,7 @@ dependencies = [ [[package]] name = "sc-rpc-api" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" +source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" dependencies = [ "derive_more 0.99.8", "futures 0.3.5", @@ -6590,7 +6590,7 @@ dependencies = [ [[package]] name = "sc-rpc-server" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" +source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" dependencies = [ "jsonrpc-core", "jsonrpc-http-server", @@ -6606,7 +6606,7 @@ dependencies = [ [[package]] name = "sc-service" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" +source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" dependencies = [ "derive_more 0.99.8", "directories", @@ -6669,7 +6669,7 @@ dependencies = [ [[package]] name = "sc-state-db" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" +source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" dependencies = [ "log 0.4.8", "parity-scale-codec", @@ -6683,7 +6683,7 @@ dependencies = [ [[package]] name = "sc-telemetry" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" +source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6704,7 +6704,7 @@ dependencies = [ [[package]] name = "sc-tracing" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" +source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" dependencies = [ "erased-serde", "log 0.4.8", @@ -6721,7 +6721,7 @@ dependencies = [ [[package]] name = "sc-transaction-graph" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" +source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" dependencies = [ "derive_more 0.99.8", "futures 0.3.5", @@ -6741,7 +6741,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" +source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" dependencies = [ "derive_more 0.99.8", "futures 0.3.5", @@ -7148,7 +7148,7 @@ dependencies = [ [[package]] name = "sp-allocator" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" +source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" dependencies = [ "derive_more 0.99.8", "log 0.4.8", @@ -7160,7 +7160,7 @@ dependencies = [ [[package]] name = "sp-api" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" +source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" dependencies = [ "hash-db", "parity-scale-codec", @@ -7175,7 +7175,7 @@ dependencies = [ [[package]] name = "sp-api-proc-macro" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" +source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" dependencies = [ "blake2-rfc", "proc-macro-crate", @@ -7187,7 +7187,7 @@ dependencies = [ [[package]] name = "sp-application-crypto" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" +source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" dependencies = [ "parity-scale-codec", "serde", @@ -7199,7 +7199,7 @@ dependencies = [ [[package]] name = "sp-arithmetic" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" +source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" dependencies = [ "integer-sqrt", "num-traits 0.2.12", @@ -7212,7 +7212,7 @@ dependencies = [ [[package]] name = "sp-authority-discovery" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" +source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" dependencies = [ "parity-scale-codec", "sp-api", @@ -7224,7 +7224,7 @@ dependencies = [ [[package]] name = "sp-authorship" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" +source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" dependencies = [ "parity-scale-codec", "sp-inherents", @@ -7235,7 +7235,7 @@ dependencies = [ [[package]] name = "sp-block-builder" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" +source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" dependencies = [ "parity-scale-codec", "sp-api", @@ -7247,7 +7247,7 @@ dependencies = [ [[package]] name = "sp-blockchain" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" +source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" dependencies = [ "derive_more 0.99.8", "log 0.4.8", @@ -7256,6 +7256,7 @@ dependencies = [ "parking_lot 0.10.2", "sp-block-builder", "sp-consensus", + "sp-database", "sp-runtime", "sp-state-machine", ] @@ -7263,7 +7264,7 @@ dependencies = [ [[package]] name = "sp-chain-spec" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" +source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" dependencies = [ "serde", "serde_json", @@ -7272,7 +7273,7 @@ dependencies = [ [[package]] name = "sp-consensus" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" +source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" dependencies = [ "derive_more 0.99.8", "futures 0.3.5", @@ -7287,6 +7288,7 @@ dependencies = [ "sp-runtime", "sp-state-machine", "sp-std", + "sp-trie", "sp-utils", "sp-version", "substrate-prometheus-endpoint", @@ -7296,7 +7298,7 @@ dependencies = [ [[package]] name = "sp-consensus-aura" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" +source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" dependencies = [ "parity-scale-codec", "sp-api", @@ -7310,7 +7312,7 @@ dependencies = [ [[package]] name = "sp-consensus-babe" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" +source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" dependencies = [ "merlin", "parity-scale-codec", @@ -7329,7 +7331,7 @@ dependencies = [ [[package]] name = "sp-consensus-slots" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" +source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" dependencies = [ "parity-scale-codec", "sp-runtime", @@ -7338,7 +7340,7 @@ dependencies = [ [[package]] name = "sp-consensus-vrf" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" +source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" dependencies = [ "parity-scale-codec", "schnorrkel", @@ -7350,7 +7352,7 @@ dependencies = [ [[package]] name = "sp-core" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" +source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" dependencies = [ "base58", "blake2-rfc", @@ -7393,7 +7395,7 @@ dependencies = [ [[package]] name = "sp-database" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" +source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" dependencies = [ "kvdb", "parking_lot 0.10.2", @@ -7402,7 +7404,7 @@ dependencies = [ [[package]] name = "sp-debug-derive" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" +source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" dependencies = [ "proc-macro2 1.0.18", "quote 1.0.7", @@ -7412,7 +7414,7 @@ dependencies = [ [[package]] name = "sp-externalities" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" +source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" dependencies = [ "environmental", "parity-scale-codec", @@ -7423,7 +7425,7 @@ dependencies = [ [[package]] name = "sp-finality-grandpa" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" +source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" dependencies = [ "finality-grandpa", "log 0.4.8", @@ -7439,7 +7441,7 @@ dependencies = [ [[package]] name = "sp-finality-tracker" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" +source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" dependencies = [ "parity-scale-codec", "sp-inherents", @@ -7449,7 +7451,7 @@ dependencies = [ [[package]] name = "sp-inherents" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" +source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" dependencies = [ "derive_more 0.99.8", "parity-scale-codec", @@ -7461,7 +7463,7 @@ dependencies = [ [[package]] name = "sp-io" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" +source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" dependencies = [ "futures 0.3.5", "hash-db", @@ -7482,7 +7484,7 @@ dependencies = [ [[package]] name = "sp-keyring" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" +source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" dependencies = [ "lazy_static", "sp-core", @@ -7493,7 +7495,7 @@ dependencies = [ [[package]] name = "sp-npos-elections" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" +source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" dependencies = [ "parity-scale-codec", "serde", @@ -7505,7 +7507,7 @@ dependencies = [ [[package]] name = "sp-npos-elections-compact" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" +source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -7516,7 +7518,7 @@ dependencies = [ [[package]] name = "sp-offchain" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" +source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" dependencies = [ "sp-api", "sp-core", @@ -7526,7 +7528,7 @@ dependencies = [ [[package]] name = "sp-panic-handler" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" +source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" dependencies = [ "backtrace", "log 0.4.8", @@ -7535,7 +7537,7 @@ dependencies = [ [[package]] name = "sp-rpc" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" +source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" dependencies = [ "serde", "sp-core", @@ -7544,7 +7546,7 @@ dependencies = [ [[package]] name = "sp-runtime" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" +source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" dependencies = [ "either", "hash256-std-hasher", @@ -7566,7 +7568,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" +source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" dependencies = [ "parity-scale-codec", "primitive-types", @@ -7581,7 +7583,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" +source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" dependencies = [ "Inflector", "proc-macro-crate", @@ -7593,7 +7595,7 @@ dependencies = [ [[package]] name = "sp-serializer" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" +source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" dependencies = [ "serde", "serde_json", @@ -7602,7 +7604,7 @@ dependencies = [ [[package]] name = "sp-session" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" +source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" dependencies = [ "parity-scale-codec", "sp-api", @@ -7615,7 +7617,7 @@ dependencies = [ [[package]] name = "sp-staking" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" +source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" dependencies = [ "parity-scale-codec", "sp-runtime", @@ -7625,7 +7627,7 @@ dependencies = [ [[package]] name = "sp-state-machine" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" +source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" dependencies = [ "hash-db", "itertools 0.9.0", @@ -7646,12 +7648,12 @@ dependencies = [ [[package]] name = "sp-std" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" +source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" [[package]] name = "sp-storage" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" +source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" dependencies = [ "impl-serde 0.2.3", "ref-cast", @@ -7663,7 +7665,7 @@ dependencies = [ [[package]] name = "sp-timestamp" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" +source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -7677,7 +7679,7 @@ dependencies = [ [[package]] name = "sp-tracing" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" +source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" dependencies = [ "log 0.4.8", "rental", @@ -7687,7 +7689,7 @@ dependencies = [ [[package]] name = "sp-transaction-pool" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" +source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" dependencies = [ "derive_more 0.99.8", "futures 0.3.5", @@ -7703,7 +7705,7 @@ dependencies = [ [[package]] name = "sp-trie" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" +source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" dependencies = [ "hash-db", "memory-db", @@ -7717,7 +7719,7 @@ dependencies = [ [[package]] name = "sp-utils" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" +source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" dependencies = [ "futures 0.3.5", "futures-core", @@ -7729,7 +7731,7 @@ dependencies = [ [[package]] name = "sp-version" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" +source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" dependencies = [ "impl-serde 0.2.3", "parity-scale-codec", @@ -7741,7 +7743,7 @@ dependencies = [ [[package]] name = "sp-wasm-interface" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" +source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -7881,7 +7883,7 @@ dependencies = [ [[package]] name = "substrate-browser-utils" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" +source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" dependencies = [ "chrono", "clear_on_drop", @@ -7908,7 +7910,7 @@ dependencies = [ [[package]] name = "substrate-build-script-utils" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" +source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" dependencies = [ "platforms", ] @@ -7916,7 +7918,7 @@ dependencies = [ [[package]] name = "substrate-frame-rpc-system" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" +source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" dependencies = [ "frame-system-rpc-runtime-api", "futures 0.3.5", @@ -7939,7 +7941,7 @@ dependencies = [ [[package]] name = "substrate-prometheus-endpoint" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" +source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" dependencies = [ "async-std", "derive_more 0.99.8", @@ -7953,7 +7955,7 @@ dependencies = [ [[package]] name = "substrate-test-client" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" +source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" dependencies = [ "futures 0.1.29", "futures 0.3.5", @@ -7979,7 +7981,7 @@ dependencies = [ [[package]] name = "substrate-test-runtime" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" +source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" dependencies = [ "cfg-if", "frame-executive", @@ -8019,7 +8021,7 @@ dependencies = [ [[package]] name = "substrate-test-runtime-client" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" +source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" dependencies = [ "futures 0.3.5", "parity-scale-codec", @@ -8040,7 +8042,7 @@ dependencies = [ [[package]] name = "substrate-wasm-builder-runner" version = "1.0.6" -source = "git+https://github.com/paritytech/substrate#b9d96fabd2462cb42862fd0a117ed42bb98401aa" +source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" [[package]] name = "substrate-wasm-builder-runner" diff --git a/node/service/src/lib.rs b/node/service/src/lib.rs index 23a6dbfd41..772481672a 100644 --- a/node/service/src/lib.rs +++ b/node/service/src/lib.rs @@ -172,10 +172,12 @@ macro_rules! new_full_start { builder.client().clone(), builder.prometheus_registry(), ); - let pool = sc_transaction_pool::BasicPool::new( + let pool = sc_transaction_pool::BasicPool::new_full( builder.config().transaction_pool.clone(), std::sync::Arc::new(pool_api), builder.prometheus_registry(), + builder.spawn_handle(), + builder.client().clone(), ); Ok(pool) })? @@ -509,12 +511,12 @@ macro_rules! new_light { builder.client().clone(), fetcher, ); - let pool = sc_transaction_pool::BasicPool::with_revalidation_type( + let pool = Arc::new(sc_transaction_pool::BasicPool::new_light( builder.config().transaction_pool.clone(), Arc::new(pool_api), builder.prometheus_registry(), - sc_transaction_pool::RevalidationType::Light, - ); + builder.spawn_handle(), + )); Ok(pool) })? .with_import_queue_and_fprb(| diff --git a/service/src/lib.rs b/service/src/lib.rs index 313791611b..eaa5f9682f 100644 --- a/service/src/lib.rs +++ b/service/src/lib.rs @@ -160,10 +160,12 @@ macro_rules! new_full_start { builder.client().clone(), builder.prometheus_registry(), ); - let pool = sc_transaction_pool::BasicPool::new( + let pool = sc_transaction_pool::BasicPool::new_full( builder.config().transaction_pool.clone(), std::sync::Arc::new(pool_api), builder.prometheus_registry(), + builder.spawn_handle(), + builder.client().clone(), ); Ok(pool) })? @@ -626,12 +628,12 @@ macro_rules! new_light { builder.client().clone(), fetcher, ); - let pool = sc_transaction_pool::BasicPool::with_revalidation_type( + let pool = Arc::new(sc_transaction_pool::BasicPool::new_light( builder.config().transaction_pool.clone(), Arc::new(pool_api), builder.prometheus_registry(), - sc_transaction_pool::RevalidationType::Light, - ); + builder.spawn_handle(), + )); Ok(pool) })? .with_import_queue_and_fprb(| -- GitLab From 10928c7278dc375c1674d805dea26721f4305438 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Thu, 9 Jul 2020 17:24:00 +0200 Subject: [PATCH 054/192] Companion for #6620 (#1386) * Companiong for #6620 https://github.com/paritytech/substrate/pull/6620 * 'Update substrate' Co-authored-by: parity-processbot <> --- Cargo.lock | 274 ++++++++++++++++++++++----------------------- cli/src/command.rs | 4 +- 2 files changed, 139 insertions(+), 139 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 0c344600c2..b749998cd3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1285,7 +1285,7 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "fork-tree" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" +source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ "parity-scale-codec", ] @@ -1293,7 +1293,7 @@ dependencies = [ [[package]] name = "frame-benchmarking" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" +source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ "frame-support", "frame-system", @@ -1310,7 +1310,7 @@ dependencies = [ [[package]] name = "frame-benchmarking-cli" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" +source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ "Inflector", "frame-benchmarking", @@ -1329,7 +1329,7 @@ dependencies = [ [[package]] name = "frame-executive" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" +source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ "frame-support", "frame-system", @@ -1344,7 +1344,7 @@ dependencies = [ [[package]] name = "frame-metadata" version = "11.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" +source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ "parity-scale-codec", "serde", @@ -1355,7 +1355,7 @@ dependencies = [ [[package]] name = "frame-support" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" +source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ "bitmask", "frame-metadata", @@ -1380,7 +1380,7 @@ dependencies = [ [[package]] name = "frame-support-procedural" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" +source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ "frame-support-procedural-tools", "proc-macro2 1.0.18", @@ -1391,7 +1391,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" +source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ "frame-support-procedural-tools-derive", "proc-macro-crate", @@ -1403,7 +1403,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools-derive" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" +source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ "proc-macro2 1.0.18", "quote 1.0.7", @@ -1413,7 +1413,7 @@ dependencies = [ [[package]] name = "frame-system" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" +source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ "frame-support", "impl-trait-for-tuples", @@ -1429,7 +1429,7 @@ dependencies = [ [[package]] name = "frame-system-benchmarking" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" +source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ "frame-benchmarking", "frame-support", @@ -1443,7 +1443,7 @@ dependencies = [ [[package]] name = "frame-system-rpc-runtime-api" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" +source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ "parity-scale-codec", "sp-api", @@ -3409,7 +3409,7 @@ dependencies = [ [[package]] name = "pallet-authority-discovery" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" +source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ "frame-support", "frame-system", @@ -3425,7 +3425,7 @@ dependencies = [ [[package]] name = "pallet-authorship" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" +source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ "frame-support", "frame-system", @@ -3440,7 +3440,7 @@ dependencies = [ [[package]] name = "pallet-babe" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" +source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ "frame-benchmarking", "frame-support", @@ -3465,7 +3465,7 @@ dependencies = [ [[package]] name = "pallet-balances" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" +source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ "frame-benchmarking", "frame-support", @@ -3479,7 +3479,7 @@ dependencies = [ [[package]] name = "pallet-collective" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" +source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ "frame-benchmarking", "frame-support", @@ -3495,7 +3495,7 @@ dependencies = [ [[package]] name = "pallet-democracy" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" +source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ "frame-benchmarking", "frame-support", @@ -3510,7 +3510,7 @@ dependencies = [ [[package]] name = "pallet-elections-phragmen" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" +source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ "frame-benchmarking", "frame-support", @@ -3525,7 +3525,7 @@ dependencies = [ [[package]] name = "pallet-finality-tracker" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" +source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ "frame-support", "frame-system", @@ -3541,7 +3541,7 @@ dependencies = [ [[package]] name = "pallet-grandpa" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" +source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ "frame-support", "frame-system", @@ -3561,7 +3561,7 @@ dependencies = [ [[package]] name = "pallet-identity" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" +source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ "enumflags2", "frame-benchmarking", @@ -3577,7 +3577,7 @@ dependencies = [ [[package]] name = "pallet-im-online" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" +source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ "frame-benchmarking", "frame-support", @@ -3597,7 +3597,7 @@ dependencies = [ [[package]] name = "pallet-indices" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" +source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ "frame-support", "frame-system", @@ -3613,7 +3613,7 @@ dependencies = [ [[package]] name = "pallet-membership" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" +source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ "frame-support", "frame-system", @@ -3627,7 +3627,7 @@ dependencies = [ [[package]] name = "pallet-multisig" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" +source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ "frame-support", "frame-system", @@ -3642,7 +3642,7 @@ dependencies = [ [[package]] name = "pallet-nicks" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" +source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ "frame-support", "frame-system", @@ -3656,7 +3656,7 @@ dependencies = [ [[package]] name = "pallet-offences" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" +source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ "frame-support", "frame-system", @@ -3671,7 +3671,7 @@ dependencies = [ [[package]] name = "pallet-offences-benchmarking" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" +source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ "frame-benchmarking", "frame-support", @@ -3692,7 +3692,7 @@ dependencies = [ [[package]] name = "pallet-proxy" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" +source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ "frame-support", "frame-system", @@ -3707,7 +3707,7 @@ dependencies = [ [[package]] name = "pallet-randomness-collective-flip" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" +source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ "frame-support", "frame-system", @@ -3720,7 +3720,7 @@ dependencies = [ [[package]] name = "pallet-recovery" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" +source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ "enumflags2", "frame-support", @@ -3735,7 +3735,7 @@ dependencies = [ [[package]] name = "pallet-scheduler" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" +source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ "frame-benchmarking", "frame-support", @@ -3750,7 +3750,7 @@ dependencies = [ [[package]] name = "pallet-session" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" +source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ "frame-support", "frame-system", @@ -3770,7 +3770,7 @@ dependencies = [ [[package]] name = "pallet-session-benchmarking" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" +source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ "frame-benchmarking", "frame-support", @@ -3786,7 +3786,7 @@ dependencies = [ [[package]] name = "pallet-society" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" +source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ "frame-support", "frame-system", @@ -3800,7 +3800,7 @@ dependencies = [ [[package]] name = "pallet-staking" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" +source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ "frame-benchmarking", "frame-support", @@ -3822,7 +3822,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-curve" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" +source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -3833,7 +3833,7 @@ dependencies = [ [[package]] name = "pallet-sudo" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" +source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ "frame-support", "frame-system", @@ -3847,7 +3847,7 @@ dependencies = [ [[package]] name = "pallet-timestamp" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" +source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ "frame-benchmarking", "frame-support", @@ -3865,7 +3865,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" +source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ "frame-support", "frame-system", @@ -3880,7 +3880,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" +source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ "jsonrpc-core", "jsonrpc-core-client", @@ -3898,7 +3898,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc-runtime-api" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" +source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ "frame-support", "parity-scale-codec", @@ -3911,7 +3911,7 @@ dependencies = [ [[package]] name = "pallet-treasury" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" +source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ "frame-benchmarking", "frame-support", @@ -3926,7 +3926,7 @@ dependencies = [ [[package]] name = "pallet-utility" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" +source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ "frame-benchmarking", "frame-support", @@ -3942,7 +3942,7 @@ dependencies = [ [[package]] name = "pallet-vesting" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" +source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ "enumflags2", "frame-benchmarking", @@ -5874,7 +5874,7 @@ dependencies = [ [[package]] name = "sc-authority-discovery" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" +source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ "bytes 0.5.4", "derive_more 0.99.8", @@ -5901,7 +5901,7 @@ dependencies = [ [[package]] name = "sc-basic-authorship" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" +source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -5925,7 +5925,7 @@ dependencies = [ [[package]] name = "sc-block-builder" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" +source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ "parity-scale-codec", "sc-client-api", @@ -5942,7 +5942,7 @@ dependencies = [ [[package]] name = "sc-chain-spec" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" +source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ "impl-trait-for-tuples", "sc-chain-spec-derive", @@ -5958,7 +5958,7 @@ dependencies = [ [[package]] name = "sc-chain-spec-derive" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" +source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -5969,7 +5969,7 @@ dependencies = [ [[package]] name = "sc-cli" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" +source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ "ansi_term 0.12.1", "atty", @@ -6010,7 +6010,7 @@ dependencies = [ [[package]] name = "sc-client-api" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" +source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ "derive_more 0.99.8", "fnv", @@ -6046,7 +6046,7 @@ dependencies = [ [[package]] name = "sc-client-db" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" +source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ "blake2-rfc", "hash-db", @@ -6075,7 +6075,7 @@ dependencies = [ [[package]] name = "sc-consensus" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" +source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ "sc-client-api", "sp-blockchain", @@ -6086,7 +6086,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" +source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ "derive_more 0.99.8", "fork-tree", @@ -6128,7 +6128,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe-rpc" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" +source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ "derive_more 0.99.8", "futures 0.3.5", @@ -6152,7 +6152,7 @@ dependencies = [ [[package]] name = "sc-consensus-epochs" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" +source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ "fork-tree", "parity-scale-codec", @@ -6165,7 +6165,7 @@ dependencies = [ [[package]] name = "sc-consensus-slots" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" +source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6188,7 +6188,7 @@ dependencies = [ [[package]] name = "sc-consensus-uncles" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" +source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ "log 0.4.8", "sc-client-api", @@ -6202,7 +6202,7 @@ dependencies = [ [[package]] name = "sc-executor" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" +source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ "derive_more 0.99.8", "lazy_static", @@ -6230,7 +6230,7 @@ dependencies = [ [[package]] name = "sc-executor-common" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" +source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ "derive_more 0.99.8", "log 0.4.8", @@ -6247,7 +6247,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmi" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" +source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ "log 0.4.8", "parity-scale-codec", @@ -6262,7 +6262,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmtime" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" +source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ "cranelift-codegen", "cranelift-wasm", @@ -6283,7 +6283,7 @@ dependencies = [ [[package]] name = "sc-finality-grandpa" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" +source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ "assert_matches", "derive_more 0.99.8", @@ -6321,7 +6321,7 @@ dependencies = [ [[package]] name = "sc-finality-grandpa-rpc" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" +source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ "derive_more 0.99.8", "finality-grandpa", @@ -6338,7 +6338,7 @@ dependencies = [ [[package]] name = "sc-informant" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" +source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ "ansi_term 0.12.1", "futures 0.3.5", @@ -6356,7 +6356,7 @@ dependencies = [ [[package]] name = "sc-keystore" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" +source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ "derive_more 0.99.8", "hex", @@ -6372,7 +6372,7 @@ dependencies = [ [[package]] name = "sc-light" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" +source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ "hash-db", "lazy_static", @@ -6391,7 +6391,7 @@ dependencies = [ [[package]] name = "sc-network" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" +source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ "bitflags", "bs58", @@ -6443,7 +6443,7 @@ dependencies = [ [[package]] name = "sc-network-gossip" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" +source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6458,7 +6458,7 @@ dependencies = [ [[package]] name = "sc-network-test" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" +source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ "env_logger", "futures 0.3.5", @@ -6485,7 +6485,7 @@ dependencies = [ [[package]] name = "sc-offchain" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" +source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ "bytes 0.5.4", "fnv", @@ -6512,7 +6512,7 @@ dependencies = [ [[package]] name = "sc-peerset" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" +source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ "futures 0.3.5", "libp2p", @@ -6525,7 +6525,7 @@ dependencies = [ [[package]] name = "sc-proposer-metrics" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" +source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ "log 0.4.8", "substrate-prometheus-endpoint", @@ -6534,7 +6534,7 @@ dependencies = [ [[package]] name = "sc-rpc" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" +source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ "futures 0.3.5", "hash-db", @@ -6566,7 +6566,7 @@ dependencies = [ [[package]] name = "sc-rpc-api" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" +source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ "derive_more 0.99.8", "futures 0.3.5", @@ -6590,7 +6590,7 @@ dependencies = [ [[package]] name = "sc-rpc-server" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" +source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ "jsonrpc-core", "jsonrpc-http-server", @@ -6606,7 +6606,7 @@ dependencies = [ [[package]] name = "sc-service" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" +source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ "derive_more 0.99.8", "directories", @@ -6669,7 +6669,7 @@ dependencies = [ [[package]] name = "sc-state-db" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" +source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ "log 0.4.8", "parity-scale-codec", @@ -6683,7 +6683,7 @@ dependencies = [ [[package]] name = "sc-telemetry" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" +source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6704,7 +6704,7 @@ dependencies = [ [[package]] name = "sc-tracing" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" +source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ "erased-serde", "log 0.4.8", @@ -6721,7 +6721,7 @@ dependencies = [ [[package]] name = "sc-transaction-graph" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" +source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ "derive_more 0.99.8", "futures 0.3.5", @@ -6741,7 +6741,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" +source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ "derive_more 0.99.8", "futures 0.3.5", @@ -7148,7 +7148,7 @@ dependencies = [ [[package]] name = "sp-allocator" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" +source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ "derive_more 0.99.8", "log 0.4.8", @@ -7160,7 +7160,7 @@ dependencies = [ [[package]] name = "sp-api" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" +source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ "hash-db", "parity-scale-codec", @@ -7175,7 +7175,7 @@ dependencies = [ [[package]] name = "sp-api-proc-macro" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" +source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ "blake2-rfc", "proc-macro-crate", @@ -7187,7 +7187,7 @@ dependencies = [ [[package]] name = "sp-application-crypto" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" +source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ "parity-scale-codec", "serde", @@ -7199,7 +7199,7 @@ dependencies = [ [[package]] name = "sp-arithmetic" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" +source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ "integer-sqrt", "num-traits 0.2.12", @@ -7212,7 +7212,7 @@ dependencies = [ [[package]] name = "sp-authority-discovery" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" +source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ "parity-scale-codec", "sp-api", @@ -7224,7 +7224,7 @@ dependencies = [ [[package]] name = "sp-authorship" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" +source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ "parity-scale-codec", "sp-inherents", @@ -7235,7 +7235,7 @@ dependencies = [ [[package]] name = "sp-block-builder" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" +source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ "parity-scale-codec", "sp-api", @@ -7247,7 +7247,7 @@ dependencies = [ [[package]] name = "sp-blockchain" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" +source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ "derive_more 0.99.8", "log 0.4.8", @@ -7264,7 +7264,7 @@ dependencies = [ [[package]] name = "sp-chain-spec" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" +source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ "serde", "serde_json", @@ -7273,7 +7273,7 @@ dependencies = [ [[package]] name = "sp-consensus" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" +source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ "derive_more 0.99.8", "futures 0.3.5", @@ -7298,7 +7298,7 @@ dependencies = [ [[package]] name = "sp-consensus-aura" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" +source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ "parity-scale-codec", "sp-api", @@ -7312,7 +7312,7 @@ dependencies = [ [[package]] name = "sp-consensus-babe" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" +source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ "merlin", "parity-scale-codec", @@ -7331,7 +7331,7 @@ dependencies = [ [[package]] name = "sp-consensus-slots" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" +source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ "parity-scale-codec", "sp-runtime", @@ -7340,7 +7340,7 @@ dependencies = [ [[package]] name = "sp-consensus-vrf" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" +source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ "parity-scale-codec", "schnorrkel", @@ -7352,7 +7352,7 @@ dependencies = [ [[package]] name = "sp-core" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" +source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ "base58", "blake2-rfc", @@ -7395,7 +7395,7 @@ dependencies = [ [[package]] name = "sp-database" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" +source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ "kvdb", "parking_lot 0.10.2", @@ -7404,7 +7404,7 @@ dependencies = [ [[package]] name = "sp-debug-derive" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" +source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ "proc-macro2 1.0.18", "quote 1.0.7", @@ -7414,7 +7414,7 @@ dependencies = [ [[package]] name = "sp-externalities" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" +source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ "environmental", "parity-scale-codec", @@ -7425,7 +7425,7 @@ dependencies = [ [[package]] name = "sp-finality-grandpa" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" +source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ "finality-grandpa", "log 0.4.8", @@ -7441,7 +7441,7 @@ dependencies = [ [[package]] name = "sp-finality-tracker" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" +source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ "parity-scale-codec", "sp-inherents", @@ -7451,7 +7451,7 @@ dependencies = [ [[package]] name = "sp-inherents" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" +source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ "derive_more 0.99.8", "parity-scale-codec", @@ -7463,7 +7463,7 @@ dependencies = [ [[package]] name = "sp-io" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" +source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ "futures 0.3.5", "hash-db", @@ -7484,7 +7484,7 @@ dependencies = [ [[package]] name = "sp-keyring" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" +source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ "lazy_static", "sp-core", @@ -7495,7 +7495,7 @@ dependencies = [ [[package]] name = "sp-npos-elections" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" +source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ "parity-scale-codec", "serde", @@ -7507,7 +7507,7 @@ dependencies = [ [[package]] name = "sp-npos-elections-compact" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" +source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -7518,7 +7518,7 @@ dependencies = [ [[package]] name = "sp-offchain" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" +source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ "sp-api", "sp-core", @@ -7528,7 +7528,7 @@ dependencies = [ [[package]] name = "sp-panic-handler" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" +source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ "backtrace", "log 0.4.8", @@ -7537,7 +7537,7 @@ dependencies = [ [[package]] name = "sp-rpc" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" +source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ "serde", "sp-core", @@ -7546,7 +7546,7 @@ dependencies = [ [[package]] name = "sp-runtime" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" +source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ "either", "hash256-std-hasher", @@ -7568,7 +7568,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" +source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ "parity-scale-codec", "primitive-types", @@ -7583,7 +7583,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" +source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ "Inflector", "proc-macro-crate", @@ -7595,7 +7595,7 @@ dependencies = [ [[package]] name = "sp-serializer" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" +source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ "serde", "serde_json", @@ -7604,7 +7604,7 @@ dependencies = [ [[package]] name = "sp-session" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" +source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ "parity-scale-codec", "sp-api", @@ -7617,7 +7617,7 @@ dependencies = [ [[package]] name = "sp-staking" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" +source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ "parity-scale-codec", "sp-runtime", @@ -7627,7 +7627,7 @@ dependencies = [ [[package]] name = "sp-state-machine" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" +source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ "hash-db", "itertools 0.9.0", @@ -7648,12 +7648,12 @@ dependencies = [ [[package]] name = "sp-std" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" +source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" [[package]] name = "sp-storage" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" +source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ "impl-serde 0.2.3", "ref-cast", @@ -7665,7 +7665,7 @@ dependencies = [ [[package]] name = "sp-timestamp" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" +source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -7679,7 +7679,7 @@ dependencies = [ [[package]] name = "sp-tracing" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" +source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ "log 0.4.8", "rental", @@ -7689,7 +7689,7 @@ dependencies = [ [[package]] name = "sp-transaction-pool" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" +source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ "derive_more 0.99.8", "futures 0.3.5", @@ -7705,7 +7705,7 @@ dependencies = [ [[package]] name = "sp-trie" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" +source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ "hash-db", "memory-db", @@ -7719,7 +7719,7 @@ dependencies = [ [[package]] name = "sp-utils" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" +source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ "futures 0.3.5", "futures-core", @@ -7731,7 +7731,7 @@ dependencies = [ [[package]] name = "sp-version" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" +source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ "impl-serde 0.2.3", "parity-scale-codec", @@ -7743,7 +7743,7 @@ dependencies = [ [[package]] name = "sp-wasm-interface" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" +source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -7883,7 +7883,7 @@ dependencies = [ [[package]] name = "substrate-browser-utils" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" +source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ "chrono", "clear_on_drop", @@ -7910,7 +7910,7 @@ dependencies = [ [[package]] name = "substrate-build-script-utils" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" +source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ "platforms", ] @@ -7918,7 +7918,7 @@ dependencies = [ [[package]] name = "substrate-frame-rpc-system" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" +source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ "frame-system-rpc-runtime-api", "futures 0.3.5", @@ -7941,7 +7941,7 @@ dependencies = [ [[package]] name = "substrate-prometheus-endpoint" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" +source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ "async-std", "derive_more 0.99.8", @@ -7955,7 +7955,7 @@ dependencies = [ [[package]] name = "substrate-test-client" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" +source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ "futures 0.1.29", "futures 0.3.5", @@ -7981,7 +7981,7 @@ dependencies = [ [[package]] name = "substrate-test-runtime" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" +source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ "cfg-if", "frame-executive", @@ -8021,7 +8021,7 @@ dependencies = [ [[package]] name = "substrate-test-runtime-client" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" +source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ "futures 0.3.5", "parity-scale-codec", @@ -8042,7 +8042,7 @@ dependencies = [ [[package]] name = "substrate-wasm-builder-runner" version = "1.0.6" -source = "git+https://github.com/paritytech/substrate#efbac7be80c6e8988a25339061078d3e300f132d" +source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" [[package]] name = "substrate-wasm-builder-runner" diff --git a/cli/src/command.rs b/cli/src/command.rs index 076ddb86f3..4d4b4080f0 100644 --- a/cli/src/command.rs +++ b/cli/src/command.rs @@ -19,7 +19,7 @@ use log::info; use service::{IdentifyVariant, self}; #[cfg(feature = "service-rewr")] use service_new::{IdentifyVariant, self as service}; -use sc_cli::{CliConfiguration, SubstrateCli, Result, RuntimeVersion, Role}; +use sc_cli::{SubstrateCli, Result, RuntimeVersion, Role}; use crate::cli::{Cli, Subcommand}; fn get_exec_name() -> Option { @@ -198,7 +198,7 @@ pub fn run() -> Result<()> { } }, Some(Subcommand::ValidationWorker(cmd)) => { - sc_cli::init_logger("", cli.run.base.log_rotation_opt()?)?; + sc_cli::init_logger("", None)?; if cfg!(feature = "browser") { Err(sc_cli::Error::Input("Cannot run validation worker in browser".into())) -- GitLab From 6aa5bfbad071741c977d468b14acd5d0e6243d9b Mon Sep 17 00:00:00 2001 From: Fedor Sakharov Date: Thu, 9 Jul 2020 23:23:58 +0300 Subject: [PATCH 055/192] CandidateBackingSubsystem (#1312) * Updates guide for CandidateBacking * Move assignment types to primitives * Initial implementation. * More functionality * use assert_matches * Changes to report misbehaviors * Some fixes after a review * Remove a blank line * Update guide and some types * Adds run_job function * Some comments and refactorings * Fix review * Remove warnings * Use summary in kicking off validation * Parallelize requests * Validation provides local and global validation params * Test issued validity tracking * Nits from review --- Cargo.lock | 776 +++++--- Cargo.toml | 1 + node/core/backing/Cargo.toml | 30 + node/core/backing/src/lib.rs | 1729 +++++++++++++++++ node/overseer/examples/minimal-example.rs | 1 + node/overseer/src/lib.rs | 1 + node/primitives/src/lib.rs | 134 +- node/subsystem/src/messages.rs | 36 +- primitives/src/parachain.rs | 125 +- .../src/node/backing/candidate-backing.md | 99 +- .../src/types/overseer-protocol.md | 43 +- runtime/parachains/src/inclusion.rs | 7 +- runtime/parachains/src/scheduler.rs | 94 +- statement-table/src/generic.rs | 17 +- 14 files changed, 2639 insertions(+), 454 deletions(-) create mode 100644 node/core/backing/Cargo.toml create mode 100644 node/core/backing/src/lib.rs diff --git a/Cargo.lock b/Cargo.lock index b749998cd3..7536eae33b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -12,13 +12,19 @@ dependencies = [ [[package]] name = "addr2line" -version = "0.12.1" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a49806b9dadc843c61e7c97e72490ad7f7220ae249012fbda9ad0609457c0543" +checksum = "1b6a2d3371669ab3ca9797670853d61402b03d0b4b9ebf33d677dfa720203072" dependencies = [ - "gimli 0.21.0", + "gimli 0.22.0", ] +[[package]] +name = "adler" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccc9a9dd069569f212bc4330af9f17c4afb5e8ce185e83dbb14f1349dda18b10" + [[package]] name = "adler32" version = "1.1.0" @@ -27,57 +33,56 @@ checksum = "567b077b825e468cc974f0020d4082ee6e03132512f207ef1a02fd5d00d1f32d" [[package]] name = "aead" -version = "0.2.0" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cf01b9b56e767bb57b94ebf91a58b338002963785cdd7013e21c0d4679471e4" +checksum = "7fc95d1bdb8e6666b2b217308eeeb09f2d6728d104be3e31916cc74d15420331" dependencies = [ - "generic-array", + "generic-array 0.14.2", ] [[package]] name = "aes" -version = "0.3.2" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54eb1d8fe354e5fc611daf4f2ea97dd45a765f4f1e4512306ec183ae2e8f20c9" +checksum = "f7001367fde4c768a19d1029f0a8be5abd9308e1119846d5bd9ad26297b8faf5" dependencies = [ "aes-soft", "aesni", - "block-cipher-trait", + "block-cipher", ] [[package]] name = "aes-gcm" -version = "0.5.0" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "834a6bda386024dbb7c8fc51322856c10ffe69559f972261c868485f5759c638" +checksum = "86f5007801316299f922a6198d1d09a0bae95786815d066d5880d13f7c45ead1" dependencies = [ "aead", "aes", - "block-cipher-trait", + "block-cipher", "ghash", "subtle 2.2.3", - "zeroize", ] [[package]] name = "aes-soft" -version = "0.3.3" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfd7e7ae3f9a1fb5c03b389fc6bb9a51400d0c13053f0dca698c832bfd893a0d" +checksum = "4925647ee64e5056cf231608957ce7c81e12d6d6e316b9ce1404778cc1d35fa7" dependencies = [ - "block-cipher-trait", + "block-cipher", "byteorder", - "opaque-debug", + "opaque-debug 0.2.3", ] [[package]] name = "aesni" -version = "0.6.0" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f70a6b5f971e473091ab7cfb5ffac6cde81666c4556751d8d5620ead8abf100" +checksum = "d050d39b0b7688b3a3254394c3e30a9d66c41dcf9b05b0e2dbdc623f6505d264" dependencies = [ - "block-cipher-trait", - "opaque-debug", + "block-cipher", + "opaque-debug 0.2.3", ] [[package]] @@ -97,9 +102,9 @@ checksum = "e8fd72866655d1904d6b0997d0b07ba561047d070fbe29de039031c641b61217" [[package]] name = "aho-corasick" -version = "0.7.10" +version = "0.7.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8716408b8bc624ed7f65d223ddb9ac2d044c0547b6fa4b0d554f3a9540496ada" +checksum = "043164d8ba5c4c3035fec9bbee8647c0261d788f3474306f93bb65901cae0e86" dependencies = [ "memchr", ] @@ -121,7 +126,7 @@ version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b" dependencies = [ - "winapi 0.3.8", + "winapi 0.3.9", ] [[package]] @@ -130,7 +135,7 @@ version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2" dependencies = [ - "winapi 0.3.8", + "winapi 0.3.9", ] [[package]] @@ -191,7 +196,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0d0864d84b8e07b145449be9a8537db86bf9de5ce03b913214694643b4743502" dependencies = [ "quote 1.0.7", - "syn 1.0.31", + "syn 1.0.33", ] [[package]] @@ -246,12 +251,12 @@ checksum = "c17772156ef2829aadc587461c7753af20b7e8db1529bc66855add962a3b35d3" [[package]] name = "async-tls" -version = "0.7.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95fd83426b89b034bf4e9ceb9c533c2f2386b813fd3dcae0a425ec6f1837d78a" +checksum = "df097e3f506bec0e1a24f06bb3c962c228f36671de841ff579cb99f371772634" dependencies = [ "futures 0.3.5", - "rustls", + "rustls 0.18.0", "webpki", "webpki-roots 0.19.0", ] @@ -264,7 +269,7 @@ checksum = "a265e3abeffdce30b2e26b7a11b222fe37c6067404001b434101457d0385eb92" dependencies = [ "proc-macro2 1.0.18", "quote 1.0.7", - "syn 1.0.31", + "syn 1.0.33", ] [[package]] @@ -275,7 +280,7 @@ checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" dependencies = [ "hermit-abi", "libc", - "winapi 0.3.8", + "winapi 0.3.9", ] [[package]] @@ -292,9 +297,9 @@ checksum = "f8aac770f1885fd7e387acedd76065302551364496e46b3dd00860b2f8359b9d" [[package]] name = "backtrace" -version = "0.3.49" +version = "0.3.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05100821de9e028f12ae3d189176b41ee198341eb8f369956407fea2f5cc666c" +checksum = "46254cf2fdcdf1badb5934448c1bcbe046a56537b3987d96c51a7afc5d03f293" dependencies = [ "addr2line", "cfg-if", @@ -318,15 +323,15 @@ checksum = "b41b7ea54a0c9d92199de89e20e58d49f02f8e699814ef3fdf266f6f748d15c7" [[package]] name = "base64" -version = "0.12.2" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e223af0dc48c96d4f8342ec01a4974f139df863896b316681efd36742f22cc67" +checksum = "3441f0f7b02788e948e47f457ca01f1d7e6d92c693bc132c22b087d3141c03ff" [[package]] name = "bincode" -version = "1.2.1" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5753e2a71534719bf3f4e57006c3a4f0d2c672a4b676eec84161f763eca87dbf" +checksum = "f30d3a39baa26f9651f17b375061f3233dde33424a8b72b0dbe93a68a0bc896d" dependencies = [ "byteorder", "serde", @@ -385,9 +390,22 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94cb07b0da6a73955f8fb85d24c466778e70cda767a568229b104f0264089330" dependencies = [ "byte-tools", - "crypto-mac", - "digest", - "opaque-debug", + "crypto-mac 0.7.0", + "digest 0.8.1", + "opaque-debug 0.2.3", +] + +[[package]] +name = "blake2" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84ce5b6108f8e154604bd4eb76a2f726066c3464d5a552a4229262a18c9bb471" +dependencies = [ + "byte-tools", + "byteorder", + "crypto-mac 0.8.0", + "digest 0.9.0", + "opaque-debug 0.2.3", ] [[package]] @@ -431,16 +449,25 @@ dependencies = [ "block-padding", "byte-tools", "byteorder", - "generic-array", + "generic-array 0.12.3", ] [[package]] -name = "block-cipher-trait" -version = "0.6.2" +name = "block-buffer" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" +dependencies = [ + "generic-array 0.14.2", +] + +[[package]] +name = "block-cipher" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c924d49bd09e7c06003acda26cd9742e796e34282ec6c1189404dee0c1f4774" +checksum = "fa136449e765dc7faa244561ccae839c394048667929af599b5d931ebe7b7f10" dependencies = [ - "generic-array", + "generic-array 0.14.2", ] [[package]] @@ -517,9 +544,12 @@ dependencies = [ [[package]] name = "bytes" -version = "0.5.4" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "130aac562c0dd69c56b3b1cc8ffd2e17be31d0b6c25b61c96b76231aa23e39e1" +checksum = "118cf036fbb97d0816e3c34b2d7a1e8cfc60f68fcf63d550ddbe9bd5f59c213b" +dependencies = [ + "loom", +] [[package]] name = "c_linked_list" @@ -535,9 +565,9 @@ checksum = "631ae5198c9be5e753e5cc215e1bd73c2b466a3565173db433f52bb9d3e66dba" [[package]] name = "cc" -version = "1.0.54" +version = "1.0.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7bbb73db36c1246e9034e307d0fba23f9a2e251faa47ade70c1bd252220c8311" +checksum = "f9a06fb2e53271d7c279ec1efea6ab691c35a2ae67ec0d91d7acec0caf13b518" dependencies = [ "jobserver", ] @@ -559,9 +589,9 @@ checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" [[package]] name = "chacha20" -version = "0.3.4" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6a7ae4c498f8447d86baef0fa0831909333f558866fabcb21600625ac5a31c7" +checksum = "086c0f07ac275808b7bf9a39f2fd013aae1498be83632814c8c4e0bd53f2dc58" dependencies = [ "stream-cipher", "zeroize", @@ -569,9 +599,9 @@ dependencies = [ [[package]] name = "chacha20poly1305" -version = "0.4.1" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48901293601228db2131606f741db33561f7576b5d19c99cd66222380a7dc863" +checksum = "18b0c90556d8e3fec7cf18d84a2f53d27b21288f2fe481b830fadcf809e48205" dependencies = [ "aead", "chacha20", @@ -582,9 +612,9 @@ dependencies = [ [[package]] name = "chrono" -version = "0.4.11" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80094f509cf8b5ae86a4966a39b3ff66cd7e2a3e594accec3743ff3fabeab5b2" +checksum = "c74d84029116787153e02106bf53e66828452a4b325cc8652b788b5967c0a0b6" dependencies = [ "js-sys", "num-integer", @@ -708,6 +738,12 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b3a71ab494c0b5b860bdc8407ae08978052417070c2ced38573a9157ad75b8ac" +[[package]] +name = "cpuid-bool" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d375c433320f6c5057ae04a04376eef4d04ce2801448cf8863a78da99107be4" + [[package]] name = "cranelift-bforest" version = "0.63.0" @@ -869,10 +905,20 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4434400df11d95d556bac068ddfedd482915eb18fe8bea89bc80b6e4b1c179e5" dependencies = [ - "generic-array", + "generic-array 0.12.3", "subtle 1.0.0", ] +[[package]] +name = "crypto-mac" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b584a330336237c1eecd3e94266efb216c56ed91225d634cb2991c5f3fd1aeab" +dependencies = [ + "generic-array 0.14.2", + "subtle 2.2.3", +] + [[package]] name = "ct-logs" version = "0.6.0" @@ -889,7 +935,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5d85653f070353a16313d0046f173f70d1aadd5b42600a14de626f0dfb3473a5" dependencies = [ "byteorder", - "digest", + "digest 0.8.1", "rand_core 0.5.1", "subtle 2.2.3", "zeroize", @@ -929,13 +975,13 @@ dependencies = [ [[package]] name = "derive_more" -version = "0.99.8" +version = "0.99.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc655351f820d774679da6cdc23355a93de496867d8203496675162e17b1d671" +checksum = "298998b1cf6b5b2c8a7b023dfd45821825ce3ba8a8af55c921a0e734e4653f76" dependencies = [ "proc-macro2 1.0.18", "quote 1.0.7", - "syn 1.0.31", + "syn 1.0.33", ] [[package]] @@ -950,7 +996,16 @@ version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f3d0c8c8752312f9713efd397ff63acb9f85585afbf179282e720e7704954dd5" dependencies = [ - "generic-array", + "generic-array 0.12.3", +] + +[[package]] +name = "digest" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" +dependencies = [ + "generic-array 0.14.2", ] [[package]] @@ -971,7 +1026,7 @@ checksum = "8e93d7f5705de3e49895a2b5e0b8855a1c27f080192ae9c32a6432d50741a57a" dependencies = [ "libc", "redox_users", - "winapi 0.3.8", + "winapi 0.3.9", ] [[package]] @@ -1008,7 +1063,7 @@ dependencies = [ "clear_on_drop", "curve25519-dalek", "rand 0.7.3", - "sha2", + "sha2 0.8.2", ] [[package]] @@ -1054,7 +1109,7 @@ checksum = "946ee94e3dbf58fdd324f9ce245c7b238d46a66f00e86a020b71996349e46cce" dependencies = [ "proc-macro2 1.0.18", "quote 1.0.7", - "syn 1.0.31", + "syn 1.0.33", ] [[package]] @@ -1093,7 +1148,7 @@ checksum = "b480f641ccf0faf324e20c1d3e53d81b7484c698b42ea677f6907ae4db195371" dependencies = [ "errno-dragonfly", "libc", - "winapi 0.3.8", + "winapi 0.3.9", ] [[package]] @@ -1160,7 +1215,7 @@ checksum = "aa4da3c766cd7a0db8242e326e9e4e081edd567072893ed320008189715366a4" dependencies = [ "proc-macro2 1.0.18", "quote 1.0.7", - "syn 1.0.31", + "syn 1.0.33", "synstructure", ] @@ -1251,9 +1306,9 @@ checksum = "37ab347416e802de484e4d03c7316c48f1ecb56574dfd4a46a80f173ce1de04d" [[package]] name = "flate2" -version = "1.0.14" +version = "1.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2cfff41391129e0a856d6d822600b8d71179d46879e310417eb9c762eb178b42" +checksum = "68c90b0fc46cf89d227cc78b40e494ff81287a92dd07631e5af0d06fe3cf885e" dependencies = [ "cfg-if", "crc32fast", @@ -1385,7 +1440,7 @@ dependencies = [ "frame-support-procedural-tools", "proc-macro2 1.0.18", "quote 1.0.7", - "syn 1.0.31", + "syn 1.0.33", ] [[package]] @@ -1397,7 +1452,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", "quote 1.0.7", - "syn 1.0.31", + "syn 1.0.33", ] [[package]] @@ -1407,7 +1462,7 @@ source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c67 dependencies = [ "proc-macro2 1.0.18", "quote 1.0.7", - "syn 1.0.31", + "syn 1.0.33", ] [[package]] @@ -1458,7 +1513,7 @@ dependencies = [ "lazy_static", "libc", "libloading", - "winapi 0.3.8", + "winapi 0.3.9", ] [[package]] @@ -1594,7 +1649,7 @@ dependencies = [ "proc-macro-hack", "proc-macro2 1.0.18", "quote 1.0.7", - "syn 1.0.31", + "syn 1.0.33", ] [[package]] @@ -1667,7 +1722,7 @@ version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a0a73299e4718f5452e45980fc1d6957a070abe308d3700b63b8673f47e1c2b3" dependencies = [ - "bytes 0.5.4", + "bytes 0.5.5", "futures 0.3.5", "memchr", "pin-project", @@ -1679,7 +1734,7 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ce54d63f8b0c75023ed920d46fd71d0cbbb830b0ee012726b5b4f506fb6dea5b" dependencies = [ - "bytes 0.5.4", + "bytes 0.5.5", "futures 0.3.5", "memchr", "pin-project", @@ -1691,6 +1746,19 @@ version = "0.3.55" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f5f3913fa0bfe7ee1fd8248b6b9f42a5af4b9d65ec2dd2c3c26132b950ecfc2" +[[package]] +name = "generator" +version = "0.6.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "add72f17bb81521258fcc8a7a3245b1e184e916bfbe34f0ea89558f440df5c68" +dependencies = [ + "cc", + "libc", + "log 0.4.8", + "rustc_version", + "winapi 0.3.9", +] + [[package]] name = "generic-array" version = "0.12.3" @@ -1700,6 +1768,16 @@ dependencies = [ "typenum", ] +[[package]] +name = "generic-array" +version = "0.14.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac746a5f3bbfdadd6106868134545e684693d54d9d44f6e9588a7d54af0bf980" +dependencies = [ + "typenum", + "version_check", +] + [[package]] name = "get_if_addrs" version = "0.5.3" @@ -1736,9 +1814,9 @@ dependencies = [ [[package]] name = "ghash" -version = "0.2.3" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f0930ed19a7184089ea46d2fedead2f6dc2b674c5db4276b7da336c7cd83252" +checksum = "d6e27f0689a6e15944bdce7e45425efb87eaa8ab0c6e87f11d0987a9133e2531" dependencies = [ "polyval", ] @@ -1759,9 +1837,9 @@ dependencies = [ [[package]] name = "gimli" -version = "0.21.0" +version = "0.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bcc8e0c9bce37868955864dbecd2b1ab2bdf967e6f28066d65aaac620444b65c" +checksum = "aaf91faf136cb47367fa430cd46e37a788775e7fa104f8b4bcb3861dc389b724" [[package]] name = "glob" @@ -1830,7 +1908,7 @@ version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "79b7246d7e4b979c03fa093da39cfb3617a96bbeee6310af63991668d7e843ff" dependencies = [ - "bytes 0.5.4", + "bytes 0.5.5", "fnv", "futures-core", "futures-sink", @@ -1889,9 +1967,9 @@ dependencies = [ [[package]] name = "hermit-abi" -version = "0.1.14" +version = "0.1.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9586eedd4ce6b3c498bc3b4dd92fc9f11166aa908a914071953768066c67909" +checksum = "3deed196b6e7f9e44a2ae8d94225d80302d81208b1bb673fd21fe634645c85a9" dependencies = [ "libc", ] @@ -1927,8 +2005,8 @@ version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5dcb5e64cda4c23119ab41ba960d1e170a774c8e4b9d9e6a9bc18aabf5e59695" dependencies = [ - "crypto-mac", - "digest", + "crypto-mac 0.7.0", + "digest 0.8.1", ] [[package]] @@ -1937,8 +2015,8 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c6e570451493f10f6581b48cdd530413b63ea9e780f544bfd3bdcaa0d89d1a7b" dependencies = [ - "digest", - "generic-array", + "digest 0.8.1", + "generic-array 0.12.3", "hmac", ] @@ -1959,7 +2037,7 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "28d569972648b2c512421b5f2a405ad6ac9666547189d0c5477a3f200f3e02f9" dependencies = [ - "bytes 0.5.4", + "bytes 0.5.5", "fnv", "itoa", ] @@ -1982,7 +2060,7 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13d5ff830006f7646652e057693569bfe0d51760c0085a071769d142a205111b" dependencies = [ - "bytes 0.5.4", + "bytes 0.5.5", "http 0.2.1", ] @@ -2037,7 +2115,7 @@ version = "0.13.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a6e7655b9594024ad0ee439f3b5a7299369dc2a3f459b47c696f9ff676f9aa1f" dependencies = [ - "bytes 0.5.4", + "bytes 0.5.5", "futures-channel", "futures-core", "futures-util", @@ -2061,12 +2139,12 @@ version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac965ea399ec3a25ac7d13b8affd4b8f39325cca00858ddf5eb29b79e6b14b08" dependencies = [ - "bytes 0.5.4", + "bytes 0.5.5", "ct-logs", "futures-util", "hyper 0.13.6", "log 0.4.8", - "rustls", + "rustls 0.17.0", "rustls-native-certs", "tokio 0.2.21", "tokio-rustls", @@ -2130,7 +2208,7 @@ checksum = "7ef5550a42e3740a0e71f909d4c861056a284060af885ae7aa6242820f920d9d" dependencies = [ "proc-macro2 1.0.18", "quote 1.0.7", - "syn 1.0.31", + "syn 1.0.33", ] [[package]] @@ -2235,9 +2313,9 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.40" +version = "0.3.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce10c23ad2ea25ceca0093bd3192229da4c5b3c0f2de499c1ecac0d98d452177" +checksum = "c4b9172132a62451e56142bff9afc91c8e4a4500aa5b847da36815b63bfda916" dependencies = [ "wasm-bindgen", ] @@ -2289,7 +2367,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", "quote 1.0.7", - "syn 1.0.31", + "syn 1.0.33", ] [[package]] @@ -2457,9 +2535,9 @@ dependencies = [ [[package]] name = "kv-log-macro" -version = "1.0.6" +version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ff57d6d215f7ca7eb35a9a64d656ba4d9d2bef114d741dc08048e75e2f5d418" +checksum = "0de8b303297635ad57c9f5059fd9cee7a47f8e8daa09df0fcd07dd39fb22977f" dependencies = [ "log 0.4.8", ] @@ -2540,15 +2618,15 @@ checksum = "3576a87f2ba00f6f106fdfcd16db1d698d648a26ad8e0573cad8537c3c362d2a" [[package]] name = "libc" -version = "0.2.71" +version = "0.2.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9457b06509d27052635f90d6466700c65095fdf75409b3fbdd903e988b886f49" +checksum = "a9f8082297d534141b30c8d39e9b1773713ab50fdbe4ff30f750d063b3bfd701" [[package]] name = "libflate" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "784f4ec5908a9d7f4e53658906386667e8b02e9389a47cfebf45d324ba9e8d25" +checksum = "e9bac9023e1db29c084f9f8cd9d3852e5e8fddf98fb47c4964a0ea4663d95949" dependencies = [ "adler32", "crc32fast", @@ -2569,7 +2647,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f2b111a074963af1d37a139918ac6d49ad1d0d5e47f72fd55388619691a7d753" dependencies = [ "cc", - "winapi 0.3.8", + "winapi 0.3.9", ] [[package]] @@ -2584,7 +2662,7 @@ version = "0.21.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6d743d03fab397cde23925a17cb87b35b25994f44ab8c6a9e46a7e953ec739cd" dependencies = [ - "bytes 0.5.4", + "bytes 0.5.5", "futures 0.3.5", "lazy_static", "libp2p-core", @@ -2635,7 +2713,7 @@ dependencies = [ "rand 0.7.3", "ring", "rw-stream-sink", - "sha2", + "sha2 0.8.2", "smallvec 1.4.1", "thiserror", "unsigned-varint 0.4.0", @@ -2650,7 +2728,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "515c4a7cba5d321bb88ed3ed803997bdd5634ce35c9c5e8e9ace9c512e57eceb" dependencies = [ "quote 1.0.7", - "syn 1.0.31", + "syn 1.0.33", ] [[package]] @@ -2687,7 +2765,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "44ed3a4c8111c570ab2bffb30c6353178d7603ce3787e3c5f2493c8d3d16d1f0" dependencies = [ "arrayvec 0.5.1", - "bytes 0.5.4", + "bytes 0.5.5", "either", "fnv", "futures 0.3.5", @@ -2699,7 +2777,7 @@ dependencies = [ "prost", "prost-build", "rand 0.7.3", - "sha2", + "sha2 0.8.2", "smallvec 1.4.1", "uint", "unsigned-varint 0.4.0", @@ -2735,7 +2813,7 @@ version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "14ae0ffacd30f073f96cd518b2c9cd2cb18ac27c3d136a4b23cf1af99f33e541" dependencies = [ - "bytes 0.5.4", + "bytes 0.5.5", "fnv", "futures 0.3.5", "futures_codec 0.4.1", @@ -2759,7 +2837,7 @@ dependencies = [ "prost", "prost-build", "rand 0.7.3", - "sha2", + "sha2 0.8.2", "snow", "static_assertions", "x25519-dalek", @@ -2828,9 +2906,9 @@ dependencies = [ [[package]] name = "libp2p-websocket" -version = "0.21.0" +version = "0.21.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd3a13025c0f621647ed2c5147615468e7b3cd1a5c7f26f2a6f6f8eafc9c1950" +checksum = "046a5201f6e471f22b22b394e4d084269ed1e28cf7300f7b49874385db84c7bd" dependencies = [ "async-tls", "either", @@ -2838,7 +2916,7 @@ dependencies = [ "libp2p-core", "log 0.4.8", "quicksink", - "rustls", + "rustls 0.18.0", "rw-stream-sink", "soketto", "url 2.1.1", @@ -2879,10 +2957,10 @@ checksum = "1fc1e2c808481a63dc6da2074752fdd4336a3c8fcc68b83db6f1fd5224ae7962" dependencies = [ "arrayref", "crunchy", - "digest", + "digest 0.8.1", "hmac-drbg", "rand 0.7.3", - "sha2", + "sha2 0.8.2", "subtle 2.2.3", "typenum", ] @@ -2952,6 +3030,17 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "loom" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ecc775857611e1df29abba5c41355cdf540e7e9d4acfdf0f355eefee82330b7" +dependencies = [ + "cfg-if", + "generator", + "scoped-tls 0.1.2", +] + [[package]] name = "lru" version = "0.4.3" @@ -3004,14 +3093,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6585fd95e7bb50d6cc31e20d4cf9afb4e2ba16c5846fc76793f11218da9c475b" dependencies = [ "libc", - "winapi 0.3.8", + "winapi 0.3.9", ] [[package]] name = "memoffset" -version = "0.5.4" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4fc2c02a7e374099d4ee95a193111f72d2110197fe200272371758f6c3643d8" +checksum = "c198b026e1bbf08a937e94c6c60f9ec4a2267f5b0d2eec9c1b21b061ce2be55f" dependencies = [ "autocfg 1.0.0", ] @@ -3056,11 +3145,11 @@ dependencies = [ [[package]] name = "miniz_oxide" -version = "0.3.7" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "791daaae1ed6889560f8c4359194f56648355540573244a5448a83ba1ecc7435" +checksum = "be0f75932c1f6cfae3c04000e40114adf955636e19040f9c0a2c380702aa1c7f" dependencies = [ - "adler32", + "adler", ] [[package]] @@ -3096,14 +3185,14 @@ dependencies = [ [[package]] name = "mio-named-pipes" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5e374eff525ce1c5b7687c4cef63943e7686524a387933ad27ca7ec43779cb3" +checksum = "0840c1c50fd55e521b247f949c241c9997709f23bd7f023b9762cd561e935656" dependencies = [ "log 0.4.8", "mio", "miow 0.3.5", - "winapi 0.3.8", + "winapi 0.3.9", ] [[package]] @@ -3136,7 +3225,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "07b88fb9795d4d36d62a012dfbf49a8f5cf12751f36d31a9dbe66d528e58979e" dependencies = [ "socket2", - "winapi 0.3.8", + "winapi 0.3.9", ] [[package]] @@ -3153,9 +3242,9 @@ checksum = "f75db05d738947aa5389863aadafbcf2e509d7ba099dc2ddcdf4fc66bf7a9e03" dependencies = [ "blake2b_simd", "blake2s_simd", - "digest", + "digest 0.8.1", "sha-1", - "sha2", + "sha2 0.8.2", "sha3", "unsigned-varint 0.3.3", ] @@ -3172,7 +3261,7 @@ version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c9157e87afbc2ef0d84cc0345423d715f445edde00141c93721c162de35a05e5" dependencies = [ - "bytes 0.5.4", + "bytes 0.5.5", "futures 0.3.5", "log 0.4.8", "pin-project", @@ -3188,7 +3277,7 @@ checksum = "aaa9fddbc34c8c35dd2108515587b8ce0cab396f17977b8c738568e4edb521a2" dependencies = [ "alga", "approx", - "generic-array", + "generic-array 0.12.3", "matrixmultiply", "num-complex", "num-rational", @@ -3214,7 +3303,7 @@ checksum = "2ba7c918ac76704fb42afcbbb43891e72731f3dcca3bef2a19786297baf14af7" dependencies = [ "cfg-if", "libc", - "winapi 0.3.8", + "winapi 0.3.9", ] [[package]] @@ -3286,7 +3375,7 @@ version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a31937dea023539c72ddae0e3571deadc1414b300483fa7aaec176168cfa9d2" dependencies = [ - "winapi 0.3.8", + "winapi 0.3.9", ] [[package]] @@ -3391,6 +3480,12 @@ version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2839e79665f131bdb5782e51f2c6c9599c133c6098982a54c794358bf432529c" +[[package]] +name = "opaque-debug" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" + [[package]] name = "openssl-probe" version = "0.1.2" @@ -3827,7 +3922,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", "quote 1.0.7", - "syn 1.0.31", + "syn 1.0.33", ] [[package]] @@ -4010,11 +4105,11 @@ version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a1cd2ba02391b81367bec529fb209019d718684fdc8ad6a712c2b536e46f775" dependencies = [ - "blake2", - "bytes 0.5.4", + "blake2 0.8.1", + "bytes 0.5.5", "rand 0.7.3", "sha-1", - "sha2", + "sha2 0.8.2", "sha3", "unsigned-varint 0.3.3", ] @@ -4041,7 +4136,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", "quote 1.0.7", - "syn 1.0.31", + "syn 1.0.33", ] [[package]] @@ -4066,7 +4161,7 @@ dependencies = [ "tokio 0.1.22", "tokio-named-pipes", "tokio-uds", - "winapi 0.3.8", + "winapi 0.3.9", ] [[package]] @@ -4083,7 +4178,7 @@ dependencies = [ "parking_lot 0.10.2", "primitive-types", "smallvec 1.4.1", - "winapi 0.3.8", + "winapi 0.3.9", ] [[package]] @@ -4093,7 +4188,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f557c32c6d268a07c921471619c0295f5efad3a0e76d4f97a05c091a51d110b2" dependencies = [ "proc-macro2 1.0.18", - "syn 1.0.31", + "syn 1.0.33", "synstructure", ] @@ -4142,7 +4237,7 @@ dependencies = [ "redox_syscall", "rustc_version", "smallvec 0.6.13", - "winapi 0.3.8", + "winapi 0.3.9", ] [[package]] @@ -4156,14 +4251,14 @@ dependencies = [ "libc", "redox_syscall", "smallvec 1.4.1", - "winapi 0.3.8", + "winapi 0.3.9", ] [[package]] name = "paste" -version = "0.1.17" +version = "0.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "026c63fe245362be0322bfec5a9656d458d13f9cfb1785d1b38458b9968e8080" +checksum = "45ca20c77d80be666aef2b45486da86238fabe33e38306bd3118fe4af33fa880" dependencies = [ "paste-impl", "proc-macro-hack", @@ -4171,9 +4266,9 @@ dependencies = [ [[package]] name = "paste-impl" -version = "0.1.17" +version = "0.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b9281a268ec213237dcd2aa3c3d0f46681b04ced37c1616fd36567a9e6954b0" +checksum = "d95a7db200b97ef370c8e6de0088252f7e0dfff7d047a28528e47456c0fc98b6" dependencies = [ "proc-macro-hack", ] @@ -4185,7 +4280,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "006c038a43a45995a9670da19e67600114740e8511d4333bf97a56e66a7542d9" dependencies = [ "byteorder", - "crypto-mac", + "crypto-mac 0.7.0", ] [[package]] @@ -4239,7 +4334,7 @@ checksum = "6a0ffd45cf79d88737d7cc85bfd5d2894bee1139b356e616fe85dc389c61aaf7" dependencies = [ "proc-macro2 1.0.18", "quote 1.0.7", - "syn 1.0.31", + "syn 1.0.33", ] [[package]] @@ -4290,7 +4385,7 @@ dependencies = [ name = "polkadot-availability-store" version = "0.8.14" dependencies = [ - "derive_more 0.99.8", + "derive_more 0.99.9", "exit-future", "futures 0.3.5", "kvdb", @@ -4392,7 +4487,7 @@ name = "polkadot-network" version = "0.8.14" dependencies = [ "arrayvec 0.4.12", - "bytes 0.5.4", + "bytes 0.5.5", "derive_more 0.14.1", "exit-future", "futures 0.3.5", @@ -4456,6 +4551,31 @@ dependencies = [ "sp-runtime", ] +[[package]] +name = "polkadot-node-core-backing" +version = "0.1.0" +dependencies = [ + "assert_matches", + "bitvec", + "derive_more 0.99.9", + "futures 0.3.5", + "futures-timer 3.0.2", + "log 0.4.8", + "polkadot-erasure-coding", + "polkadot-node-primitives", + "polkadot-node-subsystem", + "polkadot-primitives", + "polkadot-statement-table", + "polkadot-subsystem-test-helpers", + "sc-client-api", + "sc-keystore", + "sp-api", + "sp-blockchain", + "sp-core", + "sp-keyring", + "streamunordered", +] + [[package]] name = "polkadot-node-core-proposer" version = "0.1.0" @@ -4525,7 +4645,7 @@ dependencies = [ name = "polkadot-parachain" version = "0.8.14" dependencies = [ - "derive_more 0.99.8", + "derive_more 0.99.9", "log 0.4.8", "parity-scale-codec", "parking_lot 0.10.2", @@ -5103,18 +5223,18 @@ dependencies = [ [[package]] name = "poly1305" -version = "0.5.2" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5829f50f48e9ddb79f3f7c3097029d0caee30f8286accb241416df603b080b8" +checksum = "d9b42192ab143ed7619bf888a7f9c6733a9a2153b218e2cd557cfdb52fbf9bb1" dependencies = [ "universal-hash", ] [[package]] name = "polyval" -version = "0.3.3" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ec3341498978de3bfd12d1b22f1af1de22818f5473a11e8a6ef997989e3a212" +checksum = "d9a50142b55ab3ed0e9f68dfb3709f1d90d29da24e91033f28b96330643107dc" dependencies = [ "cfg-if", "universal-hash", @@ -5185,26 +5305,26 @@ dependencies = [ [[package]] name = "proc-macro-error" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98e9e4b82e0ef281812565ea4751049f1bdcdfccda7d3f459f2e138a40c08678" +checksum = "fc175e9777c3116627248584e8f8b3e2987405cabe1c0adf7d1dd28f09dc7880" dependencies = [ "proc-macro-error-attr", "proc-macro2 1.0.18", "quote 1.0.7", - "syn 1.0.31", + "syn 1.0.33", "version_check", ] [[package]] name = "proc-macro-error-attr" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f5444ead4e9935abd7f27dc51f7e852a0569ac888096d5ec2499470794e2e53" +checksum = "3cc9795ca17eb581285ec44936da7fc2335a3f34f2ddd13118b6f4d515435c50" dependencies = [ "proc-macro2 1.0.18", "quote 1.0.7", - "syn 1.0.31", + "syn 1.0.33", "syn-mid", "version_check", ] @@ -5236,7 +5356,7 @@ version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "beae6331a816b1f65d04c45b078fd8e6c93e8071771f41b8163255bbd8d7c8fa" dependencies = [ - "unicode-xid 0.2.0", + "unicode-xid 0.2.1", ] [[package]] @@ -5274,7 +5394,7 @@ version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ce49aefe0a6144a45de32927c77bd2859a5f7677b55f220ae5b744e87389c212" dependencies = [ - "bytes 0.5.4", + "bytes 0.5.5", "prost-derive", ] @@ -5284,7 +5404,7 @@ version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "02b10678c913ecbd69350e8535c3aef91a8676c0773fc1d7b95cdd196d7f2f26" dependencies = [ - "bytes 0.5.4", + "bytes 0.5.5", "heck", "itertools 0.8.2", "log 0.4.8", @@ -5306,7 +5426,7 @@ dependencies = [ "itertools 0.8.2", "proc-macro2 1.0.18", "quote 1.0.7", - "syn 1.0.31", + "syn 1.0.33", ] [[package]] @@ -5315,15 +5435,15 @@ version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1834f67c0697c001304b75be76f67add9c89742eda3a085ad8ee0bb38c3417aa" dependencies = [ - "bytes 0.5.4", + "bytes 0.5.5", "prost", ] [[package]] name = "protobuf" -version = "2.14.0" +version = "2.16.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e86d370532557ae7573551a1ec8235a0f8d6cb276c7c9e6aa490b511c447485" +checksum = "d883f78645c21b7281d21305181aa1f4dd9e9363e7cf2566c93121552cff003e" [[package]] name = "quick-error" @@ -5392,7 +5512,7 @@ dependencies = [ "libc", "rand_core 0.3.1", "rdrand", - "winapi 0.3.8", + "winapi 0.3.9", ] [[package]] @@ -5405,7 +5525,7 @@ dependencies = [ "fuchsia-cprng", "libc", "rand_core 0.3.1", - "winapi 0.3.8", + "winapi 0.3.9", ] [[package]] @@ -5424,7 +5544,7 @@ dependencies = [ "rand_os", "rand_pcg 0.1.2", "rand_xorshift", - "winapi 0.3.8", + "winapi 0.3.9", ] [[package]] @@ -5520,7 +5640,7 @@ checksum = "1166d5c91dc97b88d1decc3285bb0a99ed84b05cfd0bc2341bdf2d43fc41e39b" dependencies = [ "libc", "rand_core 0.4.2", - "winapi 0.3.8", + "winapi 0.3.9", ] [[package]] @@ -5535,7 +5655,7 @@ dependencies = [ "rand_core 0.4.2", "rdrand", "wasm-bindgen", - "winapi 0.3.8", + "winapi 0.3.9", ] [[package]] @@ -5660,7 +5780,7 @@ checksum = "7d21b475ab879ef0e315ad99067fa25778c3b0377f57f1b00207448dac1a3144" dependencies = [ "proc-macro2 1.0.18", "quote 1.0.7", - "syn 1.0.31", + "syn 1.0.33", ] [[package]] @@ -5701,7 +5821,7 @@ dependencies = [ "bitflags", "libc", "mach", - "winapi 0.3.8", + "winapi 0.3.9", ] [[package]] @@ -5710,7 +5830,7 @@ version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7" dependencies = [ - "winapi 0.3.8", + "winapi 0.3.9", ] [[package]] @@ -5731,7 +5851,7 @@ checksum = "475e68978dc5b743f2f40d8e0a8fdc83f1c5e78cbf4b8fa5e74e73beebc340de" dependencies = [ "proc-macro2 1.0.18", "quote 1.0.7", - "syn 1.0.31", + "syn 1.0.33", ] [[package]] @@ -5746,7 +5866,7 @@ dependencies = [ "spin", "untrusted", "web-sys", - "winapi 0.3.8", + "winapi 0.3.9", ] [[package]] @@ -5772,7 +5892,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "99371657d3c8e4d816fb6221db98fa408242b0b53bac08f8676a41f8554fe99f" dependencies = [ "libc", - "winapi 0.3.8", + "winapi 0.3.9", ] [[package]] @@ -5833,6 +5953,19 @@ dependencies = [ "webpki", ] +[[package]] +name = "rustls" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cac94b333ee2aac3284c5b8a1b7fb4dd11cba88c244e3fe33cdbd047af0eb693" +dependencies = [ + "base64 0.12.3", + "log 0.4.8", + "ring", + "sct", + "webpki", +] + [[package]] name = "rustls-native-certs" version = "0.3.0" @@ -5840,7 +5973,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a75ffeb84a6bd9d014713119542ce415db3a3e4748f0bfce1e1416cd224a23a5" dependencies = [ "openssl-probe", - "rustls", + "rustls 0.17.0", "schannel", "security-framework", ] @@ -5876,8 +6009,8 @@ name = "sc-authority-discovery" version = "0.8.0-rc4" source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ - "bytes 0.5.4", - "derive_more 0.99.8", + "bytes 0.5.5", + "derive_more 0.99.9", "futures 0.3.5", "futures-timer 3.0.2", "libp2p", @@ -5963,7 +6096,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", "quote 1.0.7", - "syn 1.0.31", + "syn 1.0.33", ] [[package]] @@ -5974,7 +6107,7 @@ dependencies = [ "ansi_term 0.12.1", "atty", "chrono", - "derive_more 0.99.8", + "derive_more 0.99.9", "fdlimit", "flexi_logger", "futures 0.3.5", @@ -6012,7 +6145,7 @@ name = "sc-client-api" version = "2.0.0-rc4" source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ - "derive_more 0.99.8", + "derive_more 0.99.9", "fnv", "futures 0.3.5", "hash-db", @@ -6088,7 +6221,7 @@ name = "sc-consensus-babe" version = "0.8.0-rc4" source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ - "derive_more 0.99.8", + "derive_more 0.99.9", "fork-tree", "futures 0.3.5", "futures-timer 3.0.2", @@ -6130,7 +6263,7 @@ name = "sc-consensus-babe-rpc" version = "0.8.0-rc4" source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ - "derive_more 0.99.8", + "derive_more 0.99.9", "futures 0.3.5", "jsonrpc-core", "jsonrpc-core-client", @@ -6204,7 +6337,7 @@ name = "sc-executor" version = "0.8.0-rc4" source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ - "derive_more 0.99.8", + "derive_more 0.99.9", "lazy_static", "libsecp256k1", "log 0.4.8", @@ -6232,7 +6365,7 @@ name = "sc-executor-common" version = "0.8.0-rc4" source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ - "derive_more 0.99.8", + "derive_more 0.99.9", "log 0.4.8", "parity-scale-codec", "parity-wasm", @@ -6270,7 +6403,7 @@ dependencies = [ "parity-scale-codec", "parity-wasm", "sc-executor-common", - "scoped-tls", + "scoped-tls 1.0.0", "sp-allocator", "sp-core", "sp-runtime-interface", @@ -6286,7 +6419,7 @@ version = "0.8.0-rc4" source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ "assert_matches", - "derive_more 0.99.8", + "derive_more 0.99.9", "finality-grandpa", "fork-tree", "futures 0.3.5", @@ -6323,7 +6456,7 @@ name = "sc-finality-grandpa-rpc" version = "0.8.0-rc4" source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ - "derive_more 0.99.8", + "derive_more 0.99.9", "finality-grandpa", "futures 0.3.5", "jsonrpc-core", @@ -6358,7 +6491,7 @@ name = "sc-keystore" version = "2.0.0-rc4" source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ - "derive_more 0.99.8", + "derive_more 0.99.9", "hex", "merlin", "parking_lot 0.10.2", @@ -6395,8 +6528,8 @@ source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c67 dependencies = [ "bitflags", "bs58", - "bytes 0.5.4", - "derive_more 0.99.8", + "bytes 0.5.5", + "derive_more 0.99.9", "either", "erased-serde", "fnv", @@ -6487,7 +6620,7 @@ name = "sc-offchain" version = "2.0.0-rc4" source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ - "bytes 0.5.4", + "bytes 0.5.5", "fnv", "futures 0.3.5", "futures-timer 3.0.2", @@ -6568,7 +6701,7 @@ name = "sc-rpc-api" version = "0.8.0-rc4" source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ - "derive_more 0.99.8", + "derive_more 0.99.9", "futures 0.3.5", "jsonrpc-core", "jsonrpc-core-client", @@ -6608,7 +6741,7 @@ name = "sc-service" version = "0.8.0-rc4" source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ - "derive_more 0.99.8", + "derive_more 0.99.9", "directories", "exit-future", "futures 0.1.29", @@ -6723,7 +6856,7 @@ name = "sc-transaction-graph" version = "2.0.0-rc4" source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ - "derive_more 0.99.8", + "derive_more 0.99.9", "futures 0.3.5", "linked-hash-map", "log 0.4.8", @@ -6743,7 +6876,7 @@ name = "sc-transaction-pool" version = "2.0.0-rc4" source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ - "derive_more 0.99.8", + "derive_more 0.99.9", "futures 0.3.5", "futures-diagnose", "intervalier", @@ -6771,7 +6904,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f05ba609c234e60bee0d547fe94a4c7e9da733d1c962cf6e59efa4cd9c8bc75" dependencies = [ "lazy_static", - "winapi 0.3.8", + "winapi 0.3.9", ] [[package]] @@ -6787,11 +6920,17 @@ dependencies = [ "merlin", "rand 0.7.3", "rand_core 0.5.1", - "sha2", + "sha2 0.8.2", "subtle 2.2.3", "zeroize", ] +[[package]] +name = "scoped-tls" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "332ffa32bf586782a3efaeb58f127980944bbc8c4d6913a86107ac2a5ab24b28" + [[package]] name = "scoped-tls" version = "1.0.0" @@ -6821,7 +6960,7 @@ checksum = "e367622f934864ffa1c704ba2b82280aab856e3d8213c84c5720257eb34b15b9" dependencies = [ "proc-macro2 1.0.18", "quote 1.0.7", - "syn 1.0.31", + "syn 1.0.33", ] [[package]] @@ -6901,29 +7040,29 @@ checksum = "f638d531eccd6e23b980caf34876660d38e265409d8e99b397ab71eb3612fad0" [[package]] name = "serde" -version = "1.0.112" +version = "1.0.114" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "736aac72d1eafe8e5962d1d1c3d99b0df526015ba40915cb3c49d042e92ec243" +checksum = "5317f7588f0a5078ee60ef675ef96735a1442132dc645eb1d12c018620ed8cd3" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.112" +version = "1.0.114" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf0343ce212ac0d3d6afd9391ac8e9c9efe06b533c8d33f660f6390cc4093f57" +checksum = "2a0be94b04690fbaed37cddffc5c134bf537c8e3329d53e982fe04c374978f8e" dependencies = [ "proc-macro2 1.0.18", "quote 1.0.7", - "syn 1.0.31", + "syn 1.0.33", ] [[package]] name = "serde_json" -version = "1.0.55" +version = "1.0.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec2c5d7e739bc07a3e73381a39d61fdb5f671c60c1df26a130690665803d8226" +checksum = "3433e879a558dde8b5e8feb2a04899cf34fdde1fafb894687e52105fc1162ac3" dependencies = [ "itoa", "ryu", @@ -6936,10 +7075,10 @@ version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f7d94d0bede923b3cea61f3f1ff57ff8cdfd77b400fb8f9998949e0cf04163df" dependencies = [ - "block-buffer", - "digest", + "block-buffer 0.7.3", + "digest 0.8.1", "fake-simd", - "opaque-debug", + "opaque-debug 0.2.3", ] [[package]] @@ -6948,10 +7087,23 @@ version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a256f46ea78a0c0d9ff00077504903ac881a1dafdc20da66545699e7776b3e69" dependencies = [ - "block-buffer", - "digest", + "block-buffer 0.7.3", + "digest 0.8.1", "fake-simd", - "opaque-debug", + "opaque-debug 0.2.3", +] + +[[package]] +name = "sha2" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2933378ddfeda7ea26f48c555bdad8bb446bf8a3d17832dc83e380d444cfb8c1" +dependencies = [ + "block-buffer 0.9.0", + "cfg-if", + "cpuid-bool", + "digest 0.9.0", + "opaque-debug 0.3.0", ] [[package]] @@ -6960,11 +7112,11 @@ version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd26bc0e7a2e3a7c959bc494caf58b72ee0c71d67704e9520f736ca7e4853ecf" dependencies = [ - "block-buffer", + "block-buffer 0.7.3", "byte-tools", - "digest", + "digest 0.8.1", "keccak", - "opaque-debug", + "opaque-debug 0.2.3", ] [[package]] @@ -6983,7 +7135,7 @@ dependencies = [ "rand 0.4.6", "shared_memory_derive", "theban_interval_tree", - "winapi 0.3.8", + "winapi 0.3.9", ] [[package]] @@ -7060,7 +7212,7 @@ checksum = "a945ec7f7ce853e89ffa36be1e27dce9a43e82ff9093bf3461c30d5da74ed11b" dependencies = [ "proc-macro2 1.0.18", "quote 1.0.7", - "syn 1.0.31", + "syn 1.0.33", ] [[package]] @@ -7092,27 +7244,27 @@ dependencies = [ "futures-util", "libc", "once_cell", - "scoped-tls", + "scoped-tls 1.0.0", "slab", "socket2", "wepoll-sys-stjepang", - "winapi 0.3.8", + "winapi 0.3.9", ] [[package]] name = "snow" -version = "0.7.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce0f91be479494dd92e69d9971bd23ed27037dd1c94fcf558f6c6e74e6afa654" +checksum = "32bf8474159a95551661246cda4976e89356999e3cbfef36f493dacc3fae1e8e" dependencies = [ "aes-gcm", - "blake2", + "blake2 0.9.0", "chacha20poly1305", "rand 0.7.3", "rand_core 0.5.1", "ring", "rustc_version", - "sha2", + "sha2 0.9.1", "subtle 2.2.3", "x25519-dalek", ] @@ -7126,7 +7278,7 @@ dependencies = [ "cfg-if", "libc", "redox_syscall", - "winapi 0.3.8", + "winapi 0.3.9", ] [[package]] @@ -7135,8 +7287,8 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "85457366ae0c6ce56bf05a958aef14cd38513c236568618edbcd9a8c52cb80b0" dependencies = [ - "base64 0.12.2", - "bytes 0.5.4", + "base64 0.12.3", + "bytes 0.5.5", "flate2", "futures 0.3.5", "httparse", @@ -7150,7 +7302,7 @@ name = "sp-allocator" version = "2.0.0-rc4" source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ - "derive_more 0.99.8", + "derive_more 0.99.9", "log 0.4.8", "sp-core", "sp-std", @@ -7181,7 +7333,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", "quote 1.0.7", - "syn 1.0.31", + "syn 1.0.33", ] [[package]] @@ -7249,7 +7401,7 @@ name = "sp-blockchain" version = "2.0.0-rc4" source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ - "derive_more 0.99.8", + "derive_more 0.99.9", "log 0.4.8", "lru", "parity-scale-codec", @@ -7275,7 +7427,7 @@ name = "sp-consensus" version = "0.8.0-rc4" source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ - "derive_more 0.99.8", + "derive_more 0.99.9", "futures 0.3.5", "futures-timer 3.0.2", "libp2p", @@ -7357,7 +7509,7 @@ dependencies = [ "base58", "blake2-rfc", "byteorder", - "derive_more 0.99.8", + "derive_more 0.99.9", "ed25519-dalek", "futures 0.3.5", "hash-db", @@ -7378,7 +7530,7 @@ dependencies = [ "schnorrkel", "secrecy", "serde", - "sha2", + "sha2 0.8.2", "sp-debug-derive", "sp-externalities", "sp-runtime-interface", @@ -7408,7 +7560,7 @@ source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c67 dependencies = [ "proc-macro2 1.0.18", "quote 1.0.7", - "syn 1.0.31", + "syn 1.0.33", ] [[package]] @@ -7453,7 +7605,7 @@ name = "sp-inherents" version = "2.0.0-rc4" source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ - "derive_more 0.99.8", + "derive_more 0.99.9", "parity-scale-codec", "parking_lot 0.10.2", "sp-core", @@ -7512,7 +7664,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", "quote 1.0.7", - "syn 1.0.31", + "syn 1.0.33", ] [[package]] @@ -7589,7 +7741,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", "quote 1.0.7", - "syn 1.0.31", + "syn 1.0.33", ] [[package]] @@ -7691,7 +7843,7 @@ name = "sp-transaction-pool" version = "2.0.0-rc4" source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ - "derive_more 0.99.8", + "derive_more 0.99.9", "futures 0.3.5", "log 0.4.8", "parity-scale-codec", @@ -7780,11 +7932,11 @@ dependencies = [ [[package]] name = "stream-cipher" -version = "0.3.2" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8131256a5896cabcf5eb04f4d6dacbe1aefda854b0d9896e09cb58829ec5638c" +checksum = "09f8ed9974042b8c3672ff3030a69fcc03b74c47c3d1ecb7755e8a3626011e88" dependencies = [ - "generic-array", + "generic-array 0.14.2", ] [[package]] @@ -7844,7 +7996,7 @@ dependencies = [ "proc-macro-error", "proc-macro2 1.0.18", "quote 1.0.7", - "syn 1.0.31", + "syn 1.0.33", ] [[package]] @@ -7865,7 +8017,7 @@ dependencies = [ "heck", "proc-macro2 1.0.18", "quote 1.0.7", - "syn 1.0.31", + "syn 1.0.33", ] [[package]] @@ -7877,7 +8029,7 @@ dependencies = [ "hmac", "pbkdf2", "schnorrkel", - "sha2", + "sha2 0.8.2", ] [[package]] @@ -7944,7 +8096,7 @@ version = "0.8.0-rc4" source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" dependencies = [ "async-std", - "derive_more 0.99.8", + "derive_more 0.99.9", "futures-util", "hyper 0.13.6", "log 0.4.8", @@ -8070,7 +8222,7 @@ dependencies = [ "wasmparser 0.52.2", "wasmtime-environ", "wat", - "winapi 0.3.8", + "winapi 0.3.9", ] [[package]] @@ -8097,7 +8249,7 @@ dependencies = [ "wasmparser 0.52.2", "wasmtime-debug", "wasmtime-environ", - "winapi 0.3.8", + "winapi 0.3.9", ] [[package]] @@ -8136,7 +8288,7 @@ dependencies = [ "region", "thiserror", "wasmtime-environ", - "winapi 0.3.8", + "winapi 0.3.9", ] [[package]] @@ -8175,13 +8327,13 @@ dependencies = [ [[package]] name = "syn" -version = "1.0.31" +version = "1.0.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5304cfdf27365b7585c25d4af91b35016ed21ef88f17ced89c7093b43dba8b6" +checksum = "e8d5d96e8cbb005d6959f119f773bfaebb5684296108fb32600c00cde305b2cd" dependencies = [ "proc-macro2 1.0.18", "quote 1.0.7", - "unicode-xid 0.2.0", + "unicode-xid 0.2.1", ] [[package]] @@ -8192,7 +8344,7 @@ checksum = "7be3539f6c128a931cf19dcee741c1af532c7fd387baa739c03dd2e96479338a" dependencies = [ "proc-macro2 1.0.18", "quote 1.0.7", - "syn 1.0.31", + "syn 1.0.33", ] [[package]] @@ -8212,8 +8364,8 @@ checksum = "b834f2d66f734cb897113e34aaff2f1ab4719ca946f9a7358dba8f8064148701" dependencies = [ "proc-macro2 1.0.18", "quote 1.0.7", - "syn 1.0.31", - "unicode-xid 0.2.0", + "syn 1.0.33", + "unicode-xid 0.2.1", ] [[package]] @@ -8228,7 +8380,7 @@ dependencies = [ "ntapi", "once_cell", "rayon", - "winapi 0.3.8", + "winapi 0.3.9", ] [[package]] @@ -8254,7 +8406,7 @@ dependencies = [ "rand 0.7.3", "redox_syscall", "remove_dir_all", - "winapi 0.3.8", + "winapi 0.3.9", ] [[package]] @@ -8363,7 +8515,7 @@ checksum = "bd80fc12f73063ac132ac92aceea36734f04a1d93c1240c6944e23a3b8841793" dependencies = [ "proc-macro2 1.0.18", "quote 1.0.7", - "syn 1.0.31", + "syn 1.0.33", ] [[package]] @@ -8391,7 +8543,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca8a50ef2360fbd1eeb0ecd46795a87a19024eb4b53c5dc916ca1fd95fe62438" dependencies = [ "libc", - "winapi 0.3.8", + "winapi 0.3.9", ] [[package]] @@ -8406,7 +8558,7 @@ dependencies = [ "pbkdf2", "rand 0.7.3", "rustc-hash", - "sha2", + "sha2 0.8.2", "unicode-normalization", ] @@ -8464,7 +8616,7 @@ version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d099fa27b9702bed751524694adbe393e18b36b204da91eb1cbbbbb4a5ee2d58" dependencies = [ - "bytes 0.5.4", + "bytes 0.5.5", "fnv", "futures-core", "iovec", @@ -8478,7 +8630,7 @@ dependencies = [ "signal-hook-registry", "slab", "tokio-macros", - "winapi 0.3.8", + "winapi 0.3.9", ] [[package]] @@ -8564,7 +8716,7 @@ checksum = "f0c3acc6aa564495a0f2e1d59fab677cd7f81a19994cfc7f3ad0e64301560389" dependencies = [ "proc-macro2 1.0.18", "quote 1.0.7", - "syn 1.0.31", + "syn 1.0.33", ] [[package]] @@ -8606,7 +8758,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "15cb62a0d2770787abc96e99c1cd98fcf17f94959f3af63ca85bdfb203f051b4" dependencies = [ "futures-core", - "rustls", + "rustls 0.17.0", "tokio 0.2.21", "webpki", ] @@ -8701,9 +8853,9 @@ dependencies = [ [[package]] name = "tokio-uds" -version = "0.2.6" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5076db410d6fdc6523df7595447629099a1fdc47b3d9f896220780fa48faf798" +checksum = "ab57a4ac4111c8c9dbcf70779f6fc8bc35ae4b2454809febac840ad19bd7e4e0" dependencies = [ "bytes 0.4.12", "futures 0.1.29", @@ -8723,7 +8875,7 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "be8242891f2b6cbef26a2d7e8605133c2c554cd35b3e4948ea892d6d68436499" dependencies = [ - "bytes 0.5.4", + "bytes 0.5.5", "futures-core", "futures-sink", "log 0.4.8", @@ -8748,9 +8900,9 @@ checksum = "e987b6bf443f4b5b3b6f38704195592cca41c5bb7aedd3c3693c7081f8289860" [[package]] name = "tracing" -version = "0.1.15" +version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a41f40ed0e162c911ac6fcb53ecdc8134c46905fdbbae8c50add462a538b495f" +checksum = "c2e2a2de6b0d5cbb13fc21193a2296888eaab62b6044479aafb3c54c01c29fcd" dependencies = [ "cfg-if", "tracing-attributes", @@ -8759,20 +8911,20 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.8" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99bbad0de3fd923c9c3232ead88510b783e5a4d16a6154adffa3d53308de984c" +checksum = "f0693bf8d6f2bf22c690fc61a9d21ac69efdbb894a17ed596b9af0f01e64b84b" dependencies = [ "proc-macro2 1.0.18", "quote 1.0.7", - "syn 1.0.31", + "syn 1.0.33", ] [[package]] name = "tracing-core" -version = "0.1.10" +version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0aa83a9a47081cd522c09c81b31aec2c9273424976f922ad61c053b58350b715" +checksum = "94ae75f0d28ae10786f3b1895c55fe72e79928fd5ccdebb5438c75e93fec178f" dependencies = [ "lazy_static", ] @@ -8873,9 +9025,9 @@ checksum = "e83e153d1053cbb5a118eeff7fd5be06ed99153f00dbcd8ae310c5fb2b22edc0" [[package]] name = "unicode-width" -version = "0.1.7" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "caaa9d531767d1ff2150b9332433f32a24622147e5ebb1f26409d5da67afd479" +checksum = "9337591893a19b88d8d87f2cec1e73fad5cdfd10e5a6f349f498ad6ea2ffb1e3" [[package]] name = "unicode-xid" @@ -8891,17 +9043,17 @@ checksum = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc" [[package]] name = "unicode-xid" -version = "0.2.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "826e7639553986605ec5979c7dd957c7895e93eabed50ab2ffa7f6128a75097c" +checksum = "f7fe0bb3479651439c9112f72b6c505038574c9fbb575ed1bf3b797fa39dd564" [[package]] name = "universal-hash" -version = "0.3.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df0c900f2f9b4116803415878ff48b63da9edb268668e08cf9292d7503114a01" +checksum = "8326b2c654932e3e4f9196e69d08fdf7cfd718e1dc6f66b347e6024a0c961402" dependencies = [ - "generic-array", + "generic-array 0.14.2", "subtle 2.2.3", ] @@ -8911,7 +9063,7 @@ version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f67332660eb59a6f1eb24ff1220c9e8d01738a8503c6002e30bcfe4bd9f2b4a9" dependencies = [ - "bytes 0.5.4", + "bytes 0.5.5", "futures-io", "futures-util", "futures_codec 0.3.4", @@ -8923,7 +9075,7 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "669d776983b692a906c881fcd0cfb34271a48e197e4d6cb8df32b05bfc3d3fa5" dependencies = [ - "bytes 0.5.4", + "bytes 0.5.5", "futures_codec 0.4.1", ] @@ -9023,9 +9175,9 @@ checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" [[package]] name = "wasm-bindgen" -version = "0.2.63" +version = "0.2.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c2dc4aa152834bc334f506c1a06b866416a8b6697d5c9f75b9a689c8486def0" +checksum = "6a634620115e4a229108b71bde263bb4220c483b3f07f5ba514ee8d15064c4c2" dependencies = [ "cfg-if", "serde", @@ -9035,24 +9187,24 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.63" +version = "0.2.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ded84f06e0ed21499f6184df0e0cb3494727b0c5da89534e0fcc55c51d812101" +checksum = "3e53963b583d18a5aa3aaae4b4c1cb535218246131ba22a71f05b518098571df" dependencies = [ "bumpalo", "lazy_static", "log 0.4.8", "proc-macro2 1.0.18", "quote 1.0.7", - "syn 1.0.31", + "syn 1.0.33", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.13" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64487204d863f109eb77e8462189d111f27cb5712cc9fdb3461297a76963a2f6" +checksum = "dba48d66049d2a6cc8488702e7259ab7afc9043ad0dc5448444f46f2a453b362" dependencies = [ "cfg-if", "js-sys", @@ -9062,9 +9214,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.63" +version = "0.2.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "838e423688dac18d73e31edce74ddfac468e37b1506ad163ffaf0a46f703ffe3" +checksum = "3fcfd5ef6eec85623b4c6e844293d4516470d8f19cd72d0d12246017eb9060b8" dependencies = [ "quote 1.0.7", "wasm-bindgen-macro-support", @@ -9072,22 +9224,22 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.63" +version = "0.2.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3156052d8ec77142051a533cdd686cba889537b213f948cd1d20869926e68e92" +checksum = "9adff9ee0e94b926ca81b57f57f86d5545cdcb1d259e21ec9bdd95b901754c75" dependencies = [ "proc-macro2 1.0.18", "quote 1.0.7", - "syn 1.0.31", + "syn 1.0.33", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.63" +version = "0.2.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9ba19973a58daf4db6f352eda73dc0e289493cd29fb2632eb172085b6521acd" +checksum = "7f7b90ea6c632dd06fd765d44542e234d5e63d9bb917ecd64d79778a13bd79ae" [[package]] name = "wasm-timer" @@ -9163,7 +9315,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed54fd9d64dfeeee7c285fd126174a6b5e6d4efc7e5a1566fdb635e60ff6a74e" dependencies = [ "anyhow", - "base64 0.12.2", + "base64 0.12.3", "bincode", "cranelift-codegen", "cranelift-entity", @@ -9177,37 +9329,37 @@ dependencies = [ "more-asserts", "rayon", "serde", - "sha2", + "sha2 0.8.2", "thiserror", "toml", "wasmparser 0.51.4", - "winapi 0.3.8", + "winapi 0.3.9", "zstd", ] [[package]] name = "wast" -version = "18.0.0" +version = "21.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01b1f23531740a81f9300bd2febd397a95c76bfa4aa4bfaf4ca8b1ee3438f337" +checksum = "0b1844f66a2bc8526d71690104c0e78a8e59ffa1597b7245769d174ebb91deb5" dependencies = [ "leb128", ] [[package]] name = "wat" -version = "1.0.19" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4006d418d59293172aebfeeadb7673459dc151874a79135946ea7996b6a98515" +checksum = "ce85d72b74242c340e9e3492cfb602652d7bb324c3172dd441b5577e39a2e18c" dependencies = [ "wast", ] [[package]] name = "web-sys" -version = "0.3.40" +version = "0.3.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b72fe77fd39e4bd3eaa4412fd299a0be6b3dfe9d2597e2f1c20beb968f41d17" +checksum = "863539788676619aac1a23e2df3655e96b32b0e05eb72ca34ba045ad573c625d" dependencies = [ "js-sys", "wasm-bindgen", @@ -9344,9 +9496,9 @@ checksum = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" [[package]] name = "winapi" -version = "0.3.8" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8093091eeb260906a183e6ae1abdba2ef5ef2257a21801128899c3fc699229c6" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" dependencies = [ "winapi-i686-pc-windows-gnu", "winapi-x86_64-pc-windows-gnu", @@ -9370,7 +9522,7 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" dependencies = [ - "winapi 0.3.8", + "winapi 0.3.9", ] [[package]] @@ -9420,9 +9572,9 @@ dependencies = [ [[package]] name = "yamux" -version = "0.4.5" +version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84300bb493cc878f3638b981c62b4632ec1a5c52daaa3036651e8c106d3b55ea" +checksum = "cd37e58a1256a0b328ce9c67d8b62ecdd02f4803ba443df478835cb1a41a637c" dependencies = [ "futures 0.3.5", "log 0.4.8", @@ -9455,7 +9607,7 @@ checksum = "de251eec69fc7c1bc3923403d18ececb929380e016afe103da75f396704f8ca2" dependencies = [ "proc-macro2 1.0.18", "quote 1.0.7", - "syn 1.0.31", + "syn 1.0.33", "synstructure", ] diff --git a/Cargo.toml b/Cargo.toml index fe5bbcf2f9..b6d1aa53ea 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -50,6 +50,7 @@ members = [ "node/overseer", "node/primitives", "node/service", + "node/core/backing", "node/subsystem", "node/test-helpers/subsystem", "node/test-service", diff --git a/node/core/backing/Cargo.toml b/node/core/backing/Cargo.toml new file mode 100644 index 0000000000..b25055293a --- /dev/null +++ b/node/core/backing/Cargo.toml @@ -0,0 +1,30 @@ +[package] +name = "polkadot-node-core-backing" +version = "0.1.0" +authors = ["Parity Technologies "] +edition = "2018" + +[dependencies] +futures = "0.3.5" +log = "0.4.8" +sp-api = { git = "https://github.com/paritytech/substrate", branch = "master" } +sc-client-api = { git = "https://github.com/paritytech/substrate", branch = "master" } +sp-blockchain = { git = "https://github.com/paritytech/substrate", branch = "master" } +keystore = { package = "sc-keystore", git = "https://github.com/paritytech/substrate", branch = "master" } +primitives = { package = "sp-core", git = "https://github.com/paritytech/substrate", branch = "master" } + +polkadot-primitives = { path = "../../../primitives" } +polkadot-node-primitives = { path = "../../primitives" } +polkadot-subsystem = { package = "polkadot-node-subsystem", path = "../../subsystem" } +erasure-coding = { package = "polkadot-erasure-coding", path = "../../../erasure-coding" } +statement-table = { package = "polkadot-statement-table", path = "../../../statement-table" } +futures-timer = "3.0.2" +streamunordered = "0.5.1" +derive_more = "0.99.9" +bitvec = { version = "0.17.4", default-features = false, features = ["alloc"] } + +[dev-dependencies] +sp-keyring = { git = "https://github.com/paritytech/substrate", branch = "master" } +futures = { version = "0.3.5", features = ["thread-pool"] } +subsystem-test = { package = "polkadot-subsystem-test-helpers", path = "../../test-helpers/subsystem" } +assert_matches = "1.3.0" diff --git a/node/core/backing/src/lib.rs b/node/core/backing/src/lib.rs new file mode 100644 index 0000000000..e4490d20d3 --- /dev/null +++ b/node/core/backing/src/lib.rs @@ -0,0 +1,1729 @@ +// Copyright 2020 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 . + +//! Implements a `CandidateBackingSubsystem`. + +#![recursion_limit="256"] + +use std::collections::{HashMap, HashSet}; +use std::convert::TryFrom; +use std::pin::Pin; +use std::time::Duration; + +use bitvec::vec::BitVec; +use log; +use futures::{ + select, FutureExt, SinkExt, StreamExt, + channel::{oneshot, mpsc}, + future::{self, Either}, + task::{Spawn, SpawnError, SpawnExt}, +}; +use futures_timer::Delay; +use streamunordered::{StreamUnordered, StreamYield}; + +use primitives::Pair; +use keystore::KeyStorePtr; +use polkadot_primitives::{ + Hash, + parachain::{ + AbridgedCandidateReceipt, BackedCandidate, Id as ParaId, ValidatorPair, ValidatorId, + ValidatorIndex, HeadData, SigningContext, PoVBlock, OmittedValidationData, + CandidateDescriptor, LocalValidationData, GlobalValidationSchedule, AvailableData, + ErasureChunk, + }, +}; +use polkadot_node_primitives::{ + FromTableMisbehavior, Statement, SignedFullStatement, MisbehaviorReport, ValidationResult, +}; +use polkadot_subsystem::{ + FromOverseer, OverseerSignal, Subsystem, SubsystemContext, SpawnedSubsystem, +}; +use polkadot_subsystem::messages::{ + AllMessages, CandidateBackingMessage, CandidateSelectionMessage, SchedulerRoster, + RuntimeApiMessage, RuntimeApiRequest, CandidateValidationMessage, ValidationFailed, + StatementDistributionMessage, NewBackedCandidate, ProvisionerMessage, ProvisionableData, + PoVDistributionMessage, AvailabilityStoreMessage, +}; +use statement_table::{ + generic::AttestedCandidate as TableAttestedCandidate, + Table, Context as TableContextTrait, Statement as TableStatement, + SignedStatement as TableSignedStatement, Summary as TableSummary, +}; + +#[derive(Debug, derive_more::From)] +enum Error { + NotInValidatorSet, + CandidateNotFound, + JobNotFound(Hash), + InvalidSignature, + #[from] + Erasure(erasure_coding::Error), + #[from] + ValidationFailed(ValidationFailed), + #[from] + Oneshot(oneshot::Canceled), + #[from] + Mpsc(mpsc::SendError), + #[from] + Spawn(SpawnError), +} + +/// Holds all data needed for candidate backing job operation. +struct CandidateBackingJob { + /// The hash of the relay parent on top of which this job is doing it's work. + parent: Hash, + /// Inbound message channel receiving part. + rx_to: mpsc::Receiver, + /// Outbound message channel sending part. + tx_from: mpsc::Sender, + + /// `HeadData`s of the parachains that this validator is assigned to. + head_data: HeadData, + /// The `ParaId`s assigned to this validator. + assignment: ParaId, + /// We issued `Valid` or `Invalid` statements on about these candidates. + issued_statements: HashSet, + /// `Some(h)` if this job has already issues `Seconded` statemt for some candidate with `h` hash. + seconded: Option, + /// We have already reported misbehaviors for these validators. + reported_misbehavior_for: HashSet, + + table: Table, + table_context: TableContext, +} + +const fn group_quorum(n_validators: usize) -> usize { + (n_validators / 2) + 1 +} + +#[derive(Default)] +struct TableContext { + signing_context: SigningContext, + key: Option, + groups: HashMap>, + validators: Vec, +} + +impl TableContextTrait for TableContext { + fn is_member_of(&self, authority: ValidatorIndex, group: &ParaId) -> bool { + self.groups.get(group).map_or(false, |g| g.iter().position(|&a| a == authority).is_some()) + } + + fn requisite_votes(&self, group: &ParaId) -> usize { + self.groups.get(group).map_or(usize::max_value(), |g| group_quorum(g.len())) + } +} + +impl TableContext { + fn local_id(&self) -> Option { + self.key.as_ref().map(|k| k.public()) + } + + fn local_index(&self) -> Option { + self.local_id().and_then(|id| + self.validators + .iter() + .enumerate() + .find(|(_, k)| k == &&id) + .map(|(i, _)| i as ValidatorIndex) + ) + } +} + +const CHANNEL_CAPACITY: usize = 64; + +/// A message type that is sent from `CandidateBackingSubsystem` to `CandidateBackingJob`. +enum ToJob { + /// A `CandidateBackingMessage`. + CandidateBacking(CandidateBackingMessage), + /// Stop working. + Stop, +} + +/// A message type that is sent from `CandidateBackingJob` to `CandidateBackingSubsystem`. +enum FromJob { + AvailabilityStore(AvailabilityStoreMessage), + RuntimeApiMessage(RuntimeApiMessage), + CandidateValidation(CandidateValidationMessage), + CandidateSelection(CandidateSelectionMessage), + Provisioner(ProvisionerMessage), + PoVDistribution(PoVDistributionMessage), + StatementDistribution(StatementDistributionMessage), +} + +impl From for AllMessages { + fn from(f: FromJob) -> Self { + match f { + FromJob::AvailabilityStore(msg) => AllMessages::AvailabilityStore(msg), + FromJob::RuntimeApiMessage(msg) => AllMessages::RuntimeApi(msg), + FromJob::CandidateValidation(msg) => AllMessages::CandidateValidation(msg), + FromJob::CandidateSelection(msg) => AllMessages::CandidateSelection(msg), + FromJob::StatementDistribution(msg) => AllMessages::StatementDistribution(msg), + FromJob::PoVDistribution(msg) => AllMessages::PoVDistribution(msg), + FromJob::Provisioner(msg) => AllMessages::Provisioner(msg), + } + } +} + +// It looks like it's not possible to do an `impl From` given the current state of +// the code. So this does the necessary conversion. +fn primitive_statement_to_table(s: &SignedFullStatement) -> TableSignedStatement { + let statement = match s.payload() { + Statement::Seconded(c) => TableStatement::Candidate(c.clone()), + Statement::Valid(h) => TableStatement::Valid(h.clone()), + Statement::Invalid(h) => TableStatement::Invalid(h.clone()), + }; + + TableSignedStatement { + statement, + signature: s.signature().clone(), + sender: s.validator_index(), + } +} + +// finds the first key we are capable of signing with out of the given set of validators, +// if any. +fn signing_key(validators: &[ValidatorId], keystore: &KeyStorePtr) -> Option { + let keystore = keystore.read(); + validators.iter() + .find_map(|v| { + keystore.key_pair::(&v).ok() + }) +} + +impl CandidateBackingJob { + /// Run asynchronously. + async fn run(mut self) -> Result<(), Error> { + while let Some(msg) = self.rx_to.next().await { + match msg { + ToJob::CandidateBacking(msg) => { + self.process_msg(msg).await?; + } + _ => break, + } + } + + Ok(()) + } + + async fn issue_candidate_invalid_message( + &mut self, + candidate: AbridgedCandidateReceipt, + ) -> Result<(), Error> { + self.tx_from.send(FromJob::CandidateSelection( + CandidateSelectionMessage::Invalid(self.parent, candidate) + )).await?; + + Ok(()) + } + + /// Validate the candidate that is requested to be `Second`ed and distribute validation result. + async fn validate_and_second( + &mut self, + candidate: AbridgedCandidateReceipt, + pov: PoVBlock, + ) -> Result { + let valid = self.request_candidate_validation(candidate.clone(), pov.clone()).await?; + let statement = match valid.0 { + ValidationResult::Valid => { + // make PoV available for later distribution. Send data to the availability + // store to keep. Sign and dispatch `valid` statement to network if we + // have not seconded the given candidate. + self.make_pov_available(pov, valid.1, valid.2).await?; + self.issued_statements.insert(candidate.hash()); + Statement::Seconded(candidate) + } + ValidationResult::Invalid => { + let candidate_hash = candidate.hash(); + self.issue_candidate_invalid_message(candidate).await?; + Statement::Invalid(candidate_hash) + } + }; + + if let Some(signed_statement) = self.sign_statement(statement) { + self.import_statement(&signed_statement).await?; + self.distribute_signed_statement(signed_statement).await?; + } + + Ok(valid.0) + } + + fn get_backed(&self) -> Vec { + let proposed = self.table.proposed_candidates(&self.table_context); + let mut res = Vec::with_capacity(proposed.len()); + + for p in proposed.into_iter() { + let TableAttestedCandidate { candidate, validity_votes, .. } = p; + + let (ids, validity_votes): (Vec<_>, Vec<_>) = validity_votes + .into_iter() + .map(|(id, vote)| (id, vote.into())) + .unzip(); + + let group = match self.table_context.groups.get(&self.assignment) { + Some(group) => group, + None => continue, + }; + + let mut validator_indices = BitVec::with_capacity( + group.len() + ); + + validator_indices.resize(group.len(), false); + + for id in ids.iter() { + if let Some(position) = group.iter().position(|x| x == id) { + validator_indices.set(position, true); + } + } + + let backed = BackedCandidate { + candidate, + validity_votes, + validator_indices, + }; + + res.push(NewBackedCandidate(backed.clone())); + } + + res + } + + /// Check if there have happened any new misbehaviors and issue necessary messages. + /// + /// TODO: Report multiple misbehaviors (https://github.com/paritytech/polkadot/issues/1387) + async fn issue_new_misbehaviors(&mut self) -> Result<(), Error> { + let mut reports = Vec::new(); + + for (k, v) in self.table.get_misbehavior().iter() { + if !self.reported_misbehavior_for.contains(k) { + self.reported_misbehavior_for.insert(*k); + + let f = FromTableMisbehavior { + id: *k, + report: v.clone(), + signing_context: self.table_context.signing_context.clone(), + key: self.table_context.validators[*k as usize].clone(), + }; + + if let Ok(report) = MisbehaviorReport::try_from(f) { + let message = ProvisionerMessage::ProvisionableData( + ProvisionableData::MisbehaviorReport(self.parent, report) + ); + + reports.push(message); + } + } + } + + for report in reports.drain(..) { + self.send_to_provisioner(report).await? + } + + Ok(()) + } + + /// Import a statement into the statement table and return the summary of the import. + async fn import_statement( + &mut self, + statement: &SignedFullStatement, + ) -> Result, Error> { + let stmt = primitive_statement_to_table(statement); + + let summary = self.table.import_statement(&self.table_context, stmt); + + self.issue_new_misbehaviors().await?; + + return Ok(summary); + } + + async fn process_msg(&mut self, msg: CandidateBackingMessage) -> Result<(), Error> { + match msg { + CandidateBackingMessage::Second(_, candidate, pov) => { + // Sanity check that candidate is from our assignment. + if candidate.parachain_index != self.assignment { + return Ok(()); + } + + // If the message is a `CandidateBackingMessage::Second`, sign and dispatch a + // Seconded statement only if we have not seconded any other candidate and + // have not signed a Valid statement for the requested candidate. + match self.seconded { + // This job has not seconded a candidate yet. + None => { + let candidate_hash = candidate.hash(); + + if !self.issued_statements.contains(&candidate_hash) { + if let Ok(ValidationResult::Valid) = self.validate_and_second( + candidate, + pov, + ).await { + self.seconded = Some(candidate_hash); + } + } + } + // This job has already seconded a candidate. + Some(_) => {} + } + } + CandidateBackingMessage::Statement(_, statement) => { + self.check_statement_signature(&statement)?; + self.maybe_validate_and_import(statement).await?; + } + CandidateBackingMessage::GetBackedCandidates(_, tx) => { + let backed = self.get_backed(); + + tx.send(backed).map_err(|_| oneshot::Canceled)?; + } + } + + Ok(()) + } + + /// Kick off validation work and distribute the result as a signed statement. + async fn kick_off_validation_work( + &mut self, + summary: TableSummary, + ) -> Result { + let candidate = self.table.get_candidate(&summary.candidate).ok_or(Error::CandidateNotFound)?; + let candidate = candidate.clone(); + let descriptor = candidate.to_descriptor(); + let candidate_hash = candidate.hash(); + let pov = self.request_pov_from_distribution(descriptor).await?; + let v = self.request_candidate_validation(candidate, pov).await?; + + let statement = match v.0 { + ValidationResult::Valid => { + Statement::Valid(candidate_hash) + } + ValidationResult::Invalid => { + Statement::Invalid(candidate_hash) + } + }; + + self.issued_statements.insert(candidate_hash); + + if let Some(signed_statement) = self.sign_statement(statement) { + self.distribute_signed_statement(signed_statement).await?; + } + + Ok(v.0) + } + + /// Import the statement and kick off validation work if it is a part of our assignment. + async fn maybe_validate_and_import( + &mut self, + statement: SignedFullStatement, + ) -> Result<(), Error> { + if let Some(summary) = self.import_statement(&statement).await? { + if let Statement::Seconded(_) = statement.payload() { + if summary.group_id == self.assignment { + self.kick_off_validation_work(summary).await?; + } + } + } + + Ok(()) + } + + fn sign_statement(&self, statement: Statement) -> Option { + let local_index = self.table_context.local_index()?; + + let signing_key = self.table_context.key.as_ref()?; + + let signed_statement = SignedFullStatement::sign( + statement, + &self.table_context.signing_context, + local_index, + signing_key, + ); + + Some(signed_statement) + } + + fn check_statement_signature(&self, statement: &SignedFullStatement) -> Result<(), Error> { + let idx = statement.validator_index() as usize; + + if self.table_context.validators.len() > idx { + statement.check_signature( + &self.table_context.signing_context, + &self.table_context.validators[idx], + ).map_err(|_| Error::InvalidSignature)?; + } else { + return Err(Error::InvalidSignature); + } + + Ok(()) + } + + async fn send_to_provisioner(&mut self, msg: ProvisionerMessage) -> Result<(), Error> { + self.tx_from.send(FromJob::Provisioner(msg)).await?; + + Ok(()) + } + + async fn request_pov_from_distribution( + &mut self, + descriptor: CandidateDescriptor, + ) -> Result { + let (tx, rx) = oneshot::channel(); + + self.tx_from.send(FromJob::PoVDistribution( + PoVDistributionMessage::FetchPoV(self.parent, descriptor, tx) + )).await?; + + let pov = rx.await?; + Ok((*pov).clone()) + } + + async fn request_candidate_validation( + &mut self, + candidate: AbridgedCandidateReceipt, + pov: PoVBlock, + ) -> Result<(ValidationResult, GlobalValidationSchedule, LocalValidationData), Error> { + let (tx, rx) = oneshot::channel(); + + self.tx_from.send(FromJob::CandidateValidation( + CandidateValidationMessage::Validate( + self.parent, + candidate, + self.head_data.clone(), + pov, + tx, + ) + ) + ).await?; + + Ok(rx.await??) + } + + async fn store_chunk( + &mut self, + id: ValidatorIndex, + chunk: ErasureChunk, + ) -> Result<(), Error> { + self.tx_from.send(FromJob::AvailabilityStore( + AvailabilityStoreMessage::StoreChunk(self.parent, id, chunk) + ) + ).await?; + + Ok(()) + } + + async fn make_pov_available( + &mut self, + pov_block: PoVBlock, + global_validation: GlobalValidationSchedule, + local_validation: LocalValidationData, + ) -> Result<(), Error> { + let omitted_validation = OmittedValidationData { + global_validation, + local_validation, + }; + + let available_data = AvailableData { + pov_block, + omitted_validation, + }; + + let chunks = erasure_coding::obtain_chunks( + self.table_context.validators.len(), + &available_data, + )?; + + let branches = erasure_coding::branches(chunks.as_ref()); + + for (index, (chunk, proof)) in chunks.iter().zip(branches.map(|(proof, _)| proof)).enumerate() { + let chunk = ErasureChunk { + chunk: chunk.clone(), + index: index as u32, + proof, + }; + + self.store_chunk(index as ValidatorIndex, chunk).await?; + } + + Ok(()) + } + + async fn distribute_signed_statement(&mut self, s: SignedFullStatement) -> Result<(), Error> { + let smsg = StatementDistributionMessage::Share(self.parent, s); + + self.tx_from.send(FromJob::StatementDistribution(smsg)).await?; + + Ok(()) + } +} + +struct JobHandle { + abort_handle: future::AbortHandle, + to_job: mpsc::Sender, + finished: oneshot::Receiver<()>, + su_handle: usize, +} + +impl JobHandle { + async fn stop(mut self) { + let _ = self.to_job.send(ToJob::Stop).await; + let stop_timer = Delay::new(Duration::from_secs(1)); + + match future::select(stop_timer, self.finished).await { + Either::Left((_, _)) => { + }, + Either::Right((_, _)) => { + self.abort_handle.abort(); + }, + } + } + + async fn send_msg(&mut self, msg: ToJob) -> Result<(), Error> { + Ok(self.to_job.send(msg).await?) + } +} + +struct Jobs { + spawner: S, + running: HashMap, + outgoing_msgs: StreamUnordered>, +} + +async fn run_job( + parent: Hash, + keystore: KeyStorePtr, + rx_to: mpsc::Receiver, + mut tx_from: mpsc::Sender, +) -> Result<(), Error> { + let (validators, roster) = futures::try_join!( + request_validators(parent, &mut tx_from).await?, + request_validator_groups(parent, &mut tx_from).await?, + )?; + + let key = signing_key(&validators[..], &keystore).ok_or(Error::NotInValidatorSet)?; + let mut groups = HashMap::new(); + + for assignment in roster.scheduled { + if let Some(g) = roster.validator_groups.get(assignment.group_idx.0 as usize) { + groups.insert( + assignment.para_id, + g.clone(), + ); + } + } + + let mut assignment = Default::default(); + + if let Some(idx) = validators.iter().position(|k| *k == key.public()) { + let idx = idx as u32; + for (para_id, group) in groups.iter() { + if group.contains(&idx) { + assignment = *para_id; + break; + } + } + } + + let ( + head_data, + signing_context, + ) = futures::try_join!( + request_head_data(parent, &mut tx_from, assignment).await?, + request_signing_context(parent, &mut tx_from).await?, + )?; + + let table_context = TableContext { + signing_context, + key: Some(key), + groups, + validators, + }; + + let job = CandidateBackingJob { + parent, + rx_to, + tx_from, + head_data, + assignment, + issued_statements: HashSet::new(), + seconded: None, + reported_misbehavior_for: HashSet::new(), + table: Table::default(), + table_context, + }; + + job.run().await +} + +/// Request a validator set from the `RuntimeApi`. +async fn request_validators( + parent: Hash, + s: &mut mpsc::Sender, +) -> Result>, Error> { + let (tx, rx) = oneshot::channel(); + + s.send(FromJob::RuntimeApiMessage(RuntimeApiMessage::Request( + parent, + RuntimeApiRequest::Validators(tx), + ) + )).await?; + + Ok(rx) +} + +/// Request the scheduler roster from `RuntimeApi`. +async fn request_validator_groups( + parent: Hash, + s: &mut mpsc::Sender, +) -> Result, Error> { + let (tx, rx) = oneshot::channel(); + + s.send(FromJob::RuntimeApiMessage(RuntimeApiMessage::Request( + parent, + RuntimeApiRequest::ValidatorGroups(tx), + ) + )).await?; + + Ok(rx) +} + +/// Request a `SigningContext` from the `RuntimeApi`. +async fn request_signing_context( + parent: Hash, + s: &mut mpsc::Sender, +) -> Result, Error> { + let (tx, rx) = oneshot::channel(); + + s.send(FromJob::RuntimeApiMessage(RuntimeApiMessage::Request( + parent, + RuntimeApiRequest::SigningContext(tx), + ) + )).await?; + + Ok(rx) +} + +/// Request `HeadData` for some `ParaId` from `RuntimeApi`. +async fn request_head_data( + parent: Hash, + s: &mut mpsc::Sender, + id: ParaId, +) -> Result, Error> { + let (tx, rx) = oneshot::channel(); + + s.send(FromJob::RuntimeApiMessage(RuntimeApiMessage::Request( + parent, + RuntimeApiRequest::HeadData(id, tx), + ) + )).await?; + + Ok(rx) +} + +impl Jobs { + fn new(spawner: S) -> Self { + Self { + spawner, + running: HashMap::default(), + outgoing_msgs: StreamUnordered::new(), + } + } + + fn spawn_job(&mut self, parent_hash: Hash, keystore: KeyStorePtr) -> Result<(), Error> { + let (to_job_tx, to_job_rx) = mpsc::channel(CHANNEL_CAPACITY); + let (from_job_tx, from_job_rx) = mpsc::channel(CHANNEL_CAPACITY); + + let (future, abort_handle) = future::abortable(async move { + if let Err(e) = run_job(parent_hash, keystore, to_job_rx, from_job_tx).await { + log::error!( + "CandidateBackingJob({}) finished with an error {:?}", + parent_hash, + e, + ); + } + }); + + let (finished_tx, finished) = oneshot::channel(); + + let future = async move { + let _ = future.await; + let _ = finished_tx.send(()); + }; + self.spawner.spawn(future)?; + + let su_handle = self.outgoing_msgs.push(from_job_rx); + + let handle = JobHandle { + abort_handle, + to_job: to_job_tx, + finished, + su_handle, + }; + + self.running.insert(parent_hash, handle); + + Ok(()) + } + + async fn stop_job(&mut self, parent_hash: Hash) -> Result<(), Error> { + match self.running.remove(&parent_hash) { + Some(handle) => { + Pin::new(&mut self.outgoing_msgs).remove(handle.su_handle); + handle.stop().await; + Ok(()) + } + None => Err(Error::JobNotFound(parent_hash)) + } + } + + async fn send_msg(&mut self, parent_hash: Hash, msg: ToJob) -> Result<(), Error> { + if let Some(job) = self.running.get_mut(&parent_hash) { + job.send_msg(msg).await?; + } + Ok(()) + } + + async fn next(&mut self) -> Option { + self.outgoing_msgs.next().await.and_then(|(e, _)| match e { + StreamYield::Item(e) => Some(e), + _ => None, + }) + } +} + +/// An implementation of the Candidate Backing subsystem. +pub struct CandidateBackingSubsystem { + spawner: S, + keystore: KeyStorePtr, + _context: std::marker::PhantomData, +} + +impl CandidateBackingSubsystem + where + S: Spawn + Clone, + Context: SubsystemContext, +{ + /// Creates a new `CandidateBackingSubsystem`. + pub fn new(keystore: KeyStorePtr, spawner: S) -> Self { + Self { + spawner, + keystore, + _context: std::marker::PhantomData, + } + } + + async fn run( + mut ctx: Context, + keystore: KeyStorePtr, + spawner: S, + ) { + let mut jobs = Jobs::new(spawner.clone()); + + loop { + select! { + incoming = ctx.recv().fuse() => { + match incoming { + Ok(msg) => match msg { + FromOverseer::Signal(OverseerSignal::StartWork(hash)) => { + if let Err(e) = jobs.spawn_job(hash, keystore.clone()) { + log::error!("Failed to spawn a job: {:?}", e); + break; + } + } + FromOverseer::Signal(OverseerSignal::StopWork(hash)) => { + if let Err(e) = jobs.stop_job(hash).await { + log::error!("Failed to spawn a job: {:?}", e); + break; + } + } + FromOverseer::Communication { msg } => { + match msg { + CandidateBackingMessage::Second(hash, _, _) | + CandidateBackingMessage::Statement(hash, _) | + CandidateBackingMessage::GetBackedCandidates(hash, _) => { + let res = jobs.send_msg( + hash.clone(), + ToJob::CandidateBacking(msg), + ).await; + + if let Err(e) = res { + log::error!( + "Failed to send a message to a job: {:?}", + e, + ); + + break; + } + } + _ => (), + } + } + _ => (), + }, + Err(_) => break, + } + } + outgoing = jobs.next().fuse() => { + match outgoing { + Some(msg) => { + let _ = ctx.send_message(msg.into()).await; + } + None => break, + } + } + complete => break, + } + } + } +} + +impl Subsystem for CandidateBackingSubsystem + where + S: Spawn + Send + Clone + 'static, + Context: SubsystemContext, +{ + fn start(self, ctx: Context) -> SpawnedSubsystem { + let keystore = self.keystore.clone(); + let spawner = self.spawner.clone(); + + SpawnedSubsystem(Box::pin(async move { + Self::run(ctx, keystore, spawner).await; + })) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use futures::{Future, executor::{self, ThreadPool}}; + use std::collections::HashMap; + use std::sync::Arc; + use sp_keyring::Sr25519Keyring; + use polkadot_primitives::parachain::{ + AssignmentKind, CollatorId, CoreAssignment, BlockData, CoreIndex, GroupIndex, ValidityAttestation, + }; + use assert_matches::assert_matches; + + fn validator_pubkeys(val_ids: &[Sr25519Keyring]) -> Vec { + val_ids.iter().map(|v| v.public().into()).collect() + } + + struct TestState { + chain_ids: Vec, + keystore: KeyStorePtr, + validators: Vec, + validator_public: Vec, + global_validation_schedule: GlobalValidationSchedule, + local_validation_data: LocalValidationData, + roster: SchedulerRoster, + head_data: HashMap, + signing_context: SigningContext, + relay_parent: Hash, + } + + impl Default for TestState { + fn default() -> Self { + let chain_a = ParaId::from(1); + let chain_b = ParaId::from(2); + let thread_a = ParaId::from(3); + + let chain_ids = vec![chain_a, chain_b, thread_a]; + + let validators = vec![ + Sr25519Keyring::Alice, + Sr25519Keyring::Bob, + Sr25519Keyring::Charlie, + Sr25519Keyring::Dave, + Sr25519Keyring::Ferdie, + ]; + + let keystore = keystore::Store::new_in_memory(); + // Make sure `Alice` key is in the keystore, so this mocked node will be a parachain validator. + keystore.write().insert_ephemeral_from_seed::(&validators[0].to_seed()) + .expect("Insert key into keystore"); + + let validator_public = validator_pubkeys(&validators); + + let chain_a_assignment = CoreAssignment { + core: CoreIndex::from(0), + para_id: chain_a, + kind: AssignmentKind::Parachain, + group_idx: GroupIndex::from(0), + }; + + let chain_b_assignment = CoreAssignment { + core: CoreIndex::from(1), + para_id: chain_b, + kind: AssignmentKind::Parachain, + group_idx: GroupIndex::from(1), + }; + + let thread_collator: CollatorId = Sr25519Keyring::Two.public().into(); + + let thread_a_assignment = CoreAssignment { + core: CoreIndex::from(2), + para_id: thread_a, + kind: AssignmentKind::Parathread(thread_collator.clone(), 0), + group_idx: GroupIndex::from(2), + }; + + let validator_groups = vec![vec![2, 0, 3], vec![1], vec![4]]; + + let parent_hash_1 = [1; 32].into(); + + let roster = SchedulerRoster { + validator_groups, + scheduled: vec![ + chain_a_assignment, + chain_b_assignment, + thread_a_assignment, + ], + upcoming: vec![], + availability_cores: vec![], + }; + let signing_context = SigningContext { + session_index: 1, + parent_hash: parent_hash_1, + }; + + let mut head_data = HashMap::new(); + head_data.insert(chain_a, HeadData(vec![4, 5, 6])); + + let relay_parent = Hash::from([5; 32]); + + let local_validation_data = LocalValidationData { + parent_head: HeadData(vec![7, 8, 9]), + balance: Default::default(), + code_upgrade_allowed: None, + }; + + let global_validation_schedule = GlobalValidationSchedule { + max_code_size: 1000, + max_head_data_size: 1000, + block_number: Default::default(), + }; + + Self { + chain_ids, + keystore, + validators, + validator_public, + roster, + head_data, + local_validation_data, + global_validation_schedule, + signing_context, + relay_parent, + } + } + } + + struct TestHarness { + virtual_overseer: subsystem_test::TestSubsystemContextHandle, + } + + fn test_harness>(keystore: KeyStorePtr, test: impl FnOnce(TestHarness) -> T) { + let pool = ThreadPool::new().unwrap(); + + let (context, virtual_overseer) = subsystem_test::make_subsystem_context(pool.clone()); + + let subsystem = CandidateBackingSubsystem::run(context, keystore, pool.clone()); + + let test_fut = test(TestHarness { + virtual_overseer, + }); + + futures::pin_mut!(test_fut); + futures::pin_mut!(subsystem); + + executor::block_on(future::select(test_fut, subsystem)); + } + + // Tests that the subsystem performs actions that are requied on startup. + async fn test_startup( + virtual_overseer: &mut subsystem_test::TestSubsystemContextHandle, + test_state: &TestState, + ) { + // Start work on some new parent. + virtual_overseer.send(FromOverseer::Signal( + OverseerSignal::StartWork(test_state.relay_parent)) + ).await; + + // Check that subsystem job issues a request for a validator set. + assert_matches!( + virtual_overseer.recv().await, + AllMessages::RuntimeApi( + RuntimeApiMessage::Request(parent, RuntimeApiRequest::Validators(tx)) + ) if parent == test_state.relay_parent => { + tx.send(test_state.validator_public.clone()).unwrap(); + } + ); + + // Check that subsystem job issues a request for the validator groups. + assert_matches!( + virtual_overseer.recv().await, + AllMessages::RuntimeApi( + RuntimeApiMessage::Request(parent, RuntimeApiRequest::ValidatorGroups(tx)) + ) if parent == test_state.relay_parent => { + tx.send(test_state.roster.clone()).unwrap(); + } + ); + + // Check that subsystem job issues a request for the head data. + assert_matches!( + virtual_overseer.recv().await, + AllMessages::RuntimeApi( + RuntimeApiMessage::Request(parent, RuntimeApiRequest::HeadData(id, tx)) + ) if parent == test_state.relay_parent => { + tx.send(test_state.head_data.get(&id).unwrap().clone()).unwrap(); + } + ); + + // Check that subsystem job issues a request for the signing context. + assert_matches!( + virtual_overseer.recv().await, + AllMessages::RuntimeApi( + RuntimeApiMessage::Request(parent, RuntimeApiRequest::SigningContext(tx)) + ) if parent == test_state.relay_parent => { + tx.send(test_state.signing_context.clone()).unwrap(); + } + ); + } + + // Test that a `CandidateBackingMessage::Second` issues validation work + // and in case validation is successful issues a `StatementDistributionMessage`. + #[test] + fn backing_second_works() { + let test_state = TestState::default(); + test_harness(test_state.keystore.clone(), |test_harness| async move { + let TestHarness { mut virtual_overseer } = test_harness; + + test_startup(&mut virtual_overseer, &test_state).await; + + let pov_block = PoVBlock { + block_data: BlockData(vec![42, 43, 44]), + }; + + let pov_block_hash = pov_block.hash(); + let candidate = AbridgedCandidateReceipt { + parachain_index: test_state.chain_ids[0], + relay_parent: test_state.relay_parent, + pov_block_hash, + ..Default::default() + }; + + let second = CandidateBackingMessage::Second( + test_state.relay_parent, + candidate.clone(), + pov_block.clone(), + ); + + virtual_overseer.send(FromOverseer::Communication{ msg: second }).await; + + let expected_head_data = test_state.head_data.get(&test_state.chain_ids[0]).unwrap(); + + assert_matches!( + virtual_overseer.recv().await, + AllMessages::CandidateValidation( + CandidateValidationMessage::Validate( + parent_hash, + c, + head_data, + pov, + tx, + ) + ) if parent_hash == test_state.relay_parent && + pov == pov_block && c == candidate => { + assert_eq!(head_data, *expected_head_data); + tx.send(Ok(( + ValidationResult::Valid, + test_state.global_validation_schedule, + test_state.local_validation_data, + ))).unwrap(); + } + ); + + for _ in 0..test_state.validators.len() { + assert_matches!( + virtual_overseer.recv().await, + AllMessages::AvailabilityStore( + AvailabilityStoreMessage::StoreChunk(parent_hash, _, _) + ) if parent_hash == test_state.relay_parent + ); + } + + assert_matches!( + virtual_overseer.recv().await, + AllMessages::StatementDistribution( + StatementDistributionMessage::Share( + parent_hash, + signed_statement, + ) + ) if parent_hash == test_state.relay_parent => { + signed_statement.check_signature( + &test_state.signing_context, + &test_state.validator_public[0], + ).unwrap(); + } + ); + + virtual_overseer.send(FromOverseer::Signal( + OverseerSignal::StopWork(test_state.relay_parent)) + ).await; + }); + } + + // Test that the candidate reaches quorum succesfully. + #[test] + fn backing_works() { + let test_state = TestState::default(); + test_harness(test_state.keystore.clone(), |test_harness| async move { + let TestHarness { mut virtual_overseer } = test_harness; + + test_startup(&mut virtual_overseer, &test_state).await; + + let pov_block = PoVBlock { + block_data: BlockData(vec![1, 2, 3]), + }; + + let pov_block_hash = pov_block.hash(); + + let candidate_a = AbridgedCandidateReceipt { + parachain_index: test_state.chain_ids[0], + relay_parent: test_state.relay_parent, + pov_block_hash, + ..Default::default() + }; + + let candidate_a_hash = candidate_a.hash(); + + let signed_a = SignedFullStatement::sign( + Statement::Seconded(candidate_a.clone()), + &test_state.signing_context, + 2, + &test_state.validators[2].pair().into(), + ); + + let signed_b = SignedFullStatement::sign( + Statement::Valid(candidate_a_hash), + &test_state.signing_context, + 0, + &test_state.validators[0].pair().into(), + ); + + let statement = CandidateBackingMessage::Statement(test_state.relay_parent, signed_a.clone()); + + virtual_overseer.send(FromOverseer::Communication{ msg: statement }).await; + + // Sending a `Statement::Seconded` for our assignment will start + // validation process. The first thing requested is PoVBlock from the + // `PoVDistribution`. + assert_matches!( + virtual_overseer.recv().await, + AllMessages::PoVDistribution( + PoVDistributionMessage::FetchPoV(relay_parent, _, tx) + ) if relay_parent == test_state.relay_parent => { + tx.send(Arc::new(pov_block.clone())).unwrap(); + } + ); + + let expected_head_data = test_state.head_data.get(&test_state.chain_ids[0]).unwrap(); + + // The next step is the actual request to Validation subsystem + // to validate the `Seconded` candidate. + assert_matches!( + virtual_overseer.recv().await, + AllMessages::CandidateValidation( + CandidateValidationMessage::Validate( + relay_parent, + candidate, + head_data, + pov, + tx, + ) + ) if relay_parent == test_state.relay_parent && candidate == candidate_a => { + assert_eq!(head_data, *expected_head_data); + assert_eq!(pov, pov_block); + tx.send(Ok(( + ValidationResult::Valid, + test_state.global_validation_schedule, + test_state.local_validation_data, + ))).unwrap(); + } + ); + + let statement = CandidateBackingMessage::Statement( + test_state.relay_parent, + signed_b.clone(), + ); + + virtual_overseer.send(FromOverseer::Communication{ msg: statement }).await; + + let (tx, rx) = oneshot::channel(); + + // The backed candidats set should be not empty at this point. + virtual_overseer.send(FromOverseer::Communication{ + msg: CandidateBackingMessage::GetBackedCandidates( + test_state.relay_parent, + tx, + ) + }).await; + + let backed = rx.await.unwrap(); + + // `validity_votes` may be in any order so we can't do this in a single assert. + assert_eq!(backed[0].0.candidate, candidate_a); + assert_eq!(backed[0].0.validity_votes.len(), 2); + assert!(backed[0].0.validity_votes.contains( + &ValidityAttestation::Explicit(signed_b.signature().clone()) + )); + assert!(backed[0].0.validity_votes.contains( + &ValidityAttestation::Implicit(signed_a.signature().clone()) + )); + assert_eq!(backed[0].0.validator_indices, bitvec::bitvec![Lsb0, u8; 1, 1, 0]); + + virtual_overseer.send(FromOverseer::Signal( + OverseerSignal::StopWork(test_state.relay_parent)) + ).await; + }); + } + + // Issuing conflicting statements on the same candidate should + // be a misbehavior. + #[test] + fn backing_misbehavior_works() { + let test_state = TestState::default(); + test_harness(test_state.keystore.clone(), |test_harness| async move { + let TestHarness { mut virtual_overseer } = test_harness; + + test_startup(&mut virtual_overseer, &test_state).await; + + let pov_block = PoVBlock { + block_data: BlockData(vec![1, 2, 3]), + }; + + let pov_block_hash = pov_block.hash(); + let candidate_a = AbridgedCandidateReceipt { + parachain_index: test_state.chain_ids[0], + relay_parent: test_state.relay_parent, + pov_block_hash, + ..Default::default() + }; + + let candidate_a_hash = candidate_a.hash(); + + let signed_a = SignedFullStatement::sign( + Statement::Seconded(candidate_a.clone()), + &test_state.signing_context, + 2, + &test_state.validators[2].pair().into(), + ); + + let signed_b = SignedFullStatement::sign( + Statement::Valid(candidate_a_hash), + &test_state.signing_context, + 0, + &test_state.validators[0].pair().into(), + ); + + let signed_c = SignedFullStatement::sign( + Statement::Invalid(candidate_a_hash), + &test_state.signing_context, + 0, + &test_state.validators[0].pair().into(), + ); + + let statement = CandidateBackingMessage::Statement(test_state.relay_parent, signed_a.clone()); + + virtual_overseer.send(FromOverseer::Communication{ msg: statement }).await; + + assert_matches!( + virtual_overseer.recv().await, + AllMessages::PoVDistribution( + PoVDistributionMessage::FetchPoV(relay_parent, _, tx) + ) if relay_parent == test_state.relay_parent => { + tx.send(Arc::new(pov_block.clone())).unwrap(); + } + ); + + let expected_head_data = test_state.head_data.get(&test_state.chain_ids[0]).unwrap(); + + assert_matches!( + virtual_overseer.recv().await, + AllMessages::CandidateValidation( + CandidateValidationMessage::Validate( + relay_parent, + candidate, + head_data, + pov, + tx, + ) + ) if relay_parent == test_state.relay_parent && candidate == candidate_a => { + assert_eq!(pov, pov_block); + assert_eq!(head_data, *expected_head_data); + tx.send(Ok(( + ValidationResult::Valid, + test_state.global_validation_schedule, + test_state.local_validation_data, + ))).unwrap(); + } + ); + + assert_matches!( + virtual_overseer.recv().await, + AllMessages::StatementDistribution( + StatementDistributionMessage::Share( + relay_parent, + signed_statement, + ) + ) if relay_parent == test_state.relay_parent => { + signed_statement.check_signature( + &test_state.signing_context, + &test_state.validator_public[0], + ).unwrap(); + + assert_eq!(*signed_statement.payload(), Statement::Valid(candidate_a_hash)); + } + ); + + let statement = CandidateBackingMessage::Statement(test_state.relay_parent, signed_b.clone()); + + virtual_overseer.send(FromOverseer::Communication{ msg: statement }).await; + + let statement = CandidateBackingMessage::Statement(test_state.relay_parent, signed_c.clone()); + + virtual_overseer.send(FromOverseer::Communication{ msg: statement }).await; + + assert_matches!( + virtual_overseer.recv().await, + AllMessages::Provisioner( + ProvisionerMessage::ProvisionableData( + ProvisionableData::MisbehaviorReport( + relay_parent, + MisbehaviorReport::SelfContradiction(_, s1, s2), + ) + ) + ) if relay_parent == test_state.relay_parent => { + s1.check_signature( + &test_state.signing_context, + &test_state.validator_public[s1.validator_index() as usize], + ).unwrap(); + + s2.check_signature( + &test_state.signing_context, + &test_state.validator_public[s2.validator_index() as usize], + ).unwrap(); + } + ); + + }); + } + + // Test that if we are asked to second an invalid candidate we + // can still second a valid one afterwards. + #[test] + fn backing_dont_second_invalid() { + let test_state = TestState::default(); + test_harness(test_state.keystore.clone(), |test_harness| async move { + let TestHarness { mut virtual_overseer } = test_harness; + + test_startup(&mut virtual_overseer, &test_state).await; + + let pov_block_a = PoVBlock { + block_data: BlockData(vec![42, 43, 44]), + }; + + let pov_block_b = PoVBlock { + block_data: BlockData(vec![45, 46, 47]), + }; + + let pov_block_hash_a = pov_block_a.hash(); + let pov_block_hash_b = pov_block_b.hash(); + + let candidate_a = AbridgedCandidateReceipt { + parachain_index: test_state.chain_ids[0], + relay_parent: test_state.relay_parent, + pov_block_hash: pov_block_hash_a, + ..Default::default() + }; + + let candidate_a_hash = candidate_a.hash(); + + let candidate_b = AbridgedCandidateReceipt { + parachain_index: test_state.chain_ids[0], + relay_parent: test_state.relay_parent, + pov_block_hash: pov_block_hash_b, + ..Default::default() + }; + + let second = CandidateBackingMessage::Second( + test_state.relay_parent, + candidate_a.clone(), + pov_block_a.clone(), + ); + + virtual_overseer.send(FromOverseer::Communication{ msg: second }).await; + + let expected_head_data = test_state.head_data.get(&test_state.chain_ids[0]).unwrap(); + + assert_matches!( + virtual_overseer.recv().await, + AllMessages::CandidateValidation( + CandidateValidationMessage::Validate( + parent_hash, + c, + head_data, + pov, + tx, + ) + ) if parent_hash == test_state.relay_parent && + pov == pov_block_a && c == candidate_a => { + assert_eq!(head_data, *expected_head_data); + tx.send(Ok(( + ValidationResult::Invalid, + test_state.global_validation_schedule.clone(), + test_state.local_validation_data.clone(), + ))).unwrap(); + } + ); + + assert_matches!( + virtual_overseer.recv().await, + AllMessages::CandidateSelection( + CandidateSelectionMessage::Invalid(parent_hash, candidate) + ) if parent_hash == test_state.relay_parent && candidate == candidate_a + ); + + assert_matches!( + virtual_overseer.recv().await, + AllMessages::StatementDistribution( + StatementDistributionMessage::Share( + relay_parent, + statement, + ) + ) if relay_parent == test_state.relay_parent => { + assert_eq!(*statement.payload(), Statement::Invalid(candidate_a_hash)); + } + ); + + let second = CandidateBackingMessage::Second( + test_state.relay_parent, + candidate_b.clone(), + pov_block_b.clone(), + ); + + virtual_overseer.send(FromOverseer::Communication{ msg: second }).await; + + let expected_head_data = test_state.head_data.get(&test_state.chain_ids[0]).unwrap(); + + assert_matches!( + virtual_overseer.recv().await, + AllMessages::CandidateValidation( + CandidateValidationMessage::Validate( + parent_hash, + c, + head_data, + pov, + tx, + ) + ) if parent_hash == test_state.relay_parent && + pov == pov_block_b && c == candidate_b => { + assert_eq!(head_data, *expected_head_data); + tx.send(Ok(( + ValidationResult::Valid, + test_state.global_validation_schedule, + test_state.local_validation_data, + ))).unwrap(); + } + ); + + for _ in 0..test_state.validators.len() { + assert_matches!( + virtual_overseer.recv().await, + AllMessages::AvailabilityStore( + AvailabilityStoreMessage::StoreChunk(parent_hash, _, _) + ) if parent_hash == test_state.relay_parent + ); + } + + assert_matches!( + virtual_overseer.recv().await, + AllMessages::StatementDistribution( + StatementDistributionMessage::Share( + parent_hash, + signed_statement, + ) + ) if parent_hash == test_state.relay_parent => { + signed_statement.check_signature( + &test_state.signing_context, + &test_state.validator_public[0], + ).unwrap(); + + assert_eq!(*signed_statement.payload(), Statement::Seconded(candidate_b)); + } + ); + + virtual_overseer.send(FromOverseer::Signal( + OverseerSignal::StopWork(test_state.relay_parent)) + ).await; + }); + } + + // Test that if we have already issued a statement (in this case `Invalid`) about a + // candidate we will not be issuing a `Seconded` statement on it. + #[test] + fn backing_multiple_statements_work() { + let test_state = TestState::default(); + test_harness(test_state.keystore.clone(), |test_harness| async move { + let TestHarness { mut virtual_overseer } = test_harness; + + test_startup(&mut virtual_overseer, &test_state).await; + + let pov_block = PoVBlock { + block_data: BlockData(vec![42, 43, 44]), + }; + + let pov_block_hash = pov_block.hash(); + + let candidate = AbridgedCandidateReceipt { + parachain_index: test_state.chain_ids[0], + relay_parent: test_state.relay_parent, + pov_block_hash, + ..Default::default() + }; + + let candidate_hash = candidate.hash(); + + let signed_a = SignedFullStatement::sign( + Statement::Seconded(candidate.clone()), + &test_state.signing_context, + 2, + &test_state.validators[2].pair().into(), + ); + + // Send in a `Statement` with a candidate. + let statement = CandidateBackingMessage::Statement( + test_state.relay_parent, + signed_a.clone(), + ); + + virtual_overseer.send(FromOverseer::Communication{ msg: statement }).await; + + // Subsystem requests PoV and requests validation. + assert_matches!( + virtual_overseer.recv().await, + AllMessages::PoVDistribution( + PoVDistributionMessage::FetchPoV(relay_parent, _, tx) + ) => { + assert_eq!(relay_parent, test_state.relay_parent); + tx.send(Arc::new(pov_block.clone())).unwrap(); + } + ); + + let expected_head_data = test_state.head_data.get(&test_state.chain_ids[0]).unwrap(); + + // Tell subsystem that this candidate is invalid. + assert_matches!( + virtual_overseer.recv().await, + AllMessages::CandidateValidation( + CandidateValidationMessage::Validate( + relay_parent, + candidate_recvd, + head_data, + pov, + tx, + ) + ) => { + assert_eq!(relay_parent, test_state.relay_parent); + assert_eq!(candidate_recvd, candidate); + assert_eq!(head_data, *expected_head_data); + assert_eq!(pov, pov_block); + tx.send(Ok(( + ValidationResult::Invalid, + test_state.global_validation_schedule, + test_state.local_validation_data, + ))).unwrap(); + } + ); + + // The invalid message is shared. + assert_matches!( + virtual_overseer.recv().await, + AllMessages::StatementDistribution( + StatementDistributionMessage::Share( + relay_parent, + signed_statement, + ) + ) => { + assert_eq!(relay_parent, test_state.relay_parent); + signed_statement.check_signature( + &test_state.signing_context, + &test_state.validator_public[0], + ).unwrap(); + assert_eq!(*signed_statement.payload(), Statement::Invalid(candidate_hash)); + } + ); + + // Ask subsystem to `Second` a candidate that already has a statement issued about. + // This should emit no actions from subsystem. + let second = CandidateBackingMessage::Second( + test_state.relay_parent, + candidate.clone(), + pov_block.clone(), + ); + + virtual_overseer.send(FromOverseer::Communication{ msg: second }).await; + + let pov_to_second = PoVBlock { + block_data: BlockData(vec![3, 2, 1]), + }; + + let pov_block_hash = pov_to_second.hash(); + + let candidate_to_second = AbridgedCandidateReceipt { + parachain_index: test_state.chain_ids[0], + relay_parent: test_state.relay_parent, + pov_block_hash, + ..Default::default() + }; + + let second = CandidateBackingMessage::Second( + test_state.relay_parent, + candidate_to_second.clone(), + pov_to_second.clone(), + ); + + // In order to trigger _some_ actions from subsystem ask it to second another + // candidate. The only reason to do so is to make sure that no actions were + // triggered on the prev step. + virtual_overseer.send(FromOverseer::Communication{ msg: second }).await; + + assert_matches!( + virtual_overseer.recv().await, + AllMessages::CandidateValidation( + CandidateValidationMessage::Validate( + relay_parent, + _, + _, + pov, + _, + ) + ) => { + assert_eq!(relay_parent, test_state.relay_parent); + assert_eq!(pov, pov_to_second); + } + ); + }); + } +} diff --git a/node/overseer/examples/minimal-example.rs b/node/overseer/examples/minimal-example.rs index cdef0340d0..aefb627f7f 100644 --- a/node/overseer/examples/minimal-example.rs +++ b/node/overseer/examples/minimal-example.rs @@ -59,6 +59,7 @@ impl Subsystem1 { ctx.send_message(AllMessages::CandidateValidation( CandidateValidationMessage::Validate( + Default::default(), Default::default(), Default::default(), PoVBlock { diff --git a/node/overseer/src/lib.rs b/node/overseer/src/lib.rs index 70de3c1d86..ffebf33ce4 100644 --- a/node/overseer/src/lib.rs +++ b/node/overseer/src/lib.rs @@ -726,6 +726,7 @@ mod tests { ctx.send_message( AllMessages::CandidateValidation( CandidateValidationMessage::Validate( + Default::default(), Default::default(), Default::default(), PoVBlock { diff --git a/node/primitives/src/lib.rs b/node/primitives/src/lib.rs index 921f620ea9..25313c0915 100644 --- a/node/primitives/src/lib.rs +++ b/node/primitives/src/lib.rs @@ -23,10 +23,17 @@ use parity_scale_codec::{Decode, Encode}; use polkadot_primitives::{Hash, parachain::{ - AbridgedCandidateReceipt, CandidateReceipt, CompactStatement, - EncodeAs, Signed, + AbridgedCandidateReceipt, CompactStatement, + EncodeAs, Signed, SigningContext, ValidatorIndex, ValidatorId, } }; +use polkadot_statement_table::{ + generic::{ + ValidityDoubleVote as TableValidityDoubleVote, + MultipleCandidates as TableMultipleCandidates, + }, + Misbehavior as TableMisbehavior, +}; /// A statement, where the candidate receipt is included in the `Seconded` variant. #[derive(Debug, Clone, PartialEq, Eq, Encode, Decode)] @@ -77,11 +84,128 @@ pub enum MisbehaviorReport { /// this message should be dispatched with all of them, in arbitrary order. /// /// This variant is also used when our own validity checks disagree with others'. - CandidateValidityDisagreement(CandidateReceipt, Vec), + CandidateValidityDisagreement(AbridgedCandidateReceipt, Vec), /// I've noticed a peer contradicting itself about a particular candidate - SelfContradiction(CandidateReceipt, SignedFullStatement, SignedFullStatement), + SelfContradiction(AbridgedCandidateReceipt, SignedFullStatement, SignedFullStatement), /// This peer has seconded more than one parachain candidate for this relay parent head - DoubleVote(CandidateReceipt, SignedFullStatement, SignedFullStatement), + DoubleVote(SignedFullStatement, SignedFullStatement), +} + +/// A utility struct used to convert `TableMisbehavior` to `MisbehaviorReport`s. +pub struct FromTableMisbehavior { + /// Index of the validator. + pub id: ValidatorIndex, + /// The misbehavior reported by the table. + pub report: TableMisbehavior, + /// Signing context. + pub signing_context: SigningContext, + /// Misbehaving validator's public key. + pub key: ValidatorId, +} + +/// Result of the validation of the candidate. +#[derive(Debug)] +pub enum ValidationResult { + /// Candidate is valid. + Valid, + /// Candidate is invalid. + Invalid, +} + +impl std::convert::TryFrom for MisbehaviorReport { + type Error = (); + + fn try_from(f: FromTableMisbehavior) -> Result { + match f.report { + TableMisbehavior::ValidityDoubleVote( + TableValidityDoubleVote::IssuedAndValidity((c, s1), (d, s2)) + ) => { + let receipt = c.clone(); + let signed_1 = SignedFullStatement::new( + Statement::Seconded(c), + f.id, + s1, + &f.signing_context, + &f.key, + ).ok_or(())?; + let signed_2 = SignedFullStatement::new( + Statement::Valid(d), + f.id, + s2, + &f.signing_context, + &f.key, + ).ok_or(())?; + + Ok(MisbehaviorReport::SelfContradiction(receipt, signed_1, signed_2)) + } + TableMisbehavior::ValidityDoubleVote( + TableValidityDoubleVote::IssuedAndInvalidity((c, s1), (d, s2)) + ) => { + let receipt = c.clone(); + let signed_1 = SignedFullStatement::new( + Statement::Seconded(c), + f.id, + s1, + &f.signing_context, + &f.key, + ).ok_or(())?; + let signed_2 = SignedFullStatement::new( + Statement::Invalid(d), + f.id, + s2, + &f.signing_context, + &f.key, + ).ok_or(())?; + + Ok(MisbehaviorReport::SelfContradiction(receipt, signed_1, signed_2)) + } + TableMisbehavior::ValidityDoubleVote( + TableValidityDoubleVote::ValidityAndInvalidity(c, s1, s2) + ) => { + let signed_1 = SignedFullStatement::new( + Statement::Valid(c.hash()), + f.id, + s1, + &f.signing_context, + &f.key, + ).ok_or(())?; + let signed_2 = SignedFullStatement::new( + Statement::Invalid(c.hash()), + f.id, + s2, + &f.signing_context, + &f.key, + ).ok_or(())?; + + Ok(MisbehaviorReport::SelfContradiction(c, signed_1, signed_2)) + } + TableMisbehavior::MultipleCandidates( + TableMultipleCandidates { + first, + second, + } + ) => { + let signed_1 = SignedFullStatement::new( + Statement::Seconded(first.0), + f.id, + first.1, + &f.signing_context, + &f.key, + ).ok_or(())?; + + let signed_2 = SignedFullStatement::new( + Statement::Seconded(second.0), + f.id, + second.1, + &f.signing_context, + &f.key, + ).ok_or(())?; + + Ok(MisbehaviorReport::DoubleVote(signed_1, signed_2)) + } + _ => Err(()), + } + } } /// A unique identifier for a network protocol. diff --git a/node/subsystem/src/messages.rs b/node/subsystem/src/messages.rs index 73371e28fd..c98658e4ae 100644 --- a/node/subsystem/src/messages.rs +++ b/node/subsystem/src/messages.rs @@ -28,10 +28,11 @@ use polkadot_primitives::{BlockNumber, Hash, Signature}; use polkadot_primitives::parachain::{ AbridgedCandidateReceipt, PoVBlock, ErasureChunk, BackedCandidate, Id as ParaId, SignedAvailabilityBitfield, SigningContext, ValidatorId, ValidationCode, ValidatorIndex, - CandidateDescriptor, + CoreAssignment, CoreOccupied, HeadData, CandidateDescriptor, GlobalValidationSchedule, + LocalValidationData, }; use polkadot_node_primitives::{ - MisbehaviorReport, SignedFullStatement, View, ProtocolId, + MisbehaviorReport, SignedFullStatement, View, ProtocolId, ValidationResult, }; use std::sync::Arc; @@ -53,12 +54,12 @@ pub enum CandidateSelectionMessage { /// Messages received by the Candidate Backing subsystem. #[derive(Debug)] pub enum CandidateBackingMessage { - /// Registers a stream listener for updates to the set of backable candidates that could be backed - /// in a child of the given relay-parent, referenced by its hash. - RegisterBackingWatcher(Hash, mpsc::Sender), + /// Requests a set of backable candidates that could be backed in a child of the given + /// relay-parent, referenced by its hash. + GetBackedCandidates(Hash, oneshot::Sender>), /// Note that the Candidate Backing subsystem should second the given candidate in the context of the /// given relay-parent (ref. by hash). This candidate must be validated. - Second(Hash, AbridgedCandidateReceipt), + Second(Hash, AbridgedCandidateReceipt, PoVBlock), /// Note a validator's statement about a particular candidate. Disagreements about validity must be escalated /// to a broader check by Misbehavior Arbitration. Agreements are simply tallied until a quorum is reached. Statement(Hash, SignedFullStatement), @@ -78,8 +79,12 @@ pub enum CandidateValidationMessage { Validate( Hash, AbridgedCandidateReceipt, + HeadData, PoVBlock, - oneshot::Sender>, + oneshot::Sender>, ), } @@ -151,17 +156,34 @@ pub enum AvailabilityStoreMessage { StoreChunk(Hash, ValidatorIndex, ErasureChunk), } +/// The information on scheduler assignments that some somesystems may be querying. +#[derive(Debug, Clone)] +pub struct SchedulerRoster { + /// Validator-to-groups assignments. + pub validator_groups: Vec>, + /// All scheduled paras. + pub scheduled: Vec, + /// Upcoming paras (chains and threads). + pub upcoming: Vec, + /// Occupied cores. + pub availability_cores: Vec>, +} + /// A request to the Runtime API subsystem. #[derive(Debug)] pub enum RuntimeApiRequest { /// Get the current validator set. Validators(oneshot::Sender>), + /// Get the assignments of validators to cores. + ValidatorGroups(oneshot::Sender), /// Get a signing context for bitfields and statements. SigningContext(oneshot::Sender), /// Get the validation code for a specific para, assuming execution under given block number, and /// an optional block number representing an intermediate parablock executed in the context of /// that block. ValidationCode(ParaId, BlockNumber, Option, oneshot::Sender), + /// Get head data for a specific para. + HeadData(ParaId, oneshot::Sender), } /// A message to the Runtime API subsystem. diff --git a/primitives/src/parachain.rs b/primitives/src/parachain.rs index d0d3dce558..19937798c6 100644 --- a/primitives/src/parachain.rs +++ b/primitives/src/parachain.rs @@ -171,6 +171,100 @@ pub struct DutyRoster { pub validator_duty: Vec, } +/// The unique (during session) index of a core. +#[derive(Encode, Decode, Default, PartialOrd, Ord, Eq, PartialEq, Clone, Copy)] +#[cfg_attr(feature = "std", derive(Debug))] +pub struct CoreIndex(pub u32); + +impl From for CoreIndex { + fn from(i: u32) -> CoreIndex { + CoreIndex(i) + } +} + +/// The unique (during session) index of a validator group. +#[derive(Encode, Decode, Default, Clone, Copy)] +#[cfg_attr(feature = "std", derive(Eq, Hash, PartialEq, Debug))] +pub struct GroupIndex(pub u32); + +impl From for GroupIndex { + fn from(i: u32) -> GroupIndex { + GroupIndex(i) + } +} + +/// A claim on authoring the next block for a given parathread. +#[derive(Clone, Encode, Decode, Default)] +#[cfg_attr(feature = "std", derive(PartialEq, Debug))] +pub struct ParathreadClaim(pub Id, pub CollatorId); + +/// An entry tracking a claim to ensure it does not pass the maximum number of retries. +#[derive(Clone, Encode, Decode, Default)] +#[cfg_attr(feature = "std", derive(PartialEq, Debug))] +pub struct ParathreadEntry { + /// The claim. + pub claim: ParathreadClaim, + /// Number of retries. + pub retries: u32, +} + +/// What is occupying a specific availability core. +#[derive(Clone, Encode, Decode)] +#[cfg_attr(feature = "std", derive(PartialEq, Debug))] +pub enum CoreOccupied { + /// A parathread. + Parathread(ParathreadEntry), + /// A parachain. + Parachain, +} + +/// The assignment type. +#[derive(Clone, Encode, Decode)] +#[cfg_attr(feature = "std", derive(PartialEq, Debug))] +pub enum AssignmentKind { + /// A parachain. + Parachain, + /// A parathread. + Parathread(CollatorId, u32), +} + +/// How a free core is scheduled to be assigned. +#[derive(Clone, Encode, Decode)] +#[cfg_attr(feature = "std", derive(PartialEq, Debug))] +pub struct CoreAssignment { + /// The core that is assigned. + pub core: CoreIndex, + /// The unique ID of the para that is assigned to the core. + pub para_id: Id, + /// The kind of the assignment. + pub kind: AssignmentKind, + /// The index of the validator group assigned to the core. + pub group_idx: GroupIndex, +} + +impl CoreAssignment { + /// Get the ID of a collator who is required to collate this block. + pub fn required_collator(&self) -> Option<&CollatorId> { + match self.kind { + AssignmentKind::Parachain => None, + AssignmentKind::Parathread(ref id, _) => Some(id), + } + } + + /// Get the `CoreOccupied` from this. + pub fn to_core_occupied(&self) -> CoreOccupied { + match self.kind { + AssignmentKind::Parachain => CoreOccupied::Parachain, + AssignmentKind::Parathread(ref collator, retries) => CoreOccupied::Parathread( + ParathreadEntry { + claim: ParathreadClaim(self.para_id, collator.clone()), + retries, + } + ), + } + } +} + /// Extra data that is needed along with the other fields in a `CandidateReceipt` /// to fully validate the candidate. /// @@ -382,6 +476,15 @@ pub struct AbridgedCandidateReceipt { pub commitments: CandidateCommitments, } +/// A candidate-receipt with commitments directly included. +pub struct CommitedCandidateReceipt { + /// The descriptor of the candidae. + pub descriptor: CandidateDescriptor, + + /// The commitments of the candidate receipt. + pub commitments: CandidateCommitments +} + impl + Encode> AbridgedCandidateReceipt { /// Check integrity vs. provided block data. pub fn check_signature(&self) -> Result<(), ()> { @@ -473,7 +576,6 @@ impl AbridgedCandidateReceipt { } } - impl PartialOrd for AbridgedCandidateReceipt { fn partial_cmp(&self, other: &Self) -> Option { Some(self.cmp(other)) @@ -923,6 +1025,27 @@ impl, RealPayload: Encode> Signed( + payload: Payload, + validator_index: ValidatorIndex, + signature: ValidatorSignature, + context: &SigningContext, + key: &ValidatorId, + ) -> Option { + let s = Self { + payload, + validator_index, + signature, + real_payload: std::marker::PhantomData, + }; + + s.check_signature(context, key).ok()?; + + Some(s) + } + /// Sign this payload with the given context and key, storing the validator index. #[cfg(feature = "std")] pub fn sign( diff --git a/roadmap/implementers-guide/src/node/backing/candidate-backing.md b/roadmap/implementers-guide/src/node/backing/candidate-backing.md index 1490bb074c..2044fbd8e7 100644 --- a/roadmap/implementers-guide/src/node/backing/candidate-backing.md +++ b/roadmap/implementers-guide/src/node/backing/candidate-backing.md @@ -2,30 +2,43 @@ The Candidate Backing subsystem ensures every parablock considered for relay block inclusion has been seconded by at least one validator, and approved by a quorum. Parablocks for which no validator will assert correctness are discarded. If the block later proves invalid, the initial backers are slashable; this gives polkadot a rational threat model during subsequent stages. -Its role is to produce backable candidates for inclusion in new relay-chain blocks. It does so by issuing signed [`Statement`s](../../types/backing.md#statement-type) and tracking received statements signed by other validators. Once enough statements are received, they can be combined into backing for specific candidates. +Its role is to produce backable candidates for inclusion in new relay-chain blocks. It does so by issuing signed [`Statement`s][Statement] and tracking received statements signed by other validators. Once enough statements are received, they can be combined into backing for specific candidates. Note that though the candidate backing subsystem attempts to produce as many backable candidates as possible, it does _not_ attempt to choose a single authoritative one. The choice of which actually gets included is ultimately up to the block author, by whatever metrics it may use; those are opaque to this subsystem. -Once a sufficient quorum has agreed that a candidate is valid, this subsystem notifies the [Provisioner](../utility/provisioner.md), which in turn engages block production mechanisms to include the parablock. +Once a sufficient quorum has agreed that a candidate is valid, this subsystem notifies the [Provisioner][PV], which in turn engages block production mechanisms to include the parablock. ## Protocol -The [Candidate Selection subsystem](candidate-selection.md) is the primary source of non-overseer messages into this subsystem. That subsystem generates appropriate [`CandidateBackingMessage`s](../../types/overseer-protocol.md#candidate-backing-message), and passes them to this subsystem. +Input: [`CandidateBackingMessage`][CBM] -This subsystem validates the candidates and generates an appropriate [`SignedStatement`](../../types/backing.md#signed-statement-type). All `SignedStatement`s are then passed on to the [Statement Distribution subsystem](statement-distribution.md) to be gossiped to peers. All [Proofs of Validity](../../types/availability.md#proof-of-validity) should be distributed via the [PoV Distribution](pov-distribution.md) subsystem. When this subsystem decides that a candidate is invalid, and it was recommended to us to second by our own Candidate Selection subsystem, a message is sent to the Candidate Selection subsystem with the candidate's hash so that the collator which recommended it can be penalized. +Output: + +- [`CandidateValidationMessage`][CVM] +- [`RuntimeApiMessage`][RAM] +- [`CandidateSelectionMessage`][CSM] +- [`ProvisionerMessage`][PM] +- [`PoVDistributionMessage`][PDM] +- [`StatementDistributionMessage`][SDM] ## Functionality +The [Candidate Selection][CS] subsystem is the primary source of non-overseer messages into this subsystem. That subsystem generates appropriate [`CandidateBackingMessage`s][CBM] and passes them to this subsystem. + +This subsystem requests validation from the [Candidate Validation][CV] and generates an appropriate [`Statement`][Statement]. All `Statement`s are then passed on to the [Statement Distribution][SD] subsystem to be gossiped to peers. When [Candidate Validation][CV] decides that a candidate is invalid, and it was recommended to us to second by our own [Candidate Selection][CS] subsystem, a message is sent to the [Candidate Selection][CS] subsystem with the candidate's hash so that the collator which recommended it can be penalized. + The subsystem should maintain a set of handles to Candidate Backing Jobs that are currently live, as well as the relay-parent to which they correspond. ### On Overseer Signal -* If the signal is an [`OverseerSignal`](../../types/overseer-protocol.md#overseer-signal)`::StartWork(relay_parent)`, spawn a Candidate Backing Job with the given relay parent, storing a bidirectional channel with the Candidate Backing Job in the set of handles. -* If the signal is an [`OverseerSignal`](../../types/overseer-protocol.md#overseer-signal)`::StopWork(relay_parent)`, cease the Candidate Backing Job under that relay parent, if any. +* If the signal is an [`OverseerSignal`][OverseerSignal]`::StartWork(relay_parent)`, spawn a Candidate Backing Job with the given relay parent, storing a bidirectional channel with the Candidate Backing Job in the set of handles. +* If the signal is an [`OverseerSignal`][OverseerSignal]`::StopWork(relay_parent)`, cease the Candidate Backing Job under that relay parent, if any. -### On `CandidateBackingMessage` +### On Receiving `CandidateBackingMessage` -* If the message corresponds to a particular relay-parent, forward the message to the Candidate Backing Job for that relay-parent, if any is live. +* If the message is a [`CandidateBackingMessage`][CBM]`::GetBackedCandidates`, get all backable candidates from the statement table and send them back. +* If the message is a [`CandidateBackingMessage`][CBM]`::Second`, sign and dispatch a `Seconded` statement only if we have not seconded any other candidate and have not signed a `Valid` statement for the requested candidate. Signing both a `Seconded` and `Valid` message is a double-voting misbehavior with a heavy penalty, and this could occur if another validator has seconded the same candidate and we've received their message before the internal seconding request. +* If the message is a [`CandidateBackingMessage`][CBM]`::Statement`, count the statement to the quorum. If the statement in the message is `Seconded` and it contains a candidate that belongs to our assignment, request the corresponding `PoV` from the `PoVDistribution` and launch validation. Issue our own `Valid` or `Invalid` statement as a result. > big TODO: "contextual execution" > @@ -39,36 +52,49 @@ The subsystem should maintain a set of handles to Candidate Backing Jobs that ar The Candidate Backing Job represents the work a node does for backing candidates with respect to a particular relay-parent. -The goal of a Candidate Backing Job is to produce as many backable candidates as possible. This is done via signed [`Statement`s](../../types/backing.md#statement-type) by validators. If a candidate receives a majority of supporting Statements from the Parachain Validators currently assigned, then that candidate is considered backable. +The goal of a Candidate Backing Job is to produce as many backable candidates as possible. This is done via signed [`Statement`s][STMT] by validators. If a candidate receives a majority of supporting Statements from the Parachain Validators currently assigned, then that candidate is considered backable. ### On Startup -* Fetch current validator set, validator -> parachain assignments from runtime API. +* Fetch current validator set, validator -> parachain assignments from [`Runtime API`][RA] subsystem using [`RuntimeApiRequest::Validators`][RAM] and [`RuntimeApiRequest::ValidatorGroups`][RAM] * Determine if the node controls a key in the current validator set. Call this the local key if so. -* If the local key exists, extract the parachain head and validation function for the parachain the local key is assigned to. +* If the local key exists, extract the parachain head and validation function from the [`Runtime API`][RA] for the parachain the local key is assigned to by issuing a [`RuntimeApiRequest::Validators`][RAM] +* Issue a [`RuntimeApiRequest::SigningContext`][RAM] message to get a context that will later be used upon signing. -### On Receiving New Signed Statement +### On Receiving New Candidate Backing Message ```rust -if let Statement::Seconded(candidate) = signed.statement { - if candidate is unknown and in local assignment { - spawn_validation_work(candidate, parachain head, validation function) +match msg { + CetBackedCandidates(hash, tx) => { + // Send back a set of backable candidates. + } + CandidateBackingMessage::Second(hash, candidate) => { + if candidate is unknown and in local assignment { + spawn_validation_work(candidate, parachain head, validation function) + } + } + CandidateBackingMessage::Statement(hash, statement) => { + // count to the votes on this candidate + if let Statement::Seconded(candidate) = statement { + if candidate.parachain_id == our_assignment { + spawn_validation_work(candidate, parachain head, validation function) + } + } } } - -// add `Seconded` statements and `Valid` statements to a quorum. If quorum reaches validator-group -// majority, send a `BlockAuthorshipProvisioning::BackableCandidate(relay_parent, Candidate, Backing)` message. ``` -### Spawning Validation Work +Add `Seconded` statements and `Valid` statements to a quorum. If quorum reaches validator-group majority, send a [`ProvisionerMessage`][PM]`::ProvisionableData(ProvisionableData::BackedCandidate(BackedCandidate))` message. +`Invalid` statements that conflict with already witnessed `Seconded` and `Valid` statements for the given candidate, statements that are double-votes, self-contradictions and so on, should result in issuing a [`ProvisionerMessage`][PM]`::MisbehaviorReport` message for each newly detected case of this kind. + +### Validating Candidates. ```rust fn spawn_validation_work(candidate, parachain head, validation function) { asynchronously { let pov = (fetch pov block).await - // dispatched to sub-process (OS process) pool. - let valid = validate_candidate(candidate, validation function, parachain head, pov).await; + let valid = (validate pov block).await; if valid { // make PoV available for later distribution. Send data to the availability store to keep. // sign and dispatch `valid` statement to network if we have not seconded the given candidate. @@ -82,11 +108,30 @@ fn spawn_validation_work(candidate, parachain head, validation function) { ### Fetch Pov Block Create a `(sender, receiver)` pair. -Dispatch a `PovFetchSubsystemMessage(relay_parent, candidate_hash, sender)` and listen on the receiver for a response. +Dispatch a [`PoVDistributionMessage`][PDM]`::FecthPoV(relay_parent, candidate_hash, sender)` and listen on the receiver for a response. -### On Receiving `CandidateBackingMessage` - -* If the message is a `CandidateBackingMessage::RegisterBackingWatcher`, register the watcher and trigger it each time a new candidate is backable. Also trigger it once initially if there are any backable candidates at the time of receipt. -* If the message is a `CandidateBackingMessage::Second`, sign and dispatch a `Seconded` statement only if we have not seconded any other candidate and have not signed a `Valid` statement for the requested candidate. Signing both a `Seconded` and `Valid` message is a double-voting misbehavior with a heavy penalty, and this could occur if another validator has seconded the same candidate and we've received their message before the internal seconding request. +### Validate PoV Block -> TODO: send statements to Statement Distribution subsystem, handle shutdown signal from candidate backing subsystem +Create a `(sender, receiver)` pair. +Dispatch a `CandidateValidationMessage::Validate(validation function, candidate, pov, sender)` and listen on the receiver for a response. + +### Distribute Signed Statemnet + +Dispatch a [`StatementDistributionMessage`][PDM]`::Share(relay_parent, SignedFullStatement)`. + +[OverseerSignal]: ../../types/overseer-protocol.md#overseer-signal +[Statement]: ../../types/backing.md#statement-type +[STMT]: ../../types/backing.md#statement-type +[CSM]: ../../types/overseer-protocol.md#candidate-selection-message +[RAM]: ../../types/overseer-protocol.md#runtime-api-message +[CVM]: ../../types/overseer-protocol.md#validation-request-type +[PM]: ../../types/overseer-protocol.md#provisioner-message +[CBM]: ../../types/overseer-protocol.md#candidate-backing-message +[PDM]: ../../types/overseer-protocol.md#pov-distribution-message +[SDM]: ../../types/overseer-protocol.md#statement-distribution-message + +[CS]: candidate-selection.md +[CV]: ../utility/candidate-validation.md +[SD]: statement-distribution.md +[RA]: ../utility/runtime-api.md +[PV]: ../utility/provisioner.md diff --git a/roadmap/implementers-guide/src/types/overseer-protocol.md b/roadmap/implementers-guide/src/types/overseer-protocol.md index 799d1e2a7f..1e59eedff8 100644 --- a/roadmap/implementers-guide/src/types/overseer-protocol.md +++ b/roadmap/implementers-guide/src/types/overseer-protocol.md @@ -86,9 +86,9 @@ enum BitfieldSigningMessage { } ```rust enum CandidateBackingMessage { - /// Registers a stream listener for updates to the set of backable candidates that could be backed - /// in a child of the given relay-parent, referenced by its hash. - RegisterBackingWatcher(Hash, TODO), + /// Requests a set of backable candidates that could be backed in a child of the given + /// relay-parent, referenced by its hash. + GetBackedCandidates(Hash, ResponseChannel>), /// Note that the Candidate Backing subsystem should second the given candidate in the context of the /// given relay-parent (ref. by hash). This candidate must be validated using the provided PoV. Second(Hash, CandidateReceipt, PoV), @@ -230,9 +230,24 @@ The Runtime API subsystem is responsible for providing an interface to the state Other subsystems query this data by sending these messages. ```rust +/// The information on validator groups, core assignments, +/// upcoming paras and availability cores. +struct SchedulerRoster { + /// Validator-to-groups assignments. + validator_groups: Vec>, + /// All scheduled paras. + scheduled: Vec, + /// Upcoming paras (chains and threads). + upcoming: Vec, + /// Occupied cores. + availability_cores: Vec>, +} + enum RuntimeApiRequest { /// Get the current validator set. Validators(ResponseChannel>), + /// Get the assignments of validators to cores, upcoming parachains. + SchedulerRoster(ResponseChannel), /// Get a signing context for bitfields and statements. SigningContext(ResponseChannel), /// Get the validation code for a specific para, assuming execution under given block number, and @@ -270,10 +285,26 @@ enum StatementDistributionMessage { Various modules request that the [Candidate Validation subsystem](../node/utility/candidate-validation.md) validate a block with this message ```rust + +/// Result of the validation of the candidate. +enum ValidationResult { + /// Candidate is valid. + Valid, + /// Candidate is invalid. + Invalid, +} + enum CandidateValidationMessage { /// Validate a candidate with provided parameters. Returns `Err` if an only if an internal - /// error is encountered. A bad candidate will return `Ok(false)`, while a good one will - /// return `Ok(true)`. - Validate(ValidationCode, CandidateReceipt, PoV, ResponseChannel>), + /// error is encountered. + /// In case no internal error was encontered it returns a tuple containing the result of + /// validation and `GlobalValidationSchedule` and `LocalValidationData` structures that + /// may be used by the caller to make the candidate available. + /// A bad candidate will return `Ok((ValidationResult::Invalid, _, _)`, while a good one will + /// return `Ok((ValidationResult::Valid, _, _))`. + Validate( + Hash, CandidateReceipt, HeadData, PoV, ResponseChannel< + Result<(ValidationResult, GlobalValidationSchedule, LocalValidationData)> + >), } ``` diff --git a/runtime/parachains/src/inclusion.rs b/runtime/parachains/src/inclusion.rs index 5819e3a06c..33a5e2d1e9 100644 --- a/runtime/parachains/src/inclusion.rs +++ b/runtime/parachains/src/inclusion.rs @@ -25,7 +25,7 @@ use primitives::{ parachain::{ ValidatorId, AbridgedCandidateReceipt, ValidatorIndex, Id as ParaId, AvailabilityBitfield as AvailabilityBitfield, SignedAvailabilityBitfields, SigningContext, - BackedCandidate, + BackedCandidate, CoreIndex, GroupIndex, CoreAssignment, }, }; use frame_support::{ @@ -38,7 +38,7 @@ use bitvec::{order::Lsb0 as BitOrderLsb0, vec::BitVec}; use sp_staking::SessionIndex; use sp_runtime::{DispatchError, traits::{One, Saturating}}; -use crate::{configuration, paras, scheduler::{CoreIndex, GroupIndex, CoreAssignment}}; +use crate::{configuration, paras}; /// A bitfield signed by a validator indicating that it is keeping its piece of the erasure-coding /// for any backed candidates referred to by a `1` bit available. @@ -498,7 +498,7 @@ mod tests { use primitives::{BlockNumber, Hash}; use primitives::parachain::{ SignedAvailabilityBitfield, CompactStatement as Statement, ValidityAttestation, CollatorId, - CandidateCommitments, SignedStatement, + CandidateCommitments, SignedStatement, AssignmentKind, }; use frame_support::traits::{OnFinalize, OnInitialize}; use keyring::Sr25519Keyring; @@ -510,7 +510,6 @@ mod tests { use crate::initializer::SessionChangeNotification; use crate::configuration::HostConfiguration; use crate::paras::ParaGenesisArgs; - use crate::scheduler::AssignmentKind; fn default_config() -> HostConfiguration { let mut config = HostConfiguration::default(); diff --git a/runtime/parachains/src/scheduler.rs b/runtime/parachains/src/scheduler.rs index 212c782d64..772ab25cf4 100644 --- a/runtime/parachains/src/scheduler.rs +++ b/runtime/parachains/src/scheduler.rs @@ -38,7 +38,10 @@ use sp_std::prelude::*; use sp_std::convert::TryInto; use primitives::{ - parachain::{Id as ParaId, CollatorId, ValidatorIndex}, + parachain::{ + Id as ParaId, ValidatorIndex, CoreAssignment, CoreOccupied, CoreIndex, AssignmentKind, + GroupIndex, ParathreadClaim, ParathreadEntry, + }, }; use frame_support::{ decl_storage, decl_module, decl_error, @@ -52,41 +55,6 @@ use rand_chacha::ChaCha20Rng; use crate::{configuration, paras, initializer::SessionChangeNotification}; -/// The unique (during session) index of a core. -#[derive(Encode, Decode, Default, PartialOrd, Ord, Eq, PartialEq, Clone, Copy)] -#[cfg_attr(test, derive(Debug))] -pub struct CoreIndex(u32); - -impl From for CoreIndex { - fn from(i: u32) -> CoreIndex { - CoreIndex(i) - } -} - -/// The unique (during session) index of a validator group. -#[derive(Encode, Decode, Default, Clone, Copy)] -#[cfg_attr(test, derive(PartialEq, Debug))] -pub struct GroupIndex(u32); - -impl From for GroupIndex { - fn from(i: u32) -> GroupIndex { - GroupIndex(i) - } -} - -/// A claim on authoring the next block for a given parathread. -#[derive(Clone, Encode, Decode, Default)] -#[cfg_attr(test, derive(PartialEq, Debug))] -pub struct ParathreadClaim(pub ParaId, pub CollatorId); - -/// An entry tracking a claim to ensure it does not pass the maximum number of retries. -#[derive(Clone, Encode, Decode, Default)] -#[cfg_attr(test, derive(PartialEq, Debug))] -pub struct ParathreadEntry { - claim: ParathreadClaim, - retries: u32, -} - /// A queued parathread entry, pre-assigned to a core. #[derive(Encode, Decode, Default)] #[cfg_attr(test, derive(PartialEq, Debug))] @@ -125,58 +93,6 @@ impl ParathreadClaimQueue { } } -/// What is occupying a specific availability core. -#[derive(Clone, Encode, Decode)] -#[cfg_attr(test, derive(PartialEq, Debug))] -pub(crate) enum CoreOccupied { - Parathread(ParathreadEntry), - Parachain, -} - -/// The assignment type. -#[derive(Clone, Encode, Decode)] -#[cfg_attr(test, derive(PartialEq, Debug))] -pub enum AssignmentKind { - Parachain, - Parathread(CollatorId, u32), -} - -/// How a free core is scheduled to be assigned. -#[derive(Clone, Encode, Decode)] -#[cfg_attr(test, derive(PartialEq, Debug))] -pub struct CoreAssignment { - /// The core that is assigned. - pub core: CoreIndex, - /// The unique ID of the para that is assigned to the core. - pub para_id: ParaId, - /// The kind of the assignment. - pub kind: AssignmentKind, - /// The index of the validator group assigned to the core. - pub group_idx: GroupIndex, -} - -impl CoreAssignment { - /// Get the ID of a collator who is required to collate this block. - pub(crate) fn required_collator(&self) -> Option<&CollatorId> { - match self.kind { - AssignmentKind::Parachain => None, - AssignmentKind::Parathread(ref id, _) => Some(id), - } - } - - fn to_core_occupied(&self) -> CoreOccupied { - match self.kind { - AssignmentKind::Parachain => CoreOccupied::Parachain, - AssignmentKind::Parathread(ref collator, retries) => CoreOccupied::Parathread( - ParathreadEntry { - claim: ParathreadClaim(self.para_id, collator.clone()), - retries, - } - ), - } - } -} - /// Reasons a core might be freed pub enum FreedReason { /// The core's work concluded and the parablock assigned to it is considered available. @@ -670,7 +586,7 @@ impl Module { mod tests { use super::*; - use primitives::{BlockNumber, parachain::ValidatorId}; + use primitives::{BlockNumber, parachain::{CollatorId, ValidatorId}}; use frame_support::traits::{OnFinalize, OnInitialize}; use keyring::Sr25519Keyring; diff --git a/statement-table/src/generic.rs b/statement-table/src/generic.rs index 83cae9daf2..11c6a3c024 100644 --- a/statement-table/src/generic.rs +++ b/statement-table/src/generic.rs @@ -28,6 +28,8 @@ use std::collections::hash_map::{HashMap, Entry}; use std::hash::Hash; use std::fmt::Debug; +use primitives::parachain::{ValidityAttestation as PrimitiveValidityAttestation, ValidatorSignature}; + use codec::{Encode, Decode}; /// Context for the statement table. @@ -98,7 +100,7 @@ pub enum ValidityDoubleVote { /// Implicit vote by issuing and explicitly voting invalidity IssuedAndInvalidity((C, S), (D, S)), /// Direct votes for validity and invalidity - ValidityAndInvalidity(D, S, S), + ValidityAndInvalidity(C, S, S), } /// Misbehavior: multiple signatures on same statement. @@ -180,6 +182,15 @@ pub enum ValidityAttestation { Explicit(S), } +impl Into for ValidityAttestation { + fn into(self) -> PrimitiveValidityAttestation { + match self { + Self::Implicit(s) => PrimitiveValidityAttestation::Implicit(s), + Self::Explicit(s) => PrimitiveValidityAttestation::Explicit(s), + } + } +} + /// An attested-to candidate. #[derive(Clone, PartialEq, Decode, Encode)] pub struct AttestedCandidate { @@ -550,7 +561,7 @@ impl Table { // 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)), + make_vdv(ValidityDoubleVote::ValidityAndInvalidity(votes.candidate.clone(), good, bad)), // two signatures on same candidate (ValidityVote::Issued(a), ValidityVote::Issued(b)) => @@ -817,7 +828,7 @@ mod tests { assert_eq!( table.detected_misbehavior.get(&AuthorityId(2)).unwrap(), &Misbehavior::ValidityDoubleVote(ValidityDoubleVote::ValidityAndInvalidity( - candidate_digest, + Candidate(2, 100), Signature(2), Signature(2), )) -- GitLab From 8845df228f6db595a76885e2ee25e58a598c9233 Mon Sep 17 00:00:00 2001 From: Andronik Ordian Date: Thu, 9 Jul 2020 22:25:40 +0200 Subject: [PATCH 056/192] Integrate all (dummy) subsystems with the Overseer (#1374) * overseer: introduce a utility typemap * it's ugly but it compiles * move DummySubsystem to subsystem crate * fix tests fallout * use a struct for all subsystems * more tests fallout * add missing pov_distribution subsystem * remove unused imports and bounds * fix minimal-example --- node/overseer/examples/minimal-example.rs | 25 +- node/overseer/src/lib.rs | 423 ++++++++++++++++++---- node/service/src/lib.rs | 53 +-- node/subsystem/src/lib.rs | 18 + node/subsystem/src/messages.rs | 12 +- 5 files changed, 425 insertions(+), 106 deletions(-) diff --git a/node/overseer/examples/minimal-example.rs b/node/overseer/examples/minimal-example.rs index aefb627f7f..21e8eb3ab8 100644 --- a/node/overseer/examples/minimal-example.rs +++ b/node/overseer/examples/minimal-example.rs @@ -28,11 +28,14 @@ use futures_timer::Delay; use kv_log_macro as log; use polkadot_primitives::parachain::{BlockData, PoVBlock}; -use polkadot_overseer::Overseer; +use polkadot_overseer::{Overseer, AllSubsystems}; -use polkadot_subsystem::{Subsystem, SubsystemContext, SpawnedSubsystem, FromOverseer}; +use polkadot_subsystem::{ + Subsystem, SubsystemContext, DummySubsystem, + SpawnedSubsystem, FromOverseer, +}; use polkadot_subsystem::messages::{ - AllMessages, CandidateBackingMessage, CandidateValidationMessage + CandidateValidationMessage, CandidateBackingMessage, AllMessages, }; struct Subsystem1; @@ -128,10 +131,22 @@ fn main() { Delay::new(Duration::from_secs(1)).await; }); + let all_subsystems = AllSubsystems { + candidate_validation: Subsystem2, + candidate_backing: Subsystem1, + candidate_selection: DummySubsystem, + statement_distribution: DummySubsystem, + availability_distribution: DummySubsystem, + bitfield_distribution: DummySubsystem, + provisioner: DummySubsystem, + pov_distribution: DummySubsystem, + runtime_api: DummySubsystem, + availability_store: DummySubsystem, + network_bridge: DummySubsystem, + }; let (overseer, _handler) = Overseer::new( vec![], - Subsystem2, - Subsystem1, + all_subsystems, spawner, ).unwrap(); let overseer_fut = overseer.run().fuse(); diff --git a/node/overseer/src/lib.rs b/node/overseer/src/lib.rs index ffebf33ce4..458aae91e8 100644 --- a/node/overseer/src/lib.rs +++ b/node/overseer/src/lib.rs @@ -76,7 +76,11 @@ use polkadot_primitives::{Block, BlockNumber, Hash}; use client::{BlockImportNotification, BlockchainEvents, FinalityNotification}; use polkadot_subsystem::messages::{ - CandidateValidationMessage, CandidateBackingMessage, AllMessages + CandidateValidationMessage, CandidateBackingMessage, + CandidateSelectionMessage, StatementDistributionMessage, + AvailabilityDistributionMessage, BitfieldDistributionMessage, + ProvisionerMessage, PoVDistributionMessage, RuntimeApiMessage, + AvailabilityStoreMessage, NetworkBridgeMessage, AllMessages, }; pub use polkadot_subsystem::{ Subsystem, SubsystemContext, OverseerSignal, FromOverseer, SubsystemError, SubsystemResult, @@ -319,12 +323,40 @@ struct OverseenSubsystem { /// The `Overseer` itself. pub struct Overseer { - /// A validation subsystem - validation_subsystem: OverseenSubsystem, + /// A candidate validation subsystem. + candidate_validation_subsystem: OverseenSubsystem, - /// A candidate backing subsystem + /// A candidate backing subsystem. candidate_backing_subsystem: OverseenSubsystem, + /// A candidate selection subsystem. + candidate_selection_subsystem: OverseenSubsystem, + + /// A statement distribution subsystem. + statement_distribution_subsystem: OverseenSubsystem, + + /// An availability distribution subsystem. + availability_distribution_subsystem: OverseenSubsystem, + + /// A bitfield distribution subsystem. + bitfield_distribution_subsystem: OverseenSubsystem, + + /// A provisioner subsystem. + provisioner_subsystem: OverseenSubsystem, + + /// A PoV distribution subsystem. + pov_distribution_subsystem: OverseenSubsystem, + + /// A runtime API subsystem. + runtime_api_subsystem: OverseenSubsystem, + + /// An availability store subsystem. + availability_store_subsystem: OverseenSubsystem, + + /// A network bridge subsystem. + network_bridge_subsystem: OverseenSubsystem, + + /// Spawner to spawn tasks to. s: S, @@ -346,22 +378,48 @@ pub struct Overseer { active_leaves: HashSet<(Hash, BlockNumber)>, } +/// This struct is passed as an argument to create a new instance of an [`Overseer`]. +/// +/// As any entity that satisfies the interface may act as a [`Subsystem`] this allows +/// mocking in the test code: +/// +/// Each [`Subsystem`] is supposed to implement some interface that is generic over +/// message type that is specific to this [`Subsystem`]. At the moment not all +/// subsystems are implemented and the rest can be mocked with the [`DummySubsystem`]. +/// +/// [`Subsystem`]: trait.Subsystem.html +/// [`DummySubsystem`]: struct.DummySubsystem.html +pub struct AllSubsystems { + /// A candidate validation subsystem. + pub candidate_validation: CV, + /// A candidate backing subsystem. + pub candidate_backing: CB, + /// A candidate selection subsystem. + pub candidate_selection: CS, + /// A statement distribution subsystem. + pub statement_distribution: SD, + /// An availability distribution subsystem. + pub availability_distribution: AD, + /// A bitfield distribution subsystem. + pub bitfield_distribution: BD, + /// A provisioner subsystem. + pub provisioner: P, + /// A PoV distribution subsystem. + pub pov_distribution: PoVD, + /// A runtime API subsystem. + pub runtime_api: RA, + /// An availability store subsystem. + pub availability_store: AS, + /// A network bridge subsystem. + pub network_bridge: NB, +} + impl Overseer where S: Spawn, { /// Create a new intance of the `Overseer` with a fixed set of [`Subsystem`]s. /// - /// Each [`Subsystem`] is passed to this function as an explicit parameter - /// and is supposed to implement some interface that is generic over message type - /// that is specific to this [`Subsystem`]. At the moment there are only two - /// subsystems: - /// * Validation - /// * CandidateBacking - /// - /// As any entity that satisfies the interface may act as a [`Subsystem`] this allows - /// mocking in the test code: - /// /// ```text /// +------------------------------------+ /// | Overseer | @@ -388,16 +446,16 @@ where /// # Example /// /// The [`Subsystems`] may be any type as long as they implement an expected interface. - /// Here, we create two mock subsystems and start the `Overseer` with them. For the sake - /// of simplicity the termination of the example is done with a timeout. + /// Here, we create a mock validation subsystem and a few dummy ones and start the `Overseer` with them. + /// For the sake of simplicity the termination of the example is done with a timeout. /// ``` /// # use std::time::Duration; /// # use futures::{executor, pin_mut, select, FutureExt}; /// # use futures_timer::Delay; - /// # use polkadot_overseer::Overseer; + /// # use polkadot_overseer::{Overseer, AllSubsystems}; /// # use polkadot_subsystem::{ - /// # Subsystem, SpawnedSubsystem, SubsystemContext, - /// # messages::{CandidateValidationMessage, CandidateBackingMessage}, + /// # Subsystem, DummySubsystem, SpawnedSubsystem, SubsystemContext, + /// # messages::CandidateValidationMessage, /// # }; /// /// struct ValidationSubsystem; @@ -417,28 +475,24 @@ where /// } /// } /// - /// struct CandidateBackingSubsystem; - /// impl Subsystem for CandidateBackingSubsystem - /// where C: SubsystemContext - /// { - /// fn start( - /// self, - /// mut ctx: C, - /// ) -> SpawnedSubsystem { - /// SpawnedSubsystem(Box::pin(async move { - /// loop { - /// Delay::new(Duration::from_secs(1)).await; - /// } - /// })) - /// } - /// } - /// /// # fn main() { executor::block_on(async move { /// let spawner = executor::ThreadPool::new().unwrap(); + /// let all_subsystems = AllSubsystems { + /// candidate_validation: ValidationSubsystem, + /// candidate_backing: DummySubsystem, + /// candidate_selection: DummySubsystem, + /// statement_distribution: DummySubsystem, + /// availability_distribution: DummySubsystem, + /// bitfield_distribution: DummySubsystem, + /// provisioner: DummySubsystem, + /// pov_distribution: DummySubsystem, + /// runtime_api: DummySubsystem, + /// availability_store: DummySubsystem, + /// network_bridge: DummySubsystem, + /// }; /// let (overseer, _handler) = Overseer::new( /// vec![], - /// ValidationSubsystem, - /// CandidateBackingSubsystem, + /// all_subsystems, /// spawner, /// ).unwrap(); /// @@ -455,12 +509,24 @@ where /// # /// # }); } /// ``` - pub fn new( + pub fn new( leaves: impl IntoIterator, - validation: impl Subsystem> + Send, - candidate_backing: impl Subsystem> + Send, + all_subsystems: AllSubsystems, mut s: S, - ) -> SubsystemResult<(Self, OverseerHandler)> { + ) -> SubsystemResult<(Self, OverseerHandler)> + where + CV: Subsystem> + Send, + CB: Subsystem> + Send, + CS: Subsystem> + Send, + SD: Subsystem> + Send, + AD: Subsystem> + Send, + BD: Subsystem> + Send, + P: Subsystem> + Send, + PoVD: Subsystem> + Send, + RA: Subsystem> + Send, + AS: Subsystem> + Send, + NB: Subsystem> + Send, + { let (events_tx, events_rx) = mpsc::channel(CHANNEL_CAPACITY); let handler = OverseerHandler { @@ -470,18 +536,81 @@ where let mut running_subsystems_rx = StreamUnordered::new(); let mut running_subsystems = FuturesUnordered::new(); - let validation_subsystem = spawn( + let candidate_validation_subsystem = spawn( &mut s, &mut running_subsystems, &mut running_subsystems_rx, - validation, + all_subsystems.candidate_validation, )?; let candidate_backing_subsystem = spawn( &mut s, &mut running_subsystems, &mut running_subsystems_rx, - candidate_backing, + all_subsystems.candidate_backing, + )?; + + let candidate_selection_subsystem = spawn( + &mut s, + &mut running_subsystems, + &mut running_subsystems_rx, + all_subsystems.candidate_selection, + )?; + + let statement_distribution_subsystem = spawn( + &mut s, + &mut running_subsystems, + &mut running_subsystems_rx, + all_subsystems.statement_distribution, + )?; + + let availability_distribution_subsystem = spawn( + &mut s, + &mut running_subsystems, + &mut running_subsystems_rx, + all_subsystems.availability_distribution, + )?; + + let bitfield_distribution_subsystem = spawn( + &mut s, + &mut running_subsystems, + &mut running_subsystems_rx, + all_subsystems.bitfield_distribution, + )?; + + let provisioner_subsystem = spawn( + &mut s, + &mut running_subsystems, + &mut running_subsystems_rx, + all_subsystems.provisioner, + )?; + + let pov_distribution_subsystem = spawn( + &mut s, + &mut running_subsystems, + &mut running_subsystems_rx, + all_subsystems.pov_distribution, + )?; + + let runtime_api_subsystem = spawn( + &mut s, + &mut running_subsystems, + &mut running_subsystems_rx, + all_subsystems.runtime_api, + )?; + + let availability_store_subsystem = spawn( + &mut s, + &mut running_subsystems, + &mut running_subsystems_rx, + all_subsystems.availability_store, + )?; + + let network_bridge_subsystem = spawn( + &mut s, + &mut running_subsystems, + &mut running_subsystems_rx, + all_subsystems.network_bridge, )?; let active_leaves = HashSet::new(); @@ -492,8 +621,17 @@ where .collect(); let this = Self { - validation_subsystem, + candidate_validation_subsystem, candidate_backing_subsystem, + candidate_selection_subsystem, + statement_distribution_subsystem, + availability_distribution_subsystem, + bitfield_distribution_subsystem, + provisioner_subsystem, + pov_distribution_subsystem, + runtime_api_subsystem, + availability_store_subsystem, + network_bridge_subsystem, s, running_subsystems, running_subsystems_rx, @@ -507,7 +645,7 @@ where // Stop the overseer. async fn stop(mut self) { - if let Some(ref mut s) = self.validation_subsystem.instance { + if let Some(ref mut s) = self.candidate_validation_subsystem.instance { let _ = s.tx.send(FromOverseer::Signal(OverseerSignal::Conclude)).await; } @@ -515,6 +653,42 @@ where let _ = s.tx.send(FromOverseer::Signal(OverseerSignal::Conclude)).await; } + if let Some(ref mut s) = self.candidate_selection_subsystem.instance { + let _ = s.tx.send(FromOverseer::Signal(OverseerSignal::Conclude)).await; + } + + if let Some(ref mut s) = self.statement_distribution_subsystem.instance { + let _ = s.tx.send(FromOverseer::Signal(OverseerSignal::Conclude)).await; + } + + if let Some(ref mut s) = self.availability_distribution_subsystem.instance { + let _ = s.tx.send(FromOverseer::Signal(OverseerSignal::Conclude)).await; + } + + if let Some(ref mut s) = self.bitfield_distribution_subsystem.instance { + let _ = s.tx.send(FromOverseer::Signal(OverseerSignal::Conclude)).await; + } + + if let Some(ref mut s) = self.provisioner_subsystem.instance { + let _ = s.tx.send(FromOverseer::Signal(OverseerSignal::Conclude)).await; + } + + if let Some(ref mut s) = self.pov_distribution_subsystem.instance { + let _ = s.tx.send(FromOverseer::Signal(OverseerSignal::Conclude)).await; + } + + if let Some(ref mut s) = self.runtime_api_subsystem.instance { + let _ = s.tx.send(FromOverseer::Signal(OverseerSignal::Conclude)).await; + } + + if let Some(ref mut s) = self.availability_distribution_subsystem.instance { + let _ = s.tx.send(FromOverseer::Signal(OverseerSignal::Conclude)).await; + } + + if let Some(ref mut s) = self.network_bridge_subsystem.instance { + let _ = s.tx.send(FromOverseer::Signal(OverseerSignal::Conclude)).await; + } + let mut stop_delay = Delay::new(Duration::from_secs(STOP_DELAY)).fuse(); loop { @@ -616,11 +790,47 @@ where } async fn broadcast_signal(&mut self, signal: OverseerSignal) -> SubsystemResult<()> { - if let Some(ref mut s) = self.validation_subsystem.instance { + if let Some(ref mut s) = self.candidate_validation_subsystem.instance { s.tx.send(FromOverseer::Signal(signal.clone())).await?; } if let Some(ref mut s) = self.candidate_backing_subsystem.instance { + s.tx.send(FromOverseer::Signal(signal.clone())).await?; + } + + if let Some(ref mut s) = self.candidate_selection_subsystem.instance { + s.tx.send(FromOverseer::Signal(signal.clone())).await?; + } + + if let Some(ref mut s) = self.statement_distribution_subsystem.instance { + s.tx.send(FromOverseer::Signal(signal.clone())).await?; + } + + if let Some(ref mut s) = self.availability_distribution_subsystem.instance { + s.tx.send(FromOverseer::Signal(signal.clone())).await?; + } + + if let Some(ref mut s) = self.bitfield_distribution_subsystem.instance { + s.tx.send(FromOverseer::Signal(signal.clone())).await?; + } + + if let Some(ref mut s) = self.provisioner_subsystem.instance { + s.tx.send(FromOverseer::Signal(signal.clone())).await?; + } + + if let Some(ref mut s) = self.pov_distribution_subsystem.instance { + s.tx.send(FromOverseer::Signal(signal.clone())).await?; + } + + if let Some(ref mut s) = self.runtime_api_subsystem.instance { + s.tx.send(FromOverseer::Signal(signal.clone())).await?; + } + + if let Some(ref mut s) = self.availability_store_subsystem.instance { + s.tx.send(FromOverseer::Signal(signal.clone())).await?; + } + + if let Some(ref mut s) = self.network_bridge_subsystem.instance { s.tx.send(FromOverseer::Signal(signal)).await?; } @@ -630,7 +840,7 @@ where async fn route_message(&mut self, msg: AllMessages) { match msg { AllMessages::CandidateValidation(msg) => { - if let Some(ref mut s) = self.validation_subsystem.instance { + if let Some(ref mut s) = self.candidate_validation_subsystem.instance { let _= s.tx.send(FromOverseer::Communication { msg }).await; } } @@ -639,11 +849,50 @@ where let _ = s.tx.send(FromOverseer::Communication { msg }).await; } } - _ => { - // TODO: temporary catch-all until all subsystems are integrated with overseer. - // The overseer is not complete until this is an exhaustive match with all - // messages targeting an included subsystem. - // https://github.com/paritytech/polkadot/issues/1317 + AllMessages::CandidateSelection(msg) => { + if let Some(ref mut s) = self.candidate_selection_subsystem.instance { + let _ = s.tx.send(FromOverseer::Communication { msg }).await; + } + } + AllMessages::StatementDistribution(msg) => { + if let Some(ref mut s) = self.statement_distribution_subsystem.instance { + let _ = s.tx.send(FromOverseer::Communication { msg }).await; + } + } + AllMessages::AvailabilityDistribution(msg) => { + if let Some(ref mut s) = self.availability_distribution_subsystem.instance { + let _ = s.tx.send(FromOverseer::Communication { msg }).await; + } + } + AllMessages::BitfieldDistribution(msg) => { + if let Some(ref mut s) = self.bitfield_distribution_subsystem.instance { + let _ = s.tx.send(FromOverseer::Communication { msg }).await; + } + } + AllMessages::Provisioner(msg) => { + if let Some(ref mut s) = self.provisioner_subsystem.instance { + let _ = s.tx.send(FromOverseer::Communication { msg }).await; + } + } + AllMessages::PoVDistribution(msg) => { + if let Some(ref mut s) = self.pov_distribution_subsystem.instance { + let _ = s.tx.send(FromOverseer::Communication { msg }).await; + } + } + AllMessages::RuntimeApi(msg) => { + if let Some(ref mut s) = self.runtime_api_subsystem.instance { + let _ = s.tx.send(FromOverseer::Communication { msg }).await; + } + } + AllMessages::AvailabilityStore(msg) => { + if let Some(ref mut s) = self.availability_store_subsystem.instance { + let _ = s.tx.send(FromOverseer::Communication { msg }).await; + } + } + AllMessages::NetworkBridge(msg) => { + if let Some(ref mut s) = self.network_bridge_subsystem.instance { + let _ = s.tx.send(FromOverseer::Communication { msg }).await; + } } } } @@ -678,13 +927,16 @@ fn spawn( }) } + #[cfg(test)] mod tests { use futures::{executor, pin_mut, select, channel::mpsc, FutureExt}; use polkadot_primitives::parachain::{BlockData, PoVBlock}; + use polkadot_subsystem::DummySubsystem; use super::*; + struct TestSubsystem1(mpsc::Sender); impl Subsystem for TestSubsystem1 @@ -776,10 +1028,22 @@ mod tests { let (s1_tx, mut s1_rx) = mpsc::channel(64); let (s2_tx, mut s2_rx) = mpsc::channel(64); + let all_subsystems = AllSubsystems { + candidate_validation: TestSubsystem1(s1_tx), + candidate_backing: TestSubsystem2(s2_tx), + candidate_selection: DummySubsystem, + statement_distribution: DummySubsystem, + availability_distribution: DummySubsystem, + bitfield_distribution: DummySubsystem, + provisioner: DummySubsystem, + pov_distribution: DummySubsystem, + runtime_api: DummySubsystem, + availability_store: DummySubsystem, + network_bridge: DummySubsystem, + }; let (overseer, mut handler) = Overseer::new( vec![], - TestSubsystem1(s1_tx), - TestSubsystem2(s2_tx), + all_subsystems, spawner, ).unwrap(); let overseer_fut = overseer.run().fuse(); @@ -826,10 +1090,22 @@ mod tests { executor::block_on(async move { let (s1_tx, _) = mpsc::channel(64); + let all_subsystems = AllSubsystems { + candidate_validation: TestSubsystem1(s1_tx), + candidate_backing: TestSubsystem4, + candidate_selection: DummySubsystem, + statement_distribution: DummySubsystem, + availability_distribution: DummySubsystem, + bitfield_distribution: DummySubsystem, + provisioner: DummySubsystem, + pov_distribution: DummySubsystem, + runtime_api: DummySubsystem, + availability_store: DummySubsystem, + network_bridge: DummySubsystem, + }; let (overseer, _handle) = Overseer::new( vec![], - TestSubsystem1(s1_tx), - TestSubsystem4, + all_subsystems, spawner, ).unwrap(); let overseer_fut = overseer.run().fuse(); @@ -923,11 +1199,22 @@ mod tests { let (tx_5, mut rx_5) = mpsc::channel(64); let (tx_6, mut rx_6) = mpsc::channel(64); - + let all_subsystems = AllSubsystems { + candidate_validation: TestSubsystem5(tx_5), + candidate_backing: TestSubsystem6(tx_6), + candidate_selection: DummySubsystem, + statement_distribution: DummySubsystem, + availability_distribution: DummySubsystem, + bitfield_distribution: DummySubsystem, + provisioner: DummySubsystem, + pov_distribution: DummySubsystem, + runtime_api: DummySubsystem, + availability_store: DummySubsystem, + network_bridge: DummySubsystem, + }; let (overseer, mut handler) = Overseer::new( vec![first_block], - TestSubsystem5(tx_5), - TestSubsystem6(tx_6), + all_subsystems, spawner, ).unwrap(); @@ -1008,11 +1295,23 @@ mod tests { let (tx_5, mut rx_5) = mpsc::channel(64); let (tx_6, mut rx_6) = mpsc::channel(64); + let all_subsystems = AllSubsystems { + candidate_validation: TestSubsystem5(tx_5), + candidate_backing: TestSubsystem6(tx_6), + candidate_selection: DummySubsystem, + statement_distribution: DummySubsystem, + availability_distribution: DummySubsystem, + bitfield_distribution: DummySubsystem, + provisioner: DummySubsystem, + pov_distribution: DummySubsystem, + runtime_api: DummySubsystem, + availability_store: DummySubsystem, + network_bridge: DummySubsystem, + }; // start with two forks of different height. let (overseer, mut handler) = Overseer::new( vec![first_block, second_block], - TestSubsystem5(tx_5), - TestSubsystem6(tx_6), + all_subsystems, spawner, ).unwrap(); diff --git a/node/service/src/lib.rs b/node/service/src/lib.rs index 772481672a..8a435e6b59 100644 --- a/node/service/src/lib.rs +++ b/node/service/src/lib.rs @@ -29,11 +29,8 @@ use grandpa::{self, FinalityProofProvider as GrandpaFinalityProofProvider}; use sc_executor::native_executor_instance; use log::info; use sp_blockchain::HeaderBackend; -use polkadot_overseer::{self as overseer, BlockInfo, Overseer, OverseerHandler}; -use polkadot_subsystem::{ - Subsystem, SubsystemContext, SpawnedSubsystem, - messages::{CandidateValidationMessage, CandidateBackingMessage}, -}; +use polkadot_overseer::{self as overseer, AllSubsystems, BlockInfo, Overseer, OverseerHandler}; +use polkadot_subsystem::DummySubsystem; use polkadot_node_core_proposer::ProposerFactory; use sp_trie::PrefixedMemoryDB; pub use service::{ @@ -275,38 +272,28 @@ macro_rules! new_full_start { }} } -struct CandidateValidationSubsystem; - -impl Subsystem for CandidateValidationSubsystem - where C: SubsystemContext -{ - fn start(self, mut ctx: C) -> SpawnedSubsystem { - SpawnedSubsystem(Box::pin(async move { - while let Ok(_) = ctx.recv().await {} - })) - } -} - -struct CandidateBackingSubsystem; - -impl Subsystem for CandidateBackingSubsystem - where C: SubsystemContext -{ - fn start(self, mut ctx: C) -> SpawnedSubsystem { - SpawnedSubsystem(Box::pin(async move { - while let Ok(_) = ctx.recv().await {} - })) - } -} - fn real_overseer( leaves: impl IntoIterator, s: S, ) -> Result<(Overseer, OverseerHandler), ServiceError> { - let validation = CandidateValidationSubsystem; - let candidate_backing = CandidateBackingSubsystem; - Overseer::new(leaves, validation, candidate_backing, s) - .map_err(|e| ServiceError::Other(format!("Failed to create an Overseer: {:?}", e))) + let all_subsystems = AllSubsystems { + candidate_validation: DummySubsystem, + candidate_backing: DummySubsystem, + candidate_selection: DummySubsystem, + statement_distribution: DummySubsystem, + availability_distribution: DummySubsystem, + bitfield_distribution: DummySubsystem, + provisioner: DummySubsystem, + pov_distribution: DummySubsystem, + runtime_api: DummySubsystem, + availability_store: DummySubsystem, + network_bridge: DummySubsystem, + }; + Overseer::new( + leaves, + all_subsystems, + s, + ).map_err(|e| ServiceError::Other(format!("Failed to create an Overseer: {:?}", e))) } /// Builds a new service for a full client. diff --git a/node/subsystem/src/lib.rs b/node/subsystem/src/lib.rs index fd32d7cfdb..db9a0629cf 100644 --- a/node/subsystem/src/lib.rs +++ b/node/subsystem/src/lib.rs @@ -148,3 +148,21 @@ pub trait Subsystem { /// Start this `Subsystem` and return `SpawnedSubsystem`. fn start(self, ctx: C) -> SpawnedSubsystem; } + +/// A dummy subsystem that implements [`Subsystem`] for all +/// types of messages. Used for tests or as a placeholder. +pub struct DummySubsystem; + +impl Subsystem for DummySubsystem { + fn start(self, mut ctx: C) -> SpawnedSubsystem { + SpawnedSubsystem(Box::pin(async move { + loop { + match ctx.recv().await { + Ok(FromOverseer::Signal(OverseerSignal::Conclude)) => return, + Err(_) => return, + _ => continue, + } + } + })) + } +} diff --git a/node/subsystem/src/messages.rs b/node/subsystem/src/messages.rs index c98658e4ae..36c293e49f 100644 --- a/node/subsystem/src/messages.rs +++ b/node/subsystem/src/messages.rs @@ -246,12 +246,12 @@ pub enum PoVDistributionMessage { /// /// This `CandidateDescriptor` should correspond to a candidate seconded under the provided /// relay-parent hash. - FetchPoV(Hash, CandidateDescriptor, oneshot::Sender>), - /// Distribute a PoV for the given relay-parent and CandidateDescriptor. - /// The PoV should correctly hash to the PoV hash mentioned in the CandidateDescriptor - DistributePoV(Hash, CandidateDescriptor, Arc), - /// An update from the network bridge. - NetworkBridgeUpdate(NetworkBridgeEvent), + FetchPoV(Hash, CandidateDescriptor, oneshot::Sender>), + /// Distribute a PoV for the given relay-parent and CandidateDescriptor. + /// The PoV should correctly hash to the PoV hash mentioned in the CandidateDescriptor + DistributePoV(Hash, CandidateDescriptor, Arc), + /// An update from the network bridge. + NetworkBridgeUpdate(NetworkBridgeEvent), } /// A message type tying together all message types that are used across Subsystems. -- GitLab From 96af6eadd5649e7faef75ddfe3cc181bd1567155 Mon Sep 17 00:00:00 2001 From: Robert Habermeier Date: Thu, 9 Jul 2020 21:23:03 -0400 Subject: [PATCH 057/192] Refactor primitives (#1383) * create a v1 primitives module * Improve guide on availability types * punctuate * new parachains runtime uses new primitives * tests of new runtime now use new primitives * add ErasureChunk to guide * export erasure chunk from v1 primitives * subsystem crate uses v1 primitives * node-primitives uses new v1 primitives * port overseer to new primitives * new-proposer uses v1 primitives (no ParachainHost anymore) * fix no-std compilation for primitives * service-new uses v1 primitives * network-bridge uses new primitives * statement distribution uses v1 primitives * PoV distribution uses v1 primitives; add PoV::hash fn * move parachain to v0 * remove inclusion_inherent module and place into v1 * remove everything from primitives crate root * remove some unused old types from v0 primitives * point everything else at primitives::v0 * squanch some warns up * add RuntimeDebug import to no-std as well * port over statement-table and validation * fix final errors in validation and node-primitives * add dummy Ord impl to committed candidate receipt * guide: update CandidateValidationMessage * add primitive for validationoutputs * expand CandidateValidationMessage further * bikeshed * add some impls to omitted-validation-data and available-data * expand CandidateValidationMessage * make erasure-coding generic over v1/v0 * update usages of erasure-coding * implement commitments.hash() * use Arc for CandidateValidation * improve new erasure-coding method names * fix up candidate backing * update docs a bit * fix most tests and add short-circuiting to make_pov_available * fix remainder of candidate backing tests * squanching warns * squanch it up * some fallout * overseer fallout * free from polkadot-test-service hell --- availability-store/src/lib.rs | 8 +- availability-store/src/store.rs | 13 +- availability-store/src/worker.rs | 4 +- collator/src/lib.rs | 21 +- core-primitives/src/lib.rs | 5 + erasure-coding/src/lib.rs | 63 +- network/src/legacy/collator_pool.rs | 5 +- network/src/legacy/gossip/attestation.rs | 2 +- network/src/legacy/gossip/mod.rs | 6 +- network/src/legacy/local_collations.rs | 4 +- network/src/legacy/mod.rs | 2 +- network/src/lib.rs | 2 +- network/src/protocol/mod.rs | 8 +- network/src/protocol/tests.rs | 6 +- node/core/backing/src/lib.rs | 600 ++++++++++-------- node/core/proposer/src/lib.rs | 12 +- node/network/bridge/src/lib.rs | 2 +- node/network/pov-distribution/src/lib.rs | 5 +- .../network/statement-distribution/src/lib.rs | 37 +- node/overseer/examples/minimal-example.rs | 12 +- node/overseer/src/lib.rs | 12 +- node/primitives/src/lib.rs | 52 +- node/service/src/chain_spec.rs | 6 +- node/service/src/grandpa_support.rs | 4 +- node/service/src/lib.rs | 15 +- node/subsystem/src/lib.rs | 2 +- node/subsystem/src/messages.rs | 64 +- node/test-service/src/chain_spec.rs | 2 +- node/test-service/src/lib.rs | 9 +- .../adder/collator/src/main.rs | 4 +- primitives/src/inclusion_inherent.rs | 23 - primitives/src/lib.rs | 57 +- primitives/src/{parachain.rs => v0.rs} | 244 ++----- primitives/src/v1.rs | 478 ++++++++++++++ .../src/types/availability.md | 49 +- .../implementers-guide/src/types/candidate.md | 22 + .../src/types/overseer-protocol.md | 41 +- rpc/src/lib.rs | 2 +- runtime/common/src/attestations.rs | 2 +- runtime/common/src/claims.rs | 2 +- runtime/common/src/crowdfund.rs | 4 +- runtime/common/src/impls.rs | 4 +- runtime/common/src/lib.rs | 2 +- runtime/common/src/parachains.rs | 34 +- runtime/common/src/registrar.rs | 16 +- runtime/common/src/slots.rs | 5 +- runtime/kusama/src/constants.rs | 6 +- runtime/kusama/src/lib.rs | 13 +- runtime/parachains/src/configuration.rs | 4 +- runtime/parachains/src/inclusion.rs | 211 +++--- runtime/parachains/src/inclusion_inherent.rs | 7 +- runtime/parachains/src/initializer.rs | 4 +- runtime/parachains/src/mock.rs | 5 +- runtime/parachains/src/paras.rs | 6 +- runtime/parachains/src/scheduler.rs | 10 +- runtime/polkadot/src/constants.rs | 6 +- runtime/polkadot/src/lib.rs | 13 +- runtime/polkadot/tests/weights.rs | 2 +- runtime/test-runtime/client/src/lib.rs | 2 +- runtime/test-runtime/src/constants.rs | 6 +- runtime/test-runtime/src/lib.rs | 11 +- runtime/westend/src/constants.rs | 6 +- runtime/westend/src/lib.rs | 13 +- service/src/chain_spec.rs | 6 +- service/src/grandpa_support.rs | 4 +- service/src/lib.rs | 5 +- statement-table/src/generic.rs | 2 +- statement-table/src/lib.rs | 144 +++-- validation/src/block_production.rs | 4 +- validation/src/collation.rs | 6 +- validation/src/error.rs | 4 +- validation/src/lib.rs | 2 +- validation/src/pipeline.rs | 6 +- validation/src/shared_table/includable.rs | 2 +- validation/src/shared_table/mod.rs | 57 +- validation/src/validation_service/mod.rs | 8 +- 76 files changed, 1545 insertions(+), 1002 deletions(-) delete mode 100644 primitives/src/inclusion_inherent.rs rename primitives/src/{parachain.rs => v0.rs} (83%) create mode 100644 primitives/src/v1.rs diff --git a/availability-store/src/lib.rs b/availability-store/src/lib.rs index 7abc444758..4b973c7d02 100644 --- a/availability-store/src/lib.rs +++ b/availability-store/src/lib.rs @@ -25,12 +25,10 @@ use futures::prelude::*; use futures::channel::{mpsc, oneshot}; use keystore::KeyStorePtr; -use polkadot_primitives::{ +use polkadot_primitives::v0::{ Hash, Block, - parachain::{ - PoVBlock, AbridgedCandidateReceipt, ErasureChunk, - ParachainHost, AvailableData, OmittedValidationData, - }, + PoVBlock, AbridgedCandidateReceipt, ErasureChunk, + ParachainHost, AvailableData, OmittedValidationData, }; use sp_runtime::traits::HashFor; use sp_blockchain::Result as ClientResult; diff --git a/availability-store/src/store.rs b/availability-store/src/store.rs index 851beabc6a..cd76de5d44 100644 --- a/availability-store/src/store.rs +++ b/availability-store/src/store.rs @@ -19,11 +19,8 @@ use kvdb_rocksdb::{Database, DatabaseConfig}; use kvdb::{KeyValueDB, DBTransaction}; use codec::{Encode, Decode}; use polkadot_erasure_coding as erasure; -use polkadot_primitives::{ - Hash, - parachain::{ - ErasureChunk, AvailableData, AbridgedCandidateReceipt, - }, +use polkadot_primitives::v0::{ + Hash, ErasureChunk, AvailableData, AbridgedCandidateReceipt, }; use parking_lot::Mutex; @@ -273,7 +270,7 @@ impl Store { // If there are no block data in the store at this point, // check that they can be reconstructed now and add them to store if they can. if self.execution_data(&candidate_hash).is_none() { - if let Ok(available_data) = erasure::reconstruct( + if let Ok(available_data) = erasure::reconstruct_v0( n_validators as usize, v.iter().map(|chunk| (chunk.chunk.as_ref(), chunk.index as usize)), ) @@ -390,7 +387,7 @@ impl Store { mod tests { use super::*; use polkadot_erasure_coding::{self as erasure}; - use polkadot_primitives::parachain::{ + use polkadot_primitives::v0::{ Id as ParaId, BlockData, AvailableData, PoVBlock, OmittedValidationData, }; @@ -489,7 +486,7 @@ mod tests { let available_data = available_data(&[42; 8]); let n_validators = 5; - let erasure_chunks = erasure::obtain_chunks( + let erasure_chunks = erasure::obtain_chunks_v0( n_validators, &available_data, ).unwrap(); diff --git a/availability-store/src/worker.rs b/availability-store/src/worker.rs index 8a3898579f..a7cf7ec41d 100644 --- a/availability-store/src/worker.rs +++ b/availability-store/src/worker.rs @@ -33,8 +33,8 @@ use consensus_common::{ import_queue::CacheKeyId, }; use sp_core::traits::SpawnNamed; -use polkadot_primitives::{Block, BlockId, Hash}; -use polkadot_primitives::parachain::{ +use polkadot_primitives::v0::{ + Block, BlockId, Hash, ParachainHost, ValidatorId, AbridgedCandidateReceipt, AvailableData, ValidatorPair, ErasureChunk, }; diff --git a/collator/src/lib.rs b/collator/src/lib.rs index 0215b33ee6..663cb825bf 100644 --- a/collator/src/lib.rs +++ b/collator/src/lib.rs @@ -55,12 +55,11 @@ use log::warn; use sc_client_api::{StateBackend, BlockchainEvents}; use sp_blockchain::HeaderBackend; use sp_core::Pair; -use polkadot_primitives::{ +use polkadot_primitives::v0::{ BlockId, Hash, Block, DownwardMessage, - parachain::{ - self, BlockData, DutyRoster, HeadData, Id as ParaId, - PoVBlock, ValidatorId, CollatorPair, LocalValidationData, GlobalValidationSchedule, - } + BlockData, DutyRoster, HeadData, Id as ParaId, + PoVBlock, ValidatorId, CollatorPair, LocalValidationData, GlobalValidationSchedule, + Collation, CollationInfo, collator_signature_payload, }; use polkadot_cli::{ ProvideRuntimeApi, ParachainHost, IdentifyVariant, @@ -69,7 +68,7 @@ use polkadot_cli::{ pub use polkadot_cli::service::Configuration; pub use polkadot_cli::Cli; pub use polkadot_validation::SignedStatement; -pub use polkadot_primitives::parachain::CollatorId; +pub use polkadot_primitives::v0::CollatorId; pub use sc_network::PeerId; pub use service::RuntimeApiCollection; pub use sc_cli::SubstrateCli; @@ -164,7 +163,7 @@ pub async fn collate

( downward_messages: Vec, mut para_context: P, key: Arc, -) -> Option +) -> Option where P: ParachainContext, P::ProduceCandidate: Send, @@ -181,13 +180,13 @@ pub async fn collate

( }; let pov_block_hash = pov_block.hash(); - let signature = key.sign(¶chain::collator_signature_payload( + let signature = key.sign(&collator_signature_payload( &relay_parent, &local_id, &pov_block_hash, )); - let info = parachain::CollationInfo { + let info = CollationInfo { parachain_index: local_id, relay_parent, collator: key.public(), @@ -196,7 +195,7 @@ pub async fn collate

( pov_block_hash, }; - let collation = parachain::Collation { + let collation = Collation { info, pov: pov_block, }; @@ -456,7 +455,7 @@ where #[cfg(not(feature = "service-rewr"))] fn compute_targets(para_id: ParaId, session_keys: &[ValidatorId], roster: DutyRoster) -> HashSet { - use polkadot_primitives::parachain::Chain; + use polkadot_primitives::v0::Chain; roster.validator_duty.iter().enumerate() .filter(|&(_, c)| c == &Chain::Parachain(para_id)) diff --git a/core-primitives/src/lib.rs b/core-primitives/src/lib.rs index d91ed3cfc1..ffb346467d 100644 --- a/core-primitives/src/lib.rs +++ b/core-primitives/src/lib.rs @@ -94,3 +94,8 @@ pub enum DownwardMessage { /// XCMP message for the Parachain. XCMPMessage(sp_std::vec::Vec), } + +/// V1 primitives. +pub mod v1 { + pub use super::*; +} diff --git a/erasure-coding/src/lib.rs b/erasure-coding/src/lib.rs index 98a2776d88..708a167d62 100644 --- a/erasure-coding/src/lib.rs +++ b/erasure-coding/src/lib.rs @@ -26,8 +26,8 @@ use codec::{Encode, Decode}; use reed_solomon::galois_16::{self, ReedSolomon}; -use primitives::{Hash as H256, BlakeTwo256, HashT}; -use primitives::parachain::AvailableData; +use primitives::v0::{self, Hash as H256, BlakeTwo256, HashT}; +use primitives::v1; use sp_core::Blake2Hasher; use trie::{EMPTY_PREFIX, MemoryDB, Trie, TrieMut, trie_types::{TrieDBMut, TrieDB}}; @@ -124,14 +124,32 @@ fn code_params(n_validators: usize) -> Result { }) } +/// Obtain erasure-coded chunks for v0 `AvailableData`, one for each validator. +/// +/// Works only up to 65536 validators, and `n_validators` must be non-zero. +pub fn obtain_chunks_v0(n_validators: usize, data: &v0::AvailableData) + -> Result>, Error> +{ + obtain_chunks(n_validators, data) +} + +/// Obtain erasure-coded chunks for v1 `AvailableData`, one for each validator. +/// +/// Works only up to 65536 validators, and `n_validators` must be non-zero. +pub fn obtain_chunks_v1(n_validators: usize, data: &v1::AvailableData) + -> Result>, Error> +{ + obtain_chunks(n_validators, data) +} + /// Obtain erasure-coded chunks, one for each validator. /// /// Works only up to 65536 validators, and `n_validators` must be non-zero. -pub fn obtain_chunks(n_validators: usize, available_data: &AvailableData) +fn obtain_chunks(n_validators: usize, data: &T) -> Result>, Error> { let params = code_params(n_validators)?; - let encoded = available_data.encode(); + let encoded = data.encode(); if encoded.is_empty() { return Err(Error::BadPayload); @@ -145,15 +163,42 @@ pub fn obtain_chunks(n_validators: usize, available_data: &AvailableData) Ok(shards.into_iter().map(|w| w.into_inner()).collect()) } -/// Reconstruct the block data from a set of chunks. +/// Reconstruct the v0 available data from a set of chunks. +/// +/// Provide an iterator containing chunk data and the corresponding index. +/// The indices of the present chunks must be indicated. If too few chunks +/// are provided, recovery is not possible. +/// +/// Works only up to 65536 validators, and `n_validators` must be non-zero. +pub fn reconstruct_v0<'a, I: 'a>(n_validators: usize, chunks: I) + -> Result + where I: IntoIterator +{ + reconstruct(n_validators, chunks) +} + +/// Reconstruct the v1 available data from a set of chunks. +/// +/// Provide an iterator containing chunk data and the corresponding index. +/// The indices of the present chunks must be indicated. If too few chunks +/// are provided, recovery is not possible. +/// +/// Works only up to 65536 validators, and `n_validators` must be non-zero. +pub fn reconstruct_v1<'a, I: 'a>(n_validators: usize, chunks: I) + -> Result + where I: IntoIterator +{ + reconstruct(n_validators, chunks) +} + +/// Reconstruct decodable data from a set of chunks. /// /// Provide an iterator containing chunk data and the corresponding index. /// The indices of the present chunks must be indicated. If too few chunks /// are provided, recovery is not possible. /// /// Works only up to 65536 validators, and `n_validators` must be non-zero. -pub fn reconstruct<'a, I: 'a>(n_validators: usize, chunks: I) - -> Result +fn reconstruct<'a, I: 'a, T: Decode>(n_validators: usize, chunks: I) -> Result where I: IntoIterator { let params = code_params(n_validators)?; @@ -343,7 +388,7 @@ impl<'a, I: Iterator> codec::Input for ShardInput<'a, I> { #[cfg(test)] mod tests { use super::*; - use primitives::parachain::{BlockData, PoVBlock}; + use primitives::v0::{AvailableData, BlockData, PoVBlock}; #[test] fn field_order_is_right_size() { @@ -420,7 +465,7 @@ mod tests { assert_eq!(chunks.len(), 10); // any 4 chunks should work. - let reconstructed = reconstruct( + let reconstructed: AvailableData = reconstruct( 10, [ (&*chunks[1], 1), diff --git a/network/src/legacy/collator_pool.rs b/network/src/legacy/collator_pool.rs index a0c0a0458e..f2b168e0f5 100644 --- a/network/src/legacy/collator_pool.rs +++ b/network/src/legacy/collator_pool.rs @@ -17,8 +17,7 @@ //! Bridge between the network and consensus service for getting collations to it. use codec::{Encode, Decode}; -use polkadot_primitives::Hash; -use polkadot_primitives::parachain::{CollatorId, Id as ParaId, Collation}; +use polkadot_primitives::v0::{Hash, CollatorId, Id as ParaId, Collation}; use sc_network::PeerId; use futures::channel::oneshot; @@ -236,7 +235,7 @@ impl CollatorPool { mod tests { use super::*; use sp_core::crypto::UncheckedInto; - use polkadot_primitives::parachain::{CollationInfo, BlockData, PoVBlock}; + use polkadot_primitives::v0::{CollationInfo, BlockData, PoVBlock}; use futures::executor::block_on; fn make_pov(block_data: Vec) -> PoVBlock { diff --git a/network/src/legacy/gossip/attestation.rs b/network/src/legacy/gossip/attestation.rs index a47f75288b..2d20ce63b9 100644 --- a/network/src/legacy/gossip/attestation.rs +++ b/network/src/legacy/gossip/attestation.rs @@ -33,7 +33,7 @@ use sc_network_gossip::{ValidationResult as GossipValidationResult}; use sc_network::ReputationChange; use polkadot_validation::GenericStatement; -use polkadot_primitives::Hash; +use polkadot_primitives::v0::Hash; use std::collections::HashMap; diff --git a/network/src/legacy/gossip/mod.rs b/network/src/legacy/gossip/mod.rs index 7dea996566..9e18d7ce21 100644 --- a/network/src/legacy/gossip/mod.rs +++ b/network/src/legacy/gossip/mod.rs @@ -58,8 +58,8 @@ use sc_network_gossip::{ ValidatorContext, MessageIntent, }; use polkadot_validation::{SignedStatement}; -use polkadot_primitives::{Block, Hash}; -use polkadot_primitives::parachain::{ +use polkadot_primitives::v0::{ + Block, Hash, ParachainHost, ValidatorId, ErasureChunk as PrimitiveChunk, SigningContext, PoVBlock, }; use polkadot_erasure_coding::{self as erasure}; @@ -755,7 +755,7 @@ mod tests { use sc_network_gossip::Validator as ValidatorT; use std::sync::mpsc; use parking_lot::Mutex; - use polkadot_primitives::parachain::{AbridgedCandidateReceipt, BlockData}; + use polkadot_primitives::v0::{AbridgedCandidateReceipt, BlockData}; use sp_core::sr25519::Signature as Sr25519Signature; use polkadot_validation::GenericStatement; diff --git a/network/src/legacy/local_collations.rs b/network/src/legacy/local_collations.rs index 6bc9b985a7..d859115486 100644 --- a/network/src/legacy/local_collations.rs +++ b/network/src/legacy/local_collations.rs @@ -19,7 +19,7 @@ //! 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, parachain::{ValidatorId}}; +use polkadot_primitives::v0::{Hash, ValidatorId}; use crate::legacy::collator_pool::Role; use std::collections::{HashMap, HashSet}; use std::time::Duration; @@ -144,7 +144,7 @@ impl LocalCollations { mod tests { use super::*; use sp_core::crypto::UncheckedInto; - use polkadot_primitives::parachain::ValidatorId; + use polkadot_primitives::v0::ValidatorId; #[test] fn add_validator_with_ready_collation() { diff --git a/network/src/legacy/mod.rs b/network/src/legacy/mod.rs index 28ea77a6bd..42698657c0 100644 --- a/network/src/legacy/mod.rs +++ b/network/src/legacy/mod.rs @@ -25,7 +25,7 @@ pub mod gossip; use codec::Decode; use futures::prelude::*; -use polkadot_primitives::Hash; +use polkadot_primitives::v0::Hash; use sc_network::PeerId; use sc_network_gossip::TopicNotification; use log::debug; diff --git a/network/src/lib.rs b/network/src/lib.rs index 5048f09ada..eaed7b34d2 100644 --- a/network/src/lib.rs +++ b/network/src/lib.rs @@ -21,7 +21,7 @@ #![recursion_limit="256"] -use polkadot_primitives::{Block, Hash, BlakeTwo256, HashT}; +use polkadot_primitives::v0::{Block, Hash, BlakeTwo256, HashT}; pub mod legacy; pub mod protocol; diff --git a/network/src/protocol/mod.rs b/network/src/protocol/mod.rs index 9a94065e5b..22e72dcfd6 100644 --- a/network/src/protocol/mod.rs +++ b/network/src/protocol/mod.rs @@ -30,12 +30,10 @@ use futures::task::{Context, Poll}; use futures::stream::{FuturesUnordered, StreamFuture}; use log::{debug, trace}; -use polkadot_primitives::{ +use polkadot_primitives::v0::{ Hash, Block, - parachain::{ - PoVBlock, ValidatorId, ValidatorIndex, Collation, AbridgedCandidateReceipt, - ErasureChunk, ParachainHost, Id as ParaId, CollatorId, - }, + PoVBlock, ValidatorId, ValidatorIndex, Collation, AbridgedCandidateReceipt, + ErasureChunk, ParachainHost, Id as ParaId, CollatorId, }; use polkadot_validation::{ SharedTable, TableRouter, Network as ParachainNetwork, Validated, GenericStatement, Collators, diff --git a/network/src/protocol/tests.rs b/network/src/protocol/tests.rs index 049af3f5ac..711906797b 100644 --- a/network/src/protocol/tests.rs +++ b/network/src/protocol/tests.rs @@ -17,8 +17,8 @@ use super::*; use crate::legacy::gossip::GossipPoVBlock; use parking_lot::Mutex; -use polkadot_primitives::Block; -use polkadot_primitives::parachain::{ +use polkadot_primitives::v0::{ + Block, Id as ParaId, Chain, DutyRoster, ParachainHost, ValidatorId, Retriable, CollatorId, AbridgedCandidateReceipt, GlobalValidationSchedule, LocalValidationData, ErasureChunk, SigningContext, @@ -198,7 +198,7 @@ sp_api::mock_impl_runtime_apis! { parent_hash: Default::default(), } } - fn downward_messages(_: ParaId) -> Vec { + fn downward_messages(_: ParaId) -> Vec { Vec::new() } } diff --git a/node/core/backing/src/lib.rs b/node/core/backing/src/lib.rs index e4490d20d3..281147847e 100644 --- a/node/core/backing/src/lib.rs +++ b/node/core/backing/src/lib.rs @@ -21,6 +21,7 @@ use std::collections::{HashMap, HashSet}; use std::convert::TryFrom; use std::pin::Pin; +use std::sync::Arc; use std::time::Duration; use bitvec::vec::BitVec; @@ -36,17 +37,15 @@ use streamunordered::{StreamUnordered, StreamYield}; use primitives::Pair; use keystore::KeyStorePtr; -use polkadot_primitives::{ - Hash, - parachain::{ - AbridgedCandidateReceipt, BackedCandidate, Id as ParaId, ValidatorPair, ValidatorId, - ValidatorIndex, HeadData, SigningContext, PoVBlock, OmittedValidationData, - CandidateDescriptor, LocalValidationData, GlobalValidationSchedule, AvailableData, - ErasureChunk, - }, +use polkadot_primitives::v1::{ + CommittedCandidateReceipt, BackedCandidate, Id as ParaId, ValidatorPair, ValidatorId, + ValidatorIndex, SigningContext, PoV, OmittedValidationData, + CandidateDescriptor, AvailableData, ErasureChunk, ValidatorSignature, Hash, CandidateReceipt, + CandidateCommitments, }; use polkadot_node_primitives::{ FromTableMisbehavior, Statement, SignedFullStatement, MisbehaviorReport, ValidationResult, + ValidationOutputs, }; use polkadot_subsystem::{ FromOverseer, OverseerSignal, Subsystem, SubsystemContext, SpawnedSubsystem, @@ -59,8 +58,12 @@ use polkadot_subsystem::messages::{ }; use statement_table::{ generic::AttestedCandidate as TableAttestedCandidate, - Table, Context as TableContextTrait, Statement as TableStatement, - SignedStatement as TableSignedStatement, Summary as TableSummary, + Context as TableContextTrait, + Table, + v1::{ + Statement as TableStatement, + SignedStatement as TableSignedStatement, Summary as TableSummary, + }, }; #[derive(Debug, derive_more::From)] @@ -90,8 +93,6 @@ struct CandidateBackingJob { /// Outbound message channel sending part. tx_from: mpsc::Sender, - /// `HeadData`s of the parachains that this validator is assigned to. - head_data: HeadData, /// The `ParaId`s assigned to this validator. assignment: ParaId, /// We issued `Valid` or `Invalid` statements on about these candidates. @@ -118,8 +119,22 @@ struct TableContext { } impl TableContextTrait for TableContext { - fn is_member_of(&self, authority: ValidatorIndex, group: &ParaId) -> bool { - self.groups.get(group).map_or(false, |g| g.iter().position(|&a| a == authority).is_some()) + type AuthorityId = ValidatorIndex; + type Digest = Hash; + type GroupId = ParaId; + type Signature = ValidatorSignature; + type Candidate = CommittedCandidateReceipt; + + fn candidate_digest(candidate: &CommittedCandidateReceipt) -> Hash { + candidate.hash() + } + + fn candidate_group(candidate: &CommittedCandidateReceipt) -> ParaId { + candidate.descriptor().para_id + } + + fn is_member_of(&self, authority: &ValidatorIndex, group: &ParaId) -> bool { + self.groups.get(group).map_or(false, |g| g.iter().position(|a| a == authority).is_some()) } fn requisite_votes(&self, group: &ParaId) -> usize { @@ -221,7 +236,7 @@ impl CandidateBackingJob { async fn issue_candidate_invalid_message( &mut self, - candidate: AbridgedCandidateReceipt, + candidate: CandidateReceipt, ) -> Result<(), Error> { self.tx_from.send(FromJob::CandidateSelection( CandidateSelectionMessage::Invalid(self.parent, candidate) @@ -231,34 +246,69 @@ impl CandidateBackingJob { } /// Validate the candidate that is requested to be `Second`ed and distribute validation result. + /// + /// Returns `Ok(true)` if we issued a `Seconded` statement about this candidate. async fn validate_and_second( &mut self, - candidate: AbridgedCandidateReceipt, - pov: PoVBlock, - ) -> Result { - let valid = self.request_candidate_validation(candidate.clone(), pov.clone()).await?; - let statement = match valid.0 { - ValidationResult::Valid => { + candidate: &CandidateReceipt, + pov: PoV, + ) -> Result { + let valid = self.request_candidate_validation( + candidate.descriptor().clone(), + Arc::new(pov.clone()), + ).await?; + + let candidate_hash = candidate.hash(); + + let statement = match valid { + ValidationResult::Valid(outputs) => { // make PoV available for later distribution. Send data to the availability // store to keep. Sign and dispatch `valid` statement to network if we // have not seconded the given candidate. - self.make_pov_available(pov, valid.1, valid.2).await?; - self.issued_statements.insert(candidate.hash()); - Statement::Seconded(candidate) + // + // If the commitments hash produced by validation is not the same as given by + // the collator, do not make available and report the collator. + let commitments_check = self.make_pov_available( + pov, + outputs, + |commitments| if commitments.hash() == candidate.commitments_hash { + Ok(CommittedCandidateReceipt { + descriptor: candidate.descriptor().clone(), + commitments, + }) + } else { + Err(()) + }, + ).await?; + + match commitments_check { + Ok(candidate) => { + self.issued_statements.insert(candidate_hash); + Some(Statement::Seconded(candidate)) + } + Err(()) => { + self.issue_candidate_invalid_message(candidate.clone()).await?; + None + } + } } ValidationResult::Invalid => { - let candidate_hash = candidate.hash(); - self.issue_candidate_invalid_message(candidate).await?; - Statement::Invalid(candidate_hash) + // no need to issue a statement about this if we aren't seconding it. + // + // there's an infinite amount of garbage out there. no need to acknowledge + // all of it. + self.issue_candidate_invalid_message(candidate.clone()).await?; + None } }; - if let Some(signed_statement) = self.sign_statement(statement) { + let issued_statement = statement.is_some(); + if let Some(signed_statement) = statement.and_then(|s| self.sign_statement(s)) { self.import_statement(&signed_statement).await?; self.distribute_signed_statement(signed_statement).await?; } - Ok(valid.0) + Ok(issued_statement) } fn get_backed(&self) -> Vec { @@ -303,7 +353,7 @@ impl CandidateBackingJob { } /// Check if there have happened any new misbehaviors and issue necessary messages. - /// + /// /// TODO: Report multiple misbehaviors (https://github.com/paritytech/polkadot/issues/1387) async fn issue_new_misbehaviors(&mut self) -> Result<(), Error> { let mut reports = Vec::new(); @@ -354,7 +404,7 @@ impl CandidateBackingJob { match msg { CandidateBackingMessage::Second(_, candidate, pov) => { // Sanity check that candidate is from our assignment. - if candidate.parachain_index != self.assignment { + if candidate.descriptor().para_id != self.assignment { return Ok(()); } @@ -367,8 +417,8 @@ impl CandidateBackingJob { let candidate_hash = candidate.hash(); if !self.issued_statements.contains(&candidate_hash) { - if let Ok(ValidationResult::Valid) = self.validate_and_second( - candidate, + if let Ok(true) = self.validate_and_second( + &candidate, pov, ).await { self.seconded = Some(candidate_hash); @@ -397,17 +447,40 @@ impl CandidateBackingJob { async fn kick_off_validation_work( &mut self, summary: TableSummary, - ) -> Result { - let candidate = self.table.get_candidate(&summary.candidate).ok_or(Error::CandidateNotFound)?; - let candidate = candidate.clone(); - let descriptor = candidate.to_descriptor(); - let candidate_hash = candidate.hash(); - let pov = self.request_pov_from_distribution(descriptor).await?; - let v = self.request_candidate_validation(candidate, pov).await?; + ) -> Result<(), Error> { + let candidate_hash = summary.candidate.clone(); + + if self.issued_statements.contains(&candidate_hash) { + return Ok(()) + } + + // We clone the commitments here because there are borrowck + // errors relating to this being a struct and methods borrowing the entirety of self + // and not just those things that the function uses. + let candidate = self.table.get_candidate(&candidate_hash).ok_or(Error::CandidateNotFound)?; + let expected_commitments = candidate.commitments.clone(); + + let descriptor = candidate.descriptor().clone(); + let pov = self.request_pov_from_distribution(descriptor.clone()).await?; + let v = self.request_candidate_validation(descriptor, pov.clone()).await?; + + let statement = match v { + ValidationResult::Valid(outputs) => { + // If validation produces a new set of commitments, we vote the candidate as invalid. + let commitments_check = self.make_pov_available( + (&*pov).clone(), + outputs, + |commitments| if commitments == expected_commitments { + Ok(()) + } else { + Err(()) + } + ).await?; - let statement = match v.0 { - ValidationResult::Valid => { - Statement::Valid(candidate_hash) + match commitments_check { + Ok(()) => Statement::Valid(candidate_hash), + Err(()) => Statement::Invalid(candidate_hash), + } } ValidationResult::Invalid => { Statement::Invalid(candidate_hash) @@ -420,7 +493,7 @@ impl CandidateBackingJob { self.distribute_signed_statement(signed_statement).await?; } - Ok(v.0) + Ok(()) } /// Import the statement and kick off validation work if it is a part of our assignment. @@ -478,29 +551,26 @@ impl CandidateBackingJob { async fn request_pov_from_distribution( &mut self, descriptor: CandidateDescriptor, - ) -> Result { + ) -> Result, Error> { let (tx, rx) = oneshot::channel(); self.tx_from.send(FromJob::PoVDistribution( PoVDistributionMessage::FetchPoV(self.parent, descriptor, tx) )).await?; - let pov = rx.await?; - Ok((*pov).clone()) + Ok(rx.await?) } async fn request_candidate_validation( &mut self, - candidate: AbridgedCandidateReceipt, - pov: PoVBlock, - ) -> Result<(ValidationResult, GlobalValidationSchedule, LocalValidationData), Error> { + candidate: CandidateDescriptor, + pov: Arc, + ) -> Result { let (tx, rx) = oneshot::channel(); self.tx_from.send(FromJob::CandidateValidation( - CandidateValidationMessage::Validate( - self.parent, + CandidateValidationMessage::ValidateFromChainState( candidate, - self.head_data.clone(), pov, tx, ) @@ -523,32 +593,51 @@ impl CandidateBackingJob { Ok(()) } - async fn make_pov_available( + // Compute the erasure-coding and make it available. + // + // This calls an inspection function before making the PoV available for any last checks + // that need to be done. If the inspection function returns an error, this function returns + // early without making the PoV available. + async fn make_pov_available( &mut self, - pov_block: PoVBlock, - global_validation: GlobalValidationSchedule, - local_validation: LocalValidationData, - ) -> Result<(), Error> { + pov: PoV, + outputs: ValidationOutputs, + with_commitments: impl FnOnce(CandidateCommitments) -> Result, + ) -> Result, Error> { let omitted_validation = OmittedValidationData { - global_validation, - local_validation, + global_validation: outputs.global_validation_schedule, + local_validation: outputs.local_validation_data, }; let available_data = AvailableData { - pov_block, + pov, omitted_validation, }; - let chunks = erasure_coding::obtain_chunks( + let chunks = erasure_coding::obtain_chunks_v1( self.table_context.validators.len(), &available_data, )?; let branches = erasure_coding::branches(chunks.as_ref()); + let erasure_root = branches.root(); + + let commitments = CandidateCommitments { + fees: outputs.fees, + upward_messages: outputs.upward_messages, + erasure_root, + new_validation_code: outputs.new_validation_code, + head_data: outputs.head_data, + }; - for (index, (chunk, proof)) in chunks.iter().zip(branches.map(|(proof, _)| proof)).enumerate() { + let res = match with_commitments(commitments) { + Ok(x) => x, + Err(e) => return Ok(Err(e)), + }; + + for (index, (proof, chunk)) in branches.enumerate() { let chunk = ErasureChunk { - chunk: chunk.clone(), + chunk: chunk.to_vec(), index: index as u32, proof, }; @@ -556,7 +645,7 @@ impl CandidateBackingJob { self.store_chunk(index as ValidatorIndex, chunk).await?; } - Ok(()) + Ok(Ok(res)) } async fn distribute_signed_statement(&mut self, s: SignedFullStatement) -> Result<(), Error> { @@ -635,13 +724,7 @@ async fn run_job( } } - let ( - head_data, - signing_context, - ) = futures::try_join!( - request_head_data(parent, &mut tx_from, assignment).await?, - request_signing_context(parent, &mut tx_from).await?, - )?; + let signing_context = request_signing_context(parent, &mut tx_from).await?.await?; let table_context = TableContext { signing_context, @@ -654,7 +737,6 @@ async fn run_job( parent, rx_to, tx_from, - head_data, assignment, issued_statements: HashSet::new(), seconded: None, @@ -714,23 +796,6 @@ async fn request_signing_context( Ok(rx) } -/// Request `HeadData` for some `ParaId` from `RuntimeApi`. -async fn request_head_data( - parent: Hash, - s: &mut mpsc::Sender, - id: ParaId, -) -> Result, Error> { - let (tx, rx) = oneshot::channel(); - - s.send(FromJob::RuntimeApiMessage(RuntimeApiMessage::Request( - parent, - RuntimeApiRequest::HeadData(id, tx), - ) - )).await?; - - Ok(rx) -} - impl Jobs { fn new(spawner: S) -> Self { Self { @@ -910,8 +975,9 @@ mod tests { use std::collections::HashMap; use std::sync::Arc; use sp_keyring::Sr25519Keyring; - use polkadot_primitives::parachain::{ + use polkadot_primitives::v1::{ AssignmentKind, CollatorId, CoreAssignment, BlockData, CoreIndex, GroupIndex, ValidityAttestation, + CandidateCommitments, LocalValidationData, GlobalValidationSchedule, HeadData, }; use assert_matches::assert_matches; @@ -1006,6 +1072,7 @@ mod tests { parent_head: HeadData(vec![7, 8, 9]), balance: Default::default(), code_upgrade_allowed: None, + validation_code_hash: Default::default(), }; let global_validation_schedule = GlobalValidationSchedule { @@ -1050,6 +1117,48 @@ mod tests { executor::block_on(future::select(test_fut, subsystem)); } + fn make_erasure_root(test: &TestState, pov: PoV) -> Hash { + let omitted_validation = OmittedValidationData { + global_validation: test.global_validation_schedule.clone(), + local_validation: test.local_validation_data.clone(), + }; + + let available_data = AvailableData { + omitted_validation, + pov, + }; + + let chunks = erasure_coding::obtain_chunks_v1(test.validators.len(), &available_data).unwrap(); + erasure_coding::branches(&chunks).root() + } + + #[derive(Default)] + struct TestCandidateBuilder { + para_id: ParaId, + head_data: HeadData, + pov_hash: Hash, + relay_parent: Hash, + erasure_root: Hash, + } + + impl TestCandidateBuilder { + fn build(self) -> CommittedCandidateReceipt { + CommittedCandidateReceipt { + descriptor: CandidateDescriptor { + para_id: self.para_id, + pov_hash: self.pov_hash, + relay_parent: self.relay_parent, + ..Default::default() + }, + commitments: CandidateCommitments { + head_data: self.head_data, + erasure_root: self.erasure_root, + ..Default::default() + }, + } + } + } + // Tests that the subsystem performs actions that are requied on startup. async fn test_startup( virtual_overseer: &mut subsystem_test::TestSubsystemContextHandle, @@ -1080,16 +1189,6 @@ mod tests { } ); - // Check that subsystem job issues a request for the head data. - assert_matches!( - virtual_overseer.recv().await, - AllMessages::RuntimeApi( - RuntimeApiMessage::Request(parent, RuntimeApiRequest::HeadData(id, tx)) - ) if parent == test_state.relay_parent => { - tx.send(test_state.head_data.get(&id).unwrap().clone()).unwrap(); - } - ); - // Check that subsystem job issues a request for the signing context. assert_matches!( virtual_overseer.recv().await, @@ -1108,49 +1207,53 @@ mod tests { let test_state = TestState::default(); test_harness(test_state.keystore.clone(), |test_harness| async move { let TestHarness { mut virtual_overseer } = test_harness; - + test_startup(&mut virtual_overseer, &test_state).await; - - let pov_block = PoVBlock { + + let pov = PoV { block_data: BlockData(vec![42, 43, 44]), }; - let pov_block_hash = pov_block.hash(); - let candidate = AbridgedCandidateReceipt { - parachain_index: test_state.chain_ids[0], + let expected_head_data = test_state.head_data.get(&test_state.chain_ids[0]).unwrap(); + + let pov_hash = pov.hash(); + let candidate = TestCandidateBuilder { + para_id: test_state.chain_ids[0], relay_parent: test_state.relay_parent, - pov_block_hash, + pov_hash, + head_data: expected_head_data.clone(), + erasure_root: make_erasure_root(&test_state, pov.clone()), ..Default::default() - }; + }.build(); let second = CandidateBackingMessage::Second( test_state.relay_parent, - candidate.clone(), - pov_block.clone(), + candidate.to_plain(), + pov.clone(), ); virtual_overseer.send(FromOverseer::Communication{ msg: second }).await; - let expected_head_data = test_state.head_data.get(&test_state.chain_ids[0]).unwrap(); assert_matches!( virtual_overseer.recv().await, AllMessages::CandidateValidation( - CandidateValidationMessage::Validate( - parent_hash, + CandidateValidationMessage::ValidateFromChainState( c, - head_data, pov, tx, ) - ) if parent_hash == test_state.relay_parent && - pov == pov_block && c == candidate => { - assert_eq!(head_data, *expected_head_data); - tx.send(Ok(( - ValidationResult::Valid, - test_state.global_validation_schedule, - test_state.local_validation_data, - ))).unwrap(); + ) if pov == pov && &c == candidate.descriptor() => { + tx.send(Ok( + ValidationResult::Valid(ValidationOutputs { + global_validation_schedule: test_state.global_validation_schedule, + local_validation_data: test_state.local_validation_data, + head_data: expected_head_data.clone(), + upward_messages: Vec::new(), + fees: Default::default(), + new_validation_code: None, + }), + )).unwrap(); } ); @@ -1193,18 +1296,22 @@ mod tests { test_startup(&mut virtual_overseer, &test_state).await; - let pov_block = PoVBlock { + let pov = PoV { block_data: BlockData(vec![1, 2, 3]), }; - let pov_block_hash = pov_block.hash(); + let pov_hash = pov.hash(); + + let expected_head_data = test_state.head_data.get(&test_state.chain_ids[0]).unwrap(); - let candidate_a = AbridgedCandidateReceipt { - parachain_index: test_state.chain_ids[0], + let candidate_a = TestCandidateBuilder { + para_id: test_state.chain_ids[0], relay_parent: test_state.relay_parent, - pov_block_hash, + pov_hash, + head_data: expected_head_data.clone(), + erasure_root: make_erasure_root(&test_state, pov.clone()), ..Default::default() - }; + }.build(); let candidate_a_hash = candidate_a.hash(); @@ -1227,39 +1334,38 @@ mod tests { virtual_overseer.send(FromOverseer::Communication{ msg: statement }).await; // Sending a `Statement::Seconded` for our assignment will start - // validation process. The first thing requested is PoVBlock from the + // validation process. The first thing requested is PoV from the // `PoVDistribution`. assert_matches!( virtual_overseer.recv().await, AllMessages::PoVDistribution( PoVDistributionMessage::FetchPoV(relay_parent, _, tx) ) if relay_parent == test_state.relay_parent => { - tx.send(Arc::new(pov_block.clone())).unwrap(); + tx.send(Arc::new(pov.clone())).unwrap(); } ); - let expected_head_data = test_state.head_data.get(&test_state.chain_ids[0]).unwrap(); - // The next step is the actual request to Validation subsystem // to validate the `Seconded` candidate. assert_matches!( virtual_overseer.recv().await, AllMessages::CandidateValidation( - CandidateValidationMessage::Validate( - relay_parent, - candidate, - head_data, + CandidateValidationMessage::ValidateFromChainState( + c, pov, tx, ) - ) if relay_parent == test_state.relay_parent && candidate == candidate_a => { - assert_eq!(head_data, *expected_head_data); - assert_eq!(pov, pov_block); - tx.send(Ok(( - ValidationResult::Valid, - test_state.global_validation_schedule, - test_state.local_validation_data, - ))).unwrap(); + ) if pov == pov && &c == candidate_a.descriptor() => { + tx.send(Ok( + ValidationResult::Valid(ValidationOutputs { + global_validation_schedule: test_state.global_validation_schedule, + local_validation_data: test_state.local_validation_data, + head_data: expected_head_data.clone(), + upward_messages: Vec::new(), + fees: Default::default(), + new_validation_code: None, + }), + )).unwrap(); } ); @@ -1309,17 +1415,22 @@ mod tests { test_startup(&mut virtual_overseer, &test_state).await; - let pov_block = PoVBlock { + let pov = PoV { block_data: BlockData(vec![1, 2, 3]), }; - let pov_block_hash = pov_block.hash(); - let candidate_a = AbridgedCandidateReceipt { - parachain_index: test_state.chain_ids[0], + let pov_hash = pov.hash(); + + let expected_head_data = test_state.head_data.get(&test_state.chain_ids[0]).unwrap(); + + let candidate_a = TestCandidateBuilder { + para_id: test_state.chain_ids[0], relay_parent: test_state.relay_parent, - pov_block_hash, + pov_hash, + erasure_root: make_erasure_root(&test_state, pov.clone()), + head_data: expected_head_data.clone(), ..Default::default() - }; + }.build(); let candidate_a_hash = candidate_a.hash(); @@ -1353,33 +1464,41 @@ mod tests { AllMessages::PoVDistribution( PoVDistributionMessage::FetchPoV(relay_parent, _, tx) ) if relay_parent == test_state.relay_parent => { - tx.send(Arc::new(pov_block.clone())).unwrap(); + tx.send(Arc::new(pov.clone())).unwrap(); } ); - let expected_head_data = test_state.head_data.get(&test_state.chain_ids[0]).unwrap(); - assert_matches!( virtual_overseer.recv().await, AllMessages::CandidateValidation( - CandidateValidationMessage::Validate( - relay_parent, - candidate, - head_data, + CandidateValidationMessage::ValidateFromChainState( + c, pov, tx, ) - ) if relay_parent == test_state.relay_parent && candidate == candidate_a => { - assert_eq!(pov, pov_block); - assert_eq!(head_data, *expected_head_data); - tx.send(Ok(( - ValidationResult::Valid, - test_state.global_validation_schedule, - test_state.local_validation_data, - ))).unwrap(); + ) if pov == pov && &c == candidate_a.descriptor() => { + tx.send(Ok( + ValidationResult::Valid(ValidationOutputs { + global_validation_schedule: test_state.global_validation_schedule, + local_validation_data: test_state.local_validation_data, + head_data: expected_head_data.clone(), + upward_messages: Vec::new(), + fees: Default::default(), + new_validation_code: None, + }), + )).unwrap(); } ); + for _ in 0..test_state.validators.len() { + assert_matches!( + virtual_overseer.recv().await, + AllMessages::AvailabilityStore( + AvailabilityStoreMessage::StoreChunk(parent_hash, _, _) + ) if parent_hash == test_state.relay_parent + ); + } + assert_matches!( virtual_overseer.recv().await, AllMessages::StatementDistribution( @@ -1440,86 +1559,68 @@ mod tests { test_startup(&mut virtual_overseer, &test_state).await; - let pov_block_a = PoVBlock { + let pov_block_a = PoV { block_data: BlockData(vec![42, 43, 44]), }; - let pov_block_b = PoVBlock { + let pov_block_b = PoV { block_data: BlockData(vec![45, 46, 47]), }; - let pov_block_hash_a = pov_block_a.hash(); - let pov_block_hash_b = pov_block_b.hash(); + let pov_hash_a = pov_block_a.hash(); + let pov_hash_b = pov_block_b.hash(); + + let expected_head_data = test_state.head_data.get(&test_state.chain_ids[0]).unwrap(); - let candidate_a = AbridgedCandidateReceipt { - parachain_index: test_state.chain_ids[0], + let candidate_a = TestCandidateBuilder { + para_id: test_state.chain_ids[0], relay_parent: test_state.relay_parent, - pov_block_hash: pov_block_hash_a, + pov_hash: pov_hash_a, + erasure_root: make_erasure_root(&test_state, pov_block_a.clone()), ..Default::default() - }; - - let candidate_a_hash = candidate_a.hash(); + }.build(); - let candidate_b = AbridgedCandidateReceipt { - parachain_index: test_state.chain_ids[0], + let candidate_b = TestCandidateBuilder { + para_id: test_state.chain_ids[0], relay_parent: test_state.relay_parent, - pov_block_hash: pov_block_hash_b, + pov_hash: pov_hash_b, + erasure_root: make_erasure_root(&test_state, pov_block_b.clone()), + head_data: expected_head_data.clone(), ..Default::default() - }; + }.build(); let second = CandidateBackingMessage::Second( test_state.relay_parent, - candidate_a.clone(), + candidate_a.to_plain(), pov_block_a.clone(), ); virtual_overseer.send(FromOverseer::Communication{ msg: second }).await; - let expected_head_data = test_state.head_data.get(&test_state.chain_ids[0]).unwrap(); assert_matches!( virtual_overseer.recv().await, AllMessages::CandidateValidation( - CandidateValidationMessage::Validate( - parent_hash, + CandidateValidationMessage::ValidateFromChainState( c, - head_data, pov, tx, ) - ) if parent_hash == test_state.relay_parent && - pov == pov_block_a && c == candidate_a => { - assert_eq!(head_data, *expected_head_data); - tx.send(Ok(( - ValidationResult::Invalid, - test_state.global_validation_schedule.clone(), - test_state.local_validation_data.clone(), - ))).unwrap(); + ) if pov == pov && &c == candidate_a.descriptor() => { + tx.send(Ok(ValidationResult::Invalid)).unwrap(); } ); assert_matches!( virtual_overseer.recv().await, AllMessages::CandidateSelection( - CandidateSelectionMessage::Invalid(parent_hash, candidate) - ) if parent_hash == test_state.relay_parent && candidate == candidate_a - ); - - assert_matches!( - virtual_overseer.recv().await, - AllMessages::StatementDistribution( - StatementDistributionMessage::Share( - relay_parent, - statement, - ) - ) if relay_parent == test_state.relay_parent => { - assert_eq!(*statement.payload(), Statement::Invalid(candidate_a_hash)); - } + CandidateSelectionMessage::Invalid(parent_hash, c) + ) if parent_hash == test_state.relay_parent && c == candidate_a.to_plain() ); let second = CandidateBackingMessage::Second( test_state.relay_parent, - candidate_b.clone(), + candidate_b.to_plain(), pov_block_b.clone(), ); @@ -1530,21 +1631,22 @@ mod tests { assert_matches!( virtual_overseer.recv().await, AllMessages::CandidateValidation( - CandidateValidationMessage::Validate( - parent_hash, + CandidateValidationMessage::ValidateFromChainState( c, - head_data, pov, tx, ) - ) if parent_hash == test_state.relay_parent && - pov == pov_block_b && c == candidate_b => { - assert_eq!(head_data, *expected_head_data); - tx.send(Ok(( - ValidationResult::Valid, - test_state.global_validation_schedule, - test_state.local_validation_data, - ))).unwrap(); + ) if pov == pov && &c == candidate_b.descriptor() => { + tx.send(Ok( + ValidationResult::Valid(ValidationOutputs { + global_validation_schedule: test_state.global_validation_schedule, + local_validation_data: test_state.local_validation_data, + head_data: expected_head_data.clone(), + upward_messages: Vec::new(), + fees: Default::default(), + new_validation_code: None, + }), + )).unwrap(); } ); @@ -1590,18 +1692,19 @@ mod tests { test_startup(&mut virtual_overseer, &test_state).await; - let pov_block = PoVBlock { + let pov = PoV { block_data: BlockData(vec![42, 43, 44]), }; - let pov_block_hash = pov_block.hash(); + let pov_hash = pov.hash(); - let candidate = AbridgedCandidateReceipt { - parachain_index: test_state.chain_ids[0], + let candidate = TestCandidateBuilder { + para_id: test_state.chain_ids[0], relay_parent: test_state.relay_parent, - pov_block_hash, + pov_hash, + erasure_root: make_erasure_root(&test_state, pov.clone()), ..Default::default() - }; + }.build(); let candidate_hash = candidate.hash(); @@ -1627,33 +1730,22 @@ mod tests { PoVDistributionMessage::FetchPoV(relay_parent, _, tx) ) => { assert_eq!(relay_parent, test_state.relay_parent); - tx.send(Arc::new(pov_block.clone())).unwrap(); + tx.send(Arc::new(pov.clone())).unwrap(); } ); - let expected_head_data = test_state.head_data.get(&test_state.chain_ids[0]).unwrap(); // Tell subsystem that this candidate is invalid. assert_matches!( virtual_overseer.recv().await, AllMessages::CandidateValidation( - CandidateValidationMessage::Validate( - relay_parent, - candidate_recvd, - head_data, + CandidateValidationMessage::ValidateFromChainState( + c, pov, tx, ) - ) => { - assert_eq!(relay_parent, test_state.relay_parent); - assert_eq!(candidate_recvd, candidate); - assert_eq!(head_data, *expected_head_data); - assert_eq!(pov, pov_block); - tx.send(Ok(( - ValidationResult::Invalid, - test_state.global_validation_schedule, - test_state.local_validation_data, - ))).unwrap(); + ) if pov == pov && &c == candidate.descriptor() => { + tx.send(Ok(ValidationResult::Invalid)).unwrap(); } ); @@ -1679,28 +1771,29 @@ mod tests { // This should emit no actions from subsystem. let second = CandidateBackingMessage::Second( test_state.relay_parent, - candidate.clone(), - pov_block.clone(), + candidate.to_plain(), + pov.clone(), ); virtual_overseer.send(FromOverseer::Communication{ msg: second }).await; - let pov_to_second = PoVBlock { + let pov_to_second = PoV { block_data: BlockData(vec![3, 2, 1]), }; - let pov_block_hash = pov_to_second.hash(); + let pov_hash = pov_to_second.hash(); - let candidate_to_second = AbridgedCandidateReceipt { - parachain_index: test_state.chain_ids[0], + let candidate_to_second = TestCandidateBuilder { + para_id: test_state.chain_ids[0], relay_parent: test_state.relay_parent, - pov_block_hash, + pov_hash, + erasure_root: make_erasure_root(&test_state, pov_to_second.clone()), ..Default::default() - }; + }.build(); let second = CandidateBackingMessage::Second( test_state.relay_parent, - candidate_to_second.clone(), + candidate_to_second.to_plain(), pov_to_second.clone(), ); @@ -1712,16 +1805,13 @@ mod tests { assert_matches!( virtual_overseer.recv().await, AllMessages::CandidateValidation( - CandidateValidationMessage::Validate( - relay_parent, - _, + CandidateValidationMessage::ValidateFromChainState( _, pov, _, ) ) => { - assert_eq!(relay_parent, test_state.relay_parent); - assert_eq!(pov, pov_to_second); + assert_eq!(&*pov, &pov_to_second); } ); }); diff --git a/node/core/proposer/src/lib.rs b/node/core/proposer/src/lib.rs index b53ac5729f..d43810227b 100644 --- a/node/core/proposer/src/lib.rs +++ b/node/core/proposer/src/lib.rs @@ -2,9 +2,7 @@ use futures::prelude::*; use futures::select; use polkadot_node_subsystem::{messages::{AllMessages, ProvisionerInherentData, ProvisionerMessage}, SubsystemError}; use polkadot_overseer::OverseerHandler; -use polkadot_primitives::{ - inclusion_inherent, - parachain::ParachainHost, +use polkadot_primitives::v1::{ Block, Hash, Header, }; use sc_block_builder::{BlockBuilderApi, BlockBuilderProvider}; @@ -53,7 +51,7 @@ where + Send + Sync, Client::Api: - ParachainHost + BlockBuilderApi + ApiExt, + BlockBuilderApi + ApiExt, Backend: 'static + sc_client_api::Backend>, // Rust bug: https://github.com/rust-lang/rust/issues/24159 @@ -104,7 +102,7 @@ where + Send + Sync, Client::Api: - ParachainHost + BlockBuilderApi + ApiExt, + BlockBuilderApi + ApiExt, Backend: 'static + sc_client_api::Backend>, // Rust bug: https://github.com/rust-lang/rust/issues/24159 @@ -155,7 +153,7 @@ where + Send + Sync, Client::Api: - ParachainHost + BlockBuilderApi + ApiExt, + BlockBuilderApi + ApiExt, Backend: 'static + sc_client_api::Backend>, // Rust bug: https://github.com/rust-lang/rust/issues/24159 @@ -186,7 +184,7 @@ where }; inherent_data.put_data( - inclusion_inherent::INHERENT_IDENTIFIER, + polkadot_primitives::v1::INCLUSION_INHERENT_IDENTIFIER, &provisioner_data, )?; diff --git a/node/network/bridge/src/lib.rs b/node/network/bridge/src/lib.rs index 6f90779afe..46b9dbd840 100644 --- a/node/network/bridge/src/lib.rs +++ b/node/network/bridge/src/lib.rs @@ -33,7 +33,7 @@ use polkadot_subsystem::{ }; use polkadot_subsystem::messages::{NetworkBridgeEvent, NetworkBridgeMessage, AllMessages}; use node_primitives::{ProtocolId, View}; -use polkadot_primitives::{Block, Hash}; +use polkadot_primitives::v1::{Block, Hash}; use std::collections::btree_map::{BTreeMap, Entry as BEntry}; use std::collections::hash_map::{HashMap, Entry as HEntry}; diff --git a/node/network/pov-distribution/src/lib.rs b/node/network/pov-distribution/src/lib.rs index 589e33fde0..84d6e803d2 100644 --- a/node/network/pov-distribution/src/lib.rs +++ b/node/network/pov-distribution/src/lib.rs @@ -19,8 +19,7 @@ //! This is a gossip implementation of code that is responsible for distributing PoVs //! among validators. -use polkadot_primitives::Hash; -use polkadot_primitives::parachain::{PoVBlock as PoV, CandidateDescriptor}; +use polkadot_primitives::v1::{Hash, PoV, CandidateDescriptor}; use polkadot_subsystem::{ OverseerSignal, SubsystemContext, Subsystem, SubsystemResult, FromOverseer, SpawnedSubsystem, }; @@ -550,7 +549,7 @@ async fn run( mod tests { use super::*; use futures::executor::{self, ThreadPool}; - use polkadot_primitives::parachain::BlockData; + use polkadot_primitives::v1::BlockData; use assert_matches::assert_matches; fn make_pov(data: Vec) -> PoV { diff --git a/node/network/statement-distribution/src/lib.rs b/node/network/statement-distribution/src/lib.rs index f3d2653266..cef499eae9 100644 --- a/node/network/statement-distribution/src/lib.rs +++ b/node/network/statement-distribution/src/lib.rs @@ -29,9 +29,8 @@ use polkadot_subsystem::messages::{ RuntimeApiRequest, }; use node_primitives::{ProtocolId, View, SignedFullStatement}; -use polkadot_primitives::Hash; -use polkadot_primitives::parachain::{ - CompactStatement, ValidatorIndex, ValidatorId, SigningContext, ValidatorSignature, +use polkadot_primitives::v1::{ + Hash, CompactStatement, ValidatorIndex, ValidatorId, SigningContext, ValidatorSignature, }; use parity_scale_codec::{Encode, Decode}; @@ -891,7 +890,7 @@ mod tests { use super::*; use sp_keyring::Sr25519Keyring; use node_primitives::Statement; - use polkadot_primitives::parachain::{AbridgedCandidateReceipt}; + use polkadot_primitives::v1::CommittedCandidateReceipt; use assert_matches::assert_matches; use futures::executor::{self, ThreadPool}; @@ -911,23 +910,23 @@ mod tests { }; let candidate_a = { - let mut c = AbridgedCandidateReceipt::default(); - c.relay_parent = parent_hash; - c.parachain_index = 1.into(); + let mut c = CommittedCandidateReceipt::default(); + c.descriptor.relay_parent = parent_hash; + c.descriptor.para_id = 1.into(); c }; let candidate_b = { - let mut c = AbridgedCandidateReceipt::default(); - c.relay_parent = parent_hash; - c.parachain_index = 2.into(); + let mut c = CommittedCandidateReceipt::default(); + c.descriptor.relay_parent = parent_hash; + c.descriptor.para_id = 2.into(); c }; let candidate_c = { - let mut c = AbridgedCandidateReceipt::default(); - c.relay_parent = parent_hash; - c.parachain_index = 3.into(); + let mut c = CommittedCandidateReceipt::default(); + c.descriptor.relay_parent = parent_hash; + c.descriptor.para_id = 3.into(); c }; @@ -1140,9 +1139,9 @@ mod tests { let hash_c = [3; 32].into(); let candidate = { - let mut c = AbridgedCandidateReceipt::default(); - c.relay_parent = hash_c; - c.parachain_index = 1.into(); + let mut c = CommittedCandidateReceipt::default(); + c.descriptor.relay_parent = hash_c; + c.descriptor.para_id = 1.into(); c }; let candidate_hash = candidate.hash(); @@ -1275,9 +1274,9 @@ mod tests { let hash_c = [3; 32].into(); let candidate = { - let mut c = AbridgedCandidateReceipt::default(); - c.relay_parent = hash_b; - c.parachain_index = 1.into(); + let mut c = CommittedCandidateReceipt::default(); + c.descriptor.relay_parent = hash_b; + c.descriptor.para_id = 1.into(); c }; diff --git a/node/overseer/examples/minimal-example.rs b/node/overseer/examples/minimal-example.rs index 21e8eb3ab8..d5f7f043ff 100644 --- a/node/overseer/examples/minimal-example.rs +++ b/node/overseer/examples/minimal-example.rs @@ -27,11 +27,11 @@ use futures::{ use futures_timer::Delay; use kv_log_macro as log; -use polkadot_primitives::parachain::{BlockData, PoVBlock}; +use polkadot_primitives::v1::{BlockData, PoV}; use polkadot_overseer::{Overseer, AllSubsystems}; use polkadot_subsystem::{ - Subsystem, SubsystemContext, DummySubsystem, + Subsystem, SubsystemContext, DummySubsystem, SpawnedSubsystem, FromOverseer, }; use polkadot_subsystem::messages::{ @@ -61,13 +61,11 @@ impl Subsystem1 { let (tx, _) = oneshot::channel(); ctx.send_message(AllMessages::CandidateValidation( - CandidateValidationMessage::Validate( + CandidateValidationMessage::ValidateFromChainState( Default::default(), - Default::default(), - Default::default(), - PoVBlock { + PoV { block_data: BlockData(Vec::new()), - }, + }.into(), tx, ) )).await.unwrap(); diff --git a/node/overseer/src/lib.rs b/node/overseer/src/lib.rs index 458aae91e8..91fceb0d3b 100644 --- a/node/overseer/src/lib.rs +++ b/node/overseer/src/lib.rs @@ -72,7 +72,7 @@ use futures::{ use futures_timer::Delay; use streamunordered::{StreamYield, StreamUnordered}; -use polkadot_primitives::{Block, BlockNumber, Hash}; +use polkadot_primitives::v1::{Block, BlockNumber, Hash}; use client::{BlockImportNotification, BlockchainEvents, FinalityNotification}; use polkadot_subsystem::messages::{ @@ -932,7 +932,7 @@ fn spawn( mod tests { use futures::{executor, pin_mut, select, channel::mpsc, FutureExt}; - use polkadot_primitives::parachain::{BlockData, PoVBlock}; + use polkadot_primitives::v1::{BlockData, PoV}; use polkadot_subsystem::DummySubsystem; use super::*; @@ -977,13 +977,11 @@ mod tests { let (tx, _) = oneshot::channel(); ctx.send_message( AllMessages::CandidateValidation( - CandidateValidationMessage::Validate( + CandidateValidationMessage::ValidateFromChainState( Default::default(), - Default::default(), - Default::default(), - PoVBlock { + PoV { block_data: BlockData(Vec::new()), - }, + }.into(), tx, ) ) diff --git a/node/primitives/src/lib.rs b/node/primitives/src/lib.rs index 25313c0915..f29be57374 100644 --- a/node/primitives/src/lib.rs +++ b/node/primitives/src/lib.rs @@ -21,26 +21,31 @@ //! there. use parity_scale_codec::{Decode, Encode}; -use polkadot_primitives::{Hash, - parachain::{ - AbridgedCandidateReceipt, CompactStatement, - EncodeAs, Signed, SigningContext, ValidatorIndex, ValidatorId, - } +use polkadot_primitives::v1::{ + Hash, CommittedCandidateReceipt, CandidateReceipt, CompactStatement, + EncodeAs, Signed, SigningContext, ValidatorIndex, ValidatorId, + UpwardMessage, Balance, ValidationCode, GlobalValidationSchedule, LocalValidationData, + HeadData, }; use polkadot_statement_table::{ generic::{ ValidityDoubleVote as TableValidityDoubleVote, MultipleCandidates as TableMultipleCandidates, }, - Misbehavior as TableMisbehavior, + v1::Misbehavior as TableMisbehavior, }; /// A statement, where the candidate receipt is included in the `Seconded` variant. +/// +/// This is the committed candidate receipt instead of the bare candidate receipt. As such, +/// it gives access to the commitments to validators who have not executed the candidate. This +/// is necessary to allow a block-producing validator to include candidates from outside of the para +/// it is assigned to. #[derive(Debug, Clone, PartialEq, Eq, Encode, Decode)] pub enum Statement { /// A statement that a validator seconds a candidate. #[codec(index = "1")] - Seconded(AbridgedCandidateReceipt), + Seconded(CommittedCandidateReceipt), /// A statement that a validator has deemed a candidate valid. #[codec(index = "2")] Valid(Hash), @@ -50,6 +55,8 @@ pub enum Statement { } impl Statement { + /// Transform this statement into its compact version, which references only the hash + /// of the candidate. pub fn to_compact(&self) -> CompactStatement { match *self { Statement::Seconded(ref c) => CompactStatement::Candidate(c.hash()), @@ -84,9 +91,9 @@ pub enum MisbehaviorReport { /// this message should be dispatched with all of them, in arbitrary order. /// /// This variant is also used when our own validity checks disagree with others'. - CandidateValidityDisagreement(AbridgedCandidateReceipt, Vec), + CandidateValidityDisagreement(CandidateReceipt, Vec), /// I've noticed a peer contradicting itself about a particular candidate - SelfContradiction(AbridgedCandidateReceipt, SignedFullStatement, SignedFullStatement), + SelfContradiction(CandidateReceipt, SignedFullStatement, SignedFullStatement), /// This peer has seconded more than one parachain candidate for this relay parent head DoubleVote(SignedFullStatement, SignedFullStatement), } @@ -103,11 +110,28 @@ pub struct FromTableMisbehavior { pub key: ValidatorId, } +/// Outputs of validating a candidate. +#[derive(Debug)] +pub struct ValidationOutputs { + /// The head-data produced by validation. + pub head_data: HeadData, + /// The global validation schedule. + pub global_validation_schedule: GlobalValidationSchedule, + /// The local validation data. + pub local_validation_data: LocalValidationData, + /// Upward messages to the relay chain. + pub upward_messages: Vec, + /// Fees paid to the validators of the relay-chain. + pub fees: Balance, + /// The new validation code submitted by the execution, if any. + pub new_validation_code: Option, +} + /// Result of the validation of the candidate. #[derive(Debug)] pub enum ValidationResult { - /// Candidate is valid. - Valid, + /// Candidate is valid. The validation process yields these outputs. + Valid(ValidationOutputs), /// Candidate is invalid. Invalid, } @@ -136,7 +160,7 @@ impl std::convert::TryFrom for MisbehaviorReport { &f.key, ).ok_or(())?; - Ok(MisbehaviorReport::SelfContradiction(receipt, signed_1, signed_2)) + Ok(MisbehaviorReport::SelfContradiction(receipt.to_plain(), signed_1, signed_2)) } TableMisbehavior::ValidityDoubleVote( TableValidityDoubleVote::IssuedAndInvalidity((c, s1), (d, s2)) @@ -157,7 +181,7 @@ impl std::convert::TryFrom for MisbehaviorReport { &f.key, ).ok_or(())?; - Ok(MisbehaviorReport::SelfContradiction(receipt, signed_1, signed_2)) + Ok(MisbehaviorReport::SelfContradiction(receipt.to_plain(), signed_1, signed_2)) } TableMisbehavior::ValidityDoubleVote( TableValidityDoubleVote::ValidityAndInvalidity(c, s1, s2) @@ -177,7 +201,7 @@ impl std::convert::TryFrom for MisbehaviorReport { &f.key, ).ok_or(())?; - Ok(MisbehaviorReport::SelfContradiction(c, signed_1, signed_2)) + Ok(MisbehaviorReport::SelfContradiction(c.to_plain(), signed_1, signed_2)) } TableMisbehavior::MultipleCandidates( TableMultipleCandidates { diff --git a/node/service/src/chain_spec.rs b/node/service/src/chain_spec.rs index 0659d08083..db9d9c5dde 100644 --- a/node/service/src/chain_spec.rs +++ b/node/service/src/chain_spec.rs @@ -17,7 +17,7 @@ //! Polkadot chain configurations. use sp_core::{Pair, Public, crypto::UncheckedInto, sr25519}; -use polkadot_primitives::{AccountId, AccountPublic, parachain::ValidatorId}; +use polkadot_primitives::v1::{AccountId, AccountPublic, ValidatorId}; use polkadot_runtime as polkadot; use kusama_runtime as kusama; use westend_runtime as westend; @@ -48,9 +48,9 @@ const DEFAULT_PROTOCOL_ID: &str = "dot"; #[serde(rename_all = "camelCase")] pub struct Extensions { /// Block numbers with known hashes. - pub fork_blocks: sc_client_api::ForkBlocks, + pub fork_blocks: sc_client_api::ForkBlocks, /// Known bad block hashes. - pub bad_blocks: sc_client_api::BadBlocks, + pub bad_blocks: sc_client_api::BadBlocks, } /// The `ChainSpec parametrised for polkadot runtime`. diff --git a/node/service/src/grandpa_support.rs b/node/service/src/grandpa_support.rs index 806a189d9f..2a9b73b086 100644 --- a/node/service/src/grandpa_support.rs +++ b/node/service/src/grandpa_support.rs @@ -16,7 +16,7 @@ //! Polkadot-specific GRANDPA integration utilities. -use polkadot_primitives::Hash; +use polkadot_primitives::v1::Hash; use sp_runtime::traits::{Block as BlockT, NumberFor}; /// A custom GRANDPA voting rule that "pauses" voting (i.e. keeps voting for the @@ -98,7 +98,7 @@ impl grandpa::VotingRule for PauseAfterBlockFor Vec<( grandpa_primitives::SetId, - (Hash, polkadot_primitives::BlockNumber), + (Hash, polkadot_primitives::v1::BlockNumber), grandpa_primitives::AuthorityList, )> { use sp_core::crypto::Ss58Codec; diff --git a/node/service/src/lib.rs b/node/service/src/lib.rs index 8a435e6b59..1205d9f3ef 100644 --- a/node/service/src/lib.rs +++ b/node/service/src/lib.rs @@ -22,7 +22,7 @@ mod client; use std::sync::Arc; use std::time::Duration; -use polkadot_primitives::{parachain, AccountId, Nonce, Balance}; +use polkadot_primitives::v1::{AccountId, Nonce, Balance}; #[cfg(feature = "full-node")] use service::{error::Error as ServiceError, ServiceBuilder}; use grandpa::{self, FinalityProofProvider as GrandpaFinalityProofProvider}; @@ -45,8 +45,7 @@ pub use sc_consensus::LongestChain; pub use sp_api::{ApiRef, Core as CoreApi, ConstructRuntimeApi, ProvideRuntimeApi, StateBackend}; pub use sp_runtime::traits::{DigestFor, HashFor, NumberFor}; pub use consensus_common::{Proposal, SelectChain, BlockImport, RecordProof, block_validation::Chain}; -pub use polkadot_primitives::parachain::{CollatorId, ParachainHost}; -pub use polkadot_primitives::{Block, BlockId}; +pub use polkadot_primitives::v1::{Block, BlockId, CollatorId, Id as ParaId}; pub use sp_runtime::traits::{Block as BlockT, self as runtime_traits, BlakeTwo256}; pub use chain_spec::{PolkadotChainSpec, KusamaChainSpec, WestendChainSpec}; #[cfg(feature = "full-node")] @@ -84,7 +83,6 @@ pub trait RuntimeApiCollection: + sp_api::ApiExt + babe_primitives::BabeApi + grandpa_primitives::GrandpaApi - + ParachainHost + sp_block_builder::BlockBuilder + system_rpc_runtime_api::AccountNonceApi + pallet_transaction_payment_rpc_runtime_api::TransactionPaymentApi @@ -104,7 +102,6 @@ where + sp_api::ApiExt + babe_primitives::BabeApi + grandpa_primitives::GrandpaApi - + ParachainHost + sp_block_builder::BlockBuilder + system_rpc_runtime_api::AccountNonceApi + pallet_transaction_payment_rpc_runtime_api::TransactionPaymentApi @@ -578,7 +575,7 @@ macro_rules! new_light { /// Builds a new object suitable for chain operations. pub fn new_chain_ops(mut config: Configuration) -> Result< ( - Arc>, + Arc>, Arc>, consensus_common::import_queue::BasicQueue>, TaskManager, @@ -601,7 +598,7 @@ where #[cfg(feature = "full-node")] pub fn polkadot_new_full( mut config: Configuration, - collating_for: Option<(CollatorId, parachain::Id)>, + collating_for: Option<(CollatorId, ParaId)>, _max_block_data_size: Option, _authority_discovery_enabled: bool, _slot_duration: u64, @@ -633,7 +630,7 @@ pub fn polkadot_new_full( #[cfg(feature = "full-node")] pub fn kusama_new_full( mut config: Configuration, - collating_for: Option<(CollatorId, parachain::Id)>, + collating_for: Option<(CollatorId, ParaId)>, _max_block_data_size: Option, _authority_discovery_enabled: bool, _slot_duration: u64, @@ -665,7 +662,7 @@ pub fn kusama_new_full( #[cfg(feature = "full-node")] pub fn westend_new_full( mut config: Configuration, - collating_for: Option<(CollatorId, parachain::Id)>, + collating_for: Option<(CollatorId, ParaId)>, _max_block_data_size: Option, _authority_discovery_enabled: bool, _slot_duration: u64, diff --git a/node/subsystem/src/lib.rs b/node/subsystem/src/lib.rs index db9a0629cf..e374eb9cfc 100644 --- a/node/subsystem/src/lib.rs +++ b/node/subsystem/src/lib.rs @@ -26,7 +26,7 @@ use futures::prelude::*; use futures::channel::{mpsc, oneshot}; use futures::future::BoxFuture; -use polkadot_primitives::Hash; +use polkadot_primitives::v1::Hash; use async_trait::async_trait; use crate::messages::AllMessages; diff --git a/node/subsystem/src/messages.rs b/node/subsystem/src/messages.rs index 36c293e49f..10c861f141 100644 --- a/node/subsystem/src/messages.rs +++ b/node/subsystem/src/messages.rs @@ -24,12 +24,12 @@ use futures::channel::{mpsc, oneshot}; -use polkadot_primitives::{BlockNumber, Hash, Signature}; -use polkadot_primitives::parachain::{ - AbridgedCandidateReceipt, PoVBlock, ErasureChunk, BackedCandidate, Id as ParaId, +use polkadot_primitives::v1::{ + BlockNumber, Hash, + CandidateReceipt, PoV, ErasureChunk, BackedCandidate, Id as ParaId, SignedAvailabilityBitfield, SigningContext, ValidatorId, ValidationCode, ValidatorIndex, - CoreAssignment, CoreOccupied, HeadData, CandidateDescriptor, GlobalValidationSchedule, - LocalValidationData, + CoreAssignment, CoreOccupied, HeadData, CandidateDescriptor, + ValidatorSignature, OmittedValidationData, }; use polkadot_node_primitives::{ MisbehaviorReport, SignedFullStatement, View, ProtocolId, ValidationResult, @@ -48,7 +48,7 @@ pub struct NewBackedCandidate(pub BackedCandidate); pub enum CandidateSelectionMessage { /// We recommended a particular candidate to be seconded, but it was invalid; penalize the collator. /// The hash is the relay parent. - Invalid(Hash, AbridgedCandidateReceipt), + Invalid(Hash, CandidateReceipt), } /// Messages received by the Candidate Backing subsystem. @@ -59,7 +59,7 @@ pub enum CandidateBackingMessage { GetBackedCandidates(Hash, oneshot::Sender>), /// Note that the Candidate Backing subsystem should second the given candidate in the context of the /// given relay-parent (ref. by hash). This candidate must be validated. - Second(Hash, AbridgedCandidateReceipt, PoVBlock), + Second(Hash, CandidateReceipt, PoV), /// Note a validator's statement about a particular candidate. Disagreements about validity must be escalated /// to a broader check by Misbehavior Arbitration. Agreements are simply tallied until a quorum is reached. Statement(Hash, SignedFullStatement), @@ -69,22 +69,36 @@ pub enum CandidateBackingMessage { #[derive(Debug)] pub struct ValidationFailed; -/// Messages received by the Validation subsystem +/// Messages received by the Validation subsystem. +/// +/// ## Validation Requests +/// +/// Validation requests made to the subsystem should return an error only on internal error. +/// Otherwise, they should return either `Ok(ValidationResult::Valid(_))` +/// or `Ok(ValidationResult::Invalid)`. #[derive(Debug)] pub enum CandidateValidationMessage { - /// Validate a candidate, sending a side-channel response of valid or invalid. + /// Validate a candidate with provided parameters using relay-chain state. + /// + /// This will implicitly attempt to gather the `OmittedValidationData` and `ValidationCode` + /// from the runtime API of the chain, based on the `relay_parent` + /// of the `CandidateDescriptor`. + /// If there is no state available which can provide this data, an error is returned. + ValidateFromChainState( + CandidateDescriptor, + Arc, + oneshot::Sender>, + ), + /// Validate a candidate with provided, exhaustive parameters for validation. /// - /// Provide the relay-parent in whose context this should be validated, the full candidate receipt, - /// and the PoV. - Validate( - Hash, - AbridgedCandidateReceipt, - HeadData, - PoVBlock, - oneshot::Sender>, + /// Explicitly provide the `OmittedValidationData` and `ValidationCode` so this can do full + /// validation without needing to access the state of the relay-chain. + ValidateFromExhaustive( + OmittedValidationData, + ValidationCode, + CandidateDescriptor, + Arc, + oneshot::Sender>, ), } @@ -146,8 +160,8 @@ pub enum BitfieldDistributionMessage { /// Availability store subsystem message. #[derive(Debug)] pub enum AvailabilityStoreMessage { - /// Query a `PoVBlock` from the AV store. - QueryPoV(Hash, oneshot::Sender>), + /// Query a `PoV` from the AV store. + QueryPoV(Hash, oneshot::Sender>), /// Query an `ErasureChunk` from the AV store. QueryChunk(Hash, ValidatorIndex, oneshot::Sender), @@ -213,7 +227,7 @@ pub enum ProvisionableData { /// Misbehavior reports are self-contained proofs of validator misbehavior. MisbehaviorReport(Hash, MisbehaviorReport), /// Disputes trigger a broad dispute resolution process. - Dispute(Hash, Signature), + Dispute(Hash, ValidatorSignature), } /// This data needs to make its way from the provisioner into the InherentData. @@ -246,10 +260,10 @@ pub enum PoVDistributionMessage { /// /// This `CandidateDescriptor` should correspond to a candidate seconded under the provided /// relay-parent hash. - FetchPoV(Hash, CandidateDescriptor, oneshot::Sender>), + FetchPoV(Hash, CandidateDescriptor, oneshot::Sender>), /// Distribute a PoV for the given relay-parent and CandidateDescriptor. /// The PoV should correctly hash to the PoV hash mentioned in the CandidateDescriptor - DistributePoV(Hash, CandidateDescriptor, Arc), + DistributePoV(Hash, CandidateDescriptor, Arc), /// An update from the network bridge. NetworkBridgeUpdate(NetworkBridgeEvent), } diff --git a/node/test-service/src/chain_spec.rs b/node/test-service/src/chain_spec.rs index cbb08c470f..e81050afdb 100644 --- a/node/test-service/src/chain_spec.rs +++ b/node/test-service/src/chain_spec.rs @@ -17,7 +17,7 @@ use babe_primitives::AuthorityId as BabeId; use grandpa::AuthorityId as GrandpaId; use pallet_staking::Forcing; -use polkadot_primitives::{parachain::ValidatorId, AccountId}; +use polkadot_primitives::v0::{ValidatorId, AccountId}; use polkadot_service::chain_spec::{get_account_id_from_seed, get_from_seed, Extensions}; use polkadot_test_runtime::constants::currency::DOTS; use sc_chain_spec::{ChainSpec, ChainType}; diff --git a/node/test-service/src/lib.rs b/node/test-service/src/lib.rs index 7fc75d9f37..751373265f 100644 --- a/node/test-service/src/lib.rs +++ b/node/test-service/src/lib.rs @@ -26,9 +26,8 @@ use futures::future::Future; use grandpa::FinalityProofProvider as GrandpaFinalityProofProvider; use log::info; use polkadot_network::{legacy::gossip::Known, protocol as network_protocol}; -use polkadot_primitives::{ - parachain::{self, CollatorId}, - Block, BlockId, Hash, +use polkadot_primitives::v0::{ + Block, BlockId, Hash, CollatorId, Id as ParaId, }; use polkadot_runtime_common::{parachains, registrar, BlockHashCount}; use polkadot_service::{ @@ -68,7 +67,7 @@ native_executor_instance!( /// Create a new Polkadot test service for a full node. pub fn polkadot_test_new_full( config: Configuration, - collating_for: Option<(CollatorId, parachain::Id)>, + collating_for: Option<(CollatorId, ParaId)>, max_block_data_size: Option, authority_discovery_enabled: bool, slot_duration: u64, @@ -287,7 +286,7 @@ where let extrinsic = polkadot_test_runtime::UncheckedExtrinsic::new_signed( function.clone(), polkadot_test_runtime::Address::Id(caller.public().into()), - polkadot_primitives::Signature::Sr25519(signature.clone()), + polkadot_primitives::v0::Signature::Sr25519(signature.clone()), extra.clone(), ); diff --git a/parachain/test-parachains/adder/collator/src/main.rs b/parachain/test-parachains/adder/collator/src/main.rs index 42c3c82400..ec5b626883 100644 --- a/parachain/test-parachains/adder/collator/src/main.rs +++ b/parachain/test-parachains/adder/collator/src/main.rs @@ -22,9 +22,9 @@ use std::sync::Arc; use adder::{HeadData as AdderHead, BlockData as AdderBody}; use sp_core::Pair; use codec::{Encode, Decode}; -use primitives::{ +use primitives::v0::{ Hash, DownwardMessage, - parachain::{HeadData, BlockData, Id as ParaId, LocalValidationData, GlobalValidationSchedule}, + HeadData, BlockData, Id as ParaId, LocalValidationData, GlobalValidationSchedule, }; use collator::{ParachainContext, Network, BuildParachainContext, Cli, SubstrateCli}; use parking_lot::Mutex; diff --git a/primitives/src/inclusion_inherent.rs b/primitives/src/inclusion_inherent.rs deleted file mode 100644 index ca3f5ec23a..0000000000 --- a/primitives/src/inclusion_inherent.rs +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright 2017-2020 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 . - -//! Inclusion Inherent primitives define types and constants which can be imported -//! without needing to import the entire inherent module. - -use inherents::InherentIdentifier; - -/// Unique identifier for the Inclusion Inherent -pub const INHERENT_IDENTIFIER: InherentIdentifier = *b"inclusn0"; diff --git a/primitives/src/lib.rs b/primitives/src/lib.rs index 6f0a0986c9..82a5e7ca2e 100644 --- a/primitives/src/lib.rs +++ b/primitives/src/lib.rs @@ -20,58 +20,5 @@ #![cfg_attr(not(feature = "std"), no_std)] -pub use runtime_primitives::traits::{BlakeTwo256, Hash as HashT, Verify, IdentifyAccount}; -pub use polkadot_core_primitives::*; - -pub mod inclusion_inherent; -pub mod parachain; - -pub use parity_scale_codec::Compact; - -/// Custom validity errors used in Polkadot while validating transactions. -#[repr(u8)] -pub enum ValidityError { - /// The Ethereum signature is invalid. - InvalidEthereumSignature = 0, - /// The signer has no claim. - SignerHasNoClaim = 1, - /// No permission to execute the call. - NoPermission = 2, - /// An invalid statement was made for a claim. - InvalidStatement = 3, -} - -impl From for u8 { - fn from(err: ValidityError) -> Self { - err as u8 - } -} - -/// App-specific crypto used for reporting equivocation/misbehavior in BABE, -/// GRANDPA and Parachains, described in the white paper as the fisherman role. -/// Any rewards for misbehavior reporting will be paid out to this account. -pub mod fisherman { - use super::{Signature, Verify}; - use primitives::crypto::KeyTypeId; - - /// Key type for the reporting module. Used for reporting BABE, GRANDPA - /// and Parachain equivocations. - pub const KEY_TYPE: KeyTypeId = KeyTypeId(*b"fish"); - - mod app { - use application_crypto::{app_crypto, sr25519}; - app_crypto!(sr25519, super::KEY_TYPE); - } - - /// Identity of the equivocation/misbehavior reporter. - pub type FishermanId = app::Public; - - /// An `AppCrypto` type to allow submitting signed transactions using the fisherman - /// application key as signer. - pub struct FishermanAppCrypto; - impl frame_system::offchain::AppCrypto<::Signer, Signature> for FishermanAppCrypto { - type RuntimeAppPublic = FishermanId; - type GenericSignature = primitives::sr25519::Signature; - type GenericPublic = primitives::sr25519::Public; - } -} +pub mod v0; +pub mod v1; diff --git a/primitives/src/parachain.rs b/primitives/src/v0.rs similarity index 83% rename from primitives/src/parachain.rs rename to primitives/src/v0.rs index 19937798c6..e1ec3a5546 100644 --- a/primitives/src/parachain.rs +++ b/primitives/src/v0.rs @@ -21,18 +21,20 @@ use sp_std::prelude::*; use sp_std::cmp::Ordering; use parity_scale_codec::{Encode, Decode}; use bitvec::vec::BitVec; -use super::{Hash, Balance, BlockNumber}; #[cfg(feature = "std")] use serde::{Serialize, Deserialize}; #[cfg(feature = "std")] -use primitives::{bytes, crypto::Pair}; +use primitives::crypto::Pair; use primitives::RuntimeDebug; use runtime_primitives::traits::{AppVerify, Block as BlockT}; use inherents::InherentIdentifier; use application_crypto::KeyTypeId; -use polkadot_core_primitives::DownwardMessage; + +pub use runtime_primitives::traits::{BlakeTwo256, Hash as HashT, Verify, IdentifyAccount}; +pub use polkadot_core_primitives::*; +pub use parity_scale_codec::Compact; pub use polkadot_parachain::primitives::{ Id, ParachainDispatchOrigin, LOWEST_USER_ID, UpwardMessage, HeadData, BlockData, @@ -171,100 +173,6 @@ pub struct DutyRoster { pub validator_duty: Vec, } -/// The unique (during session) index of a core. -#[derive(Encode, Decode, Default, PartialOrd, Ord, Eq, PartialEq, Clone, Copy)] -#[cfg_attr(feature = "std", derive(Debug))] -pub struct CoreIndex(pub u32); - -impl From for CoreIndex { - fn from(i: u32) -> CoreIndex { - CoreIndex(i) - } -} - -/// The unique (during session) index of a validator group. -#[derive(Encode, Decode, Default, Clone, Copy)] -#[cfg_attr(feature = "std", derive(Eq, Hash, PartialEq, Debug))] -pub struct GroupIndex(pub u32); - -impl From for GroupIndex { - fn from(i: u32) -> GroupIndex { - GroupIndex(i) - } -} - -/// A claim on authoring the next block for a given parathread. -#[derive(Clone, Encode, Decode, Default)] -#[cfg_attr(feature = "std", derive(PartialEq, Debug))] -pub struct ParathreadClaim(pub Id, pub CollatorId); - -/// An entry tracking a claim to ensure it does not pass the maximum number of retries. -#[derive(Clone, Encode, Decode, Default)] -#[cfg_attr(feature = "std", derive(PartialEq, Debug))] -pub struct ParathreadEntry { - /// The claim. - pub claim: ParathreadClaim, - /// Number of retries. - pub retries: u32, -} - -/// What is occupying a specific availability core. -#[derive(Clone, Encode, Decode)] -#[cfg_attr(feature = "std", derive(PartialEq, Debug))] -pub enum CoreOccupied { - /// A parathread. - Parathread(ParathreadEntry), - /// A parachain. - Parachain, -} - -/// The assignment type. -#[derive(Clone, Encode, Decode)] -#[cfg_attr(feature = "std", derive(PartialEq, Debug))] -pub enum AssignmentKind { - /// A parachain. - Parachain, - /// A parathread. - Parathread(CollatorId, u32), -} - -/// How a free core is scheduled to be assigned. -#[derive(Clone, Encode, Decode)] -#[cfg_attr(feature = "std", derive(PartialEq, Debug))] -pub struct CoreAssignment { - /// The core that is assigned. - pub core: CoreIndex, - /// The unique ID of the para that is assigned to the core. - pub para_id: Id, - /// The kind of the assignment. - pub kind: AssignmentKind, - /// The index of the validator group assigned to the core. - pub group_idx: GroupIndex, -} - -impl CoreAssignment { - /// Get the ID of a collator who is required to collate this block. - pub fn required_collator(&self) -> Option<&CollatorId> { - match self.kind { - AssignmentKind::Parachain => None, - AssignmentKind::Parathread(ref id, _) => Some(id), - } - } - - /// Get the `CoreOccupied` from this. - pub fn to_core_occupied(&self) -> CoreOccupied { - match self.kind { - AssignmentKind::Parachain => CoreOccupied::Parachain, - AssignmentKind::Parathread(ref collator, retries) => CoreOccupied::Parathread( - ParathreadEntry { - claim: ParathreadClaim(self.para_id, collator.clone()), - retries, - } - ), - } - } -} - /// Extra data that is needed along with the other fields in a `CandidateReceipt` /// to fully validate the candidate. /// @@ -505,7 +413,6 @@ impl + Encode> AbridgedCandidateReceipt { /// the relay-chain block in which context it should be executed, which implies /// any blockchain state that must be referenced. pub fn hash(&self) -> Hash { - use runtime_primitives::traits::{BlakeTwo256, Hash}; BlakeTwo256::hash_of(self) } } @@ -687,7 +594,6 @@ impl PoVBlock { /// Compute hash of block data. #[cfg(feature = "std")] pub fn hash(&self) -> Hash { - use runtime_primitives::traits::{BlakeTwo256, Hash}; BlakeTwo256::hash_of(&self) } } @@ -716,16 +622,6 @@ pub struct ErasureChunk { pub proof: Vec>, } -/// Parachain header raw bytes wrapper type. -#[derive(PartialEq, Eq)] -#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] -pub struct Header(#[cfg_attr(feature = "std", serde(with="bytes"))] pub Vec); - -/// Activity 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); - /// Statements that can be made about parachain candidates. These are the /// actual values that are signed. #[derive(Clone, PartialEq, Eq, Encode, Decode, Hash)] @@ -854,87 +750,6 @@ impl FeeSchedule { } } -/// A bitfield concerning availability of backed candidates. -#[derive(PartialEq, Eq, Clone, Encode, Decode)] -#[cfg_attr(feature = "std", derive(Debug))] -pub struct AvailabilityBitfield(pub BitVec); - -impl From> for AvailabilityBitfield { - fn from(inner: BitVec) -> Self { - AvailabilityBitfield(inner) - } -} - -/// A bitfield signed by a particular validator about the availability of pending candidates. -pub type SignedAvailabilityBitfield = Signed; - -/// A set of signed availability bitfields. Should be sorted by validator index, ascending. -pub type SignedAvailabilityBitfields = Vec; - -/// A backed (or backable, depending on context) candidate. -// TODO: yes, this is roughly the same as AttestedCandidate. -// After https://github.com/paritytech/polkadot/issues/1250 -// they should be unified to this type. -#[derive(Encode, Decode, Clone, PartialEq, Eq, RuntimeDebug)] -pub struct BackedCandidate { - /// The candidate referred to. - pub candidate: AbridgedCandidateReceipt, - /// The validity votes themselves, expressed as signatures. - pub validity_votes: Vec, - /// The indices of the validators within the group, expressed as a bitfield. - pub validator_indices: BitVec, -} - -/// Verify the backing of the given candidate. -/// -/// Provide a lookup from the index of a validator within the group assigned to this para, -/// as opposed to the index of the validator within the overall validator set, as well as -/// the number of validators in the group. -/// -/// Also provide the signing context. -/// -/// Returns either an error, indicating that one of the signatures was invalid or that the index -/// was out-of-bounds, or the number of signatures checked. -pub fn check_candidate_backing + Encode>( - backed: &BackedCandidate, - signing_context: &SigningContext, - group_len: usize, - validator_lookup: impl Fn(usize) -> Option, -) -> Result { - if backed.validator_indices.len() != group_len { - return Err(()) - } - - if backed.validity_votes.len() > group_len { - return Err(()) - } - - // this is known, even in runtime, to be blake2-256. - let hash: Hash = backed.candidate.hash(); - - let mut signed = 0; - for ((val_in_group_idx, _), attestation) in backed.validator_indices.iter().enumerate() - .filter(|(_, signed)| **signed) - .zip(backed.validity_votes.iter()) - { - let validator_id = validator_lookup(val_in_group_idx).ok_or(())?; - let payload = attestation.signed_payload(hash.clone(), signing_context); - let sig = attestation.signature(); - - if sig.verify(&payload[..], &validator_id) { - signed += 1; - } else { - return Err(()) - } - } - - if signed != backed.validity_votes.len() { - return Err(()) - } - - Ok(signed) -} - sp_api::decl_runtime_apis! { /// The API for querying the state of parachains on-chain. #[api_version(3)] @@ -1098,6 +913,55 @@ impl, RealPayload: Encode> Signed for u8 { + fn from(err: ValidityError) -> Self { + err as u8 + } +} + +/// App-specific crypto used for reporting equivocation/misbehavior in BABE, +/// GRANDPA and Parachains, described in the white paper as the fisherman role. +/// Any rewards for misbehavior reporting will be paid out to this account. +pub mod fisherman { + use super::{Signature, Verify}; + use primitives::crypto::KeyTypeId; + + /// Key type for the reporting module. Used for reporting BABE, GRANDPA + /// and Parachain equivocations. + pub const KEY_TYPE: KeyTypeId = KeyTypeId(*b"fish"); + + mod app { + use application_crypto::{app_crypto, sr25519}; + app_crypto!(sr25519, super::KEY_TYPE); + } + + /// Identity of the equivocation/misbehavior reporter. + pub type FishermanId = app::Public; + + /// An `AppCrypto` type to allow submitting signed transactions using the fisherman + /// application key as signer. + pub struct FishermanAppCrypto; + impl frame_system::offchain::AppCrypto<::Signer, Signature> for FishermanAppCrypto { + type RuntimeAppPublic = FishermanId; + type GenericSignature = primitives::sr25519::Signature; + type GenericPublic = primitives::sr25519::Public; + } +} + + #[cfg(test)] mod tests { use super::*; diff --git a/primitives/src/v1.rs b/primitives/src/v1.rs new file mode 100644 index 0000000000..9fb3d1662e --- /dev/null +++ b/primitives/src/v1.rs @@ -0,0 +1,478 @@ +// Copyright 2017-2020 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 . + +//! V1 Primitives. + +use sp_std::prelude::*; +use parity_scale_codec::{Encode, Decode}; +use bitvec::vec::BitVec; + +use primitives::RuntimeDebug; +use runtime_primitives::traits::AppVerify; +use inherents::InherentIdentifier; + +use runtime_primitives::traits::{BlakeTwo256, Hash as HashT}; + +// Export some core primitives. +pub use polkadot_core_primitives::v1::{ + BlockNumber, Moment, Signature, AccountPublic, AccountId, AccountIndex, + ChainId, Hash, Nonce, Balance, Header, Block, BlockId, UncheckedExtrinsic, + Remark, DownwardMessage, +}; + +// Export some polkadot-parachain primitives +pub use polkadot_parachain::primitives::{ + Id, ParachainDispatchOrigin, LOWEST_USER_ID, UpwardMessage, HeadData, BlockData, + ValidationCode, +}; + +// Export some basic parachain primitives from v0. +pub use crate::v0::{ + CollatorId, CollatorSignature, PARACHAIN_KEY_TYPE_ID, ValidatorId, ValidatorIndex, + ValidatorSignature, SigningContext, Signed, ValidityAttestation, + CompactStatement, SignedStatement, ErasureChunk, EncodeAs, +}; + +// More exports from v0 for std. +#[cfg(feature = "std")] +pub use crate::v0::{ValidatorPair, CollatorPair}; + +/// Unique identifier for the Inclusion Inherent +pub const INCLUSION_INHERENT_IDENTIFIER: InherentIdentifier = *b"inclusn0"; + +/// Get a collator signature payload on a relay-parent, block-data combo. +pub fn collator_signature_payload>( + relay_parent: &H, + para_id: &Id, + pov_hash: &Hash, +) -> [u8; 68] { + // 32-byte hash length is protected in a test below. + let mut payload = [0u8; 68]; + + payload[0..32].copy_from_slice(relay_parent.as_ref()); + u32::from(*para_id).using_encoded(|s| payload[32..32 + s.len()].copy_from_slice(s)); + payload[36..68].copy_from_slice(pov_hash.as_ref()); + + payload +} + +fn check_collator_signature>( + relay_parent: &H, + para_id: &Id, + pov_hash: &Hash, + collator: &CollatorId, + signature: &CollatorSignature, +) -> Result<(),()> { + let payload = collator_signature_payload(relay_parent, para_id, pov_hash); + if signature.verify(&payload[..], collator) { + Ok(()) + } else { + Err(()) + } +} + +/// A unique descriptor of the candidate receipt. +#[derive(PartialEq, Eq, Clone, Encode, Decode)] +#[cfg_attr(feature = "std", derive(Debug, Default))] +pub struct CandidateDescriptor { + /// The ID of the para this is a candidate for. + pub para_id: Id, + /// The hash of the relay-chain block this is executed in the context of. + pub relay_parent: H, + /// The collator's sr25519 public key. + pub collator: CollatorId, + /// Signature on blake2-256 of components of this receipt: + /// The parachain index, the relay parent, and the pov_hash. + pub signature: CollatorSignature, + /// The blake2-256 hash of the pov. + pub pov_hash: Hash, +} + +impl> CandidateDescriptor { + /// Check the signature of the collator within this descriptor. + pub fn check_collator_signature(&self) -> Result<(), ()> { + check_collator_signature( + &self.relay_parent, + &self.para_id, + &self.pov_hash, + &self.collator, + &self.signature, + ) + } +} + +/// A candidate-receipt. +#[derive(PartialEq, Eq, Clone, Encode, Decode)] +#[cfg_attr(feature = "std", derive(Debug, Default))] +pub struct CandidateReceipt { + /// The descriptor of the candidate. + pub descriptor: CandidateDescriptor, + /// The hash of the encoded commitments made as a result of candidate execution. + pub commitments_hash: Hash, +} + +impl CandidateReceipt { + /// Get a reference to the candidate descriptor. + pub fn descriptor(&self) -> &CandidateDescriptor { + &self.descriptor + } + + /// Computes the blake2-256 hash of the receipt. + pub fn hash(&self) -> Hash where H: Encode { + BlakeTwo256::hash_of(self) + } +} + +/// All data pertaining to the execution of a para candidate. +#[derive(PartialEq, Eq, Clone, Encode, Decode)] +#[cfg_attr(feature = "std", derive(Debug, Default))] +pub struct FullCandidateReceipt { + /// The inner candidate receipt. + pub inner: CandidateReceipt, + /// The global validation schedule. + pub global_validation: GlobalValidationSchedule, + /// The local validation data. + pub local_validation: LocalValidationData, +} + +/// A candidate-receipt with commitments directly included. +#[derive(PartialEq, Eq, Clone, Encode, Decode)] +#[cfg_attr(feature = "std", derive(Debug, Default))] +pub struct CommittedCandidateReceipt { + /// The descriptor of the candidate. + pub descriptor: CandidateDescriptor, + /// The commitments of the candidate receipt. + pub commitments: CandidateCommitments, +} + +impl CommittedCandidateReceipt { + /// Get a reference to the candidate descriptor. + pub fn descriptor(&self) -> &CandidateDescriptor { + &self.descriptor + } +} + +impl CommittedCandidateReceipt { + /// Transforms this into a plain CandidateReceipt. + pub fn to_plain(&self) -> CandidateReceipt { + CandidateReceipt { + descriptor: self.descriptor.clone(), + commitments_hash: self.commitments.hash(), + } + } + + /// Computes the hash of the committed candidate receipt. + /// + /// This computes the canonical hash, not the hash of the directly encoded data. + /// Thus this is a shortcut for `candidate.to_plain().hash()`. + pub fn hash(&self) -> Hash where H: Encode { + self.to_plain().hash() + } +} + +impl PartialOrd for CommittedCandidateReceipt { + fn partial_cmp(&self, other: &Self) -> Option { + Some(self.cmp(other)) + } +} + +impl Ord for CommittedCandidateReceipt { + fn cmp(&self, other: &Self) -> sp_std::cmp::Ordering { + // TODO: compare signatures or something more sane + // https://github.com/paritytech/polkadot/issues/222 + self.descriptor().para_id.cmp(&other.descriptor().para_id) + .then_with(|| self.commitments.head_data.cmp(&other.commitments.head_data)) + } +} + +/// Extra data that is needed along with the other fields in a `CandidateReceipt` +/// to fully validate the candidate. These fields are parachain-specific. +#[derive(PartialEq, Eq, Clone, Encode, Decode)] +#[cfg_attr(feature = "std", derive(Debug, Default))] +pub struct LocalValidationData { + /// The parent head-data. + pub parent_head: HeadData, + /// The balance of the parachain at the moment of validation. + pub balance: Balance, + /// The blake2-256 hash of the validation code used to execute the candidate. + pub validation_code_hash: Hash, + /// Whether the parachain is allowed to upgrade its validation code. + /// + /// This is `Some` if so, and contains the number of the minimum relay-chain + /// height at which the upgrade will be applied, if an upgrade is signaled + /// now. + /// + /// A parachain should enact its side of the upgrade at the end of the first + /// parablock executing in the context of a relay-chain block with at least this + /// height. This may be equal to the current perceived relay-chain block height, in + /// which case the code upgrade should be applied at the end of the signaling + /// block. + pub code_upgrade_allowed: Option, +} + +/// Extra data that is needed along with the other fields in a `CandidateReceipt` +/// to fully validate the candidate. +/// +/// These are global parameters that apply to all candidates in a block. +#[derive(PartialEq, Eq, Clone, Encode, Decode)] +#[cfg_attr(feature = "std", derive(Debug, Default))] +pub struct GlobalValidationSchedule { + /// The maximum code size permitted, in bytes. + pub max_code_size: u32, + /// The maximum head-data size permitted, in bytes. + pub max_head_data_size: u32, + /// The relay-chain block number this is in the context of. + pub block_number: BlockNumber, +} + +/// Commitments made in a `CandidateReceipt`. Many of these are outputs of validation. +#[derive(PartialEq, Eq, Clone, Encode, Decode)] +#[cfg_attr(feature = "std", derive(Debug, Default))] +pub struct CandidateCommitments { + /// Fees paid from the chain to the relay chain validators. + pub fees: Balance, + /// Messages destined to be interpreted by the Relay chain itself. + pub upward_messages: Vec, + /// The root of a block's erasure encoding Merkle tree. + pub erasure_root: Hash, + /// New validation code. + pub new_validation_code: Option, + /// The head-data produced as a result of execution. + pub head_data: HeadData, +} + +impl CandidateCommitments { + /// Compute the blake2-256 hash of the commitments. + pub fn hash(&self) -> Hash { + BlakeTwo256::hash_of(self) + } +} + +/// A Proof-of-Validity +#[derive(PartialEq, Eq, Clone, Encode, Decode)] +#[cfg_attr(feature = "std", derive(Debug))] +pub struct PoV { + /// The block witness data. + pub block_data: BlockData, +} + +impl PoV { + /// Get the blake2-256 hash of the PoV. + #[cfg(feature = "std")] + pub fn hash(&self) -> Hash { + BlakeTwo256::hash_of(self) + } +} + +/// A bitfield concerning availability of backed candidates. +#[derive(PartialEq, Eq, Clone, Encode, Decode)] +#[cfg_attr(feature = "std", derive(Debug))] +pub struct AvailabilityBitfield(pub BitVec); + +impl From> for AvailabilityBitfield { + fn from(inner: BitVec) -> Self { + AvailabilityBitfield(inner) + } +} + +/// A bitfield signed by a particular validator about the availability of pending candidates. +pub type SignedAvailabilityBitfield = Signed; + +/// A set of signed availability bitfields. Should be sorted by validator index, ascending. +pub type SignedAvailabilityBitfields = Vec; + +/// A backed (or backable, depending on context) candidate. +#[derive(Encode, Decode, Clone, PartialEq, Eq, RuntimeDebug)] +pub struct BackedCandidate { + /// The candidate referred to. + pub candidate: CommittedCandidateReceipt, + /// The validity votes themselves, expressed as signatures. + pub validity_votes: Vec, + /// The indices of the validators within the group, expressed as a bitfield. + pub validator_indices: BitVec, +} + +impl BackedCandidate { + /// Get a reference to the descriptor of the para. + pub fn descriptor(&self) -> &CandidateDescriptor { + &self.candidate.descriptor + } +} + +/// Verify the backing of the given candidate. +/// +/// Provide a lookup from the index of a validator within the group assigned to this para, +/// as opposed to the index of the validator within the overall validator set, as well as +/// the number of validators in the group. +/// +/// Also provide the signing context. +/// +/// Returns either an error, indicating that one of the signatures was invalid or that the index +/// was out-of-bounds, or the number of signatures checked. +pub fn check_candidate_backing + Clone + Encode>( + backed: &BackedCandidate, + signing_context: &SigningContext, + group_len: usize, + validator_lookup: impl Fn(usize) -> Option, +) -> Result { + if backed.validator_indices.len() != group_len { + return Err(()) + } + + if backed.validity_votes.len() > group_len { + return Err(()) + } + + // this is known, even in runtime, to be blake2-256. + let hash: Hash = backed.candidate.hash(); + + let mut signed = 0; + for ((val_in_group_idx, _), attestation) in backed.validator_indices.iter().enumerate() + .filter(|(_, signed)| **signed) + .zip(backed.validity_votes.iter()) + { + let validator_id = validator_lookup(val_in_group_idx).ok_or(())?; + let payload = attestation.signed_payload(hash.clone(), signing_context); + let sig = attestation.signature(); + + if sig.verify(&payload[..], &validator_id) { + signed += 1; + } else { + return Err(()) + } + } + + if signed != backed.validity_votes.len() { + return Err(()) + } + + Ok(signed) +} + +/// The unique (during session) index of a core. +#[derive(Encode, Decode, Default, PartialOrd, Ord, Eq, PartialEq, Clone, Copy)] +#[cfg_attr(feature = "std", derive(Debug))] +pub struct CoreIndex(pub u32); + +impl From for CoreIndex { + fn from(i: u32) -> CoreIndex { + CoreIndex(i) + } +} + +/// The unique (during session) index of a validator group. +#[derive(Encode, Decode, Default, Clone, Copy)] +#[cfg_attr(feature = "std", derive(Eq, Hash, PartialEq, Debug))] +pub struct GroupIndex(pub u32); + +impl From for GroupIndex { + fn from(i: u32) -> GroupIndex { + GroupIndex(i) + } +} + +/// A claim on authoring the next block for a given parathread. +#[derive(Clone, Encode, Decode, Default)] +#[cfg_attr(feature = "std", derive(PartialEq, Debug))] +pub struct ParathreadClaim(pub Id, pub CollatorId); + +/// An entry tracking a claim to ensure it does not pass the maximum number of retries. +#[derive(Clone, Encode, Decode, Default)] +#[cfg_attr(feature = "std", derive(PartialEq, Debug))] +pub struct ParathreadEntry { + /// The claim. + pub claim: ParathreadClaim, + /// Number of retries. + pub retries: u32, +} + +/// What is occupying a specific availability core. +#[derive(Clone, Encode, Decode)] +#[cfg_attr(feature = "std", derive(PartialEq, Debug))] +pub enum CoreOccupied { + /// A parathread. + Parathread(ParathreadEntry), + /// A parachain. + Parachain, +} + +/// The assignment type. +#[derive(Clone, Encode, Decode)] +#[cfg_attr(feature = "std", derive(PartialEq, Debug))] +pub enum AssignmentKind { + /// A parachain. + Parachain, + /// A parathread. + Parathread(CollatorId, u32), +} + +/// How a free core is scheduled to be assigned. +#[derive(Clone, Encode, Decode)] +#[cfg_attr(feature = "std", derive(PartialEq, Debug))] +pub struct CoreAssignment { + /// The core that is assigned. + pub core: CoreIndex, + /// The unique ID of the para that is assigned to the core. + pub para_id: Id, + /// The kind of the assignment. + pub kind: AssignmentKind, + /// The index of the validator group assigned to the core. + pub group_idx: GroupIndex, +} + +impl CoreAssignment { + /// Get the ID of a collator who is required to collate this block. + pub fn required_collator(&self) -> Option<&CollatorId> { + match self.kind { + AssignmentKind::Parachain => None, + AssignmentKind::Parathread(ref id, _) => Some(id), + } + } + + /// Get the `CoreOccupied` from this. + pub fn to_core_occupied(&self) -> CoreOccupied { + match self.kind { + AssignmentKind::Parachain => CoreOccupied::Parachain, + AssignmentKind::Parathread(ref collator, retries) => CoreOccupied::Parathread( + ParathreadEntry { + claim: ParathreadClaim(self.para_id, collator.clone()), + retries, + } + ), + } + } +} + +/// Validation data omitted from most candidate descriptor structs, as it can be derived from the +/// relay-parent. +#[derive(Clone, Encode, Decode)] +#[cfg_attr(feature = "std", derive(PartialEq, Debug))] +pub struct OmittedValidationData { + /// The global validation schedule. + pub global_validation: GlobalValidationSchedule, + /// The local validation data. + pub local_validation: LocalValidationData, +} + +/// This is the data we keep available for each candidate included in the relay chain. +#[derive(Clone, Encode, Decode)] +#[cfg_attr(feature = "std", derive(PartialEq, Debug))] +pub struct AvailableData { + /// The Proof-of-Validation of the candidate. + pub pov: PoV, + /// The omitted validation data. + pub omitted_validation: OmittedValidationData, +} diff --git a/roadmap/implementers-guide/src/types/availability.md b/roadmap/implementers-guide/src/types/availability.md index 3362908d6b..be42c7a927 100644 --- a/roadmap/implementers-guide/src/types/availability.md +++ b/roadmap/implementers-guide/src/types/availability.md @@ -9,7 +9,7 @@ A bitfield [signed](backing.md#signed-wrapper) by a particular validator about t ```rust -pub type SignedAvailabilityBitfield = Signed; +type SignedAvailabilityBitfield = Signed; struct Bitfields(Vec<(SignedAvailabilityBitfield)>), // bitfields sorted by validator index, ascending ``` @@ -21,3 +21,50 @@ Often referred to as PoV, this is a type-safe wrapper around bytes (`Vec`) w ```rust struct PoV(Vec); ``` + +## Omitted Validation Data + +Validation data that is often omitted from types describing candidates as it can be derived from the relay-parent of the candidate. However, with the expectation of state pruning, these are best kept available elsewhere as well. + +This contains the [`GlobalValidationSchedule`](candidate.md#globalvalidationschedule) and [`LocalValidationData`](candidate.md#localvalidationdata) + +```rust +struct OmittedValidationData { + /// The global validation schedule. + global_validation: GlobalValidationSchedule, + /// The local validation data. + local_validation: LocalValidationData, +} +``` + + +## Available Data + +This is the data we want to keep available for each [candidate](candidate.md) included in the relay chain. + +```rust +struct AvailableData { + /// The Proof-of-Validation of the candidate. + pov: PoV, + /// The omitted validation data. + omitted_validation: OmittedValidationData, +} +``` + +> TODO: With XCMP, we also need to keep available the outgoing messages as a result of para-validation. + +## Erasure Chunk + +The [`AvailableData`](#availabledata) is split up into an erasure-coding as part of the availability process. Each validator gets a chunk. This describes one of those chunks, along with its proof against a merkle root hash, which should be apparent from context, and is the `erasure_root` field of a [`CandidateDescriptor`](candidate.md#candidatedescriptor). + + +```rust +struct ErasureChunk { + /// The erasure-encoded chunk of data belonging to the candidate block. + chunk: Vec, + /// The index of this erasure-encoded chunk of data. + index: u32, + /// Proof for this chunk's branch in the Merkle tree. + proof: Vec>, +} +``` diff --git a/roadmap/implementers-guide/src/types/candidate.md b/roadmap/implementers-guide/src/types/candidate.md index fdba6919e5..0ed38590a7 100644 --- a/roadmap/implementers-guide/src/types/candidate.md +++ b/roadmap/implementers-guide/src/types/candidate.md @@ -1,6 +1,7 @@ # Candidate Types Para candidates are some of the most common types, both within the runtime and on the Node-side. +Candidates are the fundamental datatype for advancing parachains and parathreads, encapsulating the collator's signature, the context of the parablock, the commitments to the output, and a commitment to the data which proves it valid. In a way, this entire guide is about these candidates: how they are scheduled, constructed, backed, included, and challenged. @@ -179,3 +180,24 @@ struct SigningContext { session_index: SessionIndex, } ``` + +## Validation Outputs + +This struct encapsulates the outputs of candidate validation. + +```rust +struct ValidationOutputs { + /// The head-data produced by validation. + head_data: HeadData, + /// The global validation schedule. + global_validation_schedule: GlobalValidationSchedule, + /// The local validation data. + local_validation_data: LocalValidationData, + /// Upwards messages to the relay chain. + upwards_messages: Vec, + /// Fees paid to the validators of the relay-chain. + fees: Balance, + /// The new validation code submitted by the execution, if any. + new_validation_code: Option, +} +``` diff --git a/roadmap/implementers-guide/src/types/overseer-protocol.md b/roadmap/implementers-guide/src/types/overseer-protocol.md index 1e59eedff8..b822508f4a 100644 --- a/roadmap/implementers-guide/src/types/overseer-protocol.md +++ b/roadmap/implementers-guide/src/types/overseer-protocol.md @@ -91,6 +91,7 @@ enum CandidateBackingMessage { GetBackedCandidates(Hash, ResponseChannel>), /// Note that the Candidate Backing subsystem should second the given candidate in the context of the /// given relay-parent (ref. by hash). This candidate must be validated using the provided PoV. + /// The PoV is expected to match the `pov_hash` in the descriptor. Second(Hash, CandidateReceipt, PoV), /// Note a peer validator's statement about a particular candidate. Disagreements about validity must be escalated /// to a broader check by Misbehavior Arbitration. Agreements are simply tallied until a quorum is reached. @@ -282,29 +283,41 @@ enum StatementDistributionMessage { ## Validation Request Type -Various modules request that the [Candidate Validation subsystem](../node/utility/candidate-validation.md) validate a block with this message +Various modules request that the [Candidate Validation subsystem](../node/utility/candidate-validation.md) validate a block with this message. It returns [`ValidationOutputs`](candidate.md#validationoutputs) for successful validation. ```rust /// Result of the validation of the candidate. enum ValidationResult { - /// Candidate is valid. - Valid, + /// Candidate is valid, and here are the outputs. In practice, this should be a shared type + /// so that validation caching can be done. + Valid(ValidationOutputs), /// Candidate is invalid. Invalid, } +/// Messages issued to the candidate validation subsystem. +/// +/// ## Validation Requests +/// +/// Validation requests made to the subsystem should return an error only on internal error. +/// Otherwise, they should return either `Ok(ValidationResult::Valid(_))` or `Ok(ValidationResult::Invalid)`. enum CandidateValidationMessage { - /// Validate a candidate with provided parameters. Returns `Err` if an only if an internal - /// error is encountered. - /// In case no internal error was encontered it returns a tuple containing the result of - /// validation and `GlobalValidationSchedule` and `LocalValidationData` structures that - /// may be used by the caller to make the candidate available. - /// A bad candidate will return `Ok((ValidationResult::Invalid, _, _)`, while a good one will - /// return `Ok((ValidationResult::Valid, _, _))`. - Validate( - Hash, CandidateReceipt, HeadData, PoV, ResponseChannel< - Result<(ValidationResult, GlobalValidationSchedule, LocalValidationData)> - >), + /// Validate a candidate with provided parameters. This will implicitly attempt to gather the + /// `OmittedValidationData` and `ValidationCode` from the runtime API of the chain, + /// based on the `relay_parent` of the `CandidateDescriptor`. + /// If there is no state available which can provide this data, an error is returned. + ValidateFromChainState(CandidateDescriptor, PoV, ResponseChannel>), + + /// Validate a candidate with provided parameters. Explicitly provide the `OmittedValidationData` + /// and `ValidationCode` so this can do full validation without needing to access the state of + /// the relay-chain. + ValidateFromExhaustive( + OmittedValidationData, + ValidationCode, + CandidateDescriptor, + PoV, + ResponseChannel>, + ), } ``` diff --git a/rpc/src/lib.rs b/rpc/src/lib.rs index 6bddc8ad8d..c73b478329 100644 --- a/rpc/src/lib.rs +++ b/rpc/src/lib.rs @@ -20,7 +20,7 @@ use std::sync::Arc; -use polkadot_primitives::{Block, BlockNumber, AccountId, Nonce, Balance, Hash}; +use polkadot_primitives::v0::{Block, BlockNumber, AccountId, Nonce, Balance, Hash}; use sp_api::ProvideRuntimeApi; use txpool_api::TransactionPool; use sp_blockchain::{HeaderBackend, HeaderMetadata, Error as BlockChainError}; diff --git a/runtime/common/src/attestations.rs b/runtime/common/src/attestations.rs index f27874117a..e7a6854bbb 100644 --- a/runtime/common/src/attestations.rs +++ b/runtime/common/src/attestations.rs @@ -28,7 +28,7 @@ use frame_support::{ weights::DispatchClass, }; -use primitives::{Hash, parachain::{AttestedCandidate, AbridgedCandidateReceipt, Id as ParaId}}; +use primitives::v0::{Hash, AttestedCandidate, AbridgedCandidateReceipt, Id as ParaId}; use sp_runtime::RuntimeDebug; use sp_staking::SessionIndex; diff --git a/runtime/common/src/claims.rs b/runtime/common/src/claims.rs index fd8c1c1c88..6efc3d31d7 100644 --- a/runtime/common/src/claims.rs +++ b/runtime/common/src/claims.rs @@ -35,7 +35,7 @@ use sp_runtime::{ TransactionSource, TransactionValidityError, }, }; -use primitives::ValidityError; +use primitives::v0::ValidityError; type CurrencyOf = <::VestingSchedule as VestingSchedule<::AccountId>>::Currency; type BalanceOf = as Currency<::AccountId>>::Balance; diff --git a/runtime/common/src/crowdfund.rs b/runtime/common/src/crowdfund.rs index ee2b740745..fc233d107a 100644 --- a/runtime/common/src/crowdfund.rs +++ b/runtime/common/src/crowdfund.rs @@ -79,7 +79,7 @@ use sp_runtime::{ModuleId, use crate::slots; use codec::{Encode, Decode}; use sp_std::vec::Vec; -use primitives::parachain::{Id as ParaId, HeadData}; +use primitives::v0::{Id as ParaId, HeadData}; pub type BalanceOf = <::Currency as Currency<::AccountId>>::Balance; @@ -568,7 +568,7 @@ mod tests { }; use frame_support::traits::{Contains, ContainsLengthBound}; use sp_core::H256; - use primitives::parachain::{Info as ParaInfo, Id as ParaId, Scheduling, ValidationCode}; + use primitives::v0::{Info as ParaInfo, Id as ParaId, Scheduling, ValidationCode}; // The testing primitives are very useful for avoiding having to work with signatures // or public keys. `u64` is used as the `AccountId` and no `Signature`s are requried. use sp_runtime::{ diff --git a/runtime/common/src/impls.rs b/runtime/common/src/impls.rs index 543e2c739a..7e3b6d917f 100644 --- a/runtime/common/src/impls.rs +++ b/runtime/common/src/impls.rs @@ -26,8 +26,8 @@ pub struct ToAuthor(sp_std::marker::PhantomData); impl OnUnbalanced> for ToAuthor where R: balances::Trait + authorship::Trait, - ::AccountId: From, - ::AccountId: Into, + ::AccountId: From, + ::AccountId: Into, ::Event: From::AccountId, ::Balance, diff --git a/runtime/common/src/lib.rs b/runtime/common/src/lib.rs index da6fc5fcc2..d32db38e05 100644 --- a/runtime/common/src/lib.rs +++ b/runtime/common/src/lib.rs @@ -27,7 +27,7 @@ pub mod slots; pub mod crowdfund; pub mod impls; -use primitives::BlockNumber; +use primitives::v0::BlockNumber; use sp_runtime::{Perquintill, Perbill, FixedPointNumber, traits::Saturating}; use frame_support::{ parameter_types, traits::{Currency}, diff --git a/runtime/common/src/parachains.rs b/runtime/common/src/parachains.rs index 25d93b6fde..b0228a5a53 100644 --- a/runtime/common/src/parachains.rs +++ b/runtime/common/src/parachains.rs @@ -37,16 +37,13 @@ use frame_support::{ dispatch::IsSubType, weights::{DispatchClass, Weight}, }; -use primitives::{ - Balance, - BlockNumber, - parachain::{ - Id as ParaId, Chain, DutyRoster, AttestedCandidate, CompactStatement as Statement, ParachainDispatchOrigin, - UpwardMessage, ValidatorId, ActiveParas, CollatorId, Retriable, OmittedValidationData, - CandidateReceipt, GlobalValidationSchedule, AbridgedCandidateReceipt, - LocalValidationData, Scheduling, ValidityAttestation, NEW_HEADS_IDENTIFIER, PARACHAIN_KEY_TYPE_ID, - ValidatorSignature, SigningContext, HeadData, ValidationCode, - }, +use primitives::v0::{ + Balance, BlockNumber, + Id as ParaId, Chain, DutyRoster, AttestedCandidate, CompactStatement as Statement, ParachainDispatchOrigin, + UpwardMessage, ValidatorId, ActiveParas, CollatorId, Retriable, OmittedValidationData, + CandidateReceipt, GlobalValidationSchedule, AbridgedCandidateReceipt, + LocalValidationData, Scheduling, ValidityAttestation, NEW_HEADS_IDENTIFIER, PARACHAIN_KEY_TYPE_ID, + ValidatorSignature, SigningContext, HeadData, ValidationCode, Remark, DownwardMessage }; use frame_support::{ @@ -329,7 +326,7 @@ pub trait Trait: CreateSignedTransaction> + attestations::Trait + ses >; /// A type that converts the opaque hash type to exact one. - type BlockHashConversion: Convert; + type BlockHashConversion: Convert; } /// Origin for the parachains module. @@ -1681,13 +1678,10 @@ mod tests { }, testing::TestXt, }; - use primitives::{ - parachain::{ - CandidateReceipt, ValidityAttestation, ValidatorId, Info as ParaInfo, - Scheduling, CandidateCommitments, - }, - BlockNumber, - Header, + use primitives::v0::{ + CandidateReceipt, ValidityAttestation, ValidatorId, Info as ParaInfo, + Scheduling, CandidateCommitments, + BlockNumber, Header, }; use keyring::Sr25519Keyring; use frame_support::{ @@ -1819,7 +1813,7 @@ mod tests { } mod time { - use primitives::{Moment, BlockNumber}; + use primitives::v0::{Moment, BlockNumber}; pub const MILLISECS_PER_BLOCK: Moment = 6000; pub const EPOCH_DURATION_IN_BLOCKS: BlockNumber = 1 * HOURS; // These time units are defined in number of blocks. @@ -2246,7 +2240,7 @@ mod tests { println!("session index {}", i); Staking::on_finalize(System::block_number()); System::set_block_number((i + 1).into()); - Timestamp::set_timestamp(System::block_number() as primitives::Moment * 6000); + Timestamp::set_timestamp(System::block_number() as primitives::v0::Moment * 6000); // In order to be able to use `System::parent_hash()` in the tests // we need to first get it via `System::finalize` and then set it diff --git a/runtime/common/src/registrar.rs b/runtime/common/src/registrar.rs index de152d9379..d7b9cb40ca 100644 --- a/runtime/common/src/registrar.rs +++ b/runtime/common/src/registrar.rs @@ -34,7 +34,7 @@ use frame_support::{ weights::{DispatchClass, Weight}, }; use system::{self, ensure_root, ensure_signed}; -use primitives::parachain::{ +use primitives::v0::{ Id as ParaId, CollatorId, Scheduling, LOWEST_USER_ID, SwapAux, Info as ParaInfo, ActiveParas, Retriable, ValidationCode, HeadData, }; @@ -213,7 +213,7 @@ fn build(config: &GenesisConfig) { Parachains::put(&only_ids); for (id, code, genesis) in p { - Paras::insert(id, &primitives::parachain::PARACHAIN_INFO); + Paras::insert(id, &primitives::v0::PARACHAIN_INFO); // no ingress -- a chain cannot be routed to until it is live. ::insert(&id, &code); ::insert(&id, &genesis); @@ -670,12 +670,10 @@ mod tests { AccountIdConversion, Extrinsic as ExtrinsicT, }, testing::{UintAuthorityId, TestXt}, KeyTypeId, Perbill, curve::PiecewiseLinear, }; - use primitives::{ - parachain::{ - ValidatorId, Info as ParaInfo, Scheduling, LOWEST_USER_ID, AttestedCandidate, - CandidateReceipt, HeadData, ValidityAttestation, CompactStatement as Statement, Chain, - CollatorPair, CandidateCommitments, - }, + use primitives::v0::{ + ValidatorId, Info as ParaInfo, Scheduling, LOWEST_USER_ID, AttestedCandidate, + CandidateReceipt, HeadData, ValidityAttestation, CompactStatement as Statement, Chain, + CollatorPair, CandidateCommitments, Balance, BlockNumber, Header, Signature, }; use frame_support::{ @@ -869,7 +867,7 @@ mod tests { // This is needed for a custom `AccountId` type which is `u64` in testing here. pub mod test_keys { use sp_core::{crypto::KeyTypeId, sr25519}; - use primitives::Signature; + use primitives::v0::Signature; pub const KEY_TYPE: KeyTypeId = KeyTypeId(*b"test"); diff --git a/runtime/common/src/slots.rs b/runtime/common/src/slots.rs index 5618a680c5..eb0a7aff7d 100644 --- a/runtime/common/src/slots.rs +++ b/runtime/common/src/slots.rs @@ -28,7 +28,7 @@ use frame_support::{ traits::{Currency, ReservableCurrency, WithdrawReason, ExistenceRequirement, Get, Randomness}, weights::{DispatchClass, Weight}, }; -use primitives::parachain::{ +use primitives::v0::{ SwapAux, PARACHAIN_INFO, Id as ParaId, ValidationCode, HeadData, }; use system::{ensure_signed, ensure_root}; @@ -890,8 +890,7 @@ mod tests { traits::{OnInitialize, OnFinalize} }; use balances; - use primitives::{BlockNumber, Header}; - use primitives::parachain::{Id as ParaId, Info as ParaInfo, Scheduling}; + use primitives::v0::{BlockNumber, Header, Id as ParaId, Info as ParaInfo, Scheduling}; impl_outer_origin! { pub enum Origin for Test {} diff --git a/runtime/kusama/src/constants.rs b/runtime/kusama/src/constants.rs index e06325d1bb..560d83347d 100644 --- a/runtime/kusama/src/constants.rs +++ b/runtime/kusama/src/constants.rs @@ -16,7 +16,7 @@ /// Money matters. pub mod currency { - use primitives::Balance; + use primitives::v0::Balance; pub const DOTS: Balance = 1_000_000_000_000; pub const DOLLARS: Balance = DOTS / 6; @@ -30,7 +30,7 @@ pub mod currency { /// Time and blocks. pub mod time { - use primitives::{Moment, BlockNumber}; + use primitives::v0::{Moment, BlockNumber}; // Kusama & mainnet pub const MILLISECS_PER_BLOCK: Moment = 6000; // Testnet @@ -55,7 +55,7 @@ pub mod time { /// Fee-related. pub mod fee { pub use sp_runtime::Perbill; - use primitives::Balance; + use primitives::v0::Balance; use runtime_common::ExtrinsicBaseWeight; use frame_support::weights::{ WeightToFeePolynomial, WeightToFeeCoefficient, WeightToFeeCoefficients, diff --git a/runtime/kusama/src/lib.rs b/runtime/kusama/src/lib.rs index ee25e8961d..569d055cca 100644 --- a/runtime/kusama/src/lib.rs +++ b/runtime/kusama/src/lib.rs @@ -23,9 +23,10 @@ use sp_std::prelude::*; use sp_core::u32_trait::{_1, _2, _3, _4, _5}; use codec::{Encode, Decode}; -use primitives::{ +use primitives::v0::{ + self as parachain, AccountId, AccountIndex, Balance, BlockNumber, Hash, Nonce, Signature, Moment, - parachain::{self, ActiveParas, AbridgedCandidateReceipt, SigningContext}, + ActiveParas, AbridgedCandidateReceipt, SigningContext, }; use runtime_common::{ attestations, claims, parachains, registrar, slots, SlowAdjustingFeeUpdate, @@ -560,7 +561,7 @@ impl grandpa::Trait for Runtime { type HandleEquivocation = grandpa::EquivocationHandler< Self::KeyOwnerIdentification, - primitives::fisherman::FishermanAppCrypto, + primitives::v0::fisherman::FishermanAppCrypto, Runtime, Offences, >; @@ -596,7 +597,7 @@ parameter_types! { } impl parachains::Trait for Runtime { - type AuthorityId = primitives::fisherman::FishermanAppCrypto; + type AuthorityId = primitives::v0::fisherman::FishermanAppCrypto; type Origin = Origin; type Call = Call; type ParachainCurrency = Balances; @@ -939,7 +940,7 @@ impl frame_support::traits::OnRuntimeUpgrade for CustomOnRuntimeUpgrade { construct_runtime! { pub enum Runtime where Block = Block, - NodeBlock = primitives::Block, + NodeBlock = primitives::v0::Block, UncheckedExtrinsic = UncheckedExtrinsic { // Basic stuff; balances is uncallable initially. @@ -1147,7 +1148,7 @@ sp_api::impl_runtime_apis! { fn signing_context() -> SigningContext { Parachains::signing_context() } - fn downward_messages(id: parachain::Id) -> Vec { + fn downward_messages(id: parachain::Id) -> Vec { Parachains::downward_messages(id) } } diff --git a/runtime/parachains/src/configuration.rs b/runtime/parachains/src/configuration.rs index 792dfe89a7..40688041b2 100644 --- a/runtime/parachains/src/configuration.rs +++ b/runtime/parachains/src/configuration.rs @@ -19,9 +19,7 @@ //! Configuration can change only at session boundaries and is buffered until then. use sp_std::prelude::*; -use primitives::{ - parachain::{ValidatorId}, -}; +use primitives::v1::ValidatorId; use frame_support::{ decl_storage, decl_module, decl_error, dispatch::DispatchResult, diff --git a/runtime/parachains/src/inclusion.rs b/runtime/parachains/src/inclusion.rs index 33a5e2d1e9..a2480f1c80 100644 --- a/runtime/parachains/src/inclusion.rs +++ b/runtime/parachains/src/inclusion.rs @@ -21,12 +21,10 @@ //! to included. use sp_std::prelude::*; -use primitives::{ - parachain::{ - ValidatorId, AbridgedCandidateReceipt, ValidatorIndex, Id as ParaId, - AvailabilityBitfield as AvailabilityBitfield, SignedAvailabilityBitfields, SigningContext, - BackedCandidate, CoreIndex, GroupIndex, CoreAssignment, - }, +use primitives::v1::{ + ValidatorId, CommittedCandidateReceipt, ValidatorIndex, Id as ParaId, + AvailabilityBitfield as AvailabilityBitfield, SignedAvailabilityBitfields, SigningContext, + BackedCandidate, CoreIndex, GroupIndex, CoreAssignment, }; use frame_support::{ decl_storage, decl_module, decl_error, ensure, dispatch::DispatchResult, IterableStorageMap, @@ -53,13 +51,15 @@ pub struct AvailabilityBitfieldRecord { } /// A backed candidate pending availability. +// TODO: split this type and change this to hold a plain `CandidateReceipt`. +// https://github.com/paritytech/polkadot/issues/1357 #[derive(Encode, Decode, PartialEq)] #[cfg_attr(test, derive(Debug))] pub struct CandidatePendingAvailability { /// The availability core this is assigned to. core: CoreIndex, /// The candidate receipt itself. - receipt: AbridgedCandidateReceipt, + receipt: CommittedCandidateReceipt, /// The received availability votes. One bit per validator. availability_votes: BitVec, /// The block number of the relay-parent of the receipt. @@ -213,7 +213,10 @@ impl Module { let validator_public = &validators[signed_bitfield.validator_index() as usize]; - signed_bitfield.check_signature(&signing_context, validator_public).map_err(|_| Error::::InvalidBitfieldSignature)?; + signed_bitfield.check_signature( + &signing_context, + validator_public, + ).map_err(|_| Error::::InvalidBitfieldSignature)?; last_index = Some(signed_bitfield.validator_index()); } @@ -331,11 +334,11 @@ impl Module { // list. 'a: for candidate in &candidates { - let para_id = candidate.candidate.parachain_index; + let para_id = candidate.descriptor().para_id; // we require that the candidate is in the context of the parent block. ensure!( - candidate.candidate.relay_parent == parent_hash, + candidate.descriptor().relay_parent == parent_hash, Error::::CandidateNotInParentContext, ); @@ -348,17 +351,17 @@ impl Module { ensure!(code_upgrade_allowed, Error::::PrematureCodeUpgrade); ensure!( - candidate.candidate.check_signature().is_ok(), + candidate.descriptor().check_collator_signature().is_ok(), Error::::NotCollatorSigned, ); for (i, assignment) in scheduled[skip..].iter().enumerate() { check_assignment_in_order(assignment)?; - if candidate.candidate.parachain_index == assignment.para_id { + if candidate.descriptor().para_id == assignment.para_id { if let Some(required_collator) = assignment.required_collator() { ensure!( - required_collator == &candidate.candidate.collator, + required_collator == &candidate.descriptor().collator, Error::::WrongCollator, ); } @@ -377,7 +380,7 @@ impl Module { // check the signatures in the backing and that it is a majority. { let maybe_amount_validated - = primitives::parachain::check_candidate_backing( + = primitives::v1::check_candidate_backing( &candidate, &signing_context, group_vals.len(), @@ -419,7 +422,7 @@ impl Module { // one more sweep for actually writing to storage. for (candidate, core) in candidates.into_iter().zip(core_indices.iter().cloned()) { - let para_id = candidate.candidate.parachain_index; + let para_id = candidate.descriptor().para_id; // initialize all availability votes to 0. let availability_votes: BitVec @@ -438,7 +441,7 @@ impl Module { fn enact_candidate( relay_parent_number: T::BlockNumber, - receipt: AbridgedCandidateReceipt, + receipt: CommittedCandidateReceipt, ) -> Weight { let commitments = receipt.commitments; let config = >::config(); @@ -447,15 +450,15 @@ impl Module { let mut weight = T::DbWeight::get().reads_writes(1, 0); if let Some(new_code) = commitments.new_validation_code { weight += >::schedule_code_upgrade( - receipt.parachain_index, + receipt.descriptor.para_id, new_code, relay_parent_number + config.validation_upgrade_delay, ); } weight + >::note_new_head( - receipt.parachain_index, - receipt.head_data, + receipt.descriptor.para_id, + commitments.head_data, relay_parent_number, ) } @@ -495,10 +498,11 @@ const fn availability_threshold(n_validators: usize) -> usize { mod tests { use super::*; - use primitives::{BlockNumber, Hash}; - use primitives::parachain::{ + use primitives::v1::{BlockNumber, Hash}; + use primitives::v1::{ SignedAvailabilityBitfield, CompactStatement as Statement, ValidityAttestation, CollatorId, - CandidateCommitments, SignedStatement, AssignmentKind, + CandidateCommitments, SignedStatement, CandidateDescriptor, HeadData, ValidationCode, + AssignmentKind, }; use frame_support::traits::{OnFinalize, OnInitialize}; use keyring::Sr25519Keyring; @@ -545,22 +549,22 @@ mod tests { fn collator_sign_candidate( collator: Sr25519Keyring, - candidate: &mut AbridgedCandidateReceipt, + candidate: &mut CommittedCandidateReceipt, ) { - candidate.collator = collator.public().into(); + candidate.descriptor.collator = collator.public().into(); - let payload = primitives::parachain::collator_signature_payload( - &candidate.relay_parent, - &candidate.parachain_index, - &candidate.pov_block_hash, + let payload = primitives::v1::collator_signature_payload( + &candidate.descriptor.relay_parent, + &candidate.descriptor.para_id, + &candidate.descriptor.pov_hash, ); - candidate.signature = collator.sign(&payload[..]).into(); - assert!(candidate.check_signature().is_ok()); + candidate.descriptor.signature = collator.sign(&payload[..]).into(); + assert!(candidate.descriptor().check_collator_signature().is_ok()); } fn back_candidate( - candidate: AbridgedCandidateReceipt, + candidate: CommittedCandidateReceipt, validators: &[Sr25519Keyring], group: &[ValidatorIndex], signing_context: &SigningContext, @@ -603,7 +607,7 @@ mod tests { BackingKind::Lacking => false, }; - let successfully_backed = primitives::parachain::check_candidate_backing( + let successfully_backed = primitives::v1::check_candidate_backing( &backed, signing_context, group.len(), @@ -674,6 +678,33 @@ mod tests { ) } + #[derive(Default)] + struct TestCandidateBuilder { + para_id: ParaId, + head_data: HeadData, + pov_hash: Hash, + relay_parent: Hash, + new_validation_code: Option, + } + + impl TestCandidateBuilder { + fn build(self) -> CommittedCandidateReceipt { + CommittedCandidateReceipt { + descriptor: CandidateDescriptor { + para_id: self.para_id, + pov_hash: self.pov_hash, + relay_parent: self.relay_parent, + ..Default::default() + }, + commitments: CandidateCommitments { + head_data: self.head_data, + new_validation_code: self.new_validation_code, + ..Default::default() + }, + } + } + } + #[test] fn collect_pending_cleans_up_pending() { let chain_a = ParaId::from(1); @@ -895,11 +926,11 @@ mod tests { >::insert(chain_a, CandidatePendingAvailability { core: CoreIndex::from(0), - receipt: AbridgedCandidateReceipt { - parachain_index: chain_a, + receipt: TestCandidateBuilder { + para_id: chain_a, head_data: vec![1, 2, 3, 4].into(), ..Default::default() - }, + }.build(), availability_votes: default_availability_votes(), relay_parent_number: 0, backed_in_number: 0, @@ -907,11 +938,11 @@ mod tests { >::insert(chain_b, CandidatePendingAvailability { core: CoreIndex::from(1), - receipt: AbridgedCandidateReceipt { - parachain_index: chain_b, + receipt: TestCandidateBuilder { + para_id: chain_b, head_data: vec![5, 6, 7, 8].into(), ..Default::default() - }, + }.build(), availability_votes: default_availability_votes(), relay_parent_number: 0, backed_in_number: 0, @@ -1043,12 +1074,12 @@ mod tests { // unscheduled candidate. { - let mut candidate = AbridgedCandidateReceipt { - parachain_index: chain_a, + let mut candidate = TestCandidateBuilder { + para_id: chain_a, relay_parent: System::parent_hash(), - pov_block_hash: Hash::from([1; 32]), + pov_hash: Hash::from([1; 32]), ..Default::default() - }; + }.build(); collator_sign_candidate( Sr25519Keyring::One, &mut candidate, @@ -1071,18 +1102,18 @@ mod tests { // candidates out of order. { - let mut candidate_a = AbridgedCandidateReceipt { - parachain_index: chain_a, + let mut candidate_a = TestCandidateBuilder { + para_id: chain_a, relay_parent: System::parent_hash(), - pov_block_hash: Hash::from([1; 32]), + pov_hash: Hash::from([1; 32]), ..Default::default() - }; - let mut candidate_b = AbridgedCandidateReceipt { - parachain_index: chain_b, + }.build(); + let mut candidate_b = TestCandidateBuilder { + para_id: chain_b, relay_parent: System::parent_hash(), - pov_block_hash: Hash::from([2; 32]), + pov_hash: Hash::from([2; 32]), ..Default::default() - }; + }.build(); collator_sign_candidate( Sr25519Keyring::One, @@ -1119,12 +1150,12 @@ mod tests { // candidate not backed. { - let mut candidate = AbridgedCandidateReceipt { - parachain_index: chain_a, + let mut candidate = TestCandidateBuilder { + para_id: chain_a, relay_parent: System::parent_hash(), - pov_block_hash: Hash::from([1; 32]), + pov_hash: Hash::from([1; 32]), ..Default::default() - }; + }.build(); collator_sign_candidate( Sr25519Keyring::One, &mut candidate, @@ -1150,12 +1181,12 @@ mod tests { let wrong_parent_hash = Hash::from([222; 32]); assert!(System::parent_hash() != wrong_parent_hash); - let mut candidate = AbridgedCandidateReceipt { - parachain_index: chain_a, + let mut candidate = TestCandidateBuilder { + para_id: chain_a, relay_parent: wrong_parent_hash, - pov_block_hash: Hash::from([1; 32]), + pov_hash: Hash::from([1; 32]), ..Default::default() - }; + }.build(); collator_sign_candidate( Sr25519Keyring::One, &mut candidate, @@ -1178,12 +1209,12 @@ mod tests { // candidate has wrong collator. { - let mut candidate = AbridgedCandidateReceipt { - parachain_index: thread_a, + let mut candidate = TestCandidateBuilder { + para_id: thread_a, relay_parent: System::parent_hash(), - pov_block_hash: Hash::from([1; 32]), + pov_hash: Hash::from([1; 32]), ..Default::default() - }; + }.build(); assert!(CollatorId::from(Sr25519Keyring::One.public()) != thread_collator); collator_sign_candidate( @@ -1212,12 +1243,12 @@ mod tests { // candidate not well-signed by collator. { - let mut candidate = AbridgedCandidateReceipt { - parachain_index: thread_a, + let mut candidate = TestCandidateBuilder { + para_id: thread_a, relay_parent: System::parent_hash(), - pov_block_hash: Hash::from([1; 32]), + pov_hash: Hash::from([1; 32]), ..Default::default() - }; + }.build(); assert_eq!(CollatorId::from(Sr25519Keyring::Two.public()), thread_collator); collator_sign_candidate( @@ -1225,7 +1256,8 @@ mod tests { &mut candidate, ); - candidate.pov_block_hash = Hash::from([2; 32]); + // change the candidate after signing. + candidate.descriptor.pov_hash = Hash::from([2; 32]); let backed = back_candidate( candidate, @@ -1244,12 +1276,12 @@ mod tests { // para occupied - reject. { - let mut candidate = AbridgedCandidateReceipt { - parachain_index: chain_a, + let mut candidate = TestCandidateBuilder { + para_id: chain_a, relay_parent: System::parent_hash(), - pov_block_hash: Hash::from([1; 32]), + pov_hash: Hash::from([1; 32]), ..Default::default() - }; + }.build(); collator_sign_candidate( Sr25519Keyring::One, @@ -1283,16 +1315,13 @@ mod tests { // interfering code upgrade - reject { - let mut candidate = AbridgedCandidateReceipt { - parachain_index: chain_a, + let mut candidate = TestCandidateBuilder { + para_id: chain_a, relay_parent: System::parent_hash(), - pov_block_hash: Hash::from([1; 32]), - commitments: CandidateCommitments { - new_validation_code: Some(vec![5, 6, 7, 8].into()), - ..Default::default() - }, + pov_hash: Hash::from([1; 32]), + new_validation_code: Some(vec![5, 6, 7, 8].into()), ..Default::default() - }; + }.build(); collator_sign_candidate( Sr25519Keyring::One, @@ -1381,34 +1410,34 @@ mod tests { group_idx: GroupIndex::from(2), }; - let mut candidate_a = AbridgedCandidateReceipt { - parachain_index: chain_a, + let mut candidate_a = TestCandidateBuilder { + para_id: chain_a, relay_parent: System::parent_hash(), - pov_block_hash: Hash::from([1; 32]), + pov_hash: Hash::from([1; 32]), ..Default::default() - }; + }.build(); collator_sign_candidate( Sr25519Keyring::One, &mut candidate_a, ); - let mut candidate_b = AbridgedCandidateReceipt { - parachain_index: chain_b, + let mut candidate_b = TestCandidateBuilder { + para_id: chain_b, relay_parent: System::parent_hash(), - pov_block_hash: Hash::from([2; 32]), + pov_hash: Hash::from([2; 32]), ..Default::default() - }; + }.build(); collator_sign_candidate( Sr25519Keyring::One, &mut candidate_b, ); - let mut candidate_c = AbridgedCandidateReceipt { - parachain_index: thread_a, + let mut candidate_c = TestCandidateBuilder { + para_id: thread_a, relay_parent: System::parent_hash(), - pov_block_hash: Hash::from([3; 32]), + pov_hash: Hash::from([3; 32]), ..Default::default() - }; + }.build(); collator_sign_candidate( Sr25519Keyring::Two, &mut candidate_c, diff --git a/runtime/parachains/src/inclusion_inherent.rs b/runtime/parachains/src/inclusion_inherent.rs index 282b6f3b8a..6d06961b46 100644 --- a/runtime/parachains/src/inclusion_inherent.rs +++ b/runtime/parachains/src/inclusion_inherent.rs @@ -22,9 +22,8 @@ //! this module. use sp_std::prelude::*; -use primitives::{ - inclusion_inherent, - parachain::{BackedCandidate, SignedAvailabilityBitfields}, +use primitives::v1::{ + BackedCandidate, SignedAvailabilityBitfields, INCLUSION_INHERENT_IDENTIFIER, }; use frame_support::{ decl_error, decl_module, decl_storage, ensure, @@ -127,7 +126,7 @@ decl_module! { impl ProvideInherent for Module { type Call = Call; type Error = MakeFatalError<()>; - const INHERENT_IDENTIFIER: InherentIdentifier = inclusion_inherent::INHERENT_IDENTIFIER; + const INHERENT_IDENTIFIER: InherentIdentifier = INCLUSION_INHERENT_IDENTIFIER; fn create_inherent(data: &InherentData) -> Option { data.get_data(&Self::INHERENT_IDENTIFIER) diff --git a/runtime/parachains/src/initializer.rs b/runtime/parachains/src/initializer.rs index 9c0cda2969..0c4f83ccce 100644 --- a/runtime/parachains/src/initializer.rs +++ b/runtime/parachains/src/initializer.rs @@ -21,9 +21,7 @@ use sp_std::prelude::*; use frame_support::weights::Weight; -use primitives::{ - parachain::{ValidatorId}, -}; +use primitives::v1::ValidatorId; use frame_support::{ decl_storage, decl_module, decl_error, traits::Randomness, }; diff --git a/runtime/parachains/src/mock.rs b/runtime/parachains/src/mock.rs index 9cc9f2329b..8eb45359da 100644 --- a/runtime/parachains/src/mock.rs +++ b/runtime/parachains/src/mock.rs @@ -24,10 +24,7 @@ use sp_runtime::{ BlakeTwo256, IdentityLookup, }, }; -use primitives::{ - BlockNumber, - Header, -}; +use primitives::v1::{BlockNumber, Header}; use frame_support::{ impl_outer_origin, impl_outer_dispatch, parameter_types, weights::Weight, traits::Randomness as RandomnessT, diff --git a/runtime/parachains/src/paras.rs b/runtime/parachains/src/paras.rs index 8c095751b3..0117089f11 100644 --- a/runtime/parachains/src/paras.rs +++ b/runtime/parachains/src/paras.rs @@ -26,8 +26,8 @@ use sp_std::prelude::*; use sp_std::marker::PhantomData; use sp_runtime::traits::One; -use primitives::{ - parachain::{Id as ParaId, ValidationCode, HeadData}, +use primitives::v1::{ + Id as ParaId, ValidationCode, HeadData, }; use frame_support::{ decl_storage, decl_module, decl_error, @@ -541,7 +541,7 @@ impl Module { #[cfg(test)] mod tests { use super::*; - use primitives::BlockNumber; + use primitives::v1::BlockNumber; use frame_support::traits::{OnFinalize, OnInitialize}; use crate::mock::{new_test_ext, Paras, System, GenesisConfig as MockGenesisConfig}; diff --git a/runtime/parachains/src/scheduler.rs b/runtime/parachains/src/scheduler.rs index 772ab25cf4..9cc2bd72bd 100644 --- a/runtime/parachains/src/scheduler.rs +++ b/runtime/parachains/src/scheduler.rs @@ -37,11 +37,9 @@ use sp_std::prelude::*; use sp_std::convert::TryInto; -use primitives::{ - parachain::{ - Id as ParaId, ValidatorIndex, CoreAssignment, CoreOccupied, CoreIndex, AssignmentKind, - GroupIndex, ParathreadClaim, ParathreadEntry, - }, +use primitives::v1::{ + Id as ParaId, ValidatorIndex, CoreAssignment, CoreOccupied, CoreIndex, AssignmentKind, + GroupIndex, ParathreadClaim, ParathreadEntry, }; use frame_support::{ decl_storage, decl_module, decl_error, @@ -586,7 +584,7 @@ impl Module { mod tests { use super::*; - use primitives::{BlockNumber, parachain::{CollatorId, ValidatorId}}; + use primitives::v1::{BlockNumber, ValidatorId, CollatorId}; use frame_support::traits::{OnFinalize, OnInitialize}; use keyring::Sr25519Keyring; diff --git a/runtime/polkadot/src/constants.rs b/runtime/polkadot/src/constants.rs index 331d97f364..8ad5478bca 100644 --- a/runtime/polkadot/src/constants.rs +++ b/runtime/polkadot/src/constants.rs @@ -16,7 +16,7 @@ /// Money matters. pub mod currency { - use primitives::Balance; + use primitives::v0::Balance; pub const DOTS: Balance = 1_000_000_000_000; pub const DOLLARS: Balance = DOTS / 100; // 10_000_000_000 @@ -30,7 +30,7 @@ pub mod currency { /// Time and blocks. pub mod time { - use primitives::{Moment, BlockNumber}; + use primitives::v0::{Moment, BlockNumber}; pub const MILLISECS_PER_BLOCK: Moment = 6000; pub const SLOT_DURATION: Moment = MILLISECS_PER_BLOCK; pub const EPOCH_DURATION_IN_BLOCKS: BlockNumber = 4 * HOURS; @@ -47,7 +47,7 @@ pub mod time { /// Fee-related. pub mod fee { pub use sp_runtime::Perbill; - use primitives::Balance; + use primitives::v0::Balance; use runtime_common::ExtrinsicBaseWeight; use frame_support::weights::{ WeightToFeePolynomial, WeightToFeeCoefficient, WeightToFeeCoefficients, diff --git a/runtime/polkadot/src/lib.rs b/runtime/polkadot/src/lib.rs index abd9687164..258a7b4781 100644 --- a/runtime/polkadot/src/lib.rs +++ b/runtime/polkadot/src/lib.rs @@ -31,9 +31,10 @@ use runtime_common::{ use sp_std::prelude::*; use sp_core::u32_trait::{_1, _2, _3, _4, _5}; use codec::{Encode, Decode}; -use primitives::{ +use primitives::v0::{ + self as parachain, AccountId, AccountIndex, Balance, BlockNumber, Hash, Nonce, Signature, Moment, - parachain::{self, ActiveParas, AbridgedCandidateReceipt, SigningContext}, + ActiveParas, AbridgedCandidateReceipt, SigningContext, }; use sp_runtime::{ create_runtime_str, generic, impl_opaque_keys, ModuleId, @@ -629,7 +630,7 @@ impl grandpa::Trait for Runtime { type HandleEquivocation = grandpa::EquivocationHandler< Self::KeyOwnerIdentification, - primitives::fisherman::FishermanAppCrypto, + primitives::v0::fisherman::FishermanAppCrypto, Runtime, Offences, >; @@ -666,7 +667,7 @@ parameter_types! { } impl parachains::Trait for Runtime { - type AuthorityId = primitives::fisherman::FishermanAppCrypto; + type AuthorityId = primitives::v0::fisherman::FishermanAppCrypto; type Origin = Origin; type Call = Call; type ParachainCurrency = Balances; @@ -943,7 +944,7 @@ impl frame_support::traits::OnRuntimeUpgrade for CustomOnRuntimeUpgrade { construct_runtime! { pub enum Runtime where Block = Block, - NodeBlock = primitives::Block, + NodeBlock = primitives::v0::Block, UncheckedExtrinsic = UncheckedExtrinsic { // Basic stuff; balances is uncallable initially. @@ -1147,7 +1148,7 @@ sp_api::impl_runtime_apis! { fn signing_context() -> SigningContext { Parachains::signing_context() } - fn downward_messages(id: parachain::Id) -> Vec { + fn downward_messages(id: parachain::Id) -> Vec { Parachains::downward_messages(id) } } diff --git a/runtime/polkadot/tests/weights.rs b/runtime/polkadot/tests/weights.rs index 533783a4e4..3cdb719958 100644 --- a/runtime/polkadot/tests/weights.rs +++ b/runtime/polkadot/tests/weights.rs @@ -29,7 +29,7 @@ use frame_support::{ use keyring::AccountKeyring; use polkadot_runtime::constants::currency::*; use polkadot_runtime::{self, Runtime}; -use primitives::AccountId; +use primitives::v0::AccountId; use runtime_common::MaximumBlockWeight; use democracy::Call as DemocracyCall; diff --git a/runtime/test-runtime/client/src/lib.rs b/runtime/test-runtime/client/src/lib.rs index 2554f4f1c8..58282d32b4 100644 --- a/runtime/test-runtime/client/src/lib.rs +++ b/runtime/test-runtime/client/src/lib.rs @@ -326,7 +326,7 @@ pub fn new_native_executor() -> sc_executor::NativeExecutor { /// The index of the block must be provided to calculate a valid timestamp for the block. The value starts at 0 and /// should be incremented by one for every block produced. pub fn needed_extrinsics( - heads: Vec, + heads: Vec, i: u64, ) -> Vec { use polkadot_runtime_common::parachains; diff --git a/runtime/test-runtime/src/constants.rs b/runtime/test-runtime/src/constants.rs index b0431e55f2..ac90417b21 100644 --- a/runtime/test-runtime/src/constants.rs +++ b/runtime/test-runtime/src/constants.rs @@ -16,7 +16,7 @@ /// Money matters. pub mod currency { - use primitives::Balance; + use primitives::v0::Balance; pub const DOTS: Balance = 1_000_000_000_000; pub const DOLLARS: Balance = DOTS; @@ -26,7 +26,7 @@ pub mod currency { /// Time and blocks. pub mod time { - use primitives::{Moment, BlockNumber}; + use primitives::v0::{Moment, BlockNumber}; // Testnet pub const MILLISECS_PER_BLOCK: Moment = 1000; pub const SLOT_DURATION: Moment = MILLISECS_PER_BLOCK; @@ -45,7 +45,7 @@ pub mod time { /// Fee-related. pub mod fee { pub use sp_runtime::Perbill; - use primitives::Balance; + use primitives::v0::Balance; use runtime_common::ExtrinsicBaseWeight; use frame_support::weights::{ WeightToFeePolynomial, WeightToFeeCoefficient, WeightToFeeCoefficients, diff --git a/runtime/test-runtime/src/lib.rs b/runtime/test-runtime/src/lib.rs index 57ceffa4a9..45d5a04c31 100644 --- a/runtime/test-runtime/src/lib.rs +++ b/runtime/test-runtime/src/lib.rs @@ -22,9 +22,10 @@ use rstd::prelude::*; use codec::{Encode, Decode}; -use primitives::{ +use primitives::v0::{ + self as parachain, AccountId, AccountIndex, Balance, BlockNumber, Hash as HashT, Nonce, Signature, Moment, - parachain::{self, ActiveParas, AbridgedCandidateReceipt, SigningContext}, ValidityError, + ActiveParas, AbridgedCandidateReceipt, SigningContext, ValidityError, }; use runtime_common::{ attestations, claims, parachains, registrar, slots, SlowAdjustingFeeUpdate, @@ -375,7 +376,7 @@ parameter_types! { } impl parachains::Trait for Runtime { - type AuthorityId = primitives::fisherman::FishermanAppCrypto; + type AuthorityId = primitives::v0::fisherman::FishermanAppCrypto; type Origin = Origin; type Call = Call; type ParachainCurrency = Balances; @@ -521,7 +522,7 @@ impl sudo::Trait for Runtime { construct_runtime! { pub enum Runtime where Block = Block, - NodeBlock = primitives::Block, + NodeBlock = primitives::v0::Block, UncheckedExtrinsic = UncheckedExtrinsic { // Basic stuff; balances is uncallable initially. @@ -702,7 +703,7 @@ sp_api::impl_runtime_apis! { fn signing_context() -> SigningContext { Parachains::signing_context() } - fn downward_messages(id: parachain::Id) -> Vec { + fn downward_messages(id: parachain::Id) -> Vec { Parachains::downward_messages(id) } } diff --git a/runtime/westend/src/constants.rs b/runtime/westend/src/constants.rs index ac25d621d8..f59a384fba 100644 --- a/runtime/westend/src/constants.rs +++ b/runtime/westend/src/constants.rs @@ -16,7 +16,7 @@ /// Money matters. pub mod currency { - use primitives::Balance; + use primitives::v0::Balance; pub const DOTS: Balance = 1_000_000_000_000; pub const DOLLARS: Balance = DOTS; @@ -30,7 +30,7 @@ pub mod currency { /// Time and blocks. pub mod time { - use primitives::{Moment, BlockNumber}; + use primitives::v0::{Moment, BlockNumber}; pub const MILLISECS_PER_BLOCK: Moment = 6000; pub const SLOT_DURATION: Moment = MILLISECS_PER_BLOCK; pub const EPOCH_DURATION_IN_BLOCKS: BlockNumber = 1 * HOURS; @@ -47,7 +47,7 @@ pub mod time { /// Fee-related. pub mod fee { pub use sp_runtime::Perbill; - use primitives::Balance; + use primitives::v0::Balance; use runtime_common::ExtrinsicBaseWeight; use frame_support::weights::{ WeightToFeePolynomial, WeightToFeeCoefficient, WeightToFeeCoefficients, diff --git a/runtime/westend/src/lib.rs b/runtime/westend/src/lib.rs index 41613bbb01..a40c4e3dd5 100644 --- a/runtime/westend/src/lib.rs +++ b/runtime/westend/src/lib.rs @@ -22,9 +22,10 @@ use sp_std::prelude::*; use codec::{Encode, Decode}; -use primitives::{ +use primitives::v0::{ + self as parachain, AccountId, AccountIndex, Balance, BlockNumber, Hash, Nonce, Signature, Moment, - parachain::{self, ActiveParas, AbridgedCandidateReceipt, SigningContext}, + ActiveParas, AbridgedCandidateReceipt, SigningContext, }; use runtime_common::{ attestations, parachains, registrar, SlowAdjustingFeeUpdate, @@ -385,7 +386,7 @@ impl grandpa::Trait for Runtime { type HandleEquivocation = grandpa::EquivocationHandler< Self::KeyOwnerIdentification, - primitives::fisherman::FishermanAppCrypto, + primitives::v0::fisherman::FishermanAppCrypto, Runtime, Offences, >; @@ -421,7 +422,7 @@ parameter_types! { } impl parachains::Trait for Runtime { - type AuthorityId = primitives::fisherman::FishermanAppCrypto; + type AuthorityId = primitives::v0::fisherman::FishermanAppCrypto; type Origin = Origin; type Call = Call; type ParachainCurrency = Balances; @@ -698,7 +699,7 @@ impl proxy::Trait for Runtime { construct_runtime! { pub enum Runtime where Block = Block, - NodeBlock = primitives::Block, + NodeBlock = primitives::v0::Block, UncheckedExtrinsic = UncheckedExtrinsic { // Basic stuff; balances is uncallable initially. @@ -887,7 +888,7 @@ sp_api::impl_runtime_apis! { fn signing_context() -> SigningContext { Parachains::signing_context() } - fn downward_messages(id: parachain::Id) -> Vec { + fn downward_messages(id: parachain::Id) -> Vec { Parachains::downward_messages(id) } } diff --git a/service/src/chain_spec.rs b/service/src/chain_spec.rs index 5e1bfbbdba..fe8d98d055 100644 --- a/service/src/chain_spec.rs +++ b/service/src/chain_spec.rs @@ -17,7 +17,7 @@ //! Polkadot chain configurations. use sp_core::{Pair, Public, crypto::UncheckedInto, sr25519}; -use polkadot_primitives::{AccountId, AccountPublic, parachain::ValidatorId}; +use polkadot_primitives::v0::{AccountId, AccountPublic, ValidatorId}; use polkadot_runtime as polkadot; use kusama_runtime as kusama; use westend_runtime as westend; @@ -48,9 +48,9 @@ const DEFAULT_PROTOCOL_ID: &str = "dot"; #[serde(rename_all = "camelCase")] pub struct Extensions { /// Block numbers with known hashes. - pub fork_blocks: sc_client_api::ForkBlocks, + pub fork_blocks: sc_client_api::ForkBlocks, /// Known bad block hashes. - pub bad_blocks: sc_client_api::BadBlocks, + pub bad_blocks: sc_client_api::BadBlocks, } /// The `ChainSpec parametrised for polkadot runtime`. diff --git a/service/src/grandpa_support.rs b/service/src/grandpa_support.rs index 794b4e4fc1..89a0691b36 100644 --- a/service/src/grandpa_support.rs +++ b/service/src/grandpa_support.rs @@ -16,7 +16,7 @@ //! Polkadot-specific GRANDPA integration utilities. -use polkadot_primitives::Hash; +use polkadot_primitives::v0::Hash; use sp_runtime::traits::{Block as BlockT, NumberFor}; /// A custom GRANDPA voting rule that "pauses" voting (i.e. keeps voting for the @@ -98,7 +98,7 @@ impl grandpa::VotingRule for PauseAfterBlockFor Vec<( grandpa_primitives::SetId, - (Hash, polkadot_primitives::BlockNumber), + (Hash, polkadot_primitives::v0::BlockNumber), grandpa_primitives::AuthorityList, )> { use sp_core::crypto::Ss58Codec; diff --git a/service/src/lib.rs b/service/src/lib.rs index eaa5f9682f..d0b443ea7d 100644 --- a/service/src/lib.rs +++ b/service/src/lib.rs @@ -22,7 +22,7 @@ mod client; use std::sync::Arc; use std::time::Duration; -use polkadot_primitives::{parachain, Hash, BlockId, AccountId, Nonce, Balance}; +use polkadot_primitives::v0::{self as parachain, Hash, BlockId, AccountId, Nonce, Balance}; #[cfg(feature = "full-node")] use polkadot_network::{legacy::gossip::Known, protocol as network_protocol}; use service::{error::Error as ServiceError, ServiceBuilder}; @@ -42,8 +42,7 @@ pub use sc_consensus::LongestChain; pub use sp_api::{Core as CoreApi, ConstructRuntimeApi, ProvideRuntimeApi, StateBackend}; pub use sp_runtime::traits::{HashFor, NumberFor}; pub use consensus_common::{SelectChain, BlockImport, block_validation::Chain}; -pub use polkadot_primitives::parachain::{CollatorId, ParachainHost}; -pub use polkadot_primitives::Block; +pub use polkadot_primitives::v0::{Block, CollatorId, ParachainHost}; pub use sp_runtime::traits::{Block as BlockT, self as runtime_traits, BlakeTwo256}; pub use chain_spec::{PolkadotChainSpec, KusamaChainSpec, WestendChainSpec}; #[cfg(feature = "full-node")] diff --git a/statement-table/src/generic.rs b/statement-table/src/generic.rs index 11c6a3c024..cb95d74d62 100644 --- a/statement-table/src/generic.rs +++ b/statement-table/src/generic.rs @@ -28,7 +28,7 @@ use std::collections::hash_map::{HashMap, Entry}; use std::hash::Hash; use std::fmt::Debug; -use primitives::parachain::{ValidityAttestation as PrimitiveValidityAttestation, ValidatorSignature}; +use primitives::v1::{ValidityAttestation as PrimitiveValidityAttestation, ValidatorSignature}; use codec::{Encode, Decode}; diff --git a/statement-table/src/lib.rs b/statement-table/src/lib.rs index 97d0cda763..fed60ded0d 100644 --- a/statement-table/src/lib.rs +++ b/statement-table/src/lib.rs @@ -16,75 +16,87 @@ pub mod generic; -pub use generic::Table; - -use primitives::parachain::{ - Id, AbridgedCandidateReceipt, CompactStatement as PrimitiveStatement, ValidatorSignature, ValidatorIndex, -}; -use primitives::Hash; - -/// Statements about candidates on the network. -pub type Statement = generic::Statement; - -/// Signed statements about candidates. -pub type SignedStatement = generic::SignedStatement< - AbridgedCandidateReceipt, - Hash, - ValidatorIndex, - ValidatorSignature, ->; - -/// Kinds of misbehavior, along with proof. -pub type Misbehavior = generic::Misbehavior< - AbridgedCandidateReceipt, - Hash, - ValidatorIndex, - ValidatorSignature, ->; - -/// A summary of import of a statement. -pub type Summary = generic::Summary; - -/// 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: ValidatorIndex, group: &Id) -> bool; - - /// requisite number of votes for validity from a group. - fn requisite_votes(&self, group: &Id) -> usize; -} - -impl generic::Context for C { - type AuthorityId = ValidatorIndex; - type Digest = Hash; - type GroupId = Id; - type Signature = ValidatorSignature; - type Candidate = AbridgedCandidateReceipt; - - fn candidate_digest(candidate: &AbridgedCandidateReceipt) -> Hash { - candidate.hash() - } - - fn candidate_group(candidate: &AbridgedCandidateReceipt) -> Id { - candidate.parachain_index.clone() - } - - fn is_member_of(&self, authority: &Self::AuthorityId, group: &Id) -> bool { - Context::is_member_of(self, *authority, group) - } - - fn requisite_votes(&self, group: &Id) -> usize { - Context::requisite_votes(self, group) +pub use generic::{Table, Context}; + +/// Concrete instantiations suitable for v0 primitives. +pub mod v0 { + use crate::generic; + use primitives::v0::{ + Hash, + Id, AbridgedCandidateReceipt, CompactStatement as PrimitiveStatement, ValidatorSignature, ValidatorIndex, + }; + + /// Statements about candidates on the network. + pub type Statement = generic::Statement; + + /// Signed statements about candidates. + pub type SignedStatement = generic::SignedStatement< + AbridgedCandidateReceipt, + Hash, + ValidatorIndex, + ValidatorSignature, + >; + + /// Kinds of misbehavior, along with proof. + pub type Misbehavior = generic::Misbehavior< + AbridgedCandidateReceipt, + Hash, + ValidatorIndex, + ValidatorSignature, + >; + + /// A summary of import of a statement. + pub type Summary = generic::Summary; + + impl<'a> From<&'a Statement> for PrimitiveStatement { + fn from(s: &'a Statement) -> PrimitiveStatement { + match *s { + generic::Statement::Valid(s) => PrimitiveStatement::Valid(s), + generic::Statement::Invalid(s) => PrimitiveStatement::Invalid(s), + generic::Statement::Candidate(ref s) => PrimitiveStatement::Candidate(s.hash()), + } + } } } -impl<'a> From<&'a Statement> for PrimitiveStatement { - fn from(s: &'a Statement) -> PrimitiveStatement { - match *s { - generic::Statement::Valid(s) => PrimitiveStatement::Valid(s), - generic::Statement::Invalid(s) => PrimitiveStatement::Invalid(s), - generic::Statement::Candidate(ref s) => PrimitiveStatement::Candidate(s.hash()), +/// Concrete instantiations suitable for v1 primitives. +pub mod v1 { + use crate::generic; + use primitives::v1::{ + Hash, + Id, CommittedCandidateReceipt, CompactStatement as PrimitiveStatement, + ValidatorSignature, ValidatorIndex, + }; + + /// Statements about candidates on the network. + pub type Statement = generic::Statement; + + /// Signed statements about candidates. + pub type SignedStatement = generic::SignedStatement< + CommittedCandidateReceipt, + Hash, + ValidatorIndex, + ValidatorSignature, + >; + + /// Kinds of misbehavior, along with proof. + pub type Misbehavior = generic::Misbehavior< + CommittedCandidateReceipt, + Hash, + ValidatorIndex, + ValidatorSignature, + >; + + /// A summary of import of a statement. + pub type Summary = generic::Summary; + + impl<'a> From<&'a Statement> for PrimitiveStatement { + fn from(s: &'a Statement) -> PrimitiveStatement { + match *s { + generic::Statement::Valid(s) => PrimitiveStatement::Valid(s), + generic::Statement::Invalid(s) => PrimitiveStatement::Invalid(s), + generic::Statement::Candidate(ref s) => PrimitiveStatement::Candidate(s.hash()), + } } } } diff --git a/validation/src/block_production.rs b/validation/src/block_production.rs index 30b7ac3ccd..4804ba230c 100644 --- a/validation/src/block_production.rs +++ b/validation/src/block_production.rs @@ -28,8 +28,8 @@ use std::{ use sp_blockchain::HeaderBackend; use block_builder::{BlockBuilderApi, BlockBuilderProvider}; use consensus::{Proposal, RecordProof}; -use polkadot_primitives::{Block, Header}; -use polkadot_primitives::parachain::{ +use polkadot_primitives::v0::{Block, Header}; +use polkadot_primitives::v0::{ ParachainHost, NEW_HEADS_IDENTIFIER, }; use runtime_primitives::traits::{DigestFor, HashFor}; diff --git a/validation/src/collation.rs b/validation/src/collation.rs index a2e682a066..b79b049b22 100644 --- a/validation/src/collation.rs +++ b/validation/src/collation.rs @@ -21,11 +21,9 @@ use std::sync::Arc; -use polkadot_primitives::{ +use polkadot_primitives::v0::{ BlakeTwo256, Block, Hash, HashT, - parachain::{ - CollatorId, ParachainHost, Id as ParaId, Collation, ErasureChunk, CollationInfo, - }, + CollatorId, ParachainHost, Id as ParaId, Collation, ErasureChunk, CollationInfo, }; use polkadot_erasure_coding as erasure; use sp_api::ProvideRuntimeApi; diff --git a/validation/src/error.rs b/validation/src/error.rs index 83b51ed236..5fd990a071 100644 --- a/validation/src/error.rs +++ b/validation/src/error.rs @@ -16,7 +16,7 @@ //! Errors that can occur during the validation process. -use polkadot_primitives::{parachain::ValidatorId, Hash}; +use polkadot_primitives::v0::{ValidatorId, Hash}; /// Error type for validation #[derive(Debug, derive_more::Display, derive_more::From)] @@ -77,7 +77,7 @@ pub enum Error { CommitmentsMismatch, /// The parachain for which validation work is being done is not active. #[display(fmt = "Parachain {:?} is not active", _0)] - InactiveParachain(polkadot_primitives::parachain::Id), + InactiveParachain(polkadot_primitives::v0::Id), /// Block data is too big #[display(fmt = "Block data is too big (maximum allowed size: {}, actual size: {})", size, max_size)] BlockDataTooBig { size: u64, max_size: u64 }, diff --git a/validation/src/lib.rs b/validation/src/lib.rs index 667f66e275..a5b1c1d5c2 100644 --- a/validation/src/lib.rs +++ b/validation/src/lib.rs @@ -34,7 +34,7 @@ use std::{ sync::Arc, }; use codec::Encode; -use polkadot_primitives::parachain::{ +use polkadot_primitives::v0::{ Id as ParaId, Chain, DutyRoster, AbridgedCandidateReceipt, CompactStatement as PrimitiveStatement, PoVBlock, ErasureChunk, ValidatorSignature, ValidatorIndex, diff --git a/validation/src/pipeline.rs b/validation/src/pipeline.rs index b29285716d..f2a705ba10 100644 --- a/validation/src/pipeline.rs +++ b/validation/src/pipeline.rs @@ -19,12 +19,12 @@ use codec::Encode; use polkadot_erasure_coding as erasure; -use polkadot_primitives::parachain::{ +use polkadot_primitives::v0::{ CollationInfo, PoVBlock, LocalValidationData, GlobalValidationSchedule, OmittedValidationData, AvailableData, FeeSchedule, CandidateCommitments, ErasureChunk, ParachainHost, Id as ParaId, AbridgedCandidateReceipt, ValidationCode, }; -use polkadot_primitives::{Block, BlockId, Balance, Hash}; +use polkadot_primitives::v0::{Block, BlockId, Balance, Hash}; use parachain::{ wasm_executor::{self, ExecutionMode}, primitives::{UpwardMessage, ValidationParams}, @@ -125,7 +125,7 @@ impl<'a> ValidatedCandidate<'a> { omitted_validation, }; - let erasure_chunks = erasure::obtain_chunks( + let erasure_chunks = erasure::obtain_chunks_v0( n_validators, &available_data, )?; diff --git a/validation/src/shared_table/includable.rs b/validation/src/shared_table/includable.rs index 1396f66c59..317b9e0f7b 100644 --- a/validation/src/shared_table/includable.rs +++ b/validation/src/shared_table/includable.rs @@ -18,7 +18,7 @@ use std::collections::HashMap; use futures::channel::oneshot; -use polkadot_primitives::Hash; +use polkadot_primitives::v0::Hash; /// Track includability of a set of candidates, pub(super) fn track>(candidates: I) diff --git a/validation/src/shared_table/mod.rs b/validation/src/shared_table/mod.rs index fd6702a7e6..d42c9b7e56 100644 --- a/validation/src/shared_table/mod.rs +++ b/validation/src/shared_table/mod.rs @@ -21,11 +21,12 @@ use std::collections::hash_map::{HashMap, Entry}; use std::sync::Arc; use availability_store::{Store as AvailabilityStore}; -use table::{self, Table, Context as TableContextTrait}; -use polkadot_primitives::{Block, Hash}; -use polkadot_primitives::parachain::{ +use table::{v0 as table_v0, Table, Context as TableContextTrait}; +use polkadot_primitives::v0::{ + Block, Hash, Id as ParaId, AbridgedCandidateReceipt, ValidatorPair, ValidatorId, AttestedCandidate, ParachainHost, PoVBlock, ValidatorIndex, SigningContext, + ValidatorSignature, }; use parking_lot::Mutex; @@ -44,7 +45,7 @@ use crate::Error; mod includable; -pub use table::{SignedStatement, Statement}; +pub use table_v0::{SignedStatement, Statement}; pub use table::generic::Statement as GenericStatement; struct TableContext { @@ -54,9 +55,23 @@ struct TableContext { validators: Vec, } -impl table::Context for TableContext { - fn is_member_of(&self, authority: ValidatorIndex, group: &ParaId) -> bool { - let key = match self.validators.get(authority as usize) { +impl TableContextTrait for TableContext { + type AuthorityId = ValidatorIndex; + type Digest = Hash; + type GroupId = ParaId; + type Signature = ValidatorSignature; + type Candidate = AbridgedCandidateReceipt; + + fn candidate_digest(candidate: &AbridgedCandidateReceipt) -> Hash { + candidate.hash() + } + + fn candidate_group(candidate: &AbridgedCandidateReceipt) -> ParaId { + candidate.parachain_index + } + + fn is_member_of(&self, authority: &ValidatorIndex, group: &ParaId) -> bool { + let key = match self.validators.get(*authority as usize) { Some(val) => val, None => return false, }; @@ -84,7 +99,7 @@ impl TableContext { ) } - fn sign_statement(&self, statement: table::Statement) -> Option { + fn sign_statement(&self, statement: table_v0::Statement) -> Option { self.local_index().and_then(move |sender| self.key.as_ref() .map(|key| crate::sign_table_statement( @@ -93,7 +108,7 @@ impl TableContext { &self.signing_context, ).into() ) - .map(move |signature| table::SignedStatement { statement, signature, sender }) + .map(move |signature| table_v0::SignedStatement { statement, signature, sender }) ) } } @@ -145,7 +160,7 @@ impl SharedTableInner { &mut self, context: &TableContext, fetch_pov_block: impl Fn(&AbridgedCandidateReceipt) -> Fetch, - statement: table::SignedStatement, + statement: table_v0::SignedStatement, max_block_data_size: Option, ) -> Option( &self, fetch_pov_block: impl Fn(&AbridgedCandidateReceipt) -> Fetch, - statement: table::SignedStatement, + statement: table_v0::SignedStatement, ) -> Option> { @@ -487,7 +502,7 @@ impl SharedTable { iterable: I, ) -> U where - I: IntoIterator, + I: IntoIterator, U: ::std::iter::FromIterator>>, @@ -539,7 +554,7 @@ impl SharedTable { /// Get a set of candidates that can be proposed. pub fn proposed_set(&self) -> Vec { use table::generic::{ValidityAttestation as GAttestation}; - use polkadot_primitives::parachain::ValidityAttestation; + use polkadot_primitives::v0::ValidityAttestation; // we transform the types of the attestations gathered from the table // into the type expected by the runtime. This may do signature @@ -583,7 +598,7 @@ impl SharedTable { } /// Get all witnessed misbehavior. - pub fn get_misbehavior(&self) -> HashMap { + pub fn get_misbehavior(&self) -> HashMap { self.inner.lock().table.get_misbehavior().clone() } @@ -615,7 +630,7 @@ impl SharedTable { mod tests { use super::*; use sp_keyring::Sr25519Keyring; - use polkadot_primitives::parachain::{ + use polkadot_primitives::v0::{ BlockData, ErasureChunk, AvailableData, }; use polkadot_erasure_coding::{self as erasure}; @@ -706,7 +721,7 @@ mod tests { &validity_other_key.into(), &signing_context, ); - let signed_statement = ::table::generic::SignedStatement { + let signed_statement = table::generic::SignedStatement { statement: candidate_statement, signature: signature.into(), sender: validity_other_index, @@ -763,7 +778,7 @@ mod tests { &validity_other_key.into(), &signing_context, ); - let signed_statement = ::table::generic::SignedStatement { + let signed_statement = table::generic::SignedStatement { statement: candidate_statement, signature: signature.into(), sender: validity_other_index, @@ -860,7 +875,7 @@ mod tests { omitted_validation: Default::default(), }; - let chunks = erasure::obtain_chunks(n_validators, &available_data).unwrap(); + let chunks = erasure::obtain_chunks_v0(n_validators, &available_data).unwrap(); store.note_validator_index_and_n_validators( &relay_parent, @@ -947,7 +962,7 @@ mod tests { &validity_other_key.into(), &signing_context, ); - let signed_statement = ::table::generic::SignedStatement { + let signed_statement = table::generic::SignedStatement { statement: candidate_statement, signature: signature.into(), sender: validity_other_index, diff --git a/validation/src/validation_service/mod.rs b/validation/src/validation_service/mod.rs index d84b1be078..7f332f4c0d 100644 --- a/validation/src/validation_service/mod.rs +++ b/validation/src/validation_service/mod.rs @@ -32,8 +32,8 @@ use crate::pipeline::FullOutput; use sc_client_api::{BlockchainEvents, BlockBackend}; use consensus::SelectChain; use futures::prelude::*; -use polkadot_primitives::{Block, Hash, BlockId}; -use polkadot_primitives::parachain::{ +use polkadot_primitives::v0::{ + Block, Hash, BlockId, Chain, ParachainHost, Id as ParaId, ValidatorIndex, ValidatorId, ValidatorPair, CollationInfo, SigningContext, }; @@ -545,7 +545,7 @@ mod tests { use super::*; use futures::{executor, future::ready, channel::mpsc}; use availability_store::ErasureNetworking; - use polkadot_primitives::parachain::{ + use polkadot_primitives::v0::{ PoVBlock, AbridgedCandidateReceipt, ErasureChunk, ValidatorIndex, CollationInfo, DutyRoster, GlobalValidationSchedule, LocalValidationData, Retriable, CollatorId, BlockData, Chain, AvailableData, SigningContext, ValidationCode, @@ -706,7 +706,7 @@ mod tests { fn signing_context() -> SigningContext { Default::default() } - fn downward_messages(_: ParaId) -> Vec { + fn downward_messages(_: ParaId) -> Vec { Vec::new() } } -- GitLab From 9f1016d90c86a95e3debaf8a18c64d54c3a3ae24 Mon Sep 17 00:00:00 2001 From: Joseph Mark Date: Fri, 10 Jul 2020 07:58:02 +0200 Subject: [PATCH 058/192] Add Process.toml (#1361) * Add Process.toml * Apply suggestions from code review Co-authored-by: Robert Habermeier --- Process.toml | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 Process.toml diff --git a/Process.toml b/Process.toml new file mode 100644 index 0000000000..eaf03c1257 --- /dev/null +++ b/Process.toml @@ -0,0 +1,15 @@ +[Batch: Availability and Validity] +owner = "rphmeier" +whitelist = [] +matrix_room_id = "!wQXGIDhhJQSVXKqPwi:matrix.parity.io" + +[Batch: Codebase Restructure] +owner = "rphmeier" +whitelist = [] +matrix_room_id = "!wQXGIDhhJQSVXKqPwi:matrix.parity.io" + +[Cumulus] +owner = "bkchr" +whitelist = [] +matrix_room_id = "!wQXGIDhhJQSVXKqPwi:matrix.parity.io" + -- GitLab From 64d0c7ae7194d54fec6e8ca978dec9f2073c528e Mon Sep 17 00:00:00 2001 From: Peter Goodspeed-Niklaus Date: Fri, 10 Jul 2020 08:36:38 +0200 Subject: [PATCH 059/192] add more detail to provisioner block production section (#1370) Per https://github.com/paritytech/polkadot/commit/69ce9ff#r40392855 --- roadmap/implementers-guide/src/node/utility/provisioner.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/roadmap/implementers-guide/src/node/utility/provisioner.md b/roadmap/implementers-guide/src/node/utility/provisioner.md index f646e738c4..e88f79ebc6 100644 --- a/roadmap/implementers-guide/src/node/utility/provisioner.md +++ b/roadmap/implementers-guide/src/node/utility/provisioner.md @@ -40,7 +40,7 @@ Note that block authors must re-send a `ProvisionerMessage::RequestBlockAuthorsh ## Block Production -When a validator is selected by BABE to author a block, it becomes a block producer. The provisioner is the subsystem best suited to choosing which specific backed candidates and availability bitfields should be assembled into the block. To engage this functionality, a `ProvisionerMessage::RequestInherentData` is sent; the response is a set of non-conflicting candidates and the appropriate bitfields. Non-conflicting generally means that there are never two distinct parachain candidates included for the same parachain. +When a validator is selected by BABE to author a block, it becomes a block producer. The provisioner is the subsystem best suited to choosing which specific backed candidates and availability bitfields should be assembled into the block. To engage this functionality, a `ProvisionerMessage::RequestInherentData` is sent; the response is a set of non-conflicting candidates and the appropriate bitfields. Non-conflicting means that there are never two distinct parachain candidates included for the same parachain and that new parachain candidates cannot be included until the previous one either gets declared available or expired. One might ask: given `ProvisionerMessage::RequestInherentData`, what's the point of `ProvisionerMessage::RequestBlockAuthorshipData`? The answer is that the block authorship data includes more information than is present in the inherent data; disputes, for example. -- GitLab From feb5039e85f7ccd219fd8c3996b55f07565c1f6a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Fri, 10 Jul 2020 13:24:17 +0200 Subject: [PATCH 060/192] Revert log rotation (#1389) * Revert log rotation https://github.com/paritytech/substrate/pull/6627 * 'Update substrate' Co-authored-by: parity-processbot <> --- Cargo.lock | 378 ++++++++++++++++++--------------------------- cli/src/command.rs | 2 +- 2 files changed, 149 insertions(+), 231 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 7536eae33b..8583a3b1db 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -383,18 +383,6 @@ dependencies = [ "radium", ] -[[package]] -name = "blake2" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94cb07b0da6a73955f8fb85d24c466778e70cda767a568229b104f0264089330" -dependencies = [ - "byte-tools", - "crypto-mac 0.7.0", - "digest 0.8.1", - "opaque-debug 0.2.3", -] - [[package]] name = "blake2" version = "0.9.0" @@ -1317,20 +1305,6 @@ dependencies = [ "miniz_oxide", ] -[[package]] -name = "flexi_logger" -version = "0.15.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33897654c23a50cebab45e18356f69fb771c9949a6928344fb1f01ffccc7c5f3" -dependencies = [ - "chrono", - "glob", - "log 0.4.8", - "regex", - "thiserror", - "yansi", -] - [[package]] name = "fnv" version = "1.0.7" @@ -1340,7 +1314,7 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "fork-tree" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" +source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" dependencies = [ "parity-scale-codec", ] @@ -1348,7 +1322,7 @@ dependencies = [ [[package]] name = "frame-benchmarking" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" +source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" dependencies = [ "frame-support", "frame-system", @@ -1365,7 +1339,7 @@ dependencies = [ [[package]] name = "frame-benchmarking-cli" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" +source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" dependencies = [ "Inflector", "frame-benchmarking", @@ -1384,7 +1358,7 @@ dependencies = [ [[package]] name = "frame-executive" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" +source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" dependencies = [ "frame-support", "frame-system", @@ -1399,7 +1373,7 @@ dependencies = [ [[package]] name = "frame-metadata" version = "11.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" +source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" dependencies = [ "parity-scale-codec", "serde", @@ -1410,7 +1384,7 @@ dependencies = [ [[package]] name = "frame-support" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" +source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" dependencies = [ "bitmask", "frame-metadata", @@ -1435,7 +1409,7 @@ dependencies = [ [[package]] name = "frame-support-procedural" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" +source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" dependencies = [ "frame-support-procedural-tools", "proc-macro2 1.0.18", @@ -1446,7 +1420,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" +source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" dependencies = [ "frame-support-procedural-tools-derive", "proc-macro-crate", @@ -1458,7 +1432,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools-derive" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" +source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" dependencies = [ "proc-macro2 1.0.18", "quote 1.0.7", @@ -1468,7 +1442,7 @@ dependencies = [ [[package]] name = "frame-system" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" +source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" dependencies = [ "frame-support", "impl-trait-for-tuples", @@ -1484,7 +1458,7 @@ dependencies = [ [[package]] name = "frame-system-benchmarking" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" +source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" dependencies = [ "frame-benchmarking", "frame-support", @@ -1498,7 +1472,7 @@ dependencies = [ [[package]] name = "frame-system-rpc-runtime-api" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" +source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" dependencies = [ "parity-scale-codec", "sp-api", @@ -1716,18 +1690,6 @@ dependencies = [ "slab", ] -[[package]] -name = "futures_codec" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0a73299e4718f5452e45980fc1d6957a070abe308d3700b63b8673f47e1c2b3" -dependencies = [ - "bytes 0.5.5", - "futures 0.3.5", - "memchr", - "pin-project", -] - [[package]] name = "futures_codec" version = "0.4.1" @@ -2680,7 +2642,7 @@ dependencies = [ "libp2p-websocket", "libp2p-yamux", "multihash", - "parity-multiaddr 0.9.1", + "parity-multiaddr", "parking_lot 0.10.2", "pin-project", "smallvec 1.4.1", @@ -2705,7 +2667,7 @@ dependencies = [ "log 0.4.8", "multihash", "multistream-select", - "parity-multiaddr 0.9.1", + "parity-multiaddr", "parking_lot 0.10.2", "pin-project", "prost", @@ -2769,7 +2731,7 @@ dependencies = [ "either", "fnv", "futures 0.3.5", - "futures_codec 0.4.1", + "futures_codec", "libp2p-core", "libp2p-swarm", "log 0.4.8", @@ -2816,7 +2778,7 @@ dependencies = [ "bytes 0.5.5", "fnv", "futures 0.3.5", - "futures_codec 0.4.1", + "futures_codec", "libp2p-core", "log 0.4.8", "parking_lot 0.10.2", @@ -3504,7 +3466,7 @@ dependencies = [ [[package]] name = "pallet-authority-discovery" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" +source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" dependencies = [ "frame-support", "frame-system", @@ -3520,7 +3482,7 @@ dependencies = [ [[package]] name = "pallet-authorship" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" +source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" dependencies = [ "frame-support", "frame-system", @@ -3535,7 +3497,7 @@ dependencies = [ [[package]] name = "pallet-babe" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" +source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" dependencies = [ "frame-benchmarking", "frame-support", @@ -3560,7 +3522,7 @@ dependencies = [ [[package]] name = "pallet-balances" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" +source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" dependencies = [ "frame-benchmarking", "frame-support", @@ -3574,7 +3536,7 @@ dependencies = [ [[package]] name = "pallet-collective" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" +source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" dependencies = [ "frame-benchmarking", "frame-support", @@ -3590,7 +3552,7 @@ dependencies = [ [[package]] name = "pallet-democracy" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" +source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" dependencies = [ "frame-benchmarking", "frame-support", @@ -3605,7 +3567,7 @@ dependencies = [ [[package]] name = "pallet-elections-phragmen" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" +source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" dependencies = [ "frame-benchmarking", "frame-support", @@ -3620,7 +3582,7 @@ dependencies = [ [[package]] name = "pallet-finality-tracker" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" +source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" dependencies = [ "frame-support", "frame-system", @@ -3636,7 +3598,7 @@ dependencies = [ [[package]] name = "pallet-grandpa" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" +source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" dependencies = [ "frame-support", "frame-system", @@ -3656,7 +3618,7 @@ dependencies = [ [[package]] name = "pallet-identity" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" +source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" dependencies = [ "enumflags2", "frame-benchmarking", @@ -3672,7 +3634,7 @@ dependencies = [ [[package]] name = "pallet-im-online" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" +source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" dependencies = [ "frame-benchmarking", "frame-support", @@ -3692,7 +3654,7 @@ dependencies = [ [[package]] name = "pallet-indices" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" +source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" dependencies = [ "frame-support", "frame-system", @@ -3708,7 +3670,7 @@ dependencies = [ [[package]] name = "pallet-membership" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" +source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" dependencies = [ "frame-support", "frame-system", @@ -3722,7 +3684,7 @@ dependencies = [ [[package]] name = "pallet-multisig" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" +source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" dependencies = [ "frame-support", "frame-system", @@ -3737,7 +3699,7 @@ dependencies = [ [[package]] name = "pallet-nicks" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" +source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" dependencies = [ "frame-support", "frame-system", @@ -3751,7 +3713,7 @@ dependencies = [ [[package]] name = "pallet-offences" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" +source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" dependencies = [ "frame-support", "frame-system", @@ -3766,7 +3728,7 @@ dependencies = [ [[package]] name = "pallet-offences-benchmarking" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" +source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" dependencies = [ "frame-benchmarking", "frame-support", @@ -3787,7 +3749,7 @@ dependencies = [ [[package]] name = "pallet-proxy" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" +source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" dependencies = [ "frame-support", "frame-system", @@ -3802,7 +3764,7 @@ dependencies = [ [[package]] name = "pallet-randomness-collective-flip" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" +source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" dependencies = [ "frame-support", "frame-system", @@ -3815,7 +3777,7 @@ dependencies = [ [[package]] name = "pallet-recovery" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" +source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" dependencies = [ "enumflags2", "frame-support", @@ -3830,7 +3792,7 @@ dependencies = [ [[package]] name = "pallet-scheduler" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" +source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" dependencies = [ "frame-benchmarking", "frame-support", @@ -3845,7 +3807,7 @@ dependencies = [ [[package]] name = "pallet-session" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" +source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" dependencies = [ "frame-support", "frame-system", @@ -3865,7 +3827,7 @@ dependencies = [ [[package]] name = "pallet-session-benchmarking" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" +source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" dependencies = [ "frame-benchmarking", "frame-support", @@ -3881,7 +3843,7 @@ dependencies = [ [[package]] name = "pallet-society" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" +source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" dependencies = [ "frame-support", "frame-system", @@ -3895,7 +3857,7 @@ dependencies = [ [[package]] name = "pallet-staking" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" +source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" dependencies = [ "frame-benchmarking", "frame-support", @@ -3917,7 +3879,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-curve" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" +source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -3928,7 +3890,7 @@ dependencies = [ [[package]] name = "pallet-sudo" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" +source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" dependencies = [ "frame-support", "frame-system", @@ -3942,7 +3904,7 @@ dependencies = [ [[package]] name = "pallet-timestamp" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" +source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" dependencies = [ "frame-benchmarking", "frame-support", @@ -3960,7 +3922,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" +source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" dependencies = [ "frame-support", "frame-system", @@ -3975,7 +3937,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" +source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" dependencies = [ "jsonrpc-core", "jsonrpc-core-client", @@ -3993,7 +3955,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc-runtime-api" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" +source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" dependencies = [ "frame-support", "parity-scale-codec", @@ -4006,7 +3968,7 @@ dependencies = [ [[package]] name = "pallet-treasury" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" +source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" dependencies = [ "frame-benchmarking", "frame-support", @@ -4021,7 +3983,7 @@ dependencies = [ [[package]] name = "pallet-utility" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" +source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" dependencies = [ "frame-benchmarking", "frame-support", @@ -4037,7 +3999,7 @@ dependencies = [ [[package]] name = "pallet-vesting" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" +source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" dependencies = [ "enumflags2", "frame-benchmarking", @@ -4063,24 +4025,6 @@ dependencies = [ "parking_lot 0.10.2", ] -[[package]] -name = "parity-multiaddr" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f77055f9e81921a8cc7bebeb6cded3d128931d51f1e3dd6251f0770a6d431477" -dependencies = [ - "arrayref", - "bs58", - "byteorder", - "data-encoding", - "parity-multihash", - "percent-encoding 2.1.0", - "serde", - "static_assertions", - "unsigned-varint 0.3.3", - "url 2.1.1", -] - [[package]] name = "parity-multiaddr" version = "0.9.1" @@ -4099,21 +4043,6 @@ dependencies = [ "url 2.1.1", ] -[[package]] -name = "parity-multihash" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a1cd2ba02391b81367bec529fb209019d718684fdc8ad6a712c2b536e46f775" -dependencies = [ - "blake2 0.8.1", - "bytes 0.5.5", - "rand 0.7.3", - "sha-1", - "sha2 0.8.2", - "sha3", - "unsigned-varint 0.3.3", -] - [[package]] name = "parity-scale-codec" version = "1.3.1" @@ -6007,7 +5936,7 @@ dependencies = [ [[package]] name = "sc-authority-discovery" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" +source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" dependencies = [ "bytes 0.5.5", "derive_more 0.99.9", @@ -6034,7 +5963,7 @@ dependencies = [ [[package]] name = "sc-basic-authorship" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" +source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6058,7 +5987,7 @@ dependencies = [ [[package]] name = "sc-block-builder" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" +source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" dependencies = [ "parity-scale-codec", "sc-client-api", @@ -6075,7 +6004,7 @@ dependencies = [ [[package]] name = "sc-chain-spec" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" +source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" dependencies = [ "impl-trait-for-tuples", "sc-chain-spec-derive", @@ -6091,7 +6020,7 @@ dependencies = [ [[package]] name = "sc-chain-spec-derive" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" +source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -6102,14 +6031,14 @@ dependencies = [ [[package]] name = "sc-cli" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" +source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" dependencies = [ "ansi_term 0.12.1", "atty", "chrono", "derive_more 0.99.9", + "env_logger", "fdlimit", - "flexi_logger", "futures 0.3.5", "lazy_static", "log 0.4.8", @@ -6143,7 +6072,7 @@ dependencies = [ [[package]] name = "sc-client-api" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" +source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" dependencies = [ "derive_more 0.99.9", "fnv", @@ -6179,7 +6108,7 @@ dependencies = [ [[package]] name = "sc-client-db" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" +source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" dependencies = [ "blake2-rfc", "hash-db", @@ -6208,7 +6137,7 @@ dependencies = [ [[package]] name = "sc-consensus" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" +source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" dependencies = [ "sc-client-api", "sp-blockchain", @@ -6219,7 +6148,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" +source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" dependencies = [ "derive_more 0.99.9", "fork-tree", @@ -6261,7 +6190,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe-rpc" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" +source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -6285,7 +6214,7 @@ dependencies = [ [[package]] name = "sc-consensus-epochs" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" +source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" dependencies = [ "fork-tree", "parity-scale-codec", @@ -6298,7 +6227,7 @@ dependencies = [ [[package]] name = "sc-consensus-slots" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" +source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6321,7 +6250,7 @@ dependencies = [ [[package]] name = "sc-consensus-uncles" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" +source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" dependencies = [ "log 0.4.8", "sc-client-api", @@ -6335,7 +6264,7 @@ dependencies = [ [[package]] name = "sc-executor" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" +source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" dependencies = [ "derive_more 0.99.9", "lazy_static", @@ -6363,7 +6292,7 @@ dependencies = [ [[package]] name = "sc-executor-common" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" +source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" dependencies = [ "derive_more 0.99.9", "log 0.4.8", @@ -6380,7 +6309,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmi" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" +source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" dependencies = [ "log 0.4.8", "parity-scale-codec", @@ -6395,7 +6324,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmtime" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" +source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" dependencies = [ "cranelift-codegen", "cranelift-wasm", @@ -6416,7 +6345,7 @@ dependencies = [ [[package]] name = "sc-finality-grandpa" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" +source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" dependencies = [ "assert_matches", "derive_more 0.99.9", @@ -6454,7 +6383,7 @@ dependencies = [ [[package]] name = "sc-finality-grandpa-rpc" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" +source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" dependencies = [ "derive_more 0.99.9", "finality-grandpa", @@ -6471,7 +6400,7 @@ dependencies = [ [[package]] name = "sc-informant" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" +source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" dependencies = [ "ansi_term 0.12.1", "futures 0.3.5", @@ -6489,7 +6418,7 @@ dependencies = [ [[package]] name = "sc-keystore" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" +source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" dependencies = [ "derive_more 0.99.9", "hex", @@ -6505,7 +6434,7 @@ dependencies = [ [[package]] name = "sc-light" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" +source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" dependencies = [ "hash-db", "lazy_static", @@ -6524,7 +6453,7 @@ dependencies = [ [[package]] name = "sc-network" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" +source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" dependencies = [ "bitflags", "bs58", @@ -6536,7 +6465,7 @@ dependencies = [ "fork-tree", "futures 0.3.5", "futures-timer 3.0.2", - "futures_codec 0.3.4", + "futures_codec", "hex", "ip_network", "libp2p", @@ -6567,7 +6496,7 @@ dependencies = [ "sp-utils", "substrate-prometheus-endpoint", "thiserror", - "unsigned-varint 0.3.3", + "unsigned-varint 0.4.0", "void", "wasm-timer", "zeroize", @@ -6576,7 +6505,7 @@ dependencies = [ [[package]] name = "sc-network-gossip" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" +source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6591,7 +6520,7 @@ dependencies = [ [[package]] name = "sc-network-test" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" +source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" dependencies = [ "env_logger", "futures 0.3.5", @@ -6618,7 +6547,7 @@ dependencies = [ [[package]] name = "sc-offchain" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" +source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" dependencies = [ "bytes 0.5.5", "fnv", @@ -6645,7 +6574,7 @@ dependencies = [ [[package]] name = "sc-peerset" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" +source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" dependencies = [ "futures 0.3.5", "libp2p", @@ -6658,7 +6587,7 @@ dependencies = [ [[package]] name = "sc-proposer-metrics" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" +source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" dependencies = [ "log 0.4.8", "substrate-prometheus-endpoint", @@ -6667,7 +6596,7 @@ dependencies = [ [[package]] name = "sc-rpc" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" +source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" dependencies = [ "futures 0.3.5", "hash-db", @@ -6699,7 +6628,7 @@ dependencies = [ [[package]] name = "sc-rpc-api" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" +source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -6723,7 +6652,7 @@ dependencies = [ [[package]] name = "sc-rpc-server" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" +source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" dependencies = [ "jsonrpc-core", "jsonrpc-http-server", @@ -6739,7 +6668,7 @@ dependencies = [ [[package]] name = "sc-service" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" +source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" dependencies = [ "derive_more 0.99.9", "directories", @@ -6752,7 +6681,6 @@ dependencies = [ "lazy_static", "log 0.4.8", "netstat2", - "parity-multiaddr 0.7.3", "parity-scale-codec", "parity-util-mem", "parking_lot 0.10.2", @@ -6802,7 +6730,7 @@ dependencies = [ [[package]] name = "sc-state-db" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" +source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" dependencies = [ "log 0.4.8", "parity-scale-codec", @@ -6816,7 +6744,7 @@ dependencies = [ [[package]] name = "sc-telemetry" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" +source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6837,7 +6765,7 @@ dependencies = [ [[package]] name = "sc-tracing" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" +source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" dependencies = [ "erased-serde", "log 0.4.8", @@ -6854,7 +6782,7 @@ dependencies = [ [[package]] name = "sc-transaction-graph" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" +source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -6874,7 +6802,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" +source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -7258,7 +7186,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32bf8474159a95551661246cda4976e89356999e3cbfef36f493dacc3fae1e8e" dependencies = [ "aes-gcm", - "blake2 0.9.0", + "blake2", "chacha20poly1305", "rand 0.7.3", "rand_core 0.5.1", @@ -7300,7 +7228,7 @@ dependencies = [ [[package]] name = "sp-allocator" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" +source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" dependencies = [ "derive_more 0.99.9", "log 0.4.8", @@ -7312,7 +7240,7 @@ dependencies = [ [[package]] name = "sp-api" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" +source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" dependencies = [ "hash-db", "parity-scale-codec", @@ -7327,7 +7255,7 @@ dependencies = [ [[package]] name = "sp-api-proc-macro" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" +source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" dependencies = [ "blake2-rfc", "proc-macro-crate", @@ -7339,7 +7267,7 @@ dependencies = [ [[package]] name = "sp-application-crypto" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" +source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" dependencies = [ "parity-scale-codec", "serde", @@ -7351,7 +7279,7 @@ dependencies = [ [[package]] name = "sp-arithmetic" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" +source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" dependencies = [ "integer-sqrt", "num-traits 0.2.12", @@ -7364,7 +7292,7 @@ dependencies = [ [[package]] name = "sp-authority-discovery" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" +source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" dependencies = [ "parity-scale-codec", "sp-api", @@ -7376,7 +7304,7 @@ dependencies = [ [[package]] name = "sp-authorship" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" +source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" dependencies = [ "parity-scale-codec", "sp-inherents", @@ -7387,7 +7315,7 @@ dependencies = [ [[package]] name = "sp-block-builder" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" +source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" dependencies = [ "parity-scale-codec", "sp-api", @@ -7399,7 +7327,7 @@ dependencies = [ [[package]] name = "sp-blockchain" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" +source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" dependencies = [ "derive_more 0.99.9", "log 0.4.8", @@ -7416,7 +7344,7 @@ dependencies = [ [[package]] name = "sp-chain-spec" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" +source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" dependencies = [ "serde", "serde_json", @@ -7425,7 +7353,7 @@ dependencies = [ [[package]] name = "sp-consensus" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" +source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -7450,7 +7378,7 @@ dependencies = [ [[package]] name = "sp-consensus-aura" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" +source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" dependencies = [ "parity-scale-codec", "sp-api", @@ -7464,7 +7392,7 @@ dependencies = [ [[package]] name = "sp-consensus-babe" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" +source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" dependencies = [ "merlin", "parity-scale-codec", @@ -7483,7 +7411,7 @@ dependencies = [ [[package]] name = "sp-consensus-slots" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" +source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" dependencies = [ "parity-scale-codec", "sp-runtime", @@ -7492,7 +7420,7 @@ dependencies = [ [[package]] name = "sp-consensus-vrf" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" +source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" dependencies = [ "parity-scale-codec", "schnorrkel", @@ -7504,7 +7432,7 @@ dependencies = [ [[package]] name = "sp-core" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" +source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" dependencies = [ "base58", "blake2-rfc", @@ -7547,7 +7475,7 @@ dependencies = [ [[package]] name = "sp-database" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" +source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" dependencies = [ "kvdb", "parking_lot 0.10.2", @@ -7556,7 +7484,7 @@ dependencies = [ [[package]] name = "sp-debug-derive" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" +source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" dependencies = [ "proc-macro2 1.0.18", "quote 1.0.7", @@ -7566,7 +7494,7 @@ dependencies = [ [[package]] name = "sp-externalities" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" +source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" dependencies = [ "environmental", "parity-scale-codec", @@ -7577,7 +7505,7 @@ dependencies = [ [[package]] name = "sp-finality-grandpa" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" +source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" dependencies = [ "finality-grandpa", "log 0.4.8", @@ -7593,7 +7521,7 @@ dependencies = [ [[package]] name = "sp-finality-tracker" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" +source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" dependencies = [ "parity-scale-codec", "sp-inherents", @@ -7603,7 +7531,7 @@ dependencies = [ [[package]] name = "sp-inherents" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" +source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" dependencies = [ "derive_more 0.99.9", "parity-scale-codec", @@ -7615,7 +7543,7 @@ dependencies = [ [[package]] name = "sp-io" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" +source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" dependencies = [ "futures 0.3.5", "hash-db", @@ -7636,7 +7564,7 @@ dependencies = [ [[package]] name = "sp-keyring" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" +source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" dependencies = [ "lazy_static", "sp-core", @@ -7647,7 +7575,7 @@ dependencies = [ [[package]] name = "sp-npos-elections" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" +source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" dependencies = [ "parity-scale-codec", "serde", @@ -7659,7 +7587,7 @@ dependencies = [ [[package]] name = "sp-npos-elections-compact" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" +source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -7670,7 +7598,7 @@ dependencies = [ [[package]] name = "sp-offchain" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" +source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" dependencies = [ "sp-api", "sp-core", @@ -7680,7 +7608,7 @@ dependencies = [ [[package]] name = "sp-panic-handler" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" +source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" dependencies = [ "backtrace", "log 0.4.8", @@ -7689,7 +7617,7 @@ dependencies = [ [[package]] name = "sp-rpc" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" +source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" dependencies = [ "serde", "sp-core", @@ -7698,7 +7626,7 @@ dependencies = [ [[package]] name = "sp-runtime" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" +source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" dependencies = [ "either", "hash256-std-hasher", @@ -7720,7 +7648,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" +source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" dependencies = [ "parity-scale-codec", "primitive-types", @@ -7735,7 +7663,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" +source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" dependencies = [ "Inflector", "proc-macro-crate", @@ -7747,7 +7675,7 @@ dependencies = [ [[package]] name = "sp-serializer" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" +source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" dependencies = [ "serde", "serde_json", @@ -7756,7 +7684,7 @@ dependencies = [ [[package]] name = "sp-session" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" +source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" dependencies = [ "parity-scale-codec", "sp-api", @@ -7769,7 +7697,7 @@ dependencies = [ [[package]] name = "sp-staking" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" +source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" dependencies = [ "parity-scale-codec", "sp-runtime", @@ -7779,7 +7707,7 @@ dependencies = [ [[package]] name = "sp-state-machine" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" +source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" dependencies = [ "hash-db", "itertools 0.9.0", @@ -7800,12 +7728,12 @@ dependencies = [ [[package]] name = "sp-std" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" +source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" [[package]] name = "sp-storage" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" +source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" dependencies = [ "impl-serde 0.2.3", "ref-cast", @@ -7817,7 +7745,7 @@ dependencies = [ [[package]] name = "sp-timestamp" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" +source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -7831,7 +7759,7 @@ dependencies = [ [[package]] name = "sp-tracing" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" +source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" dependencies = [ "log 0.4.8", "rental", @@ -7841,7 +7769,7 @@ dependencies = [ [[package]] name = "sp-transaction-pool" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" +source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -7857,7 +7785,7 @@ dependencies = [ [[package]] name = "sp-trie" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" +source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" dependencies = [ "hash-db", "memory-db", @@ -7871,7 +7799,7 @@ dependencies = [ [[package]] name = "sp-utils" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" +source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" dependencies = [ "futures 0.3.5", "futures-core", @@ -7883,7 +7811,7 @@ dependencies = [ [[package]] name = "sp-version" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" +source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" dependencies = [ "impl-serde 0.2.3", "parity-scale-codec", @@ -7895,7 +7823,7 @@ dependencies = [ [[package]] name = "sp-wasm-interface" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" +source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -8035,7 +7963,7 @@ dependencies = [ [[package]] name = "substrate-browser-utils" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" +source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" dependencies = [ "chrono", "clear_on_drop", @@ -8062,7 +7990,7 @@ dependencies = [ [[package]] name = "substrate-build-script-utils" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" +source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" dependencies = [ "platforms", ] @@ -8070,7 +7998,7 @@ dependencies = [ [[package]] name = "substrate-frame-rpc-system" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" +source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" dependencies = [ "frame-system-rpc-runtime-api", "futures 0.3.5", @@ -8093,7 +8021,7 @@ dependencies = [ [[package]] name = "substrate-prometheus-endpoint" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" +source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" dependencies = [ "async-std", "derive_more 0.99.9", @@ -8107,7 +8035,7 @@ dependencies = [ [[package]] name = "substrate-test-client" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" +source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" dependencies = [ "futures 0.1.29", "futures 0.3.5", @@ -8133,7 +8061,7 @@ dependencies = [ [[package]] name = "substrate-test-runtime" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" +source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" dependencies = [ "cfg-if", "frame-executive", @@ -8173,7 +8101,7 @@ dependencies = [ [[package]] name = "substrate-test-runtime-client" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" +source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" dependencies = [ "futures 0.3.5", "parity-scale-codec", @@ -8194,7 +8122,7 @@ dependencies = [ [[package]] name = "substrate-wasm-builder-runner" version = "1.0.6" -source = "git+https://github.com/paritytech/substrate#06dedb0eb77abb7f64832b5c675ee4c00e40d730" +source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" [[package]] name = "substrate-wasm-builder-runner" @@ -9062,12 +8990,6 @@ name = "unsigned-varint" version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f67332660eb59a6f1eb24ff1220c9e8d01738a8503c6002e30bcfe4bd9f2b4a9" -dependencies = [ - "bytes 0.5.5", - "futures-io", - "futures-util", - "futures_codec 0.3.4", -] [[package]] name = "unsigned-varint" @@ -9076,7 +8998,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "669d776983b692a906c881fcd0cfb34271a48e197e4d6cb8df32b05bfc3d3fa5" dependencies = [ "bytes 0.5.5", - "futures_codec 0.4.1", + "futures-io", + "futures-util", + "futures_codec", ] [[package]] @@ -9584,12 +9508,6 @@ dependencies = [ "static_assertions", ] -[[package]] -name = "yansi" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fc79f4a1e39857fc00c3f662cbf2651c771f00e9c15fe2abc341806bd46bd71" - [[package]] name = "zeroize" version = "1.1.0" diff --git a/cli/src/command.rs b/cli/src/command.rs index 4d4b4080f0..d518b94ccf 100644 --- a/cli/src/command.rs +++ b/cli/src/command.rs @@ -198,7 +198,7 @@ pub fn run() -> Result<()> { } }, Some(Subcommand::ValidationWorker(cmd)) => { - sc_cli::init_logger("", None)?; + sc_cli::init_logger(""); if cfg!(feature = "browser") { Err(sc_cli::Error::Input("Cannot run validation worker in browser".into())) -- GitLab From 7a8b9b11f39baa1b9b15144d5731da2a3c024a3d Mon Sep 17 00:00:00 2001 From: Gavin Wood Date: Sat, 11 Jul 2020 17:04:10 +0200 Subject: [PATCH 061/192] Introduce polling pallet (#1391) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Initial draft * Initial build * Integrate into runtime * Fix warnings. * Initial tests * Fixes and tests * Update runtime/polkadot/src/poll.rs Co-authored-by: Bastian Köcher * Expose End constant * Docs * Update runtime/polkadot/src/lib.rs Co-authored-by: kaichao * Update runtime/polkadot/src/poll.rs Co-authored-by: Kian Paimani <5588131+kianenigma@users.noreply.github.com> * Clean up filters * Warnings Co-authored-by: Bastian Köcher Co-authored-by: kaichao Co-authored-by: Kian Paimani <5588131+kianenigma@users.noreply.github.com> --- Cargo.lock | 1 + runtime/polkadot/Cargo.toml | 3 +- runtime/polkadot/src/lib.rs | 24 ++-- runtime/polkadot/src/poll.rs | 233 +++++++++++++++++++++++++++++++++++ 4 files changed, 253 insertions(+), 8 deletions(-) create mode 100644 runtime/polkadot/src/poll.rs diff --git a/Cargo.lock b/Cargo.lock index 8583a3b1db..9f8d5c94f0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4716,6 +4716,7 @@ dependencies = [ "sp-consensus-babe", "sp-core", "sp-inherents", + "sp-io", "sp-keyring", "sp-offchain", "sp-runtime", diff --git a/runtime/polkadot/Cargo.toml b/runtime/polkadot/Cargo.toml index bad45c6aa1..7f1763ff29 100644 --- a/runtime/polkadot/Cargo.toml +++ b/runtime/polkadot/Cargo.toml @@ -20,7 +20,8 @@ babe-primitives = { package = "sp-consensus-babe", git = "https://github.com/par sp-api = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } inherents = { package = "sp-inherents", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } offchain-primitives = { package = "sp-offchain", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -sp-std = { package = "sp-std", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +sp-std = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +sp-io = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } sp-staking = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } sp-core = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } diff --git a/runtime/polkadot/src/lib.rs b/runtime/polkadot/src/lib.rs index 258a7b4781..610a37f07a 100644 --- a/runtime/polkadot/src/lib.rs +++ b/runtime/polkadot/src/lib.rs @@ -79,6 +79,7 @@ pub use parachains::Call as ParachainsCall; /// Constant values used within the runtime. pub mod constants; +pub mod poll; use constants::{time::*, currency::*, fee::*}; use frame_support::traits::InstanceFilter; @@ -114,12 +115,7 @@ pub struct BaseFilter; impl Filter for BaseFilter { fn filter(call: &Call) -> bool { match call { - Call::Parachains(parachains::Call::set_heads(..)) - | Call::Democracy(democracy::Call::vote(..)) - | Call::Democracy(democracy::Call::remove_vote(..)) - | Call::Democracy(democracy::Call::delegate(..)) - | Call::Democracy(democracy::Call::undelegate(..)) - => true, + Call::Parachains(parachains::Call::set_heads(..)) => true, // Governance stuff Call::Democracy(_) | Call::Council(_) | Call::TechnicalCommittee(_) | @@ -138,7 +134,7 @@ impl Filter for BaseFilter { Call::Session(_) | Call::FinalityTracker(_) | Call::Grandpa(_) | Call::ImOnline(_) | Call::AuthorityDiscovery(_) | Call::Utility(_) | Call::Claims(_) | Call::Vesting(_) | Call::Sudo(_) | - Call::Identity(_) | Call::Proxy(_) | Call::Multisig(_) => + Call::Identity(_) | Call::Proxy(_) | Call::Multisig(_) | Call::Poll(_) => true, } } @@ -893,6 +889,7 @@ impl InstanceFilter for ProxyType { ProxyType::Governance => matches!(c, Call::Democracy(..) | Call::Council(..) | Call::TechnicalCommittee(..) | Call::ElectionsPhragmen(..) | Call::Treasury(..) | Call::Utility(..) + | Call::Poll(..) ), ProxyType::Staking => matches!(c, Call::Staking(..) | Call::Utility(utility::Call::batch(..)) | Call::Utility(..) @@ -941,6 +938,16 @@ impl frame_support::traits::OnRuntimeUpgrade for CustomOnRuntimeUpgrade { } } +parameter_types! { + pub const PollEnd: BlockNumber = 100_000; +} + +impl poll::Trait for Runtime { + type Event = Event; + type Currency = Balances; + type End = PollEnd; +} + construct_runtime! { pub enum Runtime where Block = Block, @@ -1006,6 +1013,9 @@ construct_runtime! { // Multisig dispatch. Late addition. Multisig: multisig::{Module, Call, Storage, Event}, + + // Poll module. + Poll: poll::{Module, Call, Storage, Event}, } } diff --git a/runtime/polkadot/src/poll.rs b/runtime/polkadot/src/poll.rs new file mode 100644 index 0000000000..c2cd551817 --- /dev/null +++ b/runtime/polkadot/src/poll.rs @@ -0,0 +1,233 @@ +// Copyright 2020 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 . + +//! # Simple polling module +//! +//! Note: This implementation assumes that all accounts are locked, and thus that no account balance +//! may ever reduce. + +use frame_support::{ + decl_module, decl_storage, decl_event, decl_error, ensure, traits::{Currency, Get}, +}; +use system::{self as frame_system, ensure_signed}; +use sp_runtime::traits::Saturating; + +pub type BalanceOf = + <::Currency as Currency<::AccountId>>::Balance; + +pub trait Trait: system::Trait { + /// The overarching event type. + type Event: From> + Into<::Event>; + + /// The currency type used. + type Currency: Currency; + + /// The block number only before which voting is possible. + type End: Get; +} + +/// The options someone has approved. +pub type Approvals = [bool; 4]; + +decl_storage! { + trait Store for Module as Poll { + /// Votes, so far. + pub VoteOf: map hasher(twox_64_concat) T::AccountId => (Approvals, BalanceOf); + + /// The total balances voting for each option. + pub Totals: [BalanceOf; 4]; + } +} + +decl_event! { + pub enum Event where + ::AccountId, + Balance = BalanceOf, + { + Voted(AccountId, Balance, Approvals), + } +} + +decl_error! { + pub enum Error for Module { + /// Vote attempted after the end of voting. + TooLate, + } +} + +decl_module! { + pub struct Module for enum Call where origin: T::Origin { + type Error = Error; + + fn deposit_event() = default; + + /// The End config param. + const End: T::BlockNumber = T::End::get(); + + /// Cast a vote on the poll. + #[weight = 100_000_000] + fn vote(origin, approvals: Approvals) { + let who = ensure_signed(origin)?; + ensure!(system::Module::::block_number() < T::End::get(), Error::::TooLate); + let balance = T::Currency::total_balance(&who); + Totals::::mutate(|ref mut totals| { + VoteOf::::mutate(&who, |(ref mut who_approvals, ref mut who_balance)| { + for i in 0..approvals.len() { + if who_approvals[i] { + totals[i] = totals[i].saturating_sub(*who_balance); + } + if approvals[i] { + totals[i] = totals[i].saturating_add(balance); + } + } + *who_approvals = approvals; + *who_balance = balance; + }); + }); + Self::deposit_event(RawEvent::Voted(who, balance, approvals)); + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + + use frame_support::{assert_ok, assert_noop, impl_outer_origin, parameter_types, weights::Weight}; + use sp_core::H256; + use sp_runtime::{Perbill, testing::Header, traits::{BlakeTwo256, IdentityLookup}}; + + impl_outer_origin! { + pub enum Origin for Test where system = frame_system {} + } + + // For testing the pallet, we construct most of a mock runtime. This means + // first constructing a configuration type (`Test`) which `impl`s each of the + // configuration traits of pallets we want to use. + #[derive(Clone, Eq, PartialEq)] + pub struct Test; + parameter_types! { + pub const BlockHashCount: u64 = 250; + pub const MaximumBlockWeight: Weight = 1024; + pub const MaximumBlockLength: u32 = 2 * 1024; + pub const AvailableBlockRatio: Perbill = Perbill::one(); + } + impl frame_system::Trait for Test { + type BaseCallFilter = (); + type Origin = Origin; + type Index = u64; + type BlockNumber = u64; + type Hash = H256; + type Call = (); + type Hashing = BlakeTwo256; + type AccountId = u64; + type Lookup = IdentityLookup; + type Header = Header; + type Event = (); + type BlockHashCount = BlockHashCount; + type MaximumBlockWeight = MaximumBlockWeight; + type DbWeight = (); + type BlockExecutionWeight = (); + type ExtrinsicBaseWeight = (); + type MaximumExtrinsicWeight = MaximumBlockWeight; + type MaximumBlockLength = MaximumBlockLength; + type AvailableBlockRatio = AvailableBlockRatio; + type Version = (); + type ModuleToIndex = (); + type AccountData = balances::AccountData; + type OnNewAccount = (); + type OnKilledAccount = (); + type SystemWeightInfo = (); + } + parameter_types! { + pub const ExistentialDeposit: u64 = 1; + } + impl balances::Trait for Test { + type Balance = u64; + type Event = (); + type DustRemoval = (); + type ExistentialDeposit = ExistentialDeposit; + type AccountStore = System; + type WeightInfo = (); + } + parameter_types! { + pub const End: u64 = 1; + } + impl Trait for Test { + type Event = (); + type Currency = Balances; + type End = End; + } + type System = system::Module; + type Balances = balances::Module; + type Poll = Module; + + // This function basically just builds a genesis storage key/value store according to + // our desired mockup. + pub fn new_test_ext() -> sp_io::TestExternalities { + let mut t = system::GenesisConfig::default().build_storage::().unwrap(); + // We use default for brevity, but you can configure as desired if needed. + balances::GenesisConfig:: { + balances: vec![ + (1, 10), + (2, 20), + (3, 30), + (4, 40), + ], + }.assimilate_storage(&mut t).unwrap(); + t.into() + } + + #[test] + fn basic_setup_works() { + new_test_ext().execute_with(|| { + assert_eq!(System::block_number(), 0); + }); + } + + #[test] + fn totaling_works() { + new_test_ext().execute_with(|| { + assert_ok!(Poll::vote(Origin::signed(1), [true, true, false, false])); + assert_ok!(Poll::vote(Origin::signed(2), [false, true, true, false])); + assert_ok!(Poll::vote(Origin::signed(3), [false, false, true, true])); + assert_ok!(Poll::vote(Origin::signed(4), [true, false, false, true])); + assert_eq!(Totals::::get(), [50, 30, 50, 70]); + }); + } + + #[test] + fn revoting_works() { + new_test_ext().execute_with(|| { + assert_ok!(Poll::vote(Origin::signed(1), [true, false, false, false])); + assert_eq!(Totals::::get(), [10, 0, 0, 0]); + assert_ok!(Poll::vote(Origin::signed(1), [false, true, false, false])); + assert_eq!(Totals::::get(), [0, 10, 0, 0]); + assert_ok!(Poll::vote(Origin::signed(1), [false, false, true, true])); + assert_eq!(Totals::::get(), [0, 0, 10, 10]); + }); + } + + #[test] + fn vote_end_works() { + new_test_ext().execute_with(|| { + assert_ok!(Poll::vote(Origin::signed(1), [true, false, false, false])); + assert_eq!(Totals::::get(), [10, 0, 0, 0]); + system::Module::::set_block_number(1); + assert_noop!(Poll::vote(Origin::signed(1), [false, true, false, false]), Error::::TooLate); + }); + } +} -- GitLab From d0e553fea178d009491121c5486f0f5ca1ddd197 Mon Sep 17 00:00:00 2001 From: Gavin Wood Date: Mon, 13 Jul 2020 13:08:32 +0200 Subject: [PATCH 062/192] Tweak poll end block (#1397) --- runtime/polkadot/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runtime/polkadot/src/lib.rs b/runtime/polkadot/src/lib.rs index 610a37f07a..3c19495b48 100644 --- a/runtime/polkadot/src/lib.rs +++ b/runtime/polkadot/src/lib.rs @@ -939,7 +939,7 @@ impl frame_support::traits::OnRuntimeUpgrade for CustomOnRuntimeUpgrade { } parameter_types! { - pub const PollEnd: BlockNumber = 100_000; + pub const PollEnd: BlockNumber = 888_888; } impl poll::Trait for Runtime { -- GitLab From bc6e1e77d6316ecac23458cbd5067841ffef3b43 Mon Sep 17 00:00:00 2001 From: Max Inden Date: Tue, 14 Jul 2020 00:19:48 +0200 Subject: [PATCH 063/192] *: Enable authority discovery by default (#1395) * *: Enable authority discovery by default Instead of having to explicitly enable the authority discovery module on validator and sentry nodes, this commit enables the module by default. Today there is no way for non validator or sentry nodes to run the module. That might change in the future. * service/src/lib: Fix typo in new_full! for test --- cli/src/cli.rs | 11 ++++++++--- cli/src/command.rs | 8 ++++---- node/service/src/lib.rs | 16 ++++++++-------- node/test-service/src/lib.rs | 8 ++++---- service/src/lib.rs | 26 +++++++++++++------------- 5 files changed, 37 insertions(+), 32 deletions(-) diff --git a/cli/src/cli.rs b/cli/src/cli.rs index b3a149c9a3..0287a33312 100644 --- a/cli/src/cli.rs +++ b/cli/src/cli.rs @@ -59,7 +59,12 @@ pub struct RunCmd { #[structopt(long = "force-westend")] pub force_westend: bool, - /// Enable the authority discovery module. + /// Disable the authority discovery module on validator or sentry nodes. + /// + /// Enabled by default on validator and sentry nodes. Always disabled on + /// non validator or sentry nodes. + /// + /// When enabled: /// /// (1) As a validator node: Make oneself discoverable by publishing either /// ones own network addresses, or the ones of ones sentry nodes @@ -68,8 +73,8 @@ pub struct RunCmd { /// (2) As a validator or sentry node: Discover addresses of validators or /// addresses of their sentry nodes and maintain a permanent connection /// to a subset. - #[structopt(long = "enable-authority-discovery")] - pub authority_discovery_enabled: bool, + #[structopt(long = "disable-authority-discovery")] + pub authority_discovery_disabled: bool, /// Setup a GRANDPA scheduled voting pause. /// diff --git a/cli/src/command.rs b/cli/src/command.rs index d518b94ccf..a7eb1e7fbc 100644 --- a/cli/src/command.rs +++ b/cli/src/command.rs @@ -111,7 +111,7 @@ pub fn run() -> Result<()> { set_default_ss58_version(chain_spec); - let authority_discovery_enabled = cli.run.authority_discovery_enabled; + let authority_discovery_disabled = cli.run.authority_discovery_disabled; let grandpa_pause = if cli.run.grandpa_pause.is_empty() { None } else { @@ -132,7 +132,7 @@ pub fn run() -> Result<()> { config, None, None, - authority_discovery_enabled, + authority_discovery_disabled, 6000, grandpa_pause, ).map(|(components, _, _)| components) @@ -145,7 +145,7 @@ pub fn run() -> Result<()> { config, None, None, - authority_discovery_enabled, + authority_discovery_disabled, 6000, grandpa_pause, ).map(|(components, _, _)| components) @@ -158,7 +158,7 @@ pub fn run() -> Result<()> { config, None, None, - authority_discovery_enabled, + authority_discovery_disabled, 6000, grandpa_pause, ).map(|(components, _, _)| components) diff --git a/node/service/src/lib.rs b/node/service/src/lib.rs index 1205d9f3ef..70867092c7 100644 --- a/node/service/src/lib.rs +++ b/node/service/src/lib.rs @@ -287,7 +287,7 @@ fn real_overseer( network_bridge: DummySubsystem, }; Overseer::new( - leaves, + leaves, all_subsystems, s, ).map_err(|e| ServiceError::Other(format!("Failed to create an Overseer: {:?}", e))) @@ -299,7 +299,7 @@ macro_rules! new_full { ( $config:expr, $collating_for:expr, - $authority_discovery_enabled:expr, + $authority_discovery_disabled:expr, $grandpa_pause:expr, $runtime:ty, $dispatch:ty, @@ -600,7 +600,7 @@ pub fn polkadot_new_full( mut config: Configuration, collating_for: Option<(CollatorId, ParaId)>, _max_block_data_size: Option, - _authority_discovery_enabled: bool, + _authority_discovery_disabled: bool, _slot_duration: u64, grandpa_pause: Option<(u32, u32)>, ) @@ -617,7 +617,7 @@ pub fn polkadot_new_full( let (components, client) = new_full!( config, collating_for, - authority_discovery_enabled, + authority_discovery_disabled, grandpa_pause, polkadot_runtime::RuntimeApi, PolkadotExecutor, @@ -632,7 +632,7 @@ pub fn kusama_new_full( mut config: Configuration, collating_for: Option<(CollatorId, ParaId)>, _max_block_data_size: Option, - _authority_discovery_enabled: bool, + _authority_discovery_disabled: bool, _slot_duration: u64, grandpa_pause: Option<(u32, u32)>, ) -> Result<( @@ -649,7 +649,7 @@ pub fn kusama_new_full( let (components, client) = new_full!( config, collating_for, - authority_discovery_enabled, + authority_discovery_disabled, grandpa_pause, kusama_runtime::RuntimeApi, KusamaExecutor, @@ -664,7 +664,7 @@ pub fn westend_new_full( mut config: Configuration, collating_for: Option<(CollatorId, ParaId)>, _max_block_data_size: Option, - _authority_discovery_enabled: bool, + _authority_discovery_disabled: bool, _slot_duration: u64, grandpa_pause: Option<(u32, u32)>, ) @@ -681,7 +681,7 @@ pub fn westend_new_full( let (components, client) = new_full!( config, collating_for, - authority_discovery_enabled, + authority_discovery_disabled, grandpa_pause, westend_runtime::RuntimeApi, WestendExecutor, diff --git a/node/test-service/src/lib.rs b/node/test-service/src/lib.rs index 751373265f..1566f46876 100644 --- a/node/test-service/src/lib.rs +++ b/node/test-service/src/lib.rs @@ -69,7 +69,7 @@ pub fn polkadot_test_new_full( config: Configuration, collating_for: Option<(CollatorId, ParaId)>, max_block_data_size: Option, - authority_discovery_enabled: bool, + authority_discovery_disabled: bool, slot_duration: u64, ) -> Result< ( @@ -85,7 +85,7 @@ pub fn polkadot_test_new_full( config, collating_for, max_block_data_size, - authority_discovery_enabled, + authority_discovery_disabled, slot_duration, polkadot_test_runtime::RuntimeApi, PolkadotTestExecutor, @@ -204,9 +204,9 @@ pub fn run_test_node( > { let config = node_config(storage_update_func, task_executor, key, boot_nodes); let multiaddr = config.network.listen_addresses[0].clone(); - let authority_discovery_enabled = false; + let authority_discovery_disabled = true; let (task_manager, client, handles, network, rpc_handlers) = - polkadot_test_new_full(config, None, None, authority_discovery_enabled, 6000) + polkadot_test_new_full(config, None, None, authority_discovery_disabled, 6000) .expect("could not create Polkadot test service"); let peer_id = network.local_peer_id().clone(); diff --git a/service/src/lib.rs b/service/src/lib.rs index d0b443ea7d..0140aae70f 100644 --- a/service/src/lib.rs +++ b/service/src/lib.rs @@ -297,7 +297,7 @@ macro_rules! new_full { $config:expr, $collating_for:expr, $max_block_data_size:expr, - $authority_discovery_enabled:expr, + $authority_discovery_disabled:expr, $slot_duration:expr, $grandpa_pause:expr, $new_full_start:expr $(,)? @@ -318,7 +318,7 @@ macro_rules! new_full { let max_block_data_size = $max_block_data_size; let disable_grandpa = $config.disable_grandpa; let name = $config.network.node_name.clone(); - let authority_discovery_enabled = $authority_discovery_enabled; + let authority_discovery_disabled = $authority_discovery_disabled; let slot_duration = $slot_duration; let (builder, mut import_setup, inherent_data_providers, mut rpc_setup) = $new_full_start; @@ -459,7 +459,7 @@ macro_rules! new_full { } if matches!(role, Role::Authority{..} | Role::Sentry{..}) { - if authority_discovery_enabled { + if !authority_discovery_disabled { let (sentries, authority_discovery_role) = match role { Role::Authority { ref sentry_nodes } => ( sentry_nodes.clone(), @@ -568,7 +568,7 @@ macro_rules! new_full { $config:expr, $collating_for:expr, $max_block_data_size:expr, - $authority_discovery_enabled:expr, + $authority_discovery_disabled:expr, $slot_duration:expr, $grandpa_pause:expr, $runtime:ty, @@ -578,7 +578,7 @@ macro_rules! new_full { $config, $collating_for, $max_block_data_size, - $authority_discovery_enabled, + $authority_discovery_disabled, $slot_duration, $grandpa_pause, new_full_start!($config, $runtime, $dispatch), @@ -589,7 +589,7 @@ macro_rules! new_full { $config:expr, $collating_for:expr, $max_block_data_size:expr, - $authority_discovery_enabled:expr, + $authority_discovery_disabled:expr, $slot_duration:expr, $runtime:ty, $dispatch:ty, @@ -598,7 +598,7 @@ macro_rules! new_full { $config, $collating_for, $max_block_data_size, - $authority_discovery_enabled, + $authority_discovery_disabled, $slot_duration, None, new_full_start!(test $config, $runtime, $dispatch), @@ -734,7 +734,7 @@ pub fn polkadot_new_full( mut config: Configuration, collating_for: Option<(CollatorId, parachain::Id)>, max_block_data_size: Option, - authority_discovery_enabled: bool, + authority_discovery_disabled: bool, slot_duration: u64, grandpa_pause: Option<(u32, u32)>, ) @@ -752,7 +752,7 @@ pub fn polkadot_new_full( config, collating_for, max_block_data_size, - authority_discovery_enabled, + authority_discovery_disabled, slot_duration, grandpa_pause, polkadot_runtime::RuntimeApi, @@ -768,7 +768,7 @@ pub fn kusama_new_full( mut config: Configuration, collating_for: Option<(CollatorId, parachain::Id)>, max_block_data_size: Option, - authority_discovery_enabled: bool, + authority_discovery_disabled: bool, slot_duration: u64, grandpa_pause: Option<(u32, u32)>, ) -> Result<( @@ -786,7 +786,7 @@ pub fn kusama_new_full( config, collating_for, max_block_data_size, - authority_discovery_enabled, + authority_discovery_disabled, slot_duration, grandpa_pause, kusama_runtime::RuntimeApi, @@ -802,7 +802,7 @@ pub fn westend_new_full( mut config: Configuration, collating_for: Option<(CollatorId, parachain::Id)>, max_block_data_size: Option, - authority_discovery_enabled: bool, + authority_discovery_disabled: bool, slot_duration: u64, grandpa_pause: Option<(u32, u32)>, ) @@ -820,7 +820,7 @@ pub fn westend_new_full( config, collating_for, max_block_data_size, - authority_discovery_enabled, + authority_discovery_disabled, slot_duration, grandpa_pause, westend_runtime::RuntimeApi, -- GitLab From 587c685843f39608b3b6bf9ad7a6f280e27dc3c1 Mon Sep 17 00:00:00 2001 From: gabriel klawitter Date: Tue, 14 Jul 2020 16:38:49 +0530 Subject: [PATCH 064/192] ci: fix subdirectory upload to s3 (#1398) --- .gitlab-ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index d0c057b32c..5e0bf77eef 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -253,8 +253,8 @@ publish-s3-release: - echo "uploading objects to https://${BUCKET}/${PREFIX}/${VERSION}" - aws s3 sync ./artifacts/ s3://${BUCKET}/${PREFIX}/${VERSION}/ - echo "update objects at https://${BUCKET}/${PREFIX}/${EXTRATAG}" - - for file in ./artifacts/*; do - name="$(basename ${file})"; + - find ./artifacts -type f | while read file; do + name="${file#./artifacts/}"; aws s3api copy-object --copy-source ${BUCKET}/${PREFIX}/${VERSION}/${name} --bucket ${BUCKET} --key ${PREFIX}/${EXTRATAG}/${name}; -- GitLab From d7684115a126304075c83e0a40ac9c043dbf989f Mon Sep 17 00:00:00 2001 From: Peter Goodspeed-Niklaus Date: Tue, 14 Jul 2020 15:36:05 +0200 Subject: [PATCH 065/192] mod subsystem-util (#1376) * Add subsystem-util crate. Start by moving the JobCanceler here. * copy utility functions for requesting runtime data; generalize * convert subsystem-util from crate to module in subsystem The point of making a sub-crate is to ensure that only the necessary parts of a program get compiled; if a dependent package needed only subsystem-util, and not subsystem, then subsystem wouldn't need to be compiled. However, that will never happen: subsystem-util depends on subsystem::messages, so subsystem will always be compiled. Therefore, it makes more sense to add it as a module in the existing crate than as a new and distinct crate. * make runtime request sender type generic * candidate backing subsystem uses util for api requests * add struct Validator representing the local validator This struct can be constructed when the local node is a validator; the constructor fails otherwise. It stores a bit of local data, and provides some utility methods. * add alternate constructor for better efficiency * refactor candidate backing to use utility methods * fix test breakage caused by reordering tests * restore test which accidentally got deleted during merge * start extracting jobs management into helper traits + structs * use util::{JobHandle, Jobs} in CandidateBackingSubsystem * implement generic job-manager subsystem impl This means that the work of implementing a subsystem boils down to implementing the job, and then writing an appropriate type definition, i.e. pub type CandidateBackingSubsystem = util::JobManager; * add hash-extraction helper to messages * fix errors caused by improper rebase * doc improvement * simplify conversion from overseer communication to job message * document fn hash for all messages * rename fn hash() -> fn relay_parent * gracefully shut down running futures on Conclude * ensure we're validating with the proper validator index * rename: handle_unhashed_msg -> handle_orphan_msg * impl Stream for Jobs This turns out to be relatively complicated and requires some unsafe code, so we'll want either detailed review, or to choose to revert this commit. * add missing documentation for public items * use pin-project to eliminate unsafe code from this codebase * rename SenderMessage -> FromJob * reenvision the subsystem requests as an extension trait This works within `util.rs`, but fails in `core/backing/src/lib.rs`, because we don't actually create the struct soon enough. Continuing down this path would imply substantial rewriting. * Revert "reenvision the subsystem requests as an extension trait" This reverts commit a5639e36017a72656b478caddcaa30e2d4e6112a. The fact is, the new API is more complicated to no real benefit. * apply suggested futuresunordered join_all impl * CandidateValidationMessage variants have no top-level relay parents * rename handle_orphan_msg -> handle_unanchored_msg * make most node-core-backing types private Now the only public types exposed in that module are CandidateBackingSubsystem and ToJob. While ideally we could reduce the public interface to only the former type, that doesn't work because ToJob appears in the public interface of CandidateBackingSubsystem. This also involves changing the definition of CandidateBackingSubsystem; it is no longer a typedef, but a struct wrapping the job manager. --- Cargo.lock | 11 +- node/core/backing/Cargo.toml | 4 - node/core/backing/src/lib.rs | 527 +++++++++------------------- node/subsystem/Cargo.toml | 14 +- node/subsystem/src/lib.rs | 4 + node/subsystem/src/messages.rs | 115 +++++++ node/subsystem/src/util.rs | 613 +++++++++++++++++++++++++++++++++ 7 files changed, 915 insertions(+), 373 deletions(-) create mode 100644 node/subsystem/src/util.rs diff --git a/Cargo.lock b/Cargo.lock index 9f8d5c94f0..7f60ff2254 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4488,8 +4488,6 @@ dependencies = [ "bitvec", "derive_more 0.99.9", "futures 0.3.5", - "futures-timer 3.0.2", - "log 0.4.8", "polkadot-erasure-coding", "polkadot-node-primitives", "polkadot-node-subsystem", @@ -4502,7 +4500,6 @@ dependencies = [ "sp-blockchain", "sp-core", "sp-keyring", - "streamunordered", ] [[package]] @@ -4547,11 +4544,19 @@ name = "polkadot-node-subsystem" version = "0.1.0" dependencies = [ "async-trait", + "derive_more 0.99.9", "futures 0.3.5", + "futures-timer 3.0.2", + "log 0.4.8", + "parity-scale-codec", + "pin-project", "polkadot-node-primitives", "polkadot-primitives", "polkadot-statement-table", + "sc-keystore", "sc-network", + "sp-core", + "streamunordered", ] [[package]] diff --git a/node/core/backing/Cargo.toml b/node/core/backing/Cargo.toml index b25055293a..720b8af418 100644 --- a/node/core/backing/Cargo.toml +++ b/node/core/backing/Cargo.toml @@ -6,20 +6,16 @@ edition = "2018" [dependencies] futures = "0.3.5" -log = "0.4.8" sp-api = { git = "https://github.com/paritytech/substrate", branch = "master" } sc-client-api = { git = "https://github.com/paritytech/substrate", branch = "master" } sp-blockchain = { git = "https://github.com/paritytech/substrate", branch = "master" } keystore = { package = "sc-keystore", git = "https://github.com/paritytech/substrate", branch = "master" } primitives = { package = "sp-core", git = "https://github.com/paritytech/substrate", branch = "master" } - polkadot-primitives = { path = "../../../primitives" } polkadot-node-primitives = { path = "../../primitives" } polkadot-subsystem = { package = "polkadot-node-subsystem", path = "../../subsystem" } erasure-coding = { package = "polkadot-erasure-coding", path = "../../../erasure-coding" } statement-table = { package = "polkadot-statement-table", path = "../../../statement-table" } -futures-timer = "3.0.2" -streamunordered = "0.5.1" derive_more = "0.99.9" bitvec = { version = "0.17.4", default-features = false, features = ["alloc"] } diff --git a/node/core/backing/src/lib.rs b/node/core/backing/src/lib.rs index 281147847e..e0309ec842 100644 --- a/node/core/backing/src/lib.rs +++ b/node/core/backing/src/lib.rs @@ -16,45 +16,43 @@ //! Implements a `CandidateBackingSubsystem`. -#![recursion_limit="256"] - use std::collections::{HashMap, HashSet}; use std::convert::TryFrom; use std::pin::Pin; use std::sync::Arc; -use std::time::Duration; use bitvec::vec::BitVec; -use log; use futures::{ - select, FutureExt, SinkExt, StreamExt, - channel::{oneshot, mpsc}, - future::{self, Either}, - task::{Spawn, SpawnError, SpawnExt}, + channel::{mpsc, oneshot}, + task::{Spawn, SpawnError}, + Future, FutureExt, SinkExt, StreamExt, }; -use futures_timer::Delay; -use streamunordered::{StreamUnordered, StreamYield}; -use primitives::Pair; use keystore::KeyStorePtr; use polkadot_primitives::v1::{ - CommittedCandidateReceipt, BackedCandidate, Id as ParaId, ValidatorPair, ValidatorId, + CommittedCandidateReceipt, BackedCandidate, Id as ParaId, ValidatorId, ValidatorIndex, SigningContext, PoV, OmittedValidationData, CandidateDescriptor, AvailableData, ErasureChunk, ValidatorSignature, Hash, CandidateReceipt, CandidateCommitments, }; use polkadot_node_primitives::{ - FromTableMisbehavior, Statement, SignedFullStatement, MisbehaviorReport, ValidationResult, - ValidationOutputs, + FromTableMisbehavior, Statement, SignedFullStatement, MisbehaviorReport, + ValidationOutputs, ValidationResult, }; use polkadot_subsystem::{ - FromOverseer, OverseerSignal, Subsystem, SubsystemContext, SpawnedSubsystem, -}; -use polkadot_subsystem::messages::{ - AllMessages, CandidateBackingMessage, CandidateSelectionMessage, SchedulerRoster, - RuntimeApiMessage, RuntimeApiRequest, CandidateValidationMessage, ValidationFailed, - StatementDistributionMessage, NewBackedCandidate, ProvisionerMessage, ProvisionableData, - PoVDistributionMessage, AvailabilityStoreMessage, + Subsystem, SubsystemContext, SpawnedSubsystem, + messages::{ + AllMessages, AvailabilityStoreMessage, CandidateBackingMessage, CandidateSelectionMessage, + CandidateValidationMessage, NewBackedCandidate, PoVDistributionMessage, ProvisionableData, + ProvisionerMessage, RuntimeApiMessage, StatementDistributionMessage, ValidationFailed, + }, + util::{ + self, + request_signing_context, + request_validator_groups, + request_validators, + Validator, + }, }; use statement_table::{ generic::AttestedCandidate as TableAttestedCandidate, @@ -68,9 +66,7 @@ use statement_table::{ #[derive(Debug, derive_more::From)] enum Error { - NotInValidatorSet, CandidateNotFound, - JobNotFound(Hash), InvalidSignature, #[from] Erasure(erasure_coding::Error), @@ -82,6 +78,8 @@ enum Error { Mpsc(mpsc::SendError), #[from] Spawn(SpawnError), + #[from] + UtilError(util::Error), } /// Holds all data needed for candidate backing job operation. @@ -92,7 +90,6 @@ struct CandidateBackingJob { rx_to: mpsc::Receiver, /// Outbound message channel sending part. tx_from: mpsc::Sender, - /// The `ParaId`s assigned to this validator. assignment: ParaId, /// We issued `Valid` or `Invalid` statements on about these candidates. @@ -101,7 +98,6 @@ struct CandidateBackingJob { seconded: Option, /// We have already reported misbehaviors for these validators. reported_misbehavior_for: HashSet, - table: Table, table_context: TableContext, } @@ -113,7 +109,7 @@ const fn group_quorum(n_validators: usize) -> usize { #[derive(Default)] struct TableContext { signing_context: SigningContext, - key: Option, + validator: Option, groups: HashMap>, validators: Vec, } @@ -142,30 +138,40 @@ impl TableContextTrait for TableContext { } } -impl TableContext { - fn local_id(&self) -> Option { - self.key.as_ref().map(|k| k.public()) +/// A message type that is sent from `CandidateBackingSubsystem` to `CandidateBackingJob`. +pub enum ToJob { + /// A `CandidateBackingMessage`. + CandidateBacking(CandidateBackingMessage), + /// Stop working. + Stop, +} + +impl TryFrom for ToJob { + type Error = (); + + fn try_from(msg: AllMessages) -> Result { + match msg { + AllMessages::CandidateBacking(msg) => Ok(ToJob::CandidateBacking(msg)), + _ => Err(()), + } } +} - fn local_index(&self) -> Option { - self.local_id().and_then(|id| - self.validators - .iter() - .enumerate() - .find(|(_, k)| k == &&id) - .map(|(i, _)| i as ValidatorIndex) - ) +impl From for ToJob { + fn from(msg: CandidateBackingMessage) -> Self { + Self::CandidateBacking(msg) } } -const CHANNEL_CAPACITY: usize = 64; +impl util::ToJobTrait for ToJob { + const STOP: Self = ToJob::Stop; -/// A message type that is sent from `CandidateBackingSubsystem` to `CandidateBackingJob`. -enum ToJob { - /// A `CandidateBackingMessage`. - CandidateBacking(CandidateBackingMessage), - /// Stop working. - Stop, + fn relay_parent(&self) -> Option { + match self { + Self::CandidateBacking(cb) => cb.relay_parent(), + Self::Stop => None, + } + } } /// A message type that is sent from `CandidateBackingJob` to `CandidateBackingSubsystem`. @@ -193,6 +199,23 @@ impl From for AllMessages { } } +impl TryFrom for FromJob { + type Error = &'static str; + + fn try_from(f: AllMessages) -> Result { + match f { + AllMessages::AvailabilityStore(msg) => Ok(FromJob::AvailabilityStore(msg)), + AllMessages::RuntimeApi(msg) => Ok(FromJob::RuntimeApiMessage(msg)), + AllMessages::CandidateValidation(msg) => Ok(FromJob::CandidateValidation(msg)), + AllMessages::CandidateSelection(msg) => Ok(FromJob::CandidateSelection(msg)), + AllMessages::StatementDistribution(msg) => Ok(FromJob::StatementDistribution(msg)), + AllMessages::PoVDistribution(msg) => Ok(FromJob::PoVDistribution(msg)), + AllMessages::Provisioner(msg) => Ok(FromJob::Provisioner(msg)), + _ => Err("can't convert this AllMessages variant to FromJob"), + } + } +} + // It looks like it's not possible to do an `impl From` given the current state of // the code. So this does the necessary conversion. fn primitive_statement_to_table(s: &SignedFullStatement) -> TableSignedStatement { @@ -209,19 +232,9 @@ fn primitive_statement_to_table(s: &SignedFullStatement) -> TableSignedStatement } } -// finds the first key we are capable of signing with out of the given set of validators, -// if any. -fn signing_key(validators: &[ValidatorId], keystore: &KeyStorePtr) -> Option { - let keystore = keystore.read(); - validators.iter() - .find_map(|v| { - keystore.key_pair::(&v).ok() - }) -} - impl CandidateBackingJob { /// Run asynchronously. - async fn run(mut self) -> Result<(), Error> { + async fn run_loop(mut self) -> Result<(), Error> { while let Some(msg) = self.rx_to.next().await { match msg { ToJob::CandidateBacking(msg) => { @@ -328,9 +341,7 @@ impl CandidateBackingJob { None => continue, }; - let mut validator_indices = BitVec::with_capacity( - group.len() - ); + let mut validator_indices = BitVec::with_capacity(group.len()); validator_indices.resize(group.len(), false); @@ -371,7 +382,7 @@ impl CandidateBackingJob { if let Ok(report) = MisbehaviorReport::try_from(f) { let message = ProvisionerMessage::ProvisionableData( - ProvisionableData::MisbehaviorReport(self.parent, report) + ProvisionableData::MisbehaviorReport(self.parent, report), ); reports.push(message); @@ -513,18 +524,7 @@ impl CandidateBackingJob { } fn sign_statement(&self, statement: Statement) -> Option { - let local_index = self.table_context.local_index()?; - - let signing_key = self.table_context.key.as_ref()?; - - let signed_statement = SignedFullStatement::sign( - statement, - &self.table_context.signing_context, - local_index, - signing_key, - ); - - Some(signed_statement) + Some(self.table_context.validator.as_ref()?.sign(statement)) } fn check_statement_signature(&self, statement: &SignedFullStatement) -> Result<(), Error> { @@ -657,329 +657,133 @@ impl CandidateBackingJob { } } -struct JobHandle { - abort_handle: future::AbortHandle, - to_job: mpsc::Sender, - finished: oneshot::Receiver<()>, - su_handle: usize, -} +impl util::JobTrait for CandidateBackingJob { + type ToJob = ToJob; + type FromJob = FromJob; + type Error = Error; + type RunArgs = KeyStorePtr; -impl JobHandle { - async fn stop(mut self) { - let _ = self.to_job.send(ToJob::Stop).await; - let stop_timer = Delay::new(Duration::from_secs(1)); - - match future::select(stop_timer, self.finished).await { - Either::Left((_, _)) => { - }, - Either::Right((_, _)) => { - self.abort_handle.abort(); - }, - } - } + const NAME: &'static str = "CandidateBackingJob"; - async fn send_msg(&mut self, msg: ToJob) -> Result<(), Error> { - Ok(self.to_job.send(msg).await?) - } -} - -struct Jobs { - spawner: S, - running: HashMap, - outgoing_msgs: StreamUnordered>, -} - -async fn run_job( - parent: Hash, - keystore: KeyStorePtr, - rx_to: mpsc::Receiver, - mut tx_from: mpsc::Sender, -) -> Result<(), Error> { - let (validators, roster) = futures::try_join!( - request_validators(parent, &mut tx_from).await?, - request_validator_groups(parent, &mut tx_from).await?, - )?; - - let key = signing_key(&validators[..], &keystore).ok_or(Error::NotInValidatorSet)?; - let mut groups = HashMap::new(); - - for assignment in roster.scheduled { - if let Some(g) = roster.validator_groups.get(assignment.group_idx.0 as usize) { - groups.insert( - assignment.para_id, - g.clone(), - ); - } - } - - let mut assignment = Default::default(); - - if let Some(idx) = validators.iter().position(|k| *k == key.public()) { - let idx = idx as u32; - for (para_id, group) in groups.iter() { - if group.contains(&idx) { - assignment = *para_id; - break; + fn run( + parent: Hash, + keystore: KeyStorePtr, + rx_to: mpsc::Receiver, + mut tx_from: mpsc::Sender, + ) -> Pin> + Send>> { + async move { + let (validators, roster, signing_context) = futures::try_join!( + request_validators(parent, &mut tx_from).await?, + request_validator_groups(parent, &mut tx_from).await?, + request_signing_context(parent, &mut tx_from).await?, + )?; + + let validator = Validator::construct(&validators, signing_context, keystore.clone())?; + + let mut groups = HashMap::new(); + + for assignment in roster.scheduled { + if let Some(g) = roster.validator_groups.get(assignment.group_idx.0 as usize) { + groups.insert(assignment.para_id, g.clone()); + } } - } - } - - let signing_context = request_signing_context(parent, &mut tx_from).await?.await?; - - let table_context = TableContext { - signing_context, - key: Some(key), - groups, - validators, - }; - - let job = CandidateBackingJob { - parent, - rx_to, - tx_from, - assignment, - issued_statements: HashSet::new(), - seconded: None, - reported_misbehavior_for: HashSet::new(), - table: Table::default(), - table_context, - }; - - job.run().await -} - -/// Request a validator set from the `RuntimeApi`. -async fn request_validators( - parent: Hash, - s: &mut mpsc::Sender, -) -> Result>, Error> { - let (tx, rx) = oneshot::channel(); - s.send(FromJob::RuntimeApiMessage(RuntimeApiMessage::Request( - parent, - RuntimeApiRequest::Validators(tx), - ) - )).await?; + let mut assignment = Default::default(); - Ok(rx) -} - -/// Request the scheduler roster from `RuntimeApi`. -async fn request_validator_groups( - parent: Hash, - s: &mut mpsc::Sender, -) -> Result, Error> { - let (tx, rx) = oneshot::channel(); - - s.send(FromJob::RuntimeApiMessage(RuntimeApiMessage::Request( - parent, - RuntimeApiRequest::ValidatorGroups(tx), - ) - )).await?; - - Ok(rx) -} - -/// Request a `SigningContext` from the `RuntimeApi`. -async fn request_signing_context( - parent: Hash, - s: &mut mpsc::Sender, -) -> Result, Error> { - let (tx, rx) = oneshot::channel(); - - s.send(FromJob::RuntimeApiMessage(RuntimeApiMessage::Request( - parent, - RuntimeApiRequest::SigningContext(tx), - ) - )).await?; - - Ok(rx) -} - -impl Jobs { - fn new(spawner: S) -> Self { - Self { - spawner, - running: HashMap::default(), - outgoing_msgs: StreamUnordered::new(), - } - } - - fn spawn_job(&mut self, parent_hash: Hash, keystore: KeyStorePtr) -> Result<(), Error> { - let (to_job_tx, to_job_rx) = mpsc::channel(CHANNEL_CAPACITY); - let (from_job_tx, from_job_rx) = mpsc::channel(CHANNEL_CAPACITY); - - let (future, abort_handle) = future::abortable(async move { - if let Err(e) = run_job(parent_hash, keystore, to_job_rx, from_job_tx).await { - log::error!( - "CandidateBackingJob({}) finished with an error {:?}", - parent_hash, - e, - ); + if let Some(idx) = validators.iter().position(|k| *k == validator.id()) { + let idx = idx as u32; + for (para_id, group) in groups.iter() { + if group.contains(&idx) { + assignment = *para_id; + break; + } + } } - }); - - let (finished_tx, finished) = oneshot::channel(); - - let future = async move { - let _ = future.await; - let _ = finished_tx.send(()); - }; - self.spawner.spawn(future)?; - - let su_handle = self.outgoing_msgs.push(from_job_rx); - - let handle = JobHandle { - abort_handle, - to_job: to_job_tx, - finished, - su_handle, - }; - - self.running.insert(parent_hash, handle); - Ok(()) - } + let table_context = TableContext { + groups, + validators, + signing_context: validator.signing_context().clone(), + validator: Some(validator), + }; - async fn stop_job(&mut self, parent_hash: Hash) -> Result<(), Error> { - match self.running.remove(&parent_hash) { - Some(handle) => { - Pin::new(&mut self.outgoing_msgs).remove(handle.su_handle); - handle.stop().await; - Ok(()) - } - None => Err(Error::JobNotFound(parent_hash)) - } - } + let job = CandidateBackingJob { + parent, + rx_to, + tx_from, + assignment, + issued_statements: HashSet::new(), + seconded: None, + reported_misbehavior_for: HashSet::new(), + table: Table::default(), + table_context, + }; - async fn send_msg(&mut self, parent_hash: Hash, msg: ToJob) -> Result<(), Error> { - if let Some(job) = self.running.get_mut(&parent_hash) { - job.send_msg(msg).await?; + job.run_loop().await } - Ok(()) - } - - async fn next(&mut self) -> Option { - self.outgoing_msgs.next().await.and_then(|(e, _)| match e { - StreamYield::Item(e) => Some(e), - _ => None, - }) + .boxed() } } +/// Manager type for the CandidateBackingSubsystem +type Manager = util::JobManager; + /// An implementation of the Candidate Backing subsystem. -pub struct CandidateBackingSubsystem { - spawner: S, - keystore: KeyStorePtr, - _context: std::marker::PhantomData, +pub struct CandidateBackingSubsystem { + manager: Manager, } -impl CandidateBackingSubsystem - where - S: Spawn + Clone, - Context: SubsystemContext, +impl CandidateBackingSubsystem +where + Spawner: Clone + Spawn + Send + Unpin, + Context: SubsystemContext, + ToJob: From<::Message>, { /// Creates a new `CandidateBackingSubsystem`. - pub fn new(keystore: KeyStorePtr, spawner: S) -> Self { - Self { - spawner, - keystore, - _context: std::marker::PhantomData, + pub fn new(spawner: Spawner, keystore: KeyStorePtr) -> Self { + CandidateBackingSubsystem { + manager: util::JobManager::new(spawner, keystore) } } - async fn run( - mut ctx: Context, - keystore: KeyStorePtr, - spawner: S, - ) { - let mut jobs = Jobs::new(spawner.clone()); - - loop { - select! { - incoming = ctx.recv().fuse() => { - match incoming { - Ok(msg) => match msg { - FromOverseer::Signal(OverseerSignal::StartWork(hash)) => { - if let Err(e) = jobs.spawn_job(hash, keystore.clone()) { - log::error!("Failed to spawn a job: {:?}", e); - break; - } - } - FromOverseer::Signal(OverseerSignal::StopWork(hash)) => { - if let Err(e) = jobs.stop_job(hash).await { - log::error!("Failed to spawn a job: {:?}", e); - break; - } - } - FromOverseer::Communication { msg } => { - match msg { - CandidateBackingMessage::Second(hash, _, _) | - CandidateBackingMessage::Statement(hash, _) | - CandidateBackingMessage::GetBackedCandidates(hash, _) => { - let res = jobs.send_msg( - hash.clone(), - ToJob::CandidateBacking(msg), - ).await; - - if let Err(e) = res { - log::error!( - "Failed to send a message to a job: {:?}", - e, - ); - - break; - } - } - _ => (), - } - } - _ => (), - }, - Err(_) => break, - } - } - outgoing = jobs.next().fuse() => { - match outgoing { - Some(msg) => { - let _ = ctx.send_message(msg.into()).await; - } - None => break, - } - } - complete => break, - } - } + /// Run this subsystem + pub async fn run(ctx: Context, keystore: KeyStorePtr, spawner: Spawner) { + >::run(ctx, keystore, spawner).await } } -impl Subsystem for CandidateBackingSubsystem - where - S: Spawn + Send + Clone + 'static, - Context: SubsystemContext, +impl Subsystem for CandidateBackingSubsystem +where + Spawner: Spawn + Send + Clone + Unpin + 'static, + Context: SubsystemContext, + ::Message: Into, { fn start(self, ctx: Context) -> SpawnedSubsystem { - let keystore = self.keystore.clone(); - let spawner = self.spawner.clone(); - - SpawnedSubsystem(Box::pin(async move { - Self::run(ctx, keystore, spawner).await; - })) + self.manager.start(ctx) } } + + #[cfg(test)] mod tests { use super::*; - use futures::{Future, executor::{self, ThreadPool}}; - use std::collections::HashMap; - use std::sync::Arc; - use sp_keyring::Sr25519Keyring; + use assert_matches::assert_matches; + use futures::{ + executor::{self, ThreadPool}, + future, Future, + }; use polkadot_primitives::v1::{ - AssignmentKind, CollatorId, CoreAssignment, BlockData, CoreIndex, GroupIndex, ValidityAttestation, - CandidateCommitments, LocalValidationData, GlobalValidationSchedule, HeadData, + AssignmentKind, BlockData, CandidateCommitments, CollatorId, CoreAssignment, CoreIndex, + LocalValidationData, GlobalValidationSchedule, GroupIndex, HeadData, + ValidatorPair, ValidityAttestation, }; - use assert_matches::assert_matches; + use polkadot_subsystem::{ + messages::{RuntimeApiRequest, SchedulerRoster}, + FromOverseer, OverseerSignal, + }; + use sp_keyring::Sr25519Keyring; + use std::collections::HashMap; fn validator_pubkeys(val_ids: &[Sr25519Keyring]) -> Vec { val_ids.iter().map(|v| v.public().into()).collect() @@ -1545,7 +1349,6 @@ mod tests { ).unwrap(); } ); - }); } @@ -1626,8 +1429,6 @@ mod tests { virtual_overseer.send(FromOverseer::Communication{ msg: second }).await; - let expected_head_data = test_state.head_data.get(&test_state.chain_ids[0]).unwrap(); - assert_matches!( virtual_overseer.recv().await, AllMessages::CandidateValidation( diff --git a/node/subsystem/Cargo.toml b/node/subsystem/Cargo.toml index 43712319cb..188e7cbfa7 100644 --- a/node/subsystem/Cargo.toml +++ b/node/subsystem/Cargo.toml @@ -6,9 +6,17 @@ edition = "2018" description = "Subsystem traits and message definitions" [dependencies] +async-trait = "0.1" +derive_more = "0.99.9" +futures = "0.3.5" +futures-timer = "3.0.2" +keystore = { package = "sc-keystore", git = "https://github.com/paritytech/substrate", branch = "master" } +log = "0.4.8" +parity-scale-codec = "1.3.0" +pin-project = "0.4.22" +polkadot-node-primitives = { path = "../primitives" } polkadot-primitives = { path = "../../primitives" } polkadot-statement-table = { path = "../../statement-table" } -polkadot-node-primitives = { path = "../primitives" } sc-network = { git = "https://github.com/paritytech/substrate", branch = "master" } -futures = "0.3.5" -async-trait = "0.1" +sp-core = { git = "https://github.com/paritytech/substrate", branch = "master" } +streamunordered = "0.5.1" diff --git a/node/subsystem/src/lib.rs b/node/subsystem/src/lib.rs index e374eb9cfc..b6c3a79ef3 100644 --- a/node/subsystem/src/lib.rs +++ b/node/subsystem/src/lib.rs @@ -20,6 +20,8 @@ //! that communicate via message-passing. They are coordinated by an overseer, provided by a //! separate crate. +#![warn(missing_docs)] + use std::pin::Pin; use futures::prelude::*; @@ -32,6 +34,7 @@ use async_trait::async_trait; use crate::messages::AllMessages; pub mod messages; +pub mod util; /// Signals sent by an overseer to a subsystem. #[derive(PartialEq, Clone, Debug)] @@ -56,6 +59,7 @@ pub enum FromOverseer { /// Some other `Subsystem`'s message. Communication { + /// Contained message msg: M, }, } diff --git a/node/subsystem/src/messages.rs b/node/subsystem/src/messages.rs index 10c861f141..d3c630cb56 100644 --- a/node/subsystem/src/messages.rs +++ b/node/subsystem/src/messages.rs @@ -51,6 +51,15 @@ pub enum CandidateSelectionMessage { Invalid(Hash, CandidateReceipt), } +impl CandidateSelectionMessage { + /// If the current variant contains the relay parent hash, return it. + pub fn relay_parent(&self) -> Option { + match self { + Self::Invalid(hash, _) => Some(*hash), + } + } +} + /// Messages received by the Candidate Backing subsystem. #[derive(Debug)] pub enum CandidateBackingMessage { @@ -65,6 +74,18 @@ pub enum CandidateBackingMessage { Statement(Hash, SignedFullStatement), } + +impl CandidateBackingMessage { + /// If the current variant contains the relay parent hash, return it. + pub fn relay_parent(&self) -> Option { + match self { + Self::GetBackedCandidates(hash, _) => Some(*hash), + Self::Second(hash, _, _) => Some(*hash), + Self::Statement(hash, _) => Some(*hash), + } + } +} + /// Blanket error for validation failing. #[derive(Debug)] pub struct ValidationFailed; @@ -102,6 +123,16 @@ pub enum CandidateValidationMessage { ), } +impl CandidateValidationMessage { + /// If the current variant contains the relay parent hash, return it. + pub fn relay_parent(&self) -> Option { + match self { + Self::ValidateFromChainState(_, _, _) => None, + Self::ValidateFromExhaustive(_, _, _, _, _) => None, + } + } +} + /// Events from network. #[derive(Debug, Clone)] pub enum NetworkBridgeEvent { @@ -134,6 +165,17 @@ pub enum NetworkBridgeMessage { SendMessage(Vec, ProtocolId, Vec), } +impl NetworkBridgeMessage { + /// If the current variant contains the relay parent hash, return it. + pub fn relay_parent(&self) -> Option { + match self { + Self::RegisterEventProducer(_, _) => None, + Self::ReportPeer(_, _) => None, + Self::SendMessage(_, _, _) => None, + } + } +} + /// Availability Distribution Message. #[derive(Debug)] pub enum AvailabilityDistributionMessage { @@ -147,6 +189,17 @@ pub enum AvailabilityDistributionMessage { NetworkBridgeUpdate(NetworkBridgeEvent), } +impl AvailabilityDistributionMessage { + /// If the current variant contains the relay parent hash, return it. + pub fn relay_parent(&self) -> Option { + match self { + Self::DistributeChunk(hash, _) => Some(*hash), + Self::FetchChunk(hash, _) => Some(*hash), + Self::NetworkBridgeUpdate(_) => None, + } + } +} + /// Bitfield distribution message. #[derive(Debug)] pub enum BitfieldDistributionMessage { @@ -157,6 +210,16 @@ pub enum BitfieldDistributionMessage { NetworkBridgeUpdate(NetworkBridgeEvent), } +impl BitfieldDistributionMessage { + /// If the current variant contains the relay parent hash, return it. + pub fn relay_parent(&self) -> Option { + match self { + Self::DistributeBitfield(hash, _) => Some(*hash), + Self::NetworkBridgeUpdate(_) => None, + } + } +} + /// Availability store subsystem message. #[derive(Debug)] pub enum AvailabilityStoreMessage { @@ -170,6 +233,17 @@ pub enum AvailabilityStoreMessage { StoreChunk(Hash, ValidatorIndex, ErasureChunk), } +impl AvailabilityStoreMessage { + /// If the current variant contains the relay parent hash, return it. + pub fn relay_parent(&self) -> Option { + match self { + Self::QueryPoV(hash, _) => Some(*hash), + Self::QueryChunk(hash, _, _) => Some(*hash), + Self::StoreChunk(hash, _, _) => Some(*hash), + } + } +} + /// The information on scheduler assignments that some somesystems may be querying. #[derive(Debug, Clone)] pub struct SchedulerRoster { @@ -207,6 +281,15 @@ pub enum RuntimeApiMessage { Request(Hash, RuntimeApiRequest), } +impl RuntimeApiMessage { + /// If the current variant contains the relay parent hash, return it. + pub fn relay_parent(&self) -> Option { + match self { + Self::Request(hash, _) => Some(*hash), + } + } +} + /// Statement distribution message. #[derive(Debug)] pub enum StatementDistributionMessage { @@ -217,6 +300,16 @@ pub enum StatementDistributionMessage { NetworkBridgeUpdate(NetworkBridgeEvent), } +impl StatementDistributionMessage { + /// If the current variant contains the relay parent hash, return it. + pub fn relay_parent(&self) -> Option { + match self { + Self::Share(hash, _) => Some(*hash), + Self::NetworkBridgeUpdate(_) => None, + } + } +} + /// This data becomes intrinsics or extrinsics which should be included in a future relay chain block. #[derive(Debug)] pub enum ProvisionableData { @@ -253,6 +346,17 @@ pub enum ProvisionerMessage { ProvisionableData(ProvisionableData), } +impl ProvisionerMessage { + /// If the current variant contains the relay parent hash, return it. + pub fn relay_parent(&self) -> Option { + match self { + Self::RequestBlockAuthorshipData(hash, _) => Some(*hash), + Self::RequestInherentData(hash, _) => Some(*hash), + Self::ProvisionableData(_) => None, + } + } +} + /// Message to the PoV Distribution Subsystem. #[derive(Debug)] pub enum PoVDistributionMessage { @@ -268,6 +372,17 @@ pub enum PoVDistributionMessage { NetworkBridgeUpdate(NetworkBridgeEvent), } +impl PoVDistributionMessage { + /// If the current variant contains the relay parent hash, return it. + pub fn relay_parent(&self) -> Option { + match self { + Self::FetchPoV(hash, _, _) => Some(*hash), + Self::DistributePoV(hash, _, _) => Some(*hash), + Self::NetworkBridgeUpdate(_) => None, + } + } +} + /// A message type tying together all message types that are used across Subsystems. #[derive(Debug)] pub enum AllMessages { diff --git a/node/subsystem/src/util.rs b/node/subsystem/src/util.rs new file mode 100644 index 0000000000..1b89bfb053 --- /dev/null +++ b/node/subsystem/src/util.rs @@ -0,0 +1,613 @@ +// Copyright 2017-2020 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 . + +//! Utility module for subsystems +//! +//! Many subsystems have common interests such as canceling a bunch of spawned jobs, +//! or determining what their validator ID is. These common interests are factored into +//! this module. + +use crate::{ + messages::{AllMessages, RuntimeApiMessage, RuntimeApiRequest, SchedulerRoster}, + FromOverseer, SpawnedSubsystem, Subsystem, SubsystemContext, SubsystemResult, +}; +use futures::{ + channel::{mpsc, oneshot}, + future::Either, + prelude::*, + select, + stream::Stream, + task::{self, Spawn, SpawnError, SpawnExt}, +}; +use futures_timer::Delay; +use keystore::KeyStorePtr; +use parity_scale_codec::Encode; +use pin_project::{pin_project, pinned_drop}; +use polkadot_primitives::v1::{ + EncodeAs, Hash, HeadData, Id as ParaId, Signed, SigningContext, + ValidatorId, ValidatorIndex, ValidatorPair, +}; +use sp_core::Pair; +use std::{ + collections::HashMap, + convert::{TryFrom, TryInto}, + marker::Unpin, + pin::Pin, + time::Duration, +}; +use streamunordered::{StreamUnordered, StreamYield}; + +/// Duration a job will wait after sending a stop signal before hard-aborting. +pub const JOB_GRACEFUL_STOP_DURATION: Duration = Duration::from_secs(1); +/// Capacity of channels to and from individual jobs +pub const JOB_CHANNEL_CAPACITY: usize = 64; + +/// Utility errors +#[derive(Debug, derive_more::From)] +pub enum Error { + /// Attempted to send or receive on a oneshot channel which had been canceled + #[from] + Oneshot(oneshot::Canceled), + /// Attempted to send on a MPSC channel which has been canceled + #[from] + Mpsc(mpsc::SendError), + /// Attempted to spawn a new task, and failed + #[from] + Spawn(SpawnError), + /// Attempted to convert from an AllMessages to a FromJob, and failed. + SenderConversion(String), + /// The local node is not a validator. + NotAValidator, + /// The desired job is not present in the jobs list. + JobNotFound(Hash), +} + +/// Request some data from the `RuntimeApi`. +pub async fn request_from_runtime( + parent: Hash, + sender: &mut mpsc::Sender, + request_builder: RequestBuilder, +) -> Result, Error> +where + RequestBuilder: FnOnce(oneshot::Sender) -> RuntimeApiRequest, + FromJob: TryFrom, + >::Error: std::fmt::Debug, +{ + let (tx, rx) = oneshot::channel(); + + sender + .send( + AllMessages::RuntimeApi(RuntimeApiMessage::Request(parent, request_builder(tx))) + .try_into() + .map_err(|err| Error::SenderConversion(format!("{:?}", err)))?, + ) + .await?; + + Ok(rx) +} + +/// Request a validator set from the `RuntimeApi`. +pub async fn request_validators( + parent: Hash, + s: &mut mpsc::Sender, +) -> Result>, Error> +where + FromJob: TryFrom, + >::Error: std::fmt::Debug, +{ + request_from_runtime(parent, s, |tx| RuntimeApiRequest::Validators(tx)).await +} + +/// Request the scheduler roster from `RuntimeApi`. +pub async fn request_validator_groups( + parent: Hash, + s: &mut mpsc::Sender, +) -> Result, Error> +where + FromJob: TryFrom, + >::Error: std::fmt::Debug, +{ + request_from_runtime(parent, s, |tx| RuntimeApiRequest::ValidatorGroups(tx)).await +} + +/// Request a `SigningContext` from the `RuntimeApi`. +pub async fn request_signing_context( + parent: Hash, + s: &mut mpsc::Sender, +) -> Result, Error> +where + FromJob: TryFrom, + >::Error: std::fmt::Debug, +{ + request_from_runtime(parent, s, |tx| RuntimeApiRequest::SigningContext(tx)).await +} + +/// Request `HeadData` for some `ParaId` from `RuntimeApi`. +pub async fn request_head_data( + parent: Hash, + s: &mut mpsc::Sender, + id: ParaId, +) -> Result, Error> +where + FromJob: TryFrom, + >::Error: std::fmt::Debug, +{ + request_from_runtime(parent, s, |tx| RuntimeApiRequest::HeadData(id, tx)).await +} + +/// From the given set of validators, find the first key we can sign with, if any. +pub fn signing_key(validators: &[ValidatorId], keystore: &KeyStorePtr) -> Option { + let keystore = keystore.read(); + validators + .iter() + .find_map(|v| keystore.key_pair::(&v).ok()) +} + +/// Local validator information +/// +/// It can be created if the local node is a validator in the context of a particular +/// relay chain block. +pub struct Validator { + signing_context: SigningContext, + key: ValidatorPair, + index: ValidatorIndex, +} + +impl Validator { + /// Get a struct representing this node's validator if this node is in fact a validator in the context of the given block. + pub async fn new( + parent: Hash, + keystore: KeyStorePtr, + mut sender: mpsc::Sender, + ) -> Result + where + FromJob: TryFrom, + >::Error: std::fmt::Debug, + { + // Note: request_validators and request_signing_context do not and cannot run concurrently: they both + // have a mutable handle to the same sender. + // However, each of them returns a oneshot::Receiver, and those are resolved concurrently. + let (validators, signing_context) = futures::try_join!( + request_validators(parent, &mut sender).await?, + request_signing_context(parent, &mut sender).await?, + )?; + + Self::construct(&validators, signing_context, keystore) + } + + /// Construct a validator instance without performing runtime fetches. + /// + /// This can be useful if external code also needs the same data. + pub fn construct( + validators: &[ValidatorId], + signing_context: SigningContext, + keystore: KeyStorePtr, + ) -> Result { + let key = signing_key(validators, &keystore).ok_or(Error::NotAValidator)?; + let index = validators + .iter() + .enumerate() + .find(|(_, k)| k == &&key.public()) + .map(|(idx, _)| idx as ValidatorIndex) + .expect("signing_key would have already returned NotAValidator if the item we're searching for isn't in this list; qed"); + + Ok(Validator { + signing_context, + key, + index, + }) + } + + /// Get this validator's id. + pub fn id(&self) -> ValidatorId { + self.key.public() + } + + /// Get this validator's local index. + pub fn index(&self) -> ValidatorIndex { + self.index + } + + /// Get the current signing context. + pub fn signing_context(&self) -> &SigningContext { + &self.signing_context + } + + /// Sign a payload with this validator + pub fn sign, RealPayload: Encode>( + &self, + payload: Payload, + ) -> Signed { + Signed::sign(payload, &self.signing_context, self.index, &self.key) + } + + /// Validate the payload with this validator + /// + /// Validation can only succeed if `signed.validator_index() == self.index()`. + /// Normally, this will always be the case for a properly operating program, + /// but it's double-checked here anyway. + pub fn check_payload, RealPayload: Encode>( + &self, + signed: Signed, + ) -> Result<(), ()> { + if signed.validator_index() != self.index { + return Err(()); + } + signed.check_signature(&self.signing_context, &self.id()) + } +} + +/// ToJob is expected to be an enum declaring the set of messages of interest to a particular job. +/// +/// Normally, this will be some subset of `Allmessages`, and a `Stop` variant. +pub trait ToJobTrait: TryFrom { + /// The `Stop` variant of the ToJob enum. + const STOP: Self; + + /// If the message variant contains its relay parent, return it here + fn relay_parent(&self) -> Option; +} + +/// A JobHandle manages a particular job for a subsystem. +pub struct JobHandle { + abort_handle: future::AbortHandle, + to_job: mpsc::Sender, + finished: oneshot::Receiver<()>, + outgoing_msgs_handle: usize, +} + +impl JobHandle { + /// Send a message to the job. + pub async fn send_msg(&mut self, msg: ToJob) -> Result<(), Error> { + self.to_job.send(msg).await.map_err(Into::into) + } + + /// Abort the job without waiting for a graceful shutdown + pub fn abort(self) { + self.abort_handle.abort(); + } +} + +impl JobHandle { + /// Stop this job gracefully. + /// + /// If it hasn't shut itself down after `JOB_GRACEFUL_STOP_DURATION`, abort it. + pub async fn stop(mut self) { + // we don't actually care if the message couldn't be sent + let _ = self.to_job.send(ToJob::STOP).await; + let stop_timer = Delay::new(JOB_GRACEFUL_STOP_DURATION); + + match future::select(stop_timer, self.finished).await { + Either::Left((_, _)) => {} + Either::Right((_, _)) => { + self.abort_handle.abort(); + } + } + } +} + +/// This trait governs jobs. +/// +/// Jobs are instantiated and killed automatically on appropriate overseer messages. +/// Other messages are passed along to and from the job via the overseer to other +/// subsystems. +pub trait JobTrait: Unpin { + /// Message type to the job. Typically a subset of AllMessages. + type ToJob: 'static + ToJobTrait + Send; + /// Message type from the job. Typically a subset of AllMessages. + type FromJob: 'static + Into + Send; + /// Job runtime error. + type Error: std::fmt::Debug; + /// Extra arguments this job needs to run properly. + /// + /// If no extra information is needed, it is perfectly acceptable to set it to `()`. + type RunArgs: 'static + Send; + + /// Name of the job, i.e. `CandidateBackingJob` + const NAME: &'static str; + + /// Run a job for the parent block indicated + fn run( + parent: Hash, + run_args: Self::RunArgs, + rx_to: mpsc::Receiver, + tx_from: mpsc::Sender, + ) -> Pin> + Send>>; + + /// Handle a message which has no relay parent, and therefore can't be dispatched to a particular job + /// + /// By default, this is implemented with a NOP function. However, if + /// ToJob occasionally has messages which do not correspond to a particular + /// parent relay hash, then this function will be spawned as a one-off + /// task to handle those messages. + // TODO: the API here is likely not precisely what we want; figure it out more + // once we're implementing a subsystem which actually needs this feature. + // In particular, we're quite likely to want this to return a future instead of + // interrupting the active thread for the duration of the handler. + fn handle_unanchored_msg(_msg: Self::ToJob) -> Result<(), Self::Error> { + Ok(()) + } +} + +/// Jobs manager for a subsystem +/// +/// - Spawns new jobs for a given relay-parent on demand. +/// - Closes old jobs for a given relay-parent on demand. +/// - Dispatches messages to the appropriate job for a given relay-parent. +/// - When dropped, aborts all remaining jobs. +/// - implements `Stream`, collecting all messages from subordinate jobs. +#[pin_project(PinnedDrop)] +pub struct Jobs { + spawner: Spawner, + running: HashMap>, + #[pin] + outgoing_msgs: StreamUnordered>, + job: std::marker::PhantomData, +} + +impl Jobs { + /// Create a new Jobs manager which handles spawning appropriate jobs. + pub fn new(spawner: Spawner) -> Self { + Self { + spawner, + running: HashMap::new(), + outgoing_msgs: StreamUnordered::new(), + job: std::marker::PhantomData, + } + } + + /// Spawn a new job for this `parent_hash`, with whatever args are appropriate. + fn spawn_job(&mut self, parent_hash: Hash, run_args: Job::RunArgs) -> Result<(), Error> { + let (to_job_tx, to_job_rx) = mpsc::channel(JOB_CHANNEL_CAPACITY); + let (from_job_tx, from_job_rx) = mpsc::channel(JOB_CHANNEL_CAPACITY); + let (finished_tx, finished) = oneshot::channel(); + + let (future, abort_handle) = future::abortable(async move { + if let Err(e) = Job::run(parent_hash, run_args, to_job_rx, from_job_tx).await { + log::error!( + "{}({}) finished with an error {:?}", + Job::NAME, + parent_hash, + e, + ); + } + }); + + // discard output + let future = async move { + let _ = future.await; + let _ = finished_tx.send(()); + }; + self.spawner.spawn(future)?; + + // this handle lets us remove the appropriate receiver from self.outgoing_msgs + // when it's time to stop the job. + let outgoing_msgs_handle = self.outgoing_msgs.push(from_job_rx); + + let handle = JobHandle { + abort_handle, + to_job: to_job_tx, + finished, + outgoing_msgs_handle, + }; + + self.running.insert(parent_hash, handle); + + Ok(()) + } + + /// Stop the job associated with this `parent_hash`. + pub async fn stop_job(&mut self, parent_hash: Hash) -> Result<(), Error> { + match self.running.remove(&parent_hash) { + Some(handle) => { + Pin::new(&mut self.outgoing_msgs).remove(handle.outgoing_msgs_handle); + handle.stop().await; + Ok(()) + } + None => Err(Error::JobNotFound(parent_hash)), + } + } + + /// Send a message to the appropriate job for this `parent_hash`. + async fn send_msg(&mut self, parent_hash: Hash, msg: Job::ToJob) -> Result<(), Error> { + match self.running.get_mut(&parent_hash) { + Some(job) => job.send_msg(msg).await?, + None => return Err(Error::JobNotFound(parent_hash)), + } + Ok(()) + } +} + +// Note that on drop, we don't have the chance to gracefully spin down each of the remaining handles; +// we just abort them all. Still better than letting them dangle. +#[pinned_drop] +impl PinnedDrop for Jobs { + fn drop(self: Pin<&mut Self>) { + for job_handle in self.running.values() { + job_handle.abort_handle.abort(); + } + } +} + +impl Stream for Jobs +where + Spawner: Spawn, + Job: JobTrait, +{ + type Item = Job::FromJob; + + fn poll_next(self: Pin<&mut Self>, cx: &mut task::Context) -> task::Poll> { + // pin-project the outgoing messages + self.project() + .outgoing_msgs + .poll_next(cx) + .map(|opt| opt.and_then(|(stream_yield, _)| match stream_yield { + StreamYield::Item(msg) => Some(msg), + StreamYield::Finished(_) => None, + })) + } +} + +/// A basic implementation of a subsystem. +/// +/// This struct is responsible for handling message traffic between +/// this subsystem and the overseer. It spawns and kills jobs on the +/// appropriate Overseer messages, and dispatches standard traffic to +/// the appropriate job the rest of the time. +pub struct JobManager { + spawner: Spawner, + run_args: Job::RunArgs, + context: std::marker::PhantomData, + job: std::marker::PhantomData, +} + +impl JobManager +where + Spawner: Spawn + Clone + Send + Unpin, + Context: SubsystemContext, + Job: JobTrait, + Job::RunArgs: Clone, + Job::ToJob: TryFrom + TryFrom<::Message> + Sync, +{ + /// Creates a new `Subsystem`. + pub fn new(spawner: Spawner, run_args: Job::RunArgs) -> Self { + Self { + spawner, + run_args, + context: std::marker::PhantomData, + job: std::marker::PhantomData, + } + } + + /// Run this subsystem + /// + /// Conceptually, this is very simple: it just loops forever. + /// + /// - On incoming overseer messages, it starts or stops jobs as appropriate. + /// - On other incoming messages, if they can be converted into Job::ToJob and + /// include a hash, then they're forwarded to the appropriate individual job. + /// - On outgoing messages from the jobs, it forwards them to the overseer. + pub async fn run(mut ctx: Context, run_args: Job::RunArgs, spawner: Spawner) { + let mut jobs = Jobs::new(spawner.clone()); + + loop { + select! { + incoming = ctx.recv().fuse() => if Self::handle_incoming(incoming, &mut jobs, &run_args).await { break }, + outgoing = jobs.next().fuse() => if Self::handle_outgoing(outgoing, &mut ctx).await { break }, + complete => break, + } + } + } + + // handle an incoming message. return true if we should break afterwards. + async fn handle_incoming( + incoming: SubsystemResult>, + jobs: &mut Jobs, + run_args: &Job::RunArgs, + ) -> bool { + use crate::FromOverseer::{Communication, Signal}; + use crate::OverseerSignal::{Conclude, StartWork, StopWork}; + + match incoming { + Ok(Signal(StartWork(hash))) => { + if let Err(e) = jobs.spawn_job(hash, run_args.clone()) { + log::error!("Failed to spawn a job: {:?}", e); + return true; + } + } + Ok(Signal(StopWork(hash))) => { + if let Err(e) = jobs.stop_job(hash).await { + log::error!("Failed to stop a job: {:?}", e); + return true; + } + } + Ok(Signal(Conclude)) => { + // Breaking the loop ends fn run, which drops `jobs`, which immediately drops all ongoing work. + // We can afford to wait a little while to shut them all down properly before doing that. + // + // Forwarding the stream to a drain means we wait until all of the items in the stream + // have completed. Contrast with `into_future`, which turns it into a future of `(head, rest_stream)`. + use futures::stream::StreamExt; + use futures::stream::FuturesUnordered; + + let unordered = jobs.running + .drain() + .map(|(_, handle)| handle.stop()) + .collect::>(); + // now wait for all the futures to complete; collect a vector of their results + // this is strictly less efficient than draining them into oblivion, but this compiles, and that doesn't + // https://github.com/paritytech/polkadot/pull/1376#pullrequestreview-446488645 + let _ = async move { unordered.collect::>() }.await; + + return true; + } + Ok(Communication { msg }) => { + if let Ok(to_job) = ::try_from(msg) { + match to_job.relay_parent() { + Some(hash) => { + if let Err(err) = jobs.send_msg(hash, to_job).await { + log::error!("Failed to send a message to a job: {:?}", err); + return true; + } + } + None => { + if let Err(err) = Job::handle_unanchored_msg(to_job) { + log::error!("Failed to handle unhashed message: {:?}", err); + return true; + } + } + } + } + } + Err(err) => { + log::error!("error receiving message from subsystem context: {:?}", err); + return true; + } + } + false + } + + // handle an outgoing message. return true if we should break afterwards. + async fn handle_outgoing(outgoing: Option, ctx: &mut Context) -> bool { + match outgoing { + Some(msg) => { + // discard errors when sending the message upstream + let _ = ctx.send_message(msg.into()).await; + } + None => return true, + } + false + } +} + +impl Subsystem for JobManager +where + Spawner: Spawn + Send + Clone + Unpin + 'static, + Context: SubsystemContext, + ::Message: Into, + Job: JobTrait + Send, + Job::RunArgs: Clone + Sync, + Job::ToJob: TryFrom + Sync, +{ + fn start(self, ctx: Context) -> SpawnedSubsystem { + let spawner = self.spawner.clone(); + let run_args = self.run_args.clone(); + + SpawnedSubsystem(Box::pin(async move { + Self::run(ctx, run_args, spawner).await; + })) + } +} -- GitLab From 168c09227fb259e9a9dc2aeab74fe86f4bbc13ec Mon Sep 17 00:00:00 2001 From: Gavin Wood Date: Tue, 14 Jul 2020 19:25:26 +0200 Subject: [PATCH 066/192] Bump Substrate & versions (#1406) --- Cargo.lock | 314 ++++++++++----------- Cargo.toml | 2 +- availability-store/Cargo.toml | 2 +- cli/Cargo.toml | 2 +- collator/Cargo.toml | 2 +- erasure-coding/Cargo.toml | 2 +- network/Cargo.toml | 2 +- network/test/Cargo.toml | 2 +- parachain/Cargo.toml | 2 +- parachain/test-parachains/adder/Cargo.toml | 2 +- parachain/test-parachains/halt/Cargo.toml | 2 +- primitives/Cargo.toml | 2 +- rpc/Cargo.toml | 2 +- runtime/common/Cargo.toml | 2 +- runtime/kusama/Cargo.toml | 2 +- runtime/kusama/src/lib.rs | 2 +- runtime/polkadot/Cargo.toml | 2 +- runtime/polkadot/src/lib.rs | 2 +- runtime/test-runtime/Cargo.toml | 2 +- runtime/westend/Cargo.toml | 2 +- runtime/westend/src/lib.rs | 2 +- service/Cargo.toml | 2 +- statement-table/Cargo.toml | 2 +- validation/Cargo.toml | 2 +- 24 files changed, 180 insertions(+), 180 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 7f60ff2254..1c0583a703 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1314,7 +1314,7 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "fork-tree" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" +source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" dependencies = [ "parity-scale-codec", ] @@ -1322,7 +1322,7 @@ dependencies = [ [[package]] name = "frame-benchmarking" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" +source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" dependencies = [ "frame-support", "frame-system", @@ -1339,7 +1339,7 @@ dependencies = [ [[package]] name = "frame-benchmarking-cli" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" +source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" dependencies = [ "Inflector", "frame-benchmarking", @@ -1358,7 +1358,7 @@ dependencies = [ [[package]] name = "frame-executive" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" +source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" dependencies = [ "frame-support", "frame-system", @@ -1373,7 +1373,7 @@ dependencies = [ [[package]] name = "frame-metadata" version = "11.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" +source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" dependencies = [ "parity-scale-codec", "serde", @@ -1384,7 +1384,7 @@ dependencies = [ [[package]] name = "frame-support" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" +source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" dependencies = [ "bitmask", "frame-metadata", @@ -1409,7 +1409,7 @@ dependencies = [ [[package]] name = "frame-support-procedural" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" +source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" dependencies = [ "frame-support-procedural-tools", "proc-macro2 1.0.18", @@ -1420,7 +1420,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" +source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" dependencies = [ "frame-support-procedural-tools-derive", "proc-macro-crate", @@ -1432,7 +1432,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools-derive" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" +source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" dependencies = [ "proc-macro2 1.0.18", "quote 1.0.7", @@ -1442,7 +1442,7 @@ dependencies = [ [[package]] name = "frame-system" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" +source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" dependencies = [ "frame-support", "impl-trait-for-tuples", @@ -1458,7 +1458,7 @@ dependencies = [ [[package]] name = "frame-system-benchmarking" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" +source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" dependencies = [ "frame-benchmarking", "frame-support", @@ -1472,7 +1472,7 @@ dependencies = [ [[package]] name = "frame-system-rpc-runtime-api" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" +source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" dependencies = [ "parity-scale-codec", "sp-api", @@ -2422,7 +2422,7 @@ dependencies = [ [[package]] name = "kusama-runtime" -version = "0.8.14" +version = "0.8.15" dependencies = [ "bitvec", "frame-benchmarking", @@ -3466,7 +3466,7 @@ dependencies = [ [[package]] name = "pallet-authority-discovery" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" +source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" dependencies = [ "frame-support", "frame-system", @@ -3482,7 +3482,7 @@ dependencies = [ [[package]] name = "pallet-authorship" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" +source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" dependencies = [ "frame-support", "frame-system", @@ -3497,7 +3497,7 @@ dependencies = [ [[package]] name = "pallet-babe" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" +source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" dependencies = [ "frame-benchmarking", "frame-support", @@ -3522,7 +3522,7 @@ dependencies = [ [[package]] name = "pallet-balances" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" +source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" dependencies = [ "frame-benchmarking", "frame-support", @@ -3536,7 +3536,7 @@ dependencies = [ [[package]] name = "pallet-collective" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" +source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" dependencies = [ "frame-benchmarking", "frame-support", @@ -3552,7 +3552,7 @@ dependencies = [ [[package]] name = "pallet-democracy" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" +source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" dependencies = [ "frame-benchmarking", "frame-support", @@ -3567,7 +3567,7 @@ dependencies = [ [[package]] name = "pallet-elections-phragmen" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" +source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" dependencies = [ "frame-benchmarking", "frame-support", @@ -3582,7 +3582,7 @@ dependencies = [ [[package]] name = "pallet-finality-tracker" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" +source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" dependencies = [ "frame-support", "frame-system", @@ -3598,7 +3598,7 @@ dependencies = [ [[package]] name = "pallet-grandpa" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" +source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" dependencies = [ "frame-support", "frame-system", @@ -3618,7 +3618,7 @@ dependencies = [ [[package]] name = "pallet-identity" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" +source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" dependencies = [ "enumflags2", "frame-benchmarking", @@ -3634,7 +3634,7 @@ dependencies = [ [[package]] name = "pallet-im-online" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" +source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" dependencies = [ "frame-benchmarking", "frame-support", @@ -3654,7 +3654,7 @@ dependencies = [ [[package]] name = "pallet-indices" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" +source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" dependencies = [ "frame-support", "frame-system", @@ -3670,7 +3670,7 @@ dependencies = [ [[package]] name = "pallet-membership" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" +source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" dependencies = [ "frame-support", "frame-system", @@ -3684,7 +3684,7 @@ dependencies = [ [[package]] name = "pallet-multisig" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" +source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" dependencies = [ "frame-support", "frame-system", @@ -3699,7 +3699,7 @@ dependencies = [ [[package]] name = "pallet-nicks" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" +source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" dependencies = [ "frame-support", "frame-system", @@ -3713,7 +3713,7 @@ dependencies = [ [[package]] name = "pallet-offences" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" +source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" dependencies = [ "frame-support", "frame-system", @@ -3728,7 +3728,7 @@ dependencies = [ [[package]] name = "pallet-offences-benchmarking" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" +source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" dependencies = [ "frame-benchmarking", "frame-support", @@ -3749,7 +3749,7 @@ dependencies = [ [[package]] name = "pallet-proxy" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" +source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" dependencies = [ "frame-support", "frame-system", @@ -3764,7 +3764,7 @@ dependencies = [ [[package]] name = "pallet-randomness-collective-flip" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" +source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" dependencies = [ "frame-support", "frame-system", @@ -3777,7 +3777,7 @@ dependencies = [ [[package]] name = "pallet-recovery" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" +source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" dependencies = [ "enumflags2", "frame-support", @@ -3792,7 +3792,7 @@ dependencies = [ [[package]] name = "pallet-scheduler" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" +source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" dependencies = [ "frame-benchmarking", "frame-support", @@ -3807,7 +3807,7 @@ dependencies = [ [[package]] name = "pallet-session" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" +source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" dependencies = [ "frame-support", "frame-system", @@ -3827,7 +3827,7 @@ dependencies = [ [[package]] name = "pallet-session-benchmarking" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" +source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" dependencies = [ "frame-benchmarking", "frame-support", @@ -3843,7 +3843,7 @@ dependencies = [ [[package]] name = "pallet-society" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" +source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" dependencies = [ "frame-support", "frame-system", @@ -3857,7 +3857,7 @@ dependencies = [ [[package]] name = "pallet-staking" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" +source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" dependencies = [ "frame-benchmarking", "frame-support", @@ -3879,7 +3879,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-curve" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" +source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -3890,7 +3890,7 @@ dependencies = [ [[package]] name = "pallet-sudo" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" +source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" dependencies = [ "frame-support", "frame-system", @@ -3904,7 +3904,7 @@ dependencies = [ [[package]] name = "pallet-timestamp" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" +source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" dependencies = [ "frame-benchmarking", "frame-support", @@ -3922,7 +3922,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" +source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" dependencies = [ "frame-support", "frame-system", @@ -3937,7 +3937,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" +source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" dependencies = [ "jsonrpc-core", "jsonrpc-core-client", @@ -3955,7 +3955,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc-runtime-api" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" +source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" dependencies = [ "frame-support", "parity-scale-codec", @@ -3968,7 +3968,7 @@ dependencies = [ [[package]] name = "pallet-treasury" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" +source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" dependencies = [ "frame-benchmarking", "frame-support", @@ -3983,7 +3983,7 @@ dependencies = [ [[package]] name = "pallet-utility" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" +source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" dependencies = [ "frame-benchmarking", "frame-support", @@ -3999,7 +3999,7 @@ dependencies = [ [[package]] name = "pallet-vesting" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" +source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" dependencies = [ "enumflags2", "frame-benchmarking", @@ -4298,7 +4298,7 @@ checksum = "feb3b2b1033b8a60b4da6ee470325f887758c95d5320f52f9ce0df055a55940e" [[package]] name = "polkadot" -version = "0.8.14" +version = "0.8.15" dependencies = [ "assert_cmd", "futures 0.3.5", @@ -4312,7 +4312,7 @@ dependencies = [ [[package]] name = "polkadot-availability-store" -version = "0.8.14" +version = "0.8.15" dependencies = [ "derive_more 0.99.9", "exit-future", @@ -4338,7 +4338,7 @@ dependencies = [ [[package]] name = "polkadot-cli" -version = "0.8.14" +version = "0.8.15" dependencies = [ "frame-benchmarking-cli", "futures 0.3.5", @@ -4363,7 +4363,7 @@ dependencies = [ [[package]] name = "polkadot-collator" -version = "0.8.14" +version = "0.8.15" dependencies = [ "futures 0.3.5", "futures-timer 2.0.2", @@ -4401,7 +4401,7 @@ dependencies = [ [[package]] name = "polkadot-erasure-coding" -version = "0.8.14" +version = "0.8.15" dependencies = [ "derive_more 0.15.0", "parity-scale-codec", @@ -4413,7 +4413,7 @@ dependencies = [ [[package]] name = "polkadot-network" -version = "0.8.14" +version = "0.8.15" dependencies = [ "arrayvec 0.4.12", "bytes 0.5.5", @@ -4461,7 +4461,7 @@ dependencies = [ [[package]] name = "polkadot-network-test" -version = "0.8.14" +version = "0.8.15" dependencies = [ "futures 0.3.5", "log 0.4.8", @@ -4577,7 +4577,7 @@ dependencies = [ [[package]] name = "polkadot-parachain" -version = "0.8.14" +version = "0.8.15" dependencies = [ "derive_more 0.99.9", "log 0.4.8", @@ -4615,7 +4615,7 @@ dependencies = [ [[package]] name = "polkadot-primitives" -version = "0.8.14" +version = "0.8.15" dependencies = [ "bitvec", "frame-system", @@ -4638,7 +4638,7 @@ dependencies = [ [[package]] name = "polkadot-rpc" -version = "0.8.14" +version = "0.8.15" dependencies = [ "jsonrpc-core", "pallet-transaction-payment-rpc", @@ -4664,7 +4664,7 @@ dependencies = [ [[package]] name = "polkadot-runtime" -version = "0.8.14" +version = "0.8.15" dependencies = [ "bitvec", "frame-benchmarking", @@ -4739,7 +4739,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-common" -version = "0.8.14" +version = "0.8.15" dependencies = [ "bitvec", "frame-benchmarking", @@ -4826,7 +4826,7 @@ dependencies = [ [[package]] name = "polkadot-service" -version = "0.8.14" +version = "0.8.15" dependencies = [ "env_logger", "frame-benchmarking", @@ -4969,7 +4969,7 @@ dependencies = [ [[package]] name = "polkadot-statement-table" -version = "0.8.14" +version = "0.8.15" dependencies = [ "parity-scale-codec", "polkadot-primitives", @@ -4988,7 +4988,7 @@ dependencies = [ [[package]] name = "polkadot-test-runtime" -version = "0.8.14" +version = "0.8.15" dependencies = [ "bitvec", "frame-executive", @@ -5119,7 +5119,7 @@ dependencies = [ [[package]] name = "polkadot-validation" -version = "0.8.14" +version = "0.8.15" dependencies = [ "ansi_term 0.12.1", "bitvec", @@ -5942,7 +5942,7 @@ dependencies = [ [[package]] name = "sc-authority-discovery" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" +source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" dependencies = [ "bytes 0.5.5", "derive_more 0.99.9", @@ -5969,7 +5969,7 @@ dependencies = [ [[package]] name = "sc-basic-authorship" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" +source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -5993,7 +5993,7 @@ dependencies = [ [[package]] name = "sc-block-builder" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" +source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" dependencies = [ "parity-scale-codec", "sc-client-api", @@ -6010,7 +6010,7 @@ dependencies = [ [[package]] name = "sc-chain-spec" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" +source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" dependencies = [ "impl-trait-for-tuples", "sc-chain-spec-derive", @@ -6026,7 +6026,7 @@ dependencies = [ [[package]] name = "sc-chain-spec-derive" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" +source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -6037,7 +6037,7 @@ dependencies = [ [[package]] name = "sc-cli" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" +source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" dependencies = [ "ansi_term 0.12.1", "atty", @@ -6078,7 +6078,7 @@ dependencies = [ [[package]] name = "sc-client-api" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" +source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" dependencies = [ "derive_more 0.99.9", "fnv", @@ -6114,7 +6114,7 @@ dependencies = [ [[package]] name = "sc-client-db" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" +source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" dependencies = [ "blake2-rfc", "hash-db", @@ -6143,7 +6143,7 @@ dependencies = [ [[package]] name = "sc-consensus" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" +source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" dependencies = [ "sc-client-api", "sp-blockchain", @@ -6154,7 +6154,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" +source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" dependencies = [ "derive_more 0.99.9", "fork-tree", @@ -6196,7 +6196,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe-rpc" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" +source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -6220,7 +6220,7 @@ dependencies = [ [[package]] name = "sc-consensus-epochs" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" +source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" dependencies = [ "fork-tree", "parity-scale-codec", @@ -6233,7 +6233,7 @@ dependencies = [ [[package]] name = "sc-consensus-slots" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" +source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6256,7 +6256,7 @@ dependencies = [ [[package]] name = "sc-consensus-uncles" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" +source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" dependencies = [ "log 0.4.8", "sc-client-api", @@ -6270,7 +6270,7 @@ dependencies = [ [[package]] name = "sc-executor" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" +source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" dependencies = [ "derive_more 0.99.9", "lazy_static", @@ -6298,7 +6298,7 @@ dependencies = [ [[package]] name = "sc-executor-common" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" +source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" dependencies = [ "derive_more 0.99.9", "log 0.4.8", @@ -6315,7 +6315,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmi" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" +source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" dependencies = [ "log 0.4.8", "parity-scale-codec", @@ -6330,7 +6330,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmtime" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" +source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" dependencies = [ "cranelift-codegen", "cranelift-wasm", @@ -6351,7 +6351,7 @@ dependencies = [ [[package]] name = "sc-finality-grandpa" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" +source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" dependencies = [ "assert_matches", "derive_more 0.99.9", @@ -6389,7 +6389,7 @@ dependencies = [ [[package]] name = "sc-finality-grandpa-rpc" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" +source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" dependencies = [ "derive_more 0.99.9", "finality-grandpa", @@ -6406,7 +6406,7 @@ dependencies = [ [[package]] name = "sc-informant" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" +source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" dependencies = [ "ansi_term 0.12.1", "futures 0.3.5", @@ -6424,7 +6424,7 @@ dependencies = [ [[package]] name = "sc-keystore" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" +source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" dependencies = [ "derive_more 0.99.9", "hex", @@ -6440,7 +6440,7 @@ dependencies = [ [[package]] name = "sc-light" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" +source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" dependencies = [ "hash-db", "lazy_static", @@ -6459,7 +6459,7 @@ dependencies = [ [[package]] name = "sc-network" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" +source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" dependencies = [ "bitflags", "bs58", @@ -6511,7 +6511,7 @@ dependencies = [ [[package]] name = "sc-network-gossip" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" +source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6526,7 +6526,7 @@ dependencies = [ [[package]] name = "sc-network-test" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" +source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" dependencies = [ "env_logger", "futures 0.3.5", @@ -6553,7 +6553,7 @@ dependencies = [ [[package]] name = "sc-offchain" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" +source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" dependencies = [ "bytes 0.5.5", "fnv", @@ -6580,7 +6580,7 @@ dependencies = [ [[package]] name = "sc-peerset" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" +source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" dependencies = [ "futures 0.3.5", "libp2p", @@ -6593,7 +6593,7 @@ dependencies = [ [[package]] name = "sc-proposer-metrics" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" +source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" dependencies = [ "log 0.4.8", "substrate-prometheus-endpoint", @@ -6602,7 +6602,7 @@ dependencies = [ [[package]] name = "sc-rpc" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" +source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" dependencies = [ "futures 0.3.5", "hash-db", @@ -6634,7 +6634,7 @@ dependencies = [ [[package]] name = "sc-rpc-api" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" +source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -6658,7 +6658,7 @@ dependencies = [ [[package]] name = "sc-rpc-server" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" +source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" dependencies = [ "jsonrpc-core", "jsonrpc-http-server", @@ -6674,7 +6674,7 @@ dependencies = [ [[package]] name = "sc-service" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" +source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" dependencies = [ "derive_more 0.99.9", "directories", @@ -6736,7 +6736,7 @@ dependencies = [ [[package]] name = "sc-state-db" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" +source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" dependencies = [ "log 0.4.8", "parity-scale-codec", @@ -6750,7 +6750,7 @@ dependencies = [ [[package]] name = "sc-telemetry" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" +source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6771,7 +6771,7 @@ dependencies = [ [[package]] name = "sc-tracing" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" +source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" dependencies = [ "erased-serde", "log 0.4.8", @@ -6788,7 +6788,7 @@ dependencies = [ [[package]] name = "sc-transaction-graph" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" +source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -6808,7 +6808,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" +source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -7234,7 +7234,7 @@ dependencies = [ [[package]] name = "sp-allocator" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" +source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" dependencies = [ "derive_more 0.99.9", "log 0.4.8", @@ -7246,7 +7246,7 @@ dependencies = [ [[package]] name = "sp-api" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" +source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" dependencies = [ "hash-db", "parity-scale-codec", @@ -7261,7 +7261,7 @@ dependencies = [ [[package]] name = "sp-api-proc-macro" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" +source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" dependencies = [ "blake2-rfc", "proc-macro-crate", @@ -7273,7 +7273,7 @@ dependencies = [ [[package]] name = "sp-application-crypto" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" +source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" dependencies = [ "parity-scale-codec", "serde", @@ -7285,7 +7285,7 @@ dependencies = [ [[package]] name = "sp-arithmetic" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" +source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" dependencies = [ "integer-sqrt", "num-traits 0.2.12", @@ -7298,7 +7298,7 @@ dependencies = [ [[package]] name = "sp-authority-discovery" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" +source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" dependencies = [ "parity-scale-codec", "sp-api", @@ -7310,7 +7310,7 @@ dependencies = [ [[package]] name = "sp-authorship" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" +source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" dependencies = [ "parity-scale-codec", "sp-inherents", @@ -7321,7 +7321,7 @@ dependencies = [ [[package]] name = "sp-block-builder" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" +source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" dependencies = [ "parity-scale-codec", "sp-api", @@ -7333,7 +7333,7 @@ dependencies = [ [[package]] name = "sp-blockchain" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" +source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" dependencies = [ "derive_more 0.99.9", "log 0.4.8", @@ -7350,7 +7350,7 @@ dependencies = [ [[package]] name = "sp-chain-spec" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" +source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" dependencies = [ "serde", "serde_json", @@ -7359,7 +7359,7 @@ dependencies = [ [[package]] name = "sp-consensus" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" +source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -7384,7 +7384,7 @@ dependencies = [ [[package]] name = "sp-consensus-aura" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" +source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" dependencies = [ "parity-scale-codec", "sp-api", @@ -7398,7 +7398,7 @@ dependencies = [ [[package]] name = "sp-consensus-babe" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" +source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" dependencies = [ "merlin", "parity-scale-codec", @@ -7417,7 +7417,7 @@ dependencies = [ [[package]] name = "sp-consensus-slots" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" +source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" dependencies = [ "parity-scale-codec", "sp-runtime", @@ -7426,7 +7426,7 @@ dependencies = [ [[package]] name = "sp-consensus-vrf" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" +source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" dependencies = [ "parity-scale-codec", "schnorrkel", @@ -7438,7 +7438,7 @@ dependencies = [ [[package]] name = "sp-core" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" +source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" dependencies = [ "base58", "blake2-rfc", @@ -7481,7 +7481,7 @@ dependencies = [ [[package]] name = "sp-database" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" +source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" dependencies = [ "kvdb", "parking_lot 0.10.2", @@ -7490,7 +7490,7 @@ dependencies = [ [[package]] name = "sp-debug-derive" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" +source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" dependencies = [ "proc-macro2 1.0.18", "quote 1.0.7", @@ -7500,7 +7500,7 @@ dependencies = [ [[package]] name = "sp-externalities" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" +source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" dependencies = [ "environmental", "parity-scale-codec", @@ -7511,7 +7511,7 @@ dependencies = [ [[package]] name = "sp-finality-grandpa" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" +source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" dependencies = [ "finality-grandpa", "log 0.4.8", @@ -7527,7 +7527,7 @@ dependencies = [ [[package]] name = "sp-finality-tracker" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" +source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" dependencies = [ "parity-scale-codec", "sp-inherents", @@ -7537,7 +7537,7 @@ dependencies = [ [[package]] name = "sp-inherents" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" +source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" dependencies = [ "derive_more 0.99.9", "parity-scale-codec", @@ -7549,7 +7549,7 @@ dependencies = [ [[package]] name = "sp-io" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" +source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" dependencies = [ "futures 0.3.5", "hash-db", @@ -7570,7 +7570,7 @@ dependencies = [ [[package]] name = "sp-keyring" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" +source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" dependencies = [ "lazy_static", "sp-core", @@ -7581,7 +7581,7 @@ dependencies = [ [[package]] name = "sp-npos-elections" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" +source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" dependencies = [ "parity-scale-codec", "serde", @@ -7593,7 +7593,7 @@ dependencies = [ [[package]] name = "sp-npos-elections-compact" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" +source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -7604,7 +7604,7 @@ dependencies = [ [[package]] name = "sp-offchain" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" +source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" dependencies = [ "sp-api", "sp-core", @@ -7614,7 +7614,7 @@ dependencies = [ [[package]] name = "sp-panic-handler" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" +source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" dependencies = [ "backtrace", "log 0.4.8", @@ -7623,7 +7623,7 @@ dependencies = [ [[package]] name = "sp-rpc" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" +source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" dependencies = [ "serde", "sp-core", @@ -7632,7 +7632,7 @@ dependencies = [ [[package]] name = "sp-runtime" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" +source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" dependencies = [ "either", "hash256-std-hasher", @@ -7654,7 +7654,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" +source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" dependencies = [ "parity-scale-codec", "primitive-types", @@ -7669,7 +7669,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" +source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" dependencies = [ "Inflector", "proc-macro-crate", @@ -7681,7 +7681,7 @@ dependencies = [ [[package]] name = "sp-serializer" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" +source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" dependencies = [ "serde", "serde_json", @@ -7690,7 +7690,7 @@ dependencies = [ [[package]] name = "sp-session" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" +source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" dependencies = [ "parity-scale-codec", "sp-api", @@ -7703,7 +7703,7 @@ dependencies = [ [[package]] name = "sp-staking" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" +source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" dependencies = [ "parity-scale-codec", "sp-runtime", @@ -7713,7 +7713,7 @@ dependencies = [ [[package]] name = "sp-state-machine" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" +source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" dependencies = [ "hash-db", "itertools 0.9.0", @@ -7734,12 +7734,12 @@ dependencies = [ [[package]] name = "sp-std" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" +source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" [[package]] name = "sp-storage" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" +source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" dependencies = [ "impl-serde 0.2.3", "ref-cast", @@ -7751,7 +7751,7 @@ dependencies = [ [[package]] name = "sp-timestamp" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" +source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -7765,7 +7765,7 @@ dependencies = [ [[package]] name = "sp-tracing" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" +source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" dependencies = [ "log 0.4.8", "rental", @@ -7775,7 +7775,7 @@ dependencies = [ [[package]] name = "sp-transaction-pool" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" +source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -7791,7 +7791,7 @@ dependencies = [ [[package]] name = "sp-trie" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" +source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" dependencies = [ "hash-db", "memory-db", @@ -7805,7 +7805,7 @@ dependencies = [ [[package]] name = "sp-utils" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" +source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" dependencies = [ "futures 0.3.5", "futures-core", @@ -7817,7 +7817,7 @@ dependencies = [ [[package]] name = "sp-version" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" +source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" dependencies = [ "impl-serde 0.2.3", "parity-scale-codec", @@ -7829,7 +7829,7 @@ dependencies = [ [[package]] name = "sp-wasm-interface" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" +source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -7969,7 +7969,7 @@ dependencies = [ [[package]] name = "substrate-browser-utils" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" +source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" dependencies = [ "chrono", "clear_on_drop", @@ -7996,7 +7996,7 @@ dependencies = [ [[package]] name = "substrate-build-script-utils" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" +source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" dependencies = [ "platforms", ] @@ -8004,7 +8004,7 @@ dependencies = [ [[package]] name = "substrate-frame-rpc-system" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" +source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" dependencies = [ "frame-system-rpc-runtime-api", "futures 0.3.5", @@ -8027,7 +8027,7 @@ dependencies = [ [[package]] name = "substrate-prometheus-endpoint" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" +source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" dependencies = [ "async-std", "derive_more 0.99.9", @@ -8041,7 +8041,7 @@ dependencies = [ [[package]] name = "substrate-test-client" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" +source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" dependencies = [ "futures 0.1.29", "futures 0.3.5", @@ -8067,7 +8067,7 @@ dependencies = [ [[package]] name = "substrate-test-runtime" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" +source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" dependencies = [ "cfg-if", "frame-executive", @@ -8107,7 +8107,7 @@ dependencies = [ [[package]] name = "substrate-test-runtime-client" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" +source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" dependencies = [ "futures 0.3.5", "parity-scale-codec", @@ -8128,7 +8128,7 @@ dependencies = [ [[package]] name = "substrate-wasm-builder-runner" version = "1.0.6" -source = "git+https://github.com/paritytech/substrate#56cf04f289f9cd5e8bb96fe5bd23a923e21acf1c" +source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" [[package]] name = "substrate-wasm-builder-runner" @@ -8354,7 +8354,7 @@ dependencies = [ [[package]] name = "test-parachain-adder" -version = "0.8.14" +version = "0.8.15" dependencies = [ "dlmalloc", "parity-scale-codec", @@ -8395,7 +8395,7 @@ dependencies = [ [[package]] name = "test-parachain-halt" -version = "0.8.14" +version = "0.8.15" dependencies = [ "substrate-wasm-builder-runner 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -9334,7 +9334,7 @@ dependencies = [ [[package]] name = "westend-runtime" -version = "0.8.14" +version = "0.8.15" dependencies = [ "bitvec", "frame-benchmarking", diff --git a/Cargo.toml b/Cargo.toml index b6d1aa53ea..be0d25850e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,7 +4,7 @@ path = "src/main.rs" [package] name = "polkadot" -version = "0.8.14" +version = "0.8.15" authors = ["Parity Technologies "] edition = "2018" diff --git a/availability-store/Cargo.toml b/availability-store/Cargo.toml index 6cc380b235..93dd003d32 100644 --- a/availability-store/Cargo.toml +++ b/availability-store/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "polkadot-availability-store" description = "Persistent database for parachain data" -version = "0.8.14" +version = "0.8.15" authors = ["Parity Technologies "] edition = "2018" diff --git a/cli/Cargo.toml b/cli/Cargo.toml index ed97adc85a..8c8e51efc7 100644 --- a/cli/Cargo.toml +++ b/cli/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-cli" -version = "0.8.14" +version = "0.8.15" authors = ["Parity Technologies "] description = "Polkadot Relay-chain Client Node" edition = "2018" diff --git a/collator/Cargo.toml b/collator/Cargo.toml index c00b24d072..1c9615e2a0 100644 --- a/collator/Cargo.toml +++ b/collator/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-collator" -version = "0.8.14" +version = "0.8.15" authors = ["Parity Technologies "] description = "Collator node implementation" edition = "2018" diff --git a/erasure-coding/Cargo.toml b/erasure-coding/Cargo.toml index 614017000d..04334f0eab 100644 --- a/erasure-coding/Cargo.toml +++ b/erasure-coding/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-erasure-coding" -version = "0.8.14" +version = "0.8.15" authors = ["Parity Technologies "] edition = "2018" diff --git a/network/Cargo.toml b/network/Cargo.toml index a18115ac6d..6b86704796 100644 --- a/network/Cargo.toml +++ b/network/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-network" -version = "0.8.14" +version = "0.8.15" authors = ["Parity Technologies "] description = "Polkadot-specific networking protocol" edition = "2018" diff --git a/network/test/Cargo.toml b/network/test/Cargo.toml index 5e14454e2c..f73b62c511 100644 --- a/network/test/Cargo.toml +++ b/network/test/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-network-test" -version = "0.8.14" +version = "0.8.15" license = "GPL-3.0" authors = ["Parity Technologies "] edition = "2018" diff --git a/parachain/Cargo.toml b/parachain/Cargo.toml index 2e0e0efff0..0ccb033042 100644 --- a/parachain/Cargo.toml +++ b/parachain/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-parachain" -version = "0.8.14" +version = "0.8.15" authors = ["Parity Technologies "] description = "Types and utilities for creating and working with parachains" edition = "2018" diff --git a/parachain/test-parachains/adder/Cargo.toml b/parachain/test-parachains/adder/Cargo.toml index 1ec9e0a119..4cd2f9c839 100644 --- a/parachain/test-parachains/adder/Cargo.toml +++ b/parachain/test-parachains/adder/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "test-parachain-adder" -version = "0.8.14" +version = "0.8.15" authors = ["Parity Technologies "] description = "Test parachain which adds to a number as its state transition" edition = "2018" diff --git a/parachain/test-parachains/halt/Cargo.toml b/parachain/test-parachains/halt/Cargo.toml index 93e36b4837..d9b48b4239 100644 --- a/parachain/test-parachains/halt/Cargo.toml +++ b/parachain/test-parachains/halt/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "test-parachain-halt" -version = "0.8.14" +version = "0.8.15" authors = ["Parity Technologies "] description = "Test parachain which executes forever" edition = "2018" diff --git a/primitives/Cargo.toml b/primitives/Cargo.toml index c7eb22b32c..b2f1373b05 100644 --- a/primitives/Cargo.toml +++ b/primitives/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-primitives" -version = "0.8.14" +version = "0.8.15" authors = ["Parity Technologies "] edition = "2018" diff --git a/rpc/Cargo.toml b/rpc/Cargo.toml index c92b706c0e..7fea6323d8 100644 --- a/rpc/Cargo.toml +++ b/rpc/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-rpc" -version = "0.8.14" +version = "0.8.15" authors = ["Parity Technologies "] edition = "2018" diff --git a/runtime/common/Cargo.toml b/runtime/common/Cargo.toml index f0f0041d0c..1757636854 100644 --- a/runtime/common/Cargo.toml +++ b/runtime/common/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-runtime-common" -version = "0.8.14" +version = "0.8.15" authors = ["Parity Technologies "] edition = "2018" diff --git a/runtime/kusama/Cargo.toml b/runtime/kusama/Cargo.toml index ef0517d3e5..aa33f22a40 100644 --- a/runtime/kusama/Cargo.toml +++ b/runtime/kusama/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "kusama-runtime" -version = "0.8.14" +version = "0.8.15" authors = ["Parity Technologies "] edition = "2018" build = "build.rs" diff --git a/runtime/kusama/src/lib.rs b/runtime/kusama/src/lib.rs index 569d055cca..cba2ad10c0 100644 --- a/runtime/kusama/src/lib.rs +++ b/runtime/kusama/src/lib.rs @@ -87,7 +87,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("kusama"), impl_name: create_runtime_str!("parity-kusama"), authoring_version: 2, - spec_version: 2014, + spec_version: 2015, impl_version: 0, #[cfg(not(feature = "disable-runtime-api"))] apis: RUNTIME_API_VERSIONS, diff --git a/runtime/polkadot/Cargo.toml b/runtime/polkadot/Cargo.toml index 7f1763ff29..2c8373cb83 100644 --- a/runtime/polkadot/Cargo.toml +++ b/runtime/polkadot/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-runtime" -version = "0.8.14" +version = "0.8.15" authors = ["Parity Technologies "] edition = "2018" build = "build.rs" diff --git a/runtime/polkadot/src/lib.rs b/runtime/polkadot/src/lib.rs index 3c19495b48..8c11e960e4 100644 --- a/runtime/polkadot/src/lib.rs +++ b/runtime/polkadot/src/lib.rs @@ -93,7 +93,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("polkadot"), impl_name: create_runtime_str!("parity-polkadot"), authoring_version: 0, - spec_version: 14, + spec_version: 15, impl_version: 0, #[cfg(not(feature = "disable-runtime-api"))] apis: RUNTIME_API_VERSIONS, diff --git a/runtime/test-runtime/Cargo.toml b/runtime/test-runtime/Cargo.toml index ceac5dc134..275c393e34 100644 --- a/runtime/test-runtime/Cargo.toml +++ b/runtime/test-runtime/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-test-runtime" -version = "0.8.14" +version = "0.8.15" authors = ["Parity Technologies "] edition = "2018" build = "build.rs" diff --git a/runtime/westend/Cargo.toml b/runtime/westend/Cargo.toml index 51b3d8caf1..1636786320 100644 --- a/runtime/westend/Cargo.toml +++ b/runtime/westend/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "westend-runtime" -version = "0.8.14" +version = "0.8.15" authors = ["Parity Technologies "] edition = "2018" build = "build.rs" diff --git a/runtime/westend/src/lib.rs b/runtime/westend/src/lib.rs index a40c4e3dd5..a0eaa03fd6 100644 --- a/runtime/westend/src/lib.rs +++ b/runtime/westend/src/lib.rs @@ -83,7 +83,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("westend"), impl_name: create_runtime_str!("parity-westend"), authoring_version: 2, - spec_version: 34, + spec_version: 35, impl_version: 0, #[cfg(not(feature = "disable-runtime-api"))] apis: RUNTIME_API_VERSIONS, diff --git a/service/Cargo.toml b/service/Cargo.toml index 6a82aff1e1..5514339f9b 100644 --- a/service/Cargo.toml +++ b/service/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-service" -version = "0.8.14" +version = "0.8.15" authors = ["Parity Technologies "] edition = "2018" diff --git a/statement-table/Cargo.toml b/statement-table/Cargo.toml index 18ac58931c..030b23f0b7 100644 --- a/statement-table/Cargo.toml +++ b/statement-table/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-statement-table" -version = "0.8.14" +version = "0.8.15" authors = ["Parity Technologies "] edition = "2018" diff --git a/validation/Cargo.toml b/validation/Cargo.toml index 1b0db38d55..d3cee5c047 100644 --- a/validation/Cargo.toml +++ b/validation/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-validation" -version = "0.8.14" +version = "0.8.15" authors = ["Parity Technologies "] edition = "2018" -- GitLab From 756b43803ae1c466aec7bb2faae8e1eb8d954ffa Mon Sep 17 00:00:00 2001 From: s3krit Date: Wed, 15 Jul 2020 19:35:51 +0200 Subject: [PATCH 067/192] [CI] check_runtime.sh redux (#1390) * Initial check_runtime.sh redux * Skip further checks if no change to runtime * remove polkadot-master reference * Fix issues found during review :) * replace static common dir with common_dirs array --- scripts/gitlab/check_runtime.sh | 169 ++++++++++++++++++-------------- scripts/gitlab/lib.sh | 18 +++- 2 files changed, 111 insertions(+), 76 deletions(-) diff --git a/scripts/gitlab/check_runtime.sh b/scripts/gitlab/check_runtime.sh index 2cedd2f656..9adbd1bb58 100755 --- a/scripts/gitlab/check_runtime.sh +++ b/scripts/gitlab/check_runtime.sh @@ -1,18 +1,17 @@ -#!/bin/sh +#!/usr/bin/env bash + +# Check for any changes in any runtime directories (e.g., ^runtime/polkadot) as +# well as directories common to all runtimes (e.g., ^runtime/common). If there +# are no changes, check if the Substrate git SHA in Cargo.lock has been +# changed. If so, pull the repo and verify if {spec,impl}_versions have been +# altered since the previous Substrate version used. Also, if any of the +# Substrate changes between the previous and current version referenced by +# Cargo.lock were labelled with 'D2-breaksapi', label this PR the same. # -# -# check for any changes in the ^runtime/ tree. if there are no changes check -# if the substrate reference in the Cargo.lock has been changed. If so pull -# the repo and verify if the {spec,impl}_version s have been altered since the -# last reference. If there were changes the script will continue to check if -# the spec_version resp impl_version of polkadot have been altered as well. -# this will also be checked if there were changes to the runtime source files. -# -# If there are any changes found, it will mark the PR breaksapi and -# "auto-fail" the PR if there isn't a change in the -# runtime/{polkadot,kusama}/src/lib.rs file -# that alters the version since the last release tag. - +# If there were changes to any runtimes or common dirs, we iterate over each +# runtime (defined in the $runtimes() array), and check if {spec,impl}_version +# have been changed since the last release. Also, if there have been changes to +# the runtime since the last commit to master, label the PR with 'D2-breaksapi' set -e # fail on any error @@ -21,69 +20,73 @@ set -e # fail on any error . "$(dirname "${0}")/lib.sh" SUBSTRATE_REPO="https://github.com/paritytech/substrate" -SUBSTRATE_REPO_CARGO="git\+${SUBSTRATE_REPO}\?branch=polkadot-master" +SUBSTRATE_REPO_CARGO="git\+${SUBSTRATE_REPO}" SUBSTRATE_VERSIONS_FILE="bin/node/runtime/src/lib.rs" -boldprint () { printf "|\n| \033[1m%s\033[0m\n|\n" "${@}"; } -boldcat () { printf "|\n"; while read -r l; do printf "| \033[1m%s\033[0m\n" "${l}"; done; printf "|\n" ; } - - # figure out the latest release tag LATEST_TAG="$(git tag -l | sort -V | tail -n 1)" boldprint "latest release tag ${LATEST_TAG}" - boldprint "latest 10 commits of ${CI_COMMIT_REF_NAME}" git --no-pager log --graph --oneline --decorate=short -n 10 boldprint "make sure the master branch is available in shallow clones" -git fetch --depth=${GIT_DEPTH:-100} origin master +git fetch --depth="${GIT_DEPTH:-100}" origin master +runtimes=( + "kusama" + "polkadot" + "westend" +) -github_label () { - echo - echo "# run github-api job for labeling it ${1}" - curl -sS -X POST \ - -F "token=${CI_JOB_TOKEN}" \ - -F "ref=master" \ - -F "variables[LABEL]=${1}" \ - -F "variables[PRNO]=${CI_COMMIT_REF_NAME}" \ - -F "variables[PROJECT]=paritytech/polkadot" \ - ${GITLAB_API}/projects/${GITHUB_API_PROJECT}/trigger/pipeline -} +common_dirs=( + "common" +) +# Helper function to join elements in an array with a multi-char delimiter +# https://stackoverflow.com/questions/1527049/how-can-i-join-elements-of-an-array-in-bash +function join_by { local d=$1; shift; echo -n "$1"; shift; printf "%s" "${@/#/$d}"; } + +# Construct a regex to search for any changes to runtime or common directories +runtime_regex="^runtime/$(join_by '|^runtime/' "${runtimes[@]}" "${common_dirs[@]}")" boldprint "check if the wasm sources changed since ${LATEST_TAG}" -if ! git diff --name-only refs/tags/${LATEST_TAG}...${CI_COMMIT_SHA} \ - | grep -q -e '^runtime/' +if ! git diff --name-only "refs/tags/${LATEST_TAG}...${CI_COMMIT_SHA}" \ + | grep -E -q -e "$runtime_regex" then - boldprint "no changes to the polkadot runtime source code detected" + boldprint "no changes to any runtime source code detected" # continue checking if Cargo.lock was updated with a new substrate reference # and if that change includes a {spec|impl}_version update. - SUBSTRATE_REFS_CHANGED="$(git diff refs/tags/${LATEST_TAG}...${CI_COMMIT_SHA} Cargo.lock \ - | sed -n -r "s~^[\+\-]source = \"${SUBSTRATE_REPO_CARGO}#([a-f0-9]+)\".*$~\1~p" | sort -u | wc -l)" + SUBSTRATE_REFS_CHANGED="$( + git diff "refs/tags/${LATEST_TAG}...${CI_COMMIT_SHA}" Cargo.lock \ + | sed -n -r "s~^[\+\-]source = \"${SUBSTRATE_REPO_CARGO}#([a-f0-9]+)\".*$~\1~p" | sort -u | wc -l + )" # check Cargo.lock for substrate ref change case "${SUBSTRATE_REFS_CHANGED}" in - (0) - boldprint "substrate refs not changed in Cargo.lock" - exit 0 - ;; - (2) - boldprint "substrate refs updated since ${LATEST_TAG}" - ;; - (*) - boldprint "check unsupported: more than one commit targeted in repo ${SUBSTRATE_REPO_CARGO}" - exit 1 + (0) + boldprint "substrate refs not changed in Cargo.lock" + exit 0 + ;; + (2) + boldprint "substrate refs updated since ${LATEST_TAG}" + ;; + (*) + boldprint "check unsupported: more than one commit targeted in repo ${SUBSTRATE_REPO_CARGO}" + exit 1 esac - SUBSTRATE_PREV_REF="$(git diff refs/tags/${LATEST_TAG}...${CI_COMMIT_SHA} Cargo.lock \ - | sed -n -r "s~^\-source = \"${SUBSTRATE_REPO_CARGO}#([a-f0-9]+)\".*$~\1~p" | sort -u | head -n 1)" + SUBSTRATE_PREV_REF="$( + git diff "refs/tags/${LATEST_TAG}...${CI_COMMIT_SHA}" Cargo.lock \ + | sed -n -r "s~^\-source = \"${SUBSTRATE_REPO_CARGO}#([a-f0-9]+)\".*$~\1~p" | sort -u | head -n 1 + )" - SUBSTRATE_NEW_REF="$(git diff refs/tags/${LATEST_TAG}...${CI_COMMIT_SHA} Cargo.lock \ - | sed -n -r "s~^\+source = \"${SUBSTRATE_REPO_CARGO}#([a-f0-9]+)\".*$~\1~p" | sort -u | head -n 1)" + SUBSTRATE_NEW_REF="$( + git diff "refs/tags/${LATEST_TAG}...${CI_COMMIT_SHA}" Cargo.lock \ + | sed -n -r "s~^\+source = \"${SUBSTRATE_REPO_CARGO}#([a-f0-9]+)\".*$~\1~p" | sort -u | head -n 1 + )" boldcat <<-EOT @@ -93,16 +96,14 @@ then # okay so now need to fetch the substrate repository and check whether spec_version or impl_version has changed there SUBSTRATE_CLONE_DIR="$(mktemp -t -d substrate-XXXXXX)" - trap "rm -rf ${SUBSTRATE_CLONE_DIR}" INT QUIT TERM ABRT EXIT - - - git clone --branch polkadot-master --depth 100 --no-tags \ - ${SUBSTRATE_REPO} ${SUBSTRATE_CLONE_DIR} + trap 'rm -rf "${SUBSTRATE_CLONE_DIR}"' INT QUIT TERM ABRT EXIT + git clone --depth="${GIT_DEPTH:-100}" --no-tags \ + "${SUBSTRATE_REPO}" "${SUBSTRATE_CLONE_DIR}" # check if there are changes to the spec|impl versions - git -C ${SUBSTRATE_CLONE_DIR} diff \ - ${SUBSTRATE_PREV_REF}..${SUBSTRATE_NEW_REF} ${SUBSTRATE_VERSIONS_FILE} \ + git -C "${SUBSTRATE_CLONE_DIR}" diff \ + "${SUBSTRATE_PREV_REF}..${SUBSTRATE_NEW_REF}" "${SUBSTRATE_VERSIONS_FILE}" \ | grep -E '^[\+\-][[:space:]]+(spec|impl)_version: +([0-9]+),$' || exit 0 boldcat <<-EOT @@ -127,34 +128,47 @@ then fi - -# Introduce runtime/polkadot/src/lib.rs once Polkadot mainnet is live. -for VERSIONS_FILE in runtime/kusama/src/lib.rs +# Iterate over each runtime defined at the start of the script +for RUNTIME in "${runtimes[@]}" do + + # Check if there were changes to this specific runtime or common directories. + # If not, we can skip to the next runtime + regex="^runtime/$(join_by '|^runtime/' "$RUNTIME" "${common_dirs[@]}")" + if ! git diff --name-only "refs/tags/${LATEST_TAG}...${CI_COMMIT_SHA}" \ + | grep -E -q -e "$regex"; then + continue + fi + # check for spec_version updates: if the spec versions changed, then there is # consensus-critical logic that has changed. the runtime wasm blobs must be # rebuilt. - add_spec_version="$(git diff refs/tags/${LATEST_TAG}...${CI_COMMIT_SHA} ${VERSIONS_FILE} \ - | sed -n -r "s/^\+[[:space:]]+spec_version: +([0-9]+),$/\1/p")" - sub_spec_version="$(git diff refs/tags/${LATEST_TAG}...${CI_COMMIT_SHA} ${VERSIONS_FILE} \ - | sed -n -r "s/^\-[[:space:]]+spec_version: +([0-9]+),$/\1/p")" + add_spec_version="$( + git diff "refs/tags/${LATEST_TAG}...${CI_COMMIT_SHA}" "runtime/${RUNTIME}/src/lib.rs" \ + | sed -n -r "s/^\+[[:space:]]+spec_version: +([0-9]+),$/\1/p" + )" + sub_spec_version="$( + git diff "refs/tags/${LATEST_TAG}...${CI_COMMIT_SHA}" "runtime/${RUNTIME}/src/lib.rs" \ + | sed -n -r "s/^\-[[:space:]]+spec_version: +([0-9]+),$/\1/p" + )" # see if the version and the binary blob changed if [ "${add_spec_version}" != "${sub_spec_version}" ] then - if git diff --name-only origin/master...${CI_COMMIT_SHA} \ - | grep -q -e '^runtime/' + if git diff --name-only "origin/master...${CI_COMMIT_SHA}" \ + | grep -E -q -e "$regex" then # add label breaksapi only if this pr altered the runtime sources - github_label "D2-breaksapi" + github_label "D2-breaksapi" fi boldcat <<-EOT + ## RUNTIME: ${RUNTIME} ## - changes to the runtime sources and changes in the spec version. + changes to the ${RUNTIME} runtime sources and changes in the spec version. spec_version: ${sub_spec_version} -> ${add_spec_version} @@ -165,10 +179,14 @@ do # check for impl_version updates: if only the impl versions changed, we assume # there is no consensus-critical logic that has changed. - add_impl_version="$(git diff refs/tags/${LATEST_TAG}...${CI_COMMIT_SHA} ${VERSIONS_FILE} \ - | sed -n -r 's/^\+[[:space:]]+impl_version: +([0-9]+),$/\1/p')" - sub_impl_version="$(git diff refs/tags/${LATEST_TAG}...${CI_COMMIT_SHA} ${VERSIONS_FILE} \ - | sed -n -r 's/^\-[[:space:]]+impl_version: +([0-9]+),$/\1/p')" + add_impl_version="$( + git diff refs/tags/"${LATEST_TAG}...${CI_COMMIT_SHA}" "runtime/${RUNTIME}/src/lib.rs" \ + | sed -n -r 's/^\+[[:space:]]+impl_version: +([0-9]+),$/\1/p' + )" + sub_impl_version="$( + git diff refs/tags/"${LATEST_TAG}...${CI_COMMIT_SHA}" "runtime/${RUNTIME}/src/lib.rs" \ + | sed -n -r 's/^\-[[:space:]]+impl_version: +([0-9]+),$/\1/p' + )" # see if the impl version changed @@ -176,7 +194,9 @@ do then boldcat <<-EOT - changes to the runtime sources and changes in the impl version. + ## RUNTIME: ${RUNTIME} ## + + changes to the ${RUNTIME} runtime sources and changes in the impl version. impl_version: ${sub_impl_version} -> ${add_impl_version} @@ -202,7 +222,6 @@ do fi done - exit 0 # vim: noexpandtab diff --git a/scripts/gitlab/lib.sh b/scripts/gitlab/lib.sh index 0f1c74193b..ab2e7c86f6 100755 --- a/scripts/gitlab/lib.sh +++ b/scripts/gitlab/lib.sh @@ -59,9 +59,21 @@ has_label(){ [ -n "$(echo "$out" | tr -d '\r\n' | jq ".labels | .[] | select(.name==\"$label\")")" ] } +github_label () { + echo + echo "# run github-api job for labeling it ${1}" + curl -sS -X POST \ + -F "token=${CI_JOB_TOKEN}" \ + -F "ref=master" \ + -F "variables[LABEL]=${1}" \ + -F "variables[PRNO]=${CI_COMMIT_REF_NAME}" \ + -F "variables[PROJECT]=paritytech/polkadot" \ + "${GITLAB_API}/projects/${GITHUB_API_PROJECT}/trigger/pipeline" +} + # Formats a message into a JSON string for posting to Matrix # message: 'any plaintext message' -# formatted_message: 'optional message formatted in html' +# formatted_message: 'optional message formatted in html' # Usage: structure_message $content $formatted_content (optional) structure_message() { if [ -z "$2" ]; then @@ -80,3 +92,7 @@ structure_message() { send_message() { curl -XPOST -d "$1" "https://matrix.parity.io/_matrix/client/r0/rooms/$2/send/m.room.message?access_token=$3" } + +# Pretty-printing functions +boldprint () { printf "|\n| \033[1m%s\033[0m\n|\n" "${@}"; } +boldcat () { printf "|\n"; while read -r l; do printf "| \033[1m%s\033[0m\n" "${l}"; done; printf "|\n" ; } -- GitLab From 228010ea0302fcfba1ec7799511f85ca11f20e5f Mon Sep 17 00:00:00 2001 From: Robert Habermeier Date: Wed, 15 Jul 2020 20:02:18 -0400 Subject: [PATCH 068/192] add assumptions made by the Node-side (#1408) * add assumptions made by the Node-side * Update roadmap/implementers-guide/src/node/README.md Co-authored-by: Peter Goodspeed-Niklaus * Update roadmap/implementers-guide/src/node/README.md Co-authored-by: Peter Goodspeed-Niklaus * Update roadmap/implementers-guide/src/node/README.md Co-authored-by: Bernhard Schuster * more refinements Co-authored-by: Peter Goodspeed-Niklaus Co-authored-by: Bernhard Schuster --- roadmap/implementers-guide/src/node/README.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/roadmap/implementers-guide/src/node/README.md b/roadmap/implementers-guide/src/node/README.md index 768d0138fd..f6d7e7a887 100644 --- a/roadmap/implementers-guide/src/node/README.md +++ b/roadmap/implementers-guide/src/node/README.md @@ -11,3 +11,14 @@ The architecture of the node-side behavior aims to embody the Rust principles of Many operations that need to be carried out involve the network, which is asynchronous. This asynchrony affects all core subsystems that rely on the network as well. The approach of hierarchical state machines is well-suited to this kind of environment. We introduce a hierarchy of state machines consisting of an overseer supervising subsystems, where Subsystems can contain their own internal hierarchy of jobs. This is elaborated on in the next section on Subsystems. + +## Assumptions + +The Node-side code comes with a set of assumptions that we build upon. These assumptions encompass most of the fundamental blockchain functionality. + +We assume the following constraints regarding provided basic functionality: + * The underlying **consensus** algorithm, whether it is BABE or SASSAFRAS is implemented. + * There is a **chain synchronization** protocol which will search for and download the longest available chains at all times. + * The **state** of all blocks at the head of the chain is available. There may be **state pruning** such that state of the last `k` blocks behind the last finalized block are is available, as well as the state of all their descendents. This assumption implies that the state of all active leaves and their last `k` ancestors are all available. The underlying implementation is expected to support `k` of a few hundred blocks, but we reduce this to a very conservative `k=5` for our purposes. + * There is an underlying **networking** framework which provides **peer discovery** services which will provide us with peers and will not create "loopback" connections to our own node. The number of peers we will have is assumed to be bounded at 1000. + * There is a **transaction pool** and a **transaction propagation** mechanism which maintains a set of current transactions and distributes to connected peers. Current transactions are those which are not outdated relative to some "best" fork of the chain, which is part of the active heads, and have not been included in the best fork. -- GitLab From 31aa299ccf208d1311a5e0270b2815646944dc1f Mon Sep 17 00:00:00 2001 From: Gavin Wood Date: Thu, 16 Jul 2020 20:19:36 +0200 Subject: [PATCH 069/192] Enable council elections (#1422) --- runtime/polkadot/src/lib.rs | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/runtime/polkadot/src/lib.rs b/runtime/polkadot/src/lib.rs index 8c11e960e4..68cbf0a97b 100644 --- a/runtime/polkadot/src/lib.rs +++ b/runtime/polkadot/src/lib.rs @@ -39,7 +39,7 @@ use primitives::v0::{ use sp_runtime::{ create_runtime_str, generic, impl_opaque_keys, ModuleId, ApplyExtrinsicResult, KeyTypeId, Percent, Permill, Perbill, - transaction_validity::{ + transaction_validity::{ TransactionValidity, TransactionSource, TransactionPriority, }, curve::PiecewiseLinear, @@ -117,9 +117,9 @@ impl Filter for BaseFilter { match call { Call::Parachains(parachains::Call::set_heads(..)) => true, - // Governance stuff + // Governance stuff, minus council elections. Call::Democracy(_) | Call::Council(_) | Call::TechnicalCommittee(_) | - Call::ElectionsPhragmen(_) | Call::TechnicalMembership(_) | Call::Treasury(_) | + Call::TechnicalMembership(_) | Call::Treasury(_) | // Parachains stuff Call::Parachains(_) | Call::Attestations(_) | Call::Slots(_) | Call::Registrar(_) | // Balances and Vesting's transfer (which can be used to transfer) @@ -128,6 +128,7 @@ impl Filter for BaseFilter { false, // These modules are all allowed to be called by transactions: + Call::ElectionsPhragmen(_) | Call::System(_) | Call::Scheduler(_) | Call::Indices(_) | Call::Babe(_) | Call::Timestamp(_) | Call::Authorship(_) | Call::Staking(_) | Call::Offences(_) | @@ -213,7 +214,7 @@ impl babe::Trait for Runtime { )>>::IdentificationTuple; type HandleEquivocation = - babe::EquivocationHandler; + babe::EquivocationHandler; } parameter_types! { @@ -486,8 +487,8 @@ impl collective::Trait for Runtime { parameter_types! { pub const CandidacyBond: Balance = 100 * DOLLARS; pub const VotingBond: Balance = 5 * DOLLARS; - /// Weekly council elections initially, later monthly. - pub const TermDuration: BlockNumber = 7 * DAYS; + /// Daily council elections initially, later weekly and monthly. + pub const TermDuration: BlockNumber = 1 * DAYS; /// 13 members initially, to be increased to 23 eventually. pub const DesiredMembers: u32 = 13; pub const DesiredRunnersUp: u32 = 20; @@ -615,7 +616,7 @@ impl grandpa::Trait for Runtime { type Call = Call; type KeyOwnerProof = - >::Proof; + >::Proof; type KeyOwnerIdentification = Date: Thu, 16 Jul 2020 20:34:43 -0400 Subject: [PATCH 070/192] Runtime APIs for node-side code (#1401) * create a README on Runtime APIs * add ParaId type * write up runtime APIs * more preamble * rename * rejig runtime APIs * add occupied_since to `BlockNumber` * improve group_for_core * improve docs on availability cores runtime API * guide: freed -> free * Update roadmap/implementers-guide/src/runtime-api/README.md Co-authored-by: Peter Goodspeed-Niklaus * add explicit block parameter to runtime API fns Co-authored-by: Peter Goodspeed-Niklaus --- roadmap/implementers-guide/src/SUMMARY.md | 1 + .../src/runtime-api/README.md | 183 ++++++++++++++++++ .../src/runtime/scheduler.md | 3 +- .../implementers-guide/src/types/candidate.md | 13 +- .../src/types/overseer-protocol.md | 44 ++--- 5 files changed, 217 insertions(+), 27 deletions(-) create mode 100644 roadmap/implementers-guide/src/runtime-api/README.md diff --git a/roadmap/implementers-guide/src/SUMMARY.md b/roadmap/implementers-guide/src/SUMMARY.md index b5dc3840c6..0a7fa21d2a 100644 --- a/roadmap/implementers-guide/src/SUMMARY.md +++ b/roadmap/implementers-guide/src/SUMMARY.md @@ -14,6 +14,7 @@ - [InclusionInherent Module](runtime/inclusioninherent.md) - [Validity Module](runtime/validity.md) - [Router Module](runtime/router.md) +- [Runtime APIs](runtime-api/README.md) - [Node Architecture](node/README.md) - [Subsystems and Jobs](node/subsystems-and-jobs.md) - [Overseer](node/overseer.md) diff --git a/roadmap/implementers-guide/src/runtime-api/README.md b/roadmap/implementers-guide/src/runtime-api/README.md new file mode 100644 index 0000000000..4631fab30b --- /dev/null +++ b/roadmap/implementers-guide/src/runtime-api/README.md @@ -0,0 +1,183 @@ +# Runtime APIs + +Runtime APIs are the means by which the node-side code extracts information from the state of the runtime. + +Every block in the relay-chain contains a *state root* which is the root hash of a state trie encapsulating all storage of runtime modules after execution of the block. This is a cryptographic commitment to a unique state. We use the terminology of accessing the *state at* a block to refer accessing the state referred to by the state root of that block. + +Although Runtime APIs are often used for simple storage access, they are actually empowered to do arbitrary computation. The implementation of the Runtime APIs lives within the Runtime as Wasm code and exposes extern functions that can be invoked with arguments and have a return value. Runtime APIs have access to a variety of host functions, which are contextual functions provided by the Wasm execution context, that allow it to carry out many different types of behaviors. + +Abilities provided by host functions includes: + * State Access + * Offchain-DB Access + * Submitting transactions to the transaction queue + * Optimized versions of cryptographic functions + * More + +So it is clear that Runtime APIs are a versatile and powerful tool to leverage the state of the chain. In general, we will use Runtime APIs for these purposes: + * Access of a storage item + * Access of a bundle of related storage items + * Deriving a value from storage based on arguments + * Submitting misbehavior reports + +More broadly, we have the goal of using Runtime APIs to write Node-side code that fulfills the requirements set by the Runtime. In particular, the constraints set forth by the [Scheduler](../runtime/scheduler.md) and [Inclusion](../runtime/inclusion.md) modules. These modules are responsible for advancing paras with a two-phase protocol where validators are first chosen to validate and back a candidate and then required to ensure availability of referenced data. In the second phase, validators are meant to attest to those para-candidates that they have their availability chunk for. As the Node-side code needs to generate the inputs into these two phases, the runtime API needs to transmit information from the runtime that is aware of the Availability Cores model instantiated by the Scheduler and Inclusion modules. + +Node-side code is also responsible for detecting and reporting misbehavior performed by other validators, and the set of Runtime APIs needs to provide methods for observing live disputes and submitting reports as transactions. + +The next sections will contain information on specific runtime APIs. The format is this: + +```rust +/// Fetch the value of the runtime API at the block. +/// +/// Definitionally, the `at` parameter cannot be any block that is not in the chain. +/// Thus the return value is unconditional. However, for in-practice implementations +/// it may be possible to provide an `at` parameter as a hash, which may not refer to a +/// valid block or one which implements the runtime API. In those cases it would be +/// best for the implementation to return an error indicating the failure mode. +fn some_runtime_api(at: Block, arg1: Type1, arg2: Type2, ...) -> ReturnValue; +``` + +## Validators + +Yields the validator-set at the state of a given block. This validator set is always the one responsible for backing parachains in the child of the provided block. + +```rust +fn validators(at: Block) -> Vec; +``` + +## Validator Groups + +Yields the validator groups used during the current session. The validators in the groups are referred to by their index into the validator-set. + +```rust +/// A helper data-type for tracking validator-group rotations. +struct GroupRotationInfo { + session_start_block: BlockNumber, + group_rotation_frequency: BlockNumber, + now: BlockNumber, +} + +impl GroupRotationInfo { + /// Returns the index of the group needed to validate the core at the given index, + /// assuming the given amount of cores/groups. + fn group_for_core(core_index: usize, cores: usize) -> usize; +} + +/// Returns the validator groups and rotation info localized based on the block whose state +/// this is invoked on. Note that `now` in the `GroupRotationInfo` should be the successor of +/// the number of the block. +fn validator_groups(at: Block) -> (Vec>, GroupRotationInfo); +``` + +## Availability Cores + +Yields information on all availability cores. Cores are either free or occupied. Free cores can have paras assigned to them. Occupied cores don't, but they can become available part-way through a block due to bitfields and then have something scheduled on them. To allow optimistic validation of candidates, the occupied cores are accompanied by information on what is upcoming. This information can be leveraged when validators perceive that there is a high likelihood of a core becoming available based on bitfields seen, and then optimistically validate something that would become scheduled based on that, although there is no guarantee on what the block producer will actually include in the block. + +```rust +fn availability_cores(at: Block) -> Vec; +``` + +This is all the information that a validator needs about scheduling for the current block. It includes all information on [Scheduler](../runtime/scheduler.md) core-assignments and [Inclusion](../runtime/inclusion.md) state of blocks occupying availability cores. It includes data necessary to determine not only which paras are assigned now, but which cores are likely to become freed after processing bitfields, and exactly which bitfields would be necessary to make them so. + +```rust +struct OccupiedCore { + /// The ID of the para occupying the core. + para: ParaId, + /// If this core is freed by availability, this is the assignment that is next up on this + /// core, if any. None if there is nothing queued for this core. + next_up_on_available: Option, + /// The relay-chain block number this began occupying the core at. + occupied_since: BlockNumber, + /// The relay-chain block this will time-out at, if any. + time_out_at: BlockNumber, + /// If this core is freed by being timed-out, this is the assignment that is next up on this + /// core. None if there is nothing queued for this core or there is no possibility of timing + /// out. + next_up_on_time_out: Option, + /// A bitfield with 1 bit for each validator in the set. `1` bits mean that the corresponding + /// validators has attested to availability on-chain. A 2/3+ majority of `1` bits means that + /// this will be available. + availability: Bitfield, +} + +struct ScheduledCore { + /// The ID of a para scheduled. + para: ParaId, + /// The collator required to author the block, if any. + collator: Option, +} + +enum CoreState { + /// The core is currently occupied. + Occupied(OccupiedCore), + /// The core is currently free, with a para scheduled and given the opportunity + /// to occupy. + /// + /// If a particular Collator is required to author this block, that is also present in this + /// variant. + Scheduled(ScheduledCore), + /// The core is currently free and there is nothing scheduled. This can be the case for parathread + /// cores when there are no parathread blocks queued. Parachain cores will never be left idle. + Free, +} +``` + +## Global Validation Schedule + +Yields the [`GlobalValidationSchedule`](../types/candidate.md#globalvalidationschedule) at the state of a given block. This applies to all para candidates with the relay-parent equal to that block. + +```rust +fn global_validation_schedule(at: Block) -> GlobalValidationSchedule; +``` + +## Local Validation Data + +Yields the [`LocalValidationData`](../types/candidate.md#localvalidationdata) for the given [`ParaId`](../types/candidate.md#paraid) along with an assumption that should be used if the para currently occupies a core: whether the candidate occupying that core should be assumed to have been made available and included or timed out and discarded, along with a third option to assert that the core was not occupied. This choice affects everything from the parent head-data, the validation code, and the state of message-queues. Typically, users will take the assumption that either the core was free or that the occupying candidate was included, as timeouts are expected only in adversarial circumstances and even so, only in a small minority of blocks directly following validator set rotations. + +The documentation of [`LocalValidationData`](../types/candidate.md#localvalidationdata) has more information on this dichotomy. + +```rust +/// An assumption being made about the state of an occupied core. +enum OccupiedCoreAssumption { + /// The candidate occupying the core was made available and included to free the core. + Included, + /// The candidate occupying the core timed out and freed the core without advancing the para. + TimedOut, + /// The core was not occupied to begin with. + Free, +} + +/// Returns the local validation data for the given para and occupied core assumption. +/// +/// Returns `None` if either the para is not registered or the assumption is `Freed` +/// and the para already occupies a core. +fn local_validation_data(at: Block, ParaId, OccupiedCoreAssumption) -> Option; +``` + +## Session Index + +Get the session index that is expected at the child of a block. + +In the [`Initializer`](../runtime/initializer.md) module, session changes are buffered by one block. The session index of the child of any relay block is always predictable by that block's state. + +This session index can be used to derive a [`SigningContext`](../types/candidate.md#signing-context). + +```rust +/// Returns the session index expected at a child of the block. +fn session_index_for_child(at: Block) -> SessionIndex; +``` + +## Validation Code + +Fetch the validation code used by a para, making the given `OccupiedCoreAssumption`. + +```rust +fn validation_code(at: Block, ParaId, OccupiedCoreAssumption) -> ValidationCode; +``` + +## Candidate Pending Availability + +Get the receipt of a candidate pending availability. This returns `Some` for any paras assigned to occupied cores in `availability_cores` and `None` otherwise. + +```rust +fn candidate_pending_availability(at: Block, ParaId) -> Option; +``` diff --git a/roadmap/implementers-guide/src/runtime/scheduler.md b/roadmap/implementers-guide/src/runtime/scheduler.md index 0b6a60a383..efa85a15c4 100644 --- a/roadmap/implementers-guide/src/runtime/scheduler.md +++ b/roadmap/implementers-guide/src/runtime/scheduler.md @@ -131,8 +131,7 @@ Storage layout: ValidatorGroups: Vec>; /// A queue of upcoming claims and which core they should be mapped onto. ParathreadQueue: ParathreadQueue; -/// One entry for each availability core. Entries are `None` if the core is not currently occupied. Can be -/// temporarily `Some` if scheduled but not occupied. +/// One entry for each availability core. Entries are `None` if the core is not currently occupied. /// The i'th parachain belongs to the i'th core, with the remaining cores all being /// parathread-multiplexers. AvailabilityCores: Vec>; diff --git a/roadmap/implementers-guide/src/types/candidate.md b/roadmap/implementers-guide/src/types/candidate.md index 0ed38590a7..0002851cee 100644 --- a/roadmap/implementers-guide/src/types/candidate.md +++ b/roadmap/implementers-guide/src/types/candidate.md @@ -7,6 +7,14 @@ In a way, this entire guide is about these candidates: how they are scheduled, c This section will describe the base candidate type, its components, and variants that contain extra data. +## Para Id + +A unique 32-bit identifier referring to a specific para (chain or thread). The relay-chain runtime guarantees that `ParaId`s are unique for the duration of any session, but recycling and reuse over a longer period of time is permitted. + +```rust +struct ParaId(u32); +``` + ## Candidate Receipt Much info in a [`FullCandidateReceipt`](#full-candidate-receipt) is duplicated from the relay-chain state. When the corresponding relay-chain state is considered widely available, the Candidate Receipt should be favored over the `FullCandidateReceipt`. @@ -64,7 +72,7 @@ This struct is pure description of the candidate, in a lightweight format. /// A unique descriptor of the candidate receipt. struct CandidateDescriptor { /// The ID of the para this is a candidate for. - para_id: Id, + para_id: ParaId, /// The hash of the relay-chain block this is executed in the context of. relay_parent: Hash, /// The collator's sr25519 public key. @@ -82,8 +90,6 @@ struct CandidateDescriptor { The global validation schedule comprises of information describing the global environment for para execution, as derived from a particular relay-parent. These are parameters that will apply to all parablocks executed in the context of this relay-parent. -> TODO: message queue watermarks (first downward messages, then XCMP channels) - ```rust /// Extra data that is needed along with the other fields in a `CandidateReceipt` /// to fully validate the candidate. @@ -112,6 +118,7 @@ This choice can also be expressed as a choice of which parent head of the para w Para validation happens optimistically before the block is authored, so it is not possible to predict with 100% accuracy what will happen in the earlier phase of the [`InclusionInherent`](../runtime/inclusioninherent.md) module where new availability bitfields and availability timeouts are processed. This is what will eventually define whether a candidate can be backed within a specific relay-chain block. > TODO: determine if balance/fees are even needed here. +> TODO: message queue watermarks (first downward messages, then XCMP channels) ```rust /// Extra data that is needed along with the other fields in a `CandidateReceipt` diff --git a/roadmap/implementers-guide/src/types/overseer-protocol.md b/roadmap/implementers-guide/src/types/overseer-protocol.md index b822508f4a..3298d8f65f 100644 --- a/roadmap/implementers-guide/src/types/overseer-protocol.md +++ b/roadmap/implementers-guide/src/types/overseer-protocol.md @@ -228,33 +228,33 @@ enum ProvisionerMessage { The Runtime API subsystem is responsible for providing an interface to the state of the chain's runtime. -Other subsystems query this data by sending these messages. +This is fueled by an auxiliary type encapsulating all request types defined in the Runtime API section of the guide. -```rust -/// The information on validator groups, core assignments, -/// upcoming paras and availability cores. -struct SchedulerRoster { - /// Validator-to-groups assignments. - validator_groups: Vec>, - /// All scheduled paras. - scheduled: Vec, - /// Upcoming paras (chains and threads). - upcoming: Vec, - /// Occupied cores. - availability_cores: Vec>, -} +> TODO: link to the Runtime API section. Not possible currently because of https://github.com/Michael-F-Bryan/mdbook-linkcheck/issues/25. Once v0.7.1 is released it will work. +```rust enum RuntimeApiRequest { /// Get the current validator set. Validators(ResponseChannel>), - /// Get the assignments of validators to cores, upcoming parachains. - SchedulerRoster(ResponseChannel), - /// Get a signing context for bitfields and statements. - SigningContext(ResponseChannel), - /// Get the validation code for a specific para, assuming execution under given block number, and - /// an optional block number representing an intermediate parablock executed in the context of - /// that block. - ValidationCode(ParaId, BlockNumber, Option, ResponseChannel), + /// Get the validator groups and rotation info. + ValidatorGroups(ResponseChannel<(Vec>, GroupRotationInfo)>), + /// Get the session index for children of the block. This can be used to construct a signing + /// context. + SessionIndex(ResponseChannel), + /// Get the validation code for a specific para, using the given occupied core assumption. + ValidationCode(ParaId, OccupiedCoreAssumption, ResponseChannel>), + /// Get the global validation schedule at the state of a given block. + GlobalValidationSchedule(ResponseChannel), + /// Get the local validation data for a specific para, with the given occupied core assumption. + LocalValidationData( + ParaId, + OccupiedCoreAssumption, + ResponseChannel>, + ), + /// Get information about all availability cores. + AvailabilityCores(ResponseChannel), + /// Get a committed candidate receipt for all candidates pending availability. + CandidatePendingAvailability(ParaId, ResponseChannel>), } enum RuntimeApiMessage { -- GitLab From d390eb51791c612135f8612c40bd6f9f04789bcc Mon Sep 17 00:00:00 2001 From: Andronik Ordian Date: Fri, 17 Jul 2020 03:27:49 +0200 Subject: [PATCH 071/192] inclusion: split CandidatePendingAvailability according to the guide (#1413) * inclusion: split PendingAvailability storage into descriptor and commitments * inclusion: fix tests * implementers-guide: update CandidatePendingAvailability type * inclusion: simplify process_candidates a bit * implementers-guide: more updates to the inclusion module * inclusion: fix copy-paste errors in tests * inclusion: revert some of the changes * inclusion: lazy commitments loading and a test * guide: revert enact_candidate changes * inclusion: test process_bitfield for no commitments * Grammar Co-authored-by: Robert Habermeier Co-authored-by: Robert Habermeier --- .../src/runtime/inclusion.md | 5 +- runtime/parachains/src/inclusion.rs | 201 +++++++++++++++--- 2 files changed, 170 insertions(+), 36 deletions(-) diff --git a/roadmap/implementers-guide/src/runtime/inclusion.md b/roadmap/implementers-guide/src/runtime/inclusion.md index d201e3ed51..7f093261d3 100644 --- a/roadmap/implementers-guide/src/runtime/inclusion.md +++ b/roadmap/implementers-guide/src/runtime/inclusion.md @@ -14,7 +14,7 @@ struct AvailabilityBitfield { struct CandidatePendingAvailability { core: CoreIndex, // availability core - receipt: CandidateReceipt, + descriptor: CandidateDescriptor, availability_votes: Bitfield, // one bit per validator. relay_parent_number: BlockNumber, // number of the relay-parent. backed_in_number: BlockNumber, @@ -65,7 +65,6 @@ All failed checks should lead to an unrecoverable error making the block invalid 1. If the core assignment includes a specific collator, ensure the backed candidate is issued by that collator. 1. Ensure that any code upgrade scheduled by the candidate does not happen within `config.validation_upgrade_frequency` of `Paras::last_code_upgrade(para_id, true)`, if any, comparing against the value of `Paras::FutureCodeUpgrades` for the given para ID. 1. Check the collator's signature on the candidate data. - 1. Transform each [`CommittedCandidateReceipt`](../types/candidate.md#committed-candidate-receipt) into the corresponding [`CandidateReceipt`](../types/candidate.md#candidate-receipt), setting the commitments aside. 1. check the backing of the candidate using the signatures and the bitfields, comparing against the validators assigned to the groups, fetched with the `group_validators` lookup. 1. check that the upward messages, when combined with the existing queue size, are not exceeding `config.max_upward_queue_count` and `config.watermark_upward_queue_size` parameters. 1. create an entry in the `PendingAvailability` map for each backed candidate with a blank `availability_votes` bitfield. @@ -81,7 +80,7 @@ All failed checks should lead to an unrecoverable error making the block invalid ```rust fn collect_pending(f: impl Fn(CoreIndex, BlockNumber) -> bool) -> Vec { // sweep through all paras pending availability. if the predicate returns true, when given the core index and - // the block number the candidate has been pending availability since, then clean up the corresponding storage for that candidate. + // the block number the candidate has been pending availability since, then clean up the corresponding storage for that candidate and the commitments. // return a vector of cleaned-up core IDs. } ``` diff --git a/runtime/parachains/src/inclusion.rs b/runtime/parachains/src/inclusion.rs index a2480f1c80..10c019bbe1 100644 --- a/runtime/parachains/src/inclusion.rs +++ b/runtime/parachains/src/inclusion.rs @@ -22,14 +22,15 @@ use sp_std::prelude::*; use primitives::v1::{ - ValidatorId, CommittedCandidateReceipt, ValidatorIndex, Id as ParaId, + ValidatorId, CandidateCommitments, CandidateDescriptor, ValidatorIndex, Id as ParaId, AvailabilityBitfield as AvailabilityBitfield, SignedAvailabilityBitfields, SigningContext, - BackedCandidate, CoreIndex, GroupIndex, CoreAssignment, + BackedCandidate, CoreIndex, GroupIndex, CoreAssignment, CommittedCandidateReceipt, }; use frame_support::{ decl_storage, decl_module, decl_error, ensure, dispatch::DispatchResult, IterableStorageMap, weights::Weight, traits::Get, + debug, }; use codec::{Encode, Decode}; use bitvec::{order::Lsb0 as BitOrderLsb0, vec::BitVec}; @@ -58,8 +59,8 @@ pub struct AvailabilityBitfieldRecord { pub struct CandidatePendingAvailability { /// The availability core this is assigned to. core: CoreIndex, - /// The candidate receipt itself. - receipt: CommittedCandidateReceipt, + /// The candidate descriptor. + descriptor: CandidateDescriptor, /// The received availability votes. One bit per validator. availability_votes: BitVec, /// The block number of the relay-parent of the receipt. @@ -80,6 +81,10 @@ decl_storage! { PendingAvailability: map hasher(twox_64_concat) ParaId => Option>; + /// The commitments of candidates pending availability, by ParaId. + PendingAvailabilityCommitments: map hasher(twox_64_concat) ParaId + => Option; + /// The current validators, by their parachain session keys. Validators get(fn validators) config(validators): Vec; @@ -146,6 +151,7 @@ impl Module { ) { // unlike most drain methods, drained elements are not cleared on `Drop` of the iterator // and require consumption. + for _ in ::drain() { } for _ in >::drain() { } for _ in >::drain() { } @@ -227,14 +233,14 @@ impl Module { for (bit_idx, _) in signed_bitfield.payload().0.iter().enumerate().filter(|(_, is_av)| **is_av) { - let record = assigned_paras_record[bit_idx] + let (_, pending_availability) = assigned_paras_record[bit_idx] .as_mut() .expect("validator bitfields checked not to contain bits corresponding to unoccupied cores; qed"); // defensive check - this is constructed by loading the availability bitfield record, // which is always `Some` if the core is occupied - that's why we're here. let val_idx = signed_bitfield.validator_index() as usize; - if let Some(mut bit) = record.1.as_mut() + if let Some(mut bit) = pending_availability.as_mut() .and_then(|r| r.availability_votes.get_mut(val_idx)) { *bit = true; @@ -261,9 +267,25 @@ impl Module { { if pending_availability.availability_votes.count_ones() >= threshold { >::remove(¶_id); + let commitments = match ::take(¶_id) { + Some(commitments) => commitments, + None => { + debug::warn!(r#" + Inclusion::process_bitfields: + PendingAvailability and PendingAvailabilityCommitments + are out of sync, did someone mess with the storage? + "#); + continue; + } + }; + + let receipt = CommittedCandidateReceipt { + descriptor: pending_availability.descriptor, + commitments, + }; Self::enact_candidate( pending_availability.relay_parent_number, - pending_availability.receipt, + receipt, ); freed_cores.push(pending_availability.core); @@ -358,7 +380,7 @@ impl Module { for (i, assignment) in scheduled[skip..].iter().enumerate() { check_assignment_in_order(assignment)?; - if candidate.descriptor().para_id == assignment.para_id { + if para_id == assignment.para_id { if let Some(required_collator) = assignment.required_collator() { ensure!( required_collator == &candidate.descriptor().collator, @@ -367,7 +389,8 @@ impl Module { } ensure!( - >::get(&assignment.para_id).is_none(), + >::get(¶_id).is_none() && + ::get(¶_id).is_none(), Error::::CandidateScheduledBeforeParaFree, ); @@ -427,13 +450,15 @@ impl Module { // initialize all availability votes to 0. let availability_votes: BitVec = bitvec::bitvec![BitOrderLsb0, u8; 0; validators.len()]; + let (descriptor, commitments) = (candidate.candidate.descriptor, candidate.candidate.commitments); >::insert(¶_id, CandidatePendingAvailability { core, - receipt: candidate.candidate, + descriptor, availability_votes, relay_parent_number, backed_in_number: now, }); + ::insert(¶_id, commitments); } Ok(core_indices) @@ -482,6 +507,7 @@ impl Module { for para_id in cleaned_up_ids { >::remove(¶_id); + ::remove(¶_id); } cleaned_up_cores @@ -713,31 +739,38 @@ mod tests { let paras = vec![(chain_a, true), (chain_b, true), (thread_a, false)]; new_test_ext(genesis_config(paras)).execute_with(|| { + let default_candidate = TestCandidateBuilder::default().build(); >::insert(chain_a, CandidatePendingAvailability { core: CoreIndex::from(0), - receipt: Default::default(), + descriptor: default_candidate.descriptor.clone(), availability_votes: default_availability_votes(), relay_parent_number: 0, backed_in_number: 0, }); + PendingAvailabilityCommitments::insert(chain_a, default_candidate.commitments.clone()); - >::insert(chain_b, CandidatePendingAvailability { + >::insert(&chain_b, CandidatePendingAvailability { core: CoreIndex::from(1), - receipt: Default::default(), + descriptor: default_candidate.descriptor, availability_votes: default_availability_votes(), relay_parent_number: 0, backed_in_number: 0, }); + PendingAvailabilityCommitments::insert(chain_b, default_candidate.commitments); run_to_block(5, |_| None); assert!(>::get(&chain_a).is_some()); assert!(>::get(&chain_b).is_some()); + assert!(::get(&chain_a).is_some()); + assert!(::get(&chain_b).is_some()); Inclusion::collect_pending(|core, _since| core == CoreIndex::from(0)); assert!(>::get(&chain_a).is_none()); assert!(>::get(&chain_b).is_some()); + assert!(::get(&chain_a).is_none()); + assert!(::get(&chain_b).is_some()); }); } @@ -868,13 +901,15 @@ mod tests { assert_eq!(core_lookup(CoreIndex::from(0)), Some(chain_a)); + let default_candidate = TestCandidateBuilder::default().build(); >::insert(chain_a, CandidatePendingAvailability { core: CoreIndex::from(0), - receipt: Default::default(), + descriptor: default_candidate.descriptor, availability_votes: default_availability_votes(), relay_parent_number: 0, backed_in_number: 0, }); + PendingAvailabilityCommitments::insert(chain_a, default_candidate.commitments); *bare_bitfield.0.get_mut(0).unwrap() = true; let signed = sign_bitfield( @@ -888,6 +923,42 @@ mod tests { vec![signed], &core_lookup, ).is_ok()); + + >::remove(chain_a); + PendingAvailabilityCommitments::remove(chain_a); + } + + // bitfield signed with pending bit signed, but no commitments. + { + let mut bare_bitfield = default_bitfield(); + + assert_eq!(core_lookup(CoreIndex::from(0)), Some(chain_a)); + + let default_candidate = TestCandidateBuilder::default().build(); + >::insert(chain_a, CandidatePendingAvailability { + core: CoreIndex::from(0), + descriptor: default_candidate.descriptor, + availability_votes: default_availability_votes(), + relay_parent_number: 0, + backed_in_number: 0, + }); + + *bare_bitfield.0.get_mut(0).unwrap() = true; + let signed = sign_bitfield( + &validators[0], + 0, + bare_bitfield, + &signing_context, + ); + + // no core is freed + assert_eq!( + Inclusion::process_bitfields( + vec![signed], + &core_lookup, + ), + Ok(vec![]), + ); } }); } @@ -924,29 +995,35 @@ mod tests { _ => panic!("Core out of bounds for 2 parachains and 1 parathread core."), }; + let candidate_a = TestCandidateBuilder { + para_id: chain_a, + head_data: vec![1, 2, 3, 4].into(), + ..Default::default() + }.build(); + >::insert(chain_a, CandidatePendingAvailability { core: CoreIndex::from(0), - receipt: TestCandidateBuilder { - para_id: chain_a, - head_data: vec![1, 2, 3, 4].into(), - ..Default::default() - }.build(), + descriptor: candidate_a.descriptor, availability_votes: default_availability_votes(), relay_parent_number: 0, backed_in_number: 0, }); + PendingAvailabilityCommitments::insert(chain_a, candidate_a.commitments); + + let candidate_b = TestCandidateBuilder { + para_id: chain_b, + head_data: vec![5, 6, 7, 8].into(), + ..Default::default() + }.build(); >::insert(chain_b, CandidatePendingAvailability { core: CoreIndex::from(1), - receipt: TestCandidateBuilder { - para_id: chain_b, - head_data: vec![5, 6, 7, 8].into(), - ..Default::default() - }.build(), + descriptor: candidate_b.descriptor, availability_votes: default_availability_votes(), relay_parent_number: 0, backed_in_number: 0, }); + PendingAvailabilityCommitments::insert(chain_b, candidate_b.commitments); // this bitfield signals that a and b are available. let a_and_b_available = { @@ -996,6 +1073,8 @@ mod tests { // chain A had 4 signing off, which is >= threshold. // chain B has 3 signing off, which is < threshold. assert!(>::get(&chain_a).is_none()); + assert!(::get(&chain_a).is_none()); + assert!(::get(&chain_b).is_some()); assert_eq!( >::get(&chain_b).unwrap().availability_votes, { @@ -1053,7 +1132,7 @@ mod tests { let chain_a_assignment = CoreAssignment { core: CoreIndex::from(0), - para_id: chain_b, + para_id: chain_a, kind: AssignmentKind::Parachain, group_idx: GroupIndex::from(0), }; @@ -1067,7 +1146,7 @@ mod tests { let thread_a_assignment = CoreAssignment { core: CoreIndex::from(2), - para_id: chain_b, + para_id: thread_a, kind: AssignmentKind::Parathread(thread_collator.clone(), 0), group_idx: GroupIndex::from(2), }; @@ -1296,13 +1375,15 @@ mod tests { BackingKind::Threshold, ); + let candidate = TestCandidateBuilder::default().build(); >::insert(&chain_a, CandidatePendingAvailability { core: CoreIndex::from(0), - receipt: Default::default(), + descriptor: candidate.descriptor, availability_votes: default_availability_votes(), relay_parent_number: 3, backed_in_number: 4, }); + ::insert(&chain_a, candidate.commitments); assert!(Inclusion::process_candidates( vec![backed], @@ -1311,6 +1392,41 @@ mod tests { ).is_err()); >::remove(&chain_a); + ::remove(&chain_a); + } + + // messed up commitments storage - do not panic - reject. + { + let mut candidate = TestCandidateBuilder { + para_id: chain_a, + relay_parent: System::parent_hash(), + pov_hash: Hash::from([1; 32]), + ..Default::default() + }.build(); + + collator_sign_candidate( + Sr25519Keyring::One, + &mut candidate, + ); + + // this is not supposed to happen + ::insert(&chain_a, candidate.commitments.clone()); + + let backed = back_candidate( + candidate, + &validators, + group_validators(GroupIndex::from(0)).unwrap().as_ref(), + &signing_context, + BackingKind::Threshold, + ); + + assert!(Inclusion::process_candidates( + vec![backed], + vec![chain_a_assignment.clone()], + &group_validators, + ).is_err()); + + ::remove(&chain_a); } // interfering code upgrade - reject @@ -1483,34 +1599,46 @@ mod tests { >::get(&chain_a), Some(CandidatePendingAvailability { core: CoreIndex::from(0), - receipt: candidate_a, + descriptor: candidate_a.descriptor, availability_votes: default_availability_votes(), relay_parent_number: System::block_number() - 1, backed_in_number: System::block_number(), }) ); + assert_eq!( + ::get(&chain_a), + Some(candidate_a.commitments), + ); assert_eq!( >::get(&chain_b), Some(CandidatePendingAvailability { core: CoreIndex::from(1), - receipt: candidate_b, + descriptor: candidate_b.descriptor, availability_votes: default_availability_votes(), relay_parent_number: System::block_number() - 1, backed_in_number: System::block_number(), }) ); + assert_eq!( + ::get(&chain_b), + Some(candidate_b.commitments), + ); assert_eq!( >::get(&thread_a), Some(CandidatePendingAvailability { core: CoreIndex::from(2), - receipt: candidate_c, + descriptor: candidate_c.descriptor, availability_votes: default_availability_votes(), relay_parent_number: System::block_number() - 1, backed_in_number: System::block_number(), }) ); + assert_eq!( + ::get(&thread_a), + Some(candidate_c.commitments), + ); }); } @@ -1568,21 +1696,24 @@ mod tests { }, ); + let candidate = TestCandidateBuilder::default().build(); >::insert(&chain_a, CandidatePendingAvailability { core: CoreIndex::from(0), - receipt: Default::default(), + descriptor: candidate.descriptor.clone(), availability_votes: default_availability_votes(), relay_parent_number: 5, backed_in_number: 6, }); + ::insert(&chain_a, candidate.commitments.clone()); >::insert(&chain_b, CandidatePendingAvailability { core: CoreIndex::from(1), - receipt: Default::default(), + descriptor: candidate.descriptor, availability_votes: default_availability_votes(), relay_parent_number: 6, backed_in_number: 7, }); + ::insert(&chain_b, candidate.commitments); run_to_block(11, |_| None); @@ -1595,6 +1726,8 @@ mod tests { assert!(>::get(&chain_a).is_some()); assert!(>::get(&chain_b).is_some()); + assert!(::get(&chain_a).is_some()); + assert!(::get(&chain_b).is_some()); run_to_block(12, |n| match n { 12 => Some(SessionChangeNotification { @@ -1617,10 +1750,12 @@ mod tests { assert!(>::get(&chain_a).is_none()); assert!(>::get(&chain_b).is_none()); + assert!(::get(&chain_a).is_none()); + assert!(::get(&chain_b).is_none()); assert!(>::iter().collect::>().is_empty()); assert!(>::iter().collect::>().is_empty()); - + assert!(::iter().collect::>().is_empty()); }); } } -- GitLab From 28c26d69e03b5b0d3381b075576c9220081f3e5a Mon Sep 17 00:00:00 2001 From: Gavin Wood Date: Fri, 17 Jul 2020 12:36:36 +0200 Subject: [PATCH 072/192] Define BurnDestination, Kusama Treasury burns to Society (#6671) (#1421) * Define BurnDestination, Kusama Treasury burns to Society. * Fixes * Remove the council elections enabling. * Bump * whitespace --- Cargo.lock | 321 +++++++++++++++----------------- runtime/common/src/crowdfund.rs | 1 + runtime/kusama/src/lib.rs | 3 +- runtime/polkadot/src/lib.rs | 1 + 4 files changed, 158 insertions(+), 168 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 1c0583a703..81306de744 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -256,7 +256,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "df097e3f506bec0e1a24f06bb3c962c228f36671de841ff579cb99f371772634" dependencies = [ "futures 0.3.5", - "rustls 0.18.0", + "rustls", "webpki", "webpki-roots 0.19.0", ] @@ -909,9 +909,9 @@ dependencies = [ [[package]] name = "ct-logs" -version = "0.6.0" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d3686f5fa27dbc1d76c751300376e167c5a43387f44bb451fd1c24776e49113" +checksum = "8c8e13110a84b6315df212c045be706af261fd364791cad863285439ebba672e" dependencies = [ "sct", ] @@ -1314,7 +1314,7 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "fork-tree" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" +source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" dependencies = [ "parity-scale-codec", ] @@ -1322,7 +1322,7 @@ dependencies = [ [[package]] name = "frame-benchmarking" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" +source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" dependencies = [ "frame-support", "frame-system", @@ -1339,7 +1339,7 @@ dependencies = [ [[package]] name = "frame-benchmarking-cli" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" +source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" dependencies = [ "Inflector", "frame-benchmarking", @@ -1358,7 +1358,7 @@ dependencies = [ [[package]] name = "frame-executive" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" +source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" dependencies = [ "frame-support", "frame-system", @@ -1373,7 +1373,7 @@ dependencies = [ [[package]] name = "frame-metadata" version = "11.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" +source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" dependencies = [ "parity-scale-codec", "serde", @@ -1384,7 +1384,7 @@ dependencies = [ [[package]] name = "frame-support" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" +source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" dependencies = [ "bitmask", "frame-metadata", @@ -1409,7 +1409,7 @@ dependencies = [ [[package]] name = "frame-support-procedural" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" +source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" dependencies = [ "frame-support-procedural-tools", "proc-macro2 1.0.18", @@ -1420,7 +1420,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" +source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" dependencies = [ "frame-support-procedural-tools-derive", "proc-macro-crate", @@ -1432,7 +1432,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools-derive" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" +source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" dependencies = [ "proc-macro2 1.0.18", "quote 1.0.7", @@ -1442,7 +1442,7 @@ dependencies = [ [[package]] name = "frame-system" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" +source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" dependencies = [ "frame-support", "impl-trait-for-tuples", @@ -1458,7 +1458,7 @@ dependencies = [ [[package]] name = "frame-system-benchmarking" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" +source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" dependencies = [ "frame-benchmarking", "frame-support", @@ -1472,7 +1472,7 @@ dependencies = [ [[package]] name = "frame-system-rpc-runtime-api" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" +source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" dependencies = [ "parity-scale-codec", "sp-api", @@ -2097,16 +2097,16 @@ dependencies = [ [[package]] name = "hyper-rustls" -version = "0.20.0" +version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac965ea399ec3a25ac7d13b8affd4b8f39325cca00858ddf5eb29b79e6b14b08" +checksum = "37743cc83e8ee85eacfce90f2f4102030d9ff0a95244098d781e9bee4a90abb6" dependencies = [ "bytes 0.5.5", "ct-logs", "futures-util", "hyper 0.13.6", "log 0.4.8", - "rustls 0.17.0", + "rustls", "rustls-native-certs", "tokio 0.2.21", "tokio-rustls", @@ -2878,7 +2878,7 @@ dependencies = [ "libp2p-core", "log 0.4.8", "quicksink", - "rustls 0.18.0", + "rustls", "rw-stream-sink", "soketto", "url 2.1.1", @@ -3466,7 +3466,7 @@ dependencies = [ [[package]] name = "pallet-authority-discovery" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" +source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" dependencies = [ "frame-support", "frame-system", @@ -3482,7 +3482,7 @@ dependencies = [ [[package]] name = "pallet-authorship" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" +source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" dependencies = [ "frame-support", "frame-system", @@ -3497,7 +3497,7 @@ dependencies = [ [[package]] name = "pallet-babe" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" +source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" dependencies = [ "frame-benchmarking", "frame-support", @@ -3522,7 +3522,7 @@ dependencies = [ [[package]] name = "pallet-balances" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" +source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" dependencies = [ "frame-benchmarking", "frame-support", @@ -3536,7 +3536,7 @@ dependencies = [ [[package]] name = "pallet-collective" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" +source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" dependencies = [ "frame-benchmarking", "frame-support", @@ -3552,7 +3552,7 @@ dependencies = [ [[package]] name = "pallet-democracy" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" +source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" dependencies = [ "frame-benchmarking", "frame-support", @@ -3567,7 +3567,7 @@ dependencies = [ [[package]] name = "pallet-elections-phragmen" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" +source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" dependencies = [ "frame-benchmarking", "frame-support", @@ -3582,7 +3582,7 @@ dependencies = [ [[package]] name = "pallet-finality-tracker" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" +source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" dependencies = [ "frame-support", "frame-system", @@ -3598,7 +3598,7 @@ dependencies = [ [[package]] name = "pallet-grandpa" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" +source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" dependencies = [ "frame-support", "frame-system", @@ -3618,7 +3618,7 @@ dependencies = [ [[package]] name = "pallet-identity" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" +source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" dependencies = [ "enumflags2", "frame-benchmarking", @@ -3634,7 +3634,7 @@ dependencies = [ [[package]] name = "pallet-im-online" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" +source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" dependencies = [ "frame-benchmarking", "frame-support", @@ -3654,7 +3654,7 @@ dependencies = [ [[package]] name = "pallet-indices" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" +source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" dependencies = [ "frame-support", "frame-system", @@ -3670,7 +3670,7 @@ dependencies = [ [[package]] name = "pallet-membership" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" +source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" dependencies = [ "frame-support", "frame-system", @@ -3684,7 +3684,7 @@ dependencies = [ [[package]] name = "pallet-multisig" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" +source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" dependencies = [ "frame-support", "frame-system", @@ -3699,7 +3699,7 @@ dependencies = [ [[package]] name = "pallet-nicks" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" +source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" dependencies = [ "frame-support", "frame-system", @@ -3713,7 +3713,7 @@ dependencies = [ [[package]] name = "pallet-offences" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" +source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" dependencies = [ "frame-support", "frame-system", @@ -3728,7 +3728,7 @@ dependencies = [ [[package]] name = "pallet-offences-benchmarking" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" +source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" dependencies = [ "frame-benchmarking", "frame-support", @@ -3749,7 +3749,7 @@ dependencies = [ [[package]] name = "pallet-proxy" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" +source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" dependencies = [ "frame-support", "frame-system", @@ -3764,7 +3764,7 @@ dependencies = [ [[package]] name = "pallet-randomness-collective-flip" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" +source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" dependencies = [ "frame-support", "frame-system", @@ -3777,7 +3777,7 @@ dependencies = [ [[package]] name = "pallet-recovery" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" +source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" dependencies = [ "enumflags2", "frame-support", @@ -3792,7 +3792,7 @@ dependencies = [ [[package]] name = "pallet-scheduler" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" +source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" dependencies = [ "frame-benchmarking", "frame-support", @@ -3807,7 +3807,7 @@ dependencies = [ [[package]] name = "pallet-session" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" +source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" dependencies = [ "frame-support", "frame-system", @@ -3827,7 +3827,7 @@ dependencies = [ [[package]] name = "pallet-session-benchmarking" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" +source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" dependencies = [ "frame-benchmarking", "frame-support", @@ -3843,7 +3843,7 @@ dependencies = [ [[package]] name = "pallet-society" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" +source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" dependencies = [ "frame-support", "frame-system", @@ -3857,7 +3857,7 @@ dependencies = [ [[package]] name = "pallet-staking" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" +source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" dependencies = [ "frame-benchmarking", "frame-support", @@ -3879,7 +3879,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-curve" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" +source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -3890,7 +3890,7 @@ dependencies = [ [[package]] name = "pallet-sudo" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" +source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" dependencies = [ "frame-support", "frame-system", @@ -3904,7 +3904,7 @@ dependencies = [ [[package]] name = "pallet-timestamp" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" +source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" dependencies = [ "frame-benchmarking", "frame-support", @@ -3922,7 +3922,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" +source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" dependencies = [ "frame-support", "frame-system", @@ -3937,7 +3937,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" +source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" dependencies = [ "jsonrpc-core", "jsonrpc-core-client", @@ -3955,7 +3955,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc-runtime-api" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" +source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" dependencies = [ "frame-support", "parity-scale-codec", @@ -3968,7 +3968,7 @@ dependencies = [ [[package]] name = "pallet-treasury" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" +source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" dependencies = [ "frame-benchmarking", "frame-support", @@ -3983,7 +3983,7 @@ dependencies = [ [[package]] name = "pallet-utility" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" +source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" dependencies = [ "frame-benchmarking", "frame-support", @@ -3999,7 +3999,7 @@ dependencies = [ [[package]] name = "pallet-vesting" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" +source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" dependencies = [ "enumflags2", "frame-benchmarking", @@ -5875,19 +5875,6 @@ dependencies = [ "semver", ] -[[package]] -name = "rustls" -version = "0.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0d4a31f5d68413404705d6982529b0e11a9aacd4839d1d6222ee3b8cb4015e1" -dependencies = [ - "base64 0.11.0", - "log 0.4.8", - "ring", - "sct", - "webpki", -] - [[package]] name = "rustls" version = "0.18.0" @@ -5903,12 +5890,12 @@ dependencies = [ [[package]] name = "rustls-native-certs" -version = "0.3.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75ffeb84a6bd9d014713119542ce415db3a3e4748f0bfce1e1416cd224a23a5" +checksum = "629d439a7672da82dd955498445e496ee2096fe2117b9f796558a43fdb9e59b8" dependencies = [ "openssl-probe", - "rustls 0.17.0", + "rustls", "schannel", "security-framework", ] @@ -5942,7 +5929,7 @@ dependencies = [ [[package]] name = "sc-authority-discovery" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" +source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" dependencies = [ "bytes 0.5.5", "derive_more 0.99.9", @@ -5969,7 +5956,7 @@ dependencies = [ [[package]] name = "sc-basic-authorship" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" +source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -5993,7 +5980,7 @@ dependencies = [ [[package]] name = "sc-block-builder" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" +source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" dependencies = [ "parity-scale-codec", "sc-client-api", @@ -6010,7 +5997,7 @@ dependencies = [ [[package]] name = "sc-chain-spec" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" +source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" dependencies = [ "impl-trait-for-tuples", "sc-chain-spec-derive", @@ -6026,7 +6013,7 @@ dependencies = [ [[package]] name = "sc-chain-spec-derive" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" +source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -6037,7 +6024,7 @@ dependencies = [ [[package]] name = "sc-cli" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" +source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" dependencies = [ "ansi_term 0.12.1", "atty", @@ -6078,7 +6065,7 @@ dependencies = [ [[package]] name = "sc-client-api" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" +source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" dependencies = [ "derive_more 0.99.9", "fnv", @@ -6114,7 +6101,7 @@ dependencies = [ [[package]] name = "sc-client-db" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" +source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" dependencies = [ "blake2-rfc", "hash-db", @@ -6143,7 +6130,7 @@ dependencies = [ [[package]] name = "sc-consensus" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" +source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" dependencies = [ "sc-client-api", "sp-blockchain", @@ -6154,7 +6141,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" +source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" dependencies = [ "derive_more 0.99.9", "fork-tree", @@ -6196,7 +6183,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe-rpc" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" +source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -6220,7 +6207,7 @@ dependencies = [ [[package]] name = "sc-consensus-epochs" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" +source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" dependencies = [ "fork-tree", "parity-scale-codec", @@ -6233,7 +6220,7 @@ dependencies = [ [[package]] name = "sc-consensus-slots" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" +source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6256,7 +6243,7 @@ dependencies = [ [[package]] name = "sc-consensus-uncles" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" +source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" dependencies = [ "log 0.4.8", "sc-client-api", @@ -6270,7 +6257,7 @@ dependencies = [ [[package]] name = "sc-executor" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" +source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" dependencies = [ "derive_more 0.99.9", "lazy_static", @@ -6298,7 +6285,7 @@ dependencies = [ [[package]] name = "sc-executor-common" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" +source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" dependencies = [ "derive_more 0.99.9", "log 0.4.8", @@ -6315,7 +6302,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmi" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" +source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" dependencies = [ "log 0.4.8", "parity-scale-codec", @@ -6330,7 +6317,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmtime" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" +source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" dependencies = [ "cranelift-codegen", "cranelift-wasm", @@ -6351,7 +6338,7 @@ dependencies = [ [[package]] name = "sc-finality-grandpa" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" +source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" dependencies = [ "assert_matches", "derive_more 0.99.9", @@ -6389,7 +6376,7 @@ dependencies = [ [[package]] name = "sc-finality-grandpa-rpc" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" +source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" dependencies = [ "derive_more 0.99.9", "finality-grandpa", @@ -6406,7 +6393,7 @@ dependencies = [ [[package]] name = "sc-informant" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" +source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" dependencies = [ "ansi_term 0.12.1", "futures 0.3.5", @@ -6424,7 +6411,7 @@ dependencies = [ [[package]] name = "sc-keystore" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" +source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" dependencies = [ "derive_more 0.99.9", "hex", @@ -6440,7 +6427,7 @@ dependencies = [ [[package]] name = "sc-light" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" +source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" dependencies = [ "hash-db", "lazy_static", @@ -6459,7 +6446,7 @@ dependencies = [ [[package]] name = "sc-network" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" +source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" dependencies = [ "bitflags", "bs58", @@ -6511,7 +6498,7 @@ dependencies = [ [[package]] name = "sc-network-gossip" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" +source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6526,7 +6513,7 @@ dependencies = [ [[package]] name = "sc-network-test" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" +source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" dependencies = [ "env_logger", "futures 0.3.5", @@ -6553,7 +6540,7 @@ dependencies = [ [[package]] name = "sc-offchain" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" +source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" dependencies = [ "bytes 0.5.5", "fnv", @@ -6580,7 +6567,7 @@ dependencies = [ [[package]] name = "sc-peerset" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" +source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" dependencies = [ "futures 0.3.5", "libp2p", @@ -6593,7 +6580,7 @@ dependencies = [ [[package]] name = "sc-proposer-metrics" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" +source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" dependencies = [ "log 0.4.8", "substrate-prometheus-endpoint", @@ -6602,7 +6589,7 @@ dependencies = [ [[package]] name = "sc-rpc" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" +source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" dependencies = [ "futures 0.3.5", "hash-db", @@ -6634,7 +6621,7 @@ dependencies = [ [[package]] name = "sc-rpc-api" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" +source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -6658,7 +6645,7 @@ dependencies = [ [[package]] name = "sc-rpc-server" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" +source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" dependencies = [ "jsonrpc-core", "jsonrpc-http-server", @@ -6674,7 +6661,7 @@ dependencies = [ [[package]] name = "sc-service" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" +source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" dependencies = [ "derive_more 0.99.9", "directories", @@ -6736,7 +6723,7 @@ dependencies = [ [[package]] name = "sc-state-db" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" +source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" dependencies = [ "log 0.4.8", "parity-scale-codec", @@ -6750,7 +6737,7 @@ dependencies = [ [[package]] name = "sc-telemetry" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" +source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6771,7 +6758,7 @@ dependencies = [ [[package]] name = "sc-tracing" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" +source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" dependencies = [ "erased-serde", "log 0.4.8", @@ -6788,7 +6775,7 @@ dependencies = [ [[package]] name = "sc-transaction-graph" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" +source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -6808,7 +6795,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" +source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -6918,9 +6905,9 @@ dependencies = [ [[package]] name = "security-framework" -version = "0.4.4" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64808902d7d99f78eaddd2b4e2509713babc3dc3c85ad6f4c447680f3c01e535" +checksum = "ad502866817f0575705bd7be36e2b2535cc33262d493aa733a2ec862baa2bc2b" dependencies = [ "bitflags", "core-foundation", @@ -6931,9 +6918,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "0.4.3" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17bf11d99252f512695eb468de5516e5cf75455521e69dfe343f3b74e4748405" +checksum = "51ceb04988b17b6d1dcd555390fa822ca5637b4a14e1f5099f13d351bed4d6c7" dependencies = [ "core-foundation-sys", "libc", @@ -7234,7 +7221,7 @@ dependencies = [ [[package]] name = "sp-allocator" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" +source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" dependencies = [ "derive_more 0.99.9", "log 0.4.8", @@ -7246,7 +7233,7 @@ dependencies = [ [[package]] name = "sp-api" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" +source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" dependencies = [ "hash-db", "parity-scale-codec", @@ -7261,7 +7248,7 @@ dependencies = [ [[package]] name = "sp-api-proc-macro" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" +source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" dependencies = [ "blake2-rfc", "proc-macro-crate", @@ -7273,7 +7260,7 @@ dependencies = [ [[package]] name = "sp-application-crypto" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" +source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" dependencies = [ "parity-scale-codec", "serde", @@ -7285,7 +7272,7 @@ dependencies = [ [[package]] name = "sp-arithmetic" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" +source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" dependencies = [ "integer-sqrt", "num-traits 0.2.12", @@ -7298,7 +7285,7 @@ dependencies = [ [[package]] name = "sp-authority-discovery" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" +source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" dependencies = [ "parity-scale-codec", "sp-api", @@ -7310,7 +7297,7 @@ dependencies = [ [[package]] name = "sp-authorship" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" +source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" dependencies = [ "parity-scale-codec", "sp-inherents", @@ -7321,7 +7308,7 @@ dependencies = [ [[package]] name = "sp-block-builder" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" +source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" dependencies = [ "parity-scale-codec", "sp-api", @@ -7333,7 +7320,7 @@ dependencies = [ [[package]] name = "sp-blockchain" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" +source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" dependencies = [ "derive_more 0.99.9", "log 0.4.8", @@ -7350,7 +7337,7 @@ dependencies = [ [[package]] name = "sp-chain-spec" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" +source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" dependencies = [ "serde", "serde_json", @@ -7359,7 +7346,7 @@ dependencies = [ [[package]] name = "sp-consensus" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" +source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -7384,7 +7371,7 @@ dependencies = [ [[package]] name = "sp-consensus-aura" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" +source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" dependencies = [ "parity-scale-codec", "sp-api", @@ -7398,7 +7385,7 @@ dependencies = [ [[package]] name = "sp-consensus-babe" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" +source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" dependencies = [ "merlin", "parity-scale-codec", @@ -7417,7 +7404,7 @@ dependencies = [ [[package]] name = "sp-consensus-slots" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" +source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" dependencies = [ "parity-scale-codec", "sp-runtime", @@ -7426,7 +7413,7 @@ dependencies = [ [[package]] name = "sp-consensus-vrf" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" +source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" dependencies = [ "parity-scale-codec", "schnorrkel", @@ -7438,7 +7425,7 @@ dependencies = [ [[package]] name = "sp-core" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" +source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" dependencies = [ "base58", "blake2-rfc", @@ -7481,7 +7468,7 @@ dependencies = [ [[package]] name = "sp-database" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" +source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" dependencies = [ "kvdb", "parking_lot 0.10.2", @@ -7490,7 +7477,7 @@ dependencies = [ [[package]] name = "sp-debug-derive" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" +source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" dependencies = [ "proc-macro2 1.0.18", "quote 1.0.7", @@ -7500,7 +7487,7 @@ dependencies = [ [[package]] name = "sp-externalities" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" +source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" dependencies = [ "environmental", "parity-scale-codec", @@ -7511,7 +7498,7 @@ dependencies = [ [[package]] name = "sp-finality-grandpa" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" +source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" dependencies = [ "finality-grandpa", "log 0.4.8", @@ -7527,7 +7514,7 @@ dependencies = [ [[package]] name = "sp-finality-tracker" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" +source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" dependencies = [ "parity-scale-codec", "sp-inherents", @@ -7537,7 +7524,7 @@ dependencies = [ [[package]] name = "sp-inherents" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" +source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" dependencies = [ "derive_more 0.99.9", "parity-scale-codec", @@ -7549,7 +7536,7 @@ dependencies = [ [[package]] name = "sp-io" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" +source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" dependencies = [ "futures 0.3.5", "hash-db", @@ -7570,7 +7557,7 @@ dependencies = [ [[package]] name = "sp-keyring" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" +source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" dependencies = [ "lazy_static", "sp-core", @@ -7581,7 +7568,7 @@ dependencies = [ [[package]] name = "sp-npos-elections" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" +source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" dependencies = [ "parity-scale-codec", "serde", @@ -7593,7 +7580,7 @@ dependencies = [ [[package]] name = "sp-npos-elections-compact" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" +source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -7604,7 +7591,7 @@ dependencies = [ [[package]] name = "sp-offchain" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" +source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" dependencies = [ "sp-api", "sp-core", @@ -7614,7 +7601,7 @@ dependencies = [ [[package]] name = "sp-panic-handler" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" +source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" dependencies = [ "backtrace", "log 0.4.8", @@ -7623,7 +7610,7 @@ dependencies = [ [[package]] name = "sp-rpc" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" +source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" dependencies = [ "serde", "sp-core", @@ -7632,7 +7619,7 @@ dependencies = [ [[package]] name = "sp-runtime" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" +source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" dependencies = [ "either", "hash256-std-hasher", @@ -7654,7 +7641,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" +source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" dependencies = [ "parity-scale-codec", "primitive-types", @@ -7669,7 +7656,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" +source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" dependencies = [ "Inflector", "proc-macro-crate", @@ -7681,7 +7668,7 @@ dependencies = [ [[package]] name = "sp-serializer" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" +source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" dependencies = [ "serde", "serde_json", @@ -7690,7 +7677,7 @@ dependencies = [ [[package]] name = "sp-session" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" +source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" dependencies = [ "parity-scale-codec", "sp-api", @@ -7703,7 +7690,7 @@ dependencies = [ [[package]] name = "sp-staking" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" +source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" dependencies = [ "parity-scale-codec", "sp-runtime", @@ -7713,7 +7700,7 @@ dependencies = [ [[package]] name = "sp-state-machine" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" +source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" dependencies = [ "hash-db", "itertools 0.9.0", @@ -7734,12 +7721,12 @@ dependencies = [ [[package]] name = "sp-std" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" +source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" [[package]] name = "sp-storage" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" +source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" dependencies = [ "impl-serde 0.2.3", "ref-cast", @@ -7751,7 +7738,7 @@ dependencies = [ [[package]] name = "sp-timestamp" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" +source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -7765,7 +7752,7 @@ dependencies = [ [[package]] name = "sp-tracing" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" +source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" dependencies = [ "log 0.4.8", "rental", @@ -7775,7 +7762,7 @@ dependencies = [ [[package]] name = "sp-transaction-pool" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" +source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -7791,7 +7778,7 @@ dependencies = [ [[package]] name = "sp-trie" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" +source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" dependencies = [ "hash-db", "memory-db", @@ -7805,7 +7792,7 @@ dependencies = [ [[package]] name = "sp-utils" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" +source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" dependencies = [ "futures 0.3.5", "futures-core", @@ -7817,7 +7804,7 @@ dependencies = [ [[package]] name = "sp-version" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" +source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" dependencies = [ "impl-serde 0.2.3", "parity-scale-codec", @@ -7829,7 +7816,7 @@ dependencies = [ [[package]] name = "sp-wasm-interface" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" +source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -7969,7 +7956,7 @@ dependencies = [ [[package]] name = "substrate-browser-utils" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" +source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" dependencies = [ "chrono", "clear_on_drop", @@ -7996,7 +7983,7 @@ dependencies = [ [[package]] name = "substrate-build-script-utils" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" +source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" dependencies = [ "platforms", ] @@ -8004,7 +7991,7 @@ dependencies = [ [[package]] name = "substrate-frame-rpc-system" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" +source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" dependencies = [ "frame-system-rpc-runtime-api", "futures 0.3.5", @@ -8027,7 +8014,7 @@ dependencies = [ [[package]] name = "substrate-prometheus-endpoint" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" +source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" dependencies = [ "async-std", "derive_more 0.99.9", @@ -8041,7 +8028,7 @@ dependencies = [ [[package]] name = "substrate-test-client" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" +source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" dependencies = [ "futures 0.1.29", "futures 0.3.5", @@ -8067,7 +8054,7 @@ dependencies = [ [[package]] name = "substrate-test-runtime" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" +source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" dependencies = [ "cfg-if", "frame-executive", @@ -8107,7 +8094,7 @@ dependencies = [ [[package]] name = "substrate-test-runtime-client" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" +source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" dependencies = [ "futures 0.3.5", "parity-scale-codec", @@ -8128,7 +8115,7 @@ dependencies = [ [[package]] name = "substrate-wasm-builder-runner" version = "1.0.6" -source = "git+https://github.com/paritytech/substrate#7e7c576050afabbf1980c754ad8de19258c667e7" +source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" [[package]] name = "substrate-wasm-builder-runner" @@ -8687,12 +8674,12 @@ dependencies = [ [[package]] name = "tokio-rustls" -version = "0.13.1" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15cb62a0d2770787abc96e99c1cd98fcf17f94959f3af63ca85bdfb203f051b4" +checksum = "228139ddd4fea3fa345a29233009635235833e52807af7ea6448ead03890d6a9" dependencies = [ "futures-core", - "rustls 0.17.0", + "rustls", "tokio 0.2.21", "webpki", ] diff --git a/runtime/common/src/crowdfund.rs b/runtime/common/src/crowdfund.rs index fc233d107a..3b02b5a646 100644 --- a/runtime/common/src/crowdfund.rs +++ b/runtime/common/src/crowdfund.rs @@ -663,6 +663,7 @@ mod tests { type ProposalBondMinimum = ProposalBondMinimum; type SpendPeriod = SpendPeriod; type Burn = Burn; + type BurnDestination = (); type Tippers = Nobody; type TipCountdown = TipCountdown; type TipFindersFee = TipFindersFee; diff --git a/runtime/kusama/src/lib.rs b/runtime/kusama/src/lib.rs index cba2ad10c0..81c50e0ed4 100644 --- a/runtime/kusama/src/lib.rs +++ b/runtime/kusama/src/lib.rs @@ -479,7 +479,7 @@ parameter_types! { pub const ProposalBond: Permill = Permill::from_percent(5); pub const ProposalBondMinimum: Balance = 20 * DOLLARS; pub const SpendPeriod: BlockNumber = 6 * DAYS; - pub const Burn: Permill = Permill::from_percent(0); + pub const Burn: Permill = Permill::from_perthousand(2); pub const TreasuryModuleId: ModuleId = ModuleId(*b"py/trsry"); pub const TipCountdown: BlockNumber = 1 * DAYS; @@ -509,6 +509,7 @@ impl treasury::Trait for Runtime { type ProposalBondMinimum = ProposalBondMinimum; type SpendPeriod = SpendPeriod; type Burn = Burn; + type BurnDestination = Society; type ModuleId = TreasuryModuleId; type WeightInfo = (); } diff --git a/runtime/polkadot/src/lib.rs b/runtime/polkadot/src/lib.rs index 68cbf0a97b..180e0b349c 100644 --- a/runtime/polkadot/src/lib.rs +++ b/runtime/polkadot/src/lib.rs @@ -576,6 +576,7 @@ impl treasury::Trait for Runtime { type ProposalBondMinimum = ProposalBondMinimum; type SpendPeriod = SpendPeriod; type Burn = Burn; + type BurnDestination = (); type WeightInfo = (); } -- GitLab From 37793976f50e3a404366551bd63c230187bcb086 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Silva?= <123550+andresilva@users.noreply.github.com> Date: Fri, 17 Jul 2020 12:01:02 +0100 Subject: [PATCH 073/192] runtime: update grandpa equivocation reporting api (#1407) * runtime: update grandpa equivocation reporting api * Bump Co-authored-by: Gav Wood --- Cargo.lock | 284 ++++++++++++++++---------------- runtime/kusama/src/lib.rs | 15 +- runtime/polkadot/src/lib.rs | 15 +- runtime/test-runtime/src/lib.rs | 2 +- runtime/westend/src/lib.rs | 15 +- 5 files changed, 159 insertions(+), 172 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 81306de744..90f469bac6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1314,7 +1314,7 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "fork-tree" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" +source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" dependencies = [ "parity-scale-codec", ] @@ -1322,7 +1322,7 @@ dependencies = [ [[package]] name = "frame-benchmarking" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" +source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" dependencies = [ "frame-support", "frame-system", @@ -1339,7 +1339,7 @@ dependencies = [ [[package]] name = "frame-benchmarking-cli" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" +source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" dependencies = [ "Inflector", "frame-benchmarking", @@ -1358,7 +1358,7 @@ dependencies = [ [[package]] name = "frame-executive" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" +source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" dependencies = [ "frame-support", "frame-system", @@ -1373,7 +1373,7 @@ dependencies = [ [[package]] name = "frame-metadata" version = "11.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" +source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" dependencies = [ "parity-scale-codec", "serde", @@ -1384,7 +1384,7 @@ dependencies = [ [[package]] name = "frame-support" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" +source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" dependencies = [ "bitmask", "frame-metadata", @@ -1409,7 +1409,7 @@ dependencies = [ [[package]] name = "frame-support-procedural" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" +source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" dependencies = [ "frame-support-procedural-tools", "proc-macro2 1.0.18", @@ -1420,7 +1420,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" +source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" dependencies = [ "frame-support-procedural-tools-derive", "proc-macro-crate", @@ -1432,7 +1432,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools-derive" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" +source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" dependencies = [ "proc-macro2 1.0.18", "quote 1.0.7", @@ -1442,7 +1442,7 @@ dependencies = [ [[package]] name = "frame-system" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" +source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" dependencies = [ "frame-support", "impl-trait-for-tuples", @@ -1458,7 +1458,7 @@ dependencies = [ [[package]] name = "frame-system-benchmarking" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" +source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" dependencies = [ "frame-benchmarking", "frame-support", @@ -1472,7 +1472,7 @@ dependencies = [ [[package]] name = "frame-system-rpc-runtime-api" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" +source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" dependencies = [ "parity-scale-codec", "sp-api", @@ -3466,7 +3466,7 @@ dependencies = [ [[package]] name = "pallet-authority-discovery" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" +source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" dependencies = [ "frame-support", "frame-system", @@ -3482,7 +3482,7 @@ dependencies = [ [[package]] name = "pallet-authorship" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" +source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" dependencies = [ "frame-support", "frame-system", @@ -3497,7 +3497,7 @@ dependencies = [ [[package]] name = "pallet-babe" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" +source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" dependencies = [ "frame-benchmarking", "frame-support", @@ -3522,7 +3522,7 @@ dependencies = [ [[package]] name = "pallet-balances" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" +source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" dependencies = [ "frame-benchmarking", "frame-support", @@ -3536,7 +3536,7 @@ dependencies = [ [[package]] name = "pallet-collective" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" +source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" dependencies = [ "frame-benchmarking", "frame-support", @@ -3552,7 +3552,7 @@ dependencies = [ [[package]] name = "pallet-democracy" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" +source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" dependencies = [ "frame-benchmarking", "frame-support", @@ -3567,7 +3567,7 @@ dependencies = [ [[package]] name = "pallet-elections-phragmen" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" +source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" dependencies = [ "frame-benchmarking", "frame-support", @@ -3582,7 +3582,7 @@ dependencies = [ [[package]] name = "pallet-finality-tracker" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" +source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" dependencies = [ "frame-support", "frame-system", @@ -3598,10 +3598,12 @@ dependencies = [ [[package]] name = "pallet-grandpa" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" +source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" dependencies = [ + "frame-benchmarking", "frame-support", "frame-system", + "pallet-authorship", "pallet-finality-tracker", "pallet-session", "parity-scale-codec", @@ -3618,7 +3620,7 @@ dependencies = [ [[package]] name = "pallet-identity" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" +source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" dependencies = [ "enumflags2", "frame-benchmarking", @@ -3634,7 +3636,7 @@ dependencies = [ [[package]] name = "pallet-im-online" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" +source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" dependencies = [ "frame-benchmarking", "frame-support", @@ -3654,7 +3656,7 @@ dependencies = [ [[package]] name = "pallet-indices" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" +source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" dependencies = [ "frame-support", "frame-system", @@ -3670,7 +3672,7 @@ dependencies = [ [[package]] name = "pallet-membership" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" +source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" dependencies = [ "frame-support", "frame-system", @@ -3684,7 +3686,7 @@ dependencies = [ [[package]] name = "pallet-multisig" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" +source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" dependencies = [ "frame-support", "frame-system", @@ -3699,7 +3701,7 @@ dependencies = [ [[package]] name = "pallet-nicks" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" +source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" dependencies = [ "frame-support", "frame-system", @@ -3713,7 +3715,7 @@ dependencies = [ [[package]] name = "pallet-offences" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" +source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" dependencies = [ "frame-support", "frame-system", @@ -3728,7 +3730,7 @@ dependencies = [ [[package]] name = "pallet-offences-benchmarking" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" +source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" dependencies = [ "frame-benchmarking", "frame-support", @@ -3749,7 +3751,7 @@ dependencies = [ [[package]] name = "pallet-proxy" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" +source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" dependencies = [ "frame-support", "frame-system", @@ -3764,7 +3766,7 @@ dependencies = [ [[package]] name = "pallet-randomness-collective-flip" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" +source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" dependencies = [ "frame-support", "frame-system", @@ -3777,7 +3779,7 @@ dependencies = [ [[package]] name = "pallet-recovery" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" +source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" dependencies = [ "enumflags2", "frame-support", @@ -3792,7 +3794,7 @@ dependencies = [ [[package]] name = "pallet-scheduler" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" +source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" dependencies = [ "frame-benchmarking", "frame-support", @@ -3807,7 +3809,7 @@ dependencies = [ [[package]] name = "pallet-session" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" +source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" dependencies = [ "frame-support", "frame-system", @@ -3827,7 +3829,7 @@ dependencies = [ [[package]] name = "pallet-session-benchmarking" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" +source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" dependencies = [ "frame-benchmarking", "frame-support", @@ -3843,7 +3845,7 @@ dependencies = [ [[package]] name = "pallet-society" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" +source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" dependencies = [ "frame-support", "frame-system", @@ -3857,7 +3859,7 @@ dependencies = [ [[package]] name = "pallet-staking" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" +source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" dependencies = [ "frame-benchmarking", "frame-support", @@ -3879,7 +3881,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-curve" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" +source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -3890,7 +3892,7 @@ dependencies = [ [[package]] name = "pallet-sudo" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" +source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" dependencies = [ "frame-support", "frame-system", @@ -3904,7 +3906,7 @@ dependencies = [ [[package]] name = "pallet-timestamp" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" +source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" dependencies = [ "frame-benchmarking", "frame-support", @@ -3922,7 +3924,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" +source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" dependencies = [ "frame-support", "frame-system", @@ -3937,7 +3939,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" +source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" dependencies = [ "jsonrpc-core", "jsonrpc-core-client", @@ -3955,7 +3957,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc-runtime-api" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" +source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" dependencies = [ "frame-support", "parity-scale-codec", @@ -3968,7 +3970,7 @@ dependencies = [ [[package]] name = "pallet-treasury" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" +source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" dependencies = [ "frame-benchmarking", "frame-support", @@ -3983,7 +3985,7 @@ dependencies = [ [[package]] name = "pallet-utility" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" +source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" dependencies = [ "frame-benchmarking", "frame-support", @@ -3999,7 +4001,7 @@ dependencies = [ [[package]] name = "pallet-vesting" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" +source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" dependencies = [ "enumflags2", "frame-benchmarking", @@ -5789,6 +5791,12 @@ dependencies = [ "syn 1.0.33", ] +[[package]] +name = "retain_mut" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e005d658ad26eacc2b6c506dfde519f4e277e328d0eb3379ca61647d70a8f531" + [[package]] name = "ring" version = "0.16.15" @@ -5929,7 +5937,7 @@ dependencies = [ [[package]] name = "sc-authority-discovery" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" +source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" dependencies = [ "bytes 0.5.5", "derive_more 0.99.9", @@ -5956,7 +5964,7 @@ dependencies = [ [[package]] name = "sc-basic-authorship" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" +source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -5980,7 +5988,7 @@ dependencies = [ [[package]] name = "sc-block-builder" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" +source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" dependencies = [ "parity-scale-codec", "sc-client-api", @@ -5997,7 +6005,7 @@ dependencies = [ [[package]] name = "sc-chain-spec" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" +source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" dependencies = [ "impl-trait-for-tuples", "sc-chain-spec-derive", @@ -6013,7 +6021,7 @@ dependencies = [ [[package]] name = "sc-chain-spec-derive" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" +source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -6024,7 +6032,7 @@ dependencies = [ [[package]] name = "sc-cli" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" +source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" dependencies = [ "ansi_term 0.12.1", "atty", @@ -6065,7 +6073,7 @@ dependencies = [ [[package]] name = "sc-client-api" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" +source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" dependencies = [ "derive_more 0.99.9", "fnv", @@ -6101,7 +6109,7 @@ dependencies = [ [[package]] name = "sc-client-db" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" +source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" dependencies = [ "blake2-rfc", "hash-db", @@ -6130,7 +6138,7 @@ dependencies = [ [[package]] name = "sc-consensus" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" +source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" dependencies = [ "sc-client-api", "sp-blockchain", @@ -6141,7 +6149,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" +source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" dependencies = [ "derive_more 0.99.9", "fork-tree", @@ -6183,7 +6191,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe-rpc" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" +source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -6207,7 +6215,7 @@ dependencies = [ [[package]] name = "sc-consensus-epochs" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" +source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" dependencies = [ "fork-tree", "parity-scale-codec", @@ -6220,7 +6228,7 @@ dependencies = [ [[package]] name = "sc-consensus-slots" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" +source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6243,7 +6251,7 @@ dependencies = [ [[package]] name = "sc-consensus-uncles" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" +source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" dependencies = [ "log 0.4.8", "sc-client-api", @@ -6257,7 +6265,7 @@ dependencies = [ [[package]] name = "sc-executor" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" +source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" dependencies = [ "derive_more 0.99.9", "lazy_static", @@ -6285,7 +6293,7 @@ dependencies = [ [[package]] name = "sc-executor-common" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" +source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" dependencies = [ "derive_more 0.99.9", "log 0.4.8", @@ -6302,7 +6310,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmi" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" +source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" dependencies = [ "log 0.4.8", "parity-scale-codec", @@ -6317,7 +6325,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmtime" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" +source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" dependencies = [ "cranelift-codegen", "cranelift-wasm", @@ -6338,7 +6346,7 @@ dependencies = [ [[package]] name = "sc-finality-grandpa" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" +source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" dependencies = [ "assert_matches", "derive_more 0.99.9", @@ -6376,7 +6384,7 @@ dependencies = [ [[package]] name = "sc-finality-grandpa-rpc" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" +source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" dependencies = [ "derive_more 0.99.9", "finality-grandpa", @@ -6393,7 +6401,7 @@ dependencies = [ [[package]] name = "sc-informant" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" +source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" dependencies = [ "ansi_term 0.12.1", "futures 0.3.5", @@ -6411,7 +6419,7 @@ dependencies = [ [[package]] name = "sc-keystore" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" +source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" dependencies = [ "derive_more 0.99.9", "hex", @@ -6427,7 +6435,7 @@ dependencies = [ [[package]] name = "sc-light" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" +source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" dependencies = [ "hash-db", "lazy_static", @@ -6446,7 +6454,7 @@ dependencies = [ [[package]] name = "sc-network" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" +source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" dependencies = [ "bitflags", "bs58", @@ -6498,7 +6506,7 @@ dependencies = [ [[package]] name = "sc-network-gossip" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" +source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6513,7 +6521,7 @@ dependencies = [ [[package]] name = "sc-network-test" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" +source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" dependencies = [ "env_logger", "futures 0.3.5", @@ -6540,7 +6548,7 @@ dependencies = [ [[package]] name = "sc-offchain" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" +source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" dependencies = [ "bytes 0.5.5", "fnv", @@ -6567,7 +6575,7 @@ dependencies = [ [[package]] name = "sc-peerset" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" +source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" dependencies = [ "futures 0.3.5", "libp2p", @@ -6580,7 +6588,7 @@ dependencies = [ [[package]] name = "sc-proposer-metrics" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" +source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" dependencies = [ "log 0.4.8", "substrate-prometheus-endpoint", @@ -6589,7 +6597,7 @@ dependencies = [ [[package]] name = "sc-rpc" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" +source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" dependencies = [ "futures 0.3.5", "hash-db", @@ -6621,7 +6629,7 @@ dependencies = [ [[package]] name = "sc-rpc-api" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" +source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -6645,7 +6653,7 @@ dependencies = [ [[package]] name = "sc-rpc-server" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" +source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" dependencies = [ "jsonrpc-core", "jsonrpc-http-server", @@ -6661,7 +6669,7 @@ dependencies = [ [[package]] name = "sc-service" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" +source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" dependencies = [ "derive_more 0.99.9", "directories", @@ -6723,7 +6731,7 @@ dependencies = [ [[package]] name = "sc-state-db" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" +source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" dependencies = [ "log 0.4.8", "parity-scale-codec", @@ -6737,7 +6745,7 @@ dependencies = [ [[package]] name = "sc-telemetry" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" +source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6758,7 +6766,7 @@ dependencies = [ [[package]] name = "sc-tracing" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" +source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" dependencies = [ "erased-serde", "log 0.4.8", @@ -6775,7 +6783,7 @@ dependencies = [ [[package]] name = "sc-transaction-graph" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" +source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -6783,6 +6791,7 @@ dependencies = [ "log 0.4.8", "parity-util-mem", "parking_lot 0.10.2", + "retain_mut", "serde", "sp-blockchain", "sp-core", @@ -6795,7 +6804,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" +source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -7221,7 +7230,7 @@ dependencies = [ [[package]] name = "sp-allocator" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" +source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" dependencies = [ "derive_more 0.99.9", "log 0.4.8", @@ -7233,7 +7242,7 @@ dependencies = [ [[package]] name = "sp-api" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" +source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" dependencies = [ "hash-db", "parity-scale-codec", @@ -7248,7 +7257,7 @@ dependencies = [ [[package]] name = "sp-api-proc-macro" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" +source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" dependencies = [ "blake2-rfc", "proc-macro-crate", @@ -7260,7 +7269,7 @@ dependencies = [ [[package]] name = "sp-application-crypto" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" +source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" dependencies = [ "parity-scale-codec", "serde", @@ -7272,7 +7281,7 @@ dependencies = [ [[package]] name = "sp-arithmetic" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" +source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" dependencies = [ "integer-sqrt", "num-traits 0.2.12", @@ -7285,7 +7294,7 @@ dependencies = [ [[package]] name = "sp-authority-discovery" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" +source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" dependencies = [ "parity-scale-codec", "sp-api", @@ -7297,7 +7306,7 @@ dependencies = [ [[package]] name = "sp-authorship" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" +source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" dependencies = [ "parity-scale-codec", "sp-inherents", @@ -7308,7 +7317,7 @@ dependencies = [ [[package]] name = "sp-block-builder" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" +source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" dependencies = [ "parity-scale-codec", "sp-api", @@ -7320,7 +7329,7 @@ dependencies = [ [[package]] name = "sp-blockchain" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" +source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" dependencies = [ "derive_more 0.99.9", "log 0.4.8", @@ -7337,7 +7346,7 @@ dependencies = [ [[package]] name = "sp-chain-spec" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" +source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" dependencies = [ "serde", "serde_json", @@ -7346,7 +7355,7 @@ dependencies = [ [[package]] name = "sp-consensus" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" +source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -7371,7 +7380,7 @@ dependencies = [ [[package]] name = "sp-consensus-aura" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" +source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" dependencies = [ "parity-scale-codec", "sp-api", @@ -7385,7 +7394,7 @@ dependencies = [ [[package]] name = "sp-consensus-babe" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" +source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" dependencies = [ "merlin", "parity-scale-codec", @@ -7404,7 +7413,7 @@ dependencies = [ [[package]] name = "sp-consensus-slots" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" +source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" dependencies = [ "parity-scale-codec", "sp-runtime", @@ -7413,7 +7422,7 @@ dependencies = [ [[package]] name = "sp-consensus-vrf" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" +source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" dependencies = [ "parity-scale-codec", "schnorrkel", @@ -7425,7 +7434,7 @@ dependencies = [ [[package]] name = "sp-core" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" +source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" dependencies = [ "base58", "blake2-rfc", @@ -7468,7 +7477,7 @@ dependencies = [ [[package]] name = "sp-database" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" +source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" dependencies = [ "kvdb", "parking_lot 0.10.2", @@ -7477,7 +7486,7 @@ dependencies = [ [[package]] name = "sp-debug-derive" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" +source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" dependencies = [ "proc-macro2 1.0.18", "quote 1.0.7", @@ -7487,7 +7496,7 @@ dependencies = [ [[package]] name = "sp-externalities" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" +source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" dependencies = [ "environmental", "parity-scale-codec", @@ -7498,7 +7507,7 @@ dependencies = [ [[package]] name = "sp-finality-grandpa" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" +source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" dependencies = [ "finality-grandpa", "log 0.4.8", @@ -7514,7 +7523,7 @@ dependencies = [ [[package]] name = "sp-finality-tracker" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" +source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" dependencies = [ "parity-scale-codec", "sp-inherents", @@ -7524,7 +7533,7 @@ dependencies = [ [[package]] name = "sp-inherents" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" +source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" dependencies = [ "derive_more 0.99.9", "parity-scale-codec", @@ -7536,7 +7545,7 @@ dependencies = [ [[package]] name = "sp-io" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" +source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" dependencies = [ "futures 0.3.5", "hash-db", @@ -7557,7 +7566,7 @@ dependencies = [ [[package]] name = "sp-keyring" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" +source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" dependencies = [ "lazy_static", "sp-core", @@ -7568,7 +7577,7 @@ dependencies = [ [[package]] name = "sp-npos-elections" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" +source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" dependencies = [ "parity-scale-codec", "serde", @@ -7580,7 +7589,7 @@ dependencies = [ [[package]] name = "sp-npos-elections-compact" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" +source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -7591,7 +7600,7 @@ dependencies = [ [[package]] name = "sp-offchain" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" +source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" dependencies = [ "sp-api", "sp-core", @@ -7601,7 +7610,7 @@ dependencies = [ [[package]] name = "sp-panic-handler" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" +source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" dependencies = [ "backtrace", "log 0.4.8", @@ -7610,7 +7619,7 @@ dependencies = [ [[package]] name = "sp-rpc" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" +source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" dependencies = [ "serde", "sp-core", @@ -7619,7 +7628,7 @@ dependencies = [ [[package]] name = "sp-runtime" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" +source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" dependencies = [ "either", "hash256-std-hasher", @@ -7641,7 +7650,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" +source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" dependencies = [ "parity-scale-codec", "primitive-types", @@ -7656,7 +7665,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" +source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" dependencies = [ "Inflector", "proc-macro-crate", @@ -7668,7 +7677,7 @@ dependencies = [ [[package]] name = "sp-serializer" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" +source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" dependencies = [ "serde", "serde_json", @@ -7677,7 +7686,7 @@ dependencies = [ [[package]] name = "sp-session" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" +source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" dependencies = [ "parity-scale-codec", "sp-api", @@ -7690,7 +7699,7 @@ dependencies = [ [[package]] name = "sp-staking" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" +source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" dependencies = [ "parity-scale-codec", "sp-runtime", @@ -7700,7 +7709,7 @@ dependencies = [ [[package]] name = "sp-state-machine" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" +source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" dependencies = [ "hash-db", "itertools 0.9.0", @@ -7721,12 +7730,12 @@ dependencies = [ [[package]] name = "sp-std" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" +source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" [[package]] name = "sp-storage" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" +source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" dependencies = [ "impl-serde 0.2.3", "ref-cast", @@ -7738,7 +7747,7 @@ dependencies = [ [[package]] name = "sp-timestamp" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" +source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -7752,7 +7761,7 @@ dependencies = [ [[package]] name = "sp-tracing" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" +source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" dependencies = [ "log 0.4.8", "rental", @@ -7762,7 +7771,7 @@ dependencies = [ [[package]] name = "sp-transaction-pool" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" +source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -7772,13 +7781,12 @@ dependencies = [ "sp-api", "sp-blockchain", "sp-runtime", - "sp-utils", ] [[package]] name = "sp-trie" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" +source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" dependencies = [ "hash-db", "memory-db", @@ -7792,7 +7800,7 @@ dependencies = [ [[package]] name = "sp-utils" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" +source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" dependencies = [ "futures 0.3.5", "futures-core", @@ -7804,7 +7812,7 @@ dependencies = [ [[package]] name = "sp-version" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" +source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" dependencies = [ "impl-serde 0.2.3", "parity-scale-codec", @@ -7816,7 +7824,7 @@ dependencies = [ [[package]] name = "sp-wasm-interface" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" +source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -7956,7 +7964,7 @@ dependencies = [ [[package]] name = "substrate-browser-utils" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" +source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" dependencies = [ "chrono", "clear_on_drop", @@ -7983,7 +7991,7 @@ dependencies = [ [[package]] name = "substrate-build-script-utils" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" +source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" dependencies = [ "platforms", ] @@ -7991,7 +7999,7 @@ dependencies = [ [[package]] name = "substrate-frame-rpc-system" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" +source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" dependencies = [ "frame-system-rpc-runtime-api", "futures 0.3.5", @@ -8014,7 +8022,7 @@ dependencies = [ [[package]] name = "substrate-prometheus-endpoint" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" +source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" dependencies = [ "async-std", "derive_more 0.99.9", @@ -8028,7 +8036,7 @@ dependencies = [ [[package]] name = "substrate-test-client" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" +source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" dependencies = [ "futures 0.1.29", "futures 0.3.5", @@ -8054,7 +8062,7 @@ dependencies = [ [[package]] name = "substrate-test-runtime" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" +source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" dependencies = [ "cfg-if", "frame-executive", @@ -8094,7 +8102,7 @@ dependencies = [ [[package]] name = "substrate-test-runtime-client" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" +source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" dependencies = [ "futures 0.3.5", "parity-scale-codec", @@ -8115,7 +8123,7 @@ dependencies = [ [[package]] name = "substrate-wasm-builder-runner" version = "1.0.6" -source = "git+https://github.com/paritytech/substrate#1be02953d4eb521ac1d40e55c71b44e2031ac105" +source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" [[package]] name = "substrate-wasm-builder-runner" diff --git a/runtime/kusama/src/lib.rs b/runtime/kusama/src/lib.rs index 81c50e0ed4..c59c1e0f25 100644 --- a/runtime/kusama/src/lib.rs +++ b/runtime/kusama/src/lib.rs @@ -560,12 +560,7 @@ impl grandpa::Trait for Runtime { GrandpaId, )>>::IdentificationTuple; - type HandleEquivocation = grandpa::EquivocationHandler< - Self::KeyOwnerIdentification, - primitives::v0::fisherman::FishermanAppCrypto, - Runtime, - Offences, - >; + type HandleEquivocation = grandpa::EquivocationHandler; } parameter_types! { @@ -653,7 +648,6 @@ impl system::offchain::CreateSignedTransaction for Runtime transaction_payment::ChargeTransactionPayment::::from(tip), registrar::LimitParathreadCommits::::new(), parachains::ValidateDoubleVoteReports::::new(), - grandpa::ValidateEquivocationReport::::new(), ); let raw_payload = SignedPayload::new(call, extra).map_err(|e| { debug::warn!("Unable to create signed payload: {:?}", e); @@ -963,7 +957,7 @@ construct_runtime! { Historical: session_historical::{Module}, Session: session::{Module, Call, Storage, Event, Config}, FinalityTracker: finality_tracker::{Module, Call, Storage, Inherent}, - Grandpa: grandpa::{Module, Call, Storage, Config, Event}, + Grandpa: grandpa::{Module, Call, Storage, Config, Event, ValidateUnsigned}, ImOnline: im_online::{Module, Call, Storage, Event, ValidateUnsigned, Config}, AuthorityDiscovery: authority_discovery::{Module, Call, Config}, @@ -1032,7 +1026,6 @@ pub type SignedExtra = ( transaction_payment::ChargeTransactionPayment, registrar::LimitParathreadCommits, parachains::ValidateDoubleVoteReports, - grandpa::ValidateEquivocationReport, ); /// Unchecked extrinsic type as expected by this runtime. pub type UncheckedExtrinsic = generic::UncheckedExtrinsic; @@ -1159,7 +1152,7 @@ sp_api::impl_runtime_apis! { Grandpa::grandpa_authorities() } - fn submit_report_equivocation_extrinsic( + fn submit_report_equivocation_unsigned_extrinsic( equivocation_proof: fg_primitives::EquivocationProof< ::Hash, sp_runtime::traits::NumberFor, @@ -1168,7 +1161,7 @@ sp_api::impl_runtime_apis! { ) -> Option<()> { let key_owner_proof = key_owner_proof.decode()?; - Grandpa::submit_report_equivocation_extrinsic( + Grandpa::submit_unsigned_equivocation_report( equivocation_proof, key_owner_proof, ) diff --git a/runtime/polkadot/src/lib.rs b/runtime/polkadot/src/lib.rs index 180e0b349c..177bf7e26e 100644 --- a/runtime/polkadot/src/lib.rs +++ b/runtime/polkadot/src/lib.rs @@ -626,12 +626,7 @@ impl grandpa::Trait for Runtime { type KeyOwnerProofSystem = Historical; - type HandleEquivocation = grandpa::EquivocationHandler< - Self::KeyOwnerIdentification, - primitives::v0::fisherman::FishermanAppCrypto, - Runtime, - Offences, - >; + type HandleEquivocation = grandpa::EquivocationHandler; } parameter_types! { @@ -720,7 +715,6 @@ impl system::offchain::CreateSignedTransaction for Runtime transaction_payment::ChargeTransactionPayment::::from(tip), registrar::LimitParathreadCommits::::new(), parachains::ValidateDoubleVoteReports::::new(), - grandpa::ValidateEquivocationReport::::new(), claims::PrevalidateAttests::::new(), ); let raw_payload = SignedPayload::new(call, extra).map_err(|e| { @@ -976,7 +970,7 @@ construct_runtime! { Historical: session_historical::{Module}, Session: session::{Module, Call, Storage, Event, Config}, FinalityTracker: finality_tracker::{Module, Call, Storage, Inherent}, - Grandpa: grandpa::{Module, Call, Storage, Config, Event}, + Grandpa: grandpa::{Module, Call, Storage, Config, Event, ValidateUnsigned}, ImOnline: im_online::{Module, Call, Storage, Event, ValidateUnsigned, Config}, AuthorityDiscovery: authority_discovery::{Module, Call, Config}, @@ -1042,7 +1036,6 @@ pub type SignedExtra = ( transaction_payment::ChargeTransactionPayment, registrar::LimitParathreadCommits, parachains::ValidateDoubleVoteReports, - grandpa::ValidateEquivocationReport, claims::PrevalidateAttests, ); /// Unchecked extrinsic type as expected by this runtime. @@ -1170,7 +1163,7 @@ sp_api::impl_runtime_apis! { Grandpa::grandpa_authorities() } - fn submit_report_equivocation_extrinsic( + fn submit_report_equivocation_unsigned_extrinsic( equivocation_proof: fg_primitives::EquivocationProof< ::Hash, sp_runtime::traits::NumberFor, @@ -1179,7 +1172,7 @@ sp_api::impl_runtime_apis! { ) -> Option<()> { let key_owner_proof = key_owner_proof.decode()?; - Grandpa::submit_report_equivocation_extrinsic( + Grandpa::submit_unsigned_equivocation_report( equivocation_proof, key_owner_proof, ) diff --git a/runtime/test-runtime/src/lib.rs b/runtime/test-runtime/src/lib.rs index 45d5a04c31..032efaacfb 100644 --- a/runtime/test-runtime/src/lib.rs +++ b/runtime/test-runtime/src/lib.rs @@ -713,7 +713,7 @@ sp_api::impl_runtime_apis! { Grandpa::grandpa_authorities() } - fn submit_report_equivocation_extrinsic( + fn submit_report_equivocation_unsigned_extrinsic( _equivocation_proof: fg_primitives::EquivocationProof< ::Hash, sp_runtime::traits::NumberFor, diff --git a/runtime/westend/src/lib.rs b/runtime/westend/src/lib.rs index a0eaa03fd6..6f2c2aa68e 100644 --- a/runtime/westend/src/lib.rs +++ b/runtime/westend/src/lib.rs @@ -384,12 +384,7 @@ impl grandpa::Trait for Runtime { GrandpaId, )>>::IdentificationTuple; - type HandleEquivocation = grandpa::EquivocationHandler< - Self::KeyOwnerIdentification, - primitives::v0::fisherman::FishermanAppCrypto, - Runtime, - Offences, - >; + type HandleEquivocation = grandpa::EquivocationHandler; } parameter_types! { @@ -477,7 +472,6 @@ impl system::offchain::CreateSignedTransaction for Runtime transaction_payment::ChargeTransactionPayment::::from(tip), registrar::LimitParathreadCommits::::new(), parachains::ValidateDoubleVoteReports::::new(), - grandpa::ValidateEquivocationReport::::new(), ); let raw_payload = SignedPayload::new(call, extra).map_err(|e| { debug::warn!("Unable to create signed payload: {:?}", e); @@ -721,7 +715,7 @@ construct_runtime! { Historical: session_historical::{Module}, Session: session::{Module, Call, Storage, Event, Config}, FinalityTracker: finality_tracker::{Module, Call, Storage, Inherent}, - Grandpa: grandpa::{Module, Call, Storage, Config, Event}, + Grandpa: grandpa::{Module, Call, Storage, Config, Event, ValidateUnsigned}, ImOnline: im_online::{Module, Call, Storage, Event, ValidateUnsigned, Config}, AuthorityDiscovery: authority_discovery::{Module, Call, Config}, @@ -778,7 +772,6 @@ pub type SignedExtra = ( transaction_payment::ChargeTransactionPayment, registrar::LimitParathreadCommits, parachains::ValidateDoubleVoteReports, - grandpa::ValidateEquivocationReport, ); /// Unchecked extrinsic type as expected by this runtime. pub type UncheckedExtrinsic = generic::UncheckedExtrinsic; @@ -898,7 +891,7 @@ sp_api::impl_runtime_apis! { Grandpa::grandpa_authorities() } - fn submit_report_equivocation_extrinsic( + fn submit_report_equivocation_unsigned_extrinsic( equivocation_proof: fg_primitives::EquivocationProof< ::Hash, sp_runtime::traits::NumberFor, @@ -907,7 +900,7 @@ sp_api::impl_runtime_apis! { ) -> Option<()> { let key_owner_proof = key_owner_proof.decode()?; - Grandpa::submit_report_equivocation_extrinsic( + Grandpa::submit_unsigned_equivocation_report( equivocation_proof, key_owner_proof, ) -- GitLab From 5b27dd397e102a287446518e1526781352b24929 Mon Sep 17 00:00:00 2001 From: Shawn Tabrizi Date: Fri, 17 Jul 2020 14:23:56 +0200 Subject: [PATCH 074/192] Pallet for Purchase (#1369) * initial mock * remove statement * Merge branch 'master' into shawntabrizi-crowdsale * only work for dead accounts * Revert "Merge branch 'master' into shawntabrizi-crowdsale" This reverts commit 6f8fde1b898685def75dfa415c96172c927c95c3. * update storage name * Re-mock * Update comment * payouts * test signature verification * Update wording * fix tests * support both free and locked balance * Single statement set in configuration trait * Configurable purchase limit, initiated status * Account creation tests * make note about `max_amount` check * Update validity status tests * update balance tests * payment test * finish tests * enable in runtime * Test and verify ed25519 * make purchase pallet more configurable on the fly * Remove runtime check on purchase amount. * clean up trait * add basic weights * add extra super saftey check for vesting * Add vat tracking * remove unused const * Update to W3F Origins * remove stale comment * Support existing accounts w/o existing vesting schedule * Update runtime/common/src/purchase.rs Co-authored-by: Gavin Wood * Add support for partially unlocked portion of purchased DOTs * add trait import * Expose constants from pallet * Fixes * Fixes * Update runtime/polkadot/src/lib.rs Co-authored-by: Gavin Wood --- runtime/common/src/lib.rs | 1 + runtime/common/src/purchase.rs | 1014 ++++++++++++++++++++++++++++++++ runtime/polkadot/Cargo.toml | 5 +- runtime/polkadot/src/lib.rs | 52 +- 4 files changed, 1066 insertions(+), 6 deletions(-) create mode 100644 runtime/common/src/purchase.rs diff --git a/runtime/common/src/lib.rs b/runtime/common/src/lib.rs index d32db38e05..72a4ae3bfd 100644 --- a/runtime/common/src/lib.rs +++ b/runtime/common/src/lib.rs @@ -25,6 +25,7 @@ pub mod slot_range; pub mod registrar; pub mod slots; pub mod crowdfund; +pub mod purchase; pub mod impls; use primitives::v0::BlockNumber; diff --git a/runtime/common/src/purchase.rs b/runtime/common/src/purchase.rs new file mode 100644 index 0000000000..b1b61ebb43 --- /dev/null +++ b/runtime/common/src/purchase.rs @@ -0,0 +1,1014 @@ +// Copyright 2017-2020 Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// 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 . + +//! Module to process purchase of DOTs. + +use codec::{Encode, Decode}; +use sp_runtime::{Permill, RuntimeDebug, DispatchResult, DispatchError, AnySignature}; +use sp_runtime::traits::{Zero, CheckedAdd, Verify, Saturating}; +use frame_support::{decl_event, decl_storage, decl_module, decl_error, ensure}; +use frame_support::traits::{ + EnsureOrigin, Currency, ExistenceRequirement, VestingSchedule, Get +}; +use system::ensure_signed; +use sp_core::sr25519; +use sp_std::prelude::*; + +/// Configuration trait. +pub trait Trait: system::Trait { + /// The overarching event type. + type Event: From> + Into<::Event>; + /// Balances Pallet + type Currency: Currency; + /// Vesting Pallet + type VestingSchedule: VestingSchedule; + /// The origin allowed to set account status. + type ValidityOrigin: EnsureOrigin; + /// The origin allowed to make configurations to the pallet. + type ConfigurationOrigin: EnsureOrigin; + /// The maximum statement length for the statement users to sign when creating an account. + type MaxStatementLength: Get; + /// The amount of purchased locked DOTs that we will unlock for basic actions on the chain. + type UnlockedProportion: Get; + /// The maximum amount of locked DOTs that we will unlock. + type MaxUnlocked: Get>; +} + +type BalanceOf = <::Currency as Currency<::AccountId>>::Balance; + +/// The kind of a statement an account needs to make for a claim to be valid. +#[derive(Encode, Decode, Clone, Copy, Eq, PartialEq, RuntimeDebug)] +pub enum AccountValidity { + /// Account is not valid. + Invalid, + /// Account has initiated the account creation process. + Initiated, + /// Account is pending validation. + Pending, + /// Account is valid with a low contribution amount. + ValidLow, + /// Account is valid with a high contribution amount. + ValidHigh, + /// Account has completed the purchase process. + Completed, +} + +impl Default for AccountValidity { + fn default() -> Self { + AccountValidity::Invalid + } +} + +impl AccountValidity { + fn is_valid(&self) -> bool { + match self { + Self::Invalid => false, + Self::Initiated => false, + Self::Pending => false, + Self::ValidLow => true, + Self::ValidHigh => true, + Self::Completed => false, + } + } +} + +/// All information about an account regarding the purchase of DOTs. +#[derive(Encode, Decode, Default, Clone, Eq, PartialEq, RuntimeDebug)] +pub struct AccountStatus { + /// The current validity status of the user. Will denote if the user has passed KYC, + /// how much they are able to purchase, and when their purchase process has completed. + validity: AccountValidity, + /// The amount of free DOTs they have purchased. + free_balance: Balance, + /// The amount of locked DOTs they have purchased. + locked_balance: Balance, + /// Their sr25519/ed25519 signature verifying they have signed our required statement. + signature: Vec, + /// The percentage of VAT the purchaser is responsible for. This is already factored into account balance. + vat: Permill, +} + +decl_event!( + pub enum Event where + AccountId = ::AccountId, + Balance = BalanceOf, + BlockNumber = ::BlockNumber, + { + /// A new account was created + AccountCreated(AccountId), + /// Someone's account validity was updated + ValidityUpdated(AccountId, AccountValidity), + /// Someone's purchase balance was updated. (Free, Locked) + BalanceUpdated(AccountId, Balance, Balance), + /// A payout was made to a purchaser. + PaymentComplete(AccountId, Balance, Balance), + /// A new payment account was set. + PaymentAccountSet(AccountId), + /// A new statement was set. + StatementUpdated, + /// A new statement was set. + UnlockBlockUpdated(BlockNumber), + } +); + +decl_error! { + pub enum Error for Module { + /// Account is not currently valid to use. + InvalidAccount, + /// Account used in the purchase already exists. + ExistingAccount, + /// Provided signature is invalid + InvalidSignature, + /// Account has already completed the purchase process. + AlreadyCompleted, + /// An overflow occurred when doing calculations. + Overflow, + /// The statement is too long to be stored on chain. + InvalidStatement, + /// The unlock block is in the past! + InvalidUnlockBlock, + /// Vesting schedule already exists for this account. + VestingScheduleExists, + } +} + +decl_storage! { + trait Store for Module as Purchase { + // A map of all participants in the DOT purchase process. + Accounts: map hasher(blake2_128_concat) T::AccountId => AccountStatus>; + // The account that will be used to payout participants of the DOT purchase process. + PaymentAccount: T::AccountId; + // The statement purchasers will need to sign to participate. + Statement: Vec; + // The block where all locked dots will unlock. + UnlockBlock: T::BlockNumber; + } +} + +decl_module! { + pub struct Module for enum Call where origin: T::Origin, system = system { + type Error = Error; + + /// The maximum statement length for the statement users to sign when creating an account. + const MaxStatementLength: u32 = T::MaxStatementLength::get() as u32; + /// The amount of purchased locked DOTs that we will unlock for basic actions on the chain. + const UnlockedProportion: Permill = T::UnlockedProportion::get(); + /// The maximum amount of locked DOTs that we will unlock. + const MaxUnlocked: BalanceOf = T::MaxUnlocked::get(); + + /// Deposit one of this module's events by using the default implementation. + fn deposit_event() = default; + + /// Create a new account. Proof of existence through a valid signed message. + /// + /// We check that the account does not exist at this stage. + /// + /// Origin must match the `ValidityOrigin`. + #[weight = 200_000_000 + T::DbWeight::get().reads_writes(4, 1)] + fn create_account(origin, + who: T::AccountId, + signature: Vec + ) { + T::ValidityOrigin::ensure_origin(origin)?; + // Account is already being tracked by the pallet. + ensure!(!Accounts::::contains_key(&who), Error::::ExistingAccount); + // Account should not have a vesting schedule. + ensure!(T::VestingSchedule::vesting_balance(&who).is_none(), Error::::VestingScheduleExists); + + // Verify the signature provided is valid for the statement. + Self::verify_signature(&who, &signature)?; + + // Create a new pending account. + let status = AccountStatus { + validity: AccountValidity::Initiated, + signature, + free_balance: Zero::zero(), + locked_balance: Zero::zero(), + vat: Permill::zero(), + }; + Accounts::::insert(&who, status); + Self::deposit_event(RawEvent::AccountCreated(who)); + } + + /// Update the validity status of an existing account. If set to completed, the account + /// will no longer be able to continue through the crowdfund process. + /// + /// We check tht the account exists at this stage, but has not completed the process. + /// + /// Origin must match the `ValidityOrigin`. + #[weight = T::DbWeight::get().reads_writes(1, 1)] + fn update_validity_status(origin, + who: T::AccountId, + validity: AccountValidity + ) { + T::ValidityOrigin::ensure_origin(origin)?; + ensure!(Accounts::::contains_key(&who), Error::::InvalidAccount); + Accounts::::try_mutate(&who, |status: &mut AccountStatus>| -> DispatchResult { + ensure!(status.validity != AccountValidity::Completed, Error::::AlreadyCompleted); + status.validity = validity; + Ok(()) + })?; + Self::deposit_event(RawEvent::ValidityUpdated(who, validity)); + } + + /// Update the balance of a valid account. + /// + /// We check tht the account is valid for a balance transfer at this point. + /// + /// Origin must match the `ValidityOrigin`. + #[weight = T::DbWeight::get().reads_writes(2, 1)] + fn update_balance(origin, + who: T::AccountId, + free_balance: BalanceOf, + locked_balance: BalanceOf, + vat: Permill, + ) { + T::ValidityOrigin::ensure_origin(origin)?; + + Accounts::::try_mutate(&who, |status: &mut AccountStatus>| -> DispatchResult { + // Account has a valid status (not Invalid, Pending, or Completed)... + ensure!(status.validity.is_valid(), Error::::InvalidAccount); + + free_balance.checked_add(&locked_balance).ok_or(Error::::Overflow)?; + status.free_balance = free_balance; + status.locked_balance = locked_balance; + status.vat = vat; + Ok(()) + })?; + Self::deposit_event(RawEvent::BalanceUpdated(who, free_balance, locked_balance)); + } + + /// Pay the user and complete the purchase process. + /// + /// We reverify all assumptions about the state of an account, and complete the process. + /// + /// Origin must match the configured `PaymentAccount`. + #[weight = T::DbWeight::get().reads_writes(4, 2)] + fn payout(origin, who: T::AccountId) { + // Payments must be made directly by the `PaymentAccount`. + let payment_account = ensure_signed(origin)?; + ensure!(payment_account == PaymentAccount::::get(), DispatchError::BadOrigin); + + // Account should not have a vesting schedule. + ensure!(T::VestingSchedule::vesting_balance(&who).is_none(), Error::::VestingScheduleExists); + + Accounts::::try_mutate(&who, |status: &mut AccountStatus>| -> DispatchResult { + // Account has a valid status (not Invalid, Pending, or Completed)... + ensure!(status.validity.is_valid(), Error::::InvalidAccount); + + // Transfer funds from the payment account into the purchasing user. + let total_balance = status.free_balance + .checked_add(&status.locked_balance) + .ok_or(Error::::Overflow)?; + T::Currency::transfer(&payment_account, &who, total_balance, ExistenceRequirement::AllowDeath)?; + + if !status.locked_balance.is_zero() { + let unlock_block = UnlockBlock::::get(); + // We allow some configurable portion of the purchased locked DOTs to be unlocked for basic usage. + let unlocked = (T::UnlockedProportion::get() * status.locked_balance).min(T::MaxUnlocked::get()); + let locked = status.locked_balance.saturating_sub(unlocked); + // We checked that this account has no existing vesting schedule. So this function should + // never fail, however if it does, not much we can do about it at this point. + let _ = T::VestingSchedule::add_vesting_schedule( + // Apply vesting schedule to this user + &who, + // For this much amount + locked, + // Unlocking the full amount after one block + locked, + // When everything unlocks + unlock_block + ); + } + + // Setting the user account to `Completed` ends the purchase process for this user. + status.validity = AccountValidity::Completed; + Self::deposit_event(RawEvent::PaymentComplete(who.clone(), status.free_balance, status.locked_balance)); + Ok(()) + })?; + } + + /* Configuration Operations */ + + /// Set the account that will be used to payout users in the DOT purchase process. + /// + /// Origin must match the `ConfigurationOrigin` + #[weight = T::DbWeight::get().writes(1)] + fn set_payment_account(origin, who: T::AccountId) { + T::ConfigurationOrigin::ensure_origin(origin)?; + // Possibly this is worse than having the caller account be the payment account? + PaymentAccount::::set(who.clone()); + Self::deposit_event(RawEvent::PaymentAccountSet(who)); + } + + /// Set the statement that must be signed for a user to participate on the DOT sale. + /// + /// Origin must match the `ConfigurationOrigin` + #[weight = T::DbWeight::get().writes(1)] + fn set_statement(origin, statement: Vec) { + T::ConfigurationOrigin::ensure_origin(origin)?; + ensure!(statement.len() < T::MaxStatementLength::get(), Error::::InvalidStatement); + // Possibly this is worse than having the caller account be the payment account? + Statement::set(statement); + Self::deposit_event(RawEvent::StatementUpdated); + } + + /// Set the block where locked DOTs will become unlocked. + /// + /// Origin must match the `ConfigurationOrigin` + #[weight = T::DbWeight::get().writes(1)] + fn set_unlock_block(origin, unlock_block: T::BlockNumber) { + T::ConfigurationOrigin::ensure_origin(origin)?; + ensure!(unlock_block > system::Module::::block_number(), Error::::InvalidUnlockBlock); + // Possibly this is worse than having the caller account be the payment account? + UnlockBlock::::set(unlock_block); + Self::deposit_event(RawEvent::UnlockBlockUpdated(unlock_block)); + } + } +} + +impl Module { + fn verify_signature(who: &T::AccountId, signature: &[u8]) -> Result<(), DispatchError> { + // sr25519 always expects a 64 byte signature. + ensure!(signature.len() == 64, Error::::InvalidSignature); + let signature: AnySignature = sr25519::Signature::from_slice(signature).into(); + + // In Polkadot, the AccountId is always the same as the 32 byte public key. + let account_bytes: [u8; 32] = account_to_bytes(who)?; + let public_key = sr25519::Public::from_raw(account_bytes); + + let message = Statement::get(); + + // Check if everything is good or not. + match signature.verify(message.as_slice(), &public_key) { + true => Ok(()), + false => Err(Error::::InvalidSignature)?, + } + } +} + +// This function converts a 32 byte AccountId to its byte-array equivalent form. +fn account_to_bytes(account: &AccountId) -> Result<[u8; 32], DispatchError> + where AccountId: Encode, +{ + let account_vec = account.encode(); + ensure!(account_vec.len() == 32, "AccountId must be 32 bytes."); + let mut bytes = [0u8; 32]; + bytes.copy_from_slice(&account_vec); + Ok(bytes) +} + +#[cfg(test)] +mod tests { + use super::*; + + use sp_core::{H256, Pair, Public, crypto::AccountId32, ed25519}; + // The testing primitives are very useful for avoiding having to work with signatures + // or public keys. `u64` is used as the `AccountId` and no `Signature`s are required. + use sp_runtime::{ + Perbill, MultiSignature, + traits::{BlakeTwo256, IdentityLookup, Identity, Verify, IdentifyAccount, Dispatchable}, + testing::Header + }; + use frame_support::{ + impl_outer_origin, impl_outer_dispatch, assert_ok, assert_noop, parameter_types, + ord_parameter_types, dispatch::DispatchError::BadOrigin, + }; + use frame_support::traits::Currency; + use balances::Error as BalancesError; + + impl_outer_origin! { + pub enum Origin for Test {} + } + + impl_outer_dispatch! { + pub enum Call for Test where origin: Origin { + purchase::Purchase, + vesting::Vesting, + } + } + + type AccountId = AccountId32; + + // For testing the module, we construct most of a mock runtime. This means + // first constructing a configuration type (`Test`) which `impl`s each of the + // configuration traits of modules we want to use. + #[derive(Clone, Eq, PartialEq)] + pub struct Test; + parameter_types! { + pub const BlockHashCount: u32 = 250; + pub const MaximumBlockWeight: u32 = 4 * 1024 * 1024; + pub const MaximumBlockLength: u32 = 4 * 1024 * 1024; + pub const AvailableBlockRatio: Perbill = Perbill::from_percent(75); + } + impl system::Trait for Test { + type BaseCallFilter = (); + type Origin = Origin; + type Call = Call; + type Index = u64; + type BlockNumber = u64; + type Hash = H256; + type Hashing = BlakeTwo256; + type AccountId = AccountId; + type Lookup = IdentityLookup; + type Header = Header; + type Event = (); + type BlockHashCount = BlockHashCount; + type MaximumBlockWeight = MaximumBlockWeight; + type DbWeight = (); + type BlockExecutionWeight = (); + type ExtrinsicBaseWeight = (); + type MaximumExtrinsicWeight = MaximumBlockWeight; + type MaximumBlockLength = MaximumBlockLength; + type AvailableBlockRatio = AvailableBlockRatio; + type Version = (); + type ModuleToIndex = (); + type AccountData = balances::AccountData; + type OnNewAccount = (); + type OnKilledAccount = Balances; + type SystemWeightInfo = (); + } + + parameter_types! { + pub const ExistentialDeposit: u64 = 1; + } + + impl balances::Trait for Test { + type Balance = u64; + type Event = (); + type DustRemoval = (); + type ExistentialDeposit = ExistentialDeposit; + type AccountStore = System; + type WeightInfo = (); + } + + parameter_types! { + pub const MinVestedTransfer: u64 = 0; + } + + impl vesting::Trait for Test { + type Event = (); + type Currency = Balances; + type BlockNumberToBalance = Identity; + type MinVestedTransfer = MinVestedTransfer; + type WeightInfo = (); + } + + parameter_types! { + pub const MaxStatementLength: usize = 1_000; + pub const UnlockedProportion: Permill = Permill::from_percent(10); + pub const MaxUnlocked: u64 = 10; + } + + ord_parameter_types! { + pub const ValidityOrigin: AccountId = AccountId32::from([0u8; 32]); + pub const PaymentOrigin: AccountId = AccountId32::from([1u8; 32]); + pub const ConfigurationOrigin: AccountId = AccountId32::from([2u8; 32]); + } + + impl Trait for Test { + type Event = (); + type Currency = Balances; + type VestingSchedule = Vesting; + type ValidityOrigin = system::EnsureSignedBy; + type ConfigurationOrigin = system::EnsureSignedBy; + type MaxStatementLength = MaxStatementLength; + type UnlockedProportion = UnlockedProportion; + type MaxUnlocked = MaxUnlocked; + } + + type System = system::Module; + type Balances = balances::Module; + type Vesting = vesting::Module; + type Purchase = Module; + + // This function basically just builds a genesis storage key/value store according to + // our desired mockup. It also executes our `setup` function which sets up this pallet for use. + pub fn new_test_ext() -> sp_io::TestExternalities { + let t = system::GenesisConfig::default().build_storage::().unwrap(); + let mut ext = sp_io::TestExternalities::new(t); + ext.execute_with(|| setup()); + ext + } + + fn setup() { + let statement = b"Hello, World".to_vec(); + let unlock_block = 100; + Purchase::set_statement(Origin::signed(configuration_origin()), statement).unwrap(); + Purchase::set_unlock_block(Origin::signed(configuration_origin()), unlock_block).unwrap(); + Purchase::set_payment_account(Origin::signed(configuration_origin()), payment_account()).unwrap(); + Balances::make_free_balance_be(&payment_account(), 100_000); + } + + type AccountPublic = ::Signer; + + /// Helper function to generate a crypto pair from seed + fn get_from_seed(seed: &str) -> ::Public { + TPublic::Pair::from_string(&format!("//{}", seed), None) + .expect("static values are valid; qed") + .public() + } + + /// Helper function to generate an account ID from seed + fn get_account_id_from_seed(seed: &str) -> AccountId where + AccountPublic: From<::Public> + { + AccountPublic::from(get_from_seed::(seed)).into_account() + } + + fn alice() -> AccountId { + get_account_id_from_seed::("Alice") + } + + fn alice_ed25519() -> AccountId { + get_account_id_from_seed::("Alice") + } + + fn bob() -> AccountId { + get_account_id_from_seed::("Bob") + } + + fn alice_signature() -> [u8; 64] { + // echo -n "Hello, World" | subkey -s sign "bottom drive obey lake curtain smoke basket hold race lonely fit walk//Alice" + hex_literal::hex!("20e0faffdf4dfe939f2faa560f73b1d01cde8472e2b690b7b40606a374244c3a2e9eb9c8107c10b605138374003af8819bd4387d7c24a66ee9253c2e688ab881") + } + + fn bob_signature() -> [u8; 64] { + // echo -n "Hello, World" | subkey -s sign "bottom drive obey lake curtain smoke basket hold race lonely fit walk//Bob" + hex_literal::hex!("d6d460187ecf530f3ec2d6e3ac91b9d083c8fbd8f1112d92a82e4d84df552d18d338e6da8944eba6e84afaacf8a9850f54e7b53a84530d649be2e0119c7ce889") + } + + fn alice_signature_ed25519() -> [u8; 64] { + // echo -n "Hello, World" | subkey -e sign "bottom drive obey lake curtain smoke basket hold race lonely fit walk//Alice" + hex_literal::hex!("ee3f5a6cbfc12a8f00c18b811dc921b550ddf272354cda4b9a57b1d06213fcd8509f5af18425d39a279d13622f14806c3e978e2163981f2ec1c06e9628460b0e") + } + + fn validity_origin() -> AccountId { + ValidityOrigin::get() + } + + fn configuration_origin() -> AccountId { + ConfigurationOrigin::get() + } + + fn payment_account() -> AccountId { + [42u8; 32].into() + } + + #[test] + fn set_statement_works_and_handles_basic_errors() { + new_test_ext().execute_with(|| { + let statement = b"Test Set Statement".to_vec(); + // Invalid origin + assert_noop!( + Purchase::set_statement(Origin::signed(alice()), statement.clone()), + BadOrigin, + ); + // Too Long + let long_statement = [0u8; 10_000].to_vec(); + assert_noop!( + Purchase::set_statement(Origin::signed(configuration_origin()), long_statement), + Error::::InvalidStatement, + ); + // Just right... + assert_ok!(Purchase::set_statement(Origin::signed(configuration_origin()), statement.clone())); + assert_eq!(Statement::get(), statement); + }); + } + + #[test] + fn set_unlock_block_works_and_handles_basic_errors() { + new_test_ext().execute_with(|| { + let unlock_block = 69; + // Invalid origin + assert_noop!( + Purchase::set_unlock_block(Origin::signed(alice()), unlock_block), + BadOrigin, + ); + // Block Number in Past + let bad_unlock_block = 50; + System::set_block_number(bad_unlock_block); + assert_noop!( + Purchase::set_unlock_block(Origin::signed(configuration_origin()), bad_unlock_block), + Error::::InvalidUnlockBlock, + ); + // Just right... + assert_ok!(Purchase::set_unlock_block(Origin::signed(configuration_origin()), unlock_block)); + assert_eq!(UnlockBlock::::get(), unlock_block); + }); + } + + #[test] + fn set_payment_account_works_and_handles_basic_errors() { + new_test_ext().execute_with(|| { + let payment_account: AccountId = [69u8; 32].into(); + // Invalid Origin + assert_noop!( + Purchase::set_payment_account(Origin::signed(alice()), payment_account.clone()), + BadOrigin, + ); + // Just right... + assert_ok!(Purchase::set_payment_account(Origin::signed(configuration_origin()), payment_account.clone())); + assert_eq!(PaymentAccount::::get(), payment_account); + }); + } + + #[test] + fn signature_verification_works() { + new_test_ext().execute_with(|| { + assert_ok!(Purchase::verify_signature(&alice(), &alice_signature())); + assert_ok!(Purchase::verify_signature(&alice_ed25519(), &alice_signature_ed25519())); + assert_ok!(Purchase::verify_signature(&bob(), &bob_signature())); + + // Mixing and matching fails + assert_noop!(Purchase::verify_signature(&alice(), &bob_signature()), Error::::InvalidSignature); + assert_noop!(Purchase::verify_signature(&bob(), &alice_signature()), Error::::InvalidSignature); + }); + } + + #[test] + fn account_creation_works() { + new_test_ext().execute_with(|| { + assert!(!Accounts::::contains_key(alice())); + assert_ok!(Purchase::create_account( + Origin::signed(validity_origin()), + alice(), + alice_signature().to_vec(), + )); + assert_eq!( + Accounts::::get(alice()), + AccountStatus { + validity: AccountValidity::Initiated, + free_balance: Zero::zero(), + locked_balance: Zero::zero(), + signature: alice_signature().to_vec(), + vat: Permill::zero(), + } + ); + }); + } + + #[test] + fn account_creation_handles_basic_errors() { + new_test_ext().execute_with(|| { + // Wrong Origin + assert_noop!( + Purchase::create_account(Origin::signed(alice()), alice(), alice_signature().to_vec()), + BadOrigin, + ); + + // Wrong Account/Signature + assert_noop!( + Purchase::create_account(Origin::signed(validity_origin()), alice(), bob_signature().to_vec()), + Error::::InvalidSignature, + ); + + // Account with vesting + assert_ok!(::VestingSchedule::add_vesting_schedule( + &alice(), + 100, + 1, + 50 + )); + assert_noop!( + Purchase::create_account(Origin::signed(validity_origin()), alice(), alice_signature().to_vec()), + Error::::VestingScheduleExists, + ); + + // Duplicate Purchasing Account + assert_ok!( + Purchase::create_account(Origin::signed(validity_origin()), bob(), bob_signature().to_vec()) + ); + assert_noop!( + Purchase::create_account(Origin::signed(validity_origin()), bob(), bob_signature().to_vec()), + Error::::ExistingAccount, + ); + }); + } + + #[test] + fn update_validity_status_works() { + new_test_ext().execute_with(|| { + // Alice account is created. + assert_ok!(Purchase::create_account( + Origin::signed(validity_origin()), + alice(), + alice_signature().to_vec(), + )); + // She submits KYC, and we update the status to `Pending`. + assert_ok!(Purchase::update_validity_status( + Origin::signed(validity_origin()), + alice(), + AccountValidity::Pending, + )); + // KYC comes back negative, so we mark the account invalid. + assert_ok!(Purchase::update_validity_status( + Origin::signed(validity_origin()), + alice(), + AccountValidity::Invalid, + )); + assert_eq!( + Accounts::::get(alice()), + AccountStatus { + validity: AccountValidity::Invalid, + free_balance: Zero::zero(), + locked_balance: Zero::zero(), + signature: alice_signature().to_vec(), + vat: Permill::zero(), + } + ); + // She fixes it, we mark her account valid. + assert_ok!(Purchase::update_validity_status( + Origin::signed(validity_origin()), + alice(), + AccountValidity::ValidLow, + )); + assert_eq!( + Accounts::::get(alice()), + AccountStatus { + validity: AccountValidity::ValidLow, + free_balance: Zero::zero(), + locked_balance: Zero::zero(), + signature: alice_signature().to_vec(), + vat: Permill::zero(), + } + ); + }); + } + + #[test] + fn update_validity_status_handles_basic_errors() { + new_test_ext().execute_with(|| { + // Wrong Origin + assert_noop!(Purchase::update_validity_status( + Origin::signed(alice()), + alice(), + AccountValidity::Pending, + ), BadOrigin); + // Inactive Account + assert_noop!(Purchase::update_validity_status( + Origin::signed(validity_origin()), + alice(), + AccountValidity::Pending, + ), Error::::InvalidAccount); + // Already Completed + assert_ok!(Purchase::create_account( + Origin::signed(validity_origin()), + alice(), + alice_signature().to_vec(), + )); + assert_ok!(Purchase::update_validity_status( + Origin::signed(validity_origin()), + alice(), + AccountValidity::Completed, + )); + assert_noop!(Purchase::update_validity_status( + Origin::signed(validity_origin()), + alice(), + AccountValidity::Pending, + ), Error::::AlreadyCompleted); + }); + } + + #[test] + fn update_balance_works() { + new_test_ext().execute_with(|| { + // Alice account is created + assert_ok!(Purchase::create_account( + Origin::signed(validity_origin()), + alice(), + alice_signature().to_vec()) + ); + // And approved for basic contribution + assert_ok!(Purchase::update_validity_status( + Origin::signed(validity_origin()), + alice(), + AccountValidity::ValidLow, + )); + // We set a balance on the user based on the payment they made. 50 locked, 50 free. + assert_ok!(Purchase::update_balance( + Origin::signed(validity_origin()), + alice(), + 50, + 50, + Permill::from_rational_approximation(77u32, 1000u32), + )); + assert_eq!( + Accounts::::get(alice()), + AccountStatus { + validity: AccountValidity::ValidLow, + free_balance: 50, + locked_balance: 50, + signature: alice_signature().to_vec(), + vat: Permill::from_parts(77000), + } + ); + // We can update the balance based on new information. + assert_ok!(Purchase::update_balance( + Origin::signed(validity_origin()), + alice(), + 25, + 50, + Permill::zero(), + )); + assert_eq!( + Accounts::::get(alice()), + AccountStatus { + validity: AccountValidity::ValidLow, + free_balance: 25, + locked_balance: 50, + signature: alice_signature().to_vec(), + vat: Permill::zero(), + } + ); + }); + } + + #[test] + fn update_balance_handles_basic_errors() { + new_test_ext().execute_with(|| { + // Wrong Origin + assert_noop!(Purchase::update_balance( + Origin::signed(alice()), + alice(), + 50, + 50, + Permill::zero(), + ), BadOrigin); + // Inactive Account + assert_noop!(Purchase::update_balance( + Origin::signed(validity_origin()), + alice(), + 50, + 50, + Permill::zero(), + ), Error::::InvalidAccount); + // Overflow + assert_noop!(Purchase::update_balance( + Origin::signed(validity_origin()), + alice(), + u64::max_value(), + u64::max_value(), + Permill::zero(), + ), Error::::InvalidAccount); + }); + } + + #[test] + fn payout_works() { + new_test_ext().execute_with(|| { + // Alice and Bob accounts are created + assert_ok!(Purchase::create_account( + Origin::signed(validity_origin()), + alice(), + alice_signature().to_vec()) + ); + assert_ok!(Purchase::create_account( + Origin::signed(validity_origin()), + bob(), + bob_signature().to_vec()) + ); + // Alice is approved for basic contribution + assert_ok!(Purchase::update_validity_status( + Origin::signed(validity_origin()), + alice(), + AccountValidity::ValidLow, + )); + // Bob is approved for high contribution + assert_ok!(Purchase::update_validity_status( + Origin::signed(validity_origin()), + bob(), + AccountValidity::ValidHigh, + )); + // We set a balance on the users based on the payment they made. 50 locked, 50 free. + assert_ok!(Purchase::update_balance( + Origin::signed(validity_origin()), + alice(), + 50, + 50, + Permill::zero(), + )); + assert_ok!(Purchase::update_balance( + Origin::signed(validity_origin()), + bob(), + 100, + 150, + Permill::zero(), + )); + // Now we call payout for Alice and Bob. + assert_ok!(Purchase::payout( + Origin::signed(payment_account()), + alice(), + )); + assert_ok!(Purchase::payout( + Origin::signed(payment_account()), + bob(), + )); + // Payment is made. + assert_eq!(::Currency::free_balance(&payment_account()), 99_650); + assert_eq!(::Currency::free_balance(&alice()), 100); + // 10% of the 50 units is unlocked automatically for Alice + assert_eq!(::VestingSchedule::vesting_balance(&alice()), Some(45)); + assert_eq!(::Currency::free_balance(&bob()), 250); + // A max of 10 units is unlocked automatically for Bob + assert_eq!(::VestingSchedule::vesting_balance(&bob()), Some(140)); + // Status is completed. + assert_eq!( + Accounts::::get(alice()), + AccountStatus { + validity: AccountValidity::Completed, + free_balance: 50, + locked_balance: 50, + signature: alice_signature().to_vec(), + vat: Permill::zero(), + } + ); + assert_eq!( + Accounts::::get(bob()), + AccountStatus { + validity: AccountValidity::Completed, + free_balance: 100, + locked_balance: 150, + signature: bob_signature().to_vec(), + vat: Permill::zero(), + } + ); + // Vesting lock is removed in whole on block 101 (100 blocks after block 1) + System::set_block_number(100); + let vest_call = Call::Vesting(vesting::Call::::vest()); + assert_ok!(vest_call.clone().dispatch(Origin::signed(alice()))); + assert_ok!(vest_call.clone().dispatch(Origin::signed(bob()))); + assert_eq!(::VestingSchedule::vesting_balance(&alice()), Some(45)); + assert_eq!(::VestingSchedule::vesting_balance(&bob()), Some(140)); + System::set_block_number(101); + assert_ok!(vest_call.clone().dispatch(Origin::signed(alice()))); + assert_ok!(vest_call.clone().dispatch(Origin::signed(bob()))); + assert_eq!(::VestingSchedule::vesting_balance(&alice()), None); + assert_eq!(::VestingSchedule::vesting_balance(&bob()), None); + }); + } + + #[test] + fn payout_handles_basic_errors() { + new_test_ext().execute_with(|| { + // Wrong Origin + assert_noop!(Purchase::payout( + Origin::signed(alice()), + alice(), + ), BadOrigin); + // Account with Existing Vesting Schedule + assert_ok!(::VestingSchedule::add_vesting_schedule( + &bob(), 100, 1, 50, + )); + assert_noop!(Purchase::payout( + Origin::signed(payment_account()), + bob(), + ), Error::::VestingScheduleExists); + // Invalid Account (never created) + assert_noop!(Purchase::payout( + Origin::signed(payment_account()), + alice(), + ), Error::::InvalidAccount); + // Invalid Account (created, but not valid) + assert_ok!(Purchase::create_account( + Origin::signed(validity_origin()), + alice(), + alice_signature().to_vec()) + ); + assert_noop!(Purchase::payout( + Origin::signed(payment_account()), + alice(), + ), Error::::InvalidAccount); + // Not enough funds in payment account + assert_ok!(Purchase::update_validity_status( + Origin::signed(validity_origin()), + alice(), + AccountValidity::ValidHigh, + )); + assert_ok!(Purchase::update_balance( + Origin::signed(validity_origin()), + alice(), + 100_000, + 100_000, + Permill::zero(), + )); + assert_noop!(Purchase::payout( + Origin::signed(payment_account()), + alice(), + ), BalancesError::::InsufficientBalance); + }); + } +} diff --git a/runtime/polkadot/Cargo.toml b/runtime/polkadot/Cargo.toml index 2c8373cb83..fa6d8efb5d 100644 --- a/runtime/polkadot/Cargo.toml +++ b/runtime/polkadot/Cargo.toml @@ -68,7 +68,7 @@ frame-benchmarking = { git = "https://github.com/paritytech/substrate", branch = frame-system-benchmarking = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false, optional = true } pallet-offences-benchmarking = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false, optional = true } pallet-session-benchmarking = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false, optional = true } -hex-literal = { version = "0.2.1", optional = true } +hex-literal = { version = "0.2.1" } runtime-common = { package = "polkadot-runtime-common", path = "../common", default-features = false } primitives = { package = "polkadot-primitives", path = "../../primitives", default-features = false } @@ -163,7 +163,8 @@ runtime-benchmarks = [ "vesting/runtime-benchmarks", "pallet-offences-benchmarking", "pallet-session-benchmarking", - "hex-literal", + # renable when optional + # "hex-literal", ] # When enabled, the runtime api will not be build. # diff --git a/runtime/polkadot/src/lib.rs b/runtime/polkadot/src/lib.rs index 177bf7e26e..5e1e292625 100644 --- a/runtime/polkadot/src/lib.rs +++ b/runtime/polkadot/src/lib.rs @@ -25,7 +25,7 @@ use runtime_common::{ impls::{CurrencyToVoteHandler, ToAuthor}, NegativeImbalance, BlockHashCount, MaximumBlockWeight, AvailableBlockRatio, MaximumBlockLength, BlockExecutionWeight, ExtrinsicBaseWeight, RocksDbWeight, - MaximumExtrinsicWeight, + MaximumExtrinsicWeight, purchase, }; use sp_std::prelude::*; @@ -57,11 +57,11 @@ use version::NativeVersion; use sp_core::OpaqueMetadata; use sp_staking::SessionIndex; use frame_support::{ - parameter_types, construct_runtime, debug, RuntimeDebug, + parameter_types, ord_parameter_types, construct_runtime, debug, RuntimeDebug, traits::{KeyOwnerProofSystem, SplitTwoWays, Randomness, LockIdentifier, Filter}, weights::Weight, }; -use system::{EnsureRoot, EnsureOneOf}; +use system::{EnsureRoot, EnsureOneOf, EnsureSignedBy}; use im_online::sr25519::AuthorityId as ImOnlineId; use authority_discovery_primitives::AuthorityId as AuthorityDiscoveryId; use transaction_payment_rpc_runtime_api::RuntimeDispatchInfo; @@ -135,7 +135,8 @@ impl Filter for BaseFilter { Call::Session(_) | Call::FinalityTracker(_) | Call::Grandpa(_) | Call::ImOnline(_) | Call::AuthorityDiscovery(_) | Call::Utility(_) | Call::Claims(_) | Call::Vesting(_) | Call::Sudo(_) | - Call::Identity(_) | Call::Proxy(_) | Call::Multisig(_) | Call::Poll(_) => + Call::Identity(_) | Call::Proxy(_) | Call::Multisig(_) | Call::Poll(_) | + Call::Purchase(_) => true, } } @@ -944,6 +945,46 @@ impl poll::Trait for Runtime { type End = PollEnd; } +parameter_types! { + pub const MaxStatementLength: usize = 1_000; + pub const UnlockedProportion: Permill = Permill::zero(); + pub const MaxUnlocked: Balance = 0; +} + +ord_parameter_types! { + pub const W3FValidity: AccountId = AccountId::from( + // 142wAF65SK7PxhyzzrWz5m5PXDtooehgePBd7rc2NWpfc8Wa + hex_literal::hex!("862e432e0cf75693899c62691ac0f48967f815add97ae85659dcde8332708551") + ); + pub const W3FConfiguration: AccountId = AccountId::from( + // 1KvKReVmUiTc2LW2a4qyHsaJJ9eE9LRsywZkMk5hyBeyHgw + hex_literal::hex!("0e6de68b13b82479fbe988ab9ecb16bad446b67b993cdd9198cd41c7c6259c49") + ); +} + +type ValidityOrigin = EnsureOneOf< + AccountId, + EnsureRoot, + EnsureSignedBy, +>; + +type ConfigurationOrigin = EnsureOneOf< + AccountId, + EnsureRoot, + EnsureSignedBy, +>; + +impl purchase::Trait for Runtime { + type Event = Event; + type Currency = Balances; + type VestingSchedule = Vesting; + type ValidityOrigin = ValidityOrigin; + type ConfigurationOrigin = ConfigurationOrigin; + type MaxStatementLength = MaxStatementLength; + type UnlockedProportion = UnlockedProportion; + type MaxUnlocked = MaxUnlocked; +} + construct_runtime! { pub enum Runtime where Block = Block, @@ -1012,6 +1053,9 @@ construct_runtime! { // Poll module. Poll: poll::{Module, Call, Storage, Event}, + + // DOT Purchase module. Late addition. + Purchase: purchase::{Module, Call, Storage, Event}, } } -- GitLab From 7071a022ca9524dd27bc885dfab58394fe697388 Mon Sep 17 00:00:00 2001 From: Shawn Tabrizi Date: Fri, 17 Jul 2020 15:18:02 +0200 Subject: [PATCH 075/192] Add purchase module to westend (#1429) --- runtime/westend/Cargo.toml | 5 ++-- runtime/westend/src/lib.rs | 51 +++++++++++++++++++++++++++++++++++--- 2 files changed, 50 insertions(+), 6 deletions(-) diff --git a/runtime/westend/Cargo.toml b/runtime/westend/Cargo.toml index 1636786320..b3a141483c 100644 --- a/runtime/westend/Cargo.toml +++ b/runtime/westend/Cargo.toml @@ -70,7 +70,7 @@ frame-benchmarking = { git = "https://github.com/paritytech/substrate", branch = frame-system-benchmarking = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false, optional = true } pallet-offences-benchmarking = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false, optional = true } pallet-session-benchmarking = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false, optional = true } -hex-literal = { version = "0.2.1", optional = true } +hex-literal = { version = "0.2.1" } runtime-common = { package = "polkadot-runtime-common", path = "../common", default-features = false } primitives = { package = "polkadot-primitives", path = "../../primitives", default-features = false } @@ -172,7 +172,8 @@ runtime-benchmarks = [ "vesting/runtime-benchmarks", "pallet-offences-benchmarking", "pallet-session-benchmarking", - "hex-literal", + # uncomment when it is made optional again + # "hex-literal", ] # When enabled, the runtime api will not be build. # diff --git a/runtime/westend/src/lib.rs b/runtime/westend/src/lib.rs index 6f2c2aa68e..306de3589a 100644 --- a/runtime/westend/src/lib.rs +++ b/runtime/westend/src/lib.rs @@ -28,14 +28,14 @@ use primitives::v0::{ ActiveParas, AbridgedCandidateReceipt, SigningContext, }; use runtime_common::{ - attestations, parachains, registrar, SlowAdjustingFeeUpdate, + attestations, parachains, registrar, purchase, SlowAdjustingFeeUpdate, impls::{CurrencyToVoteHandler, ToAuthor}, BlockHashCount, MaximumBlockWeight, AvailableBlockRatio, MaximumBlockLength, BlockExecutionWeight, ExtrinsicBaseWeight, RocksDbWeight, MaximumExtrinsicWeight, }; use sp_runtime::{ create_runtime_str, generic, impl_opaque_keys, - ApplyExtrinsicResult, KeyTypeId, Perbill, curve::PiecewiseLinear, + ApplyExtrinsicResult, KeyTypeId, Permill, Perbill, curve::PiecewiseLinear, transaction_validity::{TransactionValidity, TransactionSource, TransactionPriority}, traits::{ BlakeTwo256, Block as BlockT, OpaqueKeys, ConvertInto, IdentityLookup, @@ -51,7 +51,7 @@ use version::NativeVersion; use sp_core::OpaqueMetadata; use sp_staking::SessionIndex; use frame_support::{ - parameter_types, construct_runtime, debug, RuntimeDebug, + parameter_types, ord_parameter_types, construct_runtime, debug, RuntimeDebug, traits::{KeyOwnerProofSystem, Randomness, Filter, InstanceFilter}, weights::Weight, }; @@ -59,7 +59,7 @@ use im_online::sr25519::AuthorityId as ImOnlineId; use authority_discovery_primitives::AuthorityId as AuthorityDiscoveryId; use transaction_payment_rpc_runtime_api::RuntimeDispatchInfo; use session::historical as session_historical; -use system::EnsureRoot; +use system::{EnsureRoot, EnsureSignedBy, EnsureOneOf}; #[cfg(feature = "std")] pub use staking::StakerStatus; @@ -690,6 +690,46 @@ impl proxy::Trait for Runtime { type WeightInfo = (); } +parameter_types! { + pub const MaxStatementLength: usize = 1_000; + pub const UnlockedProportion: Permill = Permill::zero(); + pub const MaxUnlocked: Balance = 0; +} + +ord_parameter_types! { + pub const PurchaseValidity: AccountId = AccountId::from( + // 5CqSB6zNHcp3mvTAyh5Vr2MbSdb7DgLi9yWoAppHRveGcYQh + hex_literal::hex!("221d409ba60508368d4448ccda40182aca2744bcdfa0881944c08108a9fd966d") + ); + pub const PurchaseConfiguration: AccountId = AccountId::from( + // 5FUP4BwQzi8F5WBTmaHsoobGbMSUTiX7Exwb7QzTjgNQypo1 + hex_literal::hex!("96c34c8c60b3690701176bdbc9b16aced2898d754385a84ee0cfe7fb015db800") + ); +} + +type ValidityOrigin = EnsureOneOf< + AccountId, + EnsureRoot, + EnsureSignedBy, +>; + +type ConfigurationOrigin = EnsureOneOf< + AccountId, + EnsureRoot, + EnsureSignedBy, +>; + +impl purchase::Trait for Runtime { + type Event = Event; + type Currency = Balances; + type VestingSchedule = Vesting; + type ValidityOrigin = ValidityOrigin; + type ConfigurationOrigin = ConfigurationOrigin; + type MaxStatementLength = MaxStatementLength; + type UnlockedProportion = UnlockedProportion; + type MaxUnlocked = MaxUnlocked; +} + construct_runtime! { pub enum Runtime where Block = Block, @@ -748,6 +788,9 @@ construct_runtime! { // Multisig module. Late addition. Multisig: multisig::{Module, Call, Storage, Event}, + + // Purchase module. Late addition. + Purchase: purchase::{Module, Call, Storage, Event}, } } -- GitLab From 220b87a6af30ea440ac1abb7687c9892abb85227 Mon Sep 17 00:00:00 2001 From: Fedor Sakharov Date: Fri, 17 Jul 2020 20:04:02 +0300 Subject: [PATCH 076/192] Use SpawnNamed instead of Spawn in Overseer (#1430) * Use SpawnNamed instead of Spawn in Overseer * reexport SpawnNamed and fix doc tests * Fix deps --- Cargo.lock | 7 + node/core/backing/Cargo.toml | 2 +- node/core/backing/src/lib.rs | 16 +- node/network/bridge/Cargo.toml | 1 + node/network/bridge/src/lib.rs | 10 +- node/network/pov-distribution/Cargo.toml | 1 + node/network/pov-distribution/src/lib.rs | 31 +-- .../network/statement-distribution/Cargo.toml | 1 + .../network/statement-distribution/src/lib.rs | 11 +- node/overseer/Cargo.toml | 2 + node/overseer/examples/minimal-example.rs | 38 ++- node/overseer/src/lib.rs | 232 ++++++++++-------- node/primitives/Cargo.toml | 1 + node/primitives/src/lib.rs | 2 + node/service/src/lib.rs | 3 +- node/subsystem/src/lib.rs | 18 +- node/subsystem/src/util.rs | 29 ++- node/test-helpers/subsystem/Cargo.toml | 1 + node/test-helpers/subsystem/src/lib.rs | 11 +- 19 files changed, 245 insertions(+), 172 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 90f469bac6..55b034e1c2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4457,6 +4457,7 @@ dependencies = [ "polkadot-primitives", "polkadot-subsystem-test-helpers", "sc-network", + "sp-core", "sp-runtime", "streamunordered", ] @@ -4538,6 +4539,7 @@ dependencies = [ "parity-scale-codec", "polkadot-primitives", "polkadot-statement-table", + "sp-core", "sp-runtime", ] @@ -4571,9 +4573,11 @@ dependencies = [ "futures-timer 3.0.2", "kv-log-macro", "log 0.4.8", + "polkadot-node-primitives", "polkadot-node-subsystem", "polkadot-primitives", "sc-client-api", + "sp-core", "streamunordered", ] @@ -4611,6 +4615,7 @@ dependencies = [ "polkadot-primitives", "polkadot-subsystem-test-helpers", "sc-network", + "sp-core", "sp-runtime", "streamunordered", ] @@ -4963,6 +4968,7 @@ dependencies = [ "polkadot-node-subsystem", "polkadot-primitives", "polkadot-subsystem-test-helpers", + "sp-core", "sp-keyring", "sp-runtime", "sp-staking", @@ -4986,6 +4992,7 @@ dependencies = [ "futures 0.3.5", "parking_lot 0.10.2", "polkadot-node-subsystem", + "sp-core", ] [[package]] diff --git a/node/core/backing/Cargo.toml b/node/core/backing/Cargo.toml index 720b8af418..6c8155e3cf 100644 --- a/node/core/backing/Cargo.toml +++ b/node/core/backing/Cargo.toml @@ -10,7 +10,6 @@ sp-api = { git = "https://github.com/paritytech/substrate", branch = "master" } sc-client-api = { git = "https://github.com/paritytech/substrate", branch = "master" } sp-blockchain = { git = "https://github.com/paritytech/substrate", branch = "master" } keystore = { package = "sc-keystore", git = "https://github.com/paritytech/substrate", branch = "master" } -primitives = { package = "sp-core", git = "https://github.com/paritytech/substrate", branch = "master" } polkadot-primitives = { path = "../../../primitives" } polkadot-node-primitives = { path = "../../primitives" } polkadot-subsystem = { package = "polkadot-node-subsystem", path = "../../subsystem" } @@ -20,6 +19,7 @@ derive_more = "0.99.9" bitvec = { version = "0.17.4", default-features = false, features = ["alloc"] } [dev-dependencies] +sp-core = { git = "https://github.com/paritytech/substrate", branch = "master" } sp-keyring = { git = "https://github.com/paritytech/substrate", branch = "master" } futures = { version = "0.3.5", features = ["thread-pool"] } subsystem-test = { package = "polkadot-subsystem-test-helpers", path = "../../test-helpers/subsystem" } diff --git a/node/core/backing/src/lib.rs b/node/core/backing/src/lib.rs index e0309ec842..260cd2eacc 100644 --- a/node/core/backing/src/lib.rs +++ b/node/core/backing/src/lib.rs @@ -24,7 +24,6 @@ use std::sync::Arc; use bitvec::vec::BitVec; use futures::{ channel::{mpsc, oneshot}, - task::{Spawn, SpawnError}, Future, FutureExt, SinkExt, StreamExt, }; @@ -37,7 +36,7 @@ use polkadot_primitives::v1::{ }; use polkadot_node_primitives::{ FromTableMisbehavior, Statement, SignedFullStatement, MisbehaviorReport, - ValidationOutputs, ValidationResult, + ValidationOutputs, ValidationResult, SpawnNamed, }; use polkadot_subsystem::{ Subsystem, SubsystemContext, SpawnedSubsystem, @@ -77,8 +76,6 @@ enum Error { #[from] Mpsc(mpsc::SendError), #[from] - Spawn(SpawnError), - #[from] UtilError(util::Error), } @@ -735,7 +732,7 @@ pub struct CandidateBackingSubsystem { impl CandidateBackingSubsystem where - Spawner: Clone + Spawn + Send + Unpin, + Spawner: Clone + SpawnNamed + Send + Unpin, Context: SubsystemContext, ToJob: From<::Message>, { @@ -754,7 +751,7 @@ where impl Subsystem for CandidateBackingSubsystem where - Spawner: Spawn + Send + Clone + Unpin + 'static, + Spawner: SpawnNamed + Send + Clone + Unpin + 'static, Context: SubsystemContext, ::Message: Into, { @@ -769,10 +766,7 @@ where mod tests { use super::*; use assert_matches::assert_matches; - use futures::{ - executor::{self, ThreadPool}, - future, Future, - }; + use futures::{executor, future, Future}; use polkadot_primitives::v1::{ AssignmentKind, BlockData, CandidateCommitments, CollatorId, CoreAssignment, CoreIndex, LocalValidationData, GlobalValidationSchedule, GroupIndex, HeadData, @@ -905,7 +899,7 @@ mod tests { } fn test_harness>(keystore: KeyStorePtr, test: impl FnOnce(TestHarness) -> T) { - let pool = ThreadPool::new().unwrap(); + let pool = sp_core::testing::SpawnBlockingExecutor::new(); let (context, virtual_overseer) = subsystem_test::make_subsystem_context(pool.clone()); diff --git a/node/network/bridge/Cargo.toml b/node/network/bridge/Cargo.toml index 4f6c8631e2..49e84b8597 100644 --- a/node/network/bridge/Cargo.toml +++ b/node/network/bridge/Cargo.toml @@ -20,3 +20,4 @@ polkadot-subsystem = { package = "polkadot-node-subsystem", path = "../../subsys parking_lot = "0.10.0" subsystem-test = { package = "polkadot-subsystem-test-helpers", path = "../../test-helpers/subsystem" } assert_matches = "1.3.0" +sp-core = { git = "https://github.com/paritytech/substrate", branch = "master" } diff --git a/node/network/bridge/src/lib.rs b/node/network/bridge/src/lib.rs index 46b9dbd840..f2dbcd0aac 100644 --- a/node/network/bridge/src/lib.rs +++ b/node/network/bridge/src/lib.rs @@ -184,7 +184,10 @@ impl Subsystem for NetworkBridge fn start(self, ctx: Context) -> SpawnedSubsystem { // Swallow error because failure is fatal to the node and we log with more precision // within `run_network`. - SpawnedSubsystem(run_network(self.0, ctx).map(|_| ()).boxed()) + SpawnedSubsystem { + name: "network-bridge-subsystem", + future: run_network(self.0, ctx).map(|_| ()).boxed(), + } } } @@ -521,7 +524,7 @@ async fn run_network( mod tests { use super::*; use futures::channel::mpsc; - use futures::executor::{self, ThreadPool}; + use futures::executor; use std::sync::Arc; use parking_lot::Mutex; @@ -632,8 +635,7 @@ mod tests { } fn test_harness>(test: impl FnOnce(TestHarness) -> T) { - let pool = ThreadPool::new().unwrap(); - + let pool = sp_core::testing::SpawnBlockingExecutor::new(); let (network, network_handle) = new_test_network(); let (context, virtual_overseer) = subsystem_test::make_subsystem_context(pool); diff --git a/node/network/pov-distribution/Cargo.toml b/node/network/pov-distribution/Cargo.toml index a99e5e3d56..232e84f7eb 100644 --- a/node/network/pov-distribution/Cargo.toml +++ b/node/network/pov-distribution/Cargo.toml @@ -20,3 +20,4 @@ polkadot-subsystem = { package = "polkadot-node-subsystem", path = "../../subsys parking_lot = "0.10.0" subsystem-test = { package = "polkadot-subsystem-test-helpers", path = "../../test-helpers/subsystem" } assert_matches = "1.3.0" +sp-core = { git = "https://github.com/paritytech/substrate", branch = "master" } diff --git a/node/network/pov-distribution/src/lib.rs b/node/network/pov-distribution/src/lib.rs index 84d6e803d2..ea5365f8fc 100644 --- a/node/network/pov-distribution/src/lib.rs +++ b/node/network/pov-distribution/src/lib.rs @@ -69,7 +69,10 @@ impl Subsystem for PoVDistribution fn start(self, ctx: C) -> SpawnedSubsystem { // Swallow error because failure is fatal to the node and we log with more precision // within `run`. - SpawnedSubsystem(run(ctx).map(|_| ()).boxed()) + SpawnedSubsystem { + name: "pov-distribution-subsystem", + future: run(ctx).map(|_| ()).boxed(), + } } } @@ -548,7 +551,7 @@ async fn run( #[cfg(test)] mod tests { use super::*; - use futures::executor::{self, ThreadPool}; + use futures::executor; use polkadot_primitives::v1::BlockData; use assert_matches::assert_matches; @@ -616,7 +619,7 @@ mod tests { our_view: View(vec![hash_a, hash_b]), }; - let pool = ThreadPool::new().unwrap(); + let pool = sp_core::testing::SpawnBlockingExecutor::new(); let (mut ctx, mut handle) = subsystem_test::make_subsystem_context(pool); let mut descriptor = CandidateDescriptor::default(); descriptor.pov_hash = pov_hash; @@ -696,7 +699,7 @@ mod tests { our_view: View(vec![hash_a]), }; - let pool = ThreadPool::new().unwrap(); + let pool = sp_core::testing::SpawnBlockingExecutor::new(); let (mut ctx, mut handle) = subsystem_test::make_subsystem_context(pool); let mut descriptor = CandidateDescriptor::default(); descriptor.pov_hash = pov_hash; @@ -774,7 +777,7 @@ mod tests { our_view: View(vec![hash_a]), }; - let pool = ThreadPool::new().unwrap(); + let pool = sp_core::testing::SpawnBlockingExecutor::new(); let (mut ctx, mut handle) = subsystem_test::make_subsystem_context(pool); executor::block_on(async move { @@ -846,7 +849,7 @@ mod tests { our_view: View(vec![hash_a]), }; - let pool = ThreadPool::new().unwrap(); + let pool = sp_core::testing::SpawnBlockingExecutor::new(); let (mut ctx, mut handle) = subsystem_test::make_subsystem_context(pool); executor::block_on(async move { @@ -934,7 +937,7 @@ mod tests { our_view: View(vec![hash_a]), }; - let pool = ThreadPool::new().unwrap(); + let pool = sp_core::testing::SpawnBlockingExecutor::new(); let (mut ctx, mut handle) = subsystem_test::make_subsystem_context(pool); executor::block_on(async move { @@ -997,7 +1000,7 @@ mod tests { our_view: View(vec![hash_a]), }; - let pool = ThreadPool::new().unwrap(); + let pool = sp_core::testing::SpawnBlockingExecutor::new(); let (mut ctx, mut handle) = subsystem_test::make_subsystem_context(pool); executor::block_on(async move { @@ -1058,7 +1061,7 @@ mod tests { our_view: View(vec![hash_a]), }; - let pool = ThreadPool::new().unwrap(); + let pool = sp_core::testing::SpawnBlockingExecutor::new(); let (mut ctx, mut handle) = subsystem_test::make_subsystem_context(pool); executor::block_on(async move { @@ -1116,7 +1119,7 @@ mod tests { our_view: View(vec![hash_a]), }; - let pool = ThreadPool::new().unwrap(); + let pool = sp_core::testing::SpawnBlockingExecutor::new(); let (mut ctx, mut handle) = subsystem_test::make_subsystem_context(pool); executor::block_on(async move { @@ -1201,7 +1204,7 @@ mod tests { our_view: View(vec![hash_a, hash_b]), }; - let pool = ThreadPool::new().unwrap(); + let pool = sp_core::testing::SpawnBlockingExecutor::new(); let (mut ctx, mut handle) = subsystem_test::make_subsystem_context(pool); executor::block_on(async move { @@ -1263,7 +1266,7 @@ mod tests { our_view: View(vec![hash_a]), }; - let pool = ThreadPool::new().unwrap(); + let pool = sp_core::testing::SpawnBlockingExecutor::new(); let (mut ctx, mut handle) = subsystem_test::make_subsystem_context(pool); executor::block_on(async move { @@ -1340,7 +1343,7 @@ mod tests { our_view: View(vec![hash_a]), }; - let pool = ThreadPool::new().unwrap(); + let pool = sp_core::testing::SpawnBlockingExecutor::new(); let (mut ctx, mut handle) = subsystem_test::make_subsystem_context(pool); executor::block_on(async move { @@ -1424,7 +1427,7 @@ mod tests { our_view: View(vec![hash_a]), }; - let pool = ThreadPool::new().unwrap(); + let pool = sp_core::testing::SpawnBlockingExecutor::new(); let (mut ctx, mut handle) = subsystem_test::make_subsystem_context(pool); executor::block_on(async move { diff --git a/node/network/statement-distribution/Cargo.toml b/node/network/statement-distribution/Cargo.toml index 2f8da8ee3d..955830ef20 100644 --- a/node/network/statement-distribution/Cargo.toml +++ b/node/network/statement-distribution/Cargo.toml @@ -24,3 +24,4 @@ parking_lot = "0.10.0" subsystem-test = { package = "polkadot-subsystem-test-helpers", path = "../../test-helpers/subsystem" } assert_matches = "1.3.0" sp-keyring = { git = "https://github.com/paritytech/substrate", branch = "master" } +sp-core = { git = "https://github.com/paritytech/substrate", branch = "master" } diff --git a/node/network/statement-distribution/src/lib.rs b/node/network/statement-distribution/src/lib.rs index cef499eae9..67ac4c6b64 100644 --- a/node/network/statement-distribution/src/lib.rs +++ b/node/network/statement-distribution/src/lib.rs @@ -70,7 +70,10 @@ impl Subsystem for StatementDistribution fn start(self, ctx: C) -> SpawnedSubsystem { // Swallow error because failure is fatal to the node and we log with more precision // within `run`. - SpawnedSubsystem(run(ctx).map(|_| ()).boxed()) + SpawnedSubsystem { + name: "statement-distribution-subsystem", + future: run(ctx).map(|_| ()).boxed(), + } } } @@ -892,7 +895,7 @@ mod tests { use node_primitives::Statement; use polkadot_primitives::v1::CommittedCandidateReceipt; use assert_matches::assert_matches; - use futures::executor::{self, ThreadPool}; + use futures::executor; #[test] fn active_head_accepts_only_2_seconded_per_validator() { @@ -1209,7 +1212,7 @@ mod tests { }, }; - let pool = ThreadPool::new().unwrap(); + let pool = sp_core::testing::SpawnBlockingExecutor::new(); let (mut ctx, mut handle) = subsystem_test::make_subsystem_context(pool); let peer = PeerId::random(); @@ -1301,7 +1304,7 @@ mod tests { (peer_c.clone(), peer_data_from_view(peer_c_view)), ].into_iter().collect(); - let pool = ThreadPool::new().unwrap(); + let pool = sp_core::testing::SpawnBlockingExecutor::new(); let (mut ctx, mut handle) = subsystem_test::make_subsystem_context(pool); executor::block_on(async move { diff --git a/node/overseer/Cargo.toml b/node/overseer/Cargo.toml index 6c6ce304e6..da19a26e0a 100644 --- a/node/overseer/Cargo.toml +++ b/node/overseer/Cargo.toml @@ -12,9 +12,11 @@ streamunordered = "0.5.1" polkadot-primitives = { path = "../../primitives" } client = { package = "sc-client-api", git = "https://github.com/paritytech/substrate", branch = "master" } polkadot-subsystem = { package = "polkadot-node-subsystem", path = "../subsystem" } +polkadot-node-primitives = { package = "polkadot-node-primitives", path = "../primitives" } async-trait = "0.1" [dev-dependencies] +sp-core = { git = "https://github.com/paritytech/substrate", branch = "master" } futures = { version = "0.3.5", features = ["thread-pool"] } futures-timer = "3.0.2" femme = "2.0.1" diff --git a/node/overseer/examples/minimal-example.rs b/node/overseer/examples/minimal-example.rs index d5f7f043ff..35ebf8f336 100644 --- a/node/overseer/examples/minimal-example.rs +++ b/node/overseer/examples/minimal-example.rs @@ -21,7 +21,7 @@ use std::time::Duration; use futures::{ channel::oneshot, - pending, pin_mut, executor, select, stream, + pending, pin_mut, select, stream, FutureExt, StreamExt, }; use futures_timer::Delay; @@ -77,9 +77,14 @@ impl Subsystem for Subsystem1 where C: SubsystemContext { fn start(self, ctx: C) -> SpawnedSubsystem { - SpawnedSubsystem(Box::pin(async move { + let future = Box::pin(async move { Self::run(ctx).await; - })) + }); + + SpawnedSubsystem { + name: "subsystem-1", + future, + } } } @@ -87,12 +92,15 @@ struct Subsystem2; impl Subsystem2 { async fn run(mut ctx: impl SubsystemContext) { - ctx.spawn(Box::pin(async { - loop { - log::info!("Job tick"); - Delay::new(Duration::from_secs(1)).await; - } - })).await.unwrap(); + ctx.spawn( + "subsystem-2-job", + Box::pin(async { + loop { + log::info!("Job tick"); + Delay::new(Duration::from_secs(1)).await; + } + }), + ).await.unwrap(); loop { match ctx.try_recv().await { @@ -114,16 +122,20 @@ impl Subsystem for Subsystem2 where C: SubsystemContext { fn start(self, ctx: C) -> SpawnedSubsystem { - SpawnedSubsystem(Box::pin(async move { + let future = Box::pin(async move { Self::run(ctx).await; - })) + }); + + SpawnedSubsystem { + name: "subsystem-2", + future, + } } } fn main() { femme::with_level(femme::LevelFilter::Trace); - let spawner = executor::ThreadPool::new().unwrap(); - + let spawner = sp_core::testing::SpawnBlockingExecutor::new(); futures::executor::block_on(async { let timer_stream = stream::repeat(()).then(|_| async { Delay::new(Duration::from_secs(1)).await; diff --git a/node/overseer/src/lib.rs b/node/overseer/src/lib.rs index 91fceb0d3b..c6ac6444c2 100644 --- a/node/overseer/src/lib.rs +++ b/node/overseer/src/lib.rs @@ -64,9 +64,8 @@ use std::collections::HashSet; use futures::channel::{mpsc, oneshot}; use futures::{ pending, poll, select, - future::{BoxFuture, RemoteHandle}, + future::BoxFuture, stream::{self, FuturesUnordered}, - task::{Spawn, SpawnExt}, Future, FutureExt, SinkExt, StreamExt, }; use futures_timer::Delay; @@ -86,6 +85,7 @@ pub use polkadot_subsystem::{ Subsystem, SubsystemContext, OverseerSignal, FromOverseer, SubsystemError, SubsystemResult, SpawnedSubsystem, }; +use polkadot_node_primitives::SpawnNamed; // A capacity of bounded channels inside the overseer. @@ -109,8 +109,8 @@ enum ToOverseer { /// spawn on the overseer and a `oneshot::Sender` to signal the result /// of the spawn. SpawnJob { + name: &'static str, s: BoxFuture<'static, ()>, - res: oneshot::Sender>, }, } @@ -279,14 +279,15 @@ impl SubsystemContext for OverseerSubsystemContext { self.rx.next().await.ok_or(SubsystemError) } - async fn spawn(&mut self, s: Pin + Send>>) -> SubsystemResult<()> { - let (tx, rx) = oneshot::channel(); + async fn spawn(&mut self, name: &'static str, s: Pin + Send>>) + -> SubsystemResult<()> + { self.tx.send(ToOverseer::SpawnJob { + name, s, - res: tx, }).await?; - rx.await? + Ok(()) } async fn send_message(&mut self, msg: AllMessages) -> SubsystemResult<()> { @@ -322,7 +323,7 @@ struct OverseenSubsystem { } /// The `Overseer` itself. -pub struct Overseer { +pub struct Overseer { /// A candidate validation subsystem. candidate_validation_subsystem: OverseenSubsystem, @@ -361,7 +362,7 @@ pub struct Overseer { s: S, /// Here we keep handles to spawned subsystems to be notified when they terminate. - running_subsystems: FuturesUnordered>, + running_subsystems: FuturesUnordered>, /// Gather running subsystms' outbound streams into one. running_subsystems_rx: StreamUnordered>, @@ -416,7 +417,7 @@ pub struct AllSubsystems { impl Overseer where - S: Spawn, + S: SpawnNamed, { /// Create a new intance of the `Overseer` with a fixed set of [`Subsystem`]s. /// @@ -467,16 +468,19 @@ where /// self, /// mut ctx: C, /// ) -> SpawnedSubsystem { - /// SpawnedSubsystem(Box::pin(async move { - /// loop { - /// Delay::new(Duration::from_secs(1)).await; - /// } - /// })) + /// SpawnedSubsystem { + /// name: "validation-subsystem", + /// future: Box::pin(async move { + /// loop { + /// Delay::new(Duration::from_secs(1)).await; + /// } + /// }), + /// } /// } /// } /// /// # fn main() { executor::block_on(async move { - /// let spawner = executor::ThreadPool::new().unwrap(); + /// let spawner = sp_core::testing::SpawnBlockingExecutor::new(); /// let all_subsystems = AllSubsystems { /// candidate_validation: ValidationSubsystem, /// candidate_backing: DummySubsystem, @@ -737,10 +741,8 @@ where ) { match msg { ToOverseer::SubsystemMessage(msg) => self.route_message(msg).await, - ToOverseer::SpawnJob { s, res } => { - let s = self.spawn_job(s); - - let _ = res.send(s); + ToOverseer::SpawnJob { name, s } => { + self.spawn_job(name, s); } } } @@ -897,26 +899,33 @@ where } } - fn spawn_job(&mut self, j: BoxFuture<'static, ()>) -> SubsystemResult<()> { - self.s.spawn(j).map_err(|_| SubsystemError) + fn spawn_job(&mut self, name: &'static str, j: BoxFuture<'static, ()>) { + self.s.spawn(name, j); } } -fn spawn( +fn spawn( spawner: &mut S, - futures: &mut FuturesUnordered>, + futures: &mut FuturesUnordered>, streams: &mut StreamUnordered>, s: impl Subsystem>, ) -> SubsystemResult> { let (to_tx, to_rx) = mpsc::channel(CHANNEL_CAPACITY); let (from_tx, from_rx) = mpsc::channel(CHANNEL_CAPACITY); let ctx = OverseerSubsystemContext { rx: to_rx, tx: from_tx }; - let f = s.start(ctx); + let SpawnedSubsystem { future, name } = s.start(ctx); - let handle = spawner.spawn_with_handle(f.0)?; + let (tx, rx) = oneshot::channel(); + + let fut = Box::pin(async move { + future.await; + let _ = tx.send(()); + }); + + spawner.spawn(name, fut); streams.push(from_rx); - futures.push(handle); + futures.push(Box::pin(rx.map(|_| ()))); let instance = Some(SubsystemInstance { tx: to_tx, @@ -944,21 +953,24 @@ mod tests { { fn start(self, mut ctx: C) -> SpawnedSubsystem { let mut sender = self.0; - SpawnedSubsystem(Box::pin(async move { - let mut i = 0; - loop { - match ctx.recv().await { - Ok(FromOverseer::Communication { .. }) => { - let _ = sender.send(i).await; - i += 1; - continue; + SpawnedSubsystem { + name: "test-subsystem-1", + future: Box::pin(async move { + let mut i = 0; + loop { + match ctx.recv().await { + Ok(FromOverseer::Communication { .. }) => { + let _ = sender.send(i).await; + i += 1; + continue; + } + Ok(FromOverseer::Signal(OverseerSignal::Conclude)) => return, + Err(_) => return, + _ => (), } - Ok(FromOverseer::Signal(OverseerSignal::Conclude)) => return, - Err(_) => return, - _ => (), } - } - })) + }), + } } } @@ -969,39 +981,42 @@ mod tests { { fn start(self, mut ctx: C) -> SpawnedSubsystem { let sender = self.0.clone(); - SpawnedSubsystem(Box::pin(async move { - let _sender = sender; - let mut c: usize = 0; - loop { - if c < 10 { - let (tx, _) = oneshot::channel(); - ctx.send_message( - AllMessages::CandidateValidation( - CandidateValidationMessage::ValidateFromChainState( - Default::default(), - PoV { - block_data: BlockData(Vec::new()), - }.into(), - tx, + SpawnedSubsystem { + name: "test-subsystem-2", + future: Box::pin(async move { + let _sender = sender; + let mut c: usize = 0; + loop { + if c < 10 { + let (tx, _) = oneshot::channel(); + ctx.send_message( + AllMessages::CandidateValidation( + CandidateValidationMessage::ValidateFromChainState( + Default::default(), + PoV { + block_data: BlockData(Vec::new()), + }.into(), + tx, + ) ) - ) - ).await.unwrap(); - c += 1; - continue; - } - match ctx.try_recv().await { - Ok(Some(FromOverseer::Signal(OverseerSignal::Conclude))) => { - break; - } - Ok(Some(_)) => { + ).await.unwrap(); + c += 1; continue; } - Err(_) => return, - _ => (), + match ctx.try_recv().await { + Ok(Some(FromOverseer::Signal(OverseerSignal::Conclude))) => { + break; + } + Ok(Some(_)) => { + continue; + } + Err(_) => return, + _ => (), + } + pending!(); } - pending!(); - } - })) + }), + } } } @@ -1011,16 +1026,19 @@ mod tests { where C: SubsystemContext { fn start(self, mut _ctx: C) -> SpawnedSubsystem { - SpawnedSubsystem(Box::pin(async move { - // Do nothing and exit. - })) + SpawnedSubsystem { + name: "test-subsystem-4", + future: Box::pin(async move { + // Do nothing and exit. + }), + } } } // Checks that a minimal configuration of two jobs can run and exchange messages. #[test] fn overseer_works() { - let spawner = executor::ThreadPool::new().unwrap(); + let spawner = sp_core::testing::SpawnBlockingExecutor::new(); executor::block_on(async move { let (s1_tx, mut s1_rx) = mpsc::channel(64); @@ -1084,7 +1102,7 @@ mod tests { // Should immediately conclude the overseer itself with an error. #[test] fn overseer_panics_on_subsystem_exit() { - let spawner = executor::ThreadPool::new().unwrap(); + let spawner = sp_core::testing::SpawnBlockingExecutor::new(); executor::block_on(async move { let (s1_tx, _) = mpsc::channel(64); @@ -1124,21 +1142,24 @@ mod tests { fn start(self, mut ctx: C) -> SpawnedSubsystem { let mut sender = self.0.clone(); - SpawnedSubsystem(Box::pin(async move { - loop { - match ctx.try_recv().await { - Ok(Some(FromOverseer::Signal(OverseerSignal::Conclude))) => break, - Ok(Some(FromOverseer::Signal(s))) => { - sender.send(s).await.unwrap(); - continue; - }, - Ok(Some(_)) => continue, - Err(_) => return, - _ => (), + SpawnedSubsystem { + name: "test-subsystem-5", + future: Box::pin(async move { + loop { + match ctx.try_recv().await { + Ok(Some(FromOverseer::Signal(OverseerSignal::Conclude))) => break, + Ok(Some(FromOverseer::Signal(s))) => { + sender.send(s).await.unwrap(); + continue; + }, + Ok(Some(_)) => continue, + Err(_) => return, + _ => (), + } + pending!(); } - pending!(); - } - })) + }), + } } } @@ -1150,21 +1171,24 @@ mod tests { fn start(self, mut ctx: C) -> SpawnedSubsystem { let mut sender = self.0.clone(); - SpawnedSubsystem(Box::pin(async move { - loop { - match ctx.try_recv().await { - Ok(Some(FromOverseer::Signal(OverseerSignal::Conclude))) => break, - Ok(Some(FromOverseer::Signal(s))) => { - sender.send(s).await.unwrap(); - continue; - }, - Ok(Some(_)) => continue, - Err(_) => return, - _ => (), + SpawnedSubsystem { + name: "test-subsystem-6", + future: Box::pin(async move { + loop { + match ctx.try_recv().await { + Ok(Some(FromOverseer::Signal(OverseerSignal::Conclude))) => break, + Ok(Some(FromOverseer::Signal(s))) => { + sender.send(s).await.unwrap(); + continue; + }, + Ok(Some(_)) => continue, + Err(_) => return, + _ => (), + } + pending!(); } - pending!(); - } - })) + }), + } } } @@ -1172,7 +1196,7 @@ mod tests { // notifications on imported blocks triggers expected `StartWork` and `StopWork` heartbeats. #[test] fn overseer_start_stop_works() { - let spawner = executor::ThreadPool::new().unwrap(); + let spawner = sp_core::testing::SpawnBlockingExecutor::new(); executor::block_on(async move { let first_block_hash = [1; 32].into(); @@ -1267,7 +1291,7 @@ mod tests { // notifications on imported blocks triggers expected `StartWork` and `StopWork` heartbeats. #[test] fn overseer_finalize_works() { - let spawner = executor::ThreadPool::new().unwrap(); + let spawner = sp_core::testing::SpawnBlockingExecutor::new(); executor::block_on(async move { let first_block_hash = [1; 32].into(); diff --git a/node/primitives/Cargo.toml b/node/primitives/Cargo.toml index b2bc9231ae..aea4cca3b7 100644 --- a/node/primitives/Cargo.toml +++ b/node/primitives/Cargo.toml @@ -11,3 +11,4 @@ polkadot-statement-table = { path = "../../statement-table" } parity-scale-codec = { version = "1.3.0", default-features = false, features = ["derive"] } runtime_primitives = { package = "sp-runtime", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } async-trait = "0.1" +sp-core = { git = "https://github.com/paritytech/substrate", branch = "master" } diff --git a/node/primitives/src/lib.rs b/node/primitives/src/lib.rs index f29be57374..6630199ae5 100644 --- a/node/primitives/src/lib.rs +++ b/node/primitives/src/lib.rs @@ -35,6 +35,8 @@ use polkadot_statement_table::{ v1::Misbehavior as TableMisbehavior, }; +pub use sp_core::traits::SpawnNamed; + /// A statement, where the candidate receipt is included in the `Seconded` variant. /// /// This is the committed candidate receipt instead of the bare candidate receipt. As such, diff --git a/node/service/src/lib.rs b/node/service/src/lib.rs index 70867092c7..6d5cdbda42 100644 --- a/node/service/src/lib.rs +++ b/node/service/src/lib.rs @@ -33,6 +33,7 @@ use polkadot_overseer::{self as overseer, AllSubsystems, BlockInfo, Overseer, Ov use polkadot_subsystem::DummySubsystem; use polkadot_node_core_proposer::ProposerFactory; use sp_trie::PrefixedMemoryDB; +use sp_core::traits::SpawnNamed; pub use service::{ Role, PruningMode, TransactionPoolOptions, Error, RuntimeGenesis, TFullClient, TLightClient, TFullBackend, TLightBackend, TFullCallExecutor, TLightCallExecutor, @@ -269,7 +270,7 @@ macro_rules! new_full_start { }} } -fn real_overseer( +fn real_overseer( leaves: impl IntoIterator, s: S, ) -> Result<(Overseer, OverseerHandler), ServiceError> { diff --git a/node/subsystem/src/lib.rs b/node/subsystem/src/lib.rs index b6c3a79ef3..8637db45a2 100644 --- a/node/subsystem/src/lib.rs +++ b/node/subsystem/src/lib.rs @@ -101,7 +101,12 @@ impl From for SubsystemError { /// An asynchronous subsystem task.. /// /// In essence it's just a newtype wrapping a `BoxFuture`. -pub struct SpawnedSubsystem(pub BoxFuture<'static, ()>); +pub struct SpawnedSubsystem { + /// Name of the subsystem being spawned. + pub name: &'static str, + /// The task of the subsystem being spawned. + pub future: BoxFuture<'static, ()>, +} /// A `Result` type that wraps [`SubsystemError`]. /// @@ -130,7 +135,7 @@ pub trait SubsystemContext: Send + 'static { async fn recv(&mut self) -> SubsystemResult>; /// Spawn a child task on the executor. - async fn spawn(&mut self, s: Pin + Send>>) -> SubsystemResult<()>; + async fn spawn(&mut self, name: &'static str, s: Pin + Send>>) -> SubsystemResult<()>; /// Send a direct message to some other `Subsystem`, routed based on message type. async fn send_message(&mut self, msg: AllMessages) -> SubsystemResult<()>; @@ -159,7 +164,7 @@ pub struct DummySubsystem; impl Subsystem for DummySubsystem { fn start(self, mut ctx: C) -> SpawnedSubsystem { - SpawnedSubsystem(Box::pin(async move { + let future = Box::pin(async move { loop { match ctx.recv().await { Ok(FromOverseer::Signal(OverseerSignal::Conclude)) => return, @@ -167,6 +172,11 @@ impl Subsystem for DummySubsystem { _ => continue, } } - })) + }); + + SpawnedSubsystem { + name: "DummySubsystem", + future, + } } } diff --git a/node/subsystem/src/util.rs b/node/subsystem/src/util.rs index 1b89bfb053..94bb95c26d 100644 --- a/node/subsystem/src/util.rs +++ b/node/subsystem/src/util.rs @@ -30,7 +30,7 @@ use futures::{ prelude::*, select, stream::Stream, - task::{self, Spawn, SpawnError, SpawnExt}, + task, }; use futures_timer::Delay; use keystore::KeyStorePtr; @@ -40,7 +40,10 @@ use polkadot_primitives::v1::{ EncodeAs, Hash, HeadData, Id as ParaId, Signed, SigningContext, ValidatorId, ValidatorIndex, ValidatorPair, }; -use sp_core::Pair; +use sp_core::{ + Pair, + traits::SpawnNamed, +}; use std::{ collections::HashMap, convert::{TryFrom, TryInto}, @@ -64,9 +67,6 @@ pub enum Error { /// Attempted to send on a MPSC channel which has been canceled #[from] Mpsc(mpsc::SendError), - /// Attempted to spawn a new task, and failed - #[from] - Spawn(SpawnError), /// Attempted to convert from an AllMessages to a FromJob, and failed. SenderConversion(String), /// The local node is not a validator. @@ -358,7 +358,7 @@ pub struct Jobs { job: std::marker::PhantomData, } -impl Jobs { +impl Jobs { /// Create a new Jobs manager which handles spawning appropriate jobs. pub fn new(spawner: Spawner) -> Self { Self { @@ -391,7 +391,7 @@ impl Jobs { let _ = future.await; let _ = finished_tx.send(()); }; - self.spawner.spawn(future)?; + self.spawner.spawn(Job::NAME, future.boxed()); // this handle lets us remove the appropriate receiver from self.outgoing_msgs // when it's time to stop the job. @@ -444,7 +444,7 @@ impl PinnedDrop for Jobs { impl Stream for Jobs where - Spawner: Spawn, + Spawner: SpawnNamed, Job: JobTrait, { type Item = Job::FromJob; @@ -476,7 +476,7 @@ pub struct JobManager { impl JobManager where - Spawner: Spawn + Clone + Send + Unpin, + Spawner: SpawnNamed + Clone + Send + Unpin, Context: SubsystemContext, Job: JobTrait, Job::RunArgs: Clone, @@ -595,7 +595,7 @@ where impl Subsystem for JobManager where - Spawner: Spawn + Send + Clone + Unpin + 'static, + Spawner: SpawnNamed + Send + Clone + Unpin + 'static, Context: SubsystemContext, ::Message: Into, Job: JobTrait + Send, @@ -606,8 +606,13 @@ where let spawner = self.spawner.clone(); let run_args = self.run_args.clone(); - SpawnedSubsystem(Box::pin(async move { + let future = Box::pin(async move { Self::run(ctx, run_args, spawner).await; - })) + }); + + SpawnedSubsystem { + name: "JobManager", + future, + } } } diff --git a/node/test-helpers/subsystem/Cargo.toml b/node/test-helpers/subsystem/Cargo.toml index 0fc26a24ea..8175a5a6b1 100644 --- a/node/test-helpers/subsystem/Cargo.toml +++ b/node/test-helpers/subsystem/Cargo.toml @@ -10,3 +10,4 @@ futures = "0.3.5" async-trait = "0.1" polkadot-subsystem = { package = "polkadot-node-subsystem", path = "../../subsystem" } parking_lot = "0.10.0" +sp-core = { git = "https://github.com/paritytech/substrate", branch = "master" } diff --git a/node/test-helpers/subsystem/src/lib.rs b/node/test-helpers/subsystem/src/lib.rs index c99a33c78d..5fa7f0b9ec 100644 --- a/node/test-helpers/subsystem/src/lib.rs +++ b/node/test-helpers/subsystem/src/lib.rs @@ -21,9 +21,9 @@ use polkadot_subsystem::messages::AllMessages; use futures::prelude::*; use futures::channel::mpsc; -use futures::task::{Spawn, SpawnExt}; use futures::poll; use parking_lot::Mutex; +use sp_core::traits::SpawnNamed; use std::convert::Infallible; use std::pin::Pin; @@ -155,7 +155,7 @@ pub struct TestSubsystemContext { } #[async_trait::async_trait] -impl SubsystemContext for TestSubsystemContext { +impl SubsystemContext for TestSubsystemContext { type Message = M; async fn try_recv(&mut self) -> Result>, ()> { @@ -170,8 +170,11 @@ impl SubsystemContext for TestSubs self.rx.next().await.ok_or(SubsystemError) } - async fn spawn(&mut self, s: Pin + Send>>) -> SubsystemResult<()> { - self.spawn.spawn(s).map_err(Into::into) + async fn spawn(&mut self, name: &'static str, s: Pin + Send>>) + -> SubsystemResult<()> + { + self.spawn.spawn(name, s); + Ok(()) } async fn send_message(&mut self, msg: AllMessages) -> SubsystemResult<()> { -- GitLab From 5d7142f19789c00c2b995328d813a48d1a6fbaaa Mon Sep 17 00:00:00 2001 From: Robert Habermeier Date: Sat, 18 Jul 2020 16:01:51 -0400 Subject: [PATCH 077/192] Implement Runtime APIs (#1411) * create a README on Runtime APIs * add ParaId type * write up runtime APIs * more preamble * rename * rejig runtime APIs * add occupied_since to `BlockNumber` * skeleton crate for runtime API subsystem * improve group_for_core * improve docs on availability cores runtime API * guide: freed -> free * add primitives for runtime APIs * create a v1 ParachainHost API trait * guide: make validation code return `Option`al. * skeleton runtime API helpers * make parachain-host runtime-generic * skeleton for most runtime API implementation functions * guide: add runtime API helper methods * implement new helpers of the inclusion module * guide: remove retries check, as it is unneeded * implement helpers for scheduler module for Runtime APIs * clean up `validator_groups` implementation * implement next_rotation_at and last_rotation_at * guide: more helpers on GroupRotationInfo * almost finish implementing runtime APIs * add explicit block parameter to runtime API fns * guide: generalize number parameter * guide: add group_responsible to occupied-core * update primitives due to guide changes * finishing touches on runtime API implementation; squash warnings * break out runtime API impl to separate file * add tests for next_up logic * test group rotation info * point to filed TODO * remove unused TODO [now] * indentation * guide: para -> para_id * rename para field to para_id for core meta * remove reference to outdated AvailabilityCores type * add an event in `inclusion` for candidates being included or timing out * guide: candidate events * guide: adjust language * Candidate events type from guide and adjust inclusion event * implement `candidate_events` runtime API * fix runtime test compilation * max -> min * fix typos * guide: add `RuntimeAPIRequest::CandidateEvents` --- Cargo.lock | 2 + node/core/README.md | 2 +- node/core/runtime-api/Cargo.toml | 22 + node/core/runtime-api/src/lib.rs | 22 + node/network/pov-distribution/src/lib.rs | 1 - primitives/Cargo.toml | 2 + primitives/src/v1.rs | 235 ++++++++++- .../src/runtime-api/README.md | 39 +- .../src/runtime/inclusion.md | 3 + .../src/runtime/scheduler.md | 3 + .../src/types/overseer-protocol.md | 4 +- runtime/parachains/Cargo.toml | 2 + runtime/parachains/src/inclusion.rs | 126 +++++- runtime/parachains/src/lib.rs | 2 + runtime/parachains/src/mock.rs | 16 +- .../parachains/src/runtime_api_impl/mod.rs | 23 + runtime/parachains/src/runtime_api_impl/v1.rs | 287 +++++++++++++ runtime/parachains/src/scheduler.rs | 393 +++++++++++++++++- 18 files changed, 1151 insertions(+), 33 deletions(-) create mode 100644 node/core/runtime-api/Cargo.toml create mode 100644 node/core/runtime-api/src/lib.rs create mode 100644 runtime/parachains/src/runtime_api_impl/mod.rs create mode 100644 runtime/parachains/src/runtime_api_impl/v1.rs diff --git a/Cargo.lock b/Cargo.lock index 55b034e1c2..7128dd1e70 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4633,6 +4633,7 @@ dependencies = [ "serde", "sp-api", "sp-application-crypto", + "sp-arithmetic", "sp-core", "sp-inherents", "sp-runtime", @@ -4829,6 +4830,7 @@ dependencies = [ "sp-staking", "sp-std", "sp-trie", + "sp-version", ] [[package]] diff --git a/node/core/README.md b/node/core/README.md index a53faa966a..1656bb569f 100644 --- a/node/core/README.md +++ b/node/core/README.md @@ -1 +1 @@ -Stub - This folder will hold core subsystem implementations, each with their own crate. +This folder contains core subsystems, each with their own crate. diff --git a/node/core/runtime-api/Cargo.toml b/node/core/runtime-api/Cargo.toml new file mode 100644 index 0000000000..14a0ce5540 --- /dev/null +++ b/node/core/runtime-api/Cargo.toml @@ -0,0 +1,22 @@ +[package] +name = "polkadot-node-core-runtime-api" +version = "0.1.0" +authors = ["Parity Technologies "] +edition = "2018" + +[dependencies] +futures = "0.3.5" +log = "0.4.8" +sp-api = { git = "https://github.com/paritytech/substrate", branch = "master" } +sc-client-api = { git = "https://github.com/paritytech/substrate", branch = "master" } +sp-blockchain = { git = "https://github.com/paritytech/substrate", branch = "master" } +primitives = { package = "sp-core", git = "https://github.com/paritytech/substrate", branch = "master" } + +polkadot-primitives = { path = "../../../primitives" } +polkadot-node-primitives = { path = "../../primitives" } +polkadot-subsystem = { package = "polkadot-node-subsystem", path = "../../subsystem" } + +[dev-dependencies] +futures = { version = "0.3.5", features = ["thread-pool"] } +subsystem-test = { package = "polkadot-subsystem-test-helpers", path = "../../test-helpers/subsystem" } +assert_matches = "1.3.0" diff --git a/node/core/runtime-api/src/lib.rs b/node/core/runtime-api/src/lib.rs new file mode 100644 index 0000000000..0e1023b8c4 --- /dev/null +++ b/node/core/runtime-api/src/lib.rs @@ -0,0 +1,22 @@ +// Copyright 2020 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 . + +//! Implements the Runtime API Subsystem +//! +//! This provides a clean, ownerless wrapper around the parachain-related runtime APIs. This crate +//! can also be used to cache responses from heavy runtime APIs. +//! +//! TODO: https://github.com/paritytech/polkadot/issues/1419 implement this. diff --git a/node/network/pov-distribution/src/lib.rs b/node/network/pov-distribution/src/lib.rs index ea5365f8fc..8a7c0fa7a5 100644 --- a/node/network/pov-distribution/src/lib.rs +++ b/node/network/pov-distribution/src/lib.rs @@ -1386,7 +1386,6 @@ mod tests { }); } - // TODO [now] awaiting peer sending us something is no longer awaiting. #[test] fn peer_completing_request_no_longer_awaiting() { let hash_a: Hash = [0; 32].into(); diff --git a/primitives/Cargo.toml b/primitives/Cargo.toml index b2f1373b05..877f03199d 100644 --- a/primitives/Cargo.toml +++ b/primitives/Cargo.toml @@ -14,6 +14,7 @@ sp-api = { git = "https://github.com/paritytech/substrate", branch = "master", d sp-version = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } sp-std = { package = "sp-std", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } sp-staking = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +sp-arithmetic = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } runtime_primitives = { package = "sp-runtime", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } polkadot-parachain = { path = "../parachain", default-features = false } polkadot-core-primitives = { path = "../core-primitives", default-features = false } @@ -37,6 +38,7 @@ std = [ "sp-std/std", "sp-version/std", "sp-staking/std", + "sp-arithmetic/std", "runtime_primitives/std", "serde", "polkadot-parachain/std", diff --git a/primitives/src/v1.rs b/primitives/src/v1.rs index 9fb3d1662e..796dd4fb31 100644 --- a/primitives/src/v1.rs +++ b/primitives/src/v1.rs @@ -23,6 +23,7 @@ use bitvec::vec::BitVec; use primitives::RuntimeDebug; use runtime_primitives::traits::AppVerify; use inherents::InherentIdentifier; +use sp_arithmetic::traits::{BaseArithmetic, Saturating, Zero}; use runtime_primitives::traits::{BlakeTwo256, Hash as HashT}; @@ -50,6 +51,8 @@ pub use crate::v0::{ #[cfg(feature = "std")] pub use crate::v0::{ValidatorPair, CollatorPair}; +pub use sp_staking::SessionIndex; + /// Unique identifier for the Inclusion Inherent pub const INCLUSION_INHERENT_IDENTIFIER: InherentIdentifier = *b"inclusn0"; @@ -139,13 +142,13 @@ impl CandidateReceipt { /// All data pertaining to the execution of a para candidate. #[derive(PartialEq, Eq, Clone, Encode, Decode)] #[cfg_attr(feature = "std", derive(Debug, Default))] -pub struct FullCandidateReceipt { +pub struct FullCandidateReceipt { /// The inner candidate receipt. pub inner: CandidateReceipt, /// The global validation schedule. - pub global_validation: GlobalValidationSchedule, + pub global_validation: GlobalValidationSchedule, /// The local validation data. - pub local_validation: LocalValidationData, + pub local_validation: LocalValidationData, } /// A candidate-receipt with commitments directly included. @@ -202,7 +205,7 @@ impl Ord for CommittedCandidateReceipt { /// to fully validate the candidate. These fields are parachain-specific. #[derive(PartialEq, Eq, Clone, Encode, Decode)] #[cfg_attr(feature = "std", derive(Debug, Default))] -pub struct LocalValidationData { +pub struct LocalValidationData { /// The parent head-data. pub parent_head: HeadData, /// The balance of the parachain at the moment of validation. @@ -220,7 +223,7 @@ pub struct LocalValidationData { /// height. This may be equal to the current perceived relay-chain block height, in /// which case the code upgrade should be applied at the end of the signaling /// block. - pub code_upgrade_allowed: Option, + pub code_upgrade_allowed: Option, } /// Extra data that is needed along with the other fields in a `CandidateReceipt` @@ -229,13 +232,13 @@ pub struct LocalValidationData { /// These are global parameters that apply to all candidates in a block. #[derive(PartialEq, Eq, Clone, Encode, Decode)] #[cfg_attr(feature = "std", derive(Debug, Default))] -pub struct GlobalValidationSchedule { +pub struct GlobalValidationSchedule { /// The maximum code size permitted, in bytes. pub max_code_size: u32, /// The maximum head-data size permitted, in bytes. pub max_head_data_size: u32, /// The relay-chain block number this is in the context of. - pub block_number: BlockNumber, + pub block_number: N, } /// Commitments made in a `CandidateReceipt`. Many of these are outputs of validation. @@ -476,3 +479,221 @@ pub struct AvailableData { /// The omitted validation data. pub omitted_validation: OmittedValidationData, } + +/// A helper data-type for tracking validator-group rotations. +#[derive(Clone, Encode, Decode)] +#[cfg_attr(feature = "std", derive(PartialEq, Debug))] +pub struct GroupRotationInfo { + /// The block number where the session started. + pub session_start_block: N, + /// How often groups rotate. 0 means never. + pub group_rotation_frequency: N, + /// The current block number. + pub now: N, +} + +impl GroupRotationInfo { + /// Returns the index of the group needed to validate the core at the given index, assuming + /// the given number of cores. + /// + /// `core_index` should be less than `cores`, which is capped at u32::max(). + pub fn group_for_core(&self, core_index: CoreIndex, cores: usize) -> GroupIndex { + if self.group_rotation_frequency == 0 { return GroupIndex(core_index.0) } + if cores == 0 { return GroupIndex(0) } + + let cores = sp_std::cmp::min(cores, u32::max_value() as usize); + let blocks_since_start = self.now.saturating_sub(self.session_start_block); + let rotations = blocks_since_start / self.group_rotation_frequency; + + let idx = (core_index.0 as usize + rotations as usize) % cores; + GroupIndex(idx as u32) + } +} + +impl GroupRotationInfo { + /// Returns the block number of the next rotation after the current block. If the current block + /// is 10 and the rotation frequency is 5, this should return 15. + /// + /// If the group rotation frequency is 0, returns 0. + pub fn next_rotation_at(&self) -> N { + if self.group_rotation_frequency.is_zero() { return Zero::zero() } + + let cycle_once = self.now + self.group_rotation_frequency; + cycle_once - ( + cycle_once.saturating_sub(self.session_start_block) % self.group_rotation_frequency + ) + } + + /// Returns the block number of the last rotation before or including the current block. If the + /// current block is 10 and the rotation frequency is 5, this should return 10. + /// + /// If the group rotation frequency is 0, returns 0. + pub fn last_rotation_at(&self) -> N { + if self.group_rotation_frequency.is_zero() { return Zero::zero() } + self.now - ( + self.now.saturating_sub(self.session_start_block) % self.group_rotation_frequency + ) + } +} + +/// Information about a core which is currently occupied. +#[derive(Clone, Encode, Decode)] +#[cfg_attr(feature = "std", derive(PartialEq, Debug))] +pub struct OccupiedCore { + /// The ID of the para occupying the core. + pub para_id: Id, + /// If this core is freed by availability, this is the assignment that is next up on this + /// core, if any. None if there is nothing queued for this core. + pub next_up_on_available: Option, + /// The relay-chain block number this began occupying the core at. + pub occupied_since: N, + /// The relay-chain block this will time-out at, if any. + pub time_out_at: N, + /// If this core is freed by being timed-out, this is the assignment that is next up on this + /// core. None if there is nothing queued for this core or there is no possibility of timing + /// out. + pub next_up_on_time_out: Option, + /// A bitfield with 1 bit for each validator in the set. `1` bits mean that the corresponding + /// validators has attested to availability on-chain. A 2/3+ majority of `1` bits means that + /// this will be available. + pub availability: BitVec, + /// The group assigned to distribute availability pieces of this candidate. + pub group_responsible: GroupIndex, +} + +/// Information about a core which is currently occupied. +#[derive(Clone, Encode, Decode)] +#[cfg_attr(feature = "std", derive(PartialEq, Debug))] +pub struct ScheduledCore { + /// The ID of a para scheduled. + pub para_id: Id, + /// The collator required to author the block, if any. + pub collator: Option, +} + +/// The state of a particular availability core. +#[derive(Clone, Encode, Decode)] +#[cfg_attr(feature = "std", derive(PartialEq, Debug))] +pub enum CoreState { + /// The core is currently occupied. + #[codec(index = "0")] + Occupied(OccupiedCore), + /// The core is currently free, with a para scheduled and given the opportunity + /// to occupy. + /// + /// If a particular Collator is required to author this block, that is also present in this + /// variant. + #[codec(index = "1")] + Scheduled(ScheduledCore), + /// The core is currently free and there is nothing scheduled. This can be the case for parathread + /// cores when there are no parathread blocks queued. Parachain cores will never be left idle. + #[codec(index = "2")] + Free, +} + +/// An assumption being made about the state of an occupied core. +#[derive(Clone, Encode, Decode)] +#[cfg_attr(feature = "std", derive(PartialEq, Debug))] +pub enum OccupiedCoreAssumption { + /// The candidate occupying the core was made available and included to free the core. + #[codec(index = "0")] + Included, + /// The candidate occupying the core timed out and freed the core without advancing the para. + #[codec(index = "1")] + TimedOut, + /// The core was not occupied to begin with. + #[codec(index = "2")] + Free, +} + +/// An even concerning a candidate. +#[derive(Clone, Encode, Decode)] +#[cfg_attr(feature = "std", derive(PartialEq, Debug))] +pub enum CandidateEvent { + /// This candidate receipt was backed in the most recent block. + #[codec(index = "0")] + CandidateBacked(CandidateReceipt, HeadData), + /// This candidate receipt was included and became a parablock at the most recent block. + #[codec(index = "1")] + CandidateIncluded(CandidateReceipt, HeadData), + /// This candidate receipt was not made available in time and timed out. + #[codec(index = "2")] + CandidateTimedOut(CandidateReceipt, HeadData), +} + +sp_api::decl_runtime_apis! { + /// The API for querying the state of parachains on-chain. + pub trait ParachainHost { + /// Get the current validators. + fn validators() -> Vec; + + /// Returns the validator groups and rotation info localized based on the block whose state + /// this is invoked on. Note that `now` in the `GroupRotationInfo` should be the successor of + /// the number of the block. + fn validator_groups() -> (Vec>, GroupRotationInfo); + + /// Yields information on all availability cores. Cores are either free or occupied. Free + /// cores can have paras assigned to them. + fn availability_cores() -> Vec>; + + /// Yields the GlobalValidationSchedule. This applies to all para candidates with the + /// relay-parent equal to the block in which context this is invoked in. + fn global_validation_schedule() -> GlobalValidationSchedule; + + /// Yields the LocalValidationData for the given ParaId along with an assumption that + /// should be used if the para currently occupies a core. + /// + /// Returns `None` if either the para is not registered or the assumption is `Freed` + /// and the para already occupies a core. + fn local_validation_data(para_id: Id, assumption: OccupiedCoreAssumption) + -> Option>; + + /// Returns the session index expected at a child of the block. + /// + /// This can be used to instantiate a `SigningContext`. + fn session_index_for_child() -> SessionIndex; + + /// Fetch the validation code used by a para, making the given `OccupiedCoreAssumption`. + /// + /// Returns `None` if either the para is not registered or the assumption is `Freed` + /// and the para already occupies a core. + fn validation_code(para_id: Id, assumption: OccupiedCoreAssumption) + -> Option; + + /// Get the receipt of a candidate pending availability. This returns `Some` for any paras + /// assigned to occupied cores in `availability_cores` and `None` otherwise. + fn candidate_pending_availability(para_id: Id) -> Option>; + + /// Get a vector of events concerning candidates that occurred within a block. + // NOTE: this needs to skip block initialization as events are wiped within block + // initialization. + #[skip_initialize_block] + fn candidate_events() -> Vec>; + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn group_rotation_info_calculations() { + let info = GroupRotationInfo { + session_start_block: 10u32, + now: 15, + group_rotation_frequency: 5, + }; + + assert_eq!(info.next_rotation_at(), 20); + assert_eq!(info.last_rotation_at(), 15); + + let info = GroupRotationInfo { + session_start_block: 10u32, + now: 11, + group_rotation_frequency: 0, + }; + + assert_eq!(info.next_rotation_at(), 0); + assert_eq!(info.last_rotation_at(), 0); + } +} diff --git a/roadmap/implementers-guide/src/runtime-api/README.md b/roadmap/implementers-guide/src/runtime-api/README.md index 4631fab30b..4f36ac5d10 100644 --- a/roadmap/implementers-guide/src/runtime-api/README.md +++ b/roadmap/implementers-guide/src/runtime-api/README.md @@ -59,7 +59,19 @@ struct GroupRotationInfo { impl GroupRotationInfo { /// Returns the index of the group needed to validate the core at the given index, /// assuming the given amount of cores/groups. - fn group_for_core(core_index: usize, cores: usize) -> usize; + fn group_for_core(&self, core_index, cores) -> GroupIndex; + + /// Returns the block number of the next rotation after the current block. If the current block + /// is 10 and the rotation frequency is 5, this should return 15. + /// + /// If the group rotation frequency is 0, returns 0. + fn next_rotation_at(&self) -> BlockNumber; + + /// Returns the block number of the last rotation before or including the current block. If the + /// current block is 10 and the rotation frequency is 5, this should return 10. + /// + /// If the group rotation frequency is 0, returns 0. + fn last_rotation_at(&self) -> BlockNumber; } /// Returns the validator groups and rotation info localized based on the block whose state @@ -81,7 +93,7 @@ This is all the information that a validator needs about scheduling for the curr ```rust struct OccupiedCore { /// The ID of the para occupying the core. - para: ParaId, + para_id: ParaId, /// If this core is freed by availability, this is the assignment that is next up on this /// core, if any. None if there is nothing queued for this core. next_up_on_available: Option, @@ -97,11 +109,13 @@ struct OccupiedCore { /// validators has attested to availability on-chain. A 2/3+ majority of `1` bits means that /// this will be available. availability: Bitfield, + /// The group assigned to distribute availability pieces of this candidate. + group_responsible: GroupIndex, } struct ScheduledCore { /// The ID of a para scheduled. - para: ParaId, + para_id: ParaId, /// The collator required to author the block, if any. collator: Option, } @@ -171,7 +185,7 @@ fn session_index_for_child(at: Block) -> SessionIndex; Fetch the validation code used by a para, making the given `OccupiedCoreAssumption`. ```rust -fn validation_code(at: Block, ParaId, OccupiedCoreAssumption) -> ValidationCode; +fn validation_code(at: Block, ParaId, OccupiedCoreAssumption) -> Option; ``` ## Candidate Pending Availability @@ -181,3 +195,20 @@ Get the receipt of a candidate pending availability. This returns `Some` for any ```rust fn candidate_pending_availability(at: Block, ParaId) -> Option; ``` + +## Candidate Events + +Yields a vector of events concerning candidates that occurred within the given block. + +```rust +enum CandidateEvent { + /// This candidate receipt was backed in the most recent block. + CandidateBacked(CandidateReceipt, HeadData), + /// This candidate receipt was included and became a parablock at the most recent block. + CandidateIncluded(CandidateReceipt, HeadData), + /// This candidate receipt was not made available in time and timed out. + CandidateTimedOut(CandidateReceipt, HeadData), +} + +fn candidate_events(at: Block) -> Vec; +``` diff --git a/roadmap/implementers-guide/src/runtime/inclusion.md b/roadmap/implementers-guide/src/runtime/inclusion.md index 7f093261d3..2387a9244a 100644 --- a/roadmap/implementers-guide/src/runtime/inclusion.md +++ b/roadmap/implementers-guide/src/runtime/inclusion.md @@ -84,3 +84,6 @@ All failed checks should lead to an unrecoverable error making the block invalid // return a vector of cleaned-up core IDs. } ``` +* `force_enact(ParaId)`: Forcibly enact the candidate with the given ID as though it had been deemed available by bitfields. Is a no-op if there is no candidate pending availability for this para-id. This should generally not be used but it is useful during execution of Runtime APIs, where the changes to the state are expected to be discarded directly after. +* `candidate_pending_availability(ParaId) -> Option`: returns the `CommittedCandidateReceipt` pending availability for the para provided, if any. +* `pending_availability(ParaId) -> Option`: returns the metadata around the candidate pending availability for the para, if any. diff --git a/roadmap/implementers-guide/src/runtime/scheduler.md b/roadmap/implementers-guide/src/runtime/scheduler.md index efa85a15c4..85ad932b52 100644 --- a/roadmap/implementers-guide/src/runtime/scheduler.md +++ b/roadmap/implementers-guide/src/runtime/scheduler.md @@ -198,3 +198,6 @@ Actions: - `core_para(CoreIndex) -> ParaId`: return the currently-scheduled or occupied ParaId for the given core. - `group_validators(GroupIndex) -> Option>`: return all validators in a given group, if the group index is valid for this session. - `availability_timeout_predicate() -> Option bool>`: returns an optional predicate that should be used for timing out occupied cores. if `None`, no timing-out should be done. The predicate accepts the index of the core, and the block number since which it has been occupied. The predicate should be implemented based on the time since the last validator group rotation, and the respective parachain and parathread timeouts, i.e. only within `max(config.chain_availability_period, config.thread_availability_period)` of the last rotation would this return `Some`. +- `group_rotation_info() -> GroupRotationInfo`: Returns a helper for determining group rotation. +- `next_up_on_available(CoreIndex) -> Option`: Return the next thing that will be scheduled on this core assuming it is currently occupied and the candidate occupying it became available. Returns in `ScheduledCore` format (todo: link to Runtime APIs page; linkcheck doesn't allow this right now). For parachains, this is always the ID of the parachain and no specified collator. For parathreads, this is based on the next item in the `ParathreadQueue` assigned to that core, and is `None` if there isn't one. +- `next_up_on_time_out(CoreIndex) -> Option`: Return the next thing that will be scheduled on this core assuming it is currently occupied and the candidate occupying it timed out. Returns in `ScheduledCore` format (todo: link to Runtime APIs page; linkcheck doesn't allow this right now). For parachains, this is always the ID of the parachain and no specified collator. For parathreads, this is based on the next item in the `ParathreadQueue` assigned to that core, or if there isn't one, the claim that is currently occupying the core. Otherwise `None`. diff --git a/roadmap/implementers-guide/src/types/overseer-protocol.md b/roadmap/implementers-guide/src/types/overseer-protocol.md index 3298d8f65f..d5d5509dd4 100644 --- a/roadmap/implementers-guide/src/types/overseer-protocol.md +++ b/roadmap/implementers-guide/src/types/overseer-protocol.md @@ -252,9 +252,11 @@ enum RuntimeApiRequest { ResponseChannel>, ), /// Get information about all availability cores. - AvailabilityCores(ResponseChannel), + AvailabilityCores(ResponseChannel>), /// Get a committed candidate receipt for all candidates pending availability. CandidatePendingAvailability(ParaId, ResponseChannel>), + /// Get all events concerning candidates in the last block. + CandidateEvents(ResponseChannel>), } enum RuntimeApiMessage { diff --git a/runtime/parachains/Cargo.toml b/runtime/parachains/Cargo.toml index ab4ca5a783..4563a05e10 100644 --- a/runtime/parachains/Cargo.toml +++ b/runtime/parachains/Cargo.toml @@ -49,6 +49,8 @@ pallet-staking-reward-curve = { git = "https://github.com/paritytech/substrate", treasury = { package = "pallet-treasury", git = "https://github.com/paritytech/substrate", branch = "master" } serde_json = "1.0.41" libsecp256k1 = "0.3.2" +sp-version = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } + [features] default = ["std"] diff --git a/runtime/parachains/src/inclusion.rs b/runtime/parachains/src/inclusion.rs index 10c019bbe1..435342cfb8 100644 --- a/runtime/parachains/src/inclusion.rs +++ b/runtime/parachains/src/inclusion.rs @@ -25,12 +25,11 @@ use primitives::v1::{ ValidatorId, CandidateCommitments, CandidateDescriptor, ValidatorIndex, Id as ParaId, AvailabilityBitfield as AvailabilityBitfield, SignedAvailabilityBitfields, SigningContext, BackedCandidate, CoreIndex, GroupIndex, CoreAssignment, CommittedCandidateReceipt, + CandidateReceipt, HeadData, }; use frame_support::{ - decl_storage, decl_module, decl_error, ensure, dispatch::DispatchResult, IterableStorageMap, - weights::Weight, - traits::Get, - debug, + decl_storage, decl_module, decl_error, decl_event, ensure, debug, + dispatch::DispatchResult, IterableStorageMap, weights::Weight, traits::Get, }; use codec::{Encode, Decode}; use bitvec::{order::Lsb0 as BitOrderLsb0, vec::BitVec}; @@ -69,7 +68,28 @@ pub struct CandidatePendingAvailability { backed_in_number: N, } -pub trait Trait: system::Trait + paras::Trait + configuration::Trait { } +impl CandidatePendingAvailability { + /// Get the availability votes on the candidate. + pub(crate) fn availability_votes(&self) -> &BitVec { + &self.availability_votes + } + + /// Get the relay-chain block number this was backed in. + pub(crate) fn backed_in_number(&self) -> &N { + &self.backed_in_number + } + + /// Get the core index. + pub(crate) fn core_occupied(&self)-> CoreIndex { + self.core.clone() + } +} + +pub trait Trait: + system::Trait + paras::Trait + configuration::Trait +{ + type Event: From> + Into<::Event>; +} decl_storage! { trait Store for Module as ParaInclusion { @@ -89,7 +109,7 @@ decl_storage! { Validators get(fn validators) config(validators): Vec; /// The current session index. - CurrentSessionIndex: SessionIndex; + CurrentSessionIndex get(fn session_index): SessionIndex; } } @@ -130,10 +150,25 @@ decl_error! { } } +decl_event! { + pub enum Event where ::Hash { + /// A candidate was backed. + CandidateBacked(CandidateReceipt, HeadData), + /// A candidate was included. + CandidateIncluded(CandidateReceipt, HeadData), + /// A candidate timed out. + CandidateTimedOut(CandidateReceipt, HeadData), + } +} + decl_module! { /// The parachain-candidate inclusion module. - pub struct Module for enum Call where origin: ::Origin, system = system { + pub struct Module + for enum Call where origin: ::Origin, system = system + { type Error = Error; + + fn deposit_event() = default; } } @@ -450,7 +485,17 @@ impl Module { // initialize all availability votes to 0. let availability_votes: BitVec = bitvec::bitvec![BitOrderLsb0, u8; 0; validators.len()]; - let (descriptor, commitments) = (candidate.candidate.descriptor, candidate.candidate.commitments); + + Self::deposit_event(Event::::CandidateBacked( + candidate.candidate.to_plain(), + candidate.candidate.commitments.head_data.clone(), + )); + + let (descriptor, commitments) = ( + candidate.candidate.descriptor, + candidate.candidate.commitments, + ); + >::insert(¶_id, CandidatePendingAvailability { core, descriptor, @@ -468,6 +513,7 @@ impl Module { relay_parent_number: T::BlockNumber, receipt: CommittedCandidateReceipt, ) -> Weight { + let plain = receipt.to_plain(); let commitments = receipt.commitments; let config = >::config(); @@ -481,6 +527,10 @@ impl Module { ); } + Self::deposit_event( + Event::::CandidateIncluded(plain, commitments.head_data.clone()) + ); + weight + >::note_new_head( receipt.descriptor.para_id, commitments.head_data, @@ -506,12 +556,66 @@ impl Module { } for para_id in cleaned_up_ids { - >::remove(¶_id); - ::remove(¶_id); + let pending = >::take(¶_id); + let commitments = ::take(¶_id); + + if let (Some(pending), Some(commitments)) = (pending, commitments) { + // defensive: this should always be true. + let candidate = CandidateReceipt { + descriptor: pending.descriptor, + commitments_hash: commitments.hash(), + }; + + Self::deposit_event(Event::::CandidateTimedOut( + candidate, + commitments.head_data, + )); + } } cleaned_up_cores } + + /// Forcibly enact the candidate with the given ID as though it had been deemed available + /// by bitfields. + /// + /// Is a no-op if there is no candidate pending availability for this para-id. + /// This should generally not be used but it is useful during execution of Runtime APIs, + /// where the changes to the state are expected to be discarded directly after. + pub(crate) fn force_enact(para: ParaId) { + let pending = >::take(¶); + let commitments = ::take(¶); + + if let (Some(pending), Some(commitments)) = (pending, commitments) { + let candidate = CommittedCandidateReceipt { + descriptor: pending.descriptor, + commitments, + }; + + Self::enact_candidate( + pending.relay_parent_number, + candidate, + ); + } + } + + /// Returns the CommittedCandidateReceipt pending availability for the para provided, if any. + pub(crate) fn candidate_pending_availability(para: ParaId) + -> Option> + { + >::get(¶) + .map(|p| p.descriptor) + .and_then(|d| ::get(¶).map(move |c| (d, c))) + .map(|(d, c)| CommittedCandidateReceipt { descriptor: d, commitments: c }) + } + + /// Returns the metadata around the candidate pending availability for the + /// para provided, if any. + pub(crate) fn pending_availability(para: ParaId) + -> Option> + { + >::get(¶) + } } const fn availability_threshold(n_validators: usize) -> usize { @@ -527,7 +631,7 @@ mod tests { use primitives::v1::{BlockNumber, Hash}; use primitives::v1::{ SignedAvailabilityBitfield, CompactStatement as Statement, ValidityAttestation, CollatorId, - CandidateCommitments, SignedStatement, CandidateDescriptor, HeadData, ValidationCode, + CandidateCommitments, SignedStatement, CandidateDescriptor, ValidationCode, AssignmentKind, }; use frame_support::traits::{OnFinalize, OnInitialize}; diff --git a/runtime/parachains/src/lib.rs b/runtime/parachains/src/lib.rs index 44554322e4..eb279ad19c 100644 --- a/runtime/parachains/src/lib.rs +++ b/runtime/parachains/src/lib.rs @@ -28,5 +28,7 @@ mod paras; mod scheduler; mod validity; +pub mod runtime_api_impl; + #[cfg(test)] mod mock; diff --git a/runtime/parachains/src/mock.rs b/runtime/parachains/src/mock.rs index 8eb45359da..f7349b8f25 100644 --- a/runtime/parachains/src/mock.rs +++ b/runtime/parachains/src/mock.rs @@ -26,9 +26,10 @@ use sp_runtime::{ }; use primitives::v1::{BlockNumber, Header}; use frame_support::{ - impl_outer_origin, impl_outer_dispatch, parameter_types, + impl_outer_origin, impl_outer_dispatch, impl_outer_event, parameter_types, weights::Weight, traits::Randomness as RandomnessT, }; +use crate::inclusion; /// A test runtime struct. #[derive(Clone, Eq, PartialEq)] @@ -44,6 +45,13 @@ impl_outer_dispatch! { } } +impl_outer_event! { + pub enum TestEvent for Test { + system, + inclusion, + } +} + pub struct TestRandomness; impl RandomnessT for TestRandomness { @@ -70,7 +78,7 @@ impl system::Trait for Test { type AccountId = u64; type Lookup = IdentityLookup; type Header = Header; - type Event = (); + type Event = TestEvent; type BlockHashCount = BlockHashCount; type MaximumBlockWeight = MaximumBlockWeight; type DbWeight = (); @@ -97,7 +105,9 @@ impl crate::paras::Trait for Test { } impl crate::scheduler::Trait for Test { } -impl crate::inclusion::Trait for Test { } +impl crate::inclusion::Trait for Test { + type Event = TestEvent; +} pub type System = system::Module; diff --git a/runtime/parachains/src/runtime_api_impl/mod.rs b/runtime/parachains/src/runtime_api_impl/mod.rs new file mode 100644 index 0000000000..35c26fe35d --- /dev/null +++ b/runtime/parachains/src/runtime_api_impl/mod.rs @@ -0,0 +1,23 @@ +// Copyright 2020 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 . + +//! Runtime API implementations for Parachains. +//! +//! These are exposed as different modules using different sets of primitives. +//! At the moment there is only a v1 module and it is not completely clear how migration +//! to a v2 would be done. + +pub mod v1; diff --git a/runtime/parachains/src/runtime_api_impl/v1.rs b/runtime/parachains/src/runtime_api_impl/v1.rs new file mode 100644 index 0000000000..fa5026dbad --- /dev/null +++ b/runtime/parachains/src/runtime_api_impl/v1.rs @@ -0,0 +1,287 @@ +// Copyright 2020 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. + +//! A module exporting runtime API implementation functions for all runtime APIs using v1 +//! primitives. +//! +//! Runtimes implementing the v1 runtime API are recommended to forward directly to these +//! functions. + +use primitives::v1::{ + ValidatorId, ValidatorIndex, GroupRotationInfo, CoreState, GlobalValidationSchedule, + Id as ParaId, OccupiedCoreAssumption, LocalValidationData, SessionIndex, ValidationCode, + CommittedCandidateReceipt, ScheduledCore, OccupiedCore, CoreOccupied, CoreIndex, + GroupIndex, CandidateEvent, +}; +use sp_runtime::traits::{One, BlakeTwo256, Hash as HashT, Saturating, Zero}; +use frame_support::debug; +use crate::{initializer, inclusion, scheduler, configuration, paras}; + +/// Implementation for the `validators` function of the runtime API. +pub fn validators() -> Vec { + >::validators() +} + +/// Implementation for the `validator_groups` function of the runtime API. +pub fn validator_groups() -> ( + Vec>, + GroupRotationInfo, +) { + let groups = >::validator_groups(); + let rotation_info = >::group_rotation_info(); + + (groups, rotation_info) +} + +/// Implementation for the `availability_cores` function of the runtime API. +pub fn availability_cores() -> Vec> { + let cores = >::availability_cores(); + let parachains = >::parachains(); + let config = >::config(); + + let rotation_info = >::group_rotation_info(); + + let time_out_at = |backed_in_number, availability_period| { + let time_out_at = backed_in_number + availability_period; + + if rotation_info.group_rotation_frequency == Zero::zero() { + return time_out_at; + } + + let current_window = rotation_info.last_rotation_at() + availability_period; + let next_rotation = rotation_info.next_rotation_at(); + + // If we are within `period` blocks of rotation, timeouts are being checked + // actively. We could even time out this block. + if time_out_at < current_window { + time_out_at + } else if time_out_at <= next_rotation { + // Otherwise, it will time out at the sooner of the next rotation + next_rotation + } else { + // or the scheduled time-out. This is by definition within `period` blocks + // of `next_rotation` and is thus a valid timeout block. + time_out_at + } + }; + + let group_responsible_for = |backed_in_number, core_index| { + match >::group_assigned_to_core(core_index, backed_in_number) { + Some(g) => g, + None => { + debug::warn!("Could not determine the group responsible for core extracted \ + from list of cores for some prior block in same session"); + + GroupIndex(0) + } + } + }; + + let mut core_states: Vec<_> = cores.into_iter().enumerate().map(|(i, core)| match core { + Some(occupied) => { + CoreState::Occupied(match occupied { + CoreOccupied::Parachain => { + let para_id = parachains[i]; + let pending_availability = > + ::pending_availability(para_id) + .expect("Occupied core always has pending availability; qed"); + + let backed_in_number = pending_availability.backed_in_number().clone(); + OccupiedCore { + para_id, + next_up_on_available: >::next_up_on_available( + CoreIndex(i as u32) + ), + occupied_since: backed_in_number, + time_out_at: time_out_at( + backed_in_number, + config.chain_availability_period, + ), + next_up_on_time_out: >::next_up_on_time_out( + CoreIndex(i as u32) + ), + availability: pending_availability.availability_votes().clone(), + group_responsible: group_responsible_for( + backed_in_number, + pending_availability.core_occupied(), + ), + } + } + CoreOccupied::Parathread(p) => { + let para_id = p.claim.0; + let pending_availability = > + ::pending_availability(para_id) + .expect("Occupied core always has pending availability; qed"); + + let backed_in_number = pending_availability.backed_in_number().clone(); + OccupiedCore { + para_id, + next_up_on_available: >::next_up_on_available( + CoreIndex(i as u32) + ), + occupied_since: backed_in_number, + time_out_at: time_out_at( + backed_in_number, + config.thread_availability_period, + ), + next_up_on_time_out: >::next_up_on_time_out( + CoreIndex(i as u32) + ), + availability: pending_availability.availability_votes().clone(), + group_responsible: group_responsible_for( + backed_in_number, + pending_availability.core_occupied(), + ), + } + } + }) + } + None => CoreState::Free, + }).collect(); + + // This will overwrite only `Free` cores if the scheduler module is working as intended. + for scheduled in >::scheduled() { + core_states[scheduled.core.0 as usize] = CoreState::Scheduled(ScheduledCore { + para_id: scheduled.para_id, + collator: scheduled.required_collator().map(|c| c.clone()), + }); + } + + core_states +} + +/// Implementation for the `global_validation_schedule` function of the runtime API. +pub fn global_validation_schedule() + -> GlobalValidationSchedule +{ + let config = >::config(); + GlobalValidationSchedule { + max_code_size: config.max_code_size, + max_head_data_size: config.max_head_data_size, + block_number: >::block_number() - One::one(), + } +} + +/// Implementation for the `local_validation_data` function of the runtime API. +pub fn local_validation_data( + para_id: ParaId, + assumption: OccupiedCoreAssumption, +) -> Option> { + let construct = || { + let relay_parent_number = >::block_number() - One::one(); + + let config = >::config(); + let freq = config.validation_upgrade_frequency; + let delay = config.validation_upgrade_delay; + + let last_code_upgrade = >::last_code_upgrade(para_id, true)?; + let can_upgrade_code = last_code_upgrade <= relay_parent_number + && relay_parent_number.saturating_sub(last_code_upgrade) >= freq; + + let code_upgrade_allowed = if can_upgrade_code { + Some(relay_parent_number + delay) + } else { + None + }; + + Some(LocalValidationData { + parent_head: >::para_head(¶_id)?, + balance: 0, + validation_code_hash: BlakeTwo256::hash_of( + &>::current_code(¶_id)? + ), + code_upgrade_allowed, + }) + }; + + match assumption { + OccupiedCoreAssumption::Included => { + >::force_enact(para_id); + construct() + } + OccupiedCoreAssumption::TimedOut => { + construct() + } + OccupiedCoreAssumption::Free => { + if >::pending_availability(para_id).is_some() { + None + } else { + construct() + } + } + } +} + +/// Implementation for the `session_index_for_child` function of the runtime API. +pub fn session_index_for_child() -> SessionIndex { + // Just returns the session index from `inclusion`. Runtime APIs follow + // initialization so the initializer will have applied any pending session change + // which is expected at the child of the block whose context the runtime API was invoked + // in. + // + // Incidentally, this is also the rationale for why it is OK to query validators or + // occupied cores or etc. and expect the correct response "for child". + >::session_index() +} + +/// Implementation for the `validation_code` function of the runtime API. +pub fn validation_code( + para_id: ParaId, + assumption: OccupiedCoreAssumption, +) -> Option { + let fetch = || { + >::current_code(¶_id) + }; + + match assumption { + OccupiedCoreAssumption::Included => { + >::force_enact(para_id); + fetch() + } + OccupiedCoreAssumption::TimedOut => { + fetch() + } + OccupiedCoreAssumption::Free => { + if >::pending_availability(para_id).is_some() { + None + } else { + fetch() + } + } + } +} + +/// Implementation for the `candidate_pending_availability` function of the runtime API. +pub fn candidate_pending_availability(para_id: ParaId) + -> Option> +{ + >::candidate_pending_availability(para_id) +} + +/// Implementation for the `candidate_events` function of the runtime API. +// NOTE: this runs without block initialization, as it accesses events. +// this means it can run in a different session than other runtime APIs at the same block. +pub fn candidate_events( + extract_event: impl Fn(::Event) -> Option>, +) -> Vec> { + use inclusion::Event as RawEvent; + + >::events().into_iter() + .filter_map(|record| extract_event(record.event)) + .map(|event| match event { + RawEvent::::CandidateBacked(c, h) => CandidateEvent::CandidateBacked(c, h), + RawEvent::::CandidateIncluded(c, h) => CandidateEvent::CandidateIncluded(c, h), + RawEvent::::CandidateTimedOut(c, h) => CandidateEvent::CandidateTimedOut(c, h), + }) + .collect() +} diff --git a/runtime/parachains/src/scheduler.rs b/runtime/parachains/src/scheduler.rs index 9cc2bd72bd..977fba582d 100644 --- a/runtime/parachains/src/scheduler.rs +++ b/runtime/parachains/src/scheduler.rs @@ -39,7 +39,7 @@ use sp_std::prelude::*; use sp_std::convert::TryInto; use primitives::v1::{ Id as ParaId, ValidatorIndex, CoreAssignment, CoreOccupied, CoreIndex, AssignmentKind, - GroupIndex, ParathreadClaim, ParathreadEntry, + GroupIndex, ParathreadClaim, ParathreadEntry, GroupRotationInfo, ScheduledCore, }; use frame_support::{ decl_storage, decl_module, decl_error, @@ -84,11 +84,17 @@ impl ParathreadClaimQueue { }) } - // Take next queued entry with given core offset, if any. + /// Take next queued entry with given core offset, if any. fn take_next_on_core(&mut self, core_offset: u32) -> Option { let pos = self.queue.iter().position(|queued| queued.core_offset == core_offset); pos.map(|i| self.queue.remove(i).claim) } + + /// Get the next queued entry with given core offset, if any. + fn get_next_on_core(&self, core_offset: u32) -> Option<&ParathreadEntry> { + let pos = self.queue.iter().position(|queued| queued.core_offset == core_offset); + pos.map(|i| &self.queue[i].claim) + } } /// Reasons a core might be freed @@ -107,7 +113,7 @@ decl_storage! { /// /// Bound: The number of cores is the sum of the numbers of parachains and parathread multiplexers. /// Reasonably, 100-1000. The dominant factor is the number of validators: safe upper bound at 10k. - ValidatorGroups: Vec>; + ValidatorGroups get(fn validator_groups): Vec>; /// A queue of upcoming claims and which core they should be mapped onto. /// @@ -120,14 +126,14 @@ decl_storage! { /// parathread-multiplexers. /// /// Bounded by the number of cores: one for each parachain and parathread multiplexer. - AvailabilityCores: Vec>; + AvailabilityCores get(fn availability_cores): Vec>; /// An index used to ensure that only one claim on a parathread exists in the queue or is /// currently being handled by an occupied core. /// /// Bounded by the number of parathread cores and scheduling lookahead. Reasonably, 10 * 50 = 500. ParathreadClaimIndex: Vec; /// The block number where the session start occurred. Used to track how many group rotations have occurred. - SessionStartBlock: T::BlockNumber; + SessionStartBlock get(fn session_start_block): T::BlockNumber; /// Currently scheduled cores - free but up to be occupied. Ephemeral storage item that's wiped on finalization. /// /// Bounded by the number of cores: one for each parachain and parathread multiplexer. @@ -578,6 +584,86 @@ impl Module { })) } } + + /// Returns a helper for determining group rotation. + pub(crate) fn group_rotation_info() -> GroupRotationInfo { + let session_start_block = Self::session_start_block(); + let now = >::block_number(); + let group_rotation_frequency = >::config() + .parachain_rotation_frequency; + + GroupRotationInfo { + session_start_block, + now, + group_rotation_frequency, + } + } + + /// Return the next thing that will be scheduled on this core assuming it is currently + /// occupied and the candidate occupying it became available. + /// + /// For parachains, this is always the ID of the parachain and no specified collator. + /// For parathreads, this is based on the next item in the ParathreadQueue assigned to that + /// core, and is None if there isn't one. + pub(crate) fn next_up_on_available(core: CoreIndex) -> Option { + let parachains = >::parachains(); + if (core.0 as usize) < parachains.len() { + Some(ScheduledCore { + para_id: parachains[core.0 as usize], + collator: None, + }) + } else { + let queue = ParathreadQueue::get(); + let core_offset = (core.0 as usize - parachains.len()) as u32; + queue.get_next_on_core(core_offset).map(|entry| ScheduledCore { + para_id: entry.claim.0, + collator: Some(entry.claim.1.clone()), + }) + } + } + + /// Return the next thing that will be scheduled on this core assuming it is currently + /// occupied and the candidate occupying it became available. + /// + /// For parachains, this is always the ID of the parachain and no specified collator. + /// For parathreads, this is based on the next item in the ParathreadQueue assigned to that + /// core, or if there isn't one, the claim that is currently occupying the core, as long + /// as the claim's retries would not exceed the limit. Otherwise None. + pub(crate) fn next_up_on_time_out(core: CoreIndex) -> Option { + let parachains = >::parachains(); + if (core.0 as usize) < parachains.len() { + Some(ScheduledCore { + para_id: parachains[core.0 as usize], + collator: None, + }) + } else { + let queue = ParathreadQueue::get(); + + // This is the next scheduled para on this core. + let core_offset = (core.0 as usize - parachains.len()) as u32; + queue.get_next_on_core(core_offset) + .map(|entry| ScheduledCore { + para_id: entry.claim.0, + collator: Some(entry.claim.1.clone()), + }) + .or_else(|| { + // Or, if none, the claim currently occupying the core, + // as it would be put back on the queue after timing out. + let cores = AvailabilityCores::get(); + cores.get(core.0 as usize).and_then(|c| c.as_ref()).and_then(|o| { + match o { + CoreOccupied::Parathread(entry) => { + Some(ScheduledCore { + para_id: entry.claim.0, + collator: Some(entry.claim.1.clone()), + }) + } + CoreOccupied::Parachain => None, // defensive; not possible. + } + }) + }) + } + } } #[cfg(test)] @@ -1440,4 +1526,301 @@ mod tests { assert!(Scheduler::availability_timeout_predicate().is_none()); }); } + + #[test] + fn next_up_on_available_uses_next_scheduled_or_none_for_thread() { + let mut config = default_config(); + config.parathread_cores = 1; + + let genesis_config = MockGenesisConfig { + configuration: crate::configuration::GenesisConfig { + config: config.clone(), + ..Default::default() + }, + ..Default::default() + }; + + let thread_a = ParaId::from(1); + let thread_b = ParaId::from(2); + + let collator = CollatorId::from(Sr25519Keyring::Alice.public()); + + let schedule_blank_para = |id, is_chain| Paras::schedule_para_initialize(id, ParaGenesisArgs { + genesis_head: Vec::new().into(), + validation_code: Vec::new().into(), + parachain: is_chain, + }); + + new_test_ext(genesis_config).execute_with(|| { + schedule_blank_para(thread_a, false); + schedule_blank_para(thread_b, false); + + // start a new session to activate, 5 validators for 5 cores. + run_to_block(1, |number| match number { + 1 => Some(SessionChangeNotification { + new_config: config.clone(), + validators: vec![ + ValidatorId::from(Sr25519Keyring::Alice.public()), + ValidatorId::from(Sr25519Keyring::Eve.public()), + ], + ..Default::default() + }), + _ => None, + }); + + let thread_claim_a = ParathreadClaim(thread_a, collator.clone()); + let thread_claim_b = ParathreadClaim(thread_b, collator.clone()); + + Scheduler::add_parathread_claim(thread_claim_a.clone()); + + run_to_block(2, |_| None); + + { + assert_eq!(Scheduler::scheduled().len(), 1); + assert_eq!(Scheduler::availability_cores().len(), 1); + + Scheduler::occupied(&[CoreIndex(0)]); + + let cores = Scheduler::availability_cores(); + match cores[0].as_ref().unwrap() { + CoreOccupied::Parathread(entry) => assert_eq!(entry.claim, thread_claim_a), + _ => panic!("with no chains, only core should be a thread core"), + } + + assert!(Scheduler::next_up_on_available(CoreIndex(0)).is_none()); + + Scheduler::add_parathread_claim(thread_claim_b); + + let queue = ParathreadQueue::get(); + assert_eq!( + queue.get_next_on_core(0).unwrap().claim, + ParathreadClaim(thread_b, collator.clone()), + ); + + assert_eq!( + Scheduler::next_up_on_available(CoreIndex(0)).unwrap(), + ScheduledCore { + para_id: thread_b, + collator: Some(collator.clone()), + } + ); + } + }); + } + + #[test] + fn next_up_on_time_out_reuses_claim_if_nothing_queued() { + let mut config = default_config(); + config.parathread_cores = 1; + + let genesis_config = MockGenesisConfig { + configuration: crate::configuration::GenesisConfig { + config: config.clone(), + ..Default::default() + }, + ..Default::default() + }; + + let thread_a = ParaId::from(1); + let thread_b = ParaId::from(2); + + let collator = CollatorId::from(Sr25519Keyring::Alice.public()); + + let schedule_blank_para = |id, is_chain| Paras::schedule_para_initialize(id, ParaGenesisArgs { + genesis_head: Vec::new().into(), + validation_code: Vec::new().into(), + parachain: is_chain, + }); + + new_test_ext(genesis_config).execute_with(|| { + schedule_blank_para(thread_a, false); + schedule_blank_para(thread_b, false); + + // start a new session to activate, 5 validators for 5 cores. + run_to_block(1, |number| match number { + 1 => Some(SessionChangeNotification { + new_config: config.clone(), + validators: vec![ + ValidatorId::from(Sr25519Keyring::Alice.public()), + ValidatorId::from(Sr25519Keyring::Eve.public()), + ], + ..Default::default() + }), + _ => None, + }); + + let thread_claim_a = ParathreadClaim(thread_a, collator.clone()); + let thread_claim_b = ParathreadClaim(thread_b, collator.clone()); + + Scheduler::add_parathread_claim(thread_claim_a.clone()); + + run_to_block(2, |_| None); + + { + assert_eq!(Scheduler::scheduled().len(), 1); + assert_eq!(Scheduler::availability_cores().len(), 1); + + Scheduler::occupied(&[CoreIndex(0)]); + + let cores = Scheduler::availability_cores(); + match cores[0].as_ref().unwrap() { + CoreOccupied::Parathread(entry) => assert_eq!(entry.claim, thread_claim_a), + _ => panic!("with no chains, only core should be a thread core"), + } + + let queue = ParathreadQueue::get(); + assert!(queue.get_next_on_core(0).is_none()); + assert_eq!( + Scheduler::next_up_on_time_out(CoreIndex(0)).unwrap(), + ScheduledCore { + para_id: thread_a, + collator: Some(collator.clone()), + } + ); + + Scheduler::add_parathread_claim(thread_claim_b); + + let queue = ParathreadQueue::get(); + assert_eq!( + queue.get_next_on_core(0).unwrap().claim, + ParathreadClaim(thread_b, collator.clone()), + ); + + // Now that there is an earlier next-up, we use that. + assert_eq!( + Scheduler::next_up_on_available(CoreIndex(0)).unwrap(), + ScheduledCore { + para_id: thread_b, + collator: Some(collator.clone()), + } + ); + } + }); + } + + #[test] + fn next_up_on_available_is_parachain_always() { + let mut config = default_config(); + config.parathread_cores = 0; + + let genesis_config = MockGenesisConfig { + configuration: crate::configuration::GenesisConfig { + config: config.clone(), + ..Default::default() + }, + ..Default::default() + }; + + let chain_a = ParaId::from(1); + + let schedule_blank_para = |id, is_chain| Paras::schedule_para_initialize(id, ParaGenesisArgs { + genesis_head: Vec::new().into(), + validation_code: Vec::new().into(), + parachain: is_chain, + }); + + new_test_ext(genesis_config).execute_with(|| { + schedule_blank_para(chain_a, true); + + // start a new session to activate, 5 validators for 5 cores. + run_to_block(1, |number| match number { + 1 => Some(SessionChangeNotification { + new_config: config.clone(), + validators: vec![ + ValidatorId::from(Sr25519Keyring::Alice.public()), + ValidatorId::from(Sr25519Keyring::Eve.public()), + ], + ..Default::default() + }), + _ => None, + }); + + run_to_block(2, |_| None); + + { + assert_eq!(Scheduler::scheduled().len(), 1); + assert_eq!(Scheduler::availability_cores().len(), 1); + + Scheduler::occupied(&[CoreIndex(0)]); + + let cores = Scheduler::availability_cores(); + match cores[0].as_ref().unwrap() { + CoreOccupied::Parachain => {}, + _ => panic!("with no threads, only core should be a chain core"), + } + + // Now that there is an earlier next-up, we use that. + assert_eq!( + Scheduler::next_up_on_available(CoreIndex(0)).unwrap(), + ScheduledCore { + para_id: chain_a, + collator: None, + } + ); + } + }); + } + + #[test] + fn next_up_on_time_out_is_parachain_always() { + let mut config = default_config(); + config.parathread_cores = 0; + + let genesis_config = MockGenesisConfig { + configuration: crate::configuration::GenesisConfig { + config: config.clone(), + ..Default::default() + }, + ..Default::default() + }; + + let chain_a = ParaId::from(1); + + let schedule_blank_para = |id, is_chain| Paras::schedule_para_initialize(id, ParaGenesisArgs { + genesis_head: Vec::new().into(), + validation_code: Vec::new().into(), + parachain: is_chain, + }); + + new_test_ext(genesis_config).execute_with(|| { + schedule_blank_para(chain_a, true); + + // start a new session to activate, 5 validators for 5 cores. + run_to_block(1, |number| match number { + 1 => Some(SessionChangeNotification { + new_config: config.clone(), + validators: vec![ + ValidatorId::from(Sr25519Keyring::Alice.public()), + ValidatorId::from(Sr25519Keyring::Eve.public()), + ], + ..Default::default() + }), + _ => None, + }); + + run_to_block(2, |_| None); + + { + assert_eq!(Scheduler::scheduled().len(), 1); + assert_eq!(Scheduler::availability_cores().len(), 1); + + Scheduler::occupied(&[CoreIndex(0)]); + + let cores = Scheduler::availability_cores(); + match cores[0].as_ref().unwrap() { + CoreOccupied::Parachain => {}, + _ => panic!("with no threads, only core should be a chain core"), + } + + // Now that there is an earlier next-up, we use that. + assert_eq!( + Scheduler::next_up_on_available(CoreIndex(0)).unwrap(), + ScheduledCore { + para_id: chain_a, + collator: None, + } + ); + } + }); + } } -- GitLab From df6c17dd1316d25f6254a07a64f20aea97005ed7 Mon Sep 17 00:00:00 2001 From: Benjamin Kampmann Date: Mon, 20 Jul 2020 10:56:28 +0200 Subject: [PATCH 078/192] CI Regression Test for determinism of our wasm runtimes (#1372) * deterministic build check runtime * fix yaml * Apply suggestions from code review Co-authored-by: s3krit * Update cargo.lock Co-authored-by: s3krit --- .gitlab-ci.yml | 17 +++ Cargo.lock | 280 +++++++++++++++++++++++++------------------------ 2 files changed, 158 insertions(+), 139 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 5e0bf77eef..feb65ace79 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -105,6 +105,23 @@ publish-draft-release: interruptible: true allow_failure: true +test-deterministic-wasm: + stage: test + <<: *docker-env + except: + script: + # build runtime + - WASM_BUILD_NO_COLOR=1 cargo build --verbose --release -p kusama-runtime -p polkadot-runtime -p westend-runtime + # make checksum + - sha256sum target/release/wbuild/target/wasm32-unknown-unknown/release/*.wasm > checksum.sha256 + # clean up – FIXME: can we reuse some of the artifacts? + - cargo clean + # build again + - WASM_BUILD_NO_COLOR=1 cargo build --verbose --release -p kusama-runtime -p polkadot-runtime -p westend-runtime + # confirm checksum + - sha256sum -c checksum.sha256 + + test-linux-stable: &test stage: test <<: *test-refs diff --git a/Cargo.lock b/Cargo.lock index 7128dd1e70..998ec7aef6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1314,7 +1314,7 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "fork-tree" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" +source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" dependencies = [ "parity-scale-codec", ] @@ -1322,7 +1322,7 @@ dependencies = [ [[package]] name = "frame-benchmarking" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" +source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" dependencies = [ "frame-support", "frame-system", @@ -1339,7 +1339,7 @@ dependencies = [ [[package]] name = "frame-benchmarking-cli" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" +source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" dependencies = [ "Inflector", "frame-benchmarking", @@ -1358,7 +1358,7 @@ dependencies = [ [[package]] name = "frame-executive" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" +source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" dependencies = [ "frame-support", "frame-system", @@ -1373,7 +1373,7 @@ dependencies = [ [[package]] name = "frame-metadata" version = "11.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" +source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" dependencies = [ "parity-scale-codec", "serde", @@ -1384,7 +1384,7 @@ dependencies = [ [[package]] name = "frame-support" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" +source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" dependencies = [ "bitmask", "frame-metadata", @@ -1409,7 +1409,7 @@ dependencies = [ [[package]] name = "frame-support-procedural" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" +source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" dependencies = [ "frame-support-procedural-tools", "proc-macro2 1.0.18", @@ -1420,7 +1420,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" +source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" dependencies = [ "frame-support-procedural-tools-derive", "proc-macro-crate", @@ -1432,7 +1432,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools-derive" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" +source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" dependencies = [ "proc-macro2 1.0.18", "quote 1.0.7", @@ -1442,7 +1442,7 @@ dependencies = [ [[package]] name = "frame-system" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" +source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" dependencies = [ "frame-support", "impl-trait-for-tuples", @@ -1458,7 +1458,7 @@ dependencies = [ [[package]] name = "frame-system-benchmarking" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" +source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" dependencies = [ "frame-benchmarking", "frame-support", @@ -1472,7 +1472,7 @@ dependencies = [ [[package]] name = "frame-system-rpc-runtime-api" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" +source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" dependencies = [ "parity-scale-codec", "sp-api", @@ -3466,7 +3466,7 @@ dependencies = [ [[package]] name = "pallet-authority-discovery" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" +source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" dependencies = [ "frame-support", "frame-system", @@ -3482,7 +3482,7 @@ dependencies = [ [[package]] name = "pallet-authorship" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" +source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" dependencies = [ "frame-support", "frame-system", @@ -3497,7 +3497,7 @@ dependencies = [ [[package]] name = "pallet-babe" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" +source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" dependencies = [ "frame-benchmarking", "frame-support", @@ -3522,7 +3522,7 @@ dependencies = [ [[package]] name = "pallet-balances" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" +source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" dependencies = [ "frame-benchmarking", "frame-support", @@ -3536,7 +3536,7 @@ dependencies = [ [[package]] name = "pallet-collective" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" +source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" dependencies = [ "frame-benchmarking", "frame-support", @@ -3552,7 +3552,7 @@ dependencies = [ [[package]] name = "pallet-democracy" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" +source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" dependencies = [ "frame-benchmarking", "frame-support", @@ -3567,7 +3567,7 @@ dependencies = [ [[package]] name = "pallet-elections-phragmen" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" +source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" dependencies = [ "frame-benchmarking", "frame-support", @@ -3582,7 +3582,7 @@ dependencies = [ [[package]] name = "pallet-finality-tracker" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" +source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" dependencies = [ "frame-support", "frame-system", @@ -3598,7 +3598,7 @@ dependencies = [ [[package]] name = "pallet-grandpa" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" +source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" dependencies = [ "frame-benchmarking", "frame-support", @@ -3620,7 +3620,7 @@ dependencies = [ [[package]] name = "pallet-identity" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" +source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" dependencies = [ "enumflags2", "frame-benchmarking", @@ -3636,7 +3636,7 @@ dependencies = [ [[package]] name = "pallet-im-online" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" +source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" dependencies = [ "frame-benchmarking", "frame-support", @@ -3656,7 +3656,7 @@ dependencies = [ [[package]] name = "pallet-indices" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" +source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" dependencies = [ "frame-support", "frame-system", @@ -3672,7 +3672,7 @@ dependencies = [ [[package]] name = "pallet-membership" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" +source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" dependencies = [ "frame-support", "frame-system", @@ -3686,7 +3686,7 @@ dependencies = [ [[package]] name = "pallet-multisig" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" +source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" dependencies = [ "frame-support", "frame-system", @@ -3701,7 +3701,7 @@ dependencies = [ [[package]] name = "pallet-nicks" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" +source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" dependencies = [ "frame-support", "frame-system", @@ -3715,7 +3715,7 @@ dependencies = [ [[package]] name = "pallet-offences" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" +source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" dependencies = [ "frame-support", "frame-system", @@ -3730,7 +3730,7 @@ dependencies = [ [[package]] name = "pallet-offences-benchmarking" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" +source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" dependencies = [ "frame-benchmarking", "frame-support", @@ -3751,7 +3751,7 @@ dependencies = [ [[package]] name = "pallet-proxy" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" +source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" dependencies = [ "frame-support", "frame-system", @@ -3766,7 +3766,7 @@ dependencies = [ [[package]] name = "pallet-randomness-collective-flip" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" +source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" dependencies = [ "frame-support", "frame-system", @@ -3779,7 +3779,7 @@ dependencies = [ [[package]] name = "pallet-recovery" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" +source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" dependencies = [ "enumflags2", "frame-support", @@ -3794,7 +3794,7 @@ dependencies = [ [[package]] name = "pallet-scheduler" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" +source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" dependencies = [ "frame-benchmarking", "frame-support", @@ -3809,7 +3809,7 @@ dependencies = [ [[package]] name = "pallet-session" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" +source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" dependencies = [ "frame-support", "frame-system", @@ -3829,7 +3829,7 @@ dependencies = [ [[package]] name = "pallet-session-benchmarking" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" +source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" dependencies = [ "frame-benchmarking", "frame-support", @@ -3845,7 +3845,7 @@ dependencies = [ [[package]] name = "pallet-society" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" +source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" dependencies = [ "frame-support", "frame-system", @@ -3859,7 +3859,7 @@ dependencies = [ [[package]] name = "pallet-staking" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" +source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" dependencies = [ "frame-benchmarking", "frame-support", @@ -3881,7 +3881,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-curve" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" +source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -3892,7 +3892,7 @@ dependencies = [ [[package]] name = "pallet-sudo" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" +source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" dependencies = [ "frame-support", "frame-system", @@ -3906,7 +3906,7 @@ dependencies = [ [[package]] name = "pallet-timestamp" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" +source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" dependencies = [ "frame-benchmarking", "frame-support", @@ -3924,7 +3924,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" +source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" dependencies = [ "frame-support", "frame-system", @@ -3932,6 +3932,8 @@ dependencies = [ "parity-scale-codec", "serde", "smallvec 1.4.1", + "sp-core", + "sp-io", "sp-runtime", "sp-std", ] @@ -3939,7 +3941,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" +source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" dependencies = [ "jsonrpc-core", "jsonrpc-core-client", @@ -3957,7 +3959,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc-runtime-api" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" +source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" dependencies = [ "frame-support", "parity-scale-codec", @@ -3970,7 +3972,7 @@ dependencies = [ [[package]] name = "pallet-treasury" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" +source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" dependencies = [ "frame-benchmarking", "frame-support", @@ -3985,7 +3987,7 @@ dependencies = [ [[package]] name = "pallet-utility" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" +source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" dependencies = [ "frame-benchmarking", "frame-support", @@ -4001,7 +4003,7 @@ dependencies = [ [[package]] name = "pallet-vesting" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" +source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" dependencies = [ "enumflags2", "frame-benchmarking", @@ -5946,7 +5948,7 @@ dependencies = [ [[package]] name = "sc-authority-discovery" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" +source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" dependencies = [ "bytes 0.5.5", "derive_more 0.99.9", @@ -5973,7 +5975,7 @@ dependencies = [ [[package]] name = "sc-basic-authorship" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" +source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -5997,7 +5999,7 @@ dependencies = [ [[package]] name = "sc-block-builder" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" +source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" dependencies = [ "parity-scale-codec", "sc-client-api", @@ -6014,7 +6016,7 @@ dependencies = [ [[package]] name = "sc-chain-spec" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" +source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" dependencies = [ "impl-trait-for-tuples", "sc-chain-spec-derive", @@ -6030,7 +6032,7 @@ dependencies = [ [[package]] name = "sc-chain-spec-derive" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" +source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -6041,7 +6043,7 @@ dependencies = [ [[package]] name = "sc-cli" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" +source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" dependencies = [ "ansi_term 0.12.1", "atty", @@ -6082,7 +6084,7 @@ dependencies = [ [[package]] name = "sc-client-api" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" +source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" dependencies = [ "derive_more 0.99.9", "fnv", @@ -6118,7 +6120,7 @@ dependencies = [ [[package]] name = "sc-client-db" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" +source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" dependencies = [ "blake2-rfc", "hash-db", @@ -6147,7 +6149,7 @@ dependencies = [ [[package]] name = "sc-consensus" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" +source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" dependencies = [ "sc-client-api", "sp-blockchain", @@ -6158,7 +6160,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" +source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" dependencies = [ "derive_more 0.99.9", "fork-tree", @@ -6200,7 +6202,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe-rpc" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" +source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -6224,7 +6226,7 @@ dependencies = [ [[package]] name = "sc-consensus-epochs" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" +source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" dependencies = [ "fork-tree", "parity-scale-codec", @@ -6237,7 +6239,7 @@ dependencies = [ [[package]] name = "sc-consensus-slots" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" +source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6260,7 +6262,7 @@ dependencies = [ [[package]] name = "sc-consensus-uncles" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" +source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" dependencies = [ "log 0.4.8", "sc-client-api", @@ -6274,7 +6276,7 @@ dependencies = [ [[package]] name = "sc-executor" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" +source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" dependencies = [ "derive_more 0.99.9", "lazy_static", @@ -6302,7 +6304,7 @@ dependencies = [ [[package]] name = "sc-executor-common" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" +source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" dependencies = [ "derive_more 0.99.9", "log 0.4.8", @@ -6319,7 +6321,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmi" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" +source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" dependencies = [ "log 0.4.8", "parity-scale-codec", @@ -6334,7 +6336,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmtime" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" +source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" dependencies = [ "cranelift-codegen", "cranelift-wasm", @@ -6355,7 +6357,7 @@ dependencies = [ [[package]] name = "sc-finality-grandpa" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" +source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" dependencies = [ "assert_matches", "derive_more 0.99.9", @@ -6393,7 +6395,7 @@ dependencies = [ [[package]] name = "sc-finality-grandpa-rpc" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" +source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" dependencies = [ "derive_more 0.99.9", "finality-grandpa", @@ -6410,7 +6412,7 @@ dependencies = [ [[package]] name = "sc-informant" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" +source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" dependencies = [ "ansi_term 0.12.1", "futures 0.3.5", @@ -6428,7 +6430,7 @@ dependencies = [ [[package]] name = "sc-keystore" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" +source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" dependencies = [ "derive_more 0.99.9", "hex", @@ -6444,7 +6446,7 @@ dependencies = [ [[package]] name = "sc-light" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" +source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" dependencies = [ "hash-db", "lazy_static", @@ -6463,7 +6465,7 @@ dependencies = [ [[package]] name = "sc-network" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" +source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" dependencies = [ "bitflags", "bs58", @@ -6515,7 +6517,7 @@ dependencies = [ [[package]] name = "sc-network-gossip" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" +source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6530,7 +6532,7 @@ dependencies = [ [[package]] name = "sc-network-test" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" +source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" dependencies = [ "env_logger", "futures 0.3.5", @@ -6557,7 +6559,7 @@ dependencies = [ [[package]] name = "sc-offchain" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" +source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" dependencies = [ "bytes 0.5.5", "fnv", @@ -6584,7 +6586,7 @@ dependencies = [ [[package]] name = "sc-peerset" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" +source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" dependencies = [ "futures 0.3.5", "libp2p", @@ -6597,7 +6599,7 @@ dependencies = [ [[package]] name = "sc-proposer-metrics" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" +source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" dependencies = [ "log 0.4.8", "substrate-prometheus-endpoint", @@ -6606,7 +6608,7 @@ dependencies = [ [[package]] name = "sc-rpc" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" +source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" dependencies = [ "futures 0.3.5", "hash-db", @@ -6638,7 +6640,7 @@ dependencies = [ [[package]] name = "sc-rpc-api" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" +source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -6662,7 +6664,7 @@ dependencies = [ [[package]] name = "sc-rpc-server" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" +source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" dependencies = [ "jsonrpc-core", "jsonrpc-http-server", @@ -6678,7 +6680,7 @@ dependencies = [ [[package]] name = "sc-service" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" +source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" dependencies = [ "derive_more 0.99.9", "directories", @@ -6740,7 +6742,7 @@ dependencies = [ [[package]] name = "sc-state-db" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" +source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" dependencies = [ "log 0.4.8", "parity-scale-codec", @@ -6754,7 +6756,7 @@ dependencies = [ [[package]] name = "sc-telemetry" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" +source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6775,7 +6777,7 @@ dependencies = [ [[package]] name = "sc-tracing" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" +source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" dependencies = [ "erased-serde", "log 0.4.8", @@ -6792,7 +6794,7 @@ dependencies = [ [[package]] name = "sc-transaction-graph" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" +source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -6813,7 +6815,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" +source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -7239,7 +7241,7 @@ dependencies = [ [[package]] name = "sp-allocator" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" +source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" dependencies = [ "derive_more 0.99.9", "log 0.4.8", @@ -7251,7 +7253,7 @@ dependencies = [ [[package]] name = "sp-api" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" +source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" dependencies = [ "hash-db", "parity-scale-codec", @@ -7266,7 +7268,7 @@ dependencies = [ [[package]] name = "sp-api-proc-macro" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" +source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" dependencies = [ "blake2-rfc", "proc-macro-crate", @@ -7278,7 +7280,7 @@ dependencies = [ [[package]] name = "sp-application-crypto" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" +source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" dependencies = [ "parity-scale-codec", "serde", @@ -7290,7 +7292,7 @@ dependencies = [ [[package]] name = "sp-arithmetic" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" +source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" dependencies = [ "integer-sqrt", "num-traits 0.2.12", @@ -7303,7 +7305,7 @@ dependencies = [ [[package]] name = "sp-authority-discovery" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" +source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" dependencies = [ "parity-scale-codec", "sp-api", @@ -7315,7 +7317,7 @@ dependencies = [ [[package]] name = "sp-authorship" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" +source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" dependencies = [ "parity-scale-codec", "sp-inherents", @@ -7326,7 +7328,7 @@ dependencies = [ [[package]] name = "sp-block-builder" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" +source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" dependencies = [ "parity-scale-codec", "sp-api", @@ -7338,7 +7340,7 @@ dependencies = [ [[package]] name = "sp-blockchain" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" +source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" dependencies = [ "derive_more 0.99.9", "log 0.4.8", @@ -7355,7 +7357,7 @@ dependencies = [ [[package]] name = "sp-chain-spec" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" +source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" dependencies = [ "serde", "serde_json", @@ -7364,7 +7366,7 @@ dependencies = [ [[package]] name = "sp-consensus" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" +source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -7389,7 +7391,7 @@ dependencies = [ [[package]] name = "sp-consensus-aura" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" +source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" dependencies = [ "parity-scale-codec", "sp-api", @@ -7403,7 +7405,7 @@ dependencies = [ [[package]] name = "sp-consensus-babe" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" +source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" dependencies = [ "merlin", "parity-scale-codec", @@ -7422,7 +7424,7 @@ dependencies = [ [[package]] name = "sp-consensus-slots" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" +source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" dependencies = [ "parity-scale-codec", "sp-runtime", @@ -7431,7 +7433,7 @@ dependencies = [ [[package]] name = "sp-consensus-vrf" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" +source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" dependencies = [ "parity-scale-codec", "schnorrkel", @@ -7443,7 +7445,7 @@ dependencies = [ [[package]] name = "sp-core" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" +source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" dependencies = [ "base58", "blake2-rfc", @@ -7486,7 +7488,7 @@ dependencies = [ [[package]] name = "sp-database" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" +source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" dependencies = [ "kvdb", "parking_lot 0.10.2", @@ -7495,7 +7497,7 @@ dependencies = [ [[package]] name = "sp-debug-derive" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" +source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" dependencies = [ "proc-macro2 1.0.18", "quote 1.0.7", @@ -7505,7 +7507,7 @@ dependencies = [ [[package]] name = "sp-externalities" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" +source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" dependencies = [ "environmental", "parity-scale-codec", @@ -7516,7 +7518,7 @@ dependencies = [ [[package]] name = "sp-finality-grandpa" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" +source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" dependencies = [ "finality-grandpa", "log 0.4.8", @@ -7532,7 +7534,7 @@ dependencies = [ [[package]] name = "sp-finality-tracker" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" +source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" dependencies = [ "parity-scale-codec", "sp-inherents", @@ -7542,7 +7544,7 @@ dependencies = [ [[package]] name = "sp-inherents" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" +source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" dependencies = [ "derive_more 0.99.9", "parity-scale-codec", @@ -7554,7 +7556,7 @@ dependencies = [ [[package]] name = "sp-io" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" +source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" dependencies = [ "futures 0.3.5", "hash-db", @@ -7575,7 +7577,7 @@ dependencies = [ [[package]] name = "sp-keyring" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" +source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" dependencies = [ "lazy_static", "sp-core", @@ -7586,7 +7588,7 @@ dependencies = [ [[package]] name = "sp-npos-elections" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" +source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" dependencies = [ "parity-scale-codec", "serde", @@ -7598,7 +7600,7 @@ dependencies = [ [[package]] name = "sp-npos-elections-compact" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" +source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -7609,7 +7611,7 @@ dependencies = [ [[package]] name = "sp-offchain" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" +source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" dependencies = [ "sp-api", "sp-core", @@ -7619,7 +7621,7 @@ dependencies = [ [[package]] name = "sp-panic-handler" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" +source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" dependencies = [ "backtrace", "log 0.4.8", @@ -7628,7 +7630,7 @@ dependencies = [ [[package]] name = "sp-rpc" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" +source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" dependencies = [ "serde", "sp-core", @@ -7637,7 +7639,7 @@ dependencies = [ [[package]] name = "sp-runtime" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" +source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" dependencies = [ "either", "hash256-std-hasher", @@ -7659,7 +7661,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" +source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" dependencies = [ "parity-scale-codec", "primitive-types", @@ -7674,7 +7676,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" +source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" dependencies = [ "Inflector", "proc-macro-crate", @@ -7686,7 +7688,7 @@ dependencies = [ [[package]] name = "sp-serializer" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" +source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" dependencies = [ "serde", "serde_json", @@ -7695,7 +7697,7 @@ dependencies = [ [[package]] name = "sp-session" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" +source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" dependencies = [ "parity-scale-codec", "sp-api", @@ -7708,7 +7710,7 @@ dependencies = [ [[package]] name = "sp-staking" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" +source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" dependencies = [ "parity-scale-codec", "sp-runtime", @@ -7718,7 +7720,7 @@ dependencies = [ [[package]] name = "sp-state-machine" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" +source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" dependencies = [ "hash-db", "itertools 0.9.0", @@ -7739,12 +7741,12 @@ dependencies = [ [[package]] name = "sp-std" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" +source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" [[package]] name = "sp-storage" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" +source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" dependencies = [ "impl-serde 0.2.3", "ref-cast", @@ -7756,7 +7758,7 @@ dependencies = [ [[package]] name = "sp-timestamp" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" +source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -7770,7 +7772,7 @@ dependencies = [ [[package]] name = "sp-tracing" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" +source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" dependencies = [ "log 0.4.8", "rental", @@ -7780,7 +7782,7 @@ dependencies = [ [[package]] name = "sp-transaction-pool" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" +source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -7795,7 +7797,7 @@ dependencies = [ [[package]] name = "sp-trie" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" +source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" dependencies = [ "hash-db", "memory-db", @@ -7809,7 +7811,7 @@ dependencies = [ [[package]] name = "sp-utils" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" +source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" dependencies = [ "futures 0.3.5", "futures-core", @@ -7821,7 +7823,7 @@ dependencies = [ [[package]] name = "sp-version" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" +source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" dependencies = [ "impl-serde 0.2.3", "parity-scale-codec", @@ -7833,7 +7835,7 @@ dependencies = [ [[package]] name = "sp-wasm-interface" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" +source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -7973,7 +7975,7 @@ dependencies = [ [[package]] name = "substrate-browser-utils" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" +source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" dependencies = [ "chrono", "clear_on_drop", @@ -8000,7 +8002,7 @@ dependencies = [ [[package]] name = "substrate-build-script-utils" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" +source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" dependencies = [ "platforms", ] @@ -8008,7 +8010,7 @@ dependencies = [ [[package]] name = "substrate-frame-rpc-system" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" +source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" dependencies = [ "frame-system-rpc-runtime-api", "futures 0.3.5", @@ -8031,7 +8033,7 @@ dependencies = [ [[package]] name = "substrate-prometheus-endpoint" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" +source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" dependencies = [ "async-std", "derive_more 0.99.9", @@ -8045,7 +8047,7 @@ dependencies = [ [[package]] name = "substrate-test-client" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" +source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" dependencies = [ "futures 0.1.29", "futures 0.3.5", @@ -8071,7 +8073,7 @@ dependencies = [ [[package]] name = "substrate-test-runtime" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" +source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" dependencies = [ "cfg-if", "frame-executive", @@ -8111,7 +8113,7 @@ dependencies = [ [[package]] name = "substrate-test-runtime-client" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" +source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" dependencies = [ "futures 0.3.5", "parity-scale-codec", @@ -8132,7 +8134,7 @@ dependencies = [ [[package]] name = "substrate-wasm-builder-runner" version = "1.0.6" -source = "git+https://github.com/paritytech/substrate#6687fa111e5efaef6c91ec840dc7fb92d4a72820" +source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" [[package]] name = "substrate-wasm-builder-runner" @@ -8308,9 +8310,9 @@ dependencies = [ [[package]] name = "sysinfo" -version = "0.13.4" +version = "0.14.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cac193374347e7c263c5f547524f36ff8ec6702d56c8799c8331d26dffe8c1e" +checksum = "eec476c3d107e7fc2c445e4edc26836c49ba5be0dae74146ee94ecb62759c31d" dependencies = [ "cfg-if", "doc-comment", -- GitLab From 4a997abed01651da38dd454efb380ec6fa5ec2b0 Mon Sep 17 00:00:00 2001 From: Gavin Wood Date: Mon, 20 Jul 2020 12:18:27 +0200 Subject: [PATCH 079/192] Bump version, enable full governance (#1433) --- Cargo.lock | 40 +++++++++++----------- Cargo.toml | 2 +- availability-store/Cargo.toml | 2 +- cli/Cargo.toml | 2 +- collator/Cargo.toml | 2 +- erasure-coding/Cargo.toml | 2 +- network/Cargo.toml | 2 +- network/test/Cargo.toml | 2 +- parachain/Cargo.toml | 2 +- parachain/test-parachains/adder/Cargo.toml | 2 +- parachain/test-parachains/halt/Cargo.toml | 2 +- primitives/Cargo.toml | 2 +- rpc/Cargo.toml | 2 +- runtime/common/Cargo.toml | 2 +- runtime/kusama/Cargo.toml | 2 +- runtime/kusama/src/lib.rs | 2 +- runtime/polkadot/Cargo.toml | 2 +- runtime/polkadot/src/lib.rs | 8 ++--- runtime/test-runtime/Cargo.toml | 2 +- runtime/westend/Cargo.toml | 2 +- runtime/westend/src/lib.rs | 2 +- service/Cargo.toml | 2 +- statement-table/Cargo.toml | 2 +- validation/Cargo.toml | 2 +- 24 files changed, 45 insertions(+), 47 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 998ec7aef6..4b651d27ad 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2422,7 +2422,7 @@ dependencies = [ [[package]] name = "kusama-runtime" -version = "0.8.15" +version = "0.8.16" dependencies = [ "bitvec", "frame-benchmarking", @@ -4302,7 +4302,7 @@ checksum = "feb3b2b1033b8a60b4da6ee470325f887758c95d5320f52f9ce0df055a55940e" [[package]] name = "polkadot" -version = "0.8.15" +version = "0.8.16" dependencies = [ "assert_cmd", "futures 0.3.5", @@ -4316,7 +4316,7 @@ dependencies = [ [[package]] name = "polkadot-availability-store" -version = "0.8.15" +version = "0.8.16" dependencies = [ "derive_more 0.99.9", "exit-future", @@ -4342,7 +4342,7 @@ dependencies = [ [[package]] name = "polkadot-cli" -version = "0.8.15" +version = "0.8.16" dependencies = [ "frame-benchmarking-cli", "futures 0.3.5", @@ -4367,7 +4367,7 @@ dependencies = [ [[package]] name = "polkadot-collator" -version = "0.8.15" +version = "0.8.16" dependencies = [ "futures 0.3.5", "futures-timer 2.0.2", @@ -4405,7 +4405,7 @@ dependencies = [ [[package]] name = "polkadot-erasure-coding" -version = "0.8.15" +version = "0.8.16" dependencies = [ "derive_more 0.15.0", "parity-scale-codec", @@ -4417,7 +4417,7 @@ dependencies = [ [[package]] name = "polkadot-network" -version = "0.8.15" +version = "0.8.16" dependencies = [ "arrayvec 0.4.12", "bytes 0.5.5", @@ -4466,7 +4466,7 @@ dependencies = [ [[package]] name = "polkadot-network-test" -version = "0.8.15" +version = "0.8.16" dependencies = [ "futures 0.3.5", "log 0.4.8", @@ -4585,7 +4585,7 @@ dependencies = [ [[package]] name = "polkadot-parachain" -version = "0.8.15" +version = "0.8.16" dependencies = [ "derive_more 0.99.9", "log 0.4.8", @@ -4624,7 +4624,7 @@ dependencies = [ [[package]] name = "polkadot-primitives" -version = "0.8.15" +version = "0.8.16" dependencies = [ "bitvec", "frame-system", @@ -4648,7 +4648,7 @@ dependencies = [ [[package]] name = "polkadot-rpc" -version = "0.8.15" +version = "0.8.16" dependencies = [ "jsonrpc-core", "pallet-transaction-payment-rpc", @@ -4674,7 +4674,7 @@ dependencies = [ [[package]] name = "polkadot-runtime" -version = "0.8.15" +version = "0.8.16" dependencies = [ "bitvec", "frame-benchmarking", @@ -4749,7 +4749,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-common" -version = "0.8.15" +version = "0.8.16" dependencies = [ "bitvec", "frame-benchmarking", @@ -4837,7 +4837,7 @@ dependencies = [ [[package]] name = "polkadot-service" -version = "0.8.15" +version = "0.8.16" dependencies = [ "env_logger", "frame-benchmarking", @@ -4981,7 +4981,7 @@ dependencies = [ [[package]] name = "polkadot-statement-table" -version = "0.8.15" +version = "0.8.16" dependencies = [ "parity-scale-codec", "polkadot-primitives", @@ -5001,7 +5001,7 @@ dependencies = [ [[package]] name = "polkadot-test-runtime" -version = "0.8.15" +version = "0.8.16" dependencies = [ "bitvec", "frame-executive", @@ -5132,7 +5132,7 @@ dependencies = [ [[package]] name = "polkadot-validation" -version = "0.8.15" +version = "0.8.16" dependencies = [ "ansi_term 0.12.1", "bitvec", @@ -8360,7 +8360,7 @@ dependencies = [ [[package]] name = "test-parachain-adder" -version = "0.8.15" +version = "0.8.16" dependencies = [ "dlmalloc", "parity-scale-codec", @@ -8401,7 +8401,7 @@ dependencies = [ [[package]] name = "test-parachain-halt" -version = "0.8.15" +version = "0.8.16" dependencies = [ "substrate-wasm-builder-runner 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -9340,7 +9340,7 @@ dependencies = [ [[package]] name = "westend-runtime" -version = "0.8.15" +version = "0.8.16" dependencies = [ "bitvec", "frame-benchmarking", diff --git a/Cargo.toml b/Cargo.toml index be0d25850e..d39a7676a5 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,7 +4,7 @@ path = "src/main.rs" [package] name = "polkadot" -version = "0.8.15" +version = "0.8.16" authors = ["Parity Technologies "] edition = "2018" diff --git a/availability-store/Cargo.toml b/availability-store/Cargo.toml index 93dd003d32..df44280747 100644 --- a/availability-store/Cargo.toml +++ b/availability-store/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "polkadot-availability-store" description = "Persistent database for parachain data" -version = "0.8.15" +version = "0.8.16" authors = ["Parity Technologies "] edition = "2018" diff --git a/cli/Cargo.toml b/cli/Cargo.toml index 8c8e51efc7..503e9ae914 100644 --- a/cli/Cargo.toml +++ b/cli/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-cli" -version = "0.8.15" +version = "0.8.16" authors = ["Parity Technologies "] description = "Polkadot Relay-chain Client Node" edition = "2018" diff --git a/collator/Cargo.toml b/collator/Cargo.toml index 1c9615e2a0..bcdf18c800 100644 --- a/collator/Cargo.toml +++ b/collator/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-collator" -version = "0.8.15" +version = "0.8.16" authors = ["Parity Technologies "] description = "Collator node implementation" edition = "2018" diff --git a/erasure-coding/Cargo.toml b/erasure-coding/Cargo.toml index 04334f0eab..12841881fd 100644 --- a/erasure-coding/Cargo.toml +++ b/erasure-coding/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-erasure-coding" -version = "0.8.15" +version = "0.8.16" authors = ["Parity Technologies "] edition = "2018" diff --git a/network/Cargo.toml b/network/Cargo.toml index 6b86704796..bb6b85e87d 100644 --- a/network/Cargo.toml +++ b/network/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-network" -version = "0.8.15" +version = "0.8.16" authors = ["Parity Technologies "] description = "Polkadot-specific networking protocol" edition = "2018" diff --git a/network/test/Cargo.toml b/network/test/Cargo.toml index f73b62c511..6aff183c39 100644 --- a/network/test/Cargo.toml +++ b/network/test/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-network-test" -version = "0.8.15" +version = "0.8.16" license = "GPL-3.0" authors = ["Parity Technologies "] edition = "2018" diff --git a/parachain/Cargo.toml b/parachain/Cargo.toml index 0ccb033042..57e76f5acb 100644 --- a/parachain/Cargo.toml +++ b/parachain/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-parachain" -version = "0.8.15" +version = "0.8.16" authors = ["Parity Technologies "] description = "Types and utilities for creating and working with parachains" edition = "2018" diff --git a/parachain/test-parachains/adder/Cargo.toml b/parachain/test-parachains/adder/Cargo.toml index 4cd2f9c839..87d215b1eb 100644 --- a/parachain/test-parachains/adder/Cargo.toml +++ b/parachain/test-parachains/adder/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "test-parachain-adder" -version = "0.8.15" +version = "0.8.16" authors = ["Parity Technologies "] description = "Test parachain which adds to a number as its state transition" edition = "2018" diff --git a/parachain/test-parachains/halt/Cargo.toml b/parachain/test-parachains/halt/Cargo.toml index d9b48b4239..aac322e753 100644 --- a/parachain/test-parachains/halt/Cargo.toml +++ b/parachain/test-parachains/halt/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "test-parachain-halt" -version = "0.8.15" +version = "0.8.16" authors = ["Parity Technologies "] description = "Test parachain which executes forever" edition = "2018" diff --git a/primitives/Cargo.toml b/primitives/Cargo.toml index 877f03199d..d0d6c7ea50 100644 --- a/primitives/Cargo.toml +++ b/primitives/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-primitives" -version = "0.8.15" +version = "0.8.16" authors = ["Parity Technologies "] edition = "2018" diff --git a/rpc/Cargo.toml b/rpc/Cargo.toml index 7fea6323d8..c94d7d1a8e 100644 --- a/rpc/Cargo.toml +++ b/rpc/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-rpc" -version = "0.8.15" +version = "0.8.16" authors = ["Parity Technologies "] edition = "2018" diff --git a/runtime/common/Cargo.toml b/runtime/common/Cargo.toml index 1757636854..9511c3e919 100644 --- a/runtime/common/Cargo.toml +++ b/runtime/common/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-runtime-common" -version = "0.8.15" +version = "0.8.16" authors = ["Parity Technologies "] edition = "2018" diff --git a/runtime/kusama/Cargo.toml b/runtime/kusama/Cargo.toml index aa33f22a40..6d9090a334 100644 --- a/runtime/kusama/Cargo.toml +++ b/runtime/kusama/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "kusama-runtime" -version = "0.8.15" +version = "0.8.16" authors = ["Parity Technologies "] edition = "2018" build = "build.rs" diff --git a/runtime/kusama/src/lib.rs b/runtime/kusama/src/lib.rs index c59c1e0f25..92d0ddcda9 100644 --- a/runtime/kusama/src/lib.rs +++ b/runtime/kusama/src/lib.rs @@ -87,7 +87,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("kusama"), impl_name: create_runtime_str!("parity-kusama"), authoring_version: 2, - spec_version: 2015, + spec_version: 2016, impl_version: 0, #[cfg(not(feature = "disable-runtime-api"))] apis: RUNTIME_API_VERSIONS, diff --git a/runtime/polkadot/Cargo.toml b/runtime/polkadot/Cargo.toml index fa6d8efb5d..721640186f 100644 --- a/runtime/polkadot/Cargo.toml +++ b/runtime/polkadot/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-runtime" -version = "0.8.15" +version = "0.8.16" authors = ["Parity Technologies "] edition = "2018" build = "build.rs" diff --git a/runtime/polkadot/src/lib.rs b/runtime/polkadot/src/lib.rs index 5e1e292625..826caba583 100644 --- a/runtime/polkadot/src/lib.rs +++ b/runtime/polkadot/src/lib.rs @@ -93,7 +93,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("polkadot"), impl_name: create_runtime_str!("parity-polkadot"), authoring_version: 0, - spec_version: 15, + spec_version: 16, impl_version: 0, #[cfg(not(feature = "disable-runtime-api"))] apis: RUNTIME_API_VERSIONS, @@ -117,9 +117,6 @@ impl Filter for BaseFilter { match call { Call::Parachains(parachains::Call::set_heads(..)) => true, - // Governance stuff, minus council elections. - Call::Democracy(_) | Call::Council(_) | Call::TechnicalCommittee(_) | - Call::TechnicalMembership(_) | Call::Treasury(_) | // Parachains stuff Call::Parachains(_) | Call::Attestations(_) | Call::Slots(_) | Call::Registrar(_) | // Balances and Vesting's transfer (which can be used to transfer) @@ -128,7 +125,8 @@ impl Filter for BaseFilter { false, // These modules are all allowed to be called by transactions: - Call::ElectionsPhragmen(_) | + Call::Democracy(_) | Call::Council(_) | Call::TechnicalCommittee(_) | + Call::TechnicalMembership(_) | Call::Treasury(_) | Call::ElectionsPhragmen(_) | Call::System(_) | Call::Scheduler(_) | Call::Indices(_) | Call::Babe(_) | Call::Timestamp(_) | Call::Authorship(_) | Call::Staking(_) | Call::Offences(_) | diff --git a/runtime/test-runtime/Cargo.toml b/runtime/test-runtime/Cargo.toml index 275c393e34..b5c0153768 100644 --- a/runtime/test-runtime/Cargo.toml +++ b/runtime/test-runtime/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-test-runtime" -version = "0.8.15" +version = "0.8.16" authors = ["Parity Technologies "] edition = "2018" build = "build.rs" diff --git a/runtime/westend/Cargo.toml b/runtime/westend/Cargo.toml index b3a141483c..4d9e9e5853 100644 --- a/runtime/westend/Cargo.toml +++ b/runtime/westend/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "westend-runtime" -version = "0.8.15" +version = "0.8.16" authors = ["Parity Technologies "] edition = "2018" build = "build.rs" diff --git a/runtime/westend/src/lib.rs b/runtime/westend/src/lib.rs index 306de3589a..fe72c3aea1 100644 --- a/runtime/westend/src/lib.rs +++ b/runtime/westend/src/lib.rs @@ -83,7 +83,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("westend"), impl_name: create_runtime_str!("parity-westend"), authoring_version: 2, - spec_version: 35, + spec_version: 36, impl_version: 0, #[cfg(not(feature = "disable-runtime-api"))] apis: RUNTIME_API_VERSIONS, diff --git a/service/Cargo.toml b/service/Cargo.toml index 5514339f9b..a3670aed2a 100644 --- a/service/Cargo.toml +++ b/service/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-service" -version = "0.8.15" +version = "0.8.16" authors = ["Parity Technologies "] edition = "2018" diff --git a/statement-table/Cargo.toml b/statement-table/Cargo.toml index 030b23f0b7..cf03189f18 100644 --- a/statement-table/Cargo.toml +++ b/statement-table/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-statement-table" -version = "0.8.15" +version = "0.8.16" authors = ["Parity Technologies "] edition = "2018" diff --git a/validation/Cargo.toml b/validation/Cargo.toml index d3cee5c047..b5fb88dd6d 100644 --- a/validation/Cargo.toml +++ b/validation/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-validation" -version = "0.8.15" +version = "0.8.16" authors = ["Parity Technologies "] edition = "2018" -- GitLab From 29fea4e433f1c5e74a3ea8c4237e6af5f65a8217 Mon Sep 17 00:00:00 2001 From: Gavin Wood Date: Mon, 20 Jul 2020 17:47:09 +0200 Subject: [PATCH 080/192] Remove Sudo (#1437) * Remove Sudo NOTE: To ensure minimal index changes to pre-existing pallet deployments, this is done with a "swap_remove" style; the previous last pallet (Purchase), which is hitherto unused, has been shifted into the old index of Sudo. * Remove CC1 designation. * Fixes * Bump * Fixes * Fixes * Fixes * Fixes * Fixes * Fixes * Fixes * Fixes * Fixes * Fixes --- Cargo.lock | 41 +++++++------- Cargo.toml | 2 +- README.md | 6 +- availability-store/Cargo.toml | 2 +- cli/Cargo.toml | 2 +- collator/Cargo.toml | 2 +- erasure-coding/Cargo.toml | 2 +- network/Cargo.toml | 2 +- network/test/Cargo.toml | 2 +- node/service/src/chain_spec.rs | 8 +-- parachain/Cargo.toml | 2 +- parachain/test-parachains/adder/Cargo.toml | 2 +- parachain/test-parachains/halt/Cargo.toml | 2 +- primitives/Cargo.toml | 2 +- rpc/Cargo.toml | 2 +- runtime/common/Cargo.toml | 2 +- runtime/kusama/Cargo.toml | 2 +- runtime/kusama/src/lib.rs | 2 +- runtime/polkadot/Cargo.toml | 4 +- runtime/polkadot/src/lib.rs | 66 ++++++++++++++-------- runtime/test-runtime/Cargo.toml | 2 +- runtime/westend/Cargo.toml | 2 +- runtime/westend/src/lib.rs | 2 +- scripts/gitlab/publish_draft_release.sh | 2 +- service/Cargo.toml | 2 +- service/res/polkadot.json | 2 +- service/src/chain_spec.rs | 8 +-- statement-table/Cargo.toml | 2 +- validation/Cargo.toml | 2 +- 29 files changed, 90 insertions(+), 89 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 4b651d27ad..9bfe0b0d9e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2422,7 +2422,7 @@ dependencies = [ [[package]] name = "kusama-runtime" -version = "0.8.16" +version = "0.8.17" dependencies = [ "bitvec", "frame-benchmarking", @@ -4302,7 +4302,7 @@ checksum = "feb3b2b1033b8a60b4da6ee470325f887758c95d5320f52f9ce0df055a55940e" [[package]] name = "polkadot" -version = "0.8.16" +version = "0.8.17" dependencies = [ "assert_cmd", "futures 0.3.5", @@ -4316,7 +4316,7 @@ dependencies = [ [[package]] name = "polkadot-availability-store" -version = "0.8.16" +version = "0.8.17" dependencies = [ "derive_more 0.99.9", "exit-future", @@ -4342,7 +4342,7 @@ dependencies = [ [[package]] name = "polkadot-cli" -version = "0.8.16" +version = "0.8.17" dependencies = [ "frame-benchmarking-cli", "futures 0.3.5", @@ -4367,7 +4367,7 @@ dependencies = [ [[package]] name = "polkadot-collator" -version = "0.8.16" +version = "0.8.17" dependencies = [ "futures 0.3.5", "futures-timer 2.0.2", @@ -4405,7 +4405,7 @@ dependencies = [ [[package]] name = "polkadot-erasure-coding" -version = "0.8.16" +version = "0.8.17" dependencies = [ "derive_more 0.15.0", "parity-scale-codec", @@ -4417,7 +4417,7 @@ dependencies = [ [[package]] name = "polkadot-network" -version = "0.8.16" +version = "0.8.17" dependencies = [ "arrayvec 0.4.12", "bytes 0.5.5", @@ -4466,7 +4466,7 @@ dependencies = [ [[package]] name = "polkadot-network-test" -version = "0.8.16" +version = "0.8.17" dependencies = [ "futures 0.3.5", "log 0.4.8", @@ -4585,7 +4585,7 @@ dependencies = [ [[package]] name = "polkadot-parachain" -version = "0.8.16" +version = "0.8.17" dependencies = [ "derive_more 0.99.9", "log 0.4.8", @@ -4624,7 +4624,7 @@ dependencies = [ [[package]] name = "polkadot-primitives" -version = "0.8.16" +version = "0.8.17" dependencies = [ "bitvec", "frame-system", @@ -4648,7 +4648,7 @@ dependencies = [ [[package]] name = "polkadot-rpc" -version = "0.8.16" +version = "0.8.17" dependencies = [ "jsonrpc-core", "pallet-transaction-payment-rpc", @@ -4674,7 +4674,7 @@ dependencies = [ [[package]] name = "polkadot-runtime" -version = "0.8.16" +version = "0.8.17" dependencies = [ "bitvec", "frame-benchmarking", @@ -4710,7 +4710,6 @@ dependencies = [ "pallet-session-benchmarking", "pallet-staking", "pallet-staking-reward-curve", - "pallet-sudo", "pallet-timestamp", "pallet-transaction-payment", "pallet-transaction-payment-rpc-runtime-api", @@ -4749,7 +4748,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-common" -version = "0.8.16" +version = "0.8.17" dependencies = [ "bitvec", "frame-benchmarking", @@ -4837,7 +4836,7 @@ dependencies = [ [[package]] name = "polkadot-service" -version = "0.8.16" +version = "0.8.17" dependencies = [ "env_logger", "frame-benchmarking", @@ -4981,7 +4980,7 @@ dependencies = [ [[package]] name = "polkadot-statement-table" -version = "0.8.16" +version = "0.8.17" dependencies = [ "parity-scale-codec", "polkadot-primitives", @@ -5001,7 +5000,7 @@ dependencies = [ [[package]] name = "polkadot-test-runtime" -version = "0.8.16" +version = "0.8.17" dependencies = [ "bitvec", "frame-executive", @@ -5132,7 +5131,7 @@ dependencies = [ [[package]] name = "polkadot-validation" -version = "0.8.16" +version = "0.8.17" dependencies = [ "ansi_term 0.12.1", "bitvec", @@ -8360,7 +8359,7 @@ dependencies = [ [[package]] name = "test-parachain-adder" -version = "0.8.16" +version = "0.8.17" dependencies = [ "dlmalloc", "parity-scale-codec", @@ -8401,7 +8400,7 @@ dependencies = [ [[package]] name = "test-parachain-halt" -version = "0.8.16" +version = "0.8.17" dependencies = [ "substrate-wasm-builder-runner 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -9340,7 +9339,7 @@ dependencies = [ [[package]] name = "westend-runtime" -version = "0.8.16" +version = "0.8.17" dependencies = [ "bitvec", "frame-benchmarking", diff --git a/Cargo.toml b/Cargo.toml index d39a7676a5..40adacde41 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,7 +4,7 @@ path = "src/main.rs" [package] name = "polkadot" -version = "0.8.16" +version = "0.8.17" authors = ["Parity Technologies "] edition = "2018" diff --git a/README.md b/README.md index 496d5933d6..0b971154b8 100644 --- a/README.md +++ b/README.md @@ -61,9 +61,9 @@ cargo build --release This repo supports runtimes for Polkadot, Kusama, and Westend. -### Connect to Polkadot Chain Candidate 1 (CC1) +### Connect to Polkadot Mainnet -Connect to the global Polkadot CC1 network by running: +Connect to the global Polkadot Mainnet network by running: ```bash ./target/release/polkadot --chain=polkadot @@ -71,7 +71,7 @@ Connect to the global Polkadot CC1 network by running: You can see your node on [telemetry] (set a custom name with `--name "my custom name"`). -[telemetry]: https://telemetry.polkadot.io/#list/Polkadot%20CC1 +[telemetry]: https://telemetry.polkadot.io/#list/Polkadot ### Connect to the "Kusama" Canary Network diff --git a/availability-store/Cargo.toml b/availability-store/Cargo.toml index df44280747..25b39a0262 100644 --- a/availability-store/Cargo.toml +++ b/availability-store/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "polkadot-availability-store" description = "Persistent database for parachain data" -version = "0.8.16" +version = "0.8.17" authors = ["Parity Technologies "] edition = "2018" diff --git a/cli/Cargo.toml b/cli/Cargo.toml index 503e9ae914..2847d1b1c7 100644 --- a/cli/Cargo.toml +++ b/cli/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-cli" -version = "0.8.16" +version = "0.8.17" authors = ["Parity Technologies "] description = "Polkadot Relay-chain Client Node" edition = "2018" diff --git a/collator/Cargo.toml b/collator/Cargo.toml index bcdf18c800..09d0112121 100644 --- a/collator/Cargo.toml +++ b/collator/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-collator" -version = "0.8.16" +version = "0.8.17" authors = ["Parity Technologies "] description = "Collator node implementation" edition = "2018" diff --git a/erasure-coding/Cargo.toml b/erasure-coding/Cargo.toml index 12841881fd..ab9b31e151 100644 --- a/erasure-coding/Cargo.toml +++ b/erasure-coding/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-erasure-coding" -version = "0.8.16" +version = "0.8.17" authors = ["Parity Technologies "] edition = "2018" diff --git a/network/Cargo.toml b/network/Cargo.toml index bb6b85e87d..db5f99e714 100644 --- a/network/Cargo.toml +++ b/network/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-network" -version = "0.8.16" +version = "0.8.17" authors = ["Parity Technologies "] description = "Polkadot-specific networking protocol" edition = "2018" diff --git a/network/test/Cargo.toml b/network/test/Cargo.toml index 6aff183c39..b5397c46d2 100644 --- a/network/test/Cargo.toml +++ b/network/test/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-network-test" -version = "0.8.16" +version = "0.8.17" license = "GPL-3.0" authors = ["Parity Technologies "] edition = "2018" diff --git a/node/service/src/chain_spec.rs b/node/service/src/chain_spec.rs index db9d9c5dde..d46239ddd1 100644 --- a/node/service/src/chain_spec.rs +++ b/node/service/src/chain_spec.rs @@ -194,9 +194,6 @@ fn polkadot_staging_testnet_config_genesis() -> polkadot::GenesisConfig { vesting: Some(polkadot::VestingConfig { vesting: vec![], }), - sudo: Some(polkadot::SudoConfig { - key: endowed_accounts[0].clone(), - }), } } @@ -599,7 +596,7 @@ fn testnet_accounts() -> Vec { /// Helper function to create polkadot GenesisConfig for testing pub fn polkadot_testnet_genesis( initial_authorities: Vec<(AccountId, AccountId, BabeId, GrandpaId, ImOnlineId, ValidatorId, AuthorityDiscoveryId)>, - root_key: AccountId, + _root_key: AccountId, endowed_accounts: Option>, ) -> polkadot::GenesisConfig { let endowed_accounts: Vec = endowed_accounts.unwrap_or_else(testnet_accounts); @@ -667,9 +664,6 @@ pub fn polkadot_testnet_genesis( vesting: Some(polkadot::VestingConfig { vesting: vec![], }), - sudo: Some(polkadot::SudoConfig { - key: root_key, - }), } } diff --git a/parachain/Cargo.toml b/parachain/Cargo.toml index 57e76f5acb..b7676170b8 100644 --- a/parachain/Cargo.toml +++ b/parachain/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-parachain" -version = "0.8.16" +version = "0.8.17" authors = ["Parity Technologies "] description = "Types and utilities for creating and working with parachains" edition = "2018" diff --git a/parachain/test-parachains/adder/Cargo.toml b/parachain/test-parachains/adder/Cargo.toml index 87d215b1eb..6d8f15e743 100644 --- a/parachain/test-parachains/adder/Cargo.toml +++ b/parachain/test-parachains/adder/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "test-parachain-adder" -version = "0.8.16" +version = "0.8.17" authors = ["Parity Technologies "] description = "Test parachain which adds to a number as its state transition" edition = "2018" diff --git a/parachain/test-parachains/halt/Cargo.toml b/parachain/test-parachains/halt/Cargo.toml index aac322e753..1dd71cf306 100644 --- a/parachain/test-parachains/halt/Cargo.toml +++ b/parachain/test-parachains/halt/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "test-parachain-halt" -version = "0.8.16" +version = "0.8.17" authors = ["Parity Technologies "] description = "Test parachain which executes forever" edition = "2018" diff --git a/primitives/Cargo.toml b/primitives/Cargo.toml index d0d6c7ea50..96a15f68c5 100644 --- a/primitives/Cargo.toml +++ b/primitives/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-primitives" -version = "0.8.16" +version = "0.8.17" authors = ["Parity Technologies "] edition = "2018" diff --git a/rpc/Cargo.toml b/rpc/Cargo.toml index c94d7d1a8e..58b300480f 100644 --- a/rpc/Cargo.toml +++ b/rpc/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-rpc" -version = "0.8.16" +version = "0.8.17" authors = ["Parity Technologies "] edition = "2018" diff --git a/runtime/common/Cargo.toml b/runtime/common/Cargo.toml index 9511c3e919..5cf992c76f 100644 --- a/runtime/common/Cargo.toml +++ b/runtime/common/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-runtime-common" -version = "0.8.16" +version = "0.8.17" authors = ["Parity Technologies "] edition = "2018" diff --git a/runtime/kusama/Cargo.toml b/runtime/kusama/Cargo.toml index 6d9090a334..a8083a8a39 100644 --- a/runtime/kusama/Cargo.toml +++ b/runtime/kusama/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "kusama-runtime" -version = "0.8.16" +version = "0.8.17" authors = ["Parity Technologies "] edition = "2018" build = "build.rs" diff --git a/runtime/kusama/src/lib.rs b/runtime/kusama/src/lib.rs index 92d0ddcda9..6eed529ab8 100644 --- a/runtime/kusama/src/lib.rs +++ b/runtime/kusama/src/lib.rs @@ -87,7 +87,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("kusama"), impl_name: create_runtime_str!("parity-kusama"), authoring_version: 2, - spec_version: 2016, + spec_version: 2017, impl_version: 0, #[cfg(not(feature = "disable-runtime-api"))] apis: RUNTIME_API_VERSIONS, diff --git a/runtime/polkadot/Cargo.toml b/runtime/polkadot/Cargo.toml index 721640186f..0af2fda617 100644 --- a/runtime/polkadot/Cargo.toml +++ b/runtime/polkadot/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-runtime" -version = "0.8.16" +version = "0.8.17" authors = ["Parity Technologies "] edition = "2018" build = "build.rs" @@ -60,7 +60,6 @@ system = { package = "frame-system", git = "https://github.com/paritytech/substr system_rpc_runtime_api = { package = "frame-system-rpc-runtime-api", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } timestamp = { package = "pallet-timestamp", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } treasury = { package = "pallet-treasury", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -sudo = { package = "pallet-sudo", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } vesting = { package = "pallet-vesting", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } utility = { package = "pallet-utility", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } @@ -140,7 +139,6 @@ std = [ "sp-session/std", "randomness-collective-flip/std", "runtime-common/std", - "sudo/std", "vesting/std", "utility/std", ] diff --git a/runtime/polkadot/src/lib.rs b/runtime/polkadot/src/lib.rs index 826caba583..debecc27ee 100644 --- a/runtime/polkadot/src/lib.rs +++ b/runtime/polkadot/src/lib.rs @@ -93,13 +93,13 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("polkadot"), impl_name: create_runtime_str!("parity-polkadot"), authoring_version: 0, - spec_version: 16, + spec_version: 17, impl_version: 0, #[cfg(not(feature = "disable-runtime-api"))] apis: RUNTIME_API_VERSIONS, #[cfg(feature = "disable-runtime-api")] apis: version::create_apis_vec![[]], - transaction_version: 2, + transaction_version: 3, }; /// Native version. @@ -132,7 +132,7 @@ impl Filter for BaseFilter { Call::Authorship(_) | Call::Staking(_) | Call::Offences(_) | Call::Session(_) | Call::FinalityTracker(_) | Call::Grandpa(_) | Call::ImOnline(_) | Call::AuthorityDiscovery(_) | - Call::Utility(_) | Call::Claims(_) | Call::Vesting(_) | Call::Sudo(_) | + Call::Utility(_) | Call::Claims(_) | Call::Vesting(_) | Call::Identity(_) | Call::Proxy(_) | Call::Multisig(_) | Call::Poll(_) | Call::Purchase(_) => true, @@ -815,11 +815,6 @@ impl multisig::Trait for Runtime { type WeightInfo = (); } -impl sudo::Trait for Runtime { - type Event = Event; - type Call = Call; -} - parameter_types! { // One storage item; key size 32, value size 8; . pub const ProxyDepositBase: Balance = deposit(1, 8); @@ -831,13 +826,43 @@ parameter_types! { /// The type used to represent the kinds of proxying allowed. #[derive(Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Encode, Decode, RuntimeDebug)] pub enum ProxyType { - Any, - NonTransfer, - Governance, - Staking, - SudoBalances, - IdentityJudgement, + Any = 0, + NonTransfer = 1, + Governance = 2, + Staking = 3, + // Skip 4 as it is now removed (was SudoBalances) + IdentityJudgement = 5, +} + +#[cfg(test)] +mod proxt_type_tests { + use super::*; + + #[derive(Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Encode, Decode, RuntimeDebug)] + pub enum OldProxyType { + Any, + NonTransfer, + Governance, + Staking, + SudoBalances, + IdentityJudgement, + } + + #[test] + fn proxy_type_decodes_correctly() { + for (i, j) in vec![ + (OldProxyType::Any, ProxyType::Any), + (OldProxyType::NonTransfer, ProxyType::NonTransfer), + (OldProxyType::Governance, ProxyType::Governance), + (OldProxyType::Staking, ProxyType::Staking), + (OldProxyType::IdentityJudgement, ProxyType::IdentityJudgement), + ].into_iter() { + assert_eq!(i.encode(), j.encode()); + } + assert!(ProxyType::decode(&mut &OldProxyType::SudoBalances.encode()[..]).is_err()); + } } + impl Default for ProxyType { fn default() -> Self { Self::Any } } impl InstanceFilter for ProxyType { fn filter(&self, c: &Call) -> bool { @@ -876,7 +901,6 @@ impl InstanceFilter for ProxyType { Call::Vesting(vesting::Call::vest_other(..)) | // Specifically omitting Vesting `vested_transfer`, and `force_vested_transfer` Call::Utility(..) | - // Specifically omitting Sudo pallet Call::Identity(..) | Call::Proxy(..) | Call::Multisig(..) @@ -889,11 +913,6 @@ impl InstanceFilter for ProxyType { ProxyType::Staking => matches!(c, Call::Staking(..) | Call::Utility(utility::Call::batch(..)) | Call::Utility(..) ), - ProxyType::SudoBalances => match c { - Call::Sudo(sudo::Call::sudo(ref x)) => matches!(x.as_ref(), &Call::Balances(..)), - Call::Utility(..) => true, - _ => false, - }, ProxyType::IdentityJudgement => matches!(c, Call::Identity(identity::Call::provide_judgement(..)) | Call::Utility(utility::Call::batch(..)) @@ -1037,8 +1056,8 @@ construct_runtime! { // Cunning utilities. Usable initially. Utility: utility::{Module, Call, Event}, - // Sudo. Last module. Usable initially, but removed once governance enabled. - Sudo: sudo::{Module, Call, Storage, Config, Event}, + // DOT Purchase module. Late addition; this is in place of Sudo. + Purchase: purchase::{Module, Call, Storage, Event}, // Identity. Late addition. Identity: identity::{Module, Call, Storage, Event}, @@ -1051,9 +1070,6 @@ construct_runtime! { // Poll module. Poll: poll::{Module, Call, Storage, Event}, - - // DOT Purchase module. Late addition. - Purchase: purchase::{Module, Call, Storage, Event}, } } diff --git a/runtime/test-runtime/Cargo.toml b/runtime/test-runtime/Cargo.toml index b5c0153768..9c62784bbd 100644 --- a/runtime/test-runtime/Cargo.toml +++ b/runtime/test-runtime/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-test-runtime" -version = "0.8.16" +version = "0.8.17" authors = ["Parity Technologies "] edition = "2018" build = "build.rs" diff --git a/runtime/westend/Cargo.toml b/runtime/westend/Cargo.toml index 4d9e9e5853..0305b48c3f 100644 --- a/runtime/westend/Cargo.toml +++ b/runtime/westend/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "westend-runtime" -version = "0.8.16" +version = "0.8.17" authors = ["Parity Technologies "] edition = "2018" build = "build.rs" diff --git a/runtime/westend/src/lib.rs b/runtime/westend/src/lib.rs index fe72c3aea1..5764cbc96c 100644 --- a/runtime/westend/src/lib.rs +++ b/runtime/westend/src/lib.rs @@ -83,7 +83,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("westend"), impl_name: create_runtime_str!("parity-westend"), authoring_version: 2, - spec_version: 36, + spec_version: 37, impl_version: 0, #[cfg(not(feature = "disable-runtime-api"))] apis: RUNTIME_API_VERSIONS, diff --git a/scripts/gitlab/publish_draft_release.sh b/scripts/gitlab/publish_draft_release.sh index c91846bc88..a228c4afe7 100755 --- a/scripts/gitlab/publish_draft_release.sh +++ b/scripts/gitlab/publish_draft_release.sh @@ -228,7 +228,7 @@ echo "$release_text" echo "[+] Pushing release to github" # Create release on github -release_name="Polkadot CC1 $version" +release_name="Polkadot $version" data=$(jq -Rs --arg version "$version" \ --arg release_name "$release_name" \ --arg release_text "$release_text" \ diff --git a/service/Cargo.toml b/service/Cargo.toml index a3670aed2a..9ce1613401 100644 --- a/service/Cargo.toml +++ b/service/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-service" -version = "0.8.16" +version = "0.8.17" authors = ["Parity Technologies "] edition = "2018" diff --git a/service/res/polkadot.json b/service/res/polkadot.json index 90e3f529a8..4f5b99fa88 100644 --- a/service/res/polkadot.json +++ b/service/res/polkadot.json @@ -1,5 +1,5 @@ { - "name": "Polkadot CC1", + "name": "Polkadot", "id": "polkadot", "chainType": "Live", "bootNodes": [ diff --git a/service/src/chain_spec.rs b/service/src/chain_spec.rs index fe8d98d055..efbdc4c100 100644 --- a/service/src/chain_spec.rs +++ b/service/src/chain_spec.rs @@ -194,9 +194,6 @@ fn polkadot_staging_testnet_config_genesis() -> polkadot::GenesisConfig { vesting: Some(polkadot::VestingConfig { vesting: vec![], }), - sudo: Some(polkadot::SudoConfig { - key: endowed_accounts[0].clone(), - }), } } @@ -599,7 +596,7 @@ fn testnet_accounts() -> Vec { /// Helper function to create polkadot GenesisConfig for testing pub fn polkadot_testnet_genesis( initial_authorities: Vec<(AccountId, AccountId, BabeId, GrandpaId, ImOnlineId, ValidatorId, AuthorityDiscoveryId)>, - root_key: AccountId, + _root_key: AccountId, endowed_accounts: Option>, ) -> polkadot::GenesisConfig { let endowed_accounts: Vec = endowed_accounts.unwrap_or_else(testnet_accounts); @@ -667,9 +664,6 @@ pub fn polkadot_testnet_genesis( vesting: Some(polkadot::VestingConfig { vesting: vec![], }), - sudo: Some(polkadot::SudoConfig { - key: root_key, - }), } } diff --git a/statement-table/Cargo.toml b/statement-table/Cargo.toml index cf03189f18..870d8cb0b1 100644 --- a/statement-table/Cargo.toml +++ b/statement-table/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-statement-table" -version = "0.8.16" +version = "0.8.17" authors = ["Parity Technologies "] edition = "2018" diff --git a/validation/Cargo.toml b/validation/Cargo.toml index b5fb88dd6d..aabf5286f5 100644 --- a/validation/Cargo.toml +++ b/validation/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-validation" -version = "0.8.16" +version = "0.8.17" authors = ["Parity Technologies "] edition = "2018" -- GitLab From c34463916e3baaa7e5e175db10449dd9c2e5e8db Mon Sep 17 00:00:00 2001 From: Gav Wood Date: Mon, 20 Jul 2020 19:11:26 +0200 Subject: [PATCH 081/192] Fix typo in governance params --- runtime/polkadot/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runtime/polkadot/src/lib.rs b/runtime/polkadot/src/lib.rs index debecc27ee..e1841f8d05 100644 --- a/runtime/polkadot/src/lib.rs +++ b/runtime/polkadot/src/lib.rs @@ -406,7 +406,7 @@ parameter_types! { pub const VotingPeriod: BlockNumber = 28 * DAYS; pub const FastTrackVotingPeriod: BlockNumber = 3 * HOURS; pub const MinimumDeposit: Balance = 100 * DOLLARS; - pub const EnactmentPeriod: BlockNumber = 8 * DAYS; + pub const EnactmentPeriod: BlockNumber = 28 * DAYS; pub const CooloffPeriod: BlockNumber = 7 * DAYS; // One cent: $10,000 / MB pub const PreimageByteDeposit: Balance = 1 * CENTS; -- GitLab From 57b57ab392847faf8617eb47f83babda0ea5b5e3 Mon Sep 17 00:00:00 2001 From: Gav Wood Date: Mon, 20 Jul 2020 19:13:09 +0200 Subject: [PATCH 082/192] Bump Polkadot runtime version --- runtime/polkadot/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runtime/polkadot/src/lib.rs b/runtime/polkadot/src/lib.rs index e1841f8d05..56774d921b 100644 --- a/runtime/polkadot/src/lib.rs +++ b/runtime/polkadot/src/lib.rs @@ -93,7 +93,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("polkadot"), impl_name: create_runtime_str!("parity-polkadot"), authoring_version: 0, - spec_version: 17, + spec_version: 18, impl_version: 0, #[cfg(not(feature = "disable-runtime-api"))] apis: RUNTIME_API_VERSIONS, -- GitLab From cc2d7afd128b259791139359067aa519eadbf205 Mon Sep 17 00:00:00 2001 From: Peter Goodspeed-Niklaus Date: Tue, 21 Jul 2020 02:35:14 +0200 Subject: [PATCH 083/192] Add test suite and minor refinements to the utility subsystem (#1403) * get conclude signal working properly; don't allocate a vector * wip: add test suite / example / explanation for using utility subsystem Unfortunately, the test fails right now for reasons which seem very odd. Just have to keep poking at it. * explicitly import everything * fix subsystem-util test The root problem here was two-fold: - there was a circular dependency from subsystem -> test-helpers/subsystem -> subsystem - cfg(test) doesn't propagate between crates The solution: move the subsystem test helpers into a sub-module within subsystem. Publicly export them from the previous location so no other code breaks. Doing this has an additional benefit: it ensures that no production code can ever accidentally use the subsystem helpers, as they are compile- gated on cfg(test). * fully commit to moving test helpers into a subsystem module * add some more tests * get rid of log tests in favor of real error forwarding It's not obvious whether we'll ever really want to chase down these errors outside a testing context, but having the capability won't hurt. * fix issue which caused test to hang on osx * only require that job errors are PartialEq when testing also fix polkadot-node-core-backing tests * get rid of any notion of partialeq * rethink testing Combine tests of starting and stopping job: leaving a test executor with a job running was pretty clearly the cause of the sometimes-hang. Also, add a timeout so tests _can't_ hang anymore; they just fail after a while. * rename fwd_errors -> forward_errors * warn on error propagation failure * fix unused import leftover from merge * derive eq for subsystemerror --- Cargo.lock | 17 +- Cargo.toml | 1 - node/core/backing/Cargo.toml | 2 +- node/core/backing/src/lib.rs | 8 +- node/network/bridge/Cargo.toml | 1 - node/network/bridge/src/lib.rs | 8 +- node/network/pov-distribution/Cargo.toml | 2 +- node/network/pov-distribution/src/lib.rs | 24 +- .../network/statement-distribution/Cargo.toml | 2 +- .../network/statement-distribution/src/lib.rs | 4 +- node/subsystem/Cargo.toml | 10 + node/subsystem/src/lib.rs | 4 +- node/subsystem/src/messages.rs | 6 + .../lib.rs => subsystem/src/test_helpers.rs} | 4 +- node/subsystem/src/util.rs | 394 ++++++++++++++++-- node/test-helpers/subsystem/Cargo.toml | 13 - 16 files changed, 412 insertions(+), 88 deletions(-) rename node/{test-helpers/subsystem/src/lib.rs => subsystem/src/test_helpers.rs} (97%) delete mode 100644 node/test-helpers/subsystem/Cargo.toml diff --git a/Cargo.lock b/Cargo.lock index 9bfe0b0d9e..98079e4fff 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4457,7 +4457,6 @@ dependencies = [ "polkadot-node-primitives", "polkadot-node-subsystem", "polkadot-primitives", - "polkadot-subsystem-test-helpers", "sc-network", "sp-core", "sp-runtime", @@ -4498,7 +4497,6 @@ dependencies = [ "polkadot-node-subsystem", "polkadot-primitives", "polkadot-statement-table", - "polkadot-subsystem-test-helpers", "sc-client-api", "sc-keystore", "sp-api", @@ -4549,12 +4547,14 @@ dependencies = [ name = "polkadot-node-subsystem" version = "0.1.0" dependencies = [ + "assert_matches", "async-trait", "derive_more 0.99.9", "futures 0.3.5", "futures-timer 3.0.2", "log 0.4.8", "parity-scale-codec", + "parking_lot 0.10.2", "pin-project", "polkadot-node-primitives", "polkadot-primitives", @@ -4615,7 +4615,6 @@ dependencies = [ "polkadot-node-primitives", "polkadot-node-subsystem", "polkadot-primitives", - "polkadot-subsystem-test-helpers", "sc-network", "sp-core", "sp-runtime", @@ -4970,7 +4969,6 @@ dependencies = [ "polkadot-node-primitives", "polkadot-node-subsystem", "polkadot-primitives", - "polkadot-subsystem-test-helpers", "sp-core", "sp-keyring", "sp-runtime", @@ -4987,17 +4985,6 @@ dependencies = [ "sp-core", ] -[[package]] -name = "polkadot-subsystem-test-helpers" -version = "0.1.0" -dependencies = [ - "async-trait", - "futures 0.3.5", - "parking_lot 0.10.2", - "polkadot-node-subsystem", - "sp-core", -] - [[package]] name = "polkadot-test-runtime" version = "0.8.17" diff --git a/Cargo.toml b/Cargo.toml index 40adacde41..e0125209f2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -52,7 +52,6 @@ members = [ "node/service", "node/core/backing", "node/subsystem", - "node/test-helpers/subsystem", "node/test-service", "parachain/test-parachains", diff --git a/node/core/backing/Cargo.toml b/node/core/backing/Cargo.toml index 6c8155e3cf..a660df3c31 100644 --- a/node/core/backing/Cargo.toml +++ b/node/core/backing/Cargo.toml @@ -22,5 +22,5 @@ bitvec = { version = "0.17.4", default-features = false, features = ["alloc"] } sp-core = { git = "https://github.com/paritytech/substrate", branch = "master" } sp-keyring = { git = "https://github.com/paritytech/substrate", branch = "master" } futures = { version = "0.3.5", features = ["thread-pool"] } -subsystem-test = { package = "polkadot-subsystem-test-helpers", path = "../../test-helpers/subsystem" } assert_matches = "1.3.0" +polkadot-subsystem = { package = "polkadot-node-subsystem", path = "../../subsystem", features = [ "test-helpers" ] } diff --git a/node/core/backing/src/lib.rs b/node/core/backing/src/lib.rs index 260cd2eacc..3dd31e5e48 100644 --- a/node/core/backing/src/lib.rs +++ b/node/core/backing/src/lib.rs @@ -745,7 +745,7 @@ where /// Run this subsystem pub async fn run(ctx: Context, keystore: KeyStorePtr, spawner: Spawner) { - >::run(ctx, keystore, spawner).await + >::run(ctx, keystore, spawner, None).await } } @@ -895,13 +895,13 @@ mod tests { } struct TestHarness { - virtual_overseer: subsystem_test::TestSubsystemContextHandle, + virtual_overseer: polkadot_subsystem::test_helpers::TestSubsystemContextHandle, } fn test_harness>(keystore: KeyStorePtr, test: impl FnOnce(TestHarness) -> T) { let pool = sp_core::testing::SpawnBlockingExecutor::new(); - let (context, virtual_overseer) = subsystem_test::make_subsystem_context(pool.clone()); + let (context, virtual_overseer) = polkadot_subsystem::test_helpers::make_subsystem_context(pool.clone()); let subsystem = CandidateBackingSubsystem::run(context, keystore, pool.clone()); @@ -959,7 +959,7 @@ mod tests { // Tests that the subsystem performs actions that are requied on startup. async fn test_startup( - virtual_overseer: &mut subsystem_test::TestSubsystemContextHandle, + virtual_overseer: &mut polkadot_subsystem::test_helpers::TestSubsystemContextHandle, test_state: &TestState, ) { // Start work on some new parent. diff --git a/node/network/bridge/Cargo.toml b/node/network/bridge/Cargo.toml index 49e84b8597..3bd4b6702b 100644 --- a/node/network/bridge/Cargo.toml +++ b/node/network/bridge/Cargo.toml @@ -18,6 +18,5 @@ polkadot-subsystem = { package = "polkadot-node-subsystem", path = "../../subsys [dev-dependencies] parking_lot = "0.10.0" -subsystem-test = { package = "polkadot-subsystem-test-helpers", path = "../../test-helpers/subsystem" } assert_matches = "1.3.0" sp-core = { git = "https://github.com/paritytech/substrate", branch = "master" } diff --git a/node/network/bridge/src/lib.rs b/node/network/bridge/src/lib.rs index f2dbcd0aac..85606d07cc 100644 --- a/node/network/bridge/src/lib.rs +++ b/node/network/bridge/src/lib.rs @@ -531,7 +531,7 @@ mod tests { use assert_matches::assert_matches; use polkadot_subsystem::messages::{StatementDistributionMessage, BitfieldDistributionMessage}; - use subsystem_test::{SingleItemSink, SingleItemStream}; + use polkadot_subsystem::test_helpers::{SingleItemSink, SingleItemStream}; // The subsystem's view of the network - only supports a single call to `event_stream`. struct TestNetwork { @@ -550,7 +550,7 @@ mod tests { TestNetwork, TestNetworkHandle, ) { - let (net_tx, net_rx) = subsystem_test::single_item_sink(); + let (net_tx, net_rx) = polkadot_subsystem::test_helpers::single_item_sink(); let (action_tx, action_rx) = mpsc::unbounded(); ( @@ -631,13 +631,13 @@ mod tests { struct TestHarness { network_handle: TestNetworkHandle, - virtual_overseer: subsystem_test::TestSubsystemContextHandle, + virtual_overseer: polkadot_subsystem::test_helpers::TestSubsystemContextHandle, } fn test_harness>(test: impl FnOnce(TestHarness) -> T) { let pool = sp_core::testing::SpawnBlockingExecutor::new(); let (network, network_handle) = new_test_network(); - let (context, virtual_overseer) = subsystem_test::make_subsystem_context(pool); + let (context, virtual_overseer) = polkadot_subsystem::test_helpers::make_subsystem_context(pool); let network_bridge = run_network( network, diff --git a/node/network/pov-distribution/Cargo.toml b/node/network/pov-distribution/Cargo.toml index 232e84f7eb..672e697c26 100644 --- a/node/network/pov-distribution/Cargo.toml +++ b/node/network/pov-distribution/Cargo.toml @@ -18,6 +18,6 @@ polkadot-subsystem = { package = "polkadot-node-subsystem", path = "../../subsys [dev-dependencies] parking_lot = "0.10.0" -subsystem-test = { package = "polkadot-subsystem-test-helpers", path = "../../test-helpers/subsystem" } assert_matches = "1.3.0" sp-core = { git = "https://github.com/paritytech/substrate", branch = "master" } +polkadot-subsystem = { package = "polkadot-node-subsystem", path = "../../subsystem", features = [ "test-helpers" ] } diff --git a/node/network/pov-distribution/src/lib.rs b/node/network/pov-distribution/src/lib.rs index 8a7c0fa7a5..aa37cfdc3f 100644 --- a/node/network/pov-distribution/src/lib.rs +++ b/node/network/pov-distribution/src/lib.rs @@ -620,7 +620,7 @@ mod tests { }; let pool = sp_core::testing::SpawnBlockingExecutor::new(); - let (mut ctx, mut handle) = subsystem_test::make_subsystem_context(pool); + let (mut ctx, mut handle) = polkadot_subsystem::test_helpers::make_subsystem_context(pool); let mut descriptor = CandidateDescriptor::default(); descriptor.pov_hash = pov_hash; @@ -700,7 +700,7 @@ mod tests { }; let pool = sp_core::testing::SpawnBlockingExecutor::new(); - let (mut ctx, mut handle) = subsystem_test::make_subsystem_context(pool); + let (mut ctx, mut handle) = polkadot_subsystem::test_helpers::make_subsystem_context(pool); let mut descriptor = CandidateDescriptor::default(); descriptor.pov_hash = pov_hash; @@ -778,7 +778,7 @@ mod tests { }; let pool = sp_core::testing::SpawnBlockingExecutor::new(); - let (mut ctx, mut handle) = subsystem_test::make_subsystem_context(pool); + let (mut ctx, mut handle) = polkadot_subsystem::test_helpers::make_subsystem_context(pool); executor::block_on(async move { handle_network_update( @@ -850,7 +850,7 @@ mod tests { }; let pool = sp_core::testing::SpawnBlockingExecutor::new(); - let (mut ctx, mut handle) = subsystem_test::make_subsystem_context(pool); + let (mut ctx, mut handle) = polkadot_subsystem::test_helpers::make_subsystem_context(pool); executor::block_on(async move { // Peer A answers our request before peer B. @@ -938,7 +938,7 @@ mod tests { }; let pool = sp_core::testing::SpawnBlockingExecutor::new(); - let (mut ctx, mut handle) = subsystem_test::make_subsystem_context(pool); + let (mut ctx, mut handle) = polkadot_subsystem::test_helpers::make_subsystem_context(pool); executor::block_on(async move { // Peer A answers our request: right relay parent, awaited hash, wrong PoV. @@ -1001,7 +1001,7 @@ mod tests { }; let pool = sp_core::testing::SpawnBlockingExecutor::new(); - let (mut ctx, mut handle) = subsystem_test::make_subsystem_context(pool); + let (mut ctx, mut handle) = polkadot_subsystem::test_helpers::make_subsystem_context(pool); executor::block_on(async move { // Peer A answers our request: right relay parent, awaited hash, wrong PoV. @@ -1062,7 +1062,7 @@ mod tests { }; let pool = sp_core::testing::SpawnBlockingExecutor::new(); - let (mut ctx, mut handle) = subsystem_test::make_subsystem_context(pool); + let (mut ctx, mut handle) = polkadot_subsystem::test_helpers::make_subsystem_context(pool); executor::block_on(async move { // Peer A answers our request: right relay parent, awaited hash, wrong PoV. @@ -1120,7 +1120,7 @@ mod tests { }; let pool = sp_core::testing::SpawnBlockingExecutor::new(); - let (mut ctx, mut handle) = subsystem_test::make_subsystem_context(pool); + let (mut ctx, mut handle) = polkadot_subsystem::test_helpers::make_subsystem_context(pool); executor::block_on(async move { let max_plausibly_awaited = n_validators * 2; @@ -1205,7 +1205,7 @@ mod tests { }; let pool = sp_core::testing::SpawnBlockingExecutor::new(); - let (mut ctx, mut handle) = subsystem_test::make_subsystem_context(pool); + let (mut ctx, mut handle) = polkadot_subsystem::test_helpers::make_subsystem_context(pool); executor::block_on(async move { let pov_hash = make_pov(vec![1, 2, 3]).hash(); @@ -1267,7 +1267,7 @@ mod tests { }; let pool = sp_core::testing::SpawnBlockingExecutor::new(); - let (mut ctx, mut handle) = subsystem_test::make_subsystem_context(pool); + let (mut ctx, mut handle) = polkadot_subsystem::test_helpers::make_subsystem_context(pool); executor::block_on(async move { let pov_hash = make_pov(vec![1, 2, 3]).hash(); @@ -1344,7 +1344,7 @@ mod tests { }; let pool = sp_core::testing::SpawnBlockingExecutor::new(); - let (mut ctx, mut handle) = subsystem_test::make_subsystem_context(pool); + let (mut ctx, mut handle) = polkadot_subsystem::test_helpers::make_subsystem_context(pool); executor::block_on(async move { handle_network_update( @@ -1427,7 +1427,7 @@ mod tests { }; let pool = sp_core::testing::SpawnBlockingExecutor::new(); - let (mut ctx, mut handle) = subsystem_test::make_subsystem_context(pool); + let (mut ctx, mut handle) = polkadot_subsystem::test_helpers::make_subsystem_context(pool); executor::block_on(async move { handle_network_update( diff --git a/node/network/statement-distribution/Cargo.toml b/node/network/statement-distribution/Cargo.toml index 955830ef20..307178201c 100644 --- a/node/network/statement-distribution/Cargo.toml +++ b/node/network/statement-distribution/Cargo.toml @@ -21,7 +21,7 @@ indexmap = "1.4.0" [dev-dependencies] parking_lot = "0.10.0" -subsystem-test = { package = "polkadot-subsystem-test-helpers", path = "../../test-helpers/subsystem" } +polkadot-subsystem = { package = "polkadot-node-subsystem", path = "../../subsystem", features = ["test-helpers"] } assert_matches = "1.3.0" sp-keyring = { git = "https://github.com/paritytech/substrate", branch = "master" } sp-core = { git = "https://github.com/paritytech/substrate", branch = "master" } diff --git a/node/network/statement-distribution/src/lib.rs b/node/network/statement-distribution/src/lib.rs index 67ac4c6b64..ae13b62791 100644 --- a/node/network/statement-distribution/src/lib.rs +++ b/node/network/statement-distribution/src/lib.rs @@ -1213,7 +1213,7 @@ mod tests { }; let pool = sp_core::testing::SpawnBlockingExecutor::new(); - let (mut ctx, mut handle) = subsystem_test::make_subsystem_context(pool); + let (mut ctx, mut handle) = polkadot_subsystem::test_helpers::make_subsystem_context(pool); let peer = PeerId::random(); executor::block_on(async move { @@ -1305,7 +1305,7 @@ mod tests { ].into_iter().collect(); let pool = sp_core::testing::SpawnBlockingExecutor::new(); - let (mut ctx, mut handle) = subsystem_test::make_subsystem_context(pool); + let (mut ctx, mut handle) = polkadot_subsystem::test_helpers::make_subsystem_context(pool); executor::block_on(async move { let statement = { diff --git a/node/subsystem/Cargo.toml b/node/subsystem/Cargo.toml index 188e7cbfa7..701a197c2f 100644 --- a/node/subsystem/Cargo.toml +++ b/node/subsystem/Cargo.toml @@ -13,6 +13,7 @@ futures-timer = "3.0.2" keystore = { package = "sc-keystore", git = "https://github.com/paritytech/substrate", branch = "master" } log = "0.4.8" parity-scale-codec = "1.3.0" +parking_lot = { version = "0.10.0", optional = true } pin-project = "0.4.22" polkadot-node-primitives = { path = "../primitives" } polkadot-primitives = { path = "../../primitives" } @@ -20,3 +21,12 @@ polkadot-statement-table = { path = "../../statement-table" } sc-network = { git = "https://github.com/paritytech/substrate", branch = "master" } sp-core = { git = "https://github.com/paritytech/substrate", branch = "master" } streamunordered = "0.5.1" + +[dev-dependencies] +assert_matches = "1.3.0" +async-trait = "0.1" +futures = { version = "0.3.5", features = ["thread-pool"] } +parking_lot = "0.10.0" + +[features] +test-helpers = [ "parking_lot" ] diff --git a/node/subsystem/src/lib.rs b/node/subsystem/src/lib.rs index 8637db45a2..430a8418d9 100644 --- a/node/subsystem/src/lib.rs +++ b/node/subsystem/src/lib.rs @@ -35,6 +35,8 @@ use crate::messages::AllMessages; pub mod messages; pub mod util; +#[cfg(any(test, feature = "test-helpers"))] +pub mod test_helpers; /// Signals sent by an overseer to a subsystem. #[derive(PartialEq, Clone, Debug)] @@ -71,7 +73,7 @@ pub enum FromOverseer { /// * Subsystems dying when they are not expected to /// * Subsystems not dying when they are told to die /// * etc. -#[derive(Debug)] +#[derive(Debug, PartialEq, Eq)] pub struct SubsystemError; impl From for SubsystemError { diff --git a/node/subsystem/src/messages.rs b/node/subsystem/src/messages.rs index d3c630cb56..2040b41348 100644 --- a/node/subsystem/src/messages.rs +++ b/node/subsystem/src/messages.rs @@ -408,4 +408,10 @@ pub enum AllMessages { AvailabilityStore(AvailabilityStoreMessage), /// Message for the network bridge subsystem. NetworkBridge(NetworkBridgeMessage), + /// Test message + /// + /// This variant is only valid while testing, but makes the process of testing the + /// subsystem job manager much simpler. + #[cfg(test)] + Test(String), } diff --git a/node/test-helpers/subsystem/src/lib.rs b/node/subsystem/src/test_helpers.rs similarity index 97% rename from node/test-helpers/subsystem/src/lib.rs rename to node/subsystem/src/test_helpers.rs index 5fa7f0b9ec..256a928b43 100644 --- a/node/test-helpers/subsystem/src/lib.rs +++ b/node/subsystem/src/test_helpers.rs @@ -16,8 +16,8 @@ //! Utilities for testing subsystems. -use polkadot_subsystem::{SubsystemContext, FromOverseer, SubsystemResult, SubsystemError}; -use polkadot_subsystem::messages::AllMessages; +use crate::{SubsystemContext, FromOverseer, SubsystemResult, SubsystemError}; +use crate::messages::AllMessages; use futures::prelude::*; use futures::channel::mpsc; diff --git a/node/subsystem/src/util.rs b/node/subsystem/src/util.rs index 94bb95c26d..9964a1e8dd 100644 --- a/node/subsystem/src/util.rs +++ b/node/subsystem/src/util.rs @@ -22,7 +22,7 @@ use crate::{ messages::{AllMessages, RuntimeApiMessage, RuntimeApiRequest, SchedulerRoster}, - FromOverseer, SpawnedSubsystem, Subsystem, SubsystemContext, SubsystemResult, + FromOverseer, SpawnedSubsystem, Subsystem, SubsystemContext, SubsystemError, SubsystemResult, }; use futures::{ channel::{mpsc, oneshot}, @@ -67,12 +67,20 @@ pub enum Error { /// Attempted to send on a MPSC channel which has been canceled #[from] Mpsc(mpsc::SendError), + /// A subsystem error + #[from] + Subsystem(SubsystemError), + /// The type system wants this even though it doesn't make sense + #[from] + Infallible(std::convert::Infallible), /// Attempted to convert from an AllMessages to a FromJob, and failed. SenderConversion(String), /// The local node is not a validator. NotAValidator, /// The desired job is not present in the jobs list. JobNotFound(Hash), + /// Already forwarding errors to another sender + AlreadyForwarding, } /// Request some data from the `RuntimeApi`. @@ -262,7 +270,7 @@ pub trait ToJobTrait: TryFrom { } /// A JobHandle manages a particular job for a subsystem. -pub struct JobHandle { +struct JobHandle { abort_handle: future::AbortHandle, to_job: mpsc::Sender, finished: oneshot::Receiver<()>, @@ -271,23 +279,23 @@ pub struct JobHandle { impl JobHandle { /// Send a message to the job. - pub async fn send_msg(&mut self, msg: ToJob) -> Result<(), Error> { + async fn send_msg(&mut self, msg: ToJob) -> Result<(), Error> { self.to_job.send(msg).await.map_err(Into::into) } - - /// Abort the job without waiting for a graceful shutdown - pub fn abort(self) { - self.abort_handle.abort(); - } } impl JobHandle { /// Stop this job gracefully. /// /// If it hasn't shut itself down after `JOB_GRACEFUL_STOP_DURATION`, abort it. - pub async fn stop(mut self) { + async fn stop(mut self) { // we don't actually care if the message couldn't be sent - let _ = self.to_job.send(ToJob::STOP).await; + if let Err(_) = self.to_job.send(ToJob::STOP).await { + // no need to wait further here: the job is either stalled or + // disconnected, and in either case, we can just abort it immediately + self.abort_handle.abort(); + return; + } let stop_timer = Delay::new(JOB_GRACEFUL_STOP_DURATION); match future::select(stop_timer, self.finished).await { @@ -310,7 +318,7 @@ pub trait JobTrait: Unpin { /// Message type from the job. Typically a subset of AllMessages. type FromJob: 'static + Into + Send; /// Job runtime error. - type Error: std::fmt::Debug; + type Error: 'static + std::fmt::Debug + Send; /// Extra arguments this job needs to run properly. /// /// If no extra information is needed, it is perfectly acceptable to set it to `()`. @@ -323,8 +331,8 @@ pub trait JobTrait: Unpin { fn run( parent: Hash, run_args: Self::RunArgs, - rx_to: mpsc::Receiver, - tx_from: mpsc::Sender, + receiver: mpsc::Receiver, + sender: mpsc::Sender, ) -> Pin> + Send>>; /// Handle a message which has no relay parent, and therefore can't be dispatched to a particular job @@ -342,6 +350,18 @@ pub trait JobTrait: Unpin { } } +/// Error which can be returned by the jobs manager +/// +/// Wraps the utility error type and the job-specific error +#[derive(Debug, derive_more::From)] +pub enum JobsError { + /// utility error + #[from] + Utility(Error), + /// internal job error + Job(JobError), +} + /// Jobs manager for a subsystem /// /// - Spawns new jobs for a given relay-parent on demand. @@ -356,9 +376,10 @@ pub struct Jobs { #[pin] outgoing_msgs: StreamUnordered>, job: std::marker::PhantomData, + errors: Option, JobsError)>>, } -impl Jobs { +impl Jobs { /// Create a new Jobs manager which handles spawning appropriate jobs. pub fn new(spawner: Spawner) -> Self { Self { @@ -366,15 +387,31 @@ impl Jobs { running: HashMap::new(), outgoing_msgs: StreamUnordered::new(), job: std::marker::PhantomData, + errors: None, } } + /// Monitor errors which may occur during handling of a spawned job. + /// + /// By default, an error in a job is simply logged. Once this is called, + /// the error is forwarded onto the provided channel. + /// + /// Errors if the error channel already exists. + pub fn forward_errors(&mut self, tx: mpsc::Sender<(Option, JobsError)>) -> Result<(), Error> { + if self.errors.is_some() { return Err(Error::AlreadyForwarding) } + self.errors = Some(tx); + Ok(()) + } + /// Spawn a new job for this `parent_hash`, with whatever args are appropriate. fn spawn_job(&mut self, parent_hash: Hash, run_args: Job::RunArgs) -> Result<(), Error> { let (to_job_tx, to_job_rx) = mpsc::channel(JOB_CHANNEL_CAPACITY); let (from_job_tx, from_job_rx) = mpsc::channel(JOB_CHANNEL_CAPACITY); let (finished_tx, finished) = oneshot::channel(); + // clone the error transmitter to move into the future + let err_tx = self.errors.clone(); + let (future, abort_handle) = future::abortable(async move { if let Err(e) = Job::run(parent_hash, run_args, to_job_rx, from_job_tx).await { log::error!( @@ -383,12 +420,26 @@ impl Jobs { parent_hash, e, ); + + if let Some(mut err_tx) = err_tx { + // if we can't send the notification of error on the error channel, then + // there's no point trying to propagate this error onto the channel too + // all we can do is warn that error propagatio has failed + if let Err(e) = err_tx.send((Some(parent_hash), JobsError::Job(e))).await { + log::warn!("failed to forward error: {:?}", e); + } + } } }); - // discard output + // the spawn mechanism requires that the spawned future has no output let future = async move { + // job errors are already handled within the future, meaning + // that any errors here are due to the abortable mechanism. + // failure to abort isn't of interest. let _ = future.await; + // transmission failure here is only possible if the receiver is closed, + // which means the handle is dropped, which means we don't care anymore let _ = finished_tx.send(()); }; self.spawner.spawn(Job::NAME, future.boxed()); @@ -472,13 +523,14 @@ pub struct JobManager { run_args: Job::RunArgs, context: std::marker::PhantomData, job: std::marker::PhantomData, + errors: Option, JobsError)>>, } impl JobManager where Spawner: SpawnNamed + Clone + Send + Unpin, Context: SubsystemContext, - Job: JobTrait, + Job: 'static + JobTrait, Job::RunArgs: Clone, Job::ToJob: TryFrom + TryFrom<::Message> + Sync, { @@ -489,9 +541,22 @@ where run_args, context: std::marker::PhantomData, job: std::marker::PhantomData, + errors: None, } } + /// Monitor errors which may occur during handling of a spawned job. + /// + /// By default, an error in a job is simply logged. Once this is called, + /// the error is forwarded onto the provided channel. + /// + /// Errors if the error channel already exists. + pub fn forward_errors(&mut self, tx: mpsc::Sender<(Option, JobsError)>) -> Result<(), Error> { + if self.errors.is_some() { return Err(Error::AlreadyForwarding) } + self.errors = Some(tx); + Ok(()) + } + /// Run this subsystem /// /// Conceptually, this is very simple: it just loops forever. @@ -500,23 +565,41 @@ where /// - On other incoming messages, if they can be converted into Job::ToJob and /// include a hash, then they're forwarded to the appropriate individual job. /// - On outgoing messages from the jobs, it forwards them to the overseer. - pub async fn run(mut ctx: Context, run_args: Job::RunArgs, spawner: Spawner) { + /// + /// If `err_tx` is not `None`, errors are forwarded onto that channel as they occur. + /// Otherwise, most are logged and then discarded. + pub async fn run(mut ctx: Context, run_args: Job::RunArgs, spawner: Spawner, mut err_tx: Option, JobsError)>>) { let mut jobs = Jobs::new(spawner.clone()); + if let Some(ref err_tx) = err_tx { + jobs.forward_errors(err_tx.clone()).expect("we never call this twice in this context; qed"); + } loop { select! { - incoming = ctx.recv().fuse() => if Self::handle_incoming(incoming, &mut jobs, &run_args).await { break }, - outgoing = jobs.next().fuse() => if Self::handle_outgoing(outgoing, &mut ctx).await { break }, + incoming = ctx.recv().fuse() => if Self::handle_incoming(incoming, &mut jobs, &run_args, &mut err_tx).await { break }, + outgoing = jobs.next().fuse() => if Self::handle_outgoing(outgoing, &mut ctx, &mut err_tx).await { break }, complete => break, } } } + // if we have a channel on which to forward errors, do so + async fn fwd_err(hash: Option, err: JobsError, err_tx: &mut Option, JobsError)>>) { + if let Some(err_tx) = err_tx { + // if we can't send on the error transmission channel, we can't do anything useful about it + // still, we can at least log the failure + if let Err(e) = err_tx.send((hash, err)).await { + log::warn!("failed to forward error: {:?}", e); + } + } + } + // handle an incoming message. return true if we should break afterwards. async fn handle_incoming( incoming: SubsystemResult>, jobs: &mut Jobs, run_args: &Job::RunArgs, + err_tx: &mut Option, JobsError)>> ) -> bool { use crate::FromOverseer::{Communication, Signal}; use crate::OverseerSignal::{Conclude, StartWork, StopWork}; @@ -525,12 +608,14 @@ where Ok(Signal(StartWork(hash))) => { if let Err(e) = jobs.spawn_job(hash, run_args.clone()) { log::error!("Failed to spawn a job: {:?}", e); + Self::fwd_err(Some(hash), e.into(), err_tx).await; return true; } } Ok(Signal(StopWork(hash))) => { if let Err(e) = jobs.stop_job(hash).await { log::error!("Failed to stop a job: {:?}", e); + Self::fwd_err(Some(hash), e.into(), err_tx).await; return true; } } @@ -540,17 +625,21 @@ where // // Forwarding the stream to a drain means we wait until all of the items in the stream // have completed. Contrast with `into_future`, which turns it into a future of `(head, rest_stream)`. + use futures::sink::drain; use futures::stream::StreamExt; use futures::stream::FuturesUnordered; - let unordered = jobs.running + if let Err(e) = jobs.running .drain() .map(|(_, handle)| handle.stop()) - .collect::>(); - // now wait for all the futures to complete; collect a vector of their results - // this is strictly less efficient than draining them into oblivion, but this compiles, and that doesn't - // https://github.com/paritytech/polkadot/pull/1376#pullrequestreview-446488645 - let _ = async move { unordered.collect::>() }.await; + .collect::>() + .map(Ok) + .forward(drain()) + .await + { + log::error!("failed to stop all jobs on conclude signal: {:?}", e); + Self::fwd_err(None, Error::from(e).into(), err_tx).await; + } return true; } @@ -560,12 +649,14 @@ where Some(hash) => { if let Err(err) = jobs.send_msg(hash, to_job).await { log::error!("Failed to send a message to a job: {:?}", err); + Self::fwd_err(Some(hash), err.into(), err_tx).await; return true; } } None => { if let Err(err) = Job::handle_unanchored_msg(to_job) { log::error!("Failed to handle unhashed message: {:?}", err); + Self::fwd_err(None, JobsError::Job(err), err_tx).await; return true; } } @@ -574,6 +665,7 @@ where } Err(err) => { log::error!("error receiving message from subsystem context: {:?}", err); + Self::fwd_err(None, Error::from(err).into(), err_tx).await; return true; } } @@ -581,11 +673,12 @@ where } // handle an outgoing message. return true if we should break afterwards. - async fn handle_outgoing(outgoing: Option, ctx: &mut Context) -> bool { + async fn handle_outgoing(outgoing: Option, ctx: &mut Context, err_tx: &mut Option, JobsError)>>) -> bool { match outgoing { Some(msg) => { - // discard errors when sending the message upstream - let _ = ctx.send_message(msg.into()).await; + if let Err(e) = ctx.send_message(msg.into()).await { + Self::fwd_err(None, Error::from(e).into(), err_tx).await; + } } None => return true, } @@ -598,16 +691,18 @@ where Spawner: SpawnNamed + Send + Clone + Unpin + 'static, Context: SubsystemContext, ::Message: Into, - Job: JobTrait + Send, + Job: 'static + JobTrait + Send, Job::RunArgs: Clone + Sync, Job::ToJob: TryFrom + Sync, { fn start(self, ctx: Context) -> SpawnedSubsystem { let spawner = self.spawner.clone(); let run_args = self.run_args.clone(); + let errors = self.errors; + let future = Box::pin(async move { - Self::run(ctx, run_args, spawner).await; + Self::run(ctx, run_args, spawner, errors).await; }); SpawnedSubsystem { @@ -616,3 +711,242 @@ where } } } + +#[cfg(test)] +mod tests { + use assert_matches::assert_matches; + use crate::{ + messages::{AllMessages, CandidateSelectionMessage}, + test_helpers::{self, make_subsystem_context}, + util::{ + self, + JobsError, + JobManager, + JobTrait, + ToJobTrait, + }, + FromOverseer, + OverseerSignal, + }; + use futures::{ + channel::mpsc, + executor, + Future, + FutureExt, + stream::{self, StreamExt}, + SinkExt, + }; + use futures_timer::Delay; + use polkadot_primitives::v1::Hash; + use std::{ + collections::HashMap, + convert::TryFrom, + pin::Pin, + time::Duration, + }; + + // basic usage: in a nutshell, when you want to define a subsystem, just focus on what its jobs do; + // you can leave the subsystem itself to the job manager. + + // for purposes of demonstration, we're going to whip up a fake subsystem. + // this will 'select' candidates which are pre-loaded in the job + + // job structs are constructed within JobTrait::run + // most will want to retain the sender and receiver, as well as whatever other data they like + struct FakeCandidateSelectionJob { + receiver: mpsc::Receiver, + } + + // ToJob implementations require the following properties: + // + // - have a Stop variant (to impl ToJobTrait) + // - impl ToJobTrait + // - impl TryFrom + // - impl From (from SubsystemContext::Message) + // + // Mostly, they are just a type-safe subset of AllMessages that this job is prepared to receive + enum ToJob { + CandidateSelection(CandidateSelectionMessage), + Stop, + } + + impl ToJobTrait for ToJob { + const STOP: Self = ToJob::Stop; + + fn relay_parent(&self) -> Option { + match self { + Self::CandidateSelection(csm) => csm.relay_parent(), + Self::Stop => None, + } + } + } + + impl TryFrom for ToJob { + type Error = (); + + fn try_from(msg: AllMessages) -> Result { + match msg { + AllMessages::CandidateSelection(csm) => Ok(ToJob::CandidateSelection(csm)), + _ => Err(()) + } + } + } + + impl From for ToJob { + fn from(csm: CandidateSelectionMessage) -> ToJob { + ToJob::CandidateSelection(csm) + } + } + + // FromJob must be infallibly convertable into AllMessages. + // + // It exists to be a type-safe subset of AllMessages that this job is specified to send. + // + // Note: the Clone impl here is not generally required; it's just ueful for this test context because + // we include it in the RunArgs + #[derive(Clone)] + enum FromJob { + Test(String), + } + + impl From for AllMessages { + fn from(from_job: FromJob) -> AllMessages { + match from_job { + FromJob::Test(s) => AllMessages::Test(s), + } + } + } + + // Error will mostly be a wrapper to make the try operator more convenient; + // deriving From implementations for most variants is recommended. + // It must implement Debug for logging. + #[derive(Debug, derive_more::From)] + enum Error { + #[from] + Sending(mpsc::SendError) + } + + impl JobTrait for FakeCandidateSelectionJob { + type ToJob = ToJob; + type FromJob = FromJob; + type Error = Error; + // RunArgs can be anything that a particular job needs supplied from its external context + // in order to create the Job. In this case, they're a hashmap of parents to the mock outputs + // expected from that job. + // + // Note that it's not recommended to use something as heavy as a hashmap in production: the + // RunArgs get cloned so that each job gets its own owned copy. If you need that, wrap it in + // an Arc. Within a testing context, that efficiency is less important. + type RunArgs = HashMap>; + + const NAME: &'static str = "FakeCandidateSelectionJob"; + + /// Run a job for the parent block indicated + // + // this function is in charge of creating and executing the job's main loop + fn run( + parent: Hash, + mut run_args: Self::RunArgs, + receiver: mpsc::Receiver, + mut sender: mpsc::Sender, + ) -> Pin> + Send>> { + async move { + let job = FakeCandidateSelectionJob { + receiver, + }; + + // most jobs will have a request-response cycle at the heart of their run loop. + // however, in this case, we never receive valid messages, so we may as well + // just send all of our (mock) output messages now + let mock_output = run_args.remove(&parent).unwrap_or_default(); + let mut stream = stream::iter(mock_output.into_iter().map(Ok)); + sender.send_all(&mut stream).await?; + + // it isn't necessary to break run_loop into its own function, + // but it's convenient to separate the concerns in this way + job.run_loop().await + }.boxed() + } + } + + impl FakeCandidateSelectionJob { + async fn run_loop(mut self) -> Result<(), Error> { + while let Some(msg) = self.receiver.next().await { + match msg { + ToJob::CandidateSelection(_csm) => { + unimplemented!("we'd report the collator to the peer set manager here, but that's not implemented yet"); + } + ToJob::Stop => break, + } + } + + Ok(()) + } + } + + // with the job defined, it's straightforward to get a subsystem implementation. + type FakeCandidateSelectionSubsystem = JobManager; + + // this type lets us pretend to be the overseer + type OverseerHandle = test_helpers::TestSubsystemContextHandle; + + fn test_harness>(run_args: HashMap>, test: impl FnOnce(OverseerHandle, mpsc::Receiver<(Option, JobsError)>) -> T) { + let pool = sp_core::testing::SpawnBlockingExecutor::new(); + let (context, overseer_handle) = make_subsystem_context(pool.clone()); + let (err_tx, err_rx) = mpsc::channel(16); + + let subsystem = FakeCandidateSelectionSubsystem::run(context, run_args, pool, Some(err_tx)); + let test_future = test(overseer_handle, err_rx); + let timeout = Delay::new(Duration::from_secs(2)); + + futures::pin_mut!(test_future); + futures::pin_mut!(subsystem); + futures::pin_mut!(timeout); + + executor::block_on(async move { + futures::select! { + _ = test_future.fuse() => (), + _ = subsystem.fuse() => (), + _ = timeout.fuse() => panic!("test timed out instead of completing"), + } + }); + } + + #[test] + fn starting_and_stopping_job_works() { + let relay_parent: Hash = [0; 32].into(); + let mut run_args = HashMap::new(); + let test_message = format!("greetings from {}", relay_parent); + run_args.insert(relay_parent.clone(), vec![FromJob::Test(test_message.clone())]); + + test_harness(run_args, |mut overseer_handle, err_rx| async move { + overseer_handle.send(FromOverseer::Signal(OverseerSignal::StartWork(relay_parent))).await; + assert_matches!( + overseer_handle.recv().await, + AllMessages::Test(msg) if msg == test_message + ); + overseer_handle.send(FromOverseer::Signal(OverseerSignal::StopWork(relay_parent))).await; + + let errs: Vec<_> = err_rx.collect().await; + assert_eq!(errs.len(), 0); + }); + } + + #[test] + fn stopping_non_running_job_fails() { + let relay_parent: Hash = [0; 32].into(); + let run_args = HashMap::new(); + + test_harness(run_args, |mut overseer_handle, err_rx| async move { + overseer_handle.send(FromOverseer::Signal(OverseerSignal::StopWork(relay_parent))).await; + + let errs: Vec<_> = err_rx.collect().await; + assert_eq!(errs.len(), 1); + assert_eq!(errs[0].0, Some(relay_parent)); + assert_matches!( + errs[0].1, + JobsError::Utility(util::Error::JobNotFound(match_relay_parent)) if relay_parent == match_relay_parent + ); + }); + } +} diff --git a/node/test-helpers/subsystem/Cargo.toml b/node/test-helpers/subsystem/Cargo.toml deleted file mode 100644 index 8175a5a6b1..0000000000 --- a/node/test-helpers/subsystem/Cargo.toml +++ /dev/null @@ -1,13 +0,0 @@ -[package] -name = "polkadot-subsystem-test-helpers" -version = "0.1.0" -authors = ["Parity Technologies "] -edition = "2018" -description = "Helpers for testing subsystems" - -[dependencies] -futures = "0.3.5" -async-trait = "0.1" -polkadot-subsystem = { package = "polkadot-node-subsystem", path = "../../subsystem" } -parking_lot = "0.10.0" -sp-core = { git = "https://github.com/paritytech/substrate", branch = "master" } -- GitLab From 1c606b1c6c444cea81dd6b9856766d8a72ca04bb Mon Sep 17 00:00:00 2001 From: Pierre Krieger Date: Tue, 21 Jul 2020 09:27:16 +0200 Subject: [PATCH 084/192] Companion PR for substrate#6676 (#1427) * Companion PR for substrate#6676 * Update Substrate --- Cargo.lock | 301 ++++++++++++++++++++++++++++------------------------- 1 file changed, 159 insertions(+), 142 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 98079e4fff..6ae438ece9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1042,16 +1042,27 @@ version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10" +[[package]] +name = "ed25519" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf038a7b6fd7ef78ad3348b63f3a17550877b0e28f8d68bcc94894d1412158bc" +dependencies = [ + "signature", +] + [[package]] name = "ed25519-dalek" -version = "1.0.0-pre.3" +version = "1.0.0-pre.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "978710b352437433c97b2bff193f2fb1dfd58a093f863dd95e225a19baa599a2" +checksum = "21a8a37f4e8b35af971e6db5e3897e7a6344caa3f92f6544f88125a1f5f0035a" dependencies = [ - "clear_on_drop", "curve25519-dalek", + "ed25519", "rand 0.7.3", + "serde", "sha2 0.8.2", + "zeroize", ] [[package]] @@ -1314,7 +1325,7 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "fork-tree" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" +source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" dependencies = [ "parity-scale-codec", ] @@ -1322,7 +1333,7 @@ dependencies = [ [[package]] name = "frame-benchmarking" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" +source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" dependencies = [ "frame-support", "frame-system", @@ -1339,7 +1350,7 @@ dependencies = [ [[package]] name = "frame-benchmarking-cli" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" +source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" dependencies = [ "Inflector", "frame-benchmarking", @@ -1358,7 +1369,7 @@ dependencies = [ [[package]] name = "frame-executive" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" +source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" dependencies = [ "frame-support", "frame-system", @@ -1373,7 +1384,7 @@ dependencies = [ [[package]] name = "frame-metadata" version = "11.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" +source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" dependencies = [ "parity-scale-codec", "serde", @@ -1384,7 +1395,7 @@ dependencies = [ [[package]] name = "frame-support" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" +source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" dependencies = [ "bitmask", "frame-metadata", @@ -1409,7 +1420,7 @@ dependencies = [ [[package]] name = "frame-support-procedural" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" +source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" dependencies = [ "frame-support-procedural-tools", "proc-macro2 1.0.18", @@ -1420,7 +1431,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" +source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" dependencies = [ "frame-support-procedural-tools-derive", "proc-macro-crate", @@ -1432,7 +1443,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools-derive" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" +source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" dependencies = [ "proc-macro2 1.0.18", "quote 1.0.7", @@ -1442,7 +1453,7 @@ dependencies = [ [[package]] name = "frame-system" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" +source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" dependencies = [ "frame-support", "impl-trait-for-tuples", @@ -1458,7 +1469,7 @@ dependencies = [ [[package]] name = "frame-system-benchmarking" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" +source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" dependencies = [ "frame-benchmarking", "frame-support", @@ -1472,7 +1483,7 @@ dependencies = [ [[package]] name = "frame-system-rpc-runtime-api" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" +source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" dependencies = [ "parity-scale-codec", "sp-api", @@ -2651,9 +2662,9 @@ dependencies = [ [[package]] name = "libp2p-core" -version = "0.20.0" +version = "0.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11ca8d5a64a5d19b45e00e8f24afda6b8e1b605fb25ad7bcf62a42ecf19d7ff3" +checksum = "6a694fd76d7c33a45a0e6e1525e9b9b5d11127c9c94e560ac0f8abba54ed80af" dependencies = [ "asn1_der", "bs58", @@ -3466,7 +3477,7 @@ dependencies = [ [[package]] name = "pallet-authority-discovery" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" +source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" dependencies = [ "frame-support", "frame-system", @@ -3482,7 +3493,7 @@ dependencies = [ [[package]] name = "pallet-authorship" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" +source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" dependencies = [ "frame-support", "frame-system", @@ -3497,7 +3508,7 @@ dependencies = [ [[package]] name = "pallet-babe" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" +source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" dependencies = [ "frame-benchmarking", "frame-support", @@ -3522,7 +3533,7 @@ dependencies = [ [[package]] name = "pallet-balances" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" +source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" dependencies = [ "frame-benchmarking", "frame-support", @@ -3536,7 +3547,7 @@ dependencies = [ [[package]] name = "pallet-collective" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" +source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" dependencies = [ "frame-benchmarking", "frame-support", @@ -3552,7 +3563,7 @@ dependencies = [ [[package]] name = "pallet-democracy" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" +source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" dependencies = [ "frame-benchmarking", "frame-support", @@ -3567,7 +3578,7 @@ dependencies = [ [[package]] name = "pallet-elections-phragmen" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" +source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" dependencies = [ "frame-benchmarking", "frame-support", @@ -3582,7 +3593,7 @@ dependencies = [ [[package]] name = "pallet-finality-tracker" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" +source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" dependencies = [ "frame-support", "frame-system", @@ -3598,7 +3609,7 @@ dependencies = [ [[package]] name = "pallet-grandpa" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" +source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" dependencies = [ "frame-benchmarking", "frame-support", @@ -3620,7 +3631,7 @@ dependencies = [ [[package]] name = "pallet-identity" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" +source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" dependencies = [ "enumflags2", "frame-benchmarking", @@ -3636,7 +3647,7 @@ dependencies = [ [[package]] name = "pallet-im-online" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" +source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" dependencies = [ "frame-benchmarking", "frame-support", @@ -3656,7 +3667,7 @@ dependencies = [ [[package]] name = "pallet-indices" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" +source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" dependencies = [ "frame-support", "frame-system", @@ -3672,7 +3683,7 @@ dependencies = [ [[package]] name = "pallet-membership" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" +source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" dependencies = [ "frame-support", "frame-system", @@ -3686,7 +3697,7 @@ dependencies = [ [[package]] name = "pallet-multisig" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" +source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" dependencies = [ "frame-support", "frame-system", @@ -3701,7 +3712,7 @@ dependencies = [ [[package]] name = "pallet-nicks" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" +source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" dependencies = [ "frame-support", "frame-system", @@ -3715,7 +3726,7 @@ dependencies = [ [[package]] name = "pallet-offences" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" +source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" dependencies = [ "frame-support", "frame-system", @@ -3730,7 +3741,7 @@ dependencies = [ [[package]] name = "pallet-offences-benchmarking" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" +source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" dependencies = [ "frame-benchmarking", "frame-support", @@ -3751,7 +3762,7 @@ dependencies = [ [[package]] name = "pallet-proxy" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" +source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" dependencies = [ "frame-support", "frame-system", @@ -3766,7 +3777,7 @@ dependencies = [ [[package]] name = "pallet-randomness-collective-flip" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" +source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" dependencies = [ "frame-support", "frame-system", @@ -3779,7 +3790,7 @@ dependencies = [ [[package]] name = "pallet-recovery" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" +source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" dependencies = [ "enumflags2", "frame-support", @@ -3794,7 +3805,7 @@ dependencies = [ [[package]] name = "pallet-scheduler" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" +source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" dependencies = [ "frame-benchmarking", "frame-support", @@ -3809,7 +3820,7 @@ dependencies = [ [[package]] name = "pallet-session" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" +source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" dependencies = [ "frame-support", "frame-system", @@ -3829,7 +3840,7 @@ dependencies = [ [[package]] name = "pallet-session-benchmarking" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" +source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" dependencies = [ "frame-benchmarking", "frame-support", @@ -3845,7 +3856,7 @@ dependencies = [ [[package]] name = "pallet-society" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" +source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" dependencies = [ "frame-support", "frame-system", @@ -3859,7 +3870,7 @@ dependencies = [ [[package]] name = "pallet-staking" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" +source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" dependencies = [ "frame-benchmarking", "frame-support", @@ -3881,7 +3892,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-curve" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" +source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -3892,7 +3903,7 @@ dependencies = [ [[package]] name = "pallet-sudo" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" +source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" dependencies = [ "frame-support", "frame-system", @@ -3906,7 +3917,7 @@ dependencies = [ [[package]] name = "pallet-timestamp" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" +source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" dependencies = [ "frame-benchmarking", "frame-support", @@ -3924,7 +3935,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" +source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" dependencies = [ "frame-support", "frame-system", @@ -3941,7 +3952,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" +source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" dependencies = [ "jsonrpc-core", "jsonrpc-core-client", @@ -3959,7 +3970,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc-runtime-api" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" +source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" dependencies = [ "frame-support", "parity-scale-codec", @@ -3972,7 +3983,7 @@ dependencies = [ [[package]] name = "pallet-treasury" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" +source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" dependencies = [ "frame-benchmarking", "frame-support", @@ -3987,7 +3998,7 @@ dependencies = [ [[package]] name = "pallet-utility" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" +source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" dependencies = [ "frame-benchmarking", "frame-support", @@ -4003,7 +4014,7 @@ dependencies = [ [[package]] name = "pallet-vesting" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" +source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" dependencies = [ "enumflags2", "frame-benchmarking", @@ -5934,7 +5945,7 @@ dependencies = [ [[package]] name = "sc-authority-discovery" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" +source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" dependencies = [ "bytes 0.5.5", "derive_more 0.99.9", @@ -5961,7 +5972,7 @@ dependencies = [ [[package]] name = "sc-basic-authorship" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" +source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -5985,7 +5996,7 @@ dependencies = [ [[package]] name = "sc-block-builder" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" +source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" dependencies = [ "parity-scale-codec", "sc-client-api", @@ -6002,7 +6013,7 @@ dependencies = [ [[package]] name = "sc-chain-spec" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" +source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" dependencies = [ "impl-trait-for-tuples", "sc-chain-spec-derive", @@ -6018,7 +6029,7 @@ dependencies = [ [[package]] name = "sc-chain-spec-derive" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" +source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -6029,7 +6040,7 @@ dependencies = [ [[package]] name = "sc-cli" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" +source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" dependencies = [ "ansi_term 0.12.1", "atty", @@ -6070,7 +6081,7 @@ dependencies = [ [[package]] name = "sc-client-api" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" +source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" dependencies = [ "derive_more 0.99.9", "fnv", @@ -6106,7 +6117,7 @@ dependencies = [ [[package]] name = "sc-client-db" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" +source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" dependencies = [ "blake2-rfc", "hash-db", @@ -6135,7 +6146,7 @@ dependencies = [ [[package]] name = "sc-consensus" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" +source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" dependencies = [ "sc-client-api", "sp-blockchain", @@ -6146,7 +6157,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" +source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" dependencies = [ "derive_more 0.99.9", "fork-tree", @@ -6188,7 +6199,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe-rpc" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" +source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -6212,7 +6223,7 @@ dependencies = [ [[package]] name = "sc-consensus-epochs" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" +source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" dependencies = [ "fork-tree", "parity-scale-codec", @@ -6225,7 +6236,7 @@ dependencies = [ [[package]] name = "sc-consensus-slots" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" +source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6248,7 +6259,7 @@ dependencies = [ [[package]] name = "sc-consensus-uncles" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" +source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" dependencies = [ "log 0.4.8", "sc-client-api", @@ -6262,7 +6273,7 @@ dependencies = [ [[package]] name = "sc-executor" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" +source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" dependencies = [ "derive_more 0.99.9", "lazy_static", @@ -6290,7 +6301,7 @@ dependencies = [ [[package]] name = "sc-executor-common" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" +source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" dependencies = [ "derive_more 0.99.9", "log 0.4.8", @@ -6307,7 +6318,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmi" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" +source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" dependencies = [ "log 0.4.8", "parity-scale-codec", @@ -6322,7 +6333,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmtime" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" +source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" dependencies = [ "cranelift-codegen", "cranelift-wasm", @@ -6343,7 +6354,7 @@ dependencies = [ [[package]] name = "sc-finality-grandpa" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" +source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" dependencies = [ "assert_matches", "derive_more 0.99.9", @@ -6381,7 +6392,7 @@ dependencies = [ [[package]] name = "sc-finality-grandpa-rpc" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" +source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" dependencies = [ "derive_more 0.99.9", "finality-grandpa", @@ -6398,7 +6409,7 @@ dependencies = [ [[package]] name = "sc-informant" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" +source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" dependencies = [ "ansi_term 0.12.1", "futures 0.3.5", @@ -6416,7 +6427,7 @@ dependencies = [ [[package]] name = "sc-keystore" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" +source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" dependencies = [ "derive_more 0.99.9", "hex", @@ -6432,7 +6443,7 @@ dependencies = [ [[package]] name = "sc-light" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" +source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" dependencies = [ "hash-db", "lazy_static", @@ -6451,7 +6462,7 @@ dependencies = [ [[package]] name = "sc-network" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" +source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" dependencies = [ "bitflags", "bs58", @@ -6503,7 +6514,7 @@ dependencies = [ [[package]] name = "sc-network-gossip" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" +source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6518,7 +6529,7 @@ dependencies = [ [[package]] name = "sc-network-test" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" +source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" dependencies = [ "env_logger", "futures 0.3.5", @@ -6545,7 +6556,7 @@ dependencies = [ [[package]] name = "sc-offchain" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" +source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" dependencies = [ "bytes 0.5.5", "fnv", @@ -6572,7 +6583,7 @@ dependencies = [ [[package]] name = "sc-peerset" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" +source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" dependencies = [ "futures 0.3.5", "libp2p", @@ -6585,7 +6596,7 @@ dependencies = [ [[package]] name = "sc-proposer-metrics" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" +source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" dependencies = [ "log 0.4.8", "substrate-prometheus-endpoint", @@ -6594,7 +6605,7 @@ dependencies = [ [[package]] name = "sc-rpc" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" +source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" dependencies = [ "futures 0.3.5", "hash-db", @@ -6626,7 +6637,7 @@ dependencies = [ [[package]] name = "sc-rpc-api" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" +source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -6650,7 +6661,7 @@ dependencies = [ [[package]] name = "sc-rpc-server" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" +source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" dependencies = [ "jsonrpc-core", "jsonrpc-http-server", @@ -6666,7 +6677,7 @@ dependencies = [ [[package]] name = "sc-service" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" +source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" dependencies = [ "derive_more 0.99.9", "directories", @@ -6728,7 +6739,7 @@ dependencies = [ [[package]] name = "sc-state-db" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" +source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" dependencies = [ "log 0.4.8", "parity-scale-codec", @@ -6742,7 +6753,7 @@ dependencies = [ [[package]] name = "sc-telemetry" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" +source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6763,7 +6774,7 @@ dependencies = [ [[package]] name = "sc-tracing" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" +source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" dependencies = [ "erased-serde", "log 0.4.8", @@ -6780,7 +6791,7 @@ dependencies = [ [[package]] name = "sc-transaction-graph" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" +source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -6801,7 +6812,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" +source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -7092,6 +7103,12 @@ dependencies = [ "libc", ] +[[package]] +name = "signature" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65211b7b6fc3f14ff9fc7a2011a434e3e6880585bd2e9e9396315ae24cbf7852" + [[package]] name = "slab" version = "0.4.2" @@ -7227,7 +7244,7 @@ dependencies = [ [[package]] name = "sp-allocator" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" +source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" dependencies = [ "derive_more 0.99.9", "log 0.4.8", @@ -7239,7 +7256,7 @@ dependencies = [ [[package]] name = "sp-api" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" +source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" dependencies = [ "hash-db", "parity-scale-codec", @@ -7254,7 +7271,7 @@ dependencies = [ [[package]] name = "sp-api-proc-macro" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" +source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" dependencies = [ "blake2-rfc", "proc-macro-crate", @@ -7266,7 +7283,7 @@ dependencies = [ [[package]] name = "sp-application-crypto" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" +source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" dependencies = [ "parity-scale-codec", "serde", @@ -7278,7 +7295,7 @@ dependencies = [ [[package]] name = "sp-arithmetic" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" +source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" dependencies = [ "integer-sqrt", "num-traits 0.2.12", @@ -7291,7 +7308,7 @@ dependencies = [ [[package]] name = "sp-authority-discovery" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" +source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" dependencies = [ "parity-scale-codec", "sp-api", @@ -7303,7 +7320,7 @@ dependencies = [ [[package]] name = "sp-authorship" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" +source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" dependencies = [ "parity-scale-codec", "sp-inherents", @@ -7314,7 +7331,7 @@ dependencies = [ [[package]] name = "sp-block-builder" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" +source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" dependencies = [ "parity-scale-codec", "sp-api", @@ -7326,7 +7343,7 @@ dependencies = [ [[package]] name = "sp-blockchain" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" +source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" dependencies = [ "derive_more 0.99.9", "log 0.4.8", @@ -7343,7 +7360,7 @@ dependencies = [ [[package]] name = "sp-chain-spec" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" +source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" dependencies = [ "serde", "serde_json", @@ -7352,7 +7369,7 @@ dependencies = [ [[package]] name = "sp-consensus" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" +source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -7377,7 +7394,7 @@ dependencies = [ [[package]] name = "sp-consensus-aura" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" +source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" dependencies = [ "parity-scale-codec", "sp-api", @@ -7391,7 +7408,7 @@ dependencies = [ [[package]] name = "sp-consensus-babe" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" +source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" dependencies = [ "merlin", "parity-scale-codec", @@ -7410,7 +7427,7 @@ dependencies = [ [[package]] name = "sp-consensus-slots" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" +source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" dependencies = [ "parity-scale-codec", "sp-runtime", @@ -7419,7 +7436,7 @@ dependencies = [ [[package]] name = "sp-consensus-vrf" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" +source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" dependencies = [ "parity-scale-codec", "schnorrkel", @@ -7431,7 +7448,7 @@ dependencies = [ [[package]] name = "sp-core" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" +source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" dependencies = [ "base58", "blake2-rfc", @@ -7474,7 +7491,7 @@ dependencies = [ [[package]] name = "sp-database" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" +source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" dependencies = [ "kvdb", "parking_lot 0.10.2", @@ -7483,7 +7500,7 @@ dependencies = [ [[package]] name = "sp-debug-derive" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" +source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" dependencies = [ "proc-macro2 1.0.18", "quote 1.0.7", @@ -7493,7 +7510,7 @@ dependencies = [ [[package]] name = "sp-externalities" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" +source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" dependencies = [ "environmental", "parity-scale-codec", @@ -7504,7 +7521,7 @@ dependencies = [ [[package]] name = "sp-finality-grandpa" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" +source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" dependencies = [ "finality-grandpa", "log 0.4.8", @@ -7520,7 +7537,7 @@ dependencies = [ [[package]] name = "sp-finality-tracker" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" +source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" dependencies = [ "parity-scale-codec", "sp-inherents", @@ -7530,7 +7547,7 @@ dependencies = [ [[package]] name = "sp-inherents" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" +source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" dependencies = [ "derive_more 0.99.9", "parity-scale-codec", @@ -7542,7 +7559,7 @@ dependencies = [ [[package]] name = "sp-io" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" +source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" dependencies = [ "futures 0.3.5", "hash-db", @@ -7563,7 +7580,7 @@ dependencies = [ [[package]] name = "sp-keyring" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" +source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" dependencies = [ "lazy_static", "sp-core", @@ -7574,7 +7591,7 @@ dependencies = [ [[package]] name = "sp-npos-elections" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" +source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" dependencies = [ "parity-scale-codec", "serde", @@ -7586,7 +7603,7 @@ dependencies = [ [[package]] name = "sp-npos-elections-compact" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" +source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -7597,7 +7614,7 @@ dependencies = [ [[package]] name = "sp-offchain" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" +source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" dependencies = [ "sp-api", "sp-core", @@ -7607,7 +7624,7 @@ dependencies = [ [[package]] name = "sp-panic-handler" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" +source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" dependencies = [ "backtrace", "log 0.4.8", @@ -7616,7 +7633,7 @@ dependencies = [ [[package]] name = "sp-rpc" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" +source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" dependencies = [ "serde", "sp-core", @@ -7625,7 +7642,7 @@ dependencies = [ [[package]] name = "sp-runtime" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" +source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" dependencies = [ "either", "hash256-std-hasher", @@ -7647,7 +7664,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" +source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" dependencies = [ "parity-scale-codec", "primitive-types", @@ -7662,7 +7679,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" +source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" dependencies = [ "Inflector", "proc-macro-crate", @@ -7674,7 +7691,7 @@ dependencies = [ [[package]] name = "sp-serializer" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" +source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" dependencies = [ "serde", "serde_json", @@ -7683,7 +7700,7 @@ dependencies = [ [[package]] name = "sp-session" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" +source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" dependencies = [ "parity-scale-codec", "sp-api", @@ -7696,7 +7713,7 @@ dependencies = [ [[package]] name = "sp-staking" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" +source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" dependencies = [ "parity-scale-codec", "sp-runtime", @@ -7706,7 +7723,7 @@ dependencies = [ [[package]] name = "sp-state-machine" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" +source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" dependencies = [ "hash-db", "itertools 0.9.0", @@ -7727,12 +7744,12 @@ dependencies = [ [[package]] name = "sp-std" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" +source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" [[package]] name = "sp-storage" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" +source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" dependencies = [ "impl-serde 0.2.3", "ref-cast", @@ -7744,7 +7761,7 @@ dependencies = [ [[package]] name = "sp-timestamp" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" +source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -7758,7 +7775,7 @@ dependencies = [ [[package]] name = "sp-tracing" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" +source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" dependencies = [ "log 0.4.8", "rental", @@ -7768,7 +7785,7 @@ dependencies = [ [[package]] name = "sp-transaction-pool" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" +source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -7783,7 +7800,7 @@ dependencies = [ [[package]] name = "sp-trie" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" +source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" dependencies = [ "hash-db", "memory-db", @@ -7797,7 +7814,7 @@ dependencies = [ [[package]] name = "sp-utils" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" +source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" dependencies = [ "futures 0.3.5", "futures-core", @@ -7809,7 +7826,7 @@ dependencies = [ [[package]] name = "sp-version" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" +source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" dependencies = [ "impl-serde 0.2.3", "parity-scale-codec", @@ -7821,7 +7838,7 @@ dependencies = [ [[package]] name = "sp-wasm-interface" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" +source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -7961,7 +7978,7 @@ dependencies = [ [[package]] name = "substrate-browser-utils" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" +source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" dependencies = [ "chrono", "clear_on_drop", @@ -7988,7 +8005,7 @@ dependencies = [ [[package]] name = "substrate-build-script-utils" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" +source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" dependencies = [ "platforms", ] @@ -7996,7 +8013,7 @@ dependencies = [ [[package]] name = "substrate-frame-rpc-system" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" +source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" dependencies = [ "frame-system-rpc-runtime-api", "futures 0.3.5", @@ -8019,7 +8036,7 @@ dependencies = [ [[package]] name = "substrate-prometheus-endpoint" version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" +source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" dependencies = [ "async-std", "derive_more 0.99.9", @@ -8033,7 +8050,7 @@ dependencies = [ [[package]] name = "substrate-test-client" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" +source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" dependencies = [ "futures 0.1.29", "futures 0.3.5", @@ -8059,7 +8076,7 @@ dependencies = [ [[package]] name = "substrate-test-runtime" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" +source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" dependencies = [ "cfg-if", "frame-executive", @@ -8099,7 +8116,7 @@ dependencies = [ [[package]] name = "substrate-test-runtime-client" version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" +source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" dependencies = [ "futures 0.3.5", "parity-scale-codec", @@ -8120,7 +8137,7 @@ dependencies = [ [[package]] name = "substrate-wasm-builder-runner" version = "1.0.6" -source = "git+https://github.com/paritytech/substrate#1b267075189dec625aabb48eb82e9c30ae9c56e6" +source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" [[package]] name = "substrate-wasm-builder-runner" -- GitLab From b481d6c07902a2dd0e867411c63442035525610d Mon Sep 17 00:00:00 2001 From: Gavin Wood Date: Tue, 21 Jul 2020 12:19:23 +0200 Subject: [PATCH 085/192] Enable transfers (#1443) * Enable transfers Also quash any conviction from Referendum Zero; Sudo was always going to have been removed so lock-voting doesn't make sense in this case. * Add test for migration; remove superfluous comment. * Fixes * Bump * Weekly elections --- Cargo.lock | 40 ++-- Cargo.toml | 2 +- availability-store/Cargo.toml | 2 +- cli/Cargo.toml | 2 +- collator/Cargo.toml | 2 +- erasure-coding/Cargo.toml | 2 +- network/Cargo.toml | 2 +- network/test/Cargo.toml | 2 +- parachain/Cargo.toml | 2 +- parachain/test-parachains/adder/Cargo.toml | 2 +- parachain/test-parachains/halt/Cargo.toml | 2 +- primitives/Cargo.toml | 2 +- rpc/Cargo.toml | 2 +- runtime/common/Cargo.toml | 2 +- runtime/kusama/Cargo.toml | 2 +- runtime/kusama/src/lib.rs | 2 +- runtime/polkadot/Cargo.toml | 2 +- runtime/polkadot/src/lib.rs | 148 +++++++++---- runtime/polkadot/src/poll.rs | 233 --------------------- runtime/test-runtime/Cargo.toml | 2 +- runtime/westend/Cargo.toml | 2 +- runtime/westend/src/lib.rs | 2 +- service/Cargo.toml | 2 +- statement-table/Cargo.toml | 2 +- validation/Cargo.toml | 2 +- 25 files changed, 152 insertions(+), 313 deletions(-) delete mode 100644 runtime/polkadot/src/poll.rs diff --git a/Cargo.lock b/Cargo.lock index 6ae438ece9..28532bb262 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2433,7 +2433,7 @@ dependencies = [ [[package]] name = "kusama-runtime" -version = "0.8.17" +version = "0.8.18" dependencies = [ "bitvec", "frame-benchmarking", @@ -4313,7 +4313,7 @@ checksum = "feb3b2b1033b8a60b4da6ee470325f887758c95d5320f52f9ce0df055a55940e" [[package]] name = "polkadot" -version = "0.8.17" +version = "0.8.18" dependencies = [ "assert_cmd", "futures 0.3.5", @@ -4327,7 +4327,7 @@ dependencies = [ [[package]] name = "polkadot-availability-store" -version = "0.8.17" +version = "0.8.18" dependencies = [ "derive_more 0.99.9", "exit-future", @@ -4353,7 +4353,7 @@ dependencies = [ [[package]] name = "polkadot-cli" -version = "0.8.17" +version = "0.8.18" dependencies = [ "frame-benchmarking-cli", "futures 0.3.5", @@ -4378,7 +4378,7 @@ dependencies = [ [[package]] name = "polkadot-collator" -version = "0.8.17" +version = "0.8.18" dependencies = [ "futures 0.3.5", "futures-timer 2.0.2", @@ -4416,7 +4416,7 @@ dependencies = [ [[package]] name = "polkadot-erasure-coding" -version = "0.8.17" +version = "0.8.18" dependencies = [ "derive_more 0.15.0", "parity-scale-codec", @@ -4428,7 +4428,7 @@ dependencies = [ [[package]] name = "polkadot-network" -version = "0.8.17" +version = "0.8.18" dependencies = [ "arrayvec 0.4.12", "bytes 0.5.5", @@ -4476,7 +4476,7 @@ dependencies = [ [[package]] name = "polkadot-network-test" -version = "0.8.17" +version = "0.8.18" dependencies = [ "futures 0.3.5", "log 0.4.8", @@ -4596,7 +4596,7 @@ dependencies = [ [[package]] name = "polkadot-parachain" -version = "0.8.17" +version = "0.8.18" dependencies = [ "derive_more 0.99.9", "log 0.4.8", @@ -4634,7 +4634,7 @@ dependencies = [ [[package]] name = "polkadot-primitives" -version = "0.8.17" +version = "0.8.18" dependencies = [ "bitvec", "frame-system", @@ -4658,7 +4658,7 @@ dependencies = [ [[package]] name = "polkadot-rpc" -version = "0.8.17" +version = "0.8.18" dependencies = [ "jsonrpc-core", "pallet-transaction-payment-rpc", @@ -4684,7 +4684,7 @@ dependencies = [ [[package]] name = "polkadot-runtime" -version = "0.8.17" +version = "0.8.18" dependencies = [ "bitvec", "frame-benchmarking", @@ -4758,7 +4758,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-common" -version = "0.8.17" +version = "0.8.18" dependencies = [ "bitvec", "frame-benchmarking", @@ -4846,7 +4846,7 @@ dependencies = [ [[package]] name = "polkadot-service" -version = "0.8.17" +version = "0.8.18" dependencies = [ "env_logger", "frame-benchmarking", @@ -4989,7 +4989,7 @@ dependencies = [ [[package]] name = "polkadot-statement-table" -version = "0.8.17" +version = "0.8.18" dependencies = [ "parity-scale-codec", "polkadot-primitives", @@ -4998,7 +4998,7 @@ dependencies = [ [[package]] name = "polkadot-test-runtime" -version = "0.8.17" +version = "0.8.18" dependencies = [ "bitvec", "frame-executive", @@ -5129,7 +5129,7 @@ dependencies = [ [[package]] name = "polkadot-validation" -version = "0.8.17" +version = "0.8.18" dependencies = [ "ansi_term 0.12.1", "bitvec", @@ -8363,7 +8363,7 @@ dependencies = [ [[package]] name = "test-parachain-adder" -version = "0.8.17" +version = "0.8.18" dependencies = [ "dlmalloc", "parity-scale-codec", @@ -8404,7 +8404,7 @@ dependencies = [ [[package]] name = "test-parachain-halt" -version = "0.8.17" +version = "0.8.18" dependencies = [ "substrate-wasm-builder-runner 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -9343,7 +9343,7 @@ dependencies = [ [[package]] name = "westend-runtime" -version = "0.8.17" +version = "0.8.18" dependencies = [ "bitvec", "frame-benchmarking", diff --git a/Cargo.toml b/Cargo.toml index e0125209f2..b7f45d5d26 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,7 +4,7 @@ path = "src/main.rs" [package] name = "polkadot" -version = "0.8.17" +version = "0.8.18" authors = ["Parity Technologies "] edition = "2018" diff --git a/availability-store/Cargo.toml b/availability-store/Cargo.toml index 25b39a0262..48e5024e4e 100644 --- a/availability-store/Cargo.toml +++ b/availability-store/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "polkadot-availability-store" description = "Persistent database for parachain data" -version = "0.8.17" +version = "0.8.18" authors = ["Parity Technologies "] edition = "2018" diff --git a/cli/Cargo.toml b/cli/Cargo.toml index 2847d1b1c7..c2951cc8d5 100644 --- a/cli/Cargo.toml +++ b/cli/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-cli" -version = "0.8.17" +version = "0.8.18" authors = ["Parity Technologies "] description = "Polkadot Relay-chain Client Node" edition = "2018" diff --git a/collator/Cargo.toml b/collator/Cargo.toml index 09d0112121..1917b20380 100644 --- a/collator/Cargo.toml +++ b/collator/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-collator" -version = "0.8.17" +version = "0.8.18" authors = ["Parity Technologies "] description = "Collator node implementation" edition = "2018" diff --git a/erasure-coding/Cargo.toml b/erasure-coding/Cargo.toml index ab9b31e151..2f702f37fd 100644 --- a/erasure-coding/Cargo.toml +++ b/erasure-coding/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-erasure-coding" -version = "0.8.17" +version = "0.8.18" authors = ["Parity Technologies "] edition = "2018" diff --git a/network/Cargo.toml b/network/Cargo.toml index db5f99e714..51b9de4728 100644 --- a/network/Cargo.toml +++ b/network/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-network" -version = "0.8.17" +version = "0.8.18" authors = ["Parity Technologies "] description = "Polkadot-specific networking protocol" edition = "2018" diff --git a/network/test/Cargo.toml b/network/test/Cargo.toml index b5397c46d2..239838c31a 100644 --- a/network/test/Cargo.toml +++ b/network/test/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-network-test" -version = "0.8.17" +version = "0.8.18" license = "GPL-3.0" authors = ["Parity Technologies "] edition = "2018" diff --git a/parachain/Cargo.toml b/parachain/Cargo.toml index b7676170b8..afd1110adc 100644 --- a/parachain/Cargo.toml +++ b/parachain/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-parachain" -version = "0.8.17" +version = "0.8.18" authors = ["Parity Technologies "] description = "Types and utilities for creating and working with parachains" edition = "2018" diff --git a/parachain/test-parachains/adder/Cargo.toml b/parachain/test-parachains/adder/Cargo.toml index 6d8f15e743..372832c831 100644 --- a/parachain/test-parachains/adder/Cargo.toml +++ b/parachain/test-parachains/adder/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "test-parachain-adder" -version = "0.8.17" +version = "0.8.18" authors = ["Parity Technologies "] description = "Test parachain which adds to a number as its state transition" edition = "2018" diff --git a/parachain/test-parachains/halt/Cargo.toml b/parachain/test-parachains/halt/Cargo.toml index 1dd71cf306..14acf0ecba 100644 --- a/parachain/test-parachains/halt/Cargo.toml +++ b/parachain/test-parachains/halt/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "test-parachain-halt" -version = "0.8.17" +version = "0.8.18" authors = ["Parity Technologies "] description = "Test parachain which executes forever" edition = "2018" diff --git a/primitives/Cargo.toml b/primitives/Cargo.toml index 96a15f68c5..3a8373f2e3 100644 --- a/primitives/Cargo.toml +++ b/primitives/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-primitives" -version = "0.8.17" +version = "0.8.18" authors = ["Parity Technologies "] edition = "2018" diff --git a/rpc/Cargo.toml b/rpc/Cargo.toml index 58b300480f..96da1db65c 100644 --- a/rpc/Cargo.toml +++ b/rpc/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-rpc" -version = "0.8.17" +version = "0.8.18" authors = ["Parity Technologies "] edition = "2018" diff --git a/runtime/common/Cargo.toml b/runtime/common/Cargo.toml index 5cf992c76f..83ec53f44c 100644 --- a/runtime/common/Cargo.toml +++ b/runtime/common/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-runtime-common" -version = "0.8.17" +version = "0.8.18" authors = ["Parity Technologies "] edition = "2018" diff --git a/runtime/kusama/Cargo.toml b/runtime/kusama/Cargo.toml index a8083a8a39..43526f13fd 100644 --- a/runtime/kusama/Cargo.toml +++ b/runtime/kusama/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "kusama-runtime" -version = "0.8.17" +version = "0.8.18" authors = ["Parity Technologies "] edition = "2018" build = "build.rs" diff --git a/runtime/kusama/src/lib.rs b/runtime/kusama/src/lib.rs index 6eed529ab8..df583ccbc9 100644 --- a/runtime/kusama/src/lib.rs +++ b/runtime/kusama/src/lib.rs @@ -87,7 +87,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("kusama"), impl_name: create_runtime_str!("parity-kusama"), authoring_version: 2, - spec_version: 2017, + spec_version: 2018, impl_version: 0, #[cfg(not(feature = "disable-runtime-api"))] apis: RUNTIME_API_VERSIONS, diff --git a/runtime/polkadot/Cargo.toml b/runtime/polkadot/Cargo.toml index 0af2fda617..fc1c53ad28 100644 --- a/runtime/polkadot/Cargo.toml +++ b/runtime/polkadot/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-runtime" -version = "0.8.17" +version = "0.8.18" authors = ["Parity Technologies "] edition = "2018" build = "build.rs" diff --git a/runtime/polkadot/src/lib.rs b/runtime/polkadot/src/lib.rs index 56774d921b..c2a28975f1 100644 --- a/runtime/polkadot/src/lib.rs +++ b/runtime/polkadot/src/lib.rs @@ -36,18 +36,12 @@ use primitives::v0::{ AccountId, AccountIndex, Balance, BlockNumber, Hash, Nonce, Signature, Moment, ActiveParas, AbridgedCandidateReceipt, SigningContext, }; -use sp_runtime::{ - create_runtime_str, generic, impl_opaque_keys, ModuleId, - ApplyExtrinsicResult, KeyTypeId, Percent, Permill, Perbill, - transaction_validity::{ - TransactionValidity, TransactionSource, TransactionPriority, - }, - curve::PiecewiseLinear, - traits::{ - BlakeTwo256, Block as BlockT, OpaqueKeys, ConvertInto, IdentityLookup, - Extrinsic as ExtrinsicT, SaturatedConversion, Verify, - }, -}; +use sp_runtime::{create_runtime_str, generic, impl_opaque_keys, ModuleId, ApplyExtrinsicResult, KeyTypeId, Percent, Permill, Perbill, transaction_validity::{ + TransactionValidity, TransactionSource, TransactionPriority, +}, curve::PiecewiseLinear, traits::{ + BlakeTwo256, Block as BlockT, OpaqueKeys, ConvertInto, IdentityLookup, + Extrinsic as ExtrinsicT, SaturatedConversion, Verify, +}}; #[cfg(feature = "runtime-benchmarks")] use sp_runtime::RuntimeString; use version::RuntimeVersion; @@ -79,7 +73,6 @@ pub use parachains::Call as ParachainsCall; /// Constant values used within the runtime. pub mod constants; -pub mod poll; use constants::{time::*, currency::*, fee::*}; use frame_support::traits::InstanceFilter; @@ -99,7 +92,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { apis: RUNTIME_API_VERSIONS, #[cfg(feature = "disable-runtime-api")] apis: version::create_apis_vec![[]], - transaction_version: 3, + transaction_version: 4, }; /// Native version. @@ -118,22 +111,19 @@ impl Filter for BaseFilter { Call::Parachains(parachains::Call::set_heads(..)) => true, // Parachains stuff - Call::Parachains(_) | Call::Attestations(_) | Call::Slots(_) | Call::Registrar(_) | - // Balances and Vesting's transfer (which can be used to transfer) - Call::Balances(_) | Call::Vesting(vesting::Call::vested_transfer(..)) | - Call::Indices(indices::Call::transfer(..)) => + Call::Parachains(_) | Call::Attestations(_) | Call::Slots(_) | Call::Registrar(_) => false, // These modules are all allowed to be called by transactions: Call::Democracy(_) | Call::Council(_) | Call::TechnicalCommittee(_) | Call::TechnicalMembership(_) | Call::Treasury(_) | Call::ElectionsPhragmen(_) | Call::System(_) | Call::Scheduler(_) | Call::Indices(_) | - Call::Babe(_) | Call::Timestamp(_) | + Call::Babe(_) | Call::Timestamp(_) | Call::Balances(_) | Call::Authorship(_) | Call::Staking(_) | Call::Offences(_) | Call::Session(_) | Call::FinalityTracker(_) | Call::Grandpa(_) | Call::ImOnline(_) | Call::AuthorityDiscovery(_) | Call::Utility(_) | Call::Claims(_) | Call::Vesting(_) | - Call::Identity(_) | Call::Proxy(_) | Call::Multisig(_) | Call::Poll(_) | + Call::Identity(_) | Call::Proxy(_) | Call::Multisig(_) | Call::Purchase(_) => true, } @@ -486,8 +476,8 @@ impl collective::Trait for Runtime { parameter_types! { pub const CandidacyBond: Balance = 100 * DOLLARS; pub const VotingBond: Balance = 5 * DOLLARS; - /// Daily council elections initially, later weekly and monthly. - pub const TermDuration: BlockNumber = 1 * DAYS; + /// Weekly council elections; scaling up to monthly eventually. + pub const TermDuration: BlockNumber = 7 * DAYS; /// 13 members initially, to be increased to 23 eventually. pub const DesiredMembers: u32 = 13; pub const DesiredRunnersUp: u32 = 20; @@ -908,7 +898,6 @@ impl InstanceFilter for ProxyType { ProxyType::Governance => matches!(c, Call::Democracy(..) | Call::Council(..) | Call::TechnicalCommittee(..) | Call::ElectionsPhragmen(..) | Call::Treasury(..) | Call::Utility(..) - | Call::Poll(..) ), ProxyType::Staking => matches!(c, Call::Staking(..) | Call::Utility(utility::Call::batch(..)) | Call::Utility(..) @@ -944,22 +933,108 @@ impl proxy::Trait for Runtime { pub struct CustomOnRuntimeUpgrade; impl frame_support::traits::OnRuntimeUpgrade for CustomOnRuntimeUpgrade { fn on_runtime_upgrade() -> frame_support::weights::Weight { - if scheduler::Module::::migrate_v1_to_t2() { - ::MaximumBlockWeight::get() - } else { - ::DbWeight::get().reads(1) + use frame_support::storage::{StorageMap, IterableStorageMap}; + use democracy::{VotingOf, Conviction, Voting::Direct, AccountVote::Standard}; + // Cancel convictions for Referendum Zero (for removing Sudo - this is something we would + // have done anyway). + for (who, mut voting) in VotingOf::::iter() { + if let Direct { ref mut votes, .. } = voting { + if let Some((0, Standard { ref mut vote, .. })) = votes.first_mut() { + vote.conviction = Conviction::None + } + } + VotingOf::::insert(who, voting); } - } -} -parameter_types! { - pub const PollEnd: BlockNumber = 888_888; + ::MaximumBlockWeight::get() + } } -impl poll::Trait for Runtime { - type Event = Event; - type Currency = Balances; - type End = PollEnd; +#[test] +fn test_rm_ref_0() { + use sp_runtime::AccountId32; + use frame_support::{traits::OnRuntimeUpgrade, storage::StorageMap}; + use democracy::{VotingOf, Vote, Voting::{Direct, Delegating}, AccountVote::{Standard, Split}}; + use democracy::Conviction::{Locked1x, Locked2x, Locked3x, None as NoConviction}; + let t = system::GenesisConfig::default().build_storage::().unwrap(); + let mut ext = sp_io::TestExternalities::new(t); + ext.execute_with(|| { + let a = |i| AccountId32::from([i; 32]); + VotingOf::::insert(a(1), Direct { + votes: vec![(0, Standard { + vote: Vote { aye: true, conviction: Locked1x }, + balance: 1, + })], + delegations: Default::default(), + prior: Default::default(), + }); + VotingOf::::insert(a(2), Direct { + votes: vec![ + (0, Standard { vote: Vote { aye: true, conviction: Locked2x }, balance: 2 }), + (1, Standard { vote: Vote { aye: true, conviction: Locked2x }, balance: 2 }) + ], + delegations: Default::default(), + prior: Default::default(), + }); + VotingOf::::insert(a(3), Direct { + votes: vec![(1, Standard { vote: Vote { aye: true, conviction: Locked3x }, balance: 3 })], + delegations: Default::default(), + prior: Default::default(), + }); + VotingOf::::insert(a(4), Direct { + votes: vec![], + delegations: Default::default(), + prior: Default::default(), + }); + VotingOf::::insert(a(5), Delegating { + balance: 5, + target: a(0), + conviction: Locked1x, + delegations: Default::default(), + prior: Default::default(), + }); + VotingOf::::insert(a(6), Direct { + votes: vec![(0, Split { aye: 6, nay: 6 }), (1, Split { aye: 6, nay: 6 })], + delegations: Default::default(), + prior: Default::default(), + }); + CustomOnRuntimeUpgrade::on_runtime_upgrade(); + assert_eq!(VotingOf::::get(a(1)), Direct { + votes: vec![(0, Standard { vote: Vote { aye: true, conviction: NoConviction }, balance: 1, })], + delegations: Default::default(), + prior: Default::default(), + }); + assert_eq!(VotingOf::::get(a(2)), Direct { + votes: vec![ + (0, Standard { vote: Vote { aye: true, conviction: NoConviction }, balance: 2, }), + (1, Standard { vote: Vote { aye: true, conviction: Locked2x }, balance: 2, }) + ], + delegations: Default::default(), + prior: Default::default(), + }); + assert_eq!(VotingOf::::get(a(3)), Direct { + votes: vec![(1, Standard { vote: Vote { aye: true, conviction: Locked3x }, balance: 3, })], + delegations: Default::default(), + prior: Default::default(), + }); + assert_eq!(VotingOf::::get(a(4)), Direct { + votes: vec![], + delegations: Default::default(), + prior: Default::default(), + }); + assert_eq!(VotingOf::::get(a(5)), Delegating { + balance: 5, + target: a(0), + conviction: Locked1x, + delegations: Default::default(), + prior: Default::default(), + }); + assert_eq!(VotingOf::::get(a(6)), Direct { + votes: vec![(0, Split { aye: 6, nay: 6 }), (1, Split { aye: 6, nay: 6 })], + delegations: Default::default(), + prior: Default::default(), + }); + }); } parameter_types! { @@ -1067,9 +1142,6 @@ construct_runtime! { // Multisig dispatch. Late addition. Multisig: multisig::{Module, Call, Storage, Event}, - - // Poll module. - Poll: poll::{Module, Call, Storage, Event}, } } diff --git a/runtime/polkadot/src/poll.rs b/runtime/polkadot/src/poll.rs deleted file mode 100644 index c2cd551817..0000000000 --- a/runtime/polkadot/src/poll.rs +++ /dev/null @@ -1,233 +0,0 @@ -// Copyright 2020 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 . - -//! # Simple polling module -//! -//! Note: This implementation assumes that all accounts are locked, and thus that no account balance -//! may ever reduce. - -use frame_support::{ - decl_module, decl_storage, decl_event, decl_error, ensure, traits::{Currency, Get}, -}; -use system::{self as frame_system, ensure_signed}; -use sp_runtime::traits::Saturating; - -pub type BalanceOf = - <::Currency as Currency<::AccountId>>::Balance; - -pub trait Trait: system::Trait { - /// The overarching event type. - type Event: From> + Into<::Event>; - - /// The currency type used. - type Currency: Currency; - - /// The block number only before which voting is possible. - type End: Get; -} - -/// The options someone has approved. -pub type Approvals = [bool; 4]; - -decl_storage! { - trait Store for Module as Poll { - /// Votes, so far. - pub VoteOf: map hasher(twox_64_concat) T::AccountId => (Approvals, BalanceOf); - - /// The total balances voting for each option. - pub Totals: [BalanceOf; 4]; - } -} - -decl_event! { - pub enum Event where - ::AccountId, - Balance = BalanceOf, - { - Voted(AccountId, Balance, Approvals), - } -} - -decl_error! { - pub enum Error for Module { - /// Vote attempted after the end of voting. - TooLate, - } -} - -decl_module! { - pub struct Module for enum Call where origin: T::Origin { - type Error = Error; - - fn deposit_event() = default; - - /// The End config param. - const End: T::BlockNumber = T::End::get(); - - /// Cast a vote on the poll. - #[weight = 100_000_000] - fn vote(origin, approvals: Approvals) { - let who = ensure_signed(origin)?; - ensure!(system::Module::::block_number() < T::End::get(), Error::::TooLate); - let balance = T::Currency::total_balance(&who); - Totals::::mutate(|ref mut totals| { - VoteOf::::mutate(&who, |(ref mut who_approvals, ref mut who_balance)| { - for i in 0..approvals.len() { - if who_approvals[i] { - totals[i] = totals[i].saturating_sub(*who_balance); - } - if approvals[i] { - totals[i] = totals[i].saturating_add(balance); - } - } - *who_approvals = approvals; - *who_balance = balance; - }); - }); - Self::deposit_event(RawEvent::Voted(who, balance, approvals)); - } - } -} - -#[cfg(test)] -mod tests { - use super::*; - - use frame_support::{assert_ok, assert_noop, impl_outer_origin, parameter_types, weights::Weight}; - use sp_core::H256; - use sp_runtime::{Perbill, testing::Header, traits::{BlakeTwo256, IdentityLookup}}; - - impl_outer_origin! { - pub enum Origin for Test where system = frame_system {} - } - - // For testing the pallet, we construct most of a mock runtime. This means - // first constructing a configuration type (`Test`) which `impl`s each of the - // configuration traits of pallets we want to use. - #[derive(Clone, Eq, PartialEq)] - pub struct Test; - parameter_types! { - pub const BlockHashCount: u64 = 250; - pub const MaximumBlockWeight: Weight = 1024; - pub const MaximumBlockLength: u32 = 2 * 1024; - pub const AvailableBlockRatio: Perbill = Perbill::one(); - } - impl frame_system::Trait for Test { - type BaseCallFilter = (); - type Origin = Origin; - type Index = u64; - type BlockNumber = u64; - type Hash = H256; - type Call = (); - type Hashing = BlakeTwo256; - type AccountId = u64; - type Lookup = IdentityLookup; - type Header = Header; - type Event = (); - type BlockHashCount = BlockHashCount; - type MaximumBlockWeight = MaximumBlockWeight; - type DbWeight = (); - type BlockExecutionWeight = (); - type ExtrinsicBaseWeight = (); - type MaximumExtrinsicWeight = MaximumBlockWeight; - type MaximumBlockLength = MaximumBlockLength; - type AvailableBlockRatio = AvailableBlockRatio; - type Version = (); - type ModuleToIndex = (); - type AccountData = balances::AccountData; - type OnNewAccount = (); - type OnKilledAccount = (); - type SystemWeightInfo = (); - } - parameter_types! { - pub const ExistentialDeposit: u64 = 1; - } - impl balances::Trait for Test { - type Balance = u64; - type Event = (); - type DustRemoval = (); - type ExistentialDeposit = ExistentialDeposit; - type AccountStore = System; - type WeightInfo = (); - } - parameter_types! { - pub const End: u64 = 1; - } - impl Trait for Test { - type Event = (); - type Currency = Balances; - type End = End; - } - type System = system::Module; - type Balances = balances::Module; - type Poll = Module; - - // This function basically just builds a genesis storage key/value store according to - // our desired mockup. - pub fn new_test_ext() -> sp_io::TestExternalities { - let mut t = system::GenesisConfig::default().build_storage::().unwrap(); - // We use default for brevity, but you can configure as desired if needed. - balances::GenesisConfig:: { - balances: vec![ - (1, 10), - (2, 20), - (3, 30), - (4, 40), - ], - }.assimilate_storage(&mut t).unwrap(); - t.into() - } - - #[test] - fn basic_setup_works() { - new_test_ext().execute_with(|| { - assert_eq!(System::block_number(), 0); - }); - } - - #[test] - fn totaling_works() { - new_test_ext().execute_with(|| { - assert_ok!(Poll::vote(Origin::signed(1), [true, true, false, false])); - assert_ok!(Poll::vote(Origin::signed(2), [false, true, true, false])); - assert_ok!(Poll::vote(Origin::signed(3), [false, false, true, true])); - assert_ok!(Poll::vote(Origin::signed(4), [true, false, false, true])); - assert_eq!(Totals::::get(), [50, 30, 50, 70]); - }); - } - - #[test] - fn revoting_works() { - new_test_ext().execute_with(|| { - assert_ok!(Poll::vote(Origin::signed(1), [true, false, false, false])); - assert_eq!(Totals::::get(), [10, 0, 0, 0]); - assert_ok!(Poll::vote(Origin::signed(1), [false, true, false, false])); - assert_eq!(Totals::::get(), [0, 10, 0, 0]); - assert_ok!(Poll::vote(Origin::signed(1), [false, false, true, true])); - assert_eq!(Totals::::get(), [0, 0, 10, 10]); - }); - } - - #[test] - fn vote_end_works() { - new_test_ext().execute_with(|| { - assert_ok!(Poll::vote(Origin::signed(1), [true, false, false, false])); - assert_eq!(Totals::::get(), [10, 0, 0, 0]); - system::Module::::set_block_number(1); - assert_noop!(Poll::vote(Origin::signed(1), [false, true, false, false]), Error::::TooLate); - }); - } -} diff --git a/runtime/test-runtime/Cargo.toml b/runtime/test-runtime/Cargo.toml index 9c62784bbd..201ba2debc 100644 --- a/runtime/test-runtime/Cargo.toml +++ b/runtime/test-runtime/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-test-runtime" -version = "0.8.17" +version = "0.8.18" authors = ["Parity Technologies "] edition = "2018" build = "build.rs" diff --git a/runtime/westend/Cargo.toml b/runtime/westend/Cargo.toml index 0305b48c3f..78e74644af 100644 --- a/runtime/westend/Cargo.toml +++ b/runtime/westend/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "westend-runtime" -version = "0.8.17" +version = "0.8.18" authors = ["Parity Technologies "] edition = "2018" build = "build.rs" diff --git a/runtime/westend/src/lib.rs b/runtime/westend/src/lib.rs index 5764cbc96c..1d97756952 100644 --- a/runtime/westend/src/lib.rs +++ b/runtime/westend/src/lib.rs @@ -83,7 +83,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("westend"), impl_name: create_runtime_str!("parity-westend"), authoring_version: 2, - spec_version: 37, + spec_version: 38, impl_version: 0, #[cfg(not(feature = "disable-runtime-api"))] apis: RUNTIME_API_VERSIONS, diff --git a/service/Cargo.toml b/service/Cargo.toml index 9ce1613401..13eeff889d 100644 --- a/service/Cargo.toml +++ b/service/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-service" -version = "0.8.17" +version = "0.8.18" authors = ["Parity Technologies "] edition = "2018" diff --git a/statement-table/Cargo.toml b/statement-table/Cargo.toml index 870d8cb0b1..9a5fd9d572 100644 --- a/statement-table/Cargo.toml +++ b/statement-table/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-statement-table" -version = "0.8.17" +version = "0.8.18" authors = ["Parity Technologies "] edition = "2018" diff --git a/validation/Cargo.toml b/validation/Cargo.toml index aabf5286f5..ea98e24dfc 100644 --- a/validation/Cargo.toml +++ b/validation/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-validation" -version = "0.8.17" +version = "0.8.18" authors = ["Parity Technologies "] edition = "2018" -- GitLab From 2cc71065a5c5320f585318624d6514af3d089ba8 Mon Sep 17 00:00:00 2001 From: Nikolay Volf Date: Tue, 21 Jul 2020 16:50:58 +0300 Subject: [PATCH 086/192] readme: --force no longer required (#1447) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 0b971154b8..8190fc3f45 100644 --- a/README.md +++ b/README.md @@ -24,7 +24,7 @@ release and download the binary that is provided. If you want to install Polkadot in your PATH, you can do so with with: ```bash -cargo install --force --git https://github.com/paritytech/polkadot --tag polkadot +cargo install --git https://github.com/paritytech/polkadot --tag polkadot ``` ### Build from Source -- GitLab From 52a1daff867cc4efeec7082c876ddddb4789f734 Mon Sep 17 00:00:00 2001 From: Xiliang Chen Date: Wed, 22 Jul 2020 06:02:41 +1200 Subject: [PATCH 087/192] update impl_outer_origin (#1444) --- runtime/common/src/claims.rs | 2 +- runtime/common/src/crowdfund.rs | 2 +- runtime/common/src/lib.rs | 2 +- runtime/common/src/parachains.rs | 2 +- runtime/common/src/purchase.rs | 2 +- runtime/common/src/registrar.rs | 2 +- runtime/common/src/slots.rs | 2 +- runtime/parachains/src/mock.rs | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/runtime/common/src/claims.rs b/runtime/common/src/claims.rs index 6efc3d31d7..b56fa2ead7 100644 --- a/runtime/common/src/claims.rs +++ b/runtime/common/src/claims.rs @@ -646,7 +646,7 @@ mod tests { use super::Call as ClaimsCall; impl_outer_origin! { - pub enum Origin for Test {} + pub enum Origin for Test where system = system {} } impl_outer_dispatch! { diff --git a/runtime/common/src/crowdfund.rs b/runtime/common/src/crowdfund.rs index 3b02b5a646..942b319766 100644 --- a/runtime/common/src/crowdfund.rs +++ b/runtime/common/src/crowdfund.rs @@ -578,7 +578,7 @@ mod tests { use crate::registrar::Registrar; impl_outer_origin! { - pub enum Origin for Test {} + pub enum Origin for Test where system = system {} } // For testing the module, we construct most of a mock runtime. This means diff --git a/runtime/common/src/lib.rs b/runtime/common/src/lib.rs index 72a4ae3bfd..55e4df1eed 100644 --- a/runtime/common/src/lib.rs +++ b/runtime/common/src/lib.rs @@ -106,7 +106,7 @@ mod multiplier_tests { pub struct Runtime; impl_outer_origin!{ - pub enum Origin for Runtime {} + pub enum Origin for Runtime where system = system {} } parameter_types! { diff --git a/runtime/common/src/parachains.rs b/runtime/common/src/parachains.rs index b0228a5a53..2df3669ded 100644 --- a/runtime/common/src/parachains.rs +++ b/runtime/common/src/parachains.rs @@ -1702,7 +1702,7 @@ mod tests { ]; impl_outer_origin! { - pub enum Origin for Test { + pub enum Origin for Test where system = system { parachains } } diff --git a/runtime/common/src/purchase.rs b/runtime/common/src/purchase.rs index b1b61ebb43..9a1856a549 100644 --- a/runtime/common/src/purchase.rs +++ b/runtime/common/src/purchase.rs @@ -391,7 +391,7 @@ mod tests { use balances::Error as BalancesError; impl_outer_origin! { - pub enum Origin for Test {} + pub enum Origin for Test where system = system {} } impl_outer_dispatch! { diff --git a/runtime/common/src/registrar.rs b/runtime/common/src/registrar.rs index d7b9cb40ca..e3b6d5ec12 100644 --- a/runtime/common/src/registrar.rs +++ b/runtime/common/src/registrar.rs @@ -688,7 +688,7 @@ mod tests { use crate::attestations; impl_outer_origin! { - pub enum Origin for Test { + pub enum Origin for Test where system = system { parachains, } } diff --git a/runtime/common/src/slots.rs b/runtime/common/src/slots.rs index eb0a7aff7d..5fe4c3b048 100644 --- a/runtime/common/src/slots.rs +++ b/runtime/common/src/slots.rs @@ -893,7 +893,7 @@ mod tests { use primitives::v0::{BlockNumber, Header, Id as ParaId, Info as ParaInfo, Scheduling}; impl_outer_origin! { - pub enum Origin for Test {} + pub enum Origin for Test where system = system {} } // For testing the module, we construct most of a mock runtime. This means diff --git a/runtime/parachains/src/mock.rs b/runtime/parachains/src/mock.rs index f7349b8f25..21ee83433d 100644 --- a/runtime/parachains/src/mock.rs +++ b/runtime/parachains/src/mock.rs @@ -36,7 +36,7 @@ use crate::inclusion; pub struct Test; impl_outer_origin! { - pub enum Origin for Test { } + pub enum Origin for Test where system = system { } } impl_outer_dispatch! { -- GitLab From 1b7882a50ecaac89d940705641a7273aa60a23d1 Mon Sep 17 00:00:00 2001 From: Andronik Ordian Date: Wed, 22 Jul 2020 02:08:01 +0200 Subject: [PATCH 088/192] Scheduler: handle timeouts for no group rotation (#1439) * runtime: rename parachain_rotation_frequency to group_rotation_frequency * scheduler: handle timeouts for no group rotation * scheduler: apply fixes from code review * scheduler: remove my comments --- .../implementers-guide/src/types/runtime.md | 2 +- runtime/parachains/src/configuration.rs | 12 +- runtime/parachains/src/scheduler.rs | 120 ++++++++++++++++-- 3 files changed, 114 insertions(+), 20 deletions(-) diff --git a/roadmap/implementers-guide/src/types/runtime.md b/roadmap/implementers-guide/src/types/runtime.md index ebdbfe15c5..f9faf5ab65 100644 --- a/roadmap/implementers-guide/src/types/runtime.md +++ b/roadmap/implementers-guide/src/types/runtime.md @@ -24,7 +24,7 @@ struct HostConfiguration { /// The number of retries that a parathread author has to submit their block. pub parathread_retries: u32, /// How often parachain groups should be rotated across parachains. - pub parachain_rotation_frequency: BlockNumber, + pub group_rotation_frequency: BlockNumber, /// The availability period, in blocks, for parachains. This is the amount of blocks /// after inclusion that validators have to make the block available and signal its availability to /// the chain. Must be at least 1. diff --git a/runtime/parachains/src/configuration.rs b/runtime/parachains/src/configuration.rs index 40688041b2..b977bc119b 100644 --- a/runtime/parachains/src/configuration.rs +++ b/runtime/parachains/src/configuration.rs @@ -48,7 +48,7 @@ pub struct HostConfiguration { /// The number of retries that a parathread author has to submit their block. pub parathread_retries: u32, /// How often parachain groups should be rotated across parachains. Must be non-zero. - pub parachain_rotation_frequency: BlockNumber, + pub group_rotation_frequency: BlockNumber, /// The availability period, in blocks, for parachains. This is the amount of blocks /// after inclusion that validators have to make the block available and signal its availability to /// the chain. Must be at least 1. @@ -153,10 +153,10 @@ decl_module! { /// Set the parachain validator-group rotation frequency #[weight = (1_000, DispatchClass::Operational)] - pub fn set_parachain_rotation_frequency(origin, new: T::BlockNumber) -> DispatchResult { + pub fn set_group_rotation_frequency(origin, new: T::BlockNumber) -> DispatchResult { ensure_root(origin)?; Self::update_config_member(|config| { - sp_std::mem::replace(&mut config.parachain_rotation_frequency, new) != new + sp_std::mem::replace(&mut config.group_rotation_frequency, new) != new }); Ok(()) } @@ -264,7 +264,7 @@ mod tests { max_head_data_size: 1_000, parathread_cores: 2, parathread_retries: 5, - parachain_rotation_frequency: 20, + group_rotation_frequency: 20, chain_availability_period: 10, thread_availability_period: 8, scheduling_lookahead: 3, @@ -293,8 +293,8 @@ mod tests { Configuration::set_parathread_retries( Origin::root(), new_config.parathread_retries, ).unwrap(); - Configuration::set_parachain_rotation_frequency( - Origin::root(), new_config.parachain_rotation_frequency, + Configuration::set_group_rotation_frequency( + Origin::root(), new_config.group_rotation_frequency, ).unwrap(); Configuration::set_chain_availability_period( Origin::root(), new_config.chain_availability_period, diff --git a/runtime/parachains/src/scheduler.rs b/runtime/parachains/src/scheduler.rs index 977fba582d..d664f07225 100644 --- a/runtime/parachains/src/scheduler.rs +++ b/runtime/parachains/src/scheduler.rs @@ -510,7 +510,7 @@ impl Module { if at < session_start_block { return None } - if config.parachain_rotation_frequency.is_zero() { + if config.group_rotation_frequency.is_zero() { // interpret this as "no rotations" return Some(GroupIndex(core.0)); } @@ -520,7 +520,7 @@ impl Module { if core.0 as usize >= validator_groups.len() { return None } let rotations_since_session_start: T::BlockNumber = - (at - session_start_block) / config.parachain_rotation_frequency.into(); + (at - session_start_block) / config.group_rotation_frequency.into(); let rotations_since_session_start = match >::try_into(rotations_since_session_start) @@ -539,7 +539,10 @@ impl Module { /// If `None`, no timing-out should be done. The predicate accepts the index of the core, and the /// block number since which it has been occupied, and the respective parachain and parathread /// timeouts, i.e. only within `max(config.chain_availability_period, config.thread_availability_period)` - /// of the last rotation would this return `Some`. + /// of the last rotation would this return `Some`, unless there are no rotations. + /// + /// If there are no rotations (config.group_rotation_frequency == 0), + /// availability timeouts can occur at any block. /// /// This really should not be a box, but is working around a compiler limitation filed here: /// https://github.com/rust-lang/rust/issues/73226 @@ -550,7 +553,12 @@ impl Module { let session_start = >::get(); let blocks_since_session_start = now.saturating_sub(session_start); - let blocks_since_last_rotation = blocks_since_session_start % config.parachain_rotation_frequency; + let no_rotation = config.group_rotation_frequency.is_zero(); + let blocks_since_last_rotation = if no_rotation { + ::zero() + } else { + blocks_since_session_start % config.group_rotation_frequency + }; let absolute_cutoff = sp_std::cmp::max( config.chain_availability_period, @@ -590,7 +598,7 @@ impl Module { let session_start_block = Self::session_start_block(); let now = >::block_number(); let group_rotation_frequency = >::config() - .parachain_rotation_frequency; + .group_rotation_frequency; GroupRotationInfo { session_start_block, @@ -707,7 +715,7 @@ mod tests { fn default_config() -> HostConfiguration { HostConfiguration { parathread_cores: 3, - parachain_rotation_frequency: 10, + group_rotation_frequency: 10, chain_availability_period: 3, thread_availability_period: 5, scheduling_lookahead: 2, @@ -1278,12 +1286,12 @@ mod tests { let mut config = default_config(); // make sure parathread requests don't retry-out - config.parathread_retries = config.parachain_rotation_frequency * 3; + config.parathread_retries = config.group_rotation_frequency * 3; config.parathread_cores = 2; config }; - let rotation_frequency = config.parachain_rotation_frequency; + let rotation_frequency = config.group_rotation_frequency; let parathread_cores = config.parathread_cores; let genesis_config = MockGenesisConfig { @@ -1429,7 +1437,7 @@ mod tests { }; let HostConfiguration { - parachain_rotation_frequency, + group_rotation_frequency, chain_availability_period, thread_availability_period, .. @@ -1437,7 +1445,7 @@ mod tests { let collator = CollatorId::from(Sr25519Keyring::Alice.public()); assert!(chain_availability_period < thread_availability_period && - thread_availability_period < parachain_rotation_frequency); + thread_availability_period < group_rotation_frequency); let chain_a = ParaId::from(1); let thread_a = ParaId::from(2); @@ -1482,7 +1490,7 @@ mod tests { run_to_block(1 + thread_availability_period, |_| None); assert!(Scheduler::availability_timeout_predicate().is_none()); - run_to_block(1 + parachain_rotation_frequency, |_| None); + run_to_block(1 + group_rotation_frequency, |_| None); { let pred = Scheduler::availability_timeout_predicate() @@ -1509,7 +1517,7 @@ mod tests { assert!(!pred(CoreIndex(1), now - thread_availability_period + 1)); } - run_to_block(1 + parachain_rotation_frequency + chain_availability_period, |_| None); + run_to_block(1 + group_rotation_frequency + chain_availability_period, |_| None); { let pred = Scheduler::availability_timeout_predicate() @@ -1521,12 +1529,98 @@ mod tests { assert!(pred(CoreIndex(1), would_be_timed_out)); // but threads can. } - run_to_block(1 + parachain_rotation_frequency + thread_availability_period, |_| None); + run_to_block(1 + group_rotation_frequency + thread_availability_period, |_| None); assert!(Scheduler::availability_timeout_predicate().is_none()); }); } + #[test] + fn availability_predicate_no_rotation() { + let genesis_config = MockGenesisConfig { + configuration: crate::configuration::GenesisConfig { + config: HostConfiguration { + group_rotation_frequency: 0, // no rotation + ..default_config() + }, + ..Default::default() + }, + ..Default::default() + }; + let HostConfiguration { + chain_availability_period, + thread_availability_period, + .. + } = default_config(); + let collator = CollatorId::from(Sr25519Keyring::Alice.public()); + + let chain_a = ParaId::from(1); + let thread_a = ParaId::from(2); + + let schedule_blank_para = |id, is_chain| Paras::schedule_para_initialize(id, ParaGenesisArgs { + genesis_head: Vec::new().into(), + validation_code: Vec::new().into(), + parachain: is_chain, + }); + + new_test_ext(genesis_config).execute_with(|| { + schedule_blank_para(chain_a, true); + schedule_blank_para(thread_a, false); + + // start a new session with our chain & thread registered. + run_to_block(1, |number| match number { + 1 => Some(SessionChangeNotification { + new_config: HostConfiguration{ + // Note: the `group_rotation_frequency` config change + // is not accounted for on session change + // group_rotation_frequency: 0, + ..default_config() + }, + validators: vec![ + ValidatorId::from(Sr25519Keyring::Alice.public()), + ValidatorId::from(Sr25519Keyring::Bob.public()), + ValidatorId::from(Sr25519Keyring::Charlie.public()), + ValidatorId::from(Sr25519Keyring::Dave.public()), + ValidatorId::from(Sr25519Keyring::Eve.public()), + ], + ..Default::default() + }), + _ => None, + }); + + // assign some availability cores. + { + AvailabilityCores::mutate(|cores| { + cores[0] = Some(CoreOccupied::Parachain); + cores[1] = Some(CoreOccupied::Parathread(ParathreadEntry { + claim: ParathreadClaim(thread_a, collator), + retries: 0, + })) + }); + } + run_to_block(1 + 1, |_| None); + run_to_block(1 + 1 + 100500, |_| None); + { + let pred = Scheduler::availability_timeout_predicate() + .expect("predicate exists with no rotation"); + + let now = System::block_number(); + + assert!(!pred(CoreIndex(0), now)); // assigned: chain + assert!(!pred(CoreIndex(1), now)); // assigned: thread + assert!(pred(CoreIndex(2), now)); + + // check the tighter bound on chains vs threads. + assert!(pred(CoreIndex(0), now - chain_availability_period)); + assert!(pred(CoreIndex(1), now - thread_availability_period)); + + // check the threshold is exact. + assert!(!pred(CoreIndex(0), now - chain_availability_period + 1)); + assert!(!pred(CoreIndex(1), now - thread_availability_period + 1)); + } + }); + } + #[test] fn next_up_on_available_uses_next_scheduled_or_none_for_thread() { let mut config = default_config(); -- GitLab From 4da8b5e70582ac05d3ae9a0675d3f12f36eed939 Mon Sep 17 00:00:00 2001 From: Cecile Tonglet Date: Wed, 22 Jul 2020 09:16:14 +0200 Subject: [PATCH 089/192] Companion PR (#1423) --- Cargo.lock | 555 ++++++++++++----------- availability-store/Cargo.toml | 2 +- collator/src/lib.rs | 2 +- node/test-service/tests/build-blocks.rs | 2 +- node/test-service/tests/call-function.rs | 2 +- runtime/kusama/src/lib.rs | 2 +- runtime/polkadot/src/lib.rs | 2 +- runtime/westend/src/lib.rs | 2 +- scripts/gitlab/check_runtime.sh | 2 +- 9 files changed, 286 insertions(+), 285 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 28532bb262..c4e95771fe 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1324,16 +1324,16 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "fork-tree" -version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" +version = "2.0.0-rc5" +source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" dependencies = [ "parity-scale-codec", ] [[package]] name = "frame-benchmarking" -version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" +version = "2.0.0-rc5" +source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" dependencies = [ "frame-support", "frame-system", @@ -1349,8 +1349,8 @@ dependencies = [ [[package]] name = "frame-benchmarking-cli" -version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" +version = "2.0.0-rc5" +source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" dependencies = [ "Inflector", "frame-benchmarking", @@ -1368,8 +1368,8 @@ dependencies = [ [[package]] name = "frame-executive" -version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" +version = "2.0.0-rc5" +source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" dependencies = [ "frame-support", "frame-system", @@ -1383,8 +1383,8 @@ dependencies = [ [[package]] name = "frame-metadata" -version = "11.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" +version = "11.0.0-rc5" +source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" dependencies = [ "parity-scale-codec", "serde", @@ -1394,8 +1394,8 @@ dependencies = [ [[package]] name = "frame-support" -version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" +version = "2.0.0-rc5" +source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" dependencies = [ "bitmask", "frame-metadata", @@ -1419,8 +1419,8 @@ dependencies = [ [[package]] name = "frame-support-procedural" -version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" +version = "2.0.0-rc5" +source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" dependencies = [ "frame-support-procedural-tools", "proc-macro2 1.0.18", @@ -1430,8 +1430,8 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools" -version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" +version = "2.0.0-rc5" +source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" dependencies = [ "frame-support-procedural-tools-derive", "proc-macro-crate", @@ -1442,8 +1442,8 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools-derive" -version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" +version = "2.0.0-rc5" +source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" dependencies = [ "proc-macro2 1.0.18", "quote 1.0.7", @@ -1452,8 +1452,8 @@ dependencies = [ [[package]] name = "frame-system" -version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" +version = "2.0.0-rc5" +source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" dependencies = [ "frame-support", "impl-trait-for-tuples", @@ -1468,8 +1468,8 @@ dependencies = [ [[package]] name = "frame-system-benchmarking" -version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" +version = "2.0.0-rc5" +source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" dependencies = [ "frame-benchmarking", "frame-support", @@ -1482,8 +1482,8 @@ dependencies = [ [[package]] name = "frame-system-rpc-runtime-api" -version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" +version = "2.0.0-rc5" +source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" dependencies = [ "parity-scale-codec", "sp-api", @@ -2631,9 +2631,9 @@ checksum = "c7d73b3f436185384286bd8098d17ec07c9a7d2388a6599f824d8502b529702a" [[package]] name = "libp2p" -version = "0.21.1" +version = "0.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d743d03fab397cde23925a17cb87b35b25994f44ab8c6a9e46a7e953ec739cd" +checksum = "0306a49ee6a89468f96089906f36b0eef82c988dcfc8acf3e2dcd6ad1c859f85" dependencies = [ "bytes 0.5.5", "futures 0.3.5", @@ -2798,10 +2798,11 @@ dependencies = [ [[package]] name = "libp2p-noise" -version = "0.20.0" +version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6ad6b67d802de8b5ddc5e8b0ff55a0d0a6a737c2c5c174601dbb9d24e0ad5cb" +checksum = "8f353f8966bbaaf7456535fffd3f366f153148773a0cf04b2ec3860955cb720e" dependencies = [ + "bytes 0.5.5", "curve25519-dalek", "futures 0.3.5", "lazy_static", @@ -3476,8 +3477,8 @@ dependencies = [ [[package]] name = "pallet-authority-discovery" -version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" +version = "2.0.0-rc5" +source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" dependencies = [ "frame-support", "frame-system", @@ -3492,8 +3493,8 @@ dependencies = [ [[package]] name = "pallet-authorship" -version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" +version = "2.0.0-rc5" +source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" dependencies = [ "frame-support", "frame-system", @@ -3507,8 +3508,8 @@ dependencies = [ [[package]] name = "pallet-babe" -version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" +version = "2.0.0-rc5" +source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" dependencies = [ "frame-benchmarking", "frame-support", @@ -3532,8 +3533,8 @@ dependencies = [ [[package]] name = "pallet-balances" -version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" +version = "2.0.0-rc5" +source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" dependencies = [ "frame-benchmarking", "frame-support", @@ -3546,8 +3547,8 @@ dependencies = [ [[package]] name = "pallet-collective" -version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" +version = "2.0.0-rc5" +source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" dependencies = [ "frame-benchmarking", "frame-support", @@ -3562,8 +3563,8 @@ dependencies = [ [[package]] name = "pallet-democracy" -version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" +version = "2.0.0-rc5" +source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" dependencies = [ "frame-benchmarking", "frame-support", @@ -3577,8 +3578,8 @@ dependencies = [ [[package]] name = "pallet-elections-phragmen" -version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" +version = "2.0.0-rc5" +source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" dependencies = [ "frame-benchmarking", "frame-support", @@ -3592,8 +3593,8 @@ dependencies = [ [[package]] name = "pallet-finality-tracker" -version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" +version = "2.0.0-rc5" +source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" dependencies = [ "frame-support", "frame-system", @@ -3608,8 +3609,8 @@ dependencies = [ [[package]] name = "pallet-grandpa" -version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" +version = "2.0.0-rc5" +source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" dependencies = [ "frame-benchmarking", "frame-support", @@ -3630,8 +3631,8 @@ dependencies = [ [[package]] name = "pallet-identity" -version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" +version = "2.0.0-rc5" +source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" dependencies = [ "enumflags2", "frame-benchmarking", @@ -3646,8 +3647,8 @@ dependencies = [ [[package]] name = "pallet-im-online" -version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" +version = "2.0.0-rc5" +source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" dependencies = [ "frame-benchmarking", "frame-support", @@ -3666,8 +3667,8 @@ dependencies = [ [[package]] name = "pallet-indices" -version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" +version = "2.0.0-rc5" +source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" dependencies = [ "frame-support", "frame-system", @@ -3682,8 +3683,8 @@ dependencies = [ [[package]] name = "pallet-membership" -version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" +version = "2.0.0-rc5" +source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" dependencies = [ "frame-support", "frame-system", @@ -3696,8 +3697,8 @@ dependencies = [ [[package]] name = "pallet-multisig" -version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" +version = "2.0.0-rc5" +source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" dependencies = [ "frame-support", "frame-system", @@ -3711,8 +3712,8 @@ dependencies = [ [[package]] name = "pallet-nicks" -version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" +version = "2.0.0-rc5" +source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" dependencies = [ "frame-support", "frame-system", @@ -3725,8 +3726,8 @@ dependencies = [ [[package]] name = "pallet-offences" -version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" +version = "2.0.0-rc5" +source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" dependencies = [ "frame-support", "frame-system", @@ -3740,8 +3741,8 @@ dependencies = [ [[package]] name = "pallet-offences-benchmarking" -version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" +version = "2.0.0-rc5" +source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" dependencies = [ "frame-benchmarking", "frame-support", @@ -3761,8 +3762,8 @@ dependencies = [ [[package]] name = "pallet-proxy" -version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" +version = "2.0.0-rc5" +source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" dependencies = [ "frame-support", "frame-system", @@ -3776,8 +3777,8 @@ dependencies = [ [[package]] name = "pallet-randomness-collective-flip" -version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" +version = "2.0.0-rc5" +source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" dependencies = [ "frame-support", "frame-system", @@ -3789,8 +3790,8 @@ dependencies = [ [[package]] name = "pallet-recovery" -version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" +version = "2.0.0-rc5" +source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" dependencies = [ "enumflags2", "frame-support", @@ -3804,8 +3805,8 @@ dependencies = [ [[package]] name = "pallet-scheduler" -version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" +version = "2.0.0-rc5" +source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" dependencies = [ "frame-benchmarking", "frame-support", @@ -3819,8 +3820,8 @@ dependencies = [ [[package]] name = "pallet-session" -version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" +version = "2.0.0-rc5" +source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" dependencies = [ "frame-support", "frame-system", @@ -3839,8 +3840,8 @@ dependencies = [ [[package]] name = "pallet-session-benchmarking" -version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" +version = "2.0.0-rc5" +source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" dependencies = [ "frame-benchmarking", "frame-support", @@ -3855,8 +3856,8 @@ dependencies = [ [[package]] name = "pallet-society" -version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" +version = "2.0.0-rc5" +source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" dependencies = [ "frame-support", "frame-system", @@ -3869,8 +3870,8 @@ dependencies = [ [[package]] name = "pallet-staking" -version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" +version = "2.0.0-rc5" +source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" dependencies = [ "frame-benchmarking", "frame-support", @@ -3891,8 +3892,8 @@ dependencies = [ [[package]] name = "pallet-staking-reward-curve" -version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" +version = "2.0.0-rc5" +source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -3902,8 +3903,8 @@ dependencies = [ [[package]] name = "pallet-sudo" -version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" +version = "2.0.0-rc5" +source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" dependencies = [ "frame-support", "frame-system", @@ -3916,8 +3917,8 @@ dependencies = [ [[package]] name = "pallet-timestamp" -version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" +version = "2.0.0-rc5" +source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" dependencies = [ "frame-benchmarking", "frame-support", @@ -3934,8 +3935,8 @@ dependencies = [ [[package]] name = "pallet-transaction-payment" -version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" +version = "2.0.0-rc5" +source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" dependencies = [ "frame-support", "frame-system", @@ -3951,8 +3952,8 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc" -version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" +version = "2.0.0-rc5" +source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" dependencies = [ "jsonrpc-core", "jsonrpc-core-client", @@ -3969,8 +3970,8 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc-runtime-api" -version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" +version = "2.0.0-rc5" +source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" dependencies = [ "frame-support", "parity-scale-codec", @@ -3982,8 +3983,8 @@ dependencies = [ [[package]] name = "pallet-treasury" -version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" +version = "2.0.0-rc5" +source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" dependencies = [ "frame-benchmarking", "frame-support", @@ -3997,8 +3998,8 @@ dependencies = [ [[package]] name = "pallet-utility" -version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" +version = "2.0.0-rc5" +source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" dependencies = [ "frame-benchmarking", "frame-support", @@ -4013,8 +4014,8 @@ dependencies = [ [[package]] name = "pallet-vesting" -version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" +version = "2.0.0-rc5" +source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" dependencies = [ "enumflags2", "frame-benchmarking", @@ -5944,8 +5945,8 @@ dependencies = [ [[package]] name = "sc-authority-discovery" -version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" +version = "0.8.0-rc5" +source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" dependencies = [ "bytes 0.5.5", "derive_more 0.99.9", @@ -5971,8 +5972,8 @@ dependencies = [ [[package]] name = "sc-basic-authorship" -version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" +version = "0.8.0-rc5" +source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -5995,8 +5996,8 @@ dependencies = [ [[package]] name = "sc-block-builder" -version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" +version = "0.8.0-rc5" +source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" dependencies = [ "parity-scale-codec", "sc-client-api", @@ -6012,8 +6013,8 @@ dependencies = [ [[package]] name = "sc-chain-spec" -version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" +version = "2.0.0-rc5" +source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" dependencies = [ "impl-trait-for-tuples", "sc-chain-spec-derive", @@ -6028,8 +6029,8 @@ dependencies = [ [[package]] name = "sc-chain-spec-derive" -version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" +version = "2.0.0-rc5" +source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -6039,8 +6040,8 @@ dependencies = [ [[package]] name = "sc-cli" -version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" +version = "0.8.0-rc5" +source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" dependencies = [ "ansi_term 0.12.1", "atty", @@ -6080,8 +6081,8 @@ dependencies = [ [[package]] name = "sc-client-api" -version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" +version = "2.0.0-rc5" +source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" dependencies = [ "derive_more 0.99.9", "fnv", @@ -6116,8 +6117,8 @@ dependencies = [ [[package]] name = "sc-client-db" -version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" +version = "0.8.0-rc5" +source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" dependencies = [ "blake2-rfc", "hash-db", @@ -6145,8 +6146,8 @@ dependencies = [ [[package]] name = "sc-consensus" -version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" +version = "0.8.0-rc5" +source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" dependencies = [ "sc-client-api", "sp-blockchain", @@ -6156,8 +6157,8 @@ dependencies = [ [[package]] name = "sc-consensus-babe" -version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" +version = "0.8.0-rc5" +source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" dependencies = [ "derive_more 0.99.9", "fork-tree", @@ -6198,8 +6199,8 @@ dependencies = [ [[package]] name = "sc-consensus-babe-rpc" -version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" +version = "0.8.0-rc5" +source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -6222,8 +6223,8 @@ dependencies = [ [[package]] name = "sc-consensus-epochs" -version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" +version = "0.8.0-rc5" +source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" dependencies = [ "fork-tree", "parity-scale-codec", @@ -6235,8 +6236,8 @@ dependencies = [ [[package]] name = "sc-consensus-slots" -version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" +version = "0.8.0-rc5" +source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6258,8 +6259,8 @@ dependencies = [ [[package]] name = "sc-consensus-uncles" -version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" +version = "0.8.0-rc5" +source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" dependencies = [ "log 0.4.8", "sc-client-api", @@ -6272,8 +6273,8 @@ dependencies = [ [[package]] name = "sc-executor" -version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" +version = "0.8.0-rc5" +source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" dependencies = [ "derive_more 0.99.9", "lazy_static", @@ -6300,8 +6301,8 @@ dependencies = [ [[package]] name = "sc-executor-common" -version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" +version = "0.8.0-rc5" +source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" dependencies = [ "derive_more 0.99.9", "log 0.4.8", @@ -6317,8 +6318,8 @@ dependencies = [ [[package]] name = "sc-executor-wasmi" -version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" +version = "0.8.0-rc5" +source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" dependencies = [ "log 0.4.8", "parity-scale-codec", @@ -6332,8 +6333,8 @@ dependencies = [ [[package]] name = "sc-executor-wasmtime" -version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" +version = "0.8.0-rc5" +source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" dependencies = [ "cranelift-codegen", "cranelift-wasm", @@ -6353,8 +6354,8 @@ dependencies = [ [[package]] name = "sc-finality-grandpa" -version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" +version = "0.8.0-rc5" +source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" dependencies = [ "assert_matches", "derive_more 0.99.9", @@ -6391,8 +6392,8 @@ dependencies = [ [[package]] name = "sc-finality-grandpa-rpc" -version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" +version = "0.8.0-rc5" +source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" dependencies = [ "derive_more 0.99.9", "finality-grandpa", @@ -6408,8 +6409,8 @@ dependencies = [ [[package]] name = "sc-informant" -version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" +version = "0.8.0-rc5" +source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" dependencies = [ "ansi_term 0.12.1", "futures 0.3.5", @@ -6426,8 +6427,8 @@ dependencies = [ [[package]] name = "sc-keystore" -version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" +version = "2.0.0-rc5" +source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" dependencies = [ "derive_more 0.99.9", "hex", @@ -6442,8 +6443,8 @@ dependencies = [ [[package]] name = "sc-light" -version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" +version = "2.0.0-rc5" +source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" dependencies = [ "hash-db", "lazy_static", @@ -6461,8 +6462,8 @@ dependencies = [ [[package]] name = "sc-network" -version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" +version = "0.8.0-rc5" +source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" dependencies = [ "bitflags", "bs58", @@ -6513,8 +6514,8 @@ dependencies = [ [[package]] name = "sc-network-gossip" -version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" +version = "0.8.0-rc5" +source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6528,8 +6529,8 @@ dependencies = [ [[package]] name = "sc-network-test" -version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" +version = "0.8.0-rc5" +source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" dependencies = [ "env_logger", "futures 0.3.5", @@ -6555,8 +6556,8 @@ dependencies = [ [[package]] name = "sc-offchain" -version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" +version = "2.0.0-rc5" +source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" dependencies = [ "bytes 0.5.5", "fnv", @@ -6582,8 +6583,8 @@ dependencies = [ [[package]] name = "sc-peerset" -version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" +version = "2.0.0-rc5" +source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" dependencies = [ "futures 0.3.5", "libp2p", @@ -6595,8 +6596,8 @@ dependencies = [ [[package]] name = "sc-proposer-metrics" -version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" +version = "0.8.0-rc5" +source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" dependencies = [ "log 0.4.8", "substrate-prometheus-endpoint", @@ -6604,8 +6605,8 @@ dependencies = [ [[package]] name = "sc-rpc" -version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" +version = "2.0.0-rc5" +source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" dependencies = [ "futures 0.3.5", "hash-db", @@ -6636,8 +6637,8 @@ dependencies = [ [[package]] name = "sc-rpc-api" -version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" +version = "0.8.0-rc5" +source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -6660,8 +6661,8 @@ dependencies = [ [[package]] name = "sc-rpc-server" -version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" +version = "2.0.0-rc5" +source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" dependencies = [ "jsonrpc-core", "jsonrpc-http-server", @@ -6676,8 +6677,8 @@ dependencies = [ [[package]] name = "sc-service" -version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" +version = "0.8.0-rc5" +source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" dependencies = [ "derive_more 0.99.9", "directories", @@ -6738,8 +6739,8 @@ dependencies = [ [[package]] name = "sc-state-db" -version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" +version = "0.8.0-rc5" +source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" dependencies = [ "log 0.4.8", "parity-scale-codec", @@ -6752,8 +6753,8 @@ dependencies = [ [[package]] name = "sc-telemetry" -version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" +version = "2.0.0-rc5" +source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6773,8 +6774,8 @@ dependencies = [ [[package]] name = "sc-tracing" -version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" +version = "2.0.0-rc5" +source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" dependencies = [ "erased-serde", "log 0.4.8", @@ -6790,8 +6791,8 @@ dependencies = [ [[package]] name = "sc-transaction-graph" -version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" +version = "2.0.0-rc5" +source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -6811,8 +6812,8 @@ dependencies = [ [[package]] name = "sc-transaction-pool" -version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" +version = "2.0.0-rc5" +source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -7243,8 +7244,8 @@ dependencies = [ [[package]] name = "sp-allocator" -version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" +version = "2.0.0-rc5" +source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" dependencies = [ "derive_more 0.99.9", "log 0.4.8", @@ -7255,8 +7256,8 @@ dependencies = [ [[package]] name = "sp-api" -version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" +version = "2.0.0-rc5" +source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" dependencies = [ "hash-db", "parity-scale-codec", @@ -7270,8 +7271,8 @@ dependencies = [ [[package]] name = "sp-api-proc-macro" -version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" +version = "2.0.0-rc5" +source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" dependencies = [ "blake2-rfc", "proc-macro-crate", @@ -7282,8 +7283,8 @@ dependencies = [ [[package]] name = "sp-application-crypto" -version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" +version = "2.0.0-rc5" +source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" dependencies = [ "parity-scale-codec", "serde", @@ -7294,8 +7295,8 @@ dependencies = [ [[package]] name = "sp-arithmetic" -version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" +version = "2.0.0-rc5" +source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" dependencies = [ "integer-sqrt", "num-traits 0.2.12", @@ -7307,8 +7308,8 @@ dependencies = [ [[package]] name = "sp-authority-discovery" -version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" +version = "2.0.0-rc5" +source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" dependencies = [ "parity-scale-codec", "sp-api", @@ -7319,8 +7320,8 @@ dependencies = [ [[package]] name = "sp-authorship" -version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" +version = "2.0.0-rc5" +source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" dependencies = [ "parity-scale-codec", "sp-inherents", @@ -7330,8 +7331,8 @@ dependencies = [ [[package]] name = "sp-block-builder" -version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" +version = "2.0.0-rc5" +source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" dependencies = [ "parity-scale-codec", "sp-api", @@ -7342,8 +7343,8 @@ dependencies = [ [[package]] name = "sp-blockchain" -version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" +version = "2.0.0-rc5" +source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" dependencies = [ "derive_more 0.99.9", "log 0.4.8", @@ -7359,8 +7360,8 @@ dependencies = [ [[package]] name = "sp-chain-spec" -version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" +version = "2.0.0-rc5" +source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" dependencies = [ "serde", "serde_json", @@ -7368,8 +7369,8 @@ dependencies = [ [[package]] name = "sp-consensus" -version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" +version = "0.8.0-rc5" +source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -7393,8 +7394,8 @@ dependencies = [ [[package]] name = "sp-consensus-aura" -version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" +version = "0.8.0-rc5" +source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" dependencies = [ "parity-scale-codec", "sp-api", @@ -7407,8 +7408,8 @@ dependencies = [ [[package]] name = "sp-consensus-babe" -version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" +version = "0.8.0-rc5" +source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" dependencies = [ "merlin", "parity-scale-codec", @@ -7426,8 +7427,8 @@ dependencies = [ [[package]] name = "sp-consensus-slots" -version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" +version = "0.8.0-rc5" +source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" dependencies = [ "parity-scale-codec", "sp-runtime", @@ -7435,8 +7436,8 @@ dependencies = [ [[package]] name = "sp-consensus-vrf" -version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" +version = "0.8.0-rc5" +source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" dependencies = [ "parity-scale-codec", "schnorrkel", @@ -7447,8 +7448,8 @@ dependencies = [ [[package]] name = "sp-core" -version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" +version = "2.0.0-rc5" +source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" dependencies = [ "base58", "blake2-rfc", @@ -7490,8 +7491,8 @@ dependencies = [ [[package]] name = "sp-database" -version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" +version = "2.0.0-rc5" +source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" dependencies = [ "kvdb", "parking_lot 0.10.2", @@ -7499,8 +7500,8 @@ dependencies = [ [[package]] name = "sp-debug-derive" -version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" +version = "2.0.0-rc5" +source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" dependencies = [ "proc-macro2 1.0.18", "quote 1.0.7", @@ -7509,8 +7510,8 @@ dependencies = [ [[package]] name = "sp-externalities" -version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" +version = "0.8.0-rc5" +source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" dependencies = [ "environmental", "parity-scale-codec", @@ -7520,8 +7521,8 @@ dependencies = [ [[package]] name = "sp-finality-grandpa" -version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" +version = "2.0.0-rc5" +source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" dependencies = [ "finality-grandpa", "log 0.4.8", @@ -7536,8 +7537,8 @@ dependencies = [ [[package]] name = "sp-finality-tracker" -version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" +version = "2.0.0-rc5" +source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" dependencies = [ "parity-scale-codec", "sp-inherents", @@ -7546,8 +7547,8 @@ dependencies = [ [[package]] name = "sp-inherents" -version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" +version = "2.0.0-rc5" +source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" dependencies = [ "derive_more 0.99.9", "parity-scale-codec", @@ -7558,8 +7559,8 @@ dependencies = [ [[package]] name = "sp-io" -version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" +version = "2.0.0-rc5" +source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" dependencies = [ "futures 0.3.5", "hash-db", @@ -7579,8 +7580,8 @@ dependencies = [ [[package]] name = "sp-keyring" -version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" +version = "2.0.0-rc5" +source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" dependencies = [ "lazy_static", "sp-core", @@ -7590,8 +7591,8 @@ dependencies = [ [[package]] name = "sp-npos-elections" -version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" +version = "2.0.0-rc5" +source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" dependencies = [ "parity-scale-codec", "serde", @@ -7602,8 +7603,8 @@ dependencies = [ [[package]] name = "sp-npos-elections-compact" -version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" +version = "2.0.0-rc5" +source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -7613,8 +7614,8 @@ dependencies = [ [[package]] name = "sp-offchain" -version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" +version = "2.0.0-rc5" +source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" dependencies = [ "sp-api", "sp-core", @@ -7623,8 +7624,8 @@ dependencies = [ [[package]] name = "sp-panic-handler" -version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" +version = "2.0.0-rc5" +source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" dependencies = [ "backtrace", "log 0.4.8", @@ -7632,8 +7633,8 @@ dependencies = [ [[package]] name = "sp-rpc" -version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" +version = "2.0.0-rc5" +source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" dependencies = [ "serde", "sp-core", @@ -7641,8 +7642,8 @@ dependencies = [ [[package]] name = "sp-runtime" -version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" +version = "2.0.0-rc5" +source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" dependencies = [ "either", "hash256-std-hasher", @@ -7663,8 +7664,8 @@ dependencies = [ [[package]] name = "sp-runtime-interface" -version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" +version = "2.0.0-rc5" +source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" dependencies = [ "parity-scale-codec", "primitive-types", @@ -7678,8 +7679,8 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" -version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" +version = "2.0.0-rc5" +source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" dependencies = [ "Inflector", "proc-macro-crate", @@ -7690,8 +7691,8 @@ dependencies = [ [[package]] name = "sp-serializer" -version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" +version = "2.0.0-rc5" +source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" dependencies = [ "serde", "serde_json", @@ -7699,8 +7700,8 @@ dependencies = [ [[package]] name = "sp-session" -version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" +version = "2.0.0-rc5" +source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" dependencies = [ "parity-scale-codec", "sp-api", @@ -7712,8 +7713,8 @@ dependencies = [ [[package]] name = "sp-staking" -version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" +version = "2.0.0-rc5" +source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" dependencies = [ "parity-scale-codec", "sp-runtime", @@ -7722,8 +7723,8 @@ dependencies = [ [[package]] name = "sp-state-machine" -version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" +version = "0.8.0-rc5" +source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" dependencies = [ "hash-db", "itertools 0.9.0", @@ -7743,13 +7744,13 @@ dependencies = [ [[package]] name = "sp-std" -version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" +version = "2.0.0-rc5" +source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" [[package]] name = "sp-storage" -version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" +version = "2.0.0-rc5" +source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" dependencies = [ "impl-serde 0.2.3", "ref-cast", @@ -7760,8 +7761,8 @@ dependencies = [ [[package]] name = "sp-timestamp" -version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" +version = "2.0.0-rc5" +source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -7774,8 +7775,8 @@ dependencies = [ [[package]] name = "sp-tracing" -version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" +version = "2.0.0-rc5" +source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" dependencies = [ "log 0.4.8", "rental", @@ -7784,8 +7785,8 @@ dependencies = [ [[package]] name = "sp-transaction-pool" -version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" +version = "2.0.0-rc5" +source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -7799,8 +7800,8 @@ dependencies = [ [[package]] name = "sp-trie" -version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" +version = "2.0.0-rc5" +source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" dependencies = [ "hash-db", "memory-db", @@ -7813,8 +7814,8 @@ dependencies = [ [[package]] name = "sp-utils" -version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" +version = "2.0.0-rc5" +source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" dependencies = [ "futures 0.3.5", "futures-core", @@ -7825,8 +7826,8 @@ dependencies = [ [[package]] name = "sp-version" -version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" +version = "2.0.0-rc5" +source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" dependencies = [ "impl-serde 0.2.3", "parity-scale-codec", @@ -7837,8 +7838,8 @@ dependencies = [ [[package]] name = "sp-wasm-interface" -version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" +version = "2.0.0-rc5" +source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -7977,8 +7978,8 @@ dependencies = [ [[package]] name = "substrate-browser-utils" -version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" +version = "0.8.0-rc5" +source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" dependencies = [ "chrono", "clear_on_drop", @@ -8004,16 +8005,16 @@ dependencies = [ [[package]] name = "substrate-build-script-utils" -version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" +version = "2.0.0-rc5" +source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" dependencies = [ "platforms", ] [[package]] name = "substrate-frame-rpc-system" -version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" +version = "2.0.0-rc5" +source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" dependencies = [ "frame-system-rpc-runtime-api", "futures 0.3.5", @@ -8035,8 +8036,8 @@ dependencies = [ [[package]] name = "substrate-prometheus-endpoint" -version = "0.8.0-rc4" -source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" +version = "0.8.0-rc5" +source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" dependencies = [ "async-std", "derive_more 0.99.9", @@ -8049,8 +8050,8 @@ dependencies = [ [[package]] name = "substrate-test-client" -version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" +version = "2.0.0-rc5" +source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" dependencies = [ "futures 0.1.29", "futures 0.3.5", @@ -8075,8 +8076,8 @@ dependencies = [ [[package]] name = "substrate-test-runtime" -version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" +version = "2.0.0-rc5" +source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" dependencies = [ "cfg-if", "frame-executive", @@ -8115,8 +8116,8 @@ dependencies = [ [[package]] name = "substrate-test-runtime-client" -version = "2.0.0-rc4" -source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" +version = "2.0.0-rc5" +source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" dependencies = [ "futures 0.3.5", "parity-scale-codec", @@ -8137,7 +8138,7 @@ dependencies = [ [[package]] name = "substrate-wasm-builder-runner" version = "1.0.6" -source = "git+https://github.com/paritytech/substrate#5c43b2bebb331ebeaac5b6e21778203b1c73aa83" +source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" [[package]] name = "substrate-wasm-builder-runner" diff --git a/availability-store/Cargo.toml b/availability-store/Cargo.toml index 48e5024e4e..d91a1f115a 100644 --- a/availability-store/Cargo.toml +++ b/availability-store/Cargo.toml @@ -17,7 +17,7 @@ exit-future = "0.2.0" codec = { package = "parity-scale-codec", version = "1.3.0", features = ["derive"] } sc-network = { git = "https://github.com/paritytech/substrate", branch = "master" } consensus_common = { package = "sp-consensus", git = "https://github.com/paritytech/substrate", branch = "master" } -client = { package = "sc-client-api", git = "https://github.com/paritytech/substrate", branch = "master" } +client = { package = "sc-client-api", git = "https://github.com/paritytech/substrate", branch = "master", version = "2.0.0-rc5" } sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "master" } sp-blockchain = { git = "https://github.com/paritytech/substrate", branch = "master" } sp-api = { git = "https://github.com/paritytech/substrate", branch = "master" } diff --git a/collator/src/lib.rs b/collator/src/lib.rs index 663cb825bf..2e2b330b0c 100644 --- a/collator/src/lib.rs +++ b/collator/src/lib.rs @@ -510,7 +510,7 @@ mod tests { fn check_send(_: T) {} let cli = Cli::from_iter(&["-dev"]); - let task_executor = |_, _| {}; + let task_executor = |_, _| async {}; let config = cli.create_configuration(&cli.run.base, task_executor.into()).unwrap(); check_send(start_collator( diff --git a/node/test-service/tests/build-blocks.rs b/node/test-service/tests/build-blocks.rs index 65771dda05..612efc8f76 100644 --- a/node/test-service/tests/build-blocks.rs +++ b/node/test-service/tests/build-blocks.rs @@ -26,7 +26,7 @@ static INTEGRATION_TEST_ALLOWED_TIME: Option<&str> = option_env!("INTEGRATION_TE #[tokio::test] async fn ensure_test_service_build_blocks() { let task_executor: TaskExecutor = (move |fut, _| { - spawn(fut); + spawn(fut).map(|_| ()) }) .into(); let mut alice = run_test_node( diff --git a/node/test-service/tests/call-function.rs b/node/test-service/tests/call-function.rs index b7b191fdab..8a4db067ae 100644 --- a/node/test-service/tests/call-function.rs +++ b/node/test-service/tests/call-function.rs @@ -26,7 +26,7 @@ static INTEGRATION_TEST_ALLOWED_TIME: Option<&str> = option_env!("INTEGRATION_TE async fn call_function_actually_work() { let mut alice = run_test_node( (move |fut, _| { - spawn(fut); + spawn(fut).map(|_| ()) }) .into(), Alice, diff --git a/runtime/kusama/src/lib.rs b/runtime/kusama/src/lib.rs index df583ccbc9..7354feb6dd 100644 --- a/runtime/kusama/src/lib.rs +++ b/runtime/kusama/src/lib.rs @@ -87,7 +87,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("kusama"), impl_name: create_runtime_str!("parity-kusama"), authoring_version: 2, - spec_version: 2018, + spec_version: 2019, impl_version: 0, #[cfg(not(feature = "disable-runtime-api"))] apis: RUNTIME_API_VERSIONS, diff --git a/runtime/polkadot/src/lib.rs b/runtime/polkadot/src/lib.rs index c2a28975f1..e7afcfe16b 100644 --- a/runtime/polkadot/src/lib.rs +++ b/runtime/polkadot/src/lib.rs @@ -86,7 +86,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("polkadot"), impl_name: create_runtime_str!("parity-polkadot"), authoring_version: 0, - spec_version: 18, + spec_version: 19, impl_version: 0, #[cfg(not(feature = "disable-runtime-api"))] apis: RUNTIME_API_VERSIONS, diff --git a/runtime/westend/src/lib.rs b/runtime/westend/src/lib.rs index 1d97756952..6d7fdc79f0 100644 --- a/runtime/westend/src/lib.rs +++ b/runtime/westend/src/lib.rs @@ -83,7 +83,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("westend"), impl_name: create_runtime_str!("parity-westend"), authoring_version: 2, - spec_version: 38, + spec_version: 39, impl_version: 0, #[cfg(not(feature = "disable-runtime-api"))] apis: RUNTIME_API_VERSIONS, diff --git a/scripts/gitlab/check_runtime.sh b/scripts/gitlab/check_runtime.sh index 9adbd1bb58..30fdcd455c 100755 --- a/scripts/gitlab/check_runtime.sh +++ b/scripts/gitlab/check_runtime.sh @@ -214,7 +214,7 @@ do source file directories: - runtime - versions file: ${VERSIONS_FILE} + versions file: ${RUNTIME} EOT -- GitLab From 484a9f3a4fac366ab2476bd0606f774278992655 Mon Sep 17 00:00:00 2001 From: Robert Habermeier Date: Wed, 22 Jul 2020 12:12:49 -0400 Subject: [PATCH 090/192] Replace StartWork and StopWork with an ActiveLeavesUpdate signal (#1431) --- .../src/node/availability/bitfield-signing.md | 2 +- .../src/node/backing/candidate-backing.md | 6 ++++-- .../src/node/backing/pov-distribution.md | 17 ++++++++------- .../implementers-guide/src/node/overseer.md | 21 +++++++++++-------- .../src/node/subsystems-and-jobs.md | 2 ++ .../src/node/utility/availability-store.md | 7 ++++--- .../src/node/utility/network-bridge.md | 2 +- .../src/node/utility/provisioner.md | 8 +++++-- .../src/node/utility/runtime-api.md | 2 +- .../src/types/overseer-protocol.md | 19 +++++++++++++---- 10 files changed, 55 insertions(+), 31 deletions(-) diff --git a/roadmap/implementers-guide/src/node/availability/bitfield-signing.md b/roadmap/implementers-guide/src/node/availability/bitfield-signing.md index 613736901d..736fac4ff1 100644 --- a/roadmap/implementers-guide/src/node/availability/bitfield-signing.md +++ b/roadmap/implementers-guide/src/node/availability/bitfield-signing.md @@ -11,7 +11,7 @@ Output: ## Functionality -Upon onset of a new relay-chain head with `StartWork`, launch bitfield signing job for the head. Stop the job on `StopWork`. +Upon receipt of an `ActiveLeavesUpdate`, launch bitfield signing job for each `activated` head. Stop the job for each `deactivated` head. ## Bitfield Signing Job diff --git a/roadmap/implementers-guide/src/node/backing/candidate-backing.md b/roadmap/implementers-guide/src/node/backing/candidate-backing.md index 2044fbd8e7..afea5e8ee4 100644 --- a/roadmap/implementers-guide/src/node/backing/candidate-backing.md +++ b/roadmap/implementers-guide/src/node/backing/candidate-backing.md @@ -31,8 +31,10 @@ The subsystem should maintain a set of handles to Candidate Backing Jobs that ar ### On Overseer Signal -* If the signal is an [`OverseerSignal`][OverseerSignal]`::StartWork(relay_parent)`, spawn a Candidate Backing Job with the given relay parent, storing a bidirectional channel with the Candidate Backing Job in the set of handles. -* If the signal is an [`OverseerSignal`][OverseerSignal]`::StopWork(relay_parent)`, cease the Candidate Backing Job under that relay parent, if any. +* If the signal is an [`OverseerSignal`][OverseerSignal]`::ActiveLeavesUpdate`: + * spawn a Candidate Backing Job for each `activated` head, storing a bidirectional channel with the Candidate Backing Job in the set of handles. + * cease the Candidate Backing Job for each `deactivated` head, if any. +* If the signal is an [`OverseerSignal`][OverseerSignal]`::Conclude`: Forward conclude messages to all jobs, wait a small amount of time for them to join, and then exit. ### On Receiving `CandidateBackingMessage` diff --git a/roadmap/implementers-guide/src/node/backing/pov-distribution.md b/roadmap/implementers-guide/src/node/backing/pov-distribution.md index 32c8fd3788..4215386d26 100644 --- a/roadmap/implementers-guide/src/node/backing/pov-distribution.md +++ b/roadmap/implementers-guide/src/node/backing/pov-distribution.md @@ -30,7 +30,7 @@ For this, in order to avoid reaching into the internals of the [Statement Distri The view update mechanism of the [Network Bridge](../utility/network-bridge.md) ensures that peers are only allowed to consider a certain set of relay-parents as live. So this bounding mechanism caps the amount of data we need to store per peer at any time at `sum({ 2 * n_validators_at_head(head) * sizeof(hash) for head in view_heads })`. Additionally, peers should only be allowed to notify us of PoV hashes they are waiting for in the context of relay-parents in our own local view, which means that `n_validators_at_head` is implied to be `0` for relay-parents not in our own local view. -View updates from peers and our own view updates are received from the network bridge. These will lag somewhat behind the `StartWork` and `StopWork` messages received from the overseer, which will influence the actual data we store. The `OurViewUpdate`s from the [`NetworkBridgeEvent`](../../types/overseer-protocol.md#network-bridge-update) must be considered canonical in terms of our peers' perception of us. +View updates from peers and our own view updates are received from the network bridge. These will lag somewhat behind the `ActiveLeavesUpdate` messages received from the overseer, which will influence the actual data we store. The `OurViewUpdate`s from the [`NetworkBridgeEvent`](../../types/overseer-protocol.md#network-bridge-update) must be considered canonical in terms of our peers' perception of us. Lastly, the system needs to be bootstrapped with our own perception of which PoVs we are cognizant of but awaiting data for. This is done by receipt of the [`PoVDistributionMessage`](../../types/overseer-protocol.md#pov-distribution-message)::FetchPoV variant. Proper operation of this subsystem depends on the descriptors passed faithfully representing candidates which have been seconded by other validators. @@ -72,12 +72,13 @@ enum NetworkMessage { Here is the logic of the state machine: *Overseer Signals* -- On `StartWork(relay_parent)`: - - Get the number of validators at that relay parent by querying the [Runtime API](../utility/runtime-api.md) for the validators and then counting them. - - Create a blank entry in `relay_parent_state` under `relay_parent` with correct `n_validators` set. -- On `StopWork(relay_parent)`: - - Remove the entry for `relay_parent` from `relay_parent_state`. -- On `Concluded`: conclude. +- On `ActiveLeavesUpdate(relay_parent)`: + - For each relay-parent in the `activated` list: + - Get the number of validators at that relay parent by querying the [Runtime API](../utility/runtime-api.md) for the validators and then counting them. + - Create a blank entry in `relay_parent_state` under `relay_parent` with correct `n_validators` set. + - For each relay-parent in the `deactivated` list: + - Remove the entry for `relay_parent` from `relay_parent_state`. +- On `Conclude`: conclude. *PoV Distribution Messages* - On `FetchPoV(relay_parent, descriptor, response_channel)` @@ -101,7 +102,7 @@ Here is the logic of the state machine: - If this is `NetworkMessage::Awaiting(relay_parent, pov_hashes)`: - If there is no entry under `peer_state.awaited` for the `relay_parent`, report and ignore. - If `relay_parent` is not contained within `our_view`, report and ignore. - - Otherwise, if the peer's `awaited` map combined with the `pov_hashes` would have more than ` 2 * relay_parent_state[relay_parent].n_validators` entries, report and ignore. Note that we are leaning on the property of the network bridge that it sets our view based on `StartWork` messages. + - Otherwise, if the peer's `awaited` map combined with the `pov_hashes` would have more than ` 2 * relay_parent_state[relay_parent].n_validators` entries, report and ignore. Note that we are leaning on the property of the network bridge that it sets our view based on `activated` heads in `ActiveLeavesUpdate` signals. - For each new `pov_hash` in `pov_hashes`, if there is a `pov` under `pov_hash` in the `known` map, send the peer a `NetworkMessage::SendPoV(relay_parent, pov_hash, pov)`. - Otherwise, add the `pov_hash` to the `awaited` map - If this is `NetworkMessage::SendPoV(relay_parent, pov_hash, pov)`: diff --git a/roadmap/implementers-guide/src/node/overseer.md b/roadmap/implementers-guide/src/node/overseer.md index 27c7c7ebb4..0466185430 100644 --- a/roadmap/implementers-guide/src/node/overseer.md +++ b/roadmap/implementers-guide/src/node/overseer.md @@ -24,7 +24,7 @@ The hierarchy of subsystems: ``` -The overseer determines work to do based on block import events and block finalization events. It does this by keeping track of the set of relay-parents for which work is currently being done. This is known as the "active leaves" set. It determines an initial set of active leaves on startup based on the data on-disk, and uses events about blockchain import to update the active leaves. Updates lead to [`OverseerSignal`](../types/overseer-protocol.md#overseer-signal)`::StartWork` and [`OverseerSignal`](../types/overseer-protocol.md#overseer-signal)`::StopWork` being sent according to new relay-parents, as well as relay-parents to stop considering. Block import events inform the overseer of leaves that no longer need to be built on, now that they have children, and inform us to begin building on those children. Block finalization events inform us when we can stop focusing on blocks that appear to have been orphaned. +The overseer determines work to do based on block import events and block finalization events. It does this by keeping track of the set of relay-parents for which work is currently being done. This is known as the "active leaves" set. It determines an initial set of active leaves on startup based on the data on-disk, and uses events about blockchain import to update the active leaves. Updates lead to [`OverseerSignal`](../types/overseer-protocol.md#overseer-signal)`::ActiveLeavesUpdate` being sent according to new relay-parents, as well as relay-parents to stop considering. Block import events inform the overseer of leaves that no longer need to be built on, now that they have children, and inform us to begin building on those children. Block finalization events inform us when we can stop focusing on blocks that appear to have been orphaned. The overseer's logic can be described with these functions: @@ -32,15 +32,14 @@ The overseer's logic can be described with these functions: * Start all subsystems * Determine all blocks of the blockchain that should be built on. This should typically be the head of the best fork of the chain we are aware of. Sometimes add recent forks as well. -* For each of these blocks, send an `OverseerSignal::StartWork` to all subsystems. +* Send an `OverseerSignal::ActiveLeavesUpdate` to all subsystems with `activated` containing each of these blocks. * Begin listening for block import and finality events ## On Block Import Event * Apply the block import event to the active leaves. A new block should lead to its addition to the active leaves set and its parent being deactivated. -* For any deactivated leaves send an `OverseerSignal::StopWork` message to all subsystems. -* For any activated leaves send an `OverseerSignal::StartWork` message to all subsystems. -* Ensure all `StartWork` messages are flushed before resuming activity as a message router. +* Send an `OverseerSignal::ActiveLeavesUpdate` message to all subsystems containing all activated and deactivated leaves. +* Ensure all `ActiveLeavesUpdate` messages are flushed before resuming activity as a message router. > TODO: in the future, we may want to avoid building on too many sibling blocks at once. the notion of a "preferred head" among many competing sibling blocks would imply changes in our "active leaves" update rules here @@ -48,7 +47,7 @@ The overseer's logic can be described with these functions: * Note the height `h` of the newly finalized block `B`. * Prune all leaves from the active leaves which have height `<= h` and are not `B`. -* Issue `OverseerSignal::StopWork` for all deactivated leaves. +* Issue `OverseerSignal::ActiveLeavesUpdate` containing all deactivated leaves. ## On Subsystem Failure @@ -78,15 +77,19 @@ When a subsystem wants to communicate with another subsystem, or, more typically First, the subsystem that spawned a job is responsible for handling the first step of the communication. The overseer is not aware of the hierarchy of tasks within any given subsystem and is only responsible for subsystem-to-subsystem communication. So the sending subsystem must pass on the message via the overseer to the receiving subsystem, in such a way that the receiving subsystem can further address the communication to one of its internal tasks, if necessary. -This communication prevents a certain class of race conditions. When the Overseer determines that it is time for subsystems to begin working on top of a particular relay-parent, it will dispatch a `StartWork` message to all subsystems to do so, and those messages will be handled asynchronously by those subsystems. Some subsystems will receive those messsages before others, and it is important that a message sent by subsystem A after receiving `StartWork` message will arrive at subsystem B after its `StartWork` message. If subsystem A maintaned an independent channel with subsystem B to communicate, it would be possible for subsystem B to handle the side message before the `StartWork` message, but it wouldn't have any logical course of action to take with the side message - leading to it being discarded or improperly handled. Well-architectured state machines should have a single source of inputs, so that is what we do here. +This communication prevents a certain class of race conditions. When the Overseer determines that it is time for subsystems to begin working on top of a particular relay-parent, it will dispatch a `ActiveLeavesUpdate` message to all subsystems to do so, and those messages will be handled asynchronously by those subsystems. Some subsystems will receive those messsages before others, and it is important that a message sent by subsystem A after receiving `ActiveLeavesUpdate` message will arrive at subsystem B after its `ActiveLeavesUpdate` message. If subsystem A maintaned an independent channel with subsystem B to communicate, it would be possible for subsystem B to handle the side message before the `ActiveLeavesUpdate` message, but it wouldn't have any logical course of action to take with the side message - leading to it being discarded or improperly handled. Well-architectured state machines should have a single source of inputs, so that is what we do here. -One exception is reasonable to make for responses to requests. A request should be made via the overseer in order to ensure that it arrives after any relevant `StartWork` message. A subsystem issuing a request as a result of a `StartWork` message can safely receive the response via a side-channel for two reasons: +One exception is reasonable to make for responses to requests. A request should be made via the overseer in order to ensure that it arrives after any relevant `ActiveLeavesUpdate` message. A subsystem issuing a request as a result of a `ActiveLeavesUpdate` message can safely receive the response via a side-channel for two reasons: 1. It's impossible for a request to be answered before it arrives, it is provable that any response to a request obeys the same ordering constraint. -1. The request was sent as a result of handling a `StartWork` message. Then there is no possible future in which the `StartWork` message has not been handled upon the receipt of the response. +1. The request was sent as a result of handling a `ActiveLeavesUpdate` message. Then there is no possible future in which the `ActiveLeavesUpdate` message has not been handled upon the receipt of the response. So as a single exception to the rule that all communication must happen via the overseer we allow the receipt of responses to requests via a side-channel, which may be established for that purpose. This simplifies any cases where the outside world desires to make a request to a subsystem, as the outside world can then establish a side-channel to receive the response on. It's important to note that the overseer is not aware of the internals of subsystems, and this extends to the jobs that they spawn. The overseer isn't aware of the existence or definition of those jobs, and is only aware of the outer subsystems with which it interacts. This gives subsystem implementations leeway to define internal jobs as they see fit, and to wrap a more complex hierarchy of state machines than having a single layer of jobs for relay-parent-based work. Likewise, subsystems aren't required to spawn jobs. Certain types of subsystems, such as those for shared storage or networking resources, won't perform block-based work but would still benefit from being on the Overseer's message bus. These subsystems can just ignore the overseer's signals for block-based work. Furthermore, the protocols by which subsystems communicate with each other should be well-defined irrespective of the implementation of the subsystem. In other words, their interface should be distinct from their implementation. This will prevent subsystems from accessing aspects of each other that are beyond the scope of the communication boundary. + +## On shutdown + +Send an `OverseerSignal::Conclude` message to each subsystem and wait some time for them to conclude before hard-exiting. diff --git a/roadmap/implementers-guide/src/node/subsystems-and-jobs.md b/roadmap/implementers-guide/src/node/subsystems-and-jobs.md index a9a65b3c43..8ca504f080 100644 --- a/roadmap/implementers-guide/src/node/subsystems-and-jobs.md +++ b/roadmap/implementers-guide/src/node/subsystems-and-jobs.md @@ -9,3 +9,5 @@ Most work that happens on the Node-side is related to building on top of a speci Since this goal of determining when to start and conclude work relative to a specific relay-parent is common to most, if not all subsystems, it is logically the job of the Overseer to distribute those signals as opposed to each subsystem duplicating that effort, potentially being out of synchronization with each other. Subsystem A should be able to expect that subsystem B is working on the same relay-parents as it is. One of the Overseer's tasks is to provide this heartbeat, or synchronized rhythm, to the system. The work that subsystems spawn to be done on a specific relay-parent is known as a job. Subsystems should set up and tear down jobs according to the signals received from the overseer. Subsystems may share or cache state between jobs. + +Subsystems must be robust to spurious exits. The outputs of the set of subsystems as a whole comprises of signed messages and data committed to disk. Care must be taken to avoid issuing messages that are not substantiated. Since subsystems need to be safe under spurious exits, it is the expected behavior that an `OverseerSignal::Conclude` can just lead to breaking the loop and exiting directly as opposed to waiting for everything to shut down gracefully. diff --git a/roadmap/implementers-guide/src/node/utility/availability-store.md b/roadmap/implementers-guide/src/node/utility/availability-store.md index 51810a06a0..51e8f8bb21 100644 --- a/roadmap/implementers-guide/src/node/utility/availability-store.md +++ b/roadmap/implementers-guide/src/node/utility/availability-store.md @@ -29,10 +29,11 @@ Input: [`AvailabilityStoreMessage`](../../types/overseer-protocol.md#availabilit ## Functionality -On `StartWork`: +On `ActiveLeavesUpdate`: -- Note any new candidates backed in the block. Update pruning records for any stored `PoVBlock`s. -- Note any newly-included candidates backed in the block. Update pruning records for any stored availability chunks. +For each head in the `activated` list: + - Note any new candidates backed in the block. Update pruning records for any stored `PoVBlock`s. + - Note any newly-included candidates backed in the block. Update pruning records for any stored availability chunks. On block finality events: diff --git a/roadmap/implementers-guide/src/node/utility/network-bridge.md b/roadmap/implementers-guide/src/node/utility/network-bridge.md index 0e83bc6277..09c7e081a6 100644 --- a/roadmap/implementers-guide/src/node/utility/network-bridge.md +++ b/roadmap/implementers-guide/src/node/utility/network-bridge.md @@ -21,7 +21,7 @@ There are two types of network messages this sends and receives: - ProtocolMessage(ProtocolId, Bytes) - ViewUpdate(View) -`StartWork` and `StopWork` determine the computation of our local view. A `ViewUpdate` is issued to each connected peer, and a `NetworkBridgeUpdate::OurViewChange` is issued for each registered event producer. +`ActiveLeavesUpdate`'s `activated` and `deactivated` lists determine the evolution of our local view over time. A `ViewUpdate` is issued to each connected peer after each update, and a `NetworkBridgeUpdate::OurViewChange` is issued for each registered event producer. On `RegisterEventProducer`: diff --git a/roadmap/implementers-guide/src/node/utility/provisioner.md b/roadmap/implementers-guide/src/node/utility/provisioner.md index e88f79ebc6..7692cd885d 100644 --- a/roadmap/implementers-guide/src/node/utility/provisioner.md +++ b/roadmap/implementers-guide/src/node/utility/provisioner.md @@ -50,8 +50,12 @@ The subsystem should maintain a set of handles to Block Authorship Provisioning ### On Overseer Signal -- `StartWork`: spawn a Block Authorship Provisioning Job with the given relay parent, storing a bidirectional channel with that job. -- `StopWork`: terminate the Block Authorship Provisioning Job for the given relay parent, if any. +- `ActiveLeavesUpdate`: + - For each `activated` head: + - spawn a Block Authorship Provisioning Job with the given relay parent, storing a bidirectional channel with that job. + - For each `deactivated` head: + - terminate the Block Authorship Provisioning Job for the given relay parent, if any. +- `Conclude`: Forward `Conclude` to all jobs, waiting a small amount of time for them to join, and then hard-exiting. ### On `ProvisionerMessage` diff --git a/roadmap/implementers-guide/src/node/utility/runtime-api.md b/roadmap/implementers-guide/src/node/utility/runtime-api.md index 05ceb85f4d..79df9a1d2d 100644 --- a/roadmap/implementers-guide/src/node/utility/runtime-api.md +++ b/roadmap/implementers-guide/src/node/utility/runtime-api.md @@ -16,4 +16,4 @@ On receipt of `RuntimeApiMessage::Request(relay_parent, request)`, answer the re ## Jobs -> TODO Don't limit requests based on parent hash, but limit caching. No caching should be done for any requests on relay_parents that are not live based on `StartWork` or `StopWork` messages. Maybe with some leeway for things that have just been stopped. +> TODO Don't limit requests based on parent hash, but limit caching. No caching should be done for any requests on relay_parents that are not active based on `ActiveLeavesUpdate` messages. Maybe with some leeway for things that have just been stopped. diff --git a/roadmap/implementers-guide/src/types/overseer-protocol.md b/roadmap/implementers-guide/src/types/overseer-protocol.md index d5d5509dd4..f6ff4213fd 100644 --- a/roadmap/implementers-guide/src/types/overseer-protocol.md +++ b/roadmap/implementers-guide/src/types/overseer-protocol.md @@ -8,10 +8,10 @@ Signals from the overseer to a subsystem to request change in execution that has ```rust enum OverseerSignal { - /// Signal to start work localized to the relay-parent hash. - StartWork(Hash), - /// Signal to stop (or phase down) work localized to the relay-parent hash. - StopWork(Hash), + /// Signal about a change in active leaves. + ActiveLeavesUpdate(ActiveLeavesUpdate), + /// Conclude all operation. + Conclude, } ``` @@ -22,6 +22,17 @@ All subsystems have their own message types; all of them need to be able to list Either way, there will be some top-level type encapsulating messages from the overseer to each subsystem. +## Active Leaves Update + +Indicates a change in active leaves. Activated leaves should have jobs, whereas deactivated leaves should lead to winding-down of work based on those leaves. + +```rust +struct ActiveLeavesUpdate { + activated: [Hash], // in practice, these should probably be a SmallVec + deactivated: [Hash], +} +``` + ## All Messages > TODO (now) -- GitLab From 3a189f5d0ff191fa58c18b1b81503cd3e1c9d33c Mon Sep 17 00:00:00 2001 From: Gavin Wood Date: Wed, 22 Jul 2020 19:43:27 +0200 Subject: [PATCH 091/192] Bump Substrate, version (#1456) * Bump Substrate * Bump --- Cargo.lock | 318 ++++++++++----------- Cargo.toml | 2 +- availability-store/Cargo.toml | 2 +- cli/Cargo.toml | 2 +- collator/Cargo.toml | 2 +- erasure-coding/Cargo.toml | 2 +- network/Cargo.toml | 2 +- network/test/Cargo.toml | 2 +- parachain/Cargo.toml | 2 +- parachain/test-parachains/adder/Cargo.toml | 2 +- parachain/test-parachains/halt/Cargo.toml | 2 +- primitives/Cargo.toml | 2 +- rpc/Cargo.toml | 2 +- runtime/common/Cargo.toml | 2 +- runtime/kusama/Cargo.toml | 2 +- runtime/polkadot/Cargo.toml | 2 +- runtime/test-runtime/Cargo.toml | 2 +- runtime/westend/Cargo.toml | 2 +- service/Cargo.toml | 2 +- statement-table/Cargo.toml | 2 +- validation/Cargo.toml | 2 +- 21 files changed, 179 insertions(+), 179 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index c4e95771fe..1aa1be6491 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1325,7 +1325,7 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "fork-tree" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" +source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" dependencies = [ "parity-scale-codec", ] @@ -1333,7 +1333,7 @@ dependencies = [ [[package]] name = "frame-benchmarking" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" +source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" dependencies = [ "frame-support", "frame-system", @@ -1350,7 +1350,7 @@ dependencies = [ [[package]] name = "frame-benchmarking-cli" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" +source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" dependencies = [ "Inflector", "frame-benchmarking", @@ -1369,7 +1369,7 @@ dependencies = [ [[package]] name = "frame-executive" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" +source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" dependencies = [ "frame-support", "frame-system", @@ -1384,7 +1384,7 @@ dependencies = [ [[package]] name = "frame-metadata" version = "11.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" +source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" dependencies = [ "parity-scale-codec", "serde", @@ -1395,7 +1395,7 @@ dependencies = [ [[package]] name = "frame-support" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" +source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" dependencies = [ "bitmask", "frame-metadata", @@ -1420,7 +1420,7 @@ dependencies = [ [[package]] name = "frame-support-procedural" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" +source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" dependencies = [ "frame-support-procedural-tools", "proc-macro2 1.0.18", @@ -1431,7 +1431,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" +source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" dependencies = [ "frame-support-procedural-tools-derive", "proc-macro-crate", @@ -1443,7 +1443,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools-derive" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" +source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" dependencies = [ "proc-macro2 1.0.18", "quote 1.0.7", @@ -1453,7 +1453,7 @@ dependencies = [ [[package]] name = "frame-system" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" +source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" dependencies = [ "frame-support", "impl-trait-for-tuples", @@ -1469,7 +1469,7 @@ dependencies = [ [[package]] name = "frame-system-benchmarking" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" +source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" dependencies = [ "frame-benchmarking", "frame-support", @@ -1483,7 +1483,7 @@ dependencies = [ [[package]] name = "frame-system-rpc-runtime-api" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" +source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" dependencies = [ "parity-scale-codec", "sp-api", @@ -2433,7 +2433,7 @@ dependencies = [ [[package]] name = "kusama-runtime" -version = "0.8.18" +version = "0.8.19" dependencies = [ "bitvec", "frame-benchmarking", @@ -3478,7 +3478,7 @@ dependencies = [ [[package]] name = "pallet-authority-discovery" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" +source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" dependencies = [ "frame-support", "frame-system", @@ -3494,7 +3494,7 @@ dependencies = [ [[package]] name = "pallet-authorship" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" +source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" dependencies = [ "frame-support", "frame-system", @@ -3509,7 +3509,7 @@ dependencies = [ [[package]] name = "pallet-babe" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" +source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" dependencies = [ "frame-benchmarking", "frame-support", @@ -3534,7 +3534,7 @@ dependencies = [ [[package]] name = "pallet-balances" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" +source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" dependencies = [ "frame-benchmarking", "frame-support", @@ -3548,7 +3548,7 @@ dependencies = [ [[package]] name = "pallet-collective" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" +source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" dependencies = [ "frame-benchmarking", "frame-support", @@ -3564,7 +3564,7 @@ dependencies = [ [[package]] name = "pallet-democracy" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" +source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" dependencies = [ "frame-benchmarking", "frame-support", @@ -3579,7 +3579,7 @@ dependencies = [ [[package]] name = "pallet-elections-phragmen" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" +source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" dependencies = [ "frame-benchmarking", "frame-support", @@ -3594,7 +3594,7 @@ dependencies = [ [[package]] name = "pallet-finality-tracker" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" +source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" dependencies = [ "frame-support", "frame-system", @@ -3610,7 +3610,7 @@ dependencies = [ [[package]] name = "pallet-grandpa" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" +source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" dependencies = [ "frame-benchmarking", "frame-support", @@ -3632,7 +3632,7 @@ dependencies = [ [[package]] name = "pallet-identity" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" +source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" dependencies = [ "enumflags2", "frame-benchmarking", @@ -3648,7 +3648,7 @@ dependencies = [ [[package]] name = "pallet-im-online" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" +source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" dependencies = [ "frame-benchmarking", "frame-support", @@ -3668,7 +3668,7 @@ dependencies = [ [[package]] name = "pallet-indices" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" +source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" dependencies = [ "frame-support", "frame-system", @@ -3684,7 +3684,7 @@ dependencies = [ [[package]] name = "pallet-membership" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" +source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" dependencies = [ "frame-support", "frame-system", @@ -3698,7 +3698,7 @@ dependencies = [ [[package]] name = "pallet-multisig" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" +source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" dependencies = [ "frame-support", "frame-system", @@ -3713,7 +3713,7 @@ dependencies = [ [[package]] name = "pallet-nicks" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" +source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" dependencies = [ "frame-support", "frame-system", @@ -3727,7 +3727,7 @@ dependencies = [ [[package]] name = "pallet-offences" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" +source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" dependencies = [ "frame-support", "frame-system", @@ -3742,7 +3742,7 @@ dependencies = [ [[package]] name = "pallet-offences-benchmarking" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" +source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" dependencies = [ "frame-benchmarking", "frame-support", @@ -3763,7 +3763,7 @@ dependencies = [ [[package]] name = "pallet-proxy" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" +source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" dependencies = [ "frame-support", "frame-system", @@ -3778,7 +3778,7 @@ dependencies = [ [[package]] name = "pallet-randomness-collective-flip" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" +source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" dependencies = [ "frame-support", "frame-system", @@ -3791,7 +3791,7 @@ dependencies = [ [[package]] name = "pallet-recovery" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" +source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" dependencies = [ "enumflags2", "frame-support", @@ -3806,7 +3806,7 @@ dependencies = [ [[package]] name = "pallet-scheduler" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" +source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" dependencies = [ "frame-benchmarking", "frame-support", @@ -3821,7 +3821,7 @@ dependencies = [ [[package]] name = "pallet-session" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" +source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" dependencies = [ "frame-support", "frame-system", @@ -3841,7 +3841,7 @@ dependencies = [ [[package]] name = "pallet-session-benchmarking" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" +source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" dependencies = [ "frame-benchmarking", "frame-support", @@ -3857,7 +3857,7 @@ dependencies = [ [[package]] name = "pallet-society" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" +source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" dependencies = [ "frame-support", "frame-system", @@ -3871,7 +3871,7 @@ dependencies = [ [[package]] name = "pallet-staking" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" +source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" dependencies = [ "frame-benchmarking", "frame-support", @@ -3893,7 +3893,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-curve" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" +source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -3904,7 +3904,7 @@ dependencies = [ [[package]] name = "pallet-sudo" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" +source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" dependencies = [ "frame-support", "frame-system", @@ -3918,7 +3918,7 @@ dependencies = [ [[package]] name = "pallet-timestamp" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" +source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" dependencies = [ "frame-benchmarking", "frame-support", @@ -3936,7 +3936,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" +source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" dependencies = [ "frame-support", "frame-system", @@ -3953,7 +3953,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" +source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" dependencies = [ "jsonrpc-core", "jsonrpc-core-client", @@ -3971,7 +3971,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc-runtime-api" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" +source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" dependencies = [ "frame-support", "parity-scale-codec", @@ -3984,7 +3984,7 @@ dependencies = [ [[package]] name = "pallet-treasury" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" +source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" dependencies = [ "frame-benchmarking", "frame-support", @@ -3999,7 +3999,7 @@ dependencies = [ [[package]] name = "pallet-utility" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" +source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" dependencies = [ "frame-benchmarking", "frame-support", @@ -4015,7 +4015,7 @@ dependencies = [ [[package]] name = "pallet-vesting" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" +source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" dependencies = [ "enumflags2", "frame-benchmarking", @@ -4314,7 +4314,7 @@ checksum = "feb3b2b1033b8a60b4da6ee470325f887758c95d5320f52f9ce0df055a55940e" [[package]] name = "polkadot" -version = "0.8.18" +version = "0.8.19" dependencies = [ "assert_cmd", "futures 0.3.5", @@ -4328,7 +4328,7 @@ dependencies = [ [[package]] name = "polkadot-availability-store" -version = "0.8.18" +version = "0.8.19" dependencies = [ "derive_more 0.99.9", "exit-future", @@ -4354,7 +4354,7 @@ dependencies = [ [[package]] name = "polkadot-cli" -version = "0.8.18" +version = "0.8.19" dependencies = [ "frame-benchmarking-cli", "futures 0.3.5", @@ -4379,7 +4379,7 @@ dependencies = [ [[package]] name = "polkadot-collator" -version = "0.8.18" +version = "0.8.19" dependencies = [ "futures 0.3.5", "futures-timer 2.0.2", @@ -4417,7 +4417,7 @@ dependencies = [ [[package]] name = "polkadot-erasure-coding" -version = "0.8.18" +version = "0.8.19" dependencies = [ "derive_more 0.15.0", "parity-scale-codec", @@ -4429,7 +4429,7 @@ dependencies = [ [[package]] name = "polkadot-network" -version = "0.8.18" +version = "0.8.19" dependencies = [ "arrayvec 0.4.12", "bytes 0.5.5", @@ -4477,7 +4477,7 @@ dependencies = [ [[package]] name = "polkadot-network-test" -version = "0.8.18" +version = "0.8.19" dependencies = [ "futures 0.3.5", "log 0.4.8", @@ -4597,7 +4597,7 @@ dependencies = [ [[package]] name = "polkadot-parachain" -version = "0.8.18" +version = "0.8.19" dependencies = [ "derive_more 0.99.9", "log 0.4.8", @@ -4635,7 +4635,7 @@ dependencies = [ [[package]] name = "polkadot-primitives" -version = "0.8.18" +version = "0.8.19" dependencies = [ "bitvec", "frame-system", @@ -4659,7 +4659,7 @@ dependencies = [ [[package]] name = "polkadot-rpc" -version = "0.8.18" +version = "0.8.19" dependencies = [ "jsonrpc-core", "pallet-transaction-payment-rpc", @@ -4685,7 +4685,7 @@ dependencies = [ [[package]] name = "polkadot-runtime" -version = "0.8.18" +version = "0.8.19" dependencies = [ "bitvec", "frame-benchmarking", @@ -4759,7 +4759,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-common" -version = "0.8.18" +version = "0.8.19" dependencies = [ "bitvec", "frame-benchmarking", @@ -4847,7 +4847,7 @@ dependencies = [ [[package]] name = "polkadot-service" -version = "0.8.18" +version = "0.8.19" dependencies = [ "env_logger", "frame-benchmarking", @@ -4990,7 +4990,7 @@ dependencies = [ [[package]] name = "polkadot-statement-table" -version = "0.8.18" +version = "0.8.19" dependencies = [ "parity-scale-codec", "polkadot-primitives", @@ -4999,7 +4999,7 @@ dependencies = [ [[package]] name = "polkadot-test-runtime" -version = "0.8.18" +version = "0.8.19" dependencies = [ "bitvec", "frame-executive", @@ -5130,7 +5130,7 @@ dependencies = [ [[package]] name = "polkadot-validation" -version = "0.8.18" +version = "0.8.19" dependencies = [ "ansi_term 0.12.1", "bitvec", @@ -5946,7 +5946,7 @@ dependencies = [ [[package]] name = "sc-authority-discovery" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" +source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" dependencies = [ "bytes 0.5.5", "derive_more 0.99.9", @@ -5973,7 +5973,7 @@ dependencies = [ [[package]] name = "sc-basic-authorship" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" +source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -5997,7 +5997,7 @@ dependencies = [ [[package]] name = "sc-block-builder" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" +source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" dependencies = [ "parity-scale-codec", "sc-client-api", @@ -6014,7 +6014,7 @@ dependencies = [ [[package]] name = "sc-chain-spec" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" +source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" dependencies = [ "impl-trait-for-tuples", "sc-chain-spec-derive", @@ -6030,7 +6030,7 @@ dependencies = [ [[package]] name = "sc-chain-spec-derive" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" +source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -6041,7 +6041,7 @@ dependencies = [ [[package]] name = "sc-cli" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" +source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" dependencies = [ "ansi_term 0.12.1", "atty", @@ -6082,7 +6082,7 @@ dependencies = [ [[package]] name = "sc-client-api" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" +source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" dependencies = [ "derive_more 0.99.9", "fnv", @@ -6118,7 +6118,7 @@ dependencies = [ [[package]] name = "sc-client-db" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" +source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" dependencies = [ "blake2-rfc", "hash-db", @@ -6147,7 +6147,7 @@ dependencies = [ [[package]] name = "sc-consensus" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" +source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" dependencies = [ "sc-client-api", "sp-blockchain", @@ -6158,7 +6158,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" +source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" dependencies = [ "derive_more 0.99.9", "fork-tree", @@ -6200,7 +6200,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe-rpc" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" +source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -6224,7 +6224,7 @@ dependencies = [ [[package]] name = "sc-consensus-epochs" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" +source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" dependencies = [ "fork-tree", "parity-scale-codec", @@ -6237,7 +6237,7 @@ dependencies = [ [[package]] name = "sc-consensus-slots" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" +source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6260,7 +6260,7 @@ dependencies = [ [[package]] name = "sc-consensus-uncles" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" +source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" dependencies = [ "log 0.4.8", "sc-client-api", @@ -6274,7 +6274,7 @@ dependencies = [ [[package]] name = "sc-executor" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" +source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" dependencies = [ "derive_more 0.99.9", "lazy_static", @@ -6302,7 +6302,7 @@ dependencies = [ [[package]] name = "sc-executor-common" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" +source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" dependencies = [ "derive_more 0.99.9", "log 0.4.8", @@ -6319,7 +6319,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmi" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" +source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" dependencies = [ "log 0.4.8", "parity-scale-codec", @@ -6334,7 +6334,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmtime" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" +source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" dependencies = [ "cranelift-codegen", "cranelift-wasm", @@ -6355,7 +6355,7 @@ dependencies = [ [[package]] name = "sc-finality-grandpa" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" +source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" dependencies = [ "assert_matches", "derive_more 0.99.9", @@ -6393,7 +6393,7 @@ dependencies = [ [[package]] name = "sc-finality-grandpa-rpc" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" +source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" dependencies = [ "derive_more 0.99.9", "finality-grandpa", @@ -6410,7 +6410,7 @@ dependencies = [ [[package]] name = "sc-informant" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" +source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" dependencies = [ "ansi_term 0.12.1", "futures 0.3.5", @@ -6428,7 +6428,7 @@ dependencies = [ [[package]] name = "sc-keystore" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" +source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" dependencies = [ "derive_more 0.99.9", "hex", @@ -6444,7 +6444,7 @@ dependencies = [ [[package]] name = "sc-light" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" +source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" dependencies = [ "hash-db", "lazy_static", @@ -6463,7 +6463,7 @@ dependencies = [ [[package]] name = "sc-network" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" +source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" dependencies = [ "bitflags", "bs58", @@ -6515,7 +6515,7 @@ dependencies = [ [[package]] name = "sc-network-gossip" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" +source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6530,7 +6530,7 @@ dependencies = [ [[package]] name = "sc-network-test" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" +source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" dependencies = [ "env_logger", "futures 0.3.5", @@ -6557,7 +6557,7 @@ dependencies = [ [[package]] name = "sc-offchain" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" +source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" dependencies = [ "bytes 0.5.5", "fnv", @@ -6584,7 +6584,7 @@ dependencies = [ [[package]] name = "sc-peerset" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" +source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" dependencies = [ "futures 0.3.5", "libp2p", @@ -6597,7 +6597,7 @@ dependencies = [ [[package]] name = "sc-proposer-metrics" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" +source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" dependencies = [ "log 0.4.8", "substrate-prometheus-endpoint", @@ -6606,7 +6606,7 @@ dependencies = [ [[package]] name = "sc-rpc" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" +source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" dependencies = [ "futures 0.3.5", "hash-db", @@ -6638,7 +6638,7 @@ dependencies = [ [[package]] name = "sc-rpc-api" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" +source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -6662,7 +6662,7 @@ dependencies = [ [[package]] name = "sc-rpc-server" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" +source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" dependencies = [ "jsonrpc-core", "jsonrpc-http-server", @@ -6678,7 +6678,7 @@ dependencies = [ [[package]] name = "sc-service" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" +source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" dependencies = [ "derive_more 0.99.9", "directories", @@ -6740,7 +6740,7 @@ dependencies = [ [[package]] name = "sc-state-db" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" +source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" dependencies = [ "log 0.4.8", "parity-scale-codec", @@ -6754,7 +6754,7 @@ dependencies = [ [[package]] name = "sc-telemetry" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" +source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6775,7 +6775,7 @@ dependencies = [ [[package]] name = "sc-tracing" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" +source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" dependencies = [ "erased-serde", "log 0.4.8", @@ -6792,7 +6792,7 @@ dependencies = [ [[package]] name = "sc-transaction-graph" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" +source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -6813,7 +6813,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" +source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -7245,7 +7245,7 @@ dependencies = [ [[package]] name = "sp-allocator" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" +source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" dependencies = [ "derive_more 0.99.9", "log 0.4.8", @@ -7257,7 +7257,7 @@ dependencies = [ [[package]] name = "sp-api" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" +source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" dependencies = [ "hash-db", "parity-scale-codec", @@ -7272,7 +7272,7 @@ dependencies = [ [[package]] name = "sp-api-proc-macro" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" +source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" dependencies = [ "blake2-rfc", "proc-macro-crate", @@ -7284,7 +7284,7 @@ dependencies = [ [[package]] name = "sp-application-crypto" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" +source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" dependencies = [ "parity-scale-codec", "serde", @@ -7296,7 +7296,7 @@ dependencies = [ [[package]] name = "sp-arithmetic" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" +source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" dependencies = [ "integer-sqrt", "num-traits 0.2.12", @@ -7309,7 +7309,7 @@ dependencies = [ [[package]] name = "sp-authority-discovery" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" +source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" dependencies = [ "parity-scale-codec", "sp-api", @@ -7321,7 +7321,7 @@ dependencies = [ [[package]] name = "sp-authorship" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" +source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" dependencies = [ "parity-scale-codec", "sp-inherents", @@ -7332,7 +7332,7 @@ dependencies = [ [[package]] name = "sp-block-builder" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" +source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" dependencies = [ "parity-scale-codec", "sp-api", @@ -7344,7 +7344,7 @@ dependencies = [ [[package]] name = "sp-blockchain" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" +source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" dependencies = [ "derive_more 0.99.9", "log 0.4.8", @@ -7361,7 +7361,7 @@ dependencies = [ [[package]] name = "sp-chain-spec" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" +source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" dependencies = [ "serde", "serde_json", @@ -7370,7 +7370,7 @@ dependencies = [ [[package]] name = "sp-consensus" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" +source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -7395,7 +7395,7 @@ dependencies = [ [[package]] name = "sp-consensus-aura" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" +source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" dependencies = [ "parity-scale-codec", "sp-api", @@ -7409,7 +7409,7 @@ dependencies = [ [[package]] name = "sp-consensus-babe" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" +source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" dependencies = [ "merlin", "parity-scale-codec", @@ -7428,7 +7428,7 @@ dependencies = [ [[package]] name = "sp-consensus-slots" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" +source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" dependencies = [ "parity-scale-codec", "sp-runtime", @@ -7437,7 +7437,7 @@ dependencies = [ [[package]] name = "sp-consensus-vrf" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" +source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" dependencies = [ "parity-scale-codec", "schnorrkel", @@ -7449,7 +7449,7 @@ dependencies = [ [[package]] name = "sp-core" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" +source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" dependencies = [ "base58", "blake2-rfc", @@ -7492,7 +7492,7 @@ dependencies = [ [[package]] name = "sp-database" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" +source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" dependencies = [ "kvdb", "parking_lot 0.10.2", @@ -7501,7 +7501,7 @@ dependencies = [ [[package]] name = "sp-debug-derive" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" +source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" dependencies = [ "proc-macro2 1.0.18", "quote 1.0.7", @@ -7511,7 +7511,7 @@ dependencies = [ [[package]] name = "sp-externalities" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" +source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" dependencies = [ "environmental", "parity-scale-codec", @@ -7522,7 +7522,7 @@ dependencies = [ [[package]] name = "sp-finality-grandpa" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" +source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" dependencies = [ "finality-grandpa", "log 0.4.8", @@ -7538,7 +7538,7 @@ dependencies = [ [[package]] name = "sp-finality-tracker" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" +source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" dependencies = [ "parity-scale-codec", "sp-inherents", @@ -7548,7 +7548,7 @@ dependencies = [ [[package]] name = "sp-inherents" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" +source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" dependencies = [ "derive_more 0.99.9", "parity-scale-codec", @@ -7560,7 +7560,7 @@ dependencies = [ [[package]] name = "sp-io" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" +source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" dependencies = [ "futures 0.3.5", "hash-db", @@ -7581,7 +7581,7 @@ dependencies = [ [[package]] name = "sp-keyring" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" +source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" dependencies = [ "lazy_static", "sp-core", @@ -7592,7 +7592,7 @@ dependencies = [ [[package]] name = "sp-npos-elections" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" +source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" dependencies = [ "parity-scale-codec", "serde", @@ -7604,7 +7604,7 @@ dependencies = [ [[package]] name = "sp-npos-elections-compact" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" +source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -7615,7 +7615,7 @@ dependencies = [ [[package]] name = "sp-offchain" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" +source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" dependencies = [ "sp-api", "sp-core", @@ -7625,7 +7625,7 @@ dependencies = [ [[package]] name = "sp-panic-handler" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" +source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" dependencies = [ "backtrace", "log 0.4.8", @@ -7634,7 +7634,7 @@ dependencies = [ [[package]] name = "sp-rpc" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" +source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" dependencies = [ "serde", "sp-core", @@ -7643,7 +7643,7 @@ dependencies = [ [[package]] name = "sp-runtime" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" +source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" dependencies = [ "either", "hash256-std-hasher", @@ -7665,7 +7665,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" +source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" dependencies = [ "parity-scale-codec", "primitive-types", @@ -7680,7 +7680,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" +source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" dependencies = [ "Inflector", "proc-macro-crate", @@ -7692,7 +7692,7 @@ dependencies = [ [[package]] name = "sp-serializer" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" +source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" dependencies = [ "serde", "serde_json", @@ -7701,7 +7701,7 @@ dependencies = [ [[package]] name = "sp-session" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" +source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" dependencies = [ "parity-scale-codec", "sp-api", @@ -7714,7 +7714,7 @@ dependencies = [ [[package]] name = "sp-staking" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" +source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" dependencies = [ "parity-scale-codec", "sp-runtime", @@ -7724,7 +7724,7 @@ dependencies = [ [[package]] name = "sp-state-machine" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" +source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" dependencies = [ "hash-db", "itertools 0.9.0", @@ -7745,12 +7745,12 @@ dependencies = [ [[package]] name = "sp-std" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" +source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" [[package]] name = "sp-storage" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" +source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" dependencies = [ "impl-serde 0.2.3", "ref-cast", @@ -7762,7 +7762,7 @@ dependencies = [ [[package]] name = "sp-timestamp" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" +source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -7776,7 +7776,7 @@ dependencies = [ [[package]] name = "sp-tracing" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" +source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" dependencies = [ "log 0.4.8", "rental", @@ -7786,7 +7786,7 @@ dependencies = [ [[package]] name = "sp-transaction-pool" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" +source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -7801,7 +7801,7 @@ dependencies = [ [[package]] name = "sp-trie" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" +source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" dependencies = [ "hash-db", "memory-db", @@ -7815,7 +7815,7 @@ dependencies = [ [[package]] name = "sp-utils" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" +source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" dependencies = [ "futures 0.3.5", "futures-core", @@ -7827,7 +7827,7 @@ dependencies = [ [[package]] name = "sp-version" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" +source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" dependencies = [ "impl-serde 0.2.3", "parity-scale-codec", @@ -7839,7 +7839,7 @@ dependencies = [ [[package]] name = "sp-wasm-interface" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" +source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -7979,7 +7979,7 @@ dependencies = [ [[package]] name = "substrate-browser-utils" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" +source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" dependencies = [ "chrono", "clear_on_drop", @@ -8006,7 +8006,7 @@ dependencies = [ [[package]] name = "substrate-build-script-utils" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" +source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" dependencies = [ "platforms", ] @@ -8014,7 +8014,7 @@ dependencies = [ [[package]] name = "substrate-frame-rpc-system" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" +source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" dependencies = [ "frame-system-rpc-runtime-api", "futures 0.3.5", @@ -8037,7 +8037,7 @@ dependencies = [ [[package]] name = "substrate-prometheus-endpoint" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" +source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" dependencies = [ "async-std", "derive_more 0.99.9", @@ -8051,7 +8051,7 @@ dependencies = [ [[package]] name = "substrate-test-client" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" +source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" dependencies = [ "futures 0.1.29", "futures 0.3.5", @@ -8077,7 +8077,7 @@ dependencies = [ [[package]] name = "substrate-test-runtime" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" +source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" dependencies = [ "cfg-if", "frame-executive", @@ -8117,7 +8117,7 @@ dependencies = [ [[package]] name = "substrate-test-runtime-client" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" +source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" dependencies = [ "futures 0.3.5", "parity-scale-codec", @@ -8138,7 +8138,7 @@ dependencies = [ [[package]] name = "substrate-wasm-builder-runner" version = "1.0.6" -source = "git+https://github.com/paritytech/substrate#5fd98a661d5384a00c40d17c08f28265dae729d4" +source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" [[package]] name = "substrate-wasm-builder-runner" @@ -8314,9 +8314,9 @@ dependencies = [ [[package]] name = "sysinfo" -version = "0.14.13" +version = "0.14.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eec476c3d107e7fc2c445e4edc26836c49ba5be0dae74146ee94ecb62759c31d" +checksum = "2983daff11a197c7c406b130579bc362177aa54cf2cc1f34d6ac88fccaa6a5e1" dependencies = [ "cfg-if", "doc-comment", @@ -8364,7 +8364,7 @@ dependencies = [ [[package]] name = "test-parachain-adder" -version = "0.8.18" +version = "0.8.19" dependencies = [ "dlmalloc", "parity-scale-codec", @@ -8405,7 +8405,7 @@ dependencies = [ [[package]] name = "test-parachain-halt" -version = "0.8.18" +version = "0.8.19" dependencies = [ "substrate-wasm-builder-runner 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -9344,7 +9344,7 @@ dependencies = [ [[package]] name = "westend-runtime" -version = "0.8.18" +version = "0.8.19" dependencies = [ "bitvec", "frame-benchmarking", diff --git a/Cargo.toml b/Cargo.toml index b7f45d5d26..4d6b40feb7 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,7 +4,7 @@ path = "src/main.rs" [package] name = "polkadot" -version = "0.8.18" +version = "0.8.19" authors = ["Parity Technologies "] edition = "2018" diff --git a/availability-store/Cargo.toml b/availability-store/Cargo.toml index d91a1f115a..62e0632468 100644 --- a/availability-store/Cargo.toml +++ b/availability-store/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "polkadot-availability-store" description = "Persistent database for parachain data" -version = "0.8.18" +version = "0.8.19" authors = ["Parity Technologies "] edition = "2018" diff --git a/cli/Cargo.toml b/cli/Cargo.toml index c2951cc8d5..fd0b0231e0 100644 --- a/cli/Cargo.toml +++ b/cli/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-cli" -version = "0.8.18" +version = "0.8.19" authors = ["Parity Technologies "] description = "Polkadot Relay-chain Client Node" edition = "2018" diff --git a/collator/Cargo.toml b/collator/Cargo.toml index 1917b20380..31f4ec1ca3 100644 --- a/collator/Cargo.toml +++ b/collator/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-collator" -version = "0.8.18" +version = "0.8.19" authors = ["Parity Technologies "] description = "Collator node implementation" edition = "2018" diff --git a/erasure-coding/Cargo.toml b/erasure-coding/Cargo.toml index 2f702f37fd..bbb929c087 100644 --- a/erasure-coding/Cargo.toml +++ b/erasure-coding/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-erasure-coding" -version = "0.8.18" +version = "0.8.19" authors = ["Parity Technologies "] edition = "2018" diff --git a/network/Cargo.toml b/network/Cargo.toml index 51b9de4728..6ded8b7304 100644 --- a/network/Cargo.toml +++ b/network/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-network" -version = "0.8.18" +version = "0.8.19" authors = ["Parity Technologies "] description = "Polkadot-specific networking protocol" edition = "2018" diff --git a/network/test/Cargo.toml b/network/test/Cargo.toml index 239838c31a..69f5a96f3c 100644 --- a/network/test/Cargo.toml +++ b/network/test/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-network-test" -version = "0.8.18" +version = "0.8.19" license = "GPL-3.0" authors = ["Parity Technologies "] edition = "2018" diff --git a/parachain/Cargo.toml b/parachain/Cargo.toml index afd1110adc..312c633fc1 100644 --- a/parachain/Cargo.toml +++ b/parachain/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-parachain" -version = "0.8.18" +version = "0.8.19" authors = ["Parity Technologies "] description = "Types and utilities for creating and working with parachains" edition = "2018" diff --git a/parachain/test-parachains/adder/Cargo.toml b/parachain/test-parachains/adder/Cargo.toml index 372832c831..677d17f04c 100644 --- a/parachain/test-parachains/adder/Cargo.toml +++ b/parachain/test-parachains/adder/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "test-parachain-adder" -version = "0.8.18" +version = "0.8.19" authors = ["Parity Technologies "] description = "Test parachain which adds to a number as its state transition" edition = "2018" diff --git a/parachain/test-parachains/halt/Cargo.toml b/parachain/test-parachains/halt/Cargo.toml index 14acf0ecba..892f82273d 100644 --- a/parachain/test-parachains/halt/Cargo.toml +++ b/parachain/test-parachains/halt/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "test-parachain-halt" -version = "0.8.18" +version = "0.8.19" authors = ["Parity Technologies "] description = "Test parachain which executes forever" edition = "2018" diff --git a/primitives/Cargo.toml b/primitives/Cargo.toml index 3a8373f2e3..0828185f0f 100644 --- a/primitives/Cargo.toml +++ b/primitives/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-primitives" -version = "0.8.18" +version = "0.8.19" authors = ["Parity Technologies "] edition = "2018" diff --git a/rpc/Cargo.toml b/rpc/Cargo.toml index 96da1db65c..fa21bffc25 100644 --- a/rpc/Cargo.toml +++ b/rpc/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-rpc" -version = "0.8.18" +version = "0.8.19" authors = ["Parity Technologies "] edition = "2018" diff --git a/runtime/common/Cargo.toml b/runtime/common/Cargo.toml index 83ec53f44c..612cdcd2c9 100644 --- a/runtime/common/Cargo.toml +++ b/runtime/common/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-runtime-common" -version = "0.8.18" +version = "0.8.19" authors = ["Parity Technologies "] edition = "2018" diff --git a/runtime/kusama/Cargo.toml b/runtime/kusama/Cargo.toml index 43526f13fd..021687e65b 100644 --- a/runtime/kusama/Cargo.toml +++ b/runtime/kusama/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "kusama-runtime" -version = "0.8.18" +version = "0.8.19" authors = ["Parity Technologies "] edition = "2018" build = "build.rs" diff --git a/runtime/polkadot/Cargo.toml b/runtime/polkadot/Cargo.toml index fc1c53ad28..baa420b61f 100644 --- a/runtime/polkadot/Cargo.toml +++ b/runtime/polkadot/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-runtime" -version = "0.8.18" +version = "0.8.19" authors = ["Parity Technologies "] edition = "2018" build = "build.rs" diff --git a/runtime/test-runtime/Cargo.toml b/runtime/test-runtime/Cargo.toml index 201ba2debc..8b66f60121 100644 --- a/runtime/test-runtime/Cargo.toml +++ b/runtime/test-runtime/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-test-runtime" -version = "0.8.18" +version = "0.8.19" authors = ["Parity Technologies "] edition = "2018" build = "build.rs" diff --git a/runtime/westend/Cargo.toml b/runtime/westend/Cargo.toml index 78e74644af..3049921321 100644 --- a/runtime/westend/Cargo.toml +++ b/runtime/westend/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "westend-runtime" -version = "0.8.18" +version = "0.8.19" authors = ["Parity Technologies "] edition = "2018" build = "build.rs" diff --git a/service/Cargo.toml b/service/Cargo.toml index 13eeff889d..0f2674703b 100644 --- a/service/Cargo.toml +++ b/service/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-service" -version = "0.8.18" +version = "0.8.19" authors = ["Parity Technologies "] edition = "2018" diff --git a/statement-table/Cargo.toml b/statement-table/Cargo.toml index 9a5fd9d572..f06d12deab 100644 --- a/statement-table/Cargo.toml +++ b/statement-table/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-statement-table" -version = "0.8.18" +version = "0.8.19" authors = ["Parity Technologies "] edition = "2018" diff --git a/validation/Cargo.toml b/validation/Cargo.toml index ea98e24dfc..ab7f539d23 100644 --- a/validation/Cargo.toml +++ b/validation/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-validation" -version = "0.8.18" +version = "0.8.19" authors = ["Parity Technologies "] edition = "2018" -- GitLab From 11fabd12072bb651a8cbd3157bb4dabff364950d Mon Sep 17 00:00:00 2001 From: Fedor Sakharov Date: Wed, 22 Jul 2020 21:21:20 +0300 Subject: [PATCH 092/192] Dont bring down the node if validation has failed (#1454) --- node/core/backing/src/lib.rs | 83 +++++++++++++++++++++++++++++++++++- 1 file changed, 82 insertions(+), 1 deletion(-) diff --git a/node/core/backing/src/lib.rs b/node/core/backing/src/lib.rs index 3dd31e5e48..3d5440968d 100644 --- a/node/core/backing/src/lib.rs +++ b/node/core/backing/src/lib.rs @@ -439,7 +439,11 @@ impl CandidateBackingJob { } CandidateBackingMessage::Statement(_, statement) => { self.check_statement_signature(&statement)?; - self.maybe_validate_and_import(statement).await?; + match self.maybe_validate_and_import(statement).await { + Err(Error::ValidationFailed(_)) => return Ok(()), + Err(e) => return Err(e), + Ok(()) => (), + } } CandidateBackingMessage::GetBackedCandidates(_, tx) => { let backed = self.get_backed(); @@ -1611,4 +1615,81 @@ mod tests { ); }); } + + // That that if the validation of the candidate has failed this does not stop + // the work of this subsystem and so it is not fatal to the node. + #[test] + fn backing_works_after_failed_validation() { + let test_state = TestState::default(); + test_harness(test_state.keystore.clone(), |test_harness| async move { + let TestHarness { mut virtual_overseer } = test_harness; + + test_startup(&mut virtual_overseer, &test_state).await; + + let pov = PoV { + block_data: BlockData(vec![42, 43, 44]), + }; + + let pov_hash = pov.hash(); + + let candidate = TestCandidateBuilder { + para_id: test_state.chain_ids[0], + relay_parent: test_state.relay_parent, + pov_hash, + erasure_root: make_erasure_root(&test_state, pov.clone()), + ..Default::default() + }.build(); + + let signed_a = SignedFullStatement::sign( + Statement::Seconded(candidate.clone()), + &test_state.signing_context, + 2, + &test_state.validators[2].pair().into(), + ); + + // Send in a `Statement` with a candidate. + let statement = CandidateBackingMessage::Statement( + test_state.relay_parent, + signed_a.clone(), + ); + + virtual_overseer.send(FromOverseer::Communication{ msg: statement }).await; + + // Subsystem requests PoV and requests validation. + assert_matches!( + virtual_overseer.recv().await, + AllMessages::PoVDistribution( + PoVDistributionMessage::FetchPoV(relay_parent, _, tx) + ) => { + assert_eq!(relay_parent, test_state.relay_parent); + tx.send(Arc::new(pov.clone())).unwrap(); + } + ); + + // Tell subsystem that this candidate is invalid. + assert_matches!( + virtual_overseer.recv().await, + AllMessages::CandidateValidation( + CandidateValidationMessage::ValidateFromChainState( + c, + pov, + tx, + ) + ) if pov == pov && &c == candidate.descriptor() => { + tx.send(Err(ValidationFailed)).unwrap(); + } + ); + + // Try to get a set of backable candidates to trigger _some_ action in the subsystem + // and check that it is still alive. + let (tx, rx) = oneshot::channel(); + let msg = CandidateBackingMessage::GetBackedCandidates( + test_state.relay_parent, + tx, + ); + + virtual_overseer.send(FromOverseer::Communication{ msg }).await; + assert_eq!(rx.await.unwrap().len(), 0); + }); + } } -- GitLab From fe00c791184ad311287b20e8fb7f9e0cd2d54315 Mon Sep 17 00:00:00 2001 From: Ashley Date: Thu, 23 Jul 2020 14:12:53 +0200 Subject: [PATCH 093/192] Companion PR for `Remove the service builder` (#1448) * Switch branch * Update branch * Change service code * Change light service stuff to be functions ^_^ * Update substrate branch * Remove accidental 'f' * Rework LightBackend/LightClient types * Update substrate branch * Remove unused imports in test-service * Add #[cfg(feature = full-node)] --- Cargo.lock | 583 +++++++++--------- node/service/src/lib.rs | 858 ++++++++++++++------------- node/test-service/src/lib.rs | 28 +- service/src/lib.rs | 1082 ++++++++++++++++------------------ 4 files changed, 1236 insertions(+), 1315 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 1aa1be6491..4b7393a17e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -637,15 +637,6 @@ dependencies = [ "vec_map", ] -[[package]] -name = "clear_on_drop" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9cc5db465b294c3fa986d5bbb0f3017cd850bff6dd6c52f9ccff8b4d21b7b08" -dependencies = [ - "cc", -] - [[package]] name = "cloudabi" version = "0.0.3" @@ -734,25 +725,23 @@ checksum = "6d375c433320f6c5057ae04a04376eef4d04ce2801448cf8863a78da99107be4" [[package]] name = "cranelift-bforest" -version = "0.63.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4425bb6c3f3d2f581c650f1a1fdd3196a975490149cf59bea9d34c3bea79eda" +version = "0.66.0" +source = "git+https://github.com/paritytech/wasmtime?branch=update-upstream#f744c4e564b40a4cfce6a7090f093ec1726c68e9" dependencies = [ "cranelift-entity", ] [[package]] name = "cranelift-codegen" -version = "0.63.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d166b289fd30062ee6de86284750fc3fe5d037c6b864b3326ce153239b0626e1" +version = "0.66.0" +source = "git+https://github.com/paritytech/wasmtime?branch=update-upstream#f744c4e564b40a4cfce6a7090f093ec1726c68e9" dependencies = [ "byteorder", "cranelift-bforest", "cranelift-codegen-meta", "cranelift-codegen-shared", "cranelift-entity", - "gimli 0.20.0", + "gimli 0.21.0", "log 0.4.8", "regalloc", "serde", @@ -763,9 +752,8 @@ dependencies = [ [[package]] name = "cranelift-codegen-meta" -version = "0.63.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02c9fb2306a36d41c5facd4bf3400bc6c157185c43a96eaaa503471c34c5144b" +version = "0.66.0" +source = "git+https://github.com/paritytech/wasmtime?branch=update-upstream#f744c4e564b40a4cfce6a7090f093ec1726c68e9" dependencies = [ "cranelift-codegen-shared", "cranelift-entity", @@ -773,24 +761,21 @@ dependencies = [ [[package]] name = "cranelift-codegen-shared" -version = "0.63.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44e0cfe9b1f97d9f836bca551618106c7d53b93b579029ecd38e73daa7eb689e" +version = "0.66.0" +source = "git+https://github.com/paritytech/wasmtime?branch=update-upstream#f744c4e564b40a4cfce6a7090f093ec1726c68e9" [[package]] name = "cranelift-entity" -version = "0.63.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "926a73c432e5ba9c891171ff50b75e7d992cd76cd271f0a0a0ba199138077472" +version = "0.66.0" +source = "git+https://github.com/paritytech/wasmtime?branch=update-upstream#f744c4e564b40a4cfce6a7090f093ec1726c68e9" dependencies = [ "serde", ] [[package]] name = "cranelift-frontend" -version = "0.63.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e45f82e3446dd1ebb8c2c2f6a6b0e6cd6cd52965c7e5f7b1b35e9a9ace31ccde" +version = "0.66.0" +source = "git+https://github.com/paritytech/wasmtime?branch=update-upstream#f744c4e564b40a4cfce6a7090f093ec1726c68e9" dependencies = [ "cranelift-codegen", "log 0.4.8", @@ -800,9 +785,8 @@ dependencies = [ [[package]] name = "cranelift-native" -version = "0.63.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "488b5d481bb0996a143e55a9d1739ef425efa20d4a5e5e98c859a8573c9ead9a" +version = "0.66.0" +source = "git+https://github.com/paritytech/wasmtime?branch=update-upstream#f744c4e564b40a4cfce6a7090f093ec1726c68e9" dependencies = [ "cranelift-codegen", "raw-cpuid", @@ -811,9 +795,8 @@ dependencies = [ [[package]] name = "cranelift-wasm" -version = "0.63.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00aa8dde71fd9fdb1958e7b0ef8f524c1560e2c6165e4ea54bc302b40551c161" +version = "0.66.0" +source = "git+https://github.com/paritytech/wasmtime?branch=update-upstream#f744c4e564b40a4cfce6a7090f093ec1726c68e9" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -821,7 +804,7 @@ dependencies = [ "log 0.4.8", "serde", "thiserror", - "wasmparser 0.51.4", + "wasmparser 0.59.0", ] [[package]] @@ -1181,21 +1164,6 @@ dependencies = [ "futures 0.3.5", ] -[[package]] -name = "faerie" -version = "0.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfef65b0e94693295c5d2fe2506f0ee6f43465342d4b5331659936aee8b16084" -dependencies = [ - "goblin", - "indexmap", - "log 0.4.8", - "scroll", - "string-interner", - "target-lexicon", - "thiserror", -] - [[package]] name = "failure" version = "0.1.8" @@ -1325,7 +1293,7 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "fork-tree" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" +source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" dependencies = [ "parity-scale-codec", ] @@ -1333,7 +1301,7 @@ dependencies = [ [[package]] name = "frame-benchmarking" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" +source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" dependencies = [ "frame-support", "frame-system", @@ -1350,7 +1318,7 @@ dependencies = [ [[package]] name = "frame-benchmarking-cli" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" +source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" dependencies = [ "Inflector", "frame-benchmarking", @@ -1369,7 +1337,7 @@ dependencies = [ [[package]] name = "frame-executive" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" +source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" dependencies = [ "frame-support", "frame-system", @@ -1384,7 +1352,7 @@ dependencies = [ [[package]] name = "frame-metadata" version = "11.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" +source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" dependencies = [ "parity-scale-codec", "serde", @@ -1395,7 +1363,7 @@ dependencies = [ [[package]] name = "frame-support" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" +source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" dependencies = [ "bitmask", "frame-metadata", @@ -1420,7 +1388,7 @@ dependencies = [ [[package]] name = "frame-support-procedural" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" +source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" dependencies = [ "frame-support-procedural-tools", "proc-macro2 1.0.18", @@ -1431,7 +1399,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" +source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" dependencies = [ "frame-support-procedural-tools-derive", "proc-macro-crate", @@ -1443,7 +1411,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools-derive" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" +source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" dependencies = [ "proc-macro2 1.0.18", "quote 1.0.7", @@ -1453,7 +1421,7 @@ dependencies = [ [[package]] name = "frame-system" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" +source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" dependencies = [ "frame-support", "impl-trait-for-tuples", @@ -1469,7 +1437,7 @@ dependencies = [ [[package]] name = "frame-system-benchmarking" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" +source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" dependencies = [ "frame-benchmarking", "frame-support", @@ -1483,7 +1451,7 @@ dependencies = [ [[package]] name = "frame-system-rpc-runtime-api" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" +source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" dependencies = [ "parity-scale-codec", "sp-api", @@ -1796,15 +1764,12 @@ dependencies = [ [[package]] name = "gimli" -version = "0.20.0" +version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81dd6190aad0f05ddbbf3245c54ed14ca4aa6dd32f22312b70d8f168c3e3e633" +checksum = "bcc8e0c9bce37868955864dbecd2b1ab2bdf967e6f28066d65aaac620444b65c" dependencies = [ - "arrayvec 0.5.1", - "byteorder", "fallible-iterator", "indexmap", - "smallvec 1.4.1", "stable_deref_trait", ] @@ -1846,17 +1811,6 @@ dependencies = [ "web-sys", ] -[[package]] -name = "goblin" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3081214398d39e4bd7f2c1975f0488ed04614ffdd976c6fc7a0708278552c0da" -dependencies = [ - "log 0.4.8", - "plain", - "scroll", -] - [[package]] name = "h2" version = "0.1.26" @@ -2191,6 +2145,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c398b2b113b55809ceb9ee3e753fcbac793f1956663f3c36549c1346015c2afe" dependencies = [ "autocfg 1.0.0", + "serde", ] [[package]] @@ -3426,18 +3381,20 @@ dependencies = [ [[package]] name = "object" -version = "0.18.0" +version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5666bbb90bc4d1e5bdcb26c0afda1822d25928341e9384ab187a9b37ab69e36" -dependencies = [ - "target-lexicon", -] +checksum = "9cbca9424c482ee628fa549d9c812e2cd22f1180b9222c9200fdfa6eb31aecb2" [[package]] name = "object" version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1ab52be62400ca80aa00285d25253d7f7c437b7375c4de678f5405d3afe82ca5" +dependencies = [ + "crc32fast", + "indexmap", + "wasmparser 0.57.0", +] [[package]] name = "once_cell" @@ -3478,7 +3435,7 @@ dependencies = [ [[package]] name = "pallet-authority-discovery" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" +source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" dependencies = [ "frame-support", "frame-system", @@ -3494,7 +3451,7 @@ dependencies = [ [[package]] name = "pallet-authorship" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" +source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" dependencies = [ "frame-support", "frame-system", @@ -3509,7 +3466,7 @@ dependencies = [ [[package]] name = "pallet-babe" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" +source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" dependencies = [ "frame-benchmarking", "frame-support", @@ -3534,7 +3491,7 @@ dependencies = [ [[package]] name = "pallet-balances" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" +source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" dependencies = [ "frame-benchmarking", "frame-support", @@ -3548,7 +3505,7 @@ dependencies = [ [[package]] name = "pallet-collective" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" +source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" dependencies = [ "frame-benchmarking", "frame-support", @@ -3564,7 +3521,7 @@ dependencies = [ [[package]] name = "pallet-democracy" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" +source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" dependencies = [ "frame-benchmarking", "frame-support", @@ -3579,7 +3536,7 @@ dependencies = [ [[package]] name = "pallet-elections-phragmen" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" +source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" dependencies = [ "frame-benchmarking", "frame-support", @@ -3594,7 +3551,7 @@ dependencies = [ [[package]] name = "pallet-finality-tracker" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" +source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" dependencies = [ "frame-support", "frame-system", @@ -3610,7 +3567,7 @@ dependencies = [ [[package]] name = "pallet-grandpa" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" +source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" dependencies = [ "frame-benchmarking", "frame-support", @@ -3632,7 +3589,7 @@ dependencies = [ [[package]] name = "pallet-identity" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" +source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" dependencies = [ "enumflags2", "frame-benchmarking", @@ -3648,7 +3605,7 @@ dependencies = [ [[package]] name = "pallet-im-online" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" +source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" dependencies = [ "frame-benchmarking", "frame-support", @@ -3668,7 +3625,7 @@ dependencies = [ [[package]] name = "pallet-indices" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" +source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" dependencies = [ "frame-support", "frame-system", @@ -3684,7 +3641,7 @@ dependencies = [ [[package]] name = "pallet-membership" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" +source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" dependencies = [ "frame-support", "frame-system", @@ -3698,7 +3655,7 @@ dependencies = [ [[package]] name = "pallet-multisig" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" +source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" dependencies = [ "frame-support", "frame-system", @@ -3713,7 +3670,7 @@ dependencies = [ [[package]] name = "pallet-nicks" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" +source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" dependencies = [ "frame-support", "frame-system", @@ -3727,7 +3684,7 @@ dependencies = [ [[package]] name = "pallet-offences" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" +source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" dependencies = [ "frame-support", "frame-system", @@ -3742,7 +3699,7 @@ dependencies = [ [[package]] name = "pallet-offences-benchmarking" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" +source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" dependencies = [ "frame-benchmarking", "frame-support", @@ -3763,7 +3720,7 @@ dependencies = [ [[package]] name = "pallet-proxy" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" +source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" dependencies = [ "frame-support", "frame-system", @@ -3778,7 +3735,7 @@ dependencies = [ [[package]] name = "pallet-randomness-collective-flip" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" +source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" dependencies = [ "frame-support", "frame-system", @@ -3791,7 +3748,7 @@ dependencies = [ [[package]] name = "pallet-recovery" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" +source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" dependencies = [ "enumflags2", "frame-support", @@ -3806,7 +3763,7 @@ dependencies = [ [[package]] name = "pallet-scheduler" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" +source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" dependencies = [ "frame-benchmarking", "frame-support", @@ -3821,7 +3778,7 @@ dependencies = [ [[package]] name = "pallet-session" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" +source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" dependencies = [ "frame-support", "frame-system", @@ -3841,7 +3798,7 @@ dependencies = [ [[package]] name = "pallet-session-benchmarking" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" +source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" dependencies = [ "frame-benchmarking", "frame-support", @@ -3857,7 +3814,7 @@ dependencies = [ [[package]] name = "pallet-society" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" +source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" dependencies = [ "frame-support", "frame-system", @@ -3871,7 +3828,7 @@ dependencies = [ [[package]] name = "pallet-staking" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" +source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" dependencies = [ "frame-benchmarking", "frame-support", @@ -3893,7 +3850,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-curve" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" +source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -3904,7 +3861,7 @@ dependencies = [ [[package]] name = "pallet-sudo" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" +source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" dependencies = [ "frame-support", "frame-system", @@ -3918,7 +3875,7 @@ dependencies = [ [[package]] name = "pallet-timestamp" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" +source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" dependencies = [ "frame-benchmarking", "frame-support", @@ -3936,7 +3893,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" +source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" dependencies = [ "frame-support", "frame-system", @@ -3953,7 +3910,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" +source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" dependencies = [ "jsonrpc-core", "jsonrpc-core-client", @@ -3971,7 +3928,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc-runtime-api" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" +source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" dependencies = [ "frame-support", "parity-scale-codec", @@ -3984,7 +3941,7 @@ dependencies = [ [[package]] name = "pallet-treasury" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" +source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" dependencies = [ "frame-benchmarking", "frame-support", @@ -3999,7 +3956,7 @@ dependencies = [ [[package]] name = "pallet-utility" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" +source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" dependencies = [ "frame-benchmarking", "frame-support", @@ -4015,7 +3972,7 @@ dependencies = [ [[package]] name = "pallet-vesting" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" +source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" dependencies = [ "enumflags2", "frame-benchmarking", @@ -4300,12 +4257,6 @@ version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "05da548ad6865900e60eaba7f589cc0783590a92e940c26953ff81ddbab2d677" -[[package]] -name = "plain" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6" - [[package]] name = "platforms" version = "0.2.1" @@ -5731,9 +5682,9 @@ dependencies = [ [[package]] name = "regalloc" -version = "0.0.21" +version = "0.0.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b27b256b41986ac5141b37b8bbba85d314fbf546c182eb255af6720e07e4f804" +checksum = "3598bed0895fe0f72a9e0b00ef9e3a3c8af978a8401b2f2046dec5927de6364a" dependencies = [ "log 0.4.8", "rustc-hash", @@ -5946,7 +5897,7 @@ dependencies = [ [[package]] name = "sc-authority-discovery" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" +source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" dependencies = [ "bytes 0.5.5", "derive_more 0.99.9", @@ -5973,7 +5924,7 @@ dependencies = [ [[package]] name = "sc-basic-authorship" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" +source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -5997,7 +5948,7 @@ dependencies = [ [[package]] name = "sc-block-builder" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" +source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" dependencies = [ "parity-scale-codec", "sc-client-api", @@ -6014,7 +5965,7 @@ dependencies = [ [[package]] name = "sc-chain-spec" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" +source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" dependencies = [ "impl-trait-for-tuples", "sc-chain-spec-derive", @@ -6030,7 +5981,7 @@ dependencies = [ [[package]] name = "sc-chain-spec-derive" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" +source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -6041,7 +5992,7 @@ dependencies = [ [[package]] name = "sc-cli" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" +source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" dependencies = [ "ansi_term 0.12.1", "atty", @@ -6082,7 +6033,7 @@ dependencies = [ [[package]] name = "sc-client-api" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" +source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" dependencies = [ "derive_more 0.99.9", "fnv", @@ -6118,7 +6069,7 @@ dependencies = [ [[package]] name = "sc-client-db" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" +source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" dependencies = [ "blake2-rfc", "hash-db", @@ -6147,7 +6098,7 @@ dependencies = [ [[package]] name = "sc-consensus" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" +source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" dependencies = [ "sc-client-api", "sp-blockchain", @@ -6158,7 +6109,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" +source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" dependencies = [ "derive_more 0.99.9", "fork-tree", @@ -6200,7 +6151,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe-rpc" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" +source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -6224,7 +6175,7 @@ dependencies = [ [[package]] name = "sc-consensus-epochs" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" +source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" dependencies = [ "fork-tree", "parity-scale-codec", @@ -6237,7 +6188,7 @@ dependencies = [ [[package]] name = "sc-consensus-slots" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" +source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6260,7 +6211,7 @@ dependencies = [ [[package]] name = "sc-consensus-uncles" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" +source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" dependencies = [ "log 0.4.8", "sc-client-api", @@ -6274,7 +6225,7 @@ dependencies = [ [[package]] name = "sc-executor" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" +source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" dependencies = [ "derive_more 0.99.9", "lazy_static", @@ -6302,7 +6253,7 @@ dependencies = [ [[package]] name = "sc-executor-common" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" +source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" dependencies = [ "derive_more 0.99.9", "log 0.4.8", @@ -6319,7 +6270,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmi" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" +source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" dependencies = [ "log 0.4.8", "parity-scale-codec", @@ -6334,7 +6285,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmtime" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" +source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" dependencies = [ "cranelift-codegen", "cranelift-wasm", @@ -6348,14 +6299,14 @@ dependencies = [ "sp-runtime-interface", "sp-wasm-interface", "substrate-wasmtime", - "substrate-wasmtime-runtime", "wasmtime-environ", + "wasmtime-runtime", ] [[package]] name = "sc-finality-grandpa" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" +source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" dependencies = [ "assert_matches", "derive_more 0.99.9", @@ -6393,7 +6344,7 @@ dependencies = [ [[package]] name = "sc-finality-grandpa-rpc" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" +source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" dependencies = [ "derive_more 0.99.9", "finality-grandpa", @@ -6410,7 +6361,7 @@ dependencies = [ [[package]] name = "sc-informant" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" +source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" dependencies = [ "ansi_term 0.12.1", "futures 0.3.5", @@ -6428,7 +6379,7 @@ dependencies = [ [[package]] name = "sc-keystore" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" +source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" dependencies = [ "derive_more 0.99.9", "hex", @@ -6444,7 +6395,7 @@ dependencies = [ [[package]] name = "sc-light" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" +source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" dependencies = [ "hash-db", "lazy_static", @@ -6463,7 +6414,7 @@ dependencies = [ [[package]] name = "sc-network" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" +source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" dependencies = [ "bitflags", "bs58", @@ -6515,7 +6466,7 @@ dependencies = [ [[package]] name = "sc-network-gossip" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" +source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6530,7 +6481,7 @@ dependencies = [ [[package]] name = "sc-network-test" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" +source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" dependencies = [ "env_logger", "futures 0.3.5", @@ -6557,7 +6508,7 @@ dependencies = [ [[package]] name = "sc-offchain" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" +source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" dependencies = [ "bytes 0.5.5", "fnv", @@ -6584,7 +6535,7 @@ dependencies = [ [[package]] name = "sc-peerset" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" +source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" dependencies = [ "futures 0.3.5", "libp2p", @@ -6597,7 +6548,7 @@ dependencies = [ [[package]] name = "sc-proposer-metrics" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" +source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" dependencies = [ "log 0.4.8", "substrate-prometheus-endpoint", @@ -6606,7 +6557,7 @@ dependencies = [ [[package]] name = "sc-rpc" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" +source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" dependencies = [ "futures 0.3.5", "hash-db", @@ -6638,7 +6589,7 @@ dependencies = [ [[package]] name = "sc-rpc-api" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" +source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -6662,7 +6613,7 @@ dependencies = [ [[package]] name = "sc-rpc-server" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" +source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" dependencies = [ "jsonrpc-core", "jsonrpc-http-server", @@ -6678,7 +6629,7 @@ dependencies = [ [[package]] name = "sc-service" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" +source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" dependencies = [ "derive_more 0.99.9", "directories", @@ -6740,7 +6691,7 @@ dependencies = [ [[package]] name = "sc-state-db" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" +source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" dependencies = [ "log 0.4.8", "parity-scale-codec", @@ -6754,7 +6705,7 @@ dependencies = [ [[package]] name = "sc-telemetry" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" +source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6775,7 +6726,7 @@ dependencies = [ [[package]] name = "sc-tracing" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" +source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" dependencies = [ "erased-serde", "log 0.4.8", @@ -6792,7 +6743,7 @@ dependencies = [ [[package]] name = "sc-transaction-graph" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" +source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -6813,7 +6764,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" +source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -7245,7 +7196,7 @@ dependencies = [ [[package]] name = "sp-allocator" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" +source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" dependencies = [ "derive_more 0.99.9", "log 0.4.8", @@ -7257,7 +7208,7 @@ dependencies = [ [[package]] name = "sp-api" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" +source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" dependencies = [ "hash-db", "parity-scale-codec", @@ -7272,7 +7223,7 @@ dependencies = [ [[package]] name = "sp-api-proc-macro" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" +source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" dependencies = [ "blake2-rfc", "proc-macro-crate", @@ -7284,7 +7235,7 @@ dependencies = [ [[package]] name = "sp-application-crypto" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" +source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" dependencies = [ "parity-scale-codec", "serde", @@ -7296,7 +7247,7 @@ dependencies = [ [[package]] name = "sp-arithmetic" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" +source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" dependencies = [ "integer-sqrt", "num-traits 0.2.12", @@ -7309,7 +7260,7 @@ dependencies = [ [[package]] name = "sp-authority-discovery" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" +source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" dependencies = [ "parity-scale-codec", "sp-api", @@ -7321,7 +7272,7 @@ dependencies = [ [[package]] name = "sp-authorship" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" +source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" dependencies = [ "parity-scale-codec", "sp-inherents", @@ -7332,7 +7283,7 @@ dependencies = [ [[package]] name = "sp-block-builder" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" +source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" dependencies = [ "parity-scale-codec", "sp-api", @@ -7344,7 +7295,7 @@ dependencies = [ [[package]] name = "sp-blockchain" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" +source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" dependencies = [ "derive_more 0.99.9", "log 0.4.8", @@ -7361,7 +7312,7 @@ dependencies = [ [[package]] name = "sp-chain-spec" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" +source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" dependencies = [ "serde", "serde_json", @@ -7370,7 +7321,7 @@ dependencies = [ [[package]] name = "sp-consensus" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" +source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -7395,7 +7346,7 @@ dependencies = [ [[package]] name = "sp-consensus-aura" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" +source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" dependencies = [ "parity-scale-codec", "sp-api", @@ -7409,7 +7360,7 @@ dependencies = [ [[package]] name = "sp-consensus-babe" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" +source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" dependencies = [ "merlin", "parity-scale-codec", @@ -7428,7 +7379,7 @@ dependencies = [ [[package]] name = "sp-consensus-slots" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" +source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" dependencies = [ "parity-scale-codec", "sp-runtime", @@ -7437,7 +7388,7 @@ dependencies = [ [[package]] name = "sp-consensus-vrf" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" +source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" dependencies = [ "parity-scale-codec", "schnorrkel", @@ -7449,7 +7400,7 @@ dependencies = [ [[package]] name = "sp-core" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" +source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" dependencies = [ "base58", "blake2-rfc", @@ -7492,7 +7443,7 @@ dependencies = [ [[package]] name = "sp-database" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" +source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" dependencies = [ "kvdb", "parking_lot 0.10.2", @@ -7501,7 +7452,7 @@ dependencies = [ [[package]] name = "sp-debug-derive" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" +source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" dependencies = [ "proc-macro2 1.0.18", "quote 1.0.7", @@ -7511,7 +7462,7 @@ dependencies = [ [[package]] name = "sp-externalities" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" +source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" dependencies = [ "environmental", "parity-scale-codec", @@ -7522,7 +7473,7 @@ dependencies = [ [[package]] name = "sp-finality-grandpa" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" +source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" dependencies = [ "finality-grandpa", "log 0.4.8", @@ -7538,7 +7489,7 @@ dependencies = [ [[package]] name = "sp-finality-tracker" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" +source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" dependencies = [ "parity-scale-codec", "sp-inherents", @@ -7548,7 +7499,7 @@ dependencies = [ [[package]] name = "sp-inherents" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" +source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" dependencies = [ "derive_more 0.99.9", "parity-scale-codec", @@ -7560,7 +7511,7 @@ dependencies = [ [[package]] name = "sp-io" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" +source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" dependencies = [ "futures 0.3.5", "hash-db", @@ -7581,7 +7532,7 @@ dependencies = [ [[package]] name = "sp-keyring" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" +source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" dependencies = [ "lazy_static", "sp-core", @@ -7592,7 +7543,7 @@ dependencies = [ [[package]] name = "sp-npos-elections" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" +source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" dependencies = [ "parity-scale-codec", "serde", @@ -7604,7 +7555,7 @@ dependencies = [ [[package]] name = "sp-npos-elections-compact" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" +source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -7615,7 +7566,7 @@ dependencies = [ [[package]] name = "sp-offchain" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" +source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" dependencies = [ "sp-api", "sp-core", @@ -7625,7 +7576,7 @@ dependencies = [ [[package]] name = "sp-panic-handler" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" +source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" dependencies = [ "backtrace", "log 0.4.8", @@ -7634,7 +7585,7 @@ dependencies = [ [[package]] name = "sp-rpc" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" +source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" dependencies = [ "serde", "sp-core", @@ -7643,7 +7594,7 @@ dependencies = [ [[package]] name = "sp-runtime" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" +source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" dependencies = [ "either", "hash256-std-hasher", @@ -7665,7 +7616,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" +source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" dependencies = [ "parity-scale-codec", "primitive-types", @@ -7680,7 +7631,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" +source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" dependencies = [ "Inflector", "proc-macro-crate", @@ -7692,7 +7643,7 @@ dependencies = [ [[package]] name = "sp-serializer" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" +source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" dependencies = [ "serde", "serde_json", @@ -7701,7 +7652,7 @@ dependencies = [ [[package]] name = "sp-session" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" +source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" dependencies = [ "parity-scale-codec", "sp-api", @@ -7714,7 +7665,7 @@ dependencies = [ [[package]] name = "sp-staking" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" +source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" dependencies = [ "parity-scale-codec", "sp-runtime", @@ -7724,7 +7675,7 @@ dependencies = [ [[package]] name = "sp-state-machine" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" +source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" dependencies = [ "hash-db", "itertools 0.9.0", @@ -7745,12 +7696,12 @@ dependencies = [ [[package]] name = "sp-std" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" +source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" [[package]] name = "sp-storage" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" +source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" dependencies = [ "impl-serde 0.2.3", "ref-cast", @@ -7762,7 +7713,7 @@ dependencies = [ [[package]] name = "sp-timestamp" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" +source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -7776,7 +7727,7 @@ dependencies = [ [[package]] name = "sp-tracing" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" +source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" dependencies = [ "log 0.4.8", "rental", @@ -7786,7 +7737,7 @@ dependencies = [ [[package]] name = "sp-transaction-pool" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" +source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -7801,7 +7752,7 @@ dependencies = [ [[package]] name = "sp-trie" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" +source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" dependencies = [ "hash-db", "memory-db", @@ -7815,7 +7766,7 @@ dependencies = [ [[package]] name = "sp-utils" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" +source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" dependencies = [ "futures 0.3.5", "futures-core", @@ -7827,7 +7778,7 @@ dependencies = [ [[package]] name = "sp-version" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" +source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" dependencies = [ "impl-serde 0.2.3", "parity-scale-codec", @@ -7839,7 +7790,7 @@ dependencies = [ [[package]] name = "sp-wasm-interface" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" +source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -7904,15 +7855,6 @@ dependencies = [ "bytes 0.4.12", ] -[[package]] -name = "string-interner" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd710eadff449a1531351b0e43eb81ea404336fa2f56c777427ab0e32a4cf183" -dependencies = [ - "serde", -] - [[package]] name = "strsim" version = "0.8.0" @@ -7979,10 +7921,9 @@ dependencies = [ [[package]] name = "substrate-browser-utils" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" +source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" dependencies = [ "chrono", - "clear_on_drop", "console_error_panic_hook", "console_log", "futures 0.1.29", @@ -8006,7 +7947,7 @@ dependencies = [ [[package]] name = "substrate-build-script-utils" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" +source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" dependencies = [ "platforms", ] @@ -8014,7 +7955,7 @@ dependencies = [ [[package]] name = "substrate-frame-rpc-system" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" +source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" dependencies = [ "frame-system-rpc-runtime-api", "futures 0.3.5", @@ -8037,7 +7978,7 @@ dependencies = [ [[package]] name = "substrate-prometheus-endpoint" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" +source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" dependencies = [ "async-std", "derive_more 0.99.9", @@ -8051,7 +7992,7 @@ dependencies = [ [[package]] name = "substrate-test-client" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" +source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" dependencies = [ "futures 0.1.29", "futures 0.3.5", @@ -8077,7 +8018,7 @@ dependencies = [ [[package]] name = "substrate-test-runtime" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" +source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" dependencies = [ "cfg-if", "frame-executive", @@ -8117,7 +8058,7 @@ dependencies = [ [[package]] name = "substrate-test-runtime-client" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" +source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" dependencies = [ "futures 0.3.5", "parity-scale-codec", @@ -8138,7 +8079,7 @@ dependencies = [ [[package]] name = "substrate-wasm-builder-runner" version = "1.0.6" -source = "git+https://github.com/paritytech/substrate#065b0f321f223b4cb3b22cee0e71fa6930034e2a" +source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" [[package]] name = "substrate-wasm-builder-runner" @@ -8148,93 +8089,28 @@ checksum = "d2a965994514ab35d3893e9260245f2947fd1981cdd4fffd2c6e6d1a9ce02e6a" [[package]] name = "substrate-wasmtime" -version = "0.16.0-threadsafe.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6bd62264edc1a5f3ef44d86fb0c11c9fb142894b9a2da034f34afae482080d7a" +version = "0.19.0" +source = "git+https://github.com/paritytech/wasmtime?branch=update-upstream#f744c4e564b40a4cfce6a7090f093ec1726c68e9" dependencies = [ "anyhow", "backtrace", "cfg-if", "lazy_static", "libc", + "log 0.4.8", "region", "rustc-demangle", - "substrate-wasmtime-jit", - "substrate-wasmtime-profiling", - "substrate-wasmtime-runtime", + "smallvec 1.4.1", "target-lexicon", - "wasmparser 0.52.2", + "wasmparser 0.59.0", "wasmtime-environ", + "wasmtime-jit", + "wasmtime-profiling", + "wasmtime-runtime", "wat", "winapi 0.3.9", ] -[[package]] -name = "substrate-wasmtime-jit" -version = "0.16.0-threadsafe.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ce43c159d4f3ef6b19641e1ae045847fd202d8e2cc74df7ccb2b6475e069d4a" -dependencies = [ - "anyhow", - "cfg-if", - "cranelift-codegen", - "cranelift-entity", - "cranelift-frontend", - "cranelift-native", - "cranelift-wasm", - "gimli 0.20.0", - "log 0.4.8", - "more-asserts", - "region", - "substrate-wasmtime-profiling", - "substrate-wasmtime-runtime", - "target-lexicon", - "thiserror", - "wasmparser 0.52.2", - "wasmtime-debug", - "wasmtime-environ", - "winapi 0.3.9", -] - -[[package]] -name = "substrate-wasmtime-profiling" -version = "0.16.0-threadsafe.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c77f0ce539b5a09a54dc80a1cf0c7cd7e694df11029354fe50a2d5fe889bdb97" -dependencies = [ - "anyhow", - "cfg-if", - "gimli 0.20.0", - "lazy_static", - "libc", - "object 0.18.0", - "scroll", - "serde", - "substrate-wasmtime-runtime", - "target-lexicon", - "wasmtime-environ", -] - -[[package]] -name = "substrate-wasmtime-runtime" -version = "0.16.0-threadsafe.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46516af0a64a7d9b652c5aa7436b6ce13edfa54435a66ef177fc02d2283e2dc2" -dependencies = [ - "backtrace", - "cc", - "cfg-if", - "indexmap", - "lazy_static", - "libc", - "memoffset", - "more-asserts", - "region", - "thiserror", - "wasmtime-environ", - "winapi 0.3.9", -] - [[package]] name = "subtle" version = "1.0.0" @@ -9222,43 +9098,43 @@ dependencies = [ [[package]] name = "wasmparser" -version = "0.51.4" +version = "0.57.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aeb1956b19469d1c5e63e459d29e7b5aa0f558d9f16fcef09736f8a265e6c10a" +checksum = "32fddd575d477c6e9702484139cf9f23dcd554b06d185ed0f56c857dd3a47aa6" [[package]] name = "wasmparser" -version = "0.52.2" +version = "0.59.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "733954023c0b39602439e60a65126fd31b003196d3a1e8e4531b055165a79b31" +checksum = "a950e6a618f62147fd514ff445b2a0b53120d382751960797f85f058c7eda9b9" [[package]] name = "wasmtime-debug" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d39ba645aee700b29ff0093028b4123556dd142a74973f04ed6225eedb40e77d" +version = "0.19.0" +source = "git+https://github.com/paritytech/wasmtime?branch=update-upstream#f744c4e564b40a4cfce6a7090f093ec1726c68e9" dependencies = [ "anyhow", - "faerie", - "gimli 0.20.0", + "gimli 0.21.0", "more-asserts", + "object 0.20.0", "target-lexicon", "thiserror", - "wasmparser 0.51.4", + "wasmparser 0.59.0", "wasmtime-environ", ] [[package]] name = "wasmtime-environ" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed54fd9d64dfeeee7c285fd126174a6b5e6d4efc7e5a1566fdb635e60ff6a74e" +version = "0.19.0" +source = "git+https://github.com/paritytech/wasmtime?branch=update-upstream#f744c4e564b40a4cfce6a7090f093ec1726c68e9" dependencies = [ "anyhow", "base64 0.12.3", "bincode", + "cfg-if", "cranelift-codegen", "cranelift-entity", + "cranelift-frontend", "cranelift-wasm", "directories", "errno", @@ -9272,11 +9148,90 @@ dependencies = [ "sha2 0.8.2", "thiserror", "toml", - "wasmparser 0.51.4", + "wasmparser 0.59.0", "winapi 0.3.9", "zstd", ] +[[package]] +name = "wasmtime-jit" +version = "0.19.0" +source = "git+https://github.com/paritytech/wasmtime?branch=update-upstream#f744c4e564b40a4cfce6a7090f093ec1726c68e9" +dependencies = [ + "anyhow", + "cfg-if", + "cranelift-codegen", + "cranelift-entity", + "cranelift-frontend", + "cranelift-native", + "cranelift-wasm", + "gimli 0.21.0", + "log 0.4.8", + "more-asserts", + "object 0.20.0", + "region", + "target-lexicon", + "thiserror", + "wasmparser 0.59.0", + "wasmtime-debug", + "wasmtime-environ", + "wasmtime-obj", + "wasmtime-profiling", + "wasmtime-runtime", + "winapi 0.3.9", +] + +[[package]] +name = "wasmtime-obj" +version = "0.19.0" +source = "git+https://github.com/paritytech/wasmtime?branch=update-upstream#f744c4e564b40a4cfce6a7090f093ec1726c68e9" +dependencies = [ + "anyhow", + "more-asserts", + "object 0.20.0", + "target-lexicon", + "wasmtime-debug", + "wasmtime-environ", +] + +[[package]] +name = "wasmtime-profiling" +version = "0.19.0" +source = "git+https://github.com/paritytech/wasmtime?branch=update-upstream#f744c4e564b40a4cfce6a7090f093ec1726c68e9" +dependencies = [ + "anyhow", + "cfg-if", + "gimli 0.21.0", + "lazy_static", + "libc", + "object 0.19.0", + "scroll", + "serde", + "target-lexicon", + "wasmtime-environ", + "wasmtime-runtime", +] + +[[package]] +name = "wasmtime-runtime" +version = "0.19.0" +source = "git+https://github.com/paritytech/wasmtime?branch=update-upstream#f744c4e564b40a4cfce6a7090f093ec1726c68e9" +dependencies = [ + "backtrace", + "cc", + "cfg-if", + "indexmap", + "lazy_static", + "libc", + "log 0.4.8", + "memoffset", + "more-asserts", + "region", + "thiserror", + "wasmtime-environ", + "winapi 0.3.9", +] + [[package]] name = "wast" version = "21.0.0" diff --git a/node/service/src/lib.rs b/node/service/src/lib.rs index 6d5cdbda42..02907e151f 100644 --- a/node/service/src/lib.rs +++ b/node/service/src/lib.rs @@ -23,8 +23,7 @@ mod client; use std::sync::Arc; use std::time::Duration; use polkadot_primitives::v1::{AccountId, Nonce, Balance}; -#[cfg(feature = "full-node")] -use service::{error::Error as ServiceError, ServiceBuilder}; +use service::{error::Error as ServiceError}; use grandpa::{self, FinalityProofProvider as GrandpaFinalityProofProvider}; use sc_executor::native_executor_instance; use log::info; @@ -93,7 +92,7 @@ pub trait RuntimeApiCollection: + authority_discovery_primitives::AuthorityDiscoveryApi where Extrinsic: RuntimeExtrinsic, - >::StateBackend: sp_api::StateBackend, + >::StateBackend: sp_api::StateBackend>, {} impl RuntimeApiCollection for Api @@ -111,7 +110,7 @@ where + sp_session::SessionKeys + authority_discovery_primitives::AuthorityDiscoveryApi, Extrinsic: RuntimeExtrinsic, - >::StateBackend: sp_api::StateBackend, + >::StateBackend: sp_api::StateBackend>, {} pub trait RuntimeExtrinsic: codec::Codec + Send + Sync + 'static {} @@ -145,129 +144,152 @@ fn set_prometheus_registry(config: &mut Configuration) -> Result<(), ServiceErro Ok(()) } -/// Starts a `ServiceBuilder` for a full service. -/// -/// Use this macro if you don't actually need the full service, but just the builder in order to -/// be able to perform chain operations. -macro_rules! new_full_start { - ($config:expr, $runtime:ty, $executor:ty) => {{ - set_prometheus_registry(&mut $config)?; - - let mut import_setup = None; - let mut rpc_setup = None; - let inherent_data_providers = inherents::InherentDataProviders::new(); - let builder = service::ServiceBuilder::new_full::< - Block, $runtime, $executor - >($config)? - .with_select_chain(|_, backend| { - Ok(sc_consensus::LongestChain::new(backend.clone())) - })? - .with_transaction_pool(|builder| { - let pool_api = sc_transaction_pool::FullChainApi::new( - builder.client().clone(), - builder.prometheus_registry(), - ); - let pool = sc_transaction_pool::BasicPool::new_full( - builder.config().transaction_pool.clone(), - std::sync::Arc::new(pool_api), - builder.prometheus_registry(), - builder.spawn_handle(), - builder.client().clone(), - ); - Ok(pool) - })? - .with_import_queue(| - config, - client, - mut select_chain, - _, - spawn_task_handle, - registry, - | { - let select_chain = select_chain.take() - .ok_or_else(|| service::Error::SelectChainRequired)?; - - let grandpa_hard_forks = if config.chain_spec.is_kusama() { - grandpa_support::kusama_hard_forks() - } else { - Vec::new() - }; - - let (grandpa_block_import, grandpa_link) = - grandpa::block_import_with_authority_set_hard_forks( - client.clone(), - &(client.clone() as Arc<_>), - select_chain.clone(), - grandpa_hard_forks, - )?; - - let justification_import = grandpa_block_import.clone(); - - let (block_import, babe_link) = babe::block_import( - babe::Config::get_or_compute(&*client)?, - grandpa_block_import, - client.clone(), - )?; - - let import_queue = babe::import_queue( - babe_link.clone(), - block_import.clone(), - Some(Box::new(justification_import)), - None, - client, - select_chain, - inherent_data_providers.clone(), - spawn_task_handle, - registry, - )?; - - import_setup = Some((block_import, grandpa_link, babe_link)); - Ok(import_queue) - })? - .with_rpc_extensions_builder(|builder| { - let grandpa_link = import_setup.as_ref().map(|s| &s.1) - .expect("GRANDPA LinkHalf is present for full services or set up failed; qed."); - - let shared_authority_set = grandpa_link.shared_authority_set().clone(); - let shared_voter_state = grandpa::SharedVoterState::empty(); - - rpc_setup = Some((shared_voter_state.clone())); - - let babe_link = import_setup.as_ref().map(|s| &s.2) - .expect("BabeLink is present for full services or set up faile; qed."); - - let babe_config = babe_link.config().clone(); - let shared_epoch_changes = babe_link.epoch_changes().clone(); - - let client = builder.client().clone(); - let pool = builder.pool().clone(); - let select_chain = builder.select_chain().cloned() - .expect("SelectChain is present for full services or set up failed; qed."); - let keystore = builder.keystore().clone(); - - Ok(move |deny_unsafe| -> polkadot_rpc::RpcExtension { - let deps = polkadot_rpc::FullDeps { - client: client.clone(), - pool: pool.clone(), - select_chain: select_chain.clone(), - deny_unsafe, - babe: polkadot_rpc::BabeDeps { - babe_config: babe_config.clone(), - shared_epoch_changes: shared_epoch_changes.clone(), - keystore: keystore.clone(), - }, - grandpa: polkadot_rpc::GrandpaDeps { - shared_voter_state: shared_voter_state.clone(), - shared_authority_set: shared_authority_set.clone(), - }, - }; - - polkadot_rpc::create_full(deps) - }) - })?; - - (builder, import_setup, inherent_data_providers, rpc_setup) - }} +type FullBackend = service::TFullBackend; +type FullSelectChain = sc_consensus::LongestChain; +type FullClient = service::TFullClient; +type FullGrandpaBlockImport = grandpa::GrandpaBlockImport< + FullBackend, Block, FullClient, FullSelectChain +>; + +type LightBackend = service::TLightBackendWithHash; + +type LightClient = + service::TLightClientWithBackend; + +#[cfg(feature = "full-node")] +fn full_params(mut config: Configuration) -> Result<( + service::ServiceParams< + Block, + FullClient, + babe::BabeImportQueue>, + sc_transaction_pool::FullPool>, + polkadot_rpc::RpcExtension, + FullBackend, + >, + FullSelectChain, + ( + babe::BabeBlockImport< + Block, FullClient, FullGrandpaBlockImport + >, + grandpa::LinkHalf, FullSelectChain>, + babe::BabeLink + ), + inherents::InherentDataProviders, + grandpa::SharedVoterState, +), Error> + where + RuntimeApi: ConstructRuntimeApi> + Send + Sync + 'static, + RuntimeApi::RuntimeApi: + RuntimeApiCollection>, + Executor: NativeExecutionDispatch + 'static, + Extrinsic: RuntimeExtrinsic, +{ + set_prometheus_registry(&mut config)?; + + let inherent_data_providers = inherents::InherentDataProviders::new(); + + + let (client, backend, keystore, task_manager) = + service::new_full_parts::(&config)?; + let client = Arc::new(client); + + let select_chain = sc_consensus::LongestChain::new(backend.clone()); + + let pool_api = sc_transaction_pool::FullChainApi::new( + client.clone(), config.prometheus_registry(), + ); + let transaction_pool = sc_transaction_pool::BasicPool::new_full( + config.transaction_pool.clone(), + std::sync::Arc::new(pool_api), + config.prometheus_registry(), + task_manager.spawn_handle(), + client.clone(), + ); + + let grandpa_hard_forks = if config.chain_spec.is_kusama() { + grandpa_support::kusama_hard_forks() + } else { + Vec::new() + }; + + let (grandpa_block_import, grandpa_link) = + grandpa::block_import_with_authority_set_hard_forks( + client.clone(), + &(client.clone() as Arc<_>), + select_chain.clone(), + grandpa_hard_forks, + )?; + + let justification_import = grandpa_block_import.clone(); + + let (block_import, babe_link) = babe::block_import( + babe::Config::get_or_compute(&*client)?, + grandpa_block_import, + client.clone(), + )?; + + let import_queue = babe::import_queue( + babe_link.clone(), + block_import.clone(), + Some(Box::new(justification_import)), + None, + client.clone(), + select_chain.clone(), + inherent_data_providers.clone(), + &task_manager.spawn_handle(), + config.prometheus_registry(), + )?; + + let shared_authority_set = grandpa_link.shared_authority_set().clone(); + let shared_voter_state = grandpa::SharedVoterState::empty(); + + let import_setup = (block_import.clone(), grandpa_link, babe_link.clone()); + let rpc_setup = shared_voter_state.clone(); + + let babe_config = babe_link.config().clone(); + let shared_epoch_changes = babe_link.epoch_changes().clone(); + + let rpc_extensions_builder = { + let client = client.clone(); + let keystore = keystore.clone(); + let transaction_pool = transaction_pool.clone(); + let select_chain = select_chain.clone(); + + Box::new(move |deny_unsafe| -> polkadot_rpc::RpcExtension { + let deps = polkadot_rpc::FullDeps { + client: client.clone(), + pool: transaction_pool.clone(), + select_chain: select_chain.clone(), + deny_unsafe, + babe: polkadot_rpc::BabeDeps { + babe_config: babe_config.clone(), + shared_epoch_changes: shared_epoch_changes.clone(), + keystore: keystore.clone(), + }, + grandpa: polkadot_rpc::GrandpaDeps { + shared_voter_state: shared_voter_state.clone(), + shared_authority_set: shared_authority_set.clone(), + }, + }; + + polkadot_rpc::create_full(deps) + }) + }; + + let provider = client.clone() as Arc>; + let finality_proof_provider = Arc::new(GrandpaFinalityProofProvider::new(backend.clone(), provider)) as _; + + let params = service::ServiceParams { + config, backend, client, import_queue, keystore, task_manager, rpc_extensions_builder, + transaction_pool, + block_announce_validator_builder: None, + finality_proof_provider: Some(finality_proof_provider), + finality_proof_request_builder: None, + on_demand: None, + remote_blockchain: None, + }; + + Ok((params, select_chain, import_setup, inherent_data_providers, rpc_setup)) } fn real_overseer( @@ -294,335 +316,331 @@ fn real_overseer( ).map_err(|e| ServiceError::Other(format!("Failed to create an Overseer: {:?}", e))) } -/// Builds a new service for a full client. -#[macro_export] -macro_rules! new_full { - ( - $config:expr, - $collating_for:expr, - $authority_discovery_disabled:expr, - $grandpa_pause:expr, - $runtime:ty, - $dispatch:ty, - ) => {{ - use sc_client_api::ExecutorProvider; - use sp_core::traits::BareCryptoStorePtr; - - let is_collator = $collating_for.is_some(); - let role = $config.role.clone(); - let is_authority = role.is_authority() && !is_collator; - let force_authoring = $config.force_authoring; - let disable_grandpa = $config.disable_grandpa; - let name = $config.network.node_name.clone(); - - let (builder, mut import_setup, inherent_data_providers, mut rpc_setup) = - new_full_start!($config, $runtime, $dispatch); - - let ServiceComponents { - client, network, select_chain, keystore, transaction_pool, prometheus_registry, - task_manager, telemetry_on_connect_sinks, .. - } = builder - .with_finality_proof_provider(|client, backend| { - let provider = client as Arc>; - Ok(Arc::new(GrandpaFinalityProofProvider::new(backend, provider)) as _) - })? - .build_full()?; - - let (block_import, link_half, babe_link) = import_setup.take() - .expect("Link Half and Block Import are present for Full Services or setup failed before. qed"); - - let shared_voter_state = rpc_setup.take() - .expect("The SharedVoterState is present for Full Services or setup failed before. qed"); - - let overseer_client = client.clone(); - let spawner = task_manager.spawn_handle(); - let leaves: Vec<_> = select_chain.clone().ok_or(ServiceError::SelectChainRequired)? - .leaves() - .unwrap_or_else(|_| vec![]) - .into_iter() - .filter_map(|hash| { - let number = client.number(hash).ok()??; - let parent_hash = client.header(&BlockId::Hash(hash)).ok()??.parent_hash; - - Some(BlockInfo { - hash, - parent_hash, - number, - }) +#[cfg(feature = "full-node")] +fn new_full( + config: Configuration, + collating_for: Option<(CollatorId, ParaId)>, + _max_block_data_size: Option, + _authority_discovery_disabled: bool, + _slot_duration: u64, + grandpa_pause: Option<(u32, u32)>, +) -> Result<( + TaskManager, + Arc>, +), Error> + where + RuntimeApi: ConstructRuntimeApi> + Send + Sync + 'static, + RuntimeApi::RuntimeApi: + RuntimeApiCollection>, + Executor: NativeExecutionDispatch + 'static, + Extrinsic: RuntimeExtrinsic, +{ + use sc_client_api::ExecutorProvider; + use sp_core::traits::BareCryptoStorePtr; + + let is_collator = collating_for.is_some(); + let role = config.role.clone(); + let is_authority = role.is_authority() && !is_collator; + let force_authoring = config.force_authoring; + let disable_grandpa = config.disable_grandpa; + let name = config.network.node_name.clone(); + + let (params, select_chain, import_setup, inherent_data_providers, rpc_setup) + = full_params::(config)?; + + let client = params.client.clone(); + let keystore = params.keystore.clone(); + let transaction_pool = params.transaction_pool.clone(); + let prometheus_registry = params.config.prometheus_registry().cloned(); + + let ServiceComponents { + network, task_manager, telemetry_on_connect_sinks, .. + } = service::build(params)?; + + let (block_import, link_half, babe_link) = import_setup; + + let shared_voter_state = rpc_setup; + + let overseer_client = client.clone(); + let spawner = task_manager.spawn_handle(); + let leaves: Vec<_> = select_chain.clone() + .leaves() + .unwrap_or_else(|_| vec![]) + .into_iter() + .filter_map(|hash| { + let number = client.number(hash).ok()??; + let parent_hash = client.header(&BlockId::Hash(hash)).ok()??.parent_hash; + + Some(BlockInfo { + hash, + parent_hash, + number, }) - .collect(); + }) + .collect(); - let (overseer, handler) = real_overseer(leaves, spawner)?; - let handler_clone = handler.clone(); + let (overseer, handler) = real_overseer(leaves, spawner)?; + let handler_clone = handler.clone(); - task_manager.spawn_essential_handle().spawn_blocking("overseer", Box::pin(async move { - use futures::{pin_mut, select, FutureExt}; + task_manager.spawn_essential_handle().spawn_blocking("overseer", Box::pin(async move { + use futures::{pin_mut, select, FutureExt}; - let forward = overseer::forward_events(overseer_client, handler); + let forward = overseer::forward_events(overseer_client, handler); - let forward = forward.fuse(); - let overseer_fut = overseer.run().fuse(); + let forward = forward.fuse(); + let overseer_fut = overseer.run().fuse(); - pin_mut!(overseer_fut); - pin_mut!(forward); + pin_mut!(overseer_fut); + pin_mut!(forward); - loop { - select! { - _ = forward => break, - _ = overseer_fut => break, - complete => break, - } + loop { + select! { + _ = forward => break, + _ = overseer_fut => break, + complete => break, } - })); + } + })); + + if role.is_authority() { + let can_author_with = + consensus_common::CanAuthorWithNativeVersion::new(client.executor().clone()); + + let proposer = ProposerFactory::new( + client.clone(), + transaction_pool, + handler_clone, + ); + + let babe_config = babe::BabeParams { + keystore: keystore.clone(), + client: client.clone(), + select_chain, + block_import, + env: proposer, + sync_oracle: network.clone(), + inherent_data_providers: inherent_data_providers.clone(), + force_authoring, + babe_link, + can_author_with, + }; - if role.is_authority() { - let select_chain = select_chain.ok_or(ServiceError::SelectChainRequired)?; - let can_author_with = - consensus_common::CanAuthorWithNativeVersion::new(client.executor().clone()); + let babe = babe::start_babe(babe_config)?; + task_manager.spawn_essential_handle().spawn_blocking("babe", babe); + } - let proposer = ProposerFactory::new( - client.clone(), - transaction_pool, - handler_clone, - ); + // if the node isn't actively participating in consensus then it doesn't + // need a keystore, regardless of which protocol we use below. + let keystore = if is_authority { + Some(keystore.clone() as BareCryptoStorePtr) + } else { + None + }; - let babe_config = babe::BabeParams { - keystore: keystore.clone(), - client: client.clone(), - select_chain, - block_import, - env: proposer, - sync_oracle: network.clone(), - inherent_data_providers: inherent_data_providers.clone(), - force_authoring, - babe_link, - can_author_with, - }; + let config = grandpa::Config { + // FIXME substrate#1578 make this available through chainspec + gossip_duration: Duration::from_millis(1000), + justification_period: 512, + name: Some(name), + observer_enabled: false, + keystore, + is_authority: role.is_network_authority(), + }; - let babe = babe::start_babe(babe_config)?; - task_manager.spawn_essential_handle().spawn_blocking("babe", babe); - } + let enable_grandpa = !disable_grandpa; + if enable_grandpa { + // start the full GRANDPA voter + // NOTE: unlike in substrate we are currently running the full + // GRANDPA voter protocol for all full nodes (regardless of whether + // they're validators or not). at this point the full voter should + // provide better guarantees of block and vote data availability than + // the observer. + + // add a custom voting rule to temporarily stop voting for new blocks + // after the given pause block is finalized and restarting after the + // given delay. + let voting_rule = match grandpa_pause { + Some((block, delay)) => { + info!("GRANDPA scheduled voting pause set for block #{} with a duration of {} blocks.", + block, + delay, + ); - // if the node isn't actively participating in consensus then it doesn't - // need a keystore, regardless of which protocol we use below. - let keystore = if is_authority { - Some(keystore.clone() as BareCryptoStorePtr) - } else { - None + grandpa::VotingRulesBuilder::default() + .add(grandpa_support::PauseAfterBlockFor(block, delay)) + .build() + }, + None => + grandpa::VotingRulesBuilder::default() + .build(), }; - let config = grandpa::Config { - // FIXME substrate#1578 make this available through chainspec - gossip_duration: Duration::from_millis(1000), - justification_period: 512, - name: Some(name), - observer_enabled: false, - keystore, - is_authority: role.is_network_authority(), + let grandpa_config = grandpa::GrandpaParams { + config, + link: link_half, + network: network.clone(), + inherent_data_providers: inherent_data_providers.clone(), + telemetry_on_connect: Some(telemetry_on_connect_sinks.on_connect_stream()), + voting_rule, + prometheus_registry: prometheus_registry, + shared_voter_state, }; - let enable_grandpa = !disable_grandpa; - if enable_grandpa { - // start the full GRANDPA voter - // NOTE: unlike in substrate we are currently running the full - // GRANDPA voter protocol for all full nodes (regardless of whether - // they're validators or not). at this point the full voter should - // provide better guarantees of block and vote data availability than - // the observer. - - // add a custom voting rule to temporarily stop voting for new blocks - // after the given pause block is finalized and restarting after the - // given delay. - let voting_rule = match $grandpa_pause { - Some((block, delay)) => { - info!("GRANDPA scheduled voting pause set for block #{} with a duration of {} blocks.", - block, - delay, - ); - - grandpa::VotingRulesBuilder::default() - .add(grandpa_support::PauseAfterBlockFor(block, delay)) - .build() - }, - None => - grandpa::VotingRulesBuilder::default() - .build(), - }; - - let grandpa_config = grandpa::GrandpaParams { - config, - link: link_half, - network: network.clone(), - inherent_data_providers: inherent_data_providers.clone(), - telemetry_on_connect: Some(telemetry_on_connect_sinks.on_connect_stream()), - voting_rule, - prometheus_registry: prometheus_registry, - shared_voter_state, - }; - - task_manager.spawn_essential_handle().spawn_blocking( - "grandpa-voter", - grandpa::run_grandpa_voter(grandpa_config)? - ); - } else { - grandpa::setup_disabled_grandpa( - client.clone(), - &inherent_data_providers, - network.clone(), - )?; - } + task_manager.spawn_essential_handle().spawn_blocking( + "grandpa-voter", + grandpa::run_grandpa_voter(grandpa_config)? + ); + } else { + grandpa::setup_disabled_grandpa( + client.clone(), + &inherent_data_providers, + network.clone(), + )?; + } - (task_manager, client) - }} + Ok((task_manager, client)) } pub struct FullNodeHandles; /// Builds a new service for a light client. -#[macro_export] -macro_rules! new_light { - ($config:expr, $runtime:ty, $dispatch:ty) => {{ - crate::set_prometheus_registry(&mut $config)?; - let inherent_data_providers = inherents::InherentDataProviders::new(); - - ServiceBuilder::new_light::($config)? - .with_select_chain(|_, backend| { - Ok(sc_consensus::LongestChain::new(backend.clone())) - })? - .with_transaction_pool(|builder| { - let fetcher = builder.fetcher() - .ok_or_else(|| "Trying to start light transaction pool without active fetcher")?; - let pool_api = sc_transaction_pool::LightChainApi::new( - builder.client().clone(), - fetcher, - ); - let pool = Arc::new(sc_transaction_pool::BasicPool::new_light( - builder.config().transaction_pool.clone(), - Arc::new(pool_api), - builder.prometheus_registry(), - builder.spawn_handle(), - )); - Ok(pool) - })? - .with_import_queue_and_fprb(| - _config, - client, - backend, - fetcher, - mut select_chain, - _, - spawn_task_handle, - registry, - | { - let select_chain = select_chain.take() - .ok_or_else(|| service::Error::SelectChainRequired)?; - - let fetch_checker = fetcher - .map(|fetcher| fetcher.checker().clone()) - .ok_or_else(|| "Trying to start light import queue without active fetch checker")?; - - let grandpa_block_import = grandpa::light_block_import( - client.clone(), backend, &(client.clone() as Arc<_>), Arc::new(fetch_checker) - )?; - - let finality_proof_import = grandpa_block_import.clone(); - let finality_proof_request_builder = - finality_proof_import.create_finality_proof_request_builder(); - - let (babe_block_import, babe_link) = babe::block_import( - babe::Config::get_or_compute(&*client)?, - grandpa_block_import, - client.clone(), - )?; - - // FIXME: pruning task isn't started since light client doesn't do `AuthoritySetup`. - let import_queue = babe::import_queue( - babe_link, - babe_block_import, - None, - Some(Box::new(finality_proof_import)), - client, - select_chain, - inherent_data_providers.clone(), - spawn_task_handle, - registry, - )?; - - Ok((import_queue, finality_proof_request_builder)) - })? - .with_finality_proof_provider(|client, backend| { - let provider = client as Arc>; - Ok(Arc::new(grandpa::FinalityProofProvider::new(backend, provider)) as _) - })? - .with_rpc_extensions(|builder| { - let fetcher = builder.fetcher() - .ok_or_else(|| "Trying to start node RPC without active fetcher")?; - let remote_blockchain = builder.remote_backend() - .ok_or_else(|| "Trying to start node RPC without active remote blockchain")?; - - let light_deps = polkadot_rpc::LightDeps { - remote_blockchain, - fetcher, - client: builder.client().clone(), - pool: builder.pool(), - }; - Ok(polkadot_rpc::create_light(light_deps)) - })? - .build_light() - .map(|ServiceComponents { task_manager, .. }| task_manager) - }} +fn new_light(mut config: Configuration) -> Result + where + Runtime: 'static + Send + Sync + ConstructRuntimeApi>, + >>::RuntimeApi: + RuntimeApiCollection>, + Dispatch: NativeExecutionDispatch + 'static, + Extrinsic: RuntimeExtrinsic, +{ + crate::set_prometheus_registry(&mut config)?; + use sc_client_api::backend::RemoteBackend; + + let (client, backend, keystore, task_manager, on_demand) = + service::new_light_parts::(&config)?; + + let select_chain = sc_consensus::LongestChain::new(backend.clone()); + + let pool_api = sc_transaction_pool::LightChainApi::new( + client.clone(), + on_demand.clone(), + ); + let transaction_pool = Arc::new(sc_transaction_pool::BasicPool::new_light( + config.transaction_pool.clone(), + Arc::new(pool_api), + config.prometheus_registry(), + task_manager.spawn_handle(), + )); + + let grandpa_block_import = grandpa::light_block_import( + client.clone(), backend.clone(), &(client.clone() as Arc<_>), + Arc::new(on_demand.checker().clone()), + )?; + + let finality_proof_import = grandpa_block_import.clone(); + let finality_proof_request_builder = + finality_proof_import.create_finality_proof_request_builder(); + + let (babe_block_import, babe_link) = babe::block_import( + babe::Config::get_or_compute(&*client)?, + grandpa_block_import, + client.clone(), + )?; + + let inherent_data_providers = inherents::InherentDataProviders::new(); + + // FIXME: pruning task isn't started since light client doesn't do `AuthoritySetup`. + let import_queue = babe::import_queue( + babe_link, + babe_block_import, + None, + Some(Box::new(finality_proof_import)), + client.clone(), + select_chain.clone(), + inherent_data_providers.clone(), + &task_manager.spawn_handle(), + config.prometheus_registry(), + )?; + + let provider = client.clone() as Arc>; + let finality_proof_provider = Arc::new(GrandpaFinalityProofProvider::new(backend.clone(), provider)); + + let light_deps = polkadot_rpc::LightDeps { + remote_blockchain: backend.remote_blockchain(), + fetcher: on_demand.clone(), + client: client.clone(), + pool: transaction_pool.clone(), + }; + + let rpc_extensions = polkadot_rpc::create_light(light_deps); + + let ServiceComponents { task_manager, .. } = service::build(service::ServiceParams { + config, + block_announce_validator_builder: None, + finality_proof_request_builder: Some(finality_proof_request_builder), + finality_proof_provider: Some(finality_proof_provider), + on_demand: Some(on_demand), + remote_blockchain: Some(backend.remote_blockchain()), + rpc_extensions_builder: Box::new(service::NoopRpcExtensionBuilder(rpc_extensions)), + client: client.clone(), + transaction_pool: transaction_pool.clone(), + import_queue, keystore, backend, task_manager, + })?; + + Ok(task_manager) } /// Builds a new object suitable for chain operations. +#[cfg(feature = "full-node")] pub fn new_chain_ops(mut config: Configuration) -> Result< ( - Arc>, - Arc>, + Arc>, + Arc, consensus_common::import_queue::BasicQueue>, TaskManager, ), ServiceError > where - Runtime: ConstructRuntimeApi> + Send + Sync + 'static, + Runtime: ConstructRuntimeApi> + Send + Sync + 'static, Runtime::RuntimeApi: - RuntimeApiCollection, Block>>, + RuntimeApiCollection>, Dispatch: NativeExecutionDispatch + 'static, Extrinsic: RuntimeExtrinsic, { config.keystore = service::config::KeystoreConfig::InMemory; - let (builder, _, _, _) = new_full_start!(config, Runtime, Dispatch); - Ok(builder.to_chain_ops_parts()) + let (service::ServiceParams { client, backend, import_queue, task_manager, .. }, ..) + = full_params::(config)?; + Ok((client, backend, import_queue, task_manager)) } /// Create a new Polkadot service for a full node. #[cfg(feature = "full-node")] pub fn polkadot_new_full( - mut config: Configuration, + config: Configuration, collating_for: Option<(CollatorId, ParaId)>, - _max_block_data_size: Option, - _authority_discovery_disabled: bool, - _slot_duration: u64, + max_block_data_size: Option, + authority_discovery_disabled: bool, + slot_duration: u64, grandpa_pause: Option<(u32, u32)>, ) -> Result<( TaskManager, Arc, + FullBackend, polkadot_runtime::RuntimeApi >>, FullNodeHandles, ), ServiceError> { - let (components, client) = new_full!( + let (components, client) = new_full::( config, collating_for, + max_block_data_size, authority_discovery_disabled, + slot_duration, grandpa_pause, - polkadot_runtime::RuntimeApi, - PolkadotExecutor, - ); + )?; Ok((components, client, FullNodeHandles)) } @@ -630,31 +648,31 @@ pub fn polkadot_new_full( /// Create a new Kusama service for a full node. #[cfg(feature = "full-node")] pub fn kusama_new_full( - mut config: Configuration, + config: Configuration, collating_for: Option<(CollatorId, ParaId)>, - _max_block_data_size: Option, - _authority_discovery_disabled: bool, - _slot_duration: u64, + max_block_data_size: Option, + authority_discovery_disabled: bool, + slot_duration: u64, grandpa_pause: Option<(u32, u32)>, ) -> Result<( TaskManager, Arc, + FullBackend, kusama_runtime::RuntimeApi > >, FullNodeHandles, ), ServiceError> { - let (components, client) = new_full!( + let (components, client) = new_full::( config, collating_for, + max_block_data_size, authority_discovery_disabled, + slot_duration, grandpa_pause, - kusama_runtime::RuntimeApi, - KusamaExecutor, - ); + )?; Ok((components, client, FullNodeHandles)) } @@ -662,49 +680,49 @@ pub fn kusama_new_full( /// Create a new Kusama service for a full node. #[cfg(feature = "full-node")] pub fn westend_new_full( - mut config: Configuration, + config: Configuration, collating_for: Option<(CollatorId, ParaId)>, - _max_block_data_size: Option, - _authority_discovery_disabled: bool, - _slot_duration: u64, + max_block_data_size: Option, + authority_discovery_disabled: bool, + slot_duration: u64, grandpa_pause: Option<(u32, u32)>, ) -> Result<( TaskManager, Arc, + FullBackend, westend_runtime::RuntimeApi >>, FullNodeHandles, ), ServiceError> { - let (components, client) = new_full!( + let (components, client) = new_full::( config, collating_for, + max_block_data_size, authority_discovery_disabled, + slot_duration, grandpa_pause, - westend_runtime::RuntimeApi, - WestendExecutor, - ); + )?; Ok((components, client, FullNodeHandles)) } /// Create a new Polkadot service for a light client. -pub fn polkadot_new_light(mut config: Configuration) -> Result +pub fn polkadot_new_light(config: Configuration) -> Result { - new_light!(config, polkadot_runtime::RuntimeApi, PolkadotExecutor) + new_light::(config) } /// Create a new Kusama service for a light client. -pub fn kusama_new_light(mut config: Configuration) -> Result +pub fn kusama_new_light(config: Configuration) -> Result { - new_light!(config, kusama_runtime::RuntimeApi, KusamaExecutor) + new_light::(config) } /// Create a new Westend service for a light client. -pub fn westend_new_light(mut config: Configuration, ) -> Result +pub fn westend_new_light(config: Configuration, ) -> Result { - new_light!(config, westend_runtime::RuntimeApi, KusamaExecutor) + new_light::(config) } diff --git a/node/test-service/src/lib.rs b/node/test-service/src/lib.rs index 1566f46876..3bdc741bac 100644 --- a/node/test-service/src/lib.rs +++ b/node/test-service/src/lib.rs @@ -21,17 +21,13 @@ mod chain_spec; pub use chain_spec::*; -use consensus_common::{block_validation::Chain, SelectChain}; use futures::future::Future; -use grandpa::FinalityProofProvider as GrandpaFinalityProofProvider; -use log::info; -use polkadot_network::{legacy::gossip::Known, protocol as network_protocol}; use polkadot_primitives::v0::{ - Block, BlockId, Hash, CollatorId, Id as ParaId, + Block, Hash, CollatorId, Id as ParaId, }; use polkadot_runtime_common::{parachains, registrar, BlockHashCount}; use polkadot_service::{ - new_full, new_full_start, FullNodeHandles, PolkadotClient, ServiceComponents, + new_full, FullNodeHandles, PolkadotClient, }; use polkadot_test_runtime::{RestrictFunctionality, Runtime, SignedExtra, SignedPayload, VERSION}; use sc_chain_spec::ChainSpec; @@ -54,7 +50,6 @@ use sp_keyring::Sr25519Keyring; use sp_runtime::{codec::Encode, generic}; use sp_state_machine::BasicExternalities; use std::sync::Arc; -use std::time::Duration; use substrate_test_client::{BlockchainEventsExt, RpcHandlersExt, RpcTransactionOutput, RpcTransactionError}; native_executor_instance!( @@ -81,15 +76,16 @@ pub fn polkadot_test_new_full( ), ServiceError, > { - let (task_manager, client, handles, network, rpc_handlers) = new_full!(test - config, - collating_for, - max_block_data_size, - authority_discovery_disabled, - slot_duration, - polkadot_test_runtime::RuntimeApi, - PolkadotTestExecutor, - ); + let (task_manager, client, handles, network, rpc_handlers) = + new_full::( + config, + collating_for, + max_block_data_size, + authority_discovery_disabled, + slot_duration, + None, + true, + )?; Ok((task_manager, client, handles, network, rpc_handlers)) } diff --git a/service/src/lib.rs b/service/src/lib.rs index 0140aae70f..a0b2fdcd22 100644 --- a/service/src/lib.rs +++ b/service/src/lib.rs @@ -25,7 +25,7 @@ use std::time::Duration; use polkadot_primitives::v0::{self as parachain, Hash, BlockId, AccountId, Nonce, Balance}; #[cfg(feature = "full-node")] use polkadot_network::{legacy::gossip::Known, protocol as network_protocol}; -use service::{error::Error as ServiceError, ServiceBuilder}; +use service::{error::Error as ServiceError}; use grandpa::{self, FinalityProofProvider as GrandpaFinalityProofProvider}; use sc_executor::native_executor_instance; use log::info; @@ -135,603 +135,558 @@ impl IdentifyVariant for Box { } } -/// Starts a `ServiceBuilder` for a full service. -/// -/// Use this macro if you don't actually need the full service, but just the builder in order to -/// be able to perform chain operations. -#[macro_export] -macro_rules! new_full_start { - (prometheus_setup $config:expr) => {{ +type FullBackend = service::TFullBackend; +type FullSelectChain = sc_consensus::LongestChain; +type FullClient = service::TFullClient; +type FullGrandpaBlockImport = grandpa::GrandpaBlockImport< + FullBackend, Block, FullClient, FullSelectChain +>; + +type LightBackend = service::TLightBackendWithHash; + +type LightClient = + service::TLightClientWithBackend; + +#[cfg(feature = "full-node")] +pub fn full_params(mut config: Configuration, test: bool) -> Result<( + service::ServiceParams< + Block, + FullClient, + babe::BabeImportQueue>, + sc_transaction_pool::FullPool>, + polkadot_rpc::RpcExtension, + FullBackend, + >, + FullSelectChain, + ( + babe::BabeBlockImport< + Block, FullClient, FullGrandpaBlockImport + >, + grandpa::LinkHalf, FullSelectChain>, + babe::BabeLink + ), + inherents::InherentDataProviders, + grandpa::SharedVoterState, +), Error> + where + RuntimeApi: ConstructRuntimeApi> + Send + Sync + 'static, + RuntimeApi::RuntimeApi: + RuntimeApiCollection>, + Executor: NativeExecutionDispatch + 'static, + Extrinsic: RuntimeExtrinsic, +{ + if !test { // If we're using prometheus, use a registry with a prefix of `polkadot`. - if let Some(PrometheusConfig { registry, .. }) = $config.prometheus_config.as_mut() { + if let Some(PrometheusConfig { registry, .. }) = config.prometheus_config.as_mut() { *registry = Registry::new_custom(Some("polkadot".into()), None)?; } - }}; - (start_builder $config:expr, $runtime:ty, $executor:ty $(,)?) => {{ - service::ServiceBuilder::new_full::< - Block, $runtime, $executor - >($config)? - .with_select_chain(|_, backend| { - Ok(sc_consensus::LongestChain::new(backend.clone())) - })? - .with_transaction_pool(|builder| { - let pool_api = sc_transaction_pool::FullChainApi::new( - builder.client().clone(), - builder.prometheus_registry(), - ); - let pool = sc_transaction_pool::BasicPool::new_full( - builder.config().transaction_pool.clone(), - std::sync::Arc::new(pool_api), - builder.prometheus_registry(), - builder.spawn_handle(), - builder.client().clone(), - ); - Ok(pool) - })? - }}; - (import_queue_setup - $builder:expr, $inherent_data_providers:expr, $import_setup:expr, $grandpa_hard_forks:expr, $(,)? - ) => {{ - $builder.with_import_queue(| - _config, - client, - mut select_chain, - _, - spawn_task_handle, - registry, - | { - let select_chain = select_chain.take() - .ok_or_else(|| service::Error::SelectChainRequired)?; - - let (grandpa_block_import, grandpa_link) = - grandpa::block_import_with_authority_set_hard_forks( - client.clone(), - &(client.clone() as Arc<_>), - select_chain.clone(), - $grandpa_hard_forks, - )?; - - let justification_import = grandpa_block_import.clone(); - - let (block_import, babe_link) = babe::block_import( - babe::Config::get_or_compute(&*client)?, - grandpa_block_import, - client.clone(), - )?; - - let import_queue = babe::import_queue( - babe_link.clone(), - block_import.clone(), - Some(Box::new(justification_import)), - None, - client, - select_chain, - $inherent_data_providers.clone(), - spawn_task_handle, - registry, - )?; - - $import_setup = Some((block_import, grandpa_link, babe_link)); - Ok(import_queue) - })? - }}; - (finish_builder_setup $builder:expr, $inherent_data_providers:expr, $import_setup:expr) => {{ - let mut rpc_setup = None; - - let builder = $builder.with_rpc_extensions_builder(|builder| { - let grandpa_link = $import_setup.as_ref().map(|s| &s.1) - .expect("GRANDPA LinkHalf is present for full services or set up failed; qed."); - - let shared_authority_set = grandpa_link.shared_authority_set().clone(); - let shared_voter_state = grandpa::SharedVoterState::empty(); - - rpc_setup = Some((shared_voter_state.clone())); - - let babe_link = $import_setup.as_ref().map(|s| &s.2) - .expect("BabeLink is present for full services or set up faile; qed."); - - let babe_config = babe_link.config().clone(); - let shared_epoch_changes = babe_link.epoch_changes().clone(); - - let client = builder.client().clone(); - let pool = builder.pool().clone(); - let select_chain = builder.select_chain().cloned() - .expect("SelectChain is present for full services or set up failed; qed."); - let keystore = builder.keystore().clone(); - - Ok(move |deny_unsafe| -> polkadot_rpc::RpcExtension { - let deps = polkadot_rpc::FullDeps { - client: client.clone(), - pool: pool.clone(), - select_chain: select_chain.clone(), - deny_unsafe, - babe: polkadot_rpc::BabeDeps { - babe_config: babe_config.clone(), - shared_epoch_changes: shared_epoch_changes.clone(), - keystore: keystore.clone(), - }, - grandpa: polkadot_rpc::GrandpaDeps { - shared_voter_state: shared_voter_state.clone(), - shared_authority_set: shared_authority_set.clone(), - }, - }; - - polkadot_rpc::create_full(deps) - }) - })?; - - (builder, $import_setup, $inherent_data_providers, rpc_setup) - }}; - ($config:expr, $runtime:ty, $executor:ty $(,)?) => {{ - let inherent_data_providers = inherents::InherentDataProviders::new(); - let mut import_setup = None; - new_full_start!(prometheus_setup $config); - let grandpa_hard_forks = if $config.chain_spec.is_kusama() { - $crate::grandpa_support::kusama_hard_forks() - } else { - Vec::new() - }; - let builder = new_full_start!(start_builder $config, $runtime, $executor); - let builder = new_full_start!(import_queue_setup - builder, inherent_data_providers, import_setup, grandpa_hard_forks, - ); - new_full_start!(finish_builder_setup builder, inherent_data_providers, import_setup) - }}; - (test $config:expr, $runtime:ty, $executor:ty $(,)?) => {{ - let inherent_data_providers = inherents::InherentDataProviders::new(); - let mut import_setup = None; - let grandpa_hard_forks = Vec::new(); - let builder = new_full_start!(start_builder $config, $runtime, $executor); - let builder = new_full_start!(import_queue_setup - builder, inherent_data_providers, import_setup, grandpa_hard_forks, - ); - new_full_start!(finish_builder_setup builder, inherent_data_providers, import_setup) - }}; -} + } -/// Builds a new service for a full client. -#[macro_export] -macro_rules! new_full { - ( - with_full_start - $config:expr, - $collating_for:expr, - $max_block_data_size:expr, - $authority_discovery_disabled:expr, - $slot_duration:expr, - $grandpa_pause:expr, - $new_full_start:expr $(,)? - ) => {{ - use sc_network::Event; - use sc_client_api::ExecutorProvider; - use futures::stream::StreamExt; - use sp_core::traits::BareCryptoStorePtr; - - let is_collator = $collating_for.is_some(); - let role = $config.role.clone(); - let is_authority = role.is_authority() && !is_collator; - let force_authoring = $config.force_authoring; - let db_path = match $config.database.path() { - Some(path) => std::path::PathBuf::from(path), - None => return Err("Starting a Polkadot service with a custom database isn't supported".to_string().into()), - }; - let max_block_data_size = $max_block_data_size; - let disable_grandpa = $config.disable_grandpa; - let name = $config.network.node_name.clone(); - let authority_discovery_disabled = $authority_discovery_disabled; - let slot_duration = $slot_duration; - - let (builder, mut import_setup, inherent_data_providers, mut rpc_setup) = $new_full_start; - - let ServiceComponents { - client, network, select_chain, keystore, transaction_pool, prometheus_registry, - task_manager, telemetry_on_connect_sinks, rpc_handlers, .. - } = builder - .with_finality_proof_provider(|client, backend| { - let provider = client as Arc>; - Ok(Arc::new(GrandpaFinalityProofProvider::new(backend, provider)) as _) - })? - .build_full()?; - - let (block_import, link_half, babe_link) = import_setup.take() - .expect("Link Half and Block Import are present for Full Services or setup failed before. qed"); - - let shared_voter_state = rpc_setup.take() - .expect("The SharedVoterState is present for Full Services or setup failed before. qed"); - - let known_oracle = client.clone(); - - let mut handles = FullNodeHandles::default(); - let select_chain = select_chain.ok_or(ServiceError::SelectChainRequired)?; - let gossip_validator_select_chain = select_chain.clone(); - - let is_known = move |block_hash: &Hash| { - use consensus_common::BlockStatus; - - match known_oracle.block_status(&BlockId::hash(*block_hash)) { - Err(_) | Ok(BlockStatus::Unknown) | Ok(BlockStatus::Queued) => None, - Ok(BlockStatus::KnownBad) => Some(Known::Bad), - Ok(BlockStatus::InChainWithState) | Ok(BlockStatus::InChainPruned) => { - match gossip_validator_select_chain.leaves() { - Err(_) => None, - Ok(leaves) => if leaves.contains(block_hash) { - Some(Known::Leaf) - } else { - Some(Known::Old) - }, - } - } - } - }; + let inherent_data_providers = inherents::InherentDataProviders::new(); - let polkadot_network_service = network_protocol::start( - network.clone(), - network_protocol::Config { - collating_for: $collating_for, - }, - (is_known, client.clone()), - client.clone(), - task_manager.spawn_handle(), - ).map_err(|e| format!("Could not spawn network worker: {:?}", e))?; - - let authority_handles = if is_collator || role.is_authority() { - let availability_store = { - use std::path::PathBuf; - - let mut path = PathBuf::from(db_path); - path.push("availability"); - - #[cfg(not(target_os = "unknown"))] - { - av_store::Store::new( - ::av_store::Config { - cache_size: None, - path, - }, - polkadot_network_service.clone(), - )? - } - #[cfg(target_os = "unknown")] - av_store::Store::new_in_memory(gossip) - }; + let (client, backend, keystore, task_manager) = + service::new_full_parts::(&config)?; + let client = Arc::new(client); - polkadot_network_service.register_availability_store(availability_store.clone()); + let select_chain = sc_consensus::LongestChain::new(backend.clone()); - let (validation_service_handle, validation_service) = consensus::ServiceBuilder { + let pool_api = sc_transaction_pool::FullChainApi::new( + client.clone(), config.prometheus_registry(), + ); + let transaction_pool = sc_transaction_pool::BasicPool::new_full( + config.transaction_pool.clone(), + std::sync::Arc::new(pool_api), + config.prometheus_registry(), + task_manager.spawn_handle(), + client.clone(), + ); + + let grandpa_hard_forks = if config.chain_spec.is_kusama() && !test { + crate::grandpa_support::kusama_hard_forks() + } else { + Vec::new() + }; + + let (grandpa_block_import, grandpa_link) = + grandpa::block_import_with_authority_set_hard_forks( + client.clone(), + &(client.clone() as Arc<_>), + select_chain.clone(), + grandpa_hard_forks, + )?; + + let justification_import = grandpa_block_import.clone(); + + let (block_import, babe_link) = babe::block_import( + babe::Config::get_or_compute(&*client)?, + grandpa_block_import, + client.clone(), + )?; + + let import_queue = babe::import_queue( + babe_link.clone(), + block_import.clone(), + Some(Box::new(justification_import)), + None, + client.clone(), + select_chain.clone(), + inherent_data_providers.clone(), + &task_manager.spawn_handle(), + config.prometheus_registry(), + )?; + + let shared_authority_set = grandpa_link.shared_authority_set().clone(); + let shared_voter_state = grandpa::SharedVoterState::empty(); + + let import_setup = (block_import.clone(), grandpa_link, babe_link.clone()); + let rpc_setup = shared_voter_state.clone(); + + let babe_config = babe_link.config().clone(); + let shared_epoch_changes = babe_link.epoch_changes().clone(); + + let rpc_extensions_builder = { + let client = client.clone(); + let keystore = keystore.clone(); + let transaction_pool = transaction_pool.clone(); + let select_chain = select_chain.clone(); + + Box::new(move |deny_unsafe| -> polkadot_rpc::RpcExtension { + let deps = polkadot_rpc::FullDeps { client: client.clone(), - network: polkadot_network_service.clone(), - collators: polkadot_network_service.clone(), - spawner: task_manager.spawn_handle(), - availability_store: availability_store.clone(), + pool: transaction_pool.clone(), select_chain: select_chain.clone(), - keystore: keystore.clone(), - max_block_data_size, - }.build(); + deny_unsafe, + babe: polkadot_rpc::BabeDeps { + babe_config: babe_config.clone(), + shared_epoch_changes: shared_epoch_changes.clone(), + keystore: keystore.clone(), + }, + grandpa: polkadot_rpc::GrandpaDeps { + shared_voter_state: shared_voter_state.clone(), + shared_authority_set: shared_authority_set.clone(), + }, + }; - task_manager.spawn_essential_handle().spawn("validation-service", Box::pin(validation_service)); + polkadot_rpc::create_full(deps) + }) + }; - handles.validation_service_handle = Some(validation_service_handle.clone()); + let provider = client.clone() as Arc>; + let finality_proof_provider = Arc::new(GrandpaFinalityProofProvider::new(backend.clone(), provider)) as _; - Some((validation_service_handle, availability_store)) - } else { - None - }; + let params = service::ServiceParams { + config, backend, client, import_queue, keystore, task_manager, rpc_extensions_builder, + transaction_pool, + block_announce_validator_builder: None, + finality_proof_provider: Some(finality_proof_provider), + finality_proof_request_builder: None, + on_demand: None, + remote_blockchain: None, + }; - if role.is_authority() { - let (validation_service_handle, availability_store) = authority_handles - .clone() - .expect("Authority handles are set for authority nodes; qed"); + Ok((params, select_chain, import_setup, inherent_data_providers, rpc_setup)) +} - let proposer = consensus::ProposerFactory::new( - client.clone(), - transaction_pool, - validation_service_handle, - slot_duration, - prometheus_registry.as_ref(), - ); +#[cfg(feature = "full-node")] +pub fn new_full( + config: Configuration, + collating_for: Option<(CollatorId, parachain::Id)>, + max_block_data_size: Option, + authority_discovery_disabled: bool, + slot_duration: u64, + grandpa_pause: Option<(u32, u32)>, + test: bool, +) -> Result<( + TaskManager, + Arc>, + FullNodeHandles, + Arc::Hash>>, + Arc, +), Error> + where + RuntimeApi: ConstructRuntimeApi> + Send + Sync + 'static, + RuntimeApi::RuntimeApi: + RuntimeApiCollection>, + Executor: NativeExecutionDispatch + 'static, + Extrinsic: RuntimeExtrinsic, +{ + use sc_network::Event; + use sc_client_api::ExecutorProvider; + use futures::stream::StreamExt; + use sp_core::traits::BareCryptoStorePtr; + + let is_collator = collating_for.is_some(); + let role = config.role.clone(); + let is_authority = role.is_authority() && !is_collator; + let force_authoring = config.force_authoring; + let db_path = match config.database.path() { + Some(path) => std::path::PathBuf::from(path), + None => return Err("Starting a Polkadot service with a custom database isn't supported".to_string().into()), + }; + let disable_grandpa = config.disable_grandpa; + let name = config.network.node_name.clone(); + + let (params, select_chain, import_setup, inherent_data_providers, rpc_setup) + = full_params::(config, test)?; + + let client = params.client.clone(); + let keystore = params.keystore.clone(); + let transaction_pool = params.transaction_pool.clone(); + let prometheus_registry = params.config.prometheus_registry().cloned(); + + let ServiceComponents { + network, + task_manager, telemetry_on_connect_sinks, rpc_handlers, .. + } = service::build(params)?; + + let (block_import, link_half, babe_link) = import_setup; + + let shared_voter_state = rpc_setup; + + let known_oracle = client.clone(); + + let mut handles = FullNodeHandles::default(); + let gossip_validator_select_chain = select_chain.clone(); + + let is_known = move |block_hash: &Hash| { + use consensus_common::BlockStatus; + + match known_oracle.block_status(&BlockId::hash(*block_hash)) { + Err(_) | Ok(BlockStatus::Unknown) | Ok(BlockStatus::Queued) => None, + Ok(BlockStatus::KnownBad) => Some(Known::Bad), + Ok(BlockStatus::InChainWithState) | Ok(BlockStatus::InChainPruned) => { + match gossip_validator_select_chain.leaves() { + Err(_) => None, + Ok(leaves) => if leaves.contains(block_hash) { + Some(Known::Leaf) + } else { + Some(Known::Old) + }, + } + } + } + }; + + let polkadot_network_service = network_protocol::start( + network.clone(), + network_protocol::Config { + collating_for: collating_for, + }, + (is_known, client.clone()), + client.clone(), + task_manager.spawn_handle(), + ).map_err(|e| format!("Could not spawn network worker: {:?}", e))?; + + let authority_handles = if is_collator || role.is_authority() { + let availability_store = { + use std::path::PathBuf; + + let mut path = PathBuf::from(db_path); + path.push("availability"); + + #[cfg(not(target_os = "unknown"))] + { + av_store::Store::new( + ::av_store::Config { + cache_size: None, + path, + }, + polkadot_network_service.clone(), + )? + } - let can_author_with = - consensus_common::CanAuthorWithNativeVersion::new(client.executor().clone()); + #[cfg(target_os = "unknown")] + av_store::Store::new_in_memory(gossip) + }; - let block_import = availability_store.block_import( - block_import, - client.clone(), - task_manager.spawn_handle(), - keystore.clone(), - )?; + polkadot_network_service.register_availability_store(availability_store.clone()); - let babe_config = babe::BabeParams { - keystore: keystore.clone(), - client: client.clone(), - select_chain, - block_import, - env: proposer, - sync_oracle: network.clone(), - inherent_data_providers: inherent_data_providers.clone(), - force_authoring, - babe_link, - can_author_with, - }; + let (validation_service_handle, validation_service) = consensus::ServiceBuilder { + client: client.clone(), + network: polkadot_network_service.clone(), + collators: polkadot_network_service.clone(), + spawner: task_manager.spawn_handle(), + availability_store: availability_store.clone(), + select_chain: select_chain.clone(), + keystore: keystore.clone(), + max_block_data_size, + }.build(); - let babe = babe::start_babe(babe_config)?; - task_manager.spawn_essential_handle().spawn_blocking("babe", babe); - } + task_manager.spawn_essential_handle().spawn("validation-service", Box::pin(validation_service)); - if matches!(role, Role::Authority{..} | Role::Sentry{..}) { - if !authority_discovery_disabled { - let (sentries, authority_discovery_role) = match role { - Role::Authority { ref sentry_nodes } => ( - sentry_nodes.clone(), - authority_discovery::Role::Authority ( - keystore.clone(), - ), - ), - Role::Sentry {..} => ( - vec![], - authority_discovery::Role::Sentry, - ), - _ => unreachable!("Due to outer matches! constraint; qed."), - }; - - let network_event_stream = network.event_stream("authority-discovery"); - let dht_event_stream = network_event_stream.filter_map(|e| async move { match e { - Event::Dht(e) => Some(e), - _ => None, - }}).boxed(); - let authority_discovery = authority_discovery::AuthorityDiscovery::new( - client.clone(), - network.clone(), - sentries, - dht_event_stream, - authority_discovery_role, - prometheus_registry.clone(), - ); + handles.validation_service_handle = Some(validation_service_handle.clone()); - task_manager.spawn_handle().spawn("authority-discovery", authority_discovery); - } - } + Some((validation_service_handle, availability_store)) + } else { + None + }; - // if the node isn't actively participating in consensus then it doesn't - // need a keystore, regardless of which protocol we use below. - let keystore = if is_authority { - Some(keystore as BareCryptoStorePtr) - } else { - None - }; + if role.is_authority() { + let (validation_service_handle, availability_store) = authority_handles + .clone() + .expect("Authority handles are set for authority nodes; qed"); - let config = grandpa::Config { - // FIXME substrate#1578 make this available through chainspec - gossip_duration: Duration::from_millis(1000), - justification_period: 512, - name: Some(name), - observer_enabled: false, - keystore, - is_authority: role.is_network_authority(), + let proposer = consensus::ProposerFactory::new( + client.clone(), + transaction_pool, + validation_service_handle, + slot_duration, + prometheus_registry.as_ref(), + ); + + let can_author_with = + consensus_common::CanAuthorWithNativeVersion::new(client.executor().clone()); + + let block_import = availability_store.block_import( + block_import, + client.clone(), + task_manager.spawn_handle(), + keystore.clone(), + )?; + + let babe_config = babe::BabeParams { + keystore: keystore.clone(), + client: client.clone(), + select_chain, + block_import, + env: proposer, + sync_oracle: network.clone(), + inherent_data_providers: inherent_data_providers.clone(), + force_authoring, + babe_link, + can_author_with, }; - let enable_grandpa = !disable_grandpa; - if enable_grandpa { - // start the full GRANDPA voter - // NOTE: unlike in substrate we are currently running the full - // GRANDPA voter protocol for all full nodes (regardless of whether - // they're validators or not). at this point the full voter should - // provide better guarantees of block and vote data availability than - // the observer. - - // add a custom voting rule to temporarily stop voting for new blocks - // after the given pause block is finalized and restarting after the - // given delay. - let voting_rule = match $grandpa_pause { - Some((block, delay)) => { - info!("GRANDPA scheduled voting pause set for block #{} with a duration of {} blocks.", - block, - delay, - ); - - grandpa::VotingRulesBuilder::default() - .add($crate::grandpa_support::PauseAfterBlockFor(block, delay)) - .build() - }, - None => - grandpa::VotingRulesBuilder::default() - .build(), - }; + let babe = babe::start_babe(babe_config)?; + task_manager.spawn_essential_handle().spawn_blocking("babe", babe); + } - let grandpa_config = grandpa::GrandpaParams { - config, - link: link_half, - network: network.clone(), - inherent_data_providers: inherent_data_providers.clone(), - telemetry_on_connect: Some(telemetry_on_connect_sinks.on_connect_stream()), - voting_rule, - prometheus_registry: prometheus_registry.clone(), - shared_voter_state, + if matches!(role, Role::Authority{..} | Role::Sentry{..}) { + if !authority_discovery_disabled { + let (sentries, authority_discovery_role) = match role { + Role::Authority { ref sentry_nodes } => ( + sentry_nodes.clone(), + authority_discovery::Role::Authority ( + keystore.clone(), + ), + ), + Role::Sentry {..} => ( + vec![], + authority_discovery::Role::Sentry, + ), + _ => unreachable!("Due to outer matches! constraint; qed."), }; - task_manager.spawn_essential_handle().spawn_blocking( - "grandpa-voter", - grandpa::run_grandpa_voter(grandpa_config)? - ); - } else { - grandpa::setup_disabled_grandpa( + let network_event_stream = network.event_stream("authority-discovery"); + let dht_event_stream = network_event_stream.filter_map(|e| async move { match e { + Event::Dht(e) => Some(e), + _ => None, + }}).boxed(); + let authority_discovery = authority_discovery::AuthorityDiscovery::new( client.clone(), - &inherent_data_providers, network.clone(), - )?; + sentries, + dht_event_stream, + authority_discovery_role, + prometheus_registry.clone(), + ); + + task_manager.spawn_handle().spawn("authority-discovery", authority_discovery); } + } - handles.polkadot_network = Some(polkadot_network_service); - (task_manager, client, handles, network, rpc_handlers) - }}; - ( - $config:expr, - $collating_for:expr, - $max_block_data_size:expr, - $authority_discovery_disabled:expr, - $slot_duration:expr, - $grandpa_pause:expr, - $runtime:ty, - $dispatch:ty, - ) => {{ - new_full!(with_full_start - $config, - $collating_for, - $max_block_data_size, - $authority_discovery_disabled, - $slot_duration, - $grandpa_pause, - new_full_start!($config, $runtime, $dispatch), - ) - }}; - ( - test - $config:expr, - $collating_for:expr, - $max_block_data_size:expr, - $authority_discovery_disabled:expr, - $slot_duration:expr, - $runtime:ty, - $dispatch:ty, - ) => {{ - new_full!(with_full_start - $config, - $collating_for, - $max_block_data_size, - $authority_discovery_disabled, - $slot_duration, - None, - new_full_start!(test $config, $runtime, $dispatch), - ) - }}; + // if the node isn't actively participating in consensus then it doesn't + // need a keystore, regardless of which protocol we use below. + let keystore = if is_authority { + Some(keystore as BareCryptoStorePtr) + } else { + None + }; + + let config = grandpa::Config { + // FIXME substrate#1578 make this available through chainspec + gossip_duration: Duration::from_millis(1000), + justification_period: 512, + name: Some(name), + observer_enabled: false, + keystore, + is_authority: role.is_network_authority(), + }; + + let enable_grandpa = !disable_grandpa; + if enable_grandpa { + // start the full GRANDPA voter + // NOTE: unlike in substrate we are currently running the full + // GRANDPA voter protocol for all full nodes (regardless of whether + // they're validators or not). at this point the full voter should + // provide better guarantees of block and vote data availability than + // the observer. + + // add a custom voting rule to temporarily stop voting for new blocks + // after the given pause block is finalized and restarting after the + // given delay. + let voting_rule = match grandpa_pause { + Some((block, delay)) => { + info!("GRANDPA scheduled voting pause set for block #{} with a duration of {} blocks.", + block, + delay, + ); + + grandpa::VotingRulesBuilder::default() + .add(crate::grandpa_support::PauseAfterBlockFor(block, delay)) + .build() + }, + None => + grandpa::VotingRulesBuilder::default() + .build(), + }; + + let grandpa_config = grandpa::GrandpaParams { + config, + link: link_half, + network: network.clone(), + inherent_data_providers: inherent_data_providers.clone(), + telemetry_on_connect: Some(telemetry_on_connect_sinks.on_connect_stream()), + voting_rule, + prometheus_registry: prometheus_registry.clone(), + shared_voter_state, + }; + + task_manager.spawn_essential_handle().spawn_blocking( + "grandpa-voter", + grandpa::run_grandpa_voter(grandpa_config)? + ); + } else { + grandpa::setup_disabled_grandpa( + client.clone(), + &inherent_data_providers, + network.clone(), + )?; + } + + handles.polkadot_network = Some(polkadot_network_service); + Ok((task_manager, client, handles, network, rpc_handlers)) } /// Builds a new service for a light client. -#[macro_export] -macro_rules! new_light { - ($config:expr, $runtime:ty, $dispatch:ty) => {{ - // If we're using prometheus, use a registry with a prefix of `polkadot`. - if let Some(PrometheusConfig { registry, .. }) = $config.prometheus_config.as_mut() { - *registry = Registry::new_custom(Some("polkadot".into()), None)?; - } - let inherent_data_providers = inherents::InherentDataProviders::new(); - - ServiceBuilder::new_light::($config)? - .with_select_chain(|_, backend| { - Ok(sc_consensus::LongestChain::new(backend.clone())) - })? - .with_transaction_pool(|builder| { - let fetcher = builder.fetcher() - .ok_or_else(|| "Trying to start light transaction pool without active fetcher")?; - let pool_api = sc_transaction_pool::LightChainApi::new( - builder.client().clone(), - fetcher, - ); - let pool = Arc::new(sc_transaction_pool::BasicPool::new_light( - builder.config().transaction_pool.clone(), - Arc::new(pool_api), - builder.prometheus_registry(), - builder.spawn_handle(), - )); - Ok(pool) - })? - .with_import_queue_and_fprb(| - _config, - client, - backend, - fetcher, - mut select_chain, - _, - spawn_task_handle, - registry, - | { - let select_chain = select_chain.take() - .ok_or_else(|| service::Error::SelectChainRequired)?; - - let fetch_checker = fetcher - .map(|fetcher| fetcher.checker().clone()) - .ok_or_else(|| "Trying to start light import queue without active fetch checker")?; - - let grandpa_block_import = grandpa::light_block_import( - client.clone(), backend, &(client.clone() as Arc<_>), Arc::new(fetch_checker) - )?; - - let finality_proof_import = grandpa_block_import.clone(); - let finality_proof_request_builder = - finality_proof_import.create_finality_proof_request_builder(); - - let (babe_block_import, babe_link) = babe::block_import( - babe::Config::get_or_compute(&*client)?, - grandpa_block_import, - client.clone(), - )?; - - // FIXME: pruning task isn't started since light client doesn't do `AuthoritySetup`. - let import_queue = babe::import_queue( - babe_link, - babe_block_import, - None, - Some(Box::new(finality_proof_import)), - client, - select_chain, - inherent_data_providers.clone(), - spawn_task_handle, - registry, - )?; - - Ok((import_queue, finality_proof_request_builder)) - })? - .with_finality_proof_provider(|client, backend| { - let provider = client as Arc>; - Ok(Arc::new(grandpa::FinalityProofProvider::new(backend, provider)) as _) - })? - .with_rpc_extensions(|builder| { - let fetcher = builder.fetcher() - .ok_or_else(|| "Trying to start node RPC without active fetcher")?; - let remote_blockchain = builder.remote_backend() - .ok_or_else(|| "Trying to start node RPC without active remote blockchain")?; - - let light_deps = polkadot_rpc::LightDeps { - remote_blockchain, - fetcher, - client: builder.client().clone(), - pool: builder.pool(), - }; - Ok(polkadot_rpc::create_light(light_deps)) - })? - .build_light() - .map(|ServiceComponents { task_manager, rpc_handlers, .. }| { - (task_manager, rpc_handlers) - }) - }} +fn new_light(mut config: Configuration) -> Result<(TaskManager, Arc), Error> + where + Runtime: 'static + Send + Sync + ConstructRuntimeApi>, + >>::RuntimeApi: + RuntimeApiCollection>, + Dispatch: NativeExecutionDispatch + 'static, + Extrinsic: RuntimeExtrinsic, +{ + use sc_client_api::backend::RemoteBackend; + + // If we're using prometheus, use a registry with a prefix of `polkadot`. + if let Some(PrometheusConfig { registry, .. }) = config.prometheus_config.as_mut() { + *registry = Registry::new_custom(Some("polkadot".into()), None)?; + } + + let (client, backend, keystore, task_manager, on_demand) = + service::new_light_parts::(&config)?; + + let select_chain = sc_consensus::LongestChain::new(backend.clone()); + + let pool_api = sc_transaction_pool::LightChainApi::new( + client.clone(), + on_demand.clone(), + ); + let transaction_pool = Arc::new(sc_transaction_pool::BasicPool::new_light( + config.transaction_pool.clone(), + Arc::new(pool_api), + config.prometheus_registry(), + task_manager.spawn_handle(), + )); + + let grandpa_block_import = grandpa::light_block_import( + client.clone(), backend.clone(), &(client.clone() as Arc<_>), + Arc::new(on_demand.checker().clone()), + )?; + + let finality_proof_import = grandpa_block_import.clone(); + let finality_proof_request_builder = + finality_proof_import.create_finality_proof_request_builder(); + + let (babe_block_import, babe_link) = babe::block_import( + babe::Config::get_or_compute(&*client)?, + grandpa_block_import, + client.clone(), + )?; + + let inherent_data_providers = inherents::InherentDataProviders::new(); + + // FIXME: pruning task isn't started since light client doesn't do `AuthoritySetup`. + let import_queue = babe::import_queue( + babe_link, + babe_block_import, + None, + Some(Box::new(finality_proof_import)), + client.clone(), + select_chain.clone(), + inherent_data_providers.clone(), + &task_manager.spawn_handle(), + config.prometheus_registry(), + )?; + + let provider = client.clone() as Arc>; + let finality_proof_provider = Arc::new(GrandpaFinalityProofProvider::new(backend.clone(), provider)); + + let light_deps = polkadot_rpc::LightDeps { + remote_blockchain: backend.remote_blockchain(), + fetcher: on_demand.clone(), + client: client.clone(), + pool: transaction_pool.clone(), + }; + + let rpc_extensions = polkadot_rpc::create_light(light_deps); + + let ServiceComponents { task_manager, rpc_handlers, .. } = service::build(service::ServiceParams { + config, + block_announce_validator_builder: None, + finality_proof_request_builder: Some(finality_proof_request_builder), + finality_proof_provider: Some(finality_proof_provider), + on_demand: Some(on_demand), + remote_blockchain: Some(backend.remote_blockchain()), + rpc_extensions_builder: Box::new(service::NoopRpcExtensionBuilder(rpc_extensions)), + client: client.clone(), + transaction_pool: transaction_pool.clone(), + import_queue, keystore, backend, task_manager, + })?; + + Ok((task_manager, rpc_handlers)) } /// Builds a new object suitable for chain operations. +#[cfg(feature = "full-node")] pub fn new_chain_ops(mut config: Configuration) -> Result< ( - Arc>, - Arc>, + Arc>, + Arc, consensus_common::import_queue::BasicQueue>, TaskManager, ), ServiceError > where - Runtime: ConstructRuntimeApi> + Send + Sync + 'static, + Runtime: ConstructRuntimeApi> + Send + Sync + 'static, Runtime::RuntimeApi: - RuntimeApiCollection, Block>>, + RuntimeApiCollection>, Dispatch: NativeExecutionDispatch + 'static, Extrinsic: RuntimeExtrinsic, { config.keystore = service::config::KeystoreConfig::InMemory; - let (builder, _, _, _) = new_full_start!(config, Runtime, Dispatch); - Ok(builder.to_chain_ops_parts()) + let (service::ServiceParams { client, backend, import_queue, task_manager, .. }, ..) + = full_params::(config, false)?; + Ok((client, backend, import_queue, task_manager)) } /// Create a new Polkadot service for a full node. #[cfg(feature = "full-node")] pub fn polkadot_new_full( - mut config: Configuration, + config: Configuration, collating_for: Option<(CollatorId, parachain::Id)>, max_block_data_size: Option, authority_discovery_disabled: bool, @@ -742,22 +697,21 @@ pub fn polkadot_new_full( TaskManager, Arc, + FullBackend, polkadot_runtime::RuntimeApi >>, FullNodeHandles, ), ServiceError> { - let (service, client, handles, _, _) = new_full!( + let (service, client, handles, _, _) = new_full::( config, collating_for, max_block_data_size, authority_discovery_disabled, slot_duration, grandpa_pause, - polkadot_runtime::RuntimeApi, - PolkadotExecutor, - ); + false, + )?; Ok((service, client, handles)) } @@ -765,7 +719,7 @@ pub fn polkadot_new_full( /// Create a new Kusama service for a full node. #[cfg(feature = "full-node")] pub fn kusama_new_full( - mut config: Configuration, + config: Configuration, collating_for: Option<(CollatorId, parachain::Id)>, max_block_data_size: Option, authority_discovery_disabled: bool, @@ -775,23 +729,22 @@ pub fn kusama_new_full( TaskManager, Arc, + FullBackend, kusama_runtime::RuntimeApi > >, FullNodeHandles ), ServiceError> { - let (service, client, handles, _, _) = new_full!( + let (service, client, handles, _, _) = new_full::( config, collating_for, max_block_data_size, authority_discovery_disabled, slot_duration, grandpa_pause, - kusama_runtime::RuntimeApi, - KusamaExecutor, - ); + false, + )?; Ok((service, client, handles)) } @@ -799,7 +752,7 @@ pub fn kusama_new_full( /// Create a new Kusama service for a full node. #[cfg(feature = "full-node")] pub fn westend_new_full( - mut config: Configuration, + config: Configuration, collating_for: Option<(CollatorId, parachain::Id)>, max_block_data_size: Option, authority_discovery_disabled: bool, @@ -810,22 +763,21 @@ pub fn westend_new_full( TaskManager, Arc, + FullBackend, westend_runtime::RuntimeApi >>, FullNodeHandles, ), ServiceError> { - let (service, client, handles, _, _) = new_full!( + let (service, client, handles, _, _) = new_full::( config, collating_for, max_block_data_size, authority_discovery_disabled, slot_duration, grandpa_pause, - westend_runtime::RuntimeApi, - WestendExecutor, - ); + false, + )?; Ok((service, client, handles)) } @@ -842,25 +794,25 @@ pub struct FullNodeHandles { } /// Create a new Polkadot service for a light client. -pub fn polkadot_new_light(mut config: Configuration) -> Result< +pub fn polkadot_new_light(config: Configuration) -> Result< (TaskManager, Arc), ServiceError > { - new_light!(config, polkadot_runtime::RuntimeApi, PolkadotExecutor) + new_light::(config) } /// Create a new Kusama service for a light client. -pub fn kusama_new_light(mut config: Configuration) -> Result< +pub fn kusama_new_light(config: Configuration) -> Result< (TaskManager, Arc), ServiceError > { - new_light!(config, kusama_runtime::RuntimeApi, KusamaExecutor) + new_light::(config) } /// Create a new Westend service for a light client. -pub fn westend_new_light(mut config: Configuration, ) -> Result< +pub fn westend_new_light(config: Configuration, ) -> Result< (TaskManager, Arc), ServiceError > { - new_light!(config, westend_runtime::RuntimeApi, KusamaExecutor) + new_light::(config) } -- GitLab From 08fcbda4f1675012b832c341ec7fd50039b5fd7b Mon Sep 17 00:00:00 2001 From: Bernhard Schuster Date: Thu, 23 Jul 2020 14:46:22 +0200 Subject: [PATCH 094/192] implement bitfield distribution subsystem (#1368) * feat bitfield distribution * feat bitfield distribution part 2 * pair programming with rustc & cargo * lets go * move bitfield-distribution to the node/network folder * shape shifting * lunchtime * ignore the two fn recursion for now * step by step * triplesteps * bandaid commit * unordered futures magic * chore * reword markdown * clarify * lacks abortable processing impl details * slimify * fix: warnings and avoid ctx.clone() improve comments * review comments * fix details * make sure outgoing messages are tracked * fix name * fix subsystem * partial test impl * relax context bounds * test * X * X * initial test * fix relay_message not tracked when origin is self * fix/guide: grammar Co-authored-by: Robert Habermeier * work around missing Eq+PartialEq * fix: add missing message to provisioner * unify per_job to job_data * fix/review: part one * fix/review: more grumbles * fix/review: track incoming messages per peer * fix/review: extract fn, avoid nested matches * fix/review: more tests, simplify test * fix/review: extend tests to cover more cases * chore/rename: Tracker -> ProtocolState * chore check and comment rewording * feat test: invalid peer message * remove ignored test cases and unused macros * fix master merge fallout + warnings Co-authored-by: Robert Habermeier --- Cargo.lock | 140 ++- Cargo.toml | 1 + node/network/bitfield-distribution/Cargo.toml | 29 + node/network/bitfield-distribution/src/lib.rs | 1095 +++++++++++++++++ node/subsystem/src/messages.rs | 1 - .../availability/bitfield-distribution.md | 26 +- 6 files changed, 1278 insertions(+), 14 deletions(-) create mode 100644 node/network/bitfield-distribution/Cargo.toml create mode 100644 node/network/bitfield-distribution/src/lib.rs diff --git a/Cargo.lock b/Cargo.lock index 4b7393a17e..4f58980d5f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -219,6 +219,35 @@ version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7deb0a829ca7bcfaf5da70b073a8d128619259a7be8216a355e23f00763059e5" +[[package]] +name = "async-channel" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee81ba99bee79f3c8ae114ae4baa7eaa326f63447cf2ec65e4393618b63f8770" +dependencies = [ + "concurrent-queue", + "event-listener", + "futures-core", +] + +[[package]] +name = "async-io" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a0fc2017a5cca12763bb5636092a7786b52789c23c5838a392db2eb99963fd3" +dependencies = [ + "cfg-if", + "concurrent-queue", + "futures-lite", + "libc", + "once_cell", + "parking", + "socket2", + "vec-arena", + "wepoll-sys-stjepang", + "winapi 0.3.9", +] + [[package]] name = "async-std" version = "1.6.2" @@ -239,7 +268,7 @@ dependencies = [ "pin-project-lite", "pin-utils", "slab", - "smol", + "smol 0.1.18", "wasm-bindgen-futures", ] @@ -272,6 +301,12 @@ dependencies = [ "syn 1.0.33", ] +[[package]] +name = "atomic-waker" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "065374052e7df7ee4047b1160cca5e1467a12351a40b3da123c870ba0b8eda2a" + [[package]] name = "atty" version = "0.2.14" @@ -469,12 +504,13 @@ dependencies = [ [[package]] name = "blocking" -version = "0.4.6" +version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d17efb70ce4421e351d61aafd90c16a20fb5bfe339fcdc32a86816280e62ce0" +checksum = "d2468ff7bf85066b4a3678fede6fe66db31846d753ff0adfbfab2c6a6e81612b" dependencies = [ - "futures-channel", - "futures-util", + "async-channel", + "atomic-waker", + "futures-lite", "once_cell", "parking", "waker-fn", @@ -1155,6 +1191,12 @@ dependencies = [ "serde_json", ] +[[package]] +name = "event-listener" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "699d84875f1b72b4da017e6b0f77dfa88c0137f089958a88974d15938cbc2976" + [[package]] name = "exit-future" version = "0.2.0" @@ -1593,6 +1635,19 @@ version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "de27142b013a8e869c14957e6d2edeef89e97c289e69d042ee3a49acd8b51789" +[[package]] +name = "futures-lite" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af0bbcb0ec905ef6ee23fab499119b5da2362b8697d66e08d1ef01a8c0d438e2" +dependencies = [ + "fastrand", + "futures-core", + "futures-io", + "memchr", + "pin-project-lite", +] + [[package]] name = "futures-macro" version = "0.3.5" @@ -2988,6 +3043,12 @@ dependencies = [ "libc", ] +[[package]] +name = "maplit" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e2e65a1a2e43cfcb47a895c4c8b10d1f4a61097f9f254f183aee60cad9c651d" + [[package]] name = "matches" version = "0.1.8" @@ -3198,6 +3259,17 @@ dependencies = [ "unsigned-varint 0.4.0", ] +[[package]] +name = "multitask" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c09c35271e7dcdb5f709779111f2c8e8ab8e06c1b587c1c6a9e179d865aaa5b4" +dependencies = [ + "async-task", + "concurrent-queue", + "fastrand", +] + [[package]] name = "nalgebra" version = "0.18.1" @@ -4102,9 +4174,9 @@ checksum = "ddfc878dac00da22f8f61e7af3157988424567ab01d9920b962ef7dcbd7cd865" [[package]] name = "parking" -version = "1.0.4" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1efcee3c6d23b94012e240525f131c6abaa9e5eeb8f211002d93beec3b7be350" +checksum = "50d4a6da31f8144a32532fe38fe8fb439a6842e0ec633f0037f0144c14e7f907" [[package]] name = "parking_lot" @@ -4277,6 +4349,31 @@ dependencies = [ "tempfile", ] +[[package]] +name = "polkadot-availability-bitfield-distribution" +version = "0.1.0" +dependencies = [ + "assert_matches", + "bitvec", + "env_logger", + "futures 0.3.5", + "futures-timer 3.0.2", + "log 0.4.8", + "maplit", + "parity-scale-codec", + "parking_lot 0.10.2", + "polkadot-network", + "polkadot-network-bridge", + "polkadot-node-primitives", + "polkadot-node-subsystem", + "polkadot-primitives", + "sc-network", + "smol 0.2.0", + "smol-timeout", + "sp-core", + "streamunordered", +] + [[package]] name = "polkadot-availability-store" version = "0.8.19" @@ -7147,6 +7244,29 @@ dependencies = [ "winapi 0.3.9", ] +[[package]] +name = "smol" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "346a94824d48ed7c5fc7247f3cbbf0317bdfe15fc39d08f9262609cccce61254" +dependencies = [ + "async-io", + "blocking", + "multitask", + "num_cpus", + "once_cell", +] + +[[package]] +name = "smol-timeout" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "024818c1f00b80e8171ddcfcee33860134293aa3aced60c9cbd7a5a2d41db392" +dependencies = [ + "pin-project", + "smol 0.1.18", +] + [[package]] name = "snow" version = "0.7.1" @@ -8929,6 +9049,12 @@ version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6454029bf181f092ad1b853286f23e2c507d8e8194d01d92da4a55c274a5508c" +[[package]] +name = "vec-arena" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17dfb54bf57c9043f4616cb03dab30eff012cc26631b797d8354b916708db919" + [[package]] name = "vec_map" version = "0.8.2" diff --git a/Cargo.toml b/Cargo.toml index 4d6b40feb7..28ad17ac4d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -47,6 +47,7 @@ members = [ "node/network/bridge", "node/network/pov-distribution", "node/network/statement-distribution", + "node/network/bitfield-distribution", "node/overseer", "node/primitives", "node/service", diff --git a/node/network/bitfield-distribution/Cargo.toml b/node/network/bitfield-distribution/Cargo.toml new file mode 100644 index 0000000000..a6dab03071 --- /dev/null +++ b/node/network/bitfield-distribution/Cargo.toml @@ -0,0 +1,29 @@ +[package] +name = "polkadot-availability-bitfield-distribution" +version = "0.1.0" +authors = ["Parity Technologies "] +edition = "2018" + +[dependencies] +futures = "0.3.5" +futures-timer = "3.0.2" +log = "0.4.8" +streamunordered = "0.5.1" +codec = { package="parity-scale-codec", version = "1.3.0" } +node-primitives = { package = "polkadot-node-primitives", path = "../../primitives" } +polkadot-primitives = { path = "../../../primitives" } +polkadot-subsystem = { package = "polkadot-node-subsystem", path = "../../subsystem" } +polkadot-network-bridge = { path = "../../network/bridge" } +polkadot-network = { path = "../../../network" } +sc-network = { git = "https://github.com/paritytech/substrate", branch = "master" } + +[dev-dependencies] +polkadot-subsystem = { package = "polkadot-node-subsystem", path = "../../subsystem", features = [ "test-helpers" ] } +bitvec = { version = "0.17.4", default-features = false, features = ["alloc"] } +sp-core = { git = "https://github.com/paritytech/substrate", branch = "master" } +parking_lot = "0.10.0" +maplit = "1.0.2" +smol = "0.2.0" +smol-timeout = "0.1.0" +env_logger = "0.7.1" +assert_matches = "1.3.0" \ No newline at end of file diff --git a/node/network/bitfield-distribution/src/lib.rs b/node/network/bitfield-distribution/src/lib.rs new file mode 100644 index 0000000000..bc7c6690c6 --- /dev/null +++ b/node/network/bitfield-distribution/src/lib.rs @@ -0,0 +1,1095 @@ +// Copyright 2020 Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Polkadot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . + +//! The bitfield distribution +//! +//! In case this node is a validator, gossips its own signed availability bitfield +//! for a particular relay parent. +//! Independently of that, gossips on received messages from peers to other interested peers. + +use codec::{Decode, Encode}; +use futures::{channel::oneshot, FutureExt}; + +use node_primitives::{ProtocolId, View}; + +use log::{trace, warn}; +use polkadot_subsystem::messages::*; +use polkadot_subsystem::{ + FromOverseer, OverseerSignal, SpawnedSubsystem, Subsystem, SubsystemContext, SubsystemResult, +}; +use polkadot_primitives::v1::{Hash, SignedAvailabilityBitfield, SigningContext, ValidatorId}; +use sc_network::ReputationChange; +use std::collections::{HashMap, HashSet}; + +const COST_SIGNATURE_INVALID: ReputationChange = + ReputationChange::new(-100, "Bitfield signature invalid"); +const COST_VALIDATOR_INDEX_INVALID: ReputationChange = + ReputationChange::new(-100, "Bitfield validator index invalid"); +const COST_MISSING_PEER_SESSION_KEY: ReputationChange = + ReputationChange::new(-133, "Missing peer session key"); +const COST_NOT_IN_VIEW: ReputationChange = + ReputationChange::new(-51, "Not interested in that parent hash"); +const COST_MESSAGE_NOT_DECODABLE: ReputationChange = + ReputationChange::new(-100, "Not interested in that parent hash"); +const COST_PEER_DUPLICATE_MESSAGE: ReputationChange = + ReputationChange::new(-500, "Peer sent the same message multiple times"); +const GAIN_VALID_MESSAGE_FIRST: ReputationChange = + ReputationChange::new(15, "Valid message with new information"); +const GAIN_VALID_MESSAGE: ReputationChange = + ReputationChange::new(10, "Valid message"); + +/// Checked signed availability bitfield that is distributed +/// to other peers. +#[derive(Encode, Decode, Debug, Clone, PartialEq, Eq)] +pub struct BitfieldGossipMessage { + /// The relay parent this message is relative to. + pub relay_parent: Hash, + /// The actual signed availability bitfield. + pub signed_availability: SignedAvailabilityBitfield, +} + +/// Data used to track information of peers and relay parents the +/// overseer ordered us to work on. +#[derive(Default, Clone)] +struct ProtocolState { + /// track all active peers and their views + /// to determine what is relevant to them. + peer_views: HashMap, + + /// Our current view. + view: View, + + /// Additional data particular to a relay parent. + per_relay_parent: HashMap, +} + +/// Data for a particular relay parent. +#[derive(Debug, Clone, Default)] +struct PerRelayParentData { + /// Signing context for a particular relay parent. + signing_context: SigningContext, + + /// Set of validators for a particular relay parent. + validator_set: Vec, + + /// Set of validators for a particular relay parent for which we + /// received a valid `BitfieldGossipMessage`. + /// Also serves as the list of known messages for peers connecting + /// after bitfield gossips were already received. + one_per_validator: HashMap, + + /// Avoid duplicate message transmission to our peers. + message_sent_to_peer: HashMap>, + + /// Track messages that were already received by a peer + /// to prevent flooding. + message_received_from_peer: HashMap>, +} + +impl PerRelayParentData { + /// Determines if that particular message signed by a validator is needed by the given peer. + fn message_from_validator_needed_by_peer( + &self, + peer: &PeerId, + validator: &ValidatorId, + ) -> bool { + if let Some(set) = self.message_sent_to_peer.get(peer) { + !set.contains(validator) + } else { + false + } + } +} + +fn network_update_message(n: NetworkBridgeEvent) -> AllMessages { + AllMessages::BitfieldDistribution(BitfieldDistributionMessage::NetworkBridgeUpdate(n)) +} + +/// The bitfield distribution subsystem. +pub struct BitfieldDistribution; + +impl BitfieldDistribution { + /// The protocol identifier for bitfield distribution. + const PROTOCOL_ID: ProtocolId = *b"bitd"; + + /// Start processing work as passed on from the Overseer. + async fn run(mut ctx: Context) -> SubsystemResult<()> + where + Context: SubsystemContext, + { + // startup: register the network protocol with the bridge. + ctx.send_message(AllMessages::NetworkBridge( + NetworkBridgeMessage::RegisterEventProducer(Self::PROTOCOL_ID, network_update_message), + )) + .await?; + + // work: process incoming messages from the overseer and process accordingly. + let mut state = ProtocolState::default(); + loop { + let message = ctx.recv().await?; + match message { + FromOverseer::Communication { + msg: BitfieldDistributionMessage::DistributeBitfield(hash, signed_availability), + } => { + trace!(target: "bitd", "Processing DistributeBitfield"); + handle_bitfield_distribution(&mut ctx, &mut state, hash, signed_availability) + .await?; + } + FromOverseer::Communication { + msg: BitfieldDistributionMessage::NetworkBridgeUpdate(event), + } => { + trace!(target: "bitd", "Processing NetworkMessage"); + // a network message was received + if let Err(e) = handle_network_msg(&mut ctx, &mut state, event).await { + warn!(target: "bitd", "Failed to handle incomming network messages: {:?}", e); + } + } + FromOverseer::Signal(OverseerSignal::StartWork(relay_parent)) => { + trace!(target: "bitd", "Start {:?}", relay_parent); + // query basic system parameters once + let (validator_set, signing_context) = + query_basics(&mut ctx, relay_parent).await?; + + let _ = state.per_relay_parent.insert( + relay_parent, + PerRelayParentData { + signing_context, + validator_set, + ..Default::default() + }, + ); + } + FromOverseer::Signal(OverseerSignal::StopWork(relay_parent)) => { + trace!(target: "bitd", "Stop {:?}", relay_parent); + // defer the cleanup to the view change + } + FromOverseer::Signal(OverseerSignal::Conclude) => { + trace!(target: "bitd", "Conclude"); + return Ok(()); + } + } + } + } +} + +/// Modify the reputation of a peer based on its behaviour. +async fn modify_reputation( + ctx: &mut Context, + peer: PeerId, + rep: ReputationChange, +) -> SubsystemResult<()> +where + Context: SubsystemContext, +{ + trace!(target: "bitd", "Reputation change of {:?} for peer {:?}", rep, peer); + ctx.send_message(AllMessages::NetworkBridge( + NetworkBridgeMessage::ReportPeer(peer, rep), + )) + .await +} + +/// Distribute a given valid and signature checked bitfield message. +/// +/// For this variant the source is this node. +async fn handle_bitfield_distribution( + ctx: &mut Context, + state: &mut ProtocolState, + relay_parent: Hash, + signed_availability: SignedAvailabilityBitfield, +) -> SubsystemResult<()> +where + Context: SubsystemContext, +{ + // Ignore anything the overseer did not tell this subsystem to work on + let mut job_data = state.per_relay_parent.get_mut(&relay_parent); + let job_data: &mut _ = if let Some(ref mut job_data) = job_data { + job_data + } else { + trace!( + target: "bitd", + "Not supposed to work on relay parent {} related data", + relay_parent + ); + + return Ok(()); + }; + let validator_set = &job_data.validator_set; + if validator_set.is_empty() { + trace!(target: "bitd", "Validator set for {:?} is empty", relay_parent); + return Ok(()); + } + + let validator_index = signed_availability.validator_index() as usize; + let validator = if let Some(validator) = validator_set.get(validator_index) { + validator.clone() + } else { + trace!(target: "bitd", "Could not find a validator for index {}", validator_index); + return Ok(()); + }; + + let peer_views = &mut state.peer_views; + let msg = BitfieldGossipMessage { + relay_parent, + signed_availability, + }; + + relay_message(ctx, job_data, peer_views, validator, msg).await?; + + Ok(()) +} + +/// Distribute a given valid and signature checked bitfield message. +/// +/// Can be originated by another subsystem or received via network from another peer. +async fn relay_message( + ctx: &mut Context, + job_data: &mut PerRelayParentData, + peer_views: &mut HashMap, + validator: ValidatorId, + message: BitfieldGossipMessage, +) -> SubsystemResult<()> +where + Context: SubsystemContext, +{ + // notify the overseer about a new and valid signed bitfield + ctx.send_message(AllMessages::Provisioner( + ProvisionerMessage::ProvisionableData(ProvisionableData::Bitfield( + message.relay_parent.clone(), + message.signed_availability.clone(), + )), + )) + .await?; + + let message_sent_to_peer = &mut (job_data.message_sent_to_peer); + + // pass on the bitfield distribution to all interested peers + let interested_peers = peer_views + .iter() + .filter_map(|(peer, view)| { + // check interest in the peer in this message's relay parent + if view.contains(&message.relay_parent) { + // track the message as sent for this peer + message_sent_to_peer + .entry(peer.clone()) + .or_default() + .insert(validator.clone()); + + Some(peer.clone()) + } else { + None + } + }) + .collect::>(); + + if interested_peers.is_empty() { + trace!( + target: "bitd", + "No peers are interested in gossip for relay parent {:?}", + message.relay_parent + ); + } else { + ctx.send_message(AllMessages::NetworkBridge( + NetworkBridgeMessage::SendMessage( + interested_peers, + BitfieldDistribution::PROTOCOL_ID, + message.encode(), + ), + )) + .await?; + } + Ok(()) +} + +/// Handle an incoming message from a peer. +async fn process_incoming_peer_message( + ctx: &mut Context, + state: &mut ProtocolState, + origin: PeerId, + message: BitfieldGossipMessage, +) -> SubsystemResult<()> +where + Context: SubsystemContext, +{ + // we don't care about this, not part of our view + if !state.view.contains(&message.relay_parent) { + return modify_reputation(ctx, origin, COST_NOT_IN_VIEW).await; + } + + // Ignore anything the overseer did not tell this subsystem to work on + let mut job_data = state.per_relay_parent.get_mut(&message.relay_parent); + let job_data: &mut _ = if let Some(ref mut job_data) = job_data { + job_data + } else { + return modify_reputation(ctx, origin, COST_NOT_IN_VIEW).await; + }; + + let validator_set = &job_data.validator_set; + if validator_set.is_empty() { + trace!( + target: "bitd", + "Validator set for relay parent {:?} is empty", + &message.relay_parent + ); + return modify_reputation(ctx, origin, COST_MISSING_PEER_SESSION_KEY).await; + } + + // Use the (untrusted) validator index provided by the signed payload + // and see if that one actually signed the availability bitset. + let signing_context = job_data.signing_context.clone(); + let validator_index = message.signed_availability.validator_index() as usize; + let validator = if let Some(validator) = validator_set.get(validator_index) { + validator.clone() + } else { + return modify_reputation(ctx, origin, COST_VALIDATOR_INDEX_INVALID).await; + }; + + // Check if the peer already sent us a message for the validator denoted in the message earlier. + // Must be done after validator index verification, in order to avoid storing an unbounded + // number of set entries. + let received_set = job_data + .message_received_from_peer + .entry(origin.clone()) + .or_default(); + + if !received_set.contains(&validator) { + received_set.insert(validator.clone()); + } else { + return modify_reputation(ctx, origin, COST_PEER_DUPLICATE_MESSAGE).await; + }; + + if message + .signed_availability + .check_signature(&signing_context, &validator) + .is_ok() + { + let one_per_validator = &mut (job_data.one_per_validator); + + // only relay_message a message of a validator once + if one_per_validator.get(&validator).is_some() { + trace!( + target: "bitd", + "Already received a message for validator at index {}", + validator_index + ); + modify_reputation(ctx, origin, GAIN_VALID_MESSAGE).await?; + return Ok(()); + } + one_per_validator.insert(validator.clone(), message.clone()); + + relay_message(ctx, job_data, &mut state.peer_views, validator, message).await?; + + modify_reputation(ctx, origin, GAIN_VALID_MESSAGE_FIRST).await + } else { + modify_reputation(ctx, origin, COST_SIGNATURE_INVALID).await + } +} +/// Deal with network bridge updates and track what needs to be tracked +/// which depends on the message type received. +async fn handle_network_msg( + ctx: &mut Context, + state: &mut ProtocolState, + bridge_message: NetworkBridgeEvent, +) -> SubsystemResult<()> +where + Context: SubsystemContext, +{ + match bridge_message { + NetworkBridgeEvent::PeerConnected(peerid, _role) => { + // insert if none already present + state.peer_views.entry(peerid).or_default(); + } + NetworkBridgeEvent::PeerDisconnected(peerid) => { + // get rid of superfluous data + state.peer_views.remove(&peerid); + } + NetworkBridgeEvent::PeerViewChange(peerid, view) => { + handle_peer_view_change(ctx, state, peerid, view).await?; + } + NetworkBridgeEvent::OurViewChange(view) => { + handle_our_view_change(state, view)?; + } + NetworkBridgeEvent::PeerMessage(remote, bytes) => { + if let Ok(gossiped_bitfield) = BitfieldGossipMessage::decode(&mut (bytes.as_slice())) { + trace!(target: "bitd", "Received bitfield gossip from peer {:?}", &remote); + process_incoming_peer_message(ctx, state, remote, gossiped_bitfield).await?; + } else { + modify_reputation(ctx, remote, COST_MESSAGE_NOT_DECODABLE).await?; + } + } + } + Ok(()) +} + +/// Handle the changes necassary when our view changes. +fn handle_our_view_change(state: &mut ProtocolState, view: View) -> SubsystemResult<()> { + let old_view = std::mem::replace(&mut (state.view), view); + + for added in state.view.difference(&old_view) { + if !state.per_relay_parent.contains_key(&added) { + warn!( + target: "bitd", + "Our view contains {} but the overseer never told use we should work on this", + &added + ); + } + } + for removed in old_view.difference(&state.view) { + // cleanup relay parents we are not interested in any more + let _ = state.per_relay_parent.remove(&removed); + } + Ok(()) +} + + +// Send the difference between two views which were not sent +// to that particular peer. +async fn handle_peer_view_change( + ctx: &mut Context, + state: &mut ProtocolState, + origin: PeerId, + view: View, +) -> SubsystemResult<()> +where + Context: SubsystemContext, +{ + let current = state.peer_views.entry(origin.clone()).or_default(); + + let delta_vec: Vec = (*current).difference(&view).cloned().collect(); + + *current = view; + + // Send all messages we've seen before and the peer is now interested + // in to that peer. + + let delta_set: Vec<(ValidatorId, BitfieldGossipMessage)> = delta_vec + .into_iter() + .filter_map(|new_relay_parent_interest| { + if let Some(job_data) = (&*state).per_relay_parent.get(&new_relay_parent_interest) { + // Send all jointly known messages for a validator (given the current relay parent) + // to the peer `origin`... + let one_per_validator = job_data.one_per_validator.clone(); + let origin = origin.clone(); + Some( + one_per_validator + .into_iter() + .filter(move |(validator, _message)| { + // ..except for the ones the peer already has + job_data.message_from_validator_needed_by_peer(&origin, validator) + }), + ) + } else { + // A relay parent is in the peers view, which is not in ours, ignore those. + None + } + }) + .flatten() + .collect(); + + for (validator, message) in delta_set.into_iter() { + send_tracked_gossip_message(ctx, state, origin.clone(), validator, message).await?; + } + + Ok(()) +} + +/// Send a gossip message and track it in the per relay parent data. +async fn send_tracked_gossip_message( + ctx: &mut Context, + state: &mut ProtocolState, + dest: PeerId, + validator: ValidatorId, + message: BitfieldGossipMessage, +) -> SubsystemResult<()> +where + Context: SubsystemContext, +{ + let job_data = if let Some(job_data) = state.per_relay_parent.get_mut(&message.relay_parent) { + job_data + } else { + return Ok(()); + }; + + let message_sent_to_peer = &mut (job_data.message_sent_to_peer); + message_sent_to_peer + .entry(dest.clone()) + .or_default() + .insert(validator.clone()); + + ctx.send_message(AllMessages::NetworkBridge( + NetworkBridgeMessage::SendMessage( + vec![dest], + BitfieldDistribution::PROTOCOL_ID, + message.encode(), + ), + )) + .await?; + + Ok(()) +} + +impl Subsystem for BitfieldDistribution +where + C: SubsystemContext + Sync + Send, +{ + fn start(self, ctx: C) -> SpawnedSubsystem { + SpawnedSubsystem { + name: "bitfield-distribution", + future: Box::pin(async move { Self::run(ctx) }.map(|_| ())), + } + } +} + +/// Query our validator set and signing context for a particular relay parent. +async fn query_basics( + ctx: &mut Context, + relay_parent: Hash, +) -> SubsystemResult<(Vec, SigningContext)> +where + Context: SubsystemContext, +{ + let (validators_tx, validators_rx) = oneshot::channel(); + let (signing_tx, signing_rx) = oneshot::channel(); + + let query_validators = AllMessages::RuntimeApi(RuntimeApiMessage::Request( + relay_parent.clone(), + RuntimeApiRequest::Validators(validators_tx), + )); + + let query_signing = AllMessages::RuntimeApi(RuntimeApiMessage::Request( + relay_parent.clone(), + RuntimeApiRequest::SigningContext(signing_tx), + )); + + ctx.send_messages(std::iter::once(query_validators).chain(std::iter::once(query_signing))) + .await?; + + Ok((validators_rx.await?, signing_rx.await?)) +} + +#[cfg(test)] +mod test { + use super::*; + use bitvec::bitvec; + use futures::executor; + use maplit::hashmap; + use polkadot_primitives::v1::{Signed, ValidatorPair, AvailabilityBitfield}; + use polkadot_subsystem::test_helpers::make_subsystem_context; + use smol_timeout::TimeoutExt; + use sp_core::crypto::Pair; + use std::time::Duration; + use assert_matches::assert_matches; + + macro_rules! view { + ( $( $hash:expr ),* $(,)? ) => [ + View(vec![ $( $hash.clone() ),* ]) + ]; + } + + macro_rules! peers { + ( $( $peer:expr ),* $(,)? ) => [ + vec![ $( $peer.clone() ),* ] + ]; + } + + macro_rules! launch { + ($fut:expr) => { + $fut + .timeout(Duration::from_millis(10)) + .await + .expect("10ms is more than enough for sending messages.") + .expect("Error values should really never occur.") + }; + } + + /// A very limited state, only interested in the relay parent of the + /// given message, which must be signed by `validator` and a set of peers + /// which are also only interested in that relay parent. + fn prewarmed_state( + validator: ValidatorId, + signing_context: SigningContext, + known_message: BitfieldGossipMessage, + peers: Vec, + ) -> ProtocolState { + let relay_parent = known_message.relay_parent.clone(); + ProtocolState { + per_relay_parent: hashmap! { + relay_parent.clone() => + PerRelayParentData { + signing_context, + validator_set: vec![validator.clone()], + one_per_validator: hashmap! { + validator.clone() => known_message.clone(), + }, + message_received_from_peer: hashmap!{}, + message_sent_to_peer: hashmap!{}, + }, + }, + peer_views: peers + .into_iter() + .map(|peer| (peer, view!(relay_parent))) + .collect(), + view: view!(relay_parent), + } + } + + fn state_with_view(view: View, relay_parent: Hash) -> (ProtocolState, SigningContext, ValidatorPair) { + let mut state = ProtocolState::default(); + + let (validator_pair, _seed) = ValidatorPair::generate(); + let validator = validator_pair.public(); + + let signing_context = SigningContext { + session_index: 1, + parent_hash: relay_parent.clone(), + }; + + state.per_relay_parent = view.0.iter().map(|relay_parent| {( + relay_parent.clone(), + PerRelayParentData { + signing_context: signing_context.clone(), + validator_set: vec![validator.clone()], + one_per_validator: hashmap!{}, + message_received_from_peer: hashmap!{}, + message_sent_to_peer: hashmap!{}, + }) + }).collect(); + + state.view = view; + + (state, signing_context, validator_pair) + } + + #[test] + fn receive_invalid_signature() { + let _ = env_logger::builder() + .filter(None, log::LevelFilter::Trace) + .is_test(true) + .try_init(); + + let hash_a: Hash = [0; 32].into(); + + let peer_a = PeerId::random(); + let peer_b = PeerId::random(); + assert_ne!(peer_a, peer_b); + + let signing_context = SigningContext { + session_index: 1, + parent_hash: hash_a.clone(), + }; + + // validator 0 key pair + let (validator_pair, _seed) = ValidatorPair::generate(); + let validator = validator_pair.public(); + + // another validator not part of the validatorset + let (mallicious, _seed) = ValidatorPair::generate(); + + let payload = AvailabilityBitfield(bitvec![bitvec::order::Lsb0, u8; 1u8; 32]); + let signed = + Signed::::sign(payload, &signing_context, 0, &mallicious); + + let msg = BitfieldGossipMessage { + relay_parent: hash_a.clone(), + signed_availability: signed.clone(), + }; + + let pool = sp_core::testing::SpawnBlockingExecutor::new(); + let (mut ctx, mut handle) = + make_subsystem_context::(pool); + + let mut state = prewarmed_state( + validator.clone(), + signing_context.clone(), + msg.clone(), + vec![peer_b.clone()], + ); + + executor::block_on(async move { + launch!(handle_network_msg( + &mut ctx, + &mut state, + NetworkBridgeEvent::PeerMessage(peer_b.clone(), msg.encode()), + )); + + // reputation change due to invalid validator index + assert_matches!( + handle.recv().await, + AllMessages::NetworkBridge( + NetworkBridgeMessage::ReportPeer(peer, rep) + ) => { + assert_eq!(peer, peer_b); + assert_eq!(rep, COST_SIGNATURE_INVALID) + } + ); + }); + } + + #[test] + fn receive_invalid_validator_index() { + let _ = env_logger::builder() + .filter(None, log::LevelFilter::Trace) + .is_test(true) + .try_init(); + + let hash_a: Hash = [0; 32].into(); + let hash_b: Hash = [1; 32].into(); // other + + let peer_a = PeerId::random(); + let peer_b = PeerId::random(); + assert_ne!(peer_a, peer_b); + + // validator 0 key pair + let (mut state, signing_context, validator_pair) = + state_with_view(view![hash_a, hash_b], hash_a.clone()); + + state.peer_views.insert(peer_b.clone(), view![hash_a]); + + let payload = AvailabilityBitfield(bitvec![bitvec::order::Lsb0, u8; 1u8; 32]); + let signed = + Signed::::sign(payload, &signing_context, 42, &validator_pair); + + let msg = BitfieldGossipMessage { + relay_parent: hash_a.clone(), + signed_availability: signed.clone(), + }; + + let pool = sp_core::testing::SpawnBlockingExecutor::new(); + let (mut ctx, mut handle) = + make_subsystem_context::(pool); + + executor::block_on(async move { + launch!(handle_network_msg( + &mut ctx, + &mut state, + NetworkBridgeEvent::PeerMessage(peer_b.clone(), msg.encode()), + )); + + // reputation change due to invalid validator index + assert_matches!( + handle.recv().await, + AllMessages::NetworkBridge( + NetworkBridgeMessage::ReportPeer(peer, rep) + ) => { + assert_eq!(peer, peer_b); + assert_eq!(rep, COST_VALIDATOR_INDEX_INVALID) + } + ); + }); + } + + #[test] + fn receive_duplicate_messages() { + let _ = env_logger::builder() + .filter(None, log::LevelFilter::Trace) + .is_test(true) + .try_init(); + + let hash_a: Hash = [0; 32].into(); + let hash_b: Hash = [1; 32].into(); + + let peer_a = PeerId::random(); + let peer_b = PeerId::random(); + assert_ne!(peer_a, peer_b); + + // validator 0 key pair + let (mut state, signing_context, validator_pair) = + state_with_view(view![hash_a, hash_b], hash_a.clone()); + + // create a signed message by validator 0 + let payload = AvailabilityBitfield(bitvec![bitvec::order::Lsb0, u8; 1u8; 32]); + let signed_bitfield = + Signed::::sign(payload, &signing_context, 0, &validator_pair); + + let msg = BitfieldGossipMessage { + relay_parent: hash_a.clone(), + signed_availability: signed_bitfield.clone(), + }; + + let pool = sp_core::testing::SpawnBlockingExecutor::new(); + let (mut ctx, mut handle) = + make_subsystem_context::(pool); + + executor::block_on(async move { + // send a first message + launch!(handle_network_msg( + &mut ctx, + &mut state, + NetworkBridgeEvent::PeerMessage(peer_b.clone(), msg.encode()), + )); + + // none of our peers has any interest in any messages + // so we do not receive a network send type message here + // but only the one for the next subsystem + assert_matches!( + handle.recv().await, + AllMessages::Provisioner(ProvisionerMessage::ProvisionableData( + ProvisionableData::Bitfield(hash, signed) + )) => { + assert_eq!(hash, hash_a); + assert_eq!(signed, signed_bitfield) + } + ); + + assert_matches!( + handle.recv().await, + AllMessages::NetworkBridge( + NetworkBridgeMessage::ReportPeer(peer, rep) + ) => { + assert_eq!(peer, peer_b); + assert_eq!(rep, GAIN_VALID_MESSAGE_FIRST) + } + ); + + // let peer A send the same message again + launch!(handle_network_msg( + &mut ctx, + &mut state, + NetworkBridgeEvent::PeerMessage(peer_a.clone(), msg.encode()), + )); + + assert_matches!( + handle.recv().await, + AllMessages::NetworkBridge( + NetworkBridgeMessage::ReportPeer(peer, rep) + ) => { + assert_eq!(peer, peer_a); + assert_eq!(rep, GAIN_VALID_MESSAGE) + } + ); + + // let peer B send the initial message again + launch!(handle_network_msg( + &mut ctx, + &mut state, + NetworkBridgeEvent::PeerMessage(peer_b.clone(), msg.encode()), + )); + + assert_matches!( + handle.recv().await, + AllMessages::NetworkBridge( + NetworkBridgeMessage::ReportPeer(peer, rep) + ) => { + assert_eq!(peer, peer_b); + assert_eq!(rep, COST_PEER_DUPLICATE_MESSAGE) + } + ); + }); + } + #[test] + fn changing_view() { + let _ = env_logger::builder() + .filter(None, log::LevelFilter::Trace) + .is_test(true) + .try_init(); + + let hash_a: Hash = [0; 32].into(); + let hash_b: Hash = [1; 32].into(); + + let peer_a = PeerId::random(); + let peer_b = PeerId::random(); + assert_ne!(peer_a, peer_b); + + // validator 0 key pair + let (mut state, signing_context, validator_pair) = state_with_view(view![hash_a, hash_b], hash_a.clone()); + + // create a signed message by validator 0 + let payload = AvailabilityBitfield(bitvec![bitvec::order::Lsb0, u8; 1u8; 32]); + let signed_bitfield = + Signed::::sign(payload, &signing_context, 0, &validator_pair); + + let msg = BitfieldGossipMessage { + relay_parent: hash_a.clone(), + signed_availability: signed_bitfield.clone(), + }; + + let pool = sp_core::testing::SpawnBlockingExecutor::new(); + let (mut ctx, mut handle) = + make_subsystem_context::(pool); + + executor::block_on(async move { + launch!(handle_network_msg( + &mut ctx, + &mut state, + NetworkBridgeEvent::PeerConnected(peer_b.clone(), ObservedRole::Full), + )); + + // make peer b interested + launch!(handle_network_msg( + &mut ctx, + &mut state, + NetworkBridgeEvent::PeerViewChange(peer_b.clone(), view![hash_a, hash_b]), + )); + + assert!(state.peer_views.contains_key(&peer_b)); + + // recv a first message from the network + launch!(handle_network_msg( + &mut ctx, + &mut state, + NetworkBridgeEvent::PeerMessage(peer_b.clone(), msg.encode()), + )); + + // gossip to the overseer + assert_matches!( + handle.recv().await, + AllMessages::Provisioner(ProvisionerMessage::ProvisionableData( + ProvisionableData::Bitfield(hash, signed) + )) => { + assert_eq!(hash, hash_a); + assert_eq!(signed, signed_bitfield) + } + ); + + // gossip to the network + assert_matches!( + handle.recv().await, + AllMessages::NetworkBridge(NetworkBridgeMessage::SendMessage ( + peers, proto, bytes + )) => { + assert_eq!(peers, peers![peer_b]); + assert_eq!(proto, BitfieldDistribution::PROTOCOL_ID); + assert_eq!(bytes, msg.encode()); + } + ); + + // reputation change for peer B + assert_matches!( + handle.recv().await, + AllMessages::NetworkBridge( + NetworkBridgeMessage::ReportPeer(peer, rep) + ) => { + assert_eq!(peer, peer_b); + assert_eq!(rep, GAIN_VALID_MESSAGE_FIRST) + } + ); + + launch!(handle_network_msg( + &mut ctx, + &mut state, + NetworkBridgeEvent::PeerViewChange(peer_b.clone(), view![]), + )); + + assert!(state.peer_views.contains_key(&peer_b)); + assert_eq!( + state.peer_views.get(&peer_b).expect("Must contain value for peer B"), + &view![] + ); + + // on rx of the same message, since we are not interested, + // should give penalty + launch!(handle_network_msg( + &mut ctx, + &mut state, + NetworkBridgeEvent::PeerMessage(peer_b.clone(), msg.encode()), + )); + + // reputation change for peer B + assert_matches!( + handle.recv().await, + AllMessages::NetworkBridge( + NetworkBridgeMessage::ReportPeer(peer, rep) + ) => { + assert_eq!(peer, peer_b); + assert_eq!(rep, COST_PEER_DUPLICATE_MESSAGE) + } + ); + + launch!(handle_network_msg( + &mut ctx, + &mut state, + NetworkBridgeEvent::PeerDisconnected(peer_b.clone()), + )); + + // we are not interested in any peers at all anymore + state.view = view![]; + + // on rx of the same message, since we are not interested, + // should give penalty + launch!(handle_network_msg( + &mut ctx, + &mut state, + NetworkBridgeEvent::PeerMessage(peer_a.clone(), msg.encode()), + )); + + // reputation change for peer B + assert_matches!( + handle.recv().await, + AllMessages::NetworkBridge( + NetworkBridgeMessage::ReportPeer(peer, rep) + ) => { + assert_eq!(peer, peer_a); + assert_eq!(rep, COST_NOT_IN_VIEW) + } + ); + + }); + } + + + #[test] + fn invalid_peer_message() { + let _ = env_logger::builder() + .filter(None, log::LevelFilter::Trace) + .is_test(true) + .try_init(); + + let hash_a: Hash = [0; 32].into(); + let peer_a = PeerId::random(); + + // validator 0 key pair + let (mut state, _signing_context, _validator_pair) = state_with_view(view![], hash_a.clone()); + + let pool = sp_core::testing::SpawnBlockingExecutor::new(); + let (mut ctx, mut handle) = + make_subsystem_context::(pool); + + executor::block_on(async move { + launch!(handle_network_msg( + &mut ctx, + &mut state, + NetworkBridgeEvent::PeerConnected(peer_a.clone(), ObservedRole::Full), + )); + + // make peer b interested + launch!(handle_network_msg( + &mut ctx, + &mut state, + NetworkBridgeEvent::PeerViewChange(peer_a.clone(), view![hash_a]), + )); + + assert!(state.peer_views.contains_key(&peer_a)); + + // recv a first message from the network + launch!(handle_network_msg( + &mut ctx, + &mut state, + NetworkBridgeEvent::PeerMessage(peer_a.clone(), b"00AaBbCcDdEeFf".to_vec()), + )); + + // reputation change for peer A + assert_matches!( + handle.recv().await, + AllMessages::NetworkBridge( + NetworkBridgeMessage::ReportPeer(peer, rep) + ) => { + assert_eq!(peer, peer_a); + assert_eq!(rep, COST_MESSAGE_NOT_DECODABLE); + } + ); + + }); + } +} diff --git a/node/subsystem/src/messages.rs b/node/subsystem/src/messages.rs index 2040b41348..a6b7859c38 100644 --- a/node/subsystem/src/messages.rs +++ b/node/subsystem/src/messages.rs @@ -34,7 +34,6 @@ use polkadot_primitives::v1::{ use polkadot_node_primitives::{ MisbehaviorReport, SignedFullStatement, View, ProtocolId, ValidationResult, }; - use std::sync::Arc; pub use sc_network::{ObservedRole, ReputationChange, PeerId}; diff --git a/roadmap/implementers-guide/src/node/availability/bitfield-distribution.md b/roadmap/implementers-guide/src/node/availability/bitfield-distribution.md index 97a5c14be3..528b5f9d1d 100644 --- a/roadmap/implementers-guide/src/node/availability/bitfield-distribution.md +++ b/roadmap/implementers-guide/src/node/availability/bitfield-distribution.md @@ -6,16 +6,30 @@ Validators vote on the availability of a backed candidate by issuing signed bitf `ProtocolId`: `b"bitd"` -Input: [`BitfieldDistributionMessage`](../../types/overseer-protocol.md#bitfield-distribution-message) +Input: +[`BitfieldDistributionMessage`](../../types/overseer-protocol.md#bitfield-distribution-message) which are gossiped to all peers, no matter if validator or not. + Output: -- `NetworkBridge::RegisterEventProducer(ProtocolId)` -- `NetworkBridge::SendMessage([PeerId], ProtocolId, Bytes)` -- `NetworkBridge::ReportPeer(PeerId, cost_or_benefit)` -- `BlockAuthorshipProvisioning::Bitfield(relay_parent, SignedAvailabilityBitfield)` +- `NetworkBridge::RegisterEventProducer(ProtocolId)` in order to register ourself as an event provider for the protocol. +- `NetworkBridge::SendMessage([PeerId], ProtocolId, Bytes)` gossip a verified incoming bitfield on to interested subsystems within this validator node. +- `NetworkBridge::ReportPeer(PeerId, cost_or_benefit)` improve or penalize the reputation of peers based on the messages that are received relative to the current view. +- `ProvisionerMessage::ProvisionableData(ProvisionableData::Bitfield(relay_parent, SignedAvailabilityBitfield))` pass + on the bitfield to the other submodules via the overseer. ## Functionality -This is implemented as a gossip system. Register a [network bridge](../utility/network-bridge.md) event producer on startup and track peer connection, view change, and disconnection events. Only accept bitfields relevant to our current view and only distribute bitfields to other peers when relevant to their most recent view. Check bitfield signatures in this subsystem and accept and distribute only one bitfield per validator. +This is implemented as a gossip system. Register a [network bridge](../utility/network-bridge.md) event producer on startup. + +It is necessary to track peer connection, view change, and disconnection events, in order to maintain an index of which peers are interested in which relay parent bitfields. + + +Before gossiping incoming bitfields, they must be checked to be signed by one of the validators +of the validator set relevant to the current relay parent. +Only accept bitfields relevant to our current view and only distribute bitfields to other peers when relevant to their most recent view. +Accept and distribute only one bitfield per validator. + When receiving a bitfield either from the network or from a `DistributeBitfield` message, forward it along to the block authorship (provisioning) subsystem for potential inclusion in a block. + +Peers connecting after a set of valid bitfield gossip messages was received, those messages must be cached and sent upon connection of new peers or re-connecting peers. -- GitLab From 8217ca6764cce626a440bf83dc6418b6b396b9a0 Mon Sep 17 00:00:00 2001 From: Peter Goodspeed-Niklaus Date: Thu, 23 Jul 2020 16:05:48 +0200 Subject: [PATCH 095/192] implement bitfield signing subsystem (#1364) * update guide to reduce confusion and TODOs * work from previous bitfield signing effort There were large merge issues with the old bitfield signing PR, so we're just copying all the work from that onto this and restarting. Much of the existing work will be discarded because we now have better tools available, but that's fine. * start rewriting bitfield signing in terms of the util module * implement construct_availability_bitvec It's not an ideal implementation--we can make it much more concurrent-- but at least it compiles. * implement the unimplemented portions of bitfield signing * get core availability concurrently, not sequentially * use sp-std instead of std for a parachain item * resolve type inference failure caused by multiple From impls * handle bitfield signing subsystem & Allmessages variant in overseer * fix more multi-From inference issues * more concisely handle overflow Co-authored-by: Andronik Ordian * Revert "resolve type inference failure caused by multiple From impls" This reverts commit 7fc77805de5e5074a1b01037f8d4e3919e03e0e1. * Revert "fix more multi-From inference issues" This reverts commit f14ffe589e20d664d8a900ed62f68b6fb844a514. * impl From for ParaId * handle another instance of AllSubsystems * improve consistency when returning existing options Co-authored-by: Andronik Ordian --- Cargo.lock | 14 + Cargo.toml | 1 + node/bitfield-signing/Cargo.toml | 15 + node/bitfield-signing/src/lib.rs | 290 ++++++++++++++++++ node/overseer/examples/minimal-example.rs | 1 + node/overseer/src/lib.rs | 32 +- node/service/src/lib.rs | 1 + node/subsystem/src/messages.rs | 27 +- parachain/src/primitives.rs | 30 ++ .../src/node/availability/bitfield-signing.md | 6 +- 10 files changed, 411 insertions(+), 6 deletions(-) create mode 100644 node/bitfield-signing/Cargo.toml create mode 100644 node/bitfield-signing/src/lib.rs diff --git a/Cargo.lock b/Cargo.lock index 4f58980d5f..76b257eddd 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4544,6 +4544,20 @@ dependencies = [ "sp-runtime", ] +[[package]] +name = "polkadot-node-bitfield-signing" +version = "0.1.0" +dependencies = [ + "bitvec", + "derive_more 0.99.9", + "futures 0.3.5", + "log 0.4.8", + "polkadot-node-subsystem", + "polkadot-primitives", + "sc-keystore", + "wasm-timer", +] + [[package]] name = "polkadot-node-core-backing" version = "0.1.0" diff --git a/Cargo.toml b/Cargo.toml index 28ad17ac4d..58211e1620 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -43,6 +43,7 @@ members = [ "service", "validation", + "node/bitfield-signing", "node/core/proposer", "node/network/bridge", "node/network/pov-distribution", diff --git a/node/bitfield-signing/Cargo.toml b/node/bitfield-signing/Cargo.toml new file mode 100644 index 0000000000..c3a2934aad --- /dev/null +++ b/node/bitfield-signing/Cargo.toml @@ -0,0 +1,15 @@ +[package] +name = "polkadot-node-bitfield-signing" +version = "0.1.0" +authors = ["Peter Goodspeed-Niklaus "] +edition = "2018" + +[dependencies] +bitvec = "0.17.4" +derive_more = "0.99.9" +futures = "0.3.5" +log = "0.4.8" +polkadot-primitives = { path = "../../primitives" } +polkadot-node-subsystem = { path = "../subsystem" } +keystore = { package = "sc-keystore", git = "https://github.com/paritytech/substrate", branch = "master" } +wasm-timer = "0.2.4" diff --git a/node/bitfield-signing/src/lib.rs b/node/bitfield-signing/src/lib.rs new file mode 100644 index 0000000000..b973f4b3ae --- /dev/null +++ b/node/bitfield-signing/src/lib.rs @@ -0,0 +1,290 @@ +// Copyright 2020 Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Polkadot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . + +//! The bitfield signing subsystem produces `SignedAvailabilityBitfield`s once per block. + +use bitvec::bitvec; +use futures::{ + channel::{mpsc, oneshot}, + prelude::*, + stream, Future, +}; +use keystore::KeyStorePtr; +use polkadot_node_subsystem::{ + messages::{ + self, AllMessages, AvailabilityStoreMessage, BitfieldDistributionMessage, + BitfieldSigningMessage, CandidateBackingMessage, RuntimeApiMessage, + }, + util::{self, JobManager, JobTrait, ToJobTrait, Validator}, +}; +use polkadot_primitives::v1::{AvailabilityBitfield, CoreOccupied, Hash}; +use std::{convert::TryFrom, pin::Pin, time::Duration}; +use wasm_timer::{Delay, Instant}; + +/// Delay between starting a bitfield signing job and its attempting to create a bitfield. +const JOB_DELAY: Duration = Duration::from_millis(1500); + +/// Each `BitfieldSigningJob` prepares a signed bitfield for a single relay parent. +pub struct BitfieldSigningJob; + +/// Messages which a `BitfieldSigningJob` is prepared to receive. +pub enum ToJob { + BitfieldSigning(BitfieldSigningMessage), + Stop, +} + +impl ToJobTrait for ToJob { + const STOP: Self = ToJob::Stop; + + fn relay_parent(&self) -> Option { + match self { + Self::BitfieldSigning(bsm) => bsm.relay_parent(), + Self::Stop => None, + } + } +} + +impl TryFrom for ToJob { + type Error = (); + + fn try_from(msg: AllMessages) -> Result { + match msg { + AllMessages::BitfieldSigning(bsm) => Ok(ToJob::BitfieldSigning(bsm)), + _ => Err(()), + } + } +} + +impl From for ToJob { + fn from(bsm: BitfieldSigningMessage) -> ToJob { + ToJob::BitfieldSigning(bsm) + } +} + +/// Messages which may be sent from a `BitfieldSigningJob`. +pub enum FromJob { + AvailabilityStore(AvailabilityStoreMessage), + BitfieldDistribution(BitfieldDistributionMessage), + CandidateBacking(CandidateBackingMessage), + RuntimeApi(RuntimeApiMessage), +} + +impl From for AllMessages { + fn from(from_job: FromJob) -> AllMessages { + match from_job { + FromJob::AvailabilityStore(asm) => AllMessages::AvailabilityStore(asm), + FromJob::BitfieldDistribution(bdm) => AllMessages::BitfieldDistribution(bdm), + FromJob::CandidateBacking(cbm) => AllMessages::CandidateBacking(cbm), + FromJob::RuntimeApi(ram) => AllMessages::RuntimeApi(ram), + } + } +} + +impl TryFrom for FromJob { + type Error = (); + + fn try_from(msg: AllMessages) -> Result { + match msg { + AllMessages::AvailabilityStore(asm) => Ok(Self::AvailabilityStore(asm)), + AllMessages::BitfieldDistribution(bdm) => Ok(Self::BitfieldDistribution(bdm)), + AllMessages::CandidateBacking(cbm) => Ok(Self::CandidateBacking(cbm)), + AllMessages::RuntimeApi(ram) => Ok(Self::RuntimeApi(ram)), + _ => Err(()), + } + } +} + +/// Errors we may encounter in the course of executing the `BitfieldSigningSubsystem`. +#[derive(Debug, derive_more::From)] +pub enum Error { + /// error propagated from the utility subsystem + #[from] + Util(util::Error), + /// io error + #[from] + Io(std::io::Error), + /// a one shot channel was canceled + #[from] + Oneshot(oneshot::Canceled), + /// a mspc channel failed to send + #[from] + MpscSend(mpsc::SendError), + /// several errors collected into one + #[from] + Multiple(Vec), +} + +// this function exists mainly to collect a bunch of potential error points into one. +async fn get_core_availability( + relay_parent: Hash, + idx: usize, + core: Option, + sender: &mpsc::Sender, +) -> Result { + use messages::{ + AvailabilityStoreMessage::QueryPoVAvailable, + RuntimeApiRequest::CandidatePendingAvailability, + }; + use FromJob::{AvailabilityStore, RuntimeApi}; + use RuntimeApiMessage::Request; + + // we have to (cheaply) clone this sender so we can mutate it to actually send anything + let mut sender = sender.clone(); + + // REVIEW: is it safe to ignore parathreads here, or do they also figure in the availability mapping? + if let Some(CoreOccupied::Parachain) = core { + let (tx, rx) = oneshot::channel(); + sender + .send(RuntimeApi(Request( + relay_parent, + CandidatePendingAvailability(idx.into(), tx), + ))) + .await?; + let committed_candidate_receipt = match rx.await? { + Some(ccr) => ccr, + None => return Ok(false), + }; + let (tx, rx) = oneshot::channel(); + sender + .send(AvailabilityStore(QueryPoVAvailable( + committed_candidate_receipt.descriptor.pov_hash, + tx, + ))) + .await?; + return rx.await.map_err(Into::into); + } + Ok(false) +} + +// the way this function works is not intuitive: +// +// - get the scheduler roster so we have a list of cores, in order. +// - for each occupied core, fetch `candidate_pending_availability` from runtime +// - from there, we can get the `CandidateDescriptor` +// - from there, we can send a `AvailabilityStore::QueryPoV` and set the indexed bit to 1 if it returns Some(_) +async fn construct_availability_bitfield( + relay_parent: Hash, + sender: &mut mpsc::Sender, +) -> Result { + use futures::lock::Mutex; + + use messages::RuntimeApiRequest::ValidatorGroups; + use FromJob::RuntimeApi; + use RuntimeApiMessage::Request; + + // request the validator groups so we can get the scheduler roster + let (tx, rx) = oneshot::channel(); + sender + .send(RuntimeApi(Request(relay_parent, ValidatorGroups(tx)))) + .await?; + + // we now need sender to be immutable so we can copy the reference to multiple concurrent closures + let sender = &*sender; + + // wait for the scheduler roster + let scheduler_roster = rx.await?; + + // prepare outputs + let out = + Mutex::new(bitvec!(bitvec::order::Lsb0, u8; 0; scheduler_roster.availability_cores.len())); + // in principle, we know that we never want concurrent access to the _same_ bit within the vec; + // we could `let out_ref = out.as_mut_ptr();` here instead, and manually assign bits, avoiding + // any need to ever wait to lock this mutex. + // in practice, it's safer to just use the mutex, and speed optimizations should wait until + // benchmarking proves that they are necessary. + let out_ref = &out; + let errs = Mutex::new(Vec::new()); + let errs_ref = &errs; + + // Handle each (idx, core) pair concurrently + // + // In principle, this work is all concurrent, not parallel. In practice, we can't guarantee it, which is why + // we need the mutexes and explicit references above. + stream::iter(scheduler_roster.availability_cores.into_iter().enumerate()) + .for_each_concurrent(None, |(idx, core)| async move { + let availability = match get_core_availability(relay_parent, idx, core, sender).await { + Ok(availability) => availability, + Err(err) => { + errs_ref.lock().await.push(err); + return; + } + }; + out_ref.lock().await.set(idx, availability); + }) + .await; + + let errs = errs.into_inner(); + if errs.is_empty() { + Ok(out.into_inner().into()) + } else { + Err(errs.into()) + } +} + +impl JobTrait for BitfieldSigningJob { + type ToJob = ToJob; + type FromJob = FromJob; + type Error = Error; + type RunArgs = KeyStorePtr; + + const NAME: &'static str = "BitfieldSigningJob"; + + /// Run a job for the parent block indicated + fn run( + relay_parent: Hash, + keystore: Self::RunArgs, + _receiver: mpsc::Receiver, + mut sender: mpsc::Sender, + ) -> Pin> + Send>> { + async move { + // figure out when to wait to + let wait_until = Instant::now() + JOB_DELAY; + + // now do all the work we can before we need to wait for the availability store + // if we're not a validator, we can just succeed effortlessly + let validator = match Validator::new(relay_parent, keystore, sender.clone()).await { + Ok(validator) => validator, + Err(util::Error::NotAValidator) => return Ok(()), + Err(err) => return Err(Error::Util(err)), + }; + + // wait a bit before doing anything else + Delay::new_at(wait_until).await?; + + let bitfield = construct_availability_bitfield(relay_parent, &mut sender).await?; + let signed_bitfield = validator.sign(bitfield); + + // make an anonymous scope to contain some use statements to simplify creating the outbound message + { + use BitfieldDistributionMessage::DistributeBitfield; + use FromJob::BitfieldDistribution; + + sender + .send(BitfieldDistribution(DistributeBitfield( + relay_parent, + signed_bitfield, + ))) + .await + .map_err(Into::into) + } + } + .boxed() + } +} + +/// BitfieldSigningSubsystem manages a number of bitfield signing jobs. +pub type BitfieldSigningSubsystem = + JobManager; diff --git a/node/overseer/examples/minimal-example.rs b/node/overseer/examples/minimal-example.rs index 35ebf8f336..36440275cb 100644 --- a/node/overseer/examples/minimal-example.rs +++ b/node/overseer/examples/minimal-example.rs @@ -147,6 +147,7 @@ fn main() { candidate_selection: DummySubsystem, statement_distribution: DummySubsystem, availability_distribution: DummySubsystem, + bitfield_signing: DummySubsystem, bitfield_distribution: DummySubsystem, provisioner: DummySubsystem, pov_distribution: DummySubsystem, diff --git a/node/overseer/src/lib.rs b/node/overseer/src/lib.rs index c6ac6444c2..cb158d09c1 100644 --- a/node/overseer/src/lib.rs +++ b/node/overseer/src/lib.rs @@ -77,7 +77,7 @@ use client::{BlockImportNotification, BlockchainEvents, FinalityNotification}; use polkadot_subsystem::messages::{ CandidateValidationMessage, CandidateBackingMessage, CandidateSelectionMessage, StatementDistributionMessage, - AvailabilityDistributionMessage, BitfieldDistributionMessage, + AvailabilityDistributionMessage, BitfieldSigningMessage, BitfieldDistributionMessage, ProvisionerMessage, PoVDistributionMessage, RuntimeApiMessage, AvailabilityStoreMessage, NetworkBridgeMessage, AllMessages, }; @@ -339,6 +339,9 @@ pub struct Overseer { /// An availability distribution subsystem. availability_distribution_subsystem: OverseenSubsystem, + /// A bitfield signing subsystem. + bitfield_signing_subsystem: OverseenSubsystem, + /// A bitfield distribution subsystem. bitfield_distribution_subsystem: OverseenSubsystem, @@ -390,7 +393,7 @@ pub struct Overseer { /// /// [`Subsystem`]: trait.Subsystem.html /// [`DummySubsystem`]: struct.DummySubsystem.html -pub struct AllSubsystems { +pub struct AllSubsystems { /// A candidate validation subsystem. pub candidate_validation: CV, /// A candidate backing subsystem. @@ -401,6 +404,8 @@ pub struct AllSubsystems { pub statement_distribution: SD, /// An availability distribution subsystem. pub availability_distribution: AD, + /// A bitfield signing subsystem. + pub bitfield_signing: BS, /// A bitfield distribution subsystem. pub bitfield_distribution: BD, /// A provisioner subsystem. @@ -487,6 +492,7 @@ where /// candidate_selection: DummySubsystem, /// statement_distribution: DummySubsystem, /// availability_distribution: DummySubsystem, + /// bitfield_signing: DummySubsystem, /// bitfield_distribution: DummySubsystem, /// provisioner: DummySubsystem, /// pov_distribution: DummySubsystem, @@ -513,9 +519,9 @@ where /// # /// # }); } /// ``` - pub fn new( + pub fn new( leaves: impl IntoIterator, - all_subsystems: AllSubsystems, + all_subsystems: AllSubsystems, mut s: S, ) -> SubsystemResult<(Self, OverseerHandler)> where @@ -524,6 +530,7 @@ where CS: Subsystem> + Send, SD: Subsystem> + Send, AD: Subsystem> + Send, + BS: Subsystem> + Send, BD: Subsystem> + Send, P: Subsystem> + Send, PoVD: Subsystem> + Send, @@ -575,6 +582,13 @@ where all_subsystems.availability_distribution, )?; + let bitfield_signing_subsystem = spawn( + &mut s, + &mut running_subsystems, + &mut running_subsystems_rx, + all_subsystems.bitfield_signing, + )?; + let bitfield_distribution_subsystem = spawn( &mut s, &mut running_subsystems, @@ -630,6 +644,7 @@ where candidate_selection_subsystem, statement_distribution_subsystem, availability_distribution_subsystem, + bitfield_signing_subsystem, bitfield_distribution_subsystem, provisioner_subsystem, pov_distribution_subsystem, @@ -871,6 +886,11 @@ where let _ = s.tx.send(FromOverseer::Communication { msg }).await; } } + AllMessages::BitfieldSigning(msg) => { + if let Some(ref mut s) = self.bitfield_signing_subsystem.instance { + let _ = s.tx.send(FromOverseer::Communication{ msg }).await; + } + } AllMessages::Provisioner(msg) => { if let Some(ref mut s) = self.provisioner_subsystem.instance { let _ = s.tx.send(FromOverseer::Communication { msg }).await; @@ -1050,6 +1070,7 @@ mod tests { candidate_selection: DummySubsystem, statement_distribution: DummySubsystem, availability_distribution: DummySubsystem, + bitfield_signing: DummySubsystem, bitfield_distribution: DummySubsystem, provisioner: DummySubsystem, pov_distribution: DummySubsystem, @@ -1112,6 +1133,7 @@ mod tests { candidate_selection: DummySubsystem, statement_distribution: DummySubsystem, availability_distribution: DummySubsystem, + bitfield_signing: DummySubsystem, bitfield_distribution: DummySubsystem, provisioner: DummySubsystem, pov_distribution: DummySubsystem, @@ -1227,6 +1249,7 @@ mod tests { candidate_selection: DummySubsystem, statement_distribution: DummySubsystem, availability_distribution: DummySubsystem, + bitfield_signing: DummySubsystem, bitfield_distribution: DummySubsystem, provisioner: DummySubsystem, pov_distribution: DummySubsystem, @@ -1323,6 +1346,7 @@ mod tests { candidate_selection: DummySubsystem, statement_distribution: DummySubsystem, availability_distribution: DummySubsystem, + bitfield_signing: DummySubsystem, bitfield_distribution: DummySubsystem, provisioner: DummySubsystem, pov_distribution: DummySubsystem, diff --git a/node/service/src/lib.rs b/node/service/src/lib.rs index 02907e151f..49df3da528 100644 --- a/node/service/src/lib.rs +++ b/node/service/src/lib.rs @@ -302,6 +302,7 @@ fn real_overseer( candidate_selection: DummySubsystem, statement_distribution: DummySubsystem, availability_distribution: DummySubsystem, + bitfield_signing: DummySubsystem, bitfield_distribution: DummySubsystem, provisioner: DummySubsystem, pov_distribution: DummySubsystem, diff --git a/node/subsystem/src/messages.rs b/node/subsystem/src/messages.rs index a6b7859c38..a2f0bf8bbc 100644 --- a/node/subsystem/src/messages.rs +++ b/node/subsystem/src/messages.rs @@ -26,7 +26,7 @@ use futures::channel::{mpsc, oneshot}; use polkadot_primitives::v1::{ BlockNumber, Hash, - CandidateReceipt, PoV, ErasureChunk, BackedCandidate, Id as ParaId, + CandidateReceipt, CommittedCandidateReceipt, PoV, ErasureChunk, BackedCandidate, Id as ParaId, SignedAvailabilityBitfield, SigningContext, ValidatorId, ValidationCode, ValidatorIndex, CoreAssignment, CoreOccupied, HeadData, CandidateDescriptor, ValidatorSignature, OmittedValidationData, @@ -219,12 +219,32 @@ impl BitfieldDistributionMessage { } } +/// Bitfield signing message. +/// +/// Currently non-instantiable. +#[derive(Debug)] +pub enum BitfieldSigningMessage {} + +impl BitfieldSigningMessage { + /// If the current variant contains the relay parent hash, return it. + pub fn relay_parent(&self) -> Option { + None + } +} + /// Availability store subsystem message. #[derive(Debug)] pub enum AvailabilityStoreMessage { /// Query a `PoV` from the AV store. QueryPoV(Hash, oneshot::Sender>), + /// Query whether a `PoV` exists within the AV Store. + /// + /// This is useful in cases like bitfield signing, when existence + /// matters, but we don't want to necessarily pass around multiple + /// megabytes of data to get a single bit of information. + QueryPoVAvailable(Hash, oneshot::Sender), + /// Query an `ErasureChunk` from the AV store. QueryChunk(Hash, ValidatorIndex, oneshot::Sender), @@ -237,6 +257,7 @@ impl AvailabilityStoreMessage { pub fn relay_parent(&self) -> Option { match self { Self::QueryPoV(hash, _) => Some(*hash), + Self::QueryPoVAvailable(hash, _) => Some(*hash), Self::QueryChunk(hash, _, _) => Some(*hash), Self::StoreChunk(hash, _, _) => Some(*hash), } @@ -271,6 +292,8 @@ pub enum RuntimeApiRequest { ValidationCode(ParaId, BlockNumber, Option, oneshot::Sender), /// Get head data for a specific para. HeadData(ParaId, oneshot::Sender), + /// Get a the candidate pending availability for a particular parachain by parachain / core index + CandidatePendingAvailability(ParaId, oneshot::Sender>), } /// A message to the Runtime API subsystem. @@ -397,6 +420,8 @@ pub enum AllMessages { AvailabilityDistribution(AvailabilityDistributionMessage), /// Message for the bitfield distribution subsystem. BitfieldDistribution(BitfieldDistributionMessage), + /// Message for the bitfield signing subsystem. + BitfieldSigning(BitfieldSigningMessage), /// Message for the Provisioner subsystem. Provisioner(ProvisionerMessage), /// Message for the PoV Distribution subsystem. diff --git a/parachain/src/primitives.rs b/parachain/src/primitives.rs index f6b69cd894..65d890e26d 100644 --- a/parachain/src/primitives.rs +++ b/parachain/src/primitives.rs @@ -80,6 +80,36 @@ impl From for Id { fn from(x: u32) -> Self { Id(x) } } +impl From for Id { + fn from(x: usize) -> Self { + use sp_std::convert::TryInto; + // can't panic, so need to truncate + let x = x.try_into().unwrap_or(u32::MAX); + Id(x) + } +} + +// When we added a second From impl for Id, type inference could no longer +// determine which impl should apply for things like `5.into()`. It therefore +// raised a bunch of errors in our test code, scattered throughout the +// various modules' tests, that there is no impl of `From` (`i32` being +// the default numeric type). +// +// We can't use `cfg(test)` here, because that configuration directive does not +// propagate between crates, which would fail to fix tests in crates other than +// this one. +// +// Instead, let's take advantage of the observation that what really matters for a +// ParaId within a test context is that it is unique and constant. I believe that +// there is no case where someone does `(-1).into()` anyway, but if they do, it +// never matters whether the actual contained ID is `-1` or `4294967295`. Nobody +// does arithmetic on a `ParaId`; doing so would be a bug. +impl From for Id { + fn from(x: i32) -> Self { + Id(x as u32) + } +} + const USER_INDEX_START: u32 = 1000; /// The ID of the first user (non-system) parachain. diff --git a/roadmap/implementers-guide/src/node/availability/bitfield-signing.md b/roadmap/implementers-guide/src/node/availability/bitfield-signing.md index 736fac4ff1..0ca9badd32 100644 --- a/roadmap/implementers-guide/src/node/availability/bitfield-signing.md +++ b/roadmap/implementers-guide/src/node/availability/bitfield-signing.md @@ -4,6 +4,10 @@ Validators vote on the availability of a backed candidate by issuing signed bitf ## Protocol +Input: + +There is no dedicated input mechanism for bitfield signing. Instead, Bitfield Signing produces a bitfield representing the current state of availability on `StartWork`. + Output: - BitfieldDistribution::DistributeBitfield: distribute a locally signed bitfield @@ -18,8 +22,8 @@ Upon receipt of an `ActiveLeavesUpdate`, launch bitfield signing job for each `a Localized to a specific relay-parent `r` If not running as a validator, do nothing. +- Begin by waiting a fixed period of time so availability distribution has the chance to make candidates available. - Determine our validator index `i`, the set of backed candidates pending availability in `r`, and which bit of the bitfield each corresponds to. -- > TODO: wait T time for availability distribution? - Start with an empty bitfield. For each bit in the bitfield, if there is a candidate pending availability, query the [Availability Store](../utility/availability-store.md) for whether we have the availability chunk for our validator index. - For all chunks we have, set the corresponding bit in the bitfield. - Sign the bitfield and dispatch a `BitfieldDistribution::DistributeBitfield` message. -- GitLab From 9637baea0ebb1c8e43860a6945cb5a9a3b4a90ab Mon Sep 17 00:00:00 2001 From: Peter Goodspeed-Niklaus Date: Thu, 23 Jul 2020 16:56:16 +0200 Subject: [PATCH 096/192] assign authorship to parity (#1459) --- node/bitfield-signing/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/node/bitfield-signing/Cargo.toml b/node/bitfield-signing/Cargo.toml index c3a2934aad..d1c7e902e9 100644 --- a/node/bitfield-signing/Cargo.toml +++ b/node/bitfield-signing/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "polkadot-node-bitfield-signing" version = "0.1.0" -authors = ["Peter Goodspeed-Niklaus "] +authors = ["Parity Technologies "] edition = "2018" [dependencies] -- GitLab From cce0a9507fddbdb0153883c20543abcec9e89d5d Mon Sep 17 00:00:00 2001 From: Robert Habermeier Date: Thu, 23 Jul 2020 15:02:24 -0400 Subject: [PATCH 097/192] Include a reference to the validation data in the candidate descriptor (#1442) * rename GlobalValidationSchedule to GlobalValidationData * guide: update candidate descriptor to contain validation data hash * guide: add note in inclusion module about checking validation data hash * primitives: update CandidateDescriptor to contain new hash * fix payload computation * add helpers for computing validation data to runtime modules * guide: note routines * inclusion: check validation data hash and fix local_validation_data bug * add a case to candidate_checks and improve that test substantially * bump versions * address review comments * add a test for including code upgrade * bump kusama version * bump westend & polkadot versions --- collator/src/lib.rs | 10 +- network/src/protocol/tests.rs | 4 +- node/core/backing/src/lib.rs | 20 +- node/primitives/src/lib.rs | 4 +- .../adder/collator/src/main.rs | 4 +- primitives/src/v0.rs | 8 +- primitives/src/v1.rs | 61 +++- .../src/runtime-api/README.md | 4 +- .../src/runtime/configuration.md | 3 + .../src/runtime/inclusion.md | 1 + .../implementers-guide/src/runtime/paras.md | 1 + .../src/types/availability.md | 4 +- .../implementers-guide/src/types/candidate.md | 19 +- .../src/types/overseer-protocol.md | 2 +- runtime/common/src/parachains.rs | 12 +- runtime/common/src/registrar.rs | 2 +- runtime/kusama/src/lib.rs | 6 +- runtime/parachains/src/configuration.rs | 13 +- runtime/parachains/src/inclusion.rs | 316 ++++++++++++++---- runtime/parachains/src/paras.rs | 35 +- runtime/parachains/src/runtime_api_impl/v1.rs | 50 +-- runtime/polkadot/src/lib.rs | 6 +- runtime/test-runtime/src/lib.rs | 4 +- runtime/westend/src/lib.rs | 6 +- validation/src/pipeline.rs | 10 +- validation/src/validation_service/mod.rs | 4 +- 26 files changed, 434 insertions(+), 175 deletions(-) diff --git a/collator/src/lib.rs b/collator/src/lib.rs index 2e2b330b0c..0b7419c29f 100644 --- a/collator/src/lib.rs +++ b/collator/src/lib.rs @@ -58,7 +58,7 @@ use sp_core::Pair; use polkadot_primitives::v0::{ BlockId, Hash, Block, DownwardMessage, BlockData, DutyRoster, HeadData, Id as ParaId, - PoVBlock, ValidatorId, CollatorPair, LocalValidationData, GlobalValidationSchedule, + PoVBlock, ValidatorId, CollatorPair, LocalValidationData, GlobalValidationData, Collation, CollationInfo, collator_signature_payload, }; use polkadot_cli::{ @@ -148,7 +148,7 @@ pub trait ParachainContext: Clone { fn produce_candidate( &mut self, relay_parent: Hash, - global_validation: GlobalValidationSchedule, + global_validation: GlobalValidationData, local_validation: LocalValidationData, downward_messages: Vec, ) -> Self::ProduceCandidate; @@ -158,7 +158,7 @@ pub trait ParachainContext: Clone { pub async fn collate

( relay_parent: Hash, local_id: ParaId, - global_validation: GlobalValidationSchedule, + global_validation: GlobalValidationData, local_validation_data: LocalValidationData, downward_messages: Vec, mut para_context: P, @@ -315,7 +315,7 @@ fn build_collator_service( let work = future::lazy(move |_| { let api = client.runtime_api(); - let global_validation = try_fr!(api.global_validation_schedule(&id)); + let global_validation = try_fr!(api.global_validation_data(&id)); let local_validation = match try_fr!(api.local_validation_data(&id, para_id)) { Some(local_validation) => local_validation, None => return future::Either::Left(future::ok(())), @@ -477,7 +477,7 @@ mod tests { fn produce_candidate( &mut self, _relay_parent: Hash, - _global: GlobalValidationSchedule, + _global: GlobalValidationData, _local_validation: LocalValidationData, _: Vec, ) -> Self::ProduceCandidate { diff --git a/network/src/protocol/tests.rs b/network/src/protocol/tests.rs index 711906797b..4e7027963c 100644 --- a/network/src/protocol/tests.rs +++ b/network/src/protocol/tests.rs @@ -21,7 +21,7 @@ use polkadot_primitives::v0::{ Block, Id as ParaId, Chain, DutyRoster, ParachainHost, ValidatorId, Retriable, CollatorId, AbridgedCandidateReceipt, - GlobalValidationSchedule, LocalValidationData, ErasureChunk, SigningContext, + GlobalValidationData, LocalValidationData, ErasureChunk, SigningContext, PoVBlock, BlockData, ValidationCode, }; use polkadot_validation::{SharedTable, TableRouter}; @@ -180,7 +180,7 @@ sp_api::mock_impl_runtime_apis! { Some(ValidationCode(Vec::new())) } - fn global_validation_schedule() -> GlobalValidationSchedule { + fn global_validation_data() -> GlobalValidationData { Default::default() } diff --git a/node/core/backing/src/lib.rs b/node/core/backing/src/lib.rs index 3d5440968d..4647526fef 100644 --- a/node/core/backing/src/lib.rs +++ b/node/core/backing/src/lib.rs @@ -606,7 +606,7 @@ impl CandidateBackingJob { with_commitments: impl FnOnce(CandidateCommitments) -> Result, ) -> Result, Error> { let omitted_validation = OmittedValidationData { - global_validation: outputs.global_validation_schedule, + global_validation: outputs.global_validation_data, local_validation: outputs.local_validation_data, }; @@ -773,7 +773,7 @@ mod tests { use futures::{executor, future, Future}; use polkadot_primitives::v1::{ AssignmentKind, BlockData, CandidateCommitments, CollatorId, CoreAssignment, CoreIndex, - LocalValidationData, GlobalValidationSchedule, GroupIndex, HeadData, + LocalValidationData, GlobalValidationData, GroupIndex, HeadData, ValidatorPair, ValidityAttestation, }; use polkadot_subsystem::{ @@ -792,7 +792,7 @@ mod tests { keystore: KeyStorePtr, validators: Vec, validator_public: Vec, - global_validation_schedule: GlobalValidationSchedule, + global_validation_data: GlobalValidationData, local_validation_data: LocalValidationData, roster: SchedulerRoster, head_data: HashMap, @@ -877,7 +877,7 @@ mod tests { validation_code_hash: Default::default(), }; - let global_validation_schedule = GlobalValidationSchedule { + let global_validation_data = GlobalValidationData { max_code_size: 1000, max_head_data_size: 1000, block_number: Default::default(), @@ -891,7 +891,7 @@ mod tests { roster, head_data, local_validation_data, - global_validation_schedule, + global_validation_data, signing_context, relay_parent, } @@ -921,7 +921,7 @@ mod tests { fn make_erasure_root(test: &TestState, pov: PoV) -> Hash { let omitted_validation = OmittedValidationData { - global_validation: test.global_validation_schedule.clone(), + global_validation: test.global_validation_data.clone(), local_validation: test.local_validation_data.clone(), }; @@ -1048,7 +1048,7 @@ mod tests { ) if pov == pov && &c == candidate.descriptor() => { tx.send(Ok( ValidationResult::Valid(ValidationOutputs { - global_validation_schedule: test_state.global_validation_schedule, + global_validation_data: test_state.global_validation_data, local_validation_data: test_state.local_validation_data, head_data: expected_head_data.clone(), upward_messages: Vec::new(), @@ -1160,7 +1160,7 @@ mod tests { ) if pov == pov && &c == candidate_a.descriptor() => { tx.send(Ok( ValidationResult::Valid(ValidationOutputs { - global_validation_schedule: test_state.global_validation_schedule, + global_validation_data: test_state.global_validation_data, local_validation_data: test_state.local_validation_data, head_data: expected_head_data.clone(), upward_messages: Vec::new(), @@ -1281,7 +1281,7 @@ mod tests { ) if pov == pov && &c == candidate_a.descriptor() => { tx.send(Ok( ValidationResult::Valid(ValidationOutputs { - global_validation_schedule: test_state.global_validation_schedule, + global_validation_data: test_state.global_validation_data, local_validation_data: test_state.local_validation_data, head_data: expected_head_data.clone(), upward_messages: Vec::new(), @@ -1438,7 +1438,7 @@ mod tests { ) if pov == pov && &c == candidate_b.descriptor() => { tx.send(Ok( ValidationResult::Valid(ValidationOutputs { - global_validation_schedule: test_state.global_validation_schedule, + global_validation_data: test_state.global_validation_data, local_validation_data: test_state.local_validation_data, head_data: expected_head_data.clone(), upward_messages: Vec::new(), diff --git a/node/primitives/src/lib.rs b/node/primitives/src/lib.rs index 6630199ae5..5064a85158 100644 --- a/node/primitives/src/lib.rs +++ b/node/primitives/src/lib.rs @@ -24,7 +24,7 @@ use parity_scale_codec::{Decode, Encode}; use polkadot_primitives::v1::{ Hash, CommittedCandidateReceipt, CandidateReceipt, CompactStatement, EncodeAs, Signed, SigningContext, ValidatorIndex, ValidatorId, - UpwardMessage, Balance, ValidationCode, GlobalValidationSchedule, LocalValidationData, + UpwardMessage, Balance, ValidationCode, GlobalValidationData, LocalValidationData, HeadData, }; use polkadot_statement_table::{ @@ -118,7 +118,7 @@ pub struct ValidationOutputs { /// The head-data produced by validation. pub head_data: HeadData, /// The global validation schedule. - pub global_validation_schedule: GlobalValidationSchedule, + pub global_validation_data: GlobalValidationData, /// The local validation data. pub local_validation_data: LocalValidationData, /// Upward messages to the relay chain. diff --git a/parachain/test-parachains/adder/collator/src/main.rs b/parachain/test-parachains/adder/collator/src/main.rs index ec5b626883..a5d3bb6dc1 100644 --- a/parachain/test-parachains/adder/collator/src/main.rs +++ b/parachain/test-parachains/adder/collator/src/main.rs @@ -24,7 +24,7 @@ use sp_core::Pair; use codec::{Encode, Decode}; use primitives::v0::{ Hash, DownwardMessage, - HeadData, BlockData, Id as ParaId, LocalValidationData, GlobalValidationSchedule, + HeadData, BlockData, Id as ParaId, LocalValidationData, GlobalValidationData, }; use collator::{ParachainContext, Network, BuildParachainContext, Cli, SubstrateCli}; use parking_lot::Mutex; @@ -58,7 +58,7 @@ impl ParachainContext for AdderContext { fn produce_candidate( &mut self, _relay_parent: Hash, - _global_validation: GlobalValidationSchedule, + _global_validation: GlobalValidationData, local_validation: LocalValidationData, _: Vec, ) -> Self::ProduceCandidate diff --git a/primitives/src/v0.rs b/primitives/src/v0.rs index e1ec3a5546..3fcb31193a 100644 --- a/primitives/src/v0.rs +++ b/primitives/src/v0.rs @@ -179,7 +179,7 @@ pub struct DutyRoster { /// These are global parameters that apply to all parachain candidates in a block. #[derive(PartialEq, Eq, Clone, Encode, Decode)] #[cfg_attr(feature = "std", derive(Debug, Default))] -pub struct GlobalValidationSchedule { +pub struct GlobalValidationData { /// The maximum code size permitted, in bytes. pub max_code_size: u32, /// The maximum head-data size permitted, in bytes. @@ -278,7 +278,7 @@ pub struct CandidateReceipt { /// The hash of the PoV-block. pub pov_block_hash: H, /// The global validation schedule. - pub global_validation: GlobalValidationSchedule, + pub global_validation: GlobalValidationData, /// The local validation data. pub local_validation: LocalValidationData, /// Commitments made as a result of validation. @@ -352,7 +352,7 @@ impl Ord for CandidateReceipt { #[cfg_attr(feature = "std", derive(Debug, Default))] pub struct OmittedValidationData { /// The global validation schedule. - pub global_validation: GlobalValidationSchedule, + pub global_validation: GlobalValidationData, /// The local validation data. pub local_validation: LocalValidationData, } @@ -762,7 +762,7 @@ sp_api::decl_runtime_apis! { fn active_parachains() -> Vec<(Id, Option<(CollatorId, Retriable)>)>; /// Get the global validation schedule that all parachains should /// be validated under. - fn global_validation_schedule() -> GlobalValidationSchedule; + fn global_validation_data() -> GlobalValidationData; /// Get the local validation data for a particular parachain. fn local_validation_data(id: Id) -> Option; /// Get the given parachain's head code blob. diff --git a/primitives/src/v1.rs b/primitives/src/v1.rs index 796dd4fb31..5d523fd300 100644 --- a/primitives/src/v1.rs +++ b/primitives/src/v1.rs @@ -60,14 +60,16 @@ pub const INCLUSION_INHERENT_IDENTIFIER: InherentIdentifier = *b"inclusn0"; pub fn collator_signature_payload>( relay_parent: &H, para_id: &Id, + validation_data_hash: &Hash, pov_hash: &Hash, -) -> [u8; 68] { +) -> [u8; 100] { // 32-byte hash length is protected in a test below. - let mut payload = [0u8; 68]; + let mut payload = [0u8; 100]; payload[0..32].copy_from_slice(relay_parent.as_ref()); u32::from(*para_id).using_encoded(|s| payload[32..32 + s.len()].copy_from_slice(s)); - payload[36..68].copy_from_slice(pov_hash.as_ref()); + payload[36..68].copy_from_slice(validation_data_hash.as_ref()); + payload[68..100].copy_from_slice(pov_hash.as_ref()); payload } @@ -75,11 +77,18 @@ pub fn collator_signature_payload>( fn check_collator_signature>( relay_parent: &H, para_id: &Id, + validation_data_hash: &Hash, pov_hash: &Hash, collator: &CollatorId, signature: &CollatorSignature, ) -> Result<(),()> { - let payload = collator_signature_payload(relay_parent, para_id, pov_hash); + let payload = collator_signature_payload( + relay_parent, + para_id, + validation_data_hash, + pov_hash, + ); + if signature.verify(&payload[..], collator) { Ok(()) } else { @@ -87,6 +96,14 @@ fn check_collator_signature>( } } +/// Compute the `validation_data_hash` from global & local validation data. +pub fn validation_data_hash( + global: &GlobalValidationData, + local: &LocalValidationData, +) -> Hash { + BlakeTwo256::hash_of(&(global, local)) +} + /// A unique descriptor of the candidate receipt. #[derive(PartialEq, Eq, Clone, Encode, Decode)] #[cfg_attr(feature = "std", derive(Debug, Default))] @@ -97,11 +114,16 @@ pub struct CandidateDescriptor { pub relay_parent: H, /// The collator's sr25519 public key. pub collator: CollatorId, - /// Signature on blake2-256 of components of this receipt: - /// The parachain index, the relay parent, and the pov_hash. - pub signature: CollatorSignature, + /// The blake2-256 hash of the validation data. This is extra data derived from + /// relay-chain state which may vary based on bitfields included before the candidate. + /// Thus it cannot be derived entirely from the relay-parent. + pub validation_data_hash: Hash, /// The blake2-256 hash of the pov. pub pov_hash: Hash, + /// Signature on blake2-256 of components of this receipt: + /// The parachain index, the relay parent, the validation data hash, and the pov_hash. + pub signature: CollatorSignature, + } impl> CandidateDescriptor { @@ -110,6 +132,7 @@ impl> CandidateDescriptor { check_collator_signature( &self.relay_parent, &self.para_id, + &self.validation_data_hash, &self.pov_hash, &self.collator, &self.signature, @@ -146,7 +169,7 @@ pub struct FullCandidateReceipt { /// The inner candidate receipt. pub inner: CandidateReceipt, /// The global validation schedule. - pub global_validation: GlobalValidationSchedule, + pub global_validation: GlobalValidationData, /// The local validation data. pub local_validation: LocalValidationData, } @@ -232,7 +255,7 @@ pub struct LocalValidationData { /// These are global parameters that apply to all candidates in a block. #[derive(PartialEq, Eq, Clone, Encode, Decode)] #[cfg_attr(feature = "std", derive(Debug, Default))] -pub struct GlobalValidationSchedule { +pub struct GlobalValidationData { /// The maximum code size permitted, in bytes. pub max_code_size: u32, /// The maximum head-data size permitted, in bytes. @@ -465,7 +488,7 @@ impl CoreAssignment { #[cfg_attr(feature = "std", derive(PartialEq, Debug))] pub struct OmittedValidationData { /// The global validation schedule. - pub global_validation: GlobalValidationSchedule, + pub global_validation: GlobalValidationData, /// The local validation data. pub local_validation: LocalValidationData, } @@ -636,9 +659,9 @@ sp_api::decl_runtime_apis! { /// cores can have paras assigned to them. fn availability_cores() -> Vec>; - /// Yields the GlobalValidationSchedule. This applies to all para candidates with the + /// Yields the GlobalValidationData. This applies to all para candidates with the /// relay-parent equal to the block in which context this is invoked in. - fn global_validation_schedule() -> GlobalValidationSchedule; + fn global_validation_data() -> GlobalValidationData; /// Yields the LocalValidationData for the given ParaId along with an assumption that /// should be used if the para currently occupies a core. @@ -696,4 +719,18 @@ mod tests { assert_eq!(info.next_rotation_at(), 0); assert_eq!(info.last_rotation_at(), 0); } + + #[test] + fn collator_signature_payload_is_valid() { + // if this fails, collator signature verification code has to be updated. + let h = Hash::default(); + assert_eq!(h.as_ref().len(), 32); + + let _payload = collator_signature_payload( + &Hash::from([1; 32]), + &5u32.into(), + &Hash::from([2; 32]), + &Hash::from([3; 32]), + ); + } } diff --git a/roadmap/implementers-guide/src/runtime-api/README.md b/roadmap/implementers-guide/src/runtime-api/README.md index 4f36ac5d10..cb8998230d 100644 --- a/roadmap/implementers-guide/src/runtime-api/README.md +++ b/roadmap/implementers-guide/src/runtime-api/README.md @@ -137,10 +137,10 @@ enum CoreState { ## Global Validation Schedule -Yields the [`GlobalValidationSchedule`](../types/candidate.md#globalvalidationschedule) at the state of a given block. This applies to all para candidates with the relay-parent equal to that block. +Yields the [`GlobalValidationData`](../types/candidate.md#globalvalidationschedule) at the state of a given block. This applies to all para candidates with the relay-parent equal to that block. ```rust -fn global_validation_schedule(at: Block) -> GlobalValidationSchedule; +fn global_validation_data(at: Block) -> GlobalValidationData; ``` ## Local Validation Data diff --git a/roadmap/implementers-guide/src/runtime/configuration.md b/roadmap/implementers-guide/src/runtime/configuration.md index 37e5202429..f1ed5eb508 100644 --- a/roadmap/implementers-guide/src/runtime/configuration.md +++ b/roadmap/implementers-guide/src/runtime/configuration.md @@ -35,6 +35,9 @@ fn update_configuration(f: impl FnOnce(&mut HostConfiguration)) { *pending = Some(x); }) } + +/// Get the GlobalValidationData, assuming the context is the parent block. +fn global_validation_data() -> GlobalValidationData; ``` ## Entry-points diff --git a/roadmap/implementers-guide/src/runtime/inclusion.md b/roadmap/implementers-guide/src/runtime/inclusion.md index 2387a9244a..e961b78bed 100644 --- a/roadmap/implementers-guide/src/runtime/inclusion.md +++ b/roadmap/implementers-guide/src/runtime/inclusion.md @@ -62,6 +62,7 @@ All failed checks should lead to an unrecoverable error making the block invalid 1. check that each candidate corresponds to a scheduled core and that they are ordered in the same order the cores appear in assignments in `scheduled`. 1. check that `scheduled` is sorted ascending by `CoreIndex`, without duplicates. 1. check that there is no candidate pending availability for any scheduled `ParaId`. + 1. check that each candidate's `validation_data_hash` corresponds to a `(LocalValidationData, GlobalValidationData)` computed from the current state. 1. If the core assignment includes a specific collator, ensure the backed candidate is issued by that collator. 1. Ensure that any code upgrade scheduled by the candidate does not happen within `config.validation_upgrade_frequency` of `Paras::last_code_upgrade(para_id, true)`, if any, comparing against the value of `Paras::FutureCodeUpgrades` for the given para ID. 1. Check the collator's signature on the candidate data. diff --git a/roadmap/implementers-guide/src/runtime/paras.md b/roadmap/implementers-guide/src/runtime/paras.md index e80c2d102d..97c49ae167 100644 --- a/roadmap/implementers-guide/src/runtime/paras.md +++ b/roadmap/implementers-guide/src/runtime/paras.md @@ -112,6 +112,7 @@ OutgoingParas: Vec; * `is_parathread(ParaId) -> bool`: Returns true if the para ID references any live parathread. * `last_code_upgrade(id: ParaId, include_future: bool) -> Option`: The block number of the last scheduled upgrade of the requested para. Includes future upgrades if the flag is set. This is the `expected_at` number, not the `activated_at` number. +* `local_validation_data(id: ParaId) -> Option`: Get the LocalValidationData of the given para, assuming the context is the parent block. Returns `None` if the para is not known. ## Finalization diff --git a/roadmap/implementers-guide/src/types/availability.md b/roadmap/implementers-guide/src/types/availability.md index be42c7a927..3afa8d8df5 100644 --- a/roadmap/implementers-guide/src/types/availability.md +++ b/roadmap/implementers-guide/src/types/availability.md @@ -26,12 +26,12 @@ struct PoV(Vec); Validation data that is often omitted from types describing candidates as it can be derived from the relay-parent of the candidate. However, with the expectation of state pruning, these are best kept available elsewhere as well. -This contains the [`GlobalValidationSchedule`](candidate.md#globalvalidationschedule) and [`LocalValidationData`](candidate.md#localvalidationdata) +This contains the [`GlobalValidationData`](candidate.md#globalvalidationschedule) and [`LocalValidationData`](candidate.md#localvalidationdata) ```rust struct OmittedValidationData { /// The global validation schedule. - global_validation: GlobalValidationSchedule, + global_validation: GlobalValidationData, /// The local validation data. local_validation: LocalValidationData, } diff --git a/roadmap/implementers-guide/src/types/candidate.md b/roadmap/implementers-guide/src/types/candidate.md index 0002851cee..dd69b23380 100644 --- a/roadmap/implementers-guide/src/types/candidate.md +++ b/roadmap/implementers-guide/src/types/candidate.md @@ -33,7 +33,7 @@ struct CandidateReceipt { ## Full Candidate Receipt -This is the full receipt type. The `GlobalValidationSchedule` and the `LocalValidationData` are technically redundant with the `inner.relay_parent`, which uniquely describes the a block in the blockchain from whose state these values are derived. The [`CandidateReceipt`](#candidate-receipt) variant is often used instead for this reason. +This is the full receipt type. The `GlobalValidationData` and the `LocalValidationData` are technically redundant with the `inner.relay_parent`, which uniquely describes the a block in the blockchain from whose state these values are derived. The [`CandidateReceipt`](#candidate-receipt) variant is often used instead for this reason. However, the Full Candidate Receipt type is useful as a means of avoiding the implicit dependency on availability of old blockchain state. In situations such as availability and approval, having the full description of the candidate within a self-contained struct is convenient. @@ -42,7 +42,7 @@ However, the Full Candidate Receipt type is useful as a means of avoiding the im struct FullCandidateReceipt { inner: CandidateReceipt, /// The global validation schedule. - global_validation: GlobalValidationSchedule, + global_validation: GlobalValidationData, /// The local validation data. local_validation: LocalValidationData, } @@ -77,16 +77,19 @@ struct CandidateDescriptor { relay_parent: Hash, /// The collator's sr25519 public key. collator: CollatorId, - /// Signature on blake2-256 of components of this receipt: - /// The parachain index, the relay parent, and the pov_hash. - signature: CollatorSignature, + /// The blake2-256 hash of the validation data. These are extra parameters + /// derived from relay-chain state that influence the validity of the block. + validation_data_hash: Hash, /// The blake2-256 hash of the pov-block. pov_hash: Hash, + /// Signature on blake2-256 of components of this receipt: + /// The parachain index, the relay parent, the validation data hash, and the pov_hash. + signature: CollatorSignature, } ``` -## GlobalValidationSchedule +## GlobalValidationData The global validation schedule comprises of information describing the global environment for para execution, as derived from a particular relay-parent. These are parameters that will apply to all parablocks executed in the context of this relay-parent. @@ -95,7 +98,7 @@ The global validation schedule comprises of information describing the global en /// to fully validate the candidate. /// /// These are global parameters that apply to all candidates in a block. -struct GlobalValidationSchedule { +struct GlobalValidationData { /// The maximum code size permitted, in bytes. max_code_size: u32, /// The maximum head-data size permitted, in bytes. @@ -197,7 +200,7 @@ struct ValidationOutputs { /// The head-data produced by validation. head_data: HeadData, /// The global validation schedule. - global_validation_schedule: GlobalValidationSchedule, + global_validation_data: GlobalValidationData, /// The local validation data. local_validation_data: LocalValidationData, /// Upwards messages to the relay chain. diff --git a/roadmap/implementers-guide/src/types/overseer-protocol.md b/roadmap/implementers-guide/src/types/overseer-protocol.md index f6ff4213fd..d777460176 100644 --- a/roadmap/implementers-guide/src/types/overseer-protocol.md +++ b/roadmap/implementers-guide/src/types/overseer-protocol.md @@ -255,7 +255,7 @@ enum RuntimeApiRequest { /// Get the validation code for a specific para, using the given occupied core assumption. ValidationCode(ParaId, OccupiedCoreAssumption, ResponseChannel>), /// Get the global validation schedule at the state of a given block. - GlobalValidationSchedule(ResponseChannel), + GlobalValidationData(ResponseChannel), /// Get the local validation data for a specific para, with the given occupied core assumption. LocalValidationData( ParaId, diff --git a/runtime/common/src/parachains.rs b/runtime/common/src/parachains.rs index 2df3669ded..a5d81989aa 100644 --- a/runtime/common/src/parachains.rs +++ b/runtime/common/src/parachains.rs @@ -41,7 +41,7 @@ use primitives::v0::{ Balance, BlockNumber, Id as ParaId, Chain, DutyRoster, AttestedCandidate, CompactStatement as Statement, ParachainDispatchOrigin, UpwardMessage, ValidatorId, ActiveParas, CollatorId, Retriable, OmittedValidationData, - CandidateReceipt, GlobalValidationSchedule, AbridgedCandidateReceipt, + CandidateReceipt, GlobalValidationData, AbridgedCandidateReceipt, LocalValidationData, Scheduling, ValidityAttestation, NEW_HEADS_IDENTIFIER, PARACHAIN_KEY_TYPE_ID, ValidatorSignature, SigningContext, HeadData, ValidationCode, Remark, DownwardMessage @@ -601,7 +601,7 @@ decl_module! { let mut proceeded = Vec::with_capacity(heads.len()); - let schedule = Self::global_validation_schedule(); + let schedule = Self::global_validation_data(); if !active_parachains.is_empty() { // perform integrity checks before writing to storage. @@ -1168,9 +1168,9 @@ impl Module { } /// Get the global validation schedule for all parachains. - pub fn global_validation_schedule() -> GlobalValidationSchedule { + pub fn global_validation_data() -> GlobalValidationData { let now = >::block_number(); - GlobalValidationSchedule { + GlobalValidationData { max_code_size: T::MaxCodeSize::get(), max_head_data_size: T::MaxHeadDataSize::get(), block_number: T::BlockNumberConversion::convert(if now.is_zero() { @@ -1322,7 +1322,7 @@ impl Module { // check the attestations on these candidates. The candidates should have been checked // that each candidates' chain ID is valid. fn check_candidates( - schedule: &GlobalValidationSchedule, + schedule: &GlobalValidationData, attested_candidates: &[AttestedCandidate], active_parachains: &[(ParaId, Option<(CollatorId, Retriable)>)] ) -> sp_std::result::Result, sp_runtime::DispatchError> { @@ -2157,7 +2157,7 @@ mod tests { collator: Default::default(), signature: Default::default(), pov_block_hash: Default::default(), - global_validation: Parachains::global_validation_schedule(), + global_validation: Parachains::global_validation_data(), local_validation: Parachains::current_local_validation_data(¶_id).unwrap(), commitments: CandidateCommitments::default(), } diff --git a/runtime/common/src/registrar.rs b/runtime/common/src/registrar.rs index e3b6d5ec12..5493d20839 100644 --- a/runtime/common/src/registrar.rs +++ b/runtime/common/src/registrar.rs @@ -1070,7 +1070,7 @@ mod tests { collator: collator.public(), signature: pov_block_hash.using_encoded(|d| collator.sign(d)), pov_block_hash, - global_validation: Parachains::global_validation_schedule(), + global_validation: Parachains::global_validation_data(), local_validation: Parachains::current_local_validation_data(&id).unwrap(), commitments: CandidateCommitments { fees: 0, diff --git a/runtime/kusama/src/lib.rs b/runtime/kusama/src/lib.rs index 7354feb6dd..3e921b433b 100644 --- a/runtime/kusama/src/lib.rs +++ b/runtime/kusama/src/lib.rs @@ -87,7 +87,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("kusama"), impl_name: create_runtime_str!("parity-kusama"), authoring_version: 2, - spec_version: 2019, + spec_version: 2020, impl_version: 0, #[cfg(not(feature = "disable-runtime-api"))] apis: RUNTIME_API_VERSIONS, @@ -1115,8 +1115,8 @@ sp_api::impl_runtime_apis! { fn active_parachains() -> Vec<(parachain::Id, Option<(parachain::CollatorId, parachain::Retriable)>)> { Registrar::active_paras() } - fn global_validation_schedule() -> parachain::GlobalValidationSchedule { - Parachains::global_validation_schedule() + fn global_validation_data() -> parachain::GlobalValidationData { + Parachains::global_validation_data() } fn local_validation_data(id: parachain::Id) -> Option { Parachains::current_local_validation_data(&id) diff --git a/runtime/parachains/src/configuration.rs b/runtime/parachains/src/configuration.rs index b977bc119b..6fc9dd4230 100644 --- a/runtime/parachains/src/configuration.rs +++ b/runtime/parachains/src/configuration.rs @@ -19,12 +19,13 @@ //! Configuration can change only at session boundaries and is buffered until then. use sp_std::prelude::*; -use primitives::v1::ValidatorId; +use primitives::v1::{ValidatorId, GlobalValidationData}; use frame_support::{ decl_storage, decl_module, decl_error, dispatch::DispatchResult, weights::{DispatchClass, Weight}, }; +use sp_runtime::traits::One; use codec::{Encode, Decode}; use system::ensure_root; @@ -219,6 +220,16 @@ impl Module { ::PendingConfig::set(Some(prev)); } } + + /// Computes the global validation-data, assuming the context of the parent block. + pub(crate) fn global_validation_data() -> GlobalValidationData { + let config = Self::config(); + GlobalValidationData { + max_code_size: config.max_code_size, + max_head_data_size: config.max_head_data_size, + block_number: >::block_number() - One::one(), + } + } } #[cfg(test)] diff --git a/runtime/parachains/src/inclusion.rs b/runtime/parachains/src/inclusion.rs index 435342cfb8..e6f5ff1a0a 100644 --- a/runtime/parachains/src/inclusion.rs +++ b/runtime/parachains/src/inclusion.rs @@ -22,6 +22,7 @@ use sp_std::prelude::*; use primitives::v1::{ + validation_data_hash, ValidatorId, CandidateCommitments, CandidateDescriptor, ValidatorIndex, Id as ParaId, AvailabilityBitfield as AvailabilityBitfield, SignedAvailabilityBitfields, SigningContext, BackedCandidate, CoreIndex, GroupIndex, CoreAssignment, CommittedCandidateReceipt, @@ -145,6 +146,8 @@ decl_error! { InvalidBacking, /// Collator did not sign PoV. NotCollatorSigned, + /// The validation data hash does not match expected. + ValidationDataHashMismatch, /// Internal error only returned when compiled with debug assertions. InternalError, } @@ -399,14 +402,21 @@ impl Module { Error::::CandidateNotInParentContext, ); - let code_upgrade_allowed = >::last_code_upgrade(para_id, true) - .map_or( - true, - |last| last <= relay_parent_number && - relay_parent_number.saturating_sub(last) >= config.validation_upgrade_frequency, - ); + // if any, the code upgrade attempt is allowed. + let valid_upgrade_attempt = + candidate.candidate.commitments.new_validation_code.is_none() || + >::last_code_upgrade(para_id, true) + .map_or( + true, + |last| last <= relay_parent_number && + relay_parent_number.saturating_sub(last) + >= config.validation_upgrade_frequency, + ); - ensure!(code_upgrade_allowed, Error::::PrematureCodeUpgrade); + ensure!( + valid_upgrade_attempt, + Error::::PrematureCodeUpgrade, + ); ensure!( candidate.descriptor().check_collator_signature().is_ok(), Error::::NotCollatorSigned, @@ -423,6 +433,32 @@ impl Module { ); } + { + // this should never fail because the para is registered + let (global_validation_data, local_validation_data) = ( + >::global_validation_data(), + match >::local_validation_data(para_id) { + Some(l) => l, + None => { + // We don't want to error out here because it will + // brick the relay-chain. So we return early without + // doing anything. + return Ok(Vec::new()); + } + } + ); + + let expected = validation_data_hash( + &global_validation_data, + &local_validation_data, + ); + + ensure!( + expected == candidate.descriptor().validation_data_hash, + Error::::ValidationDataHashMismatch, + ); + } + ensure!( >::get(¶_id).is_none() && ::get(¶_id).is_none(), @@ -686,6 +722,7 @@ mod tests { let payload = primitives::v1::collator_signature_payload( &candidate.descriptor.relay_parent, &candidate.descriptor.para_id, + &candidate.descriptor.validation_data_hash, &candidate.descriptor.pov_hash, ); @@ -814,6 +851,7 @@ mod tests { head_data: HeadData, pov_hash: Hash, relay_parent: Hash, + validation_data_hash: Hash, new_validation_code: Option, } @@ -824,6 +862,7 @@ mod tests { para_id: self.para_id, pov_hash: self.pov_hash, relay_parent: self.relay_parent, + validation_data_hash: self.validation_data_hash, ..Default::default() }, commitments: CandidateCommitments { @@ -835,6 +874,12 @@ mod tests { } } + fn make_vdata_hash(para_id: ParaId) -> Option { + let global_validation_data = Configuration::global_validation_data(); + let local_validation_data = Paras::local_validation_data(para_id)?; + Some(validation_data_hash(&global_validation_data, &local_validation_data)) + } + #[test] fn collect_pending_cleans_up_pending() { let chain_a = ParaId::from(1); @@ -1261,6 +1306,7 @@ mod tests { para_id: chain_a, relay_parent: System::parent_hash(), pov_hash: Hash::from([1; 32]), + validation_data_hash: make_vdata_hash(chain_a).unwrap(), ..Default::default() }.build(); collator_sign_candidate( @@ -1276,11 +1322,14 @@ mod tests { BackingKind::Threshold, ); - assert!(Inclusion::process_candidates( - vec![backed], - vec![chain_b_assignment.clone()], - &group_validators, - ).is_err()); + assert_eq!( + Inclusion::process_candidates( + vec![backed], + vec![chain_b_assignment.clone()], + &group_validators, + ), + Err(Error::::UnscheduledCandidate.into()), + ); } // candidates out of order. @@ -1289,12 +1338,14 @@ mod tests { para_id: chain_a, relay_parent: System::parent_hash(), pov_hash: Hash::from([1; 32]), + validation_data_hash: make_vdata_hash(chain_a).unwrap(), ..Default::default() }.build(); let mut candidate_b = TestCandidateBuilder { para_id: chain_b, relay_parent: System::parent_hash(), pov_hash: Hash::from([2; 32]), + validation_data_hash: make_vdata_hash(chain_b).unwrap(), ..Default::default() }.build(); @@ -1324,11 +1375,15 @@ mod tests { BackingKind::Threshold, ); - assert!(Inclusion::process_candidates( - vec![backed_b, backed_a], - vec![chain_a_assignment.clone(), chain_b_assignment.clone()], - &group_validators, - ).is_err()); + // out-of-order manifests as unscheduled. + assert_eq!( + Inclusion::process_candidates( + vec![backed_b, backed_a], + vec![chain_a_assignment.clone(), chain_b_assignment.clone()], + &group_validators, + ), + Err(Error::::UnscheduledCandidate.into()), + ); } // candidate not backed. @@ -1337,6 +1392,7 @@ mod tests { para_id: chain_a, relay_parent: System::parent_hash(), pov_hash: Hash::from([1; 32]), + validation_data_hash: make_vdata_hash(chain_a).unwrap(), ..Default::default() }.build(); collator_sign_candidate( @@ -1352,11 +1408,14 @@ mod tests { BackingKind::Lacking, ); - assert!(Inclusion::process_candidates( - vec![backed], - vec![chain_a_assignment.clone()], - &group_validators, - ).is_err()); + assert_eq!( + Inclusion::process_candidates( + vec![backed], + vec![chain_a_assignment.clone()], + &group_validators, + ), + Err(Error::::InsufficientBacking.into()), + ); } // candidate not in parent context. @@ -1368,6 +1427,7 @@ mod tests { para_id: chain_a, relay_parent: wrong_parent_hash, pov_hash: Hash::from([1; 32]), + validation_data_hash: make_vdata_hash(chain_a).unwrap(), ..Default::default() }.build(); collator_sign_candidate( @@ -1383,11 +1443,14 @@ mod tests { BackingKind::Threshold, ); - assert!(Inclusion::process_candidates( - vec![backed], - vec![chain_a_assignment.clone()], - &group_validators, - ).is_err()); + assert_eq!( + Inclusion::process_candidates( + vec![backed], + vec![chain_a_assignment.clone()], + &group_validators, + ), + Err(Error::::CandidateNotInParentContext.into()), + ); } // candidate has wrong collator. @@ -1396,6 +1459,7 @@ mod tests { para_id: thread_a, relay_parent: System::parent_hash(), pov_hash: Hash::from([1; 32]), + validation_data_hash: make_vdata_hash(thread_a).unwrap(), ..Default::default() }.build(); @@ -1413,15 +1477,18 @@ mod tests { BackingKind::Threshold, ); - assert!(Inclusion::process_candidates( - vec![backed], - vec![ - chain_a_assignment.clone(), - chain_b_assignment.clone(), - thread_a_assignment.clone(), - ], - &group_validators, - ).is_err()); + assert_eq!( + Inclusion::process_candidates( + vec![backed], + vec![ + chain_a_assignment.clone(), + chain_b_assignment.clone(), + thread_a_assignment.clone(), + ], + &group_validators, + ), + Err(Error::::WrongCollator.into()), + ); } // candidate not well-signed by collator. @@ -1430,6 +1497,7 @@ mod tests { para_id: thread_a, relay_parent: System::parent_hash(), pov_hash: Hash::from([1; 32]), + validation_data_hash: make_vdata_hash(thread_a).unwrap(), ..Default::default() }.build(); @@ -1450,11 +1518,14 @@ mod tests { BackingKind::Threshold, ); - assert!(Inclusion::process_candidates( - vec![backed], - vec![thread_a_assignment.clone()], - &group_validators, - ).is_err()); + assert_eq!( + Inclusion::process_candidates( + vec![backed], + vec![thread_a_assignment.clone()], + &group_validators, + ), + Err(Error::::NotCollatorSigned.into()), + ); } // para occupied - reject. @@ -1463,6 +1534,7 @@ mod tests { para_id: chain_a, relay_parent: System::parent_hash(), pov_hash: Hash::from([1; 32]), + validation_data_hash: make_vdata_hash(chain_a).unwrap(), ..Default::default() }.build(); @@ -1489,11 +1561,14 @@ mod tests { }); ::insert(&chain_a, candidate.commitments); - assert!(Inclusion::process_candidates( - vec![backed], - vec![chain_a_assignment.clone()], - &group_validators, - ).is_err()); + assert_eq!( + Inclusion::process_candidates( + vec![backed], + vec![chain_a_assignment.clone()], + &group_validators, + ), + Err(Error::::CandidateScheduledBeforeParaFree.into()), + ); >::remove(&chain_a); ::remove(&chain_a); @@ -1505,6 +1580,7 @@ mod tests { para_id: chain_a, relay_parent: System::parent_hash(), pov_hash: Hash::from([1; 32]), + validation_data_hash: make_vdata_hash(chain_a).unwrap(), ..Default::default() }.build(); @@ -1524,11 +1600,14 @@ mod tests { BackingKind::Threshold, ); - assert!(Inclusion::process_candidates( - vec![backed], - vec![chain_a_assignment.clone()], - &group_validators, - ).is_err()); + assert_eq!( + Inclusion::process_candidates( + vec![backed], + vec![chain_a_assignment.clone()], + &group_validators, + ), + Err(Error::::CandidateScheduledBeforeParaFree.into()), + ); ::remove(&chain_a); } @@ -1540,6 +1619,7 @@ mod tests { relay_parent: System::parent_hash(), pov_hash: Hash::from([1; 32]), new_validation_code: Some(vec![5, 6, 7, 8].into()), + validation_data_hash: make_vdata_hash(chain_a).unwrap(), ..Default::default() }.build(); @@ -1564,11 +1644,47 @@ mod tests { assert_eq!(Paras::last_code_upgrade(chain_a, true), Some(10)); - assert!(Inclusion::process_candidates( - vec![backed], - vec![thread_a_assignment.clone()], - &group_validators, - ).is_err()); + assert_eq!( + Inclusion::process_candidates( + vec![backed], + vec![chain_a_assignment.clone()], + &group_validators, + ), + Err(Error::::PrematureCodeUpgrade.into()), + ); + } + + // Bad validation data hash - reject + { + let mut candidate = TestCandidateBuilder { + para_id: chain_a, + relay_parent: System::parent_hash(), + pov_hash: Hash::from([1; 32]), + validation_data_hash: [42u8; 32].into(), + ..Default::default() + }.build(); + + collator_sign_candidate( + Sr25519Keyring::One, + &mut candidate, + ); + + let backed = back_candidate( + candidate, + &validators, + group_validators(GroupIndex::from(0)).unwrap().as_ref(), + &signing_context, + BackingKind::Threshold, + ); + + assert_eq!( + Inclusion::process_candidates( + vec![backed], + vec![chain_a_assignment.clone()], + &group_validators, + ), + Err(Error::::ValidationDataHashMismatch.into()), + ); } }); } @@ -1634,6 +1750,7 @@ mod tests { para_id: chain_a, relay_parent: System::parent_hash(), pov_hash: Hash::from([1; 32]), + validation_data_hash: make_vdata_hash(chain_a).unwrap(), ..Default::default() }.build(); collator_sign_candidate( @@ -1645,6 +1762,7 @@ mod tests { para_id: chain_b, relay_parent: System::parent_hash(), pov_hash: Hash::from([2; 32]), + validation_data_hash: make_vdata_hash(chain_b).unwrap(), ..Default::default() }.build(); collator_sign_candidate( @@ -1656,6 +1774,7 @@ mod tests { para_id: thread_a, relay_parent: System::parent_hash(), pov_hash: Hash::from([3; 32]), + validation_data_hash: make_vdata_hash(thread_a).unwrap(), ..Default::default() }.build(); collator_sign_candidate( @@ -1746,6 +1865,91 @@ mod tests { }); } + #[test] + fn can_include_candidate_with_ok_code_upgrade() { + let chain_a = ParaId::from(1); + + let paras = vec![(chain_a, true)]; + let validators = vec![ + Sr25519Keyring::Alice, + Sr25519Keyring::Bob, + Sr25519Keyring::Charlie, + Sr25519Keyring::Dave, + Sr25519Keyring::Ferdie, + ]; + let validator_public = validator_pubkeys(&validators); + + new_test_ext(genesis_config(paras)).execute_with(|| { + Validators::set(validator_public.clone()); + CurrentSessionIndex::set(5); + + run_to_block(5, |_| None); + + let signing_context = SigningContext { + parent_hash: System::parent_hash(), + session_index: 5, + }; + + let group_validators = |group_index: GroupIndex| match group_index { + group_index if group_index == GroupIndex::from(0) => Some(vec![0, 1, 2, 3, 4]), + _ => panic!("Group index out of bounds for 1 parachain"), + }; + + let chain_a_assignment = CoreAssignment { + core: CoreIndex::from(0), + para_id: chain_a, + kind: AssignmentKind::Parachain, + group_idx: GroupIndex::from(0), + }; + + let mut candidate_a = TestCandidateBuilder { + para_id: chain_a, + relay_parent: System::parent_hash(), + pov_hash: Hash::from([1; 32]), + validation_data_hash: make_vdata_hash(chain_a).unwrap(), + new_validation_code: Some(vec![1, 2, 3].into()), + ..Default::default() + }.build(); + collator_sign_candidate( + Sr25519Keyring::One, + &mut candidate_a, + ); + + let backed_a = back_candidate( + candidate_a.clone(), + &validators, + group_validators(GroupIndex::from(0)).unwrap().as_ref(), + &signing_context, + BackingKind::Threshold, + ); + + let occupied_cores = Inclusion::process_candidates( + vec![backed_a], + vec![ + chain_a_assignment.clone(), + ], + &group_validators, + ).expect("candidates scheduled, in order, and backed"); + + assert_eq!(occupied_cores, vec![CoreIndex::from(0)]); + + assert_eq!( + >::get(&chain_a), + Some(CandidatePendingAvailability { + core: CoreIndex::from(0), + descriptor: candidate_a.descriptor, + availability_votes: default_availability_votes(), + relay_parent_number: System::block_number() - 1, + backed_in_number: System::block_number(), + }) + ); + assert_eq!( + ::get(&chain_a), + Some(candidate_a.commitments), + ); + }); + } + #[test] fn session_change_wipes_and_updates_session_info() { let chain_a = ParaId::from(1); diff --git a/runtime/parachains/src/paras.rs b/runtime/parachains/src/paras.rs index 0117089f11..2eab9c0546 100644 --- a/runtime/parachains/src/paras.rs +++ b/runtime/parachains/src/paras.rs @@ -25,9 +25,9 @@ use sp_std::prelude::*; use sp_std::marker::PhantomData; -use sp_runtime::traits::One; +use sp_runtime::traits::{One, BlakeTwo256, Hash as HashT, Saturating}; use primitives::v1::{ - Id as ParaId, ValidationCode, HeadData, + Id as ParaId, ValidationCode, HeadData, LocalValidationData, }; use frame_support::{ decl_storage, decl_module, decl_error, @@ -536,6 +536,37 @@ impl Module { Self::past_code_meta(&id).most_recent_change() } + + /// Compute the local-validation data based on the head of the para. This assumes the + /// relay-parent is the parent of the current block. + pub(crate) fn local_validation_data(para_id: ParaId) -> Option> { + let relay_parent_number = >::block_number() - One::one(); + + let config = >::config(); + let freq = config.validation_upgrade_frequency; + let delay = config.validation_upgrade_delay; + + let last_code_upgrade = Self::last_code_upgrade(para_id, true); + let can_upgrade_code = last_code_upgrade.map_or( + true, + |l| { l <= relay_parent_number && relay_parent_number.saturating_sub(l) >= freq }, + ); + + let code_upgrade_allowed = if can_upgrade_code { + Some(relay_parent_number + delay) + } else { + None + }; + + Some(LocalValidationData { + parent_head: Self::para_head(¶_id)?, + balance: 0, + validation_code_hash: BlakeTwo256::hash_of( + &Self::current_code(¶_id)? + ), + code_upgrade_allowed, + }) + } } #[cfg(test)] diff --git a/runtime/parachains/src/runtime_api_impl/v1.rs b/runtime/parachains/src/runtime_api_impl/v1.rs index fa5026dbad..7f4a9093d4 100644 --- a/runtime/parachains/src/runtime_api_impl/v1.rs +++ b/runtime/parachains/src/runtime_api_impl/v1.rs @@ -18,12 +18,12 @@ //! functions. use primitives::v1::{ - ValidatorId, ValidatorIndex, GroupRotationInfo, CoreState, GlobalValidationSchedule, + ValidatorId, ValidatorIndex, GroupRotationInfo, CoreState, GlobalValidationData, Id as ParaId, OccupiedCoreAssumption, LocalValidationData, SessionIndex, ValidationCode, CommittedCandidateReceipt, ScheduledCore, OccupiedCore, CoreOccupied, CoreIndex, GroupIndex, CandidateEvent, }; -use sp_runtime::traits::{One, BlakeTwo256, Hash as HashT, Saturating, Zero}; +use sp_runtime::traits::Zero; use frame_support::debug; use crate::{initializer, inclusion, scheduler, configuration, paras}; @@ -160,16 +160,11 @@ pub fn availability_cores() -> Vec() - -> GlobalValidationSchedule +/// Implementation for the `global_validation_data` function of the runtime API. +pub fn global_validation_data() + -> GlobalValidationData { - let config = >::config(); - GlobalValidationSchedule { - max_code_size: config.max_code_size, - max_head_data_size: config.max_head_data_size, - block_number: >::block_number() - One::one(), - } + >::global_validation_data() } /// Implementation for the `local_validation_data` function of the runtime API. @@ -177,46 +172,19 @@ pub fn local_validation_data( para_id: ParaId, assumption: OccupiedCoreAssumption, ) -> Option> { - let construct = || { - let relay_parent_number = >::block_number() - One::one(); - - let config = >::config(); - let freq = config.validation_upgrade_frequency; - let delay = config.validation_upgrade_delay; - - let last_code_upgrade = >::last_code_upgrade(para_id, true)?; - let can_upgrade_code = last_code_upgrade <= relay_parent_number - && relay_parent_number.saturating_sub(last_code_upgrade) >= freq; - - let code_upgrade_allowed = if can_upgrade_code { - Some(relay_parent_number + delay) - } else { - None - }; - - Some(LocalValidationData { - parent_head: >::para_head(¶_id)?, - balance: 0, - validation_code_hash: BlakeTwo256::hash_of( - &>::current_code(¶_id)? - ), - code_upgrade_allowed, - }) - }; - match assumption { OccupiedCoreAssumption::Included => { >::force_enact(para_id); - construct() + >::local_validation_data(para_id) } OccupiedCoreAssumption::TimedOut => { - construct() + >::local_validation_data(para_id) } OccupiedCoreAssumption::Free => { if >::pending_availability(para_id).is_some() { None } else { - construct() + >::local_validation_data(para_id) } } } diff --git a/runtime/polkadot/src/lib.rs b/runtime/polkadot/src/lib.rs index e7afcfe16b..f8d8cea3ab 100644 --- a/runtime/polkadot/src/lib.rs +++ b/runtime/polkadot/src/lib.rs @@ -86,7 +86,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("polkadot"), impl_name: create_runtime_str!("parity-polkadot"), authoring_version: 0, - spec_version: 19, + spec_version: 20, impl_version: 0, #[cfg(not(feature = "disable-runtime-api"))] apis: RUNTIME_API_VERSIONS, @@ -1256,8 +1256,8 @@ sp_api::impl_runtime_apis! { fn active_parachains() -> Vec<(parachain::Id, Option<(parachain::CollatorId, parachain::Retriable)>)> { Registrar::active_paras() } - fn global_validation_schedule() -> parachain::GlobalValidationSchedule { - Parachains::global_validation_schedule() + fn global_validation_data() -> parachain::GlobalValidationData { + Parachains::global_validation_data() } fn local_validation_data(id: parachain::Id) -> Option { Parachains::current_local_validation_data(&id) diff --git a/runtime/test-runtime/src/lib.rs b/runtime/test-runtime/src/lib.rs index 032efaacfb..65c92aae0c 100644 --- a/runtime/test-runtime/src/lib.rs +++ b/runtime/test-runtime/src/lib.rs @@ -676,8 +676,8 @@ sp_api::impl_runtime_apis! { fn active_parachains() -> Vec<(parachain::Id, Option<(parachain::CollatorId, parachain::Retriable)>)> { Registrar::active_paras() } - fn global_validation_schedule() -> parachain::GlobalValidationSchedule { - Parachains::global_validation_schedule() + fn global_validation_data() -> parachain::GlobalValidationData { + Parachains::global_validation_data() } fn local_validation_data(id: parachain::Id) -> Option { Parachains::current_local_validation_data(&id) diff --git a/runtime/westend/src/lib.rs b/runtime/westend/src/lib.rs index 6d7fdc79f0..f48ee40e53 100644 --- a/runtime/westend/src/lib.rs +++ b/runtime/westend/src/lib.rs @@ -83,7 +83,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("westend"), impl_name: create_runtime_str!("parity-westend"), authoring_version: 2, - spec_version: 39, + spec_version: 40, impl_version: 0, #[cfg(not(feature = "disable-runtime-api"))] apis: RUNTIME_API_VERSIONS, @@ -897,8 +897,8 @@ sp_api::impl_runtime_apis! { fn active_parachains() -> Vec<(parachain::Id, Option<(parachain::CollatorId, parachain::Retriable)>)> { Registrar::active_paras() } - fn global_validation_schedule() -> parachain::GlobalValidationSchedule { - Parachains::global_validation_schedule() + fn global_validation_data() -> parachain::GlobalValidationData { + Parachains::global_validation_data() } fn local_validation_data(id: parachain::Id) -> Option { Parachains::current_local_validation_data(&id) diff --git a/validation/src/pipeline.rs b/validation/src/pipeline.rs index f2a705ba10..663321480c 100644 --- a/validation/src/pipeline.rs +++ b/validation/src/pipeline.rs @@ -20,7 +20,7 @@ use codec::Encode; use polkadot_erasure_coding as erasure; use polkadot_primitives::v0::{ - CollationInfo, PoVBlock, LocalValidationData, GlobalValidationSchedule, OmittedValidationData, + CollationInfo, PoVBlock, LocalValidationData, GlobalValidationData, OmittedValidationData, AvailableData, FeeSchedule, CandidateCommitments, ErasureChunk, ParachainHost, Id as ParaId, AbridgedCandidateReceipt, ValidationCode, }; @@ -95,7 +95,7 @@ impl FullOutput { /// validation are needed, call `full_output`. Otherwise, safely drop this value. pub struct ValidatedCandidate<'a> { pov_block: &'a PoVBlock, - global_validation: &'a GlobalValidationSchedule, + global_validation: &'a GlobalValidationData, local_validation: &'a LocalValidationData, upward_messages: Vec, fees: Balance, @@ -189,7 +189,7 @@ pub fn validate<'a>( collation: &'a CollationInfo, pov_block: &'a PoVBlock, local_validation: &'a LocalValidationData, - global_validation: &'a GlobalValidationSchedule, + global_validation: &'a GlobalValidationData, validation_code: &ValidationCode, ) -> Result, Error> { if collation.head_data.0.len() > global_validation.max_head_data_size as _ { @@ -249,7 +249,7 @@ pub fn validate<'a>( /// Extracts validation parameters from a Polkadot runtime API for a specific parachain. pub fn validation_params

(api: &P, relay_parent: Hash, para_id: ParaId) - -> Result<(LocalValidationData, GlobalValidationSchedule, ValidationCode), Error> + -> Result<(LocalValidationData, GlobalValidationData, ValidationCode), Error> where P: ProvideRuntimeApi, P::Api: ParachainHost, @@ -261,7 +261,7 @@ where let local_validation = api.local_validation_data(&relay_parent, para_id)? .ok_or_else(|| Error::InactiveParachain(para_id))?; - let global_validation = api.global_validation_schedule(&relay_parent)?; + let global_validation = api.global_validation_data(&relay_parent)?; let validation_code = api.parachain_code(&relay_parent, para_id)? .ok_or_else(|| Error::InactiveParachain(para_id))?; diff --git a/validation/src/validation_service/mod.rs b/validation/src/validation_service/mod.rs index 7f332f4c0d..11116fcaff 100644 --- a/validation/src/validation_service/mod.rs +++ b/validation/src/validation_service/mod.rs @@ -547,7 +547,7 @@ mod tests { use availability_store::ErasureNetworking; use polkadot_primitives::v0::{ PoVBlock, AbridgedCandidateReceipt, ErasureChunk, ValidatorIndex, - CollationInfo, DutyRoster, GlobalValidationSchedule, LocalValidationData, + CollationInfo, DutyRoster, GlobalValidationData, LocalValidationData, Retriable, CollatorId, BlockData, Chain, AvailableData, SigningContext, ValidationCode, }; use runtime_primitives::traits::Block as BlockT; @@ -697,7 +697,7 @@ mod tests { fn validators(&self) -> Vec { self.validators.clone() } fn duty_roster(&self) -> DutyRoster { self.duty_roster.clone() } fn active_parachains() -> Vec<(ParaId, Option<(CollatorId, Retriable)>)> { vec![(ParaId::from(1), None)] } - fn global_validation_schedule() -> GlobalValidationSchedule { Default::default() } + fn global_validation_data() -> GlobalValidationData { Default::default() } fn local_validation_data(_: ParaId) -> Option { None } fn parachain_code(_: ParaId) -> Option { None } fn get_heads(_: Vec<::Extrinsic>) -> Option> { -- GitLab From f50db053f0e7790fdb8de5d17eb0806ccefb3383 Mon Sep 17 00:00:00 2001 From: Robert Habermeier Date: Fri, 24 Jul 2020 07:18:37 -0400 Subject: [PATCH 098/192] move bitfield-signing crate to `node/core` (#1465) --- Cargo.lock | 26 ++++++++++----------- Cargo.toml | 2 +- node/{ => core}/bitfield-signing/Cargo.toml | 6 ++--- node/{ => core}/bitfield-signing/src/lib.rs | 0 4 files changed, 17 insertions(+), 17 deletions(-) rename node/{ => core}/bitfield-signing/Cargo.toml (66%) rename node/{ => core}/bitfield-signing/src/lib.rs (100%) diff --git a/Cargo.lock b/Cargo.lock index 76b257eddd..9d7078f2d7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4545,38 +4545,38 @@ dependencies = [ ] [[package]] -name = "polkadot-node-bitfield-signing" +name = "polkadot-node-core-backing" version = "0.1.0" dependencies = [ + "assert_matches", "bitvec", "derive_more 0.99.9", "futures 0.3.5", - "log 0.4.8", + "polkadot-erasure-coding", + "polkadot-node-primitives", "polkadot-node-subsystem", "polkadot-primitives", + "polkadot-statement-table", + "sc-client-api", "sc-keystore", - "wasm-timer", + "sp-api", + "sp-blockchain", + "sp-core", + "sp-keyring", ] [[package]] -name = "polkadot-node-core-backing" +name = "polkadot-node-core-bitfield-signing" version = "0.1.0" dependencies = [ - "assert_matches", "bitvec", "derive_more 0.99.9", "futures 0.3.5", - "polkadot-erasure-coding", - "polkadot-node-primitives", + "log 0.4.8", "polkadot-node-subsystem", "polkadot-primitives", - "polkadot-statement-table", - "sc-client-api", "sc-keystore", - "sp-api", - "sp-blockchain", - "sp-core", - "sp-keyring", + "wasm-timer", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 58211e1620..a18c98f83d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -43,7 +43,7 @@ members = [ "service", "validation", - "node/bitfield-signing", + "node/core/bitfield-signing", "node/core/proposer", "node/network/bridge", "node/network/pov-distribution", diff --git a/node/bitfield-signing/Cargo.toml b/node/core/bitfield-signing/Cargo.toml similarity index 66% rename from node/bitfield-signing/Cargo.toml rename to node/core/bitfield-signing/Cargo.toml index d1c7e902e9..b8a6cedcc5 100644 --- a/node/bitfield-signing/Cargo.toml +++ b/node/core/bitfield-signing/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "polkadot-node-bitfield-signing" +name = "polkadot-node-core-bitfield-signing" version = "0.1.0" authors = ["Parity Technologies "] edition = "2018" @@ -9,7 +9,7 @@ bitvec = "0.17.4" derive_more = "0.99.9" futures = "0.3.5" log = "0.4.8" -polkadot-primitives = { path = "../../primitives" } -polkadot-node-subsystem = { path = "../subsystem" } +polkadot-primitives = { path = "../../../primitives" } +polkadot-node-subsystem = { path = "../../subsystem" } keystore = { package = "sc-keystore", git = "https://github.com/paritytech/substrate", branch = "master" } wasm-timer = "0.2.4" diff --git a/node/bitfield-signing/src/lib.rs b/node/core/bitfield-signing/src/lib.rs similarity index 100% rename from node/bitfield-signing/src/lib.rs rename to node/core/bitfield-signing/src/lib.rs -- GitLab From 08995278b9627c93ce564985b58643cef76badb0 Mon Sep 17 00:00:00 2001 From: Wei Tang Date: Fri, 24 Jul 2020 14:00:34 +0200 Subject: [PATCH 099/192] Companion PR for #6569 (#1394) * Update wasm-builder version to 2.0.0 * Fix all crate compile * Update cargo lock * Bump runtime impl_version --- cli/src/command.rs | 18 +-- node/service/src/chain_spec.rs | 129 +++++++++++------- node/test-service/src/chain_spec.rs | 2 +- parachain/test-parachains/adder/build.rs | 2 +- parachain/test-parachains/adder/src/lib.rs | 7 + .../test-parachains/code-upgrader/build.rs | 2 +- .../test-parachains/code-upgrader/src/lib.rs | 7 + parachain/test-parachains/halt/build.rs | 2 +- parachain/test-parachains/halt/src/lib.rs | 8 +- parachain/test-parachains/tests/adder/mod.rs | 8 +- .../tests/code_upgrader/mod.rs | 12 +- .../tests/wasm_executor/mod.rs | 9 +- runtime/kusama/build.rs | 2 +- runtime/kusama/src/lib.rs | 2 +- runtime/polkadot/build.rs | 2 +- runtime/polkadot/src/lib.rs | 2 +- runtime/test-runtime/build.rs | 2 +- runtime/test-runtime/src/lib.rs | 2 +- runtime/westend/build.rs | 2 +- runtime/westend/src/lib.rs | 2 +- service/src/chain_spec.rs | 129 +++++++++++------- 21 files changed, 209 insertions(+), 142 deletions(-) diff --git a/cli/src/command.rs b/cli/src/command.rs index a7eb1e7fbc..7f513f12d5 100644 --- a/cli/src/command.rs +++ b/cli/src/command.rs @@ -53,18 +53,18 @@ impl SubstrateCli for Cli { .unwrap_or("polkadot") } else { id }; Ok(match id { - "polkadot-dev" | "dev" => Box::new(service::chain_spec::polkadot_development_config()), - "polkadot-local" => Box::new(service::chain_spec::polkadot_local_testnet_config()), - "polkadot-staging" => Box::new(service::chain_spec::polkadot_staging_testnet_config()), - "kusama-dev" => Box::new(service::chain_spec::kusama_development_config()), - "kusama-local" => Box::new(service::chain_spec::kusama_local_testnet_config()), - "kusama-staging" => Box::new(service::chain_spec::kusama_staging_testnet_config()), + "polkadot-dev" | "dev" => Box::new(service::chain_spec::polkadot_development_config()?), + "polkadot-local" => Box::new(service::chain_spec::polkadot_local_testnet_config()?), + "polkadot-staging" => Box::new(service::chain_spec::polkadot_staging_testnet_config()?), + "kusama-dev" => Box::new(service::chain_spec::kusama_development_config()?), + "kusama-local" => Box::new(service::chain_spec::kusama_local_testnet_config()?), + "kusama-staging" => Box::new(service::chain_spec::kusama_staging_testnet_config()?), "polkadot" => Box::new(service::chain_spec::polkadot_config()?), "westend" => Box::new(service::chain_spec::westend_config()?), "kusama" => Box::new(service::chain_spec::kusama_config()?), - "westend-dev" => Box::new(service::chain_spec::westend_development_config()), - "westend-local" => Box::new(service::chain_spec::westend_local_testnet_config()), - "westend-staging" => Box::new(service::chain_spec::westend_staging_testnet_config()), + "westend-dev" => Box::new(service::chain_spec::westend_development_config()?), + "westend-local" => Box::new(service::chain_spec::westend_local_testnet_config()?), + "westend-staging" => Box::new(service::chain_spec::westend_staging_testnet_config()?), path if self.run.force_kusama => { Box::new(service::KusamaChainSpec::from_json_file(std::path::PathBuf::from(path))?) }, diff --git a/node/service/src/chain_spec.rs b/node/service/src/chain_spec.rs index d46239ddd1..401337c218 100644 --- a/node/service/src/chain_spec.rs +++ b/node/service/src/chain_spec.rs @@ -113,7 +113,7 @@ fn westend_session_keys( westend::SessionKeys { babe, grandpa, im_online, parachain_validator, authority_discovery } } -fn polkadot_staging_testnet_config_genesis() -> polkadot::GenesisConfig { +fn polkadot_staging_testnet_config_genesis(wasm_binary: &[u8]) -> polkadot::GenesisConfig { // subkey inspect "$SECRET" let endowed_accounts = vec![]; @@ -132,7 +132,7 @@ fn polkadot_staging_testnet_config_genesis() -> polkadot::GenesisConfig { polkadot::GenesisConfig { system: Some(polkadot::SystemConfig { - code: polkadot::WASM_BINARY.to_vec(), + code: wasm_binary.to_vec(), changes_trie_config: Default::default(), }), balances: Some(polkadot::BalancesConfig { @@ -197,7 +197,7 @@ fn polkadot_staging_testnet_config_genesis() -> polkadot::GenesisConfig { } } -fn westend_staging_testnet_config_genesis() -> westend::GenesisConfig { +fn westend_staging_testnet_config_genesis(wasm_binary: &[u8]) -> westend::GenesisConfig { // subkey inspect "$SECRET" let endowed_accounts = vec![ // 5ENpP27BrVdJTdUfY6djmcw3d3xEJ6NzSUU52CCPmGpMrdEY @@ -284,7 +284,7 @@ fn westend_staging_testnet_config_genesis() -> westend::GenesisConfig { westend::GenesisConfig { system: Some(westend::SystemConfig { - code: westend::WASM_BINARY.to_vec(), + code: wasm_binary.to_vec(), changes_trie_config: Default::default(), }), balances: Some(westend::BalancesConfig { @@ -337,7 +337,7 @@ fn westend_staging_testnet_config_genesis() -> westend::GenesisConfig { } } -fn kusama_staging_testnet_config_genesis() -> kusama::GenesisConfig { +fn kusama_staging_testnet_config_genesis(wasm_binary: &[u8]) -> kusama::GenesisConfig { // subkey inspect "$SECRET" let endowed_accounts = vec![ // 5CVFESwfkk7NmhQ6FwHCM9roBvr9BGa4vJHFYU8DnGQxrXvz @@ -424,7 +424,7 @@ fn kusama_staging_testnet_config_genesis() -> kusama::GenesisConfig { kusama::GenesisConfig { system: Some(kusama::SystemConfig { - code: kusama::WASM_BINARY.to_vec(), + code: wasm_binary.to_vec(), changes_trie_config: Default::default(), }), balances: Some(kusama::BalancesConfig { @@ -490,54 +490,60 @@ fn kusama_staging_testnet_config_genesis() -> kusama::GenesisConfig { } /// Polkadot staging testnet config. -pub fn polkadot_staging_testnet_config() -> PolkadotChainSpec { +pub fn polkadot_staging_testnet_config() -> Result { + let wasm_binary = polkadot::WASM_BINARY.ok_or("Polkadot development wasm not available")?; let boot_nodes = vec![]; - PolkadotChainSpec::from_genesis( + + Ok(PolkadotChainSpec::from_genesis( "Polkadot Staging Testnet", "polkadot_staging_testnet", ChainType::Live, - polkadot_staging_testnet_config_genesis, + move || polkadot_staging_testnet_config_genesis(wasm_binary), boot_nodes, Some(TelemetryEndpoints::new(vec![(POLKADOT_STAGING_TELEMETRY_URL.to_string(), 0)]) .expect("Polkadot Staging telemetry url is valid; qed")), Some(DEFAULT_PROTOCOL_ID), None, Default::default(), - ) + )) } /// Staging testnet config. -pub fn kusama_staging_testnet_config() -> KusamaChainSpec { +pub fn kusama_staging_testnet_config() -> Result { + let wasm_binary = kusama::WASM_BINARY.ok_or("Kusama development wasm not available")?; let boot_nodes = vec![]; - KusamaChainSpec::from_genesis( + + Ok(KusamaChainSpec::from_genesis( "Kusama Staging Testnet", "kusama_staging_testnet", ChainType::Live, - kusama_staging_testnet_config_genesis, + move || kusama_staging_testnet_config_genesis(wasm_binary), boot_nodes, Some(TelemetryEndpoints::new(vec![(KUSAMA_STAGING_TELEMETRY_URL.to_string(), 0)]) .expect("Kusama Staging telemetry url is valid; qed")), Some(DEFAULT_PROTOCOL_ID), None, Default::default(), - ) + )) } /// Westend staging testnet config. -pub fn westend_staging_testnet_config() -> WestendChainSpec { +pub fn westend_staging_testnet_config() -> Result { + let wasm_binary = westend::WASM_BINARY.ok_or("Westend development wasm not available")?; let boot_nodes = vec![]; - WestendChainSpec::from_genesis( + + Ok(WestendChainSpec::from_genesis( "Westend Staging Testnet", "westend_staging_testnet", ChainType::Live, - westend_staging_testnet_config_genesis, + move || westend_staging_testnet_config_genesis(wasm_binary), boot_nodes, Some(TelemetryEndpoints::new(vec![(WESTEND_STAGING_TELEMETRY_URL.to_string(), 0)]) .expect("Westend Staging telemetry url is valid; qed")), Some(DEFAULT_PROTOCOL_ID), None, Default::default(), - ) + )) } /// Helper function to generate a crypto pair from seed @@ -595,6 +601,7 @@ fn testnet_accounts() -> Vec { /// Helper function to create polkadot GenesisConfig for testing pub fn polkadot_testnet_genesis( + wasm_binary: &[u8], initial_authorities: Vec<(AccountId, AccountId, BabeId, GrandpaId, ImOnlineId, ValidatorId, AuthorityDiscoveryId)>, _root_key: AccountId, endowed_accounts: Option>, @@ -606,7 +613,7 @@ pub fn polkadot_testnet_genesis( polkadot::GenesisConfig { system: Some(polkadot::SystemConfig { - code: polkadot::WASM_BINARY.to_vec(), + code: wasm_binary.to_vec(), changes_trie_config: Default::default(), }), indices: Some(polkadot::IndicesConfig { @@ -669,6 +676,7 @@ pub fn polkadot_testnet_genesis( /// Helper function to create kusama GenesisConfig for testing pub fn kusama_testnet_genesis( + wasm_binary: &[u8], initial_authorities: Vec<(AccountId, AccountId, BabeId, GrandpaId, ImOnlineId, ValidatorId, AuthorityDiscoveryId)>, _root_key: AccountId, endowed_accounts: Option>, @@ -680,7 +688,7 @@ pub fn kusama_testnet_genesis( kusama::GenesisConfig { system: Some(kusama::SystemConfig { - code: kusama::WASM_BINARY.to_vec(), + code: wasm_binary.to_vec(), changes_trie_config: Default::default(), }), indices: Some(kusama::IndicesConfig { @@ -743,6 +751,7 @@ pub fn kusama_testnet_genesis( /// Helper function to create polkadot GenesisConfig for testing pub fn westend_testnet_genesis( + wasm_binary: &[u8], initial_authorities: Vec<(AccountId, AccountId, BabeId, GrandpaId, ImOnlineId, ValidatorId, AuthorityDiscoveryId)>, root_key: AccountId, endowed_accounts: Option>, @@ -754,7 +763,7 @@ pub fn westend_testnet_genesis( westend::GenesisConfig { system: Some(westend::SystemConfig { - code: westend::WASM_BINARY.to_vec(), + code: wasm_binary.to_vec(), changes_trie_config: Default::default(), }), indices: Some(westend::IndicesConfig { @@ -803,8 +812,9 @@ pub fn westend_testnet_genesis( } } -fn polkadot_development_config_genesis() -> polkadot::GenesisConfig { +fn polkadot_development_config_genesis(wasm_binary: &[u8]) -> polkadot::GenesisConfig { polkadot_testnet_genesis( + wasm_binary, vec![ get_authority_keys_from_seed("Alice"), ], @@ -813,8 +823,9 @@ fn polkadot_development_config_genesis() -> polkadot::GenesisConfig { ) } -fn kusama_development_config_genesis() -> kusama::GenesisConfig { +fn kusama_development_config_genesis(wasm_binary: &[u8]) -> kusama::GenesisConfig { kusama_testnet_genesis( + wasm_binary, vec![ get_authority_keys_from_seed("Alice"), ], @@ -823,8 +834,9 @@ fn kusama_development_config_genesis() -> kusama::GenesisConfig { ) } -fn westend_development_config_genesis() -> westend::GenesisConfig { +fn westend_development_config_genesis(wasm_binary: &[u8]) -> westend::GenesisConfig { westend_testnet_genesis( + wasm_binary, vec![ get_authority_keys_from_seed("Alice"), ], @@ -834,52 +846,59 @@ fn westend_development_config_genesis() -> westend::GenesisConfig { } /// Polkadot development config (single validator Alice) -pub fn polkadot_development_config() -> PolkadotChainSpec { - PolkadotChainSpec::from_genesis( +pub fn polkadot_development_config() -> Result { + let wasm_binary = polkadot::WASM_BINARY.ok_or("Polkadot development wasm not available")?; + + Ok(PolkadotChainSpec::from_genesis( "Development", "dev", ChainType::Development, - polkadot_development_config_genesis, + move || polkadot_development_config_genesis(wasm_binary), vec![], None, Some(DEFAULT_PROTOCOL_ID), None, Default::default(), - ) + )) } /// Kusama development config (single validator Alice) -pub fn kusama_development_config() -> KusamaChainSpec { - KusamaChainSpec::from_genesis( +pub fn kusama_development_config() -> Result { + let wasm_binary = kusama::WASM_BINARY.ok_or("Kusama development wasm not available")?; + + Ok(KusamaChainSpec::from_genesis( "Development", "kusama_dev", ChainType::Development, - kusama_development_config_genesis, + move || kusama_development_config_genesis(wasm_binary), vec![], None, Some(DEFAULT_PROTOCOL_ID), None, Default::default(), - ) + )) } /// Westend development config (single validator Alice) -pub fn westend_development_config() -> WestendChainSpec { - WestendChainSpec::from_genesis( +pub fn westend_development_config() -> Result { + let wasm_binary = westend::WASM_BINARY.ok_or("Westend development wasm not available")?; + + Ok(WestendChainSpec::from_genesis( "Development", "westend_dev", ChainType::Development, - westend_development_config_genesis, + move || westend_development_config_genesis(wasm_binary), vec![], None, Some(DEFAULT_PROTOCOL_ID), None, Default::default(), - ) + )) } -fn polkadot_local_testnet_genesis() -> polkadot::GenesisConfig { +fn polkadot_local_testnet_genesis(wasm_binary: &[u8]) -> polkadot::GenesisConfig { polkadot_testnet_genesis( + wasm_binary, vec![ get_authority_keys_from_seed("Alice"), get_authority_keys_from_seed("Bob"), @@ -890,22 +909,25 @@ fn polkadot_local_testnet_genesis() -> polkadot::GenesisConfig { } /// Polkadot local testnet config (multivalidator Alice + Bob) -pub fn polkadot_local_testnet_config() -> PolkadotChainSpec { - PolkadotChainSpec::from_genesis( +pub fn polkadot_local_testnet_config() -> Result { + let wasm_binary = polkadot::WASM_BINARY.ok_or("Polkadot development wasm not available")?; + + Ok(PolkadotChainSpec::from_genesis( "Local Testnet", "local_testnet", ChainType::Local, - polkadot_local_testnet_genesis, + move || polkadot_local_testnet_genesis(wasm_binary), vec![], None, Some(DEFAULT_PROTOCOL_ID), None, Default::default(), - ) + )) } -fn kusama_local_testnet_genesis() -> kusama::GenesisConfig { +fn kusama_local_testnet_genesis(wasm_binary: &[u8]) -> kusama::GenesisConfig { kusama_testnet_genesis( + wasm_binary, vec![ get_authority_keys_from_seed("Alice"), get_authority_keys_from_seed("Bob"), @@ -916,22 +938,25 @@ fn kusama_local_testnet_genesis() -> kusama::GenesisConfig { } /// Kusama local testnet config (multivalidator Alice + Bob) -pub fn kusama_local_testnet_config() -> KusamaChainSpec { - KusamaChainSpec::from_genesis( +pub fn kusama_local_testnet_config() -> Result { + let wasm_binary = kusama::WASM_BINARY.ok_or("Kusama development wasm not available")?; + + Ok(KusamaChainSpec::from_genesis( "Kusama Local Testnet", "kusama_local_testnet", ChainType::Local, - kusama_local_testnet_genesis, + move || kusama_local_testnet_genesis(wasm_binary), vec![], None, Some(DEFAULT_PROTOCOL_ID), None, Default::default(), - ) + )) } -fn westend_local_testnet_genesis() -> westend::GenesisConfig { +fn westend_local_testnet_genesis(wasm_binary: &[u8]) -> westend::GenesisConfig { westend_testnet_genesis( + wasm_binary, vec![ get_authority_keys_from_seed("Alice"), get_authority_keys_from_seed("Bob"), @@ -942,16 +967,18 @@ fn westend_local_testnet_genesis() -> westend::GenesisConfig { } /// Westend local testnet config (multivalidator Alice + Bob) -pub fn westend_local_testnet_config() -> WestendChainSpec { - WestendChainSpec::from_genesis( +pub fn westend_local_testnet_config() -> Result { + let wasm_binary = westend::WASM_BINARY.ok_or("Westend development wasm not available")?; + + Ok(WestendChainSpec::from_genesis( "Westend Local Testnet", "westend_local_testnet", ChainType::Local, - westend_local_testnet_genesis, + move || westend_local_testnet_genesis(wasm_binary), vec![], None, Some(DEFAULT_PROTOCOL_ID), None, Default::default(), - ) + )) } diff --git a/node/test-service/src/chain_spec.rs b/node/test-service/src/chain_spec.rs index e81050afdb..67d1667469 100644 --- a/node/test-service/src/chain_spec.rs +++ b/node/test-service/src/chain_spec.rs @@ -107,7 +107,7 @@ fn polkadot_testnet_genesis( polkadot::GenesisConfig { system: Some(polkadot::SystemConfig { - code: polkadot::WASM_BINARY.to_vec(), + code: polkadot::WASM_BINARY.expect("Wasm binary must be built for testing").to_vec(), changes_trie_config, }), indices: Some(polkadot::IndicesConfig { indices: vec![] }), diff --git a/parachain/test-parachains/adder/build.rs b/parachain/test-parachains/adder/build.rs index 9a2e2c8fdd..2e407bbef3 100644 --- a/parachain/test-parachains/adder/build.rs +++ b/parachain/test-parachains/adder/build.rs @@ -19,7 +19,7 @@ use wasm_builder_runner::WasmBuilder; fn main() { WasmBuilder::new() .with_current_project() - .with_wasm_builder_from_crates("1.0.11") + .with_wasm_builder_from_crates("2.0.0") .export_heap_base() .build() } diff --git a/parachain/test-parachains/adder/src/lib.rs b/parachain/test-parachains/adder/src/lib.rs index d910eb0fc1..7ccba8400e 100644 --- a/parachain/test-parachains/adder/src/lib.rs +++ b/parachain/test-parachains/adder/src/lib.rs @@ -33,6 +33,13 @@ static ALLOC: dlmalloc::GlobalDlmalloc = dlmalloc::GlobalDlmalloc; #[cfg(feature = "std")] include!(concat!(env!("OUT_DIR"), "/wasm_binary.rs")); +#[cfg(feature = "std")] +/// Wasm binary unwrapped. If built with `BUILD_DUMMY_WASM_BINARY`, the function panics. +pub fn wasm_binary_unwrap() -> &'static [u8] { + WASM_BINARY.expect("Development wasm binary is not available. Testing is only \ + supported with the flag disabled.") +} + /// Head data for this parachain. #[derive(Default, Clone, Hash, Eq, PartialEq, Encode, Decode)] pub struct HeadData { diff --git a/parachain/test-parachains/code-upgrader/build.rs b/parachain/test-parachains/code-upgrader/build.rs index 9a2e2c8fdd..2e407bbef3 100644 --- a/parachain/test-parachains/code-upgrader/build.rs +++ b/parachain/test-parachains/code-upgrader/build.rs @@ -19,7 +19,7 @@ use wasm_builder_runner::WasmBuilder; fn main() { WasmBuilder::new() .with_current_project() - .with_wasm_builder_from_crates("1.0.11") + .with_wasm_builder_from_crates("2.0.0") .export_heap_base() .build() } diff --git a/parachain/test-parachains/code-upgrader/src/lib.rs b/parachain/test-parachains/code-upgrader/src/lib.rs index 4a717af008..c0219e0229 100644 --- a/parachain/test-parachains/code-upgrader/src/lib.rs +++ b/parachain/test-parachains/code-upgrader/src/lib.rs @@ -34,6 +34,13 @@ static ALLOC: dlmalloc::GlobalDlmalloc = dlmalloc::GlobalDlmalloc; #[cfg(feature = "std")] include!(concat!(env!("OUT_DIR"), "/wasm_binary.rs")); +#[cfg(feature = "std")] +/// Wasm binary unwrapped. If built with `BUILD_DUMMY_WASM_BINARY`, the function panics. +pub fn wasm_binary_unwrap() -> &'static [u8] { + WASM_BINARY.expect("Development wasm binary is not available. Testing is only \ + supported with the flag disabled.") +} + #[derive(Encode, Decode, Clone, Default)] pub struct State { /// The current code that is "active" in this chain. diff --git a/parachain/test-parachains/halt/build.rs b/parachain/test-parachains/halt/build.rs index 9a2e2c8fdd..2e407bbef3 100644 --- a/parachain/test-parachains/halt/build.rs +++ b/parachain/test-parachains/halt/build.rs @@ -19,7 +19,7 @@ use wasm_builder_runner::WasmBuilder; fn main() { WasmBuilder::new() .with_current_project() - .with_wasm_builder_from_crates("1.0.11") + .with_wasm_builder_from_crates("2.0.0") .export_heap_base() .build() } diff --git a/parachain/test-parachains/halt/src/lib.rs b/parachain/test-parachains/halt/src/lib.rs index fe2778ae78..b82a649e3f 100644 --- a/parachain/test-parachains/halt/src/lib.rs +++ b/parachain/test-parachains/halt/src/lib.rs @@ -23,6 +23,13 @@ #[cfg(feature = "std")] include!(concat!(env!("OUT_DIR"), "/wasm_binary.rs")); +#[cfg(feature = "std")] +/// Wasm binary unwrapped. If built with `BUILD_DUMMY_WASM_BINARY`, the function panics. +pub fn wasm_binary_unwrap() -> &'static [u8] { + WASM_BINARY.expect("Development wasm binary is not available. Testing is only \ + supported with the flag disabled.") +} + #[cfg(not(feature = "std"))] #[panic_handler] #[no_mangle] @@ -46,4 +53,3 @@ pub fn oom(_: core::alloc::Layout) -> ! { pub extern fn validate_block(params: *const u8, len: usize) -> usize { loop {} } - diff --git a/parachain/test-parachains/tests/adder/mod.rs b/parachain/test-parachains/tests/adder/mod.rs index b0b53dc4dc..373eace15c 100644 --- a/parachain/test-parachains/tests/adder/mod.rs +++ b/parachain/test-parachains/tests/adder/mod.rs @@ -44,8 +44,6 @@ struct BlockData { add: u64, } -const TEST_CODE: &[u8] = adder::WASM_BINARY; - fn hash_state(state: u64) -> [u8; 32] { tiny_keccak::keccak256(state.encode().as_slice()) } @@ -70,7 +68,7 @@ pub fn execute_good_on_parent() { let pool = parachain::wasm_executor::ValidationPool::new(); let ret = parachain::wasm_executor::validate_candidate( - TEST_CODE, + adder::wasm_binary_unwrap(), ValidationParams { parent_head: GenericHeadData(parent_head.encode()), block_data: GenericBlockData(block_data.encode()), @@ -109,7 +107,7 @@ fn execute_good_chain_on_parent() { }; let ret = parachain::wasm_executor::validate_candidate( - TEST_CODE, + adder::wasm_binary_unwrap(), ValidationParams { parent_head: GenericHeadData(parent_head.encode()), block_data: GenericBlockData(block_data.encode()), @@ -149,7 +147,7 @@ fn execute_bad_on_parent() { }; let _ret = parachain::wasm_executor::validate_candidate( - TEST_CODE, + adder::wasm_binary_unwrap(), ValidationParams { parent_head: GenericHeadData(parent_head.encode()), block_data: GenericBlockData(block_data.encode()), diff --git a/parachain/test-parachains/tests/code_upgrader/mod.rs b/parachain/test-parachains/tests/code_upgrader/mod.rs index 89f6065cf1..27b164f90c 100644 --- a/parachain/test-parachains/tests/code_upgrader/mod.rs +++ b/parachain/test-parachains/tests/code_upgrader/mod.rs @@ -24,8 +24,6 @@ use parachain::primitives::{ use codec::{Decode, Encode}; use code_upgrader::{hash_state, HeadData, BlockData, State}; -const TEST_CODE: &[u8] = code_upgrader::WASM_BINARY; - #[test] pub fn execute_good_no_upgrade() { let pool = parachain::wasm_executor::ValidationPool::new(); @@ -42,7 +40,7 @@ pub fn execute_good_no_upgrade() { }; let ret = parachain::wasm_executor::validate_candidate( - TEST_CODE, + code_upgrader::wasm_binary_unwrap(), ValidationParams { parent_head: GenericHeadData(parent_head.encode()), block_data: GenericBlockData(block_data.encode()), @@ -78,7 +76,7 @@ pub fn execute_good_with_upgrade() { }; let ret = parachain::wasm_executor::validate_candidate( - TEST_CODE, + code_upgrader::wasm_binary_unwrap(), ValidationParams { parent_head: GenericHeadData(parent_head.encode()), block_data: GenericBlockData(block_data.encode()), @@ -121,7 +119,7 @@ pub fn code_upgrade_not_allowed() { }; parachain::wasm_executor::validate_candidate( - TEST_CODE, + code_upgrader::wasm_binary_unwrap(), ValidationParams { parent_head: GenericHeadData(parent_head.encode()), block_data: GenericBlockData(block_data.encode()), @@ -151,7 +149,7 @@ pub fn applies_code_upgrade_after_delay() { }; let ret = parachain::wasm_executor::validate_candidate( - TEST_CODE, + code_upgrader::wasm_binary_unwrap(), ValidationParams { parent_head: GenericHeadData(parent_head.encode()), block_data: GenericBlockData(block_data.encode()), @@ -186,7 +184,7 @@ pub fn applies_code_upgrade_after_delay() { }; let ret = parachain::wasm_executor::validate_candidate( - TEST_CODE, + code_upgrader::wasm_binary_unwrap(), ValidationParams { parent_head: GenericHeadData(parent_head.encode()), block_data: GenericBlockData(block_data.encode()), diff --git a/parachain/test-parachains/tests/wasm_executor/mod.rs b/parachain/test-parachains/tests/wasm_executor/mod.rs index 6ba8ddefec..864b9a4ea7 100644 --- a/parachain/test-parachains/tests/wasm_executor/mod.rs +++ b/parachain/test-parachains/tests/wasm_executor/mod.rs @@ -22,15 +22,12 @@ use parachain::{ wasm_executor::EXECUTION_TIMEOUT_SEC, }; -// Code that exposes `validate_block` and loops infinitely -const INFINITE_LOOP_CODE: &[u8] = halt::WASM_BINARY; - #[test] fn terminates_on_timeout() { let pool = parachain::wasm_executor::ValidationPool::new(); let result = parachain::wasm_executor::validate_candidate( - INFINITE_LOOP_CODE, + halt::wasm_binary_unwrap(), ValidationParams { block_data: BlockData(Vec::new()), parent_head: Default::default(), @@ -59,7 +56,7 @@ fn parallel_execution() { let pool2 = pool.clone(); let thread = std::thread::spawn(move || parachain::wasm_executor::validate_candidate( - INFINITE_LOOP_CODE, + halt::wasm_binary_unwrap(), ValidationParams { block_data: BlockData(Vec::new()), parent_head: Default::default(), @@ -71,7 +68,7 @@ fn parallel_execution() { parachain::wasm_executor::ExecutionMode::RemoteTest(&pool2), ).ok()); let _ = parachain::wasm_executor::validate_candidate( - INFINITE_LOOP_CODE, + halt::wasm_binary_unwrap(), ValidationParams { block_data: BlockData(Vec::new()), parent_head: Default::default(), diff --git a/runtime/kusama/build.rs b/runtime/kusama/build.rs index 56051bd627..af219a2931 100644 --- a/runtime/kusama/build.rs +++ b/runtime/kusama/build.rs @@ -19,7 +19,7 @@ use wasm_builder_runner::WasmBuilder; fn main() { WasmBuilder::new() .with_current_project() - .with_wasm_builder_from_crates("1.0.11") + .with_wasm_builder_from_crates("2.0.0") .import_memory() .export_heap_base() .build() diff --git a/runtime/kusama/src/lib.rs b/runtime/kusama/src/lib.rs index 3e921b433b..bfad36b90f 100644 --- a/runtime/kusama/src/lib.rs +++ b/runtime/kusama/src/lib.rs @@ -88,7 +88,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { impl_name: create_runtime_str!("parity-kusama"), authoring_version: 2, spec_version: 2020, - impl_version: 0, + impl_version: 1, #[cfg(not(feature = "disable-runtime-api"))] apis: RUNTIME_API_VERSIONS, #[cfg(feature = "disable-runtime-api")] diff --git a/runtime/polkadot/build.rs b/runtime/polkadot/build.rs index 4ad34b2b52..f65f04914e 100644 --- a/runtime/polkadot/build.rs +++ b/runtime/polkadot/build.rs @@ -19,7 +19,7 @@ use wasm_builder_runner::WasmBuilder; fn main() { WasmBuilder::new() .with_current_project() - .with_wasm_builder_from_crates("1.0.11") + .with_wasm_builder_from_crates("2.0.0") .import_memory() .export_heap_base() .build() diff --git a/runtime/polkadot/src/lib.rs b/runtime/polkadot/src/lib.rs index f8d8cea3ab..b6d4b15d2f 100644 --- a/runtime/polkadot/src/lib.rs +++ b/runtime/polkadot/src/lib.rs @@ -87,7 +87,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { impl_name: create_runtime_str!("parity-polkadot"), authoring_version: 0, spec_version: 20, - impl_version: 0, + impl_version: 1, #[cfg(not(feature = "disable-runtime-api"))] apis: RUNTIME_API_VERSIONS, #[cfg(feature = "disable-runtime-api")] diff --git a/runtime/test-runtime/build.rs b/runtime/test-runtime/build.rs index 56051bd627..af219a2931 100644 --- a/runtime/test-runtime/build.rs +++ b/runtime/test-runtime/build.rs @@ -19,7 +19,7 @@ use wasm_builder_runner::WasmBuilder; fn main() { WasmBuilder::new() .with_current_project() - .with_wasm_builder_from_crates("1.0.11") + .with_wasm_builder_from_crates("2.0.0") .import_memory() .export_heap_base() .build() diff --git a/runtime/test-runtime/src/lib.rs b/runtime/test-runtime/src/lib.rs index 65c92aae0c..10fb69c97e 100644 --- a/runtime/test-runtime/src/lib.rs +++ b/runtime/test-runtime/src/lib.rs @@ -83,7 +83,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { impl_name: create_runtime_str!("parity-polkadot-test-runtime"), authoring_version: 2, spec_version: 1053, - impl_version: 0, + impl_version: 1, apis: RUNTIME_API_VERSIONS, transaction_version: 1, }; diff --git a/runtime/westend/build.rs b/runtime/westend/build.rs index 56051bd627..af219a2931 100644 --- a/runtime/westend/build.rs +++ b/runtime/westend/build.rs @@ -19,7 +19,7 @@ use wasm_builder_runner::WasmBuilder; fn main() { WasmBuilder::new() .with_current_project() - .with_wasm_builder_from_crates("1.0.11") + .with_wasm_builder_from_crates("2.0.0") .import_memory() .export_heap_base() .build() diff --git a/runtime/westend/src/lib.rs b/runtime/westend/src/lib.rs index f48ee40e53..b1792de763 100644 --- a/runtime/westend/src/lib.rs +++ b/runtime/westend/src/lib.rs @@ -84,7 +84,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { impl_name: create_runtime_str!("parity-westend"), authoring_version: 2, spec_version: 40, - impl_version: 0, + impl_version: 1, #[cfg(not(feature = "disable-runtime-api"))] apis: RUNTIME_API_VERSIONS, #[cfg(feature = "disable-runtime-api")] diff --git a/service/src/chain_spec.rs b/service/src/chain_spec.rs index efbdc4c100..d360816ebb 100644 --- a/service/src/chain_spec.rs +++ b/service/src/chain_spec.rs @@ -113,7 +113,7 @@ fn westend_session_keys( westend::SessionKeys { babe, grandpa, im_online, parachain_validator, authority_discovery } } -fn polkadot_staging_testnet_config_genesis() -> polkadot::GenesisConfig { +fn polkadot_staging_testnet_config_genesis(wasm_binary: &[u8]) -> polkadot::GenesisConfig { // subkey inspect "$SECRET" let endowed_accounts = vec![]; @@ -132,7 +132,7 @@ fn polkadot_staging_testnet_config_genesis() -> polkadot::GenesisConfig { polkadot::GenesisConfig { system: Some(polkadot::SystemConfig { - code: polkadot::WASM_BINARY.to_vec(), + code: wasm_binary.to_vec(), changes_trie_config: Default::default(), }), balances: Some(polkadot::BalancesConfig { @@ -197,7 +197,7 @@ fn polkadot_staging_testnet_config_genesis() -> polkadot::GenesisConfig { } } -fn westend_staging_testnet_config_genesis() -> westend::GenesisConfig { +fn westend_staging_testnet_config_genesis(wasm_binary: &[u8]) -> westend::GenesisConfig { // subkey inspect "$SECRET" let endowed_accounts = vec![ // 5ENpP27BrVdJTdUfY6djmcw3d3xEJ6NzSUU52CCPmGpMrdEY @@ -284,7 +284,7 @@ fn westend_staging_testnet_config_genesis() -> westend::GenesisConfig { westend::GenesisConfig { system: Some(westend::SystemConfig { - code: westend::WASM_BINARY.to_vec(), + code: wasm_binary.to_vec(), changes_trie_config: Default::default(), }), balances: Some(westend::BalancesConfig { @@ -337,7 +337,7 @@ fn westend_staging_testnet_config_genesis() -> westend::GenesisConfig { } } -fn kusama_staging_testnet_config_genesis() -> kusama::GenesisConfig { +fn kusama_staging_testnet_config_genesis(wasm_binary: &[u8]) -> kusama::GenesisConfig { // subkey inspect "$SECRET" let endowed_accounts = vec![ // 5CVFESwfkk7NmhQ6FwHCM9roBvr9BGa4vJHFYU8DnGQxrXvz @@ -424,7 +424,7 @@ fn kusama_staging_testnet_config_genesis() -> kusama::GenesisConfig { kusama::GenesisConfig { system: Some(kusama::SystemConfig { - code: kusama::WASM_BINARY.to_vec(), + code: wasm_binary.to_vec(), changes_trie_config: Default::default(), }), balances: Some(kusama::BalancesConfig { @@ -490,54 +490,60 @@ fn kusama_staging_testnet_config_genesis() -> kusama::GenesisConfig { } /// Polkadot staging testnet config. -pub fn polkadot_staging_testnet_config() -> PolkadotChainSpec { +pub fn polkadot_staging_testnet_config() -> Result { + let wasm_binary = polkadot::WASM_BINARY.ok_or("Polkadot development wasm not available")?; let boot_nodes = vec![]; - PolkadotChainSpec::from_genesis( + + Ok(PolkadotChainSpec::from_genesis( "Polkadot Staging Testnet", "polkadot_staging_testnet", ChainType::Live, - polkadot_staging_testnet_config_genesis, + move || polkadot_staging_testnet_config_genesis(wasm_binary), boot_nodes, Some(TelemetryEndpoints::new(vec![(POLKADOT_STAGING_TELEMETRY_URL.to_string(), 0)]) .expect("Polkadot Staging telemetry url is valid; qed")), Some(DEFAULT_PROTOCOL_ID), None, Default::default(), - ) + )) } /// Staging testnet config. -pub fn kusama_staging_testnet_config() -> KusamaChainSpec { +pub fn kusama_staging_testnet_config() -> Result { + let wasm_binary = kusama::WASM_BINARY.ok_or("Kusama development wasm not available")?; let boot_nodes = vec![]; - KusamaChainSpec::from_genesis( + + Ok(KusamaChainSpec::from_genesis( "Kusama Staging Testnet", "kusama_staging_testnet", ChainType::Live, - kusama_staging_testnet_config_genesis, + move || kusama_staging_testnet_config_genesis(wasm_binary), boot_nodes, Some(TelemetryEndpoints::new(vec![(KUSAMA_STAGING_TELEMETRY_URL.to_string(), 0)]) .expect("Kusama Staging telemetry url is valid; qed")), Some(DEFAULT_PROTOCOL_ID), None, Default::default(), - ) + )) } /// Westend staging testnet config. -pub fn westend_staging_testnet_config() -> WestendChainSpec { +pub fn westend_staging_testnet_config() -> Result { + let wasm_binary = westend::WASM_BINARY.ok_or("Westend development wasm not available")?; let boot_nodes = vec![]; - WestendChainSpec::from_genesis( + + Ok(WestendChainSpec::from_genesis( "Westend Staging Testnet", "westend_staging_testnet", ChainType::Live, - westend_staging_testnet_config_genesis, + move || westend_staging_testnet_config_genesis(wasm_binary), boot_nodes, Some(TelemetryEndpoints::new(vec![(WESTEND_STAGING_TELEMETRY_URL.to_string(), 0)]) .expect("Westend Staging telemetry url is valid; qed")), Some(DEFAULT_PROTOCOL_ID), None, Default::default(), - ) + )) } /// Helper function to generate a crypto pair from seed @@ -595,6 +601,7 @@ fn testnet_accounts() -> Vec { /// Helper function to create polkadot GenesisConfig for testing pub fn polkadot_testnet_genesis( + wasm_binary: &[u8], initial_authorities: Vec<(AccountId, AccountId, BabeId, GrandpaId, ImOnlineId, ValidatorId, AuthorityDiscoveryId)>, _root_key: AccountId, endowed_accounts: Option>, @@ -606,7 +613,7 @@ pub fn polkadot_testnet_genesis( polkadot::GenesisConfig { system: Some(polkadot::SystemConfig { - code: polkadot::WASM_BINARY.to_vec(), + code: wasm_binary.to_vec(), changes_trie_config: Default::default(), }), indices: Some(polkadot::IndicesConfig { @@ -669,6 +676,7 @@ pub fn polkadot_testnet_genesis( /// Helper function to create kusama GenesisConfig for testing pub fn kusama_testnet_genesis( + wasm_binary: &[u8], initial_authorities: Vec<(AccountId, AccountId, BabeId, GrandpaId, ImOnlineId, ValidatorId, AuthorityDiscoveryId)>, _root_key: AccountId, endowed_accounts: Option>, @@ -680,7 +688,7 @@ pub fn kusama_testnet_genesis( kusama::GenesisConfig { system: Some(kusama::SystemConfig { - code: kusama::WASM_BINARY.to_vec(), + code: wasm_binary.to_vec(), changes_trie_config: Default::default(), }), indices: Some(kusama::IndicesConfig { @@ -743,6 +751,7 @@ pub fn kusama_testnet_genesis( /// Helper function to create polkadot GenesisConfig for testing pub fn westend_testnet_genesis( + wasm_binary: &[u8], initial_authorities: Vec<(AccountId, AccountId, BabeId, GrandpaId, ImOnlineId, ValidatorId, AuthorityDiscoveryId)>, root_key: AccountId, endowed_accounts: Option>, @@ -754,7 +763,7 @@ pub fn westend_testnet_genesis( westend::GenesisConfig { system: Some(westend::SystemConfig { - code: westend::WASM_BINARY.to_vec(), + code: wasm_binary.to_vec(), changes_trie_config: Default::default(), }), indices: Some(westend::IndicesConfig { @@ -803,8 +812,9 @@ pub fn westend_testnet_genesis( } } -fn polkadot_development_config_genesis() -> polkadot::GenesisConfig { +fn polkadot_development_config_genesis(wasm_binary: &[u8]) -> polkadot::GenesisConfig { polkadot_testnet_genesis( + wasm_binary, vec![ get_authority_keys_from_seed("Alice"), ], @@ -813,8 +823,9 @@ fn polkadot_development_config_genesis() -> polkadot::GenesisConfig { ) } -fn kusama_development_config_genesis() -> kusama::GenesisConfig { +fn kusama_development_config_genesis(wasm_binary: &[u8]) -> kusama::GenesisConfig { kusama_testnet_genesis( + wasm_binary, vec![ get_authority_keys_from_seed("Alice"), ], @@ -823,8 +834,9 @@ fn kusama_development_config_genesis() -> kusama::GenesisConfig { ) } -fn westend_development_config_genesis() -> westend::GenesisConfig { +fn westend_development_config_genesis(wasm_binary: &[u8]) -> westend::GenesisConfig { westend_testnet_genesis( + wasm_binary, vec![ get_authority_keys_from_seed("Alice"), ], @@ -834,52 +846,59 @@ fn westend_development_config_genesis() -> westend::GenesisConfig { } /// Polkadot development config (single validator Alice) -pub fn polkadot_development_config() -> PolkadotChainSpec { - PolkadotChainSpec::from_genesis( +pub fn polkadot_development_config() -> Result { + let wasm_binary = polkadot::WASM_BINARY.ok_or("Polkadot development wasm not available")?; + + Ok(PolkadotChainSpec::from_genesis( "Development", "dev", ChainType::Development, - polkadot_development_config_genesis, + move || polkadot_development_config_genesis(wasm_binary), vec![], None, Some(DEFAULT_PROTOCOL_ID), None, Default::default(), - ) + )) } /// Kusama development config (single validator Alice) -pub fn kusama_development_config() -> KusamaChainSpec { - KusamaChainSpec::from_genesis( +pub fn kusama_development_config() -> Result { + let wasm_binary = kusama::WASM_BINARY.ok_or("Kusama development wasm not available")?; + + Ok(KusamaChainSpec::from_genesis( "Development", "kusama_dev", ChainType::Development, - kusama_development_config_genesis, + move || kusama_development_config_genesis(wasm_binary), vec![], None, Some(DEFAULT_PROTOCOL_ID), None, Default::default(), - ) + )) } /// Westend development config (single validator Alice) -pub fn westend_development_config() -> WestendChainSpec { - WestendChainSpec::from_genesis( +pub fn westend_development_config() -> Result { + let wasm_binary = westend::WASM_BINARY.ok_or("Westend development wasm not available")?; + + Ok(WestendChainSpec::from_genesis( "Development", "westend_dev", ChainType::Development, - westend_development_config_genesis, + move || westend_development_config_genesis(wasm_binary), vec![], None, Some(DEFAULT_PROTOCOL_ID), None, Default::default(), - ) + )) } -fn polkadot_local_testnet_genesis() -> polkadot::GenesisConfig { +fn polkadot_local_testnet_genesis(wasm_binary: &[u8]) -> polkadot::GenesisConfig { polkadot_testnet_genesis( + wasm_binary, vec![ get_authority_keys_from_seed("Alice"), get_authority_keys_from_seed("Bob"), @@ -890,22 +909,25 @@ fn polkadot_local_testnet_genesis() -> polkadot::GenesisConfig { } /// Polkadot local testnet config (multivalidator Alice + Bob) -pub fn polkadot_local_testnet_config() -> PolkadotChainSpec { - PolkadotChainSpec::from_genesis( +pub fn polkadot_local_testnet_config() -> Result { + let wasm_binary = polkadot::WASM_BINARY.ok_or("Polkadot development wasm not available")?; + + Ok(PolkadotChainSpec::from_genesis( "Local Testnet", "local_testnet", ChainType::Local, - polkadot_local_testnet_genesis, + move || polkadot_local_testnet_genesis(wasm_binary), vec![], None, Some(DEFAULT_PROTOCOL_ID), None, Default::default(), - ) + )) } -fn kusama_local_testnet_genesis() -> kusama::GenesisConfig { +fn kusama_local_testnet_genesis(wasm_binary: &[u8]) -> kusama::GenesisConfig { kusama_testnet_genesis( + wasm_binary, vec![ get_authority_keys_from_seed("Alice"), get_authority_keys_from_seed("Bob"), @@ -916,22 +938,25 @@ fn kusama_local_testnet_genesis() -> kusama::GenesisConfig { } /// Kusama local testnet config (multivalidator Alice + Bob) -pub fn kusama_local_testnet_config() -> KusamaChainSpec { - KusamaChainSpec::from_genesis( +pub fn kusama_local_testnet_config() -> Result { + let wasm_binary = kusama::WASM_BINARY.ok_or("Kusama development wasm not available")?; + + Ok(KusamaChainSpec::from_genesis( "Kusama Local Testnet", "kusama_local_testnet", ChainType::Local, - kusama_local_testnet_genesis, + move || kusama_local_testnet_genesis(wasm_binary), vec![], None, Some(DEFAULT_PROTOCOL_ID), None, Default::default(), - ) + )) } -fn westend_local_testnet_genesis() -> westend::GenesisConfig { +fn westend_local_testnet_genesis(wasm_binary: &[u8]) -> westend::GenesisConfig { westend_testnet_genesis( + wasm_binary, vec![ get_authority_keys_from_seed("Alice"), get_authority_keys_from_seed("Bob"), @@ -942,16 +967,18 @@ fn westend_local_testnet_genesis() -> westend::GenesisConfig { } /// Westend local testnet config (multivalidator Alice + Bob) -pub fn westend_local_testnet_config() -> WestendChainSpec { - WestendChainSpec::from_genesis( +pub fn westend_local_testnet_config() -> Result { + let wasm_binary = westend::WASM_BINARY.ok_or("Westend development wasm not available")?; + + Ok(WestendChainSpec::from_genesis( "Westend Local Testnet", "westend_local_testnet", ChainType::Local, - westend_local_testnet_genesis, + move || westend_local_testnet_genesis(wasm_binary), vec![], None, Some(DEFAULT_PROTOCOL_ID), None, Default::default(), - ) + )) } -- GitLab From c206b36bf83e06ec6ec8ae79e9e91504563a988d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Silva?= <123550+andresilva@users.noreply.github.com> Date: Fri, 24 Jul 2020 22:45:03 +0100 Subject: [PATCH 100/192] Update latest substrate master (#1468) * update substrate to latest master * runtime: bump spec versions --- Cargo.lock | 325 +++++++++++++++++--------------- runtime/kusama/src/lib.rs | 4 +- runtime/polkadot/src/lib.rs | 4 +- runtime/test-runtime/src/lib.rs | 6 +- runtime/westend/src/lib.rs | 6 +- 5 files changed, 180 insertions(+), 165 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 9d7078f2d7..5fe18dcc17 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -762,7 +762,8 @@ checksum = "6d375c433320f6c5057ae04a04376eef4d04ce2801448cf8863a78da99107be4" [[package]] name = "cranelift-bforest" version = "0.66.0" -source = "git+https://github.com/paritytech/wasmtime?branch=update-upstream#f744c4e564b40a4cfce6a7090f093ec1726c68e9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8dcc286b052ee24a1e5a222e7c1125e6010ad35b0f248709b9b3737a8fedcfdf" dependencies = [ "cranelift-entity", ] @@ -770,7 +771,8 @@ dependencies = [ [[package]] name = "cranelift-codegen" version = "0.66.0" -source = "git+https://github.com/paritytech/wasmtime?branch=update-upstream#f744c4e564b40a4cfce6a7090f093ec1726c68e9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d9badfe36176cb653506091693bc2bb1970c9bddfcd6ec7fac404f7eaec6f38" dependencies = [ "byteorder", "cranelift-bforest", @@ -789,7 +791,8 @@ dependencies = [ [[package]] name = "cranelift-codegen-meta" version = "0.66.0" -source = "git+https://github.com/paritytech/wasmtime?branch=update-upstream#f744c4e564b40a4cfce6a7090f093ec1726c68e9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c3f460031861e4f4ad510be62b2ae50bba6cc886b598a36f9c0a970feab9598" dependencies = [ "cranelift-codegen-shared", "cranelift-entity", @@ -798,12 +801,14 @@ dependencies = [ [[package]] name = "cranelift-codegen-shared" version = "0.66.0" -source = "git+https://github.com/paritytech/wasmtime?branch=update-upstream#f744c4e564b40a4cfce6a7090f093ec1726c68e9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76ad12409e922e7697cd0bdc7dc26992f64a77c31880dfe5e3c7722f4710206d" [[package]] name = "cranelift-entity" version = "0.66.0" -source = "git+https://github.com/paritytech/wasmtime?branch=update-upstream#f744c4e564b40a4cfce6a7090f093ec1726c68e9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d97cdc58972ea065d107872cfb9079f4c92ade78a8af85aaff519a65b5d13f71" dependencies = [ "serde", ] @@ -811,7 +816,8 @@ dependencies = [ [[package]] name = "cranelift-frontend" version = "0.66.0" -source = "git+https://github.com/paritytech/wasmtime?branch=update-upstream#f744c4e564b40a4cfce6a7090f093ec1726c68e9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ef419efb4f94ecc02e5d9fbcc910d2bb7f0040e2de570e63a454f883bc891d6" dependencies = [ "cranelift-codegen", "log 0.4.8", @@ -822,7 +828,8 @@ dependencies = [ [[package]] name = "cranelift-native" version = "0.66.0" -source = "git+https://github.com/paritytech/wasmtime?branch=update-upstream#f744c4e564b40a4cfce6a7090f093ec1726c68e9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e69d44d59826eef6794066ac2c0f4ad3975f02d97030c60dbc04e3886adf36e" dependencies = [ "cranelift-codegen", "raw-cpuid", @@ -832,7 +839,8 @@ dependencies = [ [[package]] name = "cranelift-wasm" version = "0.66.0" -source = "git+https://github.com/paritytech/wasmtime?branch=update-upstream#f744c4e564b40a4cfce6a7090f093ec1726c68e9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "979df666b1304624abe99738e9e0e7c7479ee5523ba4b8b237df9ff49996acbb" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -1335,7 +1343,7 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "fork-tree" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" +source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" dependencies = [ "parity-scale-codec", ] @@ -1343,7 +1351,7 @@ dependencies = [ [[package]] name = "frame-benchmarking" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" +source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" dependencies = [ "frame-support", "frame-system", @@ -1360,7 +1368,7 @@ dependencies = [ [[package]] name = "frame-benchmarking-cli" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" +source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" dependencies = [ "Inflector", "frame-benchmarking", @@ -1379,7 +1387,7 @@ dependencies = [ [[package]] name = "frame-executive" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" +source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" dependencies = [ "frame-support", "frame-system", @@ -1394,7 +1402,7 @@ dependencies = [ [[package]] name = "frame-metadata" version = "11.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" +source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" dependencies = [ "parity-scale-codec", "serde", @@ -1405,7 +1413,7 @@ dependencies = [ [[package]] name = "frame-support" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" +source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" dependencies = [ "bitmask", "frame-metadata", @@ -1430,7 +1438,7 @@ dependencies = [ [[package]] name = "frame-support-procedural" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" +source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" dependencies = [ "frame-support-procedural-tools", "proc-macro2 1.0.18", @@ -1441,7 +1449,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" +source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" dependencies = [ "frame-support-procedural-tools-derive", "proc-macro-crate", @@ -1453,7 +1461,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools-derive" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" +source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" dependencies = [ "proc-macro2 1.0.18", "quote 1.0.7", @@ -1463,7 +1471,7 @@ dependencies = [ [[package]] name = "frame-system" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" +source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" dependencies = [ "frame-support", "impl-trait-for-tuples", @@ -1479,7 +1487,7 @@ dependencies = [ [[package]] name = "frame-system-benchmarking" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" +source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" dependencies = [ "frame-benchmarking", "frame-support", @@ -1493,7 +1501,7 @@ dependencies = [ [[package]] name = "frame-system-rpc-runtime-api" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" +source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" dependencies = [ "parity-scale-codec", "sp-api", @@ -3507,7 +3515,7 @@ dependencies = [ [[package]] name = "pallet-authority-discovery" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" +source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" dependencies = [ "frame-support", "frame-system", @@ -3523,7 +3531,7 @@ dependencies = [ [[package]] name = "pallet-authorship" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" +source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" dependencies = [ "frame-support", "frame-system", @@ -3538,7 +3546,7 @@ dependencies = [ [[package]] name = "pallet-babe" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" +source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" dependencies = [ "frame-benchmarking", "frame-support", @@ -3563,7 +3571,7 @@ dependencies = [ [[package]] name = "pallet-balances" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" +source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" dependencies = [ "frame-benchmarking", "frame-support", @@ -3577,7 +3585,7 @@ dependencies = [ [[package]] name = "pallet-collective" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" +source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" dependencies = [ "frame-benchmarking", "frame-support", @@ -3593,7 +3601,7 @@ dependencies = [ [[package]] name = "pallet-democracy" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" +source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" dependencies = [ "frame-benchmarking", "frame-support", @@ -3608,7 +3616,7 @@ dependencies = [ [[package]] name = "pallet-elections-phragmen" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" +source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" dependencies = [ "frame-benchmarking", "frame-support", @@ -3623,7 +3631,7 @@ dependencies = [ [[package]] name = "pallet-finality-tracker" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" +source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" dependencies = [ "frame-support", "frame-system", @@ -3639,7 +3647,7 @@ dependencies = [ [[package]] name = "pallet-grandpa" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" +source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" dependencies = [ "frame-benchmarking", "frame-support", @@ -3661,7 +3669,7 @@ dependencies = [ [[package]] name = "pallet-identity" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" +source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" dependencies = [ "enumflags2", "frame-benchmarking", @@ -3677,7 +3685,7 @@ dependencies = [ [[package]] name = "pallet-im-online" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" +source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" dependencies = [ "frame-benchmarking", "frame-support", @@ -3697,7 +3705,7 @@ dependencies = [ [[package]] name = "pallet-indices" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" +source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" dependencies = [ "frame-support", "frame-system", @@ -3713,7 +3721,7 @@ dependencies = [ [[package]] name = "pallet-membership" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" +source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" dependencies = [ "frame-support", "frame-system", @@ -3727,7 +3735,7 @@ dependencies = [ [[package]] name = "pallet-multisig" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" +source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" dependencies = [ "frame-support", "frame-system", @@ -3742,7 +3750,7 @@ dependencies = [ [[package]] name = "pallet-nicks" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" +source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" dependencies = [ "frame-support", "frame-system", @@ -3756,7 +3764,7 @@ dependencies = [ [[package]] name = "pallet-offences" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" +source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" dependencies = [ "frame-support", "frame-system", @@ -3771,7 +3779,7 @@ dependencies = [ [[package]] name = "pallet-offences-benchmarking" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" +source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" dependencies = [ "frame-benchmarking", "frame-support", @@ -3792,7 +3800,7 @@ dependencies = [ [[package]] name = "pallet-proxy" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" +source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" dependencies = [ "frame-support", "frame-system", @@ -3807,7 +3815,7 @@ dependencies = [ [[package]] name = "pallet-randomness-collective-flip" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" +source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" dependencies = [ "frame-support", "frame-system", @@ -3820,7 +3828,7 @@ dependencies = [ [[package]] name = "pallet-recovery" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" +source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" dependencies = [ "enumflags2", "frame-support", @@ -3835,7 +3843,7 @@ dependencies = [ [[package]] name = "pallet-scheduler" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" +source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" dependencies = [ "frame-benchmarking", "frame-support", @@ -3850,7 +3858,7 @@ dependencies = [ [[package]] name = "pallet-session" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" +source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" dependencies = [ "frame-support", "frame-system", @@ -3870,7 +3878,7 @@ dependencies = [ [[package]] name = "pallet-session-benchmarking" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" +source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" dependencies = [ "frame-benchmarking", "frame-support", @@ -3886,7 +3894,7 @@ dependencies = [ [[package]] name = "pallet-society" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" +source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" dependencies = [ "frame-support", "frame-system", @@ -3900,7 +3908,7 @@ dependencies = [ [[package]] name = "pallet-staking" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" +source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" dependencies = [ "frame-benchmarking", "frame-support", @@ -3922,7 +3930,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-curve" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" +source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -3933,7 +3941,7 @@ dependencies = [ [[package]] name = "pallet-sudo" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" +source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" dependencies = [ "frame-support", "frame-system", @@ -3947,7 +3955,7 @@ dependencies = [ [[package]] name = "pallet-timestamp" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" +source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" dependencies = [ "frame-benchmarking", "frame-support", @@ -3965,7 +3973,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" +source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" dependencies = [ "frame-support", "frame-system", @@ -3982,7 +3990,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" +source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" dependencies = [ "jsonrpc-core", "jsonrpc-core-client", @@ -4000,7 +4008,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc-runtime-api" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" +source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" dependencies = [ "frame-support", "parity-scale-codec", @@ -4013,7 +4021,7 @@ dependencies = [ [[package]] name = "pallet-treasury" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" +source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" dependencies = [ "frame-benchmarking", "frame-support", @@ -4028,7 +4036,7 @@ dependencies = [ [[package]] name = "pallet-utility" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" +source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" dependencies = [ "frame-benchmarking", "frame-support", @@ -4044,7 +4052,7 @@ dependencies = [ [[package]] name = "pallet-vesting" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" +source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" dependencies = [ "enumflags2", "frame-benchmarking", @@ -5793,9 +5801,9 @@ dependencies = [ [[package]] name = "regalloc" -version = "0.0.28" +version = "0.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3598bed0895fe0f72a9e0b00ef9e3a3c8af978a8401b2f2046dec5927de6364a" +checksum = "b9ba8aaf5fe7cf307c6dbdaeed85478961d29e25e3bee5169e11b92fa9f027a8" dependencies = [ "log 0.4.8", "rustc-hash", @@ -6008,7 +6016,7 @@ dependencies = [ [[package]] name = "sc-authority-discovery" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" +source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" dependencies = [ "bytes 0.5.5", "derive_more 0.99.9", @@ -6035,7 +6043,7 @@ dependencies = [ [[package]] name = "sc-basic-authorship" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" +source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6059,7 +6067,7 @@ dependencies = [ [[package]] name = "sc-block-builder" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" +source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" dependencies = [ "parity-scale-codec", "sc-client-api", @@ -6076,7 +6084,7 @@ dependencies = [ [[package]] name = "sc-chain-spec" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" +source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" dependencies = [ "impl-trait-for-tuples", "sc-chain-spec-derive", @@ -6092,7 +6100,7 @@ dependencies = [ [[package]] name = "sc-chain-spec-derive" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" +source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -6103,7 +6111,7 @@ dependencies = [ [[package]] name = "sc-cli" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" +source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" dependencies = [ "ansi_term 0.12.1", "atty", @@ -6144,7 +6152,7 @@ dependencies = [ [[package]] name = "sc-client-api" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" +source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" dependencies = [ "derive_more 0.99.9", "fnv", @@ -6180,7 +6188,7 @@ dependencies = [ [[package]] name = "sc-client-db" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" +source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" dependencies = [ "blake2-rfc", "hash-db", @@ -6209,7 +6217,7 @@ dependencies = [ [[package]] name = "sc-consensus" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" +source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" dependencies = [ "sc-client-api", "sp-blockchain", @@ -6220,7 +6228,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" +source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" dependencies = [ "derive_more 0.99.9", "fork-tree", @@ -6262,7 +6270,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe-rpc" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" +source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -6286,7 +6294,7 @@ dependencies = [ [[package]] name = "sc-consensus-epochs" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" +source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" dependencies = [ "fork-tree", "parity-scale-codec", @@ -6299,7 +6307,7 @@ dependencies = [ [[package]] name = "sc-consensus-slots" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" +source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6322,7 +6330,7 @@ dependencies = [ [[package]] name = "sc-consensus-uncles" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" +source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" dependencies = [ "log 0.4.8", "sc-client-api", @@ -6336,7 +6344,7 @@ dependencies = [ [[package]] name = "sc-executor" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" +source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" dependencies = [ "derive_more 0.99.9", "lazy_static", @@ -6364,7 +6372,7 @@ dependencies = [ [[package]] name = "sc-executor-common" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" +source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" dependencies = [ "derive_more 0.99.9", "log 0.4.8", @@ -6381,7 +6389,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmi" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" +source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" dependencies = [ "log 0.4.8", "parity-scale-codec", @@ -6396,7 +6404,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmtime" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" +source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" dependencies = [ "cranelift-codegen", "cranelift-wasm", @@ -6417,7 +6425,7 @@ dependencies = [ [[package]] name = "sc-finality-grandpa" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" +source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" dependencies = [ "assert_matches", "derive_more 0.99.9", @@ -6455,7 +6463,7 @@ dependencies = [ [[package]] name = "sc-finality-grandpa-rpc" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" +source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" dependencies = [ "derive_more 0.99.9", "finality-grandpa", @@ -6472,7 +6480,7 @@ dependencies = [ [[package]] name = "sc-informant" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" +source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" dependencies = [ "ansi_term 0.12.1", "futures 0.3.5", @@ -6490,7 +6498,7 @@ dependencies = [ [[package]] name = "sc-keystore" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" +source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" dependencies = [ "derive_more 0.99.9", "hex", @@ -6506,7 +6514,7 @@ dependencies = [ [[package]] name = "sc-light" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" +source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" dependencies = [ "hash-db", "lazy_static", @@ -6525,7 +6533,7 @@ dependencies = [ [[package]] name = "sc-network" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" +source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" dependencies = [ "bitflags", "bs58", @@ -6577,7 +6585,7 @@ dependencies = [ [[package]] name = "sc-network-gossip" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" +source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6592,7 +6600,7 @@ dependencies = [ [[package]] name = "sc-network-test" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" +source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" dependencies = [ "env_logger", "futures 0.3.5", @@ -6619,7 +6627,7 @@ dependencies = [ [[package]] name = "sc-offchain" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" +source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" dependencies = [ "bytes 0.5.5", "fnv", @@ -6646,7 +6654,7 @@ dependencies = [ [[package]] name = "sc-peerset" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" +source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" dependencies = [ "futures 0.3.5", "libp2p", @@ -6659,7 +6667,7 @@ dependencies = [ [[package]] name = "sc-proposer-metrics" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" +source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" dependencies = [ "log 0.4.8", "substrate-prometheus-endpoint", @@ -6668,7 +6676,7 @@ dependencies = [ [[package]] name = "sc-rpc" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" +source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" dependencies = [ "futures 0.3.5", "hash-db", @@ -6700,7 +6708,7 @@ dependencies = [ [[package]] name = "sc-rpc-api" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" +source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -6724,7 +6732,7 @@ dependencies = [ [[package]] name = "sc-rpc-server" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" +source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" dependencies = [ "jsonrpc-core", "jsonrpc-http-server", @@ -6740,7 +6748,7 @@ dependencies = [ [[package]] name = "sc-service" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" +source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" dependencies = [ "derive_more 0.99.9", "directories", @@ -6802,7 +6810,7 @@ dependencies = [ [[package]] name = "sc-state-db" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" +source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" dependencies = [ "log 0.4.8", "parity-scale-codec", @@ -6816,7 +6824,7 @@ dependencies = [ [[package]] name = "sc-telemetry" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" +source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6837,7 +6845,7 @@ dependencies = [ [[package]] name = "sc-tracing" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" +source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" dependencies = [ "erased-serde", "log 0.4.8", @@ -6854,7 +6862,7 @@ dependencies = [ [[package]] name = "sc-transaction-graph" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" +source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -6875,7 +6883,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" +source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -7330,7 +7338,7 @@ dependencies = [ [[package]] name = "sp-allocator" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" +source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" dependencies = [ "derive_more 0.99.9", "log 0.4.8", @@ -7342,7 +7350,7 @@ dependencies = [ [[package]] name = "sp-api" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" +source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" dependencies = [ "hash-db", "parity-scale-codec", @@ -7357,7 +7365,7 @@ dependencies = [ [[package]] name = "sp-api-proc-macro" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" +source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" dependencies = [ "blake2-rfc", "proc-macro-crate", @@ -7369,7 +7377,7 @@ dependencies = [ [[package]] name = "sp-application-crypto" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" +source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" dependencies = [ "parity-scale-codec", "serde", @@ -7381,7 +7389,7 @@ dependencies = [ [[package]] name = "sp-arithmetic" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" +source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" dependencies = [ "integer-sqrt", "num-traits 0.2.12", @@ -7394,7 +7402,7 @@ dependencies = [ [[package]] name = "sp-authority-discovery" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" +source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" dependencies = [ "parity-scale-codec", "sp-api", @@ -7406,7 +7414,7 @@ dependencies = [ [[package]] name = "sp-authorship" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" +source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" dependencies = [ "parity-scale-codec", "sp-inherents", @@ -7417,7 +7425,7 @@ dependencies = [ [[package]] name = "sp-block-builder" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" +source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" dependencies = [ "parity-scale-codec", "sp-api", @@ -7429,7 +7437,7 @@ dependencies = [ [[package]] name = "sp-blockchain" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" +source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" dependencies = [ "derive_more 0.99.9", "log 0.4.8", @@ -7446,7 +7454,7 @@ dependencies = [ [[package]] name = "sp-chain-spec" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" +source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" dependencies = [ "serde", "serde_json", @@ -7455,7 +7463,7 @@ dependencies = [ [[package]] name = "sp-consensus" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" +source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -7480,7 +7488,7 @@ dependencies = [ [[package]] name = "sp-consensus-aura" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" +source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" dependencies = [ "parity-scale-codec", "sp-api", @@ -7494,7 +7502,7 @@ dependencies = [ [[package]] name = "sp-consensus-babe" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" +source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" dependencies = [ "merlin", "parity-scale-codec", @@ -7513,7 +7521,7 @@ dependencies = [ [[package]] name = "sp-consensus-slots" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" +source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" dependencies = [ "parity-scale-codec", "sp-runtime", @@ -7522,7 +7530,7 @@ dependencies = [ [[package]] name = "sp-consensus-vrf" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" +source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" dependencies = [ "parity-scale-codec", "schnorrkel", @@ -7534,7 +7542,7 @@ dependencies = [ [[package]] name = "sp-core" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" +source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" dependencies = [ "base58", "blake2-rfc", @@ -7577,7 +7585,7 @@ dependencies = [ [[package]] name = "sp-database" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" +source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" dependencies = [ "kvdb", "parking_lot 0.10.2", @@ -7586,7 +7594,7 @@ dependencies = [ [[package]] name = "sp-debug-derive" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" +source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" dependencies = [ "proc-macro2 1.0.18", "quote 1.0.7", @@ -7596,7 +7604,7 @@ dependencies = [ [[package]] name = "sp-externalities" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" +source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" dependencies = [ "environmental", "parity-scale-codec", @@ -7607,7 +7615,7 @@ dependencies = [ [[package]] name = "sp-finality-grandpa" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" +source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" dependencies = [ "finality-grandpa", "log 0.4.8", @@ -7623,7 +7631,7 @@ dependencies = [ [[package]] name = "sp-finality-tracker" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" +source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" dependencies = [ "parity-scale-codec", "sp-inherents", @@ -7633,7 +7641,7 @@ dependencies = [ [[package]] name = "sp-inherents" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" +source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" dependencies = [ "derive_more 0.99.9", "parity-scale-codec", @@ -7645,7 +7653,7 @@ dependencies = [ [[package]] name = "sp-io" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" +source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" dependencies = [ "futures 0.3.5", "hash-db", @@ -7666,7 +7674,7 @@ dependencies = [ [[package]] name = "sp-keyring" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" +source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" dependencies = [ "lazy_static", "sp-core", @@ -7677,7 +7685,7 @@ dependencies = [ [[package]] name = "sp-npos-elections" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" +source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" dependencies = [ "parity-scale-codec", "serde", @@ -7689,7 +7697,7 @@ dependencies = [ [[package]] name = "sp-npos-elections-compact" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" +source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -7700,7 +7708,7 @@ dependencies = [ [[package]] name = "sp-offchain" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" +source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" dependencies = [ "sp-api", "sp-core", @@ -7710,7 +7718,7 @@ dependencies = [ [[package]] name = "sp-panic-handler" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" +source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" dependencies = [ "backtrace", "log 0.4.8", @@ -7719,7 +7727,7 @@ dependencies = [ [[package]] name = "sp-rpc" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" +source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" dependencies = [ "serde", "sp-core", @@ -7728,7 +7736,7 @@ dependencies = [ [[package]] name = "sp-runtime" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" +source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" dependencies = [ "either", "hash256-std-hasher", @@ -7750,7 +7758,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" +source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" dependencies = [ "parity-scale-codec", "primitive-types", @@ -7765,7 +7773,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" +source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" dependencies = [ "Inflector", "proc-macro-crate", @@ -7777,7 +7785,7 @@ dependencies = [ [[package]] name = "sp-serializer" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" +source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" dependencies = [ "serde", "serde_json", @@ -7786,7 +7794,7 @@ dependencies = [ [[package]] name = "sp-session" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" +source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" dependencies = [ "parity-scale-codec", "sp-api", @@ -7799,7 +7807,7 @@ dependencies = [ [[package]] name = "sp-staking" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" +source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" dependencies = [ "parity-scale-codec", "sp-runtime", @@ -7809,7 +7817,7 @@ dependencies = [ [[package]] name = "sp-state-machine" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" +source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" dependencies = [ "hash-db", "itertools 0.9.0", @@ -7830,12 +7838,12 @@ dependencies = [ [[package]] name = "sp-std" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" +source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" [[package]] name = "sp-storage" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" +source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" dependencies = [ "impl-serde 0.2.3", "ref-cast", @@ -7847,7 +7855,7 @@ dependencies = [ [[package]] name = "sp-timestamp" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" +source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -7861,7 +7869,7 @@ dependencies = [ [[package]] name = "sp-tracing" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" +source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" dependencies = [ "log 0.4.8", "rental", @@ -7871,7 +7879,7 @@ dependencies = [ [[package]] name = "sp-transaction-pool" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" +source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -7886,7 +7894,7 @@ dependencies = [ [[package]] name = "sp-trie" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" +source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" dependencies = [ "hash-db", "memory-db", @@ -7900,7 +7908,7 @@ dependencies = [ [[package]] name = "sp-utils" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" +source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" dependencies = [ "futures 0.3.5", "futures-core", @@ -7912,7 +7920,7 @@ dependencies = [ [[package]] name = "sp-version" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" +source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" dependencies = [ "impl-serde 0.2.3", "parity-scale-codec", @@ -7924,7 +7932,7 @@ dependencies = [ [[package]] name = "sp-wasm-interface" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" +source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -8055,7 +8063,7 @@ dependencies = [ [[package]] name = "substrate-browser-utils" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" +source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" dependencies = [ "chrono", "console_error_panic_hook", @@ -8081,7 +8089,7 @@ dependencies = [ [[package]] name = "substrate-build-script-utils" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" +source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" dependencies = [ "platforms", ] @@ -8089,7 +8097,7 @@ dependencies = [ [[package]] name = "substrate-frame-rpc-system" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" +source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" dependencies = [ "frame-system-rpc-runtime-api", "futures 0.3.5", @@ -8112,7 +8120,7 @@ dependencies = [ [[package]] name = "substrate-prometheus-endpoint" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" +source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" dependencies = [ "async-std", "derive_more 0.99.9", @@ -8126,7 +8134,7 @@ dependencies = [ [[package]] name = "substrate-test-client" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" +source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" dependencies = [ "futures 0.1.29", "futures 0.3.5", @@ -8152,7 +8160,7 @@ dependencies = [ [[package]] name = "substrate-test-runtime" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" +source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" dependencies = [ "cfg-if", "frame-executive", @@ -8185,14 +8193,14 @@ dependencies = [ "sp-transaction-pool", "sp-trie", "sp-version", - "substrate-wasm-builder-runner 1.0.6 (git+https://github.com/paritytech/substrate)", + "substrate-wasm-builder-runner 1.0.6 (git+https://github.com/paritytech/substrate?branch=master)", "trie-db", ] [[package]] name = "substrate-test-runtime-client" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" +source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" dependencies = [ "futures 0.3.5", "parity-scale-codec", @@ -8213,7 +8221,7 @@ dependencies = [ [[package]] name = "substrate-wasm-builder-runner" version = "1.0.6" -source = "git+https://github.com/paritytech/substrate#ae579a841587919bc12940388e994ef799c37e6c" +source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" [[package]] name = "substrate-wasm-builder-runner" @@ -8224,7 +8232,8 @@ checksum = "d2a965994514ab35d3893e9260245f2947fd1981cdd4fffd2c6e6d1a9ce02e6a" [[package]] name = "substrate-wasmtime" version = "0.19.0" -source = "git+https://github.com/paritytech/wasmtime?branch=update-upstream#f744c4e564b40a4cfce6a7090f093ec1726c68e9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d75a69f5b3afef86e3e372529bf3fb1f7219b20287c4490e4cb4b4e91970f4f5" dependencies = [ "anyhow", "backtrace", @@ -9251,7 +9260,8 @@ checksum = "a950e6a618f62147fd514ff445b2a0b53120d382751960797f85f058c7eda9b9" [[package]] name = "wasmtime-debug" version = "0.19.0" -source = "git+https://github.com/paritytech/wasmtime?branch=update-upstream#f744c4e564b40a4cfce6a7090f093ec1726c68e9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e634af9067a3af6cf2c7d33dc3b84767ddaf5d010ba68e80eecbcea73d4a349" dependencies = [ "anyhow", "gimli 0.21.0", @@ -9266,7 +9276,8 @@ dependencies = [ [[package]] name = "wasmtime-environ" version = "0.19.0" -source = "git+https://github.com/paritytech/wasmtime?branch=update-upstream#f744c4e564b40a4cfce6a7090f093ec1726c68e9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08f85619a94ee4034bd5bb87fc3dcf71fd2237b81c840809da1201061eec9ab3" dependencies = [ "anyhow", "base64 0.12.3", @@ -9296,7 +9307,8 @@ dependencies = [ [[package]] name = "wasmtime-jit" version = "0.19.0" -source = "git+https://github.com/paritytech/wasmtime?branch=update-upstream#f744c4e564b40a4cfce6a7090f093ec1726c68e9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e914c013c7a9f15f4e429d5431f2830fb8adb56e40567661b69c5ec1d645be23" dependencies = [ "anyhow", "cfg-if", @@ -9324,7 +9336,8 @@ dependencies = [ [[package]] name = "wasmtime-obj" version = "0.19.0" -source = "git+https://github.com/paritytech/wasmtime?branch=update-upstream#f744c4e564b40a4cfce6a7090f093ec1726c68e9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e81d8e02e9bc9fe2da9b6d48bbc217f96e089f7df613f11a28a3958abc44641e" dependencies = [ "anyhow", "more-asserts", @@ -9337,7 +9350,8 @@ dependencies = [ [[package]] name = "wasmtime-profiling" version = "0.19.0" -source = "git+https://github.com/paritytech/wasmtime?branch=update-upstream#f744c4e564b40a4cfce6a7090f093ec1726c68e9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e8d4d1af8dd5f7096cfcc89dd668d358e52980c38cce199643372ffd6590e27" dependencies = [ "anyhow", "cfg-if", @@ -9355,7 +9369,8 @@ dependencies = [ [[package]] name = "wasmtime-runtime" version = "0.19.0" -source = "git+https://github.com/paritytech/wasmtime?branch=update-upstream#f744c4e564b40a4cfce6a7090f093ec1726c68e9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a25f140bbbaadb07c531cba99ce1a966dba216138dc1b2a0ddecec851a01a93" dependencies = [ "backtrace", "cc", diff --git a/runtime/kusama/src/lib.rs b/runtime/kusama/src/lib.rs index bfad36b90f..29215aae36 100644 --- a/runtime/kusama/src/lib.rs +++ b/runtime/kusama/src/lib.rs @@ -87,8 +87,8 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("kusama"), impl_name: create_runtime_str!("parity-kusama"), authoring_version: 2, - spec_version: 2020, - impl_version: 1, + spec_version: 2021, + impl_version: 0, #[cfg(not(feature = "disable-runtime-api"))] apis: RUNTIME_API_VERSIONS, #[cfg(feature = "disable-runtime-api")] diff --git a/runtime/polkadot/src/lib.rs b/runtime/polkadot/src/lib.rs index b6d4b15d2f..3fc56b172f 100644 --- a/runtime/polkadot/src/lib.rs +++ b/runtime/polkadot/src/lib.rs @@ -86,8 +86,8 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("polkadot"), impl_name: create_runtime_str!("parity-polkadot"), authoring_version: 0, - spec_version: 20, - impl_version: 1, + spec_version: 21, + impl_version: 0, #[cfg(not(feature = "disable-runtime-api"))] apis: RUNTIME_API_VERSIONS, #[cfg(feature = "disable-runtime-api")] diff --git a/runtime/test-runtime/src/lib.rs b/runtime/test-runtime/src/lib.rs index 10fb69c97e..4704ff0fb0 100644 --- a/runtime/test-runtime/src/lib.rs +++ b/runtime/test-runtime/src/lib.rs @@ -77,13 +77,13 @@ use constants::{time::*, currency::*, fee::*}; #[cfg(feature = "std")] include!(concat!(env!("OUT_DIR"), "/wasm_binary.rs")); -/// Runtime version (Kusama). +/// Runtime version (Test). pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("polkadot-test-runtime"), impl_name: create_runtime_str!("parity-polkadot-test-runtime"), authoring_version: 2, - spec_version: 1053, - impl_version: 1, + spec_version: 1054, + impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 1, }; diff --git a/runtime/westend/src/lib.rs b/runtime/westend/src/lib.rs index b1792de763..84daa4d204 100644 --- a/runtime/westend/src/lib.rs +++ b/runtime/westend/src/lib.rs @@ -78,13 +78,13 @@ use constants::{time::*, currency::*, fee::*}; #[cfg(feature = "std")] include!(concat!(env!("OUT_DIR"), "/wasm_binary.rs")); -/// Runtime version (Kusama). +/// Runtime version (Westend). pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("westend"), impl_name: create_runtime_str!("parity-westend"), authoring_version: 2, - spec_version: 40, - impl_version: 1, + spec_version: 41, + impl_version: 0, #[cfg(not(feature = "disable-runtime-api"))] apis: RUNTIME_API_VERSIONS, #[cfg(feature = "disable-runtime-api")] -- GitLab From f25628ac315efd5fdb2534a2b557eec8a97fd9cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Sun, 26 Jul 2020 15:16:09 +0200 Subject: [PATCH 101/192] Companion for #6726 (#1469) * Companion for #6726 * Spaces * 'Update substrate' Co-authored-by: parity-processbot <> --- Cargo.lock | 306 ++++++++++-------- network/src/protocol/tests.rs | 19 +- network/test/src/block_import.rs | 2 +- network/test/src/lib.rs | 4 +- node/core/backing/src/lib.rs | 2 +- node/network/bitfield-distribution/src/lib.rs | 10 +- node/network/bridge/src/lib.rs | 2 +- node/network/pov-distribution/src/lib.rs | 24 +- .../network/statement-distribution/src/lib.rs | 4 +- node/overseer/examples/minimal-example.rs | 2 +- node/overseer/src/lib.rs | 10 +- node/subsystem/src/util.rs | 2 +- parachain/Cargo.toml | 2 + parachain/src/wasm_executor/mod.rs | 9 +- .../src/wasm_executor/validation_host.rs | 27 +- parachain/test-parachains/Cargo.toml | 3 + parachain/test-parachains/tests/adder/mod.rs | 3 + .../tests/code_upgrader/mod.rs | 5 + .../tests/wasm_executor/mod.rs | 3 + runtime/test-runtime/client/src/lib.rs | 2 +- validation/src/collation.rs | 3 + validation/src/pipeline.rs | 5 + validation/src/shared_table/mod.rs | 1 + validation/src/validation_service/mod.rs | 32 +- 24 files changed, 278 insertions(+), 204 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 5fe18dcc17..8b0b4066da 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1069,6 +1069,33 @@ version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10" +[[package]] +name = "dyn-clonable" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e9232f0e607a262ceb9bd5141a3dfb3e4db6994b31989bbfd845878cba59fd4" +dependencies = [ + "dyn-clonable-impl", + "dyn-clone", +] + +[[package]] +name = "dyn-clonable-impl" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "558e40ea573c374cf53507fd240b7ee2f5477df7cfebdb97323ec61c719399c5" +dependencies = [ + "proc-macro2 1.0.18", + "quote 1.0.7", + "syn 1.0.33", +] + +[[package]] +name = "dyn-clone" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c53dc3a653e0f64081026e4bf048d48fec9fce90c66e8326ca7292df0ff2d82" + [[package]] name = "ed25519" version = "1.0.1" @@ -1343,7 +1370,7 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "fork-tree" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" +source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" dependencies = [ "parity-scale-codec", ] @@ -1351,7 +1378,7 @@ dependencies = [ [[package]] name = "frame-benchmarking" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" +source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" dependencies = [ "frame-support", "frame-system", @@ -1368,7 +1395,7 @@ dependencies = [ [[package]] name = "frame-benchmarking-cli" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" +source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" dependencies = [ "Inflector", "frame-benchmarking", @@ -1387,7 +1414,7 @@ dependencies = [ [[package]] name = "frame-executive" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" +source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" dependencies = [ "frame-support", "frame-system", @@ -1402,7 +1429,7 @@ dependencies = [ [[package]] name = "frame-metadata" version = "11.0.0-rc5" -source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" +source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" dependencies = [ "parity-scale-codec", "serde", @@ -1413,7 +1440,7 @@ dependencies = [ [[package]] name = "frame-support" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" +source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" dependencies = [ "bitmask", "frame-metadata", @@ -1438,7 +1465,7 @@ dependencies = [ [[package]] name = "frame-support-procedural" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" +source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" dependencies = [ "frame-support-procedural-tools", "proc-macro2 1.0.18", @@ -1449,7 +1476,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" +source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" dependencies = [ "frame-support-procedural-tools-derive", "proc-macro-crate", @@ -1461,7 +1488,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools-derive" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" +source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" dependencies = [ "proc-macro2 1.0.18", "quote 1.0.7", @@ -1471,7 +1498,7 @@ dependencies = [ [[package]] name = "frame-system" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" +source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" dependencies = [ "frame-support", "impl-trait-for-tuples", @@ -1487,7 +1514,7 @@ dependencies = [ [[package]] name = "frame-system-benchmarking" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" +source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" dependencies = [ "frame-benchmarking", "frame-support", @@ -1501,7 +1528,7 @@ dependencies = [ [[package]] name = "frame-system-rpc-runtime-api" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" +source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" dependencies = [ "parity-scale-codec", "sp-api", @@ -3515,7 +3542,7 @@ dependencies = [ [[package]] name = "pallet-authority-discovery" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" +source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" dependencies = [ "frame-support", "frame-system", @@ -3531,7 +3558,7 @@ dependencies = [ [[package]] name = "pallet-authorship" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" +source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" dependencies = [ "frame-support", "frame-system", @@ -3546,7 +3573,7 @@ dependencies = [ [[package]] name = "pallet-babe" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" +source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" dependencies = [ "frame-benchmarking", "frame-support", @@ -3571,7 +3598,7 @@ dependencies = [ [[package]] name = "pallet-balances" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" +source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" dependencies = [ "frame-benchmarking", "frame-support", @@ -3585,7 +3612,7 @@ dependencies = [ [[package]] name = "pallet-collective" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" +source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" dependencies = [ "frame-benchmarking", "frame-support", @@ -3601,7 +3628,7 @@ dependencies = [ [[package]] name = "pallet-democracy" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" +source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" dependencies = [ "frame-benchmarking", "frame-support", @@ -3616,7 +3643,7 @@ dependencies = [ [[package]] name = "pallet-elections-phragmen" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" +source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" dependencies = [ "frame-benchmarking", "frame-support", @@ -3631,7 +3658,7 @@ dependencies = [ [[package]] name = "pallet-finality-tracker" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" +source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" dependencies = [ "frame-support", "frame-system", @@ -3647,7 +3674,7 @@ dependencies = [ [[package]] name = "pallet-grandpa" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" +source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" dependencies = [ "frame-benchmarking", "frame-support", @@ -3669,7 +3696,7 @@ dependencies = [ [[package]] name = "pallet-identity" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" +source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" dependencies = [ "enumflags2", "frame-benchmarking", @@ -3685,7 +3712,7 @@ dependencies = [ [[package]] name = "pallet-im-online" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" +source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" dependencies = [ "frame-benchmarking", "frame-support", @@ -3705,7 +3732,7 @@ dependencies = [ [[package]] name = "pallet-indices" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" +source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" dependencies = [ "frame-support", "frame-system", @@ -3721,7 +3748,7 @@ dependencies = [ [[package]] name = "pallet-membership" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" +source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" dependencies = [ "frame-support", "frame-system", @@ -3735,7 +3762,7 @@ dependencies = [ [[package]] name = "pallet-multisig" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" +source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" dependencies = [ "frame-support", "frame-system", @@ -3750,7 +3777,7 @@ dependencies = [ [[package]] name = "pallet-nicks" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" +source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" dependencies = [ "frame-support", "frame-system", @@ -3764,7 +3791,7 @@ dependencies = [ [[package]] name = "pallet-offences" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" +source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" dependencies = [ "frame-support", "frame-system", @@ -3779,7 +3806,7 @@ dependencies = [ [[package]] name = "pallet-offences-benchmarking" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" +source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" dependencies = [ "frame-benchmarking", "frame-support", @@ -3800,7 +3827,7 @@ dependencies = [ [[package]] name = "pallet-proxy" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" +source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" dependencies = [ "frame-support", "frame-system", @@ -3815,7 +3842,7 @@ dependencies = [ [[package]] name = "pallet-randomness-collective-flip" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" +source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" dependencies = [ "frame-support", "frame-system", @@ -3828,7 +3855,7 @@ dependencies = [ [[package]] name = "pallet-recovery" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" +source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" dependencies = [ "enumflags2", "frame-support", @@ -3843,7 +3870,7 @@ dependencies = [ [[package]] name = "pallet-scheduler" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" +source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" dependencies = [ "frame-benchmarking", "frame-support", @@ -3858,7 +3885,7 @@ dependencies = [ [[package]] name = "pallet-session" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" +source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" dependencies = [ "frame-support", "frame-system", @@ -3878,7 +3905,7 @@ dependencies = [ [[package]] name = "pallet-session-benchmarking" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" +source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" dependencies = [ "frame-benchmarking", "frame-support", @@ -3894,7 +3921,7 @@ dependencies = [ [[package]] name = "pallet-society" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" +source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" dependencies = [ "frame-support", "frame-system", @@ -3908,7 +3935,7 @@ dependencies = [ [[package]] name = "pallet-staking" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" +source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" dependencies = [ "frame-benchmarking", "frame-support", @@ -3930,7 +3957,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-curve" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" +source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -3941,7 +3968,7 @@ dependencies = [ [[package]] name = "pallet-sudo" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" +source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" dependencies = [ "frame-support", "frame-system", @@ -3955,7 +3982,7 @@ dependencies = [ [[package]] name = "pallet-timestamp" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" +source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" dependencies = [ "frame-benchmarking", "frame-support", @@ -3973,7 +4000,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" +source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" dependencies = [ "frame-support", "frame-system", @@ -3990,7 +4017,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" +source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" dependencies = [ "jsonrpc-core", "jsonrpc-core-client", @@ -4008,7 +4035,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc-runtime-api" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" +source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" dependencies = [ "frame-support", "parity-scale-codec", @@ -4021,7 +4048,7 @@ dependencies = [ [[package]] name = "pallet-treasury" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" +source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" dependencies = [ "frame-benchmarking", "frame-support", @@ -4036,7 +4063,7 @@ dependencies = [ [[package]] name = "pallet-utility" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" +source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" dependencies = [ "frame-benchmarking", "frame-support", @@ -4052,7 +4079,7 @@ dependencies = [ [[package]] name = "pallet-vesting" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" +source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" dependencies = [ "enumflags2", "frame-benchmarking", @@ -4670,6 +4697,7 @@ name = "polkadot-parachain" version = "0.8.19" dependencies = [ "derive_more 0.99.9", + "futures 0.3.5", "log 0.4.8", "parity-scale-codec", "parking_lot 0.10.2", @@ -6016,7 +6044,7 @@ dependencies = [ [[package]] name = "sc-authority-discovery" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" +source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" dependencies = [ "bytes 0.5.5", "derive_more 0.99.9", @@ -6043,7 +6071,7 @@ dependencies = [ [[package]] name = "sc-basic-authorship" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" +source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6067,7 +6095,7 @@ dependencies = [ [[package]] name = "sc-block-builder" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" +source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" dependencies = [ "parity-scale-codec", "sc-client-api", @@ -6084,7 +6112,7 @@ dependencies = [ [[package]] name = "sc-chain-spec" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" +source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" dependencies = [ "impl-trait-for-tuples", "sc-chain-spec-derive", @@ -6100,7 +6128,7 @@ dependencies = [ [[package]] name = "sc-chain-spec-derive" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" +source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -6111,7 +6139,7 @@ dependencies = [ [[package]] name = "sc-cli" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" +source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" dependencies = [ "ansi_term 0.12.1", "atty", @@ -6152,7 +6180,7 @@ dependencies = [ [[package]] name = "sc-client-api" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" +source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" dependencies = [ "derive_more 0.99.9", "fnv", @@ -6188,7 +6216,7 @@ dependencies = [ [[package]] name = "sc-client-db" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" +source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" dependencies = [ "blake2-rfc", "hash-db", @@ -6217,7 +6245,7 @@ dependencies = [ [[package]] name = "sc-consensus" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" +source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" dependencies = [ "sc-client-api", "sp-blockchain", @@ -6228,7 +6256,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" +source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" dependencies = [ "derive_more 0.99.9", "fork-tree", @@ -6270,7 +6298,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe-rpc" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" +source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -6294,7 +6322,7 @@ dependencies = [ [[package]] name = "sc-consensus-epochs" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" +source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" dependencies = [ "fork-tree", "parity-scale-codec", @@ -6307,7 +6335,7 @@ dependencies = [ [[package]] name = "sc-consensus-slots" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" +source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6330,7 +6358,7 @@ dependencies = [ [[package]] name = "sc-consensus-uncles" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" +source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" dependencies = [ "log 0.4.8", "sc-client-api", @@ -6344,7 +6372,7 @@ dependencies = [ [[package]] name = "sc-executor" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" +source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" dependencies = [ "derive_more 0.99.9", "lazy_static", @@ -6372,7 +6400,7 @@ dependencies = [ [[package]] name = "sc-executor-common" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" +source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" dependencies = [ "derive_more 0.99.9", "log 0.4.8", @@ -6389,7 +6417,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmi" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" +source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" dependencies = [ "log 0.4.8", "parity-scale-codec", @@ -6404,7 +6432,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmtime" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" +source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" dependencies = [ "cranelift-codegen", "cranelift-wasm", @@ -6425,7 +6453,7 @@ dependencies = [ [[package]] name = "sc-finality-grandpa" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" +source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" dependencies = [ "assert_matches", "derive_more 0.99.9", @@ -6463,7 +6491,7 @@ dependencies = [ [[package]] name = "sc-finality-grandpa-rpc" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" +source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" dependencies = [ "derive_more 0.99.9", "finality-grandpa", @@ -6480,7 +6508,7 @@ dependencies = [ [[package]] name = "sc-informant" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" +source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" dependencies = [ "ansi_term 0.12.1", "futures 0.3.5", @@ -6498,7 +6526,7 @@ dependencies = [ [[package]] name = "sc-keystore" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" +source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" dependencies = [ "derive_more 0.99.9", "hex", @@ -6514,7 +6542,7 @@ dependencies = [ [[package]] name = "sc-light" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" +source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" dependencies = [ "hash-db", "lazy_static", @@ -6533,7 +6561,7 @@ dependencies = [ [[package]] name = "sc-network" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" +source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" dependencies = [ "bitflags", "bs58", @@ -6585,7 +6613,7 @@ dependencies = [ [[package]] name = "sc-network-gossip" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" +source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6600,7 +6628,7 @@ dependencies = [ [[package]] name = "sc-network-test" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" +source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" dependencies = [ "env_logger", "futures 0.3.5", @@ -6627,7 +6655,7 @@ dependencies = [ [[package]] name = "sc-offchain" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" +source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" dependencies = [ "bytes 0.5.5", "fnv", @@ -6654,7 +6682,7 @@ dependencies = [ [[package]] name = "sc-peerset" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" +source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" dependencies = [ "futures 0.3.5", "libp2p", @@ -6667,7 +6695,7 @@ dependencies = [ [[package]] name = "sc-proposer-metrics" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" +source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" dependencies = [ "log 0.4.8", "substrate-prometheus-endpoint", @@ -6676,7 +6704,7 @@ dependencies = [ [[package]] name = "sc-rpc" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" +source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" dependencies = [ "futures 0.3.5", "hash-db", @@ -6708,7 +6736,7 @@ dependencies = [ [[package]] name = "sc-rpc-api" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" +source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -6732,7 +6760,7 @@ dependencies = [ [[package]] name = "sc-rpc-server" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" +source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" dependencies = [ "jsonrpc-core", "jsonrpc-http-server", @@ -6748,7 +6776,7 @@ dependencies = [ [[package]] name = "sc-service" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" +source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" dependencies = [ "derive_more 0.99.9", "directories", @@ -6810,7 +6838,7 @@ dependencies = [ [[package]] name = "sc-state-db" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" +source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" dependencies = [ "log 0.4.8", "parity-scale-codec", @@ -6824,7 +6852,7 @@ dependencies = [ [[package]] name = "sc-telemetry" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" +source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6845,7 +6873,7 @@ dependencies = [ [[package]] name = "sc-tracing" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" +source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" dependencies = [ "erased-serde", "log 0.4.8", @@ -6862,7 +6890,7 @@ dependencies = [ [[package]] name = "sc-transaction-graph" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" +source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -6883,7 +6911,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" +source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -7338,7 +7366,7 @@ dependencies = [ [[package]] name = "sp-allocator" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" +source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" dependencies = [ "derive_more 0.99.9", "log 0.4.8", @@ -7350,7 +7378,7 @@ dependencies = [ [[package]] name = "sp-api" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" +source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" dependencies = [ "hash-db", "parity-scale-codec", @@ -7365,7 +7393,7 @@ dependencies = [ [[package]] name = "sp-api-proc-macro" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" +source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" dependencies = [ "blake2-rfc", "proc-macro-crate", @@ -7377,7 +7405,7 @@ dependencies = [ [[package]] name = "sp-application-crypto" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" +source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" dependencies = [ "parity-scale-codec", "serde", @@ -7389,7 +7417,7 @@ dependencies = [ [[package]] name = "sp-arithmetic" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" +source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" dependencies = [ "integer-sqrt", "num-traits 0.2.12", @@ -7402,7 +7430,7 @@ dependencies = [ [[package]] name = "sp-authority-discovery" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" +source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" dependencies = [ "parity-scale-codec", "sp-api", @@ -7414,7 +7442,7 @@ dependencies = [ [[package]] name = "sp-authorship" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" +source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" dependencies = [ "parity-scale-codec", "sp-inherents", @@ -7425,7 +7453,7 @@ dependencies = [ [[package]] name = "sp-block-builder" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" +source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" dependencies = [ "parity-scale-codec", "sp-api", @@ -7437,7 +7465,7 @@ dependencies = [ [[package]] name = "sp-blockchain" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" +source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" dependencies = [ "derive_more 0.99.9", "log 0.4.8", @@ -7454,7 +7482,7 @@ dependencies = [ [[package]] name = "sp-chain-spec" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" +source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" dependencies = [ "serde", "serde_json", @@ -7463,7 +7491,7 @@ dependencies = [ [[package]] name = "sp-consensus" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" +source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -7488,7 +7516,7 @@ dependencies = [ [[package]] name = "sp-consensus-aura" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" +source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" dependencies = [ "parity-scale-codec", "sp-api", @@ -7502,7 +7530,7 @@ dependencies = [ [[package]] name = "sp-consensus-babe" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" +source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" dependencies = [ "merlin", "parity-scale-codec", @@ -7521,7 +7549,7 @@ dependencies = [ [[package]] name = "sp-consensus-slots" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" +source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" dependencies = [ "parity-scale-codec", "sp-runtime", @@ -7530,7 +7558,7 @@ dependencies = [ [[package]] name = "sp-consensus-vrf" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" +source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" dependencies = [ "parity-scale-codec", "schnorrkel", @@ -7542,12 +7570,13 @@ dependencies = [ [[package]] name = "sp-core" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" +source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" dependencies = [ "base58", "blake2-rfc", "byteorder", "derive_more 0.99.9", + "dyn-clonable", "ed25519-dalek", "futures 0.3.5", "hash-db", @@ -7585,7 +7614,7 @@ dependencies = [ [[package]] name = "sp-database" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" +source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" dependencies = [ "kvdb", "parking_lot 0.10.2", @@ -7594,7 +7623,7 @@ dependencies = [ [[package]] name = "sp-debug-derive" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" +source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" dependencies = [ "proc-macro2 1.0.18", "quote 1.0.7", @@ -7604,7 +7633,7 @@ dependencies = [ [[package]] name = "sp-externalities" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" +source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" dependencies = [ "environmental", "parity-scale-codec", @@ -7615,7 +7644,7 @@ dependencies = [ [[package]] name = "sp-finality-grandpa" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" +source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" dependencies = [ "finality-grandpa", "log 0.4.8", @@ -7631,7 +7660,7 @@ dependencies = [ [[package]] name = "sp-finality-tracker" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" +source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" dependencies = [ "parity-scale-codec", "sp-inherents", @@ -7641,7 +7670,7 @@ dependencies = [ [[package]] name = "sp-inherents" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" +source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" dependencies = [ "derive_more 0.99.9", "parity-scale-codec", @@ -7653,7 +7682,7 @@ dependencies = [ [[package]] name = "sp-io" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" +source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" dependencies = [ "futures 0.3.5", "hash-db", @@ -7674,7 +7703,7 @@ dependencies = [ [[package]] name = "sp-keyring" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" +source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" dependencies = [ "lazy_static", "sp-core", @@ -7685,7 +7714,7 @@ dependencies = [ [[package]] name = "sp-npos-elections" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" +source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" dependencies = [ "parity-scale-codec", "serde", @@ -7697,7 +7726,7 @@ dependencies = [ [[package]] name = "sp-npos-elections-compact" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" +source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -7708,7 +7737,7 @@ dependencies = [ [[package]] name = "sp-offchain" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" +source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" dependencies = [ "sp-api", "sp-core", @@ -7718,7 +7747,7 @@ dependencies = [ [[package]] name = "sp-panic-handler" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" +source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" dependencies = [ "backtrace", "log 0.4.8", @@ -7727,7 +7756,7 @@ dependencies = [ [[package]] name = "sp-rpc" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" +source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" dependencies = [ "serde", "sp-core", @@ -7736,7 +7765,7 @@ dependencies = [ [[package]] name = "sp-runtime" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" +source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" dependencies = [ "either", "hash256-std-hasher", @@ -7758,7 +7787,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" +source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" dependencies = [ "parity-scale-codec", "primitive-types", @@ -7773,7 +7802,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" +source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" dependencies = [ "Inflector", "proc-macro-crate", @@ -7785,7 +7814,7 @@ dependencies = [ [[package]] name = "sp-serializer" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" +source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" dependencies = [ "serde", "serde_json", @@ -7794,7 +7823,7 @@ dependencies = [ [[package]] name = "sp-session" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" +source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" dependencies = [ "parity-scale-codec", "sp-api", @@ -7807,7 +7836,7 @@ dependencies = [ [[package]] name = "sp-staking" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" +source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" dependencies = [ "parity-scale-codec", "sp-runtime", @@ -7817,7 +7846,7 @@ dependencies = [ [[package]] name = "sp-state-machine" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" +source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" dependencies = [ "hash-db", "itertools 0.9.0", @@ -7838,12 +7867,12 @@ dependencies = [ [[package]] name = "sp-std" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" +source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" [[package]] name = "sp-storage" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" +source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" dependencies = [ "impl-serde 0.2.3", "ref-cast", @@ -7855,7 +7884,7 @@ dependencies = [ [[package]] name = "sp-timestamp" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" +source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -7869,7 +7898,7 @@ dependencies = [ [[package]] name = "sp-tracing" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" +source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" dependencies = [ "log 0.4.8", "rental", @@ -7879,7 +7908,7 @@ dependencies = [ [[package]] name = "sp-transaction-pool" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" +source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -7894,7 +7923,7 @@ dependencies = [ [[package]] name = "sp-trie" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" +source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" dependencies = [ "hash-db", "memory-db", @@ -7908,7 +7937,7 @@ dependencies = [ [[package]] name = "sp-utils" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" +source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" dependencies = [ "futures 0.3.5", "futures-core", @@ -7920,7 +7949,7 @@ dependencies = [ [[package]] name = "sp-version" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" +source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" dependencies = [ "impl-serde 0.2.3", "parity-scale-codec", @@ -7932,7 +7961,7 @@ dependencies = [ [[package]] name = "sp-wasm-interface" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" +source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -8063,7 +8092,7 @@ dependencies = [ [[package]] name = "substrate-browser-utils" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" +source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" dependencies = [ "chrono", "console_error_panic_hook", @@ -8089,7 +8118,7 @@ dependencies = [ [[package]] name = "substrate-build-script-utils" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" +source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" dependencies = [ "platforms", ] @@ -8097,7 +8126,7 @@ dependencies = [ [[package]] name = "substrate-frame-rpc-system" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" +source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" dependencies = [ "frame-system-rpc-runtime-api", "futures 0.3.5", @@ -8120,7 +8149,7 @@ dependencies = [ [[package]] name = "substrate-prometheus-endpoint" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" +source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" dependencies = [ "async-std", "derive_more 0.99.9", @@ -8134,7 +8163,7 @@ dependencies = [ [[package]] name = "substrate-test-client" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" +source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" dependencies = [ "futures 0.1.29", "futures 0.3.5", @@ -8160,7 +8189,7 @@ dependencies = [ [[package]] name = "substrate-test-runtime" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" +source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" dependencies = [ "cfg-if", "frame-executive", @@ -8193,14 +8222,14 @@ dependencies = [ "sp-transaction-pool", "sp-trie", "sp-version", - "substrate-wasm-builder-runner 1.0.6 (git+https://github.com/paritytech/substrate?branch=master)", + "substrate-wasm-builder-runner 1.0.6 (git+https://github.com/paritytech/substrate)", "trie-db", ] [[package]] name = "substrate-test-runtime-client" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" +source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" dependencies = [ "futures 0.3.5", "parity-scale-codec", @@ -8221,7 +8250,7 @@ dependencies = [ [[package]] name = "substrate-wasm-builder-runner" version = "1.0.6" -source = "git+https://github.com/paritytech/substrate?branch=master#bf0e1ec1006e55b080b6d7314107a6ee571072e2" +source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" [[package]] name = "substrate-wasm-builder-runner" @@ -8435,6 +8464,7 @@ version = "0.7.22" dependencies = [ "parity-scale-codec", "polkadot-parachain", + "sp-core", "test-parachain-adder", "test-parachain-code-upgrader", "test-parachain-halt", diff --git a/network/src/protocol/tests.rs b/network/src/protocol/tests.rs index 4e7027963c..d2a7645094 100644 --- a/network/src/protocol/tests.rs +++ b/network/src/protocol/tests.rs @@ -30,25 +30,12 @@ use av_store::{Store as AvailabilityStore, ErasureNetworking}; use sc_network_gossip::TopicNotification; use sp_api::{ApiRef, ProvideRuntimeApi}; use sp_runtime::traits::Block as BlockT; -use sp_core::{crypto::Pair, traits::SpawnNamed}; +use sp_core::{crypto::Pair, testing::TaskExecutor}; use sp_keyring::Sr25519Keyring; -use futures::executor::{LocalPool, LocalSpawner}; +use futures::executor::LocalPool; use futures::task::{LocalSpawnExt, SpawnExt}; -#[derive(Clone)] -struct Executor(LocalSpawner); - -impl SpawnNamed for Executor { - fn spawn(&self, _: &'static str, future: futures::future::BoxFuture<'static, ()>) { - self.0.spawn_local(future).unwrap(); - } - - fn spawn_blocking(&self, name: &'static str, future: futures::future::BoxFuture<'static, ()>) { - self.spawn(name, future); - } -} - #[derive(Default)] pub struct MockNetworkOps { recorded: Mutex, @@ -256,7 +243,7 @@ fn test_setup(config: Config) -> ( mock_gossip.clone(), api.clone(), worker_rx, - Executor(pool.spawner()), + TaskExecutor::new(), ); let service = Service { diff --git a/network/test/src/block_import.rs b/network/test/src/block_import.rs index 68b0291e50..9791b35da6 100644 --- a/network/test/src/block_import.rs +++ b/network/test/src/block_import.rs @@ -88,7 +88,7 @@ fn import_single_good_block_without_header_fails() { #[test] fn async_import_queue_drops() { - let executor = sp_core::testing::SpawnBlockingExecutor::new(); + let executor = sp_core::testing::TaskExecutor::new(); // Perform this test multiple times since it exhibits non-deterministic behavior. for _ in 0..100 { let verifier = PassThroughVerifier::new(true); diff --git a/network/test/src/lib.rs b/network/test/src/lib.rs index 14463d7a42..4978db5834 100644 --- a/network/test/src/lib.rs +++ b/network/test/src/lib.rs @@ -573,7 +573,7 @@ pub trait TestNetFactory: Sized { Box::new(block_import.clone()), justification_import, finality_proof_import, - &sp_core::testing::SpawnBlockingExecutor::new(), + &sp_core::testing::TaskExecutor::new(), None, )); @@ -650,7 +650,7 @@ pub trait TestNetFactory: Sized { Box::new(block_import.clone()), justification_import, finality_proof_import, - &sp_core::testing::SpawnBlockingExecutor::new(), + &sp_core::testing::TaskExecutor::new(), None, )); diff --git a/node/core/backing/src/lib.rs b/node/core/backing/src/lib.rs index 4647526fef..0022a03f76 100644 --- a/node/core/backing/src/lib.rs +++ b/node/core/backing/src/lib.rs @@ -903,7 +903,7 @@ mod tests { } fn test_harness>(keystore: KeyStorePtr, test: impl FnOnce(TestHarness) -> T) { - let pool = sp_core::testing::SpawnBlockingExecutor::new(); + let pool = sp_core::testing::TaskExecutor::new(); let (context, virtual_overseer) = polkadot_subsystem::test_helpers::make_subsystem_context(pool.clone()); diff --git a/node/network/bitfield-distribution/src/lib.rs b/node/network/bitfield-distribution/src/lib.rs index bc7c6690c6..1fce48d498 100644 --- a/node/network/bitfield-distribution/src/lib.rs +++ b/node/network/bitfield-distribution/src/lib.rs @@ -706,7 +706,7 @@ mod test { signed_availability: signed.clone(), }; - let pool = sp_core::testing::SpawnBlockingExecutor::new(); + let pool = sp_core::testing::TaskExecutor::new(); let (mut ctx, mut handle) = make_subsystem_context::(pool); @@ -766,7 +766,7 @@ mod test { signed_availability: signed.clone(), }; - let pool = sp_core::testing::SpawnBlockingExecutor::new(); + let pool = sp_core::testing::TaskExecutor::new(); let (mut ctx, mut handle) = make_subsystem_context::(pool); @@ -818,7 +818,7 @@ mod test { signed_availability: signed_bitfield.clone(), }; - let pool = sp_core::testing::SpawnBlockingExecutor::new(); + let pool = sp_core::testing::TaskExecutor::new(); let (mut ctx, mut handle) = make_subsystem_context::(pool); @@ -915,7 +915,7 @@ mod test { signed_availability: signed_bitfield.clone(), }; - let pool = sp_core::testing::SpawnBlockingExecutor::new(); + let pool = sp_core::testing::TaskExecutor::new(); let (mut ctx, mut handle) = make_subsystem_context::(pool); @@ -1052,7 +1052,7 @@ mod test { // validator 0 key pair let (mut state, _signing_context, _validator_pair) = state_with_view(view![], hash_a.clone()); - let pool = sp_core::testing::SpawnBlockingExecutor::new(); + let pool = sp_core::testing::TaskExecutor::new(); let (mut ctx, mut handle) = make_subsystem_context::(pool); diff --git a/node/network/bridge/src/lib.rs b/node/network/bridge/src/lib.rs index 85606d07cc..6703be236b 100644 --- a/node/network/bridge/src/lib.rs +++ b/node/network/bridge/src/lib.rs @@ -635,7 +635,7 @@ mod tests { } fn test_harness>(test: impl FnOnce(TestHarness) -> T) { - let pool = sp_core::testing::SpawnBlockingExecutor::new(); + let pool = sp_core::testing::TaskExecutor::new(); let (network, network_handle) = new_test_network(); let (context, virtual_overseer) = polkadot_subsystem::test_helpers::make_subsystem_context(pool); diff --git a/node/network/pov-distribution/src/lib.rs b/node/network/pov-distribution/src/lib.rs index aa37cfdc3f..e222a89f49 100644 --- a/node/network/pov-distribution/src/lib.rs +++ b/node/network/pov-distribution/src/lib.rs @@ -619,7 +619,7 @@ mod tests { our_view: View(vec![hash_a, hash_b]), }; - let pool = sp_core::testing::SpawnBlockingExecutor::new(); + let pool = sp_core::testing::TaskExecutor::new(); let (mut ctx, mut handle) = polkadot_subsystem::test_helpers::make_subsystem_context(pool); let mut descriptor = CandidateDescriptor::default(); descriptor.pov_hash = pov_hash; @@ -699,7 +699,7 @@ mod tests { our_view: View(vec![hash_a]), }; - let pool = sp_core::testing::SpawnBlockingExecutor::new(); + let pool = sp_core::testing::TaskExecutor::new(); let (mut ctx, mut handle) = polkadot_subsystem::test_helpers::make_subsystem_context(pool); let mut descriptor = CandidateDescriptor::default(); descriptor.pov_hash = pov_hash; @@ -777,7 +777,7 @@ mod tests { our_view: View(vec![hash_a]), }; - let pool = sp_core::testing::SpawnBlockingExecutor::new(); + let pool = sp_core::testing::TaskExecutor::new(); let (mut ctx, mut handle) = polkadot_subsystem::test_helpers::make_subsystem_context(pool); executor::block_on(async move { @@ -849,7 +849,7 @@ mod tests { our_view: View(vec![hash_a]), }; - let pool = sp_core::testing::SpawnBlockingExecutor::new(); + let pool = sp_core::testing::TaskExecutor::new(); let (mut ctx, mut handle) = polkadot_subsystem::test_helpers::make_subsystem_context(pool); executor::block_on(async move { @@ -937,7 +937,7 @@ mod tests { our_view: View(vec![hash_a]), }; - let pool = sp_core::testing::SpawnBlockingExecutor::new(); + let pool = sp_core::testing::TaskExecutor::new(); let (mut ctx, mut handle) = polkadot_subsystem::test_helpers::make_subsystem_context(pool); executor::block_on(async move { @@ -1000,7 +1000,7 @@ mod tests { our_view: View(vec![hash_a]), }; - let pool = sp_core::testing::SpawnBlockingExecutor::new(); + let pool = sp_core::testing::TaskExecutor::new(); let (mut ctx, mut handle) = polkadot_subsystem::test_helpers::make_subsystem_context(pool); executor::block_on(async move { @@ -1061,7 +1061,7 @@ mod tests { our_view: View(vec![hash_a]), }; - let pool = sp_core::testing::SpawnBlockingExecutor::new(); + let pool = sp_core::testing::TaskExecutor::new(); let (mut ctx, mut handle) = polkadot_subsystem::test_helpers::make_subsystem_context(pool); executor::block_on(async move { @@ -1119,7 +1119,7 @@ mod tests { our_view: View(vec![hash_a]), }; - let pool = sp_core::testing::SpawnBlockingExecutor::new(); + let pool = sp_core::testing::TaskExecutor::new(); let (mut ctx, mut handle) = polkadot_subsystem::test_helpers::make_subsystem_context(pool); executor::block_on(async move { @@ -1204,7 +1204,7 @@ mod tests { our_view: View(vec![hash_a, hash_b]), }; - let pool = sp_core::testing::SpawnBlockingExecutor::new(); + let pool = sp_core::testing::TaskExecutor::new(); let (mut ctx, mut handle) = polkadot_subsystem::test_helpers::make_subsystem_context(pool); executor::block_on(async move { @@ -1266,7 +1266,7 @@ mod tests { our_view: View(vec![hash_a]), }; - let pool = sp_core::testing::SpawnBlockingExecutor::new(); + let pool = sp_core::testing::TaskExecutor::new(); let (mut ctx, mut handle) = polkadot_subsystem::test_helpers::make_subsystem_context(pool); executor::block_on(async move { @@ -1343,7 +1343,7 @@ mod tests { our_view: View(vec![hash_a]), }; - let pool = sp_core::testing::SpawnBlockingExecutor::new(); + let pool = sp_core::testing::TaskExecutor::new(); let (mut ctx, mut handle) = polkadot_subsystem::test_helpers::make_subsystem_context(pool); executor::block_on(async move { @@ -1426,7 +1426,7 @@ mod tests { our_view: View(vec![hash_a]), }; - let pool = sp_core::testing::SpawnBlockingExecutor::new(); + let pool = sp_core::testing::TaskExecutor::new(); let (mut ctx, mut handle) = polkadot_subsystem::test_helpers::make_subsystem_context(pool); executor::block_on(async move { diff --git a/node/network/statement-distribution/src/lib.rs b/node/network/statement-distribution/src/lib.rs index ae13b62791..f57f2745b8 100644 --- a/node/network/statement-distribution/src/lib.rs +++ b/node/network/statement-distribution/src/lib.rs @@ -1212,7 +1212,7 @@ mod tests { }, }; - let pool = sp_core::testing::SpawnBlockingExecutor::new(); + let pool = sp_core::testing::TaskExecutor::new(); let (mut ctx, mut handle) = polkadot_subsystem::test_helpers::make_subsystem_context(pool); let peer = PeerId::random(); @@ -1304,7 +1304,7 @@ mod tests { (peer_c.clone(), peer_data_from_view(peer_c_view)), ].into_iter().collect(); - let pool = sp_core::testing::SpawnBlockingExecutor::new(); + let pool = sp_core::testing::TaskExecutor::new(); let (mut ctx, mut handle) = polkadot_subsystem::test_helpers::make_subsystem_context(pool); executor::block_on(async move { diff --git a/node/overseer/examples/minimal-example.rs b/node/overseer/examples/minimal-example.rs index 36440275cb..1dae921426 100644 --- a/node/overseer/examples/minimal-example.rs +++ b/node/overseer/examples/minimal-example.rs @@ -135,7 +135,7 @@ impl Subsystem for Subsystem2 fn main() { femme::with_level(femme::LevelFilter::Trace); - let spawner = sp_core::testing::SpawnBlockingExecutor::new(); + let spawner = sp_core::testing::TaskExecutor::new(); futures::executor::block_on(async { let timer_stream = stream::repeat(()).then(|_| async { Delay::new(Duration::from_secs(1)).await; diff --git a/node/overseer/src/lib.rs b/node/overseer/src/lib.rs index cb158d09c1..6262e65cc4 100644 --- a/node/overseer/src/lib.rs +++ b/node/overseer/src/lib.rs @@ -485,7 +485,7 @@ where /// } /// /// # fn main() { executor::block_on(async move { - /// let spawner = sp_core::testing::SpawnBlockingExecutor::new(); + /// let spawner = sp_core::testing::TaskExecutor::new(); /// let all_subsystems = AllSubsystems { /// candidate_validation: ValidationSubsystem, /// candidate_backing: DummySubsystem, @@ -1058,7 +1058,7 @@ mod tests { // Checks that a minimal configuration of two jobs can run and exchange messages. #[test] fn overseer_works() { - let spawner = sp_core::testing::SpawnBlockingExecutor::new(); + let spawner = sp_core::testing::TaskExecutor::new(); executor::block_on(async move { let (s1_tx, mut s1_rx) = mpsc::channel(64); @@ -1123,7 +1123,7 @@ mod tests { // Should immediately conclude the overseer itself with an error. #[test] fn overseer_panics_on_subsystem_exit() { - let spawner = sp_core::testing::SpawnBlockingExecutor::new(); + let spawner = sp_core::testing::TaskExecutor::new(); executor::block_on(async move { let (s1_tx, _) = mpsc::channel(64); @@ -1218,7 +1218,7 @@ mod tests { // notifications on imported blocks triggers expected `StartWork` and `StopWork` heartbeats. #[test] fn overseer_start_stop_works() { - let spawner = sp_core::testing::SpawnBlockingExecutor::new(); + let spawner = sp_core::testing::TaskExecutor::new(); executor::block_on(async move { let first_block_hash = [1; 32].into(); @@ -1314,7 +1314,7 @@ mod tests { // notifications on imported blocks triggers expected `StartWork` and `StopWork` heartbeats. #[test] fn overseer_finalize_works() { - let spawner = sp_core::testing::SpawnBlockingExecutor::new(); + let spawner = sp_core::testing::TaskExecutor::new(); executor::block_on(async move { let first_block_hash = [1; 32].into(); diff --git a/node/subsystem/src/util.rs b/node/subsystem/src/util.rs index 9964a1e8dd..ee5cf2ded2 100644 --- a/node/subsystem/src/util.rs +++ b/node/subsystem/src/util.rs @@ -891,7 +891,7 @@ mod tests { type OverseerHandle = test_helpers::TestSubsystemContextHandle; fn test_harness>(run_args: HashMap>, test: impl FnOnce(OverseerHandle, mpsc::Receiver<(Option, JobsError)>) -> T) { - let pool = sp_core::testing::SpawnBlockingExecutor::new(); + let pool = sp_core::testing::TaskExecutor::new(); let (context, overseer_handle) = make_subsystem_context(pool.clone()); let (err_tx, err_rx) = mpsc::channel(16); diff --git a/parachain/Cargo.toml b/parachain/Cargo.toml index 312c633fc1..51c863a1fb 100644 --- a/parachain/Cargo.toml +++ b/parachain/Cargo.toml @@ -23,6 +23,7 @@ sc-executor = { git = "https://github.com/paritytech/substrate", branch = "maste sp-io = { git = "https://github.com/paritytech/substrate", branch = "master", optional = true } parking_lot = { version = "0.10.0", optional = true } log = { version = "0.4.8", optional = true } +futures = { version = "0.3.4", optional = true } [target.'cfg(not(any(target_os = "android", target_os = "unknown")))'.dependencies] shared_memory = { version = "0.10.0", optional = true } @@ -43,4 +44,5 @@ std = [ "sc-executor", "sp-io", "polkadot-core-primitives/std", + "futures", ] diff --git a/parachain/src/wasm_executor/mod.rs b/parachain/src/wasm_executor/mod.rs index e617a4c474..584d2edb93 100644 --- a/parachain/src/wasm_executor/mod.rs +++ b/parachain/src/wasm_executor/mod.rs @@ -23,8 +23,7 @@ use std::any::{TypeId, Any}; use crate::primitives::{ValidationParams, ValidationResult}; use codec::{Decode, Encode}; -use sp_core::storage::ChildInfo; -use sp_core::traits::CallInWasm; +use sp_core::{storage::ChildInfo, traits::{CallInWasm, SpawnNamed}}; use sp_externalities::Extensions; use sp_wasm_interface::HostFunctions as _; @@ -119,10 +118,11 @@ pub fn validate_candidate( validation_code: &[u8], params: ValidationParams, options: ExecutionMode<'_>, + spawner: impl SpawnNamed + 'static, ) -> Result { match options { ExecutionMode::Local => { - validate_candidate_internal(validation_code, ¶ms.encode()) + validate_candidate_internal(validation_code, ¶ms.encode(), spawner) }, #[cfg(not(any(target_os = "android", target_os = "unknown")))] ExecutionMode::Remote(pool) => { @@ -154,9 +154,10 @@ type HostFunctions = sp_io::SubstrateHostFunctions; pub fn validate_candidate_internal( validation_code: &[u8], encoded_call_data: &[u8], + spawner: impl SpawnNamed + 'static, ) -> Result { let mut extensions = Extensions::new(); - extensions.register(sp_core::traits::TaskExecutorExt(sp_core::tasks::executor())); + extensions.register(sp_core::traits::TaskExecutorExt::new(spawner)); let mut ext = ValidationExternalities(extensions); diff --git a/parachain/src/wasm_executor/validation_host.rs b/parachain/src/wasm_executor/validation_host.rs index d780d5b86b..96ad7d9ebc 100644 --- a/parachain/src/wasm_executor/validation_host.rs +++ b/parachain/src/wasm_executor/validation_host.rs @@ -19,11 +19,12 @@ use std::{process, env, sync::Arc, sync::atomic}; use codec::{Decode, Encode}; use crate::primitives::{ValidationParams, ValidationResult}; -use super::{validate_candidate_internal, Error}; -use super::{MAX_CODE_MEM, MAX_RUNTIME_MEM}; +use super::{validate_candidate_internal, Error, MAX_CODE_MEM, MAX_RUNTIME_MEM}; use shared_memory::{SharedMem, SharedMemConf, EventState, WriteLockable, EventWait, EventSet}; use parking_lot::Mutex; use log::{debug, trace}; +use futures::executor::ThreadPool; +use sp_core::traits::SpawnNamed; const WORKER_ARGS_TEST: &[&'static str] = &["--nocapture", "validation_worker"]; /// CLI Argument to start in validation worker mode. @@ -43,6 +44,25 @@ enum Event { WorkerReady = 2, } +#[derive(Clone)] +struct TaskExecutor(ThreadPool); + +impl TaskExecutor { + fn new() -> Result { + ThreadPool::new().map_err(|e| e.to_string()).map(Self) + } +} + +impl SpawnNamed for TaskExecutor { + fn spawn_blocking(&self, _: &'static str, future: futures::future::BoxFuture<'static, ()>) { + self.0.spawn_ok(future); + } + + fn spawn(&self, _: &'static str, future: futures::future::BoxFuture<'static, ()>) { + self.0.spawn_ok(future); + } +} + /// A pool of hosts. #[derive(Clone)] pub struct ValidationPool { @@ -92,6 +112,7 @@ pub fn run_worker(mem_id: &str) -> Result<(), String> { }; let exit = Arc::new(atomic::AtomicBool::new(false)); + let task_executor = TaskExecutor::new()?; // spawn parent monitor thread let watch_exit = exit.clone(); std::thread::spawn(move || { @@ -139,7 +160,7 @@ pub fn run_worker(mem_id: &str) -> Result<(), String> { let (call_data, _) = rest.split_at_mut(MAX_RUNTIME_MEM); let (call_data, _) = call_data.split_at_mut(header.params_size as usize); - let result = validate_candidate_internal(code, call_data); + let result = validate_candidate_internal(code, call_data, task_executor.clone()); debug!("{} Candidate validated: {:?}", process::id(), result); match result { diff --git a/parachain/test-parachains/Cargo.toml b/parachain/test-parachains/Cargo.toml index 8b903b8573..79bcf67851 100644 --- a/parachain/test-parachains/Cargo.toml +++ b/parachain/test-parachains/Cargo.toml @@ -14,6 +14,9 @@ adder = { package = "test-parachain-adder", path = "adder" } halt = { package = "test-parachain-halt", path = "halt" } code-upgrader = { package = "test-parachain-code-upgrader", path = "code-upgrader" } +[dev-dependencies] +sp-core = { git = "https://github.com/paritytech/substrate", branch = "master" } + [features] default = [ "std" ] std = [ diff --git a/parachain/test-parachains/tests/adder/mod.rs b/parachain/test-parachains/tests/adder/mod.rs index 373eace15c..ecbac12ac5 100644 --- a/parachain/test-parachains/tests/adder/mod.rs +++ b/parachain/test-parachains/tests/adder/mod.rs @@ -78,6 +78,7 @@ pub fn execute_good_on_parent() { code_upgrade_allowed: None, }, parachain::wasm_executor::ExecutionMode::RemoteTest(&pool), + sp_core::testing::TaskExecutor::new(), ).unwrap(); let new_head = HeadData::decode(&mut &ret.head_data.0[..]).unwrap(); @@ -117,6 +118,7 @@ fn execute_good_chain_on_parent() { code_upgrade_allowed: None, }, parachain::wasm_executor::ExecutionMode::RemoteTest(&pool), + sp_core::testing::TaskExecutor::new(), ).unwrap(); let new_head = HeadData::decode(&mut &ret.head_data.0[..]).unwrap(); @@ -157,5 +159,6 @@ fn execute_bad_on_parent() { code_upgrade_allowed: None, }, parachain::wasm_executor::ExecutionMode::RemoteTest(&pool), + sp_core::testing::TaskExecutor::new(), ).unwrap_err(); } diff --git a/parachain/test-parachains/tests/code_upgrader/mod.rs b/parachain/test-parachains/tests/code_upgrader/mod.rs index 27b164f90c..b99a6e9dbf 100644 --- a/parachain/test-parachains/tests/code_upgrader/mod.rs +++ b/parachain/test-parachains/tests/code_upgrader/mod.rs @@ -50,6 +50,7 @@ pub fn execute_good_no_upgrade() { code_upgrade_allowed: None, }, parachain::wasm_executor::ExecutionMode::RemoteTest(&pool), + sp_core::testing::TaskExecutor::new(), ).unwrap(); let new_head = HeadData::decode(&mut &ret.head_data.0[..]).unwrap(); @@ -86,6 +87,7 @@ pub fn execute_good_with_upgrade() { code_upgrade_allowed: Some(20), }, parachain::wasm_executor::ExecutionMode::RemoteTest(&pool), + sp_core::testing::TaskExecutor::new(), ).unwrap(); let new_head = HeadData::decode(&mut &ret.head_data.0[..]).unwrap(); @@ -129,6 +131,7 @@ pub fn code_upgrade_not_allowed() { code_upgrade_allowed: None, }, parachain::wasm_executor::ExecutionMode::RemoteTest(&pool), + sp_core::testing::TaskExecutor::new(), ).unwrap(); } @@ -159,6 +162,7 @@ pub fn applies_code_upgrade_after_delay() { code_upgrade_allowed: Some(2), }, parachain::wasm_executor::ExecutionMode::RemoteTest(&pool), + sp_core::testing::TaskExecutor::new(), ).unwrap(); let new_head = HeadData::decode(&mut &ret.head_data.0[..]).unwrap(); @@ -194,6 +198,7 @@ pub fn applies_code_upgrade_after_delay() { code_upgrade_allowed: None, }, parachain::wasm_executor::ExecutionMode::RemoteTest(&pool), + sp_core::testing::TaskExecutor::new(), ).unwrap(); let new_head = HeadData::decode(&mut &ret.head_data.0[..]).unwrap(); diff --git a/parachain/test-parachains/tests/wasm_executor/mod.rs b/parachain/test-parachains/tests/wasm_executor/mod.rs index 864b9a4ea7..0e696b2395 100644 --- a/parachain/test-parachains/tests/wasm_executor/mod.rs +++ b/parachain/test-parachains/tests/wasm_executor/mod.rs @@ -37,6 +37,7 @@ fn terminates_on_timeout() { code_upgrade_allowed: None, }, parachain::wasm_executor::ExecutionMode::RemoteTest(&pool), + sp_core::testing::TaskExecutor::new(), ); match result { Err(parachain::wasm_executor::Error::Timeout) => {}, @@ -66,6 +67,7 @@ fn parallel_execution() { code_upgrade_allowed: None, }, parachain::wasm_executor::ExecutionMode::RemoteTest(&pool2), + sp_core::testing::TaskExecutor::new(), ).ok()); let _ = parachain::wasm_executor::validate_candidate( halt::wasm_binary_unwrap(), @@ -78,6 +80,7 @@ fn parallel_execution() { code_upgrade_allowed: None, }, parachain::wasm_executor::ExecutionMode::RemoteTest(&pool), + sp_core::testing::TaskExecutor::new(), ); thread.join().unwrap(); // total time should be < 2 x EXECUTION_TIMEOUT_SEC diff --git a/runtime/test-runtime/client/src/lib.rs b/runtime/test-runtime/client/src/lib.rs index 58282d32b4..704c8b498d 100644 --- a/runtime/test-runtime/client/src/lib.rs +++ b/runtime/test-runtime/client/src/lib.rs @@ -295,7 +295,7 @@ pub fn new_light() -> ( let local_call_executor = LocalCallExecutor::new( backend.clone(), executor, - sp_core::tasks::executor(), + Box::new(sp_core::testing::TaskExecutor::new()), Default::default() ); let call_executor = LightExecutor::new( diff --git a/validation/src/collation.rs b/validation/src/collation.rs index b79b049b22..53e18ab3ab 100644 --- a/validation/src/collation.rs +++ b/validation/src/collation.rs @@ -29,6 +29,7 @@ use polkadot_erasure_coding as erasure; use sp_api::ProvideRuntimeApi; use futures::prelude::*; use log::debug; +use primitives::traits::SpawnNamed; /// Encapsulates connections to collators and allows collation on any parachain. /// @@ -64,6 +65,7 @@ pub async fn collation_fetch( client: Arc

, max_block_data_size: Option, n_validators: usize, + spawner: impl SpawnNamed + Clone + 'static, ) -> Result<(CollationInfo, crate::pipeline::FullOutput), C::Error> where P::Api: ParachainHost, @@ -82,6 +84,7 @@ pub async fn collation_fetch( &relay_parent, max_block_data_size, n_validators, + spawner.clone(), ); match res { diff --git a/validation/src/pipeline.rs b/validation/src/pipeline.rs index 663321480c..1c826a7bb1 100644 --- a/validation/src/pipeline.rs +++ b/validation/src/pipeline.rs @@ -32,6 +32,7 @@ use parachain::{ use runtime_primitives::traits::{BlakeTwo256, Hash as HashT}; use sp_api::ProvideRuntimeApi; use crate::Error; +use primitives::traits::SpawnNamed; pub use parachain::wasm_executor::ValidationPool; @@ -191,6 +192,7 @@ pub fn validate<'a>( local_validation: &'a LocalValidationData, global_validation: &'a GlobalValidationData, validation_code: &ValidationCode, + spawner: impl SpawnNamed + 'static, ) -> Result, Error> { if collation.head_data.0.len() > global_validation.max_head_data_size as _ { return Err(Error::HeadDataTooLarge( @@ -222,6 +224,7 @@ pub fn validate<'a>( &validation_code.0, params, execution_mode, + spawner, ) { Ok(result) => { if result.head_data == collation.head_data { @@ -277,6 +280,7 @@ pub fn full_output_validation_with_api

( expected_relay_parent: &Hash, max_block_data_size: Option, n_validators: usize, + spawner: impl SpawnNamed + 'static, ) -> Result where P: ProvideRuntimeApi, P::Api: ParachainHost, @@ -302,6 +306,7 @@ pub fn full_output_validation_with_api

( &local_validation, &global_validation, &validation_code, + spawner, ); match res { diff --git a/validation/src/shared_table/mod.rs b/validation/src/shared_table/mod.rs index d42c9b7e56..58cc56cb7f 100644 --- a/validation/src/shared_table/mod.rs +++ b/validation/src/shared_table/mod.rs @@ -312,6 +312,7 @@ impl ParachainWork { &expected_relay_parent, max_block_data_size, n_validators, + primitives::testing::TaskExecutor::new(), )?; full_output.check_consistency(candidate)?; diff --git a/validation/src/validation_service/mod.rs b/validation/src/validation_service/mod.rs index 11116fcaff..538e987c43 100644 --- a/validation/src/validation_service/mod.rs +++ b/validation/src/validation_service/mod.rs @@ -145,7 +145,7 @@ impl ServiceBuilder where N::BuildTableRouter: Send + Unpin + 'static, ::SendLocalCollation: Send, SC: SelectChain + 'static, - SP: SpawnNamed + Send + 'static, + SP: SpawnNamed + Clone + 'static, // Rust bug: https://github.com/rust-lang/rust/issues/24159 sp_api::StateBackendFor: sp_api::StateBackend>, { @@ -167,11 +167,15 @@ impl ServiceBuilder where let mut parachain_validation = ParachainValidationInstances { client: self.client.clone(), network: self.network, - spawner: self.spawner, + spawner: self.spawner.clone(), availability_store: self.availability_store, live_instances: HashMap::new(), validation_pool: validation_pool.clone(), - collation_fetch: DefaultCollationFetch(self.collators, validation_pool), + collation_fetch: DefaultCollationFetch { + collators: self.collators, + validation_pool, + spawner: self.spawner, + }, }; let client = self.client; @@ -253,11 +257,17 @@ pub(crate) trait CollationFetch { } #[derive(Clone)] -struct DefaultCollationFetch(C, Option); -impl CollationFetch for DefaultCollationFetch +struct DefaultCollationFetch { + collators: C, + validation_pool: Option, + spawner: S, +} + +impl CollationFetch for DefaultCollationFetch where C: Collators + Send + Sync + Unpin + 'static, C::Collation: Send + Unpin + 'static, + S: SpawnNamed + Clone + 'static, { type Error = C::Error; @@ -273,15 +283,15 @@ impl CollationFetch for DefaultCollationFetch P::Api: ParachainHost, P: ProvideRuntimeApi + Send + Sync + 'static, { - let DefaultCollationFetch(collators, validation_pool) = self; crate::collation::collation_fetch( - validation_pool, + self.validation_pool, parachain, relay_parent, - collators, + self.collators, client, max_block_data_size, n_validators, + self.spawner, ).boxed() } } @@ -553,7 +563,7 @@ mod tests { use runtime_primitives::traits::Block as BlockT; use std::pin::Pin; use sp_keyring::sr25519::Keyring; - use primitives::testing::SpawnBlockingExecutor; + use primitives::testing::TaskExecutor; /// Events fired while running mock implementations to follow execution. enum Events { @@ -714,7 +724,7 @@ mod tests { #[test] fn launch_work_is_executed_properly() { - let executor = SpawnBlockingExecutor::new(); + let executor = TaskExecutor::new(); let keystore = keystore::Store::new_in_memory(); // Make sure `Bob` key is in the keystore, so this mocked node will be a parachain validator. @@ -754,7 +764,7 @@ mod tests { #[test] fn router_is_built_on_relay_chain_validator() { - let executor = SpawnBlockingExecutor::new(); + let executor = TaskExecutor::new(); let keystore = keystore::Store::new_in_memory(); // Make sure `Alice` key is in the keystore, so this mocked node will be a relay-chain validator. -- GitLab From 38f5cbc1847d2d8707e916ad969d7499be431665 Mon Sep 17 00:00:00 2001 From: Cecile Tonglet Date: Mon, 27 Jul 2020 07:54:24 +0200 Subject: [PATCH 102/192] Refactor service to allow building full (and light) node matching chain spec (#1467) --- cli/src/browser.rs | 4 +- cli/src/command.rs | 69 ++++++++++++---------------------- service/src/lib.rs | 92 +++++++++++++++++++++++++++++++++++----------- 3 files changed, 96 insertions(+), 69 deletions(-) diff --git a/cli/src/browser.rs b/cli/src/browser.rs index becd340530..17ef9ae802 100644 --- a/cli/src/browser.rs +++ b/cli/src/browser.rs @@ -46,8 +46,8 @@ async fn start_inner(chain_spec: String, log_level: String) -> Result Result<()> { match &cli.subcommand { None => { - let runtime = cli.create_runner(&cli.run.base)?; - let chain_spec = &runtime.config().chain_spec; + let runner = cli.create_runner(&cli.run.base)?; + let chain_spec = &runner.config().chain_spec; set_default_ss58_version(chain_spec); @@ -124,55 +124,32 @@ pub fn run() -> Result<()> { info!(" endorsed by the "); info!(" KUSAMA FOUNDATION "); info!("----------------------------"); + } - runtime.run_node_until_exit(|config| match config.role { - Role::Light => service::kusama_new_light(config) - .map(|(components, _)| components), - _ => service::kusama_new_full( - config, - None, - None, - authority_discovery_disabled, - 6000, - grandpa_pause, - ).map(|(components, _, _)| components) - }) - } else if chain_spec.is_westend() { - runtime.run_node_until_exit(|config| match config.role { - Role::Light => service::westend_new_light(config) - .map(|(components, _)| components), - _ => service::westend_new_full( - config, - None, - None, - authority_discovery_disabled, - 6000, - grandpa_pause, - ).map(|(components, _, _)| components) - }) - } else { - runtime.run_node_until_exit(|config| match config.role { - Role::Light => service::polkadot_new_light(config) - .map(|(components, _)| components), - _ => service::polkadot_new_full( - config, + runner.run_node_until_exit(|config| { + let role = config.role.clone(); + let builder = service::NodeBuilder::new(config); + + match role { + Role::Light => builder.build_light().map(|(task_manager, _)| task_manager), + _ => builder.build_full( None, None, authority_discovery_disabled, 6000, grandpa_pause, - ).map(|(components, _, _)| components) - }) - } + ), + } + }) }, Some(Subcommand::Base(subcommand)) => { - let runtime = cli.create_runner(subcommand)?; - let chain_spec = &runtime.config().chain_spec; + let runner = cli.create_runner(subcommand)?; + let chain_spec = &runner.config().chain_spec; set_default_ss58_version(chain_spec); if chain_spec.is_kusama() { - runtime.run_subcommand(subcommand, |config| + runner.run_subcommand(subcommand, |config| service::new_chain_ops::< service::kusama_runtime::RuntimeApi, service::KusamaExecutor, @@ -180,7 +157,7 @@ pub fn run() -> Result<()> { >(config) ) } else if chain_spec.is_westend() { - runtime.run_subcommand(subcommand, |config| + runner.run_subcommand(subcommand, |config| service::new_chain_ops::< service::westend_runtime::RuntimeApi, service::WestendExecutor, @@ -188,7 +165,7 @@ pub fn run() -> Result<()> { >(config) ) } else { - runtime.run_subcommand(subcommand, |config| + runner.run_subcommand(subcommand, |config| service::new_chain_ops::< service::polkadot_runtime::RuntimeApi, service::PolkadotExecutor, @@ -209,21 +186,21 @@ pub fn run() -> Result<()> { } }, Some(Subcommand::Benchmark(cmd)) => { - let runtime = cli.create_runner(cmd)?; - let chain_spec = &runtime.config().chain_spec; + let runner = cli.create_runner(cmd)?; + let chain_spec = &runner.config().chain_spec; set_default_ss58_version(chain_spec); if chain_spec.is_kusama() { - runtime.sync_run(|config| { + runner.sync_run(|config| { cmd.run::(config) }) } else if chain_spec.is_westend() { - runtime.sync_run(|config| { + runner.sync_run(|config| { cmd.run::(config) }) } else { - runtime.sync_run(|config| { + runner.sync_run(|config| { cmd.run::(config) }) } diff --git a/service/src/lib.rs b/service/src/lib.rs index a0b2fdcd22..55cda65242 100644 --- a/service/src/lib.rs +++ b/service/src/lib.rs @@ -643,7 +643,7 @@ fn new_light(mut config: Configuration) -> Result< let rpc_extensions = polkadot_rpc::create_light(light_deps); - let ServiceComponents { task_manager, rpc_handlers, .. } = service::build(service::ServiceParams { + let ServiceComponents { task_manager, rpc_handlers, .. } = service::build(service::ServiceParams { config, block_announce_validator_builder: None, finality_proof_request_builder: Some(finality_proof_request_builder), @@ -655,7 +655,7 @@ fn new_light(mut config: Configuration) -> Result< transaction_pool: transaction_pool.clone(), import_queue, keystore, backend, task_manager, })?; - + Ok((task_manager, rpc_handlers)) } @@ -793,26 +793,76 @@ pub struct FullNodeHandles { pub validation_service_handle: Option, } -/// Create a new Polkadot service for a light client. -pub fn polkadot_new_light(config: Configuration) -> Result< - (TaskManager, Arc), ServiceError -> -{ - new_light::(config) +/// A builder for a node. +pub struct NodeBuilder { + config: Configuration, } -/// Create a new Kusama service for a light client. -pub fn kusama_new_light(config: Configuration) -> Result< - (TaskManager, Arc), ServiceError -> -{ - new_light::(config) -} +impl NodeBuilder { + /// Create a new node builder. + pub fn new(config: Configuration) -> Self { + Self { + config, + } + } -/// Create a new Westend service for a light client. -pub fn westend_new_light(config: Configuration, ) -> Result< - (TaskManager, Arc), ServiceError -> -{ - new_light::(config) + /// Build a new light node. + pub fn build_light(self) -> Result<(TaskManager, Arc), ServiceError> { + if self.config.chain_spec.is_kusama() { + new_light::( + self.config, + ) + } else if self.config.chain_spec.is_westend() { + new_light::( + self.config, + ) + } else { + new_light::( + self.config, + ) + } + } + + /// Build a new full node. + #[cfg(feature = "full-node")] + pub fn build_full( + self, + collating_for: Option<(CollatorId, parachain::Id)>, + max_block_data_size: Option, + authority_discovery_disabled: bool, + slot_duration: u64, + grandpa_pause: Option<(u32, u32)>, + ) -> Result { + if self.config.chain_spec.is_kusama() { + new_full::( + self.config, + collating_for, + max_block_data_size, + authority_discovery_disabled, + slot_duration, + grandpa_pause, + false, + ).map(|(task_manager, _, _, _, _)| task_manager) + } else if self.config.chain_spec.is_westend() { + new_full::( + self.config, + collating_for, + max_block_data_size, + authority_discovery_disabled, + slot_duration, + grandpa_pause, + false, + ).map(|(task_manager, _, _, _, _)| task_manager) + } else { + new_full::( + self.config, + collating_for, + max_block_data_size, + authority_discovery_disabled, + slot_duration, + grandpa_pause, + false, + ).map(|(task_manager, _, _, _, _)| task_manager) + } + } } -- GitLab From 12a02556bde1a160af889503db113cd5d2d54a68 Mon Sep 17 00:00:00 2001 From: Peter Goodspeed-Niklaus Date: Mon, 27 Jul 2020 10:39:52 +0200 Subject: [PATCH 103/192] add ActiveLeavesUpdate, remove StartWork, StopWork (#1458) * add ActiveLeavesUpdate, remove StartWork, StopWork * replace StartWork, StopWork in subsystem crate tests * mechanically update OverseerSignal in other modules * convert overseer to take advantage of new multi-hash update abilities Note: this does not yet convert the tests; some of the tests now freeze: test tests::overseer_start_stop_works ... test tests::overseer_start_stop_works has been running for over 60 seconds test tests::overseer_finalize_works ... test tests::overseer_finalize_works has been running for over 60 seconds * fix broken overseer tests * manually impl PartialEq for ActiveLeavesUpdate, rm trait Equivalent This cleans up the code a bit and makes it easier in the future to do the right thing when comparing ALUs. * use target in all network bridge logging * reduce spamming of and --- Cargo.lock | 1 + node/core/backing/src/lib.rs | 10 ++-- node/network/bitfield-distribution/src/lib.rs | 41 +++++++++------- node/network/bridge/Cargo.toml | 3 +- node/network/bridge/src/lib.rs | 48 +++++++----------- node/network/pov-distribution/src/lib.rs | 35 ++++++------- .../network/statement-distribution/src/lib.rs | 43 ++++++++-------- node/overseer/src/lib.rs | 49 ++++++++++++------- node/subsystem/Cargo.toml | 1 + node/subsystem/src/lib.rs | 47 ++++++++++++++++-- node/subsystem/src/util.rs | 35 +++++++------ 11 files changed, 181 insertions(+), 132 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 8b0b4066da..046d2ac453 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4670,6 +4670,7 @@ dependencies = [ "polkadot-statement-table", "sc-keystore", "sc-network", + "smallvec 1.4.1", "sp-core", "streamunordered", ] diff --git a/node/core/backing/src/lib.rs b/node/core/backing/src/lib.rs index 0022a03f76..89da1716dc 100644 --- a/node/core/backing/src/lib.rs +++ b/node/core/backing/src/lib.rs @@ -778,7 +778,7 @@ mod tests { }; use polkadot_subsystem::{ messages::{RuntimeApiRequest, SchedulerRoster}, - FromOverseer, OverseerSignal, + ActiveLeavesUpdate, FromOverseer, OverseerSignal, }; use sp_keyring::Sr25519Keyring; use std::collections::HashMap; @@ -968,7 +968,7 @@ mod tests { ) { // Start work on some new parent. virtual_overseer.send(FromOverseer::Signal( - OverseerSignal::StartWork(test_state.relay_parent)) + OverseerSignal::ActiveLeaves(ActiveLeavesUpdate::start_work(test_state.relay_parent))) ).await; // Check that subsystem job issues a request for a validator set. @@ -1084,7 +1084,7 @@ mod tests { ); virtual_overseer.send(FromOverseer::Signal( - OverseerSignal::StopWork(test_state.relay_parent)) + OverseerSignal::ActiveLeaves(ActiveLeavesUpdate::stop_work(test_state.relay_parent))) ).await; }); } @@ -1202,7 +1202,7 @@ mod tests { assert_eq!(backed[0].0.validator_indices, bitvec::bitvec![Lsb0, u8; 1, 1, 0]); virtual_overseer.send(FromOverseer::Signal( - OverseerSignal::StopWork(test_state.relay_parent)) + OverseerSignal::ActiveLeaves(ActiveLeavesUpdate::stop_work(test_state.relay_parent))) ).await; }); } @@ -1476,7 +1476,7 @@ mod tests { ); virtual_overseer.send(FromOverseer::Signal( - OverseerSignal::StopWork(test_state.relay_parent)) + OverseerSignal::ActiveLeaves(ActiveLeavesUpdate::stop_work(test_state.relay_parent))) ).await; }); } diff --git a/node/network/bitfield-distribution/src/lib.rs b/node/network/bitfield-distribution/src/lib.rs index 1fce48d498..9517504c1f 100644 --- a/node/network/bitfield-distribution/src/lib.rs +++ b/node/network/bitfield-distribution/src/lib.rs @@ -28,7 +28,7 @@ use node_primitives::{ProtocolId, View}; use log::{trace, warn}; use polkadot_subsystem::messages::*; use polkadot_subsystem::{ - FromOverseer, OverseerSignal, SpawnedSubsystem, Subsystem, SubsystemContext, SubsystemResult, + ActiveLeavesUpdate, FromOverseer, OverseerSignal, SpawnedSubsystem, Subsystem, SubsystemContext, SubsystemResult, }; use polkadot_primitives::v1::{Hash, SignedAvailabilityBitfield, SigningContext, ValidatorId}; use sc_network::ReputationChange; @@ -157,24 +157,27 @@ impl BitfieldDistribution { warn!(target: "bitd", "Failed to handle incomming network messages: {:?}", e); } } - FromOverseer::Signal(OverseerSignal::StartWork(relay_parent)) => { - trace!(target: "bitd", "Start {:?}", relay_parent); - // query basic system parameters once - let (validator_set, signing_context) = - query_basics(&mut ctx, relay_parent).await?; - - let _ = state.per_relay_parent.insert( - relay_parent, - PerRelayParentData { - signing_context, - validator_set, - ..Default::default() - }, - ); - } - FromOverseer::Signal(OverseerSignal::StopWork(relay_parent)) => { - trace!(target: "bitd", "Stop {:?}", relay_parent); - // defer the cleanup to the view change + FromOverseer::Signal(OverseerSignal::ActiveLeaves(ActiveLeavesUpdate { activated, deactivated })) => { + for relay_parent in activated { + trace!(target: "bitd", "Start {:?}", relay_parent); + // query basic system parameters once + let (validator_set, signing_context) = + query_basics(&mut ctx, relay_parent).await?; + + let _ = state.per_relay_parent.insert( + relay_parent, + PerRelayParentData { + signing_context, + validator_set, + ..Default::default() + }, + ); + } + + for relay_parent in deactivated { + trace!(target: "bitd", "Stop {:?}", relay_parent); + // defer the cleanup to the view change + } } FromOverseer::Signal(OverseerSignal::Conclude) => { trace!(target: "bitd", "Conclude"); diff --git a/node/network/bridge/Cargo.toml b/node/network/bridge/Cargo.toml index 3bd4b6702b..25a9dc62c2 100644 --- a/node/network/bridge/Cargo.toml +++ b/node/network/bridge/Cargo.toml @@ -17,6 +17,7 @@ sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "master polkadot-subsystem = { package = "polkadot-node-subsystem", path = "../../subsystem" } [dev-dependencies] -parking_lot = "0.10.0" assert_matches = "1.3.0" +parking_lot = "0.10.0" +polkadot-subsystem = { package = "polkadot-node-subsystem", path = "../../subsystem", features = [ "test-helpers" ] } sp-core = { git = "https://github.com/paritytech/substrate", branch = "master" } diff --git a/node/network/bridge/src/lib.rs b/node/network/bridge/src/lib.rs index 6703be236b..a1f5694568 100644 --- a/node/network/bridge/src/lib.rs +++ b/node/network/bridge/src/lib.rs @@ -28,7 +28,7 @@ use sc_network::{ use sp_runtime::ConsensusEngineId; use polkadot_subsystem::{ - FromOverseer, OverseerSignal, Subsystem, SubsystemContext, SpawnedSubsystem, SubsystemError, + ActiveLeavesUpdate, FromOverseer, OverseerSignal, Subsystem, SubsystemContext, SpawnedSubsystem, SubsystemError, SubsystemResult, }; use polkadot_subsystem::messages::{NetworkBridgeEvent, NetworkBridgeMessage, AllMessages}; @@ -57,6 +57,9 @@ const UNKNOWN_PROTO_COST: ReputationChange const MALFORMED_VIEW_COST: ReputationChange = ReputationChange::new(-500, "Malformed view"); +// network bridge log target +const TARGET: &'static str = "network_bridge"; + /// Messages received on the network. #[derive(Debug, Encode, Decode, Clone)] pub enum WireMessage { @@ -203,8 +206,7 @@ enum Action { RegisterEventProducer(ProtocolId, fn(NetworkBridgeEvent) -> AllMessages), SendMessage(Vec, ProtocolId, Vec), ReportPeer(PeerId, ReputationChange), - StartWork(Hash), - StopWork(Hash), + ActiveLeaves(ActiveLeavesUpdate), PeerConnected(PeerId, ObservedRole), PeerDisconnected(PeerId), @@ -217,10 +219,8 @@ fn action_from_overseer_message( res: polkadot_subsystem::SubsystemResult>, ) -> Action { match res { - Ok(FromOverseer::Signal(OverseerSignal::StartWork(relay_parent))) - => Action::StartWork(relay_parent), - Ok(FromOverseer::Signal(OverseerSignal::StopWork(relay_parent))) - => Action::StopWork(relay_parent), + Ok(FromOverseer::Signal(OverseerSignal::ActiveLeaves(active_leaves))) + => Action::ActiveLeaves(active_leaves), Ok(FromOverseer::Signal(OverseerSignal::Conclude)) => Action::Abort, Ok(FromOverseer::Communication { msg }) => match msg { NetworkBridgeMessage::RegisterEventProducer(protocol_id, message_producer) @@ -230,7 +230,7 @@ fn action_from_overseer_message( => Action::SendMessage(peers, protocol, message), }, Err(e) => { - log::warn!("Shutting down Network Bridge due to error {:?}", e); + log::warn!(target: TARGET, "Shutting down Network Bridge due to error {:?}", e); Action::Abort } } @@ -239,7 +239,7 @@ fn action_from_overseer_message( fn action_from_network_message(event: Option) -> Option { match event { None => { - log::info!("Shutting down Network Bridge: underlying event stream concluded"); + log::info!(target: TARGET, "Shutting down Network Bridge: underlying event stream concluded"); Some(Action::Abort) } Some(NetworkEvent::Dht(_)) => None, @@ -392,23 +392,10 @@ async fn run_network( Action::ReportPeer(peer, rep) => { net.report_peer(peer, rep).await?; } - Action::StartWork(relay_parent) => { - live_heads.push(relay_parent); - if let Some(view_update) - = update_view(&peers, &live_heads, &mut net, &mut local_view).await? - { - if let Err(e) = dispatch_update_to_all( - view_update, - event_producers.values(), - &mut ctx, - ).await { - log::warn!("Aborting - Failure to dispatch messages to overseer"); - return Err(e) - } - } - } - Action::StopWork(relay_parent) => { - live_heads.retain(|h| h != &relay_parent); + Action::ActiveLeaves(ActiveLeavesUpdate { activated, deactivated }) => { + live_heads.extend(activated); + live_heads.retain(|h| !deactivated.contains(h)); + if let Some(view_update) = update_view(&peers, &live_heads, &mut net, &mut local_view).await? { @@ -417,12 +404,11 @@ async fn run_network( event_producers.values(), &mut ctx, ).await { - log::warn!("Aborting - Failure to dispatch messages to overseer"); + log::warn!(target: TARGET, "Aborting - Failure to dispatch messages to overseer"); return Err(e) } } } - Action::PeerConnected(peer, role) => { match peers.entry(peer.clone()) { HEntry::Occupied(_) => continue, @@ -450,7 +436,7 @@ async fn run_network( event_producers.values(), &mut ctx, ).await { - log::warn!("Aborting - Failure to dispatch messages to overseer"); + log::warn!(target: TARGET, "Aborting - Failure to dispatch messages to overseer"); return Err(e) } } @@ -510,7 +496,7 @@ async fn run_network( let send_messages = ctx.send_messages(outgoing_messages); if let Err(e) = send_messages.await { - log::warn!("Aborting - Failure to dispatch messages to overseer"); + log::warn!(target: TARGET, "Aborting - Failure to dispatch messages to overseer"); return Err(e) } }, @@ -670,7 +656,7 @@ mod tests { let hash_a = Hash::from([1; 32]); - virtual_overseer.send(FromOverseer::Signal(OverseerSignal::StartWork(hash_a))).await; + virtual_overseer.send(FromOverseer::Signal(OverseerSignal::ActiveLeaves(ActiveLeavesUpdate::start_work(hash_a)))).await; let actions = network_handle.next_network_actions(2).await; let wire_message = WireMessage::ViewUpdate(View(vec![hash_a])).encode(); diff --git a/node/network/pov-distribution/src/lib.rs b/node/network/pov-distribution/src/lib.rs index e222a89f49..55e3755266 100644 --- a/node/network/pov-distribution/src/lib.rs +++ b/node/network/pov-distribution/src/lib.rs @@ -21,7 +21,7 @@ use polkadot_primitives::v1::{Hash, PoV, CandidateDescriptor}; use polkadot_subsystem::{ - OverseerSignal, SubsystemContext, Subsystem, SubsystemResult, FromOverseer, SpawnedSubsystem, + ActiveLeavesUpdate, OverseerSignal, SubsystemContext, Subsystem, SubsystemResult, FromOverseer, SpawnedSubsystem, }; use polkadot_subsystem::messages::{ PoVDistributionMessage, NetworkBridgeEvent, ReputationChange as Rep, PeerId, @@ -107,23 +107,24 @@ async fn handle_signal( ) -> SubsystemResult { match signal { OverseerSignal::Conclude => Ok(true), - OverseerSignal::StartWork(relay_parent) => { - let (vals_tx, vals_rx) = oneshot::channel(); - ctx.send_message(AllMessages::RuntimeApi(RuntimeApiMessage::Request( - relay_parent, - RuntimeApiRequest::Validators(vals_tx), - ))).await?; - - state.relay_parent_state.insert(relay_parent, BlockBasedState { - known: HashMap::new(), - fetching: HashMap::new(), - n_validators: vals_rx.await?.len(), - }); + OverseerSignal::ActiveLeaves(ActiveLeavesUpdate { activated, deactivated }) => { + for relay_parent in activated { + let (vals_tx, vals_rx) = oneshot::channel(); + ctx.send_message(AllMessages::RuntimeApi(RuntimeApiMessage::Request( + relay_parent, + RuntimeApiRequest::Validators(vals_tx), + ))).await?; - Ok(false) - } - OverseerSignal::StopWork(relay_parent) => { - state.relay_parent_state.remove(&relay_parent); + state.relay_parent_state.insert(relay_parent, BlockBasedState { + known: HashMap::new(), + fetching: HashMap::new(), + n_validators: vals_rx.await?.len(), + }); + } + + for relay_parent in deactivated { + state.relay_parent_state.remove(&relay_parent); + } Ok(false) } diff --git a/node/network/statement-distribution/src/lib.rs b/node/network/statement-distribution/src/lib.rs index f57f2745b8..5d9445a920 100644 --- a/node/network/statement-distribution/src/lib.rs +++ b/node/network/statement-distribution/src/lib.rs @@ -21,7 +21,7 @@ use polkadot_subsystem::{ Subsystem, SubsystemResult, SubsystemContext, SpawnedSubsystem, - FromOverseer, OverseerSignal, + ActiveLeavesUpdate, FromOverseer, OverseerSignal, }; use polkadot_subsystem::messages::{ AllMessages, NetworkBridgeMessage, NetworkBridgeEvent, StatementDistributionMessage, @@ -840,30 +840,29 @@ async fn run( loop { let message = ctx.recv().await?; match message { - FromOverseer::Signal(OverseerSignal::StartWork(relay_parent)) => { - let (validators, session_index) = { - let (val_tx, val_rx) = oneshot::channel(); - let (session_tx, session_rx) = oneshot::channel(); + FromOverseer::Signal(OverseerSignal::ActiveLeaves(ActiveLeavesUpdate { activated, .. })) => { + for relay_parent in activated { + let (validators, session_index) = { + let (val_tx, val_rx) = oneshot::channel(); + let (session_tx, session_rx) = oneshot::channel(); + + let val_message = AllMessages::RuntimeApi( + RuntimeApiMessage::Request(relay_parent, RuntimeApiRequest::Validators(val_tx)), + ); + let session_message = AllMessages::RuntimeApi( + RuntimeApiMessage::Request(relay_parent, RuntimeApiRequest::SigningContext(session_tx)), + ); - let val_message = AllMessages::RuntimeApi( - RuntimeApiMessage::Request(relay_parent, RuntimeApiRequest::Validators(val_tx)), - ); - let session_message = AllMessages::RuntimeApi( - RuntimeApiMessage::Request(relay_parent, RuntimeApiRequest::SigningContext(session_tx)), - ); + ctx.send_messages( + std::iter::once(val_message).chain(std::iter::once(session_message)) + ).await?; - ctx.send_messages( - std::iter::once(val_message).chain(std::iter::once(session_message)) - ).await?; + (val_rx.await?, session_rx.await?.session_index) + }; - (val_rx.await?, session_rx.await?.session_index) - }; - - active_heads.entry(relay_parent) - .or_insert(ActiveHeadData::new(validators, session_index)); - } - FromOverseer::Signal(OverseerSignal::StopWork(_relay_parent)) => { - // do nothing - we will handle this when our view changes. + active_heads.entry(relay_parent) + .or_insert(ActiveHeadData::new(validators, session_index)); + } } FromOverseer::Signal(OverseerSignal::Conclude) => break, FromOverseer::Communication { msg } => match msg { diff --git a/node/overseer/src/lib.rs b/node/overseer/src/lib.rs index 6262e65cc4..d7b8b1df6f 100644 --- a/node/overseer/src/lib.rs +++ b/node/overseer/src/lib.rs @@ -83,7 +83,7 @@ use polkadot_subsystem::messages::{ }; pub use polkadot_subsystem::{ Subsystem, SubsystemContext, OverseerSignal, FromOverseer, SubsystemError, SubsystemResult, - SpawnedSubsystem, + SpawnedSubsystem, ActiveLeavesUpdate, }; use polkadot_node_primitives::SpawnNamed; @@ -726,12 +726,15 @@ where /// Run the `Overseer`. pub async fn run(mut self) -> SubsystemResult<()> { let leaves = std::mem::take(&mut self.leaves); + let mut update = ActiveLeavesUpdate::default(); for leaf in leaves.into_iter() { - self.broadcast_signal(OverseerSignal::StartWork(leaf.0)).await?; + update.activated.push(leaf.0); self.active_leaves.insert(leaf); } + self.broadcast_signal(OverseerSignal::ActiveLeaves(update)).await?; + loop { while let Poll::Ready(Some(msg)) = poll!(&mut self.events_rx.next()) { match msg { @@ -775,33 +778,35 @@ where } async fn block_imported(&mut self, block: BlockInfo) -> SubsystemResult<()> { + let mut update = ActiveLeavesUpdate::default(); + if let Some(parent) = self.active_leaves.take(&(block.parent_hash, block.number - 1)) { - self.broadcast_signal(OverseerSignal::StopWork(parent.0)).await?; + update.deactivated.push(parent.0); } if !self.active_leaves.contains(&(block.hash, block.number)) { - self.broadcast_signal(OverseerSignal::StartWork(block.hash)).await?; + update.activated.push(block.hash); self.active_leaves.insert((block.hash, block.number)); } + self.broadcast_signal(OverseerSignal::ActiveLeaves(update)).await?; + Ok(()) } async fn block_finalized(&mut self, block: BlockInfo) -> SubsystemResult<()> { - let mut stop_these = Vec::new(); + let mut update = ActiveLeavesUpdate::default(); self.active_leaves.retain(|(h, n)| { if *n <= block.number { - stop_these.push(*h); + update.deactivated.push(*h); false } else { true } }); - for hash in stop_these.into_iter() { - self.broadcast_signal(OverseerSignal::StopWork(hash)).await? - } + self.broadcast_signal(OverseerSignal::ActiveLeaves(update)).await?; Ok(()) } @@ -1273,11 +1278,15 @@ mod tests { handler.block_imported(third_block).await.unwrap(); let expected_heartbeats = vec![ - OverseerSignal::StartWork(first_block_hash), - OverseerSignal::StopWork(first_block_hash), - OverseerSignal::StartWork(second_block_hash), - OverseerSignal::StopWork(second_block_hash), - OverseerSignal::StartWork(third_block_hash), + OverseerSignal::ActiveLeaves(ActiveLeavesUpdate::start_work(first_block_hash)), + OverseerSignal::ActiveLeaves(ActiveLeavesUpdate { + activated: [second_block_hash].as_ref().into(), + deactivated: [first_block_hash].as_ref().into(), + }), + OverseerSignal::ActiveLeaves(ActiveLeavesUpdate { + activated: [third_block_hash].as_ref().into(), + deactivated: [second_block_hash].as_ref().into(), + }), ]; loop { @@ -1371,10 +1380,14 @@ mod tests { handler.block_finalized(third_block).await.unwrap(); let expected_heartbeats = vec![ - OverseerSignal::StartWork(first_block_hash), - OverseerSignal::StartWork(second_block_hash), - OverseerSignal::StopWork(first_block_hash), - OverseerSignal::StopWork(second_block_hash), + OverseerSignal::ActiveLeaves(ActiveLeavesUpdate { + activated: [first_block_hash, second_block_hash].as_ref().into(), + ..Default::default() + }), + OverseerSignal::ActiveLeaves(ActiveLeavesUpdate { + deactivated: [first_block_hash, second_block_hash].as_ref().into(), + ..Default::default() + }), ]; loop { diff --git a/node/subsystem/Cargo.toml b/node/subsystem/Cargo.toml index 701a197c2f..3befba7f7b 100644 --- a/node/subsystem/Cargo.toml +++ b/node/subsystem/Cargo.toml @@ -19,6 +19,7 @@ polkadot-node-primitives = { path = "../primitives" } polkadot-primitives = { path = "../../primitives" } polkadot-statement-table = { path = "../../statement-table" } sc-network = { git = "https://github.com/paritytech/substrate", branch = "master" } +smallvec = "1.4.1" sp-core = { git = "https://github.com/paritytech/substrate", branch = "master" } streamunordered = "0.5.1" diff --git a/node/subsystem/src/lib.rs b/node/subsystem/src/lib.rs index 430a8418d9..0bdc9ffcf8 100644 --- a/node/subsystem/src/lib.rs +++ b/node/subsystem/src/lib.rs @@ -30,6 +30,7 @@ use futures::future::BoxFuture; use polkadot_primitives::v1::Hash; use async_trait::async_trait; +use smallvec::SmallVec; use crate::messages::AllMessages; @@ -38,13 +39,51 @@ pub mod util; #[cfg(any(test, feature = "test-helpers"))] pub mod test_helpers; +/// How many slots are stack-reserved for active leaves updates +/// +/// If there are fewer than this number of slots, then we've wasted some stack space. +/// If there are greater than this number of slots, then we fall back to a heap vector. +const ACTIVE_LEAVES_SMALLVEC_CAPACITY: usize = 8; + +/// Changes in the set of active leaves: the parachain heads which we care to work on. +/// +/// Note that the activated and deactivated fields indicate deltas, not complete sets. +#[derive(Clone, Debug, Default, Eq)] +pub struct ActiveLeavesUpdate { + /// New relay chain block hashes of interest. + pub activated: SmallVec<[Hash; ACTIVE_LEAVES_SMALLVEC_CAPACITY]>, + /// Relay chain block hashes no longer of interest. + pub deactivated: SmallVec<[Hash; ACTIVE_LEAVES_SMALLVEC_CAPACITY]>, +} + +impl ActiveLeavesUpdate { + /// Create a ActiveLeavesUpdate with a single activated hash + pub fn start_work(hash: Hash) -> Self { + Self { activated: [hash].as_ref().into(), ..Default::default() } + } + + /// Create a ActiveLeavesUpdate with a single deactivated hash + pub fn stop_work(hash: Hash) -> Self { + Self { deactivated: [hash].as_ref().into(), ..Default::default() } + } +} + +impl PartialEq for ActiveLeavesUpdate { + /// Equality for `ActiveLeavesUpdate` doesnt imply bitwise equality. + /// + /// Instead, it means equality when `activated` and `deactivated` are considered as sets. + fn eq(&self, other: &Self) -> bool { + use std::collections::HashSet; + self.activated.iter().collect::>() == other.activated.iter().collect::>() && + self.deactivated.iter().collect::>() == other.deactivated.iter().collect::>() + } +} + /// Signals sent by an overseer to a subsystem. #[derive(PartialEq, Clone, Debug)] pub enum OverseerSignal { - /// `Subsystem` should start working on block-based work, given by the relay-chain block hash. - StartWork(Hash), - /// `Subsystem` should stop working on block-based work specified by the relay-chain block hash. - StopWork(Hash), + /// Subsystems should adjust their jobs to start and stop work on appropriate block hashes. + ActiveLeaves(ActiveLeavesUpdate), /// Conclude the work of the `Overseer` and all `Subsystem`s. Conclude, } diff --git a/node/subsystem/src/util.rs b/node/subsystem/src/util.rs index ee5cf2ded2..d37e46ad05 100644 --- a/node/subsystem/src/util.rs +++ b/node/subsystem/src/util.rs @@ -602,21 +602,25 @@ where err_tx: &mut Option, JobsError)>> ) -> bool { use crate::FromOverseer::{Communication, Signal}; - use crate::OverseerSignal::{Conclude, StartWork, StopWork}; + use crate::ActiveLeavesUpdate; + use crate::OverseerSignal::{Conclude, ActiveLeaves}; match incoming { - Ok(Signal(StartWork(hash))) => { - if let Err(e) = jobs.spawn_job(hash, run_args.clone()) { - log::error!("Failed to spawn a job: {:?}", e); - Self::fwd_err(Some(hash), e.into(), err_tx).await; - return true; + Ok(Signal(ActiveLeaves(ActiveLeavesUpdate { activated, deactivated }))) => { + for hash in activated { + if let Err(e) = jobs.spawn_job(hash, run_args.clone()) { + log::error!("Failed to spawn a job: {:?}", e); + Self::fwd_err(Some(hash), e.into(), err_tx).await; + return true; + } } - } - Ok(Signal(StopWork(hash))) => { - if let Err(e) = jobs.stop_job(hash).await { - log::error!("Failed to stop a job: {:?}", e); - Self::fwd_err(Some(hash), e.into(), err_tx).await; - return true; + + for hash in deactivated { + if let Err(e) = jobs.stop_job(hash).await { + log::error!("Failed to stop a job: {:?}", e); + Self::fwd_err(Some(hash), e.into(), err_tx).await; + return true; + } } } Ok(Signal(Conclude)) => { @@ -725,6 +729,7 @@ mod tests { JobTrait, ToJobTrait, }, + ActiveLeavesUpdate, FromOverseer, OverseerSignal, }; @@ -920,12 +925,12 @@ mod tests { run_args.insert(relay_parent.clone(), vec![FromJob::Test(test_message.clone())]); test_harness(run_args, |mut overseer_handle, err_rx| async move { - overseer_handle.send(FromOverseer::Signal(OverseerSignal::StartWork(relay_parent))).await; + overseer_handle.send(FromOverseer::Signal(OverseerSignal::ActiveLeaves(ActiveLeavesUpdate::start_work(relay_parent)))).await; assert_matches!( overseer_handle.recv().await, AllMessages::Test(msg) if msg == test_message ); - overseer_handle.send(FromOverseer::Signal(OverseerSignal::StopWork(relay_parent))).await; + overseer_handle.send(FromOverseer::Signal(OverseerSignal::ActiveLeaves(ActiveLeavesUpdate::stop_work(relay_parent)))).await; let errs: Vec<_> = err_rx.collect().await; assert_eq!(errs.len(), 0); @@ -938,7 +943,7 @@ mod tests { let run_args = HashMap::new(); test_harness(run_args, |mut overseer_handle, err_rx| async move { - overseer_handle.send(FromOverseer::Signal(OverseerSignal::StopWork(relay_parent))).await; + overseer_handle.send(FromOverseer::Signal(OverseerSignal::ActiveLeaves(ActiveLeavesUpdate::stop_work(relay_parent)))).await; let errs: Vec<_> = err_rx.collect().await; assert_eq!(errs.len(), 1); -- GitLab From 0ea96d1c08632a2861cdfe3e75878c6a9ef44ceb Mon Sep 17 00:00:00 2001 From: joe petrowski <25483142+joepetrowski@users.noreply.github.com> Date: Mon, 27 Jul 2020 12:51:18 +0200 Subject: [PATCH 104/192] update comments (#1445) --- runtime/polkadot/src/lib.rs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/runtime/polkadot/src/lib.rs b/runtime/polkadot/src/lib.rs index 3fc56b172f..195125d578 100644 --- a/runtime/polkadot/src/lib.rs +++ b/runtime/polkadot/src/lib.rs @@ -329,7 +329,7 @@ parameter_types! { pub const SlashDeferDuration: staking::EraIndex = 28; pub const RewardCurve: &'static PiecewiseLinear<'static> = &REWARD_CURVE; pub const MaxNominatorRewardedPerValidator: u32 = 64; - // quarter of the last session will be for election. + // last 15 minutes of the last session will be for election. pub const ElectionLookahead: BlockNumber = EPOCH_DURATION_IN_BLOCKS / 16; pub const MaxIterations: u32 = 10; pub MinSolutionScoreBump: Perbill = Perbill::from_rational_approximation(5u32, 10_000); @@ -1107,8 +1107,7 @@ construct_runtime! { ImOnline: im_online::{Module, Call, Storage, Event, ValidateUnsigned, Config}, AuthorityDiscovery: authority_discovery::{Module, Call, Config}, - // Governance stuff; uncallable initially. Calls should be uncommented once we're ready to - // enable governance. + // Governance stuff. Democracy: democracy::{Module, Call, Storage, Config, Event}, Council: collective::::{Module, Call, Storage, Origin, Event, Config}, TechnicalCommittee: collective::::{Module, Call, Storage, Origin, Event, Config}, -- GitLab From b838b386a04fd378d12e5c0c924336b02800e4ae Mon Sep 17 00:00:00 2001 From: Fedor Sakharov Date: Mon, 27 Jul 2020 14:13:02 +0300 Subject: [PATCH 105/192] Availability store subsystem (#1404) * Initial commit * WIP * Make atomic transactions * Remove pruning code * Fix build and add a Nop to bridge * Fixes from review * Move config struct around for clarity * Rename constructor and warn on missing docs * Fix a test and rename a message * Fix some more reviews * Obviously failed to rebase cleanly --- Cargo.lock | 19 + Cargo.toml | 1 + node/core/av-store/Cargo.toml | 24 + node/core/av-store/src/lib.rs | 553 ++++++++++++++++++ node/core/backing/src/lib.rs | 94 +-- node/core/bitfield-signing/src/lib.rs | 4 +- node/network/bitfield-distribution/src/lib.rs | 3 + node/network/bridge/src/lib.rs | 4 + node/network/pov-distribution/src/lib.rs | 1 + .../network/statement-distribution/src/lib.rs | 3 + node/overseer/src/lib.rs | 3 + node/subsystem/src/lib.rs | 2 + node/subsystem/src/messages.rs | 33 +- node/subsystem/src/util.rs | 3 +- .../src/types/overseer-protocol.md | 11 +- 15 files changed, 701 insertions(+), 57 deletions(-) create mode 100644 node/core/av-store/Cargo.toml create mode 100644 node/core/av-store/src/lib.rs diff --git a/Cargo.lock b/Cargo.lock index 046d2ac453..cfc4f6ed86 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4579,6 +4579,25 @@ dependencies = [ "sp-runtime", ] +[[package]] +name = "polkadot-node-core-av-store" +version = "0.1.0" +dependencies = [ + "assert_matches", + "derive_more 0.99.9", + "futures 0.3.5", + "kvdb", + "kvdb-memorydb", + "kvdb-rocksdb", + "log 0.4.8", + "parity-scale-codec", + "polkadot-erasure-coding", + "polkadot-node-subsystem", + "polkadot-overseer", + "polkadot-primitives", + "sp-core", +] + [[package]] name = "polkadot-node-core-backing" version = "0.1.0" diff --git a/Cargo.toml b/Cargo.toml index a18c98f83d..f595fef855 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -45,6 +45,7 @@ members = [ "node/core/bitfield-signing", "node/core/proposer", + "node/core/av-store", "node/network/bridge", "node/network/pov-distribution", "node/network/statement-distribution", diff --git a/node/core/av-store/Cargo.toml b/node/core/av-store/Cargo.toml new file mode 100644 index 0000000000..e89ef7a6ec --- /dev/null +++ b/node/core/av-store/Cargo.toml @@ -0,0 +1,24 @@ +[package] +name = "polkadot-node-core-av-store" +version = "0.1.0" +authors = ["Parity Technologies "] +edition = "2018" + +[dependencies] +futures = "0.3.5" +polkadot-subsystem = { package = "polkadot-node-subsystem", path = "../../subsystem" } +polkadot-overseer = { path = "../../overseer" } +polkadot-primitives = { path = "../../../primitives" } +erasure = { package = "polkadot-erasure-coding", path = "../../../erasure-coding" } +kvdb = "0.7.0" +kvdb-rocksdb = "0.9.0" +codec = { package = "parity-scale-codec", version = "1.3.1", features = ["derive"] } +log = "0.4.8" +derive_more = "0.99.9" + +[dev-dependencies] +sp-core = { git = "https://github.com/paritytech/substrate", branch = "master" } +futures = { version = "0.3.5", features = ["thread-pool"] } +polkadot-subsystem = { package = "polkadot-node-subsystem", path = "../../subsystem", features = [ "test-helpers" ] } +kvdb-memorydb = "0.7.0" +assert_matches = "1.3.0" diff --git a/node/core/av-store/src/lib.rs b/node/core/av-store/src/lib.rs new file mode 100644 index 0000000000..386ff99f27 --- /dev/null +++ b/node/core/av-store/src/lib.rs @@ -0,0 +1,553 @@ +// Copyright 2020 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 . + +//! Implements a `AvailabilityStoreSubsystem`. + +#![recursion_limit="256"] +#![warn(missing_docs)] + +use std::collections::HashMap; +use std::io; +use std::path::PathBuf; +use std::sync::Arc; + +use codec::{Encode, Decode}; +use futures::{select, channel::oneshot, FutureExt}; +use kvdb_rocksdb::{Database, DatabaseConfig}; +use kvdb::{KeyValueDB, DBTransaction}; + +use polkadot_primitives::v1::{ + Hash, AvailableData, ErasureChunk, ValidatorIndex, +}; +use polkadot_subsystem::{ + FromOverseer, SubsystemError, Subsystem, SubsystemContext, SpawnedSubsystem, +}; +use polkadot_subsystem::messages::AvailabilityStoreMessage; + +const LOG_TARGET: &str = "availability"; + +mod columns { + pub const DATA: u32 = 0; + pub const NUM_COLUMNS: u32 = 1; +} + +#[derive(Debug, derive_more::From)] +enum Error { + #[from] + Erasure(erasure::Error), + #[from] + Io(io::Error), + #[from] + Oneshot(oneshot::Canceled), + #[from] + Subsystem(SubsystemError), +} + +/// An implementation of the Availability Store subsystem. +pub struct AvailabilityStoreSubsystem { + inner: Arc, +} + +fn available_data_key(candidate_hash: &Hash) -> Vec { + (candidate_hash, 0i8).encode() +} + +fn erasure_chunk_key(candidate_hash: &Hash, index: u32) -> Vec { + (candidate_hash, index, 0i8).encode() +} + +#[derive(Encode, Decode)] +struct StoredAvailableData { + data: AvailableData, + n_validators: u32, +} + +/// Configuration for the availability store. +pub struct Config { + /// Total cache size in megabytes. If `None` the default (128 MiB per column) is used. + pub cache_size: Option, + /// Path to the database. + pub path: PathBuf, +} + +impl AvailabilityStoreSubsystem { + /// Create a new `AvailabilityStoreSubsystem` with a given config on disk. + pub fn new_on_disk(config: Config) -> io::Result { + let mut db_config = DatabaseConfig::with_columns(columns::NUM_COLUMNS); + + if let Some(cache_size) = config.cache_size { + let mut memory_budget = HashMap::new(); + + for i in 0..columns::NUM_COLUMNS { + memory_budget.insert(i, cache_size / columns::NUM_COLUMNS as usize); + } + db_config.memory_budget = memory_budget; + } + + 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)?; + + Ok(Self { + inner: Arc::new(db), + }) + } + + #[cfg(test)] + fn new_in_memory(inner: Arc) -> Self { + Self { + inner, + } + } +} + +async fn run(subsystem: AvailabilityStoreSubsystem, mut ctx: Context) + -> Result<(), Error> +where + Context: SubsystemContext, +{ + let ctx = &mut ctx; + loop { + select! { + incoming = ctx.recv().fuse() => { + match incoming { + Ok(FromOverseer::Signal(Conclude)) => break, + Ok(FromOverseer::Signal(_)) => (), + Ok(FromOverseer::Communication { msg }) => { + process_message(&subsystem.inner, msg)?; + } + Err(_) => break, + } + } + complete => break, + } + } + + Ok(()) +} + +fn process_message(db: &Arc, msg: AvailabilityStoreMessage) -> Result<(), Error> { + use AvailabilityStoreMessage::*; + match msg { + QueryAvailableData(hash, tx) => { + tx.send(available_data(db, &hash).map(|d| d.data)).map_err(|_| oneshot::Canceled)?; + } + QueryDataAvailability(hash, tx) => { + let result = match available_data(db, &hash) { + Some(_) => true, + None => false, + }; + + tx.send(result).map_err(|_| oneshot::Canceled)?; + } + QueryChunk(hash, id, tx) => { + tx.send(get_chunk(db, &hash, id)?).map_err(|_| oneshot::Canceled)?; + } + StoreChunk(hash, id, chunk, tx) => { + match store_chunk(db, &hash, id, chunk) { + Err(e) => { + tx.send(Err(())).map_err(|_| oneshot::Canceled)?; + return Err(e); + } + Ok(()) => { + tx.send(Ok(())).map_err(|_| oneshot::Canceled)?; + } + } + } + StoreAvailableData(hash, id, n_validators, av_data, tx) => { + match store_available_data(db, &hash, id, n_validators, av_data) { + Err(e) => { + tx.send(Err(())).map_err(|_| oneshot::Canceled)?; + return Err(e); + } + Ok(()) => { + tx.send(Ok(())).map_err(|_| oneshot::Canceled)?; + } + } + } + } + + Ok(()) +} + +fn available_data(db: &Arc, candidate_hash: &Hash) -> Option { + query_inner(db, columns::DATA, &available_data_key(candidate_hash)) +} + +fn store_available_data( + db: &Arc, + candidate_hash: &Hash, + id: Option, + n_validators: u32, + available_data: AvailableData, +) -> Result<(), Error> { + let mut tx = DBTransaction::new(); + + if let Some(index) = id { + let chunks = get_chunks(&available_data, n_validators as usize)?; + store_chunk(db, candidate_hash, n_validators, chunks[index as usize].clone())?; + } + + let stored_data = StoredAvailableData { + data: available_data, + n_validators, + }; + + tx.put_vec( + columns::DATA, + available_data_key(&candidate_hash).as_slice(), + stored_data.encode(), + ); + + db.write(tx)?; + + Ok(()) +} + +fn store_chunk(db: &Arc, candidate_hash: &Hash, _n_validators: u32, chunk: ErasureChunk) + -> Result<(), Error> +{ + let mut tx = DBTransaction::new(); + + let dbkey = erasure_chunk_key(candidate_hash, chunk.index); + + tx.put_vec(columns::DATA, &dbkey, chunk.encode()); + db.write(tx)?; + + Ok(()) +} + +fn get_chunk(db: &Arc, candidate_hash: &Hash, index: u32) + -> Result, Error> +{ + if let Some(chunk) = query_inner( + db, + columns::DATA, + &erasure_chunk_key(candidate_hash, index)) { + return Ok(Some(chunk)); + } + + if let Some(data) = available_data(db, candidate_hash) { + let mut chunks = get_chunks(&data.data, data.n_validators as usize)?; + let desired_chunk = chunks.get(index as usize).cloned(); + for chunk in chunks.drain(..) { + store_chunk(db, candidate_hash, data.n_validators, chunk)?; + } + return Ok(desired_chunk); + } + + Ok(None) +} + +fn query_inner(db: &Arc, column: u32, key: &[u8]) -> Option { + match db.get(column, key) { + Ok(Some(raw)) => { + let res = D::decode(&mut &raw[..]).expect("all stored data serialized correctly; qed"); + Some(res) + } + Ok(None) => None, + Err(e) => { + log::warn!(target: LOG_TARGET, "Error reading from the availability store: {:?}", e); + None + } + } +} + +impl Subsystem for AvailabilityStoreSubsystem + where + Context: SubsystemContext, +{ + fn start(self, ctx: Context) -> SpawnedSubsystem { + let future = Box::pin(async move { + if let Err(e) = run(self, ctx).await { + log::error!(target: "availabilitystore", "Subsystem exited with an error {:?}", e); + } + }); + + SpawnedSubsystem { + name: "availability-store-subsystem", + future, + } + } +} + +fn get_chunks(data: &AvailableData, n_validators: usize) -> Result, Error> { + let chunks = erasure::obtain_chunks_v1(n_validators, data)?; + let branches = erasure::branches(chunks.as_ref()); + + Ok(chunks + .iter() + .zip(branches.map(|(proof, _)| proof)) + .enumerate() + .map(|(index, (chunk, proof))| ErasureChunk { + chunk: chunk.clone(), + proof, + index: index as u32, + }) + .collect() + ) +} + +#[cfg(test)] +mod tests { + use super::*; + use futures::{ + future, + channel::oneshot, + executor, + Future, + }; + use std::cell::RefCell; + use polkadot_primitives::v1::{ + AvailableData, BlockData, HeadData, GlobalValidationData, LocalValidationData, PoV, + OmittedValidationData, + }; + use polkadot_subsystem::test_helpers; + + struct TestHarness { + virtual_overseer: test_helpers::TestSubsystemContextHandle, + } + + thread_local! { + static TIME_NOW: RefCell> = RefCell::new(None); + } + + struct TestState { + global_validation_schedule: GlobalValidationData, + local_validation_data: LocalValidationData, + } + + impl Default for TestState { + fn default() -> Self { + + let local_validation_data = LocalValidationData { + parent_head: HeadData(vec![7, 8, 9]), + balance: Default::default(), + code_upgrade_allowed: None, + validation_code_hash: Default::default(), + }; + + let global_validation_schedule = GlobalValidationData { + max_code_size: 1000, + max_head_data_size: 1000, + block_number: Default::default(), + }; + + Self { + local_validation_data, + global_validation_schedule, + } + } + } + + fn test_harness>( + store: Arc, + test: impl FnOnce(TestHarness) -> T, + ) { + let pool = sp_core::testing::TaskExecutor::new(); + let (context, virtual_overseer) = test_helpers::make_subsystem_context(pool.clone()); + + let subsystem = AvailabilityStoreSubsystem::new_in_memory(store); + let subsystem = run(subsystem, context); + + let test_fut = test(TestHarness { + virtual_overseer, + }); + + futures::pin_mut!(test_fut); + futures::pin_mut!(subsystem); + + executor::block_on(future::select(test_fut, subsystem)); + } + + #[test] + fn store_chunk_works() { + let store = Arc::new(kvdb_memorydb::create(columns::NUM_COLUMNS)); + test_harness(store.clone(), |test_harness| async move { + let TestHarness { mut virtual_overseer } = test_harness; + let relay_parent = Hash::from([1; 32]); + let validator_index = 5; + + let chunk = ErasureChunk { + chunk: vec![1, 2, 3], + index: validator_index, + proof: vec![vec![3, 4, 5]], + }; + + let (tx, rx) = oneshot::channel(); + + let chunk_msg = AvailabilityStoreMessage::StoreChunk( + relay_parent, + validator_index, + chunk.clone(), + tx, + ); + + virtual_overseer.send(FromOverseer::Communication{ msg: chunk_msg }).await; + assert_eq!(rx.await.unwrap(), Ok(())); + + let (tx, rx) = oneshot::channel(); + let query_chunk = AvailabilityStoreMessage::QueryChunk( + relay_parent, + validator_index, + tx, + ); + + virtual_overseer.send(FromOverseer::Communication{ msg: query_chunk }).await; + + assert_eq!(rx.await.unwrap().unwrap(), chunk); + }); + } + + #[test] + fn store_block_works() { + let store = Arc::new(kvdb_memorydb::create(columns::NUM_COLUMNS)); + let test_state = TestState::default(); + test_harness(store.clone(), |test_harness| async move { + let TestHarness { mut virtual_overseer } = test_harness; + let candidate_hash = Hash::from([1; 32]); + let validator_index = 5; + let n_validators = 10; + + let pov = PoV { + block_data: BlockData(vec![4, 5, 6]), + }; + + let global_validation = test_state.global_validation_schedule; + let local_validation = test_state.local_validation_data; + + let omitted_validation = OmittedValidationData { + global_validation, + local_validation, + }; + + let available_data = AvailableData { + pov, + omitted_validation, + }; + + + let (tx, rx) = oneshot::channel(); + let block_msg = AvailabilityStoreMessage::StoreAvailableData( + candidate_hash, + Some(validator_index), + n_validators, + available_data.clone(), + tx, + ); + + virtual_overseer.send(FromOverseer::Communication{ msg: block_msg }).await; + assert_eq!(rx.await.unwrap(), Ok(())); + + let pov = query_available_data(&mut virtual_overseer, candidate_hash).await.unwrap(); + assert_eq!(pov, available_data); + + let chunk = query_chunk(&mut virtual_overseer, candidate_hash, validator_index).await.unwrap(); + + let chunks = erasure::obtain_chunks_v1(10, &available_data).unwrap(); + + let mut branches = erasure::branches(chunks.as_ref()); + + let branch = branches.nth(5).unwrap(); + let expected_chunk = ErasureChunk { + chunk: branch.1.to_vec(), + index: 5, + proof: branch.0, + }; + + assert_eq!(chunk, expected_chunk); + }); + } + + + #[test] + fn store_pov_and_query_chunk_works() { + let store = Arc::new(kvdb_memorydb::create(columns::NUM_COLUMNS)); + let test_state = TestState::default(); + + test_harness(store.clone(), |test_harness| async move { + let TestHarness { mut virtual_overseer } = test_harness; + let candidate_hash = Hash::from([1; 32]); + let n_validators = 10; + + let pov = PoV { + block_data: BlockData(vec![4, 5, 6]), + }; + + let global_validation = test_state.global_validation_schedule; + let local_validation = test_state.local_validation_data; + + let omitted_validation = OmittedValidationData { + global_validation, + local_validation, + }; + + let available_data = AvailableData { + pov, + omitted_validation, + }; + + let chunks_expected = get_chunks(&available_data, n_validators as usize).unwrap(); + + let (tx, rx) = oneshot::channel(); + let block_msg = AvailabilityStoreMessage::StoreAvailableData( + candidate_hash, + None, + n_validators, + available_data, + tx, + ); + + virtual_overseer.send(FromOverseer::Communication{ msg: block_msg }).await; + + assert_eq!(rx.await.unwrap(), Ok(())); + + for validator_index in 0..n_validators { + let chunk = query_chunk(&mut virtual_overseer, candidate_hash, validator_index).await.unwrap(); + + assert_eq!(chunk, chunks_expected[validator_index as usize]); + } + }); + } + + async fn query_available_data( + virtual_overseer: &mut test_helpers::TestSubsystemContextHandle, + candidate_hash: Hash, + ) -> Option { + let (tx, rx) = oneshot::channel(); + + let query = AvailabilityStoreMessage::QueryAvailableData(candidate_hash, tx); + virtual_overseer.send(FromOverseer::Communication{ msg: query }).await; + + rx.await.unwrap() + } + + async fn query_chunk( + virtual_overseer: &mut test_helpers::TestSubsystemContextHandle, + candidate_hash: Hash, + index: u32, + ) -> Option { + let (tx, rx) = oneshot::channel(); + + let query = AvailabilityStoreMessage::QueryChunk(candidate_hash, index, tx); + virtual_overseer.send(FromOverseer::Communication{ msg: query }).await; + + rx.await.unwrap() + } +} diff --git a/node/core/backing/src/lib.rs b/node/core/backing/src/lib.rs index 89da1716dc..837bcac767 100644 --- a/node/core/backing/src/lib.rs +++ b/node/core/backing/src/lib.rs @@ -31,7 +31,7 @@ use keystore::KeyStorePtr; use polkadot_primitives::v1::{ CommittedCandidateReceipt, BackedCandidate, Id as ParaId, ValidatorId, ValidatorIndex, SigningContext, PoV, OmittedValidationData, - CandidateDescriptor, AvailableData, ErasureChunk, ValidatorSignature, Hash, CandidateReceipt, + CandidateDescriptor, AvailableData, ValidatorSignature, Hash, CandidateReceipt, CandidateCommitments, }; use polkadot_node_primitives::{ @@ -67,6 +67,7 @@ use statement_table::{ enum Error { CandidateNotFound, InvalidSignature, + StoreFailed, #[from] Erasure(erasure_coding::Error), #[from] @@ -581,20 +582,30 @@ impl CandidateBackingJob { Ok(rx.await??) } - async fn store_chunk( + async fn store_available_data( &mut self, - id: ValidatorIndex, - chunk: ErasureChunk, + id: Option, + n_validators: u32, + available_data: AvailableData, ) -> Result<(), Error> { + let (tx, rx) = oneshot::channel(); self.tx_from.send(FromJob::AvailabilityStore( - AvailabilityStoreMessage::StoreChunk(self.parent, id, chunk) + AvailabilityStoreMessage::StoreAvailableData( + self.parent, + id, + n_validators, + available_data, + tx, + ) ) ).await?; + rx.await?.map_err(|_| Error::StoreFailed)?; + Ok(()) } - // Compute the erasure-coding and make it available. + // Make a `PoV` available. // // This calls an inspection function before making the PoV available for any last checks // that need to be done. If the inspection function returns an error, this function returns @@ -636,15 +647,11 @@ impl CandidateBackingJob { Err(e) => return Ok(Err(e)), }; - for (index, (proof, chunk)) in branches.enumerate() { - let chunk = ErasureChunk { - chunk: chunk.to_vec(), - index: index as u32, - proof, - }; - - self.store_chunk(index as ValidatorIndex, chunk).await?; - } + self.store_available_data( + self.table_context.validator.as_ref().map(|v| v.index()), + self.table_context.validators.len() as u32, + available_data, + ).await?; Ok(Ok(res)) } @@ -1059,14 +1066,14 @@ mod tests { } ); - for _ in 0..test_state.validators.len() { - assert_matches!( - virtual_overseer.recv().await, - AllMessages::AvailabilityStore( - AvailabilityStoreMessage::StoreChunk(parent_hash, _, _) - ) if parent_hash == test_state.relay_parent - ); - } + assert_matches!( + virtual_overseer.recv().await, + AllMessages::AvailabilityStore( + AvailabilityStoreMessage::StoreAvailableData(parent_hash, _, _, _, tx) + ) if parent_hash == test_state.relay_parent => { + tx.send(Ok(())).unwrap(); + } + ); assert_matches!( virtual_overseer.recv().await, @@ -1171,6 +1178,15 @@ mod tests { } ); + assert_matches!( + virtual_overseer.recv().await, + AllMessages::AvailabilityStore( + AvailabilityStoreMessage::StoreAvailableData(parent_hash, _, _, _, tx) + ) if parent_hash == test_state.relay_parent => { + tx.send(Ok(())).unwrap(); + } + ); + let statement = CandidateBackingMessage::Statement( test_state.relay_parent, signed_b.clone(), @@ -1292,14 +1308,14 @@ mod tests { } ); - for _ in 0..test_state.validators.len() { - assert_matches!( - virtual_overseer.recv().await, - AllMessages::AvailabilityStore( - AvailabilityStoreMessage::StoreChunk(parent_hash, _, _) - ) if parent_hash == test_state.relay_parent - ); - } + assert_matches!( + virtual_overseer.recv().await, + AllMessages::AvailabilityStore( + AvailabilityStoreMessage::StoreAvailableData(parent_hash, _, _, _, tx) + ) if parent_hash == test_state.relay_parent => { + tx.send(Ok(())).unwrap(); + } + ); assert_matches!( virtual_overseer.recv().await, @@ -1449,14 +1465,14 @@ mod tests { } ); - for _ in 0..test_state.validators.len() { - assert_matches!( - virtual_overseer.recv().await, - AllMessages::AvailabilityStore( - AvailabilityStoreMessage::StoreChunk(parent_hash, _, _) - ) if parent_hash == test_state.relay_parent - ); - } + assert_matches!( + virtual_overseer.recv().await, + AllMessages::AvailabilityStore( + AvailabilityStoreMessage::StoreAvailableData(parent_hash, _, _, _, tx) + ) if parent_hash == test_state.relay_parent => { + tx.send(Ok(())).unwrap(); + } + ); assert_matches!( virtual_overseer.recv().await, diff --git a/node/core/bitfield-signing/src/lib.rs b/node/core/bitfield-signing/src/lib.rs index b973f4b3ae..806e3c1418 100644 --- a/node/core/bitfield-signing/src/lib.rs +++ b/node/core/bitfield-signing/src/lib.rs @@ -135,7 +135,7 @@ async fn get_core_availability( sender: &mpsc::Sender, ) -> Result { use messages::{ - AvailabilityStoreMessage::QueryPoVAvailable, + AvailabilityStoreMessage::QueryDataAvailability, RuntimeApiRequest::CandidatePendingAvailability, }; use FromJob::{AvailabilityStore, RuntimeApi}; @@ -159,7 +159,7 @@ async fn get_core_availability( }; let (tx, rx) = oneshot::channel(); sender - .send(AvailabilityStore(QueryPoVAvailable( + .send(AvailabilityStore(QueryDataAvailability( committed_candidate_receipt.descriptor.pov_hash, tx, ))) diff --git a/node/network/bitfield-distribution/src/lib.rs b/node/network/bitfield-distribution/src/lib.rs index 9517504c1f..11c9563cb0 100644 --- a/node/network/bitfield-distribution/src/lib.rs +++ b/node/network/bitfield-distribution/src/lib.rs @@ -179,6 +179,9 @@ impl BitfieldDistribution { // defer the cleanup to the view change } } + FromOverseer::Signal(OverseerSignal::BlockFinalized(hash)) => { + trace!(target: "bitd", "Block finalized {:?}", hash); + } FromOverseer::Signal(OverseerSignal::Conclude) => { trace!(target: "bitd", "Conclude"); return Ok(()); diff --git a/node/network/bridge/src/lib.rs b/node/network/bridge/src/lib.rs index a1f5694568..56117732f9 100644 --- a/node/network/bridge/src/lib.rs +++ b/node/network/bridge/src/lib.rs @@ -213,6 +213,7 @@ enum Action { PeerMessages(PeerId, Vec), Abort, + Nop, } fn action_from_overseer_message( @@ -229,6 +230,8 @@ fn action_from_overseer_message( NetworkBridgeMessage::SendMessage(peers, protocol, message) => Action::SendMessage(peers, protocol, message), }, + Ok(FromOverseer::Signal(OverseerSignal::BlockFinalized(_))) + => Action::Nop, Err(e) => { log::warn!(target: TARGET, "Shutting down Network Bridge due to error {:?}", e); Action::Abort @@ -502,6 +505,7 @@ async fn run_network( }, Action::Abort => return Ok(()), + Action::Nop => (), } } } diff --git a/node/network/pov-distribution/src/lib.rs b/node/network/pov-distribution/src/lib.rs index 55e3755266..24f14df3b0 100644 --- a/node/network/pov-distribution/src/lib.rs +++ b/node/network/pov-distribution/src/lib.rs @@ -128,6 +128,7 @@ async fn handle_signal( Ok(false) } + OverseerSignal::BlockFinalized(_) => Ok(false), } } diff --git a/node/network/statement-distribution/src/lib.rs b/node/network/statement-distribution/src/lib.rs index 5d9445a920..86a3efbe91 100644 --- a/node/network/statement-distribution/src/lib.rs +++ b/node/network/statement-distribution/src/lib.rs @@ -864,6 +864,9 @@ async fn run( .or_insert(ActiveHeadData::new(validators, session_index)); } } + FromOverseer::Signal(OverseerSignal::BlockFinalized(_block_hash)) => { + // do nothing + } FromOverseer::Signal(OverseerSignal::Conclude) => break, FromOverseer::Communication { msg } => match msg { StatementDistributionMessage::Share(relay_parent, statement) => diff --git a/node/overseer/src/lib.rs b/node/overseer/src/lib.rs index d7b8b1df6f..9aa3468c0d 100644 --- a/node/overseer/src/lib.rs +++ b/node/overseer/src/lib.rs @@ -808,6 +808,8 @@ where self.broadcast_signal(OverseerSignal::ActiveLeaves(update)).await?; + self.broadcast_signal(OverseerSignal::BlockFinalized(block.hash)).await?; + Ok(()) } @@ -1388,6 +1390,7 @@ mod tests { deactivated: [first_block_hash, second_block_hash].as_ref().into(), ..Default::default() }), + OverseerSignal::BlockFinalized(third_block_hash), ]; loop { diff --git a/node/subsystem/src/lib.rs b/node/subsystem/src/lib.rs index 0bdc9ffcf8..6ed552a3f5 100644 --- a/node/subsystem/src/lib.rs +++ b/node/subsystem/src/lib.rs @@ -84,6 +84,8 @@ impl PartialEq for ActiveLeavesUpdate { pub enum OverseerSignal { /// Subsystems should adjust their jobs to start and stop work on appropriate block hashes. ActiveLeaves(ActiveLeavesUpdate), + /// `Subsystem` is informed of a finalized block by its block hash. + BlockFinalized(Hash), /// Conclude the work of the `Overseer` and all `Subsystem`s. Conclude, } diff --git a/node/subsystem/src/messages.rs b/node/subsystem/src/messages.rs index a2f0bf8bbc..710ba77ce9 100644 --- a/node/subsystem/src/messages.rs +++ b/node/subsystem/src/messages.rs @@ -25,11 +25,11 @@ use futures::channel::{mpsc, oneshot}; use polkadot_primitives::v1::{ - BlockNumber, Hash, - CandidateReceipt, CommittedCandidateReceipt, PoV, ErasureChunk, BackedCandidate, Id as ParaId, + BlockNumber, Hash, CommittedCandidateReceipt, + CandidateReceipt, PoV, ErasureChunk, BackedCandidate, Id as ParaId, SignedAvailabilityBitfield, SigningContext, ValidatorId, ValidationCode, ValidatorIndex, CoreAssignment, CoreOccupied, HeadData, CandidateDescriptor, - ValidatorSignature, OmittedValidationData, + ValidatorSignature, OmittedValidationData, AvailableData, }; use polkadot_node_primitives::{ MisbehaviorReport, SignedFullStatement, View, ProtocolId, ValidationResult, @@ -235,31 +235,40 @@ impl BitfieldSigningMessage { /// Availability store subsystem message. #[derive(Debug)] pub enum AvailabilityStoreMessage { - /// Query a `PoV` from the AV store. - QueryPoV(Hash, oneshot::Sender>), + /// Query a `AvailableData` from the AV store. + QueryAvailableData(Hash, oneshot::Sender>), - /// Query whether a `PoV` exists within the AV Store. + /// Query whether a `AvailableData` exists within the AV Store. /// /// This is useful in cases like bitfield signing, when existence /// matters, but we don't want to necessarily pass around multiple /// megabytes of data to get a single bit of information. - QueryPoVAvailable(Hash, oneshot::Sender), + QueryDataAvailability(Hash, oneshot::Sender), /// Query an `ErasureChunk` from the AV store. - QueryChunk(Hash, ValidatorIndex, oneshot::Sender), + QueryChunk(Hash, ValidatorIndex, oneshot::Sender>), /// Store an `ErasureChunk` in the AV store. - StoreChunk(Hash, ValidatorIndex, ErasureChunk), + /// + /// Return `Ok(())` if the store operation succeeded, `Err(())` if it failed. + StoreChunk(Hash, ValidatorIndex, ErasureChunk, oneshot::Sender>), + + /// Store a `AvailableData` in the AV store. + /// If `ValidatorIndex` is present store corresponding chunk also. + /// + /// Return `Ok(())` if the store operation succeeded, `Err(())` if it failed. + StoreAvailableData(Hash, Option, u32, AvailableData, oneshot::Sender>), } impl AvailabilityStoreMessage { /// If the current variant contains the relay parent hash, return it. pub fn relay_parent(&self) -> Option { match self { - Self::QueryPoV(hash, _) => Some(*hash), - Self::QueryPoVAvailable(hash, _) => Some(*hash), + Self::QueryAvailableData(hash, _) => Some(*hash), + Self::QueryDataAvailability(hash, _) => Some(*hash), Self::QueryChunk(hash, _, _) => Some(*hash), - Self::StoreChunk(hash, _, _) => Some(*hash), + Self::StoreChunk(hash, _, _, _) => Some(*hash), + Self::StoreAvailableData(hash, _, _, _, _) => Some(*hash), } } } diff --git a/node/subsystem/src/util.rs b/node/subsystem/src/util.rs index d37e46ad05..ced6b21bd9 100644 --- a/node/subsystem/src/util.rs +++ b/node/subsystem/src/util.rs @@ -603,7 +603,7 @@ where ) -> bool { use crate::FromOverseer::{Communication, Signal}; use crate::ActiveLeavesUpdate; - use crate::OverseerSignal::{Conclude, ActiveLeaves}; + use crate::OverseerSignal::{BlockFinalized, Conclude, ActiveLeaves}; match incoming { Ok(Signal(ActiveLeaves(ActiveLeavesUpdate { activated, deactivated }))) => { @@ -667,6 +667,7 @@ where } } } + Ok(Signal(BlockFinalized(_))) => {} Err(err) => { log::error!("error receiving message from subsystem context: {:?}", err); Self::fwd_err(None, Error::from(err).into(), err_tx).await; diff --git a/roadmap/implementers-guide/src/types/overseer-protocol.md b/roadmap/implementers-guide/src/types/overseer-protocol.md index d777460176..d6d62fbdaf 100644 --- a/roadmap/implementers-guide/src/types/overseer-protocol.md +++ b/roadmap/implementers-guide/src/types/overseer-protocol.md @@ -59,14 +59,19 @@ Messages to and from the availability store. ```rust enum AvailabilityStoreMessage { - /// Query the PoV of a candidate by hash. - QueryPoV(Hash, ResponseChannel), + /// Query the `AvailableData` of a candidate by hash. + QueryAvailableData(Hash, ResponseChannel), + /// Query whether an `AvailableData` exists within the AV Store. + QueryDataAvailability(Hash, ResponseChannel), /// Query a specific availability chunk of the candidate's erasure-coding by validator index. /// Returns the chunk and its inclusion proof against the candidate's erasure-root. QueryChunk(Hash, ValidatorIndex, ResponseChannel), /// Store a specific chunk of the candidate's erasure-coding by validator index, with an /// accompanying proof. - StoreChunk(Hash, ValidatorIndex, AvailabilityChunkAndProof), + StoreChunk(Hash, ValidatorIndex, AvailabilityChunkAndProof, ResponseChannel>), + /// Store `AvailableData`. If `ValidatorIndex` is provided, also store this validator's + /// `AvailabilityChunkAndProof`. + StoreAvailableData(Hash, Option, u32, AvailableData, ResponseChannel>), } ``` -- GitLab From 677b28bccc8873a67627f1513d88be561b18dd4e Mon Sep 17 00:00:00 2001 From: Fedor Sakharov Date: Mon, 27 Jul 2020 18:12:31 +0300 Subject: [PATCH 106/192] Availability store subsystem guide (#1424) * Improve AVStore and Scheduler docs * Update roadmap/implementers-guide/src/node/utility/availability-store.md Co-authored-by: Peter Goodspeed-Niklaus * Bug in linking to README.md * Update against new runtime apis Co-authored-by: Peter Goodspeed-Niklaus --- .../src/node/utility/availability-store.md | 154 +++++++++++++++++- .../src/runtime/scheduler.md | 90 +++++----- .../src/types/overseer-protocol.md | 4 +- 3 files changed, 206 insertions(+), 42 deletions(-) diff --git a/roadmap/implementers-guide/src/node/utility/availability-store.md b/roadmap/implementers-guide/src/node/utility/availability-store.md index 51e8f8bb21..f8d6f1b67a 100644 --- a/roadmap/implementers-guide/src/node/utility/availability-store.md +++ b/roadmap/implementers-guide/src/node/utility/availability-store.md @@ -23,9 +23,54 @@ There is also the case where a validator commits to make a PoV available, but th There may be multiple competing blocks all ending the availability phase for a particular candidate. Until (and slightly beyond) finality, it will be unclear which of those is actually the canonical chain, so the pruning records for PoVs and Availability chunks should keep track of all such blocks. +## Lifetime of the PoV in the storage + +```dot process +digraph { + label = "Block life FSM\n\n\n"; + labelloc = "t"; + rankdir="LR"; + + st [label = "Stored"; shape = circle] + inc [label = "Included"; shape = circle] + fin [label = "Finalized"; shape = circle] + prn [label = "Pruned"; shape = circle] + + st -> inc [label = "Block\nincluded"] + st -> prn [label = "Stored block\ntimed out"] + inc -> fin [label = "Block\nfinalized"] + fin -> prn [label = "Block keep time\n(1 day) elapsed"] +} +``` + +## Lifetime of the chunk in the storage + +```dot process +digraph { + label = "Chunk life FSM\n\n\n"; + labelloc = "t"; + rankdir="LR"; + + chst [label = "Chunk\nStored"; shape = circle] + st [label = "Block\nStored"; shape = circle] + inc [label = "Included"; shape = circle] + fin [label = "Finalized"; shape = circle] + prn [label = "Pruned"; shape = circle] + + chst -> inc [label = "Block\nincluded"] + st -> inc [label = "Block\nincluded"] + st -> prn [label = "Stored block\ntimed out"] + inc -> fin [label = "Block\nfinalized"] + fin -> prn [label = "Block keep time\n(1 day + 1 hour) elapsed"] +} +``` + ## Protocol -Input: [`AvailabilityStoreMessage`](../../types/overseer-protocol.md#availability-store-message) +Input: [`AvailabilityStoreMessage`][ASM] + +Output: +- [`RuntimeApiMessage`][RAM] ## Functionality @@ -35,9 +80,8 @@ For each head in the `activated` list: - Note any new candidates backed in the block. Update pruning records for any stored `PoVBlock`s. - Note any newly-included candidates backed in the block. Update pruning records for any stored availability chunks. -On block finality events: +On `OverseerSignal::BlockFinalized(_)` events: -- > TODO: figure out how we get block finality events from overseer - Handle all pruning based on the newly-finalized block. On `QueryPoV` message: @@ -51,3 +95,107 @@ On `QueryChunk` message: On `StoreChunk` message: - Store the chunk along with its inclusion proof under the candidate hash and validator index. + +On `StorePoV` message: + +- Store the block, if the validator index is provided, store the respective chunk as well. + +On finality event: + +- For the finalized block and any earlier block (if any) update pruning records of `PoV`s and chunks to keep them for respective periods after finality. + +### Note any backed, included and timedout candidates in the block by `hash`. + +- Create a `(sender, receiver)` pair. +- Dispatch a [`RuntimeApiMessage`][RAM]`::Request(hash, RuntimeApiRequest::CandidateEvents(sender)` and listen on the receiver for a response. +- For every event in the response:`CandidateEvent::CandidateIncluded`. + * For every `CandidateEvent::CandidateBacked` do nothing + * For every `CandidateEvent::CandidateIncluded` update pruning records of any blocks that the node stored previously. + * For every `CandidateEvent::CandidateTimedOut` use pruning records to prune the data; delete the info from records. + +## Schema + +### PoV pruning + +We keep a record about every PoV we keep, tracking its state and the time after which this PoV should be pruned. + +As the state of the `Candidate` changes, so does the `Prune At` time according to the rules defined earlier. + +| Record 1 | .. | Record N | +|----------------|----|----------------| +| CandidateHash1 | .. | CandidateHashN | +| Prune At | .. | Prune At | +| CandidateState | .. | CandidateState | + +### Chunk pruning + +Chunk pruning is organized in a similar schema as PoV pruning. + +| Record 1 | .. | Record N | +|----------------|----|----------------| +| CandidateHash1 | .. | CandidateHashN | +| Prune At | .. | Prune At | +| CandidateState | .. | CandidateState | + +### Included blocks caching + +In order to process finality events correctly we need to cache the set of parablocks included into each relay block beginning with the last finalized block and up to the most recent heads. We have to cache this data since we are only able to query this info from the state for the `k` last blocks where `k` is a relatively small number (for more info see `Assumptions`) + +These are used to update Chunk pruning and PoV pruning records upon finality: +When another block finality notification is received: + - For any record older than this block: + - Update pruning + - Remove the record + +| Relay Block N | .. | Chain Head 1 | Chain Head 2 | +|---------------|----|--------------|--------------| +| CandidateN_1 Included | .. | Candidate1_1 Included | Candidate2_1 Included | +| CandidateN_2 Included | .. | Candidate1_2 Included | Candidete2_2 Included | +| .. | .. | .. | .. | +| CandidateN_M Included | .. | Candidate1_K Included | Candidate2_L Included | + +> TODO: It's likely we will have to have a way to go from block hash to `BlockNumber` to make this work. + +### Blocks + +Blocks are simply stored as `(Hash, AvailableData)` key-value pairs. + +### Chunks + +Chunks are stored as `(Hash, Vec)` key-value pairs. + +## Basic scenarios to test + +Basically we need to test the correctness of data flow through state FSMs described earlier. These tests obviously assume that some mocking of time is happening. + +- Stored data that is never included pruned in necessary timeout + - A block (and/or a chunk) is added to the store. + - We never note that the respective candidate is included. + - Until a defined timeout the data in question is available. + - After this timeout the data is no longer available. + +- Stored data is kept until we are certain it is finalized. + - A block (and/or a chunk) is added to the store. + - It is available. + - Before the inclusion timeout expires notify storage that the candidate was included. + - The data is still available. + - Wait for an absurd amount of time (longer than 1 day). + - Check that the data is still available. + - Send finality notification about the block in question. + - Wait for some time below finalized data timeout. + - The data is still available. + - Wait until the data should have been pruned. + - The data is no longer available. + +- Forkfulness of the relay chain is taken into account + - Block `B1` is added to the store. + - Block `B2` is added to the store. + - Notify the subsystem that both `B1` and `B2` were included in different leafs of relay chain. + - Notify the subsystem that the leaf with `B1` was finalized. + - Leaf with `B2` is never finalized. + - Leaf with `B2` is pruned and its data is no longer available. + - Wait until the finalized data of `B1` should have been pruned. + - `B1` is no longer available. + +[RAM]: ../../types/overseer-protocol.md#runtime-api-message +[ASM]: ../../types/overseer-protocol.md#availability-store-message diff --git a/roadmap/implementers-guide/src/runtime/scheduler.md b/roadmap/implementers-guide/src/runtime/scheduler.md index 85ad932b52..0dcd09d14d 100644 --- a/roadmap/implementers-guide/src/runtime/scheduler.md +++ b/roadmap/implementers-guide/src/runtime/scheduler.md @@ -16,48 +16,64 @@ It aims to achieve these tasks with these goals in mind: The Scheduler manages resource allocation using the concept of "Availability Cores". There will be one availability core for each parachain, and a fixed number of cores used for multiplexing parathreads. Validators will be partitioned into groups, with the same number of groups as availability cores. Validator groups will be assigned to different availability cores over time. -An availability core can exist in either one of two states at the beginning or end of a block: free or occupied. A free availability core can have a parachain or parathread assigned to it for the potential to have a backed candidate included. After inclusion, the core enters the occupied state as the backed candidate is pending availability. There is an important distinction: a core is not considered occupied until it is in charge of a block pending availability, although the implementation may treat scheduled cores the same as occupied ones for brevity. A core exits the occupied state when the candidate is no longer pending availability - either on timeout or on availability. A core starting in the occupied state can move to the free state and back to occupied all within a single block, as availability bitfields are processed before backed candidates. At the end of the block, there is a possible timeout on availability which can move the core back to the free state if occupied. +An availability core can exist in either one of two states at the beginning or end of a block: free or occupied. A free availability core can have a parachain or parathread assigned to it for the potential to have a backed candidate included. After backing, the core enters the occupied state as the backed candidate is pending availability. There is an important distinction: a core is not considered occupied until it is in charge of a block pending availability, although the implementation may treat scheduled cores the same as occupied ones for brevity. A core exits the occupied state when the candidate is no longer pending availability - either on timeout or on availability. A core starting in the occupied state can move to the free state and back to occupied all within a single block, as availability bitfields are processed before backed candidates. At the end of the block, there is a possible timeout on availability which can move the core back to the free state if occupied. -```text -Availability Core State Machine +```dot process +digraph { + label = "Availability Core State Machine\n\n\n"; + labelloc = "t"; - Assignment & - Backing -+-----------+ +-----------+ -| +--------------> | -| Free | | Occupied | -| <--------------+ | -+-----------+ Availability +-----------+ - or Timeout + { rank=same vg1 vg2 } + vg1 [label = "Free" shape=rectangle] + vg2 [label = "Occupied" shape=rectangle] + + vg1 -> vg2 [label = "Assignment & Backing" ] + vg2 -> vg1 [label = "Availability or Timeout" ] +} ``` -```text -Availability Core Transitions within Block - - +-----------+ | +-----------+ - | | | | | - | Free | | | Occupied | - | | | | | - +--/-----\--+ | +--/-----\--+ - /- -\ | /- -\ - No Backing /- \ Backing | Availability /- \ No availability - /- \ | / \ - /- -\ | /- -\ - +-----v-----+ +----v------+ | +-----v-----+ +-----v-----+ - | | | | | | | | | - | Free | | Occupied | | | Free | | Occupied | - | | | | | | | | | - +-----------+ +-----------+ | +-----|---\-+ +-----|-----+ - | | \ | - | No backing | \ Backing | (no change) - | | -\ | - | +-----v-----+ \ +-----v-----+ - | | | \ | | - | | Free -----+---> Occupied | - | | | | | - | +-----------+ +-----------+ - | Availability Timeout +```dot process +digraph { + label = "Availability Core Transitions within Block\n\n\n"; + labelloc = "t"; + splines="line"; + + subgraph cluster_left { + label = ""; + labelloc = "t"; + + fr1 [label = "Free" shape=rectangle] + fr2 [label = "Free" shape=rectangle] + occ [label = "Occupied" shape=rectangle] + + fr1 -> fr2 [label = "No Backing"] + fr1 -> occ [label = "Backing"] + + { rank=same fr2 occ } + } + + subgraph cluster_right { + label = ""; + labelloc = "t"; + + occ2 [label = "Occupied" shape=rectangle] + fr3 [label = "Free" shape=rectangle] + fr4 [label = "Free" shape=rectangle] + occ3 [label = "Occupied" shape=rectangle] + occ4 [label = "Occupied" shape=rectangle] + + occ2 -> fr3 [label = "Availability"] + occ2 -> occ3 [label = "No availability"] + fr3 -> fr4 [label = "No backing"] + fr3 -> occ4 [label = "Backing"] + occ3 -> occ4 [label = "(no change)"] + occ3 -> fr3 [label = "Availability Timeout"] + + { rank=same; fr3[group=g1]; occ3[group=g2] } + { rank=same; fr4[group=g1]; occ4[group=g2] } + } +} ``` Validator group assignments do not need to change very quickly. The security benefits of fast rotation is redundant with the challenge mechanism in the [Validity module](validity.md). Because of this, we only divide validators into groups at the beginning of the session and do not shuffle membership during the session. However, we do take steps to ensure that no particular validator group has dominance over a single parachain or parathread-multiplexer for an entire session to provide better guarantees of liveness. diff --git a/roadmap/implementers-guide/src/types/overseer-protocol.md b/roadmap/implementers-guide/src/types/overseer-protocol.md index d6d62fbdaf..41ae58bdc6 100644 --- a/roadmap/implementers-guide/src/types/overseer-protocol.md +++ b/roadmap/implementers-guide/src/types/overseer-protocol.md @@ -60,12 +60,12 @@ Messages to and from the availability store. ```rust enum AvailabilityStoreMessage { /// Query the `AvailableData` of a candidate by hash. - QueryAvailableData(Hash, ResponseChannel), + QueryAvailableData(Hash, ResponseChannel>), /// Query whether an `AvailableData` exists within the AV Store. QueryDataAvailability(Hash, ResponseChannel), /// Query a specific availability chunk of the candidate's erasure-coding by validator index. /// Returns the chunk and its inclusion proof against the candidate's erasure-root. - QueryChunk(Hash, ValidatorIndex, ResponseChannel), + QueryChunk(Hash, ValidatorIndex, ResponseChannel>), /// Store a specific chunk of the candidate's erasure-coding by validator index, with an /// accompanying proof. StoreChunk(Hash, ValidatorIndex, AvailabilityChunkAndProof, ResponseChannel>), -- GitLab From 3723e76b83eb7c949b1f5e9c252ebed1b355d827 Mon Sep 17 00:00:00 2001 From: Joseph Date: Tue, 28 Jul 2020 04:54:22 +0200 Subject: [PATCH 107/192] Replace Process.toml with json (#1475) --- Process.json | 15 +++++++++++++++ Process.toml | 15 --------------- 2 files changed, 15 insertions(+), 15 deletions(-) create mode 100644 Process.json delete mode 100644 Process.toml diff --git a/Process.json b/Process.json new file mode 100644 index 0000000000..10dfb219bf --- /dev/null +++ b/Process.json @@ -0,0 +1,15 @@ +[{ + "project_name": "Batch: Availability and Validity", + "owner": "rphmeier", + "matrix_room_id": "!wQXGIDhhJQSVXKqPwi:matrix.parity.io" +}, +{ + "project_name": "Batch: Codebase Restructure", + "owner": "rphmeier", + "matrix_room_id": "!wQXGIDhhJQSVXKqPwi:matrix.parity.io" +}, +{ + "project_name": "Cumulus", + "owner": "bkchr", + "matrix_room_id": "!wQXGIDhhJQSVXKqPwi:matrix.parity.io" +}] diff --git a/Process.toml b/Process.toml deleted file mode 100644 index eaf03c1257..0000000000 --- a/Process.toml +++ /dev/null @@ -1,15 +0,0 @@ -[Batch: Availability and Validity] -owner = "rphmeier" -whitelist = [] -matrix_room_id = "!wQXGIDhhJQSVXKqPwi:matrix.parity.io" - -[Batch: Codebase Restructure] -owner = "rphmeier" -whitelist = [] -matrix_room_id = "!wQXGIDhhJQSVXKqPwi:matrix.parity.io" - -[Cumulus] -owner = "bkchr" -whitelist = [] -matrix_room_id = "!wQXGIDhhJQSVXKqPwi:matrix.parity.io" - -- GitLab From ea74f81db41320934d267bed4600bed05ec6a450 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Tue, 28 Jul 2020 16:38:10 +0200 Subject: [PATCH 108/192] Fix `erasure_fetch_drop_also_drops_gossip_sender` test (#1492) * Fix `erasure_fetch_drop_also_drops_gossip_sender` test * Remove the test entirely * Fix warnings --- network/src/protocol/tests.rs | 72 ++--------------------------------- 1 file changed, 3 insertions(+), 69 deletions(-) diff --git a/network/src/protocol/tests.rs b/network/src/protocol/tests.rs index d2a7645094..3bc4537cfa 100644 --- a/network/src/protocol/tests.rs +++ b/network/src/protocol/tests.rs @@ -21,12 +21,12 @@ use polkadot_primitives::v0::{ Block, Id as ParaId, Chain, DutyRoster, ParachainHost, ValidatorId, Retriable, CollatorId, AbridgedCandidateReceipt, - GlobalValidationData, LocalValidationData, ErasureChunk, SigningContext, + GlobalValidationData, LocalValidationData, SigningContext, PoVBlock, BlockData, ValidationCode, }; use polkadot_validation::{SharedTable, TableRouter}; -use av_store::{Store as AvailabilityStore, ErasureNetworking}; +use av_store::Store as AvailabilityStore; use sc_network_gossip::TopicNotification; use sp_api::{ApiRef, ProvideRuntimeApi}; use sp_runtime::traits::Block as BlockT; @@ -34,7 +34,7 @@ use sp_core::{crypto::Pair, testing::TaskExecutor}; use sp_keyring::Sr25519Keyring; use futures::executor::LocalPool; -use futures::task::{LocalSpawnExt, SpawnExt}; +use futures::task::LocalSpawnExt; #[derive(Default)] pub struct MockNetworkOps { @@ -66,10 +66,6 @@ impl MockGossip { self.inner.lock().insert(topic, (rx, o_tx)); (tx, o_rx) } - - fn contains_listener(&self, topic: &Hash) -> bool { - self.inner.lock().contains_key(topic) - } } impl NetworkServiceOps for MockNetworkOps { @@ -467,68 +463,6 @@ fn validator_key_spillover_cleaned() { }); } -#[test] -fn erasure_fetch_drop_also_drops_gossip_sender() { - let (service, gossip, mut pool, worker_task) = test_setup(Config { collating_for: None }); - let candidate_hash = [1; 32].into(); - - let expected_index = 1; - - let spawner = pool.spawner(); - - spawner.spawn_local(worker_task).unwrap(); - let topic = crate::erasure_coding_topic(&candidate_hash); - let (mut gossip_tx, gossip_taken_rx) = gossip.add_gossip_stream(topic); - - let test_work = async move { - let chunk_listener = service.fetch_erasure_chunk( - &candidate_hash, - expected_index, - ); - - // spawn an abortable handle to the chunk listener future. - // we will wait until this future has proceeded enough to start grabbing - // messages from gossip, and then we will abort the future. - let (chunk_listener, abort_handle) = future::abortable(chunk_listener); - let handle = spawner.spawn_with_handle(chunk_listener).unwrap(); - gossip_taken_rx.await.unwrap(); - - // gossip listener was taken. and is active. - assert!(!gossip.contains_listener(&topic)); - assert!(!gossip_tx.is_closed()); - - abort_handle.abort(); - - // we must `await` this, otherwise context may never transfer over - // to the spawned `Abortable` future. - assert!(handle.await.is_err()); - loop { - // if dropping the sender leads to the gossip listener - // being cleaned up, we will eventually be unable to send a message - // on the sender. - if gossip_tx.is_closed() { break } - - let fake_chunk = GossipMessage::ErasureChunk( - crate::legacy::gossip::ErasureChunkMessage { - chunk: ErasureChunk { - chunk: vec![], - index: expected_index + 1, - proof: vec![], - }, - candidate_hash, - } - ).encode(); - - match gossip_tx.send(TopicNotification { message: fake_chunk, sender: None }).await { - Err(e) => { assert!(e.is_disconnected()); break }, - Ok(_) => continue, - } - } - }; - - pool.run_until(test_work); -} - #[test] fn fetches_pov_block_from_gossip() { let (service, gossip, mut pool, worker_task) = test_setup(Config { collating_for: None }); -- GitLab From 7ed4cb9cca7be403c64e1f3e43e859bcf359a4ab Mon Sep 17 00:00:00 2001 From: Robert Habermeier Date: Tue, 28 Jul 2020 14:02:39 -0400 Subject: [PATCH 109/192] Add new Runtime API messages and make runtime API request fallible (#1485) * polkadot-subsystem: update runtime API message types * update all networking subsystems to use fallible runtime APIs * fix bitfield-signing and make it use new runtime APIs * port candidate-backing to handle runtime API errors and new types * remove old runtime API messages * remove unused imports * fix grumbles * fix backing tests --- Cargo.lock | 1 + node/core/backing/Cargo.toml | 1 + node/core/backing/src/lib.rs | 147 +++++++++++------- node/core/bitfield-signing/src/lib.rs | 56 ++++--- node/network/bitfield-distribution/src/lib.rs | 45 ++++-- node/network/pov-distribution/src/lib.rs | 19 ++- .../network/statement-distribution/src/lib.rs | 26 +++- node/subsystem/src/messages.rs | 50 ++++-- node/subsystem/src/util.rs | 62 ++++---- 9 files changed, 268 insertions(+), 139 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index cfc4f6ed86..6502399a64 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4606,6 +4606,7 @@ dependencies = [ "bitvec", "derive_more 0.99.9", "futures 0.3.5", + "log 0.4.8", "polkadot-erasure-coding", "polkadot-node-primitives", "polkadot-node-subsystem", diff --git a/node/core/backing/Cargo.toml b/node/core/backing/Cargo.toml index a660df3c31..22f8dcc734 100644 --- a/node/core/backing/Cargo.toml +++ b/node/core/backing/Cargo.toml @@ -17,6 +17,7 @@ erasure-coding = { package = "polkadot-erasure-coding", path = "../../../erasure statement-table = { package = "polkadot-statement-table", path = "../../../statement-table" } derive_more = "0.99.9" bitvec = { version = "0.17.4", default-features = false, features = ["alloc"] } +log = "0.4.8" [dev-dependencies] sp-core = { git = "https://github.com/paritytech/substrate", branch = "master" } diff --git a/node/core/backing/src/lib.rs b/node/core/backing/src/lib.rs index 837bcac767..4d2a3817be 100644 --- a/node/core/backing/src/lib.rs +++ b/node/core/backing/src/lib.rs @@ -32,7 +32,7 @@ use polkadot_primitives::v1::{ CommittedCandidateReceipt, BackedCandidate, Id as ParaId, ValidatorId, ValidatorIndex, SigningContext, PoV, OmittedValidationData, CandidateDescriptor, AvailableData, ValidatorSignature, Hash, CandidateReceipt, - CandidateCommitments, + CandidateCommitments, CoreState, CoreIndex, }; use polkadot_node_primitives::{ FromTableMisbehavior, Statement, SignedFullStatement, MisbehaviorReport, @@ -44,12 +44,14 @@ use polkadot_subsystem::{ AllMessages, AvailabilityStoreMessage, CandidateBackingMessage, CandidateSelectionMessage, CandidateValidationMessage, NewBackedCandidate, PoVDistributionMessage, ProvisionableData, ProvisionerMessage, RuntimeApiMessage, StatementDistributionMessage, ValidationFailed, + RuntimeApiRequest, }, util::{ self, - request_signing_context, + request_session_index_for_child, request_validator_groups, request_validators, + request_from_runtime, Validator, }, }; @@ -680,19 +682,56 @@ impl util::JobTrait for CandidateBackingJob { mut tx_from: mpsc::Sender, ) -> Pin> + Send>> { async move { - let (validators, roster, signing_context) = futures::try_join!( + macro_rules! try_runtime_api { + ($x: expr) => { + match $x { + Ok(x) => x, + Err(e) => { + log::warn!( + target: "candidate_backing", + "Failed to fetch runtime API data for job: {:?}", + e, + ); + + // We can't do candidate validation work if we don't have the + // requisite runtime API data. But these errors should not take + // down the node. + return Ok(()); + } + } + } + } + + let (validators, groups, session_index, cores) = futures::try_join!( request_validators(parent, &mut tx_from).await?, request_validator_groups(parent, &mut tx_from).await?, - request_signing_context(parent, &mut tx_from).await?, + request_session_index_for_child(parent, &mut tx_from).await?, + request_from_runtime( + parent, + &mut tx_from, + |tx| RuntimeApiRequest::AvailabilityCores(tx), + ).await?, )?; + let validators = try_runtime_api!(validators); + let (validator_groups, group_rotation_info) = try_runtime_api!(groups); + let session_index = try_runtime_api!(session_index); + let cores = try_runtime_api!(cores); + + let signing_context = SigningContext { parent_hash: parent, session_index }; let validator = Validator::construct(&validators, signing_context, keystore.clone())?; let mut groups = HashMap::new(); - for assignment in roster.scheduled { - if let Some(g) = roster.validator_groups.get(assignment.group_idx.0 as usize) { - groups.insert(assignment.para_id, g.clone()); + let n_cores = cores.len(); + for (idx, core) in cores.into_iter().enumerate() { + // Ignore prospective assignments on occupied cores for the time being. + if let CoreState::Scheduled(scheduled) = core { + let core_index = CoreIndex(idx as _); + let group_index = group_rotation_info.group_for_core(core_index, n_cores); + if let Some(g) = validator_groups.get(group_index.0 as usize) { + groups.insert(scheduled.para_id, g.clone()); + } } } @@ -779,12 +818,12 @@ mod tests { use assert_matches::assert_matches; use futures::{executor, future, Future}; use polkadot_primitives::v1::{ - AssignmentKind, BlockData, CandidateCommitments, CollatorId, CoreAssignment, CoreIndex, - LocalValidationData, GlobalValidationData, GroupIndex, HeadData, - ValidatorPair, ValidityAttestation, + ScheduledCore, BlockData, CandidateCommitments, CollatorId, + LocalValidationData, GlobalValidationData, HeadData, + ValidatorPair, ValidityAttestation, GroupRotationInfo, }; use polkadot_subsystem::{ - messages::{RuntimeApiRequest, SchedulerRoster}, + messages::RuntimeApiRequest, ActiveLeavesUpdate, FromOverseer, OverseerSignal, }; use sp_keyring::Sr25519Keyring; @@ -801,7 +840,8 @@ mod tests { validator_public: Vec, global_validation_data: GlobalValidationData, local_validation_data: LocalValidationData, - roster: SchedulerRoster, + validator_groups: (Vec>, GroupRotationInfo), + availability_cores: Vec, head_data: HashMap, signing_context: SigningContext, relay_parent: Hash, @@ -830,53 +870,39 @@ mod tests { let validator_public = validator_pubkeys(&validators); - let chain_a_assignment = CoreAssignment { - core: CoreIndex::from(0), - para_id: chain_a, - kind: AssignmentKind::Parachain, - group_idx: GroupIndex::from(0), - }; - - let chain_b_assignment = CoreAssignment { - core: CoreIndex::from(1), - para_id: chain_b, - kind: AssignmentKind::Parachain, - group_idx: GroupIndex::from(1), + let validator_groups = vec![vec![2, 0, 3], vec![1], vec![4]]; + let group_rotation_info = GroupRotationInfo { + session_start_block: 0, + group_rotation_frequency: 100, + now: 1, }; let thread_collator: CollatorId = Sr25519Keyring::Two.public().into(); + let availability_cores = vec![ + CoreState::Scheduled(ScheduledCore { + para_id: chain_a, + collator: None, + }), + CoreState::Scheduled(ScheduledCore { + para_id: chain_b, + collator: None, + }), + CoreState::Scheduled(ScheduledCore { + para_id: thread_a, + collator: Some(thread_collator.clone()), + }), + ]; - let thread_a_assignment = CoreAssignment { - core: CoreIndex::from(2), - para_id: thread_a, - kind: AssignmentKind::Parathread(thread_collator.clone(), 0), - group_idx: GroupIndex::from(2), - }; + let mut head_data = HashMap::new(); + head_data.insert(chain_a, HeadData(vec![4, 5, 6])); - let validator_groups = vec![vec![2, 0, 3], vec![1], vec![4]]; + let relay_parent = Hash::from([5; 32]); - let parent_hash_1 = [1; 32].into(); - - let roster = SchedulerRoster { - validator_groups, - scheduled: vec![ - chain_a_assignment, - chain_b_assignment, - thread_a_assignment, - ], - upcoming: vec![], - availability_cores: vec![], - }; let signing_context = SigningContext { session_index: 1, - parent_hash: parent_hash_1, + parent_hash: relay_parent, }; - let mut head_data = HashMap::new(); - head_data.insert(chain_a, HeadData(vec![4, 5, 6])); - - let relay_parent = Hash::from([5; 32]); - let local_validation_data = LocalValidationData { parent_head: HeadData(vec![7, 8, 9]), balance: Default::default(), @@ -895,7 +921,8 @@ mod tests { keystore, validators, validator_public, - roster, + validator_groups: (validator_groups, group_rotation_info), + availability_cores, head_data, local_validation_data, global_validation_data, @@ -984,7 +1011,7 @@ mod tests { AllMessages::RuntimeApi( RuntimeApiMessage::Request(parent, RuntimeApiRequest::Validators(tx)) ) if parent == test_state.relay_parent => { - tx.send(test_state.validator_public.clone()).unwrap(); + tx.send(Ok(test_state.validator_public.clone())).unwrap(); } ); @@ -994,19 +1021,29 @@ mod tests { AllMessages::RuntimeApi( RuntimeApiMessage::Request(parent, RuntimeApiRequest::ValidatorGroups(tx)) ) if parent == test_state.relay_parent => { - tx.send(test_state.roster.clone()).unwrap(); + tx.send(Ok(test_state.validator_groups.clone())).unwrap(); } ); - // Check that subsystem job issues a request for the signing context. + // Check that subsystem job issues a request for the session index for child. assert_matches!( virtual_overseer.recv().await, AllMessages::RuntimeApi( - RuntimeApiMessage::Request(parent, RuntimeApiRequest::SigningContext(tx)) + RuntimeApiMessage::Request(parent, RuntimeApiRequest::SessionIndexForChild(tx)) ) if parent == test_state.relay_parent => { - tx.send(test_state.signing_context.clone()).unwrap(); + tx.send(Ok(test_state.signing_context.session_index)).unwrap(); } ); + + // Check that subsystem job issues a request for the availability cores. + assert_matches!( + virtual_overseer.recv().await, + AllMessages::RuntimeApi( + RuntimeApiMessage::Request(parent, RuntimeApiRequest::AvailabilityCores(tx)) + ) if parent == test_state.relay_parent => { + tx.send(Ok(test_state.availability_cores.clone())).unwrap(); + } + ); } // Test that a `CandidateBackingMessage::Second` issues validation work diff --git a/node/core/bitfield-signing/src/lib.rs b/node/core/bitfield-signing/src/lib.rs index 806e3c1418..601f0b41b9 100644 --- a/node/core/bitfield-signing/src/lib.rs +++ b/node/core/bitfield-signing/src/lib.rs @@ -30,7 +30,7 @@ use polkadot_node_subsystem::{ }, util::{self, JobManager, JobTrait, ToJobTrait, Validator}, }; -use polkadot_primitives::v1::{AvailabilityBitfield, CoreOccupied, Hash}; +use polkadot_primitives::v1::{AvailabilityBitfield, CoreState, Hash}; use std::{convert::TryFrom, pin::Pin, time::Duration}; use wasm_timer::{Delay, Instant}; @@ -130,8 +130,7 @@ pub enum Error { // this function exists mainly to collect a bunch of potential error points into one. async fn get_core_availability( relay_parent: Hash, - idx: usize, - core: Option, + core: CoreState, sender: &mpsc::Sender, ) -> Result { use messages::{ @@ -144,18 +143,23 @@ async fn get_core_availability( // we have to (cheaply) clone this sender so we can mutate it to actually send anything let mut sender = sender.clone(); - // REVIEW: is it safe to ignore parathreads here, or do they also figure in the availability mapping? - if let Some(CoreOccupied::Parachain) = core { + if let CoreState::Occupied(core) = core { let (tx, rx) = oneshot::channel(); sender .send(RuntimeApi(Request( relay_parent, - CandidatePendingAvailability(idx.into(), tx), + CandidatePendingAvailability(core.para_id, tx), ))) .await?; + let committed_candidate_receipt = match rx.await? { - Some(ccr) => ccr, - None => return Ok(false), + Ok(Some(ccr)) => ccr, + Ok(None) => return Ok(false), + Err(e) => { + // Don't take down the node on runtime API errors. + log::warn!(target: "bitfield_signing", "Encountered a runtime API error: {:?}", e); + return Ok(false); + } }; let (tx, rx) = oneshot::channel(); sender @@ -171,35 +175,41 @@ async fn get_core_availability( // the way this function works is not intuitive: // -// - get the scheduler roster so we have a list of cores, in order. +// - get the availability cores so we have a list of cores, in order. // - for each occupied core, fetch `candidate_pending_availability` from runtime // - from there, we can get the `CandidateDescriptor` // - from there, we can send a `AvailabilityStore::QueryPoV` and set the indexed bit to 1 if it returns Some(_) async fn construct_availability_bitfield( relay_parent: Hash, sender: &mut mpsc::Sender, -) -> Result { +) -> Result, Error> { use futures::lock::Mutex; - use messages::RuntimeApiRequest::ValidatorGroups; + use messages::RuntimeApiRequest::AvailabilityCores; use FromJob::RuntimeApi; use RuntimeApiMessage::Request; - // request the validator groups so we can get the scheduler roster + // request the availability cores metadata from runtime. let (tx, rx) = oneshot::channel(); sender - .send(RuntimeApi(Request(relay_parent, ValidatorGroups(tx)))) + .send(RuntimeApi(Request(relay_parent, AvailabilityCores(tx)))) .await?; // we now need sender to be immutable so we can copy the reference to multiple concurrent closures let sender = &*sender; - // wait for the scheduler roster - let scheduler_roster = rx.await?; + // wait for the cores + let availability_cores = match rx.await? { + Ok(a) => a, + Err(e) => { + log::warn!(target: "bitfield_signing", "Encountered a runtime API error: {:?}", e); + return Ok(None); + } + }; // prepare outputs let out = - Mutex::new(bitvec!(bitvec::order::Lsb0, u8; 0; scheduler_roster.availability_cores.len())); + Mutex::new(bitvec!(bitvec::order::Lsb0, u8; 0; availability_cores.len())); // in principle, we know that we never want concurrent access to the _same_ bit within the vec; // we could `let out_ref = out.as_mut_ptr();` here instead, and manually assign bits, avoiding // any need to ever wait to lock this mutex. @@ -213,9 +223,9 @@ async fn construct_availability_bitfield( // // In principle, this work is all concurrent, not parallel. In practice, we can't guarantee it, which is why // we need the mutexes and explicit references above. - stream::iter(scheduler_roster.availability_cores.into_iter().enumerate()) + stream::iter(availability_cores.into_iter().enumerate()) .for_each_concurrent(None, |(idx, core)| async move { - let availability = match get_core_availability(relay_parent, idx, core, sender).await { + let availability = match get_core_availability(relay_parent, core, sender).await { Ok(availability) => availability, Err(err) => { errs_ref.lock().await.push(err); @@ -228,7 +238,7 @@ async fn construct_availability_bitfield( let errs = errs.into_inner(); if errs.is_empty() { - Ok(out.into_inner().into()) + Ok(Some(out.into_inner().into())) } else { Err(errs.into()) } @@ -264,7 +274,13 @@ impl JobTrait for BitfieldSigningJob { // wait a bit before doing anything else Delay::new_at(wait_until).await?; - let bitfield = construct_availability_bitfield(relay_parent, &mut sender).await?; + let bitfield = + match construct_availability_bitfield(relay_parent, &mut sender).await? + { + None => return Ok(()), + Some(b) => b, + }; + let signed_bitfield = validator.sign(bitfield); // make an anonymous scope to contain some use statements to simplify creating the outbound message diff --git a/node/network/bitfield-distribution/src/lib.rs b/node/network/bitfield-distribution/src/lib.rs index 11c9563cb0..66f9ca9509 100644 --- a/node/network/bitfield-distribution/src/lib.rs +++ b/node/network/bitfield-distribution/src/lib.rs @@ -161,17 +161,23 @@ impl BitfieldDistribution { for relay_parent in activated { trace!(target: "bitd", "Start {:?}", relay_parent); // query basic system parameters once - let (validator_set, signing_context) = - query_basics(&mut ctx, relay_parent).await?; - - let _ = state.per_relay_parent.insert( - relay_parent, - PerRelayParentData { - signing_context, - validator_set, - ..Default::default() - }, - ); + if let Some((validator_set, signing_context)) = + query_basics(&mut ctx, relay_parent).await? + { + // If our runtime API fails, we don't take down the node, + // but we might alter peers' reputations erroneously as a result + // of not having the correct bookkeeping. If we have lost a race + // with state pruning, it is unlikely that peers will be sending + // us anything to do with this relay-parent anyway. + let _ = state.per_relay_parent.insert( + relay_parent, + PerRelayParentData { + signing_context, + validator_set, + ..Default::default() + }, + ); + } } for relay_parent in deactivated { @@ -562,12 +568,12 @@ where async fn query_basics( ctx: &mut Context, relay_parent: Hash, -) -> SubsystemResult<(Vec, SigningContext)> +) -> SubsystemResult, SigningContext)>> where Context: SubsystemContext, { let (validators_tx, validators_rx) = oneshot::channel(); - let (signing_tx, signing_rx) = oneshot::channel(); + let (session_tx, session_rx) = oneshot::channel(); let query_validators = AllMessages::RuntimeApi(RuntimeApiMessage::Request( relay_parent.clone(), @@ -576,13 +582,22 @@ where let query_signing = AllMessages::RuntimeApi(RuntimeApiMessage::Request( relay_parent.clone(), - RuntimeApiRequest::SigningContext(signing_tx), + RuntimeApiRequest::SessionIndexForChild(session_tx), )); ctx.send_messages(std::iter::once(query_validators).chain(std::iter::once(query_signing))) .await?; - Ok((validators_rx.await?, signing_rx.await?)) + match (validators_rx.await?, session_rx.await?) { + (Ok(v), Ok(s)) => Ok(Some(( + v, + SigningContext { parent_hash: relay_parent, session_index: s }, + ))), + (Err(e), _) | (_, Err(e)) => { + warn!(target: "bitd", "Failed to fetch basics from runtime API: {:?}", e); + Ok(None) + } + } } #[cfg(test)] diff --git a/node/network/pov-distribution/src/lib.rs b/node/network/pov-distribution/src/lib.rs index 24f14df3b0..4409d7f1ea 100644 --- a/node/network/pov-distribution/src/lib.rs +++ b/node/network/pov-distribution/src/lib.rs @@ -115,10 +115,27 @@ async fn handle_signal( RuntimeApiRequest::Validators(vals_tx), ))).await?; + let n_validators = match vals_rx.await? { + Ok(v) => v.len(), + Err(e) => { + log::warn!(target: "pov_distribution", + "Error fetching validators from runtime API for active leaf: {:?}", + e + ); + + // Not adding bookkeeping here might make us behave funny, but we + // shouldn't take down the node on spurious runtime API errors. + // + // and this is "behave funny" as in be bad at our job, but not in any + // slashable or security-related way. + continue; + } + }; + state.relay_parent_state.insert(relay_parent, BlockBasedState { known: HashMap::new(), fetching: HashMap::new(), - n_validators: vals_rx.await?.len(), + n_validators: n_validators, }); } diff --git a/node/network/statement-distribution/src/lib.rs b/node/network/statement-distribution/src/lib.rs index 86a3efbe91..5cc67cfea0 100644 --- a/node/network/statement-distribution/src/lib.rs +++ b/node/network/statement-distribution/src/lib.rs @@ -847,17 +847,37 @@ async fn run( let (session_tx, session_rx) = oneshot::channel(); let val_message = AllMessages::RuntimeApi( - RuntimeApiMessage::Request(relay_parent, RuntimeApiRequest::Validators(val_tx)), + RuntimeApiMessage::Request( + relay_parent, + RuntimeApiRequest::Validators(val_tx), + ), ); let session_message = AllMessages::RuntimeApi( - RuntimeApiMessage::Request(relay_parent, RuntimeApiRequest::SigningContext(session_tx)), + RuntimeApiMessage::Request( + relay_parent, + RuntimeApiRequest::SessionIndexForChild(session_tx), + ), ); ctx.send_messages( std::iter::once(val_message).chain(std::iter::once(session_message)) ).await?; - (val_rx.await?, session_rx.await?.session_index) + match (val_rx.await?, session_rx.await?) { + (Ok(v), Ok(s)) => (v, s), + (Err(e), _) | (_, Err(e)) => { + log::warn!( + target: "statement_distribution", + "Failed to fetch runtime API data for active leaf: {:?}", + e, + ); + + // Lacking this bookkeeping might make us behave funny, although + // not in any slashable way. But we shouldn't take down the node + // on what are likely spurious runtime API errors. + continue; + } + } }; active_heads.entry(relay_parent) diff --git a/node/subsystem/src/messages.rs b/node/subsystem/src/messages.rs index 710ba77ce9..d6bd4f45d8 100644 --- a/node/subsystem/src/messages.rs +++ b/node/subsystem/src/messages.rs @@ -25,11 +25,13 @@ use futures::channel::{mpsc, oneshot}; use polkadot_primitives::v1::{ - BlockNumber, Hash, CommittedCandidateReceipt, + Hash, CommittedCandidateReceipt, CandidateReceipt, PoV, ErasureChunk, BackedCandidate, Id as ParaId, - SignedAvailabilityBitfield, SigningContext, ValidatorId, ValidationCode, ValidatorIndex, - CoreAssignment, CoreOccupied, HeadData, CandidateDescriptor, - ValidatorSignature, OmittedValidationData, AvailableData, + SignedAvailabilityBitfield, ValidatorId, ValidationCode, ValidatorIndex, + CoreAssignment, CoreOccupied, CandidateDescriptor, + ValidatorSignature, OmittedValidationData, AvailableData, GroupRotationInfo, + CoreState, LocalValidationData, GlobalValidationData, OccupiedCoreAssumption, + CandidateEvent, SessionIndex, }; use polkadot_node_primitives::{ MisbehaviorReport, SignedFullStatement, View, ProtocolId, ValidationResult, @@ -286,23 +288,39 @@ pub struct SchedulerRoster { pub availability_cores: Vec>, } +/// A description of an error causing the runtime API request to be unservable. +#[derive(Debug, Clone)] +pub struct RuntimeApiError(String); + +/// A sender for the result of a runtime API request. +pub type RuntimeApiSender = oneshot::Sender>; + /// A request to the Runtime API subsystem. #[derive(Debug)] pub enum RuntimeApiRequest { /// Get the current validator set. - Validators(oneshot::Sender>), - /// Get the assignments of validators to cores. - ValidatorGroups(oneshot::Sender), - /// Get a signing context for bitfields and statements. - SigningContext(oneshot::Sender), - /// Get the validation code for a specific para, assuming execution under given block number, and - /// an optional block number representing an intermediate parablock executed in the context of - /// that block. - ValidationCode(ParaId, BlockNumber, Option, oneshot::Sender), - /// Get head data for a specific para. - HeadData(ParaId, oneshot::Sender), + Validators(RuntimeApiSender>), + /// Get the validator groups and group rotation info. + ValidatorGroups(RuntimeApiSender<(Vec>, GroupRotationInfo)>), + /// Get information on all availability cores. + AvailabilityCores(RuntimeApiSender>), + /// Get the global validation data. + GlobalValidationData(RuntimeApiSender), + /// Get the local validation data for a particular para, taking the given + /// `OccupiedCoreAssumption`, which will inform on how the validation data should be computed + /// if the para currently occupies a core. + LocalValidationData( + ParaId, + OccupiedCoreAssumption, + RuntimeApiSender>, + ), + /// Get the session index that a child of the block will have. + SessionIndexForChild(RuntimeApiSender), /// Get a the candidate pending availability for a particular parachain by parachain / core index - CandidatePendingAvailability(ParaId, oneshot::Sender>), + CandidatePendingAvailability(ParaId, RuntimeApiSender>), + /// Get all events concerning candidates (backing, inclusion, time-out) in the parent of + /// the block in whose state this request is executed. + CandidateEvents(RuntimeApiSender>), } /// A message to the Runtime API subsystem. diff --git a/node/subsystem/src/util.rs b/node/subsystem/src/util.rs index ced6b21bd9..ce31bebeda 100644 --- a/node/subsystem/src/util.rs +++ b/node/subsystem/src/util.rs @@ -21,7 +21,9 @@ //! this module. use crate::{ - messages::{AllMessages, RuntimeApiMessage, RuntimeApiRequest, SchedulerRoster}, + messages::{ + AllMessages, RuntimeApiError, RuntimeApiMessage, RuntimeApiRequest, RuntimeApiSender, + }, FromOverseer, SpawnedSubsystem, Subsystem, SubsystemContext, SubsystemError, SubsystemResult, }; use futures::{ @@ -37,8 +39,8 @@ use keystore::KeyStorePtr; use parity_scale_codec::Encode; use pin_project::{pin_project, pinned_drop}; use polkadot_primitives::v1::{ - EncodeAs, Hash, HeadData, Id as ParaId, Signed, SigningContext, - ValidatorId, ValidatorIndex, ValidatorPair, + EncodeAs, Hash, Signed, SigningContext, SessionIndex, + ValidatorId, ValidatorIndex, ValidatorPair, GroupRotationInfo, }; use sp_core::{ Pair, @@ -70,6 +72,9 @@ pub enum Error { /// A subsystem error #[from] Subsystem(SubsystemError), + /// An error in the runtime API. + #[from] + RuntimeApi(RuntimeApiError), /// The type system wants this even though it doesn't make sense #[from] Infallible(std::convert::Infallible), @@ -83,14 +88,17 @@ pub enum Error { AlreadyForwarding, } +/// A type alias for Runtime API receivers. +pub type RuntimeApiReceiver = oneshot::Receiver>; + /// Request some data from the `RuntimeApi`. pub async fn request_from_runtime( parent: Hash, sender: &mut mpsc::Sender, request_builder: RequestBuilder, -) -> Result, Error> +) -> Result, Error> where - RequestBuilder: FnOnce(oneshot::Sender) -> RuntimeApiRequest, + RequestBuilder: FnOnce(RuntimeApiSender) -> RuntimeApiRequest, FromJob: TryFrom, >::Error: std::fmt::Debug, { @@ -111,7 +119,7 @@ where pub async fn request_validators( parent: Hash, s: &mut mpsc::Sender, -) -> Result>, Error> +) -> Result>, Error> where FromJob: TryFrom, >::Error: std::fmt::Debug, @@ -119,11 +127,11 @@ where request_from_runtime(parent, s, |tx| RuntimeApiRequest::Validators(tx)).await } -/// Request the scheduler roster from `RuntimeApi`. +/// Request the validator groups. pub async fn request_validator_groups( parent: Hash, s: &mut mpsc::Sender, -) -> Result, Error> +) -> Result>, GroupRotationInfo)>, Error> where FromJob: TryFrom, >::Error: std::fmt::Debug, @@ -131,29 +139,18 @@ where request_from_runtime(parent, s, |tx| RuntimeApiRequest::ValidatorGroups(tx)).await } -/// Request a `SigningContext` from the `RuntimeApi`. -pub async fn request_signing_context( +/// Request the session index of the child block. +pub async fn request_session_index_for_child( parent: Hash, s: &mut mpsc::Sender, -) -> Result, Error> +) -> Result, Error> where FromJob: TryFrom, >::Error: std::fmt::Debug, { - request_from_runtime(parent, s, |tx| RuntimeApiRequest::SigningContext(tx)).await -} - -/// Request `HeadData` for some `ParaId` from `RuntimeApi`. -pub async fn request_head_data( - parent: Hash, - s: &mut mpsc::Sender, - id: ParaId, -) -> Result, Error> -where - FromJob: TryFrom, - >::Error: std::fmt::Debug, -{ - request_from_runtime(parent, s, |tx| RuntimeApiRequest::HeadData(id, tx)).await + request_from_runtime(parent, s, |tx| { + RuntimeApiRequest::SessionIndexForChild(tx) + }).await } /// From the given set of validators, find the first key we can sign with, if any. @@ -185,14 +182,21 @@ impl Validator { FromJob: TryFrom, >::Error: std::fmt::Debug, { - // Note: request_validators and request_signing_context do not and cannot run concurrently: they both - // have a mutable handle to the same sender. + // Note: request_validators and request_session_index_for_child do not and cannot + // run concurrently: they both have a mutable handle to the same sender. // However, each of them returns a oneshot::Receiver, and those are resolved concurrently. - let (validators, signing_context) = futures::try_join!( + let (validators, session_index) = futures::try_join!( request_validators(parent, &mut sender).await?, - request_signing_context(parent, &mut sender).await?, + request_session_index_for_child(parent, &mut sender).await?, )?; + let signing_context = SigningContext { + session_index: session_index?, + parent_hash: parent, + }; + + let validators = validators?; + Self::construct(&validators, signing_context, keystore) } -- GitLab From 1d9a36dff0eaa5fdbaee8b6b0e949c32cae4797b Mon Sep 17 00:00:00 2001 From: Ashley Date: Tue, 28 Jul 2020 20:18:11 +0200 Subject: [PATCH 110/192] Companion PR for `Various small improvements to service construction.`. (#1472) * Initial commit Forked at: 9637baea0ebb1c8e43860a6945cb5a9a3b4a90ab Parent branch: origin/master * Refactor * Refactor * Remove macro * WIP Forked at: 9637baea0ebb1c8e43860a6945cb5a9a3b4a90ab Parent branch: origin/master * CLEANUP Forked at: 9637baea0ebb1c8e43860a6945cb5a9a3b4a90ab Parent branch: origin/master * small fix * fix for browser * Switch branch * Rewrite service builds * Update branch * Fix sp-core branch * Switch branch back and update Co-authored-by: Cecile Tonglet --- Cargo.lock | 286 +++++++++--------- node/network/bitfield-distribution/Cargo.toml | 2 +- node/service/src/lib.rs | 171 ++++++----- rpc/src/lib.rs | 2 +- service/src/lib.rs | 170 ++++++----- 5 files changed, 345 insertions(+), 286 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 6502399a64..c9cfa540d4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1370,7 +1370,7 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "fork-tree" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" +source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" dependencies = [ "parity-scale-codec", ] @@ -1378,7 +1378,7 @@ dependencies = [ [[package]] name = "frame-benchmarking" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" +source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" dependencies = [ "frame-support", "frame-system", @@ -1395,7 +1395,7 @@ dependencies = [ [[package]] name = "frame-benchmarking-cli" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" +source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" dependencies = [ "Inflector", "frame-benchmarking", @@ -1414,7 +1414,7 @@ dependencies = [ [[package]] name = "frame-executive" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" +source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" dependencies = [ "frame-support", "frame-system", @@ -1429,7 +1429,7 @@ dependencies = [ [[package]] name = "frame-metadata" version = "11.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" +source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" dependencies = [ "parity-scale-codec", "serde", @@ -1440,7 +1440,7 @@ dependencies = [ [[package]] name = "frame-support" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" +source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" dependencies = [ "bitmask", "frame-metadata", @@ -1465,7 +1465,7 @@ dependencies = [ [[package]] name = "frame-support-procedural" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" +source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" dependencies = [ "frame-support-procedural-tools", "proc-macro2 1.0.18", @@ -1476,7 +1476,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" +source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" dependencies = [ "frame-support-procedural-tools-derive", "proc-macro-crate", @@ -1488,7 +1488,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools-derive" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" +source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" dependencies = [ "proc-macro2 1.0.18", "quote 1.0.7", @@ -1498,7 +1498,7 @@ dependencies = [ [[package]] name = "frame-system" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" +source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" dependencies = [ "frame-support", "impl-trait-for-tuples", @@ -1514,7 +1514,7 @@ dependencies = [ [[package]] name = "frame-system-benchmarking" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" +source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" dependencies = [ "frame-benchmarking", "frame-support", @@ -1528,7 +1528,7 @@ dependencies = [ [[package]] name = "frame-system-rpc-runtime-api" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" +source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" dependencies = [ "parity-scale-codec", "sp-api", @@ -3542,7 +3542,7 @@ dependencies = [ [[package]] name = "pallet-authority-discovery" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" +source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" dependencies = [ "frame-support", "frame-system", @@ -3558,7 +3558,7 @@ dependencies = [ [[package]] name = "pallet-authorship" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" +source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" dependencies = [ "frame-support", "frame-system", @@ -3573,7 +3573,7 @@ dependencies = [ [[package]] name = "pallet-babe" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" +source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" dependencies = [ "frame-benchmarking", "frame-support", @@ -3598,7 +3598,7 @@ dependencies = [ [[package]] name = "pallet-balances" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" +source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" dependencies = [ "frame-benchmarking", "frame-support", @@ -3612,7 +3612,7 @@ dependencies = [ [[package]] name = "pallet-collective" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" +source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" dependencies = [ "frame-benchmarking", "frame-support", @@ -3628,7 +3628,7 @@ dependencies = [ [[package]] name = "pallet-democracy" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" +source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" dependencies = [ "frame-benchmarking", "frame-support", @@ -3643,7 +3643,7 @@ dependencies = [ [[package]] name = "pallet-elections-phragmen" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" +source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" dependencies = [ "frame-benchmarking", "frame-support", @@ -3658,7 +3658,7 @@ dependencies = [ [[package]] name = "pallet-finality-tracker" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" +source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" dependencies = [ "frame-support", "frame-system", @@ -3674,7 +3674,7 @@ dependencies = [ [[package]] name = "pallet-grandpa" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" +source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" dependencies = [ "frame-benchmarking", "frame-support", @@ -3696,7 +3696,7 @@ dependencies = [ [[package]] name = "pallet-identity" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" +source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" dependencies = [ "enumflags2", "frame-benchmarking", @@ -3712,7 +3712,7 @@ dependencies = [ [[package]] name = "pallet-im-online" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" +source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" dependencies = [ "frame-benchmarking", "frame-support", @@ -3732,7 +3732,7 @@ dependencies = [ [[package]] name = "pallet-indices" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" +source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" dependencies = [ "frame-support", "frame-system", @@ -3748,7 +3748,7 @@ dependencies = [ [[package]] name = "pallet-membership" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" +source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" dependencies = [ "frame-support", "frame-system", @@ -3762,7 +3762,7 @@ dependencies = [ [[package]] name = "pallet-multisig" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" +source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" dependencies = [ "frame-support", "frame-system", @@ -3777,7 +3777,7 @@ dependencies = [ [[package]] name = "pallet-nicks" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" +source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" dependencies = [ "frame-support", "frame-system", @@ -3791,7 +3791,7 @@ dependencies = [ [[package]] name = "pallet-offences" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" +source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" dependencies = [ "frame-support", "frame-system", @@ -3806,7 +3806,7 @@ dependencies = [ [[package]] name = "pallet-offences-benchmarking" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" +source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" dependencies = [ "frame-benchmarking", "frame-support", @@ -3827,7 +3827,7 @@ dependencies = [ [[package]] name = "pallet-proxy" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" +source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" dependencies = [ "frame-support", "frame-system", @@ -3842,7 +3842,7 @@ dependencies = [ [[package]] name = "pallet-randomness-collective-flip" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" +source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" dependencies = [ "frame-support", "frame-system", @@ -3855,7 +3855,7 @@ dependencies = [ [[package]] name = "pallet-recovery" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" +source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" dependencies = [ "enumflags2", "frame-support", @@ -3870,7 +3870,7 @@ dependencies = [ [[package]] name = "pallet-scheduler" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" +source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" dependencies = [ "frame-benchmarking", "frame-support", @@ -3885,7 +3885,7 @@ dependencies = [ [[package]] name = "pallet-session" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" +source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" dependencies = [ "frame-support", "frame-system", @@ -3905,7 +3905,7 @@ dependencies = [ [[package]] name = "pallet-session-benchmarking" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" +source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" dependencies = [ "frame-benchmarking", "frame-support", @@ -3921,7 +3921,7 @@ dependencies = [ [[package]] name = "pallet-society" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" +source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" dependencies = [ "frame-support", "frame-system", @@ -3935,7 +3935,7 @@ dependencies = [ [[package]] name = "pallet-staking" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" +source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" dependencies = [ "frame-benchmarking", "frame-support", @@ -3957,7 +3957,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-curve" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" +source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -3968,7 +3968,7 @@ dependencies = [ [[package]] name = "pallet-sudo" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" +source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" dependencies = [ "frame-support", "frame-system", @@ -3982,7 +3982,7 @@ dependencies = [ [[package]] name = "pallet-timestamp" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" +source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" dependencies = [ "frame-benchmarking", "frame-support", @@ -4000,7 +4000,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" +source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" dependencies = [ "frame-support", "frame-system", @@ -4017,7 +4017,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" +source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" dependencies = [ "jsonrpc-core", "jsonrpc-core-client", @@ -4035,7 +4035,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc-runtime-api" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" +source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" dependencies = [ "frame-support", "parity-scale-codec", @@ -4048,7 +4048,7 @@ dependencies = [ [[package]] name = "pallet-treasury" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" +source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" dependencies = [ "frame-benchmarking", "frame-support", @@ -4063,7 +4063,7 @@ dependencies = [ [[package]] name = "pallet-utility" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" +source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" dependencies = [ "frame-benchmarking", "frame-support", @@ -4079,7 +4079,7 @@ dependencies = [ [[package]] name = "pallet-vesting" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" +source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" dependencies = [ "enumflags2", "frame-benchmarking", @@ -5441,14 +5441,13 @@ dependencies = [ [[package]] name = "prometheus" -version = "0.8.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0575e258dab62268e7236d7307caa38848acbda7ec7ab87bd9093791e999d20" +checksum = "dd0ced56dee39a6e960c15c74dc48849d614586db2eaada6497477af7c7811cd" dependencies = [ "cfg-if", "fnv", "lazy_static", - "protobuf", "spin", "thiserror", ] @@ -5504,12 +5503,6 @@ dependencies = [ "prost", ] -[[package]] -name = "protobuf" -version = "2.16.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d883f78645c21b7281d21305181aa1f4dd9e9363e7cf2566c93121552cff003e" - [[package]] name = "quick-error" version = "1.2.3" @@ -6065,7 +6058,7 @@ dependencies = [ [[package]] name = "sc-authority-discovery" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" +source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" dependencies = [ "bytes 0.5.5", "derive_more 0.99.9", @@ -6092,7 +6085,7 @@ dependencies = [ [[package]] name = "sc-basic-authorship" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" +source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6116,7 +6109,7 @@ dependencies = [ [[package]] name = "sc-block-builder" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" +source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" dependencies = [ "parity-scale-codec", "sc-client-api", @@ -6133,7 +6126,7 @@ dependencies = [ [[package]] name = "sc-chain-spec" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" +source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" dependencies = [ "impl-trait-for-tuples", "sc-chain-spec-derive", @@ -6149,7 +6142,7 @@ dependencies = [ [[package]] name = "sc-chain-spec-derive" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" +source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -6160,7 +6153,7 @@ dependencies = [ [[package]] name = "sc-cli" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" +source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" dependencies = [ "ansi_term 0.12.1", "atty", @@ -6201,7 +6194,7 @@ dependencies = [ [[package]] name = "sc-client-api" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" +source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" dependencies = [ "derive_more 0.99.9", "fnv", @@ -6237,7 +6230,7 @@ dependencies = [ [[package]] name = "sc-client-db" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" +source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" dependencies = [ "blake2-rfc", "hash-db", @@ -6266,7 +6259,7 @@ dependencies = [ [[package]] name = "sc-consensus" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" +source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" dependencies = [ "sc-client-api", "sp-blockchain", @@ -6277,7 +6270,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" +source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" dependencies = [ "derive_more 0.99.9", "fork-tree", @@ -6319,7 +6312,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe-rpc" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" +source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -6343,7 +6336,7 @@ dependencies = [ [[package]] name = "sc-consensus-epochs" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" +source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" dependencies = [ "fork-tree", "parity-scale-codec", @@ -6356,7 +6349,7 @@ dependencies = [ [[package]] name = "sc-consensus-slots" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" +source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6379,7 +6372,7 @@ dependencies = [ [[package]] name = "sc-consensus-uncles" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" +source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" dependencies = [ "log 0.4.8", "sc-client-api", @@ -6393,7 +6386,7 @@ dependencies = [ [[package]] name = "sc-executor" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" +source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" dependencies = [ "derive_more 0.99.9", "lazy_static", @@ -6421,7 +6414,7 @@ dependencies = [ [[package]] name = "sc-executor-common" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" +source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" dependencies = [ "derive_more 0.99.9", "log 0.4.8", @@ -6438,7 +6431,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmi" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" +source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" dependencies = [ "log 0.4.8", "parity-scale-codec", @@ -6453,7 +6446,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmtime" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" +source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" dependencies = [ "cranelift-codegen", "cranelift-wasm", @@ -6474,7 +6467,7 @@ dependencies = [ [[package]] name = "sc-finality-grandpa" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" +source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" dependencies = [ "assert_matches", "derive_more 0.99.9", @@ -6512,7 +6505,7 @@ dependencies = [ [[package]] name = "sc-finality-grandpa-rpc" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" +source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" dependencies = [ "derive_more 0.99.9", "finality-grandpa", @@ -6529,7 +6522,7 @@ dependencies = [ [[package]] name = "sc-informant" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" +source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" dependencies = [ "ansi_term 0.12.1", "futures 0.3.5", @@ -6547,7 +6540,7 @@ dependencies = [ [[package]] name = "sc-keystore" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" +source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" dependencies = [ "derive_more 0.99.9", "hex", @@ -6563,7 +6556,7 @@ dependencies = [ [[package]] name = "sc-light" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" +source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" dependencies = [ "hash-db", "lazy_static", @@ -6582,7 +6575,7 @@ dependencies = [ [[package]] name = "sc-network" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" +source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" dependencies = [ "bitflags", "bs58", @@ -6634,7 +6627,7 @@ dependencies = [ [[package]] name = "sc-network-gossip" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" +source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6649,7 +6642,7 @@ dependencies = [ [[package]] name = "sc-network-test" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" +source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" dependencies = [ "env_logger", "futures 0.3.5", @@ -6676,7 +6669,7 @@ dependencies = [ [[package]] name = "sc-offchain" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" +source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" dependencies = [ "bytes 0.5.5", "fnv", @@ -6703,7 +6696,7 @@ dependencies = [ [[package]] name = "sc-peerset" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" +source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" dependencies = [ "futures 0.3.5", "libp2p", @@ -6716,7 +6709,7 @@ dependencies = [ [[package]] name = "sc-proposer-metrics" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" +source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" dependencies = [ "log 0.4.8", "substrate-prometheus-endpoint", @@ -6725,7 +6718,7 @@ dependencies = [ [[package]] name = "sc-rpc" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" +source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" dependencies = [ "futures 0.3.5", "hash-db", @@ -6757,7 +6750,7 @@ dependencies = [ [[package]] name = "sc-rpc-api" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" +source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -6781,7 +6774,7 @@ dependencies = [ [[package]] name = "sc-rpc-server" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" +source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" dependencies = [ "jsonrpc-core", "jsonrpc-http-server", @@ -6797,7 +6790,7 @@ dependencies = [ [[package]] name = "sc-service" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" +source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" dependencies = [ "derive_more 0.99.9", "directories", @@ -6841,6 +6834,7 @@ dependencies = [ "sp-consensus", "sp-core", "sp-externalities", + "sp-inherents", "sp-io", "sp-runtime", "sp-session", @@ -6859,7 +6853,7 @@ dependencies = [ [[package]] name = "sc-state-db" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" +source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" dependencies = [ "log 0.4.8", "parity-scale-codec", @@ -6873,7 +6867,7 @@ dependencies = [ [[package]] name = "sc-telemetry" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" +source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6894,7 +6888,7 @@ dependencies = [ [[package]] name = "sc-tracing" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" +source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" dependencies = [ "erased-serde", "log 0.4.8", @@ -6911,7 +6905,7 @@ dependencies = [ [[package]] name = "sc-transaction-graph" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" +source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -6932,7 +6926,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" +source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -7387,7 +7381,7 @@ dependencies = [ [[package]] name = "sp-allocator" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" +source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" dependencies = [ "derive_more 0.99.9", "log 0.4.8", @@ -7399,7 +7393,7 @@ dependencies = [ [[package]] name = "sp-api" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" +source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" dependencies = [ "hash-db", "parity-scale-codec", @@ -7414,7 +7408,7 @@ dependencies = [ [[package]] name = "sp-api-proc-macro" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" +source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" dependencies = [ "blake2-rfc", "proc-macro-crate", @@ -7426,7 +7420,7 @@ dependencies = [ [[package]] name = "sp-application-crypto" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" +source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" dependencies = [ "parity-scale-codec", "serde", @@ -7438,7 +7432,7 @@ dependencies = [ [[package]] name = "sp-arithmetic" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" +source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" dependencies = [ "integer-sqrt", "num-traits 0.2.12", @@ -7451,7 +7445,7 @@ dependencies = [ [[package]] name = "sp-authority-discovery" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" +source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" dependencies = [ "parity-scale-codec", "sp-api", @@ -7463,7 +7457,7 @@ dependencies = [ [[package]] name = "sp-authorship" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" +source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" dependencies = [ "parity-scale-codec", "sp-inherents", @@ -7474,7 +7468,7 @@ dependencies = [ [[package]] name = "sp-block-builder" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" +source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" dependencies = [ "parity-scale-codec", "sp-api", @@ -7486,7 +7480,7 @@ dependencies = [ [[package]] name = "sp-blockchain" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" +source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" dependencies = [ "derive_more 0.99.9", "log 0.4.8", @@ -7503,7 +7497,7 @@ dependencies = [ [[package]] name = "sp-chain-spec" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" +source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" dependencies = [ "serde", "serde_json", @@ -7512,7 +7506,7 @@ dependencies = [ [[package]] name = "sp-consensus" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" +source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -7537,7 +7531,7 @@ dependencies = [ [[package]] name = "sp-consensus-aura" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" +source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" dependencies = [ "parity-scale-codec", "sp-api", @@ -7551,7 +7545,7 @@ dependencies = [ [[package]] name = "sp-consensus-babe" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" +source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" dependencies = [ "merlin", "parity-scale-codec", @@ -7570,7 +7564,7 @@ dependencies = [ [[package]] name = "sp-consensus-slots" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" +source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" dependencies = [ "parity-scale-codec", "sp-runtime", @@ -7579,7 +7573,7 @@ dependencies = [ [[package]] name = "sp-consensus-vrf" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" +source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" dependencies = [ "parity-scale-codec", "schnorrkel", @@ -7591,7 +7585,7 @@ dependencies = [ [[package]] name = "sp-core" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" +source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" dependencies = [ "base58", "blake2-rfc", @@ -7635,7 +7629,7 @@ dependencies = [ [[package]] name = "sp-database" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" +source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" dependencies = [ "kvdb", "parking_lot 0.10.2", @@ -7644,7 +7638,7 @@ dependencies = [ [[package]] name = "sp-debug-derive" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" +source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" dependencies = [ "proc-macro2 1.0.18", "quote 1.0.7", @@ -7654,7 +7648,7 @@ dependencies = [ [[package]] name = "sp-externalities" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" +source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" dependencies = [ "environmental", "parity-scale-codec", @@ -7665,7 +7659,7 @@ dependencies = [ [[package]] name = "sp-finality-grandpa" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" +source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" dependencies = [ "finality-grandpa", "log 0.4.8", @@ -7681,7 +7675,7 @@ dependencies = [ [[package]] name = "sp-finality-tracker" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" +source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" dependencies = [ "parity-scale-codec", "sp-inherents", @@ -7691,7 +7685,7 @@ dependencies = [ [[package]] name = "sp-inherents" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" +source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" dependencies = [ "derive_more 0.99.9", "parity-scale-codec", @@ -7703,7 +7697,7 @@ dependencies = [ [[package]] name = "sp-io" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" +source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" dependencies = [ "futures 0.3.5", "hash-db", @@ -7724,7 +7718,7 @@ dependencies = [ [[package]] name = "sp-keyring" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" +source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" dependencies = [ "lazy_static", "sp-core", @@ -7735,7 +7729,7 @@ dependencies = [ [[package]] name = "sp-npos-elections" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" +source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" dependencies = [ "parity-scale-codec", "serde", @@ -7747,7 +7741,7 @@ dependencies = [ [[package]] name = "sp-npos-elections-compact" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" +source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -7758,7 +7752,7 @@ dependencies = [ [[package]] name = "sp-offchain" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" +source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" dependencies = [ "sp-api", "sp-core", @@ -7768,7 +7762,7 @@ dependencies = [ [[package]] name = "sp-panic-handler" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" +source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" dependencies = [ "backtrace", "log 0.4.8", @@ -7777,7 +7771,7 @@ dependencies = [ [[package]] name = "sp-rpc" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" +source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" dependencies = [ "serde", "sp-core", @@ -7786,7 +7780,7 @@ dependencies = [ [[package]] name = "sp-runtime" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" +source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" dependencies = [ "either", "hash256-std-hasher", @@ -7808,7 +7802,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" +source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" dependencies = [ "parity-scale-codec", "primitive-types", @@ -7823,7 +7817,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" +source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" dependencies = [ "Inflector", "proc-macro-crate", @@ -7835,7 +7829,7 @@ dependencies = [ [[package]] name = "sp-serializer" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" +source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" dependencies = [ "serde", "serde_json", @@ -7844,7 +7838,7 @@ dependencies = [ [[package]] name = "sp-session" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" +source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" dependencies = [ "parity-scale-codec", "sp-api", @@ -7857,7 +7851,7 @@ dependencies = [ [[package]] name = "sp-staking" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" +source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" dependencies = [ "parity-scale-codec", "sp-runtime", @@ -7867,7 +7861,7 @@ dependencies = [ [[package]] name = "sp-state-machine" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" +source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" dependencies = [ "hash-db", "itertools 0.9.0", @@ -7888,12 +7882,12 @@ dependencies = [ [[package]] name = "sp-std" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" +source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" [[package]] name = "sp-storage" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" +source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" dependencies = [ "impl-serde 0.2.3", "ref-cast", @@ -7905,7 +7899,7 @@ dependencies = [ [[package]] name = "sp-timestamp" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" +source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -7919,7 +7913,7 @@ dependencies = [ [[package]] name = "sp-tracing" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" +source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" dependencies = [ "log 0.4.8", "rental", @@ -7929,7 +7923,7 @@ dependencies = [ [[package]] name = "sp-transaction-pool" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" +source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -7944,7 +7938,7 @@ dependencies = [ [[package]] name = "sp-trie" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" +source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" dependencies = [ "hash-db", "memory-db", @@ -7958,7 +7952,7 @@ dependencies = [ [[package]] name = "sp-utils" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" +source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" dependencies = [ "futures 0.3.5", "futures-core", @@ -7970,7 +7964,7 @@ dependencies = [ [[package]] name = "sp-version" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" +source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" dependencies = [ "impl-serde 0.2.3", "parity-scale-codec", @@ -7982,7 +7976,7 @@ dependencies = [ [[package]] name = "sp-wasm-interface" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" +source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -8113,7 +8107,7 @@ dependencies = [ [[package]] name = "substrate-browser-utils" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" +source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" dependencies = [ "chrono", "console_error_panic_hook", @@ -8139,7 +8133,7 @@ dependencies = [ [[package]] name = "substrate-build-script-utils" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" +source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" dependencies = [ "platforms", ] @@ -8147,7 +8141,7 @@ dependencies = [ [[package]] name = "substrate-frame-rpc-system" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" +source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" dependencies = [ "frame-system-rpc-runtime-api", "futures 0.3.5", @@ -8170,7 +8164,7 @@ dependencies = [ [[package]] name = "substrate-prometheus-endpoint" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" +source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" dependencies = [ "async-std", "derive_more 0.99.9", @@ -8184,7 +8178,7 @@ dependencies = [ [[package]] name = "substrate-test-client" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" +source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" dependencies = [ "futures 0.1.29", "futures 0.3.5", @@ -8210,7 +8204,7 @@ dependencies = [ [[package]] name = "substrate-test-runtime" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" +source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" dependencies = [ "cfg-if", "frame-executive", @@ -8250,7 +8244,7 @@ dependencies = [ [[package]] name = "substrate-test-runtime-client" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" +source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" dependencies = [ "futures 0.3.5", "parity-scale-codec", @@ -8271,7 +8265,7 @@ dependencies = [ [[package]] name = "substrate-wasm-builder-runner" version = "1.0.6" -source = "git+https://github.com/paritytech/substrate#8180062d6c1c542015988527fecf320974b21051" +source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" [[package]] name = "substrate-wasm-builder-runner" diff --git a/node/network/bitfield-distribution/Cargo.toml b/node/network/bitfield-distribution/Cargo.toml index a6dab03071..aebf6f9a65 100644 --- a/node/network/bitfield-distribution/Cargo.toml +++ b/node/network/bitfield-distribution/Cargo.toml @@ -26,4 +26,4 @@ maplit = "1.0.2" smol = "0.2.0" smol-timeout = "0.1.0" env_logger = "0.7.1" -assert_matches = "1.3.0" \ No newline at end of file +assert_matches = "1.3.0" diff --git a/node/service/src/lib.rs b/node/service/src/lib.rs index 49df3da528..f528b6be34 100644 --- a/node/service/src/lib.rs +++ b/node/service/src/lib.rs @@ -36,7 +36,7 @@ use sp_core::traits::SpawnNamed; pub use service::{ Role, PruningMode, TransactionPoolOptions, Error, RuntimeGenesis, TFullClient, TLightClient, TFullBackend, TLightBackend, TFullCallExecutor, TLightCallExecutor, - Configuration, ChainSpec, ServiceComponents, TaskManager, + Configuration, ChainSpec, TaskManager, }; pub use service::config::{DatabaseConfig, PrometheusConfig}; pub use sc_executor::NativeExecutionDispatch; @@ -157,26 +157,25 @@ type LightClient = service::TLightClientWithBackend; #[cfg(feature = "full-node")] -fn full_params(mut config: Configuration) -> Result<( - service::ServiceParams< - Block, - FullClient, +fn new_partial(config: &mut Configuration) -> Result< + service::PartialComponents< + FullClient, FullBackend, FullSelectChain, babe::BabeImportQueue>, sc_transaction_pool::FullPool>, - polkadot_rpc::RpcExtension, - FullBackend, + ( + impl Fn(polkadot_rpc::DenyUnsafe) -> polkadot_rpc::RpcExtension, + ( + babe::BabeBlockImport< + Block, FullClient, FullGrandpaBlockImport + >, + grandpa::LinkHalf, FullSelectChain>, + babe::BabeLink + ), + grandpa::SharedVoterState, + ) >, - FullSelectChain, - ( - babe::BabeBlockImport< - Block, FullClient, FullGrandpaBlockImport - >, - grandpa::LinkHalf, FullSelectChain>, - babe::BabeLink - ), - inherents::InherentDataProviders, - grandpa::SharedVoterState, -), Error> + Error +> where RuntimeApi: ConstructRuntimeApi> + Send + Sync + 'static, RuntimeApi::RuntimeApi: @@ -184,23 +183,18 @@ fn full_params(mut config: Configuration) -> Re Executor: NativeExecutionDispatch + 'static, Extrinsic: RuntimeExtrinsic, { - set_prometheus_registry(&mut config)?; + set_prometheus_registry(config)?; let inherent_data_providers = inherents::InherentDataProviders::new(); - let (client, backend, keystore, task_manager) = service::new_full_parts::(&config)?; let client = Arc::new(client); let select_chain = sc_consensus::LongestChain::new(backend.clone()); - let pool_api = sc_transaction_pool::FullChainApi::new( - client.clone(), config.prometheus_registry(), - ); let transaction_pool = sc_transaction_pool::BasicPool::new_full( config.transaction_pool.clone(), - std::sync::Arc::new(pool_api), config.prometheus_registry(), task_manager.spawn_handle(), client.clone(), @@ -255,7 +249,7 @@ fn full_params(mut config: Configuration) -> Re let transaction_pool = transaction_pool.clone(); let select_chain = select_chain.clone(); - Box::new(move |deny_unsafe| -> polkadot_rpc::RpcExtension { + move |deny_unsafe| -> polkadot_rpc::RpcExtension { let deps = polkadot_rpc::FullDeps { client: client.clone(), pool: transaction_pool.clone(), @@ -273,23 +267,14 @@ fn full_params(mut config: Configuration) -> Re }; polkadot_rpc::create_full(deps) - }) - }; - - let provider = client.clone() as Arc>; - let finality_proof_provider = Arc::new(GrandpaFinalityProofProvider::new(backend.clone(), provider)) as _; - - let params = service::ServiceParams { - config, backend, client, import_queue, keystore, task_manager, rpc_extensions_builder, - transaction_pool, - block_announce_validator_builder: None, - finality_proof_provider: Some(finality_proof_provider), - finality_proof_request_builder: None, - on_demand: None, - remote_blockchain: None, + } }; - Ok((params, select_chain, import_setup, inherent_data_providers, rpc_setup)) + Ok(service::PartialComponents { + client, backend, task_manager, keystore, select_chain, import_queue, transaction_pool, + inherent_data_providers, + other: (rpc_extensions_builder, import_setup, rpc_setup) + }) } fn real_overseer( @@ -319,7 +304,7 @@ fn real_overseer( #[cfg(feature = "full-node")] fn new_full( - config: Configuration, + mut config: Configuration, collating_for: Option<(CollatorId, ParaId)>, _max_block_data_size: Option, _authority_discovery_disabled: bool, @@ -346,17 +331,52 @@ fn new_full( let disable_grandpa = config.disable_grandpa; let name = config.network.node_name.clone(); - let (params, select_chain, import_setup, inherent_data_providers, rpc_setup) - = full_params::(config)?; + let service::PartialComponents { + client, backend, mut task_manager, keystore, select_chain, import_queue, transaction_pool, + inherent_data_providers, + other: (rpc_extensions_builder, import_setup, rpc_setup) + } = new_partial::(&mut config)?; + + let prometheus_registry = config.prometheus_registry().cloned(); + + let finality_proof_provider = + GrandpaFinalityProofProvider::new_for_service(backend.clone(), client.clone()); + + let (network, network_status_sinks, system_rpc_tx) = + service::build_network(service::BuildNetworkParams { + config: &config, + client: client.clone(), + transaction_pool: transaction_pool.clone(), + spawn_handle: task_manager.spawn_handle(), + import_queue, + on_demand: None, + block_announce_validator_builder: None, + finality_proof_request_builder: None, + finality_proof_provider: Some(finality_proof_provider.clone()), + })?; + + if config.offchain_worker.enabled { + service::build_offchain_workers( + &config, backend.clone(), task_manager.spawn_handle(), client.clone(), network.clone(), + ); + } - let client = params.client.clone(); - let keystore = params.keystore.clone(); - let transaction_pool = params.transaction_pool.clone(); - let prometheus_registry = params.config.prometheus_registry().cloned(); + let telemetry_connection_sinks = service::TelemetryConnectionSinks::default(); - let ServiceComponents { - network, task_manager, telemetry_on_connect_sinks, .. - } = service::build(params)?; + service::spawn_tasks(service::SpawnTasksParams { + config, + backend: backend.clone(), + client: client.clone(), + keystore: keystore.clone(), + network: network.clone(), + rpc_extensions_builder: Box::new(rpc_extensions_builder), + transaction_pool: transaction_pool.clone(), + task_manager: &mut task_manager, + on_demand: None, + remote_blockchain: None, + telemetry_connection_sinks: telemetry_connection_sinks.clone(), + network_status_sinks, system_rpc_tx, + })?; let (block_import, link_half, babe_link) = import_setup; @@ -481,7 +501,7 @@ fn new_full( link: link_half, network: network.clone(), inherent_data_providers: inherent_data_providers.clone(), - telemetry_on_connect: Some(telemetry_on_connect_sinks.on_connect_stream()), + telemetry_on_connect: Some(telemetry_connection_sinks.on_connect_stream()), voting_rule, prometheus_registry: prometheus_registry, shared_voter_state, @@ -516,20 +536,17 @@ fn new_light(mut config: Configuration) -> Result< crate::set_prometheus_registry(&mut config)?; use sc_client_api::backend::RemoteBackend; - let (client, backend, keystore, task_manager, on_demand) = + let (client, backend, keystore, mut task_manager, on_demand) = service::new_light_parts::(&config)?; let select_chain = sc_consensus::LongestChain::new(backend.clone()); - let pool_api = sc_transaction_pool::LightChainApi::new( - client.clone(), - on_demand.clone(), - ); let transaction_pool = Arc::new(sc_transaction_pool::BasicPool::new_light( config.transaction_pool.clone(), - Arc::new(pool_api), config.prometheus_registry(), task_manager.spawn_handle(), + client.clone(), + on_demand.clone(), )); let grandpa_block_import = grandpa::light_block_import( @@ -562,8 +579,27 @@ fn new_light(mut config: Configuration) -> Result< config.prometheus_registry(), )?; - let provider = client.clone() as Arc>; - let finality_proof_provider = Arc::new(GrandpaFinalityProofProvider::new(backend.clone(), provider)); + let finality_proof_provider = + GrandpaFinalityProofProvider::new_for_service(backend.clone(), client.clone()); + + let (network, network_status_sinks, system_rpc_tx) = + service::build_network(service::BuildNetworkParams { + config: &config, + client: client.clone(), + transaction_pool: transaction_pool.clone(), + spawn_handle: task_manager.spawn_handle(), + import_queue, + on_demand: Some(on_demand.clone()), + block_announce_validator_builder: None, + finality_proof_request_builder: Some(finality_proof_request_builder), + finality_proof_provider: Some(finality_proof_provider), + })?; + + if config.offchain_worker.enabled { + service::build_offchain_workers( + &config, backend.clone(), task_manager.spawn_handle(), client.clone(), network.clone(), + ); + } let light_deps = polkadot_rpc::LightDeps { remote_blockchain: backend.remote_blockchain(), @@ -574,17 +610,14 @@ fn new_light(mut config: Configuration) -> Result< let rpc_extensions = polkadot_rpc::create_light(light_deps); - let ServiceComponents { task_manager, .. } = service::build(service::ServiceParams { - config, - block_announce_validator_builder: None, - finality_proof_request_builder: Some(finality_proof_request_builder), - finality_proof_provider: Some(finality_proof_provider), + service::spawn_tasks(service::SpawnTasksParams { on_demand: Some(on_demand), remote_blockchain: Some(backend.remote_blockchain()), rpc_extensions_builder: Box::new(service::NoopRpcExtensionBuilder(rpc_extensions)), - client: client.clone(), - transaction_pool: transaction_pool.clone(), - import_queue, keystore, backend, task_manager, + task_manager: &mut task_manager, + telemetry_connection_sinks: service::TelemetryConnectionSinks::default(), + config, keystore, backend, transaction_pool, client, network, network_status_sinks, + system_rpc_tx, })?; Ok(task_manager) @@ -609,8 +642,8 @@ where Extrinsic: RuntimeExtrinsic, { config.keystore = service::config::KeystoreConfig::InMemory; - let (service::ServiceParams { client, backend, import_queue, task_manager, .. }, ..) - = full_params::(config)?; + let service::PartialComponents { client, backend, import_queue, task_manager, .. } + = new_partial::(&mut config)?; Ok((client, backend, import_queue, task_manager)) } diff --git a/rpc/src/lib.rs b/rpc/src/lib.rs index c73b478329..dbff9b0776 100644 --- a/rpc/src/lib.rs +++ b/rpc/src/lib.rs @@ -28,8 +28,8 @@ use sp_consensus::SelectChain; use sp_consensus_babe::BabeApi; use sc_client_api::light::{Fetcher, RemoteBlockchain}; use sc_consensus_babe::Epoch; -use sc_rpc::DenyUnsafe; use sp_block_builder::BlockBuilder; +pub use sc_rpc::DenyUnsafe; /// A type representing all RPC extensions. pub type RpcExtension = jsonrpc_core::IoHandler; diff --git a/service/src/lib.rs b/service/src/lib.rs index 55cda65242..75399824a5 100644 --- a/service/src/lib.rs +++ b/service/src/lib.rs @@ -33,7 +33,7 @@ use sp_trie::PrefixedMemoryDB; pub use service::{ Role, PruningMode, TransactionPoolOptions, Error, RuntimeGenesis, RpcHandlers, TFullClient, TLightClient, TFullBackend, TLightBackend, TFullCallExecutor, TLightCallExecutor, - Configuration, ChainSpec, ServiceComponents, TaskManager, + Configuration, ChainSpec, TaskManager, }; pub use service::config::{DatabaseConfig, PrometheusConfig}; pub use sc_executor::NativeExecutionDispatch; @@ -148,26 +148,25 @@ type LightClient = service::TLightClientWithBackend; #[cfg(feature = "full-node")] -pub fn full_params(mut config: Configuration, test: bool) -> Result<( - service::ServiceParams< - Block, - FullClient, +pub fn new_partial(config: &mut Configuration, test: bool) -> Result< + service::PartialComponents< + FullClient, FullBackend, FullSelectChain, babe::BabeImportQueue>, sc_transaction_pool::FullPool>, - polkadot_rpc::RpcExtension, - FullBackend, + ( + impl Fn(polkadot_rpc::DenyUnsafe) -> polkadot_rpc::RpcExtension, + ( + babe::BabeBlockImport< + Block, FullClient, FullGrandpaBlockImport + >, + grandpa::LinkHalf, FullSelectChain>, + babe::BabeLink + ), + grandpa::SharedVoterState, + ) >, - FullSelectChain, - ( - babe::BabeBlockImport< - Block, FullClient, FullGrandpaBlockImport - >, - grandpa::LinkHalf, FullSelectChain>, - babe::BabeLink - ), - inherents::InherentDataProviders, - grandpa::SharedVoterState, -), Error> + Error +> where RuntimeApi: ConstructRuntimeApi> + Send + Sync + 'static, RuntimeApi::RuntimeApi: @@ -184,19 +183,14 @@ pub fn full_params(mut config: Configuration, t let inherent_data_providers = inherents::InherentDataProviders::new(); - let (client, backend, keystore, task_manager) = service::new_full_parts::(&config)?; let client = Arc::new(client); let select_chain = sc_consensus::LongestChain::new(backend.clone()); - let pool_api = sc_transaction_pool::FullChainApi::new( - client.clone(), config.prometheus_registry(), - ); let transaction_pool = sc_transaction_pool::BasicPool::new_full( config.transaction_pool.clone(), - std::sync::Arc::new(pool_api), config.prometheus_registry(), task_manager.spawn_handle(), client.clone(), @@ -251,7 +245,7 @@ pub fn full_params(mut config: Configuration, t let transaction_pool = transaction_pool.clone(); let select_chain = select_chain.clone(); - Box::new(move |deny_unsafe| -> polkadot_rpc::RpcExtension { + move |deny_unsafe| -> polkadot_rpc::RpcExtension { let deps = polkadot_rpc::FullDeps { client: client.clone(), pool: transaction_pool.clone(), @@ -269,28 +263,19 @@ pub fn full_params(mut config: Configuration, t }; polkadot_rpc::create_full(deps) - }) - }; - - let provider = client.clone() as Arc>; - let finality_proof_provider = Arc::new(GrandpaFinalityProofProvider::new(backend.clone(), provider)) as _; - - let params = service::ServiceParams { - config, backend, client, import_queue, keystore, task_manager, rpc_extensions_builder, - transaction_pool, - block_announce_validator_builder: None, - finality_proof_provider: Some(finality_proof_provider), - finality_proof_request_builder: None, - on_demand: None, - remote_blockchain: None, + } }; - Ok((params, select_chain, import_setup, inherent_data_providers, rpc_setup)) + Ok(service::PartialComponents { + client, backend, task_manager, keystore, select_chain, import_queue, transaction_pool, + inherent_data_providers, + other: (rpc_extensions_builder, import_setup, rpc_setup) + }) } #[cfg(feature = "full-node")] pub fn new_full( - config: Configuration, + mut config: Configuration, collating_for: Option<(CollatorId, parachain::Id)>, max_block_data_size: Option, authority_discovery_disabled: bool, @@ -327,18 +312,52 @@ pub fn new_full( let disable_grandpa = config.disable_grandpa; let name = config.network.node_name.clone(); - let (params, select_chain, import_setup, inherent_data_providers, rpc_setup) - = full_params::(config, test)?; + let service::PartialComponents { + client, backend, mut task_manager, keystore, select_chain, import_queue, transaction_pool, + inherent_data_providers, + other: (rpc_extensions_builder, import_setup, rpc_setup) + } = new_partial::(&mut config, test)?; + + let prometheus_registry = config.prometheus_registry().cloned(); + + let finality_proof_provider = + GrandpaFinalityProofProvider::new_for_service(backend.clone(), client.clone()); + + let (network, network_status_sinks, system_rpc_tx) = + service::build_network(service::BuildNetworkParams { + config: &config, + client: client.clone(), + transaction_pool: transaction_pool.clone(), + spawn_handle: task_manager.spawn_handle(), + import_queue, + on_demand: None, + block_announce_validator_builder: None, + finality_proof_request_builder: None, + finality_proof_provider: Some(finality_proof_provider.clone()), + })?; + + if config.offchain_worker.enabled { + service::build_offchain_workers( + &config, backend.clone(), task_manager.spawn_handle(), client.clone(), network.clone(), + ); + } - let client = params.client.clone(); - let keystore = params.keystore.clone(); - let transaction_pool = params.transaction_pool.clone(); - let prometheus_registry = params.config.prometheus_registry().cloned(); + let telemetry_connection_sinks = service::TelemetryConnectionSinks::default(); - let ServiceComponents { - network, - task_manager, telemetry_on_connect_sinks, rpc_handlers, .. - } = service::build(params)?; + let rpc_handlers = service::spawn_tasks(service::SpawnTasksParams { + config, + backend: backend.clone(), + client: client.clone(), + keystore: keystore.clone(), + network: network.clone(), + rpc_extensions_builder: Box::new(rpc_extensions_builder), + transaction_pool: transaction_pool.clone(), + task_manager: &mut task_manager, + on_demand: None, + remote_blockchain: None, + telemetry_connection_sinks: telemetry_connection_sinks.clone(), + network_status_sinks, system_rpc_tx, + })?; let (block_import, link_half, babe_link) = import_setup; @@ -547,7 +566,7 @@ pub fn new_full( link: link_half, network: network.clone(), inherent_data_providers: inherent_data_providers.clone(), - telemetry_on_connect: Some(telemetry_on_connect_sinks.on_connect_stream()), + telemetry_on_connect: Some(telemetry_connection_sinks.on_connect_stream()), voting_rule, prometheus_registry: prometheus_registry.clone(), shared_voter_state, @@ -585,20 +604,17 @@ fn new_light(mut config: Configuration) -> Result< *registry = Registry::new_custom(Some("polkadot".into()), None)?; } - let (client, backend, keystore, task_manager, on_demand) = + let (client, backend, keystore, mut task_manager, on_demand) = service::new_light_parts::(&config)?; let select_chain = sc_consensus::LongestChain::new(backend.clone()); - let pool_api = sc_transaction_pool::LightChainApi::new( - client.clone(), - on_demand.clone(), - ); let transaction_pool = Arc::new(sc_transaction_pool::BasicPool::new_light( config.transaction_pool.clone(), - Arc::new(pool_api), config.prometheus_registry(), task_manager.spawn_handle(), + client.clone(), + on_demand.clone(), )); let grandpa_block_import = grandpa::light_block_import( @@ -631,8 +647,27 @@ fn new_light(mut config: Configuration) -> Result< config.prometheus_registry(), )?; - let provider = client.clone() as Arc>; - let finality_proof_provider = Arc::new(GrandpaFinalityProofProvider::new(backend.clone(), provider)); + let finality_proof_provider = + GrandpaFinalityProofProvider::new_for_service(backend.clone(), client.clone()); + + let (network, network_status_sinks, system_rpc_tx) = + service::build_network(service::BuildNetworkParams { + config: &config, + client: client.clone(), + transaction_pool: transaction_pool.clone(), + spawn_handle: task_manager.spawn_handle(), + import_queue, + on_demand: Some(on_demand.clone()), + block_announce_validator_builder: None, + finality_proof_request_builder: Some(finality_proof_request_builder), + finality_proof_provider: Some(finality_proof_provider), + })?; + + if config.offchain_worker.enabled { + service::build_offchain_workers( + &config, backend.clone(), task_manager.spawn_handle(), client.clone(), network.clone(), + ); + } let light_deps = polkadot_rpc::LightDeps { remote_blockchain: backend.remote_blockchain(), @@ -643,17 +678,14 @@ fn new_light(mut config: Configuration) -> Result< let rpc_extensions = polkadot_rpc::create_light(light_deps); - let ServiceComponents { task_manager, rpc_handlers, .. } = service::build(service::ServiceParams { - config, - block_announce_validator_builder: None, - finality_proof_request_builder: Some(finality_proof_request_builder), - finality_proof_provider: Some(finality_proof_provider), + let rpc_handlers = service::spawn_tasks(service::SpawnTasksParams { on_demand: Some(on_demand), remote_blockchain: Some(backend.remote_blockchain()), rpc_extensions_builder: Box::new(service::NoopRpcExtensionBuilder(rpc_extensions)), - client: client.clone(), - transaction_pool: transaction_pool.clone(), - import_queue, keystore, backend, task_manager, + task_manager: &mut task_manager, + telemetry_connection_sinks: service::TelemetryConnectionSinks::default(), + config, keystore, backend, transaction_pool, client, network, network_status_sinks, + system_rpc_tx, })?; Ok((task_manager, rpc_handlers)) @@ -678,8 +710,8 @@ where Extrinsic: RuntimeExtrinsic, { config.keystore = service::config::KeystoreConfig::InMemory; - let (service::ServiceParams { client, backend, import_queue, task_manager, .. }, ..) - = full_params::(config, false)?; + let service::PartialComponents { client, backend, import_queue, task_manager, .. } + = new_partial::(&mut config, false)?; Ok((client, backend, import_queue, task_manager)) } -- GitLab From 3664c9ac858bba2ec2ae0711f0aac35a40e1b395 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Tue, 28 Jul 2020 20:39:32 +0200 Subject: [PATCH 111/192] Use the correct `TaskExecutor` in validation (#1489) --- network/src/protocol/mod.rs | 10 ++++++---- validation/src/shared_table/mod.rs | 11 +++++++---- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/network/src/protocol/mod.rs b/network/src/protocol/mod.rs index 22e72dcfd6..6dfef09da8 100644 --- a/network/src/protocol/mod.rs +++ b/network/src/protocol/mod.rs @@ -222,7 +222,7 @@ pub fn start( C: ChainContext + 'static, Api: ProvideRuntimeApi + Send + Sync + 'static, Api::Api: ParachainHost, - SP: SpawnNamed + Clone + Send + 'static, + SP: SpawnNamed + Clone + Send + Unpin + 'static, { const SERVICE_TO_WORKER_BUF: usize = 256; @@ -830,7 +830,7 @@ struct Worker { impl Worker where Api: ProvideRuntimeApi + Send + Sync + 'static, Api::Api: ParachainHost, - Sp: SpawnNamed + Clone, + Sp: SpawnNamed + Clone + Unpin + 'static, Gossip: GossipOps, { // spawns a background task to spawn consensus networking. @@ -882,6 +882,7 @@ impl Worker where self.gossip_handle.clone(), self.background_to_main_sender.clone(), exit, + self.executor.clone(), ).boxed(), ); } @@ -1062,7 +1063,7 @@ async fn worker_loop( ) where Api: ProvideRuntimeApi + Send + Sync + 'static, Api::Api: ParachainHost, - Sp: SpawnNamed + Clone, + Sp: SpawnNamed + Clone + Unpin + 'static, { const BACKGROUND_TO_MAIN_BUF: usize = 16; @@ -1149,6 +1150,7 @@ async fn statement_import_loop( gossip_handle: impl GossipOps, mut to_worker: mpsc::Sender, mut exit: exit_future::Exit, + spawner: impl SpawnNamed + Clone + Unpin + 'static, ) where Api: ProvideRuntimeApi + Send + Sync + 'static, Api::Api: ParachainHost, @@ -1221,7 +1223,7 @@ async fn statement_import_loop( let table = table.clone(); let gossip_handle = gossip_handle.clone(); - let work = producer.prime(api.clone()).validate().map(move |res| { + let work = producer.prime(api.clone(), spawner.clone()).validate().map(move |res| { let validated = match res { Err(e) => { debug!(target: "p_net", "Failed to act on statement: {}", e); diff --git a/validation/src/shared_table/mod.rs b/validation/src/shared_table/mod.rs index 58cc56cb7f..1e77c21b38 100644 --- a/validation/src/shared_table/mod.rs +++ b/validation/src/shared_table/mod.rs @@ -37,7 +37,7 @@ use bitvec::bitvec; use super::GroupInfo; use self::includable::IncludabilitySender; -use primitives::Pair; +use primitives::{Pair, traits::SpawnNamed}; use sp_api::ProvideRuntimeApi; use crate::pipeline::{FullOutput, ValidationPool}; @@ -287,8 +287,11 @@ pub struct ParachainWork { impl ParachainWork { /// Prime the parachain work with an API reference for extracting /// chain information. - pub fn prime>(self, api: Arc

) - -> PrimedParachainWork< + pub fn prime>( + self, + api: Arc

, + spawner: impl SpawnNamed + Clone + Unpin + 'static, + ) -> PrimedParachainWork< Fetch, impl Send + FnMut(&PoVBlock, &AbridgedCandidateReceipt) -> Result + Unpin, @@ -312,7 +315,7 @@ impl ParachainWork { &expected_relay_parent, max_block_data_size, n_validators, - primitives::testing::TaskExecutor::new(), + spawner.clone(), )?; full_output.check_consistency(candidate)?; -- GitLab From ef29680b3d30b8279973872a694ca80096590c6d Mon Sep 17 00:00:00 2001 From: Peter Goodspeed-Niklaus Date: Tue, 28 Jul 2020 22:18:54 +0200 Subject: [PATCH 112/192] add simple name derivation heuristic for JobManager Subsystem impl (#1490) Subsystems are encouraged to either typedef themselves as appropriate `JobManager` instances for their job type, or wrap a `JobManager` instance and delegate the `Subsystem` impl. In both cases, we want to use a sensible, non-repeated subsystem name for appropriate logging and debugging. This PR adds a heuristic: if the job name ends in the literal "Job", then that gets stripped. Otherwise, the job name is used. This improves on the previous situation, in which subsystems typedef'd to or wrapping `JobManager` all got the same constant (!) name. --- node/subsystem/src/util.rs | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/node/subsystem/src/util.rs b/node/subsystem/src/util.rs index ce31bebeda..440fda08f0 100644 --- a/node/subsystem/src/util.rs +++ b/node/subsystem/src/util.rs @@ -715,7 +715,7 @@ where }); SpawnedSubsystem { - name: "JobManager", + name: Job::NAME.strip_suffix("Job").unwrap_or(Job::NAME), future, } } @@ -737,6 +737,8 @@ mod tests { ActiveLeavesUpdate, FromOverseer, OverseerSignal, + SpawnedSubsystem, + Subsystem, }; use futures::{ channel::mpsc, @@ -959,4 +961,16 @@ mod tests { ); }); } + + #[test] + fn test_subsystem_impl_and_name_derivation() { + let pool = sp_core::testing::TaskExecutor::new(); + let (context, _) = make_subsystem_context::(pool.clone()); + + let SpawnedSubsystem { name, .. } = FakeCandidateSelectionSubsystem::new( + pool, + HashMap::new(), + ).start(context); + assert_eq!(name, "FakeCandidateSelection"); + } } -- GitLab From 12a7d80c69731cced0a3b879d24e717a5a73f993 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Tue, 28 Jul 2020 22:43:38 +0200 Subject: [PATCH 113/192] Update scale codec to latest version to fix bug in future rustc version (#1491) * Update scale codec to latest version to fix bug in future rustc version Companion of: https://github.com/paritytech/substrate/pull/6746 * 'Update substrate' Co-authored-by: parity-processbot <> --- Cargo.lock | 282 +++++++++--------- availability-store/Cargo.toml | 2 +- collator/Cargo.toml | 2 +- core-primitives/Cargo.toml | 2 +- erasure-coding/Cargo.toml | 2 +- network/Cargo.toml | 2 +- node/core/proposer/Cargo.toml | 2 +- node/network/bitfield-distribution/Cargo.toml | 2 +- node/network/bridge/Cargo.toml | 2 +- node/network/pov-distribution/Cargo.toml | 2 +- .../network/statement-distribution/Cargo.toml | 2 +- node/primitives/Cargo.toml | 2 +- node/service/Cargo.toml | 2 +- node/subsystem/Cargo.toml | 2 +- parachain/Cargo.toml | 2 +- parachain/test-parachains/Cargo.toml | 2 +- parachain/test-parachains/adder/Cargo.toml | 2 +- .../test-parachains/adder/collator/Cargo.toml | 2 +- primitives/Cargo.toml | 2 +- rpc/Cargo.toml | 2 +- runtime/common/Cargo.toml | 2 +- runtime/kusama/Cargo.toml | 2 +- runtime/parachains/Cargo.toml | 2 +- runtime/polkadot/Cargo.toml | 2 +- runtime/test-runtime/Cargo.toml | 2 +- runtime/test-runtime/client/Cargo.toml | 2 +- runtime/westend/Cargo.toml | 2 +- service/Cargo.toml | 2 +- statement-table/Cargo.toml | 2 +- validation/Cargo.toml | 2 +- 30 files changed, 170 insertions(+), 170 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index c9cfa540d4..a6e3e8f79e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1370,7 +1370,7 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "fork-tree" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" +source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" dependencies = [ "parity-scale-codec", ] @@ -1378,7 +1378,7 @@ dependencies = [ [[package]] name = "frame-benchmarking" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" +source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" dependencies = [ "frame-support", "frame-system", @@ -1395,7 +1395,7 @@ dependencies = [ [[package]] name = "frame-benchmarking-cli" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" +source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" dependencies = [ "Inflector", "frame-benchmarking", @@ -1414,7 +1414,7 @@ dependencies = [ [[package]] name = "frame-executive" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" +source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" dependencies = [ "frame-support", "frame-system", @@ -1429,7 +1429,7 @@ dependencies = [ [[package]] name = "frame-metadata" version = "11.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" +source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" dependencies = [ "parity-scale-codec", "serde", @@ -1440,7 +1440,7 @@ dependencies = [ [[package]] name = "frame-support" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" +source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" dependencies = [ "bitmask", "frame-metadata", @@ -1465,7 +1465,7 @@ dependencies = [ [[package]] name = "frame-support-procedural" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" +source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" dependencies = [ "frame-support-procedural-tools", "proc-macro2 1.0.18", @@ -1476,7 +1476,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" +source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" dependencies = [ "frame-support-procedural-tools-derive", "proc-macro-crate", @@ -1488,7 +1488,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools-derive" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" +source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" dependencies = [ "proc-macro2 1.0.18", "quote 1.0.7", @@ -1498,7 +1498,7 @@ dependencies = [ [[package]] name = "frame-system" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" +source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" dependencies = [ "frame-support", "impl-trait-for-tuples", @@ -1514,7 +1514,7 @@ dependencies = [ [[package]] name = "frame-system-benchmarking" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" +source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" dependencies = [ "frame-benchmarking", "frame-support", @@ -1528,7 +1528,7 @@ dependencies = [ [[package]] name = "frame-system-rpc-runtime-api" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" +source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" dependencies = [ "parity-scale-codec", "sp-api", @@ -3542,7 +3542,7 @@ dependencies = [ [[package]] name = "pallet-authority-discovery" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" +source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" dependencies = [ "frame-support", "frame-system", @@ -3558,7 +3558,7 @@ dependencies = [ [[package]] name = "pallet-authorship" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" +source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" dependencies = [ "frame-support", "frame-system", @@ -3573,7 +3573,7 @@ dependencies = [ [[package]] name = "pallet-babe" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" +source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" dependencies = [ "frame-benchmarking", "frame-support", @@ -3598,7 +3598,7 @@ dependencies = [ [[package]] name = "pallet-balances" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" +source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" dependencies = [ "frame-benchmarking", "frame-support", @@ -3612,7 +3612,7 @@ dependencies = [ [[package]] name = "pallet-collective" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" +source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" dependencies = [ "frame-benchmarking", "frame-support", @@ -3628,7 +3628,7 @@ dependencies = [ [[package]] name = "pallet-democracy" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" +source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" dependencies = [ "frame-benchmarking", "frame-support", @@ -3643,7 +3643,7 @@ dependencies = [ [[package]] name = "pallet-elections-phragmen" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" +source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" dependencies = [ "frame-benchmarking", "frame-support", @@ -3658,7 +3658,7 @@ dependencies = [ [[package]] name = "pallet-finality-tracker" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" +source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" dependencies = [ "frame-support", "frame-system", @@ -3674,7 +3674,7 @@ dependencies = [ [[package]] name = "pallet-grandpa" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" +source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" dependencies = [ "frame-benchmarking", "frame-support", @@ -3696,7 +3696,7 @@ dependencies = [ [[package]] name = "pallet-identity" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" +source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" dependencies = [ "enumflags2", "frame-benchmarking", @@ -3712,7 +3712,7 @@ dependencies = [ [[package]] name = "pallet-im-online" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" +source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" dependencies = [ "frame-benchmarking", "frame-support", @@ -3732,7 +3732,7 @@ dependencies = [ [[package]] name = "pallet-indices" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" +source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" dependencies = [ "frame-support", "frame-system", @@ -3748,7 +3748,7 @@ dependencies = [ [[package]] name = "pallet-membership" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" +source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" dependencies = [ "frame-support", "frame-system", @@ -3762,7 +3762,7 @@ dependencies = [ [[package]] name = "pallet-multisig" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" +source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" dependencies = [ "frame-support", "frame-system", @@ -3777,7 +3777,7 @@ dependencies = [ [[package]] name = "pallet-nicks" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" +source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" dependencies = [ "frame-support", "frame-system", @@ -3791,7 +3791,7 @@ dependencies = [ [[package]] name = "pallet-offences" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" +source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" dependencies = [ "frame-support", "frame-system", @@ -3806,7 +3806,7 @@ dependencies = [ [[package]] name = "pallet-offences-benchmarking" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" +source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" dependencies = [ "frame-benchmarking", "frame-support", @@ -3827,7 +3827,7 @@ dependencies = [ [[package]] name = "pallet-proxy" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" +source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" dependencies = [ "frame-support", "frame-system", @@ -3842,7 +3842,7 @@ dependencies = [ [[package]] name = "pallet-randomness-collective-flip" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" +source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" dependencies = [ "frame-support", "frame-system", @@ -3855,7 +3855,7 @@ dependencies = [ [[package]] name = "pallet-recovery" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" +source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" dependencies = [ "enumflags2", "frame-support", @@ -3870,7 +3870,7 @@ dependencies = [ [[package]] name = "pallet-scheduler" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" +source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" dependencies = [ "frame-benchmarking", "frame-support", @@ -3885,7 +3885,7 @@ dependencies = [ [[package]] name = "pallet-session" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" +source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" dependencies = [ "frame-support", "frame-system", @@ -3905,7 +3905,7 @@ dependencies = [ [[package]] name = "pallet-session-benchmarking" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" +source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" dependencies = [ "frame-benchmarking", "frame-support", @@ -3921,7 +3921,7 @@ dependencies = [ [[package]] name = "pallet-society" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" +source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" dependencies = [ "frame-support", "frame-system", @@ -3935,7 +3935,7 @@ dependencies = [ [[package]] name = "pallet-staking" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" +source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" dependencies = [ "frame-benchmarking", "frame-support", @@ -3957,7 +3957,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-curve" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" +source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -3968,7 +3968,7 @@ dependencies = [ [[package]] name = "pallet-sudo" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" +source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" dependencies = [ "frame-support", "frame-system", @@ -3982,7 +3982,7 @@ dependencies = [ [[package]] name = "pallet-timestamp" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" +source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" dependencies = [ "frame-benchmarking", "frame-support", @@ -4000,7 +4000,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" +source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" dependencies = [ "frame-support", "frame-system", @@ -4017,7 +4017,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" +source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" dependencies = [ "jsonrpc-core", "jsonrpc-core-client", @@ -4035,7 +4035,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc-runtime-api" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" +source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" dependencies = [ "frame-support", "parity-scale-codec", @@ -4048,7 +4048,7 @@ dependencies = [ [[package]] name = "pallet-treasury" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" +source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" dependencies = [ "frame-benchmarking", "frame-support", @@ -4063,7 +4063,7 @@ dependencies = [ [[package]] name = "pallet-utility" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" +source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" dependencies = [ "frame-benchmarking", "frame-support", @@ -4079,7 +4079,7 @@ dependencies = [ [[package]] name = "pallet-vesting" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" +source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" dependencies = [ "enumflags2", "frame-benchmarking", @@ -4125,9 +4125,9 @@ dependencies = [ [[package]] name = "parity-scale-codec" -version = "1.3.1" +version = "1.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a74f02beb35d47e0706155c9eac554b50c671e0d868fe8296bcdf44a9a4847bf" +checksum = "34d38aeaffc032ec69faa476b3caaca8d4dd7f3f798137ff30359e5c7869ceb6" dependencies = [ "arrayvec 0.5.1", "bitvec", @@ -4138,9 +4138,9 @@ dependencies = [ [[package]] name = "parity-scale-codec-derive" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a0ec292e92e8ec7c58e576adacc1e3f399c597c8f263c42f18420abe58e7245" +checksum = "cd20ff7e0399b274a5f5bb37b712fccb5b3a64b9128200d1c3cc40fe709cb073" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -6058,7 +6058,7 @@ dependencies = [ [[package]] name = "sc-authority-discovery" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" +source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" dependencies = [ "bytes 0.5.5", "derive_more 0.99.9", @@ -6085,7 +6085,7 @@ dependencies = [ [[package]] name = "sc-basic-authorship" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" +source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6109,7 +6109,7 @@ dependencies = [ [[package]] name = "sc-block-builder" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" +source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" dependencies = [ "parity-scale-codec", "sc-client-api", @@ -6126,7 +6126,7 @@ dependencies = [ [[package]] name = "sc-chain-spec" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" +source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" dependencies = [ "impl-trait-for-tuples", "sc-chain-spec-derive", @@ -6142,7 +6142,7 @@ dependencies = [ [[package]] name = "sc-chain-spec-derive" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" +source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -6153,7 +6153,7 @@ dependencies = [ [[package]] name = "sc-cli" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" +source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" dependencies = [ "ansi_term 0.12.1", "atty", @@ -6194,7 +6194,7 @@ dependencies = [ [[package]] name = "sc-client-api" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" +source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" dependencies = [ "derive_more 0.99.9", "fnv", @@ -6230,7 +6230,7 @@ dependencies = [ [[package]] name = "sc-client-db" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" +source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" dependencies = [ "blake2-rfc", "hash-db", @@ -6259,7 +6259,7 @@ dependencies = [ [[package]] name = "sc-consensus" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" +source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" dependencies = [ "sc-client-api", "sp-blockchain", @@ -6270,7 +6270,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" +source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" dependencies = [ "derive_more 0.99.9", "fork-tree", @@ -6312,7 +6312,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe-rpc" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" +source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -6336,7 +6336,7 @@ dependencies = [ [[package]] name = "sc-consensus-epochs" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" +source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" dependencies = [ "fork-tree", "parity-scale-codec", @@ -6349,7 +6349,7 @@ dependencies = [ [[package]] name = "sc-consensus-slots" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" +source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6372,7 +6372,7 @@ dependencies = [ [[package]] name = "sc-consensus-uncles" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" +source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" dependencies = [ "log 0.4.8", "sc-client-api", @@ -6386,7 +6386,7 @@ dependencies = [ [[package]] name = "sc-executor" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" +source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" dependencies = [ "derive_more 0.99.9", "lazy_static", @@ -6414,7 +6414,7 @@ dependencies = [ [[package]] name = "sc-executor-common" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" +source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" dependencies = [ "derive_more 0.99.9", "log 0.4.8", @@ -6431,7 +6431,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmi" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" +source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" dependencies = [ "log 0.4.8", "parity-scale-codec", @@ -6446,7 +6446,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmtime" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" +source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" dependencies = [ "cranelift-codegen", "cranelift-wasm", @@ -6467,7 +6467,7 @@ dependencies = [ [[package]] name = "sc-finality-grandpa" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" +source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" dependencies = [ "assert_matches", "derive_more 0.99.9", @@ -6505,7 +6505,7 @@ dependencies = [ [[package]] name = "sc-finality-grandpa-rpc" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" +source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" dependencies = [ "derive_more 0.99.9", "finality-grandpa", @@ -6522,7 +6522,7 @@ dependencies = [ [[package]] name = "sc-informant" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" +source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" dependencies = [ "ansi_term 0.12.1", "futures 0.3.5", @@ -6540,7 +6540,7 @@ dependencies = [ [[package]] name = "sc-keystore" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" +source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" dependencies = [ "derive_more 0.99.9", "hex", @@ -6556,7 +6556,7 @@ dependencies = [ [[package]] name = "sc-light" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" +source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" dependencies = [ "hash-db", "lazy_static", @@ -6575,7 +6575,7 @@ dependencies = [ [[package]] name = "sc-network" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" +source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" dependencies = [ "bitflags", "bs58", @@ -6627,7 +6627,7 @@ dependencies = [ [[package]] name = "sc-network-gossip" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" +source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6642,7 +6642,7 @@ dependencies = [ [[package]] name = "sc-network-test" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" +source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" dependencies = [ "env_logger", "futures 0.3.5", @@ -6669,7 +6669,7 @@ dependencies = [ [[package]] name = "sc-offchain" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" +source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" dependencies = [ "bytes 0.5.5", "fnv", @@ -6696,7 +6696,7 @@ dependencies = [ [[package]] name = "sc-peerset" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" +source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" dependencies = [ "futures 0.3.5", "libp2p", @@ -6709,7 +6709,7 @@ dependencies = [ [[package]] name = "sc-proposer-metrics" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" +source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" dependencies = [ "log 0.4.8", "substrate-prometheus-endpoint", @@ -6718,7 +6718,7 @@ dependencies = [ [[package]] name = "sc-rpc" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" +source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" dependencies = [ "futures 0.3.5", "hash-db", @@ -6750,7 +6750,7 @@ dependencies = [ [[package]] name = "sc-rpc-api" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" +source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -6774,7 +6774,7 @@ dependencies = [ [[package]] name = "sc-rpc-server" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" +source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" dependencies = [ "jsonrpc-core", "jsonrpc-http-server", @@ -6790,7 +6790,7 @@ dependencies = [ [[package]] name = "sc-service" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" +source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" dependencies = [ "derive_more 0.99.9", "directories", @@ -6853,7 +6853,7 @@ dependencies = [ [[package]] name = "sc-state-db" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" +source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" dependencies = [ "log 0.4.8", "parity-scale-codec", @@ -6867,7 +6867,7 @@ dependencies = [ [[package]] name = "sc-telemetry" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" +source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6888,7 +6888,7 @@ dependencies = [ [[package]] name = "sc-tracing" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" +source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" dependencies = [ "erased-serde", "log 0.4.8", @@ -6905,7 +6905,7 @@ dependencies = [ [[package]] name = "sc-transaction-graph" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" +source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -6926,7 +6926,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" +source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -7381,7 +7381,7 @@ dependencies = [ [[package]] name = "sp-allocator" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" +source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" dependencies = [ "derive_more 0.99.9", "log 0.4.8", @@ -7393,7 +7393,7 @@ dependencies = [ [[package]] name = "sp-api" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" +source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" dependencies = [ "hash-db", "parity-scale-codec", @@ -7408,7 +7408,7 @@ dependencies = [ [[package]] name = "sp-api-proc-macro" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" +source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" dependencies = [ "blake2-rfc", "proc-macro-crate", @@ -7420,7 +7420,7 @@ dependencies = [ [[package]] name = "sp-application-crypto" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" +source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" dependencies = [ "parity-scale-codec", "serde", @@ -7432,7 +7432,7 @@ dependencies = [ [[package]] name = "sp-arithmetic" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" +source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" dependencies = [ "integer-sqrt", "num-traits 0.2.12", @@ -7445,7 +7445,7 @@ dependencies = [ [[package]] name = "sp-authority-discovery" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" +source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" dependencies = [ "parity-scale-codec", "sp-api", @@ -7457,7 +7457,7 @@ dependencies = [ [[package]] name = "sp-authorship" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" +source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" dependencies = [ "parity-scale-codec", "sp-inherents", @@ -7468,7 +7468,7 @@ dependencies = [ [[package]] name = "sp-block-builder" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" +source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" dependencies = [ "parity-scale-codec", "sp-api", @@ -7480,7 +7480,7 @@ dependencies = [ [[package]] name = "sp-blockchain" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" +source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" dependencies = [ "derive_more 0.99.9", "log 0.4.8", @@ -7497,7 +7497,7 @@ dependencies = [ [[package]] name = "sp-chain-spec" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" +source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" dependencies = [ "serde", "serde_json", @@ -7506,7 +7506,7 @@ dependencies = [ [[package]] name = "sp-consensus" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" +source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -7531,7 +7531,7 @@ dependencies = [ [[package]] name = "sp-consensus-aura" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" +source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" dependencies = [ "parity-scale-codec", "sp-api", @@ -7545,7 +7545,7 @@ dependencies = [ [[package]] name = "sp-consensus-babe" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" +source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" dependencies = [ "merlin", "parity-scale-codec", @@ -7564,7 +7564,7 @@ dependencies = [ [[package]] name = "sp-consensus-slots" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" +source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" dependencies = [ "parity-scale-codec", "sp-runtime", @@ -7573,7 +7573,7 @@ dependencies = [ [[package]] name = "sp-consensus-vrf" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" +source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" dependencies = [ "parity-scale-codec", "schnorrkel", @@ -7585,7 +7585,7 @@ dependencies = [ [[package]] name = "sp-core" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" +source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" dependencies = [ "base58", "blake2-rfc", @@ -7629,7 +7629,7 @@ dependencies = [ [[package]] name = "sp-database" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" +source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" dependencies = [ "kvdb", "parking_lot 0.10.2", @@ -7638,7 +7638,7 @@ dependencies = [ [[package]] name = "sp-debug-derive" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" +source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" dependencies = [ "proc-macro2 1.0.18", "quote 1.0.7", @@ -7648,7 +7648,7 @@ dependencies = [ [[package]] name = "sp-externalities" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" +source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" dependencies = [ "environmental", "parity-scale-codec", @@ -7659,7 +7659,7 @@ dependencies = [ [[package]] name = "sp-finality-grandpa" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" +source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" dependencies = [ "finality-grandpa", "log 0.4.8", @@ -7675,7 +7675,7 @@ dependencies = [ [[package]] name = "sp-finality-tracker" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" +source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" dependencies = [ "parity-scale-codec", "sp-inherents", @@ -7685,7 +7685,7 @@ dependencies = [ [[package]] name = "sp-inherents" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" +source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" dependencies = [ "derive_more 0.99.9", "parity-scale-codec", @@ -7697,7 +7697,7 @@ dependencies = [ [[package]] name = "sp-io" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" +source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" dependencies = [ "futures 0.3.5", "hash-db", @@ -7718,7 +7718,7 @@ dependencies = [ [[package]] name = "sp-keyring" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" +source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" dependencies = [ "lazy_static", "sp-core", @@ -7729,7 +7729,7 @@ dependencies = [ [[package]] name = "sp-npos-elections" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" +source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" dependencies = [ "parity-scale-codec", "serde", @@ -7741,7 +7741,7 @@ dependencies = [ [[package]] name = "sp-npos-elections-compact" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" +source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -7752,7 +7752,7 @@ dependencies = [ [[package]] name = "sp-offchain" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" +source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" dependencies = [ "sp-api", "sp-core", @@ -7762,7 +7762,7 @@ dependencies = [ [[package]] name = "sp-panic-handler" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" +source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" dependencies = [ "backtrace", "log 0.4.8", @@ -7771,7 +7771,7 @@ dependencies = [ [[package]] name = "sp-rpc" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" +source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" dependencies = [ "serde", "sp-core", @@ -7780,7 +7780,7 @@ dependencies = [ [[package]] name = "sp-runtime" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" +source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" dependencies = [ "either", "hash256-std-hasher", @@ -7802,7 +7802,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" +source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" dependencies = [ "parity-scale-codec", "primitive-types", @@ -7817,7 +7817,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" +source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" dependencies = [ "Inflector", "proc-macro-crate", @@ -7829,7 +7829,7 @@ dependencies = [ [[package]] name = "sp-serializer" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" +source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" dependencies = [ "serde", "serde_json", @@ -7838,7 +7838,7 @@ dependencies = [ [[package]] name = "sp-session" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" +source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" dependencies = [ "parity-scale-codec", "sp-api", @@ -7851,7 +7851,7 @@ dependencies = [ [[package]] name = "sp-staking" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" +source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" dependencies = [ "parity-scale-codec", "sp-runtime", @@ -7861,7 +7861,7 @@ dependencies = [ [[package]] name = "sp-state-machine" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" +source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" dependencies = [ "hash-db", "itertools 0.9.0", @@ -7882,12 +7882,12 @@ dependencies = [ [[package]] name = "sp-std" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" +source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" [[package]] name = "sp-storage" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" +source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" dependencies = [ "impl-serde 0.2.3", "ref-cast", @@ -7899,7 +7899,7 @@ dependencies = [ [[package]] name = "sp-timestamp" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" +source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -7913,7 +7913,7 @@ dependencies = [ [[package]] name = "sp-tracing" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" +source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" dependencies = [ "log 0.4.8", "rental", @@ -7923,7 +7923,7 @@ dependencies = [ [[package]] name = "sp-transaction-pool" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" +source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -7938,7 +7938,7 @@ dependencies = [ [[package]] name = "sp-trie" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" +source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" dependencies = [ "hash-db", "memory-db", @@ -7952,7 +7952,7 @@ dependencies = [ [[package]] name = "sp-utils" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" +source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" dependencies = [ "futures 0.3.5", "futures-core", @@ -7964,7 +7964,7 @@ dependencies = [ [[package]] name = "sp-version" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" +source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" dependencies = [ "impl-serde 0.2.3", "parity-scale-codec", @@ -7976,7 +7976,7 @@ dependencies = [ [[package]] name = "sp-wasm-interface" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" +source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -8107,7 +8107,7 @@ dependencies = [ [[package]] name = "substrate-browser-utils" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" +source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" dependencies = [ "chrono", "console_error_panic_hook", @@ -8133,7 +8133,7 @@ dependencies = [ [[package]] name = "substrate-build-script-utils" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" +source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" dependencies = [ "platforms", ] @@ -8141,7 +8141,7 @@ dependencies = [ [[package]] name = "substrate-frame-rpc-system" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" +source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" dependencies = [ "frame-system-rpc-runtime-api", "futures 0.3.5", @@ -8164,7 +8164,7 @@ dependencies = [ [[package]] name = "substrate-prometheus-endpoint" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" +source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" dependencies = [ "async-std", "derive_more 0.99.9", @@ -8178,7 +8178,7 @@ dependencies = [ [[package]] name = "substrate-test-client" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" +source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" dependencies = [ "futures 0.1.29", "futures 0.3.5", @@ -8204,7 +8204,7 @@ dependencies = [ [[package]] name = "substrate-test-runtime" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" +source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" dependencies = [ "cfg-if", "frame-executive", @@ -8244,7 +8244,7 @@ dependencies = [ [[package]] name = "substrate-test-runtime-client" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" +source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" dependencies = [ "futures 0.3.5", "parity-scale-codec", @@ -8265,7 +8265,7 @@ dependencies = [ [[package]] name = "substrate-wasm-builder-runner" version = "1.0.6" -source = "git+https://github.com/paritytech/substrate#b066029a23fdc0e6b7224a3c241c16f5122dd31b" +source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" [[package]] name = "substrate-wasm-builder-runner" diff --git a/availability-store/Cargo.toml b/availability-store/Cargo.toml index 62e0632468..83bc002d90 100644 --- a/availability-store/Cargo.toml +++ b/availability-store/Cargo.toml @@ -14,7 +14,7 @@ log = "0.4.8" futures = "0.3.4" tokio = { version = "0.2.13", features = ["rt-core"] } exit-future = "0.2.0" -codec = { package = "parity-scale-codec", version = "1.3.0", features = ["derive"] } +codec = { package = "parity-scale-codec", version = "1.3.4", features = ["derive"] } sc-network = { git = "https://github.com/paritytech/substrate", branch = "master" } consensus_common = { package = "sp-consensus", git = "https://github.com/paritytech/substrate", branch = "master" } client = { package = "sc-client-api", git = "https://github.com/paritytech/substrate", branch = "master", version = "2.0.0-rc5" } diff --git a/collator/Cargo.toml b/collator/Cargo.toml index 31f4ec1ca3..df0bbc94cd 100644 --- a/collator/Cargo.toml +++ b/collator/Cargo.toml @@ -26,7 +26,7 @@ polkadot-service-new = { path = "../node/service", optional = true } log = "0.4.8" tokio = "0.2.13" futures-timer = "2.0" -codec = { package = "parity-scale-codec", version = "1.3.0" } +codec = { package = "parity-scale-codec", version = "1.3.4" } [dev-dependencies] keyring = { package = "sp-keyring", git = "https://github.com/paritytech/substrate", branch = "master" } diff --git a/core-primitives/Cargo.toml b/core-primitives/Cargo.toml index b0f5971e2a..cd4dac0f18 100644 --- a/core-primitives/Cargo.toml +++ b/core-primitives/Cargo.toml @@ -8,7 +8,7 @@ edition = "2018" sp-core = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } sp-std = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = [ "derive" ] } +codec = { package = "parity-scale-codec", version = "1.3.4", default-features = false, features = [ "derive" ] } [features] default = [ "std" ] diff --git a/erasure-coding/Cargo.toml b/erasure-coding/Cargo.toml index bbb929c087..e4215f8c90 100644 --- a/erasure-coding/Cargo.toml +++ b/erasure-coding/Cargo.toml @@ -7,7 +7,7 @@ edition = "2018" [dependencies] primitives = { package = "polkadot-primitives", path = "../primitives" } reed_solomon = { package = "reed-solomon-erasure", version = "4.0.2"} -codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } +codec = { package = "parity-scale-codec", version = "1.3.4", default-features = false, features = ["derive"] } sp-core = { git = "https://github.com/paritytech/substrate", branch = "master" } trie = { package = "sp-trie", git = "https://github.com/paritytech/substrate", branch = "master" } derive_more = "0.15.0" diff --git a/network/Cargo.toml b/network/Cargo.toml index 6ded8b7304..34c377caf1 100644 --- a/network/Cargo.toml +++ b/network/Cargo.toml @@ -14,7 +14,7 @@ av_store = { package = "polkadot-availability-store", path = "../availability-st polkadot-validation = { path = "../validation" } polkadot-primitives = { path = "../primitives" } polkadot-erasure-coding = { path = "../erasure-coding" } -codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } +codec = { package = "parity-scale-codec", version = "1.3.4", default-features = false, features = ["derive"] } sc-network = { git = "https://github.com/paritytech/substrate", branch = "master" } sc-network-gossip = { git = "https://github.com/paritytech/substrate", branch = "master" } sp-core = { git = "https://github.com/paritytech/substrate", branch = "master" } diff --git a/node/core/proposer/Cargo.toml b/node/core/proposer/Cargo.toml index 3723b80bfe..7cf7fc28af 100644 --- a/node/core/proposer/Cargo.toml +++ b/node/core/proposer/Cargo.toml @@ -8,7 +8,7 @@ edition = "2018" futures = "0.3.4" futures-timer = "3.0.1" log = "0.4.8" -parity-scale-codec = "1.3.0" +parity-scale-codec = "1.3.4" polkadot-node-subsystem = { path = "../../subsystem" } polkadot-overseer = { path = "../../overseer" } polkadot-primitives = { path = "../../../primitives" } diff --git a/node/network/bitfield-distribution/Cargo.toml b/node/network/bitfield-distribution/Cargo.toml index aebf6f9a65..2addbbfd3f 100644 --- a/node/network/bitfield-distribution/Cargo.toml +++ b/node/network/bitfield-distribution/Cargo.toml @@ -9,7 +9,7 @@ futures = "0.3.5" futures-timer = "3.0.2" log = "0.4.8" streamunordered = "0.5.1" -codec = { package="parity-scale-codec", version = "1.3.0" } +codec = { package="parity-scale-codec", version = "1.3.4" } node-primitives = { package = "polkadot-node-primitives", path = "../../primitives" } polkadot-primitives = { path = "../../../primitives" } polkadot-subsystem = { package = "polkadot-node-subsystem", path = "../../subsystem" } diff --git a/node/network/bridge/Cargo.toml b/node/network/bridge/Cargo.toml index 25a9dc62c2..3e405d3d75 100644 --- a/node/network/bridge/Cargo.toml +++ b/node/network/bridge/Cargo.toml @@ -11,7 +11,7 @@ futures-timer = "3.0.2" streamunordered = "0.5.1" polkadot-primitives = { path = "../../../primitives" } node-primitives = { package = "polkadot-node-primitives", path = "../../primitives" } -parity-scale-codec = "1.3.0" +parity-scale-codec = "1.3.4" sc-network = { git = "https://github.com/paritytech/substrate", branch = "master" } sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "master" } polkadot-subsystem = { package = "polkadot-node-subsystem", path = "../../subsystem" } diff --git a/node/network/pov-distribution/Cargo.toml b/node/network/pov-distribution/Cargo.toml index 672e697c26..c6bfd4b14c 100644 --- a/node/network/pov-distribution/Cargo.toml +++ b/node/network/pov-distribution/Cargo.toml @@ -11,7 +11,7 @@ futures-timer = "3.0.2" streamunordered = "0.5.1" polkadot-primitives = { path = "../../../primitives" } node-primitives = { package = "polkadot-node-primitives", path = "../../primitives" } -parity-scale-codec = "1.3.0" +parity-scale-codec = "1.3.4" sc-network = { git = "https://github.com/paritytech/substrate", branch = "master" } sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "master" } polkadot-subsystem = { package = "polkadot-node-subsystem", path = "../../subsystem" } diff --git a/node/network/statement-distribution/Cargo.toml b/node/network/statement-distribution/Cargo.toml index 307178201c..04e6def40e 100644 --- a/node/network/statement-distribution/Cargo.toml +++ b/node/network/statement-distribution/Cargo.toml @@ -12,7 +12,7 @@ futures-timer = "3.0.2" streamunordered = "0.5.1" polkadot-primitives = { path = "../../../primitives" } node-primitives = { package = "polkadot-node-primitives", path = "../../primitives" } -parity-scale-codec = "1.3.0" +parity-scale-codec = "1.3.4" sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "master" } sp-staking = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } polkadot-subsystem = { package = "polkadot-node-subsystem", path = "../../subsystem" } diff --git a/node/primitives/Cargo.toml b/node/primitives/Cargo.toml index aea4cca3b7..df288438a8 100644 --- a/node/primitives/Cargo.toml +++ b/node/primitives/Cargo.toml @@ -8,7 +8,7 @@ description = "Primitives types for the Node-side" [dependencies] polkadot-primitives = { path = "../../primitives" } polkadot-statement-table = { path = "../../statement-table" } -parity-scale-codec = { version = "1.3.0", default-features = false, features = ["derive"] } +parity-scale-codec = { version = "1.3.4", default-features = false, features = ["derive"] } runtime_primitives = { package = "sp-runtime", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } async-trait = "0.1" sp-core = { git = "https://github.com/paritytech/substrate", branch = "master" } diff --git a/node/service/Cargo.toml b/node/service/Cargo.toml index a9552b56ad..0c32e5a971 100644 --- a/node/service/Cargo.toml +++ b/node/service/Cargo.toml @@ -53,7 +53,7 @@ babe-primitives = { package = "sp-consensus-babe", git = "https://github.com/par sp-block-builder = { git = "https://github.com/paritytech/substrate", branch = "master" } pallet-transaction-payment-rpc-runtime-api = { git = "https://github.com/paritytech/substrate", branch = "master" } system_rpc_runtime_api = { package = "frame-system-rpc-runtime-api", git = "https://github.com/paritytech/substrate", branch = "master" } -codec = { package = "parity-scale-codec", version = "1.3.0" } +codec = { package = "parity-scale-codec", version = "1.3.4" } sp-session = { git = "https://github.com/paritytech/substrate", branch = "master" } sp-offchain = { package = "sp-offchain", git = "https://github.com/paritytech/substrate", branch = "master" } prometheus-endpoint = { package = "substrate-prometheus-endpoint", git = "https://github.com/paritytech/substrate", branch = "master" } diff --git a/node/subsystem/Cargo.toml b/node/subsystem/Cargo.toml index 3befba7f7b..f924808182 100644 --- a/node/subsystem/Cargo.toml +++ b/node/subsystem/Cargo.toml @@ -12,7 +12,7 @@ futures = "0.3.5" futures-timer = "3.0.2" keystore = { package = "sc-keystore", git = "https://github.com/paritytech/substrate", branch = "master" } log = "0.4.8" -parity-scale-codec = "1.3.0" +parity-scale-codec = "1.3.4" parking_lot = { version = "0.10.0", optional = true } pin-project = "0.4.22" polkadot-node-primitives = { path = "../primitives" } diff --git a/parachain/Cargo.toml b/parachain/Cargo.toml index 51c863a1fb..56092f1046 100644 --- a/parachain/Cargo.toml +++ b/parachain/Cargo.toml @@ -9,7 +9,7 @@ edition = "2018" # note: special care is taken to avoid inclusion of `sp-io` externals when compiling # this crate for WASM. This is critical to avoid forcing all parachain WASM into implementing # various unnecessary Substrate-specific endpoints. -codec = { package = "parity-scale-codec", version = "1.1.0", default-features = false, features = [ "derive" ] } +codec = { package = "parity-scale-codec", version = "1.3.4", default-features = false, features = [ "derive" ] } sp-std = { package = "sp-std", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } sp-core = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } sp-wasm-interface = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } diff --git a/parachain/test-parachains/Cargo.toml b/parachain/test-parachains/Cargo.toml index 79bcf67851..044115119d 100644 --- a/parachain/test-parachains/Cargo.toml +++ b/parachain/test-parachains/Cargo.toml @@ -7,7 +7,7 @@ edition = "2018" [dependencies] tiny-keccak = "1.5.0" -codec = { package = "parity-scale-codec", version = "1.1.0", default-features = false, features = ["derive"] } +codec = { package = "parity-scale-codec", version = "1.3.4", default-features = false, features = ["derive"] } parachain = { package = "polkadot-parachain", path = ".." } adder = { package = "test-parachain-adder", path = "adder" } diff --git a/parachain/test-parachains/adder/Cargo.toml b/parachain/test-parachains/adder/Cargo.toml index 677d17f04c..9bd6b67ba1 100644 --- a/parachain/test-parachains/adder/Cargo.toml +++ b/parachain/test-parachains/adder/Cargo.toml @@ -8,7 +8,7 @@ build = "build.rs" [dependencies] parachain = { package = "polkadot-parachain", path = "../../", default-features = false, features = [ "wasm-api" ] } -codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } +codec = { package = "parity-scale-codec", version = "1.3.4", default-features = false, features = ["derive"] } sp-std = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } tiny-keccak = "1.5.0" dlmalloc = { version = "0.1.3", features = [ "global" ] } diff --git a/parachain/test-parachains/adder/collator/Cargo.toml b/parachain/test-parachains/adder/collator/Cargo.toml index 3363a908a9..dc686fe24e 100644 --- a/parachain/test-parachains/adder/collator/Cargo.toml +++ b/parachain/test-parachains/adder/collator/Cargo.toml @@ -12,5 +12,5 @@ primitives = { package = "polkadot-primitives", path = "../../../../primitives" sp-core = { git = "https://github.com/paritytech/substrate", branch = "master" } client-api = { package = "sc-client-api", git = "https://github.com/paritytech/substrate", branch = "master" } parking_lot = "0.10.0" -codec = { package = "parity-scale-codec", version = "1.2.0" } +codec = { package = "parity-scale-codec", version = "1.3.4" } futures = "0.3.4" diff --git a/primitives/Cargo.toml b/primitives/Cargo.toml index 0828185f0f..442169cbf2 100644 --- a/primitives/Cargo.toml +++ b/primitives/Cargo.toml @@ -6,7 +6,7 @@ edition = "2018" [dependencies] serde = { version = "1.0.102", optional = true, features = ["derive"] } -parity-scale-codec = { version = "1.3.0", default-features = false, features = ["bit-vec", "derive"] } +parity-scale-codec = { version = "1.3.4", default-features = false, features = ["bit-vec", "derive"] } primitives = { package = "sp-core", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } inherents = { package = "sp-inherents", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } application-crypto = { package = "sp-application-crypto", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } diff --git a/rpc/Cargo.toml b/rpc/Cargo.toml index fa21bffc25..1929548881 100644 --- a/rpc/Cargo.toml +++ b/rpc/Cargo.toml @@ -23,5 +23,5 @@ sc-keystore = { git = "https://github.com/paritytech/substrate", branch = "maste txpool-api = { package = "sp-transaction-pool", git = "https://github.com/paritytech/substrate", branch = "master" } frame-rpc-system = { package = "substrate-frame-rpc-system", git = "https://github.com/paritytech/substrate", branch = "master" } pallet-transaction-payment-rpc = { git = "https://github.com/paritytech/substrate", branch = "master" } -codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false } +codec = { package = "parity-scale-codec", version = "1.3.4", default-features = false } sp-block-builder = { git = "https://github.com/paritytech/substrate", branch = "master" } diff --git a/runtime/common/Cargo.toml b/runtime/common/Cargo.toml index 612cdcd2c9..66652c967c 100644 --- a/runtime/common/Cargo.toml +++ b/runtime/common/Cargo.toml @@ -6,7 +6,7 @@ edition = "2018" [dependencies] bitvec = { version = "0.17.4", default-features = false, features = ["alloc"] } -codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } +codec = { package = "parity-scale-codec", version = "1.3.4", default-features = false, features = ["derive"] } log = { version = "0.3.9", optional = true } rustc-hex = { version = "2.0.1", default-features = false } serde = { version = "1.0.102", default-features = false } diff --git a/runtime/kusama/Cargo.toml b/runtime/kusama/Cargo.toml index 021687e65b..2f3f04ae8a 100644 --- a/runtime/kusama/Cargo.toml +++ b/runtime/kusama/Cargo.toml @@ -7,7 +7,7 @@ build = "build.rs" [dependencies] bitvec = { version = "0.17.4", default-features = false, features = ["alloc"] } -codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } +codec = { package = "parity-scale-codec", version = "1.3.4", default-features = false, features = ["derive"] } log = { version = "0.3.9", optional = true } rustc-hex = { version = "2.0.1", default-features = false } serde = { version = "1.0.102", default-features = false } diff --git a/runtime/parachains/Cargo.toml b/runtime/parachains/Cargo.toml index 4563a05e10..ec3f2712bf 100644 --- a/runtime/parachains/Cargo.toml +++ b/runtime/parachains/Cargo.toml @@ -6,7 +6,7 @@ edition = "2018" [dependencies] bitvec = { version = "0.17.4", default-features = false, features = ["alloc"] } -codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } +codec = { package = "parity-scale-codec", version = "1.3.4", default-features = false, features = ["derive"] } log = { version = "0.3.9", optional = true } rustc-hex = { version = "2.0.1", default-features = false } serde = { version = "1.0.102", default-features = false } diff --git a/runtime/polkadot/Cargo.toml b/runtime/polkadot/Cargo.toml index baa420b61f..d399d9304d 100644 --- a/runtime/polkadot/Cargo.toml +++ b/runtime/polkadot/Cargo.toml @@ -7,7 +7,7 @@ build = "build.rs" [dependencies] bitvec = { version = "0.17.4", default-features = false, features = ["alloc"] } -codec = { package = "parity-scale-codec", version = "1.2.0", default-features = false, features = ["derive"] } +codec = { package = "parity-scale-codec", version = "1.3.4", default-features = false, features = ["derive"] } log = { version = "0.3.9", optional = true } rustc-hex = { version = "2.0.1", default-features = false } serde = { version = "1.0.102", default-features = false } diff --git a/runtime/test-runtime/Cargo.toml b/runtime/test-runtime/Cargo.toml index 8b66f60121..60965effd7 100644 --- a/runtime/test-runtime/Cargo.toml +++ b/runtime/test-runtime/Cargo.toml @@ -7,7 +7,7 @@ build = "build.rs" [dependencies] bitvec = { version = "0.17.4", default-features = false, features = ["alloc"] } -codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } +codec = { package = "parity-scale-codec", version = "1.3.4", default-features = false, features = ["derive"] } log = { version = "0.3.9", optional = true } rustc-hex = { version = "2.0.1", default-features = false } serde = { version = "1.0.102", default-features = false } diff --git a/runtime/test-runtime/client/Cargo.toml b/runtime/test-runtime/client/Cargo.toml index 7dbb7d5ec5..ce00e4a51d 100644 --- a/runtime/test-runtime/client/Cargo.toml +++ b/runtime/test-runtime/client/Cargo.toml @@ -7,7 +7,7 @@ license = "GPL-3.0" [dependencies] futures = "0.3.1" -codec = { package = "parity-scale-codec", version = "1.0.0" } +codec = { package = "parity-scale-codec", version = "1.3.4" } # Polkadot dependencies polkadot-primitives = { path = "../../../primitives" } diff --git a/runtime/westend/Cargo.toml b/runtime/westend/Cargo.toml index 3049921321..2cfea3a424 100644 --- a/runtime/westend/Cargo.toml +++ b/runtime/westend/Cargo.toml @@ -7,7 +7,7 @@ build = "build.rs" [dependencies] bitvec = { version = "0.17.4", default-features = false, features = ["alloc"] } -codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } +codec = { package = "parity-scale-codec", version = "1.3.4", default-features = false, features = ["derive"] } log = { version = "0.3.9", optional = true } rustc-hex = { version = "2.0.1", default-features = false } serde = { version = "1.0.102", default-features = false } diff --git a/service/Cargo.toml b/service/Cargo.toml index 0f2674703b..1f9af907b7 100644 --- a/service/Cargo.toml +++ b/service/Cargo.toml @@ -52,7 +52,7 @@ babe-primitives = { package = "sp-consensus-babe", git = "https://github.com/par sp-block-builder = { git = "https://github.com/paritytech/substrate", branch = "master" } pallet-transaction-payment-rpc-runtime-api = { git = "https://github.com/paritytech/substrate", branch = "master" } system_rpc_runtime_api = { package = "frame-system-rpc-runtime-api", git = "https://github.com/paritytech/substrate", branch = "master" } -codec = { package = "parity-scale-codec", version = "1.3.0" } +codec = { package = "parity-scale-codec", version = "1.3.4" } sp-session = { git = "https://github.com/paritytech/substrate", branch = "master" } sp-offchain = { package = "sp-offchain", git = "https://github.com/paritytech/substrate", branch = "master" } prometheus-endpoint = { package = "substrate-prometheus-endpoint", git = "https://github.com/paritytech/substrate", branch = "master" } diff --git a/statement-table/Cargo.toml b/statement-table/Cargo.toml index f06d12deab..86dc46f7f3 100644 --- a/statement-table/Cargo.toml +++ b/statement-table/Cargo.toml @@ -5,6 +5,6 @@ authors = ["Parity Technologies "] edition = "2018" [dependencies] -codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } +codec = { package = "parity-scale-codec", version = "1.3.4", default-features = false, features = ["derive"] } sp-core = { git = "https://github.com/paritytech/substrate", branch = "master" } primitives = { package = "polkadot-primitives", path = "../primitives" } diff --git a/validation/Cargo.toml b/validation/Cargo.toml index ab7f539d23..eee53c69da 100644 --- a/validation/Cargo.toml +++ b/validation/Cargo.toml @@ -13,7 +13,7 @@ tokio = { version = "0.2.13", features = ["rt-core", "blocking"] } derive_more = "0.14.1" log = "0.4.8" exit-future = "0.2.0" -codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } +codec = { package = "parity-scale-codec", version = "1.3.4", default-features = false, features = ["derive"] } availability_store = { package = "polkadot-availability-store", path = "../availability-store" } parachain = { package = "polkadot-parachain", path = "../parachain" } polkadot-primitives = { path = "../primitives" } -- GitLab From e3441cfd9d8e9310c7d82db23eb0865047931f43 Mon Sep 17 00:00:00 2001 From: Gav Wood Date: Wed, 29 Jul 2020 14:03:47 +0200 Subject: [PATCH 114/192] Bump Substrate --- Cargo.lock | 274 ++++++++++++++++++++++++++--------------------------- 1 file changed, 137 insertions(+), 137 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a6e3e8f79e..ab0785e573 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1370,7 +1370,7 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "fork-tree" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" +source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" dependencies = [ "parity-scale-codec", ] @@ -1378,7 +1378,7 @@ dependencies = [ [[package]] name = "frame-benchmarking" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" +source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" dependencies = [ "frame-support", "frame-system", @@ -1395,7 +1395,7 @@ dependencies = [ [[package]] name = "frame-benchmarking-cli" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" +source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" dependencies = [ "Inflector", "frame-benchmarking", @@ -1414,7 +1414,7 @@ dependencies = [ [[package]] name = "frame-executive" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" +source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" dependencies = [ "frame-support", "frame-system", @@ -1429,7 +1429,7 @@ dependencies = [ [[package]] name = "frame-metadata" version = "11.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" +source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" dependencies = [ "parity-scale-codec", "serde", @@ -1440,7 +1440,7 @@ dependencies = [ [[package]] name = "frame-support" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" +source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" dependencies = [ "bitmask", "frame-metadata", @@ -1465,7 +1465,7 @@ dependencies = [ [[package]] name = "frame-support-procedural" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" +source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" dependencies = [ "frame-support-procedural-tools", "proc-macro2 1.0.18", @@ -1476,7 +1476,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" +source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" dependencies = [ "frame-support-procedural-tools-derive", "proc-macro-crate", @@ -1488,7 +1488,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools-derive" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" +source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" dependencies = [ "proc-macro2 1.0.18", "quote 1.0.7", @@ -1498,7 +1498,7 @@ dependencies = [ [[package]] name = "frame-system" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" +source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" dependencies = [ "frame-support", "impl-trait-for-tuples", @@ -1514,7 +1514,7 @@ dependencies = [ [[package]] name = "frame-system-benchmarking" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" +source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" dependencies = [ "frame-benchmarking", "frame-support", @@ -1528,7 +1528,7 @@ dependencies = [ [[package]] name = "frame-system-rpc-runtime-api" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" +source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" dependencies = [ "parity-scale-codec", "sp-api", @@ -3542,7 +3542,7 @@ dependencies = [ [[package]] name = "pallet-authority-discovery" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" +source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" dependencies = [ "frame-support", "frame-system", @@ -3558,7 +3558,7 @@ dependencies = [ [[package]] name = "pallet-authorship" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" +source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" dependencies = [ "frame-support", "frame-system", @@ -3573,7 +3573,7 @@ dependencies = [ [[package]] name = "pallet-babe" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" +source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" dependencies = [ "frame-benchmarking", "frame-support", @@ -3598,7 +3598,7 @@ dependencies = [ [[package]] name = "pallet-balances" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" +source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" dependencies = [ "frame-benchmarking", "frame-support", @@ -3612,7 +3612,7 @@ dependencies = [ [[package]] name = "pallet-collective" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" +source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" dependencies = [ "frame-benchmarking", "frame-support", @@ -3628,7 +3628,7 @@ dependencies = [ [[package]] name = "pallet-democracy" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" +source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" dependencies = [ "frame-benchmarking", "frame-support", @@ -3643,7 +3643,7 @@ dependencies = [ [[package]] name = "pallet-elections-phragmen" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" +source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" dependencies = [ "frame-benchmarking", "frame-support", @@ -3658,7 +3658,7 @@ dependencies = [ [[package]] name = "pallet-finality-tracker" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" +source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" dependencies = [ "frame-support", "frame-system", @@ -3674,7 +3674,7 @@ dependencies = [ [[package]] name = "pallet-grandpa" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" +source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" dependencies = [ "frame-benchmarking", "frame-support", @@ -3696,7 +3696,7 @@ dependencies = [ [[package]] name = "pallet-identity" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" +source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" dependencies = [ "enumflags2", "frame-benchmarking", @@ -3712,7 +3712,7 @@ dependencies = [ [[package]] name = "pallet-im-online" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" +source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" dependencies = [ "frame-benchmarking", "frame-support", @@ -3732,7 +3732,7 @@ dependencies = [ [[package]] name = "pallet-indices" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" +source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" dependencies = [ "frame-support", "frame-system", @@ -3748,7 +3748,7 @@ dependencies = [ [[package]] name = "pallet-membership" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" +source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" dependencies = [ "frame-support", "frame-system", @@ -3762,7 +3762,7 @@ dependencies = [ [[package]] name = "pallet-multisig" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" +source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" dependencies = [ "frame-support", "frame-system", @@ -3777,7 +3777,7 @@ dependencies = [ [[package]] name = "pallet-nicks" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" +source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" dependencies = [ "frame-support", "frame-system", @@ -3791,7 +3791,7 @@ dependencies = [ [[package]] name = "pallet-offences" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" +source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" dependencies = [ "frame-support", "frame-system", @@ -3806,7 +3806,7 @@ dependencies = [ [[package]] name = "pallet-offences-benchmarking" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" +source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" dependencies = [ "frame-benchmarking", "frame-support", @@ -3827,7 +3827,7 @@ dependencies = [ [[package]] name = "pallet-proxy" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" +source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" dependencies = [ "frame-support", "frame-system", @@ -3842,7 +3842,7 @@ dependencies = [ [[package]] name = "pallet-randomness-collective-flip" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" +source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" dependencies = [ "frame-support", "frame-system", @@ -3855,7 +3855,7 @@ dependencies = [ [[package]] name = "pallet-recovery" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" +source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" dependencies = [ "enumflags2", "frame-support", @@ -3870,7 +3870,7 @@ dependencies = [ [[package]] name = "pallet-scheduler" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" +source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" dependencies = [ "frame-benchmarking", "frame-support", @@ -3885,7 +3885,7 @@ dependencies = [ [[package]] name = "pallet-session" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" +source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" dependencies = [ "frame-support", "frame-system", @@ -3905,7 +3905,7 @@ dependencies = [ [[package]] name = "pallet-session-benchmarking" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" +source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" dependencies = [ "frame-benchmarking", "frame-support", @@ -3921,7 +3921,7 @@ dependencies = [ [[package]] name = "pallet-society" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" +source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" dependencies = [ "frame-support", "frame-system", @@ -3935,7 +3935,7 @@ dependencies = [ [[package]] name = "pallet-staking" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" +source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" dependencies = [ "frame-benchmarking", "frame-support", @@ -3957,7 +3957,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-curve" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" +source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -3968,7 +3968,7 @@ dependencies = [ [[package]] name = "pallet-sudo" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" +source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" dependencies = [ "frame-support", "frame-system", @@ -3982,7 +3982,7 @@ dependencies = [ [[package]] name = "pallet-timestamp" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" +source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" dependencies = [ "frame-benchmarking", "frame-support", @@ -4000,7 +4000,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" +source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" dependencies = [ "frame-support", "frame-system", @@ -4017,7 +4017,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" +source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" dependencies = [ "jsonrpc-core", "jsonrpc-core-client", @@ -4035,7 +4035,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc-runtime-api" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" +source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" dependencies = [ "frame-support", "parity-scale-codec", @@ -4048,7 +4048,7 @@ dependencies = [ [[package]] name = "pallet-treasury" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" +source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" dependencies = [ "frame-benchmarking", "frame-support", @@ -4063,7 +4063,7 @@ dependencies = [ [[package]] name = "pallet-utility" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" +source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" dependencies = [ "frame-benchmarking", "frame-support", @@ -4079,7 +4079,7 @@ dependencies = [ [[package]] name = "pallet-vesting" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" +source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" dependencies = [ "enumflags2", "frame-benchmarking", @@ -6058,7 +6058,7 @@ dependencies = [ [[package]] name = "sc-authority-discovery" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" +source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" dependencies = [ "bytes 0.5.5", "derive_more 0.99.9", @@ -6085,7 +6085,7 @@ dependencies = [ [[package]] name = "sc-basic-authorship" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" +source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6109,7 +6109,7 @@ dependencies = [ [[package]] name = "sc-block-builder" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" +source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" dependencies = [ "parity-scale-codec", "sc-client-api", @@ -6126,7 +6126,7 @@ dependencies = [ [[package]] name = "sc-chain-spec" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" +source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" dependencies = [ "impl-trait-for-tuples", "sc-chain-spec-derive", @@ -6142,7 +6142,7 @@ dependencies = [ [[package]] name = "sc-chain-spec-derive" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" +source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -6153,7 +6153,7 @@ dependencies = [ [[package]] name = "sc-cli" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" +source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" dependencies = [ "ansi_term 0.12.1", "atty", @@ -6194,7 +6194,7 @@ dependencies = [ [[package]] name = "sc-client-api" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" +source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" dependencies = [ "derive_more 0.99.9", "fnv", @@ -6230,7 +6230,7 @@ dependencies = [ [[package]] name = "sc-client-db" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" +source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" dependencies = [ "blake2-rfc", "hash-db", @@ -6259,7 +6259,7 @@ dependencies = [ [[package]] name = "sc-consensus" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" +source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" dependencies = [ "sc-client-api", "sp-blockchain", @@ -6270,7 +6270,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" +source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" dependencies = [ "derive_more 0.99.9", "fork-tree", @@ -6312,7 +6312,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe-rpc" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" +source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -6336,7 +6336,7 @@ dependencies = [ [[package]] name = "sc-consensus-epochs" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" +source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" dependencies = [ "fork-tree", "parity-scale-codec", @@ -6349,7 +6349,7 @@ dependencies = [ [[package]] name = "sc-consensus-slots" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" +source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6372,7 +6372,7 @@ dependencies = [ [[package]] name = "sc-consensus-uncles" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" +source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" dependencies = [ "log 0.4.8", "sc-client-api", @@ -6386,7 +6386,7 @@ dependencies = [ [[package]] name = "sc-executor" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" +source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" dependencies = [ "derive_more 0.99.9", "lazy_static", @@ -6414,7 +6414,7 @@ dependencies = [ [[package]] name = "sc-executor-common" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" +source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" dependencies = [ "derive_more 0.99.9", "log 0.4.8", @@ -6431,7 +6431,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmi" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" +source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" dependencies = [ "log 0.4.8", "parity-scale-codec", @@ -6446,7 +6446,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmtime" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" +source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" dependencies = [ "cranelift-codegen", "cranelift-wasm", @@ -6467,7 +6467,7 @@ dependencies = [ [[package]] name = "sc-finality-grandpa" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" +source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" dependencies = [ "assert_matches", "derive_more 0.99.9", @@ -6505,7 +6505,7 @@ dependencies = [ [[package]] name = "sc-finality-grandpa-rpc" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" +source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" dependencies = [ "derive_more 0.99.9", "finality-grandpa", @@ -6522,7 +6522,7 @@ dependencies = [ [[package]] name = "sc-informant" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" +source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" dependencies = [ "ansi_term 0.12.1", "futures 0.3.5", @@ -6540,7 +6540,7 @@ dependencies = [ [[package]] name = "sc-keystore" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" +source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" dependencies = [ "derive_more 0.99.9", "hex", @@ -6556,7 +6556,7 @@ dependencies = [ [[package]] name = "sc-light" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" +source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" dependencies = [ "hash-db", "lazy_static", @@ -6575,7 +6575,7 @@ dependencies = [ [[package]] name = "sc-network" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" +source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" dependencies = [ "bitflags", "bs58", @@ -6627,7 +6627,7 @@ dependencies = [ [[package]] name = "sc-network-gossip" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" +source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6642,7 +6642,7 @@ dependencies = [ [[package]] name = "sc-network-test" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" +source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" dependencies = [ "env_logger", "futures 0.3.5", @@ -6669,7 +6669,7 @@ dependencies = [ [[package]] name = "sc-offchain" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" +source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" dependencies = [ "bytes 0.5.5", "fnv", @@ -6696,7 +6696,7 @@ dependencies = [ [[package]] name = "sc-peerset" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" +source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" dependencies = [ "futures 0.3.5", "libp2p", @@ -6709,7 +6709,7 @@ dependencies = [ [[package]] name = "sc-proposer-metrics" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" +source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" dependencies = [ "log 0.4.8", "substrate-prometheus-endpoint", @@ -6718,7 +6718,7 @@ dependencies = [ [[package]] name = "sc-rpc" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" +source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" dependencies = [ "futures 0.3.5", "hash-db", @@ -6750,7 +6750,7 @@ dependencies = [ [[package]] name = "sc-rpc-api" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" +source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -6774,7 +6774,7 @@ dependencies = [ [[package]] name = "sc-rpc-server" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" +source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" dependencies = [ "jsonrpc-core", "jsonrpc-http-server", @@ -6790,7 +6790,7 @@ dependencies = [ [[package]] name = "sc-service" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" +source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" dependencies = [ "derive_more 0.99.9", "directories", @@ -6853,7 +6853,7 @@ dependencies = [ [[package]] name = "sc-state-db" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" +source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" dependencies = [ "log 0.4.8", "parity-scale-codec", @@ -6867,7 +6867,7 @@ dependencies = [ [[package]] name = "sc-telemetry" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" +source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6888,7 +6888,7 @@ dependencies = [ [[package]] name = "sc-tracing" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" +source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" dependencies = [ "erased-serde", "log 0.4.8", @@ -6905,7 +6905,7 @@ dependencies = [ [[package]] name = "sc-transaction-graph" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" +source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -6926,7 +6926,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" +source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -7381,7 +7381,7 @@ dependencies = [ [[package]] name = "sp-allocator" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" +source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" dependencies = [ "derive_more 0.99.9", "log 0.4.8", @@ -7393,7 +7393,7 @@ dependencies = [ [[package]] name = "sp-api" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" +source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" dependencies = [ "hash-db", "parity-scale-codec", @@ -7408,7 +7408,7 @@ dependencies = [ [[package]] name = "sp-api-proc-macro" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" +source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" dependencies = [ "blake2-rfc", "proc-macro-crate", @@ -7420,7 +7420,7 @@ dependencies = [ [[package]] name = "sp-application-crypto" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" +source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" dependencies = [ "parity-scale-codec", "serde", @@ -7432,7 +7432,7 @@ dependencies = [ [[package]] name = "sp-arithmetic" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" +source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" dependencies = [ "integer-sqrt", "num-traits 0.2.12", @@ -7445,7 +7445,7 @@ dependencies = [ [[package]] name = "sp-authority-discovery" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" +source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" dependencies = [ "parity-scale-codec", "sp-api", @@ -7457,7 +7457,7 @@ dependencies = [ [[package]] name = "sp-authorship" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" +source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" dependencies = [ "parity-scale-codec", "sp-inherents", @@ -7468,7 +7468,7 @@ dependencies = [ [[package]] name = "sp-block-builder" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" +source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" dependencies = [ "parity-scale-codec", "sp-api", @@ -7480,7 +7480,7 @@ dependencies = [ [[package]] name = "sp-blockchain" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" +source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" dependencies = [ "derive_more 0.99.9", "log 0.4.8", @@ -7497,7 +7497,7 @@ dependencies = [ [[package]] name = "sp-chain-spec" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" +source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" dependencies = [ "serde", "serde_json", @@ -7506,7 +7506,7 @@ dependencies = [ [[package]] name = "sp-consensus" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" +source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -7531,7 +7531,7 @@ dependencies = [ [[package]] name = "sp-consensus-aura" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" +source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" dependencies = [ "parity-scale-codec", "sp-api", @@ -7545,7 +7545,7 @@ dependencies = [ [[package]] name = "sp-consensus-babe" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" +source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" dependencies = [ "merlin", "parity-scale-codec", @@ -7564,7 +7564,7 @@ dependencies = [ [[package]] name = "sp-consensus-slots" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" +source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" dependencies = [ "parity-scale-codec", "sp-runtime", @@ -7573,7 +7573,7 @@ dependencies = [ [[package]] name = "sp-consensus-vrf" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" +source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" dependencies = [ "parity-scale-codec", "schnorrkel", @@ -7585,7 +7585,7 @@ dependencies = [ [[package]] name = "sp-core" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" +source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" dependencies = [ "base58", "blake2-rfc", @@ -7629,7 +7629,7 @@ dependencies = [ [[package]] name = "sp-database" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" +source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" dependencies = [ "kvdb", "parking_lot 0.10.2", @@ -7638,7 +7638,7 @@ dependencies = [ [[package]] name = "sp-debug-derive" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" +source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" dependencies = [ "proc-macro2 1.0.18", "quote 1.0.7", @@ -7648,7 +7648,7 @@ dependencies = [ [[package]] name = "sp-externalities" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" +source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" dependencies = [ "environmental", "parity-scale-codec", @@ -7659,7 +7659,7 @@ dependencies = [ [[package]] name = "sp-finality-grandpa" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" +source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" dependencies = [ "finality-grandpa", "log 0.4.8", @@ -7675,7 +7675,7 @@ dependencies = [ [[package]] name = "sp-finality-tracker" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" +source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" dependencies = [ "parity-scale-codec", "sp-inherents", @@ -7685,7 +7685,7 @@ dependencies = [ [[package]] name = "sp-inherents" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" +source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" dependencies = [ "derive_more 0.99.9", "parity-scale-codec", @@ -7697,7 +7697,7 @@ dependencies = [ [[package]] name = "sp-io" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" +source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" dependencies = [ "futures 0.3.5", "hash-db", @@ -7718,7 +7718,7 @@ dependencies = [ [[package]] name = "sp-keyring" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" +source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" dependencies = [ "lazy_static", "sp-core", @@ -7729,7 +7729,7 @@ dependencies = [ [[package]] name = "sp-npos-elections" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" +source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" dependencies = [ "parity-scale-codec", "serde", @@ -7741,7 +7741,7 @@ dependencies = [ [[package]] name = "sp-npos-elections-compact" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" +source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -7752,7 +7752,7 @@ dependencies = [ [[package]] name = "sp-offchain" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" +source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" dependencies = [ "sp-api", "sp-core", @@ -7762,7 +7762,7 @@ dependencies = [ [[package]] name = "sp-panic-handler" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" +source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" dependencies = [ "backtrace", "log 0.4.8", @@ -7771,7 +7771,7 @@ dependencies = [ [[package]] name = "sp-rpc" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" +source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" dependencies = [ "serde", "sp-core", @@ -7780,7 +7780,7 @@ dependencies = [ [[package]] name = "sp-runtime" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" +source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" dependencies = [ "either", "hash256-std-hasher", @@ -7802,7 +7802,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" +source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" dependencies = [ "parity-scale-codec", "primitive-types", @@ -7817,7 +7817,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" +source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" dependencies = [ "Inflector", "proc-macro-crate", @@ -7829,7 +7829,7 @@ dependencies = [ [[package]] name = "sp-serializer" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" +source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" dependencies = [ "serde", "serde_json", @@ -7838,7 +7838,7 @@ dependencies = [ [[package]] name = "sp-session" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" +source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" dependencies = [ "parity-scale-codec", "sp-api", @@ -7851,7 +7851,7 @@ dependencies = [ [[package]] name = "sp-staking" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" +source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" dependencies = [ "parity-scale-codec", "sp-runtime", @@ -7861,7 +7861,7 @@ dependencies = [ [[package]] name = "sp-state-machine" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" +source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" dependencies = [ "hash-db", "itertools 0.9.0", @@ -7882,12 +7882,12 @@ dependencies = [ [[package]] name = "sp-std" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" +source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" [[package]] name = "sp-storage" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" +source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" dependencies = [ "impl-serde 0.2.3", "ref-cast", @@ -7899,7 +7899,7 @@ dependencies = [ [[package]] name = "sp-timestamp" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" +source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -7913,7 +7913,7 @@ dependencies = [ [[package]] name = "sp-tracing" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" +source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" dependencies = [ "log 0.4.8", "rental", @@ -7923,7 +7923,7 @@ dependencies = [ [[package]] name = "sp-transaction-pool" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" +source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -7938,7 +7938,7 @@ dependencies = [ [[package]] name = "sp-trie" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" +source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" dependencies = [ "hash-db", "memory-db", @@ -7952,7 +7952,7 @@ dependencies = [ [[package]] name = "sp-utils" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" +source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" dependencies = [ "futures 0.3.5", "futures-core", @@ -7964,7 +7964,7 @@ dependencies = [ [[package]] name = "sp-version" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" +source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" dependencies = [ "impl-serde 0.2.3", "parity-scale-codec", @@ -7976,7 +7976,7 @@ dependencies = [ [[package]] name = "sp-wasm-interface" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" +source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -8107,7 +8107,7 @@ dependencies = [ [[package]] name = "substrate-browser-utils" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" +source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" dependencies = [ "chrono", "console_error_panic_hook", @@ -8133,7 +8133,7 @@ dependencies = [ [[package]] name = "substrate-build-script-utils" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" +source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" dependencies = [ "platforms", ] @@ -8141,7 +8141,7 @@ dependencies = [ [[package]] name = "substrate-frame-rpc-system" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" +source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" dependencies = [ "frame-system-rpc-runtime-api", "futures 0.3.5", @@ -8164,7 +8164,7 @@ dependencies = [ [[package]] name = "substrate-prometheus-endpoint" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" +source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" dependencies = [ "async-std", "derive_more 0.99.9", @@ -8178,7 +8178,7 @@ dependencies = [ [[package]] name = "substrate-test-client" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" +source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" dependencies = [ "futures 0.1.29", "futures 0.3.5", @@ -8204,7 +8204,7 @@ dependencies = [ [[package]] name = "substrate-test-runtime" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" +source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" dependencies = [ "cfg-if", "frame-executive", @@ -8244,7 +8244,7 @@ dependencies = [ [[package]] name = "substrate-test-runtime-client" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" +source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" dependencies = [ "futures 0.3.5", "parity-scale-codec", @@ -8265,7 +8265,7 @@ dependencies = [ [[package]] name = "substrate-wasm-builder-runner" version = "1.0.6" -source = "git+https://github.com/paritytech/substrate#99274e39c715cb94a89a7164289a01031be15d38" +source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" [[package]] name = "substrate-wasm-builder-runner" -- GitLab From 9e5446aa7e71a34c1040c4d0632ecf433ab1a573 Mon Sep 17 00:00:00 2001 From: Gavin Wood Date: Wed, 29 Jul 2020 14:31:31 +0200 Subject: [PATCH 115/192] Update Substrate, bump versions, clean up sort (#1496) * Sort cleanups * Bump versions --- Cargo.lock | 40 +++++++++++----------- Cargo.toml | 2 +- availability-store/Cargo.toml | 2 +- cli/Cargo.toml | 2 +- collator/Cargo.toml | 2 +- erasure-coding/Cargo.toml | 2 +- network/Cargo.toml | 2 +- network/test/Cargo.toml | 2 +- parachain/Cargo.toml | 2 +- parachain/test-parachains/adder/Cargo.toml | 2 +- parachain/test-parachains/halt/Cargo.toml | 2 +- primitives/Cargo.toml | 2 +- rpc/Cargo.toml | 2 +- runtime/common/Cargo.toml | 2 +- runtime/common/src/registrar.rs | 2 +- runtime/kusama/Cargo.toml | 2 +- runtime/kusama/src/lib.rs | 2 +- runtime/parachains/src/paras.rs | 2 +- runtime/polkadot/Cargo.toml | 2 +- runtime/polkadot/src/lib.rs | 2 +- runtime/test-runtime/Cargo.toml | 2 +- runtime/westend/Cargo.toml | 2 +- runtime/westend/src/lib.rs | 2 +- service/Cargo.toml | 2 +- statement-table/Cargo.toml | 2 +- validation/Cargo.toml | 2 +- 26 files changed, 45 insertions(+), 45 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index ab0785e573..b102622e15 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2478,7 +2478,7 @@ dependencies = [ [[package]] name = "kusama-runtime" -version = "0.8.19" +version = "0.8.22" dependencies = [ "bitvec", "frame-benchmarking", @@ -4372,7 +4372,7 @@ checksum = "feb3b2b1033b8a60b4da6ee470325f887758c95d5320f52f9ce0df055a55940e" [[package]] name = "polkadot" -version = "0.8.19" +version = "0.8.22" dependencies = [ "assert_cmd", "futures 0.3.5", @@ -4411,7 +4411,7 @@ dependencies = [ [[package]] name = "polkadot-availability-store" -version = "0.8.19" +version = "0.8.22" dependencies = [ "derive_more 0.99.9", "exit-future", @@ -4437,7 +4437,7 @@ dependencies = [ [[package]] name = "polkadot-cli" -version = "0.8.19" +version = "0.8.22" dependencies = [ "frame-benchmarking-cli", "futures 0.3.5", @@ -4462,7 +4462,7 @@ dependencies = [ [[package]] name = "polkadot-collator" -version = "0.8.19" +version = "0.8.22" dependencies = [ "futures 0.3.5", "futures-timer 2.0.2", @@ -4500,7 +4500,7 @@ dependencies = [ [[package]] name = "polkadot-erasure-coding" -version = "0.8.19" +version = "0.8.22" dependencies = [ "derive_more 0.15.0", "parity-scale-codec", @@ -4512,7 +4512,7 @@ dependencies = [ [[package]] name = "polkadot-network" -version = "0.8.19" +version = "0.8.22" dependencies = [ "arrayvec 0.4.12", "bytes 0.5.5", @@ -4560,7 +4560,7 @@ dependencies = [ [[package]] name = "polkadot-network-test" -version = "0.8.19" +version = "0.8.22" dependencies = [ "futures 0.3.5", "log 0.4.8", @@ -4715,7 +4715,7 @@ dependencies = [ [[package]] name = "polkadot-parachain" -version = "0.8.19" +version = "0.8.22" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -4754,7 +4754,7 @@ dependencies = [ [[package]] name = "polkadot-primitives" -version = "0.8.19" +version = "0.8.22" dependencies = [ "bitvec", "frame-system", @@ -4778,7 +4778,7 @@ dependencies = [ [[package]] name = "polkadot-rpc" -version = "0.8.19" +version = "0.8.22" dependencies = [ "jsonrpc-core", "pallet-transaction-payment-rpc", @@ -4804,7 +4804,7 @@ dependencies = [ [[package]] name = "polkadot-runtime" -version = "0.8.19" +version = "0.8.22" dependencies = [ "bitvec", "frame-benchmarking", @@ -4878,7 +4878,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-common" -version = "0.8.19" +version = "0.8.22" dependencies = [ "bitvec", "frame-benchmarking", @@ -4966,7 +4966,7 @@ dependencies = [ [[package]] name = "polkadot-service" -version = "0.8.19" +version = "0.8.22" dependencies = [ "env_logger", "frame-benchmarking", @@ -5109,7 +5109,7 @@ dependencies = [ [[package]] name = "polkadot-statement-table" -version = "0.8.19" +version = "0.8.22" dependencies = [ "parity-scale-codec", "polkadot-primitives", @@ -5118,7 +5118,7 @@ dependencies = [ [[package]] name = "polkadot-test-runtime" -version = "0.8.19" +version = "0.8.22" dependencies = [ "bitvec", "frame-executive", @@ -5249,7 +5249,7 @@ dependencies = [ [[package]] name = "polkadot-validation" -version = "0.8.19" +version = "0.8.22" dependencies = [ "ansi_term 0.12.1", "bitvec", @@ -8427,7 +8427,7 @@ dependencies = [ [[package]] name = "test-parachain-adder" -version = "0.8.19" +version = "0.8.22" dependencies = [ "dlmalloc", "parity-scale-codec", @@ -8468,7 +8468,7 @@ dependencies = [ [[package]] name = "test-parachain-halt" -version = "0.8.19" +version = "0.8.22" dependencies = [ "substrate-wasm-builder-runner 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -9499,7 +9499,7 @@ dependencies = [ [[package]] name = "westend-runtime" -version = "0.8.19" +version = "0.8.22" dependencies = [ "bitvec", "frame-benchmarking", diff --git a/Cargo.toml b/Cargo.toml index f595fef855..23079972a0 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,7 +4,7 @@ path = "src/main.rs" [package] name = "polkadot" -version = "0.8.19" +version = "0.8.22" authors = ["Parity Technologies "] edition = "2018" diff --git a/availability-store/Cargo.toml b/availability-store/Cargo.toml index 83bc002d90..82c630ac63 100644 --- a/availability-store/Cargo.toml +++ b/availability-store/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "polkadot-availability-store" description = "Persistent database for parachain data" -version = "0.8.19" +version = "0.8.22" authors = ["Parity Technologies "] edition = "2018" diff --git a/cli/Cargo.toml b/cli/Cargo.toml index fd0b0231e0..bcff87462b 100644 --- a/cli/Cargo.toml +++ b/cli/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-cli" -version = "0.8.19" +version = "0.8.22" authors = ["Parity Technologies "] description = "Polkadot Relay-chain Client Node" edition = "2018" diff --git a/collator/Cargo.toml b/collator/Cargo.toml index df0bbc94cd..38cb3ee2e2 100644 --- a/collator/Cargo.toml +++ b/collator/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-collator" -version = "0.8.19" +version = "0.8.22" authors = ["Parity Technologies "] description = "Collator node implementation" edition = "2018" diff --git a/erasure-coding/Cargo.toml b/erasure-coding/Cargo.toml index e4215f8c90..1965150ca6 100644 --- a/erasure-coding/Cargo.toml +++ b/erasure-coding/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-erasure-coding" -version = "0.8.19" +version = "0.8.22" authors = ["Parity Technologies "] edition = "2018" diff --git a/network/Cargo.toml b/network/Cargo.toml index 34c377caf1..6685bbb382 100644 --- a/network/Cargo.toml +++ b/network/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-network" -version = "0.8.19" +version = "0.8.22" authors = ["Parity Technologies "] description = "Polkadot-specific networking protocol" edition = "2018" diff --git a/network/test/Cargo.toml b/network/test/Cargo.toml index 69f5a96f3c..d59123fad9 100644 --- a/network/test/Cargo.toml +++ b/network/test/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-network-test" -version = "0.8.19" +version = "0.8.22" license = "GPL-3.0" authors = ["Parity Technologies "] edition = "2018" diff --git a/parachain/Cargo.toml b/parachain/Cargo.toml index 56092f1046..bb8a340eca 100644 --- a/parachain/Cargo.toml +++ b/parachain/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-parachain" -version = "0.8.19" +version = "0.8.22" authors = ["Parity Technologies "] description = "Types and utilities for creating and working with parachains" edition = "2018" diff --git a/parachain/test-parachains/adder/Cargo.toml b/parachain/test-parachains/adder/Cargo.toml index 9bd6b67ba1..5b2e79257f 100644 --- a/parachain/test-parachains/adder/Cargo.toml +++ b/parachain/test-parachains/adder/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "test-parachain-adder" -version = "0.8.19" +version = "0.8.22" authors = ["Parity Technologies "] description = "Test parachain which adds to a number as its state transition" edition = "2018" diff --git a/parachain/test-parachains/halt/Cargo.toml b/parachain/test-parachains/halt/Cargo.toml index 892f82273d..9d1af0e646 100644 --- a/parachain/test-parachains/halt/Cargo.toml +++ b/parachain/test-parachains/halt/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "test-parachain-halt" -version = "0.8.19" +version = "0.8.22" authors = ["Parity Technologies "] description = "Test parachain which executes forever" edition = "2018" diff --git a/primitives/Cargo.toml b/primitives/Cargo.toml index 442169cbf2..797b21df12 100644 --- a/primitives/Cargo.toml +++ b/primitives/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-primitives" -version = "0.8.19" +version = "0.8.22" authors = ["Parity Technologies "] edition = "2018" diff --git a/rpc/Cargo.toml b/rpc/Cargo.toml index 1929548881..04034f45ed 100644 --- a/rpc/Cargo.toml +++ b/rpc/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-rpc" -version = "0.8.19" +version = "0.8.22" authors = ["Parity Technologies "] edition = "2018" diff --git a/runtime/common/Cargo.toml b/runtime/common/Cargo.toml index 66652c967c..e00d904915 100644 --- a/runtime/common/Cargo.toml +++ b/runtime/common/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-runtime-common" -version = "0.8.19" +version = "0.8.22" authors = ["Parity Technologies "] edition = "2018" diff --git a/runtime/common/src/registrar.rs b/runtime/common/src/registrar.rs index 5493d20839..bf56d733ca 100644 --- a/runtime/common/src/registrar.rs +++ b/runtime/common/src/registrar.rs @@ -205,7 +205,7 @@ decl_storage! { #[cfg(feature = "std")] fn build(config: &GenesisConfig) { let mut p = config.parachains.clone(); - p.sort_unstable_by_key(|&(ref id, _, _)| *id); + p.sort_by_key(|&(ref id, _, _)| *id); p.dedup_by_key(|&mut (ref id, _, _)| *id); let only_ids: Vec = p.iter().map(|&(ref id, _, _)| id).cloned().collect(); diff --git a/runtime/kusama/Cargo.toml b/runtime/kusama/Cargo.toml index 2f3f04ae8a..b8f2e5a248 100644 --- a/runtime/kusama/Cargo.toml +++ b/runtime/kusama/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "kusama-runtime" -version = "0.8.19" +version = "0.8.22" authors = ["Parity Technologies "] edition = "2018" build = "build.rs" diff --git a/runtime/kusama/src/lib.rs b/runtime/kusama/src/lib.rs index 29215aae36..70e15cbc5d 100644 --- a/runtime/kusama/src/lib.rs +++ b/runtime/kusama/src/lib.rs @@ -87,7 +87,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("kusama"), impl_name: create_runtime_str!("parity-kusama"), authoring_version: 2, - spec_version: 2021, + spec_version: 2022, impl_version: 0, #[cfg(not(feature = "disable-runtime-api"))] apis: RUNTIME_API_VERSIONS, diff --git a/runtime/parachains/src/paras.rs b/runtime/parachains/src/paras.rs index 2eab9c0546..4c628818a6 100644 --- a/runtime/parachains/src/paras.rs +++ b/runtime/parachains/src/paras.rs @@ -223,7 +223,7 @@ fn build(config: &GenesisConfig) { .cloned() .collect(); - parachains.sort_unstable(); + parachains.sort(); parachains.dedup(); Parachains::put(¶chains); diff --git a/runtime/polkadot/Cargo.toml b/runtime/polkadot/Cargo.toml index d399d9304d..cd1b5e1436 100644 --- a/runtime/polkadot/Cargo.toml +++ b/runtime/polkadot/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-runtime" -version = "0.8.19" +version = "0.8.22" authors = ["Parity Technologies "] edition = "2018" build = "build.rs" diff --git a/runtime/polkadot/src/lib.rs b/runtime/polkadot/src/lib.rs index 195125d578..328fd927be 100644 --- a/runtime/polkadot/src/lib.rs +++ b/runtime/polkadot/src/lib.rs @@ -86,7 +86,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("polkadot"), impl_name: create_runtime_str!("parity-polkadot"), authoring_version: 0, - spec_version: 21, + spec_version: 22, impl_version: 0, #[cfg(not(feature = "disable-runtime-api"))] apis: RUNTIME_API_VERSIONS, diff --git a/runtime/test-runtime/Cargo.toml b/runtime/test-runtime/Cargo.toml index 60965effd7..100b373935 100644 --- a/runtime/test-runtime/Cargo.toml +++ b/runtime/test-runtime/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-test-runtime" -version = "0.8.19" +version = "0.8.22" authors = ["Parity Technologies "] edition = "2018" build = "build.rs" diff --git a/runtime/westend/Cargo.toml b/runtime/westend/Cargo.toml index 2cfea3a424..3e1d100105 100644 --- a/runtime/westend/Cargo.toml +++ b/runtime/westend/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "westend-runtime" -version = "0.8.19" +version = "0.8.22" authors = ["Parity Technologies "] edition = "2018" build = "build.rs" diff --git a/runtime/westend/src/lib.rs b/runtime/westend/src/lib.rs index 84daa4d204..49cc91c533 100644 --- a/runtime/westend/src/lib.rs +++ b/runtime/westend/src/lib.rs @@ -83,7 +83,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("westend"), impl_name: create_runtime_str!("parity-westend"), authoring_version: 2, - spec_version: 41, + spec_version: 42, impl_version: 0, #[cfg(not(feature = "disable-runtime-api"))] apis: RUNTIME_API_VERSIONS, diff --git a/service/Cargo.toml b/service/Cargo.toml index 1f9af907b7..9c16f6372b 100644 --- a/service/Cargo.toml +++ b/service/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-service" -version = "0.8.19" +version = "0.8.22" authors = ["Parity Technologies "] edition = "2018" diff --git a/statement-table/Cargo.toml b/statement-table/Cargo.toml index 86dc46f7f3..358a9b37d7 100644 --- a/statement-table/Cargo.toml +++ b/statement-table/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-statement-table" -version = "0.8.19" +version = "0.8.22" authors = ["Parity Technologies "] edition = "2018" diff --git a/validation/Cargo.toml b/validation/Cargo.toml index eee53c69da..95d4643ada 100644 --- a/validation/Cargo.toml +++ b/validation/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-validation" -version = "0.8.19" +version = "0.8.22" authors = ["Parity Technologies "] edition = "2018" -- GitLab From cdd939499e0fd648d762e4227ed5783b1b8c0b2e Mon Sep 17 00:00:00 2001 From: Peter Goodspeed-Niklaus Date: Thu, 30 Jul 2020 00:33:06 +0200 Subject: [PATCH 116/192] Fix bitfield signing (#1466) * Apply suggestions from #1364 code review - use CoreState, not CoreOccupied - query for availability chunks, not the whole PoV - create a stub `fn availability_cores` * link to issue documenting unimplemented * implement get_availability_cores by adding a new runtime api request * back out an unrelated change properly part of #1404 * av-store: handle QueryChunkAvailability * simplify QueryDataAvailability * remove extraneous whitespace * compact primitive imports --- node/core/av-store/src/lib.rs | 14 ++--- node/core/bitfield-signing/src/lib.rs | 84 +++++++++++++++------------ node/subsystem/src/messages.rs | 10 +++- 3 files changed, 62 insertions(+), 46 deletions(-) diff --git a/node/core/av-store/src/lib.rs b/node/core/av-store/src/lib.rs index 386ff99f27..14f027dc86 100644 --- a/node/core/av-store/src/lib.rs +++ b/node/core/av-store/src/lib.rs @@ -149,16 +149,14 @@ fn process_message(db: &Arc, msg: AvailabilityStoreMessage) -> R tx.send(available_data(db, &hash).map(|d| d.data)).map_err(|_| oneshot::Canceled)?; } QueryDataAvailability(hash, tx) => { - let result = match available_data(db, &hash) { - Some(_) => true, - None => false, - }; - - tx.send(result).map_err(|_| oneshot::Canceled)?; + tx.send(available_data(db, &hash).is_some()).map_err(|_| oneshot::Canceled)?; } QueryChunk(hash, id, tx) => { tx.send(get_chunk(db, &hash, id)?).map_err(|_| oneshot::Canceled)?; } + QueryChunkAvailability(hash, id, tx) => { + tx.send(get_chunk(db, &hash, id)?.is_some()).map_err(|_| oneshot::Canceled)?; + } StoreChunk(hash, id, chunk, tx) => { match store_chunk(db, &hash, id, chunk) { Err(e) => { @@ -394,7 +392,7 @@ mod tests { let chunk_msg = AvailabilityStoreMessage::StoreChunk( relay_parent, - validator_index, + validator_index, chunk.clone(), tx, ); @@ -436,7 +434,7 @@ mod tests { global_validation, local_validation, }; - + let available_data = AvailableData { pov, omitted_validation, diff --git a/node/core/bitfield-signing/src/lib.rs b/node/core/bitfield-signing/src/lib.rs index 601f0b41b9..e3bb68cec9 100644 --- a/node/core/bitfield-signing/src/lib.rs +++ b/node/core/bitfield-signing/src/lib.rs @@ -26,11 +26,11 @@ use keystore::KeyStorePtr; use polkadot_node_subsystem::{ messages::{ self, AllMessages, AvailabilityStoreMessage, BitfieldDistributionMessage, - BitfieldSigningMessage, CandidateBackingMessage, RuntimeApiMessage, + BitfieldSigningMessage, CandidateBackingMessage, RuntimeApiMessage, RuntimeApiError }, util::{self, JobManager, JobTrait, ToJobTrait, Validator}, }; -use polkadot_primitives::v1::{AvailabilityBitfield, CoreState, Hash}; +use polkadot_primitives::v1::{AvailabilityBitfield, CoreState, Hash, ValidatorIndex}; use std::{convert::TryFrom, pin::Pin, time::Duration}; use wasm_timer::{Delay, Instant}; @@ -125,16 +125,21 @@ pub enum Error { /// several errors collected into one #[from] Multiple(Vec), + /// the runtime API failed to return what we wanted + #[from] + Runtime(RuntimeApiError), } -// this function exists mainly to collect a bunch of potential error points into one. +// if there is a candidate pending availability, query the Availability Store +// for whether we have the availability chunk for our validator index. async fn get_core_availability( relay_parent: Hash, core: CoreState, + validator_idx: ValidatorIndex, sender: &mpsc::Sender, ) -> Result { use messages::{ - AvailabilityStoreMessage::QueryDataAvailability, + AvailabilityStoreMessage::QueryChunkAvailability, RuntimeApiRequest::CandidatePendingAvailability, }; use FromJob::{AvailabilityStore, RuntimeApi}; @@ -163,8 +168,9 @@ async fn get_core_availability( }; let (tx, rx) = oneshot::channel(); sender - .send(AvailabilityStore(QueryDataAvailability( + .send(AvailabilityStore(QueryChunkAvailability( committed_candidate_receipt.descriptor.pov_hash, + validator_idx, tx, ))) .await?; @@ -173,43 +179,42 @@ async fn get_core_availability( Ok(false) } -// the way this function works is not intuitive: -// -// - get the availability cores so we have a list of cores, in order. -// - for each occupied core, fetch `candidate_pending_availability` from runtime -// - from there, we can get the `CandidateDescriptor` -// - from there, we can send a `AvailabilityStore::QueryPoV` and set the indexed bit to 1 if it returns Some(_) +// delegates to the v1 runtime API +async fn get_availability_cores(relay_parent: Hash, sender: &mut mpsc::Sender) -> Result, Error> { + use FromJob::RuntimeApi; + use messages::{ + RuntimeApiMessage::Request, + RuntimeApiRequest::AvailabilityCores, + }; + + let (tx, rx) = oneshot::channel(); + sender.send(RuntimeApi(Request(relay_parent, AvailabilityCores(tx)))).await?; + match rx.await { + Ok(Ok(out)) => Ok(out), + Ok(Err(runtime_err)) => Err(runtime_err.into()), + Err(err) => Err(err.into()) + } +} + +// - get the list of core states from the runtime +// - for each core, concurrently determine chunk availability (see `get_core_availability`) +// - return the bitfield if there were no errors at any point in this process +// (otherwise, it's prone to false negatives) async fn construct_availability_bitfield( relay_parent: Hash, + validator_idx: ValidatorIndex, sender: &mut mpsc::Sender, -) -> Result, Error> { +) -> Result { use futures::lock::Mutex; - use messages::RuntimeApiRequest::AvailabilityCores; - use FromJob::RuntimeApi; - use RuntimeApiMessage::Request; - - // request the availability cores metadata from runtime. - let (tx, rx) = oneshot::channel(); - sender - .send(RuntimeApi(Request(relay_parent, AvailabilityCores(tx)))) - .await?; + // get the set of availability cores from the runtime + let availability_cores = get_availability_cores(relay_parent, sender).await?; // we now need sender to be immutable so we can copy the reference to multiple concurrent closures let sender = &*sender; - // wait for the cores - let availability_cores = match rx.await? { - Ok(a) => a, - Err(e) => { - log::warn!(target: "bitfield_signing", "Encountered a runtime API error: {:?}", e); - return Ok(None); - } - }; - // prepare outputs - let out = - Mutex::new(bitvec!(bitvec::order::Lsb0, u8; 0; availability_cores.len())); + let out = Mutex::new(bitvec!(bitvec::order::Lsb0, u8; 0; availability_cores.len())); // in principle, we know that we never want concurrent access to the _same_ bit within the vec; // we could `let out_ref = out.as_mut_ptr();` here instead, and manually assign bits, avoiding // any need to ever wait to lock this mutex. @@ -225,7 +230,7 @@ async fn construct_availability_bitfield( // we need the mutexes and explicit references above. stream::iter(availability_cores.into_iter().enumerate()) .for_each_concurrent(None, |(idx, core)| async move { - let availability = match get_core_availability(relay_parent, core, sender).await { + let availability = match get_core_availability(relay_parent, core, validator_idx, sender).await { Ok(availability) => availability, Err(err) => { errs_ref.lock().await.push(err); @@ -238,7 +243,7 @@ async fn construct_availability_bitfield( let errs = errs.into_inner(); if errs.is_empty() { - Ok(Some(out.into_inner().into())) + Ok(out.into_inner().into()) } else { Err(errs.into()) } @@ -275,10 +280,15 @@ impl JobTrait for BitfieldSigningJob { Delay::new_at(wait_until).await?; let bitfield = - match construct_availability_bitfield(relay_parent, &mut sender).await? + match construct_availability_bitfield(relay_parent, validator.index(), &mut sender).await { - None => return Ok(()), - Some(b) => b, + Err(Error::Runtime(runtime_err)) => { + // Don't take down the node on runtime API errors. + log::warn!(target: "bitfield_signing", "Encountered a runtime API error: {:?}", runtime_err); + return Ok(()); + } + Err(err) => return Err(err), + Ok(bitfield) => bitfield, }; let signed_bitfield = validator.sign(bitfield); diff --git a/node/subsystem/src/messages.rs b/node/subsystem/src/messages.rs index d6bd4f45d8..895e936d5b 100644 --- a/node/subsystem/src/messages.rs +++ b/node/subsystem/src/messages.rs @@ -242,7 +242,7 @@ pub enum AvailabilityStoreMessage { /// Query whether a `AvailableData` exists within the AV Store. /// - /// This is useful in cases like bitfield signing, when existence + /// This is useful in cases when existence /// matters, but we don't want to necessarily pass around multiple /// megabytes of data to get a single bit of information. QueryDataAvailability(Hash, oneshot::Sender), @@ -250,6 +250,13 @@ pub enum AvailabilityStoreMessage { /// Query an `ErasureChunk` from the AV store. QueryChunk(Hash, ValidatorIndex, oneshot::Sender>), + /// Query whether an `ErasureChunk` exists within the AV Store. + /// + /// This is useful in cases like bitfield signing, when existence + /// matters, but we don't want to necessarily pass around large + /// quantities of data to get a single bit of information. + QueryChunkAvailability(Hash, ValidatorIndex, oneshot::Sender), + /// Store an `ErasureChunk` in the AV store. /// /// Return `Ok(())` if the store operation succeeded, `Err(())` if it failed. @@ -269,6 +276,7 @@ impl AvailabilityStoreMessage { Self::QueryAvailableData(hash, _) => Some(*hash), Self::QueryDataAvailability(hash, _) => Some(*hash), Self::QueryChunk(hash, _, _) => Some(*hash), + Self::QueryChunkAvailability(hash, _, _) => Some(*hash), Self::StoreChunk(hash, _, _, _) => Some(*hash), Self::StoreAvailableData(hash, _, _, _, _) => Some(*hash), } -- GitLab From fe98d73ff974928f097ca3113a03cfbe438c41e3 Mon Sep 17 00:00:00 2001 From: Ashley Date: Thu, 30 Jul 2020 11:25:59 +0200 Subject: [PATCH 117/192] Companion PR for `Add a `DefaultQueue` type alias to remove the need to use `sp_api::TransactionFor`` (#1499) * BabeImportQueue -> DefaultImportQueue * Use DefaultImportQueue from the top level of consensus_common * 'Update substrate' Co-authored-by: parity-processbot <> --- Cargo.lock | 275 ++++++++++++++++++++-------------------- node/service/src/lib.rs | 2 +- service/src/lib.rs | 2 +- 3 files changed, 140 insertions(+), 139 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index b102622e15..e85220c669 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1370,7 +1370,7 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "fork-tree" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" +source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" dependencies = [ "parity-scale-codec", ] @@ -1378,7 +1378,7 @@ dependencies = [ [[package]] name = "frame-benchmarking" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" +source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" dependencies = [ "frame-support", "frame-system", @@ -1395,7 +1395,7 @@ dependencies = [ [[package]] name = "frame-benchmarking-cli" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" +source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" dependencies = [ "Inflector", "frame-benchmarking", @@ -1414,7 +1414,7 @@ dependencies = [ [[package]] name = "frame-executive" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" +source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" dependencies = [ "frame-support", "frame-system", @@ -1429,7 +1429,7 @@ dependencies = [ [[package]] name = "frame-metadata" version = "11.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" +source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" dependencies = [ "parity-scale-codec", "serde", @@ -1440,7 +1440,7 @@ dependencies = [ [[package]] name = "frame-support" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" +source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" dependencies = [ "bitmask", "frame-metadata", @@ -1465,7 +1465,7 @@ dependencies = [ [[package]] name = "frame-support-procedural" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" +source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" dependencies = [ "frame-support-procedural-tools", "proc-macro2 1.0.18", @@ -1476,7 +1476,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" +source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" dependencies = [ "frame-support-procedural-tools-derive", "proc-macro-crate", @@ -1488,7 +1488,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools-derive" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" +source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" dependencies = [ "proc-macro2 1.0.18", "quote 1.0.7", @@ -1498,7 +1498,7 @@ dependencies = [ [[package]] name = "frame-system" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" +source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" dependencies = [ "frame-support", "impl-trait-for-tuples", @@ -1514,7 +1514,7 @@ dependencies = [ [[package]] name = "frame-system-benchmarking" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" +source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" dependencies = [ "frame-benchmarking", "frame-support", @@ -1528,7 +1528,7 @@ dependencies = [ [[package]] name = "frame-system-rpc-runtime-api" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" +source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" dependencies = [ "parity-scale-codec", "sp-api", @@ -3542,7 +3542,7 @@ dependencies = [ [[package]] name = "pallet-authority-discovery" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" +source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" dependencies = [ "frame-support", "frame-system", @@ -3558,7 +3558,7 @@ dependencies = [ [[package]] name = "pallet-authorship" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" +source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" dependencies = [ "frame-support", "frame-system", @@ -3573,7 +3573,7 @@ dependencies = [ [[package]] name = "pallet-babe" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" +source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" dependencies = [ "frame-benchmarking", "frame-support", @@ -3598,7 +3598,7 @@ dependencies = [ [[package]] name = "pallet-balances" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" +source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" dependencies = [ "frame-benchmarking", "frame-support", @@ -3612,7 +3612,7 @@ dependencies = [ [[package]] name = "pallet-collective" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" +source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" dependencies = [ "frame-benchmarking", "frame-support", @@ -3628,7 +3628,7 @@ dependencies = [ [[package]] name = "pallet-democracy" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" +source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" dependencies = [ "frame-benchmarking", "frame-support", @@ -3643,7 +3643,7 @@ dependencies = [ [[package]] name = "pallet-elections-phragmen" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" +source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" dependencies = [ "frame-benchmarking", "frame-support", @@ -3658,7 +3658,7 @@ dependencies = [ [[package]] name = "pallet-finality-tracker" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" +source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" dependencies = [ "frame-support", "frame-system", @@ -3674,7 +3674,7 @@ dependencies = [ [[package]] name = "pallet-grandpa" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" +source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" dependencies = [ "frame-benchmarking", "frame-support", @@ -3696,7 +3696,7 @@ dependencies = [ [[package]] name = "pallet-identity" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" +source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" dependencies = [ "enumflags2", "frame-benchmarking", @@ -3712,7 +3712,7 @@ dependencies = [ [[package]] name = "pallet-im-online" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" +source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" dependencies = [ "frame-benchmarking", "frame-support", @@ -3732,7 +3732,7 @@ dependencies = [ [[package]] name = "pallet-indices" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" +source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" dependencies = [ "frame-support", "frame-system", @@ -3748,7 +3748,7 @@ dependencies = [ [[package]] name = "pallet-membership" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" +source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" dependencies = [ "frame-support", "frame-system", @@ -3762,7 +3762,7 @@ dependencies = [ [[package]] name = "pallet-multisig" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" +source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" dependencies = [ "frame-support", "frame-system", @@ -3777,7 +3777,7 @@ dependencies = [ [[package]] name = "pallet-nicks" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" +source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" dependencies = [ "frame-support", "frame-system", @@ -3791,7 +3791,7 @@ dependencies = [ [[package]] name = "pallet-offences" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" +source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" dependencies = [ "frame-support", "frame-system", @@ -3806,7 +3806,7 @@ dependencies = [ [[package]] name = "pallet-offences-benchmarking" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" +source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" dependencies = [ "frame-benchmarking", "frame-support", @@ -3827,7 +3827,7 @@ dependencies = [ [[package]] name = "pallet-proxy" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" +source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" dependencies = [ "frame-support", "frame-system", @@ -3842,7 +3842,7 @@ dependencies = [ [[package]] name = "pallet-randomness-collective-flip" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" +source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" dependencies = [ "frame-support", "frame-system", @@ -3855,7 +3855,7 @@ dependencies = [ [[package]] name = "pallet-recovery" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" +source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" dependencies = [ "enumflags2", "frame-support", @@ -3870,7 +3870,7 @@ dependencies = [ [[package]] name = "pallet-scheduler" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" +source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" dependencies = [ "frame-benchmarking", "frame-support", @@ -3885,7 +3885,7 @@ dependencies = [ [[package]] name = "pallet-session" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" +source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" dependencies = [ "frame-support", "frame-system", @@ -3905,7 +3905,7 @@ dependencies = [ [[package]] name = "pallet-session-benchmarking" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" +source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" dependencies = [ "frame-benchmarking", "frame-support", @@ -3921,7 +3921,7 @@ dependencies = [ [[package]] name = "pallet-society" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" +source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" dependencies = [ "frame-support", "frame-system", @@ -3935,7 +3935,7 @@ dependencies = [ [[package]] name = "pallet-staking" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" +source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" dependencies = [ "frame-benchmarking", "frame-support", @@ -3957,7 +3957,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-curve" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" +source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -3968,7 +3968,7 @@ dependencies = [ [[package]] name = "pallet-sudo" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" +source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" dependencies = [ "frame-support", "frame-system", @@ -3982,7 +3982,7 @@ dependencies = [ [[package]] name = "pallet-timestamp" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" +source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" dependencies = [ "frame-benchmarking", "frame-support", @@ -4000,7 +4000,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" +source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" dependencies = [ "frame-support", "frame-system", @@ -4017,7 +4017,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" +source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" dependencies = [ "jsonrpc-core", "jsonrpc-core-client", @@ -4035,7 +4035,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc-runtime-api" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" +source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" dependencies = [ "frame-support", "parity-scale-codec", @@ -4048,7 +4048,7 @@ dependencies = [ [[package]] name = "pallet-treasury" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" +source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" dependencies = [ "frame-benchmarking", "frame-support", @@ -4063,7 +4063,7 @@ dependencies = [ [[package]] name = "pallet-utility" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" +source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" dependencies = [ "frame-benchmarking", "frame-support", @@ -4079,7 +4079,7 @@ dependencies = [ [[package]] name = "pallet-vesting" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" +source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" dependencies = [ "enumflags2", "frame-benchmarking", @@ -6058,7 +6058,7 @@ dependencies = [ [[package]] name = "sc-authority-discovery" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" +source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" dependencies = [ "bytes 0.5.5", "derive_more 0.99.9", @@ -6085,7 +6085,7 @@ dependencies = [ [[package]] name = "sc-basic-authorship" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" +source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6109,7 +6109,7 @@ dependencies = [ [[package]] name = "sc-block-builder" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" +source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" dependencies = [ "parity-scale-codec", "sc-client-api", @@ -6126,7 +6126,7 @@ dependencies = [ [[package]] name = "sc-chain-spec" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" +source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" dependencies = [ "impl-trait-for-tuples", "sc-chain-spec-derive", @@ -6142,7 +6142,7 @@ dependencies = [ [[package]] name = "sc-chain-spec-derive" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" +source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -6153,7 +6153,7 @@ dependencies = [ [[package]] name = "sc-cli" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" +source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" dependencies = [ "ansi_term 0.12.1", "atty", @@ -6194,7 +6194,7 @@ dependencies = [ [[package]] name = "sc-client-api" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" +source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" dependencies = [ "derive_more 0.99.9", "fnv", @@ -6230,7 +6230,7 @@ dependencies = [ [[package]] name = "sc-client-db" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" +source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" dependencies = [ "blake2-rfc", "hash-db", @@ -6259,7 +6259,7 @@ dependencies = [ [[package]] name = "sc-consensus" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" +source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" dependencies = [ "sc-client-api", "sp-blockchain", @@ -6270,7 +6270,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" +source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" dependencies = [ "derive_more 0.99.9", "fork-tree", @@ -6312,7 +6312,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe-rpc" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" +source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -6336,7 +6336,7 @@ dependencies = [ [[package]] name = "sc-consensus-epochs" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" +source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" dependencies = [ "fork-tree", "parity-scale-codec", @@ -6349,7 +6349,7 @@ dependencies = [ [[package]] name = "sc-consensus-slots" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" +source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6372,7 +6372,7 @@ dependencies = [ [[package]] name = "sc-consensus-uncles" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" +source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" dependencies = [ "log 0.4.8", "sc-client-api", @@ -6386,7 +6386,7 @@ dependencies = [ [[package]] name = "sc-executor" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" +source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" dependencies = [ "derive_more 0.99.9", "lazy_static", @@ -6414,7 +6414,7 @@ dependencies = [ [[package]] name = "sc-executor-common" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" +source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" dependencies = [ "derive_more 0.99.9", "log 0.4.8", @@ -6431,7 +6431,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmi" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" +source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" dependencies = [ "log 0.4.8", "parity-scale-codec", @@ -6446,7 +6446,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmtime" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" +source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" dependencies = [ "cranelift-codegen", "cranelift-wasm", @@ -6467,7 +6467,7 @@ dependencies = [ [[package]] name = "sc-finality-grandpa" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" +source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" dependencies = [ "assert_matches", "derive_more 0.99.9", @@ -6505,7 +6505,7 @@ dependencies = [ [[package]] name = "sc-finality-grandpa-rpc" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" +source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" dependencies = [ "derive_more 0.99.9", "finality-grandpa", @@ -6522,7 +6522,7 @@ dependencies = [ [[package]] name = "sc-informant" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" +source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" dependencies = [ "ansi_term 0.12.1", "futures 0.3.5", @@ -6540,7 +6540,7 @@ dependencies = [ [[package]] name = "sc-keystore" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" +source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" dependencies = [ "derive_more 0.99.9", "hex", @@ -6556,7 +6556,7 @@ dependencies = [ [[package]] name = "sc-light" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" +source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" dependencies = [ "hash-db", "lazy_static", @@ -6575,7 +6575,7 @@ dependencies = [ [[package]] name = "sc-network" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" +source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" dependencies = [ "bitflags", "bs58", @@ -6627,7 +6627,7 @@ dependencies = [ [[package]] name = "sc-network-gossip" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" +source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6642,7 +6642,7 @@ dependencies = [ [[package]] name = "sc-network-test" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" +source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" dependencies = [ "env_logger", "futures 0.3.5", @@ -6669,7 +6669,7 @@ dependencies = [ [[package]] name = "sc-offchain" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" +source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" dependencies = [ "bytes 0.5.5", "fnv", @@ -6696,7 +6696,7 @@ dependencies = [ [[package]] name = "sc-peerset" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" +source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" dependencies = [ "futures 0.3.5", "libp2p", @@ -6709,7 +6709,7 @@ dependencies = [ [[package]] name = "sc-proposer-metrics" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" +source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" dependencies = [ "log 0.4.8", "substrate-prometheus-endpoint", @@ -6718,7 +6718,7 @@ dependencies = [ [[package]] name = "sc-rpc" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" +source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" dependencies = [ "futures 0.3.5", "hash-db", @@ -6750,7 +6750,7 @@ dependencies = [ [[package]] name = "sc-rpc-api" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" +source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -6774,7 +6774,7 @@ dependencies = [ [[package]] name = "sc-rpc-server" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" +source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" dependencies = [ "jsonrpc-core", "jsonrpc-http-server", @@ -6790,7 +6790,7 @@ dependencies = [ [[package]] name = "sc-service" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" +source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" dependencies = [ "derive_more 0.99.9", "directories", @@ -6853,7 +6853,7 @@ dependencies = [ [[package]] name = "sc-state-db" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" +source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" dependencies = [ "log 0.4.8", "parity-scale-codec", @@ -6867,7 +6867,7 @@ dependencies = [ [[package]] name = "sc-telemetry" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" +source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6888,7 +6888,7 @@ dependencies = [ [[package]] name = "sc-tracing" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" +source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" dependencies = [ "erased-serde", "log 0.4.8", @@ -6905,7 +6905,7 @@ dependencies = [ [[package]] name = "sc-transaction-graph" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" +source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -6926,7 +6926,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" +source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -7381,7 +7381,7 @@ dependencies = [ [[package]] name = "sp-allocator" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" +source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" dependencies = [ "derive_more 0.99.9", "log 0.4.8", @@ -7393,7 +7393,7 @@ dependencies = [ [[package]] name = "sp-api" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" +source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" dependencies = [ "hash-db", "parity-scale-codec", @@ -7408,7 +7408,7 @@ dependencies = [ [[package]] name = "sp-api-proc-macro" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" +source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" dependencies = [ "blake2-rfc", "proc-macro-crate", @@ -7420,7 +7420,7 @@ dependencies = [ [[package]] name = "sp-application-crypto" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" +source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" dependencies = [ "parity-scale-codec", "serde", @@ -7432,7 +7432,7 @@ dependencies = [ [[package]] name = "sp-arithmetic" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" +source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" dependencies = [ "integer-sqrt", "num-traits 0.2.12", @@ -7445,7 +7445,7 @@ dependencies = [ [[package]] name = "sp-authority-discovery" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" +source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" dependencies = [ "parity-scale-codec", "sp-api", @@ -7457,7 +7457,7 @@ dependencies = [ [[package]] name = "sp-authorship" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" +source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" dependencies = [ "parity-scale-codec", "sp-inherents", @@ -7468,7 +7468,7 @@ dependencies = [ [[package]] name = "sp-block-builder" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" +source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" dependencies = [ "parity-scale-codec", "sp-api", @@ -7480,7 +7480,7 @@ dependencies = [ [[package]] name = "sp-blockchain" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" +source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" dependencies = [ "derive_more 0.99.9", "log 0.4.8", @@ -7497,7 +7497,7 @@ dependencies = [ [[package]] name = "sp-chain-spec" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" +source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" dependencies = [ "serde", "serde_json", @@ -7506,7 +7506,7 @@ dependencies = [ [[package]] name = "sp-consensus" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" +source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -7516,6 +7516,7 @@ dependencies = [ "parity-scale-codec", "parking_lot 0.10.2", "serde", + "sp-api", "sp-core", "sp-inherents", "sp-runtime", @@ -7531,7 +7532,7 @@ dependencies = [ [[package]] name = "sp-consensus-aura" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" +source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" dependencies = [ "parity-scale-codec", "sp-api", @@ -7545,7 +7546,7 @@ dependencies = [ [[package]] name = "sp-consensus-babe" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" +source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" dependencies = [ "merlin", "parity-scale-codec", @@ -7564,7 +7565,7 @@ dependencies = [ [[package]] name = "sp-consensus-slots" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" +source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" dependencies = [ "parity-scale-codec", "sp-runtime", @@ -7573,7 +7574,7 @@ dependencies = [ [[package]] name = "sp-consensus-vrf" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" +source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" dependencies = [ "parity-scale-codec", "schnorrkel", @@ -7585,7 +7586,7 @@ dependencies = [ [[package]] name = "sp-core" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" +source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" dependencies = [ "base58", "blake2-rfc", @@ -7629,7 +7630,7 @@ dependencies = [ [[package]] name = "sp-database" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" +source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" dependencies = [ "kvdb", "parking_lot 0.10.2", @@ -7638,7 +7639,7 @@ dependencies = [ [[package]] name = "sp-debug-derive" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" +source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" dependencies = [ "proc-macro2 1.0.18", "quote 1.0.7", @@ -7648,7 +7649,7 @@ dependencies = [ [[package]] name = "sp-externalities" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" +source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" dependencies = [ "environmental", "parity-scale-codec", @@ -7659,7 +7660,7 @@ dependencies = [ [[package]] name = "sp-finality-grandpa" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" +source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" dependencies = [ "finality-grandpa", "log 0.4.8", @@ -7675,7 +7676,7 @@ dependencies = [ [[package]] name = "sp-finality-tracker" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" +source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" dependencies = [ "parity-scale-codec", "sp-inherents", @@ -7685,7 +7686,7 @@ dependencies = [ [[package]] name = "sp-inherents" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" +source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" dependencies = [ "derive_more 0.99.9", "parity-scale-codec", @@ -7697,7 +7698,7 @@ dependencies = [ [[package]] name = "sp-io" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" +source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" dependencies = [ "futures 0.3.5", "hash-db", @@ -7718,7 +7719,7 @@ dependencies = [ [[package]] name = "sp-keyring" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" +source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" dependencies = [ "lazy_static", "sp-core", @@ -7729,7 +7730,7 @@ dependencies = [ [[package]] name = "sp-npos-elections" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" +source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" dependencies = [ "parity-scale-codec", "serde", @@ -7741,7 +7742,7 @@ dependencies = [ [[package]] name = "sp-npos-elections-compact" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" +source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -7752,7 +7753,7 @@ dependencies = [ [[package]] name = "sp-offchain" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" +source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" dependencies = [ "sp-api", "sp-core", @@ -7762,7 +7763,7 @@ dependencies = [ [[package]] name = "sp-panic-handler" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" +source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" dependencies = [ "backtrace", "log 0.4.8", @@ -7771,7 +7772,7 @@ dependencies = [ [[package]] name = "sp-rpc" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" +source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" dependencies = [ "serde", "sp-core", @@ -7780,7 +7781,7 @@ dependencies = [ [[package]] name = "sp-runtime" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" +source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" dependencies = [ "either", "hash256-std-hasher", @@ -7802,7 +7803,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" +source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" dependencies = [ "parity-scale-codec", "primitive-types", @@ -7817,7 +7818,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" +source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" dependencies = [ "Inflector", "proc-macro-crate", @@ -7829,7 +7830,7 @@ dependencies = [ [[package]] name = "sp-serializer" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" +source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" dependencies = [ "serde", "serde_json", @@ -7838,7 +7839,7 @@ dependencies = [ [[package]] name = "sp-session" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" +source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" dependencies = [ "parity-scale-codec", "sp-api", @@ -7851,7 +7852,7 @@ dependencies = [ [[package]] name = "sp-staking" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" +source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" dependencies = [ "parity-scale-codec", "sp-runtime", @@ -7861,7 +7862,7 @@ dependencies = [ [[package]] name = "sp-state-machine" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" +source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" dependencies = [ "hash-db", "itertools 0.9.0", @@ -7882,12 +7883,12 @@ dependencies = [ [[package]] name = "sp-std" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" +source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" [[package]] name = "sp-storage" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" +source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" dependencies = [ "impl-serde 0.2.3", "ref-cast", @@ -7899,7 +7900,7 @@ dependencies = [ [[package]] name = "sp-timestamp" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" +source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -7913,7 +7914,7 @@ dependencies = [ [[package]] name = "sp-tracing" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" +source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" dependencies = [ "log 0.4.8", "rental", @@ -7923,7 +7924,7 @@ dependencies = [ [[package]] name = "sp-transaction-pool" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" +source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -7938,7 +7939,7 @@ dependencies = [ [[package]] name = "sp-trie" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" +source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" dependencies = [ "hash-db", "memory-db", @@ -7952,7 +7953,7 @@ dependencies = [ [[package]] name = "sp-utils" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" +source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" dependencies = [ "futures 0.3.5", "futures-core", @@ -7964,7 +7965,7 @@ dependencies = [ [[package]] name = "sp-version" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" +source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" dependencies = [ "impl-serde 0.2.3", "parity-scale-codec", @@ -7976,7 +7977,7 @@ dependencies = [ [[package]] name = "sp-wasm-interface" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" +source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -8107,7 +8108,7 @@ dependencies = [ [[package]] name = "substrate-browser-utils" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" +source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" dependencies = [ "chrono", "console_error_panic_hook", @@ -8133,7 +8134,7 @@ dependencies = [ [[package]] name = "substrate-build-script-utils" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" +source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" dependencies = [ "platforms", ] @@ -8141,7 +8142,7 @@ dependencies = [ [[package]] name = "substrate-frame-rpc-system" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" +source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" dependencies = [ "frame-system-rpc-runtime-api", "futures 0.3.5", @@ -8164,7 +8165,7 @@ dependencies = [ [[package]] name = "substrate-prometheus-endpoint" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" +source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" dependencies = [ "async-std", "derive_more 0.99.9", @@ -8178,7 +8179,7 @@ dependencies = [ [[package]] name = "substrate-test-client" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" +source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" dependencies = [ "futures 0.1.29", "futures 0.3.5", @@ -8204,7 +8205,7 @@ dependencies = [ [[package]] name = "substrate-test-runtime" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" +source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" dependencies = [ "cfg-if", "frame-executive", @@ -8244,7 +8245,7 @@ dependencies = [ [[package]] name = "substrate-test-runtime-client" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" +source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" dependencies = [ "futures 0.3.5", "parity-scale-codec", @@ -8265,7 +8266,7 @@ dependencies = [ [[package]] name = "substrate-wasm-builder-runner" version = "1.0.6" -source = "git+https://github.com/paritytech/substrate#7bb8d82af8da1bcac6f20cfaa0051150a9499f89" +source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" [[package]] name = "substrate-wasm-builder-runner" diff --git a/node/service/src/lib.rs b/node/service/src/lib.rs index f528b6be34..c04e9a10b1 100644 --- a/node/service/src/lib.rs +++ b/node/service/src/lib.rs @@ -160,7 +160,7 @@ type LightClient = fn new_partial(config: &mut Configuration) -> Result< service::PartialComponents< FullClient, FullBackend, FullSelectChain, - babe::BabeImportQueue>, + consensus_common::DefaultImportQueue>, sc_transaction_pool::FullPool>, ( impl Fn(polkadot_rpc::DenyUnsafe) -> polkadot_rpc::RpcExtension, diff --git a/service/src/lib.rs b/service/src/lib.rs index 75399824a5..22a99d7be4 100644 --- a/service/src/lib.rs +++ b/service/src/lib.rs @@ -151,7 +151,7 @@ type LightClient = pub fn new_partial(config: &mut Configuration, test: bool) -> Result< service::PartialComponents< FullClient, FullBackend, FullSelectChain, - babe::BabeImportQueue>, + consensus_common::DefaultImportQueue>, sc_transaction_pool::FullPool>, ( impl Fn(polkadot_rpc::DenyUnsafe) -> polkadot_rpc::RpcExtension, -- GitLab From 2ebe7f7df207d44fc5191dcf754fb350c221b084 Mon Sep 17 00:00:00 2001 From: Ashley Date: Thu, 30 Jul 2020 12:09:07 +0200 Subject: [PATCH 118/192] Add a default trie-memory-tracker feature to the cli (#1502) * Update substrate and add a trie-memory-tracker feature to the cli * Update cli/Cargo.toml Co-authored-by: Andronik Ordian Co-authored-by: Andronik Ordian --- Cargo.lock | 1 + cli/Cargo.toml | 6 +++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/Cargo.lock b/Cargo.lock index e85220c669..5de0b58e8f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4452,6 +4452,7 @@ dependencies = [ "sp-api", "sp-core", "sp-runtime", + "sp-trie", "structopt", "substrate-browser-utils", "substrate-build-script-utils", diff --git a/cli/Cargo.toml b/cli/Cargo.toml index bcff87462b..99eb04e9dd 100644 --- a/cli/Cargo.toml +++ b/cli/Cargo.toml @@ -34,12 +34,15 @@ sc-service = { git = "https://github.com/paritytech/substrate", branch = "master wasm-bindgen = { version = "0.2.57", optional = true } wasm-bindgen-futures = { version = "0.4.7", optional = true } browser-utils = { package = "substrate-browser-utils", git = "https://github.com/paritytech/substrate", branch = "master", optional = true } +# this crate is used only to enable `trie-memory-tracker` feature +# see https://github.com/paritytech/substrate/pull/6745 +sp-trie = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } [build-dependencies] substrate-build-script-utils = { git = "https://github.com/paritytech/substrate", branch = "master" } [features] -default = [ "wasmtime", "db", "cli", "service-old" ] +default = [ "wasmtime", "db", "cli", "service-old", "trie-memory-tracker" ] wasmtime = [ "sc-cli/wasmtime" ] db = [ "service/db" ] cli = [ @@ -57,3 +60,4 @@ browser = [ ] runtime-benchmarks = [ "service/runtime-benchmarks" ] service-rewr = [ "service-new/full-node" ] +trie-memory-tracker = [ "sp-trie/memory-tracker" ] -- GitLab From 1c4b2ef26a4d703f2927c1014edba5184ca68c1f Mon Sep 17 00:00:00 2001 From: Dan Forbes Date: Thu, 30 Jul 2020 04:38:48 -0700 Subject: [PATCH 119/192] Update README docs related to local build (#1479) * Update README docs related to local build Closes #1476 * Update command per @ordian Co-authored-by: Andronik Ordian * Remove reference to old install script Co-authored-by: Andronik Ordian --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 8190fc3f45..5d55065cf2 100644 --- a/README.md +++ b/README.md @@ -45,7 +45,7 @@ rustup update Once done, finish installing the support software: ```bash -sudo apt install make clang pkg-config libssl-dev +sudo apt install build-essential git clang libclang-dev pkg-config libssl-dev ``` Build the client by cloning this repository and running the following commands from the root -- GitLab From 07df1b5e92455ad6e97967cf785505eeeead24b1 Mon Sep 17 00:00:00 2001 From: s3krit Date: Thu, 30 Jul 2020 14:02:51 +0200 Subject: [PATCH 120/192] [CI] Publish draft release redux (#1493) * Add publish-draft-release Github action * Remove publish_draft_release.sh gitlab job --- .github/workflows/publish-draft-release.yml | 68 +++++ .gitlab-ci.yml | 11 - scripts/github/generate_release_text.rb | 74 ++++++ scripts/github/polkadot_release.erb | 36 +++ scripts/gitlab/publish_draft_release.sh | 274 -------------------- 5 files changed, 178 insertions(+), 285 deletions(-) create mode 100644 .github/workflows/publish-draft-release.yml create mode 100644 scripts/github/generate_release_text.rb create mode 100644 scripts/github/polkadot_release.erb delete mode 100755 scripts/gitlab/publish_draft_release.sh diff --git a/.github/workflows/publish-draft-release.yml b/.github/workflows/publish-draft-release.yml new file mode 100644 index 0000000000..c7cc8d441b --- /dev/null +++ b/.github/workflows/publish-draft-release.yml @@ -0,0 +1,68 @@ +name: Publish draft release + +on: + push: + tags: + - v**.**.** + +jobs: + get-rust-versions: + runs-on: ubuntu-latest + container: + image: paritytech/ci-linux:production + outputs: + rustc-stable: ${{ steps.get-rust-versions.outputs.stable }} + rustc-nightly: ${{ steps.get-rust-versions.outputs.nightly }} + steps: + - id: get-rust-versions + run: | + echo "::set-output name=stable::$(rustc +stable --version)" + echo "::set-output name=nightly::$(rustc +nightly --version)" + + publish-draft-release: + runs-on: ubuntu-latest + needs: get-rust-versions + outputs: + release_url: ${{ steps.create-release.outputs.html_url }} + steps: + - uses: actions/checkout@v2 + with: + fetch-depth: 0 + path: polkadot + - name: Set up Ruby 2.7 + uses: actions/setup-ruby@v1 + with: + ruby-version: 2.7 + - name: Generate release text + env: + RUSTC_STABLE: ${{ needs.get-rust-versions.outputs.rustc-stable }} + RUSTC_NIGHTLY: ${{ needs.get-rust-versions.outputs.rustc-nightly }} + run: | + gem install changelogerator git toml + ruby $GITHUB_WORKSPACE/polkadot/scripts/github/generate_release_text.rb > release_text.md + - uses: actions/upload-artifact@v2 + with: + name: release_text + path: release_text.md + - name: Create draft release + id: create-release + uses: actions/create-release@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + tag_name: ${{ github.ref }} + release_name: Polkadot ${{ github.ref }} + body_path: ./release_text.md + draft: true + + post_to_matrix: + runs-on: ubuntu-latest + needs: publish-draft-release + steps: + - name: Internal polkadot channel + uses: s3krit/matrix-message-action@v0.0.2 + with: + room_id: ${{ secrets.INTERNAL_POLKADOT_MATRIX_ROOM_ID }} + access_token: ${{ secrets.MATRIX_ACCESS_TOKEN }} + message: "**New version of polkadot tagged**: ${{ github.ref }}
Gav: Draft release created: ${{ needs.publish-draft-release.outputs.release_url }}" + server: "matrix.parity.io" diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index feb65ace79..11312ad649 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -94,17 +94,6 @@ check-line-width: interruptible: true allow_failure: true -publish-draft-release: - stage: test - only: - - tags - - /^v[0-9]+\.[0-9]+\.[0-9]+.*$/ # i.e. v1.0.1, v2.1.0rc1 - script: - - apt-get -y update; apt-get -y install jq - - ./scripts/gitlab/publish_draft_release.sh - interruptible: true - allow_failure: true - test-deterministic-wasm: stage: test <<: *docker-env diff --git a/scripts/github/generate_release_text.rb b/scripts/github/generate_release_text.rb new file mode 100644 index 0000000000..ad06a5f794 --- /dev/null +++ b/scripts/github/generate_release_text.rb @@ -0,0 +1,74 @@ +# frozen_string_literal: true + +require 'changelogerator' +require 'git' +require 'erb' +require 'toml' + +version = ENV['GITHUB_REF'] +token = ENV['GITHUB_TOKEN'] + +polkadot_path = ENV['GITHUB_WORKSPACE'] + '/polkadot/' +pg = Git.open(polkadot_path) + +# Generate an ERB renderer based on the template .erb file +renderer = ERB.new( + File.read(ENV['GITHUB_WORKSPACE'] + '/polkadot/scripts/github/polkadot_release.erb'), + trim_mode: '<>' +) + +# get last polkadot version. Use handy Gem::Version for sorting by version +last_version = pg + .tags + .map(&:name) + .grep(/^v\d+\.\d+\.\d+.*$/) + .sort_by { |v| Gem::Version.new(v.slice(1...)) }[-2] + +polkadot_cl = Changelog.new( + 'paritytech/polkadot', version, last_version, token: token +) + +# Get prev and cur substrate SHAs - parse the old and current Cargo.lock for +# polkadot and extract the sha that way. +prev_cargo = TOML::Parser.new(pg.show("#{last_version}:Cargo.lock")).parsed +current_cargo = TOML::Parser.new(pg.show("#{version}:Cargo.lock")).parsed + +substrate_prev_sha = prev_cargo['package'] + .find { |p| p['name'] == 'sc-cli' }['source'] + .split('#').last + +substrate_cur_sha = current_cargo['package'] + .find { |p| p['name'] == 'sc-cli' }['source'] + .split('#').last + +substrate_cl = Changelog.new( + 'paritytech/substrate', substrate_prev_sha, substrate_cur_sha, + token: token, + prefix: true +) + +all_changes = polkadot_cl.changes + substrate_cl.changes + +# Set all the variables needed for a release + +misc_changes = Changelog.changes_with_label(all_changes, 'B1-releasenotes') +client_changes = Changelog.changes_with_label(all_changes, 'B5-clientnoteworthy') +runtime_changes = Changelog.changes_with_label(all_changes, 'B7-runtimenoteworthy') + +release_priority = Changelog.highest_priority_for_changes(all_changes) + +# Pulled from the previous Github step +rustc_stable = ENV['RUSTC_STABLE'] +rustc_nightly = ENV['RUSTC_NIGHTLY'] + +polkadot_runtime = File.open(polkadot_path + '/runtime/polkadot/src/lib.rs') do |f| + f.find { |l| l =~ /spec_version/ }.match(/[0-9]+/)[0] +end +kusama_runtime = File.open(polkadot_path + '/runtime/kusama/src/lib.rs') do |f| + f.find { |l| l =~ /spec_version/ }.match(/[0-9]+/)[0] +end +westend_runtime = File.open(polkadot_path + '/runtime/westend/src/lib.rs') do |f| + f.find { |l| l =~ /spec_version/ }.match(/[0-9]+/)[0] +end + +puts renderer.result diff --git a/scripts/github/polkadot_release.erb b/scripts/github/polkadot_release.erb new file mode 100644 index 0000000000..f9c76d582a --- /dev/null +++ b/scripts/github/polkadot_release.erb @@ -0,0 +1,36 @@ +<%= print release_priority[:text] %> <%= puts " due to changes: *#{Changelog.changes_with_label(all_changes, release_priority[:label]).map(&:pretty_title).join(", ")}*" if release_priority[:priority] > 1 %> + +Native runtimes: + +- Polkadot: **<%= polkadot_runtime %>** +- Kusama: **<%= kusama_runtime %>** +- Westend: **<%= westend_runtime %>** + +This release was tested against the following versions of `rustc`. Other versions may work. + +- <%= rustc_stable %> +- <%= rustc_nightly %> + +<% unless misc_changes.empty? %> +## Changes + +<% misc_changes.each do |c| %> +* <%= c[:pretty_title] %> +<% end %> +<% end %> + +<% unless client_changes.empty? %> +## Client + +<% client_changes.each do |c| %> +* <%= c[:pretty_title] %> +<% end %> +<% end %> + +<% unless runtime_changes.empty? %> +## Runtime + +<% runtime_changes.each do |c| %> +* <%= c[:pretty_title] %> +<% end %> +<% end %> diff --git a/scripts/gitlab/publish_draft_release.sh b/scripts/gitlab/publish_draft_release.sh deleted file mode 100755 index a228c4afe7..0000000000 --- a/scripts/gitlab/publish_draft_release.sh +++ /dev/null @@ -1,274 +0,0 @@ -#!/usr/bin/env bash - -# shellcheck source=lib.sh -source "$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )/lib.sh" - -# Set initial variables -substrate_repo="https://github.com/paritytech/substrate" -substrate_dir='./substrate' - -# Cloning repos to ensure freshness -echo "[+] Cloning substrate to generate list of changes" -git clone $substrate_repo $substrate_dir -echo "[+] Finished cloning substrate into $substrate_dir" - -version="$CI_COMMIT_TAG" -last_version=$(git tag -l | sort -V | grep -B 1 -x "$CI_COMMIT_TAG" | head -n 1) -echo "[+] Version: $version; Previous version: $last_version" - -# Check that a signed tag exists on github for this version -echo '[+] Checking tag has been signed' -check_tag "paritytech/polkadot" "$version" -case $? in - 0) echo '[+] Tag found and has been signed' - ;; - 1) echo '[!] Tag found but has not been signed. Aborting release.'; exit 1 - ;; - 2) echo '[!] Tag not found. Aborting release.'; exit 1 -esac - -# Pull rustc version used by rust-builder for stable and nightly -stable_rustc="$(rustc +stable --version)" -nightly_rustc="$(rustc +nightly --version)" - -# Start with referencing current native runtime -# and find any referenced PRs since last release -# Note: Drop any changes that begin with '[contracts]' or 'contracts:' -polkadot_spec=$(grep spec_version runtime/polkadot/src/lib.rs | tail -n 1 | grep -Eo '[0-9]+') -echo "[+] Polkadot spec version: $polkadot_spec" -kusama_spec=$(grep spec_version runtime/kusama/src/lib.rs | tail -n 1 | grep -Eo '[0-9]+') -echo "[+] Kusama spec version: $kusama_spec" -westend_spec=$(grep spec_version runtime/westend/src/lib.rs | tail -n 1 | grep -Eo '[0-9]+') -echo "[+] Westend spec version: $westend_spec" -release_text="Native runtimes: -- Polkadot: **$polkadot_spec** -- Kusama: **$kusama_spec** -- Westend: **$westend_spec** - -This release was built with the following versions of \`rustc\`. Other versions may work. -- $stable_rustc -- $nightly_rustc -" - -declare -a misc_changes -declare -a runtime_changes -declare -a client_changes - -# Following variables are for tracking the priority of the release (i.e., -# how important it is for the user to upgrade). -# It's frustrating that we need to make an array of indexes (in this case the -# labels), but it's necessary to maintain the correct order. Labels and -# descriptions *must* be kept in lockstep - -priority_labels=( - 'C1-low' - 'C3-medium' - 'C7-high' - 'C9-critical' -) - -declare -A priority_descriptions=( -['C1-low']="Upgrade priority: **Low** (upgrade at your convenience)" -['C3-medium']="Upgrade priority: **Medium** (timely upgrade recommended)" -['C7-high']="Upgrade priority:❗ **HIGH** ❗ Please upgrade your node as soon as possible" -['C9-critical']="Upgrade priority: ❗❗ **URGENT** ❗❗ PLEASE UPGRADE IMMEDIATELY" -) - -# We don't actually take any action on C1-low, so we can start at medium -# But set C1-low as the default -max_label=1 -priority="${priority_descriptions['C1-low']}" -declare -a priority_changes - -# Iterate through every PR -while IFS= read -r line; do - pr_id=$(echo "$line" | sed -E 's/.*#([0-9]+)\)$/\1/') - - # Release priority check: - # For each PR, we look for every label equal to or higher than the current highest - # I.e., if there has already been a PR marked as 'medium', we only need - # to look for priorities medium or above. If we find one, we set the - # priority to that level. - for ((index=max_label; index<${#priority_labels[@]}; index++)) ; do - cur_label="${priority_labels[$index]}" - echo "[+] Checking #$pr_id for presence of $cur_label label" - if has_label 'paritytech/polkadot' "$pr_id" "$cur_label" ; then - echo "[+] #$pr_id has label $cur_label. Setting max." - prev_label="$max_label" - max_label="$index" - priority="${priority_descriptions[$cur_label]}" - - # If it's not an increase in priority, we just append the PR to the list - if [ "$prev_label" == "$max_label" ]; then - priority_changes+=("${line/\* /}") - fi - # If the priority has increased, we override previous changes with new changes - if [ "$prev_label" != "$max_label" ]; then - priority_changes=("${line/\* /}") - fi - - # Append priority to change - # Skip first 3 chars - note=${cur_label:3} - # And capitalise - line=" \`${note^}\` $line" - fi - done - - # If the PR is labelled silent, we can do an early continue to save a little work - if has_label 'paritytech/polkadot' "$pr_id" 'B0-silent'; then - continue - fi - - # If the PR has a runtimenoteworthy label, add to the runtime_changes section - if has_label 'paritytech/polkadot' "$pr_id" 'B2-runtimenoteworthy'; then - runtime_changes+=("$line") - fi - # If the PR has a releasenotes label, add to the release section - if has_label 'paritytech/polkadot' "$pr_id" 'B1-releasenotes'; then - misc_changes+=("$line") - fi -done <<< "$(sanitised_git_logs "$last_version" "$version" | \ - sed '/^\[contracts\].*/d' | \ - sed '/^contracts:.*/d' )" - -# Get substrate changes between last polkadot version and current -# By grepping the Cargo.lock for a substrate crate, and grepping out the commit hash -cur_substrate_commit=$(grep -A 2 'name = "sc-cli"' Cargo.lock | grep -E -o '[a-f0-9]{40}') -old_substrate_commit=$(git diff "refs/tags/$last_version" Cargo.lock |\ - grep -A 2 'name = "sc-cli"' | grep -E -o '[a-f0-9]{40}') -pushd $substrate_dir || exit - git checkout master > /dev/null - git pull > /dev/null - all_substrate_changes="$(sanitised_git_logs "$old_substrate_commit" "$cur_substrate_commit" | sed 's/(#/(paritytech\/substrate#/')" - - echo "[+] Iterating through substrate changes to find labelled PRs" - while IFS= read -r line; do - pr_id=$(echo "$line" | sed -E 's/.*#([0-9]+)\)$/\1/') - - # Basically same check as Polkadot priority - # We only need to check for any labels of the current priority or higher - for ((index=max_label; index<${#priority_labels[@]}; index++)) ; do - cur_label="${priority_labels[$index]}" - echo "[+] Checking substrate/#$pr_id for presence of $cur_label label" - if has_label 'paritytech/substrate' "$pr_id" "$cur_label" ; then - echo "[+] #$pr_id has label $cur_label. Setting max." - prev_label="$max_label" - max_label="$index" - priority="${priority_descriptions[$cur_label]}" - - # If it's not an increase in priority, we just append - if [ "$prev_label" == "$max_label" ]; then - priority_changes+=("${line/\* /}") - fi - # If the priority has increased, we override previous changes with new changes - if [ "$prev_label" != "$max_label" ]; then - priority_changes=("${line/\* /}") - fi - - # Append priority to change - # Skip first 3 chars - note=${cur_label:3} - # And capitalise - line=" \`${note^}\` $line" - fi - done - - # Skip if the PR has the silent label - this allows us to skip a few requests - if has_label 'paritytech/substrate' "$pr_id" 'B0-silent'; then - continue - fi - if has_label 'paritytech/substrate' "$pr_id" 'B5-clientnoteworthy'; then - client_changes+=("$line") - fi - if has_label 'paritytech/substrate' "$pr_id" 'B7-runtimenoteworthy'; then - runtime_changes+=("$line") - fi - done <<< "$all_substrate_changes" -popd || exit - - -# Add the priorities to the *start* of the release notes -# If polkadot and substrate priority = low, no need for list of changes -if [ "$priority" == "${priority_descriptions['C1-low']}" ]; then - release_text="$priority - -$release_text" -else - release_text="$priority - due to change(s): *${priority_changes[*]}* - -$release_text" -fi - -# Append all notable changes to the release notes - -if [ "${#misc_changes[*]}" -gt 0 ] ; then - release_text="$release_text - -## Changes -$(printf '* %s\n' "${misc_changes[@]}")" -fi - -if [ "${#client_changes[*]}" -gt 0 ] ; then - release_text="$release_text - -## Client -$(printf '* %s\n' "${client_changes[@]}")" -fi - -if [ "${#runtime_changes[*]}" -gt 0 ] ; then - release_text="$release_text - -## Runtime -$(printf '* %s\n' "${runtime_changes[@]}")" -fi - -echo "[+] Release text generated: " -echo "$release_text" - -echo "[+] Pushing release to github" -# Create release on github -release_name="Polkadot $version" -data=$(jq -Rs --arg version "$version" \ - --arg release_name "$release_name" \ - --arg release_text "$release_text" \ -'{ - "tag_name": $version, - "target_commitish": "master", - "name": $release_name, - "body": $release_text, - "draft": true, - "prerelease": false -}' < /dev/null) - -out=$(curl -s -X POST --data "$data" -H "Authorization: token $GITHUB_RELEASE_TOKEN" "$api_base/paritytech/polkadot/releases") - -html_url=$(echo "$out" | jq -r .html_url) - -if [ "$html_url" == "null" ] -then - echo "[!] Something went wrong posting:" - echo "$out" - # If we couldn't post, don't want to announce in Matrix - exit 1 -else - echo "[+] Release draft created: $html_url" -fi - -echo '[+] Sending draft release URL to Matrix' - -msg_body=$(cat <New version of polkadot tagged: $CI_COMMIT_TAG
-Gav: Draft release created: $html_url
-Build pipeline: $CI_PIPELINE_URL -EOF -) -send_message "$(structure_message "$msg_body" "$formatted_msg_body")" "$MATRIX_ROOM_ID" "$MATRIX_ACCESS_TOKEN" - -echo "[+] Done! Maybe the release worked..." -- GitLab From 7cffb4295aa8493a432d02ac33737097da5b85e7 Mon Sep 17 00:00:00 2001 From: Shawn Tabrizi Date: Thu, 30 Jul 2020 18:43:55 +0200 Subject: [PATCH 121/192] Companion for #6610 (Balances Weight Trait) (#1425) * Update for balances weights * remove unneeded tests * Add file headers * cargo update -p sp-io --- Cargo.lock | 276 ++++++++++++----------- runtime/kusama/src/lib.rs | 17 +- runtime/kusama/src/weights/balances.rs | 47 ++++ runtime/kusama/src/weights/mod.rs | 19 ++ runtime/polkadot/src/lib.rs | 17 +- runtime/polkadot/src/weights/balances.rs | 47 ++++ runtime/polkadot/src/weights/mod.rs | 19 ++ runtime/polkadot/tests/weights.rs | 23 -- runtime/westend/src/lib.rs | 17 +- runtime/westend/src/weights/balances.rs | 47 ++++ runtime/westend/src/weights/mod.rs | 19 ++ 11 files changed, 382 insertions(+), 166 deletions(-) create mode 100644 runtime/kusama/src/weights/balances.rs create mode 100644 runtime/kusama/src/weights/mod.rs create mode 100644 runtime/polkadot/src/weights/balances.rs create mode 100644 runtime/polkadot/src/weights/mod.rs create mode 100644 runtime/westend/src/weights/balances.rs create mode 100644 runtime/westend/src/weights/mod.rs diff --git a/Cargo.lock b/Cargo.lock index 5de0b58e8f..9cc34439aa 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1370,7 +1370,7 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "fork-tree" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" +source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" dependencies = [ "parity-scale-codec", ] @@ -1378,7 +1378,7 @@ dependencies = [ [[package]] name = "frame-benchmarking" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" +source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" dependencies = [ "frame-support", "frame-system", @@ -1395,7 +1395,7 @@ dependencies = [ [[package]] name = "frame-benchmarking-cli" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" +source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" dependencies = [ "Inflector", "frame-benchmarking", @@ -1414,7 +1414,7 @@ dependencies = [ [[package]] name = "frame-executive" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" +source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" dependencies = [ "frame-support", "frame-system", @@ -1429,7 +1429,7 @@ dependencies = [ [[package]] name = "frame-metadata" version = "11.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" +source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" dependencies = [ "parity-scale-codec", "serde", @@ -1440,7 +1440,7 @@ dependencies = [ [[package]] name = "frame-support" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" +source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" dependencies = [ "bitmask", "frame-metadata", @@ -1465,7 +1465,7 @@ dependencies = [ [[package]] name = "frame-support-procedural" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" +source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" dependencies = [ "frame-support-procedural-tools", "proc-macro2 1.0.18", @@ -1476,7 +1476,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" +source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" dependencies = [ "frame-support-procedural-tools-derive", "proc-macro-crate", @@ -1488,7 +1488,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools-derive" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" +source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" dependencies = [ "proc-macro2 1.0.18", "quote 1.0.7", @@ -1498,7 +1498,7 @@ dependencies = [ [[package]] name = "frame-system" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" +source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" dependencies = [ "frame-support", "impl-trait-for-tuples", @@ -1514,7 +1514,7 @@ dependencies = [ [[package]] name = "frame-system-benchmarking" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" +source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" dependencies = [ "frame-benchmarking", "frame-support", @@ -1528,7 +1528,7 @@ dependencies = [ [[package]] name = "frame-system-rpc-runtime-api" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" +source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" dependencies = [ "parity-scale-codec", "sp-api", @@ -3542,7 +3542,7 @@ dependencies = [ [[package]] name = "pallet-authority-discovery" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" +source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" dependencies = [ "frame-support", "frame-system", @@ -3558,7 +3558,7 @@ dependencies = [ [[package]] name = "pallet-authorship" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" +source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" dependencies = [ "frame-support", "frame-system", @@ -3573,7 +3573,7 @@ dependencies = [ [[package]] name = "pallet-babe" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" +source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" dependencies = [ "frame-benchmarking", "frame-support", @@ -3598,7 +3598,7 @@ dependencies = [ [[package]] name = "pallet-balances" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" +source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" dependencies = [ "frame-benchmarking", "frame-support", @@ -3612,7 +3612,7 @@ dependencies = [ [[package]] name = "pallet-collective" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" +source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" dependencies = [ "frame-benchmarking", "frame-support", @@ -3628,7 +3628,7 @@ dependencies = [ [[package]] name = "pallet-democracy" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" +source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" dependencies = [ "frame-benchmarking", "frame-support", @@ -3643,7 +3643,7 @@ dependencies = [ [[package]] name = "pallet-elections-phragmen" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" +source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" dependencies = [ "frame-benchmarking", "frame-support", @@ -3658,7 +3658,7 @@ dependencies = [ [[package]] name = "pallet-finality-tracker" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" +source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" dependencies = [ "frame-support", "frame-system", @@ -3674,7 +3674,7 @@ dependencies = [ [[package]] name = "pallet-grandpa" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" +source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" dependencies = [ "frame-benchmarking", "frame-support", @@ -3696,7 +3696,7 @@ dependencies = [ [[package]] name = "pallet-identity" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" +source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" dependencies = [ "enumflags2", "frame-benchmarking", @@ -3712,7 +3712,7 @@ dependencies = [ [[package]] name = "pallet-im-online" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" +source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" dependencies = [ "frame-benchmarking", "frame-support", @@ -3732,7 +3732,7 @@ dependencies = [ [[package]] name = "pallet-indices" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" +source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" dependencies = [ "frame-support", "frame-system", @@ -3748,7 +3748,7 @@ dependencies = [ [[package]] name = "pallet-membership" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" +source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" dependencies = [ "frame-support", "frame-system", @@ -3762,7 +3762,7 @@ dependencies = [ [[package]] name = "pallet-multisig" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" +source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" dependencies = [ "frame-support", "frame-system", @@ -3777,7 +3777,7 @@ dependencies = [ [[package]] name = "pallet-nicks" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" +source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" dependencies = [ "frame-support", "frame-system", @@ -3791,7 +3791,7 @@ dependencies = [ [[package]] name = "pallet-offences" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" +source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" dependencies = [ "frame-support", "frame-system", @@ -3806,7 +3806,7 @@ dependencies = [ [[package]] name = "pallet-offences-benchmarking" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" +source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" dependencies = [ "frame-benchmarking", "frame-support", @@ -3827,7 +3827,7 @@ dependencies = [ [[package]] name = "pallet-proxy" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" +source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" dependencies = [ "frame-support", "frame-system", @@ -3842,7 +3842,7 @@ dependencies = [ [[package]] name = "pallet-randomness-collective-flip" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" +source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" dependencies = [ "frame-support", "frame-system", @@ -3855,7 +3855,7 @@ dependencies = [ [[package]] name = "pallet-recovery" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" +source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" dependencies = [ "enumflags2", "frame-support", @@ -3870,7 +3870,7 @@ dependencies = [ [[package]] name = "pallet-scheduler" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" +source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" dependencies = [ "frame-benchmarking", "frame-support", @@ -3885,7 +3885,7 @@ dependencies = [ [[package]] name = "pallet-session" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" +source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" dependencies = [ "frame-support", "frame-system", @@ -3905,7 +3905,7 @@ dependencies = [ [[package]] name = "pallet-session-benchmarking" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" +source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" dependencies = [ "frame-benchmarking", "frame-support", @@ -3921,7 +3921,7 @@ dependencies = [ [[package]] name = "pallet-society" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" +source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" dependencies = [ "frame-support", "frame-system", @@ -3935,7 +3935,7 @@ dependencies = [ [[package]] name = "pallet-staking" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" +source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" dependencies = [ "frame-benchmarking", "frame-support", @@ -3957,7 +3957,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-curve" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" +source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -3968,7 +3968,7 @@ dependencies = [ [[package]] name = "pallet-sudo" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" +source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" dependencies = [ "frame-support", "frame-system", @@ -3982,7 +3982,7 @@ dependencies = [ [[package]] name = "pallet-timestamp" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" +source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" dependencies = [ "frame-benchmarking", "frame-support", @@ -4000,7 +4000,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" +source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" dependencies = [ "frame-support", "frame-system", @@ -4017,7 +4017,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" +source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" dependencies = [ "jsonrpc-core", "jsonrpc-core-client", @@ -4035,7 +4035,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc-runtime-api" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" +source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" dependencies = [ "frame-support", "parity-scale-codec", @@ -4048,7 +4048,7 @@ dependencies = [ [[package]] name = "pallet-treasury" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" +source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" dependencies = [ "frame-benchmarking", "frame-support", @@ -4063,7 +4063,7 @@ dependencies = [ [[package]] name = "pallet-utility" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" +source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" dependencies = [ "frame-benchmarking", "frame-support", @@ -4079,7 +4079,7 @@ dependencies = [ [[package]] name = "pallet-vesting" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" +source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" dependencies = [ "enumflags2", "frame-benchmarking", @@ -6059,7 +6059,7 @@ dependencies = [ [[package]] name = "sc-authority-discovery" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" +source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" dependencies = [ "bytes 0.5.5", "derive_more 0.99.9", @@ -6086,7 +6086,7 @@ dependencies = [ [[package]] name = "sc-basic-authorship" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" +source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6110,7 +6110,7 @@ dependencies = [ [[package]] name = "sc-block-builder" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" +source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" dependencies = [ "parity-scale-codec", "sc-client-api", @@ -6127,7 +6127,7 @@ dependencies = [ [[package]] name = "sc-chain-spec" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" +source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" dependencies = [ "impl-trait-for-tuples", "sc-chain-spec-derive", @@ -6143,7 +6143,7 @@ dependencies = [ [[package]] name = "sc-chain-spec-derive" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" +source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -6154,7 +6154,7 @@ dependencies = [ [[package]] name = "sc-cli" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" +source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" dependencies = [ "ansi_term 0.12.1", "atty", @@ -6195,7 +6195,7 @@ dependencies = [ [[package]] name = "sc-client-api" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" +source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" dependencies = [ "derive_more 0.99.9", "fnv", @@ -6231,7 +6231,7 @@ dependencies = [ [[package]] name = "sc-client-db" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" +source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" dependencies = [ "blake2-rfc", "hash-db", @@ -6260,7 +6260,7 @@ dependencies = [ [[package]] name = "sc-consensus" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" +source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" dependencies = [ "sc-client-api", "sp-blockchain", @@ -6271,7 +6271,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" +source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" dependencies = [ "derive_more 0.99.9", "fork-tree", @@ -6286,6 +6286,7 @@ dependencies = [ "parking_lot 0.10.2", "pdqselect", "rand 0.7.3", + "retain_mut", "sc-client-api", "sc-consensus-epochs", "sc-consensus-slots", @@ -6306,6 +6307,7 @@ dependencies = [ "sp-io", "sp-runtime", "sp-timestamp", + "sp-utils", "sp-version", "substrate-prometheus-endpoint", ] @@ -6313,7 +6315,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe-rpc" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" +source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -6337,7 +6339,7 @@ dependencies = [ [[package]] name = "sc-consensus-epochs" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" +source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" dependencies = [ "fork-tree", "parity-scale-codec", @@ -6350,7 +6352,7 @@ dependencies = [ [[package]] name = "sc-consensus-slots" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" +source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6373,7 +6375,7 @@ dependencies = [ [[package]] name = "sc-consensus-uncles" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" +source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" dependencies = [ "log 0.4.8", "sc-client-api", @@ -6387,7 +6389,7 @@ dependencies = [ [[package]] name = "sc-executor" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" +source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" dependencies = [ "derive_more 0.99.9", "lazy_static", @@ -6415,7 +6417,7 @@ dependencies = [ [[package]] name = "sc-executor-common" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" +source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" dependencies = [ "derive_more 0.99.9", "log 0.4.8", @@ -6432,7 +6434,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmi" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" +source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" dependencies = [ "log 0.4.8", "parity-scale-codec", @@ -6447,7 +6449,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmtime" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" +source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" dependencies = [ "cranelift-codegen", "cranelift-wasm", @@ -6468,7 +6470,7 @@ dependencies = [ [[package]] name = "sc-finality-grandpa" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" +source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" dependencies = [ "assert_matches", "derive_more 0.99.9", @@ -6506,7 +6508,7 @@ dependencies = [ [[package]] name = "sc-finality-grandpa-rpc" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" +source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" dependencies = [ "derive_more 0.99.9", "finality-grandpa", @@ -6523,7 +6525,7 @@ dependencies = [ [[package]] name = "sc-informant" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" +source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" dependencies = [ "ansi_term 0.12.1", "futures 0.3.5", @@ -6541,7 +6543,7 @@ dependencies = [ [[package]] name = "sc-keystore" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" +source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" dependencies = [ "derive_more 0.99.9", "hex", @@ -6557,7 +6559,7 @@ dependencies = [ [[package]] name = "sc-light" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" +source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" dependencies = [ "hash-db", "lazy_static", @@ -6576,7 +6578,7 @@ dependencies = [ [[package]] name = "sc-network" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" +source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" dependencies = [ "bitflags", "bs58", @@ -6628,7 +6630,7 @@ dependencies = [ [[package]] name = "sc-network-gossip" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" +source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6643,7 +6645,7 @@ dependencies = [ [[package]] name = "sc-network-test" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" +source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" dependencies = [ "env_logger", "futures 0.3.5", @@ -6670,7 +6672,7 @@ dependencies = [ [[package]] name = "sc-offchain" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" +source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" dependencies = [ "bytes 0.5.5", "fnv", @@ -6697,7 +6699,7 @@ dependencies = [ [[package]] name = "sc-peerset" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" +source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" dependencies = [ "futures 0.3.5", "libp2p", @@ -6710,7 +6712,7 @@ dependencies = [ [[package]] name = "sc-proposer-metrics" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" +source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" dependencies = [ "log 0.4.8", "substrate-prometheus-endpoint", @@ -6719,7 +6721,7 @@ dependencies = [ [[package]] name = "sc-rpc" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" +source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" dependencies = [ "futures 0.3.5", "hash-db", @@ -6751,7 +6753,7 @@ dependencies = [ [[package]] name = "sc-rpc-api" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" +source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -6775,7 +6777,7 @@ dependencies = [ [[package]] name = "sc-rpc-server" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" +source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" dependencies = [ "jsonrpc-core", "jsonrpc-http-server", @@ -6791,7 +6793,7 @@ dependencies = [ [[package]] name = "sc-service" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" +source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" dependencies = [ "derive_more 0.99.9", "directories", @@ -6854,7 +6856,7 @@ dependencies = [ [[package]] name = "sc-state-db" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" +source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" dependencies = [ "log 0.4.8", "parity-scale-codec", @@ -6868,7 +6870,7 @@ dependencies = [ [[package]] name = "sc-telemetry" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" +source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6889,7 +6891,7 @@ dependencies = [ [[package]] name = "sc-tracing" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" +source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" dependencies = [ "erased-serde", "log 0.4.8", @@ -6906,7 +6908,7 @@ dependencies = [ [[package]] name = "sc-transaction-graph" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" +source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -6927,7 +6929,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" +source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -7382,7 +7384,7 @@ dependencies = [ [[package]] name = "sp-allocator" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" +source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" dependencies = [ "derive_more 0.99.9", "log 0.4.8", @@ -7394,7 +7396,7 @@ dependencies = [ [[package]] name = "sp-api" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" +source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" dependencies = [ "hash-db", "parity-scale-codec", @@ -7409,7 +7411,7 @@ dependencies = [ [[package]] name = "sp-api-proc-macro" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" +source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" dependencies = [ "blake2-rfc", "proc-macro-crate", @@ -7421,7 +7423,7 @@ dependencies = [ [[package]] name = "sp-application-crypto" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" +source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" dependencies = [ "parity-scale-codec", "serde", @@ -7433,7 +7435,7 @@ dependencies = [ [[package]] name = "sp-arithmetic" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" +source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" dependencies = [ "integer-sqrt", "num-traits 0.2.12", @@ -7446,7 +7448,7 @@ dependencies = [ [[package]] name = "sp-authority-discovery" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" +source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" dependencies = [ "parity-scale-codec", "sp-api", @@ -7458,7 +7460,7 @@ dependencies = [ [[package]] name = "sp-authorship" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" +source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" dependencies = [ "parity-scale-codec", "sp-inherents", @@ -7469,7 +7471,7 @@ dependencies = [ [[package]] name = "sp-block-builder" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" +source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" dependencies = [ "parity-scale-codec", "sp-api", @@ -7481,7 +7483,7 @@ dependencies = [ [[package]] name = "sp-blockchain" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" +source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" dependencies = [ "derive_more 0.99.9", "log 0.4.8", @@ -7498,7 +7500,7 @@ dependencies = [ [[package]] name = "sp-chain-spec" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" +source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" dependencies = [ "serde", "serde_json", @@ -7507,7 +7509,7 @@ dependencies = [ [[package]] name = "sp-consensus" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" +source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -7533,7 +7535,7 @@ dependencies = [ [[package]] name = "sp-consensus-aura" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" +source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" dependencies = [ "parity-scale-codec", "sp-api", @@ -7547,7 +7549,7 @@ dependencies = [ [[package]] name = "sp-consensus-babe" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" +source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" dependencies = [ "merlin", "parity-scale-codec", @@ -7566,7 +7568,7 @@ dependencies = [ [[package]] name = "sp-consensus-slots" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" +source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" dependencies = [ "parity-scale-codec", "sp-runtime", @@ -7575,7 +7577,7 @@ dependencies = [ [[package]] name = "sp-consensus-vrf" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" +source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" dependencies = [ "parity-scale-codec", "schnorrkel", @@ -7587,7 +7589,7 @@ dependencies = [ [[package]] name = "sp-core" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" +source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" dependencies = [ "base58", "blake2-rfc", @@ -7631,7 +7633,7 @@ dependencies = [ [[package]] name = "sp-database" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" +source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" dependencies = [ "kvdb", "parking_lot 0.10.2", @@ -7640,7 +7642,7 @@ dependencies = [ [[package]] name = "sp-debug-derive" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" +source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" dependencies = [ "proc-macro2 1.0.18", "quote 1.0.7", @@ -7650,7 +7652,7 @@ dependencies = [ [[package]] name = "sp-externalities" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" +source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" dependencies = [ "environmental", "parity-scale-codec", @@ -7661,7 +7663,7 @@ dependencies = [ [[package]] name = "sp-finality-grandpa" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" +source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" dependencies = [ "finality-grandpa", "log 0.4.8", @@ -7677,7 +7679,7 @@ dependencies = [ [[package]] name = "sp-finality-tracker" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" +source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" dependencies = [ "parity-scale-codec", "sp-inherents", @@ -7687,7 +7689,7 @@ dependencies = [ [[package]] name = "sp-inherents" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" +source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" dependencies = [ "derive_more 0.99.9", "parity-scale-codec", @@ -7699,7 +7701,7 @@ dependencies = [ [[package]] name = "sp-io" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" +source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" dependencies = [ "futures 0.3.5", "hash-db", @@ -7720,7 +7722,7 @@ dependencies = [ [[package]] name = "sp-keyring" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" +source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" dependencies = [ "lazy_static", "sp-core", @@ -7731,7 +7733,7 @@ dependencies = [ [[package]] name = "sp-npos-elections" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" +source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" dependencies = [ "parity-scale-codec", "serde", @@ -7743,7 +7745,7 @@ dependencies = [ [[package]] name = "sp-npos-elections-compact" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" +source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -7754,7 +7756,7 @@ dependencies = [ [[package]] name = "sp-offchain" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" +source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" dependencies = [ "sp-api", "sp-core", @@ -7764,7 +7766,7 @@ dependencies = [ [[package]] name = "sp-panic-handler" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" +source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" dependencies = [ "backtrace", "log 0.4.8", @@ -7773,7 +7775,7 @@ dependencies = [ [[package]] name = "sp-rpc" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" +source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" dependencies = [ "serde", "sp-core", @@ -7782,7 +7784,7 @@ dependencies = [ [[package]] name = "sp-runtime" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" +source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" dependencies = [ "either", "hash256-std-hasher", @@ -7804,7 +7806,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" +source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" dependencies = [ "parity-scale-codec", "primitive-types", @@ -7819,7 +7821,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" +source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" dependencies = [ "Inflector", "proc-macro-crate", @@ -7831,7 +7833,7 @@ dependencies = [ [[package]] name = "sp-serializer" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" +source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" dependencies = [ "serde", "serde_json", @@ -7840,7 +7842,7 @@ dependencies = [ [[package]] name = "sp-session" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" +source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" dependencies = [ "parity-scale-codec", "sp-api", @@ -7853,7 +7855,7 @@ dependencies = [ [[package]] name = "sp-staking" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" +source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" dependencies = [ "parity-scale-codec", "sp-runtime", @@ -7863,7 +7865,7 @@ dependencies = [ [[package]] name = "sp-state-machine" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" +source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" dependencies = [ "hash-db", "itertools 0.9.0", @@ -7884,12 +7886,12 @@ dependencies = [ [[package]] name = "sp-std" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" +source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" [[package]] name = "sp-storage" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" +source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" dependencies = [ "impl-serde 0.2.3", "ref-cast", @@ -7901,7 +7903,7 @@ dependencies = [ [[package]] name = "sp-timestamp" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" +source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -7915,7 +7917,7 @@ dependencies = [ [[package]] name = "sp-tracing" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" +source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" dependencies = [ "log 0.4.8", "rental", @@ -7925,7 +7927,7 @@ dependencies = [ [[package]] name = "sp-transaction-pool" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" +source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -7940,7 +7942,7 @@ dependencies = [ [[package]] name = "sp-trie" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" +source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" dependencies = [ "hash-db", "memory-db", @@ -7954,7 +7956,7 @@ dependencies = [ [[package]] name = "sp-utils" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" +source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" dependencies = [ "futures 0.3.5", "futures-core", @@ -7966,7 +7968,7 @@ dependencies = [ [[package]] name = "sp-version" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" +source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" dependencies = [ "impl-serde 0.2.3", "parity-scale-codec", @@ -7978,7 +7980,7 @@ dependencies = [ [[package]] name = "sp-wasm-interface" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" +source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -8109,7 +8111,7 @@ dependencies = [ [[package]] name = "substrate-browser-utils" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" +source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" dependencies = [ "chrono", "console_error_panic_hook", @@ -8135,7 +8137,7 @@ dependencies = [ [[package]] name = "substrate-build-script-utils" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" +source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" dependencies = [ "platforms", ] @@ -8143,7 +8145,7 @@ dependencies = [ [[package]] name = "substrate-frame-rpc-system" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" +source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" dependencies = [ "frame-system-rpc-runtime-api", "futures 0.3.5", @@ -8166,7 +8168,7 @@ dependencies = [ [[package]] name = "substrate-prometheus-endpoint" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" +source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" dependencies = [ "async-std", "derive_more 0.99.9", @@ -8180,7 +8182,7 @@ dependencies = [ [[package]] name = "substrate-test-client" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" +source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" dependencies = [ "futures 0.1.29", "futures 0.3.5", @@ -8206,7 +8208,7 @@ dependencies = [ [[package]] name = "substrate-test-runtime" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" +source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" dependencies = [ "cfg-if", "frame-executive", @@ -8246,7 +8248,7 @@ dependencies = [ [[package]] name = "substrate-test-runtime-client" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" +source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" dependencies = [ "futures 0.3.5", "parity-scale-codec", @@ -8267,7 +8269,7 @@ dependencies = [ [[package]] name = "substrate-wasm-builder-runner" version = "1.0.6" -source = "git+https://github.com/paritytech/substrate#19c1d9028d8d6eabef41693433b56e14da025247" +source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" [[package]] name = "substrate-wasm-builder-runner" diff --git a/runtime/kusama/src/lib.rs b/runtime/kusama/src/lib.rs index 70e15cbc5d..c841c552f9 100644 --- a/runtime/kusama/src/lib.rs +++ b/runtime/kusama/src/lib.rs @@ -78,6 +78,9 @@ pub use parachains::Call as ParachainsCall; pub mod constants; use constants::{time::*, currency::*, fee::*}; +// Weights used in the runtime. +mod weights; + // Make the WASM binary available. #[cfg(feature = "std")] include!(concat!(env!("OUT_DIR"), "/wasm_binary.rs")); @@ -219,7 +222,7 @@ impl balances::Trait for Runtime { type Event = Event; type ExistentialDeposit = ExistentialDeposit; type AccountStore = System; - type WeightInfo = (); + type WeightInfo = weights::balances::WeightInfo; } parameter_types! { @@ -1267,6 +1270,7 @@ sp_api::impl_runtime_apis! { highest_range_values: Vec, steps: Vec, repeat: u32, + extra: bool, ) -> Result, RuntimeString> { use frame_benchmarking::{Benchmarking, BenchmarkBatch, add_benchmark}; // Trying to add benchmarks directly to the Session Pallet caused cyclic dependency issues. @@ -1299,7 +1303,16 @@ sp_api::impl_runtime_apis! { ]; let mut batches = Vec::::new(); - let params = (&pallet, &benchmark, &lowest_range_values, &highest_range_values, &steps, repeat, &whitelist); + let params = ( + &pallet, + &benchmark, + &lowest_range_values, + &highest_range_values, + &steps, + repeat, + &whitelist, + extra, + ); // Polkadot add_benchmark!(params, batches, claims, Claims); // Substrate diff --git a/runtime/kusama/src/weights/balances.rs b/runtime/kusama/src/weights/balances.rs new file mode 100644 index 0000000000..bc2f3ac18a --- /dev/null +++ b/runtime/kusama/src/weights/balances.rs @@ -0,0 +1,47 @@ +// Copyright 2019-2020 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 . + +/// Weights for the Balances Pallet + +use frame_support::weights::{Weight, constants::RocksDbWeight as DbWeight}; +pub struct WeightInfo; +impl balances::WeightInfo for WeightInfo { + fn transfer() -> Weight { + (65949000 as Weight) + .saturating_add(DbWeight::get().reads(1 as Weight)) + .saturating_add(DbWeight::get().writes(1 as Weight)) + } + fn transfer_keep_alive() -> Weight { + (46665000 as Weight) + .saturating_add(DbWeight::get().reads(1 as Weight)) + .saturating_add(DbWeight::get().writes(1 as Weight)) + } + fn set_balance_creating() -> Weight { + (27086000 as Weight) + .saturating_add(DbWeight::get().reads(1 as Weight)) + .saturating_add(DbWeight::get().writes(1 as Weight)) + } + fn set_balance_killing() -> Weight { + (33424000 as Weight) + .saturating_add(DbWeight::get().reads(1 as Weight)) + .saturating_add(DbWeight::get().writes(1 as Weight)) + } + fn force_transfer() -> Weight { + (65343000 as Weight) + .saturating_add(DbWeight::get().reads(2 as Weight)) + .saturating_add(DbWeight::get().writes(2 as Weight)) + } +} diff --git a/runtime/kusama/src/weights/mod.rs b/runtime/kusama/src/weights/mod.rs new file mode 100644 index 0000000000..75cabca0c6 --- /dev/null +++ b/runtime/kusama/src/weights/mod.rs @@ -0,0 +1,19 @@ +// Copyright 2019-2020 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 . + +/// A collection of weight modules used for pallets in the runtime. + +pub mod balances; diff --git a/runtime/polkadot/src/lib.rs b/runtime/polkadot/src/lib.rs index 328fd927be..b683a66c75 100644 --- a/runtime/polkadot/src/lib.rs +++ b/runtime/polkadot/src/lib.rs @@ -76,6 +76,9 @@ pub mod constants; use constants::{time::*, currency::*, fee::*}; use frame_support::traits::InstanceFilter; +// Weights used in the runtime. +mod weights; + // Make the WASM binary available. #[cfg(feature = "std")] include!(concat!(env!("OUT_DIR"), "/wasm_binary.rs")); @@ -236,7 +239,7 @@ impl balances::Trait for Runtime { type Event = Event; type ExistentialDeposit = ExistentialDeposit; type AccountStore = System; - type WeightInfo = (); + type WeightInfo = weights::balances::WeightInfo; } parameter_types! { @@ -1407,6 +1410,7 @@ sp_api::impl_runtime_apis! { highest_range_values: Vec, steps: Vec, repeat: u32, + extra: bool, ) -> Result, RuntimeString> { use frame_benchmarking::{Benchmarking, BenchmarkBatch, add_benchmark}; // Trying to add benchmarks directly to the Session Pallet caused cyclic dependency issues. @@ -1439,7 +1443,16 @@ sp_api::impl_runtime_apis! { ]; let mut batches = Vec::::new(); - let params = (&pallet, &benchmark, &lowest_range_values, &highest_range_values, &steps, repeat, &whitelist); + let params = ( + &pallet, + &benchmark, + &lowest_range_values, + &highest_range_values, + &steps, + repeat, + &whitelist, + extra, + ); // Polkadot add_benchmark!(params, batches, claims, Claims); // Substrate diff --git a/runtime/polkadot/src/weights/balances.rs b/runtime/polkadot/src/weights/balances.rs new file mode 100644 index 0000000000..bc2f3ac18a --- /dev/null +++ b/runtime/polkadot/src/weights/balances.rs @@ -0,0 +1,47 @@ +// Copyright 2019-2020 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 . + +/// Weights for the Balances Pallet + +use frame_support::weights::{Weight, constants::RocksDbWeight as DbWeight}; +pub struct WeightInfo; +impl balances::WeightInfo for WeightInfo { + fn transfer() -> Weight { + (65949000 as Weight) + .saturating_add(DbWeight::get().reads(1 as Weight)) + .saturating_add(DbWeight::get().writes(1 as Weight)) + } + fn transfer_keep_alive() -> Weight { + (46665000 as Weight) + .saturating_add(DbWeight::get().reads(1 as Weight)) + .saturating_add(DbWeight::get().writes(1 as Weight)) + } + fn set_balance_creating() -> Weight { + (27086000 as Weight) + .saturating_add(DbWeight::get().reads(1 as Weight)) + .saturating_add(DbWeight::get().writes(1 as Weight)) + } + fn set_balance_killing() -> Weight { + (33424000 as Weight) + .saturating_add(DbWeight::get().reads(1 as Weight)) + .saturating_add(DbWeight::get().writes(1 as Weight)) + } + fn force_transfer() -> Weight { + (65343000 as Weight) + .saturating_add(DbWeight::get().reads(2 as Weight)) + .saturating_add(DbWeight::get().writes(2 as Weight)) + } +} diff --git a/runtime/polkadot/src/weights/mod.rs b/runtime/polkadot/src/weights/mod.rs new file mode 100644 index 0000000000..75cabca0c6 --- /dev/null +++ b/runtime/polkadot/src/weights/mod.rs @@ -0,0 +1,19 @@ +// Copyright 2019-2020 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 . + +/// A collection of weight modules used for pallets in the runtime. + +pub mod balances; diff --git a/runtime/polkadot/tests/weights.rs b/runtime/polkadot/tests/weights.rs index 3cdb719958..70f9d7e4f9 100644 --- a/runtime/polkadot/tests/weights.rs +++ b/runtime/polkadot/tests/weights.rs @@ -51,29 +51,6 @@ fn sanity_check_weight_per_time_constants_are_as_expected() { assert_eq!(WEIGHT_PER_NANOS, WEIGHT_PER_MICROS / 1000); } -#[test] -fn weight_of_balances_transfer_is_correct() { - // #[weight = T::DbWeight::get().reads_writes(1, 1) + 70_000_000] - let expected_weight = DbWeight::get().read + DbWeight::get().write + 70_000_000; - - let weight = polkadot_runtime::BalancesCall::transfer::(Default::default(), Default::default()) - .get_dispatch_info() - .weight; - assert_eq!(weight, expected_weight); -} - -#[test] -fn weight_of_balances_transfer_keep_alive_is_correct() { - // #[weight = T::DbWeight::get().reads_writes(1, 1) + 50_000_000] - let expected_weight = DbWeight::get().read + DbWeight::get().write + 50_000_000; - - let weight = polkadot_runtime::BalancesCall::transfer_keep_alive::(Default::default(), Default::default()) - .get_dispatch_info() - .weight; - - assert_eq!(weight, expected_weight); -} - #[test] fn weight_of_timestamp_set_is_correct() { // #[weight = T::DbWeight::get().reads_writes(2, 1) + 8_000_000] diff --git a/runtime/westend/src/lib.rs b/runtime/westend/src/lib.rs index 49cc91c533..e9aa1a1541 100644 --- a/runtime/westend/src/lib.rs +++ b/runtime/westend/src/lib.rs @@ -74,6 +74,9 @@ pub use parachains::Call as ParachainsCall; pub mod constants; use constants::{time::*, currency::*, fee::*}; +// Weights used in the runtime +mod weights; + // Make the WASM binary available. #[cfg(feature = "std")] include!(concat!(env!("OUT_DIR"), "/wasm_binary.rs")); @@ -201,7 +204,7 @@ impl balances::Trait for Runtime { type Event = Event; type ExistentialDeposit = ExistentialDeposit; type AccountStore = System; - type WeightInfo = (); + type WeightInfo = weights::balances::WeightInfo; } parameter_types! { @@ -1049,6 +1052,7 @@ sp_api::impl_runtime_apis! { highest_range_values: Vec, steps: Vec, repeat: u32, + extra: bool, ) -> Result, RuntimeString> { use frame_benchmarking::{Benchmarking, BenchmarkBatch, add_benchmark}; // Trying to add benchmarks directly to the Session Pallet caused cyclic dependency issues. @@ -1081,7 +1085,16 @@ sp_api::impl_runtime_apis! { ]; let mut batches = Vec::::new(); - let params = (&pallet, &benchmark, &lowest_range_values, &highest_range_values, &steps, repeat, &whitelist); + let params = ( + &pallet, + &benchmark, + &lowest_range_values, + &highest_range_values, + &steps, + repeat, + &whitelist, + extra, + ); add_benchmark!(params, batches, balances,Balances); add_benchmark!(params, batches, identity,Identity); diff --git a/runtime/westend/src/weights/balances.rs b/runtime/westend/src/weights/balances.rs new file mode 100644 index 0000000000..bc2f3ac18a --- /dev/null +++ b/runtime/westend/src/weights/balances.rs @@ -0,0 +1,47 @@ +// Copyright 2019-2020 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 . + +/// Weights for the Balances Pallet + +use frame_support::weights::{Weight, constants::RocksDbWeight as DbWeight}; +pub struct WeightInfo; +impl balances::WeightInfo for WeightInfo { + fn transfer() -> Weight { + (65949000 as Weight) + .saturating_add(DbWeight::get().reads(1 as Weight)) + .saturating_add(DbWeight::get().writes(1 as Weight)) + } + fn transfer_keep_alive() -> Weight { + (46665000 as Weight) + .saturating_add(DbWeight::get().reads(1 as Weight)) + .saturating_add(DbWeight::get().writes(1 as Weight)) + } + fn set_balance_creating() -> Weight { + (27086000 as Weight) + .saturating_add(DbWeight::get().reads(1 as Weight)) + .saturating_add(DbWeight::get().writes(1 as Weight)) + } + fn set_balance_killing() -> Weight { + (33424000 as Weight) + .saturating_add(DbWeight::get().reads(1 as Weight)) + .saturating_add(DbWeight::get().writes(1 as Weight)) + } + fn force_transfer() -> Weight { + (65343000 as Weight) + .saturating_add(DbWeight::get().reads(2 as Weight)) + .saturating_add(DbWeight::get().writes(2 as Weight)) + } +} diff --git a/runtime/westend/src/weights/mod.rs b/runtime/westend/src/weights/mod.rs new file mode 100644 index 0000000000..75cabca0c6 --- /dev/null +++ b/runtime/westend/src/weights/mod.rs @@ -0,0 +1,19 @@ +// Copyright 2019-2020 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 . + +/// A collection of weight modules used for pallets in the runtime. + +pub mod balances; -- GitLab From f772196f307f23b0f97fa6d6325e3cf0a64d12e6 Mon Sep 17 00:00:00 2001 From: Robert Habermeier Date: Thu, 30 Jul 2020 14:15:00 -0400 Subject: [PATCH 122/192] Implement the Runtime API subsystem (#1494) * type defaults for ParachainHost * add ValidationCode message * implement core loop of runtime API subsystem * subsystem trait implementation for runtime API subsystem * implement a mock runtime API * some tests that ensure requests are forwarded to runtime API correctly * fix dependency grumbles * improve RuntimeApiError API --- Cargo.lock | 14 + Cargo.toml | 3 +- node/core/runtime-api/Cargo.toml | 6 +- node/core/runtime-api/src/lib.rs | 443 ++++++++++++++++++++++++++++++- node/subsystem/src/messages.rs | 10 + primitives/src/v1.rs | 2 +- 6 files changed, 470 insertions(+), 8 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 9cc34439aa..3ac3810466 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4661,6 +4661,20 @@ dependencies = [ "wasm-timer", ] +[[package]] +name = "polkadot-node-core-runtime-api" +version = "0.1.0" +dependencies = [ + "assert_matches", + "futures 0.3.5", + "polkadot-node-primitives", + "polkadot-node-subsystem", + "polkadot-primitives", + "sp-api", + "sp-blockchain", + "sp-core", +] + [[package]] name = "polkadot-node-primitives" version = "0.1.0" diff --git a/Cargo.toml b/Cargo.toml index 23079972a0..595936f357 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -43,9 +43,10 @@ members = [ "service", "validation", + "node/core/av-store", "node/core/bitfield-signing", "node/core/proposer", - "node/core/av-store", + "node/core/runtime-api", "node/network/bridge", "node/network/pov-distribution", "node/network/statement-distribution", diff --git a/node/core/runtime-api/Cargo.toml b/node/core/runtime-api/Cargo.toml index 14a0ce5540..200aed3897 100644 --- a/node/core/runtime-api/Cargo.toml +++ b/node/core/runtime-api/Cargo.toml @@ -6,17 +6,15 @@ edition = "2018" [dependencies] futures = "0.3.5" -log = "0.4.8" sp-api = { git = "https://github.com/paritytech/substrate", branch = "master" } -sc-client-api = { git = "https://github.com/paritytech/substrate", branch = "master" } sp-blockchain = { git = "https://github.com/paritytech/substrate", branch = "master" } -primitives = { package = "sp-core", git = "https://github.com/paritytech/substrate", branch = "master" } polkadot-primitives = { path = "../../../primitives" } polkadot-node-primitives = { path = "../../primitives" } polkadot-subsystem = { package = "polkadot-node-subsystem", path = "../../subsystem" } [dev-dependencies] +sp-core = { git = "https://github.com/paritytech/substrate", branch = "master" } futures = { version = "0.3.5", features = ["thread-pool"] } -subsystem-test = { package = "polkadot-subsystem-test-helpers", path = "../../test-helpers/subsystem" } +polkadot-subsystem = { package = "polkadot-node-subsystem", path = "../../subsystem", features = ["test-helpers"] } assert_matches = "1.3.0" diff --git a/node/core/runtime-api/src/lib.rs b/node/core/runtime-api/src/lib.rs index 0e1023b8c4..f242381723 100644 --- a/node/core/runtime-api/src/lib.rs +++ b/node/core/runtime-api/src/lib.rs @@ -18,5 +18,444 @@ //! //! This provides a clean, ownerless wrapper around the parachain-related runtime APIs. This crate //! can also be used to cache responses from heavy runtime APIs. -//! -//! TODO: https://github.com/paritytech/polkadot/issues/1419 implement this. + +use polkadot_subsystem::{ + Subsystem, SpawnedSubsystem, SubsystemResult, SubsystemContext, + FromOverseer, OverseerSignal, +}; +use polkadot_subsystem::messages::{ + RuntimeApiMessage, RuntimeApiRequest as Request, RuntimeApiError, +}; +use polkadot_primitives::v1::{Block, BlockId, Hash, ParachainHost}; + +use sp_api::{ProvideRuntimeApi}; + +use futures::prelude::*; + +/// The `RuntimeApiSubsystem`. See module docs for more details. +pub struct RuntimeApiSubsystem(Client); + +impl RuntimeApiSubsystem { + /// Create a new Runtime API subsystem wrapping the given client. + pub fn new(client: Client) -> Self { + RuntimeApiSubsystem(client) + } +} + +impl Subsystem for RuntimeApiSubsystem where + Client: ProvideRuntimeApi + Send + 'static, + Client::Api: ParachainHost, + Context: SubsystemContext +{ + fn start(self, ctx: Context) -> SpawnedSubsystem { + SpawnedSubsystem { + future: run(ctx, self.0).map(|_| ()).boxed(), + name: "RuntimeApiSubsystem", + } + } +} + +async fn run( + mut ctx: impl SubsystemContext, + client: Client, +) -> SubsystemResult<()> where + Client: ProvideRuntimeApi, + Client::Api: ParachainHost, +{ + loop { + match ctx.recv().await? { + FromOverseer::Signal(OverseerSignal::Conclude) => return Ok(()), + FromOverseer::Signal(OverseerSignal::ActiveLeaves(_)) => {}, + FromOverseer::Signal(OverseerSignal::BlockFinalized(_)) => {}, + FromOverseer::Communication { msg } => match msg { + RuntimeApiMessage::Request(relay_parent, request) => make_runtime_api_request( + &client, + relay_parent, + request, + ), + } + } + } +} + +fn make_runtime_api_request( + client: &Client, + relay_parent: Hash, + request: Request, +) where + Client: ProvideRuntimeApi, + Client::Api: ParachainHost, +{ + macro_rules! query { + ($api_name:ident ($($param:expr),*), $sender:expr) => {{ + let sender = $sender; + let api = client.runtime_api(); + let res = api.$api_name(&BlockId::Hash(relay_parent), $($param),*) + .map_err(|e| RuntimeApiError::from(format!("{:?}", e))); + + let _ = sender.send(res); + }} + } + + match request { + Request::Validators(sender) => query!(validators(), sender), + Request::ValidatorGroups(sender) => query!(validator_groups(), sender), + Request::AvailabilityCores(sender) => query!(availability_cores(), sender), + Request::GlobalValidationData(sender) => query!(global_validation_data(), sender), + Request::LocalValidationData(para, assumption, sender) => + query!(local_validation_data(para, assumption), sender), + Request::SessionIndexForChild(sender) => query!(session_index_for_child(), sender), + Request::ValidationCode(para, assumption, sender) => + query!(validation_code(para, assumption), sender), + Request::CandidatePendingAvailability(para, sender) => + query!(candidate_pending_availability(para), sender), + Request::CandidateEvents(sender) => query!(candidate_events(), sender), + } +} + +#[cfg(test)] +mod tests { + use super::*; + + use polkadot_primitives::v1::{ + ValidatorId, ValidatorIndex, GroupRotationInfo, CoreState, GlobalValidationData, + Id as ParaId, OccupiedCoreAssumption, LocalValidationData, SessionIndex, ValidationCode, + CommittedCandidateReceipt, CandidateEvent, + }; + use polkadot_subsystem::test_helpers; + use sp_core::testing::TaskExecutor; + + use std::collections::HashMap; + use futures::channel::oneshot; + + #[derive(Default, Clone)] + struct MockRuntimeApi { + validators: Vec, + validator_groups: Vec>, + availability_cores: Vec, + global_validation_data: GlobalValidationData, + local_validation_data: HashMap, + session_index_for_child: SessionIndex, + validation_code: HashMap, + candidate_pending_availability: HashMap, + candidate_events: Vec, + } + + impl ProvideRuntimeApi for MockRuntimeApi { + type Api = Self; + + fn runtime_api<'a>(&'a self) -> sp_api::ApiRef<'a, Self::Api> { + self.clone().into() + } + } + + sp_api::mock_impl_runtime_apis! { + impl ParachainHost for MockRuntimeApi { + type Error = String; + + fn validators(&self) -> Vec { + self.validators.clone() + } + + fn validator_groups(&self) -> (Vec>, GroupRotationInfo) { + ( + self.validator_groups.clone(), + GroupRotationInfo { + session_start_block: 1, + group_rotation_frequency: 100, + now: 10, + }, + ) + } + + fn availability_cores(&self) -> Vec { + self.availability_cores.clone() + } + + fn global_validation_data(&self) -> GlobalValidationData { + self.global_validation_data.clone() + } + + fn local_validation_data( + &self, + para: ParaId, + _assumption: OccupiedCoreAssumption, + ) -> Option { + self.local_validation_data.get(¶).map(|l| l.clone()) + } + + fn session_index_for_child(&self) -> SessionIndex { + self.session_index_for_child.clone() + } + + fn validation_code( + &self, + para: ParaId, + _assumption: OccupiedCoreAssumption, + ) -> Option { + self.validation_code.get(¶).map(|c| c.clone()) + } + + fn candidate_pending_availability( + &self, + para: ParaId, + ) -> Option { + self.candidate_pending_availability.get(¶).map(|c| c.clone()) + } + + fn candidate_events(&self) -> Vec { + self.candidate_events.clone() + } + } + } + + #[test] + fn requests_validators() { + let (ctx, mut ctx_handle) = test_helpers::make_subsystem_context(TaskExecutor::new()); + let runtime_api = MockRuntimeApi::default(); + let relay_parent = [1; 32].into(); + + let subsystem_task = run(ctx, runtime_api.clone()).map(|x| x.unwrap()); + let test_task = async move { + let (tx, rx) = oneshot::channel(); + + ctx_handle.send(FromOverseer::Communication { + msg: RuntimeApiMessage::Request(relay_parent, Request::Validators(tx)) + }).await; + + assert_eq!(rx.await.unwrap().unwrap(), runtime_api.validators); + + ctx_handle.send(FromOverseer::Signal(OverseerSignal::Conclude)).await; + }; + + futures::executor::block_on(future::join(subsystem_task, test_task)); + } + + #[test] + fn requests_validator_groups() { + let (ctx, mut ctx_handle) = test_helpers::make_subsystem_context(TaskExecutor::new()); + let runtime_api = MockRuntimeApi::default(); + let relay_parent = [1; 32].into(); + + let subsystem_task = run(ctx, runtime_api.clone()).map(|x| x.unwrap()); + let test_task = async move { + let (tx, rx) = oneshot::channel(); + + ctx_handle.send(FromOverseer::Communication { + msg: RuntimeApiMessage::Request(relay_parent, Request::ValidatorGroups(tx)) + }).await; + + assert_eq!(rx.await.unwrap().unwrap().0, runtime_api.validator_groups); + + ctx_handle.send(FromOverseer::Signal(OverseerSignal::Conclude)).await; + }; + + futures::executor::block_on(future::join(subsystem_task, test_task)); + } + + #[test] + fn requests_availability_cores() { + let (ctx, mut ctx_handle) = test_helpers::make_subsystem_context(TaskExecutor::new()); + let runtime_api = MockRuntimeApi::default(); + let relay_parent = [1; 32].into(); + + let subsystem_task = run(ctx, runtime_api.clone()).map(|x| x.unwrap()); + let test_task = async move { + let (tx, rx) = oneshot::channel(); + + ctx_handle.send(FromOverseer::Communication { + msg: RuntimeApiMessage::Request(relay_parent, Request::AvailabilityCores(tx)) + }).await; + + assert_eq!(rx.await.unwrap().unwrap(), runtime_api.availability_cores); + + ctx_handle.send(FromOverseer::Signal(OverseerSignal::Conclude)).await; + }; + + futures::executor::block_on(future::join(subsystem_task, test_task)); + } + + #[test] + fn requests_global_validation_data() { + let (ctx, mut ctx_handle) = test_helpers::make_subsystem_context(TaskExecutor::new()); + let runtime_api = MockRuntimeApi::default(); + let relay_parent = [1; 32].into(); + + let subsystem_task = run(ctx, runtime_api.clone()).map(|x| x.unwrap()); + let test_task = async move { + let (tx, rx) = oneshot::channel(); + + ctx_handle.send(FromOverseer::Communication { + msg: RuntimeApiMessage::Request(relay_parent, Request::GlobalValidationData(tx)) + }).await; + + assert_eq!(rx.await.unwrap().unwrap(), runtime_api.global_validation_data); + + ctx_handle.send(FromOverseer::Signal(OverseerSignal::Conclude)).await; + }; + + futures::executor::block_on(future::join(subsystem_task, test_task)); + } + + #[test] + fn requests_local_validation_data() { + let (ctx, mut ctx_handle) = test_helpers::make_subsystem_context(TaskExecutor::new()); + let mut runtime_api = MockRuntimeApi::default(); + let relay_parent = [1; 32].into(); + let para_a = 5.into(); + let para_b = 6.into(); + + runtime_api.local_validation_data.insert(para_a, Default::default()); + + let subsystem_task = run(ctx, runtime_api.clone()).map(|x| x.unwrap()); + let test_task = async move { + let (tx, rx) = oneshot::channel(); + + ctx_handle.send(FromOverseer::Communication { + msg: RuntimeApiMessage::Request( + relay_parent, + Request::LocalValidationData(para_a, OccupiedCoreAssumption::Included, tx) + ), + }).await; + + assert_eq!(rx.await.unwrap().unwrap(), Some(Default::default())); + + let (tx, rx) = oneshot::channel(); + ctx_handle.send(FromOverseer::Communication { + msg: RuntimeApiMessage::Request( + relay_parent, + Request::LocalValidationData(para_b, OccupiedCoreAssumption::Included, tx) + ), + }).await; + + assert_eq!(rx.await.unwrap().unwrap(), None); + + ctx_handle.send(FromOverseer::Signal(OverseerSignal::Conclude)).await; + }; + + futures::executor::block_on(future::join(subsystem_task, test_task)); + } + + #[test] + fn requests_session_index_for_child() { + let (ctx, mut ctx_handle) = test_helpers::make_subsystem_context(TaskExecutor::new()); + let runtime_api = MockRuntimeApi::default(); + let relay_parent = [1; 32].into(); + + let subsystem_task = run(ctx, runtime_api.clone()).map(|x| x.unwrap()); + let test_task = async move { + let (tx, rx) = oneshot::channel(); + + ctx_handle.send(FromOverseer::Communication { + msg: RuntimeApiMessage::Request(relay_parent, Request::SessionIndexForChild(tx)) + }).await; + + assert_eq!(rx.await.unwrap().unwrap(), runtime_api.session_index_for_child); + + ctx_handle.send(FromOverseer::Signal(OverseerSignal::Conclude)).await; + }; + + futures::executor::block_on(future::join(subsystem_task, test_task)); + } + + #[test] + fn requests_validation_code() { + let (ctx, mut ctx_handle) = test_helpers::make_subsystem_context(TaskExecutor::new()); + let mut runtime_api = MockRuntimeApi::default(); + let relay_parent = [1; 32].into(); + let para_a = 5.into(); + let para_b = 6.into(); + + runtime_api.validation_code.insert(para_a, Default::default()); + + let subsystem_task = run(ctx, runtime_api.clone()).map(|x| x.unwrap()); + let test_task = async move { + let (tx, rx) = oneshot::channel(); + + ctx_handle.send(FromOverseer::Communication { + msg: RuntimeApiMessage::Request( + relay_parent, + Request::ValidationCode(para_a, OccupiedCoreAssumption::Included, tx) + ), + }).await; + + assert_eq!(rx.await.unwrap().unwrap(), Some(Default::default())); + + let (tx, rx) = oneshot::channel(); + ctx_handle.send(FromOverseer::Communication { + msg: RuntimeApiMessage::Request( + relay_parent, + Request::ValidationCode(para_b, OccupiedCoreAssumption::Included, tx) + ), + }).await; + + assert_eq!(rx.await.unwrap().unwrap(), None); + + ctx_handle.send(FromOverseer::Signal(OverseerSignal::Conclude)).await; + }; + + futures::executor::block_on(future::join(subsystem_task, test_task)); + } + + #[test] + fn requests_candidate_pending_availability() { + let (ctx, mut ctx_handle) = test_helpers::make_subsystem_context(TaskExecutor::new()); + let mut runtime_api = MockRuntimeApi::default(); + let relay_parent = [1; 32].into(); + let para_a = 5.into(); + let para_b = 6.into(); + + runtime_api.candidate_pending_availability.insert(para_a, Default::default()); + + let subsystem_task = run(ctx, runtime_api.clone()).map(|x| x.unwrap()); + let test_task = async move { + let (tx, rx) = oneshot::channel(); + + ctx_handle.send(FromOverseer::Communication { + msg: RuntimeApiMessage::Request( + relay_parent, + Request::CandidatePendingAvailability(para_a, tx), + ) + }).await; + + assert_eq!(rx.await.unwrap().unwrap(), Some(Default::default())); + + let (tx, rx) = oneshot::channel(); + + ctx_handle.send(FromOverseer::Communication { + msg: RuntimeApiMessage::Request( + relay_parent, + Request::CandidatePendingAvailability(para_b, tx), + ) + }).await; + + assert_eq!(rx.await.unwrap().unwrap(), None); + + ctx_handle.send(FromOverseer::Signal(OverseerSignal::Conclude)).await; + }; + + futures::executor::block_on(future::join(subsystem_task, test_task)); + } + + #[test] + fn requests_candidate_events() { + let (ctx, mut ctx_handle) = test_helpers::make_subsystem_context(TaskExecutor::new()); + let runtime_api = MockRuntimeApi::default(); + let relay_parent = [1; 32].into(); + + let subsystem_task = run(ctx, runtime_api.clone()).map(|x| x.unwrap()); + let test_task = async move { + let (tx, rx) = oneshot::channel(); + + ctx_handle.send(FromOverseer::Communication { + msg: RuntimeApiMessage::Request(relay_parent, Request::CandidateEvents(tx)) + }).await; + + assert_eq!(rx.await.unwrap().unwrap(), runtime_api.candidate_events); + + ctx_handle.send(FromOverseer::Signal(OverseerSignal::Conclude)).await; + }; + + futures::executor::block_on(future::join(subsystem_task, test_task)); + } +} diff --git a/node/subsystem/src/messages.rs b/node/subsystem/src/messages.rs index 895e936d5b..c049b9d199 100644 --- a/node/subsystem/src/messages.rs +++ b/node/subsystem/src/messages.rs @@ -300,6 +300,12 @@ pub struct SchedulerRoster { #[derive(Debug, Clone)] pub struct RuntimeApiError(String); +impl From for RuntimeApiError { + fn from(s: String) -> Self { + RuntimeApiError(s) + } +} + /// A sender for the result of a runtime API request. pub type RuntimeApiSender = oneshot::Sender>; @@ -324,6 +330,10 @@ pub enum RuntimeApiRequest { ), /// Get the session index that a child of the block will have. SessionIndexForChild(RuntimeApiSender), + /// Get the validation code for a para, taking the given `OccupiedCoreAssumption`, which + /// will inform on how the validation data should be computed if the para currently + /// occupies a core. + ValidationCode(ParaId, OccupiedCoreAssumption, RuntimeApiSender>), /// Get a the candidate pending availability for a particular parachain by parachain / core index CandidatePendingAvailability(ParaId, RuntimeApiSender>), /// Get all events concerning candidates (backing, inclusion, time-out) in the parent of diff --git a/primitives/src/v1.rs b/primitives/src/v1.rs index 5d523fd300..8b4130fe9d 100644 --- a/primitives/src/v1.rs +++ b/primitives/src/v1.rs @@ -646,7 +646,7 @@ pub enum CandidateEvent { sp_api::decl_runtime_apis! { /// The API for querying the state of parachains on-chain. - pub trait ParachainHost { + pub trait ParachainHost { /// Get the current validators. fn validators() -> Vec; -- GitLab From 4566ff6b075de16b20739d0ad726e95db97a424a Mon Sep 17 00:00:00 2001 From: Robert Habermeier Date: Thu, 30 Jul 2020 15:25:21 -0400 Subject: [PATCH 123/192] reduce slash defer durations (#1504) * reduce slash defer durations * update comments * tests --- runtime/kusama/src/lib.rs | 19 ++++++++++++++++--- runtime/polkadot/src/lib.rs | 17 +++++++++++++++-- runtime/westend/src/lib.rs | 19 ++++++++++++++++--- 3 files changed, 47 insertions(+), 8 deletions(-) diff --git a/runtime/kusama/src/lib.rs b/runtime/kusama/src/lib.rs index c841c552f9..89507400a7 100644 --- a/runtime/kusama/src/lib.rs +++ b/runtime/kusama/src/lib.rs @@ -90,7 +90,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("kusama"), impl_name: create_runtime_str!("parity-kusama"), authoring_version: 2, - spec_version: 2022, + spec_version: 2023, impl_version: 0, #[cfg(not(feature = "disable-runtime-api"))] apis: RUNTIME_API_VERSIONS, @@ -317,8 +317,8 @@ parameter_types! { pub const SessionsPerEra: SessionIndex = 6; // 28 eras for unbonding (7 days). pub const BondingDuration: staking::EraIndex = 28; - // 28 eras in which slashes can be cancelled (7 days). - pub const SlashDeferDuration: staking::EraIndex = 28; + // 27 eras in which slashes can be cancelled (slightly less than 7 days). + pub const SlashDeferDuration: staking::EraIndex = 27; pub const RewardCurve: &'static PiecewiseLinear<'static> = &REWARD_CURVE; pub const MaxNominatorRewardedPerValidator: u32 = 64; // quarter of the last session will be for election. @@ -1337,3 +1337,16 @@ sp_api::impl_runtime_apis! { } } } + +#[cfg(test)] +mod tests { + use super::Runtime; + + #[test] + fn slash_defer_less_than_bonding_duration() { + assert!( + ::SlashDeferDuration::get() + < ::BondingDuration::get() + ); + } +} diff --git a/runtime/polkadot/src/lib.rs b/runtime/polkadot/src/lib.rs index b683a66c75..1a922dc72e 100644 --- a/runtime/polkadot/src/lib.rs +++ b/runtime/polkadot/src/lib.rs @@ -89,7 +89,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("polkadot"), impl_name: create_runtime_str!("parity-polkadot"), authoring_version: 0, - spec_version: 22, + spec_version: 23, impl_version: 0, #[cfg(not(feature = "disable-runtime-api"))] apis: RUNTIME_API_VERSIONS, @@ -329,7 +329,7 @@ parameter_types! { pub const SessionsPerEra: SessionIndex = 6; // 28 eras for unbonding (28 days). pub const BondingDuration: staking::EraIndex = 28; - pub const SlashDeferDuration: staking::EraIndex = 28; + pub const SlashDeferDuration: staking::EraIndex = 27; pub const RewardCurve: &'static PiecewiseLinear<'static> = &REWARD_CURVE; pub const MaxNominatorRewardedPerValidator: u32 = 64; // last 15 minutes of the last session will be for election. @@ -1475,3 +1475,16 @@ sp_api::impl_runtime_apis! { } } } + +#[cfg(test)] +mod tests { + use super::Runtime; + + #[test] + fn slash_defer_less_than_bonding_duration() { + assert!( + ::SlashDeferDuration::get() + < ::BondingDuration::get() + ); + } +} diff --git a/runtime/westend/src/lib.rs b/runtime/westend/src/lib.rs index e9aa1a1541..93742b02c5 100644 --- a/runtime/westend/src/lib.rs +++ b/runtime/westend/src/lib.rs @@ -86,7 +86,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("westend"), impl_name: create_runtime_str!("parity-westend"), authoring_version: 2, - spec_version: 42, + spec_version: 43, impl_version: 0, #[cfg(not(feature = "disable-runtime-api"))] apis: RUNTIME_API_VERSIONS, @@ -294,8 +294,8 @@ parameter_types! { pub const SessionsPerEra: SessionIndex = 6; // 28 eras for unbonding (7 days). pub const BondingDuration: staking::EraIndex = 28; - // 28 eras in which slashes can be cancelled (7 days). - pub const SlashDeferDuration: staking::EraIndex = 28; + // 27 eras in which slashes can be cancelled (slightly less than 7 days). + pub const SlashDeferDuration: staking::EraIndex = 27; pub const RewardCurve: &'static PiecewiseLinear<'static> = &REWARD_CURVE; pub const MaxNominatorRewardedPerValidator: u32 = 64; // quarter of the last session will be for election. @@ -1113,3 +1113,16 @@ sp_api::impl_runtime_apis! { } } } + +#[cfg(test)] +mod tests { + use super::Runtime; + + #[test] + fn slash_defer_less_than_bonding_duration() { + assert!( + ::SlashDeferDuration::get() + < ::BondingDuration::get() + ); + } +} -- GitLab From cdb5c408b13acc353776cc48563e266c8a194b07 Mon Sep 17 00:00:00 2001 From: Robert Habermeier Date: Thu, 30 Jul 2020 17:50:11 -0400 Subject: [PATCH 124/192] Candidate Validation Subsystem (#1432) * skeleton for candidate-validation * add to workspace * implement candidate validation logic * guide: note occupied-core assumption for candidate validation * adjust message doc * wire together `run` asynchronously * add a Subsystem implementation * clean up a couple warnings * fix compilation errors due to merge * improve candidate-validation.md * remove old reference to subsystem-test helpers crate * update Cargo.lock * add a couple new Runtime API methods * add a candidate validation message * fetch validation data from the chain state * some tests for assumption checking * make spawn_validate_exhaustive mockable * more tests on the error handling side * fix all other grumbles except for wasm validation API change * wrap a SpawnNamed in candidate-validation * warn * amend guide * squanch warning * remove duplicate after merge --- Cargo.lock | 18 + Cargo.toml | 3 +- node/core/candidate-validation/Cargo.toml | 24 + node/core/candidate-validation/src/lib.rs | 918 ++++++++++++++++++ node/subsystem/src/messages.rs | 4 +- .../src/node/utility/candidate-validation.md | 40 +- .../src/types/overseer-protocol.md | 4 +- 7 files changed, 1001 insertions(+), 10 deletions(-) create mode 100644 node/core/candidate-validation/Cargo.toml create mode 100644 node/core/candidate-validation/src/lib.rs diff --git a/Cargo.lock b/Cargo.lock index 3ac3810466..47386ba2d4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4635,6 +4635,24 @@ dependencies = [ "wasm-timer", ] +[[package]] +name = "polkadot-node-core-candidate-validation" +version = "0.1.0" +dependencies = [ + "assert_matches", + "derive_more 0.99.9", + "futures 0.3.5", + "log 0.4.8", + "parity-scale-codec", + "polkadot-node-primitives", + "polkadot-node-subsystem", + "polkadot-parachain", + "polkadot-primitives", + "sp-blockchain", + "sp-core", + "sp-keyring", +] + [[package]] name = "polkadot-node-core-proposer" version = "0.1.0" diff --git a/Cargo.toml b/Cargo.toml index 595936f357..fa56b0ec42 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -44,7 +44,9 @@ members = [ "validation", "node/core/av-store", + "node/core/backing", "node/core/bitfield-signing", + "node/core/candidate-validation", "node/core/proposer", "node/core/runtime-api", "node/network/bridge", @@ -54,7 +56,6 @@ members = [ "node/overseer", "node/primitives", "node/service", - "node/core/backing", "node/subsystem", "node/test-service", diff --git a/node/core/candidate-validation/Cargo.toml b/node/core/candidate-validation/Cargo.toml new file mode 100644 index 0000000000..3c36b16758 --- /dev/null +++ b/node/core/candidate-validation/Cargo.toml @@ -0,0 +1,24 @@ +[package] +name = "polkadot-node-core-candidate-validation" +version = "0.1.0" +authors = ["Parity Technologies "] +edition = "2018" + +[dependencies] +futures = "0.3.5" +sp-blockchain = { git = "https://github.com/paritytech/substrate", branch = "master" } +sp-core = { package = "sp-core", git = "https://github.com/paritytech/substrate", branch = "master" } +parity-scale-codec = { version = "1.3.0", default-features = false, features = ["bit-vec", "derive"] } + +polkadot-primitives = { path = "../../../primitives" } +polkadot-parachain = { path = "../../../parachain" } +polkadot-node-primitives = { path = "../../primitives" } +polkadot-subsystem = { package = "polkadot-node-subsystem", path = "../../subsystem" } +derive_more = "0.99.9" +log = "0.4.8" + +[dev-dependencies] +sp-keyring = { git = "https://github.com/paritytech/substrate", branch = "master" } +futures = { version = "0.3.5", features = ["thread-pool"] } +assert_matches = "1.3.0" +polkadot-subsystem = { package = "polkadot-node-subsystem", path = "../../subsystem", features = ["test-helpers"] } diff --git a/node/core/candidate-validation/src/lib.rs b/node/core/candidate-validation/src/lib.rs new file mode 100644 index 0000000000..c040090faa --- /dev/null +++ b/node/core/candidate-validation/src/lib.rs @@ -0,0 +1,918 @@ +// Copyright 2020 Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Polkadot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . + +//! The Candidate Validation subsystem. +//! +//! This handles incoming requests from other subsystems to validate candidates +//! according to a validation function. This delegates validation to an underlying +//! pool of processes used for execution of the Wasm. + +use polkadot_subsystem::{ + Subsystem, SubsystemContext, SpawnedSubsystem, SubsystemResult, + FromOverseer, OverseerSignal, +}; +use polkadot_subsystem::messages::{ + AllMessages, CandidateValidationMessage, RuntimeApiMessage, ValidationFailed, RuntimeApiRequest, + RuntimeApiError, +}; +use polkadot_node_primitives::{ValidationResult, ValidationOutputs}; +use polkadot_primitives::v1::{ + ValidationCode, OmittedValidationData, PoV, CandidateDescriptor, LocalValidationData, + GlobalValidationData, OccupiedCoreAssumption, Hash, validation_data_hash, +}; +use polkadot_parachain::wasm_executor::{self, ValidationPool, ExecutionMode}; +use polkadot_parachain::primitives::{ValidationResult as WasmValidationResult, ValidationParams}; + +use parity_scale_codec::Encode; +use sp_core::traits::SpawnNamed; + +use futures::channel::oneshot; +use futures::prelude::*; + +use std::sync::Arc; + +/// The candidate validation subsystem. +pub struct CandidateValidationSubsystem(S); + +impl CandidateValidationSubsystem { + /// Create a new `CandidateValidationSubsystem` with the given task spawner. + pub fn new(spawn: S) -> Self { + CandidateValidationSubsystem(spawn) + } +} + +impl Subsystem for CandidateValidationSubsystem where + C: SubsystemContext, + S: SpawnNamed + Clone + 'static, +{ + fn start(self, ctx: C) -> SpawnedSubsystem { + SpawnedSubsystem { + name: "candidate-validation-subsystem", + future: run(ctx, self.0).map(|_| ()).boxed(), + } + } +} + +async fn run( + mut ctx: impl SubsystemContext, + spawn: impl SpawnNamed + Clone + 'static, +) + -> SubsystemResult<()> +{ + let pool = ValidationPool::new(); + + loop { + match ctx.recv().await? { + FromOverseer::Signal(OverseerSignal::ActiveLeaves(_)) => {} + FromOverseer::Signal(OverseerSignal::BlockFinalized(_)) => {} + FromOverseer::Signal(OverseerSignal::Conclude) => return Ok(()), + FromOverseer::Communication { msg } => match msg { + CandidateValidationMessage::ValidateFromChainState( + descriptor, + pov, + response_sender, + ) => { + let res = spawn_validate_from_chain_state( + &mut ctx, + Some(pool.clone()), + descriptor, + pov, + spawn.clone(), + ).await; + + match res { + Ok(x) => { let _ = response_sender.send(x); } + Err(e)=> return Err(e), + } + } + CandidateValidationMessage::ValidateFromExhaustive( + omitted_validation, + validation_code, + descriptor, + pov, + response_sender, + ) => { + let res = spawn_validate_exhaustive( + &mut ctx, + Some(pool.clone()), + omitted_validation, + validation_code, + descriptor, + pov, + spawn.clone(), + ).await; + + match res { + Ok(x) => if let Err(_e) = response_sender.send(x) { + log::warn!( + target: "candidate_validation", + "Requester of candidate validation dropped", + ) + }, + Err(e)=> return Err(e), + } + } + } + } + } +} + +async fn runtime_api_request( + ctx: &mut impl SubsystemContext, + relay_parent: Hash, + request: RuntimeApiRequest, + receiver: oneshot::Receiver>, +) -> SubsystemResult> { + ctx.send_message( + AllMessages::RuntimeApi(RuntimeApiMessage::Request( + relay_parent, + request, + )) + ).await?; + + receiver.await.map_err(Into::into) +} + +#[derive(Debug)] +enum AssumptionCheckOutcome { + Matches(OmittedValidationData, ValidationCode), + DoesNotMatch, + BadRequest, +} + +async fn check_assumption_validation_data( + ctx: &mut impl SubsystemContext, + descriptor: &CandidateDescriptor, + global_validation_data: &GlobalValidationData, + assumption: OccupiedCoreAssumption, +) -> SubsystemResult { + let local_validation_data = { + let (tx, rx) = oneshot::channel(); + let d = runtime_api_request( + ctx, + descriptor.relay_parent, + RuntimeApiRequest::LocalValidationData( + descriptor.para_id, + assumption, + tx, + ), + rx, + ).await?; + + match d { + Ok(None) | Err(_) => { + return Ok(AssumptionCheckOutcome::BadRequest); + } + Ok(Some(d)) => d, + } + }; + + let validation_data_hash = validation_data_hash( + &global_validation_data, + &local_validation_data, + ); + + SubsystemResult::Ok(if descriptor.validation_data_hash == validation_data_hash { + let omitted_validation = OmittedValidationData { + global_validation: global_validation_data.clone(), + local_validation: local_validation_data, + }; + + let (code_tx, code_rx) = oneshot::channel(); + let validation_code = runtime_api_request( + ctx, + descriptor.relay_parent, + RuntimeApiRequest::ValidationCode( + descriptor.para_id, + OccupiedCoreAssumption::Included, + code_tx, + ), + code_rx, + ).await?; + + match validation_code { + Ok(None) | Err(_) => AssumptionCheckOutcome::BadRequest, + Ok(Some(v)) => AssumptionCheckOutcome::Matches(omitted_validation, v), + } + } else { + AssumptionCheckOutcome::DoesNotMatch + }) +} + +async fn spawn_validate_from_chain_state( + ctx: &mut impl SubsystemContext, + validation_pool: Option, + descriptor: CandidateDescriptor, + pov: Arc, + spawn: impl SpawnNamed + 'static, +) -> SubsystemResult> { + // The candidate descriptor has a `validation_data_hash` which corresponds to + // one of up to two possible values that we can derive from the state of the + // relay-parent. We can fetch these values by getting the `global_validation_data`, + // and both `local_validation_data` based on the different `OccupiedCoreAssumption`s. + let global_validation_data = { + let (tx, rx) = oneshot::channel(); + let res = runtime_api_request( + ctx, + descriptor.relay_parent, + RuntimeApiRequest::GlobalValidationData(tx), + rx, + ).await?; + + match res { + Ok(g) => g, + Err(e) => { + log::warn!( + target: "candidate_validation", + "Error making runtime API request: {:?}", + e, + ); + + return Ok(Err(ValidationFailed)); + } + } + }; + + match check_assumption_validation_data( + ctx, + &descriptor, + &global_validation_data, + OccupiedCoreAssumption::Included, + ).await? { + AssumptionCheckOutcome::Matches(omitted_validation, validation_code) => { + return spawn_validate_exhaustive( + ctx, + validation_pool, + omitted_validation, + validation_code, + descriptor, + pov, + spawn, + ).await; + } + AssumptionCheckOutcome::DoesNotMatch => {}, + AssumptionCheckOutcome::BadRequest => return Ok(Err(ValidationFailed)), + } + + match check_assumption_validation_data( + ctx, + &descriptor, + &global_validation_data, + OccupiedCoreAssumption::TimedOut, + ).await? { + AssumptionCheckOutcome::Matches(omitted_validation, validation_code) => { + return spawn_validate_exhaustive( + ctx, + validation_pool, + omitted_validation, + validation_code, + descriptor, + pov, + spawn, + ).await; + } + AssumptionCheckOutcome::DoesNotMatch => {}, + AssumptionCheckOutcome::BadRequest => return Ok(Err(ValidationFailed)), + } + + // If neither the assumption of the occupied core having the para included or the assumption + // of the occupied core timing out are valid, then the validation_data_hash in the descriptor + // is not based on the relay parent and is thus invalid. + Ok(Ok(ValidationResult::Invalid)) +} + +async fn spawn_validate_exhaustive( + ctx: &mut impl SubsystemContext, + validation_pool: Option, + omitted_validation: OmittedValidationData, + validation_code: ValidationCode, + descriptor: CandidateDescriptor, + pov: Arc, + spawn: impl SpawnNamed + 'static, +) -> SubsystemResult> { + let (tx, rx) = oneshot::channel(); + let fut = async move { + let res = validate_candidate_exhaustive::( + validation_pool, + omitted_validation, + validation_code, + descriptor, + pov, + spawn, + ); + + let _ = tx.send(res); + }; + + ctx.spawn("blocking-candidate-validation-task", fut.boxed()).await?; + rx.await.map_err(Into::into) +} + +/// Does basic checks of a candidate. Provide the encoded PoV-block. Returns `true` if basic checks +/// are passed, false otherwise. +fn passes_basic_checks( + candidate: &CandidateDescriptor, + max_block_data_size: Option, + pov: &PoV, +) -> bool { + let encoded_pov = pov.encode(); + let hash = pov.hash(); + + if let Some(max_size) = max_block_data_size { + if encoded_pov.len() as u64 > max_size { + return false; + } + } + + if hash != candidate.pov_hash { + return false; + } + + if let Err(()) = candidate.check_collator_signature() { + return false; + } + + true +} + +/// Check the result of Wasm execution against the constraints given by the relay-chain. +/// +/// Returns `true` if checks pass, false otherwise. +fn check_wasm_result_against_constraints( + global_validation_data: &GlobalValidationData, + _local_validation_data: &LocalValidationData, + result: &WasmValidationResult, +) -> bool { + if result.head_data.0.len() > global_validation_data.max_head_data_size as _ { + return false + } + + if let Some(ref code) = result.new_validation_code { + if code.0.len() > global_validation_data.max_code_size as _ { + return false + } + } + + true +} + +trait ValidationBackend { + type Arg; + + fn validate( + arg: Self::Arg, + validation_code: &ValidationCode, + params: ValidationParams, + spawn: S, + ) -> Result; +} + +struct RealValidationBackend; + +impl ValidationBackend for RealValidationBackend { + type Arg = Option; + + fn validate( + pool: Option, + validation_code: &ValidationCode, + params: ValidationParams, + spawn: S, + ) -> Result { + let execution_mode = pool.as_ref() + .map(ExecutionMode::Remote) + .unwrap_or(ExecutionMode::Local); + + wasm_executor::validate_candidate( + &validation_code.0, + params, + execution_mode, + spawn, + ) + } +} + +/// Validates the candidate from exhaustive parameters. +/// +/// Sends the result of validation on the channel once complete. +fn validate_candidate_exhaustive( + backend_arg: B::Arg, + omitted_validation: OmittedValidationData, + validation_code: ValidationCode, + descriptor: CandidateDescriptor, + pov: Arc, + spawn: S, +) -> Result { + if !passes_basic_checks(&descriptor, None, &*pov) { + return Ok(ValidationResult::Invalid); + } + + let OmittedValidationData { global_validation, local_validation } = omitted_validation; + + let params = ValidationParams { + parent_head: local_validation.parent_head.clone(), + block_data: pov.block_data.clone(), + max_code_size: global_validation.max_code_size, + max_head_data_size: global_validation.max_head_data_size, + relay_chain_height: global_validation.block_number, + code_upgrade_allowed: local_validation.code_upgrade_allowed, + }; + + match B::validate(backend_arg, &validation_code, params, spawn) { + Err(wasm_executor::Error::BadReturn) => Ok(ValidationResult::Invalid), + Err(_) => Err(ValidationFailed), + Ok(res) => { + let passes_post_checks = check_wasm_result_against_constraints( + &global_validation, + &local_validation, + &res, + ); + + Ok(if passes_post_checks { + ValidationResult::Valid(ValidationOutputs { + head_data: res.head_data, + global_validation_data: global_validation, + local_validation_data: local_validation, + upward_messages: res.upward_messages, + fees: 0, + new_validation_code: res.new_validation_code, + }) + } else { + ValidationResult::Invalid + }) + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + use polkadot_subsystem::test_helpers; + use polkadot_primitives::v1::{HeadData, BlockData}; + use sp_core::testing::TaskExecutor; + use futures::executor; + use assert_matches::assert_matches; + use sp_keyring::Sr25519Keyring; + + struct MockValidationBackend; + + struct MockValidationArg { + result: Result, + } + + impl ValidationBackend for MockValidationBackend { + type Arg = MockValidationArg; + + fn validate( + arg: Self::Arg, + _validation_code: &ValidationCode, + _params: ValidationParams, + _spawn: S, + ) -> Result { + arg.result + } + } + + fn collator_sign(descriptor: &mut CandidateDescriptor, collator: Sr25519Keyring) { + descriptor.collator = collator.public().into(); + let payload = polkadot_primitives::v1::collator_signature_payload( + &descriptor.relay_parent, + &descriptor.para_id, + &descriptor.validation_data_hash, + &descriptor.pov_hash, + ); + + descriptor.signature = collator.sign(&payload[..]).into(); + assert!(descriptor.check_collator_signature().is_ok()); + } + + #[test] + fn correctly_checks_included_assumption() { + let local_validation_data = LocalValidationData::default(); + let global_validation_data = GlobalValidationData::default(); + let validation_code: ValidationCode = vec![1, 2, 3].into(); + + let validation_data_hash = validation_data_hash(&global_validation_data, &local_validation_data); + let relay_parent = [2; 32].into(); + let para_id = 5.into(); + + let mut candidate = CandidateDescriptor::default(); + candidate.relay_parent = relay_parent; + candidate.validation_data_hash = validation_data_hash; + candidate.para_id = para_id; + + let pool = TaskExecutor::new(); + let (mut ctx, mut ctx_handle) = test_helpers::make_subsystem_context(pool.clone()); + + let (check_fut, check_result) = check_assumption_validation_data( + &mut ctx, + &candidate, + &global_validation_data, + OccupiedCoreAssumption::Included, + ).remote_handle(); + + let global_validation_data = global_validation_data.clone(); + let test_fut = async move { + assert_matches!( + ctx_handle.recv().await, + AllMessages::RuntimeApi(RuntimeApiMessage::Request( + rp, + RuntimeApiRequest::LocalValidationData(p, OccupiedCoreAssumption::Included, tx) + )) => { + assert_eq!(rp, relay_parent); + assert_eq!(p, para_id); + + let _ = tx.send(Ok(Some(local_validation_data.clone()))); + } + ); + + assert_matches!( + ctx_handle.recv().await, + AllMessages::RuntimeApi(RuntimeApiMessage::Request( + rp, + RuntimeApiRequest::ValidationCode(p, OccupiedCoreAssumption::Included, tx) + )) => { + assert_eq!(rp, relay_parent); + assert_eq!(p, para_id); + + let _ = tx.send(Ok(Some(validation_code.clone()))); + } + ); + + assert_matches!(check_result.await.unwrap(), AssumptionCheckOutcome::Matches(o, v) => { + assert_eq!(o, OmittedValidationData { + local_validation: local_validation_data, + global_validation: global_validation_data, + }); + + assert_eq!(v, validation_code); + }); + }; + + let test_fut = future::join(test_fut, check_fut); + executor::block_on(test_fut); + } + + #[test] + fn correctly_checks_timed_out_assumption() { + let local_validation_data = LocalValidationData::default(); + let global_validation_data = GlobalValidationData::default(); + let validation_code: ValidationCode = vec![1, 2, 3].into(); + + let validation_data_hash = validation_data_hash(&global_validation_data, &local_validation_data); + let relay_parent = [2; 32].into(); + let para_id = 5.into(); + + let mut candidate = CandidateDescriptor::default(); + candidate.relay_parent = relay_parent; + candidate.validation_data_hash = validation_data_hash; + candidate.para_id = para_id; + + let pool = TaskExecutor::new(); + let (mut ctx, mut ctx_handle) = test_helpers::make_subsystem_context(pool.clone()); + + let (check_fut, check_result) = check_assumption_validation_data( + &mut ctx, + &candidate, + &global_validation_data, + OccupiedCoreAssumption::TimedOut, + ).remote_handle(); + + let global_validation_data = global_validation_data.clone(); + let test_fut = async move { + assert_matches!( + ctx_handle.recv().await, + AllMessages::RuntimeApi(RuntimeApiMessage::Request( + rp, + RuntimeApiRequest::LocalValidationData(p, OccupiedCoreAssumption::TimedOut, tx) + )) => { + assert_eq!(rp, relay_parent); + assert_eq!(p, para_id); + + let _ = tx.send(Ok(Some(local_validation_data.clone()))); + } + ); + + assert_matches!( + ctx_handle.recv().await, + AllMessages::RuntimeApi(RuntimeApiMessage::Request( + rp, + RuntimeApiRequest::ValidationCode(p, OccupiedCoreAssumption::Included, tx) + )) => { + assert_eq!(rp, relay_parent); + assert_eq!(p, para_id); + + let _ = tx.send(Ok(Some(validation_code.clone()))); + } + ); + + assert_matches!(check_result.await.unwrap(), AssumptionCheckOutcome::Matches(o, v) => { + assert_eq!(o, OmittedValidationData { + local_validation: local_validation_data, + global_validation: global_validation_data, + }); + + assert_eq!(v, validation_code); + }); + }; + + let test_fut = future::join(test_fut, check_fut); + executor::block_on(test_fut); + } + + #[test] + fn check_is_bad_request_if_no_validation_data() { + let local_validation_data = LocalValidationData::default(); + let global_validation_data = GlobalValidationData::default(); + + let validation_data_hash = validation_data_hash(&global_validation_data, &local_validation_data); + let relay_parent = [2; 32].into(); + let para_id = 5.into(); + + let mut candidate = CandidateDescriptor::default(); + candidate.relay_parent = relay_parent; + candidate.validation_data_hash = validation_data_hash; + candidate.para_id = para_id; + + let pool = TaskExecutor::new(); + let (mut ctx, mut ctx_handle) = test_helpers::make_subsystem_context(pool.clone()); + + let (check_fut, check_result) = check_assumption_validation_data( + &mut ctx, + &candidate, + &global_validation_data, + OccupiedCoreAssumption::Included, + ).remote_handle(); + + let test_fut = async move { + assert_matches!( + ctx_handle.recv().await, + AllMessages::RuntimeApi(RuntimeApiMessage::Request( + rp, + RuntimeApiRequest::LocalValidationData(p, OccupiedCoreAssumption::Included, tx) + )) => { + assert_eq!(rp, relay_parent); + assert_eq!(p, para_id); + + let _ = tx.send(Ok(None)); + } + ); + + assert_matches!(check_result.await.unwrap(), AssumptionCheckOutcome::BadRequest); + }; + + let test_fut = future::join(test_fut, check_fut); + executor::block_on(test_fut); + } + + #[test] + fn check_is_bad_request_if_no_validation_code() { + let local_validation_data = LocalValidationData::default(); + let global_validation_data = GlobalValidationData::default(); + + let validation_data_hash = validation_data_hash(&global_validation_data, &local_validation_data); + let relay_parent = [2; 32].into(); + let para_id = 5.into(); + + let mut candidate = CandidateDescriptor::default(); + candidate.relay_parent = relay_parent; + candidate.validation_data_hash = validation_data_hash; + candidate.para_id = para_id; + + let pool = TaskExecutor::new(); + let (mut ctx, mut ctx_handle) = test_helpers::make_subsystem_context(pool.clone()); + + let (check_fut, check_result) = check_assumption_validation_data( + &mut ctx, + &candidate, + &global_validation_data, + OccupiedCoreAssumption::TimedOut, + ).remote_handle(); + + let test_fut = async move { + assert_matches!( + ctx_handle.recv().await, + AllMessages::RuntimeApi(RuntimeApiMessage::Request( + rp, + RuntimeApiRequest::LocalValidationData(p, OccupiedCoreAssumption::TimedOut, tx) + )) => { + assert_eq!(rp, relay_parent); + assert_eq!(p, para_id); + + let _ = tx.send(Ok(Some(local_validation_data.clone()))); + } + ); + + assert_matches!( + ctx_handle.recv().await, + AllMessages::RuntimeApi(RuntimeApiMessage::Request( + rp, + RuntimeApiRequest::ValidationCode(p, OccupiedCoreAssumption::Included, tx) + )) => { + assert_eq!(rp, relay_parent); + assert_eq!(p, para_id); + + let _ = tx.send(Ok(None)); + } + ); + + assert_matches!(check_result.await.unwrap(), AssumptionCheckOutcome::BadRequest); + }; + + let test_fut = future::join(test_fut, check_fut); + executor::block_on(test_fut); + } + + #[test] + fn check_does_not_match() { + let local_validation_data = LocalValidationData::default(); + let global_validation_data = GlobalValidationData::default(); + + let relay_parent = [2; 32].into(); + let para_id = 5.into(); + + let mut candidate = CandidateDescriptor::default(); + candidate.relay_parent = relay_parent; + candidate.validation_data_hash = [3; 32].into(); + candidate.para_id = para_id; + + let pool = TaskExecutor::new(); + let (mut ctx, mut ctx_handle) = test_helpers::make_subsystem_context(pool.clone()); + + let (check_fut, check_result) = check_assumption_validation_data( + &mut ctx, + &candidate, + &global_validation_data, + OccupiedCoreAssumption::Included, + ).remote_handle(); + + let test_fut = async move { + assert_matches!( + ctx_handle.recv().await, + AllMessages::RuntimeApi(RuntimeApiMessage::Request( + rp, + RuntimeApiRequest::LocalValidationData(p, OccupiedCoreAssumption::Included, tx) + )) => { + assert_eq!(rp, relay_parent); + assert_eq!(p, para_id); + + let _ = tx.send(Ok(Some(local_validation_data.clone()))); + } + ); + + assert_matches!(check_result.await.unwrap(), AssumptionCheckOutcome::DoesNotMatch); + }; + + let test_fut = future::join(test_fut, check_fut); + executor::block_on(test_fut); + } + + #[test] + fn candidate_validation_ok_is_ok() { + let mut omitted_validation = OmittedValidationData { + local_validation: Default::default(), + global_validation: Default::default(), + }; + + omitted_validation.global_validation.max_head_data_size = 1024; + omitted_validation.global_validation.max_code_size = 1024; + + let pov = PoV { block_data: BlockData(vec![1; 32]) }; + + let mut descriptor = CandidateDescriptor::default(); + descriptor.pov_hash = pov.hash(); + collator_sign(&mut descriptor, Sr25519Keyring::Alice); + + assert!(passes_basic_checks(&descriptor, Some(1024), &pov)); + + let validation_result = WasmValidationResult { + head_data: HeadData(vec![1, 1, 1]), + new_validation_code: Some(vec![2, 2, 2].into()), + upward_messages: Vec::new(), + processed_downward_messages: 0, + }; + + assert!(check_wasm_result_against_constraints( + &omitted_validation.global_validation, + &omitted_validation.local_validation, + &validation_result, + )); + + let v = validate_candidate_exhaustive::( + MockValidationArg { result: Ok(validation_result) }, + omitted_validation.clone(), + vec![1, 2, 3].into(), + descriptor, + Arc::new(pov), + TaskExecutor::new(), + ).unwrap(); + + assert_matches!(v, ValidationResult::Valid(outputs) => { + assert_eq!(outputs.head_data, HeadData(vec![1, 1, 1])); + assert_eq!(outputs.global_validation_data, omitted_validation.global_validation); + assert_eq!(outputs.local_validation_data, omitted_validation.local_validation); + assert_eq!(outputs.upward_messages, Vec::new()); + assert_eq!(outputs.fees, 0); + assert_eq!(outputs.new_validation_code, Some(vec![2, 2, 2].into())); + }); + } + + #[test] + fn candidate_validation_bad_return_is_invalid() { + let mut omitted_validation = OmittedValidationData { + local_validation: Default::default(), + global_validation: Default::default(), + }; + + omitted_validation.global_validation.max_head_data_size = 1024; + omitted_validation.global_validation.max_code_size = 1024; + + let pov = PoV { block_data: BlockData(vec![1; 32]) }; + + let mut descriptor = CandidateDescriptor::default(); + descriptor.pov_hash = pov.hash(); + collator_sign(&mut descriptor, Sr25519Keyring::Alice); + + assert!(passes_basic_checks(&descriptor, Some(1024), &pov)); + + let validation_result = WasmValidationResult { + head_data: HeadData(vec![1, 1, 1]), + new_validation_code: Some(vec![2, 2, 2].into()), + upward_messages: Vec::new(), + processed_downward_messages: 0, + }; + + assert!(check_wasm_result_against_constraints( + &omitted_validation.global_validation, + &omitted_validation.local_validation, + &validation_result, + )); + + let v = validate_candidate_exhaustive::( + MockValidationArg { result: Err(wasm_executor::Error::BadReturn) }, + omitted_validation.clone(), + vec![1, 2, 3].into(), + descriptor, + Arc::new(pov), + TaskExecutor::new(), + ).unwrap(); + + assert_matches!(v, ValidationResult::Invalid); + } + + + #[test] + fn candidate_validation_timeout_is_internal_error() { + let mut omitted_validation = OmittedValidationData { + local_validation: Default::default(), + global_validation: Default::default(), + }; + + omitted_validation.global_validation.max_head_data_size = 1024; + omitted_validation.global_validation.max_code_size = 1024; + + let pov = PoV { block_data: BlockData(vec![1; 32]) }; + + let mut descriptor = CandidateDescriptor::default(); + descriptor.pov_hash = pov.hash(); + collator_sign(&mut descriptor, Sr25519Keyring::Alice); + + assert!(passes_basic_checks(&descriptor, Some(1024), &pov)); + + let validation_result = WasmValidationResult { + head_data: HeadData(vec![1, 1, 1]), + new_validation_code: Some(vec![2, 2, 2].into()), + upward_messages: Vec::new(), + processed_downward_messages: 0, + }; + + assert!(check_wasm_result_against_constraints( + &omitted_validation.global_validation, + &omitted_validation.local_validation, + &validation_result, + )); + + let v = validate_candidate_exhaustive::( + MockValidationArg { result: Err(wasm_executor::Error::Timeout) }, + omitted_validation.clone(), + vec![1, 2, 3].into(), + descriptor, + Arc::new(pov), + TaskExecutor::new(), + ); + + assert_matches!(v, Err(ValidationFailed)); + } +} diff --git a/node/subsystem/src/messages.rs b/node/subsystem/src/messages.rs index c049b9d199..3cd06863d4 100644 --- a/node/subsystem/src/messages.rs +++ b/node/subsystem/src/messages.rs @@ -105,7 +105,9 @@ pub enum CandidateValidationMessage { /// This will implicitly attempt to gather the `OmittedValidationData` and `ValidationCode` /// from the runtime API of the chain, based on the `relay_parent` /// of the `CandidateDescriptor`. - /// If there is no state available which can provide this data, an error is returned. + /// + /// If there is no state available which can provide this data or the core for + /// the para is not free at the relay-parent, an error is returned. ValidateFromChainState( CandidateDescriptor, Arc, diff --git a/roadmap/implementers-guide/src/node/utility/candidate-validation.md b/roadmap/implementers-guide/src/node/utility/candidate-validation.md index ffeaa7a37e..36c89b7d2a 100644 --- a/roadmap/implementers-guide/src/node/utility/candidate-validation.md +++ b/roadmap/implementers-guide/src/node/utility/candidate-validation.md @@ -12,12 +12,38 @@ Output: Validation result via the provided response side-channel. ## Functionality -Given the hashes of a relay parent and a parachain candidate block, and either its PoV or the information with which to retrieve the PoV from the network, spawn a short-lived async job to determine whether the candidate is valid. +This subsystem answers two types of requests: one which draws out validation data from the state, and another which accepts all validation data exhaustively. The goal of both request types is to validate a candidate. There are three possible outputs of validation: either the candidate is valid, the candidate is invalid, or an internal error occurred. Whatever the end result is, it will be returned on the response channel to the requestor. -Each job follows this process: +Parachain candidates are validated against their validation function: A piece of Wasm code that is describes the state-transition of the parachain. Validation function execution is not metered. This means that an execution which is an infinite loop or simply takes too long must be forcibly exited by some other means. For this reason, we recommend dispatching candidate validation to be done on subprocesses which can be killed if they time-out. -- Get the full candidate from the current relay chain state -- Check the candidate's proof - > TODO: that's extremely hand-wavey. What does that actually entail? -- Generate either `Statement::Valid` or `Statement::Invalid`. Note that this never generates `Statement::Seconded`; Candidate Backing is the only subsystem which upgrades valid to seconded. -- Return the statement on the provided channel. +Upon receiving a validation request, the first thing the candidate validation subsystem should do is make sure it has all the necessary parameters to the validation function. These are: + * The Validation Function itself. + * The [`CandidateDescriptor`](../../types/candidate.md#candidatedescriptor). + * The [`LocalValidationData`](../../types/candidate.md#localvalidationdata). + * The [`GlobalValidationSchedule](../../types/candidate.md#globalvalidationschedule). + * The [`PoV`](../../types/availability.md#proofofvalidity). + +### Determining Parameters + +For a [`CandidateValidationMessage`][CVM]`::ValidateFromExhaustive`, these parameters are exhaustively provided. The [`OmittedValidationData`](../../types/availability.md#omittedvalidationdata) can be deconstructed into the validation data. + +For a [`CandidateValidationMessage`][CVM]`::ValidateFromChainState`, some more work needs to be done. Due to the uncertainty of Availability Cores (implemented in the [`Scheduler`](../../runtime/scheduler.md) module of the runtime), a candidate at a particular relay-parent and for a particular para may have two different valid validation-data to be executed under depending on what is assumed to happen if the para is occupying a core at the onset of the new block. This is encoded as an `OccupiedCoreAssumption` in the runtime API. + +The way that we can determine which assumption the candidate is meant to be executed under is simply to do an exhaustive check of both possibilities based on the state of the relay-parent. First we fetch the validation data under the assumption that the block occupying becomes available. If the `validation_data_hash` of the `CandidateDescriptor` matches this validation data, we use that. Otherwise, if the `validation_data_hash` matches the validation data fetched under the `TimedOut` assumption, we use that. Otherwise, we return a `ValidationResult::Invalid` response and conclude. + +Then, we can fetch the validation code from the runtime based on which type of candidate this is. This gives us all the parameters. The descriptor and PoV come from the request itself, and the other parameters have been derived from the state. + +> TODO: This would be a great place for caching to avoid making lots of runtime requests. That would need a job, though. + +### Execution of the Parachain Wasm + +Once we have all parameters, we can spin up a background task to perform the validation in a way that doesn't hold up the entire event loop. Before invoking the validation function itself, this should first do some basic checks: + * The collator signature is valid + * The PoV provided matches the `pov_hash` field of the descriptor + +After that, we can invoke the validation function. Lastly, we do some final checks on the output: + * The produced head-data is no larger than the maximum allowed. + * The produced code upgrade, if any, is no larger than the maximum allowed, and a code upgrade was allowed to be signaled. + * The amount and size of produced upward messages is not too large. + +[CVM]: ../../types/overseer-protocol.md#validationrequesttype diff --git a/roadmap/implementers-guide/src/types/overseer-protocol.md b/roadmap/implementers-guide/src/types/overseer-protocol.md index 41ae58bdc6..c3e0e9c230 100644 --- a/roadmap/implementers-guide/src/types/overseer-protocol.md +++ b/roadmap/implementers-guide/src/types/overseer-protocol.md @@ -324,7 +324,9 @@ enum CandidateValidationMessage { /// Validate a candidate with provided parameters. This will implicitly attempt to gather the /// `OmittedValidationData` and `ValidationCode` from the runtime API of the chain, /// based on the `relay_parent` of the `CandidateDescriptor`. - /// If there is no state available which can provide this data, an error is returned. + /// + /// If there is no state available which can provide this data or the core for + /// the para is not free at the relay-parent, an error is returned. ValidateFromChainState(CandidateDescriptor, PoV, ResponseChannel>), /// Validate a candidate with provided parameters. Explicitly provide the `OmittedValidationData` -- GitLab From 75acb330b743e428aaf74d3608421b48d2b13af1 Mon Sep 17 00:00:00 2001 From: s3krit Date: Fri, 31 Jul 2020 14:34:45 +0200 Subject: [PATCH 125/192] [CI] Build wasm blob with srtool and include prop hashes and blobs in release notes (#1506) * initial build-wasms commit * fix wasm builds * add caching and artifact upload * test for git dir * Revert "test for git dir" This reverts commit 295e4655484691aed9162f479a87f09c1b1c9317. * fix git version incompability * attempt to fix caching * Revert "fix git version incompability" This reverts commit 1d22ffd26b7eff635c5abcc9bd04cb3c88629a1d. * add kusama job * use a build matrix for building runtimes * combine build-wasms and publish draft release * attempt to name runtimes according to version * Revert "attempt to name runtimes according to version" This reverts commit 82f7b4dc0aea995f2599293bba9f11b879f459e5. Failed experiment * name runtimes according to version #2 * fix asset path and name * build wasms first, include prop hash --- .github/workflows/publish-draft-release.yml | 86 +++++++++++++++++++-- scripts/github/generate_release_text.rb | 29 ++++--- scripts/github/lib.rb | 12 +++ scripts/github/polkadot_release.erb | 6 ++ 4 files changed, 118 insertions(+), 15 deletions(-) create mode 100644 scripts/github/lib.rb diff --git a/.github/workflows/publish-draft-release.yml b/.github/workflows/publish-draft-release.yml index c7cc8d441b..6922c238b5 100644 --- a/.github/workflows/publish-draft-release.yml +++ b/.github/workflows/publish-draft-release.yml @@ -6,6 +6,51 @@ on: - v**.**.** jobs: + build-runtimes: + runs-on: ubuntu-latest + strategy: + matrix: + runtime: ['polkadot', 'kusama'] + container: + image: chevdor/srtool:nightly-2020-07-20 + volumes: + - ${{ github.workspace }}:/build + env: + PACKAGE: ${{ matrix.runtime }}-runtime + RUSTC_VERSION: nightly-2020-07-20 + steps: + - uses: actions/checkout@v2 + - name: Cache target dir + uses: actions/cache@v2 + with: + path: '${{ github.workspace }}/target' + key: srtool-target-${{ matrix.runtime }}-${{ github.sha }} + restore-keys: | + srtool-target-${{ matrix.runtime }}- + srtool-target- + - name: Build ${{ matrix.runtime }} runtime + id: build-runtime + shell: bash + run: | + cd /build + pwd + ls -la + build --json | tee srtool_output.json + cat srtool_output.json + while IFS= read -r line; do + echo "::set-output name=$line::$(jq -r ".$line" < srtool_output.json)" + done <<< "$(jq -r 'keys[]' < srtool_output.json)" + - name: Upload ${{ matrix.runtime }} srtool json + uses: actions/upload-artifact@v2 + with: + name: ${{ matrix.runtime }}-srtool-json + path: srtool_output.json + - name: Upload ${{ matrix.runtime }} runtime + uses: actions/upload-artifact@v2 + with: + name: ${{ matrix.runtime }}-runtime + path: "${{ steps.build-runtime.outputs.wasm }}" + get-rust-versions: runs-on: ubuntu-latest container: @@ -21,9 +66,10 @@ jobs: publish-draft-release: runs-on: ubuntu-latest - needs: get-rust-versions + needs: ['get-rust-versions', 'build-runtimes'] outputs: release_url: ${{ steps.create-release.outputs.html_url }} + asset_upload_url: ${{ steps.create-release.outputs.upload_url }} steps: - uses: actions/checkout@v2 with: @@ -33,17 +79,15 @@ jobs: uses: actions/setup-ruby@v1 with: ruby-version: 2.7 + - name: Download srtool json output + uses: actions/download-artifact@v2 - name: Generate release text env: RUSTC_STABLE: ${{ needs.get-rust-versions.outputs.rustc-stable }} RUSTC_NIGHTLY: ${{ needs.get-rust-versions.outputs.rustc-nightly }} run: | gem install changelogerator git toml - ruby $GITHUB_WORKSPACE/polkadot/scripts/github/generate_release_text.rb > release_text.md - - uses: actions/upload-artifact@v2 - with: - name: release_text - path: release_text.md + ruby $GITHUB_WORKSPACE/polkadot/scripts/github/generate_release_text.rb | tee release_text.md - name: Create draft release id: create-release uses: actions/create-release@v1 @@ -66,3 +110,33 @@ jobs: access_token: ${{ secrets.MATRIX_ACCESS_TOKEN }} message: "**New version of polkadot tagged**: ${{ github.ref }}
Gav: Draft release created: ${{ needs.publish-draft-release.outputs.release_url }}" server: "matrix.parity.io" + + publish-runtimes: + runs-on: ubuntu-latest + needs: ['publish-draft-release'] + strategy: + matrix: + runtime: ['polkadot', 'kusama'] + steps: + - uses: actions/checkout@v2 + - uses: actions/download-artifact@v2 + with: + name: ${{ matrix.runtime }}-runtime + - name: Set up Ruby 2.7 + uses: actions/setup-ruby@v1 + with: + ruby-version: 2.7 + - name: Get runtime version + id: get-runtime-ver + run: | + runtime_ver="$(ruby -e 'require "./scripts/github/lib.rb"; puts get_runtime("${{ matrix.runtime }}")')" + echo "::set-output name=runtime_ver::$runtime_ver" + - name: Upload ${{ matrix.runtime }} wasm + uses: actions/upload-release-asset@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + upload_url: ${{ needs.publish-draft-release.outputs.asset_upload_url }} + asset_path: ./${{ matrix.runtime }}_runtime.compact.wasm + asset_name: ${{ matrix.runtime }}_runtime-v${{ steps.get-runtime-ver.outputs.runtime_ver }}.compact.wasm + asset_content_type: application/wasm diff --git a/scripts/github/generate_release_text.rb b/scripts/github/generate_release_text.rb index ad06a5f794..bb08f0820b 100644 --- a/scripts/github/generate_release_text.rb +++ b/scripts/github/generate_release_text.rb @@ -4,6 +4,8 @@ require 'changelogerator' require 'git' require 'erb' require 'toml' +require 'json' +require_relative './lib.rb' version = ENV['GITHUB_REF'] token = ENV['GITHUB_TOKEN'] @@ -61,14 +63,23 @@ release_priority = Changelog.highest_priority_for_changes(all_changes) rustc_stable = ENV['RUSTC_STABLE'] rustc_nightly = ENV['RUSTC_NIGHTLY'] -polkadot_runtime = File.open(polkadot_path + '/runtime/polkadot/src/lib.rs') do |f| - f.find { |l| l =~ /spec_version/ }.match(/[0-9]+/)[0] -end -kusama_runtime = File.open(polkadot_path + '/runtime/kusama/src/lib.rs') do |f| - f.find { |l| l =~ /spec_version/ }.match(/[0-9]+/)[0] -end -westend_runtime = File.open(polkadot_path + '/runtime/westend/src/lib.rs') do |f| - f.find { |l| l =~ /spec_version/ }.match(/[0-9]+/)[0] -end +polkadot_runtime = get_runtime('polkadot', polkadot_path) +kusama_runtime = get_runtime('kusama', polkadot_path) +westend_runtime = get_runtime('westend', polkadot_path) + +# These json files should have been downloaded as part of the build-runtimes +# github action + +polkadot_json = JSON.parse( + File.read( + ENV['GITHUB_WORKSPACE'] + '/polkadot-srtool-json/srtool_output.json' + ) +) + +kusama_json = JSON.parse( + File.read( + ENV['GITHUB_WORKSPACE'] + '/kusama-srtool-json/srtool_output.json' + ) +) puts renderer.result diff --git a/scripts/github/lib.rb b/scripts/github/lib.rb new file mode 100644 index 0000000000..35ebd3b6e7 --- /dev/null +++ b/scripts/github/lib.rb @@ -0,0 +1,12 @@ +# frozen_string_literal: true + +# A collection of helper functions that might be useful for various scripts + +# Gets the runtime version for a given runtime. +# Optionally accepts a path that is the root of the project which defaults to +# the current working directory +def get_runtime(runtime, path = '.') + File.open(path + "/runtime/#{runtime}/src/lib.rs") do |f| + f.find { |l| l =~ /spec_version/ }.match(/[0-9]+/)[0] + end +end diff --git a/scripts/github/polkadot_release.erb b/scripts/github/polkadot_release.erb index f9c76d582a..dde7165e92 100644 --- a/scripts/github/polkadot_release.erb +++ b/scripts/github/polkadot_release.erb @@ -11,6 +11,12 @@ This release was tested against the following versions of `rustc`. Other version - <%= rustc_stable %> - <%= rustc_nightly %> +WASM runtimes built with [srtool](https://gitlab.com/chevdor/srtool) using `<%= polkadot_json['rustc'] %>`. + +Proposal hashes: +* `polkadot_runtime-v<%= polkadot_runtime %>.compact.wasm - <%= polkadot_json['prop'] %>` +* `kusama_runtime-v<%= kusama_runtime %>.compact.wasm - <%= kusama_json['prop'] %>` + <% unless misc_changes.empty? %> ## Changes -- GitLab From caaed9a12a0181972384271906561500eb8f874b Mon Sep 17 00:00:00 2001 From: Andronik Ordian Date: Fri, 31 Jul 2020 16:28:45 +0200 Subject: [PATCH 126/192] Guide: add a diagram for Inclusion Pipeline & Approval Subsystem (#1457) * guide: optimize diagrams for readability * guide: inclusion subsystem diagram * guide: rename Approval Subsystem for clarity * guide: correct the approval subsystem * guide: clarify that validator are selected from the same set * guide: simplify secondary checkers labels --- .../src/parachains-overview.md | 147 ++++++++++++++++-- 1 file changed, 130 insertions(+), 17 deletions(-) diff --git a/roadmap/implementers-guide/src/parachains-overview.md b/roadmap/implementers-guide/src/parachains-overview.md index 8eff666225..23a8e83cf2 100644 --- a/roadmap/implementers-guide/src/parachains-overview.md +++ b/roadmap/implementers-guide/src/parachains-overview.md @@ -56,19 +56,109 @@ Reiterating the lifecycle of a candidate: 1. Included: Backed and considered available. 1. Accepted: Backed, available, and undisputed -> TODO Diagram: Inclusion Pipeline & Approval Subsystems interaction +```dot process Inclusion Pipeline +digraph { + subgraph cluster_vg { + label=< + Parachain Validators +
+ (subset of all) + > + labeljust=l + style=filled + color=lightgrey + node [style=filled color=white] + + v1 [label="Validator 1"] + v2 [label="Validator 2"] + v3 [label="Validator 3"] + + b [label="(3) Backable", shape=box] + + v1 -> v2 [label="(2) Seconded"] + v1 -> v3 [label="(2) Seconded"] + + v2 -> b [style=dashed arrowhead=none] + v3 -> b [style=dashed arrowhead=none] + v1 -> b [style=dashed arrowhead=none] + } + + v4 [label=< + Validator 4 (relay chain) +
+ + (selected by BABE) + + >] + + col [label="Collator"] + pa [label="(5) Relay Block (Pending Availability)", shape=box] + pb [label="Parablock", shape=box] + rc [label="Relay Chain Validators"] + + subgraph cluster_approval { + label=< + Secondary Checkers +
+ (subset of all) + > + labeljust=l + style=filled + color=lightgrey + node [style=filled color=white] + + a5 [label="Validator 5"] + a6 [label="Validator 6"] + a7 [label="Validator 7"] + } + + b -> v4 [label="(4) Backed"] + col -> v1 [label="(1) Candidate"] + v4 -> pa + pa -> pb [label="(6) a few blocks later..." arrowhead=none] + pb -> a5 + pb -> a6 + pb -> a7 + + a5 -> rc [label="(7) Approved"] + a6 -> rc [label="(7) Approved"] + a7 -> rc [label="(7) Approved"] +} +``` + +The diagram above shows the happy path of a block from (1) Candidate to the (7) Approved state. It is also important to take note of the fact that the relay-chain is extended by BABE, which is a forkful algorithm. That means that different block authors can be chosen at the same time, and may not be building on the same block parent. Furthermore, the set of validators is not fixed, nor is the set of parachains. And even with the same set of validators and parachains, the validators' assignments to parachains is flexible. This means that the architecture proposed in the next chapters must deal with the variability and multiplicity of the network state. ```dot process digraph { - rca [label = "Relay Block A" shape=rectangle] - rcb [label = "Relay Block B" shape=rectangle] - rcc [label = "Relay Block C" shape=rectangle] - - vg1 [label =<Validator Group 1

(Validator 4)
(Validator 1) (Validator 2)
(Validator 5)
>] - vg2 [label =<Validator Group 2

(Validator 7)
(Validator 3) (Validator 6)
>] + rca [label="Relay Block A" shape=box] + rcb [label="Relay Block B" shape=box] + rcc [label="Relay Block C" shape=box] + + vg1 [label=< + Validator Group 1 +
+
+ + (Validator 4) +
+ (Validator 1) (Validator 2) +
+ (Validator 5) +
+ >] + vg2 [label=< + Validator Group 2 +
+
+ + (Validator 7) +
+ (Validator 3) (Validator 6) +
+ >] rcb -> rca rcc -> rcb @@ -82,23 +172,46 @@ In this example, group 1 has received block C while the others have not due to n ```dot process digraph { - rca [label = "Relay Block A" shape=rectangle] - rcb [label = "Relay Block B" shape=rectangle] - rcc [label = "Relay Block C" shape=rectangle] - rcc_prime [label = "Relay Block C'" shape=rectangle] - - vg1 [label =<Validator Group 1

(Validator 4) (Validator 1)>] - vg2 [label =<Validator Group 2

(Validator 7) (Validator 6)>] - vg3 [label =<Validator Group 3

(Validator 2) (Validator 3)
(Validator 5)
>] + rca [label="Relay Block A" shape=box] + rcb [label="Relay Block B" shape=box] + rcc [label="Relay Block C" shape=box] + rcc_prime [label="Relay Block C'" shape=box] + + vg1 [label=< + Validator Group 1 +
+
+ + (Validator 4) (Validator 1) + + >] + vg2 [label=< + Validator Group 2 +
+
+ + (Validator 7) (Validator 6) + + >] + vg3 [label=< + Validator Group 3 +
+
+ + (Validator 2) (Validator 3) +
+ (Validator 5) +
+ >] rcb -> rca rcc -> rcb rcc_prime -> rcb - vg1 -> rcc [style=dashed arrowhead=none] + vg1 -> rcc [style=dashed arrowhead=none] vg2 -> rcc_prime [style=dashed arrowhead=none] vg3 -> rcc_prime [style=dashed arrowhead=none] - vg3 -> rcc [style=dashed arrowhead=none] + vg3 -> rcc [style=dashed arrowhead=none] } ``` -- GitLab From 0bcb6f9d43917434725e1e06064b50f3e65ebb6a Mon Sep 17 00:00:00 2001 From: Robert Habermeier Date: Fri, 31 Jul 2020 11:07:31 -0400 Subject: [PATCH 127/192] guide: collator networking & subsystems (#1452) * Do a small write-up on collation-generation * preamble to collator protocol * notes on protocol * collation-generation: point to collator protocol * fix missing bracket * expand on collator protocol wire protocol * add a couple more sentences * expand on requests some more * go higher level * network bridge: note peerset * note peer-set = validation for protocols * add `ConnectToValidators` message * use ConnectToValidators in collator protocol * typo * remove references to sentry nodes --- roadmap/implementers-guide/src/SUMMARY.md | 2 +- .../availability/availability-distribution.md | 2 +- .../availability/bitfield-distribution.md | 2 +- .../src/node/backing/pov-distribution.md | 4 +- .../node/backing/statement-distribution.md | 2 +- .../node/collators/collation-distribution.md | 9 -- .../node/collators/collation-generation.md | 31 +++- .../src/node/collators/collator-protocol.md | 133 ++++++++++++++++++ .../src/node/utility/network-bridge.md | 18 ++- .../src/parachains-overview.md | 2 +- .../src/types/overseer-protocol.md | 46 +++++- 11 files changed, 228 insertions(+), 23 deletions(-) delete mode 100644 roadmap/implementers-guide/src/node/collators/collation-distribution.md create mode 100644 roadmap/implementers-guide/src/node/collators/collator-protocol.md diff --git a/roadmap/implementers-guide/src/SUMMARY.md b/roadmap/implementers-guide/src/SUMMARY.md index 0a7fa21d2a..86ddabe45b 100644 --- a/roadmap/implementers-guide/src/SUMMARY.md +++ b/roadmap/implementers-guide/src/SUMMARY.md @@ -29,7 +29,7 @@ - [Bitfield Signing](node/availability/bitfield-signing.md) - [Collators](node/collators/README.md) - [Collation Generation](node/collators/collation-generation.md) - - [Collation Distribution](node/collators/collation-distribution.md) + - [Collator Protocol](node/collators/collator-protocol.md) - [Validity](node/validity/README.md) - [Utility Subsystems](node/utility/README.md) - [Availability Store](node/utility/availability-store.md) diff --git a/roadmap/implementers-guide/src/node/availability/availability-distribution.md b/roadmap/implementers-guide/src/node/availability/availability-distribution.md index 008f3e91fb..3c530bde84 100644 --- a/roadmap/implementers-guide/src/node/availability/availability-distribution.md +++ b/roadmap/implementers-guide/src/node/availability/availability-distribution.md @@ -6,7 +6,7 @@ After a candidate is backed, the availability of the PoV block must be confirmed ## Protocol -`ProtocolId`:`b"avad"` +`ProtocolId`:`b"avad"`: `PeerSet`: `Validation` Input: diff --git a/roadmap/implementers-guide/src/node/availability/bitfield-distribution.md b/roadmap/implementers-guide/src/node/availability/bitfield-distribution.md index 528b5f9d1d..faf1985c92 100644 --- a/roadmap/implementers-guide/src/node/availability/bitfield-distribution.md +++ b/roadmap/implementers-guide/src/node/availability/bitfield-distribution.md @@ -4,7 +4,7 @@ Validators vote on the availability of a backed candidate by issuing signed bitf ## Protocol -`ProtocolId`: `b"bitd"` +`ProtocolId`: `b"bitd"`: `PeerSet`: `Validation` Input: [`BitfieldDistributionMessage`](../../types/overseer-protocol.md#bitfield-distribution-message) which are gossiped to all peers, no matter if validator or not. diff --git a/roadmap/implementers-guide/src/node/backing/pov-distribution.md b/roadmap/implementers-guide/src/node/backing/pov-distribution.md index 4215386d26..486ba96fcc 100644 --- a/roadmap/implementers-guide/src/node/backing/pov-distribution.md +++ b/roadmap/implementers-guide/src/node/backing/pov-distribution.md @@ -4,7 +4,7 @@ This subsystem is responsible for distributing PoV blocks. For now, unified with ## Protocol -`ProtocolId`: `b"povd"` +`ProtocolId`: `b"povd"`, `PeerSet`: `Validation` Input: [`PoVDistributionMessage`](../../types/overseer-protocol.md#pov-distribution-message) @@ -18,7 +18,7 @@ Output: ## Functionality -This network protocol is responsible for distributing [`PoV`s](../../types/availability.md#proof-of-validity) by gossip. Since PoVs are heavy in practice, gossip is far from the most efficient way to distribute them. In the future, this should be replaced by a better network protocol that finds validators who have validated the block and connects to them directly. This protocol is descrbied +This network protocol is responsible for distributing [`PoV`s](../../types/availability.md#proof-of-validity) by gossip. Since PoVs are heavy in practice, gossip is far from the most efficient way to distribute them. In the future, this should be replaced by a better network protocol that finds validators who have validated the block and connects to them directly. This protocol is descrbied. This protocol is described in terms of "us" and our peers, with the understanding that this is the procedure that any honest node will run. It has the following goals: - We never have to buffer an unbounded amount of data diff --git a/roadmap/implementers-guide/src/node/backing/statement-distribution.md b/roadmap/implementers-guide/src/node/backing/statement-distribution.md index d05c68f7af..b9a8914a99 100644 --- a/roadmap/implementers-guide/src/node/backing/statement-distribution.md +++ b/roadmap/implementers-guide/src/node/backing/statement-distribution.md @@ -4,7 +4,7 @@ The Statement Distribution Subsystem is responsible for distributing statements ## Protocol -`ProtocolId`: `b"stmd"` +`ProtocolId`: `b"stmd"`, `PeerSet`: `Validation` Input: diff --git a/roadmap/implementers-guide/src/node/collators/collation-distribution.md b/roadmap/implementers-guide/src/node/collators/collation-distribution.md deleted file mode 100644 index 0b24ce47ca..0000000000 --- a/roadmap/implementers-guide/src/node/collators/collation-distribution.md +++ /dev/null @@ -1,9 +0,0 @@ -# Collation Distribution - -> TODO - -## Protocol - -## Functionality - -## Jobs, if any diff --git a/roadmap/implementers-guide/src/node/collators/collation-generation.md b/roadmap/implementers-guide/src/node/collators/collation-generation.md index 1c828b3b0f..a182fbadd3 100644 --- a/roadmap/implementers-guide/src/node/collators/collation-generation.md +++ b/roadmap/implementers-guide/src/node/collators/collation-generation.md @@ -1,9 +1,36 @@ # Collation Generation -> TODO +The collation generation subsystem is executed on collator nodes and produces candidates to be distributed to validators. If configured to produce collations for a para, it produces collations and then feeds them to the [Collator Protocol][CP] subsystem, which handles the networking. ## Protocol +Input: None + +Output: CollationDistributionMessage + ## Functionality -## Jobs, if any +The process of generating a collation for a parachain is very parachain-specific. As such, the details of how to do so are left beyond the scope of this description. The subsystem should be implemented as an abstract wrapper, which is aware of this configuration: + +```rust +struct CollationGenerationConfig { + key: CollatorPair, + collation_producer: Fn(params) -> async (HeadData, Vec, PoV), +} +``` + +The configuration should be optional, to allow for the case where the node is not run with the capability to collate. + +On `ActiveLeavesUpdate`: + * If there is no collation generation config, ignore. + * Otherwise, for each `activated` head in the update: + * Determine if the para is scheduled or is next up on any occupied core by fetching the `availability_cores` Runtime API. + * Determine an occupied core assumption to make about the para. The simplest thing to do is to always assume that if the para occupies a core, that the candidate will become available. Further on, this might be determined based on bitfields seen or validator requests. + * Use the Runtime API subsystem to fetch the global validation data and local validation data. + * Construct validation function params based on validation data. + * Invoke the `collation_producer`. + * Construct a `CommittedCandidateReceipt` using the outputs of the `collation_producer` and signing with the `key`. + * Dispatch a [`CollatorProtocolMessage`][CPM]`::DistributeCollation(receipt, pov)`. + +[CP]: collator-protocol.md +[CPM]: ../../types/overseer-protocol.md#collatorprotocolmessage diff --git a/roadmap/implementers-guide/src/node/collators/collator-protocol.md b/roadmap/implementers-guide/src/node/collators/collator-protocol.md new file mode 100644 index 0000000000..526aab31ae --- /dev/null +++ b/roadmap/implementers-guide/src/node/collators/collator-protocol.md @@ -0,0 +1,133 @@ +# Collator Protocol + +The Collator Protocol implements the network protocol by which collators and validators communicate. It is used by collators to distribute collations to validators and used by validators to accept collations by collators. + +Collator-to-Validator networking is more difficult than Validator-to-Validator networking because the set of possible collators for any given para is unbounded, unlike the validator set. Validator-to-Validator networking protocols can easily be implemented as gossip because the data can be bounded, and validators can authenticate each other by their `PeerId`s for the purposes of instantiating and accepting connections. + +Since, at least at the level of the para abstraction, the collator-set for any given para is unbounded, validators need to make sure that they are receiving connections from capable and honest collators and that their bandwidth and time are not being wasted by attackers. Communicating across this trust-boundary is the most difficult part of this subsystem. + +Validation of candidates is a heavy task, and furthermore, the [`PoV`][PoV] itself is a large piece of data. Empirically, `PoV`s are on the order of 10MB. + +> TODO: note the incremental validation function Ximin proposes at https://github.com/paritytech/polkadot/issues/1348 + +As this network protocol serves as a bridge between collators and validators, it communicates primarily with one subsystem on behalf of each. As a collator, this will receive messages from the [`CollationGeneration`][CG] subsystem. As a validator, this will communicate with the [`CandidateBacking`][CB] subsystem. + +## Protocol + +Input: [`CollatorProtocolMessage`][CPM] + +Output: + - [`RuntimeApiMessage`][RAM] + - [`NetworkBridgeMessage`][NBM] + +## Functionality + +This network protocol uses the `Collation` peer-set of the [`NetworkBridge`][NB]. + +```rust +type RequestId = u64; + +enum WireMessage { + /// Declare the intent to advertise collations under a collator ID. + Declare(CollatorId), + /// Advertise a collation to a validator. Can only be sent once the peer has declared + /// that they are a collator with given ID. + AdvertiseCollation(Hash, ParaId), + /// Request the advertised collation at that relay-parent. + RequestCollation(RequestId, Hash, ParaId), + /// A requested collation. + Collation(RequestId, CandidateReceipt, PoV), +} +``` + +Since this protocol functions both for validators and collators, it is easiest to go through the protocol actions for each of them separately. + +Validators and collators. +```dot process +digraph { + c1 [shape=MSquare, label="Collator 1"]; + c2 [shape=MSquare, label="Collator 2"]; + + v1 [shape=MSquare, label="Validator 1"]; + v2 [shape=MSquare, label="Validator 2"]; + + c1 -> v1; + c1 -> v2; + c2 -> v2; +} +``` + +### Collators + +It is assumed that collators are only collating on a single parachain. Collations are generated by the [Collation Generation][CG] subsystem. We will keep up to one local collation per relay-parent, based on `DistributeCollation` messages. If the para is not scheduled or next up on any core, at the relay-parent, or the relay-parent isn't in the active-leaves set, we ignore the message as it must be invalid in that case - although this indicates a logic error elsewhere in the node. + +We keep track of the Para ID we are collating on as a collator. This starts as `None`, and is updated with each `CollateOn` message received. If the `ParaId` of a collation requested to be distributed does not match the one we expect, we ignore the message. + +As with most other subsystems, we track the active leaves set by following `ActiveLeavesUpdate` signals. + +For the purposes of actually distributing a collation, we need to be connected to the validators who are interested in collations on that `ParaId` at this point in time. We assume that there is a discovery API for connecting to a set of validators. + +> TODO: design & expose the discovery API not just for connecting to such peers but also to determine which of our current peers are validators. + +As seen in the [Scheduler Module][SCH] of the runtime, validator groups are fixed for an entire session and their rotations across cores are predictable. Collators will want to do these things when attempting to distribute collations at a given relay-parent: + * Determine which core the para collated-on is assigned to. + * Determine the group on that core and the next group on that core. + * Issue a discovery request for the validators of the current group and the next group with[`NetworkBridgeMessage`][NBM]`::ConnectToValidators`. + +Once connected to the relevant peers for the current group assigned to the core (transitively, the para), advertise the collation to any of them which advertise the relay-parent in their view (as provided by the [Network Bridge][NB]). If any respond with a request for the full collation, provide it. Upon receiving a view update from any of these peers which includes a relay-parent for which we have a collation that they will find relevant, advertise the collation to them if we haven't already. + +### Validators + +On the validator side of the protocol, validators need to accept incoming connections from collators. They should keep some peer slots open for accepting new speculative connections from collators and should disconnect from collators who are not relevant. + +```dot process +digraph G { + label = "Declaring, advertising, and providing collations"; + labelloc = "t"; + rankdir = LR; + + subgraph cluster_collator { + rank = min; + label = "Collator"; + graph[style = border, rank = min]; + + c1, c2 [label = ""]; + } + + subgraph cluster_validator { + rank = same; + label = "Validator"; + graph[style = border]; + + v1, v2 [label = ""]; + } + + c1 -> v1 [label = "Declare and advertise"]; + + v1 -> c2 [label = "Request"]; + + c2 -> v2 [label = "Provide"]; + + v2 -> v2 [label = "Note Good/Bad"]; +} +``` + +When peers connect to us, they can `Declare` that they represent a collator with given public key. Once they've declared that, they can begin to send advertisements of collations. The peers should not send us any advertisements for collations that are on a relay-parent outside of our view. + +The protocol tracks advertisements received and the source of the advertisement. The advertisement source is the `PeerId` of the peer who sent the message. We accept one advertisement per collator per source per relay-parent. + +As a validator, we will handle requests from other subsystems to fetch a collation on a specific `ParaId` and relay-parent. These requests are made with the [`CollatorProtocolMessage`][CPM]`::FetchCollation`. To do so, we need to first check if we have already gathered a collation on that `ParaId` and relay-parent. If not, we need to select one of the advertisements and issue a request for it. If we've already issued a request, we shouldn't issue another one until the first has returned. + +When acting on an advertisement, we issue a `WireMessage::RequestCollation`. If the request times out, we need to note the collator as being unreliable and reduce its priority relative to other collators. And then make another request - repeat until we get a response or the chain has moved on. + +As a validator, once the collation has been fetched some other subsystem will inspect and do deeper validation of the collation. The subsystem will report to this subsystem with a [`CollatorProtocolMessage`][CPM]`::ReportCollator` or `NoteGoodCollation` message. In that case, if we are connected directly to the collator, we apply a cost to the `PeerId` associated with the collator and potentially disconnect or blacklist it. + +[PoV]: ../../types/availability.md#proofofvalidity +[CPM]: ../../types/overseer-protocol.md#collatorprotocolmessage +[CG]: collation-generation.md +[CB]: ../backing/candidate-backing.md +[NB]: ../utility/network-bridge.md +[CBM]: ../../types/overseer-protocol.md#candidatebackingmesage +[RAM]: ../../types/overseer-protocol.md#runtimeapimessage +[NBM]: ../../types/overseer-protocol.md#networkbridgemessage +[SCH]: ../../runtime/scheduler.md diff --git a/roadmap/implementers-guide/src/node/utility/network-bridge.md b/roadmap/implementers-guide/src/node/utility/network-bridge.md index 09c7e081a6..bd4a6a3d75 100644 --- a/roadmap/implementers-guide/src/node/utility/network-bridge.md +++ b/roadmap/implementers-guide/src/node/utility/network-bridge.md @@ -8,19 +8,24 @@ One other piece of shared state to track is peer reputation. When peers are foun So in short, this Subsystem acts as a bridge between an actual network component and a subsystem's protocol. +The other component of the network bridge is which peer-set to use. Different peer-sets can be connected for different purposes. The network bridge is not generic over peer-set, but instead exposes two peer-sets that event producers can attach to: `Validation` and `Collation`. More information can be found on the documentation of the [`NetworkBridgeMessage`][NBM]. + ## Protocol -Input: [`NetworkBridgeMessage`](../../types/overseer-protocol.md#network-bridge-message) +Input: [`NetworkBridgeMessage`][NBM] Output: Varying, based on registered event producers. ## Functionality -Track a set of all Event Producers, each associated with a 4-byte protocol ID. +Track a set of all Event Producers, each associated with a 4-byte protocol ID and the `PeerSet` it is associated on. + There are two types of network messages this sends and receives: - ProtocolMessage(ProtocolId, Bytes) - ViewUpdate(View) +Each of these network messages is associated with a particular peer-set. If we are connected to the same peer on both peer-sets, we will receive two `ViewUpdate`s from them every time they change their view. + `ActiveLeavesUpdate`'s `activated` and `deactivated` lists determine the evolution of our local view over time. A `ViewUpdate` is issued to each connected peer after each update, and a `NetworkBridgeUpdate::OurViewChange` is issued for each registered event producer. On `RegisterEventProducer`: @@ -44,3 +49,12 @@ On `ReportPeer` message: On `SendMessage` message: - Issue a corresponding `ProtocolMessage` to each listed peer with given protocol ID and bytes. + +[NBM]: ../../types/overseer-protocol.md#network-bridge-message + +On `ConnectToValidators` message: + +- Determine the DHT keys to use for each validator based on the relay-chain state and Runtime API. +- Recover the Peer IDs of the validators from the DHT. There may be more than one peer ID per validator. +- Accumulate all `(ValidatorId, PeerId)` pairs and send on the response channel. +- Feed all Peer IDs to the discovery utility the underlying network provides. diff --git a/roadmap/implementers-guide/src/parachains-overview.md b/roadmap/implementers-guide/src/parachains-overview.md index 23a8e83cf2..b8b39eee4f 100644 --- a/roadmap/implementers-guide/src/parachains-overview.md +++ b/roadmap/implementers-guide/src/parachains-overview.md @@ -18,7 +18,7 @@ Here is a description of the Inclusion Pipeline: the path a parachain block (or 1. Validators are selected and assigned to parachains by the Validator Assignment routine. 1. A collator produces the parachain block, which is known as a parachain candidate or candidate, along with a PoV for the candidate. -1. The collator forwards the candidate and PoV to validators assigned to the same parachain via the [Collation Distribution subsystem](node/collators/collation-distribution.md). +1. The collator forwards the candidate and PoV to validators assigned to the same parachain via the [Collator Protocol](node/collators/collator-protocol.md). 1. The validators assigned to a parachain at a given point in time participate in the [Candidate Backing subsystem](node/backing/candidate-backing.md) to validate candidates that were put forward for validation. Candidates which gather enough signed validity statements from validators are considered "backable". Their backing is the set of signed validity statements. 1. A relay-chain block author, selected by BABE, can note up to one (1) backable candidate for each parachain to include in the relay-chain block alongside its backing. A backable candidate once included in the relay-chain is considered backed in that fork of the relay-chain. 1. Once backed in the relay-chain, the parachain candidate is considered to be "pending availability". It is not considered to be included as part of the parachain until it is proven available. diff --git a/roadmap/implementers-guide/src/types/overseer-protocol.md b/roadmap/implementers-guide/src/types/overseer-protocol.md index c3e0e9c230..412ac5a1d6 100644 --- a/roadmap/implementers-guide/src/types/overseer-protocol.md +++ b/roadmap/implementers-guide/src/types/overseer-protocol.md @@ -126,20 +126,60 @@ enum CandidateSelectionMessage { } ``` +## Collator Protocol Message + +Messages received by the [Collator Protocol subsystem](../node/collators/collator-protocol.md) + +```rust +enum CollatorProtocolMessage { + /// Signal to the collator protocol that it should connect to validators with the expectation + /// of collating on the given para. This is only expected to be called once, early on, if at all, + /// and only by the Collation Generation subsystem. As such, it will overwrite the value of + /// the previous signal. + /// + /// This should be sent before any `DistributeCollation` message. + CollateOn(ParaId), + /// Provide a collation to distribute to validators. + DistributeCollation(CandidateReceipt, PoV), + /// Fetch a collation under the given relay-parent for the given ParaId. + FetchCollation(Hash, ParaId, ResponseChannel<(CandidateReceipt, PoV)>), + /// Report a collator as having provided an invalid collation. This should lead to disconnect + /// and blacklist of the collator. + ReportCollator(CollatorId), + /// Note a collator as having provided a good collation. + NoteGoodCollation(CollatorId), +} +``` + ## Network Bridge Message Messages received by the network bridge. This subsystem is invoked by others to manipulate access to the low-level networking code. ```rust +/// Peer-sets handled by the network bridge. +enum PeerSet { + /// The collation peer-set is used to distribute collations from collators to validators. + Collation, + /// The validation peer-set is used to distribute information relevant to parachain + /// validation among validators. This may include nodes which are not validators, + /// as some protocols on this peer-set are expected to be gossip. + Validation, +} + enum NetworkBridgeMessage { /// Register an event producer with the network bridge. This should be done early and cannot /// be de-registered. - RegisterEventProducer(ProtocolId, Fn(NetworkBridgeEvent) -> AllMessages), + RegisterEventProducer(PeerSet, ProtocolId, Fn(NetworkBridgeEvent) -> AllMessages), /// Report a cost or benefit of a peer. Negative values are costs, positive are benefits. - ReportPeer(PeerId, cost_benefit: i32), + ReportPeer(PeerSet, PeerId, cost_benefit: i32), /// Send a message to one or more peers on the given protocol ID. - SendMessage([PeerId], ProtocolId, Bytes), + SendMessage(PeerSet, [PeerId], ProtocolId, Bytes), + /// Connect to peers who represent the given `ValidatorId`s at the given relay-parent. + /// + /// Also accepts a response channel by which the issuer can learn the `PeerId`s of those + /// validators. + ConnectToValidators(PeerSet, [ValidatorId], ResponseChannel<[(ValidatorId, PeerId)]>>), } ``` -- GitLab From 473f204f60ce558d2f7975a9b96508478f597362 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Fri, 31 Jul 2020 17:19:30 +0200 Subject: [PATCH 128/192] Print error message when collation failed (#1514) --- collator/src/lib.rs | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/collator/src/lib.rs b/collator/src/lib.rs index 0b7419c29f..37a56afd9d 100644 --- a/collator/src/lib.rs +++ b/collator/src/lib.rs @@ -51,7 +51,6 @@ use std::time::Duration; use std::pin::Pin; use futures::{future, Future, Stream, FutureExt, StreamExt}; -use log::warn; use sc_client_api::{StateBackend, BlockchainEvents}; use sp_blockchain::HeaderBackend; use sp_core::Pair; @@ -357,8 +356,12 @@ fn build_collator_service( let silenced = deadlined .map(|either| { - if let future::Either::Right(_) = either { - warn!("Collation failure: timeout"); + match either { + future::Either::Right(_) => log::warn!("Collation failure: timeout"), + future::Either::Left((Err(e), _)) => { + log::error!("Collation failed: {:?}", e) + } + future::Either::Left((Ok(()), _)) => {}, } }); -- GitLab From d40226332bc3971818c560a09061b6e541a1f99f Mon Sep 17 00:00:00 2001 From: Andronik Ordian Date: Fri, 31 Jul 2020 18:02:16 +0200 Subject: [PATCH 129/192] Chain API subsystem (#1498) * chain-api subsystem skeleton * chain-api subsystem: draft impl * chain-api subsystem: mock testclient * chain-api subsystem: impl HeaderBacked for TestClient * chain-api subsystem: impl basic tests * chain-api subsystem: tiny guide * chain-api subsystem: rename ChainApiRequestMessage to ChainApiMessage * chain-api subsystem: add the page to the ToC * chain-api subsystem: proper error type * chain-api subsystem: impl ancestors request * chain-api subsystem: tests for ancestors request * guide: fix ancestor return type * runtime-api subsystem: remove unused dep * fix fmt * fix outdated comment * chain-api subsystem: s/format/to_string * lower-case subsystem names * chain-api subsystem: resolve Finalized todo * chain-api subsystem: remove TODO * extract request errors into a module * remove caching TODO * fix imports --- Cargo.lock | 13 +- Cargo.toml | 1 + node/core/bitfield-signing/src/lib.rs | 3 +- node/core/candidate-validation/src/lib.rs | 2 +- node/core/chain-api/Cargo.toml | 17 + node/core/chain-api/src/lib.rs | 338 ++++++++++++++++++ node/core/runtime-api/Cargo.toml | 1 - node/core/runtime-api/src/lib.rs | 5 +- node/subsystem/src/errors.rs | 57 +++ node/subsystem/src/lib.rs | 1 + node/subsystem/src/messages.rs | 51 ++- node/subsystem/src/util.rs | 8 +- roadmap/implementers-guide/src/SUMMARY.md | 1 + .../src/node/utility/chain-api.md | 19 + .../src/types/overseer-protocol.md | 33 +- 15 files changed, 529 insertions(+), 21 deletions(-) create mode 100644 node/core/chain-api/Cargo.toml create mode 100644 node/core/chain-api/src/lib.rs create mode 100644 node/subsystem/src/errors.rs create mode 100644 roadmap/implementers-guide/src/node/utility/chain-api.md diff --git a/Cargo.lock b/Cargo.lock index 47386ba2d4..fbcd505887 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4653,6 +4653,18 @@ dependencies = [ "sp-keyring", ] +[[package]] +name = "polkadot-node-core-chain-api" +version = "0.1.0" +dependencies = [ + "futures 0.3.5", + "maplit", + "polkadot-node-subsystem", + "polkadot-primitives", + "sp-blockchain", + "sp-core", +] + [[package]] name = "polkadot-node-core-proposer" version = "0.1.0" @@ -4683,7 +4695,6 @@ dependencies = [ name = "polkadot-node-core-runtime-api" version = "0.1.0" dependencies = [ - "assert_matches", "futures 0.3.5", "polkadot-node-primitives", "polkadot-node-subsystem", diff --git a/Cargo.toml b/Cargo.toml index fa56b0ec42..7fb7d7d535 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -47,6 +47,7 @@ members = [ "node/core/backing", "node/core/bitfield-signing", "node/core/candidate-validation", + "node/core/chain-api", "node/core/proposer", "node/core/runtime-api", "node/network/bridge", diff --git a/node/core/bitfield-signing/src/lib.rs b/node/core/bitfield-signing/src/lib.rs index e3bb68cec9..4e409a2576 100644 --- a/node/core/bitfield-signing/src/lib.rs +++ b/node/core/bitfield-signing/src/lib.rs @@ -26,8 +26,9 @@ use keystore::KeyStorePtr; use polkadot_node_subsystem::{ messages::{ self, AllMessages, AvailabilityStoreMessage, BitfieldDistributionMessage, - BitfieldSigningMessage, CandidateBackingMessage, RuntimeApiMessage, RuntimeApiError + BitfieldSigningMessage, CandidateBackingMessage, RuntimeApiMessage, }, + errors::RuntimeApiError, util::{self, JobManager, JobTrait, ToJobTrait, Validator}, }; use polkadot_primitives::v1::{AvailabilityBitfield, CoreState, Hash, ValidatorIndex}; diff --git a/node/core/candidate-validation/src/lib.rs b/node/core/candidate-validation/src/lib.rs index c040090faa..e81f41180d 100644 --- a/node/core/candidate-validation/src/lib.rs +++ b/node/core/candidate-validation/src/lib.rs @@ -26,8 +26,8 @@ use polkadot_subsystem::{ }; use polkadot_subsystem::messages::{ AllMessages, CandidateValidationMessage, RuntimeApiMessage, ValidationFailed, RuntimeApiRequest, - RuntimeApiError, }; +use polkadot_subsystem::errors::RuntimeApiError; use polkadot_node_primitives::{ValidationResult, ValidationOutputs}; use polkadot_primitives::v1::{ ValidationCode, OmittedValidationData, PoV, CandidateDescriptor, LocalValidationData, diff --git a/node/core/chain-api/Cargo.toml b/node/core/chain-api/Cargo.toml new file mode 100644 index 0000000000..61ca313e33 --- /dev/null +++ b/node/core/chain-api/Cargo.toml @@ -0,0 +1,17 @@ +[package] +name = "polkadot-node-core-chain-api" +version = "0.1.0" +authors = ["Parity Technologies "] +edition = "2018" + +[dependencies] +futures = { version = "0.3.5" } +sp-blockchain = { git = "https://github.com/paritytech/substrate", branch = "master" } +polkadot-primitives = { path = "../../../primitives" } +polkadot-subsystem = { package = "polkadot-node-subsystem", path = "../../subsystem" } + +[dev-dependencies] +futures = { version = "0.3.5", features = ["thread-pool"] } +maplit = "1.0.2" +polkadot-subsystem = { package = "polkadot-node-subsystem", path = "../../subsystem", features = ["test-helpers"] } +sp-core = { git = "https://github.com/paritytech/substrate", branch = "master" } diff --git a/node/core/chain-api/src/lib.rs b/node/core/chain-api/src/lib.rs new file mode 100644 index 0000000000..9af759aab7 --- /dev/null +++ b/node/core/chain-api/src/lib.rs @@ -0,0 +1,338 @@ +// Copyright 2020 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 . + +//! Implements the Chain API Subsystem +//! +//! Provides access to the chain data. Every request may return an error. +//! At the moment, the implementation requires `Client` to implement `HeaderBackend`, +//! we may add more bounds in the future if we will need e.g. block bodies. +//! +//! Supported requests: +//! * Block hash to number +//! * Finalized block number to hash +//! * Last finalized block number +//! * Ancestors + +use polkadot_subsystem::{ + FromOverseer, OverseerSignal, + SpawnedSubsystem, Subsystem, SubsystemResult, SubsystemContext, + messages::ChainApiMessage, +}; +use polkadot_primitives::v1::{Block, BlockId}; +use sp_blockchain::HeaderBackend; + +use futures::prelude::*; + +/// The Chain API Subsystem implementation. +pub struct ChainApiSubsystem { + client: Client, +} + +impl ChainApiSubsystem { + /// Create a new Chain API subsystem with the given client. + pub fn new(client: Client) -> Self { + ChainApiSubsystem { + client + } + } +} + +impl Subsystem for ChainApiSubsystem where + Client: HeaderBackend + 'static, + Context: SubsystemContext +{ + fn start(self, ctx: Context) -> SpawnedSubsystem { + SpawnedSubsystem { + future: run(ctx, self.client).map(|_| ()).boxed(), + name: "chain-api-subsystem", + } + } +} + +async fn run( + mut ctx: impl SubsystemContext, + client: Client, +) -> SubsystemResult<()> +where + Client: HeaderBackend, +{ + loop { + match ctx.recv().await? { + FromOverseer::Signal(OverseerSignal::Conclude) => return Ok(()), + FromOverseer::Signal(OverseerSignal::ActiveLeaves(_)) => {}, + FromOverseer::Signal(OverseerSignal::BlockFinalized(_)) => {}, + FromOverseer::Communication { msg } => match msg { + ChainApiMessage::BlockNumber(hash, response_channel) => { + let result = client.number(hash).map_err(|e| e.to_string().into()); + let _ = response_channel.send(result); + }, + ChainApiMessage::FinalizedBlockHash(number, response_channel) => { + // Note: we don't verify it's finalized + let result = client.hash(number).map_err(|e| e.to_string().into()); + let _ = response_channel.send(result); + }, + ChainApiMessage::FinalizedBlockNumber(response_channel) => { + let result = client.info().finalized_number; + let _ = response_channel.send(Ok(result)); + }, + ChainApiMessage::Ancestors { hash, k, response_channel } => { + let mut hash = hash; + + let next_parent = core::iter::from_fn(|| { + let maybe_header = client.header(BlockId::Hash(hash)); + match maybe_header { + // propagate the error + Err(e) => Some(Err(e.to_string().into())), + // fewer than `k` ancestors are available + Ok(None) => None, + Ok(Some(header)) => { + hash = header.parent_hash; + Some(Ok(hash)) + } + } + }); + + let result = next_parent.take(k).collect::, _>>(); + let _ = response_channel.send(result); + }, + } + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + + use std::collections::BTreeMap; + use futures::{future::BoxFuture, channel::oneshot}; + + use polkadot_primitives::v1::{Hash, BlockNumber, BlockId, Header}; + use polkadot_subsystem::test_helpers::{make_subsystem_context, TestSubsystemContextHandle}; + use sp_blockchain::Info as BlockInfo; + use sp_core::testing::TaskExecutor; + + #[derive(Clone)] + struct TestClient { + blocks: BTreeMap, + finalized_blocks: BTreeMap, + headers: BTreeMap, + } + + const ONE: Hash = Hash::repeat_byte(0x01); + const TWO: Hash = Hash::repeat_byte(0x02); + const THREE: Hash = Hash::repeat_byte(0x03); + const FOUR: Hash = Hash::repeat_byte(0x04); + const ERROR_PATH: Hash = Hash::repeat_byte(0xFF); + + fn default_header() -> Header { + Header { + parent_hash: Hash::zero(), + number: 100500, + state_root: Hash::zero(), + extrinsics_root: Hash::zero(), + digest: Default::default(), + } + } + + impl Default for TestClient { + fn default() -> Self { + Self { + blocks: maplit::btreemap! { + ONE => 1, + TWO => 2, + THREE => 3, + FOUR => 4, + }, + finalized_blocks: maplit::btreemap! { + 1 => ONE, + 3 => THREE, + }, + headers: maplit::btreemap! { + TWO => Header { + parent_hash: ONE, + number: 2, + ..default_header() + }, + THREE => Header { + parent_hash: TWO, + number: 3, + ..default_header() + }, + FOUR => Header { + parent_hash: THREE, + number: 4, + ..default_header() + }, + ERROR_PATH => Header { + ..default_header() + } + } + } + } + } + + fn last_key_value(map: &BTreeMap) -> (K, V) { + assert!(!map.is_empty()); + map.iter() + .last() + .map(|(k, v)| (k.clone(), v.clone())) + .unwrap() + } + + impl HeaderBackend for TestClient { + fn info(&self) -> BlockInfo { + let genesis_hash = self.blocks.iter().next().map(|(h, _)| *h).unwrap(); + let (best_hash, best_number) = last_key_value(&self.blocks); + let (finalized_number, finalized_hash) = last_key_value(&self.finalized_blocks); + + BlockInfo { + best_hash, + best_number, + genesis_hash, + finalized_hash, + finalized_number, + number_leaves: 0, + } + } + fn number(&self, hash: Hash) -> sp_blockchain::Result> { + Ok(self.blocks.get(&hash).copied()) + } + fn hash(&self, number: BlockNumber) -> sp_blockchain::Result> { + Ok(self.finalized_blocks.get(&number).copied()) + } + fn header(&self, id: BlockId) -> sp_blockchain::Result> { + match id { + // for error path testing + BlockId::Hash(hash) if hash.is_zero() => { + Err(sp_blockchain::Error::Backend("Zero hashes are illegal!".into())) + } + BlockId::Hash(hash) => { + Ok(self.headers.get(&hash).cloned()) + } + _ => unreachable!(), + } + } + fn status(&self, _id: BlockId) -> sp_blockchain::Result { + unimplemented!() + } + } + + fn test_harness( + test: impl FnOnce(TestClient, TestSubsystemContextHandle) + -> BoxFuture<'static, ()>, + ) { + let (ctx, ctx_handle) = make_subsystem_context(TaskExecutor::new()); + let client = TestClient::default(); + + let chain_api_task = run(ctx, client.clone()).map(|x| x.unwrap()); + let test_task = test(client, ctx_handle); + + futures::executor::block_on(future::join(chain_api_task, test_task)); + } + + #[test] + fn request_block_number() { + test_harness(|client, mut sender| { + async move { + let zero = Hash::zero(); + let test_cases = [ + (TWO, client.number(TWO).unwrap()), + (zero, client.number(zero).unwrap()), // not here + ]; + for (hash, expected) in &test_cases { + let (tx, rx) = oneshot::channel(); + + sender.send(FromOverseer::Communication { + msg: ChainApiMessage::BlockNumber(*hash, tx), + }).await; + + assert_eq!(rx.await.unwrap().unwrap(), *expected); + } + + sender.send(FromOverseer::Signal(OverseerSignal::Conclude)).await; + }.boxed() + }) + } + + #[test] + fn request_finalized_hash() { + test_harness(|client, mut sender| { + async move { + let test_cases = [ + (1, client.hash(1).unwrap()), // not here + (2, client.hash(2).unwrap()), + ]; + for (number, expected) in &test_cases { + let (tx, rx) = oneshot::channel(); + + sender.send(FromOverseer::Communication { + msg: ChainApiMessage::FinalizedBlockHash(*number, tx), + }).await; + + assert_eq!(rx.await.unwrap().unwrap(), *expected); + } + + sender.send(FromOverseer::Signal(OverseerSignal::Conclude)).await; + }.boxed() + }) + } + + #[test] + fn request_last_finalized_number() { + test_harness(|client, mut sender| { + async move { + let (tx, rx) = oneshot::channel(); + + let expected = client.info().finalized_number; + sender.send(FromOverseer::Communication { + msg: ChainApiMessage::FinalizedBlockNumber(tx), + }).await; + + assert_eq!(rx.await.unwrap().unwrap(), expected); + + sender.send(FromOverseer::Signal(OverseerSignal::Conclude)).await; + }.boxed() + }) + } + + #[test] + fn request_ancestors() { + test_harness(|_client, mut sender| { + async move { + let (tx, rx) = oneshot::channel(); + sender.send(FromOverseer::Communication { + msg: ChainApiMessage::Ancestors { hash: THREE, k: 4, response_channel: tx }, + }).await; + assert_eq!(rx.await.unwrap().unwrap(), vec![TWO, ONE]); + + let (tx, rx) = oneshot::channel(); + sender.send(FromOverseer::Communication { + msg: ChainApiMessage::Ancestors { hash: TWO, k: 1, response_channel: tx }, + }).await; + assert_eq!(rx.await.unwrap().unwrap(), vec![ONE]); + + let (tx, rx) = oneshot::channel(); + sender.send(FromOverseer::Communication { + msg: ChainApiMessage::Ancestors { hash: ERROR_PATH, k: 2, response_channel: tx }, + }).await; + assert!(rx.await.unwrap().is_err()); + + sender.send(FromOverseer::Signal(OverseerSignal::Conclude)).await; + }.boxed() + }) + } +} diff --git a/node/core/runtime-api/Cargo.toml b/node/core/runtime-api/Cargo.toml index 200aed3897..7dfde63947 100644 --- a/node/core/runtime-api/Cargo.toml +++ b/node/core/runtime-api/Cargo.toml @@ -17,4 +17,3 @@ polkadot-subsystem = { package = "polkadot-node-subsystem", path = "../../subsys sp-core = { git = "https://github.com/paritytech/substrate", branch = "master" } futures = { version = "0.3.5", features = ["thread-pool"] } polkadot-subsystem = { package = "polkadot-node-subsystem", path = "../../subsystem", features = ["test-helpers"] } -assert_matches = "1.3.0" diff --git a/node/core/runtime-api/src/lib.rs b/node/core/runtime-api/src/lib.rs index f242381723..34d73f91ec 100644 --- a/node/core/runtime-api/src/lib.rs +++ b/node/core/runtime-api/src/lib.rs @@ -24,8 +24,9 @@ use polkadot_subsystem::{ FromOverseer, OverseerSignal, }; use polkadot_subsystem::messages::{ - RuntimeApiMessage, RuntimeApiRequest as Request, RuntimeApiError, + RuntimeApiMessage, RuntimeApiRequest as Request, }; +use polkadot_subsystem::errors::RuntimeApiError; use polkadot_primitives::v1::{Block, BlockId, Hash, ParachainHost}; use sp_api::{ProvideRuntimeApi}; @@ -50,7 +51,7 @@ impl Subsystem for RuntimeApiSubsystem where fn start(self, ctx: Context) -> SpawnedSubsystem { SpawnedSubsystem { future: run(ctx, self.0).map(|_| ()).boxed(), - name: "RuntimeApiSubsystem", + name: "runtime-api-subsystem", } } } diff --git a/node/subsystem/src/errors.rs b/node/subsystem/src/errors.rs new file mode 100644 index 0000000000..40edb1b3c1 --- /dev/null +++ b/node/subsystem/src/errors.rs @@ -0,0 +1,57 @@ +// Copyright 2020 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 . + +//! Error types for the subsystem requests. + +/// A description of an error causing the runtime API request to be unservable. +#[derive(Debug, Clone)] +pub struct RuntimeApiError(String); + +impl From for RuntimeApiError { + fn from(s: String) -> Self { + RuntimeApiError(s) + } +} + +impl core::fmt::Display for RuntimeApiError { + fn fmt(&self, f: &mut core::fmt::Formatter) -> Result<(), core::fmt::Error> { + write!(f, "{}", self.0) + } +} + +/// A description of an error causing the chain API request to be unservable. +#[derive(Debug, Clone)] +pub struct ChainApiError { + msg: String, +} + +impl From<&str> for ChainApiError { + fn from(s: &str) -> Self { + s.to_owned().into() + } +} + +impl From for ChainApiError { + fn from(msg: String) -> Self { + Self { msg } + } +} + +impl core::fmt::Display for ChainApiError { + fn fmt(&self, f: &mut core::fmt::Formatter) -> Result<(), core::fmt::Error> { + write!(f, "{}", self.msg) + } +} diff --git a/node/subsystem/src/lib.rs b/node/subsystem/src/lib.rs index 6ed552a3f5..7e112f5439 100644 --- a/node/subsystem/src/lib.rs +++ b/node/subsystem/src/lib.rs @@ -34,6 +34,7 @@ use smallvec::SmallVec; use crate::messages::AllMessages; +pub mod errors; pub mod messages; pub mod util; #[cfg(any(test, feature = "test-helpers"))] diff --git a/node/subsystem/src/messages.rs b/node/subsystem/src/messages.rs index 3cd06863d4..d9a1f03937 100644 --- a/node/subsystem/src/messages.rs +++ b/node/subsystem/src/messages.rs @@ -31,7 +31,7 @@ use polkadot_primitives::v1::{ CoreAssignment, CoreOccupied, CandidateDescriptor, ValidatorSignature, OmittedValidationData, AvailableData, GroupRotationInfo, CoreState, LocalValidationData, GlobalValidationData, OccupiedCoreAssumption, - CandidateEvent, SessionIndex, + CandidateEvent, SessionIndex, BlockNumber, }; use polkadot_node_primitives::{ MisbehaviorReport, SignedFullStatement, View, ProtocolId, ValidationResult, @@ -285,6 +285,43 @@ impl AvailabilityStoreMessage { } } +/// A response channel for the result of a chain API request. +pub type ChainApiResponseChannel = oneshot::Sender>; + +/// Chain API request subsystem message. +#[derive(Debug)] +pub enum ChainApiMessage { + /// Request the block number by hash. + /// Returns `None` if a block with the given hash is not present in the db. + BlockNumber(Hash, ChainApiResponseChannel>), + /// Request the finalized block hash by number. + /// Returns `None` if a block with the given number is not present in the db. + /// Note: the caller must ensure the block is finalized. + FinalizedBlockHash(BlockNumber, ChainApiResponseChannel>), + /// Request the last finalized block number. + /// This request always succeeds. + FinalizedBlockNumber(ChainApiResponseChannel), + /// Request the `k` ancestors block hashes of a block with the given hash. + /// The response channel may return a `Vec` of size up to `k` + /// filled with ancestors hashes with the following order: + /// `parent`, `grandparent`, ... + Ancestors { + /// The hash of the block in question. + hash: Hash, + /// The number of ancestors to request. + k: usize, + /// The response channel. + response_channel: ChainApiResponseChannel>, + }, +} + +impl ChainApiMessage { + /// If the current variant contains the relay parent hash, return it. + pub fn relay_parent(&self) -> Option { + None + } +} + /// The information on scheduler assignments that some somesystems may be querying. #[derive(Debug, Clone)] pub struct SchedulerRoster { @@ -298,18 +335,8 @@ pub struct SchedulerRoster { pub availability_cores: Vec>, } -/// A description of an error causing the runtime API request to be unservable. -#[derive(Debug, Clone)] -pub struct RuntimeApiError(String); - -impl From for RuntimeApiError { - fn from(s: String) -> Self { - RuntimeApiError(s) - } -} - /// A sender for the result of a runtime API request. -pub type RuntimeApiSender = oneshot::Sender>; +pub type RuntimeApiSender = oneshot::Sender>; /// A request to the Runtime API subsystem. #[derive(Debug)] diff --git a/node/subsystem/src/util.rs b/node/subsystem/src/util.rs index 440fda08f0..14f6f96ed2 100644 --- a/node/subsystem/src/util.rs +++ b/node/subsystem/src/util.rs @@ -22,8 +22,9 @@ use crate::{ messages::{ - AllMessages, RuntimeApiError, RuntimeApiMessage, RuntimeApiRequest, RuntimeApiSender, + AllMessages, RuntimeApiMessage, RuntimeApiRequest, RuntimeApiSender, }, + errors::{ChainApiError, RuntimeApiError}, FromOverseer, SpawnedSubsystem, Subsystem, SubsystemContext, SubsystemError, SubsystemResult, }; use futures::{ @@ -72,7 +73,10 @@ pub enum Error { /// A subsystem error #[from] Subsystem(SubsystemError), - /// An error in the runtime API. + /// An error in the Chain API. + #[from] + ChainApi(ChainApiError), + /// An error in the Runtime API. #[from] RuntimeApi(RuntimeApiError), /// The type system wants this even though it doesn't make sense diff --git a/roadmap/implementers-guide/src/SUMMARY.md b/roadmap/implementers-guide/src/SUMMARY.md index 86ddabe45b..63280e5142 100644 --- a/roadmap/implementers-guide/src/SUMMARY.md +++ b/roadmap/implementers-guide/src/SUMMARY.md @@ -39,6 +39,7 @@ - [Misbehavior Arbitration](node/utility/misbehavior-arbitration.md) - [Peer Set Manager](node/utility/peer-set-manager.md) - [Runtime API Requests](node/utility/runtime-api.md) + - [Chain API Requests](node/utility/chain-api.md) - [Data Structures and Types](types/README.md) - [Candidate](types/candidate.md) - [Backing](types/backing.md) diff --git a/roadmap/implementers-guide/src/node/utility/chain-api.md b/roadmap/implementers-guide/src/node/utility/chain-api.md new file mode 100644 index 0000000000..6469db262a --- /dev/null +++ b/roadmap/implementers-guide/src/node/utility/chain-api.md @@ -0,0 +1,19 @@ +# Chain API + +The Chain API subsystem is responsible for providing a single point of access to chain state data via a set of pre-determined queries. + +## Protocol + +Input: [`ChainApiMessage`](../../types/overseer-protocol.md#chain-api-message) + +Output: None + +## Functionality + +On receipt of `ChainApiMessage`, answer the request and provide the response to the side-channel embedded within the request. + +Currently, the following requests are supported: +* Block hash to number +* Finalized block number to hash +* Last finalized block number +* Ancestors diff --git a/roadmap/implementers-guide/src/types/overseer-protocol.md b/roadmap/implementers-guide/src/types/overseer-protocol.md index 412ac5a1d6..cfa66c089a 100644 --- a/roadmap/implementers-guide/src/types/overseer-protocol.md +++ b/roadmap/implementers-guide/src/types/overseer-protocol.md @@ -69,7 +69,7 @@ enum AvailabilityStoreMessage { /// Store a specific chunk of the candidate's erasure-coding by validator index, with an /// accompanying proof. StoreChunk(Hash, ValidatorIndex, AvailabilityChunkAndProof, ResponseChannel>), - /// Store `AvailableData`. If `ValidatorIndex` is provided, also store this validator's + /// Store `AvailableData`. If `ValidatorIndex` is provided, also store this validator's /// `AvailabilityChunkAndProof`. StoreAvailableData(Hash, Option, u32, AvailableData, ResponseChannel>), } @@ -126,6 +126,37 @@ enum CandidateSelectionMessage { } ``` +## Chain API Message + +The Chain API subsystem is responsible for providing an interface to chain data. + +```rust +enum ChainApiMessage { + /// Get the block number by hash. + /// Returns `None` if a block with the given hash is not present in the db. + BlockNumber(Hash, ResponseChannel, Error>>), + /// Get the finalized block hash by number. + /// Returns `None` if a block with the given number is not present in the db. + /// Note: the caller must ensure the block is finalized. + FinalizedBlockHash(BlockNumber, ResponseChannel, Error>>), + /// Get the last finalized block number. + /// This request always succeeds. + FinalizedBlockNumber(ResponseChannel>), + /// Request the `k` ancestors block hashes of a block with the given hash. + /// The response channel may return a `Vec` of size up to `k` + /// filled with ancestors hashes with the following order: + /// `parent`, `grandparent`, ... + Ancestors { + /// The hash of the block in question. + hash: Hash, + /// The number of ancestors to request. + k: usize, + /// The response channel. + response_channel: ResponseChannel, Error>>, + } +} +``` + ## Collator Protocol Message Messages received by the [Collator Protocol subsystem](../node/collators/collator-protocol.md) -- GitLab From eca01a8cde87e826e4abb460cc00f336915b082c Mon Sep 17 00:00:00 2001 From: Fedor Sakharov Date: Fri, 31 Jul 2020 23:42:10 +0300 Subject: [PATCH 130/192] Parachains-runtime (#1505) * Initial commit * v0 to v1 primitives and remove attestations * Review fixes * implement candidate_events * remove dead code --- Cargo.lock | 47 ++ Cargo.toml | 1 + primitives/src/v0.rs | 2 +- primitives/src/v1.rs | 3 +- runtime/parachains/src/lib.rs | 17 +- runtime/parachains/src/runtime_api_impl/v1.rs | 9 +- runtime/rococo/Cargo.toml | 106 +++ runtime/rococo/build.rs | 26 + runtime/rococo/src/constants.rs | 113 +++ runtime/rococo/src/lib.rs | 725 ++++++++++++++++++ 10 files changed, 1036 insertions(+), 13 deletions(-) create mode 100644 runtime/rococo/Cargo.toml create mode 100644 runtime/rococo/build.rs create mode 100644 runtime/rococo/src/constants.rs create mode 100644 runtime/rococo/src/lib.rs diff --git a/Cargo.lock b/Cargo.lock index fbcd505887..402247bd12 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5993,6 +5993,53 @@ dependencies = [ "librocksdb-sys", ] +[[package]] +name = "rococo-runtime" +version = "0.8.19" +dependencies = [ + "frame-executive", + "frame-support", + "frame-system", + "frame-system-rpc-runtime-api", + "pallet-authority-discovery", + "pallet-authorship", + "pallet-babe", + "pallet-balances", + "pallet-grandpa", + "pallet-im-online", + "pallet-indices", + "pallet-offences", + "pallet-session", + "pallet-staking", + "pallet-staking-reward-curve", + "pallet-timestamp", + "pallet-transaction-payment", + "pallet-transaction-payment-rpc-runtime-api", + "parity-scale-codec", + "polkadot-parachain", + "polkadot-primitives", + "polkadot-runtime-common", + "polkadot-runtime-parachains", + "serde", + "serde_derive", + "smallvec 1.4.1", + "sp-api", + "sp-authority-discovery", + "sp-block-builder", + "sp-consensus-babe", + "sp-core", + "sp-inherents", + "sp-io", + "sp-offchain", + "sp-runtime", + "sp-session", + "sp-staking", + "sp-std", + "sp-transaction-pool", + "sp-version", + "substrate-wasm-builder-runner 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "rpassword" version = "4.0.5" diff --git a/Cargo.toml b/Cargo.toml index 7fb7d7d535..a3f9b295bd 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -35,6 +35,7 @@ members = [ "runtime/parachains", "runtime/polkadot", "runtime/kusama", + "runtime/rococo", "runtime/westend", "runtime/test-runtime", "runtime/test-runtime/client", diff --git a/primitives/src/v0.rs b/primitives/src/v0.rs index 3fcb31193a..11d62a4c2e 100644 --- a/primitives/src/v0.rs +++ b/primitives/src/v0.rs @@ -815,7 +815,7 @@ impl EncodeAs for T { /// /// Note that the internal fields are not public; they are all accessable by immutable getters. /// This reduces the chance that they are accidentally mutated, invalidating the signature. -#[derive(Debug, Clone, PartialEq, Eq, Encode, Decode)] +#[derive(Clone, PartialEq, Eq, Encode, Decode, RuntimeDebug)] pub struct Signed { /// The payload is part of the signed data. The rest is the signing context, /// which is known both at signing and at validation. diff --git a/primitives/src/v1.rs b/primitives/src/v1.rs index 8b4130fe9d..67926f2ab3 100644 --- a/primitives/src/v1.rs +++ b/primitives/src/v1.rs @@ -304,8 +304,7 @@ impl PoV { } /// A bitfield concerning availability of backed candidates. -#[derive(PartialEq, Eq, Clone, Encode, Decode)] -#[cfg_attr(feature = "std", derive(Debug))] +#[derive(PartialEq, Eq, Clone, Encode, Decode, RuntimeDebug)] pub struct AvailabilityBitfield(pub BitVec); impl From> for AvailabilityBitfield { diff --git a/runtime/parachains/src/lib.rs b/runtime/parachains/src/lib.rs index eb279ad19c..5abc2fa32c 100644 --- a/runtime/parachains/src/lib.rs +++ b/runtime/parachains/src/lib.rs @@ -20,13 +20,16 @@ //! particular the `Initializer` module, as it is responsible for initializing the state //! of the other modules. -mod configuration; -mod inclusion; -mod inclusion_inherent; -mod initializer; -mod paras; -mod scheduler; -mod validity; + +#![cfg_attr(not(feature = "std"), no_std)] + +pub mod configuration; +pub mod inclusion; +pub mod inclusion_inherent; +pub mod initializer; +pub mod paras; +pub mod scheduler; +pub mod validity; pub mod runtime_api_impl; diff --git a/runtime/parachains/src/runtime_api_impl/v1.rs b/runtime/parachains/src/runtime_api_impl/v1.rs index 7f4a9093d4..a3bb6afff6 100644 --- a/runtime/parachains/src/runtime_api_impl/v1.rs +++ b/runtime/parachains/src/runtime_api_impl/v1.rs @@ -17,6 +17,7 @@ //! Runtimes implementing the v1 runtime API are recommended to forward directly to these //! functions. +use sp_std::prelude::*; use primitives::v1::{ ValidatorId, ValidatorIndex, GroupRotationInfo, CoreState, GlobalValidationData, Id as ParaId, OccupiedCoreAssumption, LocalValidationData, SessionIndex, ValidationCode, @@ -239,9 +240,11 @@ pub fn candidate_pending_availability(para_id: ParaId) /// Implementation for the `candidate_events` function of the runtime API. // NOTE: this runs without block initialization, as it accesses events. // this means it can run in a different session than other runtime APIs at the same block. -pub fn candidate_events( - extract_event: impl Fn(::Event) -> Option>, -) -> Vec> { +pub fn candidate_events(extract_event: F) -> Vec> +where + T: initializer::Trait, + F: Fn(::Event) -> Option>, +{ use inclusion::Event as RawEvent; >::events().into_iter() diff --git a/runtime/rococo/Cargo.toml b/runtime/rococo/Cargo.toml new file mode 100644 index 0000000000..be75f7a794 --- /dev/null +++ b/runtime/rococo/Cargo.toml @@ -0,0 +1,106 @@ +[package] +name = "rococo-runtime" +version = "0.8.19" +authors = ["Parity Technologies "] +edition = "2018" +build = "build.rs" + +[dependencies] +codec = { package = "parity-scale-codec", version = "1.3.4", default-features = false, features = ["derive"] } +serde = { version = "1.0.102", default-features = false } +serde_derive = { version = "1.0.102", optional = true } +smallvec = "1.4.1" + +frame-support = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +sp-api = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +sp-io = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +sp-std = { package = "sp-std", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +sp-session = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +sp-staking = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +sp-core = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +version = { package = "sp-version", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } + +tx-pool-api = { package = "sp-transaction-pool", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +block-builder-api = { package = "sp-block-builder", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +inherents = { package = "sp-inherents", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +offchain-primitives = { package = "sp-offchain", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } + +authority-discovery = { package = "pallet-authority-discovery", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +authorship = { package = "pallet-authorship", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +babe = { package = "pallet-babe", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +babe-primitives = { package = "sp-consensus-babe", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +balances = { package = "pallet-balances", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +session = { package = "pallet-session", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +im-online = { package = "pallet-im-online", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +indices = { package = "pallet-indices", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +transaction-payment = { package = "pallet-transaction-payment", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +transaction-payment-rpc-runtime-api = { package = "pallet-transaction-payment-rpc-runtime-api", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +staking = { package = "pallet-staking", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-staking-reward-curve = { package = "pallet-staking-reward-curve", git = "https://github.com/paritytech/substrate", branch = "master" } +executive = { package = "frame-executive", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +grandpa = { package = "pallet-grandpa", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +timestamp = { package = "pallet-timestamp", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +offences = { package = "pallet-offences", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +authority-discovery-primitives = { package = "sp-authority-discovery", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } + +system = { package = "frame-system", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +system_rpc_runtime_api = { package = "frame-system-rpc-runtime-api", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } + +runtime-common = { package = "polkadot-runtime-common", path = "../common", default-features = false } +primitives = { package = "polkadot-primitives", path = "../../primitives", default-features = false } +polkadot-parachain = { path = "../../parachain", default-features = false } +runtime-parachains = { package = "polkadot-runtime-parachains", path = "../parachains", default-features = false } + +[build-dependencies] +wasm-builder-runner = { package = "substrate-wasm-builder-runner", version = "1.0.6" } + +[features] +default = ["std"] +no_std = [] +std = [ + "authority-discovery-primitives/std", + "authority-discovery/std", + "authorship/std", + "babe/std", + "babe-primitives/std", + "balances/std", + "codec/std", + "executive/std", + "grandpa/std", + "indices/std", + "im-online/std", + "inherents/std", + "frame-support/std", + "polkadot-parachain/std", + "primitives/std", + "runtime-common/std", + "runtime-parachains/std", + "session/std", + "sp-api/std", + "sp-core/std", + "sp-io/std", + "sp-runtime/std", + "sp-session/std", + "sp-staking/std", + "sp-std/std", + "staking/std", + "system/std", + "system_rpc_runtime_api/std", + "offchain-primitives/std", + "offences/std", + "timestamp/std", + "transaction-payment/std", + "transaction-payment-rpc-runtime-api/std", + "block-builder-api/std", + "tx-pool-api/std", + "version/std", + "serde_derive", + "serde/std", +] +# When enabled, the runtime api will not be build. +# +# This is required by Cumulus to access certain types of the +# runtime without clashing with the runtime api exported functions +# in WASM. +disable-runtime-api = [] diff --git a/runtime/rococo/build.rs b/runtime/rococo/build.rs new file mode 100644 index 0000000000..dff1419829 --- /dev/null +++ b/runtime/rococo/build.rs @@ -0,0 +1,26 @@ +// Copyright 2020 Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// 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 . + +use wasm_builder_runner::WasmBuilder; + +fn main() { + WasmBuilder::new() + .with_current_project() + .with_wasm_builder_from_crates("2.0.0") + .import_memory() + .export_heap_base() + .build() +} diff --git a/runtime/rococo/src/constants.rs b/runtime/rococo/src/constants.rs new file mode 100644 index 0000000000..de95703fcc --- /dev/null +++ b/runtime/rococo/src/constants.rs @@ -0,0 +1,113 @@ +// Copyright 2020 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 . + +/// Money matters. +pub mod currency { + use primitives::v0::Balance; + + pub const DOTS: Balance = 1_000_000_000_000; + pub const DOLLARS: Balance = DOTS; + pub const CENTS: Balance = DOLLARS / 100; + pub const MILLICENTS: Balance = CENTS / 1_000; + + pub const fn deposit(items: u32, bytes: u32) -> Balance { + items as Balance * 1 * DOLLARS + (bytes as Balance) * 5 * MILLICENTS + } +} + +/// Time and blocks. +pub mod time { + use primitives::v0::{Moment, BlockNumber}; + pub const MILLISECS_PER_BLOCK: Moment = 6000; + pub const SLOT_DURATION: Moment = MILLISECS_PER_BLOCK; + pub const EPOCH_DURATION_IN_BLOCKS: BlockNumber = 1 * HOURS; + + // These time units are defined in number of blocks. + pub const MINUTES: BlockNumber = 60_000 / (MILLISECS_PER_BLOCK as BlockNumber); + pub const HOURS: BlockNumber = MINUTES * 60; + pub const DAYS: BlockNumber = HOURS * 24; + + // 1 in 4 blocks (on average, not counting collisions) will be primary babe blocks. + pub const PRIMARY_PROBABILITY: (u64, u64) = (1, 4); +} + +/// Fee-related. +pub mod fee { + pub use sp_runtime::Perbill; + use primitives::v0::Balance; + use runtime_common::ExtrinsicBaseWeight; + use frame_support::weights::{ + WeightToFeePolynomial, WeightToFeeCoefficient, WeightToFeeCoefficients, + }; + use smallvec::smallvec; + + /// The block saturation level. Fees will be updates based on this value. + pub const TARGET_BLOCK_FULLNESS: Perbill = Perbill::from_percent(25); + + /// Handles converting a weight scalar to a fee value, based on the scale and granularity of the + /// node's balance type. + /// + /// This should typically create a mapping between the following ranges: + /// - [0, system::MaximumBlockWeight] + /// - [Balance::min, Balance::max] + /// + /// Yet, it can be used for any other sort of change to weight-fee. Some examples being: + /// - Setting it to `0` will essentially disable the weight fee. + /// - Setting it to `1` will cause the literal `#[weight = x]` values to be charged. + pub struct WeightToFee; + impl WeightToFeePolynomial for WeightToFee { + type Balance = Balance; + fn polynomial() -> WeightToFeeCoefficients { + // in Westend, extrinsic base weight (smallest non-zero weight) is mapped to 1/10 CENT: + let p = super::currency::CENTS; + let q = 10 * Balance::from(ExtrinsicBaseWeight::get()); + smallvec![WeightToFeeCoefficient { + degree: 1, + negative: false, + coeff_frac: Perbill::from_rational_approximation(p % q, q), + coeff_integer: p / q, + }] + } + } +} + +#[cfg(test)] +mod tests { + use frame_support::weights::WeightToFeePolynomial; + use runtime_common::{MaximumBlockWeight, ExtrinsicBaseWeight}; + use super::fee::WeightToFee; + use super::currency::{CENTS, DOLLARS, MILLICENTS}; + + #[test] + // This function tests that the fee for `MaximumBlockWeight` of weight is correct + fn full_block_fee_is_correct() { + // A full block should cost 16 DOLLARS + println!("Base: {}", ExtrinsicBaseWeight::get()); + let x = WeightToFee::calc(&MaximumBlockWeight::get()); + let y = 16 * DOLLARS; + assert!(x.max(y) - x.min(y) < MILLICENTS); + } + + #[test] + // This function tests that the fee for `ExtrinsicBaseWeight` of weight is correct + fn extrinsic_base_fee_is_correct() { + // `ExtrinsicBaseWeight` should cost 1/10 of a CENT + println!("Base: {}", ExtrinsicBaseWeight::get()); + let x = WeightToFee::calc(&ExtrinsicBaseWeight::get()); + let y = CENTS / 10; + assert!(x.max(y) - x.min(y) < MILLICENTS); + } +} diff --git a/runtime/rococo/src/lib.rs b/runtime/rococo/src/lib.rs new file mode 100644 index 0000000000..af530354dd --- /dev/null +++ b/runtime/rococo/src/lib.rs @@ -0,0 +1,725 @@ +// Copyright 2020 Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Polkadot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . + +//! The Rococo runtime. + +#![cfg_attr(not(feature = "std"), no_std)] +// `construct_runtime!` does a lot of recursion and requires us to increase the limit to 256. +#![recursion_limit="256"] + +use sp_std::prelude::*; +use codec::Encode; +use primitives::v1::{ + AccountId, AccountIndex, Balance, BlockNumber, Hash, Nonce, Signature, Moment, + GroupRotationInfo, CoreState, Id, GlobalValidationData, ValidationCode, CandidateEvent, + ValidatorId, ValidatorIndex, CommittedCandidateReceipt, OccupiedCoreAssumption, + LocalValidationData, +}; +use runtime_common::{ + SlowAdjustingFeeUpdate, + impls::{CurrencyToVoteHandler, ToAuthor}, + BlockHashCount, MaximumBlockWeight, AvailableBlockRatio, MaximumBlockLength, + BlockExecutionWeight, ExtrinsicBaseWeight, RocksDbWeight, MaximumExtrinsicWeight, +}; +use runtime_parachains::{ + self, + runtime_api_impl::v1 as runtime_api_impl, +}; +use frame_support::{ + parameter_types, construct_runtime, debug, + traits::{KeyOwnerProofSystem, Filter}, + weights::Weight, +}; +use sp_runtime::{ + create_runtime_str, generic, impl_opaque_keys, + ApplyExtrinsicResult, KeyTypeId, Perbill, curve::PiecewiseLinear, + transaction_validity::{TransactionValidity, TransactionSource, TransactionPriority}, + traits::{ + BlakeTwo256, Block as BlockT, OpaqueKeys, IdentityLookup, + Extrinsic as ExtrinsicT, SaturatedConversion, Verify, + }, +}; +use im_online::sr25519::AuthorityId as ImOnlineId; +use authority_discovery_primitives::AuthorityId as AuthorityDiscoveryId; +use version::RuntimeVersion; +use transaction_payment_rpc_runtime_api::RuntimeDispatchInfo; +use grandpa::{AuthorityId as GrandpaId, fg_primitives}; +use sp_core::OpaqueMetadata; +use sp_staking::SessionIndex; +use session::historical as session_historical; +use system::EnsureRoot; + +use runtime_parachains::configuration as parachains_configuration; +use runtime_parachains::inclusion as parachains_inclusion; +use runtime_parachains::inclusion_inherent as parachains_inclusion_inherent; +use runtime_parachains::initializer as parachains_initializer; +use runtime_parachains::paras as parachains_paras; +use runtime_parachains::scheduler as parachains_scheduler; + +pub use balances::Call as BalancesCall; + +/// Constant values used within the runtime. +pub mod constants; +use constants::{time::*, currency::*, fee::*}; + +// Make the WASM binary available. +#[cfg(feature = "std")] +include!(concat!(env!("OUT_DIR"), "/wasm_binary.rs")); + +/// The address format for describing accounts. +pub type Address = AccountId; +/// Block header type as expected by this runtime. +pub type Header = generic::Header; +/// Block type as expected by this runtime. +pub type Block = generic::Block; +/// A Block signed with a Justification +pub type SignedBlock = generic::SignedBlock; +/// BlockId type as expected by this runtime. +pub type BlockId = generic::BlockId; +/// The SignedExtension to the basic transaction logic. +pub type SignedExtra = ( + system::CheckSpecVersion, + system::CheckTxVersion, + system::CheckGenesis, + system::CheckMortality, + system::CheckNonce, + system::CheckWeight, + transaction_payment::ChargeTransactionPayment, +); + +#[cfg(not(feature = "disable-runtime-api"))] +sp_api::impl_runtime_apis! { + impl sp_api::Core for Runtime { + fn version() -> RuntimeVersion { + VERSION + } + + fn execute_block(block: Block) { + Executive::execute_block(block) + } + + fn initialize_block(header: &::Header) { + Executive::initialize_block(header) + } + } + + impl sp_api::Metadata for Runtime { + fn metadata() -> OpaqueMetadata { + Runtime::metadata().into() + } + } + + impl block_builder_api::BlockBuilder for Runtime { + fn apply_extrinsic(extrinsic: ::Extrinsic) -> ApplyExtrinsicResult { + Executive::apply_extrinsic(extrinsic) + } + + fn finalize_block() -> ::Header { + Executive::finalize_block() + } + + fn inherent_extrinsics(data: inherents::InherentData) -> Vec<::Extrinsic> { + data.create_extrinsics() + } + + fn check_inherents( + block: Block, + data: inherents::InherentData, + ) -> inherents::CheckInherentsResult { + data.check_extrinsics(&block) + } + + fn random_seed() -> ::Hash { + Babe::randomness().into() + } + } + + impl tx_pool_api::runtime_api::TaggedTransactionQueue for Runtime { + fn validate_transaction( + source: TransactionSource, + tx: ::Extrinsic, + ) -> TransactionValidity { + Executive::validate_transaction(source, tx) + } + } + + impl offchain_primitives::OffchainWorkerApi for Runtime { + fn offchain_worker(header: &::Header) { + Executive::offchain_worker(header) + } + } + + impl primitives::v1::ParachainHost for Runtime { + fn validators() -> Vec { + runtime_api_impl::validators::() + } + + fn validator_groups() -> (Vec>, GroupRotationInfo) { + runtime_api_impl::validator_groups::() + } + + fn availability_cores() -> Vec> { + runtime_api_impl::availability_cores::() + } + + fn global_validation_data() -> GlobalValidationData { + runtime_api_impl::global_validation_data::() + } + + fn local_validation_data(para_id: Id, assumption: OccupiedCoreAssumption) + -> Option> { + runtime_api_impl::local_validation_data::(para_id, assumption) + } + + fn session_index_for_child() -> SessionIndex { + runtime_api_impl::session_index_for_child::() + } + + fn validation_code(para_id: Id, assumption: OccupiedCoreAssumption) + -> Option { + runtime_api_impl::validation_code::(para_id, assumption) + } + + fn candidate_pending_availability(para_id: Id) -> Option> { + runtime_api_impl::candidate_pending_availability::(para_id) + } + + fn candidate_events() -> Vec> { + runtime_api_impl::candidate_events::(|ev| { + match ev { + Event::parachains_inclusion(ev) => { + Some(ev) + } + _ => None, + } + }) + } + } + + impl fg_primitives::GrandpaApi for Runtime { + fn grandpa_authorities() -> Vec<(GrandpaId, u64)> { + Grandpa::grandpa_authorities() + } + + fn submit_report_equivocation_unsigned_extrinsic( + equivocation_proof: fg_primitives::EquivocationProof< + ::Hash, + sp_runtime::traits::NumberFor, + >, + key_owner_proof: fg_primitives::OpaqueKeyOwnershipProof, + ) -> Option<()> { + let key_owner_proof = key_owner_proof.decode()?; + + Grandpa::submit_unsigned_equivocation_report( + equivocation_proof, + key_owner_proof, + ) + } + + fn generate_key_ownership_proof( + _set_id: fg_primitives::SetId, + authority_id: fg_primitives::AuthorityId, + ) -> Option { + use codec::Encode; + + Historical::prove((fg_primitives::KEY_TYPE, authority_id)) + .map(|p| p.encode()) + .map(fg_primitives::OpaqueKeyOwnershipProof::new) + } + } + + impl babe_primitives::BabeApi for Runtime { + fn configuration() -> babe_primitives::BabeGenesisConfiguration { + // The choice of `c` parameter (where `1 - c` represents the + // probability of a slot being empty), is done in accordance to the + // slot duration and expected target block time, for safely + // resisting network delays of maximum two seconds. + // + babe_primitives::BabeGenesisConfiguration { + slot_duration: Babe::slot_duration(), + epoch_length: EpochDuration::get(), + c: PRIMARY_PROBABILITY, + genesis_authorities: Babe::authorities(), + randomness: Babe::randomness(), + allowed_slots: babe_primitives::AllowedSlots::PrimaryAndSecondaryPlainSlots, + } + } + + fn current_epoch_start() -> babe_primitives::SlotNumber { + Babe::current_epoch_start() + } + + fn generate_key_ownership_proof( + _slot_number: babe_primitives::SlotNumber, + authority_id: babe_primitives::AuthorityId, + ) -> Option { + use codec::Encode; + + Historical::prove((babe_primitives::KEY_TYPE, authority_id)) + .map(|p| p.encode()) + .map(babe_primitives::OpaqueKeyOwnershipProof::new) + } + + fn submit_report_equivocation_unsigned_extrinsic( + equivocation_proof: babe_primitives::EquivocationProof<::Header>, + key_owner_proof: babe_primitives::OpaqueKeyOwnershipProof, + ) -> Option<()> { + let key_owner_proof = key_owner_proof.decode()?; + + Babe::submit_unsigned_equivocation_report( + equivocation_proof, + key_owner_proof, + ) + } + } + + impl authority_discovery_primitives::AuthorityDiscoveryApi for Runtime { + fn authorities() -> Vec { + AuthorityDiscovery::authorities() + } + } + + impl sp_session::SessionKeys for Runtime { + fn generate_session_keys(seed: Option>) -> Vec { + SessionKeys::generate(seed) + } + + fn decode_session_keys( + encoded: Vec, + ) -> Option, sp_core::crypto::KeyTypeId)>> { + SessionKeys::decode_into_raw_public_keys(&encoded) + } + } + + impl system_rpc_runtime_api::AccountNonceApi for Runtime { + fn account_nonce(account: AccountId) -> Nonce { + System::account_nonce(account) + } + } + + impl transaction_payment_rpc_runtime_api::TransactionPaymentApi< + Block, + Balance, + UncheckedExtrinsic, + > for Runtime { + fn query_info(uxt: UncheckedExtrinsic, len: u32) -> RuntimeDispatchInfo { + TransactionPayment::query_info(uxt, len) + } + } +} +/// Unchecked extrinsic type as expected by this runtime. +pub type UncheckedExtrinsic = generic::UncheckedExtrinsic; +/// Extrinsic type that has already been checked. +pub type CheckedExtrinsic = generic::CheckedExtrinsic; +/// Executive: handles dispatch to the various modules. +pub type Executive = executive::Executive, Runtime, AllModules>; +/// The payload being signed in transactions. +pub type SignedPayload = generic::SignedPayload; + +impl_opaque_keys! { + pub struct SessionKeys { + pub babe: Babe, + pub im_online: ImOnline, + pub parachain_validator: Initializer, + } +} + +construct_runtime! { + pub enum Runtime where + Block = Block, + NodeBlock = primitives::v1::Block, + UncheckedExtrinsic = UncheckedExtrinsic + { + System: system::{Module, Call, Storage, Config, Event}, + + // Must be before session. + Babe: babe::{Module, Call, Storage, Config, Inherent, ValidateUnsigned}, + + Timestamp: timestamp::{Module, Call, Storage, Inherent}, + Indices: indices::{Module, Call, Storage, Config, Event}, + Balances: balances::{Module, Call, Storage, Config, Event}, + TransactionPayment: transaction_payment::{Module, Storage}, + + // Consensus support. + Authorship: authorship::{Module, Call, Storage}, + Staking: staking::{Module, Call, Storage, Config, Event, ValidateUnsigned}, + Offences: offences::{Module, Call, Storage, Event}, + Historical: session_historical::{Module}, + Session: session::{Module, Call, Storage, Event, Config}, + Grandpa: grandpa::{Module, Call, Storage, Config, Event, ValidateUnsigned}, + ImOnline: im_online::{Module, Call, Storage, Event, ValidateUnsigned, Config}, + AuthorityDiscovery: authority_discovery::{Module, Call, Config}, + + // Parachains modules. + Config: parachains_configuration::{Module, Call, Storage}, + Inclusion: parachains_inclusion::{Module, Call, Storage, Event}, + InclusionInherent: parachains_inclusion_inherent::{Module, Call, Storage}, + Scheduler: parachains_scheduler::{Module, Call, Storage}, + Paras: parachains_paras::{Module, Call, Storage}, + Initializer: parachains_initializer::{Module, Call, Storage}, + } +} + +pub struct BaseFilter; +impl Filter for BaseFilter { + fn filter(_call: &Call) -> bool { + true + } +} + +/// Runtime version (Rococo). +pub const VERSION: RuntimeVersion = RuntimeVersion { + spec_name: create_runtime_str!("rococo"), + impl_name: create_runtime_str!("parity-rococo"), + authoring_version: 0, + spec_version: 1, + impl_version: 0, + #[cfg(not(feature = "disable-runtime-api"))] + apis: RUNTIME_API_VERSIONS, + #[cfg(feature = "disable-runtime-api")] + apis: version::create_apis_vec![[]], + transaction_version: 2, +}; + +parameter_types! { + pub const Version: RuntimeVersion = VERSION; +} + +impl system::Trait for Runtime { + type BaseCallFilter = BaseFilter; + type Origin = Origin; + type Call = Call; + type Index = Nonce; + type BlockNumber = BlockNumber; + type Hash = Hash; + type Hashing = BlakeTwo256; + type AccountId = AccountId; + type Lookup = IdentityLookup; + type Header = generic::Header; + type Event = Event; + type BlockHashCount = BlockHashCount; + type MaximumBlockWeight = MaximumBlockWeight; + type DbWeight = RocksDbWeight; + type BlockExecutionWeight = BlockExecutionWeight; + type ExtrinsicBaseWeight = ExtrinsicBaseWeight; + type MaximumExtrinsicWeight = MaximumExtrinsicWeight; + type MaximumBlockLength = MaximumBlockLength; + type AvailableBlockRatio = AvailableBlockRatio; + type Version = Version; + type ModuleToIndex = ModuleToIndex; + type AccountData = balances::AccountData; + type OnNewAccount = (); + type OnKilledAccount = (); + type SystemWeightInfo = (); +} + +parameter_types! { + pub const MaxCodeSize: u32 = 10 * 1024 * 1024; // 10 MB + pub const MaxHeadDataSize: u32 = 20 * 1024; // 20 KB + pub const ValidationUpgradeFrequency: BlockNumber = 2 * DAYS; + pub const ValidationUpgradeDelay: BlockNumber = 8 * HOURS; + pub const SlashPeriod: BlockNumber = 7 * DAYS; +} + +/// Submits a transaction with the node's public and signature type. Adheres to the signed extension +/// format of the chain. +impl system::offchain::CreateSignedTransaction for Runtime where + Call: From, +{ + fn create_transaction>( + call: Call, + public: ::Signer, + account: AccountId, + nonce: ::Index, + ) -> Option<(Call, ::SignaturePayload)> { + // take the biggest period possible. + let period = BlockHashCount::get() + .checked_next_power_of_two() + .map(|c| c / 2) + .unwrap_or(2) as u64; + + let current_block = System::block_number() + .saturated_into::() + // The `System::block_number` is initialized with `n+1`, + // so the actual block number is `n`. + .saturating_sub(1); + let tip = 0; + let extra: SignedExtra = ( + system::CheckSpecVersion::::new(), + system::CheckTxVersion::::new(), + system::CheckGenesis::::new(), + system::CheckMortality::::from(generic::Era::mortal(period, current_block)), + system::CheckNonce::::from(nonce), + system::CheckWeight::::new(), + transaction_payment::ChargeTransactionPayment::::from(tip), + ); + let raw_payload = SignedPayload::new(call, extra).map_err(|e| { + debug::warn!("Unable to create signed payload: {:?}", e); + }).ok()?; + let signature = raw_payload.using_encoded(|payload| { + C::sign(payload, public) + })?; + let (call, extra, _) = raw_payload.deconstruct(); + Some((call, (account, signature, extra))) + } +} + +impl system::offchain::SigningTypes for Runtime { + type Public = ::Signer; + type Signature = Signature; +} + +impl session::historical::Trait for Runtime { + type FullIdentification = staking::Exposure; + type FullIdentificationOf = staking::ExposureOf; +} + +pallet_staking_reward_curve::build! { + const REWARD_CURVE: PiecewiseLinear<'static> = curve!( + min_inflation: 0_025_000, + max_inflation: 0_100_000, + ideal_stake: 0_500_000, + falloff: 0_050_000, + max_piece_count: 40, + test_precision: 0_005_000, + ); +} + +parameter_types! { + // Six sessions in an era (6 hours). + pub const SessionsPerEra: SessionIndex = 6; + // 28 eras for unbonding (7 days). + pub const BondingDuration: staking::EraIndex = 28; + // 27 eras in which slashes can be cancelled (~7 days). + pub const SlashDeferDuration: staking::EraIndex = 27; + pub const RewardCurve: &'static PiecewiseLinear<'static> = &REWARD_CURVE; + pub const MaxNominatorRewardedPerValidator: u32 = 64; + // quarter of the last session will be for election. + pub const ElectionLookahead: BlockNumber = EPOCH_DURATION_IN_BLOCKS / 4; + pub const MaxIterations: u32 = 10; + pub MinSolutionScoreBump: Perbill = Perbill::from_rational_approximation(5u32, 10_000); +} + +parameter_types! { + pub const SessionDuration: BlockNumber = EPOCH_DURATION_IN_BLOCKS as _; +} + +parameter_types! { + pub const StakingUnsignedPriority: TransactionPriority = TransactionPriority::max_value() / 2; + pub const ImOnlineUnsignedPriority: TransactionPriority = TransactionPriority::max_value(); +} + +impl im_online::Trait for Runtime { + type AuthorityId = ImOnlineId; + type Event = Event; + type ReportUnresponsiveness = Offences; + type SessionDuration = SessionDuration; + type UnsignedPriority = StakingUnsignedPriority; + type WeightInfo = (); +} + +impl staking::Trait for Runtime { + type Currency = Balances; + type UnixTime = Timestamp; + type CurrencyToVote = CurrencyToVoteHandler; + type RewardRemainder = (); + type Event = Event; + type Slash = (); + type Reward = (); + type SessionsPerEra = SessionsPerEra; + type BondingDuration = BondingDuration; + type SlashDeferDuration = SlashDeferDuration; + // A majority of the council can cancel the slash. + type SlashCancelOrigin = EnsureRoot; + type SessionInterface = Self; + type RewardCurve = RewardCurve; + type MaxNominatorRewardedPerValidator = MaxNominatorRewardedPerValidator; + type NextNewSession = Session; + type ElectionLookahead = ElectionLookahead; + type Call = Call; + type UnsignedPriority = StakingUnsignedPriority; + type MaxIterations = MaxIterations; + type MinSolutionScoreBump = MinSolutionScoreBump; + type WeightInfo = (); +} + +parameter_types! { + pub const ExistentialDeposit: Balance = 1 * CENTS; +} + +impl balances::Trait for Runtime { + type Balance = Balance; + type DustRemoval = (); + type Event = Event; + type ExistentialDeposit = ExistentialDeposit; + type AccountStore = System; + type WeightInfo = (); +} + +impl system::offchain::SendTransactionTypes for Runtime where + Call: From, +{ + type OverarchingCall = Call; + type Extrinsic = UncheckedExtrinsic; +} + +parameter_types! { + pub const ParathreadDeposit: Balance = 5 * DOLLARS; + pub const QueueSize: usize = 2; + pub const MaxRetries: u32 = 3; +} + +parameter_types! { + pub OffencesWeightSoftLimit: Weight = Perbill::from_percent(60) * MaximumBlockWeight::get(); +} + +impl offences::Trait for Runtime { + type Event = Event; + type IdentificationTuple = session::historical::IdentificationTuple; + type OnOffenceHandler = Staking; + type WeightSoftLimit = OffencesWeightSoftLimit; + type WeightInfo = (); +} + +impl authority_discovery::Trait for Runtime {} + +parameter_types! { + pub const MinimumPeriod: u64 = SLOT_DURATION / 2; +} +impl timestamp::Trait for Runtime { + type Moment = u64; + type OnTimestampSet = Babe; + type MinimumPeriod = MinimumPeriod; + type WeightInfo = (); +} + +parameter_types! { + pub const TransactionByteFee: Balance = 10 * MILLICENTS; +} + +impl transaction_payment::Trait for Runtime { + type Currency = Balances; + type OnTransactionPayment = ToAuthor; + type TransactionByteFee = TransactionByteFee; + type WeightToFee = WeightToFee; + type FeeMultiplierUpdate = SlowAdjustingFeeUpdate; +} + +parameter_types! { + pub const DisabledValidatorsThreshold: Perbill = Perbill::from_percent(17); +} + +impl session::Trait for Runtime { + type Event = Event; + type ValidatorId = AccountId; + type ValidatorIdOf = staking::StashOf; + type ShouldEndSession = Babe; + type NextSessionRotation = Babe; + type SessionManager = session::historical::NoteHistoricalRoot; + type SessionHandler = ::KeyTypeIdProviders; + type Keys = SessionKeys; + type DisabledValidatorsThreshold = DisabledValidatorsThreshold; + type WeightInfo = (); +} + +parameter_types! { + pub const EpochDuration: u64 = EPOCH_DURATION_IN_BLOCKS as u64; + pub const ExpectedBlockTime: Moment = MILLISECS_PER_BLOCK; +} + +impl babe::Trait for Runtime { + type EpochDuration = EpochDuration; + type ExpectedBlockTime = ExpectedBlockTime; + + // session module is the trigger + type EpochChangeTrigger = babe::ExternalTrigger; + + type KeyOwnerProofSystem = Historical; + + type KeyOwnerProof = >::Proof; + + type KeyOwnerIdentification = >::IdentificationTuple; + + type HandleEquivocation = + babe::EquivocationHandler; +} + +parameter_types! { + pub const IndexDeposit: Balance = 1 * DOLLARS; +} + +impl indices::Trait for Runtime { + type AccountIndex = AccountIndex; + type Currency = Balances; + type Deposit = IndexDeposit; + type Event = Event; + type WeightInfo = (); +} + +parameter_types! { + pub const AttestationPeriod: BlockNumber = 50; +} + +impl grandpa::Trait for Runtime { + type Event = Event; + type Call = Call; + + type KeyOwnerProofSystem = Historical; + + type KeyOwnerProof = + >::Proof; + + type KeyOwnerIdentification = >::IdentificationTuple; + + type HandleEquivocation = grandpa::EquivocationHandler; +} + +parameter_types! { + pub const UncleGenerations: u32 = 0; +} + +// TODO: substrate#2986 implement this properly +impl authorship::Trait for Runtime { + type FindAuthor = session::FindAccountFromAuthorIndex; + type UncleGenerations = UncleGenerations; + type FilterUncle = (); + type EventHandler = (Staking, ImOnline); +} + +impl parachains_configuration::Trait for Runtime { } + +impl parachains_inclusion::Trait for Runtime { + type Event = Event; +} + +impl parachains_paras::Trait for Runtime { } + +impl parachains_inclusion_inherent::Trait for Runtime { } + +impl parachains_scheduler::Trait for Runtime { } + +impl parachains_initializer::Trait for Runtime { + type Randomness = Babe; +} -- GitLab From 1e11614a7e0b28ef2607c131c858366716f6a3e0 Mon Sep 17 00:00:00 2001 From: Robert Habermeier Date: Sun, 2 Aug 2020 23:36:07 +0200 Subject: [PATCH 131/192] rename merged rococo to rococo-v1 (#1521) * rename rococo to rococo-v1 * update Cargo.lock --- Cargo.lock | 2 +- Cargo.toml | 2 +- runtime/{rococo => rococo-v1}/Cargo.toml | 2 +- runtime/{rococo => rococo-v1}/build.rs | 0 runtime/{rococo => rococo-v1}/src/constants.rs | 0 runtime/{rococo => rococo-v1}/src/lib.rs | 6 +++--- 6 files changed, 6 insertions(+), 6 deletions(-) rename runtime/{rococo => rococo-v1}/Cargo.toml (99%) rename runtime/{rococo => rococo-v1}/build.rs (100%) rename runtime/{rococo => rococo-v1}/src/constants.rs (100%) rename runtime/{rococo => rococo-v1}/src/lib.rs (99%) diff --git a/Cargo.lock b/Cargo.lock index 402247bd12..a2177bf180 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5994,7 +5994,7 @@ dependencies = [ ] [[package]] -name = "rococo-runtime" +name = "rococo-v1-runtime" version = "0.8.19" dependencies = [ "frame-executive", diff --git a/Cargo.toml b/Cargo.toml index a3f9b295bd..d91a4aef8d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -35,7 +35,7 @@ members = [ "runtime/parachains", "runtime/polkadot", "runtime/kusama", - "runtime/rococo", + "runtime/rococo-v1", "runtime/westend", "runtime/test-runtime", "runtime/test-runtime/client", diff --git a/runtime/rococo/Cargo.toml b/runtime/rococo-v1/Cargo.toml similarity index 99% rename from runtime/rococo/Cargo.toml rename to runtime/rococo-v1/Cargo.toml index be75f7a794..fbd7d617fa 100644 --- a/runtime/rococo/Cargo.toml +++ b/runtime/rococo-v1/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "rococo-runtime" +name = "rococo-v1-runtime" version = "0.8.19" authors = ["Parity Technologies "] edition = "2018" diff --git a/runtime/rococo/build.rs b/runtime/rococo-v1/build.rs similarity index 100% rename from runtime/rococo/build.rs rename to runtime/rococo-v1/build.rs diff --git a/runtime/rococo/src/constants.rs b/runtime/rococo-v1/src/constants.rs similarity index 100% rename from runtime/rococo/src/constants.rs rename to runtime/rococo-v1/src/constants.rs diff --git a/runtime/rococo/src/lib.rs b/runtime/rococo-v1/src/lib.rs similarity index 99% rename from runtime/rococo/src/lib.rs rename to runtime/rococo-v1/src/lib.rs index af530354dd..1f268daea1 100644 --- a/runtime/rococo/src/lib.rs +++ b/runtime/rococo-v1/src/lib.rs @@ -14,7 +14,7 @@ // You should have received a copy of the GNU General Public License // along with Polkadot. If not, see . -//! The Rococo runtime. +//! The Rococo runtime for v1 parachains. #![cfg_attr(not(feature = "std"), no_std)] // `construct_runtime!` does a lot of recursion and requires us to increase the limit to 256. @@ -382,8 +382,8 @@ impl Filter for BaseFilter { /// Runtime version (Rococo). pub const VERSION: RuntimeVersion = RuntimeVersion { - spec_name: create_runtime_str!("rococo"), - impl_name: create_runtime_str!("parity-rococo"), + spec_name: create_runtime_str!("rococo-v1"), + impl_name: create_runtime_str!("parity-rococo-v1"), authoring_version: 0, spec_version: 1, impl_version: 0, -- GitLab From 5679bc89fcf5a97bfef732d0ea89c99dc1280be6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Mon, 3 Aug 2020 11:06:03 +0200 Subject: [PATCH 132/192] Fix transaction payment runtime api companion (#1519) * Fix transaction payment runtime api companion Companion for Substrate pr: https://github.com/paritytech/substrate/pull/6792 * 'Update substrate' Co-authored-by: parity-processbot <> --- Cargo.lock | 275 +++++++++--------- cli/src/command.rs | 3 - collator/src/lib.rs | 15 +- node/service/src/lib.rs | 58 ++-- node/test-service/src/lib.rs | 2 +- .../adder/collator/src/main.rs | 2 +- rpc/src/lib.rs | 10 +- runtime/kusama/src/lib.rs | 3 +- runtime/polkadot/src/lib.rs | 3 +- runtime/rococo-v1/src/lib.rs | 3 +- runtime/test-runtime/src/lib.rs | 3 +- runtime/westend/src/lib.rs | 3 +- service/src/lib.rs | 60 ++-- 13 files changed, 203 insertions(+), 237 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a2177bf180..41c4a1d5c4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1370,7 +1370,7 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "fork-tree" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" +source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" dependencies = [ "parity-scale-codec", ] @@ -1378,7 +1378,7 @@ dependencies = [ [[package]] name = "frame-benchmarking" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" +source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" dependencies = [ "frame-support", "frame-system", @@ -1395,7 +1395,7 @@ dependencies = [ [[package]] name = "frame-benchmarking-cli" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" +source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" dependencies = [ "Inflector", "frame-benchmarking", @@ -1414,7 +1414,7 @@ dependencies = [ [[package]] name = "frame-executive" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" +source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" dependencies = [ "frame-support", "frame-system", @@ -1429,7 +1429,7 @@ dependencies = [ [[package]] name = "frame-metadata" version = "11.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" +source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" dependencies = [ "parity-scale-codec", "serde", @@ -1440,7 +1440,7 @@ dependencies = [ [[package]] name = "frame-support" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" +source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" dependencies = [ "bitmask", "frame-metadata", @@ -1465,7 +1465,7 @@ dependencies = [ [[package]] name = "frame-support-procedural" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" +source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" dependencies = [ "frame-support-procedural-tools", "proc-macro2 1.0.18", @@ -1476,7 +1476,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" +source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" dependencies = [ "frame-support-procedural-tools-derive", "proc-macro-crate", @@ -1488,7 +1488,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools-derive" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" +source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" dependencies = [ "proc-macro2 1.0.18", "quote 1.0.7", @@ -1498,7 +1498,7 @@ dependencies = [ [[package]] name = "frame-system" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" +source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" dependencies = [ "frame-support", "impl-trait-for-tuples", @@ -1514,7 +1514,7 @@ dependencies = [ [[package]] name = "frame-system-benchmarking" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" +source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" dependencies = [ "frame-benchmarking", "frame-support", @@ -1528,7 +1528,7 @@ dependencies = [ [[package]] name = "frame-system-rpc-runtime-api" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" +source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" dependencies = [ "parity-scale-codec", "sp-api", @@ -3542,7 +3542,7 @@ dependencies = [ [[package]] name = "pallet-authority-discovery" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" +source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" dependencies = [ "frame-support", "frame-system", @@ -3558,7 +3558,7 @@ dependencies = [ [[package]] name = "pallet-authorship" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" +source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" dependencies = [ "frame-support", "frame-system", @@ -3573,7 +3573,7 @@ dependencies = [ [[package]] name = "pallet-babe" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" +source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" dependencies = [ "frame-benchmarking", "frame-support", @@ -3598,7 +3598,7 @@ dependencies = [ [[package]] name = "pallet-balances" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" +source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" dependencies = [ "frame-benchmarking", "frame-support", @@ -3612,7 +3612,7 @@ dependencies = [ [[package]] name = "pallet-collective" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" +source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" dependencies = [ "frame-benchmarking", "frame-support", @@ -3628,7 +3628,7 @@ dependencies = [ [[package]] name = "pallet-democracy" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" +source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" dependencies = [ "frame-benchmarking", "frame-support", @@ -3643,7 +3643,7 @@ dependencies = [ [[package]] name = "pallet-elections-phragmen" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" +source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" dependencies = [ "frame-benchmarking", "frame-support", @@ -3658,7 +3658,7 @@ dependencies = [ [[package]] name = "pallet-finality-tracker" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" +source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" dependencies = [ "frame-support", "frame-system", @@ -3674,7 +3674,7 @@ dependencies = [ [[package]] name = "pallet-grandpa" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" +source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" dependencies = [ "frame-benchmarking", "frame-support", @@ -3696,7 +3696,7 @@ dependencies = [ [[package]] name = "pallet-identity" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" +source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" dependencies = [ "enumflags2", "frame-benchmarking", @@ -3712,7 +3712,7 @@ dependencies = [ [[package]] name = "pallet-im-online" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" +source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" dependencies = [ "frame-benchmarking", "frame-support", @@ -3732,7 +3732,7 @@ dependencies = [ [[package]] name = "pallet-indices" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" +source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" dependencies = [ "frame-support", "frame-system", @@ -3748,7 +3748,7 @@ dependencies = [ [[package]] name = "pallet-membership" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" +source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" dependencies = [ "frame-support", "frame-system", @@ -3762,7 +3762,7 @@ dependencies = [ [[package]] name = "pallet-multisig" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" +source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" dependencies = [ "frame-support", "frame-system", @@ -3777,7 +3777,7 @@ dependencies = [ [[package]] name = "pallet-nicks" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" +source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" dependencies = [ "frame-support", "frame-system", @@ -3791,7 +3791,7 @@ dependencies = [ [[package]] name = "pallet-offences" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" +source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" dependencies = [ "frame-support", "frame-system", @@ -3806,7 +3806,7 @@ dependencies = [ [[package]] name = "pallet-offences-benchmarking" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" +source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" dependencies = [ "frame-benchmarking", "frame-support", @@ -3827,7 +3827,7 @@ dependencies = [ [[package]] name = "pallet-proxy" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" +source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" dependencies = [ "frame-support", "frame-system", @@ -3842,7 +3842,7 @@ dependencies = [ [[package]] name = "pallet-randomness-collective-flip" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" +source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" dependencies = [ "frame-support", "frame-system", @@ -3855,7 +3855,7 @@ dependencies = [ [[package]] name = "pallet-recovery" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" +source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" dependencies = [ "enumflags2", "frame-support", @@ -3870,7 +3870,7 @@ dependencies = [ [[package]] name = "pallet-scheduler" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" +source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" dependencies = [ "frame-benchmarking", "frame-support", @@ -3885,7 +3885,7 @@ dependencies = [ [[package]] name = "pallet-session" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" +source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" dependencies = [ "frame-support", "frame-system", @@ -3905,7 +3905,7 @@ dependencies = [ [[package]] name = "pallet-session-benchmarking" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" +source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" dependencies = [ "frame-benchmarking", "frame-support", @@ -3921,7 +3921,7 @@ dependencies = [ [[package]] name = "pallet-society" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" +source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" dependencies = [ "frame-support", "frame-system", @@ -3935,7 +3935,7 @@ dependencies = [ [[package]] name = "pallet-staking" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" +source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" dependencies = [ "frame-benchmarking", "frame-support", @@ -3957,7 +3957,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-curve" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" +source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -3968,7 +3968,7 @@ dependencies = [ [[package]] name = "pallet-sudo" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" +source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" dependencies = [ "frame-support", "frame-system", @@ -3982,7 +3982,7 @@ dependencies = [ [[package]] name = "pallet-timestamp" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" +source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" dependencies = [ "frame-benchmarking", "frame-support", @@ -4000,7 +4000,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" +source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" dependencies = [ "frame-support", "frame-system", @@ -4017,7 +4017,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" +source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" dependencies = [ "jsonrpc-core", "jsonrpc-core-client", @@ -4035,7 +4035,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc-runtime-api" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" +source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" dependencies = [ "frame-support", "parity-scale-codec", @@ -4048,7 +4048,7 @@ dependencies = [ [[package]] name = "pallet-treasury" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" +source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" dependencies = [ "frame-benchmarking", "frame-support", @@ -4063,7 +4063,7 @@ dependencies = [ [[package]] name = "pallet-utility" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" +source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" dependencies = [ "frame-benchmarking", "frame-support", @@ -4079,7 +4079,7 @@ dependencies = [ [[package]] name = "pallet-vesting" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" +source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" dependencies = [ "enumflags2", "frame-benchmarking", @@ -6149,7 +6149,7 @@ dependencies = [ [[package]] name = "sc-authority-discovery" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" +source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" dependencies = [ "bytes 0.5.5", "derive_more 0.99.9", @@ -6176,7 +6176,7 @@ dependencies = [ [[package]] name = "sc-basic-authorship" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" +source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6200,7 +6200,7 @@ dependencies = [ [[package]] name = "sc-block-builder" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" +source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" dependencies = [ "parity-scale-codec", "sc-client-api", @@ -6217,7 +6217,7 @@ dependencies = [ [[package]] name = "sc-chain-spec" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" +source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" dependencies = [ "impl-trait-for-tuples", "sc-chain-spec-derive", @@ -6233,7 +6233,7 @@ dependencies = [ [[package]] name = "sc-chain-spec-derive" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" +source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -6244,7 +6244,7 @@ dependencies = [ [[package]] name = "sc-cli" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" +source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" dependencies = [ "ansi_term 0.12.1", "atty", @@ -6285,7 +6285,7 @@ dependencies = [ [[package]] name = "sc-client-api" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" +source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" dependencies = [ "derive_more 0.99.9", "fnv", @@ -6321,7 +6321,7 @@ dependencies = [ [[package]] name = "sc-client-db" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" +source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" dependencies = [ "blake2-rfc", "hash-db", @@ -6337,6 +6337,7 @@ dependencies = [ "sc-client-api", "sc-executor", "sc-state-db", + "sp-arithmetic", "sp-blockchain", "sp-consensus", "sp-core", @@ -6350,7 +6351,7 @@ dependencies = [ [[package]] name = "sc-consensus" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" +source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" dependencies = [ "sc-client-api", "sp-blockchain", @@ -6361,7 +6362,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" +source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" dependencies = [ "derive_more 0.99.9", "fork-tree", @@ -6405,7 +6406,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe-rpc" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" +source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -6429,7 +6430,7 @@ dependencies = [ [[package]] name = "sc-consensus-epochs" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" +source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" dependencies = [ "fork-tree", "parity-scale-codec", @@ -6442,7 +6443,7 @@ dependencies = [ [[package]] name = "sc-consensus-slots" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" +source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6465,7 +6466,7 @@ dependencies = [ [[package]] name = "sc-consensus-uncles" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" +source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" dependencies = [ "log 0.4.8", "sc-client-api", @@ -6479,7 +6480,7 @@ dependencies = [ [[package]] name = "sc-executor" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" +source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" dependencies = [ "derive_more 0.99.9", "lazy_static", @@ -6507,7 +6508,7 @@ dependencies = [ [[package]] name = "sc-executor-common" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" +source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" dependencies = [ "derive_more 0.99.9", "log 0.4.8", @@ -6524,7 +6525,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmi" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" +source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" dependencies = [ "log 0.4.8", "parity-scale-codec", @@ -6539,7 +6540,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmtime" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" +source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" dependencies = [ "cranelift-codegen", "cranelift-wasm", @@ -6560,7 +6561,7 @@ dependencies = [ [[package]] name = "sc-finality-grandpa" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" +source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" dependencies = [ "assert_matches", "derive_more 0.99.9", @@ -6598,7 +6599,7 @@ dependencies = [ [[package]] name = "sc-finality-grandpa-rpc" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" +source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" dependencies = [ "derive_more 0.99.9", "finality-grandpa", @@ -6615,7 +6616,7 @@ dependencies = [ [[package]] name = "sc-informant" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" +source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" dependencies = [ "ansi_term 0.12.1", "futures 0.3.5", @@ -6633,7 +6634,7 @@ dependencies = [ [[package]] name = "sc-keystore" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" +source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" dependencies = [ "derive_more 0.99.9", "hex", @@ -6649,7 +6650,7 @@ dependencies = [ [[package]] name = "sc-light" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" +source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" dependencies = [ "hash-db", "lazy_static", @@ -6668,7 +6669,7 @@ dependencies = [ [[package]] name = "sc-network" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" +source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" dependencies = [ "bitflags", "bs58", @@ -6720,7 +6721,7 @@ dependencies = [ [[package]] name = "sc-network-gossip" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" +source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6735,7 +6736,7 @@ dependencies = [ [[package]] name = "sc-network-test" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" +source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" dependencies = [ "env_logger", "futures 0.3.5", @@ -6762,7 +6763,7 @@ dependencies = [ [[package]] name = "sc-offchain" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" +source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" dependencies = [ "bytes 0.5.5", "fnv", @@ -6789,7 +6790,7 @@ dependencies = [ [[package]] name = "sc-peerset" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" +source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" dependencies = [ "futures 0.3.5", "libp2p", @@ -6802,7 +6803,7 @@ dependencies = [ [[package]] name = "sc-proposer-metrics" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" +source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" dependencies = [ "log 0.4.8", "substrate-prometheus-endpoint", @@ -6811,7 +6812,7 @@ dependencies = [ [[package]] name = "sc-rpc" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" +source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" dependencies = [ "futures 0.3.5", "hash-db", @@ -6843,7 +6844,7 @@ dependencies = [ [[package]] name = "sc-rpc-api" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" +source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -6867,7 +6868,7 @@ dependencies = [ [[package]] name = "sc-rpc-server" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" +source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" dependencies = [ "jsonrpc-core", "jsonrpc-http-server", @@ -6883,7 +6884,7 @@ dependencies = [ [[package]] name = "sc-service" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" +source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" dependencies = [ "derive_more 0.99.9", "directories", @@ -6946,7 +6947,7 @@ dependencies = [ [[package]] name = "sc-state-db" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" +source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" dependencies = [ "log 0.4.8", "parity-scale-codec", @@ -6960,7 +6961,7 @@ dependencies = [ [[package]] name = "sc-telemetry" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" +source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6981,7 +6982,7 @@ dependencies = [ [[package]] name = "sc-tracing" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" +source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" dependencies = [ "erased-serde", "log 0.4.8", @@ -6998,7 +6999,7 @@ dependencies = [ [[package]] name = "sc-transaction-graph" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" +source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -7019,7 +7020,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" +source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -7474,7 +7475,7 @@ dependencies = [ [[package]] name = "sp-allocator" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" +source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" dependencies = [ "derive_more 0.99.9", "log 0.4.8", @@ -7486,7 +7487,7 @@ dependencies = [ [[package]] name = "sp-api" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" +source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" dependencies = [ "hash-db", "parity-scale-codec", @@ -7501,7 +7502,7 @@ dependencies = [ [[package]] name = "sp-api-proc-macro" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" +source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" dependencies = [ "blake2-rfc", "proc-macro-crate", @@ -7513,7 +7514,7 @@ dependencies = [ [[package]] name = "sp-application-crypto" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" +source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" dependencies = [ "parity-scale-codec", "serde", @@ -7525,7 +7526,7 @@ dependencies = [ [[package]] name = "sp-arithmetic" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" +source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" dependencies = [ "integer-sqrt", "num-traits 0.2.12", @@ -7538,7 +7539,7 @@ dependencies = [ [[package]] name = "sp-authority-discovery" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" +source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" dependencies = [ "parity-scale-codec", "sp-api", @@ -7550,7 +7551,7 @@ dependencies = [ [[package]] name = "sp-authorship" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" +source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" dependencies = [ "parity-scale-codec", "sp-inherents", @@ -7561,7 +7562,7 @@ dependencies = [ [[package]] name = "sp-block-builder" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" +source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" dependencies = [ "parity-scale-codec", "sp-api", @@ -7573,7 +7574,7 @@ dependencies = [ [[package]] name = "sp-blockchain" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" +source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" dependencies = [ "derive_more 0.99.9", "log 0.4.8", @@ -7590,7 +7591,7 @@ dependencies = [ [[package]] name = "sp-chain-spec" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" +source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" dependencies = [ "serde", "serde_json", @@ -7599,7 +7600,7 @@ dependencies = [ [[package]] name = "sp-consensus" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" +source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -7625,7 +7626,7 @@ dependencies = [ [[package]] name = "sp-consensus-aura" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" +source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" dependencies = [ "parity-scale-codec", "sp-api", @@ -7639,7 +7640,7 @@ dependencies = [ [[package]] name = "sp-consensus-babe" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" +source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" dependencies = [ "merlin", "parity-scale-codec", @@ -7658,7 +7659,7 @@ dependencies = [ [[package]] name = "sp-consensus-slots" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" +source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" dependencies = [ "parity-scale-codec", "sp-runtime", @@ -7667,7 +7668,7 @@ dependencies = [ [[package]] name = "sp-consensus-vrf" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" +source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" dependencies = [ "parity-scale-codec", "schnorrkel", @@ -7679,7 +7680,7 @@ dependencies = [ [[package]] name = "sp-core" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" +source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" dependencies = [ "base58", "blake2-rfc", @@ -7723,7 +7724,7 @@ dependencies = [ [[package]] name = "sp-database" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" +source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" dependencies = [ "kvdb", "parking_lot 0.10.2", @@ -7732,7 +7733,7 @@ dependencies = [ [[package]] name = "sp-debug-derive" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" +source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" dependencies = [ "proc-macro2 1.0.18", "quote 1.0.7", @@ -7742,7 +7743,7 @@ dependencies = [ [[package]] name = "sp-externalities" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" +source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" dependencies = [ "environmental", "parity-scale-codec", @@ -7753,7 +7754,7 @@ dependencies = [ [[package]] name = "sp-finality-grandpa" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" +source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" dependencies = [ "finality-grandpa", "log 0.4.8", @@ -7769,7 +7770,7 @@ dependencies = [ [[package]] name = "sp-finality-tracker" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" +source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" dependencies = [ "parity-scale-codec", "sp-inherents", @@ -7779,7 +7780,7 @@ dependencies = [ [[package]] name = "sp-inherents" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" +source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" dependencies = [ "derive_more 0.99.9", "parity-scale-codec", @@ -7791,7 +7792,7 @@ dependencies = [ [[package]] name = "sp-io" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" +source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" dependencies = [ "futures 0.3.5", "hash-db", @@ -7812,7 +7813,7 @@ dependencies = [ [[package]] name = "sp-keyring" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" +source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" dependencies = [ "lazy_static", "sp-core", @@ -7823,7 +7824,7 @@ dependencies = [ [[package]] name = "sp-npos-elections" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" +source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" dependencies = [ "parity-scale-codec", "serde", @@ -7835,7 +7836,7 @@ dependencies = [ [[package]] name = "sp-npos-elections-compact" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" +source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -7846,7 +7847,7 @@ dependencies = [ [[package]] name = "sp-offchain" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" +source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" dependencies = [ "sp-api", "sp-core", @@ -7856,7 +7857,7 @@ dependencies = [ [[package]] name = "sp-panic-handler" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" +source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" dependencies = [ "backtrace", "log 0.4.8", @@ -7865,7 +7866,7 @@ dependencies = [ [[package]] name = "sp-rpc" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" +source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" dependencies = [ "serde", "sp-core", @@ -7874,7 +7875,7 @@ dependencies = [ [[package]] name = "sp-runtime" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" +source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" dependencies = [ "either", "hash256-std-hasher", @@ -7896,7 +7897,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" +source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" dependencies = [ "parity-scale-codec", "primitive-types", @@ -7911,7 +7912,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" +source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" dependencies = [ "Inflector", "proc-macro-crate", @@ -7923,7 +7924,7 @@ dependencies = [ [[package]] name = "sp-serializer" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" +source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" dependencies = [ "serde", "serde_json", @@ -7932,7 +7933,7 @@ dependencies = [ [[package]] name = "sp-session" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" +source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" dependencies = [ "parity-scale-codec", "sp-api", @@ -7945,7 +7946,7 @@ dependencies = [ [[package]] name = "sp-staking" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" +source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" dependencies = [ "parity-scale-codec", "sp-runtime", @@ -7955,7 +7956,7 @@ dependencies = [ [[package]] name = "sp-state-machine" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" +source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" dependencies = [ "hash-db", "itertools 0.9.0", @@ -7976,12 +7977,12 @@ dependencies = [ [[package]] name = "sp-std" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" +source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" [[package]] name = "sp-storage" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" +source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" dependencies = [ "impl-serde 0.2.3", "ref-cast", @@ -7993,7 +7994,7 @@ dependencies = [ [[package]] name = "sp-timestamp" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" +source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -8007,7 +8008,7 @@ dependencies = [ [[package]] name = "sp-tracing" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" +source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" dependencies = [ "log 0.4.8", "rental", @@ -8017,7 +8018,7 @@ dependencies = [ [[package]] name = "sp-transaction-pool" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" +source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -8032,7 +8033,7 @@ dependencies = [ [[package]] name = "sp-trie" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" +source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" dependencies = [ "hash-db", "memory-db", @@ -8046,7 +8047,7 @@ dependencies = [ [[package]] name = "sp-utils" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" +source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" dependencies = [ "futures 0.3.5", "futures-core", @@ -8058,7 +8059,7 @@ dependencies = [ [[package]] name = "sp-version" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" +source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" dependencies = [ "impl-serde 0.2.3", "parity-scale-codec", @@ -8070,7 +8071,7 @@ dependencies = [ [[package]] name = "sp-wasm-interface" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" +source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -8201,7 +8202,7 @@ dependencies = [ [[package]] name = "substrate-browser-utils" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" +source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" dependencies = [ "chrono", "console_error_panic_hook", @@ -8227,7 +8228,7 @@ dependencies = [ [[package]] name = "substrate-build-script-utils" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" +source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" dependencies = [ "platforms", ] @@ -8235,7 +8236,7 @@ dependencies = [ [[package]] name = "substrate-frame-rpc-system" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" +source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" dependencies = [ "frame-system-rpc-runtime-api", "futures 0.3.5", @@ -8258,7 +8259,7 @@ dependencies = [ [[package]] name = "substrate-prometheus-endpoint" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" +source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" dependencies = [ "async-std", "derive_more 0.99.9", @@ -8272,7 +8273,7 @@ dependencies = [ [[package]] name = "substrate-test-client" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" +source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" dependencies = [ "futures 0.1.29", "futures 0.3.5", @@ -8298,7 +8299,7 @@ dependencies = [ [[package]] name = "substrate-test-runtime" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" +source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" dependencies = [ "cfg-if", "frame-executive", @@ -8338,7 +8339,7 @@ dependencies = [ [[package]] name = "substrate-test-runtime-client" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" +source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" dependencies = [ "futures 0.3.5", "parity-scale-codec", @@ -8359,7 +8360,7 @@ dependencies = [ [[package]] name = "substrate-wasm-builder-runner" version = "1.0.6" -source = "git+https://github.com/paritytech/substrate#87063c3c00da34213379330bae3174aa0da7ad0f" +source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" [[package]] name = "substrate-wasm-builder-runner" diff --git a/cli/src/command.rs b/cli/src/command.rs index ab57fc4489..31880768a1 100644 --- a/cli/src/command.rs +++ b/cli/src/command.rs @@ -153,7 +153,6 @@ pub fn run() -> Result<()> { service::new_chain_ops::< service::kusama_runtime::RuntimeApi, service::KusamaExecutor, - service::kusama_runtime::UncheckedExtrinsic, >(config) ) } else if chain_spec.is_westend() { @@ -161,7 +160,6 @@ pub fn run() -> Result<()> { service::new_chain_ops::< service::westend_runtime::RuntimeApi, service::WestendExecutor, - service::westend_runtime::UncheckedExtrinsic, >(config) ) } else { @@ -169,7 +167,6 @@ pub fn run() -> Result<()> { service::new_chain_ops::< service::polkadot_runtime::RuntimeApi, service::PolkadotExecutor, - service::polkadot_runtime::UncheckedExtrinsic, >(config) ) } diff --git a/collator/src/lib.rs b/collator/src/lib.rs index 37a56afd9d..3eee4aba1e 100644 --- a/collator/src/lib.rs +++ b/collator/src/lib.rs @@ -121,7 +121,7 @@ pub trait BuildParachainContext { type ParachainContext: self::ParachainContext; /// Build the `ParachainContext`. - fn build( + fn build( self, client: Arc, spawner: SP, @@ -129,9 +129,8 @@ pub trait BuildParachainContext { ) -> Result where Client: ProvideRuntimeApi + HeaderBackend + BlockchainEvents + Send + Sync + 'static, - Client::Api: RuntimeApiCollection, + Client::Api: RuntimeApiCollection, >::StateBackend: StateBackend>, - Extrinsic: codec::Codec + Send + Sync + 'static, SP: SpawnNamed + Clone + Send + Sync + 'static; } @@ -203,7 +202,7 @@ pub async fn collate

( } #[cfg(feature = "service-rewr")] -fn build_collator_service( +fn build_collator_service( _spawner: SP, _handles: FullNodeHandles, _client: Arc, @@ -224,14 +223,12 @@ fn build_collator_service( StateBackend = as service::Backend>::State, > + RuntimeApiCollection< - Extrinsic, StateBackend = as service::Backend>::State, > + Sync + Send, P: BuildParachainContext, P::ParachainContext: Send + 'static, ::ProduceCandidate: Send, - Extrinsic: service::Codec + Send + Sync + 'static, SP: SpawnNamed + Clone + Send + Sync + 'static, { Err("Collator is not functional with the new service yet".into()) @@ -239,7 +236,7 @@ fn build_collator_service( #[cfg(not(feature = "service-rewr"))] -fn build_collator_service( +fn build_collator_service( spawner: SpawnTaskHandle, handles: FullNodeHandles, client: Arc, @@ -260,14 +257,12 @@ fn build_collator_service( StateBackend = as service::Backend>::State, > + RuntimeApiCollection< - Extrinsic, StateBackend = as service::Backend>::State, > + Sync + Send, P: BuildParachainContext, P::ParachainContext: Send + 'static, ::ProduceCandidate: Send, - Extrinsic: service::Codec + Send + Sync + 'static, { let polkadot_network = handles.polkadot_network .ok_or_else(|| "Collator cannot run when Polkadot-specific networking has not been started")?; @@ -497,7 +492,7 @@ mod tests { impl BuildParachainContext for BuildDummyParachainContext { type ParachainContext = DummyParachainContext; - fn build( + fn build( self, _: Arc, _: SP, diff --git a/node/service/src/lib.rs b/node/service/src/lib.rs index c04e9a10b1..01c70f5785 100644 --- a/node/service/src/lib.rs +++ b/node/service/src/lib.rs @@ -78,24 +78,23 @@ native_executor_instance!( ); /// A set of APIs that polkadot-like runtimes must implement. -pub trait RuntimeApiCollection: +pub trait RuntimeApiCollection: sp_transaction_pool::runtime_api::TaggedTransactionQueue + sp_api::ApiExt + babe_primitives::BabeApi + grandpa_primitives::GrandpaApi + sp_block_builder::BlockBuilder + system_rpc_runtime_api::AccountNonceApi - + pallet_transaction_payment_rpc_runtime_api::TransactionPaymentApi + + pallet_transaction_payment_rpc_runtime_api::TransactionPaymentApi + sp_api::Metadata + sp_offchain::OffchainWorkerApi + sp_session::SessionKeys + authority_discovery_primitives::AuthorityDiscoveryApi where - Extrinsic: RuntimeExtrinsic, >::StateBackend: sp_api::StateBackend>, {} -impl RuntimeApiCollection for Api +impl RuntimeApiCollection for Api where Api: sp_transaction_pool::runtime_api::TaggedTransactionQueue @@ -104,19 +103,14 @@ where + grandpa_primitives::GrandpaApi + sp_block_builder::BlockBuilder + system_rpc_runtime_api::AccountNonceApi - + pallet_transaction_payment_rpc_runtime_api::TransactionPaymentApi + + pallet_transaction_payment_rpc_runtime_api::TransactionPaymentApi + sp_api::Metadata + sp_offchain::OffchainWorkerApi + sp_session::SessionKeys + authority_discovery_primitives::AuthorityDiscoveryApi, - Extrinsic: RuntimeExtrinsic, >::StateBackend: sp_api::StateBackend>, {} -pub trait RuntimeExtrinsic: codec::Codec + Send + Sync + 'static {} - -impl RuntimeExtrinsic for E where E: codec::Codec + Send + Sync + 'static {} - /// Can be called for a `Configuration` to check if it is a configuration for the `Kusama` network. pub trait IdentifyVariant { /// Returns if this is a configuration for the `Kusama` network. @@ -157,7 +151,7 @@ type LightClient = service::TLightClientWithBackend; #[cfg(feature = "full-node")] -fn new_partial(config: &mut Configuration) -> Result< +fn new_partial(config: &mut Configuration) -> Result< service::PartialComponents< FullClient, FullBackend, FullSelectChain, consensus_common::DefaultImportQueue>, @@ -179,9 +173,8 @@ fn new_partial(config: &mut Configuration) -> R where RuntimeApi: ConstructRuntimeApi> + Send + Sync + 'static, RuntimeApi::RuntimeApi: - RuntimeApiCollection>, + RuntimeApiCollection>, Executor: NativeExecutionDispatch + 'static, - Extrinsic: RuntimeExtrinsic, { set_prometheus_registry(config)?; @@ -303,7 +296,7 @@ fn real_overseer( } #[cfg(feature = "full-node")] -fn new_full( +fn new_full( mut config: Configuration, collating_for: Option<(CollatorId, ParaId)>, _max_block_data_size: Option, @@ -317,9 +310,8 @@ fn new_full( where RuntimeApi: ConstructRuntimeApi> + Send + Sync + 'static, RuntimeApi::RuntimeApi: - RuntimeApiCollection>, + RuntimeApiCollection>, Executor: NativeExecutionDispatch + 'static, - Extrinsic: RuntimeExtrinsic, { use sc_client_api::ExecutorProvider; use sp_core::traits::BareCryptoStorePtr; @@ -335,8 +327,8 @@ fn new_full( client, backend, mut task_manager, keystore, select_chain, import_queue, transaction_pool, inherent_data_providers, other: (rpc_extensions_builder, import_setup, rpc_setup) - } = new_partial::(&mut config)?; - + } = new_partial::(&mut config)?; + let prometheus_registry = config.prometheus_registry().cloned(); let finality_proof_provider = @@ -525,13 +517,12 @@ fn new_full( pub struct FullNodeHandles; /// Builds a new service for a light client. -fn new_light(mut config: Configuration) -> Result +fn new_light(mut config: Configuration) -> Result where Runtime: 'static + Send + Sync + ConstructRuntimeApi>, >>::RuntimeApi: - RuntimeApiCollection>, + RuntimeApiCollection>, Dispatch: NativeExecutionDispatch + 'static, - Extrinsic: RuntimeExtrinsic, { crate::set_prometheus_registry(&mut config)?; use sc_client_api::backend::RemoteBackend; @@ -594,7 +585,7 @@ fn new_light(mut config: Configuration) -> Result< finality_proof_request_builder: Some(finality_proof_request_builder), finality_proof_provider: Some(finality_proof_provider), })?; - + if config.offchain_worker.enabled { service::build_offchain_workers( &config, backend.clone(), task_manager.spawn_handle(), client.clone(), network.clone(), @@ -610,7 +601,7 @@ fn new_light(mut config: Configuration) -> Result< let rpc_extensions = polkadot_rpc::create_light(light_deps); - service::spawn_tasks(service::SpawnTasksParams { + service::spawn_tasks(service::SpawnTasksParams { on_demand: Some(on_demand), remote_blockchain: Some(backend.remote_blockchain()), rpc_extensions_builder: Box::new(service::NoopRpcExtensionBuilder(rpc_extensions)), @@ -619,13 +610,13 @@ fn new_light(mut config: Configuration) -> Result< config, keystore, backend, transaction_pool, client, network, network_status_sinks, system_rpc_tx, })?; - + Ok(task_manager) } /// Builds a new object suitable for chain operations. #[cfg(feature = "full-node")] -pub fn new_chain_ops(mut config: Configuration) -> Result< +pub fn new_chain_ops(mut config: Configuration) -> Result< ( Arc>, Arc, @@ -637,13 +628,12 @@ pub fn new_chain_ops(mut config: Configuration) -> where Runtime: ConstructRuntimeApi> + Send + Sync + 'static, Runtime::RuntimeApi: - RuntimeApiCollection>, + RuntimeApiCollection>, Dispatch: NativeExecutionDispatch + 'static, - Extrinsic: RuntimeExtrinsic, { config.keystore = service::config::KeystoreConfig::InMemory; let service::PartialComponents { client, backend, import_queue, task_manager, .. } - = new_partial::(&mut config)?; + = new_partial::(&mut config)?; Ok((client, backend, import_queue, task_manager)) } @@ -667,7 +657,7 @@ pub fn polkadot_new_full( FullNodeHandles, ), ServiceError> { - let (components, client) = new_full::( + let (components, client) = new_full::( config, collating_for, max_block_data_size, @@ -699,7 +689,7 @@ pub fn kusama_new_full( FullNodeHandles, ), ServiceError> { - let (components, client) = new_full::( + let (components, client) = new_full::( config, collating_for, max_block_data_size, @@ -731,7 +721,7 @@ pub fn westend_new_full( FullNodeHandles, ), ServiceError> { - let (components, client) = new_full::( + let (components, client) = new_full::( config, collating_for, max_block_data_size, @@ -746,17 +736,17 @@ pub fn westend_new_full( /// Create a new Polkadot service for a light client. pub fn polkadot_new_light(config: Configuration) -> Result { - new_light::(config) + new_light::(config) } /// Create a new Kusama service for a light client. pub fn kusama_new_light(config: Configuration) -> Result { - new_light::(config) + new_light::(config) } /// Create a new Westend service for a light client. pub fn westend_new_light(config: Configuration, ) -> Result { - new_light::(config) + new_light::(config) } diff --git a/node/test-service/src/lib.rs b/node/test-service/src/lib.rs index 3bdc741bac..e45b931464 100644 --- a/node/test-service/src/lib.rs +++ b/node/test-service/src/lib.rs @@ -77,7 +77,7 @@ pub fn polkadot_test_new_full( ServiceError, > { let (task_manager, client, handles, network, rpc_handlers) = - new_full::( + new_full::( config, collating_for, max_block_data_size, diff --git a/parachain/test-parachains/adder/collator/src/main.rs b/parachain/test-parachains/adder/collator/src/main.rs index a5d3bb6dc1..9136cc0ca9 100644 --- a/parachain/test-parachains/adder/collator/src/main.rs +++ b/parachain/test-parachains/adder/collator/src/main.rs @@ -100,7 +100,7 @@ impl ParachainContext for AdderContext { impl BuildParachainContext for AdderContext { type ParachainContext = Self; - fn build( + fn build( self, _: Arc, _: SP, diff --git a/rpc/src/lib.rs b/rpc/src/lib.rs index dbff9b0776..b09c1b5d42 100644 --- a/rpc/src/lib.rs +++ b/rpc/src/lib.rs @@ -81,16 +81,15 @@ pub struct FullDeps { } /// Instantiate all RPC extensions. -pub fn create_full(deps: FullDeps) -> RpcExtension where +pub fn create_full(deps: FullDeps) -> RpcExtension where C: ProvideRuntimeApi, C: HeaderBackend + HeaderMetadata, C: Send + Sync + 'static, C::Api: frame_rpc_system::AccountNonceApi, - C::Api: pallet_transaction_payment_rpc::TransactionPaymentRuntimeApi, + C::Api: pallet_transaction_payment_rpc::TransactionPaymentRuntimeApi, C::Api: BabeApi, C::Api: BlockBuilder, P: TransactionPool + Sync + Send + 'static, - UE: codec::Codec + Send + Sync + 'static, SC: SelectChain + 'static, { use frame_rpc_system::{FullSystem, SystemApi}; @@ -145,16 +144,15 @@ pub fn create_full(deps: FullDeps) -> RpcExtension where } /// Instantiate all RPC extensions for light node. -pub fn create_light(deps: LightDeps) -> RpcExtension +pub fn create_light(deps: LightDeps) -> RpcExtension where C: ProvideRuntimeApi, C: HeaderBackend, C: Send + Sync + 'static, C::Api: frame_rpc_system::AccountNonceApi, - C::Api: pallet_transaction_payment_rpc::TransactionPaymentRuntimeApi, + C::Api: pallet_transaction_payment_rpc::TransactionPaymentRuntimeApi, P: TransactionPool + Sync + Send + 'static, F: Fetcher + 'static, - UE: codec::Codec + Send + Sync + 'static, { use frame_rpc_system::{LightSystem, SystemApi}; diff --git a/runtime/kusama/src/lib.rs b/runtime/kusama/src/lib.rs index 89507400a7..cacac8202b 100644 --- a/runtime/kusama/src/lib.rs +++ b/runtime/kusama/src/lib.rs @@ -1254,9 +1254,8 @@ sp_api::impl_runtime_apis! { impl transaction_payment_rpc_runtime_api::TransactionPaymentApi< Block, Balance, - UncheckedExtrinsic, > for Runtime { - fn query_info(uxt: UncheckedExtrinsic, len: u32) -> RuntimeDispatchInfo { + fn query_info(uxt: ::Extrinsic, len: u32) -> RuntimeDispatchInfo { TransactionPayment::query_info(uxt, len) } } diff --git a/runtime/polkadot/src/lib.rs b/runtime/polkadot/src/lib.rs index 1a922dc72e..ec3fa30434 100644 --- a/runtime/polkadot/src/lib.rs +++ b/runtime/polkadot/src/lib.rs @@ -1394,9 +1394,8 @@ sp_api::impl_runtime_apis! { impl transaction_payment_rpc_runtime_api::TransactionPaymentApi< Block, Balance, - UncheckedExtrinsic, > for Runtime { - fn query_info(uxt: UncheckedExtrinsic, len: u32) -> RuntimeDispatchInfo { + fn query_info(uxt: ::Extrinsic, len: u32) -> RuntimeDispatchInfo { TransactionPayment::query_info(uxt, len) } } diff --git a/runtime/rococo-v1/src/lib.rs b/runtime/rococo-v1/src/lib.rs index 1f268daea1..7ca90c0399 100644 --- a/runtime/rococo-v1/src/lib.rs +++ b/runtime/rococo-v1/src/lib.rs @@ -313,9 +313,8 @@ sp_api::impl_runtime_apis! { impl transaction_payment_rpc_runtime_api::TransactionPaymentApi< Block, Balance, - UncheckedExtrinsic, > for Runtime { - fn query_info(uxt: UncheckedExtrinsic, len: u32) -> RuntimeDispatchInfo { + fn query_info(uxt: ::Extrinsic, len: u32) -> RuntimeDispatchInfo { TransactionPayment::query_info(uxt, len) } } diff --git a/runtime/test-runtime/src/lib.rs b/runtime/test-runtime/src/lib.rs index 4704ff0fb0..d7238b6482 100644 --- a/runtime/test-runtime/src/lib.rs +++ b/runtime/test-runtime/src/lib.rs @@ -788,9 +788,8 @@ sp_api::impl_runtime_apis! { impl pallet_transaction_payment_rpc_runtime_api::TransactionPaymentApi< Block, Balance, - UncheckedExtrinsic, > for Runtime { - fn query_info(uxt: UncheckedExtrinsic, len: u32) -> RuntimeDispatchInfo { + fn query_info(uxt: ::Extrinsic, len: u32) -> RuntimeDispatchInfo { TransactionPayment::query_info(uxt, len) } } diff --git a/runtime/westend/src/lib.rs b/runtime/westend/src/lib.rs index 93742b02c5..c5d3669d0f 100644 --- a/runtime/westend/src/lib.rs +++ b/runtime/westend/src/lib.rs @@ -1036,9 +1036,8 @@ sp_api::impl_runtime_apis! { impl transaction_payment_rpc_runtime_api::TransactionPaymentApi< Block, Balance, - UncheckedExtrinsic, > for Runtime { - fn query_info(uxt: UncheckedExtrinsic, len: u32) -> RuntimeDispatchInfo { + fn query_info(uxt: ::Extrinsic, len: u32) -> RuntimeDispatchInfo { TransactionPayment::query_info(uxt, len) } } diff --git a/service/src/lib.rs b/service/src/lib.rs index 22a99d7be4..2aaa2971fd 100644 --- a/service/src/lib.rs +++ b/service/src/lib.rs @@ -76,7 +76,7 @@ native_executor_instance!( ); /// A set of APIs that polkadot-like runtimes must implement. -pub trait RuntimeApiCollection: +pub trait RuntimeApiCollection: sp_transaction_pool::runtime_api::TaggedTransactionQueue + sp_api::ApiExt + babe_primitives::BabeApi @@ -84,17 +84,16 @@ pub trait RuntimeApiCollection: + ParachainHost + sp_block_builder::BlockBuilder + system_rpc_runtime_api::AccountNonceApi - + pallet_transaction_payment_rpc_runtime_api::TransactionPaymentApi + + pallet_transaction_payment_rpc_runtime_api::TransactionPaymentApi + sp_api::Metadata + sp_offchain::OffchainWorkerApi + sp_session::SessionKeys + authority_discovery_primitives::AuthorityDiscoveryApi where - Extrinsic: RuntimeExtrinsic, >::StateBackend: sp_api::StateBackend, {} -impl RuntimeApiCollection for Api +impl RuntimeApiCollection for Api where Api: sp_transaction_pool::runtime_api::TaggedTransactionQueue @@ -104,19 +103,14 @@ where + ParachainHost + sp_block_builder::BlockBuilder + system_rpc_runtime_api::AccountNonceApi - + pallet_transaction_payment_rpc_runtime_api::TransactionPaymentApi + + pallet_transaction_payment_rpc_runtime_api::TransactionPaymentApi + sp_api::Metadata + sp_offchain::OffchainWorkerApi + sp_session::SessionKeys + authority_discovery_primitives::AuthorityDiscoveryApi, - Extrinsic: RuntimeExtrinsic, >::StateBackend: sp_api::StateBackend, {} -pub trait RuntimeExtrinsic: codec::Codec + Send + Sync + 'static {} - -impl RuntimeExtrinsic for E where E: codec::Codec + Send + Sync + 'static {} - /// Can be called for a `Configuration` to check if it is a configuration for the `Kusama` network. pub trait IdentifyVariant { /// Returns if this is a configuration for the `Kusama` network. @@ -148,7 +142,7 @@ type LightClient = service::TLightClientWithBackend; #[cfg(feature = "full-node")] -pub fn new_partial(config: &mut Configuration, test: bool) -> Result< +pub fn new_partial(config: &mut Configuration, test: bool) -> Result< service::PartialComponents< FullClient, FullBackend, FullSelectChain, consensus_common::DefaultImportQueue>, @@ -170,9 +164,8 @@ pub fn new_partial(config: &mut Configuration, where RuntimeApi: ConstructRuntimeApi> + Send + Sync + 'static, RuntimeApi::RuntimeApi: - RuntimeApiCollection>, + RuntimeApiCollection>, Executor: NativeExecutionDispatch + 'static, - Extrinsic: RuntimeExtrinsic, { if !test { // If we're using prometheus, use a registry with a prefix of `polkadot`. @@ -274,7 +267,7 @@ pub fn new_partial(config: &mut Configuration, } #[cfg(feature = "full-node")] -pub fn new_full( +pub fn new_full( mut config: Configuration, collating_for: Option<(CollatorId, parachain::Id)>, max_block_data_size: Option, @@ -292,9 +285,8 @@ pub fn new_full( where RuntimeApi: ConstructRuntimeApi> + Send + Sync + 'static, RuntimeApi::RuntimeApi: - RuntimeApiCollection>, + RuntimeApiCollection>, Executor: NativeExecutionDispatch + 'static, - Extrinsic: RuntimeExtrinsic, { use sc_network::Event; use sc_client_api::ExecutorProvider; @@ -316,7 +308,7 @@ pub fn new_full( client, backend, mut task_manager, keystore, select_chain, import_queue, transaction_pool, inherent_data_providers, other: (rpc_extensions_builder, import_setup, rpc_setup) - } = new_partial::(&mut config, test)?; + } = new_partial::(&mut config, test)?; let prometheus_registry = config.prometheus_registry().cloned(); @@ -589,13 +581,12 @@ pub fn new_full( } /// Builds a new service for a light client. -fn new_light(mut config: Configuration) -> Result<(TaskManager, Arc), Error> +fn new_light(mut config: Configuration) -> Result<(TaskManager, Arc), Error> where Runtime: 'static + Send + Sync + ConstructRuntimeApi>, >>::RuntimeApi: - RuntimeApiCollection>, + RuntimeApiCollection>, Dispatch: NativeExecutionDispatch + 'static, - Extrinsic: RuntimeExtrinsic, { use sc_client_api::backend::RemoteBackend; @@ -662,7 +653,7 @@ fn new_light(mut config: Configuration) -> Result< finality_proof_request_builder: Some(finality_proof_request_builder), finality_proof_provider: Some(finality_proof_provider), })?; - + if config.offchain_worker.enabled { service::build_offchain_workers( &config, backend.clone(), task_manager.spawn_handle(), client.clone(), network.clone(), @@ -678,7 +669,7 @@ fn new_light(mut config: Configuration) -> Result< let rpc_extensions = polkadot_rpc::create_light(light_deps); - let rpc_handlers = service::spawn_tasks(service::SpawnTasksParams { + let rpc_handlers = service::spawn_tasks(service::SpawnTasksParams { on_demand: Some(on_demand), remote_blockchain: Some(backend.remote_blockchain()), rpc_extensions_builder: Box::new(service::NoopRpcExtensionBuilder(rpc_extensions)), @@ -693,7 +684,7 @@ fn new_light(mut config: Configuration) -> Result< /// Builds a new object suitable for chain operations. #[cfg(feature = "full-node")] -pub fn new_chain_ops(mut config: Configuration) -> Result< +pub fn new_chain_ops(mut config: Configuration) -> Result< ( Arc>, Arc, @@ -705,13 +696,12 @@ pub fn new_chain_ops(mut config: Configuration) -> where Runtime: ConstructRuntimeApi> + Send + Sync + 'static, Runtime::RuntimeApi: - RuntimeApiCollection>, + RuntimeApiCollection>, Dispatch: NativeExecutionDispatch + 'static, - Extrinsic: RuntimeExtrinsic, { config.keystore = service::config::KeystoreConfig::InMemory; let service::PartialComponents { client, backend, import_queue, task_manager, .. } - = new_partial::(&mut config, false)?; + = new_partial::(&mut config, false)?; Ok((client, backend, import_queue, task_manager)) } @@ -735,7 +725,7 @@ pub fn polkadot_new_full( FullNodeHandles, ), ServiceError> { - let (service, client, handles, _, _) = new_full::( + let (service, client, handles, _, _) = new_full::( config, collating_for, max_block_data_size, @@ -768,7 +758,7 @@ pub fn kusama_new_full( FullNodeHandles ), ServiceError> { - let (service, client, handles, _, _) = new_full::( + let (service, client, handles, _, _) = new_full::( config, collating_for, max_block_data_size, @@ -801,7 +791,7 @@ pub fn westend_new_full( FullNodeHandles, ), ServiceError> { - let (service, client, handles, _, _) = new_full::( + let (service, client, handles, _, _) = new_full::( config, collating_for, max_block_data_size, @@ -841,15 +831,15 @@ impl NodeBuilder { /// Build a new light node. pub fn build_light(self) -> Result<(TaskManager, Arc), ServiceError> { if self.config.chain_spec.is_kusama() { - new_light::( + new_light::( self.config, ) } else if self.config.chain_spec.is_westend() { - new_light::( + new_light::( self.config, ) } else { - new_light::( + new_light::( self.config, ) } @@ -866,7 +856,7 @@ impl NodeBuilder { grandpa_pause: Option<(u32, u32)>, ) -> Result { if self.config.chain_spec.is_kusama() { - new_full::( + new_full::( self.config, collating_for, max_block_data_size, @@ -876,7 +866,7 @@ impl NodeBuilder { false, ).map(|(task_manager, _, _, _, _)| task_manager) } else if self.config.chain_spec.is_westend() { - new_full::( + new_full::( self.config, collating_for, max_block_data_size, @@ -886,7 +876,7 @@ impl NodeBuilder { false, ).map(|(task_manager, _, _, _, _)| task_manager) } else { - new_full::( + new_full::( self.config, collating_for, max_block_data_size, -- GitLab From 7f97b50ab2c37f38ba0703232eb846d7535e3d2a Mon Sep 17 00:00:00 2001 From: Arkadiy Paronyan Date: Mon, 3 Aug 2020 12:45:26 +0200 Subject: [PATCH 133/192] Sort out validation errors (#1516) * Sort out validation errors * Typo * Fixed wasm/android build * Fixed bad merge --- node/core/backing/src/lib.rs | 11 +- node/core/candidate-validation/src/lib.rs | 105 +++++++++++------- node/primitives/src/lib.rs | 27 ++++- node/subsystem/src/messages.rs | 4 +- parachain/src/wasm_executor/mod.rs | 65 +++++++---- .../src/wasm_executor/validation_host.rs | 51 ++++++--- .../tests/wasm_executor/mod.rs | 4 +- validation/src/error.rs | 2 +- 8 files changed, 176 insertions(+), 93 deletions(-) diff --git a/node/core/backing/src/lib.rs b/node/core/backing/src/lib.rs index 4d2a3817be..11f82d3d83 100644 --- a/node/core/backing/src/lib.rs +++ b/node/core/backing/src/lib.rs @@ -305,7 +305,7 @@ impl CandidateBackingJob { } } } - ValidationResult::Invalid => { + ValidationResult::Invalid(_reason) => { // no need to issue a statement about this if we aren't seconding it. // // there's an infinite amount of garbage out there. no need to acknowledge @@ -497,7 +497,7 @@ impl CandidateBackingJob { Err(()) => Statement::Invalid(candidate_hash), } } - ValidationResult::Invalid => { + ValidationResult::Invalid(_reason) => { Statement::Invalid(candidate_hash) } }; @@ -826,6 +826,7 @@ mod tests { messages::RuntimeApiRequest, ActiveLeavesUpdate, FromOverseer, OverseerSignal, }; + use polkadot_node_primitives::InvalidCandidate; use sp_keyring::Sr25519Keyring; use std::collections::HashMap; @@ -1461,7 +1462,7 @@ mod tests { tx, ) ) if pov == pov && &c == candidate_a.descriptor() => { - tx.send(Ok(ValidationResult::Invalid)).unwrap(); + tx.send(Ok(ValidationResult::Invalid(InvalidCandidate::BadReturn))).unwrap(); } ); @@ -1597,7 +1598,7 @@ mod tests { tx, ) ) if pov == pov && &c == candidate.descriptor() => { - tx.send(Ok(ValidationResult::Invalid)).unwrap(); + tx.send(Ok(ValidationResult::Invalid(InvalidCandidate::BadReturn))).unwrap(); } ); @@ -1729,7 +1730,7 @@ mod tests { tx, ) ) if pov == pov && &c == candidate.descriptor() => { - tx.send(Err(ValidationFailed)).unwrap(); + tx.send(Err(ValidationFailed("Internal test error".into()))).unwrap(); } ); diff --git a/node/core/candidate-validation/src/lib.rs b/node/core/candidate-validation/src/lib.rs index e81f41180d..8dcc0a574b 100644 --- a/node/core/candidate-validation/src/lib.rs +++ b/node/core/candidate-validation/src/lib.rs @@ -28,12 +28,13 @@ use polkadot_subsystem::messages::{ AllMessages, CandidateValidationMessage, RuntimeApiMessage, ValidationFailed, RuntimeApiRequest, }; use polkadot_subsystem::errors::RuntimeApiError; -use polkadot_node_primitives::{ValidationResult, ValidationOutputs}; +use polkadot_node_primitives::{ValidationResult, ValidationOutputs, InvalidCandidate}; use polkadot_primitives::v1::{ ValidationCode, OmittedValidationData, PoV, CandidateDescriptor, LocalValidationData, GlobalValidationData, OccupiedCoreAssumption, Hash, validation_data_hash, }; -use polkadot_parachain::wasm_executor::{self, ValidationPool, ExecutionMode}; +use polkadot_parachain::wasm_executor::{self, ValidationPool, ExecutionMode, ValidationError, + InvalidCandidate as WasmInvalidCandidate}; use polkadot_parachain::primitives::{ValidationResult as WasmValidationResult, ValidationParams}; use parity_scale_codec::Encode; @@ -241,7 +242,7 @@ async fn spawn_validate_from_chain_state( e, ); - return Ok(Err(ValidationFailed)); + return Ok(Err(ValidationFailed("Error making API request".into()))); } } }; @@ -264,7 +265,7 @@ async fn spawn_validate_from_chain_state( ).await; } AssumptionCheckOutcome::DoesNotMatch => {}, - AssumptionCheckOutcome::BadRequest => return Ok(Err(ValidationFailed)), + AssumptionCheckOutcome::BadRequest => return Ok(Err(ValidationFailed("Bad request".into()))), } match check_assumption_validation_data( @@ -285,13 +286,13 @@ async fn spawn_validate_from_chain_state( ).await; } AssumptionCheckOutcome::DoesNotMatch => {}, - AssumptionCheckOutcome::BadRequest => return Ok(Err(ValidationFailed)), + AssumptionCheckOutcome::BadRequest => return Ok(Err(ValidationFailed("Bad request".into()))), } // If neither the assumption of the occupied core having the para included or the assumption // of the occupied core timing out are valid, then the validation_data_hash in the descriptor // is not based on the relay parent and is thus invalid. - Ok(Ok(ValidationResult::Invalid)) + Ok(Ok(ValidationResult::Invalid(InvalidCandidate::BadParent))) } async fn spawn_validate_exhaustive( @@ -321,52 +322,52 @@ async fn spawn_validate_exhaustive( rx.await.map_err(Into::into) } -/// Does basic checks of a candidate. Provide the encoded PoV-block. Returns `true` if basic checks -/// are passed, false otherwise. -fn passes_basic_checks( +/// Does basic checks of a candidate. Provide the encoded PoV-block. Returns `Ok` if basic checks +/// are passed, `Err` otherwise. +fn perform_basic_checks( candidate: &CandidateDescriptor, max_block_data_size: Option, pov: &PoV, -) -> bool { +) -> Result<(), InvalidCandidate> { let encoded_pov = pov.encode(); let hash = pov.hash(); if let Some(max_size) = max_block_data_size { if encoded_pov.len() as u64 > max_size { - return false; + return Err(InvalidCandidate::ParamsTooLarge(encoded_pov.len() as u64)); } } if hash != candidate.pov_hash { - return false; + return Err(InvalidCandidate::HashMismatch); } if let Err(()) = candidate.check_collator_signature() { - return false; + return Err(InvalidCandidate::BadSignature); } - true + Ok(()) } /// Check the result of Wasm execution against the constraints given by the relay-chain. /// -/// Returns `true` if checks pass, false otherwise. +/// Returns `Ok(())` if checks pass, error otherwise. fn check_wasm_result_against_constraints( global_validation_data: &GlobalValidationData, _local_validation_data: &LocalValidationData, result: &WasmValidationResult, -) -> bool { +) -> Result<(), InvalidCandidate> { if result.head_data.0.len() > global_validation_data.max_head_data_size as _ { - return false + return Err(InvalidCandidate::HeadDataTooLarge(result.head_data.0.len() as u64)) } if let Some(ref code) = result.new_validation_code { if code.0.len() > global_validation_data.max_code_size as _ { - return false + return Err(InvalidCandidate::NewCodeTooLarge(code.0.len() as u64)) } } - true + Ok(()) } trait ValidationBackend { @@ -377,7 +378,7 @@ trait ValidationBackend { validation_code: &ValidationCode, params: ValidationParams, spawn: S, - ) -> Result; + ) -> Result; } struct RealValidationBackend; @@ -390,7 +391,7 @@ impl ValidationBackend for RealValidationBackend { validation_code: &ValidationCode, params: ValidationParams, spawn: S, - ) -> Result { + ) -> Result { let execution_mode = pool.as_ref() .map(ExecutionMode::Remote) .unwrap_or(ExecutionMode::Local); @@ -415,8 +416,8 @@ fn validate_candidate_exhaustive( pov: Arc, spawn: S, ) -> Result { - if !passes_basic_checks(&descriptor, None, &*pov) { - return Ok(ValidationResult::Invalid); + if let Err(e) = perform_basic_checks(&descriptor, None, &*pov) { + return Ok(ValidationResult::Invalid(e)) } let OmittedValidationData { global_validation, local_validation } = omitted_validation; @@ -431,26 +432,36 @@ fn validate_candidate_exhaustive( }; match B::validate(backend_arg, &validation_code, params, spawn) { - Err(wasm_executor::Error::BadReturn) => Ok(ValidationResult::Invalid), - Err(_) => Err(ValidationFailed), + Err(ValidationError::InvalidCandidate(WasmInvalidCandidate::Timeout)) => + Ok(ValidationResult::Invalid(InvalidCandidate::Timeout)), + Err(ValidationError::InvalidCandidate(WasmInvalidCandidate::ParamsTooLarge(l))) => + Ok(ValidationResult::Invalid(InvalidCandidate::ParamsTooLarge(l as u64))), + Err(ValidationError::InvalidCandidate(WasmInvalidCandidate::CodeTooLarge(l))) => + Ok(ValidationResult::Invalid(InvalidCandidate::CodeTooLarge(l as u64))), + Err(ValidationError::InvalidCandidate(WasmInvalidCandidate::BadReturn)) => + Ok(ValidationResult::Invalid(InvalidCandidate::BadReturn)), + Err(ValidationError::InvalidCandidate(WasmInvalidCandidate::WasmExecutor(e))) => + Ok(ValidationResult::Invalid(InvalidCandidate::ExecutionError(e.to_string()))), + Err(ValidationError::InvalidCandidate(WasmInvalidCandidate::ExternalWasmExecutor(e))) => + Ok(ValidationResult::Invalid(InvalidCandidate::ExecutionError(e.to_string()))), + Err(ValidationError::Internal(e)) => Err(ValidationFailed(e.to_string())), Ok(res) => { - let passes_post_checks = check_wasm_result_against_constraints( + let post_check_result = check_wasm_result_against_constraints( &global_validation, &local_validation, &res, ); - Ok(if passes_post_checks { - ValidationResult::Valid(ValidationOutputs { + Ok(match post_check_result { + Ok(()) => ValidationResult::Valid(ValidationOutputs { head_data: res.head_data, global_validation_data: global_validation, local_validation_data: local_validation, upward_messages: res.upward_messages, fees: 0, new_validation_code: res.new_validation_code, - }) - } else { - ValidationResult::Invalid + }), + Err(e) => ValidationResult::Invalid(e), }) } } @@ -469,7 +480,7 @@ mod tests { struct MockValidationBackend; struct MockValidationArg { - result: Result, + result: Result, } impl ValidationBackend for MockValidationBackend { @@ -480,7 +491,7 @@ mod tests { _validation_code: &ValidationCode, _params: ValidationParams, _spawn: S, - ) -> Result { + ) -> Result { arg.result } } @@ -795,7 +806,7 @@ mod tests { descriptor.pov_hash = pov.hash(); collator_sign(&mut descriptor, Sr25519Keyring::Alice); - assert!(passes_basic_checks(&descriptor, Some(1024), &pov)); + assert!(perform_basic_checks(&descriptor, Some(1024), &pov).is_ok()); let validation_result = WasmValidationResult { head_data: HeadData(vec![1, 1, 1]), @@ -808,7 +819,7 @@ mod tests { &omitted_validation.global_validation, &omitted_validation.local_validation, &validation_result, - )); + ).is_ok()); let v = validate_candidate_exhaustive::( MockValidationArg { result: Ok(validation_result) }, @@ -845,7 +856,7 @@ mod tests { descriptor.pov_hash = pov.hash(); collator_sign(&mut descriptor, Sr25519Keyring::Alice); - assert!(passes_basic_checks(&descriptor, Some(1024), &pov)); + assert!(perform_basic_checks(&descriptor, Some(1024), &pov).is_ok()); let validation_result = WasmValidationResult { head_data: HeadData(vec![1, 1, 1]), @@ -858,10 +869,14 @@ mod tests { &omitted_validation.global_validation, &omitted_validation.local_validation, &validation_result, - )); + ).is_ok()); let v = validate_candidate_exhaustive::( - MockValidationArg { result: Err(wasm_executor::Error::BadReturn) }, + MockValidationArg { + result: Err(ValidationError::InvalidCandidate( + WasmInvalidCandidate::BadReturn + )) + }, omitted_validation.clone(), vec![1, 2, 3].into(), descriptor, @@ -869,7 +884,7 @@ mod tests { TaskExecutor::new(), ).unwrap(); - assert_matches!(v, ValidationResult::Invalid); + assert_matches!(v, ValidationResult::Invalid(InvalidCandidate::BadReturn)); } @@ -889,7 +904,7 @@ mod tests { descriptor.pov_hash = pov.hash(); collator_sign(&mut descriptor, Sr25519Keyring::Alice); - assert!(passes_basic_checks(&descriptor, Some(1024), &pov)); + assert!(perform_basic_checks(&descriptor, Some(1024), &pov).is_ok()); let validation_result = WasmValidationResult { head_data: HeadData(vec![1, 1, 1]), @@ -902,10 +917,14 @@ mod tests { &omitted_validation.global_validation, &omitted_validation.local_validation, &validation_result, - )); + ).is_ok()); let v = validate_candidate_exhaustive::( - MockValidationArg { result: Err(wasm_executor::Error::Timeout) }, + MockValidationArg { + result: Err(ValidationError::InvalidCandidate( + WasmInvalidCandidate::Timeout + )) + }, omitted_validation.clone(), vec![1, 2, 3].into(), descriptor, @@ -913,6 +932,6 @@ mod tests { TaskExecutor::new(), ); - assert_matches!(v, Err(ValidationFailed)); + assert_matches!(v, Ok(ValidationResult::Invalid(InvalidCandidate::Timeout))); } } diff --git a/node/primitives/src/lib.rs b/node/primitives/src/lib.rs index 5064a85158..201522abb5 100644 --- a/node/primitives/src/lib.rs +++ b/node/primitives/src/lib.rs @@ -129,13 +129,38 @@ pub struct ValidationOutputs { pub new_validation_code: Option, } +/// Candidate invalidity details +#[derive(Debug)] +pub enum InvalidCandidate { + /// Failed to execute.`validate_block`. This includes function panicking. + ExecutionError(String), + /// Execution timeout. + Timeout, + /// Validation input is over the limit. + ParamsTooLarge(u64), + /// Code size is over the limit. + CodeTooLarge(u64), + /// Validation function returned invalid data. + BadReturn, + /// Invalid relay chain parent. + BadParent, + /// POV hash does not match. + HashMismatch, + /// Bad collator signature. + BadSignature, + /// Output code is too large + NewCodeTooLarge(u64), + /// Head-data is over the limit. + HeadDataTooLarge(u64), +} + /// Result of the validation of the candidate. #[derive(Debug)] pub enum ValidationResult { /// Candidate is valid. The validation process yields these outputs. Valid(ValidationOutputs), /// Candidate is invalid. - Invalid, + Invalid(InvalidCandidate), } impl std::convert::TryFrom for MisbehaviorReport { diff --git a/node/subsystem/src/messages.rs b/node/subsystem/src/messages.rs index d9a1f03937..b508c34a8a 100644 --- a/node/subsystem/src/messages.rs +++ b/node/subsystem/src/messages.rs @@ -87,9 +87,9 @@ impl CandidateBackingMessage { } } -/// Blanket error for validation failing. +/// Blanket error for validation failing for internal reasons. #[derive(Debug)] -pub struct ValidationFailed; +pub struct ValidationFailed(pub String); /// Messages received by the Validation subsystem. /// diff --git a/parachain/src/wasm_executor/mod.rs b/parachain/src/wasm_executor/mod.rs index 584d2edb93..7f53e7829c 100644 --- a/parachain/src/wasm_executor/mod.rs +++ b/parachain/src/wasm_executor/mod.rs @@ -69,9 +69,18 @@ pub enum ExecutionMode<'a> { RemoteTest(&'a ValidationPool), } -/// Error type for the wasm executor #[derive(Debug, derive_more::Display, derive_more::From)] -pub enum Error { +/// Candidate validation error. +pub enum ValidationError { + /// Validation failed due to internal reasons. The candidate might still be valid. + Internal(InternalError), + /// Candidate is invalid. + InvalidCandidate(InvalidCandidate), +} + +/// Error type that indicates invalid candidate. +#[derive(Debug, derive_more::Display, derive_more::From)] +pub enum InvalidCandidate { /// Wasm executor error. #[display(fmt = "WASM executor error: {:?}", _0)] WasmExecutor(sc_executor::error::Error), @@ -82,30 +91,37 @@ pub enum Error { /// Code size it too large. #[display(fmt = "WASM code is {} bytes, max allowed is {}", _0, MAX_CODE_MEM)] CodeTooLarge(usize), - /// Bad return data or type. + /// Error decoding returned data. #[display(fmt = "Validation function returned invalid data.")] BadReturn, #[display(fmt = "Validation function timeout.")] Timeout, + #[display(fmt = "External WASM execution error: {}", _0)] + ExternalWasmExecutor(String), +} + +/// Host error during candidate validation. This does not indicate an invalid candidate. +#[derive(Debug, derive_more::Display, derive_more::From)] +pub enum InternalError { #[display(fmt = "IO error: {}", _0)] Io(std::io::Error), #[display(fmt = "System error: {}", _0)] System(Box), - #[display(fmt = "WASM worker error: {}", _0)] - External(String), #[display(fmt = "Shared memory error: {}", _0)] #[cfg(not(any(target_os = "android", target_os = "unknown")))] SharedMem(shared_memory::SharedMemError), + #[display(fmt = "WASM worker error: {}", _0)] + WasmWorker(String), } -impl std::error::Error for Error { +impl std::error::Error for ValidationError { fn source(&self) -> Option<&(dyn std::error::Error + 'static)> { match self { - Error::WasmExecutor(ref err) => Some(err), - Error::Io(ref err) => Some(err), - Error::System(ref err) => Some(&**err), + ValidationError::Internal(InternalError::Io(ref err)) => Some(err), + ValidationError::Internal(InternalError::System(ref err)) => Some(&**err), #[cfg(not(any(target_os = "android", target_os = "unknown")))] - Error::SharedMem(ref err) => Some(err), + ValidationError::Internal(InternalError::SharedMem(ref err)) => Some(err), + ValidationError::InvalidCandidate(InvalidCandidate::WasmExecutor(ref err)) => Some(err), _ => None, } } @@ -119,7 +135,7 @@ pub fn validate_candidate( params: ValidationParams, options: ExecutionMode<'_>, spawner: impl SpawnNamed + 'static, -) -> Result { +) -> Result { match options { ExecutionMode::Local => { validate_candidate_internal(validation_code, ¶ms.encode(), spawner) @@ -133,15 +149,19 @@ pub fn validate_candidate( pool.validate_candidate(validation_code, params, true) }, #[cfg(any(target_os = "android", target_os = "unknown"))] - ExecutionMode::Remote(pool) => - Err(Error::System(Box::::from( - "Remote validator not available".to_string() - ) as Box<_>)), + ExecutionMode::Remote(_pool) => + Err(ValidationError::Internal(InternalError::System( + Box::::from( + "Remote validator not available".to_string() + ) as Box<_> + ))), #[cfg(any(target_os = "android", target_os = "unknown"))] - ExecutionMode::RemoteTest(pool) => - Err(Error::System(Box::::from( - "Remote validator not available".to_string() - ) as Box<_>)), + ExecutionMode::RemoteTest(_pool) => + Err(ValidationError::Internal(InternalError::System( + Box::::from( + "Remote validator not available".to_string() + ) as Box<_> + ))), } } @@ -155,7 +175,7 @@ pub fn validate_candidate_internal( validation_code: &[u8], encoded_call_data: &[u8], spawner: impl SpawnNamed + 'static, -) -> Result { +) -> Result { let mut extensions = Extensions::new(); extensions.register(sp_core::traits::TaskExecutorExt::new(spawner)); @@ -175,9 +195,10 @@ pub fn validate_candidate_internal( encoded_call_data, &mut ext, sp_core::traits::MissingHostFunctions::Allow, - )?; + ).map_err(|e| ValidationError::InvalidCandidate(e.into()))?; - ValidationResult::decode(&mut &res[..]).map_err(|_| Error::BadReturn.into()) + ValidationResult::decode(&mut &res[..]) + .map_err(|_| ValidationError::InvalidCandidate(InvalidCandidate::BadReturn).into()) } /// The validation externalities that will panic on any storage related access. They just provide diff --git a/parachain/src/wasm_executor/validation_host.rs b/parachain/src/wasm_executor/validation_host.rs index 96ad7d9ebc..ad79949d21 100644 --- a/parachain/src/wasm_executor/validation_host.rs +++ b/parachain/src/wasm_executor/validation_host.rs @@ -19,7 +19,8 @@ use std::{process, env, sync::Arc, sync::atomic}; use codec::{Decode, Encode}; use crate::primitives::{ValidationParams, ValidationResult}; -use super::{validate_candidate_internal, Error, MAX_CODE_MEM, MAX_RUNTIME_MEM}; +use super::{validate_candidate_internal, ValidationError, InvalidCandidate, InternalError, + MAX_CODE_MEM, MAX_RUNTIME_MEM}; use shared_memory::{SharedMem, SharedMemConf, EventState, WriteLockable, EventWait, EventSet}; use parking_lot::Mutex; use log::{debug, trace}; @@ -88,7 +89,7 @@ impl ValidationPool { validation_code: &[u8], params: ValidationParams, test_mode: bool, - ) -> Result { + ) -> Result { for host in self.hosts.iter() { if let Some(mut host) = host.try_lock() { return host.validate_candidate(validation_code, params, test_mode); @@ -165,7 +166,10 @@ pub fn run_worker(mem_id: &str) -> Result<(), String> { match result { Ok(r) => ValidationResultHeader::Ok(r), - Err(e) => ValidationResultHeader::Error(e.to_string()), + Err(ValidationError::Internal(e)) => + ValidationResultHeader::Error(WorkerValidationError::InternalError(e.to_string())), + Err(ValidationError::InvalidCandidate(e)) => + ValidationResultHeader::Error(WorkerValidationError::ValidationError(e.to_string())), } }; let mut data: &mut[u8] = &mut **slice; @@ -186,9 +190,15 @@ struct ValidationHeader { } #[derive(Encode, Decode, Debug)] -pub enum ValidationResultHeader { +enum WorkerValidationError { + InternalError(String), + ValidationError(String), +} + +#[derive(Encode, Decode, Debug)] +enum ValidationResultHeader { Ok(ValidationResult), - Error(String), + Error(WorkerValidationError), } unsafe impl Send for ValidationHost {} @@ -209,7 +219,7 @@ impl Drop for ValidationHost { } impl ValidationHost { - fn create_memory() -> Result { + fn create_memory() -> Result { let mem_size = MAX_RUNTIME_MEM + MAX_CODE_MEM + 1024; let mem_config = SharedMemConf::default() .set_size(mem_size) @@ -221,7 +231,7 @@ impl ValidationHost { Ok(mem_config.create()?) } - fn start_worker(&mut self, test_mode: bool) -> Result<(), Error> { + fn start_worker(&mut self, test_mode: bool) -> Result<(), InternalError> { if let Some(ref mut worker) = self.worker { // Check if still alive if let Ok(None) = worker.try_wait() { @@ -257,9 +267,9 @@ impl ValidationHost { validation_code: &[u8], params: ValidationParams, test_mode: bool, - ) -> Result { + ) -> Result { if validation_code.len() > MAX_CODE_MEM { - return Err(Error::CodeTooLarge(validation_code.len())); + return Err(ValidationError::InvalidCandidate(InvalidCandidate::CodeTooLarge(validation_code.len()))); } // First, check if need to spawn the child process self.start_worker(test_mode)?; @@ -267,7 +277,8 @@ impl ValidationHost { .expect("memory is always `Some` after `start_worker` completes successfully"); { // Put data in shared mem - let data: &mut[u8] = &mut **memory.wlock_as_slice(0)?; + let data: &mut[u8] = &mut **memory.wlock_as_slice(0) + .map_err(|e|ValidationError::Internal(e.into()))?; let (mut header_buf, rest) = data.split_at_mut(1024); let (code, rest) = rest.split_at_mut(MAX_CODE_MEM); let (code, _) = code.split_at_mut(validation_code.len()); @@ -275,7 +286,7 @@ impl ValidationHost { code[..validation_code.len()].copy_from_slice(validation_code); let encoded_params = params.encode(); if encoded_params.len() >= MAX_RUNTIME_MEM { - return Err(Error::ParamsTooLarge(MAX_RUNTIME_MEM)); + return Err(ValidationError::InvalidCandidate(InvalidCandidate::ParamsTooLarge(MAX_RUNTIME_MEM))); } call_data[..encoded_params.len()].copy_from_slice(&encoded_params); @@ -288,7 +299,8 @@ impl ValidationHost { } debug!("{} Signaling candidate", self.id); - memory.set(Event::CandidateReady as usize, EventState::Signaled)?; + memory.set(Event::CandidateReady as usize, EventState::Signaled) + .map_err(|e| ValidationError::Internal(e.into()))?; debug!("{} Waiting for results", self.id); match memory.wait(Event::ResultReady as usize, shared_memory::Timeout::Sec(EXECUTION_TIMEOUT_SEC as usize)) { @@ -297,22 +309,27 @@ impl ValidationHost { if let Some(mut worker) = self.worker.take() { worker.kill().ok(); } - return Err(Error::Timeout.into()); + return Err(ValidationError::InvalidCandidate(InvalidCandidate::Timeout)); } Ok(()) => {} } { debug!("{} Reading results", self.id); - let data: &[u8] = &**memory.wlock_as_slice(0)?; + let data: &[u8] = &**memory.wlock_as_slice(0) + .map_err(|e| ValidationError::Internal(e.into()))?; let (header_buf, _) = data.split_at(1024); let mut header_buf: &[u8] = header_buf; let header = ValidationResultHeader::decode(&mut header_buf).unwrap(); match header { ValidationResultHeader::Ok(result) => Ok(result), - ValidationResultHeader::Error(message) => { - debug!("{} Validation error: {}", self.id, message); - Err(Error::External(message).into()) + ValidationResultHeader::Error(WorkerValidationError::InternalError(e)) => { + debug!("{} Internal validation error: {}", self.id, e); + Err(ValidationError::Internal(InternalError::WasmWorker(e))) + }, + ValidationResultHeader::Error(WorkerValidationError::ValidationError(e)) => { + debug!("{} External validation error: {}", self.id, e); + Err(ValidationError::InvalidCandidate(InvalidCandidate::ExternalWasmExecutor(e))) } } } diff --git a/parachain/test-parachains/tests/wasm_executor/mod.rs b/parachain/test-parachains/tests/wasm_executor/mod.rs index 0e696b2395..769ad737ce 100644 --- a/parachain/test-parachains/tests/wasm_executor/mod.rs +++ b/parachain/test-parachains/tests/wasm_executor/mod.rs @@ -19,7 +19,7 @@ use crate::adder; use parachain::{ primitives::{BlockData, ValidationParams}, - wasm_executor::EXECUTION_TIMEOUT_SEC, + wasm_executor::{ValidationError, InvalidCandidate, EXECUTION_TIMEOUT_SEC}, }; #[test] @@ -40,7 +40,7 @@ fn terminates_on_timeout() { sp_core::testing::TaskExecutor::new(), ); match result { - Err(parachain::wasm_executor::Error::Timeout) => {}, + Err(ValidationError::InvalidCandidate(InvalidCandidate::Timeout)) => {}, r => panic!("{:?}", r), } diff --git a/validation/src/error.rs b/validation/src/error.rs index 5fd990a071..d4632a4782 100644 --- a/validation/src/error.rs +++ b/validation/src/error.rs @@ -26,7 +26,7 @@ pub enum Error { /// Consensus error Consensus(consensus::error::Error), /// A wasm-validation error. - WasmValidation(parachain::wasm_executor::Error), + WasmValidation(parachain::wasm_executor::ValidationError), /// An I/O error. Io(std::io::Error), /// An error in the availability erasure-coding. -- GitLab From 1155adee4e1b55ae8655a4db42a3f19ca3b064c4 Mon Sep 17 00:00:00 2001 From: Kian Paimani <5588131+kianenigma@users.noreply.github.com> Date: Mon, 3 Aug 2020 15:26:24 +0200 Subject: [PATCH 134/192] Companion for substrate/6782 (#1523) * Fix test-runtime * Remove duplicate tests --- runtime/kusama/src/lib.rs | 13 ------------- runtime/polkadot/src/lib.rs | 13 ------------- runtime/test-runtime/src/lib.rs | 4 ++-- runtime/westend/src/lib.rs | 12 ------------ 4 files changed, 2 insertions(+), 40 deletions(-) diff --git a/runtime/kusama/src/lib.rs b/runtime/kusama/src/lib.rs index cacac8202b..0780de62c4 100644 --- a/runtime/kusama/src/lib.rs +++ b/runtime/kusama/src/lib.rs @@ -1336,16 +1336,3 @@ sp_api::impl_runtime_apis! { } } } - -#[cfg(test)] -mod tests { - use super::Runtime; - - #[test] - fn slash_defer_less_than_bonding_duration() { - assert!( - ::SlashDeferDuration::get() - < ::BondingDuration::get() - ); - } -} diff --git a/runtime/polkadot/src/lib.rs b/runtime/polkadot/src/lib.rs index ec3fa30434..13de7985ed 100644 --- a/runtime/polkadot/src/lib.rs +++ b/runtime/polkadot/src/lib.rs @@ -1474,16 +1474,3 @@ sp_api::impl_runtime_apis! { } } } - -#[cfg(test)] -mod tests { - use super::Runtime; - - #[test] - fn slash_defer_less_than_bonding_duration() { - assert!( - ::SlashDeferDuration::get() - < ::BondingDuration::get() - ); - } -} diff --git a/runtime/test-runtime/src/lib.rs b/runtime/test-runtime/src/lib.rs index d7238b6482..aa92b40e78 100644 --- a/runtime/test-runtime/src/lib.rs +++ b/runtime/test-runtime/src/lib.rs @@ -303,8 +303,8 @@ parameter_types! { pub storage SessionsPerEra: SessionIndex = 6; // 28 eras for unbonding (7 days). pub storage BondingDuration: staking::EraIndex = 28; - // 28 eras in which slashes can be cancelled (7 days). - pub storage SlashDeferDuration: staking::EraIndex = 28; + // 27 eras in which slashes can be cancelled (a bit less than 7 days). + pub storage SlashDeferDuration: staking::EraIndex = 27; pub const RewardCurve: &'static PiecewiseLinear<'static> = &REWARD_CURVE; pub storage MaxNominatorRewardedPerValidator: u32 = 64; pub storage ElectionLookahead: BlockNumber = 0; diff --git a/runtime/westend/src/lib.rs b/runtime/westend/src/lib.rs index c5d3669d0f..7e2cb3a71d 100644 --- a/runtime/westend/src/lib.rs +++ b/runtime/westend/src/lib.rs @@ -1113,15 +1113,3 @@ sp_api::impl_runtime_apis! { } } -#[cfg(test)] -mod tests { - use super::Runtime; - - #[test] - fn slash_defer_less_than_bonding_duration() { - assert!( - ::SlashDeferDuration::get() - < ::BondingDuration::get() - ); - } -} -- GitLab From b8d0c59ba3436a0c69c8415261ea23986ad8b37e Mon Sep 17 00:00:00 2001 From: Sergei Shulepov Date: Mon, 3 Aug 2020 21:30:12 +0200 Subject: [PATCH 135/192] Implementer's guide: notes on contextual execution (#1525) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Add notes about contextual execution * Clarify that `validation_data_hash` consists of global and local data * Update roadmap/implementers-guide/src/runtime/inclusion.md Co-authored-by: Bastian Köcher * Incorporate rphmeier's suggestion. Co-authored-by: Bastian Köcher --- roadmap/implementers-guide/src/runtime/inclusion.md | 1 + roadmap/implementers-guide/src/types/candidate.md | 8 +++++++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/roadmap/implementers-guide/src/runtime/inclusion.md b/roadmap/implementers-guide/src/runtime/inclusion.md index e961b78bed..898f757095 100644 --- a/roadmap/implementers-guide/src/runtime/inclusion.md +++ b/roadmap/implementers-guide/src/runtime/inclusion.md @@ -63,6 +63,7 @@ All failed checks should lead to an unrecoverable error making the block invalid 1. check that `scheduled` is sorted ascending by `CoreIndex`, without duplicates. 1. check that there is no candidate pending availability for any scheduled `ParaId`. 1. check that each candidate's `validation_data_hash` corresponds to a `(LocalValidationData, GlobalValidationData)` computed from the current state. + > NOTE: With contextual execution in place, local and global validation data will be obtained as of the state of the context block. However, only the state of the current block can be used for such a query. 1. If the core assignment includes a specific collator, ensure the backed candidate is issued by that collator. 1. Ensure that any code upgrade scheduled by the candidate does not happen within `config.validation_upgrade_frequency` of `Paras::last_code_upgrade(para_id, true)`, if any, comparing against the value of `Paras::FutureCodeUpgrades` for the given para ID. 1. Check the collator's signature on the candidate data. diff --git a/roadmap/implementers-guide/src/types/candidate.md b/roadmap/implementers-guide/src/types/candidate.md index dd69b23380..cd4ffae9bd 100644 --- a/roadmap/implementers-guide/src/types/candidate.md +++ b/roadmap/implementers-guide/src/types/candidate.md @@ -77,7 +77,7 @@ struct CandidateDescriptor { relay_parent: Hash, /// The collator's sr25519 public key. collator: CollatorId, - /// The blake2-256 hash of the validation data. These are extra parameters + /// The blake2-256 hash of the local and global validation data. These are extra parameters /// derived from relay-chain state that influence the validity of the block. validation_data_hash: Hash, /// The blake2-256 hash of the pov-block. @@ -120,6 +120,12 @@ This choice can also be expressed as a choice of which parent head of the para w Para validation happens optimistically before the block is authored, so it is not possible to predict with 100% accuracy what will happen in the earlier phase of the [`InclusionInherent`](../runtime/inclusioninherent.md) module where new availability bitfields and availability timeouts are processed. This is what will eventually define whether a candidate can be backed within a specific relay-chain block. +Design-wise we should maintain two properties about this data structure: + +1. The `LocalValidationData` should be relatively lightweight primarly because it is constructed during inclusion for each candidate. +1. To make contextual execution possible, `LocalValidationData` should be constructable only having access to the latest relay-chain state for the past `k` blocks. That implies +either that the relay-chain should maintain all the required data accessible or somehow provided indirectly with a header-chain proof and a state proof from there. + > TODO: determine if balance/fees are even needed here. > TODO: message queue watermarks (first downward messages, then XCMP channels) -- GitLab From a2b008ddd127652a98838dd6e28e651f82bb58af Mon Sep 17 00:00:00 2001 From: Fedor Sakharov Date: Mon, 3 Aug 2020 22:32:57 +0300 Subject: [PATCH 136/192] Sudo wrapper for paras (#1517) * Sudo wrapper for paras * Move to separate module * Add some docs --- Cargo.lock | 1 + runtime/common/Cargo.toml | 1 + runtime/common/src/lib.rs | 1 + runtime/common/src/paras_sudo_wrapper.rs | 63 ++++++++++++++++++++++++ runtime/parachains/src/paras.rs | 9 ++-- runtime/rococo-v1/src/lib.rs | 5 ++ 6 files changed, 75 insertions(+), 5 deletions(-) create mode 100644 runtime/common/src/paras_sudo_wrapper.rs diff --git a/Cargo.lock b/Cargo.lock index 41c4a1d5c4..fd3c3615c6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4945,6 +4945,7 @@ dependencies = [ "pallet-vesting", "parity-scale-codec", "polkadot-primitives", + "polkadot-runtime-parachains", "rustc-hex", "serde", "serde_derive", diff --git a/runtime/common/Cargo.toml b/runtime/common/Cargo.toml index e00d904915..72694c33b9 100644 --- a/runtime/common/Cargo.toml +++ b/runtime/common/Cargo.toml @@ -36,6 +36,7 @@ frame-benchmarking = { git = "https://github.com/paritytech/substrate", branch = primitives = { package = "polkadot-primitives", path = "../../primitives", default-features = false } libsecp256k1 = { version = "0.3.2", default-features = false, optional = true } +runtime-parachains = { package = "polkadot-runtime-parachains", path = "../parachains", default-features = false } [dev-dependencies] hex-literal = "0.2.1" diff --git a/runtime/common/src/lib.rs b/runtime/common/src/lib.rs index 55e4df1eed..3fb6e8140b 100644 --- a/runtime/common/src/lib.rs +++ b/runtime/common/src/lib.rs @@ -27,6 +27,7 @@ pub mod slots; pub mod crowdfund; pub mod purchase; pub mod impls; +pub mod paras_sudo_wrapper; use primitives::v0::BlockNumber; use sp_runtime::{Perquintill, Perbill, FixedPointNumber, traits::Saturating}; diff --git a/runtime/common/src/paras_sudo_wrapper.rs b/runtime/common/src/paras_sudo_wrapper.rs new file mode 100644 index 0000000000..e1e1ccae09 --- /dev/null +++ b/runtime/common/src/paras_sudo_wrapper.rs @@ -0,0 +1,63 @@ +// Copyright 2020 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 . + +//! A simple wrapper allowing `Sudo` to call into `paras` routines. + +use frame_support::{ + decl_error, decl_module, + dispatch::DispatchResult, + weights::DispatchClass, +}; +use system::ensure_root; +use runtime_parachains::paras::{ + self, + ParaGenesisArgs, +}; +use primitives::v1::Id as ParaId; + +/// The module's configuration trait. +pub trait Trait: paras::Trait { } + +decl_error! { + pub enum Error for Module { } +} + +decl_module! { + /// A sudo wrapper to call into v1 paras module. + pub struct Module for enum Call where origin: ::Origin, system = system { + type Error = Error; + + /// Schedule a para to be initialized at the start of the next session. + #[weight = (1_000, DispatchClass::Operational)] + pub fn sudo_schedule_para_initialize( + origin, + id: ParaId, + genesis: ParaGenesisArgs, + ) -> DispatchResult { + ensure_root(origin)?; + paras::Module::::schedule_para_initialize(id, genesis); + Ok(()) + } + + /// Schedule a para to be cleaned up at the start of the next session. + #[weight = (1_000, DispatchClass::Operational)] + pub fn sudo_schedule_para_cleanup(origin, id: ParaId) -> DispatchResult { + ensure_root(origin)?; + paras::Module::::schedule_para_cleanup(id); + Ok(()) + } + } +} diff --git a/runtime/parachains/src/paras.rs b/runtime/parachains/src/paras.rs index 4c628818a6..15e69bde6d 100644 --- a/runtime/parachains/src/paras.rs +++ b/runtime/parachains/src/paras.rs @@ -36,6 +36,7 @@ use frame_support::{ }; use codec::{Encode, Decode}; use crate::{configuration, initializer::SessionChangeNotification}; +use sp_core::RuntimeDebug; #[cfg(feature = "std")] use serde::{Serialize, Deserialize}; @@ -155,7 +156,7 @@ impl ParaPastCodeMeta { } /// Arguments for initializing a para. -#[derive(Encode, Decode)] +#[derive(PartialEq, Eq, Clone, Encode, Decode, RuntimeDebug)] #[cfg_attr(feature = "std", derive(Serialize, Deserialize))] pub struct ParaGenesisArgs { /// The initial head data to use. @@ -387,8 +388,7 @@ impl Module { } /// Schedule a para to be initialized at the start of the next session. - #[allow(unused)] - pub(crate) fn schedule_para_initialize(id: ParaId, genesis: ParaGenesisArgs) -> Weight { + pub fn schedule_para_initialize(id: ParaId, genesis: ParaGenesisArgs) -> Weight { let dup = UpcomingParas::mutate(|v| { match v.binary_search(&id) { Ok(_) => true, @@ -410,8 +410,7 @@ impl Module { } /// Schedule a para to be cleaned up at the start of the next session. - #[allow(unused)] - pub(crate) fn schedule_para_cleanup(id: ParaId) -> Weight { + pub fn schedule_para_cleanup(id: ParaId) -> Weight { OutgoingParas::mutate(|v| { match v.binary_search(&id) { Ok(_) => T::DbWeight::get().reads_writes(1, 0), diff --git a/runtime/rococo-v1/src/lib.rs b/runtime/rococo-v1/src/lib.rs index 7ca90c0399..d7df68199d 100644 --- a/runtime/rococo-v1/src/lib.rs +++ b/runtime/rococo-v1/src/lib.rs @@ -61,6 +61,7 @@ use sp_core::OpaqueMetadata; use sp_staking::SessionIndex; use session::historical as session_historical; use system::EnsureRoot; +use runtime_common::paras_sudo_wrapper as paras_sudo_wrapper; use runtime_parachains::configuration as parachains_configuration; use runtime_parachains::inclusion as parachains_inclusion; @@ -369,6 +370,8 @@ construct_runtime! { Scheduler: parachains_scheduler::{Module, Call, Storage}, Paras: parachains_paras::{Module, Call, Storage}, Initializer: parachains_initializer::{Module, Call, Storage}, + + ParasSudoWrapper: paras_sudo_wrapper::{Module, Call}, } } @@ -722,3 +725,5 @@ impl parachains_scheduler::Trait for Runtime { } impl parachains_initializer::Trait for Runtime { type Randomness = Babe; } + +impl paras_sudo_wrapper::Trait for Runtime { } -- GitLab From 1d8d85aded9c7a74aa7f3f304c360c592969bed0 Mon Sep 17 00:00:00 2001 From: Fedor Sakharov Date: Mon, 3 Aug 2020 23:11:06 +0300 Subject: [PATCH 137/192] Cleanup upcoming paras (#1527) * Cleanup upcoming paras * Also remove pending genesis * Not there but here --- runtime/parachains/src/paras.rs | 82 ++++++++++++++++++++++++++++++++- 1 file changed, 80 insertions(+), 2 deletions(-) diff --git a/runtime/parachains/src/paras.rs b/runtime/parachains/src/paras.rs index 15e69bde6d..1f65bcd0c2 100644 --- a/runtime/parachains/src/paras.rs +++ b/runtime/parachains/src/paras.rs @@ -411,7 +411,19 @@ impl Module { /// Schedule a para to be cleaned up at the start of the next session. pub fn schedule_para_cleanup(id: ParaId) -> Weight { - OutgoingParas::mutate(|v| { + let upcoming_weight = UpcomingParas::mutate(|v| { + match v.binary_search(&id) { + Ok(i) => { + v.remove(i); + UpcomingParasGenesis::remove(id); + // If a para was only in the pending state it should not be moved to `Outgoing` + return T::DbWeight::get().reads_writes(2, 2); + } + Err(_) => T::DbWeight::get().reads_writes(1, 0), + } + }); + + let outgoing_weight = OutgoingParas::mutate(|v| { match v.binary_search(&id) { Ok(_) => T::DbWeight::get().reads_writes(1, 0), Err(i) => { @@ -419,7 +431,9 @@ impl Module { T::DbWeight::get().reads_writes(1, 1) } } - }) + }); + + outgoing_weight + upcoming_weight } /// Schedule a future code upgrade of the given parachain, to be applied after inclusion @@ -1149,6 +1163,70 @@ mod tests { }) } + #[test] + fn para_cleanup_removes_upcoming() { + new_test_ext(Default::default()).execute_with(|| { + run_to_block(1, None); + + let b = ParaId::from(525); + let a = ParaId::from(999); + let c = ParaId::from(333); + + Paras::schedule_para_initialize( + b, + ParaGenesisArgs { + parachain: true, + genesis_head: vec![1].into(), + validation_code: vec![1].into(), + }, + ); + + Paras::schedule_para_initialize( + a, + ParaGenesisArgs { + parachain: false, + genesis_head: vec![2].into(), + validation_code: vec![2].into(), + }, + ); + + Paras::schedule_para_initialize( + c, + ParaGenesisArgs { + parachain: true, + genesis_head: vec![3].into(), + validation_code: vec![3].into(), + }, + ); + + assert_eq!(::UpcomingParas::get(), vec![c, b, a]); + assert!(::Parathreads::get(&a).is_none()); + + + // run to block without session change. + run_to_block(2, None); + + assert_eq!(Paras::parachains(), Vec::new()); + assert_eq!(::UpcomingParas::get(), vec![c, b, a]); + assert!(::Parathreads::get(&a).is_none()); + + Paras::schedule_para_cleanup(c); + + run_to_block(3, Some(vec![3])); + + assert_eq!(Paras::parachains(), vec![b]); + assert_eq!(::OutgoingParas::get(), vec![]); + assert_eq!(::UpcomingParas::get(), Vec::new()); + assert!(::UpcomingParasGenesis::get(a).is_none()); + + assert!(::Parathreads::get(&a).is_some()); + + assert_eq!(Paras::current_code(&a), Some(vec![2].into())); + assert_eq!(Paras::current_code(&b), Some(vec![1].into())); + assert!(Paras::current_code(&c).is_none()); + }); + } + #[test] fn code_at_with_intermediate() { let acceptance_period = 10; -- GitLab From d907db6310d18f9eeedf4b5cefb9edf8ce025dac Mon Sep 17 00:00:00 2001 From: Sergei Shulepov Date: Tue, 4 Aug 2020 10:25:48 +0200 Subject: [PATCH 138/192] Fix a typo parathreads -> parachains (#1529) --- roadmap/implementers-guide/src/runtime/scheduler.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/roadmap/implementers-guide/src/runtime/scheduler.md b/roadmap/implementers-guide/src/runtime/scheduler.md index 0dcd09d14d..96641484e4 100644 --- a/roadmap/implementers-guide/src/runtime/scheduler.md +++ b/roadmap/implementers-guide/src/runtime/scheduler.md @@ -171,7 +171,7 @@ Actions: 1. Set `configuration = Configuration::configuration()` (see [`HostConfiguration`](../types/runtime.md#host-configuration)) 1. Resize `AvailabilityCores` to have length `Paras::parachains().len() + configuration.parathread_cores with all`None` entries. 1. Compute new validator groups by shuffling using a secure randomness beacon - - We need a total of `N = Paras::parathreads().len() + configuration.parathread_cores` validator groups. + - We need a total of `N = Paras::parachains().len() + configuration.parathread_cores` validator groups. - The total number of validators `V` in the `SessionChangeNotification`'s `validators` may not be evenly divided by `V`. - First, we obtain "shuffled validators" `SV` by shuffling the validators using the `SessionChangeNotification`'s random seed. - The groups are selected by partitioning `SV`. The first V % N groups will have (V / N) + 1 members, while the remaining groups will have (V / N) members each. -- GitLab From 5fd6440ad85d444ef26ab466aaecfd8934c545f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Tue, 4 Aug 2020 11:41:39 +0200 Subject: [PATCH 139/192] Add Rococo test network (#1363) * Add Rococo test network * Correct license header * Add bootNodes address * Fix compile errors * Change bootNodes * Change rococo bootNodes * Add new bootNodes * Fix bootNodes typo * Remove public telemetry * Add rococo-local chain spec * Remove staking * Remove staking from chain spec * use rococo-staging chain spec and preserve bootnodes * Same but with --raw * update chain name and remove telemetry * Empty commit to re-trigger CI * Fix revision (temp. until I merge master) * Revert to branch = master to avoid conflicts * Revert to branch = master to avoid conflicts * Disable test (temp) * Revert to branch = master to avoid conflicts * Revert to branch = master to avoid conflicts * Change bootNodes IPs for second rococo network * Revert "Disable test (temp)" This reverts commit a159f12e3131d1a25dabb1a4d2834642f2bcdc26. * Revert purchase * Update chain spec * FUUU * Update service/src/lib.rs Co-authored-by: Robert Habermeier * Update runtime/rococo/src/lib.rs Co-authored-by: Robert Habermeier * Fix compilation Co-authored-by: Evaldo Co-authored-by: David Dorgan Co-authored-by: Cecile Tonglet Co-authored-by: Robert Habermeier --- Cargo.lock | 77 +++ Cargo.toml | 7 +- cli/src/chain_spec.rs | 0 cli/src/command.rs | 5 +- runtime/rococo/Cargo.toml | 181 ++++++ runtime/rococo/build.rs | 26 + runtime/rococo/src/constants.rs | 113 ++++ runtime/rococo/src/lib.rs | 1024 +++++++++++++++++++++++++++++++ scripts/prepare-test-net.sh | 45 ++ service/Cargo.toml | 1 + service/res/rococo.json | 116 ++++ service/src/chain_spec.rs | 316 +++++++++- service/src/lib.rs | 64 +- 13 files changed, 1965 insertions(+), 10 deletions(-) delete mode 100644 cli/src/chain_spec.rs create mode 100644 runtime/rococo/Cargo.toml create mode 100644 runtime/rococo/build.rs create mode 100644 runtime/rococo/src/constants.rs create mode 100644 runtime/rococo/src/lib.rs create mode 100755 scripts/prepare-test-net.sh create mode 100644 service/res/rococo.json diff --git a/Cargo.lock b/Cargo.lock index fd3c3615c6..bf31c0490d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5034,6 +5034,7 @@ dependencies = [ "polkadot-runtime", "polkadot-test-runtime-client", "polkadot-validation", + "rococo-runtime", "sc-authority-discovery", "sc-block-builder", "sc-chain-spec", @@ -5994,6 +5995,82 @@ dependencies = [ "librocksdb-sys", ] +[[package]] +name = "rococo-runtime" +version = "0.8.14" +dependencies = [ + "bitvec", + "frame-benchmarking", + "frame-executive", + "frame-support", + "frame-system", + "frame-system-benchmarking", + "frame-system-rpc-runtime-api", + "hex-literal", + "libsecp256k1", + "log 0.3.9", + "pallet-authority-discovery", + "pallet-authorship", + "pallet-babe", + "pallet-balances", + "pallet-collective", + "pallet-democracy", + "pallet-elections-phragmen", + "pallet-finality-tracker", + "pallet-grandpa", + "pallet-identity", + "pallet-im-online", + "pallet-indices", + "pallet-membership", + "pallet-multisig", + "pallet-nicks", + "pallet-offences", + "pallet-offences-benchmarking", + "pallet-proxy", + "pallet-randomness-collective-flip", + "pallet-recovery", + "pallet-scheduler", + "pallet-session", + "pallet-session-benchmarking", + "pallet-society", + "pallet-staking", + "pallet-staking-reward-curve", + "pallet-sudo", + "pallet-timestamp", + "pallet-transaction-payment", + "pallet-transaction-payment-rpc-runtime-api", + "pallet-treasury", + "pallet-utility", + "pallet-vesting", + "parity-scale-codec", + "polkadot-parachain", + "polkadot-primitives", + "polkadot-runtime-common", + "rustc-hex", + "serde", + "serde_derive", + "serde_json", + "smallvec 1.4.1", + "sp-api", + "sp-authority-discovery", + "sp-block-builder", + "sp-consensus-babe", + "sp-core", + "sp-inherents", + "sp-io", + "sp-keyring", + "sp-offchain", + "sp-runtime", + "sp-session", + "sp-std", + "sp-transaction-pool", + "sp-trie", + "sp-version", + "static_assertions", + "substrate-wasm-builder-runner 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", + "tiny-keccak 1.5.0", +] + [[package]] name = "rococo-v1-runtime" version = "0.8.19" diff --git a/Cargo.toml b/Cargo.toml index d91a4aef8d..c5d741b155 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -37,6 +37,7 @@ members = [ "runtime/kusama", "runtime/rococo-v1", "runtime/westend", + "runtime/rococo", "runtime/test-runtime", "runtime/test-runtime/client", "service", @@ -66,12 +67,6 @@ members = [ "parachain/test-parachains/adder/collator", "parachain/test-parachains/code-upgrader", ] -exclude = [ - "runtime/polkadot/wasm", - "runtime/kusama/wasm", - "runtime/westend/wasm", - "parachain/test-parachains/adder/wasm", -] [badges] maintenance = { status = "actively-developed" } diff --git a/cli/src/chain_spec.rs b/cli/src/chain_spec.rs deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/cli/src/command.rs b/cli/src/command.rs index 31880768a1..5537af7907 100644 --- a/cli/src/command.rs +++ b/cli/src/command.rs @@ -47,7 +47,7 @@ impl SubstrateCli for Cli { fn load_spec(&self, id: &str) -> std::result::Result, String> { let id = if id == "" { let n = get_exec_name().unwrap_or_default(); - ["polkadot", "kusama", "westend"].iter() + ["polkadot", "kusama", "westend", "rococo"].iter() .cloned() .find(|&chain| n.starts_with(chain)) .unwrap_or("polkadot") @@ -65,6 +65,9 @@ impl SubstrateCli for Cli { "westend-dev" => Box::new(service::chain_spec::westend_development_config()?), "westend-local" => Box::new(service::chain_spec::westend_local_testnet_config()?), "westend-staging" => Box::new(service::chain_spec::westend_staging_testnet_config()?), + "rococo-staging" => Box::new(service::chain_spec::rococo_staging_testnet_config()?), + "rococo-local" => Box::new(service::chain_spec::rococo_local_testnet_config()?), + "rococo" => Box::new(service::chain_spec::rococo_config()?), path if self.run.force_kusama => { Box::new(service::KusamaChainSpec::from_json_file(std::path::PathBuf::from(path))?) }, diff --git a/runtime/rococo/Cargo.toml b/runtime/rococo/Cargo.toml new file mode 100644 index 0000000000..2c5ab8add3 --- /dev/null +++ b/runtime/rococo/Cargo.toml @@ -0,0 +1,181 @@ +[package] +name = "rococo-runtime" +version = "0.8.14" +authors = ["Parity Technologies "] +edition = "2018" +build = "build.rs" + +[dependencies] +bitvec = { version = "0.17.4", default-features = false, features = ["alloc"] } +codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } +log = { version = "0.3.9", optional = true } +rustc-hex = { version = "2.0.1", default-features = false } +serde = { version = "1.0.102", default-features = false } +serde_derive = { version = "1.0.102", optional = true } +smallvec = "1.4.0" +static_assertions = "1.1.0" + +authority-discovery-primitives = { package = "sp-authority-discovery", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +babe-primitives = { package = "sp-consensus-babe", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +sp-api = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +inherents = { package = "sp-inherents", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +offchain-primitives = { package = "sp-offchain", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +sp-std = { package = "sp-std", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +sp-io = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +sp-core = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +sp-session = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +version = { package = "sp-version", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +tx-pool-api = { package = "sp-transaction-pool", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +block-builder-api = { package = "sp-block-builder", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } + +authority-discovery = { package = "pallet-authority-discovery", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +authorship = { package = "pallet-authorship", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +babe = { package = "pallet-babe", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +balances = { package = "pallet-balances", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +transaction-payment = { package = "pallet-transaction-payment", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +transaction-payment-rpc-runtime-api = { package = "pallet-transaction-payment-rpc-runtime-api", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +collective = { package = "pallet-collective", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +democracy = { package = "pallet-democracy", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +elections-phragmen = { package = "pallet-elections-phragmen", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +executive = { package = "frame-executive", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +finality-tracker = { package = "pallet-finality-tracker", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +grandpa = { package = "pallet-grandpa", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +identity = { package = "pallet-identity", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +im-online = { package = "pallet-im-online", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +indices = { package = "pallet-indices", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +membership = { package = "pallet-membership", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +multisig = { package = "pallet-multisig", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +nicks = { package = "pallet-nicks", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +offences = { package = "pallet-offences", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +proxy = { package = "pallet-proxy", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +randomness-collective-flip = { package = "pallet-randomness-collective-flip", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +recovery = { package = "pallet-recovery", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +scheduler = { package = "pallet-scheduler", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +session = { package = "pallet-session", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +society = { package = "pallet-society", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +frame-support = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +staking = { package = "pallet-staking", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-staking-reward-curve = { package = "pallet-staking-reward-curve", git = "https://github.com/paritytech/substrate", branch = "master" } +sudo = { package = "pallet-sudo", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +system = { package = "frame-system", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +system_rpc_runtime_api = { package = "frame-system-rpc-runtime-api", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +timestamp = { package = "pallet-timestamp", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +treasury = { package = "pallet-treasury", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +utility = { package = "pallet-utility", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +vesting = { package = "pallet-vesting", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } + +frame-benchmarking = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false, optional = true } +frame-system-benchmarking = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false, optional = true } +pallet-offences-benchmarking = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false, optional = true } +pallet-session-benchmarking = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false, optional = true } +hex-literal = { version = "0.2.1" } + +runtime-common = { package = "polkadot-runtime-common", path = "../common", default-features = false } +primitives = { package = "polkadot-primitives", path = "../../primitives", default-features = false } +polkadot-parachain = { path = "../../parachain", default-features = false } + +[dev-dependencies] +hex-literal = "0.2.1" +libsecp256k1 = "0.3.2" +tiny-keccak = "1.5.0" +keyring = { package = "sp-keyring", git = "https://github.com/paritytech/substrate", branch = "master" } +sp-trie = { git = "https://github.com/paritytech/substrate", branch = "master" } +serde_json = "1.0.41" + +[build-dependencies] +wasm-builder-runner = { package = "substrate-wasm-builder-runner", version = "1.0.6" } + +[features] +default = ["std"] +no_std = [] +only-staking = [] +std = [ + "authority-discovery-primitives/std", + "authority-discovery/std", + "bitvec/std", + "primitives/std", + "rustc-hex/std", + "codec/std", + "inherents/std", + "sp-core/std", + "polkadot-parachain/std", + "sp-api/std", + "tx-pool-api/std", + "block-builder-api/std", + "offchain-primitives/std", + "sp-std/std", + "sp-io/std", + "frame-support/std", + "authorship/std", + "balances/std", + "transaction-payment/std", + "transaction-payment-rpc-runtime-api/std", + "collective/std", + "elections-phragmen/std", + "democracy/std", + "executive/std", + "finality-tracker/std", + "grandpa/std", + "identity/std", + "im-online/std", + "indices/std", + "membership/std", + "multisig/std", + "nicks/std", + "offences/std", + "proxy/std", + "recovery/std", + "sp-runtime/std", + "scheduler/std", + "session/std", + "society/std", + "staking/std", + "sudo/std", + "system/std", + "system_rpc_runtime_api/std", + "timestamp/std", + "treasury/std", + "version/std", + "utility/std", + "vesting/std", + "serde_derive", + "serde/std", + "log", + "babe/std", + "babe-primitives/std", + "sp-session/std", + "randomness-collective-flip/std", + "runtime-common/std", +] +runtime-benchmarks = [ + "runtime-common/runtime-benchmarks", + "frame-benchmarking", + "frame-support/runtime-benchmarks", + "frame-system-benchmarking", + "system/runtime-benchmarks", + "sp-runtime/runtime-benchmarks", + "balances/runtime-benchmarks", + "collective/runtime-benchmarks", + "democracy/runtime-benchmarks", + "elections-phragmen/runtime-benchmarks", + "identity/runtime-benchmarks", + "im-online/runtime-benchmarks", + "scheduler/runtime-benchmarks", + "society/runtime-benchmarks", + "staking/runtime-benchmarks", + "timestamp/runtime-benchmarks", + "treasury/runtime-benchmarks", + "utility/runtime-benchmarks", + "vesting/runtime-benchmarks", + "pallet-offences-benchmarking", + "pallet-session-benchmarking", + # uncomment when it is made optional again + # "hex-literal", +] +# When enabled, the runtime api will not be build. +# +# This is required by Cumulus to access certain types of the +# runtime without clashing with the runtime api exported functions +# in WASM. +disable-runtime-api = [] diff --git a/runtime/rococo/build.rs b/runtime/rococo/build.rs new file mode 100644 index 0000000000..dff1419829 --- /dev/null +++ b/runtime/rococo/build.rs @@ -0,0 +1,26 @@ +// Copyright 2020 Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// 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 . + +use wasm_builder_runner::WasmBuilder; + +fn main() { + WasmBuilder::new() + .with_current_project() + .with_wasm_builder_from_crates("2.0.0") + .import_memory() + .export_heap_base() + .build() +} diff --git a/runtime/rococo/src/constants.rs b/runtime/rococo/src/constants.rs new file mode 100644 index 0000000000..de95703fcc --- /dev/null +++ b/runtime/rococo/src/constants.rs @@ -0,0 +1,113 @@ +// Copyright 2020 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 . + +/// Money matters. +pub mod currency { + use primitives::v0::Balance; + + pub const DOTS: Balance = 1_000_000_000_000; + pub const DOLLARS: Balance = DOTS; + pub const CENTS: Balance = DOLLARS / 100; + pub const MILLICENTS: Balance = CENTS / 1_000; + + pub const fn deposit(items: u32, bytes: u32) -> Balance { + items as Balance * 1 * DOLLARS + (bytes as Balance) * 5 * MILLICENTS + } +} + +/// Time and blocks. +pub mod time { + use primitives::v0::{Moment, BlockNumber}; + pub const MILLISECS_PER_BLOCK: Moment = 6000; + pub const SLOT_DURATION: Moment = MILLISECS_PER_BLOCK; + pub const EPOCH_DURATION_IN_BLOCKS: BlockNumber = 1 * HOURS; + + // These time units are defined in number of blocks. + pub const MINUTES: BlockNumber = 60_000 / (MILLISECS_PER_BLOCK as BlockNumber); + pub const HOURS: BlockNumber = MINUTES * 60; + pub const DAYS: BlockNumber = HOURS * 24; + + // 1 in 4 blocks (on average, not counting collisions) will be primary babe blocks. + pub const PRIMARY_PROBABILITY: (u64, u64) = (1, 4); +} + +/// Fee-related. +pub mod fee { + pub use sp_runtime::Perbill; + use primitives::v0::Balance; + use runtime_common::ExtrinsicBaseWeight; + use frame_support::weights::{ + WeightToFeePolynomial, WeightToFeeCoefficient, WeightToFeeCoefficients, + }; + use smallvec::smallvec; + + /// The block saturation level. Fees will be updates based on this value. + pub const TARGET_BLOCK_FULLNESS: Perbill = Perbill::from_percent(25); + + /// Handles converting a weight scalar to a fee value, based on the scale and granularity of the + /// node's balance type. + /// + /// This should typically create a mapping between the following ranges: + /// - [0, system::MaximumBlockWeight] + /// - [Balance::min, Balance::max] + /// + /// Yet, it can be used for any other sort of change to weight-fee. Some examples being: + /// - Setting it to `0` will essentially disable the weight fee. + /// - Setting it to `1` will cause the literal `#[weight = x]` values to be charged. + pub struct WeightToFee; + impl WeightToFeePolynomial for WeightToFee { + type Balance = Balance; + fn polynomial() -> WeightToFeeCoefficients { + // in Westend, extrinsic base weight (smallest non-zero weight) is mapped to 1/10 CENT: + let p = super::currency::CENTS; + let q = 10 * Balance::from(ExtrinsicBaseWeight::get()); + smallvec![WeightToFeeCoefficient { + degree: 1, + negative: false, + coeff_frac: Perbill::from_rational_approximation(p % q, q), + coeff_integer: p / q, + }] + } + } +} + +#[cfg(test)] +mod tests { + use frame_support::weights::WeightToFeePolynomial; + use runtime_common::{MaximumBlockWeight, ExtrinsicBaseWeight}; + use super::fee::WeightToFee; + use super::currency::{CENTS, DOLLARS, MILLICENTS}; + + #[test] + // This function tests that the fee for `MaximumBlockWeight` of weight is correct + fn full_block_fee_is_correct() { + // A full block should cost 16 DOLLARS + println!("Base: {}", ExtrinsicBaseWeight::get()); + let x = WeightToFee::calc(&MaximumBlockWeight::get()); + let y = 16 * DOLLARS; + assert!(x.max(y) - x.min(y) < MILLICENTS); + } + + #[test] + // This function tests that the fee for `ExtrinsicBaseWeight` of weight is correct + fn extrinsic_base_fee_is_correct() { + // `ExtrinsicBaseWeight` should cost 1/10 of a CENT + println!("Base: {}", ExtrinsicBaseWeight::get()); + let x = WeightToFee::calc(&ExtrinsicBaseWeight::get()); + let y = CENTS / 10; + assert!(x.max(y) - x.min(y) < MILLICENTS); + } +} diff --git a/runtime/rococo/src/lib.rs b/runtime/rococo/src/lib.rs new file mode 100644 index 0000000000..3083c002f3 --- /dev/null +++ b/runtime/rococo/src/lib.rs @@ -0,0 +1,1024 @@ +// Copyright 2020 Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Polkadot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . + +//! The Polkadot runtime. This can be compiled with `#[no_std]`, ready for Wasm. + +#![cfg_attr(not(feature = "std"), no_std)] +// `construct_runtime!` does a lot of recursion and requires us to increase the limit to 256. +#![recursion_limit="256"] + +use sp_std::prelude::*; +use codec::{Encode, Decode}; +use primitives::v0::{ + self as parachain, + AccountId, AccountIndex, Balance, BlockNumber, Hash, Nonce, Signature, Moment, + ActiveParas, AbridgedCandidateReceipt, SigningContext, +}; +use runtime_common::{ + attestations, parachains, registrar, SlowAdjustingFeeUpdate, + impls::ToAuthor, + BlockHashCount, MaximumBlockWeight, AvailableBlockRatio, MaximumBlockLength, + BlockExecutionWeight, ExtrinsicBaseWeight, RocksDbWeight, MaximumExtrinsicWeight, +}; +use sp_runtime::{ + create_runtime_str, generic, impl_opaque_keys, + ApplyExtrinsicResult, KeyTypeId, Perbill, curve::PiecewiseLinear, + transaction_validity::{TransactionValidity, TransactionSource, TransactionPriority}, + traits::{ + BlakeTwo256, Block as BlockT, OpaqueKeys, ConvertInto, IdentityLookup, + Extrinsic as ExtrinsicT, SaturatedConversion, Verify, + }, +}; +#[cfg(feature = "runtime-benchmarks")] +use sp_runtime::RuntimeString; +use version::RuntimeVersion; +use grandpa::{AuthorityId as GrandpaId, fg_primitives}; +#[cfg(any(feature = "std", test))] +use version::NativeVersion; +use sp_core::OpaqueMetadata; +use frame_support::{ + parameter_types, construct_runtime, debug, RuntimeDebug, + traits::{KeyOwnerProofSystem, Randomness, Filter, InstanceFilter}, + weights::Weight, +}; +use im_online::sr25519::AuthorityId as ImOnlineId; +use authority_discovery_primitives::AuthorityId as AuthorityDiscoveryId; +use transaction_payment_rpc_runtime_api::RuntimeDispatchInfo; +use session::historical as session_historical; +use system::EnsureRoot; + +#[cfg(feature = "std")] +pub use staking::StakerStatus; +#[cfg(any(feature = "std", test))] +pub use sp_runtime::BuildStorage; +pub use timestamp::Call as TimestampCall; +pub use balances::Call as BalancesCall; +pub use attestations::{Call as AttestationsCall, MORE_ATTESTATIONS_IDENTIFIER}; +pub use parachains::Call as ParachainsCall; + +/// Constant values used within the runtime. +pub mod constants; +use constants::{time::*, currency::*, fee::*}; + +// Make the WASM binary available. +#[cfg(feature = "std")] +include!(concat!(env!("OUT_DIR"), "/wasm_binary.rs")); + +/// Runtime version (Kusama). +pub const VERSION: RuntimeVersion = RuntimeVersion { + spec_name: create_runtime_str!("rococo"), + impl_name: create_runtime_str!("parity-rococo"), + authoring_version: 2, + spec_version: 0, + impl_version: 0, + #[cfg(not(feature = "disable-runtime-api"))] + apis: RUNTIME_API_VERSIONS, + #[cfg(feature = "disable-runtime-api")] + apis: version::create_apis_vec![[]], + transaction_version: 0, +}; + +/// Native version. +#[cfg(any(feature = "std", test))] +pub fn native_version() -> NativeVersion { + NativeVersion { + runtime_version: VERSION, + can_author_with: Default::default(), + } +} + +/// Avoid processing transactions from slots and parachain registrar. +pub struct BaseFilter; +impl Filter for BaseFilter { + fn filter(call: &Call) -> bool { + !matches!(call, Call::Registrar(_)) + } +} + +parameter_types! { + pub const Version: RuntimeVersion = VERSION; +} + +impl system::Trait for Runtime { + type BaseCallFilter = BaseFilter; + type Origin = Origin; + type Call = Call; + type Index = Nonce; + type BlockNumber = BlockNumber; + type Hash = Hash; + type Hashing = BlakeTwo256; + type AccountId = AccountId; + type Lookup = IdentityLookup; + type Header = generic::Header; + type Event = Event; + type BlockHashCount = BlockHashCount; + type MaximumBlockWeight = MaximumBlockWeight; + type DbWeight = RocksDbWeight; + type BlockExecutionWeight = BlockExecutionWeight; + type ExtrinsicBaseWeight = ExtrinsicBaseWeight; + type MaximumExtrinsicWeight = MaximumExtrinsicWeight; + type MaximumBlockLength = MaximumBlockLength; + type AvailableBlockRatio = AvailableBlockRatio; + type Version = Version; + type ModuleToIndex = ModuleToIndex; + type AccountData = balances::AccountData; + type OnNewAccount = (); + type OnKilledAccount = (); + type SystemWeightInfo = (); +} + +impl scheduler::Trait for Runtime { + type Event = Event; + type Origin = Origin; + type PalletsOrigin = OriginCaller; + type Call = Call; + type MaximumWeight = MaximumBlockWeight; + type ScheduleOrigin = EnsureRoot; + type WeightInfo = (); +} + +parameter_types! { + pub const EpochDuration: u64 = EPOCH_DURATION_IN_BLOCKS as u64; + pub const ExpectedBlockTime: Moment = MILLISECS_PER_BLOCK; +} + +impl babe::Trait for Runtime { + type EpochDuration = EpochDuration; + type ExpectedBlockTime = ExpectedBlockTime; + + // session module is the trigger + type EpochChangeTrigger = babe::ExternalTrigger; + + type KeyOwnerProofSystem = Historical; + + type KeyOwnerProof = >::Proof; + + type KeyOwnerIdentification = >::IdentificationTuple; + + type HandleEquivocation = + babe::EquivocationHandler; +} + +parameter_types! { + pub const IndexDeposit: Balance = 1 * DOLLARS; +} + +impl indices::Trait for Runtime { + type AccountIndex = AccountIndex; + type Currency = Balances; + type Deposit = IndexDeposit; + type Event = Event; + type WeightInfo = (); +} + +parameter_types! { + pub const ExistentialDeposit: Balance = 1 * CENTS; +} + +impl balances::Trait for Runtime { + type Balance = Balance; + type DustRemoval = (); + type Event = Event; + type ExistentialDeposit = ExistentialDeposit; + type AccountStore = System; + type WeightInfo = (); +} + +parameter_types! { + pub const TransactionByteFee: Balance = 10 * MILLICENTS; +} + +impl transaction_payment::Trait for Runtime { + type Currency = Balances; + type OnTransactionPayment = ToAuthor; + type TransactionByteFee = TransactionByteFee; + type WeightToFee = WeightToFee; + type FeeMultiplierUpdate = SlowAdjustingFeeUpdate; +} + +parameter_types! { + pub const MinimumPeriod: u64 = SLOT_DURATION / 2; +} +impl timestamp::Trait for Runtime { + type Moment = u64; + type OnTimestampSet = Babe; + type MinimumPeriod = MinimumPeriod; + type WeightInfo = (); +} + +parameter_types! { + pub const UncleGenerations: u32 = 0; +} + +// TODO: substrate#2986 implement this properly +impl authorship::Trait for Runtime { + type FindAuthor = session::FindAccountFromAuthorIndex; + type UncleGenerations = UncleGenerations; + type FilterUncle = (); + type EventHandler = ImOnline; +} + +parameter_types! { + pub const Period: BlockNumber = 10 * MINUTES; + pub const Offset: BlockNumber = 0; +} + +impl_opaque_keys! { + pub struct SessionKeys { + pub grandpa: Grandpa, + pub babe: Babe, + pub im_online: ImOnline, + pub parachain_validator: Parachains, + pub authority_discovery: AuthorityDiscovery, + } +} + +parameter_types! { + pub const DisabledValidatorsThreshold: Perbill = Perbill::from_percent(17); +} + +impl session::Trait for Runtime { + type Event = Event; + type ValidatorId = AccountId; + type ValidatorIdOf = (); + type ShouldEndSession = Babe; + type NextSessionRotation = Babe; + type SessionManager = (); + type SessionHandler = ::KeyTypeIdProviders; + type Keys = SessionKeys; + type DisabledValidatorsThreshold = DisabledValidatorsThreshold; + type WeightInfo = (); +} + +impl session::historical::Trait for Runtime { + type FullIdentification = (); + type FullIdentificationOf = (); +} + +pallet_staking_reward_curve::build! { + const REWARD_CURVE: PiecewiseLinear<'static> = curve!( + min_inflation: 0_025_000, + max_inflation: 0_100_000, + ideal_stake: 0_500_000, + falloff: 0_050_000, + max_piece_count: 40, + test_precision: 0_005_000, + ); +} + +parameter_types! { + // 28 eras for unbonding (7 days). + pub const BondingDuration: staking::EraIndex = 28; + // 28 eras in which slashes can be cancelled (7 days). + pub const SlashDeferDuration: staking::EraIndex = 27; + pub const RewardCurve: &'static PiecewiseLinear<'static> = &REWARD_CURVE; + pub const MaxNominatorRewardedPerValidator: u32 = 64; + // quarter of the last session will be for election. + pub const ElectionLookahead: BlockNumber = EPOCH_DURATION_IN_BLOCKS / 4; + pub const MaxIterations: u32 = 10; + pub MinSolutionScoreBump: Perbill = Perbill::from_rational_approximation(5u32, 10_000); +} + +parameter_types! { + pub const LaunchPeriod: BlockNumber = 7 * DAYS; + pub const VotingPeriod: BlockNumber = 7 * DAYS; + pub const FastTrackVotingPeriod: BlockNumber = 3 * HOURS; + pub const MinimumDeposit: Balance = 1 * DOLLARS; + pub const EnactmentPeriod: BlockNumber = 8 * DAYS; + pub const CooloffPeriod: BlockNumber = 7 * DAYS; + // One cent: $10,000 / MB + pub const PreimageByteDeposit: Balance = 10 * MILLICENTS; + pub const InstantAllowed: bool = true; +} + +parameter_types! { + pub OffencesWeightSoftLimit: Weight = Perbill::from_percent(60) * MaximumBlockWeight::get(); +} + +impl offences::Trait for Runtime { + type Event = Event; + type IdentificationTuple = session::historical::IdentificationTuple; + type OnOffenceHandler = (); + type WeightSoftLimit = OffencesWeightSoftLimit; + type WeightInfo = (); +} + +impl authority_discovery::Trait for Runtime {} + +parameter_types! { + pub const SessionDuration: BlockNumber = EPOCH_DURATION_IN_BLOCKS as _; +} + +parameter_types! { + pub const StakingUnsignedPriority: TransactionPriority = TransactionPriority::max_value() / 2; + pub const ImOnlineUnsignedPriority: TransactionPriority = TransactionPriority::max_value(); +} + +impl im_online::Trait for Runtime { + type AuthorityId = ImOnlineId; + type Event = Event; + type ReportUnresponsiveness = Offences; + type SessionDuration = SessionDuration; + type UnsignedPriority = StakingUnsignedPriority; + type WeightInfo = (); +} + +impl grandpa::Trait for Runtime { + type Event = Event; + type Call = Call; + + type KeyOwnerProofSystem = Historical; + + type KeyOwnerProof = + >::Proof; + + type KeyOwnerIdentification = >::IdentificationTuple; + + type HandleEquivocation = grandpa::EquivocationHandler; +} + +parameter_types! { + pub WindowSize: BlockNumber = finality_tracker::DEFAULT_WINDOW_SIZE.into(); + pub ReportLatency: BlockNumber = finality_tracker::DEFAULT_REPORT_LATENCY.into(); +} + +impl finality_tracker::Trait for Runtime { + type OnFinalizationStalled = (); + type WindowSize = WindowSize; + type ReportLatency = ReportLatency; +} + +parameter_types! { + pub const AttestationPeriod: BlockNumber = 50; +} + +impl attestations::Trait for Runtime { + type AttestationPeriod = AttestationPeriod; + type ValidatorIdentities = parachains::ValidatorIdentities; + type RewardAttestation = (); +} + +parameter_types! { + pub const MaxCodeSize: u32 = 10 * 1024 * 1024; // 10 MB + pub const MaxHeadDataSize: u32 = 20 * 1024; // 20 KB + pub const ValidationUpgradeFrequency: BlockNumber = 2 * DAYS; + pub const ValidationUpgradeDelay: BlockNumber = 8 * HOURS; + pub const SlashPeriod: BlockNumber = 7 * DAYS; +} + +impl parachains::Trait for Runtime { + type AuthorityId = primitives::v0::fisherman::FishermanAppCrypto; + type Origin = Origin; + type Call = Call; + type ParachainCurrency = Balances; + type BlockNumberConversion = sp_runtime::traits::Identity; + type Randomness = RandomnessCollectiveFlip; + type ActiveParachains = Registrar; + type Registrar = Registrar; + type MaxCodeSize = MaxCodeSize; + type MaxHeadDataSize = MaxHeadDataSize; + + type ValidationUpgradeFrequency = ValidationUpgradeFrequency; + type ValidationUpgradeDelay = ValidationUpgradeDelay; + type SlashPeriod = SlashPeriod; + + type Proof = sp_session::MembershipProof; + type KeyOwnerProofSystem = session::historical::Module; + type IdentificationTuple = )>>::IdentificationTuple; + type ReportOffence = Offences; + type BlockHashConversion = sp_runtime::traits::Identity; +} + +/// Submits a transaction with the node's public and signature type. Adheres to the signed extension +/// format of the chain. +impl system::offchain::CreateSignedTransaction for Runtime where + Call: From, +{ + fn create_transaction>( + call: Call, + public: ::Signer, + account: AccountId, + nonce: ::Index, + ) -> Option<(Call, ::SignaturePayload)> { + // take the biggest period possible. + let period = BlockHashCount::get() + .checked_next_power_of_two() + .map(|c| c / 2) + .unwrap_or(2) as u64; + + let current_block = System::block_number() + .saturated_into::() + // The `System::block_number` is initialized with `n+1`, + // so the actual block number is `n`. + .saturating_sub(1); + let tip = 0; + let extra: SignedExtra = ( + system::CheckSpecVersion::::new(), + system::CheckTxVersion::::new(), + system::CheckGenesis::::new(), + system::CheckMortality::::from(generic::Era::mortal(period, current_block)), + system::CheckNonce::::from(nonce), + system::CheckWeight::::new(), + transaction_payment::ChargeTransactionPayment::::from(tip), + registrar::LimitParathreadCommits::::new(), + parachains::ValidateDoubleVoteReports::::new(), + ); + let raw_payload = SignedPayload::new(call, extra).map_err(|e| { + debug::warn!("Unable to create signed payload: {:?}", e); + }).ok()?; + let signature = raw_payload.using_encoded(|payload| { + C::sign(payload, public) + })?; + let (call, extra, _) = raw_payload.deconstruct(); + Some((call, (account, signature, extra))) + } +} + +impl system::offchain::SigningTypes for Runtime { + type Public = ::Signer; + type Signature = Signature; +} + +impl system::offchain::SendTransactionTypes for Runtime where + Call: From, +{ + type OverarchingCall = Call; + type Extrinsic = UncheckedExtrinsic; +} + +parameter_types! { + pub const ParathreadDeposit: Balance = 5 * DOLLARS; + pub const QueueSize: usize = 2; + pub const MaxRetries: u32 = 3; +} + +impl registrar::Trait for Runtime { + type Event = Event; + type Origin = Origin; + type Currency = Balances; + type ParathreadDeposit = ParathreadDeposit; + type SwapAux = (); + type QueueSize = QueueSize; + type MaxRetries = MaxRetries; +} + +parameter_types! { + // Minimum 100 bytes/KSM deposited (1 CENT/byte) + pub const BasicDeposit: Balance = 10 * DOLLARS; // 258 bytes on-chain + pub const FieldDeposit: Balance = 250 * CENTS; // 66 bytes on-chain + pub const SubAccountDeposit: Balance = 2 * DOLLARS; // 53 bytes on-chain + pub const MaxSubAccounts: u32 = 100; + pub const MaxAdditionalFields: u32 = 100; + pub const MaxRegistrars: u32 = 20; +} + +impl identity::Trait for Runtime { + type Event = Event; + type Currency = Balances; + type Slashed = (); + type BasicDeposit = BasicDeposit; + type FieldDeposit = FieldDeposit; + type SubAccountDeposit = SubAccountDeposit; + type MaxSubAccounts = MaxSubAccounts; + type MaxAdditionalFields = MaxAdditionalFields; + type MaxRegistrars = MaxRegistrars; + type RegistrarOrigin = system::EnsureRoot; + type ForceOrigin = system::EnsureRoot; + type WeightInfo = (); +} + +impl utility::Trait for Runtime { + type Event = Event; + type Call = Call; + type WeightInfo = (); +} + +parameter_types! { + // One storage item; key size is 32; value is size 4+4+16+32 bytes = 56 bytes. + pub const DepositBase: Balance = deposit(1, 88); + // Additional storage item size of 32 bytes. + pub const DepositFactor: Balance = deposit(0, 32); + pub const MaxSignatories: u16 = 100; +} + +impl multisig::Trait for Runtime { + type Event = Event; + type Call = Call; + type Currency = Balances; + type DepositBase = DepositBase; + type DepositFactor = DepositFactor; + type MaxSignatories = MaxSignatories; + type WeightInfo = (); +} + +parameter_types! { + pub const ConfigDepositBase: Balance = 5 * DOLLARS; + pub const FriendDepositFactor: Balance = 50 * CENTS; + pub const MaxFriends: u16 = 9; + pub const RecoveryDeposit: Balance = 5 * DOLLARS; +} + +impl recovery::Trait for Runtime { + type Event = Event; + type Call = Call; + type Currency = Balances; + type ConfigDepositBase = ConfigDepositBase; + type FriendDepositFactor = FriendDepositFactor; + type MaxFriends = MaxFriends; + type RecoveryDeposit = RecoveryDeposit; +} + +parameter_types! { + pub const MinVestedTransfer: Balance = 100 * DOLLARS; +} + +impl vesting::Trait for Runtime { + type Event = Event; + type Currency = Balances; + type BlockNumberToBalance = ConvertInto; + type MinVestedTransfer = MinVestedTransfer; + type WeightInfo = (); +} + +impl sudo::Trait for Runtime { + type Event = Event; + type Call = Call; +} + +parameter_types! { + // One storage item; key size 32, value size 8; . + pub const ProxyDepositBase: Balance = deposit(1, 8); + // Additional storage item size of 33 bytes. + pub const ProxyDepositFactor: Balance = deposit(0, 33); + pub const MaxProxies: u16 = 32; +} + +/// The type used to represent the kinds of proxying allowed. +#[derive(Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Encode, Decode, RuntimeDebug)] +pub enum ProxyType { + Any, + NonTransfer, + SudoBalances, + IdentityJudgement, +} +impl Default for ProxyType { fn default() -> Self { Self::Any } } +impl InstanceFilter for ProxyType { + fn filter(&self, c: &Call) -> bool { + match self { + ProxyType::Any => true, + ProxyType::NonTransfer => matches!(c, + Call::System(..) | + Call::Babe(..) | + Call::Timestamp(..) | + Call::Indices(indices::Call::claim(..)) | + Call::Indices(indices::Call::free(..)) | + Call::Indices(indices::Call::freeze(..)) | + // Specifically omitting Indices `transfer`, `force_transfer` + // Specifically omitting the entire Balances pallet + Call::Authorship(..) | + Call::Offences(..) | + Call::Session(..) | + Call::FinalityTracker(..) | + Call::Grandpa(..) | + Call::ImOnline(..) | + Call::AuthorityDiscovery(..) | + Call::Parachains(..) | + Call::Attestations(..) | + Call::Registrar(..) | + Call::Utility(..) | + Call::Identity(..) | + Call::Recovery(recovery::Call::as_recovered(..)) | + Call::Recovery(recovery::Call::vouch_recovery(..)) | + Call::Recovery(recovery::Call::claim_recovery(..)) | + Call::Recovery(recovery::Call::close_recovery(..)) | + Call::Recovery(recovery::Call::remove_recovery(..)) | + Call::Recovery(recovery::Call::cancel_recovered(..)) | + // Specifically omitting Recovery `create_recovery`, `initiate_recovery` + Call::Vesting(vesting::Call::vest(..)) | + Call::Vesting(vesting::Call::vest_other(..)) | + // Specifically omitting Vesting `vested_transfer`, and `force_vested_transfer` + Call::Scheduler(..) | + // Specifically omitting Sudo pallet + Call::Proxy(..) | + Call::Multisig(..) + ), + ProxyType::SudoBalances => match c { + Call::Sudo(sudo::Call::sudo(ref x)) => matches!(x.as_ref(), &Call::Balances(..)), + Call::Utility(..) => true, + _ => false, + }, + ProxyType::IdentityJudgement => matches!(c, + Call::Identity(identity::Call::provide_judgement(..)) + | Call::Utility(utility::Call::batch(..)) + ) + } + } + fn is_superset(&self, o: &Self) -> bool { + match (self, o) { + (x, y) if x == y => true, + (ProxyType::Any, _) => true, + (_, ProxyType::Any) => false, + (ProxyType::NonTransfer, _) => true, + _ => false, + } + } +} + +impl proxy::Trait for Runtime { + type Event = Event; + type Call = Call; + type Currency = Balances; + type ProxyType = ProxyType; + type ProxyDepositBase = ProxyDepositBase; + type ProxyDepositFactor = ProxyDepositFactor; + type MaxProxies = MaxProxies; + type WeightInfo = (); +} + +construct_runtime! { + pub enum Runtime where + Block = Block, + NodeBlock = primitives::v0::Block, + UncheckedExtrinsic = UncheckedExtrinsic + { + // Basic stuff; balances is uncallable initially. + System: system::{Module, Call, Storage, Config, Event}, + RandomnessCollectiveFlip: randomness_collective_flip::{Module, Storage}, + + // Must be before session. + Babe: babe::{Module, Call, Storage, Config, Inherent, ValidateUnsigned}, + + Timestamp: timestamp::{Module, Call, Storage, Inherent}, + Indices: indices::{Module, Call, Storage, Config, Event}, + Balances: balances::{Module, Call, Storage, Config, Event}, + TransactionPayment: transaction_payment::{Module, Storage}, + + // Consensus support. + Authorship: authorship::{Module, Call, Storage}, + Offences: offences::{Module, Call, Storage, Event}, + Historical: session_historical::{Module}, + Session: session::{Module, Call, Storage, Event, Config}, + FinalityTracker: finality_tracker::{Module, Call, Storage, Inherent}, + Grandpa: grandpa::{Module, Call, Storage, Config, Event, ValidateUnsigned}, + ImOnline: im_online::{Module, Call, Storage, Event, ValidateUnsigned, Config}, + AuthorityDiscovery: authority_discovery::{Module, Call, Config}, + + // Parachains stuff; slots are disabled (no auctions initially). The rest are safe as they + // have no public dispatchables. + Parachains: parachains::{Module, Call, Storage, Config, Inherent, Origin}, + Attestations: attestations::{Module, Call, Storage}, + Registrar: registrar::{Module, Call, Storage, Event, Config}, + + // Utility module. + Utility: utility::{Module, Call, Event}, + + // Less simple identity module. + Identity: identity::{Module, Call, Storage, Event}, + + // Social recovery module. + Recovery: recovery::{Module, Call, Storage, Event}, + + // Vesting. Usable initially, but removed once all vesting is finished. + Vesting: vesting::{Module, Call, Storage, Event, Config}, + + // System scheduler. + Scheduler: scheduler::{Module, Call, Storage, Event}, + + // Sudo. + Sudo: sudo::{Module, Call, Storage, Event, Config}, + + // Proxy module. Late addition. + Proxy: proxy::{Module, Call, Storage, Event}, + + // Multisig module. Late addition. + Multisig: multisig::{Module, Call, Storage, Event}, + } +} + +/// The address format for describing accounts. +pub type Address = AccountId; +/// Block header type as expected by this runtime. +pub type Header = generic::Header; +/// Block type as expected by this runtime. +pub type Block = generic::Block; +/// A Block signed with a Justification +pub type SignedBlock = generic::SignedBlock; +/// BlockId type as expected by this runtime. +pub type BlockId = generic::BlockId; +/// The SignedExtension to the basic transaction logic. +pub type SignedExtra = ( + system::CheckSpecVersion, + system::CheckTxVersion, + system::CheckGenesis, + system::CheckMortality, + system::CheckNonce, + system::CheckWeight, + transaction_payment::ChargeTransactionPayment, + registrar::LimitParathreadCommits, + parachains::ValidateDoubleVoteReports, +); +/// Unchecked extrinsic type as expected by this runtime. +pub type UncheckedExtrinsic = generic::UncheckedExtrinsic; +/// Extrinsic type that has already been checked. +pub type CheckedExtrinsic = generic::CheckedExtrinsic; +/// Executive: handles dispatch to the various modules. +pub type Executive = executive::Executive, Runtime, AllModules>; +/// The payload being signed in transactions. +pub type SignedPayload = generic::SignedPayload; + +#[cfg(not(feature = "disable-runtime-api"))] +sp_api::impl_runtime_apis! { + impl sp_api::Core for Runtime { + fn version() -> RuntimeVersion { + VERSION + } + + fn execute_block(block: Block) { + Executive::execute_block(block) + } + + fn initialize_block(header: &::Header) { + Executive::initialize_block(header) + } + } + + impl sp_api::Metadata for Runtime { + fn metadata() -> OpaqueMetadata { + Runtime::metadata().into() + } + } + + impl block_builder_api::BlockBuilder for Runtime { + fn apply_extrinsic(extrinsic: ::Extrinsic) -> ApplyExtrinsicResult { + Executive::apply_extrinsic(extrinsic) + } + + fn finalize_block() -> ::Header { + Executive::finalize_block() + } + + fn inherent_extrinsics(data: inherents::InherentData) -> Vec<::Extrinsic> { + data.create_extrinsics() + } + + fn check_inherents( + block: Block, + data: inherents::InherentData, + ) -> inherents::CheckInherentsResult { + data.check_extrinsics(&block) + } + + fn random_seed() -> ::Hash { + RandomnessCollectiveFlip::random_seed() + } + } + + impl tx_pool_api::runtime_api::TaggedTransactionQueue for Runtime { + fn validate_transaction( + source: TransactionSource, + tx: ::Extrinsic, + ) -> TransactionValidity { + Executive::validate_transaction(source, tx) + } + } + + impl offchain_primitives::OffchainWorkerApi for Runtime { + fn offchain_worker(header: &::Header) { + Executive::offchain_worker(header) + } + } + + impl parachain::ParachainHost for Runtime { + fn validators() -> Vec { + Parachains::authorities() + } + fn duty_roster() -> parachain::DutyRoster { + Parachains::calculate_duty_roster().0 + } + fn active_parachains() -> Vec<(parachain::Id, Option<(parachain::CollatorId, parachain::Retriable)>)> { + Registrar::active_paras() + } + fn global_validation_data() -> parachain::GlobalValidationData { + Parachains::global_validation_data() + } + fn local_validation_data(id: parachain::Id) -> Option { + Parachains::current_local_validation_data(&id) + } + fn parachain_code(id: parachain::Id) -> Option { + Parachains::parachain_code(&id) + } + fn get_heads(extrinsics: Vec<::Extrinsic>) + -> Option> + { + extrinsics + .into_iter() + .find_map(|ex| match UncheckedExtrinsic::decode(&mut ex.encode().as_slice()) { + Ok(ex) => match ex.function { + Call::Parachains(ParachainsCall::set_heads(heads)) => { + Some(heads.into_iter().map(|c| c.candidate).collect()) + } + _ => None, + } + Err(_) => None, + }) + } + fn signing_context() -> SigningContext { + Parachains::signing_context() + } + fn downward_messages(id: parachain::Id) -> Vec { + Parachains::downward_messages(id) + } + } + + impl fg_primitives::GrandpaApi for Runtime { + fn grandpa_authorities() -> Vec<(GrandpaId, u64)> { + Grandpa::grandpa_authorities() + } + + fn submit_report_equivocation_unsigned_extrinsic( + equivocation_proof: fg_primitives::EquivocationProof< + ::Hash, + sp_runtime::traits::NumberFor, + >, + key_owner_proof: fg_primitives::OpaqueKeyOwnershipProof, + ) -> Option<()> { + let key_owner_proof = key_owner_proof.decode()?; + + Grandpa::submit_unsigned_equivocation_report( + equivocation_proof, + key_owner_proof, + ) + } + + fn generate_key_ownership_proof( + _set_id: fg_primitives::SetId, + authority_id: fg_primitives::AuthorityId, + ) -> Option { + use codec::Encode; + + Historical::prove((fg_primitives::KEY_TYPE, authority_id)) + .map(|p| p.encode()) + .map(fg_primitives::OpaqueKeyOwnershipProof::new) + } + } + + impl babe_primitives::BabeApi for Runtime { + fn configuration() -> babe_primitives::BabeGenesisConfiguration { + // The choice of `c` parameter (where `1 - c` represents the + // probability of a slot being empty), is done in accordance to the + // slot duration and expected target block time, for safely + // resisting network delays of maximum two seconds. + // + babe_primitives::BabeGenesisConfiguration { + slot_duration: Babe::slot_duration(), + epoch_length: EpochDuration::get(), + c: PRIMARY_PROBABILITY, + genesis_authorities: Babe::authorities(), + randomness: Babe::randomness(), + allowed_slots: babe_primitives::AllowedSlots::PrimaryAndSecondaryPlainSlots, + } + } + + fn current_epoch_start() -> babe_primitives::SlotNumber { + Babe::current_epoch_start() + } + + fn generate_key_ownership_proof( + _slot_number: babe_primitives::SlotNumber, + authority_id: babe_primitives::AuthorityId, + ) -> Option { + use codec::Encode; + + Historical::prove((babe_primitives::KEY_TYPE, authority_id)) + .map(|p| p.encode()) + .map(babe_primitives::OpaqueKeyOwnershipProof::new) + } + + fn submit_report_equivocation_unsigned_extrinsic( + equivocation_proof: babe_primitives::EquivocationProof<::Header>, + key_owner_proof: babe_primitives::OpaqueKeyOwnershipProof, + ) -> Option<()> { + let key_owner_proof = key_owner_proof.decode()?; + + Babe::submit_unsigned_equivocation_report( + equivocation_proof, + key_owner_proof, + ) + } + } + + impl authority_discovery_primitives::AuthorityDiscoveryApi for Runtime { + fn authorities() -> Vec { + AuthorityDiscovery::authorities() + } + } + + impl sp_session::SessionKeys for Runtime { + fn generate_session_keys(seed: Option>) -> Vec { + SessionKeys::generate(seed) + } + + fn decode_session_keys( + encoded: Vec, + ) -> Option, sp_core::crypto::KeyTypeId)>> { + SessionKeys::decode_into_raw_public_keys(&encoded) + } + } + + impl system_rpc_runtime_api::AccountNonceApi for Runtime { + fn account_nonce(account: AccountId) -> Nonce { + System::account_nonce(account) + } + } + + impl transaction_payment_rpc_runtime_api::TransactionPaymentApi< + Block, + Balance, + > for Runtime { + fn query_info(uxt: ::Extrinsic, len: u32) -> RuntimeDispatchInfo { + TransactionPayment::query_info(uxt, len) + } + } + + #[cfg(feature = "runtime-benchmarks")] + impl frame_benchmarking::Benchmark for Runtime { + fn dispatch_benchmark( + pallet: Vec, + benchmark: Vec, + lowest_range_values: Vec, + highest_range_values: Vec, + steps: Vec, + repeat: u32, + ) -> Result, RuntimeString> { + use frame_benchmarking::{Benchmarking, BenchmarkBatch, add_benchmark}; + // Trying to add benchmarks directly to the Session Pallet caused cyclic dependency issues. + // To get around that, we separated the Session benchmarks into its own crate, which is why + // we need these two lines below. + use pallet_session_benchmarking::Module as SessionBench; + use pallet_offences_benchmarking::Module as OffencesBench; + use frame_system_benchmarking::Module as SystemBench; + + impl pallet_session_benchmarking::Trait for Runtime {} + impl pallet_offences_benchmarking::Trait for Runtime {} + impl frame_system_benchmarking::Trait for Runtime {} + + let whitelist: Vec> = vec![ + // Block Number + // frame_system::Number::::hashed_key().to_vec(), + hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef702a5c1b19ab7a04f536c519aca4983ac").to_vec(), + // Total Issuance + hex_literal::hex!("c2261276cc9d1f8598ea4b6a74b15c2f57c875e4cff74148e4628f264b974c80").to_vec(), + // Execution Phase + hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef7ff553b5a9862a516939d82b3d3d8661a").to_vec(), + // Event Count + hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef70a98fdbe9ce6c55837576c60c7af3850").to_vec(), + // System Events + hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef780d41e5e16056765bc8461851072c9d7").to_vec(), + // Caller 0 Account + hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da946c154ffd9992e395af90b5b13cc6f295c77033fce8a9045824a6690bbf99c6db269502f0a8d1d2a008542d5690a0749").to_vec(), + // Treasury Account + hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da95ecffd7b6c0f78751baa9d281e0bfa3a6d6f646c70792f74727372790000000000000000000000000000000000000000").to_vec(), + ]; + + let mut batches = Vec::::new(); + let params = (&pallet, &benchmark, &lowest_range_values, &highest_range_values, &steps, repeat, &whitelist); + + add_benchmark!(params, batches, balances,Balances); + add_benchmark!(params, batches, identity,Identity); + add_benchmark!(params, batches, im_online,ImOnline); + add_benchmark!(params, batches, offences,OffencesBench::); + add_benchmark!(params, batches, scheduler, Scheduler); + add_benchmark!(params, batches, session, SessionBench::); + add_benchmark!(params, batches, staking, Staking); + add_benchmark!(params, batches, system, SystemBench::); + add_benchmark!(params, batches, timestamp, Timestamp); + add_benchmark!(params, batches, utility, Utility); + add_benchmark!(params, batches, vesting, Vesting); + + if batches.is_empty() { return Err("Benchmark not found for this pallet.".into()) } + Ok(batches) + } + } +} diff --git a/scripts/prepare-test-net.sh b/scripts/prepare-test-net.sh new file mode 100755 index 0000000000..6499a1199b --- /dev/null +++ b/scripts/prepare-test-net.sh @@ -0,0 +1,45 @@ +#!/usr/bin/env bash +set -e + +if [ "$#" -ne 1 ]; then + echo "Please provide the number of initial validators!" + exit 1 +fi + +generate_account_id() { + subkey ${3:-} inspect "$SECRET//$1//$2" | grep "Account ID" | awk '{ print $3 }' +} + +generate_address() { + subkey ${3:-} inspect "$SECRET//$1//$2" | grep "SS58 Address" | awk '{ print $3 }' +} + +generate_address_and_account_id() { + ACCOUNT=$(generate_account_id $1 $2 $3) + ADDRESS=$(generate_address $1 $2 $3) + if ${4:-false}; then + INTO="unchecked_into" + else + INTO="into" + fi + + printf "//$ADDRESS\nhex![\"${ACCOUNT#'0x'}\"].$INTO()," +} + +V_NUM=$1 + +AUTHORITIES="" + +for i in $(seq 1 $V_NUM); do + AUTHORITIES+="(\n" + AUTHORITIES+="$(generate_address_and_account_id $i stash)\n" + AUTHORITIES+="$(generate_address_and_account_id $i controller)\n" + AUTHORITIES+="$(generate_address_and_account_id $i babe '--sr25519' true)\n" + AUTHORITIES+="$(generate_address_and_account_id $i grandpa '--ed25519' true)\n" + AUTHORITIES+="$(generate_address_and_account_id $i im_online '--sr25519' true)\n" + AUTHORITIES+="$(generate_address_and_account_id $i parachains '--sr25519' true)\n" + AUTHORITIES+="$(generate_address_and_account_id $i authority_discovery '--sr25519' true)\n" + AUTHORITIES+="),\n" +done + +printf "$AUTHORITIES" diff --git a/service/Cargo.toml b/service/Cargo.toml index 9c16f6372b..858d1e415c 100644 --- a/service/Cargo.toml +++ b/service/Cargo.toml @@ -18,6 +18,7 @@ polkadot-primitives = { path = "../primitives" } polkadot-runtime = { path = "../runtime/polkadot" } kusama-runtime = { path = "../runtime/kusama" } westend-runtime = { path = "../runtime/westend" } +rococo-runtime = { path = "../runtime/rococo" } polkadot-network = { path = "../network", optional = true } polkadot-rpc = { path = "../rpc" } sp-io = { git = "https://github.com/paritytech/substrate", branch = "master" } diff --git a/service/res/rococo.json b/service/res/rococo.json new file mode 100644 index 0000000000..b936bcc1c3 --- /dev/null +++ b/service/res/rococo.json @@ -0,0 +1,116 @@ +{ + "name": "Rococo", + "id": "rococo_v1", + "chainType": "Live", + "bootNodes": [ + "/ip4/34.91.29.196/tcp/30333/p2p/12D3KooWCZ1rNSGeN2dxSQJEipYriwX8g2rjkXJhsf81vqdYE3ZQ", + "/ip4/34.91.29.196/tcp/30334/ws/p2p/12D3KooWCZ1rNSGeN2dxSQJEipYriwX8g2rjkXJhsf81vqdYE3ZQ", + "/ip4/34.91.203.20/tcp/30333/p2p/12D3KooWBgKQTcgKSnyMwUZcv2tRG1qDP5MCGRM4ms4Qpx9o7pWs", + "/ip4/34.91.203.20/tcp/30334/ws/p2p/12D3KooWBgKQTcgKSnyMwUZcv2tRG1qDP5MCGRM4ms4Qpx9o7pWs", + "/ip4/34.91.169.182/tcp/30333/p2p/12D3KooWS9bxULD9v33nxgSbvUCRbN55YHTtBxR6HK1dGV7hLfKG", + "/ip4/34.91.169.182/tcp/30334/ws/p2p/12D3KooWS9bxULD9v33nxgSbvUCRbN55YHTtBxR6HK1dGV7hLfKG", + "/ip4/34.91.84.95/tcp/30333/p2p/12D3KooWDGjLd5tpg1wf4ALzy5P2GSxBWi2h8oa2n2zrGVLuR93Y", + "/ip4/34.91.84.95/tcp/30334/ws/p2p/12D3KooWDGjLd5tpg1wf4ALzy5P2GSxBWi2h8oa2n2zrGVLuR93Y", + "/ip4/34.91.46.116/tcp/30333/p2p/12D3KooWHs116csgZ981dyqqsvKcB6LkaEPVxdQ855KPTJFaVnFQ", + "/ip4/34.91.46.116/tcp/30334/ws/p2p/12D3KooWHs116csgZ981dyqqsvKcB6LkaEPVxdQ855KPTJFaVnFQ", + "/ip4/34.91.139.161/tcp/30333/p2p/12D3KooWDRH31a4HGMn5zkSTpgzCXb9EYsvy28CJ3WsWwg5TD1aH", + "/ip4/34.91.139.161/tcp/30334/ws/p2p/12D3KooWDRH31a4HGMn5zkSTpgzCXb9EYsvy28CJ3WsWwg5TD1aH", + "/ip4/35.204.145.76/tcp/30333/p2p/12D3KooWCQAtT4PK86onHDdZZbqokKVEwr8hbavfoPbXkG9vkN6j", + "/ip4/35.204.145.76/tcp/30334/ws/p2p/12D3KooWCQAtT4PK86onHDdZZbqokKVEwr8hbavfoPbXkG9vkN6j", + "/ip4/34.91.129.35/tcp/30333/p2p/12D3KooWJjwoqM3BbamMdSNevCQfy1LtDf6P58BTFwGo2H9MPHuK", + "/ip4/34.91.129.35/tcp/30334/ws/p2p/12D3KooWJjwoqM3BbamMdSNevCQfy1LtDf6P58BTFwGo2H9MPHuK" + ], + "telemetryEndpoints": [], + "protocolId": "roc", + "properties": { + "ss58Format": 42, + "tokenDecimals": 12, + "tokenSymbol": "ROC" + }, + "forkBlocks": null, + "badBlocks": null, + "consensusEngine": null, + "genesis": { + "raw": { + "top": { + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19507f532159f03d44eb6175646980f49eae66a0ac9f610316906ec8f1a0928e20d7059d76a5ca53cbcb5a9b50dd3c": "0x62475fe5406a7cb6a64c51d0af9d3ab5c2151bcae982fb812f7a76b706914d6a", + "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb319b9aeb2f5add22992ef83665b39d7a565e11bf8d18d41d45a8011601c339e57a8ea88c8ff7bba6f": "0xe1b68fbd84333e31486c08e6153d9a1415b2e7e71b413702b7d64e9b631184a1d2644c1ab2c63a3ad8d40ad70d4b260969e3abfe6d7e6665f50dc9f6365c9d2aee93e26259decb89afcf17ef2aa0fa2db2e1042fb8f56ecfb24d19eae86298786caf2fe2cf01fc3f07e113a2940a1d6c7bc1ab9d8974f152c2ee201d4f16f67a2c57f81fd311c1ab53813c6817fe67f8947f8d39258252663b3384ab4195494d", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19503c0791148c7780b8626162658038757d0de00a0c739e7d7984ef4bc01161bd61e198b7c01b618425c16bb5bd5f": "0x520b48452969f6ddf263b664de0adb0c729d0e0ad3b0e5f3cb636c541bc9022a", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950ef9482dba3e5b0d862616265807c94715e5dd8ab54221b1b6b2bfa5666f593f28a92a18e28052531de1bd80813": "0x02a2d8cfcf75dda85fafc04ace3bcb73160034ed1964c43098fb1fe831de1b16", + "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da995445d4efb6eae1971fb125f6190c49202a2d8cfcf75dda85fafc04ace3bcb73160034ed1964c43098fb1fe831de1b16": "0x000000000100407a10f35a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950ab7b30d24546522861756469804e262811acdfe94528bfc3c65036080426a0e1301b9ada8d687a70ffcae99c26": "0x8062e9c21f1d92926103119f7e8153cebdb1e5ab3e52d6f395be80bb193eab47", + "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9935ae9d4cb148940af99a366d100d5af02ea6bfa8b23b92fe4b5db1063a1f9475e3acd0ab61e6b4f454ed6ba00b5f864": "0x000000000100407a10f35a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da945315c068df2baa1c677b9b3e81f7439fa373e25a1c4fe19c7148acde13bc3db1811cf656dc086820f3dda736b9c4a00": "0x000000000100407a10f35a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19509556741f2a8e07d17061726180ac3ce74c09d1bb387d3f79dc8df88d661da689d5364eb8131c83fcc8ecb2fc5b": "0x520b48452969f6ddf263b664de0adb0c729d0e0ad3b0e5f3cb636c541bc9022a", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950f8df002813b43b80696d6f6e80560d90ca51e9c9481b8a9810060e04d0708d246714960439f804e5c6f40ca651": "0xfa373e25a1c4fe19c7148acde13bc3db1811cf656dc086820f3dda736b9c4a00", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950091b1bd4e8d4c12061756469802496f28d887d84705c6dae98aee8bf90fc5ad10bb5545eca1de6b68425b70f7c": "0x38f3c2f38f6d47f161e98c697bbe3ca0e47c033460afda0dda314ab4222a0404", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa195017808c1b0df57d2a7061726180f2d19482d1da872af925e84478787e0719f637bd1f88c0c99316bdf2658d5478": "0x38f3c2f38f6d47f161e98c697bbe3ca0e47c033460afda0dda314ab4222a0404", + "0x2371e21684d2fae99bcb4d579242f74a8a2d09463effcc78a22d75b9cb87dffc": "0x0000000000000000", + "0xcec5070d609dd3497f72bde07fc96ba088dcde934c658227ee1dfafcd6e16903": "0x2062475fe5406a7cb6a64c51d0af9d3ab5c2151bcae982fb812f7a76b706914d6a520b48452969f6ddf263b664de0adb0c729d0e0ad3b0e5f3cb636c541bc9022a92ef83665b39d7a565e11bf8d18d41d45a8011601c339e57a8ea88c8ff7bba6f38f3c2f38f6d47f161e98c697bbe3ca0e47c033460afda0dda314ab4222a040402a2d8cfcf75dda85fafc04ace3bcb73160034ed1964c43098fb1fe831de1b1602ea6bfa8b23b92fe4b5db1063a1f9475e3acd0ab61e6b4f454ed6ba00b5f864fa373e25a1c4fe19c7148acde13bc3db1811cf656dc086820f3dda736b9c4a008062e9c21f1d92926103119f7e8153cebdb1e5ab3e52d6f395be80bb193eab47", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19509df5f4072c4244956261626580764186bc30fd5a02477f19948dc723d6d57ab174debd4f80ed6038ec960bfe21": "0x38f3c2f38f6d47f161e98c697bbe3ca0e47c033460afda0dda314ab4222a0404", + "0x2099d7f109d6e535fb000bba623fd4409f99a2ce711f3a31b2fc05604c93f179": "0x20f49eae66a0ac9f610316906ec8f1a0928e20d7059d76a5ca53cbcb5a9b50dd3cf6f8fe475130d21165446a02fb1dbce3a7bf36412e5d98f4f0473aed9252f3492c57f81fd311c1ab53813c6817fe67f8947f8d39258252663b3384ab4195494d2496f28d887d84705c6dae98aee8bf90fc5ad10bb5545eca1de6b68425b70f7c306ac5c772fe858942f92b6e28bd82fb7dd8cdd25f9a4626c1b0eee075fcb531160ea09c5717270e958a3da42673fa011613a9539b2e4ebcad8626bc117ca04a64d59feddb3d00316a55906953fb3db8985797472bd2e6c7ea1ab730cc339d7f4e262811acdfe94528bfc3c65036080426a0e1301b9ada8d687a70ffcae99c26", + "0x2371e21684d2fae99bcb4d579242f74ad47cb8f5328af743ddfb361e7180e7fcbb1bdbcacd6ac9340000000000000000": "0x00000000", + "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb393c0875f4080dabc8062e9c21f1d92926103119f7e8153cebdb1e5ab3e52d6f395be80bb193eab47": "0x4ee66173993dd0db5d628c4c9cb61a27b76611ad3c3925947f0d0011ee2c5dccda6b2df18f0f9001a6dcf1d301b92534fe9b1f3ccfa10c49449fee93adaa834992156f54a114ee191415898f2da013d9db6a5362d6b36330d5fc23e27360ab666edd19e3c5230998e533e165a26438afe663368d0eab37fabff734a36119ce0e4e262811acdfe94528bfc3c65036080426a0e1301b9ada8d687a70ffcae99c26", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19501b1525326b5d47776772616e80fcd5f87a6fd5707a25122a01b4dac0a8482259df7d42a9a096606df1320df08d": "0x520b48452969f6ddf263b664de0adb0c729d0e0ad3b0e5f3cb636c541bc9022a", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950eed20ee87a5b7ad570617261806caf2fe2cf01fc3f07e113a2940a1d6c7bc1ab9d8974f152c2ee201d4f16f67a": "0x92ef83665b39d7a565e11bf8d18d41d45a8011601c339e57a8ea88c8ff7bba6f", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950feca8028a77ba7626772616e804ee66173993dd0db5d628c4c9cb61a27b76611ad3c3925947f0d0011ee2c5dcc": "0x8062e9c21f1d92926103119f7e8153cebdb1e5ab3e52d6f395be80bb193eab47", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19503eaa3e59477bc9506261626580720537e2c1c554654d73b3889c3ef4c3c2f95a65dd3f7c185ebe4afebed78372": "0xfa373e25a1c4fe19c7148acde13bc3db1811cf656dc086820f3dda736b9c4a00", + "0x26aa394eea5630e07c48ae0c9558cef7f9cce9c888469bb1a0dceaa129672ef8": "0x0018726f636f636f", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa195054b9b7ccd1690e40706172618006a7f34a2ae69cc0cca633c7a82b37cfba821707eb62ffe065b242e1230e4661": "0x62475fe5406a7cb6a64c51d0af9d3ab5c2151bcae982fb812f7a76b706914d6a", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19507d9c46786caf74af6261626580d2644c1ab2c63a3ad8d40ad70d4b260969e3abfe6d7e6665f50dc9f6365c9d2a": "0x92ef83665b39d7a565e11bf8d18d41d45a8011601c339e57a8ea88c8ff7bba6f", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19507bb98654d3bedee5706172618046d6245026e0e4f4a120cfdfbc9f36a37de202489c4c7ff05b6c54d1811aee2c": "0x02a2d8cfcf75dda85fafc04ace3bcb73160034ed1964c43098fb1fe831de1b16", + "0x5c0d1176a568c1f92944340dbfed9e9c530ebca703c85910e7164cb7d1c9e47b": "0x9ed7705e3c7da027ba0583a22a3212042f7e715d3c168ba14f1424e2bc111d00", + "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da942cd783ab1dc80a5347fe6c6f20ea02b9ed7705e3c7da027ba0583a22a3212042f7e715d3c168ba14f1424e2bc111d00": "0x0000000000000064a7b3b6e00d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb3df32aff68041374f02a2d8cfcf75dda85fafc04ace3bcb73160034ed1964c43098fb1fe831de1b16": "0x6c878e33b83c20324238d22240f735457b6fba544b383e70bb62a27b57380c817c94715e5dd8ab54221b1b6b2bfa5666f593f28a92a18e28052531de1bd80813d2f9d537ffa59919a4028afdb627c14c14c97a1547e13e8e82203d2049b15b1a46d6245026e0e4f4a120cfdfbc9f36a37de202489c4c7ff05b6c54d1811aee2c306ac5c772fe858942f92b6e28bd82fb7dd8cdd25f9a4626c1b0eee075fcb531", + "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb3dc18ebe8d771cfa002ea6bfa8b23b92fe4b5db1063a1f9475e3acd0ab61e6b4f454ed6ba00b5f864": "0xd9c056c98ca0e6b4eb7f5c58c007c1db7be0fe1f3776108f797dd4990d1ccc33bab3cccdcc34401e9b3971b96a662686cf755aa869a5c4b762199ce531b12c5bc4a980da30939d5bb9e4a734d12bf81259ae286aa21fa4b65405347fa40eff350062a5ab339962d84b6711b86fa67b457483fcd3d75dafb7bd15f182b7434227160ea09c5717270e958a3da42673fa011613a9539b2e4ebcad8626bc117ca04a", + "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb3328718e032416872520b48452969f6ddf263b664de0adb0c729d0e0ad3b0e5f3cb636c541bc9022a": "0xfcd5f87a6fd5707a25122a01b4dac0a8482259df7d42a9a096606df1320df08d38757d0de00a0c739e7d7984ef4bc01161bd61e198b7c01b618425c16bb5bd5f48a910c0af90898f11bd57d37ceaea53c78994f8e1833a7ade483c9a84bde055ac3ce74c09d1bb387d3f79dc8df88d661da689d5364eb8131c83fcc8ecb2fc5bf6f8fe475130d21165446a02fb1dbce3a7bf36412e5d98f4f0473aed9252f349", + "0x3a636f6465": "0x0061736d0100000001f1023260037f7f7f017f60027f7f017f60027f7f0060017f0060047f7f7f7f0060037f7f7f0060057f7f7f7f7f0060017f017e60017f017f60027f7e017f60037f7e7f017f6000017f60027f7f017e60037f7f7e017e60000060017e017f60017e0060017e017e60047f7e7e7e017f60027f7e017e60037f7e7e006000017e60027e7e0060037e7e7f017e60027e7f017f60057f7f7f7f7f017f60047f7f7f7f017f60077f7f7f7f7f7f7f017f60047f7f7f7e0060047f7e7f7f0060067f7f7f7f7f7f0060077f7e7e7e7e7e7e0060047f7f7e7e0060067f7f7f7e7e7f0060097f7f7f7f7f7f7f7f7e0060067f7f7f7f7e7e0060067f7f7e7f7f7f0060037e7f7f017f60067f7f7e7e7e7f0060077f7f7f7e7f7f7f0060077f7f7e7e7e7e7f0060097f7f7f7f7f7f7f7f7f00600a7f7f7f7f7f7f7f7f7f7f0060057f7f7f7e7e017f60077f7f7f7f7f7f7f0060027f7e0060067f7f7f7f7f7f017f60057f7e7e7e7e0060047f7e7e7f0060067f7e7e7e7e7f0002cc0b2503656e76066d656d6f727902001203656e761c6578745f616c6c6f6361746f725f667265655f76657273696f6e5f31000303656e761e6578745f616c6c6f6361746f725f6d616c6c6f635f76657273696f6e5f31000803656e76256578745f63727970746f5f656432353531395f67656e65726174655f76657273696f6e5f31000903656e76236578745f63727970746f5f656432353531395f7665726966795f76657273696f6e5f31000a03656e76286578745f63727970746f5f66696e6973685f62617463685f7665726966795f76657273696f6e5f31000b03656e76376578745f63727970746f5f736563703235366b315f65636473615f7265636f7665725f636f6d707265737365645f76657273696f6e5f31000c03656e76256578745f63727970746f5f737232353531395f67656e65726174655f76657273696f6e5f31000903656e76286578745f63727970746f5f737232353531395f7075626c69635f6b6579735f76657273696f6e5f31000703656e76216578745f63727970746f5f737232353531395f7369676e5f76657273696f6e5f31000d03656e76236578745f63727970746f5f737232353531395f7665726966795f76657273696f6e5f32000a03656e76276578745f63727970746f5f73746172745f62617463685f7665726966795f76657273696f6e5f31000e03656e762a6578745f747269655f626c616b65325f3235365f6f7264657265645f726f6f745f76657273696f6e5f31000f03656e761c6578745f6d6973635f7072696e745f6865785f76657273696f6e5f31001003656e761c6578745f6d6973635f7072696e745f6e756d5f76657273696f6e5f31001003656e761d6578745f6d6973635f7072696e745f757466385f76657273696f6e5f31001003656e76226578745f6d6973635f72756e74696d655f76657273696f6e5f76657273696f6e5f31001103656e76206578745f68617368696e675f626c616b65325f3132385f76657273696f6e5f31000f03656e76206578745f68617368696e675f626c616b65325f3235365f76657273696f6e5f31000f03656e761e6578745f68617368696e675f74776f785f3132385f76657273696f6e5f31000f03656e761d6578745f68617368696e675f74776f785f36345f76657273696f6e5f31000f03656e76236578745f6f6666636861696e5f69735f76616c696461746f725f76657273696f6e5f31000b03656e76346578745f6f6666636861696e5f6c6f63616c5f73746f726167655f636f6d706172655f616e645f7365745f76657273696f6e5f31001203656e76286578745f6f6666636861696e5f6c6f63616c5f73746f726167655f6765745f76657273696f6e5f31001303656e76286578745f6f6666636861696e5f6c6f63616c5f73746f726167655f7365745f76657273696f6e5f31001403656e76246578745f6f6666636861696e5f6e6574776f726b5f73746174655f76657273696f6e5f31001503656e76296578745f6f6666636861696e5f7375626d69745f7472616e73616374696f6e5f76657273696f6e5f31001103656e761c6578745f73746f726167655f617070656e645f76657273696f6e5f31001603656e76226578745f73746f726167655f6368616e6765735f726f6f745f76657273696f6e5f31001103656e761b6578745f73746f726167655f636c6561725f76657273696f6e5f31001003656e76226578745f73746f726167655f636c6561725f7072656669785f76657273696f6e5f31001003656e76196578745f73746f726167655f6765745f76657273696f6e5f31001103656e761e6578745f73746f726167655f6e6578745f6b65795f76657273696f6e5f31001103656e761a6578745f73746f726167655f726561645f76657273696f6e5f31001703656e761a6578745f73746f726167655f726f6f745f76657273696f6e5f31001503656e76196578745f73746f726167655f7365745f76657273696f6e5f31001603656e76196578745f6c6f6767696e675f6c6f675f76657273696f6e5f31001403b306b10608080303000008080e0e0e050202050e0e00060300010102010202020201180307191a05050006010101081b01010105010100040101000101000100030101010201080505020205020502020205020200010102010603010203050105061c0602020205050205020202020205020205020505021d02020202020402020202020202020202020202020202020100020405020502020202020202030302050202020502020205020502050205020502020203030302020202020205020502020202020205050202050202020505020202050502020303030502020202021e0501020203030405080202021f020202050e060202020205020201050202050205020505020202020303020202020301010802080202050205020503030205020202030302020202020202020202020305080302020205202005020505052120050202020202020202020203020202020201021a02020402030205050202040e1a1a05030303030101010102020202020202020203020305220505230502050203050403050204070e02030301020202050603050303050303020202030303020202020202050203030502080502050505050305032102050502070205020204020302050502020524252605020502021027051d0303030202030604030105021e03040503010204021a04020303020502020302030302020202020202020103030302020205052829022a0502020208020605020203030203020202020e030202020202021003020305050502022b020502030505050203022c02050305020502050505050202022d03020203030302030302020202020302030202020703030302020303020202030305050502042e0306010108060101012d02020602020202020303020203030202030300050505020202030204011e061e0502040b05030302020303020203020203030203020202050505030303000502050e020202020202020303030204040502050002020400030c0c02020e0b0c0c0c0c0c0c0c0c0c0b020c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c05050c020c0c010101010101030303030303030303030303030303030301010303030502080502010102010308022d01020102052f2f3031000000002f300407017001d901d9010619037f01418080c0000b7f0041d0c2c7000b7f0041d0c2c7000b07fd0823195f5f696e6469726563745f66756e6374696f6e5f7461626c6501000c436f72655f76657273696f6e00f40512436f72655f657865637574655f626c6f636b00f50515436f72655f696e697469616c697a655f626c6f636b00fa05114d657461646174615f6d6574616461746100fb051c426c6f636b4275696c6465725f6170706c795f65787472696e73696300fc051b426c6f636b4275696c6465725f66696e616c697a655f626c6f636b00fd0520426c6f636b4275696c6465725f696e686572656e745f65787472696e7369637300fe051c426c6f636b4275696c6465725f636865636b5f696e686572656e747300ff0518426c6f636b4275696c6465725f72616e646f6d5f736565640080062b5461676765645472616e73616374696f6e51756575655f76616c69646174655f7472616e73616374696f6e008106214f6666636861696e576f726b65724170695f6f6666636861696e5f776f726b65720082061850617261636861696e486f73745f76616c696461746f72730085061950617261636861696e486f73745f647574795f726f737465720086061f50617261636861696e486f73745f6163746976655f70617261636861696e730087062450617261636861696e486f73745f676c6f62616c5f76616c69646174696f6e5f646174610088062350617261636861696e486f73745f6c6f63616c5f76616c69646174696f6e5f646174610089061c50617261636861696e486f73745f70617261636861696e5f636f6465008a061750617261636861696e486f73745f6765745f6865616473008b061d50617261636861696e486f73745f7369676e696e675f636f6e74657874008c061f50617261636861696e486f73745f646f776e776172645f6d65737361676573008d061e4772616e6470614170695f6772616e6470615f617574686f726974696573008e06384772616e6470614170695f7375626d69745f7265706f72745f65717569766f636174696f6e5f756e7369676e65645f65787472696e736963008f06274772616e6470614170695f67656e65726174655f6b65795f6f776e6572736869705f70726f6f6600900615426162654170695f636f6e66696775726174696f6e0091061b426162654170695f63757272656e745f65706f63685f737461727400920624426162654170695f67656e65726174655f6b65795f6f776e6572736869705f70726f6f6600930635426162654170695f7375626d69745f7265706f72745f65717569766f636174696f6e5f756e7369676e65645f65787472696e73696300940621417574686f72697479446973636f766572794170695f617574686f7269746965730095062153657373696f6e4b6579735f67656e65726174655f73657373696f6e5f6b6579730096061f53657373696f6e4b6579735f6465636f64655f73657373696f6e5f6b6579730099061d4163636f756e744e6f6e63654170695f6163636f756e745f6e6f6e6365009b06205472616e73616374696f6e5061796d656e744170695f71756572795f696e666f009c060a5f5f646174615f656e6403010b5f5f686561705f626173650302099603010041010bd8013c41544bc1064c4d785e7f618c036283028a03b0018b0394059505990589039805a004553738393a63445658595a5b5c74b1027576777d7b7caf02bc03ef02ae02ad02bb04ac02b202c302c202c102bf02ca02c902c802c702c602f002ee02bf06bb03c103c303c203f903fe03f105f205e905ee05fc03ea05ed05ef05f00593049204900498049504c806be04bd04bc04c705c604c504c404c304c204c104a605f104f704f604f504f404fa04fd04fc048005c60687059a05a705c805cb05ca05ce05d205d105d005e805a006a1069d069e069f06b306b406b506ba04b804a306c004d404b002f801c605c505c905ef04ee04f00486038503a4068f048e04a5069404a304f904fb04860585058b05ed02a606ba03b903a706c903e605e505e705f305a505a405a806ac05a905a805a906ad05f304f204de04d705d605c105ab02aa02aa06f901eb04ab06be02bd02ac06c502d102bf03be03ad06c003ca03f703f603ae06f803a10497049604af06a20482058105b0068a05cd05cc05b106cf05d80588038703b2069603be0651520af2f73eb1060600200010250b0700200010c3060b0600200010270b0700200010c2060b0a0020002001200210290b2a01017f0240200210c3062203450d002003200020022001200120024b1b10cf061a200010c2060b20030b06002000102b0b1d01017f0240200010c3062201450d0020014100200010d1061a0b20010b0500102d000b1600410141d8adc700410741dfadc7004122107900000b110041c8bcc7004111418080c000102f000b4701017f230041206b22032400200341146a4100360200200341d4c0c700360210200342013702042003200136021c200320003602182003200341186a36020020032002103d000ba90101027f024002400240200041046a2802002202200028020822036b20014f0d00200320016a22012003490d01200241017422032001200320014b1b22014108200141084b1b22034100480d01024002402000280200410020021b22010d002003102421010c010b20022003460d00024020020d002003102421010c010b200120022003102821010b2001450d0220002001360200200041046a20033602000b0f0b102e000b102c000bdb0201067f230041206b2202240020012802002103024002402001280204220441037422050d00410021060c010b200341046a2107410021060340200728020020066a2106200741086a2107200541786a22050d000b0b024002400240200141146a2802000d00200621070c010b024020040d004100410041a880c0001032000b410021054101210402402006410f4b0d00200341046a280200450d020b200620066a22072006490d010b02402007417f4c0d00024020070d0041002105410121040c020b200721052007102422040d011033000b1034000b20004100360208200020043602002000200536020420022000360204200241086a41106a200141106a290200370300200241086a41086a200141086a290200370300200220012902003703080240200241046a41b880c000200241086a10350d00200241206a24000f0b41d080c0004133200241086a418481c000419481c0001036000b6c01017f230041306b2203240020032001360204200320003602002003411c6a41023602002003412c6a41013602002003420237020c200341d884c000360208200341013602242003200341206a360218200320033602282003200341046a360220200341086a2002103d000b0500102c000b0500102e000b9e0601097f230041306b22032400200341246a2001360200200341033a00282003428080808080043703082003200036022020034100360218200341003602100240024002400240024020022802082204450d0020022802002105200228020422062002410c6a2802002207200720064b1b2207450d01200241146a280200210820022802102109200020052802002005280204200128020c1100000d03200541086a21024100210a0240024003402003200441046a28020036020c20032004411c6a2d00003a00282003200441086a280200360208200441186a280200210041002101024002400240200441146a2802000e03010002010b200020084f0d032000410374210b410021012009200b6a220b2802044102470d01200b28020028020021000b410121010b2003200036021420032001360210200441106a2802002100410021010240024002402004410c6a2802000e03010002010b200020084f0d042000410374210b2009200b6a220b2802044102470d01200b28020028020021000b410121010b2003200036021c2003200136021802402004280200220020084f0d00200920004103746a2200280200200341086a20002802041101000d07200a41016a220a20074f0d06200441206a2104200241046a210020022802002101200241086a2102200328022020012000280200200328022428020c110000450d010c070b0b2000200841b089c0001032000b2000200841a089c0001032000b2000200841a089c0001032000b2002280200210520022802042206200241146a2802002204200420064b1b2207450d0020022802102104200020052802002005280204200128020c1100000d02200541086a21024100210003402004280200200341086a200441046a2802001101000d03200041016a220020074f0d02200441086a2104200241046a21012002280200210a200241086a21022003280220200a2001280200200328022428020c110000450d000c030b0b410021070b0240200620074d0d002003280220200520074103746a22042802002004280204200328022428020c1100000d010b410021040c010b410121040b200341306a240020040b7e01017f230041c0006b220524002005200136020c2005200036020820052003360214200520023602102005412c6a41023602002005413c6a41033602002005420237021c20054184aec700360218200541043602342005200541306a3602282005200541106a3602382005200541086a360230200541186a2004103d000b02000b3501017f20002802002200200210302000280200200041086a220028020022036a2001200210cf061a2000200320026a36020041000bce0201027f230041106b220224002000280200210002400240024002402001418001490d002002410036020c2001418010490d0102402001418080044f0d0020022001413f71418001723a000e20022001410c7641e001723a000c20022001410676413f71418001723a000d410321010c030b20022001413f71418001723a000f2002200141127641f001723a000c20022001410676413f71418001723a000e20022001410c76413f71418001723a000d410421010c020b024020002802082203200041046a280200470d00200041011030200028020821030b200028020020036a20013a00002000200028020841016a3602080c020b20022001413f71418001723a000d2002200141067641c001723a000c410221010b2000200110302000280200200041086a220028020022036a2002410c6a200110cf061a2000200320016a3602000b200241106a240041000b6301017f230041206b2202240020022000280200360204200241086a41106a200141106a290200370300200241086a41086a200141086a29020037030020022001290200370308200241046a41b880c000200241086a10352101200241206a240020010b6f01017f230041306b2202240020022001360204200220003602002002411c6a41023602002002412c6a41013602002002420337020c200241a882c000360208200241013602242002200241206a3602182002200241046a36022820022002360220200241086a41c082c000103d000b0b002000350200200110420b3401017f230041106b220224002002200136020c20022000360208200241e884c000360204200241d4c0c70036020020021043000b6f01017f230041306b2202240020022001360204200220003602002002411c6a41023602002002412c6a41013602002002420337020c200241fc82c000360208200241013602242002200241206a3602182002200241046a36022820022002360220200241086a419483c000103d000b6f01017f230041306b2202240020022001360204200220003602002002411c6a41023602002002412c6a41013602002002420337020c200241b883c000360208200241013602242002200241206a3602182002200241046a36022820022002360220200241086a41d083c000103d000b6f01017f230041306b2202240020022001360204200220003602002002411c6a41023602002002412c6a41013602002002420337020c2002419c84c000360208200241013602242002200241206a3602182002200241046a36022820022002360220200241086a41b484c000103d000b0d0020002802001a037f0c000b0bd20203027f017e037f230041306b22022400412721030240024020004290ce005a0d00200021040c010b412721030340200241096a20036a2205417c6a200020004290ce0080220442f0b17f7e7ca7220641ffff037141e4006e220741017441aa85c0006a2f00003b00002005417e6a2007419c7f6c20066a41ffff037141017441aa85c0006a2f00003b00002003417c6a2103200042ffc1d72f5621052004210020050d000b0b02402004a7220541e3004c0d00200241096a2003417e6a22036a2004a7220641ffff037141e4006e2205419c7f6c20066a41ffff037141017441aa85c0006a2f00003b00000b024002402005410a480d00200241096a2003417e6a22036a200541017441aa85c0006a2f00003b00000c010b200241096a2003417f6a22036a200541306a3a00000b200141d4c0c7004100200241096a20036a412720036b10452103200241306a240020030b6e01017f230041c0006b220124002001200036020c200141346a410136020020014201370224200141d0adc7003602202001410536023c2001200141386a36023020012001410c6a360238200141106a200141206a1031410141d8adc700410720012802102001280218107900000b0c0042c487a8b2bda1b4c8480be80501067f20002802002205410171220620046a21070240024020054104710d00410021010c010b4100210802402002450d00200221092001210a03402008200a2d000041c00171418001466a2108200a41016a210a2009417f6a22090d000b0b200720026a20086b21070b412b418080c40020061b21080240024020002802084101460d004101210a200020082001200210460d012000280218200320042000411c6a28020028020c110000210a0c010b02402000410c6a280200220920074b0d004101210a200020082001200210460d012000280218200320042000411c6a28020028020c1100000f0b0240024020054108710d004100210a200920076b22092105024002400240410120002d0020220720074103461b0e0402010001020b2009410176210a200941016a41017621050c010b410021052009210a0b200a41016a210a0340200a417f6a220a450d0220002802182000280204200028021c280210110100450d000b41010f0b200028020421052000413036020420002d002021064101210a200041013a0020200020082001200210460d014100210a200920076b22092102024002400240410120002d0020220820084103461b0e0402010001020b2009410176210a200941016a41017621020c010b410021022009210a0b200a41016a210a02400340200a417f6a220a450d0120002802182000280204200028021c280210110100450d000b41010f0b200028020421094101210a200028021820032004200028021c28020c1100000d01200241016a2108200028021c210220002802182101024003402008417f6a2208450d014101210a2001200920022802101101000d030c000b0b200020063a00202000200536020441000f0b200028020421094101210a200020082001200210460d00200028021820032004200028021c28020c1100000d00200541016a2108200028021c210220002802182100034002402008417f6a22080d0041000f0b4101210a200020092002280210110100450d000b0b200a0b5401017f024002402001418080c400460d0041012104200028021820012000411c6a2802002802101101000d010b024020020d0041000f0b2000280218200220032000411c6a28020028020c11000021040b20040b6c01017f230041306b2203240020032001360204200320003602002003411c6a41023602002003412c6a41013602002003420237020c200341f486c000360208200341013602242003200341206a3602182003200341046a36022820032003360220200341086a2002103d000b6c01017f230041306b2203240020032001360204200320003602002003411c6a41023602002003412c6a41013602002003420237020c200341ac87c000360208200341013602242003200341206a3602182003200341046a36022820032003360220200341086a2002103d000b8d07010c7f200028021021030240024002400240200028020822044101460d0020034101460d012000280218200120022000411c6a28020028020c11000021030c030b20034101470d010b0240024020020d00410021020c010b200120026a2105200041146a28020041016a21064100210720012103200121080340200341016a210902400240024020032c0000220a417f4a0d000240024020092005470d004100210b200521030c010b20032d0001413f71210b200341026a220921030b200a411f71210c0240200a41ff0171220a41df014b0d00200b200c41067472210a0c020b0240024020032005470d004100210d2005210e0c010b20032d0000413f71210d200341016a2209210e0b200d200b41067472210b0240200a41f0014f0d00200b200c410c7472210a0c020b02400240200e2005470d004100210a200921030c010b200e41016a2103200e2d0000413f71210a0b200b410674200c411274418080f0007172200a72220a418080c400470d020c040b200a41ff0171210a0b200921030b02402006417f6a2206450d00200720086b20036a21072003210820052003470d010c020b0b200a418080c400460d00024002402007450d0020072002460d0041002103200720024f0d01200120076a2c00004140480d010b200121030b2007200220031b21022003200120031b21010b20044101460d002000280218200120022000411c6a28020028020c1100000f0b4100210902402002450d002002210a200121030340200920032d000041c00171418001466a2109200341016a2103200a417f6a220a0d000b0b0240200220096b200028020c2206490d002000280218200120022000411c6a28020028020c1100000f0b410021074100210902402002450d00410021092002210a200121030340200920032d000041c00171418001466a2109200341016a2103200a417f6a220a0d000b0b200920026b20066a2209210a024002400240410020002d0020220320034103461b0e0402010001020b20094101762107200941016a410176210a0c010b4100210a200921070b200741016a2103024003402003417f6a2203450d0120002802182000280204200028021c280210110100450d000b41010f0b2000280204210941012103200028021820012002200028021c28020c1100000d00200a41016a2103200028021c210a20002802182100034002402003417f6a22030d0041000f0b20002009200a280210110100450d000b41010f0b20030bc80801067f230041f0006b220524002005200336020c20052002360208410121062001210702402001418102490d00410020016b2108418002210903400240200920014f0d0041002106200020096a2c000041bf7f4c0d00200921070c020b2009417f6a21074100210620094101460d01200820096a210a20072109200a4101470d000b0b200520073602142005200036021020054100410520061b36021c200541d4c0c70041f087c00020061b3602180240024002400240200220014b22060d00200320014b0d00200220034b0d01024002402002450d0020012002460d00200120024d0d01200020026a2c00004140480d010b200321020b200520023602202002450d0220022001460d02200141016a210903400240200220014f0d00200020026a2c000041404e0d040b2002417f6a210620024101460d0420092002462103200621022003450d000c040b0b20052002200320061b360228200541306a41146a4103360200200541c8006a41146a4104360200200541d4006a410436020020054203370234200541f887c0003602302005410136024c2005200541c8006a3602402005200541186a3602582005200541106a3602502005200541286a360248200541306a2004103d000b200541e4006a4104360200200541c8006a41146a4104360200200541d4006a4101360200200541306a41146a4104360200200542043702342005419088c0003602302005410136024c2005200541c8006a3602402005200541186a3602602005200541106a36025820052005410c6a3602502005200541086a360248200541306a2004103d000b200221060b024020062001460d00410121090240024002400240200020066a22032c00002202417f4a0d0041002109200020016a220121070240200341016a2001460d00200341026a210720032d0001413f7121090b2002411f712103200241ff017141df014b0d01200920034106747221020c020b2005200241ff0171360224200541286a21010c020b4100210020012108024020072001460d00200741016a210820072d0000413f7121000b200020094106747221090240200241ff017141f0014f0d0020092003410c747221020c010b41002102024020082001460d0020082d0000413f7121020b20094106742003411274418080f00071722002722202418080c400460d020b2005200236022441012109200541286a21012002418001490d00410221092002418010490d0041034104200241808004491b21090b200520063602282005200920066a36022c200541306a41146a4105360200200541ec006a4104360200200541e4006a4104360200200541c8006a41146a4106360200200541d4006a410736020020054205370234200541b088c000360230200520013602582005410136024c2005200541c8006a3602402005200541186a3602682005200541106a3602602005200541246a3602502005200541206a360248200541306a2004103d000b419d8ac600412b2004102f000b100020012000280200200028020410490b800101037f230041206b22022400024002402000280200200110500d002001411c6a2802002103200128021821042002411c6a4100360200200241d4c0c7003602182002420137020c2002419889c00036020820042003200241086a1035450d010b200241206a240041010f0b2000280204200110502101200241206a240020010bdd0502047f017e410121020240200128021841272001411c6a2802002802101101000d0041022103024002400240024002402000280200220041776a2204411e4d0d00200041dc00470d010c020b41f40021050240024020040e1f05010202000202020202020202020202020202020202020202030202020203050b41f20021050c040b41ee0021050c030b0240024002402000104e0d00024002400240200041808004490d00200041808008490d0120004190fc476a4190fc0b490d02200041b5d9736a41b5db2b490d02200041e28b746a41e20b490d022000419fa8746a419f18490d02200041dee2746a410e490d02200041feffff0071419ef00a460d02200041a2b2756a4122490d02200041cb91756a410a4b0d050c020b200041808ac000412941d28ac00041a20241f48cc00041b502104f450d010c040b200041a98fc000412641f58fc00041af0141a491c00041a303104f0d030b200041017267410276410773ad4280808080d0008421060c010b200041017267410276410773ad4280808080d0008421060b410321030c020b410121030c010b0b200021050b03402003210441dc002100410121024101210302400240024002400240024020040e0402010500020b02400240024002402006422088a741ff01710e06050302010006050b200642ffffffff8f608342808080803084210641f50021000c060b200642ffffffff8f608342808080802084210641fb0021000c050b20052006a72204410274411c7176410f712203413072200341d7006a2003410a491b210002402004450d002006427f7c42ffffffff0f832006428080808070838421060c050b200642ffffffff8f60834280808080108421060c040b200642ffffffff8f6083210641fd0021000c030b41002103200521000c030b20012802184127200128021c2802101101000f0b200642ffffffff8f60834280808080c0008421060b410321030b20012802182000200128021c280210110100450d000b0b20020b990301047f0240024002404100410f200041a49a04491b2201200141086a22012001410274418895c0006a280200410b742000410b7422014b1b2202200241046a22022002410274418895c0006a280200410b7420014b1b2202200241026a22022002410274418895c0006a280200410b7420014b1b2202200241016a22022002410274418895c0006a280200410b7420014b1b2202410274418895c0006a280200410b74220320014620032001496a20026a2201411e4b0d0041b105210302402001411e460d002001410274418c95c0006a28020041157621030b4100210202402001417f6a220420014b0d002004411f4f0d032004410274418895c0006a28020041ffffff007121020b024020032001410274418895c0006a280200411576220141016a460d00200020026b21022003417f6a2103410021000340200141b0054b0d0320002001419496c0006a2d00006a220020024b0d012003200141016a2201470d000b200321010b20014101710f0b2001411f41c89bc0001032000b200141b10541d89bc0001032000b2004411f418496c0001032000bea0201067f200120024101746a210720004180fe0371410876210841002109200041ff0171210a0240024002400340200141026a210b200920012d000122026a210c024020012d000022012008460d00200120084b0d03200c2109200b2101200b2007470d010c030b0240200c2009490d00200c20044b0d02200320096a2101024003402002450d012002417f6a210220012d00002109200141016a21012009200a470d000b410021020c050b200c2109200b2101200b2007470d010c030b0b2009200c41c894c0001048000b200c200441c894c0001047000b200041ffff03712109200520066a210c4101210202400340200541016a210a0240024020052d00002201411874411875220b4100480d00200a21050c010b200a200c460d02200b41ff007141087420052d0001722101200541026a21050b200920016b22094100480d02200241017321022005200c470d000c020b0b419d8ac600412b41d894c000102f000b20024101710ba50201037f23004180016b2202240002400240024002400240200128020022034110710d0020034120710d012000ad2001104221000c020b410021030340200220036a41ff006a2000410f712204413072200441d7006a2004410a491b3a00002003417f6a2103200041047622000d000b20034180016a22004181014f0d02200141e889c0004102200220036a4180016a410020036b104521000c010b410021030340200220036a41ff006a2000410f712204413072200441376a2004410a491b3a00002003417f6a2103200041047622000d000b20034180016a22004181014f0d02200141e889c0004102200220036a4180016a410020036b104521000b20024180016a240020000f0b200041800141d889c0001048000b200041800141d889c0001048000b1c00200128021841d99cc000410b2001411c6a28020028020c1100000b1c00200128021841e49cc000410e2001411c6a28020028020c1100000b5b01017f230041306b220324002003200136020c20032000360208200341246a410136020020034201370214200341d0adc7003602102003410436022c2003200341286a3602202003200341086a360228200341106a2002103d000b140020002802002001200028020428020c1101000b1500200120002802002200280200200028020410490bb10401077f230041306b220324000240024020020d00410021040c010b200341286a210502400240024002400340024020002802082d0000450d00200028020041ad9dc0004104200028020428020c1100000d050b2003410a3602282003428a808080103703202003200236021c200341003602182003200236021420032001360210200341086a410a200120021057024002400240024020032802084101470d00200328020c210403402003200420032802186a41016a2204360218024002402004200328022422064f0d00200328021421070c010b200328021422072004490d00200641054f0d072003280210200420066b22086a22092005460d0420092005200610d206450d040b200328021c22092004490d0220072009490d0220032006200341106a6a41176a2d0000200328021020046a200920046b10572003280204210420032802004101460d000b0b2003200328021c3602180b200028020841003a0000200221040c010b200028020841013a0000200841016a21040b2000280204210920002802002106024020044520022004467222070d00200220044d0d03200120046a2c000041bf7f4c0d030b200620012004200928020c1100000d04024020070d00200220044d0d04200120046a2c000041bf7f4c0d040b200120046a2101200220046b22020d000b410021040c040b2006410441b49dc0001047000b200120024100200441c49dc000104a000b200120022004200241e087c000104a000b410121040b200341306a240020040be20201057f41002104024002400240024020024103712205450d00410420056b2205450d0020032005200520034b1b2206450d0041002105200141ff017121040340200220056a2d00002004460d022006200541016a2205470d000b200621040b20034108490d012004200341786a22074b0d01200141ff017141818284086c210502400340200220046a220641046a2802002005732208417f73200841fffdfb776a7120062802002005732206417f73200641fffdfb776a7172418081828478710d01200441086a220420074d0d000b0b200420034d0d012004200341f09dc0001048000b410121060c010b4100210541002106024020042003460d00200220046a2102200320046b210841002105200141ff0171210602400340200220056a2d00002006460d012008200541016a2205470d000b41002106200820046a21050c020b41012106200521050b200520046a21050b20002005360204200020063602000b850201027f230041106b220224002002410036020c02400240024002402001418001490d002001418010490d012002410c6a21032001418080044f0d0220022001413f71418001723a000e20022001410c7641e001723a000c20022001410676413f71418001723a000d410321010c030b200220013a000c2002410c6a2103410121010c020b20022001413f71418001723a000d2002200141067641c001723a000c2002410c6a2103410221010c010b20022001413f71418001723a000f2002200141127641f001723a000c20022001410676413f71418001723a000e20022001410c76413f71418001723a000d410421010b20002003200110562101200241106a240020010b6001017f230041206b2202240020022000360204200241086a41106a200141106a290200370300200241086a41086a200141086a29020037030020022001290200370308200241046a41bc9ec000200241086a10352101200241206a240020010b0d0020002802002001200210560b8c0201027f230041106b22022400200028020021002002410036020c02400240024002402001418001490d002001418010490d012002410c6a21032001418080044f0d0220022001413f71418001723a000e20022001410c7641e001723a000c20022001410676413f71418001723a000d410321010c030b200220013a000c2002410c6a2103410121010c020b20022001413f71418001723a000d2002200141067641c001723a000c2002410c6a2103410221010c010b20022001413f71418001723a000f2002200141127641f001723a000c20022001410676413f71418001723a000e20022001410c76413f71418001723a000d410421010b20002003200110562101200241106a240020010b6301017f230041206b2202240020022000280200360204200241086a41106a200141106a290200370300200241086a41086a200141086a29020037030020022001290200370308200241046a41bc9ec000200241086a10352101200241206a240020010bd30202047f027e230041c0006b2203240041012104024020002d00080d00200028020421050240200028020022062d00004104710d00410121042006280218419b9ec00041d49ec00020051b4102410120051b2006411c6a28020028020c1100000d0120012000280200200228020c11010021040c010b024020050d0041012104200628021841d59ec00041022006411c6a28020028020c1100000d01200028020021060b41012104200341013a0017200341346a41a09ec000360200200320062902183703082003200341176a3602102006290208210720062902102108200320062d00203a00382003200837032820032007370320200320062902003703182003200341086a3602302001200341186a200228020c1101000d00200328023041b89ec0004102200328023428020c11000021040b200020043a00082000200028020441016a360204200341c0006a240020000b6401027f230041206b220224002001411c6a280200210320012802182101200241086a41106a200041106a290200370300200241086a41086a200041086a2902003703002002200029020037030820012003200241086a10352100200241206a240020000bd70a020c7f017e230041206b220324004101210402400240200228021841222002411c6a2802002802101101000d000240024020010d00410021050c010b200020016a21064100210520002107410021080240034020072109200741016a210a02400240024020072c0000220b417f4a0d0002400240200a2006470d004100210c200621070c010b20072d0001413f71210c200741026a220a21070b200b411f7121040240200b41ff0171220b41df014b0d00200c200441067472210c0c020b0240024020072006470d004100210d2006210e0c010b20072d0000413f71210d200741016a220a210e0b200d200c41067472210c0240200b41f0014f0d00200c2004410c7472210c0c020b02400240200e2006470d004100210b200a21070c010b200e41016a2107200e2d0000413f71210b0b200c4106742004411274418080f0007172200b72220c418080c400470d020c040b200b41ff0171210c0b200a21070b4102210a024002400240024002400240200c41776a220b411e4d0d00200c41dc00470d010c020b41f400210e02400240200b0e1f05010202000202020202020202020202020202020202020202030202020203050b41f200210e0c040b41ee00210e0c030b0240200c104e0d0002400240200c41808004490d00200c41808008490d01200c4190fc476a4190fc0b490d02200c41b5d9736a41b5db2b490d02200c41e28b746a41e20b490d02200c419fa8746a419f18490d02200c41dee2746a410e490d02200c41feffff0071419ef00a460d02200c41a2b2756a4122490d02200c41cb91756a410a4d0d020c060b200c41808ac000412941d28ac00041a20241f48cc00041b502104f450d010c050b200c41a98fc000412641f58fc00041af0141a491c00041a303104f0d040b200c41017267410276410773ad4280808080d00084210f4103210a0c010b0b200c210e0b2003200136020420032000360200200320053602082003200836020c0240024020082005490d0002402005450d0020052001460d00200520014f0d01200020056a2c000041bf7f4c0d010b02402008450d0020082001460d00200820014f0d01200020086a2c000041bf7f4c0d010b2002280218200020056a200820056b200228021c28020c110000450d01410121040c060b20032003410c6a3602182003200341086a36021420032003360210200341106a1060000b0340200a210b4101210441dc0021054101210a024002400240024002400240200b0e0402010500020b0240024002400240200f422088a741ff01710e06050302010006050b200f42ffffffff8f608342808080803084210f4103210a41f50021050c070b200f42ffffffff8f608342808080802084210f4103210a41fb0021050c060b200e200fa7220b410274411c7176410f71220a413072200a41d7006a200a410a491b21050240200b450d00200f427f7c42ffffffff0f83200f4280808080708384210f0c050b200f42ffffffff8f608342808080801084210f0c040b200f42ffffffff8f6083210f4103210a41fd0021050c040b4100210a200e21050c030b4101210a0240200c418001490d004102210a200c418010490d0041034104200c41808004491b210a0b200a20086a21050c040b200f42ffffffff8f60834280808080c00084210f0b4103210a0b20022802182005200228021c280210110100450d000c050b0b200820096b20076a210820062007470d000b0b2005450d0020052001460d00200520014f0d02200020056a2c000041bf7f4c0d020b410121042002280218200020056a200120056b200228021c28020c1100000d0020022802184122200228021c28021011010021040b200341206a240020040f0b200020012005200141e087c000104a000b2b01017f2000280200220128020020012802042000280204280200200028020828020041dc9ec000104a000b870101027f23004180016b2202240020002d00002103410021000340200220006a41ff006a20034101714130723a00002000417f6a2100200341017641ff007122030d000b024020004180016a2203418101490d00200341800141d889c0001048000b200141ec9ec0004102200220006a4180016a410020006b1045210020024180016a240020000b900101037f23004180016b2202240020002802002103410021000340200220006a41ff006a2003410f712204413072200441376a2004410a491b3a00002000417f6a2100200341047622030d000b024020004180016a2203418101490d00200341800141d889c0001048000b200141e889c0004102200220006a4180016a410020006b1045210020024180016a240020000b1c00200128021841abb0c00041052001411c6a28020028020c1100000bcf0401067e2000420037001720002001290320220242338842137e2001290300220342ffffffffffffff03837c220442137c4233882001290308220542ffffffffffffff038320034233887c22037c4233882001290310220642ffffffffffffff038320054233887c22057c4233882001290318220742ffffffffffffff038320064233887c22067c423388200242ffffffffffffff038320074233887c22077c42338842137e20047c22023c0000200020024228883c0005200020024220883c0004200020024218883c0003200020024210883c0002200020024208883c00012000200242338820037c22044225883c000b20002004421d883c000a200020044215883c000920002004420d883c0008200020044205883c00072000200442338820057c2203422a883c0012200020034222883c001120002003421a883c0010200020034212883c000f20002003420a883c000e200020034202883c000d2000200442ffffffffffffff038322044203862002423088420783843c00062000200342338820067c2202421f883c0017200020024227883c0018200020024217883c001620002002420f883c0015200020024207883c00142000200342ffffffffffffff038322054206862004422d88843c000c2000200242338820077c22034204883c001a20002003420c883c001b200020034214883c001c20002003421c883c001d200020034224883c001e2000200242ffffffffffffff038322024201862005423288843c00132000200342ffffffffffffff03832203422c883c001f200020034204862002422f88843c00190b7101027f230041c0006b22022400200220001064200241206a2001106441002101410121000340200241206a20016a2d0000200220016a2d0000732203410020036b72417f734180017141077610662000712100200141016a22014120470d000b200010662101200241c0006a240020010b1501017f230041106b220120003a000f20012d000f0bd00702017f147e230041f0016b2203240020012903202104200129031821052001290310210620012903082107200129030021080340200341f0006a200842002007420010cc06200341306a20064200200442137e2209420010cc06200341e0016a200542137e220a42002005420010cc06200341c0006a200a42002006420010cc0620034180016a200742002009420010cc06200341206a200842002006420010cc06200341d0016a200a42002004420010cc06200341106a200742002006420010cc06200341a0016a200842002005420010cc06200341c0016a200942002004420010cc06200341d0006a200742002005420010cc0620034190016a200842002004420010cc06200341b0016a200842002008420010cc06200341e0006a200742002007420010cc062003200642002006420010cc06200329039001220b20032903507c2206420186220c20032903007c220720032903a001220d20032903107c2208420186220e20032903c0017c22042003290320220f20032903d0017c2205420186221020032903607c22092003290370221120032903307c220a420186221220032903e0017c2213200329038001221420032903407c2215420186221620032903b0017c221742338820034180016a41086a290300200341c0006a41086a2903007c2015201454ad7c4201862015423f8884200341b0016a41086a2903007c2017201654ad7c420d86847c2215423388200341f0006a41086a290300200341306a41086a2903007c200a201154ad7c420186200a423f8884200341e0016a41086a2903007c2013201254ad7c2015201354ad7c420d86847c220a423388200341206a41086a290300200341d0016a41086a2903007c2005200f54ad7c4201862005423f8884200341e0006a41086a2903007c2009201054ad7c200a200954ad7c420d86847c2205423388200341a0016a41086a290300200341106a41086a2903007c2008200d54ad7c4201862008423f8884200341c0016a41086a2903007c2004200e54ad7c2005200454ad7c420d86847c220442338820034190016a41086a290300200341d0006a41086a2903007c2006200b54ad7c4201862006423f8884200341086a2903007c2007200c54ad7c2004200754ad7c420d868442137e201742ffffffffffffff03837c220642ffffffffffffff038321082006423388201542ffffffffffffff03837c2107200442ffffffffffffff03832104200542ffffffffffffff03832105200a42ffffffffffffff038321062002417f6a22020d000b2000200437032020002005370318200020063703102000200737030820002008370300200341f0016a24000bbbd40103017f2c7e037f230041d0c1006b22032400200341a8c1006a200241011067200341b0386a20032903a8412204420020022903082205420010cc06200341c0396a20032903c841220642002002290310220742137e2208420010cc06200341803a6a20032903c041220942002002290318220a42137e220b420010cc06200341c03a6a20032903b841220c42002002290320220d42137e220e420010cc06200341f0386a20032903b041220f420020022903002210420010cc06200341a0386a201042002004420010cc06200341b0396a20064200200542137e2211420010cc06200341f0396a200942002008420010cc06200341b03a6a200c4200200b420010cc06200341f03a6a200f4200200e420010cc06200341c0386a200442002007420010cc06200341d0396a20064200200b420010cc06200341903a6a20094200200e420010cc0620034180396a200c42002010420010cc06200341803b6a200f42002005420010cc06200341d0386a20044200200a420010cc06200341e0396a20064200200e420010cc0620034190396a200942002010420010cc06200341d03a6a200c42002005420010cc06200341903b6a200f42002007420010cc06200341e0386a20044200200d420010cc06200341a0396a200642002010420010cc06200341a03a6a200942002005420010cc06200341e03a6a200c42002007420010cc06200341a03b6a200f4200200a420010cc06200320032903d039221220032903c0387c220420032903903a7c22062003290380397c220920032903803b7c220c20032903c039221320032903b0387c220f20032903803a7c221420032903c03a7c221520032903f0387c221620032903b039221720032903a0387c221820032903f0397c221920032903b03a7c221a20032903f03a7c221b423388200341b0396a41086a290300200341a0386a41086a2903007c2018201754ad7c200341f0396a41086a2903007c2019201854ad7c200341b03a6a41086a2903007c201a201954ad7c200341f03a6a41086a2903007c201b201a54ad7c420d86847c2218423388200341c0396a41086a290300200341b0386a41086a2903007c200f201354ad7c200341803a6a41086a2903007c2014200f54ad7c200341c03a6a41086a2903007c2015201454ad7c200341f0386a41086a2903007c2016201554ad7c2018201654ad7c420d86847c220f42ffffffffffffff0383221c3703c03b200320032903e039221a20032903d0387c22142003290390397c221520032903d03a7c221620032903903b7c2219200f423388200341d0396a41086a290300200341c0386a41086a2903007c2004201254ad7c200341903a6a41086a2903007c2006200454ad7c20034180396a41086a2903007c2009200654ad7c200341803b6a41086a2903007c200c200954ad7c200f200c54ad7c420d86847c220442ffffffffffffff0383221d3703c83b200320032903a039221220032903e0387c220620032903a03a7c220920032903e03a7c220c20032903a03b7c220f2004423388200341e0396a41086a290300200341d0386a41086a2903007c2014201a54ad7c20034190396a41086a2903007c2015201454ad7c200341d03a6a41086a2903007c2016201554ad7c200341903b6a41086a2903007c2019201654ad7c2004201954ad7c420d86847c220442ffffffffffffff0383221e3703d03b20032004423388200341a0396a41086a290300200341e0386a41086a2903007c2006201254ad7c200341a03a6a41086a2903007c2009200654ad7c200341e03a6a41086a2903007c200c200954ad7c200341a03b6a41086a2903007c200f200c54ad7c2004200f54ad7c420d868442137e201b42ffffffffffffff03837c220442ffffffffffffff038322123703b03b20032004423388201842ffffffffffffff03837c22133703b83b200341a8c1006a200341b03b6a41011067200341a0356a20032903a841220442002005420010cc06200341f0356a20032903c841220642002008420010cc06200341c0366a20032903c04122094200200b420010cc0620034190376a20032903b841220c4200200e420010cc06200341e0376a20032903b041220f42002010420010cc0620034190356a200442002010420010cc06200341e0356a200642002011420010cc06200341b0366a200942002008420010cc0620034180376a200c4200200b420010cc06200341d0376a200f4200200e420010cc06200341b0356a200442002007420010cc0620034180366a20064200200b420010cc06200341d0366a20094200200e420010cc06200341a0376a200c42002010420010cc06200341f0376a200f42002005420010cc06200341c0356a20044200200a420010cc0620034190366a20064200200e420010cc06200341e0366a200942002010420010cc06200341b0376a200c42002005420010cc0620034180386a200f42002007420010cc06200341d0356a20044200200d420010cc06200341a0366a200642002010420010cc06200341f0366a200942002005420010cc06200341c0376a200c42002007420010cc0620034190386a200f4200200a420010cc06200341e0306a200329038036221a20032903b0357c220b20032903d0367c220420032903a0377c220620032903f0377c220920032903f035221920032903a0357c220e20032903c0367c220c2003290390377c220f20032903e0377c220820032903e035221b2003290390357c221420032903b0367c22152003290380377c221620032903d0377c2218423388200341e0356a41086a29030020034190356a41086a2903007c2014201b54ad7c200341b0366a41086a2903007c2015201454ad7c20034180376a41086a2903007c2016201554ad7c200341d0376a41086a2903007c2018201654ad7c420d86847c2215423388200341f0356a41086a290300200341a0356a41086a2903007c200e201954ad7c200341c0366a41086a2903007c200c200e54ad7c20034190376a41086a2903007c200f200c54ad7c200341e0376a41086a2903007c2008200f54ad7c2015200854ad7c420d86847c220c42ffffffffffffff0383220842137e221742002001290320220e420010cc0620034190316a200329039036221f20032903c0357c220f20032903e0367c221420032903b0377c22162003290380387c2219200c42338820034180366a41086a290300200341b0356a41086a2903007c200b201a54ad7c200341d0366a41086a2903007c2004200b54ad7c200341a0376a41086a2903007c2006200454ad7c200341f0376a41086a2903007c2009200654ad7c200c200954ad7c420d86847c220442ffffffffffffff0383221a42137e221b42002001290318220b420010cc06200341d0316a20032903a036222020032903d0357c220620032903f0367c220920032903c0377c220c2003290390387c2211200442338820034190366a41086a290300200341c0356a41086a2903007c200f201f54ad7c200341e0366a41086a2903007c2014200f54ad7c200341b0376a41086a2903007c2016201454ad7c20034180386a41086a2903007c2019201654ad7c2004201954ad7c420d86847c220f42ffffffffffffff0383221642137e2214420020012903102204420010cc06200341f02f6a200f423388200341a0366a41086a290300200341d0356a41086a2903007c2006202054ad7c200341f0366a41086a2903007c2009200654ad7c200341c0376a41086a2903007c200c200954ad7c20034190386a41086a2903007c2011200c54ad7c200f201154ad7c420d868442137e201842ffffffffffffff03837c220942ffffffffffffff0383220c420020012903082206420010cc06200341c0306a2009423388201542ffffffffffffff03837c220f420020012903002209420010cc06200341f0306a20174200200b420010cc06200341a0316a201b42002004420010cc06200341e0316a201442002006420010cc0620034180306a200c42002009420010cc06200341d0306a200f42137e4200200e420010cc06200341c0346a200842002009420010cc0620034180316a201b4200200e420010cc06200341c0316a20144200200b420010cc06200341e02f6a200c42002004420010cc06200341b0306a200f42002006420010cc0620034180326a200842002006420010cc06200341b0346a201a42002009420010cc06200341b0316a20144200200e420010cc06200341d02f6a200c4200200b420010cc06200341a0306a200f42002004420010cc06200341d0326a200842002004420010cc06200341f0316a201a42002006420010cc06200341a0346a201642002009420010cc06200341c02f6a200c4200200e420010cc0620034190306a200f4200200b420010cc062003200329038031221f20032903c0347c220f20032903c0317c220820032903e02f7c221420032903b0307c2215200329039031222020032903e0307c220c20032903d0317c221620032903f02f7c221820032903c0307c221920032903a031222120032903f0307c221a20032903e0317c221b2003290380307c221120032903d0307c2217423388200341a0316a41086a290300200341f0306a41086a2903007c201a202154ad7c200341e0316a41086a2903007c201b201a54ad7c20034180306a41086a2903007c2011201b54ad7c200341d0306a41086a2903007c2017201154ad7c420d86847c221a42338820034190316a41086a290300200341e0306a41086a2903007c200c202054ad7c200341d0316a41086a2903007c2016200c54ad7c200341f02f6a41086a2903007c2018201654ad7c200341c0306a41086a2903007c2019201854ad7c201a201954ad7c420d86847c221642ffffffffffffff0383220c3703e83b200320032903b03422202003290380327c221820032903b0317c221920032903d02f7c221b20032903a0307c2211201642338820034180316a41086a290300200341c0346a41086a2903007c200f201f54ad7c200341c0316a41086a2903007c2008200f54ad7c200341e02f6a41086a2903007c2014200854ad7c200341b0306a41086a2903007c2015201454ad7c2016201554ad7c420d86847c220842ffffffffffffff0383220f3703f03b200320032903f031222120032903d0327c221420032903a0347c221520032903c02f7c22162003290390307c221f2008423388200341b0346a41086a29030020034180326a41086a2903007c2018202054ad7c200341b0316a41086a2903007c2019201854ad7c200341d02f6a41086a2903007c201b201954ad7c200341a0306a41086a2903007c2011201b54ad7c2008201154ad7c420d86847c221842ffffffffffffff038322083703f83b20032018423388200341f0316a41086a290300200341d0326a41086a2903007c2014202154ad7c200341a0346a41086a2903007c2015201454ad7c200341c02f6a41086a2903007c2016201554ad7c20034190306a41086a2903007c201f201654ad7c2018201f54ad7c420d868442137e201742ffffffffffffff03837c221542ffffffffffffff038322143703d83b20032015423388201a42ffffffffffffff03837c22153703e03b200341803c6a200341d83b6a41011067200341a8c1006a200341803c6a41011067200341a83c6a200341a8c1006a41011067200341f02c6a2014420020032903b03c2216420010cc06200341802d6a2008420020032903b83c221942137e2217420010cc06200341e02d6a200f420020032903c03c221b42137e2211420010cc06200341c02e6a200c420020032903c83c221f42137e221a420010cc06200341a02f6a2015420020032903a83c2218420010cc06200341b02f6a201842002014420010cc06200341b02c6a20084200201642137e420010cc06200341902d6a200f42002017420010cc06200341f02d6a200c42002011420010cc06200341d02e6a20154200201a420010cc06200341c02d6a201442002019420010cc06200341d02d6a200842002011420010cc06200341b02e6a200f4200201a420010cc06200341902f6a200c42002018420010cc06200341e02c6a201542002016420010cc06200341902e6a20144200201b420010cc06200341a02e6a20084200201a420010cc06200341802f6a200f42002018420010cc06200341d02c6a200c42002016420010cc06200341b02d6a201542002019420010cc06200341e02e6a20144200201f420010cc06200341f02e6a200842002018420010cc06200341c02c6a200f42002016420010cc06200341a02d6a200c42002019420010cc06200341802e6a20154200201b420010cc06200341c02a6a20032903d02d222220032903c02d7c221620032903b02e7c221820032903902f7c221a20032903e02c7c221b20032903802d222320032903f02c7c221920032903e02d7c221120032903c02e7c221720032903a02f7c221f20032903b02c222420032903b02f7c222020032903902d7c222120032903f02d7c222520032903d02e7c2226423388200341b02c6a41086a290300200341b02f6a41086a2903007c2020202454ad7c200341902d6a41086a2903007c2021202054ad7c200341f02d6a41086a2903007c2025202154ad7c200341d02e6a41086a2903007c2026202554ad7c420d86847c2221423388200341802d6a41086a290300200341f02c6a41086a2903007c2019202354ad7c200341e02d6a41086a2903007c2011201954ad7c200341c02e6a41086a2903007c2017201154ad7c200341a02f6a41086a2903007c201f201754ad7c2021201f54ad7c420d86847c221742ffffffffffffff0383221942137e2227420020032903a03c2211420010cc06200341f02a6a20032903a02e222820032903902e7c221f20032903802f7c222020032903d02c7c222520032903b02d7c22232017423388200341d02d6a41086a290300200341c02d6a41086a2903007c2016202254ad7c200341b02e6a41086a2903007c2018201654ad7c200341902f6a41086a2903007c201a201854ad7c200341e02c6a41086a2903007c201b201a54ad7c2017201b54ad7c420d86847c221642ffffffffffffff0383221a42137e2222420020032903983c2217420010cc06200341b02b6a20032903f02e222920032903e02e7c221820032903c02c7c222420032903a02d7c222a20032903802e7c222b2016423388200341a02e6a41086a290300200341902e6a41086a2903007c201f202854ad7c200341802f6a41086a2903007c2020201f54ad7c200341d02c6a41086a2903007c2025202054ad7c200341b02d6a41086a2903007c2023202554ad7c2016202354ad7c420d86847c221642ffffffffffffff0383221b42137e2225420020032903903c221f420010cc06200341d0296a2016423388200341f02e6a41086a290300200341e02e6a41086a2903007c2018202954ad7c200341c02c6a41086a2903007c2024201854ad7c200341a02d6a41086a2903007c202a202454ad7c200341802e6a41086a2903007c202b202a54ad7c2016202b54ad7c420d868442137e202642ffffffffffffff03837c221842ffffffffffffff03832216420020032903883c2220420010cc06200341a02a6a2018423388202142ffffffffffffff03837c2218420020032903803c2221420010cc06200341d02a6a202742002017420010cc06200341802b6a20224200201f420010cc06200341c02b6a202542002020420010cc06200341e0296a201642002021420010cc06200341b02a6a201842137e42002011420010cc06200341d02b6a201942002021420010cc06200341e02a6a202242002011420010cc06200341a02b6a202542002017420010cc06200341c0296a20164200201f420010cc06200341902a6a201842002020420010cc06200341e02b6a201942002020420010cc06200341802c6a201a42002021420010cc06200341902b6a202542002011420010cc06200341b0296a201642002017420010cc06200341802a6a20184200201f420010cc06200341f02b6a20194200201f420010cc06200341902c6a201a42002020420010cc06200341a02c6a201b42002021420010cc06200341a0296a201642002011420010cc06200341f0296a201842002017420010cc06200320032903e02a222720032903d02b7c221120032903a02b7c221720032903c0297c221f20032903902a7c222020032903f02a222820032903c02a7c222120032903b02b7c222520032903d0297c222620032903a02a7c222320032903802b222920032903d02a7c222220032903c02b7c222420032903e0297c222a20032903b02a7c222b423388200341802b6a41086a290300200341d02a6a41086a2903007c2022202954ad7c200341c02b6a41086a2903007c2024202254ad7c200341e0296a41086a2903007c202a202454ad7c200341b02a6a41086a2903007c202b202a54ad7c420d86847c2222423388200341f02a6a41086a290300200341c02a6a41086a2903007c2021202854ad7c200341b02b6a41086a2903007c2025202154ad7c200341d0296a41086a2903007c2026202554ad7c200341a02a6a41086a2903007c2023202654ad7c2022202354ad7c420d86847c222142ffffffffffffff03833703e03c200320032903802c222a20032903e02b7c222520032903902b7c222620032903b0297c222320032903802a7c22242021423388200341e02a6a41086a290300200341d02b6a41086a2903007c2011202754ad7c200341a02b6a41086a2903007c2017201154ad7c200341c0296a41086a2903007c201f201754ad7c200341902a6a41086a2903007c2020201f54ad7c2021202054ad7c420d86847c221142ffffffffffffff03833703e83c200320032903902c222720032903f02b7c221720032903a02c7c221f20032903a0297c222020032903f0297c22212011423388200341802c6a41086a290300200341e02b6a41086a2903007c2025202a54ad7c200341902b6a41086a2903007c2026202554ad7c200341b0296a41086a2903007c2023202654ad7c200341802a6a41086a2903007c2024202354ad7c2011202454ad7c420d86847c221142ffffffffffffff03833703f03c20032011423388200341902c6a41086a290300200341f02b6a41086a2903007c2017202754ad7c200341a02c6a41086a2903007c201f201754ad7c200341a0296a41086a2903007c2020201f54ad7c200341f0296a41086a2903007c2021202054ad7c2011202154ad7c420d868442137e202b42ffffffffffffff03837c221142ffffffffffffff03833703d03c20032011423388202242ffffffffffffff03837c3703d83c200341f83c6a200341d03c6a41011067200341e0266a201b420020032903883d221f42137e2226420010cc06200341c0276a20032903903d222142137e22254200201a420010cc06200341a0286a20032903983d222342137e222042002019420010cc06200341d0266a2016420020032903803d2211420010cc0620034180296a2018420020032903f83c2217420010cc0620034190266a201b4200201142137e420010cc06200341f0266a20264200201a420010cc06200341d0276a202542002019420010cc0620034190296a201642002017420010cc06200341b0286a201842002020420010cc06200341b0276a20254200201b420010cc0620034190286a20204200201a420010cc06200341f0286a201742002019420010cc06200341a0276a20164200201f420010cc06200341c0266a201842002011420010cc06200341b0266a201142002019420010cc0620034180286a20204200201b420010cc06200341e0286a20174200201a420010cc06200341f0276a201642002021420010cc0620034190276a20184200201f420010cc06200341a0266a20114200201a420010cc0620034180276a201f42002019420010cc06200341d0286a20174200201b420010cc06200341c0286a201642002023420010cc06200341e0276a201842002021420010cc062003200329039028222220032903b0277c221620032903f0287c221820032903a0277c221a20032903c0267c221b20032903c027222320032903e0267c221920032903a0287c221120032903d0267c22172003290380297c221f20032903f02622242003290390267c222020032903d0277c22212003290390297c222520032903b0287c2226423388200341f0266a41086a29030020034190266a41086a2903007c2020202454ad7c200341d0276a41086a2903007c2021202054ad7c20034190296a41086a2903007c2025202154ad7c200341b0286a41086a2903007c2026202554ad7c420d86847c2221423388200341c0276a41086a290300200341e0266a41086a2903007c2019202354ad7c200341a0286a41086a2903007c2011201954ad7c200341d0266a41086a2903007c2017201154ad7c20034180296a41086a2903007c201f201754ad7c2021201f54ad7c420d86847c221142ffffffffffffff038322193703b03d2003200329038028222420032903b0267c221720032903e0287c221f20032903f0277c22252003290390277c2223201142338820034190286a41086a290300200341b0276a41086a2903007c2016202254ad7c200341f0286a41086a2903007c2018201654ad7c200341a0276a41086a2903007c201a201854ad7c200341c0266a41086a2903007c201b201a54ad7c2011201b54ad7c420d86847c221642ffffffffffffff038322203703b83d2003200329038027222220032903a0267c221820032903d0287c221a20032903c0287c221b20032903e0277c2211201642338820034180286a41086a290300200341b0266a41086a2903007c2017202454ad7c200341e0286a41086a2903007c201f201754ad7c200341f0276a41086a2903007c2025201f54ad7c20034190276a41086a2903007c2023202554ad7c2016202354ad7c420d86847c221642ffffffffffffff038322253703c03d2003201642338820034180276a41086a290300200341a0266a41086a2903007c2018202254ad7c200341d0286a41086a2903007c201a201854ad7c200341c0286a41086a2903007c201b201a54ad7c200341e0276a41086a2903007c2011201b54ad7c2016201154ad7c420d868442137e202642ffffffffffffff03837c221842ffffffffffffff038322163703a03d20032018423388202142ffffffffffffff03837c22183703a83d200341c83d6a200341a03d6a41051067200341b0246a201942137e2223420020032903e83d221a420010cc06200341f0246a202042137e2226420020032903e03d221b420010cc06200341b0256a202542137e2221420020032903d83d2211420010cc06200341b0236a2016420020032903d03d2217420010cc0620034180246a2018420020032903c83d221f420010cc0620034180256a20234200201b420010cc06200341c0256a202642002011420010cc0620034180266a202142002017420010cc06200341c0236a20164200201f420010cc06200341c0246a201842137e4200201a420010cc06200341f0236a20194200201f420010cc06200341a0246a20264200201a420010cc06200341e0246a20214200201b420010cc06200341a0236a201642002011420010cc06200341f0256a201842002017420010cc06200341e0256a201942002017420010cc06200341e0236a20204200201f420010cc0620034190246a20214200201a420010cc0620034190236a20164200201b420010cc06200341a0256a201842002011420010cc0620034190256a201942002011420010cc06200341d0256a202042002017420010cc06200341d0236a20254200201f420010cc0620034180236a20164200201a420010cc06200341d0246a20184200201b420010cc06200320032903a024222320032903f0237c221620032903e0247c221820032903a0237c221a20032903f0257c221b20032903f024222220032903b0247c221920032903b0257c221120032903b0237c22172003290380247c221f20032903c02522242003290380257c22202003290380267c222120032903c0237c222520032903c0247c2226423388200341c0256a41086a29030020034180256a41086a2903007c2020202454ad7c20034180266a41086a2903007c2021202054ad7c200341c0236a41086a2903007c2025202154ad7c200341c0246a41086a2903007c2026202554ad7c420d86847c2220423388200341f0246a41086a290300200341b0246a41086a2903007c2019202254ad7c200341b0256a41086a2903007c2011201954ad7c200341b0236a41086a2903007c2017201154ad7c20034180246a41086a2903007c201f201754ad7c2020201f54ad7c420d86847c221142ffffffffffffff038322193703803e200320032903e023222220032903e0257c22172003290390247c221f2003290390237c222120032903a0257c22252011423388200341a0246a41086a290300200341f0236a41086a2903007c2016202354ad7c200341e0246a41086a2903007c2018201654ad7c200341a0236a41086a2903007c201a201854ad7c200341f0256a41086a2903007c201b201a54ad7c2011201b54ad7c420d86847c221642ffffffffffffff0383221b3703883e200320032903d025222a2003290390257c221820032903d0237c221a2003290380237c221120032903d0247c22232016423388200341e0236a41086a290300200341e0256a41086a2903007c2017202254ad7c20034190246a41086a2903007c201f201754ad7c20034190236a41086a2903007c2021201f54ad7c200341a0256a41086a2903007c2025202154ad7c2016202554ad7c420d86847c221642ffffffffffffff038322243703903e20032016423388200341d0256a41086a29030020034190256a41086a2903007c2018202a54ad7c200341d0236a41086a2903007c201a201854ad7c20034180236a41086a2903007c2011201a54ad7c200341d0246a41086a2903007c2023201154ad7c2016202354ad7c420d868442137e202642ffffffffffffff03837c221842ffffffffffffff038322163703f03d20032018423388202042ffffffffffffff03837c22183703f83d200341983e6a200341f03d6a410a1067200341f0206a201942137e222a420020032903b83e2217420010cc06200341c0216a201b42137e2211420020032903b03e221f420010cc0620034190226a202442137e221a420020032903a83e2220420010cc06200341e0226a2016420020032903a03e2221420010cc06200341a0206a2018420020032903983e2225420010cc06200341d0216a202a4200201f420010cc06200341a0226a201142002020420010cc06200341f0226a201a42002021420010cc06200341b0206a201642002025420010cc0620034180216a201842137e222c42002017420010cc0620034190206a201942002025420010cc06200341e0206a201142002017420010cc06200341b0216a201a4200201f420010cc0620034180226a201642002020420010cc06200341d0226a201842002021420010cc06200341c0226a201942002021420010cc0620034180206a201b42002025420010cc06200341d0206a201a42002017420010cc06200341a0216a20164200201f420010cc06200341f0216a201842002020420010cc06200341e0216a201942002020420010cc06200341b0226a201b42002021420010cc06200341f01f6a202442002025420010cc06200341c0206a201642002017420010cc0620034190216a20184200201f420010cc06200320032903e020222d2003290390207c221720032903b0217c221f2003290380227c222120032903d0227c222520032903c021222e20032903f0207c22202003290390227c222620032903e0227c222320032903a0207c222220032903a022222f20032903d0217c222b20032903f0227c222720032903b0207c22282003290380217c2229423388200341a0226a41086a290300200341d0216a41086a2903007c202b202f54ad7c200341f0226a41086a2903007c2027202b54ad7c200341b0206a41086a2903007c2028202754ad7c20034180216a41086a2903007c2029202854ad7c420d86847c2227423388200341c0216a41086a290300200341f0206a41086a2903007c2020202e54ad7c20034190226a41086a2903007c2026202054ad7c200341e0226a41086a2903007c2023202654ad7c200341a0206a41086a2903007c2022202354ad7c2027202254ad7c420d86847c222642ffffffffffffff038322203703d03e2003200329038020222f20032903c0227c222320032903d0207c222220032903a0217c222820032903f0217c222e2026423388200341e0206a41086a29030020034190206a41086a2903007c2017202d54ad7c200341b0216a41086a2903007c201f201754ad7c20034180226a41086a2903007c2021201f54ad7c200341d0226a41086a2903007c2025202154ad7c2026202554ad7c420d86847c221742ffffffffffffff0383222b3703d83e200320032903b022222d20032903e0217c221f20032903f01f7c222120032903c0207c22252003290390217c2226201742338820034180206a41086a290300200341c0226a41086a2903007c2023202f54ad7c200341d0206a41086a2903007c2022202354ad7c200341a0216a41086a2903007c2028202254ad7c200341f0216a41086a2903007c202e202854ad7c2017202e54ad7c420d86847c221742ffffffffffffff038322283703e03e20032017423388200341b0226a41086a290300200341e0216a41086a2903007c201f202d54ad7c200341f01f6a41086a2903007c2021201f54ad7c200341c0206a41086a2903007c2025202154ad7c20034190216a41086a2903007c2026202554ad7c2017202654ad7c420d868442137e202942ffffffffffffff03837c221f42ffffffffffffff038322173703c03e2003201f423388202742ffffffffffffff03837c221f3703c83e200341e83e6a200341c03e6a41141067200341e01d6a202042137e222e420020032903883f2221420010cc06200341b01e6a202b42137e2229420020032903803f2225420010cc06200341801f6a202842137e2227420020032903f83e2226420010cc06200341d01f6a2017420020032903f03e2223420010cc06200341901d6a201f420020032903e83e2222420010cc06200341c01e6a202e42002025420010cc06200341901f6a202942002026420010cc06200341e01f6a202742002023420010cc06200341a01d6a201742002022420010cc06200341f01d6a201f42137e42002021420010cc06200341801d6a202042002022420010cc06200341d01d6a202942002021420010cc06200341a01e6a202742002025420010cc06200341f01e6a201742002026420010cc06200341c01f6a201f42002023420010cc06200341b01f6a202042002023420010cc06200341f01c6a202b42002022420010cc06200341c01d6a202742002021420010cc06200341901e6a201742002025420010cc06200341e01e6a201f42002026420010cc06200341d01e6a202042002026420010cc06200341a01f6a202b42002023420010cc06200341e01c6a202842002022420010cc06200341b01d6a201742002021420010cc06200341801e6a201f42002025420010cc06200320032903d01d222e20032903801d7c221720032903a01e7c221f20032903f01e7c222020032903c01f7c222120032903b01e222d20032903e01d7c222520032903801f7c222620032903d01f7c222320032903901d7c222220032903901f222f20032903c01e7c222b20032903e01f7c222720032903a01d7c222820032903f01d7c2229423388200341901f6a41086a290300200341c01e6a41086a2903007c202b202f54ad7c200341e01f6a41086a2903007c2027202b54ad7c200341a01d6a41086a2903007c2028202754ad7c200341f01d6a41086a2903007c2029202854ad7c420d86847c222b423388200341b01e6a41086a290300200341e01d6a41086a2903007c2025202d54ad7c200341801f6a41086a2903007c2026202554ad7c200341d01f6a41086a2903007c2023202654ad7c200341901d6a41086a2903007c2022202354ad7c202b202254ad7c420d86847c222542ffffffffffffff03833703a03f200320032903f01c222820032903b01f7c222620032903c01d7c222320032903901e7c222220032903e01e7c22272025423388200341d01d6a41086a290300200341801d6a41086a2903007c2017202e54ad7c200341a01e6a41086a2903007c201f201754ad7c200341f01e6a41086a2903007c2020201f54ad7c200341c01f6a41086a2903007c2021202054ad7c2025202154ad7c420d86847c221742ffffffffffffff03833703a83f200320032903a01f222e20032903d01e7c221f20032903e01c7c222020032903b01d7c222120032903801e7c22252017423388200341f01c6a41086a290300200341b01f6a41086a2903007c2026202854ad7c200341c01d6a41086a2903007c2023202654ad7c200341901e6a41086a2903007c2022202354ad7c200341e01e6a41086a2903007c2027202254ad7c2017202754ad7c420d86847c221742ffffffffffffff03833703b03f20032017423388200341a01f6a41086a290300200341d01e6a41086a2903007c201f202e54ad7c200341e01c6a41086a2903007c2020201f54ad7c200341b01d6a41086a2903007c2021202054ad7c200341801e6a41086a2903007c2025202154ad7c2017202554ad7c420d868442137e202942ffffffffffffff03837c221742ffffffffffffff03833703903f20032017423388202b42ffffffffffffff03837c3703983f200341b83f6a200341903f6a410a1067200341d01a6a20032903d83f22174200202a420010cc06200341801a6a2018420020032903b83f221f420010cc06200341a01b6a20032903d03f222042002011420010cc06200341f01b6a20032903c83f22214200201a420010cc06200341c01c6a20032903c03f222542002016420010cc06200341901a6a20164200201f420010cc06200341b01b6a20204200202a420010cc06200341e01a6a202c42002017420010cc06200341801c6a202142002011420010cc06200341d01c6a20254200201a420010cc06200341f0196a201f42002019420010cc06200341c01a6a201742002011420010cc06200341901b6a20204200201a420010cc06200341e01b6a202142002016420010cc06200341b01c6a202542002018420010cc06200341e0196a201f4200201b420010cc06200341b01a6a20174200201a420010cc06200341801b6a202042002016420010cc06200341d01b6a202142002018420010cc06200341a01c6a202542002019420010cc06200341d0196a201f42002024420010cc06200341a01a6a201742002016420010cc06200341f01a6a202042002018420010cc06200341c01b6a202142002019420010cc06200341901c6a20254200201b420010cc06200320032903c01a222320032903f0197c221620032903901b7c221820032903e01b7c221a20032903b01c7c221b20032903801a222220032903d01a7c221920032903a01b7c221120032903f01b7c221720032903c01c7c221f20032903b01b222420032903901a7c222020032903e01a7c222120032903801c7c222520032903d01c7c2226423388200341b01b6a41086a290300200341901a6a41086a2903007c2020202454ad7c200341e01a6a41086a2903007c2021202054ad7c200341801c6a41086a2903007c2025202154ad7c200341d01c6a41086a2903007c2026202554ad7c420d86847c2220423388200341801a6a41086a290300200341d01a6a41086a2903007c2019202254ad7c200341a01b6a41086a2903007c2011201954ad7c200341f01b6a41086a2903007c2017201154ad7c200341c01c6a41086a2903007c201f201754ad7c2020201f54ad7c420d86847c221142ffffffffffffff038322193703f03f200320032903b01a222220032903e0197c221720032903801b7c221f20032903d01b7c222120032903a01c7c22252011423388200341c01a6a41086a290300200341f0196a41086a2903007c2016202354ad7c200341901b6a41086a2903007c2018201654ad7c200341e01b6a41086a2903007c201a201854ad7c200341b01c6a41086a2903007c201b201a54ad7c2011201b54ad7c420d86847c221642ffffffffffffff0383221b3703f83f200320032903a01a222a20032903d0197c221820032903f01a7c221a20032903c01b7c221120032903901c7c22232016423388200341b01a6a41086a290300200341e0196a41086a2903007c2017202254ad7c200341801b6a41086a2903007c201f201754ad7c200341d01b6a41086a2903007c2021201f54ad7c200341a01c6a41086a2903007c2025202154ad7c2016202554ad7c420d86847c221642ffffffffffffff038322243703804020032016423388200341a01a6a41086a290300200341d0196a41086a2903007c2018202a54ad7c200341f01a6a41086a2903007c201a201854ad7c200341c01b6a41086a2903007c2011201a54ad7c200341901c6a41086a2903007c2023201154ad7c2016202354ad7c420d868442137e202642ffffffffffffff03837c221842ffffffffffffff038322163703e03f20032018423388202042ffffffffffffff03837c22183703e83f20034188c0006a200341e03f6a41321067200341c0176a201942137e222a420020032903a8402217420010cc0620034190186a201b42137e2211420020032903a040221f420010cc06200341e0186a202442137e221a42002003290398402220420010cc06200341b0196a201642002003290390402221420010cc06200341f0166a201842002003290388402225420010cc06200341a0186a202a4200201f420010cc06200341f0186a201142002020420010cc06200341c0196a201a42002021420010cc0620034180176a201642002025420010cc06200341d0176a201842137e222c42002017420010cc06200341e0166a201942002025420010cc06200341b0176a201142002017420010cc0620034180186a201a4200201f420010cc06200341d0186a201642002020420010cc06200341a0196a201842002021420010cc0620034190196a202142002019420010cc06200341d0166a201b42002025420010cc06200341a0176a201a42002017420010cc06200341f0176a20164200201f420010cc06200341c0186a201842002020420010cc06200341b0186a201942002020420010cc0620034180196a201b42002021420010cc06200341c0166a202442002025420010cc0620034190176a201642002017420010cc06200341e0176a20184200201f420010cc06200320032903b017222d20032903e0167c22172003290380187c221f20032903d0187c222120032903a0197c2225200329039018222e20032903c0177c222020032903e0187c222620032903b0197c222320032903f0167c222220032903f018222f20032903a0187c222b20032903c0197c22272003290380177c222820032903d0177c2229423388200341f0186a41086a290300200341a0186a41086a2903007c202b202f54ad7c200341c0196a41086a2903007c2027202b54ad7c20034180176a41086a2903007c2028202754ad7c200341d0176a41086a2903007c2029202854ad7c420d86847c222742338820034190186a41086a290300200341c0176a41086a2903007c2020202e54ad7c200341e0186a41086a2903007c2026202054ad7c200341b0196a41086a2903007c2023202654ad7c200341f0166a41086a2903007c2022202354ad7c2027202254ad7c420d86847c222642ffffffffffffff038322203703c040200320032903d016222f2003290390197c222320032903a0177c222220032903f0177c222820032903c0187c222e2026423388200341b0176a41086a290300200341e0166a41086a2903007c2017202d54ad7c20034180186a41086a2903007c201f201754ad7c200341d0186a41086a2903007c2021201f54ad7c200341a0196a41086a2903007c2025202154ad7c2026202554ad7c420d86847c221742ffffffffffffff0383222b3703c8402003200329038019222d20032903b0187c221f20032903c0167c22212003290390177c222520032903e0177c22262017423388200341d0166a41086a29030020034190196a41086a2903007c2023202f54ad7c200341a0176a41086a2903007c2022202354ad7c200341f0176a41086a2903007c2028202254ad7c200341c0186a41086a2903007c202e202854ad7c2017202e54ad7c420d86847c221742ffffffffffffff038322283703d0402003201742338820034180196a41086a290300200341b0186a41086a2903007c201f202d54ad7c200341c0166a41086a2903007c2021201f54ad7c20034190176a41086a2903007c2025202154ad7c200341e0176a41086a2903007c2026202554ad7c2017202654ad7c420d868442137e202942ffffffffffffff03837c221f42ffffffffffffff038322173703b0402003201f423388202742ffffffffffffff03837c221f3703b840200341d8c0006a200341b0c0006a41e4001067200341b0146a202042137e222e420020032903f8402221420010cc0620034180156a202b42137e2229420020032903f0402225420010cc06200341d0156a202842137e2227420020032903e8402226420010cc06200341a0166a2017420020032903e0402223420010cc06200341e0136a201f420020032903d8402222420010cc0620034190156a202e42002025420010cc06200341e0156a202942002026420010cc06200341b0166a202742002023420010cc06200341f0136a201742002022420010cc06200341c0146a201f42137e42002021420010cc06200341d0136a202042002022420010cc06200341a0146a202942002021420010cc06200341f0146a202742002025420010cc06200341c0156a201742002026420010cc0620034190166a201f42002023420010cc0620034180166a202042002023420010cc06200341c0136a202b42002022420010cc0620034190146a202742002021420010cc06200341e0146a201742002025420010cc06200341b0156a201f42002026420010cc06200341a0156a202042002026420010cc06200341f0156a202b42002023420010cc06200341b0136a202842002022420010cc0620034180146a201742002021420010cc06200341d0146a201f42002025420010cc06200320032903a014222e20032903d0137c221720032903f0147c221f20032903c0157c22202003290390167c2221200329038015222d20032903b0147c222520032903d0157c222620032903a0167c222320032903e0137c222220032903e015222f2003290390157c222b20032903b0167c222720032903f0137c222820032903c0147c2229423388200341e0156a41086a29030020034190156a41086a2903007c202b202f54ad7c200341b0166a41086a2903007c2027202b54ad7c200341f0136a41086a2903007c2028202754ad7c200341c0146a41086a2903007c2029202854ad7c420d86847c222b42338820034180156a41086a290300200341b0146a41086a2903007c2025202d54ad7c200341d0156a41086a2903007c2026202554ad7c200341a0166a41086a2903007c2023202654ad7c200341e0136a41086a2903007c2022202354ad7c202b202254ad7c420d86847c222542ffffffffffffff038337039041200320032903c01322282003290380167c22262003290390147c222320032903e0147c222220032903b0157c22272025423388200341a0146a41086a290300200341d0136a41086a2903007c2017202e54ad7c200341f0146a41086a2903007c201f201754ad7c200341c0156a41086a2903007c2020201f54ad7c20034190166a41086a2903007c2021202054ad7c2025202154ad7c420d86847c221742ffffffffffffff038337039841200320032903f015222e20032903a0157c221f20032903b0137c22202003290380147c222120032903d0147c22252017423388200341c0136a41086a29030020034180166a41086a2903007c2026202854ad7c20034190146a41086a2903007c2023202654ad7c200341e0146a41086a2903007c2022202354ad7c200341b0156a41086a2903007c2027202254ad7c2017202754ad7c420d86847c221742ffffffffffffff03833703a04120032017423388200341f0156a41086a290300200341a0156a41086a2903007c201f202e54ad7c200341b0136a41086a2903007c2020201f54ad7c20034180146a41086a2903007c2021202054ad7c200341d0146a41086a2903007c2025202154ad7c2017202554ad7c420d868442137e202942ffffffffffffff03837c221742ffffffffffffff03833703804120032017423388202b42ffffffffffffff03837c37038841200341a8c1006a20034180c1006a41321067200341b0106a20032903a841221742002018420010cc0620034180116a20032903c841221f4200202a420010cc06200341d0116a20032903c041222042002011420010cc06200341a0126a20032903b84122214200201a420010cc06200341f0126a20032903b041222542002016420010cc06200341a0106a201742002016420010cc06200341f0106a201f4200202c420010cc06200341c0116a20204200202a420010cc0620034190126a202142002011420010cc06200341e0126a20254200201a420010cc06200341c0106a201742002019420010cc0620034190116a201f42002011420010cc06200341e0116a20204200201a420010cc06200341b0126a202142002016420010cc0620034180136a202542002018420010cc06200341d0106a20174200201b420010cc06200341a0116a201f4200201a420010cc06200341f0116a202042002016420010cc06200341c0126a202142002018420010cc0620034190136a202542002019420010cc06200341e0106a201742002024420010cc06200341b0116a201f42002016420010cc0620034180126a202042002018420010cc06200341d0126a202142002019420010cc06200341a0136a20254200201b420010cc0620034180346a200e4200201c42137e2219420010cc06200341c0336a200b4200201d42137e2218420010cc0620034180336a20044200201e42137e2216420010cc06200341f00c6a200642002012420010cc0620034180356a201342002009420010cc06200341d0336a200b42002019420010cc0620034190336a200442002018420010cc06200341800d6a201242002009420010cc06200341c0326a200642002016420010cc0620034190346a201342137e4200200e420010cc06200341f0346a20094200201c420010cc06200341f0336a200e42002018420010cc06200341b0336a200b42002016420010cc06200341e00c6a201242002004420010cc06200341b0326a201342002006420010cc06200341e0346a20094200201d420010cc06200341e0336a20164200200e420010cc06200341800c6a20124200200b420010cc06200341a0326a20064200201c420010cc06200341f0326a201342002004420010cc06200341d0346a201e42002009420010cc06200341e0326a20044200201c420010cc06200341a00b6a20124200200e420010cc0620034190326a20064200201d420010cc06200341a0336a20134200200b420010cc062003200329039011222120032903c0107c221620032903e0117c221820032903b0127c22192003290380137c221a200329038011222520032903b0107c221b20032903d0117c221220032903a0127c221320032903f0127c221120032903f010222620032903a0107c221720032903c0117c221f2003290390127c221c20032903e0127c2220423388200341f0106a41086a290300200341a0106a41086a2903007c2017202654ad7c200341c0116a41086a2903007c201f201754ad7c20034190126a41086a2903007c201c201f54ad7c200341e0126a41086a2903007c2020201c54ad7c420d86847c221742338820034180116a41086a290300200341b0106a41086a2903007c201b202554ad7c200341d0116a41086a2903007c2012201b54ad7c200341a0126a41086a2903007c2013201254ad7c200341f0126a41086a2903007c2011201354ad7c2017201154ad7c420d86847c221b42ffffffffffffff038337039041200320032903a011221c20032903d0107c221220032903f0117c221320032903c0127c22112003290390137c221f201b42338820034190116a41086a290300200341c0106a41086a2903007c2016202154ad7c200341e0116a41086a2903007c2018201654ad7c200341b0126a41086a2903007c2019201854ad7c20034180136a41086a2903007c201a201954ad7c201b201a54ad7c420d86847c221642ffffffffffffff038337039841200320032903b011222120032903e0107c22182003290380127c221920032903d0127c221a20032903a0137c221b2016423388200341a0116a41086a290300200341d0106a41086a2903007c2012201c54ad7c200341f0116a41086a2903007c2013201254ad7c200341c0126a41086a2903007c2011201354ad7c20034190136a41086a2903007c201f201154ad7c2016201f54ad7c420d86847c221642ffffffffffffff03833703a04120032016423388200341b0116a41086a290300200341e0106a41086a2903007c2018202154ad7c20034180126a41086a2903007c2019201854ad7c200341d0126a41086a2903007c201a201954ad7c200341a0136a41086a2903007c201b201a54ad7c2016201b54ad7c420d868442137e202042ffffffffffffff03837c221642ffffffffffffff03833703804120032016423388201742ffffffffffffff03837c37038841200341a8c1006a20034180c1006a41021067200341900e6a200c420020032903c841221342137e2219420010cc06200341e00e6a200f420020032903c041221b42137e2212420010cc06200341b00f6a2008420020032903b841221a42137e2211420010cc0620034180106a2014420020032903b0412216420010cc06200341a00d6a2015420020032903a8412218420010cc06200341f00e6a200c42002012420010cc06200341c00f6a200f42002011420010cc0620034190106a20084200201642137e420010cc06200341900d6a201442002018420010cc06200341a00e6a201542002019420010cc06200341b00d6a200c42002018420010cc06200341800e6a200f42002019420010cc06200341d00e6a200842002012420010cc06200341a00f6a20144200201a420010cc06200341f00f6a201542002016420010cc06200341e00f6a200c42002016420010cc06200341c00d6a200f42002018420010cc06200341f00d6a200842002019420010cc06200341c00e6a20144200201b420010cc06200341900f6a20154200201a420010cc06200341800f6a200c4200201a420010cc06200341d00f6a200f42002016420010cc06200341d00d6a200842002018420010cc06200341e00d6a201442002013420010cc06200341b00e6a20154200201b420010cc06200341800b6a20032903e032222a20032903d0347c221520032903a00b7c22162003290390327c221820032903a0337c221b20032903e033222320032903e0347c220c20032903800c7c220f20032903a0327c220820032903f0327c221420032903f033222220032903f0347c221920032903b0337c221a20032903e00c7c221220032903b0327c221320032903c033221d2003290380347c22112003290380337c221720032903f00c7c221f2003290380357c221c200329039033222420032903d0337c222020032903800d7c222120032903c0327c22252003290390347c222642338820034190336a41086a290300200341d0336a41086a2903007c2020202454ad7c200341800d6a41086a2903007c2021202054ad7c200341c0326a41086a2903007c2025202154ad7c20034190346a41086a2903007c2026202554ad7c420d86847c2220423388200341c0336a41086a29030020034180346a41086a2903007c2011201d54ad7c20034180336a41086a2903007c2017201154ad7c200341f00c6a41086a2903007c201f201754ad7c20034180356a41086a2903007c201c201f54ad7c2020201c54ad7c420d86847c2211423388200341f0336a41086a290300200341f0346a41086a2903007c2019202254ad7c200341b0336a41086a2903007c201a201954ad7c200341e00c6a41086a2903007c2012201a54ad7c200341b0326a41086a2903007c2013201254ad7c2011201354ad7c420d86847c221a423388200341e0336a41086a290300200341e0346a41086a2903007c200c202354ad7c200341800c6a41086a2903007c200f200c54ad7c200341a0326a41086a2903007c2008200f54ad7c200341f0326a41086a2903007c2014200854ad7c201a201454ad7c420d86847c221242ffffffffffffff0383220c420020032903800e221d20032903b00d7c220820032903d00e7c221420032903a00f7c221320032903f00f7c221720032903e00e222420032903900e7c220f20032903b00f7c22192003290380107c221f20032903a00d7c221c20032903c00f222b20032903f00e7c22212003290390107c222520032903900d7c222320032903a00e7c2222423388200341c00f6a41086a290300200341f00e6a41086a2903007c2021202b54ad7c20034190106a41086a2903007c2025202154ad7c200341900d6a41086a2903007c2023202554ad7c200341a00e6a41086a2903007c2022202354ad7c420d86847c2221423388200341e00e6a41086a290300200341900e6a41086a2903007c200f202454ad7c200341b00f6a41086a2903007c2019200f54ad7c20034180106a41086a2903007c201f201954ad7c200341a00d6a41086a2903007c201c201f54ad7c2021201c54ad7c420d86847c221f42ffffffffffffff0383221942137e222b420010cc06200341e00b6a201a42ffffffffffffff0383220f420020032903c00d222720032903e00f7c221a20032903f00d7c221c20032903c00e7c222520032903900f7c2223201f423388200341800e6a41086a290300200341b00d6a41086a2903007c2008201d54ad7c200341d00e6a41086a2903007c2014200854ad7c200341a00f6a41086a2903007c2013201454ad7c200341f00f6a41086a2903007c2017201354ad7c201f201754ad7c420d86847c221442ffffffffffffff0383221342137e2217420010cc06200341c00c6a201142ffffffffffffff03832208420020032903d00f221e20032903800f7c221120032903d00d7c221f20032903e00d7c221d20032903b00e7c22242014423388200341c00d6a41086a290300200341e00f6a41086a2903007c201a202754ad7c200341f00d6a41086a2903007c201c201a54ad7c200341c00e6a41086a2903007c2025201c54ad7c200341900f6a41086a2903007c2023202554ad7c2014202354ad7c420d86847c221442ffffffffffffff0383221c42137e221a420010cc06200341b00a6a2014423388200341d00f6a41086a290300200341800f6a41086a2903007c2011201e54ad7c200341d00d6a41086a2903007c201f201154ad7c200341e00d6a41086a2903007c201d201f54ad7c200341b00e6a41086a2903007c2024201d54ad7c2014202454ad7c420d868442137e202242ffffffffffffff03837c221142ffffffffffffff0383221442002012423388200341e0326a41086a290300200341d0346a41086a2903007c2015202a54ad7c200341a00b6a41086a2903007c2016201554ad7c20034190326a41086a2903007c2018201654ad7c200341a0336a41086a2903007c201b201854ad7c2012201b54ad7c420d868442137e202642ffffffffffffff03837c2218423388202042ffffffffffffff03837c2215420010cc06200341e0096a2011423388202142ffffffffffffff03837c22164200201842ffffffffffffff03832218420010cc06200341f00b6a200f4200202b420010cc06200341d00c6a200842002017420010cc06200341c00a6a201a42002015420010cc06200341f0096a201442002018420010cc06200341900b6a200c4200201642137e420010cc06200341d0096a201942002018420010cc06200341f00a6a200c42002017420010cc06200341d00b6a200f4200201a420010cc06200341b00c6a200842002014420010cc06200341a00a6a201642002015420010cc06200341900a6a201942002015420010cc06200341c0096a201342002018420010cc06200341e00a6a200c4200201a420010cc06200341c00b6a200f42002014420010cc06200341a00c6a200842002016420010cc06200341900c6a200842002019420010cc06200341800a6a201342002015420010cc06200341b0096a201c42002018420010cc06200341d00a6a200c42002014420010cc06200341b00b6a200f42002016420010cc06200320032903f00a221120032903d0097c220c20032903d00b7c220f20032903b00c7c220820032903a00a7c221420032903e00b221720032903800b7c221520032903c00c7c221620032903b00a7c221820032903e0097c221920032903d00c221f20032903f00b7c221a20032903c00a7c221b20032903f0097c221220032903900b7c2213423388200341d00c6a41086a290300200341f00b6a41086a2903007c201a201f54ad7c200341c00a6a41086a2903007c201b201a54ad7c200341f0096a41086a2903007c2012201b54ad7c200341900b6a41086a2903007c2013201254ad7c221b420d86847c221a423388200341e00b6a41086a290300200341800b6a41086a2903007c2015201754ad7c200341c00c6a41086a2903007c2016201554ad7c200341b00a6a41086a2903007c2018201654ad7c200341e0096a41086a2903007c2019201854ad7c201b4233887c201a201954ad7c2212420d86847c221542ffffffffffffff03833703e840200320032903c009221720032903900a7c221620032903e00a7c221820032903c00b7c221920032903a00c7c221b2015423388200341f00a6a41086a290300200341d0096a41086a2903007c200c201154ad7c200341d00b6a41086a2903007c200f200c54ad7c200341b00c6a41086a2903007c2008200f54ad7c200341a00a6a41086a2903007c2014200854ad7c20124233887c2015201454ad7c2212420d86847c220c42ffffffffffffff03833703f040200320032903800a221120032903900c7c220f20032903b0097c220820032903d00a7c221420032903b00b7c2215200c423388200341c0096a41086a290300200341900a6a41086a2903007c2016201754ad7c200341e00a6a41086a2903007c2018201654ad7c200341c00b6a41086a2903007c2019201854ad7c200341a00c6a41086a2903007c201b201954ad7c20124233887c200c201b54ad7c2216420d86847c220c42ffffffffffffff03833703f8402003200c423388200341800a6a41086a290300200341900c6a41086a2903007c200f201154ad7c200341b0096a41086a2903007c2008200f54ad7c200341d00a6a41086a2903007c2014200854ad7c200341b00b6a41086a2903007c2015201454ad7c20164233887c200c201554ad7c420d868442137e201342ffffffffffffff03837c220c42ffffffffffffff03833703d8402003200c423388201a42ffffffffffffff03837c3703e040200341a8c1006a200341d8c0006a4101106720034190096a20032903b041220c42002010420010cc06200341c0086a20032903b841220842137e22184200200d420010cc06200341f0076a20032903c041221542137e22164200200a420010cc06200341a0076a20032903c841221942137e221442002007420010cc06200341b0066a20032903a841220f42002005420010cc06200341a0096a200c42137e4200200d420010cc06200341d0086a20184200200a420010cc0620034180086a201642002007420010cc06200341a0066a200f42002010420010cc06200341b0076a201442002005420010cc0620034180096a200c42002005420010cc06200341b0086a200842002010420010cc06200341e0076a20164200200d420010cc0620034190076a20144200200a420010cc06200341c0066a200f42002007420010cc06200341f0086a200c42002007420010cc06200341a0086a200842002005420010cc06200341d0076a201542002010420010cc0620034180076a20144200200d420010cc06200341d0066a200f4200200a420010cc06200341e0086a200c4200200a420010cc0620034190086a200842002007420010cc06200341c0076a201542002005420010cc06200341f0066a201942002010420010cc06200341e0066a200f4200200d420010cc06200320032903b008220d2003290380097c221020032903e0077c22052003290390077c220720032903c0067c220c20032903c008221a2003290390097c220f20032903f0077c220820032903a0077c221420032903b0067c221520032903d008221b20032903a0097c22162003290380087c220a20032903a0067c221820032903b0077c2219423388200341d0086a41086a290300200341a0096a41086a2903007c2016201b54ad7c20034180086a41086a2903007c200a201654ad7c200341a0066a41086a2903007c2018200a54ad7c200341b0076a41086a2903007c2019201854ad7c420d86847c2216423388200341c0086a41086a29030020034190096a41086a2903007c200f201a54ad7c200341f0076a41086a2903007c2008200f54ad7c200341a0076a41086a2903007c2014200854ad7c200341b0066a41086a2903007c2015201454ad7c2016201554ad7c420d86847c220f42ffffffffffffff038337039041200320032903a008221820032903f0087c220820032903d0077c22142003290380077c221520032903d0067c220a200f423388200341b0086a41086a29030020034180096a41086a2903007c2010200d54ad7c200341e0076a41086a2903007c2005201054ad7c20034190076a41086a2903007c2007200554ad7c200341c0066a41086a2903007c200c200754ad7c200f200c54ad7c420d86847c221042ffffffffffffff0383370398412003200329039008220d20032903e0087c220520032903c0077c220720032903f0067c220c20032903e0067c220f2010423388200341a0086a41086a290300200341f0086a41086a2903007c2008201854ad7c200341d0076a41086a2903007c2014200854ad7c20034180076a41086a2903007c2015201454ad7c200341d0066a41086a2903007c200a201554ad7c2010200a54ad7c420d86847c221042ffffffffffffff03833703a0412003201042338820034190086a41086a290300200341e0086a41086a2903007c2005200d54ad7c200341c0076a41086a2903007c2007200554ad7c200341f0066a41086a2903007c200c200754ad7c200341e0066a41086a2903007c200f200c54ad7c2010200f54ad7c420d868442137e201942ffffffffffffff03837c221042ffffffffffffff03833703804120032010423388201642ffffffffffffff03837c37038841200341b0c0006a20034180c1006a106420034188c0006a200110644100210241012130034020034188c0006a20026a2d0000200341b0c0006a20026a2d0000732231410020316b72417f734180017141077610662030712130200241016a22024120470d000b203010662132200341a8c1006a41086a42f0ffffffffffff3f200141086a2903007d221042ffffffffffffff038342d0fdffffffffff3f20012903007d22054233887c370300200341a8c1006a41106a42f0ffffffffffff3f200141106a2903007d220742ffffffffffffff038320104233887c370300200341a8c1006a41186a42f0ffffffffffff3f200141186a2903007d221042ffffffffffffff038320074233887c370300200341a8c1006a41206a42f0ffffffffffff3f200141206a2903007d220742ffffffffffffff038320104233887c3703002003200742338842137e200542ffffffffffffff03837c3703a841200341b0c0006a20034180c1006a106420034188c0006a200341a8c1006a10644100210241012130034020034188c0006a20026a2d0000200341b0c0006a20026a2d0000732231410020316b72417f734180017141077610662030712130200241016a22024120470d000b200341c0036a42f0ffffffffffff3f200b7d220742338842f0ffffffffffff3f200e7d220542ffffffffffffff03837c2210420042a0d69f90da80b1cb00420010cc0620034190046a200542338842137e42d0fdffffffffff3f20097d220b42ffffffffffffff03837c22054200429db1bce4dfb435420010cc06200341e0046a42f0ffffffffffff3f20047d220e423388200742ffffffffffffff03837c2207420042badf96dcb5c3bac700420010cc06200341b0056a42f0ffffffffffff3f20067d2204423388200e42ffffffffffffff03837c220e420042a7ecfac2b5f7ea19420010cc0620034180066a200442ffffffffffffff0383200b4233887c220b420042b0c1bad0f4e48603420010cc06200341d0036a2010420042a7a7fbf49beaf607420010cc06200341a0046a2005420042b0c1bad0f4e48603420010cc06200341f0046a2007420042a0d69f90da80b1cb00420010cc06200341c0056a200e420042badf96dcb5c3bac700420010cc0620034190066a200b420042a7ecfac2b5f7ea19420010cc06200341b0036a2010420042badf96dcb5c3bac700420010cc0620034180046a2005420042e098f4e5e9ebfb03420010cc06200341d0046a2007420042a7ecfac2b5f7ea19420010cc06200341a0056a200e420042b0c1bad0f4e48603420010cc06200341f0056a200b4200429db1bce4dfb435420010cc06200341a0036a2010420042a7ecfac2b5f7ea19420010cc06200341f0036a20054200429e9981b4dab2e103420010cc06200341c0046a2007420042b0c1bad0f4e48603420010cc0620034190056a200e4200429db1bce4dfb435420010cc06200341e0056a200b420042e098f4e5e9ebfb03420010cc0620034190036a2010420042b0c1bad0f4e48603420010cc06200341e0036a20054200429df893c0a486ae01420010cc06200341b0046a20074200429db1bce4dfb435420010cc0620034180056a200e420042e098f4e5e9ebfb03420010cc06200341d0056a200b4200429e9981b4dab2e103420010cc06200341c0036a41086a290300211820034190046a41086a290300211920032903c00321102003290390042109200341e0046a41086a290300210d20032903e004210c200341b0056a41086a290300211a20032903b005210f20034180066a41086a290300211b2003290380062108200341d0036a41086a2903002112200341a0046a41086a290300211320032903d003210520032903a0042114200341f0046a41086a290300211120032903f0042115200341c0056a41086a290300211720032903c005211620034190066a41086a290300211f200329039006210a20032903b0032107200329038004210e20032903d004210b20032903a005210420032903f0052106203010662101200320062004200b2007200e7c220e7c220b7c22047c22062008200f200c201020097c22097c220c7c220f7c2208200a20162015200520147c22147c22157c22167c220a423388201f20172011201220137c2014200554ad7c7c2015201454ad7c7c2016201554ad7c7c200a201654ad7c2214420d86847c2205423388201b201a200d201820197c2009201054ad7c7c200c200954ad7c7c200f200c54ad7c7c2008200f54ad7c20144233887c2005200854ad7c2214420d86847c221042ffffffffffffff03833703b841200320032903a003221520032903f0037c220920032903c0047c220c2003290390057c220f20032903e0057c22082010423388200341b0036a41086a29030020034180046a41086a2903007c200e200754ad7c200341d0046a41086a2903007c200b200e54ad7c200341a0056a41086a2903007c2004200b54ad7c200341f0056a41086a2903007c2006200454ad7c20144233887c2010200654ad7c2206420d86847c221042ffffffffffffff03833703c0412003200329039003221420032903e0037c220720032903b0047c220e2003290380057c220b20032903d0057c22042010423388200341a0036a41086a290300200341f0036a41086a2903007c2009201554ad7c200341c0046a41086a2903007c200c200954ad7c20034190056a41086a2903007c200f200c54ad7c200341e0056a41086a2903007c2008200f54ad7c20064233887c2010200854ad7c2206420d86847c221042ffffffffffffff03833703c8412003201042338820034190036a41086a290300200341e0036a41086a2903007c2007201454ad7c200341b0046a41086a2903007c200e200754ad7c20034180056a41086a2903007c200b200e54ad7c200341d0056a41086a2903007c2004200b54ad7c20064233887c2010200454ad7c420d868442137e200a42ffffffffffffff03837c221042ffffffffffffff03833703a84120032010423388200542ffffffffffffff03837c3703b041200341b0c0006a20034180c1006a106420034188c0006a200341a8c1006a10644100210241012130034020034188c0006a20026a2d0000200341b0c0006a20026a2d0000732231410020316b72417f734180017141077610662030712130200241016a22024120470d000b203010662102200341c0006a20032903e0402205420042b0c1bad0f4e48603420010cc06200341d0006a20032903e840220742137e22064200429df893c0a486ae01420010cc06200341b0016a20032903f040220b42137e22044200429e9981b4dab2e103420010cc0620034190026a20032903f840220942137e220e420042e098f4e5e9ebfb03420010cc06200341f0026a20032903d84022104200429db1bce4dfb435420010cc062003200542137e4200429df893c0a486ae01420010cc06200341e0006a20064200429e9981b4dab2e103420010cc06200341c0016a2004420042e098f4e5e9ebfb03420010cc0620034180036a2010420042b0c1bad0f4e48603420010cc06200341a0026a200e4200429db1bce4dfb435420010cc06200341306a20054200429db1bce4dfb435420010cc0620034190016a2007420042b0c1bad0f4e48603420010cc06200341a0016a20044200429df893c0a486ae01420010cc0620034180026a200e4200429e9981b4dab2e103420010cc06200341e0026a2010420042e098f4e5e9ebfb03420010cc06200341206a2005420042e098f4e5e9ebfb03420010cc0620034180016a20074200429db1bce4dfb435420010cc06200341e0016a200b420042b0c1bad0f4e48603420010cc06200341f0016a200e4200429df893c0a486ae01420010cc06200341d0026a20104200429e9981b4dab2e103420010cc06200341106a20054200429e9981b4dab2e103420010cc06200341f0006a2007420042e098f4e5e9ebfb03420010cc06200341d0016a200b4200429db1bce4dfb435420010cc06200341b0026a2009420042b0c1bad0f4e48603420010cc06200341c0026a20104200429df893c0a486ae01420010cc062003201020102003290370221320032903107c220520032903d0017c220720032903b0027c220e20032903c0027c220b200329038001221120032903207c220420032903e0017c220620032903f0017c220920032903d0027c220c200329039001221720032903307c220f20032903a0017c22082003290380027c221420032903e0027c22152003290350221f20032903407c221620032903b0017c220a2003290390027c221820032903f0027c22192003290360221c20032903007c220d20032903c0017c221a2003290380037c221b20032903a0027c2212423388200341e0006a41086a290300200341086a2903007c200d201c54ad7c200341c0016a41086a2903007c201a200d54ad7c20034180036a41086a2903007c201b201a54ad7c200341a0026a41086a2903007c2012201b54ad7c420d86847c220d423388200341d0006a41086a290300200341c0006a41086a2903007c2016201f54ad7c200341b0016a41086a2903007c200a201654ad7c20034190026a41086a2903007c2018200a54ad7c200341f0026a41086a2903007c2019201854ad7c200d201954ad7c420d86847c221642338820034190016a41086a290300200341306a41086a2903007c200f201754ad7c200341a0016a41086a2903007c2008200f54ad7c20034180026a41086a2903007c2014200854ad7c200341e0026a41086a2903007c2015201454ad7c2016201554ad7c420d86847c220f42338820034180016a41086a290300200341206a41086a2903007c2004201154ad7c200341e0016a41086a2903007c2006200454ad7c200341f0016a41086a2903007c2009200654ad7c200341d0026a41086a2903007c200c200954ad7c200f200c54ad7c420d86847c2204423388200341f0006a41086a290300200341106a41086a2903007c2005201354ad7c200341d0016a41086a2903007c2007200554ad7c200341b0026a41086a2903007c200e200754ad7c200341c0026a41086a2903007c200b200e54ad7c2004200b54ad7c420d868442137e201242ffffffffffffff03837c220e42ffffffffffffff038385420020022001721066ad42ff01837d2205838522073703d8402003200e423388200d42ffffffffffffff03837c20032903e040221085200583201085220e3703e0402003200442ffffffffffffff038320032903f840221085200583201085220b3703f8402003200f42ffffffffffffff038320032903f04022108520058320108522043703f0402003201642ffffffffffffff038320032903e84022108520058320108522053703e84020034188c0006a200341d8c0006a1064200342f0ffffffffffff3f200b7d220642ffffffffffffff038342f0ffffffffffff3f20047d22094233887c200b85420020032d0088404101711066ad42ff01837d221083200b853703f8402003200942ffffffffffffff038342f0ffffffffffff3f20057d220b4233887c2004852010832004853703f0402003200b42ffffffffffffff038342f0ffffffffffff3f200e7d220b4233887c2005852010832005853703e8402003200b42ffffffffffffff038342d0fdffffffffff3f20077d22054233887c200e85201083200e853703e0402003200642338842137e200542ffffffffffffff03837c2007852010832007853703d8402000200120327210663a0000200020032903d840370308200041106a20032903e040370300200041186a20032903e840370300200041206a20032903f040370300200041286a20032903f840370300200341d0c1006a24000b8d990104017f227e057f057e230041f02b6b22022400200242003703e028200242013703d828200242003703e828200242003703f028200242003703f828200241c82a6a200141011067200241b8286a20022903d02a2203420042b0c1bad0f4e48603420010cc06200241e8276a20022903d82a220442137e22054200429df893c0a486ae01420010cc0620024198276a20022903e02a220642137e22074200429e9981b4dab2e103420010cc06200241c8266a20022903e82a220842137e2209420042e098f4e5e9ebfb03420010cc06200241d8256a20022903c82a220a4200429db1bce4dfb435420010cc06200241c8256a200a420042b0c1bad0f4e48603420010cc06200241c8286a200342137e4200429df893c0a486ae01420010cc06200241f8276a20054200429e9981b4dab2e103420010cc06200241a8276a2007420042e098f4e5e9ebfb03420010cc06200241d8266a20094200429db1bce4dfb435420010cc06200241d8276a2004420042b0c1bad0f4e48603420010cc0620024188276a20074200429df893c0a486ae01420010cc06200241b8266a20094200429e9981b4dab2e103420010cc06200241e8256a200a420042e098f4e5e9ebfb03420010cc06200241a8286a20034200429db1bce4dfb435420010cc06200241f8266a2006420042b0c1bad0f4e48603420010cc06200241a8266a20094200429df893c0a486ae01420010cc06200241f8256a200a4200429e9981b4dab2e103420010cc0620024198286a2003420042e098f4e5e9ebfb03420010cc06200241c8276a20044200429db1bce4dfb435420010cc0620024198266a2008420042b0c1bad0f4e48603420010cc0620024188266a200a4200429df893c0a486ae01420010cc0620024188286a20034200429e9981b4dab2e103420010cc06200241b8276a2004420042e098f4e5e9ebfb03420010cc06200241e8266a20064200429db1bce4dfb435420010cc06200241d8236a200229038827220b20022903d8277c220320022903b8267c220a20022903e8257c220920022903a8287c220620022903e827220c20022903b8287c22042002290398277c220720022903c8267c220520022903d8257c220820022903c828220d20022903c8257c220e20022903f8277c220f20022903a8277c221020022903d8267c2211423388200241c8286a41086a290300200241c8256a41086a2903007c200e200d54ad7c200241f8276a41086a2903007c200f200e54ad7c200241a8276a41086a2903007c2010200f54ad7c200241d8266a41086a2903007c2011201054ad7c420d86847c220e423388200241e8276a41086a290300200241b8286a41086a2903007c2004200c54ad7c20024198276a41086a2903007c2007200454ad7c200241c8266a41086a2903007c2005200754ad7c200241d8256a41086a2903007c2008200554ad7c200e200854ad7c420d86847c220742ffffffffffffff0383220442137e220c420042ffed8af7ec86c802420010cc06200241e8226a20022903882622122002290398267c22052002290388287c220820022903b8277c220f20022903e8267c221020022903a826221320022903f8267c220d20022903f8257c22142002290398287c221520022903c8277c2216200742338820024188276a41086a290300200241d8276a41086a2903007c2003200b54ad7c200241b8266a41086a2903007c200a200354ad7c200241e8256a41086a2903007c2009200a54ad7c200241a8286a41086a2903007c2006200954ad7c2007200654ad7c420d86847c220a423388200241a8266a41086a290300200241f8266a41086a2903007c200d201354ad7c200241f8256a41086a2903007c2014200d54ad7c20024198286a41086a2903007c2015201454ad7c200241c8276a41086a2903007c2016201554ad7c200a201654ad7c420d86847c220642338820024188266a41086a29030020024198266a41086a2903007c2005201254ad7c20024188286a41086a2903007c2008200554ad7c200241b8276a41086a2903007c200f200854ad7c200241e8266a41086a2903007c2010200f54ad7c2006201054ad7c420d868442137e201142ffffffffffffff03837c2205423388200e42ffffffffffffff03837c2203420042a3f1e59aa1b9d301420010cc0620024188246a200a42ffffffffffffff0383220942137e2211420042bbf9809de6b8ce03420010cc06200241c8246a200642ffffffffffffff0383220642137e2207420042a9808780a6f4f902420010cc06200241c8216a200542ffffffffffffff0383220a420042bdddd5d88385ea00420010cc06200241d8216a200a420042a3f1e59aa1b9d301420010cc06200241f8226a200342137e2217420042ffed8af7ec86c802420010cc06200241e8236a200c420042bbf9809de6b8ce03420010cc0620024198246a2011420042a9808780a6f4f902420010cc06200241d8246a2007420042bdddd5d88385ea00420010cc06200241e8246a2004420042a3f1e59aa1b9d301420010cc06200241f8236a2011420042ffed8af7ec86c802420010cc06200241b8246a2007420042bbf9809de6b8ce03420010cc06200241b8216a200a420042a9808780a6f4f902420010cc06200241d8226a2003420042bdddd5d88385ea00420010cc0620024198256a2009420042a3f1e59aa1b9d301420010cc06200241a8246a2007420042ffed8af7ec86c802420010cc06200241a8216a200a420042bbf9809de6b8ce03420010cc06200241c8226a2003420042a9808780a6f4f902420010cc06200241f8246a2004420042bdddd5d88385ea00420010cc06200241b8256a2006420042a3f1e59aa1b9d301420010cc06200241d8206a200a420042ffed8af7ec86c802420010cc06200241b8226a2003420042bbf9809de6b8ce03420010cc0620024188256a2004420042a9808780a6f4f902420010cc06200241a8256a2009420042bdddd5d88385ea00420010cc06200241c81c6a200620022903f8287c2205420042ccf7d9e9fbcee010420010cc06200241c81d6a200a20022903d8287c2208420042cff887b5bcb5c603420010cc06200241f81c6a200920022903f0287c220e4200428df582a3b0868004420010cc0620024198236a200420022903e8287c220f4200429aebd0c282f1c201420010cc06200241f8216a200320022903e0287c2210420042f682ffa299b88202420010cc06200241d81c6a2005420042ddf396f0fbf7b9c300420010cc06200241b81d6a2008420042f682ffa299b88202420010cc06200241e81c6a200e420042ccf7d9e9fbcee010420010cc0620024188236a200f4200428df582a3b0868004420010cc06200241e8216a20104200429aebd0c282f1c201420010cc06200241b81c6a20054200428df582a3b0868004420010cc06200241d81d6a2008420042848dc885f9eff000420010cc06200241881d6a200e4200429aebd0c282f1c201420010cc06200241a8236a200f420042f682ffa299b88202420010cc0620024188226a2010420042cff887b5bcb5c603420010cc06200241a81c6a20054200429aebd0c282f1c201420010cc06200241e81d6a2008420042dfddd7d2ccf91a420010cc06200241981d6a200e420042f682ffa299b88202420010cc06200241b8236a200f420042cff887b5bcb5c603420010cc0620024198226a2010420042848dc885f9eff000420010cc06200241981c6a2005420042f682ffa299b88202420010cc06200241f81d6a2008420042bed6acd4f2a00a420010cc06200241a81d6a200e420042cff887b5bcb5c603420010cc06200241c8236a200f420042848dc885f9eff000420010cc06200241a8226a2010420042dfddd7d2ccf91a420010cc06200241f81e6a42efffffffffffffc30020022903d820221820022903b8257c220820022903b8227c220e2002290388257c220f20022903a8257c221020022903a82422192002290398257c220520022903a8217c220d20022903c8227c221420022903f8247c221520022903f823221a20022903e8247c221620022903b8247c220b20022903b8217c221220022903d8227c221320022903d823221b20022903e8227c221c2002290388247c221d20022903c8247c221e20022903c8217c221f20022903f822222020022903d8217c222120022903e8237c22222002290398247c222320022903d8247c2224423388200241f8226a41086a290300200241d8216a41086a2903007c2021202054ad7c200241e8236a41086a2903007c2022202154ad7c20024198246a41086a2903007c2023202254ad7c200241d8246a41086a2903007c2024202354ad7c420d86847c2221423388200241d8236a41086a290300200241e8226a41086a2903007c201c201b54ad7c20024188246a41086a2903007c201d201c54ad7c200241c8246a41086a2903007c201e201d54ad7c200241c8216a41086a2903007c201f201e54ad7c2021201f54ad7c420d86847c221c423388200241f8236a41086a290300200241e8246a41086a2903007c2016201a54ad7c200241b8246a41086a2903007c200b201654ad7c200241b8216a41086a2903007c2012200b54ad7c200241d8226a41086a2903007c2013201254ad7c201c201354ad7c420d86847c2216423388200241a8246a41086a29030020024198256a41086a2903007c2005201954ad7c200241a8216a41086a2903007c200d200554ad7c200241c8226a41086a2903007c2014200d54ad7c200241f8246a41086a2903007c2015201454ad7c2016201554ad7c420d86847c220d42ffffffffffffff03837d221442ffffffffffffff038342efffffffffffffc300201642ffffffffffffff03837d22154233887c22054200200c428b868581d2a18c387c2216420010cc06200241c81f6a201442338842137e42bcfdffffffffffc300200d423388200241d8206a41086a290300200241b8256a41086a2903007c2008201854ad7c200241b8226a41086a2903007c200e200854ad7c20024188256a41086a2903007c200f200e54ad7c200241a8256a41086a2903007c2010200f54ad7c200d201054ad7c420d868442137e202442ffffffffffffff03837c220f42ffffffffffffff03837d221042ffffffffffffff03837c22084200200342bdddd5d88385ea007c220c420010cc0620024188216a201542ffffffffffffff038342efffffffffffffc300201c42ffffffffffffff03837d22144233887c220e4200201142e18392a796b7d2c4007c220d420010cc06200241b8206a201442ffffffffffffff038342efffffffffffffc300200f423388202142ffffffffffffff03837c7d22144233887c220f4200200742eda9ced69582d9307c2211420010cc06200241981e6a201442ffffffffffffff038320104233887c22074200200a42a3f1e59aa1b9d3017c2210420010cc06200241881f6a2005420020174287f0dc94c6dfde0f7c420010cc06200241881e6a201042002008420010cc0620024198216a200e42002016420010cc06200241c8206a200f4200200d420010cc0620024188206a200742002011420010cc06200241e81e6a20054200200d420010cc06200241b81f6a20084200200442a9808780a6f4f9027c220d420010cc06200241f8206a200e42002011420010cc06200241a81e6a200f42002010420010cc06200241f81f6a20074200200c420010cc06200241d81e6a200542002011420010cc06200241a81f6a20084200200942bbf9809de6b8ce037c2211420010cc06200241b81e6a200e42002010420010cc06200241a8206a200f4200200c420010cc06200241e81f6a20074200200d420010cc06200241c81e6a200542002010420010cc06200241981f6a20084200200642ffed8af7ec86c8027c420010cc06200241e8206a200e4200200c420010cc0620024198206a200f4200200d420010cc06200241d81f6a200742002011420010cc06200220022903b81c220b20022903d81d7c220720022903881d7c220520022903a8237c22082002290388227c220e20022903c81c221220022903c81d7c220f20022903f81c7c22102002290398237c221120022903f8217c220c20022903d81c221320022903b81d7c220d20022903e81c7c22142002290388237c221520022903e8217c2216423388200241d81c6a41086a290300200241b81d6a41086a2903007c200d201354ad7c200241e81c6a41086a2903007c2014200d54ad7c20024188236a41086a2903007c2015201454ad7c200241e8216a41086a2903007c2016201554ad7c420d86847c220d423388200241c81c6a41086a290300200241c81d6a41086a2903007c200f201254ad7c200241f81c6a41086a2903007c2010200f54ad7c20024198236a41086a2903007c2011201054ad7c200241f8216a41086a2903007c200c201154ad7c200d200c54ad7c420d86847c220f42ffffffffffffff038337039029200220022903a81c221520022903e81d7c221020022903981d7c221120022903b8237c220c2002290398227c2214200f423388200241b81c6a41086a290300200241d81d6a41086a2903007c2007200b54ad7c200241881d6a41086a2903007c2005200754ad7c200241a8236a41086a2903007c2008200554ad7c20024188226a41086a2903007c200e200854ad7c200f200e54ad7c420d86847c220742ffffffffffffff038337039829200220022903981c220b20022903f81d7c220520022903a81d7c220820022903c8237c220e20022903a8227c220f2007423388200241a81c6a41086a290300200241e81d6a41086a2903007c2010201554ad7c200241981d6a41086a2903007c2011201054ad7c200241b8236a41086a2903007c200c201154ad7c20024198226a41086a2903007c2014200c54ad7c2007201454ad7c420d86847c220742ffffffffffffff03833703a02920022007423388200241981c6a41086a290300200241f81d6a41086a2903007c2005200b54ad7c200241a81d6a41086a2903007c2008200554ad7c200241c8236a41086a2903007c200e200854ad7c200241a8226a41086a2903007c200f200e54ad7c2007200f54ad7c420d868442137e201642ffffffffffffff03837c220742ffffffffffffff03833703802920022007423388200d42ffffffffffffff03837c37038829200220022903e81e220b20022903b81f7c220720022903f8207c220520022903a81e7c220820022903f81f7c220e20022903f81e221220022903c81f7c220f2002290388217c221020022903b8207c221120022903981e7c220c20022903881f221320022903881e7c220d2002290398217c221420022903c8207c22152002290388207c2216423388200241881f6a41086a290300200241881e6a41086a2903007c200d201354ad7c20024198216a41086a2903007c2014200d54ad7c200241c8206a41086a2903007c2015201454ad7c20024188206a41086a2903007c2016201554ad7c420d86847c220d423388200241f81e6a41086a290300200241c81f6a41086a2903007c200f201254ad7c20024188216a41086a2903007c2010200f54ad7c200241b8206a41086a2903007c2011201054ad7c200241981e6a41086a2903007c200c201154ad7c200d200c54ad7c420d86847c220f42ffffffffffffff03833703e029200220022903d81e221520022903a81f7c221020022903b81e7c221120022903a8207c220c20022903e81f7c2214200f423388200241e81e6a41086a290300200241b81f6a41086a2903007c2007200b54ad7c200241f8206a41086a2903007c2005200754ad7c200241a81e6a41086a2903007c2008200554ad7c200241f81f6a41086a2903007c200e200854ad7c200f200e54ad7c420d86847c220742ffffffffffffff03833703e829200220022903c81e220b20022903981f7c220520022903e8207c22082002290398207c220e20022903d81f7c220f2007423388200241d81e6a41086a290300200241a81f6a41086a2903007c2010201554ad7c200241b81e6a41086a2903007c2011201054ad7c200241a8206a41086a2903007c200c201154ad7c200241e81f6a41086a2903007c2014200c54ad7c2007201454ad7c420d86847c220742ffffffffffffff03833703f02920022007423388200241c81e6a41086a290300200241981f6a41086a2903007c2005200b54ad7c200241e8206a41086a2903007c2008200554ad7c20024198206a41086a2903007c200e200854ad7c200241d81f6a41086a2903007c200f200e54ad7c2007200f54ad7c420d868442137e201642ffffffffffffff03837c220742ffffffffffffff03833703d02920022007423388200d42ffffffffffffff03837c3703d829200241c82a6a20024180296a200241d0296a106820022d00c82a2125200241a02a6a41206a2226200241f02a6a2903002207370300200241a02a6a41186a2227200241c82a6a41206a2903002205370300200241a02a6a41106a2228200241c82a6a41186a2903002208370300200241a02a6a41086a2229200241c82a6a41106a290300220e370300200220022903d02a220f3703a02a200241f81b6a200f420020012903082210420010cc06200241a81b6a200742002001290310220c42137e2216420010cc06200241d81a6a200542002001290318221442137e2215420010cc06200241881a6a200842002001290320220b42137e220d420010cc0620024198196a200e420020012903002211420010cc0620024188196a20114200200f420010cc06200241881c6a20074200201042137e420010cc06200241b81b6a200542002016420010cc06200241e81a6a200842002015420010cc06200241981a6a200e4200200d420010cc06200241981b6a200f4200200c420010cc06200241c81a6a200742002015420010cc06200241f8196a20054200200d420010cc06200241a8196a200842002011420010cc06200241e81b6a200e42002010420010cc06200241b81a6a200f42002014420010cc06200241e8196a20074200200d420010cc06200241b8196a200542002011420010cc06200241d81b6a200842002010420010cc06200241881b6a200e4200200c420010cc06200241d8196a200f4200200b420010cc06200241c8196a200742002011420010cc06200241c81b6a200542002010420010cc06200241f81a6a20084200200c420010cc06200241a81a6a200e42002014420010cc06200220022903c819222220022903d8197c220720022903c81b7c220520022903f81a7c220820022903a81a7c220e20022903e819222320022903b81a7c220f20022903b8197c221020022903d81b7c221120022903881b7c220c20022903c81a222420022903981b7c220d20022903f8197c221420022903a8197c221520022903e81b7c221620022903a81b221720022903f81b7c220b20022903d81a7c221220022903881a7c22132002290398197c221c20022903881c22182002290388197c221d20022903b81b7c221e20022903e81a7c221f20022903981a7c2221423388200241881c6a41086a29030020024188196a41086a2903007c201d201854ad7c200241b81b6a41086a2903007c201e201d54ad7c200241e81a6a41086a2903007c201f201e54ad7c200241981a6a41086a2903007c2021201f54ad7c420d86847c221d423388200241a81b6a41086a290300200241f81b6a41086a2903007c200b201754ad7c200241d81a6a41086a2903007c2012200b54ad7c200241881a6a41086a2903007c2013201254ad7c20024198196a41086a2903007c201c201354ad7c201d201c54ad7c420d86847c220b423388200241c81a6a41086a290300200241981b6a41086a2903007c200d202454ad7c200241f8196a41086a2903007c2014200d54ad7c200241a8196a41086a2903007c2015201454ad7c200241e81b6a41086a2903007c2016201554ad7c200b201654ad7c420d86847c220d423388200241e8196a41086a290300200241b81a6a41086a2903007c200f202354ad7c200241b8196a41086a2903007c2010200f54ad7c200241d81b6a41086a2903007c2011201054ad7c200241881b6a41086a2903007c200c201154ad7c200d200c54ad7c420d86847c220f423388200241c8196a41086a290300200241d8196a41086a2903007c2007202254ad7c200241c81b6a41086a2903007c2005200754ad7c200241f81a6a41086a2903007c2008200554ad7c200241a81a6a41086a2903007c200e200854ad7c200f200e54ad7c420d868442137e202142ffffffffffffff03837c220742ffffffffffffff03833703f82a20022007423388201d42ffffffffffffff03837c22053703802b2002200f42ffffffffffffff038322083703982b2002200d42ffffffffffffff0383220e3703902b2002200b42ffffffffffffff0383220f3703882b200241c82a6a200241f82a6a106420022d00c82a4101711066417f73410171106621012002200542f0ffffffffffff3f20057d221142ffffffffffffff038342d0fdffffffffff3f20022903f82a22107d220c4233887c8542002001ad42ff01837d22078320058522053703802b2002200842f0ffffffffffff3f20087d220d42ffffffffffffff038342f0ffffffffffff3f200e7d22144233887c8520078320088522083703982b2002200f42f0ffffffffffff3f200f7d221542ffffffffffffff038320114233887c85200783200f85220f3703882b200220102010200d42338842137e200c42ffffffffffffff03837c852007838522103703f82a2002200e201442ffffffffffffff038320154233887c85200783200e85220e3703902b2025417f7341017122011066212520292029290300221120058542002025ad42ff01837d220783201185370300202820282903002205200f85200783200585370300202720272903002205200e85200783200585370300202620262903002205200885200783200585370300200220022903a02a22052010852007832005853703a02a200241b80f6a200a42ecffffffffffff0385420020011066ad42ff01837d22078342ecffffffffffff038522054200200320022903e0287d42f0ffffffffffff3f7c220e42ffffffffffffff0383200a20022903d8287d42d0fdffffffffff3f7c220c4233887c220a420010cc06200241f80c6a200642ffffffffffffff038520078342ffffffffffffff038522084200200420022903e8287d42f0ffffffffffff3f7c221042ffffffffffffff0383200e4233887c220f42137e220d420010cc06200241c80d6a200942ffffffffffffff038520078342ffffffffffffff0385220e4200200920022903f0287d42f0ffffffffffff3f7c220942ffffffffffffff038320104233887c221042137e2211420010cc06200241980e6a200442ffffffffffffff038520078342ffffffffffffff038522044200200620022903f8287d42f0ffffffffffff3f7c221442ffffffffffffff038320094233887c221542137e2206420010cc06200241e80e6a200342ffffffffffffff038520078342ffffffffffffff038522034200201442338842137e200c42ffffffffffffff03837c2209420010cc06200241c80f6a200942002005420010cc06200241880d6a20084200200a42137e420010cc06200241d80d6a200e4200200d420010cc06200241a80e6a200442002011420010cc06200241f80e6a200342002006420010cc06200241a80f6a20054200200f420010cc06200241e80c6a200842002011420010cc06200241b80d6a200e42002006420010cc06200241880e6a200442002009420010cc06200241d80e6a20034200200a420010cc06200241980f6a200542002010420010cc06200241880c6a200842002006420010cc06200241a80d6a200e42002009420010cc06200241f80d6a20044200200a420010cc06200241c80e6a20034200200f420010cc06200241880f6a200542002015420010cc06200241a80b6a200842002009420010cc06200241980d6a200e4200200a420010cc06200241e80d6a20044200200f420010cc06200241b80e6a200342002010420010cc06200241880b6a20022903a80b221c20022903880f7c220a20022903980d7c220420022903e80d7c220920022903b80e7c220620022903880c221d20022903980f7c220320022903a80d7c220720022903f80d7c220520022903c80e7c220820022903e80c221e20022903a80f7c220e20022903b80d7c220f20022903880e7c221020022903d80e7c221120022903f80c221f20022903b80f7c220c20022903c80d7c220d20022903980e7c221420022903e80e7c221520022903880d222120022903c80f7c221620022903d80d7c220b20022903a80e7c221220022903f80e7c2213423388200241880d6a41086a290300200241c80f6a41086a2903007c2016202154ad7c200241d80d6a41086a2903007c200b201654ad7c200241a80e6a41086a2903007c2012200b54ad7c200241f80e6a41086a2903007c2013201254ad7c420d86847c2216423388200241f80c6a41086a290300200241b80f6a41086a2903007c200c201f54ad7c200241c80d6a41086a2903007c200d200c54ad7c200241980e6a41086a2903007c2014200d54ad7c200241e80e6a41086a2903007c2015201454ad7c2016201554ad7c420d86847c220c423388200241e80c6a41086a290300200241a80f6a41086a2903007c200e201e54ad7c200241b80d6a41086a2903007c200f200e54ad7c200241880e6a41086a2903007c2010200f54ad7c200241d80e6a41086a2903007c2011201054ad7c200c201154ad7c420d86847c220e423388200241880c6a41086a290300200241980f6a41086a2903007c2003201d54ad7c200241a80d6a41086a2903007c2007200354ad7c200241f80d6a41086a2903007c2005200754ad7c200241c80e6a41086a2903007c2008200554ad7c200e200854ad7c420d86847c220742ffffffffffffff03832203420042f8fb9b94e0ed8617420010cc06200241e8096a2007423388200241a80b6a41086a290300200241880f6a41086a2903007c200a201c54ad7c200241980d6a41086a2903007c2004200a54ad7c200241e80d6a41086a2903007c2009200454ad7c200241b80e6a41086a2903007c2006200954ad7c2007200654ad7c420d868442137e201342ffffffffffffff03837c220642ffffffffffffff0383220a420042b5cccc99bcc0e502420010cc06200241e80b6a200e42ffffffffffffff038322044200428b83d98ea38bdb0a420010cc06200241c80c6a200c42ffffffffffffff03832209420042e6c09290d28a8b35420010cc06200241b80a6a2006423388201642ffffffffffffff03837c2206420042a09ab5a7a4d5d602420010cc06200241980b6a2003420042efabafe6f7c88835420010cc06200241f8096a200a420042a09ab5a7a4d5d602420010cc06200241f80b6a2004420042f8fb9b94e0ed8617420010cc06200241d80c6a20094200428b83d98ea38bdb0a420010cc06200241c80a6a2006420042e6c09290d28a8b35420010cc06200241f80a6a20034200428b83d98ea38bdb0a420010cc06200241d8096a200a420042a8f2a9fabaa79b01420010cc06200241d80b6a2004420042e6c09290d28a8b35420010cc06200241b80c6a2009420042a09ab5a7a4d5d602420010cc06200241a80a6a2006420042b5cccc99bcc0e502420010cc06200241e80a6a2003420042e6c09290d28a8b35420010cc06200241c8096a200a420042a9afa6f3e694c800420010cc06200241c80b6a2004420042a09ab5a7a4d5d602420010cc06200241a80c6a2009420042b5cccc99bcc0e502420010cc06200241980a6a2006420042a8f2a9fabaa79b01420010cc06200241d80a6a2003420042a09ab5a7a4d5d602420010cc06200241b8096a200a420042c2cdbdbdb3d1e502420010cc06200241b80b6a2004420042b5cccc99bcc0e502420010cc06200241980c6a2009420042a8f2a9fabaa79b01420010cc06200241880a6a2006420042a9afa6f3e694c800420010cc0620022903d029210320022903f029210620022903e829210920022903e029210420022903d829210a200241a02b6a200241a02a6a41011067200241d8176a20022903a02a220720077c220e4200200a420010cc06200241a8176a2026290300220720077c22114200200442137e2208420010cc06200241d8166a2027290300220720077c220c4200200942137e2205420010cc06200241a8166a2028290300220b200b7c22144200200642137e2207420010cc06200241c8186a2029290300220f200f7c221542002003420010cc06200241c8176a20034200200e420010cc06200241b8176a20114200200a42137e420010cc06200241c8166a200c42002008420010cc0620024188186a201442002005420010cc06200241b8166a201542002007420010cc06200241e8176a200e42002004420010cc0620024198176a201142002005420010cc0620024198166a200c42002007420010cc0620024198186a201442002003420010cc06200241d8186a20154200200a420010cc06200241f8176a200e42002009420010cc06200241e8146a201142002007420010cc06200241e8166a200c42002003420010cc06200241a8186a20144200200a420010cc06200241e8186a201542002004420010cc06200241b8136a200e42002006420010cc0620024188176a201142002003420010cc06200241f8166a200c4200200a420010cc06200241b8186a201442002004420010cc06200241f8186a201542002009420010cc06200241a8076a20022903d80a221a20022903b8097c220720022903b80b7c220520022903980c7c220820022903880a7c220f20022903e80a221b20022903c8097c221020022903c80b7c220d20022903a80c7c221620022903980a7c221220022903f80a222020022903d8097c221320022903d80b7c221c20022903b80c7c221d20022903a80a7c221e20022903880b222a20022903e8097c221f20022903e80b7c222120022903c80c7c222220022903b80a7c222320022903980b222b20022903f8097c222420022903f80b7c221720022903d80c7c221820022903c80a7c2219423388200241980b6a41086a290300200241f8096a41086a2903007c2024202b54ad7c200241f80b6a41086a2903007c2017202454ad7c200241d80c6a41086a2903007c2018201754ad7c200241c80a6a41086a2903007c2019201854ad7c420d86847c2224423388200241880b6a41086a290300200241e8096a41086a2903007c201f202a54ad7c200241e80b6a41086a2903007c2021201f54ad7c200241c80c6a41086a2903007c2022202154ad7c200241b80a6a41086a2903007c2023202254ad7c2024202354ad7c420d86847c221f423388200241f80a6a41086a290300200241d8096a41086a2903007c2013202054ad7c200241d80b6a41086a2903007c201c201354ad7c200241b80c6a41086a2903007c201d201c54ad7c200241a80a6a41086a2903007c201e201d54ad7c201f201e54ad7c420d86847c2213423388200241e80a6a41086a290300200241c8096a41086a2903007c2010201b54ad7c200241c80b6a41086a2903007c200d201054ad7c200241a80c6a41086a2903007c2016200d54ad7c200241980a6a41086a2903007c2012201654ad7c2013201254ad7c420d86847c221042ffffffffffffff038320067d42f0ffffffffffff3f7c220642ffffffffffffff0383201342ffffffffffffff038320097d42f0ffffffffffff3f7c220d4233887c2209420042a88c8b81f5cabeca00420010cc06200241d8066a200642338842137e2010423388200241d80a6a41086a290300200241b8096a41086a2903007c2007201a54ad7c200241b80b6a41086a2903007c2005200754ad7c200241980c6a41086a2903007c2008200554ad7c200241880a6a41086a2903007c200f200854ad7c2010200f54ad7c420d868442137e201942ffffffffffffff03837c220642ffffffffffffff038320037d42d0fdffffffffff3f7c220742ffffffffffffff03837c2203420042d2dfded4f0ede000420010cc0620024198096a200d42ffffffffffffff0383201f42ffffffffffffff038320047d42f0ffffffffffff3f7c22054233887c2204420042c8ee859b8cd29829420010cc06200241c8086a200542ffffffffffffff03832006423388202442ffffffffffffff03837c200a7d42f0ffffffffffff3f7c22064233887c220a420042dcd78e98b19df320420010cc06200241f8076a200642ffffffffffffff038320074233887c22064200429bdceccb84d4fd03420010cc06200241b8076a2009420042969988cadca7b00e420010cc06200241e8066a20034200429bdceccb84d4fd03420010cc06200241a8096a2004420042a88c8b81f5cabeca00420010cc06200241d8086a200a420042c8ee859b8cd29829420010cc0620024188086a2006420042dcd78e98b19df320420010cc0620024198076a2009420042c8ee859b8cd29829420010cc06200241c8066a2003420042b8ecf9b5ffe8f503420010cc0620024188096a2004420042dcd78e98b19df320420010cc06200241b8086a200a4200429bdceccb84d4fd03420010cc06200241e8076a2006420042d2dfded4f0ede000420010cc0620024188076a2009420042dcd78e98b19df320420010cc0620024198056a200342004298c9f9f3f9c09502420010cc06200241f8086a20044200429bdceccb84d4fd03420010cc06200241a8086a200a420042d2dfded4f0ede000420010cc06200241d8076a2006420042b8ecf9b5ffe8f503420010cc06200241f8066a20094200429bdceccb84d4fd03420010cc06200241e8036a2003420042b4f0cadfb1d2dd01420010cc06200241e8086a2004420042d2dfded4f0ede000420010cc0620024198086a200a420042b8ecf9b5ffe8f503420010cc06200241c8076a200642004298c9f9f3f9c09502420010cc06200241c8126a200229038817222320022903b8137c220320022903f8167c220420022903b8187c220920022903f8187c220620022903e814222420022903f8177c220a20022903e8167c220720022903a8187c220520022903e8187c2208200229039817221720022903e8177c220f2002290398167c22102002290398187c220d20022903d8187c221620022903a817221820022903d8177c221220022903d8167c221320022903a8167c221c20022903c8187c221d20022903b817221920022903c8177c221e20022903c8167c221f2002290388187c222120022903b8167c2222423388200241b8176a41086a290300200241c8176a41086a2903007c201e201954ad7c200241c8166a41086a2903007c201f201e54ad7c20024188186a41086a2903007c2021201f54ad7c200241b8166a41086a2903007c2022202154ad7c420d86847c221e423388200241a8176a41086a290300200241d8176a41086a2903007c2012201854ad7c200241d8166a41086a2903007c2013201254ad7c200241a8166a41086a2903007c201c201354ad7c200241c8186a41086a2903007c201d201c54ad7c201e201d54ad7c420d86847c221242338820024198176a41086a290300200241e8176a41086a2903007c200f201754ad7c20024198166a41086a2903007c2010200f54ad7c20024198186a41086a2903007c200d201054ad7c200241d8186a41086a2903007c2016200d54ad7c2012201654ad7c420d86847c2210423388200241e8146a41086a290300200241f8176a41086a2903007c200a202454ad7c200241e8166a41086a2903007c2007200a54ad7c200241a8186a41086a2903007c2005200754ad7c200241e8186a41086a2903007c2008200554ad7c2010200854ad7c420d86847c220742ffffffffffffff0383220a420042f0ffffffffffff3f20022903b02b7d220542ffffffffffffff038342f0ffffffffffff3f20022903a82b7d22084233887c220f42137e2213420010cc0620024188106a200742338820024188176a41086a290300200241b8136a41086a2903007c2003202354ad7c200241f8166a41086a2903007c2004200354ad7c200241b8186a41086a2903007c2009200454ad7c200241f8186a41086a2903007c2006200954ad7c2007200654ad7c420d868442137e202242ffffffffffffff03837c221c42ffffffffffffff038322044200200842ffffffffffffff038342d1fdffffffffff3f20022903a02b7d22084233887c2209420010cc06200241f8136a201042ffffffffffffff03832206420042f0ffffffffffff3f20022903b82b7d220d42ffffffffffffff038320054233887c221042137e2203420010cc06200241a8156a201242ffffffffffffff03832207420042f0ffffffffffff3f20022903c02b7d221242ffffffffffffff0383200d4233887c220d42137e2216420010cc06200241a8116a201c423388201e42ffffffffffffff03837c22054200201242338842137e200842ffffffffffffff03837c2208420010cc06200241d8126a200a4200200942137e420010cc0620024198106a200842002004420010cc0620024188146a200642002013420010cc06200241b8156a200742002003420010cc06200241b8116a200542002016420010cc06200241b8126a200a42002003420010cc06200241f80f6a20044200200f420010cc06200241e8136a200642002016420010cc0620024198156a200742002008420010cc0620024198116a200542002009420010cc06200241c82b6a41106a2201200b370300200241c82b6a41086a201537030020012014370300200241c82b6a41186a200c370300200241c82b6a41206a20113703002002200e3703c82b200242003703d02a200242013703c82a200242003703d82a200242003703e02a200242003703e82a200220022903a02b42017c22033703c82a200220022903a82b220e3703d02a20024198136a200a420020022903b02b221142137e220b420010cc06200241d8106a20044200200e420010cc06200220113703d82a200241c8146a2006420020022903b82b221442137e2215420010cc06200220143703e02a200241f8156a2007420020022903c02b221242137e220c420010cc06200241f8116a200542002003420010cc06200241a8136a200a4200200e42137e2220420010cc06200241e8106a200342002004420010cc06200241d8146a20064200200b420010cc0620024188166a200742002015420010cc0620024188126a20054200200c420010cc0620024188136a200a42002015420010cc06200241c8106a200442002011420010cc06200241b8146a20064200200c420010cc06200241e8156a200742002003420010cc06200241e8116a20054200200e420010cc06200241a8126a200a42002016420010cc06200241e80f6a200442002010420010cc06200241d8136a200642002008420010cc0620024188156a200742002009420010cc0620024188116a20054200200f420010cc06200241f8126a200a4200200c420010cc06200241b8106a200442002014420010cc06200241a8146a200642002003420010cc06200241d8156a20074200200e420010cc06200241d8116a200542002011420010cc0620024198126a200a42002008420010cc06200241d80f6a20044200200d420010cc06200241c8136a200642002009420010cc06200241f8146a20074200200f420010cc06200241f8106a200542002010420010cc06200241e8126a200a42002003420010cc06200241a8106a200442002012420010cc0620024198146a20064200200e420010cc06200241c8156a200742002011420010cc06200241c8116a200542002014420010cc06200241a8036a20022903f806222a20022903e8037c220a20022903e8087c22042002290398087c220620022903c8077c2207200229038807222b2002290398057c220520022903f8087c221620022903a8087c221320022903d8077c221c200229039807222c20022903c8067c221d2002290388097c221e20022903b8087c221f20022903e8077c222120022903a807222d20022903d8067c22222002290398097c222320022903c8087c222420022903f8077c221720022903b807222e20022903e8067c221820022903a8097c221920022903d8087c221a2002290388087c221b423388200241b8076a41086a290300200241e8066a41086a2903007c2018202e54ad7c200241a8096a41086a2903007c2019201854ad7c200241d8086a41086a2903007c201a201954ad7c20024188086a41086a2903007c201b201a54ad7c420d86847c2218423388200241a8076a41086a290300200241d8066a41086a2903007c2022202d54ad7c20024198096a41086a2903007c2023202254ad7c200241c8086a41086a2903007c2024202354ad7c200241f8076a41086a2903007c2017202454ad7c2018201754ad7c420d86847c222242338820024198076a41086a290300200241c8066a41086a2903007c201d202c54ad7c20024188096a41086a2903007c201e201d54ad7c200241b8086a41086a2903007c201f201e54ad7c200241e8076a41086a2903007c2021201f54ad7c2022202154ad7c420d86847c221d42338820024188076a41086a29030020024198056a41086a2903007c2005202b54ad7c200241f8086a41086a2903007c2016200554ad7c200241a8086a41086a2903007c2013201654ad7c200241d8076a41086a2903007c201c201354ad7c201d201c54ad7c420d86847c221642ffffffffffffff038322054200200b420010cc06200241f8006a2016423388200241f8066a41086a290300200241e8036a41086a2903007c200a202a54ad7c200241e8086a41086a2903007c2004200a54ad7c20024198086a41086a2903007c2006200454ad7c200241c8076a41086a2903007c2007200654ad7c2016200754ad7c420d868442137e201b42ffffffffffffff03837c220442ffffffffffffff0383220a4200200e420010cc06200241d8046a201d42ffffffffffffff0383220742002015420010cc0620024188066a202242ffffffffffffff038322064200200c420010cc0620024198026a2004423388201842ffffffffffffff03837c220442002003420010cc0620024198036a200542002020420010cc0620024188016a20034200200a420010cc06200241c8046a20074200200b420010cc06200241f8056a200642002015420010cc06200241a8026a20044200200c420010cc06200241b8036a200542002015420010cc06200241e8006a200a42002011420010cc06200241e8046a20074200200c420010cc0620024198066a200642002003420010cc0620024188026a20044200200e420010cc06200241a8056a200d4200200642137e220b420010cc06200241e8026a200842002004420010cc0620024188046a20104200200742137e2216420010cc06200241286a200f4200200542137e2215420010cc06200241c8016a20094200200a420010cc06200241d8016a200a42002008420010cc06200241f8026a200d4200200442137e420010cc06200241b8056a20104200200b420010cc0620024198046a200f42002016420010cc06200241386a200942002015420010cc06200241c8056a200842002006420010cc06200241f8036a200d42002016420010cc06200241186a201042002015420010cc06200241b8016a200f4200200a420010cc06200241d8026a200942002004420010cc06200241c8036a20054200200c420010cc06200241d8006a200a42002014420010cc06200241f8046a200742002003420010cc06200241a8066a20064200200e420010cc06200241f8016a200442002011420010cc06200241a8046a200842002007420010cc06200241086a200d42002015420010cc06200241a8016a20104200200a420010cc06200241c8026a200f42002004420010cc06200241d8056a200942002006420010cc06200241d8036a200542002003420010cc06200241c8006a200a42002012420010cc0620024188056a20074200200e420010cc06200241b8066a200642002011420010cc06200241e8016a200442002014420010cc0620024188036a200842002005420010cc0620024198016a200d4200200a420010cc06200241b8026a201042002004420010cc06200241e8056a200f42002006420010cc06200241b8046a200942002007420010cc0620004188016a20022903b812221320022903f80f7c220320022903e8137c220a2002290398157c22042002290398117c220920022903c812220c2002290388107c220620022903f8137c220720022903a8157c220520022903a8117c220820022903d812220d2002290398107c220e2002290388147c220f20022903b8157c221020022903b8117c2211423388200241d8126a41086a29030020024198106a41086a2903007c200e200d54ad7c20024188146a41086a2903007c200f200e54ad7c200241b8156a41086a2903007c2010200f54ad7c200241b8116a41086a2903007c2011201054ad7c420d86847c220e423388200241c8126a41086a29030020024188106a41086a2903007c2006200c54ad7c200241f8136a41086a2903007c2007200654ad7c200241a8156a41086a2903007c2005200754ad7c200241a8116a41086a2903007c2008200554ad7c200e200854ad7c420d86847c220642ffffffffffffff03833703002000200229038813221c20022903c8107c220720022903b8147c220520022903e8157c220820022903e8117c220f200229039813221d20022903d8107c221020022903c8147c220c20022903f8157c220d20022903f8117c221420022903a813221e20022903e8107c221520022903d8147c22162002290388167c220b2002290388127c2212423388200241a8136a41086a290300200241e8106a41086a2903007c2015201e54ad7c200241d8146a41086a2903007c2016201554ad7c20024188166a41086a2903007c200b201654ad7c20024188126a41086a2903007c2012200b54ad7c420d86847c221542338820024198136a41086a290300200241d8106a41086a2903007c2010201d54ad7c200241c8146a41086a2903007c200c201054ad7c200241f8156a41086a2903007c200d200c54ad7c200241f8116a41086a2903007c2014200d54ad7c2015201454ad7c420d86847c221042ffffffffffffff038337031020004190016a20022903a812220b20022903e80f7c220c20022903d8137c220d2002290388157c22142002290388117c22162006423388200241b8126a41086a290300200241f80f6a41086a2903007c2003201354ad7c200241e8136a41086a2903007c200a200354ad7c20024198156a41086a2903007c2004200a54ad7c20024198116a41086a2903007c2009200454ad7c2006200954ad7c420d86847c220342ffffffffffffff0383370300200020022903f812221320022903b8107c220a20022903a8147c220420022903d8157c220920022903d8117c2206201042338820024188136a41086a290300200241c8106a41086a2903007c2007201c54ad7c200241b8146a41086a2903007c2005200754ad7c200241e8156a41086a2903007c2008200554ad7c200241e8116a41086a2903007c200f200854ad7c2010200f54ad7c420d86847c220742ffffffffffffff038337031820004198016a200229039812221c20022903d80f7c220520022903c8137c220820022903f8147c220f20022903f8107c22102003423388200241a8126a41086a290300200241e80f6a41086a2903007c200c200b54ad7c200241d8136a41086a2903007c200d200c54ad7c20024188156a41086a2903007c2014200d54ad7c20024188116a41086a2903007c2016201454ad7c2003201654ad7c420d86847c220342ffffffffffffff0383370300200020022903e812220b20022903a8107c220c2002290398147c220d20022903c8157c221420022903c8117c22162007423388200241f8126a41086a290300200241b8106a41086a2903007c200a201354ad7c200241a8146a41086a2903007c2004200a54ad7c200241d8156a41086a2903007c2009200454ad7c200241d8116a41086a2903007c2006200954ad7c2007200654ad7c420d86847c220a42ffffffffffffff03833703202000200342338820024198126a41086a290300200241d80f6a41086a2903007c2005201c54ad7c200241c8136a41086a2903007c2008200554ad7c200241f8146a41086a2903007c200f200854ad7c200241f8106a41086a2903007c2010200f54ad7c2003201054ad7c420d868442137e201142ffffffffffffff03837c220342ffffffffffffff03833703782000200a423388200241e8126a41086a290300200241a8106a41086a2903007c200c200b54ad7c20024198146a41086a2903007c200d200c54ad7c200241c8156a41086a2903007c2014200d54ad7c200241c8116a41086a2903007c2016201454ad7c200a201654ad7c420d868442137e201242ffffffffffffff03837c220a42ffffffffffffff038337030020004180016a2003423388200e42ffffffffffffff03837c3703002000200a423388201542ffffffffffffff03837c370308200041e0006a20022903b803221320022903687c220320022903e8047c220a2002290398067c22042002290388027c220920022903a803220c20022903787c220620022903d8047c22072002290388067c22052002290398027c2208200229039803220d2002290388017c220e20022903c8047c220f20022903f8057c221020022903a8027c221142338820024198036a41086a29030020024188016a41086a2903007c200e200d54ad7c200241c8046a41086a2903007c200f200e54ad7c200241f8056a41086a2903007c2010200f54ad7c200241a8026a41086a2903007c2011201054ad7c420d86847c220e423388200241a8036a41086a290300200241f8006a41086a2903007c2006200c54ad7c200241d8046a41086a2903007c2007200654ad7c20024188066a41086a2903007c2005200754ad7c20024198026a41086a2903007c2008200554ad7c200e200854ad7c420d86847c220642ffffffffffffff0383370300200041386a20022903f803221c20022903c8057c220720022903187c220520022903b8017c220820022903d8027c220f20022903a805221d20022903e8027c22102002290388047c220c20022903287c220d20022903c8017c221420022903f802221e20022903d8017c221520022903b8057c22162002290398047c220b20022903387c2212423388200241f8026a41086a290300200241d8016a41086a2903007c2015201e54ad7c200241b8056a41086a2903007c2016201554ad7c20024198046a41086a2903007c200b201654ad7c200241386a41086a2903007c2012200b54ad7c420d86847c2215423388200241a8056a41086a290300200241e8026a41086a2903007c2010201d54ad7c20024188046a41086a2903007c200c201054ad7c200241286a41086a2903007c200d200c54ad7c200241c8016a41086a2903007c2014200d54ad7c2015201454ad7c420d86847c221042ffffffffffffff0383370300200041e8006a20022903c803220b20022903587c220c20022903f8047c220d20022903a8067c221420022903f8017c22162006423388200241b8036a41086a290300200241e8006a41086a2903007c2003201354ad7c200241e8046a41086a2903007c200a200354ad7c20024198066a41086a2903007c2004200a54ad7c20024188026a41086a2903007c2009200454ad7c2006200954ad7c420d86847c220342ffffffffffffff0383370300200041c0006a2002290308221320022903a8047c220a20022903a8017c220420022903c8027c220920022903d8057c22062010423388200241f8036a41086a290300200241c8056a41086a2903007c2007201c54ad7c200241186a41086a2903007c2005200754ad7c200241b8016a41086a2903007c2008200554ad7c200241d8026a41086a2903007c200f200854ad7c2010200f54ad7c420d86847c220742ffffffffffffff0383370300200041f0006a20022903d803221c20022903487c22052002290388057c220820022903b8067c220f20022903e8017c22102003423388200241c8036a41086a290300200241d8006a41086a2903007c200c200b54ad7c200241f8046a41086a2903007c200d200c54ad7c200241a8066a41086a2903007c2014200d54ad7c200241f8016a41086a2903007c2016201454ad7c2003201654ad7c420d86847c220342ffffffffffffff0383370300200041c8006a200229039801220b2002290388037c220c20022903b8027c220d20022903e8057c221420022903b8047c22162007423388200241086a41086a290300200241a8046a41086a2903007c200a201354ad7c200241a8016a41086a2903007c2004200a54ad7c200241c8026a41086a2903007c2009200454ad7c200241d8056a41086a2903007c2006200954ad7c2007200654ad7c420d86847c220a42ffffffffffffff038337030020002003423388200241d8036a41086a290300200241c8006a41086a2903007c2005201c54ad7c20024188056a41086a2903007c2008200554ad7c200241b8066a41086a2903007c200f200854ad7c200241e8016a41086a2903007c2010200f54ad7c2003201054ad7c420d868442137e201142ffffffffffffff03837c220342ffffffffffffff0383370350200041d8006a2003423388200e42ffffffffffffff03837c3703002000200a42338820024198016a41086a29030020024188036a41086a2903007c200c200b54ad7c200241b8026a41086a2903007c200d200c54ad7c200241e8056a41086a2903007c2014200d54ad7c200241b8046a41086a2903007c2016201454ad7c200a201654ad7c420d868442137e201242ffffffffffffff03837c220342ffffffffffffff0383370328200041306a2003423388201542ffffffffffffff03837c370300200241f02b6a24000bbf2004047f017e027f1c7e23004190066b220224000240024020012c001f4100480d0020024180056a41186a2203200141186a29000037030020024180056a41106a2204200141106a29000037030020024180056a41086a2205200141086a29000037030020022001290000220637038005200220022d009f0541ff00713a009f05200241c0056a41186a22074200370300200241c0056a41106a22084200370300200241c0056a41086a220142003703002002200231008205421086200231008105420886200642ff0183848422063703c005200220023100830542188620068422063703c005200220023100840542208620068422063703c005200220023100850542288620068422063703c005200220023100860542308620068422063703c00520022002310087054238862006843703c005200120012903002005310000842206370300200120023100890542088620068422063703002001200231008a0542108620068422063703002001200231008b0542188620068422063703002001200231008c0542208620068422063703002001200231008d0542288620068422063703002001200231008e0542308620068422063703002001200231008f0542388620068437030020082008290300200431000084220637030020082002310091054208862006842206370300200820023100920542108620068422063703002008200231009305421886200684220637030020082002310094054220862006842206370300200820023100950542288620068422063703002008200231009605423086200684220637030020082002310097054238862006842209370300200720072903002003310000842206370300200720023100990542088620068422063703002007200231009a0542108620068422063703002007200231009b0542188620068422063703002007200231009c0542208620068422063703002007200231009d0542288620068422063703002007200231009e0542308620068422063703002007200231009f05423886200684220a37030020024180036a20022903c005220b42ffffffffffffff07832206420042edcd87b9d697d207420010cc06200241f0026a200229038003220c429bfcd192b1b4c7027e42ffffffffffffff0783220d420042eda7d7e7a5e39801420010cc06200241c0026a2006420042dac89fe3dad6ee01420010cc0620024180026a2001290300220e420c864280e0ffffffffff0783200b42348884220b420042edcd87b9d697d207420010cc06200241e0026a200d42004281cbb5cef7c5fa06420010cc06200241f0016a200229038002220f20022903c0027c2210200c20022903f00222117c220c423488200241f0026a41086a29030020024180036a41086a2903007c200c201154ad7c2212420c86847c221120022903e0027c2213429bfcd192b1b4c7027e42ffffffffffffff0783220c420042eda7d7e7a5e39801420010cc06200241b0026a20064200429bcad7d9feffff07420010cc06200241c0016a200b420042dac89fe3dad6ee01420010cc06200241d0036a200942188642808080f8ffffff0783200e42288884220e420042edcd87b9d697d207420010cc06200241d0026a200d420042f9bdd300420010cc06200241e0016a200c42004281cbb5cef7c5fa06420010cc06200241b0016a20022903c001221420022903b0027c221520022903d0037c221620022903d0027c221720022903e0017c221820022903f001221920137c221a423488200241f0016a41086a29030020024180026a41086a290300200241c0026a41086a2903007c2010200f54ad7c20124234887c2011201054ad7c200241e0026a41086a2903007c2013201154ad7c7c201a201954ad7c221b420c86847c2211429bfcd192b1b4c7027e42ffffffffffffff07832210420042eda7d7e7a5e39801420010cc06200241a0026a2006420042ffffffffffffff07420010cc0620024180016a200b4200429bcad7d9feffff07420010cc06200241c0036a200e420042dac89fe3dad6ee01420010cc06200241a0046a200a422486428080808080feff07832009421c88842209420042edcd87b9d697d207420010cc06200241d0016a200c420042f9bdd300420010cc06200241a0016a201042004281cbb5cef7c5fa06420010cc06200241f0006a200229038001221c20022903a0027c221320022903c0037c220f20022903a0047c221220022903d0017c221920022903a0017c221a20022903b001221d20117c221e423488200241b0016a41086a290300200241c0016a41086a290300200241b0026a41086a2903007c2015201454ad7c200241d0036a41086a2903007c2016201554ad7c200241d0026a41086a2903007c2017201654ad7c200241e0016a41086a2903007c2018201754ad7c201b4234887c2011201854ad7c7c201e201d54ad7c221f420c86847c2215429bfcd192b1b4c7027e42ffffffffffffff07832211420042eda7d7e7a5e39801420010cc0620024190026a2006420042ffffffffffff03420010cc06200241c0006a200b420042ffffffffffffff07420010cc06200241b0036a200e4200429bcad7d9feffff07420010cc0620024190046a2009420042dac89fe3dad6ee01420010cc06200241f0046a200a4210882206420042edcd87b9d697d207420010cc0620024190016a2010420042f9bdd300420010cc06200241e0006a201142004281cbb5cef7c5fa06420010cc06200241306a200229034022202002290390027c221620022903b0037c22172002290390047c221820022903f0047c2214200d422c867c221b2002290390017c221d20022903607c221e2002290370220a20157c2221423488200241f0006a41086a29030020024180016a41086a290300200241a0026a41086a2903007c2013201c54ad7c200241c0036a41086a2903007c200f201354ad7c200241a0046a41086a2903007c2012200f54ad7c200241d0016a41086a2903007c2019201254ad7c200241a0016a41086a2903007c201a201954ad7c201f4234887c2015201a54ad7c7c2021200a54ad7c221f420c86847c2213429bfcd192b1b4c7027e42ffffffffffffff0783220a420042eda7d7e7a5e39801420010cc06200241a0036a200e420042ffffffffffffff07420010cc062002200b420042ffffffffffff03420010cc0620024180046a20094200429bcad7d9feffff07420010cc06200241e0046a2006420042dac89fe3dad6ee01420010cc06200241d0006a2011420042f9bdd300420010cc06200241206a200a42004281cbb5cef7c5fa06420010cc06200241f0036a2009420042ffffffffffffff07420010cc0620024190036a200e420042ffffffffffff03420010cc06200241d0046a20064200429bcad7d9feffff07420010cc06200241106a200a420042f9bdd300420010cc06200241c0046a2006420042ffffffffffffff07420010cc06200241e0036a2009420042ffffffffffff03420010cc06200241b0046a2006420042ffffffffffff03420010cc06200120022903f00322212002290390037c220620022903d0047c220b2010422c867c220e20022903107c220920022903a003222220022903007c22152002290380047c220f20022903e0047c2212200c422c867c221920022903507c221a20022903207c221c2002290330222320137c2224423488200241306a41086a290300200241c0006a41086a29030020024190026a41086a2903007c2016202054ad7c200241b0036a41086a2903007c2017201654ad7c20024190046a41086a2903007c2018201754ad7c200241f0046a41086a2903007c2014201854ad7c200d4214887c201b201454ad7c20024190016a41086a2903007c201d201b54ad7c200241e0006a41086a2903007c201e201d54ad7c201f4234887c2013201e54ad7c7c2024202354ad7c2213420c86847c220d423488200241a0036a41086a290300200241086a2903007c2015202254ad7c20024180046a41086a2903007c200f201554ad7c200241e0046a41086a2903007c2012200f54ad7c200c4214887c2019201254ad7c200241d0006a41086a2903007c201a201954ad7c200241206a41086a2903007c201c201a54ad7c20134234887c200d201c54ad7c2216420c86847c220c42ffffffffffffff0783200d42ffffffffffffff07834293d8a898da9ce77e7c220d423f877c42ffb4cab188ba85797c221742ffffffffffffff0783200d42ffffffffffffff0783200a422c86221820022903b0047c220d20022903c004220f20022903e0037c22132011422c867c2215200c423488200241f0036a41086a29030020024190036a41086a2903007c2006202154ad7c200241d0046a41086a2903007c200b200654ad7c20104214887c200e200b54ad7c200241106a41086a2903007c2009200e54ad7c20164234887c200c200954ad7c220b420c86847c2206423488200241c0046a41086a290300200241e0036a41086a2903007c2013200f54ad7c20114214887c2015201354ad7c200b4234887c2006201554ad7c220c420c86847c220b423488200a421488200241b0046a41086a2903007c200d201854ad7c200c4234887c200b200d54ad7c420c8684200b42ffffffffffffff0783200642ffffffffffffff07832017423f877c4287c2ac7f7c220b423f877c220c423f877c428080808080807c7c2210423f87220e42eda7d7e7a5e39801837c22064234887c200e4281cbb5cef7c5fa06837c220d42ffffffffffffff078322093703002008200b42ffffffffffffff0783200d4234887c200e42f9bdd300837c220b42ffffffffffffff078322113703002007200c42ffffffffffffff0783200b4234887c220c42ffffffffffffff0783220a370300200241c0056a41206a201042ffffffffffffff0783200c4234887c200e4280808080808004837c220e42ffffffffffffff07833703002002200642ffffffffffffff078322103703c0052002200e4228883c00bf052002200e4220883c00be052002200e4218883c00bd052002200e4210883c00bc052002200e4208883c00bb052002200e3c00ba052002200c422c883c00b9052002200c4224883c00b8052002200c421c883c00b7052002200c4214883c00b6052002200c420c883c00b5052002200c4204883c00b4052002200a4204862011423088843c00b3052002200b4228883c00b2052002200b4220883c00b1052002200b4218883c00b0052002200b4210883c00af052002200b4208883c00ae052002200b3c00ad052002200d422c883c00ac052002200d4224883c00ab052002200d421c883c00aa052002200d4214883c00a9052002200d420c883c00a8052002200d4204883c00a705200220094204862010423088843c00a605200220064228883c00a505200220064220883c00a405200220064218883c00a305200220064210883c00a205200220064208883c00a105200220063c00a00541002101410121070340200241a0056a20016a2d000020024180056a20016a2d0000732208410020086b72417f734180017141077610662007712107200141016a22014120470d000b4100210102402007106641ff01714101470d002000200229038005370001200041196a20024198056a290300370000200041116a20024190056a290300370000200041096a20024188056a290300370000410121010b200020013a00000c010b200041003a00000b20024190066a24000bb60601067f20012002106c02402001450d00200141d8006c2103410021040340200020046a220541046a2802002106200541086a28020022072002106c2002200241086a22012802002007106d2002280200200128020022086a2006200710cf061a2001200820076a2207360200200541d4006a2d00002106200220074101106d2002280200200128020022076a20064101463a00002001200741016a220636020002402005410c6a2d0000220741024b0d0002400240024020070e03000102000b200220064101106d2002280200200128020022076a41003a00002001200741016a360200200541146a2802002106200541186a28020022072002106c200220012802002007106d2002280200200128020022086a2006200710cf061a2001200820076a3602000c020b200220064101106d2002280200200128020022076a41013a00002001200741016a36020020022005410d6a2d0000106e200541146a2802002106200541186a28020022072002106c200220012802002007106d2002280200200128020022086a2006200710cf061a2001200820076a360200200541206a2802002106200541246a28020022072002106c200220012802002007106d2002280200200128020022086a2006200710cf061a2001200820076a22073602002005410e6a2d00002106200220074101106d2002280200200128020022076a20063a00002001200741016a3602000c010b200220064101106d2002280200200128020022076a41023a00002001200741016a36020020022005410d6a2d0000106e200541146a2802002106200541186a28020022072002106c200220012802002007106d2002280200200128020022086a2006200710cf061a2001200820076a360200200541206a2802002106200541246a28020022072002106c200220012802002007106d2002280200200128020022086a2006200710cf061a2001200820076a3602002005412c6a2802002106200541306a28020022072002106c200220012802002007106d2002280200200128020022086a2006200710cf061a2001200820076a36020020022005410e6a2d0000106e0b2002200541346a106f2002200541c4006a10702003200441d8006a2204470d000b0b0b910201027f024002400240200041c000490d00200041808001490d012000418080808004490d022001200141086a22022802004101106d2001280200200228020022036a41033a00002002200341016a2203360200200120034104106d2001280200200228020022016a20003600002002200141046a3602000f0b2001200141086a22022802004101106d2001280200200228020022016a20004102743a00002002200141016a3602000f0b2001200141086a22022802004102106d2001280200200228020022016a20004102744101723b00002002200141026a3602000f0b2001200141086a22022802004104106d2001280200200228020022016a20004102744102723600002002200141046a3602000b9a0101017f0240200041046a280200220320016b20024f0d000240024002400240200120026a22022001490d00200341017422012002200120024b1b22014108200141084b1b22014100480d002000280200410020031b2202450d0120032001460d032003450d0120022003200110282202450d020c030b102e000b2001102422020d010b102c000b20002002360200200041046a20013602000b0bed02000240200141ff0171220141064b0d00024002400240024002400240024020010e0700010203040506000b2000200041086a22012802004101106d2000280200200128020022006a41003a00002001200041016a3602000f0b2000200041086a22012802004101106d2000280200200128020022006a41013a00002001200041016a3602000f0b2000200041086a22012802004101106d2000280200200128020022006a41023a00002001200041016a3602000f0b2000200041086a22012802004101106d2000280200200128020022006a41033a00002001200041016a3602000f0b2000200041086a22012802004101106d2000280200200128020022006a41043a00002001200041016a3602000f0b2000200041086a22012802004101106d2000280200200128020022006a41053a00002001200041016a3602000f0b2000200041086a22012802004101106d2000280200200128020022006a41063a00002001200041016a3602000b0bcc0101037f230041106b220224000240024020012802004101470d00200128020421032001410c6a28020022012000106c2000200041086a22042802002001106d2000280200200428020022006a2003200110cf061a2004200020016a3602000c010b20022001280204200141086a28020028020c11020020022802002103200228020822012000106c2000200041086a22042802002001106d2000280200200428020022006a2003200110cf061a2004200020016a3602002002280204450d00200310260b200241106a24000b810201057f200128020421020240024020012802004101470d002001410c6a28020022012000106c20014103742201450d01200220016a2103034020022802002104200241046a28020022012000106c2000200041086a22052802002001106d2000280200200528020022066a2004200110cf061a2005200620016a360200200241086a22022003470d000c020b0b200141086a28020022012000106c20014103742201450d00200220016a2103034020022802002104200241046a28020022012000106c2000200041086a22052802002001106d2000280200200528020022066a2004200110cf061a2005200620016a360200200241086a22022003470d000b0b0bae1001097f230041c0006b2203240020012002106c02402001450d002000200141ec006c6a2104200241086a21010340200022052802042106200528020822072002106c200220012802002007106d2002280200200128020022086a2006200710cf061a2001200820076a2207360200200528020c2106200220074101106d2002280200200128020022076a21080240024020064102470d00200841003a00002001200741016a3602000c010b200841013a00002001200741016a3602000240200528020c4101470d0020052802142106200528021822072002106c200220012802002007106d2002280200200128020022086a2006200710cf061a2001200820076a360200200528022021070240200528021c4101470d00200720052802282002106b0c020b2007200541246a2802002002106b0c010b200341206a200528021011030020032802242106200328022822072002106c200220012802002007106d2002280200200128020022086a2006200710cf061a2001200820076a360200200328023021080240200328022c4101460d00200820032802342002106b0c010b200820032802382002106b024020032802382207450d00200741d8006c21094100210603400240200820066a220741346a280200450d002007413c6a280200450d00200741386a28020010260b0240200741c4006a280200450d00200741cc006a28020041ffffffff0171450d00200741c8006a28020010260b2009200641d8006a2206470d000b0b20032802342207450d00200741d8006c450d00200810260b200528022c2107200220012802004101106d2002280200200128020022066a21080240024020074102470d00200841003a00002001200641016a3602000c010b200841013a00002001200641016a3602000240200528022c4101470d0020052802302106200528023822072002106c2007450d012007412c6c21082006411c6a21070340200741686a28020021092007416c6a28020022062002106c200220012802002006106d20022802002001280200220a6a2009200610cf061a2001200a20066a3602002002200741706a10722002200710702007412c6a2107200841546a22080d000c020b0b200341186a200528023011030020032802182106200328021c22072002106c2007450d002007412c6c21082006411c6a21070340200741686a28020021092007416c6a28020022062002106c200220012802002006106d20022802002001280200220a6a2009200610cf061a2001200a20066a3602002002200741706a10722002200710702007412c6a2107200841546a22080d000b0b200528023c2107200220012802004101106d2002280200200128020022066a21080240024020074102470d00200841003a00002001200641016a3602000c010b200841013a00002001200641016a3602000240200528023c4101470d0020052802402106200528024822072002106c2007450d012007412c6c21082006411c6a21070340200741686a28020021092007416c6a28020022062002106c200220012802002006106d20022802002001280200220a6a2009200610cf061a2001200a20066a3602002002200741706a10702002200710702007412c6a2107200841546a22080d000c020b0b200341106a200528024011030020032802102106200328021422072002106c2007450d002007412c6c21082006411c6a21070340200741686a28020021092007416c6a28020022062002106c200220012802002006106d20022802002001280200220a6a2009200610cf061a2001200a20066a3602002002200741706a10702002200710702007412c6a2107200841546a22080d000b0b02400240200528024c4101470d0020052802502100200528025822072002106c2007450d01200741386c210b410021080340200020086a220741046a2802002109200741086a28020022062002106c200220012802002006106d20022802002001280200220a6a2009200610cf061a2001200a20066a360200200741106a2802002109200741146a28020022062002106c200220012802002006106d20022802002001280200220a6a2009200610cf061a2001200a20066a3602002002200741186a106f2002200741286a1070200b200841386a2208470d000c020b0b200341086a200528025011030020032802082100200328020c22072002106c2007450d00200741386c210b410021080340200020086a220741046a2802002109200741086a28020022062002106c200220012802002006106d20022802002001280200220a6a2009200610cf061a2001200a20066a360200200741106a2802002109200741146a28020022062002106c200220012802002006106d20022802002001280200220a6a2009200610cf061a2001200a20066a3602002002200741186a106f2002200741286a1070200b200841386a2208470d000b0b200541ec006a210002400240200528025c4101470d0020052802602106200528026822072002106c2007450d012007411c6c2108200641086a210703402007417c6a2802002109200728020022062002106c200220012802002006106d20022802002001280200220a6a2009200610cf061a2001200a20066a3602002002200741046a10702007411c6a2107200841646a22080d000c020b0b2003200528026011030020032802002106200328020422072002106c2007450d002007411c6c2108200641086a210703402007417c6a2802002109200728020022062002106c200220012802002006106d20022802002001280200220a6a2009200610cf061a2001200a20066a3602002002200741046a10702007411c6a2107200841646a22080d000b0b20002004470d000b0b200341c0006a24000b950301057f200128020421020240024020012802004101470d002001410c6a28020022012000106c2001450d01200141186c2103200241146a2101200041086a21020340200141706a2802002104200141746a28020022052000106c200020022802002005106d2000280200200228020022066a2004200510cf061a2002200620056a3602002001417c6a2802002104200128020022052000106c200020022802002005106d2000280200200228020022066a2004200510cf061a2002200620056a360200200141186a2101200341686a22030d000c020b0b200141086a28020022012000106c2001450d00200141186c2103200241146a2101200041086a21020340200141706a2802002104200141746a28020022052000106c200020022802002005106d2000280200200228020022066a2004200510cf061a2002200620056a3602002001417c6a2802002104200128020022052000106c200020022802002005106d2000280200200228020022066a2004200510cf061a2002200620056a360200200141186a2101200341686a22030d000b0b0ba504010a7f20004201370200200041086a41003602002001410c6a28020021022001280208210320012802042104024002400240200128020022050d00200220036b410020031b21010c010b200420056b2106024020030d00200621010c010b2006200220036b6a220120064f0d000240024020042005460d00200541016a21010c010b2003450d0220022003460d024100210120032105200341016a21030b200041086a2107200041046a2108410121094100210a41002106034020052d0000210b02402006200a470d000240024020010d00200220036b410020031b21050c010b200420016b21052003450d00417f2005200220036b6a220920092005491b21050b2000200a417f200541016a220920092005491b106d200028020021090b200920066a200b3a00002007200641016a2206360200024002400240024020010d002001210b0c010b20012004470d014100210b0b2003450d0420032002460d0420032105200341016a21030c010b200141016a210b200121050b2008280200210a200b21010c000b0b200041002001106d2000280200200041086a28020022066a210102402005450d0020042005460d002004200620056b6a21060340200120052d00003a0000200141016a21012004200541016a2205470d000b0b02402003450d0020022003460d00200620036b21050340200120032d00003a0000200141016a21012002200341016a2203470d000b200220056a21060b200041086a20063602000b0b3a01017f20002802002200200041086a22032802002002106d2000280200200328020022006a2001200210cf061a2003200020026a36020041000b6301017f230041206b2202240020022000280200360204200241086a41106a200141106a290200370300200241086a41086a200141086a29020037030020022001290200370308200241046a41949fc000200241086a10352101200241206a240020010b040041010be90101027f230041c0006b2202240020024100360210200242013703082002410836021c20022001410c6a3602202002200241206a3602182002200241086a3602242002413c6a41013602002002420137022c200241d0adc7003602282002200241186a360238200241246a41949fc000200241286a10351a41052103024002400240024002402001280200417f6a0e050001020304000b410121030c030b410221030c020b410321030c010b410421030b2003200141046a280200200141086a2802002002280208200228021010790240200228020c450d00200228020810260b200241c0006a24000b6901037f230041206b220224002001411c6a280200210320012802182104200241086a41106a2000280200220141106a290200370300200241086a41086a200141086a2902003703002002200129020037030820042003200241086a10352101200241206a240020010b5601017f4104210502400240024002400240200041ff0171417f6a0e050001020304000b410021050c030b410121050c020b410221050c010b410321050b20052002ad4220862001ad842004ad4220862003ad8410230ba90803197e017f147e20002903c0012101200029039801210220002903702103200029034821042000290320210520002903b8012106200029039001210720002903682108200029034021092000290318210a20002903b001210b200029038801210c2000290360210d2000290338210e2000290310210f20002903a8012110200029038001211120002903582112200029033021132000290308211420002903a00121152000290378211620002903502117200029032821182000290300211941c07e211a0340200b200c200d200e200f85858585221b4201892015201620172018201985858585221c85221d201385211e20012006200720082009200a85858585221f201c42018985221c85212020012002200320042005858585852221420189201b85221b2009854237892222201f4201892010201120122013201485858585220985221f200f85423e892223427f8583201d201085420289222485210120222021200942018985220f20168542298922212003201c854227892225427f8583852110201b2006854238892226201f200c85420f892227427f8583201d201285420a89222885210c2028200f2018854224892229427f85832005201c85421b89222a852116200f2015854212892215201f200e85420689222b201d201485420189222c427f85838521032002201c85420889222d201b200885421989222e427f8583202b8521122004201c85421489221c201b200a85421c89220a427f8583201f200b85423d89220e852104200a200e427f8583201d201185422d89221d852109200f2017854203892214200e201d427f858385210e201d2014427f8583201c852113200a2014201c427f8583852118201b200785421589221d200f201985221c2020420e89221b427f858385210a201b201d427f8583201f200d85422b89221f85210f201d201f427f8583201e422c89221d852114201a4198a1c0006a290300201c201f201d427f85838585211920262029202a427f858385221f2102201d201c427f8583201b85221d2105202120232024427f858385221c2106202a2026427f8583202785221b2107202c2015427f8583202d852226210820242021427f85832025852224210b202e2015202d427f8583852221210d202920272028427f8583852227211120252022427f858320238522222115202e202b427f8583202c8522232117201a41086a221a0d000b200020223703a00120002016370378200020233703502000201837032820002019370300200020103703a8012000202737038001200020123703582000201337033020002014370308200020243703b0012000200c37038801200020213703602000200e3703382000200f3703102000201c3703b8012000201b3703900120002026370368200020093703402000200a370318200020013703c0012000201f3703980120002003370370200020043703482000201d3703200b040041000b02000b02000bb80701027f230041f0006b22032400200320013a000b02400240024002400240024002400240024020020d002003200141087122023a000c20020d03200020013a00ca0120002d00c9012104200020002d00c801220241016a3a00c901200320013a0059200320043a0058200241c7014b0d02200020026a220120012d000020032d0058733a0000200020002d00c80141016a22023a00c801200241ff0171220141a601470d01200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a7012000107a41002102200041003b01c8010c050b20002d00ca01200141ff0171470d030c050b200141c801490d030b200241ff017141c80141dca1c0001032000b200341386a41146a4109360200200341c4006a410a360200200341206a41146a410336020020032003410c6a360254200341bd80c700360210200341d8006a41146a410036020020034203370224200341d4c0c7003602202003410a36023c200341d4c0c7003602682003420137025c200341a4a3c0003602582003200341386a3602302003200341d8006a3602482003200341106a3602402003200341d4006a360238200341206a41aca3c000103d000b200341386a41146a4109360200200341386a410c6a410a3602002003200041ca016a220036020c20032003410b6a360254200341d8006a41146a4102360200200341d8006a410c6a4102360200200341106a410c6a410b3602002003410a36023c200341d4a2c0003602602003410236025c200341c4a2c0003602582003410b360214200320003602102003200341d8006a3602482003200341d4006a36024020032003410c6a3602382003200341106a36026820032003410b6a360218200341206a41146a410336020020034203370224200341d4c0c7003602202003200341386a360230200341206a4194a3c000103d000b2000200241ff01716a220120012d000020032d0059733a0000200020002d00c80141016a22013a00c8010240200141ff017141a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a7012000107a41002101200041003b01c8010b20032d000b412471450d00200141ff01712201450d00200141c7014b0d01200020016a220120012d000020002d00c901733a000020002d00c80141016a41ff0171220141c8014f0d02200020016a220120012d00004104733a0000200020002d00a701418001733a00a7012000107a200041003b01c8010b200341f0006a24000f0b200141c80141bca3c0001032000b200141c80141cca3c0001032000bc40201037f23004180016b220224002000280200210002400240024002400240200128020022034110710d0020002d0000210420034120710d012004ad42ff01832001104221000c020b20002d00002104410021000340200220006a41ff006a2004410f712203413072200341d7006a2003410a491b3a00002000417f6a21002004410476410f7122040d000b20004180016a22044181014f0d02200141e889c0004102200220006a4180016a410020006b104521000c010b410021000340200220006a41ff006a2004410f712203413072200341376a2003410a491b3a00002000417f6a21002004410476410f7122040d000b20004180016a22044181014f0d02200141e889c0004102200220006a4180016a410020006b104521000b20024180016a240020000f0b200441800141d889c0001048000b200441800141d889c0001048000bc81901037f230041a0026b22032400200341086a41126a410041b60110d1061a200341166a41002800d6a140360100200341002f00cca1403b010c200341002800c8a140360208200341002900cea14037010e200341086a107a2000200341086a41c80110cf06220041003a00ca01200041003b01c801200041124100107e024020002d00c801220441c7014b0d00200020046a220420042d000041cd00733a0000200020002d00c80141016a22043a00c80102400240200441ff0171220441a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a7012000107a41002104200041003b01c8010c010b200441c8014f0d010b200020046a220420042d000041e500733a0000200020002d00c80141016a22043a00c80102400240200441ff0171220441a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a7012000107a41002104200041003b01c8010c010b200441c7014b0d010b200020046a220420042d000041f200733a0000200020002d00c80141016a22043a00c80102400240200441ff0171220441a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a7012000107a41002104200041003b01c8010c010b200441c7014b0d010b200020046a220420042d000041ec00733a0000200020002d00c80141016a22043a00c80102400240200441ff0171220441a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a7012000107a41002104200041003b01c8010c010b200441c7014b0d010b200020046a220420042d000041e900733a0000200020002d00c80141016a22043a00c80102400240200441ff0171220441a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a7012000107a41002104200041003b01c8010c010b200441c7014b0d010b200020046a220420042d000041ee00733a0000200020002d00c80141016a22043a00c80102400240200441ff0171220441a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a7012000107a41002104200041003b01c8010c010b200441c7014b0d010b200020046a220420042d00004120733a0000200020002d00c80141016a22043a00c80102400240200441ff0171220441a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a7012000107a41002104200041003b01c8010c010b200441c7014b0d010b200020046a220420042d000041f600733a0000200020002d00c80141016a22043a00c80102400240200441ff0171220441a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a7012000107a41002104200041003b01c8010c010b200441c7014b0d010b200020046a220420042d00004131733a0000200020002d00c80141016a22043a00c80102400240200441ff0171220441a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a7012000107a41002104200041003b01c8010c010b200441c7014b0d010b200020046a220420042d0000412e733a0000200020002d00c80141016a22043a00c80102400240200441ff0171220441a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a7012000107a41002104200041003b01c8010c010b200441c7014b0d010b200020046a220420042d00004130733a0000200020002d00c80141016a22043a00c8010240200441ff017141a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a7012000107a200041003b01c8010b20032002360204200041124100107e024020002d00c801220441c8014f0d00200020046a220420042d000041e400733a0000200020002d00c80141016a22043a00c80102400240200441ff0171220541a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a7012000107a41002104200041003b01c8010c010b200541c8014f0d010b2000200441ff01716a220420042d000041ef00733a0000200020002d00c80141016a22043a00c80102400240200441ff0171220541a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a7012000107a41002104200041003b01c8010c010b200541c7014b0d010b2000200441ff01716a220420042d000041ed00733a0000200020002d00c80141016a22043a00c80102400240200441ff0171220541a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a7012000107a41002104200041003b01c8010c010b200541c7014b0d010b2000200441ff01716a220420042d0000412d733a0000200020002d00c80141016a22043a00c80102400240200441ff0171220541a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a7012000107a41002104200041003b01c8010c010b200541c7014b0d010b2000200441ff01716a220420042d000041f300733a0000200020002d00c80141016a22043a00c80102400240200441ff0171220541a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a7012000107a41002104200041003b01c8010c010b200541c7014b0d010b2000200441ff01716a220420042d000041e500733a0000200020002d00c80141016a22043a00c80102400240200441ff0171220541a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a7012000107a41002104200041003b01c8010c010b200541c7014b0d010b200041ca016a21052000200441ff01716a220420042d000041f000733a0000200020002d00c80141016a22043a00c8010240200441ff017141a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a7012000107a41002104200041003b01c8010b200341123a00d701024020052d00004112460d00200341f0016a41146a4109360200200341f0016a410c6a410a36020020032005360288022003200341d7016a36028c02200341086a41146a4102360200200341086a410c6a410236020020034190026a410c6a410b3602002003410a3602f401200341d4a2c0003602102003410236020c200341c4a2c0003602082003410b3602940220032005360290022003200341086a3602800220032003418c026a3602f801200320034188026a3602f001200320034190026a3602182003200341d7016a36029802200341d8016a41146a4103360200200342033702dc01200341d4c0c7003602d8012003200341f0016a3602e801200341d8016a4194a3c000103d000b0240200441ff0171220541c7014b0d00200020056a220420042d000020032d0004733a0000200020002d00c80141016a22043a00c80102400240200441ff017141a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a7012000107a41002104200041003b01c8010c010b200441ff017141c8014f0d010b2000200441ff01716a220420042d000020032d0005733a0000200020002d00c80141016a22043a00c80102400240200441ff0171220541a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a7012000107a41002104200041003b01c8010c010b200541c7014b0d010b2000200441ff01716a220420042d000020032d0006733a0000200020002d00c80141016a22043a00c80102400240200441ff0171220541a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a7012000107a41002104200041003b01c8010c010b200541c7014b0d010b2000200441ff01716a220420042d000020032d0007733a0000200020002d00c80141016a22043a00c8010240200441ff017141a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a7012000107a200041003b01c8010b200041024100107e024002402002450d0020002d00c80121040340200441ff0171220441c7014b0d02200020046a220420042d000020012d0000733a0000200020002d00c80141016a22043a00c8010240200441ff017141a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a7012000107a41002104200041003b01c8010b200141016a21012002417f6a22020d000b0b200341a0026a24000f0b200441c80141dca1c0001032000b200441ff017141c80141dca1c0001032000b200441ff017141c80141dca1c0001032000b200441c80141dca1c0001032000b840901027f230041f0006b2205240020052004360208200041124100107e024002400240024002402002450d0020002d00c80121060340200641ff0171220641c7014b0d02200020066a220620062d000020012d0000733a0000200020002d00c80141016a22063a00c8010240200641ff017141a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a7012000107a41002106200041003b01c8010b200141016a21012002417f6a22020d000b0b200541123a000f20002d00ca014112470d0120002d00c801220641c7014b0d03200020066a220620062d000020052d0008733a0000200020002d00c80141016a22063a00c8010240200641ff0171220141a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a7012000107a41002106200041003b01c8010c030b200141c801490d020c030b200641c80141dca1c0001032000b200541286a41146a4109360200200541286a410c6a410a3602002005200041ca016a220036024020052005410f6a360244200541c8006a41146a4102360200200541c8006a410c6a4102360200200541e0006a410c6a410b3602002005410a36022c200541d4a2c0003602502005410236024c200541c4a2c0003602482005410b360264200520003602602005200541c8006a3602382005200541c4006a3602302005200541c0006a3602282005200541e0006a36025820052005410f6a360268200541106a41146a410336020020054203370214200541d4c0c7003602102005200541286a360220200541106a4194a3c000103d000b2000200641ff01716a220620062d000020052d0009733a0000200020002d00c80141016a22063a00c80102400240200641ff0171220141a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a7012000107a41002106200041003b01c8010c010b200141c7014b0d010b2000200641ff01716a220620062d000020052d000a733a0000200020002d00c80141016a22063a00c80102400240200641ff0171220141a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a7012000107a41002106200041003b01c8010c010b200141c7014b0d010b2000200641ff01716a220620062d000020052d000b733a0000200020002d00c80141016a22063a00c8010240200641ff017141a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a7012000107a200041003b01c8010b200041024100107e024002402004450d0020002d00c80121060340200641ff0171220641c7014b0d02200020066a220620062d000020032d0000733a0000200020002d00c80141016a22063a00c8010240200641ff017141a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a7012000107a41002106200041003b01c8010b200341016a21032004417f6a22040d000b0b200541f0006a24000f0b200641c80141dca1c0001032000b200641ff017141c80141dca1c0001032000bc50f01027f230041f0006b220424002004200337030020044108360208200041124100107e024002400240024002402002450d0020002d00c80121050340200541ff0171220541c7014b0d02200020056a220520052d000020012d0000733a0000200020002d00c80141016a22053a00c8010240200541ff017141a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a7012000107a41002105200041003b01c8010b200141016a21012002417f6a22020d000b0b200441123a000f20002d00ca014112470d0120002d00c801220541c7014b0d03200020056a220520052d000020042d0008733a0000200020002d00c80141016a22053a00c8010240200541ff0171220141a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a7012000107a41002105200041003b01c8010c030b200141c801490d020c030b200541c80141dca1c0001032000b200441286a41146a4109360200200441286a410c6a410a3602002004200041ca016a220036024020042004410f6a360244200441c8006a41146a4102360200200441c8006a410c6a4102360200200441e0006a410c6a410b3602002004410a36022c200441d4a2c0003602502004410236024c200441c4a2c0003602482004410b360264200420003602602004200441c8006a3602382004200441c4006a3602302004200441c0006a3602282004200441e0006a36025820042004410f6a360268200441106a41146a410336020020044203370214200441d4c0c7003602102004200441286a360220200441106a4194a3c000103d000b2000200541ff01716a220520052d000020042d0009733a0000200020002d00c80141016a22053a00c80102400240200541ff0171220141a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a7012000107a41002105200041003b01c8010c010b200141c7014b0d010b2000200541ff01716a220520052d000020042d000a733a0000200020002d00c80141016a22053a00c80102400240200541ff0171220141a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a7012000107a41002105200041003b01c8010c010b200141c7014b0d010b2000200541ff01716a220520052d000020042d000b733a0000200020002d00c80141016a22053a00c8010240200541ff017141a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a7012000107a200041003b01c8010b200041024100107e024020002d00c801220541c8014f0d00200020056a220520052d000020042d0000733a0000200020002d00c80141016a22053a00c80102400240200541ff0171220141a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a7012000107a41002105200041003b01c8010c010b200141c8014f0d010b2000200541ff01716a220520052d000020042d0001733a0000200020002d00c80141016a22053a00c80102400240200541ff0171220141a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a7012000107a41002105200041003b01c8010c010b200141c7014b0d010b2000200541ff01716a220520052d000020042d0002733a0000200020002d00c80141016a22053a00c80102400240200541ff0171220141a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a7012000107a41002105200041003b01c8010c010b200141c7014b0d010b2000200541ff01716a220520052d000020042d0003733a0000200020002d00c80141016a22053a00c80102400240200541ff0171220141a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a7012000107a41002105200041003b01c8010c010b200141c7014b0d010b2000200541ff01716a220520052d000020042d0004733a0000200020002d00c80141016a22053a00c80102400240200541ff0171220141a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a7012000107a41002105200041003b01c8010c010b200141c7014b0d010b2000200541ff01716a220520052d000020042d0005733a0000200020002d00c80141016a22053a00c80102400240200541ff0171220141a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a7012000107a41002105200041003b01c8010c010b200141c7014b0d010b2000200541ff01716a220520052d000020042d0006733a0000200020002d00c80141016a22053a00c80102400240200541ff0171220141a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a7012000107a41002105200041003b01c8010c010b200141c7014b0d010b2000200541ff01716a220520052d000020042d0007733a0000200020002d00c80141016a22053a00c8010240200541ff017141a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a7012000107a200041003b01c8010b200441f0006a24000f0b200541ff017141c80141dca1c0001032000b200541ff017141c80141dca1c0001032000ba60901027f230041f0006b2205240020052004360208200041124100107e024002400240024002402002450d0020002d00c80121060340200641ff0171220641c7014b0d02200020066a220620062d000020012d0000733a0000200020002d00c80141016a22063a00c8010240200641ff017141a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a7012000107a41002106200041003b01c8010b200141016a21012002417f6a22020d000b0b200541123a000f20002d00ca014112470d0120002d00c801220641c7014b0d03200020066a220620062d000020052d0008733a0000200020002d00c80141016a22063a00c8010240200641ff0171220141a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a7012000107a41002106200041003b01c8010c030b200141c801490d020c030b200641c80141dca1c0001032000b200541286a41146a4109360200200541286a410c6a410a3602002005200041ca016a220036024020052005410f6a360244200541c8006a41146a4102360200200541c8006a410c6a4102360200200541e0006a410c6a410b3602002005410a36022c200541d4a2c0003602502005410236024c200541c4a2c0003602482005410b360264200520003602602005200541c8006a3602382005200541c4006a3602302005200541c0006a3602282005200541e0006a36025820052005410f6a360268200541106a41146a410336020020054203370214200541d4c0c7003602102005200541286a360220200541106a4194a3c000103d000b2000200641ff01716a220620062d000020052d0009733a0000200020002d00c80141016a22063a00c80102400240200641ff0171220141a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a7012000107a41002106200041003b01c8010c010b200141c7014b0d010b2000200641ff01716a220620062d000020052d000a733a0000200020002d00c80141016a22063a00c80102400240200641ff0171220141a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a7012000107a41002106200041003b01c8010c010b200141c7014b0d010b2000200641ff01716a220620062d000020052d000b733a0000200020002d00c80141016a22063a00c8010240200641ff017141a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a7012000107a200041003b01c8010b200041074100107e02402004450d0020002d00c8012106024002400340200641ff0171220641c7014b0d012003200020066a2d00003a000020002d00c801220641c7014b0d02200020066a41003a0000200020002d00c80141016a22063a00c8010240200641ff017141a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a7012000107a41002106200041003b01c8010b200341016a21032004417f6a22040d000c030b0b200641c80141cca4c0001032000b200641c80141dca4c0001032000b200541f0006a24000f0b200641ff017141c80141dca1c0001032000bb00301097f20004201370200200041086a4100360200200141096a2d00002102200128020421032001280200210402400240024020012d000822054102470d00200320046b410020041b21010c010b20054101462106024020040d00200621010c010b2006200320046b6a220120064f0d00200041046a2107200041086a210841012109410021010340024002400240200541ff01714102470d00200221060c010b410021062005410171450d00410021050c010b2004450d0320042003460d0320042d0000210241022105200441016a21040b024020012007280200470d0020002001417f200320046b410020041b220941016a220a200a2009491b106d200028020021090b200920016a20023a00002008200141016a2201360200200621020c000b0b200041002001106d20002802002209200041086a28020022066a210102400240200541024b0d0020050e03010001010b200120023a00002009200641016a22066a21010b02402004450d0020032004460d00200421020340200120022d00003a0000200141016a21012003200241016a2202470d000b2003200620046b6a21060b200041086a20063602000b0bd10201057f230041106b22022400024002400240024002400240024002400240024020012d00000e06010203040500010b20024181ca003b01082002200141216a3602042002200141016a3602000c050b4101102a2201450d062000428180808010370204200020013602000c050b2001410c6a22032802002204412020044120491b220541016a220410242206450d0520062004200410d1062106200328020022032005490d06200641016a200141046a280200200510cf061a2000200436020820002004360204200020063602000c040b20024181c4003b01082002200141216a3602042002200141016a3602000c020b20024181c6003b01082002200141216a3602042002200141016a3602000c010b20024181c8003b01082002200141216a3602042002200141016a3602000b200020021084010b200241106a24000f0b1033000b2005200341c0a7c0001047000b820202057f017e0240024020012802002202450d00200128020421030340200241086a210420022f010621054100210102400240034020052001460d014191acc0002004410810d2062206450d02200141016a2101200441086a21042006417f4a0d000b2001417f6a21050b2003450d022003417f6a2103200220054102746a41e4016a28020021020c010b0b200241e0006a2001410c6c6a22012802084108490d0141000d002001280200290000210720004100360200200041086a20073703000f0b200042013703002000410c6a4128360200200041086a41c2acc0003602000f0b200042013703002000410c6a4229370200200041086a4199acc000ad3e02000b8a0301027f02400240200241046a2203417f4c0d000240024020030d0041012104410021030c010b200310242204450d020b20002004360200200041086a22044100360200200020033602040240024002400240200241c000490d00200241808001490d012002418080808004490d02200041004101106d2000280200200041086a220428020022036a41033a00002004200341016a2203360200200020034104106d2000280200200428020022036a20023600002004200341046a22033602000c030b200041004101106d2000280200200428020022036a20024102743a00002004200341016a22033602000c020b200041004102106d2000280200200041086a220428020022036a20024102744101723b00002004200341026a22033602000c010b200041004104106d2000280200200041086a220428020022036a20024102744102723600002004200341046a22033602000b200020032002106d2000280200200041086a220028020022036a2001200210cf061a2000200320026a3602000f0b1034000b1033000b860401057f230041106b2203240020004201370200200041086a22044100360200024020012d0000220541024b0d0002400240024020050e03000102000b200041004101106d2000280200200041086a220528020022066a41013a00002005200641016a3602002000200141016a1089010c020b200041004101106d2000280200200041086a220528020022066a41023a00002005200641016a3602002000200141016a1089010c010b200041004101106d2000280200200041086a220528020022066a41033a00002005200641016a3602002000200141016a1089010b200341003602082003420137030020022802002101200341004104106d2003280200200328020822056a20013600002003200541046a3602082003200241046a1089012003280200210602400240200041046a2802002205200428020022026b20032802082201490d00200028020021040c010b0240024002400240200220016a22042002490d00200541017422072004200720044b1b22044108200441084b1b22074100480d002000280200410020051b2204450d0120052007460d032005450d0120042005200710282204450d020c030b102e000b2007102422040d010b102c000b20002004360200200041046a20073602000b200420026a2006200110cf061a200041086a200220016a36020002402003280204450d00200328020010260b200341106a24000bcd0101047f230041106b220224000240412010242203450d002002422037020420022003360200200241004120106d20022802002204200228020822056a22032001290000370000200341086a200141086a290000370000200341106a200141106a290000370000200341186a200141186a2900003700002002200541206a22013602082000200041086a22032802002001106d2000280200200328020022006a2004200110cf061a2003200020016a36020002402002280204450d00200410260b200241106a24000f0b1033000bce04010b7f0240200241ffffffff01712002470d0020024103742203417f4c0d0041042104024002402003450d00200310242204450d010b20002004360200200041086a22054100360200200041046a20034103762206360200024002402002450d00200341786a410376210741002108410021090340024020012802004101470d000240024002400240200841014b0d00024020080e020200020b2001280204210a410021020c020b2001280204210a4100210220082103034020022003410176220b20026a220c2004200c4103746a280204200a4b1b21022003200b6b220341014b0d000c020b0b2001280204210a410021030c010b20082002200420024103746a280204200a496a22034f0d0020032008103b000b024020082006470d0020062006470d0002400240200641016a22022006490d002006410174220b2002200b20024b1b22024104200241044b1b220241ffffffff0171220c2002470d002002410374220b4100480d00200c20024641027421022006410374200d20061b210d0240024002402004410020061b22040d00200b0d01200221040c040b200d200b460d030240200d0d00200b0d01410421040c040b2004200d200b10282204450d010c030b200b102422040d020b20020d060b102e000b20002004360200200041046a200b41037622063602000b200420034103746a220241086a2002200820036b41037410d0061a2002200a360204200220093602002005200841016a22083602000b200141086a210120092007462102200941016a21092002450d000b0b0f0b102c000b1033000b1034000bde0201087f024002400240200041046a2802002202200041086a28020022036b2001410c6a2802002204200141086a28020022056b22064103752207490d00200028020021080c010b02400240200320076a22082003490d00200241017422032008200320084b1b22034104200341044b1b220341ffffffff017122082003470d00200341037422094100480d00200820034641027421030240024002402000280200410020021b22080d0020090d01200321080c040b200241037422022009460d03024020020d0020090d01410421080c040b20082002200910282208450d010c030b2009102422080d020b20030d030b102e000b20002008360200200041046a2009410376360200200041086a28020021030b200820034103746a2005200610cf061a200141086a2004360200200041086a2200200028020020076a3602000240200128020441ffffffff0171450d00200128020010260b0f0b102c000b910401067f230041106b22022400200241003a000c02400240200128020022032802042204450d00200328020022052d0000210620032004417f6a360204200241013a000c2003200541016a360200200220063a00080240200128020022032802042204450d00200328020022052d0000210620032004417f6a3602042003200541016a360200200241023a000c200220063a0009200128020022032802042204450d00200328020022052d0000210620032004417f6a3602042003200541016a360200200241033a000c200220063a000a200128020022032802042204450d00200328020022052d0000210620032004417f6a3602042003200541016a360200200220063a000b2002280208210420022001108d01024002400240024020022802000d0020012802002205280204220620022802042203490d002003417f4c0d020240024020030d0041002101410121070c010b2003102a2207450d04200128020022052802042106200321010b0240024020062003490d0020072005280200200310cf0621062005280204220720034f0d012003200741b8afc0001048000b2001450d01200710260c010b2005200720036b3602042005200528020020036a36020020060d010b200041003602040c050b20002003ad4220862001ad8437020820002006360204200020043602000c040b1034000b1033000b200241003a000c0b200041003602040b200241106a24000bfb0201057f02400240200128020022022802042203450d00200228020022042d0000210520022003417f6a360204410121032002200441016a3602000240200541037122024103460d0002400240024020020e03000102000b20054102762102410021030c040b200128020022022802042203450d02200228020022012d0000210420022003417f6a360204410121032002200141016a3602002004410874200572220141ffff0371418002490d03200141fcff03714102762102410021030c030b2001280200220228020422034103490d012002280200220141026a2d0000210420012f000021062002200141036a36020020022003417d6a3602042006200441107472410874200572220241808004492103200241027621020c020b0240200541034d0d000c020b2001280200220128020422054104490d0120012802002203280000210220012005417c6a3602042001200341046a36020020024180808080044921030c010b410121030b20002002360204200020033602000bd30604037f017e087f037e230041a0026b2202240020022001108f01024002402002280200450d00200041003602000c010b02400240024020022802042203200128020441286e2204200420034b1bad42287e2205422088a70d002005a72204417f4c0d000240024020040d00410821060c010b200410242206450d020b4100210720024100360210200220063602082002200441286e36020c02402003450d0041002108034041002104200241003a00d801200841016a210820012802042109417f210a02400240034020092004460d01200241b8016a20046a2001280200220b2d00003a000020012009200a6a3602042001200b41016a3602002002200441016a220b3a00d801200a417f6a210a200b2104200b4120470d000b200241e0016a41086a2204200241b8016a41086a290300370300200241e0016a41106a220a200241b8016a41106a290300370300200241e0016a41186a220c200241b8016a41186a290300370300200220022903b8013703e001200b41ff0171411f4b0d010c060b200441ff0171450d05200241003a00d8010c050b200241f8006a41086a220d2004290300370300200241f8006a41106a2204200a290300370300200241f8006a41186a220a200c290300370300200220022903e0013703782009200b6b220b4108490d042001280200220929000021052001200b41786a3602042001200941086a360200200241386a41086a200d290300220e370300200241386a41106a2004290300220f370300200241386a41186a200a2903002210370300200241186a41186a220a2010370300200241186a41106a220b200f370300200241186a41086a2209200e37030020022002290378220e3703382002200e37031802402007200228020c470d00200241086a2007410110900120022802082106200228021021070b2006200741286c6a220420022903183703002009290300210e200b290300210f200a290300211020042005370320200441186a2010370300200441106a200f370300200441086a200e3703002002200741016a220736021020082003470d000b0b20002002290308370200200041086a200241086a41086a2802003602000c030b1034000b1033000b20004100360200200228020c2204450d00200441286c450d00200610260b200241a0026a24000bcf0201067f0240024020012802042202450d00200128020022032d0000210420012002417f6a2205360204410121062001200341016a3602000240200441037122074103460d0002400240024020070e03000102000b20044102762107410021060c040b41012106024020050d000c040b20032d0001210520012002417e6a3602042001200341026a3602002005410874200472220141ffff0371418002490d03200141fcff03714102762107410021060c030b20054103490d01200341036a2d0000210620032f0001210720012002417c6a3602042001200341046a3602002007200641107472410874200472220141808004492106200141027621070c020b0240200441034d0d000c020b20054104490d012003280001210720012002417b6a3602042001200341056a36020020074180808080044921060c010b410121060b20002007360204200020063602000bdf0103017f017e017f02400240200041046a280200220320016b20024f0d0002400240200120026a22022001490d00200341017422012002200120024b1b22014104200141044b1bad42287e2204422088a722020d002004a722014100480d0020024541037421050240024002402000280200410020031b22020d0020010d01200521020c040b200341286c22032001460d03024020030d0020010d01410821020c040b20022003200110282202450d010c030b2001102422020d020b20050d030b102e000b20002002360200200041046a200141286e3602000b0f0b102c000bea0301067f230041106b22022400200241003a000c0240024020012802042203450d00200128020022042d0000210520012003417f6a2206360204200241013a000c2001200441016a360200200220053a000802402006450d00200128020022042d0000210520012003417e6a22063602042001200441016a360200200241023a000c200220053a00092006450d00200128020022042d0000210520012003417d6a22063602042001200441016a360200200241033a000c200220053a000a2006450d00200128020022042d0000210520012003417c6a3602042001200441016a360200200220053a000b2002280208210420022001108f01024002400240024020022802000d002001280204220520022802042203490d002003417f4c0d020240024020030d0041002106410121070c010b2003102a2207450d0420012802042105200321060b0240024020052003490d0020072001280200200310cf0621052001280204220720034f0d012003200741b8afc0001048000b2006450d01200710260c010b2001200720036b3602042001200128020020036a36020020050d010b200041003602040c050b20002003ad4220862006ad8437020820002005360204200020043602000c040b1034000b1033000b200241003a000c0b200041003602040b200241106a24000b880602097f037e23004180026b2202240020022001108f0102400240024002402002280200450d00200041003602000c010b2002280204220320012802044105762204200420034b1b22044105742205417f4c0d010240024020040d00410121060c010b200510242206450d030b41002107200241003602102002200436020c200220063602080240024002402003450d0041002108034041002105200241003a00b801200841016a21082001280204417f6a210403402004417f460d0320024198016a20056a200128020022092d00003a0000200120043602042001200941016a3602002002200541016a22093a00b8012004417f6a21042009210520094120470d000b200241c0016a41086a220420024198016a41086a290300370300200241c0016a41106a220520024198016a41106a290300370300200241c0016a41186a220a20024198016a41186a29030037030020022002290398013703c001200941ff0171411f4d0d03200241386a41086a2004290300220b370300200241386a41106a2005290300220c370300200241386a41186a200a290300220d370300200241186a41186a2205200d370300200241186a41106a2209200c370300200241186a41086a220a200b370300200220022903c001220b3703582002200b3703382002200b37031802402007200228020c470d00200241086a2007410110930120022802082106200228021021070b200620074105746a22042002290318370000200441186a2005290300370000200441106a2009290300370000200441086a200a2903003700002002200741016a220736021020082003470d000b0b20002002290308370200200041086a200241086a41086a2802003602000c020b200541ff0171450d00200241003a00b8010b200241386a41086a200241d8006a41086a290300370300200241386a41106a200241d8006a41106a290300370300200241386a41186a200241d8006a41186a2903003703002002200229035837033820004100360200200228020c41ffffff3f71450d00200610260b20024180026a24000f0b1034000b1033000bdd0101027f02400240200041046a280200220320016b20024f0d0002400240200120026a22022001490d00200341017422012002200120024b1b22014104200141044b1b220141ffffff3f7122042001470d00200141057422024100480d00200420014621040240024002402000280200410020031b22010d0020020d01200421010c040b200341057422032002460d03024020030d0020020d01410121010c040b20012003200210282201450d010c030b2002102422010d020b20040d030b102e000b20002001360200200041046a20024105763602000b0f0b102c000ba80201047f230041106b22022400024002402001280208220341146a2204417f4c0d000240024020040d0041012105410021040c010b200410242205450d020b200241003602082002200536020020022004360204200241004110106d2002280200200228020822046a2205200129000c370000200541086a200141146a2900003700002002200441106a360208200128020020032002109501200128021c2101200220022802084120106d20022802002203200228020822056a22042001290000370000200441086a200141086a290000370000200441106a200141106a290000370000200441186a200141186a2900003700002002200541206a220136020820002003200110960102402002280204450d00200310260b200241106a24000f0b1034000b1033000bcb0201027f0240024002400240200141c000490d00200141808001490d012001418080808004490d022002200241086a22032802004101106d2002280200200328020022046a41033a00002003200441016a2204360200200220044104106d2002280200200328020022046a20013600002003200441046a22043602000c030b2002200241086a22032802004101106d2002280200200328020022046a20014102743a00002003200441016a22043602000c020b2002200241086a22032802004102106d2002280200200328020022046a20014102744101723b00002003200441026a22043602000c010b2002200241086a22032802004104106d2002280200200328020022046a20014102744102723600002003200441046a22043602000b200220042001106d2002280200200241086a220228020022046a2000200110cf061a2002200420016a3602000b4c0020002002ad4220862001ad8410112201290000370000200041186a200141186a290000370000200041106a200141106a290000370000200041086a200141086a290000370000200110260ba901000240200141ff0171220141024b0d0002400240024020010e03000102000b2000200041086a22012802004101106d2000280200200128020022006a41003a00002001200041016a3602000f0b2000200041086a22012802004101106d2000280200200128020022006a41013a00002001200041016a3602000f0b2000200041086a22012802004101106d2000280200200128020022006a41023a00002001200041016a3602000b0b6501027f2000200041086a22042802004108106d2000280200200428020022056a20013700002004200541086a36020020002002109701200020042802004101106d2000280200200428020022006a200341ff01714101463a00002004200041016a3602000bbc0101047f200128020021022000200041086a22032802004101106d2000280200200328020022046a21050240024020024101460d00200541003a0000200441016a21030c010b200541013a00002003200441016a220236020020012802042104200020024104106d2000280200200328020022026a20043600002003200241046a2202360200200141086a2802002101200020024104106d2000280200200328020022036a2001360000200341046a21030b200041086a20033602000bdc0201037f2001280200210202400240024002402001280208220141c000490d00200141808001490d012001418080808004490d022000200041086a22032802004101106d2000280200200328020022046a41033a00002003200441016a2204360200200020044104106d2000280200200328020022046a20013600002003200441046a22043602000c030b2000200041086a22032802004101106d2000280200200328020022046a20014102743a00002003200441016a22043602000c020b2000200041086a22032802004102106d2000280200200328020022046a20014102744101723b00002003200441026a22043602000c010b2000200041086a22032802004104106d2000280200200328020022046a20014102744102723600002003200441046a22043602000b2000200420014102742201106d2000280200200041086a220028020022046a2002200110cf061a2000200420016a3602000b900301047f230041106b22022400200128025021032000200041086a22042802004104106d2000280200200428020022056a20033600002004200541046a36020020022000360208200141e0006a200241086a109c012001280254200141dc006a2802002000109501200020042802004120106d2000280200200428020022056a2203200129008001370000200341186a20014198016a290000370000200341106a20014190016a290000370000200341086a20014188016a2900003700002004200541206a22033602002000200341c000106d2000280200200428020022056a220320012900a001370000200341386a200141d8016a290000370000200341306a200141d0016a290000370000200341286a200141c8016a290000370000200341206a200141c0016a290000370000200341186a200141b8016a290000370000200341106a200141b0016a290000370000200341086a200141a8016a2900003700002004200541c0006a3602002002200036020c200141e0016a2002410c6a109c0120002001109d01200241106a24000bd20101047f230041106b220224000240412010242203450d002002422037020420022003360200200241004120106d20022802002204200228020822056a22032000290000370000200341086a200041086a290000370000200341106a200041106a290000370000200341186a200041186a2900003700002002200541206a220036020820012802002203200341086a22012802002000106d2003280200200128020022036a2004200010cf061a2001200320006a36020002402002280204450d00200410260b200241106a24000f0b1033000bfa0203017f027e037f230041106b22022400200141086a2903002103200129030021042000200041086a22052802004110106d2000280200200528020022066a22072003370008200720043700002005200641106a360200200128021021052000200141186a280200220610a10102402006450d0020064104742106034020002005410c6a2d000010a8012005280200200541086a2802002000109501200541106a2105200641706a22060d000b0b2002200036020c2001412c6a2002410c6a109c0102400240200128021c22060d002000200041086a22062802004101106d2000280200200628020022056a41003a00002006200541016a22053602000c010b2000200041086a22052802004101106d2000280200200528020022076a41013a00002005200741016a3602002006200141246a2802002000109501200528020021050b20012802282106200020054104106d2000280200200041086a220528020022006a20063600002005200041046a360200200241106a24000b9c0201017f0240024002400240200141ff01710e0400010203000b2000200041086a22012802004101106d2000280200200128020022006a41003a00002001200041016a3602000f0b2000200041086a22012802004101106d2000280200200128020022006a41013a00002001200041016a3602000f0b2000200041086a22012802004101106d2000280200200128020022006a41023a00002001200041016a3602000f0b2000200041086a22012802004101106d2000280200200128020022046a41033a00002001200441016a2204360200200020044101106d2000280200200128020022046a20023a00002001200441016a2202360200200020024101106d2000280200200128020022006a20033a00002001200041016a3602000b7801037f0240200128020022020d002000200041086a22012802004101106d2000280200200128020022006a41003a00002001200041016a3602000f0b2000200041086a22032802004101106d2000280200200328020022046a41013a00002003200441016a3602002002200141086a28020020001095010b9c0101067f230041106b220224002001280200210320002001280208220110a10102402001450d00200141246c2104200041086a210103402002200310a201200228020021052000200128020020022802082206106d2000280200200128020022076a2005200610cf061a2001200720066a36020002402002280204450d00200510260b200341246a21032004415c6a22040d000b0b200241106a24000b910201027f024002400240200141c000490d00200141808001490d012001418080808004490d022000200041086a22022802004101106d2000280200200228020022036a41033a00002002200341016a2203360200200020034104106d2000280200200228020022006a20013600002002200041046a3602000f0b2000200041086a22022802004101106d2000280200200228020022006a20014102743a00002002200041016a3602000f0b2000200041086a22022802004102106d2000280200200228020022006a20014102744101723b00002002200041026a3602000f0b2000200041086a22022802004104106d2000280200200228020022006a20014102744102723600002002200041046a3602000b9e0501037f230041106b22022400024002400240024002400240024020012d00000e06010402030500010b20004201370200200041086a22034100360200200041004101106d2000280200200328020022046a41003a00002003200441016a360200200141046a2802002001410c6a28020020001095010c050b20004201370200200041086a22034100360200200041004101106d2000280200200328020022046a41023a00002003200441016a3602002002200036020c200141016a2002410c6a109c010c040b20004201370200200041086a22034100360200200041004101106d2000280200200328020022046a41043a00002003200441016a2204360200200020044104106d2000280200200328020022046a20012800013600002003200441046a360200200141086a280200200141106a28020020001095010c030b20004201370200200041086a22034100360200200041004101106d2000280200200328020022046a41053a00002003200441016a2204360200200020044104106d2000280200200328020022046a20012800013600002003200441046a360200200141086a280200200141106a28020020001095010c020b20004201370200200041086a22034100360200200041004101106d2000280200200328020022046a41063a00002003200441016a2204360200200020044104106d2000280200200328020022046a20012800013600002003200441046a360200200141086a280200200141106a28020020001095010c010b20004201370200200041086a22034100360200200041004101106d2000280200200328020022046a41073a00002003200441016a2204360200200020044101106d2000280200200328020022046a41003a00002003200441016a3602002000200141046a10a4010b200241106a24000bf40301047f230041106b2202240020012802042103024002400240024020012802004101470d002001410c6a280200220141046a2204417f4c0d020240024020040d0041012105410021040c010b200410242205450d040b2002410036020820022005360200200220043602040240024002400240200141c000490d00200141808001490d012001418080808004490d02200241004101106d2002280200200228020822046a41033a00002002200441016a2204360208200220044104106d2002280200200228020822046a2001360000200441046a21040c030b200241004101106d2002280200200228020822046a20014102743a0000200441016a21040c020b200241004102106d2002280200200228020822046a20014102744101723b0000200441026a21040c010b200241004104106d2002280200200228020822046a2001410274410272360000200441046a21040b20022004360208200220042001106d20022802002204200228020822056a2003200110cf061a2002200520016a22013602080c010b20022003200141086a28020010870120022802002104200228020821010b2000200041086a22032802002001106d2000280200200328020022006a2004200110cf061a2003200020016a36020002402002280204450d00200410260b200241106a24000f0b1034000b1033000bbc0101047f200128020021022000200041086a22032802004101106d2000280200200328020022046a21050240024020024101460d00200541003a0000200441016a21030c010b200541013a00002003200441016a220236020020012802042104200020024104106d2000280200200328020022026a20043600002003200241046a2202360200200141086a2802002101200020024104106d2000280200200328020022036a2001360000200341046a21030b200041086a20033602000b8f0202057f017e2001280200210220002001280208220310a1010240024020030d00200041086a28020021040c010b2002200341286c6a2105200041086a220328020021040340200020044120106d2000280200200328020022066a22042002290000370000200441186a200241186a290000370000200441106a200241106a290000370000200441086a200241086a2900003700002003200641206a2204360200200241206a2903002107200020044108106d2000280200200328020022046a20073700002003200441086a22043602002005200241286a2202470d000b0b200128020c2102200020044104106d2000280200200041086a220028020022036a20023600002000200341046a3602000b8c0202027e037f200141086a2903002102200129030021032000200041086a22042802004110106d2000280200200428020022056a22062002370008200620033700002004200541106a2205360200200141186a290300210220012903102103200020054110106d2000280200200428020022056a22062002370008200620033700002004200541106a2205360200200141286a290300210220012903202103200020054110106d2000280200200428020022056a22062002370008200620033700002004200541106a2205360200200141386a290300210220012903302103200020054110106d2000280200200428020022006a22012002370008200120033700002004200041106a3602000b9d0201027f0240024002402001280200220241c000490d00200241808001490d012002418080808004490d022000200041086a22022802004101106d2000280200200228020022036a41033a00002002200341016a220336020020012802002101200020034104106d2000280200200228020022006a20013600002002200041046a3602000f0b2000200041086a22012802004101106d2000280200200128020022006a20024102743a00002001200041016a3602000f0b2000200041086a22012802004102106d2000280200200128020022006a20024102744101723b00002001200041026a3602000f0b2000200041086a22012802004104106d2000280200200128020022006a20024102744102723600002001200041046a3602000ba801000240200141037122014103460d0002400240024020010e03000102000b2000200041086a22012802004101106d2000280200200128020022006a41003a00002001200041016a3602000f0b2000200041086a22012802004101106d2000280200200128020022006a41013a00002001200041016a3602000f0b2000200041086a22012802004101106d2000280200200128020022006a41023a00002001200041016a3602000b0bd90701077f230041106b220224002001280200210320002001280208220410a10102402004450d002003200441c8006c6a2105200041086a2104034020022003108501200228020021062000200428020020022802082207106d2000280200200428020022086a2006200710cf061a2004200820076a36020002402002280204450d00200610260b2002200341246a2206108501200228020021072000200428020020022802082203106d2000280200200428020022086a2007200310cf061a2004200820036a36020002402002280204450d00200710260b200641246a22032005470d000b0b20022001410c6a108501200228020021072000200041086a220428020020022802082203106d2000280200200428020022066a2007200310cf061a2004200620036a36020002402002280204450d00200710260b2002200141306a108501200228020021072000200428020020022802082203106d2000280200200428020022066a2007200310cf061a2004200620036a36020002402002280204450d00200710260b2002200141d4006a108501200228020021072000200041086a220428020020022802082203106d2000280200200428020022066a2007200310cf061a2004200620036a36020002402002280204450d00200710260b2002200141f8006a108501200228020021072000200428020020022802082203106d2000280200200428020022066a2007200310cf061a2004200620036a36020002402002280204450d00200710260b20022001419c016a108501200228020021072000200041086a220428020020022802082203106d2000280200200428020022066a2007200310cf061a2004200620036a36020002402002280204450d00200710260b20012d0088022103200020042802004101106d2000280200200428020022046a21070240024020034101460d00200741003a0000200441016a21030c010b200741013a0000200041086a2203200441016a2204360200200020044114106d2000280200200328020022036a220420014189026a290000370000200441106a20014199026a280000360000200441086a20014191026a290000370000200341146a21030b200041086a220420033602002002200141c0016a108501200228020021072000200428020020022802082203106d2000280200200428020022066a2007200310cf061a2004200620036a36020002402002280204450d00200710260b2002200141e4016a108501200228020021072000200428020020022802082203106d2000280200200428020022006a2007200310cf061a2004200020036a36020002402002280204450d00200710260b200241106a24000be00a03017f017e037f230041106b22022400200129030021032000200041086a22042802004108106d2000280200200428020022056a20033700002004200541086a220536020020012903082103200020054101106d2000280200200428020022056a21060240024020034201510d00200641003a00002004200541016a220536020020012903102103200020054108106d2000280200200428020022056a20033700002004200541086a2205360200200020054120106d2000280200200428020022066a2205200141e0016a290000370000200541186a200141f8016a290000370000200541106a200141f0016a290000370000200541086a200141e8016a2900003700002004200641206a3602002002200036020c2001411c6a2002410c6a109c01200141186a2802002105200020042802004104106d2000280200200428020022066a20053600002004200641046a22053602002000200541c000106d2000280200200428020022066a22052001413c6a290000370000200541386a200141f4006a290000370000200541306a200141ec006a290000370000200541286a200141e4006a290000370000200541206a200141dc006a290000370000200541186a200141d4006a290000370000200541106a200141cc006a290000370000200541086a200141c4006a2900003700002004200641c0006a3602002002200036020c20014180016a2002410c6a109c01200128027c2105200020042802004104106d2000280200200428020022066a20053600002004200641046a22053602002000200541c000106d2000280200200428020022056a2204200141a0016a290000370000200441386a200141d8016a290000370000200441306a200141d0016a290000370000200441286a200141c8016a290000370000200441206a200141c0016a290000370000200441186a200141b8016a290000370000200441106a200141b0016a290000370000200441086a200141a8016a2900003700000c010b200641013a00002004200541016a220536020020012903102103200020054108106d2000280200200428020022056a20033700002004200541086a2205360200200020054120106d2000280200200428020022066a2205200141e0016a290000370000200541186a200141f8016a290000370000200541106a200141f0016a290000370000200541086a200141e8016a2900003700002004200641206a3602002002200036020c2001411c6a2002410c6a109c01200141186a2802002105200020042802004104106d2000280200200428020022066a20053600002004200641046a22053602002000200541c000106d2000280200200428020022066a22052001413c6a290000370000200541386a200141f4006a290000370000200541306a200141ec006a290000370000200541286a200141e4006a290000370000200541206a200141dc006a290000370000200541186a200141d4006a290000370000200541106a200141cc006a290000370000200541086a200141c4006a2900003700002004200641c0006a3602002002200036020c20014180016a2002410c6a109c01200128027c2105200020042802004104106d2000280200200428020022066a20053600002004200641046a22053602002000200541c000106d2000280200200428020022056a2204200141a0016a290000370000200441386a200141d8016a290000370000200441306a200141d0016a290000370000200441286a200141c8016a290000370000200441206a200141c0016a290000370000200441186a200141b8016a290000370000200441106a200141b0016a290000370000200441086a200141a8016a2900003700000b200041086a200541c0006a360200200241106a24000bf30201047f230041106b2202240020022000360204200141106a200241046a109c0102400240024002402001280200220341c000490d00200341808001490d012003418080808004490d022000200041086a22042802004101106d2000280200200428020022056a41033a00002004200541016a2205360200200020054104106d2000280200200428020022056a20033600002004200541046a3602000c030b2000200041086a22042802004101106d2000280200200428020022056a20034102743a00002004200541016a3602000c020b2000200041086a22042802004102106d2000280200200428020022056a20034102744101723b00002004200541026a3602000c010b2000200041086a22042802004104106d2000280200200428020022056a20034102744102723600002004200541046a3602000b20022000360208200141306a200241086a109c012002200036020c200141d0006a2002410c6a109c012000200141046a10a001200241106a24000bd10102047f017e2001280200210220002001280208220110a10102402001450d002002200141286c6a2103200041086a220128020021040340200020044120106d2000280200200128020022056a22042002290000370000200441186a200241186a290000370000200441106a200241106a290000370000200441086a200241086a2900003700002001200541206a2204360200200241206a2903002106200020044108106d2000280200200128020022046a20063700002001200441086a22043602002003200241286a2202470d000b0b0b9f0301037f230041106b22022400024020012d0000220341024b0d0002400240024020030e03000102000b2000200041086a22032802004101106d2000280200200328020022046a41013a00002003200441016a36020020022000360204200141016a200241046a109c010c020b2000200041086a22032802004101106d2000280200200328020022046a41023a00002003200441016a36020020022000360208200141016a200241086a109c010c010b2000200041086a22032802004101106d2000280200200328020022046a41033a00002003200441016a3602002002200036020c200141016a2002410c6a109c010b2000200041086a220328020041c000106d2000280200200328020022046a22002001290021370000200041386a200141d9006a290000370000200041306a200141d1006a290000370000200041286a200141c9006a290000370000200041206a200141c1006a290000370000200041186a200141396a290000370000200041106a200141316a290000370000200041086a200141296a2900003700002003200441c0006a360200200241106a24000bae0101037f200128020021022000200041086a22032802004104106d2000280200200328020022046a20023600002003200441046a3602002001280204210220002001410c6a280200220410a10102402004450d0020022004410c6c6a210403402002280200200241086a28020020001095012002410c6a22022004470d000b0b20012802102102200020032802004104106d2000280200200328020022006a20023600002003200041046a3602000b970101027f024020012802004101460d002000200041086a22012802004101106d2000280200200128020022006a41003a00002001200041016a3602000f0b2000200041086a22022802004101106d2000280200200228020022036a41013a00002002200341016a220336020020012802042101200020034104106d2000280200200228020022006a20013600002002200041046a3602000b980101047f230041106b220224002000280200220028020821032000280200210041012104200128021841db9ec00041012001411c6a28020028020c1100002105200241003a000d200220053a000c200220013602080240200241086a2000200020036a10b10122012d00040d002001280200220128021841da9ec00041012001411c6a28020028020c11000021040b200241106a240020040bf40201037f230041c0006b22032400024020012002460d0020002d00042104034020032001360204200141016a2101200441ff0171210541012104024020050d0020002d000521040240200028020022052d00004104710d000240200441ff0171450d00410121042005280218419b9ec00041022005411c6a28020028020c1100000d02200028020021050b200341046a2005107f21040c010b0240200441ff01710d0041012104200528021841d99ec00041012005411c6a28020028020c1100000d01200028020021050b200341013a001720032005290218370308200341a09ec000360234200320052d00203a0038200320052902103703282003200341176a36021020032005290208370320200320052902003703182003200341086a3602300240200341046a200341186a107f0d00200328023041b89ec0004102200328023428020c11000021040c010b410121040b200041013a0005200020043a000420022001470d000b0b200341c0006a240020000bfa0301057f230041106b2202240002400240200028020822034105744104722204417f4c0d0020002802002100200410242205450d01200241003602082002200436020420022005360200024002400240200341c000490d00024002400240200341808001490d002003418080808004490d01200241004101106d2002280200200228020822046a41033a00002002200441016a2204360208200220044104106d2002280200200228020822046a2003360000200441046a21040c020b200241004102106d2002280200200228020822046a20034102744101723b0000200441026a21040c010b200241004104106d2002280200200228020822046a2003410274410272360000200441046a21040b20022004360208200020034105746a21060c010b200241004101106d20022802002205200228020822046a20034102743a00002002200441016a22043602082003450d01200020034105746a21060b0340200220044120106d20022802002205200228020822036a22042000290000370000200441086a200041086a290000370000200441106a200041106a290000370000200441186a200041186a2900003700002002200341206a22043602082006200041206a2200470d000b0b200128020020012802042005200410b30102402002280204450d00200510260b200241106a24000f0b1034000b1033000b18002001ad4220862000ad842003ad4220862002ad8410220bcd0401077f024002402002411c6c41046a2203417f4c0d000240024020030d0041012104410021030c010b200310242204450d020b20002004360200200041086a22044100360200200020033602042000200210a10102402002450d0020012002411c6c6a210503402001280200210620002001280208220210a10102402002450d0020062002412c6c6a21070340200020042802004120106d2000280200200428020022036a2202200629000c370000200241186a200641246a290000370000200241106a2006411c6a290000370000200241086a200641146a2900003700002004200341206a3602002006280200210220002006280208220310a1012006412c6a210602402003450d0020034105742108200428020021030340200020034120106d2000280200200428020022096a22032002290000370000200341186a200241186a290000370000200341106a200241106a290000370000200341086a200241086a2900003700002004200941206a2203360200200241206a2102200841606a22080d000b0b20062007470d000b0b2001411c6a2106200128020c210220002001280214220310a1010240024020030d00200428020021030c010b2003410274210820042802002103034020022802002109200020034104106d2000280200200428020022036a20093600002004200341046a2203360200200241046a21022008417c6a22080d000b0b20012802182102200020034104106d2000280200200428020022036a20023600002004200341046a3602002006210120062005470d000b0b0f0b1034000b1033000be10102047f027e230041106b22022400024002402000280208220341216c41146a2204417f4c0d000240024020040d0041012105410021040c010b200410242205450d02200028020821030b20024100360208200220053602002002200436020420002802002003200210b601200041186a290300210620002903102107200220022802084110106d20022802002200200228020822046a22032006370008200320073700002002200441106a2204360208200128020020012802042000200410b30102402002280204450d00200010260b200241106a24000f0b1034000b1033000bc20201037f2002200110a10102402001450d002000200141216c6a2103200241086a220128020021040340200220044120106d2002280200200128020022056a22042000290000370000200441186a200041186a290000370000200441106a200041106a290000370000200441086a200041086a2900003700002001200541206a220436020002400240024002400240200041206a2d00000e0400010203000b200220044101106d2002280200200128020022046a41003a0000200441016a21040c030b200220044101106d2002280200200128020022046a41013a0000200441016a21040c020b200220044101106d2002280200200128020022046a41023a0000200441016a21040c010b200220044101106d2002280200200128020022046a41033a0000200441016a21040b20012004360200200041216a22002003470d000b0b0b960301037f024002402001280208220241046a2203417f4c0d00200128020021010240024020030d0041012104410021030c010b200310242204450d020b20002004360200200041086a22044100360200200020033602040240024002400240200241c000490d00200241808001490d012002418080808004490d02200041004101106d2000280200200041086a220428020022036a41033a00002004200341016a2203360200200020034104106d2000280200200428020022036a20023600002004200341046a22033602000c030b200041004101106d2000280200200428020022036a20024102743a00002004200341016a22033602000c020b200041004102106d2000280200200041086a220428020022036a20024102744101723b00002004200341026a22033602000c010b200041004104106d2000280200200041086a220428020022036a20024102744102723600002004200341046a22033602000b200020032002106d2000280200200041086a220028020022036a2001200210cf061a2000200320026a3602000f0b1034000b1033000bc00101047f024002402001280208220241027441046a2203417f4c0d00200128020021010240024020030d0041012104410021030c010b200310242204450d020b20002004360200200041086a22044100360200200020033602042000200210a10102402002450d002002410274210320042802002102034020012802002105200020024104106d2000280200200428020022026a20053600002004200241046a2202360200200141046a21012003417c6a22030d000b0b0f0b1034000b1033000bc30101047f0240024020012802082202412c6c41046a2203417f4c0d00200128020021010240024020030d0041012104410021030c010b200310242204450d020b20002004360200200041086a22044100360200200020033602042000200210a10102402002450d0020012002412c6c6a2105034020012802002103200020042802004104106d2000280200200428020022026a20033600002004200241046a360200200141046a200010ba012001412c6a22012005470d000b0b0f0b1034000b1033000bbe0201047f200028022021022001200141086a22032802004101106d2001280200200328020022046a2105024020024102470d00200541003a00002003200441016a3602000f0b200541013a00002003200441016a2204360200200120044120106d2001280200200328020022056a22042000290000370000200441186a200041186a290000370000200441106a200041106a290000370000200441086a200041086a2900003700002003200541206a2204360200024020024101460d00200120044101106d2001280200200141086a220128020022006a41003a00002001200041016a3602000f0b200120044101106d2001280200200141086a220328020022026a41013a00002003200241016a220236020020002802242100200120024104106d2001280200200328020022016a20003600002003200141046a3602000bec0102047f047e02400240200128020822024105744104722203417f4c0d0020012802002101200310242204450d012000200336020420002004360200200041086a220341003602002000200210a10102402002450d0020024105742104200328020021050340200020054120106d200141186a2900002106200141106a2900002107200141086a29000021082001290000210920032003280200220241206a2205360200200220002802006a22022009370000200241086a2008370000200241106a2007370000200241186a2006370000200141206a2101200441606a22040d000b0b0f0b1034000b1033000b980301047f0240024020012802082202410274220341046a2204417f4c0d00200128020021010240024020040d0041012105410021040c010b200410242205450d020b20002005360200200041086a22054100360200200020043602040240024002400240200241c000490d00200241808001490d012002418080808004490d02200041004101106d2000280200200041086a220528020022046a41033a00002005200441016a2204360200200020044104106d2000280200200528020022046a20023600002005200441046a22043602000c030b200041004101106d2000280200200528020022046a20024102743a00002005200441016a22043602000c020b200041004102106d2000280200200041086a220528020022046a20024102744101723b00002005200441026a22043602000c010b200041004104106d2000280200200041086a220228020022046a20034102723600002002200441046a22043602000b200020042003106d2000280200200041086a220028020022046a2001200310cf061a2000200420036a3602000f0b1034000b1033000bdd0101057f230041106b22022400024002402001280208220341246c41046a2204417f4c0d00200128020021010240024020040d0041012105410021040c010b200410242205450d020b20002005360200200041086a22054100360200200020043602042000200310a10102402003450d002001200341246c6a2106034020012802002104200020052802004104106d2000280200200528020022036a20043600002005200341046a3602002002200036020c200141046a2002410c6a109c01200141246a22012006470d000b0b200241106a24000f0b1034000b1033000be10101047f02400240200041046a28020020002802082201470d0002400240200141016a22022001490d00200141017422032002200320024b1b22024104200241044b1b220241ffffffff007122042002470d00200241047422034100480d00200420024641027421040240024002402000280200410020011b22020d0020030d01200421020c040b200141047422012003460d03024020010d0020030d01410421020c040b20022001200310282202450d010c030b2003102422020d020b20040d030b102e000b20002002360200200041046a20034104763602000b0f0b102c000be10101047f02400240200041046a28020020002802082201470d0002400240200141016a22022001490d00200141017422032002200320024b1b22024104200241044b1b220241ffffffff017122042002470d00200241037422034100480d00200420024641027421040240024002402000280200410020011b22020d0020030d01200421020c040b200141037422012003460d03024020010d0020030d01410421020c040b20022001200310282202450d010c030b2003102422020d020b20040d030b102e000b20002002360200200041046a20034103763602000b0f0b102c000bae0503027f017e0c7f230041f0006b220224000240024020012802082203ad42f0007e2204422088a70d002004a72205417f4c0d00200128020021014104210602402005450d00200510242206450d020b20002006360200200041086a22074100360200200041046a200541f0006e36020020004100200310c1012007280200210602402003450d00200341f0006c21052000280200200641f0006c6a21002006200341047441706a4104766a21080340200241c0006a41186a2203200141286a290000370300200241c0006a41106a2206200141206a290000370300200241c0006a41086a2209200141186a2900003703002002200141106a290000370340200241206a41086a220a200141386a290000370300200241206a41106a220b200141c0006a290000370300200241206a41186a220c200141c8006a2900003703002002200141306a290000370320200241086a220d200141d8006a290000370300200241106a220e200141e0006a290000370300200241186a220f200141e8006a2900003703002002200141d0006a29000037030020012802002110200241e0006a200141046a10c201200020103602002000410c6a200241e0006a41086a280200360200200041046a2002290360370200200041286a2003290300370200200041206a2006290300370200200041186a2009290300370200200041106a2002290340370200200041c8006a200c290300370200200041c0006a200b290300370200200041386a200a290300370200200041306a2002290320370200200041d0006a2002290300370200200041d8006a200d290300370200200041e0006a200e290300370200200041e8006a200f290300370200200041f0006a2100200141f0006a2101200541907f6a22050d000b200841016a21060b20072006360200200241f0006a24000f0b1034000b1033000be20103017f017e017f02400240200041046a280200220320016b20024f0d0002400240200120026a22022001490d00200341017422012002200120024b1b22014104200141044b1bad42f0007e2204422088a722020d002004a722014100480d0020024541027421050240024002402000280200410020031b22020d0020010d01200521020c040b200341f0006c22032001460d03024020030d0020010d01410421020c040b20022003200110282202450d010c030b2001102422020d020b20050d030b102e000b20002002360200200041046a200141f0006e3602000b0f0b102c000bbd0503027f017e087f230041206b220224000240024020012802082203ad42247e2204422088a70d002004a72205417f4c0d00200128020021064104210102402005450d00200510242201450d020b2000200136020041002101200041086a22074100360200200041046a200541246e36020020004100200310d1012007280200210502402003450d00200341246c21082000280200200541246c6a210903400240024002400240024002400240200620016a22002d00000e06010203040500010b2002200041046a10c80120022002280200360013200228020421032002280208210a4105210b0c050b4100210b2002410036001b200241003602182002200041046a28000036001b2002200041016a2800003602182002200041146a2900003703002002200041196a290000370005200220022802183602102002200228001b360013200041086a28000021032000410c6a280000210a200041106a280000210c0c040b4101210b200041016a28000021032002200041086a10c80120022003360210200228020021032002280204210a2002280208210c0c030b200041016a28000021032002200041086a10c80120022003360210200228020021032002280204210a2002280208210c4102210b0c020b200041016a28000021032002200041086a10c80120022003360210200228020021032002280204210a2002280208210c4103210b0c010b4104210b2002200041046a2802003600132000410c6a280200210a200041086a28020021030b200920016a2200200b3a0000200041016a2002280210360000200041046a2002280013360000200041106a200c3602002000410c6a200a360200200041086a2003360200200041146a20022903003702002000411c6a200241086a290300370200200541016a21052008200141246a2201470d000b0b20072005360200200241206a24000f0b1034000b1033000b880201047f024002402001280208220241ffffff3f712002470d0020024105742203417f4c0d00200128020021010240024020030d00410121040c010b200310242204450d020b20002004360200200041086a22044100360200200041046a20034105763602002000410020021093012004280200210302402002450d002002410574220241606a2105200028020020034105746a2100034020002001290000370000200041186a200141186a290000370000200041106a200141106a290000370000200041086a200141086a290000370000200041206a2100200141206a2101200241606a22020d000b200541057620036a41016a21030b200420033602000f0b1034000b1033000bed0103027f017e027f230041b0026b220224000240024020012802082203ad42b0027e2204422088a70d002004a72205417f4c0d00200128020021014108210602402005450d00200510242206450d020b20002006360200200041086a22064100360200200041046a200541b0026e36020020004100200310c5012006280200210502402003450d00200341b0026c21032000280200200541b0026c6a210603402002200110c601200541016a21052006200241b00210cf0641b0026a2106200141b0026a2101200341d07d6a22030d000b0b200041086a2005360200200241b0026a24000f0b1034000b1033000be20103017f017e017f02400240200041046a280200220320016b20024f0d0002400240200120026a22022001490d00200341017422012002200120024b1b22014104200141044b1bad42b0027e2204422088a722020d002004a722014100480d0020024541037421050240024002402000280200410020031b22020d0020010d01200521020c040b200341b0026c22032001460d03024020030d0020010d01410821020c040b20022003200110282202450d010c030b2001102422020d020b20050d030b102e000b20002002360200200041046a200141b0026e3602000b0f0b102c000b942205047f067e017f037e047f230041e0036b2202240002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012802000e170102030405060b0708090a0b0c0d0e0f10111213141500010b200241086a200141086a108d03200041086a200241086a41c80010cf061a200041163602000c150b200241086a200141086a108e0320004100360200200041186a200241086a41106a290300370300200041106a200241086a41086a290300370300200041086a20022903083703000c140b200241086a200141086a108f03200041086a200241086a41a00210cf061a200041013602000c130b20004102360200200041086a200141086a2903003703000c120b02400240024002400240024002400240024020012d0004417f6a220341044b0d00200141046a210420030e050102030405010b41bf80c700412841dcbcc700102f000b200141086a2802002103410121050c040b41022105200241b0026a41026a200441036a2d00003a0000200241086a41086a200141146a290200370300200241186a2001411c6a290200370300200241206a200141246a2d00003a0000200220042f00013b01b00220022001410c6a290200370308200141086a2802002103200141286a28020021010c040b200141086a2802002103410321050c020b200241b2026a200441036a2d00003a0000200241086a41086a200141146a290200370300200241186a2001411c6a290200370300200241206a200141246a2d00003a0000200220042f00013b01b00220022001410c6a29020037030820012d00254100472104200141086a2802002103200141286a2802002101410421050c030b200141086a2802002103410521050b0b0b200020053a0004200020022f01b0023b0005200020043a0025200020022f01d0033b0126200041086a20033602002000410c6a2002290308370200200041286a2001360200200041076a200241b2026a2d00003a0000200041146a200241086a41086a2903003702002000411c6a200241186a290300370200200041246a200241206a2d00003a0000200041033602000c110b02400240024002400240024002400240200141086a22032d0000417f6a220541034b0d0020050e0401020304010b41bf80c700412841dcbcc700102f000b200241106a200341096a290000370300200241186a200341116a290000370300200241206a200341196a29000037030020022003290001370308200141386a2903002106200141306a2903002107410121010c030b200241106a200341096a290000370300200241186a200341116a290000370300200241206a200341196a29000037030020022003290001370308200141c8006a2903002108200141c0006a2903002109200141386a2903002106200141306a2903002107410221010c030b200241106a200341096a290000370300200241186a200341116a290000370300200241206a200341196a290000370300200220032900013703082002200341216a2800003602b0022002200341246a2800003600b302200141c8006a3100002108200141c0006a2902002109200141386a2902002106200141306a2902002107200141d8006a290300210a200141d0006a290300210b410321010c030b200241106a200341096a290000370300200241186a200341116a290000370300200241206a200341196a29000037030020022003290001370308200141386a2903002106200141306a2903002107410421010b0b0b20002002290308370009200020022802b00236002920004104360200200041d8006a200a370300200041d0006a200b370300200041c8006a2008370300200041c0006a2009370300200041386a2006370300200041306a2007370300200041086a20013a00002000412c6a20022800b302360000200041116a200241086a41086a290300370000200041196a200241186a290300370000200041216a200241206a2903003700000c100b200241086a200141046a10c001200041053602002000410c6a200241106a280200360200200020022903083702040c0f0b024002402001280204450d00200241b0026a41186a200141286a290000370300200241b0026a41106a200141206a290000370300200241b8026a200141186a290000370300200241b0026a41286a200141386a290000370300200241b0026a41306a200141c0006a290000370300200241b0026a41386a200141c8006a290000370300200241b0026a41c8006a200141d8006a290000370300200241b0026a41d0006a200141e0006a290000370300200241b0026a41d8006a200141e8006a2900003703002002200141106a2900003703b0022002200141306a2900003703d0022002200141d0006a2900003703f002200241b0026a41f8006a20014188016a290000370300200241b0026a41f0006a20014180016a290000370300200241b0026a41e8006a200141f8006a290000370300200241b0026a4198016a200141a8016a290000370300200241b0026a4190016a200141a0016a290000370300200241b0026a4188016a20014198016a2900003703002002200141f0006a29000037039003200220014190016a2900003703b003200241086a200141046a10c801200241146a200241b0026a41a00110cf061a0c010b200241003602080b200041046a200241086a41ac0110cf061a200041073602000c0e0b20004108360200200020012802043602040c0d0b200241086a200141086a109003200041086a200241086a41980210cf061a200041093602000c0c0b20012802042103200241086a200141086a10c801200241d0036a200141146a10d001200241086a41146a200241d0036a41086a280200360200200220022903d003370214200241b0026a41106a200241086a41106a2903002206370300200241b0026a41086a200241086a41086a29030022073703002002200229030822083703b002200141206a2902002109200141286a280200210520002003360204200041086a2008370200200041106a2007370200200041186a2006370200200041286a2005360200200041206a20093702002000412c6a2001412c6a290200370200200041346a200141346a2902003702002000413c6a2001413c6a290200370200200041c4006a200141c4006a290200370200200041cc006a200141cc006a290200370200200041d4006a200141d4006a290200370200200041dc006a200141dc006a290200370200200041e4006a200141e4006a2902003702002000410a3602000c0b0b108103000b200241086a200141086a109103200041086a200241086a41a00210cf061a2000410c3602000c090b2000410d3602000c080b200241086a200141046a10b702200041046a200241086a41c80010cf061a2000410e3602000c070b024002400240024020012f0104417f6a220341014b0d0020030e020102010b41bf80c700412841dcbcc700102f000b200241086a200141086a10c401200229020c210620022802082103410121010c010b20012f0106210541b00210242203450d082003200141086a28020010c601410221010b200020013b01042000410f3602002000410c6a2006370200200041086a2003360200200041066a20053b01000c060b200241086a200141086a10d002200041086a200241086a41a80210cf061a200041103602000c050b200241086a200141046a109203200041046a200241086a41c40010cf061a200041113602000c040b02400240024002400240200141086a22032d0000417f6a220c41034b0d00420021064101210542002109200c0e0404010203040b41bf80c700412841dcbcc700102f000b200241206a200341196a290000370300200241186a200341116a290000370300200241106a200341096a290000370300200220032900013703084200210641022105420021090c020b200241106a200341096a290000370300200241186a200341116a290000370300200241206a200341196a29000037030020022003290001370308200141c8006a2903002108200141c0006a2903002107200141386a290300210d200141306a290300210e200141d0006a28020021044200210641032105420021090c010b200241106a200341096a290000370300200241186a200341116a290000370300200241206a200341196a290000370300200220032900013703082002200341216a2800003602b0022002200341246a2800003600b302200141d0006a290300220f428080808070832106200141d8006a2903002109200141c8006a3100002108200141c0006a2902002107200141386a290200210d200141306a290200210e200141e8006a290300210b200141e0006a290300210a200141f0006a2802002110200fa72104410421050b20002002290308370009200020022802b002360029200041e8006a200b370300200041e0006a200a370300200041d8006a2009370300200041c8006a2008370300200041c0006a2007370300200041386a200d370300200041306a200e370300200041086a20053a00002000412c6a20022800b302360000200041f0006a2010360200200041d0006a20062004ad84370300200041116a200241086a41086a290300370000200041196a200241186a290300370000200041216a200241206a290300370000200041123602000c030b200241086a200141046a10930320004113360200200041246a200241286a2802003602002000411c6a200241206a290300370200200041146a200241186a2903003702002000410c6a200241106a290300370200200020022903083702040c020b200241086a200141086a10940320004114360200200041286a200241086a41206a290300370300200041206a200241086a41186a290300370300200041186a200241086a41106a290300370300200041106a200241086a41086a290300370300200041086a20022903083703000c010b024002400240024002400240024020012d0004417f6a221141054b0d004104210520110e06010203060405010b41bf80c700412841dcbcc700102f000b200241086a41086a2205200141106a290000370300200241086a41106a2212200141186a290000370300200241086a41156a22132001411d6a2900003700002002200141086a29000037030820012f0006211020012d0005210420012d0025210c41b00210242203450d062003200141286a280200109503200241b0026a41156a2013290000370000200241b0026a41106a2012290300370300200241b0026a41086a2005290300370300200220022903083703b002410121050c040b200241b0026a41086a200141106a290200370300200241b0026a41106a200141186a290200370300200241c5026a2001411d6a2900003700002002200141086a2902003703b00220012f0006211020012d0005210420012d0025210c410221050c030b200241b0026a41086a200141106a290200370300200241b0026a41106a200141186a290200370300200241c5026a2001411d6a2900003700002002200141086a2902003703b00220012f0006211020012d0005210420012d0025210c410321050c020b20012f0106211020012d00052104410521050c010b200241b0026a41086a200141106a290200370300200241b0026a41106a200141186a290200370300200241c5026a2001411d6a2900003700002002200141086a2902003703b0022001412c6a2802002113200141286a280200210320012f0006211020012d0005210420012f0126211220012d0025210c410621050b200020043a0005200020053a00042000200c3a002520004115360200200041066a20103b0100200041086a20022903b0023702002000412c6a2013360200200041286a2003360200200041266a20123b0100200041106a200241b0026a41086a290300370200200041186a200241b0026a41106a2903003702002000411d6a200241b0026a41156a2900003700000b200241e0036a24000f0b102c000ba10204017f017e027f037e0240024020012802082202ad42287e2203422088a70d002003a72204417f4c0d00200128020021014108210502402004450d00200410242205450d020b20002005360200200041086a22054100360200200041046a200441286e3602002000410020021090012005280200210402402002450d00200241286c21052000280200200441286c6a21020340200141086a2903002103200141106a2903002106200141186a290300210720012903002108200241206a200141206a290300370300200241186a2007370300200241106a2006370300200241086a200337030020022008370300200241286a2102200441016a2104200141286a2101200541586a22050d000b0b200041086a20043602000f0b1034000b1033000b870101037f0240024020012802082202417f4c0d00200128020021030240024020020d0041012101410021040c010b200210242201450d02200221040b20002001360200200041086a220141003602002000200436020420004100200210c9012000280200200128020022006a2003200210cf061a2001200020026a3602000f0b1034000b1033000b9a0101017f0240200041046a280200220320016b20024f0d000240024002400240200120026a22022001490d00200341017422012002200120024b1b22014108200141084b1b22014100480d002000280200410020031b2202450d0120032001460d032003450d0120022003200110282202450d020c030b102e000b2001102422020d010b102c000b20002002360200200041046a20013602000b0b830203027f017e037f230041106b220224000240024020012802082203ad420c7e2204422088a70d002004a72205417f4c0d00200128020021014104210602402005450d00200510242206450d020b20002006360200200041086a22074100360200200041046a2005410c6e36020020004100200310cb012007280200210602402003450d002003410c6c210520002802002006410c6c6a210020062003410274417c6a4102766a210303402002200110c801200041086a200241086a280200360200200020022903003702002000410c6a21002001410c6a2101200541746a22050d000b200341016a21060b20072006360200200241106a24000f0b1034000b1033000bdf0103017f017e017f02400240200041046a280200220320016b20024f0d0002400240200120026a22022001490d00200341017422012002200120024b1b22014104200141044b1bad420c7e2204422088a722020d002004a722014100480d0020024541027421050240024002402000280200410020031b22020d0020010d01200521020c040b2003410c6c22032001460d03024020030d0020010d01410421020c040b20022003200110282202450d010c030b2001102422020d020b20050d030b102e000b20002002360200200041046a2001410c6e3602000b0f0b102c000b8c0405027f017e0a7f067e017f230041c0006b220224000240024020012802082203ad42c1007e2204422088a70d002004a72205417f4c0d00200128020021010240024020050d00410121060c010b200510242206450d020b20002006360200200041086a22074100360200200041046a200541c1006e36020020004100200310cd012007280200210802402003450d002001200341c1006c6a21092000280200200841c1006c6a2100200241386a2105200241306a2106200241286a210a200241206a210b200241186a210c200241106a210d200241086a210e0340200141016a2900002104200141096a290000210f200141116a2900002110200141196a2900002111200141216a2900002112200141296a2900002113200141316a290000211420012d000021152005200141396a29000037030020062014370300200a2013370300200b2012370300200c2011370300200d2010370300200e200f37030020022004370300200020153a0000200041016a2002290300370000200041096a200e290300370000200041116a200d290300370000200041196a200c290300370000200041216a200b290300370000200041296a200a290300370000200041316a2006290300370000200041396a2005290300370000200041c1006a2100200141c1006a22012009470d000b200820036a21080b20072008360200200241c0006a24000f0b1034000b1033000bdf0103017f017e017f02400240200041046a280200220320016b20024f0d0002400240200120026a22022001490d00200341017422012002200120024b1b22014104200141044b1bad42c1007e2204422088a722020d002004a722014100480d0020024521050240024002402000280200410020031b22020d0020010d01200521020c040b200341c1006c22032001460d03024020030d0020010d01410121020c040b20022003200110282202450d010c030b2001102422020d020b20050d030b102e000b20002002360200200041046a200141c1006e3602000b0f0b102c000ba70201057f230041106b22022400024002402001280208220341ffffffff00712003470d0020034104742204417f4c0d00200128020021014104210502402004450d00200410242205450d020b20002005360200200041086a22064100360200200041046a200441047636020020004100200310cf012006280200210502402003450d00200028020020054104746a210020052003410474220441706a4104766a41016a21050340410221030240024002402001410c6a2d00004103710e03000102000b410021030c010b410121030b2002200110c80120002002290300370200200220033a000c200041086a200241086a290300370200200041106a2100200141106a2101200441706a22040d000b0b20062005360200200241106a24000f0b1034000b1033000be10101027f02400240200041046a280200220320016b20024f0d0002400240200120026a22022001490d00200341017422012002200120024b1b22014104200141044b1b220141ffffffff007122042001470d00200141047422024100480d00200420014641027421040240024002402000280200410020031b22010d0020020d01200421010c040b200341047422032002460d03024020030d0020020d01410421010c040b20012003200210282201450d010c030b2002102422010d020b20040d030b102e000b20002001360200200041046a20024104763602000b0f0b102c000b830203027f017e037f230041106b220224000240024020012802082203ad420c7e2204422088a70d002004a72205417f4c0d00200128020021014104210602402005450d00200510242206450d020b20002006360200200041086a22074100360200200041046a2005410c6e36020020004100200310cb012007280200210602402003450d002003410c6c210520002802002006410c6c6a210020062003410274417c6a4102766a210303402002200110c801200041086a200241086a280200360200200020022903003702002000410c6a21002001410c6a2101200541746a22050d000b200341016a21060b20072006360200200241106a24000f0b1034000b1033000bdf0103017f017e017f02400240200041046a280200220320016b20024f0d0002400240200120026a22022001490d00200341017422012002200120024b1b22014104200141044b1bad42247e2204422088a722020d002004a722014100480d0020024541027421050240024002402000280200410020031b22020d0020010d01200521020c040b200341246c22032001460d03024020030d0020010d01410421020c040b20022003200110282202450d010c030b2001102422020d020b20050d030b102e000b20002002360200200041046a200141246e3602000b0f0b102c000bcd0403037f017e037f230041e00a6b2202240020022001108d01024002402002280200450d00200041003602000c010b0240024020022802042203200128020028020441c8036e2204200420034b1bad42c8037e2205422088a70d002005a72204417f4c0d000240024020040d00410821060c010b200410242206450d020b2001200128020441016a220736020420024100360210200220063602082002200441c8036e36020c024002400240200720012802084b0d0002402003450d0020024198076a41f0006a210841002104034020024198076a200110d301200241b0066a20024198076a41e80010cf061a2002290380082105200241d8036a200841d80210cf061a20054203510d03200241f0026a200241b0066a41e80010cf061a200241186a200241d8036a41d80210cf061a02402004200228020c470d00200241086a200410d40120022802102104200228020821060b2006200441c8036c6a200241f0026a41e80010cf0622072005370368200741f0006a200241186a41d80210cf061a2002200441016a22043602102003417f6a22030d000b200128020421070b2000200229030837020020012007417f6a360204200041086a200241086a41086a2802003602000c050b20004100360200200241086a21030c010b20004100360200200241086a21032004450d00200441c8036c210120022802084198016a21040340200410d501200441c8036a2104200141b87c6a22010d000b0b200341046a2802002204450d02200441c8036c450d02200328020010260c020b1034000b1033000b200241e00a6a24000bae1804057f017e047f067e230041e00a6b22022400200241206a2001108d01024002400240024002400240024002400240024020022802200d002002280224210320012001280204220441016a2205360204200520012802084b0d0002402003450d0041002105410020036b2103034020054101460d0620032005417f6a2205470d000b0b20012004360204200128020022052802042203450d01200528020022062d0000210420052003417f6a3602042005200641016a360200200441ff00714104470d024100210520044118744118754100480d03420221070c070b200042033703680c080b200042033703680c070b200042033703680c060b200241003a00c804024002400240024002400240024002400340200128020022032802042204450d01200241a8046a20056a200328020022062d00003a000020032004417f6a3602042003200641016a3602002002200541016a22053a00c80420054120470d000b200241f8016a41186a200241a8046a41186a2903002207370300200241e0066a41086a200241a8046a41086a290300370300200241e0066a41106a200241a8046a41106a290300370300200241e0066a41186a2007370300200220022903a8043703e006200128020022052802042204450d09200528020022062d0000210320052004417f6a3602042005200641016a360200200341024b0d0920030e03010203010b200541ff0171450d08200241003a00c8040c080b41002105200241003a00e80402400340200128020022032802042204450d01200241a8046a20056a200328020022062d00003a000020032004417f6a3602042003200641016a3602002002200541016a22053a00e804200541c000470d000b200241f8016a41086a2205200241a8046a41086a290300370300200241f8016a41106a2203200241a8046a41106a290300370300200241f8016a41186a2204200241a8046a41186a290300370300200241f8016a41206a2206200241a8046a41206a290300370300200241f8016a41286a2208200241a8046a41286a290300370300200241f8016a41306a2209200241a8046a41306a290300370300200241f8016a41386a220a200241a8046a41386a290300370300200220022903a8043703f801200241980a6a41386a220b200a290300370300200241980a6a41306a20092903002207370300200241980a6a41286a2008290300220c370300200241980a6a41206a2006290300220d370300200241980a6a41186a2004290300220e370300200241980a6a41106a2003290300220f370300200241980a6a41086a20052903002210370300200220022903f80122113703980a200241d0096a41306a22052007370300200241d0096a41286a2203200c370300200241d0096a41206a2204200d370300200241d0096a41186a2206200e370300200241d0096a41106a2208200f370300200241d0096a41086a22092010370300200241d0096a41386a220a200b290300370300200220113703d009200241c8076a41386a200a290300370300200241c8076a41306a2005290300370300200241c8076a41286a2003290300370300200241c8076a41206a2004290300370300200241c8076a41186a2006290300370300200241c8076a41106a2008290300370300200241c8076a41086a2009290300370300200220022903d0093703c807410021030c030b200541ff0171450d07200241003a00e804420221070c080b41002105200241003a00e80402400340200128020022032802042204450d01200241a8046a20056a200328020022062d00003a000020032004417f6a3602042003200641016a3602002002200541016a22053a00e804200541c000470d000b200241f8016a41086a2205200241a8046a41086a290300370300200241f8016a41106a2203200241a8046a41106a290300370300200241f8016a41186a2204200241a8046a41186a290300370300200241f8016a41206a2206200241a8046a41206a290300370300200241f8016a41286a2208200241a8046a41286a290300370300200241f8016a41306a2209200241a8046a41306a290300370300200241f8016a41386a220a200241a8046a41386a290300370300200220022903a8043703f801200241980a6a41386a220b200a290300370300200241980a6a41306a20092903002207370300200241980a6a41286a2008290300220c370300200241980a6a41206a2006290300220d370300200241980a6a41186a2004290300220e370300200241980a6a41106a2003290300220f370300200241980a6a41086a20052903002210370300200220022903f80122113703980a200241d0096a41306a22052007370300200241d0096a41286a2203200c370300200241d0096a41206a2204200d370300200241d0096a41186a2206200e370300200241d0096a41106a2208200f370300200241d0096a41086a22092010370300200241d0096a41386a220a200b290300370300200220113703d009200241c8076a41386a200a290300370300200241c8076a41306a2005290300370300200241c8076a41286a2003290300370300200241c8076a41206a2004290300370300200241c8076a41186a2006290300370300200241c8076a41106a2008290300370300200241c8076a41086a2009290300370300200220022903d0093703c807410121030c020b200541ff0171450d06200241003a00e804420221070c070b41002105200241003a00e9040340200128020022032802042204450d02200241a8046a20056a200328020022062d00003a000020032004417f6a3602042003200641016a3602002002200541016a22053a00e904200541c100470d000b200241f8016a200241a8046a41c10010cf061a200241980a6a200241f8016a41c10010cf061a200241d0096a200241980a6a41c10010cf061a200241c8076a200241d0096a41c10010cf061a410221030b20024187076a200241c8076a41c10010cf061a200128020022052802042204450d0420052802002206310000210d20052004417f6a3602042005200641016a360200200d50450d01420021070c020b200541ff0171450d03200241003a00e904420221070c040b200128020022052802042204450d0220052802002206310000210e20052004417f6a3602042005200641016a3602004202200d420f8386220c4204540d0242012107200e420886200d84420488200c420c88220d4201200d4201561b7e220d200c5a0d020b200241186a2001108d0120022802180d01200228021c21042002200110ec042002290300a70d01200241106a290300210f2002290308210e200241f8016a41186a200241e0066a41186a290300370300200241f8016a41106a200241e0066a41106a290300370300200241f8016a41086a200241e0066a41086a290300370300200220022903e0063703f801200241a8046a20024187076a41c10010cf061a200241980a6a41046a200241da066a41046a2f01003b0100200220022801da063602980a0c020b102e000b420221070b200241d8016a41186a2205200241f8016a41186a290300370300200241d8016a41106a2206200241f8016a41106a290300370300200241d8016a41086a2208200241f8016a41086a290300370300200220022903f8013703d80120024197016a200241a8046a41c10010cf061a20024190016a41046a2209200241980a6a41046a2f01003b0100200220022802980a3602900120074202510d01200241f0006a41186a2005290300370300200241f0006a41106a2006290300370300200241f0006a41086a2008290300370300200220022903d8013703702002412f6a20024197016a41c10010cf061a200241286a41046a20092f01003b010020022002280290013602280b200241a8046a200110b40220022802a8042105200241f8016a200241a8046a41047241ac0210cf061a024020054117460d0020002002290370370300200020033a0020200041186a200241f0006a41186a290300370300200041106a200241f0006a41106a290300370300200041086a200241f0006a41086a290300370300200041216a2002412f6a41c10010cf061a200041e6006a200241286a41046a2f01003b01002000200228022836016220004188016a200f37030020004180016a200e37030020004198016a200536020020004190016a2004360200200041f8006a200d3703002000200c370370200020073703682000419c016a200241f8016a41ac0210cf061a0c020b200042033703680c010b200042033703680b200241e00a6a24000bdd0103027f017e017f02400240200041046a2802002001470d0002400240200141016a22022001490d00200141017422032002200320024b1b22024104200241044b1bad42c8037e2204422088a722030d002004a722024100480d0020034541037421050240024002402000280200410020011b22030d0020020d01200521030c040b200141c8036c22012002460d03024020010d0020020d01410821030c040b20032001200210282203450d010c030b2002102422030d020b20050d030b102e000b20002003360200200041046a200241c8036e3602000b0f0b102c000b9a1a01047f024002402000280200220141154b0d000240024002400240024002400240024002400240024002400240024020010e1600010f0f0f020f030f04050f060f0708090a0f0b0c0d000b200041086a280200417e6a220141074b0d0e02400240024002400240024020010e080014010214030405000b200041106a280200450d132000410c6a28020010260f0b200041106a280200450d122000410c6a28020010260f0b200041106a280200450d112000410c6a28020010260f0b0240200041146a2802002202450d002000410c6a2802002101200241186c210203400240200141046a280200450d00200128020010260b0240200141106a280200450d002001410c6a28020010260b200141186a2101200241686a22020d000b0b200041106a2802002201450d10200141186c450d10200028020c10260f0b0240200041146a2802002202450d002000410c6a28020021012002410c6c210203400240200141046a280200450d00200128020010260b2001410c6a2101200241746a22020d000b0b200041106a2802002201450d0f2001410c6c450d0f200028020c10260f0b200041106a280200450d0e2000410c6a28020010260f0b0240200041086a280200220141014b0d00024020010e020f000f0b2000412c6a220210d6010240200041306a2802002201450d00200141246c450d00200228020010260b2000419c016a220210d6010240200041a0016a2802002201450d00200141246c450d00200228020010260b0240200041186a2802002202450d00200041106a28020021012002410c6c210203400240200141046a280200450d00200128020010260b2001410c6a2101200241746a22020d000b0b200041146a2802002201450d0e2001410c6c450d0e200028021010260f0b2000412c6a220210d6010240200041306a2802002201450d00200141246c450d00200228020010260b2000419c016a220210d6010240200041a0016a2802002201450d00200141246c450d00200228020010260b0240200041186a2802002202450d00200041106a28020021012002410c6c210203400240200141046a280200450d00200128020010260b2001410c6a2101200241746a22020d000b0b200041146a2802002201450d0d2001410c6c450d0d200028021010260f0b02402000410c6a2802002201450d00200141f0006c2102200028020441046a21010340200110d6010240200141046a2802002203450d00200341246c450d00200128020010260b200141f0006a2101200241907f6a22020d000b0b200041086a2802002201450d0c200141f0006c450d0c200028020410260f0b20002802042201450d0b200041086a280200450d0b200110260f0b200041086a280200417f6a220141014b0d0a0240024020010e020001000b0240200041186a2802002202450d00200041106a28020021012002410c6c210203400240200141046a280200450d00200128020010260b2001410c6a2101200241746a22020d000b0b200041146a2802002201450d0b2001410c6c450d0b200028021010260f0b0240200041186a2802002202450d00200041106a28020021012002410c6c210203400240200141046a280200450d00200128020010260b2001410c6a2101200241746a22020d000b0b200041146a2802002201450d0a2001410c6c450d0a200028021010260f0b02402000410c6a280200450d00200041086a28020010260b02402000411c6a2802002202450d00200041146a28020021012002410c6c210203400240200141046a280200450d00200128020010260b2001410c6a2101200241746a22020d000b0b200041186a2802002201450d092001410c6c450d09200028021410260f0b0240200041086a2d0000220141034b0d000240024020010e040b00010b0b0b0240200041146a2802002201450d002000410c6a280200220320014198026c6a210403400240200341d8006a280200450d00200328025410260b0240200341186a2802002202450d00200328021021012002410474210203400240200141046a280200450d00200128020010260b200141106a2101200241706a22020d000b0b0240200341146a28020041ffffffff0071450d00200328021010260b0240200328021c2201450d00200341206a280200450d00200110260b024020034184026a2802002201450d00200141c1006c450d0020032802800210260b20034198026a210120034190026a4100360200200328028c0221022003410136028c02024020034194026a280200450d00200210260b2001210320012004470d000b0b200041106a2802002201450d0a20014198026c450d0a200028020c10260f0b0240200041186a2802002202450d00200041106a28020021012002410c6c210203400240200141046a280200450d00200128020010260b2001410c6a2101200241746a22020d000b0b200041146a2802002201450d092001410c6c450d09200028021010260f0b200041146a280200450d08200041106a28020010260f0b20002d0004417f6a220141034b0d070240024020010e0400090901000b0240200041106a280200450d002000410c6a28020010260b2000411c6a280200450d08200041186a28020010260f0b02402000410c6a280200450d00200041086a28020010260b200041186a280200450d07200041146a28020010260f0b024020002f0104220141014b0d00024020010e020800080b0240200041106a2802002202450d00200041086a2802002101200241b0026c21020340200110d501200141b0026a2101200241d07d6a22020d000b0b2000410c6a2802002201450d07200141b0026c450d07200028020810260f0b200041086a220128020010d501200128020010260f0b200041086a2d0000417e6a2201410b4b0d05024002400240024020010e0c000109090909090909090203000b0240200041146a2802002202450d002000410c6a2802002201200241c8006c6a21020340024020012d00004101470d00200141086a280200450d00200141046a28020010260b0240200141246a2d00004101470d002001412c6a280200450d00200141286a28020010260b200141c8006a22012002470d000b0b0240200041106a2802002201450d00200141c8006c450d00200028020c10260b0240200041186a2d00004101470d00200041206a280200450d002000411c6a28020010260b02402000413c6a2d00004101470d00200041c4006a280200450d00200041c0006a28020010260b0240200041e0006a2d00004101470d00200041e8006a280200450d00200041e4006a28020010260b024020004184016a2d00004101470d002000418c016a280200450d0020004188016a28020010260b0240200041a8016a2d00004101470d00200041b0016a280200450d00200041ac016a28020010260b0240200041cc016a2d00004101470d00200041d4016a280200450d00200041d0016a28020010260b200041f0016a2d00004101470d08200041f8016a280200450d08200041f4016a28020010260f0b0240200041146a2802002201450d00200141c4006c21022000410c6a28020041286a210103400240200141786a2d00004101470d002001280200450d002001417c6a28020010260b200141c4006a2101200241bc7f6a22020d000b0b200041106a2802002201450d07200141c4006c450d07200028020c10260f0b2000412c6a2d00004101470d06200041346a280200450d06200041306a28020010260f0b2000412c6a2d00004101470d05200041346a280200450d05200041306a28020010260f0b20002d0004417f6a220141024b0d040240024020010e03000601000b200041286a220128020010d501200128020010260f0b2000410c6a28020041ffffff3f71450d04200041086a28020010260f0b024020002d0004220141054b0d00024002400240024020010e06080008010203080b200041186a220128020010d501200128020010260f0b02402000410c6a280200450d00200041086a28020010260b200041246a220128020010d501200128020010260f0b2000410c6a280200450d05200041086a28020010260c050b200041186a220128020010d501200128020010260f0b02402000410c6a280200450d00200041086a28020010260b200041246a220128020010d501200128020010260f0b0240200041086a2d0000220141034b0d000240024020010e0405000105050b2000410c6a220128020010d501200128020010260f0b2000410c6a220128020010d501200128020010260f0b2000412c6a220128020010d501200128020010260f0b20002d00044101470d01200041286a220128020010d501200128020010260f0b0240200041086a2d0000220141034b0d0002400240024020010e0404000102040b0240200041106a28020041ffffff3f71450d002000410c6a28020010260b200041186a220128020010d501200128020010260f0b0240200041106a28020041ffffff3f71450d002000410c6a28020010260b200041286a280200450d02200041246a28020010260f0b200041306a28020041ffffff3f71450d012000412c6a28020010260f0b200041306a28020041ffffff3f71450d002000412c6a28020010260f0b0bb10101027f024020002802082201450d0020002802002100200141246c210103400240024020002d0000220241044b0d0002400240024020020e050400010204040b2000410c6a280200450d03200041086a28020010260c030b2000410c6a280200450d02200041086a28020010260c020b2000410c6a280200450d01200041086a28020010260c010b200041086a280200450d00200041046a28020010260b200041246a21002001415c6a22010d000b0b0bd60101017f024002402000280200220141034b0d0002400240024020010e0404000102040b0240200041086a28020041244d0d00200041106a28020010260b200041386a280200450d03200041346a28020010260f0b200041086a28020041244d0d02200041106a28020010260f0b20002802041026200041086a2802002201450d012000410c6a280200450d01200110260c010b0240200041086a28020041244d0d00200041106a28020010260b200041346a2802001026200041386a2802002201450d002000413c6a280200450d00200110260f0b0b960101047f2000200041086a2202280200200128020420012802006b10c901200228020021030240200128020022042001280204460d00200028020021052001200441016a36020020042d0000210002400340200520036a20003a0000200128020022002001280204460d01200341016a21032001200041016a36020020002d000021000c000b0b200341016a21030b200220033602000b920503037f017e067f230041206b22022400200241086a2001108d01024002402002280208450d00200041003602000c010b0240024002400240024002400240200228020c22032001280200280204410c6e2204200420034b1bad420c7e2205422088a70d002005a72204417f4c0d000240024020040d00410421060c010b200410242206450d020b2001200128020441016a2207360204200241003602182002200636021020022004410c6e360214200720012802084b0d022003450d0441002108034020022001108d0120022802000d0620012802002207280204220920022802042204490d062004417f4c0d010240024020040d004100210a4101210b0c010b2004102a220b450d032001280200220728020421092004210a0b0240024020092004490d00200b2007280200200410cf0621092007280204220b20044f0d012004200b41b8afc0001048000b200a450d07200b10260c070b2007200b20046b3602042007200728020020046a3602002009450d062004ad422086200aad842105024020082002280214470d00200241106a2008410110cb0120022802182108200228021021060b20062008410c6c6a22042005370204200420093602002002200841016a22083602182003417f6a2203450d040c000b0b1034000b1033000b20004100360200200241106a21070c030b200128020421070b2000200229031037020020012007417f6a360204200041086a200241106a41086a2802003602000c020b20004100360200200241106a21072008450d00200228021021042008410c6c210103400240200441046a280200450d00200428020010260b2004410c6a2104200141746a22010d000b0b200741046a2802002204450d002004410c6c450d00200728020010260b200241206a24000bd30603097f017e017f23004180026b2202240020022001108d01024002402002280200450d00200041003602000c010b0240024002402002280204220320012802002802044105762204200420034b1b22044105742205417f4c0d004101210602402004450d00200510242206450d020b2001200128020441016a2205360204200241003602102002200436020c2002200636020802400240200520012802084b0d0002402003450d0041002107410021080340200241003a00b801200841016a2108410021040340200128020022052802042209450d0420024198016a20046a2005280200220a2d00003a000020052009417f6a3602042005200a41016a3602002002200441016a22043a00b80120044120470d000b200241f8006a41186a20024198016a41186a290300220b370300200241d8006a41086a220420024198016a41086a290300370300200241d8006a41106a220520024198016a41106a290300370300200241d8006a41186a2209200b3703002002200229039801370358200241386a41186a220a2009290300370300200241386a41106a22092005290300370300200241386a41086a2205200429030037030020022002290358370338200241186a41186a220c200a290300370300200241186a41106a220a2009290300370300200241186a41086a220920052903003703002002200229033837031802402007200228020c470d00200241086a2007410110930120022802102107200228020821060b200620074105746a22042002290318370000200441186a200c290300370000200441106a200a290300370000200441086a20092903003700002002200741016a220736021020082003470d000b200128020421050b2000200229030837020020012005417f6a360204200041086a200241086a41086a2802003602000c050b20004100360200200241086a21040c030b0240200441ff0171450d00200241003a00b8010b200241386a41086a200241d8006a41086a290300370300200241386a41106a200241d8006a41106a290300370300200241386a41186a200241d8006a41186a2903003703002002200229035837033820004100360200200241086a21040c020b1034000b1033000b200441046a28020041ffffff3f71450d00200428020010260b20024180026a24000be7380c037f017e127f027e177f027e047f047e1a7f067e107f027e230041e00a6b22022400200241206a2001108f01024002402002280220450d00200041003602000c010b024002402002280224220320012802044198026e2204200420034b1bad4298027e2205422088a70d002005a72204417f4c0d0002400240024020040d00410821060c010b200410242206450d010b2002410036023020022006360228200220044198026e36022c02402003450d00200241980a6a410172210741002108410021090340024002402001280204220a41044f0d00200c210b4100210a0c010b2001280200220d280000210e2001200a417c6a220f3602042001200d41046a36020041002104200241003a00b80a200a417b6a210a024002400340200f2004460d01200241980a6a20046a200d20046a220b41046a2d00003a00002001200a3602042001200b41056a3602002002200441016a220b3a00b80a200a417f6a210a200b2104200b4120460d020c000b0b0240200441ff0171450d00200241003a00b80a0b200c210b4100210a0c010b200241d8096a41086a2210200241980a6a41086a2211290300370300200241d8096a41106a2212200241980a6a41106a2213290300370300200241d8096a41186a220f200241980a6a41186a2214290300370300200220022903980a3703d8090240200b41ff0171411f4b0d00200c210b4100210a0c010b200241f8056a41086a22152010290300370300200241f8056a41106a22162012290300370300200241f8056a41186a2217200f290300370300200220022903d8093703f805200241186a2001108f014100210d024002400240024002400240024002400240024002400240024020022802180d004100210d02402001280204220a200228021c2204490d002004417f4c0d120240024020040d004100210b4101210d0c010b2004102a220d450d122001280204210a2004210b0b0240200a2004490d00200d2001280200200410cf061a2001280204220a2004490d032004ad422086200bad8421182001200a20046b3602042001200128020020046a3602000c010b0240200b450d00200d10260b4100210d0b20182019200d1b21190b2019a7201a200d1b211a2019422088a7201b200d1b211b024002400240200d450d004100210a200241003a00b80a2001280204417f6a210402400240024002400240024002400240024003402004417f460d01200241980a6a200a6a2001280200220b2d00003a0000200120043602042001200b41016a3602002002200a41016a220b3a00b80a2004417f6a2104200b210a200b4120470d000b2010201129030037030020122013290300370300200f2014290300370300200220022903980a3703d809200b41ff0171411f4d0d0120024198066a41086a221c201029030037030020024198066a41106a221d201229030037030020024198066a41186a221e200f290300370300200220022903d80922053703f8062002200537039806200241980a6a200110dc0120022d00980a4101460d04200241d8096a41386a221f200741386a2220290000370300200241d8096a41306a2221200741306a2222290000370300200241d8096a41286a2223200741286a2224290000370300200241d8096a41206a2225200741206a2226290000370300200f200741186a22272900003703002012200741106a22282900003703002010200741086a2229290000370300200220072900003703d80941002104200241003a00b80a2001280204212a417f210a0340202a2004460d03200241980a6a20046a2001280200220b2d00003a00002001202a200a6a3602042001200b41016a3602002002200441016a220b3a00b80a200a417f6a210a200b2104200b4120470d000b200241d8086a41086a222b2011290300370300200241d8086a41106a222c2013290300370300200241d8086a41186a222d2014290300370300200220022903980a3703d808200b41ff0171411f4d0d03200241b8066a41086a222e202b290300370300200241b8066a41106a222f202c290300370300200241b8066a41186a2230202d290300370300200220022903d8083703b806202a200b6b22044110490d072001280200220a41086a2900002131200a29000021322001200a41106a3602002001200441706a360204200241980a6a200110dd0120022802980a220a450d07200229029c0a21054100210b200241003a00b80a2001280204417f6a210403402004417f460d06200241980a6a200b6a2001280200222a2d00003a0000200120043602042001202a41016a3602002002200b41016a222a3a00b80a2004417f6a2104202a210b202a4120470d000b202b2011290300370300202c2013290300370300202d2014290300370300200220022903980a3703d808202a41ff0171411f4d0d06200241f8066a41086a2233202b290300370300200241f8066a41106a2234202c290300370300200241f8066a41186a2235202d290300370300200220022903d8083703f8062004417f470d080c130b200a41ff0171450d00200241003a00b80a0b0240201a450d00200d10260b200c210b4100210a0c160b200441ff0171450d00200241003a00b80a0b0240201a450d00200d10260b200c210b4100210a0c140b0240201a450d00200d10260b200c210b4100210a0c130b200b41ff0171450d00200241003a00b80a0b02402005422088a72204450d002004410474210b200a210403400240200441046a280200450d00200428020010260b200441106a2104200b41706a220b0d000b0b200542ffffffff008350450d070b200c210b0c0e0b2001280200220b2d0000212a200120043602042001200b41016a360200202a41014b0d0a4100210b02400240202a0e020100010b200241106a2001108f0120022802100d0b4100210402402001280204222a2002280214220b490d00200b417f4c0d1502400240200b0d0041002136410121040c010b200b102a2204450d152001280204212a200b21360b0240202a200b490d0020042001280200200b10cf061a2001280204222a200b490d07200bad4220862036ad8421372001202a200b6b36020420012001280200200b6a3602000c010b02402036450d00200410260b410021040b2037203820041b2238203920041b2239203a20041b213a2004200c20041b210b2004450d0c0b203aa7213b02400240200128020422044104490d002001280200220c280000213c20012004417c6a3602042001200c41046a360200200241d8056a41086a22042033290300370300200241d8056a41106a220c2034290300370300200241d8056a41186a22332035290300370300200241b8056a41186a22342017290300370300200241b8056a41106a22352016290300370300200241b8056a41086a22362015290300370300200220022903f8063703d805200220022903f8053703b80520024198056a41186a223d201e29030037030020024198056a41106a223e201d29030037030020024198056a41086a223f201c29030037030020022002290398063703980520024198096a41386a2217201f29030037030020024198096a41306a221c202129030037030020024198096a41286a221d202329030037030020024198096a41206a221e202529030037030020024198096a41186a222a200f29030037030020024198096a41106a2215201229030037030020024198096a41086a22162010290300370300200220022903d80937039809200241f8046a41186a22402030290300370300200241f8046a41106a2230202f290300370300200241f8046a41086a222f202e290300370300200220022903b8063703f804200241d8046a41186a22412033290300370300200241d8046a41106a2242200c290300370300200241d8046a41086a22432004290300370300200220022903d8053703d804200241b8046a41186a22442034290300370300200241b8046a41106a22452035290300370300200241b8046a41086a22462036290300370300200220022903b8053703b80420024198046a41186a2247203d29030037030020024198046a41106a2248203e29030037030020024198046a41086a2249203f290300370300200220022903980537039804200241d8036a41386a224a2017290300370300200241d8036a41306a224b201c290300370300200241d8036a41286a224c201d290300370300200241d8036a41206a224d201e290300370300200241d8036a41186a224e202a290300370300200241d8036a41106a224f2015290300370300200241d8036a41086a2250201629030037030020022002290398093703d803200241b8036a41186a22512040290300370300200241b8036a41106a22522030290300370300200241b8036a41086a2253202f290300370300200220022903f8043703b803200241086a2001108f012005422088a721402005a721542002280208450d010c0a0b0240200b450d00203b450d00200b10260b02402005422088a72204450d002004410474210f200a210403400240200441046a280200450d00200428020010260b200441106a2104200f41706a220f0d000b0b200542ffffffff0083500d0e0c0d0b200228020c222e200128020441c1006e22042004202e4b1bad42c1007e2205422088a70d132005a72204417f4c0d130240024020040d00410121330c010b200410242233450d130b4100210c2002410036028007200220333602f8062002200441c1006e22043602fc0602400240202e450d004100210c034020012802042204450d022001280200222f2d0000213020012004417f6a3602042001202f41016a3602002030417f6a220441014b0d0202400240024020040e020001000b200241980a6a200110dc0120022d00980a4101460d04201f20202900002205370300202120222900002255370300202320242900002256370300202520262900002257370300200f202729000022583703002016202929000037030020152028290000370300202a2058370300201e2057370300201d2056370300201c20553703002017200537030020022007290000370398094100212f0c010b200241980a6a200110dc0120022d00980a4101460d03201f20202900002205370300202120222900002255370300202320242900002256370300202520262900002257370300200f202729000022583703002016202929000037030020152028290000370300202a2058370300201e2057370300201d2056370300201c20553703002017200537030020022007290000370398094101212f0b200241d8086a41386a20172903002205370300200241d8086a41306a201c2903002255370300200241d8086a41286a201d2903002256370300200241d8086a41206a201e2903002257370300202d202a2903002258370300202c20152903002259370300202b2016290300225a37030020024198086a41086a2230205a37030020024198086a41106a2234205937030020024198086a41186a2235205837030020024198086a41206a2236205737030020024198086a41286a223d205637030020024198086a41306a223e205537030020024198086a41386a223f2005370300200220022903980922053703d80820022005370398080240200c20022802fc06470d00200241f8066a200c410110cd0120022802f8062133200228028007210c0b2033200c41c1006c6a2204202f3a00002004200229039808370001200441096a2030290300370000200441116a2034290300370000200441196a2035290300370000200441216a2036290300370000200441296a203d290300370000200441316a203e290300370000200441396a203f2903003700002002200c41016a220c36028007202e417f6a222e0d000b20022802fc0621040b2033450d0920022001108f0120022802000d082002280204221c41076a41037622170d024100211d4101211e0c030b20022802fc062204450d08200441c1006c450d08203310260c080b200c210b4100210a0c0e0b2017102a221e450d102017211d0b0240024020012802042017490d00201e2001280200201710cf06211e2001280204221f2017490d052001201f20176b3602042001200128020020176a360200200241980a6a201e41d4c0c70020171b201710de01200228029c0a410376201c4f0d0141c8f3c600412641dcbcc700102f000b201d450d05201e10260c050b200241980a6a201c10df0120022802a00a211c200228029c0a211f20022802980a21170240201d450d00201e10260b2017450d04203a422088a7215b200f204129030037030020122042290300370300201020432903003703002016204629030037030020152045290300370300202a2044290300370300202b2049290300370300202c2048290300370300202d2047290300370300200220022903d8043703d809200220022903b8043703980920022002290398043703d808200241980a6a41386a204a290300370300200241980a6a41306a204b290300370300200241980a6a41286a204c290300370300200241980a6a41206a204d2903003703002014204e2903003703002013204f2903003703002011205029030037030020024198086a41186a205129030037030020024198086a41106a205229030037030020024198086a41086a2053290300370300200220022903d8033703980a200220022903b803370398082033215c2004215d200c215e200e215f203c2160201b2161201a2162200d2163203b2164200b21652040216620542167201c2168201f21692017216a2032216b2031216c0c0c0b2004200a41b8afc0001048000b200b202a41b8afc0001048000b200a1026200c210b0c070b2017201f41b8afc0001048000b02402004450d00200441c1006c450d00203310260b0240201a450d00200d10260b02402040450d002040410474210d200a210403400240200441046a280200450d00200428020010260b200441106a2104200d41706a220d0d000b0b0240205441ffffffff0071450d00200a10260b200b450d06203b450d060c010b0240201a450d00200d10260b02402040450d002040410474210d200a210403400240200441046a280200450d00200428020010260b200441106a2104200d41706a220d0d000b0b0240205441ffffffff0071450d00200a10260b200b450d05203b450d050b200b10260c040b200c210b0b02402005422088a72204450d002004410474210f200a210403400240200441046a280200450d00200428020010260b200441106a2104200f41706a220f0d000b0b200542ffffffff0083500d010b200a10260b201a450d00200d10264100210a0c010b4100210a0b20024198036a41186a2204200241d8096a41186a29030037030020024198036a41106a220d200241d8096a41106a29030037030020024198036a41086a220f200241d8096a41086a290300370300200241f8026a41086a220c20024198096a41086a290300370300200241f8026a41106a220e20024198096a41106a290300370300200241f8026a41186a221020024198096a41186a290300370300200241d8026a41086a2212200241d8086a41086a290300370300200241d8026a41106a222a200241d8086a41106a290300370300200241d8026a41186a2211200241d8086a41186a290300370300200220022903d8093703980320022002290398093703f802200220022903d8083703d80220024198026a41386a2213200241980a6a41386a29030037030020024198026a41306a2214200241980a6a41306a29030037030020024198026a41286a2215200241980a6a41286a29030037030020024198026a41206a2216200241980a6a41206a29030037030020024198026a41186a2217200241980a6a41186a29030037030020024198026a41106a221c200241980a6a41106a29030037030020024198026a41086a221d200241980a6a41086a290300370300200241f8016a41086a221e20024198086a41086a290300370300200241f8016a41106a221f20024198086a41106a290300370300200241f8016a41186a222120024198086a41186a290300370300200220022903980a3703980220022002290398083703f801200a450d04200941016a2109200241d8016a41186a22232004290300370300200241d8016a41106a2225200d290300370300200241d8016a41086a220d200f290300370300200241b8016a41086a220f200c290300370300200241b8016a41106a220c200e290300370300200241b8016a41186a220e201029030037030020024198016a41086a2210201229030037030020024198016a41106a2212202a29030037030020024198016a41186a222a201129030037030020022002290398033703d801200220022903f8023703b801200220022903d80237039801200241d8006a41386a22112013290300370300200241d8006a41306a22132014290300370300200241d8006a41286a22142015290300370300200241d8006a41206a22152016290300370300200241d8006a41186a22162017290300370300200241d8006a41106a2217201c290300370300200241d8006a41086a221c201d290300370300200241386a41086a221d201e290300370300200241386a41106a221e201f290300370300200241386a41186a221f20212903003703002002200229039802370358200220022903f80137033802402008200228022c470d00200241286a2008410110e00120022802282106200228023021080b200620084198026c6a2204206c3703082004206b3703002004200a360210200441286a2060360200200441246a205b360200200441206a20643602002004411c6a2065360200200441186a2066360200200441146a2067360200200d2903002105202529030021312023290300213220022903d8012155200441dc006a2061360200200441d8006a2062360200200441d4006a2063360200200441d0006a205f360200200441c4006a20323702002004413c6a2031370200200441346a20053702002004412c6a2055370200200441f8006a200e290300370200200441f0006a200c290300370200200441e8006a200f290300370200200441e0006a20022903b80137020020044198016a202a29030037020020044190016a201229030037020020044188016a201029030037020020044180016a200229039801370200200441b8016a2016290300370200200441b0016a2017290300370200200441a8016a201c290300370200200441a0016a2002290358370200200441d0016a2013290300370200200441c8016a2014290300370200200441c0016a2015290300370200200441d8016a2011290300370200200441f8016a201f290300370200200441f0016a201e290300370200200441e8016a201d290300370200200441e0016a200229033837020020044194026a206836020020044190026a20693602002004418c026a206a36020020044188026a205e36020020044184026a205d36020020044180026a205c3602002002200841016a2208360230200b210c20092003470d000b0b20002002290328370200200041086a200241286a41086a2802003602000c030b1033000b1034000b2000410036020002402008450d00200620084198026c6a21012006210b03400240200b41d8006a280200450d00200b28025410260b0240200b41186a280200220a450d00200b2802102104200a410474210a03400240200441046a280200450d00200428020010260b200441106a2104200a41706a220a0d000b0b0240200b41146a28020041ffffffff0071450d00200b28021010260b0240200b28021c2204450d00200b41206a280200450d00200410260b0240200b4184026a2802002204450d00200441c1006c450d00200b2802800210260b200b4198026a2104200b4190026a4100360200200b28028c02210a200b410136028c020240200b4194026a280200450d00200a10260b2004210b20042001470d000b0b200228022c2204450d0020044198026c450d00200610260b200241e00a6a24000bd60301087f230041d0016b2202240041002103200241003a00482001280204417f6a210402400240024003402004417f460d01200241086a20036a200128020022052d00003a0000200120043602042001200541016a3602002002200341016a22053a00482004417f6a210420052103200541c000470d000b200241d0006a41086a2204200241086a41086a290300370300200241d0006a41106a2201200241086a41106a290300370300200241d0006a41186a2203200241086a41186a290300370300200241d0006a41206a2206200241086a41206a290300370300200241d0006a41286a2207200241086a41286a290300370300200241d0006a41306a2208200241086a41306a290300370300200241d0006a41386a2209200241086a41386a29030037030020022002290308370350200541ff017141c000490d0120002002290350370001200041003a0000200041396a2009290300370000200041316a2008290300370000200041296a2007290300370000200041216a2006290300370000200041196a2003290300370000200041116a2001290300370000200041096a20042903003700000c020b200041013a0000200341ff0171450d01200241003a00480c010b200041013a00000b200241d0016a24000be90502097f017e230041306b22022400200241086a2001108f01024002402002280208450d00200041003602000c010b41042103024002400240200228020c220420012802044104762205200520044b1b22054104742206417f4c0d0002402005450d00200610242203450d020b4100210620024100360218200220053602142002200336021002402004450d00034020012802042207450d04200128020022082d0000210520012007417f6a3602042001200841016a360200200541024b0d044100210802400240024020050e03020001020b410121080c010b410221080b20022001108f0120022802000d042001280204220720022802042205490d042005417f4c0d020240024020050d00410021094101210a0c010b2005102a220a450d0420012802042107200521090b0240024020072005490d00200a2001280200200510cf0621072001280204220a20054f0d012005200a41b8afc0001048000b2009450d05200a10260c050b2001200a20056b3602042001200128020020056a3602002007450d042005ad4220862009ad84200b20071b210b200241266a41026a2002412d6a41026a2d000022053a0000200241226a41026a220a20053a0000200220022f002d22053b0126200220053b0122024020062002280214470d00200241106a2006410110cf0120022802102103200228021821060b200320064104746a220520083a000c2005200b37020420052007360200200520022f01223b000d2005410f6a200a2d00003a00002002200641016a22063602182004417f6a22040d000b0b20002002290310370200200041086a200241106a41086a2802003602000c030b1034000b1033000b200241266a41026a2002412a6a41026a2d00003a0000200220022f012a3b01262000410036020002402006450d00200641047421052003210103400240200141046a280200450d00200128020010260b200141106a2101200541706a22050d000b0b200228021441ffffffff0071450d00200310260b200241306a24000bf10401037f230041e0006b22032400024002400240024002402002417f4c0d000240024020020d0041012104410021050c010b200210242204450d02200221050b20034100360210200320043602082003200536020c200341086a4100200210c90120032802082204200328021022056a2001200210cf061a2003200520026a220236021020032002360218200241818080204f0d0220032002410374220136021c20024180808020460d03024002400240200241014b0d004100210120020e020201020b200141786a41037641016a21010c010b410121010b200320013602202003200420016a220136022420012004490d042000200328020c36020820002002410674220236020420002004410120021b360200200341e0006a24000f0b1034000b1033000b200341346a4101360200200341d4006a410236020020034202370244200341e4f5c600360240200341e0f5c6003602302003410136022c2003200341286a3602502003200341186a360228200341c0006a41ecc0c700103d000b200341346a4101360200200341d4006a410236020020034202370244200341ac86c40036024020034198f4c6003602302003410136022c2003200341286a36025020032003411c6a360228200341c0006a41ecc0c700103d000b200341c0006a41146a410c360200200341c0006a410c6a410d360200200341286a41146a4103360200200341286a410c6a4103360200200341d486c4003602302003410336022c200341bc86c4003602282003410c3602442003200436025c2003200341c0006a3602382003200341246a3602502003200341206a3602482003200341dc006a360240200341286a41ecc0c700103d000ba20201027f230041306b220224002002200136020002400240200141ffffffff014b0d000240200041086a280200220341ffffffff01712003470d00200220034103742203360204200320014f0d022002412c6a41013602002002411c6a41023602002002420237020c200241acf4c600360208200241013602242002200241206a3602182002200241046a36022820022002360220200241086a41ecc0c700103d000b41eef3c60041184188f4c6001053000b2002412c6a41013602002002411c6a41023602002002420237020c2002419cf4c60036020820024198f4c600360228200241013602242002200241206a36021820022002360220200241086a41ecc0c700103d000b20002000280204410771200141037472360204200241306a24000be20103017f017e017f02400240200041046a280200220320016b20024f0d0002400240200120026a22022001490d00200341017422012002200120024b1b22014104200141044b1bad4298027e2204422088a722020d002004a722014100480d0020024541037421050240024002402000280200410020031b22020d0020010d01200521020c040b20034198026c22032001460d03024020030d0020010d01410821020c040b20022003200110282202450d010c030b2001102422020d020b20050d030b102e000b20002002360200200041046a20014198026e3602000b0f0b102c000bb20403037f017e057f230041206b22022400200241086a2001108f01024002402002280208450d00200041003602000c010b024002400240200228020c22032001280204410c6e2204200420034b1bad420c7e2205422088a70d002005a72204417f4c0d000240024020040d00410421060c010b200410242206450d020b41002107200241003602182002200636021020022004410c6e36021402402003450d00034020022001108f0120022802000d042001280204220820022802042204490d042004417f4c0d020240024020040d00410021094101210a0c010b2004102a220a450d0420012802042108200421090b0240024020082004490d00200a2001280200200410cf0621082001280204220a20044f0d012004200a41b8afc0001048000b2009450d05200a10260c050b2001200a20046b3602042001200128020020046a3602002008450d042004ad4220862009ad842105024020072002280214470d00200241106a2007410110cb0120022802102106200228021821070b20062007410c6c6a22042005370204200420083602002002200741016a22073602182003417f6a22030d000b0b20002002290310370200200041086a200241106a41086a2802003602000c030b1034000b1033000b2000410036020002402007450d002007410c6c21012006210403400240200441046a280200450d00200428020010260b2004410c6a2104200141746a22010d000b0b20022802142204450d002004410c6c450d00200610260b200241206a24000b850302067f017e230041106b22022400200241086a2001108f01024002402002280208450d00200041003602000c010b024020012802042203200228020c4102742204490d0002400240024002402004417f4c0d000240024020040d0041002105410121060c010b2004102a2206450d0220012802042103200421050b0240024020032004490d0020062001280200200410cf0621032001280204220720044f0d012004200741b8afc0001048000b2005450d05200610260c050b2001200720046b3602042001200128020020046a3602002003450d0402402004ad4220862005ad842208422088a722010d002008a721010c030b024020034103710d0020014103710d002008a722014103710d0020014102762204450d032008422288a721050c040b02402008a7450d00200310260b200041003602000c050b1034000b1033000b4100210502402001450d00200310260b41002104410421060b2000200436020420002006360200200041086a20053602000c010b200041003602000b200241106a24000b870604037f017e087f027e23004180026b2202240020022001108f01024002402002280200450d00200041003602000c010b0240024020022802042203200128020441246e2204200420034b1bad42247e2205422088a70d002005a72204417f4c0d0002400240024020040d00410421060c010b200410242206450d010b4100210720024100360210200220063602082002200441246e36020c02402003450d00410021080340200128020422094104490d04200841016a21082001280200220a280000210b20012009417c6a220c3602042001200a41046a36020041002104200241003a00b8012009417b6a2109024002400340200c2004460d0120024198016a20046a200a20046a220d41046a2d00003a0000200120093602042001200d41056a3602002002200441016a220d3a00b8012009417f6a2109200d2104200d4120460d020c000b0b200441ff0171450d05200241003a00b8010c050b200241c0016a41086a220420024198016a41086a290300370300200241c0016a41106a220920024198016a41106a290300370300200241c0016a41186a220a20024198016a41186a29030037030020022002290398013703c001200d41ff0171411f4d0d04200241386a41086a20042903002205370300200241386a41106a2009290300220e370300200241386a41186a200a290300220f370300200241186a41186a2209200f370300200241186a41106a220d200e370300200241186a41086a220a2005370300200220022903c0012205370358200220053703382002200537031802402007200228020c470d00200241086a200710e40120022802082106200228021021070b2006200741246c6a2204200b360200200420022903183702042004410c6a200a290300370200200441146a200d2903003702002004411c6a20092903003702002002200741016a220736021020082003470d000b0b20002002290308370200200041086a200241086a41086a2802003602000c030b1033000b1034000b20004100360200200228020c2204450d00200441246c450d00200610260b20024180026a24000bda0103027f017e017f02400240200041046a2802002001470d0002400240200141016a22022001490d00200141017422032002200320024b1b22024104200241044b1bad42247e2204422088a722030d002004a722024100480d0020034541027421050240024002402000280200410020011b22030d0020020d01200521030c040b200141246c22012002460d03024020010d0020020d01410421030c040b20032001200210282203450d010c030b2002102422030d020b20050d030b102e000b20002003360200200041046a200241246e3602000b0f0b102c000b880602097f037e23004180026b2202240020022001108f0102400240024002402002280200450d00200041003602000c010b2002280204220320012802044105762204200420034b1b22044105742205417f4c0d010240024020040d00410121060c010b200510242206450d030b41002107200241003602102002200436020c200220063602080240024002402003450d0041002108034041002105200241003a00b801200841016a21082001280204417f6a210403402004417f460d0320024198016a20056a200128020022092d00003a0000200120043602042001200941016a3602002002200541016a22093a00b8012004417f6a21042009210520094120470d000b200241c0016a41086a220420024198016a41086a290300370300200241c0016a41106a220520024198016a41106a290300370300200241c0016a41186a220a20024198016a41186a29030037030020022002290398013703c001200941ff0171411f4d0d03200241386a41086a2004290300220b370300200241386a41106a2005290300220c370300200241386a41186a200a290300220d370300200241186a41186a2205200d370300200241186a41106a2209200c370300200241186a41086a220a200b370300200220022903c001220b3703582002200b3703382002200b37031802402007200228020c470d00200241086a2007410110930120022802082106200228021021070b200620074105746a22042002290318370000200441186a2005290300370000200441106a2009290300370000200441086a200a2903003700002002200741016a220736021020082003470d000b0b20002002290308370200200041086a200241086a41086a2802003602000c020b200541ff0171450d00200241003a00b8010b200241386a41086a200241d8006a41086a290300370300200241386a41106a200241d8006a41106a290300370300200241386a41186a200241d8006a41186a2903003703002002200229035837033820004100360200200228020c41ffffff3f71450d00200610260b20024180026a24000f0b1034000b1033000bd30201077f230041206b22022400200241086a2001108f0102400240024002402002280208450d00200041003602000c010b200228020c220320012802044102762204200420034b1b22054102742204417f4c0d010240024020050d00410421060c010b200410242206450d030b4100210420024100360218200220053602142002200636021002402003450d00034002402001280204220541044f0d0020004100360200200228021441ffffffff0371450d03200610260c030b20012802002207280000210820012005417c6a3602042001200741046a360200024020042002280214470d00200241106a2004410110e70120022802102106200228021821040b200620044102746a20083602002002200441016a22043602182003417f6a22030d000b0b20002002290310370200200041086a200241106a41086a2802003602000b200241206a24000f0b1034000b1033000be10101027f02400240200041046a280200220320016b20024f0d0002400240200120026a22022001490d00200341017422012002200120024b1b22014104200141044b1b220141ffffffff037122042001470d00200141027422024100480d00200420014641027421040240024002402000280200410020031b22010d0020020d01200421010c040b200341027422032002460d03024020030d0020020d01410421010c040b20012003200210282201450d010c030b2002102422010d020b20040d030b102e000b20002001360200200041046a20024102763602000b0f0b102c000bdf0103017f017e017f02400240200041046a280200220320016b20024f0d0002400240200120026a22022001490d00200341017422012002200120024b1b22014104200141044b1bad422c7e2204422088a722020d002004a722014100480d0020024541027421050240024002402000280200410020031b22020d0020010d01200521020c040b2003412c6c22032001460d03024020030d0020010d01410421020c040b20022003200110282202450d010c030b2001102422020d020b20050d030b102e000b20002002360200200041046a2001412c6e3602000b0f0b102c000bda0103027f017e017f02400240200041046a2802002001470d0002400240200141016a22022001490d00200141017422032002200320024b1b22024104200241044b1bad42287e2204422088a722030d002004a722024100480d0020034541037421050240024002402000280200410020011b22030d0020020d01200521030c040b200141286c22012002460d03024020010d0020020d01410821030c040b20032001200210282203450d010c030b2002102422030d020b20050d030b102e000b20002003360200200041046a200241286e3602000b0f0b102c000bda0103027f017e017f02400240200041046a2802002001470d0002400240200141016a22022001490d00200141017422032002200320024b1b22024104200241044b1bad42307e2204422088a722030d002004a722024100480d0020034541037421050240024002402000280200410020011b22030d0020020d01200521030c040b200141306c22012002460d03024020010d0020020d01410821030c040b20032001200210282203450d010c030b2002102422030d020b20050d030b102e000b20002003360200200041046a200241306e3602000b0f0b102c000be20103017f017e017f02400240200041046a280200220320016b20024f0d0002400240200120026a22022001490d00200341017422012002200120024b1b22014104200141044b1bad42c4007e2204422088a722020d002004a722014100480d0020024541027421050240024002402000280200410020031b22020d0020010d01200521020c040b200341c4006c22032001460d03024020030d0020010d01410421020c040b20022003200110282202450d010c030b2001102422020d020b20050d030b102e000b20002002360200200041046a200141c4006e3602000b0f0b102c000bdc0101037f02400240200041046a2802002001470d0002400240200141016a22022001490d00200141017422032002200320024b1b22024104200241044b1b220241ffffffff017122042002470d00200241037422034100480d00200420024641027421040240024002402000280200410020011b22020d0020030d01200421020c040b200141037422012003460d03024020010d0020030d01410421020c040b20022001200310282202450d010c030b2003102422020d020b20040d030b102e000b20002002360200200041046a20034103763602000b0f0b102c000bdb0101037f02400240200041046a2802002001470d0002400240200141016a22022001490d00200141017422032002200320024b1b22024104200241044b1b220241ffffff3f7122042002470d00200241057422034100480d00200420024641037421040240024002402000280200410020011b22020d0020030d01200421020c040b200141057422012003460d03024020010d0020030d01410821020c040b20022001200310282202450d010c030b2003102422020d020b20040d030b102e000b20002002360200200041046a20034105763602000b0f0b102c000bda0103027f017e017f02400240200041046a2802002001470d0002400240200141016a22022001490d00200141017422032002200320024b1b22024104200241044b1bad422c7e2204422088a722030d002004a722024100480d0020034541027421050240024002402000280200410020011b22030d0020020d01200521030c040b2001412c6c22012002460d03024020010d0020020d01410421030c040b20032001200210282203450d010c030b2002102422030d020b20050d030b102e000b20002003360200200041046a2002412c6e3602000b0f0b102c000be20103017f017e017f02400240200041046a280200220320016b20024f0d0002400240200120026a22022001490d00200341017422012002200120024b1b22014104200141044b1bad42c8007e2204422088a722020d002004a722014100480d0020024541027421050240024002402000280200410020031b22020d0020010d01200521020c040b200341c8006c22032001460d03024020030d0020010d01410421020c040b20022003200110282202450d010c030b2001102422020d020b20050d030b102e000b20002002360200200041046a200141c8006e3602000b0f0b102c000bdf0103017f017e017f02400240200041046a280200220320016b20024f0d0002400240200120026a22022001490d00200341017422012002200120024b1b22014104200141044b1bad42187e2204422088a722020d002004a722014100480d0020024541027421050240024002402000280200410020031b22020d0020010d01200521020c040b200341186c22032001460d03024020030d0020010d01410421020c040b20022003200110282202450d010c030b2001102422020d020b20050d030b102e000b20002002360200200041046a200141186e3602000b0f0b102c000bdc0101037f02400240200041046a2802002001470d0002400240200141016a22022001490d00200141017422032002200320024b1b22024104200241044b1b220241ffffffff037122042002470d00200241027422034100480d00200420024641027421040240024002402000280200410020011b22020d0020030d01200421020c040b200141027422012003460d03024020010d0020030d01410421020c040b20022001200310282202450d010c030b2003102422020d020b20040d030b102e000b20002002360200200041046a20034102763602000b0f0b102c000bdb0101037f02400240200041046a2802002001470d0002400240200141016a22022001490d00200141017422032002200320024b1b22024104200241044b1b220241ffffff1f7122042002470d00200241067422034100480d00200420024641037421040240024002402000280200410020011b22020d0020030d01200421020c040b200141067422012003460d03024020010d0020030d01410821020c040b20022001200310282202450d010c030b2003102422020d020b20040d030b102e000b20002002360200200041046a20034106763602000b0f0b102c000bd70103027f017e017f02400240200041046a2802002001470d0002400240200141016a22022001490d00200141017422032002200320024b1b22024104200241044b1bad42217e2204422088a722030d002004a722024100480d0020034521050240024002402000280200410020011b22030d0020020d01200521030c040b200141216c22012002460d03024020010d0020020d01410121030c040b20032001200210282203450d010c030b2002102422030d020b20050d030b102e000b20002003360200200041046a200241216e3602000b0f0b102c000bdf0103017f017e017f02400240200041046a280200220320016b20024f0d0002400240200120026a22022001490d00200341017422012002200120024b1b22014104200141044b1bad42c0017e2204422088a722020d002004a722014100480d0020024521050240024002402000280200410020031b22020d0020010d01200521020c040b200341c0016c22032001460d03024020030d0020010d01410121020c040b20022003200110282202450d010c030b2001102422020d020b20050d030b102e000b20002002360200200041046a200141c0016e3602000b0f0b102c000bdf0103017f017e017f02400240200041046a280200220320016b20024f0d0002400240200120026a22022001490d00200341017422012002200120024b1b22014104200141044b1bad42187e2204422088a722020d002004a722014100480d0020024541037421050240024002402000280200410020031b22020d0020010d01200521020c040b200341186c22032001460d03024020030d0020010d01410821020c040b20022003200110282202450d010c030b2001102422020d020b20050d030b102e000b20002002360200200041046a200141186e3602000b0f0b102c000bd80101037f02400240200041046a2802002001470d0002400240200141016a22022001490d00200141017422032002200320024b1b22024104200241044b1b220241ffffff3f7122042002470d00200241057422034100480d00200420024621040240024002402000280200410020011b22020d0020030d01200421020c040b200141057422012003460d03024020010d0020030d01410121020c040b20022001200310282202450d010c030b2003102422020d020b20040d030b102e000b20002002360200200041046a20034105763602000b0f0b102c000bdd0103027f017e017f02400240200041046a2802002001470d0002400240200141016a22022001490d00200141017422032002200320024b1b22024104200241044b1bad42c4007e2204422088a722030d002004a722024100480d0020034541027421050240024002402000280200410020011b22030d0020020d01200521030c040b200141c4006c22012002460d03024020010d0020020d01410421030c040b20032001200210282203450d010c030b2002102422030d020b20050d030b102e000b20002003360200200041046a200241c4006e3602000b0f0b102c000b130020004100360204200041d4c0c7003602000b130020004105360204200041d4b3c0003602000bdd5808067f017e087f017e047f047e097f077e230041e0026b2201240020014198016a41186a2202420037030020014198016a41106a2203420037030020014198016a41086a220442003703002001420037039801200141e0016a41eb8cc700410a10fb012004200141e0016a41086a2205290000370300200120012900e00137039801200141e0016a41d4e6c600410910fb0120022005290000370300200320012900e001370300200141e0016a20014198016a10fc01024020012802e0012206450d000240024020012902e4012207422088a722040d0041002108200621090c010b200641046a21092006280200210a410121080b200141e0016a41186a220b4200370300200141e0016a41106a220c4200370300200141e0016a41086a220d4200370300200142003703e001200141b8016a41818dc700410910fb01200d200141b8016a41086a220e290000370300200120012900b8013703e001200141b8016a41acd6c000410610fb01200b200e290000370300200c20012900b801370300200141b8016a200141e0016a10fd0120012802b8012202410420021b210f024020012902bc01420020021b2210422088a72202450d00200620044102746a2111200f2002412c6c6a2112200f2102034020022802002113200b2002411c6a290200370300200c200241146a290200370300200d2002410c6a290200370300200120022902043703e001200241246a28020022044103460d01200241286a2802002114200141386a41186a200b2903002215370300200141386a41106a200c2903002216370300200141386a41086a200d2903002217370300200120012903e0012218370338200141f8006a41186a22192015370300200141f8006a41106a221a2016370300200141f8006a41086a221b20173703002001201837037802400240024002400240024020084101470d00200a2013460d010b20044101470d0320014198016a41186a2204201929030037030020014198016a41106a221c201a29030037030020014198016a41086a221a201b2903003703002001200129037837039801201441024b0d03200b4200370300200c4200370300200d4200370300200142003703e001200141b8016a41818dc700410910fb01200d200e290000370300200120012900b8013703e001200141b8016a4190d8c000410a10fb01200c41086a221d200e290000370000200c20012900b801370000200141b8016a200141e0016a10fe0120012802b801221e0d014100211920014100360260200142043703584104211e0c020b024020092011470d0041002108201121090c030b2009280200210a41012108200941046a21090c020b200120012902bc01221537025c2001201e3602582015422088a721190b200141b8016a41186a221f2004290300370300200141b8016a41106a2220201c290300370300200e201a29030037030020012001290398013703b8010240024020194103490d004103211c2001410336026020194103460d01201e41246a21042019410c6c415c6a211903400240200441046a280200221a450d00201a41246c450d00200428020010260b2004410c6a2104201941746a22190d000c020b0b200141d8006a2019410320196b222110cb012001280258221e2001280260221c410c6c6a21040240024020214102490d002019417e6a21190340200141003602e801200142043703e001200141e0016a4100410010d101200441086a20012802e801360200200420012903e0013702002004410c6a2104201941016a221a201949211b201a2119201b450d000b2021201c6a417f6a211c2021450d010b2004420437020020044100360208201c41016a211c0b2001201c3602600b201c20144d0d01200b201f290300370300200c2020290300370300200d200e290300370300200120012903b8013703e001201e2014410c6c6a220441086a211902402004280208221a200441046a280200470d002004201a410110d1012019280200211a0b2004280200201a41246c6a220420012903e001370204200420133602002004410c6a200d290300370200200441146a200c2903003702002004411c6a200b2903003702002019201928020041016a360200200141e8006a41086a200141d8006a41086a280200360200200120012903582215370368200b4200370300200c4200370300200d4200370300200142003703e001200141b8016a41818dc700410910fb01200d200e290000370300200120012900b8013703e001200141b8016a4190d8c000410a10fb01201d200e290000370000200c20012900b80137000002402015a7221b0d00200141e0016a412010ff010c010b200141e0016a200141e8006a108002024020012802702204450d002004410c6c2119201b210403400240200441046a280200221a450d00201a41246c450d00200428020010260b2004410c6a2104201941746a22190d000b0b200128026c2204450d002004410c6c450d00201b10260b2002412c6a22022012470d010c020b0b2014201c41c4b6c0001032000b02402010a72202450d002002412c6c450d00200f10260b200742ffffffff0383500d00200610260b200141e0016a41186a22024200370300200141e0016a41106a2204420037030020054200370300200142003703e001200141b8016a41f58cc700410c10fb012005200141b8016a41086a2219290000370300200120012900b8013703e001200141b8016a41d4e6c600410910fb0120022019290000370300200420012900b801370300200141e0016a412010ff01200242003703002004420037030020054200370300200142003703e001200141b8016a41eb8cc700410a10fb0120052019290000370300200120012900b8013703e001200141b8016a41d4e6c600410910fb0120022019290000370300200420012900b801370300200141306a200141e0016a412041d4c0c7004100410010810202400240024002400240024020012802304101470d00200141f8016a22024200370300200141f0016a220d4200370300200141e0016a41086a22044200370300200142003703e00120014198016a41aed3c500410f10fb01200420014198016a41086a221929000037030020012001290098013703e00120014198016a41bdd3c500410d10fb0120022019290000370300200d2001290098013703002001412036025c2001200141e0016a360258200141f8006a200141e0016a412010820202400240200128027822020d00410221040c010b200128027c211b2001200141f8006a41086a280200220436023c200120023602380240024020044104490d00200228000021192001200241046a36023820012004417c6a220c36023c200c4104490d002002280004210c2001200441786a36023c2001200241086a360238200141b8016a200141386a108e0120012802b801221a450d0020012902bc01211541002104200141003a00980102400240200128023c2213450d00200128023822092d0000210b20012013417f6a220836023c2001200941016a3602380240200b4101460d000c040b200841044f0d010b0c020b2009280001210b20012013417b6a36023c2001200941056a360238410121040c010b200141003602a00120014201370398012001410e36026c2001200141d8006a360268200120014198016a3602dc01200141cc016a4101360200200142013702bc012001418c8dc6003602b8012001200141e8006a3602c801200141dc016a41c4e1c000200141b8016a10351a20012802980120012802a0011084020240200128029c01450d0020012802980110260b410221040b201b450d00200210260b024020044102460d00200141d0016a200b360200200141c4016a2015370200200120043602cc012001201a3602c0012001200c3602bc01200120193602b801200141c0016a211a024020192000470d00024020044101460d00200141e0016a201a10c701200141a8016a200c36020020014198016a410c6a200141e0016a41086a22022802003602002001410036029801200120012903e00137029c01200141e0016a20014198016a10850220014183016a2002280200360000200120012903e00137007b200141e0016a410c6a200141ff006a290000370000200141c6a4b9da043600e101200141023a00e001200120012900783700e501200141e0016a10860220014198016a41086a2802002202450d01200241286c450d01200128029c0110260c010b200141e0016a201a10c701200141ac016a200c36020020014198016a41086a20012903e001370300200141a8016a200141e0016a41086a22022802003602002001200b36029c012001410136029801200141e0016a20014198016a10850220014183016a2002280200360000200120012903e00137007b200141e0016a410c6a200141ff006a290000370000200141c6a4b9da043600e101200141023a00e001200120012900783700e501200141e0016a10860220014198016a410c6a2802002202450d00200241286c450d0020012802a00110260b024020012802bc0120012802b8016a2000470d00200141c8016a28020041286c4105722202417f4c0d03200210242204450d04200141003602e801200120023602e401200120043602e001200141013a009801200141e0016a41004101106d20012802e00120012802e80122026a20012d0098013a00002001200241016a3602e80120012802c0012102200141e0016a20012802c801220410a1010240024020040d0020012802e001211920012802e80121040c010b2002200441286c6a210c20012802e80121040340200141e0016a20044120106d20012802e00120012802e80122196a22042002290000370000200441086a200241086a290000370000200441106a200241106a290000370000200441186a200241186a2900003700002001201941206a22043602e801200241206a2903002115200141e0016a20044108106d20012802e001221920012802e80122046a20153700002001200441086a22043602e801200c200241286a2202470d000b0b41cad3c50041142019200410b301024020012802e401450d00201910260b200141e0016a41086a2202201a290200370300200141f0016a2204201a41086a280200360200200141003602e401200141053a00e001200141e0016a108702200141f8016a42003703002004420037030020024200370300200142003703e00120014198016a41aed3c500410f10fb01200220014198016a41086a220429000037030020012001290098013703e00120014198016a41bdd3c500410d10fb01200d41086a2004290000370000200d200129009801370000200141e0016a412010ff010c010b20012802c4012202450d00200241286c450d0020012802c00110260b200141f8016a4200370300200141f0016a4200370300200141e0016a41086a22024200370300200142003703e00120014198016a41aed3c500410f10fb01200220014198016a41086a220429000037030020012001290098013703e00120014198016a41ded3c500410510fb01200d41086a2004290000370000200d2001290098013700002001412036023c2001200141e0016a360238200141f8006a200141e0016a412010820220012802782202450d05200141f8006a41086a2802002119200128027c210c41002104200141003a0098010240024002402019450d0020022d0000220b41034b0d00024002400240200b0e0405000102050b2019417f6a4108490d0220022900012115410121040c040b410221040c020b2019417f6a4108490d0020022900012115410321040c020b200141003602a00120014201370398012001410e36026c2001200141386a360268200120014198016a360258200141cc016a4101360200200142013702bc012001418c8dc6003602b8012001200141e8006a3602c801200141d8006a41c4e1c000200141b8016a10351a20012802980120012802a0011084020240200128029c01450d0020012802980110260b410421040b0b0240200c450d00200210260b2004417f6a220241024b0d0520020e03040503040b41bff4c400413141dcbcc700102f000b1034000b1033000b2015422088a7210202402015a722042000470d00200141043602b801200120023602bc01200141e0016a200141b8016a10850220014183016a200141e8016a280200360000200120012903e00137007b200141ec016a200141ff006a290000370000200141c6a4b9da043600e101200141023a00e001200120012900783700e501200141e0016a1086020b200220046a2000470d01200141f8016a4200370300200141f0016a4200370300200141e0016a41086a22024200370300200142003703e00120014198016a41aed3c500410f10fb01200220014198016a41086a220429000037030020012001290098013703e00120014198016a41ded3c500410510fb01200d41086a2004290000370000200d200129009801370000200141b8016a410020022002108802200141e0016a412020012802b801220220012802c00110b301024020012802bc01450d00200210260b200141023602e401200141053a00e001200141e0016a1087020c010b2015422088a7210202402015a722042000470d00200141033602b801200120023602bc01200141e0016a200141b8016a10850220014183016a200141e8016a280200360000200120012903e00137007b200141ec016a200141ff006a290000370000200141c6a4b9da043600e101200141023a00e001200120012900783700e501200141e0016a1086020b200220046a2000470d00200141f8016a4200370300200141f0016a4200370300200141e0016a41086a22024200370300200142003703e00120014198016a41aed3c500410f10fb01200220014198016a41086a220429000037030020012001290098013703e00120014198016a41ded3c500410510fb01200d41086a2004290000370000200d200129009801370000200141b8016a410220022002108802200141e0016a412020012802b801220220012802c00110b301024020012802bc01450d00200210260b200141013602e401200141053a00e001200141e0016a1087020b200141f8016a22024200370300200141f0016a22134200370300200141e0016a41086a22044200370300200142003703e001200141e0016a41bb8cc700410f10fb01200141b8016a41b1eec600410610fb012002200141b8016a41086a2219290000370300201320012900b801370300200141286a200141e0016a4120108902200128022c210802402001280228220c4101470d00200141e0016a412010ff010b200242003703002013420037030020044200370300200142003703e001200141e0016a41bb8cc700410f10fb01200141b8016a41e0fcc600410b10fb01201341086a2019290000370000201320012900b801370000024002400240200141e0016a108a02220241ff01714102460d0020024101710d010b410410242202450d0120024100360200200142818080801037029c012001200236029801200141f8016a22044200370300200141f0016a22194200370300200141e0016a41086a220d4200370300200142003703e001200141e0016a41bb8cc700410f10fb01200141b8016a41dfeec600410b10fb01201341086a220b200141b8016a41086a221a290000370000201320012900b801370000200141e0016a20014198016a108b0220021026410410242202450d0120024100360200200142818080801037029c0120012002360298012004420037030020194200370300200d4200370300200142003703e001200141e0016a41bb8cc700410f10fb01200141b8016a41eaeec600410c10fb01200b201a290000370000201320012900b801370000200141e0016a20014198016a108b02200210262004420037030020194200370300200d4200370300200142003703e001200141e0016a41bb8cc700410f10fb01200141b8016a41f6eec600410610fb01200b201a290000370000201320012900b801370000200141003602b801200141e0016a4120200141b8016a410410b3012004420037030020194200370300200d4200370300200142003703e001200141e0016a41bb8cc700410f10fb01200141b8016a41e0fcc600410b10fb01200b201a290000370000201320012900b801370000200141013a009801200141e0016a412020014198016a410110b3010b200141f8016a4200370300200141f0016a4200370300200141e0016a41086a4200370300200142003703e001200141e0016a41bb8cc700410f10fb01200141b8016a41dfeec600410b10fb01201341086a200141b8016a41086a290000370000201320012900b801370000200141b8016a200141e0016a108c020240024020012802b801220a0d004100210e20014100360240200142043703384104210a410021140c010b200120012902bc01221537023c2001200a3602382015422088a721142015a7210e0b200141f8016a4200370300200141f0016a4200370300200141e0016a41086a4200370300200142003703e001200141e0016a41bb8cc700410f10fb01200141b8016a41eaeec600410c10fb01201341086a200141b8016a41086a290000370000201320012900b801370000200141b8016a200141e0016a108c020240024020012802b801220d0d004100211a2001410036028001200142043703784104210d410021110c010b200120012902bc01221537027c2001200d3602782015422088a7211a2015a721110b02400240024002400240200c0d002014450d012014410274200a6a417c6a28020021080b201441002014419c7f6a22022002201441016a22054b1b2212490d0120014100360240200541e600490d03200a20124102746a2109200a211b0340201b280200210b02400240024002400240201a41014b0d0041002102201a0e020201020b41002102201a2104034020022004410176221920026a220c200b200d200c4102746a280200491b2102200420196b220441014b0d000b0b200b200d200241027422046a2802002219460d022002200b20194b6a21020c010b410021020b200120023602e00141b4efc600412e200141e0016a41e4efc60041f4efc6001036000b201a20024d0d03200d20046a2204200441046a201a2002417f736a41027410d0061a2001201a417f6a221a36028001201b41046a221b2009470d000c040b0b41fceec600412641a4efc6001053000b201220141040000b2002201a103e000b410021024100210b0240201420126b2204450d000240200541e600490d00200a200a20124102746a200441027410d0061a0b200120043602402004210b0b024002400240024002400240024002400240024002400240201a41014b0d00201a0e020201020b41002102201a2104034020022004410176221920026a220c2008200d200c4102746a280200491b2102200420196b220441014b0d000b0b201a20022008200d20024102746a2802004b6a2202490d010b0240201a2011470d00200141f8006a201110f1012001280278210d0b200d20024102746a220441046a2004201a20026b41027410d0061a200420083602002001201a41016a2202360280010240200b200e470d00200141386a200e10f1012001280240210b2001280238210a0b200a200b4102746a20083602002001200b41016a220b3602402002450d01200241017621042002410171450d02200220044d0d04200d20044102746a280200210d0c030b2002201a103b000b4184f0c60041c30041dcbcc700102f000b200220044d0d0220022004417f6a22194d0d03200d20194102746a280200200d20044102746a2802006a410176210d0b20014198016a41086a2202200141386a41086a2802003602002001200129033837039801200141f8016a22044200370300200141f0016a22194200370300200141e0016a41086a220c4200370300200142003703e001200141e0016a41bb8cc700410f10fb01200141b8016a41dfeec600410b10fb01201341086a221a200141b8016a41086a221b290000370000201320012900b801370000200141e0016a20014198016a108b020240200128029c0141ffffffff0371450d0020012802980110260b2002200141f8006a41086a28020036020020012001290378370398012004420037030020194200370300200c4200370300200142003703e001200141e0016a41bb8cc700410f10fb01200141b8016a41eaeec600410c10fb01201a201b290000370000201320012900b801370000200141e0016a20014198016a108b020240200128029c0141ffffffff0371450d0020012802980110260b200141e0016a41186a22194200370300200141e0016a41106a22024200370300200141e0016a41086a22044200370300200142003703e001200141e0016a41bb8cc700410f10fb01200141b8016a41f6eec600410610fb01201341086a200141b8016a41086a220c290000370000201320012900b8013700002001200d3602b801200141e0016a4120200141b8016a410410b3010240200b41e500470d0020014198016a41186a420037030020014198016a41106a420037030020014198016a41086a220d42003703002001420037039801200141e0016a41808cc700410610fb01200d2004290000370300200120012900e00137039801200141e0016a41ea93c400410610fb01200341086a2004290000370000200320012900e001370000200141206a20014198016a41201089020b201942003703002002420037030020044200370300200142003703e001200141b8016a41a28cc700410a10fb012004200c290000370300200120012900b8013703e001200141b8016a41dab8c500410610fb012019200c290000370300200220012900b801370300200141e0016a412010ff01201942003703002002420037030020044200370300200142003703e001200141b8016a41a28cc700410a10fb012004200c290000370300200120012900b8013703e001200141b8016a41b0cbc500410c10fb012019200c290000370300200220012900b801370300200141e0016a412010ff01201942003703002002420037030020044200370300200142003703e001200141b8016a41cca3c700411210fb012004200c290000370300200120012900b8013703e001200141b8016a41f4b1c500411110fb012019200c290000370300200220012900b801370300200141086a200141e0016a108d02200141086a41106a29030021222001290310212320012802082104200141e0016a4201420042808090bbbad6adf00d4200428094ebdc034200108e020240024020012802e0014101470d00427f2116427f21150c010b200141f0016a2903002115200141e8016a29030021160b200141b0016a420037030020014198016a41106a420037030020014198016a41086a220c42003703002001420037039801200141e0016a41808cc700410610fb01200c200141e0016a41086a2219290000370300200120012900e00137039801200141e0016a41b8bbc400410b10fb01200341086a2019290000370000200320012900e001370000200141e0016a20014198016a108f0220012903e801211720012903e0012118200141e0016a4203420042808090bbbad6adf00d420042a08d064200108e022017420020184201511b22104280b0def7d32b20104280b0def7d32b541b21070240024020012802e0014101470d00427f2117427f21180c010b200141e0016a41106a2903002118201929030021170b200141e0016a20074280ccf7fdf40a20074280ccf7fdf40a5622191b22244280ccf7fdf40a201020191b22107d42002024201054ad7d42808090bbbad6adf00d42004280b0def7d32b4200108e020240024020012802e0014101470d00427f2110427f21240c010b200141f0016a2903002124200141e8016a29030021100b200141e0016a201020242010202442808090bbbad6adf00d4200108e020240024020012802e0014101470d00427f2125427f21260c010b200141f0016a2903002126200141e8016a29030021250b200141e0016a201720182017201842808090bbbad6adf00d4200108e020240024020012802e0014101470d00427f2127427f21280c010b200141f0016a2903002128200141e8016a29030021270b200141e0016a2027202842808090bbbad6adf00d4200428080a0f6f4acdbe01b4200108e0220012802e0014101460d032016202342808090bbbad6adf00d20041b222754211920152022420020041b22225121042015202254210c200141f0016a220d2903002123200141e8016a220b2903002128200141e0016a201720182010202442808090bbbad6adf00d4200108e020240024020012802e0014101470d00427f2124427f21100c010b200d2903002110200b29030021240b2019200c20041b2104200141e0016a202820232025202642808090bbbad6adf00d4200108e020240024020012802e0014101470d00427f2123427f21250c010b200141f0016a2903002125200141e8016a29030021230b2022201520041b21172027201620041b211802400240200742ffcbf7fdf40a560d00200141e0016a4200202420237d22072007202456201020257d2024202354ad7d220720105620072010511b22041b4200200720041b2018201742808090bbbad6adf00d4200108e020240024020012802e0014101470d00427f2107427f21100c010b200141f0016a2903002110200141e8016a29030021070b4200201720107d2018200754ad7d2210201820077d2207201856201020175620102017511b22041b221720154200200720041b2218201656201720155620172015511b22041b21152018201620041b21160c010b427f2122200141e0016a427f202420237c220720072024542204201020257c2004ad7c220720105420072010511b22041b427f200720041b2018201742808090bbbad6adf00d4200108e020240024020012802e0014101470d00427f21070c010b200141f0016a2903002107200141e8016a29030021220b427f201720077c201820227c22072018542204ad7c22182004201820175420182017511b22041b22172015427f200720041b2218201656201720155620172015511b22041b21152018201620041b21160b200141f8016a220c4200370300200141e0016a41106a220d4200370300200141e0016a41086a22044200370300200142003703e001200141b8016a41cca3c700411210fb012004200141b8016a41086a2219290000370300200120012900b8013703e001200141b8016a41f4b1c500411110fb01200241086a2019290000370000200220012900b801370000200120153703c001200120163703b801200141e0016a4120200141b8016a411010b301200c4200370300200d420037030020044200370300200142003703e001200141b8016a418a8cc700410910fb0120042019290000370300200120012900b8013703e001200141b8016a41d4e6c600410910fb01200c2019290000370300200d20012900b801370300200141e0016a108a02220241ff01714102460d04200141e0016a412010ff012002410171450d04200141b8016a41186a22044200370300200141b8016a41106a22024200370300200141b8016a41086a22194200370300200142003703b801200141e0016a41868cc700410410fb012019200141e0016a41086a220c290000370300200120012900e0013703b801200141e0016a41e0fcc600410b10fb012004200c290000370300200220012900e001370300200141e0016a200141b8016a109002024020012d00e00122044102460d00200141b8016a412010ff01200141f8006a41086a200141e9016a290000370300200141f8006a41106a200141f1016a290000370300200141f8006a41186a200141f9016a290000370300200120012900e1013703780240200441037122044103460d0020040e03010001010b20014198016a41186a200141f8006a41186a29030037030020014198016a41106a200141f8006a41106a29030037030020014198016a41086a200141f8006a41086a2903003703002001200129037837039801200141b8016a41186a4200370300200141b8016a41106a4200370300200141b8016a41086a22044200370300200142003703b801200141e0016a41868cc700410410fb012004200141e0016a41086a2219290000370300200120012900e0013703b801200141e0016a41dca0c600410c10fb01200241086a2019290000370000200220012900e0013700002001200141b8016a412010890241002119200141e0016a2001280204410020012802001b220d109102200141b8016a20012802e001220b20012802e8011092020240024020012802b801220c0d0020014100360240200142013703384101210c410021040c010b200120012902bc01221537023c2001200c3602382015422088a721042015a721190b024020012802e401450d00200b10260b024002402004418002490d00412010242204450d082004200129039801370000200441186a20014198016a41186a290300370000200441106a20014198016a41106a290300370000200441086a20014198016a41086a29030037000020014281808080103702bc01200120043602b801200141e0016a200d41016a220b10910220012802e001210d200120012802e80136026c2001200d360268200141b8016a200141e8006a10b201024020012802e401450d00200d10260b20041026200141b8016a41186a4200370300200141b8016a41106a4200370300200141b8016a41086a22044200370300200142003703b801200141e0016a41868cc700410410fb012004200141e0016a41086a220d290000370300200120012900e0013703b801200141e0016a41dca0c600410c10fb01200241086a200d290000370000200220012900e0013700002001200b3602e001200141b8016a4120200141e0016a410410b3010c010b200141e0016a41186a220b20014198016a41186a290300370300200141e0016a41106a221a20014198016a41106a290300370300200141e0016a41086a221b20014198016a41086a29030037030020012001290398013703e001024020042019470d00200141386a200410f6012001280238210c200128024021040b200c20044105746a221920012903e001370000201941186a200b290300370000201941106a201a290300370000201941086a201b2903003700002001200441016a360240200141e0016a200d10910220012802e0012104200120012802e8013602bc01200120043602b801200141386a200141b8016a10b201024020012802e401450d00200410260b200128023c21190b201941ffffff3f71450d00200c10260b200141d0016a4200370300200141c8016a4200370300200141b8016a41086a22044200370300200142003703b801200141e0016a41868cc700410410fb012004200141e0016a41086a2219290000370300200120012900e0013703b801200141e0016a41838dc600410810fb01200241086a2019290000370000200220012900e001370000200141b8016a412010ff01200141e0026a24000f0b2004200241c8f0c6001032000b2004200241d8f0c6001032000b2019200241e8f0c6001032000b109302000b4194f4c400412b41dcbcc700102f000b102c000b2c0020002002ad4220862001ad8410122201290000370000200041086a200141086a290000370000200110260bb30201027f230041e0006b220224002002412036020c20022001360208200241106a2001412010820202400240200228021022010d00200041003602000c010b200228021421032002200241106a41086a28020036022420022001360220200241c8006a200241206a10e6010240024020022802480d0020024100360230200242013703282002410e36023c2002200241086a3602382002200241286a360244200241dc006a41013602002002420137024c2002418c8dc6003602482002200241386a360258200241c4006a41c4e1c000200241c8006a10351a200228022820022802301084020240200228022c450d00200228022810260b200041003602000c010b20002002290348370200200041086a200241c8006a41086a2802003602000b2003450d00200110260b200241e0006a24000bd60a04047f017e0e7f027e23004180036b220224002002412036020c20022001360208200241106a2001412010820202400240200228021022030d00200041003602000c010b200228021421042002200241186a280200360224200220033602202002200241206a108f010240024020022802000d00024002400240200228020422052002280224412c6e2201200120054b1bad422c7e2206422088a70d002006a72201417f4c0d000240024020010d00410421070c010b200110242207450d020b41002108200241003602302002200736022820022001412c6e36022c02402005450d004100210903402002280224220a4104490d042002280220220b280000210c2002200a417c6a220d3602242002200b41046a2201360220200d450d0420012d0000210d2002200a417b6a220e3602242002200141016a360220200d41014b0d044102210f02400240200d0e020100010b41002101200241003a00b802417a210f0240024002400340200e2001460d0120024198026a20016a200b20016a220d41056a2d00003a00002002200a200f6a3602242002200d41066a3602202002200141016a220d3a00b802200f417f6a210f200d2101200d4120470d000b200241e0026a41186a220120024198026a41186a290300370300200241e0026a41106a221020024198026a41106a290300370300200241e0026a41086a221120024198026a41086a29030037030020022002290398023703e002200d41ff01714120490d08200241f8016a41086a22122011290300370300200241f8016a41106a22112010290300370300200241f8016a41186a22132001290300370300200220022903e0023703f801200e200d460d08200b200d6a220b41056a2d000021012002200a200f6a220e3602242002200b41066a2214360220200141014b0d084100210f20010e020201020b200141ff0171450d07200241003a00b8020c070b200e4104490d06201428000021102002200a200d6b41766a3602242002200b410a6a3602204101210f0b200241b8016a41086a2012290300220637030020024198016a41186a201329030037030020024198016a41106a201129030037030020024198016a41086a2006370300200220022903f80122063703b80120022006370398010b200941016a2109200241d8006a41086a20024198016a41086a2903002206370300200241d8006a41106a20024198016a41106a2903002215370300200241d8006a41186a20024198016a41186a2903002216370300200241386a41086a220d2006370300200241386a41106a220a2015370300200241386a41186a220b2016370300200220022903980122063703582002200637033802402008200228022c470d00200241286a2008410110e80120022802282107200228023021080b20072008412c6c6a2201200c36020020012002290338370204200b2903002106200a2903002115200d2903002116200141286a2010360200200141246a200f3602002001410c6a2016370200200141146a20153702002001411c6a20063702002002200841016a220836023020092005470d000b0b2007450d032000200229022c370204200020073602000c040b1034000b1033000b200228022c2201450d002001412c6c450d00200710260b200241003602e802200242013703e0022002410e3602c4022002200241086a3602c0022002200241e0026a3602f801200241ac026a41013602002002420137029c022002418c8dc600360298022002200241c0026a3602a802200241f8016a41c4e1c00020024198026a10351a20022802e00220022802e802108402024020022802e402450d0020022802e00210260b200041003602000b2004450d00200310260b20024180036a24000bb30a04047f017e0c7f027e230041a0026b220224002002412036021c20022001360218200241206a2001412010820202400240200228022022030d00200041003602000c010b200228022421042002200241286a28020036023420022003360230200241106a200241306a108f010240024020022802100d000240024002400240200228021422052002280234410c6e2201200120054b1bad420c7e2206422088a70d002006a72201417f4c0d000240024020010d00410421070c010b200110242207450d020b200241003602402002200736023820022001410c6e36023c02400240024002402005450d0041002108410021090340200241086a200241306a108f0120022802080d08200228020c220a200228023441246e22012001200a4b1bad42247e2206422088a70d052006a72201417f4c0d050240024020010d004104210b0c010b20011024220b450d070b200241003602502002200b3602482002200141246e36024c0240200a450d004100210c4100210d03402002280234220e4104490d05200d41016a210d2002280230220f28000021102002200e417c6a22113602342002200f41046a36023041002101200241003a00d801200e417b6a210e034020112001460d05200241b8016a20016a200f20016a221241046a2d00003a00002002201241056a3602302002200141016a22123a00d8012002200e360234200e417f6a210e2012210120124120470d000b20024180026a41186a2201200241b8016a41186a29030037030020024180026a41106a220e200241b8016a41106a29030037030020024180026a41086a220f200241b8016a41086a290300370300200220022903b80137038002201241ff01714120490d05200241f8006a41086a200f2903002206370300200241f8006a41106a200e2903002213370300200241f8006a41186a20012903002214370300200241d8006a41186a220e2014370300200241d8006a41106a22122013370300200241d8006a41086a220f2006370300200220022903800222063703980120022006370378200220063703580240200c200228024c470d00200241c8006a200c410110d1012002280248210b2002280250210c0b200b200c41246c6a22012010360200200120022903583702042001410c6a200f290300370200200141146a20122903003702002001411c6a200e2903003702002002200c41016a220c360250200d200a470d000b0b200b450d08200941016a2109200229024c210602402008200228023c470d00200241386a2008410110cb0120022802382107200228024021080b20072008410c6c6a220120063702042001200b3602002002200841016a220836024020092005470d000b0b20070d020c070b200141ff0171450d00200241003a00d8010b200228024c2201450d04200141246c0d030c040b2000200229023c370204200020073602000c050b1034000b1033000b200b10260b02402008450d002008410c6c210e2007210103400240200141046a2802002212450d00201241246c450d00200128020010260b2001410c6a2101200e41746a220e0d000b0b200228023c2201450d002001410c6c450d00200710260b200241003602880220024201370380022002410e3602e4012002200241186a3602e001200220024180026a36029801200241cc016a4101360200200242013702bc012002418c8dc6003602b8012002200241e0016a3602c80120024198016a41c4e1c000200241b8016a10351a2002280280022002280288021084020240200228028402450d0020022802800210260b200041003602000b2004450d00200310260b200241a0026a24000b0e002001ad4220862000ad84101c0b800301067f230041106b220224000240024020012802082203410c6c41046a2204417f4c0d00200128020021050240024020040d0041012101410021040c010b200410242201450d020b2002410036020820022001360200200220043602042002200310a10102402003450d0020052003410c6c6a210603402005280200210420022005280208220310a1012005410c6a210502402003450d002004200341246c6a210720022802082103034020042802002101200220034104106d2002280200200228020822036a20013600002002200341046a2203360208200220034120106d2002280200200228020822016a2203200441046a290000370000200341086a2004410c6a290000370000200341106a200441146a290000370000200341186a2004411c6a2900003700002002200141206a2203360208200441246a22042007470d000b0b20052006470d000b0b2000412020022802002204200228020810b30102402002280204450d00200410260b200241106a24000f0b1034000b1033000b9d0102017f017e230041106b2206240002402002ad4220862001ad842004ad4220862003ad84200510202207422088a72204450d002007a722052d0000220341014b0d00410021010240024020030e020100010b2004417f6a4104490d0120052800012102410121010b200510262000200236020420002001360200200641106a24000f0b4196aec700412e200641086a41c4aec70041d4aec7001036000b130020002002ad4220862001ad84101e10c5060b930101047f230041106b22022400200028020421032000280200210041012104200128021841db9ec00041012001411c6a28020028020c1100002105200241003a000d200220053a000c200220013602080240200241086a2000200020036a10b10122012d00040d002001280200220128021841da9ec00041012001411c6a28020028020c11000021040b200241106a240020040b0e002001ad4220862000ad84100e0bdb0302037f017e20004201370200200041086a410036020002402001280200220241044b0d000240024002400240024020020e050001020304000b200041004101106d2000280200200041086a220228020022036a41013a00002002200341016a3602002000200141046a10a5010f0b200041004101106d2000280200200041086a220228020022036a41023a00002002200341016a220336020020012802042104200020034104106d2000280200200228020022036a20043600002002200341046a3602002000200141086a10a5010f0b200041004101106d2000280200200041086a220228020022036a41033a00002002200341016a2203360200200141086a2903002105200020034108106d2000280200200228020022006a20053700002002200041086a3602000f0b200041004101106d2000280200200041086a220228020022036a41043a00002002200341016a220336020020012802042101200020034104106d2000280200200228020022006a20013600002002200041046a3602000f0b200041004101106d2000280200200041086a220228020022036a41053a00002002200341016a220336020020012802042101200020034104106d2000280200200228020022006a20013600002002200041046a3602000b0b8e0301047f230041f0006b22012400200141086a41206a200041206a280200360200200141086a41186a200041186a290200370300200141086a41106a200041106a290200370300200141086a41086a2202200041086a29020037030020012000290200370308200141306a41186a22004200370300200141306a41106a22034200370300200141306a41086a420037030020014200370330200141306a41808cc700410610fb01200141e0006a41f093c400410610fb012000200141e0006a41086a220429000037030020032001290060370300200141d0006a200141086a10a2012004200141d0006a41086a28020036020020012001290350370360200141306a4120200141e0006a10e9030240024020012d0008220041044b0d0002400240024020000e050400010204040b200141146a280200450d03200141106a28020010260c030b200141146a280200450d02200141106a28020010260c020b200141146a280200450d01200141106a28020010260c010b2002280200450d00200128020c10260b200141f0006a24000bfc0a010d7f23004180026b22012400200141c0016a22024200370300200141b8016a22034200370300200141a8016a41086a22044200370300200142003703a801200141c8016a41808cc700410610fb012004200141c8016a41086a2205290000370300200120012900c8013703a801200141c8016a41ea93c400410610fb0120022005290000370300200320012900c801370300200141086a200141a8016a4120108902024002402001280208450d00200128020c450d00200141c0016a22064200370300200141b8016a22074200370300200141a8016a41086a22024200370300200142003703a801200141c8016a41808cc700410610fb012002200141c8016a41086a2204290000370300200120012900c8013703a801200141c8016a41fcbfc400410e10fb01200341086a22082004290000370000200320012900c801370000200141203602dc012001200141a8016a3602d801200141e0016a200141a8016a41201082020240024020012802e00122090d00410321050c010b20012802e401210a024002400240200141e0016a41086a280200220b450d0020092d0000220c41024b0d004101210502400240200c0e03000401000b200b417f6a4104490d012009280001210d410021050c030b410221050c010b200141003602d001200142013703c8012001410e3602f4012001200141d8016a3602f0012001200141c8016a3602fc01200141246a4101360200200142013702142001418c8dc6003602102001200141f0016a360220200141fc016a41c4e1c000200141106a10351a20012802c80120012802d001108402024020012802cc01450d0020012802c80110260b410321050b0b200a450d00200910260b200141003602b001200142013703a801200141a8016a4100410010930120014194016a200d36020020014102200520054103461b36029001200141106a200041800110cf061a200141a0016a220520012802b001360200200120012903a80137039801200642003703002007420037030020024200370300200142003703a801200141c8016a41808cc700410610fb0120022004290000370300200120012900c8013703a801200141c8016a418cbec400410a10fb0120082004290000370000200320012900c8013700002001200141a8016a412010890202402001280204410020012802001b220241016a22002002490d00200141c0016a220d4200370300200141b8016a22064200370300200141a8016a41086a22024200370300200142003703a801200141c8016a41808cc700410610fb012002200141c8016a41086a2204290000370300200120012900c8013703a801200141c8016a418cbec400410a10fb01200341086a22072004290000370000200320012900c801370000200120003602c801200141a8016a4120200141c8016a410410b301200d42003703002006420037030020024200370300200142003703a801200141c8016a41808cc700410610fb0120022004290000370300200120012900c8013703a801200141c8016a418e94c400410610fb0120072004290000370000200320012900c801370000200141003602e801200142013703e001200141106a4180016a200141e0016a10b504200141106a200141e0016a10b6042001280298012103200141e0016a2005280200220210a10102402002450d002002410574210203402001200141e0016a3602c8012003200141c8016a109c01200341206a2103200241606a22020d000b0b2004200141e0016a41086a280200360200200120012903e0013703c801200141a8016a4120200141c8016a10e903200141106a10b7042001419c016a28020041ffffff3f71450d0220012802980110260c020b200141106a10b7042001419c016a28020041ffffff3f71450d0120012802980110260c010b200010b7040b20014180026a24000bd70201017f20004201370200200041086a22044100360200024002400240024020010e0400010203000b200041004101106d2000280200200428020022006a41003a00002004200041016a3602000f0b200041004101106d2000280200200428020022016a41013a00002004200141016a2201360200200020014104106d2000280200200428020022016a20023600002004200141046a2201360200200020014104106d2000280200200428020022006a20033600002004200041046a3602000f0b200041004101106d2000280200200428020022006a41023a00002004200041016a3602000f0b200041004101106d2000280200200428020022016a41033a00002004200141016a2201360200200020014104106d2000280200200428020022016a20023600002004200141046a2201360200200020014104106d2000280200200428020022006a20033600002004200041046a3602000b840201037f230041d0006b220324002003200236020420032001360200200341086a2001200210820202400240200328020822040d00410021010c010b200328020c210502400240200341106a2802004104490d0020042800002102410121010c010b4100210120034100360220200342013703182003410e36022c200320033602282003200341186a360234200341cc006a41013602002003420137023c2003418c8dc6003602382003200341286a360248200341346a41c4e1c000200341386a10351a200328021820032802201084020240200328021c450d00200328021810260b0b2005450d00200410260b2000200236020420002001360200200341d0006a24000b890201047f230041d0006b220124002001412036020420012000360200200141086a2000412010820202400240200128020822020d00410221000c010b200128020c210302400240200141106a280200450d0020022d0000220441014b0d0041002100024020040e020200020b410121000c010b20014100360220200142013703182001410e36022c200120013602282001200141186a360234200141cc006a41013602002001420137023c2001418c8dc6003602382001200141286a360248200141346a41c4e1c000200141386a10351a200128021820012802201084020240200128021c450d00200128021810260b410221000b2003450d00200210260b200141d0006a240020000ba00301057f230041106b220224000240024020012802082203410274220441046a2205417f4c0d00200128020021010240024020050d0041012106410021050c010b200510242206450d020b2002410036020820022006360200200220053602040240024002400240200341c000490d00200341808001490d012003418080808004490d02200241004101106d2002280200200228020822056a41033a00002002200541016a2205360208200220054104106d2002280200200228020822056a2003360000200541046a21050c030b200241004101106d2002280200200228020822056a20034102743a0000200541016a21050c020b200241004102106d2002280200200228020822056a20034102744101723b0000200541026a21050c010b200241004104106d2002280200200228020822056a2004410272360000200541046a21050b20022005360208200220052004106d20022802002205200228020822036a2001200410cf061a2002200320046a2204360208200041202005200410b30102402002280204450d00200510260b200241106a24000f0b1034000b1033000bb30201027f230041e0006b220224002002412036020c20022001360208200241106a2001412010820202400240200228021022010d00200041003602000c010b200228021421032002200241106a41086a28020036022420022001360220200241c8006a200241206a10e2010240024020022802480d0020024100360230200242013703282002410e36023c2002200241086a3602382002200241286a360244200241dc006a41013602002002420137024c2002418c8dc6003602482002200241386a360258200241c4006a41c4e1c000200241c8006a10351a200228022820022802301084020240200228022c450d00200228022810260b200041003602000c010b20002002290348370200200041086a200241c8006a41086a2802003602000b2003450d00200110260b200241e0006a24000ba10204017f017e017f027e230041d0006b220224002002412036020420022001360200200241086a2001412010820202400240200228020822010d00420021030c010b200228020c210402400240200241086a41086a2802004110490d00200141086a290000210520012900002106420121030c010b20024100360220200242013703182002410e36022c200220023602282002200241186a360234200241cc006a41013602002002420137023c2002418c8dc6003602382002200241286a360248200241346a41c4e1c000200241386a10351a200228021820022802201084020240200228021c450d00200228021810260b420021030b2004450d00200110260b2000200637030820002003370300200041106a2005370300200241d0006a24000be32e05017f027e017f027e1c7f230041f0026b22072400024002400240024002402001200284500d002003200484500d004201210842002109200741f8006a200320012003200156200420025620042002511b220a1b220b20042002200a1b220c20054201200542015620064200522006501b220d1b220520064200200d1b220610cb0620022004200a1b210220012003200a1b21042007290378200741f8006a41086a29030084500d01200741e8006a200420022005200610cb062007290368200741e8006a41086a29030084500d0220052108200621090c030b20004100360200200041106a4200370300200041086a42003703000c030b200741c8006a200b200c2005200610d306200741c8006a41086a290300210c2007290348210b0c010b200741d8006a200420022005200610d306200741e0006a29030021024200210942012108200729035821040b200741186a200c42002004420010cc06200741286a20024200200b420010cc06200741386a200b42002004420010cc06024002400240024002400240024002400240024002400240200c420052200242005271200729032042005272200729033042005272200741386a41086a2903002201200729031820072903287c7c2203200154724101470d0041101024220a450d092007420437028c022007200a3602880220074188026a4100410410e70120074188016a41086a200728029002220a41046a360200200728028802200a4102746a220a200b3e020c200a200b4220883e0208200a200c3e0204200a200c4220883e020020072007290388023703880120074188016a10b80641101024220a450d092007420437028c022007200a3602880220074188026a4100410410e70120074198016a41086a200728029002220a41046a360200200728028802200a4102746a220a20043e020c200a20044220883e0208200a20023e0204200a20024220883e020020072007290388023703980120074198016a10b80641101024220a450d092007420437028c022007200a3602880220074188026a4100410410e701200741a8016a41086a200728029002220a41046a360200200728028802200a4102746a220a2008a7220e36020c200a20084220883e0208200a20093e0204200a20094220883e020020072007290388023703a801200741a8016a10b806200741f8016a41086a20074198016a41086a28020036020020072007290398013703f80120074188026a41086a20074188016a41086a280200360200200720072903880137038802200741b8016a20074188026a200741f8016a10b906024020072802fc0141ffffffff0371450d0020072802f80110260b200741b8016a10b80620072802c001210f20072802bc01211020072802b801211120072802b001220a41014b0d01200a0e020602060b200741086a200729033820032008200910d30620004100360200200041106a200741086a41086a290300370300200041086a20072903083703000c0b0b20072802a801220d2802000d010c040b200f4101200f41014b1b221241ffffffff03712012470d012012410274220a417f4c0d0102400240200a0d004104210d0c010b200a102a220d450d070b200720123602f0012007200d3602e8012007200a4102763602ec0102400240200f450d00200d2012410274200f4102746b6a210d4100200f6b210a200e4101200e41014b1bad2102420021042011210e03402012200a6a220f20124f0d02200d2004422086200e3502008422042002803e0200200e41046a210e200d41046a210d20042002822104200a41016a220f200a492113200f210a2013450d000b0b201041ffffffff0371450d06201110260c060b200f201241d8a7c7001032000b200f450d012011280200450d02200f200a4d0d022007200a3602c401200f200a6b221441016a22154101201541014b1b221641ffffffff03712016470d0020164102742217417f4c0d002017102a2218450d05200a4101200a41014b1b221941ffffffff03712019470d002019410274221a417f4c0d00201a102a221b450d054102210a4101210e200d280200220d67221c21130240200d41ffffffff034b0d004102210a201c210d4101210e0340200a4101200d4101711b200e6c210e200d41034b2112200a200a6c210a200d4101762213210d20120d000b0b2007200f36028002200720103602fc01200720113602f80141041024220d450d06200d200a410120134101461b200e6c220e360200200742818080801037028c022007200d36028802200741c8016a200741f8016a20074188026a10b906200d1026200741f8016a200741a8016a10ba0641041024220a450d06200a200e360200200742818080801037028c022007200a36028802200741d8016a200741f8016a20074188026a10b906200a10260240201520072802c4016a220a20072802d001220d4d0d002007410036028002200742043703f801200741f8016a4100200a200d6b220d10e701200728028002210a0240200d450d0020072802f801200a4102746a4100200d41027410d1061a200a200d6a210a0b2007200a3602800220072802c801210e200741f8016a200a20072802d001220d10e70120072802f801200728028002220a4102746a200e200d41027410cf061a2007200a200d6a220a3602800220074188026a41086a220d200a360200200720072903f80137038802024020072802cc0141ffffffff0371450d0020072802c80110260b200741c8016a41086a200d28020036020020072007290388023703c8010b2017410276211d201a410276211e200741d8016a10b8060240024002400240024002400240024002400240034020072014221f3602e401024020072802d001220a20072802c401220d201f6a220e417f736a2212200a490d002012200a41b0a6c7001032000b0240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200a200a200e6b220e4d0d0020072802e001220a200a200d6b220d4d0d0120072802d801200d4102746a35020022024200510d02201f417f6a4100201f1b211420072802c801220a20124102746a3502002104200a200e4102746a3502002101200741003602e8012007200120044220868422042002803703f0012007200420028237038002200741003602f8012007200741e4016a36029c022007200741c8016a360298022007200741c4016a360294022007200741d8016a360290022007200741f8016a36028c022007200741e8016a3602880220074188026a10bb061a034020072802f801220a41016a41004c0d042007200a3602f801024020072903800242ffffffff0f560d0020074188026a10bb060d010b0b20072903f00121024100210e200741003602a802200742043703a002024020072802c401221020072802e401220d6a220a2010490d00201041016a220e20104f0d00410421204100210e4100210f034020072802d0012212200a417f736a221320124f0d06200d200a4f2112200a200d200a496b210a20072802c80120134102746a28020021130240200f20072802a402470d00200741a0026a200f417f41004100417f200a200d6b221141016a221020102011491b20121b200a200d491b221141016a221020102011491b10e70120072802a00221200b2020200e6a20133602002007200f41016a220f3602a802200e41046a210e200a200d49201272450d000c0b0b0b200741a0026a4100200e10e70120072802a802210f20072802a0022120200a200d490d082020200f4102746a2112200a200d4d0d05200a417f73210e0340200e20072802d00122116a2213200e4f0d07201220072802c80120134102746a280200360200200e41016a210e201241046a2112200d200a417f6a220a490d000b2010200f6a210f0c070b200e200a41b0a6c7001032000b200d200a41b0a6c7001032000b4180a8c7004119419ca8c700102f000b41aca8c7004118200741e0026a41c4a8c70041d4a8c7001036000b2013201241b0a6c7001032000b2010450d010c020b2013201141b0a6c7001032000b20072802d001220a200d417f736a220d200a4f0d02201220072802c801200d4102746a280200360200200f41016a210f0b2007200f3602a8020b200741d0026a200741d8016a10ba0641081024220a450d23200a2002a72221360204200a20024220883e020020074282808080203702e4022007200a3602e002200741b0026a200741d0026a200741e0026a10b906200a1026200f20072802b8022222200f20224b1b22114101201141014b1b221341ffffffff03712013470d1d20134102742223417f4c0d1d20072802a40221240240024020230d00410421250c010b2023102a2225450d230b024002402011450d002013417f6a210d2022417f6a222620224b2115200f417f6a2227200f4b2117202520236a417c6a210e410021124200210420072802b002212803404100210a024020170d004100210a200f202720126b22104d0d004100210a201020274b0d00202020104102746a280200210a0b200aad21024100210a024020150d002022202620126b22104d0d00201020264b0d00202820104102746a280200210a0b024002402002200aad22037d22012002560d00200120047d22062001560d00200642ffffffff0f832102420021040c010b20024280808080108420047d20037d2102420121040b2013200d4d0d04200e20023e0200200e417c6a210e200d417f6a210d2011201241016a2212470d000b41012110200450450d010b410021100b0240202441ffffffff0371450d00202010260b20072802c401220e20072802e401220d6a2215200e490d06200d20154f0d02200d417f73210a034020132013200d6a200a6a22124d0d04200a20072802d001220f6a220d200a4f0d0520072802c801200d4102746a202520124102746a280200360200200a417f6a210a20072802e401210d200e417f6a220e0d000c060b0b200d200a41b0a6c7001032000b200d201341d8a7c7001032000b200e450d020c030b20114101201141014b1b200d6a200a6a201341b0a6c7001032000b200d200f41d8a7c7001032000b200d2015417f73220a6a220d20136a220e200d4f0d0120072802d001220d200a6a220a200d4f0d0220072802c801200a4102746a2025200e4102746a28020036020020072802e401210d0b2016200d417f736a220a20164f0d022018200a4102746a20213602002010450d0a201620072802e401417f736a220a20164f0d032018200a4102746a220a200a280200417f6a3602004100210e200741003602e802200742043703e002024020072802c401221120072802e401220d6a220a2011490d00201141016a220e20114f0d0041042111410021124100210e034020072802d001220f200a417f736a2213200f4f0d06200d200a4f210f200a200d200a496b210a20072802c80120134102746a28020021130240200e20072802e402470d00200741e0026a200e417f41004100417f200a200d6b221141016a221020102011491b200f1b200a200d491b221141016a221020102011491b10e70120072802e00221110b201120126a20133602002007200e41016a220e3602e802201241046a2112200a200d49200f72450d000c0b0b0b200741e0026a4100200e10e70120072802e8022110200a200d490d0820072802e00220104102746a2112200a200d4d0d05200a417f73210e0340200e20072802d00122136a220f200e4f0d07201220072802c801200f4102746a280200360200200e41016a210e201241046a2112200d200a417f6a220a490d000b201120106a21100c070b200e201341b0a6c7001032000b200a200d41d8a7c7001032000b200a201641d8a7c7001032000b200a201641b0a6c7001032000b2013200f41b0a6c7001032000b2011450d010c020b200f201341b0a6c7001032000b20072802d001220a200d417f736a220d200a4f0d04201220072802c801200d4102746a280200360200201041016a21100b200720103602e8020b200741c0026a41086a200741e0026a41086a280200360200200720072903e0023703c002200741e0026a200741d8016a10ba06200741d0026a200741e0026a200741c0026a10bc06024020072802c401220a20072802e40122136a220d200a490d00024002402013200d4f0d00200d417f73210a20072802d002211120072802d802210e201321120340200e200e20126a200a6a22124d0d07200a20072802d00122106a220f200a4f0d0820072802c801200f4102746a201120124102746a280200360200200a41016a210a20072802e40121122013200d417f6a220d490d000c020b0b200a0d0120072802d802210e201321120b200e20122013417f73220a6a6a220d200e4f0d0620072802d001220e200a6a220a200e4f0d0720072802c801200a4102746a20072802d002200d4102746a2802003602000b024020072802d40241ffffffff0371450d0020072802d00210260b20072802c40241ffffffff0371450d0020072802c00210260b02402023450d00202510260b024020072802b40241ffffffff0371450d0020072802b00210260b201f0d000b02400240201c0d004100210a20072802d001211920072802cc01211e20072802c801210e201a450d01201b10260c010b024020072802c401220a4101460d004100200a6b2113201c411f7121114100201c6b411f7121102019410274201b6a417c6a210d417f210a0340200a20072802d00122126a220e200a4f0d0a2012200e417f6a220f4d0d0b2019200a6a221220194f0d0c200d20072802c8012212200f4102746a2802002010742012200e4102746a28020020117672360200200d417c6a210d2013200a417f6a220a470d000b20072802c401210a0b20072802d001220d200d200a6b220e4d0d0620192019200a6b220a4d0d07201b200a4102746a20072802c801200e4102746a280200201c411f71763602004101210a201b210e0b024020072802dc0141ffffffff0371450d0020072802d80110260b200a450d0d20072802cc0141ffffffff0371450d0d20072802c80110260c0d0b200d200a41b0a6c7001032000b2012200e41b0a6c7001032000b200f201041d8a7c7001032000b200d200e41b0a6c7001032000b200a200e41d8a7c7001032000b200e200d41b0a6c7001032000b200a201941d8a7c7001032000b200e201241b0a6c7001032000b200e417f6a201241b0a6c7001032000b2012201941d8a7c7001032000b1034000b4100410041e8a7c7001032000b410021180240201041ffffffff03710d000c010b201110260b41041024220a450d02200a410036020041041024220d450d02200d41003602000240024020180d00410121194101211e410121164101211d0c010b200a1026200d1026200e210d2018210a0b200720163602e8022007201d3602e4022007200a3602e00220072019360280022007201e3602fc012007200d3602f80120074188026a200741f8016a10bd062007280288024101460d03024020074188026a41086a29030020084201882009423f86845620074188026a41106a2903002202200942018822045620022004511b450d00200741e8016a41086a200741e0026a41086a280200360200200720072903e0023703e80141101024220a450d022007420437028c022007200a3602880220074188026a4100410410e70120074180026a200728029002220a41046a360200200728028802200a4102746a220a428080808010370208200a420037020020072007290388023703f801200741f8016a10b806200741e0026a200741e8016a200741f8016a10bc0620072802fc0141ffffffff0371450d0020072802f80110260b200741e8016a41086a200741e0026a41086a280200360200200720072903e0023703e8010b200741e8016a10b806200741f8016a41086a200741e8016a41086a280200360200200720072903e8013703f80120074188026a200741f8016a10bd064101210a024002402007280288024101470d00200041b8a4c700360204200041086a41193602000c010b200041106a20074188026a41106a290300370300200041086a20074188026a41086a2903003703004100210a0b2000200a36020020072802ac0141ffffffff0371450d0320072802a80110260c030b1033000b102c000b2007200729028c023703f80141e8a3c700412f200741f8016a4198a4c70041a8a4c7001036000b200741f0026a24000ba40202037f017e230041d0006b220224002002412036020420022001360200200241086a2001412010820202400240200228020822010d00200042003703000c010b200228020c2103024002400240200241086a41086a28020022044108490d0020044178714108470d010b20024100360220200242013703182002410e36022c200220023602282002200241186a360234200241cc006a41013602002002420137023c2002418c8dc6003602382002200241286a360248200241346a41c4e1c000200241386a10351a200228021820022802201084020240200228021c450d00200228021810260b420021050c010b200041106a200129000837030020002001290000370308420121050b200020053703002003450d00200110260b200241d0006a24000ba00702077f047e230041e0016b220224002002412036020420022001360200200241086a2001412010820202400240200228020822030d00200041023a00000c010b200228020c210402400240200241106a2802002205450d0020032d0000220641014b0d004100210102400240024020060e020100010b41002101200241003a009801200341016a21072005417f6a2106034020062001460d02200241f8006a20016a200720016a2d00003a00002002200141016a22053a0098012005210120054120470d000b200241a0016a41086a2206200241f8006a41086a290300370300200241a0016a41106a2207200241f8006a41106a290300370300200241a0016a41186a2208200241f8006a41186a290300370300200220022903783703a001410121010240200541ff01714120490d00200241d8006a41186a2008290300370300200241d8006a41106a2007290300370300200241d8006a41086a2006290300370300200220022903a001370358410021010b200241386a41086a200241d8006a41086a290300370300200241386a41106a200241d8006a41106a290300370300200241386a41186a200241d8006a41186a2903003703002002200229035837033820010d02200241186a41186a200241386a41186a290300370300200241186a41106a200241386a41106a290300370300200241186a41086a200241386a41086a29030037030020022002290338370318410121010b200241f8006a41186a200241186a41186a2903002209370300200241f8006a41106a200241186a41106a290300220a370300200241f8006a41086a200241186a41086a290300220b37030020022002290318220c370378200041196a2009370000200041116a200a370000200041096a200b3700002000200c3700010c020b0240200141ff0171450d00200241003a0098010b200241386a41086a200241d8006a41086a290300370300200241386a41106a200241d8006a41106a290300370300200241386a41186a200241d8006a41186a290300370300200220022903583703380b200241003602a801200242013703a0012002410e36025c200220023602582002200241a0016a3602382002418c016a41013602002002420137027c2002418c8dc6003602782002200241d8006a36028801200241386a41c4e1c000200241f8006a10351a20022802a00120022802a801108402024020022802a401450d0020022802a00110260b410221010b200020013a00002004450d00200310260b200241e0016a24000b980301057f230041d0006b22022400200241086a41868cc700410410fb01200241186a41c4a1c600411110fb0120022001360234200241386a200241346a410410a202200241cc006a200241346a41046a3602002002200241c0006a3602442002200241346a3602482002200241386a360240200241286a200241c0006a1073024002402002280230220341206a2204417f4c0d000240024020040d0041012101410021040c010b200410242201450d020b20002001360200200041086a220141003602002000200436020420004100411010c9012000280200200128020022046a220520022900083700002001200441106a2204360200200541086a200241086a41086a29000037000020002004411010c9012000280200200128020022046a220520022900183700002001200441106a2206360200200541086a200241186a41086a2900003700002002280228210420002006200310c9012000280200200128020022006a2004200310cf061a2001200020036a3602000240200228022c450d00200410260b200241d0006a24000f0b1034000b1033000bc908010a7f23004180026b220324002003200236020c20032001360208200341106a2001200210820202400240200328021022040d00200041003602000c010b200328021421052003200341186a280200360224200320043602202003200341206a108f010240024020032802000d000240024002402003280204220620032802244105762201200120064b1b22014105742202417f4c0d000240024020010d00410121070c010b200210242207450d020b41002108200341003602302003200136022c200320073602280240024002402006450d0041002109034041002102200341003a00b8012003280224417f6a2101200941016a210903402001417f460d0320034198016a20026a2003280220220a2d00003a00002003200a41016a3602202003200241016a220a3a00b801200320013602242001417f6a2101200a2102200a4120470d000b200341c0016a41086a220220034198016a41086a290300370300200341c0016a41106a220b20034198016a41106a290300370300200341c0016a41186a220c20034198016a41186a29030037030020032003290398013703c001410121010240200a41ff01714120490d00200341f8006a41186a200c290300370300200341f8006a41106a200b290300370300200341f8006a41086a2002290300370300200320032903c001370378410021010b200341d8006a41086a2202200341f8006a41086a290300370300200341d8006a41106a220a200341f8006a41106a290300370300200341d8006a41186a220b200341f8006a41186a2903003703002003200329037837035820010d03200341386a41186a220c200b290300370300200341386a41106a220b200a290300370300200341386a41086a220a20022903003703002003200329035837033802402008200328022c470d00200341286a200810f60120032802282107200328023021080b200720084105746a22012003290338370000200141186a200c290300370000200141106a200b290300370000200141086a200a2903003700002003200841016a220836023020092006470d000b0b2007450d052000200329022c370204200020073602000c060b0240200241ff0171450d00200341003a00b8010b200341d8006a41086a200341f8006a41086a290300370300200341d8006a41106a200341f8006a41106a290300370300200341d8006a41186a200341f8006a41186a290300370300200320032903783703580b200328022c41ffffff3f710d020c030b1034000b1033000b200710260b200341003602c801200342013703c0012003410e36027c2003200341086a3602782003200341c0016a360258200341ac016a41013602002003420137029c012003418c8dc600360298012003200341f8006a3602a801200341d8006a41c4e1c00020034198016a10351a20032802c00120032802c801108402024020032802c401450d0020032802c00110260b200041003602000b2005450d00200410260b20034180026a24000b11004182abc700411f41a4abc700102f000b910d03077f017e017f230041e0006b22052400200541306a2001109502200541086a20052802302206200528023841d4c0c700410041001081022005280208210702402005280234450d00200610260b024002400240024002400240024020074101460d002002450d010c030b200041011096020c010b200541c8006a22074200370300200541c0006a22084200370300200541306a41086a2206420037030020054200370330200541d0006a41818dc700410910fb012006200541d0006a41086a220929000037030020052005290050370330200541d0006a41eb8cc700410a10fb012007200929000037030020082005290050370300200541206a200541306a10fc01024002400240024002402005280220220a0d00410021072005410036021820054204370310410021064100210b0c010b20052005290224220c3702142005200a36021041002107024002400240200c422088a7220b41014b0d00200b0e020201020b200b2106034020072006410176220920076a220d200a200d4102746a28020020014b1b2107200620096b220641014b0d000b0b41012106200a20074102746a28020022092001460d03200b200720092001496a2207490d040b200b200ca72206470d010b200541106a2006410110e7012005280210210a0b200a20074102746a220641046a2006200b20076b41027410d0061a200620013602002005200b41016a360218410621060b200541206a41086a200541106a41086a28020036020020052005290310220c37032002400240200ca722070d00200541c8006a4200370300200541c0006a4200370300200541306a41086a2207420037030020054200370330200541d0006a41818dc700410910fb012007200541d0006a41086a220929000037030020052005290050370330200541d0006a41eb8cc700410a10fb01200841086a200929000037000020082005290050370000200541306a412010ff010c010b200541c8006a4200370300200541c0006a4200370300200541306a41086a2209420037030020054200370330200541d0006a41818dc700410910fb012009200541d0006a41086a220d29000037030020052005290050370330200541d0006a41eb8cc700410a10fb01200841086a200d29000037000020082005290050370000200541306a200541206a109702200528022441ffffffff0371450d00200710260b20064106460d02200020061096020c010b2007200b103b000b0240200441046a280200450d00200428020010260b200341046a280200450d01200328020010260c010b200428020821072004280204210a20042802002109200541d0006a41086a200341086a28020036020020052003290200370350200541306a2001109802200528023022062005280238200541d0006a10990202402005280234450d00200610260b02402005280254450d00200528025010260b200541d0006a2001109a02200741046a2206417f4c0d01200528025821032005280250210d0240024020060d0041012104410021060c010b200610242204450d030b2005410036023820052004360230200520063602340240024002400240200741c000490d00200741808001490d012007418080808004490d02200541306a41004101106d2005280230200528023822066a41033a00002005200641016a2206360238200541306a20064104106d2005280230200528023822066a20073600002005200641046a2206360238200541306a21040c030b200541306a41004101106d2005280230200528023822066a20074102743a00002005200641016a2206360238200541306a21040c020b200541306a41004102106d2005280230200528023822066a20074102744101723b00002005200641026a2206360238200541306a21040c010b200541306a41004104106d2005280230200528023822066a20074102744102723600002005200641046a2206360238200541306a21040b200420062007106d20052802302206200528023822046a2009200710cf061a2005200420076a2207360238200d20032006200710b30102402005280234450d00200610260b02402005280254450d00200d10260b0240200a450d00200910260b200541d0006a200110950220052802582106200528025021072005410036023820054201370330200541306a41004101106d20052802302201200528023822096a20023a00002005200941016a2209360238200720062001200910b30102402005280234450d00200110260b02402005280254450d00200710260b200041043a00000b200541e0006a24000f0b1034000b1033000b980301057f230041d0006b22022400200241086a41818dc700410910fb01200241186a41f0d7c000410510fb0120022001360234200241386a200241346a410410a202200241cc006a200241346a41046a3602002002200241c0006a3602442002200241346a3602482002200241386a360240200241286a200241c0006a1073024002402002280230220341206a2204417f4c0d000240024020040d0041012101410021040c010b200410242201450d020b20002001360200200041086a220141003602002000200436020420004100411010c9012000280200200128020022046a220520022900083700002001200441106a2204360200200541086a200241086a41086a29000037000020002004411010c9012000280200200128020022046a220520022900183700002001200441106a2206360200200541086a200241186a41086a2900003700002002280228210420002006200310c9012000280200200128020022006a2004200310cf061a2001200020036a3602000240200228022c450d00200410260b200241d0006a24000f0b1034000b1033000bf10101047f230041c0006b2202240041a0ebc40021034110210441042105024002400240024002400240200141ff01710e06000102030405000b2002411c6a41013602002002420137020c200241dcedc6003602082002410436022420024190f6c6003602202002200241206a360218200241086a41ecc0c700103d000b41e0b4c000210341112104410021050c030b41fcb4c0002103410e2104410121050c020b4194b5c0002103410f2104410221050c010b41acb5c0002103410c2104410321050b20004183223b0100200041086a2004360200200041046a2003360200200041026a20053a0000200241c0006a24000bf90101057f230041106b22022400024002402001280208220341027441046a2204417f4c0d00200128020021010240024020040d0041012105410021040c010b200410242205450d020b2002410036020820022005360200200220043602042002200310a1010240024020030d0020022802002106200228020821040c010b2003410274210320022802082104034020012802002105200220044104106d20022802002206200228020822046a20053600002002200441046a2204360208200141046a21012003417c6a22030d000b0b200041202006200410b30102402002280204450d00200610260b200241106a24000f0b1034000b1033000b980301057f230041d0006b22022400200241086a41eb8cc700410a10fb01200241186a41dca2c500410410fb0120022001360234200241386a200241346a410410a202200241cc006a200241346a41046a3602002002200241c0006a3602442002200241346a3602482002200241386a360240200241286a200241c0006a1073024002402002280230220341206a2204417f4c0d000240024020040d0041012101410021040c010b200410242201450d020b20002001360200200041086a220141003602002000200436020420004100411010c9012000280200200128020022046a220520022900083700002001200441106a2204360200200541086a200241086a41086a29000037000020002004411010c9012000280200200128020022046a220520022900183700002001200441106a2206360200200541086a200241186a41086a2900003700002002280228210420002006200310c9012000280200200128020022006a2004200310cf061a2001200020036a3602000240200228022c450d00200410260b200241d0006a24000f0b1034000b1033000b9e0301047f230041106b22032400024002402002280208220441046a2205417f4c0d00200228020021020240024020050d0041012106410021050c010b200510242206450d020b2003410036020820032006360200200320053602040240024002400240200441c000490d00200441808001490d012004418080808004490d02200341004101106d2003280200200328020822056a41033a00002003200541016a2205360208200320054104106d2003280200200328020822056a2004360000200541046a21050c030b200341004101106d2003280200200328020822056a20044102743a0000200541016a21050c020b200341004102106d2003280200200328020822056a20044102744101723b0000200541026a21050c010b200341004104106d2003280200200328020822056a2004410274410272360000200541046a21050b20032005360208200320052004106d20032802002205200328020822066a2002200410cf061a2003200620046a2204360208200020012005200410b30102402003280204450d00200510260b200341106a24000f0b1034000b1033000b980301057f230041d0006b22022400200241086a41eb8cc700410a10fb01200241186a41eca4c500410510fb0120022001360234200241386a200241346a410410a202200241cc006a200241346a41046a3602002002200241c0006a3602442002200241346a3602482002200241386a360240200241286a200241c0006a1073024002402002280230220341206a2204417f4c0d000240024020040d0041012101410021040c010b200410242201450d020b20002001360200200041086a220141003602002000200436020420004100411010c9012000280200200128020022046a220520022900083700002001200441106a2204360200200541086a200241086a41086a29000037000020002004411010c9012000280200200128020022046a220520022900183700002001200441106a2206360200200541086a200241186a41086a2900003700002002280228210420002006200310c9012000280200200128020022006a2004200310cf061a2001200020036a3602000240200228022c450d00200410260b200241d0006a24000f0b1034000b1033000bce0803077f017e027f230041d0006b22022400200241206a200110950202402002280220220320022802282204109c0241ff017122054102460d002003200410ff010b02402002280224450d00200310260b41022005410171200541024622051b2103024002400240024002400240024020050d0020034101710d04200241386a22054200370300200241306a22064200370300200241206a41086a2203420037030020024200370320200241c0006a41818dc700410910fb012003200241c0006a41086a220429000037030020022002290040370320200241c0006a41eb8cc700410a10fb012005200429000037030020062002290040370300200241c0006a200241206a10fc014101210720022802402205410420051b21082002290244420020051b2209422088a7220a41014b0d0141002105200a0e020302030b200020031096020c050b41002105200a2103034020052003410176220420056a220b2008200b4102746a28020020014b1b2105200320046b220341014b0d000b0b200820054102746a2802002001470d002005200a4f0d02200820054102746a2203200341046a2005417f73200a6a41027410d0061a20094280808080707c2109410021070b2002200836021020022009370214200241386a4200370300200241306a4200370300200241206a41086a2205420037030020024200370320200241c0006a41818dc700410910fb012005200241c0006a41086a220329000037030020022002290040370320200241c0006a41eb8cc700410a10fb01200641086a200329000037000020062002290040370000200241206a200241106a1097020240200942ffffffff0383500d00200810260b2007450d00200041021096020c020b200241c0006a2001109802200241206a2002280240220320022802482204109d02024020022802202205450d002003200410ff010b2002290224210902402002280244450d00200310260b200241206a2001109a0220022802202203200228022810ff0102402002280224450d00200310260b200241206a2001109e02200241086a200228022022032002280228220b1089020240200228020822044101470d002003200b10ff010b02402002280224450d00200310260b024020044101470d00200241206a2001109f0220022802202203200228022810ff012002280224450d00200310260b02402005450d00200241386a22034200370300200241306a22044200370300200241206a41086a420037030020024200370320200241206a41808cc700410610fb01200241c0006a41ea93c400410610fb012003200241c0006a41086a290000370300200420022900403703002002200241206a41201089022002280204210320022802002104200220093702242002200536022020012003410020041b200241206a10a0020b200241206a200110950220022802202205200228022810ff0102402002280224450d00200510260b200041043a00000c010b2005200a103e000b200241d0006a24000b890201037f230041d0006b220224002002200136020420022000360200200241086a2000200110820202400240200228020822010d00410221000c010b200228020c210302400240200241106a280200450d0020012d0000220441014b0d0041002100024020040e020200020b410121000c010b20024100360220200242013703182002410e36022c200220023602282002200241186a360234200241cc006a41013602002002420137023c2002418c8dc6003602382002200241286a360248200241346a41c4e1c000200241386a10351a200228021820022802201084020240200228021c450d00200228021810260b410221000b2003450d00200110260b200241d0006a240020000bcd0301057f230041e0006b220324002003200236020c20032001360208200341106a200120021082020240024002400240200328021022010d00200041003602000c010b200328021421022003200341186a280200360224200320013602202003200341206a108f0102400240024020032802000d002003280224220420032802042205490d002005417f4c0d040240024020050d0041002106410121070c010b2005102a2207450d0620032802242104200521060b0240024020042005490d0020072003280220200510cf0621042003280224220720054f0d012005200741b8afc0001048000b2006450d01200710260c010b2003200720056b3602242003200328022020056a36022020040d010b20034100360230200342013703282003410e36023c2003200341086a3602382003200341286a360244200341dc006a41013602002003420137024c2003418c8dc6003602482003200341386a360258200341c4006a41c4e1c000200341c8006a10351a200328022820032802301084020240200328022c450d00200328022810260b200041003602000c010b20002005ad4220862006ad84370204200020043602000b2002450d00200110260b200341e0006a24000f0b1034000b1033000b980301057f230041d0006b22022400200241086a41eb8cc700410a10fb01200241186a41e4f6c400411210fb0120022001360234200241386a200241346a410410a202200241cc006a200241346a41046a3602002002200241c0006a3602442002200241346a3602482002200241386a360240200241286a200241c0006a1073024002402002280230220341206a2204417f4c0d000240024020040d0041012101410021040c010b200410242201450d020b20002001360200200041086a220141003602002000200436020420004100411010c9012000280200200128020022046a220520022900083700002001200441106a2204360200200541086a200241086a41086a29000037000020002004411010c9012000280200200128020022046a220520022900183700002001200441106a2206360200200541086a200241186a41086a2900003700002002280228210420002006200310c9012000280200200128020022006a2004200310cf061a2001200020036a3602000240200228022c450d00200410260b200241d0006a24000f0b1034000b1033000b980301057f230041d0006b22022400200241086a41eb8cc700410a10fb01200241186a41d0a4c500410a10fb0120022001360234200241386a200241346a410410a202200241cc006a200241346a41046a3602002002200241c0006a3602442002200241346a3602482002200241386a360240200241286a200241c0006a1073024002402002280230220341206a2204417f4c0d000240024020040d0041012101410021040c010b200410242201450d020b20002001360200200041086a220141003602002000200436020420004100411010c9012000280200200128020022046a220520022900083700002001200441106a2204360200200541086a200241086a41086a29000037000020002004411010c9012000280200200128020022046a220520022900183700002001200441106a2206360200200541086a200241186a41086a2900003700002002280228210420002006200310c9012000280200200128020022006a2004200310cf061a2001200020036a3602000240200228022c450d00200410260b200241d0006a24000f0b1034000b1033000bbb0802067f017e230041e0006b22032400200341206a200010e403200341306a200328022022042003280228220510e503200341d0006a41086a2206200341306a41086a2802003602002003200329033037035002400240200328023c22074102470d0041002108200341003602102003420437030841002106410021070c010b200341186a2003280240360200200341086a41086a2006280200220636020020032003290350370308200328020c21080b20032007360214024020062008470d00200341086a200810f1010b2003280208220741046a2007200641027410d0061a200720013602002003200641016a360210200341386a2003290310370300200341306a41106a200341086a41106a2802003602002003200329030837033002400240200328023c4102470d002004200510ff010c010b2003410036025820034201370350200341d0006a200341306a109a01200341d0006a2003413c6a10af012004200520032802502206200328025810b30102402003280254450d00200610260b200328023441ffffffff0371450d00200328023010260b02402003280224450d00200410260b200341086a41086a200241086a28020036020020032002290200370308200341306a2000200110e603200328023022062003280238200341086a10990202402003280234450d00200610260b0240200328020c450d00200328020810260b200341206a10e30320032802202108410021060240024002400240024002402003280228220541014b0d0020050e020201020b20052102034020062002410176220720066a2204200820044103746a41046a28020020014b1b2106200220076b220241014b0d000b0b20052006200820064103746a41046a2802002001496a2206490d010b024020052003280224470d00200341206a200510ec01200328022021080b200820064103746a220241086a2002200520066b41037410d0061a20022001360204200220003602002003200541016a2206360228200341d0006a41086a20063602002003200329032022093703502009a722060d01200341c8006a22064200370300200341c0006a22024200370300200341306a41086a2207420037030020034200370330200341086a41eb8cc700410a10fb012007200341086a41086a220429000037030020032003290008370330200341086a41bbf5c400410f10fb012006200429000037030020022003290008370300200341306a412010ff010c020b20062005103b000b200341c8006a22024200370300200341c0006a22074200370300200341306a41086a2204420037030020034200370330200341086a41eb8cc700410a10fb012004200341086a41086a220129000037030020032003290008370330200341086a41bbf5c400410f10fb012002200129000037030020072003290008370300200341306a200341d0006a10e703200328025441ffffffff0171450d00200610260b200341e0006a24000b980301057f230041d0006b22022400200241086a41818dc700410910fb01200241186a419ab7c000410710fb0120022001360234200241386a200241346a410410a202200241cc006a200241346a41046a3602002002200241c0006a3602442002200241346a3602482002200241386a360240200241286a200241c0006a1073024002402002280230220341206a2204417f4c0d000240024020040d0041012101410021040c010b200410242201450d020b20002001360200200041086a220141003602002000200436020420004100411010c9012000280200200128020022046a220520022900083700002001200441106a2204360200200541086a200241086a41086a29000037000020002004411010c9012000280200200128020022046a220520022900183700002001200441106a2206360200200541086a200241186a41086a2900003700002002280228210420002006200310c9012000280200200128020022006a2004200310cf061a2001200020036a3602000240200228022c450d00200410260b200241d0006a24000f0b1034000b1033000b25002002ad4220862001ad84101321012000420037000020002001290000370000200110260b980301057f230041d0006b22022400200241086a41818dc700410910fb01200241186a41ccd7c000410b10fb0120022001360234200241386a200241346a410410a202200241cc006a200241346a41046a3602002002200241c0006a3602442002200241346a3602482002200241386a360240200241286a200241c0006a1073024002402002280230220341206a2204417f4c0d000240024020040d0041012101410021040c010b200410242201450d020b20002001360200200041086a220141003602002000200436020420004100411010c9012000280200200128020022046a220520022900083700002001200441106a2204360200200541086a200241086a41086a29000037000020002004411010c9012000280200200128020022046a220520022900183700002001200441106a2206360200200541086a200241186a41086a2900003700002002280228210420002006200310c9012000280200200128020022006a2004200310cf061a2001200020036a3602000240200228022c450d00200410260b200241d0006a24000f0b1034000b1033000bb22605017f017e197f047e0c7f230041900e6b2203240042002104200341d00d6a41186a22054200370300200341e00d6a22064200370300200341d00d6a41086a22074200370300200342003703d00d200341106a41808cc700410610fb012007200341106a41086a2208290000370300200320032900103703d00d200341106a41ea93c400410610fb012005200829000037030020062003290010370300200341086a200341d00d6a412010890220032802082109200328020c210a200542003703002006420037030020074200370300200342003703d00d200341106a41b4a3c700411810fb0120072008290000370300200320032900103703d00d200341106a41a1b7c000410e10fb012005200829000037030020062003290010370300200341f00d6a200341d00d6a412010a502200a417f6a41d100702105024002400240024020032802f00d220b0d004101210b0c010b20032902f40d220442ffffffff0f560d010b20004200370000200041186a4200370000200041106a4200370000200041086a42003700000c010b2005413020091b2105200341106a410041e00c10d1061a200041186a220c4200370000200041106a220d4200370000200041086a220e420037000020004200370000200241056a210f200b41206a211020024102742211410172211220114102722113200b2004422088a722144105746a211541d1002116200241c0004921172002418080014921182002418080808004492119200b211a4100211b0340024002402005450d00200541016a2105034002400240201a2015460d00201a2106201a41206a211a0c010b2010211a200b21062014450d050b2005417f6a22050d000b20060d010c030b0240201a2015460d00201a2106201a41206a211a0c010b2010211a200b21062014450d020b024002400240200f417f4c0d0002400240200f0d0041002105410121070c010b200f10242207450d02200f21050b200341003602b80d200320073602b00d200320053602b40d200341b00d6a41004101106d20032802b00d20032802b80d22056a201b3a00002003200541016a22053602b80d024002400240024020170d0020180d0120190d02200341b00d6a20054101106d20032802b00d20032802b80d22056a41033a00002003200541016a22053602b80d200341b00d6a20054104106d20032802b00d20032802b80d22056a2002360000200541046a21050c030b200341b00d6a20054101106d20032802b00d20032802b80d22056a20113a0000200541016a21050c020b200341b00d6a20054102106d20032802b00d20032802b80d22056a20123b0000200541026a21050c010b200341b00d6a20054104106d20032802b00d20032802b80d22056a2013360000200541046a21050b200320053602b80d200341b00d6a20052002106d20032802b00d20032802b80d22056a2001200210cf061a2003200520026a3602b80d2003200341b00d6a3602d00d2006200341d00d6a109c01200341d00d6a20032802b00d20032802b80d109601200341f00d6a41186a220a200341d00d6a41186a2206290300370300200341f00d6a41106a2209200341d00d6a41106a2207290300370300200341f00d6a41086a221c200341d00d6a41086a2208290300370300200320032903d00d3703f00d024020032802b40d450d0020032802b00d10260b2016417f6a2116201b41016a211d200341f00c6a41086a201c290300221e370300200341f00c6a41106a2009290300221f370300200341f00c6a41186a200a2903002220370300200341106a201b4103704105746a220520032903f00d2221370000200541086a201e370000200541106a201f370000200541186a2020370000200320213703f00c410021220340201b4103704102470d03200341b00d6a41186a2223200341106a20226a220541186a2224290000370300200341b00d6a41106a2225200541106a2226290000370300200341b00d6a41086a2227200541086a222829000037030020032005290000221e3703b00d200a200541386a22292900003703002009200541306a222a290000370300201c200541286a222b2900003703002003200541206a222c290000221f3703f00d2003201e201f833c00b00d200320032d00b10d20032d00f10d713a00b10d200320032d00b20d20032d00f20d713a00b20d200320032d00b30d20032d00f30d713a00b30d200320032d00b40d20032d00f40d713a00b40d200320032d00b50d20032d00f50d713a00b50d200320032d00b60d20032d00f60d713a00b60d200320032d00b70d20032d00f70d713a00b70d202720272d0000201c2d0000713a0000200320032d00b90d20032d00f90d713a00b90d200320032d00ba0d20032d00fa0d713a00ba0d200320032d00bb0d20032d00fb0d713a00bb0d200320032d00bc0d20032d00fc0d713a00bc0d200320032d00bd0d20032d00fd0d713a00bd0d200320032d00be0d20032d00fe0d713a00be0d200320032d00bf0d20032d00ff0d713a00bf0d202520252d000020092d0000713a0000200320032d00c10d20032d00810e713a00c10d200320032d00c20d20032d00820e713a00c20d200320032d00c30d20032d00830e713a00c30d200320032d00c40d20032d00840e713a00c40d200320032d00c50d20032d00850e713a00c50d200320032d00c60d20032d00860e713a00c60d200320032d00c70d20032d00870e713a00c70d202320232d0000200a2d0000713a0000200320032d00c90d20032d00890e713a00c90d200320032d00ca0d20032d008a0e713a00ca0d200320032d00cb0d20032d008b0e713a00cb0d200320032d00cc0d20032d008c0e713a00cc0d200320032d00cd0d20032d008d0e713a00cd0d200320032d00ce0d20032d008e0e713a00ce0d200320032d00cf0d20032d008f0e713a00cf0d200620292900003703002007202a2900003703002008202b2900003703002003202c290000221e3703d00d200a200541d8006a222a2900003703002009200541d0006a222b290000370300201c200541c8006a222c2900003703002003200541c0006a222d290000221f3703f00d2003201e201f833c00d00d200320032d00d10d20032d00f10d713a00d10d200320032d00d20d20032d00f20d713a00d20d200320032d00d30d20032d00f30d713a00d30d200320032d00d40d20032d00f40d713a00d40d200320032d00d50d20032d00f50d713a00d50d200320032d00d60d20032d00f60d713a00d60d200320032d00d70d20032d00f70d713a00d70d200820082d0000201c2d0000713a0000200320032d00d90d20032d00f90d713a00d90d200320032d00da0d20032d00fa0d713a00da0d200320032d00db0d20032d00fb0d713a00db0d200320032d00dc0d20032d00fc0d713a00dc0d200320032d00dd0d20032d00fd0d713a00dd0d200320032d00de0d20032d00fe0d713a00de0d200320032d00df0d20032d00ff0d713a00df0d200720072d000020092d0000713a0000200320032d00e10d20032d00810e713a00e10d200320032d00e20d20032d00820e713a00e20d200320032d00e30d20032d00830e713a00e30d200320032d00e40d20032d00840e713a00e40d200320032d00e50d20032d00850e713a00e50d200320032d00e60d20032d00860e713a00e60d200320032d00e70d20032d00870e713a00e70d200620062d0000200a2d0000713a0000200320032d00e90d20032d00890e713a00e90d200320032d00ea0d20032d008a0e713a00ea0d200320032d00eb0d20032d008b0e713a00eb0d200320032d00ec0d20032d008c0e713a00ec0d200320032d00ed0d20032d008d0e713a00ed0d200320032d00ee0d20032d008e0e713a00ee0d200320032d00ef0d20032d008f0e713a00ef0d200341900d6a41186a22292023290300370300200341900d6a41106a22232025290300370300200341900d6a41086a22252027290300370300200320032903b00d3703900d200320032d00900d20032d00d00d723a00900d200320032d00910d20032d00d10d723a00910d200320032d00920d20032d00d20d723a00920d200320032d00930d20032d00d30d723a00930d200320032d00940d20032d00d40d723a00940d200320032d00950d20032d00d50d723a00950d200320032d00960d20032d00d60d723a00960d200320032d00970d20032d00d70d723a00970d202520252d000020082d0000723a0000200320032d00990d20032d00d90d723a00990d200320032d009a0d20032d00da0d723a009a0d200320032d009b0d20032d00db0d723a009b0d200320032d009c0d20032d00dc0d723a009c0d200320032d009d0d20032d00dd0d723a009d0d200320032d009e0d20032d00de0d723a009e0d200320032d009f0d20032d00df0d723a009f0d202320232d000020072d0000723a0000200320032d00a10d20032d00e10d723a00a10d200320032d00a20d20032d00e20d723a00a20d200320032d00a30d20032d00e30d723a00a30d200320032d00a40d20032d00e40d723a00a40d200320032d00a50d20032d00e50d723a00a50d200320032d00a60d20032d00e60d723a00a60d200320032d00a70d20032d00e70d723a00a70d202920292d000020062d0000723a0000200320032d00a90d20032d00e90d723a00a90d200320032d00aa0d20032d00ea0d723a00aa0d200320032d00ab0d20032d00eb0d723a00ab0d200320032d00ac0d20032d00ec0d723a00ac0d200320032d00ad0d20032d00ed0d723a00ad0d200320032d00ae0d20032d00ee0d723a00ae0d200320032d00af0d20032d00ef0d723a00af0d20062024290000370300200720262900003703002008202829000037030020032005290000221e3703d00d200a202a2900003703002009202b290000370300201c202c2900003703002003202d290000221f3703f00d2003201e201f833c00d00d200320032d00d10d20032d00f10d713a00d10d200320032d00d20d20032d00f20d713a00d20d200320032d00d30d20032d00f30d713a00d30d200320032d00d40d20032d00f40d713a00d40d200320032d00d50d20032d00f50d713a00d50d200320032d00d60d20032d00f60d713a00d60d200320032d00d70d20032d00f70d713a00d70d200820082d0000201c2d0000713a0000200320032d00d90d20032d00f90d713a00d90d200320032d00da0d20032d00fa0d713a00da0d200320032d00db0d20032d00fb0d713a00db0d200320032d00dc0d20032d00fc0d713a00dc0d200320032d00dd0d20032d00fd0d713a00dd0d200320032d00de0d20032d00fe0d713a00de0d200320032d00df0d20032d00ff0d713a00df0d200720072d000020092d0000713a0000200320032d00e10d20032d00810e713a00e10d200320032d00e20d20032d00820e713a00e20d200320032d00e30d20032d00830e713a00e30d200320032d00e40d20032d00840e713a00e40d200320032d00e50d20032d00850e713a00e50d200320032d00e60d20032d00860e713a00e60d200320032d00e70d20032d00870e713a00e70d200620062d0000200a2d0000713a0000200320032d00e90d20032d00890e713a00e90d200320032d00ea0d20032d008a0e713a00ea0d200320032d00eb0d20032d008b0e713a00eb0d200320032d00ec0d20032d008c0e713a00ec0d200320032d00ed0d20032d008d0e713a00ed0d200320032d00ee0d20032d008e0e713a00ee0d200320032d00ef0d20032d008f0e713a00ef0d200c2029290300370000200d2023290300370000200e2025290300370000200020032903900d221e3700002000201ea720032d00d00d723a0000200020002d000120032d00d10d723a0001200020002d000220032d00d20d723a0002200020002d000320032d00d30d723a0003200020002d000420032d00d40d723a0004200020002d000520032d00d50d723a0005200020002d000620032d00d60d723a0006200020002d000720032d00d70d723a0007200e200e2d000020082d0000723a0000200020002d000920032d00d90d723a0009200020002d000a20032d00da0d723a000a200020002d000b20032d00db0d723a000b200020002d000c20032d00dc0d723a000c200020002d000d20032d00dd0d723a000d200020002d000e20032d00de0d723a000e200020002d000f20032d00df0d723a000f200d200d2d000020072d0000723a0000200020002d001120032d00e10d723a0011200020002d001220032d00e20d723a0012200020002d001320032d00e30d723a0013200020002d001420032d00e40d723a0014200020002d001520032d00e50d723a0015200020002d001620032d00e60d723a0016200020002d001720032d00e70d723a0017200c200c2d000020062d0000723a0000200020002d001920032d00e90d723a0019200020002d001a20032d00ea0d723a001a200020002d001b20032d00eb0d723a001b200020002d001c20032d00ec0d723a001c200020002d001d20032d00ed0d723a001d200020002d001e20032d00ee0d723a001e200020002d001f20032d00ef0d723a001f201b41036e2123202241800c460d03200341106a20222023410574201b41096e41e0006c6b6a6a220541f8006a200c290000370000200541f0006a200d290000370000200541e8006a200e290000370000200541e0006a2000290000370000202241e0006a21222023211b0c000b0b1034000b1033000b41002105201d211b20160d000b0b0240200442ffffff3f83500d00200b10260b200341900e6a24000bb30201017f230041e0006b220324002003200236020c20032001360208200341106a2001200210820202400240200328021022010d00200041003602000c010b200328021421022003200341106a41086a28020036022420032001360220200341c8006a200341206a10e5010240024020032802480d0020034100360230200342013703282003410e36023c2003200341086a3602382003200341286a360244200341dc006a41013602002003420137024c2003418c8dc6003602482003200341386a360258200341c4006a41c4e1c000200341c8006a10351a200328022820032802301084020240200328022c450d00200328022810260b200041003602000c010b20002003290348370200200041086a200341c8006a41086a2802003602000b2002450d00200110260b200341e0006a24000bf60305017f027e027f017e017f230041106b220224000240024020002903004201520d00200041106a2903002103200029030821042001200141086a22052802004102106d2001280200200528020022066a20032004420c882207420120074201561b80a741047420047aa7417f6a22084101200841014b1b2208410f2008410f491b723b00002005200641026a22063602000c010b2001200141086a22052802004101106d2001280200200528020022066a41003a00002005200641016a22063602000b200041186a210802400240024002402000280228220541c000490d00200541808001490d012005418080808004490d02200120064101106d2001280200200141086a220528020022066a41033a00002005200641016a220636020020002802282100200120064104106d2001280200200528020022066a20003600002005200641046a3602000c030b200120064101106d2001280200200141086a220028020022066a20054102743a00002000200641016a3602000c020b200120064102106d2001280200200141086a220028020022066a20054102744101723b00002000200641026a3602000c010b200120064104106d2001280200200141086a220028020022066a20054102744102723600002000200641046a3602000b2002200836020c2002410c6a200110a702200241106a24000b9e0503017f027e047f230041e0006b220224000240024020002802002200290300220342c000544100200041086a29030022045022051b0d0002400240024020034280800154410020051b0d00200342808080800454410020051b0d01411020047920037942c0007c20044200521ba741037622066b4104490d022001200141086a22052802004101106d2001280200200528020022076a413320064102746b3a00002005200741016a2207360200200029030021032002200041086a290300220437030820022003370300200641706a21000340200120074101106d2001280200200528020022076a20033c00002005200741016a22073602002003420888200442388684210320044208882104200041016a22062000492108200621002008450d000b20022003370300200220043703082003200484500d04200241286a41146a4109360200200241346a410f360200200241106a41146a410336020020022002360240200241b887c600360244200241c8006a41146a410036020020024203370214200241d4c0c7003602102002410f36022c200241d4c0c7003602582002420137024c200241f086c6003602482002200241286a3602202002200241c8006a3602382002200241c4006a3602302002200241c0006a360228200241106a41ecc0c700103d000b2001200141086a22002802004102106d2001280200200028020022016a2003a74102744101723b00002000200141026a3602000c030b2001200141086a22002802004104106d2001280200200028020022016a2003a74102744102723600002000200141046a3602000c020b41ab86c600413641dcbcc700102f000b2001200141086a22002802004101106d2001280200200028020022016a2003a74102743a00002000200141016a3602000b200241e0006a24000bb51103077f017e0a7f230041f0006b2202240041042103024002400240024002400240024002400240024002402001280200410e460d00410021040c010b41002104200141046a22052d00004105470d00200241d0006a200141c8006a280200109502200228025022032002280258109c0241ff0171210402402002280254450d00200310260b0240024002400240024002400240024020044102460d002004410171450d00200241e8006a22044200370300200241e0006a22064200370300200241d0006a41086a2203420037030020024200370350200241c0006a41818dc700410910fb012003200241c0006a41086a220729000037030020022002290040370350200241c0006a41dcd5c000410f10fb012004200729000037030020062002290040370300200241206a200241d0006a10fe010240200228022022030d004100210820024100360218200242043703100c030b200220022902242209370214200220033602102009422088a72208450d012008417f6a210a0c040b200041800e3b0001200041013a0000200041036a41013a00000c100b2009a70d010b200241106a2008410110cb0120022802102103200228021821080b20032008410c6c6a22044100360208200442043702002002200841016a220436021820042008490d012008210a200421080b2003210b200241e8006a4200370300200241e0006a4200370300200241d0006a41086a2204420037030020024200370350200241c0006a41818dc700410910fb012004200241c0006a41086a220729000037030020022002290040370350200241c0006a41b8d5c000410b10fb01200641086a2007290000370000200620022900403700002002200241d0006a4120108902024002402003200a410c6c6a220c41086a220d28020022042002280204410020022802001b4f0d00200c280200210e0240200441014b0d00024020040e020300030b2001280248210f410021070c040b2001280248210f41002107034020072004410176221020076a2211200f200e201141246c6a280200491b2107200420106b220441014b0d000c040b0b200041800c3b0001200041013a0000200041036a41003a00000c0c0b2001280248210f410021040c020b2008200441c8b8c0001032000b200f200e200741246c6a2802002204460d032007200f20044b6a21040b200241d0006a200f10a9022002280250220e450d0320022802542112200241d0006a200e200241d0006a41086a2207280200109601200241206a41186a200241d0006a41186a2210290000370300200241206a41106a200241d0006a41106a2211290000370300200241206a41086a2007290000370300200220022900503703200240200241206a200541216a2213460d00200241206a2013412010d2060d020b2010200541196a2900003703002011200541116a2900003703002007200541096a29000037030020022005290001370350200d28020022072004490d0420012802482110024020072003200a410c6c6a41046a280200470d00200c2007410110d10120022802182108200228021021030b200c280200200441246c6a220141246a2001200720046b41246c10d0061a20012010360200200120022903503702042001410c6a200241d0006a41086a2204290300370200200141146a200241e0006a22112903003702002001411c6a200241e8006a220129030037020041012110200d200741016a3602002002280214210520014200370300201142003703002004420037030020024200370350200241c0006a41818dc700410910fb012004200241c0006a41086a220129000037030020022002290040370350200241c0006a41dcd5c000410f10fb01200641086a2001290000370000200620022900403700002008410c6c41046a2201417f4c0d054100210402402001450d00200110242210450d07200121040b200241003602482002201036024020022004360244200241c0006a200810a10102402008450d0020032008410c6c6a210f20032111034020112802002101200241c0006a2011280208220410a1012011410c6a211102402004450d002001200441246c6a211020022802482104034020012802002107200241c0006a20044104106d2002280240200228024822046a20073600002002200441046a2204360248200241c0006a20044120106d2002280240200228024822076a2204200141046a290000370000200441086a2001410c6a290000370000200441106a200141146a290000370000200441186a2001411c6a2900003700002002200741206a2204360248200141246a22012010470d000b0b2011200f470d000b0b200241d0006a412020022802402201200228024810b30102402002280244450d00200110260b02402008450d002008410c6c21042003210103400240200141046a2802002207450d00200741246c450d00200128020010260b2001410c6a2101200441746a22040d000b0b02402005450d002005410c6c450d00200310260b410c10242203450d0720024100360258200242013703502002200241d0006a3602402013200241c0006a109c01200341086a20022802583602002003200229035037020002402012450d00200e10260b410121040b200041003a0000200041306a41013a00002000412c6a2004360200200041286a2004360200200041246a2003360200200041206a4100360200200041186a4204370300200041106a427f370300200041086a4200370300200041316a2002280009360000200041346a2002410c6a2800003600000c080b20004180063b0001200041013a0000200041036a41003a00002012450d06200e10260c060b200041800e3b0001200041013a0000200041036a41003a00000c050b200041800e3b0001200041013a0000200041036a41013a00000c040b20042007103b000b1034000b1033000b102c000b2008410c6c210103400240200341046a2802002204450d00200441246c450d00200328020010260b2003410c6a2103200141746a22010d000b20022802142201450d002001410c6c450d00200b10260b200241f0006a24000bf00602077f017e23004180016b22022400200241206a41eb8cc700410a10fb01200241306a41eca4c500410510fb0120022001360258200241106a200241d8006a410410a202200241f4006a200241d8006a41046a3602002002200241186a36026c2002200241d8006a3602702002200241106a360268200241c0006a200241e8006a107302400240024002400240024002402002280248220141206a2203417f4c0d000240024020030d0041012104410021030c010b200310242204450d020b200241003602182002200436021020022003360214200241106a4100411010c9012002280210200228021822036a22042002290020370000200441086a200241206a41086a2900003700002002200341106a2203360218200241106a2003411010c9012002280210200228021822036a22042002290030370000200441086a200241306a41086a2900003700002002200341106a220336021820022802402104200241106a2003200110c90120022802102203200228021822056a2004200110cf061a2002200520016a220136021802402002280244450d00200410260b2002200136025420022003360250200241206a2003200110820220022802202201450d04200228022421042002200241286a28020036025c20022001360258200241086a200241d8006a108f0120022802080d02200228025c2206200228020c2205490d022005417f4c0d000240024020050d0041002107410121030c010b2005102a2203450d02200228025c2106200521070b0240024020062005490d0020032002280258200510cf062106200228025c220820054f0d012005200841b8afc0001048000b2007450d03200310260c030b2002200820056b36025c2002200228025820056a3602582006450d022005ad4220862007ad8421090c030b1034000b1033000b4100210320024100360238200242013703302002410e3602442002200241d0006a3602402002200241306a360264200241fc006a41013602002002420137026c2002418c8dc6003602682002200241c0006a360278200241e4006a41c4e1c000200241e8006a10351a2002280230200228023810840202402002280234450d00200228023010260b0b02402004450d00200110260b20030d010b200041003602000c010b20002009370204200020033602000b02402002280214450d00200228021010260b20024180016a24000b130020004107360204200041d8b8c0003602000b3400200041818dc70036020420004100360200200041146a4109360200200041106a4190cfc000360200200041086a42093702000bb00101067f230041206b22022400200241186a22034200370300200241106a22044200370300200241086a220542003703002002420037030002404120102422060d001033000b2000422037020420002006360200200041004120106d2000280200200041086a220628020022076a220020022903003700002006200741206a360200200041086a2005290300370000200041106a2004290300370000200041186a2003290300370000200241206a24000b4a01017f02404104102422020d001033000b2000420437020420002002360200200041004104106d2000280200200041086a220028020022026a41e8073600002000200241046a3602000b2901017f230041106b2202240020024100360208200242043703002000200210b901200241106a24000b2901017f230041106b2202240020024100360208200242043703002000200210b801200241106a24000b3400200041b4a3c70036020420004100360200200041146a4101360200200041106a41f4dec000360200200041086a42183702000b9f0201027f230041106b22022400200028020021002002410036020c02400240024002402001418001490d002001418010490d012001418080044f0d0220022001413f71418001723a000e20022001410c7641e001723a000c20022001410676413f71418001723a000d410321010c030b200220013a000c410121010c020b20022001413f71418001723a000d2002200141067641c001723a000c410221010c010b20022001413f71418001723a000f2002200141127641f001723a000c20022001410676413f71418001723a000e20022001410c76413f71418001723a000d410421010b2000200041086a22032802002001106d2000280200200328020022006a2002410c6a200110cf061a2003200020016a360200200241106a240041000b6301017f230041206b2202240020022000280200360204200241086a41106a200141106a290200370300200241086a41086a200141086a29020037030020022001290200370308200241046a41c4e1c000200241086a10352101200241206a240020010bb00101037f230041e0046b220124002000200028020441016a22023602044100210302400240200220002802084b0d00200141b0026a200010b40220012802b0022102200141046a200141b0026a41047241ac0210cf061a20024117460d00200141b0026a200141046a41ac0210cf061a41b00210242203450d0120032002360200200341046a200141b0026a41ac0210cf061a20002000280204417f6a3602040b200141e0046a240020030f0b102c000bfa9e0311067f027e057f097e047f047e057f017e0b7f077e0e7f027e017f0c7e087f037e1b7f23004180186b2202240002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200128020022032802042204450d00200328020022052d0000210620032004417f6a3602042003200541016a360200200641164b0d1020060e170102030405060708090a0b0c0d1a191817161514131211010b200041173602000c330b200128020022032802042204450d31200328020022052d0000210620032004417f6a3602042003200541016a360200200641094b0d31410a210502400240024002400240024002400240024002400240024020060e0a00010203040506070809000b2001280200220128020422064104490d3c20012802002204280000210320012006417c6a3602042001200441046a3602002003418194ebdc034f0d3c410121050c080b200241086a2001108d0120022802080d3b200128020022042802042205200228020c2206490d3b2006417f4c0d240240024020060d0041002101410121030c010b2006102a2203450d26200128020022042802042105200621010b0240024020052006490d0020032004280200200610cf0621052004280204220720064f0d012006200741b8afc0001048000b20010d0a0c3c0b2004200720066b3602042004200428020020066a3602002005450d3b2006ad4220862001ad842108410221050c070b2001280200220128020422034108490d3a2001280200220629000021082001200341786a3602042001200641086a360200410321050c060b200241106a2001108d0120022802100d3920012802002204280204220520022802142206490d392006417f4c0d220240024020060d0041002101410121030c010b2006102a2203450d24200128020022042802042105200621010b0240024020052006490d0020032004280200200610cf0621052004280204220720064f0d012006200741b8afc0001048000b20010d080c3a0b2004200720066b3602042004200428020020066a3602002005450d392006ad4220862001ad842108410421050c050b200241186a2001108d0120022802180d38200128020022042802042205200228021c2206490d382006417f4c0d210240024020060d0041002101410121030c010b2006102a2203450d23200128020022042802042105200621010b0240024020052006490d0020032004280200200610cf0621052004280204220720064f0d012006200741b8afc0001048000b20010d070c390b2004200720066b3602042004200428020020066a3602002005450d382006ad4220862001ad842108410521050c040b200128020022032802042204450d37200328020022052d0000210620032004417f6a3602042003200541016a360200200641014b0d374106210541002103024020060e020400040b2001280200220328020422064104490d3720032802002204350000210820032006417c6a3602042003200441046a3602002001280200220128020422034104490d3720012802002206350000210920012003417c6a3602042001200641046a36020020082009422086842108410121030c030b200241306a2001108d0120022802300d3620022802342207200128020028020441186e2203200320074b1bad42187e2208422088a70d1f2008a72206417f4c0d1f0240024020060d00410421030c010b200610242203450d210b2001200128020441016a2204360204200241003602a813200220033602a0132002200641186e3602a413200420012802084b0d1202402007450d00410021050340200241286a2001108d01200241a0136a210a20022802280d3620012802002204280204220b200228022c2206490d362006417f4c0d210240024020060d004100210c4101210d0c010b2006102a220d450d2320012802002204280204210b2006210c0b02400240200b2006490d00200d2004280200200610cf06210b2004280204220d20064f0d012006200d41b8afc0001048000b200c450d37200d10260c370b2004200d20066b3602042004200428020020066a360200200b450d362006ad422086200cad842108200241206a2001108d010240024020022802200d0020012802002204280204220d20022802242206490d002006417f4c0d230240024020060d004100210e4101210c0c010b2006102a220c450d2520012802002204280204210d2006210e0b02400240200d2006490d00200c2004280200200610cf06210d2004280204220c20064f0d012006200c41b8afc0001048000b200e450d01200c10260c010b2004200c20066b3602042004200428020020066a360200200d0d010b2008a7450d37200b10260c370b2006ad422086200ead8421090240200520022802a413470d00200241a0136a2005410110f00120022802a013210320022802a81321050b2003200541186c6a2206200d36020c200620083702042006200b360200200641106a20093702002002200541016a22053602a8132007417f6a22070d000b200128020421040b20012004417f6a3602042003450d3620022902a4132108410721050c020b200241a0136a200110d90120022802a0132203450d3520022902a4132108410821050c010b200241386a2001108d0120022802380d34200128020022042802042205200228023c2206490d342006417f4c0d1d0240024020060d0041002107410121030c010b2006102a2203450d1f200128020022042802042105200621070b0240024020052006490d0020032004280200200610cf0621052004280204220b20064f0d012006200b41b8afc0001048000b20070d030c350b2004200b20066b3602042004200428020020066a3602002005450d342006ad4220862007ad8421082001280200220128020422064104490d0120012802002205280000210420012006417c6a3602042001200541046a360200410921050b20004100360200200041186a2004360200200041106a20083702002000410c6a2003360200200041086a2005360200200041206a200241d0156a41900210cf061a0c340b2008a7450d320b200310260c310b0240200128020022032802042204450d00200328020022052d0000210620032004417f6a3602042003200541016a360200200641014b0d000240024002400240024020060e020001000b200241d0156a200110e305200241dc156a2802002204450d04200241a80d6a41086a2206200241d0156a41086a280200360200200220022903d0153703a80d200241e0156a220d2802002105200241e4156a280200210320024188106a200241e8156a41e40010cf061a200241d4166a280200210b200241d0156a4180016a2802002107200241cc166a280200210a200241a0136a200241d8166a41800110cf061a200241d0156a200110df05024020022802d415450d00200241a00b6a41086a2006280200360200200220022903a80d3703a00b200d2802002101200241dc156a280200210620022802d815210d20022903d0152108200241d8046a20024188106a41e40010cf061a200241f0106a200241a0136a41800110cf061a4101210c0c020b02402003450d00200341246c21032004210103400240024020012d0000220641044b0d0002400240024020060e050400010204040b2001410c6a280200450d03200141086a28020010260c030b2001410c6a280200450d02200141086a28020010260c020b2001410c6a280200450d01200141086a28020010260c010b200141086a280200450d00200141046a28020010260b200141246a21012003415c6a22030d000b0b02402005450d00200541246c450d00200410260b0240200b450d00200b41246c2103200a210103400240024020012d0000220641044b0d0002400240024020060e050400010204040b2001410c6a280200450d03200141086a28020010260c030b2001410c6a280200450d02200141086a28020010260c020b2001410c6a280200450d01200141086a28020010260c010b200141086a280200450d00200141046a28020010260b200141246a21012003415c6a22030d000b0b2007450d04200741246c0d030c040b200241d0156a200110e305200241dc156a2802002204450d03200241a80d6a41086a2206200241d0156a41086a280200360200200220022903d0153703a80d200241e0156a220d2802002105200241e4156a280200210320024188106a200241e8156a41e40010cf061a200241d4166a280200210b200241d0156a4180016a2802002107200241cc166a280200210a200241a0136a200241d8166a41800110cf061a200241d0156a200110df0520022802d415450d01200241a00b6a41086a2006280200360200200220022903a80d3703a00b200d2802002101200241dc156a280200210620022802d815210d20022903d0152108200241d8046a20024188106a41e40010cf061a200241f0106a200241a0136a41800110cf061a4102210c0b20024180066a41086a220e200241a00b6a41086a280200360200200220022903a00b37038006200241f0036a200241d8046a41e40010cf061a200241c0066a200241f0106a41800110cf061a2000411c6a2001360200200041186a2006360200200041146a200d3602002000410c6a2008370200200041086a200c36020020004101360200200041206a200229038006370200200041286a200e280200360200200041346a2003360200200041306a20053602002000412c6a2004360200200041386a200241f0036a41e40010cf061a200041a4016a200b360200200041a0016a20073602002000419c016a200a360200200041a8016a200241c0066a41800110cf061a0c340b02402003450d00200341246c21032004210103400240024020012d0000220641044b0d0002400240024020060e050400010204040b2001410c6a280200450d03200141086a28020010260c030b2001410c6a280200450d02200141086a28020010260c020b2001410c6a280200450d01200141086a28020010260c010b200141086a280200450d00200141046a28020010260b200141246a21012003415c6a22030d000b0b02402005450d00200541246c450d00200410260b0240200b450d00200b41246c2103200a210103400240024020012d0000220641044b0d0002400240024020060e050400010204040b2001410c6a280200450d03200141086a28020010260c030b2001410c6a280200450d02200141086a28020010260c020b2001410c6a280200450d01200141086a28020010260c010b200141086a280200450d00200141046a28020010260b200141246a21012003415c6a22030d000b0b2007450d01200741246c450d010b200a10260b200041173602000c310b200128020022032802042206450d2c200328020022042d0000210520032006417f6a3602042003200441016a36020020050d2c200128020022032802042204450d2c200328020022052d0000210620032004417f6a3602042003200541016a360200024002400240200641037122034103460d000240024020030e03030001030b200128020022012802042203450d30200128020022042d0000210520012003417f6a3602042001200441016a3602002005410874200672220141ffff0371418002490d30200141fcff0371410276ad21080c030b2001280200220128020422034103490d2f2001280200220441026a2d0000210520042f000021072001200441036a36020020012003417d6a3602042007200541107472410874200672220141808004490d2f2001410276ad21080c020b02402006410276220b41044b0d0002400240200b0e050002020201000b2001280200220128020422034104490d3020012802002204280000210620012003417c6a3602042001200441046a3602002006418080808004490d302006ad21080c030b2001280200220128020422034108490d2f2001280200220629000021082001200341786a3602042001200641086a360200200842ffffffffffffffff00560d020c2f0b200641134b0d2e200b41046a210741002106420021080340200128020022032802042204450d2f20032802002205310000210920032004417f6a3602042003200541016a36020020092006410374413871ad862008842108200641016a220641ff01712007490d000b2008427f4128200b4103746b413871ad88580d2e0c010b2006410276ad21080b20004102360200200041086a2008370300200041106a200241d0156a41a00210cf061a0c300b200128020022032802042204450d2a200328020022052d0000210620032004417f6a3602042003200541016a360200200641044b0d2a0240024002400240024020060e050001020304000b2001280200220128020422064104490d2e20012802002204280000210320012006417c6a3602042001200441046a36020020023502b80a200241bc0a6a330100200241be0a6a31000042108684422086842108200241b00a6a290300210920022903a80a210f20022802c40a210620022f01c20a210720022d00c10a210120022f00bf0a210b4101210a0c2d0b41002103200241003a00c01302400340200128020022062802042204450d01200241a0136a20036a200628020022052d00003a000020062004417f6a3602042006200541016a3602002002200341016a22033a00c01320034120470d000b2001280200220128020422074104490d2e20022900b7132208423888200241bf136a31000042088684a7210b200241af136a290000210920022900a713210f20022800a313210320022f00a113210420022d00a01321052001280200220a280000210620012007417c6a3602042001200a41046a3602004102210a0c2d0b200341ff0171450d2d200241003a00c0130c2d0b2001280200220128020422064104490d2c20012802002204280000210320012006417c6a3602042001200441046a36020020023502d80a200241dc0a6a330100200241de0a6a31000042108684422086842108200241d00a6a290300210920022903c80a210f4103210a0c2a0b41002103200241003a00c0130240024002400340200128020022062802042204450d01200241a0136a20036a200628020022052d00003a000020062004417f6a3602042006200541016a3602002002200341016a22033a00c01320034120470d000b20012802002207280204220b4104490d2e20022900b7132108200241bf136a3100002110200241af136a290000210920022900a713210f20022800a313210320022f00a113210420022d00a01321052007280200220a28000021062007200b417c6a3602042007200a41046a36020020012802002201280204220b450d2e2001280200220a2d000021072001200b417f6a3602042001200a41016a360200200741014b0d2e200842388820104208868421104100210120070e020201020b200341ff0171450d2d200241003a00c0130c2d0b410121010b2010a7210b4104210a0c2a0b2001280200220128020422064104490d2a20012802002204280000210320012006417c6a3602042001200441046a36020020023502900b200241940b6a330100200241960b6a31000042108684422086842108200241880b6a290300210920022903800b210f4105210a0c280b0240200128020022032802042204450d00200328020022052d0000210620032004417f6a3602042003200541016a360200200641034b0d0002400240024002400240024020060e0400010203000b41002103200241003a00c01302400340200128020022062802042204450d01200241a0136a20036a200628020022052d00003a000020062004417f6a3602042006200541016a3602002002200341016a22033a00c01320034120470d000b200241bf136a3100002108200241af136a290000210920022900b713211120022900a713210f20022800a313210720022f00a113210b20022d00a013210a200241c0006a200110ec042002290340a70d06200241d0006a29030021122002290348211320024188116a29030021142002290380112115410121010c040b200341ff0171450d05200241003a00c0130c050b41002103200241003a00c01302400340200128020022062802042204450d01200241a0136a20036a200628020022052d00003a000020062004417f6a3602042006200541016a3602002002200341016a22033a00c01320034120470d000b200241bf136a3100002108200241af136a290000210920022900a713210f20022800a313210720022f00a113210b20022d00a013210a20022900b7132110200241f0006a200110ec042002290370a70d05200241f0006a41106a290300211220022903782113200241d8006a200110ec042002290358a70d05200241d8006a41106a2903002116200229036021172010428080808080608320104280feffffff1f8384201042ff0183842111410221010c030b200341ff0171450d04200241003a00c0130c040b41002103200241003a00c013024002400340200128020022062802042204450d01200241a0136a20036a200628020022052d00003a000020062004417f6a3602042006200541016a3602002002200341016a22033a00c01320034120470d000b200241bf136a3100002108200241af136a290000210920022900b713211120022900a713210f20022800a313210720022f00a113210b20022d00a013210a41002103200241003a00c0130340200128020022062802042204450d02200241a0136a20036a200628020022052d00003a000020062004417f6a3602042006200541016a3602002002200341016a22033a00c01320034120470d000b200241c80a6a410f6a2203200241a0136a410f6a290000370000200220022900a7133700cf0a200220022800a3133600cb0a200220022f00a1133b00c90a200220022d00a0133a00c80a200241bf136a310000211220022900b713211720024188016a200110ec04200229038801a70d0520024198016a29030021142002290390012115200241a80a6a410f6a22012003290000370000200241a80a6a41086a200241c80a6a41086a290300370300200220022903c80a22103703a80a201242ff018321162001290000211220022900af0a2113410321010c030b200341ff0171450d04200241003a00c0130c040b200341ff0171450d03200241003a00c0130c030b41002103200241003a00c0130340200128020022062802042204450d02200241a0136a20036a200628020022052d00003a000020062004417f6a3602042006200541016a3602002002200341016a22033a00c01320034120470d000b200241800b6a410f6a200241a0136a410f6a2900002209370000200220022900a713220f3700870b200220022800a31322073600830b200220022f00a113220b3b00810b200220022d00a013220a3a00800b200241bf136a310000210820022900b7132111200241a0016a200110ec0420022903a001a70d02200241b0016a290300211220022903a8012113200241e80a6a2903002116200241f80a6a290300211420022903e00a211720022903f00a2115410421010b200020103e00292000200b3b000a2000200a3a0009200041043602002000412f6a20104230883c00002000412d6a20104220883d0000200041d8006a2014370200200041d0006a2015370200200041c8006a2016370200200041c0006a2017370200200041386a2012370200200041306a2013370200200041286a20083c0000200041206a2011370000200041186a2009370000200041106a200f3700002000410c6a2007360000200041086a20013a0000200041e0006a200241d0156a41d00110cf061a0c300b200341ff0171450d00200241003a00c0130b200041173602000c2e0b0240200128020022032802042206450d00200328020022042d0000210520032006417f6a3602042003200441016a36020020050d00200241b8016a2001108d0120022802b8010d0020022802bc012205200128020028020441f0006e2203200320054b1bad42f0007e2208422088a70d162008a72203417f4c0d160240024020030d004104210b0c010b20031024220b450d180b2001200128020441016a220636020420024100360290102002200b360288102002200341f0006e36028c10024002400240200620012802084b0d0002402005450d00200241a0136a41086a210a410021030340200241a0136a200110e50220022802a413210620022802a0132107200241f0106a200a41e80010cf061a2006450d03200241c0066a200241f0106a41e80010cf061a02402003200228028c10470d0020024188106a2003410110c101200228028810210b20022802901021030b200b200341f0006c6a2204200636020420042007360200200441086a200241c0066a41e80010cf061a2002200341016a2203360290102005417f6a22050d000b200128020421060b20012006417f6a360204200b450d03200229028c1021082000200b36020420004105360200200041086a2008370200200041106a200241d0156a41a00210cf061a0c310b20024188106a21040c010b20024188106a21042003450d00200341f0006c210320022802881041046a21010340200110d6010240200141046a2802002206450d00200641246c450d00200128020010260b200141f0006a2101200341907f6a22030d000b0b200441046a2802002201450d00200141f0006c450d00200428020010260b200041173602000c2d0b0240200128020022012802042203450d0020012003417f6a3602042001200128020041016a3602000b200041173602000c2c0b200128020022032802042204450d23200328020022052d0000210620032004417f6a3602042003200541016a360200200641014b0d23410021180240024020060e020001000b41002103200241003a00c01302400240024002400240024002400340200128020022062802042204450d01200241a0136a20036a200628020022052d00003a000020062004417f6a3602042006200541016a3602002002200341016a22033a00c01320034120470d000b200241bf136a3100002110200241af136a290000210920022900b713210f20022900a713210820022800a313210a20022f00a113210b20022d00a013210741002103200241003a00c0130340200128020022062802042204450d02200241a0136a20036a200628020022052d00003a000020062004417f6a3602042006200541016a3602002002200341016a22033a00c01320034120470d000b200241bf136a3100002113200241af136a290000211720022900b713211220022900a713211120022800a313210e20022f00a113210c20022d00a013210d41002103200241003a00c0130340200128020022062802042204450d03200241a0136a20036a200628020022052d00003a000020062004417f6a3602042006200541016a3602002002200341016a22033a00c01320034120470d000b200241800b6a410f6a200241a0136a410f6a2900002214370000200241c80a6a410f6a2014370000200220022900a7133700870b200241c80a6a41086a200241800b6a41086a290300370300200220022800a3133600830b200220022f00a1133b00810b200220022d00a0133a00800b200220022903800b3703c80a200241bf136a310000211520022900b713211441002103200241003a00c0130340200128020022062802042204450d04200241a0136a20036a200628020022052d00003a000020062004417f6a3602042006200541016a3602002002200341016a22033a00c01320034120470d000b200241e00a6a411f6a200241a0136a411f6a3100003c0000200241e00a6a410f6a200241a0136a410f6a290000370000200220022900b7133700f70a200220022900a7133700e70a200220022800a3133600e30a200220022f00a1133b00e10a200220022d00a0133a00e00a41002103200241003a00c0130340200128020022062802042204450d05200241a0136a20036a200628020022052d00003a000020062004417f6a3602042006200541016a3602002002200341016a22033a00c01320034120470d000b200241f0036a41086a2206200241c80a6a41086a290300370300200241f0036a410f6a2218200241c80a6a410f6a290000370000200241f0106a41086a2219200241e00a6a41086a290300370300200241f0106a41106a221a200241e00a6a41106a290300370300200241f0106a41186a221b200241e00a6a41186a290300370300200220022903c80a3703f003200220022903e00a3703f010200241bf136a310000211c200241a0136a410f6a290000211d20022900b713211e20022900a713211620022800a313210520022f00a113210420022d00a0132103200241a80d6a410f6a2018290000370000200241a80d6a41086a2006290300370300200220022903f0033703a80d200241c0066a41186a201b290300370300200241c0066a41106a201a290300370300200241c0066a41086a2019290300370300200220022903f0103703c006200241c0016a2001108d0120022802c0010d2b20012802002219280204221a20022802c4012206490d2b2006417f4c0d1b20060d0541002101410121180c060b200341ff0171450d2a200241003a00c0130c2a0b200341ff0171450d29200241003a00c0130c290b200341ff0171450d28200241003a00c0130c280b200341ff0171450d27200241003a00c0130c270b200341ff0171450d26200241003a00c0130c260b2006102a2218450d1620012802002219280204211a200621010b02400240201a2006490d0020182019280200200610cf06211a2019280204221b20064f0d012006201b41b8afc0001048000b2001450d25201810260c250b2019201b20066b3602042019201928020020066a360200201a450d242006ad4220862001ad84211f200241a00b6a410f6a200241a80d6a410f6a290000370000200241a00b6a41086a200241a80d6a41086a29030037030020024188106a41086a200241c0066a41086a29030037030020024188106a41106a200241c0066a41106a29030037030020024188106a41186a200241c0066a41186a290300370300200220022903a80d3703a00b200220022903c006370388100b20024180066a410f6a2201200241a00b6a410f6a29000037000020024180066a41086a2206200241a00b6a41086a290300370300200241d8046a41086a221920024188106a41086a290300370300200241d8046a41106a221a20024188106a41106a290300370300200241d8046a41186a221b20024188106a41186a290300370300200220022903a00b3703800620022002290388103703d804200041cf006a20133c0000200041c7006a20123700002000413f6a2017370000200041376a20113700002000412f6a20103c0000200041276a200f3700002000411f6a2009370000200041176a2008370000200041336a200e360000200041316a200c3b0000200041306a200d3a0000200041136a200a360000200041116a200b3b0000200041106a20073a0000200041086a201f3702002000201836020420004107360200200041ef006a20153c0000200041e7006a2014370000200041d0006a200229038006370200200041d8006a2006290300370200200041df006a200129000037000020004193016a2005360000200041af016a201c3c0000200041a7016a201e3700002000419f016a201d37000020004197016a201637000020004191016a20043b000020004190016a20033a0000200041f0006a20022903d804370200200041f8006a201929030037020020004180016a201a29030037020020004188016a201b290300370200200041b0016a200241d0156a41800110cf061a0c2b0b0240200128020022032802042206450d00200328020022042d0000210520032006417f6a3602042003200441016a36020020050d00200241c8016a2001108d0120022802c8010d0020022802cc0121012000410836020020002001360204200041086a200241d0156a41a80210cf061a0c2b0b200041173602000c2a0b0240200128020022032802042204450d00200328020022052d0000210620032004417f6a3602042003200541016a360200200641024b0d00024002400240024020060e03000102000b200241d0156a200110cf0420022903d8154202510d03200241a0136a200241d0156a41800210cf061a200241d0156a200110df0520022802d415450d03200241e0156a2802002101200241dc156a280200210320022802d815210420022903d0152108200241f0106a200241a0136a41800210cf061a2008422088a721052008a72106410121070c020b200241d0156a200110cf0420022903d8154202510d02200241a0136a200241d0156a41800210cf061a200241d0156a200110df0520022802d415450d02200241e0156a2802002101200241dc156a280200210320022802d815210420022903d0152108200241f0106a200241a0136a41800210cf061a2008422088a721052008a72106410221070c010b2001280200220328020422044104490d0120032802002205280000210620032004417c6a3602042003200541046a3602002001280200220128020422034104490d0120012802002204280000210520012003417c6a3602042001200441046a360200200241f0106a200241d0156a41800210cf061a410321070b200241c0066a200241f0106a41800210cf061a2000411c6a2001360200200041186a2003360200200041146a2004360200200041106a20053602002000410c6a2006360200200041086a200736020020004109360200200041206a200241c0066a41800210cf061a200041a8026a20024188106a41086a290300370300200041a0026a2002290388103703000c2a0b200041173602000c290b200128020022032802042206450d1f200328020022042d0000210520032006417f6a3602042003200441016a36020020050d1f2001280200220328020422064104490d1f20032802002204280000210520032006417c6a3602042003200441046a360200200241e0016a2001108d0120022802e0010d1f20012802002206280204220420022802e4012203490d1f2003417f4c0d100240024020030d00410021074101210b0c010b2003102a220b450d12200128020022062802042104200321070b0240024020042003490d00200b2006280200200310cf06210b2006280204220420034f0d012003200441b8afc0001048000b2007450d20200b10260c200b2006200420036b3602042006200628020020036a360200200b450d1f2003ad4220862007ad842109200241d8016a2001108d0120022802d8010d1e20022802dc01220a2001280200280204410c6e22032003200a4b1bad420c7e2208422088a70d102008a72203417f4c0d100240024020030d004104210d0c010b20031024220d450d120b2001200128020441016a220636020441002104200241003602a8132002200d3602a01320022003410c6e22073602a413200620012802084b0d020240200a450d00410021040340200241d0016a2001108d01200241a0136a211820022802d0010d1e20012802002206280204220720022802d4012203490d1e2003417f4c0d120240024020030d004100210e4101210c0c010b2003102a220c450d142001280200220628020421072003210e0b0240024020072003490d00200c2006280200200310cf0621072006280204220c20034f0d012003200c41b8afc0001048000b200e450d1f200c10260c1f0b2006200c20036b3602042006200628020020036a3602002007450d1e2003ad422086200ead84200820071b21080240200420022802a413470d00200241a0136a2004410110cb0120022802a013210d20022802a81321040b200d2004410c6c6a22032008370204200320073602002002200441016a22043602a813200a417f6a220a0d000b2001280204210620022802a41321070b20012006417f6a360204200d450d1e2009a7210e02400240024002402001280200220328020422064104490d002003280200220a280000211820032006417c6a3602042003200a41046a3602002001280200220328020422064104490d012003280200220a280000211920032006417c6a3602042003200a41046a36020020012802002203280204220641044f0d020240200e450d00200b10260b02402004450d002004410c6c2103200d210103400240200141046a280200450d00200128020010260b2001410c6a2101200341746a22030d000b0b2007450d232007410c6c0d030c230b0240200e450d00200b10260b02402004450d002004410c6c2103200d210103400240200141046a280200450d00200128020010260b2001410c6a2101200341746a22030d000b0b2007450d222007410c6c0d020c220b0240200e450d00200b10260b02402004450d002004410c6c2103200d210103400240200141046a280200450d00200128020010260b2001410c6a2101200341746a22030d000b0b2007450d212007410c6c0d010c210b2003280200220a280000211a20032006417c6a3602042003200a41046a360200200b450d202009422088a7211b41002103200241003a00e0130240034020012802002206280204220a450d01200241a0136a20036a2006280200220c2d00003a00002006200a417f6a3602042006200c41016a3602002002200341016a22033a00e013200341c000470d000b200b450d21200241bb136a2d0000210120022f00b9132103200241a0136a41346a3100002108200241a0136a41246a2902002109200241a0136a41186a310000210f200241a0136a41086a290300211020022902cc13211120022902bc13211720022903b013211220022903a013211320022802dc13210620022f01da13210a20022d00d813210c20022f01d613212020022d00d5132121200020022d00d9133a0065200020213a0061200020053602042000410a360200200041c7006a200320014110747222014110763a0000200041c5006a20013b0000200041e0006a20083c0000200041d8006a2011370200200041d0006a2009370200200041c8006a2017370200200041c4006a200f3c00002000413c6a2012370200200041346a20103702002000412c6a2013370200200041e8006a2006360200200041e6006a200a3b0100200041e4006a200c3a0000200041e2006a20203b0100200041286a201a360200200041246a2019360200200041206a20183602002000411c6a2004360200200041186a2007360200200041146a200d360200200041106a201b3602002000410c6a200e360200200041086a200b360200200041ec006a200241d0156a41c40110cf061a0c2a0b0240200341ff0171450d00200241003a00e0130b0240200e450d00200b10260b02402004450d002004410c6c2103200d210103400240200141046a280200450d00200128020010260b2001410c6a2101200341746a22030d000b0b2007450d202007410c6c450d200b200d10260c1f0b0240200128020022012802042203450d0020012003417f6a3602042001200128020041016a3602000b200041173602000c270b200128020022032802042204450d19200328020022052d0000210620032004417f6a3602042003200541016a360200200641034b0d19024020060e040012110e000b20024198026a2001108d012002280298020d19200228029c02222220012802002802044198026e2203200320224b1bad4298027e2208422088a70d0e2008a72203417f4c0d0e0240024020030d00410821200c010b200310242220450d100b2001200128020441016a2206360204200241003602800d200220203602f80c200220034198026e3602fc0c200620012802084b0d172022450d12200241d0156a411f6a2123200241eb156a2124410021070340024002402001280200220328020422064104490d0020032802002204280000211820032006417c6a3602042003200441046a36020041002103200241003a00f0150240024002400240024002400240024002400240024002400240024002400240024002400240024002400340200128020022062802042204450d01200241d0156a20036a200628020022052d00003a000020062004417f6a3602042006200541016a3602002002200341016a22033a00f01520034120470d000b200241a0136a410f6a2203200241d0156a410f6a221a290000370000200241a0136a41086a220d200241d0156a41086a221b290300370300200241f0106a410f6a22192003290000370000200241f0106a41086a220e200d290300370300200241c0066a41086a220c200e290300370300200241c0066a410f6a22032019290000370000200220022903d0153703c0062023310000211c20022900e715211f200241c80a6a410f6a22202003290000370000200241c80a6a41086a200c290300370300200220022903c0063703c80a20024190026a2001108d014100210a2002280290020d044100210a2001280200220628020422042002280294022203490d032003417f4c0d2620030d01410021054101210a0c020b200341ff0171450d14200241003a00f015200b2105410021040c150b2003102a220a450d25200128020022062802042104200321050b024020042003490d00200a2006280200200310cf061a200628020422042003490d032003ad4220862005ad8421252006200420036b3602042006200628020020036a3602000c010b02402005450d00200a10260b4100210a0b2025201e200a1b211e0b201ea72026200a1b2126201e422088a72027200a1b2127200a450d1041002103200241003a00f015024002400240024002400340200128020022062802042204450d01200241d0156a20036a200628020022052d00003a000020062004417f6a3602042006200541016a3602002002200341016a22033a00f01520034120470d000b200241e00a6a411f6a222120233100003c0000200241e00a6a410f6a2228201a290000370000200220022900e7153700f70a200220022900d7153700e70a200220022800d3153600e30a200220022f00d1153b00e10a200220022d00d0153a00e00a41002103200241003a0090160340200128020022062802042204450d02200241d0156a20036a200628020022052d00003a000020062004417f6a3602042006200541016a3602002002200341016a22033a009016200341c000470d000b200d201b290300370300200241a0136a41106a2229200241d0156a41106a222a290300370300200241a0136a41186a222b200241d0156a41186a222c290300370300200241a0136a41206a2203200241d0156a41206a222d290300370300200241a0136a41286a2206200241d0156a41286a222e290300370300200241a0136a41306a2204200241d0156a41306a222f290300370300200241a0136a41386a2205200241d0156a41386a2230290300370300200220022903d0153703a013200e200d2903002231370300200241f0106a41106a20292903002232370300200241f0106a41186a202b2903002233370300200241f0106a41206a20032903002234370300200241f0106a41286a20062903002235370300200241f0106a41306a20042903002236370300200241f0106a41386a22032005290300370300200220022903a01322373703f010200241c0066a41306a22382036370300200241c0066a41286a22392035370300200241c0066a41206a223a2034370300200241c0066a41186a223b2033370300200241c0066a41106a223c2032370300200c2031370300200241c0066a41386a223d2003290300370300200220373703c00641002103200241003a00f0150340200128020022062802042204450d03200241d0156a20036a200628020022052d00003a000020062004417f6a3602042006200541016a3602002002200341016a22033a00f01520034120470d000b2001280200220328020422064110490d13201a29000021312023310000213220022900d715213320022900e715213420022d00d015213e20022f00d115213f20022800d31521402003280200220441086a2900002135200429000021362003200441106a3602002003200641706a36020420024188026a2001108d012002280288020d13200228028c02224120012802002802044104762203200320414b1b22034104742206417f4c0d2620030d03410421040c040b0240200341ff0171450d00200241003a00f0150b20260d130c140b0240200341ff0171450d00200241003a0090160b20260d120c130b0240200341ff0171450d00200241003a00f0150b20260d110c120b200610242204450d230b2001200128020441016a2206360204200241003602d815200220033602d415200220043602d015200620012802084b0d0d02402041450d00410021420340200128020022032802042205450d0e200328020022432d0000210620032005417f6a3602042003204341016a360200200641024b0d0e4100214302400240024020060e03020001020b410121430c010b410221430b20024180026a2001108d012002280280020d0e2001280200220628020422052002280284022203490d0e2003417f4c0d230240024020030d0041002144410121450c010b2003102a2245450d25200128020022062802042105200321440b0240024020052003490d0020452006280200200310cf0621052006280204224520034f0d012003204541b8afc0001048000b2044450d0f204510260c0f0b2006204520036b3602042006200628020020036a3602002003ad4220862044ad84204620051b2246204720051b21472005204820051b21482005450d0e0240204220022802d415470d00200241d0156a2042410110cf0120022802d015210420022802d81521420b200420424104746a220320433a000c20032047370204200320483602002002204241016a22423602d8152041417f6a22410d000b200128020421060b20012006417f6a3602042004450d0e20022902d415213741002103200241003a00f015024002400340200128020022062802042205450d01200241d0156a20036a200628020022422d00003a000020062005417f6a3602042006204241016a3602002002200341016a22033a00f01520034120470d000b2001280200220328020422050d010c0a0b0240200341ff0171450d00200241003a00f0150b02402037422088a72203450d00200341047421062004210303400240200341046a280200450d00200328020010260b200341106a2103200641706a22060d000b0b203742ffffffff0083500d0f200410260c0f0b201a29000021492023310000214a20022900d715214b20022900e715214c20022d00d015214220022f00d115214120022800d31521432003280200221a2d0000210620032005417f6a3602042003201a41016a360200200641014b0d08410021050240024020060e020100010b200241f8016a2001108d0120022802f8010d0941002103024020012802002205280204221a20022802fc012206490d002006417f4c0d230240024020060d0041002144410121030c010b2006102a2203450d2520012802002205280204211a200621440b0240201a2006490d0020032005280200200610cf061a2005280204221a2006490d042006ad4220862044ad84214d2005201a20066b3602042005200528020020066a3602000c010b02402044450d00200310260b410021030b204d204e20031b224e204f20031b224f205020031b21502003200b20031b21052003450d0a0b2050a7210b024002402001280200220328020422064104490d002003280200221a280000214420032006417c6a3602042003201a41046a360200200241800b6a410f6a2049370000200241900f6a410f6a220320493700002002204b3700870b200241900f6a41086a2206200241800b6a41086a290300370300200220433600830b200220413b00810b200220423a00800b200220022903800b3703900f202029000021492028290000214b2021310000215120022900cf0a215220022900e70a215320022900f70a215420022d00c80a214220022f00c90a214120022800cb0a214320022d00e00a214520022f00e10a215520022800e30a215620024188106a41386a221a203d29030037030020024188106a41306a2220203829030037030020024188106a41286a2221203929030037030020024188106a41206a2228203a29030037030020024188106a41186a2238203b29030037030020024188106a41106a2239203c29030037030020024188106a41086a223a200c290300370300200220022903c00637038810200241a80a6a410f6a2031370000200220333700af0a200220403600ab0a2002203f3b00a90a2002203e3a00a80a200241a80a6a411f6a20323c0000200220343700bf0a200241f00e6a41186a220c200241a80a6a41186a290300370300200241f00e6a41106a223b200241a80a6a41106a290300370300200241f00e6a41086a223c200241a80a6a41086a290300370300200220022903a80a3703f00e200241d80e6a410f6a223d2003290000370000200241d80e6a41086a223e2006290300370300200220022903900f3703d80e200241d8046a41386a223f201a290300370300200241d8046a41306a22402020290300370300200241d8046a41286a22572021290300370300200241d8046a41206a22582028290300370300200241d8046a41186a22592038290300370300200241d8046a41106a225a2039290300370300200241d8046a41086a2239203a29030037030020022002290388103703d804200241b80e6a41186a223a200c290300370300200241b80e6a41106a225b203b290300370300200241b80e6a41086a223b203c290300370300200220022903f00e3703b80e200241f0016a2001108d012037422088a721202037a7212120022802f001450d010c070b02402005450d00200b450d00200510260b02402037422088a72203450d00200341047421062004210303400240200341046a280200450d00200328020010260b200341106a2103200641706a22060d000b0b203742ffffffff0083500d0c0c0b0b20022802f4012238200128020028020441c1006e2203200320384b1bad42c1007e2231422088a70d212031a72203417f4c0d210240024020030d00410121280c010b200310242228450d230b2001200128020441016a2206360204200241003602a813200220283602a0132002200341c1006e22033602a413200620012802084b0d044100213c0240024002400240024002402038450d004100215c0340200128020022032802042206450d042003280200220c2d0000211a20032006417f6a3602042003200c41016a360200201a417f6a220341014b0d0402400240024020030e020001000b41002103200241003a0090160240034020012802002206280204220c450d01200241d0156a20036a2006280200221a2d00003a00002006200c417f6a3602042006201a41016a3602002002200341016a22033a009016200341c000470d000b20022f00e91520242d0000411074722106201b2903002131202c3100002132200241d0156a41246a2902002133200241d0156a41346a310000213420022903d015213720022903e015215d20022902ec15215e20022902fc15215f20022d008516210c20022f018616211a20022d008816216020022d008916216120022f018a162162200228028c162163410021640c020b200341ff01710d050c060b41002103200241003a009016034020012802002206280204220c450d04200241d0156a20036a2006280200221a2d00003a00002006200c417f6a3602042006201a41016a3602002002200341016a22033a009016200341c000470d000b20022f00e91520242d0000411074722106201b2903002131202c3100002132200241d0156a41246a2902002133200241d0156a41346a310000213420022903d015213720022903e015215d20022902ec15215e20022902fc15215f20022d008516210c20022f018616211a20022d008816216020022d008916216120022f018a162162200228028c162163410121640b205c41016a215c0240203c20022802a413470d00200241a0136a203c410110cd0120022802a013212820022802a813213c0b2028203c41c1006c6a2203206336003d200320623b003b200320613a003a200320603a00392003201a3b00372003200c3a00362003205f37002d200320063b001a2003205d370011200320643a0000200341356a20343c00002003411c6a20064110763a0000200341196a20323c00002003205e37001d20032037370001200341256a2033370000200341096a20313700002002203c41016a223c3602a813205c2038470d000b2001280204210620022802a41321030b20012006417f6a3602042028450d0a200241e8016a2001108d0120022802e8010d0820022802ec01221a41076a41037622060d03410021384101215c0c040b200341ff0171450d010b200241003a0090160b20022802a41321030c060b2006102a225c450d23200621380b024002402001280200220c2802042006490d00205c200c280200200610cf06215c200c28020422602006490d04200c206020066b360204200c200c28020020066a360200200241d0156a205c41d4c0c70020061b200610de0120022802d415410376201a4f0d0141c8f3c600412641dcbcc700102f000b2038450d04205c10260c040b200241d0156a201a10df0120022802d815210c20022802d415211a20022802d015210602402038450d00205c10260b2006450d032050422088a721652019203d290000370000200e203e290300370300201b2039290300370300202a205a290300370300202c2059290300370300202d2058290300370300202e2057290300370300202f20402903003703002030203f290300370300200220022903d80e3703f010200220022903d8043703d015202b203a2903003703002029205b290300370300200d203b290300370300200220022903b80e3703a013203621082035210920062166201a2167200c2168202121692020216a2005216b200b216c200a216d2026216e2027216f2042217020412171204321722052210f20492110201f2111201c211720452173205521742056217520532112204b2113205421142051211520442176204c2116204a211d201821772028217820032179203c217a0c110b2003200441b8afc0001048000b2006201a41b8afc0001048000b2006206041b8afc0001048000b02402003450d00200341c1006c450d00202810260b02402026450d00200a10260b02402020450d00202041047421062004210303400240200341046a280200450d00200328020010260b200341106a2103200641706a22060d000b0b0240202141ffffffff0071450d00200410260b2005450d03200b450d030c020b2003450d00200341c1006c450d00202810260b02402026450d00200a10260b02402020450d00202041047421062004210303400240200341046a280200450d00200328020010260b200341106a2103200641706a22060d000b0b0240202141ffffffff0071450d00200410260b2005450d01200b450d010b200510260b410021040c090b200b21050b02402037422088a72203450d00200341047421062004210303400240200341046a280200450d00200328020010260b200341106a2103200641706a22060d000b0b203742ffffffff0083500d010b200410260b2005210b0c020b2042450d00204241047421062004210303400240200341046a280200450d00200328020010260b200341106a2103200641706a22060d000b0b20022802d41541ffffffff0071450d00200410260b2026450d010b200a10260b200b2105410021040b200241a00e6a410f6a2203200241f0106a410f6a290000370000200241a00e6a41086a2206200241f0106a41086a290300370300200241f0036a41086a220b200241d0156a41086a290300370300200241f0036a41106a220a200241d0156a41106a290300370300200241f0036a41186a220d200241d0156a41186a290300370300200241f0036a41206a220c200241d0156a41206a290300370300200241f0036a41286a220e200241d0156a41286a290300370300200241f0036a41306a2218200241d0156a41306a290300370300200241f0036a41386a2219200241d0156a41386a290300370300200220022903f0103703a00e200220022903d0153703f003200241800e6a41186a221a200241a0136a41186a290300370300200241800e6a41106a221b200241a0136a41106a290300370300200241800e6a41086a2220200241a0136a41086a290300370300200220022903a0133703800e2004450d17200741016a2107200241e80d6a410f6a22212003290000370000200241e80d6a41086a22282006290300370300200241a80d6a41086a2229200b290300370300200241a80d6a41106a220b200a290300370300200241a80d6a41186a220a200d290300370300200241a80d6a41206a220d200c290300370300200241a80d6a41286a220c200e290300370300200241a80d6a41306a220e2018290300370300200241a80d6a41386a22182019290300370300200220022903a00e3703e80d200220022903f0033703a80d200241880d6a41186a2219201a290300370300200241880d6a41106a221a201b290300370300200241880d6a41086a221b2020290300370300200220022903800e3703880d024020022802800d220620022802fc0c470d00200241f80c6a2006410110e00120022802800d21060b20022802f80c222020064198026c6a2203200937030820032008370300200320043602102003419f016a20153c000020034197016a20143700002003418f016a201337000020034187016a2012370000200341ff006a20173c0000200341f7006a2011370000200341ef006a2010370000200341e7006a200f370000200341cb006a201d3c0000200341c3006a2016370000200341286a2076360200200341246a2065360200200341206a206c3602002003411c6a206b360200200341186a206a360200200341146a20693602002003412c6a20022903e80d370200200341346a20282903003702002003413b6a202129000037000020034183016a207536000020034181016a20743b000020034180016a20733a0000200341e3006a2072360000200341e1006a20713b0000200341e0006a20703a0000200341dc006a206f360200200341d8006a206e360200200341d4006a206d360200200341d0006a2077360200200341d8016a2018290300370200200341d0016a200e290300370200200341c8016a200c290300370200200341c0016a200d290300370200200341b8016a200a290300370200200341b0016a200b290300370200200341a8016a2029290300370200200341a0016a20022903a80d370200200341e0016a20022903880d370200200341e8016a201b290300370200200341f0016a201a290300370200200341f8016a201929030037020020034194026a206836020020034190026a20673602002003418c026a206636020020034188026a207a36020020034184026a207936020020034180026a20783602002002200641016a3602800d2005210b20072022470d000b20012001280204417f6a3602040c130b200241a0136a21180c1a0b200241a0136a210a0c220b200041173602000c230b0240024002400240200128020022032802042204450d00200328020022052d0000210620032004417f6a3602042003200541016a36020002400240024002400240200641034b0d00024002400240024020060e0400010203000b200241d8046a200110da010240024020022802d8042203450d0020022902dc042108200110b3022201450d01200241f0106a41106a2001360200200241f0106a41086a200837030020024184116a2002290288103702002002418c116a20024188106a41086a29020037020020024194116a20024188106a41106a2902003702002002419c116a200241a0106a290200370200200241a4116a200241a8106a290200370200200241ac116a200241b0106a290200370200200241b4116a200241b8106a280200360200200220033602f410200241013a00f0100c0c0b200241053a00f0100c0c0b200241053a00f010200842ffffff3f83500d0b200310260c0b0b02400240024002400240024002402001280200220328020422064102490d00200328020022042f0000210520032006417e6a3602042003200441026a360200200241d8046a200110da0120022802d8042203450d01200241d8046a41086a2204280200210720022802dc042106200241d8046a2001109c0420022802d8044102460d04200241f0036a41086a2004280200360200200220022903d8043703f003200241e8036a2001108d0120022802e8030d062001280200220b280204220a20022802ec032204490d062004417f4c0d1c20040d024100210d4101210c0c030b200241053a00f0100c100b200241053a00f0100c0f0b2004102a220c450d1a2001280200220b280204210a2004210d0b0240200a2004490d00200c200b280200200410cf06210a200b280204220c20044f0d022004200c41b8afc0001048000b200d450d02200c10260c020b200241053a00f010200641ffffff3f71450d0c200310260c0c0b200b200c20046b360204200b200b28020020046a360200200a0d090b200241053a00f010200641ffffff3f71450d0a200310260c0a0b024002400240024002402001280200220328020422064102490d00200328020022042f0000210a20032006417e6a3602042003200441026a36020020024188106a200110da012002280288102207450d0120024188106a41086a2203280200210d200228028c10210b20024188106a2001109c042002280288104102460d03200241a00b6a41086a200328020036020020022002290388103703a00b41002103200241003a00a8100340200128020022062802042204450d0320024188106a20036a200628020022052d00003a000020062004417f6a3602042006200541016a3602002002200341016a22033a00a81020034120470d000b200241d8046a410f6a220320024188106a410f6a290000370000200241d8046a41086a220620024188106a41086a290300370300200241f0036a410f6a22042003290000370000200241f0036a41086a22032006290300370300200241a80d6a41086a22062003290300370300200241a80d6a410f6a2203200429000037000020022002290388103703a80d200241a7106a3100002108200229009f102109200241800b6a410f6a22042003290000370000200241800b6a41086a2006290300370300200220022903a80d3703800b2001280200220128020422034108490d0420012802002206290000210f2001200341786a3602042001200641086a36020020024180066a41086a2201200241a00b6a41086a28020036020020024190116a20083c000020024188116a20093703002002419c116a200d36020020024198116a200b36020020024194116a200736020020024192116a200a3b010020024180116a2004290000370300200241f0106a41086a20022900870b370300200220022903a00b37038006200241033a00f010200220022800830b3602f410200220022f00810b3b01f210200220022d00800b3a00f110200241a8116a2001280200360200200241a0116a200229038006370300200241b0116a200f3703000c0d0b200241053a00f0100c0d0b200241053a00f0100c0c0b0240200341ff0171450d00200241003a00a8100b200241053a00f010200b41ffffff3f71450d0b200710260c0b0b200241053a00f010200b41ffffff3f71450d0a200710260c0a0b200241053a00f010200b41ffffff3f71450d09200710260c090b2001280200220328020422064102490d01200328020022042f0000210a20032006417e6a3602042003200441026a36020020024188106a200110da012002280288102207450d02200228028c10210b2001280200220328020422064104490d0420024190106a280200210d20032802002204280000210c20032006417c6a3602042003200441046a3602002001280200220328020422064104490d0420032802002204280000210e20032006417c6a3602042003200441046a36020041002103200241003a00a8100340200128020022062802042204450d0420024188106a20036a200628020022052d00003a000020062004417f6a3602042006200541016a3602002002200341016a22033a00a81020034120470d000b2002419c116a200dad3e020020024188116a200229009f10370300200241f8106a200229008f10370300200241a4116a200e360200200241a0116a200c36020020024192116a200a3b010020024190116a200241a7106a3100003c000020024180116a20024197106a29000037030020024194116a200bad4220862007ad843702002002200228008b103602f410200220022f0089103b01f210200220022d0088103a00f110200241043a00f0100c070b200241053a00f0100c070b200241053a00f0100c060b200241053a00f0100c050b0240200341ff0171450d00200241003a00a8100b200241053a00f010200b41ffffff3f71450d04200710260c040b200241053a00f010200b41ffffff3f71450d03200710260c030b200241053a00f0100c020b2004ad422086200dad842208a7210b0240024020012802002204280204220c450d002004280200220e2d0000210d2004200c417f6a3602042004200e41016a360200200d41014b0d004100210402400240200d0e020100010b410121040b20012802002201280204220d4108490d012001280200220c29000021092001200d41786a3602042001200c41086a360200200241a80d6a41086a200241f0036a41086a2802002201360200200241fc106a2007360200200241f0106a41086a2006360200200241f0106a41106a20022903f003220f37030020024188116a200136020020024198116a200937030020024194116a2008422088a736020020024190116a200b3602002002418c116a200a3602002002200f3703a80d200220033602f410200220053b01f210200220043a00f110200241023a00f010200241b0116a20024188106a41106a290300370300200241a8116a20024188106a41086a290300370300200241a0116a2002290388103703000c020b200241053a00f0100240200b450d00200a10260b200641ffffff3f71450d02200310260c020b200241053a00f0100240200b450d00200a10260b200641ffffff3f71450d01200310260c010b200241c0066a200241f0106a41c80010cf061a200241a0136a41046a200241c0066a41c80010cf061a20004116360200200041046a200241a0136a41cc0010cf061a200041d0006a200241d0156a41e00110cf061a0c230b20004117360200200241f0106a10b7060c220b0240200128020022032802042204450d00200328020022052d0000210620032004417f6a3602042003200541016a360200200641054b0d004104210a024002400240024002400240024020060e06000102060304000b41002103200241003a00c0130240024002400340200128020022062802042204450d01200241a0136a20036a200628020022052d00003a000020062004417f6a3602042006200541016a3602002002200341016a22033a00c01320034120470d000b200241a80a6a411f6a200241a0136a411f6a3100003c0000200241a80a6a410f6a200241a0136a410f6a290000370000200220022900b7133700bf0a200220022900a7133700af0a200220022800a3133600ab0a200220022f00a1133b00a90a200220022d00a0133a00a80a200128020022032802042204450d09200328020022052d0000210620032004417f6a3602042003200541016a360200200641014b0d094104210320060e020201020b200341ff0171450d08200241003a00c0130c080b200128020022032802042204450d07200328020022052d0000210620032004417f6a3602042003200541016a360200200641034b0d074100210302400240024020060e0403020001030b410221030c020b410321030c010b410121030b200110b3022207450d06200241c70a6a3100002109200241b70a6a290000211020022900bf0a210820022900af0a210f20022800ab0a210d20022f00a90a210c20022d00a80a21044101210a0c050b41002103200241003a00c0130240024002400340200128020022062802042204450d01200241a0136a20036a200628020022052d00003a000020062004417f6a3602042006200541016a3602002002200341016a22033a00c01320034120470d000b200128020022012802042203450d08200241bf136a3100002109200241af136a290000211020022900b713210820022900a713210f20022800a313210d20022f00a113210c20022d00a0132104200128020022052d0000210620012003417f6a3602042001200541016a360200200641034b0d084102210a4100210320060e0407010602070b200341ff0171450d07200241003a00c0130c070b410121030c050b410321030c040b41002103200241003a00c013024002400240024002400340200128020022062802042204450d01200241a0136a20036a200628020022052d00003a000020062004417f6a3602042006200541016a3602002002200341016a22033a00c01320034120470d000b200241e00a6a411f6a200241a0136a411f6a3100003c0000200241e00a6a410f6a200241a0136a410f6a290000370000200220022900b7133700f70a200220022900a7133700e70a200220022800a3133600e30a200220022f00a1133b00e10a200220022d00a0133a00e00a200128020022012802042203450d09200128020022042d0000210620012003417f6a3602042001200441016a360200200641034b0d094100210320060e0404030102040b200341ff0171450d08200241003a00c0130c080b410221030c020b410321030c010b410121030b200241c80a6a410f6a2201200241e00a6a410f6a290000370000200241c80a6a41086a200241e00a6a41086a290300370300200220022903e00a22113703c80a200241ff0a6a310000210920022900f70a21082001290000211020022f00c90a210c20022800cb0a210d20022900cf0a210f2011a721044103210a0c030b200128020022032802042204450d03200328020022052d0000210620032004417f6a3602042003200541016a360200200641034b0d0341002104024002400240024020060e0403000102030b410121040c020b410221040c010b410321040b2001280200220128020422034102490d03200128020022062f0000210c20012003417e6a3602042001200641026a3602004105210a4100210d410021070c020b41002103200241003a00c013024002400240024002400340200128020022062802042204450d01200241a0136a20036a200628020022052d00003a000020062004417f6a3602042006200541016a3602002002200341016a22033a00c01320034120470d000b200241800b6a410f6a200241a0136a410f6a290000370000200220022900a7133700870b200220022800a3133600830b200220022f00a1133b00810b200220022d00a0133a00800b200128020022032802042204450d07200241bf136a310000210920022900b7132108200328020022052d0000210620032004417f6a3602042003200541016a360200200641034b0d074100210320060e0404030102040b200341ff0171450d06200241003a00c0130c060b410221030c020b410321030c010b410121030b2001280200220628020422044102490d02200628020022072f0000210520062004417e6a3602042006200741026a360200200241e0036a2001108d0120022802e0030d0220022802e4032107200241d8036a2001108d0120022802d8030d0220022802dc03210b2002418f0b6a290000211020022900870b210f20022800830b210d20022f00810b210c20022d00800b21044106210a0c010b410221034102210a0b200020033a0025200020043a00052000200a3a000420004115360200200041246a20093c00002000411c6a2008370200200041146a20103702002000410c6a200f3702002000412c6a200b360200200041286a2007360200200041266a20053b0100200041086a200d360200200041066a200c3b0100200041306a200241d0156a41800210cf061a0c220b200041173602000c210b200241f0106a2001108405024020022d00f0104105460d00200241c0066a41206a200241f0106a41206a2903002208370300200241c0066a41186a200241f0106a41186a2903002209370300200241a0136a410c6a200241f0106a41086a290300370200200241a0136a41146a200241f0106a41106a290300370200200241a0136a411c6a2009370200200241a0136a41246a2008370200200220022903f0103702a41320004114360200200020022902a0133702042000410c6a200241a0136a41086a290200370200200041146a200241a0136a41106a2902003702002000411c6a200241a0136a41186a290200370200200041246a200241a0136a41206a2902003702002000412c6a200241c8136a280200360200200041306a200241d0156a41800210cf061a0c210b200041173602000c200b200241a0136a2001109b04024020022d00a0134107460d00200241f0106a41206a200241a0136a41206a2802002201360200200241f0106a41186a200241a0136a41186a2903002208370300200241f0106a41106a200241a0136a41106a2903002209370300200241f0106a41086a200241a0136a41086a290300220f370300200220022903a01322103703f01020004113360200200020103702042000410c6a200f370200200041146a20093702002000411c6a2008370200200041246a2001360200200041286a200241d0156a41880210cf061a0c200b20004117360200200241a0136a10b6060c1f0b0240200128020022032802042204450d00200328020022052d0000210620032004417f6a360204410121042003200541016a360200200641034b0d0002400240024002400240024020060e0403000102030b41002103200241003a00c01302400340200128020022062802042204450d01200241a0136a20036a200628020022052d00003a000020062004417f6a3602042006200541016a3602002002200341016a22033a00c01320034120470d000b200241bf136a3100002110200241af136a290000211720022900b713210f20022900a713211120022800a313210720022f00a113210b20022d00a013210a42002109410221044200211e0c030b200341ff0171450d05200241003a00c0130c050b41002103200241003a00c01302400340200128020022062802042204450d01200241a0136a20036a200628020022052d00003a000020062004417f6a3602042006200541016a3602002002200341016a22033a00c01320034120470d000b2001280200220328020422064110490d05200241bf136a3100002110200241af136a290000211720022900b713210f20022900a713211120022800a313210720022f00a113210b20022d00a013210a2003280200220441086a2900002113200429000021122003200441106a3602002003200641706a3602042001280200220328020422064110490d052003280200220441086a2900002115200429000021142003200441106a3602002003200641706a3602042001280200220128020422064104490d0520012802002204280000210320012006417c6a3602042001200441046a36020020022903a80a2208422088211e20084220862109200241a80a6a41106a290300211d20022903b00a211620022802c40a210520022802c00a210d410321040c020b200341ff0171450d04200241003a00c0130c040b41002103200241003a00c0130340200128020022062802042204450d02200241a0136a20036a200628020022052d00003a000020062004417f6a3602042006200541016a3602002002200341016a22033a00c01320034120470d000b200241bf136a3100002110200241af136a290000211720022900b713210f20022900a713211120022800a313210720022f00a113210b20022d00a013210a41002103200241003a00c0130340200128020022062802042204450d03200241a0136a20036a200628020022052d00003a000020062004417f6a3602042006200541016a3602002002200341016a22033a00c01320034120470d000b200241800b6a410f6a200241a0136a410f6a290000370000200220022900a7133700870b200220022800a3133600830b200220022f00a1133b00810b200220022d00a0133a00800b2001280200220328020422064110490d03200241bf136a310000211320022900b71321142003280200220441086a29000021122004290000211c2003200441106a3602002003200641706a3602042001280200220328020422064110490d032003280200220441086a290000211d200429000021162003200441106a3602002003200641706a360204410421042001280200220128020422034104490d0320012802002206280000210d20012003417c6a3602042001200641046a360200200241c80a6a410f6a2201200241800b6a410f6a290000370000200241c80a6a41086a200241800b6a41086a290300370300200220022903800b22083703c80a201c42208820124220868421092012422088211e201342ff018321152001290000211320022900cf0a2112201ca721030b200020083e00292000200b3b000a2000200a3a0009200041123602002000412f6a20084230883c00002000412d6a20084220883d0000200041e8006a201d370200200041e0006a2016370200200041c8006a2015370200200041c0006a2014370200200041386a2013370200200041306a2012370200200041286a20103c0000200041206a200f370000200041186a2017370000200041106a2011370000200041f4006a2005360200200041f0006a200d3602002000410c6a2007360000200041086a20043a0000200041d0006a20094220862003ad84370200200041d8006a201e422086200942208884370200200041f8006a200241d0156a41b80110cf061a0c210b200341ff0171450d01200241003a00c0130c010b200341ff0171450d00200241003a00c0130b200041173602000c1e0b200241a0136a200110c503024020022d00a013410a460d00200241f0106a200241a0136a41c40010cf061a20004111360200200041046a200241f0106a41c40010cf061a200041c8006a200241d0156a41e80110cf061a0c1e0b200041173602000c1d0b0240200128020022032802042204450d00200328020022052d0000210620032004417f6a3602042003200541016a3602002006410e4b0d004104216d024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020060e0f00010211030405060708090a0b0c0d000b41002103200241003a00c01302400340200128020022062802042204450d01200241a0136a20036a200628020022052d00003a000020062004417f6a3602042006200541016a3602002002200341016a22033a00c01320034120470d000b200241900f6a41086a200241a00b6a41086a290000370300200241900f6a410f6a200241a00b6a410f6a290000370000200241a40a6a41026a200241c0056a41026a2d00003a0000200220022f0080063b01f80c200220022900a00b3703900f200220022f00c0053b01a40a200220024180066a41026a2d00003a00fa0c200241bf136a310000210f200241a0136a410f6a290000211120022900b713210920022900a713211020022800a313210320022f00a113210520022d00a0132107200241880a6a41106a200241c0066a41106a290000370300200241880a6a41086a200241c0066a41086a290000370300200220022900c0063703880a200241840a6a41026a200241f00e6a41026a2d00003a0000200220022f00f00e3b01840a200241e8096a41106a20024188106a41106a290000370300200241e8096a41086a20024188106a41086a29000037030020022002290088103703e809200241e4096a41026a200241b80e6a41026a2d00003a0000200220022f00b80e3b01e409200241c8096a41106a200241d8046a41106a290000370300200241c8096a41086a200241d8046a41086a290000370300200220022900d8043703c809200241f0036a41206a200241d0156a41206a280000360200200241f0036a41186a200241d0156a41186a290000370300200241f0036a41106a200241d0156a41106a290000370300200241f0036a41086a200241d0156a41086a290000370300200220022900d0153703f003200241c4096a41026a200241800e6a41026a2d00003a0000200220022f00800e3b01c4094101216d0c110b200341ff0171450d15200241003a00c0130c150b200241f0026a2001108d0120022802f0020d1420022802f402220b200128020028020441c8006e22032003200b4b1bad42c8007e2208422088a70d192008a72206417f4c0d190240024020060d00410421030c010b200610242203450d1b0b2001200128020441016a2204360204200241003602b00a200220033602a80a2002200641c8006e3602ac0a200420012802084b0d0d0240200b450d00200241a0136a410c6a2107200241a0136a410172210a410021040340200241a0136a200110ce02024020022d00a01322054106470d00200241c40b6a41026a200241e00b6a41026a2d00003a0000200241c0056a41086a20024180066a41086a290300370300200241c0056a41106a20024180066a41106a290300370300200241c0066a41086a200241f0106a41086a290300370300200241c0066a41106a200241f0106a41106a290300370300200241c0066a41186a200241f0106a41186a290300370300200241c0066a41206a200241f0106a41206a280200360200200220022f01e00b3b01c40b20022002290380063703c005200220022903f0103703c0060c150b200241fc0b6a41026a220c200a41026a2d00003a0000200241a00b6a41086a220e200741086a290200370300200241a00b6a41106a2218200741106a2902003703002002200a2f00003b01fc0b200220072902003703a00b20022802a413210d20022802a8132106200241d0156a200110ce020240024020022d00d0154106470d00024020054101470d002006450d00200d10260b410621050c010b200241e00b6a41026a200c2d00003a000020024180066a41086a200e29030037030020024180066a41106a2018290300370300200241f0106a41086a200241d0156a41086a290300370300200241f0106a41106a200241d0156a41106a290300370300200241f0106a41186a200241d0156a41186a290300370300200241f0106a41206a200241d0156a41206a280200360200200220022f01fc0b3b01e00b200220022903a00b37038006200220022903d0153703f01020062121200d21280b200241c40b6a41026a2206200241e00b6a41026a2d00003a0000200241c0056a41086a220d20024180066a41086a290300370300200241c0056a41106a220c20024180066a41106a290300370300200241c0066a41086a220e200241f0106a41086a290300370300200241c0066a41106a2218200241f0106a41106a290300370300200241c0066a41186a2219200241f0106a41186a290300370300200241c0066a41206a221a200241f0106a41206a280200360200200220022f01e00b3b01c40b20022002290380063703c005200220022903f0103703c00620054106460d14200241a00e6a41026a221b20062d00003a0000200241f00e6a41086a2220200d290300370300200241f00e6a41106a220d200c29030037030020024188106a41086a220c200e29030037030020024188106a41106a220e201829030037030020024188106a41186a2218201929030037030020024188106a41206a2219201a280200360200200220022f01c40b3b01a00e200220022903c0053703f00e200220022903c006370388100240200420022802ac0a470d00200241a80a6a2004410110ef0120022802a80a210320022802b00a21040b2003200441c8006c6a220620053a0000200641086a2021360000200641046a2028360000200641036a201b2d00003a0000200620022f01a00e3b0001200641146a20202903003700002006411c6a200d2903003700002006410c6a20022903f00e370000200641246a200229038810370000200641346a200e2903003700002006412c6a200c2903003700002006413c6a2018290300370000200641c4006a20192802003600002002200441016a22043602b00a200b417f6a220b0d000b200128020421040b20012004417f6a3602042003450d1420022902ac0a2110200241d0156a200110ce02024002400240024002400240024002400240024020022d00d0154106460d00200241e0156a310000210f200241f0156a280200216e200241e8156a2903002117200241e4156a220d2802002104200241e2156a2f0100210b200241e1156a2d0000210a200241d8156a220c290300210920022802d415210720022802d0152106200241d0156a200110ce022009a7210520022d00d0154106460d012002200d2f01003b01f00e2002200241e6156a2d00003a00f20e200241e7156a2900002114200241dc156a220e2902002115200c2802002170200241ef156a3500002108200241f3156a310000211120022802d415217120022802d015216f200241d0156a200110ce0220022d00d015220d4106460d0220024188106a41086a200241e5156a29000037030020024197106a200241ec156a22202900003700002002200241dd156a29000037038810200e2d00002119200241d0156a41086a2221280200210c20022802d415210e20022d00d315211b20022f00d115211a200241d0156a200110ce0220022d00d01522184106460d03200241c0056a41026a20022d00d3153a0000200241c0066a41086a200241e4156a2229290200370300200241c0066a41106a2020290200370300200220022f00d1153b01c0052002200241dc156a22222902003703c0062021280200212020022802d4152121200241d0156a200110ce0220022d00d01522284106460d0820024180066a41026a20022d00d3153a0000200241f0106a41086a2029290200370300200241f0106a41106a200241ec156a290200370300200220022f00d1153b018006200220222902003703f010200241d0156a41086a280200212920022802d4152122200128020022662802042267450d07206628020022682d0000216a20662067417f6a3602042066206841016a360200206a41014b0d0741002166206a0e020504050b02402010422088a72201450d002003200141c8006c6a2106200321010340024020012d00004101470d00200141086a280200450d00200141046a28020010260b0240200141246a2d00004101470d002001412c6a280200450d00200141286a28020010260b200141c8006a22012006470d000b0b2010a72201450d1d200141c8006c450d1d200310260c1d0b0240200641ff01714101470d002005450d00200710260b02402010422088a72201450d002003200141c8006c6a2106200321010340024020012d00004101470d00200141086a280200450d00200141046a28020010260b0240200141246a2d00004101470d002001412c6a280200450d00200141286a28020010260b200141c8006a22012006470d000b0b2010a72201450d1c200141c8006c450d1c200310260c1c0b0240206f41ff01714101470d002070450d00207110260b0240200641ff01714101470d002005450d00200710260b02402010422088a72201450d002003200141c8006c6a2106200321010340024020012d00004101470d00200141086a280200450d00200141046a28020010260b0240200141246a2d00004101470d002001412c6a280200450d00200141286a28020010260b200141c8006a22012006470d000b0b2010a72201450d1b200141c8006c450d1b200310260c1b0b0240200d4101470d00200c450d00200e10260b0240206f41ff01714101470d002070450d00207110260b0240200641ff01714101470d002005450d00200710260b02402010422088a72201450d002003200141c8006c6a2106200321010340024020012d00004101470d00200141086a280200450d00200141046a28020010260b0240200141246a2d00004101470d002001412c6a280200450d00200141286a28020010260b200141c8006a22012006470d000b0b2010a72201450d1a200141c8006c450d1a200310260c1a0b41002166200241003a00e4150340200128020022672802042268450d02200241d0156a20666a206728020022692d00003a000020672068417f6a3602042067206941016a3602002002206641016a22663a00e41520664114470d000b20022802e015216920022802dc15216820022802d815216720022903d0152116410121660b200241d0156a200110ce0220022d00d015226a4106460d034102216d200241a00b6a41026a227220022d00d3153a0000200241a0136a41086a2273200241e4156a290200370300200241a0136a41106a2274200241ec156a290200370300200220022f00d1153b01a00b2002200241dc156a2902003703a013200241d0156a41086a2275280200216b20022802d415216c200241d0156a200110ce0220022d00d0154106470d100240206a4101470d00206b450d00206c10260b024020284101470d002029450d00202210260b024020184101470d002020450d00202110260b0240200d4101470d00200c450d00200e10260b0240206f41ff01714101470d002070450d00207110260b0240200641ff01714101470d002005450d00200710260b02402010422088a72201450d002003200141c8006c6a2106200321010340024020012d00004101470d00200141086a280200450d00200141046a28020010260b0240200141246a2d00004101470d002001412c6a280200450d00200141286a28020010260b200141c8006a22012006470d000b0b2010a72201450d18200141c8006c450d18200310260c180b206641ff0171450d00200241003a00e4150b024020284101470d002029450d00202210260b024020184101470d002020450d00202110260b0240200d4101470d00200c450d00200e10260b0240206f41ff01714101470d002070450d00207110260b0240200641ff01714101470d002005450d00200710260b02402010422088a72201450d002003200141c8006c6a2106200321010340024020012d00004101470d00200141086a280200450d00200141046a28020010260b0240200141246a2d00004101470d002001412c6a280200450d00200141286a28020010260b200141c8006a22012006470d000b0b2010a72201450d16200141c8006c450d16200310260c160b024020184101470d002020450d00202110260b0240200d4101470d00200c450d00200e10260b0240206f41ff01714101470d002070450d00207110260b0240200641ff01714101470d002005450d00200710260b02402010422088a72201450d002003200141c8006c6a2106200321010340024020012d00004101470d00200141086a280200450d00200141046a28020010260b0240200141246a2d00004101470d002001412c6a280200450d00200141286a28020010260b200141c8006a22012006470d000b0b2010a72201450d15200141c8006c450d15200310260c150b024020284101470d002029450d00202210260b024020184101470d002020450d00202110260b0240200d4101470d00200c450d00200e10260b0240206f41ff01714101470d002070450d00207110260b0240200641ff01714101470d002005450d00200710260b02402010422088a72201450d002003200141c8006c6a2106200321010340024020012d00004101470d00200141086a280200450d00200141046a28020010260b0240200141246a2d00004101470d002001412c6a280200450d00200141286a28020010260b200141c8006a22012006470d000b0b2010a72201450d14200141c8006c450d14200310260c140b200241f8026a2001108d0120022802f8020d1320022802fc02220b200128020028020441c4006e22032003200b4b1bad42c4007e2208422088a70d182008a72206417f4c0d180240024020060d00410421030c010b200610242203450d1a0b2001200128020441016a2204360204200241003602f80e200220033602f00e2002200641c4006e3602f40e02400240200420012802084b0d000240200b450d00200241d0156a410172210c200241d0156a410f6a210e200241d0156a411f6a21184100210a4100210d0340200241003a00f015200d41016a210d410021060340200128020022042802042205450d04200241d0156a20066a200428020022072d00003a000020042005417f6a3602042004200741016a3602002002200641016a22063a00f01520064120470d000b200e29000021082018310000210920022900d715210f20022900e715211020022d00d015210620022f00d115210420022800d3152105200241d0156a200110ce0220022d00d01522074106460d13200241f0106a411f6a2219200c411f6a280000360000200241f0106a41186a221a200c41186a290000370300200241c0066a41086a221b200c41086a290000370300200241c0066a41106a2220200c41106a290000370300200241c0066a41186a2221201a290300370300200241c0066a411f6a221a20192800003600002002200c2900003703c006200241800b6a410f6a221920083700002002200f3700870b200220053600830b200220043b00810b200220063a00800b20024188106a411f6a2204201a28000036000020024188106a41186a2205202129030037030020024188106a41106a221a202029030037030020024188106a41086a2220201b290300370300200220022903c006370388100240200a20022802f40e470d00200241f00e6a200a410110eb0120022802f00e210320022802f80e210a0b200241800b6a41086a29030021082019290000210f20022903800b21112003200a41c4006c6a220620073a002020062010370017200620113702002006411f6a20093c00002006410f6a200f370000200641086a20083702002006200229038810370021200641296a2020290300370000200641316a201a290300370000200641396a2005290300370000200641c0006a20042800003600002002200a41016a220a3602f80e200d200b470d000b200128020421040b20012004417f6a3602042003450d1520022902f40e2110200241900f6a41086a200241c0056a41086a290000370300200241900f6a410f6a200241c0056a410f6a290000370000200241a40a6a41026a200241800e6a41026a2d00003a0000200241880a6a41086a200241d8046a41086a290200370300200241880a6a41106a200241d8046a41106a290200370300200220022d00ba0e3a00fa0c200220022f01b80e3b01f80c200220022900c0053703900f200220022f00800e3b01a40a200220022902d8043703880a200241840a6a41026a200241880d6a41026a2d00003a0000200241e8096a41086a200241a00b6a41086a290200370300200241e8096a41106a200241a00b6a41106a290200370300200241e4096a41026a200241e00a6a41026a2d00003a0000200241c8096a41086a20024180066a41086a290200370300200241c8096a41106a20024180066a41106a290200370300200220022f00880d3b01840a200220022902a00b3703e809200220022f00e00a3b01e40920022002290280063703c809200241f0036a41206a200241a0136a41206a280200360200200241f0036a41186a200241a0136a41186a290300370300200241f0036a41106a200241a0136a41106a290300370300200241f0036a41086a200241a0136a41086a290300370300200241c4096a41026a200241a80a6a41026a2d00003a0000200220022903a0133703f003200220022f00a80a3b01c4094103216d0c100b200241f00e6a21060c110b200641ff0171450d0f200241003a00f0150c0f0b20024198036a2001108d012002280298030d12200228029c03210320024180036a200110ec04200229038003a70d1220024180036a41106a29030021112002290388032110200241900f6a41086a20024188106a41086a290000370300200241900f6a410f6a20024188106a410f6a290000370000200241a40a6a41026a200241a00b6a41026a2d00003a0000200241880a6a41086a200241a0136a41086a290200370300200241880a6a41106a200241a0136a41106a290200370300200220022d00da043a00fa0c200220022f01d8043b01f80c20022002290088103703900f200220022f00a00b3b01a40a200220022902a0133703880a200241840a6a41026a20024180066a41026a2d00003a0000200241e8096a41086a200241f0106a41086a290200370300200241e8096a41106a200241f0106a41106a290200370300200241e4096a41026a200241c0056a41026a2d00003a0000200241c8096a41086a200241c0066a41086a290200370300200241c8096a41106a200241c0066a41106a290200370300200220022f0080063b01840a200220022902f0103703e809200220022f00c0053b01e409200220022902c0063703c809200241f0036a41206a200241d0156a41206a280200360200200241f0036a41186a200241d0156a41186a290300370300200241f0036a41106a200241d0156a41106a290300370300200241f0036a41086a200241d0156a41086a290300370300200241c4096a41026a200241f00e6a41026a2d00003a0000200220022903d0153703f003200220022f00f00e3b01c4094105216d0c0d0b2001280200220128020422064104490d1120012802002204280000210320012006417c6a3602042001200441046a360200200241900f6a41086a20024188106a41086a290000370300200241900f6a410f6a20024188106a410f6a290000370000200241a40a6a41026a200241a00b6a41026a2d00003a0000200220022f01d8043b01f80c200220022d00da043a00fa0c20022002290088103703900f200220022f00a00b3b01a40a200241880a6a41106a200241a0136a41106a290200370300200241880a6a41086a200241a0136a41086a290200370300200220022902a0133703880a200241840a6a41026a20024180066a41026a2d00003a0000200220022f0080063b01840a200241e8096a41106a200241f0106a41106a290200370300200241e8096a41086a200241f0106a41086a290200370300200220022902f0103703e809200241e4096a41026a200241c0056a41026a2d00003a0000200220022f00c0053b01e409200241c8096a41106a200241c0066a41106a290200370300200241c8096a41086a200241c0066a41086a290200370300200220022902c0063703c809200241f0036a41206a200241d0156a41206a280200360200200241f0036a41186a200241d0156a41186a290300370300200241f0036a41106a200241d0156a41106a290300370300200241f0036a41086a200241d0156a41086a290300370300200220022903d0153703f003200241c4096a41026a200241f00e6a41026a2d00003a0000200220022f00f00e3b01c4094106216d420021110c0c0b200241b8036a2001108d0120022802b8030d1020022802bc032103200241a0036a200110ec0420022903a003a70d10200241a0036a41106a290300211120022903a8032110200241900f6a41086a200241980c6a41086a290000370300200241900f6a410f6a200241980c6a410f6a290000370000200241a40a6a41026a200241950c6a41026a2d00003a0000200241880a6a41086a200241fc0b6a41086a290200370300200241880a6a41106a200241fc0b6a41106a290200370300200220022d00b20c3a00fa0c200220022f01b00c3b01f80c200220022900980c3703900f200220022f00950c3b01a40a200220022902fc0b3703880a200241840a6a41026a200241f90b6a41026a2d00003a0000200241e8096a41086a200241e00b6a41086a290200370300200241e8096a41106a200241e00b6a41106a290200370300200241e4096a41026a200241dd0b6a41026a2d00003a0000200241c8096a41086a200241c40b6a41086a290200370300200241c8096a41106a200241c40b6a41106a290200370300200220022f00f90b3b01840a200220022902e00b3703e809200220022f00dd0b3b01e409200220022902c40b3703c809200241f0036a41206a200241a00b6a41206a280200360200200241f0036a41186a200241a00b6a41186a290300370300200241f0036a41106a200241a00b6a41106a290300370300200241f0036a41086a200241a00b6a41086a290300370300200241c4096a41026a2002419d0b6a41026a2d00003a0000200220022903a00b3703f003200220022f009d0b3b01c4094107216d420021170c0b0b200241c0036a2001108d0120022802c0030d0f20022802c403210441002103200241003a00c01302400340200128020022062802042205450d01200241a0136a20036a200628020022072d00003a000020062005417f6a3602042006200741016a3602002002200341016a22033a00c01320034120470d000b4108216d200241900f6a41086a200241d8046a41086a290000370300200241900f6a410f6a200241d8046a410f6a290000370000200241a40a6a41026a20024180066a41026a2d00003a0000200220022f01a00b3b01f80c200220022d00a20b3a00fa0c200220022900d8043703900f200220022f0080063b01a40a200241bf136a310000210f200241a0136a410f6a290000211120022900b713210920022900a713211020022800a313210320022f00a113210520022d00a0132107200241880a6a41106a200241f0106a41106a290200370300200241880a6a41086a200241f0106a41086a290200370300200220022902f0103703880a200241840a6a41026a200241c0056a41026a2d00003a0000200220022f00c0053b01840a200241e8096a41106a200241c0066a41106a290200370300200241e8096a41086a200241c0066a41086a290200370300200220022902c0063703e809200241e4096a41026a200241f00e6a41026a2d00003a0000200220022f00f00e3b01e409200241c8096a41106a20024188106a41106a290200370300200241c8096a41086a20024188106a41086a29020037030020022002290288103703c809200241f0036a41206a200241d0156a41206a280200360200200241f0036a41186a200241d0156a41186a290300370300200241f0036a41106a200241d0156a41106a290300370300200241f0036a41086a200241d0156a41086a290300370300200220022903d0153703f003200241c4096a41026a200241b80e6a41026a2d00003a0000200220022f00b80e3b01c4090c0b0b200341ff0171450d0f200241003a00c0130c0f0b200241c8036a2001108d0120022802c8030d0e2001280200220128020422064108490d0e20022802cc0321032001280200220429000021082001200641786a3602042001200441086a36020020084280025a0d0e200241900f6a41086a20024188106a41086a290000370300200241900f6a410f6a20024188106a410f6a290000370000200241a40a6a41026a200241a00b6a41026a2d00003a0000200241880a6a41086a200241a0136a41086a290200370300200241880a6a41106a200241a0136a41106a290200370300200220022d00da043a00fa0c200220022f01d8043b01f80c20022002290088103703900f200220022f00a00b3b01a40a200220022902a0133703880a200241840a6a41026a20024180066a41026a2d00003a0000200241e8096a41086a200241f0106a41086a290200370300200241e8096a41106a200241f0106a41106a290200370300200241e4096a41026a200241c0056a41026a2d00003a0000200241c8096a41086a200241c0066a41086a290200370300200241c8096a41106a200241c0066a41106a290200370300200220022f0080063b01840a200220022902f0103703e809200220022f00c0053b01e409200220022902c0063703c809200241f0036a41206a200241d0156a41206a280200360200200241f0036a41186a200241d0156a41186a290300370300200241f0036a41106a200241d0156a41106a290300370300200241f0036a41086a200241d0156a41086a290300370300200241c4096a41026a200241f00e6a41026a2d00003a0000200220022903d0153703f003200220022f00f00e3b01c409200842ff018321104109216d0c090b200241d0036a2001108d0120022802d0030d0d20022802d403210441002103200241003a00c01302400240024002400240024002400340200128020022062802042205450d01200241a0136a20036a200628020022072d00003a000020062005417f6a3602042006200741016a3602002002200341016a22033a00c01320034120470d000b200241a0106a200241bf136a3100003c0000200220022900b71337039810200220022900a713370388102002200241af136a2900003703901020012802002206280204220a450d1420022800a313210320022f00a113210520022d00a01321072006280200220d2d0000210b2006200a417f6a3602042006200d41016a360200200b41064b0d1442002117200b0e070e0102030405060e0b200341ff0171450d13200241003a00c0130c130b2001280200220128020422064110490d122001280200220b41086a2900002113200b29000021122001200b41106a3602002001200641706a360204420121170c0c0b420221170c0b0b420321170c0a0b420421170c090b420521170c080b420621170c070b41002103200241003a00c01302400340200128020022062802042204450d01200241a0136a20036a200628020022052d00003a000020062004417f6a3602042006200541016a3602002002200341016a22033a00c01320034120470d000b200241900f6a41086a200241d8046a41086a290000370300200241900f6a410f6a200241d8046a410f6a290000370000200241a40a6a41026a20024180066a41026a2d00003a0000200220022f00a00b3b01f80c200220022900d8043703900f200220022f0080063b01a40a2002200241a00b6a41026a2d00003a00fa0c200241bf136a310000210f200241a0136a410f6a290000211120022900b713210920022900a713211020022800a313210320022f00a113210520022d00a0132107200241880a6a41106a200241f0106a41106a290000370300200241880a6a41086a200241f0106a41086a290000370300200220022900f0103703880a200241840a6a41026a200241c0056a41026a2d00003a0000200220022f00c0053b01840a200241e8096a41106a200241c0066a41106a290000370300200241e8096a41086a200241c0066a41086a290000370300200220022900c0063703e809200241e4096a41026a200241f00e6a41026a2d00003a0000200220022f00f00e3b01e409200241c8096a41106a20024188106a41106a290000370300200241c8096a41086a20024188106a41086a29000037030020022002290088103703c809200241f0036a41206a200241d0156a41206a280000360200200241f0036a41186a200241d0156a41186a290000370300200241f0036a41106a200241d0156a41106a290000370300200241f0036a41086a200241d0156a41086a290000370300200220022900d0153703f003200241c4096a41026a200241b80e6a41026a2d00003a0000200220022f00b80e3b01c409410b216d0c080b200341ff0171450d0c200241003a00c0130c0c0b41002103200241003a00f01502400340200128020022062802042204450d01200241d0156a20036a200628020022052d00003a000020062004417f6a3602042006200541016a3602002002200341016a22033a00f01520034120470d000b200241ef156a310000210f200241d0156a410f6a290000211120022900e715210920022900d715211020022800d315210320022f00d115210520022d00d0152107200241d0156a200110ce0220022d00d0154106460d0c200241900f6a41086a200241d8046a41086a290000370300200241900f6a410f6a200241d8046a410f6a290000370000200241a40a6a41026a20024180066a41026a2d00003a0000200220022f01a00b3b01f80c200220022d00a20b3a00fa0c200220022900d8043703900f200220022f0080063b01a40a200241e4156a2902002113410c216d200241d0156a410c6a2902002112200241ec156a290200211520022902d415211720022802d0152104200241880a6a41106a200241f0106a41106a290200370300200241880a6a41086a200241f0106a41086a290200370300200220022902f0103703880a200241840a6a41026a200241c0056a41026a2d00003a0000200220022f00c0053b01840a200241e8096a41106a200241c0066a41106a290200370300200241e8096a41086a200241c0066a41086a290200370300200220022902c0063703e809200241e4096a41026a200241f00e6a41026a2d00003a0000200220022f00f00e3b01e409200241c8096a41106a20024188106a41106a290200370300200241c8096a41086a20024188106a41086a29020037030020022002290288103703c809200241f0036a41206a200241a0136a41206a280200360200200241f0036a41186a200241a0136a41186a290300370300200241f0036a41106a200241a0136a41106a290300370300200241f0036a41086a200241a0136a41086a290300370300200220022903a0133703f003200241c4096a41026a200241b80e6a41026a2d00003a0000200220022f00b80e3b01c4090c070b200341ff0171450d0b200241003a00f0150c0b0b41002103200241003a00f01502400340200128020022062802042204450d01200241d0156a20036a200628020022052d00003a000020062004417f6a3602042006200541016a3602002002200341016a22033a00f01520034120470d000b200241c80a6a410f6a2203200241d0156a410f6a290000370000200220022900d7153700cf0a200220022800d3153600cb0a200220022f00d1153b00c90a200220022d00d0153a00c80a200241ef156a310000210f20022900e7152109200241d0156a200110ce0220022d00d0154106460d0b200241900f6a41086a200241d8046a41086a290000370300200241900f6a410f6a200241d8046a410f6a290000370000200220022f01a00b3b01f80c200220022d00a20b3a00fa0c200220022900d8043703900f200241e4156a2902002113200241dc156a2902002112200241ec156a290200211520022902d415211720022802d01521042003290000211120022900cf0a211020022d00c80a210720022f00c90a210520022800cb0a2103200241a40a6a41026a20024180066a41026a2d00003a0000200220022f0080063b01a40a200241880a6a41106a200241f0106a41106a290200370300200241880a6a41086a200241f0106a41086a290200370300200220022902f0103703880a200241840a6a41026a200241c0056a41026a2d00003a0000200220022f00c0053b01840a200241e8096a41106a200241c0066a41106a290200370300200241e8096a41086a200241c0066a41086a290200370300200220022902c0063703e809200241e4096a41026a200241f00e6a41026a2d00003a0000200220022f00f00e3b01e409200241c8096a41106a20024188106a41106a290200370300200241c8096a41086a20024188106a41086a29020037030020022002290288103703c809200241f0036a41206a200241a0136a41206a280200360200200241f0036a41186a200241a0136a41186a290300370300200241f0036a41106a200241a0136a41106a290300370300200241f0036a41086a200241a0136a41086a290300370300200220022903a0133703f003200241c4096a41026a200241b80e6a41026a2d00003a0000200220022f00b80e3b01c409410d216d0c060b200341ff0171450d0a200241003a00f0150c0a0b41002103200241003a00c01302400340200128020022062802042204450d01200241a0136a20036a200628020022052d00003a000020062004417f6a3602042006200541016a3602002002200341016a22033a00c01320034120470d000b200241900f6a41086a200241d8046a41086a290000370300200241900f6a410f6a200241d8046a410f6a290000370000200241a40a6a41026a20024180066a41026a2d00003a0000200220022f00a00b3b01f80c200220022900d8043703900f200220022f0080063b01a40a2002200241a00b6a41026a2d00003a00fa0c200241bf136a310000210f200241a0136a410f6a290000211120022900b713210920022900a713211020022800a313210320022f00a113210520022d00a0132107200241880a6a41106a200241f0106a41106a290000370300200241880a6a41086a200241f0106a41086a290000370300200220022900f0103703880a200241840a6a41026a200241c0056a41026a2d00003a0000200220022f00c0053b01840a200241e8096a41106a200241c0066a41106a290000370300200241e8096a41086a200241c0066a41086a290000370300200220022900c0063703e809200241e4096a41026a200241f00e6a41026a2d00003a0000200220022f00f00e3b01e409200241c8096a41106a20024188106a41106a290000370300200241c8096a41086a20024188106a41086a29000037030020022002290088103703c809200241f0036a41206a200241d0156a41206a280000360200200241f0036a41186a200241d0156a41186a290000370300200241f0036a41106a200241d0156a41106a290000370300200241f0036a41086a200241d0156a41086a290000370300200220022900d0153703f003200241c4096a41026a200241b80e6a41026a2d00003a0000200220022f00b80e3b01c409410e216d0c050b200341ff0171450d09200241003a00c0130c090b410f216d0c030b20082011422086842108200241d8046a41206a2201200241d0156a41206a280200360200200241d8046a41186a2205200241d0156a41186a290300370300200241d8046a41106a2265200241d0156a41106a290300370300200241d8046a41086a22762075290300370300200241e00a6a41086a227520024188106a41086a290300370300200241e00a6a410f6a227720024188106a410f6a290000370000200220022903d0153703d804200220022f01f00e3b01980c200220022d00f20e3a009a0c20022002290388103703e00a200241800b6a41026a2278200241c0056a41026a2d00003a0000200220022f01c0053b01800b200241b80e6a41106a2279200241c0066a41106a290300370300200241b80e6a41086a227a200241c0066a41086a290300370300200220022903c0063703b80e200241c80a6a41026a222620024180066a41026a2d00003a0000200220022f0180063b01c80a200241800e6a41106a2227200241f0106a41106a290300370300200241800e6a41086a2223200241f0106a41086a290300370300200220022903f0103703800e200241a8066a41026a224820722d00003a0000200220022f01a00b3b01a806200241880d6a41106a22722074290300370300200241880d6a41086a22742073290300370300200220022903a0133703880d200241e8056a41026a2273200241e80d6a41026a2d00003a0000200220022f00e80d3b01e805200220022d009a0c3a00fa0c200220022f01980c3b01f80c200241900f6a410f6a2077290000370000200241900f6a41086a2075290300370300200220022903e00a3703900f200241a40a6a41026a20782d00003a0000200220022f01800b3b01a40a200241880a6a41106a2079290300370300200241880a6a41086a207a290300370300200220022903b80e3703880a200241840a6a41026a20262d00003a0000200220022f01c80a3b01840a200241e8096a41106a2027290300370300200241e8096a41086a2023290300370300200220022903800e3703e809200241e4096a41026a20482d00003a0000200220022f01a8063b01e409200241c8096a41106a2072290300370300200241c8096a41086a2074290300370300200220022903880d3703c809200241f0036a41206a2001280200360200200241f0036a41186a2005290300370300200241f0036a41106a2065290300370300200241f0036a41086a2076290300370300200220022903d8043703f003200241c4096a41026a20732d00003a0000200220022f01e8053b01c4092070ad4220862071ad422086206fad8422124220888421132007ad4220862006ad8421112012422086206ead8421120c020b200241a80a6a21060c050b200241900f6a41086a200241b80e6a41086a290000370300200241900f6a410f6a200241b80e6a410f6a290000370000200241a40a6a41026a200241880d6a41026a2d00003a0000200220022f01800e3b01f80c200220022d00820e3a00fa0c200220022900b80e3703900f200220022f00880d3b01a40a20024188106a41186a310000210f20024188106a41086a290300211120022903981021092002290388102110200241880a6a41106a200241d8046a41106a290200370300200241880a6a41086a200241d8046a41086a290200370300200220022902d8043703880a200241840a6a41026a200241e00a6a41026a2d00003a0000200220022f00e00a3b01840a200241e8096a41106a200241a00b6a41106a290200370300200241e8096a41086a200241a00b6a41086a290200370300200220022902a00b3703e809200241e4096a41026a200241a80a6a41026a2d00003a0000200220022f00a80a3b01e409200241c8096a41106a200241f00e6a41106a290200370300200241c8096a41086a200241f00e6a41086a290200370300200220022902f00e3703c809200241f0036a41206a200241d0156a41206a280200360200200241f0036a41186a200241d0156a41186a290300370300200241f0036a41106a200241d0156a41106a290300370300200241f0036a41086a200241d0156a41086a290300370300200220022903d0153703f003200241c4096a41026a200241fc0b6a41026a2d00003a0000200220022f00fc0b3b01c409410a216d0b200241d80e6a41086a2201200241900f6a41086a290300370300200241d80e6a410f6a2206200241900f6a410f6a290000370000200241b8096a41026a226e200241a40a6a41026a2d00003a0000200241a0096a41086a226f200241880a6a41086a290300370300200241a0096a41106a2270200241880a6a41106a290300370300200220022d00fa0c3a00c209200220022f01f80c3b01c009200220022903900f3703d80e200220022f01a40a3b01b809200220022903880a3703a0092002419c096a41026a2271200241840a6a41026a2d00003a000020024180096a41086a2272200241e8096a41086a29030037030020024180096a41106a2273200241e8096a41106a290300370300200241fc086a41026a2274200241e4096a41026a2d00003a0000200241e0086a41086a2275200241c8096a41086a290300370300200241e0086a41106a2265200241c8096a41106a290300370300200220022f01840a3b019c09200220022903e80937038009200220022f01e4093b01fc08200220022903c8093703e008200241a80d6a41206a2276200241f0036a41206a280200360200200241a80d6a41186a2277200241f0036a41186a290300370300200241a80d6a41106a2278200241f0036a41106a290300370300200241a80d6a41086a2279200241f0036a41086a290300370300200241dc086a41026a227a200241c4096a41026a2d00003a0000200220022903f0033703a80d200220022f01c4093b01dc08200041c0006a2013370200200041386a2012370200200041286a200f3c0000200041206a2009370200200041186a2011370200200041106a2010370200200041c8006a2015370200200041306a20173702002000412c6a20043602002000200b3b002a2000200a3a00292000410c6a2003360200200020053b000a200020073a0009200041086a206d3a000020004110360200200041df006a20084220883c0000200041db006a20083e0000200041d3006a2014370000200041ec006a20193a0000200041e8006a200c360200200041e4006a200e3602002000201b3a00632000201a3b0061200041e0006a200d3a0000200041d0006a20022f01c0093b0100200041d2006a20022d00c2093a0000200041fc006a2006290000370000200041f5006a2001290300370000200020022903d80e37006d20004184016a20183a000020004187016a206e2d00003a0000200020022f01b8093b0085012000418c016a202036020020004188016a2021360200200041a0016a207029030037020020004198016a206f29030037020020004190016a20022903a009370200200041a8016a20283a0000200041ab016a20712d00003a0000200020022f019c093b00a901200041b0016a2029360200200041ac016a2022360200200041c4016a2073290300370200200041bc016a2072290300370200200041b4016a200229038009370200200041cc016a206a3a0000200041cf016a20742d00003a0000200020022f01fc083b00cd01200041d4016a206b360200200041d0016a206c360200200041e8016a2065290300370200200041e0016a2075290300370200200041d8016a20022903e00837020020004190026a207628020036020020004188026a207729030037020020004180026a2078290300370200200041f8016a2079290300370200200041f0016a20022903a80d370200200020693600a502200020683600a1022000206736009d02200020163700950220004194026a20663a0000200041ab026a207a2d00003a0000200020022f01dc083b00a9020c210b200241c0066a411f6a200241f0106a411f6a280000360000200241c0066a41186a200241f0106a41186a290300370300200241f00e6a2106200a450d00200a41c4006c210320022802f00e41286a210103400240200141786a2d00004101470d002001280200450d002001417c6a28020010260b200141c4006a2101200341bc7f6a22030d000b0b200641046a2802002201450d02200141c4006c450d02200628020010260c020b200241a80a6a21062004450d0020022802a80a2201200441c8006c6a21030340024020012d00004101470d00200141086a280200450d00200141046a28020010260b0240200141246a2d00004101470d002001412c6a280200450d00200141286a28020010260b200141c8006a22012003470d000b0b200641046a2802002201450d00200141c8006c450d00200628020010260b200041173602000c1c0b0240200128020022032802042204450d00200328020022052d0000210620032004417f6a3602042003200541016a360200200641014b0d00024002400240024020060e020001000b200241e8026a2001108d0120022802e8020d0320022802ec022204200128020028020441b0026e2203200320044b1bad42b0027e2208422088a70d072008a72203417f4c0d070240024020030d00410821050c010b200310242205450d090b2001200128020441016a2206360204200241003602901020022005360288102002200341b0026e36028c10024002400240200620012802084b0d0002402004450d00200241d0156a410472210b410021030340200241d0156a200110b40220022802d0152106200241f0106a200b41ac0210cf061a20064117460d03200241a0136a200241f0106a41ac0210cf061a02402003200228028c10470d0020024188106a2003410110c501200228028810210520022802901021030b2005200341b0026c6a22072006360200200741046a200241a0136a41ac0210cf061a2002200341016a2203360290102004417f6a22040d000b200128020421060b20012006417f6a3602042005450d06200229028c102108410121010c040b20024188106a21060c010b20024188106a21062003450d002002280288102101200341b0026c21030340200110d501200141b0026a2101200341d07d6a22030d000b0b200641046a2802002201450d03200141b0026c450d03200628020010260c030b2001280200220328020422064102490d02200328020022042f0000210720032006417e6a3602042003200441026a3602002001200128020441016a2203360204200320012802084b0d02200241d0156a200110b40220022802d0152103200241f0106a200241d0156a41047241ac0210cf061a20034117460d02200241d0156a200241f0106a41ac0210cf061a41b00210242205450d0120052003360200200541046a200241d0156a41ac0210cf061a20012001280204417f6a360204410221010b200020013b01042000410f3602002000410c6a2008370200200041086a2005360200200041066a20073b0100200041146a200241c0066a419c0210cf061a0c1d0b102c000b200041173602000c1b0b0240200128020022032802042204450d00200328020022052d0000210620032004417f6a3602042003200541016a36020041062104200641064b0d00024002400240024002400240024002400240024002400240024020060e0700010203040805000b200241b8026a2001108d0120022802b8020d0c200128020022032802042204450d0c20022802bc022105200328020022072d0000210620032004417f6a3602042003200741016a360200200641014b0d0c4100210b0240024020060e020100010b4101210b0b200241b0026a2001108d01410021030240024020022802b002450d000c010b20012802002204280204220720022802b4022206490d002006417f4c0d100240024020060d004100210a410121030c010b2006102a2203450d122001280200220428020421072006210a0b024020072006490d0020032004280200200610cf061a200428020422072006490d0a2006ad422086200aad8421082004200720066b3602042004200428020020066a3602000c010b0240200a450d00200310260b410021030b2003450d0c2008a72106200241a8026a2001108d01024020022802a8020d00024002402001280200220a280204220d20022802ac0222074f0d0041002104420021094200210f0c010b2007417f4c0d110240024020070d0041002101410121040c010b2007102a2204450d132001280200220a280204210d200721010b0240200d2007490d002004200a280200200710cf061a200a280204220d2007490d0c2007ad4220862001ad842109200a200d20076b360204200a200a28020020076a3602004200210f0c010b02402001450d00200410260b420021094200210f410021040b2004450d002009420020041b2109200f420020041b210f2008422088420020031b2004ad4220868421132006ad4220862003ad842108410121040c080b2006450d0c200310260c0c0b200241c0026a2001108d0120022802c0020d0b20022802c4022105410221040c040b2001280200220128020422034104490d0a20012802002206280000210520012003417c6a3602042001200641046a360200410321040c030b200241d0026a2001108d0120022802d0020d0920012802002206280204220420022802d4022203490d092003417f4c0d0c0240024020030d0041002107410121050c010b2003102a2205450d0e200128020022062802042104200321070b0240024020042003490d0020052006280200200310cf0621042006280204220b20034f0d012003200b41b8afc0001048000b20070d090c0a0b2006200b20036b3602042006200628020020036a3602002004450d092003ad4220862007ad842108200241c8026a2001108d0120022802c8020d0720012802002206280204220420022802cc022203490d072003417f4c0d0c0240024020030d0041002101410121070c010b2003102a2207450d0e200128020022062802042104200321010b0240024020042003490d0020072006280200200310cf0621042006280204220720034f0d012003200741b8afc0001048000b2001450d08200710260c080b2006200720036b3602042006200628020020036a3602002004450d072003ad4220862001ad84220f4220882109200f4220862004ad8421134200210f410421040c030b200241d8026a2001108d0120022802d8020d0820022802dc02210741002103200241003a00c013024002400340200128020022062802042204450d01200241a0136a20036a200628020022052d00003a000020062004417f6a3602042006200541016a3602002002200341016a22033a00c01320034120470d000b200241800b6a410f6a200241a0136a410f6a290000370000200220022900a7133700870b200220022800a3133600830b200220022f00a1133b00810b200220022d00a0133a00800b200241bf136a310000210f20022900b713210941002103200241003a00c0130340200128020022062802042204450d02200241a0136a20036a200628020022052d00003a000020062004417f6a3602042006200541016a3602002002200341016a22033a00c01320034120470d000b200241f0106a41186a200241a0136a41186a2903002208370300200241e00a6a41086a200241a0136a41086a290300370300200241e00a6a41106a200241a0136a41106a290300370300200241e00a6a41186a2008370300200220022903a0133703e00a2002418f0b6a290000211320022900870b210820022800830b210520022f00810b210e20022d00800b210b20022f01e00a20022d00e20a411074722103200241fb0a6a3100002111200241eb0a6a290000211220022900f30a211020022900e30a211720022d00ff0a210a20022f00fd0a210d20022d00fc0a210c410521040c050b200341ff0171450d09200241003a00c0130c090b200341ff0171450d08200241003a00c0130c080b200241e0026a2001108d0120022802e0020d0720022802e4022105410721040b0b0b200020033b00252000200d3b00422000200c3a00412000200e3b01062000200b3a0005200020043a00042000410e360200200041276a20034110763a0000200041c0006a20113c0000200041386a2010370000200041306a2012370000200041286a2017370000200041246a200f3c00002000411c6a2009370200200041146a20133702002000410c6a2008370200200041c8006a2007360200200041c4006a200a3a0000200041086a2005360200200041cc006a200241d0156a41e40110cf061a0c1f0b2006200741b8afc0001048000b2007200d41b8afc0001048000b2008a7450d010b200510260b200041173602000c1a0b0240200128020022012802042203450d00200128020022062d0000210420012003417f6a3602042001200641016a36020020040d002000410d360200200041046a200241d0156a41ac0210cf061a0c1a0b200041173602000c190b2001280200220328020422064104490d0b20032802002204280000212020032006417c6a3602042003200441046a360200200241a0026a2001108d0120022802a0020d0b20012802002206280204220420022802a4022203490d0b2003417f4c0d000240024020030d0041002101410121050c010b2003102a2205450d02200128020022062802042104200321010b0240024020042003490d0020052006280200200310cf0621042006280204220520034f0d012003200541b8afc0001048000b2001450d0c200510260c0c0b2006200520036b3602042006200628020020036a3602002004450d0b200241a8066a41086a20024188106a41086a290000370300200241a8066a410f6a20024188106a410f6a290000370000200241840a6a41026a200241f0036a41026a2d00003a0000200241880a6a41086a200241a0136a41086a290200370300200241880a6a41106a200241a0136a41106a290200370300200220022d00da043a00a60a200220022f01d8043b01a40a20022002290088103703a806200220022f00f0033b01840a200220022902a0133703880a200241e4096a41026a200241a80d6a41026a2d00003a0000200241e8096a41086a200241f0106a41086a290200370300200241e8096a41106a200241f0106a41106a290200370300200241c4096a41026a200241a00b6a41026a2d00003a0000200241c8096a41086a200241c0066a41086a290200370300200241c8096a41106a200241c0066a41106a290200370300200220022f00a80d3b01e409200220022902f0103703e809200220022f00a00b3b01c409200220022902c0063703c80920024180066a41206a200241d0156a41206a28020036020020024180066a41186a200241d0156a41186a29020037030020024180066a41106a200241d0156a41106a29020037030020024180066a41086a200241d0156a41086a290200370300200241c0096a41026a200241f00e6a41026a2d00003a0000200220022902d01537038006200220022f00f00e3b01c0092003ad4220862001ad842208422088211120084220862004ad84211342002114410421010c060b1034000b1033000b2001280200220328020422064104490d0820032802002204280000210b20032006417c6a3602042003200441046a3602002001280200220328020422064110490d082003280200220441086a290000210f200429000021102003200441106a3602002003200641706a36020441002103200241003a00c01302400340200128020022062802042204450d01200241a0136a20036a200628020022052d00003a000020062004417f6a3602042006200541016a3602002002200341016a22033a00c01320034120470d000b200241c0066a41086a2201200241a0136a410f6a290000370300200241c0066a41106a2203200241b7136a290000370300200241c0066a41186a2206200241bf136a2d00003a0000200220022900a71322083703f010200220083703c00620022d00a013217020022f00a113216f20022800a313212020024188106a41186a220420062d00003a000020024188106a41106a2206200329030037030020024188106a41086a22032001290300370300200220022903c00637038810200631000021142003290300211120042d00002104200228029c10210520022f019a10216d20022d009910216e2002290388102113200220022d00820e3a00a60a200220022f01800e3b01a40a200241a8066a410f6a200241b80e6a410f6a290000370000200241a8066a41086a200241b80e6a41086a290000370300200220022900b80e3703a806200241840a6a41026a200241880d6a41026a2d00003a0000200220022f00880d3b01840a200241880a6a41106a200241d8046a41106a290200370300200241880a6a41086a200241d8046a41086a290200370300200220022902d8043703880a200241e4096a41026a200241e00a6a41026a2d00003a0000200220022f00e00a3b01e409200241e8096a41106a200241a00b6a41106a290200370300200241e8096a41086a200241a00b6a41086a290200370300200220022902a00b3703e809200241c4096a41026a200241a80a6a41026a2d00003a0000200220022f00a80a3b01c409200241c8096a41106a200241f00e6a41106a290200370300200241c8096a41086a200241f00e6a41086a290200370300200220022902f00e3703c80920024180066a41206a200241d0156a41206a28020036020020024180066a41186a200241d0156a41186a29030037030020024180066a41106a200241d0156a41106a29030037030020024180066a41086a200241d0156a41086a290300370300200220022903d01537038006200241c0096a41026a200241fc0b6a41026a2d00003a0000200220022f00fc0b3b01c009410321010c050b200341ff0171450d08200241003a00c0130c080b41002103200241003a00f0150240024002400340200128020022062802042204450d01200241d0156a20036a200628020022052d00003a000020062004417f6a3602042006200541016a3602002002200341016a22033a00f01520034120470d000b200241d0156a410f6a2900002108200241ef156a310000211020022900d715210920022800d315216d20022f00d115216e20022d00d015216f20022900e715210f200241d0156a200110e00520022d00d01522074103460d0a200241b80e6a410f6a200241d0156a41106a290000370000200241b80e6a41086a200241d9156a290000370300200241fc0b6a41026a200241eb156a22032d00003a0000200241d8046a41086a200241fc156a290200370300200241d8046a41106a20024184166a290200370300200220022900d1153703b80e2002200241e9156a2f00003b01fc0b2002200241f4156a2902003703d804200241d0156a41186a2d0000211a200241ec156a2802002119200241d0156a41206a2802002118200241e00b6a41026a2002418f166a2d00003a0000200241f0036a41086a200241a0166a2206290300370300200241f0036a41106a200241a8166a220429030037030020022002418d166a2f00003b01e00b200220024198166a22052903003703f0032002418c166a2d0000210e20024190166a280200210c20024194166a280200210d200241b0166a2d0000210a200241d0156a200110e00520022d00d0154103460d0a200241e00a6a41026a20022d00d2153a000020024188106a41086a200241e3156a29000037030020024188106a41106a2003290000370300200241a0136a41086a200241fb156a290000370300200241a0136a41106a20024183166a290000370300200241a0136a41186a2002418b166a290000370300200241a0136a41206a20024193166a280000360200200220022f01d0153b01e00a2002200241db156a290000370388102002200241f3156a2900003703a01320022800d315212120022800d715211b200241a80a6a41026a200241ae166a2d00003a00002002200241ac166a2f01003b01a80a20042802002122200241a4166a2802002129200628020021282005290300211720024197166a2d00002166200241af166a2f00002167200241d0156a200110df0520022802d4152270450d0a200241dc156a290200211120022802d81521712001280200220328020422064104490d02200f422888201042188684a7216a200f420888a7216b2008423088a721682008422888a7216c200fa7216920022802d015212020032802002204280000217220032006417c6a3602042003200441046a36020041002103200241003a00f0150340200128020022062802042204450d02200241d0156a20036a200628020022052d00003a000020062004417f6a3602042006200541016a3602002002200341016a22033a00f01520034120470d000b200241c0066a410f6a200241d0156a410f6a290000370000200241c0066a411f6a200241d0156a411f6a3100003c0000200220022900e7153700d706200220022900d7153700c706200220022800d3153600c306200220022f00d1153b00c106200220022d00d0153a00c006200241d4066a290200210f20022802c806210b20022f01c606210320022d00c506210620022d00c406210420022802c006210520022902cc06211020022802dc0621732002206d36008f0d2002206e3b008d0d2002206f3a008c0d200241800e6a410f6a226f200241b80e6a410f6a290000370000200241800e6a41086a2274200241b80e6a41086a290300370300200220022903b80e3703800e41022101200241900f6a41026a2275200241fc0b6a41026a2d00003a0000200220022f01fc0b3b01900f200241a80d6a41106a2265200241d8046a41106a290300370300200241a80d6a41086a2276200241d8046a41086a290300370300200220022903d8043703a80d200241d80e6a41026a2277200241e00b6a41026a2d00003a0000200220022f01e00b3b01d80e200241a00b6a41106a2278200241f0036a41106a290300370300200241a00b6a41086a2279200241f0036a41086a290300370300200220022903f0033703a00b200241a00e6a41026a227a200241e00a6a41026a2d00003a0000200220022f01e00a3b01a00e200241f00e6a41106a222620024188106a41106a290300370300200241f00e6a41086a222720024188106a41086a29030037030020022002290388103703f00e200241f0106a41206a2223200241a0136a41206a280200360200200241f0106a41186a2248200241a0136a41186a290300370300200241f0106a41106a222b200241a0136a41106a290300370300200241f0106a41086a2224200241a0136a41086a290300370300200220022903a0133703f010200241e80d6a41026a2238200241a80a6a41026a2d00003a0000200220022f01a80a3b01e80d200220733602880d20022903880d21122002200241920d6a2d00003a00c60b200220022f01900d3b01c40b20074103460d0a2072411076216d2072410876216e2071ad4220862070ad8421132072ad2114200241a8066a41086a2074290300370300200241a8066a410f6a206f290000370000200241840a6a41026a20752d00003a0000200241880a6a41086a2076290300370300200241880a6a41106a2065290300370300200220022d00c60b3a00a60a200220022f01c40b3b01a40a200220022903800e3703a806200220022f01900f3b01840a200220022903a80d3703880a200241e4096a41026a20772d00003a0000200241e8096a41106a2078290300370300200241e8096a41086a2079290300370300200241c4096a41026a207a2d00003a0000200241c8096a41106a2026290300370300200241c8096a41086a2027290300370300200220022f01d80e3b01e409200220022903a00b3703e809200220022f01a00e3b01c409200220022903f00e3703c80920024180066a41206a202328020036020020024180066a41186a204829030037030020024180066a41106a202b29030037030020024180066a41086a2024290300370300200220022903f01037038006200241c0096a41026a20382d00003a0000200220022f01e80d3b01c0090c060b200341ff0171450d09200241003a00f0150c090b200341ff0171450d00200241003a00f0150b02402011a72201450d002001410c6c21032070210103400240200141046a280200450d00200128020010260b2001410c6a2101200341746a22030d000b0b2071450d072071410c6c450d07207010260c070b20012006417f6a3602042020450d060b20022902fc0c2113200241a8066a41086a200241980c6a41086a290000370300200241a8066a410f6a200241980c6a410f6a290000370000200241840a6a41026a200241950c6a41026a2d00003a0000200241880a6a41086a200241fc0b6a41086a290200370300200241880a6a41106a200241fc0b6a41106a290200370300200220022d00b20c3a00a60a200220022f01b00c3b01a40a200220022900980c3703a806200220022f00950c3b01840a200220022902fc0b3703880a200241e4096a41026a200241f90b6a41026a2d00003a0000200241e8096a41086a200241e00b6a41086a290200370300200241e8096a41106a200241e00b6a41106a290200370300200241c4096a41026a200241dd0b6a41026a2d00003a0000200241c8096a41086a200241c40b6a41086a290200370300200241c8096a41106a200241c40b6a41106a290200370300200220022f00f90b3b01e409200220022902e00b3703e809200220022f00dd0b3b01c409200220022902c40b3703c80920024180066a41206a200241a00b6a41206a28020036020020024180066a41186a200241a00b6a41186a29030037030020024180066a41106a200241a00b6a41106a29030037030020024180066a41086a200241a00b6a41086a290300370300200241c0096a41026a2002419d0b6a41026a2d00003a0000200220022903a00b37038006200220022f009d0b3b01c009410121010b0b200241e8056a41086a2271200241a8066a41086a290300370300200241e8056a410f6a2272200241a8066a410f6a2900003700002002419c096a41026a2273200241840a6a41026a2d00003a0000200241a0096a41086a2274200241880a6a41086a290300370300200241a0096a41106a2275200241880a6a41106a290300370300200220022d00a60a3a00ba09200220022f01a40a3b01b809200220022903a8063703e805200220022f01840a3b019c09200220022903880a3703a009200241fc086a41026a2265200241e4096a41026a2d00003a000020024180096a41086a2276200241e8096a41086a29030037030020024180096a41106a2277200241e8096a41106a290300370300200241dc086a41026a2278200241c4096a41026a2d00003a0000200241e0086a41086a2279200241c8096a41086a290300370300200241e0086a41106a227a200241c8096a41106a290300370300200220022f01e4093b01fc08200220022903e80937038009200220022f01c4093b01dc08200220022903c8093703e008200241c0056a41206a222620024180066a41206a280200360200200241c0056a41186a222720024180066a41186a290300370300200241c0056a41106a222320024180066a41106a290300370300200241c0056a41086a224820024180066a41086a290300370300200241bc056a41026a222b200241c0096a41026a2d00003a000020022002290380063703c005200220022f01c0093b01bc05200041386a200f370200200041306a2010370200200041206a20143c0000200041186a2011370200200041c0006a20123702002000412c6a200b3602002000412a6a20033b0100200020063a0029200041286a20043a0000200041246a20053602002000206d3b00222000206e3a0021200041106a20133702002000410c6a20203602002000206f3b000a200020703a0009200041086a20013a00002000410c360200200041d7006a20084220883c0000200041d3006a20083e0000200041dc006a206b360200200041e0006a206a360200200041cb006a2009370000200041e4006a20073a0000200020693a005b200020683b0059200041d8006a206c3a0000200041c8006a20022f01b8093b0100200041ca006a20022d00ba093a0000200020022903e805370065200041ed006a2071290300370000200041f4006a2072290000370000200041fc006a201a3a0000200041ff006a20732d00003a0000200020022f019c093b007d20004184016a201836020020004180016a201936020020004198016a207529030037020020004190016a207429030037020020004188016a20022903a009370200200041a0016a200e3a0000200041a3016a20652d00003a0000200020022f01fc083b00a101200041a8016a200d360200200041a4016a200c360200200041bc016a2077290300370200200041b4016a2076290300370200200041ac016a200229038009370200200041c4016a200a3a0000200041c7016a20782d00003a0000200020022f01dc083b00c501200041cc016a201b360200200041c8016a2021360200200041e0016a207a290300370200200041d8016a2079290300370200200041d0016a20022903e00837020020004188026a202628020036020020004180026a2027290300370200200041f8016a2023290300370200200041f0016a2048290300370200200041e8016a20022903c0053702002000202236009d02200020293600990220002028360095022000201737008d022000418c026a20663a0000200041a3026a202b2d00003a0000200020022f01bc053b00a102200041a4026a20673602000c100b200241f80c6a210520022802800d2201450d0120022802f80c220620014198026c6a210403400240200641d8006a280200450d00200628025410260b0240200641186a2802002203450d00200628021021012003410474210303400240200141046a280200450d00200128020010260b200141106a2101200341706a22030d000b0b0240200641146a28020041ffffffff0071450d00200628021010260b0240200628021c2201450d00200641206a280200450d00200110260b024020064184026a2802002201450d00200141c1006c450d0020062802800210260b20064198026a210120064190026a4100360200200628028c0221032006410136028c02024020064194026a280200450d00200310260b2001210620012004470d000c020b0b200241f80c6a21050b200541046a2802002201450d0020014198026c450d00200528020010260b200041173602000c0c0b2004450d00201828020021012004410c6c210303400240200141046a280200450d00200128020010260b2001410c6a2101200341746a22030d000b0b201841046a2802002201450d002001410c6c450d00201828020010260b2009a7450d00200b10260b200041173602000c080b200041173602000c070b4100210741002106410021010b200020073b0126200020013a0025200020043b0006200020053a00052000200a3a000420004103360200200041226a20084230883c0000200041206a20084220883d01002000411c6a20083e0200200041146a20093702002000410c6a200f370200200041286a2006360200200041236a200b3b0000200041086a20033602002000412c6a200241d0156a41840210cf061a0c050b200041173602000c040b200041173602000c030b2005450d00200a2802002101200541186c210303400240200141046a280200450d00200128020010260b0240200141106a280200450d002001410c6a28020010260b200141186a2101200341686a22030d000b0b200a41046a2802002201450d00200141186c450d00200a28020010260b200041173602000b20024180186a24000b900101027f230041e0046b22012400200141b0026a200010b60220012802b0022102200141046a200141b0026a41047241ac0210cf061a02400240024020024117460d00200141b0026a200141046a41ac0210cf061a41b00210242200450d0120002002360200200041046a200141b0026a41ac0210cf061a0c020b410021000c010b102c000b200141e0046a240020000b82da0207087f027e037f097e207f037e037f230041d0146b220224000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012802042203450d00200128020022042d0000210520012003417f6a22063602042001200441016a360200200541164b0d18200141046a210720050e170102030405060708090a0b0c0d0e0f1011121314151617010b200041173602000c450b2006450d4320042d0001210520012003417e6a22083602042001200441026a360200200541094b0d43410a21090240024002400240024002400240024002400240024020050e0a00010203040506070809000b20084104490d4d2004280002210620012003417a6a3602042001200441066a3602002006418194ebdc034f0d4d410121090c080b200241086a2001108f0120022802080d4c20072802002203200228020c2204490d4c2004417f4c0d230240024020040d0041002105410121060c010b2004102a2206450d2a20072802002103200421050b0240024020032004490d0020062001280200200410cf0621032001280204220720044f0d012004200741b8afc0001048000b20050d4c0c4d0b2001200720046b3602042001200128020020046a3602002003450d4c2004ad4220862005ad84210a410221090c070b20084108490d4b2004290002210a2001200341766a36020420012004410a6a360200410321090c060b200241106a2001108f0120022802100d4a2007280200220320022802142204490d4a2004417f4c0d210240024020040d0041002105410121060c010b2004102a2206450d2820072802002103200421050b0240024020032004490d0020062001280200200410cf0621032001280204220720044f0d012004200741b8afc0001048000b20050d4a0c4b0b2001200720046b3602042001200128020020046a3602002003450d4a2004ad4220862005ad84210a410421090c050b200241186a2001108f0120022802180d4920072802002203200228021c2204490d492004417f4c0d200240024020040d0041002105410121060c010b2004102a2206450d2720072802002103200421050b0240024020032004490d0020062001280200200410cf0621032001280204220720044f0d012004200741b8afc0001048000b20050d490c4a0b2001200720046b3602042001200128020020046a3602002003450d492004ad4220862005ad84210a410521090c040b2008450d4820042d0002210520012003417d6a22073602042001200441036a360200200541014b0d484106210941002106024020050e020400040b20074104490d482004350003210a2001200341796a22053602042001200441076a36020020054104490d482004350007210b2001200341756a36020420012004410b6a360200200a200b42208684210a410121060c030b200241306a2001108f0120022802300d4720022802342205200728020041186e2204200420054b1bad42187e220a422088a70d1e200aa72204417f4c0d1e0240024020040d00410421060c010b200410242206450d250b41002103200241003602f80f200220063602f00f2002200441186e3602f40f02402005450d000340200241286a2001108f0120022802280d472007280200220c200228022c2204490d472004417f4c0d200240024020040d0041002108410121090c010b2004102a2209450d272007280200210c200421080b02400240200c2004490d0020092001280200200410cf06210c2001280204220920044f0d012004200941b8afc0001048000b2008450d48200910260c480b2001200920046b3602042001200128020020046a360200200c450d472004ad4220862008ad84210a200241206a2001108f010240024020022802200d002007280200220920022802242204490d002004417f4c0d220240024020040d004100210d410121080c010b2004102a2208450d29200728020021092004210d0b0240024020092004490d0020082001280200200410cf0621092001280204220820044f0d012004200841b8afc0001048000b200d450d01200810260c010b2001200820046b3602042001200128020020046a36020020090d010b200aa7450d48200c10260c480b2004ad422086200dad84210b0240200320022802f40f470d00200241f00f6a2003410110f00120022802f00f210620022802f80f21030b2006200341186c6a2204200936020c2004200a3702042004200c360200200441106a200b3702002002200341016a22033602f80f2005417f6a22050d000b0b2006450d4720022902f40f210a410721090c020b200241f00f6a200110e10120022802f00f2206450d4620022902f40f210a410821090c010b200241386a2001108f0120022802380d4520072802002203200228023c2204490d452004417f4c0d1c0240024020040d0041002105410121060c010b2004102a2206450d2320072802002103200421050b0240024020032004490d0020062001280200200410cf0621032001280204220c20044f0d012004200c41b8afc0001048000b20050d450c460b2001200c20046b3602042001200128020020046a3602002003450d452004ad4220862005ad84210a200728020022044104490d0120012802002203280000210c20012004417c6a3602042001200341046a360200410921090b20004100360200200041186a200c360200200041106a200a3702002000410c6a2006360200200041086a2009360200200041206a200241a0126a41900210cf061a0c450b200aa7450d430c420b02402006450d0020042d0001210520012003417e6a3602042001200441026a360200200541014b0d000240024002400240024020050e020001000b200241a0126a200110e405200241ac126a2802002205450d04200241a8086a41086a2203200241a0126a41086a280200360200200220022903a0123703a808200241b0126a22082802002106200241b4126a280200210420024188056a200241b8126a41e40010cf061a200241a4136a280200210c200241a0126a4180016a28020021072002419c136a2802002109200241f00f6a200241a8136a41800110cf061a200241a0126a200110de05024020022802a412450d00200241a00d6a41086a2003280200360200200220022903a8083703a00d20082802002101200241ac126a280200210320022802a812210820022903a012210a200241a0046a20024188056a41e40010cf061a200241c00d6a200241f00f6a41800110cf061a4101210d0c020b02402004450d00200441246c21042005210103400240024020012d0000220341044b0d0002400240024020030e050400010204040b2001410c6a280200450d03200141086a28020010260c030b2001410c6a280200450d02200141086a28020010260c020b2001410c6a280200450d01200141086a28020010260c010b200141086a280200450d00200141046a28020010260b200141246a21012004415c6a22040d000b0b02402006450d00200641246c450d00200510260b0240200c450d00200c41246c21042009210103400240024020012d0000220341044b0d0002400240024020030e050400010204040b2001410c6a280200450d03200141086a28020010260c030b2001410c6a280200450d02200141086a28020010260c020b2001410c6a280200450d01200141086a28020010260c010b200141086a280200450d00200141046a28020010260b200141246a21012004415c6a22040d000b0b2007450d04200741246c0d030c040b200241a0126a200110e405200241ac126a2802002205450d03200241a8086a41086a2203200241a0126a41086a280200360200200220022903a0123703a808200241b0126a22082802002106200241b4126a280200210420024188056a200241b8126a41e40010cf061a200241a4136a280200210c200241a0126a4180016a28020021072002419c136a2802002109200241f00f6a200241a8136a41800110cf061a200241a0126a200110de0520022802a412450d01200241a00d6a41086a2003280200360200200220022903a8083703a00d20082802002101200241ac126a280200210320022802a812210820022903a012210a200241a0046a20024188056a41e40010cf061a200241c00d6a200241f00f6a41800110cf061a4102210d0b200241800d6a41086a220e200241a00d6a41086a280200360200200220022903a00d3703800d200241b8036a200241a0046a41e40010cf061a20024188066a200241c00d6a41800110cf061a2000411c6a2001360200200041186a2003360200200041146a20083602002000410c6a200a370200200041086a200d36020020004101360200200041206a20022903800d370200200041286a200e280200360200200041346a2004360200200041306a20063602002000412c6a2005360200200041386a200241b8036a41e40010cf061a200041a4016a200c360200200041a0016a20073602002000419c016a2009360200200041a8016a20024188066a41800110cf061a0c460b02402004450d00200441246c21042005210103400240024020012d0000220341044b0d0002400240024020030e050400010204040b2001410c6a280200450d03200141086a28020010260c030b2001410c6a280200450d02200141086a28020010260c020b2001410c6a280200450d01200141086a28020010260c010b200141086a280200450d00200141046a28020010260b200141246a21012004415c6a22040d000b0b02402006450d00200641246c450d00200510260b0240200c450d00200c41246c21042009210103400240024020012d0000220341044b0d0002400240024020030e050400010204040b2001410c6a280200450d03200141086a28020010260c030b2001410c6a280200450d02200141086a28020010260c020b2001410c6a280200450d01200141086a28020010260c010b200141086a280200450d00200141046a28020010260b200141246a21012004415c6a22040d000b0b2007450d01200741246c450d010b200910260b200041173602000c430b2006450d3e20042d0001210520012003417e6a22063602042001200441026a36020020050d3e2006450d3e20042d0002210520012003417d6a22073602042001200441036a360200024002400240200541037122064103460d000240024020060e03030001030b2007450d4220042d0003210620012003417c6a3602042001200441046a3602002006410874200572220141ffff0371418002490d42200141fcff0371410276ad210a0c030b20074103490d41200441056a2d0000210620042f0003210720012003417a6a3602042001200441066a3602002007200641107472410874200572220141808004490d412001410276ad210a0c020b02402005410276220c41044b0d0002400240200c0e050002020201000b20074104490d42200428000321052001200341796a3602042001200441076a3602002005418080808004490d422005ad210a0c030b20074108490d412004290003210a2001200341756a36020420012004410b6a360200200a42ffffffffffffffff00560d020c410b200541134b0d40200c41046a21062003417c6a2103200441046a2104410021054200210a03402003417f460d412004417f6a310000210b20012003360204200120043602002003417f6a2103200441016a2104200b2005410374413871ad86200a84210a200541016a220541ff01712006490d000b200a427f4128200c4103746b413871ad88580d400c010b2005410276ad210a0b20004102360200200041086a200a370300200041106a200241a0126a41a00210cf061a0c420b2006450d3c20042d0001210520012003417e6a22063602042001200441026a360200200541044b0d3c0240024002400240024020050e050001020304000b20064104490d402004280002210520012003417a6a3602042001200441066a36020020023502d00d200241d40d6a330100200241d60d6a3100004210868442208684210a20022f00d70d210320022d00d90d210120022f01da0d210620022802dc0d2104410121090c3f0b41002105200241003a0090102003417e6a210c417d210702400340200c2005460d01200241f00f6a20056a200420056a220641026a2d00003a00002001200320076a3602042001200641036a3602002002200541016a22063a0090102007417f6a21072006210520064120470d000b200641ff01714120490d40200320066b2208417e6a4104490d40200229008710220a4238882002418f106a31000042088684a72103200241ff0f6a290000210f20022900f70f210b20022800f30f210520022f00f10f210720022d00f00f210c41022109200420066a220641026a280000210420012008417a6a3602042001200641066a3602000c3f0b200541ff0171450d3f200241003a0090100c3f0b20064104490d3e2004280002210520012003417a6a3602042001200441066a36020020023502b00d200241b40d6a330100200241b60d6a3100004210868442208684210a41032109410021060c3c0b41002105200241003a0090102003417e6a210c417d21070240024002400340200c2005460d01200241f00f6a20056a200420056a220641026a2d00003a00002001200320076a3602042001200641036a3602002002200541016a22063a0090102007417f6a21072006210520064120470d000b200641ff01714120490d40200320066b2209417e6a4104490d40200229008710210a2002418f106a3100002110200241ff0f6a290000210f20022900f70f210b20022800f30f210520022f00f10f210720022d00f00f210c200420066a220841026a280000210420012009417a6a3602042001200841066a220d3602002003417a6a2006460d40200d2d000021032001200941796a3602042001200841076a360200200341014b0d40200a42388820104208868421104100210120030e020201020b200541ff0171450d3f200241003a0090100c3f0b410121010b2010a72103410421090c3c0b20064104490d3c2004280002210520012003417a6a3602042001200441066a36020020023502e80b200241ec0b6a330100200241ee0b6a3100004210868442208684210a4105210941002103410021060c3a0b02402006450d0020042d0001210520012003417e6a3602042001200441026a360200200541034b0d00024002400240024020050e0400010203000b41002105200241003a0090102003417e6a21072003417d6a21030240034020072005460d01200241f00f6a20056a200420056a220641026a2d00003a0000200120033602042001200641036a3602002002200541016a22063a0090102003417f6a21032006210520064120470d000b200641ff01714120490d042002418f106a310000210b200241ff0f6a290000210f200229008710211020022900f70f210a20022800f30f210920022f00f10f210820022d00f00f210d200241c0006a200110b3052002290340a70d04200241d0006a290300211120022903482112200241d80d6a290300211320022903d00d2114410121010c3d0b200541ff0171450d03200241003a0090100c030b41002105200241003a0090102003417e6a21072003417d6a21030240034020072005460d01200241f00f6a20056a200420056a220641026a2d00003a0000200120033602042001200641036a3602002002200541016a22063a0090102003417f6a21032006210520064120470d000b200641ff01714120490d032002418f106a310000210b200241ff0f6a290000210f200229008710211020022900f70f210a20022800f30f210920022f00f10f210820022d00f00f210d200241f0006a200110b3052002290370a70d03200241f0006a41106a290300211120022903782112200241d8006a200110b3052002290358a70d03200241d8006a41106a290300211520022903602116410221010c3c0b200541ff0171450d02200241003a0090100c020b41002105200241003a009010410220036b210c2003417d6a2106024002400340200c20056a450d01200241f00f6a20056a200420056a220741026a2d00003a0000200120063602042001200741036a3602002002200541016a22073a0090102006417f6a21062007210520074120470d000b200741ff01714120490d032002418f106a310000210b200241ff0f6a290000210f200229008710211020022900f70f210a20022800f30f210920022f00f10f210820022d00f00f210d41002105200241003a009010200420076a210c200720036b41026a21030340200320056a450d02200241f00f6a20056a200c20056a220441026a2d00003a0000200120063602042001200441036a3602002002200541016a22043a0090102006417f6a21062004210520044120470d000b200441ff01714120490d032002418f106a3100002111200229008710211620022900f70f211720022800f30f210420022f00f10f210320022d00f00f2105200241a00d6a410f6a200241f00f6a410f6a290000370000200220173700a70d200220043600a30d200220033b00a10d200220053a00a00d20024188016a200110b305200229038801a70d0320024198016a29030021132002290390012114200241c00d6a410f6a2201200241a00d6a410f6a290000370000200241c00d6a41086a200241a00d6a41086a290300370300200220022903a00d22173703c00d201142ff018321152001290000211120022900c70d2112410321010c3c0b200541ff0171450d02200241003a0090100c020b200541ff0171450d01200241003a0090100c010b41002105200241003a0090102003417e6a21072003417d6a21030240034020072005460d01200241f00f6a20056a200420056a220641026a2d00003a0000200120033602042001200641036a3602002002200541016a22063a0090102003417f6a21032006210520064120470d000b200641ff01714120490d0120022900871021102002418f106a310000210b20022900f70f210a20022800f30f210920022f00f10f210820022d00f00f210d200241d80b6a410f6a200241f00f6a410f6a290000220f3700002002200a3700df0b200220093600db0b200220083b00d90b2002200d3a00d80b200241a0016a200110b30520022903a001a70d01200241b0016a290300211120022903a80121122010428080808080608320104280feffffff1f8384201042ff0183842110200241a0056a29030021132002290398052114410421010c3a0b200541ff0171450d00200241003a0090100b200041173602000c400b2006450d3620042d0001210520012003417e6a3602042001200441026a36020020050d36200241b8016a2001108f0120022802b8010d3620022802bc012206200728020041f0006e2204200420064b1bad42f0007e220a422088a70d15200aa72203417f4c0d150240024020030d004104210c0c010b20031024220c450d1c0b4100210420024100360290052002200c360288052002200341f0006e36028c05024002402006450d00200241f00f6a41086a21090340200241f00f6a200110e30220022802f40f210320022802f00f2107200241c00d6a200941e80010cf061a2003450d0220024188066a200241c00d6a41e80010cf061a02402004200228028c05470d0020024188056a2004410110c101200228028805210c20022802900521040b200c200441f0006c6a2205200336020420052007360200200541086a20024188066a41e80010cf061a2002200441016a2204360290052006417f6a22060d000b0b200c450d37200229028c05210a2000200c36020420004105360200200041086a200a370200200041106a200241a0126a41a00210cf061a0c400b2004450d35200441f0006c2104200c41046a21010c340b02402006450d0020012003417e6a3602042001200441026a3602000b200041173602000c3e0b2006450d3120042d0001210520012003417e6a3602042001200441026a360200200541014b0d31410021040240024020050e020001000b200241a0126a200110b00320022d00a0124101460d32200241f00f6a200241a0126a41017241a00110cf061a200241c0016a2001108f0120022802c0010d322007280200220520022802c4012203490d322003417f4c0d140240024020030d0041002106410121040c010b2003102a2204450d1b20072802002105200321060b0240024020052003490d0020042001280200200310cf0621052001280204220720034f0d012003200741b8afc0001048000b2006450d33200410260c330b2001200720036b3602042001200128020020036a3602002005450d322003ad4220862006ad84210a200241c00d6a200241f00f6a41a00110cf061a0b20024188066a200241c00d6a41a00110cf061a200041086a200a3702002000200436020420004107360200200041106a20024188066a41a00110cf061a200041b0016a20024188056a41800110cf061a0c3d0b02402006450d0020042d0001210520012003417e6a3602042001200441026a36020020050d00200241c8016a2001108f0120022802c8010d0020022802cc0121012000410836020020002001360204200041086a200241a0126a41a80210cf061a0c3d0b200041173602000c3c0b02402006450d0020042d0001210520012003417e6a22063602042001200441026a360200200541024b0d00024002400240024020050e03000102000b200241a0126a200110ce0420022903a8124202510d03200241f00f6a200241a0126a41800210cf061a200241a0126a200110de0520022802a412450d03200241b0126a2802002101200241ac126a280200210420022802a812210320022903a012210a200241c00d6a200241f00f6a41800210cf061a200a422088a72107200aa72105410121060c020b200241a0126a200110ce0420022903a8124202510d02200241f00f6a200241a0126a41800210cf061a200241a0126a200110de0520022802a412450d02200241b0126a2802002101200241ac126a280200210420022802a812210320022903a012210a200241c00d6a200241f00f6a41800210cf061a200a422088a72107200aa72105410221060c010b20064104490d012004280002210520012003417a6a22073602042001200441066a36020041032106200741034d0d01200428000621072001200341766a36020420012004410a6a360200200241c00d6a200241a0126a41800210cf061a0b20024188066a200241c00d6a41800210cf061a2000411c6a2001360200200041186a2004360200200041146a2003360200200041106a20073602002000410c6a2005360200200041086a200636020020004109360200200041206a20024188066a41800210cf061a200041a8026a20024188056a41086a290300370300200041a0026a2002290388053703000c3c0b200041173602000c3b0b2006450d2d20042d0001210520012003417e6a22063602042001200441026a36020020050d2d20064104490d2d2004280002210520012003417a6a3602042001200441066a360200200241e0016a2001108f0120022802e0010d2d2007280200220320022802e4012204490d2d2004417f4c0d100240024020040d00410021064101210c0c010b2004102a220c450d1720072802002103200421060b0240024020032004490d00200c2001280200200410cf0621092001280204220320044f0d012004200341b8afc0001048000b2006450d2e200c10260c2e0b2001200320046b3602042001200128020020046a3602002009450d2d2004ad4220862006ad84210b200241d8016a2001108f0120022802d8010d2c20022802dc01220c2007280200410c6e22042004200c4b1bad420c7e220a422088a70d10200aa72204417f4c0d100240024020040d00410421080c010b200410242208450d170b41002103200241003602f80f200220083602f00f20022004410c6e22063602f40f0240200c450d00410021030340200241d0016a2001108f0120022802d0010d2d2007280200220620022802d4012204490d2d2004417f4c0d120240024020040d004100210e4101210d0c010b2004102a220d450d19200728020021062004210e0b0240024020062004490d00200d2001280200200410cf0621062001280204220d20044f0d012004200d41b8afc0001048000b200e450d2e200d10260c2e0b2001200d20046b3602042001200128020020046a3602002006450d2d2004ad422086200ead84200a20061b210a0240200320022802f40f470d00200241f00f6a2003410110cb0120022802f00f210820022802f80f21030b20082003410c6c6a2204200a370204200420063602002002200341016a22033602f80f200c417f6a220c0d000b20022802f40f21060b2008450d2c200ba721040240024002400240200728020022074104490d002001280200220c280000210e20012007417c6a220d3602042001200c41046a360200200d4104490d01200c28000421182001200741786a220d3602042001200c41086a360200200d41044f0d0202402004450d00200910260b02402003450d002003410c6c21042008210103400240200141046a280200450d00200128020010260b2001410c6a2101200441746a22040d000b0b2006450d312006410c6c0d030c310b02402004450d00200910260b02402003450d002003410c6c21042008210103400240200141046a280200450d00200128020010260b2001410c6a2101200441746a22040d000b0b2006450d302006410c6c0d020c300b02402004450d00200910260b02402003450d002003410c6c21042008210103400240200141046a280200450d00200128020010260b2001410c6a2101200441746a22040d000b0b2006450d2f2006410c6c0d010c2f0b200c280008210d2001200741746a3602042001200c410c6a3602002009450d2e200241f00f6a200110dc0120022d00f00f4101470d1202402004450d00200910260b02402003450d002003410c6c21042008210103400240200141046a280200450d00200128020010260b2001410c6a2101200441746a22040d000b0b2006450d2e2006410c6c450d2e0b200810260c2d0b02402006450d0020012003417e6a3602042001200441026a3602000b200041173602000c390b2006450d2820042d0001210520012003417e6a22063602042001200441026a360200200541034b0d280240024002400240024020050e0400010203000b200241b8036a200110db0120022802b8032205450d2c200241f80b6a41086a200241e00c6a41086a290300370300200241d0086a41086a200241800d6a41086a290000370300200241d0086a410f6a200241800d6a410f6a290000370000200220022903e00c3703f80b200220022f01b80d3b01ec08200220022900800d3703d00820022902bc032111200241f00f6a41106a310000211020022903f80f211720022d008110210120022f0182102119200228028410210c200241bc0b6a41026a200241c00c6a41026a2d00003a0000200241c00b6a41086a200241c00d6a41086a290200370300200241c00b6a41106a200241c00d6a41106a2902003703002002419c0b6a41026a200241d80b6a41026a2d00003a0000200241a00b6a41086a200241a0046a41086a290200370300200241a00b6a41106a200241a0046a41106a290200370300200220022f00c00c3b01bc0b200220022902c00d3703c00b200220022f00d80b3b019c0b200220022902a0043703a00b200241fc0a6a41026a200241880c6a41026a2d00003a0000200241800b6a41106a200241a00d6a41106a290200370300200241800b6a41086a200241a00d6a41086a29020037030020024188066a41206a200241a0126a41206a28020036020020024188066a41186a200241a0126a41186a29030037030020024188066a41106a200241a0126a41106a29030037030020024188066a41086a200241a0126a41086a290300370300200220022f00880c3b01fc0a200220022902a00d3703800b200220022903a01237038806200241c40a6a41026a200241bc0d6a41026a2d00003a0000200220022f00bc0d3b01c40a420021124101211a0c030b41002105200241003a00c0122003417e6a210c2003417d6a21030240024002400340200c2005460d01200241a0126a20056a200420056a220641026a2d00003a0000200120033602042001200641036a3602002002200541016a22063a00c0122003417f6a21032006210520064120470d000b200641ff01714120490d2e20022900b712210b200241bf126a310000211020022900a712210a20022800a312210420022f00a112210320022d00a0122105200241d80b6a410f6a200241a0126a410f6a2900003700002002200a3700df0b200220043600db0b200220033b00d90b200220053a00d80b200241a0126a200110e10520022d00a01222044103460d2e2002419f096a200241a0126a41106a29000037000020024190096a41086a200241a9126a290000370300200241bc0d6a41026a200241bb126a22052d00003a0000200241a8086a41086a200241cc126a290200370300200241a8086a41106a200241d4126a290200370300200220022900a112370390092002200241b9126a2f00003b01bc0d2002200241c4126a2902003703a808200241a0126a41186a2d00002118200241bc126a280200210e200241a0126a41206a280200210d200241b80d6a41026a200241df126a2d00003a0000200241a00d6a41086a200241f0126a220c290300370300200241a00d6a41106a200241f8126a221b2903003703002002200241dd126a2f00003b01b80d2002200241e8126a221c2903003703a00d200241dc126a2d00002108200241e0126a2802002109200241e4126a280200210620024180136a2d00002103200241a0126a200110e10520022d00a0124103460d2e200241d0096a41026a20022d00a2123a0000200241b8036a41086a200241b3126a290000370300200241b8036a41106a2005290000370300200241f00f6a41086a200241cb126a290000370300200241f00f6a41106a200241d3126a290000370300200241f00f6a41186a200241db126a290000370300200241f00f6a41206a200241e3126a280000360200200220022f01a0123b01d0092002200241ab126a2900003703b8032002200241c3126a2900003703f00f20022800a312211d20022800a712211e200241880c6a41026a200241fe126a2d00003a00002002200241fc126a2f01003b01880c201b280200211f200241f4126a2802002120200c280200211b201c290300210f200241e7126a2d00002121200241ff126a2f0000211c200241a0126a200110de0520022802a4122222450d2e200241ac126a280200212320022802a8122124200728020022194104490d02200b422888201042188684a72107200b420888a72125200ba72126200241b0126a280200212720022802a012210520012802002228280000212920012019417c6a222a3602042001202841046a3602004100210c200241003a00c0042019417b6a21190340202a200c460d02200241a0046a200c6a2028200c6a221a41046a2d00003a0000200120193602042001201a41056a3602002002200c41016a221a3a00c0042019417f6a2119201a210c201a4120470d000b201a41ff01714120490d02200241bf046a310000210a20022900b704210b20022900a704211020022800a304210120022f00a104210c20022d00a0042119200241b3126a200241a0046a410f6a290000370000200241c3126a200a3c0000200241b0096a41086a222a200241e40b6a290200370300200220013600a7122002200b3700bb12200220103700ab122002200c3b00a512200220193a00a412200220293602a012200220022902dc0b3703b009200241a0126a41086a3100002110200241a0126a41186a290300210b20022802ac12210c20022f01aa12211920022903a012211720022d00a912210120022903b012210a20023502c012211620023502d80b211320022d00ec0b2128200220022f00ed0b3b018c09200241f0086a410f6a20024190096a410f6a290000370000200241f0086a41086a222920024190096a41086a29030037030020022002290390093703f0084102211a2002419c0d6a41026a222b200241bc0d6a41026a2d00003a0000200220022f01bc0d3b019c0d200241800d6a41106a222c200241a8086a41106a290300370300200241800d6a41086a222d200241a8086a41086a290300370300200220022903a8083703800d200241fc0c6a41026a222e200241b80d6a41026a2d00003a0000200220022f01b80d3b01fc0c200241e00c6a41106a222f200241a00d6a41106a290300370300200241e00c6a41086a2230200241a00d6a41086a290300370300200220022903a00d3703e00c200241dc0c6a41026a2231200241d0096a41026a2d00003a0000200220022f01d0093b01dc0c200241c00c6a41106a2232200241b8036a41106a290300370300200241c00c6a41086a2233200241b8036a41086a290300370300200220022903b8033703c00c200241c00d6a41206a200241f00f6a41206a280200360200200241c00d6a41186a2234200241f00f6a41186a290300370300200241c00d6a41106a2235200241f00f6a41106a290300370300200241c00d6a41086a2236200241f00f6a41086a290300370300200220022903f00f3703c00d200241bc0c6a41026a2237200241880c6a41026a2d00003a0000200220022f01880c3b01bc0c20044103460d2e2027ad4220862023ad8421122024ad4220862022ad84211120134220862016842116200241f80b6a41086a202a290300370300200241d0086a41086a2029290300370300200241d0086a410f6a200241f0086a410f6a290000370000200241bc0b6a41026a202b2d00003a0000200241c00b6a41106a202c290300370300200241c00b6a41086a202d290300370300200220022903b0093703f80b200220022f018c093b01ec08200220022903f0083703d008200220022f019c0d3b01bc0b200220022903800d3703c00b2002419c0b6a41026a202e2d00003a0000200241a00b6a41086a2030290300370300200241a00b6a41106a202f290300370300200241fc0a6a41026a20312d00003a0000200241800b6a41086a2033290300370300200241800b6a41106a2032290300370300200220022f01fc0c3b019c0b200220022903e00c3703a00b200220022f01dc0c3b01fc0a200220022903c00c3703800b20024188066a41206a200241c00d6a41206a28020036020020024188066a41186a203429030037030020024188066a41106a203529030037030020024188066a41086a2036290300370300200241c40a6a41026a20372d00003a0000200220022903c00d37038806200220022f01bc0c3b01c40a0c050b200541ff0171450d2d200241003a00c0120c2d0b200c41ff0171450d00200241003a00c0040b02402023450d002023410c6c21042022210103400240200141046a280200450d00200128020010260b2001410c6a2101200441746a22040d000b0b2024450d2b2024410c6c450d2b202210260c2b0b20064104490d2a2004280002210c20012003417a6a22053602042001200441066a36020020054110490d2a2004410e6a290000210b2004290006210a20012003416a6a22073602042001200441166a36020041002105200241003a009010200341696a21030240034020072005460d01200241f00f6a20056a200420056a220641166a2d00003a0000200120033602042001200641176a3602002002200541016a22063a0090102003417f6a21032006210520064120470d000b200641ff01714120490d2b2002418f106a3100002110200241f00f6a410f6a2900002112200229008710211720022900f70f211120022800f30f210520022f00f10f212a20022d00f00f2122200241f80b6a41086a200241e00c6a41086a290300370300200241d0086a41086a200241800d6a41086a290000370300200241d0086a410f6a200241800d6a410f6a290000370000200241bc0b6a41026a200241c00c6a41026a2d00003a0000200241c00b6a41106a200241c00d6a41106a290200370300200241c00b6a41086a200241c00d6a41086a290200370300200220022903e00c3703f80b200220022f01b80d3b01ec08200220022900800d3703d008200220022f00c00c3b01bc0b200220022902c00d3703c00b2002419c0b6a41026a200241d80b6a41026a2d00003a0000200241a00b6a41086a200241a0046a41086a290200370300200241a00b6a41106a200241a0046a41106a290200370300200241fc0a6a41026a200241880c6a41026a2d00003a0000200241800b6a41086a200241a00d6a41086a290200370300200241800b6a41106a200241a00d6a41106a290200370300200220022f00d80b3b019c0b200220022902a0043703a00b200220022f00880c3b01fc0a200220022902a00d3703800b20024188066a41206a200241a0126a41206a28020036020020024188066a41186a200241a0126a41186a29030037030020024188066a41106a200241a0126a41106a29030037030020024188066a41086a200241a0126a41086a290300370300200241c40a6a41026a200241bc0d6a41026a2d00003a0000200220022903a01237038806200220022f00bc0d3b01c40a4103211a0c020b200541ff0171450d2a200241003a0090100c2a0b20064104490d292004280002210520012003417a6a3602042001200441066a360200200241e8016a2001108f0120022802e8010d290240024002402007280200220620022802ec0122034f0d00410021044200210a0c010b2003417f4c0d110240024020030d0041002107410121040c010b2003102a2204450d1820072802002106200321070b024020062003490d0020042001280200200310cf061a200128020422062003490d142001200620036b3602042001200128020020036a3602002003ad4220862007ad84220a422088210b200a422086210a0c020b02402007450d00200410260b4200210a410021040b4200210b0b2004450d29200241f80b6a41086a200241a8086a41086a290200370300200241d0086a41086a200241b8036a41086a290000370300200241d0086a410f6a200241b8036a410f6a290000370000200241bc0b6a41026a200241a00d6a41026a2d00003a0000200241c00b6a41106a200241f00f6a41106a290200370300200241c00b6a41086a200241f00f6a41086a290200370300200220022902a8083703f80b200220022f0190093b01ec08200220022900b8033703d008200220022f00a00d3b01bc0b200220022902f00f3703c00b2002419c0b6a41026a200241800d6a41026a2d00003a0000200241a00b6a41086a200241c00d6a41086a290200370300200241a00b6a41106a200241c00d6a41106a290200370300200241fc0a6a41026a200241e00c6a41026a2d00003a0000200241800b6a41086a200241a0046a41086a290200370300200241800b6a41106a200241a0046a41106a290200370300200220022f00800d3b019c0b200220022902c00d3703a00b200220022f00e00c3b01fc0a200220022902a0043703800b20024188066a41206a200241a0126a41206a28020036020020024188066a41186a200241a0126a41186a29020037030020024188066a41106a200241a0126a41106a29020037030020024188066a41086a200241a0126a41086a290200370300200241c40a6a41026a200241c00c6a41026a2d00003a0000200220022902a01237038806200220022f00c00c3b01c40a200b420020041b42ffffffff0f832112200a420020041b2004ad8421114104211a0b200241e80a6a41086a2224200241f80b6a41086a290300370300200241c80a6a41086a2223200241d0086a41086a290300370300200241c80a6a410f6a2229200241d0086a410f6a290000370000200241a40a6a41026a2227200241bc0b6a41026a2d00003a0000200241a80a6a41106a222b200241c00b6a41106a290300370300200241a80a6a41086a222c200241c00b6a41086a290300370300200220022903f80b3703e80a200220022f01ec083b01a408200220022903d0083703c80a200220022f01bc0b3b01a40a200220022903c00b3703a80a200241840a6a41026a222d2002419c0b6a41026a2d00003a0000200241880a6a41086a222e200241a00b6a41086a290300370300200241880a6a41106a222f200241a00b6a41106a290300370300200241e4096a41026a2230200241fc0a6a41026a2d00003a0000200241e8096a41086a2231200241800b6a41086a290300370300200241e8096a41106a2232200241800b6a41106a290300370300200220022f019c0b3b01840a200220022903a00b3703880a200220022f01fc0a3b01e409200220022903800b3703e80920024188056a41206a223320024188066a41206a28020036020020024188056a41186a223420024188066a41186a29030037030020024188056a41106a223520024188066a41106a29030037030020024188056a41086a223620024188066a41086a290300370300200241ac096a41026a2237200241c40a6a41026a2d00003a0000200220022903880637038805200220022f01c40a3b01ac09200041386a200b370200200041306a200a370200200041286a20103c0000200041206a2017370200200041186a2012370200200041106a2011370200200041c0006a20163702002000412c6a200c360200200020193b002a200020013a00292000410c6a20053602002000202a3b000a200020223a0009200041086a201a3a00002000410c360200200041d8006a20283a0000200041c8006a20022903e80a370200200041d0006a2024290300370200200041e4006a20043a0000200041e0006a2007360200200041dc006a2025360200200020263a005b200020022f01a4083b0059200041f4006a2029290000370000200041ed006a2023290300370000200020022903c80a370065200041fc006a20183a0000200041ff006a20272d00003a0000200020022f01a40a3b007d20004184016a200d36020020004180016a200e36020020004198016a202b29030037020020004190016a202c29030037020020004188016a20022903a80a370200200041a0016a20083a0000200041a3016a202d2d00003a0000200020022f01840a3b00a101200041a8016a2006360200200041a4016a2009360200200041bc016a202f290300370200200041b4016a202e290300370200200041ac016a20022903880a370200200041c4016a20033a0000200041c7016a20302d00003a0000200020022f01e4093b00c501200041cc016a201e360200200041c8016a201d360200200041e0016a2032290300370200200041d8016a2031290300370200200041d0016a20022903e80937020020004188026a203328020036020020004180026a2034290300370200200041f8016a2035290300370200200041f0016a2036290300370200200041e8016a2002290388053702002000201f36009d0220002020360099022000201b360095022000200f37008d022000418c026a20213a0000200041a3026a20372d00003a0000200020022f01ac093b00a102200041a4026a201c3602000c380b02402006450d0020042d0001210520012003417e6a3602042001200441026a36020020050d002000410d360200200041046a200241a0126a41ac0210cf061a0c380b200041173602000c370b2006450d2520042d0001210520012003417e6a221b3602042001200441026a3602004106210c200541064b0d2502400240024002400240024002400240024020050e0700010203040805000b20024180026a2001108f012002280280020d2d20072802002203450d2d2002280284022109200128020022052d0000210420012003417f6a3602042001200541016a360200200441014b0d2d410021080240024020040e020100010b410121080b200241f8016a2001108f01410021040240024020022802f8010d002007280200220520022802fc012203490d012003417f4c0d160240024020030d0041002106410121040c010b2003102a2204450d1d20072802002105200321060b024020052003490d0020042001280200200310cf061a200128020422052003490d1a2003ad4220862006ad84210a2001200520036b3602042001200128020020036a3602000c020b02402006450d00200410260b410021040b0b2004450d2d200aa72103200241f0016a2001108f01024020022802f0010d00024002402007280200220c20022802f40122064f0d00410021054200210b0c010b2006417f4c0d160240024020060d0041002107410121050c010b2006102a2205450d1d2007280200210c200621070b0240200c2006490d0020052001280200200610cf061a2001280204220c2006490d1b2006ad4220862007ad84210b2001200c20066b3602042001200128020020066a3602000c010b02402007450d00200510260b4200210b410021050b2005450d00200b420020051b21164200420020051b210f200a422088420020041b2005ad42208684210b2003ad4220862004ad84210a4101210c0c080b2003450d2d200410260c2d0b20024188026a2001108f012002280288020d2c200228028c0221094102210c0c040b201b4104490d2b2004280002210920012003417a6a3602042001200441066a3602004103210c0c030b20024198026a2001108f012002280298020d2a20072802002203200228029c022204490d2a2004417f4c0d110240024020040d0041002105410121090c010b2004102a2209450d1820072802002103200421050b0240024020032004490d0020092001280200200410cf0621032001280204220620044f0d012004200641b8afc0001048000b20050d2a0c2b0b2001200620046b3602042001200128020020046a3602002003450d2a2004ad4220862005ad84210a20024190026a2001108f012002280290020d28200728020022032002280294022204490d282004417f4c0d110240024020040d0041002105410121060c010b2004102a2206450d1820072802002103200421050b0240024020032004490d0020062001280200200410cf0621032001280204220620044f0d012004200641b8afc0001048000b2005450d29200610260c290b2001200620046b3602042001200128020020046a3602002003450d282004ad4220862005ad84220b4220882116200b4220862003ad84210b4200210f4104210c0c030b200241a0026a2001108f0120022802a0020d2920022802a402210d41002103200241003a0090102007280200417f6a21040240024003402004417f460d01200241f00f6a20036a200128020022052d00003a0000200120043602042001200541016a3602002002200341016a22053a0090102004417f6a21042005210320054120470d000b200541ff01714120490d2b200229008710220a42ff01832110200a4280feffffff1f832117200a428080808080608321112002418f106a310000210f20022900f70f210a20022800f30f210920022f00f10f210e20022d00f00f2108200241d80b6a410f6a200241f00f6a410f6a290000220b3700002002200a3700df0b200220093600db0b2002200e3b00d90b200220083a00d80b41002103200241003a00901003402004417f460d02200241f00f6a20036a200128020022052d00003a0000200120043602042001200541016a3602002002200341016a22053a0090102004417f6a21042005210320054120470d000b200241c00d6a41086a2201200241f00f6a41086a290300370300200241c00d6a41106a2204200241f00f6a41106a290300370300200241c00d6a41186a2203200241f00f6a41186a290300370300200220022903f00f3703c00d200541ff0171411f4d0d2b20024188056a41086a200129030037030020024188056a41106a200429030037030020024188056a41186a2003290300370300200220022903c00d370388052011201784201084211620022f01880520022d008a05411074722106200241a3056a310000211220024193056a290000211720022d00a705211d20022f00a505211e20022d00a4052118200229009b052111200229008b0521104105210c0c050b200341ff0171450d2a200241003a0090100c2a0b200341ff0171450d29200241003a0090100c290b200241a8026a2001108f0120022802a8020d2820022802ac0221094107210c0b0b0b200020063b00252000201e3b0042200020183a00412000200e3b0106200020083a00052000200c3a00042000410e360200200041276a20064110763a0000200041c0006a20123c0000200041386a2011370000200041306a2017370000200041286a2010370000200041246a200f3c00002000411c6a2016370200200041146a200b3702002000410c6a200a370200200041c8006a200d360200200041c4006a201d3a0000200041086a2009360200200041cc006a200241a0126a41e40110cf061a0c360b2006450d2120042d0001210520012003417e6a22063602042001200441026a360200200541014b0d2102400240024020050e020001000b200241b0026a2001108f0120022802b0020d2320022802b4022205200728020041b0026e2204200420054b1bad42b0027e220a422088a70d0d200aa72203417f4c0d0d0240024020030d00410821060c010b200310242206450d140b41002104200241003602900520022006360288052002200341b0026e36028c05024002402005450d00200241a0126a410472210c0340200241a0126a200110b60220022802a0122103200241c00d6a200c41ac0210cf061a20034117460d02200241f00f6a200241c00d6a41ac0210cf061a02402004200228028c05470d0020024188056a2004410110c501200228028805210620022802900521040b2006200441b0026c6a22072003360200200741046a200241f00f6a41ac0210cf061a2002200441016a2204360290052005417f6a22050d000b0b2006450d24200229028c05210a410121010c020b2004450d22200441b0026c2104200621010c210b20064102490d2220042f0002210520012003417c6a3602042001200441046a360200200241a0126a200110b60220022802a0122101200241c00d6a200241a0126a41047241ac0210cf061a20014117460d22200241a0126a200241c00d6a41ac0210cf061a41b00210242206450d1320062001360200200641046a200241a0126a41ac0210cf061a410221010b200020013b01042000410f3602002000410c6a200a370200200041086a2006360200200041066a20053b0100200041146a20024188066a419c0210cf061a0c350b2006450d1d20042d0001210520012003417e6a222b3602042001200441026a3602002005410e4b0d1d410421270240024002400240024002400240024002400240024002400240024020050e0f00010225030405060708090a0b0c0d000b41002105200241003a0090102003417e6a21072003417d6a21030240034020072005460d01200241f00f6a20056a200420056a220641026a2d00003a0000200120033602042001200641036a3602002002200541016a22063a0090102003417f6a21032006210520064120470d000b200641ff01714120490d2b2002418f106a310000210f200241f00f6a410f6a2900002110200229008710210b20022900f70f210a20022800f30f210620022f00f10f210820022d00f00f2109200241e80a6a41086a200241800d6a41086a290000370300200241c80a6a41086a200241a00d6a41086a290000370300200241c80a6a410f6a200241a00d6a410f6a290000370000200241c40a6a41026a200241e00c6a41026a2d00003a0000200241a80a6a41106a20024188066a41106a290000370300200241a80a6a41086a20024188066a41086a290000370300200220022900800d3703e80a200220022f01800b3b01e60a200220022900a00d3703c80a200220022f00e00c3b01c40a20022002290088063703a80a200241a40a6a41026a200241c00c6a41026a2d00003a0000200241880a6a41086a20024188056a41086a290000370300200241880a6a41106a20024188056a41106a290000370300200241840a6a41026a200241c00b6a41026a2d00003a0000200241e8096a41086a200241a0046a41086a290000370300200241e8096a41106a200241a0046a41106a290000370300200220022f00c00c3b01a40a20022002290088053703880a200220022f00c00b3b01840a200220022900a0043703e809200241b8036a41206a200241a0126a41206a280000360200200241b8036a41186a200241a0126a41186a290000370300200241b8036a41106a200241a0126a41106a290000370300200241b8036a41086a200241a0126a41086a290000370300200241e4096a41026a200241a00b6a41026a2d00003a0000200220022900a0123703b803200220022f00a00b3b01e409410121270c250b200541ff0171450d2a200241003a0090100c2a0b200241b8026a2001108f0120022802b8020d2920022802bc022209200728020041c8006e2204200420094b1bad42c8007e220a422088a70d16200aa72204417f4c0d160240024020040d00410421060c010b200410242206450d1d0b41002103200241003602900c200220063602880c2002200441c8006e36028c0c02402009450d00200241f00f6a410c6a210c200241f00f6a41017221080340200241f00f6a200110cf02024020022d00f00f22054106470d002002419c0d6a41026a200241b80d6a41026a2d00003a0000200241e00c6a41086a200241800d6a41086a290300370300200241e00c6a41106a200241800d6a41106a29030037030020024188066a41086a200241c00d6a41086a29030037030020024188066a41106a200241c00d6a41106a29030037030020024188066a41186a200241c00d6a41186a29030037030020024188066a41206a200241c00d6a41206a280200360200200220022f01b80d3b019c0d200220022903800d3703e00c200220022903c00d370388060c2b0b200241bc0d6a41026a220e200841026a2d00003a0000200241a00d6a41086a2218200c41086a290200370300200241a00d6a41106a221e200c41106a290200370300200220082f00003b01bc0d2002200c2902003703a00d20022802f40f210d20022802f80f2104200241a0126a200110cf020240024020022d00a0124106470d00024020054101470d002004450d00200d10260b410621050c010b200241b80d6a41026a200e2d00003a0000200241800d6a41086a2018290300370300200241800d6a41106a201e290300370300200241c00d6a41086a200241a0126a41086a290300370300200241c00d6a41106a200241a0126a41106a290300370300200241c00d6a41186a200241a0126a41186a290300370300200241c00d6a41206a200241a0126a41206a280200360200200220022f01bc0d3b01b80d200220022903a00d3703800d200220022903a0123703c00d2004211c200d21210b2002419c0d6a41026a2204200241b80d6a41026a2d00003a0000200241e00c6a41086a220d200241800d6a41086a290300370300200241e00c6a41106a220e200241800d6a41106a29030037030020024188066a41086a2218200241c00d6a41086a29030037030020024188066a41106a221e200241c00d6a41106a29030037030020024188066a41186a221d200241c00d6a41186a29030037030020024188066a41206a221b200241c00d6a41206a280200360200200220022f01b80d3b019c0d200220022903800d3703e00c200220022903c00d3703880620054106460d2a200241fc0c6a41026a222020042d00003a0000200241c00c6a41086a221f200d290300370300200241c00c6a41106a220d200e29030037030020024188056a41086a220e201829030037030020024188056a41106a2218201e29030037030020024188056a41186a221e201d29030037030020024188056a41206a221d201b280200360200200220022f019c0d3b01fc0c200220022903e00c3703c00c20022002290388063703880502402003200228028c0c470d00200241880c6a2003410110ef0120022802880c210620022802900c21030b2006200341c8006c6a220420053a0000200441086a201c360000200441046a2021360000200441036a20202d00003a0000200420022f01fc0c3b0001200441146a201f2903003700002004411c6a200d2903003700002004410c6a20022903c00c370000200441246a200229038805370000200441346a20182903003700002004412c6a200e2903003700002004413c6a201e290300370000200441c4006a201d2802003600002002200341016a22033602900c2009417f6a22090d000b0b2006450d29200229028c0c210a200241a0126a200110cf0202400240024002400240024020022d00a0124106460d00200241b0126a310000210f200241c0126a280200212b200241b8126a2903002117200241b4126a2209280200210c200241b2126a2f0100210d200241b1126a2d0000210e200241a0126a41086a2208290300210b20022802a412210520022802a0122104200241a0126a200110cf02200ba7210320022d00a0124106460d01200241a00d6a41086a200241bc126a221e290200370300200220092902003703a00d200241ac126a221d29020021162008280200210820022802a412212c20022802a0122109200241a0126a200110cf0220022d00a01222184106460d0220024188056a41086a200241b5126a29000037030020024197056a201e290000370000200220022f00a1123b01880c2002200241ad126a29000037038805200241a0126a41086a221c280200211e201d2d0000212020022d00a312211f20022802a412211d200241a0126a200110cf0220022d00a012221b4106460d03200241c00c6a41026a20022d00a3123a000020024188066a41086a200241b4126a222629020037030020024188066a41106a200241bc126a2219290200370300200220022f00a1123b01c00c2002200241ac126a221a29020037038806201c280200211c20022802a4122121200241a0126a200110cf0220022d00a01222254106460d05200241e00c6a41026a20022d00a3123a0000200241c00d6a41086a2026290200370300200241c00d6a41106a2019290200370300200220022f00a1123b01e00c2002201a2902003703c00d200241a0126a41086a280200212620022802a412211920072802002207450d2d200128020022242d0000212320012007417f6a22293602042001202441016a360200202341014b0d2d4100212220230e021b041b0b0240200a422088a72201450d002006200141c8006c6a2104200621010340024020012d00004101470d00200141086a280200450d00200141046a28020010260b0240200141246a2d00004101470d002001412c6a280200450d00200141286a28020010260b200141c8006a22012004470d000b0b200aa72201450d2e200141c8006c450d2e200610260c2e0b0240200441ff01714101470d002003450d00200510260b0240200a422088a72201450d002006200141c8006c6a2104200621010340024020012d00004101470d00200141086a280200450d00200141046a28020010260b0240200141246a2d00004101470d002001412c6a280200450d00200141286a28020010260b200141c8006a22012004470d000b0b200aa72201450d2d200141c8006c450d2d200610260c2d0b0240200941ff01714101470d002008450d00202c10260b0240200441ff01714101470d002003450d00200510260b0240200a422088a72201450d002006200141c8006c6a2104200621010340024020012d00004101470d00200141086a280200450d00200141046a28020010260b0240200141246a2d00004101470d002001412c6a280200450d00200141286a28020010260b200141c8006a22012004470d000b0b200aa72201450d2c200141c8006c450d2c200610260c2c0b024020184101470d00201e450d00201d10260b0240200941ff01714101470d002008450d00202c10260b0240200441ff01714101470d002003450d00200510260b0240200a422088a72201450d002006200141c8006c6a2104200621010340024020012d00004101470d00200141086a280200450d00200141046a28020010260b0240200141246a2d00004101470d002001412c6a280200450d00200141286a28020010260b200141c8006a22012004470d000b0b200aa72201450d2b200141c8006c450d2b200610260c2b0b200241003a00b4122029450d2820242d0001211a20012007417e6a22283602042001202441026a360200200241013a00b4122002201a3a00a01220280d150c270b0240201b4101470d00201c450d00202110260b024020184101470d00201e450d00201d10260b0240200941ff01714101470d002008450d00202c10260b0240200441ff01714101470d002003450d00200510260b0240200a422088a72201450d002006200141c8006c6a2104200621010340024020012d00004101470d00200141086a280200450d00200141046a28020010260b0240200141246a2d00004101470d002001412c6a280200450d00200141286a28020010260b200141c8006a22012004470d000b0b200aa72201450d29200141c8006c450d29200610260c290b200241c0026a2001108f0120022802c0020d2820022802c4022209200728020041c4006e2204200420094b1bad42c4007e220a422088a70d15200aa72204417f4c0d150240024020040d00410421060c010b200410242206450d1c0b4100210c200241003602c80b200220063602c00b2002200441c4006e3602c40b02402009450d00200241a0126a410172210d200241a0126a410f6a210e41002108034041002103200241003a00c012200841016a21082007280200417f6a21040240024003402004417f460d01200241a0126a20036a200128020022052d00003a0000200120043602042001200541016a3602002002200341016a22053a00c0122004417f6a21042005210320054120470d000b200541ff0171411f4b0d010c270b200341ff0171450d26200241003a00c0120c260b200241a0126a411f6a310000210b20022900b712210a200e290000210f20022900a712211020022d00a012210420022f00a112210520022800a3122118200241a0126a200110cf0220022d00a012221e4106460d25200a422888200b42188684a72103200a420888a7211d200aa7211b200241c00d6a411f6a2220200d411f6a280000360000200241c00d6a41186a221f200d41186a29000037030020024188066a41086a221c200d41086a29000037030020024188066a41106a2221200d41106a29000037030020024188066a41186a2225201f29030037030020024188066a411f6a221f20202800003600002002200d29000037038806200241d80b6a410f6a2220200f370000200220103700df0b200220183600db0b200220053b00d90b200220043a00d80b20024188056a411f6a2205201f28000036000020024188056a41186a2218202529030037030020024188056a41106a221f202129030037030020024188056a41086a2221201c2903003703002002200229038806370388050240200c20022802c40b470d00200241c00b6a200c410110eb0120022802c00b210620022802c80b210c0b200241d80b6a41086a290300210a2020290000210b20022903d80b210f2006200c41c4006c6a2204201e3a00202004200f3702002004411f6a2003411876ad3c00002004410f6a200b370000200441086a200a37020020042003ad422886201dad42088684201bad42ff0183843700172004200229038805370021200441296a2021290300370000200441316a201f290300370000200441396a2018290300370000200441c0006a20052800003600002002200c41016a220c3602c80b20082009470d000b0b2006450d2820022902c40b210a200241e80a6a41086a200241c00c6a41086a290300370300200241c80a6a41086a200241e00c6a41086a290000370300200241c80a6a410f6a200241e00c6a410f6a290000370000200241c40a6a41026a200241a00b6a41026a2d00003a0000200241a80a6a41106a200241a0046a41106a290200370300200241a80a6a41086a200241a0046a41086a290200370300200220022903c00c3703e80a200220022f01bc0d3b01e60a200220022900e00c3703c80a200220022f00a00b3b01c40a200220022902a0043703a80a200241a40a6a41026a200241800b6a41026a2d00003a0000200241880a6a41086a200241a00d6a41086a290200370300200241880a6a41106a200241a00d6a41106a290200370300200241840a6a41026a200241f80b6a41026a2d00003a0000200241e8096a41086a200241800d6a41086a290200370300200241e8096a41106a200241800d6a41106a290200370300200220022f00800b3b01a40a200220022902a00d3703880a200220022f00f80b3b01840a200220022902800d3703e809200241b8036a41206a200241f00f6a41206a280200360200200241b8036a41186a200241f00f6a41186a290300370300200241b8036a41106a200241f00f6a41106a290300370300200241b8036a41086a200241f00f6a41086a290300370300200241e4096a41026a200241880c6a41026a2d00003a0000200220022903f00f3703b803200220022f00880c3b01e409410321270c220b200241e0026a2001108f0120022802e0020d2720022802e4022106200241c8026a200110b30520022903c802a70d27200241c8026a41106a290300211020022903d002210a200241e80a6a41086a200241a0046a41086a290300370300200241c80a6a41086a20024188056a41086a290000370300200241c80a6a410f6a20024188056a410f6a290000370000200241c40a6a41026a200241a00d6a41026a2d00003a0000200241a80a6a41106a200241f00f6a41106a290200370300200241a80a6a41086a200241f00f6a41086a290200370300200220022903a0043703e80a200220022f01c00b3b01e60a20022002290088053703c80a200220022f00a00d3b01c40a200220022902f00f3703a80a200241a40a6a41026a200241800d6a41026a2d00003a0000200241880a6a41086a200241c00d6a41086a290200370300200241880a6a41106a200241c00d6a41106a290200370300200241840a6a41026a200241e00c6a41026a2d00003a0000200241e8096a41086a20024188066a41086a290200370300200241e8096a41106a20024188066a41106a290200370300200220022f00800d3b01a40a200220022902c00d3703880a200220022f00e00c3b01840a20022002290288063703e809200241b8036a41206a200241a0126a41206a280200360200200241b8036a41186a200241a0126a41186a290300370300200241b8036a41106a200241a0126a41106a290300370300200241b8036a41086a200241a0126a41086a290300370300200241e4096a41026a200241c00c6a41026a2d00003a0000200220022903a0123703b803200220022f00c00c3b01e409410521270c210b202b4104490d262004280002210620012003417a6a360204410621272001200441066a360200200241e80a6a41086a200241a0046a41086a290300370300200241c80a6a41086a20024188056a41086a290000370300200241c80a6a410f6a20024188056a410f6a290000370000200241c40a6a41026a200241a00d6a41026a2d00003a0000200220022903a0043703e80a200220022f01c00b3b01e60a20022002290088053703c80a200220022f00a00d3b01c40a200241a80a6a41106a200241f00f6a41106a290200370300200241a80a6a41086a200241f00f6a41086a290200370300200241a40a6a41026a200241800d6a41026a2d00003a0000200241880a6a41086a200241c00d6a41086a290200370300200241880a6a41106a200241c00d6a41106a290200370300200241840a6a41026a200241e00c6a41026a2d00003a0000200220022902f00f3703a80a200220022f00800d3b01a40a200220022902c00d3703880a200220022f00e00c3b01840a200241e8096a41106a20024188066a41106a290200370300200241e8096a41086a20024188066a41086a290200370300200241b8036a41206a200241a0126a41206a280200360200200241b8036a41186a200241a0126a41186a290300370300200241b8036a41106a200241a0126a41106a290300370300200241b8036a41086a200241a0126a41086a290300370300200241e4096a41026a200241c00c6a41026a2d00003a000020022002290288063703e809200220022903a0123703b803200220022f00c00c3b01e409420021100c200b20024180036a2001108f012002280280030d252002280284032106200241e8026a200110b30520022903e802a70d25200241e8026a41106a290300211020022903f002210a200241e80a6a41086a200241e00c6a41086a290300370300200241c80a6a41086a200241800d6a41086a290000370300200241c80a6a410f6a200241800d6a410f6a290000370000200241c40a6a41026a200241c00c6a41026a2d00003a0000200220022903e00c3703e80a200220022f01b80d3b01e60a200220022900800d3703c80a200220022f00c00c3b01c40a200229038010211720022802fc0f210c20022f01fa0f210d20022d00f90f210e200241a80a6a41106a200241c00d6a41106a290200370300200241a80a6a41086a200241c00d6a41086a290200370300200241a40a6a41026a200241d80b6a41026a2d00003a0000200241880a6a41086a200241a0046a41086a290200370300200241880a6a41106a200241a0046a41106a290200370300200241840a6a41026a200241880c6a41026a2d00003a0000200220022902c00d3703a80a200220022f00d80b3b01a40a200220022902a0043703880a200220022f00880c3b01840a200241e8096a41106a200241a00d6a41106a290200370300200241e8096a41086a200241a00d6a41086a290200370300200241b8036a41206a200241a0126a41206a280200360200200241b8036a41186a200241a0126a41186a290300370300200241b8036a41106a200241a0126a41106a290300370300200241b8036a41086a200241a0126a41086a290300370300200241e4096a41026a200241bc0d6a41026a2d00003a0000200220022902a00d3703e809200220022903a0123703b803200220022f00bc0d3b01e409410721270c1f0b20024188036a2001108f012002280288030d24200228028c03210c41002103200241003a0090102007280200417f6a2104024003402004417f460d01200241f00f6a20036a200128020022052d00003a0000200120043602042001200541016a3602002002200341016a22053a0090102004417f6a21042005210320054120470d000b200541ff0171411f4d0d25200241f00f6a411f6a310000210f200241f00f6a410f6a2900002110200229008710210b20022900f70f210a20022800f30f210620022f00f10f210820022d00f00f210941082127200241e80a6a41086a200241a00d6a41086a290300370300200241c80a6a41086a200241a0046a41086a290000370300200241c80a6a410f6a200241a0046a410f6a290000370000200241c40a6a41026a200241800d6a41026a2d00003a0000200241a80a6a41106a200241c00d6a41106a290200370300200241a80a6a41086a200241c00d6a41086a290200370300200220022903a00d3703e80a200220022f01a00b3b01e60a200220022900a0043703c80a200220022f00800d3b01c40a200220022902c00d3703a80a200241a40a6a41026a200241e00c6a41026a2d00003a0000200241880a6a41086a20024188066a41086a290200370300200241880a6a41106a20024188066a41106a290200370300200241840a6a41026a200241c00c6a41026a2d00003a0000200241e8096a41086a20024188056a41086a290200370300200241e8096a41106a20024188056a41106a290200370300200220022f00e00c3b01a40a20022002290288063703880a200220022f00c00c3b01840a20022002290288053703e809200241b8036a41206a200241a0126a41206a280200360200200241b8036a41186a200241a0126a41186a290300370300200241b8036a41106a200241a0126a41106a290300370300200241b8036a41086a200241a0126a41086a290300370300200241e4096a41026a200241c00b6a41026a2d00003a0000200220022903a0123703b803200220022f00c00b3b01e4090c1f0b200341ff0171450d24200241003a0090100c240b20024190036a2001108f012002280290030d23200728020022044108490d23200228029403210620012802002203290000210a2001200441786a3602042001200341086a360200200a4280025a0d23200241e80a6a41086a200241a0046a41086a290300370300200241c80a6a41086a20024188056a41086a290000370300200241c80a6a410f6a20024188056a410f6a290000370000200241c40a6a41026a200241a00d6a41026a2d00003a0000200241a80a6a41106a200241f00f6a41106a290200370300200241a80a6a41086a200241f00f6a41086a290200370300200220022903a0043703e80a200220022f01c00b3b01e60a20022002290088053703c80a200220022f00a00d3b01c40a200220022902f00f3703a80a200241a40a6a41026a200241800d6a41026a2d00003a0000200241880a6a41086a200241c00d6a41086a290200370300200241880a6a41106a200241c00d6a41106a290200370300200241840a6a41026a200241e00c6a41026a2d00003a0000200241e8096a41086a20024188066a41086a290200370300200241e8096a41106a20024188066a41106a290200370300200220022f00800d3b01a40a200220022902c00d3703880a200220022f00e00c3b01840a20022002290288063703e809200241b8036a41206a200241a0126a41206a280200360200200241b8036a41186a200241a0126a41186a290300370300200241b8036a41106a200241a0126a41106a290300370300200241b8036a41086a200241a0126a41086a290300370300200241e4096a41026a200241c00c6a41026a2d00003a0000200220022903a0123703b803200220022f00c00c3b01e409200a42ff0183210a410921270c1d0b20024198036a2001108f012002280298030d22200228029c03210c41002104200241003a00901020072802002107417f2103024002400240024002400240024002400240034020072004460d01200241f00f6a20046a200128020022052d00003a00002001200720036a3602042001200541016a3602002002200441016a22053a0090102003417f6a21032005210420054120470d000b200541ff01714120490d2b20072005460d2b2002418f106a310000210f200241ff0f6a2900002110200229008710210b20022900f70f210a20022800f30f210620022f00f10f210820022d00f00f21092001280200220d2d000021042001200720036a22033602042001200d41016a360200200441064b0d2b4200211720040e0708010203040506080b200441ff0171450d2a200241003a0090100c2a0b20034110490d29200d41096a2900002112200d29000121112001200720056b416f6a3602042001200d41116a360200420121170c060b420221170c040b420321170c030b420421170c020b420521170c010b420621170b0b200241e80a6a41086a200241e00c6a41086a290300370300200241c80a6a41086a200241800d6a41086a290000370300200241c80a6a410f6a200241800d6a410f6a290000370000200241c40a6a41026a200241c00c6a41026a2d00003a0000200241a80a6a41106a200241c00d6a41106a290200370300200241a80a6a41086a200241c00d6a41086a290200370300200220022903e00c3703e80a200220022f01b80d3b01e60a200220022900800d3703c80a200220022f00c00c3b01c40a200220022902c00d3703a80a200241a40a6a41026a200241d80b6a41026a2d00003a0000200241880a6a41086a200241a0046a41086a290200370300200241880a6a41106a200241a0046a41106a290200370300200241840a6a41026a200241880c6a41026a2d00003a0000200241e8096a41086a200241a00d6a41086a290200370300200241e8096a41106a200241a00d6a41106a290200370300200220022f00d80b3b01a40a200220022902a0043703880a200220022f00880c3b01840a200220022902a00d3703e809200241b8036a41206a200241a0126a41206a280200360200200241b8036a41186a200241a0126a41186a290300370300200241b8036a41106a200241a0126a41106a290300370300200241b8036a41086a200241a0126a41086a290300370300200241e4096a41026a200241bc0d6a41026a2d00003a0000200220022903a0123703b803200220022f00bc0d3b01e409410a21270c1c0b41002105200241003a0090102003417e6a21072003417d6a21030240034020072005460d01200241f00f6a20056a200420056a220641026a2d00003a0000200120033602042001200641036a3602002002200541016a22063a0090102003417f6a21032006210520064120470d000b200641ff01714120490d222002418f106a310000210f200241f00f6a410f6a2900002110200229008710210b20022900f70f210a20022800f30f210620022f00f10f210820022d00f00f2109200241e80a6a41086a200241a00d6a41086a290000370300200241c80a6a41086a200241a0046a41086a290000370300200241c80a6a410f6a200241a0046a410f6a290000370000200241c40a6a41026a200241800d6a41026a2d00003a0000200241a80a6a41106a200241c00d6a41106a290000370300200241a80a6a41086a200241c00d6a41086a290000370300200220022900a00d3703e80a200220022f01a00b3b01e60a200220022900a0043703c80a200220022f00800d3b01c40a200220022900c00d3703a80a200241a40a6a41026a200241e00c6a41026a2d00003a0000200241880a6a41086a20024188066a41086a290000370300200241880a6a41106a20024188066a41106a290000370300200241840a6a41026a200241c00c6a41026a2d00003a0000200241e8096a41086a20024188056a41086a290000370300200241e8096a41106a20024188056a41106a290000370300200220022f00e00c3b01a40a20022002290088063703880a200220022f00c00c3b01840a20022002290088053703e809200241b8036a41206a200241a0126a41206a280000360200200241b8036a41186a200241a0126a41186a290000370300200241b8036a41106a200241a0126a41106a290000370300200241b8036a41086a200241a0126a41086a290000370300200241e4096a41026a200241c00b6a41026a2d00003a0000200220022900a0123703b803200220022f00c00b3b01e409410b21270c1c0b200541ff0171450d21200241003a0090100c210b41002105200241003a00c0122003417e6a21072003417d6a21030240034020072005460d01200241a0126a20056a200420056a220641026a2d00003a0000200120033602042001200641036a3602002002200541016a22063a00c0122003417f6a21032006210520064120470d000b200641ff01714120490d21200241bf126a310000210f200241af126a290000211020022900b712210b20022900a712210a20022800a312210620022f00a112210820022d00a0122109200241a0126a200110cf0220022d00a0124106460d21200241e80a6a41086a200241800d6a41086a290300370300200241c80a6a41086a200241a00d6a41086a290000370300200241c80a6a410f6a200241a00d6a410f6a290000370000200220022903800d3703e80a200220022f01800b3b01e60a200220022900a00d3703c80a200241b4126a2902002112410c2127200241a0126a410c6a2902002111200241bc126a290200211620022902a412211720022802a012210c200241c40a6a41026a200241e00c6a41026a2d00003a0000200220022f00e00c3b01c40a200241a80a6a41106a20024188066a41106a290200370300200241a80a6a41086a20024188066a41086a29020037030020022002290288063703a80a200241a40a6a41026a200241c00c6a41026a2d00003a0000200220022f00c00c3b01a40a200241880a6a41106a20024188056a41106a290200370300200241880a6a41086a20024188056a41086a29020037030020022002290288053703880a200241840a6a41026a200241c00b6a41026a2d00003a0000200220022f00c00b3b01840a200241e8096a41106a200241a0046a41106a290200370300200241e8096a41086a200241a0046a41086a290200370300200220022902a0043703e809200241b8036a41206a200241f00f6a41206a280200360200200241b8036a41186a200241f00f6a41186a290300370300200241b8036a41106a200241f00f6a41106a290300370300200241b8036a41086a200241f00f6a41086a290300370300200220022903f00f3703b803200241e4096a41026a200241a00b6a41026a2d00003a0000200220022f00a00b3b01e4090c1b0b200541ff0171450d20200241003a00c0120c200b41002105200241003a00c0122003417e6a21072003417d6a21030240034020072005460d01200241a0126a20056a200420056a220641026a2d00003a0000200120033602042001200641036a3602002002200541016a22063a00c0122003417f6a21032006210520064120470d000b200641ff01714120490d20200241bf126a310000210f20022900b712210b20022900a712210a20022800a312210420022f00a112210320022d00a0122109200241a00d6a410f6a200241a0126a410f6a2900003700002002200a3700a70d200220043600a30d200220033b00a10d200220093a00a00d200241a0126a200110cf0220022d00a0124106460d20200241e80a6a41086a200241800d6a41086a290300370300200241c80a6a41086a200241a0046a41086a290000370300200241c80a6a410f6a200241a0046a410f6a290000370000200220022903800d3703e80a200220022f01800b3b01e60a200220022900a0043703c80a200241b4126a2902002112200241ac126a2902002111200241bc126a290200211620022902a412211720022802a012210c200241a00d6a410f6a290000211020022900a70d210a20022f00a10d210820022800a30d2106200241c40a6a41026a200241e00c6a41026a2d00003a0000200220022f00e00c3b01c40a200241a80a6a41106a200241c00d6a41106a290200370300200241a80a6a41086a200241c00d6a41086a290200370300200220022902c00d3703a80a200241a40a6a41026a200241c00c6a41026a2d00003a0000200220022f00c00c3b01a40a200241880a6a41106a20024188066a41106a290200370300200241880a6a41086a20024188066a41086a29020037030020022002290288063703880a200241840a6a41026a200241c00b6a41026a2d00003a0000200220022f00c00b3b01840a200241e8096a41106a20024188056a41106a290200370300200241e8096a41086a20024188056a41086a29020037030020022002290288053703e809200241b8036a41206a200241f00f6a41206a280200360200200241b8036a41186a200241f00f6a41186a290300370300200241b8036a41106a200241f00f6a41106a290300370300200241b8036a41086a200241f00f6a41086a290300370300200220022903f00f3703b803200241e4096a41026a200241a00b6a41026a2d00003a0000200220022f00a00b3b01e409410d21270c1a0b200541ff0171450d1f200241003a00c0120c1f0b41002105200241003a0090102003417e6a21072003417d6a21030240034020072005460d01200241f00f6a20056a200420056a220641026a2d00003a0000200120033602042001200641036a3602002002200541016a22063a0090102003417f6a21032006210520064120470d000b200641ff01714120490d1f2002418f106a310000210f200241f00f6a410f6a2900002110200229008710210b20022900f70f210a20022800f30f210620022f00f10f210820022d00f00f2109200241e80a6a41086a200241800d6a41086a290000370300200241c80a6a41086a200241a00d6a41086a290000370300200241c80a6a410f6a200241a00d6a410f6a290000370000200241c40a6a41026a200241e00c6a41026a2d00003a0000200241a80a6a41106a200241c00d6a41106a290000370300200241a80a6a41086a200241c00d6a41086a290000370300200220022900800d3703e80a200220022f01800b3b01e60a200220022900a00d3703c80a200220022f00e00c3b01c40a200220022900c00d3703a80a200241a40a6a41026a200241c00c6a41026a2d00003a0000200241880a6a41086a20024188066a41086a290000370300200241880a6a41106a20024188066a41106a290000370300200241840a6a41026a200241c00b6a41026a2d00003a0000200241e8096a41086a200241a0046a41086a290000370300200241e8096a41106a200241a0046a41106a290000370300200220022f00c00c3b01a40a20022002290088063703880a200220022f00c00b3b01840a200220022900a0043703e809200241b8036a41206a200241a0126a41206a280000360200200241b8036a41186a200241a0126a41186a290000370300200241b8036a41106a200241a0126a41106a290000370300200241b8036a41086a200241a0126a41086a290000370300200241e4096a41026a200241a00b6a41026a2d00003a0000200220022900a0123703b803200220022f00a00b3b01e409410e21270c190b200541ff0171450d1e200241003a0090100c1e0b410f21270c170b200241f00f6a200110c403024020022d00f00f410a460d00200241c00d6a200241f00f6a41c40010cf061a20004111360200200041046a200241c00d6a41c40010cf061a200041c8006a200241a0126a41e80110cf061a0c340b200041173602000c330b02402006450d0020042d0001210520012003417e6a3602042001200441026a360200200541034b0d004101210602400240024002400240024020050e0403000102030b41002105200241003a0090102003417e6a21072003417d6a21030240034020072005460d01200241f00f6a20056a200420056a220641026a2d00003a0000200120033602042001200641036a3602002002200541016a22063a0090102003417f6a21032006210520064120470d000b200641ff01714120490d062002418f106a3100002110200241ff0f6a2900002111200229008710210f20022900f70f211720022800f30f210c20022f00f10f210920022d00f00f21084200210b41022106420021380c030b200541ff0171450d05200241003a0090100c050b41002105200241003a0090102003417e6a210c417d210702400340200c2005460d01200241f00f6a20056a200420056a220641026a2d00003a00002001200320076a3602042001200641036a3602002002200541016a22063a0090102007417f6a21072006210520064120470d000b200641ff01714120490d05200320066b2203417e6a4110490d052002418f106a3100002110200241ff0f6a2900002111200229008710210f20022900f70f211720022800f30f210c20022f00f10f210920022d00f00f2108200420066a2204410a6a2900002116200441026a290000211220012003416e6a22053602042001200441126a220636020020054110490d052004411a6a29000021142006290000211320012003415e6a22053602042001200441226a220736020041032106200541034d0d052007280000210720012003415a6a3602042001200441266a360200200241d00d6a290300213920022903c80d211520022802d80d210e20022802dc0d210d4200210b420021380c020b200541ff0171450d04200241003a0090100c040b41002105200241003a0090102003417e6a210c200321060340200c2005460d02200241f00f6a20056a200420056a220741026a2d00003a000020012006417d6a3602042001200741036a3602002002200541016a22073a0090102006417f6a21062007210520074120470d000b200741ff01714120490d03200320076b417e6a210d2002418f106a3100002110200241ff0f6a2900002111200229008710210f20022900f70f211720022800f30f210c20022f00f10f210920022d00f00f210841002105200241003a009010200420076a210e2006417d6a21040340200d2005460d03200241f00f6a20056a200e20056a220741026a2d00003a0000200120043602042001200741036a3602002002200541016a22073a0090102004417f6a21042003417f6a21032007210520074120470d000b200741ff01714120490d0320022900871021122002418f106a310000211620022900f70f210a20022800f30f210420022f00f10f210320022d00f00f2105200241d80b6a410f6a200241f00f6a410f6a2900003700002002200a3700df0b200220043600db0b200220033b00d90b200220053a00d80b200620076b2203417e6a4110490d03200e20076a2204410a6a2900002113200441026a290000213a20012003416e6a22053602042001200441126a220636020020054110490d032004411a6a29000021392006290000211520012003415e6a22053602042001200441226a22073602004104210620054104490d032007280000210e20012003415a6a3602042001200441266a360200200241a00d6a410f6a2201200241d80b6a410f6a290000370000200241a00d6a41086a200241d80b6a41086a290300370300200220022903d80b220a3703a00d203a422088201342208684210b20134220882138201642ff018321142012428080808080608320124280feffffff1f8384201242ff01838421132001290000211620022900a70d2112203aa721070b2000200a3e0029200020093b000a200020083a0009200041123602002000412f6a200a4230883c00002000412d6a200a4220883d0000200041e8006a2039370200200041e0006a2015370200200041c8006a2014370200200041c0006a2013370200200041386a2016370200200041306a2012370200200041286a20103c0000200041206a200f370000200041186a2011370000200041106a2017370000200041f4006a200d360200200041f0006a200e3602002000410c6a200c360000200041086a20063a0000200041d0006a200b4220862007ad84370200200041d8006a2038422086200b42208884370200200041f8006a200241a0126a41b80110cf061a0c350b200541ff0171450d01200241003a0090100c010b200541ff0171450d00200241003a0090100b200041173602000c320b200241f00f6a2001109a04024020022d00f00f4107460d00200241c00d6a41206a200241f00f6a41206a2802002201360200200241c00d6a41186a200241f00f6a41186a290300220a370300200241c00d6a41106a200241f00f6a41106a290300220b370300200241c00d6a41086a200241f00f6a41086a290300220f370300200220022903f00f22103703c00d20004113360200200020103702042000410c6a200f370200200041146a200b3702002000411c6a200a370200200041246a2001360200200041286a200241a0126a41880210cf061a0c320b20004117360200200241f00f6a10b6060c310b200241c00d6a2001108305024020022d00c00d4105460d0020024188066a41206a200241c00d6a41206a290300220a37030020024188066a41186a200241c00d6a41186a290300220b370300200241f00f6a410c6a200241c00d6a41086a290300370200200241f00f6a41146a200241c00d6a41106a290300370200200241f00f6a411c6a200b370200200241f00f6a41246a200a370200200220022903c00d3702f40f20004114360200200020022902f00f3702042000410c6a200241f00f6a41086a290200370200200041146a200241f00f6a41106a2902003702002000411c6a200241f00f6a41186a290200370200200041246a200241f00f6a41206a2902003702002000412c6a20024198106a280200360200200041306a200241a0126a41800210cf061a0c310b200041173602000c300b2006450d1120042d0001210520012003417e6a221e3602042001200441026a360200200541054b0d1141042118024002400240024002400240024020050e06000102060304000b41002105200241003a0090102003417e6a210c417d21060240024002400340200c2005460d01200241f00f6a20056a200420056a220741026a2d00003a00002001200320066a3602042001200741036a3602002002200541016a22073a0090102006417f6a21062007210520074120470d000b200741ff01714120490d1a200241f00f6a410f6a290000210f200229008710210b20022900f70f210a20022800f30f210920022f00f10f210820022d00f00f210c200241c00d6a411f6a200241f00f6a411f6a31000022103c0000200241c00d6a410f6a200f3700002002200b3700d70d2002200a3700c70d200220093600c30d200220083b00c10d2002200c3a00c00d2003417e6a2007460d1a200420076a220541026a2d000021042001200320066a3602042001200541036a360200200441014b0d1a4104210620040e020201020b200541ff0171450d19200241003a0090100c190b2003417d6a2007460d18200541036a2d000021042001200320076b417c6a3602042001200541046a360200200441034b0d184100210602400240024020040e0403020001030b410221060c020b410321060c010b410121060b200110b5022207450d17410121180c050b41002105200241003a0090102003417e6a210c417d21060240024002400340200c2005460d01200241f00f6a20056a200420056a220741026a2d00003a00002001200320066a3602042001200741036a3602002002200541016a22073a0090102006417f6a21062007210520074120470d000b200741ff01714120490d192003417e6a2007460d192002418f106a3100002110200241ff0f6a290000210f200229008710210b20022900f70f210a20022800f30f210920022f00f10f210820022d00f00f210c41022118200420076a220541026a2d000021042001200320066a3602042001200541036a360200200441034b0d194100210620040e0407010602070b200541ff0171450d18200241003a0090100c180b410121060c050b410321060c040b41002105200241003a0090102003417e6a210c417d2106024002400240024002400340200c2005460d01200241f00f6a20056a200420056a220741026a2d00003a00002001200320066a3602042001200741036a3602002002200541016a22073a0090102006417f6a21062007210520074120470d000b200741ff01714120490d1a200241f00f6a410f6a290000210a200229008710210b20022900f70f210f20022800f30f210520022f00f10f210c20022d00f00f210920024188056a411f6a200241f00f6a411f6a31000022103c000020024188056a410f6a200a3700002002200b37009f052002200f37008f052002200536008b052002200c3b008905200220093a0088052003417e6a2007460d1a200420076a220541026a2d000021042001200320066a3602042001200541036a360200200441034b0d1a4100210620040e0404030102040b200541ff0171450d19200241003a0090100c190b410221060c020b410321060c010b410121060b200241a00d6a410f6a220120024188056a410f6a290000370000200241a00d6a41086a20024188056a41086a290300370300200220022903880522173703a00d2001290000210f20022f00a10d210820022800a30d210920022900a70d210a2017a7210c410321180c030b201e450d1420042d0002210520012003417d6a22063602042001200441036a360200200541034b0d144100210c024002400240024020050e0403000102030b4101210c0c020b4102210c0c010b4103210c0b20064102490d1420042f0003210820012003417b6a360204410521182001200441056a36020041002109410021070c020b41002105200241003a0090102003417e6a210c417d2106024002400240024002400340200c2005460d01200241f00f6a20056a200420056a220741026a2d00003a00002001200320066a3602042001200741036a3602002002200541016a22073a0090102006417f6a21062007210520074120470d000b200741ff01714120490d18200229008710210b2002418f106a310000211020022900f70f210a20022800f30f210920022f00f10f210820022d00f00f210c200241d80b6a410f6a200241f00f6a410f6a290000220f3700002002200a3700df0b200220093600db0b200220083b00d90b2002200c3a00d80b2003417e6a2007460d18200420076a220541026a2d000021042001200320066a220d3602042001200541036a360200200441034b0d184100210620040e0404030102040b200541ff0171450d17200241003a0090100c170b410221060c020b410321060c010b410121060b200d4102490d13200541036a2f0000210d2001200320076b417b6a3602042001200541056a360200200241a8036a2001108f0120022802a8030d1320022802ac032107200241a0036a2001108f0120022802a0030d1320022802a403210e200b4280808080806083200b4280feffffff1f8384200b42ff018384210b410621180c010b41022106410221180b200020063a00252000200c3a0005200020183a000420004115360200200041246a20103c00002000411c6a200b370200200041146a200f3702002000410c6a200a3702002000412c6a200e360200200041286a2007360200200041266a200d3b0100200041086a2009360200200041066a20083b0100200041306a200241a0126a41800210cf061a0c2f0b2006450d0120042d0001210520012003417e6a22063602042001200441026a360200024002400240024002400240200541034b0d00024002400240024020050e0400010203000b200241a0046a20011092010240024020022802a0042204450d0020022902a404210a200110b5022201450d01200241c00d6a41106a2001360200200241c00d6a41086a200a370300200241d40d6a200229028805370200200241dc0d6a20024188056a41086a290200370200200241e40d6a20024188056a41106a290200370200200241ec0d6a200241a0056a290200370200200241f40d6a200241a8056a290200370200200241fc0d6a200241b0056a290200370200200241840e6a200241b8056a280200360200200220043602c40d200241013a00c00d0c190b200241053a00c00d0c190b200241053a00c00d200a42ffffff3f83500d18200410260c180b024002400240024002400240024020064102490d0020042f0002210520012003417c6a3602042001200441046a360200200241a0046a200110920120022802a0042204450d01200241a0046a41086a2206280200210c20022802a4042103200241a0046a200110ab0520022802a0044102460d04200241b8036a41086a2006280200360200200220022903a0043703b803200241b0036a2001108f0120022802b0030d062007280200220920022802b4032206490d062006417f4c0d1320060d02410021084101210d0c030b200241053a00c00d0c1d0b200241053a00c00d0c1c0b2006102a220d450d1620072802002109200621080b024020092006490d00200d2001280200200610cf0621092001280204220d20064f0d022006200d41b8afc0001048000b2008450d02200d10260c020b200241053a00c00d200341ffffff3f71450d19200410260c190b2001200d20066b3602042001200128020020066a36020020090d160b200241053a00c00d200341ffffff3f71450d17200410260c170b0240024002400240024020064102490d0020042f0002210820012003417c6a3602042001200441046a36020020024188056a2001109201200228028805220c450d0120024188056a41086a2204280200210d200228028c05210920024188056a200110ab052002280288054102460d03200241a00d6a41086a200428020036020020022002290388053703a00d41002104200241003a00a80520072802002106417f2103034020062004460d0320024188056a20046a200128020022052d00003a00002001200620036a3602042001200541016a3602002002200441016a22053a00a8052003417f6a21032005210420054120470d000b200241a0046a410f6a220420024188056a410f6a290000370000200241a0046a41086a220320024188056a41086a290300370300200241b8036a41086a22072003290300370300200241b8036a410f6a2203200429000037000020022002290388053703b803200241a7056a310000210b200229009f05210a410121040240200541ff01714120490d00200241a8086a410f6a2003290000370000200241a8086a41086a2007290300370300200220022903b8033703a808410021040b2004450d040c180b200241053a00c00d0c1a0b200241053a00c00d0c190b200441ff0171450d15200241003a00a8050c150b200241053a00c00d200941ffffff3f71450d17200c10260c170b200241d80b6a410f6a2204200241a8086a410f6a290000370000200241d80b6a41086a200241a8086a41086a290300370300200220022903a8083703d80b0240200620056b22034108490d0020012802002205290000210f2001200341786a3602042001200541086a360200200241800d6a41086a2201200241a00d6a41086a280200360200200241e00d6a200b42ff01833c0000200241d80d6a200a4280808080806083200a4280feffffff1f8384200a42ff018384370300200241d00d6a2004290000370300200241c00d6a41086a20022900df0b370300200241ec0d6a200d360200200241e80d6a2009360200200241e40d6a200c360200200241e20d6a20083b0100200220022903a00d3703800d200220022800db0b3602c40d200220022f00d90b3b01c20d200220022d00d80b3a00c10d200241033a00c00d200241f80d6a2001280200360200200241f00d6a20022903800d370300200241800e6a200f3703000c160b200241053a00c00d200941ffffff3f71450d16200c10260c160b20064102490d0120042f0002210820012003417c6a3602042001200441046a36020020024188056a2001109201200228028805220c450d02200228028c052109200728020022034104490d0520024190056a280200210d20012802002206280000210e20012003417c6a22043602042001200641046a36020020044104490d05200628000421182001200341786a22073602042001200641086a36020041002104200241003a00a805200341776a2103034020072004460d0420024188056a20046a200620046a220541086a2d00003a0000200120033602042001200541096a3602002002200441016a22053a00a8052003417f6a21032005210420054120470d000b200541ff01714120490d04200241a7056a310000210a20024197056a290000210b200229009f05210f200229008f052110200228008b05210120022f008905210420022d0088052103200241ec0d6a200dad3e0200200241c00d6a41206a200a3c0000200241d80d6a200f370300200241d00d6a200b370300200241c80d6a2010370300200241f40d6a2018360200200241f00d6a200e360200200241e20d6a20083b0100200241e40d6a2009ad422086200cad84370200200220013602c40d200220043b01c20d200220033a00c10d200241043a00c00d0c140b200241053a00c00d0c140b200241053a00c00d0c130b200241053a00c00d0c120b200441ff0171450d00200241003a00a8050b200241053a00c00d200941ffffff3f71450d10200c10260c100b200241053a00c00d200941ffffff3f71450d0f200c10260c0f0b200041173602000c2d0b200241053a00c00d0c0d0b20242d0002211a20012007417d6a22283602042001202441036a360200200241023a00b4122002201a3a00a1122028450d1120242d0003211a20012007417c6a22283602042001202441046a360200200241033a00b4122002201a3a00a2122028450d1120242d0004211a20012007417b6a22283602042001202441056a360200200241043a00b4122002201a3a00a3122028450d1120242d0005211a20012007417a6a22283602042001202441066a360200200241053a00b4122002201a3a00a4122028450d1120242d0006211a2001200741796a22283602042001202441076a360200200241063a00b4122002201a3a00a5122028450d1120242d0007211a2001200741786a22283602042001202441086a360200200241073a00b4122002201a3a00a6122028450d1120242d0008211a2001200741776a22283602042001202441096a360200200241083a00b4122002201a3a00a7122028450d1120242d0009211a2001200741766a222836020420012024410a6a360200200241093a00b4122002201a3a00a8122028450d1120242d000a211a2001200741756a222836020420012024410b6a3602002002410a3a00b4122002201a3a00a9122028450d1120242d000b211a2001200741746a222836020420012024410c6a3602002002410b3a00b4122002201a3a00aa122028450d1120242d000c211a2001200741736a222836020420012024410d6a3602002002410c3a00b4122002201a3a00ab122028450d1120242d000d211a2001200741726a222836020420012024410e6a3602002002410d3a00b4122002201a3a00ac122028450d1120242d000e211a2001200741716a222836020420012024410f6a3602002002410e3a00b4122002201a3a00ad122028450d1120242d000f211a2001200741706a22283602042001202441106a3602002002410f3a00b4122002201a3a00ae122028450d1120242d0010211a20012007416f6a22283602042001202441116a360200200241103a00b4122002201a3a00af122028450d1120242d0011211a20012007416e6a22283602042001202441126a360200200241113a00b4122002201a3a00b0122028450d1120242d0012211a20012007416d6a22283602042001202441136a360200200241123a00b4122002201a3a00b1122028450d1120242d0013211a20012007416c6a22283602042001202441146a360200200241133a00b4122002201a3a00b2122028450d1120242d0014211a20012007416b6a3602042001202441156a3602002002201a3a00b31220022903a012211320022802a812211a20022802ac12212820022802b012212a410121220b200241a0126a200110cf0220022d00a01222244106460d0f41022127200241800d6a41026a220720022d00a3123a0000200241f00f6a41086a222d200241b4126a290200370300200241f00f6a41106a222e200241bc126a290200370300200220022f00a1123b01800d2002200241ac126a2902003703f00f200241a0126a41086a222f280200212320022802a4122129200241a0126a200110cf0220022d00a0124106470d05024020244101470d002023450d00202910260b024020254101470d002026450d00201910260b0240201b4101470d00201c450d00202110260b024020184101470d00201e450d00201d10260b0240200941ff01714101470d002008450d00202c10260b0240200441ff01714101470d002003450d00200510260b0240200a422088a72201450d002006200141c8006c6a2104200621010340024020012d00004101470d00200141086a280200450d00200141046a28020010260b0240200141246a2d00004101470d002001412c6a280200450d00200141286a28020010260b200141c8006a22012004470d000b0b200aa72201450d13200141c8006c450d13200610260c130b1034000b200241a5106a2f00002101200241a7106a2800002107200241ab106a2f0000210c200241ad106a280000211e200241f90f6a290000210a20024181106a290000210f20024189106a31000021102002418d106a290000211720024195106a29000021112002419d106a29000021122002418a106a2f0100211d20022900f10f2116200041c7006a200241f00f6a411c6a2d00003a0000200041c5006a201d3b0000200041d8006a2012370200200041d0006a2011370200200041c8006a2017370200200041c4006a20103c00002000413c6a200f370200200041346a200a3702002000412c6a2016370200200041e8006a201e360200200041e6006a200c3b0100200041e2006a2007360100200041e0006a20013b0100200041286a200d360200200041246a2018360200200041206a200e3602002000411c6a2003360200200041186a2006360200200041146a2008360200200041106a200b422088a73602002000410c6a2004360200200041086a2009360200200020053602042000410a360200200041ec006a200241a0126a41c40110cf061a0c280b2003200641b8afc0001048000b2003200541b8afc0001048000b2006200c41b8afc0001048000b200241a0046a41206a2201200241a0126a41206a280200360200200241a0046a41186a2203200241a0126a41186a290300370300200241a0046a41106a2230200241a0126a41106a290300370300200241a0046a41086a2231202f290300370300200241f80b6a41086a222f200241a00d6a41086a290300370300200220022903a0123703a004200220022903a00d3703f80b200220022f01880c3b01f60b200241d80b6a410f6a223220024188056a410f6a290000370000200241d80b6a41086a223320024188056a41086a29030037030020022002290388053703d80b200241bc0c6a41026a2234200241c00c6a41026a2d00003a0000200220022f01c00c3b01bc0c200241c00b6a41106a223520024188066a41106a290300370300200241c00b6a41086a223620024188066a41086a29030037030020022002290388063703c00b200241bc0b6a41026a2237200241e00c6a41026a2d00003a0000200220022f01e00c3b01bc0b200241a00b6a41106a223b200241c00d6a41106a290300370300200241a00b6a41086a223c200241c00d6a41086a290300370300200220022903c00d3703a00b2002419c0b6a41026a223d20072d00003a0000200220022f01800d3b019c0b200241800b6a41106a2207202e290300370300200241800b6a41086a222e202d290300370300200220022903f00f3703800b200241fc0a6a41026a222d200241dc0c6a41026a2d00003a0000200220022f00dc0c3b01fc0a200241e80a6a41086a202f290300370300200220022903f80b3703e80a200220022f01f60b3b01e60a200241c80a6a410f6a2032290000370000200241c80a6a41086a2033290300370300200220022903d80b3703c80a200241c40a6a41026a20342d00003a0000200220022f01bc0c3b01c40a200241a80a6a41106a2035290300370300200241a80a6a41086a2036290300370300200220022903c00b3703a80a200241a40a6a41026a20372d00003a0000200220022f01bc0b3b01a40a200241880a6a41106a203b290300370300200241880a6a41086a203c290300370300200220022903a00b3703880a200241840a6a41026a203d2d00003a0000200220022f019c0b3b01840a200241e8096a41106a2007290300370300200241e8096a41086a202e290300370300200220022903800b3703e809200241b8036a41206a2001280200360200200241b8036a41186a2003290300370300200241b8036a41106a2030290300370300200241b8036a41086a2031290300370300200220022903a0043703b803200241e4096a41026a202d2d00003a0000200220022f01fc0a3b01e4092008ad422086202cad4220862009ad8422114220888421122005ad4220862004ad8421102011422086202bad8421110c070b1033000b102c000b200241053a00c00d200941ffffff3f71450d02200c10260c020b2006ad4220862008ad84220aa721060240024020072802002207450d00200128020022082d0000210d20012007417f6a220e3602042001200841016a360200200d41014b0d004100211802400240200d0e020100010b410121180b200e4108490d012008290001210b2001200741776a3602042001200841096a360200200241a8086a41086a200241b8036a41086a2802002201360200200241cc0d6a200c360200200241c00d6a41086a2003360200200241c00d6a41106a20022903b803220f370300200241e80d6a200b370300200241e40d6a200a422088a7360200200241e00d6a2006360200200241dc0d6a2009360200200241d80d6a20013602002002200f3703a808200241023a00c00d200220043602c40d200220053b01c20d200220183a00c10d200241800e6a20024188056a41106a290300370300200241f80d6a20024188056a41086a290300370300200241f00d6a2002290388053703000c020b200241053a00c00d02402006450d00200910260b200341ffffff3f71450d02200410260c020b200241053a00c00d02402006450d00200910260b200341ffffff3f71450d01200410260c010b20024188066a200241c00d6a41c80010cf061a200241f00f6a41046a20024188066a41c80010cf061a20004116360200200041046a200241f00f6a41cc0010cf061a200041d0006a200241a0126a41e00110cf061a0c1f0b20004117360200200241c00d6a10b7060c1e0b200041173602000c1d0b200241d0096a41086a2201200241e80a6a41086a290300370300200241b0096a41086a2204200241c80a6a41086a290300370300200241b0096a410f6a2203200241c80a6a410f6a290000370000200241ac096a41026a2205200241c40a6a41026a2d00003a000020024190096a41106a2207200241a80a6a41106a29030037030020024190096a41086a222b200241a80a6a41086a290300370300200220022903e80a3703d009200220022f01e60a3b01ce09200220022903c80a3703b009200220022f01c40a3b01ac09200220022903a80a370390092002418c096a41026a222c200241a40a6a41026a2d00003a0000200241f0086a41086a222d200241880a6a41086a290300370300200241f0086a41106a222e200241880a6a41106a290300370300200241ec086a41026a222f200241840a6a41026a2d00003a0000200241d0086a41086a2230200241e8096a41086a290300370300200241d0086a41106a2231200241e8096a41106a290300370300200220022f01a40a3b018c09200220022903880a3703f008200220022f01840a3b01ec08200220022903e8093703d008200241a8086a41206a2232200241b8036a41206a280200360200200241a8086a41186a2233200241b8036a41186a290300370300200241a8086a41106a2234200241b8036a41106a290300370300200241a8086a41086a2235200241b8036a41086a290300370300200241a4086a41026a2236200241e4096a41026a2d00003a0000200220022903b8033703a808200220022f01e4093b01a408200041c0006a2012370200200041386a2011370200200041286a200f3c0000200041206a200b370200200041186a2010370200200041106a200a370200200041c8006a2016370200200041306a20173702002000412c6a200c3602002000200d3b002a2000200e3a00292000410c6a2006360200200020083b000a200020093a0009200041086a20273a000020004110360200200041e0006a20183a0000200041d0006a20022903d009370200200041d8006a200129030037020020022f01ce092101200041ec006a20203a0000200041e8006a201e360200200041e4006a201d3602002000201f3a0063200020013b0061200041fc006a2003290000370000200041f5006a2004290300370000200020022903b00937006d20004184016a201b3a000020004187016a20052d00003a0000200020022f01ac093b0085012000418c016a201c36020020004188016a2021360200200041a0016a200729030037020020004198016a202b29030037020020004190016a200229039009370200200041a8016a20253a0000200041ab016a202c2d00003a0000200020022f018c093b00a901200041b0016a2026360200200041ac016a2019360200200041c4016a202e290300370200200041bc016a202d290300370200200041b4016a20022903f008370200200041cc016a20243a0000200041cf016a202f2d00003a0000200020022f01ec083b00cd01200041d4016a2023360200200041d0016a2029360200200041e8016a2031290300370200200041e0016a2030290300370200200041d8016a20022903d00837020020004190026a203228020036020020004188026a203329030037020020004180026a2034290300370200200041f8016a2035290300370200200041f0016a20022903a8083702002000202a3600a502200020283600a1022000201a36009d02200020133700950220004194026a20223a0000200041ab026a20362d00003a0000200020022f01a4083b00a9020c1c0b20024188066a411f6a200241c00d6a411f6a28000036000020024188066a41186a200241c00d6a41186a2903003703000240200c450d00200c41c4006c2104200641286a210103400240200141786a2d00004101470d002001280200450d002001417c6a28020010260b200141c4006a2101200441bc7f6a22040d000b0b20022802c40b2201450d04200141c4006c450d04200610260c040b024020254101470d002026450d00201910260b0240201b4101470d00201c450d00202110260b024020184101470d00201e450d00201d10260b0240200941ff01714101470d002008450d00202c10260b0240200441ff01714101470d002003450d00200510260b0240200a422088a72201450d002006200141c8006c6a2104200621010340024020012d00004101470d00200141086a280200450d00200141046a28020010260b0240200141246a2d00004101470d002001412c6a280200450d00200141286a28020010260b200141c8006a22012004470d000b0b200aa72201450d03200141c8006c450d03200610260c030b200241003a00b4120b024020254101470d002026450d00201910260b0240201b4101470d00201c450d00202110260b024020184101470d00201e450d00201d10260b0240200941ff01714101470d002008450d00202c10260b0240200441ff01714101470d002003450d00200510260b0240200a422088a72201450d002006200141c8006c6a2104200621010340024020012d00004101470d00200141086a280200450d00200141046a28020010260b0240200141246a2d00004101470d002001412c6a280200450d00200141286a28020010260b200141c8006a22012004470d000b0b200aa72201450d01200141c8006c450d01200610260c010b02402003450d002006200341c8006c6a2104200621010340024020012d00004101470d00200141086a280200450d00200141046a28020010260b0240200141246a2d00004101470d002001412c6a280200450d00200141286a28020010260b200141c8006a22012004470d000b0b200228028c0c2201450d00200141c8006c450d00200610260b200041173602000c160b0340200110d501200141b0026a2101200441d07d6a22040d000b0b200228028c052201450d00200141b0026c450d00200610260b200041173602000c130b200aa7450d010b200910260b200041173602000c100b200041173602000c0f0b02402003450d002003410c6c21042008210103400240200141046a280200450d00200128020010260b2001410c6a2101200441746a22040d000b0b20022802f40f2201450d002001410c6c450d00200810260b200ba7450d00200910260b200041173602000c0c0b200041173602000c0b0b0340200110d6010240200141046a2802002203450d00200341246c450d00200128020010260b200141f0006a2101200441907f6a22040d000b0b200228028c052201450d00200141f0006c450d00200c10260b200041173602000c080b200020173e0029200020083b000a2000200d3a0009200041043602002000412f6a20174230883c00002000412d6a20174220883d0000200041d8006a2013370200200041d0006a2014370200200041c8006a2015370200200041c0006a2016370200200041386a2011370200200041306a2012370200200041286a200b3c0000200041206a2010370000200041186a200f370000200041106a200a3700002000410c6a2009360000200041086a20013a0000200041e0006a200241a0126a41d00110cf061a0c070b41002104410021010b200020063b0126200020013a0025200020073b00062000200c3a0005200020093a000420004103360200200041226a200a4230883c0000200041206a200a4220883d01002000411c6a200a3e0200200041146a200f3702002000410c6a200b370200200041286a2004360200200041236a20033b0000200041086a20053602002000412c6a200241a0126a41840210cf061a0c050b200041173602000c040b200041173602000c030b02402003450d00200341186c21042006210103400240200141046a280200450d00200128020010260b0240200141106a280200450d002001410c6a28020010260b200141186a2101200441686a22040d000b0b20022802f40f2201450d01200141186c450d010b200610260b200041173602000b200241d0146a24000b9f0401037f230041206b2202240002400240024002400240024002400240024020012d0000417f6a220341064b0d0020030e0701020304050607010b41bf80c700412841dcbcc700102f000b200141046a280200210320012d000121042002200141086a10c801200241106a200141146a10c801200020044101463a0001200041046a2003360200200041013a0000200041086a2002290300370200200041106a200241086a280200360200200041146a20022903103702002000411c6a200241106a41086a2802003602000c060b200041023a0000200041046a200141046a2802003602000c050b200041033a0000200041046a200141046a2802003602000c040b2002200141046a10c801200241106a200141106a10c801200041043a00002000410c6a200241086a280200360200200041046a2002290300370200200041106a2002290310370200200041186a200241106a41086a2802003602000c030b20002001290001370001200041c4006a200141c4006a280200360200200041096a200141096a290000370000200041116a200141116a290000370000200041196a200141196a290000370000200041216a200141216a290000370000200041296a200141296a290000370000200041316a200141316a290000370000200041396a200141396a290000370000200041053a00000c020b200041063a00000c010b200041073a0000200041046a200141046a2802003602000b200241206a24000bf20e06087f017e067f017e017f027e230041c0006b2203240002400240200128020c220441016a22052004490d00024002400240200520012802002206200641016a220741037641076c20064108491b22064101764d0d00024002402005200641016a2206200520064b1b22050d0041d09fc0002108410021094100210a0c010b0240024020054108490d000240200541ffffffff01712005470d00417f2005410374220541076e417f6a677641016a41012005410d4b1b21050c020b41ece1c000411c41dcbcc700102f000b4104410820054104491b21050b2005ad42d0007e220b422088a70d03200ba72206200541046a220c6a22082006490d03200810242208450d02200820066a220841ff01200c10d1061a2005417f6a2209200541037641076c20094108491b210a0b200141046a280200220d41046a210e200d20076a210f200d280200417f7341808182847871210c2002280200221041086a2111034002400240200c0d0002400340200e200f4f0d01200d41c07d6a210d200e2802002105200e41046a2206210e2005418081828478712205418081828478460d000b200541808182847873220c417f6a200c7121022006210e0c020b2001200436020c200041003602002001200a20046b3602082001280200210520012009360200200141046a2206280200210c200620083602002005450d07200c200541016aad42d0007ea76b10260c070b200c417f6a200c7121020b2011290300210b2010290300211241002105200341003602382003200b37033020032012370328200d4100200c684103766b41d0006c6a41b07f6a2213200341286a10b9022003290328220b200b200329033022128520128920032802384101461b220ba721060340200541046a22052006200971220c6a21062008200c6a280000418081828478712207450d000b02402008200768410376200c6a20097122056a2c00004100480d002008280200418081828478716841037621050b200820056a200ba741197622063a00002005417c6a20097120086a41046a20063a00002008410020056b41d0006c6a41b07f6a201341d00010cf061a2002210c0c000b0b4100210c200141046a2108410021060340024002400240200c410171450d00200641036a220520074f0d0120052006490d010c020b2006210520062007490d010b200141046a280200210502400240200128020041016a22064104490d00200520066a20052800003600000c010b200541046a2005200610d0061a0b4100210502402001280200220a417f460d00200141046a210d2002280200221041086a21114100210503400240200d2802002206200522136a2d0000418001470d00410020136b2104024003402011290300210b2010290300211241002105200341003602382003200b370330200320123703282006200441d0006c6a220f41b07f6a220e200341286a10b902200d2802002109200128020021082003290328220b200b200329033022128520128920032802384101461b220ba7220221060340200541046a22052006200871220c6a21062009200c6a280000418081828478712207450d000b02402009200768410376200c6a20087122056a2c00004100480d002009280200418081828478716841037621050b2005200820027122066b201320066b732008714104490d01200920056a22062d0000210c2006200ba741197622073a00002005417c6a20087120096a41046a20073a00000240200c41ff01460d00200d280200410020056b41d0006c6a220c41b07f6a2205290200210b2005200e290200370200200541186a220629020021122006200e41186a2208290200370200200541106a220629020021142006200e41106a2209290200370200200541086a220529020021152005200e41086a2206290200370200200e200b370200200620153702002009201437020020082012370200200c41506a220541186a2208290200210b2008200f41506a220641186a2209290200370200200541106a220829020021122008200641106a2207290200370200200541086a220829020021142008200641086a220e2902003702002005290200211520052006290200370200200620153702002009200b37020020072012370200200e2014370200200c41706a220541086a220c290000210b200c200f41706a220641086a22082900003700002005290000211220052006290000370000200620123700002008200b370000200d28020021060c010b0b200d280200220620136a41ff013a0000200620012802002013417c6a716a41046a41ff013a0000200d280200410020056b41d0006c6a41b07f6a200e41d00010cf061a0c010b200920136a200ba741197622053a000020082013417c6a7120096a41046a20053a00000b201341016a21052013200a470d000b20012802002205200541016a41037641076c20054108491b21050b2000410036020020012005200128020c6b3602080c050b200828020020056a220620062802002206410776417f73418182840871200641fffefdfb07726a3602004101210c200541016a21060c000b0b102c000b41ece1c000411c41dcbcc700102f000b41ece1c000411c41dcbcc700102f000b200341c0006a24000bea0804017f027e037f017e230041b0016b22022400200241a0016a200129030042adfed5e4d485fda8d8007e220342a0cbbf9599b5a19f0a7c2204200029021885200029020020048542adfed5e4d485fda8d8007e42178942adfed5e4d485fda8d8007e852000290208200342efcdddd088a580a21e7c8542adfed5e4d485fda8d8007e42178942adfed5e4d485fda8d8007e852000290210200342bed0fb8bf894dfa4327c8542adfed5e4d485fda8d8007e42178942adfed5e4d485fda8d8007e85420042adfed5e4d485fda8d800420010cc0620012001280210220541026a3602102001200241a8016a29030020022903a0017c2203370300024002402000280220220641244b0d00200041256a21070c010b2000412c6a2802002106200041286a28020021070b20024190016a20032006ad220485420042adfed5e4d485fda8d800420010cc062001200541036a360210200120022903900120047c20024190016a41086a2903007c42adfed5e4d485fda8d8007e2204370300024002400240200641084b0d00200641014b0d014200210302402006450d00200731000021030b20024180016a2003200485420042adfed5e4d485fda8d800420010cc062001200541046a220736021020024188016a2903002002290380017c21030c020b0240200641104b0d00200241d0006a2007290000200485420042adfed5e4d485fda8d800420010cc06200241c0006a200241d0006a41086a29030020022903507c200620076a41786a29000085420042adfed5e4d485fda8d800420010cc062001200541056a2207360210200241c0006a41086a29030020022903407c21030c020b200620076a41786a2900002108200421030340200729000020038542adfed5e4d485fda8d8007e42178942adfed5e4d485fda8d8007e2004852104200741086a2107200342cf829ebbefefde82147c2103200641786a220641084b0d000b200241306a2004200885420042adfed5e4d485fda8d800420010cc062001200541056a2207360210200241386a29030020022903307c21030c010b024020064104490d00200241e0006a200620076a417c6a350000422086200735000084200485420042adfed5e4d485fda8d800420010cc062001200541046a2207360210200241e8006a29030020022903607c21030c010b200241f0006a200620076a417f6a310000422086200733000084200485420042adfed5e4d485fda8d800420010cc062001200541046a2207360210200241f8006a29030020022903707c21030b2001200337030002400240200041cc006a31000022044200520d0020022003420042adfed5e4d485fda8d800420010cc062001200741016a360210200241086a29030020022903007c21030c010b200241206a2003200485420042adfed5e4d485fda8d800420010cc06200241106a200241206a41086a29030020022903207c200041cd006a31000085420042adfed5e4d485fda8d800420010cc062001200741026a360210200241106a41086a29030020022903107c21030b20012003370300200241b0016a24000b8e1104077f017e087f037e230041c0006b22032400024002400240200128020c220441016a22052004490d00200520012802002206200641016a220741037641076c20064108491b22064101764d0d0102400240024002402005200641016a2206200520064b1b22050d0041d09fc000210841002109410021050c010b0240024020054108490d000240200541ffffffff01712005470d00417f2005410374220541076e417f6a677641016a41012005410d4b1b21050c020b41ece1c000411c41dcbcc700102f000b4104410820054104491b21050b2005ad42307e220a422088a70d02200aa72206200541046a220b6a22082006490d02200810242208450d01200820066a220841ff01200b10d1061a2005417f6a2209200541037641076c20094108491b21050b200841506a210c200520046b210d200141046a280200220e41046a210f200e20076a2110200e280200417f7341808182847871211120022802002112034002400240024020110d000340200f20104f0d02200e41c07e6a210e200f2802002105200f41046a2206210f2005418081828478712205418081828478460d000b200541808182847873220b417f6a200b7121112006210f0c020b200e450d002011210b2011417f6a20117121110c010b2001200436020c2001200d360208200041003602002001280200210520012009360200200141046a2206280200210b200620083602002005450d06200b200541016aad42307ea76b10260c060b410021052003201229030042adfed5e4d485fda8d8007e220a42a0cbbf9599b5a19f0a7c2213200e4100200b684103766b41306c6a41506a220229001885200229000020138542adfed5e4d485fda8d8007e42178942adfed5e4d485fda8d8007e852002290008200a42efcdddd088a580a21e7c8542adfed5e4d485fda8d8007e42178942adfed5e4d485fda8d8007e852002290010200a42bed0fb8bf894dfa4327c8542adfed5e4d485fda8d8007e42178942adfed5e4d485fda8d8007e85420042adfed5e4d485fda8d800420010cc06201241086a290300220a200341086a29030020032903007c85200a89220aa721060340200541046a22052006200971220b6a21062008200b6a280000418081828478712207450d000b02402008200768410376200b6a20097122056a2c00004100480d002008280200418081828478716841037621050b200820056a200aa741197622063a00002005417c6a20097120086a41046a20063a0000200c410020056b41306c6a220541286a200241286a290200370200200541206a200241206a290200370200200541186a200241186a290200370200200541106a200241106a290200370200200541086a200241086a290200370200200520022902003702000c000b0b102c000b41ece1c000411c41dcbcc700102f000b41ece1c000411c41dcbcc700102f000b4100210b200141046a2108410021060340024002400240200b410171450d00200641036a220520074f0d0120052006490d010c020b2006210520062007490d010b200141046a280200210502400240200128020041016a22064104490d00200520066a20052800003600000c010b200541046a2005200610d0061a0b41002105024020012802002204417f460d0020022802002102200141046a210e4100210503400240200e2802002208200522116a2d0000418001470d00410020116b211202400340200341106a200229030042adfed5e4d485fda8d8007e220a42a0cbbf9599b5a19f0a7c22132008201241306c6a41506a220f29001885200f29000020138542adfed5e4d485fda8d8007e42178942adfed5e4d485fda8d8007e85200f290008200a42efcdddd088a580a21e7c8542adfed5e4d485fda8d8007e42178942adfed5e4d485fda8d8007e85200f290010200a42bed0fb8bf894dfa4327c8542adfed5e4d485fda8d8007e42178942adfed5e4d485fda8d8007e85420042adfed5e4d485fda8d800420010cc062001280200210941002105200241086a290300220a200341106a41086a29030020032903107c85200a89220aa7221021060340200541046a22052006200971220b6a21062008200b6a280000418081828478712207450d000b02402008200768410376200b6a20097122056a2c00004100480d002008280200418081828478716841037621050b2005200920107122066b201120066b732009714104490d01200820056a22062d0000210b2006200aa741197622073a00002005417c6a20097120086a41046a20073a00000240200b41ff01460d00200e280200410020056b41306c6a41506a2205290200210a2005200f290200370200200541186a220629020021132006200f41186a220b290200370200200541106a220629020021142006200f41106a2208290200370200200541086a220629020021152006200f41086a22092902003702002009201537020020082014370200200b2013370200200f200a370200200541286a2206290200210a2006200f41286a220b290200370200200529022021132005200f290220370220200f2013370220200b200a370200200e28020021080c010b0b200e280200220620116a41ff013a0000200620012802002011417c6a716a41046a41ff013a0000200e280200410020056b41306c6a41506a2205200f290200370200200541086a200f41086a290200370200200541106a200f41106a290200370200200541186a200f41186a290200370200200541206a200f41206a290200370200200541286a200f41286a2902003702000c010b200820116a200aa741197622053a000020092011417c6a7120086a41046a20053a00000b201141016a210520112004470d000b20012802002205200541016a41037641076c20054108491b21050b2000410036020020012005200128020c6b3602080c020b200828020020056a220620062802002206410776417f73418182840871200641fffefdfb07726a3602004101210b200541016a21060c000b0b200341c0006a24000b8d0401057f230041e0006b22022400200241918dc700410810fb01200241106a4188e2c000410710fb0102400240412010242203450d002002422037023420022003360230200241306a41004120106d20022802302203200228023822046a22052001290000370000200541086a200141086a290000370000200541106a200141106a290000370000200541186a200141186a2900003700002002200441206a2201360238200241c0006a2003200110bc02200241dc006a200320016a360200200220033602582002200241c0006a41106a3602542002200241c0006a360250200241206a200241d0006a107302402002280234450d00200310260b2002280228220341206a2205417f4c0d010240024020050d0041012101410021050c010b200510242201450d010b20002001360200200041086a220141003602002000200536020420004100411010c9012000280200200128020022056a220420022900003700002001200541106a2205360200200441086a200241086a29000037000020002005411010c9012000280200200128020022056a220420022900103700002001200541106a2206360200200441086a200241106a41086a2900003700002002280220210520002006200310c9012000280200200128020022006a2005200310cf061a2001200020036a36020002402002280224450d00200510260b200241e0006a24000f0b1033000b1034000b2c0020002002ad4220862001ad8410102201290000370000200041086a200141086a290000370000200110260b13002000410f360204200041c8e3c0003602000b3400200041918dc70036020420004100360200200041146a4104360200200041106a41e4a2c100360200200041086a42083702000b0b0020004108410010c0020ba10302037f027e0240024020024106744104722203417f4c0d00200310242204450d012000200336020420002004360200200041086a220341003602002000200210a10102402002450d002002410674210203400240024020012903004201510d00200020032802004101106d2000280200200328020022046a41003a0000200441016a21040c010b200020032802004101106d2000280200200328020022046a41013a00002003200441016a2204360200200020044120106d2000280200200328020022056a2204200141206a290000370000200441086a200141286a290000370000200441106a200141306a290000370000200441186a200141386a2900003700002003200541206a2204360200200141086a2903002106200141106a2903002107200020044110106d2000280200200328020022046a22052007370008200520063700002003200441106a2204360200200141186a2903002106200020044108106d2000280200200328020022046a2006370000200441086a21040b200141c0006a210120032004360200200241406a22020d000b0b0f0b1034000b1033000b5901037f02404114102422020d001033000b2000421437020420002002360200200041004110106d2000280200200041086a220228020022036a22044200370008200442003700002002200341106a3602002000410010a1010b860101027f230041d0006b22022400200241063a00280240410110242203450d002000420137020420002003360200200041004101106d2000280200200041086a220028020022036a41003a00002000200341016a360200024020022d00284101470d00200241306a280200450d002002412c6a28020010260b200241d0006a24000f0b1033000b990101027f230041c0026b22022400200241a4026a41023a00000240410110242203450d002000420137020420002003360200200041004101106d2000280200200041086a220028020022036a41003a00002000200341016a360200024020022d00a4024102460d000240200241146a28020041ffffff3f71450d00200228021010260b2002411c6a10c4020b200241c0026a24000f0b1033000b930301027f024020002802082201450d0020002802002202200141c8006c6a21010340024020022d00004101470d00200241086a280200450d00200241046a28020010260b0240200241246a2d00004101470d002002412c6a280200450d00200241286a28020010260b200241c8006a22022001470d000b0b0240200041046a2802002202450d00200241c8006c450d00200028020010260b024020002d000c4101470d00200041146a280200450d00200041106a28020010260b024020002d00304101470d00200041386a280200450d00200041346a28020010260b024020002d00544101470d00200041dc006a280200450d00200041d8006a28020010260b024020002d00784101470d0020004180016a280200450d00200041fc006a28020010260b024020002d009c014101470d00200041a4016a280200450d00200041a0016a28020010260b024020002d00c0014101470d00200041c8016a280200450d00200041c4016a28020010260b024020002d00e4014101470d00200041ec016a280200450d00200041e8016a28020010260b0b130020004106360204200041f4acc1003602000b4901017f02404104102422020d001033000b2000420437020420002002360200200041004104106d2000280200200041086a220028020022026a41143600002000200241046a3602000b4a01017f02404104102422020d001033000b2000420437020420002002360200200041004104106d2000280200200041086a220028020022026a41e4003600002000200241046a3602000b5701027f02404110102422020d001033000b2000421037020420002002360200200041004110106d2000280200200041086a220028020022026a2203420037000820034280c0a8ca9a3a3700002000200241106a3602000b5801027f02404110102422020d001033000b2000421037020420002002360200200041004110106d2000280200200041086a220028020022026a2203420037000820034280d0f29ce1c8003700002000200241106a3602000b5801027f02404110102422020d001033000b2000421037020420002002360200200041004110106d2000280200200041086a220028020022026a2203420037000820034280c0caf384a3023700002000200241106a3602000bb00302027f027e02402000280200220241064b0d00024002400240024002400240024020020e0700010203040506000b2001200141086a22002802004101106d2001280200200028020022016a41003a00002000200141016a3602000f0b2001200141086a22022802004101106d2001280200200228020022036a41013a00002002200341016a2203360200200041106a290300210420002903082105200120034110106d2001280200200228020022016a22002004370008200020053700002002200141106a3602000f0b2001200141086a22002802004101106d2001280200200028020022016a41023a00002000200141016a3602000f0b2001200141086a22002802004101106d2001280200200028020022016a41033a00002000200141016a3602000f0b2001200141086a22002802004101106d2001280200200028020022016a41043a00002000200141016a3602000f0b2001200141086a22002802004101106d2001280200200028020022016a41053a00002000200141016a3602000f0b2001200141086a22002802004101106d2001280200200028020022016a41063a00002000200141016a3602000b0bb00b010b7f230041e0006b22022400200241003a00380240024002400240024002400240024002400240024020012802002203280204220420044100472205490d00200241386a20032802002206200510cf061a2003200420056b3602042003200620056a360200024020040d0041002107200241056a2103200241086a21042002411c6a21050c070b200241056a2103200241086a21042002411c6a210520022d0038220841254b0d014100210720080e260601010101010101010101010101010101010101010101010101010101010101010102030405060b200041063a00000c090b02402008417f6a220641ff01714121490d00200041063a00000c090b0240024020060d00410021094101210a0c010b2006102a220a450d06200621090b200a200128020022012802002001280204220b2006200b2006491b220810cf06210c200128020422072008490d062001200720086b3602042001200128020020086a36020041012107200b20064f0d04200c20086a22014100200c20066a20016b10d1061a0c040b200241386a200110cd0241022107200241346a41026a220120022d003b3a0000200241206a41086a2208200241d0006a290300370300200241206a41106a220b200241d8006a2d00003a0000200220022f00393b01342002200241386a41106a290300370320024020022d00384101460d00200241386a41086a2802002109200241c4006a2802002106200228023c210a2002411c6a41026a20012d00003a0000200241086a41086a2008290300370300200241086a41106a200b2d00003a0000200220022f01343b011c200220022903203703080c040b200041063a00000c070b200241386a200110cd02200241346a41026a220120022d003b3a0000200241206a41086a2207200241d0006a290300370300200241206a41106a2208200241d8006a2d00003a0000200220022f00393b01342002200241386a41106a290300370320024020022d00384101460d00200241386a41086a2802002109200241c4006a2802002106200228023c210a2002411c6a41026a20012d00003a0000200241086a41086a2007290300370300200241086a41106a20082d00003a0000200220022f01343b011c20022002290320370308410321070c030b200041063a00000c060b200241386a200110cd02200241346a41026a220120022d003b3a0000200241206a41086a2207200241d0006a290300370300200241206a41106a2208200241d8006a2d00003a0000200220022f00393b01342002200241386a41106a290300370320024020022d00384101460d00200241386a41086a2802002109200241c4006a2802002106200228023c210a2002411c6a41026a20012d00003a0000200241086a41086a2007290300370300200241086a41106a20082d00003a0000200220022f01343b011c20022002290320370308410421070c020b200041063a00000c050b200241386a200110cd02200241346a41026a220120022d003b3a0000200241206a41086a2207200241d0006a290300370300200241206a41106a2208200241d8006a2d00003a0000200220022f00393b01342002200241386a41106a29030037032020022d00384101460d03200241386a41086a2802002109200241c4006a2802002106200228023c210a2002411c6a41026a20012d00003a0000200241086a41086a2007290300370300200241086a41106a20082d00003a0000200220022f01343b011c20022002290320370308410521070b200020073a0000200020052f00003b00012000410c6a2006360000200041086a2009360000200041046a200a360000200041106a2004290000370000200041216a20032f00003b0000200041036a200541026a2d00003a0000200041186a200441086a290000370000200041206a200441106a2d00003a0000200041236a200341026a2d00003a00000c030b1033000b2008200741b8afc0001048000b200041063a00000b200241e0006a24000bb90202067f047e230041f0006b22022400200241003a002841002103024002400340200241003a003020012802002204280204220520054100472206490d01200241306a20042802002207200610cf061a2004200520066b3602042004200720066a360200024020050d00200241003a00300b200241086a20036a20022d00303a00002002200341016a22033a002820034120470d000b200241306a41086a200241086a41086a2903002208370300200241306a41106a200241086a41106a2903002209370300200241306a41186a200241086a41186a290300220a37030020022002290308220b370330200041196a200a370000200041116a2009370000200041096a20083700002000200b370001200041003a00000c010b200041013a0000200341ff0171450d00200241003a00280b200241f0006a24000bd61405067f017e027f017e017f23004190016b2202240002400240024002400240024002400240024002400240200128020022032802042204450d00200328020022052d0000210620032004417f6a3602042003200541016a360200200641254b0d014100210720060e260601010101010101010101010101010101010101010101010101010101010101010102030405060b200041063a00000c090b02402006417f6a41ff01714121490d00200041063a00000c090b024002402006417f6a22030d0041002105410121040c010b2003102a2204450d06200321050b0240200128020022012802042003490d0020042001280200200310cf061a200128020422062003490d072001200620036b3602042001200128020020036a360200410121070c050b200041063a00002005450d08200410260c080b41002103200241003a0058024002400340200128020022062802042204450d01200241386a20036a200628020022052d00003a000020062004417f6a3602042006200541016a3602002002200341016a22033a005820034120470d000b200241f4006a41026a220120022d003a22033a00002002418c016a41026a220620033a0000200241f8006a41086a2207200241cf006a2900002208370300200241f8006a41106a2209200241d7006a2d0000220a3a0000200220022f013822033b0174200220033b018c0120022002290047220b370378200228003b2104200228003f210520022800432103200241e0006a41106a220c200a3a0000200241e0006a41086a220a20083703002002200b370360200620012d00003a0000200220022f01743b018c012009200c2d00003a00002007200a29030037030020022002290360370378410021010c010b0240200341ff0171450d00200241003a00580b410121010b41022107200241346a41026a22062002418c016a41026a2d00003a0000200241206a41086a2209200241f8006a41086a290300370300200241206a41106a220a200241f8006a41106a2d00003a0000200220022f018c013b013420022002290378370320024020010d002002411c6a41026a20062d00003a0000200241086a41086a2009290300370300200241086a41106a200a2d00003a0000200220022f01343b011c200220022903203703080c040b200041063a00000c070b41002103200241003a0058024002400340200128020022062802042204450d01200241386a20036a200628020022052d00003a000020062004417f6a3602042006200541016a3602002002200341016a22033a005820034120470d000b200241f4006a41026a220120022d003a22033a00002002418c016a41026a220620033a0000200241f8006a41086a2207200241cf006a2900002208370300200241f8006a41106a2209200241d7006a2d0000220a3a0000200220022f013822033b0174200220033b018c0120022002290047220b370378200228003b2104200228003f210520022800432103200241e0006a41106a220c200a3a0000200241e0006a41086a220a20083703002002200b370360200620012d00003a0000200220022f01743b018c012009200c2d00003a00002007200a29030037030020022002290360370378410021010c010b0240200341ff0171450d00200241003a00580b410121010b200241346a41026a22062002418c016a41026a2d00003a0000200241206a41086a2207200241f8006a41086a290300370300200241206a41106a2209200241f8006a41106a2d00003a0000200220022f018c013b013420022002290378370320024020010d002002411c6a41026a20062d00003a0000200241086a41086a2007290300370300200241086a41106a20092d00003a0000200220022f01343b011c20022002290320370308410321070c030b200041063a00000c060b41002103200241003a0058024002400340200128020022062802042204450d01200241386a20036a200628020022052d00003a000020062004417f6a3602042006200541016a3602002002200341016a22033a005820034120470d000b200241f4006a41026a220120022d003a22033a00002002418c016a41026a220620033a0000200241f8006a41086a2207200241cf006a2900002208370300200241f8006a41106a2209200241d7006a2d0000220a3a0000200220022f013822033b0174200220033b018c0120022002290047220b370378200228003b2104200228003f210520022800432103200241e0006a41106a220c200a3a0000200241e0006a41086a220a20083703002002200b370360200620012d00003a0000200220022f01743b018c012009200c2d00003a00002007200a29030037030020022002290360370378410021010c010b0240200341ff0171450d00200241003a00580b410121010b200241346a41026a22062002418c016a41026a2d00003a0000200241206a41086a2207200241f8006a41086a290300370300200241206a41106a2209200241f8006a41106a2d00003a0000200220022f018c013b013420022002290378370320024020010d002002411c6a41026a20062d00003a0000200241086a41086a2007290300370300200241086a41106a20092d00003a0000200220022f01343b011c20022002290320370308410421070c020b200041063a00000c050b41002103200241003a0058024002400340200128020022062802042204450d01200241386a20036a200628020022052d00003a000020062004417f6a3602042006200541016a3602002002200341016a22033a005820034120470d000b200241f4006a41026a220120022d003a22033a00002002418c016a41026a220620033a0000200241f8006a41086a2207200241cf006a2900002208370300200241f8006a41106a2209200241d7006a2d0000220a3a0000200220022f013822033b0174200220033b018c0120022002290047220b370378200228003b2104200228003f210520022800432103200241e0006a41106a220c200a3a0000200241e0006a41086a220a20083703002002200b370360200620012d00003a0000200220022f01743b018c012009200c2d00003a00002007200a29030037030020022002290360370378410021010c010b0240200341ff0171450d00200241003a00580b410121010b200241346a41026a22062002418c016a41026a2d00003a0000200241206a41086a2207200241f8006a41086a290300370300200241206a41106a2209200241f8006a41106a2d00003a0000200220022f018c013b01342002200229037837032020010d032002411c6a41026a20062d00003a0000200241086a41086a2007290300370300200241086a41106a20092d00003a0000200220022f01343b011c20022002290320370308410521070b200020073a0000200020022f011c3b00012000410c6a2003360000200041086a2005360000200041046a2004360000200041106a2002290308370000200041216a20022f00053b0000200041036a2002411c6a41026a2d00003a0000200041186a200241086a41086a290300370000200041206a200241086a41106a2d00003a0000200041236a200241056a41026a2d00003a00000c030b1033000b2003200641b8afc0001048000b200041063a00000b20024190016a24000bd21505097f017e017f017e017f23004190016b220224000240024002400240024002400240024002400240024020012802042203450d00200128020022042d0000210520012003417f6a22063602042001200441016a360200200541254b0d014100210720050e260601010101010101010101010101010101010101010101010101010101010101010102030405060b200041063a00000c090b02402005417f6a41ff01714121490d00200041063a00000c090b024002402005417f6a22080d00410021094101210a0c010b2008102a220a450d0620012802042106200821090b024020062008490d00200a2001280200200810cf061a200128020422052008490d072001200520086b3602042001200128020020086a360200410121070c050b200041063a00002009450d08200a10260c080b41002105200241003a00582003417f6a21082003417e6a210302400240034020082005460d01200241386a20056a200420056a220741016a2d00003a0000200120033602042001200741026a3602002002200541016a22073a00582003417f6a21032007210520074120470d000b200241f4006a41026a220420022d003a22013a00002002418c016a41026a220320013a0000200241f8006a41086a2206200241cf006a290000220b370300200241f8006a41106a220c200241d7006a2d000022013a0000200220022f013822053b0174200220053b018c0120022002290047220d370378200228003b210a200228003f210920022800432108200241e0006a41106a220520013a0000200241e0006a41086a220e200b3703002002200d37036041012101200741ff01714120490d01200320042d00003a00002006200e290300370300200c20052d00003a0000200220022f01743b018c0120022002290360370378410021010c010b0240200541ff0171450d00200241003a00580b410121010b41022107200241346a41026a22052002418c016a41026a2d00003a0000200241206a41086a2204200241f8006a41086a290300370300200241206a41106a2203200241f8006a41106a2d00003a0000200220022f018c013b013420022002290378370320024020010d002002411c6a41026a20052d00003a0000200241086a41086a2004290300370300200241086a41106a20032d00003a0000200220022f01343b011c200220022903203703080c040b200041063a00000c070b41002105200241003a00582003417f6a21082003417e6a210302400240034020082005460d01200241386a20056a200420056a220741016a2d00003a0000200120033602042001200741026a3602002002200541016a22073a00582003417f6a21032007210520074120470d000b200241f4006a41026a220420022d003a22013a00002002418c016a41026a220320013a0000200241f8006a41086a2206200241cf006a290000220b370300200241f8006a41106a220c200241d7006a2d000022013a0000200220022f013822053b0174200220053b018c0120022002290047220d370378200228003b210a200228003f210920022800432108200241e0006a41106a220520013a0000200241e0006a41086a220e200b3703002002200d37036041012101200741ff01714120490d01200320042d00003a00002006200e290300370300200c20052d00003a0000200220022f01743b018c0120022002290360370378410021010c010b0240200541ff0171450d00200241003a00580b410121010b200241346a41026a22052002418c016a41026a2d00003a0000200241206a41086a2204200241f8006a41086a290300370300200241206a41106a2203200241f8006a41106a2d00003a0000200220022f018c013b013420022002290378370320024020010d002002411c6a41026a20052d00003a0000200241086a41086a2004290300370300200241086a41106a20032d00003a0000200220022f01343b011c20022002290320370308410321070c030b200041063a00000c060b41002105200241003a00582003417f6a21082003417e6a210302400240034020082005460d01200241386a20056a200420056a220741016a2d00003a0000200120033602042001200741026a3602002002200541016a22073a00582003417f6a21032007210520074120470d000b200241f4006a41026a220420022d003a22013a00002002418c016a41026a220320013a0000200241f8006a41086a2206200241cf006a290000220b370300200241f8006a41106a220c200241d7006a2d000022013a0000200220022f013822053b0174200220053b018c0120022002290047220d370378200228003b210a200228003f210920022800432108200241e0006a41106a220520013a0000200241e0006a41086a220e200b3703002002200d37036041012101200741ff01714120490d01200320042d00003a00002006200e290300370300200c20052d00003a0000200220022f01743b018c0120022002290360370378410021010c010b0240200541ff0171450d00200241003a00580b410121010b200241346a41026a22052002418c016a41026a2d00003a0000200241206a41086a2204200241f8006a41086a290300370300200241206a41106a2203200241f8006a41106a2d00003a0000200220022f018c013b013420022002290378370320024020010d002002411c6a41026a20052d00003a0000200241086a41086a2004290300370300200241086a41106a20032d00003a0000200220022f01343b011c20022002290320370308410421070c020b200041063a00000c050b41002105200241003a00582003417f6a21082003417e6a210302400240034020082005460d01200241386a20056a200420056a220741016a2d00003a0000200120033602042001200741026a3602002002200541016a22073a00582003417f6a21032007210520074120470d000b200241f4006a41026a220420022d003a22013a00002002418c016a41026a220320013a0000200241f8006a41086a2206200241cf006a290000220b370300200241f8006a41106a220c200241d7006a2d000022013a0000200220022f013822053b0174200220053b018c0120022002290047220d370378200228003b210a200228003f210920022800432108200241e0006a41106a220520013a0000200241e0006a41086a220e200b3703002002200d37036041012101200741ff01714120490d01200320042d00003a00002006200e290300370300200c20052d00003a0000200220022f01743b018c0120022002290360370378410021010c010b0240200541ff0171450d00200241003a00580b410121010b200241346a41026a22052002418c016a41026a2d00003a0000200241206a41086a2204200241f8006a41086a290300370300200241206a41106a2203200241f8006a41106a2d00003a0000200220022f018c013b01342002200229037837032020010d032002411c6a41026a20052d00003a0000200241086a41086a2004290300370300200241086a41106a20032d00003a0000200220022f01343b011c20022002290320370308410521070b200020073a0000200020022f011c3b00012000410c6a2008360000200041086a2009360000200041046a200a360000200041106a2002290308370000200041216a20022f00053b0000200041036a2002411c6a41026a2d00003a0000200041186a200241086a41086a290300370000200041206a200241086a41106a2d00003a0000200041236a200241056a41026a2d00003a00000c030b1033000b2008200541b8afc0001048000b200041063a00000b20024190016a24000be94504037f017e247f027e230041f0046b22022400024002400240024002400240024002400240024002400240024002400240024002400240024020012d0000417f6a2203410e4b0d0020030e0f0102030405060708090a0b0c0d0e0f010b41bf80c700412841dcbcc700102f000b200041013a000020002001290001370001200041196a200141196a290000370000200041116a200141116a290000370000200041096a200141096a2900003700000c0e0b2001410c6a2802002204ad42c8007e2205422088a70d0e2005a72203417f4c0d0e200141046a28020021060240024020030d00410421070c010b200310242207450d100b41002108200241003602c802200220073602c0022002200341c8006e3602c402200241c0026a4100200410ef0120022802c802210902402004450d002006200441c8006c6a210a20022802c002200941c8006c6a21032009200441037441786a4103766a41016a2109200241b0046a410372210b200241d0046a410372210c0340410021044100210702400240024002400240024020062d00000e06050102030400050b200241d0046a41186a200641196a290000370300200241d0046a41106a200641116a290000370300200241d0046a41086a200641096a2900003703002002200641016a2900003703d004410521070c040b200241f0036a200641046a10c801200c41086a200241f0036a41086a280200360000200c20022903f003370000410121070c030b200241d0046a41186a200641196a290000370300200241d0046a41106a200641116a290000370300200241d0046a41086a200641096a2900003703002002200641016a2900003703d004410221070c020b200241d0046a41186a200641196a290000370300200241d0046a41106a200641116a290000370300200241d0046a41086a200641096a2900003703002002200641016a2900003703d004410321070c010b200241d0046a41186a200641196a290000370300200241d0046a41106a200641116a290000370300200241d0046a41086a200641096a2900003703002002200641016a2900003703d004410421070b024002400240024002400240200641246a2d00000e06050102030400050b200241b0046a41186a2006413d6a290000370300200241b0046a41106a200641356a290000370300200241b0046a41086a2006412d6a2900003703002002200641256a2900003703b004410521040c040b200241f0036a200641286a10c801200b41086a200241f0036a41086a280200360000200b20022903f003370000410121040c030b200241b0046a41186a2006413d6a290000370300200241b0046a41106a200641356a290000370300200241b0046a41086a2006412d6a2900003703002002200641256a2900003703b004410221040c020b200241b0046a41186a2006413d6a290000370300200241b0046a41106a200641356a290000370300200241b0046a41086a2006412d6a2900003703002002200641256a2900003703b004410321040c010b200241b0046a41186a2006413d6a290000370300200241b0046a41106a200641356a290000370300200241b0046a41086a2006412d6a2900003703002002200641256a2900003703b004410421040b200320073a0000200341016a20022903d004370000200341096a200241d0046a41086a290300370000200341116a200241d0046a41106a290300370000200341196a200241d0046a41186a290300370000200241a0036a41026a2d0000210720022f00a003210d200341246a20043a0000200341216a200d3b0000200341236a20073a0000200341256a20022903b0043700002003412d6a200241b0046a41086a290300370000200341356a200241b0046a41106a2903003700002003413d6a200241b0046a41186a290300370000200341c5006a20022f00f0033b0000200341c7006a200241f0036a41026a2d00003a0000200341c8006a2103200641c8006a2206200a470d000b0b200220093602c802024002400240024002400240200141106a2d00000e06050102030400050b200241e8026a200141296a290000370300200241d0026a41106a200141216a290000370300200241d8026a200141196a2900003703002002200141116a2900003703d002410521080c040b200241d0046a200141146a10c801200241db026a200241d8046a280200360000200220022903d0043700d302410121080c030b200241e8026a200141296a290000370300200241d0026a41106a200141216a290000370300200241d8026a200141196a2900003703002002200141116a2900003703d002410221080c020b200241e8026a200141296a290000370300200241d0026a41106a200141216a290000370300200241d8026a200141196a2900003703002002200141116a2900003703d002410321080c010b200241e8026a200141296a290000370300200241d0026a41106a200141216a290000370300200241d8026a200141196a2900003703002002200141116a2900003703d002410421080b4100210341002106024002400240024002400240200141346a2d00000e06050102030400050b20024190036a200141cd006a29000037030020024188036a200141c5006a29000037030020024180036a2001413d6a2900003703002002200141356a2900003703f802410521060c040b200241d0046a200141386a10c80120024183036a200241d8046a280200360000200220022903d0043700fb02410121060c030b20024190036a200141cd006a29000037030020024188036a200141c5006a29000037030020024180036a2001413d6a2900003703002002200141356a2900003703f802410221060c020b20024190036a200141cd006a29000037030020024188036a200141c5006a29000037030020024180036a2001413d6a2900003703002002200141356a2900003703f802410321060c010b20024190036a200141cd006a29000037030020024188036a200141c5006a29000037030020024180036a2001413d6a2900003703002002200141356a2900003703f802410421060b024002400240024002400240200141d8006a2d00000e06050102030400050b200241b8036a200141f1006a290000370300200241b0036a200141e9006a290000370300200241a8036a200141e1006a2900003703002002200141d9006a2900003703a003410521030c040b200241d0046a200141dc006a10c801200241ab036a200241d8046a280200360000200220022903d0043700a303410121030c030b200241b8036a200141f1006a290000370300200241b0036a200141e9006a290000370300200241a8036a200141e1006a2900003703002002200141d9006a2900003703a003410221030c020b200241b8036a200141f1006a290000370300200241b0036a200141e9006a290000370300200241a8036a200141e1006a2900003703002002200141d9006a2900003703a003410321030c010b200241b8036a200141f1006a290000370300200241b0036a200141e9006a290000370300200241a8036a200141e1006a2900003703002002200141d9006a2900003703a003410421030b4100210441002107024002400240024002400240200141fc006a2d00000e06050102030400050b200241e0036a20014195016a290000370300200241d8036a2001418d016a290000370300200241d0036a20014185016a2900003703002002200141fd006a2900003703c803410521070c040b200241d0046a20014180016a10c801200241d3036a200241d8046a280200360000200220022903d0043700cb03410121070c030b200241e0036a20014195016a290000370300200241d8036a2001418d016a290000370300200241d0036a20014185016a2900003703002002200141fd006a2900003703c803410221070c020b200241e0036a20014195016a290000370300200241d8036a2001418d016a290000370300200241d0036a20014185016a2900003703002002200141fd006a2900003703c803410321070c010b200241e0036a20014195016a290000370300200241d8036a2001418d016a290000370300200241d0036a20014185016a2900003703002002200141fd006a2900003703c803410421070b024002400240024002400240200141a0016a2d00000e06050102030400050b20024188046a200141b9016a29000037030020024180046a200141b1016a290000370300200241f8036a200141a9016a2900003703002002200141a1016a2900003703f003410521040c040b200241d0046a200141a4016a10c801200241fb036a200241d8046a280200360000200220022903d0043700f303410121040c030b20024188046a200141b9016a29000037030020024180046a200141b1016a290000370300200241f8036a200141a9016a2900003703002002200141a1016a2900003703f003410221040c020b20024188046a200141b9016a29000037030020024180046a200141b1016a290000370300200241f8036a200141a9016a2900003703002002200141a1016a2900003703f003410321040c010b20024188046a200141b9016a29000037030020024180046a200141b1016a290000370300200241f8036a200141a9016a2900003703002002200141a1016a2900003703f003410421040b4100210d4100210b02402001418c026a2d00004101470d00200241a0046a2001419d026a28000036020020024198046a20014195026a29000037030020022001418d026a290000370390044101210b0b024002400240024002400240200141c4016a2d00000e06050102030400050b200241c8046a200141dd016a290000370300200241c0046a200141d5016a290000370300200241b8046a200141cd016a2900003703002002200141c5016a2900003703b0044105210d0c040b200241d0046a200141c8016a10c801200241bb046a200241d8046a280200360000200220022903d0043700b3044101210d0c030b200241c8046a200141dd016a290000370300200241c0046a200141d5016a290000370300200241b8046a200141cd016a2900003703002002200141c5016a2900003703b0044102210d0c020b200241c8046a200141dd016a290000370300200241c0046a200141d5016a290000370300200241b8046a200141cd016a2900003703002002200141c5016a2900003703b0044103210d0c010b200241c8046a200141dd016a290000370300200241c0046a200141d5016a290000370300200241b8046a200141cd016a2900003703002002200141c5016a2900003703b0044104210d0b4100210a024002400240024002400240200141e8016a2d00000e06050102030400050b200241e8046a20014181026a290000370300200241e0046a200141f9016a290000370300200241d8046a200141f1016a2900003703002002200141e9016a2900003703d0044105210a0c040b20024190026a200141ec016a10c801200241db046a20024198026a28020036000020022002290390023700d3044101210a0c030b200241e8046a20014181026a290000370300200241e0046a200141f9016a290000370300200241d8046a200141f1016a2900003703002002200141e9016a2900003703d0044102210a0c020b200241e8046a20014181026a290000370300200241e0046a200141f9016a290000370300200241d8046a200141f1016a2900003703002002200141e9016a2900003703d0044103210a0c010b200241e8046a20014181026a290000370300200241e0046a200141f9016a290000370300200241d8046a200141f1016a2900003703002002200141e9016a2900003703d0044104210a0b200241b0026a41086a2201200241c0026a41086a28020036020020024190026a41086a220c200241d0026a41086a29030037030020024190026a41106a2209200241d0026a41106a29030037030020024190026a41186a220e200241d0026a41186a2903003703002002418c026a41026a220f200241cd026a41026a2d00003a0000200241e8016a41186a2210200241f8026a41186a290300370300200241e8016a41106a2211200241f8026a41106a290300370300200241e8016a41086a2212200241f8026a41086a290300370300200220022903c0023703b002200220022903d00237039002200220022f00cd023b018c02200220022903f8023703e801200241e4016a41026a2213200241f5026a41026a2d00003a0000200241c0016a41086a2214200241a0036a41086a290300370300200241c0016a41106a2215200241a0036a41106a290300370300200241c0016a41186a2216200241a0036a41186a290300370300200241bc016a41026a22172002419d036a41026a2d00003a000020024198016a41086a2218200241c8036a41086a29030037030020024198016a41106a2219200241c8036a41106a29030037030020024198016a41186a221a200241c8036a41186a290300370300200220022f00f5023b01e401200220022903a0033703c001200220022f009d033b01bc01200220022903c8033703980120024194016a41026a221b200241c5036a41026a2d00003a0000200241f0006a41186a221c200241f0036a41186a290300370300200241f0006a41106a221d200241f0036a41106a290300370300200241f0006a41086a221e200241f0036a41086a290300370300200241ec006a41026a221f200241ed036a41026a2d00003a0000200241086a41106a222020024190046a41106a280200360200200241086a41086a222120024190046a41086a290300370300200220022f00c5033b019401200220022903f003370370200220022f00ed033b016c2002200229039004370308200241c8006a41186a2222200241b0046a41186a290300370300200241c8006a41106a2223200241b0046a41106a290300370300200241c8006a41086a2224200241b0046a41086a290300370300200220022903b004370348200241c4006a41026a2225200241aa046a41026a2d00003a0000200220022f00aa043b0144200241206a41186a2226200241d0046a41186a290300370300200241206a41106a2227200241d0046a41106a290300370300200241206a41086a2228200241d0046a41086a290300370300200220022903d0043703202002411c6a41026a2229200241ad046a41026a2d00003a0000200220022f00ad043b011c200041106a20083a00002000410c6a2001280200360200200041046a20022903b002370200200041116a200229039002370000200041196a200c290300370000200041216a2009290300370000200041296a200e290300370000200041316a20022f018c023b0000200041336a200f2d00003a0000200041346a20063a0000200041cd006a2010290300370000200041c5006a20112903003700002000413d6a2012290300370000200041356a20022903e801370000200041d7006a20132d00003a0000200041d5006a20022f01e4013b0000200041d8006a20033a0000200041f1006a2016290300370000200041e9006a2015290300370000200041e1006a2014290300370000200041d9006a20022903c001370000200041fb006a20172d00003a0000200041f9006a20022f01bc013b0000200041fc006a20073a000020004195016a201a2903003700002000418d016a201929030037000020004185016a2018290300370000200041fd006a2002290398013700002000419f016a201b2d00003a00002000419d016a20022f0194013b0000200041a0016a20043a0000200041b9016a201c290300370000200041b1016a201d290300370000200041a9016a201e290300370000200041a1016a2002290370370000200041c3016a201f2d00003a0000200041c1016a20022f016c3b0000200041c4016a200d3a0000200041dd016a2022290300370000200041d5016a2023290300370000200041cd016a2024290300370000200041c5016a2002290348370000200041e7016a20252d00003a0000200041e5016a20022f01443b0000200041e8016a200a3a000020004181026a2026290300370000200041f9016a2027290300370000200041f1016a2028290300370000200041e9016a20022903203700002000418b026a20292d00003a000020004189026a20022f011c3b00002000418c026a200b3a00002000419d026a202028020036000020004195026a20212903003700002000418d026a2002290308370000200041a3026a200241d0046a41026a2d00003a0000200041a1026a20022f00d0043b0000200041023a00000c0d0b2001410c6a2802002203ad42c4007e2205422088a70d0d2005a72204417f4c0d0d200141046a28020021060240024020040d00410421010c010b200410242201450d0f0b200241003602d003200220013602c8032002200441c4006e3602cc03200241c8036a4100200310eb0120022802d003210402402003450d002006200341c4006c6a210b20022802c803200441c4006c6a2103200241b3046a2109200241a2036a210c0340200241d0046a41186a2207200641186a290200370300200241d0046a41106a220d200641106a290200370300200241d0046a41086a220a200641086a290200370300200220062902003703d00441002101024002400240024002400240200641206a2d00000e06050102030400050b200241b0046a41186a200641396a290000370300200241b0046a41106a200641316a290000370300200241b0046a41086a200641296a2900003703002002200641216a2900003703b004410521010c040b200241f0036a200641246a10c801200941086a200241f0036a41086a280200360000200920022903f003370000410121010c030b200241b0046a41186a200641396a290000370300200241b0046a41106a200641316a290000370300200241b0046a41086a200641296a2900003703002002200641216a2900003703b004410221010c020b200241b0046a41186a200641396a290000370300200241b0046a41106a200641316a290000370300200241b0046a41086a200641296a2900003703002002200641216a2900003703b004410321010c010b200241b0046a41186a200641396a290000370300200241b0046a41106a200641316a290000370300200241b0046a41086a200641296a2900003703002002200641216a2900003703b004410421010b200320022903d004370200200341186a2007290300370200200341106a200d290300370200200341086a200a290300370200200341206a20013a0000200341216a20022903b004370000200341296a200241b0046a41086a290300370000200341316a200241b0046a41106a290300370000200341396a200241b0046a41186a290300370000200341c1006a20022f00a0033b0000200341c3006a200c2d00003a0000200341c4006a2103200441016a2104200641c4006a2206200b470d000b0b200041033a0000200041046a20022903c8033702002000410c6a20043602000c0c0b200041043a00000c0b0b200041053a0000200041106a200141106a290300370300200041086a200141086a290300370300200041046a200141046a2802003602000c0a0b200041063a0000200041046a200141046a2802003602000c090b200041073a0000200041106a200141106a290300370300200041086a200141086a290300370300200041046a200141046a2802003602000c080b200041083a000020002001290001370001200041246a200141246a280200360200200041096a200141096a290000370000200041116a200141116a290000370000200041196a200141196a2900003700000c070b200041093a0000200041086a200141086a290300370300200041046a200141046a2802003602000c060b200141246a2802002103200241e8046a2206200141196a290000370300200241e0046a2204200141116a290000370300200241d8046a2207200141096a290000370300200220012900013703d004200141386a290300212a200141306a290300212b420621050240024002400240024002400240200141286a2802000e0700010203040506000b420021050c050b420121050c040b420221050c030b420321050c020b420421050c010b420521050b200020022903d0043700012000410a3a0000200041386a202a370300200041306a202b370300200041246a2003360200200041286a2005370300200041096a2007290300370000200041116a2004290300370000200041196a20062903003700000c050b2000410b3a000020002001290001370001200041196a200141196a290000370000200041116a200141116a290000370000200041096a200141096a2900003700000c040b200241b0046a41186a2206200141196a290000370300200241b0046a41106a2204200141116a290000370300200241b0046a41086a2207200141096a290000370300200220012900013703b00441002103024002400240024002400240200141246a2d00000e06050102030400050b200241d0046a41186a2001413d6a290000370300200241d0046a41106a200141356a290000370300200241d0046a41086a2001412d6a2900003703002002200141256a2900003703d004410521030c040b200241f0036a200141286a10c801200241db046a200241f0036a41086a280200360000200220022903f0033700d304410121030c030b200241d0046a41186a2001413d6a290000370300200241d0046a41106a200141356a290000370300200241d0046a41086a2001412d6a2900003703002002200141256a2900003703d004410221030c020b200241d0046a41186a2001413d6a290000370300200241d0046a41106a200141356a290000370300200241d0046a41086a2001412d6a2900003703002002200141256a2900003703d004410321030c010b200241d0046a41186a2001413d6a290000370300200241d0046a41106a200141356a290000370300200241d0046a41086a2001412d6a2900003703002002200141256a2900003703d004410421030b200020022903b004370001200041246a20033a0000200041256a20022903d004370000200041196a2006290300370000200041116a2004290300370000200041096a20072903003700002000412d6a200241d0046a41086a290300370000200041356a200241d0046a41106a2903003700002000413d6a200241d0046a41186a2903003700002000410c3a0000200041c7006a200241f2036a2d00003a0000200041c5006a20022f00f0033b00000c030b200241b0046a41186a2206200141196a290000370300200241b0046a41106a2204200141116a290000370300200241b0046a41086a2207200141096a290000370300200220012900013703b00441002103024002400240024002400240200141246a2d00000e06050102030400050b200241d0046a41186a2001413d6a290000370300200241d0046a41106a200141356a290000370300200241d0046a41086a2001412d6a2900003703002002200141256a2900003703d004410521030c040b200241f0036a200141286a10c801200241db046a200241f0036a41086a280200360000200220022903f0033700d304410121030c030b200241d0046a41186a2001413d6a290000370300200241d0046a41106a200141356a290000370300200241d0046a41086a2001412d6a2900003703002002200141256a2900003703d004410221030c020b200241d0046a41186a2001413d6a290000370300200241d0046a41106a200141356a290000370300200241d0046a41086a2001412d6a2900003703002002200141256a2900003703d004410321030c010b200241d0046a41186a2001413d6a290000370300200241d0046a41106a200141356a290000370300200241d0046a41086a2001412d6a2900003703002002200141256a2900003703d004410421030b200020022903b004370001200041246a20033a0000200041256a20022903d004370000200041196a2006290300370000200041116a2004290300370000200041096a20072903003700002000412d6a200241d0046a41086a290300370000200041356a200241d0046a41106a2903003700002000413d6a200241d0046a41186a2903003700002000410d3a0000200041c7006a200241f2036a2d00003a0000200041c5006a20022f00f0033b00000c020b2000410e3a000020002001290001370001200041196a200141196a290000370000200041116a200141116a290000370000200041096a200141096a2900003700000c010b2000410f3a00000b200241f0046a24000f0b1034000b1033000b130020004110360204200041ccc2c1003602000bfbe1010a077f037e047f017e017f017e017f027e0c7f037e230041a0126b220324000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012d00000e10000102030405060708090a0b0c0d0e0f000b200341b40f6a4101360200200342013702a40f200341dcedc6003602a00f200341043602e40c200341d4edc6003602e00c2003200341e00c6a3602b00f200341a00f6a41ecc0c700103d000b200341e00c6a41186a2204200141196a290000370300200341e00c6a41106a2205200141116a290000370300200341e00c6a41086a2206200141096a290000370300200320012900013703e00c200341a00f6a41206a200241206a290200370300200341a00f6a41186a200241186a290200370300200341a00f6a41106a200241106a290200370300200341a00f6a41086a200241086a290200370300200320022902003703a00f02400240200341a00f6a10d302450d00410221010c010b200341b00a6a10d402200341c8076a41186a2004290300370300200341c8076a41106a2005290300370300200341c8076a41086a2006290300370300200320032903e00c3703c807024020032802b80a220241134b0d00200341a00f6a41186a2207200341c8076a41186a290300370300200341a00f6a41106a2208200341c8076a41106a290300370300200341a00f6a41086a2204200341c8076a41086a290300370300200320032903c8073703a00f0240200220032802b40a2206470d00200341b00a6a200210f20120032802b40a210620032802b80a21020b20032802b00a220520024106746a2201420037030820014201370300200141106a4200370300200141186a4200370300200141206a20032903a00f370300200141286a2004290300370300200141306a2008290300370300200141386a20072903003703002003200241016a22013602b80a200341b8026a41186a22074200370300200341b8026a41106a22084200370300200341b8026a41086a22094200370300200342003703b802200341a00f6a41918dc700410810fb0120092004290000370300200320032900a00f3703b802200341a00f6a41a4a7c100410a10fb0120072004290000370300200820032900a00f370300200341a00f6a2005200110c002200341b8026a412020032802a00f220420032802a80f10b301024020032802a40f450d00200410260b0240200641ffffff1f71450d00200510260b200341ac0f6a2002360200200341a80f6a41063a0000200341093a00a00f200341a00f6a10870220032003280080083602a005200320034183086a2800003600a305200041186a41003a0000200041106a2001ad42e098177e42809ac9c6007c37030020004201370308200020032802a0053600192000411c6a20032800a305360000200042003703000c3d0b200341a00f6a410d10d502200341a80f6a280200210220032802a40f210420032802a00f210120032802b40a41ffffff1f71450d0020032802b00a10260b20032003280080083602a005200320034183086a2800003600a305200041186a41003a000020004200370308200020032802a0053600192000411c6a20032800a305360000200041286a2002360200200041246a2004360200200041206a2001360200200042013703000c3b0b200341b00a6a200141046a41a00210cf061a200341a00f6a41206a200241206a290200370300200341a00f6a41186a200241186a290200370300200341a00f6a41106a200241106a290200370300200341a00f6a41086a200241086a290200370300200320022902003703a00f200341e00c6a200341a00f6a10d602200341b8026a41086a2201200341e90c6a290000370300200341b8026a41106a2202200341f10c6a290000370300200341b8026a41186a2204200341f90c6a290000370300200320032900e10c3703b80202400240024020032d00e00c4101460d0020034180126a41186a200429030037030020034180126a41106a200229030037030020034180126a41086a2001290300370300200320032903b8023703801202400240024020032802b80a220141e4004b0d00200341106a2001ad220a42004280d0f29ce1c800420010cc0620034180086a20034180126a10d702200341a00f6a200328028008220120032802880810d802200341a0056a200341a00f6a41a40210cf061a200341b8026a41086a2202200341cd116a290000370300200341b8026a41106a2204200341d5116a290000370300200341b8026a41176a2205200341dc116a280000360000200320032900c5113703b802200341106a41086a290300210b2003290310210c20032d00c41122064102460d01200341f8026a200341a0056a41a40210cf061a200341d8026a41176a2005280000360000200341d8026a41106a2004290300370300200341d8026a41086a2002290300370300200320032903b8023703d8020240200328028408450d00200110260b200341a00f6a200341f8026a41a40210cf061a200341a00f6a41a4026a20063a0000200341c5116a20032903d802370000200341cd116a200341d8026a41086a290300370000200341d5116a200341d8026a41106a290300370000200341dc116a200341ef026a2800003600000240200341a00f6a41186a2802002207450d0020032802b00f210141002102410021040340024002400240200141086a2206280200417f6a220541054b0d00024020050e06000101010100000b20020d01410021020c020b200241016a21020c010b200420026b220520074f0d1620034180086a41186a2208200120024105746b220541186a220929030037030020034180086a41106a220d200541106a220e29030037030020034180086a41086a220f200541086a2210290300370300200320052903003703800820062903002111200141106a22122903002113200141186a221429030021152005200129030037030020092015370300200e201337030020102011370300201420082903003703002012200d2903003703002006200f29030037030020012003290380083703000b200141206a21012007200441016a2204470d000b2002417f6a20074f0d002003200720026b3602b80f0b200341bc0f6a220110c4022001200341b00a6a41a00210cf061a200341e00c6a200341a00f6a41c00210cf061a200341e00c6a41086a290300211320032903e00c21160c020b200341a00f6a410c10d50220032f00a10f20032d00a30f41107472210120032902a40f211120032d00a00f21020c030b0240200328028408450d00200110260b200341f80c6a410036020042002116200342003703e80c200342003703e00c200342083703f00c200341fc0c6a200341b00a6a41a00210cf061a420021130b2003200c4280c0caf384a3027c22113703e00c2003200b2011200c54ad7c22153703e80c024020112016582015201358201520135122011b0d00200341a00f6a20034180126a201120167d201520137d2011201654ad7d10d90220032d00a00f22024104460d0020032d00a30f411074210120032f00a10f210420032902a40f21110240200341f40c6a28020041ffffff3f71450d0020032802f00c10260b20042001722101200341fc0c6a10c4020c030b02402016201158201320155820011b0d00200320034180126a201620117d201320157d2016201154ad7d10da020b200341f80c6a3502002111200341a00f6a200341e00c6a41c00210cf061a20034180086a20034180126a10d7022003280280082201200328028808200341a00f6a10db020240200328028408450d00200110260b0240200341b40f6a28020041ffffff3f71450d0020032802b00f10260b200341a00f6a411c6a10c402200341a00f6a41086a41003a0000200341b10f6a20034180126a41086a290300370000200341b90f6a20034180126a41106a290300370000200341c10f6a20034180126a41186a290300370000200341093a00a00f200341a00f6a41096a200329038012370000200341a00f6a108702200320032800e0113602c8072003200341e3116a2800003600cb07200041186a41003a0000200041106a201142e0b60d7e200a42e0c6db007e7c428098f6d3007c37030020004201370308200020032802c8073600192000411c6a20032800cb07360000200042003703000c3d0b410221020b200341b00a6a10c4020b200320032800e0113602c8072003200341e3116a2800003600cb07200041236a20014110763a0000200020013b0021200041186a41003a000020004200370308200020032802c8073600192000411c6a20032800cb0736000020002011370024200041206a20023a0000200042013703000c3a0b2001410c6a2802002107200141086a2802002108200141046a2802002117200341a00f6a41206a200241206a290200370300200341a00f6a41186a200241186a290200370300200341a00f6a41106a200241106a290200370300200341a00f6a41086a200241086a290200370300200320022902003703a00f200341e00c6a200341a00f6a10d602200341c8076a41086a2201200341e90c6a290000370300200341c8076a41106a2202200341f10c6a290000370300200341c8076a41186a2204200341f90c6a290000370300200320032900e10c3703c807024020032d00e00c4101460d0020034180086a41186a200429030037030020034180086a41106a200229030037030020034180086a41086a2001290300370300200320032903c80737038008200341a00f6a20034180086a10d702200341c0006a20032802a00f220220032802a80f41d4c0c7004100410010810220032802402101024020032802a40f450d00200210260b20014101470d36200741e4004b0d0e200341e00c6a20034180086a10dc02200341a00f6a20032802e00c220120032802e80c10dd02200341a00f6a41086a290300211520032802b00f211820032903a00f210c20032902b40f2111024020032802e40c450d00200110260b2011420020181b21162018410120181b2119200341306a2007ad42004280c0a8ca9a3a420010cc06200341306a41086a2903002111200329033021130240200741c4006c2205450d00200341cc0f6a2101200341c10f6a2104201721020340200341e00c6a200210bb02200341a00f6a20032802e00c220920032802e80c10de02200341b8026a41086a220d200341a00f6a41086a220e290300370300200341b8026a41106a220f200341a00f6a41106a2210290300370300200341b8026a41186a2212200341a00f6a41186a221429030037030020034180026a41026a221a200441026a221b2d00003a0000200341d8026a41086a221c200141086a221d290000370300200341d8026a41106a221e200141106a221f290000370300200320032903a00f3703b802200320042f00003b018002200320012900003703d8020240024020032d00c00f22064106460d0020032802c80f212020032802c40f2121200341c8076a41186a22222012290300370300200341c8076a41106a2212200f290300370300200341c8076a41086a220f200d290300370300200341f8016a41026a220d201a2d00003a0000200341e8076a41086a221a201c290300370300200341e8076a41106a221c201e290300370300200320032903b8023703c807200320032f0180023b01f801200320032903d8023703e807024020032802e40c450d00200910260b200420032f01f8013b0000200120032903e8073700002014202229030037030020102012290300370300200e200f290300370300201b200d2d00003a0000201d201a290300370000201f201c290300370000200320032903c8073703a00f200320203602c80f200320213602c40f200320063a00c00f200341a00f6a20034180086a412010d2062109024020064101470d002020450d00202110260b2009450d01200341a00f6a410e10d50220032f00a10f20032d00a30f41107472210420032902a40f211120032d00a00f21050c3c0b20032802e40c450d00200910260b200241c4006a2102200541bc7f6a22050d000b0b0240200c420020181b220c20135422022015420020181b2215201154201520115122011b450d00200341a00f6a20034180086a2013200c7d201120157d2013200c54ad7d10d90220032d00a00f22054104460d0020032f00a10f20032d00a30f41107472210420032902a40f21110c390b0240200c201358201520115820011b0d00200341206a20034180086a200c20137d201520117d2002ad7d10da020b024020164220882215a72201450d0020014105742102201921010340200341a00f6a200110bb0220032802a00f220420032802a80f10ff01024020032802a40f450d00200410260b200141206a2101200241606a22020d000b0b2003410036028812200342013703801220034180126a4100200741c4006c220141c4006d22021093012003280288122106200328028012211b0240024020010d00201721040c010b201720016a211a201b20064105746a210220062007410274417c6a4102766a41016a211c200341a00f6a41216a2104200341e00c6a411f6a21072017210102400340200341a0056a41186a2209200141186a290200370300200341a0056a41106a220d200141106a290200370300200341a0056a41086a220e200141086a290200370300200320012902003703a005200141206a2d00002105200341e00c6a41086a220f200141296a290000370300200341e00c6a41106a2210200141316a290000370300200341e00c6a41186a2212200141396a2900003703002007200141c0006a2800003600002003200141216a2900003703e00c024020054106470d00200141c4006a21040c020b200341b00a6a41186a22142009290300370300200341b00a6a41106a2209200d290300370300200341b00a6a41086a220d200e290300370300200320032903a0053703b00a200341a00f6a41186a20034180086a41186a290300370300200341a00f6a41106a20034180086a41106a290300370300200341a00f6a41086a20034180086a41086a29030037030020032003290380083703a00f200320053a00c00f200420032903e00c370000200441086a200f290300370000200441106a2010290300370000200441186a20122903003700002004411f6a2007280000360000200341f8026a200341b00a6a10bb0220032802f8022205200328028003200341a00f6a10df02024020032802fc02450d00200510260b024020032d00c00f4101470d0020032802c80f450d0020032802c40f10260b200220032903b00a370000200241186a2014290300370000200241106a2009290300370000200241086a200d290300370000200641016a2106200241206a2102200141c4006a2201201a470d000b201a2104201c21060b201a20046b220141c4006d21020b200320063602881202402001450d00200241c4006c2102200441286a210103400240200141786a2d00004101470d002001280200450d002001417c6a28020010260b200141c4006a2101200241bc7f6a22020d000b0b02402008450d00200841c4006c450d00201710260b2006ad210c02402006450d002003280284122108200341e00c6a20034180086a10dc0220064105744114722201417f4c0d1020032802e80c210920032802e00c2107200110242202450d11200341003602a80f200320013602a40f200320023602a00f200341a00f6a41004110106d20032802a00f20032802a80f22016a22022011370008200220133700002003200141106a3602a80f200341a00f6a200610a1012006410574210420032802a80f2102201b21010340200341a00f6a20024120106d20032802a00f220620032802a80f22056a22022001290000370000200241086a200141086a290000370000200241106a200141106a290000370000200241186a200141186a2900003700002003200541206a22023602a80f200141206a2101200441606a22040d000b200720092006200210b301024020032802a40f450d00200610260b024020032802e40c450d00200710260b0240200841ffffff3f71450d00201b10260b2015200c7c4280c2d72f7e201542a0cb98017e7c200c42a0eae1017e7c42c0c995d9007c21110c360b200341a00f6a20034180086a10dc0220032802a00f220120032802a80f10ff01024020032802a40f450d00200110260b2015200c7c4280c2d72f7e201542a0cb98017e7c200c42a0eae1017e7c42c0c995d9007c211120032802841241ffffff3f71450d35201b10260c350b410221050c380b200341a00f6a41206a200241206a290200370300200341a00f6a41186a200241186a290200370300200341a00f6a41106a200241106a290200370300200341a00f6a41086a200241086a290200370300200320022902003703a00f200341e00c6a200341a00f6a10d602200341b8026a41086a2201200341e90c6a290000370300200341b8026a41106a2202200341f10c6a290000370300200341b8026a41186a2204200341f90c6a290000370300200320032900e10c3703b8020240024020032d00e00c4101460d0020034180126a41186a200429030037030020034180126a41106a200229030037030020034180126a41086a2001290300370300200320032903b80237038012200341e00c6a20034180126a10dc02200341a00f6a20032802e00c220220032802e80c220410dd02024020032802b00f2201450d002002200410ff010b20032903a00f211320032902b40f2111200341a80f6a2903002116024020032802e40c450d00200210260b200341e0116a20034180126a10d702200341a00f6a20032802e011220220032802e811220510d802024020032d00c411220641024622040d002002200510ff010b2011420020011b21152001410120011b2105200341a0056a200341a00f6a41a40210cf061a200341b8026a41176a2207200341dc116a280000360000200341b8026a41106a2208200341d5116a290000370300200341b8026a41086a2209200341cd116a290000370300200320032900c5113703b802024020040d00200341f8026a200341a0056a41a40210cf061a200341d8026a41176a2007280000360000200341d8026a41106a2008290300370300200341d8026a41086a2009290300370300200320032903b8023703d802024020032802e411450d00200210260b2013420020011b210c2016420020011b210b200341b00a6a41066a200341f8026a41a40210cf061a20034180086a200341b00a6a41aa0210cf061a200341c8076a41176a2201200341d8026a41176a280000360000200341c8076a41106a2202200341d8026a41106a290300370300200341c8076a41086a2204200341d8026a41086a290300370300200320032903d8023703c807200341e00c6a20034180086a41066a41a40210cf061a200341e00c6a41a4026a20063a0000200341850f6a20032903c8073700002003418d0f6a2004290300370000200341950f6a20022903003700002003419c0f6a2001280000360000200341e00c6a41086a290300210a20032903e00c211620032802f00c210602400240200341f80c6a280200220741057422020d0042002111420021130c010b200641106a210142002111420021130340200141086a2903004200200141786a29030042015122041b20137c2001290300420020041b221320117c2211201354ad7c2113200141206a2101200241606a22020d000b0b200a200b7c2016200c7c220c201654ad7c20137c200c20117c2211200c54ad7c2113024020154220882216a72201450d0020014105742102200521010340200341a00f6a200110bb0220032802a00f220420032802a80f10ff01024020032802a40f450d00200410260b200141206a2101200241606a22020d000b0b200341c8006a20034180126a2011201310da02200341d80f6a2013370300200341d00f6a2011370300200341a00f6a41086a41013a0000200341b10f6a20034180126a41086a290300370000200341b90f6a20034190126a290300370000200341c10f6a20034198126a290300370000200341093a00a00f200341a00f6a41096a200329038012370000200341a00f6a1087022007ad42a08d067e201642c0d89e017e7c200341840d6a35020042a0f7367e7c20164280c2d72f7e7c2111200341fc0c6a21010240200341f40c6a28020041ffffff3f71450d00200610260b20114280ab988c017c2111200110c4020240201542ffffff3f83500d00200510260b20032003280088023602e80120032003418b026a2800003600eb01200041186a41003a0000200041106a201137030020004201370308200020032802e8013600192000411c6a20032800eb01360000200042003703000c3b0b024020032802e411450d00200210260b200341a00f6a410310d502200320032900a10f370398022003200341a80f6a28000036009f0220032d00a00f2101201542ffffff3f83500d01200510260c010b410221010b20032003280088023602e80120032003290398023703e8072003200328009f023600ef0720032003418b026a2800003600eb01200041186a41003a000020004200370308200020032802e8013600192000411c6a20032800eb01360000200041206a20013a0000200020032903e807370021200041286a20032800ef07360000200042013703000c380b200141106a2903002111200141086a2903002113200141046a2802002101200341a00f6a41206a200241206a290200370300200341a00f6a41186a200241186a290200370300200341a00f6a41106a200241106a290200370300200341a00f6a41086a200241086a290200370300200320022902003703a00f200341e00c6a200341a00f6a10d602200341b8026a41086a2202200341e90c6a290000370300200341b8026a41106a2204200341f10c6a290000370300200341b8026a41186a2205200341f90c6a290000370300200320032900e10c3703b8020240024020032d00e00c4101460d0020034180126a41186a200529030037030020034180126a41106a200429030037030020034180126a41086a2002290300370300200320032903b8023703801220034198026a10d40220032802980221040240024020032802a00220014d0d00200420014106746a22022903004201520d002002290308201356200241106a290300221320115620132011511b450d01200341a00f6a410510d50220032f00a10f20032d00a30f4110747221010c330b200341a00f6a410410d50220032f00a10f20032d00a30f4110747221010c320b200341e0116a20034180126a10d702200341a00f6a20032802e011220520032802e81110d802200341a0056a200341a00f6a41a40210cf061a200341b8026a41086a200341cd116a290000370300200341b8026a41106a200341d5116a290000370300200341b8026a41176a2206200341dc116a280000360000200320032900c5113703b80202400240024002400240024020032d00c41122074102460d00200241086a210d200341f8026a200341a0056a41a40210cf061a200341d8026a41176a2006280000360000200341d8026a41106a2202200341b8026a41106a290300370300200341d8026a41086a2206200341b8026a41086a290300370300200320032903b8023703d802024020032802e411450d00200510260b200341b00a6a41066a200341f8026a41a40210cf061a20034180086a200341b00a6a41aa0210cf061a200341c8076a41176a2205200341d8026a41176a280000360000200341c8076a41106a22082002290300370300200341c8076a41086a22022006290300370300200320032903d8023703c807200341e00c6a20034180086a41066a41a40210cf061a200341e00c6a41a4026a20073a0000200341850f6a20032903c8073700002003418d0f6a2002290300370000200341950f6a20082903003700002003419c0f6a2005280000360000200d41086a2903002111200d290300211320032802f00c210841002102200341f80c6a280200220941014b0d0120090e020302030b024020032802e411450d00200510260b200341a00f6a410610d50220032f00a10f20032d00a30f4110747221010c360b20092105034020022005410176220620026a2207200820074105746a28020020014b1b2102200520066b220541014b0d000b0b200820024105746a220628020022052001460d012009200220052001496a2202490d130b02402009200341f40c6a280200470d00200341e00c6a41106a200910ed0120032802f00c21080b200820024105746a220541206a2005200920026b41057410d0061a200541186a2011370300200541106a201337030020054201370308200520013602002003200941016a22093602f80c0c010b200920024d0d120240200820024105746a2202280208417f6a220541054b0d00024020050e06000101010100000b200341a00f6a410710d50220032f00a10f20032d00a30f41107472210120032902a40f211120032d00a00f21020c320b200241086a420137030020062001360200200241186a2011370300200241106a20133703000b200341a00f6a20034180126a200d290300200d41086a29030010d90220032d00a00f22024104460d0120032f00a10f20032d00a30f41107472210120032902a40f21110c300b410221020c320b200341840d6a3502002111200341a00f6a200341e00c6a41c00210cf061a200341b00a6a20034180126a10d70220032802b00a220220032802b80a200341a00f6a10db02024020032802b40a450d00200210260b2009ad21130240200341b40f6a28020041ffffff3f71450d0020032802b00f10260b200341a00f6a411c6a10c402200341a00f6a41086a41033a0000200341b10f6a20034180126a41086a290300370000200341b90f6a20034180126a41106a290300370000200341c10f6a20034180126a41186a290300370000200341cc0f6a2001360200200341093a00a00f200341a00f6a41096a20032903801237000020134280b5187e201142e0fbf3007e7c42808da9e0007c2111200341a00f6a1087020240200328029c0241ffffff1f71450d00200410260b200320032800e807360288022003200341e8076a41036a28000036008b02200041186a41003a0000200041106a20113703002000420137030820002003280288023600192000411c6a200328008b02360000200042003703000c370b200141046a2802002106200341a00f6a41206a200241206a290200370300200341a00f6a41186a200241186a290200370300200341a00f6a41106a200241106a290200370300200341a00f6a41086a200241086a290200370300200320022902003703a00f200341e00c6a200341a00f6a10d602200341b8026a41086a2201200341e90c6a290000370300200341b8026a41106a2202200341f10c6a290000370300200341b8026a41186a2204200341f90c6a290000370300200320032900e10c3703b80202400240024020032d00e00c4101460d0020034180126a41186a200429030037030020034180126a41106a200229030037030020034180126a41086a2001290300370300200320032903b80237038012200341e0116a20034180126a10d702200341a00f6a20032802e011220420032802e81110d802200341a0056a200341a00f6a41a40210cf061a2001200341cd116a2900003703002002200341d5116a290000370300200341b8026a41176a2201200341dc116a280000360000200320032900c5113703b8020240024002400240024020032d00c41122024102460d00200341f8026a200341a0056a41a40210cf061a200341d8026a41176a2001280000360000200341d8026a41106a2201200341b8026a41106a290300370300200341d8026a41086a2205200341b8026a41086a290300370300200320032903b8023703d802024020032802e411450d00200410260b200341b00a6a41066a200341f8026a41a40210cf061a20034180086a200341b00a6a41aa0210cf061a200341c8076a41176a2204200341d8026a41176a280000360000200341c8076a41106a22072001290300370300200341c8076a41086a22012005290300370300200320032903d8023703c807200341e00c6a20034180086a41066a41a40210cf061a200341e00c6a41a4026a20023a0000200341850f6a20032903c8073700002003418d0f6a2001290300370000200341950f6a20072903003700002003419c0f6a200428000036000020032802f00c210741002101200341f80c6a280200220841014b0d0120080e020302030b024020032802e411450d00200410260b200341a00f6a410610d502200320032900a10f370398022003200341a80f6a28000036009f0220032d00a00f21010c050b20082102034020012002410176220420016a2205200720054105746a28020020064b1b2101200220046b220241014b0d000b0b200720014105746a2802002006470d00200820014d0d14200720014105746a220241186a2903002113200241106a2903002115200229030821112002200241206a20082001417f736a41057410d0061a20032008417f6a22013602f80c20114201510d04200341a00f6a410810d502200320032900a10f370398022003200341a00f6a41086a28000036009f020c010b200341a00f6a410210d502200320032900a10f370398022003200341a80f6a28000036009f020b20032d00a00f21010240200341f40c6a28020041ffffff3f71450d00200710260b200341fc0c6a10c4020c010b410221010b20032003280088023602e80120032003290398023703e8072003200328009f023600ef0720032003418b026a2800003600eb01200041186a41003a000020004200370308200020032802e8013600192000411c6a20032800eb01360000200041206a20013a0000200020032903e807370021200041286a20032800ef07360000200042013703000c370b200341d8006a20034180126a2015201310da02200341840d6a3502002111200341a00f6a200341e00c6a41c00210cf061a200341b00a6a20034180126a10d70220032802b00a220220032802b80a200341a00f6a10db02024020032802b40a450d00200210260b2001ad21130240200341b40f6a28020041ffffff3f71450d0020032802b00f10260b200341a00f6a411c6a10c402200341a00f6a41086a41043a0000200341b10f6a20034180126a41086a290300370000200341b90f6a20034180126a41106a290300370000200341c10f6a20034180126a41186a290300370000200341cc0f6a2006360200200341093a00a00f200341a00f6a41096a200329038012370000200341a00f6a10870220032003280088023602e80120032003418b026a2800003600eb01200041186a41003a0000200041106a20134280b5187e201142e0fbf3007e7c42808da9e0007c37030020004201370308200020032802e8013600192000411c6a20032800eb01360000200042003703000c360b200141106a2903002111200141086a2903002113200141046a2802002101200341a00f6a41206a200241206a290200370300200341a00f6a41186a200241186a290200370300200341a00f6a41106a200241106a290200370300200341a00f6a41086a200241086a290200370300200320022902003703a00f200341e00c6a200341a00f6a10d602200341c8076a41086a2202200341e90c6a290000370300200341c8076a41106a2204200341f10c6a290000370300200341c8076a41186a2205200341f90c6a290000370300200320032900e10c3703c80720032d00e00c4101460d0f200341b00a6a41186a2005290300370300200341b00a6a41106a2004290300370300200341b00a6a41086a2002290300370300200320032903c8073703b00a200341e00c6a10d40220032802e00c2102024002400240024020032802e80c220420014d0d00200220014106746a22012903004201520d000240200341b00a6a200141206a2205460d002005200341b00a6a412010d2060d010b200141086a22012013370300200120113703080c010b200341a00f6a410a10d50220032d00a00f22014104470d010b41002105200421010c010b20032902a40f211120032f00a10f20032d00a30f411074724108742001722101410121050b20032802e40c2106200341d0026a22074200370300200341c8026a22084200370300200341b8026a41086a22094200370300200342003703b802200341a00f6a41918dc700410810fb012009200341a00f6a41086a220d290000370300200320032900a00f3703b802200341a00f6a41a4a7c100410a10fb012007200d290000370300200820032900a00f370300200341a00f6a2002200410c002200341b8026a412020032802a00f220420032802a80f10b301024020032802a40f450d00200410260b0240200641ffffff1f71450d00200210260b20050d2b20032003280080083602a005200320034183086a2800003600a305200041186a41003a0000200041106a2001ad429092147e428087913f7c37030020004201370308200020032802a0053600192000411c6a20032800a305360000200042003703000c350b200141246a280200210520034180086a41186a2206200141196a29000037030020034180086a41106a2207200141116a29000037030020034180086a41086a2208200141096a2900003703002003200129000137038008200341a00f6a41206a200241206a290200370300200341a00f6a41186a200241186a290200370300200341a00f6a41106a200241106a290200370300200341a00f6a41086a200241086a290200370300200320022902003703a00f200341e00c6a200341a00f6a10d602200341c8076a41086a2201200341e00c6a41096a290000370300200341c8076a41106a2202200341e00c6a41116a290000370300200341c8076a41186a2204200341e00c6a41196a290000370300200320032900e10c3703c80720032d00e00c4101460d0f200341b00a6a41186a2004290300370300200341b00a6a41106a2002290300370300200341b00a6a41086a2001290300370300200320032903c8073703b00a200341e00c6a10d40220042006290300370300200220072903003703002001200829030037030020032003290380083703c80720032802e00c2102024002400240024020032802e80c220420054d0d00200220054106746a22012903004201520d00200341b8026a41186a2205200341c8076a41186a290300370300200341b8026a41106a2206200341c8076a41106a290300370300200341b8026a41086a2207200341c8076a41086a290300370300200320032903c8073703b8020240200341b00a6a200141206a2201460d002001200341b00a6a412010d2060d010b200120032903b802370200200141186a2005290300370200200141106a2006290300370200200141086a20072903003702000c010b200341a00f6a410a10d50220032d00a00f22014104470d010b41002105200421010c010b20032902a40f211120032f00a10f20032d00a30f411074724108742001722101410121050b20032802e40c2106200341d0026a22074200370300200341c8026a22084200370300200341b8026a41086a22094200370300200342003703b802200341a00f6a41918dc700410810fb012009200341a00f6a41086a220d290000370300200320032900a00f3703b802200341a00f6a41a4a7c100410a10fb012007200d290000370300200820032900a00f370300200341a00f6a2002200410c002200341b8026a412020032802a00f220420032802a80f10b301024020032802a40f450d00200410260b0240200641ffffff1f71450d00200210260b20050d29200320032800a0053602f8022003200341a3056a2800003600fb02200041186a41003a0000200041106a2001ad4280c4137e42e0cdec3f7c37030020004201370308200020032802f8023600192000411c6a20032800fb02360000200042003703000c340b200141086a2903002111200141046a2802002101200341a00f6a41206a200241206a290200370300200341a00f6a41186a200241186a290200370300200341a00f6a41106a200241106a290200370300200341a00f6a41086a200241086a290200370300200320022902003703a00f200341e00c6a200341a00f6a10d602200341c8076a41086a2202200341e90c6a290000370300200341c8076a41106a2204200341f10c6a290000370300200341c8076a41186a2205200341f90c6a290000370300200320032900e10c3703c80720032d00e00c4101460d0f200341b00a6a41186a2005290300370300200341b00a6a41106a2004290300370300200341b00a6a41086a2002290300370300200320032903c8073703b00a200341e00c6a10d40220032802e00c2102024002400240024020032802e80c220420014d0d00200220014106746a22052903004201520d000240200341b00a6a200541206a2205460d002005200341b00a6a412010d2060d010b200220014106746a20113703180c010b200341a00f6a410a10d50220032d00a00f22014104470d010b41002105200421010c010b20032902a40f211120032f00a10f20032d00a30f411074724108742001722101410121050b20032802e40c2106200341d0026a22074200370300200341c8026a22084200370300200341b8026a41086a22094200370300200342003703b802200341a00f6a41918dc700410810fb012009200341a00f6a41086a220d290000370300200320032900a00f3703b802200341a00f6a41a4a7c100410a10fb012007200d290000370300200820032900a00f370300200341a00f6a2002200410c002200341b8026a412020032802a00f220420032802a80f10b301024020032802a40f450d00200410260b0240200641ffffff1f71450d00200210260b20050d2720032003280080083602a005200320034183086a2800003600a305200041186a41003a0000200041106a2001ad429092147e42a094973f7c37030020004201370308200020032802a0053600192000411c6a20032800a305360000200042003703000c330b200141386a2903002113200141306a2903002115200141286a2903002111200141246a280200210420034198026a41186a2205200141196a29000037030020034198026a41106a2206200141116a29000037030020034198026a41086a2207200141096a2900003703002003200129000137039802200341a00f6a41206a200241206a290200370300200341a00f6a41186a200241186a290200370300200341a00f6a41106a200241106a290200370300200341a00f6a41086a200241086a290200370300200320022902003703a00f200341e00c6a200341a00f6a10d602200341c8076a41086a2201200341e00c6a41096a290000370300200341c8076a41106a2202200341e00c6a41116a290000370300200341c8076a41186a2208200341e00c6a41196a290000370300200320032900e10c3703c8070240024020032d00e00c4101470d00410221010c010b200341e0116a41186a2008290300370300200341e0116a41106a2002290300370300200341e0116a41086a2001290300370300200320032903c8073703e01120034180126a41086a200729030037030020034180126a41106a200629030037030020034180126a41186a20052903003703002003200329039802370380120240024020114201510d00200341e00c6a10d40220032802e00c21020240024002400240024020032802e80c20044d0d00200220044106746a22012903004201520d000240200341e0116a200141206a2201460d002001200341e0116a412010d2060d010b024020032802e40c41ffffff1f71450d00200210260b200341e8076a20034180126a10d702200341a00f6a20032802e807220120032802f00710d802200341a0056a200341a00f6a41a40210cf061a200341b8026a41086a2202200341cd116a290000370300200341b8026a41106a2205200341d5116a290000370300200341b8026a41176a2206200341dc116a280000360000200320032900c5113703b802024020032d00c41122074102460d00200341f8026a200341a0056a41a40210cf061a200341d8026a41176a2006280000360000200341d8026a41106a2005290300370300200341d8026a41086a2002290300370300200320032903b8023703d802024020032802ec07450d00200110260b200341b00a6a41066a200341f8026a41a40210cf061a20034180086a200341b00a6a41aa0210cf061a200341c8076a41176a2201200341d8026a41176a280000360000200341c8076a41106a2202200341d8026a41106a290300370300200341c8076a41086a2205200341d8026a41086a290300370300200320032903d8023703c807200341e00c6a20034180086a41066a41a40210cf061a200341e00c6a41a4026a20073a0000200341850f6a20032903c8073700002003418d0f6a2005290300370000200341950f6a20022903003700002003419c0f6a200128000036000020032802f00c210741002101200341f80c6a280200220841014b0d0220080e020403040b024020032802ec07450d00200110260b200341a00f6a410b10d502200320032900a10f370388022003200341a80f6a28000036008f020c060b200341a00f6a410a10d502200320032900a10f370388022003200341a80f6a28000036008f0220032d00a00f210120032802e40c41ffffff1f71450d06200210260c060b20082102034020012002410176220520016a2206200720064105746a28020020044b1b2101200220056b220241014b0d000b0b200720014105746a220228020022052004460d012008200120052004496a2201490d140b02402008200341f40c6a280200470d00200341e00c6a41106a200810ed0120032802f00c21070b200720014105746a220241206a2002200820016b41057410d0061a200241186a2013370300200241106a201537030020022011370308200220043602002003200841016a22083602f80c0c290b200820014d0d13200720014105746a220141086a2105024020012903084201520d00200341a00f6a20034180126a200341e0116a200141106a290300200141186a290300410010e0020b2005201137030020022004360200200141186a2013370300200141106a20153703000c280b200341a00f6a410910d502200320032900a10f370388022003200341a80f6a28000036008f020b20032d00a00f21010b20032003280080023602f80120032003290388023703e8012003200328008f023600ef01200320034183026a2800003600fb01200041186a41003a000020004200370308200020032802f8013600192000411c6a20032800fb01360000200041206a20013a0000200020032903e801370021200041286a20032800ef01360000200042013703000c320b200341e0116a41186a2204200141196a290000370300200341e0116a41106a2205200141116a290000370300200341e0116a41086a2206200141096a290000370300200320012900013703e011200341a00f6a41206a200241206a290200370300200341a00f6a41186a200241186a290200370300200341a00f6a41106a200241106a290200370300200341a00f6a41086a200241086a290200370300200320022902003703a00f41022101024002400240200341a00f6a10d3020d0020034180126a41086a200629030037030020034180126a41106a200529030037030020034180126a41186a2004290300370300200320032903e01137038012200341e00c6a20034180126a10dc02200341a00f6a20032802e00c220220032802e80c220410dd02024020032802b00f2201450d002002200410ff010b20032903a00f211320032902b40f2111200341a80f6a2903002116024020032802e40c450d00200210260b20034198026a20034180126a10d702200341a00f6a200328029802220220032802a002220510d802024020032d00c411220641024622040d002002200510ff010b2011420020011b21152001410120011b2105200341a0056a200341a00f6a41a40210cf061a200341b8026a41176a2207200341dc116a280000360000200341b8026a41106a2208200341d5116a290000370300200341b8026a41086a2209200341cd116a290000370300200320032900c5113703b802024020040d00200341f8026a200341a0056a41a40210cf061a200341d8026a41176a2007280000360000200341d8026a41106a2008290300370300200341d8026a41086a2009290300370300200320032903b8023703d8020240200328029c02450d00200210260b2013420020011b210c2016420020011b210b200341b00a6a41066a200341f8026a41a40210cf061a20034180086a200341b00a6a41aa0210cf061a200341c8076a41176a2201200341d8026a41176a280000360000200341c8076a41106a2202200341d8026a41106a290300370300200341c8076a41086a2204200341d8026a41086a290300370300200320032903d8023703c807200341e00c6a20034180086a41066a41a40210cf061a200341e00c6a41a4026a20063a0000200341850f6a20032903c8073700002003418d0f6a2004290300370000200341950f6a20022903003700002003419c0f6a2001280000360000200341e00c6a41086a290300210a20032903e00c211620032802f00c210702400240200341f80c6a280200220841057422020d0042002111420021130c010b200741106a210142002111420021130340200141086a2903004200200141786a29030042015122041b20137c2001290300420020041b221320117c2211201354ad7c2113200141206a2101200241606a22020d000b0b200a200b7c2016200c7c220c201654ad7c20137c200c20117c2211200c54ad7c2113024020154220882216a72201450d0020014105742102200521010340200341a00f6a200110bb0220032802a00f220420032802a80f10ff01024020032802a40f450d00200410260b200141206a2101200241606a22020d000b0b20034198016a20034180126a2011201310e102200329039801220c20034198016a41086a290300220a844200520d02200341b80f6a22014200370300200341a00f6a41106a22024200370300200341a00f6a41086a22044200370300200342003703a00f200341b00a6a419a8cc700410810fb012004200341b00a6a41086a2206290000370300200320032900b00a3703a00f200341b00a6a41b8a1c300410d10fb0120012006290000370300200220032900b00a370300200341e8006a200341a00f6a108d02200341e8006a41106a290300210c2003290370210b20032802682109200142003703002002420037030020044200370300200342003703a00f200341b00a6a419a8cc700410810fb0120042006290000370300200320032900b00a3703a00f200341b00a6a41b8a1c300410d10fb0120012006290000370300200220032900b00a3703002003200c420020091b3703b80a2003200b420020091b3703b00a200341a00f6a4120200341b00a6a411010b3010c030b0240200328029c02450d00200210260b200341a00f6a410310d502200320032900a10f3703e8072003200341a80f6a2800003600ef0720032d00a00f2101201542ffffff3f83500d00200510260b200320032800e80136028002200320032903e80737038802200320032800ef0736008f022003200341eb016a28000036008302200041186a41003a00002000420037030820002003280280023600192000411c6a200328008302360000200041206a20013a00002000200329038802370021200041286a200328008f02360000200042013703000c330b200341b8056a22014200370300200341a0056a41106a22024200370300200341a0056a41086a22044200370300200342003703a005200341a00f6a419a8cc700410810fb012004200341a00f6a41086a2206290000370300200320032900a00f3703a005200341a00f6a41b8a1c300410d10fb0120012006290000370300200220032900a00f37030020034180016a200341a0056a108d0220034180016a41106a290300210b20032903880121232003280280012109200142003703002002420037030020044200370300200342003703a005200341a00f6a419a8cc700410810fb0120042006290000370300200320032900a00f3703a005200341a00f6a41b8a1c300410d10fb0120012006290000370300200220032900a00f37030020034200200b420020091b220b200a7d2023420020091b220a200c54ad7d2223200a200c7d220c200a562023200b562023200b511b22011b3703a80f20034200200c20011b3703a00f200341a0056a4120200341a00f6a411010b3010b200341d80f6a2013370300200341d00f6a2011370300200341a00f6a41086a41023a0000200341093a00a00f200341a00f6a41096a200329038012370000200341b10f6a20034180126a41086a290300370000200341b90f6a20034190126a290300370000200341c10f6a20034198126a290300370000200341a00f6a1087022008ad42d0f7077e201642c0d89e017e7c200341840d6a35020042a0f7367e7c20164280c2d72f7e7c2111200341fc0c6a21010240200341f40c6a28020041ffffff3f71450d00200710260b201142c091efda017c2111200110c4020240201542ffffff3f83500d00200510260b200320032800e801360280022003200341eb016a28000036008302200041186a41003a0000200041106a20113703002000420137030820002003280280023600192000411c6a200328008302360000200042003703000c310b200341f8026a41186a2208200141196a290000370300200341f8026a41106a2209200141116a290000370300200341f8026a41086a220d200141096a290000370300200320012900013703f80220034180026a41026a200141276a2d00003a0000200341e0116a41086a200141386a290200370300200341e0116a41106a200141c0006a2902003703002003200141256a2f00003b0180022003200141306a2902003703e011200141246a2d00002104200141286a28020021072001412c6a2802002106200341a00f6a41206a200241206a290200370300200341a00f6a41186a200241186a290200370300200341a00f6a41106a200241106a290200370300200341a00f6a41086a200241086a290200370300200320022902003703a00f200341e00c6a200341a00f6a10d60220034180086a41086a2201200341e00c6a41096a29000037030020034180086a41106a2202200341e00c6a41116a29000037030020034180086a41186a2205200341e00c6a41196a290000370300200320032900e10c37038008024020032d00e00c4101470d00200341023a00e8070240200441ff01714101460d000c230b2006450d21200710260c210b200341a0056a41186a2005290300370300200341a0056a41106a2002290300370300200341a0056a41086a200129030037030020032003290380083703a0052001200d2903003703002002200929030037030020052008290300370300200320032903f80237038008200341a00f6a200341a0056a10d702200341c0016a20032802a00f220220032802a80f41d4c0c7004100410010810220032802c0012101024020032802a40f450d00200210260b02400240024020014101470d00200341a00f6a20034180086a10bb02200341b8016a20032802a00f220220032802a80f41d4c0c7004100410010810220032802b8012101024020032802a40f450d00200210260b20014101470d02200341e8076a410e10d5020c010b200341e8076a410610d5020b200441ff01714101470d212006450d21200710260c210b200341c8076a41186a20034180086a41186a290300370300200341c8076a41106a20034180086a41106a290300370300200341c8076a41086a20034180086a41086a290300370300200341e8016a41026a20034180026a41026a2d00003a000020034180126a41086a200341e0116a41086a29030037030020034180126a41106a200341e0116a41106a290300370300200320032f0180023b01e801200320032903e0113703801220032003290380083703c807200341d8026a200341a0056a10dc02200341a00f6a20032802d802220520032802e002220810dd020240024020032802b00f22020d0041002101200341b00a6a41186a4100360200200342003703b80a200342003703b00a200342013703c00a41012102410021090c010b200341c40a6a20032902b40f2211370200200320032903a00f3703b00a200320023602c00a2003200341a00f6a41086a2903003703b80a2003200341bc0f6a2802003602cc0a2011422088a721012011a721090b200341ec0c6a2006360200200341e00c6a41086a2007360200200341e00c6a41106a200329038012370300200341e00c6a41186a20034180126a41086a290300370300200341800d6a20034180126a41106a290300370300200341900d6a200341c8076a41086a290300370300200341980d6a200341c8076a41106a290300370300200341a00d6a200341c8076a41186a290300370300200320043a00e40c200320032f01e8013b00e50c2003200341ea016a2d00003a00e70c200320032903c8073703880d2003200341a0056a3602e00c0240200141e3004b0d00200341a00f6a200341a0056a4280c0a8ca9a3a420010d90220032d00a00f220d4104470d10200341a00f6a41186a200341a0056a41186a290300370300200341a00f6a41106a200341a0056a41106a290300370300200341a00f6a41086a200341a0056a41086a290300370300200341a00f6a41286a200341e00c6a410472220441086a290200370300200341d00f6a200441106a290200370300200341d80f6a200441186a290200370300200341e00f6a200441206a280200360200200320032903a0053703a00f200320042902003703c00f200341b8026a200341e00c6a41286a10bb0220032802b802220420032802c002200341a00f6a10df02024020032802bc02450d00200410260b200341880d6a2104024020032d00c00f4101470d00200341c80f6a280200450d00200341c40f6a28020010260b200341b8026a41186a2206200441186a2207290200370300200341b8026a41106a220d200441106a220e290200370300200341b8026a41086a220f200441086a2210290200370300200320042902003703b802024020012009470d00200341b00a6a41106a2001410110930120032802c80a210120032802c00a21020b200220014105746a220220032903b802370000200241186a2006290300370000200241106a200d290300370000200241086a200f290300370000200341b00a6a41086a2202427f2002290300221520032903b00a22114280c0a8ca9a3a7c22132011542202ad7c221620022016201554201320115a1b22021b3703002003200141016a3602c80a2003427f201320021b3703b00a200341a00f6a41086a41073a0000200341b10f6a2010290000370000200341b90f6a200e290000370000200341c10f6a200729000037000020042900002111200341093a00a00f200341a00f6a41096a2011370000200341c90f6a20032903a005370000200341d10f6a200341a0056a41086a290300370000200341d90f6a200341a0056a41106a290300370000200341e10f6a200341a0056a41186a290300370000200341f80f6a4200370300200341f00f6a4280c0a8ca9a3a370300200341a00f6a108702200341043a0098020c1e0b20034198026a410110d5020c1c0b200341a0056a41186a2205200141196a290000370300200341a0056a41106a2206200141116a290000370300200341a0056a41086a2207200141096a290000370300200320012900013703a00520034198026a41026a200141276a2d00003a0000200341f8026a41086a200141386a290200370300200341f8026a41106a200141c0006a2902003703002003200141256a2f00003b0198022003200141306a2902003703f802200141246a2d00002104200141286a280200210d2001412c6a2802002101200341a00f6a41206a200241206a290200370300200341a00f6a41186a200241186a290200370300200341a00f6a41106a200241106a290200370300200341a00f6a41086a200241086a290200370300200320022902003703a00f200341e00c6a200341a00f6a10d60220034180086a41086a2202200341e00c6a41096a29000037030020034180086a41106a2208200341e00c6a41116a29000037030020034180086a41186a2209200341e00c6a41196a290000370300200320032900e10c37038008024020032d00e00c4101470d00200341023a0080120240200441ff01714101460d000c1c0b20010d180c190b200341b00a6a41186a2009290300370300200341b00a6a41106a2008290300370300200341b00a6a41086a200229030037030020032003290380083703b00a200341e00c6a41086a2007290300370300200341e00c6a41106a2006290300370300200341e00c6a41186a2005290300370300200320032903a0053703e00c200341a00f6a200341b00a6a10d702200341c8016a20032802a00f220520032802a80f41d4c0c7004100410010810220032802c8012102024020032802a40f450d00200510260b024020024101460d0020034180126a410610d5020c170b20034180086a200341e00c6a10bb02200341a00f6a200328028008220520032802880810de02200341b8026a41086a2206200341a00f6a41086a290300370300200341b8026a41106a2207200341a00f6a41106a290300370300200341b8026a41186a2208200341a00f6a41186a29030037030020034180026a41026a2209200341c30f6a2d00003a0000200341d8026a41086a220e200341d40f6a290200370300200341d8026a41106a220f200341dc0f6a290200370300200320032903a00f3703b802200320032f00c10f3b0180022003200341cc0f6a2902003703d8020240024020032d00c00f22024106460d00200341c80f6a2802002110200341c40f6a2802002112200341c8076a41186a2008290300370300200341c8076a41106a2007290300370300200341c8076a41086a2006290300370300200341f8016a41026a20092d00003a0000200341e8076a41086a200e290300370300200341e8076a41106a200f290300370300200320032903b8023703c807200320032f0180023b01f801200320032903d8023703e8070240200328028408450d00200510260b200341c10f6a20032f01f8013b0000200341c80f6a2010360200200341c40f6a2012360200200341cc0f6a20032903e807370200200341a00f6a41186a200341c8076a41186a290300370300200341a00f6a41106a200341c8076a41106a290300370300200341a00f6a41086a200341c8076a41086a290300370300200341c30f6a200341fa016a2d00003a0000200341d40f6a200341e8076a41086a290300370200200341dc0f6a200341e8076a41106a290300370200200320032903c8073703a00f200320023a00c00f200341a00f6a200341b00a6a412010d2062105024020024101470d002010450d00201210260b20050d01200341c10f6a20032f0198023b0000200341c80f6a2001360200200341c40f6a200d360200200341cc0f6a20032903f802370200200341a00f6a41186a200341b00a6a41186a290300370300200341a00f6a41106a200341b00a6a41106a290300370300200341a00f6a41086a200341b00a6a41086a290300370300200341c30f6a2003419a026a2d00003a0000200341d40f6a200341f8026a41086a290300370200200341dc0f6a200341f8026a41106a290300370200200320032903b00a3703a00f200320043a00c00f20034180086a200341e00c6a10bb022003280280082201200328028808200341a00f6a10df020240200328028408450d00200110260b024020032d00c00f4101470d0020032802c80f450d0020032802c40f10260b200341043a0080120c1b0b200328028408450d00200510260b20034180126a411010d5020c160b20034198026a41186a200141196a29000037030020034198026a41106a200141116a29000037030020034198026a41086a200141096a2900003703002003200129000137039802200341a00f6a41206a200241206a290200370300200341a00f6a41186a200241186a290200370300200341a00f6a41106a200241106a290200370300200341a00f6a41086a200241086a290200370300200320022902003703a00f200341e00c6a200341a00f6a10d60220034180086a41086a2201200341e00c6a41096a29000037030020034180086a41106a2202200341e00c6a41116a29000037030020034180086a41186a2204200341e00c6a41196a290000370300200320032900e10c3703800820032d00e00c4101460d0e200341e0116a41186a2004290300370300200341e0116a41106a2002290300370300200341e0116a41086a200129030037030020032003290380083703e011200341a00f6a200341e0116a10d702200341e0016a20032802a00f220220032802a80f41d4c0c7004100410010810220032802e0012101024020032802a40f450d00200210260b0240024020014101460d0020034188026a410610d5020c010b20034180126a41086a20034198026a41086a29030037030020034180126a41106a20034198026a41106a29030037030020034180126a41186a20034198026a41186a29030037030020032003290398023703801220034180086a20034180126a10bb02200341a00f6a200328028008220120032802880810de02200341b8026a41086a2202200341a00f6a41086a290300370300200341b8026a41106a2204200341a00f6a41106a290300370300200341b8026a41186a2205200341a00f6a41186a29030037030020034180026a41026a2206200341c30f6a2d00003a0000200341d8026a41086a2207200341d40f6a290200370300200341d8026a41106a2208200341dc0f6a290200370300200320032903a00f3703b802200320032f00c10f3b0180022003200341cc0f6a2902003703d802024002400240024020032d00c00f22094106460d00200341c80f6a280200210d200341c40f6a280200210e200341c8076a41186a2005290300370300200341c8076a41106a2004290300370300200341c8076a41086a2002290300370300200341f8016a41026a20062d00003a0000200341e8076a41086a2007290300370300200341e8076a41106a2008290300370300200320032903b8023703c807200320032f0180023b01f801200320032903d8023703e8070240200328028408450d00200110260b200341e00c6a410a6a200341c8076a41086a290300370100200341e00c6a41126a200341c8076a41106a290300370100200341e00c6a411a6a200341c8076a41186a290300370100200320032903c8073701e20c200341b00a6a41086a200341e00c6a41086a290100370300200341b00a6a41106a200341e00c6a41106a290100370300200341b00a6a41186a200341e00c6a41186a290100370300200341b00a6a41206a200341e00c6a41206a2f01003b0100200320032901e00c3703b00a200341f8026a41186a200341b00a6a411a6a290100370300200341f8026a41106a200341b00a6a41126a290100370300200341f8026a41086a200341b00a6a410a6a290100370300200320032901b20a3703f802024020094101470d00200d450d00200e10260b200341f8026a200341e0116a412010d2060d03200341a00f6a20034180126a10bb0220032802a00f220120032802a80f10ff01024020032802a40f450d00200110260b20034180086a41186a20034180126a41186a290300221137030020034180086a41106a20034180126a41106a290300221337030020034180086a41086a20034180126a41086a290300221537030020034180086a41286a200341e0116a41086a290300221637030020034180086a41306a200341e0116a41106a290300220c37030020034180086a41386a200341e0116a41186a290300220b3703002003200329038012220a37038008200320032903e01122233703a008200341b00a6a41386a2201200b370300200341b00a6a41306a2202200c370300200341b00a6a41286a22042016370300200341b00a6a41206a22062023370300200341b00a6a41186a22072011370300200341b00a6a41106a22082013370300200341b00a6a41086a220920153703002003200a3703b00a200341c8076a200341f8026a10dc02200341a00f6a20032802c807221b20032802d007221c10dd024200211520032802b00f221a0d01410021054101211a4200210b420021164200210c0c020b0240200328028408450d00200110260b20034188026a410f10d5020c030b20032902b40f221142ffffffff0f83210b2011422088a72105200341a00f6a41086a290300210c200341bc0f6a280200211d20032903a00f21160b200341e00c6a41386a2001290300370300200341e00c6a41306a2002290300370300200341e00c6a41286a2004290300370300200341e00c6a41206a2006290300370300200341e00c6a41186a2007290300370300200341e00c6a41106a2008290300370300200341e00c6a41086a2009290300370300200320032903b00a3703e00c02402005450d0041002102201a2101410021040340024002400240200341e00c6a2001460d002001200341e00c6a412010d206450d0020020d01410021020c020b200241016a21020c010b200420026b220620054f0d14200341a0056a41186a2207200120024105746b220641186a2208290000370300200341a0056a41106a2209200641106a220d290000370300200341a0056a41086a220e200641086a220f290000370300200320062900003703a005200141086a22102900002111200141106a22122900002113200141186a221429000021152006200129000037000020082015370000200d2013370000200f201137000020142007290300370000201220092903003700002010200e290300370000200120032903a0053700000b200141206a21012005200441016a2204470d000b2005200241002002417f6a2005491b6bad42208621150b200341d0016a200341800d6a20164280c0a8ca9a3a20164280c0a8ca9a3a544100200c501b22011b2211200c420020011b221310da02200341f80f6a2013370300200341f00f6a2011370300200341a00f6a41086a41083a0000200341b10f6a200341e00c6a41086a290300370000200341b90f6a200341f00c6a290300370000200341c10f6a200341f80c6a290300370000200341c90f6a20032903800d370000200341d10f6a200341880d6a290300370000200341d90f6a200341900d6a290300370000200341e10f6a200341980d6a290300370000200341093a00a00f200341a00f6a41096a20032903e00c370000200341a00f6a108702200341b40f6a2015200b843702002003200c20137d2016201154ad7d3703a80f2003201620117d3703a00f2003201d3602bc0f2003201a3602b00f201b201c200341a00f6a10e2020240200b42ffffff3f83500d00201a10260b024020032802cc07450d00201b10260b200341043a0088020c160b20034188026a411010d5020b20032d0088024104460d14200329028c0221110c130b200341a00f6a41206a200241206a290200370300200341a00f6a41186a200241186a290200370300200341a00f6a41106a200241106a290200370300200341a00f6a41086a200241086a290200370300200320022902003703a00f200341e00c6a200341a00f6a10d60220034180086a41086a2201200341e90c6a29000037030020034180086a41106a2202200341f10c6a29000037030020034180086a41186a2204200341f90c6a290000370300200320032900e10c37038008024002400240024020032d00e00c4101460d00200341f8026a41186a2004290300370300200341f8026a41106a2002290300370300200341f8026a41086a200129030037030020032003290380083703f80220034180086a200341f8026a10bb02200341a00f6a2003280280082201200328028808220410de02024020032d00c00f220541064622020d002001200410ff010b200341b8026a41086a2204200341a00f6a41086a290300370300200341b8026a41106a2206200341a00f6a41106a290300370300200341b8026a41186a2207200341a00f6a41186a29030037030020034180026a41026a2208200341c30f6a2d00003a0000200341d8026a41086a2209200341d40f6a290200370300200341d8026a41106a220d200341dc0f6a290200370300200320032903a00f3703b802200320032f00c10f3b0180022003200341cc0f6a2902003703d802024020020d00200341c80f6a280200210e200341c40f6a280200210f200341c8076a41186a2007290300370300200341c8076a41106a2006290300370300200341c8076a41086a2004290300370300200341f8016a41026a20082d00003a0000200341e8076a41086a2009290300370300200341e8076a41106a200d290300370300200320032903b8023703c807200320032f0180023b01f801200320032903d8023703e8070240200328028408450d00200110260b200341e00c6a410a6a200341c8076a41086a2201290300370100200341e00c6a41126a200341c8076a41106a2202290300370100200341e00c6a411a6a200341c8076a41186a2204290300370100200320032903c8073701e20c200341b00a6a41086a200341e00c6a41086a290100370300200341b00a6a41106a200341e00c6a41106a290100370300200341b00a6a41186a200341e00c6a41186a290100370300200341b00a6a41206a200341e00c6a41206a2f01003b0100200320032901e00c3703b00a20034180086a41186a200341b00a6a411a6a29010037030020034180086a41106a200341b00a6a41126a29010037030020034180086a41086a200341b00a6a410a6a290100370300200320032901b20a370380084101211b024020054101470d00200e450d00200f10260b2004200341f8026a41186a2903003703002002200341f8026a41106a2903003703002001200341f8026a41086a290300370300200320032903f8023703c80720034180126a20034180086a10dc02200341a00f6a20032802801220032802881210dd024200211520032802b00f22010d02410021064200210b420021164200210c0c030b0240200328028408450d00200110260b200341e0116a410f10d50220032d00e0114104460d0320032902e41121110c140b200341023a00e0110c130b20032902b40f221142ffffffff0f83210b2011422088a72106200341a80f6a290300210c200341bc0f6a280200211c20032903a00f21162001211b0b200341ec0c6a200341c8076a41086a290300370200200341e00c6a41146a200341c8076a41106a290300370200200341fc0c6a200341c8076a41186a290300370200200320032903c8073702e40c200320034180086a3602e00c200341e00c6a410472210502402006450d0041002102201b210141002104034002400240024020052001460d0020012005412010d206450d0020020d01410021020c020b200241016a21020c010b200420026b220720064f0d13200341a0056a41186a2208200120024105746b220741186a2209290000370300200341a0056a41106a220d200741106a220e290000370300200341a0056a41086a220f200741086a2210290000370300200320072900003703a005200141086a22122900002111200141106a22142900002113200141186a221a29000021152007200129000037000020092015370000200e201337000020102011370000201a20082903003700002014200d2903003700002012200f290300370000200120032903a0053700000b200141206a21012006200441016a2204470d000b2006200241002002417f6a2006491b6bad42208621150b200341a00f6a20032802e00c200520164280c0a8ca9a3a20164280c0a8ca9a3a544100200c501b22011b2211200c420020011b2213410010e00220032802e00c2101200341b00a6a41186a200541186a290000220a370300200341b00a6a41106a200541106a2900002223370300200341b00a6a41086a200541086a29000022243703002003200529000022253703b00a200341f80f6a2013370300200341f00f6a2011370300200341a00f6a41086a41093a0000200341a00f6a41096a2025370000200341b10f6a2024370000200341b90f6a2023370000200341c10f6a200a370000200341c90f6a2001290000370000200341d10f6a200141086a290000370000200341d90f6a200141106a290000370000200341e10f6a200141186a290000370000200341093a00a00f200341a00f6a108702200341a00f6a41146a2015200b843702002003200c20137d2016201154ad7d3703a80f2003201620117d3703a00f2003201c3602bc0f2003201b3602b00f2003280280122201200328028812200341a00f6a10e2020240200b42ffffff3f83500d00201b10260b0240200328028412450d00200110260b200341043a00e0110b4200211120004200370308200020032800a00f360019200041186a41003a00002000411c6a200341a30f6a2800003600000c110b200520074198e2c4001032000b200341a00f6a410110d50220032f00a10f20032d00a30f4110747221040c280b1034000b1033000b20022009103b000b200220094198cac1001032000b20012008103e000b410221010c1b0b410221010c190b410221010c170b20012008103b000b2001200841a8cac1001032000b20032d00a30f210120032f00a10f210e200320032902a40f37029c022003200d3a0098022003200e20014110747222013b009902200320014110763a009b020c0c0b200341023a0088020c040b200620054198e2c4001032000b200720064198e2c4001032000b20032802e011210120002011370024200041206a2001360000200041186a41003a000020004200370308420121110b200020113703000c1b0b200328028802210120002011370024200041206a2001360000200041186a41003a000020004200370308200042013703000c1a0b20004200370308200020032800e801360019200041186a41003a00002000411c6a200341eb016a280000360000200042003703000c190b200441ff01714101470d012001450d010b200d10260b20032d0080124104460d0020032902841221110c010b20004200370308200020032800e011360019200041186a41003a00002000411c6a200341e3116a280000360000200042003703000c150b200328028012210120002011370024200041206a2001360000200041186a41003a000020004200370308200042013703000c140b0240200441ff01714101470d002006450d00200710260b20032d0098024104470d010b200341a00f6a41186a200341b00a6a41186a290300370300200341a00f6a41106a200341b00a6a41106a2903002211370300200341a00f6a41086a200341b00a6a41086a290300370300200320032903b00a3703a00f024002402011a722010d002005200810ff010c010b20052008200341a00f6a10e202200341b40f6a28020041ffffff3f71450d00200110260b200341e8076a41086a20034198026a41086a28020036020020032003290398023703e8070c010b200341e8076a41086a20034198026a41086a28020036020020032003290398023703e807200941ffffff3f71450d00200210260b20032802dc02450d00200510260b20032d00e8074104460d0120032902ec0721110b20032802e807210120002011370024200041206a2001360000200041186a41003a000020004200370308200042013703000c0e0b200042003703082000200328008802360019200041186a41003a00002000411c6a2003418b026a280000360000200042003703000c0d0b200341840d6a3502002111200341a00f6a200341e00c6a41c00210cf061a200341b00a6a20034180126a10d70220032802b00a220120032802b80a200341a00f6a10db02024020032802b40a450d00200110260b2008ad21130240200341b40f6a28020041ffffff3f71450d0020032802b00f10260b200341a00f6a411c6a10c402200341a00f6a41086a41053a0000200341b10f6a20034180126a41086a290300370000200341b90f6a20034180126a41106a290300370000200341c10f6a20034180126a41186a290300370000200341cc0f6a2004360200200341093a00a00f200341a00f6a41096a200329038012370000200341a00f6a10870220032003280080023602f801200320034183026a2800003600fb01200041186a41003a0000200041106a201342e0a7127e201142a0e1e7007e7c42c0db89db007c37030020004201370308200020032802f8013600192000411c6a20032800fb01360000200042003703000c0c0b20032003280080083602a005200320034183086a2800003600a305200041186a41003a000020004200370308200020032802a0053600192000411c6a20032800a305360000200041246a2011370200200041206a2001360200200042013703000c0b0b200320032800a0053602f8022003200341a3056a2800003600fb02200041186a41003a000020004200370308200020032802f8023600192000411c6a20032800fb02360000200041246a2011370200200041206a2001360200200042013703000c0a0b20032003280080083602a005200320034183086a2800003600a305200041186a41003a000020004200370308200020032802a0053600192000411c6a20032800a305360000200041246a2011370200200041206a2001360200200042013703000c090b0240200341f40c6a28020041ffffff3f71450d00200810260b200341fc0c6a10c4020c010b20032902a40f211120032d00a00f21020b200328029c0241ffffff1f71450d00200410260b200320032800e807360288022003200341eb076a28000036008b02200041236a20014110763a0000200020013b0021200041186a41003a00002000420037030820002003280288023600192000411c6a200328008b0236000020002011370024200041206a20023a0000200042013703000c050b0240201642ffffff3f83500d00201910260b200320032800e011360298022003200341e3116a28000036009b02200041186a41003a0000200041106a20113703002000420137030820002003280298023600192000411c6a200328009b02360000200042003703000c040b200341a00f6a410210d50220032f00a10f20032d00a30f4110747221040b20032902a40f211120032d00a00f21050c010b201642ffffff3f83500d00201910260b02402007450d00200741c4006c2102201741286a210103400240200141786a2d00004101470d002001280200450d002001417c6a28020010260b200141c4006a2101200241bc7f6a22020d000b0b02402008450d00200841c4006c450d00201710260b200320032800e011360298022003200341e3116a28000036009b02200041236a20044110763a0000200020043b0021200041186a41003a00002000420037030820002003280298023600192000411c6a200328009b0236000020002011370024200041206a20053a0000200042013703000b200341a0126a24000b860301027f20002802242101024002400240024020002d000022020d0020002d0001210020012001280200417f6a2202360200024020020d002001280208200128020c2802001103000240200128020c280204450d00200128020810260b20012001280204417f6a220236020420020d00200110260b0240200041ff01710d0041000f0b411010242200450d03200041b889c70036020c200041013602082000428180808010370200411010242201450d03200141d089c70036020c20014101360208200142818080801037020020002000280200417f6a220236020020020d012000280208200028020c2802001103000240200028020c280204450d00200028020810260b20002000280204417f6a220236020420020d01200010260c010b4100210020024102460d010b20012001280200417f6a22023602004101210020020d002001280208200128020c2802001103000240200128020c280204450d00200128020810260b20012001280204417f6a220236020420020d00200110260b20000f0b102c000bb40b040c7f017e027f067e23004180036b22012400200141206a22024200370300200141186a22034200370300200141086a41086a420037030020014200370308200141086a41918dc700410810fb0120014198026a41a4a7c100410a10fb01200220014198026a41086a29000037030020032001290098023703002001412036022c2001200141086a360228200141306a200141086a412010820202400240200128023022040d00410021050c010b200128023421062001200141306a41086a280200360244200120043602402001200141c0006a108f010240024020012802000d0002400240024002402001280204220720012802444106762202200220074b1b22024106742203417f4c0d000240024020020d00410821050c010b200310242205450d020b41002108200141003602502001200236024c200120053602480240024002402007450d004100210903402001280244220a450d032001280240220b2d000021022001200a417f6a220c3602442001200b41016a360240200241014b0d034200210d0240024020020e020100010b41002102200141003a00b802417e210e0340200c2002460d0420014198026a20026a200b20026a220341016a2d00003a00002001200a200e6a3602442001200341026a3602402001200241016a22033a00b802200e417f6a210e2003210220034120470d000b200141e0026a41186a220220014198026a41186a290300370300200141e0026a41106a220e20014198026a41106a290300370300200141e0026a41086a220c20014198026a41086a29030037030020012001290398023703e002200341ff01714120490d04200141f8016a41086a220f200c290300370300200141f8016a41106a220c200e290300370300200141f8016a41186a220e2002290300370300200120012903e0023703f8012003417f73200a6a4110490d042001200b20036a220241116a220b3602402001200a20036b220a416f6a220336024420034108490d04200241096a2900002110200241016a2900002111200b290000210d2001200a41676a3602442001200241196a360240200d4280025a0d04200141b8016a41086a200f290300221237030020014198016a41186a200e29030037030020014198016a41106a200c29030037030020014198016a41086a2012370300200120012903f80122123703b8012001201237039801200d42ff018321134201210d0b200941016a2109200141f8006a41186a20014198016a41186a2903002212370300200141f8006a41106a20014198016a41106a2903002214370300200141f8006a41086a20014198016a41086a2903002215370300200141d8006a41086a22032015370300200141d8006a41106a220e2014370300200141d8006a41186a220a2012370300200120012903980122123703782001201237035802402008200128024c470d00200141c8006a200810f20120012802482105200128025021080b200520084106746a220220113703082002200d370300200241106a2010370300200241186a2013370300200241206a2001290358370300200241286a2003290300370300200241306a200e290300370300200241386a200a2903003703002001200841016a220836025020092007470d000b0b200129024c210d2005450d060c070b200241ff0171450d00200141003a00b8020b200128024c41ffffff1f710d020c030b1034000b1033000b200510260b0b41002105200141003602e802200142013703e0022001410e3602c4022001200141286a3602c0022001200141e0026a3602f801200141ac026a41013602002001420137029c022001418c8dc600360298022001200141c0026a3602a802200141f8016a41c4e1c00020014198026a10351a20012802e00220012802e80210840220012802e402450d0020012802e00210260b2006450d00200410260b0240024020050d0020004100360208200042083702000c010b2000200d370204200020053602000b20014180036a24000bd80301047f230041c0006b2202240041bfe3c0002103410f21044108210502400240024002400240024002400240024002400240024002400240024002400240200141ff01710e11000102030405060708090a0b0c0d0e0f10000b2002411c6a41013602002002420137020c200241dcedc6003602082002410436022420024190f6c6003602202002200241206a360218200241086a41ecc0c700103d000b41ade3c000210341122105410021040c0e0b41dab3c600210341012104410821050c0d0b41a5e3c000210341022104410821050c0c0b419be3c0002103410a2105410321040c0b0b4191e3c0002103410a2105410421040c0a0b4187e3c0002103410a2105410521040c090b41f8e2c0002103410f2105410621040c080b41eae2c0002103410e2105410721040c070b41dae2c000210341102105410821040c060b41cee2c0002103410c2105410921040c050b41c1e2c0002103410d2105410a21040c040b41b4e2c0002103410d2105410b21040c030b41a3e2c000210341112105410c21040c020b4195e2c0002103410e2105410d21040c010b418fe2c000210341062105410e21040b20004183263b0100200041086a2005360200200041046a2003360200200041026a20043a0000200241c0006a24000bb406030d7f017e037f230041306b220224002002200141026a2f01003b012e2002200141066a2f01003b012c20022001410a6a2f01003b012a200141046a2d00002103200141056a2d00002104200141086a2d00002105200141096a2d000021062001410c6a2d000021072001410d6a2d0000210820012d0001210920012d0000210a20022001410e6a2f01003b0128200141116a2d0000210b200141106a2d0000210c2002200141126a2f01003b0126200141156a2d0000210d200141146a2d0000210e2002200141166a2f01003b01242001411a6a290100210f200141196a2d00002110200141186a2d000021112001280224210120022f012e211202400240200a0d0020012001280200417f6a220a360200200220123b0122200220022f012c3b0120200220022f012a3b011e200220022f01283b011c200220022f01263b011a200220022f01243b01182002200f3703080240200a0d002001280208200128020c2802001103000240200128020c280204450d00200128020810260b20012001280204417f6a220a360204200a0d00200110260b0240200941ff01714101460d00200041013a00000c020b200020022f01223b0001200041046a20043a0000200041036a20033a0000200041086a20063a0000200041076a20053a0000200041056a20022f01203b00002000410c6a20083a00002000410b6a20073a0000200041096a20022f011e3b0000200041106a200b3a00002000410f6a200c3a00002000410d6a20022f011c3b0000200041146a200d3a0000200041136a200e3a0000200041116a20022f011a3b0000200041186a20103a0000200041176a20113a0000200041003a0000200041156a20022f01183b0000200041196a20022903083700000c010b200220123b0120200220022f012c3b011e200220022f012a3b011c200220022f01283b011a200220022f01263b01182002200f37020c200220103a000b200220113a000a200220022f01243b0108200041013a000020012001280200417f6a220036020020000d002001280208200128020c2802001103000240200128020c280204450d00200128020810260b20012001280204417f6a220036020420000d00200110260b200241306a24000b930401057f230041e0006b22022400200241086a41918dc700410810fb01200241186a41c4a5c100410a10fb0102400240412010242203450d002002422037023c20022003360238200241386a41004120106d20022802382203200228024022046a22052001290000370000200541086a200141086a290000370000200541106a200141106a290000370000200541186a200141186a2900003700002002200441206a2201360240200241c8006a2003200110a202200241dc006a200320016a360200200220033602582002200241c8006a41086a3602542002200241c8006a360250200241286a200241d0006a10730240200228023c450d00200310260b2002280230220341206a2205417f4c0d010240024020050d0041012101410021050c010b200510242201450d010b20002001360200200041086a220141003602002000200536020420004100411010c9012000280200200128020022056a220420022900083700002001200541106a2205360200200441086a200241086a41086a29000037000020002005411010c9012000280200200128020022056a220420022900183700002001200541106a2206360200200441086a200241186a41086a2900003700002002280228210520002006200310c9012000280200200128020022006a2005200310cf061a2001200020036a3602000240200228022c450d00200510260b200241e0006a24000f0b1033000b1034000bf341050b7f027e017f027e257f230041f0086b220324002003200236021c20032001360218200341206a2001200210820202400240200328022022040d00200041023a00a4020c010b200328022421052003200341206a41086a2802003602bc02200320043602b8022003200341b8026a3602e805200341106a200341e8056a10b2050240024020032802100d00410821060240024002400240024002400240200328021422074180012007418001491b2201450d00200141057410242206450d010b200341003602f807200320013602f407200320063602f00702402007450d0020034198086a41106a210820034198086a41046a2109200341a0086a210a410021020340200341003602980820034198086a20032802b802220b20032802bc022201410420014104491b220c10cf061a20032001200c6b22013602bc022003200b200c6a220b3602b802024020034198086a200c6a220d2009460d00200d41004104200c6b10d1061a0b200335029808210e200341003a00c80520012001410047220c490d07200341c8056a200b200c10cf061a20032001200c6b220d3602bc022003200b200c6a220c3602b80202400240024020010d004200210f0c010b20032d00c805220141064b0d094200210f02400240024002400240024020010e0707000102030405070b20034198086a200d4110200d4110491b22016a41004100411020016b22102001410f4b1b10d106210b20034198086a200c200110cf061a2003200d20016b3602bc022003200c20016a3602b8020240200b2008460d00200b4100201010d1061a0b200a290300211120032903980821124201210f0c060b4202210f0c040b4203210f0c030b4204210f0c020b4205210f0c010b4206210f0b0b0240200220032802f407470d00200341f0076a200210ed0120032802f007210620032802f80721020b200620024105746a2201200f3703082001200e370300200141186a2011370300200141106a20123703002003200241016a22023602f8072007417f6a22070d000b0b2006450d0620032902f407210f200341a0086a220c4200370300200342003703980820034198086a20032802b802220b20032802bc022202411020024110491b220110cf061a2003200220016b3602bc022003200b20016a3602b802024020014110460d0020034198086a20016a4100411020016b10d1061a0b200c29030021112003290398082112200341086a200341e8056a10b20520032802080d0402400240200328020c2209413820094138491b220d0d004104210c0c010b200d41c8006c1024220c450d010b41002102200341003602d0052003200d3602cc052003200c3602c80502402009450d00200341f0076a410c6a2107200341f0076a410172210d410021020340200341f0076a200341e8056a10cc02024020032d00f007220b4106470d00200341e8046a41026a20034188056a41026a2d00003a000020034180076a41086a200341c0076a41086a29030037030020034180076a41106a200341c0076a41106a290300370300200341d8066a41086a20034198076a41086a290300370300200341d8066a41106a20034198076a41106a290300370300200341d8066a41186a20034198076a41186a290300370300200341d8066a41206a20034198076a41206a280200360200200320032f0188053b01e804200320032903c0073703800720032003290398073703d8060c050b200341a8056a41026a220a200d41026a2d00003a0000200341d8076a41086a2210200741086a290200370300200341d8076a41106a2213200741106a2902003703002003200d2f00003b01a805200320072902003703d80720032802f407210820032802f807210120034198086a200341e8056a10cc020240024020032d0098084106470d000240200b4101470d002001450d00200810260b4106210b0c010b20034188056a41026a200a2d00003a0000200341c0076a41086a2010290300370300200341c0076a41106a201329030037030020034198076a41086a20034198086a41086a29030037030020034198076a41106a20034198086a41106a29030037030020034198076a41186a20034198086a41186a29030037030020034198076a41206a20034198086a41206a280200360200200320032f01a8053b018805200320032903d8073703c00720032003290398083703980720082114200121150b200341e8046a41026a220120034188056a41026a2d00003a000020034180076a41086a2208200341c0076a41086a29030037030020034180076a41106a220a200341c0076a41106a290300370300200341d8066a41086a221020034198076a41086a290300370300200341d8066a41106a221320034198076a41106a290300370300200341d8066a41186a221620034198076a41186a290300370300200341d8066a41206a221720034198076a41206a280200360200200320032f0188053b01e804200320032903c0073703800720032003290398073703d806200b4106460d04200341c8046a41026a221820012d00003a0000200341c0066a41086a22192008290300370300200341c0066a41106a2208200a29030037030020034198066a41086a220a201029030037030020034198066a41106a2210201329030037030020034198066a41186a2213201629030037030020034198066a41206a22162017280200360200200320032f01e8043b01c80420032003290380073703c006200320032903d806370398060240200220032802cc05470d00200341c8056a2002410110ef0120032802c805210c20032802d00521020b200c200241c8006c6a2201200b3a0000200141086a2015360000200141046a2014360000200141036a20182d00003a0000200120032f01c8043b0001200141146a20192903003700002001411c6a20082903003700002001410c6a20032903c006370000200141246a200329039806370000200141346a20102903003700002001412c6a200a2903003700002001413c6a2013290300370000200141c4006a20162802003600002003200241016a22023602d0052009417f6a22090d000b20032802cc05210d0b200c450d0420034198086a200341e8056a10cc020240024002400240024020032d00980822094106460d00200341ec056a41026a20032d009b083a000020034180076a41086a200341ac086a220129020037030020034180076a41106a200341b4086a220b290200370300200320032f0099083b01ec052003200341a4086a22072902003703800720034198086a41086a22132802002108200328029c08210a20034198086a200341e8056a10cc0220032d00980822104106460d01200341f0056a41026a20032d009b083a0000200341c0076a41086a2001290200370300200341c0076a41106a200b290200370300200320032f0099083b01f005200320072902003703c00720132802002113200328029c08211620034198086a200341e8056a10cc0220032d00980822174106460d02200341f4056a41026a20032d009b083a0000200341d8076a41086a200341ac086a2201290200370300200341d8076a41106a200341b4086a220b290200370300200320032f0099083b01f4052003200341a4086a22072902003703d80720034198086a41086a22152802002118200328029c08211920034198086a200341e8056a10cc0220032d00980822144106460d03200341f8056a41026a20032d009b083a000020034198066a41086a200129020037030020034198066a41106a200b290200370300200320032f0099083b01f805200320072902003703980620152802002115200328029c08211a20034198086a200341e8056a10cc0220032d009808221b4106470d04024020144101470d002015450d00201a10260b024020174101470d002018450d00201910260b024020104101470d002013450d00201610260b024020094101470d002008450d00200a10260b02402002450d00200c200241c8006c6a2102200c21010340024020012d00004101470d00200141086a280200450d00200141046a28020010260b0240200141246a2d00004101470d002001412c6a280200450d00200141286a28020010260b200141c8006a22012002470d000b0b200d450d09200d41c8006c0d080c090b02402002450d00200c200241c8006c6a2102200c21010340024020012d00004101470d00200141086a280200450d00200141046a28020010260b0240200141246a2d00004101470d002001412c6a280200450d00200141286a28020010260b200141c8006a22012002470d000b0b200d450d08200d41c8006c0d070c080b024020094101470d002008450d00200a10260b02402002450d00200c200241c8006c6a2102200c21010340024020012d00004101470d00200141086a280200450d00200141046a28020010260b0240200141246a2d00004101470d002001412c6a280200450d00200141286a28020010260b200141c8006a22012002470d000b0b200d450d07200d41c8006c0d060c070b024020104101470d002013450d00201610260b024020094101470d002008450d00200a10260b02402002450d00200c200241c8006c6a2102200c21010340024020012d00004101470d00200141086a280200450d00200141046a28020010260b0240200141246a2d00004101470d002001412c6a280200450d00200141286a28020010260b200141c8006a22012002470d000b0b200d450d06200d41c8006c0d050c060b024020174101470d002018450d00201910260b024020104101470d002013450d00201610260b024020094101470d002008450d00200a10260b02402002450d00200c200241c8006c6a2102200c21010340024020012d00004101470d00200141086a280200450d00200141046a28020010260b0240200141246a2d00004101470d002001412c6a280200450d00200141286a28020010260b200141c8006a22012002470d000b0b200d450d05200d41c8006c0d040c050b200341fe056a20032d009b083a0000200341d8066a41086a200341ac086a290200370300200341e8066a200341b4086a290200370300200320032f0099083b01fc052003200341a4086a2902003703d80620034198086a41086a280200211c200328029c08211d200341003a00c805024020032802bc02220120014100472207490d00200341c8056a20032802b802221e200710cf061a2003200120076b220b3602bc022003201e20076a221e3602b802024020010d00410021010c030b20032d00c805220741014b0d0041002101024020070e020300030b200341003a00ac084100210102400340200341003a00c805200b200b4100472207490d01200341c8056a201e200710cf061a2003200b20076b221f3602bc022003201e20076a221e3602b8020240200b0d00200341003a00c8050b20034198086a20016a20032d00c8053a00002003200141016a22013a00ac08201f210b20014114470d000b20034198076a41106a220120034198086a41106a28020036020020034198076a41086a220b20034198086a41086a2903003703002003200329039808220e3703f0072003200e37039807200341c0066a41106a2001280200360200200341c0066a41086a200b29030037030020032003290398073703c006410121010c030b0240200141ff0171450d00200341003a00ac080b20034198076a41086a200341f0076a41086a2903003703000b0240201b4101470d00201c450d00201d10260b024020144101470d002015450d00201a10260b024020174101470d002018450d00201910260b024020104101470d002013450d00201610260b024020094101470d002008450d00200a10260b02402002450d00200c200241c8006c6a2102200c21010340024020012d00004101470d00200141086a280200450d00200141046a28020010260b0240200141246a2d00004101470d002001412c6a280200450d00200141286a28020010260b200141c8006a22012002470d000b0b200d450d04200d41c8006c0d030c040b1033000b20034180066a41106a200341c0066a41106a28020036020020034180066a41086a200341c0066a41086a290300370300200320032903c0063703800620034198086a200341e8056a10cc020240024020032d009808221e4106460d0020034194066a41026a220b20032d009b083a000020034198076a41086a200341ac086a29020037030020034198076a41106a200341b4086a290200370300200320032f0099083b0194062003200341a4086a2902003703980720034198086a41086a280200211f200328029c08212020034198086a200341e8056a10cc0220032d0098084106470d010240201e4101470d00201f450d00202010260b0240201b4101470d00201c450d00201d10260b024020144101470d002015450d00201a10260b024020174101470d002018450d00201910260b024020104101470d002013450d00201610260b024020094101470d002008450d00200a10260b02402002450d00200c200241c8006c6a2102200c21010340024020012d00004101470d00200141086a280200450d00200141046a28020010260b0240200141246a2d00004101470d002001412c6a280200450d00200141286a28020010260b200141c8006a22012002470d000b0b200d450d04200d41c8006c0d030c040b0240201b4101470d00201c450d00201d10260b024020144101470d002015450d00201a10260b024020174101470d002018450d00201910260b024020104101470d002013450d00201610260b024020094101470d002008450d00200a10260b02402002450d00200c200241c8006c6a2102200c21010340024020012d00004101470d00200141086a280200450d00200141046a28020010260b0240200141246a2d00004101470d002001412c6a280200450d00200141286a28020010260b200141c8006a22012002470d000b0b200d450d03200d41c8006c450d030c020b200341f0076a41206a20034198086a41206a280200360200200341f0076a41186a20034198086a41186a290300370300200341f0076a41106a20034198086a41106a2207290300370300200341f0076a41086a20034198086a41086a2221290300370300200341e4056a41026a200341ec056a41026a2d00003a0000200341c0066a41086a20034180076a41086a290300370300200341c0066a41106a20034180076a41106a29030037030020032003290398083703f007200320032f01ec053b01e40520032003290380073703c006200341e0056a41026a200341f0056a41026a2d00003a0000200320032f01f0053b01e005200341c8056a41106a200341c0076a41106a290300370300200341c8056a41086a200341c0076a41086a290300370300200320032903c0073703c805200341c4056a41026a200341f4056a41026a2d00003a0000200320032f01f4053b01c405200341a8056a41106a200341d8076a41106a290300370300200341a8056a41086a200341d8076a41086a290300370300200320032903d8073703a805200341a4056a41026a200341f8056a41026a2d00003a0000200320032f01f8053b01a40520034188056a41106a20034198066a41106a29030037030020034188056a41086a20034198066a41086a29030037030020032003290398063703880520034184056a41026a200341fc056a41026a2d00003a0000200320032f01fc053b018405200341e8046a41106a200341d8066a41106a290300370300200341e8046a41086a200341d8066a41086a290300370300200320032903d8063703e804200720034180066a41106a280200360200202120034180066a41086a290300370300200320032903800637039808200341e4046a41026a200b2d00003a0000200320032f0194063b01e404200341c8046a41106a20034198076a41106a290300370300200341c8046a41086a20034198076a41086a29030037030020032003290398073703c8040c050b02402002450d00200c200241c8006c6a2102200c21010340024020012d00004101470d00200141086a280200450d00200141046a28020010260b0240200141246a2d00004101470d002001412c6a280200450d00200141286a28020010260b200141c8006a22012002470d000b0b20032802cc052201450d01200141c8006c450d010b200c10260b200f42ffffff3f83500d0120061026410221010c020b20032802f40741ffffff3f71450d0020061026410221010c010b410221010b200341c4046a41026a200341e4056a41026a2d00003a0000200341a8046a41086a200341c0066a41086a290300370300200341a8046a41106a2221200341c0066a41106a290300370300200341a4046a41026a200341e0056a41026a2d00003a000020034188046a41086a200341c8056a41086a29030037030020034188046a41106a2222200341c8056a41106a290300370300200320032f01e4053b01c404200320032903c0063703a804200320032f01e0053b01a404200320032903c8053703880420034184046a41026a200341c4056a41026a2d00003a0000200341e8036a41086a200341a8056a41086a290300370300200341e8036a41106a2223200341a8056a41106a290300370300200341e4036a41026a200341a4056a41026a2d00003a0000200341c8036a41086a20034188056a41086a290300370300200341c8036a41106a222420034188056a41106a290300370300200320032f01c4053b018404200320032903a8053703e803200320032f01a4053b01e40320032003290388053703c803200341c4036a41026a20034184056a41026a2d00003a0000200341a8036a41106a2225200341e8046a41106a290300370300200341a8036a41086a200341e8046a41086a290300370300200341a4036a41026a200341e4046a41026a2d00003a000020034188036a41106a2226200341c8046a41106a29030037030020034188036a41086a200341c8046a41086a290300370300200320032f0184053b01c403200320032903e8043703a803200320032f01e4043b01a403200320032903c80437038803200341e0026a41206a2227200341f0076a41206a280200360200200341e0026a41186a2228200341f0076a41186a290300370300200341e0026a41106a2229200341f0076a41106a290300370300200341e0026a41086a200341f0076a41086a290300370300200320032903f0073703e002200341c0026a41176a20034198086a41176a220b280000360000200341c0026a41106a20034198086a41106a2207290300370300200341c0026a41086a20034198086a41086a29030037030020032003290398083703c0020240024020014102470d00200341003602f807200342013703f0072003410e36029c072003200341186a360298072003200341f0076a3602d806200341ac086a41013602002003420137029c082003418c8dc60036029808200320034198076a3602a808200341d8066a41c4e1c00020034198086a10351a20032802f00720032802f80710840220032802f407450d0120032802f00710260c010b200341b4026a41026a222a200341c4046a41026a2d00003a000020034198026a41086a222b200341a8046a41086a29030037030020034198026a41106a222c202129030037030020034194026a41026a2221200341a4046a41026a2d00003a0000200341f8016a41086a222d20034188046a41086a290300370300200341f8016a41106a222e2022290300370300200320032f01c4043b01b402200320032903a80437039802200320032f01a4043b01940220032003290388043703f801200341f4016a41026a222220034184046a41026a2d00003a0000200341d8016a41086a222f200341e8036a41086a290300370300200341d8016a41106a22302023290300370300200341d4016a41026a2223200341e4036a41026a2d00003a0000200341b8016a41086a2231200341c8036a41086a290300370300200341b8016a41106a22322024290300370300200320032f0184043b01f401200320032903e8033703d801200320032f01e4033b01d401200320032903c8033703b801200341b4016a41026a2224200341c4036a41026a2d00003a000020034198016a41106a2233202529030037030020034198016a41086a2225200341a8036a41086a29030037030020034194016a41026a2234200341a4036a41026a2d00003a0000200341f8006a41106a22352026290300370300200341f8006a41086a222620034188036a41086a290300370300200320032f01c4033b01b401200320032903a80337039801200320032f01a4033b0194012003200329038803370378200341d0006a41206a22362027280200360200200341d0006a41186a22272028290300370300200341d0006a41106a22282029290300370300200341d0006a41086a2229200341e0026a41086a290300370300200320032903e002370350200341306a410f6a200341c0026a410f6a290000370000200341306a41086a2237200341c0026a41086a290300370300200320032903c0023703302000201137030820002012370300200020093a0028200020023602242000200d3602202000200c36021c2000200f37021420002006360210200020083602302000200a36022c200020032f01b4023b00292000412b6a202a2d00003a000020002003290398023702342000413c6a202b290300370200200041c4006a202c290300370200200020103a004c200041cf006a20212d00003a0000200020032f0194023b004d2000201336025420002016360250200041e8006a202e290300370200200041e0006a202d290300370200200020032903f801370258200020173a0070200041f3006a20222d00003a0000200020032f01f4013b007120002018360278200020193602742000418c016a203029030037020020004184016a202f290300370200200020032903d80137027c200020143a00940120004197016a20232d00003a0000200020032f01d4013b0095012000201536029c012000201a36029801200041b0016a2032290300370200200041a8016a2031290300370200200020032903b8013702a0012000201b3a00b801200041bb016a20242d00003a0000200020032f01b4013b00b9012000201c3602c0012000201d3602bc01200041d4016a2033290300370200200041cc016a202529030037020020002003290398013702c4012000201e3a00dc01200041df016a20342d00003a0000200020032f0194013b00dd012000201f3602e401200020203602e001200041f8016a2035290300370200200041f0016a2026290300370200200020032903783702e801200041a0026a203628020036020020004198026a202729030037020020004190026a202829030037020020004188026a20292903003702002000200329035037028002200b200341306a41176a2800003600002007200341306a41106a29030037030020034198086a41086a220220372903003703002003200329033037039808200041bc026a200b280000360000200041b5026a2007290300370000200041ad026a200229030037000020002003290398083700a5020b200020013a00a4022005450d00200410260b200341f0086a24000ba11007037f027e037f097e037f027e027f230041d0026b2204240002400240024002400240024002402002200384500d00200441186a200110d803200441286a200428021822052004280220220610d903200429032821074200210820044200370328200441f0006a280200210920042d0074210a024002402007420152220b450d004200210c4200210d4200210e4200210f4200211042002111420021120c010b200441e0006a290300210d200441d8006a290300210c200441d0006a2903002108200441c8006a2903002110200441c0006a290300210f2004290338211220042903302111200441e8006a290300210e0b201120027d2213201156201220037d2011200254ad7d221420125620142012511b0d0102400240200f20027c2212200f542215201020037c2015ad7c221120105420112010511b0d0020044188016a200110d803200441d0016a200428028801221620042802900110d90320044180026a290300420020042903d00142015122151b2110200441f8016a290300420020151b210f0240200428028c01450d00201610260b0240200f201356201020145620102014511b0d00200441043a00780c060b200441f8006a410210eb022012210f201121100c010b200441f8006a410310eb020b20132111201421120c020b200041043a00000c050b200441f8006a410410eb020b20042d00784104470d01201121132012211420102111200f21120b200441b0016a2216200c370300200441a0016a2011370300200441b8016a2217200d370300200420083703a80120042012370398012004201337038801200420143703900102400240427f201320127c221020102013542215201420117c2015ad7c221020145420102014511b22151b220f4280c8afa025544100427f201020151b2210501b0d0020044198016a2903002111201729030021122016290300210f200441a8016a2903002108200429039001210c200429038801210d4201211820042903a00121190c010b02400240201320128420142011848450450d00420021180c010b42002118200441d0016a41186a22164200370300200441d0016a41106a22174200370300200441d0016a41086a22154200370300200442003703d001200441c0016a419a8cc700410810fb012015200441c0016a41086a221a290000370300200420042900c0013703d001200441c0016a41b8a1c300410d10fb012016201a290000370300201720042900c0013703002004200441d0016a108d02200441106a2903002111200429030821122004280200211b201642003703002017420037030020154200370300200442003703d001200441c0016a419a8cc700410810fb012015201a290000370300200420042900c0013703d001200441c0016a41b8a1c300410d10fb012016201a290000370300201720042900c0013703002004420020114200201b1b221120107d20124200201b1b2212200f54ad7d22082012200f7d220c201256200820115620082011511b22161b3703c80120044200200c20161b3703c001200441d0016a4120200441c0016a411010b30120044188026a201037030020044180026a200f370300201541013a0000200441d9016a2001290000370000200441e1016a200141086a290000370000200441e9016a200141106a290000370000200441f1016a200141186a290000370000200441023a00d001200441d0016a1087020b0b20074201512115200bad2110200441d0006a2008370300200441e8006a200e370300200441d8006a200f370300200441386a200c370300200441e0006a2012370300200441c0006a2011370300200420193703482004200d3703304100210b2004200a4100200742015122161b3a007420042009410020161b360270200420184201512209ad3703280240024020090d002005200610ff01420021072013211120142112410021090c010b20052006200441306a10da03420021074101210920132111201421120b0c010b200429027c22144280807c8321072014420888a72109200428027821062014a721154101210b0b0240200428021c450d00200510260b0240024002400240200b0d000240200941ff01712206450d00201541ff0171450d020b20060d02201541ff0171450d02200441d0016a41086a41043a0000200441d9016a2001290000370000200441e1016a200141086a290000370000200441e9016a200141106a290000370000200441f1016a200141186a290000370000200441003a00d001200441d0016a1087020c020b200641ff01714104460d02200020063a0000200041036a20064118763a0000200020064108763b0001200041046a2009ad42ff01834208862015ad42ff0183842007843700000c030b200441d0016a41086a41033a0000200441d9016a2001290000370000200441e1016a200141086a290000370000200441e9016a200141106a290000370000200441f1016a200141186a290000370000200441003a00d001200441d0016a1087020b20104201520d0020044188026a201237030020044180026a2011370300200441d0016a41086a41003a0000200441d9016a2001290000370000200441e1016a200141086a290000370000200441e9016a200141106a290000370000200441f1016a200141186a290000370000200441023a00d001200441d0016a1087020b20044188026a200337030020044180026a2002370300200441d0016a41086a41053a0000200441d9016a2001290000370000200441e1016a200141086a290000370000200441e9016a200141106a290000370000200441f1016a200141186a290000370000200441023a00d001200441d0016a108702200041043a00000b200441d0026a24000bf70d07037f027e027f097e017f037e047f230041c0026b2204240002400240200220038450450d0042002102420021030c010b200441186a200110d803200441286a200428021822052004280220220610d903200429032821074200210820044200370328200441f0006a280200210920042d0074210a0240024020074201510d004200210b4200210c4200210d4200210e4200210f420021104200211142002112420021130c010b200441e0006a290300210c200441286a41306a290300210b200441286a41286a2903002108200441c8006a2903002111200441286a41186a290300210e2004290338211320042903302112200441e8006a290300210d4200210f420021100b200441f8006a41286a200b370300200441f8006a41306a200c370300200441f8006a41186a2011200f84220b2003200b2010200e84220c200256200b200356200b2003511b22141b220e7d200c2002200c20141b220b54ad7d220f37030020042008370398012004200c200b7d2208370388012004427f2013200e7c2012200b7c22102012542214ad7c220c2014200c201354200c2013511b22141b2213370380012004427f201020141b220c37037802400240427f200c20087c22122012200c5422142013200f7c2014ad7c221220135420122013511b22141b22104280c8afa025544100427f201220141b2211501b0d0020044188016a2903002108200441a8016a290300210f200441a0016a290300211020044198016a29030021112004290380012115200429037821164201211220042903900121170c010b02400240200c2008842013200f848450450d00420021120c010b42002112200441c0016a41186a22184200370300200441c0016a41106a22194200370300200441c0016a41086a22144200370300200442003703c001200441b0016a419a8cc700410810fb012014200441b0016a41086a221a290000370300200420042900b0013703c001200441b0016a41b8a1c300410d10fb012018201a290000370300201920042900b0013703002004200441c0016a108d02200441106a29030021082004290308210f2004280200211b201842003703002019420037030020144200370300200442003703c001200441b0016a419a8cc700410810fb012014201a290000370300200420042900b0013703c001200441b0016a41b8a1c300410d10fb012018201a290000370300201920042900b0013703002004420020084200201b1b220820117d200f4200201b1b220f201054ad7d2215200f20107d2216200f56201520085620152008511b22181b3703b80120044200201620181b3703b001200441c0016a4120200441b0016a411010b301200441f8016a2011370300200441f0016a2010370300201441013a0000200441c9016a2001290000370000200441d1016a200141086a290000370000200441d9016a200141106a290000370000200441e1016a200141186a290000370000200441023a00c001200441c0016a1087020b0b200441d0006a2011370300200441e8006a200d370300200441d8006a2010370300200441386a2015370300200441e0006a200f370300200441c0006a200837030020042017370348200420163703302004200a4100200742015122141b3a007420042009410020141b360270200420124201512209ad3703280240024020090d002005200610ff010c010b20052006200441306a10da030b0240200428021c450d00200510260b20124201522105024002400240200742015122060d002005450d010b2006200571450d01200441c0016a41086a41043a0000200441c9016a2001290000370000200441d1016a200141086a290000370000200441d9016a200141106a290000370000200441e1016a200141186a290000370000200441003a00c001200441c0016a1087020c010b200441c0016a41086a41033a0000200441c9016a2001290000370000200441d1016a200141086a290000370000200441d9016a200141106a290000370000200441e1016a200141186a290000370000200441003a00c001200441c0016a1087020b024020074201510d00200441f8016a2013370300200441f0016a200c370300200441c0016a41086a41003a0000200441c9016a2001290000370000200441d1016a200141086a290000370000200441d9016a200141106a290000370000200441e1016a200141186a290000370000200441023a00c001200441c0016a1087020b200441f8016a200e370300200441f0016a200b370300200441c0016a41086a41063a0000200441c9016a2001290000370000200441d1016a200141086a290000370000200441d9016a200141106a290000370000200441e1016a200141186a290000370000200441023a00c0012003200e7d2002200b54ad7d21032002200b7d2102200441c0016a1087020b2000200237030020002003370308200441c0026a24000b800202057f027e230041106b220324002003410036020820034201370300200228021021042003200241186a280200220510a10102402005450d00200420054105746a2106034020042802002105200320032802084104106d2003280200200328020822076a20053600002003200741046a360208200441086a200310cb022006200441206a2204470d000b0b200241086a290300210820022903002109200320032802084110106d2003280200200328020822046a22052008370008200520093700002003200441106a36020820032002411c6a10a9012000200120032802002204200328020810b30102402003280204450d00200410260b200341106a24000b930401057f230041e0006b22022400200241086a41918dc700410810fb01200241186a41c4a6c100410610fb0102400240412010242203450d002002422037023c20022003360238200241386a41004120106d20022802382203200228024022046a22052001290000370000200541086a200141086a290000370000200541106a200141106a290000370000200541186a200141186a2900003700002002200441206a2201360240200241c8006a2003200110a202200241dc006a200320016a360200200220033602582002200241c8006a41086a3602542002200241c8006a360250200241286a200241d0006a10730240200228023c450d00200310260b2002280230220341206a2205417f4c0d010240024020050d0041012101410021050c010b200510242201450d010b20002001360200200041086a220141003602002000200536020420004100411010c9012000280200200128020022056a220420022900083700002001200541106a2205360200200441086a200241086a41086a29000037000020002005411010c9012000280200200128020022056a220420022900183700002001200541106a2206360200200441086a200241186a41086a2900003700002002280228210520002006200310c9012000280200200128020022006a2005200310cf061a2001200020036a3602000240200228022c450d00200510260b200241e0006a24000f0b1033000b1034000beb0202027f037e230041e0006b220324002003200236020c20032001360208200341106a2001200210820202400240200328021022010d00200041003602100c010b200328021421042003200341106a41086a2802002202360224200320013602200240024020024110490d002003200241706a3602242003200141106a360220200141086a290000210520012900002106200341c8006a200341206a10920120032802482202450d00200329024c2107200020053703082000200637030020002007370214200020023602100c010b20034100360230200342013703282003410e36023c2003200341086a3602382003200341286a360244200341dc006a41013602002003420137024c2003418c8dc6003602482003200341386a360258200341c4006a41c4e1c000200341c8006a10351a200328022820032802301084020240200328022c450d00200328022810260b200041003602100b2004450d00200110260b200341e0006a24000bbd07010a7f23004180026b220324002003200236020c20032001360208200341106a2001200210820202400240200328021022040d00200041063a00200c010b200328021421052003200341186a280200220636029401200320043602900141002101200341003a00d801024002400240034020062001460d01200341b8016a20016a200420016a22022d00003a00002003200241016a360290012003200141016a22023a00d8012002210120024120470d000b2003200620026b36029401200341206a41186a2201200341b8016a41186a290300370300200341206a41106a2206200341b8016a41106a290300370300200341206a41086a2207200341b8016a41086a290300370300200320032903b801370320200241ff01714120490d0120034198016a41086a200729030037030020034198016a41106a200629030037030020034198016a41186a20012903003703002003200329032037039801200341b8016a20034190016a10cf0220032d00b80122014106460d01200341f0006a41186a220220034198016a41186a290300370300200341f0006a41106a220620034198016a41106a290300370300200341f0006a41086a220720034198016a41086a290300370300200341c8006a41086a2208200341c1016a290000370300200341c8006a41106a2209200341c9016a290000370300200341c8006a41186a220a200341d1016a290000370300200341c8006a411f6a220b200341d8016a2800003600002003200329039801370370200320032900b901370348200341206a411f6a220c200b280000360000200341206a41186a220b200a290300370300200341206a41106a220a2009290300370300200341206a41086a22092008290300370300200041186a2002290300370200200041106a2006290300370200200041086a20072903003702002000200329037037020020032003290348370320200041c0006a200c280000360000200041396a200b290300370000200041316a200a290300370000200041296a2009290300370000200020032903203700210c020b2003410036029401200141ff0171450d00200341003a00d8010b20034100360250200342013703482003410e3602242003200341086a3602202003200341c8006a3602e001200341cc016a4101360200200342013702bc012003418c8dc6003602b8012003200341206a3602c801200341e0016a41c4e1c000200341b8016a10351a200328024820032802501084020240200328024c450d00200328024810260b410621010b200020013a00202005450d00200410260b20034180026a24000bea0101047f230041206b220324002003410036020820034201370300200341004120106d2003280200200328020822046a22052002290000370000200541086a200241086a290000370000200541106a200241106a290000370000200541186a200241186a2900003700002003200441206a2204360208200341106a200241206a108501200328021021052003200420032802182202106d20032802002204200328020822066a2005200210cf061a2003200620026a220236020802402003280214450d00200510260b200020012004200210b30102402003280204450d00200410260b200341206a24000bb5230d037f027e037f077e057f037e017f027e017f017e017f017e027f230041b0046b2206240002400240024002400240024002400240024002402003200484500d0020012002460d0520012002412010d206450d05200641c8006a200210d803200641d8006a200628024822072006280250220810d903200629035821094200210a20064200370358200641d8006a41c8006a280200210b20062d00a401210c2009420152220d0d03200641d8006a41386a290300210e200641d8006a41306a290300210f200641d8006a41206a2903002110200641d8006a41186a290300211120064198016a29030021122006290368211320062903602114200641a8016a41206a200641d8006a41286a290300370300200641a8016a41286a200f370300200641a8016a41306a200e370300200641b8016a2011370300200620103703c001200620123703e001200620143703a801200620133703b0012006200641a8016a3602840220064188026a200110d80320064198026a2006280288022215200628029002221610d9032006290398022110200642003703980220064198026a41c8006a280200211720062d00e402211820104201522219450d014200210e42002111420021144200211a4200211b4200211c420021134200210f0c020b20004100360200200041106a4200370300200041086a42003703000c080b20064198026a41386a290300211c20064198026a41306a290300211b20064198026a41286a290300211a20064198026a41206a290300210e20064198026a41186a290300211120062903a802210f20062903a0022113200641d8026a29030021144200210a0b2004200a200e84220e2011200a842211200356200e200456200e2004511b221d1b211220032011201d1b210a024002400240024002400240024002402005450d0020062903b801221e200a7c221f201e54221d200641c0016a2220290300221e20127c201dad7c2221201e542021201e511b0d03202020213703002006201f3703b8010c010b20062903a801221e200a7c221f201e54221d200641b0016a290300221e20127c201dad7c2221201e542021201e511b0d012006201f3703a801200620213703b0010b20064190036a2220201b37030020064198036a2222201c37030020064180036a200e20127d2011200a54ad7d221b3703002006201a3703880320062011200a7d22113703f802200620133703e8022006200f3703f002427f201320117c220e200e201354221d200f201b7c201dad7c220e200f54200e200f511b221d1b221a4280c8afa025544100427f200e201d1b220e501b0d03200641f8026a29030021112022290300211a2020290300211b20064188036a290300211c20062903f002211e20062903e80221214201211f20062903800321230c040b200641b0036a410310eb020c010b200641b0036a410310eb020b20062802b003211720062902b403220e4280807c832110200e420888a72116200ea7211d410121190c020b024002402013201184200f201b848450450d004200211f0c010b4200211f200641b0036a41186a22204200370300200641b0036a41106a22224200370300200641b0036a41086a221d4200370300200642003703b003200641a0036a419a8cc700410810fb01201d200641a0036a41086a2224290000370300200620062900a0033703b003200641a0036a41b8a1c300410d10fb0120202024290000370300202220062900a003370300200641306a200641b0036a108d02200641306a41106a29030021112006290338211b200628023021252020420037030020224200370300201d4200370300200642003703b003200641a0036a419a8cc700410810fb01201d2024290000370300200620062900a0033703b003200641a0036a41b8a1c300410d10fb0120202024290000370300202220062900a003370300200642002011420020251b2211200e7d201b420020251b221b201a54ad7d221c201b201a7d221e201b56201c201156201c2011511b22201b3703a80320064200201e20201b3703a003200641b0036a4120200641a0036a411010b301200641e8036a200e370300200641e0036a201a370300201d41013a0000200641b9036a2001290000370000200641c1036a200141086a290000370000200641c9036a200141106a290000370000200641d1036a200141186a290000370000200641023a00b003200641b0036a1087020b0b2010420151211d2019ad210e200641c0026a201c370300200641d8026a2014370300200641c8026a201b370300200641a8026a201e370300200641d0026a201a370300200641b0026a2011370300200620233703b802200620213703a00241002119200620184100201042015122201b3a00e40220062017410020201b3602e0022006201f4201512217ad370398020240024020170d002015201610ff0142002110410021160c010b20152016200641a0026a10da0342002110410121160b0b0240200628028c02450d00201510260b02400240024020190d000240201641ff01712215450d00201d41ff0171450d020b20150d02201d41ff0171450d02200641b0036a41086a41043a0000200641b9036a2001290000370000200641c1036a200141086a290000370000200641c9036a200141106a290000370000200641d1036a200141186a290000370000200641003a00b003200641b0036a1087020c020b200641f0016a2016ad42ff0183420886201dad42ff018384201084370300200620173602ec0141012115200641013602e8010c030b200641b0036a41086a41033a0000200641b9036a2001290000370000200641c1036a200141086a290000370000200641c9036a200141106a290000370000200641d1036a200141186a290000370000200641003a00b003200641b0036a1087020b0240200e4201520d00200641e8036a200f370300200641e0036a2013370300200641b0036a41086a41003a0000200641b9036a2001290000370000200641c1036a200141086a290000370000200641c9036a200141106a290000370000200641d1036a200141186a290000370000200641023a00b003200641b0036a1087020b200641f8016a2012370300200641f0016a200a37030041002115200641003602e8010c010b200641a8016a41386a4200370300200641a8016a41306a4200370300200641a8016a41286a4200370300200641c8016a4200370300200641a8016a41186a4200370300200641b8016a4200370300200641a8016a41086a4200370300200642003703a8012006200641a8016a36028402200641b0036a410810eb02200641f4016a200641b0036a41086a28020036020041012115200641013602e801200620062903b0033702ec010b200641e8026a41086a221d200641a8016a41186a290300370300200641e8026a41106a2219200641a8016a41206a290300370300200641e8026a41186a2216200641a8016a41286a290300370300200641e8026a41206a2217200641a8016a41306a290300370300200620062903b8013703e802200641a8016a41086a290300210a20062903a801210e024002402015450d00200641e8016a41086a29030022094280807c8321122009420888a7210b20062802ec01210c2009a721154101210d0c010b200641e0016a2903002114200641e8016a41106a2903002110200641e8016a41086a290300210f20064198026a41186a201d290300221237030020064198026a41206a201929030037030020064198026a41286a201629030037030020064198026a41306a2017290300370300200620062903e80222133703a8022006200e370398022006200a3703a00202400240427f200e20137c22112011200e542215200a20127c2015ad7c2211200a542011200a511b22151b221a4280c8afa025544100427f201120151b2211501b0d00200641a8026a2903002112200641c8026a2903002113200641c0026a290300211a200641b8026a290300211b20062903a002211c200629039802211e4201211f20062903b00221210c010b02400240200e201384200a2012848450450d004200211f0c010b4200211f200641b0036a41186a221d4200370300200641b0036a41106a22194200370300200641b0036a41086a22154200370300200642003703b003200641a0036a419a8cc700410810fb012015200641a0036a41086a2216290000370300200620062900a0033703b003200641a0036a41b8a1c300410d10fb01201d2016290000370300201920062900a003370300200641186a200641b0036a108d02200641186a41106a29030021122006290320211320062802182117201d42003703002019420037030020154200370300200642003703b003200641a0036a419a8cc700410810fb0120152016290000370300200620062900a0033703b003200641a0036a41b8a1c300410d10fb01201d2016290000370300201920062900a003370300200642002012420020171b221220117d2013420020171b2213201a54ad7d221b2013201a7d221c201356201b201256201b2012511b221d1b3703a80320064200201c201d1b3703a003200641b0036a4120200641a0036a411010b301200641e8036a2011370300200641e0036a201a370300201541013a0000200641b9036a2002290000370000200641c1036a200241086a290000370000200641c9036a200241106a290000370000200641d1036a200241186a290000370000200641023a00b003200641b0036a1087020b0b20094201512115200dad211120064180016a201b37030020064188016a201a370300200641e8006a201c37030020064190016a2013370300200641f0006a20123703002006202137037820062014370398012006201e3703604100210d2006200c41002009420151221d1b3a00a4012006200b4100201d1b3602a0012006201f420151220bad37035802400240200b0d002007200810ff01420021124100210b0c010b20072008200641e0006a10da03420021124101210b0b0b0240200628024c450d00200710260b200d0d010240200b41ff01712207450d00201541ff0171450d030b20070d03201541ff0171450d03200641b0036a41086a41043a0000200641b9036a2002290000370000200641c1036a200241086a290000370000200641c9036a200241106a290000370000200641d1036a200241186a290000370000200641003a00b003200641b0036a1087020c030b02402005450d0020064198026a200110d803200641b0036a200628029802220120062802a00210d903200641d0036a290300420020062903b00342015122021b2109200641c8036a290300420020021b210a0240200628029c02450d00200110260b20004100360200200041106a4200200420097d2003200a54ad7d22092003200a7d220a200356200920045620092004511b22021b370300200041086a4200200a20021b3703000c040b200641086a20012003200410da0220062903082103200041106a200641086a41086a290300370300200041086a2003370300200041003602000c030b2000200c36020420004101360200200041086a200bad42ff01834208862015ad42ff0183842012843702000c020b200641b0036a41086a41033a0000200641b9036a2002290000370000200641c1036a200241086a290000370000200641c9036a200241106a290000370000200641d1036a200241186a290000370000200641003a00b003200641b0036a1087020b024020114201520d00200641e8036a200a370300200641e0036a200e370300200641b0036a41086a41003a0000200641b9036a2002290000370000200641c1036a200241086a290000370000200641c9036a200241106a290000370000200641d1036a200241186a290000370000200641023a00b003200641b0036a1087020b20064188046a201037030020064180046a200f370300200641b0036a41086a41073a0000200641b9036a2001290000370000200641d9036a2002290000370000200641f9036a20053a0000200641c1036a200141086a290000370000200641c9036a200141106a290000370000200641d1036a200141186a290000370000200641e1036a200241086a290000370000200641e9036a200241106a290000370000200641f1036a200241186a290000370000200641023a00b003200641b0036a108702200041106a200420107d2003200f54ad7d370300200041086a2003200f7d370300200041003602000b200641b0046a24000bf90c09017f027e027f027e027f077e017f037e047f230041c0026b2204240002400240200220038450450d00420021024200210342002105420021060c010b200441186a200110d803200441286a200428021822072004280220220810d903200429032821094200210a20044200370328200441f0006a280200210b20042d0074210c0240024020094201510d0042002105420021064200210d4200210e4200210f420021104200211142002112420021130c010b200441e0006a2903002106200441286a41306a2903002105200441286a41286a290300210a200441c8006a2903002111200441286a41186a290300210e2004290338211320042903302112200441e8006a290300210d4200210f420021100b200441f8006a41286a2005370300200441f8006a41306a2006370300200441f8006a41186a2011200f842205200320052010200e84220e200256200520035620052003511b22141b22067d200e2002200e20141b220554ad7d220f3703002004200a370398012004200e20057d220a3703880120042012370378200420133703800102400240427f2012200a7c220e200e20125422142013200f7c2014ad7c220e201354200e2013511b22141b22104280c8afa025544100427f200e20141b2211501b0d0020044188016a290300210a200441a8016a290300210f200441a0016a290300211020044198016a29030021112004290380012115200429037821164201210e20042903900121170c010b024002402012200a842013200f848450450d004200210e0c010b4200210e200441c0016a41186a22184200370300200441c0016a41106a22194200370300200441c0016a41086a22144200370300200442003703c001200441b0016a419a8cc700410810fb012014200441b0016a41086a221a290000370300200420042900b0013703c001200441b0016a41b8a1c300410d10fb012018201a290000370300201920042900b0013703002004200441c0016a108d02200441106a290300210a2004290308210f2004280200211b201842003703002019420037030020144200370300200442003703c001200441b0016a419a8cc700410810fb012014201a290000370300200420042900b0013703c001200441b0016a41b8a1c300410d10fb012018201a290000370300201920042900b00137030020044200200a4200201b1b220a20117d200f4200201b1b220f201054ad7d2215200f20107d2216200f562015200a562015200a511b22181b3703b80120044200201620181b3703b001200441c0016a4120200441b0016a411010b301200441f8016a2011370300200441f0016a2010370300201441013a0000200441c9016a2001290000370000200441d1016a200141086a290000370000200441d9016a200141106a290000370000200441e1016a200141186a290000370000200441023a00c001200441c0016a1087020b0b200441d0006a2011370300200441e8006a200d370300200441d8006a2010370300200441386a2015370300200441e0006a200f370300200441c0006a200a37030020042017370348200420163703302004200c4100200942015122141b3a00742004200b410020141b3602702004200e420151220bad37032802400240200b0d002007200810ff010c010b20072008200441306a10da030b200220055421080240200428021c450d00200710260b200320067d21032008ad210a200e4201522107024002400240200942015122080d002007450d010b2008200771450d01200441c0016a41086a41043a0000200441c9016a2001290000370000200441d1016a200141086a290000370000200441d9016a200141106a290000370000200441e1016a200141186a290000370000200441003a00c001200441c0016a1087020c010b200441c0016a41086a41033a0000200441c9016a2001290000370000200441d1016a200141086a290000370000200441d9016a200141106a290000370000200441e1016a200141186a290000370000200441003a00c001200441c0016a1087020b2003200a7d2103200220057d210220094201510d00200441f8016a2013370300200441f0016a2012370300200441c0016a41086a41003a0000200441c9016a2001290000370000200441d1016a200141086a290000370000200441d9016a200141106a290000370000200441e1016a200141186a290000370000200441023a00c001200441c0016a1087020b2000200237031020002005370300200041186a200337030020002006370308200441c0026a24000bdb0203037f027e027f230041106b2203240002400240200241186a2802004105744114722204417f4c0d00200410242205450d01200341003602082003200436020420032005360200200241086a290300210620022903002107200341004110106d2003280200200328020822046a22052006370008200520073700002003200441106a3602082002280210210420032002280218220210a1010240024020020d0020032802002108200328020821020c010b20024105742105200328020821020340200320024120106d20032802002208200328020822096a22022004290000370000200241086a200441086a290000370000200241106a200441106a290000370000200241186a200441186a2900003700002003200941206a2202360208200441206a2104200541606a22050d000b0b200020012008200210b30102402003280204450d00200810260b200341106a24000f0b1034000b1033000b960b03077f017e047f23004190036b2202240041002103200241003a00c8022001280204417f6a210402400240024002400240024002400240024003402004417f460d01200241a8026a20036a200128020022052d00003a0000200120043602042001200541016a3602002002200341016a22053a00c8022004417f6a21042005210320054120470d000b200241d0026a41086a2204200241a8026a41086a290300370300200241d0026a41106a2203200241a8026a41106a290300370300200241d0026a41186a2206200241a8026a41186a290300370300200220022903a8023703d002200541ff0171411f4d0d01200241e8006a41086a2004290300370300200241e8006a41106a2003290300370300200241e8006a41186a2006290300370300200220022903d00237036820022001108f0120022802000d062002280204210641002103200241003a00c8022001280204417f6a210403402004417f460d03200241a8026a20036a200128020022052d00003a0000200120043602042001200541016a3602002002200341016a22053a00c8022004417f6a21042005210320054120470d000b200241d0026a41086a2203200241a8026a41086a290300370300200241d0026a41106a2207200241a8026a41106a290300370300200241d0026a41186a2208200241a8026a41186a290300370300200220022903a8023703d002200541ff0171411f4d0d0320024188016a41086a200329030037030020024188016a41106a200729030037030020024188016a41186a2008290300370300200220022903d0023703880141002103200241003a00c80203402004417f460d05200241a8026a20036a200128020022052d00003a0000200120043602042001200541016a3602002002200341016a22053a00c8022004417f6a21042005210320054120470d000b200241d0026a41086a2204200241a8026a41086a290300370300200241d0026a41106a2203200241a8026a41106a290300370300200241d0026a41186a2207200241a8026a41186a290300370300200220022903a8023703d002200541ff0171411f4d0d05200241a8016a41086a2004290300370300200241a8016a41106a2003290300370300200241a8016a41186a2007290300370300200220022903d0023703a801200241a8026a200110e40220022802a8022204450d0720022902ac022109200241c8006a41186a2201200241e8006a41186a290300370300200241c8006a41106a2203200241e8006a41106a290300370300200241c8006a41086a2205200241e8006a41086a290300370300200241286a41086a220720024188016a41086a290300370300200241286a41106a220820024188016a41106a290300370300200241286a41186a220a20024188016a41186a290300370300200241086a41086a220b200241a8016a41086a290300370300200241086a41106a220c200241a8016a41106a290300370300200241086a41186a220d200241a8016a41186a290300370300200220022903683703482002200229038801370328200220022903a801370308200020093702082000200436020420002006360200200041106a2002290348370200200041186a2005290300370200200041206a2003290300370200200041286a2001290300370200200041306a2002290328370200200041386a2007290300370200200041c0006a2008290300370200200041c8006a200a290300370200200041e8006a200d290300370200200041e0006a200c290300370200200041d8006a200b290300370200200041d0006a20022903083702000c080b200341ff0171450d00200241003a00c8020b200041003602040c060b200341ff0171450d00200241003a00c8020b200041003602040c040b200341ff0171450d00200241003a00c8020b200041003602040c020b200041003602040c010b200041003602040b20024190036a24000bad1004037f017e127f027e230041a0026b22022400200241106a2001108f010240024020022802100d00024002400240024020022802142203200128020441246e2204200420034b1bad42247e2205422088a70d002005a72204417f4c0d000240024020040d00410421060c010b200410242206450d020b20024100360220200220063602182002200441246e36021c02402003450d00200241b8016a41046a2107200241f5006a2108200241b8016a4107722109200241cb016a220a41056a210b4100210c4100210d034002400240024002402001280204220e450d002001280200220f2d000021042001200e417f6a22103602042001200f41016a360200200441074b0d00024002400240024002400240024020040e080007010703040205000b200241086a2001108f0120022802080d0620012802042211200228020c220e490d06200e417f4c0d0c02400240200e0d004100210f410121040c010b200e102a2204450d0e20012802042111200e210f0b02402011200e490d0020042001280200200e10cf06211120012802042210200e4f0d06200e201041b8afc0001048000b200f450d06200410260c060b41002104200241003a00d801200e417e6a210e02400240034020102004460d01200241b8016a20046a200f20046a221141016a2d00003a00002001200e3602042001201141026a3602002002200441016a22113a00d801200e417f6a210e2011210420114120470d000b200241f0016a41086a220f200941086a2800003602002002200a290000370380022002200b29000037008502200220092900003703f00120022002290085023700e50120022002290380023703e001410121044101210e0240201141ff01714120490d0020022f01b80120022d00ba0141107472211220022800bb012113200241a8016a41086a200f280200360200200220022903f0013703a801200220022903e00137038002200220022900e501370085024100210e0b200e0d01200241e0016a41086a200241a8016a41086a280200360200200220022903a8013703e00120022002290380023703b80120022002290085023700bd014100210420132114201221150c010b0240200441ff0171450d00200241003a00d8010b410121040b20024198016a41086a220e200241e0016a41086a280200360200200220022903e00137039801200220022903b80137038801200220022900bd0137008d0120040d05200820022f0085013b0000200241f8006a41086a200e280200360200200841026a20024185016a41026a2d00003a0000200220022903980137037820022002290388013703682002200229008d0137006d2014410876211641002111201421042015210e0c080b200241b8016a200110910120022802bc012211450d0420022f01b80120022d00ba0141107472210e20022d00bb012104200220022903c00137027c20022011360278410121110c070b200241b8016a200110910120022802bc012211450d0320022f01b80120022d00ba0141107472210e20022d00bb012104200220022903c00137027c20022011360278410221110c060b200241b8016a200110910120022802bc012211450d0220022f01b80120022d00ba0141107472210e20022d00bb012104200220022903c00137027c20022011360278410321110c050b2010450d01200f2d000121042001200e417e6a22113602042001200f41026a36020020040d012011450d01200f2d000221112001200e417d6a22163602042001200f41036a360200201141014b0d01410021040240024020110e020100010b20164104490d02200f28000321102001200e41796a22043602042001200f41076a36020020044104490d02200f28000721172001200e41756a3602042001200f410b6a360200410121040b200241e8006a41086a200741086a290200370300200220022802b801360280012002200729020037036820022017ad4220862010ad8437037841042111410021160c030b20012010200e6b36020420012001280200200e6a36020020110d010b200c450d08200c41246c2104200621010c070b200241e8006a41086a200741086a290200370300200220022802b80136028001200220072902003703682002200ead422086200fad84201820111b22183e0278200220184220883e027c20114108762116410521110b0b200d41016a210d200241d8006a41086a200241f8006a41086a280200220f360200200241c8006a41086a200241e8006a41086a2903002205370300200241386a41086a2210200f360200200241286a41086a220f200537030020022002290378220537035820022002290368221937034820022005370338200220193703282016410874200441ff01717221170240200c200228021c470d00200241186a200c410110d101200228021821062002280220210c0b2006200c41246c6a220420173600042004200e3b0001200420113a0000200441036a200e4110763a0000200441106a201028020036000020042002290338370008200420022903283700142004411c6a200f2903003700002002200c41016a220c360220200d2003470d000b0b2006450d042000200229021c370204200020063602000c050b1034000b1033000b03400240024020012d0000220e41044b0d00024002400240200e0e050400010204040b2001410c6a280200450d03200141086a28020010260c030b2001410c6a280200450d02200141086a28020010260c020b2001410c6a280200450d01200141086a28020010260c010b200141086a280200450d00200141046a28020010260b200141246a21012004415c6a22040d000b0b200228021c2201450d00200141246c450d00200610260b200041003602000b200241a0026a24000b991a04057f017e0f7f027e230041b0056b2202240041002103200241003a00e804024002400240024002400240024002400340200128020022042802042205450d01200241c8046a20036a200428020022062d00003a000020042005417f6a3602042004200641016a3602002002200341016a22033a00e80420034120470d000b200241d8016a41186a200241c8046a41186a2903002207370300200241f8006a41086a200241c8046a41086a290300370300200241f8006a41106a200241c8046a41106a290300370300200241f8006a41186a2007370300200220022903c804370378200241106a2001108d0120022802100d032002280214210841002103200241003a00e8040340200128020022042802042205450d02200241c8046a20036a200428020022062d00003a000020042005417f6a3602042004200641016a3602002002200341016a22033a00e80420034120470d000b200241d8016a41186a200241c8046a41186a290300220737030020024198016a41086a200241c8046a41086a29030037030020024198016a41106a200241c8046a41106a29030037030020024198016a41186a2007370300200220022903c8043703980141002103200241003a00e8040340200128020022042802042205450d03200241c8046a20036a200428020022062d00003a000020042005417f6a3602042004200641016a3602002002200341016a22033a00e80420034120470d000b200241d8016a41186a200241c8046a41186a2903002207370300200241b8016a41086a200241c8046a41086a290300370300200241b8016a41106a200241c8046a41106a290300370300200241b8016a41186a2007370300200220022903c8043703b801200241086a2001108d0120022802080d05200228020c2209200128020028020441246e2203200320094b1bad42247e2207422088a7450d040c070b0240200341ff0171450d00200241003a00e8040b200041003602040c050b0240200341ff0171450d00200241003a00e8040b200041003602040c040b0240200341ff0171450d00200241003a00e8040b200041003602040c030b200041003602040c020b2007a72204417f4c0d0202400240024002400240024020040d00410421030c010b200410242203450d010b2001200128020441016a2205360204200241003602c003200220033602b8032002200441246e3602bc03200520012802084b0d0202402009450d00200241c8046a41046a210a200241e5016a210b200241c8046a410772210c200241db046a220d41056a210e4100210f410021100340200128020022042802042206450d03200428020022112d0000210520042006417f6a3602042004201141016a360200200541074b0d0302400240024002400240024002400240024020050e08000c010c03040205000b20022001108d0120022802000d0b20012802002206280204221120022802042205490d0b2005417f4c0d100240024020050d0041002112410121040c010b2005102a2204450d0b200128020022062802042111200521120b024020112005490d0020042006280200200510cf0621112006280204221320054f0d062005201341b8afc0001048000b2012450d0b200410260c0b0b41002104200241003a00e804024002400340200128020022052802042206450d01200241c8046a20046a200528020022112d00003a000020052006417f6a3602042005201141016a3602002002200441016a22043a00e80420044120470d000b20024180056a41086a2204200c41086a2800003602002002200d290000370390052002200e290000370095052002200c2900003703800520022002290095053700f50420022002290390053703f00420022800cb04211420022f01c804210520022d00ca042106200241b8046a41086a2211200428020036020020022002290380053703b804200220022900f50437009505200220022903f00437039005200241f0046a41086a2011280200360200200220022903b8043703f00420022002290095053700cd0420022002290390053703c80420052006411074722115410021040c010b0240200441ff0171450d00200241003a00e8040b410121040b200241a8046a41086a2205200241f0046a41086a280200360200200220022903f0043703a804200220022903c80437039804200220022900cd0437009d0420040d0a200b20022f0095043b000020024188046a41086a2005280200360200200b41026a20024195046a41026a2d00003a0000200220022903a8043703880420022002290398043703d8012002200229009d043700dd01201441087621164100210620142104201521050c060b200241c8046a2001108c0120022802cc042206450d0920022f01c80420022d00ca0441107472210520022d00cb042104200220022903d00437028c042002200636028804410121060c050b200241c8046a2001108c0120022802cc042206450d0820022f01c80420022d00ca0441107472210520022d00cb042104200220022903d00437028c042002200636028804410221060c040b200241c8046a2001108c0120022802cc042206450d0720022f01c80420022d00ca0441107472210520022d00cb042104200220022903d00437028c042002200636028804410321060c030b200128020022042802042205450d06200428020022062d0000211120042005417f6a3602042004200641016a36020020110d06200128020022042802042206450d06200428020022112d0000210520042006417f6a3602042004201141016a360200200541014b0d06410021040240024020050e020100010b2001280200220428020422054104490d0720042802002211280000210620042005417c6a3602042004201141046a3602002001280200220428020422054104490d0720042802002212280000211120042005417c6a3602042004201241046a360200410121040b200241d8016a41086a200a41086a290200370300200220022802c804360290042002200a2902003703d80120022011ad4220862006ad843703880441042106410021160c010b2006201320056b3602042006200628020020056a3602002011450d05200241d8016a41086a200a41086a290200370300200220022802c804360290042002200a2902003703d80120022005ad4220862012ad84201720111b22173e028804200220174220883e028c0420114108762116410521060b0b201041016a2110200241f8036a41086a20024188046a41086a2802002211360200200241e8036a41086a200241d8016a41086a2903002207370300200241d8036a41086a22122011360200200241c8036a41086a22112007370300200220022903880422073703f803200220022903d80122183703e803200220073703d803200220183703c8032016410874200441ff01717221130240200f20022802bc03470d00200241b8036a200f410110d10120022802b803210320022802c003210f0b2003200f41246c6a22042013360004200420053b0001200420063a0000200441036a20054110763a0000200441106a2012280200360000200420022903d803370008200420022903c8033700142004411c6a20112903003700002002200f41016a220f3602c00320102009470d000b200128020421050b20012005417f6a3602042003450d0420022902bc032107200241d8006a41186a2204200241f8006a41186a290300370300200241d8006a41106a2205200241f8006a41106a290300370300200241d8006a41086a2206200241f8006a41086a290300370300200241386a41086a220120024198016a41086a290300370300200241386a41106a221120024198016a41106a290300370300200241386a41186a220f20024198016a41186a290300370300200241186a41086a2210200241b8016a41086a290300370300200241186a41106a2209200241b8016a41106a290300370300200241186a41186a2212200241b8016a41186a290300370300200220022903783703582002200229039801370338200220022903b801370318200020073702082000200336020420002008360200200041106a2002290358370200200041186a2006290300370200200041206a2005290300370200200041286a2004290300370200200041306a2002290338370200200041386a2001290300370200200041c0006a2011290300370200200041c8006a200f290300370200200041e8006a2012290300370200200041e0006a2009290300370200200041d8006a2010290300370200200041d0006a20022903183702000c050b1033000b200241b8036a2106200f450d01200f41246c210403400240024020032d0000220541044b0d0002400240024020050e050400010204040b2003410c6a280200450d03200341086a28020010260c030b2003410c6a280200450d02200341086a28020010260c020b2003410c6a280200450d01200341086a28020010260c010b200341086a280200450d00200341046a28020010260b200341246a21032004415c6a22040d000c020b0b200241b8036a21060b200641046a2802002203450d00200341246c450d00200628020010260b200041003602040b200241b0056a24000f0b1034000bec0101047f230041c0006b2202240041cb93c4002103410f210441042105024002400240024002400240200141ff01710e06000102030405000b2002411c6a41013602002002420137020c200241dcedc6003602082002410436022420024190f6c6003602202002200241206a360218200241086a41ecc0c700103d000b41bc93c4002103410021050c030b41a293c4002103411a2104410121050c020b418593c4002103411d2104410221050c010b41f292c400210341132104410321050b200041033b0100200041086a2004360200200041046a2003360200200041026a20053a0000200241c0006a24000b860201047f230041c0006b2202240041e9b3c6002103410c2104410521050240024002400240024002400240200141ff01710e0700010203040506000b2002411c6a41013602002002420137020c200241dcedc6003602082002410436022420024190f6c6003602202002200241206a360218200241086a41ecc0c700103d000b41e2b3c600210341072104410021050c040b41dab3c600210341082104410121050c030b41d2b3c600210341082104410221050c020b41c7b3c6002103410b2104410321050c010b41beb3c600210341092104410421050b20004183303b0100200041086a2004360200200041046a2003360200200041026a20053a0000200241c0006a24000b9b0201047f230041c0006b2202240041bc8fc6002103411621044106210502400240024002400240024002400240200141ff01710e080001020304050607000b2002411c6a41013602002002420137020c200241dcedc6003602082002410436022420024190f6c6003602202002200241206a360218200241086a41ecc0c700103d000b418fdac5002103410b2104410021050c050b4183dac5002103410c2104410121050c040b41f6d9c5002103410d2104410221050c030b41efd9c500210341072104410321050c020b418c8fc600210341182104410421050c010b41a48fc600210341182104410521050b20004183183b0100200041086a2004360200200041046a2003360200200041026a20053a0000200241c0006a24000bf10101047f230041c0006b2202240041d0d5c10021034109210441042105024002400240024002400240200141ff01710e06000102030405000b2002411c6a41013602002002420137020c200241dcedc6003602082002410436022420024190f6c6003602202002200241206a360218200241086a41ecc0c700103d000b41c5d5c1002103410b2104410021050c030b41bdd5c100210341082104410121050c020b41b8d5c100210341052104410221050c010b41add5c1002103410b2104410321050b20004183083b0100200041086a2004360200200041046a2003360200200041026a20053a0000200241c0006a24000bc70101047f230041c0006b2202240041e6a1c300210341092104410221050240024002400240200141ff01710e0400010203000b2002411c6a41013602002002420137020c200241dcedc6003602082002410436022420024190f6c6003602202002200241206a360218200241086a41ecc0c700103d000b41dca1c3002103410a2104410021050c010b41c5a1c300210341172104410121050b200041832a3b0100200041086a2004360200200041046a2003360200200041026a20053a0000200241c0006a24000bb00201047f230041c0006b220224004193c0c3002103410b210441072105024002400240024002400240024002400240200141ff01710e09000102030405060708000b2002411c6a41013602002002420137020c200241dcedc6003602082002410436022420024190f6c6003602202002200241206a360218200241086a41ecc0c700103d000b4185c0c3002103410e2104410021050c060b41f0bfc300210341152104410121050c050b41e8bfc300210341082104410221050c040b41d5bfc300210341132104410321050c030b41c3bfc300210341122104410421050c020b41babfc300210341092104410521050c010b41c5a1c300210341172104410621050b200041830a3b0100200041086a2004360200200041046a2003360200200041026a20053a0000200241c0006a24000bae0301047f230041c0006b2202240041a2f4c1002103410d2104410d2105024002400240024002400240024002400240024002400240024002400240200141ff01710e0f000102030405060708090a0b0c0d0e000b2002411c6a41013602002002420137020c200241dcedc6003602082002410436022420024190f6c6003602202002200241206a360218200241086a41ecc0c700103d000b4192f4c100210341102105410021040c0c0b4183f4c1002103410f2105410121040c0b0b41f2f3c100210341112105410221040c0a0b41e1f3c100210341112105410321040c090b41cff3c100210341122105410421040c080b41baf3c100210341152105410521040c070b41a7f3c100210341132105410621040c060b41dab3c600210341082105410721040c050b41bdd5c100210341082104410821050c040b419cf3c1002103410b2105410921040c030b418ef3c1002103410e2105410a21040c020b41fbf2c100210341132105410b21040c010b41eff2c1002103410c2104410c21050b20004183323b0100200041086a2005360200200041046a2003360200200041026a20043a0000200241c0006a24000b3400200041ac8cc70036020420004100360200200041146a4104360200200041106a41b4cbc100360200200041086a42083702000b2901017f230041106b2202240020024100360208200242013703002000200210b701200241106a24000b2701017f02404104102422020d001033000b20004204370204200020023602002000410010a1010b0b0020004104410010b4010bd80301047f230041c0006b2202240041e9c8c2002103410c2104410f210502400240024002400240024002400240024002400240024002400240024002400240200141ff01710e11000102030405060708090a0b0c0d0e0f10000b2002411c6a41013602002002420137020c200241dcedc6003602082002410436022420024190f6c6003602202002200241206a360218200241086a41ecc0c700103d000b41dfc8c2002103410a2104410021050c0e0b41d2c8c2002103410d2104410121050c0d0b41c2c8c200210341102104410221050c0c0b41b8c8c2002103410a2104410321050c0b0b41afc8c200210341092104410421050c0a0b41a1c8c2002103410e2104410521050c090b418fc8c200210341122104410621050c080b4181c8c2002103410e2104410721050c070b41f7c7c2002103410a2104410821050c060b41eec7c200210341092105410921040c050b41e3c7c2002103410b2104410a21050c040b41d5c7c2002103410e2104410b21050c030b41ccc7c200210341092104410c21050c020b41c1c7c2002103410b2104410d21050c010b41e8bfc300210341082104410e21050b20004183283b0100200041086a2004360200200041046a2003360200200041026a20053a0000200241c0006a24000b9b0201047f230041c0006b2202240041a6c7c5002103410621044108210502400240024002400240024002400240200141ff01710e080001020304050607000b2002411c6a41013602002002420137020c200241dcedc6003602082002410436022420024190f6c6003602202002200241206a360218200241086a41ecc0c700103d000b4194c7c500210341122105410021040c050b4184c7c500210341102105410121040c040b41f7c6c5002103410d2105410221040c030b41ebc6c5002103410c2105410321040c020b41dfc6c5002103410c2105410421040c010b41cbc6c500210341142105410521040b200041830e3b0100200041086a2005360200200041046a2003360200200041026a20043a0000200241c0006a24000bd30a03057f037e057f230041c0026b22022400200041046a21030240024002402000410c6a220428020022050d00200241f8016a411f6a200241d0016a411f6a280000360000200241f8016a41186a200241d0016a41186a290300370300200241f8016a41106a200241d0016a41106a290300370300200241f8016a41086a200241d0016a41086a290300370300200220022903d0013703f8010c010b20042005417f6a2205360200200241d0016a411f6a22062000280204200541246c6a220441206a280000360000200241d0016a41186a2205200441196a290000370300200241d0016a41086a200441096a2900002207370300200241d0016a41106a200441116a29000022083703002002200429000122093703d00120042d00002104200241f8016a411f6a220a2006280000360000200241f8016a41186a22062005290300370300200241f8016a41106a22052008370300200241f8016a41086a220b2007370300200220093703f80120044106460d00200241a8016a411f6a220c200a280000360000200241a8016a41186a220a2006290300370300200241a8016a41106a20052903002207370300200241a8016a41086a200b290300220837030020024180016a41096a200837000020024180016a41116a200737000020024180016a41196a200a29030037000020024180016a41206a200c280000360000200220022903f80122073703a8012002200737008101200220043a00800102400240024020044103470d0020024180016a41017228000041c28289aa04470d0120024180016a41086a2802002104200220024180016a41106a2802003602d401200220043602d001200241f8016a200241d0016a10dc01410121040240024020022d00f8014101470d00410021040c010b200241f8006a200241b1026a290000370300200241f0006a200241a9026a290000370300200241e8006a200241a1026a290000370300200241e0006a20024199026a290000370300200241d8006a20024191026a290000370300200241c0006a41106a20024189026a290000370300200241c0006a41086a20024181026a290000370300200220022900f9013703400b200241f8016a41386a2205200241c0006a41386a290300370300200241f8016a41306a2206200241c0006a41306a290300370300200241f8016a41286a220a200241c0006a41286a290300370300200241f8016a41206a220b200241c0006a41206a290300370300200241f8016a41186a220c200241c0006a41186a290300370300200241f8016a41106a220d200241c0006a41106a290300370300200241f8016a41086a220e200241c0006a41086a290300370300200220022903403703f8012004450d01200241386a2005290300370300200241306a2006290300370300200241286a200a290300370300200241206a200b290300370300200241186a200c290300370300200241106a200d290300370300200241086a200e290300370300200220022903f80137030002402002418c016a280200450d0020024188016a28020010260b200241f8016a200010f4022002200241f8016a4120200110f502450d03200310d60141012104200041086a2802002200450d04200041246c450d04200328020010260c040b200441044b0d010240024020040e050400010304040b2002418c016a280200450d0320024188016a28020010260c030b2002418c016a280200450d0220024188016a28020010260c020b2002418c016a280200450d0120024188016a28020010260c010b20024188016a280200450d0020022802840110260b200310d60141002104200041086a2802002200450d00200041246c450d00200328020010260b200241c0026a240020040b8e0301037f230041106b2202240020024100360208200242013703002002200236020c200141106a2002410c6a109c0102400240024002402001280200220341c000490d00200341808001490d012003418080808004490d02200220022802084101106d2002280200200228020822046a41033a00002002200441016a2204360208200220044104106d2002280200200228020822046a20033600002002200441046a3602080c030b200220022802084101106d2002280200200228020822046a20034102743a00002002200441016a3602080c020b200220022802084102106d2002280200200228020822046a20034102744101723b00002002200441026a3602080c010b200220022802084104106d2002280200200228020822046a20034102744102723600002002200441046a3602080b2002200236020c200141306a2002410c6a109c012002200236020c200141d0006a2002410c6a109c012002200141046a10a00120002002280200200228020810960102402002280204450d00200228020010260b200241106a24000b150020002002ad4220862001ad84200310094101460ba60401047f230041106b220224000240411a10242203450d002002421a3702042002200336020020012802002103200241004110106d2002280200200228020822046a22052003290000370000200541086a200341086a2900003700002002200441106a220436020820012802042103200220044120106d2002280200200228020822056a22042003290000370000200441086a200341086a290000370000200441106a200341106a290000370000200441186a200341186a2900003700002002200541206a220336020820012802082104200220034104106d2002280200200228020822036a20043600002002200341046a2203360208200128020c2104200220034104106d2002280200200228020822036a20043600002002200341046a22033602080240024002400240024020012802102d00000e0400010203000b200220034101106d2002280200200228020822036a41003a0000200341016a21030c030b200220034101106d2002280200200228020822036a41013a0000200341016a21030c020b200220034101106d2002280200200228020822036a41023a0000200341016a21030c010b200220034101106d2002280200200228020822036a41033a0000200341016a21030b2002200336020820012f01142104200220034102106d20022802002201200228020822036a20043b00002002200341026a220336020820002001200310960102402002280204450d00200110260b200241106a24000f0b1033000bfa0201057f230041106b2202240002400240200141086a28020022034105744116722204417f4c0d00200410242205450d0120024100360208200220043602042002200536020020012802002104200241004110106d2002280200200228020822056a22062004290000370000200641086a200441086a2900003700002002200541106a360208200128020421042002200310a1010240024020030d00200228020821030c010b20034105742105200228020821030340200220034120106d2002280200200228020822066a22032004290000370000200341086a200441086a290000370000200341106a200441106a290000370000200341186a200441186a2900003700002002200641206a2203360208200441206a2104200541606a22050d000b0b20012f010c2105200220034102106d20022802002204200228020822036a20053b00002002200341026a220336020820002004200310960102402002280204450d00200410260b200241106a24000f0b1034000b1033000be00201037f2003200341086a22042802004101106d2003280200200428020022056a21060240200041ff017122004104460d00200641013a00002004200541016a2205360200024002400240024020000e0400010203000b200320054101106d2003280200200341086a220328020022046a41003a00002003200441016a3602000f0b200320054101106d2003280200200341086a220328020022046a41013a00002003200441016a3602000f0b200320054101106d2003280200200341086a220328020022046a41023a00002003200441016a3602000f0b200320054101106d2003280200200341086a220428020022006a41033a00002004200041016a2200360200200320004101106d2003280200200428020022006a20013a00002004200041016a2200360200200320004101106d2003280200200428020022036a20023a00002004200341016a3602000f0b200641003a00002004200541016a3602000bdd0302027f017e20004201370200200041086a410036020002402001280200220241024b0d0002400240024020020e03000102000b200041004101106d2000280200200041086a220228020022036a41013a00002002200341016a3602002000200141046a10ac01200020022802004120106d2000280200200228020022036a2200200141106a2900003700002002200341206a360200200041086a200141186a290000370000200041106a200141206a290000370000200041186a200141286a2900003700000f0b200041004101106d2000280200200041086a220228020022036a41023a00002002200341016a220336020020012802042101200020034104106d2000280200200228020022006a20013600002002200041046a3602000f0b200041004101106d2000280200200041086a220228020022036a41033a00002002200341016a2203360200200020034101106d2000280200200228020022036a41013a00002002200341016a2203360200200141086a2903002104200020034108106d2000280200200228020022036a20043700002002200341086a2203360200200141106a2903002104200020034108106d2000280200200228020022036a20043700002002200341086a3602002000200141186a2d00001097010b0b7101047f230041106b220124002001410036020820014201370300200110fa02200128020021022000200041086a220328020020012802082204106d2000280200200328020022006a2002200410cf061a2003200020046a36020002402001280204450d00200210260b200141106a24000bf30301057f230041e0006b22022400200241086a41ac8cc700410810fb01200241186a4184d0c100411210fb0102400240411010242203450d002002421037023c20022003360238200241386a41004110106d20022802382203200228024022046a22052001290000370000200541086a200141086a2900003700002002200441106a2201360240200241c8006a2003200110a202200241dc006a200320016a360200200220033602582002200241c8006a41086a3602542002200241c8006a360250200241286a200241d0006a10730240200228023c450d00200310260b2002280230220141206a2204417f4c0d010240024020040d0041012103410021040c010b200410242203450d010b20002003360200200041086a220341003602002000200436020420004100411010c9012000280200200328020022046a220520022900083700002003200441106a2204360200200541086a200241086a41086a29000037000020002004411010c9012000280200200328020022046a220520022900183700002003200441106a2206360200200541086a200241186a41086a2900003700002002280228210420002006200110c9012000280200200328020022006a2004200110cf061a2003200020016a3602000240200228022c450d00200410260b200241e0006a24000f0b1033000b1034000bce0401057f230041e0006b22032400200341086a41ac8cc700410810fb01200341186a41b0cfc100411610fb0102400240411010242204450d002003421037023c20032004360238200341386a41004110106d20032802382204200328024022056a22062001290000370000200641086a200141086a2900003700002003200541106a2201360240200341c8006a2004200110a202200341dc006a200420016a360200200320043602582003200341c8006a41086a3602542003200341c8006a360250200341286a200341d0006a10730240200328023c450d00200410260b200341d0006a2002280200200228020810fd0220032802302201200328025822026a41206a2205417f4c0d010240024020050d0041012104410021050c010b200510242204450d010b20002004360200200041086a220441003602002000200536020420004100411010c9012000280200200428020022056a220620032900083700002004200541106a2205360200200641086a200341086a41086a29000037000020002005411010c9012000280200200428020022056a220620032900183700002004200541106a2207360200200641086a200341186a41086a2900003700002003280228210520002007200110c9012000280200200428020022066a2005200110cf061a2004200620016a22063602002003280250210120002006200210c9012000280200200428020022006a2001200210cf061a2004200020026a36020002402003280254450d00200110260b0240200328022c450d00200510260b200341e0006a24000f0b1033000b1034000bfc0301037f230041306b2203240002400240200241046a2204417f4c0d000240024020040d0041012105410021040c010b200410242205450d020b20034100360210200320053602082003200436020c0240024002400240200241c000490d00200241808001490d012002418080808004490d02200341086a41004101106d2003280208200328021022046a41033a00002003200441016a2204360210200341086a20044104106d2003280208200328021022046a20023600002003200441046a2204360210200341086a21050c030b200341086a41004101106d2003280208200328021022046a20024102743a00002003200441016a2204360210200341086a21050c020b200341086a41004102106d2003280208200328021022046a20024102744101723b00002003200441026a2204360210200341086a21050c010b200341086a41004104106d2003280208200328021022046a20024102744102723600002003200441046a2204360210200341086a21050b200520042002106d20032802082204200328021022056a2001200210cf061a2003200520026a2202360210200341186a2004200210a2022003412c6a200420026a360200200320043602282003200341206a3602242003200341186a3602202000200341206a10730240200328020c450d00200410260b200341306a24000f0b1034000b1033000b930401057f230041e0006b22022400200241086a41ac8cc700410810fb01200241186a4194cec100410710fb0102400240412010242203450d002002422037023c20022003360238200241386a41004120106d20022802382203200228024022046a22052001290000370000200541086a200141086a290000370000200541106a200141106a290000370000200541186a200141186a2900003700002002200441206a2201360240200241c8006a2003200110a202200241dc006a200320016a360200200220033602582002200241c8006a41086a3602542002200241c8006a360250200241286a200241d0006a10730240200228023c450d00200310260b2002280230220341206a2205417f4c0d010240024020050d0041012101410021050c010b200510242201450d010b20002001360200200041086a220141003602002000200536020420004100411010c9012000280200200128020022056a220420022900083700002001200541106a2205360200200441086a200241086a41086a29000037000020002005411010c9012000280200200128020022056a220420022900183700002001200541106a2206360200200441086a200241186a41086a2900003700002002280228210520002006200310c9012000280200200128020022006a2005200310cf061a2001200020036a3602000240200228022c450d00200510260b200241e0006a24000f0b1033000b1034000bac0401047f230041c0006b2202240041b0ecc40021034118210441132105024002400240024002400240024002400240024002400240024002400240024002400240024002400240200141ff01710e15000102030405060708090a0b0c0d0e0f1011121314000b2002411c6a41013602002002420137020c200241dcedc6003602082002410436022420024190f6c6003602202002200241206a360218200241086a41ecc0c700103d000b41ace8c400210341122104410021050c120b41c8e8c400210341152104410121050c110b41e8e8c4002103410f2104410221050c100b4180e9c400210341102104410321050c0f0b4198e9c4002103410f2104410421050c0e0b41b0e9c400210341092104410521050c0d0b41c4e9c400210341142104410621050c0c0b41e0e9c400210341102104410721050c0b0b41f8e9c400210341162104410821050c0a0b4198eac400210341172104410921050c090b41b8eac400210341172104410a21050c080b41d8eac400210341102104410b21050c070b41f0eac4002103410d2104410c21050c060b4188ebc4002103410e2104410d21050c050b41a0ebc400210341102104410e21050c040b41b8ebc400210341162104410f21050c030b41d8ebc400210341152104411021050c020b41f8ebc4002103410d2104411121050c010b4190ecc400210341152104411221050b200041831e3b0100200041086a2004360200200041046a2003360200200041026a20053a0000200241c0006a24000b900201077f41012104024002400240200241014b0d004100210520020e020201020b20032d002041ff017121064100210503400240024020012002410176220720056a220841216c6a22092003412010d206220a450d00417f4101200a4100481b210a0c010b4100417f20092d0020220a200647200a2006491b200a2006461b210a0b20052008200a4101461b2105200220076b220241014b0d000b0b024002402001200541216c6a22072003412010d2062202450d00417f410120024100481b21020c010b024020072d0020220220032d00202207470d00410021040c020b417f200220074720022007491b22020d00410021040c010b20052002417f466a21050b20002005360204200020043602000b110041bf80c700412841dcbcc700102f000b8d0301017f23004190016b22042400024002400240024020002d00000e03000102000b200441206a41186a200341186a290000370300200441206a41106a200341106a290000370300200441206a41086a200341086a29000037030020042003290000370320200041016a20012002200441206a10830321000c020b200441206a41186a200341186a290000370300200441206a41106a200341106a290000370300200441206a41086a200341086a29000037030020042003290000370320200041016a20012002200441206a10f50221000c010b20042001200210960141012101200441206a200041016a20041084034100210020042d00200d00200441c8006a41206a200441206a41216a2d00003a0000200441e0006a200441396a290000370300200441d8006a200441316a290000370300200441d0006a200441296a29000037030020042004290021370348200441f0006a200441c8006a412110960102402003200441f0006a460d00200441f0006a2003412010d2064521010b200121000b20044190016a240020000b150020002002ad4220862001ad84200310034101460bd00603017f017e057f230041d0016b2203240002402001200210052204422088a72201450d002004a722052d0000220241014b0d002001417f6a210602400240024020020e020001000b41002101200341003a008901200541016a21070240034020062001460d01200341e8006a20016a200720016a2d00003a00002003200141016a22023a0089012002210120024121470d000b20034190016a41086a2207200341f1006a29000037030020034190016a41106a2208200341f9006a29000037030020034190016a41186a220920034181016a290000370300200320032900693703900120032d00682106410121010240200241ff01714121490d00200341c8006a41186a2009290300370300200341c8006a41106a2008290300370300200341c8006a41086a20072903003703002003200329039001370348410021010b200341286a41086a200341c8006a41086a290300370300200341286a41106a200341c8006a41106a290300370300200341286a41186a200341c8006a41186a2903003703002003200329034837032820010d03200341086a41186a200341286a41186a290300370300200341086a41106a200341286a41106a290300370300200341086a41086a200341286a41086a2903003703002003200329032837030841002102200341086a21010c020b0240200141ff0171450d00200341003a0089010b200341286a41086a200341c8006a41086a290300370300200341286a41106a200341c8006a41106a290300370300200341286a41186a200341c8006a41186a290300370300200320032903483703280c020b2006450d0120052d0001220141024b0d014100210602400240024020010e03020100020b410221060c010b410121060b200341086a41186a200341e8006a41186a290000370300200341086a41106a200341e8006a41106a290000370300200341086a41086a200341e8006a41086a2900003703002003200329006837030841012102200341086a21010b200020063a0001200020023a0000200041026a20012900003700002000410a6a200141086a290000370000200041126a200141106a2900003700002000411a6a200141186a29000037000020051026200341d0016a24000f0b4196aec700412e200341e8006a41c4aec70041d4aec7001036000b130020004105360204200041dcd5c1003602000b3400200041938cc70036020420004100360200200041146a4101360200200041106a418ceec100360200200041086a42073702000b130020004104360204200041b0f4c1003602000b3400200041f88bc70036020420004100360200200041146a4102360200200041106a41a49ec200360200200041086a42083702000bba0201037f23004180016b220224002000280200210002400240024002400240200128020022034110710d002000280200210420034120710d012004ad2001104221000c020b20002802002104410021000340200220006a41ff006a2004410f712203413072200341d7006a2003410a491b3a00002000417f6a2100200441047622040d000b20004180016a22044181014f0d02200141e889c0004102200220006a4180016a410020006b104521000c010b410021000340200220006a41ff006a2004410f712203413072200341376a2003410a491b3a00002000417f6a2100200441047622040d000b20004180016a22044181014f0d02200141e889c0004102200220006a4180016a410020006b104521000b20024180016a240020000f0b200441800141d889c0001048000b200441800141d889c0001048000b950605027f027e017f027e027f230041a0016b220224002000280200210002400240024002400240024002400240200128020022034110710d00200041086a29030021042000290300210520034120710d0220054290ce005441002004501b450d012005a72103412721000c060b200041086a290300210520002903002104418001210002400340024020000d00410021000c020b200241206a20006a417f6a2004a7410f712203413072200341d7006a2003410a491b3a00002000417f6a210020044204882005423c8684220420054204882205844200520d000b20004181014f0d030b200141e889c0004102200241206a20006a41800120006b104521000c060b41272100200241186a21060340200241106a200520044290ce00420010d3062002200229031022072006290300220842f0b17f427f10cc06200241206a20006a2203417c6a200520022903007ca7220941ffff037141e4006e220a41017441aa85c0006a2f00003b00002003417e6a200a419c7f6c20096a41ffff037141017441aa85c0006a2f00003b0000200542ffc1d72f56210320044200522109200450210a2000417c6a2100200721052008210420032009200a1b0d000c040b0b418001210002400340024020000d00410021000c020b200241206a20006a417f6a2005a7410f712203413072200341376a2003410a491b3a00002000417f6a210020054204882004423c8684220520044204882204844200520d000b20004181014f0d020b200141e889c0004102200241206a20006a41800120006b104521000c040b200041800141d889c0001048000b200041800141d889c0001048000b2007a721030b02400240200341e3004a0d00200321090c010b200241206a2000417e6a22006a2003200341ffff037141e4006e2209419c7f6c6a41ffff037141017441aa85c0006a2f00003b00000b024002402009410a480d00200241206a2000417e6a22006a200941017441aa85c0006a2f00003b00000c010b200241206a2000417f6a22006a200941306a3a00000b200141d4c0c7004100200241206a20006a412720006b104521000b200241a0016a240020000bd10202027f017e23004180016b220224002000280200210002400240024002400240200128020022034110710d002000290300210420034120710d0120042001104221000c020b20002903002104418001210002400340024020000d00410021000c020b200220006a417f6a2004a7410f712203413072200341d7006a2003410a491b3a00002000417f6a2100200442048822044200520d000b20004181014f0d030b200141e889c0004102200220006a41800120006b104521000c010b418001210002400340024020000d00410021000c020b200220006a417f6a2004a7410f712203413072200341376a2003410a491b3a00002000417f6a2100200442048822044200520d000b20004181014f0d030b200141e889c0004102200220006a41800120006b104521000b20024180016a240020000f0b200041800141d889c0001048000b200041800141d889c0001048000bf10101067f23004180016b220224002001410c6a28020021032001280208210420012802002205210602402005410471450d0020012005410872220636020020040d0020014281808080a0013702080b2001200641047236020020002802002100410021060340200220066a41ff006a2000410f712207413072200741d7006a2007410a491b3a00002006417f6a2106200041047622000d000b024020064180016a2200418101490d00200041800141d889c0001048000b200141e889c0004102200220066a4180016a410020066b104521062001200336020c200120043602082001200536020020024180016a240020060bb52704057f067e087f037e230041f0036b22022400024002400240024002400240024020012d0000417f6a220341034b0d0020030e0401020304010b41bf80c700412841dcbcc700102f000b200241086a200141046a10c30141b00210242203450d0402400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200141106a28020022012802000e170102030405060b0708090a0b0c0d0e0f10111213141500010b200241186a200141086a108d03200341086a200241186a41c80010cf061a200341163602000c150b200241186a200141086a108e0320034100360200200341186a200241186a41106a290300370300200341106a200241186a41086a290300370300200320022903183703080c140b200241186a200141086a108f03200341086a200241186a41a00210cf061a200341013602000c130b200341023602002003200141086a2903003703080c120b02400240024002400240024002400240024020012d0004417f6a220441044b0d00200141046a210520040e050102030405010b41bf80c700412841dcbcc700102f000b200141086a2802002104410121060c040b41022106200241d0026a41026a200541036a2d00003a0000200241186a41086a200141146a290200370300200241286a2001411c6a290200370300200241306a200141246a2d00003a0000200220052f00013b01d00220022001410c6a290200370318200141086a2802002104200141286a28020021010c040b200141086a2802002104410321060c020b200241d2026a200541036a2d00003a0000200241186a41086a200141146a290200370300200241286a2001411c6a290200370300200241306a200141246a2d00003a0000200220052f00013b01d00220022001410c6a29020037031820012d00254100472105200141086a2802002104200141286a2802002101410421060c030b200141086a2802002104410521060b0b0b200320063a0004200320022f01d0023b0005200320043602082003200229031837020c20032001360228200320053a002520034103360200200341076a200241d2026a2d00003a0000200341146a200241206a2903003702002003411c6a200241286a290300370200200341246a200241306a2d00003a00000c110b02400240024002400240024002400240200141086a22042d0000417f6a220641034b0d0020060e0401020304010b41bf80c700412841dcbcc700102f000b200241206a200441096a290000370300200241286a200441116a290000370300200241306a200441196a29000037030020022004290001370318200141386a2903002107200141306a2903002108410121010c030b200241206a200441096a290000370300200241286a200441116a290000370300200241306a200441196a29000037030020022004290001370318200141c8006a2903002109200141c0006a290300210a200141386a2903002107200141306a2903002108410221010c030b200241206a200441096a290000370300200241286a200441116a290000370300200241306a200441196a290000370300200220042900013703182002200441216a2800003602d0022002200441246a2800003600d302200141c8006a3100002109200141c0006a290000210a200141386a2900002107200141306a2900002108200141d8006a290300210b200141d0006a290300210c410321010c030b200241206a200441096a290000370300200241286a200441116a290000370300200241306a200441196a29000037030020022004290001370318200141386a2903002107200141306a2903002108410421010b0b0b2003200c3703502003200a37034020032008370330200320013a000820032002290318370009200320022802d00236002920034104360200200341d8006a200b370300200341c8006a2009370300200341386a20073703002003412c6a20022800d302360000200341116a200241206a290300370000200341196a200241286a290300370000200341216a200241306a2903003700000c100b200241186a200141046a10c001200341053602002003410c6a200241206a280200360200200320022903183702040c0f0b024002402001280204450d00200241d0026a41186a200141286a290000370300200241d0026a41106a200141206a290000370300200241d8026a200141186a290000370300200241d0026a41286a200141386a290000370300200241d0026a41306a200141c0006a290000370300200241d0026a41386a200141c8006a290000370300200241d0026a41c8006a200141d8006a290000370300200241d0026a41d0006a200141e0006a290000370300200241d0026a41d8006a200141e8006a2900003703002002200141106a2900003703d0022002200141306a2900003703f0022002200141d0006a29000037039003200241d0026a41f8006a20014188016a290000370300200241d0026a41f0006a20014180016a290000370300200241d0026a41e8006a200141f8006a290000370300200241d0026a4198016a200141a8016a290000370300200241d0026a4190016a200141a0016a290000370300200241d0026a4188016a20014198016a2900003703002002200141f0006a2900003703b003200220014190016a2900003703d003200241186a200141046a10c801200241246a200241d0026a41a00110cf061a0c010b200241003602180b200341046a200241186a41ac0110cf061a200341073602000c0e0b20034108360200200320012802043602040c0d0b200241186a200141086a109003200341086a200241186a41980210cf061a200341093602000c0c0b20012802042105200241186a200141086a10c801200241c0026a200141146a10d001200241186a41146a200241c0026a41086a280200360200200220022903c002370224200241d0026a41086a220d200241186a41086a2204290300370300200241d0026a41106a220e200241186a41106a2206290300370300200220022903183703d002200141206a2902002107200141286a280200210f2004200141346a29000037030020062001413c6a290000370300200241186a41186a2210200141c4006a290000370300200241186a41206a2211200141cc006a290000370300200241186a41286a2212200141d4006a290000370300200241c8006a2213200141dc006a290000370300200241d0006a2214200141e4006a2900003703002001412c6a2900002108200320053602042003200f3602282003200737022020022008370318200320022903d002370208200341106a200d290300370200200341186a200e290300370200200341e4006a2014290300370200200341dc006a2013290300370200200341d4006a2012290300370200200341cc006a2011290300370200200341c4006a20102903003702002003413c6a2006290300370200200341346a20042903003702002003200229031837022c2003410a3602000c0b0b108103000b200241186a200141086a109103200341086a200241186a41a00210cf061a2003410c3602000c090b2003410d3602000c080b200241186a200141046a10b702200341046a200241186a41c80010cf061a2003410e3602000c070b024002400240024020012f0104417f6a220441014b0d0020040e020102010b41bf80c700412841dcbcc700102f000b200241186a200141086a10c401200229021c210720022802182104410121010c010b20012f0106210641b00210242204450d0c2004200141086a28020010c601410221010b2003200737020c20032004360208200320063b0106200320013b01042003410f3602000c060b200241186a200141086a10d002200341086a200241186a41a80210cf061a200341103602000c050b200241186a200141046a109203200341046a200241186a41c40010cf061a200341113602000c040b02400240024002400240200141086a22042d0000417f6a220e41034b0d0042002107410121064200210a200e0e0404010203040b41bf80c700412841dcbcc700102f000b200241306a200441196a290000370300200241286a200441116a290000370300200241206a200441096a2900003703002002200429000137031842002107410221064200210a0c020b200241206a200441096a290000370300200241286a200441116a290000370300200241306a200441196a29000037030020022004290001370318200141c8006a2903002109200141c0006a2903002108200141386a2903002115200141306a2903002116200141d0006a280200210542002107410321064200210a0c010b200241206a200441096a290000370300200241286a200441116a290000370300200241306a200441196a290000370300200220042900013703182002200441216a2800003602d0022002200441246a2800003600d302200141d0006a2903002217428080808070832107200141d8006a290300210a200141c8006a3100002109200141c0006a2900002108200141386a2900002115200141306a2900002116200141e8006a290300210c200141e0006a290300210b200141f0006a280200210d2017a72105410421060b2003200b3703602003200837034020032016370330200320063a000820032002290318370009200320022802d0023600292003200d360270200341e8006a200c370300200341d8006a200a370300200341c8006a2009370300200341386a20153703002003412c6a20022800d302360000200320072005ad84370350200341116a200241206a290300370000200341196a200241286a290300370000200341216a200241306a290300370000200341123602000c030b200241186a200141046a10930320034113360200200341246a200241386a2802003602002003411c6a200241306a290300370200200341146a200241186a41106a2903003702002003410c6a200241206a290300370200200320022903183702040c020b200241186a200141086a10940320034114360200200341286a200241186a41206a290300370300200341206a200241186a41186a290300370300200341186a200241186a41106a290300370300200341106a200241186a41086a290300370300200320022903183703080c010b024002400240024002400240024020012d0004417f6a221141054b0d004104210620110e06010203060405010b41bf80c700412841dcbcc700102f000b200241186a41086a2206200141106a290000370300200241186a41106a220f200141186a290000370300200241186a41156a22102001411d6a2900003700002002200141086a29000037031820012f0006210d20012d0005210520012d0025210e41b00210242204450d0a2004200141286a280200109503200241d0026a41156a2010290000370000200241d0026a41106a200f290300370300200241d0026a41086a2006290300370300200220022903183703d002410121060c040b200241d0026a41086a200141106a290000370300200241d0026a41106a200141186a290000370300200241e5026a2001411d6a2900003700002002200141086a2900003703d00220012f0006210d20012d0005210520012d0025210e410221060c030b200241d0026a41086a200141106a290000370300200241d0026a41106a200141186a290000370300200241e5026a2001411d6a2900003700002002200141086a2900003703d00220012f0006210d20012d0005210520012d0025210e410321060c020b20012f0106210d20012d00052105410521060c010b200241d0026a41086a200141106a290000370300200241d0026a41106a200141186a290000370300200241e5026a2001411d6a2900003700002002200141086a2900003703d0022001412c6a2802002110200141286a280200210420012f0006210d20012d0005210520012f0126210f20012d0025210e410621060b2003200d3b0106200320053a0005200320063a0004200320022903d0023702082003201036022c200320043602282003200f3b01262003200e3a002520034115360200200341106a200241d8026a290300370200200341186a200241d0026a41106a2903003702002003411d6a200241d0026a41156a2900003700000b200041013a0000200041046a2002290308370200200041106a20033602002000410c6a200241106a2802003602000c030b200141026a2f01002103200241d0026a200141046a10c301200141106a2902002107200141186a2802002104200241186a2001411c6a10c801200041026a20033b0100200041186a2004360200200041106a2007370300200041023a0000200041046a20022903d0023702002000410c6a200241d0026a41086a2802003602002000411c6a2002290318370200200041246a200241186a41086a280200360200200041286a200141286a290300370300200020012d00014100473a00010c020b200141226a2f01002103200241186a200141246a10c301200041226a20033b0100200041246a20022903183702002000412c6a200241206a280200360200200041386a200141386a280200360200200041306a200141306a29020037030020002001290001370001200041096a200141096a290000370000200041116a200141116a290000370000200041196a200141196a290000370000200141c0006a2903002107200041033a0000200041c0006a20073703000c010b200141226a2f01002103200241186a200141246a10c301200041226a20033b0100200041043a0000200041246a20022903183702002000412c6a200241206a280200360200200041306a200141306a29020037030020002001290001370001200041096a200141096a290000370000200041116a200141116a290000370000200041196a200141196a2900003700000b200241f0036a24000f0b102c000bf10503037f017e027f230041306b22022400024002400240024002400240024002400240024002400240024002402001280200417f6a220341094b0d0020030e0a0102030405060708090a010b41bf80c700412841dcbcc700102f000b20004101360200200020012802043602040c090b200241186a200141046a10c801200041023602002000410c6a200241206a280200360200200020022903183702040c080b20004103360200200041086a200141086a2903003703000c070b200241186a200141046a10c801200041043602002000410c6a200241206a280200360200200020022903183702040c060b200241186a200141046a10c801200041053602002000410c6a200241206a280200360200200020022903183702040c050b20004106360200200020012902043702042000410c6a2001410c6a2802003602000c040b2001410c6a2802002204ad42187e2205422088a70d042005a72206417f4c0d04200128020421030240024020060d00410421010c010b200610242201450d060b20024100360210200220013602082002200641186e36020c200241086a4100200410f0012002280210210702402004450d002003200441186c6a21062002280208200741186c6a21012007200441037441786a4103766a2107200241186a410c6a21040340200241186a200310c80120042003410c6a10c801200141106a200241186a41106a290300370200200141086a200241186a41086a29030037020020012002290318370200200141186a2101200341186a22032006470d000b200741016a21070b20002002290308370204200041073602002000410c6a20073602000c030b200241186a200141046a10ca01200041083602002000410c6a200241186a41086a280200360200200020022903183702040c020b200241186a200141046a10c80120004109360200200020022903183702042000410c6a200241206a280200360200200041106a200141106a2802003602000c010b2000410a3602000b200241306a24000f0b1034000b1033000bf91a03057f017e157f230041e0036b2202240002400240024002402001280200417f6a220341014b0d0020030e020102010b41bf80c700412841dcbcc700102f000b20024180026a41186a220420014198026a29000037030020024180026a41106a220520014190026a29000037030020024180026a41086a220620014188026a290000370300200220014180026a29000037038002200141186a2903002107200241e0026a41086a2208200141386a290200370300200241e0026a41106a2209200141c0006a290200370300200241e0026a41186a220a200141c8006a290200370300200241c0026a41086a220b200141d8006a290200370300200241c0026a41106a220c200141e0006a290200370300200241c0026a41186a220d200141e8006a290200370300200241a0026a41086a220e200141f8006a290200370300200241a0026a41106a220f20014180016a290200370300200241a0026a41186a221020014188016a2902003703002002200141306a2902003703e0022002200141d0006a2902003703c0022002200141f0006a2902003703a002200141206a2802002111200241f0016a200141246a10c201200241c0036a41086a2203200141a8016a290200370300200241c0036a41106a2212200141b0016a290200370300200241c0036a41186a2213200141b8016a290200370300200241a0036a41086a2214200141c8016a290200370300200241a0036a41106a2215200141d0016a290200370300200241a0036a41186a2216200141d8016a29020037030020024180036a41086a2217200141e8016a29020037030020024180036a41106a2218200141f0016a29020037030020024180036a41186a2219200141f8016a2902003703002002200141a0016a2902003703c0032002200141c0016a2902003703a0032002200141e0016a2902003703800320014190016a280200211a20024180016a20014194016a10c201200241186a221b2004290300370300200241106a22042005290300370300200241086a22052006290300370300200241d0016a41086a22062008290300370300200241d0016a41106a22082009290300370300200241d0016a41186a2209200a290300370300200241b0016a41086a220a200b290300370300200241b0016a41106a220b200c290300370300200241b0016a41186a220c200d2903003703002002200229038002370300200220022903e0023703d001200220022903c0023703b00120024190016a41186a220d201029030037030020024190016a41106a2210200f29030037030020024190016a41086a220f200e290300370300200241e0006a41186a220e2013290300370300200241e0006a41106a22132012290300370300200241e0006a41086a22122003290300370300200241c0006a41186a221c2016290300370300200241c0006a41106a22162015290300370300200241c0006a41086a22152014290300370300200220022903a00237039001200220022903c003370360200220022903a003370340200241206a41186a22142019290300370300200241206a41106a22192018290300370300200241206a41086a22182017290300370300200220022903800337032020012802042117200241c0036a200141086a10ca01200041206a2011360200200041186a2007370300200041246a20022903f0013702002000412c6a200241f0016a41086a280200360200200041306a20022903d001370300200041386a2006290300370300200041c0006a2008290300370300200041c8006a2009290300370300200041d0006a20022903b001370300200041d8006a200a290300370300200041e0006a200b290300370300200041e8006a200c290300370300200141146a280200210120004190016a201a36020020004188016a200d29030037030020004180016a2010290300370300200041f8006a200f290300370300200041f0006a2002290390013703002000419c016a20024180016a41086a28020036020020004194016a200229038001370200200041a0016a2002290360370300200041a8016a2012290300370300200041b0016a2013290300370300200041b8016a200e290300370300200041d8016a201c290300370300200041d0016a2016290300370300200041c8016a2015290300370300200041c0016a2002290340370300200041f8016a2014290300370300200041f0016a2019290300370300200041e8016a2018290300370300200041e0016a200229032037030020004198026a201b29030037030020004190026a200429030037030020004188026a200529030037030020004180026a200229030037030020002017360204200041106a2003280200360200200041086a20022903c003370200200041146a2001360200200041013602000c010b20024180026a41186a220420014198026a29000037030020024180026a41106a220520014190026a29000037030020024180026a41086a220620014188026a290000370300200220014180026a29000037038002200141186a2903002107200241e0026a41086a2208200141386a290200370300200241e0026a41106a2209200141c0006a290200370300200241e0026a41186a220a200141c8006a290200370300200241c0026a41086a220b200141d8006a290200370300200241c0026a41106a220c200141e0006a290200370300200241c0026a41186a220d200141e8006a290200370300200241a0026a41086a220e200141f8006a290200370300200241a0026a41106a220f20014180016a290200370300200241a0026a41186a221020014188016a2902003703002002200141306a2902003703e0022002200141d0006a2902003703c0022002200141f0006a2902003703a002200141206a2802002111200241f0016a200141246a10c201200241c0036a41086a2203200141a8016a290200370300200241c0036a41106a2212200141b0016a290200370300200241c0036a41186a2213200141b8016a290200370300200241a0036a41086a2214200141c8016a290200370300200241a0036a41106a2215200141d0016a290200370300200241a0036a41186a2216200141d8016a29020037030020024180036a41086a2217200141e8016a29020037030020024180036a41106a2218200141f0016a29020037030020024180036a41186a2219200141f8016a2902003703002002200141a0016a2902003703c0032002200141c0016a2902003703a0032002200141e0016a2902003703800320014190016a280200211a20024180016a20014194016a10c201200241186a221b2004290300370300200241106a22042005290300370300200241086a22052006290300370300200241d0016a41086a22062008290300370300200241d0016a41106a22082009290300370300200241d0016a41186a2209200a290300370300200241b0016a41086a220a200b290300370300200241b0016a41106a220b200c290300370300200241b0016a41186a220c200d2903003703002002200229038002370300200220022903e0023703d001200220022903c0023703b00120024190016a41186a220d201029030037030020024190016a41106a2210200f29030037030020024190016a41086a220f200e290300370300200241e0006a41186a220e2013290300370300200241e0006a41106a22132012290300370300200241e0006a41086a22122003290300370300200241c0006a41186a221c2016290300370300200241c0006a41106a22162015290300370300200241c0006a41086a22152014290300370300200220022903a00237039001200220022903c003370360200220022903a003370340200241206a41186a22142019290300370300200241206a41106a22192018290300370300200241206a41086a22182017290300370300200220022903800337032020012802042117200241c0036a200141086a10ca01200041206a2011360200200041186a2007370300200041246a20022903f0013702002000412c6a200241f0016a41086a280200360200200041306a20022903d001370300200041386a2006290300370300200041c0006a2008290300370300200041c8006a2009290300370300200041d0006a20022903b001370300200041d8006a200a290300370300200041e0006a200b290300370300200041e8006a200c290300370300200141146a280200210120004190016a201a36020020004188016a200d29030037030020004180016a2010290300370300200041f8006a200f290300370300200041f0006a2002290390013703002000419c016a20024180016a41086a28020036020020004194016a200229038001370200200041a0016a2002290360370300200041a8016a2012290300370300200041b0016a2013290300370300200041b8016a200e290300370300200041d8016a201c290300370300200041d0016a2016290300370300200041c8016a2015290300370300200041c0016a2002290340370300200041f8016a2014290300370300200041f0016a2019290300370300200041e8016a2018290300370300200041e0016a200229032037030020004198026a201b29030037030020004190026a200429030037030020004188026a200529030037030020004180026a200229030037030020002017360204200041106a2003280200360200200041086a20022903c003370200200041146a2001360200200041023602000b200241e0036a24000bc20201027f23004190026b22022400024002400240024002402001280200417f6a220341024b0d0020030e03010203010b41bf80c700412841dcbcc700102f000b2002200141186a10aa052001280204210320024180026a200141086a10ca01200141146a2802002101200041186a200241800210cf061a20002003360204200041146a200136020020004101360200200041086a200229038002370200200041106a20024180026a41086a2802003602000c020b2002200141186a10aa052001280204210320024180026a200141086a10ca01200141146a2802002101200041186a200241800210cf061a20002003360204200041146a200136020020004102360200200041086a200229038002370200200041106a20024180026a41086a2802003602000c010b20004103360200200020012902043702040b20024190026a24000beb2005027f017e157f017e137f230041e0036b220224000240024002400240024002400240024020012d0000417f6a220341034b0d0020030e0401020304010b41bf80c700412841dcbcc700102f000b2001410c6a2802002203ad4298027e2204422088a70d042004a72205417f4c0d04200141046a28020021060240024020050d00410821010c010b200510242201450d060b2002410036020820022001360200200220054198026e36020420024100200310e0012002280208210102402003450d0020034198026c2107200228020020014198026c6a21082001200341037441786a4103766a210920024190036a41386a210a20024190036a41306a210b20024190036a41286a210c20024190036a41206a210d410021030340200620036a220141d0006a280200210e200241c0026a41186a220f200141f8006a290000370300200241c0026a41106a2210200141f0006a290000370300200241c0026a41086a2205200141e8006a2900003703002002200141e0006a2900003703c002200241e0026a200141d4006a10c801200241f0026a41186a221120014198016a290000370300200241f0026a41106a221220014190016a290000370300200241f0026a41086a221320014188016a290000370300200220014180016a2900003703f002200a200141d8016a290000370300200b200141d0016a290000370300200c200141c8016a290000370300200d200141c0016a29000037030020024190036a41186a2214200141b8016a29000037030020024190036a41106a2215200141b0016a29000037030020024190036a41086a2216200141a8016a2900003703002002200141a0016a29000037039003200241106a41186a2217200141f8016a290000370300200241106a41106a2218200141f0016a290000370300200241106a41086a2219200141e8016a2900003703002002200141e0016a290000370310200141086a29030021042001290300211a200241d0036a200141106a10ce01200241f0006a41186a221b200141c4006a290000370300200241f0006a41106a221c2001413c6a290000370300200241f0006a41086a221d200141346a29000037030020022001412c6a2900003703702001418c026a211e20014180026a211f024002402001411c6a22202802000d00200241003602500c010b200241d0006a202010c8010b200241b0026a41086a2221200241d0036a41086a28020036020020024180026a41086a2222201d29030037030020024180026a41106a2223201c29030037030020024180026a41186a2224201b290300370300200241a0026a41086a2225200241d0006a41086a2220280200360200200220022903d0033703b0022002200229037037038002200220022903503703a002200141286a2802002126200241d0016a41086a22272005290300370300200241d0016a41106a22282010290300370300200241d0016a41186a2210200f290300370300200241f0016a41086a220f200241e0026a41086a280200360200200241b0016a41086a22292013290300370300200241b0016a41106a222a2012290300370300200241b0016a41186a22122011290300370300200220022903c0023703d001200220022903e0023703f001200220022903f0023703b001200241f0006a41386a2211200a290300370300200241f0006a41306a222b200b290300370300200241f0006a41286a222c200c290300370300200241f0006a41206a222d200d290300370300201b2014290300370300201c2015290300370300201d2016290300370300200241d0006a41186a22142017290300370300200241d0006a41106a2215201829030037030020202019290300370300200220022903900337037020022002290310370350200241106a201f10cc0120024190036a201e10fe042013201928020036020020052016280200360200200220022903103703f00220022002290390033703c002200820036a220120043703082001201a370300200141106a20022903b002370300200141186a20212802003602002001411c6a20022903a002370200200141246a2025280200360200200141286a20263602002001412c6a200229038002370200200141346a20222903003702002001413c6a2023290300370200200141c4006a2024290300370200200141d0006a200e360200200141dc006a200f280200360200200141d4006a20022903f001370200200141f8006a2010290300370300200141f0006a2028290300370300200141e8006a2027290300370300200141e0006a20022903d00137030020014198016a201229030037030020014190016a202a29030037030020014188016a202929030037030020014180016a20022903b001370300200141d8016a2011290300370300200141d0016a202b290300370300200141c8016a202c290300370300200141c0016a202d290300370300200141b8016a201b290300370300200141b0016a201c290300370300200141a8016a201d290300370300200141a0016a2002290370370300200141f8016a2014290300370300200141f0016a2015290300370300200141e8016a2020290300370300200141e0016a200229035037030020014188026a201328020036020020014180026a20022903f00237030020014194026a20052802003602002001418c026a20022903c002370200200720034198026a2203470d000b200941016a21010b200041013a0000200041046a20022903003702002000410c6a20013602000c030b20024180026a41186a200141d4006a29000037030020024180026a41106a200141cc006a29000037030020024180026a41086a200141c4006a29000037030020022001413c6a290000370380020240024002400240200141dc006a2d00000e03010200010b200241c0026a41186a200141f5006a290000370300200241c0026a41106a200141ed006a290000370300200241c0026a41086a200141e5006a2900003703002002200141dd006a2900003703c002410221030c020b200241c0026a41186a200141f5006a290000370300200241c0026a41106a200141ed006a290000370300200241c0026a41086a200141e5006a2900003703002002200141dd006a2900003703c002410021030c010b200241c0026a41186a200141f5006a290000370300200241c0026a41106a200141ed006a290000370300200241c0026a41086a200141e5006a2900003703002002200141dd006a2900003703c002410121030b200241c8036a200141b5016a290000370300200241c0036a200141ad016a290000370300200241b8036a200141a5016a290000370300200241b0036a2001419d016a29000037030020024190036a41186a20014195016a29000037030020024190036a41106a2001418d016a29000037030020024190036a41086a20014185016a2900003703002002200141fd006a290000370390030240024002400240200141bd016a2d00000e03010200010b200241f0026a41186a200141d6016a290000370300200241f0026a41106a200141ce016a290000370300200241f0026a41086a200141c6016a2900003703002002200141be016a2900003703f002410221050c020b200241f0026a41186a200141d6016a290000370300200241f0026a41106a200141ce016a290000370300200241f0026a41086a200141c6016a2900003703002002200141be016a2900003703f002410021050c010b200241f0026a41186a200141d6016a290000370300200241f0026a41106a200141ce016a290000370300200241f0026a41086a200141c6016a2900003703002002200141be016a2900003703f002410121050b200241106a41386a221320014196026a290000370300200241106a41306a221b2001418e026a290000370300200241106a41286a221c20014186026a290000370300200241106a41206a221d200141fe016a290000370300200241106a41186a2216200141f6016a290000370300200241106a41106a2219200141ee016a290000370300200241106a41086a2220200141e6016a2900003703002002200141de016a2900003703102001280204210a200241d0036a200141086a10ca01200241d0016a41086a220b20024180026a41086a290300370300200241d0016a41106a220c20024180026a41106a290300370300200241d0016a41186a220d20024180026a41186a290300370300200241b0016a41086a220e200241c0026a41086a290300370300200241b0016a41106a220f200241c0026a41106a290300370300200241b0016a41186a2210200241c0026a41186a290300370300200241f0006a41386a221120024190036a41386a290300370300200241f0006a41306a221220024190036a41306a290300370300200241f0006a41286a221420024190036a41286a290300370300200241f0006a41206a221520024190036a41206a290300370300200241f0006a41186a221720024190036a41186a290300370300200241f0006a41106a221820024190036a41106a290300370300200241f0006a41086a221e20024190036a41086a29030037030020022002290380023703d001200220022903c0023703b0012002200229039003370370200141146a2902002104200241d0006a41186a221f200241f0026a41186a290300370300200241d0006a41106a2221200241f0026a41106a290300370300200241d0006a41086a2222200241f0026a41086a290300370300200220022903f002370350200041046a200a360200200041086a20022903d003370200200041106a200241d0036a41086a280200360200200041146a20043702002000411c6a2001411c6a290000370000200041246a200141246a2900003700002000412c6a2001412c6a290000370000200041346a200141346a2900003700002000413c6a20022903d001370200200041c4006a200b290300370200200041cc006a200c290300370200200041d4006a200d290300370200200041dc006a20033a0000200041f5006a2010290300370000200041ed006a200f290300370000200041e5006a200e290300370000200041dd006a20022903b001370000200041b5016a2011290300370000200041ad016a2012290300370000200041a5016a20142903003700002000419d016a201529030037000020004195016a20172903003700002000418d016a201829030037000020004185016a201e290300370000200041fd006a2002290370370000200041bd016a20053a0000200041d6016a201f290300370000200041ce016a2021290300370000200041c6016a2022290300370000200041be016a200229035037000020004196026a20132903003700002000418e026a201b29030037000020004186026a201c290300370000200041fe016a201d290300370000200041f6016a2016290300370000200041ee016a2019290300370000200041e6016a2020290300370000200041de016a2002290310370000200041023a00000c020b200041033a000020002001290001370001200041306a200141306a290300370300200041286a200141286a290300370300200041246a200141246a280200360200200041096a200141096a290000370000200041116a200141116a290000370000200041196a200141196a2900003700000c010b200141046a280200210320024190036a200141086a10c801200041046a2003360200200041043a0000200041086a200229039003370200200041106a20024190036a41086a2802003602000b200241e0036a24000f0b1034000b1033000b902904057f067e087f037e23004180046b2202240002400240024002400240024002400240024002400240024020012d0000417f6a220341084b0d0020030e09010203040506070809010b41bf80c700412841dcbcc700102f000b200241206a200141196a290000370300200241186a200141116a290000370300200241106a200141096a2900003703002002200129000137030841b00210242203450d0902400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200141246a28020022012802000e170102030405060b0708090a0b0c0d0e0f10111213141500010b200241286a200141086a108d03200341086a200241286a41c80010cf061a200341163602000c150b200241286a200141086a108e0320034100360200200341186a200241286a41106a290300370300200341106a200241286a41086a290300370300200320022903283703080c140b200241286a200141086a108f03200341086a200241286a41a00210cf061a200341013602000c130b200341023602002003200141086a2903003703080c120b02400240024002400240024002400240024020012d0004417f6a220441044b0d00200141046a210520040e050102030405010b41bf80c700412841dcbcc700102f000b200141086a2802002104410121060c040b41022106200241d0026a41026a200541036a2d00003a0000200241286a41086a200141146a290000370300200241386a2001411c6a290000370300200241c0006a200141246a2d00003a0000200220052f00013b01d00220022001410c6a290000370328200141086a2800002104200141286a28020021010c040b200141086a2802002104410321060c020b200241d2026a200541036a2d00003a0000200241286a41086a200141146a290000370300200241386a2001411c6a290000370300200241c0006a200141246a2d00003a0000200220052f00013b01d00220022001410c6a29000037032820012d00254100472105200141086a2800002104200141286a2802002101410421060c030b200141086a2802002104410521060b0b0b200320063a0004200320022f01d0023b0005200320043602082003200229032837020c200320053a002520032001360228200320022f01f0033b0126200341076a200241d2026a2d00003a0000200341146a200241306a2903003702002003411c6a200241386a290300370200200341246a200241c0006a2d00003a0000200341033602000c110b02400240024002400240024002400240200141086a22042d0000417f6a220641034b0d0020060e0401020304010b41bf80c700412841dcbcc700102f000b200241306a200441096a290000370300200241386a200441116a290000370300200241c0006a200441196a29000037030020022004290001370328200141386a2903002107200141306a2903002108410121010c030b200241306a200441096a290000370300200241386a200441116a290000370300200241c0006a200441196a29000037030020022004290001370328200141c8006a2903002109200141c0006a290300210a200141386a2903002107200141306a2903002108410221010c030b200241306a200441096a290000370300200241386a200441116a290000370300200241c0006a200441196a290000370300200220042900013703282002200441216a2800003602d0022002200441246a2800003600d302200141c8006a3100002109200141c0006a290000210a200141386a2900002107200141306a2900002108200141d8006a290300210b200141d0006a290300210c410321010c030b200241306a200441096a290000370300200241386a200441116a290000370300200241c0006a200441196a29000037030020022004290001370328200141386a2903002107200141306a2903002108410421010b0b0b2003200c3703502003200a37034020032008370330200320013a000820032002290328370009200320022802d00236002920034104360200200341d8006a200b370300200341c8006a2009370300200341386a20073703002003412c6a20022800d302360000200341116a200241306a290300370000200341196a200241386a290300370000200341216a200241c0006a2903003700000c100b200241286a200141046a10c001200341053602002003410c6a200241306a280200360200200320022903283702040c0f0b024002402001280204450d00200241d0026a41186a200141286a290000370300200241d0026a41106a200141206a290000370300200241d8026a200141186a290000370300200241d0026a41286a200141386a290000370300200241d0026a41306a200141c0006a290000370300200241d0026a41386a200141c8006a290000370300200241d0026a41c8006a200141d8006a290000370300200241d0026a41d0006a200141e0006a290000370300200241d0026a41d8006a200141e8006a2900003703002002200141106a2900003703d0022002200141306a2900003703f0022002200141d0006a29000037039003200241d0026a41f8006a20014188016a290000370300200241d0026a41f0006a20014180016a290000370300200241d0026a41e8006a200141f8006a290000370300200241d0026a4198016a200141a8016a290000370300200241d0026a4190016a200141a0016a290000370300200241d0026a4188016a20014198016a2900003703002002200141f0006a2900003703b003200220014190016a2900003703d003200241286a200141046a10c801200241346a200241d0026a41a00110cf061a0c010b200241003602280b200341046a200241286a41ac0110cf061a200341073602000c0e0b20034108360200200320012802043602040c0d0b200241286a200141086a109003200341086a200241286a41980210cf061a200341093602000c0c0b20012802042105200241286a200141086a10c801200241f0036a200141146a10d001200241286a41146a200241f0036a41086a280200360200200220022903f003370234200241d0026a41086a220d200241286a41086a2204290300370300200241d0026a41106a220e200241286a41106a2206290300370300200220022903283703d002200141206a2902002107200141286a280200210f2004200141346a29000037030020062001413c6a290000370300200241286a41186a2210200141c4006a290000370300200241286a41206a2211200141cc006a290000370300200241286a41286a2212200141d4006a290000370300200241d8006a2213200141dc006a290000370300200241e0006a2214200141e4006a2900003703002001412c6a2900002108200320053602042003200f3602282003200737022020022008370328200320022903d002370208200341106a200d290300370200200341186a200e290300370200200341e4006a2014290300370200200341dc006a2013290300370200200341d4006a2012290300370200200341cc006a2011290300370200200341c4006a20102903003702002003413c6a2006290300370200200341346a20042903003702002003200229032837022c2003410a3602000c0b0b108103000b200241286a200141086a109103200341086a200241286a41a00210cf061a2003410c3602000c090b2003410d3602000c080b200241286a200141046a10b702200341046a200241286a41c80010cf061a2003410e3602000c070b024002400240024020012f0104417f6a220441014b0d0020040e020102010b41bf80c700412841dcbcc700102f000b200241286a200141086a10c401200229022c210720022802282104410121010c010b20012f0106210641b00210242204450d112004200141086a28020010c601410221010b2003200737020c20032004360208200320063b0106200320013b01042003410f3602000c060b200241286a200141086a10d002200341086a200241286a41a80210cf061a200341103602000c050b200241286a200141046a109203200341046a200241286a41c40010cf061a200341113602000c040b02400240024002400240200141086a22042d0000417f6a220e41034b0d0042002109410121054200210c200e0e0404010203040b41bf80c700412841dcbcc700102f000b200241c0006a200441196a290000370300200241386a200441116a290000370300200241306a200441096a2900003703002002200429000137032842002109410221054200210c0c020b200241306a200441096a290000370300200241386a200441116a290000370300200241c0006a200441196a29000037030020022004290001370328200141c8006a290300210b200141c0006a290300210a200141386a2903002115200141306a2903002116200141d0006a280200210d42002109410321054200210c0c010b200241306a200441096a290000370300200241386a200441116a290000370300200241c0006a200441196a290000370300200220042900013703282002200441216a2800003602d0022002200441246a2800003600d302200141d0006a2903002217428080808070832109200141d8006a290300210c200141c8006a310000210b200141c0006a290000210a200141386a2900002115200141306a2900002116200141e8006a2903002108200141e0006a2903002107200141f0006a28020021062017a7210d410421050b200320073703602003200a37034020032016370330200320053a000820032002290328370009200320022802d00236002920032006360270200341e8006a2008370300200341d8006a200c370300200341c8006a200b370300200341386a20153703002003412c6a20022800d30236000020032009200dad84370350200341116a200241306a290300370000200341196a200241386a290300370000200341216a200241c0006a290300370000200341123602000c030b200241286a200141046a10930320034113360200200341246a200241c8006a2802003602002003411c6a200241c0006a290300370200200341146a200241386a2903003702002003410c6a200241306a290300370200200320022903283702040c020b200241286a200141086a10940320034114360200200341286a200241286a41206a290300370300200341206a200241286a41186a290300370300200341186a200241286a41106a290300370300200341106a200241286a41086a290300370300200320022903283703080c010b024002400240024002400240024020012d0004417f6a221141054b0d004104210d20110e06010203060405010b41bf80c700412841dcbcc700102f000b200241286a41086a2206200141106a290000370300200241286a41106a2205200141186a290000370300200241286a41156a220d2001411d6a2900003700002002200141086a29000037032820012f0006210f20012d0005210e20012d0025211041b00210242204450d0f2004200141286a280200109503200241d0026a41156a200d290000370000200241d0026a41106a2005290300370300200241d0026a41086a2006290300370300200220022903283703d0024101210d0c040b200241d0026a41086a200141106a290000370300200241d0026a41106a200141186a290000370300200241e5026a2001411d6a2900003700002002200141086a2900003703d00220012f0006210f20012d0005210e20012d002521104102210d0c030b200241d0026a41086a200141106a290000370300200241d0026a41106a200141186a290000370300200241e5026a2001411d6a2900003700002002200141086a2900003703d00220012f0006210f20012d0005210e20012d002521104103210d0c020b20012f0106210f20012d0005210e4105210d0c010b200241d0026a41086a200141106a290000370300200241d0026a41106a200141186a290000370300200241e5026a2001411d6a2900003700002002200141086a2900003703d0022001412c6a2802002105200141286a280200210420012f0006210f20012d0005210e20012f0126210620012d002521104106210d0b2003200f3b01062003200e3a00052003200d3a0004200320022903d0023702082003200536022c20032004360228200320063b0126200320103a002520034115360200200341106a200241d8026a290300370200200341186a200241d0026a41106a2903003702002003411d6a200241d0026a41156a2900003700000b20002002290308370001200041013a0000200041246a2003360200200041196a200241206a290300370000200041116a200241186a290300370000200041096a200241106a2903003700000c080b200041023a000020002001290001370001200041196a200141196a290000370000200041116a200141116a290000370000200041096a200141096a290000370000200041216a200141216a290000370000200041296a200141296a290000370000200041316a200141316a290000370000200041396a200141396a2900003700000c070b200241286a200141046a10c301200041033a0000200041046a20022903283702002000410c6a200241306a280200360200200041106a200141106a280200360200200041026a200141026a2f01003b01000c060b200041043a000020002001290001370001200041196a200141196a290000370000200041116a200141116a290000370000200041096a200141096a2900003700000c050b200041053a000020002001290001370001200041196a200141196a290000370000200041116a200141116a290000370000200041096a200141096a290000370000200041216a200141216a290000370000200041296a200141296a290000370000200041316a200141316a290000370000200041396a200141396a2900003700000c040b200041063a000020002001290001370001200041196a200141196a290000370000200041116a200141116a290000370000200041096a200141096a2900003700000c030b200041073a000020002001290001370001200041196a200141196a290000370000200041116a200141116a290000370000200041096a200141096a2900003700000c020b200041083a00000c010b200041093a000020002001290001370001200041196a200141196a290000370000200041116a200141116a290000370000200041096a200141096a2900003700000b20024180046a24000f0b102c000b910601077f230041106b2202240002400240024002400240024002400240024020012d0000417f6a220341054b0d0020030e06010203040506010b41bf80c700412841dcbcc700102f000b200141106a28020021042001410c6a2802002105200141086a2802002106200141046a280200210720012d0001210841b00210242203450d062003200141146a28020010df03200041106a20043602002000410c6a2005360200200041086a2006360200200041046a2007360200200041146a2003360200200020083a0001200041013a00000c050b200041023a0000200041046a200141046a2902003702000c040b2002200141046a10c8012001411c6a2802002104200141186a2802002105200141146a2802002106200141106a280200210720012d0001210841b00210242203450d042003200141206a28020010df032000411c6a2004360200200041186a2005360200200041146a2006360200200041106a2007360200200041206a2003360200200020083a0001200041033a00002000410c6a200241086a280200360200200041046a20022903003702000c030b2002200141046a10c801200041043a00002000410c6a200241086a280200360200200041046a20022903003702000c020b200141106a28020021042001410c6a2802002105200141086a2802002106200141046a280200210720012d0001210841b00210242203450d022003200141146a28020010df03200041106a20043602002000410c6a2005360200200041086a2006360200200041046a2007360200200041146a2003360200200020083a0001200041053a00000c010b2002200141046a10c8012001411c6a2802002104200141186a2802002105200141146a2802002106200141106a280200210720012d0001210841b00210242203450d012003200141206a28020010df032000411c6a2004360200200041186a2005360200200041146a2006360200200041106a2007360200200041206a2003360200200020083a0001200041063a00002000410c6a200241086a280200360200200041046a20022903003702000b200241106a24000f0b102c000b940301057f230041206b22022400024002400240024002400240024020012d0000417f6a220341034b0d0020030e0401020304010b41bf80c700412841dcbcc700102f000b41b00210242203450d042003200141046a280200108905200041013a0000200041046a20033602000c030b41b00210242203450d032003200141046a280200108905200041046a2003360200200041023a0000200041086a200141086a2903003703000c020b200041033a000020002001290001370001200041196a200141196a290000370000200041116a200141116a290000370000200041096a200141096a2900003700000c010b200241186a2204200141196a290000370300200241106a2205200141116a290000370300200241086a2206200141096a2900003703002002200129000137030041b00210242203450d012003200141246a280200108905200041246a2003360200200041043a0000200041196a2004290300370000200041116a2005290300370000200041096a2006290300370000200020022903003700010b200241206a24000f0b102c000b942205047f067e017f037e047f230041e0036b2202240002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012802000e170102030405060b0708090a0b0c0d0e0f10111213141500010b200241086a200141086a108d03200041086a200241086a41c80010cf061a200041163602000c150b200241086a200141086a108e0320004100360200200041186a200241086a41106a290300370300200041106a200241086a41086a290300370300200041086a20022903083703000c140b200241086a200141086a108f03200041086a200241086a41a00210cf061a200041013602000c130b20004102360200200041086a200141086a2903003703000c120b02400240024002400240024002400240024020012d0004417f6a220341044b0d00200141046a210420030e050102030405010b41bf80c700412841dcbcc700102f000b200141086a2802002103410121050c040b41022105200241b0026a41026a200441036a2d00003a0000200241086a41086a200141146a290200370300200241186a2001411c6a290200370300200241206a200141246a2d00003a0000200220042f00013b01b00220022001410c6a290200370308200141086a2802002103200141286a28020021010c040b200141086a2802002103410321050c020b200241b2026a200441036a2d00003a0000200241086a41086a200141146a290200370300200241186a2001411c6a290200370300200241206a200141246a2d00003a0000200220042f00013b01b00220022001410c6a29020037030820012d00254100472104200141086a2802002103200141286a2802002101410421050c030b200141086a2802002103410521050b0b0b200020053a0004200020022f01b0023b0005200020043a0025200020022f01d0033b0126200041086a20033602002000410c6a2002290308370200200041286a2001360200200041076a200241b2026a2d00003a0000200041146a200241086a41086a2903003702002000411c6a200241186a290300370200200041246a200241206a2d00003a0000200041033602000c110b02400240024002400240024002400240200141086a22032d0000417f6a220541034b0d0020050e0401020304010b41bf80c700412841dcbcc700102f000b200241106a200341096a290000370300200241186a200341116a290000370300200241206a200341196a29000037030020022003290001370308200141386a2903002106200141306a2903002107410121010c030b200241106a200341096a290000370300200241186a200341116a290000370300200241206a200341196a29000037030020022003290001370308200141c8006a2903002108200141c0006a2903002109200141386a2903002106200141306a2903002107410221010c030b200241106a200341096a290000370300200241186a200341116a290000370300200241206a200341196a290000370300200220032900013703082002200341216a2800003602b0022002200341246a2800003600b302200141c8006a3100002108200141c0006a2902002109200141386a2902002106200141306a2902002107200141d8006a290300210a200141d0006a290300210b410321010c030b200241106a200341096a290000370300200241186a200341116a290000370300200241206a200341196a29000037030020022003290001370308200141386a2903002106200141306a2903002107410421010b0b0b20002002290308370009200020022802b00236002920004104360200200041d8006a200a370300200041d0006a200b370300200041c8006a2008370300200041c0006a2009370300200041386a2006370300200041306a2007370300200041086a20013a00002000412c6a20022800b302360000200041116a200241086a41086a290300370000200041196a200241186a290300370000200041216a200241206a2903003700000c100b200241086a200141046a10c001200041053602002000410c6a200241106a280200360200200020022903083702040c0f0b024002402001280204450d00200241b0026a41186a200141286a290000370300200241b0026a41106a200141206a290000370300200241b8026a200141186a290000370300200241b0026a41286a200141386a290000370300200241b0026a41306a200141c0006a290000370300200241b0026a41386a200141c8006a290000370300200241b0026a41c8006a200141d8006a290000370300200241b0026a41d0006a200141e0006a290000370300200241b0026a41d8006a200141e8006a2900003703002002200141106a2900003703b0022002200141306a2900003703d0022002200141d0006a2900003703f002200241b0026a41f8006a20014188016a290000370300200241b0026a41f0006a20014180016a290000370300200241b0026a41e8006a200141f8006a290000370300200241b0026a4198016a200141a8016a290000370300200241b0026a4190016a200141a0016a290000370300200241b0026a4188016a20014198016a2900003703002002200141f0006a29000037039003200220014190016a2900003703b003200241086a200141046a10c801200241146a200241b0026a41a00110cf061a0c010b200241003602080b200041046a200241086a41ac0110cf061a200041073602000c0e0b20004108360200200020012802043602040c0d0b200241086a200141086a109003200041086a200241086a41980210cf061a200041093602000c0c0b20012802042103200241086a200141086a10c801200241d0036a200141146a10d001200241086a41146a200241d0036a41086a280200360200200220022903d003370214200241b0026a41106a200241086a41106a2903002206370300200241b0026a41086a200241086a41086a29030022073703002002200229030822083703b002200141206a2902002109200141286a280200210520002003360204200041086a2008370200200041106a2007370200200041186a2006370200200041286a2005360200200041206a20093702002000412c6a2001412c6a290200370200200041346a200141346a2902003702002000413c6a2001413c6a290200370200200041c4006a200141c4006a290200370200200041cc006a200141cc006a290200370200200041d4006a200141d4006a290200370200200041dc006a200141dc006a290200370200200041e4006a200141e4006a2902003702002000410a3602000c0b0b108103000b200241086a200141086a109103200041086a200241086a41a00210cf061a2000410c3602000c090b2000410d3602000c080b200241086a200141046a10b702200041046a200241086a41c80010cf061a2000410e3602000c070b024002400240024020012f0104417f6a220341014b0d0020030e020102010b41bf80c700412841dcbcc700102f000b200241086a200141086a10c401200229020c210620022802082103410121010c010b20012f0106210541b00210242203450d082003200141086a28020010c601410221010b200020013b01042000410f3602002000410c6a2006370200200041086a2003360200200041066a20053b01000c060b200241086a200141086a10d002200041086a200241086a41a80210cf061a200041103602000c050b200241086a200141046a109203200041046a200241086a41c40010cf061a200041113602000c040b02400240024002400240200141086a22032d0000417f6a220c41034b0d00420021064101210542002109200c0e0404010203040b41bf80c700412841dcbcc700102f000b200241206a200341196a290000370300200241186a200341116a290000370300200241106a200341096a290000370300200220032900013703084200210641022105420021090c020b200241106a200341096a290000370300200241186a200341116a290000370300200241206a200341196a29000037030020022003290001370308200141c8006a2903002108200141c0006a2903002107200141386a290300210d200141306a290300210e200141d0006a28020021044200210641032105420021090c010b200241106a200341096a290000370300200241186a200341116a290000370300200241206a200341196a290000370300200220032900013703082002200341216a2800003602b0022002200341246a2800003600b302200141d0006a290300220f428080808070832106200141d8006a2903002109200141c8006a3100002108200141c0006a2902002107200141386a290200210d200141306a290200210e200141e8006a290300210b200141e0006a290300210a200141f0006a2802002110200fa72104410421050b20002002290308370009200020022802b002360029200041e8006a200b370300200041e0006a200a370300200041d8006a2009370300200041c8006a2008370300200041c0006a2007370300200041386a200d370300200041306a200e370300200041086a20053a00002000412c6a20022800b302360000200041f0006a2010360200200041d0006a20062004ad84370300200041116a200241086a41086a290300370000200041196a200241186a290300370000200041216a200241206a290300370000200041123602000c030b200241086a200141046a10930320004113360200200041246a200241286a2802003602002000411c6a200241206a290300370200200041146a200241186a2903003702002000410c6a200241106a290300370200200020022903083702040c020b200241086a200141086a10940320004114360200200041286a200241086a41206a290300370300200041206a200241086a41186a290300370300200041186a200241086a41106a290300370300200041106a200241086a41086a290300370300200041086a20022903083703000c010b024002400240024002400240024020012d0004417f6a221141054b0d004104210520110e06010203060405010b41bf80c700412841dcbcc700102f000b200241086a41086a2205200141106a290000370300200241086a41106a2212200141186a290000370300200241086a41156a22132001411d6a2900003700002002200141086a29000037030820012f0006211020012d0005210420012d0025210c41b00210242203450d062003200141286a280200109503200241b0026a41156a2013290000370000200241b0026a41106a2012290300370300200241b0026a41086a2005290300370300200220022903083703b002410121050c040b200241b0026a41086a200141106a290200370300200241b0026a41106a200141186a290200370300200241c5026a2001411d6a2900003700002002200141086a2902003703b00220012f0006211020012d0005210420012d0025210c410221050c030b200241b0026a41086a200141106a290200370300200241b0026a41106a200141186a290200370300200241c5026a2001411d6a2900003700002002200141086a2902003703b00220012f0006211020012d0005210420012d0025210c410321050c020b20012f0106211020012d00052104410521050c010b200241b0026a41086a200141106a290200370300200241b0026a41106a200141186a290200370300200241c5026a2001411d6a2900003700002002200141086a2902003703b0022001412c6a2802002113200141286a280200210320012f0006211020012d0005210420012f0126211220012d0025210c410621050b200020043a0005200020053a00042000200c3a002520004115360200200041066a20103b0100200041086a20022903b0023702002000412c6a2013360200200041286a2003360200200041266a20123b0100200041106a200241b0026a41086a290300370200200041186a200241b0026a41106a2903003702002000411d6a200241b0026a41156a2900003700000b200241e0036a24000f0b102c000b13002000410e360204200041f0a6c2003602000b920301057f230041d0006b22022400200241938cc700410710fb01200241106a41e4eec100410810fb012002200136022c200241306a2002412c6a410410bc02200241cc006a2002412c6a41046a3602002002200241c0006a36024420022002412c6a3602482002200241306a360240200241206a200241c0006a1073024002402002280228220341206a2204417f4c0d000240024020040d0041012101410021040c010b200410242201450d020b20002001360200200041086a220141003602002000200436020420004100411010c9012000280200200128020022046a220520022900003700002001200441106a2204360200200541086a200241086a29000037000020002004411010c9012000280200200128020022046a220520022900103700002001200441106a2206360200200541086a200241106a41086a2900003700002002280220210420002006200310c9012000280200200128020022006a2004200310cf061a2001200020036a36020002402002280224450d00200410260b200241d0006a24000f0b1034000b1033000b9a1a01047f024002402000280200220141154b0d000240024002400240024002400240024002400240024002400240024020010e1600010f0f0f020f030f04050f060f0708090a0f0b0c0d000b200041086a280200417e6a220141074b0d0e02400240024002400240024020010e080014010214030405000b200041106a280200450d132000410c6a28020010260f0b200041106a280200450d122000410c6a28020010260f0b200041106a280200450d112000410c6a28020010260f0b0240200041146a2802002202450d002000410c6a2802002101200241186c210203400240200141046a280200450d00200128020010260b0240200141106a280200450d002001410c6a28020010260b200141186a2101200241686a22020d000b0b200041106a2802002201450d10200141186c450d10200028020c10260f0b0240200041146a2802002202450d002000410c6a28020021012002410c6c210203400240200141046a280200450d00200128020010260b2001410c6a2101200241746a22020d000b0b200041106a2802002201450d0f2001410c6c450d0f200028020c10260f0b200041106a280200450d0e2000410c6a28020010260f0b0240200041086a280200220141014b0d00024020010e020f000f0b2000412c6a220210d6010240200041306a2802002201450d00200141246c450d00200228020010260b2000419c016a220210d6010240200041a0016a2802002201450d00200141246c450d00200228020010260b0240200041186a2802002202450d00200041106a28020021012002410c6c210203400240200141046a280200450d00200128020010260b2001410c6a2101200241746a22020d000b0b200041146a2802002201450d0e2001410c6c450d0e200028021010260f0b2000412c6a220210d6010240200041306a2802002201450d00200141246c450d00200228020010260b2000419c016a220210d6010240200041a0016a2802002201450d00200141246c450d00200228020010260b0240200041186a2802002202450d00200041106a28020021012002410c6c210203400240200141046a280200450d00200128020010260b2001410c6a2101200241746a22020d000b0b200041146a2802002201450d0d2001410c6c450d0d200028021010260f0b02402000410c6a2802002201450d00200141f0006c2102200028020441046a21010340200110d6010240200141046a2802002203450d00200341246c450d00200128020010260b200141f0006a2101200241907f6a22020d000b0b200041086a2802002201450d0c200141f0006c450d0c200028020410260f0b20002802042201450d0b200041086a280200450d0b200110260f0b200041086a280200417f6a220141014b0d0a0240024020010e020001000b0240200041186a2802002202450d00200041106a28020021012002410c6c210203400240200141046a280200450d00200128020010260b2001410c6a2101200241746a22020d000b0b200041146a2802002201450d0b2001410c6c450d0b200028021010260f0b0240200041186a2802002202450d00200041106a28020021012002410c6c210203400240200141046a280200450d00200128020010260b2001410c6a2101200241746a22020d000b0b200041146a2802002201450d0a2001410c6c450d0a200028021010260f0b02402000410c6a280200450d00200041086a28020010260b02402000411c6a2802002202450d00200041146a28020021012002410c6c210203400240200141046a280200450d00200128020010260b2001410c6a2101200241746a22020d000b0b200041186a2802002201450d092001410c6c450d09200028021410260f0b0240200041086a2d0000220141034b0d000240024020010e040b00010b0b0b0240200041146a2802002201450d002000410c6a280200220320014198026c6a210403400240200341d8006a280200450d00200328025410260b0240200341186a2802002202450d00200328021021012002410474210203400240200141046a280200450d00200128020010260b200141106a2101200241706a22020d000b0b0240200341146a28020041ffffffff0071450d00200328021010260b0240200328021c2201450d00200341206a280200450d00200110260b024020034184026a2802002201450d00200141c1006c450d0020032802800210260b20034198026a210120034190026a4100360200200328028c0221022003410136028c02024020034194026a280200450d00200210260b2001210320012004470d000b0b200041106a2802002201450d0a20014198026c450d0a200028020c10260f0b0240200041186a2802002202450d00200041106a28020021012002410c6c210203400240200141046a280200450d00200128020010260b2001410c6a2101200241746a22020d000b0b200041146a2802002201450d092001410c6c450d09200028021010260f0b200041146a280200450d08200041106a28020010260f0b20002d0004417f6a220141034b0d070240024020010e0400090901000b0240200041106a280200450d002000410c6a28020010260b2000411c6a280200450d08200041186a28020010260f0b02402000410c6a280200450d00200041086a28020010260b200041186a280200450d07200041146a28020010260f0b024020002f0104220141014b0d00024020010e020800080b0240200041106a2802002202450d00200041086a2802002101200241b0026c21020340200110d501200141b0026a2101200241d07d6a22020d000b0b2000410c6a2802002201450d07200141b0026c450d07200028020810260f0b200041086a2201280200109803200128020010260f0b200041086a2d0000417e6a2201410b4b0d05024002400240024020010e0c000109090909090909090203000b0240200041146a2802002202450d002000410c6a2802002201200241c8006c6a21020340024020012d00004101470d00200141086a280200450d00200141046a28020010260b0240200141246a2d00004101470d002001412c6a280200450d00200141286a28020010260b200141c8006a22012002470d000b0b0240200041106a2802002201450d00200141c8006c450d00200028020c10260b0240200041186a2d00004101470d00200041206a280200450d002000411c6a28020010260b02402000413c6a2d00004101470d00200041c4006a280200450d00200041c0006a28020010260b0240200041e0006a2d00004101470d00200041e8006a280200450d00200041e4006a28020010260b024020004184016a2d00004101470d002000418c016a280200450d0020004188016a28020010260b0240200041a8016a2d00004101470d00200041b0016a280200450d00200041ac016a28020010260b0240200041cc016a2d00004101470d00200041d4016a280200450d00200041d0016a28020010260b200041f0016a2d00004101470d08200041f8016a280200450d08200041f4016a28020010260f0b0240200041146a2802002201450d00200141c4006c21022000410c6a28020041286a210103400240200141786a2d00004101470d002001280200450d002001417c6a28020010260b200141c4006a2101200241bc7f6a22020d000b0b200041106a2802002201450d07200141c4006c450d07200028020c10260f0b2000412c6a2d00004101470d06200041346a280200450d06200041306a28020010260f0b2000412c6a2d00004101470d05200041346a280200450d05200041306a28020010260f0b20002d0004417f6a220141024b0d040240024020010e03000601000b200041286a2201280200109803200128020010260f0b2000410c6a28020041ffffff3f71450d04200041086a28020010260f0b024020002d0004220141054b0d00024002400240024020010e06080008010203080b200041186a2201280200109803200128020010260f0b02402000410c6a280200450d00200041086a28020010260b200041246a2201280200109803200128020010260f0b2000410c6a280200450d05200041086a28020010260c050b200041186a2201280200109803200128020010260f0b02402000410c6a280200450d00200041086a28020010260b200041246a2201280200109803200128020010260f0b0240200041086a2d0000220141034b0d000240024020010e0405000105050b2000410c6a2201280200109803200128020010260f0b2000410c6a2201280200109803200128020010260f0b2000412c6a2201280200109803200128020010260f0b20002d00044101470d01200041286a2201280200109803200128020010260f0b0240200041086a2d0000220141034b0d0002400240024020010e0404000102040b0240200041106a28020041ffffff3f71450d002000410c6a28020010260b200041186a2201280200109803200128020010260f0b0240200041106a28020041ffffff3f71450d002000410c6a28020010260b200041286a280200450d02200041246a28020010260f0b200041306a28020041ffffff3f71450d012000412c6a28020010260f0b200041306a28020041ffffff3f71450d002000412c6a28020010260f0b0ba00403027f017e047f230041306b22032400200341086a200141086a28020022043602002003200129020022053703002005a72106024002400240024020040d00410021070c010b200441057421084100210941002107200621010240034002402009450d0020092001412010d2064100480d00200341106a410610ec02200041013602002000410c6a200341186a280200360200200020032903103702040c020b0240024020012002412010d206220941004a0d0020022001460d012009450d01200741016a21070b20012109200141206a2101200841606a2208450d030c010b0b200341106a410710ec02200041013602002000410c6a200341186a280200360200200020032903103702040b200328020441ffffff3f71450d01200610260c010b200341106a41186a200241186a290000370300200341106a41106a200241106a290000370300200341106a41086a200241086a2900003703002003200229000037031020042007490d01024020042003280204470d00200320044101109301200328020021060b200620074105746a220141206a2001200420076b41057410d0061a200141186a200341106a41186a290300370000200141106a200341106a41106a290300370000200141086a200341106a41086a290300370000200120032903103700002003200441016a22013602082000410c6a200136020020002003290300370204200041003602000b200341306a24000f0b20072004103b000be03f07077f037e017f017e027f027e077f230041c00d6b2209240002400240024002400240024002400240024002400240024002400240024002400240024002400240200241ffff03714102490d0002400240024002400240200341086a280200220a450d00200a41e4004f0d01200941b0046a41086a220b200341086a280200360200200920032902003703b004200941c80a6a41186a200141186a290000370300200941c80a6a41106a200141106a290000370300200941c80a6a41086a220c200141086a290000370300200920012900003703c80a20094190076a200941b0046a200941c80a6a1099034101210d2009280290074101460d0220094190076a41086a220d280200210e200928029407210f200c20094190076a410c6a280200360200200920023b01d40a2009200f3602cc0a200941ccb7c5003602c80a200941e0066a200941c80a6a10f702200941083a00e80a2009410b3a00e80a2009410c3a00e80a200920092f00e0063b01c80a200920092800e2063601ca0a200920092d00e6063a00ce0a200920092800e7063600cf0a200920092d00eb063a00d30a2009410d3a00e80a200920092d00ec063a00d40a2009410e3a00e80a200920092d00ed063a00d50a2009410f3a00e80a200920092d00ee063a00d60a200920092d00ef063a00d70a200941103a00e80a200941113a00e80a200920092d00f0063a00d80a200941123a00e80a200920092d00f1063a00d90a200941133a00e80a200920092d00f2063a00da0a200941143a00e80a200920092d00f3063a00db0a200941153a00e80a200920092d00f4063a00dc0a200941163a00e80a200920092d00f5063a00dd0a200941173a00e80a200920092d00f6063a00de0a200920092d00f7063a00df0a200941183a00e80a200941193a00e80a200920092d00f8063a00e00a2009411a3a00e80a200920092d00f9063a00e10a2009411b3a00e80a200920092d00fa063a00e20a2009411c3a00e80a200920092d00fb063a00e30a2009411d3a00e80a200920092d00fc063a00e40a2009411e3a00e80a200920092d00fd063a00e50a2009411f3a00e80a200920092d00fe063a00e60a200941203a00e80a200920092d00ff063a00e70a20094190076a41186a220c20092903e00a370300200d20092903d00a221037030020094190076a41106a20092903d80a2211370300200920092903c80a221237039007200941b0046a41106a220d2011370300200b2010370300200941b0046a41186a2213200c290300370300200920123703b004200941386a41186a2013290300370300200941386a41106a200d290300370300200941386a41086a200b290300370300200920092903b00437033820072d00004101470d03200941e00a6a200741196a290000370300200941d80a6a200741116a290000370300200941d00a6a200741096a290000370300200920072900013703c80a42002114410021154101210d410021160c040b20094190076a410410ec02200941d70a6a20094190076a41086a280200220236000020092009290390073700cf0a200041186a41003a000020004200370308200020092900c80a370019200041216a200941c80a6a41086a290000370000200041286a2002360000200042013703004101210d0c050b20094190076a410510ec02200941d70a6a20094190076a41086a280200220236000020092009290390073700cf0a200041186a41003a000020004200370308200020092900c80a370019200041216a200941c80a6a41086a290000370000200041286a2002360000200042013703004101210d0c040b200941d70a6a2009419c076a2802002201360000200042003703082000420137030041002102200041186a41003a000020092009290294073700cf0a200020092900c80a370019200041286a2001360000200041216a200c2900003700000c150b20072d0001210b200941c80a6a200741046a2802002215200741086a29020022174220882210a71096014100210d200b4100472116201042b8177e21140b200941d8006a41186a200941c80a6a41186a2903002210370300200941d8006a41106a200941c80a6a41106a220b2903002211370300200941d8006a41086a200941c80a6a41086a220c2903002212370300200920092903c80a2218370358200941e0066a41186a2010370300200941e0066a41106a2011370300200941e0066a41086a2012370300200920183703e00620094180026a200941386a200941e0066a109b03200941c80a6a2009280280022213200928028802109c03200941b0046a41086a2219200c290300370300200941b0046a41106a220c200b29030037030020094190076a41086a221a200941f00a6a29030037030020094190076a41106a221b200941f80a6a29030037030020094190076a41186a221c200941800b6a29030037030020094190076a41206a221d200941880b6a290300370300200920092903c80a3703b0042009200941c80a6a41206a2903003703900720092802e40a211e024020092802e00a220b450d00200941a0016a41106a200c290300370300200941a0016a41086a2019290300370300200941f8006a41086a201a290300370300200941f8006a41106a201b290300370300200941f8006a41186a201c290300370300200941f8006a41206a201d290300370300200920092903b0043703a00120092009290390073703780b0240200928028402450d00201310260b02400240200b0d004101210520044101460d04200941186a2002ad42ffff038342004280a0f8fa05420010cc06200941186a41086a290300200929031822104280f89ed79d1d7c2208201054ad7c211002402015450d002017a7210220160d022002450d00201510260b200941c80a6a20012008201010d902200920092900c90a370390072009200941c80a6a41086a2800003600970720092d00c80a22024104460d0520004200370308200020092903900737002120004201370300200041206a20023a0000200041186a41003a0000200041286a2009280097073600000c130b200941d4016a201e360200200941b8016a41206a2009290378370300200941b8016a41106a200941a0016a41106a290300370300200941b8016a41086a200941a0016a41086a290300370300200941b8016a41286a200941f8006a41086a290300370300200941e8016a200941f8006a41106a290300370300200941f0016a200941f8006a41186a290300370300200941f8016a200941f8006a41206a290300370300200920092903a0013703b8012009200b3602d00102400240024020044101470d0020092802c8012005470d02200941cc016a2802002006470d024101211b20092802d801221a41014b0d0141002104201a0e020a090a0b20094190076a410a10ec02200941d70a6a20094190076a41086a280200220236000020092009290390073700cf0a41002105200041186a41003a000020004200370308200020092900c80a370019200041216a200941c80a6a41086a290000370000200041286a200236000020004201370300201e41ffffff3f71450d0a200b10260c0a0b41002104201a210c0340200c410176221320046a22192004200b20194105746a2001412010d2064101481b2104200c20136b220c41014b0d000c080b0b20094190076a410b10ec02200941d70a6a20094190076a41086a280200220236000020092009290390073700cf0a41002105200041186a41003a000020004200370308200020092900c80a370019200041216a200941c80a6a41086a290000370000200041286a200236000020004201370300201e41ffffff3f71450d08200b10260c080b200941c80a6a41186a200141186a290000370300200941c80a6a41106a200141106a290000370300200941c80a6a41086a200141086a290000370300200920012900003703c80a200920174220883e02980720092002360294072009201536029007200941b0046a200941c80a6a200941d8006a20094190076a20082010109d03200920092900b104370380022009200941b0046a41086a2800003600870220092d00b00422024104470d104280c2d72f21110c040b4101210d20094190076a410110ec02200941d70a6a20094190076a41086a280200220236000020092009290390073700cf0a200041186a41003a000020004200370308200020092900c80a370019200041216a200941c80a6a41086a290000370000200041286a2002360000200042013703000b410121020c110b20094190076a410c10ec02200941d70a6a20094190076a41086a280200220236000020092009290390073700cf0a200041186a41003a000020004200370308200020092900c80a370019200041216a200941c80a6a41086a290000370000200041286a2002360000200042013703000c040b420021110b20094180026a41186a2204200941d8006a41186a29030037030020094180026a41106a2205200941d8006a41106a29030037030020094180026a41086a2206200941d8006a41086a2903003703002009200929035837038002200941b0046a41186a22024200370300200941b0046a41106a220c4200370300200941b0046a41086a4200370300200942003703b004200941b0046a41808cc700410610fb01200941c80a6a41ea93c400410610fb012002200941c80a6a41086a290000370300200c20092900c80a370300200941106a200941b0046a41201089022009280214210c20092802102113200941086a41da93c4004110108902200928020c21192009280208211520094190076a41186a221a200141186a221b29000037030020094190076a41106a221c200141106a221d29000037030020094190076a41086a2216200141086a221f2900003703002009200129000037039007412010242202450d0520022001290000370000200241186a201b290000370000200241106a201d290000370000200241086a201f290000370000200941dc0a6a2019410020151b360200200941f40a6a2016290300370200200941fc0a6a201c290300370200200941840b6a201a290300370200200920083703c80a20092009290390073702ec0a200920103703d00a2009200c410020131b3602d80a200941e40a6a428180808010370200200920023602e00a200941e0066a41186a2004290300370300200941e0066a41106a2005290300370300200941e0066a41086a200629030037030020092009290380023703e00620094190076a200941386a200941e0066a109b032009280290072204200928029807200941c80a6a109e030240200928029407450d00200410260b20021026200941ed0a6a2009290338370000200941f50a6a200941386a41086a290300370000200941fd0a6a200941386a41106a290300370000200941850b6a200941386a41186a290300370000200941d50a6a200141086a290000370000200941dd0a6a200141106a290000370000200941e50a6a200141186a290000370000200941003a00cc0a2009410f3a00c80a200920012900003700cd0a200941a50b6a200941d8006a41186a2903003700002009419d0b6a200941d8006a41106a290300370000200941950b6a200941d8006a41086a2903003700002009418d0b6a2009290358370000200941c80a6a108702200041186a41003a0000200041106a2014200aad4290a10f7e7c20117c42c09ae0e1007c37030020004201370308200042003703000c0c0b0240200b20044105746a2001412010d206220c0d004100211b0c010b2004200c411f766a21040b02400240201a41ffff0371200241ffff0371220249201b71220c201a6a41ffff037120024f0d0020094117360280020c010b024020150d0020094190076a200941d8006a109f03200941c80a6a200928029007221320092802980710a00302400240024020092802c80a2202450d0020092902cc0a21100240200928029407450d00201310260b200920104220883e0294072009200236029007200941c80a6a20094190076a10b60220092802c80a4117470d0120094117360280020c020b0240200928029407450d00201310260b20094117360280020c030b20094180026a200941c80a6a41b00210cf061a0b2010a7450d01200210260c010b200920174220883e0294072009201536029007200941c80a6a20094190076a10b602024020092802c80a4117470d0020094117360280020c010b20094180026a200941c80a6a41b00210cf061a0b024002402009280280024117470d00410021022015450d0620160d012017a7450d06201510260c060b200941b0046a20094180026a41b00210cf061a200941c80a6a200941b0046a10a103024020092903c80a2008560d00200941e0066a41186a200941d8006a41186a290300370300200941e0066a41106a200941d8006a41106a290300370300200941e0066a41086a200941d8006a41086a290300370300200920092903583703e006200941c80a6a200941386a200941e0066a109b0320092802c80a220720092802d00a10ff01024020092802cc0a450d00200710260b200941d8006a10a203200941286a200941dc016a20092903b801200941b8016a41086a29030010da0220094190076a200941b0046a41b00210cf061a200941c0096a41186a200941386a41186a290300370300200941c0096a41106a200941386a41106a290300370300200941c0096a41086a200941386a41086a290300370300200920092903383703c009411010242203450d05200341b889c70036020c200341013602082003428180808010370200411010242207450d05200741d089c70036020c20074101360208200742818080801037020020032003280200417f6a2202360200024020020d002003280208200328020c2802001103000240200328020c280204450d00200328020810260b20032003280204417f6a220236020420020d00200310260b02400240200728020820094190076a200728020c28020c110100450d00200941c80a6a20094190076a41b00210cf061a200941820d6a200941c8096a2903003701002009418a0d6a200941d0096a290300370100200941920d6a200941d8096a2903003701002009419a0d6a200941c0096a41206a2f01003b010020094180023b01f80c200920092903c0093701fa0c2009200736029c0d200941e0066a200941c80a6a200941f80c6a10a30320092903e0064201512107200941e0066a41206a2d0000210320092903e80621080c010b4102210320094180076a41023a0000200941f8066a41003a000020072007280200417f6a220236020042002108200942003703e806200942013703e006024020020d002007280208200728020c2802001103000240200728020c280204450d00200728020810260b20072007280204417f6a220236020420020d00200710260b20094190076a109803410121070b200941f80c6a41186a200141186a290000370300200941f80c6a41106a200141106a290000370300200941f80c6a41086a200141086a290000370300200920012900003703f80c20094190076a41186a200941386a41186a29030037030020094190076a41106a200941386a41106a29030037030020094190076a41086a200941386a41086a2903003703002009200929033837039007200941c80a6a41186a200941d8006a41186a290300370300200941c80a6a41106a200941d8006a41106a290300370300200941c80a6a41086a200941d8006a41086a290300370300200920092903583703c80a200920094188076a2800003600c70920092009290081073703c0090240024020070d00410421070c010b200920092800c7093600bf0a200920092903c0093703b80a4104210720084202510d00200920092800bf0a3600af0a200920092903b80a3703a80a200321070b200941c0096a41086a2203200941f80c6a41086a290300370300200941c0096a41106a2202200941f80c6a41106a290300370300200941c0096a41186a2201200941f80c6a41186a290300370300200941880a6a41086a220d20094190076a41086a290300370300200941880a6a41106a220420094190076a41106a290300370300200941880a6a41186a220b20094190076a41186a290300370300200941e8096a41186a220c200941c80a6a41186a290300370300200941e8096a41106a2213200941c80a6a41106a290300370300200941e8096a41086a2219200941c80a6a41086a290300370300200920092903f80c3703c00920092009290390073703880a200920092903c80a3703e809200920092800af0a3600bf0a200920092903a80a3703b80a200941d50a6a2003290300370000200941dd0a6a2002290300370000200941e50a6a20012903003700002009410f3a00c80a200920092903c0093700cd0a200941023a00cc0a200941ed0a6a20092903880a370000200941f50a6a200d290300370000200941fd0a6a2004290300370000200941850b6a200b290300370000200941a50b6a200c2903003700002009419d0b6a2013290300370000200941950b6a20192903003700002009418d0b6a20092903e809370000200941af0b6a20094190076a41026a2d00003a0000200941ad0b6a20092f0090073b0000200941b80b6a20073a0000200941b40b6a2006360200200941b00b6a2005360200200941c00b6a20092800bf0a360000200941b90b6a20092903b80a370000200941c80a6a1087020240024020092802e8060d00420021080c010b427f427f427f427f200941e0066a41106a290300220842c0f79c1a7c221020102008541b2208200aad4290a10f7e7c221020102008541b220820147c221020102008541b220842c097e8b2017c221020102008541b2110420121080b20002008370308200020092800c80a36001920004200370300200041186a41003a0000200041106a20103703002000411c6a200941cb0a6a280000360000024020092802d40141ffffff3f71450d0020092802d00110260b2015450d0a2017a70d040c0a0b20094190076a410d10ec02200941d70a6a20094190076a41086a280200220236000020092009290390073700cf0a41002105200041186a41003a000020004200370308200020092900c80a370019200041216a200941c80a6a41086a290000370000200041286a200236000020004201370300200941b0046a109803201e41ffffff3f71450d01200b10260c010b200941c80a6a41186a200141186a290000370300200941c80a6a41106a200141106a290000370300200941c80a6a41086a200141086a290000370300200920012900003703c80a20092017370294072009201536029007200941b0046a200941c80a6a200941d8006a20094190076a42004200109d03200920092900b1043703e0062009200941b0046a41086a2800003600e70620092d00b00422024104470d01410121020c040b2015450d0a2017a7450d0a201510260c0a0b20004200370308200020092903e00637002120004201370300200041206a20023a0000200041186a41003a0000200041286a20092800e7063600000c030b201510260c050b102c000b02400240024002400240200c0d002002450d02410121070c010b200941c80a6a41186a200141186a290000370300200941c80a6a41106a200141106a290000370300200941c80a6a41086a200141086a290000370300200920012900003703c80a201a2004490d050240201a201e470d00200941b8016a41186a201e410110930120092802d001210b0b200b20044105746a220741206a2007201a20046b41057410d0061a200741186a200941c80a6a41186a290300370000200741106a200941c80a6a41106a290300370000200741086a200941c80a6a41086a290300370000200720092903c80a3700002009201a41016a3602d801200941c80a6a200941b8016a41c80010cf061a200941e0066a41186a200941d8006a41186a290300370300200941e0066a41106a200941d8006a41106a290300370300200941e0066a41086a200941d8006a41086a290300370300200920092903583703e00620094190076a200941386a200941e0066a109b032009280290072207200928029807200941c80a6a109e030240200928029407450d00200710260b0240200941e40a6a28020041ffffff3f71450d0020092802e00a10260b200941ed0a6a2009290338370000200941d50a6a200141086a290000370000200941dd0a6a200141106a290000370000200941e50a6a200141186a290000370000200941f50a6a200941386a41086a290300370000200941fd0a6a200941386a41106a290300370000200941850b6a200941386a41186a290300370000200941013a00cc0a2009410f3a00c80a200920012900003700cd0a200941b00b6a2005360200200941b40b6a2006360200200941a50b6a200941d8006a41186a2903003700002009419d0b6a200941d8006a41106a290300370000200941950b6a200941d8006a41086a2903003700002009418d0b6a2009290358370000200941c80a6a108702410021070b2000420137030820004200370300200041186a41003a0000200041106a2014200aad4290a10f7e7c4280c2d72f420020021b7c42c09ae0e1007c3703002009280280024117470d012007450d060c020b20094190076a410210ec02200941d70a6a20094190076a41086a280200220236000020092009290390073700cf0a200041186a41003a000020004200370308200020092900c80a370019200041216a200941c80a6a41086a290000370000200041286a2002360000200042013703000c020b20094180026a1098032007450d040b20092802d40141ffffff3f71450d03200b10260c030b2009280280024117460d0120094180026a1098030c010b2004201a103b000b0240201e41ffffff3f71450d00200b10260b410021050c030b0240200e41ffffff3f71450d00200f10260b200941c00d6a24000f0b20004200370308200020092903800237002120004201370300200041206a20023a0000200041186a41003a0000200041286a2009280087023600000b410121050b0240200e41ffffff3f71450d00200f10260b02400240200b450d0020054101730d00201e41ffffff3f710d010b410021020c010b200b1026410021020b024020072d00000d00200d450d00200741086a280200450d00200741046a28020010260b02402002450d00200341046a28020041ffffff3f71450d00200328020010260b200941c00d6a24000ba50601057f230041f0006b22032400200341f88bc700410810fb01200341106a41d49fc200410910fb0102400240412010242204450d002003422037025420032004360250200341d0006a41004120106d20032802502204200328025822056a22062001290000370000200641086a200141086a290000370000200641106a200141106a290000370000200641186a200141186a2900003700002003200541206a2201360258200341c0006a2004200110a202200341ec006a200420016a360200200320043602682003200341c0006a41086a3602642003200341c0006a360260200341206a200341e0006a107302402003280254450d00200410260b412010242201450d002003422037024420032001360240200341c0006a41004120106d20032802402201200328024822066a22042002290000370000200441086a200241086a290000370000200441106a200241106a290000370000200441186a200241186a2900003700002003200641206a2202360248200341d0006a2001200210bc02200341ec006a200120026a360200200320013602682003200341d0006a41106a3602642003200341d0006a360260200341306a200341e0006a107302402003280244450d00200110260b20032802282202200328023822046a41206a2206417f4c0d010240024020060d0041012101410021060c010b200610242201450d010b20002001360200200041086a220141003602002000200636020420004100411010c9012000280200200128020022066a220520032900003700002001200641106a2206360200200541086a200341086a29000037000020002006411010c9012000280200200128020022066a220520032900103700002001200641106a2207360200200541086a200341106a41086a2900003700002003280220210620002007200210c9012000280200200128020022056a2006200210cf061a2001200520026a22053602002003280230210220002005200410c9012000280200200128020022006a2002200410cf061a2001200020046a36020002402003280234450d00200210260b02402003280224450d00200610260b200341f0006a24000f0b1033000b1034000bea0604067f027e017f057e230041d0016b220324002003200236020c20032001360208200341106a2001200210820202400240200328021022020d00200041003602180c010b200328021421042003200341186a2802002205360244200320023602400240024020054104490d00200228000021062003200241046a36024020032005417c6a220136024420014104490d002003200241086a360240200228000421072003200541786a220136024420014110490d002003200541686a22083602442003200241186a360240200241106a29000021092002290008210a41002101200341003a008801200541676a21050240034020082001460d01200341e8006a20016a200220016a220b41186a2d00003a00002003200b41196a3602402003200141016a220b3a008801200320053602442005417f6a2105200b2101200b4120470d000b200341b0016a41186a2201200341e8006a41186a290300370300200341b0016a41106a2205200341e8006a41106a290300370300200341b0016a41086a2208200341e8006a41086a290300370300200320032903683703b001200b41ff01714120490d01200341c8006a41086a2008290300370300200341c8006a41106a2005290300370300200341c8006a41186a2001290300370300200320032903b001370348200341e8006a200341c0006a10920120032802682201450d01200341206a41086a200341c8006a41086a290300220c370300200341206a41106a200341c8006a41106a290300220d370300200341206a41186a200341c8006a41186a290300220e37030020032003290348220f370320200329026c2110200020093703082000200a3703002000201037021c200020013602182000200736021420002006360210200041246a200f3702002000412c6a200c370200200041346a200d3702002000413c6a200e3702000c020b200141ff0171450d00200341003a0088010b200341003602b801200342013703b0012003410e360294012003200341086a360290012003200341b0016a360248200341fc006a41013602002003420137026c2003418c8dc600360268200320034190016a360278200341c8006a41c4e1c000200341e8006a10351a20032802b00120032802b801108402024020032802b401450d0020032802b00110260b200041003602180b2004450d00200210260b200341d0016a24000bc90903037f027e037f23004180016b22062400200641206a2002109f03200641186a20062802202207200628022841d4c0c700410041001081022006280218210802402006280224450d00200710260b024002400240024002400240024020084101460d00200641086a200341086a2802002208411f6a410576ad42004280a0f8fa05420010cc06200641206a2001200420062903087c22094280f89ed79d1d7c220a2005200641086a41086a2903007c2009200454ad7c200a200954ad7c220410d902200620062900213703502006200641206a41086a220728000036005720062d0020220b4104470d022007200141086a290000370300200641206a41106a200141106a290000370300200641206a41186a200141186a290000370300200620012900003703202003280204210c20032802002101200641c0006a41f88bc700410810fb01200641d0006a41aca0c200410510fb014120102422030d010c060b2000410e10ec020c030b200642203702742006200336027041002107200641f0006a41004120106d2006280270220b2006280278220d6a22032002290000370000200341086a200241086a290000370000200341106a200241106a290000370000200341186a200241186a2900003700002006200d41206a22033602782003417f4c0d010240024020030d00410121020c010b200310242202450d05200321070b200641003602682006200236026020062007360264200641e0006a41002003106d20062802602207200628026822026a200b200310cf061a2006200220036a220336026802402006280274450d00200b10260b200341206a2202417f4c0d010240024020020d004101210b410021020c010b20021024220b450d050b200641003602782006200b36027020062002360274200641f0006a4100411010c9012006280270200628027822026a220b2006290040370000200b41086a200641c0006a41086a2900003700002006200241106a2202360278200641f0006a2002411010c9012006280270200628027822026a220b2006290050370000200b41086a200641d0006a41086a2900003700002006200241106a2202360278200641f0006a2002200310c901200628027022022006280278220b6a2007200310cf061a2006200b20036a220b36027802402006280264450d00200710260b200841146a2203417f4c0d010240024020030d0041012107410021030c010b200310242207450d050b20064100360258200620073602502006200336025420012008200641d0006a109501200641d0006a20062802584120106d2006280250200628025822086a22032006290320370000200341086a200641206a41086a290300370000200341106a200641206a41106a290300370000200341186a200641206a41186a2903003700002006200841206a2203360258200641d0006a20034110106d20062802502203200628025822086a220720043700082007200a3700002006200841106a22083602582002200b2003200810b30102402006280254450d00200310260b02402006280274450d00200210260b0240200c450d00200110260b200041043a00000c030b2000200b3a000020002006290350370001200041086a20062800573600000c010b1034000b200341046a280200450d00200328020010260b20064180016a24000f0b1033000be40303037f027e027f230041106b22032400200341003602082003420137030020022802102104200341004104106d2003280200200328020822056a20043600002003200541046a2204360208200241146a2802002105200320044104106d2003280200200328020822046a20053600002003200441046a2204360208200241086a290300210620022903002107200320044110106d2003280200200328020822046a22052006370008200520073700002003200441106a2204360208200320044120106d2003280200200328020822056a22042002290024370000200441086a2002412c6a290000370000200441106a200241346a290000370000200441186a2002413c6a2900003700002003200541206a360208200228021821042003200241206a280200220210a1010240024020020d0020032802002108200328020821020c010b20024105742105200328020821020340200320024120106d20032802002208200328020822096a22022004290000370000200241086a200441086a290000370000200241106a200441106a290000370000200241186a200441186a2900003700002003200941206a2202360208200441206a2104200541606a22050d000b0b200020012008200210b30102402003280204450d00200810260b200341106a24000ba40401057f230041c0006b22022400200241f88bc700410810fb01200241106a41aca0c200410510fb0102400240412010242203450d00200242203702342002200336023041002104200241306a41004120106d20022802302205200228023822066a22032001290000370000200341086a200141086a290000370000200341106a200141106a290000370000200341186a200141186a2900003700002002200641206a22013602382001417f4c0d010240024020010d00410121030c010b200110242203450d01200121040b200241003602282002200336022020022004360224200241206a41002001106d20022802202206200228022822036a2005200110cf061a2002200320016a220336022802402002280234450d00200510260b200341206a2204417f4c0d010240024020040d0041012101410021040c010b200410242201450d010b20002001360200200041086a220141003602002000200436020420004100411010c9012000280200200128020022046a220520022900003700002001200441106a2204360200200541086a200241086a29000037000020002004411010c9012000280200200128020022046a220520022900103700002001200441106a2204360200200541086a200241106a41086a29000037000020002004200310c9012000280200200128020022006a2006200310cf061a2001200020036a36020002402002280224450d00200610260b200241c0006a24000f0b1033000b1034000bd40704087f017e027f057e230041d0016b220324002003200236020c20032001360208200341106a2001200210820202400240200328021022020d00200041003602000c010b200328021421042003200341186a280200360244200320023602402003200341c0006a108f010240024002400240024020032802000d002003280244220520032802042201490d002001417f4c0d010240024020010d0041002106410121070c010b2001102a2207450d0320032802442105200121060b02400240024020052001490d0020072003280240200110cf0621082003280244220520014f0d012001200541b8afc0001048000b20060d010c020b2003200520016b22093602442003200328024020016a220a3602402008450d012001ad4220862006ad84210b41002101200341003a008801417f210502400240034020092001460d01200341e8006a20016a200a20016a220c2d00003a00002003200920056a3602442003200c41016a3602402003200141016a220c3a0088012005417f6a2105200c2101200c4120470d000b200341b0016a41186a2201200341e8006a41186a290300370300200341b0016a41106a2205200341e8006a41106a290300370300200341b0016a41086a220d200341e8006a41086a290300370300200320032903683703b001200c41ff01714120490d01200341c8006a41086a200d290300370300200341c8006a41106a2005290300370300200341c8006a41186a2001290300370300200320032903b0013703482009200c6b2201410f4b0d0620060d020c030b200141ff0171450d00200341003a0088010b2006450d010b200710260b200341003602b801200342013703b0012003410e360294012003200341086a360290012003200341b0016a360248200341fc006a41013602002003420137026c2003418c8dc600360268200320034190016a360278200341c8006a41c4e1c000200341e8006a10351a20032802b00120032802b801108402024020032802b401450d0020032802b00110260b200041003602000c030b1034000b1033000b200341206a41086a200341c8006a41086a290300220e370300200341206a41106a200341c8006a41106a290300220f370300200341206a41186a200341c8006a41186a29030022103703002003200329034822113703202003200141706a3602442003200a200c6a220141106a36024020012900002112200041386a200141086a290000370300200041306a20123703002000200b370204200020083602002000410c6a2011370200200041146a200e3702002000411c6a200f370200200041246a20103702000b2004450d00200210260b200341d0016a24000b8e2203027f027e027f230041306b220224000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012802000e170102030405060b0708090a0b0c0d0e0f10111213141500010b02400240024002400240200141086a2d00000e050001020304000b2002412c6a41013602002002420137021c200241dcedc6003602182002410436020c200241d4edc6003602082002200241086a360228200241186a41ecc0c700103d000b200141186a280200210320024100360220200242013703182003200241186a109904200235022021040240200228021c450d00200228021810260b200241086a2001280218220110a10320022903082105200241186a200110a10320022d00202101200041003a0009200020013a00082000427f2005200442d00f7e4280999b107c22047c220520052004541b3703000c180b200041003b01082000427f427f427f427f200141306a290300220442c0f79c1a7c220520052004541b2204200141146a3502004290a10f7e7c220520052004541b22042001412c6a35020042b8177e7c220520052004541b220442c097e8b2017c220520052004541b3703000c170b200041003b01082000427f427f427f200141c8006a290300220442c0f79c1a7c220520052004541b2204200141346a3502004290a10f7e7c220520052004541b220442c097e8b2017c220520052004541b3703000c160b200041003b01082000200141346a35020042a08d067e42c0b9fdc3017c3703000c150b02400240024002400240024002400240024002400240200141086a2802000e0b000102030405060708090a000b2002412c6a41013602002002420137021c200241dcedc6003602182002410436020c200241d4edc6003602082002200241086a360228200241186a41ecc0c700103d000b200041003b010820002001410c6a35020042d00f7e3703000c1d0b200041003b0108200042e0dc2a3703000c1c0b200041013b0108200042e088b3303703000c1b0b200041013b010820004280c0a8ca9a3a3703000c1a0b200041013b010820004280c0a8ca9a3a3703000c190b200041013b010820004280b191e4003703000c180b200041013b01082000200141146a35020042c091fc2f7e3703000c170b200041013b01082000200141146a3502004280f7ef2f7e3703000c160b200041013b01082000200141186a35020042d0b28b307e42d0b28b307c3703000c150b200041013b010820004280ade2043703000c140b024002400240200141086a2802000e03000102000b2002412c6a41013602002002420137021c200241dcedc6003602182002410436020c200241d4edc6003602082002200241086a360228200241186a41ecc0c700103d000b200041003b010820004280c5dbeb9d023703000c140b200041003b010820004280c5dbeb9d023703000c130b200041023b010820004280c7abcb003703000c120b02400240024002400240024020012d00040e06000102030405000b2002412c6a41013602002002420137021c200241dcedc6003602182002410436020c200241d4edc6003602082002200241086a360228200241186a41ecc0c700103d000b200041003b0108200042c0b9f4c9003703000c150b200041003b0108200042c082f387013703000c140b200041003b010820004280a3c3c7003703000c130b200041003b0108200042c0d59083013703000c120b200041003b0108200042c0b9f4c9003703000c110b02400240024002400240200141086a2d00000e050001020304000b2002412c6a41013602002002420137021c200241dcedc6003602182002410436020c200241d4edc6003602082002200241086a360228200241186a41ecc0c700103d000b200041003b01082000428094ebdc033703000c130b200041003b01082000428094ebdc033703000c120b200041003b01082000428094ebdc033703000c110b200041003b01082000428094ebdc033703000c100b200041023b0108200042003703000c0f0b200041003b0108200042c0a3f5d00342808995ef0220012802041b3703000c0e0b200041023b0108200042003703000c0d0b0240024002400240200141086a2802000e0400010203000b2002412c6a41013602002002420137021c200241dcedc6003602182002410436020c200241d4edc6003602082002200241086a360228200241186a41ecc0c700103d000b200041003b010820002001411c6a280200220141e400200141e400491b4198d70a6cad42c0c6cbccb0027c3703000c0e0b200041003b010820002001411c6a280200220141e400200141e400491b4198d70a6cad42c0c6cbccb0027c3703000c0d0b200041003b0108200042c0cf8e313703000c0c0b200041003b01082000200141286a35020042b0e32d7e2001411c6a35020042809fc9007e7c4280f797f3017c3703000c0b0b10dd05000b02400240024002400240200141086a2d00000e050001020304000b2002412c6a41013602002002420137021c200241dcedc6003602182002410436020c200241d4edc6003602082002200241086a360228200241186a41ecc0c700103d000b200041023b01082000428094ebdc033703000c0c0b200041003b0108200042003703000c0b0b200041003b0108200042a08d063703000c0a0b200041003b0108200042a08d063703000c090b200041023b0108200042003703000c080b0240024002400240024002400240024020012d00040e080001020304050607000b2002412c6a41013602002002420137021c200241dcedc6003602182002410436020c200241d4edc6003602082002200241086a360228200241186a41ecc0c700103d000b200041013b010820004280e497d0123703000c0d0b200041013b010820004280ade2043703000c0c0b200041003b0108200042003703000c0b0b200041003b0108200042003703000c0a0b200041003b0108200042003703000c090b200041003b0108200042003703000c080b200041003b0108200042003703000c070b02400240024020012f01040e03000102000b2002412c6a41013602002002420137021c200241dcedc6003602182002410436020c200241d4edc6003602082002200241086a360228200241186a41ecc0c700103d000b200141086a280200210342c0c3930721040240200141106a280200220641b0026c2207450d00200321010340200241186a200110a103427f427f200420022903187c220520052004541b220442c0843d7c220520052004541b2104200141b0026a2101200741d07d6a22070d000b0b200641b0026c210141012107024003402001450d01200141d07d6a2101200241186a200310a103200341b0026a210320022d00204101460d000b410021070b200041003a0009200020073a0008200020043703000c070b200241086a200141086a280200220110a10320022903082104200241186a200110a10320022d00202101200041003a0009200020013a00082000427f200442c08db7017c220520052004541b3703000c060b0240024002400240024002400240024002400240024002400240024002400240200141086a2d00000e10000102030405060708090a0b0c0d0e0f000b2002412c6a41013602002002420137021c200241dcedc6003602182002410436020c200241d4edc6003602082002200241086a360228200241186a41ecc0c700103d000b200041003b0108200042808999ca003703000c130b200041003b01082000428082c69d013703000c120b200041003b01082000200141146a35020022044280c2d72f7e200442a0eae1017e7c42c0f6dff0267c3703000c110b200041003b010820004280a3b4d4273703000c100b200041003b01082000428088debe013703000c0f0b200041003b010820004280838aa3013703000c0e0b200041003b0108200042c0f1a3c2003703000c0d0b200041003b0108200042e09df3c2003703000c0c0b200041003b0108200042e0fea9c2003703000c0b0b200041003b0108200042c0f3ffae013703000c0a0b200041003b010820004280d9afa3283703000c090b200041003b010820004280c9a681023703000c080b200041003b010820004280aaead5003703000c070b200041003b0108200042c0a190ea013703000c060b200041003b0108200042c0d891ac013703000c050b024002400240024002400240024002400240024020012d00040e0a00010203040506070809000b2002412c6a41013602002002420137021c200241dcedc6003602182002410436020c200241d4edc6003602082002200241086a360228200241186a41ecc0c700103d000b200241086a200141286a280200220110a10320022903082104200241186a200110a10320022d00202101200041003a0009200020013a0008200020044290ce007c3703000c0c0b200041003b0108200042003703000c0b0b200041003b010820004280c2d72f3703000c0a0b200041003b010820004280c2d72f3703000c090b200041003b010820004280c2d72f3703000c080b200041003b010820004280c2d72f3703000c070b200041003b01082000428087a70e3703000c060b200041003b01082000428087a70e3703000c050b200041003b0108200042003703000c040b02400240024002400240200141086a2d00000e050001020304000b2002412c6a41013602002002420137021c200241dcedc6003602182002410436020c200241d4edc6003602082002200241086a360228200241186a41ecc0c700103d000b200041003b010820004280c6868f013703000c060b200041003b0108200042c0f8d3ca013703000c050b200041003b0108200042c0d9bfe2013703000c040b200041003b0108200042808c8d9e023703000c030b024002400240024002400240024020012d00040e0700010203040506000b2002412c6a41013602002002420137021c200241dcedc6003602182002410436020c200241d4edc6003602082002200241086a360228200241186a41ecc0c700103d000b200041003b010820004280a3c3c7003703000c070b200041003b0108200042c0b6fc9a013703000c060b200041003b0108200042c082f387013703000c050b200041003b010820004280a7f2a6013703000c040b200041003b010820004280a3c3c7003703000c030b200041003b0108200042c082f387013703000c020b02400240024002400240200141086a2d00000e050001020304000b2002412c6a41013602002002420137021c200241dcedc6003602182002410436020c200241d4edc6003602082002200241086a360228200241186a41ecc0c700103d000b200241086a2001410c6a280200220110a10320022903082104200241186a200110a10320022d00202101200041003a0009200020013a0008200020044290ce007c3703000c040b200141106a2903002104200241186a2001410c6a28020010a10320022d00202101200041003a0009200020013a0008200020043703000c030b200041003b0108200042003703000c020b200241086a2001412c6a280200220110a10320022903082104200241186a200110a10320022d00202101200041003a0009200020013a0008200020044290ce007c3703000c010b024002400240024002400240024020012d00040e0700010203040506000b2002412c6a41013602002002420137021c200241dcedc6003602182002410436020c200241d4edc6003602082002200241086a360228200241186a41ecc0c700103d000b200241186a200141286a28020010a1032002290318210420022d00202101200041003a0009200020013a00082000427f200442c082cc177c220520052004541b3703000c050b200041003b0108200042c0d39ec7003703000c040b200041003b0108200042c0b1dcc4003703000c030b200041003b0108200042c0e5a1c4003703000c020b200041003b0108200042c0e4b0cd003703000c010b200041003b010820004280aef2c4003703000b200241306a24000baa0303067f027e017f230041b0016b22012400200141386a2000109f03200141c8006a200128023822022001280240220310a003024020012802482200450d002002200310ff010b20014188016a41086a2203200141c8006a41106a29030037030020014188016a41106a2204200141c8006a41186a29030037030020014188016a41186a2205200141c8006a41206a29030037030020014188016a41206a2206200141f0006a2802003602002001200141c8006a41086a290300370388010240024020000d00200128023c450d01200210260c010b20014180016a2903002107200141f8006a2903002108200128024c2109200141106a41206a2006280200360200200141106a41186a2005290300370300200141106a41106a2004290300370300200141106a41086a200329030037030020012001290388013703100240200128023c450d00200210260b200141e0006a2001412c6a290200370300200141d8006a200141246a290200370300200141d0006a2001411c6a290200370300200120012902143703482001200141c8006a2008200710da022009450d00200010260b200141b0016a24000bb681040c027f047e027f017e047f017e087f047e027f077e0d7f1d7e230022032104200341a0126b416071220324000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012802000e170203040506070108090a0b010c0d0e0f10111213141500020b200141286a3100002105200141206a2902002106200141c8006a2903002107200141c0006a29030021082001413c6a2802002109200141386a280200210a200141306a290300210b2001412c6a280200210c2001412a6a2f0100210d2001411c6a280200210e200141186a280200210f200141106a29020021102001410c6a28020021112001410a6a2f01002112200141086a2d0000211320012d0029211420012d00092115200341b0036a41206a2201200241206a290200370300200341b0036a41186a2216200241186a290200370300200341b0036a41106a2217200241106a290200370300200341b0036a41086a2218200241086a290200370300200320022902003703b0030240024002400240024020130e050001020304000b200341f4046a4101360200200342013702e404200341dcedc6003602e004200341043602dc09200341d4edc6003602d8092003200341d8096a3602f004200341e0046a41ecc0c700103d000b200341e0046a41206a2001290300370300200341e0046a41186a2016290300370300200341e0046a41106a2017290300370300200341e0046a41086a2018290300370300200320032903b0033703e004200341e00e6a200341e0046a10d60220034180086a41086a200341e90e6a29000037030020034180086a41106a200341f10e6a29000037030020034180086a41186a200341f90e6a290000370300200320032900e10e3703800802400240024020032d00e00e4101460d000240024002402010428080808010540d002010422088a741e4004f0d012003419f086a3100002106200329009708210b2003280093082101200328008f0821022003290087082105200328008308211320032f008108211620032d0080082117200320103702b40c200320113602b00c200341e0046a411f6a20063c00002003200b3700f704200320013600f304200320023600ef04200320053700e704200320133600e304200320163b00e104200320173a00e004200341e00e6a200341b00c6a200341e0046a10990320032802e00e4101470d02200320032900e50e3703e0072003200341ec0e6a2800003600e70720032d00e40e2101200f109803200f1026420021064200210b0c8a010b200341e0046a410410ec02200320032900e1043703e0072003200341e8046a2800003600e7070c87010b200341e0046a410510ec02200320032900e1043703e0072003200341e8046a2800003600e7070c86010b200341e00e6a41086a2201280200211620032802e40e2113200341e0046a41086a200341e00e6a410c6a280200360200200341013b01ec04200320133602e404200341ccb7c5003602e004200341a0086a200341e0046a10f702200341083a0080052003410b3a0080052003410c3a008005200320032f01a0083b01e004200320032801a2083601e204200320032d00a6083a00e604200320032800a7083600e704200320032d00ab083a00eb042003410d3a008005200320032d00ac083a00ec042003410e3a008005200320032d00ad083a00ed042003410f3a008005200320032d00ae083a00ee04200320032d00af083a00ef04200341103a008005200341113a008005200320032d00b0083a00f004200341123a008005200320032d00b1083a00f104200341133a008005200320032d00b2083a00f204200341143a008005200320032d00b3083a00f304200341153a008005200320032d00b4083a00f404200341163a008005200320032d00b5083a00f504200341173a008005200320032d00b6083a00f604200320032d00b7083a00f704200341183a008005200341193a008005200320032d00b8083a00f8042003411a3a008005200320032d00b9083a00f9042003411b3a008005200320032d00ba083a00fa042003411c3a008005200320032d00bb083a00fb042003411d3a008005200320032d00bc083a00fc042003411e3a008005200320032d00bd083a00fd042003411f3a008005200320032d00be083a00fe04200341203a008005200320032d00bf083a00ff04200341e00e6a41186a220220032903f804370300200120032903e8042210370300200341e00e6a41106a20032903f0042206370300200320032903e004220b3703e00e200341c0046a41106a22012006370300200341c0046a41086a22172010370300200341c0046a41186a221820022903003703002003200b3703c004200341d8096a41186a22022018290300370300200341d8096a41106a22182001290300370300200341d8096a41086a22012017290300370300200320032903c0043703d809200341003602e804200342013703e004200f200341e0046a10990420032802e8042111024020032802e404450d0020032802e00410260b200341e00e6a200f41b00210cf061a200341d8116a41186a2002290300370300200341d8116a41106a2018290300370300200341d8116a41086a2001290300370300200320032903d8093703d811411010242201450d1b200141b889c70036020c200141013602082001428180808010370200411010242202450d1b200241d089c70036020c20024101360208200242818080801037020020012001280200417f6a2217360200024020170d002001280208200128020c2802001103000240200128020c280204450d00200128020810260b20012001280204417f6a221736020420170d00200110260b024002402002280208200341e00e6a200228020c28020c110100450d00200341e0046a200341e00e6a41b00210cf061a2003418a0a6a200341e0116a290300370100200341920a6a200341e8116a2903003701002003419a0a6a200341f0116a290300370100200341a20a6a200341d8116a41206a2f01003b010020034180023b01800a200320032903d8113701820a200320023602a40a200341b00c6a200341e0046a200341800a6a10a30320032903b00c4201512117200341b00c6a41206a2d0000210120032903b80c21060c010b41022101200341d00c6a41023a0000200341c80c6a41003a000020022002280200417f6a221736020042002106200342003703b80c200342013703b00c024020170d002002280208200228020c2802001103000240200228020c280204450d00200228020810260b20022002280204417f6a221736020420170d00200210260b200341e00e6a109803410121170b200320032900d10c3703e0042003200341d80c6a2800003600e704200341c00c6a290300211020032802dc0c21022017450d01200341c80c6a290300210b200320032800e7043600870a200320032903e0043703800a200320032800870a3600e704200320032903800a3703e0040240024020064201510d00200320032800e7043600e70e200320032903e0043703e00e0c010b200320032800e7043600e70e200320032903e0043703e00e427f2011ad42d00f7e4280999b107c220620107c221020102006541b21104200210b420121060b200320032903e00e3703e007200320032800e70e3600e707410121170c020b200f109803200f1026410221010c85010b427f2011ad42d00f7e4280999b107c220b20107c22102010200b541b2110410021172006a7410047ad21064200210b0b0240201641ffffff3f71450d00201310260b200f102620170d840120002006370308200041186a200b370300200041106a201037030020004200370300200424000f0b200320053c00dc092003200d3b01de09200320143a00dd092003200642208822053e02d809200341e00e6a41206a2001290300370300200341e00e6a41186a2016290300370300200341e00e6a41106a2017290300370300200341e00e6a41086a2018290300370300200320032903b0033703e00e200341800a6a200341e00e6a10d602200341a0086a41086a200341890a6a290000370300200341a0086a41106a200341910a6a290000370300200341a0086a41186a200341990a6a290000370300200320032900810a3703a0082005a7210102400240024020032d00800a4101470d0020034180056a41023a0000200341f8046a41003a0000200342003703e804200342013703e004024020032802dc09450d00200110260b0240201042ffffff3f83500d00201110260b200341e8046a21010c010b20034180086a41186a200341a0086a41186a290300220537030020034180086a41106a200341a0086a41106a290300220737030020034180086a41086a200341a0086a41086a2903002208370300200320032903a008221937038008200341800a6a41186a2005370300200341800a6a41106a2007370300200341800a6a41086a2008370300200320193703800a200320103702dc11200320113602d811200341ec0e6a200c360200200341e00e6a41086a20032802dc09360200200320013602e40e200320153a00e10e200341003a00e00e200341e0046a200341800a6a2012200341d8116a200f200e2006a7200341e00e6a200b109a03200341e0046a41086a210120032903e0044201520d010b200341b00c6a41206a200141206a2903002210370300200341b00c6a41186a200141186a2903002206370300200341b00c6a41106a200141106a290300220b370300200341b00c6a41086a200141086a29030022053703002003200129030022073703b00c200041286a2010370300200041206a2006370300200041186a200b370300200041106a20053703002000200737030820004201370300200424000f0b200341b00c6a41106a200141106a2903002210370300200341b00c6a41086a200141086a290300220637030020032001290300220b3703b00c200041186a2010370300200041106a20063703002000200b37030820004200370300200424000f0b200341e00e6a41206a2001290300370300200341e00e6a41186a2016290300370300200341e00e6a41106a2017290300370300200341e00e6a41086a2018290300370300200320032903b0033703e00e200341800a6a200341e00e6a10d602200341a0086a41086a200341890a6a290000370300200341a0086a41106a200341910a6a290000370300200341a0086a41186a200341990a6a290000370300200320032900810a3703a00802400240024020032d00800a4101470d0020034180056a41023a0000200341f8046a41003a0000200342003703e804200342013703e0040240200b42ffffff3f83500d00200c10260b200341e8046a21010c010b20034180086a41186a200341a0086a41186a290300221937030020034180086a41106a200341a0086a41106a290300221a37030020034180086a41086a200341a0086a41086a290300221b370300200320032903a008221c37038008200341800a6a41186a2019370300200341800a6a41106a201a370300200341800a6a41086a201b3703002003201c3703800a2003200b3702dc112003200c3602d811200341800f6a20053c0000200341e00e6a41186a2006370300200341f40e6a200e360200200341e00e6a41106a200f360200200341e00e6a41086a2010370300200320113602e40e200320123b01e20e200320153a00e10e200341013a00e00e200341e0046a200341800a6a200d200341d8116a200a20092008a7200341e00e6a2007109a03200341e0046a41086a210120032903e0044201520d010b200341b00c6a41206a200141206a2903002210370300200341b00c6a41186a200141186a2903002206370300200341b00c6a41106a200141106a290300220b370300200341b00c6a41086a200141086a29030022053703002003200129030022073703b00c200041286a2010370300200041206a2006370300200041186a200b370300200041106a20053703002000200737030820004201370300200424000f0b200341b00c6a41106a200141106a2903002210370300200341b00c6a41086a200141086a290300220637030020032001290300220b3703b00c200041186a2010370300200041106a20063703002000200b37030820004200370300200424000f0b200341ff076a20053c0000200320063700f7072003200e3600f3072003200f3600ef07200320103700e707200320113600e307200320123b00e107200320153a00e007200341e0046a41206a2001290300370300200341e0046a41186a2016290300370300200341e0046a41106a2017290300370300200341e0046a41086a2018290300370300200320032903b0033703e004200341e00e6a200341e0046a10d60220034180086a41086a200341e90e6a29000037030020034180086a41106a200341f10e6a29000037030020034180086a41186a200341f90e6a290000370300200320032900e10e370380080240024020032d00e00e4101460d00200341d8096a41186a20034180086a41186a290300370300200341d8096a41106a20034180086a41106a290300370300200341d8096a41086a20034180086a41086a29030037030020032003290380083703d8090240024002400240200d41ffff03714102490d00200b428080808010540d01200b422088a741e4004f0d022003200b3702b40c2003200c3602b00c200341e0046a41186a200341d8096a41186a290300370300200341e0046a41106a2202200341d8096a41106a290300370300200341e0046a41086a2201200341d8096a41086a290300370300200320032903d8093703e004200341e00e6a200341b00c6a200341e0046a10990320032802e00e4101470d0320034188096a41086a200341ec0e6a280200360200200320032902e40e370388090c83010b20034188096a410110ec020c040b20034188096a410410ec020c030b20034188096a410510ec020c020b200341e00e6a41086a2213280200211620032802e40e210f2001200341e00e6a410c6a2802003602002003200d3b01ec042003200f3602e404200341ccb7c5003602e004200341a0086a200341e0046a10f702200341083a0080052003410b3a0080052003410c3a008005200320032f01a0083b01e004200320032801a2083601e204200320032d00a6083a00e604200320032800a7083600e704200320032d00ab083a00eb042003410d3a008005200320032d00ac083a00ec042003410e3a008005200320032d00ad083a00ed042003410f3a008005200320032d00ae083a00ee04200320032d00af083a00ef04200341103a008005200341113a008005200320032d00b0083a00f004200341123a008005200320032d00b1083a00f104200341133a008005200320032d00b2083a00f204200341143a008005200320032d00b3083a00f304200341153a008005200320032d00b4083a00f404200341163a008005200320032d00b5083a00f504200341173a008005200320032d00b6083a00f604200320032d00b7083a00f704200341183a008005200341193a008005200320032d00b8083a00f8042003411a3a008005200320032d00b9083a00f9042003411b3a008005200320032d00ba083a00fa042003411c3a008005200320032d00bb083a00fb042003411d3a008005200320032d00bc083a00fc042003411e3a008005200320032d00bd083a00fd042003411f3a008005200320032d00be083a00fe04200320032d00bf083a00ff04200341203a008005200341e00e6a41186a221720032903f804370300201320032903e8042210370300200341e00e6a41106a20032903f0042206370300200320032903e004220b3703e00e200341c0046a41106a22132006370300200341c0046a41086a22182010370300200341c0046a41186a221120172903003703002003200b3703c004200341d8116a41186a2011290300370300200341d8116a41106a2013290300370300200341d8116a41086a2018290300370300200320032903c0043703d8112003200341e0076a41186a2900003703b8082003200341e0076a41106a2900003703b0082003200341e0076a41086a2900003703a808200320032900e0073703a008200341a8096a200341d8116a200341a0086a109b03200341e0046a20032802a809221320032802b009109c03200341a0086a41086a2001290300370300200341a0086a41106a2002290300370300200341b00c6a41086a20034184056a290200370300200341b00c6a41106a2003418c056a290200370300200341b00c6a41186a20034194056a290200370300200341b00c6a41206a22022003419c056a290200370300200341b00c6a41286a2217200341a4056a280200360200200320032903e0043703a008200320032902fc043703b00c024002400240024020032802f8042201450d0020034198046a41106a2218200341a0086a41106a29030037030020034198046a41086a2211200341a0086a41086a290300370300200341800a6a41086a220d200341b00c6a41086a290300370300200341800a6a41106a220e200341b00c6a41106a290300370300200341800a6a41186a2212200341b00c6a41186a290300370300200341800a6a41206a2002290300370300200341800a6a41286a2017280200360200200320032903a00837039804200320032903b00c3703800a024020032802ac09450d00201310260b20034180086a41166a2018290300221037010020034180086a410e6a2011290300370100200341c0046a41166a22022010370100200341c0046a41106a20034180086a41106a290100370300200320032903980437018608200341c0046a41086a20034180086a41086a29010037030020032003290180083703c004200341e00e6a41106a22132002290100370300200341e00e6a41086a200341c0046a410e6a290100370300200320032901c6043703e00e200320013602f80e200341a40f6a200341a80a6a2802003602002003419c0f6a200341a00a6a290300370200200341940f6a20122903003702002003418c0f6a200e290300370200200341840f6a200d290300370200200341fc0e6a20032903800a3702002013280200200a470d01200341f40e6a2802002009470d01200341840f6a2202200341d8096a412010d2060d03200341a0036a200220032903e00e200341e00e6a41086a29030010da0220034180086a41f88bc700410810fb01200341a8096a41d49fc200410910fb014120102422020d020c84010b024020032802ac09450d00201310260b20034188096a410810ec020c81010b20034188096a410b10ec020c7f0b200342203702b40c200320023602b00c200341b00c6a41004120106d20032802b00c220220032802b80c22176a221320032903d811370000201341086a200341d8116a41086a290300370000201341106a200341d8116a41106a290300370000201341186a200341d8116a41186a2903003700002003201741206a22133602b80c200341800a6a2002201310a202200341ec046a200220136a360200200320023602e8042003200341800a6a41086a3602e4042003200341800a6a3602e004200341c0046a200341e0046a1073024020032802b40c450d00200210260b412010242202450d8101200342203702840a200320023602800a200341800a6a41004120106d20032802800a220220032802880a22176a221320032900e007370000201341086a200341e0076a41086a290000370000201341106a200341e0076a41106a290000370000201341186a200341e0076a41186a2900003700002003201741206a22133602880a200341b00c6a2002201310bc02200341ec046a200220136a360200200320023602e8042003200341b00c6a41106a3602e4042003200341b00c6a3602e004200341a0086a200341e0046a1073024020032802840a450d00200210260b20032802c804220220032802a80822136a41206a2217417f4c0d190240024020170d0041012118410021170c010b201710242218450d82010b200341003602e804200320183602e004200320173602e404200341e0046a4100411010c90120032802e00420032802e80422176a2218200329008008370000201841086a20034180086a41086a2900003700002003201741106a22173602e804200341e0046a2017411010c90120032802e00420032802e80422176a221820032903a809370000201841086a200341a8096a41086a2903003700002003201741106a22183602e80420032802c0042117200341e0046a2018200210c90120032802e00420032802e80422186a2017200210cf061a2003201820026a22183602e80420032802a0082102200341e0046a2018201310c90120032802e004221820032802e80422116a2002201310cf061a2003201120136a22133602e804024020032802a408450d00200210260b024020032802c404450d00201710260b2018201310ff01024020032802e404450d00201810260b200341e0076a10a203200341ed046a200341d8096a41086a290300370000200341f5046a200341d8096a41106a290300370000200341fd046a200341d8096a41186a29030037000020034185056a20032903d8113700002003418d056a200341d8116a41086a29030037000020034195056a200341d8116a41106a2903003700002003419d056a200341d8116a41186a290300370000200341033a00e4042003410f3a00e004200320032903d8093700e504200341c8056a200a360200200341cc056a2009360200200341bd056a200341e0076a41186a290000370000200341b5056a200341e0076a41106a290000370000200341ad056a200341e0076a41086a290000370000200341a5056a20032900e007370000200341e0046a108702200341043a008809024020032802fc0e41ffffff3f71450d00200110260b201641ffffff3f71450d8001200f10260c80010b20034188096a410910ec020c7d0b200341023a0088090b200b42ffffff3f83500d7d200c10260c7d0b000b200341e00e6a41106a200141186a290300370300200341e00e6a41086a200141106a2903003703002003200141086a2903003703e00e200341e0046a41206a200241206a290200370300200341e0046a41186a200241186a290200370300200341e0046a41106a200241106a290200370300200341e0046a41086a200241086a290200370300200320022902003703e0042000200341e00e6a200341e0046a10d604200424000f0b20034198046a41086a2215200141286a2802003602002003200141206a290300370398042001411c6a280200211d200141186a2802002117200141146a280200210f200141106a280200210d2001410c6a280200211e200141086a280200210c2001412c6a280200210e200141306a2802002113200141346a2802002118200341b0036a200141386a41e40010cf061a200141a4016a2802002111200141a0016a28020021162001419c016a2802002112200341b00c6a200141a8016a41800110cf061a200341d8116a41206a2201200241206a290200370300200341d8116a41186a2214200241186a290200370300200341d8116a41106a220a200241106a290200370300200341d8116a41086a2209200241086a290200370300200320022902003703d811024002400240200c0e03000102000b200341e0046a41146a4101360200200342013702e404200341dcedc6003602e004200341043602840a200341d4edc6003602800a2003200341800a6a3602f004200341e0046a41ecc0c700103d000b200341e0076a41086a201528020036020020032003290398043703e007200341800a6a200341b0036a41e40010cf061a200341e00e6a200341b00c6a41800110cf061a200341e0046a41206a2001290300370300200341e0046a41186a2014290300370300200341e0046a41106a200a290300370300200341e0046a41086a2009290300370300200320032903d8113703e004200341d8096a200341e0046a10d602200341c0046a41086a200341e1096a2201290000370300200341c0046a41106a200341e9096a2202290000370300200341c0046a41186a200341f1096a2215290000370300200320032900d9093703c004024002400240024002400240024020032d00d8094101460d00200341a0086a41186a200341c0046a41186a2903002210370300200341a0086a41106a200341c0046a41106a2903002206370300200341a0086a41086a200341c0046a41086a290300220b370300200320032903c00422053703a00820152010370000200220063700002001200b370000200320053700d909200341013a00d809200341e0046a41086a200341e0076a41086a280200360200200341f4046a2018360200200341e0046a41106a2013360200200341e0046a410c6a200e360200200320032903e0073703e004200341e0046a41186a200341800a6a41e40010cf061a200341e4056a2011360200200341e0046a4180016a2016360200200341dc056a2012360200200341e8056a200341e00e6a41800110cf061a20034180086a410c6a201736020020034180086a41086a200f3602002003201d360290082003200d360284082003201e36028008200341d8096a200341e0046a20034180086a10d90541ff017122024104460d0641bc8fc600210f4280808080e00221104102210120020e0401020304010b02402017450d002017410c6c2101200d210303400240200341046a280200450d00200328020010260b2003410c6a2103200141746a22010d000b0b0240200f450d00200f410c6c450d00200d10260b02402018450d00201841246c2101200e210303400240024020032d0000220241044b0d0002400240024020020e050400010204040b2003410c6a280200450d03200341086a28020010260c030b2003410c6a280200450d02200341086a28020010260c020b2003410c6a280200450d01200341086a28020010260c010b200341086a280200450d00200341046a28020010260b200341246a21032001415c6a22010d000b0b02402013450d00201341246c450d00200e10260b02402011450d00201141246c21012012210303400240024020032d0000220241044b0d0002400240024020020e050400010204040b2003410c6a280200450d03200341086a28020010260c030b2003410c6a280200450d02200341086a28020010260c020b2003410c6a280200450d01200341086a28020010260c010b200341086a280200450d00200341046a28020010260b200341246a21032001415c6a22010d000b0b02402016450d00201641246c450d00201210260b4200210641022103420021100c040b200341f4046a4101360200200342013702e404200341dcedc6003602e004200341043602dc0920034190f6c6003602d8092003200341d8096a3602f004200341e0046a41ecc0c700103d000b41a48fc600210f428080808080032110410021010c010b418c8fc600210f428080808080032110410121010b200fad2106410321030b200020013a0022200041023a00212000420037030820002010200684370024200041206a20033a0000200041186a41003a000020004201370300200424000f0b200041186a41003a000020004200370308200020032800c8093600192000411c6a200341cb096a28000036000020004200370300200424000f0b20034180086a41086a2015280200360200200320032903980437038008200341800a6a200341b0036a41e40010cf061a200341e00e6a200341b00c6a41800110cf061a200341e0046a41206a2001290300370300200341e0046a41186a2014290300370300200341e0046a41106a200a290300370300200341e0046a41086a2009290300370300200320032903d8113703e0040240024002400240024002400240200341e0046a10b1040d00200341e0046a10b603200341f1096a200341e0046a41186a2201290300370000200341e9096a200341f0046a2202290300370000200341e1096a200341e0046a41086a2215290300370000200341013a00d809200320032903e0043700d909201520034180086a41086a280200360200200341f4046a201836020020022013360200200341e0046a410c6a200e36020020032003290380083703e0042001200341800a6a41e40010cf061a200341e4056a2011360200200341e0046a4180016a2016360200200341dc056a2012360200200341e8056a200341e00e6a41800110cf061a200341a0086a410c6a2017360200200341a0086a41086a200f3602002003201d3602b0082003200d3602a4082003201e3602a008200341d8096a200341e0046a200341a0086a10d90541ff017122024104460d0641bc8fc600210f4280808080e00221104102210120020e0401020304010b02402017450d002017410c6c2101200d210303400240200341046a280200450d00200328020010260b2003410c6a2103200141746a22010d000b0b0240200f450d00200f410c6c450d00200d10260b02402018450d00201841246c2101200e210303400240024020032d0000220241044b0d0002400240024020020e050400010204040b2003410c6a280200450d03200341086a28020010260c030b2003410c6a280200450d02200341086a28020010260c020b2003410c6a280200450d01200341086a28020010260c010b200341086a280200450d00200341046a28020010260b200341246a21032001415c6a22010d000b0b02402013450d00201341246c450d00200e10260b02402011450d00201141246c21012012210303400240024020032d0000220241044b0d0002400240024020020e050400010204040b2003410c6a280200450d03200341086a28020010260c030b2003410c6a280200450d02200341086a28020010260c020b2003410c6a280200450d01200341086a28020010260c010b200341086a280200450d00200341046a28020010260b200341246a21032001415c6a22010d000b0b02402016450d00201641246c450d00201210260b4200210641022103420021100c040b200341f4046a4101360200200342013702e404200341dcedc6003602e004200341043602dc0920034190f6c6003602d8092003200341d8096a3602f004200341e0046a41ecc0c700103d000b41a48fc600210f428080808080032110410021010c010b418c8fc600210f428080808080032110410121010b200fad2106410321030b200020013a0022200041023a00212000420037030820002010200684370024200041206a20033a0000200041186a41003a000020004201370300200424000f0b200041186a41003a000020004200370308200020032800c8093600192000411c6a200341cb096a28000036000020004200370300200424000f0b200141086a2903002110200341e0046a41206a200241206a290200370300200341e0046a41186a200241186a290200370300200341e0046a41106a200241106a290200370300200341e0046a41086a200241086a290200370300200320022902003703e00402400240200341e0046a10b1040d00200341c0046a41186a22024200370300200341c0046a41106a22014200370300200341c0046a41086a220f4200370300200342003703c00420034180086a418a8cc700410910fb01200f20034180086a41086a29000037030020032003290080083703c004200341a8096a41d4e6c600410910fb012002200341a8096a41086a290300370300200120032903a809370300200341206a200341c0046a412041d4c0c7004100410010810220032802204101460d15200341c0046a41186a220f4200370300200341d0046a22134200370300200341c0046a41086a22024200370300200342003703c00420034180086a418a8cc700410910fb01200220034180086a41086a221629000037030020032003290080083703c004200341a8096a41808ec500410310fb01200141086a2217200341a8096a41086a2218290300370100200120032903a809370100200341106a200341c0046a10ab032003280210450d0120032903182206500d01200642b8177c2010580d01418cb8c50041ce0041dcbcc700102f000b2000420037002420004200370308200041206a41023a0000200041186a41003a000020004201370300200424000f0b200f42003703002013420037030020024200370300200342003703c00420034180086a418a8cc700410910fb012002201629000037030020032003290080083703c004200341a8096a41808ec500410310fb0120172018290300370100200120032903a809370100200320103703e004200341c0046a4120200341e0046a410810b301200f42003703002013420037030020024200370300200342003703c00420034180086a418a8cc700410910fb012002201629000037030020032003290080083703c004200341a8096a41d4e6c600410910fb0120172018290300370100200120032903a809370100200341013a00b003200341c0046a4120200341b0036a410110b301200041186a41003a000020004200370308200020032800c8093600192000411c6a200341c8096a41036a28000036000020004200370300200424000f0b20034198046a41086a22182001411d6a29000037030020032001290015370398042001410d6a2900002106200141286a2802002111200141056a290000211020012d0004210f20012d0025210d200341e00e6a41206a2201200241206a290200370300200341e00e6a41186a2213200241186a290200370300200341e00e6a41106a2216200241106a290200370300200341e00e6a41086a2217200241086a290200370300200320022902003703e00e2010421888a72102024002400240024002400240200f0e06000102030405000b200341f4046a4101360200200342013702e404200341dcedc6003602e004200341043602dc09200341d4edc6003602d8092003200341d8096a3602f004200341e0046a41ecc0c700103d000b200341e0046a41206a2001290300370300200341e0046a41186a2013290300370300200341e0046a41106a2016290300370300200341e0046a41086a2017290300370300200320032903e00e3703e004200341b00c6a200341e0046a10d60220032d00b00c4101460d17200341b00c6a41186a2903002110200341b00c6a41086a2903002106200341b00c6a41106a2802002101200341c40c6a280200210f20032d00b10c211320032f01b20c211620032802b40c21172003419f0a6a200341b00c6a41206a3100003c0000200320103700970a2003200f3600930a2003200136008f0a200320063700870a200320173600830a200320163b00810a200320133a00800a200341b0036a2002109703200341e0046a20032802b003221120032802b803221310d305200341a0086a41086a2201200341e0046a41186a290300370300200341a0086a41106a221620034180056a290300370300200341a0086a41186a221720034188056a290300370300200320032903f0043703a00820032003280091053602e007200320034194056a2800003600e307200341e0046a41086a290300211020032903e0042106024020032d009005220f4102460d0020034180086a41186a201729030037030020034180086a41106a201629030037030020034180086a41086a2001290300370300200320032903a00837038008200320032802e00736028809200320032800e30736008b090b02400240200f4102470d0020034180086a41186a200341800a6a41186a29030037030020034180086a41106a200341800a6a41106a29030037030020034180086a41086a200341800a6a41086a290300370300200320032903800a37038008420021104280a094a58d1d2106200341b00c6a200341800a6a4280a094a58d1d420010d9024100210f0c010b200341b00c6a410310e9020b0240024020032d00b00c22014104470d0020034194056a200328008b09360000200341e0046a41186a20034180086a41086a29030037030020034180056a20034190086a29030037030020034188056a20034180086a41186a290300370300200320063703e00420032003290380083703f0042003200f3a009005200320032802880936009105200320103703e80420112013200341e0046a10d405200341b00c6a41086a280200210f20032d00b10c211320032d00b20c211620032d00b30c211720032802b40c21180c010b200341b80c6a280200210f20032802b40c211820032d00b30c211720032d00b20c211620032d00b10c21130b024020032802b403450d00201110260b20014104470d7920034188056a2002360200200341ed046a200341880a6a290300370000200341f5046a200341900a6a290300370000200341fd046a200341800a6a41186a290300370000200341003a00e404200341013a00e004200320032903800a3700e504200341e0046a108702200041186a41003a000020004200370308200020032800d8093600192000411c6a200341db096a28000036000020004200370300200424000f0b200341b0036a41186a2018290300370300200320063703b803200320103703b00320032003290398043703c003200341e0046a41206a2001290300370300200341e0046a41186a2013290300370300200341e0046a41106a2016290300370300200341e0046a41086a2017290300370300200320032903e00e3703e004200341b00c6a200341e0046a10d602200341a0086a41086a200341b90c6a290000370300200341a0086a41106a200341c10c6a290000370300200341a0086a41186a200341c90c6a290000370300200320032900b10c3703a00820032d00b00c4101460d17200341800a6a41186a200341a0086a41186a290300370300200341800a6a41106a200341a0086a41106a290300370300200341800a6a41086a200341a0086a41086a290300370300200320032903a0083703800a0240200341800a6a200341b0036a412010d206450d00200341a0086a2011109703200341e0046a20032802a008220220032802a808221310d305200341d8116a41086a20034188056a29030037030020032003290380053703d81120032003280091053602e007200320034194056a2800003600e307200341e0046a41186a290300211020032903f004210620032903e804210b20032903e0042105024020032d009005220f41024622010d00200341d8096a41086a200341d8116a41086a290300370300200320032903d8113703d809200320032802e00736028809200320032800e30736008b090b200341e0076a41086a2216200341d8096a41086a290300370300200320032903d8093703e00720010d1920034180086a41086a20162903002207370300200320032903e007220837038008200341f8046a2007370300200320103703e804200320063703e004200320083703f004200f4101710d1a200341e0046a200341800a6a412010d2060d1b200341b00c6a200341800a6a200341b0036a2005200b410110e002200341b00c6a41086a2903002107024020032802b00c4101460d00200341c00c6a2903002110200341d8096a41086a200341c8036a290300370300200320032903c0033703d809200341043a00d8114200200b20107d2005200754ad7d2210200520077d22062005562010200b562010200b511b22011b210b4200200620011b210520032903b803211020032903b00321064100210f0c740b20032802b40c2101200320073702dc11200320013602d8110c720b200341c0046a410410e90220032d00c00422014104460d750c770b200341e0046a41206a2001290300370300200341e0046a41186a2013290300370300200341e0046a41106a2016290300370300200341e0046a41086a2017290300370300200320032903e00e3703e004200341b00c6a200341e0046a10d602200341a0086a41086a200341b90c6a290000370300200341a0086a41106a200341c10c6a290000370300200341a0086a41186a200341c90c6a290000370300200320032900b10c3703a00820032d00b00c4101460d1c200341800a6a41186a200341a0086a41186a290300370300200341800a6a41106a200341a0086a41106a290300370300200341800a6a41086a200341a0086a41086a290300370300200320032903a0083703800a200341b0036a2002109703200341e0046a20032802b003221120032802b803220f10d305200341d8116a41086a221320034188056a29030037030020032003290380053703d811200341e0046a41186a290300211020032903f004210620032903e804210b20032903e0042105024020032d009005221641024622010d00200341d8096a41086a2013290300370300200320032903d8113703d8090b200341e0076a41086a200341d8096a41086a290300370300200320032903d8093703e00720010d1a20034180086a41086a200341e0076a41086a2903002207370300200320032903e007220837038008200341f8046a2007370300200320103703e804200320063703e004200320083703f00420164101710d1b0240200341e0046a200341800a6a412010d2060d00200341286a200341800a6a2005200b10da02200341043a00b00c0c6c0b200341b00c6a410210e9020c6a0b200341b00c6a41086a201829030037030020032003290398043703b00c200341e0046a41206a2001290300370300200341e0046a41186a2013290300370300200341e0046a41106a2016290300370300200341e0046a41086a2017290300370300200320032903e00e3703e004200341e0046a10cd030d1c200341800a6a2011109703200341e0046a20032802800a220120032802880a220210d30520034180086a41086a221320034188056a29030037030020032003290380053703800820032003280091053602e007200320034194056a2800003600e307200341f8046a290300210b20032903f004210520032903e804210720032903e0042108024020032d009005410246220f0d00200341d8116a41086a201329030037030020032003290380083703d811200320032802e00736028809200320032800e30736008b090b200341e0076a41086a200341d8116a41086a290300370300200320032903d8113703e0070240200f0d00200341f8046a200341e8076a290300370300200320032903e0073703f004200320053703e0042003200b3703e804200341386a200341e0046a2008200710da020b200341e0046a41186a200637030020034180056a20032903b00c37030020034194056a200328008b0936000020034188056a220f200341b80c6a2213290300370300200320103703f004200342003703e804200342003703e0042003200d3a00900520032003280288093600910520012002200341e0046a10d405024020032802840a450d00200110260b200341ed046a2006370000200341f5046a20032903b00c370000200f2011360200200341fd046a2013290300370000200320103700e504200341003a00e404200341013a00e004200341e0046a108702200041186a41003a000020004200370308200020032800c8093600192000411c6a200341cb096a28000036000020004200370300200424000f0b200341e0046a41206a2001290300370300200341e0046a41186a2013290300370300200341e0046a41106a2016290300370300200341e0046a41086a2017290300370300200320032903e00e3703e004200341b00c6a200341e0046a10d602200341a0086a41086a200341b90c6a290000370300200341a0086a41106a200341c10c6a290000370300200341a0086a41186a200341c90c6a290000370300200320032900b10c3703a00820032d00b00c4101460d1e200341800a6a41186a200341a0086a41186a290300370300200341800a6a41106a200341a0086a41106a290300370300200341800a6a41086a200341a0086a41086a290300370300200320032903a0083703800a200341a0086a2002109703200341e0046a20032802a008221820032802a808221310d305200341d8116a41086a220f20034188056a29030037030020032003290380053703d81120032003280091053602e007200320034194056a2800003600e307200341e0046a41186a290300211020032903f004210620032903e804210b20032903e0042105024020032d009005221641024622010d00200341d8096a41086a200f290300370300200320032903d8113703d809200320032802e00736028809200320032800e30736008b090b200341e0076a41086a200341d8096a41086a290300370300200320032903d8093703e00720010d1c20034180086a41086a200341e0076a41086a2903002207370300200320032903e007220837038008200341f8046a2007370300200320103703e804200320063703e004200320083703f00420164101710d1d0240200341e0046a200341800a6a412010d2060d00200341e0006a200341800a6a2005200b10e102200341e0006a41086a29030021082003290360210b42002105200341d8046a22014200370300200341c0046a41106a220f4200370300200341c0046a41086a22164200370300200342003703c00420034180086a419a8cc700410810fb01201620034180086a41086a221129000037030020032003290080083703c004200341a8096a41b8a1c300410d10fb012001200341a8096a41086a220d290300370300200f20032903a809370300200341c8006a200341c0046a108d02200341c8006a41106a2903002107200329035021192003280248211720014200370300200f420037030020164200370300200342003703c00420034180086a419a8cc700410810fb012016201129000037030020032003290080083703c004200341a8096a41b8a1c300410d10fb012001200d290300370300200f20032903a809370300200342002007420020171b220720087d2019420020171b2208200b54ad7d22192008200b7d220b200856201920075620192007511b22011b3703b80c20034200200b20011b3703b00c200341c0046a4120200341b00c6a411010b301200341d8096a41086a200341f0046a220141086a290300370300200341043a00b003200320012903003703d8094101210f4200210b0c640b200341b0036a410210e9020c620b200141d8006a290300211a200141d0006a290300211b200141c8006a2903002119200141c0006a290300210b200141386a2903002110200141306a2903002106200141286a3100002105200141206a29000021072001412c6a28000021152001411c6a2800002118200141186a2800002111200141106a29000021082001410c6a280000210d200141086a2d0000210f20012f002a210c20012d0029211420012f000a210e20012d00092112200341800a6a41206a2201200241206a290200370300200341800a6a41186a2213200241186a290200370300200341800a6a41106a2216200241106a290200370300200341800a6a41086a2217200241086a290200370300200320022902003703800a02400240024002400240200f0e050001020304000b200341f4046a4101360200200342013702e404200341dcedc6003602e004200341043602dc09200341d4edc6003602d8092003200341d8096a3602f004200341e0046a41ecc0c700103d000b200341e0046a41206a2001290300370300200341e0046a41186a2013290300370300200341e0046a41106a2016290300370300200341e0046a41086a2017290300370300200320032903800a3703e004200341e00e6a200341e0046a10d602200341e0076a41086a200341e90e6a290000370300200341e0076a41106a200341f10e6a290000370300200341e0076a41186a200341f90e6a290000370300200320032900e10e3703e00702400240024020032d00e00e4101470d004200211041022101420021060c010b200341b00c6a41186a200341e0076a41186a290300370300200341b00c6a41106a200341e0076a41106a290300370300200341b00c6a41086a200341e0076a41086a290300370300200320032903e0073703b00c200341ff046a20053c0000200320073700f704200320183600f304200320113600ef04200320083700e7042003200d3600e3042003200e3b00e104200320123a00e004200341e00e6a200341b00c6a200341e0046a20062010410110d70320032d00e00e22014104460d0120033502e40e211020032d00e30e211320032d00e20e210f20032d00e10e2102200341e00e6a41086a35020042208621060b200020133a00232000200f3a0022200020023a00212000420037030820002006201084370024200041206a20013a0000200041186a41003a000020004201370300200424000f0b20004200370308200020032800c809360019200041186a41003a00002000411c6a200341cb096a28000036000020004200370300200424000f0b200341e0046a41206a2001290300370300200341e0046a41186a2013290300370300200341e0046a41106a2016290300370300200341e0046a41086a2017290300370300200320032903800a3703e004200341e0046a10cd030d21200341cf036a20053c0000200320073700c703200320183600c303200320113600bf03200320083700b7032003200d3600b3032003200e3b00b103200320123a00b003200341a0086a200341b0036a10d803200341e00e6a20032802a008220220032802a808220f10d90320032903e00e2107200342003703e00e42002010200b20067c22054280c8afa025544100201920107c2005200b54ad7c501b22011b21104200200620011b2106200341a80f6a280200211320032d00ac0f21160240024020074201510d004200211b4200211c4200211f42002120420021214200212242002123420021244200211a420021080c010b200341980f6a290300211f200341900f6a290300211c200341880f6a290300211b200341800f6a2903002124200341f80e6a290300212120032903f00e210820032903e80e211a200341a00f6a290300212042002122420021230b4200201920011b21054200200b20011b210b2006201a562010200856201020085122011b0d202006201a54201020085420011b450d6220034198086a2201420037030020034180086a41106a2217420037030020034180086a41086a221842003703002003420037038008200341d8096a419a8cc700410810fb012018200341d8096a41086a220d290300370300200320032903d80937038008200341d8116a41b8a1c300410d10fb012001200341d8116a41086a220e290300370300201720032903d811370300200341e0016a20034180086a108d02200341e0016a41106a290300211920032903e801212520032802e00121112001420037030020174200370300201842003703002003420037038008200341d8096a419a8cc700410810fb012018200d290300370300200320032903d80937038008200341d8116a41b8a1c300410d10fb012001200e290300370300201720032903d811370300200342002019420020111b2219201a200654ad201020087d7c7c2025420020111b2208201a20067d222554ad7d221a200820257d2225200856201a201956201a2019511b22011b3703e80420034200202520011b3703e00420034180086a4120200341e0046a411010b3010c620b200341e0046a41206a2001290300370300200341e0046a41186a2013290300370300200341e0046a41106a2016290300370300200341e0046a41086a2017290300370300200320032903800a3703e004024002400240200341e0046a10cd03450d004102210142002110420021060c010b200341e0076a411f6a20053c0000200320113600ef07200320083700e707200341e00e6a41086a200341e0076a41086a290300370300200320073700f707200320183600f307200341e00e6a41106a200341e0076a41106a290300370300200341e00e6a41186a200341e0076a41186a2903003703002003200d3600e3072003200e3b00e107200320123a00e007200320032903e0073703e00e200341e0046a411f6a20193c00002003200b3700f704200320063700e704200320153600e3042003200c3b00e104200320143a00e004200320103e00ef04200320104220883e00f304200341b00c6a200341e00e6a200341e0046a201b201a410110d70320032d00b00c22014104460d0120033502b40c211020032d00b30c211320032d00b20c210f20032d00b10c2102200341b00c6a41086a35020042208621060b200020133a00232000200f3a0022200020023a00212000420037030820002006201084370024200041206a20013a0000200041186a41003a000020004201370300200424000f0b20004200370308200020032800c809360019200041186a41003a00002000411c6a200341cb096a28000036000020004200370300200424000f0b200341e0046a41206a2001290300370300200341e0046a41186a2013290300370300200341e0046a41106a2016290300370300200341e0046a41086a2017290300370300200320032903800a3703e004200341e00e6a200341e0046a10d602200341e0076a41086a200341e90e6a290000370300200341e0076a41106a200341f10e6a290000370300200341e0076a41186a200341f90e6a290000370300200320032900e10e3703e00702400240024020032d00e00e4101470d004200211041022101420021060c010b200341b00c6a41186a200341e0076a41186a290300370300200341b00c6a41106a200341e0076a41106a290300370300200341b00c6a41086a200341e0076a41086a290300370300200320032903e0073703b00c200341ff046a20053c0000200320073700f704200320183600f304200320113600ef04200320083700e7042003200d3600e3042003200e3b00e104200320123a00e004200341e00e6a200341b00c6a200341e0046a20062010410010d70320032d00e00e22014104460d0120033502e40e211020032d00e30e211320032d00e20e210f20032d00e10e2102200341e00e6a41086a35020042208621060b200020133a00232000200f3a0022200020023a00212000420037030820002006201084370024200041206a20013a0000200041186a41003a000020004201370300200424000f0b20004200370308200020032800c809360019200041186a41003a00002000411c6a200341cb096a28000036000020004200370300200424000f0b2001410c6a2802002117200141086a28020021112001280204210d200341e0046a41206a200241206a290200370300200341e0046a41186a200241186a290200370300200341e0046a41106a200241106a290200370300200341e0046a41086a200241086a290200370300200320022902003703e004024002400240200341e0046a10b1040d002017410a4b0d01200341a0086a41186a22024200370300200341a0086a41106a22094200370300200341a0086a41086a22014200370300200342003703a00820034180086a41a28cc700410a10fb01200120034180086a41086a220f29030037030020032003290380083703a008200341e0076a41b0cbc500410c10fb012002200341e0076a41086a2216290300370300200920032903e007370300200341a0086a108a02221341ff01714102460d022013410171450d0220034188096a410210f2020c600b200341023a0088090c5f0b20034188096a410310f2020c5e0b200242003703002009420037030020014200370300200342003703a00820034180086a41a28cc700410a10fb012001200f29030037030020032003290380083703a008200341e0076a41b0cbc500410c10fb01200941086a2016290300370300200920032903e007370300200341013a00b003200341a0086a4120200341b0036a410110b301200341c0046a41186a22014200370300200341c0046a41106a221d4200370300200341c0046a41086a22024200370300200342003703c00420034180086a41808cc700410610fb012002200f29000037030020032003290080083703c004200341a8096a41ea93c400410610fb012001200341a8096a41086a290300370300201d20032903a80937030020034180026a200341c0046a412010890220032802840241002003280280021b210f20034198046a10b403024020032802a0042202200328029c04470d0020034198046a200210f70120032802a00421020b2003280298042215200241c4006c6a220141003a0000200120032f01c4083b00012001200f360204200120032902e004370208200141036a20032d00c6083a0000200141106a200341e0046a41086a2226290200370200200141186a200341e0046a41106a2227290200370200200141206a200341e0046a41186a290200370200200141286a200341e0046a41206a290200370200200141306a200341e0046a41286a290200370200200141386a200341e0046a41306a290200370200200141c0006a200341e0046a41386a2802003602002003200241016a22123602a004200d201741f0006c22016a2128024020170d00200d21130c5b0b200341ee076a2114200d41f4006a2116200141907f6a2118200341c0046a41186a2129200341ff076a212a200d211303402013280204210c2013280200210f200341e0046a201341086a41e80010cf061a201341f0006a2113200c450d5b200341e00e6a200341e0046a41e80010cf061a2003200c3602e4042003200f3602e0042026200341e00e6a41e80010cf061a20294200370300200341c0046a41106a4200370300200341c0046a41086a22014200370300200342003703c00420034180086a41808cc700410610fb01200120034180086a41086a220a29000037030020032003290080083703c004200341a8096a41ea93c400410610fb01201d41086a200341a8096a41086a290300370100201d20032903a809370100200341f8016a200341c0046a412010890220032802f801210120032802fc012102200341800a6a200341e0046a10f4020240200f450d00200f2002410020011b22014b0d21200341b00c6a200f417f6a10b204200341b00c6a2027412010d2060d22200f2001490d230240024020152015201241c4006c22026a460d00201541016a2101034002402001417f6a2d00004101470d004101210e200341800a6a2001460d032001200341800a6a412010d206450d030b200141c4006a2101200241bc7f6a22020d000b0b4100210e0b200341b00c6a200f10b204200341b00c6a200341800a6a412010d2062101200e0d242001450d24200341d8116a41086a2201200341b0036a41086a290200370300200341d8116a41106a2202200341b0036a41106a2f01003b0100200320032901d8093703a008200320032902b0033703d8112003200341d8096a41066a2901003701a608200320032901a6083701e607200320032903a00822103703e007201441106a20022f01003b0000201441086a2001290300370000201420032903d811370000202a310000210620032f00e107210220032800e307210f20032900f707210b20032800f307210e20032800ef07211e20032900e7072105200341800a6a200341e0046a10f402200341b00c6a41186a4200370300200341b00c6a41106a4200370300200341b00c6a41086a4200370300200342003703b00c200341b00c6a10b70320034180086a41186a222b200341800a6a41186a29030037030020034180086a41106a222c200341800a6a41106a290300370300200a200341800a6a41086a290300370300200320032903800a370380082010a7212d02402012200328029c04470d0020034198046a201210f701200328029804211520032802a00421120b2015201241c4006c6a220141013a0000200a2903002110202c2903002107202b29030021082003290380082119200141c1006a20063c00002001200b3700392001200e3600352001201e360031200120053700292001200f360025200120023b00232001202d3a0022200141003a002120012019370001200141196a2008370000200141116a2007370000200141096a20103700002003201241016a22123602a004024020032802ec042201450d00200141246c2102200c210103400240024020012d0000220f41044b0d00024002400240200f0e050400010204040b2001410c6a280200450d03200141086a28020010260c030b2001410c6a280200450d02200141086a28020010260c020b2001410c6a280200450d01200141086a28020010260c010b200141086a280200450d00200141046a28020010260b200141246a21012002415c6a22020d000b0b024020032802e8042201450d00200141246c450d00200c10260b201841907f6a2118201641f0006a211620132028470d010c5d0b0b200341b00c6a410410f202200341e2096a200341b00c6a41086a280200360100200341d8116a41086a200341b0036a41086a290200370300200341d8116a41106a200341b0036a41106a2f01003b0100200320032903b00c3701da09200320032902b0033703d811200320032901d8093703a0082003200341de096a2901003701a6080c590b200141086a280200211820012802042101200341e00e6a41206a220f200241206a290200370300200341e00e6a41186a2213200241186a290200370300200341e00e6a41106a2216200241106a290200370300200341e00e6a41086a2217200241086a290200370300200320022902003703e00e02402001450d00200341e0046a41206a200f290300370300200341e0046a41186a2013290300370300200341e0046a41106a2016290300370300200341e0046a41086a2017290300370300200320032903e00e3703e004200341b00c6a200341e0046a10d60220034180086a41086a200341b90c6a29000037030002400240024020032d00b00c4101470d004102210320180d010c020b410321032018450d010b200110260b2000418a023b00212000420037030820004201370300200041206a20033a0000200041186a41003a0000200041e9b2c200ad4280808080f00284370024200424000f0b200341e0046a41206a200f290300370300200341e0046a41186a2013290300370300200341e0046a41106a2016290300370300200341e0046a41086a2017290300370300200320032903e00e3703e004200341b00c6a200341e0046a10d602200341c0046a41086a200341b90c6a290000370300200041e9b2c200ad221020104280808080f0028420032d00b00c41014622031b3700242000418a023b0021200041206a4102410320031b3a0000200041186a41003a00002000420037030820004201370300200424000f0b2001280204210f200341e0046a41206a200241206a290200370300200341e0046a41186a200241186a290200370300200341e0046a41106a200241106a290200370300200341e0046a41086a200241086a290200370300200320022902003703e004024002400240200341e0046a10b104450d0041022102420021100c010b200341a0086a41186a22014200370300200341a0086a41106a22134200370300200341a0086a41086a4200370300200342003703a008200341a0086a41bb8cc700410f10fb01200341e0076a41b1eec600410610fb012001200341e0076a41086a290300370300201320032903e0073703004100210120034190026a200341a0086a412041d4c0c700410041001081024103210202402003280290024101470d004280808080e001211041bbf6c60021030c010b200341c0046a41186a22014200370300200341c0046a41106a22164200370300200341c0046a41086a22174200370300200342003703c00420034180086a41808cc700410610fb01201720034180086a41086a29000037030020032003290080083703c004200341a8096a41ea93c400410610fb012001200341a8096a41086a290300370300201620032903a80937030020034188026a200341c0046a4120108902200328028c0241002003280288021b200f4f0d014280808080f000211041c9f6c6002103410121010b200020013a00222000410b3a002120004200370308200041206a20023a0000200041186a41003a0000200020102003ad8437002420004201370300200424000f0b200341a0086a41186a4200370300200341a0086a41106a4200370300200341a0086a41086a4200370300200342003703a008200341a0086a41bb8cc700410f10fb01200341e0076a41b1eec600410610fb01201341086a200341e0076a41086a290300370300201320032903e0073703002003200f3602e004200341a0086a4120200341e0046a410410b301200041186a41003a000020004200370308200020032800c8093600192000411c6a200341cb096a28000036000020004200370300200424000f0b2001411c6a2802002112200141186a2802002111200141146a2802002118200141106a280200210d2001410c6a280200210e200141086a280200210f200341b00c6a200141206a41800210cf061a200341800a6a41206a2201200241206a290200370300200341800a6a41186a2213200241186a290200370300200341800a6a41106a2216200241106a290200370300200341800a6a41086a2217200241086a290200370300200320022902003703800a0240024002400240200f0e0400010203000b200341e0046a41146a4101360200200342013702e404200341dcedc6003602e004200341043602dc09200341d4edc6003602d8092003200341d8096a3602f004200341e0046a41ecc0c700103d000b200341e00e6a200341b00c6a41800210cf061a200341e0046a41206a2001290300370300200341e0046a41186a2013290300370300200341e0046a41106a2016290300370300200341e0046a41086a2017290300370300200320032903800a3703e004200341b0036a200341e0046a10d602200341c0046a41086a200341b9036a2201290000370300200341c0046a41106a200341c1036a2202290000370300200341c0046a41186a200341c9036a220f290000370300200320032900b1033703c00402400240024020032d00b0034101460d00200341a0086a41186a200341c0046a41186a2903002210370300200341a0086a41106a200341c0046a41106a2903002206370300200341a0086a41086a200341c0046a41086a290300220b370300200320032903c00422053703a008200f2010370000200220063700002001200b370000200320053700b103200341013a00b003200341e0046a200341e00e6a41800210cf061a200341e4116a2011360200200341d8116a41086a2018360200200320123602e8112003200d3602dc112003200e3602d811200341b0036a200341e0046a200341d8116a10ae05220141ff01714108470d01200341043a00d8090c5a0b200341023a00d80902402011450d002011410c6c2102200d210103400240200141046a280200450d00200128020010260b2001410c6a2101200241746a22020d000b0b02402018450d002018410c6c450d00200d10260b410221010c010b200341d8096a200110e80220032d00d80922014104460d580b20032f00d909210220032d00db09210f200020032902dc093700242000200f3a0023200020023b0021200041206a20013a0000200041186a41003a00002000420037030820004201370300200424000f0b200341e00e6a200341b00c6a41800210cf061a200341e0046a41206a2001290300370300200341e0046a41186a2013290300370300200341e0046a41106a2016290300370300200341e0046a41086a2017290300370300200320032903800a3703e004024002400240200341e0046a10b1040d00200341e0046a10b603200341c9036a200341f8046a290300370000200341c1036a200341f0046a290300370000200341b9036a200341e0046a41086a290300370000200341013a00b003200320032903e0043700b103200341e0046a200341e00e6a41800210cf061a200341e4116a2011360200200341d8116a41086a2018360200200320123602e8112003200d3602dc112003200e3602d811200341b0036a200341e0046a200341d8116a10ae05220141ff01714108470d01200341043a00d8090c580b200341023a00d80902402011450d002011410c6c2102200d210103400240200141046a280200450d00200128020010260b2001410c6a2101200241746a22020d000b0b02402018450d002018410c6c450d00200d10260b410221010c010b200341d8096a200110e80220032d00d80922014104460d560b20032f00d909210220032d00db09210f200020032902dc093700242000200f3a0023200020023b0021200041206a20013a0000200041186a41003a00002000420037030820004201370300200424000f0b200341e0046a41206a2001290300370300200341e0046a41186a2013290300370300200341e0046a41106a2016290300370300200341e0046a41086a2017290300370300200320032903800a3703e0040240200341e0046a10cd03450d002000420037002420004200370308200041206a41023a0000200041186a41003a000020004201370300200424000f0b200341c0046a41186a22014200370300200341d0046a22024200370300200341c0046a41086a220f4200370300200342003703c00420034180086a41aed3c500410f10fb01200f20034180086a41086a29000037030020032003290080083703c004200341a8096a41c5d8c500410710fb012001200341a8096a41086a290300370300200220032903a809370300200341c0046a4120200e200d10e103200041186a41003a000020004200370308200020032800c8093600192000411c6a200341cb096a28000036000020004200370300200424000f0b200141246a28020021162001411c6a280200210f200141186a2802002113200141146a2802002117200141106a280200210d2001410c6a2802002118200141086a2802002111200341e0046a41206a200241206a290200370300200341e0046a41186a200241186a290200370300200341e0046a41106a200241106a290200370300200341e0046a41086a200241086a290200370300200320022902003703e004024002400240200341e0046a10b104450d004200211041022116420021060c010b200341c0046a41186a22014200370300200341c0046a41106a22024200370300200341c0046a41086a220e4200370300200342003703c00420034180086a41b48cc700410710fb01200e20034180086a41086a29000037030020032003290080083703c004200341a8096a4184c1c200410c10fb012001200341a8096a41086a290300370300200220032903a809370300200341a0026a200341c0046a4120108902200341e0046a20032802a402410020032802a0021b22152016108e0520034198026a20032802e004220120032802e80441d4c0c70041004100108102200328029802210e024020032802e404450d00200110260b200341800a6a10ac0320032802800a21120240200e41014622020d00201220164105746a410020032802880a20164b1b22010d020b024020032802840a41ffffff3f71450d00201210260b4280808080b0024280808080a00120021b210641b8edc500ad41aeedc500ad200e4101461b2110410321160b02402018450d00201110260b0240200f450d00200f410c6c21012017210303400240200341046a280200450d00200328020010260b2003410c6a2103200141746a22010d000b0b02402013450d002013410c6c450d00201710260b200020023a00222000410d3a00212000420037030820002006201084370024200041206a20163a0000200041186a41003a000020004201370300200424000f0b200141086a2900002110200141106a29000021062001290000210b200341a0086a41186a200141186a2900002205370300200341a0086a41106a2006370300200341a0086a41086a20103703002003200b3703a008200341ed046a2010370000200341f5046a2006370000200341fd046a2005370000200341003a00e404200341063a00e0042003200b3700e504200341e0046a108702200341003602b80c200342013703b00c2011200d200341b00c6a109501200341b00c6a200f10a1010240200f450d002017200f410c6c6a21022017210103402001280200200141086a280200200341b00c6a1095012001410c6a22012002470d000b0b200341e00e6a20152016108e0520032802b80c220141046a2202417f4c0d0b20032802b00c211620032802e80e210e20032802e00e210d0240024020020d0041012115410021020c010b200210242215450d740b200341003602e804200320153602e004200320023602e4040240024002400240200141c000490d00200141808001490d012001418080808004490d02200341033a00b003200341e0046a41004101106d20032802e00420032802e80422026a20032d00b0033a00002003200241016a22023602e804200341e0046a20024104106d20032802e00420032802e80422026a20013600002003200241046a22023602e804200341e0046a21150c030b200341e0046a41004101106d20032802e00420032802e80422026a20014102743a00002003200241016a22023602e804200341e0046a21150c020b200341e0046a41004102106d20032802e00420032802e80422026a20014102744101723b00002003200241026a22023602e804200341e0046a21150c010b200341e0046a41004104106d20032802e00420032802e80422026a20014102744102723600002003200241046a22023602e804200341e0046a21150b201520022001106d20032802e004220220032802e80422156a2016200110cf061a2003201520016a22013602e804200d200e2002200110b301024020032802e404450d00200210260b024020032802e40e450d00200d10260b024020032802b40c450d00201610260b024020032802840a41ffffff3f71450d00201210260b02402018450d00201110260b0240200f450d00200f410c6c21022017210103400240200141046a280200450d00200128020010260b2001410c6a2101200241746a22020d000b0b02402013450d002013410c6c450d00201710260b20004200370308200020032800c809360019200041186a41003a00002000411c6a200341cb096a28000036000020004200370300200424000f0b200141386a290300210b200141306a2903002105200141286a3100002107200141206a29020021082001412c6a28020021152001411c6a280200210c2001410c6a280200210f200141086a2d00002113200141106a2903002110200141186a350200210620012f000a211420012d0009210a200341e00e6a200141c0006a41e80110cf061a20034198046a41086a2216200241106a29020037030020034198046a41106a2217200241186a29020037030020034198046a41186a2218200241206a2802003602002003200241086a290200370398042006a7210e2010a721122010422088a7210d200241046a280200211120022802242101200228020021020240024002400240024020130e050001020304000b200341f4046a4101360200200342013702e404200341dcedc6003602e004200341043602dc09200341d4edc6003602d8092003200341d8096a3602f004200341e0046a41ecc0c700103d000b200341e0046a41086a200329039804370300200341e0046a41106a2016290300370300200341e0046a41186a2017290300370300200341e0046a41206a2018280200360200200320113602e404200320023602e0042003200136028405200320103702b40c2003200f3602b00c200341800a6a200341e0046a200341b00c6a10df04024020032d00800a22014104460d0020032f00810a210220032d00830a210f200020032902840a3700242000200f3a0023200020023b0021200041206a20013a0000200041186a41003a00002000420037030820004201370300200424000f0b20004200370308200020032800c809360019200041186a41003a00002000411c6a200341cb096a28000036000020004200370300200424000f0b200341e0046a200341e00e6a41e80110cf061a200341b00c6a41086a200329039804370300200341b00c6a41106a2016290300370300200341b00c6a41186a2017290300370300200341b00c6a41206a2018280200360200200320113602b40c200320023602b00c200320013602d40c200341800a6a200341b00c6a10d602200341e0076a41086a200341890a6a290000370300200341e0076a41106a200341910a6a290000370300200341e0076a41186a200341990a6a290000370300200320032900810a3703e0070240024020032d00800a4101460d00200341ff076a310000210620032900f707210b20032800f307211720032800ef07211820032900e707210520032800e307211120032f00e107211520032d00e0072114200341f8086a10ad03200341d8116a41186a200341fc046a290200370300200341d8116a41106a200341f4046a290200370300200341d8116a41086a200341e0046a410c6a290200370300200320032902e4043703d811200341c0046a41186a22014200370300200341c0046a41106a22024200370300200341c0046a41086a22134200370300200342003703c00420034180086a41b48cc700410710fb01201320034180086a41086a29000037030020032003290080083703c004200341a8096a4184c1c200410c10fb012001200341a8096a41086a290300370300200220032903a809370300200341b0026a200341c0046a4120108902410021160240024002400240200f20032802b402410020032802b0021b460d00200341b00c6a200f10fa03024020032802b00c4101470d00200341d40c6a280200200c460d020b200341003a00800a0240200e450d00200e410c6c21022012210103400240200141046a280200450d00200128020010260b2001410c6a2101200241746a22020d000b0b200d450d03200d410c6c0d020c030b200341b00c6a41086a4120360200200341f0c2c98b063602b00c2003200341d8116a3602b40c200341800a6a200341b00c6a10bd03200341b00c6a20032802800a220c20032802880a10b8032013200341b90c6a2900003703002002200341c10c6a2900003703002001200341c90c6a290000370300200320032900b10c3703c004024020032d00b00c4101470d00200341b0036a41186a200341c0046a41186a290300370300200341b0036a41106a200341c0046a41106a290300370300200341b0036a41086a200341c0046a41086a290300370300200320032903c0043703b003410121160b024020032802840a450d00200c10260b024020160d00200341003a00800a0240200e450d00200e410c6c21022012210103400240200141046a280200450d00200128020010260b2001410c6a2101200241746a22020d000b0b200d450d03200d410c6c0d020c030b200341a0086a41186a200341b0036a41186a290300370300200341a0086a41106a200341b0036a41106a290300370300200341a0086a41086a200341b0036a41086a290300370300200320032903b0033703a008200341003a00800a0240200e450d00200e410c6c21022012210103400240200141046a280200450d00200128020010260b2001410c6a2101200241746a22020d000b0b200d450d02200d410c6c0d010c020b200341cb0c6a2900002110200341c70c6a2800002101200341c30c6a2800002102200341bb0c6a290000210720032800b70c211320032f00b50c211620032d00b40c210c2003419f086a200341d30c6a3100003c0000200320103700970820032001360093082003200236008f0820032007370087082003201336008308200320163b0081082003200c3a008008200341800a6a10fb030240200e450d002012200e410c6c6a210241002802cc9f40211341002902c49f402110201221010340200341b0036a41086a2013360200200320103703b003200341b00c6a200341800a6a200341b0036a2001280200200141086a28020010fc032001410c6a22012002470d000b0b200341b00c6a200341800a6a41d00010cf061a200341980d6a20034198086a290300370300200341900d6a20034190086a290300370300200341880d6a20034188086a29030037030020032003290380083703800d200341800a6a200341b00c6a41f0c2c98b06200341d8116a10fd03200341b00c6a10fe030240200e450d00200e410c6c21022012210103400240200141046a280200450d00200128020010260b2001410c6a2101200241746a22020d000b0b200d450d01200d410c6c450d010b201210260b410121130240024020032d00800a4101460d004125210141def5c40021020c010b200341b2036a20032d00830a3a0000200341b00c6a41086a200341940a6a290200370300200341bd0c6a200341990a6a290000370000200320032f00810a3b01b00320032003418c0a6a2902003703b00c200341800a6a41086a28020021014100211320032802840a21020b200341e0076a41026a2216200341b0036a41026a2d00003a0000200341d8096a41086a220d200341b00c6a41086a290300370300200341d8096a41106a200341b00c6a41106a290300370300200320032f01b0033b01e007200320032903b00c3703d8092013450d0120032802fc0841ffffff3f71450d5320032802f8081026410021030c550b0240200e450d00200e410c6c21012012210303400240200341046a280200450d00200328020010260b2003410c6a2103200141746a22010d000b0b41022103200d450d53200d410c6c450d53201210260c530b200341a4096a41026a20162d000022133a000020034188096a410d6a2216200341d8096a410d6a29000037000020034188096a41086a220e200d290300370300200320032f01e007220d3b01a409200320032903d809221037038809200341a8096a41086a200e290300370300200341a8096a410d6a220e20162900003700002003200d3b01c408200320133a00c608200320103703a809412010242216450d0b2016200b370017201620173600132016201836000f2016200537000720162011360003201620153b0001201620143a00002016411f6a20063c0000200341e0076a41086a2217200341a8096a41086a290300370300200341e0076a410d6a200e290000370000200320032f01c4083b01c409200320032d00c6083a00c609200320032903a8093703e007412010242213450d0b201320032f01c4093b00002013200136000720132002360003201320032903e00737000b201341026a20032d00c6093a0000201341136a2017290300370000201341186a200341ed076a29000037000020034281808080103702cc09200320163602c809410410242201450d74200342043702b403200320013602b003200341b0036a41004104106d20032802b00320032802b80322016a200f3600002003200141046a3602b803200341b00c6a418dd5c10010fb02200341800a6a20032802b00c220220032802b80c109d0220032902840a420020032802800a22011b21102001410120011b2117024020032802b40c450d00200210260b200320104220883e02840a200320173602800a200341b00c6a200341800a6a10e301200341b00c6a41086a280200210220032802b40c211820032802b00c2101200341b00c6a418dd5c100200341b0036a10fc02200341800a6a20032802b00c220d20032802b80c10a5022002410020011b21112018410020011b211820032902840a420020032802800a22021b21062001410420011b21012002410120021b210c024020032802b40c450d00200d10260b200341f8096a2011360200200341f4096a2018360200200341d8096a41106a2006370300200341d8096a41086a200341b0036a41086a280200360200200320032903b0033703d809200320013602f0092003200c3602e40902402010a7450d00201710260b201341086a2900002110201341106a290000210b20132900002105200341b0036a41186a201341186a290000370300200341b0036a41106a200b370300200341b0036a41086a2010370300200320053703b003410410242201450d74200342043702b40c200320013602b00c200341b00c6a41004104106d20032802b00c220220032802b80c22016a200f360000200341c40c6a4100290095d5413702002003200141046a3602b80c2003410029008dd5413702bc0c2003200341b0036a3602cc0c200341800a6a200341b00c6a109401024020032802b40c450d00200210260b20064220882110200341b00c6a200341800a6a10fe02200341a8026a20032802b00c220220032802b80c41d4c0c7004100410010810220032802a8022101024020032802b40c450d00200210260b2010a72115024020014101470d00410021010c510b20034180086a41186a2202200341b0036a41186a29030037030020034180086a41106a2217200341b0036a41106a29030037030020034180086a41086a2218200341b0036a41086a290300370300200320032903b00337038008200341b00c6a200341c8096a10c301200341b00c6a410c6a220141186a2002290300370200200141106a2017290300370200200141086a20182903003702002001200329038008370200200341d8116a200341800a6a10fe0220032802d811220120032802e011200341b00c6a10af05024020032802dc11450d00200110260b024020032802b40c41ffffff3f71450d0020032802b00c10260b200341a0086a41186a200341800a6a41186a290300370300200341a0086a41106a200341800a6a41106a290300370300200341a0086a41086a200341800a6a41086a290300370300200320032903800a3703a00820032802f0092111410021010240024020032802f809220d41014b0d00200d0e020150010b200d2102034020012002410176221720016a22182011201841246c6a280200200f4b1b2101200220176b220241014b0d000c500b0b200341b00c6a41186a200341a0086a41186a290300370300200341b00c6a41106a200341a0086a41106a290300370300200341b00c6a41086a200341a0086a41086a290300370300200320032903a0083703b00c410021020c4f0b200341e0046a41086a200329039804370300200341e0046a41106a2016290300370300200341e0046a41186a2017290300370300200341e0046a41206a2018280200360200200320113602e404200320023602e0042003200136028405200341b00c6a200341e0046a10d602200341e0076a41086a200341b90c6a290000370300200341e0076a41106a200341c10c6a290000370300200341e0076a41186a200341c90c6a290000370300200320032900b10c3703e00720032d00b00c4101460d1f200341800a6a41186a200341e0076a41186a290300370300200341800a6a41106a200341e0076a41106a290300370300200341800a6a41086a200341e0076a41086a290300370300200320032903e0073703800a200341e0046a201510e20420032802e804211320032802e004210141002102200341dc116a41003a0000200341003602d811200341c0026a20012013200341d8116a410541001081020240024020032802c002450d00200320032802c4022202410520024105491b3602b40c2003200341d8116a3602b00c200341b8026a200341b00c6a108f0120032802bc02211320032802b8024521020c010b0b024020032802e404450d00200110260b024002402013410a490d0020020d010b200320153602d811200341e0046a200341d8116a10db03200341b00c6a200341800a6a200341e0046a2005200b410110d703024020032d00b00c22014104470d00200341b0056a200b370300200341a0056a20073c000020034198056a200837030020034190056a200cad422086200642ffffffff0f838437030020034188056a201037030020034184056a200f36020020034182056a20143b0100200341f9046a200341980a6a290300370000200341f1046a200341900a6a290300370000200341e9046a200341800a6a41086a290300370000200320053703a805200320032903800a3700e1042003200a3a008105200341003a00e0042015200341e0046a10e904200341043a00b0030c4e0b20032d00b10c210220032d00b20c210f20032d00b30c211320032802b40c2116200341b0036a41086a200341b00c6a41086a280200360200200320163602b403200320133a00b3032003200f3a00b203200320023a00b103200320013a00b0030c4c0b200341b0036a411410ff0220032d00b00322014104460d4c0c4b0b20012001280200417f6a22133602000240024002400240200241ff0171450d00024020130d002001280208200128020c2802001103000240200128020c280204450d00200128020810260b20012001280204417f6a220236020420020d00200110260b200341e0046a200f10e20420032802e804211320032802e004210141002102200341dc116a41003a0000200341003602d811200341d0026a20012013200341d8116a4105410010810220032802d002450d01200320032802d4022202410520024105491b3602840a2003200341d8116a3602800a200341c8026a200341800a6a108f0120032802cc02211320032802c8024521020c020b024020130d002001280208200128020c2802001103000240200128020c280204450d00200128020810260b20012001280204417f6a220236020420020d00200110260b200341023a00b00c0c020b0b024020032802e404450d00200110260b024002402013410a490d0020020d010b200341ec046a200e360200200341e8046a200d360200200320123602e404200341023a00e004200f200341e0046a10e904200341043a00b00c0c4b0b200341b00c6a411410ff020b0240200d450d00201210260b20032d00b00c22014104460d4920032f00b10c210220032d00b30c210f200020032902b40c3700242000200f3a0023200020023b0021200041206a20013a0000200041186a41003a00002000420037030820004201370300200424000f0b200341e0046a41206a200241206a290200370300200341e0046a41186a200241186a290200370300200341e0046a41106a200241106a290200370300200341e0046a41086a200241086a290200370300200320022902003703e0044102210102400240200341e0046a10b1040d00200341c0046a41186a22014200370300200341c0046a41106a22024200370300200341c0046a41086a220f4200370300200342003703c00420034180086a41f58cc700410c10fb01200f20034180086a41086a29000037030020032003290080083703c004200341a8096a41d4e6c600410910fb012001200341a8096a41086a290300370300200220032903a809370300200341d8026a200341c0046a412041d4c0c700410041001081024103210120032802d8024101470d010b200041103b002120004200370308200041206a20013a0000200041186a41003a0000200041cc8dc600ad4280808080b0028437002420004201370300200424000f0b200341c0046a41186a4200370300200341d0046a4200370300200341c0046a41086a22014200370300200342003703c00420034180086a41f58cc700410c10fb01200120034180086a41086a29000037030020032003290080083703c004200341a8096a41d4e6c600410910fb01200241086a200341a8096a41086a290300370100200220032903a809370100200341013a00b003200341c0046a4120200341b0036a410110b301200041186a41003a000020004200370308200020032800c8093600192000411c6a200341cb096a28000036000020004200370300200424000f0b200141206a280200210c2001411c6a2802002115200141186a2802002111200141146a2802002112200141106a280200210e2001410c6a280200210d200141086a280200211820012d0005211420012d00042117200341e00e6a41206a2201200241206a290200370300200341e00e6a41186a220f200241186a290200370300200341e00e6a41106a2213200241106a290200370300200341e00e6a41086a2216200241086a290200370300200320022902003703e00e0240024002400240024002400240024020170e080001020304050607000b200341e0046a41146a4101360200200342013702e404200341dcedc6003602e004200341043602dc09200341d4edc6003602d8092003200341d8096a3602f004200341e0046a41ecc0c700103d000b200341e0046a41206a2001290300370300200341e0046a41186a200f290300370300200341e0046a41106a2013290300370300200341e0046a41086a2016290300370300200320032903e00e3703e004024002400240200341e0046a10cd030d00201241808080054b0d01200c4180a0014b0d02200320123602b80c2003200e3602b40c2003200d3602b00c2003200c3602e804200320153602e404200320113602e004200341800a6a2018201441ff0171410047200341b00c6a200341e0046a1094020c4f0b200341023a00800a0c4d0b200341800a6a41041096020c4c0b200341800a6a41051096020c4b0b200341e0046a41206a2001290300370300200341e0046a41186a200f290300370300200341e0046a41106a2013290300370300200341e0046a41086a2016290300370300200320032903e00e3703e004024002400240200341e0046a10cd03450d0041022101200341023a00b00c0c010b200341b00c6a2018109b0220032d00b00c22014104460d010b20032f00b10c210220032d00b30c210f200020032902b40c3700242000200f3a0023200020023b0021200041206a20013a0000200041186a41003a00002000420037030820004201370300200424000f0b20004200370308200020032800800a360019200041186a41003a00002000411c6a200341830a6a28000036000020004200370300200424000f0b200341e0046a41206a2001290300370300200341e0046a41186a200f290300370300200341e0046a41106a2013290300370300200341e0046a41086a2016290300370300200320032903e00e3703e0040240200341e0046a10cd03450d0020004200370308200041206a41023a0000200041186a41003a000020004201370300200424000f0b200341a0086a41186a22014200370300200341b0086a22024200370300200341a0086a41086a220f4200370300200342003703a00820034180086a41818dc700410910fb01200f20034180086a41086a29000037030020032003290080083703a008200341a8096a41b8d5c000410b10fb012001200341a8096a41086a290300370300200220032903a809370300200320183602e004200341a0086a4120200341e0046a410410b301200041186a41003a000020004200370308200020032800d8093600192000411c6a200341db096a28000036000020004200370300200424000f0b200341e0046a41206a2001290300370300200341e0046a41186a200f290300370300200341e0046a41106a2013290300370300200341e0046a41086a2016290300370300200320032903e00e3703e004200341b00c6a200341e0046a10d602200341c0046a41086a200341b90c6a290000370300200341c0046a41106a200341c10c6a290000370300200341c0046a41186a200341c90c6a290000370300200320032900b10c3703c004024002400240024020032d00b00c4101460d00200341800a6a41186a200341c0046a41186a290300370300200341800a6a41106a200341c0046a41106a290300370300200341800a6a41086a200341c0046a41086a290300370300200320032903c0043703800a200341e0046a200341800a6a4280a0e5b9c29101420010d90220032d00e00422014104470d01200e41808080054b0d0220154180a0014b0d03200341a0086a41186a22014200370300200341a0086a41106a22024200370300200341a0086a41086a220f4200370300200342003703a00820034180086a41818dc700410910fb01200f20034180086a41086a221329000037030020032003290080083703a008200341a8096a41a0d7c000410a10fb012001200341a8096a41086a2216290300370300200220032903a809370300200341e0026a200341a0086a412010890220032802e402211720032802e002210c2001420037030020024200370300200f4200370300200342003703a00820034180086a41818dc700410910fb01200f201329000037030020032003290080083703a008200341a8096a41a0d7c000410a10fb0120012016290300370300200220032903a8093703002003201741e807200c1b220141016a3602e004200341a0086a4120200341e0046a410410b3012003200e3602b80c2003200d3602b40c200320183602b00c200320153602e804200320113602e404200320123602e004200341b0036a20014101200341b00c6a200341e0046a109402200341e0046a41186a200341800a6a41186a290300370300200341e0046a41106a200341800a6a41106a290300370300200341e0046a41086a2202200341800a6a41086a290300370300200320032903800a3703e004200341b00c6a200110a10220032802b00c220f20032802b80c200341e0046a108d05024020032802b40c450d00200f10260b20022001360200200341003602e404200341073a00e004200341e0046a108702200341043a00d8110c4b0b200341023a00d8110c490b20032802e404210220032d00e304210f20032d00e204211320032d00e1042116200341d8116a41086a200341e0046a41086a280200360200200320023602dc112003200f3a00db11200320133a00da11200320163a00d911200320013a00d8110c480b200341d8116a41041096020c470b200341d8116a41051096020c460b200341e0046a41206a2001290300370300200341e0046a41186a200f290300370300200341e0046a41106a2013290300370300200341e0046a41086a2016290300370300200320032903e00e3703e004200341b00c6a200341e0046a10d602024020032d00b00c4101470d0020004200370308200041206a41023a0000200041186a41003a000020004201370300200424000f0b20004200370308200020032800b904360019200041186a41003a00002000411c6a200341bc046a28000036000020004200370300200424000f0b200341e0046a41206a2001290300370300200341e0046a41186a200f290300370300200341e0046a41106a2013290300370300200341e0046a41086a2016290300370300200320032903e00e3703e004200341f8026a200341e0046a10f80420032802f8020d1e200341e0046a20032802fc02221310950220032802e004220220032802e804109c0241ff01712101024020032802e404450d00200210260b41022001410171200141024622011b210220010d1f024020024101710d00200341b0036a41031096020c420b200341e0046a2013109b02024020032d00e00422014104470d00200341a0086a41186a222a4200370300200341a0086a41106a22264200370300200341a0086a41086a22014200370300200342003703a00820034180086a41818dc700410910fb01200120034180086a41086a29000037030020032003290080083703a008200341a8096a4190d8c000410a10fb01202a200341a8096a41086a290300370300202620032903a809370300200341e0046a200341a0086a10fe0120032802e0042201410420011b2127024020032902e404420020011b2205422088a72229450d0020272029410c6c6a21282027212c03400240202c41086a222d2802002217450d00202c2802002101410021024100210f034002400240024020132001280200460d0020020d01410021020c020b200241016a21020c010b200f20026b221620174f0d26200341e0046a41206a221820012002415c6c6a221641206a2211280200360200200341e0046a41186a220d201641186a220e290200370300200341e0046a41106a2212201641106a2215290200370300200341e0046a41086a220c201641086a2214290200370300200320162902003703e004200141206a220a2802002109200141186a221d2902002110200141106a221e2902002106200141086a222b290200210b201620012902003702002014200b37020020152006370200200e201037020020112009360200200a2018280200360200201d200d290300370200201e2012290300370200202b200c290300370200200120032903e0043702000b200141246a21012017200f41016a220f470d000b2002450d00202d280200201720026b2201490d00202d20013602000b202c410c6a222c2028470d000b0b200320273602e004200320053702e404202a420037030020264200370300200341a0086a41086a22014200370300200342003703a00820034180086a41818dc700410910fb01200120034180086a41086a29000037030020032003290080083703a008200341a8096a4190d8c000410a10fb01202641086a200341a8096a41086a290300370300202620032903a809370300200341a0086a200341e0046a1080022005a7211602402029450d002029410c6c21022027210103400240200141046a280200220f450d00200f41246c450d00200128020010260b2001410c6a2101200241746a22020d000b0b02402016450d002016410c6c450d00202710260b200341a0086a41186a222e4200370300200341a0086a41106a222f4200370300200341a0086a41086a22294200370300200342003703a00820034180086a41818dc700410910fb01202920034180086a41086a223029000037030020032003290080083703a008200341a8096a41dcd5c000410f10fb01202641086a2231200341a8096a41086a2232290300370300202620032903a809370300200341e0046a200341a0086a10fe0120032802e0042201410420011b2127024020032902e404420020011b2205422088a7222a450d002027202a410c6c6a21282027212c03400240202c41086a222d2802002217450d00202c2802002101410021024100210f034002400240024020132001280200460d0020020d01410021020c020b200241016a21020c010b200f20026b221620174f0d27200341e0046a41206a221820012002415c6c6a221641206a2211280200360200200341e0046a41186a220d201641186a220e290200370300200341e0046a41106a2212201641106a2215290200370300200341e0046a41086a220c201641086a2214290200370300200320162902003703e004200141206a220a2802002109200141186a221d2902002110200141106a221e2902002106200141086a222b290200210b201620012902003702002014200b37020020152006370200200e201037020020112009360200200a2018280200360200201d200d290300370200201e2012290300370200202b200c290300370200200120032903e0043702000b200141246a21012017200f41016a220f470d000b2002450d00202d280200201720026b2201490d00202d20013602000b202c410c6a222c2028470d000b0b200320273602e004200320053702e404202e4200370300202f420037030020294200370300200342003703a00820034180086a41818dc700410910fb012029203029000037030020032003290080083703a008200341a8096a41dcd5c000410f10fb0120312032290300370300202620032903a809370300200341a0086a200341e0046a1080022005a721160240202a450d00202a410c6c21022027210103400240200141046a280200220f450d00200f41246c450d00200128020010260b2001410c6a2101200241746a22020d000b0b02402016450d002016410c6c450d00202710260b200341b8086a220d4200370300200341b0086a220e4200370300200341a0086a41086a22174200370300200342003703a00820034180086a41818dc700410910fb01201720034180086a41086a221229000037030020032003290080083703a008200341a8096a41acd6c000410610fb01202641086a2215200341a8096a41086a220c290300370300202620032903a809370300200341e0046a200341a0086a10fd0120032902e404420020032802e00422011b2210422088a72216412c6c21112001410420011b211802402016450d0020112102201821010340024020012802002013470d00200141246a220f2802004102460d00200f41003602000b2001412c6a2101200241546a22020d000b0b200d4200370300200e420037030020174200370300200342003703a00820034180086a41818dc700410910fb012017201229000037030020032003290080083703a008200341a8096a41acd6c000410610fb012015200c290300370300202620032903a8093703002016412c6c41046a2201417f4c0d0a0240024020010d0041012102410021010c010b200110242202450d730b200341003602e804200320023602e004200320013602e404200341e0046a201610a10102402016450d00201820116a211620182101034020012802002102200341e0046a20032802e8044104106d20032802e00420032802e804220f6a20023600002003200f41046a3602e804200141046a200341e0046a10ba012001412c6a22012016470d000b0b200341a0086a412020032802e004220120032802e80410b301024020032802e404450d00200110260b02402010a72201450d002001412c6c450d00201810260b200341800a6a201310a102200341e0046a20032802800a220120032802880a220210b803024002400240024020032d00e004220f0d00200341b8086a200341f9046a290000370300200341b0086a200341f1046a290000370300200341a8086a200341e9046a290000370300200320032900e1043703a0080c010b2001200210ff01200341a0086a41186a2202200341f9046a290000370300200341a0086a41106a2216200341f1046a290000370300200341a0086a41086a2217200341e9046a290000370300200320032900e1043703a008200f4101460d010b200341c80c6a4200370300200341c00c6a4200370300200341b80c6a4200370300200342003703b00c0c010b200341b00c6a41186a2002290300370300200341b00c6a41106a2016290300370300200341b00c6a41086a2017290300370300200320032903a0083703b00c0b024020032802840a450d00200110260b200341e8026a200341b00c6a4280a0e5b9c29101420010da02200341e8046a2013360200200341003602e404200341073a00e004200341e0046a108702200341043a00b0030c440b20032802e404210220032d00e304210f20032d00e204211320032d00e1042116200341b0036a41086a200341e0046a41086a280200360200200320023602b4032003200f3a00b303200320133a00b203200320163a00b103200320013a00b0030c410b200341e0046a41206a2001290300370300200341e0046a41186a200f290300370300200341e0046a41106a2013290300370300200341e0046a41086a2016290300370300200320032903e00e3703e00420034188036a200341e0046a10f804410221012003280288030d21200328028c032102200341e0046a201810a30220034180036a20032802e004221320032802e804108902200328028403210f2003280280032101024020032802e404450d00201310260b024020014101470d0041002101200f2002460d220b200341e0046a200210a30220032802e804210220032802e0042101200320183602b00c20012002200341b00c6a410410b301024020032802e404450d00200110260b20004200370308200020032800c809360019200041186a41003a00002000411c6a200341cb096a28000036000020004200370300200424000f0b41012113200241206a3301002110200241186a2902002106200241106a290200210b200241086a2902002105200241046a2802002111200241026a2f0100210d200141086a28020021152002280224210f20022d0001211420022d00002116024020012f01044101470d002001410c6a2902002107410121020240201641ff01714101460d0041002102410221010240024020140e03000102000b41002101410021020c010b410121010b200f280200221341016a41014d0d22200341e0046a41106a200b370300200341e8046a2005370300200f201341016a360200200341e0046a41186a2006370300200341e0046a41206a20103d01002003200f36028405200320113602e4042003200d3b01e204200320013a00e104200320023a00e00420152007422088a7221341b0026c22176a2102200341e0046a10cd03210e2007a7211d20152101024002402013450d00201741d07d6a2113200341e00e6a410472210a200341e0046a4104722109201641ff01712112200341d8116a41186a211e200341d8116a41106a212b200341d8116a41206a212c4100211820152101034020012802002116200341e00e6a200141046a221741ac0210cf061a200341e0046a201741ac0210cf061a024020164117470d00200141b0026a21010c410b200341800a6a200341e0046a41ac0210cf061a200341b00c6a200341800a6a41ac0210cf061a02400240200e450d00200320163602e00e200a200341b00c6a41ac0210cf061a41012117024020124101460d0041002117410221160240024020140e03000102000b41002116410021170c010b410121160b200f28020041016a220c41014d0d27200f200c3602000240200f280208200341e00e6a200f28020c28020c110100450d00200341e0046a200341e00e6a41b00210cf061a201e2006370300202b200b370300202c20103d0100200320053703e0112003200f3602fc11200320113602dc112003200d3b01da11200320163a00d911200320173a00d811200341b0036a200341e0046a200341d8116a10a3030c020b200f200f280200417f6a2216360200200341023a00d003200341003a00c803200342003703b803200342013703b003024020160d00200f280208200f28020c2802001103000240200f28020c280204450d00200f28020810260b200f200f280204417f6a221636020420160d00200f10260b200341e00e6a1098030c010b200320163602e0042009200341b00c6a41ac0210cf061a41012117024020124101460d0041002117410221160240024020140e03000102000b41002116410021170c010b410121160b200f28020041016a220c41014d0d26200341e00e6a41106a200b370300200f200c360200200341e00e6a41186a2006370300200341e00e6a41206a20103d0100200320053703e80e2003200f3602840f200320113602e40e2003200d3b01e20e200320163a00e10e200320173a00e00e200341b0036a200341e0046a200341e00e6a10a3030b20032903b0034201510d02201841016a2118201341d07d6a2113200141b0026a22012002470d000b200221010b200341e0046a200341e00e6a41ac0210cf061a0c3e0b200341e00e6a41206a200341d8036a2903002210370300200341e00e6a41186a200341b0036a41206a2903002206370300200341e00e6a41106a200341b0036a41186a290300370300200341e00e6a41086a200341b0036a41106a290300370300200320032903b8033703e00e200341e0046a41086a2006370300200341e0046a41106a20103e0200200320183602e404200341083a00e004200341e0046a10870202402013450d00200141b0026a21010340200110d501200141b0026a2101201341d07d6a22130d000b0b0240201d450d00201d41b0026c450d00201510260b200f200f280200417f6a220136020020010d3f200f280208200f28020c2802001103000240200f28020c280204450d00200f28020810260b200f200f280204417f6a220136020420010d3f0c3e0b200141066a2f010021170240201641ff01714101460d0041002113410221010240024020140e03000102000b41002101410021130c010b410121010b200f28020041016a220241014d0d21200341e0046a41106a2216200b370300200341e0046a41086a22182005370300200f2002360200200341e0046a41186a22022006370300200341e0046a41206a20103d01002003200f36028405200320113602e4042003200d3b01e204200320013a00e104200320133a00e004200341e00e6a200341e0046a10d602024020032d00e00e4101460d00200341e00e6a41186a2903002110200341e00e6a41086a2903002106200341e00e6a41106a2802002101200341f40e6a280200211320032d00e10e211120032f01e20e210d20032802e40e210e200341ff076a200341e00e6a41206a3100003c0000200320063700e7072003200e3600e3072003200d3b00e107200320113a00e007200320103700f707200320013600ef07200320133600f3072002200341e0076a41186a2900003703002016200341e0076a41106a2900003703002018200341e0076a41086a290000370300200320032900e0073703e004411210242201450d70200342123702e40e200320013602e00e200341e00e6a41004110106d20032802e00e20032802e80e22016a220241002900ccb745370000200241086a41002900d4b7453700002003200141106a22013602e80e200341e00e6a20014120106d20032802e00e20032802e80e22026a220120032903e004370000200141086a200341e0046a41086a290300370000200141106a200341e0046a41106a290300370000200141186a200341e0046a41186a2903003700002003200241206a22013602e80e200341e00e6a20014102106d20032802e00e220120032802e80e22026a20173b00002003200241026a22023602e80e20034180086a20012002109601024020032802e40e450d00200110260b200320032d0080083a00e00420032003290081083700e10420032003290089083700e90420032003290091083700f10420032003280099083600f904200320032f009d083b00fd04200320032d009f083a00ff04200341203a008005200341e00e6a41086a20032903e8042210370300200341e00e6a41106a20032903f0042206370300200341e00e6a41186a220120032903f804370300200320032903e004220b3703e00e200341c0046a41106a2006370300200341c0046a41086a2010370300200341c0046a41186a20012903003703002003200b3703c004200341de046a3301002110200341d6046a2901002106200341ce046a290100210b20032901c604210520032801c204211620032f01c0042117411010242201450d07200141b889c70036020c200141013602082001428180808010370200411010242202450d07200241d089c70036020c20024101360208200242818080801037020020012001280200417f6a2213360200024020130d002001280208200128020c2802001103000240200128020c280204450d00200128020810260b20012001280204417f6a221336020420130d00200110260b20022002280200417f6a2201360200024020010d002002280208200228020c2802001103000240200228020c280204450d00200228020810260b20022002280204417f6a220136020420010d00200210260b200341e00e6a201541b00210cf061a02400240200f280208200341e00e6a200f28020c28020c110100450d00200341e0046a200341e00e6a41b00210cf061a200341980a6a2006370300200341900a6a200b370300200341880a6a2005370300200341a00a6a20103d01002003200f3602a40a200320163602840a200320173b01820a20034180023b01800a200341b00c6a200341e0046a200341800a6a10a30320032903b00c4201510d010c3c0b200341d00c6a41023a0000200341c80c6a41003a0000200f200f280200417f6a2201360200200342003703b80c200342013703b00c024020010d00200f280208200f28020c2802001103000240200f28020c280204450d00200f28020810260b200f200f280204417f6a220136020420010d00200f10260b200341e00e6a1098030b200341e8046a200341b00c6a41186a290300370300200341e0046a41106a2201200341d00c6a290300370300200341e0046a41186a2202200341d80c6a2903003703002003200341b00c6a41106a2903003703e00420032903b80c4202510d3a200341a0086a41106a20012903002206370300200341a0086a41186a200229030037030020032d00b108210220032d00b208210f20032d00b308211320032902b40821102006a721010c3b0b200f200f280200417f6a2203360200024020030d00200f280208200f28020c2802001103000240200f28020c280204450d00200f28020810260b200f200f280204417f6a220336020420030d00200f10260b201510980320151026410221010c3b0b200341e0046a200141086a41a80210cf061a200341e00e6a41206a200241206a290200370300200341e00e6a41186a200241186a290200370300200341e00e6a41106a200241106a290200370300200341e00e6a41086a200241086a290200370300200320022902003703e00e2000200341e0046a200341e00e6a10d202200424000f0b200341e0046a200141046a41c40010cf061a200341e00e6a41206a200241206a290200370300200341e00e6a41186a200241186a290200370300200341e00e6a41106a200241106a290200370300200341e00e6a41086a200241086a290200370300200320022902003703e00e2000200341e0046a200341e00e6a10cb03200424000f0b200320012800293602d81120032001412c6a2800003600db11200141286a3100002110200141206a2900002106200141386a2903002105200141306a2903002107200141c8006a2903002108200141c0006a2903002119200141d8006a290300211b200141e8006a290300211c200141e0006a290300211f2001411c6a2800002118200141186a2800002111200141106a290000210b2001410c6a280000210d200141086a2d0000210f200141f0006a2802002115200141d0006a290300211a20012f000a210e20012d00092112200341e00e6a41206a2201200241206a290200370300200341e00e6a41186a2213200241186a290200370300200341e00e6a41106a2216200241106a290200370300200341e00e6a41086a2217200241086a290200370300200320022902003703e00e02400240024002400240200f0e050001020304000b200341f4046a4101360200200342013702e404200341dcedc6003602e004200341043602840a200341d4edc6003602800a2003200341800a6a3602f004200341e0046a41ecc0c700103d000b200341e0046a41206a2001290300370300200341e0046a41186a2013290300370300200341e0046a41106a2016290300370300200341e0046a41086a2017290300370300200320032903e00e3703e004200341b00c6a200341e0046a10d602200341c0046a41086a200341b90c6a290000370300200341c0046a41106a200341c10c6a290000370300200341c0046a41186a200341c90c6a290000370300200320032900b10c3703c00402400240024020032d00b00c4101470d0041022101200341023a00800a0c010b200341a0086a41186a200341c0046a41186a2903002210370300200341a0086a41106a200341c0046a41106a2903002206370300200341a0086a41086a200341c0046a41086a290300220b370300200320032903c00422053703a008200341e0046a41186a2010370300200341e0046a41106a2006370300200341e0046a41086a200b370300200320053703e004200341800a6a200341e0046a10a40420032d00800a22014104460d010b20032f00810a210220032d00830a210f200020032902840a3700242000200f3a0023200020023b0021200041206a20013a0000200041186a41003a00002000420037030820004201370300200424000f0b20004200370308200020032800c809360019200041186a41003a00002000411c6a200341cb096a28000036000020004200370300200424000f0b200341e0046a41206a2001290300370300200341e0046a41186a2013290300370300200341e0046a41106a2016290300370300200341e0046a41086a2017290300370300200320032903e00e3703e004200341b00c6a200341e0046a10d60202400240024020032d00b00c4101470d0041022101200341023a00800a0c010b200341df046a20103c0000200320113600cf042003200b3700c704200341e0046a41086a200341c0046a41086a290300370300200320063700d704200320183600d304200341e0046a41106a200341c0046a41106a290300370300200341e0046a41186a200341c0046a41186a2903003703002003200d3600c3042003200e3b00c104200320123a00c004200320032903c0043703e004200341800a6a200341e0046a10a40420032d00800a22014104460d010b20032f00810a210220032d00830a210f200020032902840a3700242000200f3a0023200020023b0021200041206a20013a0000200041186a41003a00002000420037030820004201370300200424000f0b20004200370308200020032800b904360019200041186a41003a00002000411c6a200341bc046a28000036000020004200370300200424000f0b200341ff076a20103c0000200320063700f707200320183600f307200320113600ef072003200b3700e7072003200d3600e3072003200e3b00e107200320123a00e007200341e0046a41206a2001290300370300200341e0046a41186a2013290300370300200341e0046a41106a2016290300370300200341e0046a41086a2017290300370300200320032903e00e3703e004200341b00c6a200341e0046a10d602200341a0086a41086a200341b90c6a290000370300200341a0086a41106a200341c10c6a290000370300200341a0086a41186a200341c90c6a290000370300200320032900b10c3703a0080240024002400240024020032d00b00c4101460d00200341800a6a41186a200341a0086a41186a290300370300200341800a6a41106a200341a0086a41106a290300370300200341800a6a41086a200341a0086a41086a290300370300200320032903a0083703800a02402007428080e983b1de165441002005501b450d00410321020c020b200341e0046a41086a200341e0076a41086a290000370300200341e0046a41106a200341e0076a41106a290000370300200341e0046a41186a200341e0076a41186a290000370300200320032900e0073703e004200341b00c6a200341e0046a10a50420034190036a20032802b00c220120032802b80c41d4c0c700410041001081022003280290032102024020032802b40c450d00200110260b41012101024020024101470d004117210f41c5a1c300211341152103410321020c030b200341b00c6a200341800a6a200341e0046a20072005410110d703024020032d00b00c22024104460d00200341b80c6a280200210f20032802b40c211320032d00b30c211620032d00b20c210120032d00b10c21030c040b200341b0036a200341e0046a2007200520192008201aa710a90420032d00b0034104460d04200341b00c6a41086a200341b0036a41086a280200360200200320032903b0033703b00c41f990c4004137200341b00c6a41b091c40041c091c4001036000b410221020b4109210f41e6a1c300211341022101411521030b0b200020163a0023200020013a0022200020033a002120004200370308200041206a20023a0000200041186a41003a00002000200fad4220862013ad8437002420004201370300200424000f0b200041186a41003a000020004200370308200020032800c8093600192000411c6a200341cb096a28000036000020004200370300200424000f0b2003419f086a20083c00002003418f086a200537000020032019370097082003200737008708200320032800db1136008308200320032802d81136028008200341e0046a41206a2001290300370300200341e0046a41186a2013290300370300200341e0046a41106a2016290300370300200341e0046a41086a2017290300370300200320032903e00e3703e00441022102410221010240024002400240200341e0046a10cd030d0041032101201a428080e983b1de16544100201b501b0d00200341b00c6a41086a20034180086a41086a290300370300200341b00c6a41106a20034180086a41106a290300370300200341b00c6a41186a20034180086a41186a29030037030020032003290380083703b00c200341df046a20103c0000200320113600cf042003200b3700c704200341e0046a41086a200341c0046a41086a290300370300200320063700d704200320183600d304200341e0046a41106a200341c0046a41106a290300370300200341e0046a41186a200341c0046a41186a2903003703002003200d3600c3042003200e3b00c104200320123a00c004200320032903c0043703e004200341800a6a200341b00c6a10a50420034198036a20032802800a220220032802880a41d4c0c700410041001081022003280298032101024020032802840a450d00200210260b41012102024020014101470d004117210f41c5a1c300211341152103410321010c020b200341800a6a200341e0046a200341b00c6a201a201b410110d703024020032d00800a22014104460d00200341880a6a280200210f20032802840a211320032d00830a211620032d00820a210220032d00810a21030c030b200341b0036a200341b00c6a201a201b201f201c201510a90420032d00b0034104460d03200341800a6a41086a200341b0036a41086a280200360200200320032903b0033703800a41f990c4004137200341800a6a41b091c40041d091c4001036000b4109210f41e6a1c3002113411521030b0b200020163a0023200020023a0022200020033a002120004200370308200041206a20013a0000200041186a41003a00002000200fad4220862013ad8437002420004201370300200424000f0b200041186a41003a000020004200370308200020032800c8093600192000411c6a200341cb096a28000036000020004200370300200424000f0b200241206a3301002110200241186a2902002106200241106a290200210b200241086a2902002105200241046a2802002113200241026a2f01002116200141246a280200210e2001411c6a2902002107200141186a2802002117200141146a2802002115200141106a28020021122001410c6a2802002118200141086a280200210d2002280224210f20022d0001211120022d0000210220012d0005210c024002400240024002400240024020012d00040e0700010203040506000b200341e0046a41146a4101360200200342013702e404200341dcedc6003602e004200341043602840a200341d4edc6003602800a2003200341800a6a3602f004200341e0046a41ecc0c700103d000b4101210e0240200241ff01714101460d004100210e410221010240024020110e03000102000b410021014100210e0c010b410121010b200f280200221441016a41014d0d22200341f0046a200b370300200341e8046a2005370300200f201441016a360200200341f8046a200637030020034180056a20103d01002003200f36028405200320133602e404200320163b01e204200320013a00e1042003200e3a00e0040240200341e0046a10d302450d00201710980320171026200f200f280200417f6a22033602004102210120030d39200f280208200f28020c2802001103000240200f28020c280204450d00200f28020810260b200f200f280204417f6a220336020420030d39200f10260c3a0b02400240200241ff01714101460d004102210102400240024020110e03000102000b410021010c010b200341ce046a200b370100200341d6046a2006370100200341de046a20103d0100200320053701c604200320133601c204200320163b01c004410121010b200341ea0e6a200341c8046a290300370100200341f20e6a200341d0046a290300370100200341fa0e6a200341d8046a290300370100200320013a00e10e200320032903c0043701e20e200341003a00e00e0c010b200341013a00e00e200320133602e40e0b200341e0046a201741b00210cf061a200341b00c6a4100200d201820122015200c200341e00e6a200341e0046a10aa04200341b80c6a290300211020032d00b40c210120032d00b50c211620032d00b60c211320032d00b70c210220032802b00c2118200f200f280200417f6a2211360200024020184101460d00024020110d00200f280208200f28020c2802001103000240200f28020c280204450d00200f28020810260b200f200f280204417f6a220136020420010d00200f10260b201710260c380b024020110d00200f280208200f28020c2802001103000240200f28020c280204450d00200f28020810260b200f200f280204417f6a221836020420180d00200f10260b20171026200141ff01714104460d370c390b410121170240200241ff01714101460d0041002117410221010240024020110e03000102000b41002101410021170c010b410121010b200f280200220e41016a41014d0d21200341f0046a200b370300200341e8046a200537030041012112200f200e41016a360200200341f8046a200637030020034180056a20103d01002003200f36028405200320133602e404200320163b01e204200320013a00e104200320173a00e0040240200341e0046a10d302450d00200f200f280200417f6a22033602004102211620030d35200f280208200f28020c2802001103000240200f28020c280204450d00200f28020810260b200f200f280204417f6a220336020420030d35200f10260c360b0240200241ff01714101460d00410021124102210e0240024020110e03000102000b4100210e410021120c010b4101210e0b200341d8116a200d10dd03200341e0046a20032802d811221120032802e011221510de0320032902e404210720032802e0042101200341a4076a4102360200200341003602e0042001410820011b2117024020182007420020011b2207422088a72202490d00200341b00c6a41086a200341d0076a2903003703002003200341c8076a2903003703b00c200341a0076a2903002206422088a72112200341c0076a2903002105200341b8076a2903002108200341b0076a2903002119200341a8076a290300211a20034198076a290300210b20034190076a290300211b20034188076a290300211c20034180076a290300211f200341f8066a2903002120200341f0066a2903002121200341e8066a2903002122200341e0066a2903002123200341d8066a2903002124200341d0066a2903002125200341c8066a2903002133200341c0066a2903002134200341b8066a2903002135200341b0066a2903002136200341a8066a2903002137200341a0066a290300213820034198066a290300213920034190066a290300213a20034188066a290300213b20034180066a290300213c200341f8056a290300213d200341f0056a290300213e200341e8056a290300213f200341e0056a2903002140200341d8056a2903002141200341d0056a2903002142200341c8056a2903002143200341c0056a2903002144200341b8056a2903002145200341b0056a2903002146200341a8056a2903002147200341a0056a290300214820034198056a290300214920034190056a290300214a20034188056a290300214b20034180056a290300214c200341f8046a290300214d200341f0046a290300214e20032903e804211020032802e40421160c330b200341f00e6a200b370300200341e00e6a41086a2005370300200341820f6a41003b0100200341e00e6a41186a2006370300200341800f6a20103d0100200320133602e40e200320163b01e20e2003200e3a00e10e200320123a00e00e20032017201841f0026c6a22013602840f20012802bc024102460d3102402012200141c8026a22162d0000470d00024020120d00200e41ff0171221320162d0001470d0120134101470d33200341e00e6a4102722213201641026a2216460d3320132016412010d2060d010c330b20132017201841f0026c6a41cc026a280200460d320b200341800a6a41086a200341b00c6a41086a290300370300200320032903b00c3703800a200241f0026c21022017210103400240200141bc026a2802004102460d000240200141b0026a2802002213450d00200141b4026a280200450d00201310260b200110d5010b200141f0026a2101200241907d6a22020d000b41012101410221164100211202402007a72202450d00200241f0026c450d00201710260b0c330b410121140240200241ff01714101460d0041002114410221010240024020110e03000102000b41002101410021140c010b410121010b200f280200220a41016a41014d0d20200341f0046a200b370300200341e8046a2005370300200f200a41016a360200200341f8046a200637030020034180056a20103d01002003200f36028405200320133602e404200320163b01e204200320013a00e104200320143a00e0040240200341e0046a10d302450d00200e109803200e102602402018450d00200d10260b200f200f280200417f6a22033602004102210120030d2f200f280208200f28020c2802001103000240200f28020c280204450d00200f28020810260b200f200f280204417f6a220336020420030d2f200f10260c300b200320123602880a200320183602840a2003200d3602800a02400240200241ff01714101460d004102210102400240024020110e03000102000b410021010c010b200341ce046a200b370100200341d6046a2006370100200341de046a20103d0100200320053701c604200320133601c204200320163b01c004410121010b200341ea0e6a200341c8046a290300370100200341f20e6a200341d0046a290300370100200341fa0e6a200341d8046a290300370100200320013a00e10e200320032903c0043701e20e200341003a00e00e0c010b200341013a00e00e200320133602e40e0b200341e0046a200e41b00210cf061a200341b00c6a200341800a6a4100201520172007a72007422088a7200c200341e00e6a200341e0046a10ac04200341b80c6a290300211020032d00b40c210120032d00b50c211620032d00b60c211320032d00b70c210220032802b00c2117200f200f280200417f6a2218360200024020174101460d00024020180d00200f280208200f28020c2802001103000240200f28020c280204450d00200f28020810260b200f200f280204417f6a220136020420010d00200f10260b200e10260c2e0b024020180d00200f280208200f28020c2802001103000240200f28020c280204450d00200f28020810260b200f200f280204417f6a221736020420170d00200f10260b200e1026200141ff01714104460d2d0c2f0b410121170240200241ff01714101460d0041002117410221010240024020110e03000102000b41002101410021170c010b410121010b200f280200220e41016a41014d0d1f200341f0046a200b370300200341e8046a200537030041012115200f200e41016a360200200341f8046a200637030020034180056a20103d01002003200f36028405200320133602e404200320163b01e204200320013a00e104200320173a00e0040240200341e0046a10d302450d0002402018450d00200d10260b200f200f280200417f6a22033602004102210120030d2b200f280208200f28020c2802001103000240200f28020c280204450d00200f28020810260b200f200f280204417f6a220336020420030d2b200f10260c2b0b0240200241ff01714101460d00410021154102210e0240024020110e03000102000b4100210e410021150c010b4101210e0b200320123602e804200320183602e4042003200d3602e004200341b0036a200341e0046a10ab04200341800a6a20032802b00320032802b80310e10420032802800a210241002117200341003602800a4103210120024101470d29200341b00c6a20032902840a2208a7221210dd03200341e0046a20032802b00c221120032802b80c220210de0320032802e0042201410820011b211820032902e404420020011b2207422088a722012008422088a7220d4d0d27200341f0046a200b370300200341e0046a41086a200537030020034182056a41003b0100200341f8046a200637030020034180056a20103d0100200320133602e404200320163b01e2042003200e3a00e104200320153a00e00420032018200d41f0026c6a22023602840520022802bc024102460d2602402015200241c8026a22162d0000470d00024020150d00200e41ff0171221320162d0001470d0120134101470d28200341e0046a4102722213201641026a2216460d2820132016412010d2060d010c280b20132018200d41f0026c6a41cc026a280200460d270b200141f0026c21022018210103400240200141bc026a2802004102460d000240200141b0026a2802002213450d00200141b4026a280200450d00201310260b200110d5010b200141f0026a2101200241907d6a22020d000b410221012007a72202450d28200241f0026c450d28201810260c280b4101210e0240200241ff01714101460d004100210e410221010240024020110e03000102000b410021014100210e0c010b410121010b200f280200221441016a41014d0d1e200341f0046a200b370300200341e8046a2005370300200f201441016a360200200341f8046a200637030020034180056a20103d01002003200f36028405200320133602e404200320163b01e204200320013a00e1042003200e3a00e0040240200341e0046a10d302450d00201710980320171026200f200f280200417f6a22033602004102210120030d24200f280208200f28020c2802001103000240200f28020c280204450d00200f28020810260b200f200f280204417f6a220336020420030d24200f10260c250b02400240200241ff01714101460d004102210102400240024020110e03000102000b410021010c010b200341ce046a200b370100200341d6046a2006370100200341de046a20103d0100200320053701c604200320133601c204200320163b01c004410121010b200341ea0e6a200341c8046a290300370100200341f20e6a200341d0046a290300370100200341fa0e6a200341d8046a290300370100200320013a00e10e200320032903c0043701e20e200341003a00e00e0c010b200341013a00e00e200320133602e40e0b200341e0046a201741b00210cf061a200341b00c6a4101200d201820122015200c200341e00e6a200341e0046a10aa04200341b80c6a290300211020032d00b40c210120032d00b50c211620032d00b60c211320032d00b70c210220032802b00c2118200f200f280200417f6a2211360200024020184101460d00024020110d00200f280208200f28020c2802001103000240200f28020c280204450d00200f28020810260b200f200f280204417f6a220136020420010d00200f10260b201710260c230b024020110d00200f280208200f28020c2802001103000240200f28020c280204450d00200f28020810260b200f200f280204417f6a221836020420180d00200f10260b20171026200141ff01714104460d220c240b410121140240200241ff01714101460d0041002114410221010240024020110e03000102000b41002101410021140c010b410121010b200f280200220a41016a41014d0d1d200341f0046a200b370300200341e8046a2005370300200f200a41016a360200200341f8046a200637030020034180056a20103d01002003200f36028405200320133602e404200320163b01e204200320013a00e104200320143a00e0040240200341e0046a10d302450d00200e109803200e102602402018450d00200d10260b200f200f280200417f6a22033602004102210120030d20200f280208200f28020c2802001103000240200f28020c280204450d00200f28020810260b200f200f280204417f6a220336020420030d20200f10260c210b200320123602880a200320183602840a2003200d3602800a02400240200241ff01714101460d004102210102400240024020110e03000102000b410021010c010b200341ce046a200b370100200341d6046a2006370100200341de046a20103d0100200320053701c604200320133601c204200320163b01c004410121010b200341ea0e6a200341c8046a290300370100200341f20e6a200341d0046a290300370100200341fa0e6a200341d8046a290300370100200320013a00e10e200320032903c0043701e20e200341003a00e00e0c010b200341013a00e00e200320133602e40e0b200341e0046a200e41b00210cf061a200341b00c6a200341800a6a4101201520172007a72007422088a7200c200341e00e6a200341e0046a10ac04200341b80c6a290300211020032d00b40c210120032d00b50c211620032d00b60c211320032d00b70c210220032802b00c2117200f200f280200417f6a2218360200024020174101460d00024020180d00200f280208200f28020c2802001103000240200f28020c280204450d00200f28020810260b200f200f280204417f6a220136020420010d00200f10260b200e10260c1f0b024020180d00200f280208200f28020c2802001103000240200f28020c280204450d00200f28020810260b200f200f280204417f6a221736020420170d00200f10260b200e1026200141ff01714104460d1e0c200b200341e00e6a41206a200141286a290300370300200341e00e6a41186a200141206a290300370300200341e00e6a41106a200141186a290300370300200341e00e6a41086a200141106a2903003703002003200141086a2903003703e00e200341e0046a41206a200241206a290200370300200341e0046a41186a200241186a290200370300200341e0046a41106a200241106a290200370300200341e0046a41086a200241086a290200370300200320022902003703e0042000200341e00e6a200341e0046a108c05200424000f0b20034188056a2001412c6a280200360200200341e0046a41206a200141246a290200370300200341e0046a41186a2001411c6a290200370300200341e0046a41106a200141146a290200370300200341e0046a41086a2001410c6a290200370300200320012902043703e004200341e00e6a41206a200241206a290200370300200341e00e6a41186a200241186a290200370300200341e00e6a41106a200241106a290200370300200341e00e6a41086a200241086a290200370300200320022902003703e00e2000200341e0046a200341e00e6a10da05200424000f0b102c000b1034000b41dcb7c500413041dcbcc700102f000b410221010c610b41022101200341023a00c0040c5f0b200341d8116a410110e9020c580b200341d8116a410510e9020c570b200341d8116a410210e9020c560b200341b00c6a410110e9020c4f0b200341b00c6a410510e9020c4e0b410221010c510b2000420037002420004200370308200041206a41023a0000200041186a41003a000020004201370300200424000f0b200341b0036a410110e9020c450b200341b0036a410510e9020c440b42002110410221010c470b20034198086a2201420037030020034180086a41106a2217420037030020034180086a41086a221842003703002003420037038008200341d8096a419a8cc700410810fb012018200341d8096a41086a220d290300370300200320032903d80937038008200341d8116a41b8a1c300410d10fb012001200341d8116a41086a220e290300370300201720032903d811370300200341c8016a20034180086a108d02200341c8016a41106a290300211920032903d001212520032802c80121112001420037030020174200370300201842003703002003420037038008200341d8096a419a8cc700410810fb012018200d290300370300200320032903d80937038008200341d8116a41b8a1c300410d10fb012001200e290300370300201720032903d8113703002003427f2019420020111b2219201020087d2006201a54ad7d7c2025420020111b22082006201a7d7c221a2008542201ad7c22082001200820195420082019511b22011b3703e8042003427f201a20011b3703e00420034180086a4120200341e0046a411010b3010c410b20004200370308200041206a41023a0000200041186a41003a000020004201370300200424000f0b200341b00c6a410510f202200341e2096a200341b00c6a41086a280200360100200341d8116a41086a200341b0036a41086a290200370300200341d8116a41106a200341b0036a41106a2f01003b0100200320032903b00c3701da09200320032902b0033703d811200320032901d8093703a0082003200341de096a2901003701a6080c390b20034180086a410110f202200341e2096a20034180086a41086a280200360100200341d8116a41086a200341b0036a41086a290200370300200341d8116a41106a200341b0036a41106a2f01003b010020032003290380083701da09200320032902b0033703d811200320032901d8093703a0082003200341de096a2901003701a6080c380b200341b00c6a410710f202200341e2096a200341b00c6a41086a280200360100200341d8116a41086a200341b0036a41086a290200370300200341d8116a41106a200341b0036a41106a2f01003b0100200320032903b00c3701da09200320032902b0033703d811200320032901d8093703a0082003200341de096a2901003701a6080c370b200341b00c6a410610f202200341e2096a200341b00c6a41086a280200360100200341d8116a41086a200341b0036a41086a290200370300200341d8116a41106a200341b0036a41106a2f01003b0100200320032903b00c3701da09200320032902b0033703d811200320032901d8093703a0082003200341d8096a41066a2901003701a6080c360b41022101200341023a00b0030c2b0b41022101200341023a00b0030c230b200341b0036a20021096020c210b201620174198e2c4001032000b201620174198e2c4001032000b20004200370308200041206a20013a0000200041186a41003a0000200041b0b0c000ad428080808090028437002420004201370300200424000f0b00000b20004200370308200020032800c809360019200041186a41003a00002000411c6a200341cb096a28000036000020004200370300200424000f0b0b20002010370024200020023a0023200020133a0022200020163a002120004200370308200041206a20013a0000200041186a41003a000020004201370300200424000f0b20004200370308200020032800c809360019200041186a41003a00002000411c6a200341cb096a28000036000020004200370300200424000f0b0b20002010370024200020023a0023200020133a0022200020163a002120004200370308200041206a20013a0000200041186a41003a000020004201370300200424000f0b0240200241bc026a22132802004102460d0002402018200d41f0026c6a22162802b0022211450d00201641b4026a280200450d00201110260b20021098030b2002200341e0046a41bc0210cf061a201341023602002018200d41f0026c6a220241e8026a200341880f6a290300370300200241e0026a200341800f6a290300370300200241d8026a200341f80e6a290300370300200241d0026a200341f00e6a290300370300200241c8026a200341e80e6a290300370300200220032903e00e3703c00220032802b00c211120032802b80c21020b200320183602e004200320073702e40420112002200341e0046a10d5052007a7211602402001450d00200141f0026c21022018210103400240200141bc026a2802004102460d000240200141b0026a2802002213450d00200141b4026a280200450d00201310260b200110d5010b200141f0026a2101200241907d6a22020d000b0b02402016450d00201641f0026c450d00201810260b410421010b024020032802b40c450d00201110260b20014104470d00200341e8046a20123602002003410c3a00e004200341e0046a410c6a200d36020041012117200341013602e404200341e0046a10870220032802b803210120032802b00321020240024020032802800a4101460d002002200110ff010c010b20022001200341800a6a41047210ad040b410421010b024020032802b403450d0020032802b00310260b200f200f280200417f6a220236020002402017450d0020020d02200f280208200f28020c2802001103000240200f28020c280204450d00200f28020810260b200f200f280204417f6a220136020420010d02200f10260c020b024020020d00200f280208200f28020c2802001103000240200f28020c280204450d00200f28020810260b200f200f280204417f6a220236020420020d00200f10260b20014104460d010b200041f5ecc30036002420004196023b002120004200370308200041286a410e360000200041206a20013a0000200041186a41003a000020004201370300200424000f0b20004200370308200020032800b904360019200041186a41003a00002000411c6a200341bc046a28000036000020004200370300200424000f0b20004200370308200020032800c809360019200041186a41003a00002000411c6a200341cb096a28000036000020004200370300200424000f0b0b20002010370024200020023a0023200020133a0022200020163a002120004200370308200041206a20013a0000200041186a41003a000020004201370300200424000f0b41022116200341023602fc0e20012903a002211c200141186a290300214c2001290310214d2001290308214e2001290300211020032903f00e210520032903e80e210b20032903f80e2108200120032903e00e3703a002200141b8026a2213290300210620132008370300200141a8026a2213290300211b2013200b370300200141b0026a2213290300210b20132005370300200129038002212220012903e001213320012903c001213720012903a001213b200129038001213f20012903602143200129034021472001290320214b20012903c002211a20014198026a290300211f20014190026a290300212020014188026a2903002121200141f8016a2903002123200141f0016a2903002124200141e8016a2903002125200141d8016a2903002134200141d0016a2903002135200141c8016a2903002136200141b8016a2903002138200141b0016a2903002139200141a8016a290300213a20014198016a290300213c20014190016a290300213d20014188016a290300213e200141f8006a2903002140200141f0006a2903002141200141e8006a2903002142200141d8006a2903002144200141d0006a2903002145200141c8006a2903002146200141386a2903002148200141306a2903002149200141286a290300214a200141d8026a2903002105200141d0026a2903002108200141c8026a2903002119200341b80c6a200141e8026a2903003703002003200141e0026a2903003703b00c2006422088214f024020032802e0040d0020032802a4074102460d00200341e0046a41086a2101024020034198076a2802002213450d002003419c076a280200450d00201310260b20011098030b204fa721120b200320173602e004200320073702e40420112015200341e0046a10d5052007a7210e02402002450d00200241f0026c21022017210103400240200141bc026a2802004102460d000240200141b0026a2802002213450d00200141b4026a280200450d00201310260b200110d5010b200141f0026a2101200241907d6a22020d000b0b0240200e450d00200e41f0026c450d00201710260b200341800a6a41086a200341b00c6a41086a290300370300200320032903b00c3703800a410021010b024020032802dc11450d00201110260b200341b0036a41086a2202200341800a6a41086a290300370300200320032903800a3703b003024002400240024020010d00200341a8096a41086a2002290300370300200320032903b0033703a80920124102460d01200341a8076a2019370300200341a0076a201a37030020034188076a201b37030020034180076a201c370300200341e8066a2021370300200341e0066a2022370300200341c8066a2025370300200341c0066a2033370300200341a8066a2036370300200341a0066a203737030020034188066a203a37030020034180066a203b370300200341e8056a203e370300200341e0056a203f370300200341c8056a2042370300200341c0056a2043370300200341a8056a2046370300200341a0056a204737030020034188056a204a37030020034180056a204b370300200341c0076a20032903a809370300200341b0076a200837030020034190076a200b370300200341f0066a2020370300200341d0066a2024370300200341b0066a203537030020034190066a2039370300200341f0056a203d370300200341d0056a2041370300200341b0056a204537030020034190056a2049370300200341c8076a200341a8096a41086a290300370300200341b8076a200537030020034198076a220120063e0200200341f8066a201f370300200341d8066a2023370300200341b8066a203437030020034198066a2038370300200341f8056a203c370300200341d8056a2040370300200341b8056a204437030020034198056a2048370300200341f8046a204c370300200320103703e0042003201236029c072003204e3703e8042003204d3703f0040240200b42ffffffff0f83500d00200341e00e6a41086a200128020036020020032003290390073703e00e200341b00c6a200341e00e6a10ab0420032802b00c220120032802b80c10ff0120032802b40c450d00200110260b200341e00e6a41086a200d3602002003410c3a00e00e200341e00e6a410c6a2018360200200341013602e40e200341e00e6a108702200341e0046a1098030c030b201641ff01714104460d022016411876210220164110762113201641087621172010422088a721032010a721010c010b41032116411621174101211341f5ecc3002101410e21030b200f200f280200417f6a221836020020180d02200f280208200f28020c2802001103000240200f28020c280204450d00200f28020810260b200f200f280204417f6a221836020420180d02200f10260c020b200f200f280200417f6a2201360200024020010d00200f280208200f28020c2802001103000240200f28020c280204450d00200f28020810260b200f200f280204417f6a220136020420010d00200f10260b20004200370308200020032800d809360019200041186a41003a00002000411c6a200341db096a28000036000020004200370300200424000f0b0b20002001360024200020023a0023200020133a0022200020173a002120004200370308200041286a2003360000200041206a20163a0000200041186a41003a000020004201370300200424000f0b20004200370308200020032800800a360019200041186a41003a00002000411c6a200341830a6a28000036000020004200370300200424000f0b0b20002010370024200020023a0023200020133a0022200020163a002120004200370308200041206a20013a0000200041186a41003a000020004201370300200424000f0b410421010b20151026200141ff01714104470d0020004200370308200020032800c809360019200041186a41003a00002000411c6a200341cb096a28000036000020004200370300200424000f0b20002010370024200020133a00232000200f3a0022200020023a002120004200370308200041206a20013a0000200041186a41003a000020004201370300200424000f0b024020022001460d000340200110d5012002200141b0026a2201470d000b0b0240201d450d00201d41b0026c450d00201510260b200341083a00e004200341e0046a41086a41043a0000200341e0046a108702200f200f280200417f6a220136020020010d01200f280208200f28020c2802001103000240200f28020c280204450d00200f28020810260b200f200f280204417f6a220136020420010d010b200f10260b20004200370308200020032800e00436001920004200370300200041186a41003a00002000411c6a200341e3046a280000360000200424000f0b20032d00b00322014104460d010b20032f00b103210220032d00b303210f200020032902b4033700242000200f3a0023200020023b0021200041206a20013a0000200041186a41003a00002000420037030820004201370300200424000f0b20004200370308200020032800c809360019200041186a41003a00002000411c6a200341cb096a28000036000020004200370300200424000f0b02402011450d00201210260b0240200d450d00201810260b20032d00d81122014104460d0020032f00d911210220032d00db11210f200020032902dc113700242000200f3a0023200020023b0021200041206a20013a0000200041186a41003a00002000420037030820004201370300200424000f0b20004200370308200020032800c809360019200041186a41003a00002000411c6a200341cb096a28000036000020004200370300200424000f0b02402015450d00201110260b200e450d00200d10260b024020032d00800a4104460d0020032802800a2101200020032902840a370024200041206a2001360000200041186a41003a00002000420037030820004201370300200424000f0b20004200370308200020032800b003360019200041186a41003a00002000411c6a200341b3036a28000036000020004200370300200424000f0b20004200370308200020032800c809360019200041186a41003a00002000411c6a200341cb096a28000036000020004200370300200424000f0b20032f00b103210220032d00b303210f200020032902b4033700242000200f3a0023200020023b0021200041206a20013a0000200041186a41003a00002000420037030820004201370300200424000f0b20004200370308200020032800c809360019200041186a41003a00002000411c6a200341cb096a28000036000020004200370300200424000f0b2011200141246c6a2802002102200341b00c6a41186a200341a0086a41186a290300370300200341b00c6a41106a200341a0086a41106a290300370300200341b00c6a41086a200341a0086a41086a290300370300200320032903a0083703b00c200d200120012002200f496a2002200f461b22024f0d002002200d103b000b0240200d20032802f409470d00200341d8096a41186a200d10e40120032802ec09211520032802f00921110b2011200241246c6a220141246a2001200d20026b41246c10d0061a2001200f360200200120032903b00c3702042001410c6a200341b00c6a41086a290300370200200141146a200341b00c6a41106a2903003702002001411c6a200341b00c6a41186a290300370200410121012003200d41016a3602f809200341c0046a41186a2217200341a0086a41186a290300370300200341c0046a41106a2218200341a0086a41106a290300370300200341c0046a41086a2211200341a0086a41086a290300370300200320032903a0083703c0040240201520032802e809470d00200341d8096a410c6a2015410110930120032802ec0921150b20032802e409220c20154105746a220220032903c004370000200241186a2017290300370000200241106a2018290300370000200241086a20112903003700002003201541016a22153602ec090b201310260240024020010d00024020032802dc09450d0020032802d80910260b024020032802e80941ffffff3f71450d00200c10260b024020032802f4092201450d00200141246c450d0020032802f00910260b201610260c010b0240024002402015450d0020154105742117200341b00c6a4104722101200c21020340200341a0086a200210fe02200341b00c6a20032802a008221820032802a80810b005200341800a6a41086a2211200141086a290200370300200341800a6a41106a220d200141106a290200370300200341800a6a41186a220e200141186a290200370300200341800a6a41206a2212200141206a290200370300200320012902003703800a0240024020032802b00c22130d00410021130c010b200341b0036a41206a2012290300370300200341b0036a41186a200e290300370300200341b0036a41106a200d290300370300200341b0036a41086a2011290300370300200320032903800a3703b0030b024020032802a408450d00201810260b20130d02200241206a2102201741606a22170d000b0b4100211741042114410021150c010b200341d8116a41206a2201200341b0036a41206a290300370300200341d8116a41186a2218200341b0036a41186a290300370300200341d8116a41106a2211200341b0036a41106a290300370300200341d8116a41086a220d200341b0036a41086a290300370300200320032903b0033703d811412c10242214450d2520142013360200201420032903d8113702042014410c6a200d290300370200201441146a20112903003702002014411c6a2018290300370200201441246a200129030037020020034281808080103702840820032014360280080240024020174120470d00410121150c010b200241206a2118200c20154105746a221241606a210c200341b00c6a4104722101410121150340201821020340200341a0086a200210fe02200341b00c6a20032802a008221720032802a80810b005200341800a6a41086a2218200141086a290200370300200341800a6a41106a2211200141106a290200370300200341800a6a41186a220d200141186a290200370300200341800a6a41206a220e200141206a290200370300200320012902003703800a0240024020032802b00c22130d00410021130c010b200341b0036a41206a200e290300370300200341b0036a41186a200d290300370300200341b0036a41106a2011290300370300200341b0036a41086a2018290300370300200320032903800a3703b0030b024020032802a408450d00201710260b024020130d002012200241206a2202470d010c030b0b200341d8116a41206a200341b0036a41206a2903002210370300200341d8116a41186a200341b0036a41186a2903002206370300200341d8116a41106a200341b0036a41106a290300220b370300200341d8116a41086a200341b0036a41086a2903002205370300200320032903b00322073703d811200341b00c6a41206a22112010370300200341b00c6a41186a220d2006370300200341b00c6a41106a220e200b370300200341b00c6a41086a220a2005370300200320073703b00c02402015200328028408470d0020034180086a201510ee0120032802800821140b200241206a211820142015412c6c6a22172013360200201720032903b00c3702042017410c6a200a290300370200201741146a200e2903003702002017411c6a200d290300370200201741246a20112903003702002003201541016a221536028808200c2002470d000b0b20032802840821170b200341b00c6a41206a200341d8096a41206a280200360200200341b00c6a41186a2201200341d8096a41186a290300370300200341b00c6a41106a200341d8096a41106a290300370300200341b00c6a41086a200341d8096a41086a290300370300200320032903d8093703b00c200341b0036a200110bd01200341800a6a418dd5c10010fb0220032802800a220120032802880a200341b0036a109902024020032802840a450d00200110260b024020032802b403450d0020032802b00310260b200341800a6a418dd5c100200341b00c6a10fc0220032802800a220120032802880a200341bc0c6a10b105024020032802840a450d00200110260b024020032802b40c450d0020032802b00c10260b0240200341c00c6a28020041ffffff3f71450d0020032802bc0c10260b0240200341cc0c6a2802002201450d00200141246c450d0020032802c80c10260b201610262014450d00200341003602e011200342043703d811200341d8116a4100201510e70120032802e011211302402015450d0020032802d81120134102746a21012015210203402001418094ebdc03360200200141046a21012002417f6a22020d000b201520136a21130b200320133602e011410410242201450d24200342043702b403200320013602b003200341b0036a41004104106d20032802b00320032802b80322016a200f360000200341c4036a4100290095d5413702002003200141046a3602b8032003410029008dd5413702bc032003419b0a6a200341b0036a41186a280200360000200341930a6a200341b0036a41106a2903003700002003418b0a6a20032903b803370000200320032903b0033700830a200341b90c6a200341880a6a290000370000200341c10c6a200341800a6a41106a290000370000200341b00c6a41186a200341970a6a290000370000200341d00c6a41013a0000200341033a00b00c200320032900800a3700b10c200341b00c6a108702024020032802dc1141ffffffff0371450d0020032802d81110260b02402015450d002015412c6c21022014210103400240200141046a28020041ffffff3f71450d00200128020010260b2001412c6a2101200241546a22020d000b0b02402017450d002017412c6c450d00201410260b024020032802fc0841ffffff3f71450d0020032802f80810260b200041186a41003a000020004200370308200020032800b9043600192000411c6a200341bc046a28000036000020004200370300200424000f0b024020032802fc0841ffffff3f71450d0020032802f80810260b411821014183f6c40021020b410021030c010b0b2000200236002420004200370308200041286a2001360000200041206a20033a0000200041186a41003a000020004201370300200424000f0b20004200370308200020032800c809360019200041186a41003a00002000411c6a200341cb096a28000036000020004200370300200424000f0b20004200370308200020032800b904360019200041186a41003a00002000411c6a200341bc046a28000036000020004200370300200424000f0b20034188096a41086a200341aa086a280100360200200320032901a20837038809024020032802ec042201450d00200141246c2102200c210103400240024020012d0000220f41044b0d00024002400240200f0e050400010204040b2001410c6a280200450d03200141086a28020010260c030b2001410c6a280200450d02200141086a28020010260c020b2001410c6a280200450d01200141086a28020010260c010b200141086a280200450d00200141046a28020010260b200141246a21012002415c6a22020d000b0b024020032802e8042201450d00200141246c450d00200c10260b024020282013460d000340201610d6010240201641046a2802002201450d00200141246c450d00201628020010260b201641f0006a2116201841907f6a22180d000b0b02402011450d00201141f0006c450d00200d10260b200328029c042201450d04200141c4006c450d040c020b20282013460d00200d201741f0006c6a210f03402013220141046a220210d601200141f0006a21130240200141086a2802002201450d00200141246c450d00200228020010260b200f2013470d000b0b02402011450d00201141f0006c450d00200d10260b200341b8086a4200370300200341b0086a4200370300200341a0086a41086a22014200370300200342003703a00820034180086a41a28cc700410a10fb01200120034180086a41086a29030037030020032003290380083703a008200341e0076a41e0b8c500410610fb01200941086a200341e0076a41086a290300370300200920032903e007370300200341e0046a2015201210b503200341a0086a412020032802e004220120032802e80410b301024020032802e404450d00200110260b200341043a008809200328029c042201450d02200141c4006c450d020b201510260c010b02402017450d00201741f0006c2102200d41046a21010340200110d6010240200141046a280200220f450d00200f41246c450d00200128020010260b200141f0006a2101200241907f6a22020d000b0b2011450d00201141f0006c450d00200d10260b024020032d00880922014104460d0020032f008909210220032d008b09210f2000200329028c093700242000200f3a0023200020023b0021200041206a20013a0000200041186a41003a00002000420037030820004201370300200424000f0b20004200370308200020032800c809360019200041186a41003a00002000411c6a200341cb096a28000036000020004200370300200424000f0b02400240200b202320218422195620052024202284220856200520085122011b0d00200b201954200520085420011b450d0120034198086a2201420037030020034180086a41106a2217420037030020034180086a41086a221842003703002003420037038008200341d8096a419a8cc700410810fb012018200341d8096a41086a220d290300370300200320032903d80937038008200341d8116a41b8a1c300410d10fb012001200341d8116a41086a220e290300370300201720032903d811370300200341b0016a20034180086a108d02200341b0016a41106a290300211a20032903b801212120032802b00121112001420037030020174200370300201842003703002003420037038008200341d8096a419a8cc700410810fb012018200d290300370300200320032903d80937038008200341d8116a41b8a1c300410d10fb012001200e290300370300201720032903d81137030020034200201a420020111b221a2019200b54ad200520087d7c7c2021420020111b22082019200b7d222154ad7d2219200820217d22212008562019201a562019201a511b22011b3703e80420034200202120011b3703e00420034180086a4120200341e0046a411010b3010c010b20034198086a2201420037030020034180086a41106a2217420037030020034180086a41086a221842003703002003420037038008200341d8096a419a8cc700410810fb012018200341d8096a41086a220d290300370300200320032903d80937038008200341d8116a41b8a1c300410d10fb012001200341d8116a41086a220e290300370300201720032903d81137030020034198016a20034180086a108d0220034198016a41106a290300211a20032903a001212120032802980121112001420037030020174200370300201842003703002003420037038008200341d8096a419a8cc700410810fb012018200d290300370300200320032903d80937038008200341d8116a41b8a1c300410d10fb012001200e290300370300201720032903d8113703002003427f201a420020111b221a200520087d200b201954ad7d7c2021420020111b2208200b20197d7c22192008542201ad7c220820012008201a542008201a511b22011b3703e8042003427f201920011b3703e00420034180086a4120200341e0046a411010b3010b200341d80c6a2217201c370300200341e00c6a2218201f3703002003201b3703d00c200320053703c80c2003200b3703c00c200320063703b00c200320103703b80c02400240427f2006200b7c220820082006542201201020057c2001ad7c220820105420082010511b22011b22194280c8afa025544100427f200820011b221a501b0d00200341c00c6a29030021192018290300211a2017290300211b200341d00c6a290300211c20032903b80c211f20032903b00c21214201210820032903c80c21220c010b024002402006200b8420102005848450450d00420021080c010b42002108200341c0046a41186a22014200370300200341c0046a41106a22174200370300200341c0046a41086a22184200370300200342003703c00420034180086a419a8cc700410810fb01201820034180086a41086a220d29000037030020032003290080083703c004200341a8096a41b8a1c300410d10fb012001200341a8096a41086a220e290300370300201720032903a80937030020034180016a200341c0046a108d0220034180016a41106a290300211b200329038801211c2003280280012111200142003703002017420037030020184200370300200342003703c00420034180086a419a8cc700410810fb012018200d29000037030020032003290080083703c004200341a8096a41b8a1c300410d10fb012001200e290300370300201720032903a80937030020034200201b420020111b221b201a7d201c420020111b221c201954ad7d221f201c20197d2221201c56201f201b56201f201b511b22011b3703e80420034200202120011b3703e004200341c0046a4120200341e0046a411010b30120034198056a201a37030020034190056a2019370300200341e0046a41086a41013a0000200341e9046a20032903b003370000200341f1046a200341b0036a41086a290300370000200341f9046a200341b0036a41106a29030037000020034181056a200341b0036a41186a290300370000200341023a00e004200341e0046a1087020b0b200341880f6a201c370300200341a00f6a2020370300200341900f6a201b370300200341f00e6a201f370300200341980f6a201a370300200341f80e6a2019370300200320223703800f200320213703e80e200320164100200742015122011b3a00ac0f20032013410020011b3602a80f200320084201512201ad3703e00e0240024020010d002002200f10ff010c010b2002200f200341e80e6a10da030b024020032802a408450d00200210260b20084201522101024002400240200742015122020d002001450d010b2002200171450d01200341e0046a41086a41043a0000200341e9046a20032903b003370000200341f1046a200341b0036a41086a290300370000200341f9046a200341c0036a29030037000020034181056a200341c8036a290300370000200341003a00e004200341e0046a1087020c010b200341e0046a41086a41033a0000200341e9046a20032903b003370000200341f1046a200341b0036a41086a290300370000200341f9046a200341c0036a29030037000020034181056a200341c8036a290300370000200341003a00e004200341e0046a1087020b024020074201510d0020034198056a201037030020034190056a2006370300200341e0046a41086a41003a0000200341e9046a20032903b003370000200341f1046a200341b0036a41086a290300370000200341f9046a200341c0036a29030037000020034181056a200341c8036a290300370000200341023a00e004200341e0046a1087020b200341a8056a2005370300200341a0056a200b37030020034198056a201037030020034190056a2006370300200341e0046a41086a41033a0000200341e9046a20032903b003370000200341f1046a200341b0036a41086a290300370000200341f9046a200341c0036a29030037000020034181056a200341b0036a41186a290300370000200341023a00e004200341e0046a108702200041186a41003a000020004200370308200020032800b9043600192000411c6a200341b9046a41036a28000036000020004200370300200424000f0b4102210f20032d00b00322014104470d010b20034180056a20032903d80937030020034194056a200328008b0936000020034188056a200341e0096a290300370300200341f8046a2010370300200320053703e0042003200328028809360091052003200b3703e804200320063703f0042003200f3a00900502400240200f4102470d002018201310ff010c010b20182013200341e0046a10d4050b200341b8036a280200210f20032d00b103211320032d00b203211620032d00b303211720032802b4032111410421010c010b200341b8036a280200210f20032802b403211120032d00b303211720032d00b203211620032d00b10321130b024020032802a408450d00201810260b20014104460d012011ad21100b200020173a0023200020163a0022200020133a002120004200370308200041206a20013a0000200041186a41003a00002000200fad42208620108437002420004201370300200424000f0b20034188056a2002360200200341ed046a200341880a6a290300370000200341f5046a200341900a6a290300370000200341fd046a200341800a6a41186a290300370000200341023a00e404200341013a00e004200320032903800a3700e504200341e0046a108702200041186a41003a000020004200370308200020032800c8093600192000411c6a200341cb096a28000036000020004200370300200424000f0b20032d00b00c22014104470d010b2011200f10ff01200341b80c6a280200210f20032802b40c211320032d00b30c211620032d00b20c211720032d00b10c2118410421010c010b200341b80c6a280200210f20032802b40c211320032d00b30c211620032d00b20c211720032d00b10c21180b024020032802b403450d00201110260b20014104460d010b20002013360024200020163a0023200020173a0022200020183a002120004200370308200041286a200f360000200041206a20013a0000200041186a41003a000020004201370300200424000f0b200341e8046a2002360200200341013a00e404200341013a00e004200341e0046a108702200041186a41003a000020004200370308200020032800b9043600192000411c6a200341bc046a28000036000020004200370300200424000f0b4102210f20032d00d81122014104470d010b20034180056a20032903d80937030020034194056a200328008b0936000020034188056a200341e0096a290300370300200341f8046a2010370300200320053703e0042003200328028809360091052003200b3703e804200320063703f0042003200f3a00900502400240200f4102470d002002201310ff010c010b20022013200341e0046a10d4050b200341e0116a280200210f20032d00d911211320032d00da11211620032d00db11211720032802dc112118410421010c010b200341e0116a280200210f20032802dc11211820032d00db11211720032d00da11211620032d00d91121130b024020032802a408450d00200210260b20014104470d01200341ed046a20032903b80337000020034188056a2011360200200341f5046a200341c0036a290300370000200341fd046a200341c8036a290300370000200341003a00e404200341013a00e004200320032903b0033700e504200341e0046a108702200341043a00c0040b20004200370308200020032800c809360019200041186a41003a00002000411c6a200341cb096a28000036000020004200370300200424000f0b200341c8046a200f360200200320183602c404200320173a00c304200320163a00c204200320133a00c104200320013a00c0040b20032f00c104210220032d00c304210f200020032902c4043700242000200f3a0023200020023b0021200041206a20013a0000200041186a41003a00002000420037030820004201370300200424000f0b20002018360024200020173a0023200020163a0022200020133a002120004200370308200041286a200f360000200041206a20013a0000200041186a41003a000020004201370300200424000f0b20032802fc0e41ffffff3f71450d00200110260b201641ffffff3f71450d00200f10260b024020032d00880922014104460d0020032f008909210220032d008b09210f2000200329028c093700242000200f3a0023200020023b0021200041206a20013a0000200041186a41003a00002000420037030820004201370300200424000f0b20004200370308200020032800c809360019200041186a41003a00002000411c6a200341cb096a28000036000020004200370300200424000f0b1033000b20032d00e0042101200f109803200f10260b420021060240201042ffffff3f8350450d004200210b0c010b201110264200210b0b200320032800e70736009f04200320032903e00737039804200041206a20013a0000200041186a200b370300200041106a2010370300200020063703082000200329039804370021200041286a200328009f043600002000412c6a200236020020004201370300200424000bdb0202017f037e23004190026b220424000240024020012d000d450d0041e9b1c2002101413121020c010b200110a5032001410036020820014100360200200420022900002205370318200441306a410272410041de0110d1061a024041e40110242202450d0020024100360200200241046a200441306a41e00110cf061a2001410036020420012002360200200420013602282004200236022420044100360220200441306a200441206a200441186a10a603024020042802304101460d0041bcb1c2002101412d21020c020b200441086a41086a2004413c6a2902002206370300200420042902342207370308200441306a41086a200637030020042007370330200420053702442004200141086a360240200441206a20032802002003280204108701200441306a200441206a10a70320014180023b010c410021010c010b102c000b200020023602042000200136020020044190026a24000b840305057f017e017f017e017f024020002802002201450d002000280208210220002802042103024003402003450d012003417f6a210320012802e40121010c000b0b02402002450d0041002104024003402001450d0102400240200420012f01064f0d00200121000c010b034002400240200128020022000d0041002100200521030c010b20013301044220862106200341016a220321050b20011026200021012006422088a7220420002f01064f0d000b200321050b200441016a210720002004410c6c6a220141e4006a2902002108200141e0006a28020021090240024020030d0020002101200721040c010b200020074102746a41e4016a2802002101410021042003417f6a2200450d00034020012802e40121012000417f6a22000d000b0b2009450d022002417f6a210202402008a7450d00200910260b4100210320020d000c020b0b419d8ac600412b41c88ac600102f000b2001450d0020012802002100200110262000450d00034020002802002101200010262001210020010d000b0b0bed0101077f20012802082103200128020421042001280200210502400340200441086a210620042f010621074100210802400240034020072008460d0120022006410810d2062209450d02200841016a2108200641086a21062009417f4a0d000b2008417f6a21070b2005450d022001200336020820012005417f6a22053602002001200420074102746a41e4016a28020022043602040c010b0b2000200536020420004100360200200041106a20083602002000410c6a2003360200200041086a20043602000f0b20004201370200200041106a20073602002000410c6a2003360200200041086a20043602000bfa1406027f017e047f017e0f7f017e230041b0046b2202240020002802102203200328020041016a36020020002902142104200028020c2103200028020821052000280200210620002802042100200241c0006a41086a2207200141086a28020036020020022001290200370340024002400240024002400240024020002f01062201410b490d00200241d0026a410272410041de0110d1061a41e40110242208450d0420084100360200200841046a200241d0026a41e00110cf061a200241d0026a41086a2207200041b0016a280200360200200220002902a8013703d00220002900382109200841086a200041c0006a20002f010641796a220141037410cf06210a200841e0006a200041b4016a2001410c6c10cf06210b200041063b0106200820013b0106200241f0006a41086a2007280200360200200220022903d0023703700240024020034107490d002003410374200a6a41506a200a200341796a22074103746a220a200141ffff037120076b41037410d0061a200a20043700002003410c6c200b6a220341b87f6a200341ac7f6a220320082f010620076b410c6c10d0061a200341086a200241c0006a41086a28020036020020032002290340370200200820082f010641016a3b01060c010b200041086a20034103746a220141086a200120002f010620036b41037410d0061a20012004370000200041e0006a2003410c6c6a2201410c6a200120002f010620036b410c6c10d0061a200141086a200241c0006a41086a28020036020020012002290340370200200020002f010641016a3b01060b200241306a41086a220c200241f0006a41086a220d2802002203360200200241086a41086a220e2003360200200220022903702204370330200220043703082000280200220a0d014100210f200241c0006a21030c020b200020034103746a220641106a200641086a2206200120036b41037410d0061a2006200437000020002003410c6c6a220141ec006a200141e0006a220620002f010620036b410c6c10d0061a200141e8006a200728020036020020062002290340370200200020002f010641016a3b01060c020b200641016a210f20002f01042106200241d0026a4102722110200241e8006a2111200241e0006a2112200241d8006a2113200241d0006a211441002100024003402002200a36022c2002200f360228200c200e28020036020020022002290308370330200f417f6a2000470d01024002400240200a2f01062200410b490d002010410041de0110d1061a200241f0006a200241d0026a41e00110cf061a20114200370300201242003703002013420037030020144200370300200241c0006a41086a220042003703002002420037034041940210242201450d0720014100360200200141046a200241f0006a41e00110cf061a2001418c026a201129030037020020014184026a2012290300370200200141fc016a2013290300370200200141f4016a2014290300370200200141ec016a2000290300370200200120022903403702e401200a2900382104200241d0026a41086a2215200a41b0016a2802003602002002200a2902a8013703d002200141086a200a41c0006a200a2f0106220341796a220041037410cf062116200141e0006a200a41b4016a2000410c6c10cf062117200141e4016a200a4180026a2003417a6a220b41027410cf062118200a41063b0106200120003b01060240200b450d00410021002018210303402003280200220720003b010420072001360200200341046a2103200b200041016a2200470d000b0b200d20152802002200360200200220022903d002221937037020152000360200200220193703d00220064107490d0120162006417a6a22034103746a2016200641796a22004103746a220720012f010620006b41037410d0061a200720093700002006410c6c20176a220741b87f6a200741ac7f6a220720012f010620006b410c6c10d0061a200741086a200c28020036020020072002290330370200200120012f010641016a22073b01062006410274220b20186a416c6a201820034102746a2206200741ffff037120036b41027410d0061a20062008360200200320012f010622064b0d022001200b6a41cc016a2103034020032802002207200041016a22003b010420072001360200200341046a210320062000470d000c030b0b200a41086a2201200641016a22034103746a200120064103746a2201200020066b41037410d0061a20012009370000200a2006410c6c6a220041ec006a200041e0006a2201200a2f010620066b410c6c10d0061a200041e8006a200241306a41086a28020036020020012002290330370200200a200a2f010641016a22003b010620064102742207200a41e4016a22016a41086a200120034102746a2201200041ffff037120036b41027410d0061a200120083602002003200a2f010622014b0d05200a20076a41e8016a2100034020002802002203200641016a22063b01042003200a360200200041046a210020012006470d000c060b0b200a41086a2200200641016a22034103746a200020064103746a2200200a2f010620066b41037410d0061a20002009370000200a41e0006a2006410c6c6a2200410c6a2000200a2f010620066b410c6c10d0061a200041086a200c28020036020020002002290330370200200a200a2f010641016a22003b01062006410274220b200a41e4016a22076a41086a200720034102746a2207200041ffff037120036b41027410d0061a200720083602002006200a2f010622074f0d00200a200b6a41e8016a2100034020002802002203200641016a22063b01042003200a360200200041046a210020072006470d000b0b200241186a41086a20152802002200360200200e2000360200200220022903d0022209370318200220093703080240200a28020022000d00200241c0006a210320012108200421090c030b200a2f010421062000210a2004210920012108200f2100200f41016a210f0c000b0b41e0e8c600413541dcbcc700102f000b200241d0026a410272410041de0110d1061a200241f0006a200241d0026a41e00110cf061a200341286a22014200370200200341206a22074200370200200341186a22064200370200200341106a220a4200370200200341086a220b42003702002003420037020041940210242200450d0120004100360200200041046a200241f0006a41e00110cf061a2000418c026a200129020037020020004184026a2007290200370200200041fc016a2006290200370200200041f4016a200a290200370200200041ec016a200b290200370200200020032902003702e4012000200528020022033602e4012005200036020020052005280204220141016a360204200341003b010420032000360200200241d0026a41086a200241086a41086a280200360200200220022903083703d0022001200f470d0220002f01062203410a4b0d0320002003410c6c6a220141e0006a20022903d002370200200020034103746a41086a2009370000200141e8006a200241d0026a41086a2802003602002000200341016a22034102746a41e4016a2008360200200020002f010641016a3b0106200820033b0104200820003602000b200241b0046a24000f0b102c000b4189e8c600413041dcbcc700102f000b41b9e8c600412741dcbcc700102f000bdf0403037f017e027f23004190026b220424000240024020012d000d450d0041e9b1c2002105413121010c010b02400240024002400240200328020022064101470d00200110a5032001410036020820014100360200200420022900002207370318200441186a2108200441086a21020c010b2001280200210520042002290000220737031820050d01200441186a2108200441086a21020b41002109200441306a410272410041de0110d1061a41e40110242205450d0120054100360200200541046a200441306a41e00110cf061a20014100360204200120053602000c020b20012802042109200441186a2108200441086a21020c010b102c000b200420013602282004200536022420042009360220200441306a200441206a200810a60302400240024020042802304101470d0020022004290234370200200241086a22052004413c6a290200370200200441306a41086a200529020037030020042002290200370330200420073702442004200141086a360240200441003602282004420137032020060d01200441206a41004101106d2004280220200428022822056a41003a00002004200541016a2205360228200341086a2903002107200441206a20054108106d2004280220200428022822056a20073700002004200541086a3602280c020b41bcb1c2002105412d21010c020b200441206a41004101106d2004280220200428022822056a41013a00002004200541016a360228200441206a200341046a10a3010b200441306a200441206a10a703200120063a000d41002105200141003a000c0b200020013602042000200536020020044190026a24000b996408017f017e037f017e037f017e167f027e230041f0096b2201240010aa0342c096b102210202400240024020004101460d00200141f0006a41186a22034200370300200141f0006a41106a22044200370300200141f0006a41086a2205420037030020014200370370200141d0016a41868cc700410410fb012005200141d0016a41086a290000370300200120012900d00137037020014190036a41d49ec600410b10fb01200320014190036a41086a2900003703002004200129009003370300200141e0006a200141f0006a10ab03200129036821062001280260210720014190016a41186a2204420037030020014190016a41106a2205420037030020014190016a41086a22084200370300200142003703900120014180086a41868cc700410410fb01200820014180086a41086a220329000037030020012001290080083703900120014180086a41b49dc600410a10fb01200420032900003703002005200129008008370300200141d0006a20014190016a10ab03200128025021092001290358210a200442003703002005420037030020084200370300200142003703900120014180086a41868cc700410410fb012008200329000037030020012001290080083703900120014180086a41a89ec600410b10fb01200420032900003703002005200129008008370300200141c0006a20014190016a10ab0342002006420020071b22062001290348420020012802401b200a42d8047e420020091b7c7d220a200a2006561b42d804540d00200141b0016a41186a22044200370300200141b0016a41106a220b4200370300200141b0016a41086a22054200370300200142003703b00120014180086a41b48cc700410710fb012005200329000037030020012001290080083703b00120014180086a4184c1c200410c10fb0120042003290000370300200b200129008008370300200141386a200141b0016a4120108902200128023c210c2001280238210d20044200370300200b420037030020054200370300200142003703b00120014180086a41b48cc700410710fb012005200329000037030020012001290080083703b00120014180086a41a8c1c200410d10fb0120042003290000370300200b200129008008370300200141b0016a108a02210e200141d0046a41186a22044200370300200141d0046a41106a220f4200370300200141d0046a41086a22054200370300200142003703d00420014180086a41b48cc700410710fb012005200329000037030020012001290080083703d00420014180086a4184c1c200410c10fb0120042003290000370300200f200129008008370300200141306a200141d0046a4120108902200141e0076a10ac0320014190066a10ad032001280294062110200128029006211102402001280298062203450d00200341057441606a210820014180086a410472210441002105201121030340200141d0046a41186a200341186a2207290000370300200141d0046a41106a200341106a2209290000370300200141d0046a41086a200341086a2212290000370300200120032900003703d00420032900002106200441186a200729000037000020042006370000200441086a2012290000370000200441106a200929000037000020012005360280082005200410ae031a2008450d01200341206a2103200841606a2108200541016a21050c000b0b0240201041ffffff3f71450d00201110260b200141e8046a4200370300200141e0046a4200370300200141d0046a41086a22034200370300200142003703d00420014180086a41b48cc700410710fb01200320014180086a41086a220429000037030020012001290080083703d00420014180086a4184c1c200410c10fb01200f41086a2004290000370000200f200129008008370000200141286a200141d0046a4120108902200128022c210320012802282104200141d0016a41d18cc700410810fb0120014190036a41e4f5c500411210fb014100210520012003410020041b3602b001200141b8076a200141b0016a410410a20220014180086a410c6a200141b0016a41046a3602002001200141b8076a41086a2208360284082001200141b0016a360288082001200141b8076a36028008200141d0046a20014180086a107320012802d804220341206a2204417f4c0d010240024020040d00410121070c010b200410242207450d03200421050b20014100360288082001200736028008200120053602840820014180086a4100411010c90120012802800820012802880822046a220520012900d001370000200541086a200141d0016a41086a2900003700002001200441106a22043602880820014180086a2004411010c90120012802800820012802880822046a2205200129009003370000200541086a20014190036a41086a2900003700002001200441106a22053602880820012802d004210420014180086a2005200310c901200128028008220520012802880822076a2004200310cf061a2001200720036a220336028808024020012802d404450d00200410260b2005200310af030240200128028408450d00200510260b200141e8046a4200370300200141e0046a4200370300200141d0046a41086a22034200370300200142003703d00420014180086a41b48cc700410710fb01200320014180086a41086a220429000037030020012001290080083703d00420014180086a4184c1c200410c10fb01200f41086a2004290000370000200f200129008008370000200141206a200141d0046a41201089022001280224210320012802202104200141d0016a41d18cc700410810fb0120014190036a41c0d2c500410e10fb014100210520012003410020041b3602b001200141b8076a200141b0016a410410a20220014180086a410c6a200141b0016a41046a36020020012008360284082001200141b0016a360288082001200141b8076a36028008200141d0046a20014180086a107320012802d804220341206a2204417f4c0d010240024020040d00410121080c010b200410242208450d03200421050b20014100360288082001200836028008200120053602840820014180086a4100411010c90120012802800820012802880822046a220520012900d001370000200541086a200141d0016a41086a2900003700002001200441106a22043602880820014180086a2004411010c90120012802800820012802880822046a2205200129009003370000200541086a20014190036a41086a2900003700002001200441106a22053602880820012802d004210420014180086a2005200310c901200128028008220520012802880822086a2004200310cf061a2001200820036a220336028808024020012802d404450d00200410260b2005200310af030240200128028408450d00200510260b200141013a008408200141063a00800820014180086a108702024020012802e40741ffffff3f71450d0020012802e00710260b200141c8016a4200370300200141c0016a4200370300200141b0016a41086a22034200370300200142003703b00120014180086a41b48cc700410710fb01200320014180086a41086a220429000037030020012001290080083703b00120014180086a419ab2c200410a10fb01200b41086a2004290000370000200b200129008008370000200141203602dc092001200141b0016a3602d809200141e0096a200141b0016a41201082020240024020012802e00922070d00410021080c010b20012802e40921092001200141e0096a41086a2802003602cc09200120073602c809200141186a200141c8096a108f010240024020012802180d00200128021c221220012802cc0941c0016e2203200320124b1bad42c0017e2206422088a70d042006a72203417f4c0d040240024020030d00410121080c010b200310242208450d060b20014100360278200120083602702001200341c0016e3602740240024002402012450d0020014180086a41206a211020014190066a4101722113410021114100210f034041002104200141003a00b00620012802cc09417f6a2103200f41016a210f0340200141003a00df072003417f460d0320014190066a20046a20012802c80922052d00003a00002001200541016a3602c8092001200441016a22053a00b006200120033602cc092003417f6a21032005210420054120470d000b200141e0076a41186a220320014190066a41186a290300370300200141e0076a41106a220420014190066a41106a290300370300200141e0076a41086a221420014190066a41086a29030037030020012001290390063703e007200541ff01714120490d0320014190016a41086a2205201429030037030020014190016a41106a2214200429030037030020014190016a41186a22042003290300370300200120012903e0073703900120014190066a200141c8096a10b00320012d0090064101460d0320014180086a41186a200429030037030020014180086a41106a201429030037030020014180086a41086a20052903003703002001200129039001370380082010201341a00110cf061a200141d0046a20014180086a41c00110cf061a20014190036a200141d0046a41c00110cf061a200141d0016a20014190036a41c00110cf061a024020112001280274470d00200141f0006a2011410110f40120012802702108200128027821110b2008201141c0016c6a200141d0016a41c00110cf061a2001201141016a2211360278200f2012470d000b0b200129027421062008450d020c030b200441ff0171450d00200141003a00b0060b024020012802742203450d00200341c0016c450d00200810260b0b41002108200141003602d804200142013703d0042001410e360294032001200141d8096a360290032001200141d0046a3602d00120014194086a410136020020014201370284082001418c8dc60036028008200120014190036a36029008200141d0016a41c4e1c00020014180086a10351a20012802d00420012802d80410840220012802d404450d0020012802d00410260b2009450d00200710260b2001410036029801200142013703900120014190016a41002006420020081b2206422088a72215109301201541c0016c21092008410120081b21162001280298012105200128029001211702402015450d00201720054105746a21032009210820162104034020032004290000370000200341186a200441186a290000370000200341106a200441106a290000370000200341086a200441086a290000370000200541016a2105200341206a2103200441c0016a2104200841c07e6a22080d000b0b2001200536029801200141c8016a4200370300200141c0016a4200370300200141b0016a41086a22034200370300200142003703b00120014180086a41b48cc700410710fb01200320014180086a41086a220429000037030020012001290080083703b00120014180086a41a4b2c200410a10fb01200b41086a2004290000370000200b20012900800837000020054105744104722203417f4c0d01200310242204450d02200e41ff0171410247211220014100360288082001200336028408200120043602800820014180086a200510a1010240024020050d00200128028008210720012802880821040c010b20054105742105200128028808210420172103034020014180086a20044120106d200128028008220720012802880822086a22042003290000370000200441086a200341086a290000370000200441106a200341106a290000370000200441186a200341186a2900003700002001200841206a220436028808200341206a2103200541606a22050d000b0b200e2012712118200141b0016a41202007200410b3010240200128028408450d00200710260b02402018450d00200141c8016a4200370300200141c0016a4200370300200141b0016a41086a22034200370300200142003703b00120014180086a41b48cc700410710fb01200320014180086a41086a220429000037030020012001290080083703b00120014180086a4198c2c200411210fb01200b41086a2004290000370000200b20012900800837000020014180086a200141b0016a108c022001280280082203450d00200141b0016a412010ff0120012902840842ffffffff0383500d00200310260b200141b0016a41186a4200370300200141b0016a41106a4200370300200141b0016a41086a22034200370300200142003703b00120014180086a41b48cc700410710fb01200320014180086a41086a221029000037030020012001290080083703b00120014180086a4184c1c200410c10fb01200b41086a2010290000370000200b2001290080083700002001200c41016a4101200d1b221936028008200141b0016a412020014180086a410410b30120014180086a10ad03200128028408211a200128028008211b200128028808210341002111200141003602b801200142013703b001200141b0016a4100200310f40120012802b801210c02402003450d00201620096a211c20012802b001200c41c0016c6a2108200c2003410574220741606a4105766a211d20014190066a41206a2114200141d0046a410172210d20014180086a41206a211320014190066a4180016a211e20014190066a41e0006a211f20014190066a41c0006a21204100211120162105201b2103034020052104200141e0076a41186a2209200341186a290000370300200141e0076a41106a2212200341106a290000370300200141e0076a41086a220f200341086a290000370300200120032900003703e007200141b8076a200141e0076a10b103200141d0046a20012802b807220c20012802c00710b20320012d00d004210e20014190036a200d41a00110cf061a410021050240200e4101470d00200141d0016a20014190036a41a00110cf061a410121050b024020012802bc07450d00200c10260b0240024020050d0020014190066a41186a420037030020014190066a41106a420037030020014190066a41086a420037030020014200370390062014410041800110d1061a0c010b20014190066a200141d0016a41a00110cf061a0b02400240201141ff0171450d00200421050c010b4100211102402004201c470d00200421050c010b200441c0016a21050240024020014190066a200441206a220e460d00200e20014190066a412010d2060d010b02402014200441c0006a220e460d00200e2014412010d2060d010b02402020200441e0006a220e460d00200e2020412010d2060d010b0240201f20044180016a220e460d00200e201f412010d2060d010b201e200441a0016a2204460d012004201e412010d206450d010b410121110b200341206a210320014180086a41186a200929030037030020014180086a41106a20122903003703002010200f290300370300200120012903e00737038008201320014190066a41a00110cf061a200820014180086a41c00110cf0641c0016a2108200741606a22070d000b201d41016a210c0b2001200c3602b8010240201a41ffffff3f71450d00201b10260b200cad42c0017e2202422088a70d012002a72203417f4c0d0120012802b401210d20012802b00121100240024020030d00410121040c010b200310242204450d030b200141003602d804200120043602d0042001200341c0016e3602d404200141d0046a4100200c10f40120012802d804211202400240200c41c0016c22030d0020012802d00421130c010b201020036a210e20012802d0042213201241c0016c6a210f20014180086a41a0016a210420014180086a4180016a210520014180086a41e0006a210820014180086a41c0006a210720014180086a41206a210920102103034020014180086a41186a200341186a29000037030020014180086a41106a200341106a29000037030020014180086a41086a200341086a2900003703002001200329000037038008200941186a200341386a290000370000200941106a200341306a290000370000200941086a200341286a2900003700002009200341206a2900003700002007200341c0006a290000370000200741086a200341c8006a290000370000200741106a200341d0006a290000370000200741186a200341d8006a2900003700002008200341e0006a290000370000200841086a200341e8006a290000370000200841106a200341f0006a290000370000200841186a200341f8006a290000370000200520034180016a290000370000200541086a20034188016a290000370000200541106a20034190016a290000370000200541186a20034198016a2900003700002004200341a0016a290000370000200441086a200341a8016a290000370000200441186a200341b8016a290000370000200441106a200341b0016a290000370000201241016a2112200f20014180086a41c00110cf0641c0016a210f200341c0016a2203200e470d000b0b200120123602d804200141c8016a4200370300200141c0016a4200370300200141b0016a41086a22034200370300200142003703b00120014180086a41b48cc700410710fb01200320014180086a41086a220429000037030020012001290080083703b00120014180086a419ab2c200410a10fb01200b41086a2004290000370000200b200129008008370000201241c0016c4104722203417f4c0d01200310242204450d0220014100360288082001200336028408200120043602800820014180086a201210a1010240024020120d00200128028008210820012802880821040c010b2013201241c0016c6a2107200128028808210420132103034020014180086a20044120106d20012802800820012802880822056a22042003290000370000200441086a200341086a290000370000200441106a200341106a290000370000200441186a200341186a2900003700002001200541206a22043602880820014180086a20044120106d20012802800820012802880822056a2204200341206a290000370000200441086a200341286a290000370000200441106a200341306a290000370000200441186a200341386a2900003700002001200541206a22043602880820014180086a20044120106d20012802800820012802880822056a2204200341c0006a290000370000200441086a200341c8006a290000370000200441106a200341d0006a290000370000200441186a200341d8006a2900003700002001200541206a22043602880820014180086a20044120106d20012802800820012802880822056a2204200341e0006a290000370000200441086a200341e8006a290000370000200441106a200341f0006a290000370000200441186a200341f8006a2900003700002001200541206a22043602880820014180086a20044120106d20012802800820012802880822056a220420034180016a290000370000200441086a20034188016a290000370000200441106a20034190016a290000370000200441186a20034198016a2900003700002001200541206a22043602880820014180086a20044120106d200128028008220820012802880822056a2204200341a0016a290000370000200441086a200341a8016a290000370000200441106a200341b0016a290000370000200441186a200341b8016a2900003700002001200541206a220436028808200341c0016a22032007470d000b0b200141b0016a41202008200410b3010240200128028408450d00200810260b024020012802d4042203450d00200341c0016c450d00201310260b200141c8016a4200370300200141c0016a4200370300200141b0016a41086a22034200370300200142003703b00120014180086a41b48cc700410710fb01200320014180086a41086a220429000037030020012001290080083703b00120014180086a41a8c1c200410d10fb01200b41086a2004290000370000200b200129008008370000200120113a00df07200141b0016a4120200141df076a410110b3012001201936028408200141043a00800820014180086a1087022018201620152010200c10b3030240200d450d00200d41c0016c450d00201010260b024020012802940141ffffff3f71450d00201710260b42c0d6d9cc9a3a21022006a72203450d00200341c0016c450d00201610260b200141c8016a22034200370300200141b0016a41106a22044200370300200141b0016a41086a22054200370300200142003703b00120014180086a41ac8cc700410810fb01200520014180086a41086a220829000037030020012001290080083703b00120014180086a41a1cbc100411010fb01200320082900003703002004200129008008370300200141203602c4092001200141b0016a3602c009200141c8096a200141b0016a41201082020240024020012802c80922090d00410021080c010b20012802cc0921122001200141c8096a41086a2802003602dc09200120093602d809200141106a200141d8096a108f010240024020012802100d002001280214220c20012802dc09411c6e22032003200c4b1bad421c7e2206422088a70d032006a72203417f4c0d030240024020030d00410421080c010b200310242208450d050b2003411c6ead21060240024002400240200c450d00410021100340200141086a200141d8096a108f0120012802080d04200128020c220f20012802dc09412c6e22032003200f4b1bad422c7e220a422088a70d08200aa72203417f4c0d080240024020030d00410421110c010b200310242211450d0a0b200141003602e809200120113602e00920012003412c6e3602e409024002400240024002400240024002400240200f450d00410021074100210e0340200141003a00a00820012802dc09417f6a2103200e41016a210e410021040340200141003a00df072003417f460d0320014180086a20046a20012802d80922052d00003a00002001200541016a3602d8092001200441016a22053a00a008200120033602dc092003417f6a21032005210420054120470d000b200141d0046a41186a220320014180086a41186a290300370300200141d0046a41106a220420014180086a41106a290300370300200141d0046a41086a221320014180086a41086a29030037030020012001290380083703d004200541ff01714120490d03200141f0006a41086a2013290300220a370300200141b8076a41186a22052003290300370300200141b8076a41106a22032004290300370300200141b8076a41086a2204200a370300200120012903d004220a3703702001200a3703b80720014180086a200141d8096a1092012001280280082213450d0320014190066a41086a2004290300220a37030020014190066a41106a2003290300222137030020014190066a41186a20052903002222370300200141e0076a41086a2204200a370300200141e0076a41106a22052021370300200141e0076a41186a22142022370300200120012903b807220a370390062001200a3703e007200129028408210a0240200720012802e409470d00200141e0096a200710ee0120012802e009211120012802e80921070b20112007412c6c6a2203200a370204200320133602002003410c6a20012903e007370200200341146a20042903003702002003411c6a2005290300370200200341246a20142903003702002001200741016a22073602e809200e200f470d000b0b2011450d0c20012902e409210a2001200141d8096a108f0120012802000d042001280204220520012802dc094102762203200320054b1b22034102742204417f4c0d1020030d024104210e0c030b200441ff0171450d00200141003a00a0080b20014190066a41186a200141d0016a41186a2903003703002007450d092007412c6c2104201121030c080b20041024220e450d0e0b200141003602880820012003360284082001200e36028008024002402005450d0041002103034020012802dc0922074104490d0220012802d809220f280000210420012007417c6a3602dc092001200f41046a3602d8092004418094ebdc034b0d0202402003200128028408470d0020014180086a2003410110e701200128028008210e20012802880821030b200e20034102746a20043602002001200341016a2203360288082005417f6a22050d000b0b200e450d01200129028408212120012802dc0922034104490d0220012802d8092204280000210520012003417c6a3602dc092001200441046a3602d8092006422088a722032006a7470d040240200341016a22042003490d0020034101742207200420042007491b22044104200441044b1bad421c7e2222422088a722070d002022a7220441004e0d040b102e000b20012802840841ffffffff0371450d00200e10260b0240200a422088a72203450d002003412c6c21042011210303400240200341046a28020041ffffff3f71450d00200328020010260b2003412c6a2103200441546a22040d000b0b200aa72203450d072003412c6c450d07201110260c070b0240202142ffffffff0383500d00200e10260b0240200a422088a72203450d002003412c6c21042011210303400240200341046a28020041ffffff3f71450d00200328020010260b2003412c6a2103200441546a22040d000b0b200aa72203450d062003412c6c450d06201110260c060b2003411c6c200d20031b210d02400240024002402008410020031b22080d0020040d014100410420074100471b21080c030b200d2004460d020240200d0d0020040d01410421080c030b2008200d200410282208450d010c020b2004102422080d010b102c000b2006428080808070832004411c6ead8421060b20082006422088a7411c6c6a220320053602182003200a37020420032011360200200341106a20213702002003410c6a200e36020020064280808080107c2106201041016a2210200c470d000b0b20080d040c030b03400240200341046a28020041ffffff3f71450d00200328020010260b2003412c6a2103200441546a22040d000b0b20012802e4092203450d002003412c6c450d00201110260b02402006422088a72203450d0020082003411c6c6a2107200821050340024020052802082204450d00200528020021032004412c6c210403400240200341046a28020041ffffff3f71450d00200328020010260b2003412c6a2103200441546a22040d000b0b0240200541046a2802002203450d002003412c6c450d00200528020010260b2005411c6a21030240200541106a28020041ffffffff0371450d00200528020c10260b2003210520032007470d000b0b2006a721032003450d002003411c6c450d00200810260b41002108200141003602d804200142013703d0042001410e360294032001200141c0096a360290032001200141d0046a3602d00120014194086a410136020020014201370284082001418c8dc60036028008200120014190036a36029008200141d0016a41c4e1c00020014180086a10351a20012802d00420012802d80410840220012802d404450d0020012802d00410260b2012450d00200910260b2008410420081b210702402006420020081b2206422088a72208450d00200841646c21044100210303402004411c6a21042008200341016a2203470d000b2003417f6a20084f0d00200642ffffffff0f83200820036bad422086842106200720046b210520072008411c6c6a21080340024020052802082204450d00200528020021032004412c6c210403400240200341046a28020041ffffff3f71450d00200328020010260b2003412c6a2103200441546a22040d000b0b0240200541046a2802002203450d002003412c6c450d00200528020010260b2005411c6a21030240200541106a28020041ffffffff0371450d00200528020c10260b2003210520032008470d000b0b20014198086a2203420037030020014180086a41106a2204420037030020014180086a41086a220542003703002001420037038008200141d0046a41ac8cc700410810fb012005200141d0046a41086a2208290000370300200120012900d00437038008200141d0046a41a1cbc100411010fb0120032008290000370300200420012900d004370300200141d0046a20072006422088a7220310b40120014180086a412020012802d004220420012802d80410b301024020012802d404450d00200410260b02402003450d0020072003411c6c6a2108200721050340024020052802082204450d00200528020021032004412c6c210403400240200341046a28020041ffffff3f71450d00200328020010260b2003412c6a2103200441546a22040d000b0b0240200541046a2802002203450d002003412c6c450d00200528020010260b2005411c6a21030240200541106a28020041ffffffff0371450d00200528020c10260b2003210520032008470d000b0b02402006a72203450d002003411c6c450d00200710260b20014190036a10b40341002104200128029003210741002105024002400240024002402001280298032209450d00200941c4006c21082009410274417c6a41027641016a2112410021052007210302400340024020032d00004101460d00200341046a28020020004f0d020b200341c4006a2103200541016a2105200841bc7f6a22080d000b201221050b20092005490d010b2001410036029803200920056b210f2007200541c4006c22096a21030240034020092004460d01200720046a2108200441c4006a2212210420082d00004102470d000b200720126a21030b2007200541c4006c6a21080240034020082003460d0120032d00002104200341c4006a210320044102470d000b0b02400240200f0d004100210f0c010b02402005450d0020072007200541c4006c6a200f41c4006c10d0061a0b2001200f360298030b2001280294032103200141e8046a22054200370300200141e0046a22044200370300200141d0046a41086a22084200370300200142003703d00420014180086a41a28cc700410a10fb01200820014180086a41086a220929000037030020012001290080083703d00420014180086a41e0b8c500410610fb0120052009290000370300200420012900800837030020014180086a2007200f10b503200141d0046a4120200128028008220520012802880810b3010240200128028408450d00200510260b02402003450d00200341c4006c450d00200710260b200141d0046a41186a22084200370300200141d0046a41106a22074200370300200141d0046a41086a22054200370300200142003703d00420014180086a41a28cc700410a10fb01200520014180086a41086a220329000037030020012001290080083703d00420014180086a41b0cbc500410c10fb01200441086a20032900003700002004200129008008370000200141003a00df07200141d0046a4120200141df076a410110b301200141d0046a10b60320014180086a41186a200829030037030020014180086a41106a200729030037030020032005290300370300200120012903d0043703800820014180086a10b70310aa03200141f0006a41186a22044200370300200141f0006a41106a22094200370300200141f0006a41086a221242003703002001420037037020014180086a41808cc700410610fb0120122003290000370300200120012900800837037020014180086a41f693c400410a10fb0120042003290000370300200920012900800837030020014180086a200141f0006a412010b80320012d008008210320014190016a41186a220420014199086a29000037030020014190016a41106a220920014191086a29000037030020014190016a41086a221220014189086a2900003703002001200129008108370390010240024020034101460d00200842003703002007420037030020054200370300200142003703d0040c010b20082004290300370300200720092903003703002005201229030037030020012001290390013703d0040b20014190016a41186a2203420037030020014190016a41106a2204420037030020014190016a41086a22054200370300200142003703900120014180086a41b4a3c700411810fb01200520014180086a41086a220829000037030020012001290080083703900120014180086a41a1b7c000410e10fb0120032008290000370300200420012900800837030020014190036a20014190016a412010a50202400240024020012802900322040d004100210520014100360298062001420137039006200141b0016a41186a200141d0046a41186a290300370300200141b0016a41106a200141d0046a41106a290300370300200141b0016a41086a200141d0046a41086a290300370300200120012903d0043703b0010c010b200120012902940322063702940620012004360290062006a7210702402006422088a7220541d100490d00200141b8076a41186a2208200141d0046a41186a290300370300200141b8076a41106a2209200141d0046a41106a290300370300200141b8076a41086a2212200141d0046a41086a290300370300200120012903d0043703b80720052000417f6a41d1007022034d0d04200420034105746a220320012903b807370000200341186a2008290300370000200341106a2009290300370000200341086a2012290300370000200842003703002009420037030020124200370300200142003703b807200141b8076a21030c050b200141b0016a41186a200141d0046a41186a290300370300200141b0016a41106a200141d0046a41106a290300370300200141b0016a41086a200141d0046a41086a290300370300200120012903d0043703b00120052007470d010b20014190066a200541011093012001280294062107200128029006210420012802980621050b200420054105746a220320012903b001370000200341186a200141b0016a41186a290300370000200341106a200141b0016a41106a290300370000200341086a200141b0016a41086a2903003700002001200541016a220536029806200141b8076a41186a22084200370300200141b8076a41106a4200370300200141b8076a41086a22094200370300200142003703b807200141b8076a210320040d02200141d0016a41b4a3c700411810fb012009200141d0016a41086a290000370300200120012900d0013703b80720014190036a41a1b7c000410e10fb01200820014190036a41086a29000037030020012001290090033703c807200141b8076a412010ff010c030b200520091040000b2003200541dce1c0001032000b200141d0016a41b4a3c700411810fb01200341086a200141d0016a41086a290000370000200320012900d00137000020014190036a41a1b7c000410e10fb01200141b8076a41186a20014190036a41086a29000037030020012001290090033703c80720054105744104722208417f4c0d01200810242209450d024100210320014100360288082001200836028408200120093602800820014180086a200510a10102402005450d00200541057421050340200120014180086a36029003200420036a20014190036a109c012005200341206a2203470d000b0b200141b8076a412020012802800820012802880810b3010240200128028408450d0020012802800810260b200741ffffff3f71450d00200410260b200141f0096a240020020f0b1034000b1033000bb13508077f017e017f017e017f017e017f0c7e230041b00f6b22002400200041e00d6a41186a22014200370300200041e00d6a41106a22024200370300200041e00d6a41086a22034200370300200042003703e00d200041a0026a41868cc700410410fb012003200041a0026a41086a2204290000370300200020002900a0023703e00d200041a0026a41e0fcc600410b10fb0120012004290000370300200220002900a002370300200041b0086a200041e00d6a1090020240024020002d00b0084102470d00200041b00b6a41186a22014200370300200041b00b6a41106a22034200370300200041b00b6a41086a22044200370300200042003703b00b200041b0086a41808cc700410610fb012004200041b0086a41086a2205290000370300200020002900b0083703b00b200041b0086a41f093c400410610fb0120012005290000370300200320002900b008370300200041b0086a200041b00b6a10c90420002802b0082201410420011b21060240024020002902b408420020011b2207422088a7220841246c2201450d00200620016a21032006210102400340024020012d00004101470d00200141016a2800002104200141086a28020021052000200141106a2802003602e40d200020053602e00d200441c28289aa04470d00200041b0086a200041e00d6a109d0420002903b00822094203520d020b2003200141246a2201460d020c000b0b200041386a200041cc086a290200370300200041306a41106a200041d4086a290200370300200041c8006a200041dc086a290200370300200020002902c408370330200041b0086a41106a280200210a20002903b808210b0c010b420321090b02402008450d00200841246c21032006210103400240024020012d0000220441044b0d0002400240024020040e050400010204040b2001410c6a280200450d03200141086a28020010260c030b2001410c6a280200450d02200141086a28020010260c020b2001410c6a280200450d01200141086a28020010260c010b200141086a280200450d00200141046a28020010260b200141246a21012003415c6a22030d000b0b02402007a72201450d00200141246c450d00200610260b200041d0006a41186a2201200041306a41186a290300370300200041d0006a41106a2204200041306a41106a290300370300200041d0006a41086a2205200041306a41086a2903003703002000200029033037035041002103024020094203510d00200041f0006a41186a2001290300370300200041f0006a41106a2004290300370300200041f0006a41086a200529030037030020002000290350370370200041b00b6a41186a22034200370300200041b00b6a41106a22014200370300200041b00b6a41086a22044200370300200042003703b00b200041a0026a41868cc700410410fb012004200041a0026a41086a2205290000370300200020002900a0023703b00b200041a0026a41a89ec600410b10fb0120032005290000370300200120002900a002370300200041206a200041b00b6a10ab03024002402000280220450d0020002903284200520d010b200041b00b6a41186a22054200370300200041b00b6a41106a22064200370300200041b00b6a41086a22034200370300200042003703b00b200041a0026a41868cc700410410fb012003200041a0026a41086a2204290000370300200020002900a0023703b00b200041a0026a41a89ec600410b10fb01200141086a22082004290000370000200120002900a0023700002000200b3703b008200041b00b6a4120200041b0086a410810b301200041e00d6a10c205200542003703002006420037030020034200370300200042003703b00b200041a0026a41868cc700410410fb0120032004290000370300200020002900a0023703b00b200041a0026a41f89ec600410a10fb0120082004290000370000200120002900a002370000200041b0086a200041b00b6a10a00520002d00b00821042005200041c9086a2900003703002006200041c1086a2900003703002003200041b9086a290000370300200020002900b1083703b00b0240024020044101460d00200041e0066a41186a4200370300200041e0066a41106a4200370300200041e0066a41086a4200370300200042003703e0060c010b200041e0066a41186a2005290300370300200041e0066a41106a2006290300370300200041e0066a41086a2003290300370300200020002903b00b3703e0060b200041e00d6a41246a200041e0066a41186a290300370200200041e00d6a411c6a200041e0066a41106a290300370200200041e00d6a41146a200041e0066a41086a2203290300370200200020002903e0063702ec0d200041dc086a200041e00d6a41286a280200360200200041b0086a41246a200041800e6a290300370200200041b0086a411c6a200041e00d6a41186a290300370200200041b0086a41146a200041e00d6a41106a290300370200200041b0086a410c6a200041e00d6a41086a290300370200200020002903e00d3702b408200041003602b008200041e0066a200041b0086a10f902200041bb0b6a2003280200360000200020002903e0063700b30b200041e0066a410c6a200041b70b6a290000370000200041c28289aa043600e106200041023a00e006200020002900b00b3700e506200041e0066a108602200041b0086a41086a2802002203450d00200341286c450d0020002802b40810260b200041b00b6a41186a22054200370300200041b00b6a41106a22064200370300200041b00b6a41086a22034200370300200042003703b00b200041a0026a41868cc700410410fb012003200041a0026a41086a2204290000370300200020002900a0023703b00b200041a0026a41d49ec600410b10fb01200141086a22082004290000370000200120002900a002370000200041106a200041b00b6a10ab032000280210210c20002903182107200542003703002006420037030020034200370300200042003703b00b200041a0026a41868cc700410410fb0120032004290000370300200020002900a0023703b00b200041a0026a41838dc600410810fb0120082004290000370000200120002900a00237000020004200200b200742017c4201200c1b7d22072007200b561b3e02b008200041b00b6a4120200041b0086a410410b301200542003703002006420037030020034200370300200042003703b00b200041a0026a41868cc700410410fb0120032004290000370300200020002900a0023703b00b200041a0026a41d49ec600410b10fb0120082004290000370000200120002900a0023700002000200b3703b008200041b00b6a4120200041b0086a410810b3014100210320094200520d0020004190016a41186a200041f0006a41186a29030037030020004190016a41106a200041f0006a41106a29030037030020004190016a41086a200041f0006a41086a290300370300200020002903703703900120004190056a10c20502400240200028029805200a4d0d00200041b00b6a41186a2205200028029005200a41286c6a220341186a290000370300200041b00b6a41106a2206200341106a290000370300200041b00b6a41086a2204200341086a290000370300200020032900003703b00b200041b0086a200041b00b6a10c30520002802b0082103200041e00d6a200041b0086a41047241c40110cf061a20034101460d00200041d0036a200041e0066a41046a200041e00d6a41046a41c00110cf0641c00110cf061a200041a0056a200041d0036a41c00110cf061a200542003703002006420037030020044200370300200042003703b00b200041a0026a41868cc700410410fb012004200041a0026a41086a2203290000370300200020002900a0023703b00b200041a0026a41f89ec600410a10fb01200141086a2003290000370000200120002900a002370000200041b0086a200041b00b6a10a00520002d00b00821032005200041c9086a2900003703002006200041c1086a2900003703002004200041b9086a290000370300200020002900b1083703b00b0240024020034101460d00200041f80d6a4200370300200041f00d6a4200370300200041e80d6a4200370300200042003703e00d0c010b200041e00d6a41186a200041b00b6a41186a290300370300200041e00d6a41106a200041b00b6a41106a290300370300200041e00d6a41086a200041b00b6a41086a290300370300200020002903b00b3703e00d0b200041b00b6a41186a4200370300200041b00b6a41106a4200370300200041b00b6a41086a22044200370300200042003703b00b200041a0026a41868cc700410410fb012004200041a0026a41086a2203290000370300200020002900a0023703b00b200041a0026a41b49dc600410a10fb01200141086a2003290000370000200120002900a0023700002000200041b00b6a10ab032000290308210920002802002101200041e0066a4194acc7004104108001200041e0066a4198acc700410b200b108201200041e0066a41a3acc700410d2009420020011b108201200041e0066a41b0acc7004110200041e00d6a4120108101200041b0086a200041e0066a41d00110cf061a200041b0086a41bcf3c4004109200041c0066a4120108101200041e00d6a200041b0086a41d00110cf061a200041b00b6a200041e00d6a10c405200041a0026a41186a220420004190016a41186a290300370300200041a0026a41106a220520004190016a41106a290300370300200320004190016a41086a29030037030020002000290390013703a002200041b0086a200041a0026a10c305200041b0086a41086a2903002109200041b0086a41106a2903002107200041b0086a41186a290300210d200041b0086a41206a290300210e200041d8086a290300210f200041e0086a290300210b200041e8086a2903002110200041f0086a2903002111200041f8086a290300211220004180096a290300211320002802b0082101200041e00d6a20004188096a41f00010cf061a20014101460d00200041f00c6a200041e00d6a41f00010cf061a20002009423388221420077c22154233882015201454ad420d86842216200d7c221442ffffffffffffff03833703c001200020144233882014201654ad420d86842216200e7c221442ffffffffffffff03833703c801200020144233882014201654ad420d86842216200f7c221442ffffffffffffff03833703d001200020144233882014201654ad420d868442137e200942ffffffffffffff03837c221442ffffffffffffff03833703b00120002014423388201542ffffffffffffff03837c3703b801200041a0026a41206a4200370300200442003703002005420037030020034200370300200042003703a002200041e00d6a41206a4200370300200041e00d6a41186a4200370300200041e00d6a41106a4200370300200041e00d6a41086a4200370300200042003703e00d2000200b423388221420107c22154233882015201454ad420d8684221620117c22144233882014201654ad420d8684221720127c22164233882016201754ad420d8684221820137c221742ffffffffffffff03833703d0082000201642ffffffffffffff03833703c8082000201442ffffffffffffff03833703c008200020174233882017201854ad420d868442137e200b42ffffffffffffff03837c2214423388201542ffffffffffffff03837c3703b8082000201442ffffffffffffff03833703b008200041b0016a200041a0026a1065200041e00d6a200041b0086a106572106641ff01714101460d0020002903b00b211520002903b80b211420002802c00b2101200041a0026a200041b00b6a41146a41ac0110cf061a200041b0016a200041f00c6a41f00010cf061a200020013602c008200020143703b808200020153703b008200041b0086a41146a200041a0026a41ac0110cf061a200041b80a6a2013370300200041b00a6a2012370300200041a80a6a2011370300200041a00a6a2010370300200041980a6a200b370300200041900a6a200f370300200041880a6a200e370300200041800a6a200d370300200041f8096a2007370300200020093703f009200041c00a6a200041b0016a41f00010cf061a200041e00d6a41beeec6004109108001200041e00d6a41d4c0c70041004181acc7004113108101200041e00d6a41c7eec6004106200041d0096a4120108101200041e00d6a41cdeec6004107200041900b6a4120108101200041b00b6a41186a22014200370300200041b00b6a41106a22034200370300200041b00b6a41086a22044200370300200042003703b00b200041e00d6a41d4c0c7004100200041b00b6a4120108301200041003a00e00d200041003a00e10d200041003a00e20d200041003a00e30d200041003a00e40d200041003a00e50d200041003a00e60d200041003a00e70d200041003a00e80d200041003a00e90d200041003a00ea0d200041003a00eb0d200041003a00ec0d200041003a00ed0d200041003a00ee0d200041003a00ef0d200041003a00f00d200041003a00f10d200041003a00f20d200041003a00f30d200041003a00f40d200041003a00f50d200041003a00f60d200041003a00f70d200041003a00f80d200041003a00f90d200041003a00fa0d200041003a00fb0d200041003a00fc0d200041003a00fd0d200041003a00fe0d200041003a00ff0d200041003a00800e200041003a00810e200041003a00820e200041003a00830e200041003a00840e200041003a00850e200041003a00860e200041003a00870e200041003a00880e200041003a00890e200041003a008a0e200041003a008b0e200041003a008c0e200041003a008d0e200041003a008e0e200041003a008f0e200041003a00900e200041003a00910e200041003a00920e200041003a00930e200041003a00940e200041003a00950e200041003a00960e200041003a00970e200041003a00980e200041003a00990e200041003a009a0e200041003a009b0e200041003a009c0e200041003a009d0e200041003a009e0e200041003a009f0e200041003a00a00e200041003a00a10e200041003a00a20e200041003a00a30e200041003a00a40e200041003a00a50e200041003a00a60e200041003a00a70e200041003a00a80e200041003a00a90e200041003a00aa0e200041003a00ab0e200041003a00ac0e200041003a00ad0e200041003a00ae0e200041003a00af0e200041003a00b00e200041003a00b10e200041003a00b20e200041003a00b30e200041003a00b40e200041003a00b50e200041003a00b60e200041003a00b70e200041003a00b80e200041003a00b90e200041003a00ba0e200041003a00bb0e200041003a00bc0e200041003a00bd0e200041003a00be0e200041003a00bf0e200041003a00c00e200041003a00c10e200041003a00c20e200041003a00c30e200041003a00c40e200041003a00c50e200041003a00c60e200041003a00c70e200041003a00c80e200041003a00c90e200041003a00ca0e200041003a00cb0e200041003a00cc0e200041003a00cd0e200041003a00ce0e200041003a00cf0e200041003a00d00e200041003a00d10e200041003a00d20e200041003a00d30e200041003a00d40e200041003a00d50e200041003a00d60e200041003a00d70e200041003a00d80e200041003a00d90e200041003a00da0e200041003a00db0e200041003a00dc0e200041003a00dd0e200041003a00de0e200041003a00df0e200041003a00e00e200041003a00e10e200041003a00e20e200041003a00e30e200041003a00e40e200041003a00e50e200041003a00e60e200041003a00e70e200041003a00e80e200041003a00e90e200041003a00ea0e200041003a00eb0e200041003a00ec0e200041003a00ed0e200041003a00ee0e200041003a00ef0e200041003a00f00e200041003a00f10e200041003a00f20e200041003a00f30e200041003a00f40e200041003a00f50e200041003a00f60e200041003a00f70e200041003a00f80e200041003a00f90e200041003a00fa0e200041003a00fb0e200041003a00fc0e200041003a00fd0e200041003a00fe0e200041003a00ff0e200041003a00800f200041003a00810f200041003a00820f200041003a00830f200041003a00840f200041003a00850f200041003a00860f200041003a00870f200041003a00880f200041003a00890f200041003a008a0f200041003a008b0f200041003a008c0f200041003a008d0f200041003a008e0f200041003a008f0f200041003a00900f200041003a00910f200041003a00920f200041003a00930f200041003a00940f200041003a00950f200041003a00960f200041003a00970f200041003a00980f200041003a00990f200041003a009a0f200041003a009b0f200041003a009c0f200041003a009d0f200041003a009e0f200041003a009f0f200041003a00a00f200041003a00a10f200041003a00a20f200041003a00a30f200041003a00a40f200041003a00a50f200041003a00a60f200041003a00a70f200041e0066a41186a2001290300370300200041e0066a41106a2003290300370300200041e0066a41086a2004290300370300200020002903b00b3703e006410121030c010b410021030b2000280294052201450d00200141286c450d0020002802900510260b200041b0086a41186a200041e0066a41186a290300370300200041b0086a41106a200041e0066a41106a290300370300200041b0086a41086a200041e0066a41086a290300370300200020002903e0063703b008200041e00d6a41186a4200370300200041e00d6a41106a4200370300200041e00d6a41086a22014200370300200042003703e00d200041a0026a41868cc700410410fb012001200041a0026a41086a2204290000370300200020002900a0023703e00d200041a0026a41e0fcc600410b10fb01200241086a2004290000370000200220002900a0023700004121410120031b220110242204450d01200041003602b80b200020013602b40b200020043602b00b200041b00b6a41004101106d20002802b00b220120002802b80b22046a21050240024020030d00200541003a0000200441016a21030c010b200541013a00002000200441016a22013602b80b200041b00b6a20014120106d20002802b00b220120002802b80b22046a220320002903b008370000200341086a200041b0086a41086a290300370000200341106a200041b0086a41106a290300370000200341186a200041b0086a41186a290300370000200441206a21030b200020033602b80b200041e00d6a41202001200310b30120002802b40b450d00200110260b200041b00f6a24000f0b1033000b8d0204017f017e017f017e230041d0006b220224002002412036020420022001360200200241086a2001412010820202400240200228020822010d00420021030c010b200228020c210402400240200241086a41086a2802004108490d0020012900002105420121030c010b20024100360220200242013703182002410e36022c200220023602282002200241186a360234200241cc006a41013602002002420137023c2002418c8dc6003602382002200241286a360248200241346a41c4e1c000200241386a10351a200228021820022802201084020240200228021c450d00200228021810260b420021030b2004450d00200110260b2000200537030820002003370300200241d0006a24000bbd08020b7f037e230041a0026b22012400200141206a22024200370300200141186a22034200370300200141086a41086a420037030020014200370308200141086a41d18cc700410810fb01200141b8016a41bcd2c500410410fb012002200141b8016a41086a290000370300200320012900b8013703002001412036022c2001200141086a360228200141306a200141086a412010820202400240200128023022040d00410021050c010b200128023421062001200141306a41086a280200360244200120043602402001200141c0006a108f010240024020012802000d0002400240024002402001280204220720012802444105762202200220074b1b22024105742203417f4c0d000240024020020d00410121050c010b200310242205450d020b41002108200141003602502001200236024c200120053602480240024002402007450d0041002109034041002103200141003a00d8012001280244417f6a2102200941016a210903402002417f460d03200141b8016a20036a2001280240220a2d00003a00002001200a41016a3602402001200341016a220a3a00d801200120023602442002417f6a2102200a2103200a4120470d000b20014180026a41186a2202200141b8016a41186a29030037030020014180026a41106a2203200141b8016a41106a29030037030020014180026a41086a220b200141b8016a41086a290300370300200120012903b80137038002200a41ff01714120490d03200141f8006a41086a200b290300220c370300200141f8006a41106a2003290300220d370300200141f8006a41186a2002290300220e370300200141d8006a41186a2203200e370300200141d8006a41106a220a200d370300200141d8006a41086a220b200c3703002001200129038002220c370398012001200c3703782001200c37035802402008200128024c470d00200141c8006a2008410110930120012802482105200128025021080b200520084105746a22022001290358370000200241186a2003290300370000200241106a200a290300370000200241086a200b2903003700002001200841016a220836025020092007470d000b0b200129024c210c2005450d060c070b200341ff0171450d00200141003a00d8010b200141f8006a41186a20014198016a41186a290300370300200128024c41ffffff3f710d020c030b1034000b1033000b200510260b0b41002105200141003602880220014201370380022001410e3602e4012001200141286a3602e001200120014180026a36029801200141cc016a4101360200200142013702bc012001418c8dc6003602b8012001200141e0016a3602c80120014198016a41c4e1c000200141b8016a10351a200128028002200128028802108402200128028402450d0020012802800210260b2006450d00200410260b0240024020050d0020004100360208200042013702000c010b2000200c370204200020053602000b200141a0026a24000bb10302047f017e23004180016b22012400200141206a22024200370300200141186a22034200370300200141086a41086a420037030020014200370308200141086a41b48cc700410710fb01200141e8006a41a4b2c200410a10fb012002200141e8006a41086a290000370300200320012900683703002001412036022c2001200141086a360228200141306a200141086a412010820202400240200128023022030d00410021020c010b200128023421042001200141306a41086a28020036024420012003360240200141e8006a200141c0006a10920102400240200128026822020d004100210220014100360250200142013703482001410e36025c2001200141286a3602582001200141c8006a360264200141fc006a41013602002001420137026c2001418c8dc6003602682001200141d8006a360278200141e4006a41c4e1c000200141e8006a10351a200128024820012802501084020240200128024c450d00200128024810260b0c010b200129026c21050b2004450d00200310260b0240024020020d0020004100360208200042013702000c010b20002005370204200020023602000b20014180016a24000bcf0701047f23004190016b22022400200241e0006a22034200370300200241d8006a22044200370300200241c8006a41086a420037030020024200370348200241c8006a41b48cc700410710fb01200241e8006a4184c1c200410c10fb012003200241e8006a41086a29000037030020042002290068370300200241106a200241c8006a4120108902200241c8006a2002280214410020022802101b22042000108e05200241086a20022802482200200228025041d4c0c70041004100108102200228020821030240200228024c450d00200010260b4101210002400240024020034101460d00200241186a41d18cc700410810fb01200241e8006a41c0d2c500410e10fb0120022004360238200241f8006a200241386a410410a202200241d4006a2204200241386a41046a3602002002200241f8006a41086a36024c2002200241386a3602502002200241f8006a360248200241286a200241c8006a1073412010242200450d012002422037027c20022000360278200241f8006a41004120106d2002280278220020022802800122056a22032001290000370000200341086a200141086a290000370000200341106a200141106a290000370000200341186a200141186a2900003700002002200541206a22013602800120024188016a2000200110a2022004200020016a36020020022000360250200220024188016a41086a36024c200220024188016a360248200241386a200241c8006a10730240200228027c450d00200010260b20022802302201200228024022006a41206a2203417f4c0d020240024020030d0041012104410021030c010b200310242204450d020b20024100360250200220043602482002200336024c200241c8006a4100411010c9012002280248200228025022036a22042002290018370000200441086a200241186a41086a2900003700002002200341106a2203360250200241c8006a2003411010c9012002280248200228025022036a22042002290068370000200441086a200241e8006a41086a2900003700002002200341106a220436025020022802282103200241c8006a2004200110c9012002280248200228025022046a2003200110cf061a2002200420016a220436025020022802382101200241c8006a2004200010c90120022802482204200228025022056a2001200010cf061a2002200520006a22003602500240200228023c450d00200110260b0240200228022c450d00200310260b20022004200010890220022802042101200228020021000240200228024c450d00200410260b200141004720004100477121000b20024190016a240020000f0b1033000b1034000b0e002001ad4220862000ad84101d0bb70f02067f017e23004190056b2202240041002103200241003a00c8042001280204417f6a21040240024002400240024002400240024002400240024003402004417f460d01200241a8046a20036a200128020022052d00003a0000200120043602042001200541016a3602002002200341016a22053a00c8042004417f6a21042005210320054120470d000b200241d0046a41086a2203200241a8046a41086a290300370300200241d0046a41106a2206200241a8046a41106a290300370300200241d0046a41186a2207200241a8046a41186a290300370300200220022903a8043703d004200541ff0171411f4d0d01200241c8026a41086a20032903002208370300200241a8016a41186a2007290300370300200241a8016a41106a2006290300370300200241a8016a41086a2008370300200220022903d00422083703c802200220083703a80141002103200241003a00c80403402004417f460d03200241a8046a20036a200128020022052d00003a0000200120043602042001200541016a3602002002200341016a22053a00c8042004417f6a21042005210320054120470d000b200241d0046a41086a2203200241a8046a41086a290300370300200241d0046a41106a2206200241a8046a41106a290300370300200241d0046a41186a2207200241a8046a41186a290300370300200220022903a8043703d004200541ff0171411f4d0d03200241c8026a41086a20032903002208370300200241c8016a41186a2007290300370300200241c8016a41106a2006290300370300200241c8016a41086a2008370300200220022903d00422083703c802200220083703c80141002103200241003a00c80403402004417f460d05200241a8046a20036a200128020022052d00003a0000200120043602042001200541016a3602002002200341016a22053a00c8042004417f6a21042005210320054120470d000b200241d0046a41086a2203200241a8046a41086a290300370300200241d0046a41106a2206200241a8046a41106a290300370300200241d0046a41186a2207200241a8046a41186a290300370300200220022903a8043703d004200541ff0171411f4d0d05200241c8026a41086a20032903002208370300200241e8016a41186a2007290300370300200241e8016a41106a2006290300370300200241e8016a41086a2008370300200220022903d00422083703c802200220083703e80141002103200241003a00c80403402004417f460d07200241a8046a20036a200128020022052d00003a0000200120043602042001200541016a3602002002200341016a22053a00c8042004417f6a21042005210320054120470d000b200241d0046a41086a2203200241a8046a41086a290300370300200241d0046a41106a2206200241a8046a41106a290300370300200241d0046a41186a2207200241a8046a41186a290300370300200220022903a8043703d004200541ff0171411f4d0d0720024188026a41086a200329030037030020024188026a41106a200629030037030020024188026a41186a2007290300370300200220022903d00422083703e802200220083703880241002103200241003a00c80403402004417f460d09200241a8046a20036a200128020022052d00003a0000200120043602042001200541016a3602002002200341016a22053a00c8042004417f6a21042005210320054120470d000b200241d0046a41086a2204200241a8046a41086a290300370300200241d0046a41106a2201200241a8046a41106a290300370300200241d0046a41186a2203200241a8046a41186a290300370300200220022903a8043703d004200541ff0171411f4d0d09200241c8026a41086a20042903002208370300200241a8026a41186a22042003290300370300200241a8026a41106a22032001290300370300200241a8026a41086a22012008370300200220022903d00422083703c802200220083703a802200241086a41186a200241a8016a41186a290300370300200241086a41106a200241a8016a41106a290300370300200241086a41086a200241a8016a41086a290300370300200220022903a801370308200241c0006a200241c8016a41186a290300370300200241386a200241c8016a41106a290300370300200241306a200241c8016a41086a290300370300200220022903c801370328200241e0006a200241e8016a41186a290300370300200241d8006a200241e8016a41106a290300370300200241d0006a200241e8016a41086a290300370300200220022903e80137034820024180016a20024188026a41186a290300370300200241f8006a20024188026a41106a290300370300200241f0006a20024188026a41086a2903003703002002200229038802370368200241a0016a200429030037030020024198016a200329030037030020024190016a2001290300370300200220022903a80237038801200041016a200241086a41a00110cf061a200041003a00000c0a0b200341ff0171450d00200241003a00c8040b200041013a00000c080b200341ff0171450d00200241003a00c8040b200041013a00000c060b200341ff0171450d00200241003a00c8040b200041013a00000c040b200341ff0171450d00200241003a00c8040b200041013a00000c020b200341ff0171450d00200241003a00c8040b200041013a00000b20024190056a24000b930401057f230041e0006b22022400200241086a41b48cc700410710fb01200241186a41dcc2c200410810fb0102400240412010242203450d002002422037023c20022003360238200241386a41004120106d20022802382203200228024022046a22052001290000370000200541086a200141086a290000370000200541106a200141106a290000370000200541186a200141186a2900003700002002200441206a2201360240200241c8006a2003200110a202200241dc006a200320016a360200200220033602582002200241c8006a41086a3602542002200241c8006a360250200241286a200241d0006a10730240200228023c450d00200310260b2002280230220341206a2205417f4c0d010240024020050d0041012101410021050c010b200510242201450d010b20002001360200200041086a220141003602002000200536020420004100411010c9012000280200200128020022056a220420022900083700002001200541106a2205360200200441086a200241086a41086a29000037000020002005411010c9012000280200200128020022056a220420022900183700002001200541106a2206360200200441086a200241186a41086a2900003700002002280228210520002006200310c9012000280200200128020022006a2005200310cf061a2001200020036a3602000240200228022c450d00200510260b200241e0006a24000f0b1033000b1034000bcb0201027f23004180036b220324002003200236020c20032001360208200341106a2001200210820202400240200328021022010d00200041003a00000c010b200328021421042003200341186a2802003602ec02200320013602e802200341c0016a200341e8026a10b003410121020240024020032d00c0014101470d004100210220034100360228200342013703202003410e3602f4022003200341086a3602f0022003200341206a3602fc02200341d4016a4101360200200342013702c4012003418c8dc6003602c0012003200341f0026a3602d001200341fc026a41c4e1c000200341c0016a10351a200328022020032802281084022003280224450d01200328022010260c010b200341206a200341c0016a41017241a00110cf061a200041016a200341206a41a00110cf061a0b200020023a00002004450d00200110260b20034180036a24000bc76305087f017e087f027e027f230041e0026b2205240002400240024002400240410810242206450d0020062001200241c0016c6a220736020420062001360200410810242208450d0020082003200441c0016c6a2209360204200820033602000240024002402000450d00200541e8016a210a0c010b200541e8016a41186a220b4200370300200541e8016a41106a22024200370300200541e8016a41086a220c4200370300200542003703e801200541b8026a41aed3c500410f10fb01200c200541b8026a41086a2204290000370300200520052900b8023703e801200541b8026a41c5d8c500410710fb01200b2004290000370300200220052900b802370300200541d0006a200541e8016a412041d4c0c70041004100108102200541e8016a210a20052802504101460d00200b420037030020024200370300200c4200370300200542003703e801200541b8026a41aed3c500410f10fb01200c2004290000370300200520052900b8023703e801200541b8026a41e4e8c500410c10fb01200241086a2004290000370000200220052900b802370000200541c0006a200541e8016a10ab032005290348210d20052802402102200541b8026a41186a220b4200370300200541b8026a41106a220e420037030020044200370300200542003703b80220054198016a41b48cc700410710fb01200420054198016a41086a29030037030020052005290398013703b802200541e8016a4184c1c200410c10fb01200b200c290300370300200e20052903e801370300200541386a200541b8026a4120108902200528023c210c2005280238210b200541e8016a200d420020021b109b0520052802f001210220052802e80121042005200c4100200b1b3602b80220042002200541b8026a410410b301024020052802ec01450d00200410260b20081026200610260c010b200541b8026a2006109c050240024020052802b802450d00200541e8016a41106a200541b8026a41106a290300370300200541e8016a41086a200541b8026a41086a290300370300200541e8016a41186a200541b8026a41186a290300370300200541e8016a41206a200541b8026a41206a280200360200200541c8016a41086a200541f4016a290200370300200541c8016a41106a200541fc016a290200370300200541c8016a41186a20054184026a290200370300200520052903b8023703e801200520052902ec013703c801200541e8016a2006109d05417f20052802e801220441016a220220022004491bad42287e220d422088a70d04200da72204417f4c0d0420041024220f450d05200f20052903c801370300200f4201370320200f41186a200541c8016a41186a2210290300370300200f41106a200541c8016a41106a2211290300370300200f41086a200541c8016a41086a22122903003703004101210c200541013602b0012005200f3602a8012005200441286e22043602ac01200541b8026a2006109c05024020052802b802450d00200541e8016a41047221024128210b4101210c0340200541e8016a41206a200541b8026a41206a280200360200200541e8016a41186a220e200541b8026a41186a290300370300200541e8016a41106a2213200541b8026a41106a290300370300200541e8016a41086a2214200541b8026a41086a290300370300200520052903b8023703e8012012200241086a2902003703002011200241106a2902003703002010200241186a290200370300200520022902003703c801200e20102903003703002013201129030037030020142012290300370300200520052903c8013703e8010240200c2004470d00200541b8026a2006109d05200541a8016a2004417f20052802b802220f41016a22152015200f491b10900120052802a801210f0b200f200b6a220420052903e8013703002014290300210d20132903002116200e2903002117200441206a4201370300200441186a2017370300200441106a2016370300200441086a200d3703002005200c41016a220c3602b001200541b8026a2006109c05200b41286a210b20052802ac01210420052802b8020d000b0b200610260c010b200610264108210f4100210c410021040b20054180026a220b4200370300200541f8016a22024200370300200541e8016a41086a4200370300200542003703e801200541b8026a41aed3c500410f10fb01200a41086a200541b8026a41086a220e290000370000200a20052900b802370000200541b8026a41c5d8c500410710fb01200b200e290000370300200220052900b802370300200541b8026a200a412010e1040240024020052802b8024101460d002005200c3602f001200520043602ec012005200f3602e801200541c8016a200541e8016a410041002005109e050c010b200a412010ff0120052902bc02210d2005200c3602f001200520043602ec012005200f3602e801200541c8016a200541e8016a200da74101200d422088a7109e050b20052d00c801210b200541e8016a41186a220e4200370300200541e8016a41106a22134200370300200541e8016a41086a220c4200370300200542003703e801200541b8026a41aed3c500410f10fb01200a41086a2214200541b8026a41086a2204290000370000200a20052900b802370000200541b8026a41e4e8c500410c10fb01200241086a22062004290000370000200220052900b802370000200541286a200a10ab032005290330420020052802281b210d0240200b4104470d00200e420037030020134200370300200c4200370300200542003703e801200541b8026a41aed3c500410f10fb0120142004290000370000200a20052900b802370000200541b8026a41e4e8c500410c10fb0120062004290000370000200220052900b8023700002005200d42017c220d3703b802200a4120200541b8026a410810b3010b200541b8026a41186a22024200370300200541b8026a41106a220b420037030020044200370300200542003703b80220054198016a41b48cc700410710fb01200420054198016a41086a29030037030020052005290398013703b802200541e8016a4184c1c200410c10fb012002200c290300370300200b20052903e801370300200541206a200541b8026a4120108902200528022421022005280220210c200541e8016a200d109b0520052802f001210b20052802e8012104200520024100200c1b3602b8022004200b200541b8026a410410b301024020052802ec01450d00200410260b200810260b41081024220f450d00200f2007360204200f2001360200410810242208450d002008200936020420082003360200200541b8026a200f109f050240024020052802b802450d00200541e8016a41106a200541b8026a41106a290300370300200541e8016a41086a200541b8026a41086a290300370300200541e8016a41186a200541b8026a41186a290300370300200541e8016a41206a200541b8026a41206a280200360200200541c8016a41086a200541f4016a290200370300200541c8016a41106a200541fc016a290200370300200541c8016a41186a20054184026a290200370300200520052903b8023703e801200520052902ec013703c801200541e8016a200f109d05417f20052802e801220441016a220220022004491bad42287e220d422088a70d03200da72204417f4c0d0320041024220a450d04200a20052903c801370300200a4201370320200a41186a200541c8016a41186a2206290300370300200a41106a200541c8016a41106a2210290300370300200a41086a200541c8016a41086a22122903003703004101210c200541013602b0012005200a3602a8012005200441286e22113602ac01200541b8026a200f109f05024020052802b802450d00200541e8016a41047221024128210b4101210c0340200541e8016a41206a200541b8026a41206a280200360200200541e8016a41186a220e200541b8026a41186a290300370300200541e8016a41106a2213200541b8026a41106a290300370300200541e8016a41086a2214200541b8026a41086a290300370300200520052903b8023703e8012012200241086a2902003703002010200241106a2902003703002006200241186a290200370300200520022902003703c801200e20062903003703002013201029030037030020142012290300370300200520052903c8013703e8010240200c2011470d00200541b8026a200f109d05200541a8016a2011417f20052802b802220441016a221520152004491b10900120052802a801210a0b200a200b6a220420052903e8013703002014290300210d20132903002116200e2903002117200441206a4201370300200441186a2017370300200441106a2016370300200441086a200d3703002005200c41016a220c3602b001200541b8026a200f109f05200b41286a210b20052802ac01211120052802b8020d000b0b200f10260c010b200f1026410021114108210a4100210c0b200541b8026a2008109f050240024020052802b802450d00200541e8016a41106a200541b8026a41106a290300370300200541e8016a41086a200541b8026a41086a290300370300200541e8016a41186a200541b8026a41186a290300370300200541e8016a41206a200541b8026a41206a280200360200200541c8016a41086a200541f4016a290200370300200541c8016a41106a200541fc016a290200370300200541c8016a41186a20054184026a290200370300200520052903b8023703e801200520052902ec013703c801200541e8016a2008109d05417f20052802e801220441016a220220022004491bad42287e220d422088a70d03200da72204417f4c0d03200410242218450d04201820052903c80137030020184201370320201841186a200541c8016a41186a2212290300370300201841106a200541c8016a41106a220f290300370300201841086a200541c8016a41086a221529030037030041012113200541013602b001200520183602a8012005200441286e22103602ac01200541b8026a2008109f05024020052802b802450d00200541e8016a41047221024128210b410121130340200541e8016a41206a200541b8026a41206a280200360200200541e8016a41186a220e200541b8026a41186a290300370300200541e8016a41106a2214200541b8026a41106a290300370300200541e8016a41086a2206200541b8026a41086a290300370300200520052903b8023703e8012015200241086a290200370300200f200241106a2902003703002012200241186a290200370300200520022902003703c801200e20122903003703002014200f29030037030020062015290300370300200520052903c8013703e801024020132010470d00200541b8026a2008109d05200541a8016a2010417f20052802b802220441016a221820182004491b10900120052802a80121180b2018200b6a220420052903e8013703002006290300210d20142903002116200e2903002117200441206a4201370300200441186a2017370300200441106a2016370300200441086a200d3703002005201341016a22133602b001200541b8026a2008109f05200b41286a210b20052802ac01211020052802b8020d000b0b200810260c010b200810264100211041082118410021130b200541d0026a220b4200370300200541c8026a22064200370300200541b8026a41086a22044200370300200542003703b802200541d8006a41868cc700410410fb012004200541d8006a41086a2202290000370300200520052900583703b802200541d8006a41b49dc600410a10fb01200b200229000037030020062005290058370300200541106a200541b8026a10ab032005290318420020052802101b220d42017c2216200d540d03200b42003703002006420037030020044200370300200542003703b802200541d8006a41868cc700410410fb0120042002290000370300200520052900583703b802200541d8006a41b49dc600410a10fb01200641086a220e200229000037000020062005290058370000200520163703e801200541b8026a4120200541e8016a410810b301200b42003703002006420037030020044200370300200542003703b802200541d8006a41868cc700410410fb0120042002290000370300200520052900583703b802200541d8006a41dc9dc600410b10fb01200e200229000037000020062005290058370000200c41286c4104722204417f4c0d01200410242202450d02200541003602f001200520043602ec01200520023602e801200541e8016a200c10a10102400240200c0d0020052802e801210c20052802f00121020c010b200a200c41286c6a210b20052802f0012102200a21040340200541e8016a20024120106d20052802e80120052802f001220c6a22022004290000370000200241086a200441086a290000370000200241106a200441106a290000370000200241186a200441186a2900003700002005200c41206a22023602f001200441206a290300210d200541e8016a20024108106d20052802e801220c20052802f00122026a200d3700002005200241086a22023602f001200b200441286a2204470d000b0b200541b8026a4120200c200210b301024020052802ec01450d00200c10260b02402011450d00201141286c450d00200a10260b201642017c220d2016540d04200541f8006a41186a22044200370300200541f8006a41106a22114200370300200541f8006a41086a2202420037030020054200370378200541d8006a41868cc700410410fb012002200541d8006a41086a220c29000037030020052005290058370378200541d8006a41b4a0c600410e10fb012004200c29000037030020112005290058370300200541e8016a200541f8006a10a00520052d00e8012104200541b8026a41186a220220054181026a290000370300200541b8026a41106a220c200541f9016a290000370300200541b8026a41086a220b200541f1016a290000370300200520052900e9013703b8020240024020044101460d00200541a8016a41186a4200370300200541a8016a41106a4200370300200541a8016a41086a4200370300200542003703a8010c010b200541a8016a41186a2002290300370300200541a8016a41106a200c290300370300200541a8016a41086a200b290300370300200520052903b8023703a8010b200541f8006a41186a220c4200370300200541f8006a41106a220b4200370300200541f8006a41086a2202420037030020054200370378200541d8006a41868cc700410410fb012002200541d8006a41086a220429000037030020052005290058370378200541d8006a41dca0c600410c10fb01201141086a220e200429000037000020112005290058370000200541086a200541f8006a4120108902200528020c211420052802082112200c4200370300200b42003703002002420037030020054200370378200541d8006a41868cc700410410fb012002200429000037030020052005290058370378200541d8006a41dca0c600410c10fb01200e200429000037000020112005290058370000200541003602e801200541f8006a4120200541e8016a410410b301200541d8006a41186a200541a8016a41186a290300370300200541d8006a41106a200541a8016a41106a2903003703002004200541a8016a41086a290300370300200520052903a801370358417f2014410020121b221441016a220420042014491b410d744128722204417f4c0d0120041024220c450d0241002102200541003602a0012005200436029c012005200c3602980120054198016a4100412010c90120052802980120052802a001220c6a22042005290358370000200441086a200541d8006a41086a290300370000200441106a200541d8006a41106a290300370000200441186a200541d8006a41186a2903003700002005200c41206a22043602a00120054198016a2004410810c901200528029801220f20052802a00122046a200d3700002005200441086a22123602a0014100210402400340024002402004450d00200c200b470d01200e41ffffff3f71450d00200410260b200220144f0d02200541f8006a2002109102200541e8016a2005280278220c200528028001220b1092020240024020052802e80122040d004200210d410121040c010b200c200b10ff0120052902ec01210d0b0240200528027c450d00200c10260b200241016a21022004200d422088a74105746a210b200da7210e2004210c0c010b200541b8026a41186a200c41186a220f290000370300200541b8026a41106a200c41106a2215290000370300200541b8026a41086a200c41086a220a2900003703002005200c2900003703b802200a290000210d20152900002116200c2900002117200541c8016a41186a2215200f290000370300200541c8016a41106a220f2016370300200541c8016a41086a220a200d370300200520173703c801200541f8006a41186a22082015290300370300200541f8006a41106a2215200f290300370300200541f8006a41086a2219200a290300370300200520052903c80137037820054198016a2012412010c901200528029801220f20052802a001220a6a22122005290378370000201241086a2019290300370000201241106a2015290300370000201241186a20082903003700002005200a41206a22123602a001200c41206a210c0c000b0b200541e8016a200f20121096010240200528029c01450d00200f10260b200541f8006a41186a4200370300200541f8006a41106a4200370300200541f8006a41086a2204420037030020054200370378200541d8006a41868cc700410410fb012004200541d8006a41086a220229000037030020052005290058370378200541d8006a41b4a0c600410e10fb01201141086a200229000037000020112005290058370000412010242204450d02200542203702bc02200520043602b802200541b8026a41004120106d20052802b802220220052802c002220c6a220420052900e801370000200441086a200541e8016a41086a290000370000200441106a200541e8016a41106a290000370000200441186a200541e8016a41186a2900003700002005200c41206a22043602c002200541f8006a41202002200410b301024020052802bc02450d00200210260b200541e8016a41186a220c200541a8016a41186a290300370300200541e8016a41106a220b200541a8016a41106a290300370300200541e8016a41086a220e200541a8016a41086a290300370300200520052903a8013703e801200541b8026a41186a4200370300200541b8026a41106a4200370300200541b8026a41086a22044200370300200542003703b802200541d8006a41868cc700410410fb012004200541d8006a41086a2202290000370300200520052900583703b802200541d8006a41f89ec600410a10fb01200641086a200229000037000020062005290058370000412010242204450d02200542203702cc01200520043602c801200541c8016a41004120106d20052802c801220220052802d00122146a220420052903e801370000200441086a200e290300370000200441106a200b290300370000200441186a200c2903003700002005201441206a22043602d001200541b8026a41202002200410b301024020052802cc01450d00200210260b200541b8026a41186a22024200370300200541b8026a41106a220c4200370300200541b8026a41086a22044200370300200542003703b802200541d8006a41868cc700410410fb012004200541d8006a41086a220b290000370300200520052900583703b802200541d8006a41b4a0c600410e10fb01200641086a200b29000037000020062005290058370000200541e8016a200541b8026a10a00520052d00e801210b200220054181026a290000370300200c200541f9016a2900003703002004200541f1016a290000370300200520052900e9013703b80202400240200b4101460d00200541c8016a41186a4200370300200541c8016a41106a4200370300200541c8016a41086a4200370300200542003703c8010c010b200541c8016a41186a2002290300370300200541c8016a41106a200c290300370300200541c8016a41086a2004290300370300200520052903b8023703c8010b200541e8016a410c6a2013360200200541e8016a41086a2010360200200541e8016a41106a20052903c801370300200541e8016a41186a200541c8016a41086a290300370300200541e8016a41206a200541c8016a41106a290300370300200541e8016a41286a200541c8016a41186a290300370300200520183602ec01200541003602e801200541b8026a200541e8016a10f902200541e3006a200541b8026a41086a2204280200360000200520052903b80237005b200541b8026a410c6a200541df006a290000370000200541c28289aa043600b902200541023a00b802200520052900583700bd02200541b8026a10860202402010450d00201041286c450d00201810260b200541b8026a41186a4200370300200541b8026a41106a420037030020044200370300200542003703b802200541d8006a41868cc700410410fb012004200541d8006a41086a2202290000370300200520052900583703b802200541d8006a41f89fc600410f10fb01200641086a200229000037000020062005290058370000200541203602a4022005200541b8026a3602a002200541d8006a200541b8026a412010820202400240200528025822040d00410321040c010b200528025c21020240024002400240200541e0006a280200220c450d0020042d00004101470d00200c417f6a4108490d00200c41776a4108490d00200c4111460d0020042d0011220c41024b0d002004290001210d200429000921164100210b0240200c0e03030200030b4102210b0c020b2005410036028001200542013703782005410e3602ac022005200541a0026a3602a8022005200541f8006a3602b4024101210c200541fc016a4101360200200542013702ec012005418c8dc6003602e8012005200541a8026a3602f801200541b4026a41c4e1c000200541e8016a10351a20052802782005280280011084020240200528027c450d00200528027810260b4103210b0c020b4101210b0b200520052800a802360298022005200541ab026a28000036009b02200520163703a0012005200d370398014100210c0b02402002450d00200410260b41032104200c0d00200541b8026a412010ff01200b21040b200541e8016a41086a220220054198016a41086a29030037030020052005290398013703e80120052005280298023602a8022005200528009b023600ab02024020044103460d00200541f8006a41086a2002290300220d370300200520052903e8012216370378200520052802a8023602a002200520052800ab023600a302200541f8016a200d3703002002201637030020054180026a20043a000020054184026a20052800a302360000200520052802a00236008102200541023602e801200541b8026a200541e8016a10f902200541db006a220441086a200541b8026a41086a280200360000200420052903b802370000200541c4026a200541df006a290000370000200541c28289aa043600b902200541023a00b802200520052900583700bd02200541b8026a1086020b410810242210450d00201020073602042010200136020041081024220a450d00200a2009360204200a2003360200200541b8026a41186a220c4200370300200541b8026a41106a220b4200370300200541b8026a41086a22044200370300200542003703b80220054198016a41808cc700410610fb01200420054198016a41086a29030037030020052005290398013703b802200541e8016a41ea93c400410610fb01200c200541e8016a41086a2202290300370300200b20052903e8013703002005200541b8026a41201089022005280200211320052802042114200541e8016a41186a220e4200370300200541e8016a41106a2215420037030020024200370300200542003703e801200541b8026a41d18cc700410810fb0120022004290000370300200520052900b8023703e801200541b8026a41e3d3c500410e10fb01200e2004290000370300201520052900b8023703002005201441ac026a41ac0220131b3602b802200541e8016a4120200541b8026a410410b301200541b8026a201010a1050240024020052802b802450d002015200b29030037030020022004290300370300200e200c290300370300200541e8016a41206a200541b8026a41206a280200360200200541f8006a41086a200541f4016a290200370300200541f8006a41106a200541fc016a290200370300200541f8006a41186a20054184026a290200370300200520052903b8023703e801200520052902ec01370378200541e8016a2010109d05417f20052802e801220441016a220220022004491b220441ffffff3f712004470d0320044105742204417f4c0d0320041024220f450d04200f2005290378370000200f41186a200541f8006a41186a290300370000200f41106a200541f8006a41106a290300370000200f41086a200541f8006a41086a2903003700004101210c200541013602b0012005200f3602a8012005200441057622063602ac01200541b8026a201010a105024020052802b802450d00200541e8016a41047221044120210b4101210c0340200541e8016a41206a200541b8026a41206a280200360200200541e8016a41186a200541b8026a41186a220e290300370300200541e8016a41106a200541b8026a41106a2213290300370300200541e8016a41086a200541b8026a41086a2214290300370300200520052903b8023703e801200541c8016a41086a2202200441086a290000370300200541c8016a41106a2211200441106a290000370300200541c8016a41186a2212200441186a290000370300200520042900003703c801200e20122903003703002013201129030037030020142002290300370300200520052903c8013703b8020240200c2006470d00200541e8016a2010109d05200541a8016a2006417f20052802e801220241016a221120112002491b10930120052802a801210f0b200f200b6a220220052903b802370000200241186a200e290300370000200241106a2013290300370000200241086a20142903003700002005200c41016a220c3602b001200541b8026a201010a105200b41206a210b20052802ac01210620052802b8020d000b0b201010260c010b201010264101210f4100210c410021060b20054180026a4200370300200541f8016a4200370300200541e8016a41086a22044200370300200542003703e801200541b8026a41d18cc700410810fb012004200541b8026a41086a2202290000370300200520052900b8023703e801200541b8026a41bcd2c500410410fb01201541086a2002290000370000201520052900b802370000200c4105744104722204417f4c0d01200410242202450d02200541003602c002200520043602bc02200520023602b802200541b8026a200c10a10102400240200c0d0020052802b802210e20052802c00221020c010b200c410574210c20052802c0022102200f21040340200541b8026a20024120106d20052802b802220e20052802c002220b6a22022004290000370000200241086a200441086a290000370000200241106a200441106a290000370000200241186a200441186a2900003700002005200b41206a22023602c002200441206a2104200c41606a220c0d000b0b200541e8016a4120200e200210b301024020052802bc02450d00200e10260b0240200641ffffff3f71450d00200f10260b200a1026410810242210450d002010200736020420102001360200410810242215450d002015200936020420152003360200024002402000450d00200541b8026a201010a2050240024020052802b802450d00200541e8016a41106a200541b8026a41106a290300370300200541e8016a41086a200541b8026a41086a290300370300200541e8016a41186a200541b8026a41186a290300370300200541e8016a41206a200541b8026a41206a280200360200200541f8006a41086a200541f4016a290200370300200541f8006a41106a200541fc016a290200370300200541f8006a41186a20054184026a290200370300200520052903b8023703e801200520052902ec01370378200541e8016a2010109d05417f20052802e801220441016a220220022004491b220441ffffff3f712004470d0520044105742204417f4c0d0520041024220f450d06200f2005290378370000200f41186a200541f8006a41186a290300370000200f41106a200541f8006a41106a290300370000200f41086a200541f8006a41086a2903003700004101210c200541013602b0012005200f3602a8012005200441057622063602ac01200541b8026a201010a205024020052802b802450d00200541e8016a41047221044120210b4101210c0340200541e8016a41206a200541b8026a41206a280200360200200541e8016a41186a200541b8026a41186a220e290300370300200541e8016a41106a200541b8026a41106a2213290300370300200541e8016a41086a200541b8026a41086a2214290300370300200520052903b8023703e801200541c8016a41086a2202200441086a290000370300200541c8016a41106a2211200441106a290000370300200541c8016a41186a2212200441186a290000370300200520042900003703c801200e20122903003703002013201129030037030020142002290300370300200520052903c8013703b8020240200c2006470d00200541e8016a2010109d05200541a8016a2006417f20052802e801220241016a221120112002491b10930120052802a801210f0b200f200b6a220220052903b802370000200241186a200e290300370000200241106a2013290300370000200241086a20142903003700002005200c41016a220c3602b001200541b8026a201010a205200b41206a210b20052802ac01210620052802b8020d000b0b201010260c010b20101026410021064101210f4100210c0b200541f0006a22044200370300200541e8006a22024200370300200541d8006a41086a220b42003703002005420037035820054198016a41eb8cc700410a10fb01200b20054198016a41086a2903003703002005200529039801370358200541e8016a41dc9dc600410b10fb012004200541e8016a41086a290300370300200220052903e801370300200c4105744104722204417f4c0d03200410242202450d04200541003602f001200520043602ec01200520023602e801200541e8016a200c10a10102400240200c0d0020052802e801210e20052802f00121020c010b200c410574210c20052802f0012102200f21040340200541e8016a20024120106d20052802e801220e20052802f001220b6a22022004290000370000200241086a200441086a290000370000200241106a200441106a290000370000200241186a200441186a2900003700002005200b41206a22023602f001200441206a2104200c41606a220c0d000b0b200541d8006a4120200e200210b301024020052802ec01450d00200e10260b0240200641ffffff3f71450d00200f10260b201510260c010b20151026201010260b410810242210450d002010200736020420102001360200410810242215450d002015200936020420152003360200024002402000450d00200541b8026a201010a3050240024020052802b802450d00200541e8016a41106a200541b8026a41106a290300370300200541e8016a41086a200541b8026a41086a290300370300200541e8016a41186a200541b8026a41186a290300370300200541e8016a41206a200541b8026a41206a280200360200200541f8006a41086a200541f4016a290200370300200541f8006a41106a200541fc016a290200370300200541f8006a41186a20054184026a290200370300200520052903b8023703e801200520052902ec01370378200541e8016a2010109d05417f20052802e801220441016a220220022004491b220441ffffff3f712004470d0520044105742204417f4c0d0520041024220f450d06200f2005290378370000200f41186a200541f8006a41186a290300370000200f41106a200541f8006a41106a290300370000200f41086a200541f8006a41086a2903003700004101210c200541013602b0012005200f3602a8012005200441057622063602ac01200541b8026a201010a305024020052802b802450d00200541e8016a41047221044120210b4101210c0340200541e8016a41206a200541b8026a41206a280200360200200541e8016a41186a200541b8026a41186a220e290300370300200541e8016a41106a200541b8026a41106a2213290300370300200541e8016a41086a200541b8026a41086a2214290300370300200520052903b8023703e801200541c8016a41086a2202200441086a290000370300200541c8016a41106a2211200441106a290000370300200541c8016a41186a2212200441186a290000370300200520042900003703c801200e20122903003703002013201129030037030020142002290300370300200520052903c8013703b8020240200c2006470d00200541e8016a2010109d05200541a8016a2006417f20052802e801220241016a221120112002491b10930120052802a801210f0b200f200b6a220220052903b802370000200241186a200e290300370000200241106a2013290300370000200241086a20142903003700002005200c41016a220c3602b001200541b8026a201010a305200b41206a210b20052802ac01210620052802b8020d000b0b201010260c010b201010264101210f4100210c410021060b200541f0006a22044200370300200541e8006a22024200370300200541d8006a41086a420037030020054200370358200541d8006a41d98cc700411210fb01200541e8016a41bcd2c500410410fb012004200541e8016a41086a290300370300200220052903e801370300200c4105744104722204417f4c0d03200410242202450d04200541003602f001200520043602ec01200520023602e801200541e8016a200c10a10102400240200c0d0020052802e801210e20052802f00121020c010b200c410574210c20052802f0012102200f21040340200541e8016a20024120106d20052802e801220e20052802f001220b6a22022004290000370000200241086a200441086a290000370000200241106a200441106a290000370000200241186a200441186a2900003700002005200b41206a22023602f001200441206a2104200c41606a220c0d000b0b200541d8006a4120200e200210b301024020052802ec01450d00200e10260b0240200641ffffff3f71450d00200f10260b201510260c010b20151026201010260b200541e0026a24000f0b102c000b1034000b1033000b41d4e0c60041c90041a0e1c6001053000b41d4e0c60041c90041b0e1c6001053000b9a1707077f017e0c7f017e027f017e067f23004190046b22012400200141286a22024200370300200141206a22034200370300200141106a41086a420037030020014200370310200141106a41a28cc700410a10fb01200141a8036a41e0b8c500410610fb012002200141a8036a41086a290000370300200320012900a803370300200141203602342001200141106a360230200141386a200141106a412010820202400240200128023822040d00410021050c010b200128023c21062001200141386a41086a28020036024c20012004360248200141086a200141c8006a108f010240024020012802080d00024002400240200128020c2207200128024c41c4006e2202200220074b1bad42c4007e2208422088a70d002008a72202417f4c0d0002400240024020020d00410421050c010b200210242205450d010b20014100360258200120053602502001200241c4006e360254024002402007450d00200141a8036a41077221094100210a4100210b03400240024002400240200128024c220c450d002001280248220d2d000021022001200c417f6a220e36024c2001200d41016a360248200241014b0d000240024020020e020001000b200e4104490d012001419c026a41026a200141d0036a41026a2d00003a000020014180026a41086a200141f0036a41086a29020037030020014180026a41106a200141f0036a41106a29020037030020014180026a41186a200141f0036a41186a2d00003a0000200141e0016a41086a200141a8036a41086a290100370300200141e0016a41106a200141a8036a41106a290100370300200141e0016a41186a200141a8036a41186a290100370300200120012f00d0033b019c02200120012902f00337038002200120012901a8033703e001200d280001210f2001200c417b6a36024c2001200d41056a360248410021030c040b41002103200141003a00c803200c417e6a211002400340200e20032202460d01200141a8036a20026a200d20026a220341016a2d00003a00002001200341026a3602482001200241016a22033a00c8032001201036024c2010417f6a211020034120460d030c000b0b200241ff0171450d02200141003a00c8030c020b200141dc016a41026a2001419c026a41026a2d00003a0000200141c0016a41086a20014180026a41086a290300370300200141c0016a41106a20014180026a41106a290300370300200141c0016a41186a20014180026a41186a2d00003a0000200141a0016a41086a200141e0016a41086a290300370300200141a0016a41106a200141e0016a41106a290300370300200141a0016a41186a200141e0016a41186a290300370300200120012f019c023b01dc0120012001290380023703c001200120012903e0013703a0010c050b200141c0026a41026a221120012d00aa0322123a0000200141e8026a41026a20123a0000200141f0036a41086a2213200941086a2900002208370300200141f0036a41106a2214200941106a2900002215370300200141f0036a41186a2216200941186a2d000022123a0000200120012f01a80322173b01c002200120173b01e8022001200929000022183703f00320012800ab032119200141d0036a41186a221720123a0000200141d0036a41106a22122015370300200141d0036a41086a221a2008370300200120183703d003200341ff0171411f4d0d00200141e4026a41026a20112d000022113a000020014188036a41086a221b201a290300220837030020014188036a41106a221c2012290300221537030020014188036a41186a221d20172d000022123a0000200141bc026a41026a221a20113a0000200120012f01c00222173b01e402200120012903d003221837038803200120173b01bc02200141a0026a41186a221720123a0000200141a0026a41106a22122015370300200141a0026a41086a22112008370300200120183703a002200e2003460d00200d20036a220d41016a2d0000210e2001201036024c2001200d41026a360248200e41014b0d00410021100240024002400240200e0e020100010b41002110200141003a00c8032003200c6b41026a210e200c20026b417c6a21020340200e20106a450d02200141a8036a20106a200d20106a220341026a2d00003a00002001200341036a3602482001201041016a22033a00c8032001200236024c2002417f6a21022003211020034120470d000b2016200141a8036a41186a2903003703002014200141a8036a41106a2903003703002013200141a8036a41086a290300370300200120012903a8033703f003200341ff01714120490d02201b20132903002208370300200141e8026a41186a22022016290300370300200141e8026a41106a22032014290300370300200141e8026a41086a22102008370300200120012903f003220837038803200120083703e802200141c0026a41186a2002290300370300200141c0026a41106a2003290300370300200141c0026a41086a2010290300370300200120012903e8023703c002410121100b200141e0016a41186a200141c0026a41186a290300370300200141e0016a41106a200141c0026a41106a290300370300200141e0016a41086a200141c0026a41086a2903003703002001419c026a41026a201a2d00003a000020014180026a41086a201129030037030020014180026a41106a201229030037030020014180026a41186a20172d00003a0000200120012903c0023703e001200120012f01bc023b019c02200120012903a00237038002410121032010211e2019210f0c030b201041ff0171450d00200141003a00c8030b200141e8026a41186a201d290300370300200141e8026a41106a201c2903003703000b410221030b200141dc016a41026a22022001419c026a41026a2d00003a0000200141c0016a41086a221020014180026a41086a290300370300200141c0016a41106a220d20014180026a41106a290300370300200141c0016a41186a220e20014180026a41186a2d00003a0000200141a0016a41086a220c200141e0016a41086a290300370300200141a0016a41106a2212200141e0016a41106a290300370300200141a0016a41186a2217200141e0016a41186a290300370300200120012f019c023b01dc0120012001290380023703c001200120012903e0013703a00120034102460d02200b41016a210b2001419c016a41026a221120022d00003a000020014180016a41086a221a201029030037030020014180016a41106a2210200d29030037030020014180016a41186a220d200e2d00003a0000200141e0006a41086a220e200c290300370300200141e0006a41106a220c2012290300370300200141e0006a41186a22122017290300370300200120012f01dc013b019c01200120012903c00137038001200120012903a0013703600240200a2001280254470d00200141d0006a200a10f701200128025021052001280258210a0b2005200a41c4006c6a220220033a00002002200f360004200241036a20112d00003a0000200220012f019c013b0001200d2d0000210320102903002108201a290300211520012903800121182002201e3a002120022018370008200241106a2015370000200241186a2008370000200241206a20033a0000200220012903603700222002413a6a2012290300370000200241326a200c2903003700002002412a6a200e2903003700002001200a41016a220a360258200b2007470d000b0b200129025421082005450d050c060b20012802542202450d03200241c4006c0d020c030b1033000b1034000b200510260b0b41002105200141003602f803200142013703f0032001410e3602d4032001200141306a3602d0032001200141f0036a36028803200141bc036a4101360200200142013702ac032001418c8dc6003602a8032001200141d0036a3602b80320014188036a41c4e1c000200141a8036a10351a20012802f00320012802f80310840220012802f403450d0020012802f00310260b2006450d00200410260b0240024020050d0020004100360208200042043702000c010b20002008370204200020053602000b20014190046a24000bf80501047f230041106b2203240002400240200241c4006c41046a2204417f4c0d000240024020040d0041012105410021040c010b200410242205450d020b20002005360200200041086a2205410036020020002004360204024002400240200241c000490d0002400240200241808001490d002002418080808004490d01200041004101106d2000280200200041086a220528020022046a41033a00002005200441016a2204360200200020044104106d2000280200200528020022046a20023600002005200441046a22043602000c030b200041004102106d2000280200200041086a220528020022046a20024102744101723b00002005200441026a22043602000c020b200041004104106d2000280200200041086a220528020022046a20024102744102723600002005200441046a22043602000c010b200041004101106d2000280200200528020022046a20024102743a00002005200441016a22043602002002450d010b200241c4006c2105200041086a210203400240024020012d00004101460d00200020044101106d2000280200200228020022046a41003a00002002200441016a2204360200200141046a2802002106200020044104106d2000280200200228020022046a2006360000200441046a21040c010b200020044101106d2000280200200228020022046a41013a00002002200441016a3602002003200036020c200141016a2003410c6a109c010240200141216a2d00004101460d00200020022802004101106d2000280200200228020022046a41003a0000200441016a21040c010b200020022802004101106d2000280200200228020022046a41013a00002002200441016a2204360200200020044120106d2000280200200228020022066a2204200141226a290000370000200441186a2001413a6a290000370000200441106a200141326a290000370000200441086a2001412a6a290000370000200641206a21040b20022004360200200141c4006a2101200541bc7f6a22050d000b0b200341106a24000f0b1034000b1033000bfb0903057f017e057f230041d0016b22012400200141306a41186a22024200370300200141306a41106a22034200370300200141306a41086a2204420037030020014200370330200141206a41a28cc700410a10fb012004200141206a41086a220529000037030020012001290020370330200141206a41dab8c500410610fb012002200529000037030020032001290020370300200141d8006a200141306a412010b80320012d005821052002200141f1006a2900003703002003200141e9006a2900003703002004200141e1006a290000370300200120012900593703300240024020054101470d0020002001290330370000200041186a2002290300370000200041106a2003290300370000200041086a20042903003700000c010b200141d8006a41186a22024200370300200141d8006a41106a22034200370300200141d8006a41086a2205420037030020014200370358200141306a41808cc700410610fb012005200429000037030020012001290030370358200141306a41f093c400410610fb012002200429000037030020032001290030370300200141306a200141d8006a10c90420012802302204410420041b21030240024002402001290234420020041b2206422088a7220541246c2204450d00200320046a2202415c6a2107200321040340024020042d00004101460d002002200441246a2204470d010c020b200441016a2800002108200441086a28020021092001200441106a280200360234200120093602300240200841c28289aa04460d0020072004462108200441246a21042008450d010c020b0b200141d8006a200141306a109d0420012903584203510d00200141d8006a41106a2802002104200141d8006a10ad03410021020240200128026020044d0d00200141086a200128025820044105746a220441086a290000370300200141106a200441106a290000370300200141186a200441186a29000037030020012004290000370300410121020b0240200128025c41ffffff3f71450d00200128025810260b20020d010b20004200370000200041186a4200370000200041106a4200370000200041086a42003700000c010b200141d8006a41186a2204200141186a290300370300200141d8006a41106a2202200141106a290300370300200141d8006a41086a2208200141086a290300370300200120012903003703582001200141d8006a360254200141306a41186a22094200370300200141306a41106a22074200370300200141306a41086a220a420037030020014200370330200141206a41a28cc700410a10fb01200a200141206a41086a220b29000037030020012001290020370330200141206a41dab8c500410610fb012009200b29000037030020072001290020370300200141306a4120200141d4006a10ce03200041186a2004290300370000200041106a2002290300370000200041086a2008290300370000200020012903583700000b02402005450d00200541246c21022003210403400240024020042d0000220041044b0d0002400240024020000e050400010204040b2004410c6a280200450d03200441086a28020010260c030b2004410c6a280200450d02200441086a28020010260c020b2004410c6a280200450d01200441086a28020010260c010b200441086a280200450d00200441046a28020010260b200441246a21042002415c6a22020d000b0b2006a72204450d00200441246c450d00200310260b200141d0016a24000bdd0701087f230041a0016b22012400200141d8006a41186a22024200370300200141d8006a41106a22034200370300200141d8006a41086a2204420037030020014200370358200141d8006a41b48cc700410710fb0120014190016a4184c1c200410c10fb01200220014190016a41086a2900003703002003200129009001370300200141106a200141d8006a412010890220012802142105200128021021062002200041186a2900003703002003200041106a2900003703002004200041086a29000037030020012000290000370358200141186a41d18cc700410810fb01200141286a41c0d2c500410e10fb0120012005410020061b36028001200141f8006a20014180016a410410a20220014190016a410c6a220620014180016a41046a3602002001200141f8006a41086a220736029401200120014180016a360298012001200141f8006a36029001200141386a20014190016a107302400240412010242200450d002001422037028401200120003602800120014180016a41004120106d200128028001220020012802880122086a22052001290358370000200541086a2004290300370000200541106a2003290300370000200541186a20022903003700002001200841206a220236028801200141f8006a2000200210a2022006200020026a360200200120003602980120012007360294012001200141f8006a36029001200141c8006a20014190016a10730240200128028401450d00200010260b20012802402200200128025022026a41206a2203417f4c0d010240024020030d0041012105410021030c010b200310242205450d010b20014100360298012001200536029001200120033602940120014190016a4100411010c90120012802900120012802980122036a22052001290018370000200541086a200141186a41086a2900003700002001200341106a22033602980120014190016a2003411010c90120012802900120012802980122036a22052001290028370000200541086a200141286a41086a2900003700002001200341106a2205360298012001280238210320014190016a2005200010c90120012802900120012802980122056a2003200010cf061a2001200520006a2200360298012001280248210520014190016a2000200210c901200128029001220020012802980122046a2005200210cf061a2001200420026a2202360298010240200128024c450d00200510260b0240200128023c450d00200310260b200141086a200020021089022001200128020c41016a410120012802081b36025820002002200141d8006a410410b3010240200128029401450d00200010260b200141a0016a24000f0b1033000b1034000bae0402057f047e230041a0016b220324002003200236020420032001360200200341086a2001200210820202400240200328020822040d00200041003a00000c010b200341106a2802002105200328020c210641002101200341003a005820042102024002400240034020052001460d01200341386a20016a20022d00003a00002003200141016a22073a0058200241016a21022007210120074120470d000b20034180016a41186a2201200341386a41186a29030037030020034180016a41106a2202200341386a41106a29030037030020034180016a41086a2205200341386a41086a2903003703002003200329033837038001200741ff01714120490d01200341e0006a41186a20012903002208370300200341186a41086a20052903002209370300200341186a41106a2002290300220a370300200341186a41186a20083703002003200329038001220b370318200041196a2008370000200041116a200a370000200041096a20093700002000200b370001410121010c020b200141ff0171450d00200341003a00580b41002101200341003602880120034201370380012003410e36026420032003360260200320034180016a360218200341cc006a41013602002003420137023c2003418c8dc6003602382003200341e0006a360248200341186a41c4e1c000200341386a10351a200328028001200328028801108402200328028401450d0020032802800110260b200020013a00002006450d00200410260b200341a0016a24000b13002000410236020420004194b3c2003602000b3400200041b48cc70036020420004100360200200041146a4107360200200041106a41f0bbc200360200200041086a42073702000b2901017f230041106b2202240020024100360208200242043703002000200210bc01200241106a24000b4901017f02404104102422020d001033000b2000420437020420002002360200200041004104106d2000280200200041086a220028020022026a41003600002000200241046a3602000bbd0601057f230041e0006b22022400200241086a41b48cc700410710fb01200241186a41fcc2c200410810fb0102400240200141086a280200220341046a2204417f4c0d000240024020040d0041012105410021040c010b200410242205450d020b20024100360240200220053602382002200436023c200241386a41004104106d2002280238200228024022046a20012800003600002002200441046a2204360240200128020421050240024002400240200341c000490d00200341808001490d012003418080808004490d02200241386a20044101106d2002280238200228024022016a41033a00002002200141016a2201360240200241386a20014104106d2002280238200228024022016a2003360000200141046a21010c030b200241386a20044101106d2002280238200228024022016a20034102743a0000200141016a21010c020b200241386a20044102106d2002280238200228024022016a20034102744101723b0000200141026a21010c010b200241386a20044104106d2002280238200228024022016a2003410274410272360000200141046a21010b20022001360240200241386a20012003106d20022802382201200228024022046a2005200310cf061a2002200420036a2203360240200241c8006a2001200310a202200241dc006a200120036a360200200220013602582002200241d0006a3602542002200241c8006a360250200241286a200241d0006a10730240200228023c450d00200110260b2002280230220141206a2204417f4c0d000240024020040d0041012103410021040c010b200410242203450d020b20002003360200200041086a220341003602002000200436020420004100411010c9012000280200200328020022046a220520022900083700002003200441106a2204360200200541086a200241086a41086a29000037000020002004411010c9012000280200200328020022046a220520022900183700002003200441106a2206360200200541086a200241186a41086a2900003700002002280228210420002006200110c9012000280200200328020022006a2004200110cf061a2003200020016a3602000240200228022c450d00200410260b200241e0006a24000f0b1034000b1033000b130020004109360204200041f8c8c2003602000b3400200041998dc70036020420004100360200200041146a4103360200200041106a41d081c300360200200041086a42083702000b1300200041043602042000418c88c3003602000b5801027f02404110102422020d001033000b2000421037020420002002360200200041004110106d2000280200200041086a220028020022026a2203420037000820034280a0e5b9c291013700002000200241106a3602000b4901017f02404102102422020d001033000b2000420237020420002002360200200041004102106d2000280200200041086a220028020022026a41093b00002000200241026a3602000b5701027f02404110102422020d001033000b2000421037020420002002360200200041004110106d2000280200200041086a220028020022026a220342003700082003428090cad2c60e3700002000200241106a3602000ba92502087f047e230041b0086b22022400024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012802042203450d00200128020022042d0000210520012003417f6a3602042001200441016a360200200541084b0d0a20050e09010203040506070809010b2000410a3a00000c1d0b41002105200241003a00e0032003417f6a21062003417e6a21070240034020062005460d01200241c0036a20056a200420056a220841016a2d00003a0000200120073602042001200841026a3602002002200541016a22083a00e0032007417f6a21072008210520084120460d1b0c000b0b200541ff0171450d1a200241003a00e0030c1a0b41002105200241003a00e003410120036b21062003417e6a210702400340200620056a450d01200241c0036a20056a200420056a220841016a2d00003a0000200120073602042001200841026a3602002002200541016a22083a00e0032007417f6a21072008210520084120460d160c000b0b200541ff0171450d15200241003a00e0030c150b20024190016a20011092010240024002402002280290012204450d002002280294012105200128020422074102490d0120024198016a2802002106200128020022082f0000210920012007417e6a22033602042001200841026a36020020034104490d022008280002210320012007417a6a3602042001200841066a360200200041106a20033602002000410c6a2006360200200041086a2005360200200041046a2004360200200041026a20093b0100200041033a0000200041146a20022902c0033702002000411c6a200241c0036a41086a290200370200200041246a200241c0036a41106a2902003702002000412c6a200241d8036a290200370200200041346a200241e0036a2902003702002000413c6a200241e8036a2902003702000c1d0b2000410a3a00000c1c0b2000410a3a0000200541ffffff3f71450d1b200410260c1b0b2000410a3a0000200541ffffff3f71450d1a200410260c1a0b41002105200241003a00b0012003417f6a21062003417e6a21070240034020062005460d0120024190016a20056a200420056a220841016a2d00003a0000200120073602042001200841026a3602002002200541016a22083a00b0012007417f6a21072008210520084120460d120c000b0b200541ff0171450d11200241003a00b0010c110b41002105200241003a00e003410120036b21062003417e6a210702400340200620056a450d01200241c0036a20056a200420056a220841016a2d00003a0000200120073602042001200841026a3602002002200541016a22083a00e0032007417f6a21072008210520084120460d0d0c000b0b200541ff0171450d0c200241003a00e0030c0c0b41002105200241003a00b0012003417f6a21062003417e6a21070240034020062005460d0120024190016a20056a200420056a220841016a2d00003a0000200120073602042001200841026a3602002002200541016a22083a00b0012007417f6a21072008210520084120460d0a0c000b0b200541ff0171450d09200241003a00b0010c090b41002105200241003a00b0012003417f6a21062003417e6a21070240034020062005460d0120024190016a20056a200420056a220841016a2d00003a0000200120073602042001200841026a3602002002200541016a22083a00b0012007417f6a21072008210520084120460d070c000b0b200541ff0171450d06200241003a00b0010c060b200041083a00000c150b41002105200241003a00b0012003417f6a21062003417e6a21070240034020062005460d0120024190016a20056a200420056a220841016a2d00003a0000200120073602042001200841026a3602002002200541016a22083a00b0012007417f6a21072008210520084120460d030c000b0b200541ff0171450d02200241003a00b0010c020b2000410a3a00000c130b200241f0076a41086a220120024190016a41086a290300370300200241f0076a41106a220420024190016a41106a290300370300200241f0076a41186a220520024190016a41186a29030037030020022002290390013703f007200841ff0171411f4d0d00200241306a41086a2001290300220a370300200241306a41106a2004290300220b370300200241306a41186a2005290300220c370300200220022903f007220d3703502002200d370330200041093a00002000200d370001200041096a200a370000200041116a200b370000200041196a200c370000200041216a20022900c003370000200041296a200241c0036a41086a290000370000200041316a200241c0036a41106a290000370000200041396a200241c0036a41186a290000370000200041c0006a200241c0036a411f6a2800003600000c120b2000410a3a00000c110b200241f0076a41086a220120024190016a41086a290300370300200241f0076a41106a220420024190016a41106a290300370300200241f0076a41186a220520024190016a41186a29030037030020022002290390013703f007200841ff0171411f4d0d00200241306a41086a2001290300220a370300200241306a41106a2004290300220b370300200241306a41186a2005290300220c370300200220022903f007220d3703502002200d370330200041073a00002000200d370001200041096a200a370000200041116a200b370000200041196a200c370000200041216a20022900c003370000200041296a200241c0036a41086a290000370000200041316a200241c0036a41106a290000370000200041396a200241c0036a41186a290000370000200041c0006a200241c0036a411f6a2800003600000c100b2000410a3a00000c0f0b200241f0076a41086a220120024190016a41086a290300370300200241f0076a41106a220420024190016a41106a290300370300200241f0076a41186a220520024190016a41186a29030037030020022002290390013703f007200841ff0171411f4d0d00200241306a41086a2001290300220a370300200241306a41106a2004290300220b370300200241306a41186a2005290300220c370300200220022903f007220d3703502002200d370330200041063a00002000200d370001200041096a200a370000200041116a200b370000200041196a200c370000200041216a20022900c003370000200041296a200241c0036a41086a290000370000200041316a200241c0036a41106a290000370000200041396a200241c0036a41186a290000370000200041c0006a200241c0036a411f6a2800003600000c0e0b2000410a3a00000c0d0b20024190016a41086a2205200241c0036a41086a29030037030020024190016a41106a2206200241c0036a41106a29030037030020024190016a41186a2209200241c0036a41186a290300370300200220022903c00337039001200841ff0171411f4d0d00200241f0006a41086a2005290300370300200241f0006a41106a2006290300370300200241f0006a41186a20092903003703002002200229039001220d3703502002200d37037041002105200241003a00e003200420086a2106200820036b41016a21080340200820056a450d02200241c0036a20056a200620056a220441016a2d00003a0000200120073602042001200441026a3602002002200541016a22043a00e0032007417f6a21072004210520044120470d000b20024190016a41086a2201200241c0036a41086a29030037030020024190016a41106a2205200241c0036a41106a29030037030020024190016a41186a2207200241c0036a41186a290300370300200220022903c00337039001200441ff0171411f4d0d02200241106a41086a22042001290300370300200241106a41106a22012005290300370300200241106a41186a22052007290300370300200241306a41186a2207200241f0006a41186a290300370300200241306a41106a2208200241f0006a41106a290300370300200241306a41086a2203200241f0006a41086a2903003703002002200229039001220d3703502002200d37031020022002290370370330200041053a000020002002290330370001200041096a2003290300370000200041116a2008290300370000200041196a2007290300370000200041216a2002290310370000200041296a2004290300370000200041316a2001290300370000200041396a2005290300370000200041c1006a20022f000d3b0000200041c3006a2002410f6a2d00003a00000c0c0b2000410a3a00000c0b0b200541ff0171450d00200241003a00e0030b2000410a3a00000c090b200241f0076a41086a220120024190016a41086a290300370300200241f0076a41106a220420024190016a41106a290300370300200241f0076a41186a220520024190016a41186a29030037030020022002290390013703f007200841ff0171411f4d0d00200241306a41086a2001290300220a370300200241306a41106a2004290300220b370300200241306a41186a2005290300220c370300200220022903f007220d3703502002200d370330200041043a00002000200d370001200041096a200a370000200041116a200b370000200041196a200c370000200041216a20022900c003370000200041296a200241c0036a41086a290000370000200041316a200241c0036a41106a290000370000200041396a200241c0036a41186a290000370000200041c0006a200241c0036a411f6a2800003600000c080b2000410a3a00000c070b20024190016a41086a2205200241c0036a41086a29030037030020024190016a41106a2206200241c0036a41106a29030037030020024190016a41186a2209200241c0036a41186a290300370300200220022903c00337039001200841ff0171411f4d0d00200241f0006a41086a2005290300370300200241f0006a41106a2006290300370300200241f0006a41186a20092903003703002002200229039001220d3703502002200d37037041002105200241003a00e003200420086a2106200820036b41016a21080340200820056a450d02200241c0036a20056a200620056a220441016a2d00003a0000200120073602042001200441026a3602002002200541016a22043a00e0032007417f6a21072004210520044120470d000b20024190016a41086a2201200241c0036a41086a29030037030020024190016a41106a2205200241c0036a41106a29030037030020024190016a41186a2207200241c0036a41186a290300370300200220022903c00337039001200441ff0171411f4d0d02200241106a41086a22042001290300370300200241106a41106a22012005290300370300200241106a41186a22052007290300370300200241306a41186a2207200241f0006a41186a290300370300200241306a41106a2208200241f0006a41106a290300370300200241306a41086a2203200241f0006a41086a2903003703002002200229039001220d3703502002200d37031020022002290370370330200041023a000020002002290330370001200041096a2003290300370000200041116a2008290300370000200041196a2007290300370000200041216a2002290310370000200041296a2004290300370000200041316a2001290300370000200041396a2005290300370000200041c1006a20022f000d3b0000200041c3006a2002410d6a41026a2d00003a00000c060b2000410a3a00000c050b200541ff0171450d00200241003a00e0030b2000410a3a00000c030b20024190016a41086a2204200241c0036a41086a29030037030020024190016a41106a2205200241c0036a41106a29030037030020024190016a41186a2207200241c0036a41186a290300370300200220022903c00337039001200841ff0171411f4b0d010b2000410a3a00000c010b200241f0006a41086a2004290300370300200241f0006a41106a2005290300370300200241f0006a41186a20072903003703002002200229039001220d3703502002200d370370200241c0036a200110b60220022802c003210120024190016a200241c0036a41047241ac0210cf061a0240024020014117460d00200241c0036a20024190016a41ac0210cf061a41b002102422040d01102c000b2000410a3a00000c010b20042001360200200441046a200241c0036a41ac0210cf061a200241306a41186a200241f0006a41186a290300220d370300200241306a41106a200241f0006a41106a290300220a370300200241306a41086a200241f0006a41086a290300220b37030020022002290370220c370330200041013a00002000200c370001200041096a200b370000200041116a200a370000200041196a200d370000200041216a20022f000d3b0000200041236a2002410f6a2d00003a0000200041246a2004360200200041286a2002290210370200200041306a200241106a41086a290200370200200041386a200241106a41106a290200370200200041c0006a200241106a41186a2802003602000b200241b0086a24000b852403057f047e037f230041b00a6b2202240002400240024002400240024002400240024002400240024002400240200128020022032802042204450d00200328020022052d0000210620032004417f6a3602042003200541016a360200200641084b0d0a20060e09010203040506070809010b2000410a3a00000c0c0b41002103200241003a00e003024002400340200128020022062802042204450d01200241c0036a20036a200628020022052d00003a000020062004417f6a3602042006200541016a3602002002200341016a22033a00e00320034120470d000b20024190016a41186a200241c0036a41186a2903002207370300200241d0006a41086a2203200241c0036a41086a290300370300200241d0006a41106a2206200241c0036a41106a290300370300200241d0006a41186a22042007370300200220022903c003370350200241f0006a41186a2004290300370300200241f0006a41106a2006290300370300200241f0006a41086a2003290300370300200220022903503703702001200128020441016a2203360204200320012802084d0d010c0c0b0240200341ff0171450d00200241003a00e0030b2000410a3a00000c0c0b200241c0036a200110b40220022802c003210320024190016a200241c0036a41047241ac0210cf061a20034117460d0a200241c0036a20024190016a41ac0210cf061a41b00210242206450d0920062003360200200641046a200241c0036a41ac0210cf061a200241306a41186a200241f0006a41186a2903002207370300200241306a41106a200241f0006a41106a2903002208370300200241306a41086a200241f0006a41086a290300220937030020012001280204417f6a36020420022002290370220a370330200041013a00002000200a370001200041096a2009370000200041116a2008370000200041196a2007370000200041246a2006360200200041216a20022f000d3b0000200041236a2002410f6a2d00003a0000200041286a2002290210370200200041306a200241106a41086a290200370200200041386a200241106a41106a290200370200200041c0006a200241106a41186a2802003602000c0b0b41002103200241003a00e003024002400340200128020022062802042204450d01200241c0036a20036a200628020022052d00003a000020062004417f6a3602042006200541016a3602002002200341016a22033a00e00320034120470d000b20024190016a41186a200241c0036a41186a2903002207370300200241d0006a41086a2203200241c0036a41086a290300370300200241d0006a41106a2206200241c0036a41106a290300370300200241d0006a41186a22042007370300200220022903c003370350200241f0006a41186a2004290300370300200241f0006a41106a2006290300370300200241f0006a41086a20032903003703002002200229035037037041002103200241003a00e0030340200128020022062802042204450d02200241c0036a20036a200628020022052d00003a000020062004417f6a3602042006200541016a3602002002200341016a22033a00e00320034120470d000b20024190016a41186a200241c0036a41186a2903002207370300200241d0006a41086a2201200241c0036a41086a290300370300200241d0006a41106a2203200241c0036a41106a290300370300200241d0006a41186a22062007370300200220022903c003370350200241106a41186a22042006290300370300200241106a41106a22062003290300370300200241106a41086a2203200129030037030020022002290350370310200241306a41186a2201200241f0006a41186a290300370300200241306a41106a2205200241f0006a41106a290300370300200241306a41086a220b200241f0006a41086a29030037030020022002290370370330200041023a000020002002290330370001200041096a200b290300370000200041116a2005290300370000200041196a2001290300370000200041216a2002290310370000200041296a2003290300370000200041316a2006290300370000200041396a2004290300370000200041c1006a20022f000d3b0000200041c3006a2002410d6a41026a2d00003a00000c0c0b0240200341ff0171450d00200241003a00e0030b2000410a3a00000c0b0b0240200341ff0171450d00200241003a00e0030b2000410a3a00000c0a0b20024190016a200110da010240024002402002280290012206450d0020022802940121042001280200220328020422054102490d0120024198016a280200210c2003280200220b2f0000210d20032005417e6a3602042003200b41026a3602002001280200220128020422034104490d0220012802002205280000210b20012003417c6a3602042001200541046a360200200041106a200b3602002000410c6a200c360200200041086a2004360200200041046a2006360200200041026a200d3b0100200041033a0000200041146a20022902c0033702002000411c6a200241c0036a41086a290200370200200041246a200241c0036a41106a2902003702002000412c6a200241d8036a290200370200200041346a200241e0036a2902003702002000413c6a200241e8036a2902003702000c0c0b2000410a3a00000c0b0b2000410a3a0000200441ffffff3f71450d0a200610260c0a0b2000410a3a0000200441ffffff3f71450d09200610260c090b41002103200241003a00b00102400340200128020022062802042204450d0120024190016a20036a200628020022052d00003a000020062004417f6a3602042006200541016a3602002002200341016a22033a00b00120034120470d000b200241f0006a41186a20024190016a41186a2903002207370300200241d0006a41086a220120024190016a41086a290300370300200241d0006a41106a220320024190016a41106a290300370300200241d0006a41186a220620073703002002200229039001370350200241306a41186a22042006290300370300200241306a41106a22062003290300370300200241306a41086a2203200129030037030020022002290350370330200041043a000020002002290330370001200041096a2003290300370000200041116a2006290300370000200041196a2004290300370000200041216a20022900c003370000200041296a200241c0036a41086a290000370000200041316a200241c0036a41106a290000370000200041396a200241c0036a41186a290000370000200041c0006a200241df036a2800003600000c090b0240200341ff0171450d00200241003a00b0010b2000410a3a00000c080b41002103200241003a00e003024002400340200128020022062802042204450d01200241c0036a20036a200628020022052d00003a000020062004417f6a3602042006200541016a3602002002200341016a22033a00e00320034120470d000b20024190016a41186a200241c0036a41186a2903002207370300200241d0006a41086a2203200241c0036a41086a290300370300200241d0006a41106a2206200241c0036a41106a290300370300200241d0006a41186a22042007370300200220022903c003370350200241f0006a41186a2004290300370300200241f0006a41106a2006290300370300200241f0006a41086a20032903003703002002200229035037037041002103200241003a00e0030340200128020022062802042204450d02200241c0036a20036a200628020022052d00003a000020062004417f6a3602042006200541016a3602002002200341016a22033a00e00320034120470d000b20024190016a41186a200241c0036a41186a2903002207370300200241d0006a41086a2201200241c0036a41086a290300370300200241d0006a41106a2203200241c0036a41106a290300370300200241d0006a41186a22062007370300200220022903c003370350200241106a41186a22042006290300370300200241106a41106a22062003290300370300200241106a41086a2203200129030037030020022002290350370310200241306a41186a2201200241f0006a41186a290300370300200241306a41106a2205200241f0006a41106a290300370300200241306a41086a220b200241f0006a41086a29030037030020022002290370370330200041053a000020002002290330370001200041096a200b290300370000200041116a2005290300370000200041196a2001290300370000200041216a2002290310370000200041296a2003290300370000200041316a2006290300370000200041396a2004290300370000200041c1006a20022f000d3b0000200041c3006a2002410f6a2d00003a00000c090b0240200341ff0171450d00200241003a00e0030b2000410a3a00000c080b0240200341ff0171450d00200241003a00e0030b2000410a3a00000c070b41002103200241003a00b00102400340200128020022062802042204450d0120024190016a20036a200628020022052d00003a000020062004417f6a3602042006200541016a3602002002200341016a22033a00b00120034120470d000b200241f0006a41186a20024190016a41186a2903002207370300200241d0006a41086a220120024190016a41086a290300370300200241d0006a41106a220320024190016a41106a290300370300200241d0006a41186a220620073703002002200229039001370350200241306a41186a22042006290300370300200241306a41106a22062003290300370300200241306a41086a2203200129030037030020022002290350370330200041063a000020002002290330370001200041096a2003290300370000200041116a2006290300370000200041196a2004290300370000200041216a20022900c003370000200041296a200241c0036a41086a290000370000200041316a200241c0036a41106a290000370000200041396a200241c0036a41186a290000370000200041c0006a200241df036a2800003600000c070b0240200341ff0171450d00200241003a00b0010b2000410a3a00000c060b41002103200241003a00b00102400340200128020022062802042204450d0120024190016a20036a200628020022052d00003a000020062004417f6a3602042006200541016a3602002002200341016a22033a00b00120034120470d000b200241f0006a41186a20024190016a41186a2903002207370300200241d0006a41086a220120024190016a41086a290300370300200241d0006a41106a220320024190016a41106a290300370300200241d0006a41186a220620073703002002200229039001370350200241306a41186a22042006290300370300200241306a41106a22062003290300370300200241306a41086a2203200129030037030020022002290350370330200041073a000020002002290330370001200041096a2003290300370000200041116a2006290300370000200041196a2004290300370000200041216a20022900c003370000200041296a200241c0036a41086a290000370000200041316a200241c0036a41106a290000370000200041396a200241c0036a41186a290000370000200041c0006a200241df036a2800003600000c060b0240200341ff0171450d00200241003a00b0010b2000410a3a00000c050b200041083a00000c040b41002103200241003a00b00102400340200128020022062802042204450d0120024190016a20036a200628020022052d00003a000020062004417f6a3602042006200541016a3602002002200341016a22033a00b00120034120470d000b200241f0006a41186a20024190016a41186a2903002207370300200241d0006a41086a220120024190016a41086a290300370300200241d0006a41106a220320024190016a41106a290300370300200241d0006a41186a220620073703002002200229039001370350200241306a41186a22042006290300370300200241306a41106a22062003290300370300200241306a41086a2203200129030037030020022002290350370330200041093a000020002002290330370001200041096a2003290300370000200041116a2006290300370000200041196a2004290300370000200041216a20022900c003370000200041296a200241c0036a41086a290000370000200041316a200241c0036a41106a290000370000200041396a200241c0036a41186a290000370000200041c0006a200241df036a2800003600000c040b0240200341ff0171450d00200241003a00b0010b2000410a3a00000c030b2000410a3a00000c020b102c000b2000410a3a00000b200241b00a6a24000bdd0302057f037e230041d0016b220224002002200141206a41e9dabdf30610c703200228020421032002280200210441002105200241003a008801024002400240034020032005460d01200241e8006a20056a200420056a2d00003a00002002200541016a22063a0088012006210520064120470d000b20024190016a41086a2205200241e8006a41086a29030037030020024190016a41106a2203200241e8006a41106a29030037030020024190016a41186a2204200241e8006a41186a2903003703002002200229036837039001200641ff0171411f4d0d01200241c8006a41186a20042903002207370300200241286a41086a20052903002208370300200241286a41106a20032903002209370300200241286a41186a2007370300200241086a41186a2007370300200241086a41106a2009370300200241086a41086a200837030020022002290390012207370328200220073703080c020b200541ff0171450d00200241003a0088010b200241106a4200370300200241186a4200370300200241206a4200370300200242003703080b20002001360200200020022903083700042000410c6a200241106a290300370000200041146a200241186a2903003700002000411c6a200241206a290300370000200241d0016a24000ba80101027f4100210341d4c0c700210402400240024002400240200241e0ea91cb064a0d00200241f0c2c98b06460d01200241e2c289ab06470d0441202103200141206a21040c040b200241e1ea91cb06460d010240200241e9dabdf306460d00200241e7e485f306470d0441202103200121040c040b200141c0006a21040c020b200141e0006a21040c010b20014180016a21040b412021030b20002003360204200020043602000bdd0302057f037e230041d0016b220224002002200141206a41e7e485f30610c703200228020421032002280200210441002105200241003a008801024002400240034020032005460d01200241e8006a20056a200420056a2d00003a00002002200541016a22063a0088012006210520064120470d000b20024190016a41086a2205200241e8006a41086a29030037030020024190016a41106a2203200241e8006a41106a29030037030020024190016a41186a2204200241e8006a41186a2903003703002002200229036837039001200641ff0171411f4d0d01200241c8006a41186a20042903002207370300200241286a41086a20052903002208370300200241286a41106a20032903002209370300200241286a41186a2007370300200241086a41186a2007370300200241086a41106a2009370300200241086a41086a200837030020022002290390012207370328200220073703080c020b200541ff0171450d00200241003a0088010b200241106a4200370300200241186a4200370300200241206a4200370300200242003703080b20002001360200200020022903083700042000410c6a200241106a290300370000200041146a200241186a2903003700002000411c6a200241206a290300370000200241d0016a24000b130020004104360204200041e494c3003602000b130020004110360204200041fc96c3003602000bc15f04087f027e017f017e230041c0076b220324000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012d00000e0a00010203040506070809000b200341fc046a4101360200200342013702ec04200341dcedc6003602e8042003410436028402200341d4edc60036028002200320034180026a3602f804200341e8046a41ecc0c700103d000b200141246a2802002104200341d8006a41186a200141196a290000370300200341d8006a41106a200141116a290000370300200341d8006a41086a200141096a29000037030020032001290001370358200341e8046a41206a200241206a290200370300200341e8046a41186a200241186a290200370300200341e8046a41106a200241106a290200370300200341e8046a41086a200241086a290200370300200320022902003703e80420034180026a200341e8046a10d60220034198076a41086a220120034180026a41096a29000037030020034198076a41106a220220034180026a41116a29000037030020034198076a41186a220520034180026a41196a29000037030020032003290081023703980702400240024020032d0080024101460d0020034190016a41186a200529030037030020034190016a41106a200229030037030020034190016a41086a200129030037030020032003290398073703900120034198076a20034190016a10cc03200341e8046a200328029807220120032802a00710b80320034180026a41086a200341f2046a29010037030020034180026a41106a200341fa046a29010037030020034180026a41176a2202200341e8046a41196a290000370000200320032901ea043703800220032d00e8044101470d0120032d00e9042105200341d0016a41176a2002290000370000200341d0016a41106a220220034180026a41106a290300370300200341d0016a41086a220620034180026a41086a29030037030020032003290380023703d0010240200328029c07450d00200110260b200341b9016a2006290300370000200341c1016a2002290300370000200341b0016a41186a200341e7016a290000370000200320053a00b001200320032903d0013700b101200341b0016a200341d8006a412010d2060d0b20034180026a200441b00210cf061a200341b0046a41186a200341d8006a41186a290300370300200341b0046a41106a200341d8006a41106a290300370300200341b0046a41086a200341d8006a41086a290300370300200320032903583703b0044110102422020d020c350b200341023a00d80420041098030c320b0240200328029c07450d00200110260b200341d8046a410110f10220041098030c310b200241b889c70036020c200241013602082002428180808010370200411010242201450d32200141d089c70036020c20014101360208200142818080801037020020022002280200417f6a2205360200024020050d002002280208200228020c2802001103000240200228020c280204450d00200228020810260b20022002280204417f6a220536020420050d00200210260b02400240200128020820034180026a200128020c28020c110100450d00200341e8046a20034180026a41b00210cf061a200341a2076a200341b8046a290300370100200341aa076a200341c0046a290300370100200341b2076a200341c8046a290300370100200341ba076a200341d0046a2f01003b010020034180023b019807200320032903b00437019a07200320013602bc07200341d0016a200341e8046a20034198076a10a30320032903d0014201510d010c310b200341f0016a41023a0000200341e8016a41003a000020012001280200417f6a2202360200200342003703d801200342013703d001024020020d002001280208200128020c2802001103000240200128020c280204450d00200128020810260b20012001280204417f6a220236020420020d00200110260b20034180026a1098030b200341e8046a41086a200341d0016a41186a290300370300200341e8046a41106a2201200341f0016a290300370300200341e8046a41186a2202200341f8016a2903003703002003200341d0016a41106a2903003703e80420032903d8014202510d2f200341d8046a41086a20022903003e0200200320012903003703d8040c300b200341d0016a41186a200141196a290000370300200341d0016a41106a200141116a290000370300200341d0016a41086a200141096a290000370300200320012900013703d00120034180026a41186a200141396a29000037030020034180026a41106a200141316a29000037030020034180026a41086a200141296a2900003703002003200141216a29000037038002200341e8046a41206a200241206a290200370300200341e8046a41186a200241186a290200370300200341e8046a41106a200241106a290200370300200341e8046a41086a200241086a290200370300200320022902003703e804200341e8046a10cd030d082003200341d0016a3602b004200341e8046a20034180026a10cc0320032802e804220120032802f004200341b0046a10ce03024020032802ec04450d00200110260b200341f2046a200341d0016a41086a290300370100200341fa046a200341d0016a41106a29030037010020034182056a200341d0016a41186a2903003701002003418a056a20032903800237010020034192056a20034180026a41086a2903003701002003419a056a20034180026a41106a290300370100200341a2056a20034180026a41186a2903003701002003418a083b01e804200320032903d0013701ea04200341e8046a108702200041186a41003a00002000420037030820002003280098073600192000411c6a2003419b076a280000360000200042003703000c300b200141106a2802002107200141026a2f010021082001410c6a2802002109200141086a2802002104200141046a2802002101200341e8046a41206a200241206a290200370300200341e8046a41186a200241186a290200370300200341e8046a41106a200241106a290200370300200341e8046a41086a200241086a290200370300200320022902003703e80420034180026a200341e8046a10d60220034198076a41086a220220034189026a29000037030020034198076a41106a220520034191026a29000037030020034198076a41186a220620034199026a29000037030020032003290081023703980720032d0080024101460d08200341d0016a41186a2006290300370300200341d0016a41106a2005290300370300200341d0016a41086a200229030037030020032003290398073703d001200341e8046a200341d0016a10cf03200341186a20032802e804220520032802f00441d4c0c7004100410010810220032802182102024020032802ec04450d00200510260b20024101460d092008450d0a2009450d0b20092008490d0c200941094b0d0d200941016a210520012102024003402005417f6a22054102490d012002200241206a2206412010d206210a20062102200a4100480d000b200341b0046a410510f1020c2c0b200341086a2009ad4200428090cad2c60e420010cc06200341e8046a200341d0016a2003290308220b4280a0e5b9c291017c220c200341086a41086a290300200c200b54ad7c220b10d902200320032900e904370380022003200341e8046a41086a28000036008702024020032d00e80422024104470d0020034180026a200341d0016a10cf03200328028802210d200328028002210a41002106200341003602f004200342013703e804200341e8046a41004104106d20032802e80420032802f00422026a20073600002003200241046a22023602f004200341e8046a20024110106d20032802e80420032802f00422026a2205200b3700082005200c3700002003200241106a3602f004200341e8046a200910a1012009410574210720032802f00421020340200341e8046a20024120106d20032802e80420032802f00422096a2202200120066a2205290000370000200241086a200541086a290000370000200241106a200541106a290000370000200241186a200541186a2900003700002003200941206a22023602f0042007200641206a2206470d000b200341e8046a20024102106d20032802e804220220032802f00422056a20083b00002003200541026a22053602f004200a200d2002200510b301024020032802ec04450d00200210260b0240200328028402450d00200a10260b0240200441ffffff3f71450d00200110260b200341d8016a290300210c2003410a3b01e804200341e8046a410a6a200c370100200341fa046a200341e0016a29030037010020034182056a200341e8016a290300370100200320032903d0013701ea04200341e8046a108702200341043a00b0040c2d0b200341b0046a41086a200328008702360000200320023a00b00420032003290380023700b1040c2b0b200341b0046a41186a200141196a290000370300200341b0046a41106a200141116a290000370300200341b0046a41086a200141096a290000370300200320012900013703b004200341e8046a41206a200241206a290200370300200341e8046a41186a200241186a290200370300200341e8046a41106a200241106a290200370300200341e8046a41086a200241086a290200370300200320022902003703e80420034180026a200341e8046a10d60220034198076a41086a220120034180026a41096a29000037030020034198076a41106a220220034180026a41116a29000037030020034198076a41186a220420034180026a41196a29000037030020032003290081023703980720032d0080024101460d0d200341d0016a41186a2004290300370300200341d0016a41106a2002290300370300200341d0016a41086a200129030037030020032003290398073703d001200341e8046a200341b0046a10cf03200341306a20032802e804220220032802f00441d4c0c7004100410010810220032802302101024020032802ec04450d00200210260b024020014101470d00200341e8046a200341b0046a200341d0016a10d003200341286a20032802e804220220032802f00441d4c0c7004100410010810220032802282101024020032802ec04450d00200210260b20014101460d0f200341e8046a200341d0016a4280a0e5b9c29101420010d902200320032900e904370380022003200341e8046a41086a220128000036008702024020032d00e80422024104470d00200341e8046a41186a22024200370300200341e8046a41106a2204420037030020014200370300200342003703e80420034180026a41808cc700410610fb01200120034180026a41086a220529000037030020032003290080023703e80420034180026a41ea93c400410610fb01200220052900003703002004200329008002370300200341206a200341e8046a4120108902200328022421012003280220210220034184056a4100360200200342003703f00420034280a0e5b9c291013703e804200342013702fc0420032001410020021b3602f80420034180026a200341b0046a200341d0016a10d0032003280280022201200328028802200341e8046a10d1030240200328028402450d00200110260b200341f2046a200341b0046a41086a290300370100200341fa046a200341b0046a41106a29030037010020034182056a200341b0046a41186a2903003701002003418a056a20032903d00137010020034192056a200341d0016a41086a2903003701002003419a056a200341d0016a41106a290300370100200341a2056a200341d0016a41186a2903003701002003418a023b01e804200320032903b0043701ea04200341e8046a108702200341043a00b0010c2b0b200341b0016a41086a200328008702360000200320023a00b00120032003290380023700b1010c280b200341b0016a410610f1020c260b200341b0016a41186a200141196a290000370300200341b0016a41106a200141116a290000370300200341b0016a41086a200141096a290000370300200320012900013703b001200341b0046a41186a200141396a290000370300200341b0046a41106a200141316a290000370300200341b0046a41086a200141296a2900003703002003200141216a2900003703b004200341e8046a41206a200241206a290200370300200341e8046a41186a200241186a290200370300200341e8046a41106a200241106a290200370300200341e8046a41086a200241086a290200370300200320022902003703e80420034180026a200341e8046a10d60220034198076a41086a220120034180026a41096a29000037030020034198076a41106a220220034180026a41116a29000037030020034198076a41186a220420034180026a41196a29000037030020032003290081023703980702400240024002400240024002400240024020032d0080024101460d00200341d0016a41186a2004290300370300200341d0016a41106a2002290300370300200341d0016a41086a200129030037030020032003290398073703d00120034180026a200341b0016a10cf03200341e8046a200328028002220120032802880210d203200341d8006a41086a2003418c056a280200360200200320034184056a290200370358024020032802fc042206450d002003280280052109200341d8046a41086a200341d8006a41086a280200360200200320032903583703d8040240200328028402450d00200110260b20032802d804210120034198076a200341b0016a200341b0046a10d003200341e8046a200328029807220220032802a00710d303200341e8046a41086a290300210b20032903e804210e200329038005210c20032802fc04210820032802f80421040240200328029c07450d00200210260b2008450d0420034198026a200c3703002003200e37038002200320083602940220032004360290022003200b37038802200ca7210741002102200141014b0d0220010e020803080b0240200328028402450d00200110260b20034180016a410610f1020c2b0b200341023a0080010c2b0b03402001410176220420026a22052002200620054105746a200341d0016a412010d2064101481b2102200120046b220141014b0d000b0b200620024105746a200341d0016a412010d2060d04200c422088a7220a41014b0d0241002101200a0e020103010b20034180016a410910f1020c260b200341e8046a41186a200341d0016a41186a290300370300200341e8046a41106a200341d0016a41106a290300370300200341e8046a41086a200341d0016a41086a290300370300200320032903d0013703e80441002104200341e8046a21020c240b41002101200a210203402002410176220420016a22052001200820054105746a200341d0016a412010d2064101481b2101200220046b220241014b0d000b0b200820014105746a200341d0016a412010d2062204450d01200341e8046a41186a200341d0016a41186a290300370300200341e8046a41106a200341d0016a41106a290300370300200341e8046a41086a200341d0016a41086a290300370300200320032903d0013703e804200341e8046a210220012004411f766a2204200a4d0d222004200a103b000b20034180016a410a10f1020c200b20034180016a410c10f1020c1f0b200341b0046a41186a200141196a290000370300200341b0046a41106a200141116a290000370300200341b0046a41086a200141096a290000370300200320012900013703b004200341e8046a41206a200241206a290200370300200341e8046a41186a200241186a290200370300200341e8046a41106a200241106a290200370300200341e8046a41086a200241086a290200370300200320022902003703e80420034180026a200341e8046a10d60220034198076a41086a220120034180026a41096a29000037030020034198076a41106a220220034180026a41116a29000037030020034198076a41186a220420034180026a41196a29000037030020032003290081023703980702400240024002400240024020032d0080024101460d00200341d0016a41186a2004290300370300200341d0016a41106a2002290300370300200341d0016a41086a200129030037030020032003290398073703d00120034180026a200341b0046a10cf03200341e8046a200328028002220120032802880210d203200341d8006a41086a2003418c056a280200360200200320034184056a290200370358024020032802fc042202450d00200328028005210420032802f8042108200341d8046a41086a200341d8006a41086a280200360200200320032903583703d8040240200328028402450d00200110260b200320032903d8043702940120032f019801210920034180026a200341b0046a200341d0016a10d003200341e8046a200328028002220520032802880210d303200329038005210c20032802fc04210120032802f80421060240200328028402450d00200510260b2001450d02200341e8046a200341d0016a10cc03200341c0006a20032802e804220720032802f00441d4c0c7004100410010810220032802402105024020032802ec04450d00200710260b20054101460d0320034180056a22054200370300200341f8046a22074200370300200341e8046a41086a220a4200370300200342003703e80420034180026a41808cc700410610fb01200a20034180026a41086a220d29000037030020032003290080023703e80420034180026a41ea93c400410610fb012005200d2900003703002007200329008002370300200341386a200341e8046a4120108902200620086a22052006490d042005200328023c410020032802381b4b0d05200c422088a72009490d062003200341b0046a36028002200341e8046a200341d0016a10cc0320032802e804220520032802f00420034180026a10ce03024020032802ec04450d00200510260b200341d0016a10d403200341f2046a200341b0046a41086a290300370100200341fa046a200341b0046a41106a29030037010020034182056a200341b0046a41186a2903003701002003418a056a20032903d00137010020034192056a200341d0016a41086a2903003701002003419a056a200341d0016a41106a290300370100200341a2056a200341d0016a41186a2903003701002003418a083b01e804200320032903b0043701ea04200341e8046a1087020240200c42ffffff3f83500d00200110260b0240200441ffffff3f71450d00200210260b200341043a00b0010c240b0240200328028402450d00200110260b200341b0016a410610f1020c210b200341023a00b0010c210b200341b0016a410910f1020c1e0b200341b0016a411010f1020c1c0b200341b0016a410f10f1020c1b0b200341b0016a410b10f1020c1a0b200341b0016a410d10f1020c190b200341b0046a41186a200141196a290000370300200341b0046a41106a200141116a290000370300200341b0046a41086a200141096a290000370300200320012900013703b004200341e8046a41206a200241206a290200370300200341e8046a41186a200241186a290200370300200341e8046a41106a200241106a290200370300200341e8046a41086a200241086a290200370300200320022902003703e80420034180026a200341e8046a10d60220034198076a41086a220120034180026a41096a29000037030020034198076a41106a220220034180026a41116a29000037030020034198076a41186a220420034180026a41196a29000037030020032003290081023703980720032d0080024101460d0c200341d0016a41186a2004290300370300200341d0016a41106a2002290300370300200341d0016a41086a200129030037030020032003290398073703d00120034180026a200341d0016a200341b0046a10d003200341e8046a2003280280022202200328028802220410d303024020032802fc042201450d002002200410ff010b200328028402210402402001450d00200341f0046a290300210c20032903e804210b200329038005210e02402004450d00200210260b200341e8046a200341b0046a200341d0016a200b200c410010e002200341f2046a200341d0016a41086a290300370100200341fa046a200341d0016a41106a29030037010020034182056a200341d0016a41186a2903003701002003418a056a20032903b00437010020034192056a200341b0046a41086a2903003701002003419a056a200341b0046a41106a290300370100200341a2056a200341b0046a41186a2903003701002003418a063b01e804200320032903d0013701ea04200341e8046a1087020240200e42ffffff3f83500d00200110260b200341043a00b0010c180b02402004450d00200210260b200341b0016a410910f10220032d00b0014104460d1720032902b401210c0c160b200341e8046a41206a200241206a290200370300200341e8046a41186a200241186a290200370300200341e8046a41106a200241106a290200370300200341e8046a41086a200241086a290200370300200320022902003703e80420034180026a200341e8046a10d60220034198076a41086a220120034189026a29000037030020034198076a41106a220220034191026a29000037030020034198076a41186a220420034199026a29000037030020032003290081023703980720032d0080024101460d0e200341d0016a41186a2004290300370300200341d0016a41106a2002290300370300200341d0016a41086a200129030037030020032003290398073703d00120034180026a41998dc700410810fb0120034190016a41b884c300411010fb01412010242201450d0c200342203702b404200320013602b004200341b0046a41004120106d20032802b004220120032802b80422046a220220032903d001370000200241086a200341d0016a41086a290300370000200241106a200341d0016a41106a290300370000200241186a200341d0016a41186a2903003700002003200441206a22023602b804200341d8006a2001200210a202200341f4046a200120026a360200200320013602f0042003200341d8006a41086a3602ec042003200341d8006a3602e804200341b0016a200341e8046a1073024020032802b404450d00200110260b20032802b801220141206a2202417f4c0d0d0240024020020d0041012104410021020c010b200210242204450d0d0b200341003602f004200320043602e804200320023602ec04200341e8046a4100411010c90120032802e80420032802f00422026a2204200329008002370000200441086a20034180026a41086a2900003700002003200241106a22023602f004200341e8046a2002411010c90120032802e80420032802f00422026a2204200329029001370000200441086a20034190016a41086a2902003700002003200241106a22043602f00420032802b0012102200341e8046a2004200110c90120032802e804220420032802f00422056a2002200110cf061a2003200520016a22013602f004024020032802b401450d00200210260b2001417f4c0d0d0240024020010d0041012102410021050c010b200110242202450d0d200121050b200341003602a00720032002360298072003200536029c0720034198076a4100200110c90120032802980720032802a00722026a2004200110cf061a200341ac076a200341f0046a220528020022043602002003200220016a3602a007200320032903e804220c3702a407200341e8046a200ca7200410d50302400240024020032802e8042201450d0020032802ec042102024002402005280200220420032802a0072205490d0020032802980722062001460d0120062001200510d206450d010b2002450d01200110260c010b200341a4076a2105200320043602980120032002360294012003200136029001200341e8046a2001200410d303024020032802fc0422010d00200341003602b801200342013703b001200341bc046a4110360200200320053602e404200341103602b4042003200341d8046a3602b8042003200341e4046a3602b004200320034190016a3602d8042003200341b0016a36025820034194026a41023602002003420237028402200341f0f4c400360280022003200341b0046a36029002200341d8006a41c4e1c00020034180026a10351a20032802b00120032802b80110840220032802b401450d0020032802b00110260b20034180026a41086a220220034190016a41086a2802003602002003200329039001370380020240200341a8076a280200450d0020032802a40710260b2005200329038002370200200541086a200228020036020020010d010b20034180026a200341d0016a10cf03200341e8046a2003280280022202200328028802220410d203024020032802fc042201450d002002200410ff010b200341d8006a41086a22042003418c056a280200360200200320034184056a29020037035802402001450d00200341e8046a41086a290300210c20032903e804210b2003280280052105200341d8046a41086a2004280200360200200320032903583703d8040240200328028402450d00200210260b200341c8006a200341d0016a200b200c10da02200341f2046a200341d8016a290300370100200341fa046a200341e0016a29030037010020034182056a200341e8016a2903003701002003418a0a3b01e804200320032903d0013701ea04200341e8046a1087020240200541ffffff3f71450d00200110260b0240200328029c07450d0020032802980710260b0240200341a8076a280200450d0020032802a40710260b200341043a0080010c170b0240200328028402450d00200210260b20034180016a410610f1020c010b024020032802800541ffffff3f71450d00200110260b20034180016a410e10f1020b0240200328029c07450d0020032802980710260b0240200341a8076a280200450d0020032802a40710260b20032d0080014104460d14200329028401210c0c130b200341b0046a41186a200141196a290000370300200341b0046a41106a200141116a290000370300200341b0046a41086a200141096a290000370300200320012900013703b004200341e8046a41206a200241206a290200370300200341e8046a41186a200241186a290200370300200341e8046a41106a200241106a290200370300200341e8046a41086a200241086a290200370300200320022902003703e80420034180026a200341e8046a10d60220034198076a41086a220120034180026a41096a29000037030020034198076a41106a220220034180026a41116a29000037030020034198076a41186a220420034180026a41196a29000037030020032003290081023703980720032d0080024101460d0e200341d0016a41186a2004290300370300200341d0016a41106a2002290300370300200341d0016a41086a200129030037030020032003290398073703d001200341b0016a200341d0016a10cc03200341e8046a20032802b001220520032802b80110b8032001200341e8046a41096a2900003703002002200341e8046a41116a2900003703002004200341e8046a41196a290000370300200320032900e904370398070240024020032d00e8044101460d0041002101200341003a0080020c010b20034189026a200341a0076a29030037000020034191026a200341a8076a29030037000020034199026a200341b0076a29030037000041012101200341013a0080022003200329039807370081020b024020032802b401450d00200510260b20034181056a200341c8046a290300370000200341f9046a200341c0046a290300370000200341f1046a200341b8046a290300370000200320032903b0043700e904200341013a00e80402402001450d0020034180026a410172200341e8046a410172412010d2060d00200341e8046a200341d0016a10cc0320032802e804220120032802f00410ff01024020032802ec04450d00200110260b200341d0016a10d603200341043a0090010c110b20034190016a410110f10220032d0090014104460d10200329029401210c0c0f0b200341d8046a410110f10220041098030c270b20034190016a41026a200341b0016a41026a2d000022013a0000200320032f00b00122023b019001200041206a41023a0000200041186a41003a000020004200370308200020023b0021200041236a20013a0000200042013703000c270b200341023a00b0040c220b200341b0046a410710f1020c210b200341b0046a410210f1020c200b200341b0046a410310f1020c1f0b200341b0046a410310f1020c1e0b200341b0046a410410f1020c1d0b200341023a00b0010c1a0b200341b0016a410810f1020c170b200341023a00b0010c090b1033000b1034000b200341023a0080010c040b200341023a0090010b20032802900121012000200c370024200041206a2001360000200041186a41003a0000200042003703084201210c0c010b4200210c20004200370308200020032800e804360019200041186a41003a00002000411c6a200341eb046a2800003600000b2000200c3703000c170b20032802800121012000200c370024200041206a2001360000200041186a41003a000020004200370308200042013703000c160b2000420037030820002003280079360019200041186a41003a00002000411c6a200341fc006a280000360000200042003703000c150b20032802b00121012000200c370024200041206a2001360000200041186a41003a000020004200370308200042013703000c140b200042003703082000200328009001360019200041186a41003a00002000411c6a20034193016a280000360000200042003703000c130b200c42ffffff3f83500d00200110260b200441ffffff3f71450d00200210260b20032d00b0014104460d0120032902b401210c0b20032802b00121012000200c370024200041206a2001360000200041186a41003a000020004200370308200042013703000c0f0b200042003703082000200328008001360019200041186a41003a00002000411c6a20034183016a280000360000200042003703000c0e0b200741ffffff3f71450d01200810260c010b0240200a2007470d0020034194026a200a410110930120032802940221080b200820044105746a220141206a2001200a20046b41057410d0061a200141186a200241186a290000370000200141106a200241106a290000370000200141086a200241086a290000370000200120022900003700002003200a41016a36029c02200341e8046a41186a220120034180026a41186a290300370300200341e8046a41106a20034180026a41106a290300370300200341e8046a41086a20034180026a41086a29030037030020032003290380023703e80420034198076a200341b0016a200341b0046a10d003200328029807220220032802a007200341e8046a10d1030240200328029c07450d00200210260b0240200128020041ffffff3f71450d0020032802fc0410260b2003418a056a20032903b004370100200341f2046a200341b0016a41086a290300370100200341fa046a200341b0016a41106a29030037010020034182056a200341b0016a41186a29030037010020034192056a200341b0046a41086a2903003701002003419a056a200341b0046a41106a290300370100200341a2056a200341b0046a41186a2903003701002003418a043b01e804200320032903b0013701ea04200341c2056a200341d0016a41186a290300370100200341ba056a200341d0016a41106a290300370100200341b2056a200341d0016a41086a290300370100200341aa056a20032903d001370100200341e8046a1087020240200941ffffff3f71450d00200610260b200341043a0080010c030b200941ffffff3f71450d00200610260b20032d0080014104460d01200329028401210c0b20032802800121012000200c370024200041206a2001360000200041186a41003a000020004200370308200042013703000c090b2000420037030820002003280079360019200041186a41003a00002000411c6a200341fc006a280000360000200042003703000c080b20032d00b0014104460d020b20032902b401210c0b20032802b00121012000200c370024200041206a2001360000200041186a41003a000020004200370308200042013703000c050b200042003703082000200328009001360019200041186a41003a00002000411c6a20034193016a280000360000200042003703000c040b0240200441ffffff3f71450d00200110260b20032d00b0044104460d0020032802b0042101200020032902b404370024200041206a2001360000200041186a41003a000020004200370308200042013703000c030b20004200370308200020032800b001360019200041186a41003a00002000411c6a200341b3016a280000360000200042003703000c020b200341043a00d8040b20041026024020032d00d8044104460d0020032802d8042101200020032902dc04370024200041206a2001360000200041186a41003a000020004200370308200042013703000c010b200042003703082000200328008001360019200041186a41003a00002000411c6a20034183016a280000360000200042003703000b200341c0076a24000f0b102c000b8d0401057f230041e0006b22022400200241998dc700410810fb01200241106a41b58dc700410510fb0102400240412010242203450d002002422037023420022003360230200241306a41004120106d20022802302203200228023822046a22052001290000370000200541086a200141086a290000370000200541106a200141106a290000370000200541186a200141186a2900003700002002200441206a2201360238200241c0006a2003200110bc02200241dc006a200320016a360200200220033602582002200241c0006a41106a3602542002200241c0006a360250200241206a200241d0006a107302402002280234450d00200310260b2002280228220341206a2205417f4c0d010240024020050d0041012101410021050c010b200510242201450d010b20002001360200200041086a220141003602002000200536020420004100411010c9012000280200200128020022056a220420022900003700002001200541106a2205360200200441086a200241086a29000037000020002005411010c9012000280200200128020022056a220420022900103700002001200541106a2206360200200441086a200241106a41086a2900003700002002280220210520002006200310c9012000280200200128020022006a2005200310cf061a2001200020036a36020002402002280224450d00200510260b200241e0006a24000f0b1033000b1034000bcc0101027f20002802242101024020002d00000d0020002d0001210020012001280200417f6a2202360200024020020d002001280208200128020c2802001103000240200128020c280204450d00200128020810260b20012001280204417f6a220236020420020d00200110260b200041ff01714100470f0b20012001280200417f6a2200360200024020000d002001280208200128020c2802001103000240200128020c280204450d00200128020810260b20012001280204417f6a220036020420000d00200110260b41010bb00101047f230041106b22032400200228020021020240412010242204450d002003422037020420032004360200200341004120106d20032802002205200328020822066a22042002290000370000200441086a200241086a290000370000200441106a200241106a290000370000200441186a200241186a2900003700002003200641206a2202360208200020012005200210b30102402003280204450d00200510260b200341106a24000f0b1033000b930401057f230041e0006b22022400200241086a41998dc700410810fb01200241186a41d883c300410b10fb0102400240412010242203450d002002422037023c20022003360238200241386a41004120106d20022802382203200228024022046a22052001290000370000200541086a200141086a290000370000200541106a200141106a290000370000200541186a200141186a2900003700002002200441206a2201360240200241c8006a2003200110a202200241dc006a200320016a360200200220033602582002200241c8006a41086a3602542002200241c8006a360250200241286a200241d0006a10730240200228023c450d00200310260b2002280230220341206a2205417f4c0d010240024020050d0041012101410021050c010b200510242201450d010b20002001360200200041086a220141003602002000200536020420004100411010c9012000280200200128020022056a220420022900083700002001200541106a2205360200200441086a200241086a41086a29000037000020002005411010c9012000280200200128020022056a220420022900183700002001200541106a2206360200200441086a200241186a41086a2900003700002002280228210520002006200310c9012000280200200128020022006a2005200310cf061a2001200020036a3602000240200228022c450d00200510260b200241e0006a24000f0b1033000b1034000ba80601057f230041f0006b22032400200341086a41998dc700410810fb01200341186a41b884c300411010fb0102400240412010242204450d002003422037024c20032004360248200341c8006a41004120106d20032802482204200328025022056a22062001290000370000200641086a200141086a290000370000200641106a200141106a290000370000200641186a200141186a2900003700002003200541206a2201360250200341386a2004200110a202200341ec006a200420016a360200200320043602682003200341386a41086a3602642003200341386a360260200341286a200341e0006a10730240200328024c450d00200410260b412010242201450d002003422037024c20032001360248200341c8006a41004120106d20032802482201200328025022066a22042002290000370000200441086a200241086a290000370000200441106a200241106a290000370000200441186a200241186a2900003700002003200641206a2202360250200341d8006a2001200210a202200341ec006a200120026a360200200320013602682003200341d8006a41086a3602642003200341d8006a360260200341386a200341e0006a10730240200328024c450d00200110260b20032802302202200328024022046a41206a2206417f4c0d010240024020060d0041012101410021060c010b200610242201450d010b20002001360200200041086a220141003602002000200636020420004100411010c9012000280200200128020022066a220520032900083700002001200641106a2206360200200541086a200341086a41086a29000037000020002006411010c9012000280200200128020022066a220520032900183700002001200641106a2207360200200541086a200341186a41086a2900003700002003280228210620002007200210c9012000280200200128020022056a2006200210cf061a2001200520026a22053602002003280238210220002005200410c9012000280200200128020022006a2002200410cf061a2001200020046a3602000240200328023c450d00200210260b0240200328022c450d00200610260b200341f0006a24000f0b1033000b1034000bd90203037f027e027f230041106b22032400200341003602082003420137030020022802102104200341004104106d2003280200200328020822056a20043600002003200541046a2204360208200241086a290300210620022903002107200320044110106d2003280200200328020822046a22052006370008200520073700002003200441106a3602082002280214210420032002411c6a280200220210a1010240024020020d0020032802002108200328020821020c010b20024105742105200328020821020340200320024120106d20032802002208200328020822096a22022004290000370000200241086a200441086a290000370000200241106a200441106a290000370000200241186a200441186a2900003700002003200941206a2202360208200441206a2104200541606a22050d000b0b200020012008200210b30102402003280204450d00200810260b200341106a24000b920403047f037e047f230041e0006b220324002003200236020c20032001360208200341106a2001200210820202400240200328021022010d00200041003602140c010b200328021421042003200341186a28020022023602242003200136022002400240024020024104490d00200128000021052003200141046a36022020032002417c6a220636022420064110490d0020032002416c6a3602242003200141146a3602202001410c6a290000210720012900042108200341c8006a200341206a10920120032802482202450d00200329024c21092003280224220641024f0d01200942ffffff3f83500d00200210260b20034100360230200342013703282003410e36023c2003200341086a3602382003200341286a360244200341dc006a41013602002003420137024c2003418c8dc6003602482003200341386a360258200341c4006a41c4e1c000200341c8006a10351a200328022820032802301084020240200328022c450d00200328022810260b200041003602140c010b200341386a41046a200341286a41046a2f0100220a3b010020032003280128220b3602382003280220220c2f0000210d20032006417e6a3602242003200c41026a3602202000200737030820002008370300200041206a200d3b01002000200937031820002002360214200020053602102000200b360122200041266a200a3b01000b2004450d00200110260b200341e0006a24000b930302047f037e230041e0006b220324002003200236020c20032001360208200341106a2001200210820202400240200328021022010d00200041003602140c010b200328021421042003200341186a2802002202360224200320013602200240024020024104490d00200128000021052003200141046a36022020032002417c6a220636022420064110490d0020032002416c6a3602242003200141146a3602202001410c6a290000210720012900042108200341c8006a200341206a10920120032802482202450d00200329024c210920002007370308200020083703002000200937031820002002360214200020053602100c010b20034100360230200342013703282003410e36023c2003200341086a3602382003200341286a360244200341dc006a41013602002003420137024c2003418c8dc6003602482003200341386a360258200341c4006a41c4e1c000200341c8006a10351a200328022820032802301084020240200328022c450d00200328022810260b200041003602140b2004450d00200110260b200341e0006a24000bb70203027f017e027f23004180026b22012400200141086a200010d803200141e0006a200128020822002001280210220210d90320012903602103200141b8016a200141e8006a41c40010cf061a200141b4016a41026a2204200141af016a2d00003a0000200120012f00ad013b01b4010240024020034201510d0041002105200141186a410041c40010d1061a0c010b20012d00ac012105200141186a200141b8016a41c40010cf061a200141146a41026a20042d00003a0000200120012f01b4013b01140b200141e8006a200141186a41c40010cf062104200141af016a200141166a2d00003a00002001200541ff017141016a220541ff01200541ff01491b3a00ac0120014201370360200120012f01143b00ad0120002002200410da030240200128020c450d00200010260b20014180026a24000b130020002002ad4220862001ad84101f10c5060bb50203027f017e027f23004180026b22012400200141086a200010d803200141e0006a200128020822002001280210220210d90320012903602103200141b8016a200141e8006a41c40010cf061a200141b4016a41026a2204200141af016a2d00003a0000200120012f00ad013b01b4010240024020034201510d0041002105200141186a410041c40010d1061a0c010b20012d00ac012105200141186a200141b8016a41c40010cf061a200141146a41026a20042d00003a0000200120012f01b4013b01140b200141e8006a200141186a41c40010cf062104200141af016a200141166a2d00003a00002001200541ff017122054101200541014b1b417f6a3a00ac0120014201370360200120012f01143b00ad0120002002200410da030240200128020c450d00200010260b20014180026a24000ba7220a037f027e037f067e027f027e037f077e047f027e23004190046b220624000240024002400240024002400240024002402003200484500d0020012002460d0020012002412010d206450d00200641306a200210d803200641c0006a200628023022072006280238220810d903200629034021094200210a2006420037034020064188016a280200210b20062d008c01210c024002402009420151220d0d0020064190016a41306a420037030020064190016a41286a4200370300200641b0016a420037030020064190016a41186a4200370300200641a0016a420037030020064198016a420037030020064200370390014200210e4200210f0c010b200641f8006a2903002110200641c0006a41306a2903002111200641c0006a41206a2903002112200641c0006a41186a290300211320064180016a290300210f2006290350210e2006290348210a200641b0016a200641c0006a41286a29030037030020064190016a41286a201137030020064190016a41306a2010370300200641a0016a2013370300200620123703a8012006200a370390012006200e370398010b200641c8016a200110d803200641d8016a20062802c801221420062802d001221510d90320062903d801211642002117200642003703d801200641a0026a280200211820062d00a4022119024002402016420152221a450d004200211b4200211c4200211d4200211e4200211f42002112420021130c010b200641f0016a290300211f20062903e801211320062903e001211220064190026a290300211d20064188026a290300211c20064180026a290300211b200641f8016a290300211720064198026a290300211e0b0240201220037d2220201256201320047d2012200354ad7d221020135620102013511b0d00200a20037c2221200a542222200e20047c2022ad7c2211200e542011200e511b0d0220062021370390012006201137039801024002400240427f202120062903a0017c2212201220215422222011200641a8016a2903007c2022ad7c221220115420122011511b22221b4280c8afa025544100427f201220221b501b0d00200641b8026a200110d80320064190036a20062802b802222320062802c00210d903200641c0036a290300420020062903900342015122221b2112200641b8036a290300420020221b2113024020062802bc02450d00202310260b2013202056201220105620122010511b0d0120062006290081033703f002200620064188036a2800003600f7020c020b200641a8026a410510eb020c060b20064180036a410210eb0220062006290081033703f002200620064180036a41086a2800003600f70220062d00800322224104470d040b0240024020050d0020204280c8afa0255441002010501b0d010c080b200641b8026a200110d80320064190036a20062802b802220520062802c00210d90320062d00dc0321222006290390032112024020062802bc02450d00200510260b202042ffc7afa0255620104200522010501b0d0720124201520d07202241ff0171450d070b200641a8026a410610eb020c040b200641a8026a410410eb02200a2121200e211120122120201321100c030b200041043a00000c070b200641a8026a410310eb02200a2121200e21110c010b200641a8026a41086a20062800f702360000200620223a00a802200620062903f0023700a9020c010b20062d00a8024104460d020b20062902ac0222104280807c8321122010420888a7211520062802a80221052010a721224101211a0c020b200641043a00a8020b200641d8026a201b370300200641e0026a201c370300200641e8026a201d370300200620173703d0022006201f3703c802200620203703b802200620103703c00202400240427f2020201f7c221220122020542205201020177c2005ad7c221220105420122010511b22051b22134280c8afa025544100427f201220051b2212501b0d00200641c8026a290300211220062903c002210a20062903b802210e4201211f0c010b024002402020201f8420102017848450450d004200211f0c010b4200211f20064190036a41186a2222420037030020064190036a41106a2223420037030020064190036a41086a22054200370300200642003703900320064180036a419a8cc700410810fb01200520064180036a41086a222429000037030020062006290080033703900320064180036a41b8a1c300410d10fb01202220242900003703002023200629008003370300200641186a20064190036a108d02200641186a41106a290300210a2006290320210e20062802182125202242003703002023420037030020054200370300200642003703900320064180036a419a8cc700410810fb012005202429000037030020062006290080033703900320064180036a41b8a1c300410d10fb0120222024290000370300202320062900800337030020064200200a420020251b220a20127d200e420020251b220e201354ad7d2226200e20137d2227200e562026200a562026200a511b22221b3703880320064200202720221b3703800320064190036a412020064180036a411010b301200641c8036a2012370300200641c0036a2013370300200541013a000020064199036a2001290000370000200641a1036a200141086a290000370000200641a9036a200141106a290000370000200641b1036a200141186a290000370000200641023a00900320064190036a1087020b0b20164201512122201aad211320064180026a201b370300200641f8016a201737030020064198026a201e37030020064188026a201c370300200641e8016a200a37030020064190026a201d370300200641f0016a20123703002006200e3703e0014100211a200620194100201642015122051b3a00a40220062018410020051b3602a0022006201f4201512205ad3703d8010240024020050d002014201510ff0142002112410021150c010b20142015200641e0016a10da0342002112410121150b0b024020062802cc01450d00201410260b0240024002400240201a0d000240201541ff01712205450d00202241ff0171450d020b20050d02202241ff0171450d0220064190036a41086a41043a000020064199036a2001290000370000200641a1036a200141086a290000370000200641a9036a200141106a290000370000200641b1036a200141186a290000370000200641003a00900320064190036a1087020c020b2015ad42ff01834208862022ad42ff0183842012842112200541807e7121140c020b20064190036a41086a41033a000020064199036a2001290000370000200641a1036a200141086a290000370000200641a9036a200141106a290000370000200641b1036a200141186a290000370000200641003a00900320064190036a1087020b420121124100211441042105024020134201510d00201321120c010b200641c8036a2010370300200641c0036a20203703004100211420064190036a41086a41003a000020064199036a2001290000370000200641a1036a200141086a290000370000200641a9036a200141106a290000370000200641b1036a200141186a290000370000200641023a00900320064190036a1087020b200641b8026a41206a222220064190016a41306a290300370300200641b8026a41186a221a20064190016a41286a290300370300200641c8026a221520064190016a41206a290300370300200641c0026a221820064190016a41186a290300370300200620062903a0013703b80202400240200541ff017122054104460d0020124280807c832113201420057221052012420888a721222012a7210d410121140c010b20094201522105200641d8016a41186a20182903002212370300200641d8016a41206a2015290300370300200641d8016a41286a201a290300370300200641d8016a41306a2022290300370300200620062903b80222133703e801200620213703d801200620113703e00102400240427f202120137c221020102021542214201120127c2014ad7c221020115420102011511b22141b22204280c8afa025544100427f201020141b2210501b0d00200641e8016a290300211220064188026a290300211320064180026a2903002120200641f8016a290300210a20062903e001210e20062903d80121174201211f20062903f00121160c010b02400240202120138420112012848450450d004200211f0c010b4200211f20064190036a41186a2222420037030020064190036a41106a221a420037030020064190036a41086a22144200370300200642003703900320064180036a419a8cc700410810fb01201420064180036a41086a221529000037030020062006290080033703900320064180036a41b8a1c300410d10fb0120222015290000370300201a200629008003370300200620064190036a108d02200641106a2903002112200629030821132006280200211820224200370300201a420037030020144200370300200642003703900320064180036a419a8cc700410810fb012014201529000037030020062006290080033703900320064180036a41b8a1c300410d10fb0120222015290000370300201a200629008003370300200642002012420020181b221220107d2013420020181b2213202054ad7d220a201320207d220e201356200a201256200a2012511b22221b3703880320064200200e20221b3703800320064190036a412020064180036a411010b301200641c8036a2010370300200641c0036a2020370300201441013a000020064199036a2002290000370000200641a1036a200241086a290000370000200641a9036a200241106a290000370000200641b1036a200241186a290000370000200641023a00900320064190036a1087020b0b2005ad2110200641e8006a200a370300200641f0006a2020370300200641d0006a200e370300200641f8006a2013370300200641d8006a2012370300200620163703602006200f3703800120062017370348410021142006200c4100200942015122051b3a008c012006200b410020051b360288012006201f4201512205ad3703400240024020050d002007200810ff0142002113410021220c010b20072008200641c8006a10da0342002113410121220b0b02402006280234450d00200710260b024002400240024020140d000240202241ff01712205450d00200d41ff0171450d020b20050d02200d41ff0171450d0220064190036a41086a41043a000020064199036a2002290000370000200641a1036a200241086a290000370000200641a9036a200241106a290000370000200641b1036a200241186a290000370000200641003a00900320064190036a1087020c020b200541ff01714104460d02200020053a0000200041036a20054118763a0000200020054108763b0001200041046a2022ad42ff0183420886200dad42ff0183842013843700000c030b20064190036a41086a41033a000020064199036a2002290000370000200641a1036a200241086a290000370000200641a9036a200241106a290000370000200641b1036a200241186a290000370000200641003a00900320064190036a1087020b20104201520d00200641c8036a2011370300200641c0036a202137030020064190036a41086a41003a000020064199036a2002290000370000200641a1036a200241086a290000370000200641a9036a200241106a290000370000200641b1036a200241186a290000370000200641023a00900320064190036a1087020b200641e8036a2004370300200641e0036a200337030020064190036a41086a41023a000020064199036a2001290000370000200641b9036a2002290000370000200641a1036a200141086a290000370000200641a9036a200141106a290000370000200641b1036a200141186a290000370000200641c1036a200241086a290000370000200641c9036a200241106a290000370000200641d1036a200241186a290000370000200641023a00900320064190036a108702200041043a00000b20064190046a24000b8d0401057f230041e0006b22022400200241808cc700410610fb01200241106a41e292c400410710fb0102400240412010242203450d002002422037023420022003360230200241306a41004120106d20022802302203200228023822046a22052001290000370000200541086a200141086a290000370000200541106a200141106a290000370000200541186a200141186a2900003700002002200441206a2201360238200241c0006a2003200110bc02200241dc006a200320016a360200200220033602582002200241c0006a41106a3602542002200241c0006a360250200241206a200241d0006a107302402002280234450d00200310260b2002280228220341206a2205417f4c0d010240024020050d0041012101410021050c010b200510242201450d010b20002001360200200041086a220141003602002000200536020420004100411010c9012000280200200128020022056a220420022900003700002001200541106a2205360200200441086a200241086a29000037000020002005411010c9012000280200200128020022056a220420022900103700002001200541106a2206360200200441086a200241106a41086a2900003700002002280220210520002006200310c9012000280200200128020022006a2005200310cf061a2001200020036a36020002402002280224450d00200510260b200241e0006a24000f0b1033000b1034000b9b0406027f017e017f017e027f057e230041d0006b220324002003200236020420032001360200200341086a2001200210820202400240200328020822010d00200042003703000c010b200328020c2102024002400240200341106a28020022044104490d0020044104460d002004417b6a4110490d002004416b6a4110490d002004415b6a4110490d002004414b6a410f4b0d010b20034100360220200342013703182003410e36022c200320033602282003200341186a360234200341cc006a41013602002003420137023c2003418c8dc6003602382003200341286a360248200341346a41c4e1c000200341386a10351a200328021820032802201084020240200328021c450d00200328021810260b420021050c010b2001280000210420012d000421062001410d6a290000210520012900052107200341186a41026a200341386a41026a2d000022083a0000200320032f003822093b01182001411d6a290000210a2001412d6a290000210b2001290015210c2001290025210d2001290035210e200041c0006a2001413d6a290000370300200041386a200e370300200041306a200b370300200041286a200d370300200041206a200a370300200041186a200c370300200041106a200537030020002007370308200020063a004c200041c8006a2004360200200020093b004d200041cf006a20083a0000420121050b200020053703002002450d00200110260b200341d0006a24000ba30101037f230041106b22032400200341003602082003420137030020022802402104200341004104106d2003280200200328020822056a20043600002003200541046a220436020820022d00442105200320044101106d2003280200200328020822046a20053a00002003200441016a3602082003200210a6012000200120032802002202200328020810b30102402003280204450d00200210260b200341106a24000bba0302057f017e230041c0016b2202240002400240410410242203450d002002420437022c20022003360228200241286a41004104106d2002280228200228023022036a41f0c2c98b063600002002200341046a220336023020012802002101200241286a20034104106d20022802282204200228023022036a20013600002002200341046a2201360230200241003a007820042105410021030340200241003a0038200241386a20052001410047220610cf061a024020010d00200241003a00380b20012006490d02200241d8006a20036a20022d00383a00002002200341016a22033a0078200120066b2101200520066a210520034120470d000b200241386a41186a200241d8006a41186a2903002207370300200241086a41086a2201200241d8006a41086a290300370300200241086a41106a2203200241d8006a41106a290300370300200241086a41186a22062007370300200220022903583703080240200228022c450d00200410260b20002002290308370000200041186a2006290300370000200041106a2003290300370000200041086a2001290300370000200241c0016a24000f0b1033000b2006200141f0b1c7001048000b96810108057f017e167f017e087f017e027f067e230022012102200141a0176b41607122032400200341206a200010dd03200341a0146a200328022022012003280228220410de030240024020032802a01422050d0041082105420021060c010b2001200410ff0120032902a41421060b02402003280224450d00200110260b20052006422088a7220741f0026c6a21082006a721090240024002400240024002400240024020070d00200521010c010b200341a0146a41046a210a200341206a41046a210b20034180096a41046a210c4100210d200341a0036a41286a210e200341a0036a41206a210f200341a0036a41186a2110200341a0036a41106a2111200341a0036a41086a211241002113024002400340200341d0036a2005200d6a220141bc0210cf061a200141bc026a2802002104200e200141e8026a290300370300200f200141e0026a2903003703002010200141d8026a2903003703002011200141d0026a2903003703002012200141c8026a2903003703002003200141c0026a2903003703a00320044103460d02200c200341d0036a41bc0210cf062114200341206a20034180096a41c00210cf061a200341e0116a200b41bc0210cf061a200341b0116a41286a200e290300370300200341b0116a41206a200f290300370300200341b0116a41186a2010290300370300200341b0116a41106a2011290300370300200341b0116a41086a2012290300370300200320032903a0033703b01120044102470d01200d41f0026a210d201341016a2113200141f0026a2008470d000b200821010c020b200a200341e0116a41bc0210cf062115200341e00e6a200341a0146a41c00210cf061a200341b00e6a41286a220e200341b0116a41286a290300370300200341b00e6a41206a220f200341b0116a41206a290300370300200341b00e6a41186a2210200341b0116a41186a290300370300200341b00e6a41106a2211200341b0116a41106a290300370300200341b00e6a41086a2212200341b0116a41086a290300370300200320032903b0113703b00e200341c0066a200341e00e6a41c00210cf061a20034190066a41286a220c200e29030037030020034190066a41206a220e200f29030037030020034190066a41186a220f201029030037030020034190066a41106a2210201129030037030020034190066a41086a22112012290300370300200320032903b00e37039006200341f00b6a200341c0066a41c00210cf061a200341c00b6a41286a2212200c290300370300200341c00b6a41206a220c200e290300370300200341c00b6a41186a220e200f290300370300200341c00b6a41106a220f2010290300370300200341c00b6a41086a2210201129030037030020032003290390063703c00b200341a0146a200341f00b6a41c00210cf061a200341206a41286a22112012290300370300200341206a41206a2212200c290300370300200341206a41186a220c200e290300370300200341206a41106a220e200f290300370300200341206a41086a220f2010290300370300200320032903c00b37032041f8021024220a450d03200a2013360200200a41046a200341a0146a41c00210cf061a200a20043602c402200a20032903203703c802200a41d0026a200f290300370300200a41d8026a200e290300370300200a41e0026a200c290300370300200a41e8026a2012290300370300200a41f0026a201129030037030041012116024002400240200741f0026c41907d6a200d470d00410121170c010b200341d0036a200141f0026a41bc0210cf061a200141ac056a2802002104200341a0036a41286a220d200141d8056a290300370300200341a0036a41206a220e200141d0056a290300370300200341a0036a41186a220f200141c8056a290300370300200341a0036a41106a2210200141c0056a290300370300200341a0036a41086a2211200141b8056a2903003703002003200141b0056a2903003703a003200141e0056a2112024020044103470d0041012117201221010c020b41012116410121170340201341016a211320122101024003402014200341d0036a41bc0210cf061a200341206a20034180096a41c00210cf061a200341e0116a200b41bc0210cf061a200341b0116a41286a2212200d290300370300200341b0116a41206a220c200e290300370300200341b0116a41186a2207200f290300370300200341b0116a41106a22182010290300370300200341b0116a41086a22192011290300370300200320032903a0033703b01120044102470d0120082001460d03200341d0036a200141bc0210cf061a200141bc026a2802002104200d200141e8026a290300370300200e200141e0026a290300370300200f200141d8026a2903003703002010200141d0026a2903003703002011200141c8026a2903003703002003200141c0026a2903003703a003201341016a2113200141f0026a210120044103460d040c000b0b2015200341e0116a41bc0210cf061a200341e00e6a200341a0146a41c00210cf061a200341b00e6a41286a221a2012290300370300200341b00e6a41206a2212200c290300370300200341b00e6a41186a220c2007290300370300200341b00e6a41106a22072018290300370300200341b00e6a41086a22182019290300370300200320032903b0113703b00e200341c0066a200341e00e6a41c00210cf061a20034190066a41286a2219201a29030037030020034190066a41206a221a201229030037030020034190066a41186a2212200c29030037030020034190066a41106a220c200729030037030020034190066a41086a22072018290300370300200320032903b00e37039006200341f00b6a200341c0066a41c00210cf061a200341c00b6a41286a22182019290300370300200341c00b6a41206a2219201a290300370300200341c00b6a41186a221a2012290300370300200341c00b6a41106a2212200c290300370300200341c00b6a41086a220c200729030037030020032003290390063703c00b200341a0146a200341f00b6a41c00210cf061a200341206a41286a22072018290300370300200341206a41206a22182019290300370300200341206a41186a2219201a290300370300200341206a41106a221a2012290300370300200341206a41086a221b200c290300370300200320032903c00b370320024020172016470d00024002400240201641016a22122016490d002016410174220c2012200c20124b1b22124104201241044b1bad42f8027e2206422088a7220c0d002006a722124100480d00201641f8026c201c20161b211c0240200a410020161b220a0d0020120d0241004108200c4100471b210a0c030b201c2012460d020240201c0d0020120d024108210a0c030b200a201c20121028220a450d0e0c020b102e000b20121024220a450d0c0b201241f8026e21160b200a201741f8026c6a22122013360200201241046a200341a0146a41c00210cf061a201241c4026a2004360200201241c8026a2003290320370300201241d0026a201b290300370300201241d8026a201a290300370300201241e0026a2019290300370300201241e8026a2018290300370300201241f0026a2007290300370300201741016a211720082001460d01200341d0036a200141bc0210cf061a200141bc026a2802002104200d200141e8026a290300370300200e200141e0026a290300370300200f200141d8026a2903003703002010200141d0026a2903003703002011200141c8026a2903003703002003200141c0026a2903003703a003200141f0026a211220044103470d000b200141f0026a21010c010b200821010b024020082001460d000340200141f0026a21040240200141bc026a2802004102460d000240200141b0026a280200220d450d00200141b4026a280200450d00200d10260b200110d5010b2004210120082004470d000b0b02402009450d00200941f0026c450d00200510260b024020174115490d002017410176ad42f8027e2206422088a70d052006a7221b417f4c0d05201b10242215450d04410021112003410036022820034204370320200a41887d6a211c200a418c7a6a211a410421122017210c0340200c210f4100210c4101210e0240200f417f6a220b450d00024002400240024002400240200a200b41f8026c6a41f4026a2d0000200f41f8026c2210200a6a41847d6a2d00002201490d00200f417e6a2113201a20106a21084100210c410021040340024020132004470d00200f210e0c080b200441016a2104200141ff0171210d20082d00002101200841887d6a2108200d20014f0d000b200441016a210e2004417f73200f6a21040c010b201a20106a2108200b210402400340024020044101470d00410021040c020b2004417f6a2104200141ff0171210d20082d00002101200841887d6a2108200d2001490d000b0b200f2004490d02200f20174b0d01200f20046b220e410176220d450d00200a200441f8026c6a2101201c20106a21080340200341a0146a200141f80210cf061a2001200841f80210d00641f8026a21012008200341a0146a41f80210cf0641887d6a2108200d417f6a220d0d000b0b024020040d002004210c0c050b0240200e41094d0d002004210c0c050b200f20174b0d02200a200441f8026c6a21100340200f2004417f6a220c490d040240200f200c6b220e4102490d00200a200441f8026c6a220141f4026a2d0000200a200c41f8026c6a220841f4026a2d000022134f0d00200341a0146a200841f40210cf061a200341e00e6a41026a2205200841f7026a2d00003a00002003200841f5026a2f00003b01e00e2008200141f80210cf061a0240200e4103490d00200b2108201021010340200141ec056a2d000020134f0d012001200141f8026a220d41f80210cf061a200d210120042008417f6a2208470d000b200d21010b2001200341a0146a41f40210cf06220141f4026a20133a0000200141f5026a20032f01e00e3b0000200141f7026a20052d00003a00000b200c450d05201041887d6a2110200c2104200e410a4f0d050c000b0b200f201741c4ccc5001047000b2004200f41c4ccc5001048000b200f2004417f6a220c490d00200f201741d4ccc5001047000b200c200f41d4ccc5001048000b024020112003280224470d00200341206a10bf0120032802202112200328022821110b201220114103746a2201200e3602042001200c3602002003201141016a220b36022802400240200b41024f0d00200b2111200c450d010c020b0240034002400240024002402012200b2211417f6a220b4103746a2201280200450d00201141037420126a221341746a280200220d200128020422044d0d00201141024d0d0520122011417d6a22014103746a28020422082004200d6a4d0d01201141034d0d05201341646a2802002008200d6a4d0d010c050b20114103490d012001280204210420122011417d6a22014103746a28020421080b20082004490d010b2011417e6a21010b02400240024002400240024002402011200141016a22094d0d00201120014d0d012012200141037422076a2201280204221820012802006a22012012200941037422196a22042802002214490d02200120174b0d03200a201441f8026c6a22102004280204220541f8026c22046a210d200141f8026c210e200120146b221320056b220120054f0d042015200d200141f8026c220410cf06221320046a210820054101480d0520014101480d05201c200e6a210e200d21040340200e200441887d6a220d200841887d6a220f2008417c6a2d00002004417c6a2d00004922011b41f80210cf06210e2008200f20011b210802402010200d200420011b2204490d00201321010c080b200e41887d6a210e2013210120132008490d000c070b0b2009201141e4ccc5001032000b2001201141f4ccc5001032000b201420014184cdc5001048000b200120174184cdc5001047000b20152010200410cf06220120046a2108024020054101480d00201320054c0d00200a200e6a210f20012101201021040340200d2001200d41f4026a2d0000200141f4026a2d00004922131b210e2001200141f8026a20131b21012004200e41f80210cf0641f8026a2104200d41f8026a200d20131b220d200f4f0d03200820014b0d000c030b0b20102104200121010c010b200d2104201321010b20042001200820016b2208200841f802706b10cf061a201220076a2201201820056a36020420012014360200201220196a2201200141086a20112009417f736a41037410d0061a2003200b36022841012111200b41014b0d000b0b200c0d010b0b0240200328022441ffffffff0171450d00201210260b201b41f802702101201b41f802490d03201b2001460d03201510260c030b20174102490d02200a2017417f6a220441f8026c6a210e4100210f0340024002400240201720042201417f6a2204490d00201720046b220d4102490d02200a200141f8026c6a220141f4026a2d0000200a200441f8026c6a220841f4026a2d000022134f0d02200341a0146a200841f40210cf061a200341e00e6a41026a2210200841f7026a2d00003a00002003200841f5026a2f00003b01e00e2008200141f80210cf061a200d4103490d01200f2108200e21010340200141ec056a2d000020134f0d022001200141f8026a220d41f80210cf061a200d21012008417f6a22080d000b200d21010c010b2004201741a4ccc5001048000b2001200341a0146a41f40210cf06220141f4026a20133a0000200141f5026a20032f01e00e3b0000200141f7026a20102d00003a00000b200f41016a210f200e41887d6a210e20040d000c030b0b200141f0026a21010b024020082001460d000340200141f0026a21040240200141bc026a2802004102460d000240200141b0026a280200220d450d00200141b4026a280200450d00200d10260b200110d5010b2004210120082004470d000b0b410021164108210a02402009450d00200941f0026c450d00200510260b410021170b200a201741f8026c6a210e0240024020170d004200211d200a21040c010b200341206a41b0026a211e200341a0146a41c0026a2104200341206a41c0026a2108200041016a211f200341bd146a2120200341a0146a41106a2110200341b0116a41086a210f200341206a41d0026a2121200341206a41046a212242c0a187f0002106200341d0036a41286a2105200341d0036a41206a210b200341d0036a41186a2114200341e1066a222341076a2124410021114200211d200a21010240034020012802002125200341e00e6a200141046a41c00210cf061a200141c4026a280200210d2005200141f0026a290300370300200b200141e8026a2903003703002014200141e0026a290300370300200341d0036a41106a220c200141d8026a290300370300200341d0036a41086a2212200141d0026a2903003703002003200141c8026a2903003703d0030240200d4102470d00200141f8026a21040c030b200341206a200341e00e6a41c00210cf061a200341a0146a202241bc0210cf061a200420032903d003370300200441086a22132012290300370300200441106a2212200c290300370300200441186a220c2014290300370300200441206a2209200b290300370300200441286a220720052903003703002003200d3602dc16200341f00b6a200341a0146a10a10320032903f00b212620032802dc16210d20032802d016211820034180096a200341a0146a41bc0210cf061a200341e0116a41286a22192007290300370300200341e0116a41206a22172009290300370300200341e0116a41186a2215200c290300370300200341e0116a41106a221c2012290300370300200341e0116a41086a221a2013290300370300200320042903003703e011200d4102460d01427f427f427f200620267c222620262006541b220642c0b2cd3b7c222620262006541b427f200642c0f0f50b7c222620262006541b20181b220642c0b2cd3b7c222620262006541b2006200d4101461b2106200341206a20034180096a41bc0210cf061a200841286a22182019290300370300200820032903e011370300200841086a2219201a290300370300200841106a221a201c290300370300200841186a221c2015290300370300200841206a221520172903003703002003200d3602dc0202400240024020032d008c0341c000490d002011450d0020064280c0a8ca9a3a560d010b200341f00b6a200341206a10df030240024020032d00e8024101460d004102211b02400240024020032d00e9020e03000102000b4100211b0c010b200f202141086a290000370300200341b0116a41106a202141106a290000370300200341b0116a41186a202141186a2f00003b0100200320212900003703b0114101211b20032802ec02212720032f01ea0221280b200341a0146a41186a200341b0116a41186a2f01003b01002010200341b0116a41106a290300370300200341a0146a41086a200f290300370300200320032903b0113703a0144100210c202721090c010b4101210c20032802ec0221090b200341b00e6a41186a2207200341a0146a41186a280200360200200341b00e6a41106a22182010290300370300200341b00e6a41086a2219200341a0146a41086a2212290300370300200320032903a0143703b00e411010242213450d09201341b889c70036020c20134101360208201342818080801037020002400240200c201b7241ff01710d002013210d0c010b41101024220d450d0a200d41d089c70036020c200d4101360208200d42818080801037020020132013280200417f6a221736020020170d002013280208201328020c2802001103000240201328020c280204450d00201328020810260b20132013280204417f6a221736020420170d00201310260b02400240200d280208200341f00b6a200d28020c28020c110100450d00200341a0146a200341f00b6a41b00210cf061a200f20032903b00e370100200f41086a2019290300370100200f41106a2018290300370100200f41186a2007280200360100200320093602b411200320283b01b2112003201b3a00b1112003200c3a00b0112003200d3602d411200341c0066a200341a0146a200341b0116a10a3030c010b200d200d280200417f6a2213360200200341023a00e006200341003a00d806200342003703c806200342013703c006024020130d00200d280208200d28020c2802001103000240200d28020c280204450d00200d28020810260b200d200d280204417f6a221336020420130d00200d10260b200341f00b6a1098030b0240024020032802d00222130d00200341003602b0110c010b20032802d802220d417f4c0d0702400240200d0d004100210c410121090c010b200d10242209450d07200d210c0b200341003602b811200320093602b0112003200c3602b411200341b0116a4100200d10c90120032802b01120032802b811220c6a2013200d10cf061a2003200c200d6a3602b8110b0240024020032802dc024101460d004101211320032802d002450d01200341a0146a201e10e00320032802a014220d20032802a81410ff0120032802a414450d01200d10260c010b20032802e002210d0240024020032802e402221341014b0d00200341003602dc020c010b200341013602dc0220032013417f6a3602e4020b200d20006a210d024020032802d002450d00200341a0146a200d10dd0320032802a814210c20032802a0142113200341b00e6a41046a41003a0000200341003602b00e200341186a2013200c200341b00e6a41054100108102024002402003280218450d002003200328021c220c4105200c4105491b3602f40b2003200341b00e6a3602f00b200341106a200341f00b6a108f012003280214210c20032802104521090c010b410021090b024020032802a414450d00201310260b200341a0146a201e10e00320032802a014221320032802a814200d200c410020091b10e10320032802a414450d00201310260b200341a0146a200341206a41f00210cf061a200d200341a0146a10e203410021130b2012200f280200360200200320032903b0113703a014200320232900003703f00b200320242800003600f70b0240024020032903c0064201510d004104210d0c010b20032d00e006210c20032903c8062126200320032800f70b3600b70e200320032903f00b3703b00e4104210d20264202510d00200320032800b70e3600c70b200320032903b00e3703c00b200c210d0b200341f00b6a41086a20122802002212360200200320032903a01422263703f00b200320032903c00b37039006200320032800c70b3600970620102026370200201041086a2012360200200320253602ac14200320003602a814200341023602a4142003410c3a00a0142003200d3a00bc142020200329039006370000202041076a200328009706360000200341a0146a10870202402013450d00024020032802d002220d450d0020032802d402450d00200d10260b200341206a1098030b2006211d0c010b200341f00b6a200341206a41bc0210cf061a200341c0066a41286a22172018290300370300200341c0066a41206a22182015290300370300200341c0066a41186a2215201c290300370300200341c0066a41106a221c201a290300370300200341c0066a41086a221a2019290300370300200320082903003703c006200d4103460d00200341a0146a200341f00b6a41bc0210cf061a200420032903c0063703002013201a2903003703002012201c290300370300200c201529030037030020092018290300370300200720172903003703002003200d3602dc16201f200341a0146a10e2030b2011417f6a2111200141f8026a2201200e470d000b200e21040c010b200141f8026a21040b0240200e2004460d0003402004220141f8026a21040240200141b8026a2802002208450d00200141bc026a280200450d00200810260b200141086a10d501200e2004470d000b0b02402016450d00201641f8026c450d00200a10260b200341b8146a22014200370300200341b0146a22214200370300200341a0146a41086a22044200370300200342003703a014200341e00e6a41818dc700410910fb012004200341e00e6a41086a2208290000370300200320032900e00e3703a014200341e00e6a41dcd5c000410f10fb0120012008290000370300202120032900e00e370300200341206a200341a0146a10fe01024002400240200328022022080d0041002104200341003602f80b200342043703f00b4104210841002101410421154100211a410021110c010b2003200329022422063702f40b200320083602f00b2006a7210402402006422088a7220141024f0d004100211a41042115410021110c010b200828020821112008280204211a2008280200211520082008410c6a2001410c6c41746a10d0061a20032001417f6a22013602f80b200141014b0d010b0340024020012004470d00200341f00b6a2001410110cb0120032802f80b210120032802f00b21080b20082001410c6c6a22044100360208200442043702002003200141016a22013602f80b200141014b0d0120032802f40b21040c000b0b200341206a41086a2201200341f00b6a41086a280200360200200320032903f00b2206370320024002402006a7220d0d00200341b8146a4200370300200341b0146a4200370300200341a0146a41086a22014200370300200342003703a014200341e00e6a41818dc700410910fb012001200341e00e6a41086a2204290000370300200320032900e00e3703a014200341e00e6a41dcd5c000410f10fb01202141086a2004290000370000202120032900e00e370000200341a0146a412010ff010c010b200341b8146a4200370300200341b0146a4200370300200341a0146a41086a22044200370300200342003703a014200341e00e6a41818dc700410910fb012004200341e00e6a41086a2208290000370300200320032900e00e3703a014200341e00e6a41dcd5c000410f10fb01202141086a2008290000370000202120032900e00e370000200341a0146a200341206a108002024020012802002201450d002001410c6c2104200d210103400240200141046a2802002208450d00200841246c450d00200128020010260b2001410c6a2101200441746a22040d000b0b20032802242201450d002001410c6c450d00200d10260b200341b8146a4200370300200341b0146a4200370300200341a0146a41086a22014200370300200342003703a014200341e00e6a41818dc700410910fb012001200341e00e6a41086a2204290000370300200320032900e00e3703a014200341e00e6a4190d8c000410a10fb01202141086a2004290000370000202120032900e00e370000200341206a200341a0146a10fe0120032902244200200328022022041b2206422088a7220e410c6c2101200e41ffffffff0371211c2004410420041b220f41746a2104417f210802400340024020010d00410021130c020b200141746a2101200841016a2108200441146a210d2004410c6a22132104200d280200220d450d000b200341a0146a41086a20132802002201410c6a290200370300200341b0146a200141146a290200370300200320012902043703a0142001411c6a2902002129200128020021102001200141246a200d41246c415c6a10d0061a201341086a200d417f6a360200410121132008211c0b200341206a41106a200341a0146a41106a2204290300370300200341206a41086a200341a0146a41086a2201290300370300200320032903a0143703202003200f3602f00b200320063702f40b200341b8146a42003703002004420037030020014200370300200342003703a014200341e00e6a41818dc700410910fb012001200341e00e6a41086a2204290000370300200320032900e00e3703a014200341e00e6a4190d8c000410a10fb01202141086a2004290000370000202120032900e00e370000200341a0146a200341f00b6a1080022006a7210d0240200e450d00200e410c6c2104200f210103400240200141046a2802002208450d00200841246c450d00200128020010260b2001410c6a2101200441746a22040d000b0b0240200d450d00200d410c6c450d00200f10260b200341c0066a41086a220d200341206a41086a290300370300200341c0066a41106a220e200341206a41106a290300370300200320032903203703c0064100210802402013450d00201141246c2101201521040340024020010d00410121080c020b2001415c6a210120042802002108200441246a210420082010470d000b410021080b200341b8146a4200370300200341a0146a41106a4200370300200341a0146a41086a22014200370300200342003703a014200341e00e6a41818dc700410910fb012001200341e00e6a41086a2204290000370300200320032900e00e3703a014200341e00e6a41eb8cc700410a10fb01202141086a2004290000370000202120032900e00e370000200341206a200341a0146a10fc01200341003602e811200342043703e011200328022021012003290224210620034180096a41106a200e29030037030020034180096a41086a200d290300370300200320032903c006370380092001410420011b21072006420020011b2206a721182015201141246c22016a21190240024002402006422088a72213410274220d4102752204200141246d6a22012004490d00200120086a220420014f0d010b2007200d6a210c200320103602e40e200320083602e00e20032003290380093703e80e200320034180096a41086a2903003702f00e200320034180096a41106a2903003703f80e201c41016a2117201a41246c21202029422088a7211b200341206a41087221052029a721254100210441042109410421144100210a4101210b200721122015211103400240024002400240200b4101470d00201821012012210e200c210f02402007450d002012200c470d020240201841ffffffff0371450d00200710260b20252101201b210e201c210f0b024020192011460d00201141146a29020021062011280200210d20112902042126200341206a41086a2011410c6a290200370300200341206a41106a2006370300200320263703202011411c6a2902002106410121134100210720012118200e2112200f210c201141246a21110c030b0240200b450d00201a450d002020450d00201510260b4100210b0b20084102460d05200341003602a014200320032903f80e370338200320032903f00e370330200320032903e80e370328200320032903e00e2206370320200320032903b8143703f80e200320032903b0143703f00e200320032903a8143703e80e200320032903a01422263703e00e2006a74101470d052026a72108200341f00b6a41106a200541106a290200370300200341f00b6a41086a200541086a290200370300200320052902003703f00b2006422088a7210d410121132017210e202921060c020b2012280200210d200341206a41106a200341a0146a41106a290200370300200341206a41086a200341a0146a41086a290200370300200320032902a014370320201241046a2112410221130b200341f00b6a41106a200341206a41106a290300370300200341f00b6a41086a200341206a41086a290300370300200320032903203703f00b4100210e0b200341a0146a41106a220f200341f00b6a41106a290300370300200341a0146a41086a2210200341f00b6a41086a290300370300200320032903f00b3703a0140240200a20032802e411470d0002400240200b4101460d004100210120084102460d01200841014621010c010b024020084102460d00024020070d00417f201920116b41246d220120084101466a221420142001491b21010c020b417f417f200c20126b4102752201201920116b41246d6a221420142001491b220120084101466a221420142001491b21010c010b02402007450d00417f200c20126b4102752201201920116b41246d6a221420142001491b21010c010b201920116b41246d21010b200341e0116a200a417f200141016a221420142001491b10e80120032802e011220921140b201420046a2201200d360200200141046a20032903a014370200200f29030021262010290300212a200141286a200e360200200141246a20133602002001411c6a20063702002001410c6a202a370200200141146a20263702002003200a41016a220a3602e8112004412c6a21040c000b0b200341e0116a4100200410e80120032802e011210920032802e811210a200341e00e6a41106a20034180096a41106a290300370300200341e00e6a41086a20034180096a41086a29030037030020032003290380093703e00e2009200a412c6c6a210102402013450d00200a2013410274220d417c6a4102766a210e20072104034020042802002113200141246a4102360200200120133602002001412c6a2101200441046a2104200d417c6a220d0d000b200e41016a210a0b0240201841ffffffff0371450d00200710260b024020192015460d00200341b8146a210d200341b0146a2113200341a8146a210e2015210403402004280200210f200d2004411c6a2902003703002013200441146a290200370300200e2004410c6a2902003703002003200441046a2902003703a0142001200f360200200141046a20032903a0143702002001410c6a200e290300370200200141146a20132903003702002001411c6a200d290300370200200141246a42013702002001412c6a2101200a41016a210a200441246a22042019470d000b0b0240201a450d00201a41246c450d00201510260b2003201036022420032008360220200320032903e00e22263703282003200341e80e6a290300222a3702302003200341f00e6a290300222b37033820032903202106200341003602a01402402006a74101470d002006422088a7210420032903b814212c20032903b014212d20032903a814212e20032903a0142106201c41016a210d034020012004360200200141046a2026370200200141286a200d360200200141246a41013602002001411c6a20293702002001410c6a202a370200200141146a202b370200200341003602a0142001412c6a2101200a41016a210a2006a721082006422088a7210420032903a0142106202e2126202d212a202c212b20032903a814212e20032903b014212d20032903b814212c20084101460d000b0b2003200a3602e8110b02400240200a4115490d00200a410176ad422c7e2206422088a70d032006a72227417f4c0d03202710242222450d02410021042003410036022820034204370320200941546a2123200941fc7e6a212841042108200a210c024002400340200c21124100210c4101211102402012417f6a2213450d0002400240024002400240024020092013412c6c6a2802002012412c6c222420096a41a87f6a2802002201490d002012417e6a2110202820246a21134100210c4100210d034002402010200d470d00201221110c080b200d41016a210d20012013280200220e4f210f201341546a2113200e2101200f0d000b200d41016a2111200d417f7320126a21130c010b202820246a210d02400340024020134101470d00410021130c020b2013417f6a21132001200d280200220e49210f200d41546a210d200e2101200f0d000b0b20122013490d022012200a4b0d01201220136b2211410176220e450d0020092013412c6c6a2101202320246a210d0340200341a0146a41286a220f200141286a2210280200360200200341a0146a41206a2205200141206a220b290200370300200341a0146a41186a2214200141186a220c290200370300200341a0146a41106a2207200141106a2218290200370300200341a0146a41086a2219200141086a2217290200370300200320012902003703a014200d41086a22152902002106200d41106a221c2902002126200d41186a221a290200212a200d41206a221b2902002129200d41286a222528020021202001200d29020037020020102020360200200b2029370200200c202a37020020182026370200201720063702002025200f280200360200201b2005290300370200201a2014290300370200201c200729030037020020152019290300370200200d20032903a0143702002001412c6a2101200d41546a210d200e417f6a220e0d000b0b024020130d002013210c0c050b0240201141094d0d002013210c0c050b2012200a4b0d02201220136b210e20092013412c6c6a2105202320246a2119034020122013417f6a220c490d0402402012200c6b22114102490d0020092013412c6c6a22012802002009200c412c6c6a220f28020022104f0d00200341a0146a41206a220b200f41246a290200370300200341a0146a41186a2214200f411c6a290200370300200341a0146a41106a2207200f41146a290200370300200341a0146a41086a2218200f410c6a290200370300200f2902042106200f41286a200141286a280200360200200320063703a014200f41206a200141206a290200370200200f41186a200141186a290200370200200f41106a200141106a290200370200200f41086a200141086a290200370200200f200129020037020041012113024020114103490d00410121132005210103402001412c6a220d28020020104f0d01200141286a200141d4006a280200360200200141206a200141cc006a290200370200200141186a200141c4006a290200370200200141106a2001413c6a290200370200200141086a200141346a2902003702002001200d290200370200200d2101200e201341016a2213470d000b201921010b20012010360200200f2013412c6c6a220120032903a014370204200141246a200b2903003702002001411c6a2014290300370200200141146a20072903003702002001410c6a20182903003702000b200c450d05200e41016a210e200541546a2105200c21132011410a4f0d050c000b0b2012200a41c4ccc5001047000b2013201241c4ccc5001048000b20122013417f6a220c490d002012200a41d4ccc5001047000b200c201241d4ccc5001048000b024020042003280224470d00200341206a10bf0120032802202108200328022821040b200820044103746a220120113602042001200c3602002003200441016a22043602280240024020044102490d0003400240024002400240024020082004417f6a4103746a2201280200450d00200441037420086a220e41746a28020022132001280204220d4b0d010b20044103490d022001280204210d20082004417d6a22054103746a28020421010c010b200441024d0d0420082004417d6a22054103746a2802042201200d20136a4d0d00200441034d0d04200e41646a280200200120136a4b0d040b2001200d490d010b2004417e6a21050b02400240024002400240024002402004200541016a220b4d0d00200420054d0d012008200541037422076a2201280204221820012802006a22012008200b41037422196a22042802002214490d022001200a4b0d0320092014412c6c6a221120042802042212412c6c22046a210d2001412c6c2108200120146b220e20126b220120124f0d042022200d2001412c6c220410cf06221020046a211320124101480d0520014101480d05202320086a2104200d210103402004200141546a220d201341546a220e200e280200200d28020049220f1b2208290200370200200441286a200841286a280200360200200441206a200841206a290200370200200441186a200841186a290200370200200441106a200841106a290200370200200441086a200841086a2902003702002013200e200f1b211302402011200d2001200f1b2201490d00201021080c080b200441546a21042010210820102013490d000c070b0b200b200441e4ccc5001032000b2005200441f4ccc5001032000b201420014184cdc5001048000b2001200a4184cdc5001047000b20222011200410cf06221020046a2113024020124101480d00200e20124c0d00200920086a210f201021082011210103402001200d2008200d280200200828020049220e1b2204290200370200200141286a200441286a280200360200200141206a200441206a290200370200200141186a200441186a290200370200200141106a200441106a290200370200200141086a200441086a29020037020020082008412c6a200e1b21082001412c6a2101200d412c6a200d200e1b220d200f4f0d03201320084b0d000c030b0b20112101201021080c010b200d2101201021080b20012008201320086b22042004412c706b10cf061a2003280228220120054d0d022003280220220820076a2204201820126a360204200420143602002001200b4d0d04200820196a2204200441086a2001200b417f736a41037410d0061a20032001417f6a2204360228200441014b0d000b0b200c450d030c010b0b200520014194cdc5001032000b200b2001103e000b0240200328022441ffffffff0171450d00200810260b2027412c7021012027412c490d0120272001460d01202210260c010b200a4102490d00410021132009200a417f6a2208412c6c6a221421100340024002400240200a20082201417f6a2208490d00200a20086b22044102490d0220092001412c6c6a220128020020092008412c6c6a220e280200220f4f0d02200341a0146a41206a2211200e41246a290200370300200341a0146a41186a2212200e411c6a290200370300200341a0146a41106a2205200e41146a290200370300200341a0146a41086a220b200e410c6a290200370300200e2902042106200e41286a200141286a280200360200200320063703a014200e41206a200141206a290200370200200e41186a200141186a290200370200200e41106a200141106a290200370200200e41086a200141086a290200370200200e20012902003702004101210d20044103490d014100210d20102101034002402001412c6a2204280200200f490d00200d41016a210d0c030b200141286a200141d4006a280200360200200141206a200141cc006a290200370200200141186a200141c4006a290200370200200141106a2001413c6a290200370200200141086a200141346a29020037020020012004290200370200200421012013200d41016a220d470d000b200d41016a210d201421010c010b2008200a41a4ccc5001048000b2001200f360200200e200d412c6c6a220120032903a014370204200141246a20112903003702002001411c6a2012290300370200200141146a20052903003702002001410c6a200b2903003702000b201341016a2113201041546a211020080d000b0b20032802e411211320032802e011210e20032802e8112101200341b8146a4200370300200341b0146a4200370300200341a0146a41086a22044200370300200342003703a014200341e00e6a41818dc700410910fb012004200341e00e6a41086a2208290000370300200320032900e00e3703a014200341e00e6a41acd6c000410610fb01202141086a2008290000370000202120032900e00e3700002001412c6c41046a2204417f4c0d010240024020040d0041012108410021040c010b200410242208450d010b200341003602282003200836022020032004360224200341206a200110a10102402001450d00200e2001412c6c6a210d200e2101034020012802002104200341206a20032802284104106d2003280220200328022822086a20043600002003200841046a360228200141046a200341206a10ba012001412c6a2201200d470d000b0b200341a0146a412020032802202201200328022810b30102402003280224450d00200110260b02402013450d002013412c6c450d00200e10260b200341b8146a22014200370300200341b0146a22184200370300200341a0146a41086a22044200370300200342003703a014200341206a41eb8cc700410a10fb012004200341206a41086a2208290000370300200320032900203703a014200341206a41d4e6c600410910fb012001200829000037030020182003290020370300200341a0146a412010ff010240200041c19306490d00200041bfec796a2113200341f00b6a10e3030240024020032802f80b22190d004100210920032802f00b21170c010b20032802f00b221741046a2101201941037441786a41037641016a21044100210902400340200128020020134b0d01200141086a21012004200941016a2209470d000b200421090b20192009490d040b200341003602f80b024020094103742201450d00201720016a210a200341ac146a2107201721110340200341e00e6a2011280200220e10e403200341a0146a20032802e00e220520032802e80e221410e50302400240024020032802ac1422104102470d004104210d4100210b41002108410021100c010b20032802b014210c20032802a414210b20032802a014210d024020032802a81422120d00201221080c010b201241027421044100210141002108024002400340200d20016a220f28020020134d0d01200841016a21082004200141046a2201470d000b201221080c010b20122008490d09200f280200210c4101211020042001460d00200d417c6a21120340200341a0146a200e201220046a28020010e60320032802a014220f20032802a81410ff01024020032802a414450d00200f10260b20012004417c6a2204470d000b0b4100210120080d010b200341a0146a200e10a902024020032802a01422010d00410121010c010b024020032802a414450d00200110260b410021010b2003200c3602b014200320083602a8142003200b3602a4142003200d3602a014200320103602ac140240024020104102470d002005201410ff010c010b2003410036022820034201370320200341206a200341a0146a109a01200341206a200710af012005201420032802202204200328022810b30102402003280224450d00200410260b20104102460d00200b41ffffffff0371450d00200d10260b024020032802e40e450d00200510260b201141086a211102402001450d00200341a0146a200e10e40320032802a014220120032802a81410ff0120032802a414450d00200110260b2011200a470d000b0b0240201920096b2201450d0002402009450d002017201720094103746a200141037410d0061a0b200320013602f80b0b200341e00e6a41086a200341f00b6a41086a280200360200200320032903f00b22063703e00e02402006a722010d00200341b8146a4200370300200341b0146a4200370300200341a0146a41086a22014200370300200342003703a014200341206a41eb8cc700410a10fb012001200341206a41086a2204290000370300200320032900203703a014200341206a41bbf5c400410f10fb01201841086a200429000037000020182003290020370000200341a0146a412010ff010c010b200341b8146a4200370300200341b0146a4200370300200341a0146a41086a22044200370300200342003703a014200341206a41eb8cc700410a10fb012004200341206a41086a2208290000370300200320032900203703a014200341206a41bbf5c400410f10fb01201841086a200829000037000020182003290020370000200341a0146a200341e00e6a10e70320032802e40e41ffffffff0171450d00200110260b200010a903210620022400427f201d20067c22062006201d541b0f0b1033000b1034000b200920191040000b20082012103f000b102c000b980301057f230041d0006b22022400200241086a41a88dc700410910fb01200241186a41b2a1c300410610fb0120022001360234200241386a200241346a410410a202200241cc006a200241346a41046a3602002002200241c0006a3602442002200241346a3602482002200241386a360240200241286a200241c0006a1073024002402002280230220341206a2204417f4c0d000240024020040d0041012101410021040c010b200410242201450d020b20002001360200200041086a220141003602002000200436020420004100411010c9012000280200200128020022046a220520022900083700002001200441106a2204360200200541086a200241086a41086a29000037000020002004411010c9012000280200200128020022046a220520022900183700002001200441106a2206360200200541086a200241186a41086a2900003700002002280228210420002006200310c9012000280200200128020022006a2004200310cf061a2001200020036a3602000240200228022c450d00200410260b200241d0006a24000f0b1034000b1033000bcb180c047f017e077f017e037f037e067f017e057f017e087f017e230041c00e6b220324002003200236021c20032001360218200341206a2001200210820202400240200328022022040d00200041003602000c010b200328022421052003200341286a28020036023420032004360230200341106a200341306a108f010240024020032802100d0002400240024020032802142206200328023441f0026e2201200120064b1bad42f0027e2207422088a70d002007a72201417f4c0d0002400240024020010d00410821080c010b200110242208450d010b200141f0026ead210702402006450d00200341900b6a41067221094100210a03400240024020032802342201450d002003280230220b2d0000210220032001417f6a220c3602342003200b41016a360230200241014b0d000240024020020e020001000b410221020c020b02400240200c450d00200b2d0001210220032001417e6a22013602342003200b41026a220b360230200241014b0d004100210c02400240024020020e020100010b200341086a200341306a108f0120032802080d0220032802342201200328020c2202490d022002417f4c0d090240024020020d004100210d4101210c0c010b2002102a220c450d09200328023421012002210d0b0240024020012002490d00200c2003280230200210cf06210e2003280234220120024f0d012002200141b8afc0001048000b200d450d030c020b2003200120026b22013602342003200328023020026a220b360230200e450d022002ad422086200dad84210f0b200fa7210d0240024002400240024002400240024002400240024002402001450d00200b2d0000210e20032001417f6a3602342003200b41016a360230200341900b6a200341306a10b60220032802900b4117460d03200341e0086a200341900b6a41b00210cf061a20032802342201450d07200328023022102d0000210b20032001417f6a22113602342003201041016a2212360230200b41014b0d0741002102200b0e020201020b200c450d0c200d0d0b0c0c0b20114104490d05201035000121132003201041056a36023020032001417b6a220236023420024104490d05201035000521142003200141776a22113602342003201041096a221236023020144220862013842115410121020b2011450d0820122d0000210120032011417f6a220b3602342003201241016a360230200141024b0d0820010e03010203010b200c450d09200d0d080c090b200b450d0620122d0001210120032011417e6a22163602342003201241026a360230200141024b0d064100210b0240024020010e03060001060b41002101200341003a00b00b2011417d6a210b0240034020162001460d01200341900b6a20016a201220016a221041026a2d00003a00002003201041036a3602302003200141016a22103a00b00b2003200b360234200b417f6a210b2010210120104120460d060c000b0b200141ff0171450d07200341003a00b00b0c070b4102210b0c040b200b450d0520122d0001210120032011417e6a220b3602342003201241026a36023020010d05200b41034d0d05200341c00d6a41086a200341900b6a41086a290200370300200341c00d6a41106a200341900b6a41106a290200370300200341c00d6a41186a200341900b6a41186a280200360200200320032902900b3703c00d2012280002211720032011417a6a3602342003201241066a360230410121180c040b200b450d0420032011417e6a3602342003201241026a3602300c040b200341e0086a109803200c450d05200d0d040c050b200341c0086a41086a2201200941086a290000370300200341c0086a41106a220b200941106a290000370300200341c0086a41186a2211200941186a2f00003b0100200320092900003703c008201041ff0171411f4d0d0220032f01900b211920032801920b211a200341800e6a41186a20112f010022103b0100200341e00d6a41086a2001290300370300200341e00d6a41106a200b290300370300200341e00d6a41186a20103b0100200320032903c0083703e00d4101210b0b200341c00d6a41186a200341e00d6a41186a2f01003b0100200341c00d6a41106a200341e00d6a41106a290300370300200341c00d6a41086a200341e00d6a41086a290300370300200320032903e00d3703c00d41002118201a21170b200f422088a7211b200341c0086a41186a200341c00d6a41186a280200360200200341c0086a41106a200341c00d6a41106a290300370300200341c0086a41086a200341c00d6a41086a290300370300200320032903c00d3703c008200341900b6a200341e0086a41b00210cf061a200341c00d6a41026a200341dd086a41026a2d00003a0000200320032f00dd083b01c00d2015211c200d211d200c211e200e211f200b21200c030b200341e0086a109803200c450d01200d450d010b200c10260b410221020b20034190066a200341900b6a41b00210cf061a200341f0056a41186a2201200341c0086a41186a280200360200200341f0056a41106a220b200341c0086a41106a290300370300200341f0056a41086a220c200341c0086a41086a290300370300200341ec056a41026a220d200341c00d6a41026a220e2d00003a0000200320032903c0083703f005200320032f01c00d3b01ec0520024102460d00200341900b6a20034190066a41b00210cf061a200341e0086a41186a2001280200360200200341e0086a41106a200b290300370300200341e0086a41086a200c290300370300200e200d2d00003a0000200320032903f0053703e008200320032f01ec053b01c00d20192121201c21222018212320172124201b2125201d2126201e2127201f2128202021290c010b410321020b200341b8036a200341900b6a41b00210cf061a20034198036a41186a2201200341e0086a41186a28020036020020034198036a41106a220b200341e0086a41106a29030037030020034198036a41086a220c200341e0086a41086a29030037030020034194036a41026a220d200341c00d6a41026a2d00003a0000200320032903e00837039803200320032f01c00d3b0194030240024002400240024020024103460d00200341e0006a200341b8036a41b00210cf061a200341c0006a41186a220e2001280200360200200341c0006a41106a2210200b290300370300200341c0006a41086a220b200c2903003703002003413c6a41026a220c200d2d00003a00002003200329039803370340200320032f0194033b013c2007422088a722012007a7470d040240200141016a220d2001490d0020014101742211200d200d2011491b220d4104200d41044b1bad42f0027e2213422088a722110d002013a7220d4100480d00200141f0026c202a20011b212a02402008410020011b22080d00200d0d034100410820114100471b21080c050b202a200d460d040240202a0d00200d0d03410821080c050b2008202a200d10282208450d030c040b102e000b2007422088a72201450d09200141f0026c2102200821010c080b200d102422080d010b102c000b200742808080807083200d41f0026ead8421070b20082007422088a741f0026c6a200341e0006a41b00210cf06220141cc026a2024360200200141ca026a20213b0000200141c9026a20293a0000200141c8026a20233a0000200120223703c002200120023602bc02200120253602b802200120263602b402200120273602b002200e280200210220102903002113200b29030021142003290340212b200141ec026a20283a0000200141d0026a202b370300200141d8026a2014370300200141e0026a2013370300200141e8026a2002360200200141ed026a20032f013c3b0000200141ef026a200c2d00003a000020074280808080107c2107200a41016a220a2006470d000b0b2008450d0420002007370204200020083602000c050b1033000b1034000b03400240200141bc026a2802004102460d000240200141b0026a280200220a450d00200141b4026a280200450d00200a10260b200110d5010b200141f0026a2101200241907d6a22020d000b0b2007a72201450d00200141f0026c450d00200810260b200341003602e808200342013703e0082003410e360294062003200341186a360290062003200341e0086a3602b803200341a40b6a4101360200200342013702940b2003418c8dc6003602900b200320034190066a3602a00b200341b8036a41c4e1c000200341900b6a10351a20032802e00820032802e808108402024020032802e408450d0020032802e00810260b200041003602000b2005450d00200410260b200341c00e6a24000b942205047f067e017f037e047f230041e0036b2202240002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012802000e170102030405060b0708090a0b0c0d0e0f10111213141500010b200241086a200141086a108d03200041086a200241086a41c80010cf061a200041163602000c150b200241086a200141086a108e0320004100360200200041186a200241086a41106a290300370300200041106a200241086a41086a290300370300200041086a20022903083703000c140b200241086a200141086a108f03200041086a200241086a41a00210cf061a200041013602000c130b20004102360200200041086a200141086a2903003703000c120b02400240024002400240024002400240024020012d0004417f6a220341044b0d00200141046a210420030e050102030405010b41bf80c700412841dcbcc700102f000b200141086a2802002103410121050c040b41022105200241c0026a41026a200441036a2d00003a0000200241086a41086a200141146a290200370300200241186a2001411c6a290200370300200241206a200141246a2d00003a0000200220042f00013b01c00220022001410c6a290200370308200141086a2802002103200141286a28020021010c040b200141086a2802002103410321050c020b200241c2026a200441036a2d00003a0000200241086a41086a200141146a290200370300200241186a2001411c6a290200370300200241206a200141246a2d00003a0000200220042f00013b01c00220022001410c6a29020037030820012d00254100472104200141086a2802002103200141286a2802002101410421050c030b200141086a2802002103410521050b0b0b200020053a0004200020022f01c0023b0005200020043a0025200020022f01b0023b0126200041086a20033602002000410c6a2002290308370200200041286a2001360200200041076a200241c2026a2d00003a0000200041146a200241086a41086a2903003702002000411c6a200241186a290300370200200041246a200241206a2d00003a0000200041033602000c110b02400240024002400240024002400240200141086a22032d0000417f6a220541034b0d0020050e0401020304010b41bf80c700412841dcbcc700102f000b200241106a200341096a290000370300200241186a200341116a290000370300200241206a200341196a29000037030020022003290001370308200141386a2903002106200141306a2903002107410121010c030b200241106a200341096a290000370300200241186a200341116a290000370300200241206a200341196a29000037030020022003290001370308200141c8006a2903002108200141c0006a2903002109200141386a2903002106200141306a2903002107410221010c030b200241106a200341096a290000370300200241186a200341116a290000370300200241206a200341196a290000370300200220032900013703082002200341216a2800003602c0022002200341246a2800003600c302200141c8006a3100002108200141c0006a2902002109200141386a2902002106200141306a2902002107200141d8006a290300210a200141d0006a290300210b410321010c030b200241106a200341096a290000370300200241186a200341116a290000370300200241206a200341196a29000037030020022003290001370308200141386a2903002106200141306a2903002107410421010b0b0b20002002290308370009200020022802c00236002920004104360200200041d8006a200a370300200041d0006a200b370300200041c8006a2008370300200041c0006a2009370300200041386a2006370300200041306a2007370300200041086a20013a00002000412c6a20022800c302360000200041116a200241086a41086a290300370000200041196a200241186a290300370000200041216a200241206a2903003700000c100b200241086a200141046a10c001200041053602002000410c6a200241106a280200360200200020022903083702040c0f0b024002402001280204450d00200241c0026a41186a200141286a290000370300200241c0026a41106a200141206a290000370300200241c8026a200141186a290000370300200241c0026a41286a200141386a290000370300200241c0026a41306a200141c0006a290000370300200241c0026a41386a200141c8006a290000370300200241c0026a41c8006a200141d8006a290000370300200241c0026a41d0006a200141e0006a290000370300200241c0026a41d8006a200141e8006a2900003703002002200141106a2900003703c0022002200141306a2900003703e0022002200141d0006a29000037038003200241c0026a41f8006a20014188016a290000370300200241c0026a41f0006a20014180016a290000370300200241c0026a41e8006a200141f8006a290000370300200241c0026a4198016a200141a8016a290000370300200241c0026a4190016a200141a0016a290000370300200241c0026a4188016a20014198016a2900003703002002200141f0006a2900003703a003200220014190016a2900003703c003200241086a200141046a10c801200241146a200241c0026a41a00110cf061a0c010b200241003602080b200041046a200241086a41ac0110cf061a200041073602000c0e0b20004108360200200020012802043602040c0d0b200241086a200141086a109003200041086a200241086a41980210cf061a200041093602000c0c0b20012802042103200241086a200141086a10c801200241b0026a200141146a10d001200241086a41146a200241b0026a41086a280200360200200220022903b002370214200241c0026a41106a200241086a41106a2903002206370300200241c0026a41086a200241086a41086a29030022073703002002200229030822083703c002200141206a2902002109200141286a280200210520002003360204200041086a2008370200200041106a2007370200200041186a2006370200200041286a2005360200200041206a20093702002000412c6a2001412c6a290200370200200041346a200141346a2902003702002000413c6a2001413c6a290200370200200041c4006a200141c4006a290200370200200041cc006a200141cc006a290200370200200041d4006a200141d4006a290200370200200041dc006a200141dc006a290200370200200041e4006a200141e4006a2902003702002000410a3602000c0b0b108103000b200241086a200141086a109103200041086a200241086a41a00210cf061a2000410c3602000c090b2000410d3602000c080b200241086a200141046a10b702200041046a200241086a41c80010cf061a2000410e3602000c070b024002400240024020012f0104417f6a220341014b0d0020030e020102010b41bf80c700412841dcbcc700102f000b200241086a200141086a10c401200229020c210620022802082103410121010c010b20012f0106210541b00210242203450d082003200141086a28020010c601410221010b200020013b01042000410f3602002000410c6a2006370200200041086a2003360200200041066a20053b01000c060b200241086a200141086a10d002200041086a200241086a41a80210cf061a200041103602000c050b200241086a200141046a109203200041046a200241086a41c40010cf061a200041113602000c040b02400240024002400240200141086a22032d0000417f6a220c41034b0d00420021064101210542002107200c0e0404010203040b41bf80c700412841dcbcc700102f000b200241206a200341196a290000370300200241186a200341116a290000370300200241106a200341096a290000370300200220032900013703084200210641022105420021070c020b200241106a200341096a290000370300200241186a200341116a290000370300200241206a200341196a29000037030020022003290001370308200141c8006a2903002109200141c0006a2903002108200141386a290300210d200141306a290300210e200141d0006a28020021044200210641032105420021070c010b200241106a200341096a290000370300200241186a200341116a290000370300200241206a200341196a290000370300200220032900013703082002200341216a2800003602c0022002200341246a2800003600c302200141d0006a290300220f428080808070832106200141d8006a2903002107200141c8006a3100002109200141c0006a2902002108200141386a290200210d200141306a290200210e200141e8006a290300210b200141e0006a290300210a200141f0006a2802002110200fa72104410421050b20002002290308370009200020022802c002360029200041e8006a200b370300200041e0006a200a370300200041d8006a2007370300200041c8006a2009370300200041c0006a2008370300200041386a200d370300200041306a200e370300200041086a20053a00002000412c6a20022800c302360000200041f0006a2010360200200041d0006a20062004ad84370300200041116a200241086a41086a290300370000200041196a200241186a290300370000200041216a200241206a290300370000200041123602000c030b200241086a200141046a10930320004113360200200041246a200241286a2802003602002000411c6a200241206a290300370200200041146a200241186a2903003702002000410c6a200241106a290300370200200020022903083702040c020b200241086a200141086a10940320004114360200200041286a200241086a41206a290300370300200041206a200241086a41186a290300370300200041186a200241086a41106a290300370300200041106a200241086a41086a290300370300200041086a20022903083703000c010b024002400240024002400240024020012d0004417f6a221141054b0d004104210520110e06010203060405010b41bf80c700412841dcbcc700102f000b200241086a41086a2205200141106a290000370300200241086a41106a2212200141186a290000370300200241086a41156a22132001411d6a2900003700002002200141086a29000037030820012f0006210420012d0005211020012d0025210c41b00210242203450d062003200141286a280200109503200241c0026a41156a2013290000370000200241c0026a41106a2012290300370300200241c0026a41086a2005290300370300200220022903083703c002410121050c040b200241c0026a41086a200141106a290200370300200241c0026a41106a200141186a290200370300200241d5026a2001411d6a2900003700002002200141086a2902003703c00220012f0006210420012d0005211020012d0025210c410221050c030b200241c0026a41086a200141106a290200370300200241c0026a41106a200141186a290200370300200241d5026a2001411d6a2900003700002002200141086a2902003703c00220012f0006210420012d0005211020012d0025210c410321050c020b20012f0106210420012d00052110410521050c010b200241c0026a41086a200141106a290200370300200241c0026a41106a200141186a290200370300200241d5026a2001411d6a2900003700002002200141086a2902003703c0022001412c6a2802002113200141286a280200210320012f0006210420012d0005211020012f0126211220012d0025210c410621050b200020103a0005200020053a00042000200c3a002520004115360200200041066a20043b0100200041086a20022903c0023702002000412c6a2013360200200041286a2003360200200041266a20123b0100200041106a200241c0026a41086a290300370200200041186a200241c0026a41106a2903003702002000411d6a200241c0026a41156a2900003700000b200241e0036a24000f0b102c000bcf0201057f230041306b22022400200241a88dc700410910fb01200241106a41aca1c300410610fb01200241206a2001280200200128020810fd02024002402002280228220341206a2204417f4c0d000240024020040d0041012101410021040c010b200410242201450d020b20002001360200200041086a220141003602002000200436020420004100411010c9012000280200200128020022046a220520022900003700002001200441106a2204360200200541086a200241086a29000037000020002004411010c9012000280200200128020022046a220520022900103700002001200441106a2206360200200541086a200241106a41086a2900003700002002280220210420002006200310c9012000280200200128020022006a2004200310cf061a2001200020036a36020002402002280224450d00200410260b200241306a24000f0b1034000b1033000b9a0101027f230041106b220424000240410810242205450d002004420837020420042005360200200441004104106d2004280200200428020822056a20023600002004200541046a2202360208200420024104106d20042802002202200428020822056a20033600002004200541046a2203360208200020012002200310b30102402004280204450d00200210260b200441106a24000f0b1033000b9e0201037f230041306b220224002002200010dd0320022802082103200228020021000240410110242204450d0020024201370214200220043602100240024020012802bc024102470d00200241106a41004101106d2002280210200228021822046a41003a00002002200441016a3602180c010b200241106a41004101106d2002280210200228021822046a41013a00002002200441016a3602182001200241106a10e8030b200241206a41086a200241106a41086a2802003602002002200229031037032020002003200241206a10e90302402002280204450d00200010260b024020012802bc024102460d00024020012802b0022200450d00200141b4026a280200450d00200010260b20011098030b200241306a24000f0b1033000bd405020a7f017e23004180016b22012400200141206a22024200370300200141186a22034200370300200141086a41086a420037030020014200370308200141086a41eb8cc700410a10fb01200141e8006a41bbf5c400410f10fb012002200141e8006a41086a290000370300200320012900683703002001412036022c2001200141086a360228200141306a200141086a41201082020240024002400240200128023022040d00410021050c010b200128023421062001200141306a41086a280200360244200120043602402001200141c0006a108f010240024020012802000d002001280204220720012802444103762202200220074b1b22034103742202417f4c0d030240024020030d00410421050c010b200210242205450d050b41002102200141003602702001200336026c20012005360268024002402007450d000340200128024422084104490d022001280240220328000021092001200341046a36024020012008417c6a220a360244200a4104490d022003280004210a2001200841786a3602442001200341086a36024002402002200128026c470d00200141e8006a200210ec0120012802682105200128027021020b200520024103746a2203200a360204200320093602002001200241016a22023602702007417f6a22070d000b0b200129026c210b2005450d010c020b0240200128026c41ffffffff0171450d00200510260b0b4100210520014100360250200142013703482001410e36025c2001200141286a3602582001200141c8006a360264200141fc006a41013602002001420137026c2001418c8dc6003602682001200141d8006a360278200141e4006a41c4e1c000200141e8006a10351a20012802482001280250108402200128024c450d00200128024810260b2006450d00200410260b0240024020050d0020004100360208200042043702000c010b2000200b370204200020053602000b20014180016a24000f0b1034000b1033000b9b0301057f230041d0006b22022400200241086a41eb8cc700410a10fb01200241186a41d2f5c400410c10fb0120022001360234200241386a200241346a410410a202200241c0006a410c6a200241346a41046a3602002002200241c0006a3602442002200241346a3602482002200241386a360240200241286a200241c0006a1073024002402002280230220341206a2204417f4c0d000240024020040d0041012101410021040c010b200410242201450d020b20002001360200200041086a220141003602002000200436020420004100411010c9012000280200200128020022046a220520022900083700002001200441106a2204360200200541086a200241086a41086a29000037000020002004411010c9012000280200200128020022046a220520022900183700002001200441106a2206360200200541086a200241186a41086a2900003700002002280228210420002006200310c9012000280200200128020022006a2004200310cf061a2001200020036a3602000240200228022c450d00200410260b200241d0006a24000f0b1034000b1033000bca03010a7f230041e0006b220324002003200236020c20032001360208200341106a2001200210820202400240200328021022010d002000410236020c0c010b200328021421042003200341106a41086a28020036022420032001360220200341c8006a200341206a10e2010240024020032802482205450d00200328024c2106024020032802242207450d00200341c8006a41086a2802002108200328022022092d0000210a20032007417f6a220b3602242003200941016a360220200a41014b0d004100210202400240200a0e020100010b200b4104490d012009280001210c20032007417b6a3602242003200941056a360220410121020b2000200c3602102000200836020820002006360204200020053602000c020b200641ffffffff0371450d00200510260b20034100360230200342013703282003410e36023c2003200341086a3602382003200341286a360244200341dc006a41013602002003420137024c2003418c8dc6003602482003200341386a360258200341c4006a41c4e1c000200341c8006a10351a200328022820032802301084020240200328022c450d00200328022810260b410221020b2000200236020c2004450d00200110260b200341e0006a24000b870401047f230041e0006b22032400200341086a41eb8cc700410a10fb01200341186a41caf5c400410810fb0102400240410410242204450d002003420437023c20032004360238200341386a41004104106d2003280238200328024022046a20013600002003200441046a2201360240200341386a20014104106d20032802382201200328024022046a20023600002003200441046a2202360240200341c8006a2001200210a202200341dc006a200120026a360200200320013602582003200341c8006a41086a3602542003200341c8006a360250200341286a200341d0006a10730240200328023c450d00200110260b2003280230220241206a2204417f4c0d010240024020040d0041012101410021040c010b200410242201450d010b20002001360200200041086a220141003602002000200436020420004100411010c9012000280200200128020022046a220520032900083700002001200441106a2204360200200541086a200341086a41086a29000037000020002004411010c9012000280200200128020022046a220520032900183700002001200441106a2206360200200541086a200341186a41086a2900003700002003280228210420002006200210c9012000280200200128020022006a2004200210cf061a2001200020026a3602000240200328022c450d00200410260b200341e0006a24000f0b1033000b1034000b940201057f230041106b2202240002400240200128020822034103744104722204417f4c0d0020012802002101200410242205450d012002410036020820022004360204200220053602002002200310a1010240024020030d0020022802002105200228020821030c010b200120034103746a210620022802082103034020012802002104200220034104106d2002280200200228020822036a20043600002002200341046a2203360208200141046a2802002104200220034104106d20022802002205200228020822036a20043600002002200341046a2203360208200141086a22012006470d000b0b200041202005200310b30102402002280204450d00200510260b200241106a24000f0b1034000b1033000b8e0401037f2001200041b0026a109f0120002d00ec0221022001200141086a22032802004101106d2001280200200328020022046a20023a00002003200441016a360200200020011099042001200041bc026a1099010240024020002d00c8024101460d00200120032802004101106d2001280200200328020022026a41003a00002003200241016a2202360200200041c9026a2d0000220341024b0d0102400240024020030e03000102000b200120024101106d2001280200200141086a220128020022036a41003a00002001200341016a3602000f0b200120024101106d2001280200200141086a220328020022026a41013a00002003200241016a2202360200200120024120106d2001280200200328020022026a2201200041ca026a290000370000200141186a200041e2026a290000370000200141106a200041da026a290000370000200141086a200041d2026a2900003700002003200241206a3602000f0b200120024101106d2001280200200141086a220128020022036a41023a00002001200341016a3602000f0b200120032802004101106d2001280200200328020022026a41013a00002003200241016a2202360200200120024101106d2001280200200328020022026a41003a00002003200241016a2202360200200041cc026a2802002100200120024104106d2001280200200328020022016a20003600002003200141046a3602000b0b31002001ad4220862000ad84200235020842208620022802002200ad84101a0240200241046a280200450d00200010260b0b97640a017f017e017f017e037f027e037f047e037f097e230041d0096b2206240002400240024002400240024002400240024002400240024002400240024002400240200129032022074202520d0020022003200510eb03220841ff01714102470d0b42002109200641d8026a41086a220a4200370300200641d8026a41106a220b4200370300200641d8026a41186a220c4200370300200642003703d8022001280250417f6a220841094b0d0620080e0a01060606060606060203010b200641d8026a41186a200141186a290000370300200641d8026a41106a200141106a290000370300200641d8026a41086a200141086a290000370300200620012900003703d802200141c0006a290300210d200141386a2903002109200141c8006a28020021082001290328210e200641c0066a41186a220f4200370300200641c0066a41106a22104200370300200641c0066a41086a220a4200370300200642003703c00620064188036a41808cc700410610fb01200a20064188036a41086a221129000037030020062006290088033703c00620064188036a41ea93c400410610fb01200f2011290000370300201020062900880337030020064190026a200641c0066a4120108902024020074201520d00200e4200510d090b200641f0086a200641d8026a10d803200641c0066a20062802f008220a20062802f80810d9032011201029030037030020064188036a41106a200f29030037030020064188036a41186a200641c0066a41206a29030037030020064188036a41206a200641c0066a41286a29030037030020064188036a41286a220f200641c0066a41306a29030037030020064188036a41306a2211200641c0066a41386a29030037030020064188036a41386a200641c0066a41c0006a290300370300200620062903c806370388030240024020062903c0064201510d00200641b8066a420037030020064180066a41306a420037030020064180066a41286a4200370300200641a0066a420037030020064198066a420037030020064190066a420037030020064188066a420037030020064200370380064100210f410021110c010b20064180066a41086a20064188036a41086a29030037030020064180066a41106a20064188036a41106a29030037030020064180066a41186a20064188036a41186a29030037030020064180066a41206a20064188036a41206a29030037030020064180066a41286a200f29030037030020064180066a41306a201129030037030020064180066a41386a20064188036a41386a29030037030020062006290388033703800620064188076a280200210f200628028c0721110b024020062802f408450d00200a10260b0240200f2008470d00200641c0066a41386a20064180066a41386a290300370300200641c0066a41306a20064180066a41306a290300370300200641c0066a41286a20064180066a41286a290300370300200641c0066a41206a20064180066a41206a290300370300200641c0066a41186a20064180066a41186a290300370300200641c0066a41106a20064180066a41106a290300370300200641c0066a41086a20064180066a41086a29030037030020062006290380063703c00620062011360284072006200841016a220f36028007200641f0086a200641d8026a10d80320062802f808210a20062802f00821082006410036029003200642013703880320064188036a41004104106d200628028803200628029003220b6a200f3600002006200b41046a220f3602900320064188036a200f4101106d200628028803200628029003220f6a20113a00002006200f41016a3602900320064188036a200641c0066a10a6012008200a200628028803220f20062802900310b3010240200628028c03450d00200f10260b024020062802f408450d00200810260b4180122108200341ff01714102460d0e20022003200510eb03220841ff01714102470d0e20064180026a200520022009200d200441ff017141004710ec0302400240024002400240024002400240200629038002221220064180026a41086a29030022138450450d00420021140c010b200641003a009802200620133703f808200620123703f008410121082006410141112009200d84501b3a00c0092006200641d8026a3602b8022006200641d8026a3602e0052006200641e0056a3602d0062006200641c0096a3602cc062006200641b8026a3602c806200620064198026a3602c4062006200641f0086a3602c00620064188036a200641d8026a200641c0066a10ed03024002402006280288034101470d004200210e20062903900321070c010b200641b0036a290300210e200641a8036a2903002107410021082006290390034201520d0020064188036a41106a290300211520062802e005210f200641f8066a20064188036a41186a290300370300200641f0066a201537030041002108200641c0066a41086a41003a0000200641c9066a200f290000370000200641d1066a200f41086a290000370000200641d9066a200f41106a290000370000200641e1066a200f41186a290000370000200641023a00c006200641c0066a1087020b4201211420080d010b20064180066a41186a200641d8026a41186a29030037030020064180066a41106a200641d8026a41106a29030037030020064180066a41086a200641d8026a41086a290300370300200620062903d80237038006200641c0066a200141d0006a221110a80220062d00c0064101460d01200641ec066a280200210c200641e8066a280200210a200641e4066a2802002116200641dc066a280200210b200641c0066a41186a28020021170240200641e0066a2802002208450d002008410c6c210f2017210803400240200841046a280200450d00200828020010260b2008410c6a2108200f41746a220f0d000b0b0240200b450d00200b410c6c450d00201710260b0240200c450d00200c410c6c210f2016210803400240200841046a280200450d00200828020010260b2008410c6a2108200f41746a220f0d000b0b200a450d02200a410c6c450d02201610260c020b41800221080c130b20062d00c10622084102470d010b200641c0066a201110ee0320062d00c0064101460d01200641ec066a280200210a200641e8066a280200210f200641e4066a280200210b200641dc066a2802002111200641d8066a280200210c0240200641e0066a2802002208450d002008410c6c2110200c210803400240200841046a280200450d00200828020010260b2008410c6a2108201041746a22100d000b0b02402011450d002011410c6c450d00200c10260b0240200a450d00200a410c6c2110200b210803400240200841046a280200450d00200828020010260b2008410c6a2108201041746a22100d000b0b200f450d02200f410c6c450d02200b10260c020b20062f01c206410874210f02402014500d00200641d8066a22044200370300200641c0066a41106a220a4200370300200641c0066a41086a22034200370300200642003703c00620064188036a419a8cc700410810fb01200320064188036a41086a220529000037030020062006290088033703c00620064188036a41b8a1c300410d10fb01201041086a220b20052900003700002010200629008803370000200641e8016a200641c0066a108d02200641e8016a41106a290300210220062903f001210920062802e801211120044200370300200a420037030020034200370300200642003703c00620064188036a419a8cc700410810fb012003200529000037030020062006290088033703c00620064188036a41b8a1c300410d10fb01200b20052900003700002010200629008803370000200642002002420020111b2202200e7d2009420020111b2209200754ad7d220d200920077d2207200956200d200256200d2002511b22031b3703900320064200200720031b37038803200641c0066a412020064188036a411010b3010b200f20087221080c100b20062d00c10622084102470d0e0b20064190096a41186a20064180066a41186a29030037030020064190096a41106a20064180066a41106a29030037030020064190096a41086a20064180066a41086a290300370300200641b8056a41086a200641d8026a41086a290300370300200641b8056a41106a200641d8026a41106a290300370300200641b8056a41186a200641d8026a41186a290300370300200620062903800637039009200620062903d8023703b8054101210c0c0c0b418006418004200f20084b1b21080c0d0b4100211041002108200141d8006a2802004102470d06200641c0066a410c6a2210200141e0026a290200370200200641d4066a200141e8026a290200370200200641dc066a200141f0026a290200370200200641e2c289ab063602c0062006200141d8026a2902003702c406200141dc006a280200210820064198026a200141e0006a10ca01200641b8026a410c6a20064198026a41086a280200360200200620083602b80220062006290398023702bc022006200141ec006a2802003602c80220064188036a200641c0066a200641b8026a10ef0320062d0088034101470d0520064180066a41166a2208200641a1036a29000037010020064180066a41106a220f2006419b036a290000370300200641f0086a41086a221120064193036a290000370300200641f0086a41106a2216200f290300370300200641f0086a41166a220f20082901003701002006200629008b033703f00820062f0089032108200641e0056a41166a2217200f290100370100200641e0056a41106a220f2016290300370300200641e0056a41086a22162011290300370300200620062903f0083703e005200620083b0180062006418a066a201629030037010020064192066a200f29030037010020064198066a2017290100370000200620062903e0053701820641002108034020084120460d0341081024220f450d09200642083702c4062006200f3602c00620012903702107200641c0066a41004108106d20062802c006221120062802c806220f6a20073700002010410029009dd541370000201041086a41002900a5d541370000200620064180066a20086a3602dc062006200f41086a3602c80620064188036a200641c0066a109401024020062802c406450d00201110260b200641c0066a20064188036a10fe02200641c0016a20062802c006221120062802c80641d4c0c7004100410010810220062802c001210f024020062802c406450d00201110260b200841206a2108200f4101460d000b410221100c030b4100211041002108200141d8006a2802004102470d05200641c0066a410c6a2210200141d8026a290000370200200641d4066a200141e0026a290000370200200641dc066a200141e8026a290000370200200641e7e485f3063602c0062006200141d0026a2900003702c406200141dc006a280200210820064198026a200141e0006a10ca01200641b8026a410c6a20064198026a41086a280200360200200620083602b80220062006290398023702bc022006200141ec006a2802003602c80220064188036a200641c0066a200641b8026a10ef0320062d0088034101470d0420064180066a41166a2208200641a1036a29000037010020064180066a41106a220f2006419b036a290000370300200641f0086a41086a221120064193036a290000370300200641f0086a41106a2216200f290300370300200641f0086a41166a220f20082901003701002006200629008b033703f00820062f0089032108200641e0056a41166a2217200f290100370100200641e0056a41106a220f2016290300370300200641e0056a41086a22162011290300370300200620062903f0083703e00520014180016a2903002107200141f0006a290300210d200620083b0180062006418a066a201629030037010020064192066a200f29030037010020064198066a2017290100370000200620062903e0053701820641002108034020084120460d02200641003602c806200642013703c006200641c0066a41004108106d20062802c00620062802c806220f6a200d3700002006200f41086a220f3602c806200641c0066a200f4108106d20062802c006221120062802c806220f6a2007370000201041002900fdd441370000201041086a4100290085d541370000200620064180066a20086a3602dc062006200f41086a3602c80620064188036a200641c0066a109401024020062802c406450d00201110260b200641c0066a20064188036a10fe02200641c8016a20062802c006221120062802c80641d4c0c7004100410010810220062802c801210f024020062802c406450d00201110260b200841206a2108200f4101460d000b410221100c020b200641c0066a200141d4006a10f003024020062d00c0064101460d00200641ec066a2802002116200641e8066a280200210f200641e4066a2802002117200641dc066a2802002111200641d8066a28020021180240200641e0066a2802002208450d002008410c6c21102018210803400240200841046a280200450d00200828020010260b2008410c6a2108201041746a22100d000b0b02402011450d002011410c6c450d00201810260b02402016450d002016410c6c21102017210803400240200841046a280200450d00200828020010260b2008410c6a2108201041746a22100d000b0b200f450d03200f410c6c450d03201710260c030b20062d00c10622104102460d0220062f01c20621080c040b410021100b4103210820104102470d020b20064190096a41186a200c29030037030020064190096a41106a200b29030037030020064190096a41086a200a290300370300200620062903d802370390094100210c4200210d4200211442002112420021130c050b41042108410021100b200041013a0000200041036a20084108763a0000200020084108742010723b00010c060b41f0afc7004119418cb0c700102f000b1033000b200020083b0001200041013a0000200041036a20084110763a00000c030b20064198026a41186a2208200641b8056a41186a221029030037030020064198026a41106a220f200641b8056a41106a221129030037030020064198026a41086a220a200641b8056a41086a220b290300370300200620062903b80537039802200641b8026a41186a20064190096a41186a290300370300200641b8026a41106a20064190096a41106a290300370300200641b8026a41086a20064190096a41086a29030037030020062006290390093703b80220064188036a200141d0006a41b00210cf061a200641c0066a41186a22012008290300370300200641c0066a41106a2208200f290300370300200641c0066a41086a2216200a29030037030020062006290398023703c0064102210f0240200c450d0020064180066a41186a200129030037030020064180066a41106a200829030037030020064180066a41086a2016290300370300200620062903c006370380064101210f0b200b20064180066a41086a290300370300201120064180066a41106a290300370300201020064180066a41186a29030037030020062006290380063703b8050240411010242208450d00200841b889c70036020c200841013602082008428180808010370200411010242201450d00200141d089c70036020c20014101360208200142818080801037020020082008280200417f6a2210360200024020100d002008280208200828020c2802001103000240200828020c280204450d00200828020810260b20082008280204417f6a221036020420100d00200810260b02400240200128020820064188036a200128020c28020c110100450d00200641c0066a20064188036a41b00210cf061a2006418a066a200641c0056a29030037010020064192066a200641c8056a2903003701002006419a066a200641d0056a290300370100200641a2066a200641d8056a2f01003b01002006200f3a008106200641003a008006200620062903b80537018206200620013602a406200641d8026a200641c0066a20064180066a10a30320062903d80221190c010b200641f8026a41023a0000200641f0026a41003a000020012001280200417f6a2208360200200642003703e00242012119200642013703d802024020080d002001280208200128020c2802001103000240200128020c280204450d00200128020810260b20012001280204417f6a220836020420080d00200110260b20064188036a1098030b200641d8026a41106a2903002115200641d8026a41186a2d0000210120062903e002211a200641e0056a41186a200641b8026a41186a290300370300200641e0056a41106a200641b8026a41106a290300370300200641e0056a41086a200641b8026a41086a290300370300200620062903b8023703e0050240024002400240024002400240024002400240024002400240024002402019500d00201a4202510d01200341ff01714102470d00200641f8026a2d000022084104460d0020064180036a2802002103200641fc026a280200210120063100fa02210220063100f902210941dff1c600410e1084024198b2c700410d10840202400240024020080e0400010205000b200120031084020c0f0b418ab2c700410e1084020c0e0b4180b2c700410a1084020c0d0b201520025a0d00201a4201520d00200641d8066a22084200370300200641c0066a41106a22104200370300200641c0066a41086a220f4200370300200642003703c006200641b8056a41808cc700410610fb01200f200641b8056a41086a2211290000370300200620062900b8053703c006200641b8056a41b8bbc400410b10fb0120082011290000370300201020062900b80537030020064188036a200641c0066a108f0220062006290390034200200629038803420151220a1b37038006200620064188036a41106a220b2903004200200a1b3703900920064190096a20064180066a200341ff01714101461b22034200200329030022194200200220157d221b201b2002561b7d221b201b2019561b370300200b20062903900937030020062006290380063703900320064201370388032008420037030020104200370300200f4200370300200642003703c006200641b8056a41808cc700410610fb01200f2011290000370300200620062900b8053703c006200641b8056a41b8bbc400410b10fb0120082011290000370300201020062900b805370300200641c0066a20064188036a41086a10f1030b200641f0086a41186a200641e0056a41186a290300370300200641f0086a41106a200641e0056a41106a290300370300200641f0086a41086a200641e0056a41086a290300370300200620062903e0053703f0082014500d0920064198016a20052002201520152002561b2002201a4201511b2009200d200441ff0171410146200141ff01714101467210ec034200210202402012200629039801221a58201320064198016a41086a29030022155820132015511b450d00420021130c050b4200201320157d2012201a54ad7d22022012201a7d2215201256200220135620022013511b22011b21134200201520011b210220064190096a200641f0086a10d80320064188036a2006280290092208200628029809220110d9032006290388032115200642003703880320154201520d010240200629039003221220027c22142012542203200629039803221a20137c2003ad7c2212201a542012201a511b450d00200641c0066a410310eb020c030b200641c0036a290300211b200641b8036a290300211c200641a8036a290300211a200641a0036a2903002119200641a0066a200641b0036a290300370300200641a8066a201c370300200641b0066a201b3703002006201a3703980620062014370380062006201237038806200620193703900602400240427f201420197c221b201b20145422032012201a7c2003ad7c221b201254201b2012511b22031b221c4280c8afa025544100427f201b20031b221b501b0d0020064190066a2903002112200629038806211a2006290380062114420121190c010b0240024020142019842012201a848450450d00420021190c010b42002119200641c0066a41186a22054200370300200641c0066a41106a22104200370300200641c0066a41086a22034200370300200642003703c006200641b8056a419a8cc700410810fb012003200641b8056a41086a220f290000370300200620062900b8053703c006200641b8056a41b8a1c300410d10fb012005200f290000370300201020062900b80537030020064180016a200641c0066a108d0220064180016a41106a2903002112200629038801211a2006280280012111200542003703002010420037030020034200370300200642003703c006200641b8056a419a8cc700410810fb012003200f290000370300200620062900b8053703c006200641b8056a41b8a1c300410d10fb012005200f290000370300201020062900b805370300200642002012420020111b2212201b7d201a420020111b221a201c54ad7d2214201a201c7d221d201a56201420125620142012511b22051b3703c00520064200201d20051b3703b805200641c0066a4120200641b8056a411010b301200641f8066a201b370300200641f0066a201c370300200341013a0000200641c9066a20062903f008370000200641d1066a200641f0086a41086a290300370000200641d9066a200641f0086a41106a290300370000200641e1066a200641f0086a41186a290300370000200641023a00c006200641c0066a1087020b0b2015420151210520064198036a201a370300200641a0036a20123703002006201437039003200620194201512203ad37038803024020030d002008200110ff0141002103410021010c040b2008200120064190036a10da0341002101410121030c030b200910f203200210f20320010d090c0a0b200641c0066a410810eb020b20062902c4062215420888a721032015a72105410121010b0240200628029409450d00200810260b20010d0102400240200541ff017122010d00200341ff01710d010b2001450d01200341ff01710d01200641c0066a41086a41043a0000200641c9066a20062903f008370000200641d1066a200641f0086a41086a290300370000200641d9066a20064180096a290300370000200641e1066a20064188096a290300370000200641003a00c006200641c0066a1087020c010b200641c0066a41086a41033a0000200641c9066a20062903f008370000200641d1066a200641f0086a41086a290300370000200641d9066a20064180096a290300370000200641e1066a20064188096a290300370000200641003a00c006200641c0066a1087020b200e20137d20072002542201ad7d2013200e7d2002200754ad7d200720025a200e20135a200e20135122081b22031b2115200720027d200220077d20031b21072001200e20135420081b0d012015210e0b02402007200920072007200956200e200d56200e200d511b22011b22027d2213200284200e200d200e20011b22097d2007200254ad7d2202200984844200520d00200641d8066a22014200370300200641c0066a41106a22084200370300200641c0066a41086a22034200370300200642003703c006200641b8056a419a8cc700410810fb012003200641b8056a41086a2205290000370300200620062900b8053703c006200641b8056a41b8a1c300410d10fb0120012005290000370300200820062900b805370300200641086a200641c0066a108d02200641086a41106a29030021022006290310210720062802082110200142003703002008420037030020034200370300200642003703c006200641b8056a419a8cc700410810fb0120032005290000370300200620062900b8053703c006200641b8056a41b8a1c300410d10fb0120012005290000370300200820062900b80537030020062002420020101b3703900320062007420020101b37038803200641c0066a412020064188036a411010b3010c040b427f200220097c20072013542201ad7c22092001200920025420092002511b22011b2102427f200720011b210720064190096a10b603200641b8056a10b603200641b0096a200641b8056a10d80320064188036a20062802b009220320062802b809221010d903200629038803210e2006420037038803200641d0036a280200210f20062d00d40321110240200e4201520d00200641a0036a290300211420062903980321132006290390032109200641c0036a2903002119200641b8036a290300211b200641b0036a290300211c20062903a803211220062903c803211d0c020b4100210142002109024020074280c8afa0255441002002501b0d0042002113420021144200211d420021124200211c4200211b420021190c020b410121054200211a410021080c020b200641d8066a22014200370300200641c0066a41106a22084200370300200641c0066a41086a22034200370300200642003703c006200641b8056a419a8cc700410810fb012003200641b8056a41086a2205290000370300200620062900b8053703c006200641b8056a41b8a1c300410d10fb0120012005290000370300200820062900b805370300200641e8006a200641c0066a108d02200641e8006a41106a29030021022006290370210920062802682110200142003703002008420037030020034200370300200642003703c006200641b8056a419a8cc700410810fb0120032005290000370300200620062900b8053703c006200641b8056a41b8a1c300410d10fb0120012005290000370300200820062900b8053703002006427f2002420020101b220220157c2009420020101b220920077c220d2009542201ad7c22072001200720025420072002511b22011b370390032006427f200d20011b37038803200641c0066a412020064188036a411010b30141800221010c050b4200211a0240200920077c22152009542201201320027c2001ad7c220d201354200d2013511b450d00410121054100210142002109410021080c010b200641a0066a201c370300200641a8066a201b370300200641b0066a20193703002006201237039806200620153703800620062014370390062006200d3703880602400240427f201520147c220920092015542201200d20127c2001ad7c2209200d542009200d511b22011b22134280c8afa025544100427f200920011b2209501b0d0020064190066a2903002109200629038806211320062903800621144201211e0c010b024002402015201484200d2012848450450d004200211e0c010b4200211e200641c0066a41186a22084200370300200641c0066a41106a22054200370300200641c0066a41086a22014200370300200642003703c006200641c0096a419a8cc700410810fb012001200641c0096a41086a2204290000370300200620062900c0093703c006200641c0096a41b8a1c300410d10fb0120082004290000370300200520062900c009370300200641d0006a200641c0066a108d02200641d0006a41106a29030021142006290358211f2006280250210a200842003703002005420037030020014200370300200642003703c006200641c0096a419a8cc700410810fb0120012004290000370300200620062900c0093703c006200641c0096a41b8a1c300410d10fb0120082004290000370300200520062900c0093703002006420020144200200a1b221420097d201f4200200a1b221f201354ad7d2220201f20137d2221201f56202020145620202014511b22081b3703c80920064200202120081b3703c009200641c0066a4120200641c0096a411010b301200641f8066a2009370300200641f0066a2013370300200141013a0000200641c9066a20062903b805370000200641d1066a200641b8056a41086a290300370000200641d9066a200641b8056a41106a290300370000200641e1066a200641b8056a41186a290300370000200641023a00c006200641c0066a1087020b0b200e4201512108200641b0036a201c370300200641b8036a201b37030020064198036a2013370300200641c0036a2019370300200641a0036a2009370300200620123703a8032006201d3703c803200620143703900341002105200620114100200e42015122011b3a00d4032006200f410020011b3602d0032006201e4201512201ad37038803200e420152ad4230862109024020010d002003201010ff01410021010c010b2003201020064190036a10da03410121010b024020062802b409450d00200310260b0240024002400240024020050d0002402001450d002008450d020b20010d022008450d02200641c0066a41086a41043a0000200641c9066a20062903b805370000200641d1066a200641b8056a41086a290300370000200641d9066a200641c8056a290300370000200641e1066a200641d0056a290300370000200641003a00c006200641c0066a1087020c020b20072001ad4208862009421086842008ad84220d7d200d20077d2007200d5a2002201a42108620094230888442ffffffffffff3f8322095a200220095122011b22081b210e200220097d2007200d542203ad7d200920027d200d200754ad7d20081b21132003200220095420011b450d02200641d8066a22014200370300200641c0066a41106a22084200370300200641c0066a41086a22034200370300200642003703c006200641c0096a419a8cc700410810fb012003200641c0096a41086a2205290000370300200620062900c0093703c006200641c0096a41b8a1c300410d10fb0120012005290000370300200820062900c009370300200641386a200641c0066a108d02200641386a41106a29030021092006290340210d20062802382110200142003703002008420037030020034200370300200642003703c006200641c0096a419a8cc700410810fb0120032005290000370300200620062900c0093703c006200641c0096a41b8a1c300410d10fb0120012005290000370300200820062900c0093703002006427f2009420020101b220920137c200d420020101b220d200e7c220e200d542201ad7c220d2001200d200954200d2009511b22011b370390032006427f200e20011b37038803200641c0066a412020064188036a411010b3010c030b200641c0066a41086a41033a0000200641c9066a20062903b805370000200641d1066a200641b8056a41086a290300370000200641d9066a200641c8056a290300370000200641e1066a200641d0056a290300370000200641003a00c006200641c0066a1087020b4200210e42002113200942808080808080c00085201a42ffffffffffff3f83844200520d00200641f8066a200d370300200641f0066a2015370300200641c0066a41086a41003a0000200641c9066a20062903b805370000200641d1066a200641b8056a41086a290300370000200641d9066a200641c8056a290300370000200641e1066a200641d0056a290300370000200641023a00c006200641c0066a1087024200210e420021130b200641d8066a22014200370300200641c0066a41106a22084200370300200641c0066a41086a22034200370300200642003703c006200641c0096a419a8cc700410810fb012003200641c0096a41086a2205290000370300200620062900c0093703c006200641c0096a41b8a1c300410d10fb0120012005290000370300200820062900c009370300200641206a200641c0066a108d02200641206a41106a29030021092006290328210d20062802202110200142003703002008420037030020034200370300200642003703c006200641c0096a419a8cc700410810fb0120032005290000370300200620062900c0093703c006200641c0096a41b8a1c300410d10fb0120012005290000370300200820062900c009370300200642002009420020101b220920137d200d420020101b220d200e54ad7d2213200d200e7d220e200d56201320095620132009511b22011b3703900320064200200e20011b37038803200641c0066a412020064188036a411010b3010b200641f8066a2002370300200641f0066a2007370300200641c0066a41086a41043a0000200641c9066a200629039009370000200641d1066a20064190096a41086a290300370000200641d9066a200641a0096a290300370000200641e1066a200641a8096a290300370000200641023a00c006200641c0066a1087020b200041086a20062903d802370300200041003a0000200041306a200641d8026a41286a290300370300200041286a200641d8026a41206a290300370300200041206a200641d8026a41186a290300370300200041186a200641d8026a41106a290300370300200041106a200641d8026a41086a290300370300200641d0096a24000f0b200120031084020b41801021012014500d00200641d8066a22084200370300200641c0066a41106a22034200370300200641c0066a41086a22054200370300200642003703c006200641b8056a419a8cc700410810fb012005200641b8056a41086a2210290000370300200620062900b8053703c006200641b8056a41b8a1c300410d10fb0120082010290000370300200320062900b805370300200641a8016a200641c0066a108d02200641a8016a41106a290300210220062903b001210920062802a801210f200842003703002003420037030020054200370300200642003703c006200641b8056a419a8cc700410810fb0120052010290000370300200620062900b8053703c006200641b8056a41b8a1c300410d10fb0120082010290000370300200320062900b8053703002006420020024200200f1b2202200e7d20094200200f1b2209200754ad7d220d200920077d2207200956200d200256200d2002511b22081b3703900320064200200720081b37038803200641c0066a412020064188036a411010b3010b200020013b0001200041013a0000200041036a41003a00000c040b102c000b20062f01c206410874210f02402014500d00200641d8066a22044200370300200641c0066a41106a220a4200370300200641c0066a41086a22034200370300200642003703c00620064188036a419a8cc700410810fb01200320064188036a41086a220529000037030020062006290088033703c00620064188036a41b8a1c300410d10fb01201041086a220b20052900003700002010200629008803370000200641d0016a200641c0066a108d02200641d0016a41106a290300210220062903d801210920062802d001211120044200370300200a420037030020034200370300200642003703c00620064188036a419a8cc700410810fb012003200529000037030020062006290088033703c00620064188036a41b8a1c300410d10fb01200b20052900003700002010200629008803370000200642002002420020111b2202200e7d2009420020111b2209200754ad7d220d200920077d2207200956200d200256200d2002511b22031b3703900320064200200720031b37038803200641c0066a412020064188036a411010b3010b200f20087221080b200020083b0001200041013a0000200041036a20084110763a00000b200141d0006a1098030b200641d0096a24000bda0702077f037e230041c0006b22032400200341206a22044200370300200341086a41106a22054200370300200341086a41086a2206420037030020034200370308200341286a41808cc700410610fb012006200341286a41086a220729000037030020032003290028370308200341286a41f4bbc400411010fb0120042007290000370300200520032900283703002003200341086a412010890241800c21080240417f2003280204410020032802001b220920026a220220022009491b2202418080c002418080f001200141ff017122011b4b0d0020044200370300200542003703002006420037030020034200370308200341286a41808cc700410610fb012006200729000037030020032003290028370308200341286a41b8bbc400410b10fb01200541086a200729000037000020052003290028370000200341286a200341086a108f0220032903304200200329032842015122061b210a200341286a41106a290300420020061b210b024002400240024020010e03010002010b200042c0b2cd3b7c220c2000540d03200b200c7c220c200b540d03427f200a200c7c220b200b200a541b4280c0a8ca9a3a56200c428090cad2c60e56710d03200c210b200a210c427f200042c0b2cd3b7c220a200a2000541b4281dc90fa873a5a0d030c020b200042c0b2cd3b7c220c2000540d02200a200c7c220c200a540d02200c4280b0def7d32b560d02427f200042c0b2cd3b7c220a200a2000541b428090a7f0ea25580d010c020b427f200a427f200042c0b2cd3b7c220c200c2000541b7c22002000200a541b210c0b200341206a22044200370300200341086a41106a22084200370300200341086a41086a2206420037030020034200370308200341286a41808cc700410610fb012006200341286a41086a220729000037030020032003290028370308200341286a41f4bbc400411010fb01200541086a220120072900003700002005200329002837000020032002360228200341086a4120200341286a410410b30120044200370300200842003703002006420037030020034200370308200341286a41808cc700410610fb012006200729000037030020032003290028370308200341286a41b8bbc400410b10fb0120012007290000370000200520032900283700002003410036023020034201370328200341286a41004108106d2003280228200328023022056a200c3700002003200541086a2205360230200341286a20054108106d20032802282205200328023022066a200b3700002003200641086a2206360230200341086a41202005200610b3010240200328022c450d00200510260b41820c21080b200341c0006a240020080b860404017f017e027f037e23004180016b22062400024020050d00200641c0006a200210ea04200641c0006a41086a290300210220062903402107200641e8006a22084200370300200641d0006a41106a22054200370300200641d0006a41086a2209420037030020064200370350200641d0006a41cca3c700411210fb01200641f0006a41f4b1c500411110fb012008200641f0006a41086a29000037030020052006290070370300200641286a200641d0006a108d02200641d0006a200629033042808090bbbad6adf00d200628022822081b200641286a41106a290300420020081b2007200242808090bbbad6adf00d4200108e02200641186a2001ad42004280c2d72f420010cc06200641186a41086a29030021072006290318210a0240024020062802504101470d00427f210b427f210c0c010b2005290300210c2009290300210b0b200641086a42c0b2cd3b10ea04427f427f427f200641106a290300220220077c20062903082207200a7c220a2007542205ad7c22072005200720025420072002511b22051b2202200c7c427f200a20051b2207200b7c220a2007542205ad7c22072005200720025420072002511b22051b220220047c427f200a20051b220420037c22072004542205ad7c22032005200320025420032002511b22051b2104427f200720051b21030b200020033703002000200437030820064180016a24000ba01006077f027e037f0d7e017f027e230041c0026b2203240020022802102104200228020c2105200228020821062002280204210720022802002102200341186a200110d803200341286a200328021822082003280220220910d9032003290328210a4200210b20034200370328200341f0006a280200210c20032d0074210d02400240200a420152220e450d004200210f420021104200211142002112420021134200211442002115420021160c010b200341e0006a2903002114200341d8006a2903002113200341d0006a2903002112200341c8006a290300210f200341c0006a29030021102003290338211620032903302115200341e8006a29030021114200210b0b0240024002400240024002400240024002402015200229030022177d22182015562016200241086a29030022197d2015201754ad7d221a201656201a2016511b0d00024020182010200b8422107c221b42ffc7afa02556201a200b200f84220f7c201b201854221cad7c220b420052200b501b0d00201520107c221d4280c8afa0255441002016200f7c201d201554ad7c501b0d0020072d00004101470d060b2017201984500d0420052d00002105200341f8006a200628020010d803200341b0016a2003280278220620032802800110d90320032903b0014201512107200341e0016a2903002115200341d8016a2903002116200341f0016a2903002119200341e8016a290300211d0240200328027c450d00200610260b2015420020071b21172016420020071b211e2019420020071b2115201d420020071b211641004102410120054101711b200541ff01714101461b0e03030201030b200341b0016a410410eb020c050b20172015201e201656201720155620172015511b22071b2115201e201620071b21160c010b201e2116201721150b20162018562015201a562015201a511b450d00200341b0026a410210eb0220032d00b00222074104460d0020032902b402211520032f00b10220032d00b30241107472410874200772210d0c030b200241086a29030021162002290300211520042802002102200341a8016a22072014370300200341a0016a22052013370300200320103703880120034190016a200f3703002003201237039801200320183703782003201a3703800102400240427f201b201c200b201a54200b201a511b22041b22174280c8afa025544100427f200b20041b220b501b0d0020034188016a29030021172007290300210f2005290300211020034198016a290300211920032903800121122003290378211342012114200329039001211b0c010b024002402018201084201a200f848450450d00420021140c010b42002114200341b0016a41186a22074200370300200341b0016a41106a22054200370300200341b0016a41086a22044200370300200342003703b001200341b0026a419a8cc700410810fb012004200341b0026a41086a2206290000370300200320032900b0023703b001200341b0026a41b8a1c300410d10fb0120072006290000370300200520032900b0023703002003200341b0016a108d02200341106a290300210f200329030821102003280200211c200742003703002005420037030020044200370300200342003703b001200341b0026a419a8cc700410810fb0120042006290000370300200320032900b0023703b001200341b0026a41b8a1c300410d10fb0120072006290000370300200520032900b00237030020034200200f4200201c1b220f200b7d20104200201c1b2210201754ad7d2219201020177d22122010562019200f562019200f511b22071b3703b80220034200201220071b3703b002200341b0016a4120200341b0026a411010b301200341e8016a200b370300200341e0016a2017370300200441013a0000200341b9016a2002290000370000200341c1016a200241086a290000370000200341c9016a200241106a290000370000200341d1016a200241186a290000370000200341023a00b001200341b0016a1087020b0b200a4201512102200ead210b200341d0006a2019370300200341e8006a2011370300200341d8006a2010370300200341386a2012370300200341e0006a200f370300200341c0006a20173703002003201b37034820032013370330410021042003200d4100200a420151220e1b3a00742003200c4100200e1b36027020032014420151220cad37032802400240200c0d002008200910ff014200210a4100210c0c010b20082009200341306a10da034200210a4101210c0b0c030b200341b0016a410610eb020b20032902b401211520032802b001210d0b20154280807c83210a2015420888a7210c2015a72102410121040b0240200328021c450d00200810260b024002402004450d002000200d36020420004101360200200041086a200cad42ff01834208862002ad42ff018384200a843702000c010b024002400240200c41ff01712204450d00200241ff0171450d010b20040d01200241ff0171450d01200341b0016a41086a41043a0000200341b9016a2001290000370000200341c1016a200141086a290000370000200341c9016a200141106a290000370000200341d1016a200141186a290000370000200341003a00b001200341b0016a1087020c010b200341b0016a41086a41033a0000200341b9016a2001290000370000200341c1016a200141086a290000370000200341c9016a200141106a290000370000200341d1016a200141186a290000370000200341003a00b001200341b0016a1087020b20004100360200200041286a2016370300200041206a2015370300200041186a201a370300200041106a2018370300200041086a200b3703000b200341c0026a24000bb80403047f017e017f230041d0006b22022400024002400240024002402001280200410c470d00200141086a2d00004102470d00200241106a10ad03024002402001410c6a280200200141206a280200470d00200241386a22034200370300200241306a22044200370300200241206a41086a420037030020024200370320200241206a41eb8cc700410a10fb01200241c0006a41dc9dc600410b10fb012003200241c0006a41086a29000037030020042002290040370300200241c0006a200241206a10da0420022802402203410120031b210502402002290244420020031b2206422088a72204450d00200141c4006a2103200441057441606a41057641016a21074100210420052101034020032001460d0320012003412010d206450d03200141206a21012007200441016a2204470d000b0b200041800e3b0001200041013a0000200041036a41003a00000c040b20004180083b0001200041013a0000200041036a41003a00000c040b2002280218220120044d0d01200041800e3b0001200041013a0000200041036a41013a00000c020b200041003a0000200041306a41013a0000200041286a4200370300200041206a4280808080c000370300200041186a4204370300200041106a427f370300200041086a4200370300200041316a2002280009360000200041346a2002410c6a2800003600000c030b200420014184f4c4001032000b200642ffffff3f83500d00200510260b200228021441ffffff3f71450d00200228021010260b200241d0006a24000b9c0a03067f047e027f230041c0026b2203240020012800002104200341106a41186a2001411c6a290000370300200341106a41106a200141146a290000370300200341106a41086a2001410c6a2900003703002003200129000437031020022802002101200341e0016a41186a22054200370300200341e0016a41106a22064200370300200341e0016a41086a22074200370300200342003703e001200341e0016a41b48cc700410710fb01200341d0006a4184c1c200410c10fb012005200341d0006a41086a220829000037030020062003290050370300200341086a200341e0016a4120108902024002400240024002402001200328020c410020032802081b460d00200341d0006a200110fa032007200341d0006a410c6a2902003703002006200341d0006a41146a2902003703002005200341d0006a411c6a290200370300200320032902543703e00120032802504101470d01200341c0016a41086a2205200341e0016a41086a2903002209370300200341c0016a41106a2206200341e0016a41106a290300220a370300200341c0016a41186a2207200341e0016a41186a290300220b370300200320032903e001220c3703c001200341f4006a2802002101200341306a41186a2208200b370300200341306a41106a220d200a370300200341306a41086a220e20093703002003200c37033020012002280210470d02200720082903003703002006200d2903003703002005200e290300370300200320032903303703c0012002410c6a280200210720022802042108200341e0016a10fb0302402007450d0020082007410c6c6a210541002802cc9f40210641002902c49f402109200821010340200341b0026a41086a2006360200200320093703b002200341d0006a200341e0016a200341b0026a2001280200200141086a28020010fc032001410c6a22012005470d000b0b200341d0006a200341e0016a41d00010cf061a200341b8016a200341d8016a290300370300200341b0016a200341d0016a290300370300200341a8016a200341c0016a41086a290300370300200320032903c0013703a0012000200341d0006a2004200341106a10fd03200341d0006a10fe0302402007450d002007410c6c21052008210103400240200141046a280200450d00200128020010260b2001410c6a2101200541746a22050d000b0b200241086a2802002201450d042001410c6c450d04200810260c040b20084120360200200320043602502003200341106a360254200341c0016a200341d0006a10bd03200341d0006a20032802c001220120032802c80110b80320032d00502105024020032802c401450d00200110260b200041003a00002002410c6a2802002101200241086a28020021062002280204210202400240200541ff01714101460d0002402001450d002001410c6c21052002210103400240200141046a280200450d00200128020010260b2001410c6a2101200541746a22050d000b0b2006450d052006410c6c0d010c050b02402001450d002001410c6c21052002210103400240200141046a280200450d00200128020010260b2001410c6a2101200541746a22050d000b0b2006450d042006410c6c450d040b200210260c030b200041003a00000c010b200041003a00000b2002280204210602402002410c6a2802002201450d002001410c6c21052006210103400240200141046a280200450d00200128020010260b2001410c6a2101200541746a22050d000b0b200241086a2802002201450d002001410c6c450d00200610260b200341c0026a24000bbd0e02087f017e23004190016b2202240020012802202103200241d8006a10ad0302400240024002400240024002400240200228026020034b0d00200228025c41ffffff3f71450d01200228025810260c010b20032002280258220420034105746a10ae0321030240200228025c41ffffff3f71450d00200410260b20030d010b200241f0006a22034200370300200241e8006a22044200370300200241d8006a41086a2205420037030020024200370358200241c0006a41b48cc700410710fb012005200241c0006a41086a220629000037030020022002290040370358200241c0006a4184c1c200410c10fb012003200629000037030020042002290040370300200241086a200241d8006a4120108902200128021c200228020c410020022802081b2205470d01200241106a10ac03200228021822032001280224470d022003200128022022044b0d0320004180083b0001200041013a0000200041036a410a3a00000c040b20004180063b0001200041013a0000200041036a410a3a00000c040b20004180063b0001200041013a0000200041036a410a3a00000c030b200041800e3b0001200041013a0000200041036a410a3a00000c010b200141286a21072002280210220820044105746a2106200241003602602002420137035820012802002103200241d8006a41004104106d2002280258200228026022046a20033600002002200441046a36026020012802042001410c6a280200200241d8006a109501200141106a2802002103200241d8006a200141186a280200220410a10102402004450d0020032004410c6c6a210403402003280200200341086a280200200241d8006a1095012003410c6a22032004470d000b0b200128021c2103200241d8006a20022802604104106d2002280258200228026022046a20033600002002200441046a220336026020012802202104200241d8006a20034104106d2002280258200228026022036a20043600002002200341046a220336026020012802242101200241d8006a20034104106d20022802582203200228026022046a20013600002002200441046a2201360260200720032001200610f50221010240200228025c450d00200310260b024002402001450d002002418c016a4108360200200241f8006a4200370300200241f0006a4280808080c000370300200241d18cc70036028801200241013a008001200242043703682002427f370360200242ffffffffffffffffff00370358411010242203450d01200242103702342002200336023020022802880121070240024002400240200228028c01220341c000490d00200341808001490d012003418080808004490d02200241306a41004101106d2002280230200228023822016a41033a00002002200141016a2201360238200241306a20014104106d2002280230200228023822016a20033600002002200141046a2209360238200241306a21010c030b200241306a41004101106d2002280230200228023822016a20034102743a00002002200141016a2209360238200241306a21010c020b200241306a41004102106d2002280230200228023822016a20034102744101723b00002002200141026a2209360238200241306a21010c010b200241306a41004104106d2002280230200228023822016a20034102744102723600002002200141046a2209360238200241306a21010b20024181016a2104200120092003106d2002280230200228023822096a2007200310cf061a2002200920036a2203360238200120034104106d2002280230200228023822036a20053600002002200341046a2203360238200120034120106d2002280230200228023822016a22032006290000370000200341186a200641186a290000370000200341106a200641106a290000370000200341086a200641086a2900003700002002200141206a3602380240200228027c22032002280278470d00200241f4006a2003410110cb01200228027c21030b20022802742003410c6c6a22032002290330370200200341086a200241306a41086a280200360200200241c0006a41086a2203200241d8006a41186a2903003703002002200228027c41016a36027c200241c0006a41106a2201200241d8006a41206a29030037030020022002290368370340200220042900003703302002200441076a2900003700372002290358210a200241d8006a41106a22042001290300370300200241d8006a41086a22012003290300370300200220022903403703582002200229003737002720022002290330370320200041106a42ac02370300200041086a200a370300200041306a41013a0000200041186a2002290358370300200041206a2001290300370300200041286a2004290300370300200041003a0000200041316a2002280220360000200041346a2002280023360000200228021441ffffff3f71450d03200810260c030b20004180083b0001200041013a0000200041036a410a3a00000c010b1033000b200228021441ffffff3f71450d00200228021010260b20024190016a24000b9c0103017f017e017f230041106b22022400200241003602082002420137030020012903002103200241004108106d2002280200200228020822046a20033700002002200441086a220436020820012903082103200220044108106d20022802002201200228020822046a20033700002002200441086a2204360208200041202001200410b30102402002280204450d00200110260b200241106a24000b06002000100d0b9c52040a7f057e017f017e23004180066b22072400024002400240024002400240024020012903204202520d00200741c0006a41206a22084200370300200741c0006a41186a22094280808080c000370300200741013a0068200742043703502007427f3703482007420037034020074180056a41206a220a420037030020074180056a41186a220b4280808080c000370300200741013a00a80520074204370390052007427f370388052007420037038005200741a8016a200741c0006a20074180056a10f403200741c0006a41286a220c200741a8016a41286a2903003703002008200741a8016a41206a2903003703002009200741a8016a41186a290300370300200741c0006a41106a220d200741a8016a41106a290300370300200741c0006a41086a220e200741a8016a41086a290300370300200720072903a801370340200a4200370300200b4280808080c000370300200741013a00a80520074204370390052007427f370388052007420037038005200741d8016a200741c0006a20074180056a10f403200c200741d8016a41286a2903003703002008200741d8016a41206a2903003703002009200741d8016a41186a290300370300200d200741d8016a41106a290300370300200e200741d8016a41086a290300370300200720072903d801370340200a4200370300200b4280808080c000370300200741013a00a80520074204370390052007427f37038805200742003703800520074188026a200741c0006a20074180056a10f403200c20074188026a41286a290300370300200820074188026a41206a290300370300200920074188026a41186a290300370300200d20074188026a41106a290300370300200e20074188026a41086a2903003703002007200729038802370340200a4200370300200b4280808080c000370300200741013a00a80520074204370390052007427f370388052007420037038005200741b8026a200741c0006a20074180056a10f403200c200741b8026a41286a2903003703002008200741b8026a41206a2903003703002009200741b8026a41186a290300370300200d200741b8026a41106a290300370300200e200741b8026a41086a290300370300200720072903b802370340200a4200370300200b4280808080c000370300200741013a00a80520074204370390052007427f370388052007420037038005200741e8026a200741c0006a20074180056a10f403200741a8046a41286a200741e8026a41286a290300370300200741a8046a41206a220f200741e8026a41206a290300370300200741a8046a41186a2205200741e8026a41186a290300370300200741a8046a41106a200741e8026a41106a290300370300200741a8046a41086a2210200741e8026a41086a290300370300200720072903e8023703a80420074180056a20032004200610f50320072d0080054101470d0120072d008305210a20072f008105210b20072802b8042109024020052802002201450d002001410c6c21082009210103400240200141046a280200450d00200128020010260b2001410c6a2101200841746a22080d000b0b0240200741bc046a2802002201450d002001410c6c450d00200910260b200a411074210a20072802c40421090240200741cc046a2802002201450d002001410c6c21082009210103400240200141046a280200450d00200128020010260b2001410c6a2101200841746a22080d000b0b200b200a7221010240200741c8046a2802002208450d002008410c6c450d00200910260b200041036a20014110763a0000200020013b0001200041013a00000c060b200741c0006a41206a22084200370300200741c0006a41186a22094280808080c000370300200741013a006820074204370350427f21112007427f3703482007420037034020074180056a41206a220a420037030020074180056a41186a220b4280808080c000370300200741013a00a80520074204370390052007427f370388052007420037038005200741f8006a200741c0006a20074180056a10f403200741c0006a41286a220c200741f8006a41286a2903003703002008200741f8006a41206a2903003703002009200741f8006a41186a290300370300200741c0006a41106a220d200741f8006a41106a290300370300200741c0006a41086a220e200741f8006a41086a29030037030020072007290378370340200a4200370300200b4280808080c000370300200741013a00a80520074204370390052007427f370388052007420037038005200741a8016a200741c0006a20074180056a10f403200c200741a8016a41286a2903003703002008200741a8016a41206a2903003703002009200741a8016a41186a290300370300200d200741a8016a41106a290300370300200e200741a8016a41086a290300370300200720072903a801370340200a4200370300200b4280808080c000370300200741013a00a80520074204370390052007427f370388052007420037038005200741d8016a200741c0006a20074180056a10f403200c200741d8016a41286a2903003703002008200741d8016a41206a2903003703002009200741d8016a41186a290300370300200d200741d8016a41106a290300370300200e200741d8016a41086a290300370300200720072903d801370340200741d8046a41186a22084200370300200741d8046a41106a220c4200370300200741d8046a41086a22094200370300200742003703d80420074180056a41808cc700410610fb01200920074180056a41086a220d29000037030020072007290080053703d80420074180056a41ea93c400410610fb012008200d290000370300200c200729008005370300200741286a200741d8046a4120108902200728022c410020072802281bad2112024020012903204201520d00200129032822114200510d02200141306a290300221320117c4200201220137d221320132012561b22137c20132011827d21110b200a4200370300200b4280808080c000370300200741ac056a200741ab046a280000360000200741013a00a80520074204370390052007420037038005200720072800a8043600a90520074200201120127d221220122011561b3703880520074188026a200741c0006a20074180056a10f403200741a8046a41286a20074188026a41286a290300370300200741a8046a41206a20074188026a41206a290300370300200741a8046a41186a20074188026a41186a290300370300200741a8046a41106a20074188026a41106a290300370300200741a8046a41086a20074188026a41086a29030037030020072007290388023703a804200741f8036a200110d80320074180056a20072802f803220920072802800410d903200741c8056a28020041002007290380054201511b2108024020072802fc03450d00200910260b02400240200128024822092008490d00410c1024220a450d044104210d41041024220b450d0520074204370284052007200b360280054100210e20074180056a41004120106d20072802800520072802880522026a220b2001290000370000200b41086a200141086a290000370000200b41106a200141106a290000370000200b41186a200141186a2900003700002007200241206a220b3602880520074180056a200b4104106d200728028005200728028805220b6a2009360000200a200729038005370200200a41086a200b41046a3602000240200820094f0d00410c1024220d450d05410410242208450d062007420437028405200720083602800520074180056a41004120106d200728028005200728028805220b6a22082001290000370000200841086a200141086a290000370000200841106a200141106a290000370000200841186a200141186a2900003700002007200b41206a22083602880520074180056a20084104106d20072802800520072802880522086a2009417f6a360000200d200729038005370200200d41086a200841046a3602004101210e0b200741c0006a41206a428180808010370300200741c0006a41186a200e360200200741d4006a200e360200200741ec006a200741cb036a280000360000200741013a00682007200a36025c2007200d3602502007427f37034820072003370340200720072800c803360069200741b8026a200741a8046a200741c0006a10f403200741a8046a41286a200741b8026a41286a290300370300200741a8046a41206a200741b8026a41206a290300370300200741a8046a41186a200741b8026a41186a290300370300200741a8046a41106a200741b8026a41106a290300370300200741a8046a41086a200741b8026a41086a290300370300200720072903b8023703a80402400240200441ff01714102470d00200741003a008305418012210120074180123b008105200741013a0080050c010b20074180056a20032004200610f50320072d0080054101470d0220072f00810520072d0083054110747221010b200020013b0001200041013a0000200041036a20014110763a000020072802b80421000240200741c0046a2802002201450d002001410c6c21082000210103400240200141046a280200450d00200128020010260b2001410c6a2101200841746a22080d000b0b0240200741bc046a2802002201450d002001410c6c450d00200010260b20072802c40421000240200741cc046a2802002201450d002001410c6c21082000210103400240200141046a280200450d00200128020010260b2001410c6a2101200841746a22080d000b0b200741c8046a2802002201450d072001410c6c450d07200010260c070b20004180063b0001200041013a0000200041036a410a3a000020072802b80421000240200741c0046a2802002201450d002001410c6c21082000210103400240200141046a280200450d00200128020010260b2001410c6a2101200841746a22080d000b0b0240200741bc046a2802002201450d002001410c6c450d00200010260b20072802c40421000240200741cc046a2802002201450d002001410c6c21082000210103400240200141046a280200450d00200128020010260b2001410c6a2101200841746a22080d000b0b200741c8046a2802002201450d062001410c6c450d06200010260c060b200741c0006a41286a200741b0056a290300370300200741c0006a41206a20074180056a41286a290300370300200741c0006a41186a20074180056a41206a290300370300200741c0006a41106a20074180056a41186a290300370300200741c0006a41086a20074180056a41106a2903003703002007200729038805370340200741e8026a200741a8046a200741c0006a10f403200741f8036a41286a200741e8026a41286a290300370300200741f8036a41206a200741e8026a41206a290300370300200741f8036a41186a200741e8026a41186a290300370300200741f8036a41106a200741e8026a41106a290300370300200741f8036a41086a200741e8026a41086a290300370300200720072903e8023703f803200741186a2006200320012903382212200141c0006a2903002213200541ff017141004710ec03024002400240024020072903182203200741186a41086a290300221184500d00200741003a00ff04200720113703d003200720033703c803200720013602f804410121082007410141112012201384501b3a00fe04200720013602d8042007200741d8046a360290052007200741fe046a36028c052007200741f8046a360288052007200741ff046a360284052007200741c8036a36028005200741c0006a200120074180056a10ed030240024020072802404101470d0042002113200729034821120c010b200741e8006a2903002113200741e0006a29030021124100210820072903484201520d00200741c0006a41106a290300211420072802d8042109200741b8056a200741c0006a41186a290300370300200741b0056a20143703004100210820074180056a41086a41003a000020074189056a200929000037000020074191056a200941086a29000037000020074199056a200941106a290000370000200741a1056a200941186a290000370000200741023a00800520074180056a1087020b20080d01200741f0046a220b4200370300200741d8046a41106a220d4200370300200741d8046a41086a22084200370300200742003703d80420074180056a419a8cc700410810fb01200820074180056a41086a220929000037030020072007290080053703d80420074180056a41b8a1c300410d10fb01200c41086a220e2009290000370000200c2007290080053700002007200741d8046a108d02200741106a2903002114200729030821152007280200210a200b4200370300200d420037030020084200370300200742003703d80420074180056a419a8cc700410810fb012008200929000037030020072007290080053703d80420074180056a41b8a1c300410d10fb01200e2009290000370000200c2007290080053700002007420020144200200a1b221420137d20154200200a1b2213201254ad7d2215201320127d2212201356201520145620152014511b22081b3703880520074200201220081b37038005200741d8046a412020074180056a411010b3010b200741a8046a41206a22084200370300200741a8046a41186a22094280808080c000370300200741d4046a200741306a41036a280000360000200742043703b804200720072800303600d1042007427f3703b00420072003427f2011501b3703a804200741013a00d00420074198036a200741f8036a200741a8046a10f403200741a8046a41286a20074198036a41286a290300370300200820074198036a41206a290300370300200920074198036a41186a290300370300200741a8046a41106a20074198036a41106a290300370300200741a8046a41086a20074198036a41086a29030037030020072007290398033703a80420074180056a200141d0006a220110a80220072d0080054101460d01200741c0006a41286a220820074180056a41306a2209290300370300200741c0006a41206a220a20074180056a41286a220b290300370300200741c0006a41186a220c20074180056a41206a220d290300370300200741c0006a41106a220e20074180056a41186a2204290300370300200741c0006a41086a220620074180056a41106a22022903003703002007200729038805370340200741c8036a200741a8046a200741c0006a10f403200741a8046a41286a200741c8036a41286a290300370300200741a8046a41206a200741c8036a41206a290300370300200741a8046a41186a2205200741c8036a41186a290300370300200741a8046a41106a200741c8036a41106a290300370300200741a8046a41086a200741c8036a41086a290300370300200720072903c8033703a80420074180056a200110ee0320072d0080054101460d0220082009290300370300200a200b290300370300200c200d290300370300200e2004290300370300200620022903003703002007200729038805370340200741f8036a200741a8046a200741c0006a10f403200041306a200741f8036a41286a290300370300200041286a200741f8036a41206a290300370300200041206a200741f8036a41186a290300370300200041186a200741f8036a41106a290300370300200041106a200741f8036a41086a290300370300200041086a20072903f803370300200041003a00000c080b20004180023b0001200041013a0000200041036a41003a00002007280288042100024020074190046a2802002201450d002001410c6c21082000210103400240200141046a280200450d00200128020010260b2001410c6a2101200841746a22080d000b0b02402007418c046a2802002201450d002001410c6c450d00200010260b200728029404210002402007419c046a2802002201450d002001410c6c21082000210103400240200141046a280200450d00200128020010260b2001410c6a2101200841746a22080d000b0b20074198046a2802002201450d072001410c6c450d07200010260c070b200020072f0081053b0001200041013a0000200041036a20072d0083053a000020072802b80421000240200741c0046a2802002201450d002001410c6c21082000210103400240200141046a280200450d00200128020010260b2001410c6a2101200841746a22080d000b0b0240200741bc046a2802002201450d002001410c6c450d00200010260b20072802c40421000240200741cc046a2802002201450d002001410c6c21082000210103400240200141046a280200450d00200128020010260b2001410c6a2101200841746a22080d000b0b200741c8046a2802002201450d062001410c6c450d06200010260c060b200020072f0081053b0001200041013a0000200041036a20072d0083053a000020072802b8042100024020052802002201450d002001410c6c21082000210103400240200141046a280200450d00200128020010260b2001410c6a2101200841746a22080d000b0b0240200741bc046a2802002201450d002001410c6c450d00200010260b20072802c40421000240200741cc046a2802002201450d002001410c6c21082000210103400240200141046a280200450d00200128020010260b2001410c6a2101200841746a22080d000b0b200741c8046a2802002201450d052001410c6c450d05200010260c050b200c200741b0056a290300370300200820074180056a41286a2903003703002009200a290300370300200d200b290300370300200e20074180056a41106a290300370300200720072903880537034020074198036a200741a8046a200741c0006a10f403200c20074198036a41286a290300370300200820074198036a41206a290300370300200920074198036a41186a290300370300200d20074198036a41106a290300370300200e20074198036a41086a2903003703002007200729039803370340200a4200370300200b4280808080c000370300200741013a00a80520074204370390052007427f370388052007420037038005200741c8036a200741c0006a20074180056a10f403200c200741c8036a41286a2903003703002008200741c8036a41206a2903003703002009200741c8036a41186a290300370300200d200741c8036a41106a290300370300200e200741c8036a41086a290300370300200720072903c803370340200a4200370300200b4280808080c000370300200741013a00a80520074204370390052007427f370388052007420037038005200741f8036a200741c0006a20074180056a10f403200c200741f8036a41286a2903003703002008200741f8036a41206a2903003703002009200741f8036a41186a290300370300200d200741f8036a41106a290300370300200e200741f8036a41086a290300370300200720072903f803370340200a4200370300200b4280808080c000370300200741013a00a80520074204370390052007427f370388052007420037038005200741a8046a200741c0006a20074180056a10f40320074184016a220e2010290300370200200720072903a80437027c200741bc046a280200210920052802002108200f280200210a200741cc046a280200210b20072802b804210c20072802c404210d20072903d0042103200741306a41086a200e2902003703002007200729027c370330024002402001280250417f6a220e41094b0d00024002400240200e0e0a00030303030303030102000b0240200141d8006a2802004102460d002007410a3a0043200741003b0041200741013a00404180802821010c040b0240200241ff017141014b0d0020074180056a41086a427f370300200741b4056a411036020020074180056a41206a420037030020074180056a41186a4280808080c0003703002007427f370380052007419d8ec6003602b005200741013a00a8052007420437039005200741c8036a41186a200141f0026a2902002211370300200741c8036a41106a200141e8026a2902002212370300200741c8036a41086a200141e0026a29020022133703002007200141d8026a29020022143703c803200141f0006a2903002115200741a8046a411c6a2011370200200741bc046a2012370200200741b4046a2013370200200720143702ac04411c10242201450d07200741a9056a21042007421c37029c03200720013602980320074198036a41004101106d20072802980320072802a00322016a41c0003a00002007200141016a22013602a00320074198036a20014110106d20072802980320072802a00322016a220e410029009d8e46370000200e41086a41002900a58e463700002007200141106a22013602a00320074198036a20014120106d20072802980320072802a00322066a2201200741ac046a220e290000370000200141086a200e41086a290000370000200141106a200e41106a290000370000200141186a200e41186a2900003700002007200641206a22013602a00320074198036a20014108106d20072802980320072802a00322016a20153700002007200141086a3602a003024020072802a405220120072802a005470d0020074180056a411c6a2001410110cb0120072802a40521010b200728029c052001410c6c6a2201200729039803370200200141086a20074198036a41086a280200360200200741a8046a41086a220520074180056a41086a2201290300370300200741a8046a41106a220f20074180056a41106a220e290300370300200741a8046a41186a221020074180056a41186a2206290300370300200720072802a40541016a3602a405200741a8046a41206a221620074180056a41206a220229030037030020072007290380053703a8042007200441076a29000037009f0320072004290000370398032002201629030037030020062010290300370300200e200f29030037030020012005290300370300200720072903a804370380052007200729009f033700cf0320072007290398033703c803200741e8006a2002290300370300200741c0006a41206a2006290300370300200741c0006a41186a200e290300370300200741c0006a41106a20012903003703002007200729038005370348200741f0006a41003a0000200741f4006a20072800cb03360000200741f1006a20072802c803360000200741003a00400c080b024041002802c8c2474102490d0041002802c4c247210141002802c0c247210e41002802ccc2472104200741c0056a41af01360200200741b8056a42e480808010370300200741b4056a4199f2c600360200200741ac056a4219370200200741a8056a4180f2c600360200200741a0056a42003703002007419c056a41d4c0c70036020020074190056a420137030020074188056a4104360200200741b08ec60036028c05200741b289c700360284052007410236028005200e41c8a1c000200441024622041b20074180056a200141b0a1c00020041b2802101102000b2007410a3a0043200741003b0041200741013a00404180802821010c030b0240200141d8006a2802004102460d002007410a3a0043200741003b0041200741013a00404180802821010c030b0240200241ff017141014b0d0020074180056a41086a427f370300200741b4056a411336020020074180056a41206a420037030020074180056a41186a4280808080c0003703002007427f37038005200741d6d8c5003602b005200741013a00a8052007420437039005200741c8036a41086a200141d8026a2902002211370300200741c8036a41106a200141e0026a2902002212370300200741c8036a41186a200141e8026a29020022133703002007200141d0026a29020022143703c80320014180016a2903002115200141f0006a2903002117200741a8046a41186a22042013370300200741a8046a41106a22062012370300200741a8046a41086a22022011370300200720143703a804412710242201450d06200741a9056a210e2007422737029c03200720013602980320074198036a41004101106d20072802980320072802a00322016a41cc003a00002007200141016a22013602a00320074198036a20014113106d20072802980320072802a00322056a220141002900d6d845370000200141086a41002900ded8453700002001410f6a41002800e5d8453600002007200541136a22013602a00320074198036a20014120106d20072802980320072802a00322056a220120072903a804370000200141086a2002290300370000200141106a2006290300370000200141186a20042903003700002007200541206a22013602a00320074198036a20014108106d20072802980320072802a00322016a20173700002007200141086a22013602a00320074198036a20014108106d20072802980320072802a00322016a20153700002007200141086a3602a003024020072802a405220120072802a005470d002007419c056a2001410110cb0120072802a40521010b200728029c052001410c6c6a2201200729039803370200200141086a20074198036a41086a280200360200200741a8046a41086a220520074180056a41086a2201290300370300200741a8046a41106a220f20074180056a41106a2204290300370300200741a8046a41186a221020074180056a41186a2206290300370300200720072802a40541016a3602a405200741a8046a41206a221620074180056a41206a220229030037030020072007290380053703a8042007200e41076a29000037009f032007200e2900003703980320022016290300370300200620102903003703002004200f29030037030020012005290300370300200720072903a804370380052007200729009f033700cf0320072007290398033703c803200741e8006a2002290300370300200741c0006a41206a2006290300370300200741c0006a41186a2004290300370300200741c0006a41106a20012903003703002007200729038005370348200741f0006a41003a0000200741f4006a20072800cb03360000200741f1006a20072802c803360000200741003a00400c070b024041002802c8c2474102490d0041002802c4c247210141002802c0c247210e41002802ccc2472104200741c0056a41c601360200200741b8056a42e780808010370300200741b4056a4188d9c500360200200741ac056a421c370200200741a8056a41ecd8c500360200200741a0056a42003703002007419c056a41d4c0c70036020020074190056a420137030020074188056a4103360200200741b08ec60036028c05200741e9d8c500360284052007410236028005200e41c8a1c000200441024622041b20074180056a200141b0a1c00020041b2802101102000b2007410a3a0043200741003b0041200741013a00404180802821010c020b200741c0006a200141d4006a10f00320072d00404101470d0520072f004120072d00434110747221010c010b200741003a0043418102210120074181023b0041200741013a00400b200020013b0001200041013a0000200041036a20014110763a000002402008450d002008410c6c2108200c210103400240200141046a280200450d00200128020010260b2001410c6a2101200841746a22080d000b0b02402009450d002009410c6c450d00200c10260b0240200b450d00200b410c6c2108200d210103400240200141046a280200450d00200128020010260b2001410c6a2101200841746a22080d000b0b200a450d04200a410c6c450d04200d10260c040b41f0afc7004119418cb0c700102f000b102c000b1033000b200741f8036a41286a2201200741c0006a41306a290300370300200741f8036a41206a220e200741c0006a41286a290300370300200741f8036a41186a2204200741c0006a41206a2206290300370300200741f8036a41106a2202200741c0006a41186a2205290300370300200741f8036a41086a220f200741c0006a41106a290300370300200720072903483703f803200741c0006a41086a200741306a41086a290300370300200741e4006a200b3602002006200a36020020052008360200200741d4006a200936020020072007290330370340200720033703682007200d36025c2007200c36025020074180056a41286a200129030037030020074180056a41206a200e29030037030020074180056a41186a200429030037030020074180056a41106a200229030037030020074180056a41086a200f290300370300200720072903f80337038005200741a8046a200741c0006a20074180056a10f403200041306a200741a8046a41286a290300370300200041286a200741a8046a41206a290300370300200041206a200741a8046a41186a290300370300200041186a200741a8046a41106a290300370300200041106a200741a8046a41086a290300370300200041086a20072903a804370300200041003a00000b20074180066a24000bb70304017f027e067f017e230041206b22032400200229030021042001290300210520022802102106200141106a200241186a2207280200220810c7062001280210200141186a2209280200220a410c6c6a20062008410c6c10cf061a200741003602002009200a20086a2208360200200341086a200836020020032001290210370300200228021c21072001411c6a200241246a2209280200220810c706200128021c200141246a220a280200220b410c6c6a20072008410c6c10cf061a20094100360200200a200b20086a2208360200200341106a41086a20083602002003200129021c370310427f200520047c220420042005541b2105200229030822042001290308220c200c2004561b21040240024020012d0028450d004101210120022d00280d010b410021010b20002005370300200020032903003702102000200329031037021c200020013a002820002004370308200041186a200341086a280200360200200041246a200341106a41086a2802003602000240200241146a2802002201450d002001410c6c450d00200610260b0240200241206a2802002201450d002001410c6c450d00200710260b200341206a24000bdd0302037f017e230041c0006b22042400200441286a22054200370300200441106a41106a22064200370300200441106a41086a420037030020044200370310200441106a41808cc700410610fb01200441306a41f4bbc400411010fb012005200441306a41086a29000037030020062004290030370300200441086a200441106a412010890202400240024002400240024002400240417f200428020c410020042802081b220520036a220320032005491b418080c002418080f001200241ff017122021b4b0d0020020e03020301020b200041800c3b0001200041013a0000200041036a41003a00000c060b42002101200441106a21020c040b427f200142c0b2cd3b7c220720072001541b428090a7f0ea25560d01200441106a21020c030b427f200142c0b2cd3b7c220720072001541b4280dc90fa873a580d010b200041800c3b0001200041013a0000200041036a41003a00000c020b42ffffffffffffffffff002101200441106a21020b200041003a0000200041306a41013a0000200041286a4200370200200041206a4280808080c000370300200041186a4204370300200041106a427f370300200041086a2001370300200041316a2002280000360000200041346a200241036a2800003600000b200441c0006a24000b130020004104360204200041f0a1c3003602000b3400200041a18dc70036020420004100360200200041146a4101360200200041106a41dcb8c300360200200041086a42073702000b13002000410136020420004184bac3003602000b5801027f02404110102422020d001033000b2000421037020420002002360200200041004110106d2000280200200041086a220028020022026a220342003700082003428080e983b1de163700002000200241106a3602000b8c0901097f230041b0016b22022400200241f0006a41b48cc700410710fb0120024190016a41e4bec300411210fb0120022001360200200241186a2002410410a202200241d4006a200241046a3602002002200241206a36024c200220023602502002200241186a360248200241286a200241c8006a1073024002402002280230220141206a2203417f4c0d000240024020030d0041012104410021030c010b200310242204450d020b20024100360208200220043602002002200336020420024100411010c9012002280200200228020822036a22042002290070370000200441086a200241f0006a41086a2900003700002002200341106a220336020820022003411010c9012002280200200228020822036a2204200229009001370000200441086a20024190016a41086a2900003700002002200341106a22043602082002280228210320022004200110c90120022802002205200228020822046a2003200110cf061a2002200420016a22013602080240200228022c450d00200310260b2002200136021420022005360210200241186a2005200110820202400240200228021822060d00410021010c010b200241206a2802002107200228021c210841002101200241003a006820062103024002400240034020072001460d01200241c8006a20016a20032d00003a00002002200141016a22043a0068200341016a21032004210120044120470d000b20024190016a41186a2201200241c8006a41186a29030037030020024190016a41106a2209200241c8006a41106a29030037030020024190016a41086a220a200241c8006a41086a2903003703002002200229034837039001200441ff01714120490d01200241286a41086a200a290300370300200241286a41106a2009290300370300200241286a41186a20012903003703002002200229039001370328200720046b41034d0d012003280000210320024190016a41186a200241286a41186a29030037030020024190016a41106a200241286a41106a29030037030020024190016a41086a200241286a41086a2903003703002002200229032837039001410121010c020b200141ff0171450d00200241003a00680b41002101200241003602980120024201370390012002410e3602742002200241106a360270200220024190016a360228200241dc006a41013602002002420137024c2002418c8dc6003602482002200241f0006a360258200241286a41c4e1c000200241c8006a10351a2002280290012002280298011084020240200228029401450d0020022802900110260b0b2008450d00200610260b200241c8006a41186a220420024190016a41186a290300370300200241c8006a41106a220720024190016a41106a290300370300200241c8006a41086a220620024190016a41086a29030037030020022002290390013703480240024020010d00200041003602000c010b2000410136020020002002290348370204200041246a20033602002000410c6a2006290300370200200041146a20072903003702002000411c6a20042903003702000b02402002280204450d00200510260b200241b0016a24000f0b1034000b1033000bad0202027f027e230041306b2201240002404101102422020d001033000b200142013702042001200236020020014100410110c9012001280200200128020822026a41003a0000410041003502bcc247200141106aad7c42adfed5e4d485fda8d8007e42218922033e02bcc2472001200241016a360208200141106a41bd80c7004101109601200041186a4200370300200041146a41d09fc000360200200041003602102000200341bcc2c700ad22047c37030820002003200485220320044218898520034210868520034225897c3703002000200129001037002c200041346a200141186a2900003700002000413c6a200141206a290000370000200041c4006a200141106a41186a29000037000020002001290300370220200041286a2001280208360200200141306a24000bc50401057f230041e0006b22052400024002402004417f4c0d000240024020040d0041012106410021070c010b200410242206450d02200421070b200541003602282005200636022020052007360224200541206a4100200410c90120052802202206200528022822076a2003200410cf061a2005200720046a2207360228024002400240024002402007200141286a280200470d00200128022022082006460d0220062008200710d206210702402005280224450d00200610260b20070d010c030b2005280224450d00200610260b200520032004109601200541206a41186a200541186a2206290000370300200541206a41106a200541106a2207290000370300200541206a41086a200541086a220829000037030020052005290000370320200541c0006a41086a200241086a280200360200200520022902003703400240024020040d0041012102410021090c010b200410242202450d05200421090b200541003602582005200236025020052009360254200541d0006a4100200410c9012005280250200528025822026a2003200410cf061a2005200220046a3602582001200541206a200541c0006a200541d0006a10ea05200041186a2006290000370000200041106a2007290000370000200041086a2008290000370000200020052900003700000c020b2005280224450d00200610260b2000200129002c370000200041186a200141c4006a290000370000200041106a2001413c6a290000370000200041086a200141346a2900003700000b200541e0006a24000f0b1034000b1033000bca0c02047f027e230041d0016b2204240002400240024002400240024002400240200141d0006a22052001412c6a412010d206450d00200441c8006a41186a200541186a290000370300200441c8006a41106a200541106a290000370300200441c8006a41086a200541086a2900003703002004200529000037034802402001200441c8006a10ff032206450d00200628020c41004a0d010b200441286a41086a2201200541086a290000370300200441286a41106a2203200541106a290000370300200441286a41186a2202200541186a29000037030020042005290000370328413010242205450d01200541003a00002005200429032837000120052004290048370021200541096a2001290300370000200541116a2003290300370000200541196a2002290300370000200541286a2203200441cf006a2900003700000240024020052d0000220141034b0d00024020010e0402020002020b200541086a280200450d01200541046a28020010260c010b2003280200450d00200541246a28020010260b20051026200041003a00000c070b412410242206450d012004422437022c20042006360228200441286a41004104106d2004280228200428023022066a20023600002004200641046a2202360230200441286a20024101106d2004280228200428023022026a4180013a00002004200241016a2202360230200441286a20024120106d20042802282206200428023022076a22022003290000370000200241086a200341086a290000370000200241106a200341106a290000370000200241186a200341186a2900003700002004200741206a2203360230200441c8006a41106a200541086a290000370300200441c8006a41186a200541106a290000370300200441c8006a41206a200541186a290000370300200441d0bec30036024c200420013602482004200529000037035020044100360278200420033602742004200636027020044190016a200441c8006a200441f0006a1080040240200428022c450d00200610260b02402004280290014101470d00024020042802940122052d0000220141034b0d00024020010e0408080008080b200541086a280200450d07200541046a28020010260c070b200541286a280200450d06200541246a28020010260c060b024002402004280294012203450d000240024020044198016a2903002208422088a741044f0d00410021020c010b20032800002106410121020b02402008a7450d00200310260b2002450d0020042006360228200441c8006a41106a200541086a290000370300200441c8006a41186a200541106a290000370300200441e8006a200541186a290000370300200441d0bec30036024c2004200136024820042005290000370350200442043702742004200441286a36027020044190016a200441c8006a200441f0006a1080042004280290014101470d01024020042802940122052d0000220141034b0d00024020010e0408080008080b200541086a280200450d07200541046a28020010260c070b200541286a280200450d06200541246a28020010260c060b200041003a00000c070b024020042802940122060d00200041003a00000c070b20044190016a41086a290300210841002105200441003a00682008422088a72102200621010240034020022005460d01200441c8006a20056a20012d00003a00002004200541016a22033a0068200141016a21012003210520034120460d040c000b0b0240200541ff0171450d00200441003a00680b410021050c030b102c000b1033000b20044190016a41086a2205200441c8006a41086a29030037030020044190016a41106a2201200441c8006a41106a29030037030020044190016a41186a2202200441c8006a41186a29030037030020042004290348370390010240200341ff0171411f4b0d00410021050c010b200441286a41086a20052903002209370300200441086a41186a22052002290300370300200441086a41106a22032001290300370300200441086a41086a220120093703002004200429039001220937032820042009370308200041196a2005290300370000200041116a2003290300370000200041096a200129030037000020002004290308370001410121050b200020053a00002008a7450d02200610260c020b20051026200041003a00000c010b20051026200041003a00000b200441d0016a24000b880201067f024020002802102201450d00200041146a280200220241046a2103200120026a41016a21042002280200417f73418081828478712101024003400240024020010d000340200320044f0d04200241c07e6a210220032802002101200341046a220521032001418081828478712201418081828478460d000b2001418081828478732201417f6a2001712106200521030c010b2002450d022001417f6a20017121060b2001682105200621012002410020054103766b41306c6a220541746a280200450d00200541706a2802001026200621010c000b0b200041146a280200200028021041016aad42307ea76b10260b0240200041246a280200450d00200028022010260b0bb70303017f027e097f230041106b220224002002200029030042adfed5e4d485fda8d8007e220342a0cbbf9599b5a19f0a7c2204200129001885200129000020048542adfed5e4d485fda8d8007e42178942adfed5e4d485fda8d8007e852001290008200342efcdddd088a580a21e7c8542adfed5e4d485fda8d8007e42178942adfed5e4d485fda8d8007e852001290010200342bed0fb8bf894dfa4327c8542adfed5e4d485fda8d8007e42178942adfed5e4d485fda8d8007e85420042adfed5e4d485fda8d800420010cc0620002802102205200041086a2903002203200241086a29030020022903007c85200389a72206712107200641197641818284086c2108200041146a28020021094100210a0340200920076a280000220b2008732200417f73200041fffdfb776a71418081828478712100200a41046a220a20076a200571210c02400340024020000d00200c2107200b200b4101747141808182847871450d034100210d0c020b2009410020006841037620076a2005716b41306c6a220d41506a22062001460d012000417f6a200071210020012006412010d2060d000b0b0b200241106a2400200d41706a4100200d1b0bdc19021f7f027e23004180046b22032400200228020821042002280200210520022802042106200341186a2207200141206a290000370300200341106a2208200141186a290000370300200341086a2209200141106a290000370300200320012900083703002006410174210a2003410772210b200341d3036a210c200341c8016a41186a210d200341c8016a410c6a210e200341c8016a41206a210f200128020421102001280200211120042102410021124100211302400240024002400240024002400240024002400240024002400240024002400240024002400340200420136a22144101762101024002402014410171450d0020062001490d03200120064f0d05200341013a00d001200320053602c801200320013602cc012003200520016a2d000041f001713a00d1010c010b20062001490d03200341003a00d001200320013602cc01200320053602c8010b200341a8036a20112003200341c8016a201028020c11040002400240024020032802a80322150d00200341c8016a41086a2202200341086a290300370300200341c8016a41106a2206200341106a290300370300200341c8016a41186a2214200341186a290300370300200320032903003703c8014130102422010d010c160b20032802ac032116200341c8016a201520032802b00310d20420032d00c8014101460d12201241016a21120c010b200120032903c80137000120012003290020370021200120124100473a0000200141096a2002290300370000200141116a2006290300370000200141196a2014290300370000200141286a200341276a29000037000020004101360200200020013602040c130b034020032802e401211720032802e001211820032802dc01211920032802d801211a20032802d401211420032802d001211b20032802cc012101200341206a200f41a80110cf061a200328029403211c200328029003211d024002400240024020010e05140e000102140b4100210102402014410174201a6b221e200a20026b221c201c201e4b1b221f450d000340200220016a221c410176221d20064f0d0a201a20016a2220410176222120144f0d0b2005201d6a2d0000221d410f71201d41f00171410476201c4101711b201b20216a2d0000221c410f71201c41047620204101711b470d01200141016a2201201f490d000b201f21010b02402001201e460d00200042003702002016450d170c160b201e21010c020b200320173602dc01200320183602d801200320193602d4012003201a3602d001200320143602cc012003201b3602c801200d200341206a41a80110cf061a02400240200a2002460d00200241017622012006490d012001200641d8bbc7001032000b02400240201d0d00200341003602a8030c010b201c417f4c0d1202400240201c0d0041012102410021060c010b201c10242202450d14201c21060b200341b0036a22014100360200200320023602a803200320063602ac03200341a8036a4100201c10c90120032802a803200128020022026a201d201c10cf061a20012002201c6a3602000b200020032903a803370204200041003602002000410c6a200341b0036a2802003602000c0e0b0240200341c8016a200520016a2d00002201410f71200141047620024101711b410c6c6a220128020022194102470d00200042003702000c0e0b20012802042118200141086a28020021174101211e410121010c010b20032802a003211f200328029c03211e2003280298032101200320173602d001200320183602cc01200320193602c801200e200341206a41a80110cf061a20032001360284032003201c360280032003201d3602fc024100210102402014410174201a6b2217200a20026b2219201920174b1b2218450d000340200220016a221c410176221d20064f0d0a201a20016a2220410176222120144f0d0b2005201d6a2d0000221d410f71201d41f00171410476201c4101711b201b20216a2d0000221c410f71201c41047620204101711b470d01200141016a22012018490d000b201821010b20012017470d0a0240024020192017460d00200220176a220141017622142006490d012014200641d8bbc7001032000b02400240201e0d00200341003602a8030c010b201f417f4c0d1102400240201f0d0041012102410021060c010b201f10242202450d13201f21060b200341b0036a22014100360200200320023602a803200320063602ac03200341a8036a4100201f10c90120032802a803200128020022026a201e201f10cf061a20012002201f6a3602000b200020032903a803370204200041003602002000410c6a200341b0036a2802003602000c0d0b0240200341c8016a200520146a2d00002214410f71201441047620014101711b410c6c6a221428020022194102470d00200042003702000c0d0b201741016a211e201741016a210120142802042118201441086a28020021170b200120136a21132002201e6a210202402019450d00200341c8016a2018201710d20420032d00c8014101460d120c010b0b0240024020174120460d00200341c8016a41086a22142009290300370300200341c8016a41106a221a2008290300370300200d2007290300370300200320032903003703c8012017417f4c0d0f0240024020170d00410021014101211b0c010b20171024221b450d11201721010b200341003602f8032003201b3602f003200320013602f403200341f0036a4100201710c90120032802f00320032802f80322016a2018201710cf061a200c41086a200120176a360000200c20032903f003370000413010242201450d15200141043a0000200120032903c801370001200120032900d003370021200141096a2014290300370000200141116a201a290300370000200141196a200d290300370000200141286a200341d0036a41076a290000370000410121140c010b41002114200341c8016a41026a41003a0000200341003b01c80120182f0000211a200341f0036a41026a201841026a2d00003a00002018411f6a2d0000211b201841176a29000021222018280003210120182900072123200341d0036a41086a221c2018410f6a290000370300200341d0036a41106a221d2022370300200341d0036a41186a2220201b3a00002003201a3b01f003200320233703d003200d20202d00003a0000200341c8016a41106a201d290300370300200341c8016a41086a201c290300370300200320032903d0033703c8010b200341cc036a41026a221a200341f0036a41026a2d00003a0000200341a8036a41086a221b200341c8016a41086a290300370300200341a8036a41106a221c200341c8016a41106a290300370300200341a8036a41186a221d200d280200360200200320032f01f0033b01cc03200320032903c8013703a803024020140d00200b20032903a803370000200b41086a201b290300370000200b41106a201c290300370000200b41186a201d2d00003a0000200320032f01cc033b0100200320013600032003201a2d00003a00022016450d01201510260c010b0b200041013602002000200136020420160d100c110b200120064198bcc7001047000b2001200641a8bcc7001047000b2001200641b8bcc7001032000b201d200641d8bbc7001032000b2021201441d8bbc7001032000b201d200641d8bbc7001032000b2021201441d8bbc7001032000b200042003702000c010b4100211f02402014410174201a6b200a20026b2217470d004100211f41002101024002402017450d00410021010340201a20016a221c410176221d20144f0d05200220016a2220410176222120064f0d06201b201d6a2d0000221d410f71201d41f00171410476201c4101711b200520216a2d0000221c410f71201c41047620204101711b470d012017200141016a2201470d000c020b0b20012017470d010b2018417f4c0d040240024020180d0041012101410021020c010b201810242201450d06201821020b200341003602d001200320013602c801200320023602cc01200341c8016a4100201810c90120032802c801221f20032802d00122016a2019201810cf061a2003200120186a3602d00120032902cc0121220b2000201f36020420004100360200200041086a20223702000b02402016450d00201510260b20034180046a24000f0b201d201441d8bbc7001032000b2021200641d8bbc7001032000b1034000b1033000b2000420037020020160d010c020b20032d00c9012102200341a8036a41086a2206200341086a290300370300200341a8036a41106a2214200341106a290300370300200341a8036a41186a221a200341186a290300370300200320032903003703a803413010242201450d02200141033a0000200120032903a803370001200120023a0021200120032901d003370122200141096a2006290300370000200141116a2014290300370000200141196a201a290300370000200141286a200341d6036a29010037010020004101360200200020013602042016450d010b201510260b20034180046a24000f0b102c000bbb1103087f027e0a7f230041a0076b22022400200241086a10fb03200241d8006a41186a22034200370300200241d8006a41106a22044200370300200241d8006a41086a2205420037030020024200370358200241c8046a41bd80c70041011096012003200241c8046a41186a22062900003703002004200241c8046a41106a22032900003703002005200241c8046a41086a2204290000370300200220022900c804370358200241c8046a41bd80c700410110960120024180066a41186a2205200629000037030020024180066a41106a2207200329000037030020024180066a41086a22082004290000370300200220022900c804370380060240412010242209450d00200420082903003703002003200729030037030020062005290300370300410041003502bcc247200241a8036aad7c42adfed5e4d485fda8d8007e422189220a3e02bcc2472002419c016a4200370200200241a4016a420037020020022002290380063703c8042002410436029801200241f8006a41c0006a41f8bec300360200200241b0016a4108360200200241ac016a2009360200200241013a00c0012002200241d8006a3602bc012002200241086a3602b401200241d9016a2006290300370000200241d1016a2003290300370000200241c9016a2004290300370000200241c1016a20022903c804370000200241e3016a200241a8036a41026a2d00003a0000200241e1016a20022f00a8033b0000200241f8006a41186a42003703002002418c016a41d09fc000360200200241003602e40120024100360288012002200a41bcc2c700ad220b7c370380012002200a200b85220a200b42188985200a42108685200a4225897c3703782001280200210c2001280204210d0240024020012802082201450d00200c20014105746a220e41606a210f200241c8046a410172210741002110200c2111034020102103201121010340200241e8016a41186a2208200141186a290000370300200241e8016a41106a2209200141106a290000370300200241e8016a41086a2212200141086a290000370300200220012900003703e801200241f0056a200241e8016a10b103200241c8046a20022802f005220520022802f80510b20320022d00c804210420024180066a200741a00110cf061a41002106024020044101470d00200241a8036a20024180066a41a00110cf061a410121060b024020022802f405450d00200510260b02402006450d0020024188026a200241a8036a41a00110cf061a200241c8046a41186a22132008290300370300200241c8046a41106a22142009290300370300200241c8046a41086a22152012290300370300200220022903e8013703c804200141206a2111200341016a2110416c210502400240024002400340200220024188026a200541e08bc7006a280000220810c7032002280204220641046a2204417f4c0d01200228020021090240024020040d0041002104410121120c010b200410242212450d0b0b200241003602b003200220123602a803200220043602ac03200241a8036a41004104106d20022802a80320022802b00322046a20083600002002200441046a22043602b0030240024002400240200641c000490d00200641808001490d012006418080808004490d02200241a8036a20044101106d20022802a80320022802b00322046a41033a00002002200441016a22043602b003200241a8036a20044104106d20022802a80320022802b00322046a2006360000200441046a21040c030b200241a8036a20044101106d20022802a80320022802b00322046a20064102743a0000200441016a21040c020b200241a8036a20044102106d20022802a80320022802b00322046a20064102744101723b0000200441026a21040c010b200241a8036a20044104106d20022802a80320022802b00322046a2006410274410272360000200441046a21040b200220043602b003200241a8036a20042006106d20022802a803220420022802b00322086a2009200610cf061a2002200820066a22063602b003200220033602f00520024180066a200241f8006a20042006200241f0056a4104108204024020022802ac03450d00200410260b200228028406210602402002280280064101470d00024020062d0000220141034b0d00024020010e0405050005050b200641086a280200450d04200641046a28020010260c040b200641286a280200450d03200641246a28020010260c030b02402006450d00200228028806450d00200610260b200541046a2205450d030c000b0b1034000b20061026200041086a411a360200200041a0bfc300360204200041013602000c010b200220033602f005200241003602b003200242013703a803200241a8036a41004120106d20022802a803220320022802b00322046a220620022903c804370000200641086a2015290300370000200641106a2014290300370000200641186a20132903003700002002200441206a22063602b00320024180066a200241f8006a200241f0056a410420032006108204024020022802ac03450d00200310260b024002402002280280064101470d00024020022802840622012d0000220641034b0d00024020060e0403030003030b200141086a280200450d02200141046a28020010260c020b200141286a280200450d01200141246a28020010260c010b02402002280284062206450d00200228028806450d00200610260b200f2001470d040c050b20011026200041086a411a360200200041a0bfc300360204200041013602000b0240200d41ffffff3f71450d00200c10260b200241f8006a108304200241086a10fe030c040b200341016a2103200e200141206a2201470d000b0b0b0240200d41ffffff3f71450d00200c10260b200241f8006a108304200241c8046a200241086a41d00010cf061a200241b0056a200241f0006a290300370300200241a8056a200241e8006a290300370300200241a0056a200241d8006a41086a2903003703002002200229035837039805200041086a200241c8046a41f00010cf061a200041003602000b200241a0076a24000f0b1033000bc40401037f23004190016b2206240041002107200641003602080240024020012d00484101460d00200141cc006a28020021080c010b200641366a200141cb006a2d00003a0000200641206a200141d8006a290000370300200641286a200141e0006a290000370300200641306a200141e8006a2d00003a00002006200141c9006a2f00003b01342006200141d0006a290000370318200141cc006a2800002108410121070b200641c8006a41086a2006290318370300200641c8006a41106a200641186a41086a290300370300200641c8006a41186a200641186a41106a290300370300200641e8006a200641186a41186a280200360200200620073a0048200620062f01343b00492006200836024c2006200641366a2d00003a004b410021072006410036027820062003360274200620023602700240024002402005417f4c0d004101210202402005450d00200510242202450d02200521070b20064100360288012006200236028001200620073602840120064180016a4100200510c90120062802800120062802880122076a2004200510cf061a2006200720056a36028801200641386a2001200641c8006a200641f0006a20064180016a200641086a10b905200628023c2105024020062802384101460d00200141003a00482000200629030837020420004100360200200141cc006a20053602002000410c6a200641106a2802003602000c030b200041013602002000200536020420062802082201450d02200628020c450d02200110260c020b1034000b1033000b20064190016a24000b912d02197f0c7e23002201210220014180056b41607122032400200041146a220128020022042802002105200141d09fc0003602002000280210210620004100360210200041186a42003703002003200036021c2004200641016a22076a2108200441046a21012005417f73418081828478712109200341a0026a410572210a200341a0026a41276a210b200341a0026a41206a210c200421050240024002400240024002400240024002400240024002400240024002400240024003400240024002400240024020090d000340024020012008490d004100210d0c040b200541c07d6a210520012802002109200141046a220e21012009418081828478712209418081828478460d000b2009418081828478732209417f6a200971210d200e21010c010b2009417f6a200971210d20050d00410021050c010b20034180046a41186a220f200541002009684103766b41d0006c6a221041b07f6a220941186a29020037030020034180046a41106a2211200941106a29020037030020034180046a41086a2212200941086a2902003703002003200929020037038004201041506a280200210e201041546a2d00002110200b200941cc006a280000360000200c200941c5006a290000370300200341a0026a41186a22132009413d6a290000370300200341a0026a41106a2214200941356a290000370300200341a0026a41086a22152009412d6a290000370300200320092900253703a00220104102460d00200341b8036a41186a2209200f290300370300200341b8036a41106a22162011290300370300200341b8036a41086a22172012290300370300200341a8016a41086a22182015290300370300200341a8016a41106a22152014290300370300200341a8016a41186a22142013290300370300200341a8016a41206a2213200c290300370300200341a8016a41276a2219200b28000036000020032003290380043703b803200320032903a0023703a801200f20092903003703002011201629030037030020122017290300370300200320032903b80337038004200a20032903a801370000200a41086a2018290300370000200a41106a2015290300370000200a41186a2014290300370000200a41206a2013290300370000200a41276a2019280000360000200320103a00a4022003200e3602a002200328021c220941c0006a2802002110200928023c2109200e41244b0d01200a210f0c020b0240034002400240200d0d000340200120084f0d04200541c07d6a210520012802002109200141046a220e21012009418081828478712209418081828478460d000b200941808182847873220d417f6a200d712109200e21010c010b2005450d02200d417f6a200d7121090b200d68210e2009210d20054100200e4103766b41d0006c6a220e41506a28020041244d0d00200e41586a28020010262009210d0c000b0b024002402006450d00200441ff01200641056a10d1061a200641074d0d00200741037641076c21010c010b200621010b200020063602102000411c6a4100360200200041186a2001360200200041146a2004360200200328021c22052d00484101460d10200541cc006a28020021010240200541386a220e28020022092009417f6a2208200541306a220d28020022092005412c6a220a2802006b716b4101470d00200a108604200e280200417f6a2108200d28020021090b200d2008200941016a71360200200541346a28020020094102746a2001360200200541286a280200220920014d0d042005280220200141fc006c6a2201290210211a200120032903b0023702102001290208211b200120032903a802370208200341003a00a002200341003602a4022001290200211c200120032903a002370200200141186a2209290200211d200920032903b802370200200341206a41086a2209200141e8006a290200370300200341206a41106a2208200141f0006a290200370300200341206a41186a220d200141f8006a2802003602002003201a370390012003201b370388012003201c37038001200320012902603703202003201d370398012001290240211e200141c8006a290200211f200141d0006a2902002120200141d8006a290200212120012902202122200141286a2902002123200141306a29020021242003200141386a290200222537037820032024370370200320233703682003202237036020032021370358200320203703502003201f3703482003201e370340201ca741ff01714101470d03200341a8016a41176a220e200329009801221c370000200341a8016a41106a220a200329009101221b370300200341a8016a41086a2210200329008901221a37030020052802442201200329008101221d37000020012022a7220f3a001f200141086a201a370000200141106a201b370000200141176a201c3700002003201d3703a801200341a0026a41d8006a2021370300200341a0026a41d0006a2020370300200341a0026a41c8006a201f370300200341e0026a201e370300200341dc026a200328027c360200200341d4026a2003290274370200200341cc026a200329026c370200200320032902643702c40220034180036a2003290320370300200341a0026a41e8006a2009290300370300200341a0026a41f0006a2008290300370300200341a0026a41f8006a200d280200360200200341a9026a2010290300370000200341b1026a200a290300370000200341a0026a41186a200e290000370000200320032903a8013700a102200341c0026a200f3a0000200341013a00a002200541206a200341a0026a1087042101200328021c220341003a0048200341cc006a20013602000c100b20032802ac02210e20032802a802210f0b200320032f01cc023b01c8042003200e3602c4042003200f3602c004200920034180046a200341c0046a201028021c110500024020032802a00241244d0d0020032802a80210260b200d21090c000b0b201ba72105201b422088a72101200341003602d401200341003a00ac01200341003602a801200341e8016a41106a2003280258360200200341e8016a41086a2003290350370300200320032903483703e80102400240024002400240201c422088a70e050102030400010b200341c0026a2023370300200341b8026a2022370300200341b0026a201d370300200341a8026a201a370300200341c8026a2024370300200320053602a002200320013602a40202400240200141244b0d00200341a9026a210e0c010b201a422088a7210e201da721010b2005410176210d0240024020054101710d002001200d490d07410021094100210a0c010b2001200d4d0d074101210a200e200d6a2d0000410f712109200d41016a210d0b200141017420056b220541ffff03200541ffff03491b220541017641036a22101024220f450d072001200d6b2108200e200d6a210d200341003602e001200320103602dc012003200f3602d80102402025422088a72218410020181b220e0d002003200536028404200341013b01800420034180046a200341d8016a10880441002105200a0d0b410021010c0e0b200320053602840420034181023b01800420034180046a200341d8016a10880441002105200a0d0b410021010c0c0b410110242201450d06200342013702dc01200320013602d801200341d8016a4100410110c90120032802d80120032802e00122016a41003a00002003200141016a3602e0010c0e0b200341c0026a2023370300200341b8026a2022370300200341b0026a201d370300200341a8026a201a370300200341c8026a2024370300200320053602a002200320013602a40202400240200141244b0d00200341a9026a21080c010b201a422088a72108201da721010b2005410176210902400240200541017122050d0020012009490d0820034188046a200120096b360200200341003b0180042003200820096a360284040c010b200120094d0d0820034188046a2001200941016a220d6b360200200320053a00800420032008200d6a360284042003200820096a2d0000410f713a0081040b200341d8016a20034180046a2025a72201201ea710890402402025422088a7450d00200110260b20032802a40241244d0d0d200341ac026a28020010260c0d0b200341c0026a2023370300200341b8026a2022370300200341b0026a201d370300200341a8026a201a370300200341c8026a2024370300200320053602a002200320013602a40202400240200141244b0d00200341a9026a21090c010b201a422088a72109201da721010b200320053602e803200320013602e403200320093602e003200341c0046a200341e0036a108a04200341a8016a200341e0036a41002001108b042101200328021c2105200341b8036a41086a201e370300200341b8036a41106a20032903e801370300200341d0036a200341e8016a41086a290300370300200341d8036a200341e8016a41106a280200360200200320253703b80320034180046a2005200341b8036a200341a8016a108c04200341a8016a2001108d040b108103000b2001200941b089c6001032000b200d200141d0bac7001048000b200d200141e0bac7001032000b1033000b2009200141d0bac7001048000b2009200141e0bac7001032000b410121010c020b410121010b03400240024020010e020001010b200520084f0d03200d20056a2d00002109200541016a2105410121010c010b024020032802e001220120032802dc01470d00200341d8016a2001410110c9010b20032802d80120016a20093a00002003200141016a3602e001410021010c000b0b03400240024020010e020001010b200520084f0d02200d20056a2d00002109200541016a2105410121010c010b024020032802e001220120032802dc01470d00200341d8016a2001410110c9010b20032802d80120016a20093a00002003200141016a3602e001410021010c000b0b20032802e001221621010240201620032802dc01470d00200341d8016a2016410110c90120032802e00121010b2025a7211720032802d80120016a41003a0000200320032802e00141016a22013602e0010240200120032802dc01470d00200341d8016a2001410110c90120032802e00121010b201741c0046a211420032802d80120016a41003a0000200320032802e00141016a3602e0010240200e450d00200e201e422088a7200341d8016a1095010b024002400240024020142017470d0041002110410021010c010b20034180046a4101722109200341a9026a2119200341c0046a41017221054100210a20172101410021104101210e024002400340200341023a0080042001290200211c200329039804211b2003290390042122200329038804211a20012003290380043702002001290208211d2001201a3702082001290210211a20012022370210200141186a220829020021222008201b370200200320223703d8042003201a3703d0042003201d3703c8042003201c3703c004200141206a280200210b20034180046a41176a220f200541176a29000037000020034180046a41106a2208200541106a29000037030020034180046a41086a220d200541086a29000037030020032005290000370380040240201ca7220c41ff017122114103470d0020104180fe037141087621010c050b200341e0036a41176a2212200f290000370000200341e0036a41106a220f2008290300370300200341e0036a41086a200d290300221c3703002003200329038004221b3703e003200341c0046a41176a22132012290000370000200341c0046a41106a2212200f290300370300200341c0046a41086a220f201c3703002003201b3703c00402400240024020114102470d00200341023a00b8030c010b0240024020032802a402221141244b0d00201921150c010b20032802b002211120032802ac0221150b200320032802a0023602f804200320113602f404200320153602f004200341a8016a200341f0046a4101200a108b042111200328021c2115200920032903c004370000200941086a200f290300370000200941106a2012290300370000200941176a20132900003700002003200c3a0080042003200b3602a004200341b8036a201520034180046a200341a8016a108c04200341a8016a2011108d0420032d00b8034103460d010b20034180046a41206a200341b8036a41206a29030037030020034180046a41186a200341b8036a41186a2903003703002008200341b8036a41106a290300370300200d200341b8036a41086a290300370300200320032903b803221c370380040240024002400240201ca741ff0171417f6a220d41014b0d0041002108200d0e020103010b20094120200341d8016a1095010c010b200341c0046a41186a200941186a2900003703002012200941106a290000370300200f200941086a290000370300200320092900003703c00420032802a404220841214f0d04200341c0046a2008200341d8016a1095010b200e21080b200a41016a210a200e410174210e20082010722110200141246a22012014460d030c010b0b20104180fe037141087621010c040b200841204190dfc4001047000b20104180fe037141087621010b200341033a00c00420034197046a20032900d80437000020034190046a20032900d10437030020034188046a20032900c904370300200320032900c104370380040b200341033a00b8030b201641026a21052016417d4b0d0220032802e00122092005490d0320032802d80120166a2001410874201041ff0171723b000002402018450d00201ea7450d00201810260b2017102620032802a40241244d0d00200341ac026a28020010260b200328021c220141c0006a2802002105200128023c210120034180046a41086a41002802cc9f40360200200341002902c49f4037038004200341a0026a200120034180046a20032802d80120032802e0012005280214110600200328021c2201280244220520032903a002370000200541086a200341a0026a41086a290300370000200541106a200341a0026a41106a290300370000200541186a200341a0026a41186a2903003700002001200128026c41016a36026c2001280244220541186a290000211c200541106a290000211b200541086a290000211e200141c9006a2005290000370000200141013a0048200141d1006a201e370000200141d9006a201b370000200141e1006a201c370000024020032802dc01450d0020032802d80110260b20032802a80141244d0d00200341b0016a28020010260b0240200041286a2802002203450d0020002802202101200341fc006c210303400240024020012d00000d00200141046a10d7010c010b200141246a10d7010b200141fc006a2101200341847f6a22030d000b0b0240200041246a2802002201450d00200141fc006c450d00200028022010260b200041386a280200210102400240200041306a28020022032000412c6a28020022054f0d00200120054f0d0141d4ddc400411c41dcbcc700102f000b20012003490d030b0240200141ffffffff0371450d00200041346a28020010260b024020002802102205450d00200041146a280200220341046a2101200520036a41016a21092003280200417f73418081828478712105024003400240024020050d000340200120094f0d04200341c07d6a210320012802002105200141046a220821012005418081828478712205418081828478460d000b2005418081828478732205417f6a200571210d200821010c010b2003450d022005417f6a200571210d0b2005682108200d21052003410020084103766b41d0006c6a220841506a28020041244d0d00200841586a2802001026200d21050c000b0b200041146a280200200028021041016aad42d0007ea76b10260b200224000f0b2016200541a0dfc4001048000b2005200941a0dfc4001047000b2003200141f0ddc4001047000b9d1003057f027e027f230041d0016b2204240002400240024002400240024002400240200141d0006a22052001412c6a412010d206450d00200441c0006a41186a200541186a290000370300200441c0006a41106a200541106a290000370300200441c0006a41086a200541086a2900003703002004200529000037034002402001200441c0006a10ff032206450d00200628020c41004a0d010b200441186a41086a2201200541086a290000370300200441186a41106a2203200541106a290000370300200441186a41186a2202200541186a29000037030020042005290000370318413010242205450d01200541003a00002005200429031837000120052004290040370021200541096a2001290300370000200541116a2003290300370000200541196a2002290300370000200541286a2203200441c7006a290000370000024020052d0000220141034b0d00024020010e0408080008080b200541086a280200450d07200541046a28020010260c070b2003280200450d06200541246a28020010260c060b2004420037031020044204370308412410242206450d012004422437021c2004200636021841002107200441186a41004104106d2004280218200428022022066a20023600002004200641046a2202360220200441186a20024101106d2004280218200428022022026a4180013a00002004200241016a2202360220200441186a20024120106d20042802182206200428022022086a22022003290000370000200241086a200341086a290000370000200241106a200341106a290000370000200241186a200341186a2900003700002004200841206a2203360220200441d4006a200541086a290200370200200441dc006a200541106a290200370200200441c0006a41246a200541186a290200370200200441d0bec300360244200420013602402004200529020037024c2004200441086a36024820044100360278200420033602742004200636027020044190016a200441c0006a200441f0006a10850402402004280290014101470d00024020042802940122032d0000220241034b0d00024020020e0405050005050b200341086a280200450d04200341046a28020010260c040b200341286a280200450d03200341246a28020010260c030b2004280294012202450d030240024020044190016a41086a2903002209422088a741044f0d00410021070c010b20022800002103410121070b2009a7450d04200210260c040b102c000b1033000b200310260b0b0240200428021c450d00200610260b0240024002400240024002402007450d002004200336023c200441d4006a200541086a290200370200200441dc006a200541106a290200370200200441e4006a200541186a290200370200200441d0bec300360244200420013602402004200529020037024c2004200441086a3602482004420437027420042004413c6a36027020044190016a200441c0006a200441f0006a10850402402004280290014101470d00024020042802940122052d0000220141034b0d00024020010e0406060006060b200541086a280200450d05200541046a28020010260c050b200541286a280200450d04200541246a28020010260c040b2004280294012206450d0420044190016a41086a290300210941002105200441003a00602009422088a7210220062101024002400240034020022005460d01200441c0006a20056a20012d00003a00002004200541016a22033a0060200141016a21012003210520034120470d000b20044190016a41086a2205200441c0006a41086a29030037030020044190016a41106a2201200441c0006a41106a29030037030020044190016a41186a2202200441c0006a41186a2903003703002004200429034037039001200341ff0171411f4b0d01410021050c020b0240200541ff0171450d00200441003a00600b410021050c010b200441f0006a41186a2002290300370300200441f0006a41106a2001290300220a370300200441186a41086a2005290300370300200441186a41106a200a370300410121050b02402009a7450d00200610260b2005450d0420004204370200200041086a220841003602002004280210210620044100360210200428020c210b200428020821072004420437030820004100200641306c220141306d220210cb012008280200210320060d01200721050c020b200041003602000c040b200720016a210c200641306c2102200741306a210520002802002003410c6c6a21012003200641047441706a4104766a41016a210602400340200541546a2802002200450d01200141046a200541586a290200370200200120003602002001410c6a2101200541306a2105200341016a2103200241506a22020d000b200c2105200621030b200c20056b220141306d21020b2008200336020002402001450d00200241306c2101200541086a2105034002402005280200450d002005417c6a28020010260b200541306a2105200141506a22010d000b0b0240200b450d00200b41306c450d00200710260b024020042802102205450d00200541306c2101200428020841086a2105034002402005280200450d002005417c6a28020010260b200541306a2105200141506a22010d000b0b200428020c2205450d04200541306c450d04200428020810260c040b200510260b200041003602000b024020042802102205450d00200541306c2101200428020841086a2105034002402005280200450d002005417c6a28020010260b200541306a2105200141506a22010d000b0b200428020c2205450d01200541306c450d01200428020810260c010b20051026200041003602000b200441d0016a24000be71d041c7f017e057f017e23004180046b22032400200228020821042002280200210520022802042106200341186a2207200141246a290000370300200341106a22082001411c6a290000370300200341086a2209200141146a2900003703002003200129000c3703002006410174210a2003410772210b200341d3036a210c200341c8016a41186a210d200341c8016a410c6a210e200341c8016a41206a210f200128020421102001280200211120042112410021134100211402400240024002400240024002400240024002400240024002400240024002400340200420146a22154101762102024002400240024002400240024002400240024002402015410171450d0020062002490d02200220064f0d04200341013a00d001200320053602c801200320023602cc012003200520026a2d000041f001713a00d1010c010b20062002490d02200341003a00d001200320023602cc01200320053602c8010b200341a8036a20112003200341c8016a201028020c110400024020032802a80322160d00200341c8016a41086a2212200341086a290300370300200341c8016a41106a2206200341106a290300370300200341c8016a41186a2215200341186a290300370300200320032903003703c801413010242202450d1a200220032903c80137000120022003290020370021200220134100473a0000200241096a2012290300370000200241116a2006290300370000200241196a2015290300370000200241286a200341276a29000037000020004101360200200020023602040c190b20032802b003210220032802ac0321172001280208221528020c20134b0d082002417f4c0d110240024020020d0041002118410121190c010b200210242219450d15200221180b200341003602282003201936022020032018360224200341206a4100200210c9012003280220200328022822186a2016200210cf061a200341c8016a41086a221a2009290300370300200341c8016a41106a221b2008290300370300200d20072903003703002003201820026a360228200320032903003703c80120152802082218201541046a221c280200470d07201841016a22192018490d054100211d2018410174221e2019201e20194b1b22194104201941044b1bad42307e221f422088a7221e4100472120201fa7211902402018450d00201841306c21212015280200211d0b20202019410048720d05201e4541027421180240201d0d0020190d042018211d0c070b20212019460d06024020210d0020190d044104211d0c070b201d202120191028221d450d040c060b200220064198bcc7001047000b2002200641a8bcc7001047000b2002200641b8bcc7001032000b20191024221d0d020b20180d140b102e000b2015201d360200201c201941306e360200201528020821180b2015280200201841306c6a2218200329032037020420182013360200201820032903c8013702102018410c6a200341206a41086a280200360200201841186a201a290300370200201841206a201b290300370200201841286a200d2903003702002015201528020841016a3602080b200341c8016a2016200210d20420032d00c8014101460d0d201341016a2113034020032802e401212220032802e001211e20032802dc01212020032802d801211820032802d401211520032802d001211920032802cc012102200341206a200f41a80110cf061a200328029403211d200328029003211a024002400240024020020e05110b000102110b410021020240201541017420186b2223200a20126b221d201d20234b1b2224450d000340201220026a221d410176221a20064f0d07201820026a221b410176221c20154f0d082005201a6a2d0000221a410f71201a41f00171410476201d4101711b2019201c6a2d0000221d410f71201d410476201b4101711b470d01200241016a22022024490d000b202421020b024020022023460d00200042003702002017450d140c130b202321020c020b200320223602dc012003201e3602d801200320203602d401200320183602d001200320153602cc01200320193602c801200d200341206a41a80110cf061a02400240200a2012460d00201241017622022006490d012002200641d8bbc7001032000b02400240201a0d00200341003602a8030c010b201d417f4c0d0d02400240201d0d0041012112410021060c010b201d10242212450d11201d21060b200341b0036a22024100360200200320123602a803200320063602ac03200341a8036a4100201d10c90120032802a803200228020022126a201a201d10cf061a20022012201d6a3602000b200020032903a803370204200041003602002000410c6a200341b0036a2802003602000c0b0b0240200341c8016a200520026a2d00002202410f71200241047620124101711b410c6c6a220228020022204102470d00200042003702000c0b0b2002280204211e200241086a280200212241012123410121020c010b20032802a0032124200328029c0321232003280298032102200320223602d0012003201e3602cc01200320203602c801200e200341206a41a80110cf061a20032002360284032003201d360280032003201a3602fc02410021020240201541017420186b2222200a20126b2220202020224b1b221e450d000340201220026a221d410176221a20064f0d07201820026a221b410176221c20154f0d082005201a6a2d0000221a410f71201a41f00171410476201d4101711b2019201c6a2d0000221d410f71201d410476201b4101711b470d01200241016a2202201e490d000b201e21020b20022022470d070240024020202022460d00201220226a220241017622152006490d012015200641d8bbc7001032000b0240024020230d00200341003602a8030c010b2024417f4c0d0c0240024020240d0041012112410021060c010b202410242212450d10202421060b200341b0036a22024100360200200320123602a803200320063602ac03200341a8036a4100202410c90120032802a803200228020022126a2023202410cf061a2002201220246a3602000b200020032903a803370204200041003602002000410c6a200341b0036a2802003602000c0a0b0240200341c8016a200520156a2d00002215410f71201541047620024101711b410c6c6a221528020022204102470d00200042003702000c0a0b202241016a2123202241016a21022015280204211e201541086a28020021220b200220146a2114201220236a211202402020450d00200341c8016a201e202210d20420032d00c8014101460d0f0c010b0b0240024020224120460d00200341c8016a41086a22152009290300370300200341c8016a41106a22182008290300370300200d2007290300370300200320032903003703c8012022417f4c0d0a0240024020220d0041002102410121190c010b202210242219450d0e202221020b200341003602f803200320193602f003200320023602f403200341f0036a4100202210c90120032802f00320032802f80322026a201e202210cf061a200c41086a200220226a360000200c20032903f003370000413010242202450d12200241043a0000200220032903c801370001200220032900d003370021200241096a2015290300370000200241116a2018290300370000200241196a200d290300370000200241286a200341d0036a41076a290000370000410121150c010b41002115200341c8016a41026a41003a0000200341003b01c801201e2f00002118200341f0036a41026a201e41026a2d00003a0000201e411f6a2d00002119201e41176a290000211f201e2800032102201e2900072125200341d0036a41086a221d201e410f6a290000370300200341d0036a41106a221a201f370300200341d0036a41186a221b20193a0000200320183b01f003200320253703d003200d201b2d00003a0000200341c8016a41106a201a290300370300200341c8016a41086a201d290300370300200320032903d0033703c8010b200341cc036a41026a2218200341f0036a41026a2d00003a0000200341a8036a41086a2219200341c8016a41086a290300370300200341a8036a41106a221d200341c8016a41106a290300370300200341a8036a41186a221a200d280200360200200320032f01f0033b01cc03200320032903c8013703a803024020150d00200b20032903a803370000200b41086a2019290300370000200b41106a201d290300370000200b41186a201a2d00003a0000200320032f01cc033b010020032002360003200320182d00003a00022017450d01201610260c010b0b200041013602002000200236020420170d0d0c0e0b201a200641d8bbc7001032000b201c201541d8bbc7001032000b201a200641d8bbc7001032000b201c201541d8bbc7001032000b200042003702000c010b410021220240201541017420186b200a20126b2201470d004100212241002102024002402001450d00410021020340201820026a221d410176221a20154f0d06201220026a221b410176221c20064f0d072019201a6a2d0000221a410f71201a41f00171410476201d4101711b2005201c6a2d0000221d410f71201d410476201b4101711b470d012001200241016a2202470d000c020b0b20022001470d010b201e417f4c0d0202400240201e0d0041012102410021120c010b201e10242202450d06201e21120b200341003602d001200320023602c801200320123602cc01200341c8016a4100201e10c90120032802c801222220032802d00122026a2020201e10cf061a20032002201e6a3602d00120032902cc01211f0b2000202236020420004100360200200041086a201f3702000b02402017450d00201610260b20034180046a24000f0b1034000b201a201541d8bbc7001032000b201c200641d8bbc7001032000b1033000b2000420037020020170d010c020b20032d00c9012112200341a8036a41086a2206200341086a290300370300200341a8036a41106a2215200341106a290300370300200341a8036a41186a2218200341186a290300370300200320032903003703a803413010242202450d02200241033a0000200220032903a803370001200220123a0021200220032901d003370122200241096a2006290300370000200241116a2015290300370000200241196a2018290300370000200241286a200341d6036a29010037010020004101360200200020023602042017450d010b201610260b20034180046a24000f0b102c000bf70201057f024002402000410c6a28020022012001417f6a200041046a28020020002802006b716b4101470d002001210202402001450d0002400240200120016a22022001490d00200241ffffffff037122032002470d00200241027422044100480d0020032002464102742103024002400240200028020822020d0020040d01200321020c040b200141027422052004460d03024020050d0020040d01410421020c040b20022005200410282202450d010c030b2004102422020d020b20030d040b102e000b200020023602082000410c6a200441027622023602000b0240024020022001410174470d0020002802002204200041046a28020022034d0d022003200120046b2205490d0120002802082201200220056b22024102746a200120044102746a200541027410cf061a200020023602000f0b41ead7c400412b41dcbcc700102f000b2000280208220220014102746a2002200341027410cf061a200041046a2200200028020020016a3602000b0f0b102c000be00303047f017e017f23004180016b2202240002400240024002400240024002400240200028020c2203200041106a280200470d002002200141fc0010cf06210120002802082203200041046a280200470d05200341016a22042003490d03200341017422052004200520044b1b22044104200441044b1bad42fc007e2206422088a722050d032006a722044100480d03200545410274210702402000280200410020031b22050d0020040d02200721050c050b200341fc006c22032004460d04024020030d0020040d02410421050c050b20052003200410282205450d020c040b2000410c6a200041186a280200417f6a200341016a71360200200041146a28020020034102746a28020021032002200141fc0010cf06210102402000280208220420034d0d000240024020002802002200200341fc006c6a22042d00000d002000200341fc006c6a41046a10d7010c010b2000200341fc006c6a41246a10d7010b2004200141fc0010cf061a0c060b2003200441908cc6001032000b2004102422050d020b20070d040b102e000b20002005360200200041046a200441fc006e360200200028020821030b2000280200200341fc006c6a200141fc0010cf061a20002000280208220341016a3602080b20024180016a240020030f0b102c000ba60501057f024002400240024020002d00000e03010200010b200041046a280200220041ffff03200041ffff03491b220241c0006a41ff0020022000413e2002413e491b2203461b2100200220036b2103200141086a2102410121040340024002400240200441ff01714102470d00200021050c010b410021052004410171450d00410021040c010b2003450d0402402003418002490d00200341817e6a210341ff012100410221040c010b2003417f6a210041022104410021030b200120022802004101106d2001280200200228020022066a20003a00002002200641016a360200200521000c000b0b2001200141086a22002802004101106d2001280200200028020022016a41003a00002000200141016a3602000c010b200041046a2802002202413e200241ffff03200241ffff03491b2202413e491b2103024020002d00010d00200241807f7341bf7f20022003461b2100200220036b2103200141086a2102410121040340024002400240200441ff01714102470d00200021050c010b410021052004410171450d00410021040c010b2003450d0302402003418002490d00200341817e6a210341ff012100410221040c010b2003417f6a210041022104410021030b200120022802004101106d2001280200200228020022066a20003a00002002200641016a360200200521000c000b0b200241406a417f20022003461b2100200220036b2103200141086a2102410121040340024002400240200441ff01714102470d00200021050c010b410021052004410171450d00410021040c010b2003450d0202402003418002490d00200341817e6a210341ff012100410221040c010b2003417f6a210041022104410021030b200120022802004101106d2001280200200228020022066a20003a00002002200641016a360200200521000c000b0b0ba30201077f02400240200141086a280200220441036a2205417f4c0d0020012d000021062001280204210720012d00012108410121014100210902402005450d00200510242201450d02200521090b20002001360200200041086a22014100360200200041046a220a2009360200200441017420066a220541ffff03200541ffff03491b41c000200010d5040240024020060d00200128020021050c010b2008410f712106024020012802002201200a280200470d00200020014101106d200041086a28020021010b200041086a200141016a2205360200200028020020016a20063a00000b200020052004106d2000280200200041086a220128020022056a2007200410cf061a2001200520046a3602002002200320001095010f0b1034000b1033000bb70101057f20012802082202410176210320012802042104024002400240024020024101710d0020042003490d02200128020020036a210141002102410021050c010b200420034d0d024101210520012802002202200341016a22066a2101200220036a2d0000410f712102200621030b200020053a000c20002001360204200041003602002000410d6a20023a0000200041086a200420036b3602000f0b2003200441d0bac7001048000b2003200441e0bac7001032000bcd09010c7f230041106b2204240002400240024002400240024020010d00410021010c010b200141086a28020022054101762106200141046a2802002107024002400240024020054101710d00200720064f0d012006200741d0bac7001048000b200720064b0d012006200741e0bac7001032000b200720066b2108200128020020066a21090c010b20002001280200220120066a2d0000410f7110c9062007200641016a22066b2108200120066a21090b2000280200220121060240200141244d0d002000410c6a28020021060b02400240024002402006410174200028022c460d00200121060240200141244d0d002000410c6a28020021060b2008450d032006417f6a2106200141244b0d01200041056a210a2001210b0c020b0240200141244d0d002000410c6a28020021010b20042000200810cd04024020042802004101470d00200441086a2802000d0541c8bcc700411141dcbcc700102f000b2000280200220a21060240200a41244d0d002000410c6a28020021060b024020062001490d0002400240200a41244b0d00200041056a210a0c010b200041086a280200210a0b200a20016a220a20086a200a200620016b10d0061a200a2009200810cf061a200620086a21010240200028020041244b0d00200020013602000c040b2000410c6a20013602000c030b418cbdc700411e41dcbcc700102f000b2000410c6a280200210b200041086a280200210a0b200b20064d0d03200a20066a2d0000210a02400240200141244b0d00200041056a210b0c010b2000410c6a2802002101200041086a280200210b0b200120064d0d04200b20066a200a4170713a000020092d0000210a024002402000280200220141244b0d00200041056a210b0c010b2000410c6a2802002101200041086a280200210b0b200120064d0d05200b20066a220120012d0000200a410476723a000002402008417f6a220c450d00200041056a210d2000410c6a210e41002101034002400240024020082001460d00200920016a22062d0000210b200641016a2d0000210f024002402000280200220a41244b0d004124210a200021060c010b200e21060b024020062802002206200a470d0020042000410110cd0420042802004101470d00200441086a2802000d0841c8bcc700411141dcbcc700102f000b200141016a2101200f410476200b41047472210a200028020041244b0d01200d210b2000210f0c020b2008200841c0bac7001032000b2000280208210b200e210f0b200f200641016a360200200b20066a200a3a0000200c2001470d000b0b2009200c6a2d0000210a41242106024002402000280200220b41244b0d00200021010c010b2000410c6a2101200b21060b0240200128020022012006470d0020042000410110cd0420042802004101470d00200441086a2802000d0341c8bcc700411141dcbcc700102f000b200a410474210602400240200028020041244b0d00200041056a210a2000210b0c010b2000410c6a210b200041086a280200210a0b200b200141016a360200200a20016a20063a00000b2000200028022c20084101746a36022c200741017420056b21010b02402002450d002000200310c906200141016a21010b200441106a240020010f0b102c000b2006200b4190bac7001032000b2006200141a0bac7001032000b2006200141b0bac7001032000b9b2203067f067e0d7f230022042105200441e0036b416071220424002004200336021420042001360210024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020022d00004101460d00200241046a28020021020240200141386a220628020022032003417f6a2207200141306a220828020022032001412c6a22092802006b716b4101470d0020091086042006280200417f6a2107200828020021030b20082007200341016a71360200200141346a28020020034102746a2002360200200141286a280200220320024d0d022001280220200241fc006c6a2201290210210a200120042903f0013702102001290208210b200120042903e801370208200441d8006a2001290240220c370300200441386a22032001290220370300200441f8006a2001290260370300200141186a2202290200210d200220042903f801370200200441003a00e001200441003602e4012001290200210e200120042903e001370200200441186a41d8006a2207200141d8006a290200370300200441186a41d0006a2208200141d0006a290200370300200441186a41c8006a2206200141c8006a290200370300200441186a41386a200141386a290200220f370300200441186a41306a2209200141306a290200370300200441186a41286a200141286a290200370300200441186a41186a2210200d370300200441186a41e8006a200141e8006a290200370300200441186a41f0006a200141f0006a290200370300200441186a41f8006a200141f8006a2802003602002004200a3703282004200b3703202004200e370318200ea741ff01714101460d01200ba72102200b422088a72101200c422088a72111200fa72112200441c0016a41086a22132003290300370300200441c0016a41106a2203200441186a41286a290300370300200441c0016a41186a2009290300370300200441a8016a41086a2008290300370300200441a8016a41106a2007280200360200200420102903003703c001200420062903003703a801200441d4006a290200220fa7211402400240024002400240200e422088a70e050102030400010b200441e0016a41086a200a370300200441e0016a41106a20042903c001370300200441e0016a41186a201329030037030020044180026a2003290300370300200441e0016a41286a200441c0016a41186a290300370300200420023602e001200420013602e40102400240200141244b0d00200441e9016a21060c010b200a422088a7210620042802f00121010b200241017621080240024020024101710d0020012008490d0941002103410021090c010b200120084d0d0941012109200620086a2d0000410f712103200841016a21080b200141017420026b220241ffff03200241ffff03491b220241017641036a221010242213450d09200120086b2107200620086a2108200441003602a0012004201036029c01200420133602980102402014410020141b22060d00200420023602e402200441013b01e002200441e0026a20044198016a1088044100210220090d0e410021010c0f0b200420023602e40220044181023b01e002200441e0026a20044198016a1088044100210220090d0c410021010c0f0b410110242201450d082004420137029c01200420013602980120044198016a4100410110c90120042802980120042802a00122016a41003a00002004200141016a3602a0010c100b200441e0016a41086a200a370300200441e0016a41106a20042903c001370300200441e0016a41186a201329030037030020044180026a2003290300370300200441e0016a41286a200441c0016a41186a290300370300200420023602e001200420013602e40102400240200141244b0d00200441e9016a21070c010b200a422088a7210720042802f00121010b2002410176210302400240200241017122020d0020012003490d0a200441e8026a200120036b360200200441003b01e0022004200720036a3602e4020c010b200120034d0d0a200441e8026a2001200341016a22086b360200200420023a00e0022004200720086a3602e4022004200720036a2d0000410f713a00e1020b20044198016a200441e0026a2012200f422088a710890402402014450d00201210260b20042802e40141244d0d0f200441ec016a28020010260c0f0b200441e0016a41086a200a370300200441e0016a41106a20042903c001370300200441e0016a41186a201329030037030020044180026a2003290300370300200441e0016a41286a200441c0016a41186a290300370300200420023602e001200420013602e40102400240200141244b0d00200441e9016a21000c010b200a422088a7210020042802f00121010b200420023602c802200420013602c402200420003602c002200441a0036a200441c0026a108a042004280214200441c0026a41002004108b04210120042802102102200441a4026a201136020020044198026a41106a20042903a801370300200441b0026a200441b0016a290300370300200441b8026a200441a8016a41106a2802003602002004200f37029c022004201236029802200441e0026a200220044198026a20042802142204108c0420042001108d040b108103000b200041003a000020002002290001370001200041196a200241196a290000370000200041116a200241116a290000370000200041096a200241096a2900003700000c130b20002004290019370001200041003a0000200041196a200441186a41196a290000370000200041116a200441186a41116a290000370000200041096a200441186a41096a2900003700000c130b2002200341b089c6001032000b2008200141d0bac7001048000b2008200141e0bac7001032000b1033000b2003200141d0bac7001048000b2003200141e0bac7001032000b410121010c020b410121010b03400240024020010e020001010b200220074f0d03200820026a2d00002103200241016a2102410121010c010b024020042802a0012201200428029c01470d0020044198016a2001410110c9010b20042802980120016a20033a00002004200141016a3602a001410021010c000b0b03400240024020010e020001010b200220074f0d02200820026a2d00002103200241016a2102410121010c010b024020042802a0012201200428029c01470d0020044198016a2001410110c9010b20042802980120016a20033a00002004200141016a3602a001410021010c000b0b20042802a0012215210102402015200428029c01470d0020044198016a2015410110c90120042802a00121010b20042802980120016a41003a0000200420042802a00141016a22013602a00102402001200428029c01470d0020044198016a2001410110c90120042802a00121010b201241c0046a211620042802980120016a41003a0000200420042802a00141016a3602a00102402006450d002006201120044198016a1095010b024002400240024020162012470d0041002110410021010c010b200441e0026a4101722103200441e9016a2117200441a0036a410172210241002109201221014100211041012106024002400340200441023a00e0022001290200210e20042903f802210b20042903f002210a20042903e802210d200120042903e0023702002001290208210c2001200d3702082001290210210d2001200a370210200141186a2207290200210a2007200b3702002004200a3703b8032004200d3703b0032004200c3703a8032004200e3703a003200141206a2802002118200441e0026a41176a2213200241176a290000370000200441e0026a41106a2207200241106a290000370300200441e0026a41086a2208200241086a290000370300200420022900003703e0020240200ea7221941ff017122114103470d0020104180fe037141087621010c050b200441c0026a41176a221a2013290000370000200441c0026a41106a22132007290300370300200441c0026a41086a2008290300220e370300200420042903e002220b3703c002200441a0036a41176a221b201a290000370000200441a0036a41106a221a2013290300370300200441a0036a41086a2213200e3703002004200b3703a00302400240024020114102470d00200441023a0098020c010b0240024020042802e401221141244b0d002017211c0c010b20042802f001211120042802ec01211c0b200420042802e0013602d803200420113602d4032004201c3602d0032004280214200441d0036a41012009108b0421112004280210211c200320042903a003370000200341086a2013290300370000200341106a201a290300370000200341176a201b290000370000200420193a00e002200420183602800320044198026a201c200441e0026a20042802142218108c0420182011108d0420042d0098024103460d010b200441e0026a41206a20044198026a41206a290300370300200441e0026a41186a20044198026a41186a290300370300200720044198026a41106a290300370300200820044198026a41086a2903003703002004200429039802220e3703e0020240024002400240200ea741ff0171417f6a220841014b0d004100210720080e020103010b2003412020044198016a1095010c010b200441a0036a41186a200341186a290000370300201a200341106a2900003703002013200341086a290000370300200420032900003703a003200428028403220741214f0d04200441a0036a200720044198016a1095010b200621070b200941016a21092006410174210620072010722110200141246a22012016460d030c010b0b20104180fe037141087621010c040b200741204190dfc4001047000b20104180fe037141087621010b200441033a00a003200441f7026a20042900b803370000200441f0026a20042900b103370300200441e8026a20042900a903370300200420042900a1033703e0020b200441033a0098020b201541026a21022015417d4b0d0120042802a00122032002490d0220042802980120156a2001410874201041ff0171723b000002402014450d00200f428080808010540d00201410260b2012102620042802e40141244d0d00200441ec016a28020010260b024020042802a0012201411f4b0d00200441f8016a22024200370300200441f0016a22034200370300200441e8016a22074200370300200442003703e001200441e0016a200428029801200110cf061a200041246a2001360200200041013a0000200041196a2002290300370000200041116a2003290300370000200041096a2007290300370000200020042903e0013700010c060b2004280210220241c0006a2802002108200228023c21062004280214220228022c2209410176210720022802002103024002402009410171450d0002400240200341244b0d00200241056a2109200321100c010b2002410c6a2802002110200241086a28020021090b20102007490d0402400240200341244b0d00200241056a21020c010b2002410c6a2802002103200241086a28020021020b200320074d0d05200441e9026a200220076a2d000041f001713a0000200420093602e002410121020c010b02400240200341244b0d00200241056a21020c010b2002410c6a2802002103200241086a28020021020b20032007490d05200420023602e002410021020b200420023a00e802200420073602e402200441e0016a2006200441e0026a20042802980120012008280214110600200020042903e001370001200041096a200441e8016a290300370000200041116a200441f0016a290300370000200041196a200441f8016a290300370000200041003a000020042802102201200128026c41016a36026c0c050b2015200241a0dfc4001048000b2002200341a0dfc4001047000b2007201041e0b9c7001047000b2007200341f0b9c7001032000b200720034180bac7001047000b0240200428029c01450d0020042802980110260b20042d00180d010b200524000f0b2004413c6a10d701200524000ba20301057f02402001450d0002400240200028022c220220014d0d00200220016b2203410176200341017122046a21052000280200220221010240200241244d0d002000410c6a28020021010b200520014f0d012000410c6a2106200520016b41016a2101034002400240200241244b0d00200021020c010b200621020b024020022802002205450d0020022005417f6a3602000b2001450d02200141016a2101200028020021020c000b0b024002402000280200220141244b0d00200021020c010b2000410c6a220228020021010b02402001450d00200241003602000b2000410036022c0c010b2000200336022c2004450d00024002402000280200220241244b0d00200041056a21052002417f6a2101200221060c010b2000410c6a2802002206417f6a2101200041086a28020021050b02400240200620014d0d00200520016a2d0000210502400240200241244b0d00200041056a21000c010b2000410c6a2802002102200041086a28020021000b200220014d0d01200020016a20054170713a00000f0b2001200641c0b9c7001032000b2001200241d0b9c7001032000b0b130020004104360204200041a0c0c3003602000b34002000419a8cc70036020420004100360200200041146a4104360200200041106a41e4dac300360200200041086a42083702000b0b002000410841001091040bf70203027f027e017f0240024020024105744104722203417f4c0d00200310242204450d012000200336020420002004360200200041086a220341003602002000200210a10102402002450d0020024105742104200328020021020340200020024108106d2000280200200328020022026a200141106a2900003700002003200241086a2202360200200141086a290300210520012903002106200020024110106d2000280200200328020022026a22072005370008200720063700002003200241106a22023602000240200141186a2d0000220741024b0d00024002400240024020070e03000102000b200020024101106d2000280200200328020022026a41003a0000200241016a21020c020b200020024101106d2000280200200328020022026a41013a0000200241016a21020c010b200020024101106d2000280200200328020022026a41023a0000200241016a21020b200320023602000b200141206a2101200441606a22040d000b0b0f0b1034000b1033000bd10101037f20004201370200200041086a22024100360200200041004110106d2000280200200228020022036a22044200370008200442003700002002200341106a2203360200200020034110106d2000280200200228020022036a22044200370008200442003700002002200341106a2203360200200020034110106d2000280200200228020022036a22044200370008200442003700002002200341106a2203360200200020034110106d2000280200200228020022006a22034200370008200342003700002002200041106a3602000b5201027f02404110102422020d001033000b2000421037020420002002360200200041004110106d2000280200200041086a220028020022026a22034200370008200342003700002000200241106a3602000b130020004101360204200041e4e1c3003602000b5601027f02404110102422020d001033000b2000421037020420002002360200200041004110106d2000280200200041086a220028020022026a2203420037000820034280c8afa0253700002000200241106a3602000b130020004106360204200041acedc3003602000b3400200041a88dc70036020420004100360200200041146a4103360200200041106a41e4fdc300360200200041086a42093702000b3b01017f20004201370200200041086a22024100360200200041004101106d2000280200200228020022006a41003a00002002200041016a3602000bb49e0104037f017e067f017e230041e0006b2202240002402000280200220341164b0d000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020030e17000102030405060708090a0b0c161514131211100f0e0d000b2001200141086a22032802004101106d2001280200200328020022046a41003a00002003200441016a2204360200200041086a280200417f6a220341094b0d19024002400240024002400240024002400240024020030e0a00010203040506070809000b200120044101106d2001280200200141086a220328020022046a41003a00002003200441016a22043602002000410c6a2802002100200120044104106d2001280200200328020022016a20003600002003200141046a3602000c220b200120044101106d2001280200200141086a220328020022046a41013a00002003200441016a3602002000410c6a280200200041146a28020020011095010c210b200120044101106d2001280200200141086a220328020022046a41023a00002003200441016a2204360200200041106a2903002105200120044108106d2001280200200328020022016a20053700002003200141086a3602000c200b200120044101106d2001280200200141086a220328020022046a41033a00002003200441016a3602002000410c6a280200200041146a28020020011095010c1f0b200120044101106d2001280200200141086a220328020022046a41043a00002003200441016a3602002000410c6a280200200041146a28020020011095010c1e0b200120044101106d2001280200200141086a220328020022046a41053a00002003200441016a36020020012000410c6a10a4010c1d0b200120044101106d2001280200200141086a220328020022046a41063a00002003200441016a3602002000410c6a28020021032001200041146a280200220010a1012000450d1c2003200041186c6a210003402003280200200341086a28020020011095012003410c6a280200200341146a2802002001109501200341186a22032000470d000c1d0b0b200120044101106d2001280200200141086a220328020022046a41073a00002003200441016a3602002000410c6a28020021032001200041146a280200220010a1012000450d1b20032000410c6c6a210003402003280200200341086a28020020011095012003410c6a22032000470d000c1c0b0b200120044101106d2001280200200141086a220328020022046a41083a00002003200441016a3602002000410c6a280200200041146a2802002001109501200041186a2802002100200120032802004104106d2001280200200328020022016a20003600002003200141046a3602000c1a0b200120044101106d2001280200200141086a220128020022006a41093a00002001200041016a3602000c190b2001200141086a22032802004101106d2001280200200328020022046a41013a00002003200441016a2204360200200041086a280200417f6a220341014b0d180240024020030e020001000b200120044101106d2001280200200141086a220328020022046a41003a00002003200441016a2204360200200120044120106d2001280200200328020022066a220420004188026a290000370000200441186a200041a0026a290000370000200441106a20004198026a290000370000200441086a20004190026a2900003700002003200641206a2204360200200041206a2903002105200120044108106d2001280200200328020022046a20053700002003200441086a3602002001200041286a10ab01200120004198016a10ab0120012000410c6a10ae010c190b200120044101106d2001280200200141086a220328020022046a41013a00002003200441016a2204360200200120044120106d2001280200200328020022066a220420004188026a290000370000200441186a200041a0026a290000370000200441106a20004198026a290000370000200441086a20004190026a2900003700002003200641206a2204360200200041206a2903002105200120044108106d2001280200200328020022046a20053700002003200441086a3602002001200041286a10ab01200120004198016a10ab0120012000410c6a10ae010c180b2001200141086a22032802004101106d2001280200200328020022046a41023a00002003200441016a2204360200200120044101106d2001280200200328020022046a41003a00002003200441016a22043602000240024002400240200041086a290300220542c000540d00200542808001540d012005428080808004540d024108200579a741037622066b4104490d03200120044101106d2001280200200141086a220328020022046a411320064102746b3a00002003200441016a2204360200200220002903082205370308200641786a21000340200120044101106d2001280200200328020022046a20053c00002003200441016a220436020020054208882105200041016a22062000492107200621002007450d000b200220053703082005500d1b200241286a41146a4109360200200241346a4111360200200241106a41146a41033602002002200241086a360240200241e886c600360244200241c8006a41146a410036020020024203370214200241d4c0c7003602102002411136022c200241d4c0c7003602582002420137024c200241f086c6003602482002200241286a3602202002200241c8006a3602382002200241c4006a3602302002200241c0006a360228200241106a41ecc0c700103d000b200120044101106d2001280200200328020022016a2005a74102743a00002003200141016a3602000c1a0b200120044102106d2001280200200141086a220128020022006a2005a74102744101723b00002001200041026a3602000c190b200120044104106d2001280200200141086a220128020022006a2005a74102744102723600002001200041046a3602000c180b41ab86c600413641dcbcc700102f000b2001200141086a22032802004101106d2001280200200328020022046a41033a00002003200441016a220436020020002d0004417f6a220641044b0d16200041046a21030240024002400240024020060e050001020304000b200120044101106d2001280200200141086a220328020022046a41003a00002003200441016a2204360200200041086a2802002100200120044104106d2001280200200328020022016a20003600002003200141046a3602000c1a0b200120044101106d2001280200200141086a220428020022066a41013a00002004200641016a2206360200200120064120106d2001280200200428020022076a22062003290001370000200641186a200341196a290000370000200641106a200341116a290000370000200641086a200341096a2900003700002004200741206a2203360200200041286a2802002100200120034104106d2001280200200428020022016a20003600002004200141046a3602000c190b200120044101106d2001280200200141086a220328020022046a41023a00002003200441016a2204360200200041086a2802002100200120044104106d2001280200200328020022016a20003600002003200141046a3602000c180b200120044101106d2001280200200141086a220428020022066a41033a00002004200641016a2206360200200120064120106d2001280200200428020022076a22062003290001370000200641186a200341196a290000370000200641106a200341116a290000370000200641086a200341096a2900003700002004200741206a2203360200200041286a2802002106200120034104106d2001280200200428020022036a20063600002004200341046a220336020020002d00252100200120034101106d2001280200200428020022016a20003a00002004200141016a3602000c170b200120044101106d2001280200200141086a220328020022046a41043a00002003200441016a2204360200200041086a2802002100200120044104106d2001280200200328020022016a20003600002003200141046a3602000c160b2001200141086a22032802004101106d2001280200200328020022046a41043a00002003200441016a2204360200200041086a22032d0000417f6a220641034b0d15024002400240024020060e0400010203000b200120044101106d2001280200200141086a220428020022066a41003a00002004200641016a2206360200200120064120106d2001280200200428020022076a22062003290001370000200641186a200341196a290000370000200641106a200341116a290000370000200641086a200341096a2900003700002004200741206a3602002002200041306a360248200241c8006a200110a7020c180b200120044101106d2001280200200141086a220428020022066a41013a00002004200641016a2206360200200120064120106d2001280200200428020022076a22062003290001370000200641186a200341196a290000370000200641106a200341116a290000370000200641086a200341096a2900003700002004200741206a3602002002200041306a360248200241c8006a200110a7022002200041c0006a360248200241c8006a200110a7020c170b200120044101106d2001280200200141086a220428020022066a41023a00002004200641016a2206360200200120064120106d2001280200200428020022076a22062003290001370000200641186a200341196a290000370000200641106a200341116a290000370000200641086a200341096a2900003700002004200741206a2206360200200120064120106d2001280200200428020022076a2206200341216a290000370000200641186a200341396a290000370000200641106a200341316a290000370000200641086a200341296a2900003700002004200741206a3602002002200041d0006a360248200241c8006a200110a7020c160b200120044101106d2001280200200141086a220428020022066a41033a00002004200641016a2206360200200120064120106d2001280200200428020022076a22062003290001370000200641186a200341196a290000370000200641106a200341116a290000370000200641086a200341096a2900003700002004200741206a3602002002200041306a360248200241c8006a200110a7020c150b2001200141086a22032802004101106d2001280200200328020022046a41053a00002003200441016a2204360200200120044101106d2001280200200328020022046a41003a00002003200441016a3602002000280204210420012000410c6a280200220010a1012000450d14200041f0006c21060340200220013602482004220041106a200241c8006a109c0102400240024002402000280200220441c000490d00200441808001490d012004418080808004490d02200120032802004101106d2001280200200328020022046a41033a00002003200441016a220436020020002802002107200120044104106d2001280200200328020022046a20073600002003200441046a3602000c030b200120032802004101106d2001280200200328020022076a20044102743a00002003200741016a3602000c020b200120032802004102106d2001280200200328020022076a20044102744101723b00002003200741026a3602000c010b200120032802004104106d2001280200200328020022076a20044102744102723600002003200741046a3602000b200041f0006a210420022001360248200041306a200241c8006a109c0120022001360248200041d0006a200241c8006a109c012001200041046a10a001200641907f6a22060d000c150b0b2001200141086a22002802004101106d2001280200200028020022036a41063a00002000200341016a360200200110fa020c130b2001200141086a22032802004101106d2001280200200328020022046a41073a00002003200441016a220436020002402000280204450d00200120044101106d2001280200200328020022046a41003a00002003200441016a2204360200200120044120106d2001280200200328020022066a2204200041106a290000370000200441186a200041286a290000370000200441106a200041206a290000370000200441086a200041186a2900003700002003200641206a2204360200200120044120106d2001280200200328020022066a2204200041306a290000370000200441186a200041c8006a290000370000200441106a200041c0006a290000370000200441086a200041386a2900003700002003200641206a2204360200200120044120106d2001280200200328020022066a2204200041d0006a290000370000200441186a200041e8006a290000370000200441106a200041e0006a290000370000200441086a200041d8006a2900003700002003200641206a2204360200200120044120106d2001280200200328020022066a2204200041f0006a290000370000200441186a20004188016a290000370000200441106a20004180016a290000370000200441086a200041f8006a2900003700002003200641206a2204360200200120044120106d2001280200200328020022066a220420004190016a290000370000200441186a200041a8016a290000370000200441106a200041a0016a290000370000200441086a20004198016a2900003700002003200641206a36020020002802042000410c6a28020020011095010c130b200120044101106d2001280200200328020022016a41013a00002003200141016a3602000c120b2001200141086a22032802004101106d2001280200200328020022046a41083a00002003200441016a2204360200200120044101106d2001280200200328020022046a41003a00002003200441016a22063602000240024002402000280204220441c000490d00200441808001490d012004418080808004490d02200120064101106d2001280200200141086a220328020022046a41033a00002003200441016a220436020020002802042100200120044104106d2001280200200328020022016a20003600002003200141046a3602000c140b200120064101106d2001280200200328020022016a20044102743a00002003200141016a3602000c130b200120064102106d2001280200200141086a220128020022006a20044102744101723b00002001200041026a3602000c120b200120064104106d2001280200200141086a220128020022006a20044102744102723600002001200041046a3602000c110b2001200141086a22032802004101106d2001280200200328020022046a41093a00002003200441016a2204360200200041086a280200417f6a220341024b0d1002400240024020030e03000102000b200120044101106d2001280200200141086a220328020022046a41003a00002003200441016a3602002001200041206a10aa0120012000410c6a10ae010c120b200120044101106d2001280200200141086a220328020022046a41013a00002003200441016a3602002001200041206a10aa0120012000410c6a10ae010c110b200120044101106d2001280200200141086a220328020022046a41023a00002003200441016a22043602002000410c6a2802002106200120044104106d2001280200200328020022046a20063600002003200441046a2204360200200041106a2802002100200120044104106d2001280200200328020022016a20003600002003200141046a3602000c100b2001200141086a22062802004101106d2001280200200628020022036a410a3a00002006200341016a2203360200200120034101106d2001280200200628020022036a41003a00002006200341016a220336020020002802042104200120034104106d2001280200200628020022036a20043600002006200341046a360200200041086a280200200041106a2802002001109501200041146a280200210320012000411c6a280200220410a1012000412c6a210702402004450d0020032004410c6c6a210403402003280200200341086a28020020011095012003410c6a22032004470d000b0b200041206a2802002103200120062802004104106d2001280200200628020022046a20033600002006200441046a2203360200200041246a2802002104200120034104106d2001280200200628020022036a20043600002006200341046a2203360200200041286a2802002100200120034104106d2001280200200628020022036a20003600002006200341046a22003602002001200041c000106d2001280200200628020022006a22012007290000370000200141386a200741386a290000370000200141306a200741306a290000370000200141286a200741286a290000370000200141206a200741206a290000370000200141186a200741186a290000370000200141106a200741106a290000370000200141086a200741086a2900003700002006200041c0006a3602000c0f0b2001200141086a22002802004101106d2001280200200028020022036a410b3a00002000200341016a360200200110fa020c0e0b2001200141086a22032802004101106d2001280200200328020022046a410c3a00002003200441016a2204360200200041086a22032d0000417f6a220641034b0d0d024020060e04000d0c0b000b200120044101106d2001280200200141086a220328020022046a41003a00002003200441016a3602002000410c6a28020021082001200041146a280200220010a1012000450d0d200820004198026c6a2109034020012008109b0120082802800221042001200828028802220010a10102402000450d00200041c1006c2107034020042d00002106200120032802004101106d200441016a210020012802002003280200220a6a210b0240024020064101460d00200b41013a00002003200a41016a22063602002001200641c000106d20012802002003280200220a6a22062000290000370000200641386a200041386a290000370000200641306a200041306a290000370000200641286a200041286a290000370000200641206a200041206a290000370000200641186a200041186a290000370000200641106a200041106a290000370000200641086a200041086a2900003700000c010b200b41023a00002003200a41016a22063602002001200641c000106d20012802002003280200220a6a22062000290000370000200641386a200041386a290000370000200641306a200041306a290000370000200641286a200041286a290000370000200641206a200041206a290000370000200641186a200041186a290000370000200641106a200041106a290000370000200641086a200041086a2900003700000b200441c1006a21042003200a41c0006a360200200741bf7f6a22070d000b0b20084190026a220628020022004103762104200828028c022107024002402000418004490d002004410274210402402000418080084f0d00200120032802004102106d2001280200200328020022006a20044101723b0000200041026a21040c020b200120032802004104106d2001280200200328020022006a2004410272360000200041046a21040c010b200120032802004101106d2001280200200328020022006a20044102743a0000200041016a21040b2003200436020020084198026a2108024002402006280200220a41037622060d00410021000c010b4101210020064108200a4107716b220a4d0d00410241012006200a6b22004107711b20004103766a21000b200120042000106d2001280200200328020022046a2007200010cf061a2003200420006a36020020082009470d000c0e0b0b2001200141086a22032802004101106d2001280200200328020022046a41163a00002003200441016a2204360200200041086a220b2d0000417f6a220341034b0d0c024002400240024020030e0400010203000b200120044101106d2001280200200141086a220628020022036a41003a00002006200341016a3602002000410c6a28020021032001200041146a280200220410a10102402004450d0020044105742107200628020021040340200120044120106d20012802002006280200220a6a22042003290000370000200441186a200341186a290000370000200441106a200341106a290000370000200441086a200341086a2900003700002006200a41206a2204360200200341206a2103200741606a22070d000b0b200028021820011099040c0f0b200120044101106d2001280200200141086a220628020022036a41013a00002006200341016a220336020020002f010a2104200120034102106d2001280200200628020022036a20043b00002006200341026a3602002000410c6a28020021032001200041146a280200220410a101200041186a210b02402004450d0020044105742107200628020021040340200120044120106d20012802002006280200220a6a22042003290000370000200441186a200341186a290000370000200441106a200341106a290000370000200441086a200341086a2900003700002006200a41206a2204360200200341206a2103200741606a22070d000b0b2001200b10a40120002802242000412c6a280200200110950120002d00092103200120062802004101106d2001280200200628020022046a20033a00002006200441016a220336020020002903302105200120034108106d2001280200200628020022016a20053700002006200141086a3602000c0e0b200120044101106d2001280200200141086a220628020022036a41023a00002006200341016a220336020020002f012a2104200120034102106d2001280200200628020022036a20043b00002006200341026a3602002000412c6a28020021032001200041346a280200220410a101200041386a210802402004450d0020044105742107200628020021040340200120044120106d20012802002006280200220a6a22042003290000370000200441186a200341186a290000370000200441106a200341106a290000370000200441086a200341086a2900003700002006200a41206a2204360200200341206a2103200741606a22070d000b0b2001200810a401200120062802004120106d2001280200200628020022046a2203200b290001370000200341186a200b41196a290000370000200341106a200b41116a290000370000200341086a200b41096a2900003700002006200441206a220336020020002903482105200120034108106d2001280200200628020022016a20053700002006200141086a3602000c0d0b200120044101106d2001280200200141086a220628020022036a41033a00002006200341016a220336020020002f012a2104200120034102106d2001280200200628020022036a20043b00002006200341026a3602002000412c6a28020021032001200041346a280200220410a1010240024020040d00200628020021040c010b20044105742107200628020021040340200120044120106d20012802002006280200220a6a22042003290000370000200441186a200341186a290000370000200441106a200341106a290000370000200441086a200341086a2900003700002006200a41206a2204360200200341206a2103200741606a22070d000b0b20002802382106200120044104106d2001280200200141086a220328020022046a20063600002003200441046a22043602002000413c6a2802002100200120044104106d2001280200200328020022046a20003600002003200441046a2200360200200120004120106d2001280200200328020022006a2201200b290001370000200141186a200b41196a290000370000200141106a200b41116a290000370000200141086a200b41096a2900003700002003200041206a3602000c0c0b2001200141086a22032802004101106d2001280200200328020022046a41153a00002003200441016a220436020020002d0004417f6a220641054b0d0b200041046a210302400240024002400240024020060e06000102030405000b200120044101106d2001280200200141086a220428020022066a41003a00002004200641016a2206360200200120064120106d2001280200200428020022076a22062003290001370000200641186a200341196a290000370000200641106a200341116a290000370000200641086a200341096a2900003700002004200741206a220636020020002d00252107200120064101106d2001280200200428020022066a210a0240024020074104470d00200a41003a00002004200641016a3602000c010b200a41013a00002004200641016a2206360200024002400240024020032d00210e0400010203000b200120064101106d2001280200200141086a220328020022046a41003a00002003200441016a3602000c030b200120064101106d2001280200200141086a220328020022046a41013a00002003200441016a3602000c020b200120064101106d2001280200200141086a220328020022046a41023a00002003200441016a3602000c010b200120064101106d2001280200200141086a220328020022046a41033a00002003200441016a3602000b200028022820011099040c100b200120044101106d2001280200200141086a220028020022046a41013a00002000200441016a2204360200200120044120106d2001280200200028020022066a22042003290001370000200441186a200341196a290000370000200441106a200341116a290000370000200441086a200341096a2900003700002000200641206a22043602000240024002400240200341216a2d00000e0400010203000b200120044101106d2001280200200028020022016a41003a00002000200141016a3602000c120b200120044101106d2001280200200028020022016a41013a00002000200141016a3602000c110b200120044101106d2001280200200028020022016a41023a00002000200141016a3602000c100b200120044101106d2001280200200028020022016a41033a00002000200141016a3602000c0f0b200120044101106d2001280200200141086a220028020022046a41023a00002000200441016a2204360200200120044120106d2001280200200028020022066a22042003290001370000200441186a200341196a290000370000200441106a200341116a290000370000200441086a200341096a2900003700002000200641206a22043602000240024002400240200341216a2d00000e0400010203000b200120044101106d2001280200200028020022016a41003a00002000200141016a3602000c110b200120044101106d2001280200200028020022016a41013a00002000200141016a3602000c100b200120044101106d2001280200200028020022016a41023a00002000200141016a3602000c0f0b200120044101106d2001280200200028020022016a41033a00002000200141016a3602000c0e0b200120044101106d2001280200200141086a220128020022006a41033a00002001200041016a3602000c0d0b200120044101106d2001280200200141086a220028020022046a41043a00002000200441016a22043602000240024002400240024020032d00010e0400010203000b200120044101106d2001280200200028020022046a41003a0000200441016a21040c030b200120044101106d2001280200200028020022046a41013a0000200441016a21040c020b200120044101106d2001280200200028020022046a41023a0000200441016a21040c010b200120044101106d2001280200200028020022046a41033a0000200441016a21040b2000200436020020032f01022100200120044102106d2001280200200141086a220128020022036a20003b00002001200341026a3602000c0c0b200120044101106d2001280200200141086a220428020022066a41053a00002004200641016a2206360200200120064120106d2001280200200428020022076a22062003290001370000200641186a200341196a290000370000200641106a200341116a290000370000200641086a200341096a2900003700002004200741206a22033602000240024002400240024020002d00250e0400010203000b200120034101106d2001280200200428020022036a41003a0000200341016a21030c030b200120034101106d2001280200200428020022036a41013a0000200341016a21030c020b200120034101106d2001280200200428020022036a41023a0000200341016a21030c010b200120034101106d2001280200200428020022036a41033a0000200341016a21030b2004200336020020002f01262104200120034102106d2001280200200141086a220328020022066a20043b00002003200641026a220636020002400240024002402000280228220441c000490d00200441808001490d012004418080808004490d02200120064101106d2001280200200141086a220328020022046a41033a00002003200441016a220436020020002802282106200120044104106d2001280200200328020022046a20063600002003200441046a22043602000c030b200120064101106d2001280200200328020022066a20044102743a00002003200641016a22043602000c020b200120064102106d2001280200200141086a220328020022066a20044102744101723b00002003200641026a22043602000c010b200120064104106d2001280200200141086a220328020022066a20044102744102723600002003200641046a22043602000b024002400240200028022c220341c000490d00200341808001490d012003418080808004490d02200120044101106d2001280200200141086a220328020022046a41033a00002003200441016a2204360200200028022c2100200120044104106d2001280200200328020022016a20003600002003200141046a3602000c0e0b200120044101106d2001280200200141086a220128020022006a20034102743a00002001200041016a3602000c0d0b200120044102106d2001280200200141086a220128020022006a20034102744101723b00002001200041026a3602000c0c0b200120044104106d2001280200200141086a220128020022006a20034102744102723600002001200041046a3602000c0b0b2001200141086a22032802004101106d2001280200200328020022046a41143a00002003200441016a2204360200200041086a22032d0000417f6a220641034b0d0a024002400240024020060e0400010203000b200120044101106d2001280200200141086a220328020022046a41003a00002003200441016a3602002000410c6a28020020011099040c0d0b200120044101106d2001280200200141086a220328020022046a41013a00002003200441016a3602002000410c6a2802002001109904200041106a2903002105200120032802004108106d2001280200200328020022016a20053700002003200141086a3602000c0c0b200120044101106d2001280200200141086a220028020022046a41023a00002000200441016a2204360200200120044120106d2001280200200028020022046a22012003290001370000200141186a200341196a290000370000200141106a200341116a290000370000200141086a200341096a2900003700002000200441206a3602000c0b0b200120044101106d2001280200200141086a220428020022066a41033a00002004200641016a2206360200200120064120106d2001280200200428020022076a22062003290001370000200641186a200341196a290000370000200641106a200341116a290000370000200641086a200341096a2900003700002004200741206a3602002000412c6a28020020011099040c0a0b2001200141086a22032802004101106d2001280200200328020022046a41133a00002003200441016a220436020020002d0004417f6a220341054b0d0902400240024002400240024020030e06000102030405000b200120044101106d2001280200200141086a220328020022046a41003a00002003200441016a2204360200200041086a2802002106200120044104106d2001280200200328020022046a20063600002003200441046a36020020012000410c6a10990120002d00052104200120032802004101106d2001280200200328020022066a20043a00002003200641016a360200200041186a28020020011099040c0e0b200120044101106d2001280200200141086a220328020022046a41013a00002003200441016a2204360200200041086a2802002106200120044104106d2001280200200328020022046a20063600002003200441046a22043602002000410c6a2802002100200120044104106d2001280200200328020022016a20003600002003200141046a3602000c0d0b200120044101106d2001280200200141086a220328020022046a41023a00002003200441016a360200200041086a280200200041106a2802002001109501200041146a2802002104200120032802004104106d2001280200200328020022066a20043600002003200641046a3602002001200041186a10990120002d00052104200120032802004101106d2001280200200328020022066a20043a00002003200641016a360200200041246a28020020011099040c0c0b200120044101106d2001280200200141086a220328020022046a41033a00002003200441016a360200200041086a280200200041106a28020020011095010c0b0b200120044101106d2001280200200141086a220328020022046a41043a00002003200441016a2204360200200041086a2802002106200120044104106d2001280200200328020022046a20063600002003200441046a36020020012000410c6a10990120002d00052104200120032802004101106d2001280200200328020022066a20043a00002003200641016a360200200041186a28020020011099040c0a0b200120044101106d2001280200200141086a220328020022046a41053a00002003200441016a360200200041086a280200200041106a2802002001109501200041146a2802002104200120032802004104106d2001280200200328020022066a20043600002003200641046a3602002001200041186a10990120002d00052104200120032802004101106d2001280200200328020022066a20043a00002003200641016a360200200041246a28020020011099040c090b2001200141086a22032802004101106d2001280200200328020022046a41123a00002003200441016a2204360200200041086a22032d0000417f6a220641034b0d08024002400240024020060e0400010203000b200120044101106d2001280200200141086a220128020022006a41003a00002001200041016a3602000c0b0b200120044101106d2001280200200141086a220028020022046a41013a00002000200441016a2204360200200120044120106d2001280200200028020022046a22012003290001370000200141186a200341196a290000370000200141106a200341116a290000370000200141086a200341096a2900003700002000200441206a3602000c0a0b200120044101106d2001280200200141086a220428020022066a41023a00002004200641016a2206360200200120064120106d2001280200200428020022076a22062003290001370000200641186a200341196a290000370000200641106a200341116a290000370000200641086a200341096a2900003700002004200741206a2203360200200041306a2903002105200041386a290300210c200120034110106d2001280200200428020022036a2206200c370008200620053700002004200341106a2203360200200041c0006a2903002105200041c8006a290300210c200120034110106d2001280200200428020022036a2206200c370008200620053700002004200341106a2203360200200041d0006a2802002100200120034104106d2001280200200428020022016a20003600002004200141046a3602000c090b200120044101106d2001280200200141086a220428020022066a41033a00002004200641016a2206360200200120064120106d2001280200200428020022076a22062003290001370000200641186a200341196a290000370000200641106a200341116a290000370000200641086a200341096a2900003700002004200741206a2206360200200120064120106d2001280200200428020022076a2206200341216a290000370000200641186a200341396a290000370000200641106a200341316a290000370000200641086a200341296a2900003700002004200741206a2203360200200041d0006a2903002105200041d8006a290300210c200120034110106d2001280200200428020022036a2206200c370008200620053700002004200341106a2203360200200041e0006a2903002105200041e8006a290300210c200120034110106d2001280200200428020022036a2206200c370008200620053700002004200341106a2203360200200041f0006a2802002100200120034104106d2001280200200428020022016a20003600002004200141046a3602000c080b2001200141086a22032802004101106d2001280200200328020022046a41113a00002003200441016a220436020020002d0004417f6a220641084b0d07200041046a210302400240024002400240024002400240024020060e09000102030405060708000b200120044101106d2001280200200141086a220428020022066a41003a00002004200641016a2206360200200120064120106d2001280200200428020022076a22062003290001370000200641186a200341196a290000370000200641106a200341116a290000370000200641086a200341096a2900003700002004200741206a360200200041286a28020020011099040c0f0b200120044101106d2001280200200141086a220028020022046a41013a00002000200441016a2204360200200120044120106d2001280200200028020022066a22042003290001370000200441186a200341196a290000370000200441106a200341116a290000370000200441086a200341096a2900003700002000200641206a2204360200200120044120106d2001280200200028020022046a2201200341216a290000370000200141186a200341396a290000370000200141106a200341316a290000370000200141086a200341296a2900003700002000200441206a3602000c0e0b200120044101106d2001280200200141086a220628020022036a41023a00002006200341016a360200200041086a28020021032001200041106a280200220410a1010240024020040d00200628020021040c010b20044105742107200628020021040340200120044120106d20012802002006280200220a6a22042003290000370000200441186a200341186a290000370000200441106a200341106a290000370000200441086a200341086a2900003700002006200a41206a2204360200200341206a2103200741606a22070d000b0b20002f01062106200120044102106d2001280200200141086a220328020022046a20063b00002003200441026a220436020020002802142100200120044104106d2001280200200328020022016a20003600002003200141046a3602000c0d0b200120044101106d2001280200200141086a220028020022046a41033a00002000200441016a2204360200200120044120106d2001280200200028020022046a22012003290001370000200141186a200341196a290000370000200141106a200341116a290000370000200141086a200341096a2900003700002000200441206a3602000c0c0b200120044101106d2001280200200141086a220028020022046a41043a00002000200441016a2204360200200120044120106d2001280200200028020022066a22042003290001370000200441186a200341196a290000370000200441106a200341116a290000370000200441086a200341096a2900003700002000200641206a2204360200200120044120106d2001280200200028020022046a2201200341216a290000370000200141186a200341396a290000370000200141106a200341316a290000370000200141086a200341296a2900003700002000200441206a3602000c0b0b200120044101106d2001280200200141086a220028020022046a41053a00002000200441016a2204360200200120044120106d2001280200200028020022046a22012003290001370000200141186a200341196a290000370000200141106a200341116a290000370000200141086a200341096a2900003700002000200441206a3602000c0a0b200120044101106d2001280200200141086a220028020022046a41063a00002000200441016a2204360200200120044120106d2001280200200028020022046a22012003290001370000200141186a200341196a290000370000200141106a200341116a290000370000200141086a200341096a2900003700002000200441206a3602000c090b200120044101106d2001280200200141086a220128020022006a41073a00002001200041016a3602000c080b200120044101106d2001280200200141086a220028020022046a41083a00002000200441016a2204360200200120044120106d2001280200200028020022046a22012003290001370000200141186a200341196a290000370000200141106a200341116a290000370000200141086a200341096a2900003700002000200441206a3602000c070b2001200141086a22032802004101106d2001280200200328020022046a41103a00002003200441016a2206360200200041086a22032d0000417f6a2204410e4b0d0602400240024002400240024002400240024002400240024002400240024020040e0f000102030405060708090a0b0c0d0e000b200120064101106d2001280200200141086a220028020022046a41003a00002000200441016a2204360200200120044120106d2001280200200028020022046a22012003290001370000200141186a200341196a290000370000200141106a200341116a290000370000200141086a200341096a2900003700002000200441206a3602000c140b200120064101106d2001280200200141086a220328020022046a41013a00002003200441016a36020020012000410c6a10a9010c130b200120064101106d2001280200200141086a220328020022046a41023a00002003200441016a3602002000410c6a28020021042001200041146a280200220010a1012000450d122004200041c4006c6a210a0340200120032802004120106d2001280200200328020022066a22002004290000370000200041186a200441186a290000370000200041106a200441106a290000370000200041086a200441086a2900003700002003200641206a360200200241c8006a200441206a2206108501200228024821042001200328020020022802502200106d2001280200200328020022076a2004200010cf061a2003200720006a3602000240200228024c450d00200410260b200a200641246a2204470d000c130b0b200120064101106d2001280200200141086a220128020022006a41033a00002001200041016a3602000c110b200120064101106d2001280200200141086a220328020022046a41043a00002003200441016a2206360200200041106a210702400240024002402000410c6a280200220441c000490d00200441808001490d012004418080808004490d02200120064101106d2001280200200141086a220328020022046a41033a00002003200441016a2204360200200028020c2100200120044104106d2001280200200328020022046a20003600002003200441046a3602000c030b200120064101106d2001280200200328020022006a20044102743a00002003200041016a3602000c020b200120064102106d2001280200200141086a220028020022036a20044102744101723b00002000200341026a3602000c010b200120064104106d2001280200200141086a220028020022036a20044102744102723600002000200341046a3602000b20022007360248200241c8006a200110a7020c100b200120064101106d2001280200200141086a220328020022046a41053a00002003200441016a22043602002000410c6a2802002100200120044104106d2001280200200328020022016a20003600002003200141046a3602000c0f0b200120064101106d2001280200200141086a220328020022046a41063a00002003200441016a2206360200200041106a210702400240024002402000410c6a280200220441c000490d00200441808001490d012004418080808004490d02200120064101106d2001280200200141086a220328020022046a41033a00002003200441016a2204360200200028020c2100200120044104106d2001280200200328020022046a20003600002003200441046a3602000c030b200120064101106d2001280200200328020022006a20044102743a00002003200041016a3602000c020b200120064102106d2001280200200141086a220028020022036a20044102744101723b00002000200341026a3602000c010b200120064104106d2001280200200141086a220028020022036a20044102744102723600002000200341046a3602000b20022007360248200241c8006a200110a7020c0e0b200120064101106d2001280200200141086a220428020022066a41073a00002004200641016a220736020002400240024002402000412c6a280200220641c000490d00200641808001490d012006418080808004490d02200120074101106d2001280200200141086a220428020022066a41033a00002004200641016a2206360200200028022c2100200120064104106d2001280200200428020022066a20003600002004200641046a22003602000c030b200120074101106d2001280200200428020022006a20064102743a00002004200041016a22003602000c020b200120074102106d2001280200200141086a220428020022006a20064102744101723b00002004200041026a22003602000c010b200120074104106d2001280200200141086a220428020022006a20064102744102723600002004200041046a22003602000b200120004120106d2001280200200141086a220028020022046a22012003290001370000200141186a200341196a290000370000200141106a200341116a290000370000200141086a200341096a2900003700002000200441206a3602000c0d0b200120064101106d2001280200200141086a220328020022046a41083a00002003200441016a220636020002400240024002402000410c6a280200220441c000490d00200441808001490d012004418080808004490d02200120064101106d2001280200200141086a220328020022046a41033a00002003200441016a2204360200200028020c2106200120044104106d2001280200200328020022046a20063600002003200441046a22043602000c030b200120064101106d2001280200200328020022066a20044102743a00002003200641016a22043602000c020b200120064102106d2001280200200141086a220328020022066a20044102744101723b00002003200641026a22043602000c010b200120064104106d2001280200200141086a220328020022066a20044102744102723600002003200641046a22043602000b20002903102105200120044108106d2001280200200141086a220128020022006a20053700002001200041086a3602000c0c0b200120064101106d2001280200200141086a220428020022066a41093a00002004200641016a2207360200200041306a210a02400240024002402000412c6a280200220641c000490d00200641808001490d012006418080808004490d02200120074101106d2001280200200141086a220428020022066a41033a00002004200641016a2206360200200028022c2100200120064104106d2001280200200428020022066a20003600002004200641046a22003602000c030b200120074101106d2001280200200428020022006a20064102743a00002004200041016a22003602000c020b200120074102106d2001280200200141086a220428020022006a20064102744101723b00002004200041026a22003602000c010b200120074104106d2001280200200141086a220428020022006a20064102744102723600002004200041046a22003602000b200120004120106d2001280200200141086a220428020022066a22002003290001370000200041186a200341196a290000370000200041106a200341116a290000370000200041086a200341096a2900003700002004200641206a360200200a200110cb020c0b0b200120064101106d2001280200200141086a220028020022046a410a3a00002000200441016a2204360200200120044120106d2001280200200028020022046a22012003290001370000200141186a200341196a290000370000200141106a200341116a290000370000200141086a200341096a2900003700002000200441206a3602000c0a0b200120064101106d2001280200200141086a220428020022066a410b3a00002004200641016a2206360200200120064120106d2001280200200428020022076a22062003290001370000200641186a200341196a290000370000200641106a200341116a290000370000200641086a200341096a2900003700002004200741206a360200200241c8006a2000412c6a108501200228024821032001200428020020022802502200106d2001280200200428020022016a2003200010cf061a2004200120006a360200200228024c450d09200310260c090b200120064101106d2001280200200141086a220428020022066a410c3a00002004200641016a2206360200200120064120106d2001280200200428020022076a22062003290001370000200641186a200341196a290000370000200641106a200341116a290000370000200641086a200341096a2900003700002004200741206a360200200241c8006a2000412c6a108501200228024821032001200428020020022802502200106d2001280200200428020022016a2003200010cf061a2004200120006a360200200228024c450d08200310260c080b200120064101106d2001280200200141086a220028020022046a410d3a00002000200441016a2204360200200120044120106d2001280200200028020022046a22012003290001370000200141186a200341196a290000370000200141106a200341116a290000370000200141086a200341096a2900003700002000200441206a3602000c070b200120064101106d2001280200200141086a220128020022006a410e3a00002001200041016a3602000c060b2001200141086a22032802004101106d2001280200200328020022046a410f3a00002003200441016a220436020020002f0104417f6a220341014b0d050240024020030e020001000b200120044101106d2001280200200141086a220328020022046a41003a00002003200441016a360200200041086a28020021032001200041106a280200220010a1012000450d06200041b0026c2100034020032001109904200341b0026a2103200041d07d6a22000d000c070b0b200120044101106d2001280200200141086a220328020022046a41013a00002003200441016a220436020020002f01062106200120044102106d2001280200200328020022046a20063b00002003200441026a360200200041086a28020020011099040c050b2001200141086a22032802004101106d2001280200200328020022046a410e3a00002003200441016a220436020020002d0004417f6a220341064b0d04024002400240024002400240024020030e0700010203040506000b200120044101106d2001280200200141086a220328020022046a41003a00002003200441016a3602002001200041086a10a70120002d00052104200120032802004101106d2001280200200328020022066a20044101463a00002003200641016a3602002000410c6a280200200041146a2802002001109501200041186a280200200041206a28020020011095010c0a0b200120044101106d2001280200200141086a220328020022046a41013a00002003200441016a3602002001200041086a10a7010c090b200120044101106d2001280200200141086a220328020022046a41023a00002003200441016a2204360200200041086a2802002100200120044104106d2001280200200328020022016a20003600002003200141046a3602000c080b200120044101106d2001280200200141086a220328020022046a41033a00002003200441016a360200200041086a280200200041106a2802002001109501200041146a2802002000411c6a28020020011095010c070b200120044101106d2001280200200141086a220328020022046a41043a00002003200441016a3602002001200041c8006a10a701200120032802004120106d2001280200200328020022066a2204200041046a2200290001370000200441186a200041196a290000370000200441106a200041116a290000370000200441086a200041096a2900003700002003200641206a36020020022001360248200041216a200241c8006a109c010c060b200120044101106d2001280200200141086a220128020022006a41053a00002001200041016a3602000c050b200120044101106d2001280200200141086a220328020022046a41063a00002003200441016a3602002001200041086a10a7010c040b2001200141086a22002802004101106d2001280200200028020022036a410d3a00002000200341016a2203360200200120034101106d2001280200200028020022016a41003a00002000200141016a3602000c030b200120044101106d2001280200200141086a220328020022046a41033a00002003200441016a22043602002000410c6a2802002106200120044104106d2001280200200328020022046a20063600002003200441046a360200200041106a280200200041186a28020020011095010c020b200120044101106d2001280200200141086a220428020022066a41023a00002004200641016a22063602002000412c6a2802002107200120064104106d2001280200200428020022066a20073600002004200641046a2206360200200041306a2903002105200041386a290300210c200120064110106d2001280200200428020022006a2206200c370008200620053700002004200041106a2200360200200120004120106d2001280200200428020022006a22012003290001370000200141186a200341196a290000370000200141106a200341116a290000370000200141086a200341096a2900003700002004200041206a3602000c010b200120044101106d2001280200200141086a220328020022046a41013a00002003200441016a2204360200200120044120106d2001280200200328020022066a2204200041c4006a290000370000200441186a200041dc006a290000370000200441106a200041d4006a290000370000200441086a200041cc006a2900003700002003200641206a3602002001200041e4006a10ad012001200041c5016a10ad0120012000410c6a10ae01200041206a2802002104200120032802004104106d2001280200200328020022066a20043600002003200641046a36020020022001360248200041246a200241c8006a109c010b200241e0006a24000ba917030a7f017e027f23004180056b220224000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012802042203450d00200128020022042d0000210520012003417f6a22063602042001200441016a360200200541054b0d0720050e06010203040506010b200041073a00000c150b20064104490d082004280001210720012003417b6a22053602042001200441056a3602002005450d0920042d0005210520012003417a6a22063602042001200441066a2208360200200541014b0d09410021090240024020050e020100010b20064104490d0a2004280006210a2001200341766a220536020420012004410a6a36020020054104490d0a200428000a210b2001200341726a220636020420012004410e6a2208360200410121090b02402006450d0020082d0000210520012006417f6a3602042001200841016a360200200241d0026a200110b60220022802d0022101200241246a200241d0026a41047241ac0210cf061a0240024020014117460d00200241d0026a200241246a41ac0210cf061a41b002102422030d010c160b200041073a00000c160b20032001360200200341046a200241d0026a41ac0210cf061a200041146a2003360200200041106a200b3602002000410c6a200a360200200041086a2009360200200041046a2007360200200020053a0001200041013a0000200041186a2002290218370200200041206a200241186a41086a2802003602000c150b200041073a00000c140b20064104490d092004280001210620012003417b6a22053602042001200441056a360200024020054104490d00200428000521052001200341776a3602042001200441096a360200200041023a0000200020022f00243b0001200041086a2005360200200041046a20063602002000410c6a20022902d002370200200041036a200241246a41026a2d00003a0000200041146a200241d0026a41086a2902003702002000411c6a200241e0026a2902003702000c140b200041073a00000c130b20022001108f0120022802000d102001280204220520022802042203490d102003417f4c0d090240024020030d0041002104410121060c010b2003102a2206450d0e20012802042105200321040b0240024020052003490d0020062001280200200310cf0621052001280204220620034f0d012003200641b8afc0001048000b2004450d11200610260c110b2001200620036b3602042001200128020020036a3602002005450d102003ad4220862004ad84220ca7210302400240024002400240200128020422044104490d0020012802002206280000210a20012004417c6a22073602042001200641046a22063602002007450d0120062d0000210720012004417b6a22083602042001200641016a2209360200200741014b0d014100210d0240024020070e020100010b20084104490d022006280001210b2001200441776a22073602042001200641056a36020020074104490d022006280005210e2001200441736a22083602042001200641096a22093602004101210d0b2008450d0320092d0000210620012008417f6a3602042001200941016a360200200241d0026a200110b60220022802d0022101200241246a200241d0026a41047241ac0210cf061a20014117470d02200041073a00002003450d170c040b200041073a00002003450d16200510260c160b200041073a00002003450d15200510260c150b200241d0026a200241246a41ac0210cf061a41b00210242204450d1320042001360200200441046a200241d0026a41ac0210cf061a200020063a0001200041033a0000200041206a20043602002000411c6a200e360200200041186a200b360200200041146a200d360200200041106a200a3602002000410c6a200c422088a7360100200041086a2003360100200041046a2005360100200041026a20022f01183b01000c140b200041073a00002003450d130b200510260c120b200241086a2001108f0120022802080d0e20012802042205200228020c2203490d0e2003417f4c0d080240024020030d0041002104410121060c010b2003102a2206450d0d20012802042105200321040b0240024020052003490d0020062001280200200310cf0621052001280204220620034f0d012003200641b8afc0001048000b2004450d0f200610260c0f0b2001200620036b3602042001200128020020036a3602002005450d0e200041043a0000200020022f00243b0001200041086a2003ad4220862004ad84370000200041046a2005360000200041106a20022902d002370200200041036a200241266a2d00003a0000200041186a200241d0026a41086a290200370200200041206a200241d0026a41106a2802003602000c110b20064104490d082004280001210720012003417b6a22053602042001200441056a3602002005450d0920042d0005210520012003417a6a22063602042001200441066a2208360200200541014b0d09410021090240024020050e020100010b20064104490d0a2004280006210a2001200341766a220536020420012004410a6a36020020054104490d0a200428000a210b2001200341726a220636020420012004410e6a2208360200410121090b02402006450d0020082d0000210520012006417f6a3602042001200841016a360200200241d0026a200110b60220022802d0022101200241246a200241d0026a41047241ac0210cf061a20014117460d0b200241d0026a200241246a41ac0210cf061a41b00210242203450d1020032001360200200341046a200241d0026a41ac0210cf061a200041146a2003360200200041106a200b3602002000410c6a200a360200200041086a2009360200200041046a2007360200200020053a0001200041053a0000200041186a2002290218370200200041206a200241186a41086a2802003602000c110b200041073a00000c100b200241106a2001108f0120022802100d022001280204220520022802142203490d022003417f4c0d060240024020030d0041002104410121060c010b2003102a2206450d0b20012802042105200321040b024020052003490d0020062001280200200310cf0621052001280204220620034f0d022003200641b8afc0001048000b2004450d02200610260c020b200041073a00000c0e0b2001200620036b3602042001200128020020036a36020020050d090b200041073a00000c0c0b200041073a00000c0b0b200041073a00000c0a0b200041073a00000c090b1034000b200041073a00000c070b200041073a00000c060b200041073a00000c050b1033000b2003ad4220862004ad84220ca7210302400240024002400240200128020422044104490d0020012802002206280000210a20012004417c6a22073602042001200641046a22063602002007450d0120062d0000210720012004417b6a22083602042001200641016a2209360200200741014b0d014100210d0240024020070e020100010b20084104490d022006280001210b2001200441776a22073602042001200641056a36020020074104490d022006280005210e2001200441736a22083602042001200641096a22093602004101210d0b2008450d0320092d0000210620012008417f6a3602042001200941016a360200200241d0026a200110b60220022802d0022101200241246a200241d0026a41047241ac0210cf061a20014117470d02200041073a00002003450d080c040b200041073a00002003450d07200510260c070b200041073a00002003450d06200510260c060b200241d0026a200241246a41ac0210cf061a41b00210242204450d0420042001360200200441046a200241d0026a41ac0210cf061a200020063a0001200041063a0000200041206a20043602002000411c6a200e360200200041186a200b360200200041146a200d360200200041106a200a3602002000410c6a200c422088a7360100200041086a2003360100200041046a2005360100200041026a20022f01183b01000c050b200041073a00002003450d040b200510260c030b200041073a00000c020b200041073a00000c010b102c000b20024180056a24000bfe1704067f017e027f017e230041a0056b22022400024002400240024002400240024002400240024002400240024002400240024002400240024002400240200128020022032802042204450d00200328020022052d0000210620032004417f6a3602042003200541016a360200200641054b0d0720060e06010203040506010b200041073a00000c130b2001280200220328020422064104490d0820032802002204280000210520032006417c6a3602042003200441046a360200200241f0026a2001109c0420022802f0024102460d09200241386a41086a200241f0026a41086a280200360200200220022903f00237033802400240200128020022032802042206450d00200328020022042d0000210720032006417f6a3602042003200441016a3602002001200128020441016a2203360204200320012802084b0d01200241f0026a200110b40220022802f0022103200241c4006a200241f0026a41047241ac0210cf061a20034117460d01200241f0026a200241c4006a41ac0210cf061a41b00210242206450d1120062003360200200641046a200241f0026a41ac0210cf061a200241286a41086a200241386a41086a280200220336020020012001280204417f6a360204200220022903382208370328200041046a2005360200200020073a0001200041013a0000200041086a2008370200200041106a2003360200200041146a2006360200200041186a200229021c370200200041206a2002411c6a41086a2802003602000c140b200041073a00000c130b200041073a00000c120b024002402001280200220328020422064104490d0020032802002204280000210520032006417c6a3602042003200441046a3602002001280200220128020422034104490d0120012802002206280000210420012003417c6a3602042001200641046a360200200041023a0000200020022f00443b0001200041036a200241c4006a41026a2d00003a0000200041086a2004360200200041046a20053602002000410c6a20022902f002370200200041146a200241f0026a41086a2902003702002000411c6a20024180036a2902003702000c130b200041073a00000c120b200041073a00000c110b20022001108d0120022802000d0f20012802002206280204220420022802042203490d0f2003417f4c0d080240024020030d0041002105410121070c010b2003102a2207450d0c200128020022062802042104200321050b0240024020042003490d0020072006280200200310cf0621042006280204220720034f0d012003200741b8afc0001048000b2005450d10200710260c100b2006200720036b3602042006200628020020036a3602002004450d0f2003ad4220862005ad842208a72106024002402001280200220328020422054104490d0020032802002207280000210920032005417c6a3602042003200741046a360200200241f0026a2001109c0420022802f0024102470d01200041073a00002006450d12200410260c120b200041073a00002006450d11200410260c110b200241386a41086a200241f0026a41086a280200360200200220022903f00237033802400240200128020022032802042205450d00200328020022072d0000210a20032005417f6a3602042003200741016a3602002001200128020441016a2203360204200320012802084b0d01200241f0026a200110b40220022802f0022103200241c4006a200241f0026a41047241ac0210cf061a20034117460d01200241f0026a200241c4006a41ac0210cf061a41b00210242205450d0f20052003360200200541046a200241f0026a41ac0210cf061a200241286a41086a200241386a41086a280200220336020020012001280204417f6a36020420022002290338220b3703282000200a3a0001200041033a0000200041106a20093602002000410c6a2008422088a7360100200041086a2006360100200041046a2004360100200041026a20022f011c3b0100200041146a200b3702002000411c6a2003360200200041206a20053602000c120b200041073a00002006450d11200410260c110b200041073a00002006450d10200410260c100b200241086a2001108d0120022802080d0d200128020022062802042204200228020c2203490d0d2003417f4c0d070240024020030d0041002101410121050c010b2003102a2205450d0b200128020022062802042104200321010b0240024020042003490d0020052006280200200310cf0621042006280204220520034f0d012003200541b8afc0001048000b2001450d0e200510260c0e0b2006200520036b3602042006200628020020036a3602002004450d0d200041043a0000200020022f00443b0001200041086a2003ad4220862001ad84370000200041046a2004360000200041106a20022902f002370200200041036a200241c6006a2d00003a0000200041186a200241f0026a41086a290200370200200041206a200241f0026a41106a2802003602000c0f0b2001280200220328020422064104490d0720032802002204280000210520032006417c6a3602042003200441046a360200200241f0026a2001109c0420022802f0024102460d08200241386a41086a200241f0026a41086a280200360200200220022903f00237033802400240200128020022032802042206450d00200328020022042d0000210720032006417f6a3602042003200441016a3602002001200128020441016a2203360204200320012802084b0d01200241f0026a200110b40220022802f0022103200241c4006a200241f0026a41047241ac0210cf061a20034117460d01200241f0026a200241c4006a41ac0210cf061a41b00210242206450d0d20062003360200200641046a200241f0026a41ac0210cf061a200241286a41086a200241386a41086a280200220336020020012001280204417f6a360204200220022903382208370328200041046a2005360200200020073a0001200041053a0000200041086a2008370200200041106a2003360200200041146a2006360200200041186a200229021c370200200041206a2002411c6a41086a2802003602000c100b200041073a00000c0f0b200041073a00000c0e0b200241106a2001108d0120022802100d0220012802002206280204220420022802142203490d022003417f4c0d050240024020030d0041002105410121070c010b2003102a2207450d09200128020022062802042104200321050b024020042003490d0020072006280200200310cf0621042006280204220720034f0d022003200741b8afc0001048000b2005450d02200710260c020b200041073a00000c0c0b2006200720036b3602042006200628020020036a36020020040d070b200041073a00000c0a0b200041073a00000c090b200041073a00000c080b1034000b200041073a00000c060b200041073a00000c050b1033000b2003ad4220862005ad842208a72106024002402001280200220328020422054104490d0020032802002207280000210920032005417c6a3602042003200741046a360200200241f0026a2001109c0420022802f0024102470d01200041073a00002006450d05200410260c050b200041073a00002006450d04200410260c040b200241386a41086a200241f0026a41086a280200360200200220022903f00237033802400240200128020022032802042205450d00200328020022072d0000210a20032005417f6a3602042003200741016a3602002001200128020441016a2203360204200320012802084b0d01200241f0026a200110b40220022802f0022103200241c4006a200241f0026a41047241ac0210cf061a20034117460d01200241f0026a200241c4006a41ac0210cf061a41b00210242205450d0220052003360200200541046a200241f0026a41ac0210cf061a200241286a41086a200241386a41086a280200220336020020012001280204417f6a36020420022002290338220b3703282000200a3a0001200041063a0000200041106a20093602002000410c6a2008422088a7360100200041086a2006360100200041046a2004360100200041026a20022f011c3b0100200041146a200b3702002000411c6a2003360200200041206a20053602000c050b200041073a00002006450d04200410260c040b200041073a00002006450d03200410260c030b102c000b200041073a00000c010b200041073a00000b200241a0056a24000bea0101047f0240024002400240200128020022022802042203450d00200228020022042d0000210520022003417f6a3602042002200441016a360200200541014b0d0120050e020203020b200041023602000f0b200041023602000f0b200041003602000f0b02402001280200220228020422054104490d0020022802002203280000210420022005417c6a3602042002200341046a3602002001280200220228020422014104490d00200020043602042000410136020020022802002205280000210320022001417c6a3602042002200541046a360200200041086a20033602000f0b200041023602000bd11303067f017e067f230041d0036b2202240002400240024002400240024020012802042203450d00200128020022042d0000210520012003417f6a22063602042001200441016a3602002005417f6a220541024b0d0420050e03010203010b200042033703000c040b024020064104490d002004280001210720012003417b6a22053602042001200441056a36020020054108490d00200429000521082001200341736a220936020420012004410d6a36020041002105200241003a0028200341726a21030240034020092005460d01200241086a20056a200420056a2206410d6a2d00003a00002001200336020420012006410e6a3602002002200541016a22063a00282003417f6a21032006210520064120470d000b20024190036a41086a2205200241086a41086a29030037030020024190036a41106a2203200241086a41106a29030037030020024190036a41186a2209200241086a41186a2903003703002002200229030837039003410121040240200641ff01714120490d00200241f0026a41186a2009290300370300200241f0026a41106a2003290300370300200241f0026a41086a200529030037030020022002290390033703f002410021040b200241b0026a41086a200241f0026a41086a290300370300200241b0026a41106a200241f0026a41106a290300370300200241b0026a41186a200241f0026a41186a290300370300200220022903f0023703b00220040d01200241f0016a41086a2204200241b0026a41086a290300370300200241f0016a41106a2205200241b0026a41106a290300370300200241f0016a41186a2203200241b0026a41186a290300370300200220022903b0023703f001200241086a2001109e0420022d00084101460d01200241a8016a2201200241c1006a290000370300200241a0016a2206200241396a29000037030020024198016a2209200241316a29000037030020024190016a220a200241296a290000370300200241f0006a41186a220b200241216a290000370300200241f0006a41106a220c200241196a290000370300200241f0006a41086a220d200241116a290000370300200241d0016a41086a220e2004290300370300200241d0016a41106a22042005290300370300200241d0016a41186a2205200329030037030020022002290009370370200220022903f0013703d001200241b0016a41186a22032005290300370300200241b0016a41106a22052004290300370300200241b0016a41086a2204200e290300370300200220022903d0013703b001200041106a20073602002000200837030820004200370300200020022903b0013702142000411c6a2004290300370200200041246a20052903003702002000412c6a2003290300370200200020022903703702342000413c6a200d290300370200200041c4006a200c290300370200200041cc006a200b290300370200200041d4006a200a290300370200200041dc006a2009290300370200200041e4006a2006290300370200200041ec006a20012903003702000c050b0240200541ff0171450d00200241003a00280b200241b0026a41086a200241f0026a41086a290300370300200241b0026a41106a200241f0026a41106a290300370300200241b0026a41186a200241f0026a41186a290300370300200220022903f0023703b0020b200042033703000c030b024020064104490d002004280001210620012003417b6a22053602042001200441056a36020020054108490d0020004201370300200429000521082001200341736a36020420012004410d6a360200200041106a200636020020002008370308200041146a200241086a41e40010cf061a0c030b200042033703000c020b024020064104490d002004280001210720012003417b6a22053602042001200441056a36020020054108490d00200429000521082001200341736a220936020420012004410d6a36020041002105200241003a0028200341726a21030240034020092005460d01200241086a20056a200420056a2206410d6a2d00003a00002001200336020420012006410e6a3602002002200541016a22063a00282003417f6a21032006210520064120470d000b20024190036a41086a2205200241086a41086a29030037030020024190036a41106a2203200241086a41106a29030037030020024190036a41186a2209200241086a41186a2903003703002002200229030837039003410121040240200641ff01714120490d00200241f0026a41186a2009290300370300200241f0026a41106a2003290300370300200241f0026a41086a200529030037030020022002290390033703f002410021040b200241b0026a41086a200241f0026a41086a290300370300200241b0026a41106a200241f0026a41106a290300370300200241b0026a41186a200241f0026a41186a290300370300200220022903f0023703b00220040d01200241f0016a41086a2204200241b0026a41086a290300370300200241f0016a41106a2205200241b0026a41106a290300370300200241f0016a41186a2203200241b0026a41186a290300370300200220022903b0023703f001200241086a2001109e0420022d00084101460d01200241a8016a2201200241c1006a290000370300200241a0016a2206200241396a29000037030020024198016a2209200241316a29000037030020024190016a220a200241296a290000370300200241f0006a41186a220b200241216a290000370300200241f0006a41106a220c200241196a290000370300200241f0006a41086a220d200241116a290000370300200241d0016a41086a220e2004290300370300200241d0016a41106a22042005290300370300200241d0016a41186a2205200329030037030020022002290009370370200220022903f0013703d001200241b0016a41186a22032005290300370300200241b0016a41106a22052004290300370300200241b0016a41086a2204200e290300370300200220022903d0013703b001200041106a20073602002000200837030820004202370300200020022903b0013702142000411c6a2004290300370200200041246a20052903003702002000412c6a2003290300370200200020022903703702342000413c6a200d290300370200200041c4006a200c290300370200200041cc006a200b290300370200200041d4006a200a290300370200200041dc006a2009290300370200200041e4006a2006290300370200200041ec006a20012903003702000c030b0240200541ff0171450d00200241003a00280b200241b0026a41086a200241f0026a41086a290300370300200241b0026a41106a200241f0026a41106a290300370300200241b0026a41186a200241f0026a41186a290300370300200220022903f0023703b0020b200042033703000c010b200042033703000b200241d0036a24000bd211010b7f230041b0036b2202240020024180016a200110dc01200241c0006a41086a220120024189016a290000370300200241c0006a41106a220320024191016a290000370300200241c0006a41186a220420024199016a290000370300200241c0006a41206a2205200241a1016a290000370300200241c0006a41286a2206200241a9016a290000370300200241c0006a41306a2207200241b1016a290000370300200241c0006a41386a2208200241b9016a2900003703002002200229008101370340024002400240024020022d0080014101460d00200241386a22092008290300370300200241306a22082007290300370300200241286a22072006290300370300200241206a22062005290300370300200241186a22052004290300370300200241106a220a2003290300370300200241086a220b20012903003703002002200229034037030020024198026a41186a200929030037030020024198026a41106a200829030037030020024198026a41086a20072903003703002002200629030037039802200420052903003703002003200a2903003703002001200b2903003703002002200229030037034020024180016a200241c0006a106a0240024020022d0080014101460d0020024190036a410f6a200241c0006a410f6a29000037000020024190036a41086a200241c0006a41086a290000370300200220022900403703900341012101410221050c010b200241ae036a20022d0083013a000020024198036a2002418d016a2900003703002002419f036a20024194016a2900003700002002418c036a200241a0016a2d00003a0000200220022f0081013b01ac0320022002290085013703900320022002419c016a280200360288034100210120022d00840121050b20024184036a41026a2206200241ac036a41026a2d00003a0000200241e8026a41086a220320024190036a41086a290300370300200241e8026a410f6a220420024190036a410f6a290000370000200241e0026a41046a220720024188036a41046a2d00003a0000200220022f01ac033b01840320022002290390033703e80220022002280288033602e00220010d01200241dc026a41026a20062d00003a0000200241c0026a41086a2003290300370300200241c0026a410f6a2004290000370000200241b8026a41046a20072d00003a0000200220022f0184033b01dc02200220022903e8023703c002200220022802e0023602b802200241c0006a41186a20024198026a41186a290300370300200241c0006a41106a20024198026a41106a290300370300200241c0006a41086a20024198026a41086a290300370300200220022903980237034020024180016a200241c0006a106a410121010240024020022d0080014101460d0020024190036a410f6a200241c0006a410f6a29000037000020024190036a41086a200241c0006a41086a2900003703002002200229004037039003410221030c010b200241ae036a20022d0083013a000020024198036a2002418d016a2900003703002002419f036a20024194016a2900003700002002418c036a200241a0016a2d00003a0000200220022f0081013b01ac0320022002290085013703900320022002419c016a280200360288034100210120022d00840121030b20024184036a41026a2207200241ac036a41026a22082d00003a0000200241e8026a41086a220420024190036a41086a2209290300370300200241e8026a410f6a220620024190036a410f6a220a290000370000200241e0026a41046a220b20024188036a41046a220c2d00003a0000200220022f01ac033b01840320022002290390033703e80220022002280288033602e00202402001450d0020024180016a410f6a200629000037000020024180016a41086a2004290300370300200220022903e8023703800141012101200321050c030b20024194026a41026a20072d00003a000020092004290300370300200a2006290000370000200c200b2d00003a00002008200241dc026a41026a2d00003a0000200220022f0184033b019402200220022903e80237039003200220022802e00236028803200220022f01dc023b01ac0320024180016a410f6a2201200241c0026a410f6a29000037000020024180016a41086a2204200241c0026a41086a290300370300200220022903c00237038001200241e8026a41046a200241b8026a41046a2d00003a0000200220022802b8023602e802200241c0006a410f6a2001290000370000200241c0006a41086a20042903003703002002200229038001370340410021010c020b200041013a00000c020b20024180016a410f6a200429000037000020024180016a41086a2003290300370300200220022903e80237038001410121010b20024190026a41026a2204200241ac036a41026a2d00003a0000200241f8016a41086a2206200241c0006a41086a290300370300200241f8016a410f6a2207200241c0006a410f6a290000370000200241f0016a41046a2208200241e8026a41046a2d00003a0000200241ec016a41026a220920024194026a41026a2d00003a0000200220022f01ac033b019002200220022903403703f801200220022802e8023602f001200220022f0194023b01ec01200241d0016a410f6a220a20024190036a410f6a290000370000200241d0016a41086a220b20024190036a41086a290300370300200241c8016a41046a220c20024188036a41046a2d00003a000020022002290390033703d00120022002280288033602c801024020010d00200020022f0190023b0001200041046a20053a0000200041056a20022903f8013700002000411c6a20022802f001360000200041216a20022f01ec013b0000200041036a20042d00003a00002000410d6a2006290300370000200041146a2007290000370000200041206a20082d00003a0000200041236a20092d00003a0000200041246a20033a0000200041003a0000200041256a20022903d0013700002000412d6a200b290300370000200041346a200a2900003700002000413c6a20022802c801360000200041c0006a200c2d00003a00000c010b200041013a00000b200241b0036a24000bd40302037f027e024020002d0000220241024b0d0002400240024020020e03000102000b2001200141086a22022802004101106d2001280200200228020022036a41003a00002002200341016a2203360200200120034120106d2001280200200228020022046a22032000290001370000200341186a200041196a290000370000200341106a200041116a290000370000200341086a200041096a2900003700002002200441206a2203360200200041c8006a2903002105200041d0006a2903002106200120034110106d2001280200200228020022036a22042006370008200420053700002002200341106a2203360200200120034120106d2001280200200228020022036a2201200041216a290000370000200141186a200041396a290000370000200141106a200041316a290000370000200141086a200041296a2900003700002002200341206a3602000f0b2001200141086a22022802004101106d2001280200200228020022036a41013a00002002200341016a360200200041046a2802002000410c6a28020020011095010f0b2001200141086a22022802004101106d2001280200200228020022036a41023a00002002200341016a360200200041046a2802002000410c6a28020020011095010b0b0d00200141a3f3c600410210490b1300200041033602042000419488c4003602000b130020004103360204200041bc8ac4003602000b130020004108360204200041908cc4003602000bee1907047f017e027f047e0a7f017e027f23002202210320024180036b41607122022400200241c0006a200110a50420022802402104200220022802482205360294012002200436029001200241c0016a200420051082020240024020022802c00122050d00420021060c010b20022802c4012107024002400240200241c8016a28020022084110490d0020084170714110460d002008417c714120470d010b200241003602e801200242013703e0012002410e3602ac01200220024190016a3602a8012002200241e0016a36026820024194026a410136020020024201370284022002418c8dc600360280022002200241a8016a36029002200241e8006a41c4e1c00020024180026a10351a20022802e00120022802e801108402024020022802e401450d0020022802e00110260b420021060c010b200541186a2900002109200541086a290000210a2005290010210b2005290000210c20052800202108420121060b2007450d00200510260b02402002280244450d00200410260b02402006500d0020024198026a2204420037030020024190026a2205420037030020024180026a41086a220742003703002002420037038002200241e0016a41808cc700410610fb012007200241e0016a41086a220d290000370300200220022900e00137038002200241e0016a41ea93c400410610fb012004200d290000370300200520022900e001370300200241286a20024180026a4120108902200241086a200942004100200228022c410020022802281b220420086b2205200520044b1bad2206420010cc06200241186a20064200200b420010cc060240024002400240024002402002290310420052200241186a41086a290300220b20022903087c2206200b54720d00200c2002290318220b56200a200656200a2006511b450d00200242f6cacda397cddbb32037033820024200200a20067d200c200b54ad7d2206200c200b7d220b200c562006200a562006200a511b22041b220937034820024200200b20041b220b3703404101210e200241013a0058200242f6cacda397cddbb32037035020024180026a200110a604200241e0016a200228028002220520022802880210a70420022902e401420020022802e00122041b21060240200228028402450d00200510260b2004410820041b210f2006a721100240024002402006422088a72211450d00200f201141057422046a2112200441606a2107200241e0016a4119722108200241c0016a41197221134101210e2002290338210a200f21040340200241a8016a41106a220d200441106a290300370300200241a8016a41086a2214200441086a290300370300200220042903003703a801200441186a2d000021052002200441196a28000036027820022004411c6a28000036007b20054103460d0120082002280278360000200841036a200228007b3600002002200d29030022063703f001200220142903003703e801200220022903a8013703e001200220053a00f801024002402006200a510d00200220022903f80122063703d801200220022903f0013703d001200220022903e8013703c801200220022903e0013703c0012006a721050c010b200241033a0098022002200229035822063703d801200220022903503703d001200220022903483703c801200220022903403703c0012002200229039002370350200220022903880237034820022002290380023703402002200229039802220c3703582006a72105200ca7210e0b200541ff01714103470d02200741606a2107200441206a22042012470d000b0b20024100360288022002420837038002201041ffffff3f71450d01200f10260c010b20024190016a41106a220820022903d00137030020024190016a41086a220d20022903c80137030020022013280000360280012002201341036a28000036008301200220022903c00137039001200220022802800136028801200220022800830136008b01412010242214450d022014200229039001370300201420053a001820142002280288013600192014411c6a200228008b01360000201441106a2008290300370300201441086a200d290300370300200242818080801037026c2002201436026802402007450d00200441206a21072011410574200f6a41606a2115200241e0016a4119722108200241c0016a4119722113410121110340200721040340200241a8016a41106a2207200441106a290300370300200241a8016a41086a220d200441086a290300370300200220042903003703a801200441186a2d000021052002200441196a28000036027820022004411c6a28000036007b20054103460d0220082002280278360000200841036a200228007b3600002002200729030022063703f0012002200d2903003703e801200220022903a8013703e001200220053a00f8010240024020062002290338510d00200220022903f80122063703d801200220022903f0013703d001200220022903e8013703c801200220022903e0013703c0012006a721050c010b200241033a0098022002200229035822063703d801200220022903503703d001200220022903483703c801200220022903403703c0012002200229039002370350200220022903880237034820022002290380023703402002200229039802220a3703582006a72105200aa7210e0b0240200541ff01714103470d00200441206a22042012470d010c030b0b20024190016a41106a220720022903d00137030020024190016a41086a220d20022903c80137030020022013280000360280012002201341036a28000036008301200220022903c00137039001200220022802800136028801200220022800830136008b0120024180026a41086a2216200d29030037030020024180026a41106a220d200729030037030020022002290390013703800220022002280288013602e0012002200228008b013600e30102402011200228026c470d00200241e8006a201110ed01200228026821140b200441206a210720162903002106200d290300210a200229038002210c201420114105746a220d20053a0018200d200c370300200d20022802e001360019200d411c6a20022800e301360000200d41106a200a370300200d41086a20063703002002201141016a221136027020152004470d000b0b0240201041ffffff3f71450d00200f10260b20024180026a41086a200241e8006a41086a28020036020020022002290368370380020b02400240200e41ff01714103470d00200228028002210420022802880221050c010b200229035821062002290350210a2002290348210c2002290340211702402002280288022205200228028402470d0020024180026a200510ed0120022802880221050b200228028002220420054105746a2208200a3703102008200c37030820082017370300200841186a20063703002002200541016a2205360288020b20012004200510a804024020022802840241ffffff3f71450d00200410260b200241b8026a2009370300200241b0026a200b37030020024180026a41086a41003a000020024189026a200129000037000020024191026a200141086a29000037000020024199026a200141106a290000370000200241a1026a200141186a2900003700002002410b3a00800220024180026a1087020c050b200242f6cacda397cddbb32037033020024180026a200110a604200241e0016a200228028002220520022802880210a70420022902e401420020022802e00122041b210b0240200228028402450d00200510260b2004410820041b2118200b422088a72207450d03200241206a2112410021052018210441002108034002400240024020122004460d00200441106a22142900002002290330510d0020050d01410021050c020b200541016a21050c010b200820056b220d20074f0d0320024180026a41186a220e200420054105746b220d41186a220f29030037030020024180026a41106a2210200d41106a221129030037030020024180026a41086a2213200d41086a22152903003703002002200d29030037038002200441086a221629030021062014290300210a200441186a2219290300210c200d2004290300370300200f200c3703002011200a370300201520063703002019200e290300370300201420102903003703002016201329030037030020042002290380023703000b200441206a21042007200841016a2208460d030c000b0b1033000b200d20074198e2c4001032000b2005417f6a20074f0d00200b42ffffffff0f83210b200720056b21070b20012018200710a8040240200b42ffffff3f83500d00201810260b20024180026a200110a504200228028002220420022802880210ff010240200228028402450d00200410260b20024180026a41086a41013a000020024189026a200129000037000020024191026a200141086a29000037000020024199026a200141106a290000370000200241a1026a200141186a2900003700002002410b3a00800220024180026a1087020b200041043a0000200324000f0b2000410110ea02200324000b8d0401057f230041e0006b22022400200241a18dc700410710fb01200241106a41a18dc700410710fb0102400240412010242203450d002002422037023420022003360230200241306a41004120106d20022802302203200228023822046a22052001290000370000200541086a200141086a290000370000200541106a200141106a290000370000200541186a200141186a2900003700002002200441206a2201360238200241c0006a2003200110bc02200241dc006a200320016a360200200220033602582002200241c0006a41106a3602542002200241c0006a360250200241206a200241d0006a107302402002280234450d00200310260b2002280228220341206a2205417f4c0d010240024020050d0041012101410021050c010b200510242201450d010b20002001360200200041086a220141003602002000200536020420004100411010c9012000280200200128020022056a220420022900003700002001200541106a2205360200200441086a200241086a29000037000020002005411010c9012000280200200128020022056a220420022900103700002001200541106a2206360200200441086a200241106a41086a2900003700002002280220210520002006200310c9012000280200200128020022006a2005200310cf061a2001200020036a36020002402002280224450d00200510260b200241e0006a24000f0b1033000b1034000b8d0401057f230041e0006b220224002002419a8cc700410810fb01200241106a41a8dec300410510fb0102400240412010242203450d002002422037023420022003360230200241306a41004120106d20022802302203200228023822046a22052001290000370000200541086a200141086a290000370000200541106a200141106a290000370000200541186a200141186a2900003700002002200441206a2201360238200241c0006a2003200110bc02200241dc006a200320016a360200200220033602582002200241c0006a41106a3602542002200241c0006a360250200241206a200241d0006a107302402002280234450d00200310260b2002280228220341206a2205417f4c0d010240024020050d0041012101410021050c010b200510242201450d010b20002001360200200041086a220141003602002000200536020420004100411010c9012000280200200128020022056a220420022900003700002001200541106a2205360200200441086a200241086a29000037000020002005411010c9012000280200200128020022056a220420022900103700002001200541106a2206360200200441086a200241106a41086a2900003700002002280220210520002006200310c9012000280200200128020022006a2005200310cf061a2001200020036a36020002402002280224450d00200510260b200241e0006a24000f0b1033000b1034000b800604067f017e037f027e230041f0006b220324002003200236020c20032001360208200341106a2001200210820202400240200328021022040d00200041003602000c010b200328021421052003200341186a280200360224200320043602202003200341206a108f010240024020032802000d000240024002402003280204220620032802244105762201200120064b1b22014105742202417f4c0d000240024020010d00410821070c010b200210242207450d020b41002102200341003602602003200136025c2003200736025802402006450d002003413b6a21080340200341286a200341206a10d80420032d00284101460d04200328022422014110490d04200329002921092003200141706a220a36022420032003280220220b41106a220c360220200a450d04200b41086a290000210d200b290000210e20032001416f6a3602242003200c41016a360220200c2d0000220141024b0d044100210b02400240024020010e03020001020b4101210b0c010b4102210b0b20032003280038360250200320082800003600532003200328005336004b20032003280250360248200320032802483602402003200328004b36004302402002200328025c470d00200341d8006a200210ed0120032802582107200328026021020b200720024105746a2201200b3a001820012009370310200120032802403600192001411c6a20032800433600002001200d3703082001200e3703002003200241016a22023602602006417f6a22060d000b0b2007450d032000200329025c370204200020073602000c040b1034000b1033000b200328025c41ffffff3f71450d00200710260b20034100360230200342013703282003410e36023c2003200341086a3602382003200341286a360250200341ec006a41013602002003420137025c2003418c8dc6003602582003200341386a360268200341d0006a41c4e1c000200341d8006a10351a200328022820032802301084020240200328022c450d00200328022810260b200041003602000b2005450d00200410260b200341f0006a24000bdd0e0b037f027e017f047e027f037e027f027e017f017e017f230041d0026b22032400200341206a200010d803200341306a200328022022042003280228220510d903200329033021064200210720034200370330200341306a41186a2903004200200642015122081b21092003290340420020081b210a2003290338420020081b210b200341306a41206a290300420020081b210c200341f8006a280200210d20032d007c210e0240024020020d004200210f42002110420021110c010b20024105742112420021074200210f4200211042002111200121080340024002400240200841186a2d00002213417f6a41ff017141014b0d002011200841086a290300221420102008290300221556201120145620112014511b22161b21112010201520161b2110201341ff01714102460d010c020b201341ff01710d01200841086a2903002114200829030021150b200f20142007201556200f201456200f2014511b22131b210f2007201520131b21070b200841206a2108201241606a22120d000b0b200341b8016a200f370300200341a8016a221220113703002003200b37038001200320073703b001200320103703a0012003200c370398012003200a37038801200320093703900102400240427f200b20097c22142014200b542208200a200c7c2008ad7c2214200a542014200a511b22081b22114280c8afa025544100427f201420081b2215501b0d0020034190016a2903002111200341b0016a290300211520122903002110200341a0016a29030021072003290388012109200329038001210c4201211420032903980121170c010b024002402009200b84200c200a848450450d00420021140c010b42002114200341d0016a41186a22124200370300200341d0016a41106a22134200370300200341d0016a41086a22084200370300200342003703d001200341c0016a419a8cc700410810fb012008200341c0016a41086a2216290000370300200320032900c0013703d001200341c0016a41b8a1c300410d10fb0120122016290000370300201320032900c001370300200341086a200341d0016a108d02200341086a41106a29030021102003290310210720032802082118201242003703002013420037030020084200370300200342003703d001200341c0016a419a8cc700410810fb0120082016290000370300200320032900c0013703d001200341c0016a41b8a1c300410d10fb0120122016290000370300201320032900c001370300200342002010420020181b221020157d2007420020181b2207201154ad7d2209200720117d220c200756200920105620092010511b22121b3703c80120034200200c20121b3703c001200341d0016a4120200341c0016a411010b30120034188026a201537030020034180026a2011370300200841013a0000200341d9016a2000290000370000200341e1016a200041086a290000370000200341e9016a200041106a290000370000200341f1016a200041186a290000370000200341023a00d001200341d0016a1087020b0b200341d8006a2007370300200341f0006a200f370300200341e0006a2010370300200341c0006a2009370300200341e8006a2015370300200341c8006a2011370300200320173703502003200c3703382003200e4100200642015122081b3a007c2003200d410020081b360278200320144201512208ad3703300240024020080d002004200510ff010c010b20042005200341386a10da030b02402003280224450d00200410260b20144201522108024002400240200642015122120d002008450d010b2012200871450d01200341d0016a41086a41043a0000200341d9016a2000290000370000200341e1016a200041086a290000370000200341e9016a200041106a290000370000200341f1016a200041186a290000370000200341003a00d001200341d0016a1087020c010b200341d0016a41086a41033a0000200341d9016a2000290000370000200341e1016a200041086a290000370000200341e9016a200041106a290000370000200341f1016a200041186a290000370000200341003a00d001200341d0016a1087020b024020064201510d0020034188026a200a37030020034180026a200b370300200341d0016a41086a41003a0000200341d9016a2000290000370000200341e1016a200041086a290000370000200341e9016a200041106a290000370000200341f1016a200041186a290000370000200341023a00d001200341d0016a1087020b200341d0016a200010a604200320032802d001221220032802d80141d4c0c7004100410010810220032802002108024020032802d401450d00201210260b024002402002450d00200341306a200010a6042003280238211320032802302112200341d0016a200120021091042012201320032802d001221620032802d80110b301024020032802d401450d00201610260b02402003280234450d00201210260b20084101460d01200010d4030c010b200341d0016a200010a60420032802d001221220032802d80110ff01024020032802d401450d00201210260b20084101470d00200010d6030b200341d0026a24000bb20301057f230041c0006b220724000240024002402002200384500d00200741106a200110a504200741086a20072802102208200728021841d4c0c700410041001081022007280208210902402007280214450d00200810260b20094101470d012000410210ea020c020b200041043a00000c010b200741306a200110a5042007280238210a200728023021092007410036021820074201370310200741106a41004110106d2007280210200728021822086a220b2003370008200b20023700002007200841106a2208360218200741106a20084110106d2007280210200728021822086a220b2005370008200b20043700002007200841106a2208360218200741106a20084104106d200728021022082007280218220b6a20063600002007200b41046a22063602182009200a2008200610b30102402007280214450d00200810260b02402007280234450d00200910260b200741106a41186a200141186a290000370300200741106a41106a200141106a290000370300200741106a41086a200141086a29000037030020072001290000370310200741306a200741106a10a404200041043a00000b200741c0006a24000b990501047f230041a0036b22092400200941306a220a4200370300200941286a220b4200370300200941186a41086a420037030020094200370318200941186a41808cc700410610fb0120094188036a41ea93c400410610fb01200a20094188036a41086a290000370300200b200929008803370300200941106a200941186a41201089024100210c02400240417f2009280214410020092802101b220a20026a220b200b200a491b200220011b2202200a4d0d00024020034101470d002004410047200541014b71210c2005417f6a210a0b200941186a200841b00210cf061a200941dc026a200a36020020094184036a20063a0000200941e0026a2007290200370300200941e8026a200741086a290200370300200941f0026a200741106a290200370300200941f8026a200741186a29020037030020094180036a200741206a280200360200200920043602d8022009200c3602d40241002107200941003602c8022002200941186a10e203200941186a200210dd03200928022021082009280218210a2009419c036a41003a00002009410036029803200941086a200a200820094198036a41054100108102024002402009280208450d002009200928020c2207410520074105491b36028c03200920094198036a36028803200920094188036a108f012009280204417f6a210820092802004521070c010b0b0240200928021c450d00200a10260b200941186a41086a20023602002009410c3a0018200941186a410c6a2008410020071b22073602002009410036021c200941186a108702200041086a200736020020002002360204200041003602000c010b200041023a0006200041832c3b0104200041013602002000410c6a4117360200200041086a4193edc30036020020081098030b200941a0036a24000be30201077f230041306b22022400200241a88dc700410910fb01200241106a41aca1c300410610fb01200241206a20012802002203200128020810fd02024002402002280228220441206a2205417f4c0d000240024020050d0041012106410021050c010b200510242206450d020b20002006360200200041086a220641003602002000200536020420004100411010c9012000280200200628020022056a220720022900003700002006200541106a2205360200200741086a200241086a29000037000020002005411010c9012000280200200628020022056a220720022900103700002006200541106a2208360200200741086a200241106a41086a2900003700002002280220210520002008200410c9012000280200200628020022006a2005200410cf061a2006200020046a36020002402002280224450d00200510260b0240200141046a280200450d00200310260b200241306a24000f0b1034000b1033000bbc0701047f230041e0056b220a2400200a41e0026a200110e003200a41186a200a2802e002220b200a2802e80241d4c0c70041004100108102200a280218210c0240200a2802e402450d00200b10260b024002400240024002400240200c4101460d00200a41f8026a220c4200370300200a41f0026a220b4200370300200a41e0026a41086a4200370300200a42003703e002200a41e0026a41808cc700410610fb01200a41206a41ea93c400410610fb01200c200a41206a41086a290000370300200b200a290020370300200a41106a200a41e0026a41201089024100210d417f200a2802144100200a2802101b220b20036a220c200c200b491b200320021b220c200b4d0d03024020044101470d002005410047200641014b71210d2006417f6a21030b200a41e0026a200110c801200a41206a200941b00210cf061a200a41d8026a200a41e0026a41086a280200360200200a200a2903e0023703d002200a41e0026a200a41206a41bc0210cf061a200a41a4056a2003360200200a41a0056a2005360200200a41b0056a200841086a290200370300200a41b8056a200841106a290200370300200a41c0056a200841186a290200370300200a41c8056a200841206a280200360200200a200d36029c05200a20073a00cc05200a20082902003703a805200c200a41e0026a10e203200a41e0026a200c10dd03200a2802e8022103200a2802e002210841002109200a41d4056a41003a0000200a41003602d005200a41086a20082003200a41d0056a41054100108102200a280208450d01200a200a28020c2209410520094105491b3602dc05200a200a41d0056a3602d805200a200a41d8056a108f01200a280204417f6a2103200a2802004521090c020b200041003a0006200041832c3b0104200041013602002000410c6a4110360200200041086a4183edc3003602000c030b0b0240200a2802e402450d00200810260b200a2003410020091b22083602dc05200a200c3602d805200a41e0026a200110e003200a2802e0022209200a2802e802200a41d8056a10ad040240200a2802e402450d00200910260b200a41e0026a41086a200c360200200a410c3a00e002200a41e0026a410c6a2008360200200a41003602e402200a41e0026a108702200041086a20083602002000200c36020420004100360200200141046a280200450d02200128020010260c020b200041023a0006200041832c3b0104200041013602002000410c6a4117360200200041086a4193edc3003602000b2009109803200141046a280200450d00200128020010260b200a41e0056a24000ba80101037f230041106b220324000240410810242204450d00200342083702042003200436020020022802002104200341004104106d2003280200200328020822056a20043600002003200541046a220436020820022802042105200320044104106d20032802002202200328020822046a20053600002003200441046a2204360208200020012002200410b30102402003280204450d00200210260b200341106a24000f0b1033000bb40601047f20002d000021022001200141086a22032802004101106d2001280200200328020022046a21050240024020024101460d00200541003a00002003200441016a220236020020002d0001220341094b0d01024002400240024002400240024002400240024020030e0a00010203040506070809000b200120024101106d2001280200200141086a220128020022006a41003a00002001200041016a3602000f0b200120024101106d2001280200200141086a220128020022006a41013a00002001200041016a3602000f0b200120024101106d2001280200200141086a220128020022006a41023a00002001200041016a3602000f0b200120024101106d2001280200200141086a220128020022006a41033a00002001200041016a3602000f0b200120024101106d2001280200200141086a220128020022006a41043a00002001200041016a3602000f0b200120024101106d2001280200200141086a220128020022006a41053a00002001200041016a3602000f0b200120024101106d2001280200200141086a220128020022006a41063a00002001200041016a3602000f0b200120024101106d2001280200200141086a220328020022026a41073a00002003200241016a2202360200200041026a2d00002100200120024101106d2001280200200328020022016a20003a00002003200141016a3602000f0b200120024101106d2001280200200141086a220128020022006a41083a00002001200041016a3602000f0b200120024101106d2001280200200141086a220128020022006a41093a00002001200041016a3602000f0b200541013a00002003200441016a220236020020002d0001220341024b0d0002400240024020030e03000102000b200120024101106d2001280200200141086a220128020022006a41003a00002001200041016a3602000f0b200120024101106d2001280200200141086a220128020022006a41013a00002001200041016a3602000f0b200120024101106d2001280200200141086a220328020022026a41023a00002003200241016a2202360200200041026a2d00002100200120024101106d2001280200200328020022016a20003a00002003200141016a3602000b0bae0f01077f230041c0006b220224000240024041ca0310242203450d0020002003360200200041046a220442ca0337020020004100410210c9012000280200200041086a220528020022036a41003b00002005200341026a220336020002400240200128020022012903684202520d00024020032004280200470d0020002003410110c901200041086a28020021030b200028020020036a41043a0000200041086a2203200328020041016a3602000c010b024020032004280200470d0020002003410110c901200041086a28020021030b200141e8006a2105200028020020036a4184013a0000200041086a2203200328020041016a2204360200200020044120106d2000280200200328020022066a22042001290000370000200441186a200141186a290000370000200441106a200141106a290000370000200441086a200141086a2900003700002003200641206a2204360200024020012d0020220341024b0d0002400240024020030e03000102000b200020044101106d2000280200200041086a220428020022036a41003a00002004200341016a22033602002000200341c000106d2000280200200428020022066a2203200141216a290000370000200341386a200141d9006a290000370000200341306a200141d1006a290000370000200341286a200141c9006a290000370000200341206a200141c1006a290000370000200341186a200141396a290000370000200341106a200141316a290000370000200341086a200141296a2900003700002004200641c0006a3602000c020b200020044101106d2000280200200041086a220428020022036a41013a00002004200341016a22033602002000200341c000106d2000280200200428020022066a2203200141216a290000370000200341386a200141d9006a290000370000200341306a200141d1006a290000370000200341286a200141c9006a290000370000200341206a200141c1006a290000370000200341186a200141396a290000370000200341106a200141316a290000370000200341086a200141296a2900003700002004200641c0006a3602000c010b200020044101106d2000280200200041086a220328020022046a41023a00002003200441016a22043602002000200441c100106d2000280200200328020022046a200141216a41c10010cf061a2003200441c1006a3602000b2005200010a6020b20014198016a2000109904200041086a2802002101410410242203450d002002420437020420022003360200024002400240024041012001417e6a220120014101461b410020011b220341c000490d00200341808001490d012003418080808004490d02200241004101106d2002280200200228020822016a41033a00002002200141016a2201360208200220014104106d20022802002201200228020822046a2003360000200441046a21030c030b200241004101106d20022802002201200228020822046a20034102743a0000200441016a21030c020b200241004102106d20022802002201200228020822046a20034102744101723b0000200441026a21030c010b200241004104106d20022802002201200228020822046a2003410274410272360000200441046a21030b20022003360208200041086a2205280200220641014d0d01200241286a200120036a2204360200200220003602204100210320054100360200200241023602102002411c6a2000280200220541026a22073602002002200136022420022006417e6a220636021420022007360218200241246a21070240024002402006450d00034020012004460d032002200141016a360224200520036a20012d00003a00002000200028020841016a36020820034101460d02200341016a210320022802242101200228022821040c000b0b2000200710d8010c010b024020022802282205200228022422016b2203450d002002280220220420022802142206200228021022006a200310c90120042802002208200020036a22036a200820006a200610d0061a20022003360210200320042802082206460d00200620016a417f73200520006a6a2103200428020020066a2100034020012005460d022002200141016a360224200020012d00003a00002004200428020841016a3602082003450d01200041016a21002003417f6a210320022802242101200228022821050c000b0b2002410036023820024201370330200241306a200710d8012002280234210620022802302107024020022802382201450d0020022802202203200228021420022802106a200110c901200328020022042002280210220020016a22036a200420006a200228021410d0061a200220033602102003200228022022042802082208460d00200820006b2105200428020020086a21032007210003402001450d01200320002d00003a00002004200428020841016a360208200041016a2100200341016a210320052001417f6a2201470d000b0b2006450d00200710260b02402002280218200228021c2201460d00200220013602180b024020022802142201450d000240200228021022042002280220220541086a22002802002203460d002005280200220520036a200520046a200110d0061a200228021421010b2000200120036a3602000b02402002280204450d00200228020010260b200241c0006a24000f0b1033000b410220061040000b980301057f230041d0006b22022400200241086a41808cc700410610fb01200241186a41e992c400410910fb0120022001360234200241386a200241346a410410a202200241cc006a200241346a41046a3602002002200241c0006a3602442002200241346a3602482002200241386a360240200241286a200241c0006a1073024002402002280230220341206a2204417f4c0d000240024020040d0041012101410021040c010b200410242201450d020b20002001360200200041086a220141003602002000200436020420004100411010c9012000280200200128020022046a220520022900083700002001200441106a2204360200200541086a200241086a41086a29000037000020002004411010c9012000280200200128020022046a220520022900183700002001200441106a2206360200200541086a200241186a41086a2900003700002002280228210420002006200310c9012000280200200128020022006a2004200310cf061a2001200020036a3602000240200228022c450d00200410260b200241d0006a24000f0b1034000b1033000bcc0101027f20002802242101024020002d00000d0020002d0001210020012001280200417f6a2202360200024020020d002001280208200128020c2802001103000240200128020c280204450d00200128020810260b20012001280204417f6a220236020420020d00200110260b200041ff01714102470f0b20012001280200417f6a2200360200024020000d002001280208200128020c2802001103000240200128020c280204450d00200128020810260b20012001280204417f6a220036020420000d00200110260b41010bf10401057f23004180016b22022400200241386a41808cc700410610fb01200241d8006a41e992c400410910fb012002200136027c200241286a200241fc006a410410a2022002410c6a200241fc006a41046a3602002002200241306a3602042002200241fc006a3602082002200241286a360200200241c8006a20021073024002402002280250220141206a2203417f4c0d000240024020030d0041012104410021030c010b200310242204450d020b20024100360230200220043602282002200336022c200241286a4100411010c9012002280228200228023022036a22042002290038370000200441086a200241386a41086a2900003700002002200341106a2203360230200241286a2003411010c9012002280228200228023022036a22042002290058370000200441086a200241d8006a41086a22052900003700002002200341106a220436023020022802482103200241286a2004200110c90120022802282204200228023022066a2003200110cf061a2002200620016a22013602300240200228024c450d00200310260b20022004200110b8032005200241096a290000370300200241d8006a41106a200241116a290000370300200241d8006a41186a2201200241196a290000370300200220022900013703580240024020022d00004101460d0020004200370000200041186a4200370000200041106a4200370000200041086a42003700000c010b20002002290358370000200041186a2001290300370000200041106a200241d8006a41106a290300370000200041086a200241d8006a41086a2903003700000b0240200228022c450d00200410260b20024180016a24000f0b1034000b1033000b980b01077f230041c0006b22052400200541186a22064200370300200541106a22074200370300200541086a2208420037030020054200370300200541206a41808cc700410610fb012008200541206a41086a220929000037030020052005290020370300200541206a41fcbfc400410e10fb01200620092900003703002007200529002037030020054102200510b4044100210a2005410036020041da93c40041102005410410b30120064200370300200742003703002008420037030020054200370300200541206a41808cc700410610fb012008200929000037030020052005290020370300200541206a41ea93c400410610fb0120062009290000370300200720052900203703002005200036022020054120200541206a410410b30120064200370300200742003703002008420037030020054200370300200541206a41808cc700410610fb012008200929000037030020052005290020370300200541206a41f093c400410610fb012006200929000037030020072005290020370300024002402003280208220841246c41046a2209417f4c0d00200328020021060240024020090d00410121030c010b200910242203450d022009210a0b20054100360238200520033602302005200a360234200541306a200810a1010240024020080d002005280230210b200528023821030c010b200841246c210a200528023821030340200541206a200610a20120052802202109200541306a200320052802282208106d2005280230220b200528023822036a2009200810cf061a2005200320086a220336023802402005280224450d00200910260b200641246a2106200a415c6a220a0d000b0b20054120200b200310b30102402005280234450d00200b10260b20052001360230200541186a22094200370300200541106a22034200370300200541086a2206420037030020054200370300200541206a41808cc700410610fb012006200541206a41086a220829000037030020052005290020370300200541206a41f693c400410a10fb01200741086a220a20082900003700002007200529002037000020054120200541306a10ce032005200136022020052000417f6a10b0042005280200220b2005280208200541206a10ce0302402005280204450d00200b10260b2005200236023020094200370300200342003703002006420037030020054200370300200541206a41808cc700410610fb012006200829000037030020052005290020370300200541206a418094c400410e10fb01200a20082900003700002007200529002037000020054120200541306a10ce0320094200370300200342003703002006420037030020054200370300200541206a41808cc700410610fb012006200829000037030020052005290020370300200541206a41b8bbc400410b10fb01200a2008290000370000200720052900203700002005412010ff0102402004450d00200541186a22094200370300200541106a22034200370300200541086a2206420037030020054200370300200541206a41808cc700410610fb012006200541206a41086a220829000037030020052005290020370300200541206a418e94c400410610fb01200741086a220a2008290000370000200720052900203700002005412010ff0120094200370300200342003703002006420037030020054200370300200541206a41808cc700410610fb012006200829000037030020052005290020370300200541206a418cbec400410a10fb01200a2008290000370000200720052900203700002005412010ff0120094200370300200342003703002006420037030020054200370300200541206a41808cc700410610fb012006200829000037030020052005290020370300200541206a419494c400410b10fb01200a2008290000370000200720052900203700002005412010af030b200541c0006a24000f0b1034000b1033000b850201027f230041106b220324002003410036020820034201370300024002400240024002400240200141024b0d0020010e03010203010b200041204101410010b3010c040b200341004101106d2003280200200328020822016a41003a00002003200141016a2201360208200320014104106d20032802002204200328020822016a2002360000200141046a21010c020b200341004101106d20032802002204200328020822016a41013a0000200141016a21010c010b200341004101106d20032802002204200328020822016a41023a0000200141016a21010b2003200136020820032802042102200041202004200110b3012002450d00200410260b200341106a24000bd70101027f02402000280200220241024b0d0002400240024020020e03000102000b2001200141086a22022802004101106d2001280200200228020022036a41003a00002002200341016a220336020020002802042100200120034104106d2001280200200228020022016a20003600002002200141046a3602000f0b2001200141086a22002802004101106d2001280200200028020022016a41013a00002000200141016a3602000f0b2001200141086a22002802004101106d2001280200200028020022016a41023a00002000200141016a3602000b0b955e03037f027e017f0240024002400240024002400240024002400240024002400240024002400240024020002d00000e10000102030405060708090a0b0c0d0e0f000b2001200141086a22022802004101106d2001280200200228020022036a41003a00002002200341016a2203360200200041086a2d0000220241044b0d0f0240024002400240024020020e050001020304000b200120034101106d2001280200200141086a220228020022036a41003a00002002200341016a3602002001200041106a290300200041186a2d0000200041196a2d00001098010f0b200120034101106d2001280200200141086a220228020022036a41013a00002002200341016a36020020012000410c6a2d00002000410d6a2d00002000410e6a2d0000109e012001200041186a290300200041206a2d0000200041216a2d00001098010f0b200120034101106d2001280200200141086a220128020022006a41023a00002001200041016a3602000f0b200120034101106d2001280200200141086a220228020022036a41033a00002002200341016a2203360200200120034120106d2001280200200228020022036a2201200041096a290000370000200141186a200041216a290000370000200141106a200041196a290000370000200141086a200041116a2900003700002002200341206a3602000f0b200120034101106d2001280200200141086a220228020022036a41043a00002002200341016a2203360200200120034120106d2001280200200228020022036a2201200041096a290000370000200141186a200041216a290000370000200141106a200041196a290000370000200141086a200041116a2900003700002002200341206a3602000f0b2001200141086a22022802004101106d2001280200200228020022036a41013a00002002200341016a2203360200200041046a2d0000220241024b0d0e02400240024020020e03000102000b200120034101106d2001280200200141086a220228020022036a41003a00002002200341016a2203360200200120034120106d2001280200200228020022046a2203200041056a290000370000200341186a2000411d6a290000370000200341106a200041156a290000370000200341086a2000410d6a2900003700002002200441206a2203360200200041286a2802002100200120034104106d2001280200200228020022016a20003600002002200141046a3602000f0b200120034101106d2001280200200141086a220228020022036a41013a00002002200341016a2203360200200041086a2802002100200120034104106d2001280200200228020022016a20003600002002200141046a3602000f0b200120034101106d2001280200200141086a220228020022036a41023a00002002200341016a2203360200200041286a2802002104200120034104106d2001280200200228020022036a20043600002002200341046a2203360200200120034120106d2001280200200228020022036a2201200041056a290000370000200141186a2000411d6a290000370000200141106a200041156a290000370000200141086a2000410d6a2900003700002002200341206a3602000f0b2001200141086a22022802004101106d2001280200200228020022036a41023a00002002200341016a2203360200200041086a2d0000220241074b0d0d0240024002400240024002400240024020020e080001020304050607000b200120034101106d2001280200200141086a220228020022036a41003a00002002200341016a2203360200200120034120106d2001280200200228020022046a2203200041096a290000370000200341186a200041216a290000370000200341106a200041196a290000370000200341086a200041116a2900003700002002200441206a2203360200200041306a2903002105200041386a2903002106200120034110106d2001280200200228020022016a22002006370008200020053700002002200141106a3602000f0b200120034101106d2001280200200141086a220228020022036a41013a00002002200341016a2203360200200120034120106d2001280200200228020022046a2203200041096a290000370000200341186a200041216a290000370000200341106a200041196a290000370000200341086a200041116a2900003700002002200441206a2203360200200041306a2903002105200041386a2903002106200120034110106d2001280200200228020022016a22002006370008200020053700002002200141106a3602000f0b200120034101106d2001280200200141086a220228020022036a41023a00002002200341016a2203360200200120034120106d2001280200200228020022046a2203200041096a290000370000200341186a200041216a290000370000200341106a200041196a290000370000200341086a200041116a2900003700002002200441206a2203360200200120034120106d2001280200200228020022046a2203200041296a290000370000200341186a200041c1006a290000370000200341106a200041396a290000370000200341086a200041316a2900003700002002200441206a2203360200200041d0006a2903002105200041d8006a2903002106200120034110106d2001280200200228020022016a22002006370008200020053700002002200141106a3602000f0b200120034101106d2001280200200141086a220228020022036a41033a00002002200341016a2203360200200120034120106d2001280200200228020022046a2203200041096a290000370000200341186a200041216a290000370000200341106a200041196a290000370000200341086a200041116a2900003700002002200441206a2203360200200041306a2903002105200041386a2903002106200120034110106d2001280200200228020022036a22042006370008200420053700002002200341106a2203360200200041c0006a2903002105200041c8006a2903002106200120034110106d2001280200200228020022016a22002006370008200020053700002002200141106a3602000f0b200120034101106d2001280200200141086a220228020022036a41043a00002002200341016a2203360200200120034120106d2001280200200228020022046a2203200041096a290000370000200341186a200041216a290000370000200341106a200041196a290000370000200341086a200041116a2900003700002002200441206a2203360200200041306a2903002105200041386a2903002106200120034110106d2001280200200228020022016a22002006370008200020053700002002200141106a3602000f0b200120034101106d2001280200200141086a220228020022036a41053a00002002200341016a2203360200200120034120106d2001280200200228020022046a2203200041096a290000370000200341186a200041216a290000370000200341106a200041196a290000370000200341086a200041116a2900003700002002200441206a2203360200200041306a2903002105200041386a2903002106200120034110106d2001280200200228020022016a22002006370008200020053700002002200141106a3602000f0b200120034101106d2001280200200141086a220228020022036a41063a00002002200341016a2203360200200120034120106d2001280200200228020022046a2203200041096a290000370000200341186a200041216a290000370000200341106a200041196a290000370000200341086a200041116a2900003700002002200441206a2203360200200041306a2903002105200041386a2903002106200120034110106d2001280200200228020022016a22002006370008200020053700002002200141106a3602000f0b200120034101106d2001280200200141086a220228020022036a41073a00002002200341016a2203360200200120034120106d2001280200200228020022046a2203200041096a290000370000200341186a200041216a290000370000200341106a200041196a290000370000200341086a200041116a2900003700002002200441206a2203360200200120034120106d2001280200200228020022046a2203200041296a290000370000200341186a200041c1006a290000370000200341106a200041396a290000370000200341086a200041316a2900003700002002200441206a2203360200200041d0006a2903002105200041d8006a2903002106200120034110106d2001280200200228020022036a22042006370008200420053700002002200341106a2203360200200041c9006a2d00002100200120034101106d2001280200200228020022016a2103024020004101460d00200341003a00002002200141016a3602000f0b200341013a00002002200141016a3602000f0b2001200141086a22022802004101106d2001280200200228020022036a41033a00002002200341016a2203360200200120034101106d2001280200200228020022036a41003a00002002200341016a2203360200200120034110106d2001280200200228020022036a2204200041106a290000370000200441086a200041186a2900003700002002200341106a360200200041046a2802002000410c6a2802002001109501200041206a2d00002100200120022802004101106d2001280200200228020022016a20003a00002002200141016a3602000f0b2001200141086a22022802004101106d2001280200200228020022036a41043a00002002200341016a2203360200200120034101106d2001280200200228020022036a41003a00002002200341016a2203360200200041046a2802002100200120034104106d2001280200200228020022016a20003600002002200141046a3602000f0b2001200141086a22022802004101106d2001280200200228020022036a41053a00002002200341016a2203360200200041046a280200220241024b0d0a02400240024020020e03000102000b200120034101106d2001280200200141086a220328020022026a41003a00002003200241016a360200200041086a28020021022001200041106a280200220010a1012000450d0c2002200041286c6a2107200328020021000340200120004120106d2001280200200328020022046a22002002290000370000200041186a200241186a290000370000200041106a200241106a290000370000200041086a200241086a2900003700002003200441206a2200360200200241206a2903002105200120004108106d2001280200200328020022006a20053700002003200041086a22003602002007200241286a2202470d000c0d0b0b200120034101106d2001280200200141086a220128020022006a41013a00002001200041016a3602000f0b200120034101106d2001280200200141086a220128020022006a41023a00002001200041016a3602000f0b2001200141086a22022802004101106d2001280200200228020022036a41063a00002002200341016a2203360200200041046a2d0000220241024b0d0902400240024020020e03000102000b200120034101106d2001280200200141086a220228020022036a41003a00002002200341016a2203360200200120034120106d2001280200200228020022036a2201200041056a290000370000200141186a2000411d6a290000370000200141106a200041156a290000370000200141086a2000410d6a2900003700002002200341206a3602000f0b200120034101106d2001280200200141086a220128020022006a41013a00002001200041016a3602000f0b200120034101106d2001280200200141086a220328020022026a41023a00002003200241016a360200200041086a28020021022001200041106a280200220010a1012000450d0920004105742104200328020021000340200120004120106d2001280200200328020022076a22002002290000370000200041186a200241186a290000370000200041106a200241106a290000370000200041086a200241086a2900003700002003200741206a2200360200200241206a2102200441606a22040d000c0a0b0b2001200141086a22022802004101106d2001280200200228020022036a41073a00002002200341016a2203360200200041046a2802002104200120034101106d2001280200200228020022036a2107024020044101460d00200741003a00002002200341016a220336020020002802082100200120034104106d2001280200200228020022016a20003600002002200141046a3602000f0b200741013a00002002200341016a220336020020002802082100200120034104106d2001280200200228020022016a20003600002002200141046a3602000f0b2001200141086a22022802004101106d2001280200200228020022036a41083a00002002200341016a22033602000240200041086a2d00004104460d00200120034101106d2001280200200228020022036a41003a00002002200341016a2203360200200041046a2802002104200120034104106d2001280200200228020022036a20043600002002200341046a360200200120002d0008200041096a2d00002000410a6a2d0000109e010f0b200120034101106d2001280200200228020022016a41013a00002002200141016a3602000f0b2001200141086a22022802004101106d2001280200200228020022036a41093a00002002200341016a2203360200200041086a2d0000220241094b0d06024002400240024002400240024002400240024020020e0a00010203040506070809000b200120034101106d2001280200200141086a220228020022036a41003a00002002200341016a2203360200200120034120106d2001280200200228020022036a2201200041096a290000370000200141186a200041216a290000370000200141106a200041196a290000370000200141086a200041116a2900003700002002200341206a3602000f0b200120034101106d2001280200200141086a220228020022036a41013a00002002200341016a2203360200200120034120106d2001280200200228020022046a2203200041096a290000370000200341186a200041216a290000370000200341106a200041196a290000370000200341086a200041116a2900003700002002200441206a2203360200200041306a2903002105200041386a2903002106200120034110106d2001280200200228020022016a22002006370008200020053700002002200141106a3602000f0b200120034101106d2001280200200141086a220228020022036a41023a00002002200341016a2203360200200120034120106d2001280200200228020022046a2203200041096a290000370000200341186a200041216a290000370000200341106a200041196a290000370000200341086a200041116a2900003700002002200441206a2203360200200041306a2903002105200041386a2903002106200120034110106d2001280200200228020022016a22002006370008200020053700002002200141106a3602000f0b200120034101106d2001280200200141086a220228020022036a41033a00002002200341016a2203360200200120034120106d2001280200200228020022046a2203200041096a290000370000200341186a200041216a290000370000200341106a200041196a290000370000200341086a200041116a2900003700002002200441206a22033602002000412c6a2802002100200120034104106d2001280200200228020022016a20003600002002200141046a3602000f0b200120034101106d2001280200200141086a220228020022036a41043a00002002200341016a2203360200200120034120106d2001280200200228020022046a2203200041096a290000370000200341186a200041216a290000370000200341106a200041196a290000370000200341086a200041116a2900003700002002200441206a22033602002000412c6a2802002100200120034104106d2001280200200228020022016a20003600002002200141046a3602000f0b200120034101106d2001280200200141086a220228020022036a41053a00002002200341016a2203360200200120034120106d2001280200200228020022046a2203200041096a290000370000200341186a200041216a290000370000200341106a200041196a290000370000200341086a200041116a2900003700002002200441206a22033602002000412c6a2802002100200120034104106d2001280200200228020022016a20003600002002200141046a3602000f0b200120034101106d2001280200200141086a220228020022036a41063a00002002200341016a22033602002000410c6a2802002100200120034104106d2001280200200228020022016a20003600002002200141046a3602000f0b200120034101106d2001280200200141086a220228020022036a41073a00002002200341016a2203360200200120034120106d2001280200200228020022046a2203200041096a290000370000200341186a200041216a290000370000200341106a200041196a290000370000200341086a200041116a2900003700002002200441206a2203360200200120034120106d2001280200200228020022046a2203200041296a290000370000200341186a200041c1006a290000370000200341106a200041396a290000370000200341086a200041316a2900003700002002200441206a2203360200200041d0006a2903002105200041d8006a2903002106200120034110106d2001280200200228020022016a22002006370008200020053700002002200141106a3602000f0b200120034101106d2001280200200141086a220228020022036a41083a00002002200341016a2203360200200120034120106d2001280200200228020022046a2203200041096a290000370000200341186a200041216a290000370000200341106a200041196a290000370000200341086a200041116a2900003700002002200441206a2203360200200120034120106d2001280200200228020022046a2203200041296a290000370000200341186a200041c1006a290000370000200341106a200041396a290000370000200341086a200041316a2900003700002002200441206a2203360200200041d0006a2903002105200041d8006a2903002106200120034110106d2001280200200228020022016a22002006370008200020053700002002200141106a3602000f0b200120034101106d2001280200200141086a220228020022036a41093a00002002200341016a2203360200200120034120106d2001280200200228020022046a2203200041096a290000370000200341186a200041216a290000370000200341106a200041196a290000370000200341086a200041116a2900003700002002200441206a2203360200200120034120106d2001280200200228020022046a2203200041296a290000370000200341186a200041c1006a290000370000200341106a200041396a290000370000200341086a200041316a2900003700002002200441206a2203360200200041d0006a2903002105200041d8006a2903002106200120034110106d2001280200200228020022016a22002006370008200020053700002002200141106a3602000f0b2001200141086a22022802004101106d2001280200200228020022036a410a3a00002002200341016a220336020020002d0001220241054b0d0502400240024002400240024020020e06000102030405000b200120034101106d2001280200200141086a220228020022036a41003a00002002200341016a2203360200200120034120106d2001280200200228020022036a2201200041026a290000370000200141186a2000411a6a290000370000200141106a200041126a290000370000200141086a2000410a6a2900003700002002200341206a3602000f0b200120034101106d2001280200200141086a220228020022036a41013a00002002200341016a2203360200200120034120106d2001280200200228020022046a2203200041026a290000370000200341186a2000411a6a290000370000200341106a200041126a290000370000200341086a2000410a6a2900003700002002200441206a2203360200200120034120106d2001280200200228020022036a2201200041226a290000370000200141186a2000413a6a290000370000200141106a200041326a290000370000200141086a2000412a6a2900003700002002200341206a3602000f0b200120034101106d2001280200200141086a220228020022036a41023a00002002200341016a2203360200200120034120106d2001280200200228020022046a2203200041026a290000370000200341186a2000411a6a290000370000200341106a200041126a290000370000200341086a2000410a6a2900003700002002200441206a2203360200200120034120106d2001280200200228020022046a2203200041226a290000370000200341186a2000413a6a290000370000200341106a200041326a290000370000200341086a2000412a6a2900003700002002200441206a2203360200200120034120106d2001280200200228020022036a2201200041c2006a290000370000200141186a200041da006a290000370000200141106a200041d2006a290000370000200141086a200041ca006a2900003700002002200341206a3602000f0b200120034101106d2001280200200141086a220228020022036a41033a00002002200341016a2203360200200120034120106d2001280200200228020022046a2203200041026a290000370000200341186a2000411a6a290000370000200341106a200041126a290000370000200341086a2000410a6a2900003700002002200441206a2203360200200120034120106d2001280200200228020022036a2201200041226a290000370000200141186a2000413a6a290000370000200141106a200041326a290000370000200141086a2000412a6a2900003700002002200341206a3602000f0b200120034101106d2001280200200141086a220228020022036a41043a00002002200341016a2203360200200120034120106d2001280200200228020022046a2203200041026a290000370000200341186a2000411a6a290000370000200341106a200041126a290000370000200341086a2000410a6a2900003700002002200441206a2203360200200120034120106d2001280200200228020022036a2201200041226a290000370000200141186a2000413a6a290000370000200141106a200041326a290000370000200141086a2000412a6a2900003700002002200341206a3602000f0b200120034101106d2001280200200141086a220228020022036a41053a00002002200341016a2203360200200120034120106d2001280200200228020022036a2201200041026a290000370000200141186a2000411a6a290000370000200141106a200041126a290000370000200141086a2000410a6a2900003700002002200341206a3602000f0b2001200141086a22022802004101106d2001280200200228020022036a410b3a00002002200341016a2204360200200041096a21030240200041086a2d00004101460d00200120044101106d2001280200200228020022046a41003a00002002200441016a2204360200200120044120106d2001280200200228020022076a22042003290000370000200441186a200341186a290000370000200441106a200341106a290000370000200441086a200341086a2900003700002002200741206a2203360200200041306a2903002105200041386a2903002106200120034110106d2001280200200228020022016a22002006370008200020053700002002200141106a3602000f0b200120044101106d2001280200200228020022006a41013a00002002200041016a2200360200200120004120106d2001280200200228020022006a22012003290000370000200141186a200341186a290000370000200141106a200341106a290000370000200141086a200341086a2900003700002002200041206a3602000f0b2001200141086a22022802004101106d2001280200200228020022036a410c3a00002002200341016a2203360200200041046a280200220241024b0d0302400240024020020e03000102000b200120034101106d2001280200200141086a220228020022036a41003a00002002200341016a2203360200200041086a2802002104200120034104106d2001280200200228020022036a20043600002002200341046a22033602002000410c6a2802002100200120034104106d2001280200200228020022016a20003600002002200141046a3602000f0b200120034101106d2001280200200141086a220228020022036a41013a00002002200341016a2203360200200041086a2802002104200120034104106d2001280200200228020022036a20043600002002200341046a22033602002000410c6a2802002100200120034104106d2001280200200228020022016a20003600002002200141046a3602000f0b200120034101106d2001280200200141086a220228020022036a41023a00002002200341016a2203360200200041086a2802002104200120034104106d2001280200200228020022036a20043600002002200341046a22033602002000410c6a2802002104200120034104106d2001280200200228020022036a20043600002002200341046a3602002001200041106a109f012000411c6a2d00002000411d6a2d00002000411e6a2d0000200110f8020f0b2001200141086a22022802004101106d2001280200200228020022036a410d3a00002002200341016a2203360200200041046a2d0000220241024b0d0202400240024020020e03000102000b200120034101106d2001280200200141086a220228020022036a41003a00002002200341016a360200200041086a2d0000200041096a2d00002000410a6a2d0000200110f8020f0b200120034101106d2001280200200141086a220228020022036a41013a00002002200341016a2203360200200120034120106d2001280200200228020022036a2201200041056a290000370000200141186a2000411d6a290000370000200141106a200041156a290000370000200141086a2000410d6a2900003700002002200341206a3602000f0b200120034101106d2001280200200141086a220228020022036a41023a00002002200341016a2203360200200041056a2d00002100200120034101106d2001280200200228020022016a20003a00002002200141016a3602000f0b2001200141086a22022802004101106d2001280200200228020022036a410e3a00002002200341016a22033602000240200041046a2d00004101460d00200120034101106d2001280200200228020022036a41003a00002002200341016a360200200041086a2d0000200041096a2d00002000410a6a2d0000200110f8020f0b200120034101106d2001280200200228020022036a41013a00002002200341016a2203360200200120034120106d2001280200200228020022046a2203200041056a290000370000200341186a2000411d6a290000370000200341106a200041156a290000370000200341086a2000410d6a2900003700002002200441206a2203360200200120034120106d2001280200200228020022046a2203200041256a290000370000200341186a2000413d6a290000370000200341106a200041356a290000370000200341086a2000412d6a2900003700002002200441206a220336020002400240024002400240200041c5006a2d00000e0400010203000b200120034101106d2001280200200141086a220328020022026a41003a00002003200241016a22023602000c030b200120034101106d2001280200200141086a220328020022026a41013a00002003200241016a22023602000c020b200120034101106d2001280200200141086a220328020022026a41023a00002003200241016a22023602000c010b200120034101106d2001280200200141086a220328020022026a41033a00002003200241016a22023602000b20002f01462100200120024102106d2001280200200141086a220128020022026a20003b00002001200241026a3602000f0b2001200141086a22022802004101106d2001280200200228020022036a410f3a00002002200341016a22033602000240024002400240200041046a2d00000e0400010203000b200120034101106d2001280200200228020022036a41003a00002002200341016a2203360200200120034120106d2001280200200228020022046a2203200041056a290000370000200341186a2000411d6a290000370000200341106a200041156a290000370000200341086a2000410d6a2900003700002002200441206a2203360200200120034120106d2001280200200228020022046a2203200041256a290000370000200341186a2000413d6a290000370000200341106a200041356a290000370000200341086a2000412d6a2900003700002002200441206a2203360200200120034120106d2001280200200228020022036a2201200041c5006a290000370000200141186a200041dd006a290000370000200141106a200041d5006a290000370000200141086a200041cd006a2900003700002002200341206a3602000f0b200120034101106d2001280200200228020022036a41013a00002002200341016a2203360200200120034120106d2001280200200228020022046a2203200041056a290000370000200341186a2000411d6a290000370000200341106a200041156a290000370000200341086a2000410d6a2900003700002002200441206a2203360200200041e8006a2802002104200120034104106d2001280200200228020022036a20043600002002200341046a2203360200200041ec006a2802002104200120034104106d2001280200200228020022036a20043600002002200341046a2203360200200120034120106d2001280200200228020022046a2203200041256a290000370000200341186a2000413d6a290000370000200341106a200041356a290000370000200341086a2000412d6a2900003700002002200441206a2203360200200120034120106d2001280200200228020022036a2201200041c5006a290000370000200141186a200041dd006a290000370000200141106a200041d5006a290000370000200141086a200041cd006a2900003700002002200341206a3602000f0b200120034101106d2001280200200228020022036a41023a00002002200341016a2203360200200120034120106d2001280200200228020022046a2203200041056a290000370000200341186a2000411d6a290000370000200341106a200041156a290000370000200341086a2000410d6a2900003700002002200441206a2203360200200041e8006a2802002104200120034104106d2001280200200228020022036a20043600002002200341046a2203360200200041ec006a2802002104200120034104106d2001280200200228020022036a20043600002002200341046a2203360200200120034120106d2001280200200228020022046a2203200041256a290000370000200341186a2000413d6a290000370000200341106a200041356a290000370000200341086a2000412d6a2900003700002002200441206a2203360200200120034120106d2001280200200228020022046a2203200041c5006a290000370000200341186a200041dd006a290000370000200341106a200041d5006a290000370000200341086a200041cd006a2900003700002002200441206a360200200041f0006a2d0000200041f1006a2d0000200041f2006a2d0000200110f8020f0b200120034101106d2001280200200228020022036a41033a00002002200341016a2203360200200120034120106d2001280200200228020022046a2203200041056a290000370000200341186a2000411d6a290000370000200341106a200041156a290000370000200341086a2000410d6a2900003700002002200441206a2203360200200041e8006a2802002104200120034104106d2001280200200228020022036a20043600002002200341046a2203360200200041ec006a2802002104200120034104106d2001280200200228020022036a20043600002002200341046a2203360200200120034120106d2001280200200228020022046a2203200041256a290000370000200341186a2000413d6a290000370000200341106a200041356a290000370000200341086a2000412d6a2900003700002002200441206a2203360200200120034120106d2001280200200228020022036a2201200041c5006a290000370000200141186a200041dd006a290000370000200141106a200041d5006a290000370000200141086a200041cd006a2900003700002002200341206a3602000b0bc50101017f024020002d0000417d6a220141094b0d00024002400240024020010e0a00040102040404040403000b200041086a280200450d03200041046a28020010260c030b200041046a2802000d022000410c6a2802002201450d02200141286c450d02200041086a28020010260f0b200041046a2d00004102490d012000410c6a28020041ffffff3f71450d01200041086a28020010260f0b200041046a2802004102490d00200041106a2802002201450d00200041146a280200450d00200110260f0b0b13002000410a360204200041a094c4003602000b980301057f230041d0006b22022400200241086a41808cc700410610fb01200241186a41bcbcc400410d10fb0120022001360234200241386a200241346a410410a202200241cc006a200241346a41046a3602002002200241c0006a3602442002200241346a3602482002200241386a360240200241286a200241c0006a1073024002402002280230220341206a2204417f4c0d000240024020040d0041012101410021040c010b200410242201450d020b20002001360200200041086a220141003602002000200436020420004100411010c9012000280200200128020022046a220520022900083700002001200441106a2204360200200541086a200241086a41086a29000037000020002004411010c9012000280200200128020022046a220520022900183700002001200441106a2206360200200541086a200241186a41086a2900003700002002280228210420002006200310c9012000280200200128020022006a2004200310cf061a2001200020036a3602000240200228022c450d00200410260b200241d0006a24000f0b1034000b1033000b3400200041808cc70036020420004100360200200041146a410f360200200041106a41a8b0c400360200200041086a42063702000b4901017f02404101102422020d001033000b2000420137020420002002360200200041004101106d2000280200200041086a220028020022026a41003a00002000200241016a3602000b5b01017f230041306b220224002000410036020820004201370200200241206a4200370300200241186a4200370300200241106a4200370300200242003703082002200036022c200241086a2002412c6a109c01200241306a24000b6101027f20004201370200200041086a22024100360200200041004108106d2000280200200228020022036a42003700002002200341086a2203360200200020034108106d2000280200200228020022006a42003700002002200041086a3602000b8b0101037f230041d0006b22022400200241086a410041c50010d1061a200041086a2203410036020020004201370200200041004104106d2000280200200328020022046a41003600002003200441046a2204360200200020044101106d2000280200200328020022046a41003a00002003200441016a3602002000200241086a10a601200241d0006a24000bcf0201077f230041c0006b22002400200041086a41da93c4004110108902200028020c21010240200028020822024101470d0041da93c400411010ff010b200041286a22034200370300200041106a41106a22044200370300200041106a41086a2205420037030020004200370310200041306a41808cc700410610fb012005200041306a41086a220629000037030020002000290030370310200041306a4190bbc400410e10fb01200320062900003703002004200029003037030020002001410020021b360230200041106a4120200041306a410410b30120034200370300200442003703002005420037030020004200370310200041306a41808cc700410610fb012005200629000037030020002000290030370310200041306a41fcbfc400410e10fb012003200629000037030020042000290030370300200041106a4101200010b404200041c0006a24000b130020004106360204200041d8cac4003602000b4c01017f02404104102422020d001033000b2000420437020420002002360200200041004104106d2000280200200041086a220028020022026a418080c0023600002000200241046a3602000b4c01017f02404108102422020d001033000b2000420837020420002002360200200041004108106d2000280200200041086a220028020022026a42c0b2cd3b3700002000200241086a3602000b4d01017f02404108102422020d001033000b2000420837020420002002360200200041004108106d2000280200200041086a220028020022026a4280e497d0123700002000200241086a3602000b6701027f20004201370200200041086a22024100360200200041004108106d2000280200200228020022036a42c0f0f50b3700002002200341086a2203360200200020034108106d2000280200200228020022006a4280c2d72f3700002002200041086a3602000b4e01017f02404108102422020d001033000b2000420837020420002002360200200041004108106d2000280200200041086a220028020022026a4280c0a8ca9a3a3700002000200241086a3602000b4a01017f02404104102422020d001033000b2000420437020420002002360200200041004104106d2000280200200041086a220028020022026a41e0123600002000200241046a3602000bed0203067f037e017f230041d0006b22012400200141386a22024200370300200141206a41106a22034200370300200141206a41086a2204420037030020014200370320200141c0006a41808cc700410610fb012004200141c0006a41086a220529000037030020012001290040370320200141c0006a41b8bbc400410b10fb012002200529000037030020032001290040370300200141086a200141206a108f02200141086a41106a220629030021072001290310210820012903082109200142013703082006200742002009420151220a1b3703002001427f20084200200a1b220720007c220020002007541b37031020024200370300200342003703002004420037030020014200370320200141c0006a41808cc700410610fb012004200529000037030020012001290040370320200141c0006a41b8bbc400410b10fb012002200529000037030020032001290040370300200141206a200141086a41086a10f103200141d0006a24000bb317040a7f017e047f037e23004190026b22012400200141d0016a41186a22024200370300200141d0016a41106a22034200370300200141d0016a41086a22044200370300200142003703d001200141a8016a41808cc700410610fb012004200141a8016a41086a2205290000370300200120012900a8013703d001200141a8016a41fcbfc400410e10fb0120022005290000370300200320012900a801370300200141d0016a412010ff01200242003703002003420037030020044200370300200142003703d001200141a8016a41808cc700410610fb0120042005290000370300200120012900a8013703d001200141a8016a4190bbc400410e10fb0120022005290000370300200320012900a801370300200141d0016a412010ff01200242003703002003420037030020044200370300200142003703d001200141a8016a41808cc700410610fb0120042005290000370300200120012900a8013703d001200141a8016a41f4bbc400411010fb0120022005290000370300200320012900a801370300200141d0016a412010ff01200242003703002003420037030020044200370300200142003703d001200141a8016a41808cc700410610fb0120042005290000370300200120012900a8013703d001200141a8016a41ea93c400410610fb0120022005290000370300200320012900a8013703002001200141d0016a4120108902200128020421040240200128020022064101470d00200141d0016a412010ff010b200141f0016a41186a22074200370300200141f0016a41106a22024200370300200141f0016a41086a22084200370300200142003703f001200141a8016a41808cc700410610fb0120082005290000370300200120012900a8013703f001200141a8016a41f693c400410a10fb0120072005290000370300200220012900a801370300200141a8016a200141f0016a412010b803024002400240024020012d00a80122050d00200141e8016a200141c1016a290000370300200141e0016a200141b9016a290000370300200141d8016a200141b1016a290000370300200120012900a9013703d0010c010b200141f0016a412010ff01200141d0016a41186a2207200141c1016a290000370300200141d0016a41106a2208200141b9016a290000370300200141d0016a41086a2209200141b1016a290000370300200120012900a9013703d00120054101460d010b200141206a4200370300200141186a4200370300200141106a4200370300200142003703080c010b200141086a41186a2007290300370300200141086a41106a2008290300370300200141086a41086a2009290300370300200120012903d0013703080b200141e8016a4200370300200141e0016a4200370300200141d0016a41086a22054200370300200142003703d001200141a8016a41808cc700410610fb012005200141a8016a41086a2207290000370300200120012900a8013703d001200141a8016a41f093c400410610fb01200341086a2007290000370000200320012900a801370000200141a8016a200141d0016a10c9040240024020012802a80122080d00410021072001410036023020014204370328410421084100210a0c010b200141d0016a412010ff0120012008360228200120012902ac01220b37022c200b422088a72107200ba7210a0b2004410020061b2106200141f0016a41186a4200370300200141f0016a41106a4200370300200141f0016a41086a22034200370300200142003703f001200141a8016a41808cc700410610fb012003200141a8016a41086a2205290000370300200120012900a8013703f001200141a8016a418094c400410e10fb01200241086a2005290000370000200220012900a801370000200141a8016a200141f0016a412010b803024002400240024020012d00a80122030d00200141d0016a41186a200141c1016a290000370300200141d0016a41106a200141b9016a290000370300200141d0016a41086a200141b1016a290000370300200120012900a9013703d0010c010b200141f0016a412010ff01200141d0016a41186a200141c1016a290000370300200141d0016a41106a200141b9016a290000370300200141d0016a41086a200141b1016a290000370300200120012900a9013703d00120034101460d010b200141d0006a4200370300200141c8006a4200370300200141c0006a4200370300200142003703380c010b200141386a41186a200141d0016a41186a290300370300200141386a41106a200141d0016a41106a290300370300200141386a41086a200141d0016a41086a290300370300200120012903d0013703380b0240200641e112490d002006419f6d6a2203450d00200141a8016a200310b00420012802a801220320012802b00110ff0120012802ac01450d00200310260b20014188016a10ca042001280290012104200128028801210941002103200141003a00c801200921050240024002400240034020042003460d01200141a8016a20036a20052d00003a00002001200341016a22023a00c801200541016a21052002210320024120470d000b200141f0016a41186a2203200141a8016a41186a290300370300200141f0016a41106a2205200141a8016a41106a290300370300200141f0016a41086a2204200141a8016a41086a290300370300200120012903a8013703f001200241ff01714120490d01200141d8006a41086a2004290300370300200141d8006a41106a2005290300370300200141d8006a41186a2003290300370300200120012903f0013703580240200128028c01450d00200910260b200141003602b001200142013703a8012001200141a8016a3602f001200141086a200141f0016a109c01200141f8006a20012802a80120012802b00110cb04024020012802ac01450d0020012802a80110260b024020012802782209450d0020014180016a2802002104200128027c210c41002103200141003a00c80120092105034020042003460d04200141a8016a20036a20052d00003a00002001200341016a22023a00c801200541016a21052002210320024120470d000b200141f0016a41186a2203200141a8016a41186a2205290300370300200141f0016a41106a2204200141a8016a41106a220d290300370300200141f0016a41086a220e200141a8016a41086a220f290300370300200120012903a8013703f001200241ff01714120490d0420014188016a41086a200e290300220b37030020014188016a41106a2004290300221037030020014188016a41186a20032903002211370300200120012903f001221237038801200f200b370300200d201037030020052011370300200120123703a801200141f0016a41026a2205200141d0016a41026a2d00003a0000200120012f00d0013b01f00102402007200a470d00200141286a2007410110d10120012802302107200128022821080b2008200741246c6a220341003a0000200320012903a801370001200141c0016a290300210b200141b8016a2903002110200141b0016a2903002111200320012f01f0013b0021200341236a20052d00003a0000200341096a2011370000200341116a2010370000200341196a200b3700002001200741016a360230200c450d00200910260b200020012903083700102000200636020020002001290358370030200041286a200141086a41186a290300370000200041206a200141086a41106a290300370000200041186a200141086a41086a290300370000200041386a200141d8006a41086a290300370000200041c0006a200141d8006a41106a290300370000200041c8006a200141d8006a41186a290300370000200041e8006a200141386a41186a290300370000200041e0006a200141386a41106a290300370000200041d8006a200141386a41086a290300370000200020012903383700502000410c6a200141286a41086a2802003602002000200129032837020420014190026a24000f0b200341ff0171450d00200141003a00c8010b41a3d2c400412c200141a8016a41d0d2c40041e0d2c4001036000b200341ff0171450d00200141003a00c8010b41a3d2c400412c200141a8016a41d0d2c40041f0d2c4001036000bb30201027f230041e0006b220224002002412036020c20022001360208200241106a2001412010820202400240200228021022010d00200041003602000c010b200228021421032002200241106a41086a28020036022420022001360220200241c8006a200241206a10e4020240024020022802480d0020024100360230200242013703282002410e36023c2002200241086a3602382002200241286a360244200241dc006a41013602002002420137024c2002418c8dc6003602482002200241386a360258200241c4006a41c4e1c000200241c8006a10351a200228022820022802301084020240200228022c450d00200228022810260b200041003602000c010b20002002290348370200200041086a200241c8006a41086a2802003602000b2003450d00200110260b200241e0006a24000b3c02017e017f0240024010212201422088a72202450d0020002001a73602000c010b20004101360200410021020b20002002360208200020023602040b130020002002ad4220862001ad84101b10c5060baf0301077f230041106b2203240020032000200220016b10cd04024002400240024020032802004101470d00200341086a2802000d0141c8bcc700411141dcbcc700102f000b41242104024002402000280200220541244b0d00200041056a210620052107200021080c010b2000410c6a22082802002107200041086a2802002106200521040b0240200720044f0d00034020022001460d03200620076a20012d00003a0000200141016a2101200741016a22072004490d000b0b2008200736020020012002460d02200141016a2107200041056a21092000410c6a210820012d000021060340024002402000280200220441244b0d0041242105200421010c010b20082802002101200421050b024020012005470d0020032000410110cd04024020032802004101470d00200341086a2802000d0341c8bcc700411141dcbcc700102f000b200028020021040b02400240200441244b0d0020092104200021050c010b20002802082104200821050b2005200141016a360200200420016a20063a000020022007460d0320072d00002106200741016a21070c000b0b102c000b200820073602000b200341106a24000bb20301047f41242103024002402001280200220441244b0d00200421050c010b2001410c6a2802002105200421030b02400240200320056b20024f0d000240200520026a22022005490d004100417f2002417f6a677620024102491b220541016a220320054f0d020b2000200336020420004101360200200041086a41003602000f0b200041003602000f0b4124210202400240200441244b0d00200141056a2106200421050c010b2001410c6a2802002105200141086a2802002106200421020b024002400240200520034b0d000240024020034125490d0020022003470d010c040b024020044125490d00200141003a0004200141056a2006200510cf061a20012005360200200610260c040b200041003602000f0b0240200441244b0d000240200310242202450d0020022006200510cf061a0c030b2000200336020420004101360200200041086a41013602000f0b200620022003102822020d012000200336020420004101360200200041086a41013602000f0b41ecbcc700412041dcbcc700102f000b200141013a0004200120033602002001410c6a2005360200200141086a20023602000b200041003602000be23a09037f017e037f017e037f047e037f017e0d7f230041900a6b22022400024002400240200128020422034108490d002001280200220429000021052001200341786a22063602042001200441086a22073602002006450d0120072d000021062001200341776a22083602042001200741016a360200200641014b0d0102400240024002400240024020060e020001000b20084108490d062007290001210920012003416f6a220a3602042001200741096a36020041002107200241003a00e809200321060240024002400340200a2007460d01200241c8096a20076a200420076a220841116a2d00003a000020012006416e6a3602042001200841126a3602002002200741016a22083a00e8092006417f6a21062008210720084120470d000b20024188086a41086a2207200241c8096a41086a29030037030020024188086a41106a220b200241c8096a41106a29030037030020024188086a41186a220c200241c8096a41186a290300370300200220022903c80937038808200841ff0171411f4d0d09200320086b416f6a210a200241e8066a41086a2007290300220d370300200241a8056a41186a200c290300370300200241a8056a41106a200b290300370300200241a8056a41086a200d3703002002200229038808220d3703e8062002200d3703a80541002107200241003a00e809200420086a210b2006416e6a21040340200a2007460d02200241c8096a20076a200b20076a220841116a2d00003a0000200120043602042001200841126a3602002002200741016a22083a00e8092004417f6a21042003417f6a21032008210720084120470d000b20024188086a41086a2207200241c8096a41086a29030037030020024188086a41106a2203200241c8096a41106a29030037030020024188086a41186a2204200241c8096a41186a290300370300200220022903c80937038808200841ff0171411f4d0d09200241e8066a41086a2007290300370300200241e8066a41106a2003290300370300200241e8066a41186a200429030037030020022002290388083703e806200620086b2207416f6a4104490d09200b20086a220341116a280000210820012007416b6a360204200241c8066a41086a2207200241e8066a41086a290300370300200241c8066a41106a2204200241e8066a41106a290300370300200241c8066a41186a2206200241e8066a41186a2903003703002001200341156a360200200220022903e8063703c806200241c8096a200110dc0120022d00c8094101460d0920024188086a41386a200241810a6a290000220d37030020024188086a41306a200241f9096a290000220e37030020024188086a41286a200241f1096a290000220f37030020024188086a41206a200241e9096a2900002210370300200241c8076a41086a2203200241d1096a290000370300200241c8076a41106a220a200241c8096a41116a290000370300200241c8076a41186a220b200241e1096a290000370300200241c8076a41206a220c2010370300200241c8076a41286a2211200f370300200241c8076a41306a2212200e370300200241c8076a41386a2213200d370300200220022900c9093703c807200241c8056a41386a2013290300370300200241c8056a41306a2012290300370300200241c8056a41286a2011290300370300200241c8056a41206a200c290300370300200241c8056a41186a200b290300370300200241c8056a41106a200a290300370300200241c8056a41086a2003290300370300200220022903c8073703c805200241a8066a41186a22032006290300370300200241a8066a41106a22062004290300370300200241a8066a41086a22042007290300370300200220022903c8063703a80620024188066a41186a200329030037030020024188066a41106a200629030037030020024188066a41086a2004290300370300200220022903a8063703880641002107200241003a00e80920012802042106417f2103034020062007460d03200241c8096a20076a200128020022042d00003a00002001200620036a3602042001200441016a3602002002200741016a22043a00e8092003417f6a21032004210720044120470d000b20024188086a41086a2207200241c8096a41086a29030037030020024188086a41106a2203200241c8096a41106a29030037030020024188086a41186a220a200241c8096a41186a290300370300200220022903c80937038808200441ff0171411f4d0d09200241e8066a41086a2007290300370300200241e8066a41106a2003290300370300200241e8066a41186a200a29030037030020022002290388083703e806200620046b22074104490d0920012802002204280000210320012007417c6a3602042001200441046a360200200241c8066a41086a2207200241e8066a41086a290300370300200241c8066a41106a2204200241e8066a41106a290300370300200241c8066a41186a2206200241e8066a41186a290300370300200220022903e8063703c806200241c8096a200110dc0120022d00c8094101460d0920024188086a41386a200241810a6a290000220d37030020024188086a41306a200241f9096a290000220e37030020024188086a41286a200241f1096a290000220f37030020024188086a41206a200241e9096a290000221037030020024188086a41186a200241e1096a2900002214370300200241c8076a41086a2201200241d1096a290000370300200241c8076a41106a220a200241d9096a290000370300200241c8076a41186a220b2014370300200241c8076a41206a220c2010370300200241c8076a41286a2211200f370300200241c8076a41306a2212200e370300200241c8076a41386a2213200d370300200220022900c9093703c807200241e8036a41386a22152013290300370300200241e8036a41306a22132012290300370300200241e8036a41286a22122011290300370300200241e8036a41206a2211200c290300370300200241e8036a41186a220c200b290300370300200241e8036a41106a220b200a290300370300200241e8036a41086a220a2001290300370300200220022903c8073703e803200241a8066a41186a22012006290300370300200241a8066a41106a22062004290300370300200241a8066a41086a22042007290300370300200220022903c8063703a806200241a8046a41186a22072001290300370300200241a8046a41106a22012006290300370300200241a8046a41086a22062004290300370300200220022903a8063703a804200241c8036a41186a2204200241a8056a41186a290300370300200241c8036a41106a2216200241a8056a41106a290300370300200241c8036a41086a2217200241a8056a41086a290300370300200220022903a8053703c80320024188056a41186a221820024188066a41186a29030037030020024188056a41106a221920024188066a41106a29030037030020024188056a41086a221a20024188066a41086a290300370300200220022903880637038805200241c8046a41386a221b200241c8056a41386a290300370300200241c8046a41306a221c200241c8056a41306a290300370300200241c8046a41286a221d200241c8056a41286a290300370300200241c8046a41206a221e200241c8056a41206a290300370300200241c8046a41186a221f200241c8056a41186a290300370300200241c8046a41106a2220200241c8056a41106a290300370300200241c8046a41086a2221200241c8056a41086a290300370300200220022903c8053703c804200241a8036a41186a2018290300370300200241a8036a41106a2019290300370300200241a8036a41086a201a29030037030020022002290388053703a803200241e8026a41386a201b290300370300200241e8026a41306a201c290300370300200241e8026a41286a201d290300370300200241e8026a41206a201e290300370300200241e8026a41186a201f290300370300200241e8026a41106a2020290300370300200241e8026a41086a2021290300370300200220022903c8043703e802200241c8026a41186a2007290300370300200241c8026a41106a2001290300370300200241c8026a41086a2006290300370300200220022903a8043703c80220024188026a41386a201529030037030020024188026a41306a201329030037030020024188026a41286a201229030037030020024188026a41206a201129030037030020024188026a41186a200c29030037030020024188026a41106a200b29030037030020024188026a41086a200a290300370300200220022903e80337038802200241e8016a41186a2004290300370300200241e8016a41106a2016290300370300200241e8016a41086a2017290300370300200220022903c8033703e8014200210d0c040b200741ff0171450d08200241003a00e8090c080b200741ff0171450d07200241003a00e8090c070b200741ff0171450d06200241003a00e8090c060b20084108490d052007290001210920012003416f6a220a3602042001200741096a36020041002107200241003a00e809200321060340200a2007460d02200241c8096a20076a200420076a220841116a2d00003a000020012006416e6a3602042001200841126a3602002002200741016a22083a00e8092006417f6a21062008210720084120470d000b20024188086a41086a2207200241c8096a41086a29030037030020024188086a41106a220b200241c8096a41106a29030037030020024188086a41186a220c200241c8096a41186a290300370300200220022903c80937038808200841ff0171411f4d0d05200320086b416f6a210a200241e8066a41086a2007290300220d370300200241a8056a41186a200c290300370300200241a8056a41106a200b290300370300200241a8056a41086a200d3703002002200229038808220d3703e8062002200d3703a80541002107200241003a00e809200420086a210b2006416e6a21040340200a2007460d03200241c8096a20076a200b20076a220841116a2d00003a0000200120043602042001200841126a3602002002200741016a22083a00e8092004417f6a21042003417f6a21032008210720084120470d000b20024188086a41086a2207200241c8096a41086a29030037030020024188086a41106a2203200241c8096a41106a29030037030020024188086a41186a2204200241c8096a41186a290300370300200220022903c80937038808200841ff0171411f4d0d05200241e8066a41086a2007290300370300200241e8066a41106a2003290300370300200241e8066a41186a200429030037030020022002290388083703e806200620086b2207416f6a4104490d05200b20086a220341116a280000210820012007416b6a360204200241c8066a41086a2207200241e8066a41086a290300370300200241c8066a41106a2204200241e8066a41106a290300370300200241c8066a41186a2206200241e8066a41186a2903003703002001200341156a360200200220022903e8063703c806200241c8096a200110dc0120022d00c8094101460d0520024188086a41386a200241810a6a290000220d37030020024188086a41306a200241f9096a290000220e37030020024188086a41286a200241f1096a290000220f37030020024188086a41206a200241e9096a2900002210370300200241c8076a41086a2203200241d1096a290000370300200241c8076a41106a220a200241c8096a41116a290000370300200241c8076a41186a220b200241e1096a290000370300200241c8076a41206a220c2010370300200241c8076a41286a2211200f370300200241c8076a41306a2212200e370300200241c8076a41386a2213200d370300200220022900c9093703c807200241c8056a41386a2013290300370300200241c8056a41306a2012290300370300200241c8056a41286a2011290300370300200241c8056a41206a200c290300370300200241c8056a41186a200b290300370300200241c8056a41106a200a290300370300200241c8056a41086a2003290300370300200220022903c8073703c805200241a8066a41186a22032006290300370300200241a8066a41106a22062004290300370300200241a8066a41086a22042007290300370300200220022903c8063703a80620024188066a41186a200329030037030020024188066a41106a200629030037030020024188066a41086a2004290300370300200220022903a8063703880641002107200241003a00e80920012802042106417f2103034020062007460d04200241c8096a20076a200128020022042d00003a00002001200620036a3602042001200441016a3602002002200741016a22043a00e8092003417f6a21032004210720044120470d000b20024188086a41086a2207200241c8096a41086a29030037030020024188086a41106a2203200241c8096a41106a29030037030020024188086a41186a220a200241c8096a41186a290300370300200220022903c80937038808200441ff0171411f4d0d05200241e8066a41086a2007290300370300200241e8066a41106a2003290300370300200241e8066a41186a200a29030037030020022002290388083703e806200620046b22074104490d0520012802002204280000210320012007417c6a3602042001200441046a360200200241c8066a41086a2207200241e8066a41086a290300370300200241c8066a41106a2204200241e8066a41106a290300370300200241c8066a41186a2206200241e8066a41186a290300370300200220022903e8063703c806200241c8096a200110dc0120022d00c8094101460d0520024188086a41386a200241810a6a290000220d37030020024188086a41306a200241f9096a290000220e37030020024188086a41286a200241f1096a290000220f37030020024188086a41206a200241e9096a290000221037030020024188086a41186a200241e1096a2900002214370300200241c8076a41086a2201200241d1096a290000370300200241c8076a41106a220a200241d9096a290000370300200241c8076a41186a220b2014370300200241c8076a41206a220c2010370300200241c8076a41286a2211200f370300200241c8076a41306a2212200e370300200241c8076a41386a2213200d370300200220022900c9093703c807200241e8036a41386a22152013290300370300200241e8036a41306a22132012290300370300200241e8036a41286a22122011290300370300200241e8036a41206a2211200c290300370300200241e8036a41186a220c200b290300370300200241e8036a41106a220b200a290300370300200241e8036a41086a220a2001290300370300200220022903c8073703e803200241a8066a41186a22012006290300370300200241a8066a41106a22062004290300370300200241a8066a41086a22042007290300370300200220022903c8063703a806200241a8046a41186a22072001290300370300200241a8046a41106a22012006290300370300200241a8046a41086a22062004290300370300200220022903a8063703a804200241c8036a41186a2204200241a8056a41186a290300370300200241c8036a41106a2216200241a8056a41106a290300370300200241c8036a41086a2217200241a8056a41086a290300370300200220022903a8053703c80320024188056a41186a221820024188066a41186a29030037030020024188056a41106a221920024188066a41106a29030037030020024188056a41086a221a20024188066a41086a290300370300200220022903880637038805200241c8046a41386a221b200241c8056a41386a290300370300200241c8046a41306a221c200241c8056a41306a290300370300200241c8046a41286a221d200241c8056a41286a290300370300200241c8046a41206a221e200241c8056a41206a290300370300200241c8046a41186a221f200241c8056a41186a290300370300200241c8046a41106a2220200241c8056a41106a290300370300200241c8046a41086a2221200241c8056a41086a290300370300200220022903c8053703c804200241a8036a41186a2018290300370300200241a8036a41106a2019290300370300200241a8036a41086a201a29030037030020022002290388053703a803200241e8026a41386a201b290300370300200241e8026a41306a201c290300370300200241e8026a41286a201d290300370300200241e8026a41206a201e290300370300200241e8026a41186a201f290300370300200241e8026a41106a2020290300370300200241e8026a41086a2021290300370300200220022903c8043703e802200241c8026a41186a2007290300370300200241c8026a41106a2001290300370300200241c8026a41086a2006290300370300200220022903a8043703c80220024188026a41386a201529030037030020024188026a41306a201329030037030020024188026a41286a201229030037030020024188026a41206a201129030037030020024188026a41186a200c29030037030020024188026a41106a200b29030037030020024188026a41086a200a290300370300200220022903e80337038802200241e8016a41186a2004290300370300200241e8016a41106a2016290300370300200241e8016a41086a2017290300370300200220022903c8033703e8014201210d0b200241c8016a41186a2201200241a8036a41186a290300370300200241c8016a41106a2207200241a8036a41106a290300370300200241c8016a41086a2204200241a8036a41086a29030037030020024188016a41086a2206200241e8026a41086a29030037030020024188016a41106a220a200241e8026a41106a29030037030020024188016a41186a220b200241e8026a41186a29030037030020024188016a41206a220c200241e8026a41206a29030037030020024188016a41286a2211200241e8026a41286a29030037030020024188016a41306a2212200241e8026a41306a29030037030020024188016a41386a2213200241e8026a41386a290300370300200220022903a8033703c801200220022903e80237038801200241e8006a41186a2215200241c8026a41186a290300370300200241e8006a41106a2216200241c8026a41106a290300370300200241e8006a41086a2217200241c8026a41086a290300370300200241286a41386a221820024188026a41386a290300370300200241286a41306a221920024188026a41306a290300370300200241286a41286a221a20024188026a41286a290300370300200241286a41206a221b20024188026a41206a290300370300200241286a41186a221c20024188026a41186a290300370300200241286a41106a221d20024188026a41106a290300370300200241286a41086a221e20024188026a41086a290300370300200220022903c8023703682002200229038802370328200241086a41186a221f200241e8016a41186a290300370300200241086a41106a2220200241e8016a41106a290300370300200241086a41086a2221200241e8016a41086a290300370300200220022903e801370308200041186a2008360200200020093703102000200d37030820002005370300200020022903c80137021c200041246a20042903003702002000412c6a2007290300370200200041346a2001290300370200200020022903880137023c200041c4006a2006290300370200200041cc006a200a290300370200200041d4006a200b290300370200200041dc006a200c290300370200200041e4006a2011290300370200200041ec006a2012290300370200200041f4006a2013290300370200200041fc006a200336020020004198016a201529030037030020004190016a201629030037030020004188016a201729030037030020004180016a2002290368370300200041d8016a2018290300370300200041d0016a2019290300370300200041c8016a201a290300370300200041c0016a201b290300370300200041b8016a201c290300370300200041b0016a201d290300370300200041a8016a201e290300370300200041a0016a2002290328370300200041f8016a201f290300370300200041f0016a2020290300370300200041e8016a2021290300370300200041e0016a20022903083703000c050b200741ff0171450d03200241003a00e8090c030b200741ff0171450d02200241003a00e8090c020b200741ff0171450d01200241003a00e8090c010b200042023703080c010b200042023703080b200241900a6a24000ba24607047f017e017f027e047f077e107f230041b00e6b220224000240024002402001280200220328020422044108490d002003280200220529000021062003200441786a3602042003200541086a360200200128020022032802042205450d01200328020022072d0000210420032005417f6a3602042003200741016a360200200441014b0d010240024002400240024002400240024020040e020001000b2001280200220328020422044108490d082003280200220529000021082003200441786a3602042003200541086a36020041002103200241003a00880d024002400240024002400340200128020022042802042205450d01200241e80c6a20036a200428020022072d00003a000020042005417f6a3602042004200741016a3602002002200341016a22033a00880d20034120470d000b200241b00d6a41186a200241e80c6a41186a2903002209370300200241a80c6a41086a2203200241e80c6a41086a290300370300200241a80c6a41106a2204200241e80c6a41106a290300370300200241a80c6a41186a22052009370300200220022903e80c3703a80c200241a8086a41186a22072005290300370300200241a8086a41106a22052004290300370300200241a8086a41086a22042003290300370300200220022903a80c3703a808200241a8056a41186a2007290300370300200241a8056a41106a2005290300370300200241a8056a41086a2004290300370300200220022903a8083703a80541002103200241003a00880d0340200128020022042802042205450d02200241e80c6a20036a200428020022072d00003a000020042005417f6a3602042004200741016a3602002002200341016a22033a00880d20034120470d000b200241b00d6a41186a200241e80c6a41186a2903002209370300200241a80c6a41086a2204200241e80c6a41086a290300370300200241a80c6a41106a2205200241e80c6a41106a290300370300200241a80c6a41186a22072009370300200220022903e80c3703a80c20012802002203280204220a4104490d0d2003280200220b280000210c2003200a417c6a3602042003200b41046a360200200241c8066a41086a2004290300370300200241c8066a41106a2005290300370300200241c8066a41186a2007290300370300200220022903a80c3703c80641002103200241003a00a80d0340200128020022042802042205450d03200241e80c6a20036a200428020022072d00003a000020042005417f6a3602042004200741016a3602002002200341016a22033a00a80d200341c000470d000b200241b00d6a41086a2203200241e80c6a41086a290300370300200241b00d6a41106a2204200241e80c6a41106a290300370300200241b00d6a41186a2205200241e80c6a41186a290300370300200241b00d6a41206a2207200241e80c6a41206a290300370300200241b00d6a41286a220a200241e80c6a41286a290300370300200241b00d6a41306a220b200241e80c6a41306a290300370300200241b00d6a41386a220d200241e80c6a41386a290300370300200220022903e80c3703b00d200241a80c6a41086a2003290300220e370300200241a80c6a41106a20042903002209370300200241a80c6a41186a2005290300220f370300200241a80c6a41206a20072903002210370300200241a80c6a41286a200a2903002211370300200241a80c6a41306a200b2903002212370300200241a80c6a41386a2203200d290300370300200220022903b00d22133703a80c200241a8086a41306a2012370300200241a8086a41286a2011370300200241a8086a41206a2010370300200241a8086a41186a200f370300200241a8086a41106a2009370300200241a8086a41386a20032903002214370300200241e8076a41306a22032012370300200241e8076a41286a22042011370300200241e8076a41206a22052010370300200241e8076a41186a2207200f370300200241e8076a41106a220a2009370300200241e8076a41086a220b200e370300200241e8076a41386a220d2014370300200220133703e807200241c8056a41386a200d290300370300200241c8056a41306a2003290300370300200241c8056a41286a2004290300370300200241c8056a41206a2005290300370300200241c8056a41186a2007290300370300200241c8056a41106a200a290300370300200241c8056a41086a200b290300370300200220022903e8073703c805200241a8066a41186a2203200241c8066a41186a290300370300200241a8066a41106a2204200241c8066a41106a290300370300200241a8066a41086a2205200241c8066a41086a290300370300200220022903c8063703a80620024188066a41186a200329030037030020024188066a41106a200429030037030020024188066a41086a2005290300370300200220022903a8063703880641002103200241003a00880d0340200128020022042802042205450d04200241e80c6a20036a200428020022072d00003a000020042005417f6a3602042004200741016a3602002002200341016a22033a00880d20034120470d000b200241b00d6a41186a200241e80c6a41186a2903002209370300200241a80c6a41086a2204200241e80c6a41086a290300370300200241a80c6a41106a2205200241e80c6a41106a290300370300200241a80c6a41186a22072009370300200220022903e80c3703a80c20012802002203280204220a4104490d0d2003280200220d280000210b2003200a417c6a3602042003200d41046a360200200241c8066a41086a2004290300370300200241c8066a41106a2005290300370300200241c8066a41186a2007290300370300200220022903a80c3703c80641002103200241003a00a80d0340200128020022042802042205450d05200241e80c6a20036a200428020022072d00003a000020042005417f6a3602042004200741016a3602002002200341016a22033a00a80d200341c000470d000b200241b00d6a41086a2201200241e80c6a41086a290300370300200241b00d6a41106a2203200241e80c6a41106a290300370300200241b00d6a41186a2204200241e80c6a41186a290300370300200241b00d6a41206a2205200241e80c6a41206a290300370300200241b00d6a41286a2207200241e80c6a41286a290300370300200241b00d6a41306a220a200241e80c6a41306a290300370300200241b00d6a41386a220d200241e80c6a41386a290300370300200220022903e80c3703b00d200241a80c6a41386a2215200d290300370300200241a80c6a41306a200a2903002209370300200241a80c6a41286a2007290300220f370300200241a80c6a41206a20052903002210370300200241a80c6a41186a20042903002211370300200241a80c6a41106a20032903002212370300200241a80c6a41086a2001290300220e370300200220022903b00d22133703a80c200241a8086a41306a22012009370300200241a8086a41286a2203200f370300200241a8086a41206a22042010370300200241a8086a41186a22052011370300200241a8086a41106a22072012370300200241a8086a41086a220a200e370300200241a8086a41386a220d2015290300370300200220133703a808200241e8076a41386a2215200d290300370300200241e8076a41306a220d2001290300370300200241e8076a41286a22012003290300370300200241e8076a41206a22032004290300370300200241e8076a41186a22042005290300370300200241e8076a41106a22052007290300370300200241e8076a41086a2207200a290300370300200220022903a8083703e807200241e8036a41386a220a2015290300370300200241e8036a41306a2215200d290300370300200241e8036a41286a220d2001290300370300200241e8036a41206a22012003290300370300200241e8036a41186a22032004290300370300200241e8036a41106a22042005290300370300200241e8036a41086a22052007290300370300200220022903e8073703e803200241a8066a41186a2207200241c8066a41186a290300370300200241a8066a41106a2216200241c8066a41106a290300370300200241a8066a41086a2217200241c8066a41086a290300370300200220022903c8063703a806200241a8046a41186a22182007290300370300200241a8046a41106a22072016290300370300200241a8046a41086a22162017290300370300200220022903a8063703a804200241c8036a41186a2217200241a8056a41186a290300370300200241c8036a41106a2219200241a8056a41106a290300370300200241c8036a41086a221a200241a8056a41086a290300370300200220022903a8053703c80320024188056a41186a221b20024188066a41186a29030037030020024188056a41106a221c20024188066a41106a29030037030020024188056a41086a221d20024188066a41086a290300370300200220022903880637038805200241c8046a41386a221e200241c8056a41386a290300370300200241c8046a41306a221f200241c8056a41306a290300370300200241c8046a41286a2220200241c8056a41286a290300370300200241c8046a41206a2221200241c8056a41206a290300370300200241c8046a41186a2222200241c8056a41186a290300370300200241c8046a41106a2223200241c8056a41106a290300370300200241c8046a41086a2224200241c8056a41086a290300370300200220022903c8053703c804200241a8036a41186a201b290300370300200241a8036a41106a201c290300370300200241a8036a41086a201d29030037030020022002290388053703a803200241e8026a41386a201e290300370300200241e8026a41306a201f290300370300200241e8026a41286a2020290300370300200241e8026a41206a2021290300370300200241e8026a41186a2022290300370300200241e8026a41106a2023290300370300200241e8026a41086a2024290300370300200220022903c8043703e802200241c8026a41186a2018290300370300200241c8026a41106a2007290300370300200241c8026a41086a2016290300370300200220022903a8043703c80220024188026a41386a200a29030037030020024188026a41306a201529030037030020024188026a41286a200d29030037030020024188026a41206a200129030037030020024188026a41186a200329030037030020024188026a41106a200429030037030020024188026a41086a2005290300370300200220022903e80337038802200241e8016a41186a2017290300370300200241e8016a41106a2019290300370300200241e8016a41086a201a290300370300200220022903c8033703e801420021090c060b200341ff0171450d0c200241003a00880d0c0c0b200341ff0171450d0b200241003a00880d0c0b0b200341ff0171450d0a200241003a00a80d0c0a0b200341ff0171450d09200241003a00880d0c090b200341ff0171450d08200241003a00a80d0c080b2001280200220328020422044108490d072003280200220529000021082003200441786a3602042003200541086a36020041002103200241003a00880d0340200128020022042802042205450d02200241e80c6a20036a200428020022072d00003a000020042005417f6a3602042004200741016a3602002002200341016a22033a00880d20034120470d000b200241b00d6a41186a200241e80c6a41186a2903002209370300200241a80c6a41086a2203200241e80c6a41086a290300370300200241a80c6a41106a2204200241e80c6a41106a290300370300200241a80c6a41186a22052009370300200220022903e80c3703a80c200241a8086a41186a22072005290300370300200241a8086a41106a22052004290300370300200241a8086a41086a22042003290300370300200220022903a80c3703a808200241a8056a41186a2007290300370300200241a8056a41106a2005290300370300200241a8056a41086a2004290300370300200220022903a8083703a80541002103200241003a00880d0340200128020022042802042205450d03200241e80c6a20036a200428020022072d00003a000020042005417f6a3602042004200741016a3602002002200341016a22033a00880d20034120470d000b200241b00d6a41186a200241e80c6a41186a2903002209370300200241a80c6a41086a2204200241e80c6a41086a290300370300200241a80c6a41106a2205200241e80c6a41106a290300370300200241a80c6a41186a22072009370300200220022903e80c3703a80c20012802002203280204220a4104490d072003280200220b280000210c2003200a417c6a3602042003200b41046a360200200241c8066a41086a2004290300370300200241c8066a41106a2005290300370300200241c8066a41186a2007290300370300200220022903a80c3703c80641002103200241003a00a80d0340200128020022042802042205450d04200241e80c6a20036a200428020022072d00003a000020042005417f6a3602042004200741016a3602002002200341016a22033a00a80d200341c000470d000b200241b00d6a41086a2203200241e80c6a41086a290300370300200241b00d6a41106a2204200241e80c6a41106a290300370300200241b00d6a41186a2205200241e80c6a41186a290300370300200241b00d6a41206a2207200241e80c6a41206a290300370300200241b00d6a41286a220a200241e80c6a41286a290300370300200241b00d6a41306a220b200241e80c6a41306a290300370300200241b00d6a41386a220d200241e80c6a41386a290300370300200220022903e80c3703b00d200241a80c6a41086a2003290300220e370300200241a80c6a41106a20042903002209370300200241a80c6a41186a2005290300220f370300200241a80c6a41206a20072903002210370300200241a80c6a41286a200a2903002211370300200241a80c6a41306a200b2903002212370300200241a80c6a41386a2203200d290300370300200220022903b00d22133703a80c200241a8086a41306a2012370300200241a8086a41286a2011370300200241a8086a41206a2010370300200241a8086a41186a200f370300200241a8086a41106a2009370300200241a8086a41386a20032903002214370300200241e8076a41306a22032012370300200241e8076a41286a22042011370300200241e8076a41206a22052010370300200241e8076a41186a2207200f370300200241e8076a41106a220a2009370300200241e8076a41086a220b200e370300200241e8076a41386a220d2014370300200220133703e807200241c8056a41386a200d290300370300200241c8056a41306a2003290300370300200241c8056a41286a2004290300370300200241c8056a41206a2005290300370300200241c8056a41186a2007290300370300200241c8056a41106a200a290300370300200241c8056a41086a200b290300370300200220022903e8073703c805200241a8066a41186a2203200241c8066a41186a290300370300200241a8066a41106a2204200241c8066a41106a290300370300200241a8066a41086a2205200241c8066a41086a290300370300200220022903c8063703a80620024188066a41186a200329030037030020024188066a41106a200429030037030020024188066a41086a2005290300370300200220022903a8063703880641002103200241003a00880d0340200128020022042802042205450d05200241e80c6a20036a200428020022072d00003a000020042005417f6a3602042004200741016a3602002002200341016a22033a00880d20034120470d000b200241b00d6a41186a200241e80c6a41186a2903002209370300200241a80c6a41086a2204200241e80c6a41086a290300370300200241a80c6a41106a2205200241e80c6a41106a290300370300200241a80c6a41186a22072009370300200220022903e80c3703a80c20012802002203280204220a4104490d072003280200220d280000210b2003200a417c6a3602042003200d41046a360200200241c8066a41086a2004290300370300200241c8066a41106a2005290300370300200241c8066a41186a2007290300370300200220022903a80c3703c80641002103200241003a00a80d0340200128020022042802042205450d06200241e80c6a20036a200428020022072d00003a000020042005417f6a3602042004200741016a3602002002200341016a22033a00a80d200341c000470d000b200241b00d6a41086a2201200241e80c6a41086a290300370300200241b00d6a41106a2203200241e80c6a41106a290300370300200241b00d6a41186a2204200241e80c6a41186a290300370300200241b00d6a41206a2205200241e80c6a41206a290300370300200241b00d6a41286a2207200241e80c6a41286a290300370300200241b00d6a41306a220a200241e80c6a41306a290300370300200241b00d6a41386a220d200241e80c6a41386a290300370300200220022903e80c3703b00d200241a80c6a41386a2215200d290300370300200241a80c6a41306a200a2903002209370300200241a80c6a41286a2007290300220f370300200241a80c6a41206a20052903002210370300200241a80c6a41186a20042903002211370300200241a80c6a41106a20032903002212370300200241a80c6a41086a2001290300220e370300200220022903b00d22133703a80c200241a8086a41306a22012009370300200241a8086a41286a2203200f370300200241a8086a41206a22042010370300200241a8086a41186a22052011370300200241a8086a41106a22072012370300200241a8086a41086a220a200e370300200241a8086a41386a220d2015290300370300200220133703a808200241e8076a41386a2215200d290300370300200241e8076a41306a220d2001290300370300200241e8076a41286a22012003290300370300200241e8076a41206a22032004290300370300200241e8076a41186a22042005290300370300200241e8076a41106a22052007290300370300200241e8076a41086a2207200a290300370300200220022903a8083703e807200241e8036a41386a220a2015290300370300200241e8036a41306a2215200d290300370300200241e8036a41286a220d2001290300370300200241e8036a41206a22012003290300370300200241e8036a41186a22032004290300370300200241e8036a41106a22042005290300370300200241e8036a41086a22052007290300370300200220022903e8073703e803200241a8066a41186a2207200241c8066a41186a290300370300200241a8066a41106a2216200241c8066a41106a290300370300200241a8066a41086a2217200241c8066a41086a290300370300200220022903c8063703a806200241a8046a41186a22182007290300370300200241a8046a41106a22072016290300370300200241a8046a41086a22162017290300370300200220022903a8063703a804200241c8036a41186a2217200241a8056a41186a290300370300200241c8036a41106a2219200241a8056a41106a290300370300200241c8036a41086a221a200241a8056a41086a290300370300200220022903a8053703c80320024188056a41186a221b20024188066a41186a29030037030020024188056a41106a221c20024188066a41106a29030037030020024188056a41086a221d20024188066a41086a290300370300200220022903880637038805200241c8046a41386a221e200241c8056a41386a290300370300200241c8046a41306a221f200241c8056a41306a290300370300200241c8046a41286a2220200241c8056a41286a290300370300200241c8046a41206a2221200241c8056a41206a290300370300200241c8046a41186a2222200241c8056a41186a290300370300200241c8046a41106a2223200241c8056a41106a290300370300200241c8046a41086a2224200241c8056a41086a290300370300200220022903c8053703c804200241a8036a41186a201b290300370300200241a8036a41106a201c290300370300200241a8036a41086a201d29030037030020022002290388053703a803200241e8026a41386a201e290300370300200241e8026a41306a201f290300370300200241e8026a41286a2020290300370300200241e8026a41206a2021290300370300200241e8026a41186a2022290300370300200241e8026a41106a2023290300370300200241e8026a41086a2024290300370300200220022903c8043703e802200241c8026a41186a2018290300370300200241c8026a41106a2007290300370300200241c8026a41086a2016290300370300200220022903a8043703c80220024188026a41386a200a29030037030020024188026a41306a201529030037030020024188026a41286a200d29030037030020024188026a41206a200129030037030020024188026a41186a200329030037030020024188026a41106a200429030037030020024188026a41086a2005290300370300200220022903e80337038802200241e8016a41186a2017290300370300200241e8016a41106a2019290300370300200241e8016a41086a201a290300370300200220022903c8033703e801420121090b200241c8016a41186a2201200241a8036a41186a290300370300200241c8016a41106a2203200241a8036a41106a290300370300200241c8016a41086a2204200241a8036a41086a29030037030020024188016a41086a2205200241e8026a41086a29030037030020024188016a41106a2207200241e8026a41106a29030037030020024188016a41186a220a200241e8026a41186a29030037030020024188016a41206a220d200241e8026a41206a29030037030020024188016a41286a2215200241e8026a41286a29030037030020024188016a41306a2216200241e8026a41306a29030037030020024188016a41386a2217200241e8026a41386a290300370300200220022903a8033703c801200220022903e80237038801200241e8006a41186a2218200241c8026a41186a290300370300200241e8006a41106a2219200241c8026a41106a290300370300200241e8006a41086a221a200241c8026a41086a290300370300200241286a41386a221b20024188026a41386a290300370300200241286a41306a221c20024188026a41306a290300370300200241286a41286a221d20024188026a41286a290300370300200241286a41206a221e20024188026a41206a290300370300200241286a41186a221f20024188026a41186a290300370300200241286a41106a222020024188026a41106a290300370300200241286a41086a222120024188026a41086a290300370300200220022903c8023703682002200229038802370328200241086a41186a2222200241e8016a41186a290300370300200241086a41106a2223200241e8016a41106a290300370300200241086a41086a2224200241e8016a41086a290300370300200220022903e801370308200041186a200c360200200020083703102000200937030820002006370300200020022903c80137021c200041246a20042903003702002000412c6a2003290300370200200041346a2001290300370200200020022903880137023c200041c4006a2005290300370200200041cc006a2007290300370200200041d4006a200a290300370200200041dc006a200d290300370200200041e4006a2015290300370200200041ec006a2016290300370200200041f4006a2017290300370200200041fc006a200b36020020004198016a201829030037030020004190016a201929030037030020004188016a201a29030037030020004180016a2002290368370300200041d8016a201b290300370300200041d0016a201c290300370300200041c8016a201d290300370300200041c0016a201e290300370300200041b8016a201f290300370300200041b0016a2020290300370300200041a8016a2021290300370300200041a0016a2002290328370300200041f8016a2022290300370300200041f0016a2023290300370300200041e8016a2024290300370300200041e0016a20022903083703000c070b200341ff0171450d05200241003a00880d0c050b200341ff0171450d04200241003a00880d0c040b200341ff0171450d03200241003a00a80d0c030b200341ff0171450d02200241003a00880d0c020b200341ff0171450d01200241003a00a80d0c010b200042023703080c010b200042023703080b200241b00e6a24000bef0301037f230041106b2205240041002106200541003602082005420137030002402000280200220741024b0d00024002400240024020070e03000102000b200541004101106d2005280200200528020822066a41003a00002005200641016a3602082005200536020c200041086a2005410c6a109c0120002802042106200520052802084104106d2005280200200528020822006a2006360000200041046a21060c020b200541004101106d2005280200200528020822066a41013a00002005200641016a3602082005200536020c200041086a2005410c6a109c0120002802042106200520052802084104106d2005280200200528020822006a2006360000200041046a21060c010b200541004101106d2005280200200528020822066a41023a00002005200641016a3602082005200536020c200041086a2005410c6a109c0120002802042106200520052802084104106d2005280200200528020822006a2006360000200041046a21060b200520063602080b2005220020064108106d2005280200200528020822066a20033700002005200641086a2206360208200020064108106d2005280200200528020822066a20043700002005200641086a22063602082002200528020020062001108303210602402005280204450d00200528020010260b200541106a240020060b8f0201027f20014180feff07714108762102024002402001410171450d00411f210341e9b6c700210102400240200241ff01710e03000103000b41c100210341a8b6c70021010c020b41c100210341e7b5c70021010c010b411f210341c8b5c7002101024002400240024002400240024002400240200241ff01710e0a00060102030405090708000b4120210341a8b5c70021010c080b4127210341c8b4c70021010c070b4117210341b1b4c70021010c060b4192b4c70021010c050b4126210341ecb3c70021010c040b412b210341c1b3c70021010c030b4139210341efb4c70021010c020b413b21034186b3c70021010c010b41d200210341b4b2c70021010b20002003360204200020013602000bbc1103077f017e0e7f230041b0096b2203240041002104200341003602a806200320023602a406200320013602a0064101210541012106024002400240024002400240024002400240024002400240024002400240024002400240024002402002450d0041012107200341013602a806024020012d000022080d000c020b024002400240024002400240024002400240024002400240200841c00171220741c001460d0002402007418001460d0041012106200741c000470d0d410121072008413f712204413f470d034102210741412106034002402007417f6a2002490d00410121060c0f0b200320073602a806200120076a417f6a2d0000220441ff01470d03200641817e6a210641012109200741016a2207418302470d000b418202210741ffff0321040c0b0b4200210a410121072008413f712204413f470d0441022107414121044101210603402007417f6a20024f0d0d200320073602a806200120076a417f6a2d0000220841ff01470d04200441817e6a2104200741016a2207418302470d000b4200210a0c050b428002210a410121072008413f712204413f470d03410221074141210441012106024003402007417f6a20024f0d0d200320073602a806200120076a417f6a2d0000220841ff01470d01200441817e6a2104200741016a2207418302470d000b428002210a0c050b200820046b21040c030b200420066b21040b200441017122090d070c080b200820046b21040b200a502108200441017122090d010c020b200a502108418202210741ffff032104410121090b200720024f0d0141002106200120076a2d000041104f0d050b410121062007200441016a4101766a220b20024b0d042003200b3602a806200b41026a220420024b0d04200320043602a806200b417e4f0d012001200b6a2f0000210c410021044100210d024020080d00200341106a200341a0066a10d30420032802100d0520032802a806220e20032802146a220f20032802a4064b0d052003200f3602a8064101210d0b200341023602a40920034102360298092003410236028c092003410236028009200341023602f408200341023602e808200341023602dc08200341023602d008200341023602c408200341023602b808200341023602ac08200341023602a00820034102360294082003410236028808200341023602fc07200341023602f007200341f0076a2106200c41ffff037121100340024020102004410f7176410171450d00200341086a200341a0066a10d3040240024020032802080d0020032802a806220c200328020c22116a220820032802a4064d0d010b410121060c070b200320083602a806200641086a2008360200200641046a200c360200200620114120473602000b2006410c6a2106200441016a22044110470d000b200341e0046a200341f0076a41c00110cf061a410421040c050b2007200241b8d8c40010320c060b200b20044198d8c4001048000b200720024f0d0341002106200120076a2d000041104f0d010b410121062007200441016a4101766a220b20024b0d002003200b3602a8062003200341a0066a10d30420032802000d0020032802a806220d20032802046a220e20032802a4064b0d002003200e3602a806200341e0046a200341f0076a41c00110cf061a410121040c010b200341a0036a200341e0046a41c00110cf061a200020063a00010c0e0b200341a0036a200341e0046a41c00110cf061a200341c0016a41186a200f360200200341c0016a41146a200e360200200341c0016a41106a200d360200200341c0016a410c6a2009360200200341c0016a41086a200b360200200320073602c401200320043602c001200341c0016a411c6a200341a0036a41c00110cf062112410021054100211320040e050c020101030c0b2007200241a8d8c4001032000b000b200b2007490d01200b20024b0d02200e200d490d03200e20024b0d04200b20076b2108200120076a21062001200d6a2114200e200d6b2115410121130c090b200341023602a40920034102360298092003410236028c092003410236028009200341023602f408200341023602e808200341023602dc08200341023602d008200341023602c408200341023602b808200341023602ac08200341023602a00820034102360294082003410236028808200341023602fc07200341023602f007410021060340410221080240201220066a220428020041024622100d004100200420101b220841086a2802002104200841046a280200210c0240024020082802004101470d002004200c490d0841012108200420024d0d012004200241dcbdc7001047000b2004200c490d0841002108200420024b0d090b2004200c6b21112001200c6a210c0b200341f0076a20066a22042008360200200441086a2011360200200441046a200c3602002006410c6a220641c001460d080c000b0b2007200b41d4bec7001048000b200b200241d4bec7001047000b200d200e41e4bec7001048000b200e200241e4bec7001047000b200c200441dcbdc7001048000b200c200441ecbdc7001048000b2004200241ecbdc7001047000b02400240200d4101460d00410021110c010b200f200e490d03200f20024b0d04200f200e6b210c2001200e6a21110b200b2007490d04200b20024b0d05200341f8076a280200211620032802f407211520032802f0072114200341186a200341fc076a41a80110cf061a200b20076b2108200120076a2106200341ac096a2802002110200341a8096a280200211720032802a4092118410421130b2000411c6a2016360200200041186a2015360200200041146a2014360200200041106a20093602002000410c6a2008360200200041086a2006360200200041046a2013360200200041206a200341186a41a80110cf061a200041d8016a200c360200200041d4016a2011360200200041d0016a2010360200200041cc016a2017360200200041c8016a20183602000b200020053a0000200341b0096a24000f0b200e200f41f4bec7001048000b200f200241f4bec7001047000b2007200b41d4bec7001048000b200b200241d4bec7001047000b890301077f41012102024002402001280208220341016a2204200128020422054d0d000c010b0240024002400240200320054f0d002001280200220620036a2d00002107200120043602080240200741037122084103460d0002400240024020080e03000102000b20074102762108410021020c070b0240200341026a220320054d0d000c070b200120033602082004417f460d03200620046a2d0000410874200772220141ffff0371418002490d06200141fcff03714102762108410021020c060b200341046a220320054b0d05200120033602082004417d4f0d03200620046a22012f0000200141026a2d000041107472410874200772220141808004492102200141027621080c050b0240200741034d0d000c050b200341056a220320054b0d04200120033602082004417c4f0d03200620046a28000022084180808080044921020c040b200320054180b8c7001032000b417f20034188b7c7001048000b200420034188b7c7001048000b200420034188b7c7001048000b20002008360204200020023602000b130020004105360204200041c8d8c4003602000bcf0101047f200041ffff03200041ffff03491b22032000413e2003413e491b22006b21042003413f20032000461b20016a2100200241086a2103410121010340024002400240200141ff01714102470d00200021050c010b410021052001410171450d00410021010c010b024002402004450d002004418002490d01200441817e6a210441ff012100410221010c020b0f0b2004417f6a210041022101410021040b200220032802004101106d2002280200200328020022066a20003a00002003200641016a360200200521000c000b0bc03708057f017e0a7f017e037f017e037f057e230041f0016b220324000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402001280200417f6a0e0a00010203090807060504000b20022d0001210420022d00002101200228022422022002280200417f6a22053602000240024020010d00024020050d002002280208200228020c2802001103000240200228020c280204450d00200228020810260b20022002280204417f6a220136020420010d00200210260b200441ff01710d012000420037030820002003280070360019200041186a41003a00002000411c6a200341f3006a280000360000200042003703000c170b20050d002002280208200228020c2802001103000240200228020c280204450d00200228020810260b20022002280204417f6a220136020420010d00200210260b200341e0006a41026a200341c0006a41026a2d000022023a0000200320032f004022013b0160200041206a41023a0000200041186a41003a000020004200370308200020013b0021200041236a20023a0000200042013703000c150b200141086a280200210520022d0001210620022d0000210420012802042107200228022422022002280200417f6a22013602000240024020040d00024020010d002002280208200228020c2802001103000240200228020c280204450d00200228020810260b20022002280204417f6a220136020420010d00200210260b200641ff01714101470d0102402005450d00200710260b2000420037030820002003280070360019200041186a41003a00002000411c6a200341f3006a280000360000200042003703000c160b20010d002002280208200228020c2802001103000240200228020c280204450d00200228020810260b20022002280204417f6a220136020420010d00200210260b02402005450d00200710260b200341e0006a41026a200341c0006a41026a2d000022023a0000200320032f004022013b0160200041206a41023a0000200041186a41003a000020004200370308200020013b0021200041236a20023a0000200042013703000c140b200141086a290300210820022d0001210420022d00002101200228022422022002280200417f6a220536020002400240024020010d00024020050d002002280208200228020c2802001103000240200228020c280204450d00200228020810260b20022002280204417f6a220136020420010d00200210260b200441ff01710d014108102422020d020c170b20050d002002280208200228020c2802001103000240200228020c280204450d00200228020810260b20022002280204417f6a220136020420010d00200210260b200341306a41026a200341e0006a41026a2d000022023a0000200320032f006022013b0130200041206a41023a0000200041186a41003a000020004200370308200020013b0021200041236a20023a0000200042013703000c140b2003420837027420032002360270200341f0006a41004108106d20032802702202200328027822016a20083700002003200141086a220136027841b0dfc400410a2002200110b30102402003280274450d00200210260b200041186a41003a000020004200370308200020032800403600192000411c6a200341c3006a280000360000200042003703000c130b2001410c6a2802002109200141086a28020021052001280204210720022d0001210620022d00002101200228022422022002280200417f6a220436020002400240024020010d00024020040d002002280208200228020c2802001103000240200228020c280204450d00200228020810260b20022002280204417f6a220136020420010d00200210260b200641ff01710d01200341f0006a2007200910d70420032802702202450d10200328027421062003200341f8006a28020036023420032002360230200341106a200341306a108f01410221044100210a2003280210450d020c0e0b20040d002002280208200228020c2802001103000240200228020c280204450d00200228020810260b20022002280204417f6a220136020420010d00200210260b410221022003413c6a41026a20032d00433a0000200320032f00413b013c0c120b2003280234220b20032802142201490d0b02402001417f4c0d000240024020010d004100210c4101210d0c010b2001102a220d450d152003280234210b2001210c0b02400240200b2001490d00200d2003280230200110cf06210a2003280234220b20014f0d012001200b41b8afc0001048000b4100210a200c450d0d200d10260c0e0b2003200b20016b3602342003200328023020016a3602300240200a0d004100210a0c0e0b200341086a200341306a108f0120032802080d092003280234220e200328020c220b490d09200b417f4c0d0002400240200b0d004100210d4101210f0c010b200b102a220f450d152003280234210e200b210d0b02400240200e200b490d00200f2003280230200b10cf0621102003280234220e200b4f0d01200b200e41b8afc0001048000b200d450d0a200f10260c0a0b2003200e200b6b220e36023420032003280230200b6a220b3602302010450d09024002400240200e4104490d002003200b41046a3602302003200e417c6a221136023420114104490d01200b28000421112003200b41086a3602302003200e41786a221236023420124104490d0a2003200e41746a3602342003200b410c6a3602302003200341306a108f012003280200450d020c0b0b0240200d450d00201010260b200c450d0c0c0d0b0240200d450d00201010260b200c450d0b0c0c0b200328020422122003280234410c6e220b200b20124b1bad420c7e2208422088a70d002008a7220b417f4c0d0002400240200b0d004104210e0c010b200b1024220e450d150b200b410c6ead210802402012450d000340200341e0006a200341306a10d8040240024002400240024020032d00604101460d002003280234220b4104490d00200329006121132003280230221428000021152003200b417c6a3602342003201441046a3602302008422088a7220b2008a7470d040240200b41016a2214200b490d00200b4101742216201420142016491b22144104201441044b1bad420c7e2217422088a722160d002017a722144100480d00200b410c6c2018200b1b21180240200e4100200b1b220e0d0020140d034100410420164100471b210e0c050b20182014460d04024020180d0020140d034104210e0c050b200e201820141028220e450d030c040b102e000b2008a72201450d0e2001410c6c450d0e200e10260c0e0b20141024220e0d010b102c000b2008428080808070832014410c6ead8421080b200e2008422088a7410c6c6a220b2015360208200b201337020020084280808080107c21082012417f6a22120d000b0b200e450d082008a7210b02402003280234221241044f0d000240200b450d00200b410c6c450d00200e10260b0240200d450d00201010260b200c450d0b0c0c0b20032012417c6a3602342003200328023041046a36023041012104200a210a0c0d0b1034000b2002411a6a2901002108200241196a2d00002107200241186a2d00002106200241166a2f01002109200241156a2d0000210a200241146a2d0000210b200241126a2f0100210c200241116a2d0000210d200241106a2d0000210f2002410e6a2f0100210e2002410d6a2d000021112002410c6a2d000021102002410a6a2f01002112200241096a2d00002114200241086a2d00002115200241066a2f01002118200241056a2d00002116200241046a2d00002119200241026a2f0100211a20022d0001210420022d00002101200228022422022002280200417f6a22053602000240024002400240024002400240024020010d00024020050d002002280208200228020c2802001103000240200228020c280204450d00200228020810260b20022002280204417f6a220136020420010d00200210260b41012102200441ff01714101470d0120032008370358200320073a0057200320063a0056200320093b01542003200a3a00532003200b3a00522003200c3b01502003200d3a004f2003200f3a004e2003200e3b014c200320113a004b200320103a004a200320123b0148200320143a0047200320153a0046200320183b0144200320163a0043200320193a00422003201a3b0140200341e0006a200341c0006a10d803200341f0006a20032802602201200328026810d9034200210842002113420021174200211b4200211c4200211d4200211e4200211f024020032903704201520d0020032d00bc0145210220034180016a290300211f20034190016a290300211320034188016a2903002108200341a0016a290300211b20034198016a2903002117200341b0016a290300211d200341a8016a290300211c2003290378211e0b02402003280264450d00200110260b2002450d032017200884201c84201e84201b201384201d84201f848450450d02200341f0006a200341c0006a10d803200341186a20032802702201200328027841d4c0c700410041001081022003280218210202402003280274450d00200110260b024020024101470d00200341e0006a200341c0006a10d803200341f0006a200328026022022003280268220510d9030240200329037042015222010d002002200510ff010b200120032d00bc014572210102402003280264450d00200210260b20010d0041002802c8c2474104490d0041002802c4c247210241002802c0c247210141002802ccc2472105200341b0016a41ca09360200200341a8016a42dd80808010370300200341a4016a4180d3c4003602002003419c016a420c37020020034198016a41dadfc40036020020034190016a42003703002003418c016a41d4c0c70036020020034180016a4201370300200341f8006a4106360200200341ccdfc40036027c200341d4dfc40036027420034104360270200141c8a1c000200541024622051b200341f0006a200241b0a1c00020051b2802101102000b200341f0006a41086a41043a0000200341f9006a200329034037000020034181016a200341c0006a41086a29030037000020034189016a200341d0006a29030037000020034191016a200341d8006a290300370000200341003a0070200341f0006a108702200341043a00300c060b20050d002002280208200228020c2802001103000240200228020c280204450d00200228020810260b20022002280204417f6a220136020420010d00200210260b200341023a00300c030b200341306a410410e6020c010b200341306a410510e6020b20032d00304104460d01200329023421080b2003280230210220002008370024200041206a2002360000200041186a41003a000020004200370308420121080c010b420021082000420037030820002003280070360019200041186a41003a00002000411c6a200341f3006a2800003600000b200020083703000c110b2001410c6a2802002109200141086a280200210520022d0001210620022d0000210420012802042107200228022422022002280200417f6a22013602000240024020040d00024020010d002002280208200228020c2802001103000240200228020c280204450d00200228020810260b20022002280204417f6a220136020420010d00200210260b200641ff01710d012007200910af0302402005450d00200710260b2000420037030820002003280070360019200041186a41003a00002000411c6a200341f3006a280000360000200042003703000c120b20010d002002280208200228020c2802001103000240200228020c280204450d00200228020810260b20022002280204417f6a220136020420010d00200210260b02402005450d00200710260b200341e0006a41026a200341c0006a41026a2d000022023a0000200320032f004022013b0160200041206a41023a0000200041186a41003a000020004200370308200020013b0021200041236a20023a0000200042013703000c100b2001410c6a2802002104200141086a280200210520022d0001210920022d0000210620012802042107200228022422022002280200417f6a22013602000240024020060d00024020010d002002280208200228020c2802001103000240200228020c280204450d00200228020810260b20022002280204417f6a220136020420010d00200210260b200941ff01710d0102402004450d0020072004410c6c6a21012007210203402002280200200241086a28020010ff012002410c6a22022001470d000b2004410c6c21012007210203400240200241046a280200450d00200228020010260b2002410c6a2102200141746a22010d000b0b02402005450d002005410c6c450d00200710260b2000420037030820002003280070360019200041186a41003a00002000411c6a200341f3006a280000360000200042003703000c110b20010d002002280208200228020c2802001103000240200228020c280204450d00200228020810260b20022002280204417f6a220136020420010d00200210260b02402004450d002004410c6c21012007210203400240200241046a280200450d00200228020010260b2002410c6a2102200141746a22010d000b0b02402005450d002005410c6c450d00200710260b200341e0006a41026a200341c0006a41026a2d000022023a0000200320032f004022013b0160200041206a41023a0000200041186a41003a000020004200370308200020013b0021200041236a20023a0000200042013703000c0f0b2001410c6a2802002104200141086a280200210520022d0001210920022d0000210620012802042107200228022422022002280200417f6a22013602000240024020060d00024020010d002002280208200228020c2802001103000240200228020c280204450d00200228020810260b20022002280204417f6a220136020420010d00200210260b200941ff01710d0102402004450d002007200441186c6a21012007210203402002280200200241086a2802002002410c6a280200200241146a28020010b301200241186a22022001470d000b200441186c21012007210203400240200241046a280200450d00200228020010260b0240200241106a280200450d002002410c6a28020010260b200241186a2102200141686a22010d000b0b02402005450d00200541186c450d00200710260b2000420037030820002003280070360019200041186a41003a00002000411c6a200341f3006a280000360000200042003703000c100b20010d002002280208200228020c2802001103000240200228020c280204450d00200228020810260b20022002280204417f6a220136020420010d00200210260b02402004450d00200441186c21012007210203400240200241046a280200450d00200228020010260b0240200241106a280200450d002002410c6a28020010260b200241186a2102200141686a22010d000b0b02402005450d00200541186c450d00200710260b200341e0006a41026a200341c0006a41026a2d000022023a0000200320032f004022013b0160200041206a41023a0000200041186a41003a000020004200370308200020013b0021200041236a20023a0000200042013703000c0e0b2001410c6a2802002106200141086a28020021092001280204210720022d0001210420022d00002101200228022422022002280200417f6a2205360200024002400240024020010d00024020050d002002280208200228020c2802001103000240200228020c280204450d00200228020810260b20022002280204417f6a220136020420010d00200210260b200441ff01710d0120074101460d0241bfdfc400410d10ff010c030b20050d002002280208200228020c2802001103000240200228020c280204450d00200228020810260b20022002280204417f6a220136020420010d00200210260b200341306a41026a200341e0006a41026a2d000022023a0000200320032f006022013b0130200041206a41023a0000200041186a41003a000020004200370308200020013b0021200041236a20023a0000200042013703000c0f0b2003410036027820034201370370200341f0006a41004104106d2003280270200328027822026a20093600002003200241046a2202360278200341f0006a20024104106d20032802702202200328027822016a20063600002003200141046a220136027841bfdfc400410d2002200110b3012003280274450d00200210260b200341fc006a2006360200200341f8006a200936020020032007360274200341043a0070200341f0006a108602200041186a41003a000020004200370308200020032800403600192000411c6a200341c3006a280000360000200042003703000c0d0b2001410c6a2802002109200141086a280200210520022d0001210620022d0000210420012802042107200228022422022002280200417f6a22013602000240024020040d00024020010d002002280208200228020c2802001103000240200228020c280204450d00200228020810260b20022002280204417f6a220136020420010d00200210260b200641ff01710d0141badfc40041052007200910b301200341f8006a41023a0000200341003a0070200341f0006a10870202402005450d00200710260b2000420037030820002003280040360019200041186a41003a00002000411c6a200341c3006a280000360000200042003703000c0e0b20010d002002280208200228020c2802001103000240200228020c280204450d00200228020810260b20022002280204417f6a220136020420010d00200210260b02402005450d00200710260b200341306a41026a200341e0006a41026a2d000022023a0000200320032f006022013b0130200041206a41023a0000200041186a41003a000020004200370308200020013b0021200041236a20023a0000200042013703000c0c0b0240200d450d00201010260b200c450d020c030b0240200d450d00201010260b200c450d010c020b200c0d010b200a210a0c020b200a1026200a210a0c010b0b02402006450d00200210260b20044102460d000240024020014106470d00200a41a88ac700460d01200a41a88ac700410610d206450d010b200341c0006a410110e6020c020b024020110d00200341c0006a410210e6020c020b200341043a00400240200c450d00200a10260b0240200d450d00200f10260b200b450d03200b410c6c450d030c020b200341c0006a410310e6020c020b0240200c450d00200a10260b0240200d450d00200f10260b200b450d01200b410c6c450d010b200e10260b2003413c6a41026a20032d00433a0000200320032f00413b013c024020032d004022024104460d00200329024421080c010b41badfc40041052007200910b301200341f8006a41023a0000200341003a0070200341f0006a10870202402005450d00200710260b2000420037030820002003280021360019200041186a41003a00002000411c6a200341246a280000360000200042003703000c010b2003412c6a41026a22012003413c6a41026a2d00003a0000200320032f013c3b012c02402005450d00200710260b200341286a41026a20012d000022013a0000200320032f012c22053b0128200041206a20023a0000200041186a41003a000020004200370308200020053b0021200041236a20013a000020002008370024200042013703000b200341f0016a24000f0b1033000b130020002002ad4220862001ad84100f10c5060be60301057f230041106b220241003a000802400240024020012802042203450d00200128020022042d0000210520012003417f6a2206360204200241013a00082001200441016a360200200220053a000020060d010c020b200041013a00000f0b200128020022042d0000210520012003417e6a22063602042001200441016a360200200241023a0008200220053a00012006450d00200128020022042d0000210520012003417d6a22063602042001200441016a360200200241033a0008200220053a00022006450d00200128020022042d0000210520012003417c6a22063602042001200441016a360200200241043a0008200220053a00032006450d00200128020022042d0000210520012003417b6a22063602042001200441016a360200200241053a0008200220053a00042006450d00200128020022042d0000210520012003417a6a22063602042001200441016a360200200241063a0008200220053a00052006450d00200128020022042d000021052001200341796a22063602042001200441016a360200200241073a0008200220053a00062006450d00200041003a0000200128020022042d000021052001200341786a3602042001200441016a360200200220053a0007200020022903003700010f0b200041013a0000200241003a00080bf10809017f017e057f017e017f017e0a7f027e037f230041e0006b2201240042002102200141d8006a22034200370300200141d0006a22044200370300200141c0006a41086a2205420037030020014200370340200141c0006a41818dc700410910fb01200141206a41acd6c000410610fb012003200141206a41086a220629000037030020042001290020370300200141206a200141c0006a10fd01200128022021072001290224210820034200370300200442003703002005420037030020014200370340200141206a41eb8cc700410a10fb012005200629000037030020012001290020370340200141206a41dc9dc600410b10fb0120032006290000370300200420012900203703002008420020071b2208422088a721092001200141c0006a10da0402400240200128020022040d00410021030c010b2001290204220a4220882202a72103200a42ffffff3f83500d00200410260b4100210b4100210c02402009450d002003417f6a20096e210c0b2007410420071b210d0240024002400240024002400240024020030d004104210e410021050c010b20034104200341044b1b220441ffffffff01712004470d01200441037422044100480d0120041024220e450d02200c20096c210f2004410376210b41002107200e21040340410021050240200f20074d0d00200c450d062007200c6e220520094f0d05200d2005412c6c6a2802002106410121050b20042005360200200441046a2006360200200441086a21042003200741016a2207470d000b200321050b200141206a4183e2c400411410a40241002104200141c0006a200141206a410041202002a74102746b2207200741204b1b22076a412020076b109601200141186a2209200141c0006a41186a22102903002202370300200141106a2211200141c0006a41106a2212290300220a370300200141086a2213200141c0006a41086a22142903002215370300200120012903402216370300200141206a41186a22172002370300200141206a41106a2218200a370300200141206a41086a2219201537030020012016370320024020034102490d0041002003417f6a2207200720034b1b2106034020012004411c71220c6a2800002003410120031b220f7021070240200c411c470d00200141c0006a20014120109601200920102903003703002011201229030037030020132014290300370300200120012903403703000b200f417f6a220c20054f0d06200720054f0d07200e200c4103746a220c2902002102200c200e20074103746a220729020037020020072002370200200441046a21042003417f6a21032006417f6a22060d000b0b200020053602082000200b3602042000200e3602002000200129032037000c200041146a20192903003700002000411c6a2018290300370000200041246a201729030037000002402008a72203450d002003412c6c450d00200d10260b200141e0006a24000f0b102e000b102c000b2005200941b8b5c5001032000b41d0b5c500411941ecb5c500102f000b200c20054198e2c4001032000b2007200541a8e2c4001032000bae07020a7f037e23004180026b220224002002412036020c20022001360208200241106a2001412010820202400240200228021022030d00200041003602000c010b200228021421042002200241186a280200360224200220033602202002200241206a108f010240024020022802000d000240024002402002280204220520022802244105762201200120054b1b22014105742206417f4c0d000240024020010d00410121070c010b200610242207450d020b41002108200241003602302002200136022c200220073602280240024002402005450d0041002109034041002106200241003a00b8012002280224417f6a2101200941016a210903402001417f460d0320024198016a20066a2002280220220a2d00003a00002002200a41016a3602202002200641016a220a3a00b801200220013602242001417f6a2101200a2106200a4120470d000b200241e0016a41186a220120024198016a41186a290300370300200241e0016a41106a220620024198016a41106a290300370300200241e0016a41086a220b20024198016a41086a29030037030020022002290398013703e001200a41ff01714120490d03200241d8006a41086a200b290300220c370300200241d8006a41106a2006290300220d370300200241d8006a41186a2001290300220e370300200241386a41186a2206200e370300200241386a41106a220a200d370300200241386a41086a220b200c370300200220022903e001220c3703782002200c3703582002200c37033802402008200228022c470d00200241286a2008410110930120022802282107200228023021080b200720084105746a22012002290338370000200141186a2006290300370000200141106a200a290300370000200141086a200b2903003700002002200841016a220836023020092005470d000b0b2007450d052000200229022c370204200020073602000c060b200641ff0171450d00200241003a00b8010b200241d8006a41186a200241f8006a41186a290300370300200228022c41ffffff3f710d020c030b1034000b1033000b200710260b200241003602e801200242013703e0012002410e3602c4012002200241086a3602c0012002200241e0016a360278200241ac016a41013602002002420137029c012002418c8dc600360298012002200241c0016a3602a801200241f8006a41c4e1c00020024198016a10351a20022802e00120022802e801108402024020022802e401450d0020022802e00110260b200041003602000b2004450d00200310260b20024180026a24000b9f06020f7f017e23004180016b22072400200741003602082007410036021820054103742108200241606a2109200741286a200110dc0420014188026a280200210a20014190026a2802002102200741d8006a410172210b200128028002210c200128028c02210d4100210e4100210f41002110410021110240024002400240024002400240024003402010417f6a2101200920104105746a2105034020024108490d02200741d8006a200d200210dd04200728026421022007280260210d200541206a2105200141016a210120072802584101200728025c22121b2d0000201241077176410171450d000b02402011200a470d002000410910ff020c070b200141016a2110201141016a2113200c201141c1006c6a2114200821122004211103402012450d04201241786a211220112802002115201141086a211120152001470d000b0240024020142d00004101470d00200741186a2112200f0d01200b2007290328370000200b41186a200741286a41186a290300370000200b41106a200741286a41106a290300370000200b41086a200741286a41086a290300370000200741013a0058200741c8006a200741d8006a2006108801200741186a41086a200741c8006a41086a2802003602002007200729034822163703182016a7210f0c010b200741086a2112200e0d00200b2007290328370000200b41186a200741286a41186a290300370000200b41106a200741286a41106a290300370000200b41086a200741286a41086a290300370000200741003a0058200741c8006a200741d8006a2006108801200741086a41086a200741c8006a41086a2802003602002007200729034822163703082016a7210e0b200120034f0d0220132111201441016a20122802002012280208200510f5020d000b2000410c10ff020c050b200a2011470d02200041043a00000c030b2001200341ace1c4001032000b2000410b10ff020c020b2000410d10ff020b0240200f450d00200728021c450d00200f10260b200e450d02200728020c0d010c020b0240200f450d00200728021c450d00200f10260b200e450d01200728020c450d010b200e10260b20074180016a24000bb70301037f230041106b22022400200241003602082002420137030020012802502103200241004104106d2002280200200228020822046a20033600002002200441046a3602082002200236020c200141e0006a2002410c6a109c012001280254200141dc006a2802002002109501200220022802084120106d2002280200200228020822046a2203200129008001370000200341086a20014188016a290000370000200341106a20014190016a290000370000200341186a20014198016a2900003700002002200441206a22033602082002200341c000106d2002280200200228020822046a220320012900a001370000200341086a200141a8016a290000370000200341106a200141b0016a290000370000200341186a200141b8016a290000370000200341206a200141c0016a290000370000200341286a200141c8016a290000370000200341306a200141d0016a290000370000200341386a200141d8016a2900003700002002200441c0006a3602082002200236020c200141e0016a2002410c6a109c0120022001109d0120002002280200200228020810960102402002280204450d00200228020010260b200241106a24000b840201037f230041306b220324002003410136020020032002410376220436020402402004450d000240024020024178714108470d002000420137020820002002360204200020013602000c010b20002001410120021b22043602002000200241077122014108723602042000410c6a200141016a2205410771200241786a417871723602002000410020054103762202200141074622011b20042002410020011b6a723602080b200341306a24000f0b2003412c6a41013602002003411c6a41023602002003420237020c200341e88bc600360208200341013602242003200341206a3602182003200341046a36022820032003360220200341086a41ecc0c700103d000b130020004114360204200041fce3c4003602000bd3a10106077f017e137f037e337f027e230041b00f6b22032400200341e0046a41206a200141206a290200370300200341e0046a41186a2204200141186a290200370300200341e0046a41106a2205200141106a290200370300200341e0046a41086a2206200141086a290200370300200320012902003703e00402400240024002400240024002400240200341e0046a10b1040d00200442003703002005420037030020064200370300200342003703e004200341e80b6a41eb8cc700410a10fb012006200341e80b6a41086a290000370300200320032900e80b3703e004200341a8026a41d4e6c600410910fb012004200341a8026a41086a290000370300200520032900a802370300200341c8006a200341e0046a412041d4c0c7004100410010810220032802484101460d01200341b00e6a22014200370300200341a80e6a22074200370300200341980e6a41086a22044200370300200342003703980e200341e8076a41818dc700410910fb012004200341e8076a41086a290000370300200320032900e8073703980e200341e80b6a41acd6c000410610fb012001200341e80b6a41086a290000370300200720032900e80b370300200341e0046a200341980e6a10fd0120032802e0042201410420011b2108200241086a280200220920032902e404420020011b220a422088a7220b4b0d03200941ffffffff03712009460d020c070b200041023a00000c040b2000410110ff020c030b20094102742201417f4c0d0402400240024020010d004104210c0c010b20011024220c450d010b2003200c3602502003200141027636025420034100360258200341980e6a41186a4200370300200341980e6a41106a4200370300200341980e6a41086a22014200370300200342003703980e200341e8076a41808cc700410610fb012001200341e8076a41086a290000370300200320032900e8073703980e200341e80b6a41ea93c400410610fb01200741086a200341e80b6a41086a220d290000370000200720032900e80b370000200341c0006a200341980e6a41201089020240200a428080808010540d002003280240210e2003280244210f200228020021100240024002402009450d00201020094198026c6a21112008200b412c6c6a2112200341e80b6a410172221341076a211441002115410121012008211620102117034020174198026a211820172802502106024002400240024002402001410171450d00201621010c010b20162101200420064f0d010b034020122001460d02200128020021042001412c6a2216210120042006470d000b201641786a2802004102460d02201741a8016a2016460d02201641586a20174180016a412010d206450d022000410510ff02200341d0006a21010c050b2000410310ff02200341d0006a21010c040b2000410410ff02200341d0006a21010c030b0240024002400240024020172802182219450d002017280210211a200341e0046a200610e004200341a8026a20032802e004220420032802e80410e10420032802ac02410020032802a802410146221b1b210120032802b002211c024020032802e404450d00200410260b0240200120196a22014101460d00200141e5004f0d02201c4100201b1b21042019410474211b201a41086a21010340200128020020046a2104200141106a2101201b41706a221b0d000b200441a09c014b0d020b200641e807490d002019410474210103402001450d01200141706a2101201a2d000c2104201a41106a211a20044102470d000b200341e80b6a410710ff020c020b200320132900003703b809200320142800003600bf090c020b200341e80b6a410610ff020b200320132900003703b809200320142800003600bf0920032d00e80b22014104470d010b2017280228211a200341a8026a200610e204200341e0046a20032802a802221c20032802b002221d10e30420032902e404221e420020032802e00422011b211f2001410820011b211902400240201e422088a7410020011b2201201a490d002001201a6bad221e42d8007e2220422088a70d0d2020a72201417f4c0d0d0240024020010d004108211b0c010b20011024221b450d090b201b2019201a41d8006c22046a200110cf061a201e422086211e200141d8006ead21200240201a450d002019210103400240024020012d0000220641014b0d00024020060e020200020b200141086a280200450d01200141046a28020010260c010b200141086a280200450d00200141046a28020010260b200141d8006a2101200441a87f6a22040d000b0b201e202084211e201fa72201450d01200141d8006c450d01201910260c010b201f42ffffffff0f83211e0240201f422088a72201450d00200141d8006c21042019210103400240024020012d0000220641014b0d00024020060e020200020b200141086a280200450d01200141046a28020010260c010b200141086a280200450d00200141046a28020010260b200141d8006a2101200441a87f6a22040d000b0b2019211b0b02400240201b0d00201c201d10ff010c010b201e422088a7221a41d8006c22044104722201417f4c0d0c200110242206450d07200341003602e804200320013602e404200320063602e004200341e0046a201a10a1010240201a450d00201b20046a2106201b210103402001200341e0046a109f042006200141d8006a2201470d000b0b201c201d20032802e004220120032802e80410b301024020032802e404450d00200110260b0240201a450d00201b210103400240024020012d0000220641014b0d00024020060e020200020b200141086a280200450d01200141046a28020010260c010b200141086a280200450d00200141046a28020010260b200141d8006a2101200441a87f6a22040d000b0b201ea72201450d00200141d8006c450d00201b10260b024020032802ac02450d00201c10260b20172802502104024020152003280254470d00200341d0006a2015410110e701200328025821152003280250210c0b200c20154102746a20043602002003201541016a2215360258410021012018211720182011470d010c020b0b200020013a0000200020032903b809370001200041086a20032800bf09360000200341d0006a21010c010b200341e0046a41186a4200370300200341e0046a41106a4200370300200341e0046a41086a22014200370300200342003703e004200341e80b6a41eb8cc700410a10fb012001200341e80b6a41086a2216290000370300200320032900e80b3703e004200341a8026a41dc9dc600410b10fb01200541086a200341a8026a41086a290000370000200520032900a802370000200341a8026a200341e0046a10da0420032802a802210120032902ac02211f200341e0046a10d90420032802e404212120032802e804210420032802e0042113200341a0016a41186a20034184056a290200370300200341a0016a41106a200341fc046a290200370300200341a0016a41086a200341f4046a290200370300200320032902ec043703a001200341c0016a20132004108a01200341980e6a41186a22124200370300200341980e6a41106a22174200370300200341980e6a41086a22064200370300200342003703980e200341e8076a41808cc700410610fb012006200341e8076a41086a221b290000370300200320032900e8073703980e200341e80b6a41ea93c400410610fb01200741086a2016290000370000200720032900e80b370000200341386a200341980e6a4120108902200328023c212220032802382123200341b80e6a41186a221a4200370300200341b80e6a41106a22044200370300200341b80e6a41086a220c4200370300200342003703b80e200341e8076a41808cc700410610fb01200c201b290000370300200320032900e8073703b80e200341e80b6a41f693c400410a10fb01201a2016290000370300200420032900e80b370300200341e0046a200341b80e6a412010b80320032d00e00421162012200341f9046a2900003703002017200341f1046a2900003703002006200341e9046a290000370300200320032900e1043703980e0240024020164101460d00200341d0016a41186a4200370300200341d0016a41106a4200370300200341d0016a41086a4200370300200342003703d0010c010b200341d0016a41186a2012290300370300200341d0016a41106a2017290300370300200341d0016a41086a2006290300370300200320032903980e3703d0010b200341980e6a41186a22164200370300200341980e6a41106a22124200370300200341980e6a41086a22064200370300200342003703980e200341e8076a41b48cc700410710fb012006200341e8076a41086a2217290000370300200320032900e8073703980e200341e80b6a4184c1c200410c10fb01200741086a200341e80b6a41086a221b290000370000200720032900e80b370000200341306a200341980e6a41201089022003280234211a2003280230210c200341b80e6a41186a4200370300200341b80e6a41106a4200370300200341b80e6a41086a22154200370300200342003703b80e200341e8076a41808cc700410610fb0120152017290000370300200320032900e8073703b80e200341e80b6a41f693c400410a10fb01200441086a201b290000370000200420032900e80b370000200341e0046a200341b80e6a412010b80320032d00e00421042016200341f9046a2900003703002012200341f1046a2900003703002006200341e9046a290000370300200320032900e1043703980e201a4100200c1b21170240024020044101460d00200341a8026a41186a4200370300200341a8026a41106a4200370300200341a8026a41086a4200370300200342003703a8020c010b200341a8026a41186a2016290300370300200341a8026a41106a2012290300370300200341a8026a41086a2006290300370300200320032903980e3703a8020b201f420020011b211f2001410120011b2124200341f0016a410c6a200341a8026a41086a222529030037020020034184026a200341a8026a41106a290300370200200341f0016a411c6a200341a8026a41186a290300370200200320173602f001200320032903a8023702f40120032802c001211720032802c8012106200341003602a002200342013703980202400240024020090d0041012126410021270c010b200f4100200e1b2201417f6a410020011b2128201020094198026c6a21292017410c6a210c201f422088a7212a200341e9046a212b200341e0046a410c6a212c200341e0046a4198026a2111200341e0046a41d8016a2115200341e0046a41b8016a211d200341e0046a4198016a212d200341e0056a212e200341b8056a212f200341a8056a2130200341e0046a413c6a2131200341e0046a41046a2118200341a8026a41c4006a2132200341e8076a41066a2119200341b8096a41066a211c200341980e6a41186a210f200341980e6a41106a2114200341b8096a41386a2133200341b8096a41306a2134200341b8096a41286a21354100210402400240024002400240024003402010211b02400240024002400240024020042006460d00201b4198026a2110201b280250210920042112034002400240201220064f0d002017201241037422016a221a28020421162006201241016a22044d0d01200c20016a2101034020012802002016470d02200141086a21012006200441016a2204470d000b200621040c010b2012200641d4b0c0001032000b20042012490d080240200620044f0d002004200641c4b0c0001047000b024020162009460d002004211220042006460d020c010b0b0240200341d0016a201b41e0006a220e460d00200e200341d0016a412010d2060d020b200f420037030020144200370300200341980e6a41086a22164200370300200342003703980e200341e8076a41808cc700410610fb012016200341e8076a41086a2201290000370300200320032900e8073703980e200341e80b6a41ea93c400410610fb01200741086a2227200341e80b6a41086a2236290000370000200720032900e80b370000200341286a200341980e6a4120108902201b4188026a2802002237200420126b223841017620384101716a490d022037202a4b0d03201b41dc006a2802004180a0014b0d04200341880f6a201b280250200328022c417f6a417f20032802281b223910e40420032802a40f4102470d05200341e0046a410e10ff02200320032802e804222c3602b80920032802e004213a20032802e40421290c0c0b200341e0046a410810ff02200341e0046a41086a280200212c0c0a0b200341e0046a411310ff02200341e8046a280200212c0c090b200341e0046a410910ff02200341e8046a280200212c0c080b200341e0046a410a10ff02200341e8046a280200212c0c070b200341e0046a410f10ff02200341e8046a280200212c0c060b201c20032903880f370100201c41206a200341880f6a41206a290300370100201c41186a200341880f6a41186a223b290300370100201c41106a200341880f6a41106a223c290300370100201c41086a200341880f6a41086a223d2903003701002001200341b8096a41086a223e290100370300200341e8076a41106a2212200341b8096a41106a223f290100370300200341e8076a41186a2237200341b8096a41186a2240290100370300200341e8076a41206a223a200341b8096a41206a2226290100370300200341e8076a41266a200341b8096a41266a290100370100200320032901b8093703e807200341a0076a41206a2241201941206a290100370300200341a0076a41186a2242201941186a290100370300200341a0076a41106a2243201941106a290100370300200341a0076a41086a2244201941086a290100370300200320192901003703a007201b2802502145200341e80e6a41186a2246200e41186a290000370300200341e80e6a41106a2247200e41106a290000370300200341e80e6a41086a2248200e41086a2900003703002003200e2900003703e80e200341d80e6a201b41d4006a10c801200341b80e6a41186a2249201b4198016a290200370300200341b80e6a41106a224a201b4190016a290200370300200341b80e6a41086a224b201b4188016a2902003703002003201b290280013703b80e2033201b41d8016a2900003703002034201b41d0016a2900003703002035201b41c8016a2900003703002026201b41c0016a2900003703002040201b41b8016a290000370300203f201b41b0016a290000370300203e201b41a8016a2900003703002003201b2900a0013703b809203b201b41f8016a290000370300203c201b41f0016a290000370300203d201b41e8016a2900003703002003201b2900e0013703880f201b41086a290300211e201b2903002120200341c8076a201b41106a10ce012037201b41c4006a2900003703002012201b413c6a2900003703002001201b41346a2900003703002003201b29002c3703e80702400240201b28021c0d00200341003602f8080c010b200341f8086a201b411c6a10c8010b200341a8096a41086a224c200341c8076a41086a220e2802003602002016200129030037030020142012290300370300200f203729030037030020034198096a41086a224d200341f8086a41086a224e280200360200200320032903c8073703a809200320032903e8073703980e200320032903f80837039809201b280228214f200341c8086a41086a22502048290300370300200341c8086a41106a22482047290300370300200341c8086a41186a22472046290300370300200341e8086a41086a2246200341d80e6a41086a280200360200200341a8086a41086a2251204b290300370300200341a8086a41106a224b204a290300370300200341a8086a41186a224a2049290300370300200320032903e80e3703c808200320032903d80e3703e808200320032903b80e3703a808200341e8076a41386a22492033290300370300200341e8076a41306a22522034290300370300200341e8076a41286a22532035290300370300203a2026290300370300203720402903003703002012203f2903003703002001203e290300370300200341c8076a41186a223e203b290300370300200341c8076a41106a223b203c290300370300200e203d290300370300200320032903b8093703e807200320032903880f3703c807200341f8086a41186a223c200f290300370300200341f8086a41106a223d2014290300370300204e2016290300370300200320032903980e3703f808201841206a2041290300370200201841186a2042290300370200201841106a2043290300370200201841086a2044290300370200201820032903a007370200200341e0046a41346a201e3702002003202037028c05203120032903a809370200203141086a204c2802003602002030200329039809370200203041086a204d2802003602002003204f3602b405202f41186a203c290300370200202f41106a203d290300370200202f41086a204e290300370200202f20032903f808370200200320453602dc05202e41086a2046280200360200202e20032903e808370200200320283602f405200342808080858080143702ec05202d41186a2047290300370200202d41106a2048290300370200202d41086a2050290300370200202d20032903c808370200201d41186a204a290300370200201d41106a204b290300370200201d41086a2051290300370200201d20032903a808370200201541386a2049290300370200201541306a2052290300370200201541286a2053290300370200201541206a203a290300370200201541186a2037290300370200201541106a2012290300370200201541086a2001290300370200201520032903e807370200201141186a203e290300370200201141106a203b290300370200201141086a200e290300370200201120032903c80737020020032902e404211e200341e80b6a202c41b00210cf061a2003201e3703a8022025200341e80b6a41b00210cf06210e200341e0046a2009109e02200341206a20032802e004223b20032802e8041089022003280224213720032802202112024020032802e404450d00203b10260b024020124101470d00203720394b0d00200341e80b6a2009109f02200341e0046a20032802e80b221220032802f00b2237109d020240024020032802e004223b450d002012203710ff012003203b3602b809200320032902e4043702bc090c010b200341003602c009200342013703b8090b024020032802ec0b450d00201210260b200341e0046a2009109e0220032802e004221220032802e80410ff01024020032802e404450d00201210260b20092039200341b8096a10e50420032802bc09450d0020032802b80910260b024020032802ec02450d000240024020032802c4024101470d0020032802f40241808080054d0d01200341e0046a411010ff02200341e8046a280200212c0c060b200341e0046a411110ff02200341e8046a280200212c0c050b200341e0046a2009109e0220032802e804213720032802e00421122003203941c0256a3602e80b20122037200341e80b6a410410b301024020032802e404450d00201210260b200320323602e80b200341e0046a2009109f0220032802e004221220032802e804200341e80b6a10e60420032802e404450d00201210260b02400240024020032903a80220032903d002222054200e2903002254200341a8026a41306a290300221e542054201e511b0d00200320093602e80e200341b8096a200341e80e6a10db0341002112200341003a00b80e200341083a00980e200320203703e8072003201e3703f0072003200341b8096a3602a0070240024002402020201e8450450d004200211e420021200c010b2003200341b8096a3602880f2003200341880f6a3602f0042003200341980e6a3602ec042003200341a0076a3602e8042003200341b80e6a3602e4042003200341e8076a3602e004200341e80b6a200341b8096a200341e0046a10ed03024020032802e80b4101470d004200212020032903f00b211e4101211220032802ec0b213a0c020b200341e80b6a41286a290300212020032903880c211e4100211220032903f00b4201520d0020032903f80b215420032802880f2112200341e0046a41386a200341e80b6a41186a290300370300202b2012290000370000202b41086a201241086a290000370000202b41106a201241106a290000370000202b41186a201241186a290000370000200320543703900541002112200341003a00e804200341023a00e004200341e0046a1087020b0b20120d01200f42003703002014420037030020164200370300200342003703980e200341e8076a419a8cc700410810fb0120162001290000370300200320032900e8073703980e200341e80b6a41b8a1c300410d10fb0120272036290000370000200720032900e80b370000200341086a200341980e6a108d02200341086a41106a29030021542003290310215520032802082112200f42003703002014420037030020164200370300200342003703980e200341e8076a419a8cc700410810fb0120162001290000370300200320032900e8073703980e200341e80b6a41b8a1c300410d10fb0120272036290000370000200720032900e80b370000200342002054420020121b225420207d2055420020121b2220201e54ad7d22552020201e7d221e202056205520545620552054511b22011b3703e80420034200201e20011b3703e004200341980e6a4120200341e0046a411010b3010c020b200341e0046a411210ff02200341e8046a280200212c0c050b203a41ff01714104470d030b200341e0046a201b2024202a201a2038200341f0016a10db04024020032d00e00422014104470d00200341e0046a201b10dc04024020032802a0022201200328029c02470d0020034198026a2001410110930120032802a00221010b200328029802222620014105746a221620032903e004370000201641186a200341e0046a41186a290300370000201641106a200341e0046a41106a290300370000201641086a200341e0046a41086a2903003700002003200141016a22273602a002024020032802a803450d0020032802a40310260b024020032802bc02450d0020032802b80210260b024020032802e8022216450d0020032802e00221012016410474211603400240200141046a280200450d00200128020010260b200141106a2101201641706a22160d000b0b024020032802e40241ffffffff0071450d0020032802e00210260b024020032802ec022201450d0020032802f002450d00200110260b20102029460d080c010b0b20032d00e304210420032f00e104210620032802e4042129200320032802e804222c3602b8092006200441107472410874200172213a0c030b2012200441c4b0c0001048000b2003201e422088a7222c3602b809201ea721290c010b2003202c3602b80920032802e404212920032802e004213a0b024020032802a803450d0020032802a40310260b024020032802bc02450d0020032802b80210260b024020032802e8022204450d0020032802e00221012004410474210403400240200141046a280200450d00200128020010260b200141106a2101200441706a22040d000b0b024020032802e40241ffffffff0071450d0020032802e00210260b20032802ec022201450d0120032802f002450d01200110260c010b2003202c3602b80920032802e404212920032802e004213a0b0240200328029c0241ffffff3f71450d0020032802980210260b024020032802c40141ffffffff0171450d0020032802c00110260b0240202141ffffffff0171450d00201310260b410121010240201f42ffffff3f8350450d000c020b202410260c010b200341980e6a41186a4200370300200341980e6a41106a4200370300200341980e6a41086a22014200370300200342003703980e200341e8076a41b48cc700410710fb012001200341e8076a41086a290000370300200320032900e8073703980e200341e80b6a4184c1c200410c10fb01200741086a200341e80b6a41086a290000370000200720032900e80b3700002003200341980e6a4120108902200341003602c009200342043703b8092003280204211220032802002107200341b8096a4100200b10e70120032802c009210620032802b809212c0240200b450d00200b412c6c2116202c20064102746a210120082104034020012004280200360200200641016a2106200141046a21012004412c6a2104201641546a22160d000b20032802a00221270b200341e0046a41086a200341a0016a41086a290300370300200341e0046a41106a200341a0016a41106a290300370300200341e0046a41186a200341a0016a41186a290300370300200320063602c009200320032903a0013703e004200328029c022132024020032802c40141ffffffff0171450d0020032802c00110260b0240202141ffffffff0171450d00201310260b2022410020231b213a2012410020071b212941002101201f42ffffff3f83500d00202410260b20034180016a41086a2204200341e0046a41086a29030037030020034180016a41106a2206200341e0046a41106a29030037030020034180016a41186a2216200341e0046a41186a290300370300200320032903e004370380012001450d012000203a360200200041086a202c360200200041046a2029360200200341d0006a21010b200141046a28020041ffffffff0371450d04200128020010260c040b20032902bc092120200341e0006a41186a2016290300221f370300200341e0006a41106a2006290300221e370300200341e0006a41086a2004290300225437030020032003290380012255370360200241086a28020021072002280200214e200341f8086a41186a201f370300200341f8086a41106a201e370300200341f8086a41086a2054370300200320553703f808200341e8076a203a413270222b10e70420032802e8072112200320032802f00722173602f401200320123602f001200341b8096a201220171082020240024020032802b80922160d0041012104410021160c010b20032802bc09211a2003200341c0096a280200220436028c0f200320163602880f02400240024020044104490d002016280000211b2003201641046a3602880f20032004417c6a220136028c0f20014104490d002003200441786a220936028c0f2003201641086a3602880f41002101200341003a008005200441776a21040240034020092001460d01200341e0046a20016a201620016a220641086a2d00003a00002003200641096a3602880f2003200141016a22063a0080052003200436028c0f2004417f6a21042006210120064120470d000b200341a8026a41186a2201200341e0046a41186a290300370300200341a8026a41106a2204200341e0046a41106a290300370300200341a8026a41086a2209200341e0046a41086a290300370300200320032903e0043703a802200641ff01714120490d01200341b80e6a41086a2009290300370300200341b80e6a41106a2004290300370300200341b80e6a41186a2001290300370300200320032903a8023703b80e200341e0046a200341880f6a10e60120032802e0042201450d0120032902e404211f200341e0046a200341880f6a10e50120032802e00422090d02201f42ffffffff0383500d01200110260c010b200141ff0171450d00200341003a0080050b41002101200341003602b002200342013703a8022003410e3602a4072003200341f0016a3602a0072003200341a8026a3602e80b41012104200341f4046a4101360200200342013702e4042003418c8dc6003602e0042003200341a0076a3602f004200341e80b6a41c4e1c000200341e0046a10351a20032802a80220032802b002108402024020032802ac02450d0020032802a80210260b0c010b20032802e4042106410021040b0240201a450d00201610260b024020040d002012201710ff010b4100417f20011b21042001410020011b21160b024020032802ec07450d00201210260b024020044101710d00200341e8076a41f58cc700410c10fb01200341e80b6a419be2c600411510fb012003201b3602b809200341a0076a200341b8096a410410a202200341e0046a410c6a200341b8096a41046a3602002003200341a8076a3602e4042003200341b8096a3602e8042003200341a0076a3602e004200341a8026a200341e0046a107320032802b002220141206a2204417f4c0d070240024020040d0041012112410021040c010b200410242212450d030b200341003602e804200320123602e004200320043602e404200341e0046a4100411010c90120032802e00420032802e80422046a221220032900e807370000201241086a200341e8076a41086a2900003700002003200441106a22043602e804200341e0046a2004411010c90120032802e00420032802e80422046a221220032900e80b370000201241086a200341e80b6a41086a2900003700002003200441106a22123602e80420032802a8022104200341e0046a2012200110c90120032802e004221220032802e80422176a2004200110cf061a2003201720016a22013602e804024020032802ac02450d00200410260b2012200110af03024020032802e404450d00201210260b0240201f42ffffffff0383500d00201610260b200641ffffff3f71450d00200910260b20034180016a10ad03024020272007200720274b1b2239450d0020032802800141606a2117200341b8096a41046a2128200341a0076a41086a2118200341e0066a2111200341c0066a211920034180066a2115200341e0056a211c200341c0056a210e200341e0046a41d4006a211d2003418c056a210f200341e0046a411c6a212d200341e0046a41106a212f200328028801211b200341a8026a41386a2137200341a8026a41306a2124200341a8026a41206a2121410021130340200341003602a801200342013703a0012013221441016a2113204e20144198026c6a220928028c02211620094190026a28020021014101211041002107410021060340201720064105746a2104024003400240200141084f0d00410021120c020b200341e0046a2016200110dd0420032802ec04210120032802e8042116200441206a2104200641016a210641be80c70041bd80c70020032802e004410120032802e40422121b2d00002012410771764101711b22122d0000450d000b201b2006417f6a4d0d00200341b80e6a41186a221a200441186a290000370300200341b80e6a41106a220b200441106a290000370300200341b80e6a41086a220c200441086a290000370300200320042900003703b80e0240200720032802a401470d00200341a0016a2007410110930120032802a801210720032802a00121100b201020074105746a220420032903b80e370000200441186a201a290300370000200441106a200b290300370000200441086a200c2903003700002003200741016a22073602a8010b20120d000b20092802502107200341e8076a41186a221a200941f8006a290000370300200341e8076a41106a220b200941f0006a290000370300200341e8076a41086a2212200941e8006a290000370300200320092900603703e807200341c8086a200941d4006a10c801200341980e6a41186a220c20094198016a290200370300200341980e6a41106a221020094190016a290200370300200341980e6a41086a222a20094188016a29020037030020032009290280013703980e2037200941d8016a2900003703002024200941d0016a290000370300200341a8026a41286a222e200941c8016a2900003703002021200941c0016a290000370300200341a8026a41186a2230200941b8016a290000370300200341a8026a41106a2231200941b0016a290000370300200341a8026a41086a2233200941a8016a290000370300200320092900a0013703a802200341b8096a41186a2234200941f8016a290000370300200341b8096a41106a2235200941f0016a290000370300200341b8096a41086a2225200941e8016a290000370300200320092900e0013703b809200941086a290300211f2009290300211e200341a0076a200941106a10ce01200341e80b6a41186a2201200941c4006a290000370300200341e80b6a41106a22062009413c6a290000370300200341e80b6a41086a2204200941346a2900003703002003200929002c3703e80b200941286a211602400240200928021c0d00200341003602880f0c010b200341880f6a2009411c6a10c8010b200341a8086a41086a2209201828020036020020162802002122200341b80e6a41086a22232004290300370300200341b80e6a41106a22382006290300370300200341b80e6a41186a223b2001290300370300200341c8076a41086a223c200341880f6a41086a2216280200360200200320032903a0073703a808200320032903880f3703c807200320032903e80b3703b80e200341a0076a41186a223d201a290300370300200341a0076a41106a221a200b29030037030020182012290300370300200320032903e8073703a007200341d0016a41086a220b200341c8086a41086a280200360200200320032903c8083703d001200341f0016a41186a223e200c290300370300200341f0016a41106a220c2010290300370300200341f0016a41086a2210202a290300370300200320032903980e3703f001200341e80b6a41386a222a2037290300370300200341e80b6a41306a223f2024290300370300200341e80b6a41286a2240202e290300370300200341e80b6a41206a222e2021290300370300200120302903003703002006203129030037030020042033290300370300200320032903a8023703e80b200341e80e6a41186a22302034290300370300200341e80e6a41106a22312035290300370300200341e80e6a41086a22332025290300370300200320032903b8093703e80e200341880f6a41186a2234203b290300370300200341880f6a41106a2235203829030037030020162023290300370300200320032903b80e3703880f2003201f3703e8042003201e3703e004202f20032903a808370300202f41086a2009280200360200202d20032903c807370200202d41086a203c2802003602002003202236028805200f20032903880f370200200f41086a2016290300370200200f41106a2035290300370200200f41186a2034290300370200200320073602b005201d41086a200b280200360200201d20032903d001370200200e41186a203d290300370300200e41106a201a290300370300200e41086a2018290300370300200e20032903a007370300201c41186a203e290300370300201c41106a200c290300370300201c41086a2010290300370300201c20032903f001370300201541386a202a290300370300201541306a203f290300370300201541286a2040290300370300201541206a202e290300370300201541186a2001290300370300201541106a2006290300370300201541086a2004290300370300201520032903e80b370300201941186a2030290300370300201941106a2031290300370300201941086a2033290300370300201920032903e80e370300201141086a200341a0016a41086a280200360200201120032903a001370200200341003602f406200342013702ec06200341e8076a41f58cc700410c10fb01200341e80b6a419be2c600411510fb012003203a3602b809200341a0076a200341b8096a410410a202200320283602b402200320183602ac022003200341b8096a3602b0022003200341a0076a3602a802200341880f6a200341a8026a1073412010242201450d03200342203702ac02200320013602a802200341a8026a41004120106d20032802a802221620032802b00222076a2201202620144105746a2206290000370000200141086a200641086a290000370000200141106a200641106a290000370000200141186a200641186a2900003700002003200741206a22013602b0022001417f4c0d080240024020010d0041002106410121070c010b200110242207450d04200121060b200341003602c009200320073602b809200320063602bc09200341b8096a41002001106d20032802b809220720032802c00922066a2016200110cf061a2003200620016a22013602c009024020032802ac02450d00201610260b20032802900f220620016a41206a2216417f4c0d080240024020160d0041002116410121090c010b201610242209450d040b200341003602a807200320093602a007200320163602a407200341a0076a4100411010c90120032802a00720032802a80722166a220920032900e807370000200941086a20122900003700002003201641106a22163602a807200341a0076a2016411010c90120032802a00720032802a80722166a221220032900e80b370000201241086a20042900003700002003201641106a22163602a80720032802880f2104200341a0076a2016200610c90120032802a00720032802a80722166a2004200610cf061a2003201620066a22063602a807200341a0076a2006200110c90120032802a007220920032802a80722066a2007200110cf061a2003200620016a221a3602a807024020032802bc09450d00200710260b0240200328028c0f450d00200410260b200341003602b002200342013703a802200341a8026a200341e0046a109b0120032802e0062101200341a8026a20032802e806220410a10102402004450d002004410574210620032802b00221040340200341a8026a20044120106d20032802a80220032802b00222166a22042001290000370000200441086a200141086a290000370000200441106a200141106a290000370000200441186a200141186a2900003700002003201641206a22043602b002200141206a2101200641606a22060d000b0b20032802ec062101200341a8026a20032802f406220410a1010240024020040d0020032802b002210420032802a80221120c010b2004410574210620032802b00221040340200341a8026a20044120106d20032802a802221220032802b00222166a22042001290000370000200441086a200141086a290000370000200441106a200141106a290000370000200441186a200141186a2900003700002003201641206a22043602b002200141206a2101200641606a22060d000b0b2009201a2012200410b301024020032802ac02450d0020032802a80210260b024020032802a407450d00200910260b024020032802b805450d0020032802b40510260b024020032802f8042204450d0020032802f00421012004410474210403400240200141046a280200450d00200128020010260b200141106a2101200441706a22040d000b0b024020032802f40441ffffffff0071450d0020032802f00410260b024020032802fc042201450d00200328028005450d00200110260b024020032802e40641ffffff3f71450d0020032802e00610260b024020032802f00641ffffff3f71450d0020032802ec0610260b20132039490d000b0b200341a8026a202b10e70420032802b002210720032802a8022112200341003602e804200342013703e004200341e0046a41004104106d20032802e00420032802e80422016a203a3600002003200141046a22013602e804200341e0046a20014104106d20032802e00420032802e80422016a20293600002003200141046a22013602e804200341e0046a20014120106d20032802e00420032802e80422046a220120032903f808370000200141086a200341f8086a41086a290300370000200141106a200341f8086a41106a290300370000200141186a200341f8086a41186a2903003700002003200441206a3602e804200341e0046a2020422088a7220110a10102402001450d002001410274210420032802e8042106202c2101034020012802002116200341e0046a20064104106d20032802e00420032802e80422066a20163600002003200641046a22063602e804200141046a21012004417c6a22040d000b0b200341e0046a202710a10102402027450d00202741057421042026210103402003200341e0046a3602e80b2001200341e80b6a109c01200141206a2101200441606a22040d000b0b2012200720032802e00420032802e80410b301024020032802e404450d0020032802e00410260b024020032802ac02450d00201210260b024020032802840141ffffff3f71450d0020032802800110260b0240202042ffffffff0383500d00202c10260b0240203241ffffff3f71450d00202610260b200241086a28020021012002280200210b200341f8046a4200370300200341f0046a4200370300200341e0046a41086a22044200370300200342003703e004200341e80b6a41eb8cc700410a10fb012004200341e80b6a41086a290000370300200320032900e80b3703e004200341a8026a41a0a6c500410d10fb01200541086a200341a8026a41086a290000370000200520032900a802370000200341a8026a200341e0046a10fc010240024020032802a802221a0d004100210c200341003602900f200342043703880f4104211a0c010b200320032902ac02221f37028c0f2003201a3602880f201f422088a7210c0b02400240024002402001450d00200b20014198026c6a210e200341e8076a41046a2117200341a0076a41086a211b200341e0046a410472210f0340200341a8026a200b2802502209109a02200b41dc006a280200220141046a2204417f4c0d0b200b280254211620032802b002211220032802a802210602400240024002400240024020040d00200341003602e804200342013703e0040c010b200410242207450d0b200341003602e804200320043602e404200320073602e004200141c000490d01200141808001490d022001418080808004490d030b200341e0046a41004101106d20032802e00420032802e80422046a41033a00002003200441016a22043602e804200341e0046a20044104106d20032802e00420032802e80422046a2001360000200441046a21040c030b200341e0046a41004101106d20032802e00420032802e80422046a20014102743a0000200441016a21040c020b200341e0046a41004102106d20032802e00420032802e80422046a20014102744101723b0000200441026a21040c010b200341e0046a41004104106d20032802e00420032802e80422046a2001410274410272360000200441046a21040b200320043602e804200341e0046a20042001106d20032802e004220420032802e80422076a2016200110cf061a2003200720016a22013602e804200620122004200110b301024020032802e404450d00200410260b024020032802ac02450d00200610260b0240200b2802182207450d00200b2802102101200341a8026a200910e004200341e0046a20032802a802221020032802b002221510e1044100210620032802e804410020032802e00441014622181b2119200141086a210420032802e404211c2007410474221221160340200428020020066a2106200441106a2104201641706a22160d000b2003200620196a3602e804200341013602e0042003201c410020181b20076a3602e40420102015200f10ad04024020032802ac02450d00201010260b0340200341e80b6a41eb8cc700410a10fb01200341a8026a4194a5c500411210fb01200320093602e807200341a0076a200341e8076a410410a202200320173602ec042003201b3602e4042003200341e8076a3602e8042003200341a0076a3602e004200341b8096a200341e0046a107320032802c009220441206a2206417f4c0d0d0240024020060d0041002106410121160c010b200610242216450d090b200341003602f007200320163602e807200320063602ec07200341e8076a4100411010c90120032802e80720032802f00722066a221620032900e80b370000201641086a200341e80b6a41086a2900003700002003200641106a22063602f007200341e8076a2006411010c90120032802e80720032802f00722066a221620032900a802370000201641086a200341a8026a41086a2900003700002003200641106a22163602f00720032802b8092106200341e8076a2016200410c90120032802e807221620032802f00722076a2006200410cf061a2003200720046a22043602f007024020032802bc09450d00200610260b200341003602b002200342013703a802200341a8026a2001410c6a2d000010a8012001280200200141086a280200200341a8026a109501200341e0046a41086a20032802b002360200200320032903a8023703e00420162004200341e0046a10e903024020032802ec07450d00201610260b200141106a2101201241706a22120d000b41002101024002400240200c41014b0d00200c0e020201020b200c2104034020012004410176220620016a22162009201a20164102746a280200491b2101200420066b220441014b0d000b0b02402009201a20014102746a2802002204470d0041aff6c40041241084020c020b200c2001200920044b6a2201490d040b0240200c200328028c0f470d00200341880f6a200c410110e70120032802880f211a0b201a20014102746a220441046a2004200c20016b41027410d0061a200420093602002003200c41016a220c3602900f0b200b4198026a220b200e470d000b0b200341b8096a41086a200341880f6a41086a280200360200200320032903880f3703b809200341f8046a22044200370300200341f0046a22064200370300200341e0046a41086a22014200370300200342003703e004200341e80b6a41eb8cc700410a10fb012001200341e80b6a41086a2216290000370300200320032900e80b3703e004200341a8026a41a0a6c500410d10fb01200541086a2212200341a8026a41086a2207290000370000200520032900a802370000200341e0046a200341b8096a10e804024020032802bc0941ffffffff0371450d0020032802b80910260b200442003703002006420037030020014200370300200342003703e004200341e80b6a41eb8cc700410a10fb0120012016290000370300200320032900e80b3703e004200341a8026a41a0a6c500410d10fb0120122007290000370000200520032900a802370000200341a8026a200341e0046a10fc0120032802a8022201410420011b2137024020032902ac02420020011b2255422088221fa7222f0d004100212f4100210e0c030b2037202f4102746a211d201fa7410274417c6a41027641016a2124200341880f6a41086a211b200341e0046a4106722110200341e8076a41046a212d200341a0076a41086a211a4100210e4100211c41002111203721070340200341e0046a200728020010e004200341a8026a20032802e004221620032802e80410e10420032802a802410146210120032802ac02210420032802b0022106024020032802e404450d00201610260b2004410020011b21152006410020011b211302400240201c0d00410121010c010b2015201c6a41e50049201320116a41a19c01497121010b200e41016a210e02402015450d002001450d00200341e0046a200728020010e00420032802e004220120032802e80410ff01024020032802e404450d00200110260b200341e80b6a41eb8cc700410a10fb01200341a8026a4194a5c500411210fb01200320072802003602e807200341a0076a200341e8076a410410a2022003202d3602ec042003201a3602e4042003200341e8076a3602e8042003200341a0076a3602e004200341b8096a200341e0046a107320032802c009220141206a2204417f4c0d0b0240024020040d0041002104410121060c010b200410242206450d070b200341003602f007200320063602e807200320043602ec07200341e8076a4100411010c90120032802e80720032802f00722046a220620032900e80b370000200641086a200341e80b6a41086a2900003700002003200441106a22043602f007200341e8076a2004411010c90120032802e80720032802f00722046a220620032900a802370000200641086a200341a8026a41086a220f2900003700002003200441106a22043602f00720032802b8092106200341e8076a2004200110c90120032802e807220420032802f00722166a2006200110cf061a2003201620016a22013602f007024020032802bc09450d00200610260b2003200136028c0f200320043602880f200341e80b6a200420011082020240024020032802e80b22160d0042002120410421140c010b20032802ec0b2109200320032802f00b3602bc09200320163602b809200341e0046a200341b8096a10dd010240024020032802e00422060d00200341003602b002200342013703a8022003410e3602a4072003200341880f6a3602a0072003200341a8026a3602f001200341013602f404200342013702e4042003418c8dc6003602e0042003200341a0076a3602f004200341f0016a41c4e1c000200341e0046a10351a20032802a80220032802b002108402024020032802ac02450d0020032802a80210260b41012112410021060c010b20032902e4042154410021120b02402009450d00201610260b024020120d002004200110ff010b2054420020061b21202006410420061b21140b024020032802ec07450d00200410260b20142020422088a722014104746a211602400240024020010d00201421010c010b20142101034002402001410c6a2d000022174103470d00200141106a21010c020b200141046a280200211220012802002106200141086a28020021042003200728020022093602b80e200320043602ec0e200320063602e80e200341b8096a200341e80e6a10b6020240024020032802b8094117460d00200341e80b6a200341b8096a41b00210cf061a024002400240024020174103710e03010200010b411010242204450d04200441b889c70036020c200441013602082004428180808010370200200341f0016a41086a200341e0046a41086a290200370300200341f0016a41106a200341e0046a41106a290200370300200341f0016a41186a200341e0046a41186a280200360200200320032902e0043703f0014100210b410021190c020b200341e0046a200341b80e6a10db03200341e8076a41186a201041186a2f000022043b0100200341e8076a41106a201041106a290000221f370300200341e8076a41086a201041086a290000221e370300200f201e370300200341a8026a41106a220b201f370300200341a8026a41186a220c20043b010020032010290000221f3703e8072003201f3703a80220032801e204210920032f01e0042118411010242217450d03201741b889c70036020c201741013602082017428180808010370200411010242204450d03200441d089c70036020c20044101360208200442818080801037020020172017280200417f6a2219360200024020190d002017280208201728020c2802001103000240201728020c280204450d00201728020810260b20172017280204417f6a221936020420190d00201710260b200341f0016a41086a200f290300370300200341f0016a41106a200b290300370300200341f0016a41186a200c280200360200200320032903a8023703f001410121194100210b0c010b411010242217450d02201741b889c70036020c201741013602082017428180808010370200411010242204450d02200441d089c70036020c4101210b20044101360208200442818080801037020020172017280200417f6a220c360200200c0d002017280208201728020c2802001103000240201728020c280204450d00201728020810260b20172017280204417f6a220c360204200c0d00201710260b200341a8026a200341e80b6a41b00210cf061a200341a0076a41186a2217200341f0016a41186a280200360200200341a0076a41106a220c200341f0016a41106a290300370300201a200341f0016a41086a290300370300200320032903f0013703a00702402004280208200341a8026a200428020c28020c110100450d00200341e0046a200341a8026a41b00210cf061a201b20032903a007370200201b41086a201a290300370200201b41106a200c290300370200201b41186a20172802003602002003200936028c0f200320183b018a0f200320193a00890f2003200b3a00880f200320043602ac0f200341e8076a200341e0046a200341880f6a10a3030c010b20042004280200417f6a2209360200200341023a008808200341003a008008200342003703f007200342013703e807024020090d002004280208200428020c2802001103000240200428020c280204450d00200428020810260b20042004280204417f6a220936020420090d00200410260b200341a8026a1098030b02402012450d00200610260b200141106a22012016470d010c030b0b102c000b20162001460d000340200141106a21040240200141046a280200450d00200128020010260b2004210120162004470d000b0b0240202042ffffffff0083500d00201410260b2015201c6a221c41e3004b0d03201320116a2211419f9c014b0d030b200741046a2207201d470d000b2024210e0c010b2001200c103b000b200e202f4d0d00200e202f41d4f6c4001048000b200341f8046a4200370300200341f0046a4200370300200341e0046a41086a22014200370300200342003703e004200341e80b6a41eb8cc700410a10fb012001200341e80b6a41086a290000370300200320032900e80b3703e004200341a8026a41a0a6c500410d10fb01200541086a200341a8026a41086a290000370000200520032900a802370000202f200e6b220441027441046a2201417f4c0d060240024020010d0041012106410021010c010b200110242206450d020b200341003602b002200320063602a802200320013602ac02200341a8026a200410a1010240024020040d0020032802a802211220032802b00221040c010b2037200e4102746a2101202f410274200e4102746b210620032802b0022104034020012802002116200341a8026a20044104106d20032802a802221220032802b00222046a20163600002003200441046a22043602b002200141046a21012006417c6a22060d000b0b200341e0046a41202012200410b301024020032802ac02450d00201210260b205542ffffffff0383500d00203710260b200341b8096a41086a200341d0006a41086a280200360200200320032903503703b809200341e0046a41186a4200370300200341e0046a41106a4200370300200341e0046a41086a22014200370300200342003703e004200341e80b6a41eb8cc700410a10fb012001200d290000370300200320032900e80b3703e004200341a8026a41d4e6c600410910fb01200541086a200341a8026a41086a290000370000200520032900a802370000200341e0046a200341b8096a10e804024020032802bc0941ffffffff0371450d0020032802b80910260b200041043a00000240200aa72201450d002001412c6c450d00200810260b0240200241086a2802002201450d002002280200220620014198026c6a211603400240200641d8006a280200450d00200628025410260b0240200641186a2802002204450d00200628021021012004410474210403400240200141046a280200450d00200128020010260b200141106a2101200441706a22040d000b0b0240200641146a28020041ffffffff0071450d00200628021010260b0240200628021c2201450d00200641206a280200450d00200110260b024020064184026a2802002201450d00200141c1006c450d0020062802800210260b20064198026a210120064190026a4100360200200628028c0221042006410136028c02024020064194026a280200450d00200410260b2001210620012016470d000b0b200241046a2802002201450d0420014198026c450d04200228020010260c040b1033000b2000410210ff020b200aa72201450d002001412c6c450d00200810260b024020022802082201450d002002280200220620014198026c6a211603400240200641d8006a280200450d00200628025410260b0240200641186a2802002204450d00200628021021012004410474210403400240200141046a280200450d00200128020010260b200141106a2101200441706a22040d000b0b0240200641146a28020041ffffffff0071450d00200628021010260b0240200628021c2201450d00200641206a280200450d00200110260b024020064184026a2802002201450d00200141c1006c450d0020062802800210260b20064198026a210120064190026a4100360200200628028c0221042006410136028c02024020064194026a280200450d00200410260b2001210620012016470d000b0b200241046a2802002201450d0020014198026c450d00200228020010260b200341b00f6a24000f0b1034000b980301057f230041d0006b22022400200241086a41eb8cc700410a10fb01200241186a41d8a5c500411610fb0120022001360234200241386a200241346a410410a202200241cc006a200241346a41046a3602002002200241c0006a3602442002200241346a3602482002200241386a360240200241286a200241c0006a1073024002402002280230220341206a2204417f4c0d000240024020040d0041012101410021040c010b200410242201450d020b20002001360200200041086a220141003602002000200436020420004100411010c9012000280200200128020022046a220520022900083700002001200441106a2204360200200541086a200241086a41086a29000037000020002004411010c9012000280200200128020022046a220520022900183700002001200441106a2206360200200541086a200241186a41086a2900003700002002280228210420002006200310c9012000280200200128020022006a2004200310cf061a2001200020036a3602000240200228022c450d00200410260b200241d0006a24000f0b1034000b1033000b8f0201027f230041d0006b220324002003200236020420032001360200200341086a2001200210820202400240200328020822010d00200041003602000c010b200328020c2102024002400240200341106a28020022044104490d002004417c714104470d010b4100210420034100360220200342013703182003410e36022c200320033602282003200341186a360234200341cc006a41013602002003420137023c2003418c8dc6003602382003200341286a360248200341346a41c4e1c000200341386a10351a20032802182003280220108402200328021c450d01200328021810260c010b20002001290000370204410121040b200020043602002002450d00200110260b200341d0006a24000b980301057f230041d0006b22022400200241086a41eb8cc700410a10fb01200241186a419bf6c400411410fb0120022001360234200241386a200241346a410410a202200241cc006a200241346a41046a3602002002200241c0006a3602442002200241346a3602482002200241386a360240200241286a200241c0006a1073024002402002280230220341206a2204417f4c0d000240024020040d0041012101410021040c010b200410242201450d020b20002001360200200041086a220141003602002000200436020420004100411010c9012000280200200128020022046a220520022900083700002001200441106a2204360200200541086a200241086a41086a29000037000020002004411010c9012000280200200128020022046a220520022900183700002001200441106a2206360200200541086a200241186a41086a2900003700002002280228210420002006200310c9012000280200200128020022006a2004200310cf061a2001200020036a3602000240200228022c450d00200410260b200241d0006a24000f0b1034000b1033000b831a0c047f017e0a7f017e017f017e017f017e027f047e027f037e230041d0036b220324002003200236021c20032001360218200341206a2001200210820202400240200328022022040d00200041003602000c010b200328022421052003200341286a28020036023420032004360230200341106a200341306a108f010240024020032802100d0002400240024020032802142206200328023441d8006e2201200120064b1bad42d8007e2207422088a70d002007a72201417f4c0d0002400240024020010d00410821080c010b200110242208450d010b200141d8006ead210702402006450d00200341e9016a2109200341b8016a41116a210a200341c7026a210b4100210c034002400240024002400240024002400240024002400240024002402003280234220d450d002003280230220e2d000021012003200d417f6a220f3602342003200e41016a360230200141024b0d00024002400240024020010e03000102000b41002102200341003a00d802417e211002400340200f20022201460d01200341b8026a20016a200e20016a220241016a2d00003a00002003200d20106a3602342003200241026a3602302003200141016a22023a00d8022010417f6a211020024120460d060c000b0b200141ff0171450d060c050b2003200341306a108f0120032802000d022003280234220220032802042201490d022001417f4c0d120240024020010d0041002110410121110c010b2001102a2211450d1220032802342102200121100b0240024020022001490d0020112003280230200110cf0621022003280234220d20014f0d012001200d41b8afc0001048000b2010450d030c020b2003200d20016b3602342003200328023020016a3602302002450d022001ad4220862010ad842112200341f6016a41026a200341b0036a41026a2d00003a0000200341b8016a41086a200341b8026a41086a290300370300200341b8016a41106a200341b8026a41106a290300370300200341b8016a41186a200341b8026a41186a290300370300200341b8016a41206a200341b8026a41206a290300370300200341b8016a41286a200341b8026a41286a290300370300200341b8016a41306a200341b8026a41306a290300370300200320032f00b0033b01f601200320032903b8023703b801410121020c060b200341086a200341306a108f0120032802080d0120032802342202200328020c2201490d012001417f4c0d110240024020010d0041002110410121110c010b2001102a2211450d1120032802342102200121100b0240024020022001490d0020112003280230200110cf0621022003280234220d20014f0d012001200d41b8afc0001048000b20100d010c020b2003200d20016b3602342003200328023020016a3602302002450d012001ad4220862010ad84211241022102200341f6016a41026a200341b0036a41026a2d00003a0000200341b8016a41086a200341b8026a41086a290300370300200341b8016a41106a200341b8026a41106a290300370300200341b8016a41186a200341b8026a41186a290300370300200341b8016a41206a200341b8026a41206a290300370300200341b8016a41286a200341b8026a41286a290300370300200341b8016a41306a200341b8026a41306a290300370300200320032f00b0033b01f601200320032903b8023703b8010c050b201110260b200341b4016a41026a200341f6016a41026a2d00003a0000200341f8006a41086a200341b8016a41086a290300370300200341f8006a41106a200341b8016a41106a290300370300200341f8006a41186a200341b8016a41186a290300370300200341f8006a41206a200341b8016a41206a290300370300200341f8006a41286a200341b8016a41286a290300370300200341f8006a41306a200341b8016a41306a290300370300200320032f01f6013b01b401200320032903b8013703780c040b20034188036a41026a221020032d00ba023a000020034190036a41106a220f200b41106a2d00003a000020034190036a41086a2213200b41086a290000370300200320032f01b8023b0188032003200b29000022143703b0032003201437039003200241ff0171411f4d0d0120032800bb02211520032900bf022116200341b4026a41026a221720102d00003a0000200341a0026a41086a22182013290300370300200341a0026a41106a2213200f2d00003a0000200320032903900322143703f002200320032f0188033b01b402200320143703a0022002417f73200d6a4110490d012003200d20026b416f6a3602342003200e20026a220e41116a360230200e41096a2900002114200e41016a290000211941002110200341003a00d8022002200d6b41116a210f200d20016b416d6a210102400340200f20106a450d01200341b8026a20106a200e20106a220241116a2d00003a00002003200241126a3602302003201041016a22023a00d802200320013602342001417f6a21012002211020024120470d000b200341b0036a41186a2201200341b8026a41186a290300370300200341b0036a41106a2210200341b8026a41106a290300370300200341b0036a41086a220d200341b8026a41086a290300370300200320032903b8023703b003200241ff01714120490d0220034190036a41186a2001290300221a37030020034180026a41086a2201200d29030037030020034180026a41106a2202201029030037030020034180026a41186a2210201a370300200341f6016a41026a20172d00003a0000200320032903b00337038002200320032f01b4023b01f601200341b8016a41106a20132d00003a0000200341b8016a41086a2018290300370300200320032903a0023703b801200a41186a2010290300370000200a41106a2002290300370000200a41086a2001290300370000200a200329038002370000200920032800f901360000200941036a200341f9016a41036a2800003600004100210220162112201521112019211b2014211c0c030b201041ff0171450d010b200341003a00d8020b410321020b200341b4016a41026a2201200341f6016a41026a2d00003a0000200341f8006a41086a2210200341b8016a41086a290300370300200341f8006a41106a220d200341b8016a41106a290300370300200341f8006a41186a220e200341b8016a41186a290300370300200341f8006a41206a220f200341b8016a41206a290300370300200341f8006a41286a2213200341b8016a41286a290300370300200341f8006a41306a2215200341b8016a41306a290300370300200320032f01f6013b01b401200320032903b80137037820024103460d00200341f4006a41026a221720012d00003a0000200341386a41086a22182010290300370300200341386a41106a2210200d290300370300200341386a41186a220d200e290300370300200341386a41206a220e200f290300370300200341386a41286a220f2013290300370300200341386a41306a22132015290300370300200320032f01b4013b0174200320032903783703382007422088a722012007a7470d07200141016a22152001490d032001410174221d20152015201d491b22154104201541044b1bad42d8007e2214422088a7221d0d032014a722154100480d03200141d8006c201e20011b211e2008410020011b22080d022015450d010c040b2007422088a72201450d0c200141d8006c2102200821010c0b0b41004108201d4100471b21080c040b201e2015460d030240201e0d0020150d02410821080c040b2008201e201510282208450d020c030b102e000b2015102422080d010b102c000b200742808080807083201541d8006ead8421070b20082007422088a741d8006c6a220120023a00002001201237000820012011360004200120032f01743b0001200141036a20172d00003a000020132903002114200f2903002116200e2903002119200d290300211a2010290300211f2018290300212020032903382121200141d0006a201c3700002001201b37004820012021370010200141186a2020370000200141206a201f370000200141286a201a370000200141306a2019370000200141386a2016370000200141c0006a201437000020074280808080107c2107200c41016a220c2006470d000b0b2008450d0420002007370204200020083602000c050b1033000b1034000b03400240024020012d0000221041014b0d00024020100e020200020b200141086a280200450d01200141046a28020010260c010b200141086a280200450d00200141046a28020010260b200141d8006a2101200241a87f6a22020d000b0b2007a72201450d00200141d8006c450d00200810260b200341003602c001200342013703b8012003410e36027c2003200341186a3602782003200341b8016a360238200341cc026a4101360200200342013702bc022003418c8dc6003602b8022003200341f8006a3602c802200341386a41c4e1c000200341b8026a10351a20032802b80120032802c001108402024020032802bc01450d0020032802b80110260b200041003602000b2005450d00200410260b200341d0036a24000bc30802077f027e230041b0016b22032400200341f8006a22044200370300200341f0006a22054200370300200341e0006a41086a2206420037030020034200370360200341186a41808cc700410610fb012006200341186a41086a29000037030020032003290018370360200341c0006a41ea93c400410610fb012004200341c0006a41086a29000037030020052003290040370300200341106a200341e0006a41201089020240024002400240200241016a2003280214410020032802101b470d00200341186a41818dc700410910fb01200341c0006a41f0d7c000410510fb0120032001360234200341386a200341346a410410a202200341ec006a200341346a41046a3602002003200341386a41086a3602642003200341346a3602682003200341386a360260200341286a200341e0006a10732003280230220441206a2205417f4c0d020240024020050d0041012106410021050c010b200510242206450d040b200341003602682003200636026020032005360264200341e0006a4100411010c9012003280260200328026822056a22062003290018370000200641086a200341186a41086a2900003700002003200541106a2205360268200341e0006a2005411010c9012003280260200328026822056a22062003290040370000200641086a200341c0006a41086a2900003700002003200541106a220636026820032802282105200341e0006a2006200410c90120032802602206200328026822076a2005200410cf061a2003200720046a22043602680240200328022c450d00200510260b20062004109c0241ff0171210402402003280264450d00200610260b41002105024002402004450d000c010b200341e0006a2001109e02200341086a200328026022072003280268108902200328020c21062003280208210402402003280264450d00200710260b02402004450d00200620024b0d010b200341c0006a200110e403200341e0006a20032802402207200328024810e503200328026c2206410246210420032802602105200328026421082003280268210902402003280244450d00200710260b4104200520041b210741012105024002402004450d000c010b2009450d0020072802004180e1016a2104410021050b20052004200249722105024020064102460d00200841ffffffff0371450d00200710260b200241c0256a21040b200341286a200110a902024020032802280d002000410236021c0c020b20032001360238200341c0006a200341386a10db03200341186a200341c0006a10d803200341e0006a20032802182202200328022010d903200341f0006a2903004200200329036042015122011b210a2003290368420020011b210b0240200328021c450d00200210260b2000200a3703082000200b37030020002003290328370210200041186a200341306a280200360200200020043602202000200536021c0c010b2000410236021c0b200341b0016a24000f0b1034000b1033000bc20103027f017e027f230041206b22032400200341106a20001098022003200328021022042003280218109d02200329020421052003280200210602402003280214450d00200410260b20032002360200200341106a2000109802200328021022072003280218200310e6042005a7410020061b21022005422088a7410020061b21042006410120061b210602402003280214450d00200710260b20032004360218200320023602142003200636021020002001200341106a10a002200341206a24000ba30301047f230041106b220324000240024020022802002204280208220241046a2205417f4c0d00200428020021040240024020050d0041012106410021050c010b200510242206450d020b2003410036020820032006360200200320053602040240024002400240200241c000490d00200241808001490d012002418080808004490d02200341004101106d2003280200200328020822056a41033a00002003200541016a2205360208200320054104106d2003280200200328020822056a2002360000200541046a21050c030b200341004101106d2003280200200328020822056a20024102743a0000200541016a21050c020b200341004102106d2003280200200328020822056a20024102744101723b0000200541026a21050c010b200341004104106d2003280200200328020822056a2002410274410272360000200541046a21050b20032005360208200320052002106d20032802002205200328020822066a2004200210cf061a2003200620026a2202360208200020012005200210b30102402003280204450d00200510260b200341106a24000f0b1034000b1033000b9b0301057f230041d0006b22022400200241086a41f58cc700410c10fb01200241186a41b0e2c600411010fb0120022001360234200241386a200241346a410410a202200241c0006a410c6a200241346a41046a3602002002200241c0006a3602442002200241346a3602482002200241386a360240200241286a200241c0006a1073024002402002280230220341206a2204417f4c0d000240024020040d0041012101410021040c010b200410242201450d020b20002001360200200041086a220141003602002000200436020420004100411010c9012000280200200128020022046a220520022900083700002001200441106a2204360200200541086a200241086a41086a29000037000020002004411010c9012000280200200128020022046a220520022900183700002001200441106a2206360200200541086a200241186a41086a2900003700002002280228210420002006200310c9012000280200200128020022006a2004200310cf061a2001200020036a3602000240200228022c450d00200410260b200241d0006a24000f0b1034000b1033000bf90101057f230041106b22022400024002402001280208220341027441046a2204417f4c0d00200128020021010240024020040d0041012105410021040c010b200410242205450d020b2002410036020820022005360200200220043602042002200310a1010240024020030d0020022802002106200228020821040c010b2003410274210320022802082104034020012802002105200220044104106d20022802002206200228020822046a20053600002002200441046a2204360208200141046a21012003417c6a22030d000b0b200041202006200410b30102402002280204450d00200610260b200241106a24000f0b1034000b1033000bbb0101027f230041306b220224002002200010e204200228020821032002280200210020024100360218200242013703102001200241106a109f04200241286a20022802183602002002200229031037032020002003200241206a10e90302402002280204450d00200010260b0240024020012d0000220041014b0d00024020000e020200020b200141086a280200450d01200141046a28020010260c010b200141086a280200450d00200141046a28020010260b200241306a24000bdf0706017f017e047f037e037f067e230041c0026b2202240042002103200241e0016a22044200370300200241d0016a41086a4208370300200241ec016a22054180023b0100200241e8016a2206410036020041012107200241013602b802200241003602d001024002404100450d0042012108420021090c010b20014280c0a8ca9a3a20014280c0a8ca9a3a541b21010240024002404101450d004200210a0c010b200241c8016a210b4101210c420021080340200241b0016a200842002001420010cc06200241c0016a200142002001420010cc06200820022903b801220184200184420052200b290300220120022903b001220a200a7c7c220a200154720d0220022903c0012101200c410271210d200c4101762207210c200a2108200d450d000b0b0240200741024f0d0020012108200a21090c020b200241a0016a41086a210d20012108200a2109034020024190016a200a42002001420010cc06200241a0016a200142002001420010cc06200a200229039801220184200184420052200d2903002201200229039001220a200a7c7c220a200154720d0120022903a001210102402007410271450d00200241e0006a200942002001420010cc06200241f0006a200a42002008420010cc0620024180016a200842002001420010cc062009420052200a4200527120022903684200527220022903784200527220024180016a41086a2903002208200229036020022903707c7c2209200854720d0220022903800121080b200741034b210c20074101762107200a210a200c0d000c020b0b427f2108427f21090b200241d0006a20082009428094ebdc03420010cb06200241306a2004290300220a42002008420010cc06200241206a2009420020022903d8012201420010cc06200241c0006a200142002008420010cc060240024020052d0000450d00420021010c010b2002290338210e2002290328210f2002290320211020022903302111200241c0006a41086a2903002101200628020021072002290350210320022903402112200241106a20082009428094ebdc03420010d30620022002290310200241106a41086a2903002007ad2208420010cc06427f200241086a29030020022903002213200320087e2208428094ebdc0380a7417f2008428080808080c0b2cd3b541b2008428094ebdc03824280cab5ee01566aad7c2208201354ad7c2203427f2001201120107c7c2210200a420052200942005271200e42005272200f4200527220102001547222071b7c2008427f201220071b7c220a2008542207ad7c22012007200120035420012003511b22071b2101427f200a20071b21030b2000200337030020002001370308200241c0026a24000b130020004102360204200041f8f6c4003602000ba00606057f017e027f017e027f017e230041206b2202240002400240200128020022032802042204450d00200328020022052d0000210620032004417f6a3602042003200541016a36020002400240200641037122034103460d00024002400240024020030e03000102000b2006410276ad21070c020b200128020022012802042203450d04200128020022042d0000210520012003417f6a360204410121032001200441016a3602002005410874200672220141ffff0371418002490d03200141fcff0371410276ad21070c010b410121032001280200220128020422044103490d022001280200220541026a2d0000210820052f000021092001200541036a36020020012004417d6a3602042009200841107472410874200672220141808004490d022001410276ad21070b4200210a410021030c030b02402006410276220b410c4b0d00024002400240200b0e0d00030303010303030303030302000b2001280200220328020422014104490d0420032802002206350000210720032001417c6a3602042003200641046a36020020074280808080045421034200210a0c050b2001280200220328020422014108490d032003280200220629000021072003200141786a3602042003200641086a3602002007428080808080808080015421034200210a0c040b2001280200220328020422014110490d022003280200220641086a290000210a200629000021072003200641106a3602002003200141706a360204200a428080808080808080015421030c030b200641334b0d01200b41046a21094100210441012103200241186a210c420021074200210a0340200128020022062802042205450d01200241106a200628020022083100004200200441037441f8007110cd0620062005417f6a3602042006200841016a360200200c290300200a84210a20022903102007842107200441016a220441ff01712009490d000b2002427f427f41e800200b4103746b41f8007110d4062007200229030058200a200241086a290300220d58200a200d511b21030c020b0c010b410121030b20002007370308200041106a200a37030020002003ad370300200241206a24000bcb1a05017f037e057f027e087f230041e0116b22022400420221030240024002400240024002400240200129036822044202520d00200241186a20014198016a41b00210cf061a0c010b20024196036a200141206a41c20010cf061a200141f8006a290300210320012903702105200241d8036a41186a200141186a290000370300200241d8036a41106a200141106a290000370300200241d8036a41086a200141086a290000370300200220012900003703d803200241e80c6a20014198016a41b00210cf061a200241980f6a41106a20014190016a290300370300200241980f6a41086a20014188016a290300370300200220014180016a2903003703980f200241f0106a410010b004200241b00a6a20022802f010220120022802f81010b80320024190116a41086a2206200241b90a6a29000037030020024190116a41106a2207200241c10a6a29000037030020024190116a41186a2208200241c90a6a290000370300200220022900b10a370390110240024020022d00b00a4101460d00200241c0116a41186a4200370300200241c0116a41106a4200370300200241c0116a41086a4200370300200242003703c0110c010b200241c0116a41186a2008290300370300200241c0116a41106a2007290300370300200241c0116a41086a200629030037030020022002290390113703c0110b024020022802f410450d00200110260b200241b0106a41086a200241cb116a290000370300200241b0106a41106a200241d3116a290000370300200241c5106a200241c0116a41186a290000370000200220022900c3113703b01020022f01c011210920022d00c211210a20024190116a41186a2201420037030020024190116a41106a2206420037030020024190116a41086a220742003703002002420037039011200241b00a6a41808cc700410610fb012007200241b00a6a41086a2208290000370300200220022900b00a37039011200241b00a6a41ea93c400410610fb0120012008290000370300200620022900b00a370300200241106a20024190116a412010890241002101024020044201520d0020054200510d022002280214410020022802101b2106417f210142002006ad220b20037d220c200c200b561b220b20037c200b2005827d220b42ffffffff0f560d00200ba721010b200241b00a6a200110b004200241086a20022802b00a220620022802b80a41d4c0c7004100410010810220022802082107024020022802b40a450d00200610260b410121060240024020074101470d00200241b0116a200110b004200241b00a6a20022802b011220620022802b81110b80320024190116a41086a200241b90a6a29000037030020024190116a41106a200241c10a6a290000370300200241a8116a2201200241c90a6a290000370300200220022900b10a370390110240024020022d00b00a4101460d00200241d5116a4200370000200241c0116a41106a4200370300200241c0116a41086a4200370300200242003703c011410021010c010b200241c0116a41086a2002419b116a290000370300200241c0116a41106a200241a3116a290000370300200241d5116a200129000037000020022002290093113703c01120022f01901120022d0092114110747221010b024020022802b411450d00200610260b200241f0106a41156a2207200241c0116a41156a2208290000370000200241f0106a41106a2206200241c0116a41106a220d290300370300200241d0106a41086a220e200241c0116a41086a220f290300370300200241d0106a41106a22102006290300370300200241d0106a41156a22112007290000370000200220022903c0113703d010200241f00f6a41156a22072011290000370000200241f00f6a41106a22112010290300370300200241f00f6a41086a2210200e290300370300200220022903d0103703f00f20024190106a41156a220e200241b0106a41156a29000037000020024190106a41106a2212200241b0106a41106a29030037030020024190106a41086a2213200241b0106a41086a290300370300200220022903b01037039010200241d00f6a41156a2214200e290000370000200241d00f6a41106a220e2012290300370300200241d00f6a41086a2212201329030037030020022002290390103703d00f200241b00f6a41156a22132007290000370000200241b00f6a41106a22072011290300370300200241b00f6a41086a22112010290300370300200220022903f00f3703b00f20082014290000370000200d200e290300370300200f2012290300370300200220022903d00f3703c01120024190116a41156a201329000037000020024190116a41106a200729030037030020024190116a41086a2011290300370300200220022903b00f370390112006200241980f6a41106a290300370300200241f0106a41086a200241980f6a41086a290300370300200220022903980f3703f010200241b40a6a200241e80c6a41b00210cf061a410021060c010b200241d0106a41156a200241f0106a41156a290000370000200241d0106a41106a200241f0106a41106a290000370300200241d00f6a41086a20024190106a41086a290000370300200241d00f6a41106a20024190106a41106a290000370300200241d00f6a41156a20024190106a41156a29000037000020022002290090103703d00f200241b00f6a41156a200241f00f6a41156a290000370000200241b00f6a41106a200241f00f6a41106a290000370300200241e80c6a10980341800a21010b200241fc076a200241b00a6a41b40210cf061a200241e0076a41106a2207200241f0106a41106a290300370300200241e0076a41086a2208200241f0106a41086a290300370300200241c0076a41086a220d200241c0116a41086a290300370300200241c0076a41106a220e200241c0116a41106a290300370300200241c0076a41156a220f200241c0116a41156a290000370000200241a0076a41086a221020024190116a41086a290300370300200241a0076a41106a221120024190116a41106a290300370300200241a0076a41156a221220024190116a41156a290000370000200220022903f0103703e007200220022903c0113703c00720022002290390113703a00720060d03200241f8036a200241fc076a41046a41b00210cf061a200241e2066a2009200a4110747222064110763a0000200241e0066a220920063b0100200241b8066a2003370300200241b0066a2005370300200241c0066a20022903e007370300200241c8066a2008290300370300200241d0066a2007290300370300200241e3066a20022903c007370000200241eb066a200d290300370000200241f3066a200e290300370000200241f8066a200f290000370000200220043703a806200242003703d80620024182076a20014110763a000020024180076a220620013b010020024183076a20022903a0073700002002418b076a201029030037000020024193076a201129030037000020024198076a2012290000370000410810242201450d02200242083702b40a200220013602b00a200241f8036a200241b00a6a109904200241f8036a41b0026a200241b00a6a10a60220022802d8062101200241b00a6a20022802b80a4104106d20022802b00a20022802b80a22076a20013600002002200741046a22013602b80a20022802dc062107200241b00a6a20014104106d20022802b00a20022802b80a22016a20073600002002200141046a3602b80a2002200241b00a6a3602fc072009200241fc076a109c012002200241b00a6a3602fc072006200241fc076a109c0120022802b00a21010240024020022802b80a22064180024b0d0020024196036a20012006200241d8036a10820321010c010b200241c0116a2001200610960120024196036a200241c0116a4120200241d8036a10820321010b024020022802b40a450d0020022802b00a10260b2001450d04200241f0026a41086a200241d8036a41086a290300370300200241f0026a41106a200241d8036a41106a290300370300200241f0026a41186a200241d8036a41186a290300370300200241c8026a41086a200241b8066a290300370300200241c8026a41106a200241c0066a290300370300200241c8026a41186a200241c8066a290300370300200241e8026a200241d0066a290300370300200220022903d8033703f0022002200241b0066a2903003703c80220022903a8062103200241186a200241f8036a41b00210cf061a0b200041086a20022903f002370300200041286a2003370300200041306a20022903c802370300200041206a200241f0026a41186a290300370300200041186a200241f0026a41106a290300370300200041106a200241f0026a41086a290300370300200041386a200241c8026a41086a290300370300200041c0006a200241c8026a41106a290300370300200041c8006a200241c8026a41186a290300370300200041d0006a200241c8026a41206a290300370300200041d8006a200241186a41b00210cf061a200041003a00000c040b41f0afc7004119418cb0c700102f000b1033000b200020013b0001200041013a0000200041036a20014110763a00000c010b20004180083b0001200041013a0000200041036a41003a0000200241f8036a1098030b200241e0116a24000b1300200041013602042000419c85c5003602000b34002000418a8cc70036020420004100360200200041146a4102360200200041106a41d08cc500360200200041086a42093702000b130020004101360204200041888fc5003602000b4a01017f02404108102422020d001033000b2000420837020420002002360200200041004108106d2000280200200041086a220028020022026a42b8173700002000200241086a3602000b130020004104360204200041ac92c5003602000b3400200041eb8cc70036020420004100360200200041146a410d360200200041106a41bc99c500360200200041086a420a3702000b6f01027f02404108102422020d001033000b2000420837020420002002360200200041004104106d2000280200200041086a220228020022036a41003600002002200341046a2203360200200020034104106d2000280200200228020022006a41003600002002200041046a3602000b5301027f02404104102422020d001033000b2000420437020420002002360200200041004101106d2000280200200041086a220228020022036a41003a00002002200341016a2203360200200020034100106d0b4401017f230041206b22022400200041003602082000420137020020024200370310200242043703082000200241086a109a012000200241146a10af01200241206a24000b2901017f230041106b2202240020024100360208200242013703002000200210bb01200241106a24000be70101037f200128022421020240024002402001280200220341ff0171450d00200141046a280200210120022002280200417f6a22043602004100210320040d022002280208200228020c2802001103000240200228020c280204450d00200228020810260b20022002280204417f6a22043602042004450d010c020b20022002280200417f6a2204360200200341807e7121014101210320040d012002280208200228020c2802001103000240200228020c280204450d00200228020810260b20022002280204417f6a220436020420040d010b200210260b20002001360204200020033602000b3400200041cca3c70036020420004100360200200041146a4102360200200041106a41c4b0c500360200200041086a42123702000b5a01027f02404110102422020d001033000b2000421037020420002002360200200041004110106d2000280200200041086a220028020022026a22034200370008200342808090bbbad6adf00d3700002000200241106a3602000b130020004102360204200041c8b2c5003602000bc40402077f027e23004180016b22022400200241206a22034200370300200241186a42083703002002412c6a22044180023b0100200241106a41186a22054100360200200241013602782002410036021002400240411810242206450d00200242013702042002200636020020024100410110f501200228020022072002280208220841186c6a2206200329030037030820062002290318370300200620022d002d3a0015200620042d00004100473a0014200620052802003602102002200841016a220336020802402002280278220641044d0d00200641186c450d00200228021410260b200341186c4104722206417f4c0d01200610242204450d002000200636020420002004360200200041086a220641003602002000200310a10102402003450d002007200341186c6a210820062802002104200721030340200341086a29030021092003290300210a200020044110106d2000280200200628020022046a220520093700082005200a3700002006200441106a2204360200200341106a2802002105200020044104106d2000280200200628020022046a20053600002006200441046a2204360200200341146a2d00002105200020044101106d2000280200200628020022046a20053a00002006200441016a2204360200200341156a2d00002105200020044101106d2000280200200628020022046a20053a00002006200441016a2204360200200341186a22032008470d000b0b024020022802042200450d00200041186c450d00200710260b20024180016a24000f0b1033000b1034000b5501027f02404110102422020d001033000b2000421037020420002002360200200041004110106d2000280200200041086a220028020022026a2203420037000820034280c2d72f3700002000200241106a3602000bcc0101057f230041106b2202240020012802002103024002400240200141046a280200220441037622050d004101210541002101410021060c010b4101210102402005410820044107716b22064d0d0041024101200520066b22014107711b20014103766a21010b200110242205450d01200121060b20024100360208200220053602002002200636020420024100200110c9012002280200220520022802086a2003200110cf061a200020043602042000200536020020002002280204360208200241106a24000f0b1033000b6001037f230041106b2201240002404101102422020d001033000b2001420137020420012002360200200141004101106d20012802002202200128020822036a200041ff01714101463a0000200141106a2400200341016aad4220862002ad840b1f0002402000280200450d00200041086a280200450d00200028020410260b0b130020004104360204200041f4b8c5003602000b3400200041b18dc70036020420004100360200200041146a4101360200200041106a4190c3c500360200200041086a42043702000bff0c04057f017e017f037e230041b0066b220224000240024002400240024002400240024002400240024002400240024020012802042203450d00200128020022042d0000210520012003417f6a3602042001200441016a360200200541034b0d0520050e0401020304010b200041053a00000c0c0b200241c0036a200110b60220022802c003210120024190016a200241c0036a41047241ac0210cf061a0240024020014117460d00200241c0036a20024190016a41ac0210cf061a41b002102422050d010c0c0b200041053a00000c0c0b20052001360200200541046a200241c0036a41ac0210cf061a200041013a0000200020022f00503b0001200041036a200241d2006a2d00003a0000200041046a2005360200200041086a2002290370370300200041106a200241f0006a41086a290300370300200041186a200241f0006a41106a290300370300200041206a200241f0006a41186a2903003703000c0b0b200241c0036a200110b60220022802c003210520024190016a200241c0036a41047241ac0210cf061a20054117460d03200241c0036a20024190016a41ac0210cf061a41b00210242203450d0920032005360200200341046a200241c0036a41ac0210cf061a0240200128020422054108490d002001280200220629000021072001200541786a3602042001200641086a360200200041023a0000200020022f00503b0001200041036a200241d0006a41026a2d00003a0000200041086a2007370300200041046a2003360200200041106a2002290370370300200041186a200241f0006a41086a290300370300200041206a200241f0006a41106a2903003703000c0b0b200041053a00002003109803200310260c0a0b41002105200241003a00e0032003417f6a21082003417e6a21030240034020082005460d01200241c0036a20056a200420056a220641016a2d00003a0000200120033602042001200641026a3602002002200541016a22063a00e0032003417f6a21032006210520064120460d080c000b0b200541ff0171450d07200241003a00e0030c070b41002105200241003a00e0032003417f6a21082003417e6a21030240034020082005460d01200241c0036a20056a200420056a220641016a2d00003a0000200120033602042001200641026a3602002002200541016a22063a00e0032003417f6a21032006210520064120460d040c000b0b200541ff0171450d03200241003a00e0030c030b200041053a00000c070b200041053a00000c060b20024190016a41086a2205200241c0036a41086a29030037030020024190016a41106a2203200241c0036a41106a29030037030020024190016a41186a2204200241c0036a41186a290300370300200220022903c00337039001200641ff0171411f4b0d010b200041053a00000c040b200241306a41086a2005290300370300200241306a41106a2003290300370300200241306a41186a20042903003703002002200229039001220737035020022007370330200241c0036a200110b60220022802c003210120024190016a200241c0036a41047241ac0210cf061a024020014117460d00200241c0036a20024190016a41ac0210cf061a41b00210242205450d0320052001360200200541046a200241c0036a41ac0210cf061a200241106a41186a200241306a41186a2903002207370300200241106a41106a200241306a41106a2903002209370300200241106a41086a200241306a41086a290300220a37030020022002290330220b370310200041043a00002000200b370001200041096a200a370000200041116a2009370000200041196a2007370000200041216a20022f000d3b0000200041236a2002410f6a2d00003a0000200041246a20053602000c040b200041053a00000c030b20024190016a41086a2201200241c0036a41086a29030037030020024190016a41106a2205200241c0036a41106a29030037030020024190016a41186a2203200241c0036a41186a290300370300200220022903c00337039001200641ff0171411f4d0d00200241306a41086a20012903002209370300200241306a41106a2005290300220a370300200241306a41186a2003290300220b3703002002200229039001220737035020022007370330200041033a000020002007370001200041096a2009370000200041116a200a370000200041196a200b370000200041216a2002280010360000200041246a200241106a41036a2800003600000c020b200041053a00000c010b102c000b200241b0066a24000bc10d02057f047e230041d0066b220224000240024002400240024002400240024002400240200128020022032802042204450d00200328020022052d0000210620032004417f6a3602042003200541016a360200200641034b0d0520060e0401020304010b200041053a00000c080b2001200128020441016a22033602040240200320012802084b0d00200241a0036a200110b40220022802a0032103200241f0006a200241a0036a41047241ac0210cf061a20034117460d00200241a0036a200241f0006a41ac0210cf061a41b00210242206450d0620062003360200200641046a200241a0036a41ac0210cf061a200041013a0000200020022f00303b0001200041036a200241326a2d00003a0000200041046a2006360200200041086a2002290350370300200041106a200241d0006a41086a290300370300200041186a200241d0006a41106a290300370300200041206a200241d0006a41186a29030037030020012001280204417f6a3602040c080b200041053a00000c070b2001200128020441016a22033602040240200320012802084b0d00200241a0036a200110b40220022802a0032103200241f0006a200241a0036a41047241ac0210cf061a20034117460d00200241a0036a200241f0006a41ac0210cf061a41b00210242206450d0520062003360200200641046a200241a0036a41ac0210cf061a20012001280204417f6a36020402402001280200220328020422014108490d002003280200220429000021072003200141786a3602042003200441086a360200200041023a0000200020022f00303b0001200041036a200241306a41026a2d00003a0000200041086a2007370300200041046a2006360200200041106a2002290350370300200041186a200241d0006a41086a290300370300200041206a200241d0006a41106a2903003703000c080b200041053a00002006109803200610260c070b200041053a00000c060b41002103200241003a00c00302400340200128020022062802042204450d01200241a0036a20036a200628020022052d00003a000020062004417f6a3602042006200541016a3602002002200341016a22033a00c00320034120470d000b200241f0006a41186a200241a0036a41186a2903002207370300200241d0006a41086a2203200241a0036a41086a290300370300200241d0006a41106a2206200241a0036a41106a290300370300200241d0006a41186a22012007370300200220022903a003370350200241306a41186a22042001290300370300200241306a41106a22012006290300370300200241306a41086a2206200329030037030020022002290350370330200041033a000020002002290330370001200041096a2006290300370000200041116a2001290300370000200041196a2004290300370000200041216a2002280010360000200041246a200241106a41036a2800003600000c060b0240200341ff0171450d00200241003a00c0030b200041053a00000c050b41002103200241003a00c00302400340200128020022062802042204450d01200241a0036a20036a200628020022052d00003a000020062004417f6a3602042006200541016a3602002002200341016a22033a00c00320034120470d000b200241f0006a41186a200241a0036a41186a2903002207370300200241d0006a41086a2203200241a0036a41086a290300370300200241d0006a41106a2206200241a0036a41106a290300370300200241d0006a41186a22042007370300200220022903a003370350200241306a41186a2004290300370300200241306a41106a2006290300370300200241306a41086a2003290300370300200220022903503703302001200128020441016a2203360204200320012802084d0d020c040b0240200341ff0171450d00200241003a00c0030b200041053a00000c040b200041053a00000c030b200241a0036a200110b40220022802a0032103200241f0006a200241a0036a41047241ac0210cf061a20034117460d01200241a0036a200241f0006a41ac0210cf061a41b00210242206450d0020062003360200200641046a200241a0036a41ac0210cf061a200241106a41186a200241306a41186a2903002207370300200241106a41106a200241306a41106a2903002208370300200241106a41086a200241306a41086a290300220937030020012001280204417f6a36020420022002290330220a370310200041043a00002000200a370001200041096a2009370000200041116a2008370000200041196a2007370000200041246a2006360200200041216a20022f000d3b0000200041236a2002410f6a2d00003a00000c020b102c000b200041053a00000b200241d0066a24000b130020004101360204200041b0c7c5003602000b3400200041a28cc70036020420004100360200200041146a4103360200200041106a41bcc8c500360200200041086a420a3702000b0b0020004104410010b5030b8f0303027f017e067f230041206b22022400024020014102490d00200041206a22032000412010d206417f4a0d002000290000210420002003290000370000200241186a2205200041186a2206290000370300200241106a2207200041106a2208290000370300200241086a2209200041086a220a290000370300200a200341086a2900003700002008200341106a2900003700002006200341186a2900003700002002200437030041012103024020014103490d00200041c0006a21034102210802400340024020012008470d002001200141b4ccc5001032000b20032002412010d206417f4a0d01200341606a22062003290000370000200641186a200341186a290000370000200641106a200341106a290000370000200641086a200341086a290000370000200341206a21032001200841016a2208470d000b2008417f6a21030c010b2008417f6a21030b200020034105746a22032002290300370000200341186a2005290300370000200341106a2007290300370000200341086a20092903003700000b200241206a24000b942205047f067e017f037e047f230041e0036b2202240002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012802000e170102030405060b0708090a0b0c0d0e0f10111213141500010b200241086a200141086a108d03200041086a200241086a41c80010cf061a200041163602000c150b200241086a200141086a108e0320004100360200200041186a200241086a41106a290300370300200041106a200241086a41086a290300370300200041086a20022903083703000c140b200241086a200141086a108f03200041086a200241086a41a00210cf061a200041013602000c130b20004102360200200041086a200141086a2903003703000c120b02400240024002400240024002400240024020012d0004417f6a220341044b0d00200141046a210420030e050102030405010b41bf80c700412841dcbcc700102f000b200141086a2802002103410121050c040b41022105200241b0026a41026a200441036a2d00003a0000200241086a41086a200141146a290200370300200241186a2001411c6a290200370300200241206a200141246a2d00003a0000200220042f00013b01b00220022001410c6a290200370308200141086a2802002103200141286a28020021010c040b200141086a2802002103410321050c020b200241b2026a200441036a2d00003a0000200241086a41086a200141146a290200370300200241186a2001411c6a290200370300200241206a200141246a2d00003a0000200220042f00013b01b00220022001410c6a29020037030820012d00254100472104200141086a2802002103200141286a2802002101410421050c030b200141086a2802002103410521050b0b0b200020053a0004200020022f01b0023b0005200020043a0025200020022f01d0033b0126200041086a20033602002000410c6a2002290308370200200041286a2001360200200041076a200241b2026a2d00003a0000200041146a200241086a41086a2903003702002000411c6a200241186a290300370200200041246a200241206a2d00003a0000200041033602000c110b02400240024002400240024002400240200141086a22032d0000417f6a220541034b0d0020050e0401020304010b41bf80c700412841dcbcc700102f000b200241106a200341096a290000370300200241186a200341116a290000370300200241206a200341196a29000037030020022003290001370308200141386a2903002106200141306a2903002107410121010c030b200241106a200341096a290000370300200241186a200341116a290000370300200241206a200341196a29000037030020022003290001370308200141c8006a2903002108200141c0006a2903002109200141386a2903002106200141306a2903002107410221010c030b200241106a200341096a290000370300200241186a200341116a290000370300200241206a200341196a290000370300200220032900013703082002200341216a2800003602b0022002200341246a2800003600b302200141c8006a3100002108200141c0006a2902002109200141386a2902002106200141306a2902002107200141d8006a290300210a200141d0006a290300210b410321010c030b200241106a200341096a290000370300200241186a200341116a290000370300200241206a200341196a29000037030020022003290001370308200141386a2903002106200141306a2903002107410421010b0b0b20002002290308370009200020022802b00236002920004104360200200041d8006a200a370300200041d0006a200b370300200041c8006a2008370300200041c0006a2009370300200041386a2006370300200041306a2007370300200041086a20013a00002000412c6a20022800b302360000200041116a200241086a41086a290300370000200041196a200241186a290300370000200041216a200241206a2903003700000c100b200241086a200141046a10c001200041053602002000410c6a200241106a280200360200200020022903083702040c0f0b024002402001280204450d00200241b0026a41186a200141286a290000370300200241b0026a41106a200141206a290000370300200241b8026a200141186a290000370300200241b0026a41286a200141386a290000370300200241b0026a41306a200141c0006a290000370300200241b0026a41386a200141c8006a290000370300200241b0026a41c8006a200141d8006a290000370300200241b0026a41d0006a200141e0006a290000370300200241b0026a41d8006a200141e8006a2900003703002002200141106a2900003703b0022002200141306a2900003703d0022002200141d0006a2900003703f002200241b0026a41f8006a20014188016a290000370300200241b0026a41f0006a20014180016a290000370300200241b0026a41e8006a200141f8006a290000370300200241b0026a4198016a200141a8016a290000370300200241b0026a4190016a200141a0016a290000370300200241b0026a4188016a20014198016a2900003703002002200141f0006a29000037039003200220014190016a2900003703b003200241086a200141046a10c801200241146a200241b0026a41a00110cf061a0c010b200241003602080b200041046a200241086a41ac0110cf061a200041073602000c0e0b20004108360200200020012802043602040c0d0b200241086a200141086a109003200041086a200241086a41980210cf061a200041093602000c0c0b20012802042103200241086a200141086a10c801200241d0036a200141146a10d001200241086a41146a200241d0036a41086a280200360200200220022903d003370214200241b0026a41106a200241086a41106a2903002206370300200241b0026a41086a200241086a41086a29030022073703002002200229030822083703b002200141206a2902002109200141286a280200210520002003360204200041086a2008370200200041106a2007370200200041186a2006370200200041286a2005360200200041206a20093702002000412c6a2001412c6a290200370200200041346a200141346a2902003702002000413c6a2001413c6a290200370200200041c4006a200141c4006a290200370200200041cc006a200141cc006a290200370200200041d4006a200141d4006a290200370200200041dc006a200141dc006a290200370200200041e4006a200141e4006a2902003702002000410a3602000c0b0b108103000b200241086a200141086a109103200041086a200241086a41a00210cf061a2000410c3602000c090b2000410d3602000c080b200241086a200141046a10b702200041046a200241086a41c80010cf061a2000410e3602000c070b024002400240024020012f0104417f6a220341014b0d0020030e020102010b41bf80c700412841dcbcc700102f000b200241086a200141086a10c401200229020c210620022802082103410121010c010b20012f0106210541b00210242203450d082003200141086a28020010c601410221010b200020013b01042000410f3602002000410c6a2006370200200041086a2003360200200041066a20053b01000c060b200241086a200141086a10d002200041086a200241086a41a80210cf061a200041103602000c050b200241086a200141046a109203200041046a200241086a41c40010cf061a200041113602000c040b02400240024002400240200141086a22032d0000417f6a220c41034b0d00420021064101210542002109200c0e0404010203040b41bf80c700412841dcbcc700102f000b200241206a200341196a290000370300200241186a200341116a290000370300200241106a200341096a290000370300200220032900013703084200210641022105420021090c020b200241106a200341096a290000370300200241186a200341116a290000370300200241206a200341196a29000037030020022003290001370308200141c8006a2903002108200141c0006a2903002107200141386a290300210d200141306a290300210e200141d0006a28020021044200210641032105420021090c010b200241106a200341096a290000370300200241186a200341116a290000370300200241206a200341196a290000370300200220032900013703082002200341216a2800003602b0022002200341246a2800003600b302200141d0006a290300220f428080808070832106200141d8006a2903002109200141c8006a3100002108200141c0006a2902002107200141386a290200210d200141306a290200210e200141e8006a290300210b200141e0006a290300210a200141f0006a2802002110200fa72104410421050b20002002290308370009200020022802b002360029200041e8006a200b370300200041e0006a200a370300200041d8006a2009370300200041c8006a2008370300200041c0006a2007370300200041386a200d370300200041306a200e370300200041086a20053a00002000412c6a20022800b302360000200041f0006a2010360200200041d0006a20062004ad84370300200041116a200241086a41086a290300370000200041196a200241186a290300370000200041216a200241206a290300370000200041123602000c030b200241086a200141046a10930320004113360200200041246a200241286a2802003602002000411c6a200241206a290300370200200041146a200241186a2903003702002000410c6a200241106a290300370200200020022903083702040c020b200241086a200141086a10940320004114360200200041286a200241086a41206a290300370300200041206a200241086a41186a290300370300200041186a200241086a41106a290300370300200041106a200241086a41086a290300370300200041086a20022903083703000c010b024002400240024002400240024020012d0004417f6a221141054b0d004104210520110e06010203060405010b41bf80c700412841dcbcc700102f000b200241086a41086a2205200141106a290000370300200241086a41106a2212200141186a290000370300200241086a41156a22132001411d6a2900003700002002200141086a29000037030820012f0006211020012d0005210420012d0025210c41b00210242203450d062003200141286a280200109503200241b0026a41156a2013290000370000200241b0026a41106a2012290300370300200241b0026a41086a2005290300370300200220022903083703b002410121050c040b200241b0026a41086a200141106a290200370300200241b0026a41106a200141186a290200370300200241c5026a2001411d6a2900003700002002200141086a2902003703b00220012f0006211020012d0005210420012d0025210c410221050c030b200241b0026a41086a200141106a290200370300200241b0026a41106a200141186a290200370300200241c5026a2001411d6a2900003700002002200141086a2902003703b00220012f0006211020012d0005210420012d0025210c410321050c020b20012f0106211020012d00052104410521050c010b200241b0026a41086a200141106a290200370300200241b0026a41106a200141186a290200370300200241c5026a2001411d6a2900003700002002200141086a2902003703b0022001412c6a2802002113200141286a280200210320012f0006211020012d0005210420012f0126211220012d0025210c410621050b200020043a0005200020053a00042000200c3a002520004115360200200041066a20103b0100200041086a20022903b0023702002000412c6a2013360200200041286a2003360200200041266a20123b0100200041106a200241b0026a41086a290300370200200041186a200241b0026a41106a2903003702002000411d6a200241b0026a41156a2900003700000b200241e0036a24000f0b102c000b130020004101360204200041a4cec5003602000b130020004107360204200041e8cec5003602000bc62e02047f047e230041a0046b2203240002400240024002400240024002400240024002400240024002400240024020012d00000e050001020304000b200341dc016a4101360200200342013702cc01200341dcedc6003602c8012003410436029c01200341d4edc60036029801200320034198016a3602d801200341c8016a41ecc0c700103d000b200141046a2802002101200341c8016a41206a200241206a290200370300200341c8016a41186a200241186a290200370300200341c8016a41106a200241106a290200370300200341c8016a41086a2204200241086a290200370300200320022902003703c80120034198016a200341c8016a10d602200341f8036a41086a220220034198016a41096a290000370300200341f8036a41106a220520034198016a41116a290000370300200341f8036a41186a220620034198016a41196a29000037030020032003290099013703f80320032d0098014101460d03200341f8006a41186a2006290300370300200341f8006a41106a2005290300370300200341f8006a41086a2002290300370300200320032903f80337037820034198016a41186a2202420037030020034198016a41106a2205420037030020034198016a41086a220642003703002003420037039801200341c8016a41b18dc700410410fb0120062004290000370300200320032900c80137039801200341c8016a41e8c3c500410310fb0120022004290000370300200520032900c801370300200341c8016a20034198016a412010b80320032d00c80121042002200341c8016a41196a2900003703002005200341c8016a41116a2900003703002006200341c8016a41096a290000370300200320032900c901370398010240024020044101460d0020034190046a420037030020034188046a420037030020034180046a4200370300200342003703f8030c010b200341f8036a41186a20034198016a41186a290300370300200341f8036a41106a20034198016a41106a290300370300200341f8036a41086a20034198016a41086a29030037030020032003290398013703f8030b0240200341f8006a200341f8036a412010d2060d00200341c8016a200141b00210cf061a200341003b01f803411010242202450d05200241b889c70036020c2002410136020820024281808080103702002003200236029c0420034198016a200341c8016a200341f8036a10a303200320032900b9013703c8012003200341c0016a2800003600cf0102402003290398014201510d00410421020c0d0b200341b8016a2d0000210420032903a0012107200320032800cf0136005f200320032903c8013703584104210220074202510d0c2003200328005f36003f20032003290358370338200421020c0c0b410321020c0a0b200141046a2802002101200341c8016a41206a200241206a290200370300200341c8016a41186a200241186a290200370300200341c8016a41106a200241106a290200370300200341c8016a41086a2204200241086a290200370300200320022902003703c80120034198016a200341c8016a10d602200341f8036a41086a220220034198016a41096a290000370300200341f8036a41106a220520034198016a41116a290000370300200341f8036a41186a220620034198016a41196a29000037030020032003290099013703f80320032d0098014101460d04200341f8006a41186a2006290300370300200341f8006a41106a2005290300370300200341f8006a41086a2002290300370300200320032903f80337037820034198016a41186a2202420037030020034198016a41106a2205420037030020034198016a41086a220642003703002003420037039801200341c8016a41b18dc700410410fb0120062004290000370300200320032900c80137039801200341c8016a41e8c3c500410310fb0120022004290000370300200520032900c801370300200341c8016a20034198016a412010b80320032d00c80121042002200341c8016a41196a2900003703002005200341c8016a41116a2900003703002006200341c8016a41096a290000370300200320032900c901370398010240024020044101460d0020034190046a420037030020034188046a420037030020034180046a4200370300200342003703f8030c010b200341f8036a41186a20034198016a41186a290300370300200341f8036a41106a20034198016a41106a290300370300200341f8036a41086a20034198016a41086a29030037030020032003290398013703f8030b0240200341f8006a200341f8036a412010d2060d00200341c8016a200141b00210cf061a200341003b01f803411010242202450d04200241b889c70036020c2002410136020820024281808080103702002003200236029c0420034198016a200341c8016a200341f8036a10a303200320032900b9013703c8012003200341c0016a2800003600cf0102402003290398014201510d00410421020c0a0b200341b8016a2d0000210420032903a0012107200320032800cf0136005f200320032903c8013703584104210220074202510d092003200328005f36003f20032003290358370338200421020c090b410321020c070b200341106a41186a200141196a290000370300200341106a41106a200141116a290000370300200341106a41086a200141096a29000037030020032001290001370310200341c8016a41206a200241206a290200370300200341c8016a41186a200241186a290200370300200341c8016a41106a200241106a290200370300200341c8016a41086a2201200241086a290200370300200320022902003703c80120034198016a200341c8016a10d602200341f8036a41086a220220034198016a41096a290000370300200341f8036a41106a220420034198016a41116a290000370300200341f8036a41186a220520034198016a41196a29000037030020032003290099013703f80320032d0098014101460d04200341386a41186a2005290300370300200341386a41106a2004290300370300200341386a41086a2002290300370300200320032903f80337033820034198016a41186a2204420037030020034198016a41106a2202420037030020034198016a41086a220542003703002003420037039801200341c8016a41b18dc700410410fb0120052001290000370300200320032900c80137039801200341c8016a41e8c3c500410310fb0120042001290000370300200220032900c801370300200341c8016a20034198016a412010b80320032d00c80121012004200341c8016a41196a2900003703002002200341c8016a41116a2900003703002005200341c8016a41096a290000370300200320032900c901370398010240024020014101460d0020034190046a420037030020034188046a420037030020034180046a4200370300200342003703f8030c010b200341f8036a41186a20034198016a41186a290300370300200341f8036a41106a20034198016a41106a290300370300200341f8036a41086a20034198016a41086a29030037030020032003290398013703f8030b0240200341386a200341f8036a412010d206450d00410321020c060b200341f8006a41086a200341106a41086a290300370300200341f8006a41106a200341106a41106a290300370300200341f8006a41186a200341106a41186a2903003703002003200329031037037820034198016a41186a2204420037030020034198016a41106a2205420037030020034198016a41086a220142003703002003420037039801200341c8016a41b18dc700410410fb012001200341c8016a41086a2206290000370300200320032900c80137039801200341c8016a41e8c3c500410310fb01200241086a2006290000370000200220032900c801370000200341c8016a20034198016a412010b80320032d00c80121022004200341e1016a2900003703002005200341d9016a2900003703002001200341d1016a290000370300200320032900c901370398010240024020024101460d00200341d8006a41186a4200370300200341d8006a41106a4200370300200341d8006a41086a4200370300200342003703580c010b200341d8006a41186a2004290300370300200341d8006a41106a2005290300370300200341d8006a41086a200129030037030020032003290398013703580b200341dd016a200341d8006a41106a290300370000200341e5016a200341d8006a41186a290300370000200341d8006a41086a29030021072003410d3a00c801200341c8016a410d6a2007370000200341013a00cc01200320032903583700cd01200341c8016a108702200341c8016a41186a200341f8006a41186a290300370300200341c8016a41106a200341f8006a41106a290300370300200341c8016a41086a200341f8006a41086a290300370300200320032903783703c801200341f8036a41186a22024200370300200341f8036a41106a22014200370300200341f8036a41086a4200370300200342003703f803200341f8036a41b18dc700410410fb0120034198016a41e8c3c500410310fb01200220034198016a41086a2900003703002001200329009801370300200341f8036a4120200341c8016a108d05200320032800093602002003200341096a41036a280000360003200041186a41013a000020004200370308200020032802003600192000411c6a2003280003360000200042003703000c0a0b200141246a2802002104200341386a41186a200141196a290000370300200341386a41106a200141116a290000370300200341386a41086a200141096a29000037030020032001290001370338200341c8016a41206a200241206a290200370300200341c8016a41186a200241186a290200370300200341c8016a41106a200241106a290200370300200341c8016a41086a2201200241086a290200370300200320022902003703c80120034198016a200341c8016a10d602200341f8036a41086a220220034198016a41096a290000370300200341f8036a41106a220520034198016a41116a290000370300200341f8036a41186a220620034198016a41196a29000037030020032003290099013703f80302400240024002400240024020032d0098014101460d00200341f8006a41186a2006290300370300200341f8006a41106a2005290300370300200341f8006a41086a2002290300370300200320032903f80337037820034198016a41186a2202420037030020034198016a41106a2205420037030020034198016a41086a220642003703002003420037039801200341c8016a41b18dc700410410fb0120062001290000370300200320032900c80137039801200341c8016a41e8c3c500410310fb0120022001290000370300200520032900c801370300200341c8016a20034198016a412010b80320032d00c80121012002200341c8016a41196a2900003703002005200341c8016a41116a2900003703002006200341c8016a41096a290000370300200320032900c901370398010240024020014101460d0020034190046a420037030020034188046a420037030020034180046a4200370300200342003703f8030c010b200341f8036a41186a20034198016a41186a290300370300200341f8036a41106a20034198016a41106a290300370300200341f8036a41086a20034198016a41086a29030037030020032003290398013703f8030b0240200341f8006a200341f8036a412010d206450d00200410980320041026410321020c020b200341d8006a41086a200341386a41086a2202290300370300200341d8006a41106a200341386a41106a2201290300370300200341d8006a41186a200341386a41186a220529030037030020032003290338370358200341c8016a200441b00210cf061a20034182046a20022903003701002003418a046a200129030037010020034192046a200529030037010020034180023b01f803200320032903383701fa03411010242202450d07200241b889c70036020c2002410136020820024281808080103702002003200236029c04411010242201450d07200141d089c70036020c20014101360208200142818080801037020020022002280200417f6a2205360200024020050d002002280208200228020c2802001103000240200228020c280204450d00200228020810260b20022002280204417f6a220536020420050d00200210260b2003200136029c0420034198016a200341c8016a200341f8036a10a303410121022003290398014201520d04200341c0016a2802002106200341bc016a2802002105200341b8016a2d00002102200341b0016a2d00002101200341a8016a290300210820033100ba01210920033100b901210a20032903a00121074198b2c700410d1084020240024002400240024020020e0403000102030b418ab2c700410e1084020c030b4180b2c700410a1084020c020b200a10f203200910f2032005450d010b200520061084020b4197cbc100410a10840241869fc000410e1084020240024020074201510d0041fc9ec000410a1084020c010b200810f2030b41f39ec0004109108402200141ff01714101470d0241f19ec00041021084020c030b200410980320041026410221020b200320032800103602c8012003200341136a2800003600cb01200041186a41003a000020004200370308200020032802c8013600192000411c6a20032800cb01360000200041286a410b360000200041e6b8c500360024200041173b0021200041206a20023a0000420121070c030b41ee9ec00041031084020b410021020b200320023a00cd01200341023a00cc012003410d3a00c801200341c8016a10870220041026200320032800103602c8012003200341136a2800003600cb01200041186a41013a00004200210720004200370308200020032802c8013600192000411c6a20032800cb013600000b200020073703000c090b410221020c060b102c000b410221020c020b410221020b2003200328000936020020032003410c6a280000360003200041186a41003a000020004200370308200020032802003600192000411c6a2003280003360000200041286a410b360000200041e6b8c500360024200041173b0021200041206a20023a0000200042013703000c040b20011098032001102620032003410c6a28000036000320032003280009360200200041186a41003a000020004200370308200020032802003600192000411c6a2003280003360000200041286a410b360000200041e6b8c500360024200041173b0021200041206a20023a0000200042013703000c030b200320032903383703102003200328003f360017200341c8016a41086a20023a0000200341d1016a2003290310370000200341c8016a41106a2003280017360000200341003a00cc012003410d3a00c801200320032f00353b00cd012003200341376a2d00003a00cf01200341dc016a20032902f803370200200341c8016a411c6a200341f8036a41086a290200370200200341ec016a200341f8036a41106a280200360200200341c8016a1087022001102620032003410c6a28000036000320032003280009360200200041186a41013a000020004200370308200020032802003600192000411c6a2003280003360000200042003703000c020b20011098032001102620032003410c6a28000036000320032003280009360200200041186a41003a000020004200370308200020032802003600192000411c6a2003280003360000200041286a410b360000200041e6b8c500360024200041173b0021200041206a20023a0000200042013703000c010b200320032903383703102003200328003f360017200341c8016a41086a20023a0000200341d1016a2003290310370000200341c8016a41106a2003280017360000200341003a00cc012003410d3a00c801200320032f00353b00cd012003200341376a2d00003a00cf01200341dc016a20032902f803370200200341c8016a411c6a200341f8036a41086a290200370200200341ec016a200341f8036a41106a280200360200200341c8016a1087022001102620032003410c6a28000036000320032003280009360200200041186a41013a000020004200370308200020032802003600192000411c6a2003280003360000200042003703000b200341a0046a24000ba90101047f230041106b220324000240412010242204450d002003422037020420032004360200200341004120106d20032802002205200328020822066a22042002290000370000200441086a200241086a290000370000200441106a200241106a290000370000200441186a200241186a2900003700002003200641206a2202360208200020012005200210b30102402003280204450d00200510260b200341106a24000f0b1033000bb90401057f230041e0006b22032400200341086a41d18cc700410810fb01200341186a41e4f5c500411210fb0120032001360238200341c4006a200341386a410410a202200341dc006a2201200341386a41046a3602002003200341c4006a41086a22043602542003200341386a3602582003200341c4006a360250200341286a200341d0006a10732003200236024c200341c4006a200341cc006a410410a2022001200341cc006a41046a360200200320043602542003200341cc006a3602582003200341c4006a360250200341386a200341d0006a10730240024020032802302201200328024022046a41206a2205417f4c0d000240024020050d0041012102410021050c010b200510242202450d020b20002002360200200041086a220241003602002000200536020420004100411010c9012000280200200228020022056a220620032900083700002002200541106a2205360200200641086a200341086a41086a29000037000020002005411010c9012000280200200228020022056a220620032900183700002002200541106a2207360200200641086a200341186a41086a2900003700002003280228210520002007200110c9012000280200200228020022066a2005200110cf061a2002200620016a22063602002003280238210120002006200410c9012000280200200228020022006a2001200410cf061a2002200020046a3602000240200328023c450d00200110260b0240200328022c450d00200510260b200341e0006a24000f0b1034000b1033000b941c030a7f047e0d7f230041d0066b220224000240024020012802082203200128020c2204460d002001200341206a22053602082001280210210620024188036a41186a200341186a29000037030020024188036a41106a200341106a29000037030020024188036a41086a200341086a2900003703002002200329000037038803200128021421074100210302400240024002402001411c6a280200220841014b0d0020080e020201020b2008210903402009410176220a20036a220b20032007200b4105746a20024188036a412010d2064101481b21032009200a6b220941014b0d000b0b200720034105746a20024188036a412010d206450d010b03402001200641016a220636021020052004460d022001200541206a220b36020820024188036a41186a200541186a29000037030020024188036a41106a200541106a29000037030020024188036a41086a200541086a29000037030020022005290000370388034100210302400240200841014b0d00200b210520080e020201020b2008210503402005410176220920036a220a20032007200a4105746a20024188036a412010d2064101481b2103200520096b220541014b0d000b0b200b2105200720034105746a20024188036a412010d2060d000b0b02400240200820034d0d00200241186a200720034105746a220341186a290000220c370300200241106a200341106a290000220d370300200241086a200341086a290000220e37030020022003290000220f3703002001200641016a360210200141286a2802002104200141206a2802002107200141246a2802002109200241206a41186a200c370300200241206a41106a200d370300200241206a41086a200e3703002002200f3703202002200936024c200220073602482002200636024420024188036a10ad03024020022802900320064b0d00200228028c0341ffffff3f71450d0220022802880310260c020b2006200228028803220320064105746a10ae0321050240200228028c0341ffffff3f71450d00200310260b410221032005450d01200621050c030b200320084180d7c5001032000b0240411b10242203450d002002421b37025420022003360250200241d0006a4100411b10c9012002280250200228025822056a22034100290090d745370000200341086a4100290098d745370000200341106a41002900a0d745370000200341176a41002800a7d74536000020022005411b6a220a360258410410242203450d002002420437028c03200220033602880320024188036a41004104106d200228028803220520022802900322036a20063600002002200341046a220336029003200228028c032108200241d0006a200a200310c901200228025022012002280258220a6a2005200310cf061a2002200a20036a220b36025802402008450d00200510260b20022802542108200241b8026a41012001200b109005024002400240024020022802b8022203450d00200241c0026a28020022054104490d002005417c714104460d0020032800002007470d002003280004220541036a20094b0d010b200241003602582002420137035041042103200241d0006a41004104106d2002280250200228025822056a20073600002002200541046a2205360258200241d0006a20054104106d200228025022052002280258220a6a20093600002002200a41046a220a36025820024188036a41086a200241b8026a41086a280200360200200220022903b8023703880341012001200b20024188036a2005200a109105210a02402002280254450d00200510260b200a0d012009210520080d020c050b024020022802bc02450d00200310260b4101210320080d010c040b20024188036a1092050240024002402002280288032205450d0020024198036a280200211020024188036a410c6a28020021112002419c036a280200211220024188036a41086a2802002113200228028c0321142002410036028003200242013703f802200241f8026a41004104106d20022802f80220022802800322036a20093600002002200341046a3602800320052013200241f8026a109501200241f8026a201210a10102402012450d0020112012410c6c6a210a2011210303402003280200200341086a280200200241f8026a1095012003410c6a2203200a470d000b0b200241f8026a2002280280034104106d20022802f80220022802800322036a20073600002002200341046a220336028003200241f8026a20034104106d20022802f80220022802800322036a20063600002002200341046a220336028003200241f8026a20034104106d20022802f8022203200228028003220a6a20043600002002200a41046a220a3602800320024188036a41e9dabdf306200241206a2003200a109305410121150240024020022d0088034101460d004103210a0c010b200241f6026a20022d008b033a0000200241b8026a41086a2002419c036a290200370300200241c8026a200241a4036a290200370300200241d0026a200241ac036a290200370300200241d8026a200241b4036a290200370300200241e0026a200241bc036a290200370300200241e5026a200241c1036a290000370000200220022f0089033b01f402200220024194036a2902003703b80220024188036a41086a2802002116200228028c03210a410021150b200241b4026a41026a2217200241f4026a41026a2d00003a0000200241f8016a41086a2218200241b8026a41086a290300370300200241f8016a41106a2219200241b8026a41106a290300370300200241f8016a41186a221a200241b8026a41186a290300370300200241f8016a41206a221b200241b8026a41206a290300370300200241f8016a41286a221c200241b8026a41286a290300370300200241f8016a41306a200241b8026a41306a290300370300200220022f01f4023b01b402200220022903b8023703f801024020150d00200241f4016a41026a20172d00003a000020024188036a41086a201829030037030020024188036a41106a201929030037030020024188036a41186a201a29030037030020024188036a41206a201b29030037030020024188036a41286a201c29030037030020024188036a412d6a200241f8016a412d6a290000370000200220022f01b4023b01f401200220022903f80137038803024020022802fc02450d00200310260b200220022f01f4013b01b8022002200241f6016a2d00003a00ba02410021030c030b024020022802fc02450d00200310260b02402014450d00200510260b02402012450d002012410c6c21052011210303400240200341046a280200450d00200328020010260b2003410c6a2103200541746a22050d000b0b4101210302402010450d002010410c6c450d00201110260b200a2109201621050c010b41012103410521090b0b200241b8016a41086a221520024188036a41086a290300370300200241b8016a41106a221720024188036a41106a290300370300200241b8016a41186a221820024188036a41186a290300370300200241b8016a41206a221920024188036a41206a290300370300200241b8016a41286a221a20024188036a41286a290300370300200241b8016a412d6a221b20024188036a412d6a290000370000200220022d00ba023a00f201200220022f01b8023b01f00120022002290388033703b80102400240024020030d00200241d0006a41186a2012360200200241d0006a41146a2010360200200241d0006a41106a2011360200200241d0006a410c6a2013360200200241d0006a41086a2014360200200241fa006a20022d00f2013a0000200241ff006a2016360000200241fb006a200a36000020024183016a20022903b8013700002002418b016a201529030037000020024193016a20172903003700002002419b016a2018290300370000200241a3016a2019290300370000200241ab016a201a290300370000200241b0016a201b29000037000020022004360274200220063602702002200736026c2002200536025420022009360250200220022f01f0013b0178024041002802c8c2474103490d00200241b8026a411c6a4112360200200241b8026a41146a4113360200200241b8026a410c6a4113360200200241133602bc022002200241d0006a3602d0022002200241c8006a3602c8022002200241cc006a3602c0022002200241c4006a3602b80241002802c4c247210341002802c0c247210941002802ccc247210a200241c8036a419104360200200241c0036a42e080808010370300200241bc036a41ced2c500360200200241b4036a4210370200200241b0036a419cd4c500360200200241a8036a420437030020024198036a420437030020024188036a41086a410836020020024188036a411c6a200241b8026a360200200241acd7c5003602940320024194d4c50036028c032002410336028803200941c8a1c000200a410246220a1b20024188036a200341b0a1c000200a1b2802101102000b2002410a3602a004200242023703f003200241a4046a200241d0006a41e80010cf061a200220024188036a3602b802200241f8016a200241b8026a10af04200241b8026a41086a200241f8016a41086a280200360200200220022903f8013703b802200241b8026a109605210a200241a0046a1098034107210341062109200a0d010c020b4107210320094107460d010b2002410036029003200242013703880320024188036a41004104106d20022802880320022802900322036a20073600002002200341046a22033602900320024188036a20034104106d2002280288032203200228029003220a6a41003600002002200a41046a220a3602900341012001200b2003200a1097050240200228028c03450d00200310260b200921030b2008450d030b200110260c020b1033000b410821030b2000200536020420002003360200200241d0066a24000b1800200020014101472003ad4220862002ad84101610c5060b8d0101017f230041206b22062400200641086a200310c40620004101472002ad4220862001ad84200641186a200641106a2200200628020822014101461b2903002005ad4220862004ad841015210202402001450d002000280200450d00200628020c10260b024020032802002201450d00200341046a280200450d00200110260b200641206a240020024101460b960607017f017e097f017e027f017e017f230041206b220124000240024010182202422088a722030d004101210441002103410021050c010b2002a72104410121050b2001200336020c200120043602080240024002400240024002402003450d0020042d0000210620012003417f6a36020c2001200441016a360208200641014b0d00024020060e020005000b200141106a200141086a10c00620012802102207450d00200141186a2802002108200128021421092001200141086a108f010240024020012802000d002001280204220a200128020c410c6e22032003200a4b1bad420c7e2202422088a70d052002a72203417f4c0d050240024020030d00410421060c010b200310242206450d050b2003410c6ead21020240200a450d000340200141106a200141086a10c00602402001280210220b0d0002402002422088a72203450d002003410c6c210a2006210303400240200341046a280200450d00200328020010260b2003410c6a2103200a41746a220a0d000b0b2002a72203450d032003410c6c450d03200610260c030b2001290214210c02402002422088a722032002a7470d0002400240200341016a220d2003490d002003410174220e200d200d200e491b220d4104200d41044b1bad420c7e220f422088a7220e0d00200fa7220d4100480d00200e45410274210e2003410c6c201020031b21100240024002402006410020031b22060d00200d0d01200e21060c040b2010200d460d03024020100d00200d0d01410421060c040b20062010200d10282206450d010c030b200d102422060d020b200e0d080b102e000b200242808080807083200d410c6ead8421020b20062002422088a7410c6c6a2203200c3702042003200b36020020024280808080107c2102200a417f6a220a0d000b0b20060d010b2009450d01200710260c010b20070d050b4196aec700412e200141106a41c4aec70041d4aec7001036000b102c000b1033000b1034000b410021070b2000200936020420002007360200200041106a20023702002000410c6a2006360200200041086a200836020002402005450d00200410260b200141206a24000bf30904017f017e067f067e230041d0036b22052400200520013602040240200541046a20022004ad4220862003ad8410082206422088a72204450d002006a722072d0000220341014b0d0041002102200541086a210802400240024020030e020100010b41002102200541003a00c8022004417f6a2104200741016a210102400240034020042002460d0120054188026a20026a200120026a2d00003a00002005200241016a22033a00c80220032102200341c000460d020c000b0b200241ff0171450d02200541003a00c8020c020b200541d0026a41086a220220054188026a41086a290300370300200541d0026a41106a220420054188026a41106a290300370300200541d0026a41186a220120054188026a41186a290300370300200541d0026a41206a220920054188026a41206a290300370300200541d0026a41286a220a20054188026a41286a290300370300200541d0026a41306a220b20054188026a41306a290300370300200541d0026a41386a220c20054188026a41386a29030037030020052005290388023703d002200341ff0171413f4d0d01200541c8016a41386a2203200c290300370300200541c8016a41306a200b2903002206370300200541c8016a41286a200a290300220d370300200541c8016a41206a2009290300220e370300200541c8016a41186a2001290300220f370300200541c8016a41106a20042903002210370300200541c8016a41086a20022903002211370300200520052903d00222123703c80120054188016a41306a2202200637030020054188016a41286a2204200d37030020054188016a41206a2201200e37030020054188016a41186a2209200f37030020054188016a41106a220a201037030020054188016a41086a220b201137030020054188016a41386a220c20032903003703002005201237038801200541c8006a41386a2203200c290300370300200541c8006a41306a220c2002290300370300200541c8006a41286a22022004290300370300200541c8006a41206a22042001290300370300200541c8006a41186a22012009290300370300200541c8006a41106a2209200a290300370300200541c8006a41086a220a200b2903003703002005200529038801370348200541086a41386a2003290300370300200541086a41306a200c290300370300200541086a41286a2002290300370300200541086a41206a2004290300370300200541086a41186a2001290300370300200541086a41106a2009290300370300200541086a41086a200a29030037030020052005290348370308410121020b200020023a000020002008290000370001200041096a200841086a290000370000200041116a200841106a290000370000200041196a200841186a290000370000200041216a200841206a290000370000200041296a200841286a290000370000200041316a200841306a290000370000200041396a200841386a29000037000020071026200541d0036a24000f0b200541c8006a41086a20054188016a41086a290300370300200541c8006a41106a20054188016a41106a290300370300200541c8006a41186a20054188016a41186a290300370300200541c8006a41206a20054188016a41206a290300370300200541c8006a41286a20054188016a41286a290300370300200541c8006a41306a20054188016a41306a2903003703000b4196aec700412e20054188026a41c4aec70041d4aec7001036000bee0402037f027e230041b0016b220224002000280200210320024198016a200041046a10c80120024188016a200041106a10d00120024198016a41146a220420024188016a41086a28020036020020022002290388013702a401200241f0006a41106a20024198016a41106a2903002205370300200241f0006a41086a20024198016a41086a2903002206370300200241086a410c6a2006370200200241086a41146a200537020020022002290398012205370370200220033602082002200537020c200029021c21052002200028022436022c20022005370224200241086a41e0006a200041e0006a290200370300200241086a41d8006a200041d8006a290200370300200241086a41d0006a200041d0006a290200370300200241086a41c8006a200041c8006a290200370300200241086a41c0006a200041c0006a290200370300200241086a41386a200041386a290200370300200241086a41306a200041306a29020037030020022000290228370330200241f0006a410c6a41143602002002410436027420024184d8c5003602702001411c6a28020021002002200241086a36027820012802182101200441023602002002420237029c012002418cd8c500360298012002200241f0006a3602a8012001200020024198016a103521030240200241086a41086a280200450d00200228020c10260b0240200241206a2802002201450d00200241086a41106a28020021002001410c6c210103400240200041046a280200450d00200028020010260b2000410c6a2100200141746a22010d000b0b02402002411c6a2802002200450d002000410c6c450d00200228021810260b200241b0016a240020030bb30201037f23004180016b2202240002400240024002400240200128020022034110710d002000280200210420034120710d012004ad2001104221000c020b20002802002104410021000340200220006a41ff006a2004410f712203413072200341d7006a2003410a491b3a00002000417f6a2100200441047622040d000b20004180016a22044181014f0d02200141e889c0004102200220006a4180016a410020006b104521000c010b410021000340200220006a41ff006a2004410f712203413072200341376a2003410a491b3a00002000417f6a2100200441047622040d000b20004180016a22044181014f0d02200141e889c0004102200220006a4180016a410020006b104521000b20024180016a240020000f0b200441800141d889c0001048000b200441800141d889c0001048000b8e0103027f017e037f230041106b22012400024002400240200035020842208620002802002202ad8410192203428080808010540d002003a722042d0000220541014b0d004100210620050e020201020b4196aec700412e200141086a41c4aec70041d4aec7001036000b410121060b200410260240200041046a280200450d00200210260b200141106a240020060b1d0020004101472002ad4220862001ad842004ad4220862003ad8410170bef0401017f230041306b220224000240024002400240024002400240024020002802000e0701020304050600010b2001411c6a2802002100200128021821012002412c6a4100360200200241d4c0c7003602282002420137021c200241d4d4c50036021820012000200241186a103521010c060b2002200041046a36020c200241153602142001411c6a280200210020022002410c6a360210200128021821012002412c6a41013602002002420137021c200241dcd4c5003602182002200241106a36022820012000200241186a103521010c050b2002200041046a36020c200241153602142001411c6a280200210020022002410c6a360210200128021821012002412c6a41013602002002420237021c200241e4d4c5003602182002200241106a36022820012000200241186a103521010c040b2002200028020436020c200241013602142001411c6a280200210020022002410c6a360210200128021821012002412c6a41013602002002420237021c200241f4d4c5003602182002200241106a36022820012000200241186a103521010c030b2001411c6a2802002100200128021821012002412c6a4100360200200241d4c0c7003602282002420137021c20024184d5c50036021820012000200241186a103521010c020b2001411c6a2802002100200128021821012002412c6a4100360200200241d4c0c7003602282002420137021c2002418cd5c50036021820012000200241186a103521010c010b2001411c6a2802002100200128021821012002412c6a4100360200200241d4c0c7003602282002420137021c20024194d5c50036021820012000200241186a103521010b200241306a240020010b980201027f230041206b220224002002200128021841d4c0c70041002001411c6a28020028020c1100003a00102002200136020841012101200241013a00112002410036020c200220003602182002200041286a36021c200241086a200241186a419cd8c500105d2002411c6a41acd8c500105d1a20022d0010210002400240200228020c22030d00200021010c010b0240200041ff01710d00024020034101470d0020022d001141ff0171450d00200228020822002d00004104710d0041012101200028021841d79ec00041012000411c6a28020028020c1100000d010b2002280208220128021841d89ec00041012001411c6a28020028020c11000021010b200220013a00100b200241206a2400200141ff01714100470b1c00200128021841a5b2c700410f2001411c6a28020028020c1100000b970301067f230041d0006b22022400200241aed3c500410f10fb01200241106a4198e9c500410c10fb0120022001370330200241386a200241306a410810a202200241c0006a410c6a200241306a41086a3602002002200241386a41086a3602442002200241306a3602482002200241386a360240200241206a200241c0006a1073024002402002280228220341206a2204417f4c0d000240024020040d0041012105410021040c010b200410242205450d020b20002005360200200041086a220541003602002000200436020420004100411010c9012000280200200528020022046a220620022900003700002005200441106a2204360200200641086a200241086a29000037000020002004411010c9012000280200200528020022046a220620022900103700002005200441106a2207360200200641086a200241106a41086a2900003700002002280220210420002007200310c9012000280200200528020022006a2004200310cf061a2005200020036a36020002402002280224450d00200410260b200241d0006a24000f0b1034000b1033000b3001017f0240200128020022022001280204470d00200041003602000f0b2001200241c0016a3602002000200210c8030b290020004101360204200041086a200128020420012802006b41c0016e2201360200200020013602000bf60902087f017e230041f0006b22052400200541e8006a22064200370300200541e0006a22074200370300200541d0006a41086a2208420037030020054200370350200541c0006a41aed3c500410f10fb012008200541c0006a41086a220929000037030020052005290040370350200541c0006a41bdd3c500410d10fb012006200929000037030020072005290040370300200541186a200541d0006a412041d4c0c7004100410010810202400240024020052802184101460d0020064200370300200742003703002008420037030020054200370350200541d0006a41808cc700410610fb01200541206a41ea93c400410610fb012006200541206a41086a29000037030020072005290020370300200541106a200541d0006a41201089022005280214410020052802101b2106024020034101470d00200541e8006a220a4200370300200541e0006a220b4200370300200541d0006a41086a2208420037030020054200370350200541c0006a41aed3c500410f10fb012008200541c0006a41086a220929000037030020052005290040370350200541c0006a41ccd8c500410a10fb01200741086a220c200929000037000020072005290040370000200541086a200541d0006a412010890202402005280208450d00200528020c20064d0d002000410410e8020c030b200a4200370300200b42003703002008420037030020054200370350200541c0006a41aed3c500410f10fb012008200929000037030020052005290040370350200541c0006a41ccd8c500410a10fb01200c2009290000370000200720052900403700002005200241017420066a360220200541d0006a4120200541206a410410b3010b200541206a41186a2004360200200541206a41106a2208200141086a28020036020020052002360224200520063602202005200336023420052001290200370328200541d0006a41186a4200370300200541d0006a41106a4200370300200541d0006a41086a2201420037030020054200370350200541c0006a41aed3c500410f10fb012001200541c0006a41086a220929000037030020052005290040370350200541c0006a41bdd3c500410d10fb01200741086a2009290000370000200720052900403700002005410036024820054201370340200541c0006a41004104106d2005280240200528024822076a20063600002005200741046a2207360248200541c0006a20074104106d2005280240200528024822076a20023600002005200741046a36024820052802282109200541c0006a2008280200220710a10102402007450d002009200741286c6a210820052802482106200921070340200541c0006a20064120106d2005280240200528024822016a22062007290000370000200641086a200741086a290000370000200641106a200741106a290000370000200641186a200741186a2900003700002005200141206a2206360248200741206a290300210d200541c0006a20064108106d2005280240200528024822066a200d3700002005200641086a22063602482008200741286a2207470d000b0b200541c0006a200541346a10af01200541d0006a412020052802402207200528024810b30102402005280244450d00200710260b02402005412c6a2802002207450d00200741286c450d00200910260b200041043a00000c020b2000410310e8020b200141046a2802002207450d00200741286c450d00200128020010260b200541f0006a24000b8d0402057f037e230041d0016b2202240002400240200128020022032001280204470d00200041003602000c010b2001200341c0016a3602002002200341206a41e2c289ab0610c703200228020421042002280200210541002101200241003a0088010240024002400240034020042001460d01200241e8006a20016a200520016a2d00003a00002002200141016a22063a0088012006210120064120460d020c000b0b200141ff0171450d01200241003a0088010c010b20024190016a41086a2201200241e8006a41086a29030037030020024190016a41106a2204200241e8006a41106a29030037030020024190016a41186a2205200241e8006a41186a2903003703002002200229036837039001200641ff0171411f4d0d00200241c8006a41186a20052903002207370300200241286a41086a20012903002208370300200241286a41106a20042903002209370300200241286a41186a2007370300200241086a41186a2007370300200241086a41106a2009370300200241086a41086a200837030020022002290390012207370328200220073703080c010b200241106a4200370300200241186a4200370300200241206a4200370300200242003703080b20002003360200200020022903083700042000410c6a200241106a290300370000200041146a200241186a2903003700002000411c6a200241206a2903003700000b200241d0016a24000bae0402067f047e230041a0016b220224002002412036020420022001360200200241086a2001412010820202400240200228020822030d00200041003a00000c010b200241106a2802002104200228020c210541002101200241003a005820032106024002400240034020042001460d01200241386a20016a20062d00003a00002002200141016a22073a0058200641016a21062007210120074120470d000b20024180016a41186a2201200241386a41186a29030037030020024180016a41106a2206200241386a41106a29030037030020024180016a41086a2204200241386a41086a2903003703002002200229033837038001200741ff01714120490d01200241e0006a41186a20012903002208370300200241186a41086a20042903002209370300200241186a41106a2006290300220a370300200241186a41186a20083703002002200229038001220b370318200041196a2008370000200041116a200a370000200041096a20093700002000200b370001410121010c020b200141ff0171450d00200241003a00580b41002101200241003602880120024201370380012002410e36026420022002360260200220024180016a360218200241cc006a41013602002002420137023c2002418c8dc6003602382002200241e0006a360248200241186a41c4e1c000200241386a10351a200228028001200228028801108402200228028401450d0020022802800110260b200020013a00002005450d00200310260b200241a0016a24000b3001017f0240200128020022022001280204470d00200041003602000f0b2001200241c0016a3602002000200210c6030b8d0402057f037e230041d0016b2202240002400240200128020022032001280204470d00200041003602000c010b2001200341c0016a3602002002200341206a41f0c2c98b0610c703200228020421042002280200210541002101200241003a0088010240024002400240034020042001460d01200241e8006a20016a200520016a2d00003a00002002200141016a22063a0088012006210120064120460d020c000b0b200141ff0171450d01200241003a0088010c010b20024190016a41086a2201200241e8006a41086a29030037030020024190016a41106a2204200241e8006a41106a29030037030020024190016a41186a2205200241e8006a41186a2903003703002002200229036837039001200641ff0171411f4d0d00200241c8006a41186a20052903002207370300200241286a41086a20012903002208370300200241286a41106a20042903002209370300200241286a41186a2007370300200241086a41186a2007370300200241086a41106a2009370300200241086a41086a200837030020022002290390012207370328200220073703080c010b200241106a4200370300200241186a4200370300200241206a4200370300200242003703080b20002003360200200020022903083700042000410c6a200241106a290300370000200041146a200241186a2903003700002000411c6a200241206a2903003700000b200241d0016a24000b8d0402057f037e230041d0016b2202240002400240200128020022032001280204470d00200041003602000c010b2001200341c0016a3602002002200341206a41e1ea91cb0610c703200228020421042002280200210541002101200241003a0088010240024002400240034020042001460d01200241e8006a20016a200520016a2d00003a00002002200141016a22063a0088012006210120064120460d020c000b0b200141ff0171450d01200241003a0088010c010b20024190016a41086a2201200241e8006a41086a29030037030020024190016a41106a2204200241e8006a41106a29030037030020024190016a41186a2205200241e8006a41186a2903003703002002200229036837039001200641ff0171411f4d0d00200241c8006a41186a20052903002207370300200241286a41086a20012903002208370300200241286a41106a20042903002209370300200241286a41186a2007370300200241086a41186a2007370300200241086a41106a2009370300200241086a41086a200837030020022002290390012207370328200220073703080c010b200241106a4200370300200241186a4200370300200241206a4200370300200242003703080b20002003360200200020022903083700042000410c6a200241106a290300370000200041146a200241186a2903003700002000411c6a200241206a2903003700000b200241d0016a24000b1300200041033602042000419cdac5003602000b3400200041aed3c50036020420004100360200200041146a4106360200200041106a4194e3c500360200200041086a420f3702000b4901017f02404108102422020d001033000b2000420837020420002002360200200041004108106d2000280200200041086a220028020022026a42003700002000200241086a3602000b0d0020004100200020001088020b130020004101360204200041ccedc5003602000b3400200041d18cc70036020420004100360200200041146a4104360200200041106a4198f2c500360200200041086a42083702000bb80807017f017e0a7f017e017f017e0e7f230041e0016b2202240020012903002103200241c0016a41086a2204200141246a290200370300200241c0016a41106a22052001412c6a290200370300200241c0016a41186a2206200141346a29020037030020024180016a41086a2207200141c4006a29020037030020024180016a41106a2208200141cc006a29020037030020024180016a41186a2209200141d4006a29020037030020024180016a41206a220a200141dc006a29020037030020024180016a41286a220b200141e4006a29020037030020024180016a41306a220c200141ec006a29020037030020024180016a41386a220d200141f4006a29020037030020022001411c6a2902003703c00120022001413c6a29020037038001200141106a290300210e200141186a280200210f20012903082110200241e0006a41186a221120014198016a290200370300200241e0006a41106a221220014190016a290200370300200241e0006a41086a221320014188016a290200370300200241206a41386a2214200141d8016a290200370300200241206a41306a2215200141d0016a290200370300200241206a41286a2216200141c8016a290200370300200241206a41206a2217200141c0016a290200370300200241206a41186a2218200141b8016a290200370300200241206a41106a2219200141b0016a290200370300200241206a41086a221a200141a8016a290200370300200220014180016a2902003703602002200141a0016a290200370320200141fc006a280200211b200241186a221c200141f8016a290300370300200241106a221d200141f0016a290300370300200241086a221e200141e8016a2903003703002002200141e0016a290300370300200041186a200f360200200041106a200e3703002000201037030820002003370300200041346a20062903003702002000412c6a2005290300370200200041246a2004290300370200200020022903c00137021c200041f4006a200d290300370200200041ec006a200c290300370200200041e4006a200b290300370200200041dc006a200a290300370200200041d4006a2009290300370200200041cc006a2008290300370200200041c4006a2007290300370200200020022903800137023c2000201b36027c20004198016a201129030037020020004190016a201229030037020020004188016a201329030037020020004180016a2002290360370200200041d8016a2014290300370200200041d0016a2015290300370200200041c8016a2016290300370200200041c0016a2017290300370200200041b8016a2018290300370200200041b0016a2019290300370200200041a8016a201a290300370200200041a0016a2002290320370200200041f8016a201c290300370300200041f0016a201d290300370300200041e8016a201e290300370300200041e0016a2002290300370300200241e0016a24000bcb0101047f024002400240024020012802042202450d00200128020022032d0000210420012002417f6a22053602042001200341016a360200200441014b0d0120040e020203020b200041023602000f0b200041023602000f0b200041003602000f0b024020054104490d002003280001210520012002417b6a22043602042001200341056a36020020044104490d002000200536020420004101360200200328000521042001200241776a3602042001200341096a360200200041086a20043602000f0b200041023602000b130020004107360204200041ecfec5003602000b130020004102360204200041a085c6003602000bcf380b037f017e027f017e017f017e047f037e017f027e027f230022032104200341e0066b41607122032400200141106a22052903002106200228021021072002280200210820012903002109200341cc046a200141e8016a290000370200200341d4046a200141f0016a290000370200200341dc046a200141f8016a290000370200200341e7e485f3063602c0042003200141e0016a2900003702c404200341b8066a41106a2002280210360200200341b8066a41086a200241086a290200370300200320022902003703b806200341c8006a200341c0046a200341b8066a10ef030240024002400240024020032d00484101470d00200341286a41086a200341d2006a290100370300200341286a41106a200341da006a2901003703002003413f6a200341e1006a2900003700002003200329014a37032820032d0049210a2001290308210b200341c8006a200541f00110cf061a02400240200b4201520d00200341c0046a200341c8006a41f00110cf061a0240200341c0046a410c6a200341b0056a412010d2060d0020032802c80420032802ac05460d070b200341dc066a2202200341c0046a41086a220141206a280200360200200341d4066a2205200141186a290200370200200341cc066a220c200141106a290200370200200341b8066a410c6a220d200141086a290200370200200341013602b806200320012902003702bc06200341b8066a20034190066a220e200341ec046a20032903c004200910d004210f2002200341ac056a220141206a2802003602002005200141186a290200370200200c200141106a290200370200200d200141086a290200370200200341013602b806200320012902003702bc06200341b8066a200e200341d0056a20032903c004200910d0042101200f450d0620010d010c060b200341c0046a200341c8006a41f00110cf061a0240200341c0046a410c6a200341b0056a412010d2060d0020032802c80420032802ac05460d060b200341dc066a2202200341c0046a41086a220141206a280200360200200341d4066a2205200141186a290200370200200341cc066a220c200141106a290200370200200341b8066a410c6a220d200141086a290200370200200341003602b806200320012902003702bc06200341b8066a20034190066a220e200341ec046a20032903c004200910d004210f2002200341ac056a220141206a2802003602002005200141186a290200370200200c200141106a290200370200200d200141086a290200370200200341003602b806200320012902003702bc06200341b8066a200e200341d0056a20032903c004200910d0042101200f450d052001450d050b2009500d01200341c0046a2009427f7c109b05200341206a20032802c004220520032802c8041089022003280224210220032802202101024020032802c404450d00200510260b20014101470d04200341c0046a2009109b05200341186a20032802c004220c20032802c804108902200328021c210520032802182101024020032802c404450d00200c10260b4101210c0c020b410521030c020b200341c0046a4200109b05200341106a20032802c004220220032802c8041089022003280214210520032802102101024020032802c404450d00200210260b4100210c0b20014101470d01200820054b0d010240200820024d4102200c1b22014102460d0020014101710d020b200341003602c002200342013703b802200041206a2d00002108200041186a290000210b2000290008211020002900102111200341b8026a410020002900002212a741ff0171220141014610930120032802c002210520032802b80221022003200b3703d804200320113703d004200320103703c804200320123703c00402402001450d00200220054105746a2101200341c0046a4101722102034020012002290000370000200141176a200241176a290000370000200141106a200241106a290000370000200141086a200241086a2900003700002001411f6a20083a0000200341003a00c004200320033a00c104200320033a00c204200320033a00c304200320033a00c404200320033a00c504200320033a00c604200320033a00c704200320033a00c804200320033a00c904200320033a00ca04200320033a00cb04200320033a00cc04200320033a00cd04200320033a00ce04200320033a00cf04200320033a00d004200320033a00d104200320033a00d204200320033a00d304200320033a00d404200320033a00d504200320033a00d604200320033a00d704200320033a00d804200320033a00d904200320033a00da04200320033a00db04200320033a00dc04200320033a00dd04200320033a00de04200320033a00df04200141206a2101200541016a2105410041ff01710d000b0b200320053602c002200341c8026a41086a22012005360200200320032903b8023703c802200341d8026a41176a2202200341286a41176a290000370000200341d8026a41106a2205200341286a41106a290300370300200341d8026a41086a2208200341286a41086a290300370300200320032903283703d8020240024002400240024002400240412010242200450d002000200a3a0000200020032903d802370001200041096a2008290300370000200041116a2005290300370000200041186a2002290000370000200341f8026a41086a2001280200360200200320032903c8023703f80241002102200341003602b803200342013703b003200341b0036a41004108106d20032802b00320032802b80322016a20093700002003200141086a22013602b803200341b0036a20014108106d20032802b00320032802b80322016a20063700002003200141086a3602b803200341c0046a41fdd4c10010fb02200341c8006a20032802c004220520032802c804109d02200329024c4200200328024822011b210b2001410120011b210c024020032802c404450d00200510260b2003200b4220883e02c4032003200c3602c003200341086a200341c0036a108f01410821054100210820032802080d03200328020c220f20032802c40341306e22012001200f4b1bad42307e2210422088a70d042010a72201417f4c0d040240024020010d004108210d0c010b20011024220d450d060b200341003602d0032003200d3602c8032003200141306e22013602cc034100210e024002400240200f450d0041002113034020032802c40322024108490d0320032802c003220829000021102003200841086a3602c0032003200241786a22013602c40320014108490d03201341016a21132003200241706a220a3602c4032003200841106a3602c0032008290008211141002101200341003a00e0042002416f6a21020340200a2001460d03200341c0046a20016a200820016a220541106a2d00003a00002003200541116a3602c0032003200141016a22053a00e004200320023602c4032002417f6a21022005210120054120470d000b200341c8006a41186a2201200341c0046a41186a290300370300200341c8006a41106a2202200341c0046a41106a290300370300200341c8006a41086a2208200341c0046a41086a290300370300200320032903c004370348200541ff01714120490d03200341f8036a41086a20082903002212370300200341f8036a41106a20022903002214370300200341f8036a41186a20012903002215370300200341d8036a41186a22022015370300200341d8036a41106a22052014370300200341d8036a41086a2208201237030020032003290348221237039804200320123703f803200320123703d8030240200e20032802cc03470d00200341c8036a200e10ea0120032802c803210d20032802d003210e0b200d200e41306c6a2201201137030820012010370300200120032903d803370310200141186a2008290300370300200141206a2005290300370300200141286a20022903003703002003200e41016a220e3602d0032013200f470d000b20032802cc0321010b200e4100200d1b210820014100200d1b2102200d4108200d1b21050c050b200141ff0171450d00200341003a00e0040b20032802cc032201450d02200141306c0d010c020b102c000b200d10260b4100210241082105410021080b200341c0046a41fdd4c100200341b0036a10fc02200341c8006a20032802c004220a20032802c80410a502200329024c4200200328024822011b21102001410120011b2113024020032802c404450d00200a10260b200341a8036a2008360200200341a4036a200236020020034188036a41106a201037030020034188036a41086a200341b0036a41086a280200360200200320032903b00337038803200320053602a00320032013360294030240200ba7450d00200c10260b200041086a290000210b200041106a29000021112000290000211220034198046a41186a200041186a29000037030020034198046a41106a201137030020034198046a41086a200b3703002003201237039804200341003602c804200342013703c004200341c0046a41004108106d20032802c00420032802c80422016a20093700002003200141086a22013602c804200341c0046a20014108106d20032802c004220220032802c80422016a2006370000200341d4046a4100290085d5413702002003200141086a3602c804200341002900fdd4413702cc04200320034198046a3602dc04200341b8066a200341c0046a109401024020032802c404450d00200210260b2010422088210b200341c0046a200341b8066a10fe02200320032802c004220220032802c80441d4c0c7004100410010810220032802002101024020032802c404450d00200210260b200ba7210f0240024020014101470d00410021010c010b200341c8006a41186a220220034198046a41186a290300370300200341c8006a41106a220520034198046a41106a290300370300200341c8006a41086a220820034198046a41086a2903003703002003200329039804370348200341c0046a200341f8026a10c301200341c0046a410c6a220141186a2002290300370000200141106a2005290300370000200141086a200829030037000020012003290348370000200341c8006a200341b8066a10fe02200328024822012003280250200341c0046a10af050240200328024c450d00200110260b024020032802c40441ffffff3f71450d0020032802c00410260b200341c8006a41186a200341b8066a41186a290300370300200341c8006a41106a200341b8066a41106a290300370300200341c8006a41086a200341b8066a41086a290300370300200320032903b80637034820032802a003210d4100210102400240024020032802a803220e41014b0d000240200e0e020002000b200341c0046a41186a200341c8006a41186a290300370300200341c0046a41106a200341c8006a41106a290300370300200341c0046a41086a200341c8006a41086a290300370300200320032903483703c004410021010c020b200e210203400240417f200d2002410176220820016a220a41306c6a220c290300220b200952200b2009541b22050d00417f200c290308220b200652200b2006541b21050b2001200a20054101461b2101200220086b220241014b0d000b0b024002400240417f200d200141306c6a2205290300220b200952200b2009541b22020d0041ff0121022005290308220b2006540d01200b20065221020b2002450d010b2001200241ff017141ff01466a21010b200341c0046a41186a200341c8006a41186a290300370300200341c0046a41106a200341c8006a41106a290300370300200341c0046a41086a200341c8006a41086a290300370300200320032903483703c004200e20014f0d002001200e103b000b0240200e20032802a403470d0020034188036a41186a200e10ea01200328029c03210f20032802a003210d0b200d200141306c6a220241306a2002200e20016b41306c10d0061a2002200637030820022009370300200220032903c004370310200241186a200341c0046a41086a2205290300370300200241206a200341c0046a41106a2208290300370300200241286a200341c0046a41186a220a290300370300410121012003200e41016a3602a803200a200341c8006a41186a2903003703002008200341c8006a41106a2903003703002005200341c8006a41086a290300370300200320032903483703c0040240200f200328029803470d0020034188036a410c6a200f4101109301200328029c03210f0b2003280294032213200f4105746a220220032903c004370000200241186a200a290300370000200241106a2008290300370000200241086a20052903003700002003200f41016a220f36029c030b20001026024020010d000240200328028c03450d0020032802880310260b024020032802980341ffffff3f71450d00201310260b024020032802a4032201450d00200141306c450d0020032802a00310260b024020032802fc0241ffffff3f71450d0020032802f80210260b2004240041070f0b024002400240200f450d00200f4105742100200341c0046a4104722101201321020340200341f8036a200210fe02200341c0046a20032802f803220820032802800410b005200341c8006a41086a220a200141086a290200370300200341c8006a41106a220c200141106a290200370300200341c8006a41186a220d200141186a290200370300200341c8006a41206a220e200141206a290200370300200320012902003703480240024020032802c00422050d00410021050c010b200341b8066a41206a200e290300370300200341b8066a41186a200d290300370300200341b8066a41106a200c290300370300200341b8066a41086a200a290300370300200320032903483703b8060b024020032802fc03450d00200810260b20050d02200241206a2102200041606a22000d000b0b410421164100210f410021080c010b20034198046a41206a2201200341b8066a41206a29030037030020034198046a41186a2208200341b8066a41186a29030037030020034198046a41106a220a200341b8066a41106a29030037030020034198046a41086a220c200341b8066a41086a290300370300200320032903b80637039804412c10242216450d022016200536020020162003290398043702042016410c6a200c290300370200201641146a200a2903003702002016411c6a2008290300370200201641246a200129030037020020034281808080103702dc03200320163602d8030240024020004120470d004101210f0c010b200241206a21082013200f4105746a220e41606a2113200341c0046a41047221014101210f0340200821020340200341f8036a200210fe02200341c0046a20032802f803220020032802800410b005200341c8006a41086a2208200141086a290200370300200341c8006a41106a220a200141106a290200370300200341c8006a41186a220c200141186a290200370300200341c8006a41206a220d200141206a290200370300200320012902003703480240024020032802c00422050d00410021050c010b200341b8066a41206a200d290300370300200341b8066a41186a200c290300370300200341b8066a41106a200a290300370300200341b8066a41086a2008290300370300200320032903483703b8060b024020032802fc03450d00200010260b024020050d00200e200241206a2202470d010c030b0b20034198046a41206a200341b8066a41206a290300220b37030020034198046a41186a200341b8066a41186a290300221037030020034198046a41106a200341b8066a41106a290300221137030020034198046a41086a200341b8066a41086a2903002212370300200320032903b806221437039804200341c0046a41206a220a200b370300200341c0046a41186a220c2010370300200341c0046a41106a220d2011370300200341c0046a41086a22172012370300200320143703c0040240200f20032802dc03470d00200341d8036a200f10ee0120032802d80321160b200241206a21082016200f412c6c6a22002005360200200020032903c0043702042000410c6a2017290300370200200041146a200d2903003702002000411c6a200c290300370200200041246a200a2903003702002003200f41016a220f3602e00320132002470d000b0b20032802dc0321080b200341c0046a41206a20034188036a41206a2802002201360200200341c0046a41186a20034188036a41186a290300220b370300200341c0046a41106a20034188036a41106a290300370300200341c0046a41086a20034188036a41086a29030037030020032003290388033703c004200141306c4104722202417f4c0d00200210242205450d01200ba72100200341003602c006200320023602bc06200320053602b806200341b8066a200110a10102402001450d002000200141306c6a21052000210103402001290300210b200341b8066a20032802c0064108106d20032802b80620032802c00622026a200b3700002003200241086a22023602c006200141086a290300210b200341b8066a20024108106d20032802b80620032802c00622026a200b3700002003200241086a3602c0062003200341b8066a360248200141106a200341c8006a109c01200141306a22012005470d000b0b200341c8006a41fdd4c10010fb02200328024822012003280250200341b8066a1099020240200328024c450d00200110260b024020032802bc06450d0020032802b80610260b200341c8006a41fdd4c100200341c0046a10fc02200328024822012003280250200341cc046a10b1050240200328024c450d00200110260b024020032802c404450d0020032802c00410260b0240200341d0046a28020041ffffff3f71450d0020032802cc0410260b0240200341dc046a2802002201450d00200141306c450d00200010260b024020032802fc0241ffffff3f71450d0020032802f80210260b024020160d002004240041070f0b20074101200741014b1b2201418094ebdc036e2001418094ebdc03704100476a22024101200241014b1b220220014b0d02200341003602a004200342043703980420034198046a4100200f10e7012001200f41036c220520012005491b20026ead428094ebdc037e200120026ead8042ffffffff0f83220b200b7e220b42808090bbbad6adf00d200b42808090bbbad6adf00d541b428094ebdc0380210b20032802a00421000240200f450d00200ba7210520032802980420004102746a2101200f2102034020012005360200200141046a21012002417f6a22020d000b200f20006a21000b200320003602a004200341003602c006200342013703b806200341b8066a41004108106d20032802b80620032802c00622016a20093700002003200141086a22013602c006200341b8066a20014108106d20032802b80620032802c00622016a2006370000200341cc066a4100290085d5413702002003200141086a3602c006200341002900fdd4413702c406200341e3006a200341b8066a41186a280200360000200341db006a200341b8066a41106a290300370000200341d3006a20032903c006370000200320032903b80637004b200341c9046a200341c8006a41086a290000370000200341d1046a200341c8006a41106a290000370000200341c0046a41186a200341df006a290000370000200341e0046a41013a0000200341033a00c004200320032900483700c104200341c0046a1087020240200328029c0441ffffffff0371450d0020032802980410260b0240200f450d00200f412c6c21012016210303400240200341046a28020041ffffff3f71450d00200328020010260b2003412c6a2103200141546a22010d000b0b410821032008450d032008412c6c450d03201610262004240041080f0b1034000b1033000b41b0b2c200411941ccb2c200102f000b2004240020030f0b2004240041060bc00201057f230041106b220324002003410036020820034201370300200341004120106d2003280200200328020822046a2205200229000c370000200541086a200241146a290000370000200541106a2002411c6a290000370000200541186a200241246a2900003700002003200441206a3602082002280200210520032002280208220210a1010240024020020d0020032802002106200328020821020c010b20024105742104200328020821020340200320024120106d20032802002206200328020822076a22022005290000370000200241086a200541086a290000370000200241106a200541106a290000370000200241186a200541186a2900003700002003200741206a2202360208200541206a2105200441606a22040d000b0b200020012006200210b30102402003280204450d00200610260b200341106a24000bcd0502057f047e230041d0016b220324002003200236020c20032001360208200341106a2001200210820202400240200328021022040d00200041003602000c010b200328021421052003200341186a28020022063602442003200436024041002101200341003a0088012006417f6a2102024002400240034020062001460d01200341e8006a20016a200420016a22072d00003a00002003200741016a3602402003200141016a22073a008801200320023602442002417f6a21022007210120074120470d000b200341b0016a41186a2201200341e8006a41186a290300370300200341b0016a41106a2202200341e8006a41106a290300370300200341b0016a41086a2206200341e8006a41086a290300370300200320032903683703b001200741ff01714120490d01200341c8006a41086a2006290300370300200341c8006a41106a2002290300370300200341c8006a41186a2001290300370300200320032903b001370348200341e8006a200341c0006a10920120032802682201450d01200341206a41086a200341c8006a41086a2903002208370300200341206a41106a200341c8006a41106a2903002209370300200341206a41186a200341c8006a41186a290300220a37030020032003290348220b3703202000200329026c370204200020013602002000410c6a200b370200200041146a20083702002000411c6a2009370200200041246a200a3702000c020b200141ff0171450d00200341003a0088010b200341003602b801200342013703b0012003410e360294012003200341086a360290012003200341b0016a360248200341fc006a41013602002003420137026c2003418c8dc600360268200320034190016a360278200341c8006a41c4e1c000200341e8006a10351a20032802b00120032802b801108402024020032802b401450d0020032802b00110260b200041003602000b2005450d00200410260b200341d0016a24000bb70101047f230041106b2203240002400240200228020822044105744104722205417f4c0d0020022802002102200510242206450d012003410036020820032005360204200320063602002003200410a10102402004450d002004410574210403402003200336020c20022003410c6a109c01200241206a2102200441606a22040d000b0b200020012003280200200328020810b30102402003280204450d00200328020010260b200341106a24000f0b1034000b1033000bda0401057f230041106b22022400200241003a0005024002400240024020012802002203280204220420044100472205490d00200241056a20032802002206200510cf061a2003200420056b3602042003200620056a360200024020040d00410021040c030b02400240024020022d0005220441037122034103460d000240024020030e03070001070b200241003b0106200220043a00064101210420012802002201280204220320034100472205490d05200241066a41017220012802002204200510cf0621062001200320056b3602042001200420056a360200024020030d00200620056a41003a00000b20022f0106220441ff014d0d0420044102762103410021040c070b20024100360208200220043a0008200241086a4101722001280200220428020020042802042203410320034103491b220310cf062101200428020422052003490d012004200520036b3602042004200428020020036a360200024020034103732204450d00200120036a4100200410d1061a0b2002280208220341808004492104200341027621030c060b200441034b0d022002410036020c2002410c6a2001280200220328020020032802042204410420044104491b220410cf061a200328020422052004490d012003200520046b3602042003200328020020046a360200024020044104460d002002410c6a20046a4100410420046b10d1061a0b200228020c22034180808080044921040c050b2003200541b8afc0001048000b2004200541b8afc0001048000b410121040b0c010b20044102762103410021040b2000200336020420002004360200200241106a24000bdc0504067f017e027f027e230041206b220224000240024020012802042203450d00200128020022042d0000210520012003417f6a22063602042001200441016a360200024002400240200541037122074103460d0002400240024020070e03000102000b2005410276ad21080c040b410121072006450d0220042d0001210620012003417e6a3602042001200441026a3602002006410874200572220141ffff0371418002490d02200141fcff0371410276ad21080c030b4101210720064103490d01200441036a2d0000210620042f0001210920012003417c6a3602042001200441046a3602002009200641107472410874200572220141808004490d012001410276ad21080c020b02402005410276220a410c4b0d00024002400240200a0e0d00030303010303030303030302000b20064104490d052004350001210820012003417b6a3602042001200441056a36020020084280808080045421074200210b0c060b20064108490d04200429000121082001200341776a3602042001200441096a3602002008428080808080808080015421074200210b0c050b20064110490d03200441096a290000210b2004290001210820012003416f6a3602042001200441116a360200200b428080808080808080015421070c040b200541334b0d02200a41046a21062003417e6a2103200441026a21044100210541012107200241186a2109420021084200210b03402003417f460d01200241106a2004417f6a3100004200200541037441f8007110cd0620012003360204200120043602002003417f6a2103200441016a21042009290300200b84210b20022903102008842108200541016a220541ff01712006490d000b2002427f427f41e800200a4103746b41f8007110d4062008200229030058200b200241086a290300220c58200b200c511b21070c030b0c020b4200210b410021070c010b410121070b20002008370308200041106a200b37030020002007ad370300200241206a24000b860b04087f017e017f037e230041a0026b22022400200241086a2001108d01024002402002280208450d00200041013602000c010b200228020c21032001200128020441016a22043602042002200136021002400240024002400240200420012802084b0d00200241003a00172002410036022020024100360218200241186a41086a21050240024002400240024020030d00200241c0006a41086a200528020036020020022002290318370340200241c0006a21010c010b2003417f6a2106200241c0006a41027221070340200241003a0048200128020022042802042203450d07200428020022082d0000210920042003417f6a3602042004200841016a360200200241013a0048200220093a0040200128020022042802042203450d06200428020022082d0000210920042003417f6a3602042004200841016a360200200241023a0048200220093a0041200128020022042802042203450d06200428020022082d0000210920042003417f6a3602042004200841016a360200200241033a0048200220093a0042200128020022042802042203450d06200428020022082d0000210920042003417f6a3602042004200841016a360200200241043a0048200220093a0043200128020022042802042203450d06200428020022082d0000210920042003417f6a3602042004200841016a360200200241053a0048200220093a0044200128020022042802042203450d06200428020022082d0000210920042003417f6a3602042004200841016a360200200241063a0048200220093a0045200128020022042802042203450d06200428020022082d0000210920042003417f6a3602042004200841016a360200200241073a0048200220093a0046200128020022042802042203450d06200428020022082d0000210920042003417f6a3602042004200841016a360200200220093a00472002290340210a20022001108d0120022802000d0720012802002203280204220820022802042204490d072004417f4c0d020240024020040d004100210b410121090c010b2004102a2209450d042001280200220328020421082004210b0b0240024020082004490d0020092003280200200410cf0621082003280204220120044f0d012004200141b8afc0001048000b200b450d08200910260c080b2003200120046b3602042003200328020020046a3602002008450d072002200a3703280240024020022802182201450d00200228021c21030c010b2007410041de0110d1061a41e40110242201450d054100210320014100360200200141046a200241c0006a41e00110cf061a2002410036021c200220013602180b2004ad422086200bad84210c20022001360234200220033602302002200241186a360238200241c0006a200241306a200241286a10a6030240024020022802404101470d002002290244210d200229024c210e2002200a370254200220053602502002200e3703482002200d3703402002200c37023420022008360230200241c0006a200241306a10a7030c010b20022802482002280250410c6c6a220141e4006a220428020021032004200c370200200141e0006a22042802002101200420083602002001450d002003450d00200110260b02402006450d002006417f6a2106200228021021010c010b0b20022d00172101200241c0006a41086a200241186a41086a2802003602002002200229031837034020010d07200241c0006a21010b200020012902003702042000410c6a200141086a280200360200410021010c070b1034000b1033000b102c000b200041013602000c040b200241003a00480b200241013a0017200241c0006a41086a200241186a41086a280200360200200220022903183703400b200241c0006a10a503410121010b20002001360200200228021022012001280204417f6a3602040b200241a0026a24000bea0a02097f027e230041a0016b22012400200141186a200010b605200141c0006a22024200370300200141286a41106a22034200370300200141286a41086a2204420037030020014200370328200141c8006a41808cc700410610fb012004200141c8006a41086a220529000037030020012001290048370328200141c8006a41bcbfc400411210fb0120022005290000370300200320012900483703002001412036025c2001200141286a360258200141e0006a200141286a41201082020240024002400240200128026022020d00410221040c010b200128026421052001200141e0006a41086a28020036027420012002360270200141106a200141f0006a108f0102400240024020012802100d00200141086a200141f0006a108f0120012802080d0020012802742204200128020c2206490d002006417f4c0d040240024020060d0041002107410121080c010b2006102a2208450d0620012802742104200621070b0240024020042006490d0020082001280270200610cf0621042001280274220920064f0d012006200941b8afc0001048000b2007450d01200810260c010b2001200920066b3602742001200128027020066a36027020040d010b20014100360250200142013703482001410e36027c2001200141d8006a3602782001200141c8006a360284012001419c016a41013602002001420137028c012001418c8dc600360288012001200141f8006a3602980120014184016a41c4e1c00020014188016a10351a200128024820012802501084020240200128024c450d00200128024810260b410221040c010b410121040b2005450d00200210260b200041d0006a2102200041106a21050240024020044102460d0041012104024020064106470d000240200841a88ac700470d00410021040c010b41a88ac7002008410610d20641004721040b02402007450d00200810260b2004450d010b20014194016a41002902f089473702002001410036028801200141002902e8894737028c01200141c0006a4200370300200141386a4200370300200141286a41086a2204420037030020014200370328200141c8006a41808cc700410610fb012004200141c8006a41086a220629000037030020012001290048370328200141c8006a41bcbfc400411210fb01200341086a2006290000370000200320012900483700002001410036025020014201370348200141c8006a41004101106d2001280248200128025022046a41003a00002001200441016a360250200141c8006a20014188016a41047210a301200141286a412020012802482204200128025010b3010240200128024c450d00200410260b420010c7040b200028020020052002200141186a410110b304427f200028020010dc03220a4280e497d0127c220b200b200a541b10c704200141c0006a4200370300200141386a4200370300200141286a41086a2200420037030020014200370328200141c8006a41808cc700410610fb012000200141c8006a41086a220229000037030020012001290048370328200141c8006a41fcbfc400410e10fb01200341086a200229000037000020032001290048370000200141286a4100410010b40420012802182104024020012802202200450d00200041246c21032004210003400240024020002d0000220241044b0d0002400240024020020e050400010204040b2000410c6a280200450d03200041086a28020010260c030b2000410c6a280200450d02200041086a28020010260c020b2000410c6a280200450d01200041086a28020010260c010b200041086a280200450d00200041046a28020010260b200041246a21002003415c6a22030d000b0b0240200128021c2200450d00200041246c450d00200410260b200141a0016a24000f0b1034000b1033000bfa02010b7f230041c0006b2202240041002103200041003602082000420437020002402001410c6a28020041246c2204450d0020012802042101410421050340024020012d00004101470d00200141016a2800002106200241206a200141086a10c80120022006360218200220022802283602042002280220210720022802242108200241206a41086a2209200241046a41086a290200370300200241206a41106a220a200241046a41106a280200360200200220063602382002200228001b36003b2002200229020437032002402003200041046a280200470d0020002003410110d10120002802082103200028020021050b2005200341246c6a220641013a00002002280238210b200228003b210c2006200836020c20062007360208200641046a200c3600002006200b36000120062002290320370210200641186a2009290300370200200641206a200a2802003602002000200341016a22033602080b200141246a21012004415c6a22040d000b0b200241c0006a24000be50905047f017e047f047e047f230041f0096b2204240020044198066a200141c80310cf061a20044190036a20044198066a10ed04410121050240024002400240024020042d0090034101460d00200441106a20044190036a41086a220641800310cf061a024020032802002201450d00200441086a41da93c4004110108902200428020c2105200428020821072006200341086a280200360200200420032902003703900320044198066a2005410020071b10b904200428029806220520042802a00620044190036a1099020240200428029c06450d00200510260b0240200428029403450d0020042802900310260b410021050b200441e0096a200441e0006a10a10320044198066a200441106a41800310cf061a20044190036a20044198066a20042903e009220820042d00e80920042d00e909200210ea03024020042d0090034101460d00200441ba036a2d00002107200441b9036a2d00002109200441b8036a2d00002102200441bb036a2d0000210a200441bc036a280200210b200441c0036a280200210c2008200441a8036a290300220d200d2008561b200820044190036a41106a290300220e4201511b210820042903e809210f0240200629030022104201520d00200441b0036a2d000021114198b2c700410d1084020240024002400240024020020e0403000102030b418ab2c700410e1084020c030b4180b2c700410a1084020c020b2009ad42ff018310f2032007ad42ff018310f203200b450d010b200b200c1084020b4197cbc100410a10840241869fc000410e10840202400240200e4201510d0041fc9ec000410a1084020c010b200d10f2030b41f39ec0004109108402410121060240201141ff01714101470d0041f19ec00041021084020c050b41ee9ec00041031084020c040b2008422088a721122008a7211341002106200f21080c040b200020042f00910320042d0093034110747222023b0001200041013a0000200041036a20024110763a000020054521000c010b200020042f0091033b0001200041013a0000200041036a20042d0093033a000020032802002101410021000b20000d022001450d02200341046a280200450d02200110260c020b200b2113200c21120b20044198066a41086a221420063a0000200441a1066a20042f0090033b0000200441b8066a200f370300200441b0066a22062008370300200441a7066a200a3a000020044198066a410e6a20073a0000200441a5066a20093a000020044198066a410c6a20023a0000200441a3066a20044192036a2d00003a000020044198066a41106a22112012ad4220862013ad84370300200441003a00980620044198066a108702200441da93c40041101089022004200428020441016a410120042802001b22133602980641da93c400411020044198066a410410b301200642003703002011420037030020144200370300200442003703980620044198066a41808cc700410610fb0120044190036a41fcbfc400410e10fb01200620044190036a41086a290000370300201120042900900337030020044198066a4100201310b4042000410c6a200c360000200041086a200b360000200041076a200a3a0000200041066a20073a0000200041056a20093a0000200041046a41042002410420104201511b200e4202511b3a0000200041003a00002005450d002001450d00200341046a280200450d00200110260b200441f0096a24000b990101057f0240200028020022020d0041000f0b200028020421030340200241086a210420022f010621054100210002400240034020052000460d0120012004410810d2062206450d02200041016a2100200441086a21042006417f4a0d000b2000417f6a21050b024020030d0041000f0b2003417f6a2103200220054102746a41e4016a28020021020c010b0b20022000410c6c6a41e0006a0bb83205077f017e017f0b7e0b7f230022062107200641e0086b41607122062400024002400240024020022d00004101470d00200641b8036a200241196a290000370300200641b0036a200241116a290000370300200641a8036a200241096a290000370300200620022900013703a003200328020822084101762102200328020421092003280200210a024002402008410171450d0020092002490d03200220094f0d01200a20026a2d00004170712109410121080c040b024020092002490d00410021080c040b2002200941a8bcc7001047000b2002200941b8bcc7001032000b200241046a28020021020c020b200220094198bcc7001047000b200141c0006a280200210b200128023c210c200641e9046a20093a0000200620083a00e804200620023602e4042006200a3602e004200620062f01c8073b01ea0420064188086a200c200641a0036a200641e0046a200b28020c11040002400240024020062802880822090d00200641f0056a2201200641ab036a290000370300200641e8056a41106a2203200641b3036a290000370300200641fd056a2209200641b8036a290000370000200620062900a3033703e80520062d00a203210520062f01a003210a4130102422020d01102c000b200629028c08210d200641c0046a41186a200641a0036a41186a2208290300370300200641c0046a41106a200641a0036a41106a220b290300370300200641c0046a41086a200641a0036a41086a220c290300370300200620062903a0033703c004200641e0046a200641c0046a2009200d422088a7200141206a220e10ba0520062802e404210220062802e004210a20064188086a200641e0046a41086a41d40010cf061a0240200a4101470d00200da7450d02200910260c020b200641e0036a20064188086a41d40010cf061a200620023602840520064188056a200641e0036a41d40010cf061a200641f9046a2008290300370000200641f1046a200b290300370000200641e9046a200c290300370000200641013a00e004200620062903a0033700e104200e200641e0046a1087042102200da7450d02200910260c020b2002200a20054110747222053b0001200241013a0000200220062903e805370004200220062900e004370021200241036a20054110763a00002002410c6a2001290300370000200241146a2003290300370000200241196a2009290000370000200241286a200641e7046a2900003700000b20004101360200200020023602040240200441046a280200450d00200428020010260b200724000f0b0240200141386a220b28020022092009417f6a2208200141306a220a28020022092001412c6a220c2802006b716b4101470d00200c108604200b280200417f6a2108200a28020021090b200a2008200941016a71360200200141346a28020020094102746a20023602000240024002400240024002400240200141286a280200220920024d0d00200141206a220a280200200241fc006c6a2202290210210f200220062903f00437021020022902082110200220062903e804370208200241186a22092902002111200920062903f804370200200641003a00e004200641003602e4042002290200210d200220062903e00437020020022902402112200241c8006a2902002113200241d0006a2902002114200241d8006a290200211520022902202116200241286a2902002117200241306a2902002118200241386a290200211920064180036a41086a2209200241e8006a29020037030020064180036a41106a2208200241f0006a29020037030020064180036a41186a220b200241f8006a280200360200200620113703f8032006200f3703f003200620103703e8032006200d3703e003200620193703d804200620183703d004200620173703c804200620163703c004200620153703b803200620143703b003200620133703a803200620123703a0032006200229026037038003200641d0036a41086a2202200441086a280200360200200620042902003703d0030240024002400240024002400240200da7220c41ff01714101470d002003280200210e2003280204211a2003280208210420064188076a41186a20062802fc0336020020064188076a41106a20062902f40337030020064188076a41086a20062902ec03370300200620062902e40337038807200641bc086a2015370200200641b4086a201437020020064188086a41246a2013370200200641a4086a201237020020064188086a41186a20062802dc0436020020064188086a41106a20062902d40437030020064188086a41086a20062902cc04370300200620062902c4043703880820064188086a413c6a20062903800337020020064188086a41c4006a2009290300370200200641d4086a2008290300370200200641dc086a200b280200360200200641e8056a41086a2002280200360200200620062903d0033703e805200641e0046a200120064188086a2003200641e8056a200510bb0520062802e404210220062802e0044101460d06200d420888a721052016a72108200641e8076a41186a220b20064180056a280200360200200641e8076a41106a221b200641e0046a41186a290300370300200641e8076a41086a221c200641e0046a41106a221d290300370300200641c8076a41086a221e2006418d056a290000370300200641c8076a41106a221f20064195056a290000370300200641c8076a41176a2220200641e0046a413c6a29000037000020062006290085053703c8072006200641e0046a41086a22212903003703e807200641e0046a41246a2d00002103200641a8076a41086a2222200641ad056a290000370300200641a8076a41106a2223200641b5056a290000370300200641a8076a41176a2224200641bc056a280000360000200620062900a5053703a807200641e0046a41c4006a2d0000210920020e03030201030b200641bc086a2019370200200641b4086a201837020020064188086a41246a2017370200200641a4086a201637020020064188086a41186a20062802fc0336020020064188086a41106a20062902f40337030020064188086a41086a20062902ec0337030020064188086a413c6a20062903a00337020020064188086a41c4006a20062903a803370200200641d4086a20062903b003370200200641dc086a20062802b803360200200620062902e4033703880820064188076a41086a2002280200360200200620062903d00337038807200641e0046a200120064188086a200320064188076a200510bb0520062802e404210220062802e0044101460d05200641e8056a41186a220920064180056a280200360200200641e8056a41106a2208200641e0046a41186a290300370300200641e8056a41086a220b200641e0046a41106a290300370300200641c8076a41086a220e2006418d056a290000370300200641c8076a41106a221a20064195056a290000370300200641c8076a41176a221b200641e0046a413c6a29000037000020062006290085053703c8072006200641e0046a41086a2903003703e805200641e0046a41246a2d00002103200641e8076a41086a221c200641ad056a290000370300200641e8076a41106a221d200641b5056a290000370300200641e8076a41176a221e200641bc056a280000360000200620062900a5053703e807200641e0046a41c4006a2d0000210541022101024020020e03000405000b200641e8066a41186a2009280200360200200641e8066a41106a2008290300370300200641e8066a41086a200b290300370300200641c8066a41086a200e290300370300200641c8066a41106a201a290300370300200641c8066a41176a201b290000370000200641a8066a41086a201c290300370300200641a8066a41106a201d290300370300200641a8066a41176a201e280000360000200620062903e8053703e806200620062903c8073703c806200620062903e8073703a80641002101410121040c040b20044101762102024002402004410171450d00201a2002490d082002201a4f0d01200e20026a2d00004170712103410121040c0b0b0240201a2002490d00410021040c0b0b2002201a41a8bcc7001047000b2002201a41b8bcc7001032000b200641e8066a41086a20064188076a41086a290300370300200641e8066a41106a20064188076a41106a290300370300200641e8066a41186a20064188076a41186a280200360200200641eb046a201c290300370000200641f3046a201b290300370000200641fb046a200b280200360000200641a8066a41176a2020290000370000200641a8066a41106a201f290300370300200641a8066a41086a201e29030037030020062006290388073703e806200620062903e8073700e304200620062903c8073703a80620064188066a41176a202428000036000020064188066a41106a202329030037030020064188066a41086a2022290300370300200641c8066a41176a200641e0046a41176a290000370000200641c8066a41106a201d290000370300200641c8066a41086a2021290000370300200620062903a80737038806200620062900e0043703c806410121014100210420032105200821030c090b20044101762102024002402004410171450d00201a2002490d072002201a4f0d01200e20026a2d000041707121044101210b0c080b0240201a2002490d004100210b0c080b2002201a41a8bcc7001047000b2002201a41b8bcc7001032000b200641e8066a41186a2009280200360200200641e8066a41106a2008290300370300200641e8066a41086a200b290300370300200641c8066a41086a200e290300370300200641c8066a41106a201a290300370300200641c8066a41176a201b290000370000200641a8066a41086a201c290300370300200641a8066a41106a201d290300370300200641a8066a41176a201e280000360000200620062903e8053703e806200620062903c8073703c806200620062903e8073703a80641002104410021010b0c060b410121010c060b2002200941b089c6001032000b2002201a4198bcc7001047000b2002201a4198bcc7001047000b20064188086a200e200210bc05200641b5086a20043a0000200641eb046a20064188076a41086a290300370000200641f3046a20064188076a41106a290300370000200641fb046a20064188076a41186a280200360000200641e0046a41286a20064188086a41086a29030037030020064190056a20064188086a41106a29030037030020064198056a20064188086a41186a290300370300200641a0056a200641a8086a2903003703002006200b3a00b408200641a8056a20064188086a41286a290300370300200620083a00ff0420062006290388073700e304200620062903880837038005200620053b01e004200620054110763a00e2042001200641e0046a10bd05200641e8066a41086a200641e8076a41086a290300370300200641e8066a41106a200641e8076a41106a290300370300200641e8066a41186a200641e8076a41186a280200360200200641c8066a41086a200641c8076a41086a290300370300200641c8066a41106a200641c8076a41106a290300370300200641c8066a41176a200641c8076a41176a290000370000200641a8066a41086a200641a8076a41086a290300370300200641a8066a41106a200641a8076a41106a290300370300200641a8066a41176a200641a8076a41176a280000360000200620062903e8073703e806200620062903c8073703c806200620062903a8073703a8064100210141012104200921050c010b20064188086a200e200210bc05200641b5086a20033a0000200641eb046a20064188076a41086a290300370000200641f3046a20064188076a41106a290300370000200641fb046a20064188076a41186a280200360000200641e0046a41286a20064188086a41086a29030037030020064190056a20064188086a41106a29030037030020064198056a20064188086a41186a290300370300200641a0056a200641a8086a290300370300200620043a00b408200641a8056a20064188086a41286a290300370300200620083a00ff0420062006290388073700e304200620062903880837038005200620053b01e004200620054110763a00e2042001200641e0046a10bd05410221010b200641c8076a41186a200641e8066a41186a280200360200200641c8076a41106a200641e8066a41106a290300370300200641c8076a41086a200641e8066a41086a290300370300200641e0046a41086a200641c8066a41086a290300370300200641e0046a41106a200641c8066a41106a290300370300200641e0046a41176a200641c8066a41176a29000037000020064188086a41086a200641a8066a41086a29030037030020064188086a41106a200641a8066a41106a29030037030020064188086a41176a200641a8066a41176a290000370000200620062903e8063703c807200620062903c8063703e004200620062903a80637038808200641e8056a41176a20064188066a41176a280000360000200641e8056a41106a20064188066a41106a290300370300200641e8056a41086a20064188066a41086a29030037030020062006290388063703e8052001200c41807e71722102410021010b200641e0026a41086a2208200641c8076a41086a290300370300200641e0026a41106a220b200641c8076a41106a290300370300200641e0026a41186a220c200641c8076a41186a280200360200200641c0026a41086a220e200641e0046a41086a290300370300200641c0026a41106a221a200641e0046a41106a290300370300200641c0026a41176a221b200641e0046a41176a290000370000200620062903c8073703e002200620062903e0043703c002200641a0026a41176a221c20064188086a41176a290000370000200641a0026a41106a221d20064188086a41106a290300370300200641a0026a41086a221e20064188086a41086a29030037030020064180026a41086a221f200641e8056a41086a29030037030020064180026a41106a2220200641e8056a41106a29030037030020064180026a41176a2221200641e8056a41176a28000036000020062006290388083703a002200620062903e805370380020240024020010d00200641e0016a41186a200c280200360200200641e0016a41106a200b290300370300200641e0016a41086a2008290300370300200641c0016a41086a200e290300370300200641c0016a41106a201a290300370300200641c0016a41176a201b290000370000200641a0016a41086a201e290300370300200641a0016a41106a201d290300370300200641a0016a41176a201c290000370000200620062903e0023703e001200620062903c0023703c001200620062903a0023703a00120064180016a41176a202128000036000020064180016a41106a202029030037030020064180016a41086a201f290300370300200620062903800237038001200241ff01714102460d01200641e0006a41186a2201200641e0016a41186a280200360200200641e0006a41106a2208200641e0016a41106a290300370300200641e0006a41086a220b200641e0016a41086a290300370300200641c0006a41086a220c200641c0016a41086a290300370300200641c0006a41106a220e200641c0016a41106a290300370300200641c0006a41176a221a200641c0016a41176a290000370000200641206a41086a221b200641a0016a41086a290300370300200641206a41106a221c200641a0016a41106a290300370300200641206a41176a221d200641a0016a41176a290000370000200620062903e001370360200620062903c001370340200620062903a001370320200641176a221e20064180016a41176a280000360000200641106a221f20064180016a41106a290300370300200641086a222020064180016a41086a2903003703002006200629038001370300200641c0046a41086a2221200b290300370300200641c0046a41106a220b2008290300370300200641c0046a41186a22082001280200360200200620062903603703c00420064188086a41086a2201200c29030037030020064188086a41106a220c200e29030037030020064188086a41176a220e201a2900003700002006200629034037038808200641e0036a41086a221a201b290300370300200641e0036a41106a221b201c290300370300200641e0036a41176a221c201d290000370000200620062903203703e003200641a0036a41176a221d201e280000360000200641a0036a41106a221e201f290300370300200641a0036a41086a221f2020290300370300200620062903003703a00320064180056a20033a0000200620023a00e004200620024118763a00e304200620024108763b00e104200641ec046a2021290300370200200641f4046a200b290300370200200641fc046a2008280200360200200620062903c0043702e40420064181056a20062903880837000020064189056a200129030037000020064191056a200c29030037000020064198056a200e290000370000200641a0056a20053a0000200641b8056a201c290000370000200641b1056a201b290300370000200641a9056a201a290300370000200641a1056a20062903e003370000200641c0056a20093a0000200641d8056a201d280000360000200641d1056a201e290300370000200641c9056a201f290300370000200641c1056a20062903a003370000200a200641e0046a1087042106200041086a20043a00002000200636020420004100360200200724000f0b2000410136020020002002360204200724000f0b41a08cc600411841b88cc6001053000be4a40120047f017e017f017e017f017e017f017e017f017e017f017e017f017e017f017e017f017e017f017e017f017e017f017e017f017e027f017e087f017e087f017e230041b00e6b22052400200541086a2002200310d2040240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020052d00084101470d0020052d00092102200541900e6a41086a2203200141086a290000370300200541900e6a41106a2204200141106a290000370300200541900e6a41186a2206200141186a290000370300200520012900003703900e4130102422010d010c2b0b200541d4016a2802002107200541d0016a2802002108200541c8016a2903002109200541c4016a280200210a200541bc016a290200210b200541b8016a280200210c200541b0016a290300210d200541ac016a280200210e200541a4016a290200210f200541a0016a280200211020054198016a290300211120054194016a28020021122005418c016a290200211320054188016a280200211420054180016a2903002115200541fc006a2802002116200541f4006a2902002117200541f0006a2802002118200541e8006a2903002119200541e4006a280200211a200541dc006a290200211b200541086a41d0006a280200211c200541086a41c8006a290300211d200541086a41c4006a280200211e200541086a413c6a290200211f200541086a41386a2802002120200541386a2903002121200541086a412c6a2802002122200541086a41246a22232902002124200541286a22252802002126200541086a411c6a22272802002128200541086a41186a222928020021022005411c6a222a280200212b200541086a410c6a222c290200212d200541086a41086a222e280200212f41002130200528020c0e051502030401150b200141033a0000200120052903900e370001200120023a0021200120052901e00d370122200141096a2003290300370000200141116a2004290300370000200141196a2006290300370000200141286a200541e60d6a29010037010020004101360200200020013602040c280b200541e0016a2802002131200541dc016a2802002130200541d8016a28020021324102210302400240202b4102470d0041002102410021060c010b200541900e6a41186a2206200141186a290000370300200541900e6a41106a2233200141106a290000370300200541900e6a41086a2234200141086a290000370300200520012900003703900e200541e00d6a41086a2028360200200520023602e40d2005202b3602e00d200541086a200541900e6a200541e00d6a200410be05200528020c210341012102024020052802084101460d002006200541286a2903003703002033200541086a41186a2903003703002034200541086a41106a2903003703002005200541086a41086a2903003703900e410021020b200341807e7121060b200541c0066a41186a2233200541900e6a41186a290300370300200541c0066a41106a222b200541900e6a41106a290300370300200541c0066a41086a2234200541900e6a41086a290300370300200520052903900e3703c0062006200341ff017172210620020d03200541a0066a41186a2033290300370300200541a0066a41106a202b290300370300200541a0066a41086a2034290300370300200520052903c0063703a006410221024100210341002133024020264102460d00200541900e6a41186a2233200141186a290000370300200541900e6a41106a222b200141106a290000370300200541900e6a41086a2234200141086a290000370300200520012900003703900e200520243702e40d200520263602e00d200541086a200541900e6a200541e00d6a200410be05200528020c210241012103024020052802084101460d002033200541286a290300370300202b200541086a41186a2903003703002034200541086a41106a2903003703002005200541086a41086a2903003703900e410021030b200241807e7121330b20054180076a41186a222b200541900e6a41186a29030037030020054180076a41106a2234200541900e6a41106a29030037030020054180076a41086a2235200541900e6a41086a290300370300200520052903900e370380072033200241ff017172210220030d04200541e0066a41186a202b290300370300200541e0066a41106a2034290300370300200541e0066a41086a203529030037030020052005290380073703e00641022103410021334100212b024020224102460d00200541900e6a41186a222b200141186a290000370300200541900e6a41106a2234200141106a290000370300200541900e6a41086a2235200141086a290000370300200520012900003703900e200520213702e40d200520223602e00d200541086a200541900e6a200541e00d6a200410be05200528020c210341012133024020052802084101460d00202b200541286a2903003703002034200541086a41186a2903003703002035200541086a41106a2903003703002005200541086a41086a2903003703900e410021330b200341807e71212b0b200541c0076a41186a2234200541900e6a41186a290300370300200541c0076a41106a2235200541900e6a41106a290300370300200541c0076a41086a2225200541900e6a41086a290300370300200520052903900e3703c007202b200341ff017172212b20330d05200541a0076a41186a2034290300370300200541a0076a41106a2035290300370300200541a0076a41086a2025290300370300200520052903c0073703a007410221034100213341002134024020204102460d00200541900e6a41186a2234200141186a290000370300200541900e6a41106a2235200141106a290000370300200541900e6a41086a2225200141086a290000370300200520012900003703900e2005201f3702e40d200520203602e00d200541086a200541900e6a200541e00d6a200410be05200528020c210341012133024020052802084101460d002034200541286a2903003703002035200541086a41186a2903003703002025200541086a41106a2903003703002005200541086a41086a2903003703900e410021330b200341807e7121340b20054180086a41186a2235200541900e6a41186a29030037030020054180086a41106a2225200541900e6a41106a29030037030020054180086a41086a2229200541900e6a41086a290300370300200520052903900e370380082034200341ff017172213420330d06200541e0076a41186a2035290300370300200541e0076a41106a2025290300370300200541e0076a41086a202929030037030020052005290380083703e0074102210341002133410021350240201e4102460d00200541900e6a41186a2235200141186a290000370300200541900e6a41106a2225200141106a290000370300200541900e6a41086a2229200141086a290000370300200520012900003703900e2005201d3702e40d2005201e3602e00d200541086a200541900e6a200541e00d6a200410be05200528020c210341012133024020052802084101460d002035200541286a2903003703002025200541086a41186a2903003703002029200541086a41106a2903003703002005200541086a41086a2903003703900e410021330b200341807e7121350b200541c0086a41186a2225200541900e6a41186a290300370300200541c0086a41106a2229200541900e6a41106a290300370300200541c0086a41086a222c200541900e6a41086a290300370300200520052903900e3703c0082035200341ff017172213520330d07200541a0086a41186a2025290300370300200541a0086a41106a2029290300370300200541a0086a41086a202c290300370300200520052903c0083703a0084102210341002133410021250240201c4102460d00200541900e6a41186a2225200141186a290000370300200541900e6a41106a2229200141106a290000370300200541900e6a41086a222c200141086a290000370300200520012900003703900e2005201b3702e40d2005201c3602e00d200541086a200541900e6a200541e00d6a200410be05200528020c210341012133024020052802084101460d002025200541286a2903003703002029200541086a41186a290300370300202c200541086a41106a2903003703002005200541086a41086a2903003703900e410021330b200341807e7121250b20054180096a41186a2229200541900e6a41186a29030037030020054180096a41106a222c200541900e6a41106a29030037030020054180096a41086a2228200541900e6a41086a290300370300200520052903900e370380092025200341ff017172212520330d08200541e0086a41186a2029290300370300200541e0086a41106a202c290300370300200541e0086a41086a202829030037030020052005290380093703e0084102210341002133410021290240201a4102460d00200541900e6a41186a2229200141186a290000370300200541900e6a41106a222c200141106a290000370300200541900e6a41086a2228200141086a290000370300200520012900003703900e200520193702e40d2005201a3602e00d200541086a200541900e6a200541e00d6a200410be05200528020c210341012133024020052802084101460d002029200541286a290300370300202c200541086a41186a2903003703002028200541086a41106a2903003703002005200541086a41086a2903003703900e410021330b200341807e7121290b200541c0096a41186a222c200541900e6a41186a290300370300200541c0096a41106a2228200541900e6a41106a290300370300200541c0096a41086a2226200541900e6a41086a290300370300200520052903900e3703c0092029200341ff017172212920330d09200541a0096a41186a202c290300370300200541a0096a41106a2028290300370300200541a0096a41086a2026290300370300200520052903c0093703a00941022103410021334100212c024020184102460d00200541900e6a41186a222c200141186a290000370300200541900e6a41106a2228200141106a290000370300200541900e6a41086a2226200141086a290000370300200520012900003703900e200520173702e40d200520183602e00d200541086a200541900e6a200541e00d6a200410be05200528020c210341012133024020052802084101460d00202c200541286a2903003703002028200541086a41186a2903003703002026200541086a41106a2903003703002005200541086a41086a2903003703900e410021330b200341807e71212c0b200541800a6a41186a2228200541900e6a41186a290300370300200541800a6a41106a2226200541900e6a41106a290300370300200541800a6a41086a2223200541900e6a41086a290300370300200520052903900e3703800a202c200341ff017172212c20330d0a200541e0096a41186a2028290300370300200541e0096a41106a2026290300370300200541e0096a41086a2023290300370300200520052903800a3703e009410221034100213341002128024020164102460d00200541900e6a41186a2228200141186a290000370300200541900e6a41106a2226200141106a290000370300200541900e6a41086a2223200141086a290000370300200520012900003703900e200520153702e40d200520163602e00d200541086a200541900e6a200541e00d6a200410be05200528020c210341012133024020052802084101460d002028200541286a2903003703002026200541086a41186a2903003703002023200541086a41106a2903003703002005200541086a41086a2903003703900e410021330b200341807e7121280b200541c00a6a41186a2226200541900e6a41186a290300370300200541c00a6a41106a2223200541900e6a41106a290300370300200541c00a6a41086a2227200541900e6a41086a290300370300200520052903900e3703c00a2028200341ff017172212820330d0b200541a00a6a41186a2026290300370300200541a00a6a41106a2023290300370300200541a00a6a41086a2027290300370300200520052903c00a3703a00a410221034100213341002126024020144102460d00200541900e6a41186a2226200141186a290000370300200541900e6a41106a2223200141106a290000370300200541900e6a41086a2227200141086a290000370300200520012900003703900e200520133702e40d200520143602e00d200541086a200541900e6a200541e00d6a200410be05200528020c210341012133024020052802084101460d002026200541286a2903003703002023200541086a41186a2903003703002027200541086a41106a2903003703002005200541086a41086a2903003703900e410021330b200341807e7121260b200541800b6a41186a2223200541900e6a41186a290300370300200541800b6a41106a2227200541900e6a41106a290300370300200541800b6a41086a222a200541900e6a41086a290300370300200520052903900e3703800b2026200341ff017172212620330d0c200541e00a6a41186a2023290300370300200541e00a6a41106a2027290300370300200541e00a6a41086a202a290300370300200520052903800b3703e00a410221034100213341002123024020124102460d00200541900e6a41186a2223200141186a290000370300200541900e6a41106a2227200141106a290000370300200541900e6a41086a222a200141086a290000370300200520012900003703900e200520113702e40d200520123602e00d200541086a200541900e6a200541e00d6a200410be05200528020c210341012133024020052802084101460d002023200541286a2903003703002027200541086a41186a290300370300202a200541086a41106a2903003703002005200541086a41086a2903003703900e410021330b200341807e7121230b200541c00b6a41186a2227200541900e6a41186a290300370300200541c00b6a41106a222a200541900e6a41106a290300370300200541c00b6a41086a2222200541900e6a41086a290300370300200520052903900e3703c00b2023200341ff017172212320330d0d200541a00b6a41186a2027290300370300200541a00b6a41106a202a290300370300200541a00b6a41086a2022290300370300200520052903c00b3703a00b410221034100213341002127024020104102460d00200541900e6a41186a2227200141186a290000370300200541900e6a41106a222a200141106a290000370300200541900e6a41086a2222200141086a290000370300200520012900003703900e2005200f3702e40d200520103602e00d200541086a200541900e6a200541e00d6a200410be05200528020c210341012133024020052802084101460d002027200541286a290300370300202a200541086a41186a2903003703002022200541086a41106a2903003703002005200541086a41086a2903003703900e410021330b200341807e7121270b200541800c6a41186a222a200541900e6a41186a290300370300200541800c6a41106a2222200541900e6a41106a290300370300200541800c6a41086a222e200541900e6a41086a290300370300200520052903900e3703800c2027200341ff017172212720330d0e200541e00b6a41186a202a290300370300200541e00b6a41106a2022290300370300200541e00b6a41086a202e290300370300200520052903800c3703e00b41022133410021034100212a0240200e4102460d00200541900e6a41186a222a200141186a290000370300200541900e6a41106a2222200141106a290000370300200541900e6a41086a222e200141086a290000370300200520012900003703900e2005200d3702e40d2005200e3602e00d200541086a200541900e6a200541e00d6a200410be05200528020c213341012103024020052802084101460d00202a200541286a2903003703002022200541086a41186a290300370300202e200541086a41106a2903003703002005200541086a41086a2903003703900e410021030b203341807e71212a203341ff017121330b200541c00c6a41186a2222200541900e6a41186a290300370300200541c00c6a41106a222e200541900e6a41106a290300370300200541c00c6a41086a2220200541900e6a41086a290300370300200520052903900e3703c00c202a203372213320030d0f200541a00c6a41186a2022290300370300200541a00c6a41106a202e290300370300200541a00c6a41086a2020290300370300200520052903c00c3703a00c4102212a41002103410021220240200c4102460d00200541900e6a41186a2222200141186a290000370300200541900e6a41106a222e200141106a290000370300200541900e6a41086a2220200141086a290000370300200520012900003703900e2005200b3702e40d2005200c3602e00d200541086a200541900e6a200541e00d6a200410be05200528020c212a41012103024020052802084101460d002022200541286a290300370300202e200541086a41186a2903003703002020200541086a41106a2903003703002005200541086a41086a2903003703900e410021030b202a41807e712122202a41ff0171212a0b200541800d6a41186a222e200541900e6a41186a290300370300200541800d6a41106a2220200541900e6a41106a290300370300200541800d6a41086a221e200541900e6a41086a290300370300200520052903900e3703800d2022202a72212a20030d10200541e00c6a41186a202e290300370300200541e00c6a41106a2020290300370300200541e00c6a41086a201e290300370300200520052903800d3703e00c41022122410021034100212e0240200a4102460d00200541900e6a41186a222e200141186a290000370300200541900e6a41106a2220200141106a290000370300200541900e6a41086a221e200141086a290000370300200520012900003703900e200520093702e40d2005200a3602e00d200541086a200541900e6a200541e00d6a200410be05200528020c212241012103024020052802084101460d00202e200541286a2903003703002020200541086a41186a290300370300201e200541086a41106a2903003703002005200541086a41086a2903003703900e410021030b202241807e71212e202241ff017121220b200541c00d6a41186a2220200541900e6a41186a290300370300200541c00d6a41106a221e200541900e6a41106a290300370300200541c00d6a41086a221c200541900e6a41086a290300370300200520052903900e3703c00d202e202272212220030d24200541a00d6a41186a2020290300370300200541a00d6a41106a201e290300370300200541a00d6a41086a201c290300370300200520052903c00d3703a00d4102210320084102470d1141002101410021040c120b200541086a202f202da710bc05200541900e6a41086a2029290300370300200541900e6a41106a2025290300370300200541900e6a41186a200541306a2802003602002005200541086a41106a2903003703900e2002417f4c0d13202c2802002133200529020c21362005280208210641012130410121014100210302402002450d00200210242201450d25200221030b202d422088a7213420054100360210200520013602082005200336020c200541086a4100200210c90120052802082203200528021022016a202b200210cf061a20054180026a41086a200541900e6a41086a29030037030020054180026a41106a200541900e6a41106a29030037030020054180026a41186a200541900e6a41186a2802003602002005200120026a360210200520052903900e37038002200529020c222d422088a72131202da721320c120b200541086a202f202da710bc05200541e00d6a41086a2029290300370300200541e00d6a41106a22342025290300370300200541e00d6a41186a200541306a2802003602002005200541086a41106a22322903003703e00d202c280200213320052802082106200529020c2136200541900e6a41186a200141186a290000370300200541900e6a41106a200141106a290000370300200541900e6a41086a200141086a290000370300200520012900003703900e200541a00d6a41086a2028360200200520023602a40d2005202b3602a00d200541086a200541900e6a200541a00d6a200410be05200541c00d6a41086a2027290200370300200541c00d6a41106a220120232802003602002005202a2902003703c00d200528020c2103024020052802084101460d00202e290300212420322802002135200541e8016a41106a2001280200360200200541e8016a41086a200541c00d6a41086a29030037030020054180026a41086a200541e00d6a41086a29030037030020054180026a41106a203429030037030020054180026a41186a200541e00d6a41186a280200360200200520052903c00d3703e801200520052903e00d370380022024422088a72131202d422088a721342024a72132410221300c120b2000410136020020002003360204200641244d0d252036422088a710260c250b4102210341002133410021060240202f4102460d00200541900e6a41186a2233200141186a290000370300200541900e6a41106a2234200141106a290000370300200541900e6a41086a2232200141086a290000370300200520012900003703900e2005202d3702e40d2005202f3602e00d200541086a200541900e6a200541e00d6a200410be05200528020c210341012106024020052802084101460d002033200541286a2903003703002034200541086a41186a2903003703002032200541086a41106a2903003703002005200541086a41086a2903003703900e410021060b200341807e7121330b200541c0066a41186a2234200541900e6a41186a290300370300200541c0066a41106a2232200541900e6a41106a290300370300200541c0066a41086a2231200541900e6a41086a290300370300200520052903900e3703c006200341ff0171203372213320060d12200541a0066a41186a2034290300370300200541a0066a41106a2032290300370300200541a0066a41086a2031290300370300200520052903c0063703a0064102210302400240202b4102470d0041002106410021020c010b200541900e6a41186a2206200141186a290000370300200541900e6a41106a2234200141106a290000370300200541900e6a41086a2232200141086a290000370300200520012900003703900e200541e00d6a41086a2028360200200520023602e40d2005202b3602e00d200541086a200541900e6a200541e00d6a200410be05200528020c210341012102024020052802084101460d002006200541286a2903003703002034200541086a41186a2903003703002032200541086a41106a2903003703002005200541086a41086a2903003703900e410021020b200341807e7121060b20054180076a41186a222b200541900e6a41186a29030037030020054180076a41106a2234200541900e6a41106a29030037030020054180076a41086a2232200541900e6a41086a290300370300200520052903900e37038007200341ff0171200672210320020d13200541e0066a41186a202b290300370300200541e0066a41106a2034290300370300200541e0066a41086a203229030037030020052005290380073703e006410221024100212b41002106024020264102460d00200541900e6a41186a222b200141186a290000370300200541900e6a41106a2234200141106a290000370300200541900e6a41086a2232200141086a290000370300200520012900003703900e200520243702e40d200520263602e00d200541086a200541900e6a200541e00d6a200410be05200528020c210241012106024020052802084101460d00202b200541286a2903003703002034200541086a41186a2903003703002032200541086a41106a2903003703002005200541086a41086a2903003703900e410021060b200241807e71212b0b200541c0076a41186a2234200541900e6a41186a290300370300200541c0076a41106a2232200541900e6a41106a290300370300200541c0076a41086a2231200541900e6a41086a290300370300200520052903900e3703c007200241ff0171202b72210220060d14200541a0076a41186a2034290300370300200541a0076a41106a2032290300370300200541a0076a41086a2031290300370300200520052903c0073703a00741022106410021344100212b024020224102460d00200541900e6a41186a2234200141186a290000370300200541900e6a41106a2232200141106a290000370300200541900e6a41086a2231200141086a290000370300200520012900003703900e200520213702e40d200520223602e00d200541086a200541900e6a200541e00d6a200410be05200528020c21064101212b024020052802084101460d002034200541286a2903003703002032200541086a41186a2903003703002031200541086a41106a2903003703002005200541086a41086a2903003703900e4100212b0b200641807e7121340b20054180086a41186a2232200541900e6a41186a29030037030020054180086a41106a2231200541900e6a41106a29030037030020054180086a41086a2230200541900e6a41086a290300370300200520052903900e37038008200641ff01712034722106202b0d15200541e0076a41186a2032290300370300200541e0076a41106a2031290300370300200541e0076a41086a203029030037030020052005290380083703e0074102212b4100213241002134024020204102460d00200541900e6a41186a2232200141186a290000370300200541900e6a41106a2231200141106a290000370300200541900e6a41086a2230200141086a290000370300200520012900003703900e2005201f3702e40d200520203602e00d200541086a200541900e6a200541e00d6a200410be05200528020c212b41012134024020052802084101460d002032200541286a2903003703002031200541086a41186a2903003703002030200541086a41106a2903003703002005200541086a41086a2903003703900e410021340b202b41807e7121320b200541c0086a41186a2231200541900e6a41186a290300370300200541c0086a41106a2230200541900e6a41106a290300370300200541c0086a41086a2235200541900e6a41086a290300370300200520052903900e3703c008202b41ff0171203272212b20340d16200541a0086a41186a2031290300370300200541a0086a41106a2030290300370300200541a0086a41086a2035290300370300200520052903c0083703a0084102213441002131410021320240201e4102460d00200541900e6a41186a2231200141186a290000370300200541900e6a41106a2230200141106a290000370300200541900e6a41086a2235200141086a290000370300200520012900003703900e2005201d3702e40d2005201e3602e00d200541086a200541900e6a200541e00d6a200410be05200528020c213441012132024020052802084101460d002031200541286a2903003703002030200541086a41186a2903003703002035200541086a41106a2903003703002005200541086a41086a2903003703900e410021320b203441807e7121310b20054180096a41186a2230200541900e6a41186a29030037030020054180096a41106a2235200541900e6a41106a29030037030020054180096a41086a222f200541900e6a41086a290300370300200520052903900e37038009203441ff0171203172213120320d17200541e0086a41186a2030290300370300200541e0086a41106a2035290300370300200541e0086a41086a202f29030037030020052005290380093703e0084102213441002130410021320240201c4102460d00200541900e6a41186a2230200141186a290000370300200541900e6a41106a2235200141106a290000370300200541900e6a41086a222f200141086a290000370300200520012900003703900e2005201b3702e40d2005201c3602e00d200541086a200541900e6a200541e00d6a200410be05200528020c213441012132024020052802084101460d002030200541286a2903003703002035200541086a41186a290300370300202f200541086a41106a2903003703002005200541086a41086a2903003703900e410021320b203441807e7121300b200541c0096a41186a2235200541900e6a41186a290300370300200541c0096a41106a222f200541900e6a41106a290300370300200541c0096a41086a2225200541900e6a41086a290300370300200520052903900e3703c009203441ff0171203072213020320d18200541a0096a41186a2035290300370300200541a0096a41106a202f290300370300200541a0096a41086a2025290300370300200520052903c0093703a0094102213441002135410021320240201a4102460d00200541900e6a41186a2235200141186a290000370300200541900e6a41106a222f200141106a290000370300200541900e6a41086a2225200141086a290000370300200520012900003703900e200520193702e40d2005201a3602e00d200541086a200541900e6a200541e00d6a200410be05200528020c213441012132024020052802084101460d002035200541286a290300370300202f200541086a41186a2903003703002025200541086a41106a2903003703002005200541086a41086a2903003703900e410021320b203441807e7121350b200541800a6a41186a222f200541900e6a41186a290300370300200541800a6a41106a2225200541900e6a41106a290300370300200541800a6a41086a2229200541900e6a41086a290300370300200520052903900e3703800a203441ff0171203572213520320d19200541e0096a41186a202f290300370300200541e0096a41106a2025290300370300200541e0096a41086a2029290300370300200520052903800a3703e009410221344100212f41002132024020184102460d00200541900e6a41186a222f200141186a290000370300200541900e6a41106a2225200141106a290000370300200541900e6a41086a2229200141086a290000370300200520012900003703900e200520173702e40d200520183602e00d200541086a200541900e6a200541e00d6a200410be05200528020c213441012132024020052802084101460d00202f200541286a2903003703002025200541086a41186a2903003703002029200541086a41106a2903003703002005200541086a41086a2903003703900e410021320b203441807e71212f0b200541c00a6a41186a2225200541900e6a41186a290300370300200541c00a6a41106a2229200541900e6a41106a290300370300200541c00a6a41086a222c200541900e6a41086a290300370300200520052903900e3703c00a203441ff0171202f72212f20320d1a200541a00a6a41186a2025290300370300200541a00a6a41106a2029290300370300200541a00a6a41086a202c290300370300200520052903c00a3703a00a410221344100212541002132024020164102460d00200541900e6a41186a2225200141186a290000370300200541900e6a41106a2229200141106a290000370300200541900e6a41086a222c200141086a290000370300200520012900003703900e200520153702e40d200520163602e00d200541086a200541900e6a200541e00d6a200410be05200528020c213441012132024020052802084101460d002025200541286a2903003703002029200541086a41186a290300370300202c200541086a41106a2903003703002005200541086a41086a2903003703900e410021320b203441807e7121250b200541800b6a41186a2229200541900e6a41186a290300370300200541800b6a41106a222c200541900e6a41106a290300370300200541800b6a41086a2228200541900e6a41086a290300370300200520052903900e3703800b203441ff0171202572212520320d1b200541e00a6a41186a2029290300370300200541e00a6a41106a202c290300370300200541e00a6a41086a2028290300370300200520052903800b3703e00a410221344100213241002129024020144102460d00200541900e6a41186a2229200141186a290000370300200541900e6a41106a222c200141106a290000370300200541900e6a41086a2228200141086a290000370300200520012900003703900e200520133702e40d200520143602e00d200541086a200541900e6a200541e00d6a200410be05200528020c213441012132024020052802084101460d002029200541286a290300370300202c200541086a41186a2903003703002028200541086a41106a2903003703002005200541086a41086a2903003703900e410021320b203441807e7121290b200541c00b6a41186a222c200541900e6a41186a290300370300200541c00b6a41106a2228200541900e6a41106a290300370300200541c00b6a41086a2226200541900e6a41086a290300370300200520052903900e3703c00b2029203441ff017172212920320d1c200541a00b6a41186a202c290300370300200541a00b6a41106a2028290300370300200541a00b6a41086a2026290300370300200520052903c00b3703a00b41022134410021324100212c024020124102460d00200541900e6a41186a222c200141186a290000370300200541900e6a41106a2228200141106a290000370300200541900e6a41086a2226200141086a290000370300200520012900003703900e200520113702e40d200520123602e00d200541086a200541900e6a200541e00d6a200410be05200528020c213441012132024020052802084101460d00202c200541286a2903003703002028200541086a41186a2903003703002026200541086a41106a2903003703002005200541086a41086a2903003703900e410021320b203441807e71212c0b200541800c6a41186a2228200541900e6a41186a290300370300200541800c6a41106a2226200541900e6a41106a290300370300200541800c6a41086a2223200541900e6a41086a290300370300200520052903900e3703800c202c203441ff017172212c20320d1d200541e00b6a41186a2028290300370300200541e00b6a41106a2026290300370300200541e00b6a41086a2023290300370300200520052903800c3703e00b410221324100213441002128024020104102460d00200541900e6a41186a2228200141186a290000370300200541900e6a41106a2226200141106a290000370300200541900e6a41086a2223200141086a290000370300200520012900003703900e2005200f3702e40d200520103602e00d200541086a200541900e6a200541e00d6a200410be05200528020c213241012134024020052802084101460d002028200541286a2903003703002026200541086a41186a2903003703002023200541086a41106a2903003703002005200541086a41086a2903003703900e410021340b203241807e712128203241ff017121320b200541c00c6a41186a2226200541900e6a41186a290300370300200541c00c6a41106a2223200541900e6a41106a290300370300200541c00c6a41086a2227200541900e6a41086a290300370300200520052903900e3703c00c2028203272213220340d1e200541a00c6a41186a2026290300370300200541a00c6a41106a2023290300370300200541a00c6a41086a2027290300370300200520052903c00c3703a00c4102212841002134410021260240200e4102460d00200541900e6a41186a2226200141186a290000370300200541900e6a41106a2223200141106a290000370300200541900e6a41086a2227200141086a290000370300200520012900003703900e2005200d3702e40d2005200e3602e00d200541086a200541900e6a200541e00d6a200410be05200528020c212841012134024020052802084101460d002026200541286a2903003703002023200541086a41186a2903003703002027200541086a41106a2903003703002005200541086a41086a2903003703900e410021340b202841807e712126202841ff017121280b200541800d6a41186a2223200541900e6a41186a290300370300200541800d6a41106a2227200541900e6a41106a290300370300200541800d6a41086a222a200541900e6a41086a290300370300200520052903900e3703800d2026202872212820340d1f200541e00c6a41186a2023290300370300200541e00c6a41106a2027290300370300200541e00c6a41086a202a290300370300200520052903800d3703e00c4102212641002134410021230240200c4102460d00200541900e6a41186a2223200141186a290000370300200541900e6a41106a2227200141106a290000370300200541900e6a41086a222a200141086a290000370300200520012900003703900e2005200b3702e40d2005200c3602e00d200541086a200541900e6a200541e00d6a200410be05200528020c212641012134024020052802084101460d002023200541286a2903003703002027200541086a41186a290300370300202a200541086a41106a2903003703002005200541086a41086a2903003703900e410021340b202641807e712123202641ff017121260b200541c00d6a41186a2227200541900e6a41186a290300370300200541c00d6a41106a222a200541900e6a41106a290300370300200541c00d6a41086a2222200541900e6a41086a290300370300200520052903900e3703c00d2023202672212620340d20200541a00d6a41186a2027290300370300200541a00d6a41106a202a290300370300200541a00d6a41086a2022290300370300200520052903c00d3703a00d4102212341002134410021270240200a4102460d00200541900e6a41186a2223200141186a290000370300200541900e6a41106a2227200141106a290000370300200541900e6a41086a222a200141086a290000370300200520012900003703900e200520093702840e2005200a3602800e200541086a200541900e6a200541800e6a200410be05200528020c210141012134024020052802084101460d002023200541286a2903003703002027200541086a41186a290300370300202a200541086a41106a2903003703002005200541086a41086a2903003703900e410021340b200141807e712127200141ff017121230b200541e00d6a41186a2204200541900e6a41186a290300370300200541e00d6a41106a222a200541900e6a41106a290300370300200541e00d6a41086a2222200541900e6a41086a290300370300200520052903900e3703e00d20272023722101024020340d00200541a0026a41186a2004290300370300200541a0026a41106a202a290300370300200541a0026a41086a202229030037030020054180066a41086a200541a0066a41086a29030037030020054180066a41106a200541a0066a41106a29030037030020054180066a41186a200541a0066a41186a290300370300200541e0056a41086a200541e0066a41086a290300370300200541e0056a41106a200541e0066a41106a290300370300200541e0056a41186a200541e0066a41186a290300370300200520052903e00d3703a002200520052903a00637038006200520052903e0063703e005200541c0056a41186a200541a0076a41186a290300370300200541c0056a41106a200541a0076a41106a290300370300200541c0056a41086a200541a0076a41086a290300370300200541a0056a41086a200541e0076a41086a290300370300200541a0056a41106a200541e0076a41106a290300370300200541a0056a41186a200541e0076a41186a29030037030020054180056a41086a200541a0086a41086a29030037030020054180056a41106a200541a0086a41106a29030037030020054180056a41186a200541a0086a41186a290300370300200520052903a0073703c005200520052903e0073703a005200520052903a00837038005200541e0046a41186a200541e0086a41186a290300370300200541e0046a41106a200541e0086a41106a290300370300200541e0046a41086a200541e0086a41086a290300370300200541c0046a41186a200541a0096a41186a290300370300200541c0046a41106a200541a0096a41106a290300370300200541c0046a41086a200541a0096a41086a290300370300200541a0046a41186a200541e0096a41186a290300370300200541a0046a41106a200541e0096a41106a290300370300200541a0046a41086a200541e0096a41086a290300370300200520052903e0083703e004200520052903a0093703c004200520052903e0093703a00420054180046a41186a200541a00a6a41186a29030037030020054180046a41106a200541a00a6a41106a29030037030020054180046a41086a200541a00a6a41086a290300370300200520052903a00a37038004200541e0036a41186a200541e00a6a41186a290300370300200541e0036a41106a200541e00a6a41106a290300370300200541e0036a41086a200541e00a6a41086a290300370300200520052903e00a3703e003200541c0036a41186a200541a00b6a41186a290300370300200541c0036a41106a200541a00b6a41106a290300370300200541c0036a41086a200541a00b6a41086a290300370300200520052903a00b3703c003200541a0036a41186a200541e00b6a41186a290300370300200541a0036a41106a200541e00b6a41106a290300370300200541a0036a41086a200541e00b6a41086a290300370300200520052903e00b3703a00320054180036a41186a200541a00c6a41186a29030037030020054180036a41106a200541a00c6a41106a29030037030020054180036a41086a200541a00c6a41086a290300370300200520052903a00c37038003200541e0026a41186a200541e00c6a41186a290300370300200541e0026a41106a200541e00c6a41106a290300370300200541e0026a41086a200541e00c6a41086a290300370300200520052903e00c3703e002200541c0026a41186a200541a00d6a41186a290300370300200541c0026a41106a200541a00d6a41106a290300370300200541c0026a41086a200541a00d6a41086a290300370300200520052903a00d3703c00241c00410242234450d2620342033360200203420052903800637020420342003360224203420052903e0053702282034410c6a20054180066a41086a290300370200203441146a20054180066a41106a2903003702002034411c6a20054180066a41186a290300370200203441306a200541e0056a41086a290300370200203441386a200541e0056a41106a290300370200203441c0006a200541e0056a41186a290300370200203420023602482034200636026c203420052903c00537024c203441d4006a200541c0056a41086a290300370200203441dc006a200541c0056a41106a290300370200203441e4006a200541c0056a41186a290300370200203420052903a005370270203441f8006a200541a0056a41086a29030037020020344180016a200541a0056a41106a29030037020020344188016a200541a0056a41186a2903003702002034202b36029001203420313602b401203441ac016a20054180056a41186a290300370200203441a4016a20054180056a41106a2903003702002034419c016a20054180056a41086a290300370200203420052903800537029401203441d0016a200541e0046a41186a290300370200203441c8016a200541e0046a41106a290300370200203441c0016a200541e0046a41086a290300370200203420052903e0043702b801203420303602d801203441f4016a200541c0046a41186a290300370200203441ec016a200541c0046a41106a290300370200203441e4016a200541c0046a41086a290300370200203420052903c0043702dc01203420353602fc0120344198026a200541a0046a41186a29030037020020344190026a200541a0046a41106a29030037020020344188026a200541a0046a41086a290300370200203420052903a004370280022034202f3602a002203441bc026a20054180046a41186a290300370200203441b4026a20054180046a41106a290300370200203441ac026a20054180046a41086a29030037020020342005290380043702a402203420253602c402203441e0026a200541e0036a41186a290300370200203441d8026a200541e0036a41106a290300370200203441d0026a200541e0036a41086a290300370200203420052903e0033702c802203420293602e80220344184036a200541c0036a41186a290300370200203441fc026a200541c0036a41106a290300370200203441f4026a200541c0036a41086a290300370200203420052903c0033702ec022034202c36028c03203441a8036a200541a0036a41186a290300370200203441a0036a200541a0036a41106a29030037020020344198036a200541a0036a41086a290300370200203420052903a00337029003203420323602b003203441cc036a20054180036a41186a290300370200203441c4036a20054180036a41106a290300370200203441bc036a20054180036a41086a29030037020020342005290380033702b403203420283602d403203441f0036a200541e0026a41186a290300370200203441e8036a200541e0026a41106a290300370200203441e0036a200541e0026a41086a290300370200203420052903e0023702d803203420263602f80320344194046a200541c0026a41186a2903003702002034418c046a200541c0026a41106a29030037020020344184046a200541c0026a41086a290300370200203420052903c0023702fc032034200136029c04203441b8046a200541a0026a41186a290300370200203441b0046a200541a0026a41106a290300370200203441a8046a200541a0026a41086a290300370200203420052903a0023702a00441032130024020080d00410021060c120b2007417f4c0d120240024020070d0041012101410021020c010b200710242201450d24200721020b20054100360210200520013602082005200236020c200541086a4100200710c90120052802082206200528021022016a2008200710cf061a2005200120076a360210200529020c21360c110b20004101360200200020013602040c240b20004101360200200020063602040c230b20004101360200200020023602040c220b200041013602002000202b3602040c210b20004101360200200020343602040c200b20004101360200200020353602040c1f0b20004101360200200020253602040c1e0b20004101360200200020293602040c1d0b200041013602002000202c3602040c1c0b20004101360200200020283602040c1b0b20004101360200200020263602040c1a0b20004101360200200020233602040c190b20004101360200200020273602040c180b20004101360200200020333602040c170b200041013602002000202a3602040c160b200541900e6a41186a222e200141186a290000370300200541900e6a41106a2220200141106a290000370300200541900e6a41086a221e200141086a290000370300200520012900003703900e200541800e6a41086a2032360200200520073602840e200520083602800e200541086a200541900e6a200541800e6a200410be05200528020c210341012101024020052802084101460d00202e200541286a2903003703002020200541086a41186a290300370300201e200541086a41106a2903003703002005200541086a41086a2903003703900e410021010b200341807e712104200341ff017121030b200541e00d6a41186a2232200541900e6a41186a290300370300200541e00d6a41106a222e200541900e6a41106a290300370300200541e00d6a41086a2220200541900e6a41086a290300370300200520052903900e3703e00d2004200372210420010d13200541a0026a41186a2032290300370300200541a0026a41106a202e290300370300200541a0026a41086a202029030037030020054180066a41086a200541a0066a41086a29030037030020054180066a41106a200541a0066a41106a29030037030020054180066a41186a200541a0066a41186a290300370300200541e0056a41086a200541e0066a41086a290300370300200541e0056a41106a200541e0066a41106a290300370300200541e0056a41186a200541e0066a41186a290300370300200520052903e00d3703a002200520052903a00637038006200520052903e0063703e005200541c0056a41186a200541a0076a41186a290300370300200541c0056a41106a200541a0076a41106a290300370300200541c0056a41086a200541a0076a41086a290300370300200541a0056a41086a200541e0076a41086a290300370300200541a0056a41106a200541e0076a41106a290300370300200541a0056a41186a200541e0076a41186a29030037030020054180056a41086a200541a0086a41086a29030037030020054180056a41106a200541a0086a41106a29030037030020054180056a41186a200541a0086a41186a290300370300200520052903a0073703c005200520052903e0073703a005200520052903a00837038005200541e0046a41186a200541e0086a41186a290300370300200541e0046a41106a200541e0086a41106a290300370300200541e0046a41086a200541e0086a41086a290300370300200541c0046a41186a200541a0096a41186a290300370300200541c0046a41106a200541a0096a41106a290300370300200541c0046a41086a200541a0096a41086a290300370300200541a0046a41186a200541e0096a41186a290300370300200541a0046a41106a200541e0096a41106a290300370300200541a0046a41086a200541e0096a41086a290300370300200520052903e0083703e004200520052903a0093703c004200520052903e0093703a00420054180046a41186a200541a00a6a41186a29030037030020054180046a41106a200541a00a6a41106a29030037030020054180046a41086a200541a00a6a41086a290300370300200520052903a00a37038004200541e0036a41186a200541e00a6a41186a290300370300200541e0036a41106a200541e00a6a41106a290300370300200541e0036a41086a200541e00a6a41086a290300370300200520052903e00a3703e003200541c0036a41186a200541a00b6a41186a290300370300200541c0036a41106a200541a00b6a41106a290300370300200541c0036a41086a200541a00b6a41086a290300370300200520052903a00b3703c003200541a0036a41186a200541e00b6a41186a290300370300200541a0036a41106a200541e00b6a41106a290300370300200541a0036a41086a200541e00b6a41086a290300370300200520052903e00b3703a00320054180036a41186a200541a00c6a41186a29030037030020054180036a41106a200541a00c6a41106a29030037030020054180036a41086a200541a00c6a41086a290300370300200520052903a00c37038003200541e0026a41186a200541e00c6a41186a290300370300200541e0026a41106a200541e00c6a41106a290300370300200541e0026a41086a200541e00c6a41086a290300370300200520052903e00c3703e002200541c0026a41186a200541a00d6a41186a290300370300200541c0026a41106a200541a00d6a41106a290300370300200541c0026a41086a200541a00d6a41086a290300370300200520052903a00d3703c00241c00410242203450d1520032006360200200320052903800637020420032002360224200320052903e0053702282003410c6a20054180066a41086a290300370200200341146a20054180066a41106a2903003702002003411c6a20054180066a41186a290300370200200341306a200541e0056a41086a290300370200200341386a200541e0056a41106a290300370200200341c0006a200541e0056a41186a2903003702002003202b3602482003203436026c200320052903c00537024c200341d4006a200541c0056a41086a290300370200200341dc006a200541c0056a41106a290300370200200341e4006a200541c0056a41186a290300370200200320052903a005370270200341f8006a200541a0056a41086a29030037020020034180016a200541a0056a41106a29030037020020034188016a200541a0056a41186a2903003702002003203536029001200320253602b401200341ac016a20054180056a41186a290300370200200341a4016a20054180056a41106a2903003702002003419c016a20054180056a41086a290300370200200320052903800537029401200341d0016a200541e0046a41186a290300370200200341c8016a200541e0046a41106a290300370200200341c0016a200541e0046a41086a290300370200200320052903e0043702b801200320293602d801200341f4016a200541c0046a41186a290300370200200341ec016a200541c0046a41106a290300370200200341e4016a200541c0046a41086a290300370200200320052903c0043702dc012003202c3602fc0120034198026a200541a0046a41186a29030037020020034190026a200541a0046a41106a29030037020020034188026a200541a0046a41086a290300370200200320052903a00437028002200320283602a002200341bc026a20054180046a41186a290300370200200341b4026a20054180046a41106a290300370200200341ac026a20054180046a41086a29030037020020032005290380043702a402200320263602c402200341e0026a200541e0036a41186a290300370200200341d8026a200541e0036a41106a290300370200200341d0026a200541e0036a41086a290300370200200320052903e0033702c802200320233602e80220034184036a200541c0036a41186a290300370200200341fc026a200541c0036a41106a290300370200200341f4026a200541c0036a41086a290300370200200320052903c0033702ec022003202736028c03200341a8036a200541a0036a41186a290300370200200341a0036a200541a0036a41106a29030037020020034198036a200541a0036a41086a290300370200200320052903a00337029003200320333602b003200341cc036a20054180036a41186a290300370200200341c4036a20054180036a41106a290300370200200341bc036a20054180036a41086a29030037020020032005290380033702b4032003202a3602d403200341f0036a200541e0026a41186a290300370200200341e8036a200541e0026a41106a290300370200200341e0036a200541e0026a41086a290300370200200320052903e0023702d803200320223602f80320034194046a200541c0026a41186a2903003702002003418c046a200541c0026a41106a29030037020020034184046a200541c0026a41086a290300370200200320052903c0023702fc032003200436029c04200341b8046a200541a0026a41186a290300370200200341b0046a200541a0026a41106a290300370200200341a8046a200541a0026a41086a290300370200200320052903a0023702a004200541086a202f202da710bc05200541900e6a41086a2201200541086a41186a290300370300200541900e6a41106a2202200541286a290300370300200541900e6a41186a2204200541306a2802003602002005200541086a41106a2903003703900e200541086a410c6a2802002133200529020c2136200528020821060240024020300d00410021320c010b2031417f4c0d020240024020310d004101212b410021340c010b20311024222b450d14203121340b200541003602102005202b3602082005203436020c200541086a4100203110c901200528020822322005280210222b6a2030203110cf061a202b20316a2135200528020c21310b202d422088a7213420054180026a41186a200428020036020020054180026a41106a200229030037030020054180026a41086a2001290300370300200520052903900e37038002410421300b20002030360204200041186a2033360200200041106a20363702002000410c6a2006360200200041086a20343602002000411c6a200529038002370200200041c4006a2035360200200041386a2003360200200041c8006a20052903e801370200200041246a20054180026a41086a2903003702002000412c6a20054180026a41106a290300370200200041346a20054180026a41186a280200360200200041d0006a200541e8016a41086a290300370200200041d8006a200541e8016a41106a2802003602002000413c6a2031ad4220862032ad84370200200041003602000c130b1034000b20004101360200200020333602040c110b20004101360200200020033602040c100b20004101360200200020023602040c0f0b20004101360200200020063602040c0e0b200041013602002000202b3602040c0d0b20004101360200200020313602040c0c0b20004101360200200020303602040c0b0b20004101360200200020353602040c0a0b200041013602002000202f3602040c090b20004101360200200020253602040c080b20004101360200200020293602040c070b200041013602002000202c3602040c060b20004101360200200020323602040c050b20004101360200200020283602040c040b20004101360200200020263602040c030b20004101360200200020223602040c020b1033000b20004101360200200020043602040b200541b00e6a24000f0b102c000bf55303117f047e037f23002206210720064180056b41607122062400200641106a41086a200341086a28020036020020062003290200370310024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020022802000e050104000203010b20064180016a2002412c6a290200370300200641f8006a200241246a290200370300200641d8006a41186a2002411c6a290200370300200641d8006a41106a2208200241146a290200370300200641d8006a41086a2002410c6a29020037030020062002290204370358200641a6016a200241376a2d00003a000020064188016a41086a200241c4006a29020037030020064188016a41106a200241cc006a29020037030020064188016a41186a200241d4006a280200360200200620022f00353b01a40120062002413c6a29020037038801200241346a2d00002109200241386a280200210a02400240200628025c220b41244b0d00200641e1006a210c0c010b2008280200210b200641d8006a410c6a280200210c0b20062006280258220d3602b0012006200c3602a8012006280214210e2006280218210f2006200b3602ac01200b4101742210200d6b2211200e410174200f6b2202200220114b1b2212450d0541002102200628021021130340200f20026a22084101762214200e4f0d07200d20026a22154101762216200b4f0d08201320146a2d00002214410f71201441f0017141047620084101711b200c20166a2d00002208410f71200841047620154101711b470d05200241016a22022012490d000b201221020c1f0b4101211520062802142203200628021822084101762202490d0720064180046a200628021020026a200320026b10bc05200641386a41086a20064194046a290200370300200641c8006a2006419c046a290200370300200641d0006a200641a4046a29020037030020062006418c046a2902003703382008410171210220064180046a41086a2802002114200628028404210b20062802800421032004290204211720042802002111410021080c220b200241106a280200210d2002410c6a280200210c200241086a280200211620022802042102024002402006280214221441017420062802182208460d00200841017622152014490d012015201441d8bbc7001032000b0240024020160d002004280208211420042802002103410021080c010b2004280200210341002108200d20042802082214470d000240024020032016470d00410121080c010b20162003200d10d2064521080b200d21140b2004280204210b024020052802002215450d00200541046a280200450d00201510260b2005200c36020420052016360200200541086a200d360200200641386a41086a20064180046a41086a290200370300200641386a41106a20064180046a41106a290200370300200641386a41186a20064180046a41186a290200370300200641206a41086a20064198036a41086a290200370300200641206a41106a20064198036a41106a28020036020020062006290280043703382006200629029803370320410321150c220b200628021020156a2d000021142003200328020841016a36020820022014410f71201441047620084101711b221541246c6a22142902102118201420062903900437021020142902082119201420062903880437020820142902002117200641023a0080042014200629038004370200201441186a2208290200211a200820062903980437020002400240024002402017a741ff01714102470d002003280204220b200328020822054101762208490d0b20064198036a200328020020086a200b20086b10bc052006418c046a20062902980337020020064194046a20064198036a41086a2902003702002006419c046a200641a8036a29020037020020064180046a41246a200641b0036a290200370200200641ac046a20064198036a41206a290200370200200641b4046a200641c0036a280200360200200641b8046a2004290200370300200641c0046a200441086a280200360200200641013602840420064180046a41086a200541017136020041002108200641003a0080042002201541246c6a41046a200141206a20064180046a108704360200201441003a00000c010b200641a0046a201428022036020020064180046a41186a201a37030020062019370388042006201737038004200620183703900420064198036a41086a200441086a2802003602002006200429020037039803200641c0026a200120064180046a200320064198036a200510b90520062802c402210320062802c0024101460d01200641c0026a41086a2d0000210441002108201441003a00002002201541246c6a41046a2003360200200441ff0171450d020b4103211520162103200c210b200d21140c230b200041013602002000200336020402402016450d00200c450d00201610260b200210260c200b2000428080808010370200200041186a200d360200200041146a200c360200200041106a20163602002000410c6a2002360200200041086a4103360200200724000f0b200641c0036a2002412c6a290200370300200641b8036a200241246a290200370300200641b0036a2002411c6a290200370300200641a8036a2208200241146a29020037030020064198036a41086a2002410c6a2902003703002006200229020437039803200241346a2802002111200241386a280200210a2002413c6a280200211b200241c0006a280200211c02400240200628029c03220b41244b0d00200641a1036a210c0c010b2008280200210b20064198036a410c6a280200210c0b2006200628029803220d360290012006200c360288012006280214210e2006280218210f2006200b36028c01410021020240200b410174200d6b2209200e410174200f6b2210201020094b1b2212450d00200628021021130340200f20026a22084101762214200e4f0d09200d20026a22154101762216200b4f0d0a201320146a2d00002214410f71201441f0017141047620084101711b200c20166a2d00002208410f71200841047620154101711b470d01200241016a22022012490d000b201221020b024002400240024020022009470d0020092010460d010b20022009490d01200f20026a22144101762208200e490d022008200e41d8bbc7001032000b410021080240200a450d00201c2004280208470d00024020042802002202200a470d00410121080c010b200a2002201c10d2064521080b200b200d4101762202490d0b20064180046a200c20026a200b20026b10bc05200641c0026a41086a221520064194046a290200370300200641c0026a41106a220c2006419c046a290200370300200641c0026a41186a220e200641a4046a29020037030020062006418c046a2902003703c002200d410171210220064180046a41086a220d2802002114200628028404210b20062802800421032004280208211620042902002117024020052802002204450d00200541046a280200450d00200410260b2005201b3602042005200a360200200541086a201c360200200641386a41086a2015290300370300200641386a41106a200c290300370300200641386a41186a200e290300370300200641206a41086a200d290200370300200641206a41106a20064180046a41106a280200360200200620062903c00237033820062006290280043703200c1c0b200b200d200241016a22126a22084101762203490d0b200641d8006a200c20036a200b20036b10bc05200641e8016a41086a2214200641d8006a41086a290300370300200641e8016a41106a2216200641d8006a41106a290300370300200641e8016a41186a2205200641d8006a41186a290300370300200641e8016a41206a220e200641d8006a41206a290300370300200641e8016a41286a220f200641d8006a41286a280200360200200620062903583703e801200d20026a220d4101762203200b4f0d0c200c20036a2d0000210310bf05211520064180046a41086a20084101713602002006418c046a220b20062903e80137020020064194046a20142903003702002006419c046a201629030037020020064180046a41246a2005290300370200200641ac046a200e290300370200200641b4046a200f280200360200200641c4046a201c360200200641c0046a201b360200200641bc046a200a360200200641b8046a20113602002006410436028404200641c8046a20062902b801370300200641d0046a200641b8016a41086a290200370300200641d8046a200641b8016a41106a28020036020041002108200641003a00800420152003410f712003410476200d4101711b41246c6a2203200141206a221620064180046a108704360204200341003a00000240024020062802142203410174200628021822146b2002460d00201420026a220b410176220d2003490d01200d200341d8bbc7001032000b20064180046a20064188016a200210c005200641386a41086a20064180046a41186a290300370300200641386a41106a200641a0046a290300370300200641386a41186a200641a8046a290300370300200620064180046a41106a290300370338200b280200211420064180046a41086a280200210b200428020821162004290200211720062802840421032006280280042102201521110c1c0b2003201420126a22054101762208490d0d2006280210220c200d6a2d00002114200641c0026a200c20086a200320086b10bc052006418c046a220320062902c00237020020064194046a200641c0026a41086a2902003702002006419c046a200641c0026a41106a29020037020020064180046a41246a200641c0026a41186a290200370200200641ac046a200641c0026a41206a290200370200200641b4046a200641c0026a41286a280200360200200641b8046a2004290200370300200641c0046a200441086a280200360200200641013602840420064180046a41086a2204200541017136020041002108200641003a00800420152014410f71201441f00171410476200b4101711b41246c6a2214201620064180046a108704360204201441003a000020064180046a20064188016a200210c005200641386a41086a20064180046a41186a290300370300200641386a41106a20064180046a41206a290300370300200641386a41186a20064180046a41286a290300370300200620064180046a41106a290300370338200328020021142004280200210b2006280284042103200628028004210242002117201521110c1b0b200628021020086a2d000021082003200220032802086a41016a36020820112008410f71200841047620144101711b221441246c6a22022902102118200220062903900437021020022902082119200220062903880437020820022902002117200641023a0080042002200629038004370200200241186a2208290200211a200820062903980437020002402017a741ff01714102470d0020032802042215200328020822164101762208490d0e200641c0026a200328020020086a201520086b10bc052006418c046a20062902c00237020020064194046a200641c0026a41086a2902003702002006419c046a200641d0026a29020037020020064180046a41246a200641d8026a290200370200200641ac046a200641c0026a41206a290200370200200641b4046a200641e8026a280200360200200641b8046a2004290200370300200641c0046a200441086a280200360200200641013602840420064180046a41086a2016410171360200200641003a0080042011201441246c6a41046a200141206a20064180046a108704360200200241003a00000c1a0b200641a0046a200228022036020020064180046a41186a201a370300200620193703880420062017370380042006201837039004200641c0026a41086a200441086a280200360200200620042902003703c002200641e8016a200120064180046a2003200641c0026a200510b90520062802ec0121030240024020062802e8014101460d00200641e8016a41086a2d00002108200241003a00002011201441246c6a41046a2003360200200841ff01710d1b200b200d4101762202490d1020064180046a200c20026a200b20026b10bc052000410c6a200d41017136020020004281808080c000370204200041c8006a201c360200200041c4006a201b360200200041c0006a200a3602002000413c6a2011360200200041106a200629028004370200200041186a20064188046a290200370200200041206a20064180046a41106a290200370200200041286a20064180046a41186a290200370200200041306a20064180046a41206a290200370200200041386a20064180046a41286a280200360200200041003602000c010b20004101360200200020033602040240200a450d00201b450d00200a10260b201110260b200628029c0341244d0d1e200641a4036a2802001026200724000f0b200641e8026a2002412c6a290200370300200641e0026a200241246a290200370300200641d8026a2002411c6a290200370300200641d0026a2208200241146a290200370300200641c0026a41086a2002410c6a290200370300200620022902043703c0022002413c6a280200210a200241386a280200211c200241346a28020021100240024020062802c402220b41244b0d00200641c9026a210d0c010b2008280200210b200641c0026a410c6a280200210d0b410021020240200b41017420062802c002220c6b22112006280214220e4101742006280218220f6b2209200920114b1b2212450d00200628021021130340200f20026a22084101762214200e4f0d10200c20026a22154101762216200b4f0d11201320146a2d00002214410f71201441f0017141047620084101711b200d20166a2d00002208410f71200841047620154101711b470d01200241016a22022012490d000b201221020b0240024002400240024020022011470d0020112009460d010b200220114f0d0210bf052114200c20026a22154101762216200b4f0d14200b201541016a220c4101762208490d15200d20166a2d0000211620064198036a200d20086a200b20086b10bc052006418c046a220b20062902980337020020064180046a41146a220d20064198036a41086a220e29020037020020064180046a411c6a220f20064198036a41106a221229020037020020064180046a41246a221320064198036a41186a29020037020020064180046a412c6a221120064198036a41206a29020037020020064180046a41346a220920064198036a41286a280200360200200641c0046a221b200a360200200641bc046a220a201c36020020064180046a41386a2010360200200641013602840420064180046a41086a2210200c41017136020041002108200641003a00800420142016410f71201641047620154101711b41246c6a2215200141206a20064180046a108704360204201541003a000020064180046a200641106a200210c005200641a8016a41086a2202200b280200360200200641d8006a41086a221520064180046a41186a2216290300370300200641d8006a41106a220c20064180046a41206a290300370300200641d8006a41186a221c20064180046a41286a29030037030020062006290284043703a801200620064180046a41106a221d290300370358200620062802800436029c032006410436029803200e20062903a8013703002012200228020036020020064198036a41386a410036020020064198036a41346a201436020020064198036a41146a200629035837020020064198036a411c6a201529030037020020064198036a41246a200c29030037020020064198036a412c6a201c290300370200200641dc036a20062902880137020020064198036a41cc006a20064188016a41086a29020037020020064198036a41d4006a20064188016a41106a280200360200200641f0036a41086a200441086a280200360200200620042902003703f00320064180046a200120064198036a2003200641f0036a200510bb05200641e8016a41086a22052013290200370300200641e8016a41106a220c2011290200370300200641e8016a41186a220e20092902003703002006200f2902003703e80120102802002115200b2802002102201d2802002103200d280200210b20162802002114200a2802002111201b2903002117200641c8046a2802002116200628028404210d2006280280042104200641b8016a41106a220f200641dc046a280200360200200641b8016a41086a221220064180046a41d4006a290200370300200620064180046a41cc006a2902003703b80120044101460d01200641386a41186a200e290300370300200641386a41106a200c290300370300200641386a41086a2005290300370300200641206a41086a2012290300370300200641206a41106a200f280200360200200620062903e801370338200620062903b8013703200c030b410021020240200a2004280208470d000240201020042802002202470d00410121020c010b20102002200a10d2064521020b024020052802002203450d00200541046a280200450d00200310260b2005201c36020420052010360200200541086a200a360200024020020d00200620062802c0023602800420064180046a41047221140240024020062802c402220341244b0d00200641c9026a21020c010b200641d0026a2802002103200641cc026a28020021020b4100210820064180046a41086a221541003a0000200641003602840420142002200220036a10cc04200641386a41086a20064180046a41186a290300370300200641386a41106a200641a0046a290300370300200641386a41186a200641a8046a290300370300200641206a41086a20064198036a41086a290200370300200641206a41106a20064198036a41106a280200360200200620064180046a41106a29030037033820062006290298033703202006418c046a28020021142015280200210b200429020421172004280200211120062802840421032006280280042102410121150c030b200620062802c0023602800420064180046a41047221080240024020062802c402220341244b0d00200641c9026a21020c010b200641d0026a2802002103200641cc026a28020021020b20064180046a41086a221541003a0000200641003602840420082002200220036a10cc04200641386a41086a20064180046a41186a290300370300200641386a41106a200641a0046a290300370300200641386a41186a200641a8046a290300370300200641206a41086a20064198036a41086a290200370300200641206a41106a20064198036a41106a280200360200200620064180046a41106a29030037033820062006290298033703202006418c046a28020021142015280200210b20042902042117200428020021112006280284042103200628028004210241012115410121080c020b200041013602002000200d3602040c190b200b200c4101762202490d13200641e8016a200d20026a200b20026b10bc0510bf05210220064198036a41086a20062902e80137030020064198036a41106a200641e8016a41086a29020037030020064198036a41186a200641e8016a41106a29020037030020064198036a41206a200641e8016a41186a29020037030020064198036a41286a200641e8016a41206a290200370300200641c8036a200641e8016a41286a28020036020020064198036a41c0006a200a36020020064198036a413c6a201c360200200641d0036a201036020020064198036a41346a20023602002006200c41017136029c03200641043602980320064188016a41086a200441086a280200360200200620042902003703880120064180046a200120064198036a200320064188016a200510bb05200641d8006a41086a2204200641a4046a290200370300200641d8006a41106a220d200641ac046a290200370300200641d8006a41186a220520064180046a41346a29020037030020062006419c046a29020037035820064180046a41086a28020021152006418c046a280200210220064180046a41106a280200210320064194046a280200210b20064180046a41186a280200211420064180046a413c6a280200211120064180046a41c0006a2903002117200641c8046a2802002116200628028404210c2006280280042108200641b8016a41106a220e200641dc046a280200360200200641b8016a41086a220f200641d4046a2902003703002006200641cc046a2902003703b80120084101460d14200641386a41186a2005290300370300200641386a41106a200d290300370300200641386a41086a2004290300370300200641206a41086a200f290300370300200641206a41106a200e28020036020020062006290358370338200620062903b801370320410021080b20062802c40241244d0d1f200641cc026a28020010260c1f0b20020d1a0b2010200d460d13200d4101762202200b4f0d12200c20026a2d0000210210bf0521140240024020114101460d00200b200d41016a22154101762208490d1620064198036a200c20086a200b20086b10bc0520064180046a41086a20154101713602002006418c046a20062902980337020020064194046a20064198036a41086a2902003702002006419c046a20064198036a41106a290200370200200641a4046a20064198036a41186a290200370200200641ac046a20064198036a41206a290200370200200641b4046a200641c0036a280200360200200641b8046a20093a0000200641b9046a20062f01a4013b00002006410236028404200641bb046a200641a4016a41026a2d00003a0000200641bc046a200a360200200641c0046a200629038801370300200641c8046a20064188016a41086a290300370300200641d0046a20064188016a41106a290300370300200641d8046a20064188016a41186a28020036020041002109200641003a008004200141206a20064180046a108704210a0c010b20064198036a41026a200641a4016a41026a2d00003a000020064180046a41086a20064188016a41086a29030037030020064180046a41106a20064188016a41106a29030037030020064180046a41186a20064188016a41186a280200360200200620062f01a4013b0198032006200629038801370380040b20142002410f712002410476200d4101711b41246c6a220220093a0000200220062f0198033b00012002200a3602042002200629038004370208200241036a2006419a036a2d00003a0000200241106a20064180046a41086a2215290300370200200241186a20064180046a41106a2216290300370200200241206a20064180046a41186a220d2802003602004100210820064198036a41086a41003602002006201436029c032006410336029803200641b8016a41086a200441086a280200360200200620042902003703b80120064180046a200120064198036a2003200641b8016a200510bb05200641c0026a41086a220520064180046a41246a290200370300200641c0026a41106a220c200641ac046a290200370300200641c0026a41186a220e200641b4046a29020037030020062006419c046a2902003703c002201528020021152006418c046a28020021022016280200210320064194046a280200210b200d2802002114200641bc046a2802002111200641c0046a2903002117200641c8046a2802002116200628028404210d2006280280042104200641e8016a41106a220f200641dc046a280200360200200641e8016a41086a2212200641d4046a2902003703002006200641cc046a2902003703e801024020044101460d00200641386a41186a200e290300370300200641386a41106a200c290300370300200641386a41086a2005290300370300200641206a41086a2012290300370300200641206a41106a200f280200360200200620062903c002370338200620062903e8013703200c1d0b200041013602002000200d3602040c1a0b2014200e41d8bbc7001032000b2016200b41d8bbc7001032000b2002200341e8bbc7001048000b2008200b41e8bbc7001048000b2014200e41d8bbc7001032000b2016200b41d8bbc7001032000b2002200b41e8bbc7001048000b2003200b41e8bbc7001048000b2003200b41d8bbc7001032000b2008200341e8bbc7001048000b2008201541e8bbc7001048000b2002200b41e8bbc7001048000b2014200e41d8bbc7001032000b2016200b41d8bbc7001032000b2016200b41d8bbc7001032000b2008200b41e8bbc7001048000b2002200b41e8bbc7001048000b200041013602002000200c3602040c030b2002200b41d8bbc7001032000b41c88cc600412a41dcbcc700102f000b2008200b41e8bbc7001048000b20062802c40241244d0d05200641cc026a2802001026200724000f0b200b200d4101762202490d0120064180046a200c20026a200b20026b10bc05200641386a41086a20064194046a290200370300200641c8006a2006419c046a290200370300200641d0006a200641a4046a29020037030020062006418c046a290200370338200d4101712102201bad422086200aad84211720064180046a41086a2802002114200628028404210b200628028004210341002108201c21160b0240200628029c0341244d0d00200641a4036a28020010260b410421150c050b2002200b41e8bbc7001048000b024002400240024020022011460d00200b200d20026a22144101762208490d02200641b8016a200c20086a200b20086b10bc052003200328020820026a36020820064198036a41086a220820062902b80137030020064198036a41106a2216200641b8016a41086a29020037030020064198036a41186a220b200641b8016a41106a29020037030020064198036a41206a220d200641b8016a41186a29020037030020064198036a41286a220c200641b8016a41206a290200370300200641c8036a200641b8016a41286a280200360200200641cc036a20093a00002006201441017136029c03410221152006410236029803200641cf036a200641a4016a41026a2d00003a0000200620062f01a4013b00cd03200641d0036a200a360200200641ec036a20064188016a41186a280200360200200641e4036a20064188016a41106a290300370200200641dc036a20064188016a41086a290300370200200641d4036a200629038801370200200641f0036a41086a200441086a280200360200200620042902003703f00320064180046a200120064198036a2003200641f0036a200510bb0520062802840421142006280280042103200641c0026a20064180046a41086a41d80010cf061a20034101460d01200641e8016a200641c0026a41d80010cf061a20064198036a200641a8016a200210c00520064180046a410472200641e8016a41d80010cf061a41002111200641003a008004200141206a20064180046a1087042102200641386a41086a200b290300370300200641386a41106a200d290300370300200641386a41186a200c290300370300200620162903003703382002ad21172008280200210b200641a4036a28020021142006280298032102200628029c032103410021080c060b2003200328020820116a36020820064180046a41086a20062903880137030020064180046a41106a20064188016a41086a29030037030020064180046a41186a20064188016a41106a290300370300200641a0046a20064188016a41186a280200360200200620093a008004200620062f01a4013b0081042006200641a6016a2d00003a0083042006200a3602840420064198036a41086a200441086a2802003602002006200429020037039803200641c0026a200120064180046a200320064198036a200510b90520062802c4022115024020062802c0024101460d00200b200d4101762202490d03200641c0026a41086a2d0000210320064180046a200c20026a200b20026b10bc05200641386a41086a20064194046a290200370300200641386a41106a2006419c046a290200370300200641d0006a200641a4046a290200370300200641206a41086a20064198036a41086a290200370300200641206a41106a20064198036a41106a28020036020020062006418c046a2902003703382006200629029803370320200d4101712102200341ff017145210820064180046a41086a2802002114200628028404210b20062802800421032015ad211741022115410021110c060b20004101360200200020153602040c030b20004101360200200020143602040c020b2008200b41e8bbc7001048000b2002200b41e8bbc7001048000b200628025c41244d0d00200641e4006a2802001026200724000f0b200724000f0b200628025c41244d0d00200641e4006a28020010260b20002008360204200041186a2014360200200041146a200b360200200041106a20033602002000410c6a2002360200200041086a20153602002000411c6a2006290338370200200041c8006a2016360200200041c0006a20173702002000413c6a2011360200200041cc006a2006290320370200200041246a200641386a41086a2903003702002000412c6a200641386a41106a290300370200200041346a200641386a41186a290300370200200041d4006a200641206a41086a290300370200200041dc006a200641206a41106a28020036020020004100360200200724000bda0301077f230041106b22032400200041003a00042000410036020020032000200210cd040240024020032802004101470d00200341086a2802000d0141c8bcc700411141dcbcc700102f000b41242104024002402000280200220541244b0d00200041056a210620052107200021080c010b2000410c6a22082802002107200041086a2802002106200521040b02400240024020072004490d00200121090c010b2002210520012109024003402005450d01200620076a20092d00003a00002005417f6a2105200941016a2109200741016a220720044f0d020c000b0b200820073602000c010b20082007360200200120026a22022009460d00200941016a2105200041056a21082000410c6a210120092d000021040340024002402000280200220941244b0d0041242106200921070c010b20012802002107200921060b024020072006470d0020032000410110cd04024020032802004101470d00200341086a2802000d0441c8bcc700411141dcbcc700102f000b200028020021090b02400240200941244b0d0020082109200021060c010b20002802082109200121060b2006200741016a360200200920076a20043a000020022005460d0120052d00002104200541016a21050c000b0b200341106a24000f0b102c000bba0703017f027e177f230041c0016b22022400200241086a200141d00010cf061a200041086a290300210320002903002104200241003602702002200337036820022004370360200241086a200241e0006a10b902200229036022032003200229036822048520048920022802704101461b2203421988a7220541ff007141818284086c2106200041106a2107200041146a28020021082002412d6a2109200241346a280200210a200241306a280200210b2002280228220c41244b210d200241d4006a2d000041ff0171210e200241086a41cd006a2d000041ff0171210f200028021022102003a72211712212211341002114024003400240200820136a28000022152006732201417f73200141fffdfb776a71418081828478712201450d000240034002400240200241086a2008410020016841037620136a2010716b41d0006c6a221641b07f6a2217460d00200241086a2017412010d2060d010b201641506a211802400240200d0d0020092119200c211a0c010b200b2119200a211a0b024002402018280200221b41244b0d00201841056a21180c010b2016415c6a280200211b201641586a28020021180b201a201b470d00024020192018460d0020192018201a10d2060d010b200e2016417c6a2d0000470d00200e450d02200f201741cd006a2d000041ff0171460d020b2001417f6a2001712201450d020c000b0b200c41244d0d02200b10260c020b201441046a221420136a2010712113201520154101747141808182847871450d000b2002200036025c200241e0006a200241086a41d00010cf061a4104210103402012221620016a2010712112200141046a2101200820166a280000418081828478712217450d000b0240200820176841037620166a20107122016a2c000022164100480d0020082008280200418081828478716841037622016a2d000021160b200041186a2802002117024020164101712218450d0020170d00200241b0016a2007200241dc006a10b802200028021022102011712116200041146a28020021084104210103402016221720016a2010712116200141046a2101200820176a28000041808182847871221b450d000b02402008201b6841037620176a20107122016a2c00004100480d002008280200418081828478716841037621010b200028021821170b2000201720186b360218200820016a200541ff007122163a000020102001417c6a7120086a41046a20163a00002008410020016b41d0006c6a41b07f6a200241e0006a41d00010cf061a2000411c6a2201200128020041016a3602000b200241c0016a24000bb80801047f230041f0026b220424000240024002400240024002400240024020022802004101470d00200241086a280200210520022802042102200441d0016a41186a200141186a290000370300200441d0016a41106a200141106a290000370300200441d0016a41086a200141086a290000370300200420012900003703d001200441f0016a200441d0016a20022005200310ba0520042802f401210120042802f0012102200441f8006a200441f0016a41086a220541d40010cf061a20024101460d03200441246a200441f8006a41d40010cf061a200420013602f4012005200441246a41d40010cf061a41002102200441003a00f0012003200441f0016a10870421010c010b2002280204210302400240200241086a28020022024120460d00200441f0016a41086a200141086a290000370300200441f0016a41106a200141106a290000370300200441f0016a41186a200141186a290000370300200420012900003703f0012002417f4c0d050240024020020d0041012101410021050c010b200210242201450d07200221050b200441003602d801200420013602d001200420053602d401200441d0016a4100200210c90120042802d00120042802d80122016a2003200210cf061a2004412f6a200120026a360000200420042903d001370027413010242201450d07200141043a0000200120042903f00137000120012004290024370021200141096a200441f8016a290300370000200141116a20044180026a290300370000200141196a20044188026a290300370000200141286a2004412b6a290000370000410121020c010b200441246a41026a200341026a2d00003a0000200441f0016a41086a2003410f6a29000037030020044180026a200341176a29000037030020044188026a2003411f6a2d00003a0000200420032f00003b0124200420032900073703f00120032800032101410021020b200441206a41026a2203200441246a41026a2d00003a0000200441f8006a41086a2205200441f0016a41086a290300370300200441f8006a41106a2206200441f0016a41106a290300370300200441f8006a41186a2207200441f0016a41186a2d00003a0000200420042f01243b0120200420042903f00137037820020d012004411c6a41026a20032d00003a0000200441086a2005290300370300200441106a2006290300370300200441186a20072d00003a0000200420042f01203b011c20042004290378370300410121020b200020023a000420004100360200200041056a20042f011c3b0000200041086a20013602002000410c6a2004290300370200200041076a2004411e6a2d00003a0000200041146a200441086a2903003702002000411c6a200441106a290300370200200041246a200441186a2802003602000c050b20004101360200200020013602040c040b20004101360200200020013602040c030b1034000b1033000b102c000b200441f0026a24000b800d01027f230041b0046b22002400024041c004102422010d00102c000b200141023a00002001200029008d04370001200141023a0024200120002900ea03370025200141096a2000418d046a41086a290000370000200141116a2000418d046a41106a290000370000200141196a2000418d046a41186a290000370000200141206a2000418d046a411f6a2800003600002001412d6a200041ea036a41086a290000370000200141356a200041ea036a41106a2900003700002001413d6a200041ea036a41186a290000370000200141c4006a200041ea036a411f6a280000360000200141023a0048200141023a006c200120002900c703370049200141d1006a200041c7036a41086a290000370000200141d9006a200041c7036a41106a290000370000200141e1006a200041c7036a41186a290000370000200141e8006a200041c7036a411f6a280000360000200120002900a40337006d200141f5006a200041a4036a41086a290000370000200141fd006a200041a4036a41106a29000037000020014185016a200041a4036a41186a2900003700002001418c016a200041a4036a411f6a280000360000200141023a009001200141023a00b40120012000290081033700910120014199016a20004181036a41086a290000370000200141a1016a20004181036a41106a290000370000200141a9016a20004181036a41186a290000370000200141b0016a20004181036a411f6a280000360000200120002900de023700b501200141bd016a200041de026a41086a290000370000200141c5016a200041de026a41106a290000370000200141cd016a200041de026a41186a290000370000200141d4016a200041de026a411f6a280000360000200141023a00d801200141f8016a200041bb026a411f6a280000360000200141f1016a200041bb026a41186a290000370000200141e9016a200041bb026a41106a290000370000200141e1016a200041bb026a41086a290000370000200120002900bb023700d901200141023a00fc012001419c026a20004198026a411f6a28000036000020014195026a20004198026a41186a2900003700002001418d026a20004198026a41106a29000037000020014185026a20004198026a41086a29000037000020012000290098023700fd01200141023a00a002200141c0026a200041f5016a411f6a280000360000200141b9026a200041f5016a41186a290000370000200141b1026a200041f5016a41106a290000370000200141a9026a200041f5016a41086a290000370000200120002900f5013700a102200141023a00c402200141e4026a200041d2016a411f6a280000360000200141dd026a200041d2016a41186a290000370000200141d5026a200041d2016a41106a290000370000200141cd026a200041d2016a41086a290000370000200120002900d2013700c502200141023a00e80220014188036a200041af016a411f6a28000036000020014181036a200041af016a41186a290000370000200141f9026a200041af016a41106a290000370000200141f1026a200041af016a41086a290000370000200120002900af013700e902200141023a008c03200141ac036a2000418c016a411f6a280000360000200141a5036a2000418c016a41186a2900003700002001419d036a2000418c016a41106a29000037000020014195036a2000418c016a41086a2900003700002001200029008c0137008d03200141023a00b003200141d0036a200041e9006a411f6a280000360000200141c9036a200041e9006a41186a290000370000200141c1036a200041e9006a41106a290000370000200141b9036a200041e9006a41086a290000370000200120002900693700b103200141023a00d403200141f4036a200041c6006a411f6a280000360000200141ed036a200041c6006a41186a290000370000200141e5036a200041c6006a41106a290000370000200141dd036a200041c6006a41086a290000370000200120002900463700d503200141023a00f80320014198046a200041236a411f6a28000036000020014191046a200041236a41186a29000037000020014189046a200041236a41106a29000037000020014181046a200041236a41086a290000370000200120002900233700f903200141023a009c04200141bc046a2000411f6a280000360000200141b5046a200041186a290000370000200141ad046a200041106a290000370000200141a5046a200041086a2900003700002001200029000037009d04200041b0046a240020010bbd0f010a7f230041f0006b2203240002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200141046a2802002204410174200141086a28020022056b20024d0d0020054101762106200520026a220741017621082007410171450d04200841016a22072006490d06200820044f0d072003200128020020066a200720066b10ca06200341dc006a200341286a280200360200200341306a41246a200341206a290300370200200341cc006a200341186a290300370200200341c4006a200341106a2903003702002003413c6a200341086a29030037020020032003290300370234200320024101712201360230200341306a41047221092005410171220520014b0d01200520014f0d17412421052003280234220241244b0d02200921010c030b200420054101762202490d04200341306a200128020020026a200420026b10bc0520002005410171360200200020032903303702042000410c6a200341386a290300370200200041146a200341c0006a2903003702002000411c6a200341c8006a290300370200200041246a200341d0006a2903003702002000412c6a200341d8006a2802003602000c180b2003280234220521010240200541244d0d00200341c0006a28020021010b2001417f6a220a450d132001417e6a210b200341396a210c41002101034002400240200541244b22020d00200c2106200521040c010b20032802402104200328023c21060b200420014d0d07200141016a2104200620016a2d000021060240024020020d00200c2108200521070c010b20032802402107200328023c21080b200720044d0d08200820016a41016a2d000021080240024020020d00200c21020c010b20032802402105200328023c21020b200520014d0d09200220016a20084104762006410474723a0000200328023421050240200b2001460d00200421010c010b0b02400240200541244b0d00200c2101200521020c010b20032802402102200328023c21010b2002200a4d0d092001200a6a2d000021010240200541244d0d0020032802402105200328023c210c0b2005200a4d0d0a200c200a6a21020c140b200341c0006a2101200221050b0240200128020022012005470d00200341e0006a2009410110cd0420032802604101470d00200341e8006a2802000d0a41c8bcc700411141dcbcc700102f000b02400240200328023441244b0d00200341396a2105200921020c010b200341c0006a21022003413c6a28020021050b2002200141016a360200200520016a41003a00002003280234220521010240200541244d0d00200341c0006a28020021010b024020014102490d002001417f6a2101200341396a210c03402001417f6a210202400240200541244b22040d00200c2106200521080c010b20032802402108200328023c21060b200820024d0d0c200620016a417f6a2d000021060240024020040d00200c2108200521070c010b20032802402107200328023c21080b200720014d0d0d200820016a2d000021080240024020040d00200c21040c010b20032802402105200328023c21040b200520014d0d0e200420016a20084104762006410474723a0000200141014b2104200328023421052002210120040d000b0b02400240200541244b0d00200341396a2101200521020c010b200341c0006a28020021022003413c6a28020021010b2002450d0d20012d0000210102400240200541244b0d00200341396a21020c010b200341c0006a28020021052003413c6a28020021020b2005450d0e2002200141f001714104763a00000c130b20082006490d0e20042008490d0f200341306a200128020020066a200820066b10ca0620002005410171360200200020032903303702042000410c6a200341386a290300370200200041146a200341c0006a2903003702002000411c6a200341c8006a290300370200200041246a200341d0006a2903003702002000412c6a200341d8006a2802003602000c140b2002200441e8bbc7001048000b2006200741f8bbc7001048000b2007200441f8bbc7001047000b2001200441e4bfc7001032000b200141016a200741f4bfc7001032000b200120054184c0c7001032000b200a20024194c0c7001032000b200a200541a4c0c7001032000b102c000b2001417f6a200841acbdc7001032000b2001200741bcbdc7001032000b2001200541ccbdc7001032000b4100410041b4c0c7001032000b4100410041c4c0c7001032000b200620084188bcc7001048000b200820044188bcc7001047000b02400240200541244b0d00200341396a2101200521020c010b200341c0006a28020021022003413c6a28020021010b2002450d0220012d0000210102400240200541244b0d00200341396a21020c010b200341c0006a28020021052003413c6a28020021020b20050d004100410041a4c0c7001032000b200220014104743a00000b0240200328023441244d0d00200341c0006a21090b024020092802002201450d0020092001417f6a3602000b20002003290330370200200041286a200341306a41286a290300370200200041206a200341306a41206a290300370200200041186a200341306a41186a290300370200200041106a200341306a41106a290300370200200041086a200341306a41086a2903003702000c010b410041004194c0c7001032000b200341f0006a24000b130020004101360204200041b08dc6003602000bb50904077f017e077f037e230041c0026b22012400200141206a22024200370300200141186a22034200370300200141086a41086a420037030020014200370308200141086a41868cc700410410fb01200141d8016a41dc9dc600410b10fb012002200141d8016a41086a290000370300200320012900d8013703002001412036022c2001200141086a360228200141306a200141086a412010820202400240200128023022040d00410021050c010b200128023421062001200141306a41086a280200360244200120043602402001200141c0006a108f010240024020012802000d00024002400240024020012802042207200128024441286e2202200220074b1bad42287e2208422088a70d002008a72202417f4c0d000240024020020d00410821050c010b200210242205450d020b4100210920014100360250200120053602482001200241286e36024c0240024002402007450d004100210a034041002102200141003a00f801200a41016a210a2001280244210b417f21030340200b2002460d03200141d8016a20026a2001280240220c2d00003a00002001200b20036a3602442001200c41016a3602402001200241016a220d3a00f8012003417f6a2103200d2102200d4120470d000b200141a0026a41186a2202200141d8016a41186a290300370300200141a0026a41106a2203200141d8016a41106a290300370300200141a0026a41086a220e200141d8016a41086a290300370300200120012903d8013703a002200d41ff01714120490d03200141b8016a41086a220f200e290300370300200141b8016a41106a220e2003290300370300200141b8016a41186a22032002290300370300200120012903a0023703b801200b200d6b22024108490d03200141f8006a41086a200f2903002208370300200141f8006a41106a200e2903002210370300200141f8006a41186a20032903002211370300200141d8006a41086a22032008370300200141d8006a41106a220d2010370300200141d8006a41186a220b2011370300200c29000121082001200c41096a3602402001200241786a360244200120012903b80122103703782001201037035802402009200128024c470d00200141c8006a2009410110900120012802482105200128025021090b2005200941286c6a2202200129035837030020032903002110200d2903002111200b290300211220022008370320200241186a2012370300200241106a2011370300200241086a20103703002001200941016a2209360250200a2007470d000b0b200129024c21082005450d060c070b200241ff0171450d00200141003a00f8010b200128024c2202450d03200241286c0d020c030b1034000b1033000b200510260b0b41002105200141003602a802200142013703a0022001410e360284022001200141286a360280022001200141a0026a3602b801200141ec016a4101360200200142013702dc012001418c8dc6003602d801200120014180026a3602e801200141b8016a41c4e1c000200141d8016a10351a20012802a00220012802a80210840220012802a402450d0020012802a00210260b2006450d00200410260b0240024020050d0020004100360208200042083702000c010b20002008370204200020053602000b200141c0026a24000bcc6a05017f1a7e037f097e067f230041d01f6b22022400200131001221032001310011210420013100102105200131000f2106200131000d2107200131000e2108200131001f2109200131001e210a200131001d210b200131001c210c200131001b210d200131001a210e200131000c210f200131000b2110200131000a211120013100092112200131000721132001310008211420013100192115200131001821162001310017211720013100162118200131001321192001310014211a2001310015211b200220013500002001310004422086842001310005422886842001310006221c4230868442ffffffffffffff03833703801c20022019201a42088684201b4210868420184218868420174220868420164228868420154230868442018842ffffffffffffff03833703981c2002201c201342088684201442108684201242188684201142208684201042288684200f4230868442038842ffffffffffffff03833703881c20022016201542088684200e42108684200d42188684200c42208684200b42288684200a42308684200942388684420c8842ffffffffffffff03833703a01c2002200f20074208868420084210868420064218868420054220868420044228868420034230868420194238868442068842ffffffffffffff03833703901c200241a81c6a200241801c6a10644100211d4101211e03402001201d6a2d0000200241a81c6a201d6a2d000073221f4100201f6b72417f73418001714107761066201e71211e201d41016a221d4120470d000b201e1066211d200241881f6a200241801c6a106420022d00881f4101711066211e024002400240201d41ff0171450d00201e41ff01714101460d00200241c81c6a200241801c6a41011067200242f0ffffffffffff3f20022903e81c7d220f42ffffffffffffff038342f0ffffffffffff3f20022903e01c7d22154233887c3703901d2002201542ffffffffffffff038342f0ffffffffffff3f20022903d81c22157d22164233887c3703881d2002201642ffffffffffffff038342f0ffffffffffff3f20022903d01c22167d22194233887c3703801d2002201942ffffffffffffff038342d1fdffffffffff3f20022903c81c22197d22034233887c3703f81c2002200f42338842137e200342ffffffffffffff03837c3703f01c200242003703b01d200242003703b81d2002201942017c3703981d200220163703a01d200220153703a81d200220022903e01c3703b01d200220022903b81d20022903e81c7c3703b81d200241c01d6a200241981d6a41011067200241b81e6a200241f01c6a41011067200241e8186a20022903c01e220f420042ca8e9ae5dec6ac02420010cc0620024198186a20022903c81e221642137e22054200428092f58893f9b701420010cc06200241c8176a20022903d01e220342137e2204420042c486ffe299c731420010cc06200241f8166a20022903d81e220642137e2219420042d6fff8ffd98b8601420010cc0620024188166a20022903b81e2215420042c2a2aaa7fcfa9503420010cc06200241f8156a2015420042ca8e9ae5dec6ac02420010cc06200241f8186a200f42137e4200428092f58893f9b701420010cc06200241a8186a2005420042c486ffe299c731420010cc06200241d8176a2004420042d6fff8ffd98b8601420010cc0620024188176a2019420042c2a2aaa7fcfa9503420010cc0620024188186a2016420042ca8e9ae5dec6ac02420010cc06200241b8176a20044200428092f58893f9b701420010cc06200241e8166a2019420042c486ffe299c731420010cc0620024198166a2015420042d6fff8ffd98b8601420010cc06200241d8186a200f420042c2a2aaa7fcfa9503420010cc06200241a8176a2003420042ca8e9ae5dec6ac02420010cc06200241d8166a20194200428092f58893f9b701420010cc06200241a8166a2015420042c486ffe299c731420010cc06200241c8186a200f420042d6fff8ffd98b8601420010cc06200241f8176a2016420042c2a2aaa7fcfa9503420010cc06200241c8166a2006420042ca8e9ae5dec6ac02420010cc06200241b8166a20154200428092f58893f9b701420010cc06200241b8186a200f420042c486ffe299c731420010cc06200241e8176a2016420042d6fff8ffd98b8601420010cc0620024198176a2003420042c2a2aaa7fcfa9503420010cc06200241d8156a20022903b816221420022903c8167c220f20022903b8187c221520022903e8177c22162002290398177c221920022903d816221720022903a8177c220320022903a8167c220420022903c8187c220520022903f8177c220620022903b81722182002290388187c220720022903e8167c22082002290398167c220920022903d8187c220a200229039818221a20022903e8187c220b20022903c8177c220c20022903f8167c220d2002290388167c220e20022903f818221b20022903f8157c221020022903a8187c221120022903d8177c22122002290388177c2213423388200241f8186a41086a290300200241f8156a41086a2903007c2010201b54ad7c200241a8186a41086a2903007c2011201054ad7c200241d8176a41086a2903007c2012201154ad7c20024188176a41086a2903007c2013201254ad7c420d86847c221042338820024198186a41086a290300200241e8186a41086a2903007c200b201a54ad7c200241c8176a41086a2903007c200c200b54ad7c200241f8166a41086a2903007c200d200c54ad7c20024188166a41086a2903007c200e200d54ad7c2010200e54ad7c420d86847c220b423388200241b8176a41086a29030020024188186a41086a2903007c2007201854ad7c200241e8166a41086a2903007c2008200754ad7c20024198166a41086a2903007c2009200854ad7c200241d8186a41086a2903007c200a200954ad7c200b200a54ad7c420d86847c2207423388200241d8166a41086a290300200241a8176a41086a2903007c2003201754ad7c200241a8166a41086a2903007c2004200354ad7c200241c8186a41086a2903007c2005200454ad7c200241f8176a41086a2903007c2006200554ad7c2007200654ad7c420d86847c220542ffffffffffffff038320022903e01d22067d42f0ffffffffffff3f7c220842ffffffffffffff0383200742ffffffffffffff038320022903d81d22047d42f0ffffffffffff3f7c22074233887c220c420020022903d01d220342137e2209420010cc06200241e8136a200842338842137e2005423388200241b8166a41086a290300200241c8166a41086a2903007c200f201454ad7c200241b8186a41086a2903007c2015200f54ad7c200241e8176a41086a2903007c2016201554ad7c20024198176a41086a2903007c2019201654ad7c2005201954ad7c420d868442137e201342feffffffffffff03837c221542ffffffffffffff038320022903c01d22167d42d0fdffffffffff3f7c220d42ffffffffffffff03837c220f420020022903c81d2219420010cc0620024188156a200742ffffffffffffff0383200b42ffffffffffffff038320037d42f0ffffffffffff3f7c22054233887c220a4200200442137e2207420010cc06200241b8146a200542ffffffffffffff03832015423388201042ffffffffffffff03837c20197d42f0ffffffffffff3f7c22154233887c22084200200642137e2205420010cc0620024198136a201542ffffffffffffff0383200d4233887c221542002016420010cc06200241e8156a200c4200201942137e420010cc06200241f8136a20164200200f420010cc0620024198156a200a42002009420010cc06200241c8146a200842002007420010cc06200241a8136a201542002005420010cc06200241c8156a200c42002007420010cc06200241d8136a200f42002003420010cc06200241f8146a200a42002005420010cc06200241a8146a200842002016420010cc0620024188136a201542002019420010cc06200241b8156a200c42002005420010cc06200241c8136a200f42002004420010cc06200241e8146a200a42002016420010cc0620024198146a200842002019420010cc06200241f8126a201542002003420010cc06200241a8156a200c42002016420010cc06200241b8136a200f42002006420010cc06200241d8146a200a42002019420010cc0620024188146a200842002003420010cc06200241e8126a201542002004420010cc06200220022903c815221120022903d8137c221620022903f8147c221920022903a8147c22032002290388137c220420022903d815221220022903e8137c22052002290388157c220620022903b8147c22072002290398137c220920022903e815221320022903f8137c220b2002290398157c220d20022903c8147c220e20022903a8137c2210423388200241e8156a41086a290300200241f8136a41086a2903007c200b201354ad7c20024198156a41086a2903007c200d200b54ad7c200241c8146a41086a2903007c200e200d54ad7c200241a8136a41086a2903007c2010200e54ad7c420d86847c220b423388200241d8156a41086a290300200241e8136a41086a2903007c2005201254ad7c20024188156a41086a2903007c2006200554ad7c200241b8146a41086a2903007c2007200654ad7c20024198136a41086a2903007c2009200754ad7c200b200954ad7c420d86847c220542ffffffffffffff03833703a01e200220022903b815220e20022903c8137c220620022903e8147c22072002290398147c220920022903f8127c220d2005423388200241c8156a41086a290300200241d8136a41086a2903007c2016201154ad7c200241f8146a41086a2903007c2019201654ad7c200241a8146a41086a2903007c2003201954ad7c20024188136a41086a2903007c2004200354ad7c2005200454ad7c420d86847c221642ffffffffffffff03833703a81e200220022903a815221120022903b8137c221920022903d8147c22032002290388147c220420022903e8127c22052016423388200241b8156a41086a290300200241c8136a41086a2903007c2006200e54ad7c200241e8146a41086a2903007c2007200654ad7c20024198146a41086a2903007c2009200754ad7c200241f8126a41086a2903007c200d200954ad7c2016200d54ad7c420d86847c221642ffffffffffffff03833703b01e20022016423388200241a8156a41086a290300200241b8136a41086a2903007c2019201154ad7c200241d8146a41086a2903007c2003201954ad7c20024188146a41086a2903007c2004200354ad7c200241e8126a41086a2903007c2005200454ad7c2016200554ad7c420d868442137e201042ffffffffffffff03837c221642ffffffffffffff03833703901e20022016423388200b42ffffffffffffff03837c3703981e200241a81f6a41106a4200370300200241a81f6a41186a4200370300200241a81f6a41206a4200370300200242003703b01f200242013703a81f200241b81e6a200241a81f6a200241901e6a106820024198106a20022903c01e2216420020022903a01d2206420010cc06200241a8106a200241e01e6a2903002219420020022903a81d220942137e2210420010cc0620024188116a200241b81e6a41206a221d2903002203420020022903b01d220d42137e220e420010cc06200241e8116a200241b81e6a41186a221e2903002204420020022903b81d221142137e220b420010cc06200241d8126a200241b81e6a41106a221f2903002205420020022903981d2207420010cc0620024198126a200742002016420010cc06200241d80f6a20194200200642137e420010cc06200241b8106a200342002010420010cc0620024198116a20044200200e420010cc06200241f8116a20054200200b420010cc06200241e8106a201642002009420010cc06200241f8106a20194200200e420010cc06200241d8116a20034200200b420010cc06200241c8126a200442002007420010cc0620024188106a200542002006420010cc06200241b8116a20164200200d420010cc06200241c8116a20194200200b420010cc06200241b8126a200342002007420010cc06200241f80f6a200442002006420010cc06200241d8106a200542002009420010cc0620024188126a201642002011420010cc06200241a8126a201942002007420010cc06200241e80f6a200342002006420010cc06200241c8106a200442002009420010cc06200241a8116a20054200200d420010cc06200241980f6a20022903a81222202002290388127c220620022903e80f7c220720022903c8107c220920022903a8117c220b20022903c811222120022903b8117c220d20022903b8127c220e20022903f80f7c221020022903d8107c221120022903f810222220022903e8107c221220022903d8117c221320022903c8127c22142002290388107c221720022903a81022232002290398107c22182002290388117c221a20022903e8117c221b20022903d8127c221c20022903d80f22242002290398127c222520022903b8107c22262002290398117c222720022903f8117c2228423388200241d80f6a41086a29030020024198126a41086a2903007c2025202454ad7c200241b8106a41086a2903007c2026202554ad7c20024198116a41086a2903007c2027202654ad7c200241f8116a41086a2903007c2028202754ad7c420d86847c2225423388200241a8106a41086a29030020024198106a41086a2903007c2018202354ad7c20024188116a41086a2903007c201a201854ad7c200241e8116a41086a2903007c201b201a54ad7c200241d8126a41086a2903007c201c201b54ad7c2025201c54ad7c420d86847c2218423388200241f8106a41086a290300200241e8106a41086a2903007c2012202254ad7c200241d8116a41086a2903007c2013201254ad7c200241c8126a41086a2903007c2014201354ad7c20024188106a41086a2903007c2017201454ad7c2018201754ad7c420d86847c2212423388200241c8116a41086a290300200241b8116a41086a2903007c200d202154ad7c200241b8126a41086a2903007c200e200d54ad7c200241f80f6a41086a2903007c2010200e54ad7c200241d8106a41086a2903007c2011201054ad7c2012201154ad7c420d86847c220e42ffffffffffffff0383220d4200200842137e2211420010cc06200241880d6a200e423388200241a8126a41086a29030020024188126a41086a2903007c2006202054ad7c200241e80f6a41086a2903007c2007200654ad7c200241c8106a41086a2903007c2009200754ad7c200241a8116a41086a2903007c200b200954ad7c200e200b54ad7c420d868442137e202842ffffffffffffff03837c220742ffffffffffffff0383220642002015420010cc06200241d80e6a201242ffffffffffffff0383220b4200200a42137e2210420010cc06200241880e6a201842ffffffffffffff038322094200200c42137e220e420010cc06200241d80d6a2007423388202542ffffffffffffff03837c22074200200f420010cc06200241b8096a200d4200201542137e420010cc06200241980d6a200f42002006420010cc06200241c80e6a200b42002011420010cc06200241f80d6a200942002010420010cc06200241e80d6a20074200200e420010cc06200241a80f6a200d42002010420010cc06200241f80c6a200642002008420010cc06200241e80e6a200b4200200e420010cc06200241980e6a20094200200f420010cc06200241c80d6a200742002015420010cc06200241b80f6a200d4200200e420010cc06200241e80c6a20064200200a420010cc06200241f80e6a200b4200200f420010cc06200241a80e6a200942002015420010cc06200241b80d6a200742002008420010cc06200241c80f6a200d4200200f420010cc06200241d80c6a20064200200c420010cc06200241880f6a200b42002015420010cc06200241b80e6a200942002008420010cc06200241a80d6a20074200200a420010cc0620022d00b81e2129201d200241801c6a41206a222a290300370300201e200241801c6a41186a222b290300370300201f200241801c6a41106a222c2903002208370300200241b81e6a41086a222d200241801c6a41086a222e2903002215370300200220022903801c220f3703b81e2002200f20022903801c7c220f3703b81e202d2015202e2903007c2215370300201f2008202c2903007c2208370300201e201e290300202b2903007c220a370300200241f8096a201d290300202a2903007c220c4200200942137e2211420010cc06200241980c6a200f42002007420010cc06200241a80a6a200a4200200b42137e2210420010cc06200241f80a6a20084200200d42137e220e420010cc06200241c80b6a201542002006420010cc06200241880c6a20064200200f420010cc06200241880a6a200c4200200742137e420010cc06200241980a6a200a42002011420010cc06200241e80a6a200842002010420010cc06200241b80b6a20154200200e420010cc06200241a80c6a200f42002009420010cc06200241e8096a200c42002010420010cc06200241b80a6a200a4200200e420010cc06200241880b6a200842002006420010cc06200241d80b6a201542002007420010cc06200241b80c6a200f4200200b420010cc06200241d8096a200c4200200e420010cc06200241c80a6a200a42002006420010cc06200241980b6a200842002007420010cc06200241e80b6a201542002009420010cc06200241c80c6a200f4200200d420010cc06200241c8096a200c42002006420010cc06200241d80a6a200a42002007420010cc06200241a80b6a200842002009420010cc06200241f80b6a20154200200b420010cc06200241c8076a2019420020022903a80f221820022903f80c7c220f20022903e80e7c221520022903980e7c220720022903c80d7c220820022903980f221220022903880d7c220620022903d80e7c220920022903880e7c220a20022903d80d7c220b20022903b809221320022903980d7c220d20022903c80e7c220e20022903f80d7c221020022903e80d7c2211423388200241b8096a41086a290300200241980d6a41086a2903007c200d201354ad7c200241c80e6a41086a2903007c200e200d54ad7c200241f80d6a41086a2903007c2010200e54ad7c200241e80d6a41086a2903007c2011201054ad7c420d86847c220d423388200241980f6a41086a290300200241880d6a41086a2903007c2006201254ad7c200241d80e6a41086a2903007c2009200654ad7c200241880e6a41086a2903007c200a200954ad7c200241d80d6a41086a2903007c200b200a54ad7c200d200b54ad7c420d86847c220942ffffffffffffff0383220642137e221a420010cc06200241a8076a2016420020022903c80f221b20022903d80c7c220a20022903880f7c220b20022903b80e7c220e20022903a80d7c221020022903b80f221c20022903e80c7c221220022903f80e7c221320022903a80e7c221420022903b80d7c22172009423388200241a80f6a41086a290300200241f80c6a41086a2903007c200f201854ad7c200241e80e6a41086a2903007c2015200f54ad7c200241980e6a41086a2903007c2007201554ad7c200241c80d6a41086a2903007c2008200754ad7c2009200854ad7c420d86847c2215423388200241b80f6a41086a290300200241e80c6a41086a2903007c2012201c54ad7c200241f80e6a41086a2903007c2013201254ad7c200241a80e6a41086a2903007c2014201354ad7c200241b80d6a41086a2903007c2017201454ad7c2015201754ad7c420d86847c2207423388200241c80f6a41086a290300200241d80c6a41086a2903007c200a201b54ad7c200241880f6a41086a2903007c200b200a54ad7c200241b80e6a41086a2903007c200e200b54ad7c200241a80d6a41086a2903007c2010200e54ad7c2007201054ad7c420d868442137e201142ffffffffffffff03837c220a423388200d42ffffffffffffff03837c220f420010cc06200241f8076a20034200201542ffffffffffffff0383220842137e2209420010cc06200241b8086a20044200200742ffffffffffffff0383220b42137e2207420010cc06200241d8066a20054200200a42ffffffffffffff03832215420010cc06200241e8066a201542002016420010cc06200241b8076a20194200200f42137e420010cc06200241d8076a20034200201a420010cc0620024188086a200442002009420010cc06200241c8086a200542002007420010cc06200241d8086a201642002006420010cc06200241e8076a201942002009420010cc06200241a8086a200342002007420010cc06200241c8066a200442002015420010cc0620024198076a20054200200f420010cc0620024188096a201642002008420010cc0620024198086a201942002007420010cc06200241e8056a200342002015420010cc0620024188076a20044200200f420010cc06200241e8086a200542002006420010cc06200241a8096a20164200200b420010cc0620024188056a201942002015420010cc06200241f8066a20034200200f420010cc06200241f8086a200442002006420010cc0620024198096a200542002008420010cc06201d200c370300200220022903c809221420022903c80c7c220f20022903d80a7c221520022903a80b7c221620022903f80b7c221920022903d809221720022903b80c7c220320022903c80a7c220420022903980b7c220520022903e80b7c220620022903e809221820022903a80c7c220720022903b80a7c220820022903880b7c220920022903d80b7c220a20022903f809221a20022903980c7c220b20022903a80a7c220c20022903f80a7c220d20022903c80b7c220e20022903880a221b20022903880c7c221020022903980a7c221120022903e80a7c221220022903b80b7c2213423388200241880a6a41086a290300200241880c6a41086a2903007c2010201b54ad7c200241980a6a41086a2903007c2011201054ad7c200241e80a6a41086a2903007c2012201154ad7c200241b80b6a41086a2903007c2013201254ad7c420d86847c2210423388200241f8096a41086a290300200241980c6a41086a2903007c200b201a54ad7c200241a80a6a41086a2903007c200c200b54ad7c200241f80a6a41086a2903007c200d200c54ad7c200241c80b6a41086a2903007c200e200d54ad7c2010200e54ad7c420d86847c220b423388200241e8096a41086a290300200241a80c6a41086a2903007c2007201854ad7c200241b80a6a41086a2903007c2008200754ad7c200241880b6a41086a2903007c2009200854ad7c200241d80b6a41086a2903007c200a200954ad7c200b200a54ad7c420d86847c2207423388200241d8096a41086a290300200241b80c6a41086a2903007c2003201754ad7c200241c80a6a41086a2903007c2004200354ad7c200241980b6a41086a2903007c2005200454ad7c200241e80b6a41086a2903007c2006200554ad7c2007200654ad7c420d86847c2203423388200241c8096a41086a290300200241c80c6a41086a2903007c200f201454ad7c200241d80a6a41086a2903007c2015200f54ad7c200241a80b6a41086a2903007c2016201554ad7c200241f80b6a41086a2903007c2019201654ad7c2003201954ad7c420d868442137e201342ffffffffffffff03837c220f42ffffffffffffff03833703e81d2002200f423388201042ffffffffffffff03837c3703f01d2002200342ffffffffffffff038322063703881e2002200742ffffffffffffff038322073703801e2002200b42ffffffffffffff038322083703f81d200241c8076a41086a2903002113200241a8076a41086a290300211420022903c807211520022903a8072109200241f8076a41086a290300211720022903f807210b200241b8086a41086a290300211820022903b808210c200241d8066a41086a290300211a20022903d806210d200241e8066a41086a290300211b200241b8076a41086a290300211c20022903e806210e20022903b8072116200241d8076a41086a290300212520022903d807211020024188086a41086a29030021262002290388082111200241c8086a41086a290300212720022903c808211220022903d808210320022903e807211920022903a808210420022903c8062105200229039807210a200241881f6a200241e81d6a106420022d00881f4101711066211d200241f8056a20022903901d220f4200200a20052004201920037c22037c22047c22057c220a200d200c200b201520097c22097c220b7c220c7c220d2012201120102016200e7c220e7c22107c22117c2212423388202720262025201c201b7c200e201654ad7c7c2010200e54ad7c7c2011201054ad7c7c2012201154ad7c420d86847c2216423388201a20182017201320147c2009201554ad7c7c200b200954ad7c7c200c200b54ad7c7c200d200c54ad7c2016200d54ad7c420d86847c220b42ffffffffffffff0383220942137e2218420010cc06200241d8046a20022903f01c22154200200229038805221a20022903a8097c220c20022903f8067c220d20022903f8087c220e2002290398097c2210200229039808221b2002290388097c221120022903e8057c22132002290388077c221420022903e8087c2217200b423388200241e8076a41086a290300200241d8086a41086a2903007c2003201954ad7c200241a8086a41086a2903007c2004200354ad7c200241c8066a41086a2903007c2005200454ad7c20024198076a41086a2903007c200a200554ad7c200b200a54ad7c420d86847c220342338820024198086a41086a29030020024188096a41086a2903007c2011201b54ad7c200241e8056a41086a2903007c2013201154ad7c20024188076a41086a2903007c2014201354ad7c200241e8086a41086a2903007c2017201454ad7c2003201754ad7c420d86847c220442338820024188056a41086a290300200241a8096a41086a2903007c200c201a54ad7c200241f8066a41086a2903007c200d200c54ad7c200241f8086a41086a2903007c200e200d54ad7c20024198096a41086a2903007c2010200e54ad7c2004201054ad7c420d868442137e201242ffffffffffffff03837c2205423388201642ffffffffffffff03837c2216420010cc06200241a8056a20022903881d22194200200342ffffffffffffff0383220b42137e220c420010cc06200241b8036a20022903801d22034200200442ffffffffffffff0383220d42137e220a420010cc0620024188046a20022903f81c22044200200542ffffffffffffff03832205420010cc0620024198046a200542002015420010cc06200241e8046a200f4200201642137e420010cc0620024188066a201942002018420010cc06200241b8056a20034200200c420010cc06200241c8036a20044200200a420010cc0620024198066a201542002009420010cc0620024198056a200f4200200c420010cc06200241a8036a20194200200a420010cc06200241f8036a200342002005420010cc06200241c8046a200442002016420010cc06200241c8056a20154200200b420010cc06200241c8026a200f4200200a420010cc06200241e8036a201942002005420010cc06200241b8046a200342002016420010cc06200241a8066a200442002009420010cc06200241f8046a20154200200d420010cc06200241d8036a200f42002005420010cc06200241a8046a201942002016420010cc06200241b8066a200342002009420010cc06200241d8056a20044200200b420010cc06200241d8026a200642f0ffffffffffff3f20067d221042ffffffffffffff038342f0ffffffffffff3f20077d22174233887c854200201dad42ff01837d220483200685220f420020022903980522182002290398067c221620022903a8037c221920022903f8037c220320022903c8047c220520022903f805221120022903d8047c221520022903a8057c220620022903b8037c22092002290388047c220a20022903e80422122002290398047c220b2002290388067c220c20022903b8057c220d20022903c8037c220e423388200241e8046a41086a29030020024198046a41086a2903007c200b201254ad7c20024188066a41086a2903007c200c200b54ad7c200241b8056a41086a2903007c200d200c54ad7c200241c8036a41086a2903007c200e200d54ad7c420d86847c220b423388200241f8056a41086a290300200241d8046a41086a2903007c2015201154ad7c200241a8056a41086a2903007c2006201554ad7c200241b8036a41086a2903007c2009200654ad7c20024188046a41086a2903007c200a200954ad7c200b200a54ad7c420d86847c220942ffffffffffffff0383220642137e221a420010cc06200241c8016a20022903e81d2215201042338842137e42d0fdffffffffff3f20157d221b42ffffffffffffff03837c852004832015852215420020022903d803221c20022903f8047c220a20022903a8047c220c20022903b8067c220d20022903d8057c221020022903c802222520022903c8057c221120022903e8037c221220022903b8047c221320022903a8067c2214200942338820024198056a41086a29030020024198066a41086a2903007c2016201854ad7c200241a8036a41086a2903007c2019201654ad7c200241f8036a41086a2903007c2003201954ad7c200241c8046a41086a2903007c2005200354ad7c2009200554ad7c420d86847c2203423388200241c8026a41086a290300200241c8056a41086a2903007c2011202554ad7c200241e8036a41086a2903007c2012201154ad7c200241b8046a41086a2903007c2013201254ad7c200241a8066a41086a2903007c2014201354ad7c2003201454ad7c420d86847c2205423388200241d8036a41086a290300200241f8046a41086a2903007c200a201c54ad7c200241a8046a41086a2903007c200c200a54ad7c200241b8066a41086a2903007c200d200c54ad7c200241d8056a41086a2903007c2010200d54ad7c2005201054ad7c420d868442137e200e42ffffffffffffff03837c220c423388200b42ffffffffffffff03837c2216420010cc06200241f8016a2007201742ffffffffffffff038342f0ffffffffffff3f20087d220a4233887c8520048320078522194200200342ffffffffffffff0383220742137e2209420010cc06200241286a2008200a42ffffffffffffff038342f0ffffffffffff3f20022903f01d220a7d220d4233887c8520048320088522034200200542ffffffffffffff0383220b42137e2208420010cc06200241f8006a200a200a200d42ffffffffffffff0383201b4233887c852004838522044200200c42ffffffffffffff03832205420010cc0620024188016a200542002015420010cc06200241d8016a200f4200201642137e420010cc06200241e8026a20194200201a420010cc0620024188026a200342002009420010cc06200241386a200442002008420010cc06200241f8026a201542002006420010cc06200241e8016a200f42002009420010cc06200241186a201942002008420010cc06200241e8006a200342002005420010cc06200241b8016a200442002016420010cc0620024198026a201542002007420010cc06200241086a200f42002008420010cc06200241d8006a201942002005420010cc06200241a8016a200342002016420010cc0620024188036a200442002006420010cc06200241b8026a20154200200b420010cc06200241c8006a200f42002005420010cc0620024198016a201942002016420010cc0620024198036a200342002006420010cc06200241a8026a200442002007420010cc062002200f3703881e200220193703801e200220153703e81d200220043703f01d200220033703f81d200220063703a01e200220073703a81e2002200b3703b01e200220053703901e200220163703981e200220022903e801220b20022903f8027c220f20022903187c221520022903687c221620022903b8017c221920022903d802220c20022903c8017c220320022903f8017c220420022903287c220520022903787c220620022903d801220d2002290388017c220720022903e8027c22082002290388027c220920022903387c220a423388200241d8016a41086a29030020024188016a41086a2903007c2007200d54ad7c200241e8026a41086a2903007c2008200754ad7c20024188026a41086a2903007c2009200854ad7c200241386a41086a2903007c200a200954ad7c420d86847c2207423388200241d8026a41086a290300200241c8016a41086a2903007c2003200c54ad7c200241f8016a41086a2903007c2004200354ad7c200241286a41086a2903007c2005200454ad7c200241f8006a41086a2903007c2006200554ad7c2007200654ad7c420d86847c220342ffffffffffffff03833703b81f2002200229030822092002290398027c220420022903587c220520022903a8017c22062002290388037c22082003423388200241e8016a41086a290300200241f8026a41086a2903007c200f200b54ad7c200241186a41086a2903007c2015200f54ad7c200241e8006a41086a2903007c2016201554ad7c200241b8016a41086a2903007c2019201654ad7c2003201954ad7c420d86847c220f42ffffffffffffff03833703c01f20022002290348220b20022903b8027c22152002290398017c22162002290398037c221920022903a8027c2203200f423388200241086a41086a29030020024198026a41086a2903007c2004200954ad7c200241d8006a41086a2903007c2005200454ad7c200241a8016a41086a2903007c2006200554ad7c20024188036a41086a2903007c2008200654ad7c200f200854ad7c420d86847c220f42ffffffffffffff03833703c81f2002200f423388200241c8006a41086a290300200241b8026a41086a2903007c2015200b54ad7c20024198016a41086a2903007c2016201554ad7c20024198036a41086a2903007c2019201654ad7c200241a8026a41086a2903007c2003201954ad7c200f200354ad7c420d868442137e200a42ffffffffffffff03837c220f42ffffffffffffff03833703a81f2002200f423388200742ffffffffffffff03837c3703b01f4200210f02402029450d00200241881f6a200241a81f6a10644200210f20022d00881f410171106641ff01714101460d00200241d01e6a4200370300200241c81e6a4200370300200241c01e6a4200370300200242003703b81e200241881f6a200241901e6a10644100211d4101211e0340200241b81e6a201d6a2d0000200241881f6a201d6a2d000073221f4100201f6b72417f73418001714107761066201e71211e201d41016a221d4120470d000b4200210f201e106641ff01714101460d00200241b81e6a41206a200241e81d6a41206a290300370300200241b81e6a41186a200241e81d6a41186a290300370300200241b81e6a41106a200241e81d6a41106a290300370300200241b81e6a41086a200241e81d6a41086a290300370300200241e81e6a200241901e6a41086a290300370300200241f01e6a200241901e6a41106a290300370300200241f81e6a200241901e6a41186a290300370300200241801f6a200241901e6a41206a290300370300200220022903e81d3703b81e200220022903901e3703e01e200241881b6a41206a200241a81f6a41206a290300370300200241881b6a41186a200241a81f6a41186a290300370300200241881b6a41106a200241a81f6a41106a290300370300200241881b6a41086a200241a81f6a41086a290300370300200220022903a81f3703881b200241b01b6a200241b81e6a41d00010cf061a4201210f0b200241b81e6a211d200f4200510d01200241b01a6a41036a200241b01b6a41d00010cf061a200241881a6a41206a221d200241881b6a41206a290300370300200241881a6a41186a221e200241881b6a41186a290300370300200241881a6a41106a221f200241881b6a41106a290300370300200241881a6a41086a2229200241881b6a41086a290300370300200220022903881b3703881a200241b5196a200241b01a6a41d30010cf061a20024188196a41206a222a201d29030037030020024188196a41186a221d201e29030037030020024188196a41106a221e201f29030037030020024188196a41086a221f2029290300370300200220022903881a37038819200041086a200241b5196a41036a41d00010cf061a200041e0006a4200370300200041d8006a4201370300200041e8006a4200370300200041f0006a4200370300200041f8006a420037030020004180016a20022903881937000020004188016a201f29030037000020004190016a201e29030037000020004198016a201d290300370000200041a0016a202a290300370000200041a8016a2001290000370000200041b0016a200141086a290000370000200041b8016a200141106a290000370000200041c0016a200141186a2900003700004100211d0c020b200241b81e6a211d0b200241b01a6a410f6a201d410f6a290000370000200241b01a6a41086a201d41086a2900003703002002201d2900003703b01a200241b5196a200241b01a6a41d30010cf061a4101211d200041013a0004200020022900b5193700052000410d6a200241b5196a41086a290000370000200041146a200241b5196a410f6a2900003700000b2000201d360200200241d01f6a24000bc19b0204087f1a7e157f447e230041b0cc006b22022400200241e0c4006a41386a22034200370300200241e0c4006a41306a22044200370300200241e0c4006a41286a22054200370300200241e0c4006a41206a22064200370300200241e0c4006a41186a22074200370300200241e0c4006a41106a22084200370300200241e0c4006a41086a22094200370300200242003703e044200141b7eec6004107200241e0c4006a41c0001083012008310000210a2009310000210b2007310000210c20023100f244210d20023100f144210e20023100ef44210f20023100ed44211020023100ee44211120023100ff44211220023100fe44211320023100fd44211420023100fc44211520023100fb44211620023100fa44211720023100ec44211820023100eb44211920023100ea44211a20023100e944211b20023100e744211c20023100f944211d20023100f744211e20023100f644211f20023100f344212020023100f444212120023100f5442122200220023502e04420023100e4444220868420023100e5444228868420023100e64422234230868442ffffffffffffff03833703a04520022020202142088684202242108684201f42188684201e42208684200c42288684201d4230868442018842ffffffffffffff03833703b84520022023201c42088684200b42108684201b42188684201a4220868420194228868420184230868442038842ffffffffffffff03833703a8452002200c201d42088684201742108684201642188684201542208684201442288684201342308684201242388684420c8842ffffffffffffff03833703c04520022018201042088684201142108684200f42188684200a42208684200e42288684200d4230868420204238868442068842ffffffffffffff03833703b045200241c8c5006a200241a0c5006a1069200241e8c6006a41186a20032903002220370300200241e8c6006a41106a2004290300220a370300200241e8c6006a41086a2005290300220b37030020022006290300220d3703e84620023100fa46210e20023100f946210f20023100f746211020023100f546211120023100f646211220023100874721132002310086472114200231008547211520023100844721162002310083472117200231008247211920023100f446210c20023100f346211a20023100f246211b20023100f146211c20023100ef46211e200231008147211820023100ff46211f20023100fe46212120023100fb46211d20023100fc46212220023100fd4621232002200d42ffffffff0f8320023100ec464220868420023100ed464228868420023100ee46220d4230868442ffffffffffffff0383370388472002201d202242088684202342108684202142188684201f42208684202042ff018322204228868420184230868442018842ffffffffffffff03833703a0472002200d201e42088684200b42ff018342108684201c42188684201b42208684201a42288684200c4230868442038842ffffffffffffff03833703904720022018420886202084201942108684201742188684201642208684201542288684201442308684201342388684420c8842ffffffffffffff03833703a8472002200c201142088684201242108684201042188684200a42ff018342208684200f42288684200e42308684201d4238868442068842ffffffffffffff038337039847200241b0c7006a20024188c7006a1069200241d0c8006a41106a2204200241b0c7006a41386a290300220b370300200241d0c8006a41086a2224200241b0c7006a41306a290300220d20022903b847220e7c3703002004200b20022903c047220f7c370300200241d0c8006a41186a2208200241b0c7006a41c0006a290300221020022903c84722117c370300200241d0c8006a41206a2209200241b0c7006a41c8006a290300221220022903d04722137c370300200220022903d847221420022903b04722157c3703d04820024188cc006a41206a2203200241b0c7006a41f0006a29030037030020024188cc006a41186a2205200241b0c7006a41e8006a29030037030020024188cc006a41106a2206200241b0c7006a41e0006a29030037030020024188cc006a41086a2207200241b0c7006a41d8006a29030037030020022002290380483703884c200241e0c1006a20022903a848220c420042fabaabb1878ad401420010cc06200241b0c2006a200241b0c7006a4198016a2903002218420042968c8a82a4c39824420010cc0620024180c3006a200241b0c7006a4190016a290300221d420042d587a4ceaceea43d420010cc06200241d0c3006a200241b0c7006a4188016a2903002220420042edd39cadab84b215420010cc06200241a0c4006a200241b0c7006a4180016a290300220a420042d9e2cbb5c2f2a603420010cc06200241d0c1006a200c420042d9e2cbb5c2f2a603420010cc06200241a0c2006a20184200428ee0b9a98cbfbd1f420010cc06200241f0c2006a201d420042968c8a82a4c39824420010cc06200241c0c3006a2020420042d587a4ceaceea43d420010cc0620024190c4006a200a420042edd39cadab84b215420010cc06200241f0c1006a200c420042d2808e80cce8f301420010cc06200241c0c2006a2018420042d587a4ceaceea43d420010cc0620024190c3006a201d420042edd39cadab84b215420010cc06200241e0c3006a2020420042d9e2cbb5c2f2a603420010cc06200241b0c4006a200a420042fabaabb1878ad401420010cc0620024180c2006a200c420042f7f281baccf19c03420010cc06200241d0c2006a2018420042edd39cadab84b215420010cc06200241a0c3006a201d420042d9e2cbb5c2f2a603420010cc06200241f0c3006a2020420042fabaabb1878ad401420010cc06200241c0c4006a200a420042d2808e80cce8f301420010cc0620024190c2006a200c420042ffdb95eed98d9001420010cc06200241e0c2006a2018420042d9e2cbb5c2f2a603420010cc06200241b0c3006a201d420042fabaabb1878ad401420010cc0620024180c4006a2020420042d2808e80cce8f301420010cc06200241d0c4006a200a420042f7f281baccf19c03420010cc06200241d0c8006a41c8006a2225201220137d42f0ffffffffffff3f7c220c42ffffffffffffff0383201020117d42f0ffffffffffff3f7c22184233887c370300200241d0c8006a41c0006a2226201842ffffffffffffff0383200b200f7d42f0ffffffffffff3f7c22184233887c370300200241d0c8006a41386a2227201842ffffffffffffff0383200d200e7d42f0ffffffffffff3f7c22184233887c370300200241d0c8006a41306a2228201842ffffffffffffff0383201420157d42d0fdffffffffff3f7c22184233887c3703002002200c42338842137e201842ffffffffffffff03837c3703f848200241d0c8006a41f0006a22292003290300370300200241d0c8006a41e8006a222a2005290300370300200241d0c8006a41e0006a222b2006290300370300200241d0c8006a41d8006a222c2007290300370300200220022903884c3703a049200241d0c8006a4188016a222d20022903c042221320022903f0417c220c2002290390437c221820022903e0437c221d20022903b0447c222020022903b042221420022903e0417c220a2002290380437c220b20022903d0437c220d20022903a0447c220e20022903a042221520022903d0417c220f20022903f0427c221020022903c0437c22112002290390447c2212423388200241a0c2006a41086a290300200241d0c1006a41086a2903007c200f201554ad7c200241f0c2006a41086a2903007c2010200f54ad7c200241c0c3006a41086a2903007c2011201054ad7c20024190c4006a41086a2903007c2012201154ad7c420d86847c220f423388200241b0c2006a41086a290300200241e0c1006a41086a2903007c200a201454ad7c20024180c3006a41086a2903007c200b200a54ad7c200241d0c3006a41086a2903007c200d200b54ad7c200241a0c4006a41086a2903007c200e200d54ad7c200f200e54ad7c420d86847c220a42ffffffffffffff0383370300200241d0c8006a4190016a222e20022903d04222112002290380427c220b20022903a0437c220d20022903f0437c220e20022903c0447c2210200a423388200241c0c2006a41086a290300200241f0c1006a41086a2903007c200c201354ad7c20024190c3006a41086a2903007c2018200c54ad7c200241e0c3006a41086a2903007c201d201854ad7c200241b0c4006a41086a2903007c2020201d54ad7c200a202054ad7c420d86847c220c42ffffffffffffff0383370300200241d0c8006a4198016a222f20022903e04222132002290390427c221820022903b0437c221d2002290380447c222020022903d0447c220a200c423388200241d0c2006a41086a29030020024180c2006a41086a2903007c200b201154ad7c200241a0c3006a41086a2903007c200d200b54ad7c200241f0c3006a41086a2903007c200e200d54ad7c200241c0c4006a41086a2903007c2010200e54ad7c200c201054ad7c420d86847c220c42ffffffffffffff0383370300200241d0c8006a4180016a2230200c423388200241e0c2006a41086a29030020024190c2006a41086a2903007c2018201354ad7c200241b0c3006a41086a2903007c201d201854ad7c20024180c4006a41086a2903007c2020201d54ad7c200241d0c4006a41086a2903007c200a202054ad7c200c200a54ad7c420d868442137e201242ffffffffffffff03837c220c423388200f42ffffffffffffff03837c3703002002200c42ffffffffffffff03833703c849200241f0c9006a41206a2231200241c8c5006a41c8006a2232290300370300200241f0c9006a41186a2233200241c8c5006a41c0006a22342903002220370300200241f0c9006a41106a2235200241c8c5006a41386a2236290300221d370300200241f0c9006a41086a2237200241c8c5006a41306a22382903002218370300200220022903f045220c3703f0492002200c20022903c8457c220c3703f0492037201820022903d0457c22183703002035201d20022903d8457c221d3703002033202020022903e0457c22203703002031203129030020022903e8457c220a3703002009290300211a200829030021162004290300210e2024290300210b203829030021132036290300211220022903d048210d20022903d045211420022903d845211520022903c845211020022903f0452111200241a03d6a203229030020022903e8457d42f0ffffffffffff3f7c221942ffffffffffffff0383203429030020022903e0457d42f0ffffffffffff3f7c221b4233887c220f42002027290300221742137e221e420010cc06200241b03e6a201942338842137e201120107d42d0fdffffffffff3f7c221f42ffffffffffffff03837c2210420020282903002211420010cc06200241e03c6a201b42ffffffffffffff0383201220157d42f0ffffffffffff3f7c22154233887c221242002026290300221b42137e221c420010cc06200241a03c6a201542ffffffffffffff0383201320147d42f0ffffffffffff3f7c22144233887c221342002025290300222142137e2219420010cc06200241e03b6a201442ffffffffffffff0383201f4233887c2214420020022903f8482215420010cc06200241f03d6a200f4200201142137e420010cc06200241f03b6a201542002010420010cc06200241b03d6a20124200201e420010cc06200241f03c6a20134200201c420010cc06200241b03c6a201442002019420010cc06200241d03c6a200f4200201c420010cc06200241e03d6a201042002017420010cc06200241903c6a201242002019420010cc06200241d03b6a201342002015420010cc06200241a03e6a201442002011420010cc06200241803c6a200f42002019420010cc06200241903d6a20104200201b420010cc06200241c03b6a201242002015420010cc06200241903e6a201342002011420010cc06200241d03d6a201442002017420010cc06200241b03b6a200f42002015420010cc06200241c03c6a201042002021420010cc06200241803e6a201242002011420010cc06200241c03d6a201342002017420010cc06200241803d6a20144200201b420010cc06200241a03b6a20022903c046220f420020302903002210420010cc06200241c03a6a200241c8c5006a4198016a29030022114200202d290300221742137e221e420010cc06200241f0396a200241c8c5006a4190016a29030022124200202e290300221b42137e221c420010cc06200241a0396a200241c8c5006a4188016a29030022134200202f290300221f42137e2219420010cc06200241d0386a200241c8c5006a4180016a2903002214420020022903c8492215420010cc06200241e03a6a20154200200f420010cc06200241d03a6a20114200201042137e420010cc06200241803a6a20124200201e420010cc06200241b0396a20134200201c420010cc06200241e0386a201442002019420010cc06200241903b6a200f42002017420010cc06200241b03a6a20114200201c420010cc06200241e0396a201242002019420010cc0620024190396a201342002015420010cc06200241c0386a201442002010420010cc06200241803b6a200f4200201b420010cc06200241a03a6a201142002019420010cc06200241d0396a201242002015420010cc0620024180396a201342002010420010cc06200241b0386a201442002017420010cc06200241f03a6a200f4200201f420010cc06200241903a6a201142002015420010cc06200241c0396a201242002010420010cc06200241f0386a201342002017420010cc06200241a0386a20144200201b420010cc06200220022903d03c221f20022903e03d7c220f20022903903c7c221020022903d03b7c221120022903a03e7c221220022903a03d222120022903b03e7c221320022903e03c7c221420022903a03c7c221520022903e03b7c221720022903f03d222220022903f03b7c221920022903b03d7c221b20022903f03c7c221c20022903b03c7c221e423388200241f03d6a41086a290300200241f03b6a41086a2903007c2019202254ad7c200241b03d6a41086a2903007c201b201954ad7c200241f03c6a41086a2903007c201c201b54ad7c200241b03c6a41086a2903007c201e201c54ad7c420d86847c2219423388200241a03d6a41086a290300200241b03e6a41086a2903007c2013202154ad7c200241e03c6a41086a2903007c2014201354ad7c200241a03c6a41086a2903007c2015201454ad7c200241e03b6a41086a2903007c2017201554ad7c2019201754ad7c420d86847c221342ffffffffffffff03833703a84a200220022903803c221c20022903903d7c221420022903c03b7c221520022903903e7c221720022903d03d7c221b2013423388200241d03c6a41086a290300200241e03d6a41086a2903007c200f201f54ad7c200241903c6a41086a2903007c2010200f54ad7c200241d03b6a41086a2903007c2011201054ad7c200241a03e6a41086a2903007c2012201154ad7c2013201254ad7c420d86847c220f42ffffffffffffff03833703b04a200220022903b03b221f20022903c03c7c221020022903803e7c221120022903c03d7c221220022903803d7c2213200f423388200241803c6a41086a290300200241903d6a41086a2903007c2014201c54ad7c200241c03b6a41086a2903007c2015201454ad7c200241903e6a41086a2903007c2017201554ad7c200241d03d6a41086a2903007c201b201754ad7c200f201b54ad7c420d86847c220f42ffffffffffffff03833703b84a2002200f423388200241b03b6a41086a290300200241c03c6a41086a2903007c2010201f54ad7c200241803e6a41086a2903007c2011201054ad7c200241c03d6a41086a2903007c2012201154ad7c200241803d6a41086a2903007c2013201254ad7c200f201354ad7c420d868442137e201e42ffffffffffffff03837c220f42ffffffffffffff03833703984a2002200f423388201942ffffffffffffff03837c3703a04a200220022903903a223920022903f03a7c220f20022903c0397c221020022903f0387c221120022903a0387c221220022903a03a223a20022903803b7c221320022903d0397c22142002290380397c221520022903b0387c221720022903b03a223b20022903903b7c221920022903e0397c221b2002290390397c221c20022903c0387c221e20022903c03a223c20022903a03b7c221f20022903f0397c222120022903a0397c222220022903d0387c222320022903d03a223d20022903e03a7c223e20022903803a7c223f20022903b0397c224020022903e0387c2241423388200241d03a6a41086a290300200241e03a6a41086a2903007c203e203d54ad7c200241803a6a41086a2903007c203f203e54ad7c200241b0396a41086a2903007c2040203f54ad7c200241e0386a41086a2903007c2041204054ad7c420d86847c223e423388200241c03a6a41086a290300200241a03b6a41086a2903007c201f203c54ad7c200241f0396a41086a2903007c2021201f54ad7c200241a0396a41086a2903007c2022202154ad7c200241d0386a41086a2903007c2023202254ad7c203e202354ad7c420d86847c221f423388200241b03a6a41086a290300200241903b6a41086a2903007c2019203b54ad7c200241e0396a41086a2903007c201b201954ad7c20024190396a41086a2903007c201c201b54ad7c200241c0386a41086a2903007c201e201c54ad7c201f201e54ad7c420d86847c2219423388200241a03a6a41086a290300200241803b6a41086a2903007c2013203a54ad7c200241d0396a41086a2903007c2014201354ad7c20024180396a41086a2903007c2015201454ad7c200241b0386a41086a2903007c2017201554ad7c2019201754ad7c420d86847c221342ffffffffffffff03833703e04a2002201942ffffffffffffff03833703d84a2002201f42ffffffffffffff03833703d04a20022013423388200241903a6a41086a290300200241f03a6a41086a2903007c200f203954ad7c200241c0396a41086a2903007c2010200f54ad7c200241f0386a41086a2903007c2011201054ad7c200241a0386a41086a2903007c2012201154ad7c2013201254ad7c420d868442137e204142ffffffffffffff03837c220f423388203e42ffffffffffffff03837c3703c84a2002200f42ffffffffffffff03833703c04a200241a0356a200229039846220f4200202c2903002210420010cc06200241b0366a200241c8c5006a41f0006a29030022114200202b290300221742137e221e420010cc06200241f0366a200241c8c5006a41e8006a29030022124200202a290300221b42137e221c420010cc06200241b0376a200241c8c5006a41e0006a290300221342002029290300221f42137e2219420010cc06200241e0356a200241c8c5006a41d8006a2903002214420020022903a0492215420010cc0620024190356a20154200200f420010cc06200241a0366a20114200201042137e420010cc06200241e0366a20124200201e420010cc06200241a0376a20134200201c420010cc06200241e0376a201442002019420010cc06200241b0356a200f42002017420010cc06200241c0366a20114200201c420010cc0620024180376a201242002019420010cc06200241f0356a201342002015420010cc06200241f0376a201442002010420010cc06200241c0356a200f4200201b420010cc06200241d0366a201142002019420010cc0620024180366a201242002015420010cc06200241c0376a201342002010420010cc0620024180386a201442002017420010cc06200241d0356a200f4200201f420010cc0620024190366a201142002015420010cc0620024190376a201242002010420010cc06200241d0376a201342002017420010cc0620024190386a20144200201b420010cc06200241b0c1006a200c4200200b420010cc06200241e0c0006a200a4200200e42137e2211420010cc0620024190c0006a20204200201642137e2210420010cc06200241c03f6a201d4200201a42137e220f420010cc06200241d03e6a20184200200d420010cc06200241c03e6a200d4200200c420010cc06200241c0c1006a200a4200200b42137e420010cc06200241f0c0006a202042002011420010cc06200241a0c0006a201d42002010420010cc06200241d03f6a20184200200f420010cc06200241d0c0006a200c4200200e420010cc0620024180c0006a200a42002010420010cc06200241b03f6a20204200200f420010cc06200241e03e6a201d4200200d420010cc06200241a0c1006a20184200200b420010cc06200241f03f6a200c42002016420010cc06200241a03f6a200a4200200f420010cc06200241f03e6a20204200200d420010cc0620024190c1006a201d4200200b420010cc06200241c0c0006a20184200200e420010cc06200241903f6a200c4200201a420010cc06200241803f6a200a4200200d420010cc0620024180c1006a20204200200b420010cc06200241b0c0006a201d4200200e420010cc06200241e03f6a201842002016420010cc062002200229039036221c20022903d0357c220c2002290390377c221820022903d0377c221d2002290390387c222020022903d036221e20022903c0357c220a2002290380367c220b20022903c0377c220d2002290380387c220e20022903c036221f20022903b0357c220f2002290380377c221020022903f0357c221120022903f0377c221220022903b036222120022903a0357c221320022903f0367c221420022903b0377c221520022903e0357c221620022903a03622222002290390357c221720022903e0367c221920022903a0377c221a20022903e0377c221b423388200241a0366a41086a29030020024190356a41086a2903007c2017202254ad7c200241e0366a41086a2903007c2019201754ad7c200241a0376a41086a2903007c201a201954ad7c200241e0376a41086a2903007c201b201a54ad7c420d86847c2217423388200241b0366a41086a290300200241a0356a41086a2903007c2013202154ad7c200241f0366a41086a2903007c2014201354ad7c200241b0376a41086a2903007c2015201454ad7c200241e0356a41086a2903007c2016201554ad7c2017201654ad7c420d86847c2213423388200241c0366a41086a290300200241b0356a41086a2903007c200f201f54ad7c20024180376a41086a2903007c2010200f54ad7c200241f0356a41086a2903007c2011201054ad7c200241f0376a41086a2903007c2012201154ad7c2013201254ad7c420d86847c220f423388200241d0366a41086a290300200241c0356a41086a2903007c200a201e54ad7c20024180366a41086a2903007c200b200a54ad7c200241c0376a41086a2903007c200d200b54ad7c20024180386a41086a2903007c200e200d54ad7c200f200e54ad7c420d86847c220a42338820024190366a41086a290300200241d0356a41086a2903007c200c201c54ad7c20024190376a41086a2903007c2018200c54ad7c200241d0376a41086a2903007c201d201854ad7c20024190386a41086a2903007c2020201d54ad7c200a202054ad7c420d868442137e201b42ffffffffffffff03837c221842ffffffffffffff0383220c3703e84a20022018423388201742ffffffffffffff03837c22183703f04a2002200a42ffffffffffffff0383221d3703884b2002200f42ffffffffffffff038322203703804b2002201342ffffffffffffff0383220a3703f84a20024190cb006a41086a2231201820187c37030020024190cb006a41106a2224200a200a7c37030020024190cb006a41186a2225202020207c37030020024190cb006a41206a2226201d201d7c3703002002200c200c7c3703904b20022903a04a211c20022903a84a211e20022903b04a211f20022903b84a212120022903984a2122200220022903803f222320022903903f7c220c2002290380417c221820022903b0407c221d20022903e03f7c222020022903a03f223e20022903f03f7c220a20022903f03e7c220b2002290390417c220d20022903c0407c220e200229038040223f20022903d0407c220f20022903b03f7c221020022903e03e7c221120022903a0417c221220022903e040224020022903b0417c22132002290390407c221420022903c03f7c221520022903d03e7c221620022903c041224120022903c03e7c221720022903f0407c221920022903a0407c221a20022903d03f7c221b423388200241c0c1006a41086a290300200241c03e6a41086a2903007c2017204154ad7c200241f0c0006a41086a2903007c2019201754ad7c200241a0c0006a41086a2903007c201a201954ad7c200241d03f6a41086a2903007c201b201a54ad7c420d86847c2217423388200241e0c0006a41086a290300200241b0c1006a41086a2903007c2013204054ad7c20024190c0006a41086a2903007c2014201354ad7c200241c03f6a41086a2903007c2015201454ad7c200241d03e6a41086a2903007c2016201554ad7c2017201654ad7c420d86847c221342338820024180c0006a41086a290300200241d0c0006a41086a2903007c200f203f54ad7c200241b03f6a41086a2903007c2010200f54ad7c200241e03e6a41086a2903007c2011201054ad7c200241a0c1006a41086a2903007c2012201154ad7c2013201254ad7c420d86847c220f423388200241a03f6a41086a290300200241f03f6a41086a2903007c200a203e54ad7c200241f03e6a41086a2903007c200b200a54ad7c20024190c1006a41086a2903007c200d200b54ad7c200241c0c0006a41086a2903007c200e200d54ad7c200f200e54ad7c420d86847c220a423388200241803f6a41086a290300200241903f6a41086a2903007c200c202354ad7c20024180c1006a41086a2903007c2018200c54ad7c200241b0c0006a41086a2903007c201d201854ad7c200241e03f6a41086a2903007c2020201d54ad7c200a202054ad7c420d868442137e201b42ffffffffffffff03837c220c423388201742ffffffffffffff03837c22203703e84b2002200c42ffffffffffffff0383220b3703e04b2002200a42ffffffffffffff0383220d3703804c2002200f42ffffffffffffff0383220e3703f84b2002201342ffffffffffffff0383220f3703f04b2002200b20022903984a7c3703e04b2002202020022903a04a7c3703e84b2002200f20022903a84a7c3703f04b2002200e20022903b04a7c3703f84b2002200d20022903b84a7c3703804c2003202629030037030020052025290300220a37030020062024290300221d370300200720312903002218370300200220022903904b220c3703884c2002200c20022903c04a7c220c3703884c2007201820022903c84a7c22183703002006201d20022903d04a7c221d3703002005200a20022903d84a7c220a3703002003200329030020022903e04a7c2214370300200241e0276a200d20217d42f0ffffffffffff3f7c221042338842137e200b20227d42d0fdffffffffff3f7c221142ffffffffffffff03837c220d4200203129030020022903c84a7d42f0ffffffffffff3f7c221242ffffffffffffff038320022903904b20022903c04a7d42d0fdffffffffff3f7c22134233887c220b420010cc06200241f0336a201042ffffffffffffff0383200e201f7d42f0ffffffffffff3f7c22104233887c220e4200202429030020022903d04a7d42f0ffffffffffff3f7c221542ffffffffffffff038320124233887c221642137e221a420010cc06200241f0326a201042ffffffffffffff0383200f201e7d42f0ffffffffffff3f7c22104233887c220f4200202529030020022903d84a7d42f0ffffffffffff3f7c221242ffffffffffffff038320154233887c221942137e2217420010cc0620024180326a201042ffffffffffffff03832020201c7d42f0ffffffffffff3f7c22204233887c22104200202629030020022903e04a7d42f0ffffffffffff3f7c221b42ffffffffffffff038320124233887c221e42137e2215420010cc06200241c0266a202042ffffffffffffff038320114233887c22114200201b42338842137e201342ffffffffffffff03837c2220420010cc06200241f0276a20204200200d420010cc0620024180356a200e4200200b42137e2222420010cc0620024180346a200f4200201a420010cc0620024180336a201042002017420010cc06200241d0266a201142002015420010cc06200241d0276a200d42002016420010cc06200241e0326a200e42002017420010cc06200241f0316a200f42002015420010cc0620024180316a201042002020420010cc06200241b0266a20114200200b420010cc06200241c0276a200d42002019420010cc06200241e0316a200e42002015420010cc06200241f0306a200f42002020420010cc06200241e0346a20104200200b420010cc0620024180256a201142002016420010cc06200241b0276a200d4200201e420010cc06200241e0306a200e42002020420010cc06200241d0346a200f4200200b420010cc06200241c0336a201042002016420010cc06200241d0236a201142002019420010cc06200241a02b6a20022903e04b221242002018420010cc06200241f02c6a20022903804c223e4200201d42137e2223420010cc06200241f02d6a20022903f84b22214200200a42137e221f420010cc06200241f02e6a20022903f04b221b4200201442137e221c420010cc06200241f02f6a20022903e84b22134200200c420010cc06200241902b6a200c42002012420010cc06200241802d6a203e4200201842137e420010cc06200241802e6a202142002023420010cc06200241802f6a201b4200201f420010cc0620024180306a20134200201c420010cc06200241b02b6a20124200201d420010cc06200241e02c6a203e4200201f420010cc06200241e02d6a20214200201c420010cc06200241e02e6a201b4200200c420010cc06200241e02f6a201342002018420010cc06200241c02b6a20124200200a420010cc06200241d02c6a203e4200201c420010cc06200241d02d6a20214200200c420010cc06200241d02e6a201b42002018420010cc06200241d02f6a20134200201d420010cc06200241d02b6a201242002014420010cc06200241c02c6a203e4200200c420010cc06200241c02d6a202142002018420010cc06200241c02e6a201b4200201d420010cc06200241c02f6a20134200200a420010cc06200241c0346a200c4200200b420010cc06200241d0336a20144200201a420010cc06200241c0326a200a42002017420010cc06200241c0316a201d42002015420010cc06200241c0306a201842002020420010cc06200241d0306a20204200200c420010cc06200241f0346a201442002022420010cc06200241e0336a200a4200201a420010cc06200241d0326a201d42002017420010cc06200241d0316a201842002015420010cc06200241b0336a200c42002016420010cc06200241b0326a201442002017420010cc06200241b0316a200a42002015420010cc06200241b0306a201d42002020420010cc06200241b0346a20184200200b420010cc06200241a0326a200c42002019420010cc06200241a0316a201442002015420010cc06200241a0306a200a42002020420010cc06200241a0346a201d4200200b420010cc06200241a0336a201842002016420010cc0620024190316a200c4200201e420010cc0620024190306a201442002020420010cc0620024190346a200a4200200b420010cc0620024190336a201d42002016420010cc0620024190326a201842002019420010cc06200241c0226a20022903e030223b20022903b0277c220c20022903d0347c221d20022903c0337c222020022903d0237c220a20022903e031223920022903c0277c221820022903f0307c220b20022903e0347c22142002290380257c221520022903e032223a20022903d0277c221620022903f0317c22172002290380317c221920022903b0267c221a20022903f033223c20022903e0277c221c20022903f0327c221e2002290380327c221f20022903c0267c2222200229038035223d20022903f0277c22232002290380347c223f2002290380337c224020022903d0267c224142338820024180356a41086a290300200241f0276a41086a2903007c2023203d54ad7c20024180346a41086a2903007c203f202354ad7c20024180336a41086a2903007c2040203f54ad7c200241d0266a41086a2903007c2041204054ad7c420d86847c2223423388200241f0336a41086a290300200241e0276a41086a2903007c201c203c54ad7c200241f0326a41086a2903007c201e201c54ad7c20024180326a41086a2903007c201f201e54ad7c200241c0266a41086a2903007c2022201f54ad7c2023202254ad7c420d86847c221e423388200241e0326a41086a290300200241d0276a41086a2903007c2016203a54ad7c200241f0316a41086a2903007c2017201654ad7c20024180316a41086a2903007c2019201754ad7c200241b0266a41086a2903007c201a201954ad7c201e201a54ad7c420d86847c2216423388200241e0316a41086a290300200241c0276a41086a2903007c2018203954ad7c200241f0306a41086a2903007c200b201854ad7c200241e0346a41086a2903007c2014200b54ad7c20024180256a41086a2903007c2015201454ad7c2016201554ad7c420d86847c220b42ffffffffffffff03832218420020022903e02c223c20022903b02b7c221420022903e02d7c221520022903e02e7c221720022903e02f7c221920022903f02c223d20022903a02b7c221a20022903f02d7c221c20022903f02e7c221f20022903f02f7c222220022903802d224220022903902b7c223f20022903802e7c224020022903802f7c22392002290380307c223a423388200241802d6a41086a290300200241902b6a41086a2903007c203f204254ad7c200241802e6a41086a2903007c2040203f54ad7c200241802f6a41086a2903007c2039204054ad7c20024180306a41086a2903007c203a203954ad7c420d86847c223f423388200241f02c6a41086a290300200241a02b6a41086a2903007c201a203d54ad7c200241f02d6a41086a2903007c201c201a54ad7c200241f02e6a41086a2903007c201f201c54ad7c200241f02f6a41086a2903007c2022201f54ad7c203f202254ad7c420d86847c221a42ffffffffffffff0383222242137e2239420010cc06200241f0206a200b423388200241e0306a41086a290300200241b0276a41086a2903007c200c203b54ad7c200241d0346a41086a2903007c201d200c54ad7c200241c0336a41086a2903007c2020201d54ad7c200241d0236a41086a2903007c200a202054ad7c200b200a54ad7c420d868442137e204142ffffffffffffff03837c223b42ffffffffffffff0383221d420020022903c02c223d20022903d02b7c220c20022903c02d7c222020022903c02e7c220a20022903c02f7c220b20022903d02c224220022903c02b7c221c20022903d02d7c221f20022903d02e7c224020022903d02f7c2241201a423388200241e02c6a41086a290300200241b02b6a41086a2903007c2014203c54ad7c200241e02d6a41086a2903007c2015201454ad7c200241e02e6a41086a2903007c2017201554ad7c200241e02f6a41086a2903007c2019201754ad7c201a201954ad7c420d86847c2214423388200241d02c6a41086a290300200241c02b6a41086a2903007c201c204254ad7c200241d02d6a41086a2903007c201f201c54ad7c200241d02e6a41086a2903007c2040201f54ad7c200241d02f6a41086a2903007c2041204054ad7c2014204154ad7c420d86847c2215423388200241c02c6a41086a290300200241d02b6a41086a2903007c200c203d54ad7c200241c02d6a41086a2903007c2020200c54ad7c200241c02e6a41086a2903007c200a202054ad7c200241c02f6a41086a2903007c200b200a54ad7c2015200b54ad7c420d868442137e203a42ffffffffffffff03837c2217423388203f42ffffffffffffff03837c221c420010cc06200241f0236a201642ffffffffffffff038322204200201442ffffffffffffff0383223f42137e2214420010cc06200241a0256a201e42ffffffffffffff0383220a4200201542ffffffffffffff0383224142137e220c420010cc0620024190226a203b423388202342ffffffffffffff03837c220b4200201742ffffffffffffff0383221e420010cc06200241b0226a20184200201c42137e420010cc0620024180216a201e4200201d420010cc06200241e0236a202042002039420010cc0620024190256a200a42002014420010cc06200241a0226a200b4200200c420010cc06200241d0226a201842002014420010cc06200241e0206a201d42002022420010cc0620024180246a20204200200c420010cc06200241b0256a200a4200201e420010cc0620024180226a200b4200201c420010cc06200241e0226a20184200200c420010cc06200241d0206a201d4200203f420010cc0620024190246a20204200201e420010cc06200241c0256a200a4200201c420010cc06200241f0216a200b42002022420010cc06200241f0226a20184200201e420010cc06200241c0206a201d42002041420010cc06200241a0246a20204200201c420010cc06200241d0256a200a42002022420010cc06200241e0216a200b4200203f420010cc0620024190286a20022903903022432002290390317c220c2002290390347c22142002290390337c22152002290390327c221620022903a031224420022903a0327c221720022903a0307c221920022903a0347c221a20022903a0337c221f20022903b032224520022903b0337c222320022903b0317c224020022903b0307c223920022903b0347c223a20022903d033224620022903c0347c223b20022903c0327c223c20022903c0317c223d20022903c0307c224220022903f034224720022903d0307c224820022903e0337c224920022903d0327c224a20022903d0317c224b423388200241f0346a41086a290300200241d0306a41086a2903007c2048204754ad7c200241e0336a41086a2903007c2049204854ad7c200241d0326a41086a2903007c204a204954ad7c200241d0316a41086a2903007c204b204a54ad7c420d86847c2248423388200241d0336a41086a290300200241c0346a41086a2903007c203b204654ad7c200241c0326a41086a2903007c203c203b54ad7c200241c0316a41086a2903007c203d203c54ad7c200241c0306a41086a2903007c2042203d54ad7c2048204254ad7c420d86847c223b423388200241b0326a41086a290300200241b0336a41086a2903007c2023204554ad7c200241b0316a41086a2903007c2040202354ad7c200241b0306a41086a2903007c2039204054ad7c200241b0346a41086a2903007c203a203954ad7c203b203a54ad7c420d86847c2223423388200241a0316a41086a290300200241a0326a41086a2903007c2017204454ad7c200241a0306a41086a2903007c2019201754ad7c200241a0346a41086a2903007c201a201954ad7c200241a0336a41086a2903007c201f201a54ad7c2023201f54ad7c420d86847c221742338820024190306a41086a29030020024190316a41086a2903007c200c204354ad7c20024190346a41086a2903007c2014200c54ad7c20024190336a41086a2903007c2015201454ad7c20024190326a41086a2903007c2016201554ad7c2017201654ad7c420d868442137e204b42ffffffffffffff03837c221442ffffffffffffff0383224a201e7c220c42002014423388204842ffffffffffffff03837c224b42f0ffffffffffff3f7c224c201c7d221642ffffffffffffff0383204a42d0fdffffffffff3f7c224d201e7d221a4233887c2214420010cc06200241902a6a201742ffffffffffffff0383224320417c22154200203b42ffffffffffffff0383224442f0ffffffffffff3f7c224e20227d221742ffffffffffffff038320164233887c221f42137e223a420010cc06200241e02a6a202342ffffffffffffff03832245203f7c22164200204542f0ffffffffffff3f7c224f203f7d221942ffffffffffffff038320174233887c224042137e2239420010cc06200241c02a6a204420227c22174200204342f0ffffffffffff3f7c225020417d223b42ffffffffffffff038320194233887c223c42137e2223420010cc0620024180296a204b201c7c22194200203b42338842137e201a42ffffffffffffff03837c221a420010cc0620024180286a201a4200200c420010cc06200241c0296a20154200201442137e420010cc06200241a02a6a20164200203a420010cc06200241b02a6a201742002039420010cc06200241d0296a201942002023420010cc06200241d02a6a201542002039420010cc06200241a0286a200c4200201f420010cc06200241f02a6a201642002023420010cc06200241f0286a20174200201a420010cc06200241b0296a201942002014420010cc06200241802b6a201542002023420010cc06200241b0286a200c42002040420010cc06200241e0286a20164200201a420010cc06200241a0296a201742002014420010cc06200241e0296a20194200201f420010cc06200241c0286a200c4200203c420010cc06200241d0286a20154200201a420010cc0620024190296a201642002014420010cc06200241802a6a20174200201f420010cc06200241f0296a201942002040420010cc06200220223703a04b2002203f3703a84b200220413703b04b2002201e3703904b2002201c3703984b200220022903d022223b20022903e0207c220c2002290380247c221420022903b0257c22152002290380227c221620022903c022223c20022903f0207c221720022903f0237c221920022903a0257c221a2002290390227c221f20022903b022223d2002290380217c222320022903e0237c22402002290390257c223920022903a0227c223a423388200241b0226a41086a29030020024180216a41086a2903007c2023203d54ad7c200241e0236a41086a2903007c2040202354ad7c20024190256a41086a2903007c2039204054ad7c200241a0226a41086a2903007c203a203954ad7c420d86847c2223423388200241c0226a41086a290300200241f0206a41086a2903007c2017203c54ad7c200241f0236a41086a2903007c2019201754ad7c200241a0256a41086a2903007c201a201954ad7c20024190226a41086a2903007c201f201a54ad7c2023201f54ad7c420d86847c221742ffffffffffffff03833703f04b200220022903e022223920022903d0207c22192002290390247c221a20022903c0257c221f20022903f0217c22402017423388200241d0226a41086a290300200241e0206a41086a2903007c200c203b54ad7c20024180246a41086a2903007c2014200c54ad7c200241b0256a41086a2903007c2015201454ad7c20024180226a41086a2903007c2016201554ad7c2017201654ad7c420d86847c220c42ffffffffffffff03833703f84b200220022903f022223b20022903c0207c221420022903a0247c221520022903d0257c221620022903e0217c2217200c423388200241e0226a41086a290300200241d0206a41086a2903007c2019203954ad7c20024190246a41086a2903007c201a201954ad7c200241c0256a41086a2903007c201f201a54ad7c200241f0216a41086a2903007c2040201f54ad7c200c204054ad7c420d86847c220c42ffffffffffffff03833703804c2002200c423388200241f0226a41086a290300200241c0206a41086a2903007c2014203b54ad7c200241a0246a41086a2903007c2015201454ad7c200241d0256a41086a2903007c2016201554ad7c200241e0216a41086a2903007c2017201654ad7c200c201754ad7c420d868442137e203a42ffffffffffffff03837c220c42ffffffffffffff03833703e04b2002200c423388202342ffffffffffffff03837c3703e84b20024190286a41086a2903002151200241902a6a41086a2903002152200229039028214920022903902a210c200241e02a6a41086a290300215320022903e02a2146200241c02a6a41086a290300215420022903c02a214720024180296a41086a2903002155200229038029215620024180286a41086a2903002157200241c0296a41086a2903002158200229038028215920022903c0292114200241a02a6a41086a290300215a20022903a02a215b200241b02a6a41086a290300215c20022903b02a215d200241d0296a41086a290300215e20022903d029215f20022903d02a211520022903a028213c20022903f02a213d20022903f028214220022903b0292148200241d02a6a41086a2903002160200241a0286a41086a2903002161200241f02a6a41086a2903002162200241f0286a41086a2903002163200241b0296a41086a290300216420022903802b211620022903b028214020022903e028213920022903a029213a20022903e029213b200241802b6a41086a2903002165200241b0286a41086a2903002166200241e0286a41086a2903002167200241a0296a41086a2903002168200241e0296a41086a290300216920022903c028211920022903d0282117200229039029211a20022903802a211f20022903f0292123200241c0286a41086a290300216a200241d0286a41086a290300216b20024190296a41086a290300216c200241802a6a41086a290300216d200241f0296a41086a290300216e200241c8c5006a200241e0cb006a41011067200241d01f6a2023201f201a201720197c22197c221a7c221f7c2223203b203a2039201620407c22407c22397c223a7c223b20482042203d2015203c7c223c7c223d7c22427c2248205620472046200c20497c22497c22467c22477c2256205f205d205b201420597c22597c225b7c225d7c225f423388205e205c205a205820577c2059201454ad7c7c205b205954ad7c7c205d205b54ad7c7c205f205d54ad7c420d86847c2214423388205520542053205220517c2049200c54ad7c7c2046204954ad7c7c2047204654ad7c7c2056204754ad7c2014205654ad7c420d86847c2249423388206420632062206020617c203c201554ad7c7c203d203c54ad7c7c2042203d54ad7c7c2048204254ad7c2049204854ad7c420d86847c223c423388206920682067206520667c2040201654ad7c7c2039204054ad7c7c203a203954ad7c7c203b203a54ad7c203c203b54ad7c420d86847c2216423388206e206d206c206b206a7c2019201754ad7c7c201a201954ad7c7c201f201a54ad7c7c2023201f54ad7c2016202354ad7c420d868442137e205f42ffffffffffffff03837c223a42ffffffffffffff0383220c420020022903d0452215420010cc06200241801f6a201642ffffffffffffff03832240420020022903d845221742137e223b420010cc06200241b01e6a203c42ffffffffffffff03832223420020022903e045221a42137e2239420010cc06200241e01d6a204942ffffffffffffff0383221f420020022903e845223c42137e2219420010cc06200241f01c6a203a423388201442ffffffffffffff03837c2214420020022903c8452216420010cc06200241e01c6a20164200200c420010cc06200241e01f6a20404200201542137e420010cc06200241901f6a20234200203b420010cc06200241c01e6a201f42002039420010cc06200241f01d6a201442002019420010cc06200241f01e6a200c42002017420010cc06200241a01e6a204042002039420010cc06200241d01d6a202342002019420010cc06200241801d6a201f42002016420010cc06200241c01f6a201442002015420010cc06200241901e6a200c4200201a420010cc06200241c01d6a204042002019420010cc06200241901d6a202342002016420010cc06200241b01f6a201f42002015420010cc06200241e01e6a201442002017420010cc06200241b01d6a200c4200203c420010cc06200241a01d6a204042002016420010cc06200241a01f6a202342002015420010cc06200241d01e6a201f42002017420010cc06200241801e6a20144200201a420010cc06200220022903a01e224920022903f01e7c221520022903d01d7c221620022903801d7c221720022903c01f7c221920022903801f224620022903d01f7c221a20022903b01e7c223920022903e01d7c223a20022903f01c7c223b20022903e01f224720022903e01c7c223c20022903901f7c223d20022903c01e7c224220022903f01d7c2248423388200241e01f6a41086a290300200241e01c6a41086a2903007c203c204754ad7c200241901f6a41086a2903007c203d203c54ad7c200241c01e6a41086a2903007c2042203d54ad7c200241f01d6a41086a2903007c2048204254ad7c420d86847c223c423388200241801f6a41086a290300200241d01f6a41086a2903007c201a204654ad7c200241b01e6a41086a2903007c2039201a54ad7c200241e01d6a41086a2903007c203a203954ad7c200241f01c6a41086a2903007c203b203a54ad7c203c203b54ad7c420d86847c221a42ffffffffffffff03833703984c200220022903c01d224220022903901e7c223920022903901d7c223a20022903b01f7c223b20022903e01e7c223d201a423388200241a01e6a41086a290300200241f01e6a41086a2903007c2015204954ad7c200241d01d6a41086a2903007c2016201554ad7c200241801d6a41086a2903007c2017201654ad7c200241c01f6a41086a2903007c2019201754ad7c201a201954ad7c420d86847c221542ffffffffffffff03833703a04c200220022903a01d224920022903b01d7c221620022903a01f7c221720022903d01e7c221920022903801e7c221a2015423388200241c01d6a41086a290300200241901e6a41086a2903007c2039204254ad7c200241901d6a41086a2903007c203a203954ad7c200241b01f6a41086a2903007c203b203a54ad7c200241e01e6a41086a2903007c203d203b54ad7c2015203d54ad7c420d86847c221542ffffffffffffff03833703a84c20022015423388200241a01d6a41086a290300200241b01d6a41086a2903007c2016204954ad7c200241a01f6a41086a2903007c2017201654ad7c200241d01e6a41086a2903007c2019201754ad7c200241801e6a41086a2903007c201a201954ad7c2015201a54ad7c420d868442137e204842ffffffffffffff03837c221542ffffffffffffff03833703884c20022015423388203c42ffffffffffffff03837c3703904c200241b0c7006a41106a22034200370300200241b0c7006a41186a22054200370300200241b0c7006a41206a4200370300200242003703b847200242013703b047200241d0c8006a200241b0c7006a20024188cc006a1068200241f0116a20022903d8482215420020022903e84b2239420010cc0620024180156a200241d0c8006a41286a2903002216420020022903f04b223b42137e2248420010cc06200241a0166a20092903002217420020022903f84b223d42137e2242420010cc06200241c0176a20082903002219420020022903804c224942137e223c420010cc06200241e0186a2004290300221a420020022903e04b223a420010cc0620024180126a203a42002015420010cc0620024190156a20164200203942137e420010cc06200241b0166a201742002048420010cc06200241d0176a201942002042420010cc06200241f0186a201a4200203c420010cc06200241e0116a20154200203b420010cc06200241f0146a201642002042420010cc0620024190166a20174200203c420010cc06200241b0176a20194200203a420010cc06200241d0186a201a42002039420010cc06200241d0116a20154200203d420010cc06200241e0146a20164200203c420010cc0620024180166a20174200203a420010cc06200241a0176a201942002039420010cc06200241c0186a201a4200203b420010cc06200241c0116a201542002049420010cc06200241d0146a20164200203a420010cc06200241f0156a201742002039420010cc0620024190176a20194200203b420010cc06200241b0186a201a4200203d420010cc0620024190276a200d42002013420010cc06200241902e6a200e4200201b42137e223b420010cc06200241a02d6a200f4200202142137e223a420010cc06200241b02c6a20104200203e42137e2239420010cc0620024180106a201142002012420010cc06200241a0276a20124200200d420010cc06200241902f6a200e4200201342137e420010cc06200241a02e6a200f4200203b420010cc06200241b02d6a20104200203a420010cc0620024190106a201142002039420010cc0620024180276a200d4200201b420010cc06200241902d6a200e4200203a420010cc06200241a02c6a200f42002039420010cc06200241e02b6a201042002012420010cc06200241f00f6a201142002013420010cc06200241f0266a200d42002021420010cc06200241902c6a200e42002039420010cc06200241f02b6a200f42002012420010cc06200241b02f6a201042002013420010cc06200241900f6a20114200201b420010cc06200241e0266a200d4200203e420010cc06200241802c6a200e42002012420010cc06200241a02f6a200f42002013420010cc06200241b02e6a20104200201b420010cc06200241b00e6a201142002021420010cc06200241b0146a201542002014420010cc06200241d0156a20164200201f42137e220f420010cc06200241f0166a20174200202342137e220e420010cc0620024190186a20194200204042137e220d420010cc06200241b0196a201a4200200c420010cc06200241c0146a200c42002015420010cc06200241e0156a20164200201442137e420010cc0620024180176a20174200200f420010cc06200241a0186a20194200200e420010cc06200241c0196a201a4200200d420010cc06200241a0146a20154200201f420010cc06200241c0156a20164200200e420010cc06200241e0166a20174200200d420010cc0620024180186a20194200200c420010cc06200241a0196a201a42002014420010cc06200241c0136a201542002023420010cc06200241b0156a20164200200d420010cc06200241d0166a20174200200c420010cc06200241f0176a201942002014420010cc0620024190196a201a4200201f420010cc06200241e0126a201542002040420010cc06200241a0156a20164200200c420010cc06200241c0166a201742002014420010cc06200241e0176a20194200201f420010cc0620024180196a201a42002023420010cc06200241a00f6a20022903d014223b20022903c0117c220c20022903f0157c220d2002290390177c220e20022903b0187c221020022903e014223920022903d0117c220f2002290380167c221120022903a0177c221220022903c0187c221320022903f014223a20022903e0117c22142002290390167c221520022903b0177c221620022903d0187c2217200229038015223c20022903f0117c221920022903a0167c221a20022903c0177c221b20022903e0187c221f200229039015223d2002290380127c222120022903b0167c222320022903d0177c223e20022903f0187c224042338820024190156a41086a29030020024180126a41086a2903007c2021203d54ad7c200241b0166a41086a2903007c2023202154ad7c200241d0176a41086a2903007c203e202354ad7c200241f0186a41086a2903007c2040203e54ad7c420d86847c223e42338820024180156a41086a290300200241f0116a41086a2903007c2019203c54ad7c200241a0166a41086a2903007c201a201954ad7c200241c0176a41086a2903007c201b201a54ad7c200241e0186a41086a2903007c201f201b54ad7c203e201f54ad7c420d86847c2219423388200241f0146a41086a290300200241e0116a41086a2903007c2014203a54ad7c20024190166a41086a2903007c2015201454ad7c200241b0176a41086a2903007c2016201554ad7c200241d0186a41086a2903007c2017201654ad7c2019201754ad7c420d86847c2214423388200241e0146a41086a290300200241d0116a41086a2903007c200f203954ad7c20024180166a41086a2903007c2011200f54ad7c200241a0176a41086a2903007c2012201154ad7c200241c0186a41086a2903007c2013201254ad7c2014201354ad7c420d86847c221142ffffffffffffff0383221b420020022903902d223c2002290380277c221220022903a02c7c221320022903e02b7c221520022903f00f7c221620022903902e223d2002290390277c220f20022903a02d7c221720022903b02c7c221a2002290380107c221f20022903902f224220022903a0277c222120022903a02e7c222320022903b02d7c22392002290390107c223a423388200241902f6a41086a290300200241a0276a41086a2903007c2021204254ad7c200241a02e6a41086a2903007c2023202154ad7c200241b02d6a41086a2903007c2039202354ad7c20024190106a41086a2903007c203a203954ad7c420d86847c2221423388200241902e6a41086a29030020024190276a41086a2903007c200f203d54ad7c200241a02d6a41086a2903007c2017200f54ad7c200241b02c6a41086a2903007c201a201754ad7c20024180106a41086a2903007c201f201a54ad7c2021201f54ad7c420d86847c221742ffffffffffffff0383220f42137e2239420010cc06200241800e6a2011423388200241d0146a41086a290300200241c0116a41086a2903007c200c203b54ad7c200241f0156a41086a2903007c200d200c54ad7c20024190176a41086a2903007c200e200d54ad7c200241b0186a41086a2903007c2010200e54ad7c2011201054ad7c420d868442137e204042ffffffffffffff03837c223b42ffffffffffffff0383221f420020022903802c223d20022903e0267c220c20022903a02f7c220d20022903b02e7c220e20022903b00e7c221020022903902c224220022903f0267c221120022903f02b7c221a20022903b02f7c222320022903900f7c22402017423388200241902d6a41086a29030020024180276a41086a2903007c2012203c54ad7c200241a02c6a41086a2903007c2013201254ad7c200241e02b6a41086a2903007c2015201354ad7c200241f00f6a41086a2903007c2016201554ad7c2017201654ad7c420d86847c2212423388200241902c6a41086a290300200241f0266a41086a2903007c2011204254ad7c200241f02b6a41086a2903007c201a201154ad7c200241b02f6a41086a2903007c2023201a54ad7c200241900f6a41086a2903007c2040202354ad7c2012204054ad7c420d86847c2211423388200241802c6a41086a290300200241e0266a41086a2903007c200c203d54ad7c200241a02f6a41086a2903007c200d200c54ad7c200241b02e6a41086a2903007c200e200d54ad7c200241b00e6a41086a2903007c2010200e54ad7c2011201054ad7c420d868442137e203a42ffffffffffffff03837c220e423388202142ffffffffffffff03837c220d420010cc06200241d00e6a201442ffffffffffffff038322214200201242ffffffffffffff0383221642137e2210420010cc06200241e00c6a201942ffffffffffffff038322234200201142ffffffffffffff0383221942137e220c420010cc06200241b00d6a203b423388203e42ffffffffffffff03837c223e4200200e42ffffffffffffff0383220e420010cc06200241900e6a201b4200200d42137e420010cc06200241c00d6a200e4200201f420010cc06200241b00f6a202142002039420010cc06200241e00e6a202342002010420010cc06200241f00c6a203e4200200c420010cc06200241c00e6a201b42002010420010cc06200241c00f6a201f4200200f420010cc06200241d00c6a20214200200c420010cc06200241a00d6a20234200200e420010cc06200241f00d6a203e4200200d420010cc06200241f00b6a201b4200200c420010cc06200241f00e6a201f42002016420010cc06200241900d6a20214200200e420010cc06200241e00d6a20234200200d420010cc06200241d00f6a203e4200200f420010cc06200241800d6a201b4200200e420010cc06200241a00e6a201f42002019420010cc06200241d00d6a20214200200d420010cc06200241e00f6a20234200200f420010cc06200241800f6a203e42002016420010cc06200241800c6a20022903a015225b20022903e0127c220c20022903c0167c221120022903e0177c22122002290380197c221320022903b015225620022903c0137c221020022903d0167c221420022903f0177c22152002290390197c221720022903c015225920022903a0147c221a20022903e0167c22402002290380187c223920022903a0197c223a20022903d015225d20022903b0147c223b20022903f0167c223c2002290390187c223d20022903b0197c224220022903e015225f20022903c0147c22482002290380177c224920022903a0187c224620022903c0197c2247423388200241e0156a41086a290300200241c0146a41086a2903007c2048205f54ad7c20024180176a41086a2903007c2049204854ad7c200241a0186a41086a2903007c2046204954ad7c200241c0196a41086a2903007c2047204654ad7c420d86847c2248423388200241d0156a41086a290300200241b0146a41086a2903007c203b205d54ad7c200241f0166a41086a2903007c203c203b54ad7c20024190186a41086a2903007c203d203c54ad7c200241b0196a41086a2903007c2042203d54ad7c2048204254ad7c420d86847c223b423388200241c0156a41086a290300200241a0146a41086a2903007c201a205954ad7c200241e0166a41086a2903007c2040201a54ad7c20024180186a41086a2903007c2039204054ad7c200241a0196a41086a2903007c203a203954ad7c203b203a54ad7c420d86847c221a423388200241b0156a41086a290300200241c0136a41086a2903007c2010205654ad7c200241d0166a41086a2903007c2014201054ad7c200241f0176a41086a2903007c2015201454ad7c20024190196a41086a2903007c2017201554ad7c201a201754ad7c420d86847c221442ffffffffffffff03832210420020022903c00e225d20022903c00f7c221520022903d00c7c224020022903a00d7c223920022903f00d7c223a20022903a00f225f20022903800e7c221720022903d00e7c223c20022903e00c7c223d20022903b00d7c224220022903900e225120022903c00d7c224920022903b00f7c224620022903e00e7c225620022903f00c7c2259423388200241900e6a41086a290300200241c00d6a41086a2903007c2049205154ad7c200241b00f6a41086a2903007c2046204954ad7c200241e00e6a41086a2903007c2056204654ad7c200241f00c6a41086a2903007c2059205654ad7c420d86847c2249423388200241a00f6a41086a290300200241800e6a41086a2903007c2017205f54ad7c200241d00e6a41086a2903007c203c201754ad7c200241e00c6a41086a2903007c203d203c54ad7c200241b00d6a41086a2903007c2042203d54ad7c2049204254ad7c420d86847c223c42ffffffffffffff0383221742137e2256420010cc06200241f00a6a2014423388200241a0156a41086a290300200241e0126a41086a2903007c200c205b54ad7c200241c0166a41086a2903007c2011200c54ad7c200241e0176a41086a2903007c2012201154ad7c20024180196a41086a2903007c2013201254ad7c2014201354ad7c420d868442137e204742ffffffffffffff03837c225b42ffffffffffffff03832211420020022903800d225f20022903a00e7c220c20022903d00d7c221220022903e00f7c221320022903800f7c221420022903f00b225120022903f00e7c223d20022903900d7c224220022903e00d7c224620022903d00f7c2247203c423388200241c00e6a41086a290300200241c00f6a41086a2903007c2015205d54ad7c200241d00c6a41086a2903007c2040201554ad7c200241a00d6a41086a2903007c2039204054ad7c200241f00d6a41086a2903007c203a203954ad7c203c203a54ad7c420d86847c2215423388200241f00b6a41086a290300200241f00e6a41086a2903007c203d205154ad7c200241900d6a41086a2903007c2042203d54ad7c200241e00d6a41086a2903007c2046204254ad7c200241d00f6a41086a2903007c2047204654ad7c2015204754ad7c420d86847c2240423388200241800d6a41086a290300200241a00e6a41086a2903007c200c205f54ad7c200241d00d6a41086a2903007c2012200c54ad7c200241e00f6a41086a2903007c2013201254ad7c200241800f6a41086a2903007c2014201354ad7c2040201454ad7c420d868442137e205942ffffffffffffff03837c223c423388204942ffffffffffffff03837c220c420010cc06200241a00b6a201a42ffffffffffffff038322124200201542ffffffffffffff0383223942137e223a420010cc06200241d0096a203b42ffffffffffffff038322134200204042ffffffffffffff0383224042137e221a420010cc06200241a00a6a205b423388204842ffffffffffffff03837c22144200203c42ffffffffffffff03832215420010cc06200241b00a6a201542002011420010cc06200241800b6a20104200200c42137e420010cc06200241900c6a201242002056420010cc06200241b00b6a20134200203a420010cc06200241e0096a20144200201a420010cc06200241a00c6a201142002017420010cc06200241900b6a20104200203a420010cc06200241c0096a20124200201a420010cc06200241900a6a201342002015420010cc06200241e00a6a20144200200c420010cc06200241c00b6a201142002039420010cc06200241e0086a20104200201a420010cc06200241800a6a201242002015420010cc06200241d00a6a20134200200c420010cc06200241b00c6a201442002017420010cc06200241e00b6a201142002040420010cc06200241f0096a201042002015420010cc06200241c00a6a20124200200c420010cc06200241c00c6a201342002017420010cc06200241d00b6a201442002039420010cc06200241f0086a2019420020022903900b225b20022903a00c7c220c20022903c0097c221520022903900a7c221720022903e00a7c221a20022903800c224920022903f00a7c224020022903a00b7c223920022903d0097c223a20022903a00a7c223b20022903800b224620022903b00a7c223c20022903900c7c223d20022903b00b7c224220022903e0097c2248423388200241800b6a41086a290300200241b00a6a41086a2903007c203c204654ad7c200241900c6a41086a2903007c203d203c54ad7c200241b00b6a41086a2903007c2042203d54ad7c200241e0096a41086a2903007c2048204254ad7c420d86847c223c423388200241800c6a41086a290300200241f00a6a41086a2903007c2040204954ad7c200241a00b6a41086a2903007c2039204054ad7c200241d0096a41086a2903007c203a203954ad7c200241a00a6a41086a2903007c203b203a54ad7c203c203b54ad7c420d86847c223942ffffffffffffff0383224042137e2249420010cc06200241e0076a200e420020022903f009225d20022903e00b7c223a20022903c00a7c223b20022903c00c7c223d20022903d00b7c224220022903e008225f20022903c00b7c224620022903800a7c224720022903d00a7c225620022903b00c7c22592039423388200241900b6a41086a290300200241a00c6a41086a2903007c200c205b54ad7c200241c0096a41086a2903007c2015200c54ad7c200241900a6a41086a2903007c2017201554ad7c200241e00a6a41086a2903007c201a201754ad7c2039201a54ad7c420d86847c220c423388200241e0086a41086a290300200241c00b6a41086a2903007c2046205f54ad7c200241800a6a41086a2903007c2047204654ad7c200241d00a6a41086a2903007c2056204754ad7c200241b00c6a41086a2903007c2059205654ad7c200c205954ad7c420d86847c2215423388200241f0096a41086a290300200241e00b6a41086a2903007c203a205d54ad7c200241c00a6a41086a2903007c203b203a54ad7c200241c00c6a41086a2903007c203d203b54ad7c200241d00b6a41086a2903007c2042203d54ad7c2015204254ad7c420d868442137e204842ffffffffffffff03837c223b423388203c42ffffffffffffff03837c2217420010cc0620024190086a20164200200c42ffffffffffffff0383223a42137e2239420010cc06200241c0066a200f4200201542ffffffffffffff0383224642137e221a420010cc0620024190076a200d4200203b42ffffffffffffff03832215420010cc06200241a0076a20154200200e420010cc06200241f0076a20194200201742137e2263420010cc0620024180096a201642002049420010cc06200241a0086a200f42002039420010cc06200241d0066a200d4200201a420010cc0620024190096a200e42002040420010cc0620024180086a201942002039420010cc06200241b0066a20164200201a420010cc0620024180076a200f42002015420010cc06200241d0076a200d42002017420010cc06200241b0086a200e4200203a420010cc06200241a0066a20194200201a420010cc06200241f0066a201642002015420010cc06200241c0076a200f42002017420010cc06200241a0096a200d42002040420010cc06200241d0086a200e42002046420010cc06200241e0066a201942002015420010cc06200241b0076a201642002017420010cc06200241b0096a200f42002040420010cc06200241c0086a200d4200203a420010cc06200241801a6a20022903904b220c4200429db1bce4dfb435420010cc06200241d01a6a20022903b04b223b420042a0d69f90da80b1cb00420010cc06200241a01b6a20022903a84b223c420042badf96dcb5c3bac700420010cc06200241f01b6a20022903a04b223d420042a7ecfac2b5f7ea19420010cc06200241c01c6a20022903984b2242420042b0c1bad0f4e48603420010cc06200241901a6a200c420042b0c1bad0f4e48603420010cc06200241e01a6a203b420042a7a7fbf49beaf607420010cc06200241b01b6a203c420042a0d69f90da80b1cb00420010cc06200241801c6a203d420042badf96dcb5c3bac700420010cc06200241d01c6a2042420042a7ecfac2b5f7ea19420010cc06200241f0196a200c420042e098f4e5e9ebfb03420010cc06200241c01a6a203b420042badf96dcb5c3bac700420010cc06200241901b6a203c420042a7ecfac2b5f7ea19420010cc06200241e01b6a203d420042b0c1bad0f4e48603420010cc06200241b01c6a20424200429db1bce4dfb435420010cc06200241e0196a200c4200429e9981b4dab2e103420010cc06200241b01a6a203b420042a7ecfac2b5f7ea19420010cc06200241801b6a203c420042b0c1bad0f4e48603420010cc06200241d01b6a203d4200429db1bce4dfb435420010cc06200241a01c6a2042420042e098f4e5e9ebfb03420010cc06200241d0196a200c4200429df893c0a486ae01420010cc06200241a01a6a203b420042b0c1bad0f4e48603420010cc06200241f01a6a203c4200429db1bce4dfb435420010cc06200241c01b6a203d420042e098f4e5e9ebfb03420010cc06200241901c6a20424200429e9981b4dab2e103420010cc0620024190236a2018420042a0d69f90da80b1cb00420010cc06200241a0206a201d4200429db1bce4dfb435420010cc06200241c0246a2020420042badf96dcb5c3bac700420010cc06200241f0256a200a420042a7ecfac2b5f7ea19420010cc06200241c0216a200b420042b0c1bad0f4e48603420010cc0620024180236a2018420042a7a7fbf49beaf607420010cc06200241b0206a201d420042b0c1bad0f4e48603420010cc06200241b0246a2020420042a0d69f90da80b1cb00420010cc06200241e0256a200a420042badf96dcb5c3bac700420010cc06200241d0216a200b420042a7ecfac2b5f7ea19420010cc06200241a0236a2018420042badf96dcb5c3bac700420010cc0620024190206a201d420042e098f4e5e9ebfb03420010cc06200241d0246a2020420042a7ecfac2b5f7ea19420010cc0620024180266a200a420042b0c1bad0f4e48603420010cc06200241b0216a200b4200429db1bce4dfb435420010cc06200241b0236a2018420042a7ecfac2b5f7ea19420010cc0620024180206a201d4200429e9981b4dab2e103420010cc06200241e0246a2020420042b0c1bad0f4e48603420010cc0620024190266a200a4200429db1bce4dfb435420010cc06200241a0216a200b420042e098f4e5e9ebfb03420010cc06200241c0236a2018420042b0c1bad0f4e48603420010cc06200241f01f6a201d4200429df893c0a486ae01420010cc06200241f0246a20204200429db1bce4dfb435420010cc06200241a0266a200a420042e098f4e5e9ebfb03420010cc0620024190216a200b4200429e9981b4dab2e103420010cc06200220022903800822512002290390097c220c20022903b0067c223b2002290380077c223c20022903d0077c223d20022903f008225220022903e0077c22422002290390087c224820022903c0067c22472002290390077c225620022903f007225320022903a0077c22592002290380097c225b20022903a0087c225d20022903d0067c225f423388200241f0076a41086a290300200241a0076a41086a2903007c2059205354ad7c20024180096a41086a2903007c205b205954ad7c200241a0086a41086a2903007c205d205b54ad7c200241d0066a41086a2903007c205f205d54ad7c420d86847c2259423388200241f0086a41086a290300200241e0076a41086a2903007c2042205254ad7c20024190086a41086a2903007c2048204254ad7c200241c0066a41086a2903007c2047204854ad7c20024190076a41086a2903007c2056204754ad7c2059205654ad7c420d86847c224242ffffffffffffff03833703e048200220022903a006225d20022903b0087c224820022903f0067c224720022903c0077c225620022903a0097c225b204242338820024180086a41086a29030020024190096a41086a2903007c200c205154ad7c200241b0066a41086a2903007c203b200c54ad7c20024180076a41086a2903007c203c203b54ad7c200241d0076a41086a2903007c203d203c54ad7c2042203d54ad7c420d86847c220c42ffffffffffffff03833703e848200220022903e006225120022903d0087c223b20022903b0077c223c20022903b0097c223d20022903c0087c2242200c423388200241a0066a41086a290300200241b0086a41086a2903007c2048205d54ad7c200241f0066a41086a2903007c2047204854ad7c200241c0076a41086a2903007c2056204754ad7c200241a0096a41086a2903007c205b205654ad7c200c205b54ad7c420d86847c220c42ffffffffffffff03833703f0482002200c423388200241e0066a41086a290300200241d0086a41086a2903007c203b205154ad7c200241b0076a41086a2903007c203c203b54ad7c200241b0096a41086a2903007c203d203c54ad7c200241c0086a41086a2903007c2042203d54ad7c200c204254ad7c420d868442137e205f42ffffffffffffff03837c220c42ffffffffffffff03833703d0482002200c423388205942ffffffffffffff03837c3703d848200241801a6a41086a2903002164200241d01a6a41086a290300216520022903801a215720022903d01a210c200241a01b6a41086a290300216620022903a01b2158200241f01b6a41086a290300216720022903f01b215a200241c01c6a41086a290300216820022903c01c215c200241901a6a41086a2903002169200241e01a6a41086a290300216a20022903901a215e20022903e01a213b200241b01b6a41086a290300216b20022903b01b2160200241801c6a41086a290300216c20022903801c2161200241d01c6a41086a290300216d20022903d01c216220022903f019215220022903c01a213c20022903901b215320022903e01b215420022903b01c2155200241f0196a41086a290300216e200241c01a6a41086a290300216f200241901b6a41086a2903002170200241e01b6a41086a2903002171200241b01c6a41086a290300217220022903e019215b20022903b01a213d20022903801b215d20022903d01b215f20022903a01c2151200241e0196a41086a2903002173200241b01a6a41086a2903002174200241801b6a41086a2903002175200241d01b6a41086a2903002176200241a01c6a41086a290300217720022903d019214820022903a01a214220022903f01a214720022903c01b215620022903901c2159200241d0196a41086a2903002178200241a01a6a41086a2903002179200241f01a6a41086a290300217a200241c01b6a41086a290300217b200241901c6a41086a290300217c200241e8c6006a200241d0c8006a106420024180066a201d205920562047204220487c22487c22477c22567c22592051205f205d203d205b7c225b7c225d7c225f7c2251205520542053203c20527c22527c22537c22547c2255205c205a2058200c20577c22577c22587c225a7c225c206220612060203b205e7c225e7c22607c22617c2262423388206d206c206b206a20697c205e203b54ad7c7c2060205e54ad7c7c2061206054ad7c7c2062206154ad7c420d86847c225e423388206820672066206520647c2057200c54ad7c7c2058205754ad7c7c205a205854ad7c7c205c205a54ad7c205e205c54ad7c420d86847c2257423388207220712070206f206e7c2052203c54ad7c7c2053205254ad7c7c2054205354ad7c7c2055205454ad7c2057205554ad7c420d86847c2252423388207720762075207420737c205b203d54ad7c7c205d205b54ad7c7c205f205d54ad7c7c2051205f54ad7c2052205154ad7c420d86847c223c423388207c207b207a207920787c2048204254ad7c7c2047204854ad7c7c2056204754ad7c7c2059205654ad7c203c205954ad7c420d868442137e206242ffffffffffffff03837c224842ffffffffffffff038385420020022d00e8464101711066ad42ff01837d220c83201d85223b42002017420010cc06200241c0036a2018203c42ffffffffffffff038385200c83201885223c42002049420010cc0620024190046a2020205242ffffffffffffff038385200c83202085223d42002039420010cc06200241e0046a200a205742ffffffffffffff038385200c83200a8522424200201a420010cc06200241b0056a200b2048423388205e42ffffffffffffff03837c85200c83200b85224842002015420010cc0620024190066a20154200203b420010cc06200241d0036a203c42002063420010cc06200241a0046a203d42002049420010cc06200241f0046a204242002039420010cc06200241c0056a20484200201a420010cc06200241f0056a203b42002040420010cc06200241b0036a203c42002039420010cc0620024180046a203d4200201a420010cc06200241d0046a204242002015420010cc06200241a0056a204842002017420010cc06200241e0056a203b4200203a420010cc06200241a0036a203c4200201a420010cc06200241f0036a203d42002015420010cc06200241c0046a204242002017420010cc0620024190056a204842002040420010cc06200241d0056a203b42002046420010cc0620024190036a203c42002015420010cc06200241e0036a203d42002017420010cc06200241b0046a204242002040420010cc0620024180056a20484200203a420010cc06200241c0126a201042004288f5a7f5b28623420010cc06200241d0106a2011420042b9a6dff282e9ba01420010cc06200241a0136a2012420042edd5d7bc83fb803c420010cc0620024180146a2013420042edc19ab7ab9cc0c700420010cc06200241a0116a2014420042ea81f582a8b53f420010cc06200241d0126a2010420042bbda9284b7cbdd1b420010cc06200241e0106a2011420042ea81f582a8b53f420010cc06200241b0136a201242004288f5a7f5b28623420010cc0620024190146a2013420042edd5d7bc83fb803c420010cc06200241b0116a2014420042edc19ab7ab9cc0c700420010cc06200241b0126a2010420042edd5d7bc83fb803c420010cc06200241c0106a2011420042d8f8d29390ec01420010cc0620024190136a2012420042edc19ab7ab9cc0c700420010cc06200241f0136a2013420042ea81f582a8b53f420010cc0620024190116a2014420042b9a6dff282e9ba01420010cc06200241a0126a2010420042edc19ab7ab9cc0c700420010cc06200241b0106a2011420042ff91f789b6a19403420010cc0620024180136a2012420042ea81f582a8b53f420010cc06200241e0136a2013420042b9a6dff282e9ba01420010cc0620024180116a2014420042d8f8d29390ec01420010cc0620024190126a2010420042ea81f582a8b53f420010cc06200241a0106a2011420042fff5f38289d9e103420010cc06200241f0126a2012420042b9a6dff282e9ba01420010cc06200241d0136a2013420042d8f8d29390ec01420010cc06200241f0106a2014420042ff91f789b6a19403420010cc06200220022903904b225920022903c023225b20022903f01f7c221020022903f0247c221120022903a0267c22122002290390217c221320022903b023225d2002290380207c221420022903e0247c22152002290390267c221720022903a0217c221a20022903a023225f2002290390207c224020022903d0247c22392002290380267c223a20022903b0217c223b200229039023225120022903a0207c223c20022903c0247c223d20022903f0257c224220022903c0217c2248200229038023225220022903b0207c224920022903b0247c224620022903e0257c224720022903d0217c225642338820024180236a41086a290300200241b0206a41086a2903007c2049205254ad7c200241b0246a41086a2903007c2046204954ad7c200241e0256a41086a2903007c2047204654ad7c200241d0216a41086a2903007c2056204754ad7c420d86847c224942338820024190236a41086a290300200241a0206a41086a2903007c203c205154ad7c200241c0246a41086a2903007c203d203c54ad7c200241f0256a41086a2903007c2042203d54ad7c200241c0216a41086a2903007c2048204254ad7c2049204854ad7c420d86847c223c423388200241a0236a41086a29030020024190206a41086a2903007c2040205f54ad7c200241d0246a41086a2903007c2039204054ad7c20024180266a41086a2903007c203a203954ad7c200241b0216a41086a2903007c203b203a54ad7c203c203b54ad7c420d86847c2240423388200241b0236a41086a29030020024180206a41086a2903007c2014205d54ad7c200241e0246a41086a2903007c2015201454ad7c20024190266a41086a2903007c2017201554ad7c200241a0216a41086a2903007c201a201754ad7c2040201a54ad7c420d86847c2214423388200241c0236a41086a290300200241f01f6a41086a2903007c2010205b54ad7c200241f0246a41086a2903007c2011201054ad7c200241a0266a41086a2903007c2012201154ad7c20024190216a41086a2903007c2013201254ad7c2014201354ad7c420d868442137e205642ffffffffffffff03837c221042ffffffffffffff038385200c832059853703904b200220022903984b22112010423388204942ffffffffffffff03837c85200c832011853703984b200220022903a04b2210203c42ffffffffffffff038385200c832010853703a04b200220022903a84b2210204042ffffffffffffff038385200c832010853703a84b200220022903b04b2210201442ffffffffffffff038385200c832010853703b04b200220022903b003223c20022903f0057c22102002290380047c221120022903d0047c221220022903a0057c221320022903c003223d2002290380067c22142002290390047c221520022903e0047c221720022903b0057c221a20022903d00322422002290390067c224020022903a0047c223920022903f0047c223a20022903c0057c223b423388200241d0036a41086a29030020024190066a41086a2903007c2040204254ad7c200241a0046a41086a2903007c2039204054ad7c200241f0046a41086a2903007c203a203954ad7c200241c0056a41086a2903007c203b203a54ad7c420d86847c2240423388200241c0036a41086a29030020024180066a41086a2903007c2014203d54ad7c20024190046a41086a2903007c2015201454ad7c200241e0046a41086a2903007c2017201554ad7c200241b0056a41086a2903007c201a201754ad7c2040201a54ad7c420d86847c221442ffffffffffffff03833703e048200220022903a003223a20022903e0057c221520022903f0037c221720022903c0047c221a2002290390057c22392014423388200241b0036a41086a290300200241f0056a41086a2903007c2010203c54ad7c20024180046a41086a2903007c2011201054ad7c200241d0046a41086a2903007c2012201154ad7c200241a0056a41086a2903007c2013201254ad7c2014201354ad7c420d86847c221042ffffffffffffff03833703e8482002200229039003223c20022903d0057c221120022903e0037c221220022903b0047c22132002290380057c22142010423388200241a0036a41086a290300200241e0056a41086a2903007c2015203a54ad7c200241f0036a41086a2903007c2017201554ad7c200241c0046a41086a2903007c201a201754ad7c20024190056a41086a2903007c2039201a54ad7c2010203954ad7c420d86847c221042ffffffffffffff03833703f0482002201042338820024190036a41086a290300200241d0056a41086a2903007c2011203c54ad7c200241e0036a41086a2903007c2012201154ad7c200241b0046a41086a2903007c2013201254ad7c20024180056a41086a2903007c2014201354ad7c2010201454ad7c420d868442137e203b42ffffffffffffff03837c221042ffffffffffffff03833703d04820022010423388204042ffffffffffffff03837c3703d848200241c0126a41086a2903002154200241d0106a41086a290300215520022903c012211120022903d0102156200241a0136a41086a290300215720022903a013215920024180146a41086a2903002158200229038014215b200241a0116a41086a290300215a20022903a011215d200241d0126a41086a290300215c200241e0106a41086a290300215e20022903d012211220022903e010215f200241b0136a41086a290300216020022903b013215120024190146a41086a29030021612002290390142152200241b0116a41086a290300216220022903b011215320022903b012211320022903c0102148200229039013214920022903f01321462002290390112147200241b0126a41086a2903002163200241c0106a41086a290300216420024190136a41086a2903002165200241f0136a41086a290300216620024190116a41086a290300216720022903a012211420022903b010213b200229038013213c20022903e013213d2002290380112142200241a0126a41086a2903002168200241b0106a41086a290300216920024180136a41086a290300216a200241e0136a41086a290300216b20024180116a41086a290300216c200229039012211520022903a010213920022903f012213a20022903d013216d20022903f010216e20024190126a41086a290300216f200241a0106a41086a2903002170200241f0126a41086a2903002171200241d0136a41086a2903002172200241f0106a41086a2903002173200241e8c6006a200241d0c8006a106420022d00e84641017110662104200220022903984b221742f0ffffffffffff3f20177d227442ffffffffffffff038342d0fdffffffffff3f20022903904b221a7d22754233887c8542002004ad42ff01837d22108320178522763703984b2002201a201a42f0ffffffffffff3f20022903b04b22407d227742338842137e207542ffffffffffffff03837c852010838522753703904b200241f0026a201f206e206d203a201520397c22177c221a7c22397c223a2042203d203c2014203b7c223b7c223c7c223d7c2242204720462049201320487c22487c22497c22467c2247205d205b2059201120567c22567c22597c225b7c225d2053205220512012205f7c225f7c22517c22527c2253423388206220612060205c205e7c205f201254ad7c7c2051205f54ad7c7c2052205154ad7c7c2053205254ad7c420d86847c225f423388205a20582057205420557c2056201154ad7c7c2059205654ad7c7c205b205954ad7c7c205d205b54ad7c205f205d54ad7c420d86847c2256423388206720662065206320647c2048201354ad7c7c2049204854ad7c7c2046204954ad7c7c2047204654ad7c2056204754ad7c420d86847c2248423388206c206b206a206820697c203b201454ad7c7c203c203b54ad7c7c203d203c54ad7c7c2042203d54ad7c2048204254ad7c420d86847c2213423388207320722071206f20707c2017201554ad7c7c201a201754ad7c7c2039201a54ad7c7c203a203954ad7c2013203a54ad7c420d868442137e205342ffffffffffffff03837c221542ffffffffffffff038385200c83201f8522114200204c20767d221742ffffffffffffff0383204d20757d22394233887c2212420010cc06200220022903a04b221442f0ffffffffffff3f20147d221a42ffffffffffffff038320744233887c8520108320148522143703a04b200241306a201b201342ffffffffffffff038385200c83201b8522134200204e20147d221b42ffffffffffffff038320174233887c221742137e223a420010cc06200220022903a84b221442f0ffffffffffff3f20147d223b42ffffffffffffff0383201a4233887c85201083201485221a3703a84b20024180016a2021204842ffffffffffffff038385200c8320218522144200204f201a7d221a42ffffffffffffff0383201b4233887c221b42137e221f420010cc06200220402040207742ffffffffffffff0383203b4233887c852010838522213703b04b200241d0016a2023205642ffffffffffffff038385200c8320238522104200205020217d222142ffffffffffffff0383201a4233887c222342137e221a420010cc06200241a0026a203e2015423388205f42ffffffffffffff03837c85200c83203e85220c4200202142338842137e203942ffffffffffffff03837c2215420010cc0620024180036a201542002011420010cc06200241c0006a20134200201242137e420010cc0620024190016a20144200203a420010cc06200241e0016a20104200201f420010cc06200241b0026a200c4200201a420010cc06200241e0026a201142002017420010cc06200241206a20134200201f420010cc06200241f0006a20144200201a420010cc06200241c0016a201042002015420010cc0620024190026a200c42002012420010cc06200241d0026a20114200201b420010cc06200241106a20134200201a420010cc06200241e0006a201442002015420010cc06200241b0016a201042002012420010cc0620024180026a200c42002017420010cc06200241c0026a201142002023420010cc062002201342002015420010cc06200241d0006a201442002012420010cc06200241a0016a201042002017420010cc06200241f0016a200c4200201b420010cc0620022002290300224220022903c0027c220c20022903507c221020022903a0017c221120022903f0017c22122002290310224820022903d0027c221320022903607c221420022903b0017c22152002290380027c22172002290320224920022903e0027c221a20022903707c221b20022903c0017c221f2002290390027c22212002290330224620022903f0027c22232002290380017c223e20022903d0017c224020022903a0027c2239200229034022472002290380037c223a2002290390017c223b20022903e0017c223c20022903b0027c223d423388200241c0006a41086a29030020024180036a41086a2903007c203a204754ad7c20024190016a41086a2903007c203b203a54ad7c200241e0016a41086a2903007c203c203b54ad7c200241b0026a41086a2903007c203d203c54ad7c420d86847c223a423388200241306a41086a290300200241f0026a41086a2903007c2023204654ad7c20024180016a41086a2903007c203e202354ad7c200241d0016a41086a2903007c2040203e54ad7c200241a0026a41086a2903007c2039204054ad7c203a203954ad7c420d86847c2223423388200241206a41086a290300200241e0026a41086a2903007c201a204954ad7c200241f0006a41086a2903007c201b201a54ad7c200241c0016a41086a2903007c201f201b54ad7c20024190026a41086a2903007c2021201f54ad7c2023202154ad7c420d86847c221a423388200241106a41086a290300200241d0026a41086a2903007c2013204854ad7c200241e0006a41086a2903007c2014201354ad7c200241b0016a41086a2903007c2015201454ad7c20024180026a41086a2903007c2017201554ad7c201a201754ad7c420d86847c2213423388200241086a290300200241c0026a41086a2903007c200c204254ad7c200241d0006a41086a2903007c2010200c54ad7c200241a0016a41086a2903007c2011201054ad7c200241f0016a41086a2903007c2012201154ad7c2013201254ad7c420d868442137e203d42ffffffffffffff03837c220c42ffffffffffffff038322103703d0482002200c423388203a42ffffffffffffff03837c22113703d8482002201342ffffffffffffff038322123703f0482002201a42ffffffffffffff038322133703e8482002202342ffffffffffffff038322143703e048200241e8c6006a200241d0c8006a10642002201242f0ffffffffffff3f20127d221542ffffffffffffff038342f0ffffffffffff3f20137d22174233887c85420020022d00e8464101711066ad42ff01837d220c832012853703f04820022013201742ffffffffffffff038342f0ffffffffffff3f20147d22124233887c85200c832013853703e84820022014201242ffffffffffffff038342f0ffffffffffff3f20117d22124233887c85200c832014853703e04820022011201242ffffffffffffff038342d0fdffffffffff3f20107d22124233887c85200c832011853703d84820022010201542338842137e201242ffffffffffffff03837c85200c832010853703d048200241b0c7006a200241d0c8006a106420004198016a201937030020004190016a201637030020004188016a200f37030020004180016a200d3703002000200e370378200041f0006a2043370300200041e8006a2045370300200041e0006a2044370300200041d8006a204b3703002000204a370350200041c8006a2041370300200041c0006a203f370300200041386a2022370300200041306a201c3703002000201e37032820002018370320200020203703182000200a3703102000200b3703082000201d370300200041b8016a2005290300370000200041b0016a2003290300370000200041a8016a200241b0c7006a41086a290300370000200020022903b0473700a001200141003a0000200141003a0001200141003a0002200141003a0003200141003a0004200141003a0005200141003a0006200141003a0007200141003a0008200141003a0009200141003a000a200141003a000b200141003a000c200141003a000d200141003a000e200141003a000f200141003a0010200141003a0011200141003a0012200141003a0013200141003a0014200141003a0015200141003a0016200141003a0017200141003a0018200141003a0019200141003a001a200141003a001b200141003a001c200141003a001d200141003a001e200141003a001f200141003a0020200141003a0021200141003a0022200141003a0023200141003a0024200141003a0025200141003a0026200141003a0027200141003a0028200141003a0029200141003a002a200141003a002b200141003a002c200141003a002d200141003a002e200141003a002f200141003a0030200141003a0031200141003a0032200141003a0033200141003a0034200141003a0035200141003a0036200141003a0037200141003a0038200141003a0039200141003a003a200141003a003b200141003a003c200141003a003d200141003a003e200141003a003f200141003a0040200141003a0041200141003a0042200141003a0043200141003a0044200141003a0045200141003a0046200141003a0047200141003a0048200141003a0049200141003a004a200141003a004b200141003a004c200141003a004d200141003a004e200141003a004f200141003a0050200141003a0051200141003a0052200141003a0053200141003a0054200141003a0055200141003a0056200141003a0057200141003a0058200141003a0059200141003a005a200141003a005b200141003a005c200141003a005d200141003a005e200141003a005f200141003a0060200141003a0061200141003a0062200141003a0063200141003a0064200141003a0065200141003a0066200141003a0067200141003a0068200141003a0069200141003a006a200141003a006b200141003a006c200141003a006d200141003a006e200141003a006f200141003a0070200141003a0071200141003a0072200141003a0073200141003a0074200141003a0075200141003a0076200141003a0077200141003a0078200141003a0079200141003a007a200141003a007b200141003a007c200141003a007d200141003a007e200141003a007f200141003a008001200141003a008101200141003a008201200141003a008301200141003a008401200141003a008501200141003a008601200141003a008701200141003a008801200141003a008901200141003a008a01200141003a008b01200141003a008c01200141003a008d01200141003a008e01200141003a008f01200141003a009001200141003a009101200141003a009201200141003a009301200141003a009401200141003a009501200141003a009601200141003a009701200141003a009801200141003a009901200141003a009a01200141003a009b01200141003a009c01200141003a009d01200141003a009e01200141003a009f01200141003a00a001200141003a00a101200141003a00a201200141003a00a301200141003a00a401200141003a00a501200141003a00a601200141003a00a701200141003a00a801200141003a00a901200141003a00aa01200141003a00ab01200141003a00ac01200141003a00ad01200141003a00ae01200141003a00af01200141003a00b001200141003a00b101200141003a00b201200141003a00b301200141003a00b401200141003a00b501200141003a00b601200141003a00b701200141003a00b801200141003a00b901200141003a00ba01200141003a00bb01200141003a00bc01200141003a00bd01200141003a00be01200141003a00bf01200141003a00c001200141003a00c101200141003a00c201200141003a00c301200141003a00c401200141003a00c501200141003a00c601200141003a00c701200241b0cc006a24000b130020004102360204200041d48fc6003602000b3400200041868cc70036020420004100360200200041146a410b360200200041106a41ec95c600360200200041086a42043702000b4901017f02404104102422020d001033000b2000420437020420002002360200200041004101106d2000280200200041086a220028020022026a41003a00002000200241016a3602000bb00101067f230041206b22022400200241186a22034200370300200241106a22044200370300200241086a220542003703002002420037030002404120102422060d001033000b2000422037020420002006360200200041004120106d2000280200200041086a220628020022076a220020022903003700002006200741206a360200200041086a2005290300370000200041106a2004290300370000200041186a2003290300370000200241206a24000b13002000410236020420004198aec6003602000b4a01017f02404108102422020d001033000b2000420837020420002002360200200041004108106d2000280200200041086a220028020022026a42f02e3700002000200241086a3602000b4a01017f02404108102422020d001033000b2000420837020420002002360200200041004108106d2000280200200041086a220028020022026a42d8043700002000200241086a3602000b130020004106360204200041f8b3c6003602000b3400200041b58dc70036020420004100360200200041146a4101360200200041106a4188d7c600360200200041086a42053702000b5e01027f02404114102422020d001033000b200042143702042000200236020041014100200010b6012000200041086a22022802004110106d2000280200200228020022006a22034200370008200342003700002002200041106a3602000b130020004103360204200041d4d9c6003602000b4901017f02404102102422020d001033000b2000420237020420002002360200200041004102106d2000280200200041086a220028020022026a41203b00002000200241026a3602000b5601027f02404110102422020d001033000b2000421037020420002002360200200041004110106d2000280200200041086a220028020022026a220342003700082003428081e492063700002000200241106a3602000b5701027f02404110102422020d001033000b2000421037020420002002360200200041004110106d2000280200200041086a220028020022026a2203420037000820034280a8f2e38e1d3700002000200241106a3602000b860602087f067e230041d0016b220324002003200236020c20032001360208200341106a2001200210820202400240200328021022040d00200041023a00300c010b200341186a28020021052003280214210641002101200341003a008801200421070240024002400240024003402007210820052001460d01200341e8006a20016a20082d00003a00002003200141016a22023a008801200841016a21072002210120024120470d000b200341b0016a41186a2201200341e8006a41186a290300370300200341b0016a41106a2209200341e8006a41106a290300370300200341b0016a41086a220a200341e8006a41086a290300370300200320032903683703b001200241ff01714120490d01200341c8006a41086a200a290300370300200341c8006a41106a2009290300370300200341c8006a41186a2001290300370300200320032903b001370348200520026b410f4d0d01200541706a2002460d0120082d0011220241014b0d01200741086a290000210b2007290000210c4100210120020e020302030b200141ff0171450d00200341003a0088010b200341003602b801200342013703b0012003410e360294012003200341086a360290012003200341b0016a360248200341fc006a41013602002003420137026c2003418c8dc600360268200320034190016a360278200341c8006a41c4e1c000200341e8006a10351a20032802b00120032802b801108402024020032802b401450d0020032802b00110260b410221010c020b410121010b200341206a41186a200341c8006a41186a290300220d370300200341206a41106a200341c8006a41106a290300220e370300200341206a41086a200341c8006a41086a290300220f370300200320032903482210370320200320032800413602682003200341c4006a28000036006b2000200b3703082000200c37030020002010370310200041186a200f370300200041206a200e370300200041286a200d370300200041346a200328006b360000200020032802683600310b200020013a00302006450d00200410260b200341d0016a24000b980202037f027e230041106b220324000240411110242204450d002003421137020420032004360200200341004120106d2003280200200328020822056a22042002290010370000200441086a200241186a290000370000200441106a200241206a290000370000200441186a200241286a2900003700002003200541206a2204360208200241086a290300210620022903002107200320044110106d2003280200200328020822046a22052006370008200520073700002003200441106a220436020820022d00302105200320044101106d20032802002202200328020822046a20053a00002003200441016a2204360208200020012002200410b30102402003280204450d00200210260b200341106a24000f0b1033000b950201047f230041106b22032400024002402002280208220441f0026c4104722205417f4c0d0020022802002102200510242206450d012003410036020820032005360204200320063602002003200410a10102402004450d00200441f0026c2104034002400240200241bc026a2802004102470d00200320032802084101106d2003280200200328020822056a41003a00002003200541016a3602080c010b200320032802084101106d2003280200200328020822056a41013a00002003200541016a3602082002200310e8030b200241f0026a2102200441907d6a22040d000b0b200020012003280200200328020810b30102402003280204450d00200328020010260b200341106a24000f0b1034000b1033000b130020004101360204200041c0e2c6003602000b3400200041f58cc70036020420004100360200200041146a4103360200200041106a41e8e3c600360200200041086a420c3702000b130020004106360204200041c8e9c6003602000bf63609017f017e057f017e027f017e047f037e027f230041a0066b22032400200341c0006a20014180026a290000370300200341386a200141f8016a290000370300200341286a41086a200141f0016a290000370300200320012900e8013703282001290300210420034188016a200141880210cf061a2003200341d0056a360294032003200341d0056a36029003200341f8056a20034188016a41086a220510f40220034198036a20034180026a220610f40202400240024002400240200341f8056a20034198036a412010d206450d002003419c016a2802002207450d0020034194016a2802002101200741246c21070340024020012d00004101470d0002404193acc7002001460d00200141016a28000041c28289aa04470d010b200141086a28020021082003200141106a2802003602fc05200320083602f80520034198036a200341f8056a109d042003290398034203510d002003418c026a2802002207450d0220032802a803210920032903a003210a20034184026a2802002101200741246c21070240024002400240024002400240024002400340024020012d00004101470d0002404193acc7002001460d00200141016a28000041c28289aa04470d010b200141086a28020021082003200141106a2802003602fc05200320083602f80520034198036a200341f8056a109d042003290398034203510d00200329038801200a520d0d200a20032903a003520d0d200920032802a803470d0d20034198036a200541f00010cf061a2003200341f0026a22013602880420034198036a200110f302450d0e20034198036a200641f00010cf061a200320013602880420034198036a200110f302450d0f2002280210210b2002280200210120034188016a41186a2207420037030020034188016a41106a2208420037030020034188016a41086a22054200370300200342003703880120034198036a41868cc700410410fb01200520034198036a41086a220629000037030020032003290098033703880120034198036a41a89ec600410b10fb01200720062900003703002008200329009803370300200341186a20034188016a10ab03410221052001420020042003290320420020032802181b7d220a200a2004561b220a42d80480a7417f200a428080808080cb00541b470d1020034194016a200341286a41086a2903003702002003419c016a200341286a41106a290300370200200341a4016a200341286a41186a290300370200200341e2c289ab06360288012003200329032837028c01200341f8056a41106a200241106a280200360200200341f8056a41086a200241086a290200370300200320022902003703f80520034198036a20034188016a200341f8056a10ef034101210c20032d0098034101470d02200341c8006a41176a220120034198036a41196a290000370000200341c8006a41106a2207200341aa036a290100370300200341c8006a41086a200341a2036a290100220a3703002003200329019a03220d37034820032d0099032108200341e8006a41176a22022001290000370000200341e8006a41106a22012007290300370300200341e8006a41086a2207200a3703002003200d3703684100210e024020002d00004101470d0020034188016a41186a2205200041196a29000037030020034188016a41106a200041116a29000037030020034188016a41086a200041096a290000370300200320002900013703880141201024220c450d04200c200329038801370000200c41186a2005290300370000200c41106a20034188016a41106a290300370000200c41086a20034188016a41086a2903003700004101210e0b20034190046a41176a200229000037000020034190046a41106a200129030037030020034190046a41086a20072903003703002003200329036837039004412010242202450d03200220083a00002002200329039004370001200241096a20034190046a41086a290300370000200241116a200341a0046a290300370000200241186a200341a7046a2900003700002003200e3602b8042003200e3602b4042003200c3602b004410810242201450d07200342083702ec04200320013602e80441002107200341e8046a41004108106d20032802e80420032802f00422016a20043700002003200141086a3602f00420034188016a419dd5c10010fb0220034198036a2003280288012208200328029001109d02200329029c03420020032802980322011b210a2001410120011b21000240200328028c01450d00200810260b2003200a4220883e02fc04200320003602f804200341106a200341f8046a108f01410821084100210520032802100d062003280214220f20032802fc0441286e22012001200f4b1bad42287e220d422088a70d08200da72201417f4c0d080240024020010d00410821090c010b200110242209450d080b200341003602880520032009360280052003200141286e22013602840541002110024002400240200f450d0041002111034020032802fc0422074108490d03201141016a211120032802f8042205290000210d2003200741786a22063602fc042003200541086a3602f80441002101200341003a00a801200741776a2107034020062001460d0320034188016a20016a200520016a220841086a2d00003a00002003200841096a3602f8042003200141016a22083a00a801200320073602fc042007417f6a21072008210120084120470d000b20034198036a41186a220120034188016a41186a29030037030020034198036a41106a220720034188016a41106a29030037030020034198036a41086a220520034188016a41086a290300370300200320032903880137039803200841ff01714120490d03200341b0056a41086a20052903002212370300200341b0056a41106a20072903002213370300200341b0056a41186a2001290300221437030020034190056a41186a2207201437030020034190056a41106a2208201337030020034190056a41086a22052012370300200320032903980322123703d005200320123703b005200320123703900502402010200328028405470d0020034180056a201010e901200328028005210920032802880521100b2009201041286c6a2201200d3703002001200329039005370308200141106a2005290300370300200141186a2008290300370300200141206a20072903003703002003201041016a2210360288052011200f470d000b20032802840521010b2010410020091b21052001410020091b21072009410820091b21080c080b200141ff0171450d00200341003a00a8010b2003280284052201450d05200141286c0d040c050b200141246a21012007415c6a22070d000c0c0b0b410221050c0e0b102c000b200910260b4100210741082108410021050b20034188016a419dd5c100200341e8046a10fc0220034198036a200328028801220620032802900110a502200329029c03420020032802980322011b210d2001410120011b21110240200328028c01450d00200610260b200341e0046a2005360200200341dc046a2007360200200341c0046a41106a200d370300200341c0046a41086a200341e8046a41086a280200360200200320032903e8043703c004200320083602d804200320113602cc040240200aa7450d00200010260b200241086a290000210a200241106a290000211220022900002113200341d0056a41186a200241186a290000370300200341d0056a41106a2012370300200341d0056a41086a200a370300200320133703d005410810242201450d002003420837028c01200320013602880120034188016a41004108106d200328028801220720032802900122016a20043700002003419c016a41002900a5d5413702002003200141086a360290012003410029009dd541370294012003200341d0056a3602a401200341f8056a20034188016a1094010240200328028c01450d00200710260b200d422088210a20034188016a200341f8056a10fe02200341086a200328028801220720032802900141d4c0c70041004100108102200328020821010240200328028c01450d00200710260b200aa7210f0240024020014101470d00410021010c010b20034198036a41186a2207200341d0056a41186a29030037030020034198036a41106a2208200341d0056a41106a29030037030020034198036a41086a2205200341d0056a41086a290300370300200320032903d0053703980320034188016a200341b0046a10c30120034188016a410c6a220141186a2007290300370000200141106a2008290300370000200141086a2005290300370000200120032903980337000020034198036a200341f8056a10fe02200328029803220120032802a00320034188016a10af050240200328029c03450d00200110260b0240200328028c0141ffffff3f71450d0020032802880110260b20034198036a41186a200341f8056a41186a29030037030020034198036a41106a200341f8056a41106a29030037030020034198036a41086a200341f8056a41086a290300370300200320032903f8053703980320032802d804210641002101024002400240024020032802e004220041014b0d0020000e020102010b20002107034020012007410176220820016a22052006200541286c6a2903002004561b2101200720086b220741014b0d000c020b0b20034188016a41186a20034198036a41186a29030037030020034188016a41106a20034198036a41106a29030037030020034188016a41086a20034198036a41086a290300370300200320032903980337038801410021070c010b2006200141286c6a290300210a20034188016a41186a20034198036a41186a29030037030020034188016a41106a20034198036a41106a29030037030020034188016a41086a20034198036a41086a290300370300200320032903980337038801200020012001200a2004546a200a2004511b22074f0d0020072000103b000b0240200020032802dc04470d00200341c0046a41186a200010e90120032802d404210f20032802d80421060b2006200741286c6a220141286a2001200020076b41286c10d0061a200120043703002001200329038801370308200141106a20034188016a41086a2208290300370300200141186a20034188016a41106a2205290300370300200141206a20034188016a41186a2206290300370300410121012003200041016a3602e004200620034198036a41186a290300370300200520034198036a41106a290300370300200820034198036a41086a2903003703002003200329039803370388010240200f20032802d004470d00200341c0046a410c6a200f410110930120032802d404210f0b20032802cc042211200f4105746a2207200329038801370000200741186a2006290300370000200741106a2005290300370000200741086a20082903003700002003200f41016a220f3602d4040b20021026024020010d00024020032802c404450d0020032802c00410260b024020032802d00441ffffff3f71450d00201110260b024020032802dc042201450d00200141286c450d0020032802d80410260b200e450d04200c10260c040b024002400240200f450d00200f410574210220034188016a4104722101201121070340200341b0056a200710fe0220034188016a20032802b005220520032802b80510b00520034198036a41086a2206200141086a29020037030020034198036a41106a2200200141106a29020037030020034198036a41186a2209200141186a29020037030020034198036a41206a2210200141206a29020037030020032001290200370398030240024020032802880122080d00410021080c010b200341f8056a41206a2010290300370300200341f8056a41186a2009290300370300200341f8056a41106a2000290300370300200341f8056a41086a200629030037030020032003290398033703f8050b024020032802b405450d00200510260b20080d02200741206a2107200241606a22020d000b0b41002105410421154100210f0c010b200341d0056a41206a2201200341f8056a41206a290300370300200341d0056a41186a2205200341f8056a41186a290300370300200341d0056a41106a2206200341f8056a41106a290300370300200341d0056a41086a2200200341f8056a41086a290300370300200320032903f8053703d005412c10242215450d0120152008360200201520032903d0053702042015410c6a2000290300370200201541146a20062903003702002015411c6a2005290300370200201541246a200129030037020020034281808080103702940520032015360290050240024020024120470d004101210f0c010b200741206a21052011200f4105746a221041606a211120034188016a41047221014101210f0340200521070340200341b0056a200710fe0220034188016a20032802b005220220032802b80510b00520034198036a41086a2205200141086a29020037030020034198036a41106a2206200141106a29020037030020034198036a41186a2200200141186a29020037030020034198036a41206a2209200141206a29020037030020032001290200370398030240024020032802880122080d00410021080c010b200341f8056a41206a2009290300370300200341f8056a41186a2000290300370300200341f8056a41106a2006290300370300200341f8056a41086a200529030037030020032003290398033703f8050b024020032802b405450d00200210260b024020080d002010200741206a2207470d010c030b0b200341d0056a41206a200341f8056a41206a290300220a370300200341d0056a41186a200341f8056a41186a290300220d370300200341d0056a41106a200341f8056a41106a2903002212370300200341d0056a41086a200341f8056a41086a2903002213370300200320032903f80522143703d00520034188016a41206a2206200a37030020034188016a41186a2200200d37030020034188016a41106a2209201237030020034188016a41086a2216201337030020032014370388010240200f200328029405470d0020034190056a200f10ee0120032802900521150b200741206a21052015200f412c6c6a2202200836020020022003290388013702042002410c6a2016290300370200200241146a20092903003702002002411c6a2000290300370200200241246a20062903003702002003200f41016a220f3602980520112007470d000b0b20032802940521050b20034188016a41206a200341c0046a41206a280200220136020020034188016a41186a200341c0046a41186a290300220a37030020034188016a41106a200341c0046a41106a29030037030020034188016a41086a200341c0046a41086a290300370300200320032903c00437038801200141286c4104722207417f4c0d01200710242208450d00200aa721022003410036028006200320073602fc05200320083602f805200341f8056a200110a10102402001450d002002200141286c6a21082002210103402001290300210a200341f8056a2003280280064108106d20032802f80520032802800622076a200a3700002003200741086a360280062003200341f8056a36029803200141086a20034198036a109c01200141286a22012008470d000b0b20034198036a419dd5c10010fb02200328029803220120032802a003200341f8056a1099020240200328029c03450d00200110260b024020032802fc05450d0020032802f80510260b20034198036a419dd5c10020034188016a10fc02200328029803220120032802a00320034194016a10b1050240200328029c03450d00200110260b0240200328028c01450d0020032802880110260b024020034198016a28020041ffffff3f71450d0020032802940110260b0240200341a4016a2802002201450d00200141286c450d00200210260b0240200e450d00200c10260b2015450d03200b4101200b41014b1b2201418094ebdc036e2001418094ebdc03704100476a22074101200741014b1b220720014b0d02200341003602d805200342043703d005200341d0056a4100200f10e7012001200f41036c220820012008491b20076ead428094ebdc037e200120076ead8042ffffffff0f83220a200a7e220a42808090bbbad6adf00d200a42808090bbbad6adf00d541b428094ebdc0380210a20032802d80521020240200f450d00200aa7210820032802d00520024102746a2101200f2107034020012008360200200141046a21012007417f6a22070d000b200f20026a21020b200320023602d805410810242201450d00200342083702fc05200320013602f805200341f8056a41004108106d20032802f80520032802800622016a20043700002003418c066a41002900a5d5413702002003200141086a360280062003410029009dd54137028406200341b3036a200341f8056a41186a280200360000200341ab036a200341f8056a41106a290300370000200341a3036a200329038006370000200320032903f80537009b0320034191016a20034198036a41086a29000037000020034199016a20034198036a41106a29000037000020034188016a41186a200341af036a290000370000200341a8016a41013a0000200341033a00880120032003290098033700890120034188016a108702024020032802d40541ffffffff0371450d0020032802d00510260b0240200f450d00200f412c6c21072015210103400240200141046a28020041ffffff3f71450d00200128020010260b2001412c6a2101200741546a22070d000b0b02402005450d002005412c6c450d00201510260b200341a0066a240041040f0b1033000b1034000b41b0b2c200411941ccb2c200102f000b410321050c060b200141246a21012007415c6a22070d000b0b02402003419c016a2802002207450d0020034188016a410c6a2802002101200741246c210703400240024020012d0000220841044b0d0002400240024020080e050400010204040b2001410c6a280200450d03200141086a28020010260c030b2001410c6a280200450d02200141086a28020010260c020b2001410c6a280200450d01200141086a28020010260c010b200141086a280200450d00200141046a28020010260b200141246a21012007415c6a22070d000b0b20034198016a2802002201450d00200141246c450d0020032802940110260b02402003418c026a2802002207450d0020034184026a2802002101200741246c210703400240024020012d0000220841044b0d0002400240024020080e050400010204040b2001410c6a280200450d03200141086a28020010260c030b2001410c6a280200450d02200141086a28020010260c020b2001410c6a280200450d01200141086a28020010260c010b200141086a280200450d00200141046a28020010260b200141246a21012007415c6a22070d000b0b20034188026a2802002201450d00200141246c450d0020032802840210260b410121050b2002280204210802402002410c6a2802002201450d002001410c6c21072008210103400240200141046a280200450d00200128020010260b2001410c6a2101200741746a22070d000b0b200241086a2802002201450d002001410c6c450d00200810260b200341a0066a240020050b8d52020b7f047e23002203210420034180096b416071220324000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012d00000e0700010203040506000b200341f4056a4101360200200342013702e405200341dcedc6003602e005200341043602c402200341d4edc6003602c0022003200341c0026a3602f005200341e0056a41ecc0c700103d000b200141246a2802002105200141216a2d00002106200341a0016a41186a200141196a290000370300200341a0016a41106a200141116a290000370300200341a0016a41086a200141096a290000370300200320012900013703a001200341e0056a41206a200241206a290200370300200341e0056a41186a200241186a290200370300200341e0056a41106a200241106a290200370300200341e0056a41086a2201200241086a290200370300200320022902003703e005200341c0026a200341e0056a10d60220034190026a41086a2202200341c0026a41096a29000037030020034190026a41106a2207200341c0026a41116a29000037030020034190026a41186a2208200341c0026a41196a290000370300200320032900c1023703900220032d00c0024101460d06200341c8016a41186a2008290300370300200341c8016a41106a2007290300370300200341c8016a41086a200229030037030020032003290390023703c801200341c0026a200341a0016a10db05200341e0056a20032802c002220820032802c80210dc0520032802e40521072001280200410020032802e00522011b2102024020032802c402450d00200810260b2007410020011b21092001410120011b210a2002450d27200a200241216c6a21070240200641ff0171220b4104460d00200a2101034020034190026a41186a2208200141186a29000037030020034190026a41106a220c200141106a29000037030020034190026a41086a220d200141086a2900003703002003200129000037039002200141206a2d000022024104460d29200341e0056a41186a2008290300370300200341e0056a41106a200c290300370300200341e0056a41086a200d29030037030020032003290390023703e005200320023a0080060240200341e0056a200341c8016a412010d2060d002002200b460d080b200141216a22012007470d000c290b0b200a2101034020034190026a41186a2202200141186a29000037030020034190026a41106a2208200141106a29000037030020034190026a41086a220c200141086a2900003703002003200129000037039002200141206a2d000022064104460d28200341e0056a41186a2002290300370300200341e0056a41106a2008290300370300200341e0056a41086a200c29030037030020032003290390023703e005200320063a0080060240200341e0056a200341c8016a412010d206450d00200141216a22012007460d290c010b0b200341e8016a41186a200341e0056a41186a290300370300200341e8016a41106a200341e0056a41106a290300370300200341e8016a41086a200341e0056a41086a290300370300200320032903e0053703e8010c240b200141216a2d0000210d20034188056a41186a2206200141196a29000037030020034188056a41106a2207200141116a29000037030020034188056a41086a2208200141096a2900003703002003200129000137038805200341e0056a41206a200241206a290200370300200341e0056a41186a200241186a290200370300200341e0056a41106a200241106a290200370300200341e0056a41086a200241086a290200370300200320022902003703e005200341c0026a200341e0056a10d60220034190026a41086a2201200341c0026a41096a29000037030020034190026a41106a2202200341c0026a41116a29000037030020034190026a41186a220c200341c0026a41196a290000370300200320032900c1023703900220032d00c0024101460d0820034198086a41186a200c29030037030020034198086a41106a200229030037030020034198086a41086a2001290300370300200320032903900237039808200341c0056a41186a2006290300370300200341c0056a41106a2007290300370300200341c0056a41086a200829030037030020032003290388053703c005200341a0016a20034198086a10db05200341e0056a20032802a001220720032802a801220810dc050240024020032802e00522020d004101210220034101360290024200210e41002106410021014200210f0c010b20032002360290022003200341ec056a28020036029c02200341f8056a290300210f200341f0056a290300210e200341e8056a280200210120032802e40521060b20034190026a41186a200f3703002003200e3703a00220032006360294022003200136029802200341e8016a41186a220c200341c0056a41186a290300370300200341e8016a41106a2205200341c0056a41106a290300370300200341e8016a41086a2209200341c0056a41086a290300370300200320032903c0053703e80102402001411f4b0d00200341c0026a41186a200c290300370300200341c0026a41106a2005290300370300200341c0026a41086a2009290300370300200320032903e8013703c0022003200d3a00e002200341206a20022001200341c0026a1080032003280220450d082003280224210c200341e0056a41206a200341c0026a41206a2d00003a0000200341e0056a41186a200341c0026a41186a290300370300200341e0056a41106a200341c0026a41106a290300370300200341e0056a41086a200341c0026a41086a290300370300200320032903c0023703e0052001200c490d07024020012006470d0020034190026a200610f301200341a8026a290300210f20032903a002210e20032802900221020b2002200c41216c6a220641216a20062001200c6b41216c10d0061a200641186a200341e0056a41186a290300370000200641106a200341e0056a41106a290300370000200641086a200341e0056a41086a220c290300370000200620032903e0053700002003200141016a220136029802200341106a2001ad4200428081e49206420010cc06200641206a200341e0056a41206a2d00003a00000240200329031022104280a8f2e38e1d7c2211200e56200341106a41086a2903002011201054ad7c2210200f562010200f5122011b0d002011200e542010200f5420011b450d20200320034198086a200e20117d200f20107d200e201154ad7d10da020c200b200341e0056a20034198086a2011200e7d2010200f7d2011200e54ad7d10d902200320032900e1053703b0052003200c2800003600b70520032d00e00522014104460d1f200341d0016a20032800b705360000200320013a00c801200320032903b0053700c9010c1e0b200341c8016a410110e7020c1d0b200141216a2d0000210d20034198086a41186a2206200141196a29000037030020034198086a41106a2207200141116a29000037030020034198086a41086a2208200141096a2900003703002003200129000137039808200341e0056a41206a200241206a290200370300200341e0056a41186a200241186a290200370300200341e0056a41106a200241106a290200370300200341e0056a41086a200241086a290200370300200320022902003703e005200341c0026a200341e0056a10d602200341c0056a41086a2201200341c0026a41096a290000370300200341c0056a41106a2202200341c0026a41116a290000370300200341c0056a41186a220c200341c0026a41196a290000370300200320032900c1023703c00520032d00c0024101460d0920034190026a41186a200c29030037030020034190026a41106a200229030037030020034190026a41086a2001290300370300200320032903c00537039002200341c0056a20034190026a10db05200341c0026a20032802c00520032802c80510dc05200341e8016a41186a2006290300370300200341e8016a41106a2007290300370300200341e8016a41086a200829030037030020032003290398083703e801200341003602e00520032903d802210e200320032903f8053703d80220032903d0022110200320032903f0053703d00220032903c8022111200320032903e8053703c80220032903c002210f200320032903e0053703c0020240200fa72201450d00200341e0056a41186a200341e8016a41186a290300370300200341e0056a41106a200341e8016a41106a290300370300200341e0056a41086a200341e8016a41086a290300370300200320032903e8013703e0052003200d3a008006200341c8006a20012011a72206200341e0056a108003200f422088a721020240024002400240024020032802480d00200328024c220720064f0d0e2001200741216c6a2208200841216a20062007417f736a41216c10d0061a2006417f6a22060d01420021114200210f0c020b200341c8016a410210e7020c1b0b200341386a2006ad4200428081e49206420010cc062003290338220f4280a8f2e38e1d7c2211201056200341386a41086a2903002011200f54ad7c220f200e56200f200e511b0d010b02402010201156200e200f56200e200f511b450d00200341286a20034190026a201020117d200e200f7d2010201154ad7d10da020b2006450d010c180b20034188056a20034190026a201120107d200f200e7d2011201054ad7d10d90220032003290089053703b005200320034188056a41086a2800003600b70520032d00880522074104460d17200341d0016a20032800b705360000200320073a00c801200320032903b0053700c9010c180b200341043a00c8012002450d19200241216c450d18200110260c180b200341c8016a410210e7020c170b200341e0056a41206a200241206a290200370300200341e0056a41186a200241186a290200370300200341e0056a41106a200241106a290200370300200341e0056a41086a200241086a290200370300200320022902003703e005200341c0026a200341e0056a10d602200341e8016a41086a2201200341c9026a290000370300200341e8016a41106a2202200341d1026a290000370300200341e8016a41186a2206200341d9026a290000370300200320032900c1023703e80120032d00c0024101460d0920034190026a41186a200629030037030020034190026a41106a200229030037030020034190026a41086a2001290300370300200320032903e8013703900220034198086a20034190026a10db05200341e0056a200328029808220220032802a008220110dc050240024020032802e00522060d00200341d8026a200341fc056a280200360200200341d0026a200341f4056a290200370300200341c8026a200341ec056a290200370300200320032902e4053703c0024200210f41002101410121064200210e0c010b2002200110ff01200341d8026a200341fc056a280200360200200341d0026a200341e0056a41146a290200370300200341c8026a200341ec056a290200370300200320032902e405220f3703c002200fa72101200341c0026a41146a290200210e20032902cc02210f0b0240200328029c08450d00200210260b02402001450d00200141216c450d00200610260b200341d0006a20034190026a200f200e10da02200041186a41003a00002000420037030820002003280088053600192000411c6a2003418b056a28000036000020004200370300200424000f0b200141026a2f01002108200320012d00013a009001200341e0056a41206a200241206a290200370300200341e0056a41186a200241186a290200370300200341e0056a41106a200241106a290200370300200341e0056a41086a2201200241086a290200370300200320022902003703e005200341c0026a200341e0056a10d602200341c0056a41086a2202200341c9026a290000370300200341c0056a41106a2206200341c0026a41116a290000370300200341c0056a41186a2207200341c0026a41196a290000370300200320032900c1023703c00520032d00c0024101460d0920034188056a41186a200729030037030020034188056a41106a200629030037030020034188056a41086a2002290300370300200320032903c0053703880520034190026a41186a2202420037030020034190026a41106a2206420037030020034190026a41086a220742003703002003420037039002200341e0056a41808cc700410610fb0120072001290000370300200320032900e00537039002200341e0056a41ea93c400410610fb0120022001290000370300200620032900e005370300200341f0006a20034190026a4120108902200328027421012003280270210c200341e8006a41da93c4004110108902200328026c210d20032802682105200320083b01f4052003200d410020051b3602ec05200320014100200c1b3602e805200341c4edc6003602e005200320034190016a3602f005200320034188056a3602e405200341e8016a200341e0056a10f602200341083a0080062003410b3a0080062003410c3a008006200320032f01e8013b01e005200320032801ea013601e205200320032d00ee013a00e605200320032800ef013600e705200320032d00f3013a00eb052003410d3a008006200320032d00f4013a00ec052003410e3a008006200320032d00f5013a00ed052003410f3a008006200320032d00f6013a00ee05200341103a008006200320032d00f7013a00ef05200341113a008006200320032d00f8013a00f005200341123a008006200320032d00f9013a00f105200341133a008006200320032d00fa013a00f205200341143a008006200320032d00fb013a00f305200341153a008006200320032d00fc013a00f405200341163a008006200320032d00fd013a00f505200341173a008006200320032d00fe013a00f605200341183a008006200320032d00ff013a00f705200341193a008006200320032d0080023a00f8052003411a3a008006200320032d0081023a00f9052003411b3a008006200320032d0082023a00fa052003411c3a008006200320032d0083023a00fb052003411d3a008006200320032d0084023a00fc052003411e3a008006200320032d0085023a00fd052003411f3a008006200320032d0086023a00fe05200341203a008006200320032d0087023a00ff05200341c0026a41186a220120032903f805370300200341c0026a41086a20032903e805220f370300200341c0026a41106a20032903f005220e370300200320032903e00522113703c0022006200e3703002007200f37030020022001290300370300200320113703900220034198086a41186a200229030037030020034198086a41106a200629030037030020034198086a41086a2007290300370300200320032903900237039808200341e0056a20034198086a10db05200341e0006a20032802e005220220032802e80541d4c0c7004100410010810220032802602101024020032802e405450d00200210260b20014101460d0a200341e0056a20034188056a4280a9d6f6941d420010d902200320032900e1053703b0052003200341e0056a41086a2800003600b705024020032d00e00522014104470d00412110242201450d222001200329038805370000200120032d0090013a0020200141086a20034188056a41086a290300370000200141106a20034188056a41106a290300370000200141186a20034188056a41186a290300370000200341c0026a20034198086a10db0520032802c802210720032802c0022102413510242206450d0c200342353702e405200320063602e00520014101200341e0056a10b601200341e0056a20032802e8054110106d20032802e005220620032802e805220c6a220d4200370008200d4280a9d6f6941d3700002003200c41106a220c3602e805200220072006200c10b301024020032802e405450d00200610260b024020032802c402450d00200210260b2001102620032d0090012101200341ed056a20034198086a41086a290300370000200341f5056a20034198086a41106a290300370000200341fd056a20034198086a41186a29030037000020034185066a2003290388053700002003418d066a20034188056a41086a29030037000020034195066a20034188056a41106a2903003700002003419d066a20034188056a41186a290300370000200341a6066a20083b0100200341a5066a20013a0000200341013a00e4052003410e3a00e00520032003290398083700e505200341e0056a108702200341043a00c8010c130b200341c8016a41086a20032800b705360000200320013a00c801200320032903b0053700c9010c100b200141286a2802002107200141246a2802002108200141226a2f0100210c200141216a2d00002106200341c8016a41186a200141196a290000370300200341c8016a41106a200141116a290000370300200341c8016a41086a200141096a290000370300200320012900013703c801200320063a009001200341e0056a41206a200241206a290200370300200341e0056a41186a200241186a290200370300200341e0056a41106a200241106a290200370300200341e0056a41086a200241086a290200370300200320022902003703e005200341c0026a200341e0056a10d602200341c0056a41086a2201200341c0026a41096a290000370300200341c0056a41106a2202200341c0026a41116a290000370300200341c0056a41186a2206200341c0026a41196a290000370300200320032900c1023703c00520032d00c0024101460d0b20034188056a41186a200629030037030020034188056a41106a200229030037030020034188056a41086a2001290300370300200320032903c005370388052003200c3b01f405200320073602ec05200320083602e805200341c4edc6003602e005200320034190016a3602f0052003200341c8016a3602e405200341e8016a200341e0056a10f602200341083a0080062003410b3a0080062003410c3a008006200320032f01e8013b01e005200320032801ea013601e205200320032d00ee013a00e605200320032800ef013600e705200320032d00f3013a00eb052003410d3a008006200320032d00f4013a00ec052003410e3a008006200320032d00f5013a00ed052003410f3a008006200320032d00f6013a00ee05200341103a008006200320032d00f7013a00ef05200341113a008006200320032d00f8013a00f005200341123a008006200320032d00f9013a00f105200341133a008006200320032d00fa013a00f205200341143a008006200320032d00fb013a00f305200341153a008006200320032d00fc013a00f405200341163a008006200320032d00fd013a00f505200341173a008006200320032d00fe013a00f605200341183a008006200320032d00ff013a00f705200341193a008006200320032d0080023a00f8052003411a3a008006200320032d0081023a00f9052003411b3a008006200320032d0082023a00fa052003411c3a008006200320032d0083023a00fb052003411d3a008006200320032d0084023a00fc052003411e3a008006200320032d0085023a00fd052003411f3a008006200320032d0086023a00fe05200320032d0087023a00ff05200341203a008006200341c0026a41186a220120032903f805370300200341c0026a41086a20032903e805220f370300200341c0026a41106a20032903f005220e370300200320032903e00522113703c00220034190026a41106a2202200e37030020034190026a41086a2206200f37030020034190026a41186a22072001290300370300200320113703900220034198086a41186a200729030037030020034198086a41106a200229030037030020034198086a41086a2006290300370300200320032903900237039808024020034198086a20034188056a412010d2060d0020034190026a20034188056a10db05200341e0056a2003280290022202200328029802220110dc050240024020032802e00522060d00200341d8026a200341fc056a280200360200200341d0026a200341f4056a290200370300200341c8026a200341ec056a290200370300200320032902e4053703c0024200210f41002101410121064200210e0c010b2002200110ff01200341d8026a200341fc056a280200360200200341d0026a200341e0056a41146a290200370300200341c8026a200341ec056a290200370300200320032902e405220f3703c002200fa72101200341c0026a41146a290200210e20032902cc02210f0b0240200328029402450d00200210260b02402001450d00200141216c450d00200610260b200341f8006a200341c8016a200f200e10da02200341043a00a0010c0e0b200341a0016a410610e70220032d00a0014104460d0d20032902a401210f0c0c0b200341e8016a41186a200341e0056a41186a290300370300200341e8016a41106a200341e0056a41106a290300370300200341e8016a41086a200341e0056a41086a290300370300200320032903e0053703e8010c1e0b200341023a0090012005109803200510260c210b200c2001103b000b200341c8016a410510e7020c150b410221010c180b20072006103e000b200341023a00c8010c100b200341c8016a41026a200341c0056a41026a2d000022013a0000200320032f00c00522023b01c801200041206a41023a0000200041186a41003a000020004200370308200020023b0021200041236a20013a000020004201370300200424000f0b200341023a00c8010c070b200341c8016a410510e70220032d00c80121010c050b1033000b200341023a00a0010b20032802a00121032000200f370024200041206a2003360000200041186a41003a0000200042003703084201210f0c010b4200210f20004200370308200020032800e005360019200041186a41003a00002000411c6a200341e3056a2800003600000b2000200f370300200424000f0b200141ff01714104460d0120032902cc01210f0b20032802c80121032000200f370024200041206a2003360000200041186a41003a00002000420037030820004201370300200424000f0b20004200370308200020032800a001360019200041186a41003a00002000411c6a200341a3016a28000036000020004200370300200424000f0b024020032802c0022207450d0020032802c4022208450d00200841216c450d00200710260b200320113703d002200320063602c802200320023602c402200320013602c002200341043a00c8012003200f3703d8020c020b2002450d00200241216c450d00200110260b20032d00c80122014104470d010b0240024020032802c0020d0020032802c00520032802c80510ff010c010b20032802c0052101200320032802c8053602e405200320013602e005200341c0026a200341e0056a10b5010b410421010b024020032802c0022202450d0020032802c4022206450d00200641216c450d00200210260b024020032802c405450d0020032802c00510260b20014104460d0120032902cc01210f0b20032802c80121032000200f370024200041206a2003360000200041186a41003a00002000420037030820004201370300200424000f0b20004200370308200020032800a001360019200041186a41003a00002000411c6a200341a3016a28000036000020004200370300200424000f0b20032d00c80122014104460d012003418a016a20032d00cb013a0000200320032f00c9013b01880120032902cc01210f2003280294022206450d02200641216c450d02200210260c020b200341a8026a2010370300200320113703a002200341043a00c8010b200341e0056a41186a20034190026a41186a290300370300200341e0056a41106a20034190026a41106a290300370300200341e0056a41086a20034190026a41086a2903003703002003200329039002220f3703e00502400240200fa722010d002007200810ff010c010b200320083602c402200320073602c002200341e0056a200341c0026a10b50120032802e4052202450d00200241216c450d00200110260b2003418a016a20032d00cb013a0000200320032f00c9013b01880120032902cc01210f410421010b024020032802a401450d00200710260b20014104460d010b200341c4016a41026a20034188016a41026a2d000022023a0000200320032f01880122063b01c401200041206a20013a0000200041186a41003a000020004200370308200020063b0021200041236a20023a00002000200f37002420004201370300200424000f0b200042003703082000200328009001360019200041186a41003a00002000411c6a20034193016a28000036000020004200370300200424000f0b200641ff01714104460d0202402009450d00200941216c450d00200a10260b200341e8016a41186a200341a0016a41186a290300370300200341e8016a41106a200341a0016a41106a290300370300200341e8016a41086a200341a0016a41086a290300370300200320032903a0013703e801411010242202450d00200241b889c70036020c200241013602082002428180808010370200411010242201450d00200141d089c70036020c20014101360208200142818080801037020020022002280200417f6a2207360200024020070d002002280208200228020c2802001103000240200228020c280204450d00200228020810260b20022002280204417f6a220736020420070d00200210260b200128020041016a220241014d0d0120012002360200410810242207450d00200720063a000420072001360200411010242202450d00200241e08bc70036020c20022007360208200242818080801037020020012001280200417f6a2206360200024020060d002001280208200128020c2802001103000240200128020c280204450d00200128020810260b20012001280204417f6a220636020420060d00200110260b200341c0026a200541b00210cf061a20034188056a41206a2201200341e8016a41206a2f01003b010020034188056a41186a2206200341e8016a41186a29030037030020034188056a41106a2207200341e8016a41106a29030037030020034188056a41086a2208200341e8016a41086a290300370300200320032903e80137038805024002402002280208200341c0026a200228020c28020c110100450d00200341e0056a200341c0026a41b00210cf061a200341a2086a2008290300370100200341aa086a2007290300370100200341b2086a2006290300370100200341ba086a20012f01003b010020034180023b019808200320032903880537019a08200320023602bc0820034190026a200341e0056a20034198086a10a303200329039002420151210120034190026a41206a2d00002106200329039802210f0c010b4102210620034190026a41206a41023a000020034190026a41186a41003a000020022002280200417f6a22013602004200210f20034200370398022003420137039002024020010d002002280208200228020c2802001103000240200228020c280204450d00200228020810260b20022002280204417f6a220136020420010d00200210260b200341c0026a109803410121010b2003200341b8026a2800003600b705200320032900b1023703b0050240024020010d00410421010c010b200320032800b7053600e705200320032903b0053703e00541042101200f4202510d00200320032800e7053600c702200320032903e0053703c002200621010b200320032903c00237039808200320032800c70236009f08200341e0056a41086a20013a0000200341e9056a200329039808370000200341e0056a41106a200328009f08360000200341003a00e4052003410e3a00e005200320032f0088053b00e50520032003418a056a2d00003a00e705200341f4056a20032902c002370200200341fc056a200341c0026a41086a29020037020020034184066a200341c0026a41106a2902003702002003418c066a200341d8026a29020037020020034194066a200341e0026a2902003702002003419c066a200341e8026a290200370200200341a4066a200341f0026a280200360200200341e0056a108702200341043a009001200510260c040b102c000b00000b20034190016a410310e70202402009450d00200941216c450d00200a10260b20032d009001210120051098032005102620014104460d010b20032802900121012000200329029401370024200041206a2001360000200041186a41003a00002000420037030820004201370300200424000f0b200042003703082000200328008801360019200041186a41003a00002000411c6a2003418b016a28000036000020004200370300200424000b930401057f230041e0006b22022400200241086a41b58dc700410510fb01200241186a41e0d7c600410710fb0102400240412010242203450d002002422037023c20022003360238200241386a41004120106d20022802382203200228024022046a22052001290000370000200541086a200141086a290000370000200541106a200141106a290000370000200541186a200141186a2900003700002002200441206a2201360240200241c8006a2003200110a202200241dc006a200320016a360200200220033602582002200241c8006a41086a3602542002200241c8006a360250200241286a200241d0006a10730240200228023c450d00200310260b2002280230220341206a2205417f4c0d010240024020050d0041012101410021050c010b200510242201450d010b20002001360200200041086a220141003602002000200536020420004100411010c9012000280200200128020022056a220420022900083700002001200541106a2205360200200441086a200241086a41086a29000037000020002005411010c9012000280200200128020022056a220420022900183700002001200541106a2206360200200441086a200241186a41086a2900003700002002280228210520002006200310c9012000280200200128020022006a2005200310cf061a2001200020036a3602000240200228022c450d00200510260b200241e0006a24000f0b1033000b1034000ba40904047f017e087f027e230041a0026b220324002003200236020c20032001360208200341106a200120021082020240024002400240200328021022040d00200041003602000c010b200328021421052003200341186a280200360224200320043602202003200341206a108f0102400240024020032802000d0020032802042206200328022441216e2201200120064b1bad42217e2207422088a70d042007a72201417f4c0d040240024020010d00410121080c010b200110242208450d060b4100210920034100360230200320083602282003200141216e36022c024002402006450d004100210a034041002102200341003a00d8012003280224417f6a2101200a41016a210a02400240024002400240024003402001417f460d01200341b8016a20026a2003280220220b2d00003a00002003200b41016a3602202003200241016a220c3a00d801200320013602242001417f6a2101200c2102200c4120470d000b20034180026a41186a2202200341b8016a41186a29030037030020034180026a41106a220d200341b8016a41106a29030037030020034180026a41086a220e200341b8016a41086a290300370300200320032903b80137038002200c41ff01714120490d0120034198016a41086a220f200e29030037030020034198016a41106a220e200d29030037030020034198016a41186a220d20022903003703002003200329038002370398012001417f460d01200b2d00012102200320013602242003200b41026a360220200241034b0d014100210c20020e0405040203050b200241ff0171450d00200341003a00d8010b200328022c2201450d07200141216c0d060c070b4102210c0c020b4103210c0c010b4101210c0b200341d8006a41086a200f2903002207370300200341d8006a41106a200e2903002210370300200341d8006a41186a200d2903002211370300200341386a41086a22022007370300200341386a41106a220b2010370300200341386a41186a220d2011370300200320032903980122073703582003200737033802402009200328022c470d00200341286a200910f30120032802282108200328023021090b2008200941216c6a2201200329033837000020022903002107200b2903002110200d29030021112001200c3a0020200141186a2011370000200141106a2010370000200141086a20073700002003200941016a2209360230200a2006470d000b0b2008450d01200329022c210720032802242201410f4b0d022007a72201450d01200141216c450d010b200810260b200341003602880220034201370380022003410e3602e4012003200341086a3602e001200320034180026a36029801200341cc016a4101360200200342013702bc012003418c8dc6003602b8012003200341e0016a3602c80120034198016a41c4e1c000200341b8016a10351a2003280280022003280288021084020240200328028402450d0020032802800210260b200041003602000c010b2000200737020420002008360200200041106a20032802202202290000370300200041186a200241086a2900003703002003200141706a3602242003200241106a3602200b2005450d00200410260b200341a0026a24000f0b1034000b1033000b4d01017f230041206b22002400200041146a410136020020004201370204200041dcedc6003602002000410436021c200041d4edc6003602182000200041186a360210200041ecc0c700103d000ba90201067f230041106b22022400024002400240200128020422034104490d0020012802002204280000210520012003417c6a3602042001200441046a3602002002200110e101200228020022030d01200041003602040c020b200041003602040c010b200241086a2802002106200228020421040240200128020422074104490d002000200436020820002003360204200020053602002000410c6a200636020020012802002203280000210420012007417c6a3602042001200341046a360200200041106a20043602000c010b2000410036020402402006450d002006410c6c21002003210103400240200141046a280200450d00200128020010260b2001410c6a2101200041746a22000d000b0b2004450d002004410c6c450d00200310260b200241106a24000bb30201067f230041106b220224000240024002402001280200220328020422044104490d0020032802002205280000210620032004417c6a3602042003200541046a3602002002200110d901200228020022030d01200041003602040c020b200041003602040c010b200241086a28020021052002280204210402402001280200220128020422074104490d002000200436020820002003360204200020063602002000410c6a200536020020012802002203280000210420012007417c6a3602042001200341046a360200200041106a20043602000c010b2000410036020402402005450d002005410c6c21002003210103400240200141046a280200450d00200128020010260b2001410c6a2101200041746a22000d000b0b2004450d002004410c6c450d00200310260b200241106a24000b800e05057f037e047f047e027f23004190046b22022400024002400240200128020022032802042204450d00200328020022052d0000210620032004417f6a3602042003200541016a3602002006417f6a220341024b0d000240024002400240024020030e03000102000b41002103200241003a00e80202400340200128020022042802042205450d01200241c8026a20036a200428020022062d00003a000020042005417f6a3602042004200641016a3602002002200341016a22033a00e80220034120470d000b20024190036a41086a200241c8026a41086a2903002207370300200241a8016a41186a200241c8026a41186a2903002208370300200241a8016a41106a200241c8026a41106a290300220937030020024188016a41186a200837030020024188016a41106a200937030020024188016a41086a2007370300200220022903c802370388014100210a0c030b200341ff0171450d04200241003a00e8020c040b41002103200241003a00e80202400340200128020022042802042205450d01200241c8026a20036a200428020022062d00003a000020042005417f6a3602042004200641016a3602002002200341016a22033a00e80220034120470d000b20024190036a41086a200241c8026a41086a2903002207370300200241a8016a41186a200241c8026a41186a2903002208370300200241a8016a41106a200241c8026a41106a290300220937030020024188016a41186a200837030020024188016a41106a200937030020024188016a41086a2007370300200220022903c802370388014101210a0c020b200341ff0171450d03200241003a00e8020c030b41002103200241003a00e8020340200128020022042802042205450d02200241c8026a20036a200428020022062d00003a000020042005417f6a3602042004200641016a3602002002200341016a22033a00e80220034120470d000b20024190036a41086a200241c8026a41086a2903002207370300200241a8016a41186a200241c8026a41186a2903002208370300200241a8016a41106a200241c8026a41106a290300220937030020024188016a41186a200837030020024188016a41106a200937030020024188016a41086a2007370300200220022903c802370388014102210a0b200241e8006a41186a20024188016a41186a290300370300200241e8006a41106a20024188016a41106a290300370300200241e8006a41086a20024188016a41086a290300370300200220022903880137036841002103200241003a0088030340200128020022042802042205450d03200241c8026a20036a200428020022062d00003a000020042005417f6a3602042004200641016a3602002002200341016a22033a008803200341c000470d000b20024190036a41086a2203200241c8026a41086a29030037030020024190036a41106a2204200241c8026a41106a29030037030020024190036a41186a2201200241c8026a41186a29030037030020024190036a41206a2205200241c8026a41206a29030037030020024190036a41286a2206200241c8026a41286a29030037030020024190036a41306a220b200241c8026a41306a29030037030020024190036a41386a220c200241c8026a41386a290300370300200220022903c80237039003200241a8016a41386a220d200c290300370300200241a8016a41306a200b2903002207370300200241a8016a41286a20062903002208370300200241a8016a41206a20052903002209370300200241a8016a41186a2001290300220e370300200241a8016a41106a2004290300220f370300200241a8016a41086a20032903002210370300200220022903900322113703a801200241086a41306a22032007370300200241086a41286a22042008370300200241086a41206a22012009370300200241086a41186a2205200e370300200241086a41106a2206200f370300200241086a41086a220b2010370300200241086a41386a220c200d29030037030020022011370308200241c8006a41186a220d200241e8006a41186a290300370300200241c8006a41106a2212200241e8006a41106a290300370300200241c8006a41086a2213200241e8006a41086a290300370300200220022903683703482000200a3a000020002002290348370001200041096a2013290300370000200041116a2012290300370000200041196a200d290300370000200041216a2002290308370000200041296a200b290300370000200041316a2006290300370000200041396a2005290300370000200041c1006a2001290300370000200041c9006a2004290300370000200041d1006a2003290300370000200041d9006a200c2903003700000c030b200341ff0171450d00200241003a00e8020b200041033a00000c010b0240200341ff0171450d00200241003a0088030b200041033a00000b20024190046a24000bc80c03067f017e067f23004190036b2202240002400240024020012802042203450d00200128020022042d0000210520012003417f6a3602042001200441016a3602002005417f6a220541024b0d0002400240024002400240024020050e03000102000b41002105200241003a00c8012003417f6a21062003417e6a21030240034020062005460d01200241a8016a20056a200420056a220741016a2d00003a0000200120033602042001200741026a3602002002200541016a22073a00c8012003417f6a21032007210520074120460d050c000b0b200541ff0171450d05200241003a00c8010c050b41002105200241003a00c8012003417f6a21062003417e6a21030240034020062005460d01200241a8016a20056a200420056a220741016a2d00003a0000200120033602042001200741026a3602002002200541016a22073a00c8012003417f6a21032007210520074120460d030c000b0b200541ff0171450d04200241003a00c8010c040b41002105200241003a00c8012003417f6a21062003417e6a210302400240034020062005460d01200241a8016a20056a200420056a220741016a2d00003a0000200120033602042001200741026a3602002002200541016a22073a00c8012003417f6a21032007210520074120460d020c000b0b200541ff0171450d04200241003a00c8010c040b200241d0026a41086a2205200241a8016a41086a290300370300200241d0026a41106a2204200241a8016a41106a290300370300200241d0026a41186a2203200241a8016a41186a290300370300200220022903a8013703d002200741ff0171411f4d0d03200241b0026a41186a2003290300220837030020024188016a41086a200529030037030020024188016a41106a200429030037030020024188016a41186a2008370300200220022903d00237038801410221050c020b200241d0026a41086a2205200241a8016a41086a290300370300200241d0026a41106a2204200241a8016a41106a290300370300200241d0026a41186a2203200241a8016a41186a290300370300200220022903a8013703d002200741ff0171411f4d0d02200241b0026a41186a2003290300220837030020024188016a41086a200529030037030020024188016a41106a200429030037030020024188016a41186a2008370300200220022903d00237038801410121050c010b200241d0026a41086a2205200241a8016a41086a290300370300200241d0026a41106a2204200241a8016a41106a290300370300200241d0026a41186a2203200241a8016a41186a290300370300200220022903a8013703d002200741ff0171411f4d0d01200241b0026a41186a2003290300220837030020024188016a41086a200529030037030020024188016a41106a200429030037030020024188016a41186a2008370300200220022903d00237038801410021050b200241e8006a41186a220420024188016a41186a290300370300200241e8006a41106a220320024188016a41106a290300370300200241e8006a41086a220720024188016a41086a2903003703002002200229038801370368200241a8016a200110dc0120022d00a8014101470d01200041033a00000c020b200041033a00000c010b200241c0006a2201200241a8016a41396a290000370300200241386a2206200241a8016a41316a290000370300200241306a2209200241a8016a41296a290000370300200241286a220a200241a8016a41216a290000370300200241086a41186a220b200241a8016a41196a290000370300200241086a41106a220c200241a8016a41116a290000370300200241086a41086a220d200241a8016a41096a290000370300200241c8006a41086a220e2007290300370300200241c8006a41106a22072003290300370300200241c8006a41186a22032004290300370300200220022900a90137030820022002290368370348200020053a000020002002290348370001200041096a200e290300370000200041116a2007290300370000200041196a2003290300370000200041216a2002290308370000200041296a200d290300370000200041316a200c290300370000200041396a200b290300370000200041c1006a200a290300370000200041c9006a2009290300370000200041d1006a2006290300370000200041d9006a20012903003700000b20024190036a24000bb90101037f20004201370200200041086a2202410036020020012802002103200041004104106d2000280200200228020022046a20033600002002200441046a3602002001280204210320002001410c6a280200220410a10102402004450d0020032004410c6c6a210403402003280200200341086a28020020001095012003410c6a22032004470d000b0b20012802102103200020022802004104106d2000280200200228020022006a20033600002002200041046a3602000bd70603057f017e027f230041a0046b2202240041002103200241003a009003024002400240024002400340200128020022042802042205450d01200241f0026a20036a200428020022062d00003a000020042005417f6a3602042004200641016a3602002002200341016a22033a00900320034120470d000b20024190026a41186a200241f0026a41186a2903002207370300200241f0016a41086a200241f0026a41086a290300370300200241f0016a41106a200241f0026a41106a290300370300200241f0016a41186a2007370300200220022903f0023703f0012001280200220328020422044108490d022003280200220529000021072003200441786a3602042003200541086a360200200241f0026a200110e50220022802f4022206450d03200241fc026a280200210320022802f802210820022802f002210420024190026a200241f0026a41106a41e00010cf061a200241f0026a200110e50220022802f402450d01200241206a200241f0026a41f00010cf061a200241086a2205200241f0016a41086a290300370300200241106a2201200241f0016a41106a290300370300200241186a2209200241f0016a41186a290300370300200220022903f00137030020024190016a20024190026a41e00010cf061a200041146a2003360200200020083602102000200636020c2000200436020820002007370300200041186a20024190016a41e00010cf061a200041f8006a200241206a41f00010cf061a20004180026a2009290300370300200041f8016a2001290300370300200041f0016a2005290300370300200041e8016a20022903003703000c040b0240200341ff0171450d00200241003a0090030b2000410036020c0c030b2000410036020c02402003450d00200341246c21042006210303400240024020032d0000220541044b0d0002400240024020050e050400010204040b2003410c6a280200450d03200341086a28020010260c030b2003410c6a280200450d02200341086a28020010260c020b2003410c6a280200450d01200341086a28020010260c010b200341086a280200450d00200341046a28020010260b200341246a21032004415c6a22040d000b0b2008450d02200841246c450d02200610260c020b2000410036020c0c010b2000410036020c0b200241a0046a24000ba70703067f017e017f230041a0046b2202240041002103200241003a00900320012802042104417f21050240024002400240034020042003460d01200241f0026a20036a200128020022062d00003a00002001200420056a3602042001200641016a3602002002200341016a22063a0090032005417f6a21052006210320064120470d000b20024190026a41086a2203200241f0026a41086a29030037030020024190026a41106a2205200241f0026a41106a29030037030020024190026a41186a2207200241f0026a41186a290300370300200220022903f00237039002200641ff0171411f4b0d010c020b200341ff0171450d01200241003a0090030c010b200241f0016a41086a2003290300370300200241f0016a41106a2005290300370300200241f0016a41186a200729030037030020022002290390023703f00102400240200420066b22034108490d002001280200220529000021082001200341786a3602042001200541086a360200200241f0026a200110e30220022802f4022206450d01200241fc026a280200210320022802f802210420022802f002210520024190026a200241f0026a41106a41e00010cf061a200241f0026a200110e302024020022802f402450d00200241206a200241f0026a41f00010cf061a200241086a2201200241f0016a41086a290300370300200241106a2207200241f0016a41106a290300370300200241186a2209200241f0016a41186a290300370300200220022903f00137030020024190016a20024190026a41e00010cf061a200041146a2003360200200020043602102000200636020c2000200536020820002008370300200041186a20024190016a41e00010cf061a200041f8006a200241206a41f00010cf061a20004180026a2009290300370300200041f8016a2007290300370300200041f0016a2001290300370300200041e8016a20022903003703000c040b2000410036020c02402003450d00200341246c21012006210303400240024020032d0000220541044b0d0002400240024020050e050400010204040b2003410c6a280200450d03200341086a28020010260c030b2003410c6a280200450d02200341086a28020010260c020b2003410c6a280200450d01200341086a28020010260c010b200341086a280200450d00200341046a28020010260b200341246a21032001415c6a22010d000b0b2004450d03200441246c450d03200610260c030b2000410036020c0c020b2000410036020c0c010b2000410036020c0b200241a0046a24000b130020004101360204200041d0f6c6003602000b3400200041bb8cc70036020420004100360200200041146a4105360200200041106a41a4f8c600360200200041086a420f3702000b130020004102360204200041f4fdc6003602000b4a01017f02404104102422020d001033000b2000420437020420002002360200200041004104106d2000280200200041086a220028020022026a41e5003600002000200241046a3602000ba50101027f230041206b2204240002400240024002402001412c6a22052002460d0020022005412010d206450d00200441186a200241186a290000370300200441106a200241106a290000370300200441086a200241086a290000370300200420022900003703002001200410ff0322020d010c020b2000200141206a10c8010c020b200228020c4101480d002000200210c8010c010b200041003602000b200441206a24000bfc0301057f23004180016b22042400200328020021050240024002400240024020032802082206200041286a280200470d00200520002802202207460d0120052007200610d206450d010b200441c0006a41186a2206200141186a290000370300200441c0006a41106a2207200141106a290000370300200441c0006a41086a2208200141086a29000037030020042001290000370340200441086a2000200441c0006a10eb0520042802084101470d01200441c0006a41286a200441386a290300370300200441c0006a41206a200441086a41286a2903003703002006200441086a41206a2903003703002007200441086a41186a2903003703002008200441086a41106a29030037030020042004290310370340200441f0006a41086a200341086a2802003602002004410136027c20042003290200370370200441c0006a200441f0006a10ec050c030b200341046a280200450d020c010b0240200428020c2206417c6a2201280200220041004a0d00200641706a2105200441c0006a41086a2207200341086a280200360200200420032902003703400240200641746a280200450d0020052802001026200128020021000b20052004290340370200200541086a20072802003602002001200041016a3602000c020b2001200041016a360200200341046a280200450d010b200510260b20044180016a24000be50403017f027e0a7f230041106b220324002003200129030042adfed5e4d485fda8d8007e220442a0cbbf9599b5a19f0a7c2205200229001885200229000020058542adfed5e4d485fda8d8007e42178942adfed5e4d485fda8d8007e852002290008200442efcdddd088a580a21e7c8542adfed5e4d485fda8d8007e42178942adfed5e4d485fda8d8007e852002290010200442bed0fb8bf894dfa4327c8542adfed5e4d485fda8d8007e42178942adfed5e4d485fda8d8007e85420042adfed5e4d485fda8d800420010cc0620012802102206200141086a2903002204200341086a29030020032903007c852004892204a72207712108200741197641818284086c2109200141146a280200210a4100210b02400340200a20086a280000220c2009732207417f73200741fffdfb776a71418081828478712107200b41046a220b20086a200671210d0340024020070d00200d2108200c200c4101747141808182847871450d0220004101360200200041106a2001360200200041086a2004370300200041146a20022900003700002000411c6a200241086a290000370000200041246a200241106a2900003700002000412c6a200241186a2900003700000c030b0240200a410020076841037620086a2006716b41306c6a220e41506a220f2002460d002007417f6a2007712107200f2002412010d2060d010b0b0b2000200e360204200041003602002000410c6a41013a0000200041086a20013602002000410d6a2002290000370000200041156a200241086a2900003700002000411d6a200241106a290000370000200041256a200241186a2900003700000b200341106a24000be60403027f017e067f230041d0006b2202240020022000280208220336020c20002903002104200241386a200141086a290200370300200241286a200041246a290200370300200241106a41106a2000411c6a290200370300200241106a41086a200041146a290200370300200220012902003703302002200029020c370310200341106a2105200328021022062004a72207712101200341146a28020021084104210003402001220920006a2006712101200041046a2100200820096a28000041808182847871220a450d000b02402008200a6841037620096a20067122006a2c000022014100480d0020082008280200418081828478716841037622006a2d000021010b200341186a280200210902402001410171220a450d0020090d00200241c0006a20052002410c6a10ba02200328021022062007712101200341146a28020021084104210003402001220920006a2006712101200041046a2100200820096a280000418081828478712205450d000b0240200820056841037620096a20067122006a2c00004100480d002008280200418081828478716841037621000b200328021821090b20032009200a6b360218200820006a200741197622013a000020062000417c6a7120086a41046a20013a00002008410020006b41306c6a41506a220041286a200241106a41286a290300370200200041206a200241106a41206a290300370200200041186a200241106a41186a290300370200200041106a200241106a41106a290300370200200041086a200241106a41086a290300370200200020022903103702002003411c6a2200200028020041016a360200200241d0006a24000bb70201047f23004180016b2203240002402000412c6a22042001460d0020012004412010d206450d00200341c0006a41186a2204200141186a290000370300200341c0006a41106a2205200141106a290000370300200341c0006a41086a2206200141086a29000037030020032001290000370340200341086a2000200341c0006a10eb05024020032802084101470d00200341c0006a41286a200341386a290300370300200341c0006a41206a200341086a41286a2903003703002004200341086a41206a2903003703002005200341086a41186a2903003703002006200341086a41106a29030037030020032003290310370340200342808080807037037820034201370370200341c0006a200341f0006a10ec050c010b200328020c417c6a22012001280200417f6a3602000b20034180016a24000b8d0101037f230041206b220324004101210402402000412c6a22052001460d0020012005412010d206450d00200341186a200141186a290000370300200341106a200141106a290000370300200341086a200141086a2900003703002003200129000037030002402000200310ff0322010d00410021040c010b200128020c41004a21040b200341206a240020040b1300200041e880c700360204200020013602000b1300200041e880c700360204200020013602000ba10101027f230041206b220424000240024002402001412c6a22052002460d0020022005412010d206450d00200441186a200241186a290000370300200441106a200241106a290000370300200441086a200241086a290000370300200420022900003703002001200410ff032202450d01200228020c4101480d012000200210c8010c020b2000200141206a10c8010c010b200041003602000b200441206a24000b8d0101037f230041206b220324004101210402402000412c6a22052001460d0020012005412010d206450d00200341186a200141186a290000370300200341106a200141106a290000370300200341086a200141086a2900003703002003200129000037030002402000200310ff0322010d00410021040c010b200128020c41004a21040b200341206a240020040b1300200041023602042000419081c7003602000bfa0c01037f230041e0006b2202240002402001450d00200241d4006a41043602002002411c6a41023602002002420237020c200241b882c7003602082002410436024c200241b082c7003602482002410036025c200241d4c0c7003602582002200241c8006a3602182002200241d8006a360250200241086a41c882c700103d000b200241c0006a41002902a08a47370300200241086a41306a220141002902988a47370300200241306a41002902908a47370300200241286a41002902888a47370300200241206a41002902808a47370300200241186a220341002902f88947370300200241086a41086a41002902f08947370300200241002902e889473703082002410036025020024201370348200241c8006a200241086a10a301200241c8006a200310a301200241c8006a20022802504104106d2002280248200228025022036a41023600002002200341046a2203360250200241c8006a20034104106d2002280248200228025022036a41003600002002200341046a2203360250200241c8006a20034104106d2002280248200228025022036a41003600002002200341046a220336025020012802002101200241c8006a20034101106d2002280248200228025022036a41303a00002002200341016a2203360250200241c8006a20034108106d2002280248200228025022036a20012900003700002002200341086a220336025020012802082104200241c8006a20034104106d2002280248200228025022036a20043600002002200341046a2203360250200241c8006a20034108106d2002280248200228025022036a200129000c3700002002200341086a220336025020012802142104200241c8006a20034104106d2002280248200228025022036a20043600002002200341046a2203360250200241c8006a20034108106d2002280248200228025022036a20012900183700002002200341086a220336025020012802202104200241c8006a20034104106d2002280248200228025022036a20043600002002200341046a2203360250200241c8006a20034108106d2002280248200228025022036a20012900243700002002200341086a2203360250200128022c2104200241c8006a20034104106d2002280248200228025022036a20043600002002200341046a2203360250200241c8006a20034108106d2002280248200228025022036a20012900303700002002200341086a220336025020012802382104200241c8006a20034104106d2002280248200228025022036a20043600002002200341046a2203360250200241c8006a20034108106d2002280248200228025022036a200129003c3700002002200341086a220336025020012802442104200241c8006a20034104106d2002280248200228025022036a20043600002002200341046a2203360250200241c8006a20034108106d2002280248200228025022036a20012900483700002002200341086a220336025020012802502104200241c8006a20034104106d2002280248200228025022036a20043600002002200341046a2203360250200241c8006a20034108106d2002280248200228025022036a20012900543700002002200341086a2203360250200128025c2104200241c8006a20034104106d2002280248200228025022036a20043600002002200341046a2203360250200241c8006a20034108106d2002280248200228025022036a20012900603700002002200341086a220336025020012802682104200241c8006a20034104106d2002280248200228025022036a20043600002002200341046a2203360250200241c8006a20034108106d2002280248200228025022036a200129006c3700002002200341086a220336025020012802742104200241c8006a20034104106d2002280248200228025022036a20043600002002200341046a2203360250200241c8006a20034108106d2002280248200228025022036a20012900783700002002200341086a22033602502001280280012104200241c8006a20034104106d2002280248200228025022036a20043600002002200341046a2203360250200241c8006a20034108106d2002280248200228025022036a2001290084013700002002200341086a2203360250200128028c012101200241c8006a20034104106d2002280248200228025022036a20013600002002200341046a2201360250200241c8006a20014104106d20022802482201200228025022036a4100360000200241e0006a2400200341046aad4220862001ad840bdc1e02097f017e230041d00d6b220224002002428080808080203702b4052002200136020c2002200041d4c0c70020011b3602082002200241086a3602b005200241f0096a200241b0056a10e50202400240024020022802f4092203450d00200241fc096a280200210420022802f809210520022802f009210620024198066a200241800a6a41e00010cf061a200241f0096a200241b0056a10d20120022802f00922070d0102402004450d00200441246c21002003210103400240024020012d0000220841044b0d0002400240024020080e050400010204040b2001410c6a280200450d03200141086a28020010260c030b2001410c6a280200450d02200141086a28020010260c020b2001410c6a280200450d01200141086a28020010260c010b200141086a280200450d00200141046a28020010260b200141246a21012000415c6a22000d000b0b2005450d00200541246c450d00200310260b200241e8006a200241d8026a41e00010cf061a0c010b200241f8096a280200210920022802f409210a200241d8026a20024198066a41e00010cf061a200241e8006a200241d8026a41e00010cf061a200241e8016a200241e8006a41e00010cf061a0240024020022802b005280204450d0002402004450d00200441246c21002003210103400240024020012d0000220841044b0d0002400240024020080e050400010204040b2001410c6a280200450d03200141086a28020010260c030b2001410c6a280200450d02200141086a28020010260c020b2001410c6a280200450d01200141086a28020010260c010b200141086a280200450d00200141046a28020010260b200141246a21012000415c6a22000d000b0b02402005450d00200541246c450d00200310260b02402009450d00200941c8036c210020074198016a21010340200110d501200141c8036a2101200041b87c6a22000d000b0b41002103200a450d01200a41c8036c450d01200710260c010b200241f0096a200241e8016a41e00010cf061a0b2003450d00200241086a200241f0096a41e00010cf061a200241f4006a2004360200200241e8006a41086a20053602002002200336026c20022006360268200241e8006a41106a200241086a41e00010cf062101200241e0016a2009360200200241dc016a200a360200200220073602d801200241e8006a10b50502400240024020022802682200450d00200241e8016a2000417f6a10b004200241f0096a20022802e801220020022802f00110b80320024198066a41086a200241f9096a29000037030020024198066a41106a200241810a6a29000037030020024198066a41186a2208200241890a6a290000370300200220022900f109370398060240024020022d00f0094101460d00200241d8026a41186a4200370300200241e8026a4200370300200241e0026a4200370300200242003703d8020c010b200241d8026a41186a2008290300370300200241d8026a41106a20024198066a41106a290300370300200241d8026a41086a20024198066a41086a29030037030020022002290398063703d8020b024020022802ec01450d00200010260b200241d8026a2001412010d2060d0020022802d801210020022802e0012105200241003602e002200242043703d802200241d8026a4100200510cb0120022802e002210302402005450d00200541c8036c210820022802d8022003410c6c6a21012003200541037441786a4103766a210303402002200036029806200241f0096a20024198066a10af04200141086a200241f0096a41086a280200360200200120022903f0093702002001410c6a2101200041c8036a2100200841b87c6a22080d000b200341016a21030b200220033602e002200241a0066a2003360200200220022903d80237039806200241f0096a20024198066a10f6050240200241b8016a2201200241f0096a412010d206450d0041d5afc700410e1084022001412010f705200241f0096a412010f7050b02402001200241f0096a412010d2060d0010f80520022802dc01210a20022802d801210520022802e0012108200241e8016a200241e8006a41f00010cf061a2005200841c8036c6a210020022802e8012104200521010240024002402008450d0020024198066a41f0006a21032005210102400340200241b0056a200141e80010cf061a200141e8006a290300210b200241d8026a200141f0006a41d80210cf061a200b4203510d0120024198066a200241b0056a41e80010cf061a2002200b370380072003200241d8026a41d80210cf061a200220024198066a3602e009200241f0096a200241e0096a10af0420022802f8092108024020022802f409450d0020022802f00910260b200241f0096a20024198066a41c80310cf061a200241003602b80d200241e0096a200241f0096a2008200241b80d6a10b70520022d00e0094101460d04200141c8036a22012000470d000c030b0b200141c8036a21010b20002001460d00034020014198016a10d5012000200141c8036a2201470d000b0b0240200a450d00200a41c8036c450d00200510260b10bf04200410fa01024010f905450d00200241f0096a10c8042002200241e8016a410c6a28020022033602c80d2002200241f0096a410c6a28020022013602cc0d20032001470d052003450d0420022802f409210520022802ec01210a410021080340024002400240024002400240024002400240200a20086a22012d00002204200520086a22002d0000470d0002400240024002400240024020040e06000102030405000b200a2005460d0d200141016a200041016a412010d2060d050c060b0240200a2005460d00200141016a280000200041016a280000470d050b200141106a2802002204200041106a280200470d04200141086a2802002209200041086a2802002207460d0a20092007200410d2060d040c0a0b0240200a2005460d00200141016a280000200041016a280000470d040b200141106a2802002204200041106a280200470d03200141086a2802002209200041086a2802002207460d0820092007200410d2060d030c080b0240200a2005460d00200141016a280000200041016a280000470d030b200141106a2802002204200041106a280200470d02200141086a2802002209200041086a2802002207460d0620092007200410d2060d020c060b200141046a2802002204200041046a280200470d012004450d04200141086a280200200041086a280200470d012001410c6a2802002000410c6a280200470d010c040b2001410c6a28020022042000410c6a280200470d00200141046a2802002209200041046a2802002207460d0220092007200410d206450d020b419786c600411410840220024198066a200110a201200228029806220420022802a00610f7050240200228029c06450d00200410260b20024198066a200010a201200228029806220420022802a00610f7050240200228029c06450d00200410260b20012d000020002d00002204470d06024020040e06000605040302000b200a2005460d070b200141016a200041016a412010d2060d050c060b2001410c6a28020022042000410c6a280200470d04200141046a2802002201200041046a2802002200460d0520012000200410d2060d040c050b200141046a2802002204200041046a280200470d032004450d04200141086a280200200041086a280200470d032001410c6a2802002000410c6a280200460d040c030b0240200a2005460d00200141016a280000200041016a280000470d030b200141106a2802002204200041106a280200470d02200141086a2802002201200041086a2802002200460d0320012000200410d2060d020c030b0240200a2005460d00200141016a280000200041016a280000470d020b200141106a2802002204200041106a280200470d01200141086a2802002201200041086a2802002200460d0220012000200410d2060d010c020b0240200a2005460d00200141016a280000200041016a280000470d010b200141106a2802002204200041106a280200470d00200141086a2802002201200041086a2802002200460d0120012000200410d206450d010b419088c600412741dcbcc700102f000b200841246a21082003417f6a22030d000c050b0b41df88c600411e41dcbcc700102f000b200220022f00e10920022d00e3094110747210d1042002280200200228020441dcbcc700102f000b41e487c600412441dcbcc700102f000b41c887c600411c41dcbcc700102f000b0240200241e8016a41306a2201200241f0096a41306a2200412010d206450d0041d5afc700410e1084022001412010f7052000412010f7050b024020012000412010d206450d0041b788c600412841dcbcc700102f000b024020022802fc092200450d0020022802f4092101200041246c210003400240024020012d0000220841044b0d0002400240024020080e050400010204040b2001410c6a280200450d03200141086a28020010260c030b2001410c6a280200450d02200141086a28020010260c020b2001410c6a280200450d01200141086a28020010260c010b200141086a280200450d00200141046a28020010260b200141246a21012000415c6a22000d000b0b0240200241f8096a2802002201450d00200141246c450d0020022802f40910260b024020022802f4012200450d0020022802ec012101200041246c210003400240024020012d0000220841044b0d0002400240024020080e050400010204040b2001410c6a280200450d03200141086a28020010260c030b2001410c6a280200450d02200141086a28020010260c020b2001410c6a280200450d01200141086a28020010260c010b200141086a280200450d00200141046a28020010260b200141246a21012000415c6a22000d000b0b0240200241f0016a2802002201450d00200141246c450d0020022802ec0110260b200241d00d6a240042010f0b200241d8026a41146a4109360200200241d8026a410c6a4115360200200241b0056a41146a41033602002002200241c80d6a3602b80d2002200241cc0d6a3602e00920024198066a41146a4100360200200242033702b405200241d4c0c7003602b005200241153602dc02200241d4c0c7003602a8062002420137029c062002418888c600360298062002200241d8026a3602c005200220024198066a3602e8022002200241e0096a3602e0022002200241b80d6a3602d802200241b0056a41ecc0c700103d000b200241e4026a4104360200200241ac066a41023602002002420237029c06200241b882c70036029806200241043602dc02200241bc83c7003602d8022002410036026c200241d4c0c7003602682002200241d8026a3602a8062002200241e8006a3602e00220024198066a41c882c700103d000bd90301097f230041206b220224000240024020012802082203410c6c41046a2204417f4c0d00200128020021050240024020040d0041012106410021040c010b200410242206450d020b20024100360208200220063602002002200436020420032002106c0240024020030d0020022802002107200228020821060c010b20052003410c6c6a210820052104034020042802002109200441086a28020022062002106c200220022802082006106d200228020022072002280208220a6a2009200610cf061a2002200a20066a22063602082004410c6a22042008470d000b0b20022802042109200241186a220a2006ad4220862007ad84100b220441186a290000370300200241106a2206200441106a290000370300200241086a2208200441086a2900003703002002200429000037030020041026200041186a200a290300370000200041106a2006290300370000200041086a20082903003700002000200229030037000002402009450d00200710260b02402003450d002003410c6c21062005210403400240200441046a280200450d00200428020010260b2004410c6a2104200641746a22060d000b0b0240200141046a2802002204450d002004410c6c450d00200510260b200241206a24000f0b1034000b1033000b0e002001ad4220862000ad84100c0b0400100a0b070010044101460b8e0601067f230041d0026b2202240020024280808080802037020c2002200136021c2002200041d4c0c70020011b3602182002200241186a360208200241e0016a200241086a10e502200241ec016a280200210320022802e801210420022802e401210520022802e001210620024180016a200241f0016a41e00010cf061a02402005450d00200241206a20024180016a41e00010cf061a024002402002280208280204450d0002402003450d00200341246c21002005210103400240024020012d0000220741044b0d0002400240024020070e050400010204040b2001410c6a280200450d03200141086a28020010260c030b2001410c6a280200450d02200141086a28020010260c020b2001410c6a280200450d01200141086a28020010260c010b200141086a280200450d00200141046a28020010260b200141246a21012000415c6a22000d000b0b410021012004450d01200441246c450d01200510260c010b20024180016a200241206a41e00010cf061a200521010b2001450d00200241e0016a410c6a22002003360200200241e0016a41086a2004360200200220013602e401200220063602e001200241f0016a20024180016a41e00010cf061a200241e0016a10b505024020002802002200450d0020022802e4012101200041246c210003400240024020012d0000220741044b0d0002400240024020070e050400010204040b2001410c6a280200450d03200141086a28020010260c030b2001410c6a280200450d02200141086a28020010260c020b2001410c6a280200450d01200141086a28020010260c010b200141086a280200450d00200141046a28020010260b200141246a21012000415c6a22000d000b0b024020022802e8012201450d00200141246c450d0020022802e40110260b200241d0026a240042010f0b2002412c6a4104360200200241f4016a4102360200200242023702e401200241b882c7003602e00120024104360224200241d483c7003602202002410036020c200241d4c0c7003602082002200241206a3602f0012002200241086a360228200241e0016a41c882c700103d000b980d03067f017e047f230041306b22022400024002400240024020010d0020024100360220200242043703180240024002400240410810242201450d0020014110360204200141a0b8c0003602002002200141086a36020c200220013602082002410136020420022001360200200241186a2002108b01410810242201450d002001410e360204200141ca92c4003602002002200141086a36020c200220013602082002410136020420022001360200200241186a2002108b01410810242201450d002001410c360204200141be92c4003602002002200141086a36020c200220013602082002410136020420022001360200200241186a2002108b01410810242201450d002001410e360204200141c5f3c4003602002002200141086a36020c200220013602082002410136020420022001360200200241186a2002108b01410810242201450d002001410a360204200141d892c4003602002002200141086a36020c200220013602082002410136020420022001360200200241186a2002108b01410810242201450d002001410b360204200141d4eec6003602002002200141086a36020c200220013602082002410136020420022001360200200241186a2002108b01410810242201450d0020014118360204200141d3f3c4003602002002200141086a36020c200220013602082002410136020420022001360200200241186a2002108b01410810242201450d0020014116360204200141b0b8c0003602002002200141086a36020c200220013602082002410136020420022001360200200241186a2002108b01410810242201450d0020014119360204200141ebf3c4003602002002200141086a36020c200220013602082002410136020420022001360200200241186a2002108b0120022802182103200228021c21040240200228022022010d004100210541042106410021070c040b20014104200141044b1bad420c7e2208422088a722070d052008a722094100480d0520074541027421072009450d012009102422060d022007450d050b102c000b200721060b200320014103746a210a2009410c6e2105200141037441786a41037641016a210b41002107200621012003210903402009280200220c450d01200141086a200941046a280200360200200141046a200c360200200141003602002001410c6a2101200741016a2107200941086a2209200a470d000b200b21070b0240200441ffffffff0171450d00200310260b2002410036020820024201370300200241004104106d2002280200200228020822016a41edcad18b063600002002200141046a2201360208200220014101106d2002280200200228020822016a410b3a00002002200141016a36020841bc8dc700411a20021071200220022802084101106d2002280200200228020822016a41043a00002002200141016a36020820072002106c0240024020070d0020022802082109200228020021030c010b2007410c6c2107200641086a210103402001417c6a280200210c200128020022092002106c200220022802082009106d200228020022032002280208220a6a200c200910cf061a2002200a20096a22093602082001410c6a2101200741746a22070d000b0b2002280204210702402005450d002005410c6c450d00200610260b200941046a2201417f4c0d020240024020010d004101210c410021010c010b20011024220c450d040b200241003602082002200c360200200220013602040240024002400240200941c000490d00200941808001490d012009418080808004490d02200241004101106d2002280200200228020822016a41033a00002002200141016a2201360208200220014104106d2002280200200228020822016a2009360000200141046a21010c030b200241004101106d2002280200200228020822016a20094102743a0000200141016a21010c020b200241004102106d2002280200200228020822016a20094102744101723b0000200141026a21010c010b200241004104106d2002280200200228020822016a2009410274410272360000200141046a21010b20022001360208200220012009106d200228020022012002280208220c6a2003200910cf061a200c20096aad4220862001ad84210802402007450d00200310260b200241306a240020080f0b200241246a4104360200200241146a410236020020024202370204200241b882c7003602002002410436021c200241ec83c7003602182002410036022c200241d4c0c7003602282002200241186a3602102002200241286a360220200241c882c700103d000b102e000b1034000b1033000b9c0604017f017e017f017e230041e00b6b2202240020024280808080802037020c200220013602d40b2002200041d4c0c70020011b3602d00b2002200241d00b6a36020820024188086a200241086a10d301200241c8036a20024188086a41e80010cf061a20022903f0082103200241f0006a20024188086a41f0006a41d80210cf061a0240024020034203510d00200241b0046a200241c8036a41e80010cf061a2002200337039805200241b0046a41f0006a200241f0006a41d80210cf062101024002402002280208280204450d00200241c8056a109803420321030c010b200241c8036a200241b0046a41e80010cf061a20024188086a200141d80210cf061a0b20034203510d00200241086a200241c8036a41e80010cf061a200241f0006a20024188086a41d80210cf061a200241b0046a200241086a41e80010cf061a2002200337039805200241a0056a200241f0006a41d80210cf061a2002200241b0046a36028808200241f8076a20024188086a10af04200228028008210120024188086a200241b0046a41c80310cf061a200241d80b6a200228028008360200200220022903f8073703d00b200241c8036a20024188086a2001200241d00b6a10b7054101410220022d00c80322014101461b220010242204450d0120024100360290082002200036028c0820022004360288080240024020014101470d0020024188086a41004101106d20022802880820022802900822016a41013a00002002200141016a36029008200241c8036a41017220024188086a10ae040c010b20024188086a41004101106d20022802880820022802900822016a41003a00002002200141016a3602900820022d00cc0320022d00cd0320022d00ce0320024188086a10f8020b20023502900821032002350288082105200241e00b6a240020052003422086840f0b200241fc006a4104360200200241c4046a4102360200200242023702b404200241b882c7003602b00420024104360274200241fc83c7003602702002410036020c200241d4c0c7003602082002200241f0006a3602c0042002200241086a360278200241b0046a41c882c700103d000b1033000bac0d020b7f027e230041e0016b220224000240024020010d0010bf0420024180016a41186a2203420037030020024180016a41106a2204420037030020024180016a41086a220542003703002002420037038001200241a0016a41808cc700410610fb012005200241a0016a41086a2206290000370300200220022900a00137038001200241a0016a41ea93c400410610fb0120032006290000370300200420022900a001370300200241086a20024180016a412010890241002101200228020c410020022802081b10fa012003420037030020044200370300200542003703002002420037038001200241a0016a41808cc700410610fb0120052006290000370300200220022900a00137038001200241a0016a4190bbc400410e10fb0120032006290000370300200420022900a001370300200220024180016a4120108902200241003602b801200242043703b001200241b0016a41002002280204410020022802001b220710cb0120022802b801210802402007450d0020022802b0012008410c6c6a21090340200241c0016a200110b904200241106a20022802c001220a20022802c801220b109d02024002402002280210220c0d004200210d4101210c0c010b200a200b10ff012002290214210d0b200141016a2101024020022802c401450d00200a10260b2009200c360200200941046a200d3702002009410c6a210920072001470d000b200820076a21080b200220083602b801200241106a41086a22012008360200200220022903b001370310200241c0016a200241106a10f605200241106a41186a200241c0016a41186a290300370300200241106a41106a200241c0016a41106a2903003703002001200241c0016a41086a290300370300200220022903c0013703102003420037030020044200370300200542003703002002420037038001200241a0016a41808cc700410610fb0120052006290000370300200220022900a00137038001200241a0016a418094c400410e10fb01200441086a2006290000370000200420022900a001370000412010242201450d01200242203702a401200220013602a001200241a0016a41004120106d20022802a001220920022802a801220c6a22012002290310370000200141086a200241106a41086a290300370000200141106a200241106a41106a220a290300370000200141186a200241106a41186a2903003700002002200c41206a22013602a80120024180016a41202009200110b301024020022802a401450d00200910260b200241106a10c804200241003602c801200242013703c0012002200241c0016a36028001200a20024180016a109c0102400240024002402002280210220141c000490d00200141808001490d012001418080808004490d02200241c0016a20022802c8014101106d20022802c00120022802c80122096a41033a00002002200941016a22093602c801200241c0016a20094104106d20022802c00120022802c80122096a20013600002002200941046a3602c8010c030b200241c0016a20022802c8014101106d20022802c00120022802c80122096a20014102743a00002002200941016a3602c8010c020b200241c0016a20022802c8014102106d20022802c00120022802c80122096a20014102744101723b00002002200941026a3602c8010c010b200241c0016a20022802c8014104106d20022802c00120022802c80122096a20014102744102723600002002200941046a3602c8010b2002200241c0016a36028001200241c0006a20024180016a109c012002200241c0016a36028001200241e0006a20024180016a109c01200241c0016a200241106a41047210a00120023502c801422086210d20023502c001210e2002280214210a0240200241106a410c6a2802002201450d00200141246c2109200a210103400240024020012d0000220c41044b0d00024002400240200c0e050400010204040b2001410c6a280200450d03200141086a28020010260c030b2001410c6a280200450d02200141086a28020010260c020b2001410c6a280200450d01200141086a28020010260c010b200141086a280200450d00200141046a28020010260b200141246a21012009415c6a22090d000b0b200d200e84210d0240200241186a2802002201450d00200141246c450d00200a10260b200241e0016a2400200d0f0b200241cc016a4104360200200241246a410236020020024202370214200241b882c700360210200241043602c4012002419484c7003602c0012002410036028401200241d4c0c700360280012002200241c0016a360220200220024180016a3602c801200241106a41c882c700103d000b1033000bc81b05017f017e027f017e107f230041a0066b220224002002428080808080203702ac0520022001360284052002200041d4c0c70020011b36028005200220024180056a3602a805200241f0026a200241a8056a10b4050240024020022802f0024101460d00200241e0006a41086a2201200241fc026a280200360200200220022902f40237036020022802a805280204450d01200241e0006a10a5030b200241ec006a410436020020024184036a4102360200200242023702f402200241b882c7003602f00220024104360264200241ac84c700360260200241003602ac05200241d4c0c7003602a8052002200241e0006a360280032002200241a8056a360268200241f0026a41c882c700103d000b200241306a41086a20012802002201360200200220022903602203370330200241d0006a41086a2001360200200242083703202002410036022820022003370350200241f0026a200241d0006a108601024020022802f0024101460d00200241f0026a41086a22012903002103200241f0026a41186a22004200370300200241f0026a41106a2204420037030020014200370300200242003703f002200241e0006a418a8cc700410910fb012001200241e0006a41086a2205290000370300200220022900603703f002200241e0006a41808ec500410310fb012000200529000037030020042002290060370300200241106a200241f0026a10ab032002280210210020022903182106200241206a410010d401200228022022072002280228220541c8036c6a200241e0006a41e80010cf0622014202370368200141a0016a2003200642b8177c42b81720001b220620032006561b3703002001410236029801200120022903a805370370200141f8006a200241a8056a41086a29030037030020014180016a200241a8056a41106a29030037030020014188016a200241a8056a41186a29030037030020014190016a200241c8056a290300370300200141b0016a200241f0026a41900210cf061a2002200541016a22083602280240200241d0006a41efb0c20010b8052201450d0020012802084104490d002001280200280000210520024188036a420037030020024180036a4200370300200241f0026a41086a4200370300200242003703f002200241f0026a41bb8cc700410f10fb01200241e0006a41dfeec600410b10fb01200441086a200241e0006a41086a29000037000020042002290060370000200241e0006a200241f0026a108c0220022802602201410420011b2100024002402002290264420020011b2203422088a722010d00410021010c010b200141027420006a417c6a28020020054721010b0240200342ffffffff0383500d00200010260b2001450d00024020082002280224470d00200241206a200810d40120022802202107200228022821080b2007200841c8036c6a200241e0006a41e80010cf06220142023703682001419c016a20053602002001410836029801200120022903a805370370200141f8006a200241a8056a41086a29030037030020014180016a200241b8056a29030037030020014188016a200241c0056a29030037030020014190016a200241c8056a290300370300200141b0016a200241f0026a41900210cf061a2002200841016a22083602280b02400240200241d0006a41a2e0c40010b8052201450d002002200128020836026420022001280200360260200241f0026a200241e0006a10db0120022802f0022209450d01200241f0026a41086a2200280200210a20022802f402210b200241f0026a41186a220c4200370300200241f0026a41106a220d420037030020004200370300200242003703f002200241e0006a41eb8cc700410a10fb012000200241e0006a41086a2201290000370300200220022900603703f002200241e0006a41dc9dc600410b10fb01200c2001290000370300200d2002290060370300200241e0006a200241f0026a10da042002280260210520022902642103200241f0026a10d90420022802f402210e20024190066a20022802f002220f20022802f802108a01200241a8056a41186a22104200370300200241a8056a41106a22114200370300200241a8056a41086a22124200370300200242003703a805200241e0006a41b48cc700410710fb0120122001290000370300200220022900603703a805200241e0006a4184c1c200410c10fb012010200129000037030020112002290060370300200241086a200241a8056a4120108902200228020c211320022802082114200c4200370300200d420037030020004200370300200242003703f002200241e0006a41808cc700410610fb0120002001290000370300200220022900603703f002200241e0006a41f693c400410a10fb01200441086a200129000037000020042002290060370000200241e0006a200241f0026a412010b80320022d006021012010200241f9006a2900003703002011200241f1006a2900003703002012200241e9006a290000370300200220022900613703a8052013410020141b21000240024020014101460d0020024180056a41186a420037030020024180056a41106a420037030020024180056a41086a420037030020024200370380050c010b20024180056a41186a201029030037030020024180056a41106a201129030037030020024180056a41086a2012290300370300200220022903a805370380050b2003420020051b21032005410120051b2115200241f0026a410c6a20024180056a41086a29030037020020024184036a20024190056a2903003702002002418c036a20024198056a290300370200200220003602f00220022002290380053702f402200228029006210c02400240024002400240200a450d002009200a4198026c6a21142002280298062104200c410c6a210d2003422088a7211641002110200921130340200421000240024020102004460d0020132802502111034002400240201020044f0d00200c201041037422016a221228020421052004201041016a22004d0d01200d20016a2101034020012802002005470d02200141086a21012004200041016a2200470d000b200421000c010b2010200441d4b0c0001032000b20002010490d060240200420004f0d002000200441c4b0c0001047000b024020052011460d002000211020002004460d020c010b0b200241e0006a2013201520162012200020106b200241f0026a10db040c010b200241e0006a410810ff020b024020022d00604104460d00410021010c030b2000211020134198026a22132014470d000b0b410121010b024020022802940641ffffffff0171450d00200c10260b0240200e41ffffffff0171450d00200f10260b0240200342ffffff3f83500d00201510260b0240024020010d000240200a450d002009200a4198026c6a21052009210403400240200441d8006a280200450d00200428025410260b0240200441186a2802002200450d00200428021021012000410474210003400240200141046a280200450d00200128020010260b200141106a2101200041706a22000d000b0b0240200441146a28020041ffffffff0071450d00200428021010260b0240200428021c2201450d00200441206a280200450d00200110260b024020044184026a2802002201450d00200141c1006c450d0020042802800210260b20044198026a210120044190026a4100360200200428028c0221002004410136028c02024020044194026a280200450d00200010260b2001210420012005470d000b0b4281808080800121034100210a0240200b0d004100210b0c020b0240200b4198026c0d004100210b0c020b200910264100210b0c010b2009ad42208642018421030b200241f0026a200241e0006a41900210cf061a024020082002280224470d00200241206a200810d40120022802202107200228022821080b2007200841c8036c22006a200241a8056a41e80010cf06220142023703682001200229038005370370200141f8006a20024188056a29030037030020014180016a20024190056a29030037030020014188016a20024198056a29030037030020014190016a200241a0056a290300370300200141ac016a200a360200200141a8016a200b360200200141a0016a20033703002001410c36029801200141b0016a200241f0026a41900210cf061a2002200841016a2212360228200241d0006a10a503200041cc036a2201417f4c0d01200110242200450d02200241003602682002200136026420022000360260200241e0006a201210a1010240024020120d0020022802682105200228026021110c010b200841c8036c41c8036a211020022802682105200721010340200220013602a805200241f0026a200241a8056a10af0420022802f0022104200241e0006a200520022802f8022200106d20022802602211200228026822056a2004200010cf061a2002200520006a2205360268024020022802f402450d00200410260b200141c8036a2101201041b87c6a22100d000b0b2005ad42208621032011ad210602402012450d0020074198016a2101200841c8036c41c8036a21000340200110d501200141c8036a2101200041b87c6a22000d000b0b20032006842103024020022802242201450d00200141c8036c450d00200710260b200241a0066a240020030f0b2010200041c4b0c0001048000b1034000b1033000b41f0e0c400412a419ce1c4001053000b200241293602f402200241bcabc7003602f00241aae0c4004125200241f0026a41d0e0c40041e0e0c4001036000b200241e8006a200241fc026a290200370300200220022902f40237036041a1b6c5004128200241e0006a41ccb6c50041dcb6c5001036000bf71c06097f017e0e7f017e017f027e230041c0056b22022400200242808080808020370224200220013602342002200041d4c0c70020011b3602302002200241306a360220200241d0046a200241206a10e502024020022802d4042203450d00200241dc046a280200210420022802d804210520022802d0042101200241f0036a200241e0046a41e00010cf061a200241d0046a200241206a10d201024020022802d00422060d0002402004450d00200441246c21002003210103400240024020012d0000220741044b0d0002400240024020070e050400010204040b2001410c6a280200450d03200141086a28020010260c030b2001410c6a280200450d02200141086a28020010260c020b2001410c6a280200450d01200141086a28020010260c010b200141086a280200450d00200141046a28020010260b200141246a21012000415c6a22000d000b0b2005450d01200541246c450d01200310260c010b200241d0046a41086a280200210820022802d404210920024190036a200241f0036a41e00010cf061a200241b0026a20024190036a41e00010cf061a200241d0046a200241206a10b405024020022802d0044101470d0002402004450d00200441246c21002003210103400240024020012d0000220741044b0d0002400240024020070e050400010204040b2001410c6a280200450d03200141086a28020010260c030b2001410c6a280200450d02200141086a28020010260c020b2001410c6a280200450d01200141086a28020010260c010b200141086a280200450d00200141046a28020010260b200141246a21012000415c6a22000d000b0b02402005450d00200541246c450d00200310260b02402008450d00200841c8036c210020064198016a21010340200110d501200141c8036a2101200041b87c6a22000d000b0b2009450d01200941c8036c450d01200610260c010b200241c0016a41086a2200200241d0046a410c6a280200360200200220022902d4043703c001200241d0016a200241b0026a41e00010cf061a200241386a410c6a2004360200200241386a41086a20053602002002200336023c20022001360238200241c8006a200241d0016a41e00010cf061a200241b0016a2008360200200241ac016a2009360200200241bc016a2000280200360200200220063602a801200220022903c0013702b401200241b4016a2107024002402002280220280204450d0002402004450d00200441246c210103400240024020032d0000220041044b0d0002400240024020000e050400010204040b2003410c6a280200450d03200341086a28020010260c030b2003410c6a280200450d02200341086a28020010260c020b2003410c6a280200450d01200341086a28020010260c010b200341086a280200450d00200341046a28020010260b200341246a21032001415c6a22010d000b0b02402005450d00200541246c450d00200228023c10260b02402008450d00200841c8036c210020064198016a21010340200110d501200141c8036a2101200041b87c6a22000d000b0b02402009450d00200941c8036c450d00200610260b200710a503410021030c010b200241f0036a41086a200741086a280200360200200220072902003703f0030b2003450d00200241b0026a41086a200241f0036a41086a220a2802002201360200200220022903f003220b3703b00220024190036a41086a20013602002002200b37039003200241013b01fc03200241003602f803200241003602f00302400240024002402008450d002006200841c8036c6a210c200241c8006a210d200228029403210e200228029003210f200241d0006a2110200621110340201141e8006a2903004202520d01024020112802980141024722120d00411c211341e5abc700211402400240024002400240200f450d0020112903a001210b200e2115200f21160340201641e0006a2107201641086a210020162f010622174103742101410021180240024003402001450d0141b4abc7002000410810d2062219450d02200141786a21012007410c6a2107201841016a2118200041086a21002019417f4a0d000b2018417f6a21170b2015450d022015417f6a2115201620174102746a41e4016a28020021160c010b0b0240200741086a28020041084f0d004129211341bcabc70021140c010b200b42f02e802007280200290000510d014195e9c6002114413121130b2002201336022420022014360220200242e2c289abb68edbb7f4003703c0012002200241f0036a200241c0016a200241206a10a403200228020022010d01200241d0046a41086a200241f0036a41086a290300370300200220022903f0033703d0040c070b20120d0320112903a001211a200241386a20024190036a108601024020022802384101460d002002290340210b20104200370300200d4200370300200241386a41086a2201420037030020024200370338200241d0046a418a8cc700410910fb012001200241d0046a41086a2200290000370300200220022900d004370338200241d0046a41808ec500410310fb01200d41086a2000290000370000200d20022900d004370000200241106a200241386a10ab03201a200b42b0ea017c560d02201a200229031842b8177c42b81720022802101b220b5a0d04200b42808080807083211a410021010c030b2002290340220b42808080807083211a200228023c211b41012101201c42808080807083200235024884221c211d0c020b20022802042100200220013602382002200036023c4188b1c2004122200241386a41acb1c20041f8b0c2001036000b201d428080808070832018ad84211d41fcb5c500ad210b4280808080d004211a4100211b410121010b2002201d3703482002201b36023c20022001360238200242f4d2b59bc7ae98b8303703d0012002201a200b42ffffffff0f8384370340200241086a200241f0036a200241d0016a200241386a10a803200228020822000d042001450d00200241d0046a41086a200241f0036a41086a290300370300200220022903f0033703d004201b450d03201a422088a7450d03200ba710260c030b201141c8036a2211200c470d000b0b200241d0046a41086a200a290300370300200220022903f0033703d0040b20024190036a10a50302402004450d00200441246c21002003210103400240024020012d0000220741044b0d0002400240024020070e050400010204040b2001410c6a280200450d03200141086a28020010260c030b2001410c6a280200450d02200141086a28020010260c020b2001410c6a280200450d01200141086a28020010260c010b200141086a280200450d00200141046a28020010260b200141246a21012000415c6a22000d000b0b02402005450d00200541246c450d00200310260b02402008450d00200841c8036c210020064198016a21010340200110d501200141c8036a2101200041b87c6a22000d000b0b02402009450d00200941c8036c450d00200610260b200241003602f803200242013703f00320022d00dc042101200241f0036a41004101106d20022802f00320022802f80322006a20013a00002002200041016a22013602f80320022d00dd042100200241f0036a20014101106d20022802f00320022802f80322016a20003a00002002200141016a3602f803200241f0036a20022802d804221910a101024020022802d00422070d004100211941002101410021070c020b4200210b20022802d4042100200721010340200b42ffffffff0f8320012f01062218ad42208684210b2000450d022000417f6a2100200120184102746a41e4016a280200210120072802e40121070c000b0b200228020c2101200220003602d004200220013602d4044188b1c2004122200241d0046a41acb1c20041f8b0c2001036000b200241d0006a200b370300200241cc006a20013602002002201936025820024100360248200242003703402002200736023c2002410036023802402019450d0020022019417f6a360258200241386a410020071b22192802002107201928020821030240024002400240201928020c2218201928020422002f01064f0d00200021010c010b034020002802002201450d02200741016a210720002f0104211820012100201820012f01064f0d000b0b2018ad4220862003ad84210b0c010b2003ad210b410021010b200b422088a7220341016a2118200ba721160240024020070d00200121000c010b200120184102746a41e4016a2802002100410021182007417f6a2207450d00034020002802e40121002007417f6a22070d000b0b2019201836020c20192016360208201920003602042019410036020020012003410c6c6a41e0006a2100200120034103746a41086a21010340200241f0036a20022802f8034108106d20022802f00320022802f80322076a20012900003700002002200741086a3602f80320002802002000280208200241f0036a10950120022802582201450d0120022001417f6a360258200241386a4100200228023c1b2219280200210720192802082103024002400240201928020c2218201928020422002f01064f0d00200021010c010b0240034020002802002201450d01200741016a210720002f0104211820012100201820012f0106490d020c000b0b2003ad210b410021010c010b2018ad4220862003ad84210b0b200b422088a7220341016a2118200ba721160240024020070d00200121000c010b200120184102746a41e4016a2802002100410021182007417f6a2207450d00034020002802e40121002007417f6a22070d000b0b2019201836020c20192016360208201920003602042019410036020020012003410c6c6a41e0006a2100200120034103746a41086a21010c000b0b20023502f803210b20023502f003211d200241d0046a10a503200241c0056a2400201d200b422086840f0b200241dc046a4104360200200241cc006a41023602002002420237023c200241b882c700360238200241043602d404200241c884c7003602d0042002410036029403200241d4c0c700360290032002200241d0046a360248200220024190036a3602d804200241386a41c882c700103d000bd20102017f027e230041c0006b2202240002402001450d00200241346a41043602002002411c6a41023602002002420237020c200241b882c7003602082002410436022c200241e084c7003602282002410036023c200241d4c0c7003602382002200241286a3602182002200241386a360230200241086a41c882c700103d000b200241086a41d4c0c700410010a40220024100360230200242013703282002200241286a360238200241086a200241386a109c012002350230210320023502282104200241c0006a240020042003422086840bd90c03017f027e027f230041f0116b220224002002428080808080203702dc02200220013602ec022002200041d4c0c70020011b22003602e8022002200241e8026a3602d80202400240024002402001450d0020022001417f6a3602ec022002200041016a3602e80220002d0000220041024b0d0041002101024020000e03030200030b410221010c020b420321030c020b410121010b200241a0086a200241d8026a10d30142032103024020022903880922044203520d000c010b200241076a200241a0086a41e80010cf061a200241e80e6a20024190096a41d80210cf061a200241b0076a200241ef0010cf061a200421030b200241c1066a200241b0076a41ef0010cf061a200241e80b6a200241e80e6a41d80210cf061a0240024020034203510d00200220013a00f002200241f0026a410172200241c1066a41ef0010cf062100200241e0036a2003370300200241e8036a200241e80b6a41d80210cf0621050240024020022802d802280204450d0020024190046a109803420321030c010b200241e80e6a200041ef0010cf061a200241a0086a200541d80210cf061a0b20034203510d00200241f0026a200241e80e6a41ef0010cf061a200241b0076a200241f7026a41e80010cf061a2002200241a0086a41d80210cf06220241a0086a200241b0076a41e80010cf061a200220033703880920024190096a200241d80210cf061a2002200241a0086a3602e80e200241f0026a200241e80e6a10af0420022802f8022100024020022802f402450d0020022802f00210260b200241f0026a200241a0086a41c80310cf061a200241e80e6a200241f0026a10ed04410121050240024020022d00e80e4101460d00200241e80b6a200241f00e6a41800310cf061a200241e80e6a200241b80c6a220510a103200241f0026a200241e80b6a200120022903e80e20022d00f00e20022d00f10e200010f303200510980320022d00f00221050c010b200220022d00eb0e3a00f302200220022f00e90e3b00f102200241013a00f0020b410110242201450d01200242013702a408200220013602a00802400240200541ff01714101470d00200241a0086a41004101106d20022802a00820022802a80822016a41013a00002002200141016a3602a808200241f0026a410172200241a0086a10ae0420022802a808210120022802a00821000c010b200241a0086a41004101106d20022802a00820022802a80822016a41003a00002002200141016a22013602a808200241f0026a41086a2903002103200241a0086a20014108106d20022802a00820022802a80822016a20033700002002200141086a3602a80820024188036a2802002101200241a0086a20024190036a280200220010a10102402000450d0020012000410c6c6a210003402001280200200141086a280200200241a0086a1095012001410c6a22012000470d000b0b20024194036a2802002101200241a0086a2002419c036a280200220010a10102402000450d0020012000410c6c6a210003402001280200200141086a280200200241a0086a1095012001410c6a22012000470d000b0b20024180036a2903002103200241a0086a20022802a8084108106d20022802a00820022802a80822016a20033700002002200141086a22013602a808200241a0036a2d00002106200241a0086a20014101106d20022802a008220020022802a80822016a20063a00002002200141016a22013602a8080b2001ad4220862000ad8421030240200541ff01710d0020024188036a2802002105024020024190036a2802002201450d002001410c6c21002005210103400240200141046a280200450d00200128020010260b2001410c6a2101200041746a22000d000b0b02402002418c036a2802002201450d002001410c6c450d00200510260b20024194036a280200210502402002419c036a2802002201450d002001410c6c21002005210103400240200141046a280200450d00200128020010260b2001410c6a2101200041746a22000d000b0b20024198036a2802002201450d002001410c6c450d00200510260b200241f0116a240020030f0b200241f40b6a410436020020024184036a4102360200200242023702f402200241b882c7003602f002200241043602ec0b200241f484c7003602e80b20024100360204200241d4c0c7003602002002200241e80b6a36028003200220023602f00b200241f0026a41c882c700103d000b1033000bc52c040f7f037e0d7f017e230022022103200241c0046b416071220224002002428080808080203702c4022002200136029c022002200041d4c0c70020011b36029802200220024198026a3602c00220024190036a200241c0026a10e5022002419c036a2802002104200228029803210520022802940321062002280290032107200241306a200241a0036a41e00010cf061a0240024002400240024002400240024002402006450d00200241a0016a200241306a41e00010cf061a0240024020022802c002280204450d0002402004450d00200441246c21002006210103400240024020012d0000220841044b0d0002400240024020080e050400010204040b2001410c6a280200450d03200141086a28020010260c030b2001410c6a280200450d02200141086a28020010260c020b2001410c6a280200450d01200141086a28020010260c010b200141086a280200450d00200141046a28020010260b200141246a21012000415c6a22000d000b0b410021012005450d01200541246c450d01200610260c010b20024190036a200241a0016a41e00010cf061a200621010b2001450d002002413c6a2004360200200241386a20053602002002200136023420022007360230200241c0006a20024190036a41e00010cf06210120024188026a200241306a10b6052002280230200120024180016a20024188026a410010b304410041002802ccc2472201410120011b3602ccc2470240200141014b0d000240024020010e020001000b410041ac9fc0003602c4c247410041d4c0c7003602c0c247410041023602ccc2470c010b034041002802ccc2474101460d000b0b2002410020022802302201417f6a2200200020014b1b220936029402108306450d01200241a8036a22014200370300200241a0036a2200420037030020024190036a41086a220542003703002002420037039003200241a0016a41d18cc700410810fb012005200241a0016a41086a2206290000370300200220022900a00137039003200241a0016a41e3d3c500410e10fb0120012006290000370300200020022900a001370300200241286a20024190036a4120108902410021080240200228022c410020022802281b220a20094d0d00200241a0016a210020024198026a21010c070b2001420037030020004200370300200542003703002002420037039003200241a0016a41b48cc700410710fb0120052006290000370300200220022900a00137039003200241a0016a4184c1c200410c10fb0120012006290000370300200020022900a001370300200241206a20024190036a41201089022002280220210b2002280224210c20024190036a10ad03200228029803210d024020022802940341ffffff3f71450d0020022802900310260b200241c0026a10ac0320024190036a41e9dabdf30610840620022802900321052002280294032106024002400240024020022802980322010d004100210e4101210f410021100c010b20014104200141044b1b220041ffffff3f712000470d02200041057422044100480d0220041024220f450d0120014105742108200520014105746a20056b41606a2107200f2101200521000340200041086a2900002111200041106a290000211220002900002113200141186a200041186a290000370000200141106a2012370000200141086a201137000020012013370000200141206a2101200041206a2100200841606a22080d000b2004410576210e200741057641016a21100b0240200641ffffff3f71450d00200510260b20104115490d0602404101450d0020104104744160712214417f4c0d000240201410242215450d00200241003602a801200242043703a001200f41606a2116200f41a07f6a2117410021012010211803400240024020182219417f6a22180d0041002118410121050c010b024002400240024002400240200f20184105746a20194105742204200f6a41406a412010d2064100480d002019417e6a2106201720046a210041002118410021080340024020062008470d00201921050c080b200841016a2108200041206a2000412010d2062105200041606a21002005417f4a0d000b200841016a21052008417f7320196a21180c010b201720046a210002400340024020184101470d00410021180c020b2018417f6a2118200041206a2000412010d2062108200041606a210020084100480d000b0b20192018490d01201920104b0d02201920186b22054101762206450d00201620046a2100200f20184105746a2108034020024190036a41186a2204200841186a220729000037030020024190036a41106a221a200841106a221b29000037030020024190036a41086a221c200841086a221d2900003703002002200829000037039003200041086a221e2900002111200041106a220a2900002112200041186a221f29000021132008200029000037000020072013370000201b2012370000201d2011370000201f2004290300370000200a201a290300370000201e201c2903003700002000200229039003370000200041606a2100200841206a21082006417f6a22060d000b0b2018450d04200541094b0d04201920104b0d02201920186b21052018417f6a2101201620184105746a2100034020192001490d0d2000200541016a22051088052001417f6a220820014f0d04200041606a2100200821012005410a490d000c040b0b2018201941c4ccc5001048000b2019201041c4ccc5001047000b20192018417f6a2201490d092019201041d4ccc5001047000b200841016a211820022802a80121010b0240200120022802a401470d00200241a0016a10bf0120022802a80121010b20022802a001220020014103746a22082005360204200820183602002002200141016a22013602a801024020014102490d0002400340024002400240024020002001417f6a4103746a2208280200450d00200141037420006a220441746a2802002206200828020422054d0d00200141024d0d0620002001417d6a221d4103746a2802042208200520066a4d0d01200141034d0d06200441646a280200200820066a4b0d060c010b20014103490d012008280204210520002001417d6a221d4103746a28020421080b20082005490d010b2001417e6a211d0b0240024002400240024002402001201d41016a221e4d0d002001201d4d0d012000201d410374221f6a2201280204221920012802006a22012000201e41037422206a2200280200220a490d02200120104b0d03200f200a4105746a221b2000280204221c41057422006a2105200141057421082001200a6b2204201c6b2201201c4f0d04201520052001410574220010cf06221a20006a210602400240201c4101480d00200141014e0d010b20052101201a21000c060b201620086a21082005210103402008200141606a2205200641606a220420042005412010d20641004822071b2200290000370000200841186a200041186a290000370000200841106a200041106a290000370000200841086a200041086a2900003700002006200420071b21060240201b2005200120071b2201490d00201a21000c070b200841606a2108201a2100201a2006490d000c060b0b201e200141e4ccc5001032000b201d200141f4ccc5001032000b200a20014184cdc5001048000b200120104184cdc5001047000b2015201b200010cf06221a20006a210602400240201c4101480d002004201c4a0d010b201b2101201a21000c010b200f20086a2107201a2100201b2101034020012005200020052000412010d20641004822041b2208290000370000200141186a200841186a290000370000200141106a200841106a290000370000200141086a200841086a2900003700002000200041206a20041b2100200141206a2101200541206a200520041b220520074f0d01200620004b0d000b0b20012000200620006b41607110cf061a024020022802a8012201201d4d0d0020022802a0012200201f6a22082019201c6a3602042008200a3602002001201e4d0d02200020206a2208200841086a2001201e417f736a41037410d0061a20022001417f6a22013602a801200141014d0d030c010b0b201d20014194cdc5001032000b201e2001103e000b2018450d080c000b0b1033000b1034000b102c000b102e000b200241ac016a4104360200200241c4006a410236020020024202370234200241b882c700360230200241043602a4012002419085c7003602a001200241003602c402200241d4c0c7003602c0022002200241a0016a3602402002200241c0026a3602a801200241306a41c882c700103d000b41002802c8c2474105490d05200241133602a401200220024194026a3602a00141002802c4c247210141002802c0c247210041002802ccc2472108200241d0036a419003360200200241c8036a42e080808010370300200241c4036a41ced2c500360200200241bc036a4210370200200241b8036a419cd4c500360200200241b0036a4201370300200241a0036a420237030020024190036a41086a4108360200200241ac036a200241a0016a36020020024184d4c50036029c0320024194d4c500360294032002410536029003200041c8a1c000200841024622081b20024190036a200141b0a1c00020081b2802101102000c050b2001201941d4ccc5001048000b024020022802a40141ffffffff0171450d00200010260b2014450d01201510260c010b4102210120104102490d00200f2010417e6a22004105746a2108034020102000490d0420082001108805200841606a2108200141016a21012000417f6a2200417f470d000b0b200c4100200b1b210120022802c402210a20022802c002210820022802c80221002002200d3602b802200220093602b402200220013602b002200220103602ac022002200e3602a8022002200f3602a402200241003602a0022002200820004105746a220036029c0220022008360298022002200d3602c001200220093602bc01200220013602b801200220103602b4012002200e3602b0012002200f3602ac01200241003602a801200220003602a401200220083602a001200241a0016a210020024198026a21010b200241a0016a41106a2205200141106a2902002211370300200241a0016a41186a2206200141186a2902002212370300200241e8026a41086a2204200141086a290200370300200241e8026a41106a22072011370300200241e8026a41186a221a2012370300200241e8026a41206a221b200141206a280200360200200241c0026a41206a221c20024190036a41206a290200370300200241c0026a41186a221d20024190036a41186a290200370300200241c0026a41106a221e20024190036a41106a290200370300200241c0026a41086a221820024190036a41086a221f290200370300200220012902003703e80220022002290290033703c00220024198026a41206a2201200241a0016a41206a29020037030020024198026a41186a2219200629020037030020024198026a41106a2220200529020037030020024198026a41086a220f200241a0016a41086a290200370300200220022902a00137039802201f200a360200200220083602940320024101360290032002419c036a220520022903e802370200200241a4036a22062004290300370200200241ac036a22042007290300370200200241b4036a2207201a290300370200200241bc036a201b280200360200200241003602c003200241c4036a20022903c002370200200241cc036a2018290300370200200241d4036a201e290300370200200241dc036a201d290300370200200241e4036a201c290300370200200241003602ec0320024190046a200129030037030020024188046a201929030037030020024180046a2020290300370300200241f8036a200f290300370300200241f0036a200229039802370300200241e0036a211b200241c8036a2101200241ec036a211f200241c0036a211e200241d0036a211c200241d8036a211d410021080340024002402008450d00200241186a201e108f050240200228021822084108460d00200228021c21180c020b024020022802c0032208450d00024020022802c40341ffffff3f71450d00200810260b20022802d80341ffffff3f71450d0020022802d40310260b20012000290200370200200141086a200041086a290200370200200141106a200041106a290200370200200141186a200041186a290200370200200141206a200041206a2802003602002002200a3602c403200241003602c0030b20042902002112200420022903b80137020020062902002113200620022903b00137020020052902002121200520022903a801370200200241a0046a41086a221a200741086a280200360200200241003602a001200220072902003703a0042002290294032111200220022903a0013702940302402011a72208450d00201b20022903a004370200200220113703c00320012021370300201b41086a201a280200360200201c2013370300201d20123703000c020b024020022802ec030d00410821080c010b200241106a201f108f0520022802142118200228021021080b02400240200841796a221a41014b0d000240201a0e020200020b0240200228029003450d002002280294032201450d00024020022802980341ffffff3f71450d00200110260b200241ac036a28020041ffffff3f71450d00200241a8036a28020010260b024020022802c0032201450d00024020022802c40341ffffff3f71450d00200110260b20022802d80341ffffff3f71450d0020022802d40310260b20022802ec032201450d030240200241f0036a28020041ffffff3f71450d00200110260b20024184046a28020041ffffff3f71450d0320024180046a28020010260c030b2002201836029c04200220083602980441002802c8c2474104490d00200241163602ac04200241133602a404200220024198046a3602a804200220024194026a3602a00441002802c4c247210841002802c0c247211a41002802ccc247211820024187033602e001200242e0808080103703d801200241ced2c5003602d401200242103702cc012002419cd4c5003602c801200242023703c001200242023703b001200241f4d3c5003602ac01200241083602a80120024194d4c5003602a401200241043602a001200841b0a1c000201841024622181b28021021082002200241a0046a3602bc01201a41c8a1c00020181b200241a0016a20081102000b20022802c00321080c000b0b200228028802210502402002280290022201450d00200141246c21002005210103400240024020012d0000220841044b0d0002400240024020080e050400010204040b2001410c6a280200450d03200141086a28020010260c030b2001410c6a280200450d02200141086a28020010260c020b2001410c6a280200450d01200141086a28020010260c010b200141086a280200450d00200141046a28020010260b200141246a21012000415c6a22000d000b0b0240200228028c022201450d00200141246c450d00200510260b0240200228023c2200450d0020022802342101200041246c210003400240024020012d0000220841044b0d0002400240024020080e050400010204040b2001410c6a280200450d03200141086a28020010260c030b2001410c6a280200450d02200141086a28020010260c020b2001410c6a280200450d01200141086a28020010260c010b200141086a280200450d00200141046a28020010260b200141246a21012000415c6a22000d000b0b024020022802382201450d00200141246c450d00200228023410260b2003240042010f0b2000201041a4ccc5001048000b070010144101460bb70705017f017e077f037e047f23004180026b220224002002200136020c02400240024002402002410c6a10072203422088a72201450d002002200136021420022003a722043602102002200241106a108f0120022802000d0202402002280204220520022802144105762201200120054b1b22014105742206417f4c0d0002400240024020010d00410121070c010b200610242207450d010b2001ad210302402005450d00410021080340200241003a00b8012002280214417f6a2101200841016a210841002106024002400240024003402001417f460d0120024198016a20066a200228021022092d00003a00002002200941016a3602102002200641016a22093a00b801200220013602142001417f6a21012009210620094120470d000b200241c0016a41086a220120024198016a41086a290300370300200241c0016a41106a220620024198016a41106a290300370300200241c0016a41186a220a20024198016a41186a29030037030020022002290398013703c001200941ff0171411f4d0d01200241386a41086a2001290300220b370300200241386a41106a2006290300220c370300200241386a41186a200a290300220d370300200241186a41186a2206200d370300200241186a41106a2209200c370300200241186a41086a220a200b370300200220022903c001220b3703582002200b3703382002200b3703182003422088a722012003a7470d03200141016a220e2001490d0b2001410174220f200e200e200f491b220e4104200e41044b1b220e41ffffff3f712210200e470d0b200e410574220f41004e0d020c0b0b200641ff0171450d00200241003a00b8010b200241386a41086a200241d8006a41086a290300370300200342ffffff3f83500d08200710260c080b2010200e46210e2001410574201120011b211102400240024002402007410020011b22070d00200f0d01200e21070c030b2011200f460d02024020110d00200f0d01410121070c030b20072011200f10282207450d010c020b200f102422070d010b200e450d09102c000b200342808080807083200f410576ad8421030b20072003422088a74105746a22012002290318370000200141186a2006290300370000200141106a2009290300370000200141086a200a29030037000020034280808080107c210320082005470d000b0b2007450d042000200337020420002007360200200410260c030b1033000b1034000b20004100360208200042013702000b20024180026a24000f0b4196aec700412e20024198016a41c0acc70041d0acc7001036000b102e000be20202027f017e230041c0006b22022400024020010d00200241286a22014200370300200241206a22034200370300200241106a41086a420037030020024200370310200241106a41eb8cc700410a10fb01200241306a41dc9dc600410b10fb012001200241306a41086a29000037030020032002290030370300200241306a200241106a10da0402400240200228023022010d00200241003602082002420137030041012101410121030c010b20022002290234220437020420022001360200200442ffffff3f835021030b200241106a200210bb0120023502184220862002350210842104024020030d00200110260b200241c0006a240020040f0b2002413c6a4104360200200241246a410236020020024202370214200241b882c70036021020024104360234200241a885c70036023020024100360204200241d4c0c7003602002002200241306a36022020022002360238200241106a41c882c700103d000bda0502087f017e230041d0006b2202240002400240024020010d00200241206a10d904200228022822014103744104722203417f4c0d012002280224210420022802202105200310242206450d02200241003602282002200336022420022006360220024002400240200141c000490d0002400240200141808001490d002001418080808004490d01200241206a41004101106d2002280220200228022822036a41033a00002002200341016a2203360228200241206a20034104106d2002280220200228022822036a20013600002002200341046a2203360228200241206a21070c030b200241206a41004102106d2002280220200228022822036a20014102744101723b00002002200341026a2203360228200241206a21070c020b200241206a41004104106d2002280220200228022822036a20014102744102723600002002200341046a2203360228200241206a21070c010b200241206a41004101106d20022802202208200228022822036a20014102743a00002002200341016a2203360228200241206a21072001450d010b200141037421062005210103400240024020012802004101460d00200720034101106d20022802202208200228022822036a41003a0000200341016a21030c010b200720034101106d2002280220200228022822036a41013a00002002200341016a2203360228200141046a2802002109200720034104106d20022802202208200228022822036a2009360000200341046a21030b200141086a210120022003360228200641786a22060d000b0b2003ad4220862008ad84210a0240200441ffffffff0171450d00200510260b200241d0006a2400200a0f0b200241146a4104360200200241346a410236020020024202370224200241b882c7003602202002410436020c200241bc85c7003602082002410036021c200241d4c0c7003602182002200241086a3602302002200241186a360210200241206a41c882c700103d000b1034000b1033000be50202027f017e230041c0006b22022400024020010d00200241286a22014200370300200241206a22034200370300200241106a41086a420037030020024200370310200241106a41818dc700410910fb01200241306a41acd6c000410610fb012001200241306a41086a29000037030020032002290030370300200241306a200241106a10fd0102400240200228023022030d00410021012002410036020820024204370300410421030c010b200220022902342204370204200220033602002004a721010b200241106a200210b9012002350218422086200235021084210402402001450d002001412c6c450d00200310260b200241c0006a240020040f0b2002413c6a4104360200200241246a410236020020024202370214200241b882c70036021020024104360234200241d085c70036023020024100360204200241d4c0c7003602002002200241306a36022020022002360238200241106a41c882c700103d000ba40301047f230041c0006b2202240002402001450d002002413c6a4104360200200241246a410236020020024202370214200241b882c70036021020024104360234200241ec85c7003602302002410036020c200241d4c0c7003602082002200241306a3602202002200241086a360238200241106a41c882c700103d000b200241286a22014200370300200241206a22034200370300200241106a41086a420037030020024200370310200241106a41808cc700410610fb01200241306a41ea93c400410610fb012001200241306a41086a290000370300200320022900303703002002200241106a412010890220022802042101200228020021032002410036021820024201370310200241106a41004104106d2002280210200228021822046a41808080053600002002200441046a2204360218200241106a20044104106d2002280210200228021822046a4180a0013600002002200441046a2204360218200241106a20044104106d20022802102204200228021822056a2001410020031b2201417f6a410020011b360000200241c0006a2400200541046aad4220862004ad840bce0402037f027e230041d0006b220224000240024020014104490d0020014104470d00200041d4c0c70020011b2800002103200241286a22014200370300200241206a22004200370300200241106a41086a420037030020024200370310200241106a41808cc700410610fb01200241c0006a41ea93c400410610fb012001200241c0006a41086a29000037030020002002290040370300200241086a200241106a41201089020240024002402002280208450d00200228020c22010d010b2002410236022c0c010b200241106a20032001417f6a10e4040b410110242201450d012002420137024420022001360240200228022c2101200241c0006a41004101106d20022802402204200228024822006a21030240024020014102470d00200341003a0000200041016aad4220862004ad8421050c010b200341013a00002002200041016a3602482002280220200241286a280200200241c0006a109501200241186a290300210520022903102106200241c0006a20022802484110106d2002280240200228024822016a22002005370008200020063700002002200141106a360248200241c0006a2002412c6a10af0120023502484220862002350240842105200241246a280200450d00200228022010260b200241d0006a240020050f0b200241cc006a4104360200200241246a410236020020024202370214200241b882c700360210200241043602442002418c86c7003602402002410036023c200241d4c0c7003602382002200241c0006a3602202002200241386a360248200241106a41c882c700103d000b1033000bee0204017f017e027f017e230041306b220224000240024020014104470d002002200041d4c0c70020011b280000109802200241186a200228020022002002280208109d02200229021c21032002280218210102402002280204450d00200010260b410110242200450d012002420137020420022000360200200241004101106d20022802002200200228020822046a21050240024020010d00200541003a00002002200441016a22043602080c010b200541013a00002002200441016a36020820012003422088a7200210950120022802082104200228020021000b2004ad4220862000ad84210602402001450d002003a7450d00200110260b200241306a240020060f0b200241246a4104360200200241146a410236020020024202370204200241b882c7003602002002410436021c200241ac86c7003602182002410036022c200241d4c0c7003602282002200241186a3602102002200241286a360220200241c882c700103d000b1033000b8e2c0e027f017e0c7f017e0b7f0a7e027f027e017f027e017f027e027f017e230041c0166b220224002002428080808080203702f403200220013602342002200041d4c0c70020011b3602302002200241306a3602f003200241e80a6a200241f0036a10d2010240024020022802e80a2203450d0020022902ec0a210420022802f003280204450d0102402004422088a72201450d00200141c8036c210020034198016a21010340200110d501200141c8036a2101200041b87c6a22000d000b0b2004a72201450d00200141c8036c450d00200310260b200241fc036a4104360200200241fc0a6a4102360200200242023702ec0a200241b882c7003602e80a200241043602f403200241c486c7003602f00320024100360234200241d4c0c7003602302002200241f0036a3602f80a2002200241306a3602f803200241e80a6a41c882c700103d000b20032004422088a7220541c8036c6a210602400240024020050d00200321070c010b200241f0036a4198016a2108200241e80a6a4198016a2109200241840c6a210a200241ca0b6a210b200241890b6a210c200241e80a6a410472210d200241e80a6a410172210e200241f0036a41f0006a210f200241f00b6a21102003210702400240034020024188036a200741e80010cf061a20072903682111200241306a200741f0006a41d80210cf061a200741c8036a210720114203510d03200241f0036a20024188036a41e80010cf061a200220113703d804200f200241306a41d80210cf061a2002200241f0036a3602e80a200241d80a6a200241e80a6a10af04200220022802e00a3602d40a200220022802d80a22123602d00a200241286a200241d00a6a108f0102400240024020022802280d000240200228022c2200450d0041002101410020006b2100034020014101460d0720002001417f6a2201470d000b0b20022802d40a2213450d0020022802d00a22142d0000210120022013417f6a22153602d40a2002201441016a3602d00a200141ff00714104470d004202211102402001411874411875417f4a0d0041002100200241003a00880b417e21160240024002400340201520002201460d01200241e80a6a20016a201420016a220041016a2d00003a00002002201320166a3602d40a2002200041026a3602d00a2002200141016a22003a00880b2016417f6a211620004120470d000b20024180106a41086a2217200241e80a6a41086a29030037030020024180106a41106a2218200241e80a6a41106a29030037030020024180106a41186a2219200241e80a6a41186a290300370300200220022903e80a37038010200041ff0171411f4b0d01420221110c020b0240200141ff0171450d00200241003a00880b0b420221110c010b200241b8126a41086a221a2017290300370300200241b8126a41106a221b2018290300370300200241b8126a41186a221c201929030037030020022002290380103703b8120240024002400240024020152000460d00201420006a221441016a2d000021152002201320166a3602d40a2002201441026a3602d00a201541024b0d00024002400240024020150e03000102000b200241e80a6a200241d00a6a10dc0120022d00e80a4101460d0320024180106a41386a200e41386a290000221137030020024180106a41306a200e41306a290000221d37030020024180106a41286a200e41286a290000221e37030020024180106a41206a200e41206a290000221f3703002019200e41186a2900002220370300200241a0136a41086a200e41086a290000370300200241a0136a41106a200e41106a290000370300200241a0136a41186a2020370300200241a0136a41206a201f370300200241a0136a41286a201e370300200241a0136a41306a201d370300200241a0136a41386a20113703002002200e2900003703a013410021160c020b200241e80a6a200241d00a6a10dc0120022d00e80a4101460d0220024180106a41386a200e41386a290000221137030020024180106a41306a200e41306a290000221d37030020024180106a41286a200e41286a290000221e37030020024180106a41206a200e41206a290000221f3703002019200e41186a2900002220370300200241a0136a41086a200e41086a290000370300200241a0136a41106a200e41106a290000370300200241a0136a41186a2020370300200241a0136a41206a201f370300200241a0136a41286a201e370300200241a0136a41306a201d370300200241a0136a41386a20113703002002200e2900003703a013410121160c010b41002116200241003a00a90b200020136b41026a2115201320016b417c6a2101024002400340201520166a450d01200241e80a6a20166a201420166a220041026a2d00003a00002002200041036a3602d00a2002201641016a22003a00a90b200220013602d40a2001417f6a210120002116200041c100460d020c000b0b201641ff0171450d02200241003a00a90b0c020b20024180106a200241e80a6a41c10010cf061a200241d0146a20024180106a41c10010cf061a200041ff017141c0004d0d012002418f146a200241d0146a41c10010cf061a200241a0136a2002418f146a41c10010cf061a410221160b200241df126a200241a0136a41c10010cf061a20022802d40a2201450d0320022802d00a2200310000211d20022001417f6a22133602d40a2002200041016a3602d00a201d50450d01420021110c020b420221110c040b2013450d012000310001211e20022001417e6a3602d40a2002200041026a3602d00a42012111201e420886201d844204884202201d420f8386221d420c88221e4201201e4201561b7e221e2021201d420356201e201d547122011b2121201d202220011b212220014101470d010b20232021201142025122011b21232024202220011b2124200241206a200241d00a6a108f0120022802200d0020022802242101200241086a200241d00a6a10b3052002290308a7450d010b420221110c010b200241086a41106a2903002125200229031021262019201c2903003703002018201b2903003703002017201a290300370300200220022903b81237038010200241e80a6a200241df126a41c10010cf061a200241d0146a41046a200241b2126a41046a2f01003b0100200220022801b2123602d0142001212720162128202421292023212a0b200241e00f6a41186a220120024180106a41186a290300370300200241e00f6a41106a220020024180106a41106a290300370300200241e00f6a41086a221620024180106a41086a29030037030020022002290380103703e00f2002419f0f6a200241e80a6a41c10010cf061a200241980f6a41046a2213200241d0146a41046a2f01003b0100200220022802d0143602980f20114202510d01200241f80e6a41186a2001290300370300200241f80e6a41106a2000290300370300200241f80e6a41086a2016290300370300200220022903e00f3703f80e200241b70e6a2002419f0f6a41c10010cf061a200241b00e6a41046a20132f01003b0100200220022802980f3602b00e2028212b2026212c2025212d2027212e2029212f202a21300b200241e80a6a200241d00a6a10b60220022802e80a210120024180106a200d41ac0210cf061a20014117470d010b024020022802dc0a450d00201210260b20081098030c010b200241b00a6a41186a2200200241f80e6a41186a290300370300200241b00a6a41106a2216200241f80e6a41106a290300370300200241b00a6a41086a2213200241f80e6a41086a290300370300200220022903f80e3703b00a200241ef096a200241b70e6a41c10010cf061a200241e8096a41046a2214200241b00e6a41046a2f01003b0100200220022802b00e3602e809200241bc076a20024180106a41ac0210cf061a200241e80a6a41186a2000290300370300200241e80a6a41106a2016290300370300200241e80a6a41086a2013290300370300200220022903b00a3703e80a2002202b3a00880b200c200241ef096a41c10010cf061a2010202d370300200b41046a20142f01003b0100200b20022802e8093601002002202c3703e80b2002202e3602f80b200220303703e00b2002202f3703d80b200220113703d00b200220013602800c200a200241bc076a41ac0210cf061a410121004100211302402001410c470d0020022d00880c41ff01714101470d0020022802940c22014198026c2100200228028c0c211a20022802900c211c0240024020010d00410021194200211d41082113201a21160c010b20014104200141044b1b221641ffffff077122132016470d05201641087422144100480d0520132016464103742116024002402014450d002014102422130d012016450d07102c000b201621130b201a20006a213120014198026c211b200141037441786a41037641016a21322014410876ad211d41002116201321004100211902400340201a20166a22012903002111200141086a2903002133200141106a2802002114200241d0146a200141146a41ec0110cf061a024020140d0020014198026a21160c020b20014194026a28020021172001418c026a280200211820014184026a280200211520014180026a280200210120024180106a200241d0146a41ec0110cf061a02402015450d00201541c1006c450d00200110260b02402017450d00201810260b2000201137030020002033370308200041106a2014360200200041146a20024180106a41ec0110cf061a20004180026a2100201941016a2119201b20164198026a2216470d000b20312116203221190b203120166b22004198026d21010b2019ad211102402000450d00201620014198026c6a211403400240201641d8006a280200450d00201628025410260b0240201641186a2802002200450d00201628021021012000410474210003400240200141046a280200450d00200128020010260b200141106a2101200041706a22000d000b0b0240201641146a28020041ffffffff0071450d00201628021010260b0240201628021c2201450d00201641206a280200450d00200110260b024020164184026a2802002201450d00200141c1006c450d0020162802800210260b20164198026a210120164190026a4100360200201628028c0221002016410136028c02024020164194026a280200450d00200010260b2001211620012014470d000b0b201142208621110240201c450d00201c4198026c450d00201a10260b201d20118421334100210020022802800c21010b024002402001410c470d00024020022d00880c22014101470d002000450d02024020022802940c2201450d00200228028c0c221620014198026c6a211403400240201641d8006a280200450d00201628025410260b0240201641186a2802002200450d00201628021021012000410474210003400240200141046a280200450d00200128020010260b200141106a2101200041706a22000d000b0b0240201641146a28020041ffffffff0071450d00201628021010260b0240201628021c2201450d00201641206a280200450d00200110260b024020164184026a2802002201450d00200141c1006c450d0020162802800210260b20164198026a210120164190026a4100360200201628028c0221002016410136028c02024020164194026a280200450d00200010260b2001211620012014470d000b0b20022802900c2201450d0220014198026c450d02200228028c0c10260c020b0240200141034b0d000240024020010e0404000104040b024020022802940c2201450d00200228028c0c221620014198026c6a211403400240201641d8006a280200450d00201628025410260b0240201641186a2802002200450d00201628021021012000410474210003400240200141046a280200450d00200128020010260b200141106a2101200041706a22000d000b0b0240201641146a28020041ffffffff0071450d00201628021010260b0240201628021c2201450d00201641206a280200450d00200110260b024020164184026a2802002201450d00200141c1006c450d0020162802800210260b20164198026a210120164190026a4100360200201628028c0221002016410136028c02024020164194026a280200450d00200010260b2001211620012014470d000b0b20022802900c2201450d0320014198026c450d03200228028c0c10260c030b024020022802980c2200450d0020022802900c21012000410c6c210003400240200141046a280200450d00200128020010260b2001410c6a2101200041746a22000d000b0b20022802940c2201450d022001410c6c450d0220022802900c10260c020b20022802940c450d0120022802900c10260c010b20091098030b024020022802dc0a450d00201210260b200810980320130d020b20072006470d000b200621070c020b2033a741ffffff077121082033422088a721140c020b102e000b41002108410021130b2004a72100024020062007460d002003200541c8036c6a2101034020074198016a10d5012001200741c8036a2207470d000b0b02402000450d00200041c8036c450d00200310260b024002400240024020130d00410121010c010b20144108744105722201417f4c0d010b200110242200450d01200241003602f00a200220013602ec0a200220003602e80a200241e80a6a41004101106d20022802e80a20022802f00a22016a21000240024020130d00200041003a00002002200141016a3602f00a0c010b200041013a00002002200141016a3602f00a200241e80a6a201410a1012014450d0020144108742112410021070340201320076a220141d0006a2802002100200241e80a6a20022802f00a4104106d20022802e80a20022802f00a22166a20003600002002201641046a3602f00a2002200241e80a6a3602f003200141e0006a200241f0036a109c01200141d4006a280200200141dc006a280200200241e80a6a109501200241e80a6a20022802f00a4120106d20022802e80a20022802f00a22166a220020014180016a290000370000200041086a20014188016a290000370000200041106a20014190016a290000370000200041186a20014198016a2900003700002002201641206a22003602f00a200241e80a6a200041c000106d20022802e80a20022802f00a22166a2200200141a0016a290000370000200041086a200141a8016a290000370000200041106a200141b0016a290000370000200041186a200141b8016a290000370000200041206a200141c0016a290000370000200041286a200141c8016a290000370000200041306a200141d0016a290000370000200041386a200141d8016a2900003700002002201641c0006a3602f00a2002200241e80a6a3602f003200141e0016a200241f0036a109c01200241e80a6a2001109d01201220074180026a2207470d000b0b20023502f00a42208620023502e80a84211102402013450d0002402014450d00201320144108746a211620132101034002402001220741d8006a280200450d00200728025410260b0240200741186a2802002200450d00200728021021012000410474210003400240200141046a280200450d00200128020010260b200141106a2101200041706a22000d000b0b0240200741146a28020041ffffffff0071450d00200728021010260b20074180026a21010240200728021c2200450d00200741206a280200450d00200010260b20012016470d000b0b2008450d00201310260b200241c0166a240020110f0b1034000b1033000ba90602097f027e230041a0016b22022400024020010d00200241d8006a41186a22034200370300200241d8006a41106a22044200370300200241d8006a41086a2205420037030020024200370358200241f8006a41b48cc700410710fb012005200241f8006a41086a220129000037030020022002290078370358200241f8006a4184c1c200410c10fb012003200129000037030020042002290078370300200241086a200241d8006a4120108902200228020c210620022802082107200241106a41186a22084200370300200241106a41106a22094200370300200241106a41086a220a420037030020024200370310200241f8006a41808cc700410610fb01200a200129000037030020022002290078370310200241f8006a41f693c400410a10fb012008200129000037030020092002290078370300200241f8006a200241106a412010b80320022d00782108200320024191016a290000370300200420024189016a290000370300200520024181016a290000370300200220022900793703582006410020071b21010240024020084101460d00200241386a41186a4200370300200241386a41106a4200370300200241386a41086a4200370300200242003703380c010b200241386a41186a2003290300370300200241386a41106a2004290300370300200241386a41086a2005290300370300200220022903583703380b2002411c6a200241c0006a290300370200200241246a200241c8006a2903003702002002412c6a200241d0006a2903003702002002200136021020022002290338370214200241003602800120024201370378200241f8006a41004104106d200228027820022802800122036a20013600002002200341046a360280012002200241f8006a360258200241106a410472200241d8006a109c01200235028001210b2002350278210c200241a0016a2400200c200b422086840f0b20024184016a4104360200200241246a410236020020024202370214200241b882c7003602102002410436027c200241d886c7003602782002410036025c200241d4c0c7003602582002200241f8006a3602202002200241d8006a36028001200241106a41c882c700103d000bf10304017f017e037f027e230041306b2202240002400240024020014104470d002002200041d4c0c70020011b28000010e204200241186a20022802002200200228020810e304200229021c4200200228021822011b210302402002280204450d00200010260b2003422088a7220441d8006c4104722200417f4c0d01200010242205450d022001410820011b21062002410036020820022000360204200220053602002002200410a10102402004450d002006200441d8006c6a210020062101034020012002109f042000200141d8006a2201470d000b0b200235020842208621072002350200210802402004450d00200441d8006c21002006210103400240024020012d0000220441014b0d00024020040e020200020b200141086a280200450d01200141046a28020010260c010b200141086a280200450d00200141046a28020010260b200141d8006a2101200041a87f6a22000d000b0b2007200884210702402003a72201450d00200141d8006c450d00200610260b200241306a240020070f0b200241246a4104360200200241146a410236020020024202370204200241b882c7003602002002410436021c200241f086c7003602182002410036022c200241d4c0c7003602282002200241186a3602102002200241286a360220200241c882c700103d000b1034000b1033000be80804057f017e027f037e230041e0006b2202240002400240024002400240024020010d002002411436021c200241cad3c500360218200241206a41cad3c500411410820220022802202201450d01200228022421032002200241286a2802002204360234200220013602300240024002402004450d0020012d0000210520022004417f6a3602342002200141016a360230200241c8006a200241306a108e0120022802482206450d00200229024c2107200541ff01714101460d012007a72204450d00200441286c450d00200610260b20024100360210200242013703082002410e36023c2002200241186a3602382002200241086a36024441012108200241dc006a41013602002002420137024c2002418c8dc6003602482002200241386a360258200241c4006a41c4e1c000200241c8006a10351a200228020820022802101084020240200228020c450d00200228020810260b410221090c010b2007422088a721052007a7210441012109410021080b02402003450d00200110260b20080d0120094101460d0220062802082204ad42287e2207422088a70d042007a72205417f4c0d04200628020021010240024020050d00410821030c010b200510242203450d060b20024100360210200220033602082002200541286e36020c200241086a41002004109001200228021021052002280208210602402004450d00200441286c21032006200541286c6a21040340200141086a2903002107200141106a290300210a200141186a290300210b2001290300210c200441206a200141206a290300370300200441186a200b370300200441106a200a370300200441086a20073703002004200c370300200441286a2104200541016a2105200141286a2101200341586a22030d000b0b200220053602100c030b200241146a4104360200200241dc006a41023602002002420237024c200241b882c7003602482002410436020c2002418c87c70036020820024100360224200241d4c0c7003602202002200241086a3602582002200241206a360210200241c8006a41c882c700103d000b4108210641002105410021040b200220053602102002200436020c200220063602080b200541286c4104722201417f4c0d00200110242204450d01200241003602502002200136024c20022004360248200241c8006a200510a1010240024020050d0020022802502104200228024821050c010b2006200541286c6a210320022802502104200621010340200241c8006a20044120106d2002280248200228025022056a22042001290000370000200441086a200141086a290000370000200441106a200141106a290000370000200441186a200141186a2900003700002002200541206a2204360250200141206a2903002107200241c8006a20044108106d20022802482205200228025022046a20073700002002200441086a22043602502003200141286a2201470d000b0b2004ad4220862005ad8421070240200228020c2201450d00200141286c450d00200610260b200241e0006a240020070f0b1034000b1033000b8f0b04017f027e027f017e230041e0076b220224002002428080808080203702d407200220013602c4072002200041d4c0c70020011b3602c0072002200241c0076a3602d007200241f8036a200241d0076a10cf04024020022903800422034202510d0020022903f8032104200241f8016a20024188046a41f00110cf061a2002200241d0076a108d0120022802000d0020022802c407220020022802042201490d00024002402001417f4c0d000240024020010d0041002105410121060c010b2001102a2206450d0220022802c4072100200121050b0240024020002001490d00200620022802c007200110cf06210020022802c407220620014f0d012001200641b8afc0001048000b2005450d03200610260c030b2002200620016b3602c407200220022802c00720016a3602c0072000450d02200241086a200241f8016a41f00110cf061a0240024020022802d007280204450d00420221032005450d01200010260c010b200241f8036a200241086a41f00110cf061a0b20034202510d02200241086a200241f8036a41f00110cf061a200241f8016a200241086a41f00110cf061a200220013602c407200220003602c007200241f8036a200241c0076a10de050240024020022802fc0322010d00410021010c010b200241d8076a20024188046a28020036020020022002290380043703d00720022802f80321060b02402005450d00200010260b200241f8036a41086a2200200241d0076a41086a2205280200360200200220022903d0073703f803024002402001450d00200241e8036a41086a20002802002200360200200220022903f80322073703e803200241a0056a20013602002002419c056a200636020020024198056a4102360200200241a4056a2007370200200241ac056a2000360200200241b8056a2003370300200241b0056a20043703002002410936029005200242023703e004200241c0056a200241f8016a41f00110cf061a2002200241f8036a3602d007200241c0076a200241d0076a10af042005200241c0076a41086a280200360200200220022903c0073703d007200241d0076a109605210120024190056a10980341002802c8c24721000240024020010d0020004103490d0141002802c4c247210141002802c0c247210041002802ccc2472105200241b8046a41a501360200200241b0046a42e780808010370300200241ac046a4188d9c500360200200241a4046a421c370200200241a0046a41ecd8c50036020020024198046a4200370300200241f8036a411c6a41d4c0c70036020020024188046a420137030020024180046a411c360200200241fc85c40036028404200241ecd8c5003602fc03200241033602f803200041c8a1c000200541024622051b200241f8036a200141b0a1c00020051b280210110200410121010c030b2000450d00200241173602d4072002200241c0076a3602d00741002802c4c247210141002802c0c247210041002802ccc2472105200241b8046a41a601360200200241b0046a42e780808010370300200241ac046a4188d9c500360200200241a4046a421c370200200241a0046a41ecd8c50036020020024198046a420137030020024188046a420137030020024180046a411c360200200241f8036a411c6a200241d0076a360200200241f8f1c60036028404200241ecd8c5003602fc03200241013602f803200041c8a1c000200541024622051b200241f8036a200141b0a1c00020051b2802101102000b410121010c010b410021010b200110ff042103200241e0076a240020030f0b1034000b1033000b200241146a41043602002002418c026a4102360200200242023702fc01200241b882c7003602f8012002410436020c200241a887c700360208200241003602d407200241d4c0c7003602d0072002200241086a360288022002200241d0076a360210200241f8016a41c882c700103d000b890d03047f047e017f23004190046b22022400024020014108490d0041002103200241003a00a003200041d4c0c70020011b41086a2100200141786a210102400240034020012003460d0120024180036a20036a200020036a2d00003a00002002200341016a22033a00a00320034120470d000b200241c8006a41186a220020024180036a41186a290300370300200241c8006a41106a220420024180036a41106a290300370300200241c8006a41086a220520024180036a41086a2903003703002002200229038003370348200341ff017141204f0d010c020b200341ff0171450d01200241003a00a0030c010b200241b8016a41086a2005290300370300200241b8016a41106a2004290300370300200241b8016a41186a2000290300370300200220022903483703b80120012003470d0020024180036a41186a2203200241b8016a41186a290300220637030020024180036a41106a2201200241b8016a41106a290300220737030020024180036a41086a2200200241b8016a41086a2903002208370300200220022903b801220937038003200241086a41186a2006370300200241086a41106a2007370300200241086a41086a200837030020022009370308200241286a41186a2006370300200241286a41106a2007370300200241286a41086a2008370300200220093703282003420037030020014200370300200042003703002002420037038003200241c8006a41b48cc700410710fb012000200241c8006a41086a22042900003703002002200229004837038003200241c8006a4184c1c200410c10fb012003200429000037030020012002290048370300200220024180036a4120108902200228020021042002280204210520024180036a10ad032002280284032101200228028003210002402002280288032203450d00200341057421030340200341606a22030d000b0b0240200141ffffff3f71450d00200010260b410021032002410036028004200242013703f80320024180036a200241f8036a10810402402002280280034101460d00200241e8026a41106a20024198036a280200360200200241e8026a41086a20024180036a41106a290300370300200220024180036a41086a2903003703e8022002419c036a280200210320024190026a200241a0036a41d80010cf061a0b200241f8036a41086a2201200241e8026a41086a290300370300200241f8036a41106a2200200241e8026a41106a280200360200200220022903e8023703f80320024180036a20024190026a41d80010cf061a0240024002402003450d00200241c8006a41106a2000280200360200200241c8006a41086a2001290300370300200220022903f803370348200241b8016a20024180036a41d80010cf061a200241dc006a2003360200200241c8006a41186a200241b8016a41d80010cf061a20024180036a41186a200241286a41186a29030037030020024180036a41106a200241286a41106a29030037030020024180036a41086a200241286a41086a290300370300200220022903283703800320024190026a200241c8006a41e7e485f30620024180036a10840420022902940221062002280290022100200241c8006a10fe0320000d010b41002103200241003602480c010b20024188036a20063703002002410036029003200220003602840320022005410020041b36028003200241c8006a20024180036a10e2052006a7210402402006422088a72203450d002003410c6c21012000210303400240200341046a280200450d00200328020010260b2003410c6a2103200141746a22010d000b0b02402004450d002004410c6c450d00200010260b0240200228024822030d00410021030c010b200241d0006a280200210a200228024c21050b0240410110242201450d002002420137028403200220013602800320024180036a41004101106d200228028003220120022802880322006a21040240024020030d00200441003a00002002200041016a2200360288030c010b200441013a00002002200041016a360288032003200a20024180036a109501200228028803210020022802800321010b2000ad4220862001ad84210602402003450d002005450d00200310260b20024190046a240020060f0b1033000b200241d4006a410436020020024194036a41023602002002420237028403200241b882c700360280032002410436024c200241e087c7003602482002410036029402200241d4c0c700360290022002200241c8006a36029003200220024190026a36025020024180036a41c882c700103d000bf30702057f017e230041d0016b22022400024020010d00200241d8006a10c205200241086a41186a22014200370300200241086a41106a22034200370300200241086a41086a420037030020024200370308200241086a41868cc700410410fb0120024188016a41f89ec600410a10fb01200120024188016a41086a290000370300200320022900880137030020024188016a200241086a10a00520022d0088012101200241b0016a41186a2203200241a1016a290000370300200241b0016a41106a220420024199016a290000370300200241b0016a41086a220520024191016a29000037030020022002290089013703b0010240024020014101460d00200241e8006a41186a4200370300200241e8006a41106a4200370300200241e8006a41086a4200370300200242003703680c010b200241e8006a41186a2003290300370300200241e8006a41106a2004290300370300200241e8006a41086a2005290300370300200220022903b0013703680b200241086a41186a4204370300200241086a41286a200241d8006a41086a2802003602002002413c6a2203200241e8006a41086a290300370200200241c4006a2204200241e8006a41106a290300370200200241cc006a2205200241e8006a41186a29030037020020024201370318200242d804370310200242f02e3703082002200229035837032820022002290368370234200241013a00542002410036029001200242013703880120024188016a41004108106d20022802880120022802900122016a42f02e3700002002200141086a22013602900120024188016a20014108106d20022802880120022802900122016a42d8043700002002200141086a22013602900120024188016a20014108106d20022802880120022802900122016a42013700002002200141086a22013602900120024188016a20014108106d20022802880120022802900122016a42043700002002200141086a3602900120024188016a200241086a41206a10ac0120024188016a2002280290014120106d20022802880120022802900122066a22012002290234370000200141086a2003290200370000200141106a2004290200370000200141186a20052902003700002002200641206a3602900120024188016a410110970120023502900142208620023502880184210702402002412c6a2802002201450d00200141286c450d00200228022810260b200241d0016a240020070f0b20024194016a41043602002002411c6a41023602002002420237020c200241b882c7003602082002410436028c012002418488c70036028801200241003602b401200241d4c0c7003602b001200220024188016a3602182002200241b0016a36029001200241086a41c882c700103d000b820402047f047e230041e0006b220224000240024020010d00200241c8006a22014200370300200241c0006a22034200370300200241306a41086a2204420037030020024200370330200241d0006a41868cc700410410fb012004200241d0006a41086a220529000037030020022002290050370330200241d0006a41b49dc600410a10fb012001200529000037030020032002290050370300200241186a200241306a10ab03200229032021062002290318210720014200370300200342003703002004420037030020024200370330200241d0006a41868cc700410410fb012004200529000037030020022002290050370330200241d0006a41a89ec600410b10fb012001200529000037030020032002290050370300200241086a200241306a10ab032002290310210820022903082109410810242201450d012002420837023420022001360230200241306a41004108106d20022802302201200228023822036a200842002009a71b200642d8047e42002007a71b7c370000200241e0006a2400200341086aad4220862001ad840f0b200241dc006a4104360200200241c4006a410236020020024202370234200241b882c700360230200241043602542002419c88c7003602502002410036022c200241d4c0c7003602282002200241d0006a3602402002200241286a360258200241306a41c882c700103d000b1033000b890d03047f047e017f23004190046b22022400024020014108490d0041002103200241003a00a003200041d4c0c70020011b41086a2100200141786a210102400240034020012003460d0120024180036a20036a200020036a2d00003a00002002200341016a22033a00a00320034120470d000b200241c8006a41186a220020024180036a41186a290300370300200241c8006a41106a220420024180036a41106a290300370300200241c8006a41086a220520024180036a41086a2903003703002002200229038003370348200341ff017141204f0d010c020b200341ff0171450d01200241003a00a0030c010b200241b8016a41086a2005290300370300200241b8016a41106a2004290300370300200241b8016a41186a2000290300370300200220022903483703b80120012003470d0020024180036a41186a2203200241b8016a41186a290300220637030020024180036a41106a2201200241b8016a41106a290300220737030020024180036a41086a2200200241b8016a41086a2903002208370300200220022903b801220937038003200241086a41186a2006370300200241086a41106a2007370300200241086a41086a200837030020022009370308200241286a41186a2006370300200241286a41106a2007370300200241286a41086a2008370300200220093703282003420037030020014200370300200042003703002002420037038003200241c8006a41b48cc700410710fb012000200241c8006a41086a22042900003703002002200229004837038003200241c8006a4184c1c200410c10fb012003200429000037030020012002290048370300200220024180036a4120108902200228020021042002280204210520024180036a10ad032002280284032101200228028003210002402002280288032203450d00200341057421030340200341606a22030d000b0b0240200141ffffff3f71450d00200010260b410021032002410036028004200242013703f80320024180036a200241f8036a10810402402002280280034101460d00200241e8026a41106a20024198036a280200360200200241e8026a41086a20024180036a41106a290300370300200220024180036a41086a2903003703e8022002419c036a280200210320024190026a200241a0036a41d80010cf061a0b200241f8036a41086a2201200241e8026a41086a290300370300200241f8036a41106a2200200241e8026a41106a280200360200200220022903e8023703f80320024180036a20024190026a41d80010cf061a0240024002402003450d00200241c8006a41106a2000280200360200200241c8006a41086a2001290300370300200220022903f803370348200241b8016a20024180036a41d80010cf061a200241dc006a2003360200200241c8006a41186a200241b8016a41d80010cf061a20024180036a41186a200241286a41186a29030037030020024180036a41106a200241286a41106a29030037030020024180036a41086a200241286a41086a290300370300200220022903283703800320024190026a200241c8006a41e2c289ab0620024180036a10840420022902940221062002280290022100200241c8006a10fe0320000d010b41002103200241003602480c010b20024188036a20063703002002410036029003200220003602840320022005410020041b36028003200241c8006a20024180036a10e2052006a7210402402006422088a72203450d002003410c6c21012000210303400240200341046a280200450d00200328020010260b2003410c6a2103200141746a22010d000b0b02402004450d002004410c6c450d00200010260b0240200228024822030d00410021030c010b200241d0006a280200210a200228024c21050b0240410110242201450d002002420137028403200220013602800320024180036a41004101106d200228028003220120022802880322006a21040240024020030d00200441003a00002002200041016a2200360288030c010b200441013a00002002200041016a360288032003200a20024180036a109501200228028803210020022802800321010b2000ad4220862001ad84210602402003450d002005450d00200310260b20024190046a240020060f0b1033000b200241d4006a410436020020024194036a41023602002002420237028403200241b882c700360280032002410436024c200241e087c7003602482002410036029402200241d4c0c700360290022002200241c8006a36029003200220024190026a36025020024180036a41c882c700103d000ba118020b7f017e230041d00b6b22022400200242808080808020370214200220013602242002200041d4c0c70020011b3602202002200241206a36021020024188086a200241106a10e3050240024020024194086a2802002203450d00200241f8076a41086a20024188086a41086a28020036020020022002290388083703f80720024198086a28020021042002419c086a280200210520024190076a200241a0086a41e40010cf061a2002418c096a280200210620024188086a4180016a280200210720024184096a280200210820024190066a20024190096a41800110cf061a200241086a200241106a108d01024002400240024020022802080d00200228021022012802042200200228020c2209490d002009417f4c0d020240024020090d004100210a4101210b0c010b2009102a220b450d042002280210220128020421002009210a0b0240024020002009490d00200b2001280200200910cf0621002001280204220c20094f0d012009200c41b8afc0001048000b200a450d01200b10260c010b2001200c20096b3602042001200128020020096a36020020000d010b02402005450d00200541246c21002003210103400240024020012d0000220c41044b0d00024002400240200c0e050400010204040b2001410c6a280200450d03200141086a28020010260c030b2001410c6a280200450d02200141086a28020010260c020b2001410c6a280200450d01200141086a28020010260c010b200141086a280200450d00200141046a28020010260b200141246a21012000415c6a22000d000b0b02402004450d00200441246c450d00200310260b02402006450d00200641246c21002008210103400240024020012d0000220c41044b0d00024002400240200c0e050400010204040b2001410c6a280200450d03200141086a28020010260c030b2001410c6a280200450d02200141086a28020010260c020b2001410c6a280200450d01200141086a28020010260c010b200141086a280200450d00200141046a28020010260b200141246a21012000415c6a22000d000b0b2007450d03200741246c450d0320081026410021030c040b20024180066a41086a200241f8076a41086a280200360200200220022903f8073703800620024198056a20024190076a41e40010cf061a20024198046a20024190066a41800110cf061a0c030b1034000b1033000b410021030b20024188046a41086a220120024180066a41086a280200360200200220022903800637038804200241a0036a20024198056a41e40010cf061a200241a0026a20024198046a41800110cf061a02402003450d0020024190026a41086a2001280200360200200220022903880437039002200241a8016a200241a0036a41e40010cf061a200241286a200241a0026a41800110cf061a024002402002280210280204450d0002402005450d00200541246c21002003210103400240024020012d0000220c41044b0d00024002400240200c0e050400010204040b2001410c6a280200450d03200141086a28020010260c030b2001410c6a280200450d02200141086a28020010260c020b2001410c6a280200450d01200141086a28020010260c010b200141086a280200450d00200141046a28020010260b200141246a21012000415c6a22000d000b0b02402004450d00200441246c450d00200310260b02402006450d00200641246c21002008210103400240024020012d0000220c41044b0d00024002400240200c0e050400010204040b2001410c6a280200450d03200141086a28020010260c030b2001410c6a280200450d02200141086a28020010260c020b2001410c6a280200450d01200141086a28020010260c010b200141086a280200450d00200141046a28020010260b200141246a21012000415c6a22000d000b0b02402007450d00200741246c450d00200810260b41002103200a450d01200b10260c010b20024190076a41086a20024190026a41086a28020036020020022002290390023703900720024190066a200241a8016a41e40010cf061a20024188086a200241286a41800110cf061a0b2003450d00200241f8076a41086a220120024190076a41086a220028020036020020022002290390073703f807200241286a20024190066a41e40010cf061a20024198046a20024188086a41800110cf061a200241a8016a41086a2001280200360200200220022903f8073703a801200241a0026a200241286a41e40010cf061a20024190066a20024198046a41800110cf061a2002200936029c052002200b3602980520024188086a20024198056a10de0502400240200228028c0822010d00410021010c010b200020024198086a28020036020020022002290390083703900720022802880821000b0240200a450d00200b10260b20024188086a41086a220c20024190076a41086a220b280200360200200220022903900737038808024002402001450d00200241a0036a41086a200c280200220c3602002002200229038808220d3703a003200241b0096a2001360200200241ac096a2000360200200241a8096a4102360200200241b4096a200d370200200241bc096a200c360200200241c0096a20022903a801370300200241c8096a200241a8016a41086a280200360200200241d4096a2005360200200241d0096a2004360200200241cc096a2003360200200241013602a009200242023703f008200241d8096a200241a0026a41e40010cf061a200241c40a6a2006360200200241c00a6a2007360200200241bc0a6a2008360200200241c80a6a20024190066a41800110cf061a200220024188086a3602900720024198056a20024190076a10af04200b20024198056a41086a28020036020020022002290398053703900720024190076a1096052101200241a0096a10980341002802c8c24721000240024020010d0020004103490d0141002802c4c247210141002802c0c247210041002802ccc247210c200241c8086a419801360200200241c0086a42e480808010370300200241bc086a4199f2c600360200200241b4086a4219370200200241b0086a4180f2c600360200200241a8086a4200370300200241a4086a41d4c0c70036020020024198086a420137030020024190086a4119360200200241f0f1c6003602940820024180f2c60036028c082002410336028808200041c8a1c000200c410246220c1b20024188086a200141b0a1c000200c1b280210110200410121010c030b2000450d002002411736029407200220024198056a3602900741002802c4c247210141002802c0c247210041002802ccc247210c200241c8086a419901360200200241c0086a42e480808010370300200241bc086a4199f2c600360200200241b4086a4219370200200241b0086a4180f2c600360200200241a8086a420137030020024198086a420137030020024190086a4119360200200241a4086a20024190076a360200200241f8f1c6003602940820024180f2c60036028c082002410136028808200041c8a1c000200c410246220c1b20024188086a200141b0a1c000200c1b2802101102000b410121010c010b02402005450d00200541246c21002003210103400240024020012d0000220c41044b0d00024002400240200c0e050400010204040b2001410c6a280200450d03200141086a28020010260c030b2001410c6a280200450d02200141086a28020010260c020b2001410c6a280200450d01200141086a28020010260c010b200141086a280200450d00200141046a28020010260b200141246a21012000415c6a22000d000b0b02402004450d00200441246c450d00200310260b02402006450d00200641246c21002008210103400240024020012d0000220c41044b0d00024002400240200c0e050400010204040b2001410c6a280200450d03200141086a28020010260c030b2001410c6a280200450d02200141086a28020010260c020b2001410c6a280200450d01200141086a28020010260c010b200141086a280200450d00200141046a28020010260b200141246a21012000415c6a22000d000b0b410021012007450d00200741246c450d00200810260b200110ff04210d200241d00b6a2400200d0f0b200241ac026a4104360200200241ac046a41023602002002420237029c04200241b882c70036029804200241043602a402200241a887c7003602a0022002410036022c200241d4c0c7003602282002200241a0026a3602a8042002200241286a3602a80220024198046a41c882c700103d000ba90b020a7f037e230041a0026b220224000240024002400240024002400240024020010d00200241206a22014200370300200241186a22034200370300200241086a41086a420037030020024200370308200241086a41d98cc700411210fb01200241b8016a41bcd2c500410410fb012001200241b8016a41086a290000370300200320022900b8013703002002412036022c2002200241086a360228200241306a200241086a41201082020240200228023022040d00410021050c060b200228023421062002200241306a41086a280200360244200220043602402002200241c0006a108f0120022802000d032002280204220720022802444105762201200120074b1b22014105742203417f4c0d060240024020010d00410121050c010b200310242205450d080b41002108200241003602502002200136024c200220053602480240024002402007450d0041002109034041002103200241003a00d8012002280244417f6a2101200941016a210903402001417f460d03200241b8016a20036a2002280240220a2d00003a00002002200a41016a3602402002200341016a220a3a00d801200220013602442001417f6a2101200a2103200a4120470d000b20024180026a41186a2201200241b8016a41186a29030037030020024180026a41106a2203200241b8016a41106a29030037030020024180026a41086a220b200241b8016a41086a290300370300200220022903b80137038002200a41ff01714120490d03200241f8006a41086a200b290300220c370300200241f8006a41106a2003290300220d370300200241f8006a41186a2001290300220e370300200241d8006a41186a2203200e370300200241d8006a41106a220a200d370300200241d8006a41086a220b200c3703002002200229038002220c370398012002200c3703782002200c37035802402008200228024c470d00200241c8006a2008410110930120022802482105200228025021080b200520084105746a22012002290358370000200141186a2003290300370000200141106a200a290300370000200141086a200b2903003700002002200841016a220836025020092007470d000b0b200229024c210c2005450d050c060b200341ff0171450d00200241003a00d8010b200241f8006a41186a20024198016a41186a290300370300200228024c41ffffff3f710d010c020b2002418c026a4104360200200241cc016a4102360200200242023702bc01200241b882c7003602b8012002410436028402200241b888c70036028002200241003602e401200241d4c0c7003602e001200220024180026a3602c8012002200241e0016a36028802200241b8016a41c882c700103d000b200510260b0b41002105200241003602880220024201370380022002410e3602e4012002200241286a3602e001200220024180026a36029801200241cc016a4101360200200242013702bc012002418c8dc6003602b8012002200241e0016a3602c80120024198016a41c4e1c000200241b8016a10351a200228028002200228028802108402200228028402450d0020022802800210260b2006450d00200410260b200c420020051b220c422088a722014105744104722203417f4c0d0020031024220a450d012005410120051b2106200241003602c001200220033602bc012002200a3602b801200241b8016a200110a1010240024020010d0020022802c001210320022802b80121040c010b2001410574210a20022802c0012103200621010340200241b8016a20034120106d20022802b801220420022802c00122056a22032001290000370000200341086a200141086a290000370000200341106a200141106a290000370000200341186a200141186a2900003700002002200541206a22033602c001200141206a2101200a41606a220a0d000b0b2003ad4220862004ad84210d0240200c42ffffff3f83500d00200610260b200241a0026a2400200d0f0b1034000b1033000bd81203047f017e0d7f230041f0026b22022400200242808080808020370214200220013602b4022002200041d4c0c70020011b22003602b0022002200241b0026a36021002400240024002402001450d0020022001417f6a22033602b4022002200041016a3602b00220002d0000220041014b0d004100210102400240024020000e020100010b200241086a200241106a108d0120022802080d0220022802b4022203200228020c2200490d022000417f4c0d040240024020000d0041002104410121010c010b2000102a2201450d0620022802b4022103200021040b0240024020032000490d00200120022802b002200010cf06210320022802b402220520004f0d012000200541b8afc0001048000b20040d020c030b2002200520006b3602b402200220022802b00220006a3602b0022003450d022000ad4220862004ad842106200228021028020421030b2003450d022001450d012006a7450d010b200110260b200241bc026a4104360200200241246a410236020020024202370214200241b882c700360210200241043602b402200241cc88c7003602b0022002410036029402200241d4c0c700360290022002200241b0026a360220200220024190026a3602b802200241106a41c882c700103d000b0240024020010d00200241003602b0020c010b2006422088a72200417f4c0d010240024020000d0041012104410021050c010b200010242204450d03200021050b200241b8026a22034100360200200220043602b002200220053602b402200241b0026a4100200010c90120022802b002200328020022046a2001200010cf061a2003200420006a3602000b200241106a41086a200241b0026a41086a280200360200200220022903b002370310200241b0016a41e7e485f306200241106a1097060240024020010d00200241003602b0020c010b2006422088a72200417f4c0d010240024020000d0041012104410021050c010b200010242204450d03200021050b200241b8026a22034100360200200220043602b002200220053602b402200241b0026a4100200010c90120022802b002200328020022046a2001200010cf061a2003200420006a3602000b200241106a41086a200241b0026a41086a280200360200200220022903b002370310200241d0016a41e2c289ab06200241106a1098060240024020010d00200241003602b0020c010b2006422088a72200417f4c0d010240024020000d0041012104410021050c010b200010242204450d03200021050b200241b8026a22034100360200200220043602b002200220053602b402200241b0026a4100200010c90120022802b002200328020022046a2001200010cf061a2003200420006a3602000b200241106a41086a200241b0026a41086a280200360200200220022903b002370310200241f0016a41e9dabdf306200241106a1098060240024020010d00200241003602b0020c010b2006422088a72200417f4c0d010240024020000d0041012104410021050c010b200010242204450d03200021050b200241b8026a22034100360200200220043602b002200220053602b402200241b0026a4100200010c90120022802b002200328020022046a2001200010cf061a2003200420006a3602000b200241106a41086a200241b0026a41086a280200360200200220022903b00237031020024190026a41f0c2c98b06200241106a1098060240024020010d00200241003602d0020c010b2006422088a72200417f4c0d010240024020000d0041012104410021050c010b200010242204450d03200021050b200241d8026a22034100360200200220043602d002200220053602d402200241d0026a4100200010c90120022802d002200328020022046a2001200010cf061a2003200420006a3602000b200241e0026a41086a200241d0026a41086a280200360200200220022903d0023703e002200241b0026a41e1ea91cb06200241e0026a109806200241106a41086a2203200241b0016a41086a290300370300200241106a41106a2204200241b0016a41106a290300370300200241106a41186a2205200241b0016a41186a290300370300200241386a2207200241d0016a41086a290300370300200241c0006a2208200241d0016a41106a290300370300200241c8006a2209200241d0016a41186a290300370300200241e8006a220a200241f0016a41186a290300370300200241e0006a220b200241f0016a41106a290300370300200241d8006a220c200241f0016a41086a290300370300200220022903b001370310200220022903d001370330200220022903f00137035020024188016a220d20024190026a41186a29030037030020024180016a220e20024190026a41106a290300370300200241f8006a220f20024190026a41086a29030037030020024198016a2210200241b0026a41086a290300370300200241a0016a2211200241b0026a41106a290300370300200241a8016a2212200241b0026a41186a2903003703002002200229039002370370200220022903b00237039001200241003602b802200242013703b002200241b0026a41004120106d20022802b00220022802b80222136a22002002290310370000200041086a2003290300370000200041106a2004290300370000200041186a20052903003700002002201341206a22003602b802200241b0026a20004120106d20022802b00220022802b80222036a22002002290330370000200041086a2007290300370000200041106a2008290300370000200041186a20092903003700002002200341206a22003602b802200241b0026a20004120106d20022802b00220022802b80222036a22002002290350370000200041086a200c290300370000200041106a200b290300370000200041186a200a2903003700002002200341206a22003602b802200241b0026a20004120106d20022802b00220022802b80222036a22002002290370370000200041086a200f290300370000200041106a200e290300370000200041186a200d2903003700002002200341206a22003602b802200241b0026a20004120106d20022802b002220420022802b80222036a2200200229039001370000200041086a2010290300370000200041106a2011290300370000200041186a20122903003700002002200341206a3602b80202402001450d002006a7450d00200110260b200241106a200241b0026a10b70120023502184220862002350210842106024020022802b402450d00200410260b200241f0026a240020060f0b1034000b1033000bff0101067f230041c0006b2203240020032001360204200341086a200210c406200341206a41186a2204200341046a200341086a41106a200341086a41086a2205200328020822064101461b2903001002220141186a290000370300200341206a41106a2207200141106a290000370300200341206a41086a2208200141086a2900003703002003200129000037032020011026200041186a2004290300370000200041106a2007290300370000200041086a20082903003700002000200329032037000002402006450d002005280200450d00200328020c10260b024020022802002200450d00200241046a280200450d00200010260b200341c0006a24000bff0101067f230041c0006b2203240020032001360204200341086a200210c406200341206a41186a2204200341046a200341086a41106a200341086a41086a2205200328020822064101461b2903001006220141186a290000370300200341206a41106a2207200141106a290000370300200341206a41086a2208200141086a2900003703002003200129000037032020011026200041186a2004290300370000200041106a2007290300370000200041086a20082903003700002000200329032037000002402006450d002005280200450d00200328020c10260b024020022802002200450d00200241046a280200450d00200010260b200341c0006a24000b820d02047f017e23004180036b220224002002428080808080203702c401200220013602242002200041d4c0c70020011b3602202002200241206a3602c001200241086a200241c0016a108d01024002400240024020022802080d0020022802242200200228020c2201490d002001417f4c0d020240024020010d0041002103410121040c010b2001102a2204450d0420022802242100200121030b02400240024020002001490d0020042002280220200110cf0621002002280224220520014f0d012001200541b8afc0001048000b20030d010c020b2002200520016b3602242002200228022020016a3602202000450d012001ad4220862003ad84210620022802c001280204450d022006a7450d010b200410260b2002412c6a4104360200200241d4016a4102360200200242023702c401200241b882c7003602c00120024104360224200241ec88c700360220200241003602f402200241d4c0c7003602f0022002200241206a3602d0012002200241f0026a360228200241c0016a41c882c700103d000b200220064220883e02ec02200220003602e802200241c0016a200241e8026a10b0030240024020022d00c0014101470d00200241003602100c010b200241206a200241c0016a41017241a00110cf061a200241c0016a200241206a41a00110cf061a200241186a410036020020024204370310412010242201450d02200242203702f402200220013602f002200241f0026a200241c0016a109a060240200228021822012002280214470d00200241106a10be01200228021821010b200228021020014104746a220120022903f002370200200141e7e485f30636020c200141086a200241f0026a41086a2802003602002002200228021841016a360218412010242201450d02200242203702f402200220013602f002200241f0026a200241c0016a41206a109a060240200228021822012002280214470d00200241106a10be01200228021821010b200228021020014104746a220120022903f002370200200141e2c289ab0636020c200141086a200241f0026a41086a2802003602002002200228021841016a360218412010242201450d02200242203702f402200220013602f002200241f0026a20024180026a109a060240200228021822012002280214470d00200241106a10be01200228021821010b200228021020014104746a220120022903f002370200200141e9dabdf30636020c200141086a200241f0026a41086a2802003602002002200228021841016a360218412010242201450d02200242203702f402200220013602f002200241f0026a200241a0026a109a060240200228021822012002280214470d00200241106a10be01200228021821010b200228021020014104746a220120022903f002370200200141f0c2c98b0636020c200141086a200241f0026a41086a2802003602002002200228021841016a360218412010242201450d02200242203702f402200220013602f002200241f0026a200241c0026a109a060240200228021822012002280214470d00200241106a10be01200228021821010b200228021020014104746a220120022903f002370200200141e1ea91cb0636020c200141086a200241f0026a41086a2802003602002002200228021841016a3602180b02402006a7450d00200010260b0240024020022802100d00410121010c010b200241186a2802004104744105722201417f4c0d010b200110242200450d01200241003602c801200220013602c401200220003602c00120022802102101200241c0016a41004101106d20022802c001220320022802c80122006a21040240024020010d00200441003a00002002200041016a22003602c8010c010b200441013a00002002200041016a3602c80120022802102101200241c0016a200241106a41086a280200220010a101024020000d0020022802c801210020022802c00121030c010b200120004104746a210403402001280200200141086a280200200241c0016a109501200241c0016a20022802c8014104106d20022802c001220320022802c80122006a2001410c6a2800003600002002200041046a22003602c801200141106a22012004470d000b0b2000ad4220862003ad842106024020022802102201450d000240200241186a2802002200450d002000410474210003400240200141046a280200450d00200128020010260b200141106a2101200041706a22000d000b0b200228021441ffffffff0071450d00200228021010260b20024180036a240020060f0b1034000b1033000b840201037f02400240200041046a2802002202200041086a28020022036b4120490d00200028020021040c010b0240024002400240200341206a22042003490d00200241017422032004200320044b1b22034108200341084b1b22034100480d002000280200410020021b2204450d0120022003460d032002450d0120042002200310282204450d020c030b102e000b2003102422040d010b102c000b20002004360200200041046a2003360200200041086a28020021030b200420036a22042001290000370000200441186a200141186a290000370000200441106a200141106a290000370000200441086a200141086a290000370000200041086a200341206a3602000b880903047f047e027f230041f0016b2202240041002103200241003a008001200041d4c0c70020011b2100024002400240034020012003460d01200241e0006a20036a200020036a2d00003a00002002200341016a22033a00800120034120470d000b200241c0006a41186a2200200241e0006a41186a290300370300200241c0006a41106a2204200241e0006a41106a290300370300200241c0006a41086a2205200241e0006a41086a29030037030020022002290360370340200341ff017141204f0d010c020b200341ff0171450d01200241003a0080010c010b200241086a2005290300370300200241106a2004290300370300200241186a20002903003703002002200229034037030020012003470d00200241c0006a41186a200241186a2903002206370300200241c0006a41106a200241106a22002903002207370300200241c0006a41086a200241086a2903002208370300200220022903002209370340200241e0006a41186a22042006370300200241e0006a41106a22052007370300200241e0006a41086a220a200837030020022009370360200241b0016a41808cc700410610fb01200241c0016a41e292c400410710fb01024002400240412010242203450d00200242203702e401200220033602e001200241e0016a41004120106d20022802e001220320022802e801220b6a22012002290360370000200141086a200a290300370000200141106a2005290300370000200141186a20042903003700002002200b41206a22013602e80120022003200110bc022002412c6a200320016a360200200220033602282002200036022420022002360220200241d0016a200241206a1073024020022802e401450d00200310260b20022802d801220341206a2201417f4c0d010240024020010d0041012100410021010c010b200110242200450d010b200241003602282002200036022020022001360224200241206a4100411010c9012002280220200228022822016a220020022900b001370000200041086a200241b0016a41086a2900003700002002200141106a2201360228200241206a2001411010c9012002280220200228022822016a220020022900c001370000200041086a200241c0016a41086a2900003700002002200141106a220036022820022802d0012101200241206a2000200310c90120022802202200200228022822046a2001200310cf061a2002200420036a2203360228024020022802d401450d00200110260b200241e0006a2000200310d90320022903602106200241a8016a280200210302402002280224450d00200010260b4104102422010d020b1033000b1034000b2002420437026420022001360260200241e0006a41004104106d20022802602201200228026822006a2003410020064201511b360000200241f0016a2400200041046aad4220862001ad840f0b200241cc006a4104360200200241f4006a410236020020024202370264200241b882c700360260200241043602442002418889c70036024020024100360224200241d4c0c7003602202002200241c0006a3602702002200241206a360248200241e0006a41c882c700103d000bac0604017f017e027f027e23004190126b2202240020024280808080802037021c2002200136022c2002200041d4c0c70020011b3602282002200241286a360218200241c80e6a200241186a10d301420321030240024020022903b00f4203510d00200241800b6a200241c80e6a41c80310cf061a02402002280218220028020422044104490d0020002802002205280000210120002004417c6a3602042000200541046a360200200241980a6a200241800b6a41e80010cf061a20022903e80b2103200241c0076a200241f00b6a41d80210cf061a0c020b200241980c6a109803420321030b0b200241d8066a200241980a6a41e80010cf061a20024180046a200241c0076a41d80210cf061a0240024020034203510d00200241306a200241d8066a41e80010cf061a2002200337039801200241a0016a20024180046a41d80210cf062100200220013602f803024002402002280218280204450d00200241c8016a109803420321030c010b200241c0076a200241306a41e80010cf061a200241c80e6a200041d80210cf061a0b20034203520d010b2002418c0b6a4104360200200241c4006a410236020020024202370234200241b882c700360230200241043602840b200241a089c7003602800b2002410036028404200241d4c0c700360280042002200241800b6a360240200220024180046a3602880b200241306a41c882c700103d000b20024180046a200241c0076a41e80010cf061a200241800b6a200241c80e6a41d80210cf061a200241306a20024180046a41e80010cf061a2002200337039801200241a0016a200241800b6a41d80210cf061a200241c80e6a200241c8016a220010a103200241086a200120022903c80e22034200420020022d00d10e41004710ec03200241086a41086a29030021062002290308210720022d00d00e210120001098032002410036023820024201370330200241306a41004108106d2002280230200228023822006a20033700002002200041086a360238200241306a2001109701200241306a20022802384110106d20022802302201200228023822006a220420063700082004200737000020024190126a2400200041106aad4220862001ad840b0a002001280200410e470b0a002001280200410e470b0a002001280200410e470b040041010b040041010b970201017f410121020240024002400240024002400240200041ff01710e0406010200060b41002102200128020041716a220041014b0d0520000e020203020b410021022001280200220041164b0d0402400240024020000e170606060007060606060606060606060606010206070606060b20012d0004220141054b0d064101200174412a710d050c060b20012d00042201417b6a4105490d0420014101460d040c050b200141086a2d0000417f6a41014d0d030c040b41002102200128020041716a220041054b0d03024020000e06030404040400030b200141086a2d00004101470d032001410c6a2802002802004104460f0b20012f01044101460d010c020b200141086a2d0000410a470d010b410121020b20020b130020004105360204200041e0d3c4003602000b130020004103360204200041ccefc1003602000b130020004108360204200041ece2c3003602000b130020004101360204200041d0a7c0003602000b130020004101360204200041c8aac0003602000b130020004103360204200041eca4c0003602000b130020004103360204200041b4fbc5003602000b130020004102360204200041e4b0c0003602000b130020004102360204200041ecacc0003602000b13002000410a3602042000419cb7c1003602000b130020004106360204200041c08dc3003602000b130020004102360204200041b0bbc3003602000b130020004103360204200041f882c4003602000b130020004103360204200041a8c4c5003602000b130020004102360204200041b0ddc6003602000b13002000410436020420004194a1c2003602000b6c01017f200028020022012001280200417f6a3602000240200028020022012802000d002001280208200128020c2802001103000240200128020c280204450d00200128020810260b200028020022012001280204417f6a360204200028020022002802040d00200010260b0bcd0101027f0240200028020022022802082001200228020c28020c110100450d00024020012802004115470d0020012d0004417e6a220241044b0d00024002400240024020020e050001020403000b20002d00042202450d03200220012d0025220341ff0171460d0320024101470d04200341ff0171450d040c030b20002d00042202450d02200220012d0025220341ff0171460d0220024101470d03200341ff0171450d030c020b20002d00040d020c010b20002d00040d010b20002d0004200110a206450d0041010f0b41000bb60201037f20002d0004210202400240200028020022002802082001200028020c28020c110100450d00024020012802004115470d0020012d0004417e6a220341044b0d00024002400240024020030e050001020403000b200241ff01712203450d0320012d0025220441ff01712003460d03200241ff01714101470d04200441ff0171450d040c030b200241ff01712203450d0220012d0025220441ff01712003460d02200241ff01714101470d03200441ff0171450d030c020b200241ff01710d020c010b200241ff01710d010b410121032002200110a2060d010b410021030b20002000280200417f6a2201360200024020010d002000280208200028020c2802001103000240200028020c280204450d00200028020810260b20002000280204417f6a220136020420010d00200010260b20030bcd0101017f024020002d000022014107460d000240200141054b0d00024002400240024020010e06050005010203050b200041146a2200280200109803200028020010260f0b0240200041086a280200450d00200041046a28020010260b200041206a2200280200109803200028020010260f0b200041086a280200450d02200041046a28020010260f0b200041146a2200280200109803200028020010260f0b0240200041086a280200450d00200041046a28020010260b200041206a2200280200109803200028020010260b0bcd0101017f024020002d000022014105460d000240200141034b0d0002400240024020010e0404000102040b0240200041086a28020041ffffff3f71450d00200041046a28020010260b200041106a2200280200109803200028020010260f0b0240200041086a28020041ffffff3f71450d00200041046a28020010260b200041206a280200450d022000411c6a28020010260f0b200041286a28020041ffffff3f71450d01200041246a28020010260f0b200041286a28020041ffffff3f71450d00200041246a28020010260b0bcf0201077f230041106b220124000240024002400240200041086a2802002202450d0020002802002203200241027422046a210541002106200321070240034020072802000d01200741046a2107200641016a21062004417c6a22040d000b2002417f6a21060b2006450d0020022006490d01200220066b220741ffffffff03712007470d0220074102742207417f4c0d024104210402402007450d00200710242204450d040b200141003602082001200436020020012007410276360204200141002005200320064102746a22076b2206410276220410e7012001280200200128020822024102746a2007200610cf061a2001200220046a3602080240200041046a28020041ffffffff0371450d00200028020010260b20002001290300370200200041086a200141086a2802003602000b200141106a24000f0b2006200241c8a7c7001048000b1034000b1033000be503030b7f017e017f02400240200241086a2802002203200141086a28020022046a22054101200541014b1b220641ffffffff03712006470d0020064102742205417f4c0d0002402005102a2207450d0020002007360200200041086a2006360200200020054102763602042004450d022006417f6a2108200520076a417c6a2109200341027420022802006a417c6a210a2001280200210b4100210c024003400240024002400240024002402004200c417f736a220020044f0d00200b20004102746a220d280200450d05024020030d00410021050c050b4200210e41002100200a21022009210503402003200320006a220f417f6a4d0d022006200820006a220f4d0d0320052002350200200d3502007e200e7c20053502007c220e3e02002002417c6a21022005417c6a2105200e422088210e20032000417f6a22006a450d040c000b0b2000200441b0a6c7001032000b200f417f6a200341b0a6c7001032000b200f200641b0a6c7001032000b200ea721050b2006200c20036a417f736a220020064f0d02200720004102746a20053602000b2009417c6a21092008417f6a2108200c41016a220c2004470d000c040b0b2000200641d8a7c7001032000b1033000b1034000b0240200141046a28020041ffffffff0371450d00200128020010260b0b9b0101037f024002402001280208220241ffffffff03712002470d0020024102742203417f4c0d00200128020021040240024020030d00410421010c010b200310242201450d020b20002001360200200041086a220141003602002000200341027636020420004100200210e7012000280200200128020022004102746a2004200241027410cf061a2001200020026a3602000f0b1034000b1033000be30303047f017e057f230041106b22012400024002400240024002400240024020002802002202280200220341016a41004c0d002002200336020020002802042203280200220441016a41004c0d0120022903082105200320043602002000280208220441086a2802002206200028020c220728020022086b41016a220920064f0d024101200028021428020020086a6b22062000280210220841086a28020022006a220a20064f0d0302400240200542ffffffff0f560d00410021002005200428020020094102746a3502007e20032903084220862008280200200a4102746a35020084580d010b20022802000d052002410036020020022002290308427f7c370308200441086a2802002200200020072802006b22024d0d0620032802000d07200428020020024102746a3502002105200341003602002003200520032903087c370308410121000b200141106a240020000f0b41aca8c7004118200141086a41c4a8c70041d4a8c7001036000b41aca8c7004118200141086a41c4a8c70041d4a8c7001036000b2009200641b0a6c7001032000b200a200041b0a6c7001032000b41e1a9c7004110200141086a41f4a9c7004184aac7001036000b2002200041b0a6c7001032000b41e1a9c7004110200141086a41f4a9c7004184aac7001036000bc103030b7f017e027f02400240024002400240200141086a2802002203200241086a2802002204200320044b1b220541016a22064101200641014b1b220741ffffffff03712007470d0020074102742208417f4c0d002008102a2209450d0120002009360200200041086a200736020020002008410276360204024020050d00410021000c050b2007417f6a2106200820096a417c6a21082004417f6a220a20044b210b2002280200210c2001280200210d410021024200210e03404100210002402003417f6a220f20034b0d00410021002003200f20026b22104d0d00410021002010200f4b0d00200d20104102746a28020021000b4100210f0240200b0d002004200a20026b22104d0d002010200a4b0d00200c20104102746a280200210f0b200720064d0d032008200e2000ad7c200fad7c220e3e02002008417c6a21082006417f6a2106200e422088210e2005200241016a2202460d040c000b0b1034000b1033000b2006200741d8a7c7001032000b200ea721000b024020072005417f736a220620074f0d00200920064102746a20003602000240200141046a28020041ffffffff0371450d00200128020010260b0f0b2006200741d8a7c7001032000bba0203027f027e037f230041206b22022400200241106a41086a2203200141086a28020036020020022001290200370310200241106a10b806024002400240200328020022014105744180014b0d00024020010d0042002104420021050c020b2002280210220341786a21062003200141027422016a417c6a280200210741002103200241086a21084200210442002105034020022007ad4200200341e0007110cd06200829030020057c2002290300220520047c2204200554ad7c210520014104460d02200341206a2103200620016a28020021072001417c6a21010c000b0b200041aaa7c70036020420004101360200200041086a411d3602000c010b20004100360200200041106a2005370300200041086a20043703000b0240200228021441ffffffff0371450d00200228021010260b200241206a24000b1000200028020020002802042001105f0b1c00200128021841a5b2c700410f2001411c6a28020028020c1100000bfd0101057f230041106b22022400200241086a2001108f01024002402002280208450d00200041003602000c010b024020012802042203200228020c2204490d00024002402004417f4c0d000240024020040d0041002105410121060c010b2004102a2206450d0220012802042103200421050b0240024020032004490d0020062001280200200410cf0621032001280204220620044f0d012004200641b8afc0001048000b2005450d03200610260c030b2001200620046b3602042001200128020020046a3602002003450d0220002004ad4220862005ad84370204200020033602000c030b1034000b1033000b200041003602000b200241106a24000bb10301047f230041c0006b2202240020002802002103410121000240200128021841f29cc000410c2001411c6a28020028020c1100000d0002400240200328020822000d0020032802002200200328020428020c11070042f4f99ee6eea3aaf9fe00520d012002200036020c2002411836021420022002410c6a36021020012802182104200128021c2105410121002002413c6a41013602002002420237022c200241809dc0003602282002200241106a36023820042005200241286a10350d020c010b2002200036020c2002410836021420022002410c6a36021020012802182104200128021c2105410121002002413c6a41013602002002420237022c200241809dc0003602282002200241106a36023820042005200241286a10350d010b200328020c2100200241106a41146a4101360200200241106a410c6a410136020020022000410c6a3602202002200041086a360218200241043602142002200036021020012802182100200128021c2101200241286a41146a41033602002002420337022c200241909dc0003602282002200241106a36023820002001200241286a103521000b200241c0006a240020000b0600200010000b0600200010010b9a0201057f230041106b22022400024002400240200128020022030d00410121040c010b0240200141086a28020041056a2204417f4c0d0020040d0141002104410121050c020b1034000b2004102422050d001033000b200241003602082002200536020020022004360204200241004101106d20022802002205200228020822046a21060240024020030d00200641003a0000200441016a21040c010b200641013a00002002200441016a360208200141086a28020022042002106c200220022802082004106d20022802002205200228020822016a2003200410cf061a200120046a21040b20002002290300370204200041013602002000410c6a2004360200200041106a2004ad4220862005ad84370300200241106a24000bda0101057f230041206b22022400024002402001422088a722030d004101210441002103410021050c010b2001a72104410121050b2002200336020c200220043602080240024002402003450d0020042d0000210620022003417f6a36020c2002200441016a360208200641014b0d00024020060e020200020b200241106a200241086a10c00620022802102203450d00200229021421010c020b4196aec700412e200241106a41c4aec70041d4aec7001036000b410021030b200020013702042000200336020002402005450d00200410260b200241206a24000b1c00200128021841a5b2c700410f2001411c6a28020028020c1100000be40103027f017e017f02400240200041046a2802002202200028020822036b20014f0d0002400240200320016a22012003490d00200241017422032001200320014b1b22014104200141044b1bad420c7e2204422088a722030d002004a722014100480d0020034541027421050240024002402000280200410020021b22030d0020010d01200521030c040b2002410c6c22022001460d03024020020d0020010d01410421030c040b20032002200110282203450d010c030b2001102422030d020b20050d030b102e000b20002003360200200041046a2001410c6e3602000b0f0b102c000b1c00200128021841a5b2c700410f2001411c6a28020028020c1100000bca0201047f230041106b22022400024002400240024020002d002c410171450d0002400240200028020041244b0d00200041056a2103200021040c010b2000410c6a2104200041086a28020021030b2003450d0220042802002204450d02200420036a417f6a220320032d00002001723a00000c010b41242104024002402000280200220541244b0d00200021030c010b2000410c6a2103200521040b0240200328020022032004470d0020022000410110cd0420022802004101470d00200241086a2802000d0341c8bcc700411141dcbcc700102f000b2001410474210102400240200028020041244b0d00200041056a2104200021050c010b2000410c6a2105200041086a28020021040b2005200341016a360200200420036a20013a00000b2000200028022c41016a36022c200241106a24000f0b4190b8c700413a41ccb8c7001053000b102c000bcf0101027f230041306b22032400024002400240024020024125490d002002417f4c0d02200210242204450d0320042001200210cf0621012000410c6a2002360200200041086a2001360200410121010c010b2003410c6a2001200210cf061a200041256a2003412c6a2800003600002000411d6a200341246a290000370000200041156a2003411c6a2900003700002000410d6a200341146a290000370000200041056a200329000c370000410021010b200020013a000420002002360200200341306a24000f0b1034000b1033000b4c01017f230041206b22052400200542003703182005420037031020052001200220032004200541106a10ce06200529031021012000200529031837030820002001370300200541206a24000b7501027e200020034220882205200142208822067e200320027e7c200420017e7c200342ffffffff0f832203200142ffffffff0f8322017e2204422088200320067e7c22034220887c200342ffffffff0f83200520017e7c22034220887c37030820002003422086200442ffffffff0f83843703000b5701017e02400240200341c000710d002003450d012001410020036b413f71ad8820022003413f71ad220486842102200120048621010c010b20012003413f71ad862102420021010b20002001370300200020023703080bdf0502037f067e230041306b2206240002400240024002400240024002400240024002402002500d002003500d012004500d02200479a7200279a76b2207413f4b0d0341ff0020076b2108200741016a21070c080b02402004500d0020050d040c060b024002402005450d0020034200510d0620054200370308200520012003823703000c010b20034200510d050b200120038021010c060b2004500d030240024002402001500d0020047b4201510d01200479a7200279a76b2207413e4b0d0241ff0020076b2108200741016a21070c090b02402005450d0020054200370300200520022004823703080b200220048021010c070b02402005450d002005200137030020052004427f7c2002833703080b200220047a8821010c060b2005450d040c020b024020037b4201510d0041bf7f200379a7200279a76b22076b2108200741c1006a21070c060b02402005450d002005420037030820052003427f7c2001833703000b20034201510d06200641206a2001200220037aa710d406200641286a2903002102200629032021010c060b2005450d020b2005200137030020052002370308420021010c020b00000b420021010b420021020c010b200620012002200841ff007110cd06200641106a20012002200741ff007110d406200641086a2903002102200641106a41086a2903002109200629030021012006290310210a0240024020070d004200210b4200210c0c010b4200210c4200210d03402009420186200a423f8884220b200b427f8520047c2002423f88200a42018684220a427f85220b20037c200b54ad7c423f87220b2004837d200a200b200383220e54ad7d2109200a200e7d210a20024201862001423f888442008421022001420186200d842101200b420183220b210d2007417f6a22070d000b0b02402005450d002005200a370300200520093703080b200c20024201862001423f8884842102200b20014201868421010b2000200137030020002002370308200641306a24000b3601017f02402002450d00200021030340200320012d00003a0000200141016a2101200341016a21032002417f6a22020d000b0b20000b7101017f0240024020012000490d002002450d01200021030340200320012d00003a0000200141016a2101200341016a21032002417f6a22020d000c020b0b2002450d002001417f6a21012000417f6a21030340200320026a200120026a2d00003a00002002417f6a22020d000b0b20000b2c01017f02402002450d00200021030340200320013a0000200341016a21032002417f6a22020d000b0b20000b4a01037f4100210302402002450d000240034020002d0000220420012d00002205470d01200041016a2100200141016a21012002417f6a2202450d020c000b0b200420056b21030b20030b3e01017f230041106b2205240020052001200220032004410010ce06200529030021012000200541086a29030037030820002001370300200541106a24000b5701017e02400240200341c000710d002003450d0120012003413f71ad2204882002410020036b413f71ad86842101200220048821020c010b20022003413f71ad882101420021020b20002001370300200020023703080b0beac2070300418080c0000bbbc20710001000170000000c020000050000007372632f6c6962616c6c6f632f7261775f7665632e727300b70010004600000068010000130000001900000004000000040000001a0000001b0000001c0000006120666f726d617474696e6720747261697420696d706c656d656e746174696f6e2072657475726e656420616e206572726f72001900000000000000010000001d000000a4001000130000004a0200001c0000007372632f6c6962616c6c6f632f666d742e72732f72757374632f313639353762643464336135333737323633663736656437346335373261616438653462376535392f7372632f6c6962636f72652f666d742f6d6f642e72737372632f6c6962616c6c6f632f7665632e7273292073686f756c64206265203c206c656e2028697320000050011000140000006401100017000000580f100001000000fd00100013000000f60300000d000000696e73657274696f6e20696e6465782028697320292073686f756c64206265203c3d206c656e202869732000a4011000120000001001100016000000580f100001000000fd00100013000000260400000d00000072656d6f76616c20696e64657820286973200000e001100016000000f601100023000000580f100001000000fd00100013000000320500000d000000737461727420647261696e20696e6465782028697320292073686f756c64206265203c3d20656e6420647261696e20696e646578202869732000000044021000140000006401100017000000580f100001000000fd00100013000000380500000d000000656e6420647261696e20696e6465782028697320780210002000000098021000120000001900000000000000010000001e000000696e646578206f7574206f6620626f756e64733a20746865206c656e20697320206275742074686520696e646578206973203030303130323033303430353036303730383039313031313132313331343135313631373138313932303231323232333234323532363237323832393330333133323333333433353336333733383339343034313432343334343435343634373438343935303531353235333534353535363537353835393630363136323633363436353636363736383639373037313732373337343735373637373738373938303831383238333834383538363837383838393930393139323933393439353936393739383939000084031000060000008a03100022000000696e64657820206f7574206f662072616e676520666f7220736c696365206f66206c656e67746820bc03100016000000d20310000d000000736c69636520696e64657820737461727473206174202062757420656e64732061742000430e100016000000040800002f0000005b2e2e2e5d000000580410000b0000002d0e10001600000097041000010000000b0e10000e000000190e1000040000001d0e1000100000009704100001000000580410000b00000063041000260000008904100008000000910410000600000097041000010000006279746520696e64657820206973206e6f742061206368617220626f756e646172793b20697420697320696e7369646520202862797465732029206f66206060d604100002000000c0041000160000005d04000024000000c00410001600000053040000110000007372632f6c6962636f72652f666d742f6d6f642e72732e2eea04100016000000540000001400000030787372632f6c6962636f72652f666d742f6e756d2e727300010305050606030706080809110a1c0b190c140d100e0d0f0410031212130916011705180219031a071c021d011f1620032b032c022d0b2e01300331023201a702a902aa04ab08fa02fb05fd04fe03ff09ad78798b8da23057588b8c901c1ddd0e0f4b4cfbfc2e2f3f5c5d5fb5e2848d8e9192a9b1babbc5c6c9cadee4e5ff00041112293134373a3b3d494a5d848e92a9b1b4babbc6cacecfe4e500040d0e11122931343a3b4546494a5e646584919b9dc9cecf0d112945495764658d91a9b4babbc5c9dfe4e5f00d11454964658084b2bcbebfd5d7f0f183858ba4a6bebfc5c7cecfdadb4898bdcdc6cecf494e4f57595e5f898e8fb1b6b7bfc1c6c7d71116175b5cf6f7feff800d6d71dedf0e0f1f6e6f1c1d5f7d7eaeafbbbcfa16171e1f46474e4f585a5c5e7e7fb5c5d4d5dcf0f1f572738f7475962f5f262e2fa7afb7bfc7cfd7df9a409798308f1fc0c1ceff4e4f5a5b07080f10272feeef6e6f373d3f42459091feff536775c8c9d0d1d8d9e7feff00205f2282df048244081b04061181ac0e80ab35280b80e003190801042f043404070301070607110a500f1207550703041c0a090308030703020303030c0405030b06010e15053a0311070605100757070207150d500443032d03010411060f0c3a041d255f206d046a2580c80582b0031a0682fd035907150b1709140c140c6a060a061a0659072b05460a2c040c040103310b2c041a060b0380ac060a06213f4c042d0374083c030f033c0738082b0582ff1118082f112d032010210f808c048297190b158894052f053b07020e180980b32d740c80d61a0c0580ff0580df0cee0d03848d033709815c1480b80880cb2a38030a06380846080c06740b1e035a0459098083181c0a16094c04808a06aba40c170431a10481da26070c050580a511816d1078282a064c04808d0480be031b030f0d0006010103010402080809020a050b020e041001110212051311140115021702190d1c051d0824016a036b02bc02d102d40cd509d602d702da01e005e102e802ee20f004f802f902fa02fb010c273b3e4e4f8f9e9e9f060709363d3e56f3d0d1041418363756577faaaeafbd35e01287898e9e040d0e11122931343a4546494a4e4f64655cb6b71b1c07080a0b141736393aa8a9d8d909379091a8070a3b3e66698f926f5feeef5a629a9b2728559da0a1a3a4a7a8adbabcc4060b0c151d3a3f4551a6a7cccda007191a22253e3fc5c604202325262833383a484a4c50535556585a5c5e606365666b73787d7f8aa4aaafb0c0d0aeaf79cc6e6f935e227b0503042d036603012f2e80821d03310f1c0424091e052b0544040e2a80aa06240424042808340b018090813709160a088098390363080930160521031b05014038044b052f040a070907402027040c0936033a051a07040c07504937330d33072e080a8126524e28082a561c1417094e041e0f430e19070a0648082709750b3f412a063b050a0651060105100305808b621e48080a80a65e22450b0a060d1339070a362c041080c03c64530c48090a46451b4808531d398107460a1d03474937030e080a0639070a81361980b7010f320d839b66750b80c48abc842f8fd18247a1b98239072a040260260a460a28051382b05b654b0439071140050b020e97f80884d62a09a2f7811f3103110408818c89046b050d03090710936080f60a73086e1746809a140c570919808781470385420f1585502b80d52d031a040281703a0501850080d7294c040a04028311444c3d80c23c06010455051b3402810e2c04640c560a80ae381d0d2c040907020e06809a83d8080d030d03740c59070c140c0438080a062808224e81540c15030305070919070709030d072980cb250a840600680a1000200000000a0000001c000000680a1000200000001a000000360000007372632f6c6962636f72652f756e69636f64652f7072696e7461626c652e72730003000083042000910560005d13a0001217a01e0c20e01eef2c202b2a30a02b6fa6602c02a8e02c1efbe02d00fea0359effe035fd016136010aa136240d6137ab0ee1382f182139301c6146f31ea14af06a614e4f6fa14e9dbc214f65d1e14f00da215000e0e15130e16153ece2a154d0e8e15420002e55f001bf55e80d100023000000520000003e00000000700007002d0101010201020101480b30151001650702060202010423011e1b5b0b3a09090118040109010301052b03770f0120370101010408040103070a021d013a0101010204080109010a021a010202390104020402020303011e0203010b0239010405010204011402160601013a0101020104080107030a021e013b0101010c0109012801030139030503010407020b021d013a01020102010301050207020b021c02390201010204080109010a021d0148010401020301010801510102070c08620102090b064a021b0101010101370e01050102050b0124090166040106010202021902040310040d01020206010f01000300031d031d021e02400201070801020b09012d03770222017603040209010603db0202013a010107010101010208060a020130113f0430070101050128090c0220040202010338010102030101033a0802029803010d0107040106010302c63a01050001c32100038d016020000669020004010a200250020001030104011902050197021a120d012608190b2e0330010204020227014306020202020c0108012f01330101030202050201012a020801ee010201040100010010101000020001e201950500030102050428030401a50200040002990bb001360f3803310402024503240501083e010c0234090a0402015f03020101020601a0010308150239020101010116010e070305c308020301011701510102060101020101020102eb010204060201021b025508020101026a0101010206010165030204010500090102f5010a0201010401900402020401200a280602040801090602032e0d010200070106010152160207010201027a060301010201070101480203010101000200053b0700013f0451010002000101030405080802071e0494030037043208010e011605010f000701110207010201050007000400076d07006080f000000000e80d1000230000004b00000028000000e80d10002300000057000000160000007372632f6c6962636f72652f756e69636f64652f756e69636f64655f646174612e7273626567696e203c3d20656e642028203c3d2029207768656e20736c6963696e672060206973206f7574206f6620626f756e6473206f6620607372632f6c6962636f72652f7374722f6d6f642e7273426f72726f774572726f72426f72726f774d75744572726f7270616e69636b6564206174200000a90e100001000000aa0e10000300000054e0110000000000a80e100001000000a80e1000010000003a27272c2020202020000000d40e10001a000000b001000026000000430e100016000000c30700002f0000007372632f6c6962636f72652f7374722f7061747465726e2e72730000000f10001b00000052000000050000007372632f6c6962636f72652f736c6963652f6d656d6368722e72732c20000000190000000c000000040000001f00000020000000210000002c0a000019000000040000000400000022000000230000002400000028280a2c290a5d5b430e100016000000800700002f00000030625965734e6f706179735f6665653d6d61782d77656967687461637475616c5f7765696768743d19000000040000000400000025000000260000002700000019000000000000000100000028000000290000002a00000054e011000000000000000000ffffffff00000000010000000000000082800000000000008a8000000000008000800080000000808b800000000000000100008000000000818000800000008009800000000000808a00000000000000880000000000000009800080000000000a000080000000008b800080000000008b0000000000008089800000000000800380000000000080028000000000008080000000000000800a800000000000000a0000800000008081800080000000808080000000000080010000800000000008800080000000801900000000000000010000002b0000002c0000002a0000001900000000000000010000002b0000002c0000002a00000001a8010001605354524f424576312e302e320000ec10100058000000680000000d0000002f686f6d652f6261737469616e2f2e636172676f2f72656769737472792f7372632f6769746875622e636f6d2d316563633632393964623965633832332f6d65726c696e2d322e302e302f7372632f7374726f62652e72731a12100019000000331210001600000000000000200000000400000002000000000000000200000000000000030000000100000020000000040000000200000000000000020000000000000003000000ec10100058000000880000000d000000dc1110003e000000ec101000580000009100000009000000ec101000580000005e00000009000000ec101000580000005f00000009000000596f75207573656420746865205420666c61672c207768696368207468697320696d706c656d656e746174696f6e20646f65736e277420737570706f7274596f7520747269656420746f20636f6e74696e7565206f702020627574206368616e67656420666c61677320746f20000000ec101000580000007c00000015000000ec101000580000007d0000000d00000000000000f01210000e00000000000000001310000100000000000000000000000813100001000000000000000000000010131000060000000000000054e011000000000000000000000000001813100001000000000000000000000020131000070000000000000054e011000000000000000000000000002813100001000000000000004e6577417574686f7269746965730000b31310000d0000007f1310003400000050617573656400005813100027000000526573756d65640030131000280000002043757272656e7420617574686f726974792073657420686173206265656e20726573756d65642e2043757272656e7420617574686f726974792073657420686173206265656e207061757365642e204e657720617574686f726974792073657420686173206265656e206170706c6965642e205b617574686f726974795f7365745d417574686f726974794c697374386510005f000000de0000002e00000000000000fc1310000700000000000000041410000300000000000000000000001c14100004000000000000004f6666656e636500c667100004000000ca6710000e0000006bbe1100040000003c141000550000009114100053000000e4141000470000002b1510001b00000020546865726520697320616e206f6666656e6365207265706f72746564206f662074686520676976656e20606b696e64602068617070656e656420617420746865206073657373696f6e5f696e6465786020616e6420286b696e642d7370656369666963292074696d6520736c6f742e2054686973206576656e74206973206e6f74206465706f736974656420666f72206475706c696361746520736c61736865732e206c61737420656c656d656e7420696e64696361746573206f6620746865206f6666656e636520776173206170706c69656420287472756529206f7220717565756564202866616c73652920205b6b696e642c2074696d65736c6f742c206170706c6965645d2e000000000000741510000a00000000000000801510000100000000000000000000008815100002000000000000004e657753657373696f6e0000a47411000c0000009815100057000000ef15100022000000204e65772073657373696f6e206861732068617070656e65642e204e6f746520746861742074686520617267756d656e7420697320746865205b73657373696f6e5f696e6465785d2c206e6f742074686520626c6f636b206e756d626572206173207468652074797065206d6967687420737567676573742e74696d7374617030496e76616c69642074696d657374616d7020696e686572656e74206461746120656e636f64696e672e54696d657374616d7020696e686572656e742064617461206973206e6f742070726f76696465642e000000000000c41610001000000000000000d4161000020000000000000000000000e4161000020000000000000000000000f41610000e0000000000000054e011000000000000000000000000000417100001000000000000004261746368496e746572727570746564689011000300000018d911000d0000003f1710005600000095171000220000004261746368436f6d706c6574656400000c17100033000000204261746368206f66206469737061746368657320636f6d706c657465642066756c6c792077697468206e6f206572726f722e204261746368206f66206469737061746368657320646964206e6f7420636f6d706c6574652066756c6c792e20496e646578206f66206669727374206661696c696e6720646973706174636820676976656e2c2061732077656c6c20617320746865206572726f722e205b696e6465782c206572726f725d00c81710006300000094000000120000002f686f6d652f6261737469616e2f2e636172676f2f72656769737472792f7372632f6769746875622e636f6d2d316563633632393964623965633832332f7061726974792d7363616c652d636f6465632d312e332e342f7372632f636f6465632e72734572726f725377617070696e672064697361626c6564000000bc301100470000001b0300001a000000bc30110047000000150300001800000000000000bc1810001400000000000000d0181000010000000000000000000000d8181000010000000000000000000000e01810001600000000000000d0181000010000000000000000000000f818100001000000000000005061726174687265616452656769737465726564184b11000600000035191000350000005061726174687265616444657265676973746572656400000019100035000000205468652070617261746872656164206f662074686520737570706c696564204944207761732064652d726567697374657265642e204120706172617468726561642077617320726567697374657265643b20697473206e657720494420697320737570706c6965642e73776170646572656769737465725f7061726174687265616473656c6563745f7061726174687265616472656769737465725f706172617468726561647365745f7468726561645f636f756e74646572656769737465725f7061726172656769737465725f706172610000000000601a10001100000000000000741a10000100000000000000000000007c1a10000e000000000000008c1a1000010000000000000000000000941a10000f00000000000000a41a1000010000000000000000000000ac1a10000c00000000000000b81a1000010000000000000000000000a03511001000000000000000c01a1000010000000000000050617261416c72656164794578697374730000002a1b10001a000000496e76616c6964436861696e49640000141b100016000000496e76616c6964546872656164496400fd1a100017000000436f6465546f6f4c61726765e51a100018000000c81a10001d00000020496e76616c69642070617261206865616420646174612073697a652e20496e76616c6964207061726120636f64652073697a652e20496e76616c696420706172617468726561642049442e20496e76616c69642070617261636861696e2049442e2050617261636861696e20616c7265616479206578697374732e541b10004600000009020000110000002f686f6d652f6261737469616e2f70726f6a656374732f7061726974792f706f6c6b61646f742f72756e74696d652f636f6d6d6f6e2f7372632f7265676973747261722e7273446562746f727352616e646f6d4d6174657269616c2f686f6d652f6261737469616e2f2e636172676f2f6769742f636865636b6f7574732f7375627374726174652d376530383433336434633337306132312f383730363363332f6672616d652f72616e646f6d6e6573732d636f6c6c6563746976652d666c69702f7372632f6c69622e7273436865636b5370656356657273696f6e4c696d697450617261746872656164436f6d6d6974730000541b100046000000730200002d00000000000000c61910000d000000000000008c1d1000040000000000000000000000ec1d1000050000000000000000000000b71910000f00000000000000141e10000100000000000000000000002c1e1000010000000000000000000000a71910001000000000000000341e10000100000000000000000000004c1e1000050000000000000000000000941910001300000000000000741e1000020000000000000000000000a41e1000080000000000000000000000831910001100000000000000e41e10000300000000000000000000002c1f10000500000000000000000000006e191000150000000000000054e01100000000000000000000000000541f10000700000000000000000000006a19100004000000000000008c1f1000010000000000000000000000a41f1000080000000000000000000000c5fb10000200000000000000162210000f00000000000000335010000400000000000000882710000800000000000000dc1611000400000000000000605111000e00000000000000e525100011000000000000007152110008000000b72610003e000000f52610002300000054e0110000000000182710003d000000552710003300000000000000c5fb10000200000000000000162210000f0000009226100025000000000000008d26100005000000000000006890110003000000f62510005000000054e0110000000000462610002600000054e01100000000006c2610002100000000000000dc1611000400000000000000605111000e00000000000000e5251000110000000000000071521100080000007d2410002900000054e0110000000000a624100053000000f92410004e00000054e0110000000000472510004c000000932510004a000000dd25100008000000000000005d2410000300000000000000162210000f00000000000000602410000900000000000000692410000a00000000000000732410000a000000000000001c1e110007000000602310004100000054e0110000000000a123100050000000f1231000570000004824100015000000252210003200000054e0110000000000572210004800000054e01100000000009f22100056000000f522100051000000462310001a00000000000000112210000500000000000000162210000f000000e41f1000590000003d20100059000000962010005700000054e0110000000000ed2010005800000045211000500000009521100056000000eb21100026000000205377617020612070617261636861696e207769746820616e6f746865722070617261636861696e206f7220706172617468726561642e20546865206f726967696e206d7573742062652061206050617261636861696e602e2054686520737761702077696c6c2068617070656e206f6e6c7920696620746865726520697320616c726561647920616e206f70706f7369746520737761702070656e64696e672e204966207468657265206973206e6f742c2074686520737761702077696c6c2062652073746f72656420696e207468652070656e64696e67207377617073206d61702c20726561647920666f722061206c6174657220636f6e6669726d61746f727920737761702e20546865206050617261496460732072656d61696e206d617070656420746f207468652073616d652068656164206461746120616e6420636f646520736f2065787465726e616c20636f64652063616e2072656c79206f6e20605061726149646020746f2062652061206c6f6e672d7465726d206964656e746966696572206f662061206e6f74696f6e616c202270617261636861696e222e20486f77657665722c207468656972207363686564756c696e6720696e666f2028692e652e2077686574686572207468657927726520612070617261746872656164206f722070617261636861696e292c2061756374696f6e20696e666f726d6174696f6e20616e64207468652061756374696f6e206465706f736974206172652073776974636865642e6f74686572436f6d706163743c5061726149643e20446572656769737465722061207061726174687265616420616e6420726574726965766520746865206465706f7369742e204d7573742062652073656e742066726f6d2061206050617261636861696e60206f726967696e2077686963682069732063757272656e746c79206120706172617468726561642e20456e737572652074686174206265666f72652063616c6c696e672074686973207468617420616e792066756e647320796f752077616e7420656d70746965642066726f6d2074686520706172617468726561642773206163636f756e74206973206d6f766564206f75743b20616674657220746869732069742077696c6c20626520696d706f737369626c6520746f207265747269657665207468656d2028776974686f757420676f7665726e616e636520696e74657276656e74696f6e292e20506c61636520612062696420666f722061207061726174687265616420746f2062652070726f6772657373656420696e20746865206e65787420626c6f636b2e20546869732069732061206b696e64206f66207370656369616c207472616e73616374696f6e20746861742073686f756c642062652068656176696c79207072696f726974697a656420696e20746865207472616e73616374696f6e20706f6f6c206163636f7264696e6720746f20746865206076616c7565603b206f6e6c792060546872656164436f756e7460206f66207468656d206d61792062652070726573656e74656420696e20616e792073696e676c6520626c6f636b2e5f69645f636f6c6c61746f72436f6c6c61746f7249645f686561645f686173682052656769737465722061207061726174687265616420666f7220696d6d656469617465207573652e204d7573742062652073656e742066726f6d2061205369676e6564206f726967696e20746861742069732061626c6520746f206861766520506172617468726561644465706f7369742072657365727665642e2060636f64656020616e642060696e697469616c5f686561645f646174616020617265207573656420746f20696e697469616c697a6520746865207061726174687265616427732073746174652e20556e6c696b65206072656769737465725f70617261602c20746869732066756e6374696f6e20646f657320636865636b207468617420746865206d6178696d756d20636f64652073697a6520616e64206865616420646174612073697a6520617265207265737065637465642c206173207061726174687265616420726567697374726174696f6e20697320616e2061746f6d696320616374696f6e2e696e697469616c5f686561645f6461746120526573657420746865206e756d626572206f6620706172617468726561647320746861742063616e2070617920746f206265207363686564756c656420696e20612073696e676c6520626c6f636b2e202d2060636f756e74603a20546865206e756d626572206f662070617261746872656164732e204d7573742062652063616c6c65642066726f6d20526f6f74206f726967696e2e636f756e74204465726567697374657220612070617261636861696e207769746820676976656e20696420526567697374657220612070617261636861696e207769746820676976656e20636f64652e204d7573742062652063616c6c656420627920726f6f742e204661696c7320696620676976656e20494420697320616c726561647920757365642e20556e6c696b65207468652060526567697374726172602074726169742066756e6374696f6e206f66207468652073616d65206e616d652c207468697320636865636b732074686520636f646520616e642068656164206461746120616761696e73742073697a65206c696d6974732e50617261496e666f000000006bc611000a00000000000000000000002d5311000b0000000000000000000000000000000000000000000000000000000000000054e01100a82a1000000000000000000054e0110000000000000000000100000000000000b82a10000b000000000000000000000068901100030000000000000000000000000000000000000000000000000000000000000054e01100c42a10000000000000000000d42a100001000000000000000100000000000000dc2a10000f0000000000000000000000eb2a10001e0000000000000000000000000000000000000000000000000000000000000054e011000c2b100000000000000000001c2b1000020000000000000001000000000000002c2b1000060000000000000000000000322b10002e0000000000000000000000000000000000000000000000000000000000000054e01100602b10000000000000000000702b100006000000000000000100000000000000a02b10000a0000000000000000000000184b1100060000000000000000000000000000000000000000000000000000000000000054e01100ac2b10000000000000000000bc2b100002000000000000000100000000000000cc2b10000b0000000105000000000000184b11000600000000000000184b1100060000000000000000000000000000000000000054e01100d82b10000000000000000000e82b100001000000000000000000000000000000f02b1000050000000105000000000000184b1100060000000000000088271000080000000000000000000000000000000000000054e01100f82b10000000000000000000082c100001000000000000000000000000000000102c10000a0000000000000000000000eb2a10001e0000000000000000000000000000000000000000000000000000000000000054e011001c2c100000000000000000002c2c1000010000000000000001000000000000009a1b1000070000000105000000000000184b110006000000000000003aa311000c0000000000000000000000000000000000000054e01100342c10000000000000000000442c10000100000000000000010000001900000000000000010000002d000000546872656164436f756e74001900000000000000010000002e000000442f10002d00000053656c6563746564546872656164735665633c5665633c285061726149642c20436f6c6c61746f724964293e3e0000001900000000000000010000002f000000a42e100054000000f82e10004c0000004163746976655665633c285061726149642c204f7074696f6e3c28436f6c6c61746f7249642c20526574726961626c65293e293e19000000000000000100000030000000582d100057000000af2d100058000000072e1000560000005d2e10003400000054e0110000000000912e1000130000004e657874467265654964000019000000000000000100000031000000f42c10004f000000432d10001500000050656e64696e67537761700019000000000000000100000032000000db2c100019000000506172617300000019000000000000000100000032000000b12c10002a0000005265747279517565756500001900000000000000010000002f000000772c10003a000000190000000000000001000000330000004c2c10002b0000002055736572732077686f20686176652070616964206120706172617468726561642773206465706f736974205468652063757272656e7420717565756520666f7220706172617468726561647320746861742073686f756c6420626520726574726965642e204d6170206f6620616c6c20726567697374657265642070617261746872656164732f636861696e732e2050656e64696e672073776170206f7065726174696f6e732e20546865206e65787420756e75736564205061726149642076616c75652e2053746172742074686973206869676820696e206f7264657220746f206b656570206c6f77206e756d6265727320666f722073797374656d2d6c6576656c20636861696e732e2050617261746872656164732f636861696e73207363686564756c656420666f7220657865637574696f6e207468697320626c6f636b2e2049662074686520636f6c6c61746f72204944206973207365742c207468656e206120706172746963756c617220636f6c6c61746f722068617320616c7265616479206265656e2063686f73656e20666f7220746865206e65787420626c6f636b2c20616e64206e6f206f7468657220636f6c6c61746f72206d61792070726f766964652074686520626c6f636b2e20496e2074686973206361736520776520616c6c6f772074686520706f73736962696c697479206f662074686520636f6d62696e6174696f6e206265696e67207265747269656420696e2061206c6174657220626c6f636b2c206578707265737365642062792060526574726961626c65602e204f726465726564206279205061726149642e20416e206172726179206f6620746865207175657565206f6620736574206f662074687265616473207363686564756c656420666f722074686520636f6d696e6720626c6f636b733b206f72646572656420627920617363656e64696e6720706172612049442e2054686572652063616e206265206e6f206475706c696361746573206f66207061726120494420696e2065616368206c697374206974656d2e20546865206e756d626572206f66207468726561647320746f207363686564756c652070657220626c6f636b2e00000000000000a11b10000e0000000000000000000000cc2f10000c0000000000000000000000000000000000000000000000000000000000000054e01100d82f10000000000000000000e82f10000300000000000000010000005665633c543a3a486173683e1900000000000000010000002f00000000301000580000005830100058000000b03010001100000020536572696573206f6620626c6f636b20686561646572732066726f6d20746865206c61737420383120626c6f636b73207468617420616374732061732072616e646f6d2073656564206d6174657269616c2e205468697320697320617272616e67656420617320612072696e672062756666657220776974682060626c6f636b5f6e756d626572202520383160206265696e672074686520696e64657820696e746f20746865206056656360206f6620746865206f6c6465737420686173682e000000190000000400000004000000250000002600000034000000af1b100071000000550000001100000048617368207461626c65206361706163697479206f766572666c6f7753757065724f664e6f74537562416c7265616479436c61696d6564546f6f4d616e7952656769737472617273546f6f4d616e794669656c6473496e76616c6964546172676574496e76616c6964496e646578496e76616c69644a756467656d656e744a756467656d656e74476976656e537469636b794a756467656d656e744e6f4964656e746974794665654368616e676564456d707479496e6465784e6f744e616d6564546f6f4d616e795375624163636f756e74734e6f744f776e656400000000005c3410000d0000000000000094a810000100000000000000000000006c3410000d0000000000000000000000d43410000c00000000000000e0341000010000000000000000000000f834100013000000000000000000000090351000080000000000000098351000010000000000000000000000b0351000150000000000000000000000583610000e0000000000000054e0110000000000000000000000000068361000120000000000000000000000f836100011000000000000000c3710000200000000000000000000003c371000170000000000000000000000f43710000e00000000000000043810000100000000000000000000001c381000110000000000000000000000a43810000700000000000000ac381000020000000000000000000000dc3810000d0000000000000000000000443910000e0000000000000054391000020000000000000000000000843910000d0000000000000000000000ec3910000a00000000000000f8391000020000000000000000000000283a10000d0000000000000000000000903a10001100000000000000a43a1000030000000000000000000000ec3a1000130000000000000000000000843b10000d0000000000000038d21000010000000000000000000000943b10001300000000000000000000002c3c10000700000000000000343c1000020000000000000000000000643c10000700000000000000000000009c3c10000a00000000000000343c1000020000000000000000000000a83c1000040000000000000000000000c83c10000a00000000000000d43c1000010000000000000000000000ec3c1000070000000000000000000000243d1000080000000000000054e011000000000000000000000000002c3d10000a000000000000006164645f726567697374726172000000435010001f00000054e0110000000000625010004000000054e0110000000000a25010002b00000054e0110000000000cd5010002600000054e0110000000000a9a211000b000000f35010004a0000003d51100027000000e8b010000d00000027a311000c0000007365745f6964656e7469747900000000335010000400000000000000375010000c000000394e10004b00000054e0110000000000844e100056000000da4e10001500000054e0110000000000b8a611003400000054e0110000000000ef4e10002400000054e0110000000000134f10002300000054e0110000000000a9a211000b000000364f100012000000484f100048000000904f100039000000c94f100021000000ea4f100049000000e8b010000d00000027a311000c0000007365745f73756273000000001c4e10000400000000000000204e100019000000ec4b10002400000054e0110000000000104c100056000000664c10004c00000054e0110000000000263e100059000000a14a10000a00000054e0110000000000b24c10002d00000054e0110000000000a9a211000b000000df4c10000d000000ec4c10003a000000174b100036000000264d100022000000484d1000060000004e4d100038000000864d100030000000b64d100031000000e74d10003500000027a311000c000000636c6561725f6964656e746974790000164a10004f00000054e0110000000000654a10003c00000054e0110000000000263e100059000000a14a10000a00000054e0110000000000ab4a10002700000054e0110000000000a9a211000b000000d24a100011000000e34a100034000000174b1000360000004d4b100049000000964b100023000000b94b100033000000e8b010000d00000027a311000c000000726571756573745f6a756467656d656e74000000000000002744100009000000000000003044100017000000000000000f4a10000700000000000000d446100015000000554810002600000054e01100000000007b48100056000000d14810000700000054e0110000000000434710004e000000914710001500000054e0110000000000d848100048000000204910005600000054e0110000000000764910000d000000834910002f000000b24910000400000054e0110000000000b64910002a00000054e0110000000000a9a211000b000000a24310000e000000f041100021000000e04910002f000000e8b010000d00000027a311000c00000063616e63656c5f72657175657374000000000000274410000900000000000000474810000e000000e94610001b00000054e0110000000000044710003f00000054e0110000000000434710004e000000914710001500000054e0110000000000a64710005200000054e0110000000000f84710002c00000054e0110000000000a9a211000b000000a24310000e000000f0411000210000002448100023000000a4bf10000c00000027a311000c0000007365745f66656500000000005ca311000500000000000000304410001700000000000000d14610000300000000000000d4461000150000003a4610004700000054e01100000000005d42100056000000924410002900000054e0110000000000bb4410003e000000814610001600000054e0110000000000a9a211000b0000003d4510000a000000474510001f000000974610003a00000027a311000c0000007365745f6163636f756e745f69640000000000005ca3110005000000000000003044100017000000000000008460110003000000000000003aa311000c000000b44510003000000054e01100000000005d42100056000000924410002900000054e0110000000000bb4410003e000000e44510001d00000054e0110000000000a9a211000b0000003d4510000a000000474510001f000000014610003900000027a311000c0000007365745f6669656c64730000000000005ca311000500000000000000304410001700000000000000a04510000600000000000000a64510000e000000674410002b00000054e01100000000005d42100056000000924410002900000054e0110000000000bb4410003e000000f94410004400000054e0110000000000a9a211000b0000003d4510000a000000474510001f000000664510003a00000027a311000c00000070726f766964655f6a756467656d656e74000000000000002744100009000000000000003044100017000000000000007dd710000600000000000000f35f1100230000000000000047441000090000000000000050441000170000002e4210002f00000054e01100000000005d42100056000000b34210002d00000054e0110000000000e04210004900000044411000560000009a4110001e000000294310005300000054e01100000000007c4310002600000054e0110000000000a9a211000b000000a24310000e000000b043100022000000d243100026000000f84310002f000000e8b010000d00000027a311000c0000006b696c6c5f6964656e74697479000000e83f10005100000054e011000000000039401000590000009240100052000000e44010002100000054e0110000000000054110003f00000054e011000000000044411000560000009a4110001e00000054e0110000000000b84110002600000054e0110000000000a9a211000b000000de41100012000000f041100021000000114210001d000000e8b010000d00000027a311000c0000006164645f73756200000000007d3f10000300000000000000f35f11002300000000000000e03f10000400000000000000e43f100004000000b43f10002c00000054e0110000000000a03d100058000000573f10000f00000054e0110000000000263e100059000000663f10001700000072656e616d655f7375620000803f10003400000054e0110000000000263e100059000000663f10001700000072656d6f76655f7375620000000000007d3f10000300000000000000f35f110023000000263f10003100000054e0110000000000a03d100058000000573f10000f00000054e0110000000000263e100059000000663f100017000000717569745f7375627c3d10002400000054e0110000000000a03d100058000000f83d10002e00000054e0110000000000263e1000590000007f3e10001000000054e01100000000008f3e100052000000e13e1000450000002052656d6f7665207468652073656e6465722061732061207375622d6163636f756e742e205061796d656e743a2042616c616e636520726573657276656420627920612070726576696f757320607365745f73756273602063616c6c20666f72206f6e65207375622077696c6c20626520726570617472696174656420746f207468652073656e64657220282a6e6f742a20746865206f726967696e616c206465706f7369746f72292e20546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d7573742068617665206120726567697374657265642073757065722d6964656e746974792e204e4f54453a20546869732073686f756c64206e6f74206e6f726d616c6c7920626520757365642c206275742069732070726f766964656420696e207468652063617365207468617420746865206e6f6e2d20636f6e74726f6c6c6572206f6620616e206163636f756e74206973206d616c6963696f75736c7920726567697374657265642061732061207375622d6163636f756e742e2052656d6f76652074686520676976656e206163636f756e742066726f6d207468652073656e646572277320737562732e20746f207468652073656e6465722e20737562206964656e74697479206f662060737562602e73756220416c74657220746865206173736f636961746564206e616d65206f662074686520676976656e207375622d6163636f756e742e204164642074686520676976656e206163636f756e7420746f207468652073656e646572277320737562732e64617461446174612052656d6f766520616e206163636f756e742773206964656e7469747920616e64207375622d6163636f756e7420696e666f726d6174696f6e20616e6420736c61736820746865206465706f736974732e205061796d656e743a2052657365727665642062616c616e6365732066726f6d20607365745f737562736020616e6420607365745f6964656e74697479602061726520736c617368656420616e642068616e646c65642062792060536c617368602e20566572696669636174696f6e2072657175657374206465706f7369747320617265206e6f742072657475726e65643b20746865792073686f756c642062652063616e63656c6c6564206d616e75616c6c79207573696e67206063616e63656c5f72657175657374602e20546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206d617463682060543a3a466f7263654f726967696e602e202d2060746172676574603a20746865206163636f756e742077686f7365206964656e7469747920746865206a756467656d656e742069732075706f6e2e2054686973206d75737420626520616e206163636f756e742020207769746820612072656769737465726564206964656e746974792e20456d69747320604964656e746974794b696c6c656460206966207375636365737366756c2e202d20604f2852202b2053202b205829602e202d204f6e652062616c616e63652d72657365727665206f7065726174696f6e2e202d206053202b2032602073746f72616765206d75746174696f6e732e2050726f766964652061206a756467656d656e7420666f7220616e206163636f756e742773206964656e746974792e20546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d75737420626520746865206163636f756e74206f6620746865207265676973747261722077686f736520696e64657820697320607265675f696e646578602e202d20607265675f696e646578603a2074686520696e646578206f6620746865207265676973747261722077686f7365206a756467656d656e74206973206265696e67206d6164652e202d20606a756467656d656e74603a20746865206a756467656d656e74206f662074686520726567697374726172206f6620696e64657820607265675f696e646578602061626f75742060746172676574602e20456d69747320604a756467656d656e74476976656e60206966207375636365737366756c2e202d20604f2852202b205829602e202d204f6e652062616c616e63652d7472616e73666572206f7065726174696f6e2e202d20557020746f206f6e65206163636f756e742d6c6f6f6b7570206f7065726174696f6e2e202d2053746f726167653a2031207265616420604f285229602c2031206d757461746520604f2852202b205829602e7265675f696e646578436f6d706163743c526567697374726172496e6465783e6a756467656d656e744a756467656d656e743c42616c616e63654f663c543e3e2053657420746865206669656c6420696e666f726d6174696f6e20666f722061207265676973747261722e206f6620746865207265676973747261722077686f736520696e6465782069732060696e646578602e202d2060696e646578603a2074686520696e646578206f6620746865207265676973747261722077686f73652066656520697320746f206265207365742e202d20606669656c6473603a20746865206669656c64732074686174207468652072656769737472617220636f6e6365726e73207468656d73656c76657320776974682e202d20604f285229602e202d204f6e652073746f72616765206d75746174696f6e20604f285229602e202d2042656e63686d61726b3a20372e343634202b2052202a20302e33323520c2b57320286d696e207371756172657320616e616c79736973296669656c64734964656e746974794669656c6473204368616e676520746865206163636f756e74206173736f63696174656420776974682061207265676973747261722e202d20606e6577603a20746865206e6577206163636f756e742049442e202d2042656e63686d61726b3a20382e383233202b2052202a20302e333220c2b57320286d696e207371756172657320616e616c797369732920536574207468652066656520726571756972656420666f722061206a756467656d656e7420746f206265207265717565737465642066726f6d2061207265676973747261722e202d2060666565603a20746865206e6577206665652e202d2042656e63686d61726b3a20372e333135202b2052202a20302e33323920c2b57320286d696e207371756172657320616e616c7973697329666565436f6d706163743c42616c616e63654f663c543e3e2043616e63656c20612070726576696f757320726571756573742e205061796d656e743a20412070726576696f75736c79207265736572766564206465706f7369742069732072657475726e6564206f6e20737563636573732e20546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d757374206861766520612072656769737465726564206964656e746974792e202d20607265675f696e646578603a2054686520696e646578206f6620746865207265676973747261722077686f7365206a756467656d656e74206973206e6f206c6f6e676572207265717565737465642e20456d69747320604a756467656d656e74556e72657175657374656460206966207375636365737366756c2e202d204f6e652073746f72616765206d75746174696f6e20604f2852202b205829602e526567697374726172496e64657820526571756573742061206a756467656d656e742066726f6d2061207265676973747261722e205061796d656e743a204174206d6f737420606d61785f666565602077696c6c20626520726573657276656420666f72207061796d656e7420746f2074686520726567697374726172206966206a756467656d656e7420676976656e2e202d20607265675f696e646578603a2054686520696e646578206f6620746865207265676973747261722077686f7365206a756467656d656e74206973207265717565737465642e202d20606d61785f666565603a20546865206d6178696d756d206665652074686174206d617920626520706169642e20546869732073686f756c64206a757374206265206175746f2d706f70756c617465642061733a206060606e6f636f6d70696c652053656c663a3a7265676973747261727328292e676574287265675f696e646578292e756e7772617028292e6665652060606020456d69747320604a756467656d656e7452657175657374656460206966207375636365737366756c2e202d2053746f726167653a2031207265616420604f285229602c2031206d757461746520604f2858202b205229602e6d61785f66656520436c65617220616e206163636f756e742773206964656e7469747920696e666f20616e6420616c6c207375622d6163636f756e747320616e642072657475726e20616c6c206465706f736974732e205061796d656e743a20416c6c2072657365727665642062616c616e636573206f6e20746865206163636f756e74206172652072657475726e65642e206964656e746974792e20456d69747320604964656e74697479436c656172656460206966207375636365737366756c2e202d20604f2852202b2053202b205829602020202d20776865726520605260207265676973747261722d636f756e742028676f7665726e616e63652d626f756e646564292e2020202d2077686572652060536020737562732d636f756e742028686172642d20616e64206465706f7369742d626f756e646564292e2020202d20776865726520605860206164646974696f6e616c2d6669656c642d636f756e7420286465706f7369742d626f756e64656420616e6420636f64652d626f756e646564292e202d204f6e652062616c616e63652d756e72657365727665206f7065726174696f6e2e202d206032602073746f7261676520726561647320616e64206053202b2032602073746f726167652064656c6574696f6e732e2053657420746865207375622d6163636f756e7473206f66207468652073656e6465722e205061796d656e743a20416e79206167677265676174652062616c616e63652072657365727665642062792070726576696f757320607365745f73756273602063616c6c732077696c6c2062652072657475726e656420616e6420616e20616d6f756e7420605375624163636f756e744465706f736974602077696c6c20626520726573657276656420666f722065616368206974656d20696e206073756273602e202d206073756273603a20546865206964656e74697479277320286e657729207375622d6163636f756e74732e202d20604f2850202b205329602020202d20776865726520605060206f6c642d737562732d636f756e742028686172642d20616e64206465706f7369742d626f756e646564292e202d204174206d6f7374206f6e652062616c616e6365206f7065726174696f6e732e202d2044423a2020202d206050202b2053602073746f72616765206d75746174696f6e732028636f64656320636f6d706c657869747920604f28312960292020202d204f6e652073746f7261676520726561642028636f64656320636f6d706c657869747920604f28502960292e2020202d204f6e652073746f726167652077726974652028636f64656320636f6d706c657869747920604f28532960292e2020202d204f6e652073746f726167652d6578697374732028604964656e746974794f663a3a636f6e7461696e735f6b657960292e737562735665633c28543a3a4163636f756e7449642c2044617461293e2053657420616e206163636f756e742773206964656e7469747920696e666f726d6174696f6e20616e6420726573657276652074686520617070726f707269617465206465706f7369742e20496620746865206163636f756e7420616c726561647920686173206964656e7469747920696e666f726d6174696f6e2c20746865206465706f7369742069732074616b656e2061732070617274207061796d656e7420666f7220746865206e6577206465706f7369742e202d2060696e666f603a20546865206964656e7469747920696e666f726d6174696f6e2e20456d69747320604964656e7469747953657460206966207375636365737366756c2e202d20604f2858202b205827202b205229602020202d20776865726520605860206164646974696f6e616c2d6669656c642d636f756e7420286465706f7369742d626f756e64656420616e6420636f64652d626f756e646564292020202d20776865726520605260206a756467656d656e74732d636f756e7420287265676973747261722d636f756e742d626f756e64656429202d204f6e652062616c616e63652072657365727665206f7065726174696f6e2e202d204f6e652073746f72616765206d75746174696f6e2028636f6465632d7265616420604f285827202b205229602c20636f6465632d777269746520604f2858202b20522960292e696e666f4964656e74697479496e666f2041646420612072656769737472617220746f207468652073797374656d2e20546865206469737061746368206f726967696e20666f7220746869732063616c6c206d7573742062652060543a3a5265676973747261724f726967696e602e202d20606163636f756e74603a20746865206163636f756e74206f6620746865207265676973747261722e20456d6974732060526567697374726172416464656460206966207375636365737366756c2e202d20604f2852296020776865726520605260207265676973747261722d636f756e742028676f7665726e616e63652d626f756e64656420616e6420636f64652d626f756e646564292e202d204f6e652073746f72616765206d75746174696f6e2028636f64656320604f28522960292e00000000c45210000a00000001050000000000003aa311000c00000000000000ce5210001a0000000000000000000000000000000000000054e01100e85210000000000000000000f852100003000000000000000000000000000000083110000700000001020000000000003aa311000c0000000000000010531000140000000000000000000000000000000000000054e011002453100000000000000000003453100002000000000000000000000000000000445310000600000001050000000000003aa311000c000000000000004a531000210000000000000000000000000000000000000054e011006c53100000000000000000007c53100005000000000000000100000000000000a45310000a0000000000000000000000ae531000360000000000000000000000000000000000000000000000000000000000000054e01100e45310000000000000000000f45310000400000000000000010000004964656e746974794f66526567697374726174696f6e3c42616c616e63654f663c543e3e190000000000000001000000350000002c5610004800000054e0110000000000505510003000000028543a3a4163636f756e7449642c204461746129190000000000000001000000360000008055100058000000d855100054000000537562734f662842616c616e63654f663c543e2c205665633c543a3a4163636f756e7449643e290019000000000000000100000037000000db5410002e00000054e0110000000000095510004700000054e01100000000005055100030000000526567697374726172735665633c4f7074696f6e3c526567697374726172496e666f3c42616c616e63654f663c543e2c20543a3a4163636f756e7449643e3e3e190000000000000001000000380000001454100053000000675410002a00000054e0110000000000915410004a0000002054686520736574206f6620726567697374726172732e204e6f7420657870656374656420746f206765742076657279206269672061732063616e206f6e6c79206265206164646564207468726f7567682061207370656369616c206f726967696e20286c696b656c79206120636f756e63696c206d6f74696f6e292e2054686520696e64657820696e746f20746869732063616e206265206361737420746f2060526567697374726172496e6465786020746f2067657420612076616c69642076616c75652e20416c7465726e6174697665202273756222206964656e746974696573206f662074686973206163636f756e742e20546865206669727374206974656d20697320746865206465706f7369742c20746865207365636f6e64206973206120766563746f72206f6620746865206163636f756e74732e2054574f582d4e4f54453a204f4b20e2809520604163636f756e7449646020697320612073656375726520686173682e205468652073757065722d6964656e74697479206f6620616e20616c7465726e6174697665202273756222206964656e7469747920746f676574686572207769746820697473206e616d652c2077697468696e207468617420636f6e746578742e20496620746865206163636f756e74206973206e6f7420736f6d65206f74686572206163636f756e742773207375622d6964656e746974792c207468656e206a75737420604e6f6e65602e20496e666f726d6174696f6e20746861742069732070657274696e656e7420746f206964656e746966792074686520656e7469747920626568696e6420616e206163636f756e742e00000000c45710000c000000000000008cad11000c0000000000000054e01100d05710000000000000000000e0571000010000000000000000000000e85710000c000000000000008cad11000c0000000000000054e01100f45710000000000000000000045810000100000000000000000000000c58100011000000000000008cad11000c0000000000000054e0110020581000000000000000000030581000030000000000000000000000485810000e0000000000000068901100030000000000000054e011005858100000000000000000006858100001000000000000000000000070581000130000000000000068901100030000000000000054e0110084581000000000000000000094581000020000000000000000000000a45810000d0000000000000068901100030000000000000054e01100b45810000000000000000000c4581000020000000000000042617369634465706f73697419000000000000000100000039000000655b1000360000004669656c644465706f7369741900000000000000010000003a0000001a5b10004b0000005375624163636f756e744465706f7369740000001900000000000000010000003b0000001b5a100059000000745a10005c000000d05a10004a0000004d61785375624163636f756e747300001900000000000000010000003c000000d8591000430000004d61784164646974696f6e616c4669656c6473001900000000000000010000003c0000004759100059000000a0591000380000004d6178526567697374726172730000001900000000000000010000003d000000d458100054000000285910001f000000204d61786d696d756d206e756d626572206f66207265676973747261727320616c6c6f77656420696e207468652073797374656d2e204e656564656420746f20626f756e642074686520636f6d706c6578697479206f662c20652e672e2c207570646174696e67206a756467656d656e74732e204d6178696d756d206e756d626572206f66206164646974696f6e616c206669656c64732074686174206d61792062652073746f72656420696e20616e2049442e204e656564656420746f20626f756e642074686520492f4f20726571756972656420746f2061636365737320616e206964656e746974792c206275742063616e2062652070726574747920686967682e20546865206d6178696d756d206e756d626572206f66207375622d6163636f756e747320616c6c6f77656420706572206964656e746966696564206163636f756e742e2054686520616d6f756e742068656c64206f6e206465706f73697420666f7220612072656769737465726564207375626163636f756e742e20546869732073686f756c64206163636f756e7420666f722074686520666163742074686174206f6e652073746f72616765206974656d27732076616c75652077696c6c20696e637265617365206279207468652073697a65206f6620616e206163636f756e742049442c20616e642074686572652077696c6c20626520616e6f746865722074726965206974656d2077686f73652076616c7565206973207468652073697a65206f6620616e206163636f756e7420494420706c75732033322062797465732e2054686520616d6f756e742068656c64206f6e206465706f73697420706572206164646974696f6e616c206669656c6420666f7220612072656769737465726564206964656e746974792e2054686520616d6f756e742068656c64206f6e206465706f73697420666f7220612072656769737465726564206964656e746974792e0000000000545d10000b00000000000000c8621100010000000000000000000000605d1000010000000000000000000000685d10000f0000000000000018de1000020000000000000000000000785d1000010000000000000000000000805d10000e0000000000000018de1000020000000000000000000000905d1000010000000000000000000000985d10001200000000000000ac5d1000020000000000000000000000bc5d1000010000000000000000000000c45d10001400000000000000ac5d1000020000000000000000000000d85d10000100000000000000000000006a3110000e00000000000000ac5d1000020000000000000000000000e05d1000010000000000000000000000e85d10000e00000000000000f85d1000010000000000000000000000005e1000010000000000000000000000085e10001000000000000000fcf21000030000000000000000000000185e1000010000000000000000000000205e10001200000000000000fcf21000030000000000000000000000345e1000020000000000000000000000445e10001200000000000000fcf21000030000000000000000000000585e100002000000000000004964656e746974795365740008611000420000004964656e74697479436c656172656400c5601000430000004964656e746974794b696c6c6564000084601000410000004a756467656d656e745265717565737465640000fbaf110009000000474810000e000000456010003f0000004a756467656d656e74556e7265717565737465640b6010003a000000cb5f10004000000052656769737472617241646465640000474810000e000000a25f1000290000005375624964656e7469747941646465644f5f1000530000005375624964656e7469747952656d6f7665640000f75e1000430000003a5f1000150000005375624964656e746974795265766f6b65640000685e100047000000af5e1000480000002041207375622d6964656e746974792077617320636c65617265642c20616e642074686520676976656e206465706f7369742072657061747269617465642066726f6d20746865206d61696e206964656e74697479206163636f756e7420746f20746865207375622d6964656e74697479206163636f756e742e205b7375622c206d61696e2c206465706f7369745d2041207375622d6964656e74697479207761732072656d6f7665642066726f6d20616e206964656e7469747920616e6420746865206465706f7369742066726565642e205b7375622c206d61696e2c206465706f7369745d2041207375622d6964656e746974792077617320616464656420746f20616e206964656e7469747920616e6420746865206465706f73697420706169642e205b7375622c206d61696e2c206465706f7369745d204120726567697374726172207761732061646465642e205b7265676973747261725f696e6465785d2041206a756467656d656e742077617320676976656e2062792061207265676973747261722e205b7461726765742c207265676973747261725f696e6465785d2041206a756467656d656e74207265717565737420776173207265747261637465642e205b77686f2c207265676973747261725f696e6465785d2041206a756467656d656e74207761732061736b65642066726f6d2061207265676973747261722e205b77686f2c207265676973747261725f696e6465785d2041206e616d65207761732072656d6f76656420616e642074686520676976656e2062616c616e636520736c61736865642e205b77686f2c206465706f7369745d2041206e616d652077617320636c65617265642c20616e642074686520676976656e2062616c616e63652072657475726e65642e205b77686f2c206465706f7369745d2041206e616d652077617320736574206f72207265736574202877686963682077696c6c2072656d6f766520616c6c206a756467656d656e7473292e205b77686f5d000000000000ad31100012000000000000000c631000010000000000000000000000da991100080000000000000014631000010000000000000000000000a531100008000000000000001c6310000100000000000000000000009b3110000a0000000000000024631000010000000000000000000000913110000a000000000000002c631000010000000000000000000000873110000a0000000000000034631000010000000000000000000000783110000f000000000000003c6310000100000000000000000000006a3110000e00000000000000446310000100000000000000000000005a31100010000000000000004c6310000100000000000000000000004e3110000c0000000000000054631000010000000000000000000000413110000d000000000000005c631000010000000000000000000000343110000d00000000000000646310000100000000000000000000002331100011000000000000006c631000010000000000000000000000153110000e00000000000000746310000100000000000000000000000f31100006000000000000007c631000010000000000000000000000bf3110000800000000000000846310000100000000000000fd64100018000000e864100015000000d364100015000000c66410000d000000b664100010000000a364100013000000916410001200000080641000110000006d6410001300000057641000160000004064100017000000246410001c000000e96310003b000000cc6310001d000000af6310001d0000008c63100023000000205375622d6163636f756e742069736e2774206f776e65642062792073656e6465722e2053656e646572206973206e6f742061207375622d6163636f756e742e204163636f756e7420494420697320616c7265616479206e616d65642e204d6178696d756d20616d6f756e74206f66207265676973747261727320726561636865642e2043616e6e6f742061646420616e79206d6f72652e20546f6f206d616e79206164646974696f6e616c206669656c64732e205468652074617267657420697320696e76616c69642e2054686520696e64657820697320696e76616c69642e20496e76616c6964206a756467656d656e742e204a756467656d656e7420676976656e2e20537469636b79206a756467656d656e742e204e6f206964656e7469747920666f756e642e20466565206973206368616e6765642e20456d70747920696e6465782e204163636f756e742069736e2774206e616d65642e204163636f756e742069736e277420666f756e642e20546f6f206d616e7920737562732d6163636f756e74732e000000386510005f000000b70300001d000000386510005f00000087040000360000002f686f6d652f6261737469616e2f2e636172676f2f6769742f636865636b6f7574732f7375627374726174652d376530383433336434633337306132312f383730363363332f6672616d652f6964656e746974792f7372632f6c69622e7273506f7374496e666f3a2044656665727265644f6666656e63657300000000000000146710000700000001050000000000001b6710000d0000000000000028671000340000000000000000000000000000000000000054e011005c67100000000000000000006c67100001000000000000000000000000000000a165100010000000000000000000000074671000190000000000000000000000000000000000000000000000000000000000000054e01100906710000000000000000000a067100002000000000000000100000000000000b0671000160000000205050000000000c66710000400000000000000ca6710000e00000000000000d8671000120000000000000054e01100ec6710000000000000000000fc6710000100000000000000010000000000000004681000120000000105000000000000c66710000400000000000000ff7a1100070000000000000000000000000000000000000054e01100186810000000000000000000286810000600000000000000010000005265706f7274735265706f727449644f663c543e4f6666656e636544657461696c733c543a3a4163636f756e7449642c20543a3a4964656e74696669636174696f6e5475706c653e190000000000000001000000320000002b6a1000520000005665633c44656665727265644f6666656e63654f663c543e3e0000001900000000000000010000003e000000c1691000590000001a6a100011000000436f6e63757272656e745265706f727473496e6465784b696e644f706171756554696d65536c6f745665633c5265706f727449644f663c543e3e00001900000000000000010000002f000000776910004a0000005265706f72747342794b696e64496e64657800001900000000000000010000003f000000586810004400000054e01100000000009c6810002f00000054e0110000000000cb681000520000001d6910005a00000020456e756d65726174657320616c6c207265706f727473206f662061206b696e6420616c6f6e672077697468207468652074696d6520746865792068617070656e65642e20416c6c207265706f7274732061726520736f72746564206279207468652074696d65206f66206f6666656e63652e204e6f74652074686174207468652061637475616c2074797065206f662074686973206d617070696e6720697320605665633c75383e602c207468697320697320626563617573652076616c756573206f6620646966666572656e7420747970657320617265206e6f7420737570706f7274656420617420746865206d6f6d656e7420736f2077652061726520646f696e6720746865206d616e75616c2073657269616c697a6174696f6e2e204120766563746f72206f66207265706f727473206f66207468652073616d65206b696e6420746861742068617070656e6564206174207468652073616d652074696d6520736c6f742e204465666572726564207265706f72747320746861742068617665206265656e2072656a656374656420627920746865206f6666656e63652068616e646c657220616e64206e65656420746f206265207375626d69747465642061742061206c617465722074696d652e20546865207072696d61727920737472756374757265207468617420686f6c647320616c6c206f6666656e6365207265636f726473206b65796564206279207265706f7274206964656e746966696572732e6772616e6470613a65717569766f6361706172613a646f75626c652d766f7465626162653a65717569766f636174696f4e6f745472616e73666572496e5573654e6f744f776e65724e6f7441737369676e65645065726d616e656e7400000000000000b86b10000500000000000000c06b1000010000000000000000000000d86b1000130000000000000000000000d0e010000800000000000000706c1000020000000000000000000000a06c1000150000000000000000000000486d10000400000000000000c06b10000100000000000000000000004c6d1000130000000000000000000000c4e210000e00000000000000e46d10000300000000000000000000002c6e1000160000000000000000000000dc6e10000600000000000000c06b1000010000000000000000000000e46e10001200000000000000636c61696d000000000000005ca311000500000000000000647310000f000000567610002700000054e01100000000007d7610003800000054e0110000000000b8a611003400000054e0110000000000b57610003d00000054e01100000000008a7210002500000054e0110000000000a9a211000b00000010d610000a0000009070100027000000ad74100019000000e8b010000d000000d470100014000000f276100019000000017110002500000027a311000c000000000000008460110003000000000000003aa311000c000000000000005ca311000500000000000000647310000f000000df74100058000000377510002f00000054e0110000000000b8a611003400000054e0110000000000667510004a000000e17110005800000054e01100000000008a7210002500000054e0110000000000a9a211000b00000010d610000a0000009070100027000000b07510001a000000e8b010000d000000d470100014000000ca75100019000000351411000d000000e3751000390000001c7610003a00000027a311000c00000066726565737310002600000054e0110000000000997310005800000054e0110000000000f17310005600000054e0110000000000477410004400000054e01100000000008b7410002200000054e0110000000000a9a211000b00000010d610000a0000009070100027000000ad74100019000000e8b010000d000000d470100014000000c674100019000000017110002500000027a311000c000000000000008460110003000000000000003aa311000c000000000000005ca311000500000000000000647310000f00000000000000dc6e100006000000000000006bbe11000400000026711000560000007c7110003b00000054e0110000000000c9d410003200000054e0110000000000b77110002a000000e171100058000000397210005100000054e01100000000008a7210002500000054e0110000000000a9a211000b00000010d610000a0000009070100027000000af7210001f000000e8b010000d000000d470100014000000ce72100019000000351411000d000000e77210003e000000257310003f00000027a311000c000000667265657a650000746f10005a00000054e0110000000000ce6f100057000000257010001c00000054e0110000000000417010002c00000054e01100000000006d7010002300000054e0110000000000a9a211000b00000010d610000a0000009070100027000000b77010001d000000e8b010000d000000d470100014000000e870100019000000017110002500000027a311000c00000020467265657a6520616e20696e64657820736f2069742077696c6c20616c7761797320706f696e7420746f207468652073656e646572206163636f756e742e205468697320636f6e73756d657320746865206465706f7369742e20546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e6420746865207369676e696e67206163636f756e74206d75737420686176652061206e6f6e2d66726f7a656e206163636f756e742060696e646578602e202d2060696e646578603a2074686520696e64657820746f2062652066726f7a656e20696e20706c6163652e20456d6974732060496e64657846726f7a656e60206966207375636365737366756c2e202d204f6e652073746f72616765206d75746174696f6e2028636f64656320604f28312960292e202d20557020746f206f6e6520736c617368206f7065726174696f6e2e202d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d202d2042617365205765696768743a2033302e383620c2b573202d204442205765696768743a203120526561642f577269746520284163636f756e74732920466f72636520616e20696e64657820746f20616e206163636f756e742e205468697320646f65736e277420726571756972652061206465706f7369742e2049662074686520696e64657820697320616c72656164792068656c642c207468656e20616e79206465706f736974206973207265696d62757273656420746f206974732063757272656e74206f776e65722e202d2060696e646578603a2074686520696e64657820746f206265202872652d2961737369676e65642e202d20606e6577603a20746865206e6577206f776e6572206f662074686520696e6465782e20546869732066756e6374696f6e2069732061206e6f2d6f7020696620697420697320657175616c20746f2073656e6465722e202d2060667265657a65603a2069662073657420746f206074727565602c2077696c6c20667265657a652074686520696e64657820736f2069742063616e6e6f74206265207472616e736665727265642e20456d6974732060496e64657841737369676e656460206966207375636365737366756c2e202d20557020746f206f6e652072657365727665206f7065726174696f6e2e202d2042617365205765696768743a2032362e383320c2b573202020202d2052656164733a20496e6469636573204163636f756e74732c2053797374656d204163636f756e7420286f726967696e616c206f776e657229202020202d205772697465733a20496e6469636573204163636f756e74732c2053797374656d204163636f756e7420286f726967696e616c206f776e657229543a3a4163636f756e74496e646578204672656520757020616e20696e646578206f776e6564206279207468652073656e6465722e205061796d656e743a20416e792070726576696f7573206465706f73697420706c6163656420666f722074686520696e64657820697320756e726573657276656420696e207468652073656e646572206163636f756e742e20546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d757374206f776e2074686520696e6465782e202d2060696e646578603a2074686520696e64657820746f2062652066726565642e2054686973206d757374206265206f776e6564206279207468652073656e6465722e20456d6974732060496e646578467265656460206966207375636365737366756c2e202d204f6e652072657365727665206f7065726174696f6e2e202d2042617365205765696768743a2032352e353320c2b5732041737369676e20616e20696e64657820616c7265616479206f776e6564206279207468652073656e64657220746f20616e6f74686572206163636f756e742e205468652062616c616e6365207265736572766174696f6e206973206566666563746976656c79207472616e7366657272656420746f20746865206e6577206163636f756e742e202d2060696e646578603a2074686520696e64657820746f2062652072652d61737369676e65642e2054686973206d757374206265206f776e6564206279207468652073656e6465722e202d204f6e65207472616e73666572206f7065726174696f6e2e202d2042617365205765696768743a2033332e373420c2b573202020202d2052656164733a20496e6469636573204163636f756e74732c2053797374656d204163636f756e742028726563697069656e7429202020202d205772697465733a20496e6469636573204163636f756e74732c2053797374656d204163636f756e742028726563697069656e74292041737369676e20616e2070726576696f75736c7920756e61737369676e656420696e6465782e205061796d656e743a20604465706f736974602069732072657365727665642066726f6d207468652073656e646572206163636f756e742e202d2060696e646578603a2074686520696e64657820746f20626520636c61696d65642e2054686973206d757374206e6f7420626520696e207573652e202d2042617365205765696768743a2032382e363920c2b573000000000064771000080000000102000000000000647310000f000000000000006c771000220000000000000000000000000000000000000054e01100907710000000000000000000a07710000100000000000000000000004163636f756e747328543a3a4163636f756e7449642c2042616c616e63654f663c543e2c20626f6f6c29000019000000000000000100000032000000a87710002200000020546865206c6f6f6b75702066726f6d20696e64657820746f206163636f756e742e000000000000507810000d000000000000006078100002000000000000000000000070781000010000000000000000000000787810000a00000000000000847810000100000000000000000000008c781000010000000000000000000000947810000b00000000000000a0781000020000000000000000000000b07810000100000000000000496e64657841737369676e6564000000fbaf110009000000007910000c000000447910002b000000496e64657846726565640000007910000c0000000c79100038000000496e64657846726f7a656e00007910000c000000fbaf110009000000b8781000480000002041206163636f756e7420696e64657820686173206265656e2066726f7a656e20746f206974732063757272656e74206163636f756e742049442e205b77686f2c20696e6465785d4163636f756e74496e6465782041206163636f756e7420696e64657820686173206265656e2066726565642075702028756e61737369676e6564292e205b696e6465785d2041206163636f756e7420696e646578207761732061737369676e65642e205b77686f2c20696e6465785d576569676874546f6f4c6f77556e657870656374656454696d65706f696e7457726f6e6754696d65706f696e744e6f54696d65706f696e7453656e646572496e5369676e61746f726965735369676e61746f726965734f75744f664f72646572546f6f4d616e795369676e61746f72696573546f6f4665775369676e61746f726965734e6f417070726f76616c734e6565646564416c7265616479417070726f7665644d696e696d756d5468726573686f6c64416c726561647953746f7265640000000000e07a10001400000000000000f47a1000020000000000000000000000247b1000110000000000000000000000ac7b10000800000000000000b47b1000060000000000000000000000447c1000330000000000000000000000dc7d10001000000000000000ec7d1000050000000000000000000000647e10002700000000000000000000009c7f10000f00000000000000ac7f10000400000000000000000000000c8010001b0000000000000061735f6d756c74695f7468726573686f6c645f3100000000fa84100011000000000000005abe100011000000000000006aab110004000000000000006eab110017000000918d10005500000054e0110000000000b8a611003400000054e0110000000000e68d100050000000368e100041000000c68910002300000054e0110000000000778e10002f00000054e0110000000000a9a211000b000000a68e100047000000d78b100020000000ed8e100025000000128f1000120000006a8d10001300000027a311000c00000061735f6d756c7469000000006bbe1000090000000000000061a311000300000000000000fa84100011000000000000005abe100011000000000000005f8910000f000000000000006e89100021000000000000006aab110004000000000000007d8d10000a00000000000000878d10000a000000000000006bbe110004000000000000008f8910000a0000000000000089611100060000003e85100056000000948510003f00000054e0110000000000998910002d00000054e0110000000000d38510004c0000001f861000500000006f8610000e00000054e0110000000000b8a611003400000054e01100000000006c81100056000000c281100051000000138210001c0000007d86100057000000d4861000550000002987100036000000c68910002300000054e0110000000000e989100048000000318a10004700000054e0110000000000788a100057000000cf8a100056000000258b10003800000054e0110000000000a9a211000b0000005d8b100015000000e48210003400000018831000500000006883100052000000728b100049000000ba83100030000000ad87100036000000e38710003f000000e8b010000d000000bb8b10001c000000228810004c0000006e88100024000000928810002d000000d78b100020000000d8e710000f000000f78b1000380000002f8c100038000000678c1000380000009f8c100038000000351411000d000000d78c100049000000208d10004a0000006a8d10001300000027a311000c000000617070726f76655f61735f6d756c7469000000006bbe1000090000000000000061a311000300000000000000fa84100011000000000000005abe100011000000000000005f8910000f000000000000006e89100021000000000000002d85100009000000000000003685100008000000000000008f8910000a0000000000000089611100060000003e85100056000000948510003f00000054e0110000000000d38510004c0000001f861000500000006f8610000e00000054e0110000000000b8a611003400000054e01100000000006c81100056000000c281100051000000138210001c0000007d86100057000000d4861000550000002987100036000000a68210003400000054e01100000000005f8710004e00000054e0110000000000a9a211000b000000da8210000a000000e48210003400000018831000500000006883100052000000ba83100030000000ad87100036000000e38710003f000000e8b010000d000000228810004c0000006e88100024000000928810002d0000002984100023000000d8e710000f000000bf88100020000000df88100021000000351411000d000000008910002f0000002f8910003000000027a311000c00000063616e63656c5f61735f6d756c746900000000006bbe1000090000000000000061a311000300000000000000fa84100011000000000000005abe100011000000000000000b85100009000000000000001485100019000000000000002d85100009000000000000003685100008000000e4801000560000003a8110003200000054e0110000000000b8a611003400000054e01100000000006c81100056000000c281100051000000138210001c0000002f82100058000000878210001f000000a68210003400000054e0110000000000a9a211000b000000da8210000a000000e48210003400000018831000500000006883100052000000ba83100030000000e8b010000d000000ea831000220000000c8410001d00000029841000230000004c84100021000000351411000d0000006d84100046000000b38410004700000027a311000c0000002043616e63656c2061207072652d6578697374696e672c206f6e2d676f696e67206d756c7469736967207472616e73616374696f6e2e20416e79206465706f7369742072657365727665642070726576696f75736c7920666f722074686973206f7065726174696f6e2077696c6c20626520756e7265736572766564206f6e20737563636573732e202d20607468726573686f6c64603a2054686520746f74616c206e756d626572206f6620617070726f76616c7320666f722074686973206469737061746368206265666f72652069742069732065786563757465642e202d20606f746865725f7369676e61746f72696573603a20546865206163636f756e747320286f74686572207468616e207468652073656e646572292077686f2063616e20617070726f766520746869732064697370617463682e204d6179206e6f7420626520656d7074792e202d206074696d65706f696e74603a205468652074696d65706f696e742028626c6f636b206e756d62657220616e64207472616e73616374696f6e20696e64657829206f662074686520666972737420617070726f76616c207472616e73616374696f6e20666f7220746869732064697370617463682e202d206063616c6c5f68617368603a205468652068617368206f66207468652063616c6c20746f2062652065786563757465642e202d20604f285329602e202d20557020746f206f6e652062616c616e63652d72657365727665206f7220756e72657365727665206f7065726174696f6e2e202d204f6e6520706173737468726f756768206f7065726174696f6e2c206f6e6520696e736572742c20626f746820604f285329602077686572652060536020697320746865206e756d626572206f662020207369676e61746f726965732e206053602069732063617070656420627920604d61785369676e61746f72696573602c207769746820776569676874206265696e672070726f706f7274696f6e616c2e202d204f6e6520656e636f6465202620686173682c20626f7468206f6620636f6d706c657869747920604f285329602e202d20492f4f3a2031207265616420604f285329602c206f6e652072656d6f76652e202d2053746f726167653a2072656d6f766573206f6e65206974656d2e202d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d202d2042617365205765696768743a2033362e3037202b20302e313234202a205320202020202d20526561643a204d756c74697369672053746f726167652c205b43616c6c6572204163636f756e745d2c20526566756e64204163636f756e742c2043616c6c7320202020202d2057726974653a204d756c74697369672053746f726167652c205b43616c6c6572204163636f756e745d2c20526566756e64204163636f756e742c2043616c6c736f746865725f7369676e61746f7269657374696d65706f696e7454696d65706f696e743c543a3a426c6f636b4e756d6265723e63616c6c5f686173685b75383b2033325d20526567697374657220617070726f76616c20666f72206120646973706174636820746f206265206d6164652066726f6d20612064657465726d696e697374696320636f6d706f73697465206163636f756e7420696620617070726f766564206279206120746f74616c206f6620607468726573686f6c64202d203160206f6620606f746865725f7369676e61746f72696573602e205061796d656e743a20604465706f73697442617365602077696c6c20626520726573657276656420696620746869732069732074686520666972737420617070726f76616c2c20706c757320607468726573686f6c64602074696d657320604465706f736974466163746f72602e2049742069732072657475726e6564206f6e636520746869732064697370617463682068617070656e73206f722069732063616e63656c6c65642e202d20606d617962655f74696d65706f696e74603a20496620746869732069732074686520666972737420617070726f76616c2c207468656e2074686973206d75737420626520604e6f6e65602e204966206974206973206e6f742074686520666972737420617070726f76616c2c207468656e206974206d7573742062652060536f6d65602c2077697468207468652074696d65706f696e742028626c6f636b206e756d62657220616e64207472616e73616374696f6e20696e64657829206f662074686520666972737420617070726f76616c207472616e73616374696f6e2e204e4f54453a2049662074686973206973207468652066696e616c20617070726f76616c2c20796f752077696c6c2077616e7420746f20757365206061735f6d756c74696020696e73746561642e202d20557020746f206f6e652062696e6172792073656172636820616e6420696e736572742028604f286c6f6753202b20532960292e202d20492f4f3a2031207265616420604f285329602c20757020746f2031206d757461746520604f285329602e20557020746f206f6e652072656d6f76652e202d2053746f726167653a20696e7365727473206f6e65206974656d2c2076616c75652073697a6520626f756e64656420627920604d61785369676e61746f72696573602c207769746820612020206465706f7369742074616b656e20666f7220697473206c69666574696d65206f66202020604465706f73697442617365202b207468726573686f6c64202a204465706f736974466163746f72602e20202020202d204372656174653a2034342e3731202b20302e303838202a205320202020202d20417070726f76653a2033312e3438202b20302e313136202a205320202020202d20526561643a204d756c74697369672053746f726167652c205b43616c6c6572204163636f756e745d20202020202d2057726974653a204d756c74697369672053746f726167652c205b43616c6c6572204163636f756e745d6d617962655f74696d65706f696e744f7074696f6e3c54696d65706f696e743c543a3a426c6f636b4e756d6265723e3e6d61785f7765696768742049662074686572652061726520656e6f7567682c207468656e206469737061746368207468652063616c6c2e202d206063616c6c603a205468652063616c6c20746f2062652065786563757465642e204e4f54453a20556e6c6573732074686973206973207468652066696e616c20617070726f76616c2c20796f752077696c6c2067656e6572616c6c792077616e7420746f207573652060617070726f76655f61735f6d756c74696020696e73746561642c2073696e6365206974206f6e6c7920726571756972657320612068617368206f66207468652063616c6c2e20526573756c74206973206571756976616c656e7420746f20746865206469737061746368656420726573756c7420696620607468726573686f6c64602069732065786163746c79206031602e204f7468657277697365206f6e20737563636573732c20726573756c7420697320604f6b6020616e642074686520726573756c742066726f6d2074686520696e746572696f722063616c6c2c206966206974207761732065786563757465642c206d617920626520666f756e6420696e20746865206465706f736974656420604d756c7469736967457865637574656460206576656e742e202d20604f2853202b205a202b2043616c6c29602e202d204f6e652063616c6c20656e636f6465202620686173682c20626f7468206f6620636f6d706c657869747920604f285a296020776865726520605a602069732074782d6c656e2e202d2054686520776569676874206f6620746865206063616c6c602e202d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d20202020202d204372656174653a2020202020202020202034312e3839202b20302e313138202a2053202b202e303032202a205a20c2b57320202020202d2043726561746520772f2053746f72653a2035332e3537202b20302e313139202a2053202b202e303033202a205a20c2b57320202020202d20417070726f76653a20202020202020202033312e3339202b20302e313336202a2053202b202e303032202a205a20c2b57320202020202d20436f6d706c6574653a202020202020202033392e3934202b20302e323620202a2053202b202e303032202a205a20c2b57320202020202d2052656164733a204d756c74697369672053746f726167652c205b43616c6c6572204163636f756e745d2c2043616c6c7320286966206073746f72655f63616c6c602920202020202d205772697465733a204d756c74697369672053746f726167652c205b43616c6c6572204163636f756e745d2c2043616c6c7320286966206073746f72655f63616c6c6029202d20506c75732043616c6c205765696768744f706171756543616c6c73746f72655f63616c6c20496d6d6564696174656c792064697370617463682061206d756c74692d7369676e61747572652063616c6c207573696e6720612073696e676c6520617070726f76616c2066726f6d207468652063616c6c65722e202d20606f746865725f7369676e61746f72696573603a20546865206163636f756e747320286f74686572207468616e207468652073656e646572292077686f206172652070617274206f6620746865206d756c74692d7369676e61747572652c2062757420646f206e6f7420706172746963697061746520696e2074686520617070726f76616c2070726f636573732e20526573756c74206973206571756976616c656e7420746f20746865206469737061746368656420726573756c742e204f285a202b204329207768657265205a20697320746865206c656e677468206f66207468652063616c6c20616e6420432069747320657865637574696f6e207765696768742e202d2042617365205765696768743a2033332e3732202b20302e303032202a205a20c2b573202d204442205765696768743a204e6f6e6500000000d48f10000900000002050200000000003aa311000c00000000000000368510000800000000000000dd8f1000340000000000000054e0110014901000000000000000000024901000010000000000000000000000000000002c90100005000000010600000000000036851000080000000000000031901000280000000000000000000000000000000000000054e011005c901000000000000000000054e011000000000000000000000000004d756c7469736967734d756c74697369673c543a3a426c6f636b4e756d6265722c2042616c616e63654f663c543e2c20543a3a4163636f756e7449643e000000190000000000000001000000320000006c9010002500000043616c6c73284f706171756543616c6c2c20543a3a4163636f756e7449642c2042616c616e63654f663c543e29000000190000000000000001000000320000002054686520736574206f66206f70656e206d756c7469736967206f7065726174696f6e732e00000000000000449110000b00000000000000509110000300000000000000000000006891100001000000000000000000000070911000100000000000000080911000040000000000000000000000a0911000010000000000000000000000a89110001000000000000000b8911000050000000000000000000000e0911000010000000000000000000000e8911000110000000000000080911000040000000000000000000000fc91100001000000000000004e65774d756c746973696700fbaf110009000000fbaf110009000000c4921000080000002b931000450000004d756c7469736967417070726f76616cfbaf110009000000ae92100016000000fbaf110009000000c492100008000000cc9210005f0000004d756c74697369674578656375746564fbaf110009000000ae92100016000000fbaf110009000000c49210000800000046b011000e0000005a921000540000004d756c746973696743616e63656c6c656400000004921000560000002041206d756c7469736967206f7065726174696f6e20686173206265656e2063616e63656c6c65642e205b63616e63656c6c696e672c2074696d65706f696e742c206d756c74697369672c2063616c6c5f686173685d2041206d756c7469736967206f7065726174696f6e20686173206265656e2065786563757465642e205b617070726f76696e672c2074696d65706f696e742c206d756c74697369672c2063616c6c5f686173685d54696d65706f696e743c426c6f636b4e756d6265723e43616c6c486173682041206d756c7469736967206f7065726174696f6e20686173206265656e20617070726f76656420627920736f6d656f6e652e205b617070726f76696e672c2074696d65706f696e742c206d756c74697369672c2063616c6c5f686173685d2041206e6577206d756c7469736967206f7065726174696f6e2068617320626567756e2e205b617070726f76696e672c206d756c74697369672c2063616c6c5f686173685d00000000127a10001000000000000000f8941000010000000000000000000000037a10000f0000000000000000951000010000000000000000000000f2791000110000000000000008951000010000000000000000000000e1791000110000000000000010951000010000000000000000000000cf791000120000000000000018951000010000000000000000000000ba791000150000000000000020951000010000000000000000000000a7791000130000000000000028951000010000000000000000000000da991100080000000000000030951000010000000000000000000000bd6a10000800000000000000389510000100000000000000000000009c7910000b00000000000000409510000100000000000000000000008e7910000e00000000000000489510000100000000000000000000007b7910001300000000000000509510000100000000000000000000006f7910000c0000000000000058951000010000000000000000000000227a10000d000000000000006095100001000000000000004f98100020000000239810002c000000fb97100028000000d09710002b000000a49710002c00000060971000440000001c97100044000000e496100038000000989610004c0000005096100048000000049610004c000000c69510003e0000009195100035000000689510002900000020546865206461746120746f2062652073746f72656420697320616c72656164792073746f7265642e20546865206d6178696d756d2077656967687420696e666f726d6174696f6e2070726f76696465642077617320746f6f206c6f772e20412074696d65706f696e742077617320676976656e2c20796574206e6f206d756c7469736967206f7065726174696f6e20697320756e6465727761792e204120646966666572656e742074696d65706f696e742077617320676976656e20746f20746865206d756c7469736967206f7065726174696f6e207468617420697320756e6465727761792e204e6f2074696d65706f696e742077617320676976656e2c2079657420746865206d756c7469736967206f7065726174696f6e20697320616c726561647920756e6465727761792e204f6e6c7920746865206163636f756e742074686174206f726967696e616c6c79206372656174656420746865206d756c74697369672069732061626c6520746f2063616e63656c2069742e204d756c7469736967206f7065726174696f6e206e6f7420666f756e64207768656e20617474656d7074696e6720746f2063616e63656c2e205468652073656e6465722077617320636f6e7461696e656420696e20746865206f74686572207369676e61746f726965733b2069742073686f756c646e27742062652e20546865207369676e61746f7269657320776572652070726f7669646564206f7574206f66206f726465723b20746865792073686f756c64206265206f7264657265642e2054686572652061726520746f6f206d616e79207369676e61746f7269657320696e20746865206c6973742e2054686572652061726520746f6f20666577207369676e61746f7269657320696e20746865206c6973742e2043616c6c20646f65736e2774206e65656420616e7920286d6f72652920617070726f76616c732e2043616c6c20697320616c726561647920617070726f7665642062792074686973207369676e61746f72792e205468726573686f6c64206d7573742062652032206f7220677265617465722e66696e616c6e756d0058c111004000000094020000010000005468657265206973206f6e6c79206f6e6520666174616c206572726f723b20716564000019000000080000000400000040000000496e686572656e7420776974682073616d65206964656e74696669657220616c726561647920657869737473214e6f206f74686572206572726f72732061726520616363657074656420616674657220616e2068617264206572726f72215175657565644b65797356616c696461746f72730000617474656d707420746f20646976696465206279207a65726f000000c2d211006d00000082010000210000004475706c6963617465644b65794e6f4173736f63696174656456616c696461746f724964496e76616c696450726f6f664e6f4b657973000000000000ec9910000800000000000000f4991000020000000000000000000000249a10000e0000000000000000000000949a10000a0000000000000054e01100000000000000000000000000a09a10000c000000000000007365745f6b65797300000000f81211000400000000000000e39d10000700000000000000ea9d10000500000000000000ff7a110007000000a49c10003a000000de9c100048000000339b10003100000054e0110000000000649b10003500000054e0110000000000a9a211000b000000269d100015000000c69b1000560000003b9d10003c000000779d100029000000a09d100021000000c19d10002200000027a311000c00000070757267655f6b6579730000009b100033000000339b10003100000054e0110000000000649b10003500000054e0110000000000a9a211000b000000999b10002d000000c69b1000560000001c9c10003c000000589c100029000000819c10002300000027a311000c0000002052656d6f76657320616e792073657373696f6e206b6579287329206f66207468652066756e6374696f6e2063616c6c65722e205468697320646f65736e27742074616b652065666665637420756e74696c20746865206e6578742073657373696f6e2e20546865206469737061746368206f726967696e206f6620746869732066756e6374696f6e206d757374206265207369676e65642e202d20436f6d706c65786974793a20604f2831296020696e206e756d626572206f66206b65792074797065732e20202041637475616c20636f737420646570656e6473206f6e20746865206e756d626572206f66206c656e677468206f662060543a3a4b6579733a3a6b65795f6964732829602077686963682069732066697865642e202d20446252656164733a2060543a3a56616c696461746f7249644f66602c20604e6578744b657973602c20606f726967696e206163636f756e7460202d2044625772697465733a20604e6578744b657973602c20606f726967696e206163636f756e7460202d20446257726974657320706572206b65792069643a20604b65794f776e646572602053657473207468652073657373696f6e206b6579287329206f66207468652066756e6374696f6e2063616c6c657220746f20606b657973602e20416c6c6f777320616e206163636f756e7420746f20736574206974732073657373696f6e206b6579207072696f7220746f206265636f6d696e6720612076616c696461746f722e202d20436f6d706c65786974793a20604f28312960202d20446252656164733a20606f726967696e206163636f756e74602c2060543a3a56616c696461746f7249644f66602c20604e6578744b65797360202d2044625772697465733a20606f726967696e206163636f756e74602c20604e6578744b65797360202d204462526561647320706572206b65792069643a20604b65794f776e657260202d20446257726974657320706572206b65792069643a20604b65794f776e657260543a3a4b65797370726f6f660000000000249910000a000000000000000000000058a01000130000000000000000000000000000000000000000000000000000000000000054e011006ca0100000000000000000007ca010000100000000000000010000000000000084a010000c0000000000000000000000a47411000c0000000000000000000000000000000000000000000000000000000000000054e0110090a010000000000000000000a0a0100001000000000000000100000000000000a8a010000d00000000000000000000006bbe1100040000000000000000000000000000000000000000000000000000000000000054e01100b8a010000000000000000000c8a01000020000000000000001000000000000001a9910000a0000000000000000000000d8a010001e0000000000000000000000000000000000000000000000000000000000000054e01100f8a01000000000000000000008a110000200000000000000010000000000000018a110001200000000000000000000002aa11000080000000000000000000000000000000000000000000000000000000000000054e0110034a11000000000000000000044a11000030000000000000001000000000000005ca11000080000000105000000000000287b11000e00000000000000e39d1000070000000000000000000000000000000000000054e0110064a11000000000000000000074a11000010000000000000000000000000000007ca1100008000000010500000000000084a110001400000000000000287b11000e0000000000000000000000000000000000000054e0110098a110000000000000000000a8a110000100000000000000000000005665633c543a3a56616c696461746f7249643e001900000000000000010000002f000000a2a310001f00000043757272656e74496e6465781900000000000000010000002e00000084a310001e0000005175657565644368616e676564000000190000000000000001000000320000000da310004e0000005ba31000290000005665633c28543a3a56616c696461746f7249642c20543a3a4b657973293e00001900000000000000010000002f00000086a210004f000000d5a210003800000044697361626c656456616c696461746f72735665633c7533323e00001900000000000000010000004100000019a210002000000054e011000000000039a210004d0000004e6578744b65797319000000000000000100000032000000f2a11000270000004b65794f776e6572284b65795479706549642c205665633c75383e2919000000000000000100000032000000b0a110004200000020546865206f776e6572206f662061206b65792e20546865206b65792069732074686520604b657954797065496460202b2074686520656e636f646564206b65792e20546865206e6578742073657373696f6e206b65797320666f7220612076616c696461746f722e20496e6469636573206f662064697361626c65642076616c696461746f72732e205468652073657420697320636c6561726564207768656e20606f6e5f73657373696f6e5f656e64696e67602072657475726e732061206e657720736574206f66206964656e7469746965732e2054686520717565756564206b65797320666f7220746865206e6578742073657373696f6e2e205768656e20746865206e6578742073657373696f6e20626567696e732c207468657365206b6579732077696c6c206265207573656420746f2064657465726d696e65207468652076616c696461746f7227732073657373696f6e206b6579732e20547275652069662074686520756e6465726c79696e672065636f6e6f6d6963206964656e746974696573206f7220776569676874696e6720626568696e64207468652076616c696461746f727320686173206368616e67656420696e20746865207175657565642076616c696461746f72207365742e2043757272656e7420696e646578206f66207468652073657373696f6e2e205468652063757272656e7420736574206f662076616c696461746f72732e5374696c6c4163746976655468726573686f6c64416c7265616479566f756368656444656c6179506572696f644e6f74467269656e644e6f7453746172746564416c726561647953746172746564416c72656164795265636f76657261626c654e6f745265636f76657261626c654e6f74536f727465644d6178467269656e64734e6f74456e6f756768467269656e64735a65726f5468726573686f6c644e6f74416c6c6f776564416c726561647950726f78790000000000000004a610000c0000000000000010a6100002000000000000000000000040a610000d0000000000000000000000a8a610000d00000000000000b8a61000020000000000000000000000e8a610000d000000000000000000000050a710000f0000000000000060a71000030000000000000000000000a8a710001b000000000000000000000080a81000110000000000000094a81000010000000000000000000000aca810001600000000000000000000005ca910000e00000000000000b8a610000200000000000000000000006ca9100019000000000000000000000034aa10000e0000000000000094a8100001000000000000000000000044aa1000140000000000000000000000e4aa10000e00000000000000f4aa10000100000000000000000000000cab1000140000000000000000000000acab10000f0000000000000054e01100000000000000000000000000bcab100015000000000000000000000064ac1000100000000000000094a8100001000000000000000000000074ac10000b0000000000000061735f7265636f766572656400000000a2ba100007000000000000003aa311000c000000000000006aab110004000000000000006eab110017000000b4bf10002900000054e011000000000004ad10004500000049ad10003a00000054e0110000000000e8a711000c000000ddbf10004900000026c010004000000054e0110000000000a9a211000b00000066c01000250000008bc010004200000027a311000c0000007365745f7265636f766572656400000000000000b0bf100004000000000000003aa311000c0000000000000030b3100007000000000000003aa311000c00000080be100047000000c7be10001d00000054e0110000000000e4be10003200000054e0110000000000e8a711000c00000016bf10002e00000044bf10004700000054e0110000000000a9a211000b0000008bbf100019000000a4bf10000c00000027a311000c0000006372656174655f7265636f76657279000000000053be100007000000000000005abe100011000000000000006bbe1000090000000000000061a31100030000000000000074be10000c0000000000000020be11000e000000a9ba10005700000054e011000000000000bb10004c0000004cbb1000520000009ebb10002f00000054e0110000000000b8a611003400000054e0110000000000e8a711000c000000cdbb10004900000016bc1000350000004bbc10004c00000097bc100047000000debc10002500000003bd10004f00000052bd10003a00000054e0110000000000a9a211000b0000008cbd10001a000000a6bd10004b000000f1bd10003b00000060ba1000270000002cbe100027000000e8b010000d00000054e0110000000000f5b010001b00000027a311000c000000696e6974696174655f7265636f7665727900000000000000a2ba100007000000000000003aa311000c00000050b810003b00000054e01100000000008bb8100047000000d2b81000490000001bb910002e00000054e0110000000000b8a611003400000054e0110000000000e8a711000c00000049b91000450000008eb910004000000054e0110000000000a9a211000b000000ceb910003e0000000cba10005400000060ba1000270000007fb510003900000087ba10001b000000e8b010000d00000054e0110000000000f5b010001b00000027a311000c000000766f7563685f7265636f766572790000fab510004a00000044b610001a00000054e01100000000005eb610004a000000a8b610001d00000054e0110000000000e8a711000c000000c5b6100035000000fab61000440000003eb710001500000054e011000000000053b71000490000009cb710000900000054e0110000000000a9a211000b000000b1b410003f000000f0b410004700000037b5100048000000a5b710003b000000e0b7100047000000b8b5100027000000e8b010000d00000054e011000000000027b810002900000027a311000c000000636c61696d5f7265636f76657279000037b310003d00000054e011000000000074b310004b000000bfb310004700000006b410004c00000054e0110000000000e8a711000c00000052b410004b0000009db410001400000054e0110000000000a9a211000b000000b1b410003f000000f0b410004700000037b51000480000007fb5100039000000b8b5100027000000e8b010000d00000054e0110000000000dfb510001b00000027a311000c000000636c6f73655f7265636f7665727900000000000030b3100007000000000000003aa311000c00000010b110004500000055b110001a00000054e01100000000006fb1100048000000b7b110003e00000054e011000000000097af100041000000f5b110003c00000054e0110000000000e8a711000c00000031b210004400000054e0110000000000a9a211000b00000075b210002100000096b210004f000000e5b2100030000000e8b010000d00000054e011000000000015b310001b00000027a311000c00000072656d6f76655f7265636f76657279000dae10005700000054e011000000000064ae100045000000a9ae10004200000054e0110000000000ebae10004900000034af1000260000005aaf10003d00000054e011000000000097af100041000000d8af10003900000054e0110000000000a9a211000b00000011b010001800000029b010004a00000073b010004e000000c1b0100027000000e8b010000d00000054e0110000000000f5b010001b00000027a311000c00000063616e63656c5f7265636f7665726564ccac10003800000054e011000000000004ad10004500000049ad10003a00000054e0110000000000e8a711000c00000083ad10004600000054e0110000000000a9a211000b000000c9ad10004400000027a311000c0000002043616e63656c20746865206162696c69747920746f20757365206061735f7265636f76657265646020666f7220606163636f756e74602e20546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207265676973746572656420746f2062652061626c6520746f206d616b652063616c6c73206f6e20626568616c66206f6620746865207265636f7665726564206163636f756e742e202d20606163636f756e74603a20546865207265636f7665726564206163636f756e7420796f75206172652061626c6520746f2063616c6c206f6e2d626568616c662d6f662e202d204f6e652073746f72616765206d75746174696f6e20746f20636865636b206163636f756e74206973207265636f7665726564206279206077686f602e204f2831292052656d6f766520746865207265636f766572792070726f6365737320666f7220796f7572206163636f756e742e205265636f7665726564206163636f756e747320617265207374696c6c2061636365737369626c652e204e4f54453a205468652075736572206d757374206d616b65207375726520746f2063616c6c2060636c6f73655f7265636f7665727960206f6e20616c6c20616374697665207265636f7665727920617474656d707473206265666f72652063616c6c696e6720746869732066756e6374696f6e20656c73652069742077696c6c206661696c2e205061796d656e743a2042792063616c6c696e6720746869732066756e6374696f6e20746865207265636f76657261626c65206163636f756e742077696c6c20756e72657365727665207468656972207265636f7665727920636f6e66696775726174696f6e206465706f7369742e202860436f6e6669674465706f7369744261736560202b2060467269656e644465706f736974466163746f7260202a20235f6f665f667269656e64732920546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64206d7573742062652061207265636f76657261626c65206163636f756e742028692e652e206861732061207265636f7665727920636f6e66696775726174696f6e292e204b65793a204620286c656e206f6620667269656e647329202d204f6e652073746f72616765207265616420746f206765742074686520707265666978206974657261746f7220666f7220616374697665207265636f7665726965732e204f283129202d204f6e652073746f7261676520726561642f72656d6f766520746f2067657420746865207265636f7665727920636f6e66696775726174696f6e2e204f2831292c20436f646563204f284629202d204f6e652062616c616e63652063616c6c20746f20756e72657365727665642e204f285829202d204f6e65206576656e742e20546f74616c20436f6d706c65786974793a204f2846202b2058292041732074686520636f6e74726f6c6c6572206f662061207265636f76657261626c65206163636f756e742c20636c6f736520616e20616374697665207265636f766572792070726f6365737320666f7220796f7572206163636f756e742e205061796d656e743a2042792063616c6c696e6720746869732066756e6374696f6e2c20746865207265636f76657261626c65206163636f756e742077696c6c207265636569766520746865207265636f76657279206465706f73697420605265636f766572794465706f7369746020706c616365642062792074686520726573637565722e207265636f76657261626c65206163636f756e74207769746820616e20616374697665207265636f766572792070726f6365737320666f722069742e202d206072657363756572603a20546865206163636f756e7420747279696e6720746f207265736375652074686973207265636f76657261626c65206163636f756e742e204b65793a205620286c656e206f6620766f756368696e6720667269656e647329202d204f6e652073746f7261676520726561642f72656d6f766520746f206765742074686520616374697665207265636f766572792070726f636573732e204f2831292c20436f646563204f285629202d204f6e652062616c616e63652063616c6c20746f20726570617472696174652072657365727665642e204f28582920546f74616c20436f6d706c65786974793a204f2856202b2058297265736375657220416c6c6f772061207375636365737366756c207265736375657220746f20636c61696d207468656972207265636f7665726564206163636f756e742e20546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64206d7573742062652061202272657363756572222077686f20686173207375636365737366756c6c7920636f6d706c6574656420746865206163636f756e74207265636f766572792070726f636573733a20636f6c6c656374656420607468726573686f6c6460206f72206d6f726520766f75636865732c20776169746564206064656c61795f706572696f646020626c6f636b732073696e636520696e6974696174696f6e2e202d20606163636f756e74603a20546865206c6f7374206163636f756e74207468617420796f752077616e7420746f20636c61696d20686173206265656e207375636365737366756c6c792020207265636f766572656420627920796f752e204b65793a204620286c656e206f6620667269656e647320696e20636f6e666967292c205620286c656e206f6620766f756368696e6720667269656e647329202d204f6e652073746f72616765207265616420746f2067657420746865207265636f7665727920636f6e66696775726174696f6e2e204f2831292c20436f646563204f284629202d204f6e652073746f72616765207265616420746f206765742074686520616374697665207265636f766572792070726f636573732e204f2831292c20436f646563204f285629202d204f6e652073746f72616765207265616420746f20676574207468652063757272656e7420626c6f636b206e756d6265722e204f283129202d204f6e652073746f726167652077726974652e204f2831292c20436f646563204f2856292e20546f74616c20436f6d706c65786974793a204f2846202b20562920416c6c6f7720612022667269656e6422206f662061207265636f76657261626c65206163636f756e7420746f20766f75636820666f7220616e20616374697665207265636f766572792070726f6365737320666f722074686174206163636f756e742e20546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64206d75737420626520612022667269656e642220666f7220746865207265636f76657261626c65206163636f756e742e202d20606c6f7374603a20546865206c6f7374206163636f756e74207468617420796f752077616e7420746f207265636f7665722e202d206072657363756572603a20546865206163636f756e7420747279696e6720746f2072657363756520746865206c6f7374206163636f756e74207468617420796f7520202077616e7420746f20766f75636820666f722e2054686520636f6d62696e6174696f6e206f662074686573652074776f20706172616d6574657273206d75737420706f696e7420746f20616e20616374697665207265636f766572792070726f636573732e202d204f6e652062696e6172792073656172636820746f20636f6e6669726d2063616c6c6572206973206120667269656e642e204f286c6f674629202d204f6e652062696e6172792073656172636820746f20636f6e6669726d2063616c6c657220686173206e6f7420616c726561647920766f75636865642e204f286c6f67562920546f74616c20436f6d706c65786974793a204f2846202b206c6f6746202b2056202b206c6f67562920496e697469617465207468652070726f6365737320666f72207265636f766572696e672061207265636f76657261626c65206163636f756e742e205061796d656e743a20605265636f766572794465706f736974602062616c616e63652077696c6c20626520726573657276656420666f7220696e6974696174696e6720746865207265636f766572792070726f636573732e2054686973206465706f7369742077696c6c20616c7761797320626520726570617472696174656420746f20746865206163636f756e7420747279696e6720746f206265207265636f76657265642e205365652060636c6f73655f7265636f76657279602e202d20606163636f756e74603a20546865206c6f7374206163636f756e74207468617420796f752077616e7420746f207265636f7665722e2054686973206163636f756e742020206e6565647320746f206265207265636f76657261626c652028692e652e20686176652061207265636f7665727920636f6e66696775726174696f6e292e202d204f6e652073746f72616765207265616420746f20636865636b2074686174206163636f756e74206973207265636f76657261626c652e204f284629202d204f6e652073746f72616765207265616420746f20636865636b20746861742074686973207265636f766572792070726f63657373206861736e277420616c726561647920737461727465642e204f283129202d204f6e652063757272656e63792072657365727665206f7065726174696f6e2e204f285829202d204f6e652073746f726167652077726974652e204f2831292e6163636f756e74204372656174652061207265636f7665727920636f6e66696775726174696f6e20666f7220796f7572206163636f756e742e2054686973206d616b657320796f7572206163636f756e74207265636f76657261626c652e205061796d656e743a2060436f6e6669674465706f7369744261736560202b2060467269656e644465706f736974466163746f7260202a20235f6f665f667269656e64732062616c616e63652077696c6c20626520726573657276656420666f722073746f72696e6720746865207265636f7665727920636f6e66696775726174696f6e2e2054686973206465706f7369742069732072657475726e656420696e2066756c6c207768656e2074686520757365722063616c6c73206072656d6f76655f7265636f76657279602e202d2060667269656e6473603a2041206c697374206f6620667269656e647320796f7520747275737420746f20766f75636820666f72207265636f7665727920617474656d7074732e20202053686f756c64206265206f72646572656420616e6420636f6e7461696e206e6f206475706c69636174652076616c7565732e202d20607468726573686f6c64603a20546865206e756d626572206f6620667269656e64732074686174206d75737420766f75636820666f722061207265636f7665727920617474656d70742020206265666f726520746865206163636f756e742063616e206265207265636f76657265642e2053686f756c64206265206c657373207468616e206f7220657175616c20746f202020746865206c656e677468206f6620746865206c697374206f6620667269656e64732e202d206064656c61795f706572696f64603a20546865206e756d626572206f6620626c6f636b732061667465722061207265636f7665727920617474656d707420697320696e697469616c697a656420202074686174206e6565647320746f2070617373206265666f726520746865206163636f756e742063616e206265207265636f76657265642e202d204b65793a204620286c656e206f6620667269656e647329202d204f6e652073746f72616765207265616420746f20636865636b2074686174206163636f756e74206973206e6f7420616c7265616479207265636f76657261626c652e204f2831292e202d204120636865636b20746861742074686520667269656e6473206c69737420697320736f7274656420616e6420756e697175652e204f284629202d204f6e652073746f726167652077726974652e204f2831292e20436f646563204f2846292e667269656e64735665633c543a3a4163636f756e7449643e7468726573686f6c6464656c61795f706572696f6420416c6c6f7720524f4f5420746f2062797061737320746865207265636f766572792070726f6365737320616e642073657420616e20612072657363756572206163636f756e7420666f722061206c6f7374206163636f756e74206469726563746c792e20546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f524f4f545f2e202d20606c6f7374603a2054686520226c6f7374206163636f756e742220746f206265207265636f76657265642e202d206072657363756572603a20546865202272657363756572206163636f756e74222077686963682063616e2063616c6c20617320746865206c6f7374206163636f756e742e202d204f6e652073746f72616765207772697465204f283129202d204f6e65206576656e746c6f73742053656e6420612063616c6c207468726f7567682061207265636f7665726564206163636f756e742e202d20606163636f756e74603a20546865207265636f7665726564206163636f756e7420796f752077616e7420746f206d616b6520612063616c6c206f6e2d626568616c662d6f662e202d206063616c6c603a205468652063616c6c20796f752077616e7420746f206d616b65207769746820746865207265636f7665726564206163636f756e742e202d2054686520776569676874206f6620746865206063616c6c60202b2031302c3030302e202d204f6e652073746f72616765206c6f6f6b757020746f20636865636b206163636f756e74206973207265636f7665726564206279206077686f602e204f28312900000000000000d8c110000b00000001050000000000003aa311000c00000000000000e3c110003a0000000000000000000000000000000000000054e0110020c21000000000000000000030c210000100000000000000000000000000000038c210001000000002050500000000003aa311000c000000000000003aa311000c0000000000000048c210003a0000000000000054e0110084c21000000000000000000094c2100004000000000000000000000000000000b5c611000500000001020000000000003aa311000c000000000000003aa311000c0000000000000000000000000000000000000054e01100b4c210000000000000000000c4c210000300000000000000000000005265636f76657261626c655265636f76657279436f6e6669673c543a3a426c6f636b4e756d6265722c2042616c616e63654f663c543e2c20543a3a4163636f756e7449643e00000019000000000000000100000032000000c8c31000420000004163746976655265636f7665726965734163746976655265636f766572793c543a3a426c6f636b4e756d6265722c2042616c616e63654f663c543e2c20543a3a4163636f756e7449643e0000190000000000000001000000320000003ec310001a00000054e011000000000058c31000450000009dc310002b00000019000000000000000100000032000000dcc210002400000054e011000000000000c310003e00000020546865206c697374206f6620616c6c6f7765642070726f7879206163636f756e74732e204d61702066726f6d2074686520757365722077686f2063616e2061636365737320697420746f20746865207265636f7665726564206163636f756e742e20416374697665207265636f7665727920617474656d7074732e204669727374206163636f756e7420697320746865206163636f756e7420746f206265207265636f76657265642c20616e6420746865207365636f6e64206163636f756e7420697320746865207573657220747279696e6720746f207265636f76657220746865206163636f756e742e2054686520736574206f66207265636f76657261626c65206163636f756e747320616e64207468656972207265636f7665727920636f6e66696775726174696f6e2e000000000000ecc4100011000000000000008cad11000c0000000000000054e0110000c51000000000000000000010c5100001000000000000000000000018c5100013000000000000008cad11000c0000000000000054e011002cc5100000000000000000003cc5100001000000000000000000000038a410000a0000000000000061a31100030000000000000054e0110044c51000000000000000000054c510000100000000000000000000005cc510000f000000000000008cad11000c0000000000000054e011006cc5100000000000000000007cc510000100000000000000436f6e6669674465706f736974426173650000001900000000000000010000004200000068c6100055000000467269656e644465706f736974466163746f7200190000000000000001000000430000000ec610005a00000019000000000000000100000044000000cbc51000430000005265636f766572794465706f736974001900000000000000010000004200000084c510004700000020546865206261736520616d6f756e74206f662063757272656e6379206e656564656420746f207265736572766520666f72207374617274696e672061207265636f766572792e20546865206d6178696d756d20616d6f756e74206f6620667269656e647320616c6c6f77656420696e2061207265636f7665727920636f6e66696775726174696f6e2e2054686520616d6f756e74206f662063757272656e6379206e656564656420706572206164646974696f6e616c2075736572207768656e206372656174696e672061207265636f7665727920636f6e66696775726174696f6e2e20546865206261736520616d6f756e74206f662063757272656e6379206e656564656420746f207265736572766520666f72206372656174696e672061207265636f7665727920636f6e66696775726174696f6e2e00000000000000c8c710000f00000000000000c8621100010000000000000000000000d8c71000010000000000000000000000e0c710001100000000000000f4c7100002000000000000000000000004c8100002000000000000000000000014c810000f0000000000000024c810000300000000000000000000003cc810000200000000000000000000004cc810000e00000000000000f4c710000200000000000000000000005cc810000200000000000000000000006cc810001000000000000000f4c710000200000000000000000000007cc810000200000000000000000000008cc810000f00000000000000c86211000100000000000000000000009cc8100001000000000000005265636f7665727943726561746564002dca1000350000005265636f76657279496e69746961746564000000fbaf110009000000fbaf110009000000e2c910004b0000001bc91000100000005265636f76657279566f756368656400fbaf110009000000fbaf110009000000fbaf11000900000073c9100057000000cac91000180000005265636f76657279436c6f73656400002bc91000480000001bc91000100000004163636f756e745265636f7665726564dac81000410000001bc91000100000005265636f7665727952656d6f76656400a4c81000360000002041207265636f766572792070726f6365737320686173206265656e2072656d6f76656420666f7220616e205b6163636f756e745d2e204c6f7374206163636f756e7420686173206265656e207375636365737366756c6c79207265636f76657265642062792072657363756572206163636f756e742e205b6c6f73742c20726573637565725d2041207265636f766572792070726f6365737320666f72206c6f7374206163636f756e742062792072657363756572206163636f756e7420686173206265656e20636c6f7365642e2041207265636f766572792070726f6365737320666f72206c6f7374206163636f756e742062792072657363756572206163636f756e7420686173206265656e20766f756368656420666f722062792073656e6465722e205b6c6f73742c20726573637565722c2073656e6465725d2041207265636f766572792070726f6365737320686173206265656e20696e6974696174656420666f72206c6f7374206163636f756e742062792072657363756572206163636f756e742e2041207265636f766572792070726f6365737320686173206265656e2073657420757020666f7220616e205b6163636f756e745d2e000000000000809910000c00000000000000d4ca1000010000000000000000000000699910001700000000000000dcca10000100000000000000000000005c9910000d00000000000000e4ca10000100000000000000000000008c9910000600000000000000ecca1000010000000000000060cb10001900000038cb1000280000001ecb10001a000000f4ca10002a000000204e6f206b65797320617265206173736f63696174656420776974682074686973206163636f756e742e2052656769737465726564206475706c6963617465206b65792e204e6f206173736f6369617465642076616c696461746f7220494420666f72206163636f756e742e20496e76616c6964206f776e6572736869702070726f6f662e000000000000005fa410000a000000000000003ccd100001000000000000000000000052a410000d0000000000000044cd100001000000000000000000000042a4100010000000000000004ccd100001000000000000000000000038a410000a0000000000000054cd10000100000000000000000000002fa4100009000000000000005ccd100001000000000000000000000021a410000e0000000000000064cd10000100000000000000000000000fa4100012000000000000006ccd100001000000000000000000000001a410000e0000000000000074cd1000010000000000000000000000f7a310000a000000000000007ccd1000010000000000000000000000eea31000090000000000000084cd1000010000000000000000000000e3a310000b000000000000008ccd1000010000000000000000000000d5a310000e0000000000000094cd1000010000000000000000000000cca3100009000000000000009ccd1000010000000000000000000000c1a310000b00000000000000a4cd1000010000000000000000000000e8df10000800000000000000accd100001000000000000000000000069a410000c000000000000006ccd100001000000000000006fd010003d0000004bd010002400000016d0100035000000ebcf10002b000000b8cf10003300000090cf10002800000064cf10002c0000002ccf100038000000f8ce100034000000cdce10002b00000086ce10004700000056ce1000300000001bce10003b000000dbcd100040000000b4cd1000270000002054686572652077617320616e206f766572666c6f7720696e20612063616c63756c6174696f6e20546865726520617265207374696c6c20616374697665207265636f7665727920617474656d7074732074686174206e65656420746f20626520636c6f73656420546865207468726573686f6c6420666f72207265636f766572696e672074686973206163636f756e7420686173206e6f74206265656e206d6574205468697320757365722068617320616c726561647920766f756368656420666f722074686973207265636f766572792054686520667269656e64206d757374207761697420756e74696c207468652064656c617920706572696f6420746f20766f75636820666f722074686973207265636f766572792054686973206163636f756e74206973206e6f74206120667269656e642077686f2063616e20766f7563682041207265636f766572792070726f6365737320686173206e6f74207374617274656420666f72207468697320726573637565722041207265636f766572792070726f636573732068617320616c7265616479207374617274656420666f722074686973206163636f756e742054686973206163636f756e7420697320616c72656164792073657420757020666f72207265636f766572792054686973206163636f756e74206973206e6f742073657420757020666f72207265636f7665727920467269656e6473206c697374206d75737420626520736f7274656420616e642066726565206f66206475706c69636174657320467269656e6473206c697374206d757374206265206c657373207468616e206d617820667269656e647320467269656e6473206c697374206d7573742062652067726561746572207468616e207a65726f20616e64207468726573686f6c64205468726573686f6c64206d7573742062652067726561746572207468616e207a65726f2055736572206973206e6f7420616c6c6f77656420746f206d616b6520612063616c6c206f6e20626568616c66206f662074686973206163636f756e744c6f6f6b75704167656e6461546f74616c49737375616e63654578697374696e6756657374696e675363686564756c654e6f7456657374696e67416d6f756e744c6f770000000000a0d11000040000000000000054e01100000000000000000000000000a4d110001100000000000000000000002cd210000a0000000000000038d2100001000000000000000000000050d21000130000000000000000000000e8d210000f00000000000000f8d2100002000000000000000000000028d31000120000000000000000000000b8d310001500000000000000d0d3100003000000000000000000000018d41000130000000000000076657374c4da10002f00000054e0110000000000f3da1000580000000fd910001a00000054e011000000000029d910003500000054e0110000000000a9a211000b00000010d610000a0000004bdb10001e00000069db10003f000000a8db100040000000d9d910000d000000e8db10003b00000023dc10003900000059da10006b00000027a311000c000000766573745f6f746865720000000000007dd710000600000000000000f35f1100230000008bd810002f00000054e0110000000000b8a611003400000054e0110000000000bad81000550000000fd910001a00000054e011000000000029d910003500000054e0110000000000a9a211000b00000010d610000a000000ced710001e0000005ed910003d0000009bd910003e000000d9d910000d000000e6d910003a00000020da10003900000059da10006b00000027a311000c0000007665737465645f7472616e7366657200000000007dd710000600000000000000f35f1100230000000000000083d7100008000000000000008bd7100029000000b4d710001a00000054e0110000000000b8a611003400000054e011000000000036d51000450000007bd5100040000000bbd510003d00000054e0110000000000f8d510001800000054e0110000000000a9a211000b00000010d610000a000000ced710001e000000ecd710004f0000003bd8100050000000d3d61000380000000bd710006c00000027a311000c000000666f7263655f7665737465645f7472616e736665720000000000000077d710000600000000000000f35f110023000000000000007dd710000600000000000000f35f1100230000000000000083d7100008000000000000008bd7100029000000b0d410001900000054e0110000000000c9d410003200000054e0110000000000fbd410003b00000036d51000450000007bd5100040000000bbd510003d00000054e0110000000000f8d510001800000054e0110000000000a9a211000b00000010d610000a0000001ad610001e00000038d610004d00000085d610004e000000d3d61000380000000bd710006c00000027a311000c00000020466f726365206120766573746564207472616e736665722e20546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f526f6f745f2e202d2060736f75726365603a20546865206163636f756e742077686f73652066756e64732073686f756c64206265207472616e736665727265642e202d2060746172676574603a20546865206163636f756e7420746861742073686f756c64206265207472616e7366657272656420746865207665737465642066756e64732e202d2060616d6f756e74603a2054686520616d6f756e74206f662066756e647320746f207472616e7366657220616e642077696c6c206265207665737465642e202d20607363686564756c65603a205468652076657374696e67207363686564756c6520617474616368656420746f20746865207472616e736665722e20456d697473206056657374696e6743726561746564602e202d20604f283129602e202d2044625765696768743a20342052656164732c20342057726974657320202020202d2052656164733a2056657374696e672053746f726167652c2042616c616e636573204c6f636b732c20546172676574204163636f756e742c20536f75726365204163636f756e7420202020202d205772697465733a2056657374696e672053746f726167652c2042616c616e636573204c6f636b732c20546172676574204163636f756e742c20536f75726365204163636f756e74202d2042656e63686d61726b3a203130302e33202b202e333635202a206c20c2b57320286d696e2073717561726520616e616c7973697329202d205573696e672031303020c2b5732066697865642e20417373756d696e67206c657373207468616e203530206c6f636b73206f6e20616e7920757365722c20656c7365207765206d61792077616e7420666163746f7220696e206e756d626572206f66206c6f636b732e736f757263657461726765747363686564756c6556657374696e67496e666f3c42616c616e63654f663c543e2c20543a3a426c6f636b4e756d6265723e20437265617465206120766573746564207472616e736665722e202d2044625765696768743a20332052656164732c20332057726974657320202020202d2052656164733a2056657374696e672053746f726167652c2042616c616e636573204c6f636b732c20546172676574204163636f756e742c205b53656e646572204163636f756e745d20202020202d205772697465733a2056657374696e672053746f726167652c2042616c616e636573204c6f636b732c20546172676574204163636f756e742c205b53656e646572204163636f756e745d20556e6c6f636b20616e79207665737465642066756e6473206f662061206074617267657460206163636f756e742e202d2060746172676574603a20546865206163636f756e742077686f7365207665737465642066756e64732073686f756c6420626520756e6c6f636b65642e204d75737420686176652066756e6473207374696c6c206c6f636b656420756e6465722074686973206d6f64756c652e20456d69747320656974686572206056657374696e67436f6d706c6574656460206f72206056657374696e6755706461746564602e20202020202d2052656164733a2056657374696e672053746f726167652c2042616c616e636573204c6f636b732c20546172676574204163636f756e7420202020202d205772697465733a2056657374696e672053746f726167652c2042616c616e636573204c6f636b732c20546172676574204163636f756e74202d2042656e63686d61726b3a20202020202d20556e6c6f636b65643a2034342e33202b202e323934202a206c20c2b57320286d696e2073717561726520616e616c797369732920202020202d204c6f636b65643a2034382e3136202b202e313033202a206c20c2b57320286d696e2073717561726520616e616c7973697329202d205573696e6720353020c2b5732066697865642e20417373756d696e67206c657373207468616e203530206c6f636b73206f6e20616e7920757365722c20656c7365207765206d61792077616e7420666163746f7220696e206e756d626572206f66206c6f636b732e20556e6c6f636b20616e79207665737465642066756e6473206f66207468652073656e646572206163636f756e742e20546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d75737420686176652066756e6473207374696c6c202d2044625765696768743a20322052656164732c20322057726974657320202020202d2052656164733a2056657374696e672053746f726167652c2042616c616e636573204c6f636b732c205b53656e646572204163636f756e745d20202020202d205772697465733a2056657374696e672053746f726167652c2042616c616e636573204c6f636b732c205b53656e646572204163636f756e745d20202020202d20556e6c6f636b65643a2034382e3736202b202e303438202a206c20c2b57320286d696e2073717561726520616e616c797369732920202020202d204c6f636b65643a2034342e3433202b202e323834202a206c20c2b57320286d696e2073717561726520616e616c797369732900000000a1c611000700000001020000000000003aa311000c000000000000008bd71000290000000000000000000000000000000000000054e01100b4dc10000000000000000000c4dc100001000000000000000000000019000000000000000100000032000000ccdc10003600000020496e666f726d6174696f6e20726567617264696e67207468652076657374696e67206f66206120676976656e206163636f756e742e0000000000003cdd100011000000000000008cad11000c0000000000000054e0110050dd1000000000000000000060dd100001000000000000004d696e5665737465645472616e736665720000001900000000000000010000004500000068dd10004700000020546865206d696e696d756d20616d6f756e7420746f206265207472616e7366657272656420746f206372656174652061206e65772076657374696e67207363686564756c652e000000000008de10000e0000000000000018de100002000000000000000000000028de100003000000000000000000000040de10001000000000000000c862110001000000000000000000000050de1000010000000000000056657374696e67557064617465640000fbaf1100090000007f4b1100070000009dde100056000000f3de1000470000003adf10001400000056657374696e67436f6d706c6574656458de10004500000020416e205b6163636f756e745d20686173206265636f6d652066756c6c79207665737465642e204e6f20667572746865722076657374696e672063616e2068617070656e2e2054686520616d6f756e742076657374656420686173206265656e20757064617465642e205468697320636f756c6420696e646963617465206d6f72652066756e64732061726520617661696c61626c652e205468652062616c616e636520676976656e2069732074686520616d6f756e74207768696368206973206c65667420756e7665737465642028616e642074687573206c6f636b6564292e20205b6163636f756e742c20756e7665737465645d00004600000050000000080000004700000048000000486973746f726963616c53657373696f6e730000460000005000000008000000490000004a0000004b0000004c0000004d0000004e0000004f0000006661696c656420746f20696e7365727420696e746f20747269654b656570416c6976654578697374656e7469616c4465706f736974496e73756666696369656e7442616c616e63654f766572666c6f774c69717569646974795265737472696374696f6e7356657374696e6742616c616e6365446561644163636f756e74000000000000d0e010000800000000000000d8e0100002000000000000000000000008e110001b0000000000000000000000e0e110000b00000000000000ece1100003000000000000000000000034e21000120000000000000000000000c4e210000e00000000000000d4e210000300000000000000000000001ce310000600000000000000000000004ce310001300000000000000d8e0100002000000000000000000000060e310000b000000000000007472616e7366657200000000f3e510000400000000000000f35f11002300000000000000f7e510000500000000000000fce510001300000054e810003600000054e01100000000008ae8100042000000cce810004800000014e910004500000059e910002d00000054e011000000000086e910004600000054e0110000000000a9a211000b000000cce910004c00000018ea1000330000004bea10005a00000054e0110000000000a5ea10001300000054e0110000000000b8ea1000540000000ceb10004b00000057eb1000350000008ceb100058000000e4eb10005200000036ec10003e00000074ec10002200000096ec100051000000e7ec1000370000001eed10004500000027a311000c0000007365745f62616c616e63650000000000f05f11000300000000000000f35f1100230000000000000040e810000800000000000000fce51000130000000000000048e810000c00000000000000fce51000130000000fe610002500000054e011000000000034e61000480000007ce6100042000000bee610004600000004e710004000000054e011000000000044e710002d00000054e0110000000000a9a211000b00000071e710002000000091e7100031000000c2e7100016000000d8e710000f000000e7e710001a00000001e81000190000001ae810002600000027a311000c000000666f7263655f7472616e7366657200000000000077d710000600000000000000f35f11002300000000000000f3e510000400000000000000f35f11002300000000000000f7e510000500000000000000fce510001300000020e510005400000074e510000b000000a9a211000b0000007fe5100050000000cfe510002400000027a311000c0000007472616e736665725f6b6565705f616c69766500b8e31000540000000ce410001000000054e01100000000001ce410002f00000054e01100000000004be4100031000000a9a211000b0000007ce410003a000000b6e4100018000000cee410004700000015e510000b0000002053616d6520617320746865205b607472616e73666572605d2063616c6c2c206275742077697468206120636865636b207468617420746865207472616e736665722077696c6c206e6f74206b696c6c20746865206f726967696e206163636f756e742e20393925206f66207468652074696d6520796f752077616e74205b607472616e73666572605d20696e73746561642e205b607472616e73666572605d3a207374727563742e4d6f64756c652e68746d6c236d6574686f642e7472616e73666572202d2043686561706572207468616e207472616e736665722062656361757365206163636f756e742063616e6e6f74206265206b696c6c65642e202d2042617365205765696768743a2035312e3420c2b573202d204442205765696768743a2031205265616420616e64203120577269746520746f2064657374202873656e64657220697320696e206f7665726c617920616c72656164792920233c2f7765696768743e2045786163746c7920617320607472616e73666572602c2065786365707420746865206f726967696e206d75737420626520726f6f7420616e642074686520736f75726365206163636f756e74206d6179206265207370656369666965642e202d2053616d65206173207472616e736665722c20627574206164646974696f6e616c207265616420616e6420777269746520626563617573652074686520736f75726365206163636f756e742069732020206e6f7420617373756d656420746f20626520696e20746865206f7665726c61792e6465737476616c7565436f6d706163743c543a3a42616c616e63653e20536574207468652062616c616e636573206f66206120676976656e206163636f756e742e20546869732077696c6c20616c74657220604672656542616c616e63656020616e642060526573657276656442616c616e63656020696e2073746f726167652e2069742077696c6c20616c736f2064656372656173652074686520746f74616c2069737375616e6365206f66207468652073797374656d202860546f74616c49737375616e636560292e20496620746865206e65772066726565206f722072657365727665642062616c616e63652069732062656c6f7720746865206578697374656e7469616c206465706f7369742c2069742077696c6c20726573657420746865206163636f756e74206e6f6e63652028606672616d655f73797374656d3a3a4163636f756e744e6f6e636560292e20546865206469737061746368206f726967696e20666f7220746869732063616c6c2069732060726f6f74602e202d20496e646570656e64656e74206f662074686520617267756d656e74732e202d20436f6e7461696e732061206c696d69746564206e756d626572206f6620726561647320616e64207772697465732e202d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d202d2042617365205765696768743a20202020202d204372656174696e673a2032372e353620c2b57320202020202d204b696c6c696e673a2033352e313120c2b573202d204442205765696768743a203120526561642c203120577269746520746f206077686f606e65775f667265656e65775f7265736572766564205472616e7366657220736f6d65206c697175696420667265652062616c616e636520746f20616e6f74686572206163636f756e742e20607472616e73666572602077696c6c207365742074686520604672656542616c616e636560206f66207468652073656e64657220616e642072656365697665722e2049742077696c6c2064656372656173652074686520746f74616c2069737375616e6365206f66207468652073797374656d2062792074686520605472616e73666572466565602e204966207468652073656e6465722773206163636f756e742069732062656c6f7720746865206578697374656e7469616c206465706f736974206173206120726573756c74206f6620746865207472616e736665722c20746865206163636f756e742077696c6c206265207265617065642e20546865206469737061746368206f726967696e20666f7220746869732063616c6c206d75737420626520605369676e65646020627920746865207472616e736163746f722e202d20446570656e64656e74206f6e20617267756d656e747320627574206e6f7420637269746963616c2c20676976656e2070726f70657220696d706c656d656e746174696f6e7320666f72202020696e70757420636f6e6669672074797065732e205365652072656c617465642066756e6374696f6e732062656c6f772e202d20497420636f6e7461696e732061206c696d69746564206e756d626572206f6620726561647320616e642077726974657320696e7465726e616c6c7920616e64206e6f20636f6d706c657820636f6d7075746174696f6e2e2052656c617465642066756e6374696f6e733a2020202d2060656e737572655f63616e5f77697468647261776020697320616c776179732063616c6c656420696e7465726e616c6c792062757420686173206120626f756e64656420636f6d706c65786974792e2020202d205472616e7366657272696e672062616c616e63657320746f206163636f756e7473207468617420646964206e6f74206578697374206265666f72652077696c6c20636175736520202020202060543a3a4f6e4e65774163636f756e743a3a6f6e5f6e65775f6163636f756e746020746f2062652063616c6c65642e2020202d2052656d6f76696e6720656e6f7567682066756e64732066726f6d20616e206163636f756e742077696c6c20747269676765722060543a3a4475737452656d6f76616c3a3a6f6e5f756e62616c616e636564602e2020202d20607472616e736665725f6b6565705f616c6976656020776f726b73207468652073616d652077617920617320607472616e73666572602c206275742068617320616e206164646974696f6e616c2020202020636865636b207468617420746865207472616e736665722077696c6c206e6f74206b696c6c20746865206f726967696e206163636f756e742e202d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d202d2042617365205765696768743a2037332e363420c2b5732c20776f7273742063617365207363656e6172696f20286163636f756e7420637265617465642c206163636f756e742072656d6f76656429202d204442205765696768743a2031205265616420616e64203120577269746520746f2064657374696e6174696f6e206163636f756e74202d204f726967696e206163636f756e7420697320616c726561647920696e206d656d6f72792c20736f206e6f204442206f7065726174696f6e7320666f72207468656d2e0000000000b8d010000d0000000000000000000000c4ee10000a0000000000000000000000000000000000000000000000000000000000000054e01100d0ee10000000000000000000e0ee100001000000000000000100000000000000620911000700000001020000000000003aa311000c00000000000000e8ee1000170000000000000000000000000000000000000054e0110000ef1000000000000000000010ef10000300000000000000010000000000000028ef10000500000001020000000000003aa311000c000000000000002def10001c0000000000000000000000000000000000000054e011004cef100000000000000000005cef100002000000000000000100000000000000205911000e00000000000000000000002e591100080000000000000000000000000000000000000000000000000000000000000054e011006cef100000000000000000007cef1000030000000000000001000000543a3a42616c616e6365000019000000000000000100000050000000bdf01000260000004163636f756e74446174613c543a3a42616c616e63653e001900000000000000010000005100000052f010001b00000054e01100000000006df01000500000004c6f636b735665633c42616c616e63654c6f636b3c543a3a42616c616e63653e3e00000019000000000000000100000052000000dbef10002e00000009f01000490000001900000000000000010000005300000094ef10001f00000054e0110000000000b3ef1000280000002053746f726167652076657273696f6e206f66207468652070616c6c65742e20546869732069732073657420746f2076322e302e3020666f72206e6577206e6574776f726b732e20416e79206c6971756964697479206c6f636b73206f6e20736f6d65206163636f756e742062616c616e6365732e204e4f54453a2053686f756c64206f6e6c79206265206163636573736564207768656e2073657474696e672c206368616e67696e6720616e642066726565696e672061206c6f636b2e205468652062616c616e6365206f6620616e206163636f756e742e204e4f54453a2054686973206973206f6e6c79207573656420696e20746865206361736520746861742074686973206d6f64756c65206973207573656420746f2073746f72652062616c616e6365732e2054686520746f74616c20756e6974732069737375656420696e207468652073797374656d2e0000000000c3df10001200000000000000c4ee10000a0000000000000054e011001cf1100000000000000000002cf1100001000000000000001900000000000000010000005400000034f110003500000020546865206d696e696d756d20616d6f756e7420726571756972656420746f206b65657020616e206163636f756e74206f70656e2e00000000000000ccf21000070000000000000018de1000020000000000000000000000d4f21000010000000000000000000000dcf21000080000000000000018de1000020000000000000000000000e4f21000020000000000000000000000f4f210000800000000000000fcf2100003000000000000000000000014f310000100000000000000000000001cf310000a0000000000000028f3100003000000000000000000000040f3100001000000000000000000000048f31000070000000000000018de100002000000000000000000000050f3100001000000000000000000000058f31000080000000000000018de100002000000000000000000000060f3100001000000000000000000000068f310000a0000000000000018de100002000000000000000000000074f310000100000000000000000000007cf31000120000000000000090f31000040000000000000000000000b0f310000300000000000000456e646f776564002ef6100047000000447573744c6f7374acf5100050000000fcf51000320000005472616e73666572fbaf110009000000fbaf1100090000007f4b11000700000086f510002600000042616c616e63655365740000fbaf1100090000007f4b1100070000007f4b11000700000055f51000310000004465706f736974000ff51000460000005265736572766564c9f4100046000000556e7265736572766564000081f41000480000005265736572766552657061747269617465640000fbaf110009000000fbaf1100090000007f4b1100070000007bf4100006000000c8f31000540000001cf410003700000053f410002800000020536f6d652062616c616e636520776173206d6f7665642066726f6d207468652072657365727665206f6620746865206669727374206163636f756e7420746f20746865207365636f6e64206163636f756e742e2046696e616c20617267756d656e7420696e64696361746573207468652064657374696e6174696f6e2062616c616e636520747970652e205b66726f6d2c20746f2c2062616c616e63652c2064657374696e6174696f6e5f7374617475735d53746174757320536f6d652062616c616e63652077617320756e726573657276656420286d6f7665642066726f6d20726573657276656420746f2066726565292e205b77686f2c2076616c75655d20536f6d652062616c616e63652077617320726573657276656420286d6f7665642066726f6d206672656520746f207265736572766564292e205b77686f2c2076616c75655d20536f6d6520616d6f756e7420776173206465706f73697465642028652e672e20666f72207472616e73616374696f6e2066656573292e205b77686f2c206465706f7369745d20412062616c616e6365207761732073657420627920726f6f742e205b77686f2c20667265652c2072657365727665645d205472616e73666572207375636365656465642e205b66726f6d2c20746f2c2076616c75655d20416e206163636f756e74207761732072656d6f7665642077686f73652062616c616e636520776173206e6f6e2d7a65726f206275742062656c6f77204578697374656e7469616c4465706f7369742c20726573756c74696e6720696e20616e206f75747269676874206c6f73732e205b6163636f756e742c2062616c616e63655d20416e206163636f756e74207761732063726561746564207769746820736f6d6520667265652062616c616e63652e205b6163636f756e742c20667265655f62616c616e63655d4661696c6564546f43616e63656c4661696c6564546f5363686564756c65546172676574426c6f636b4e756d626572496e5061737400000000000083d710000800000000000000b4f7100004000000000000000000000014f810000a000000000000000000000064f8100006000000000000006cf810000200000000000000000000009cf810000a0000000000000000000000ecf810000e00000000000000fcf8100005000000000000000000000074f910000a0000000000000000000000c4f910000c00000000000000d0f91000010000000000000000000000e8f910000a000000000000000000000038fa10000e0000000000000048fa1000040000000000000000000000a8fa1000050000000000000000000000d0fa10001400000000000000e4fa10000500000000000000000000005cfb1000050000000000000000000000ddfd1000040000000000000020be11000e00000000000000ccfb10000e00000000000000dafb1000280000000000000002fc100008000000000000000afc100012000000000000006aab110004000000000000006eab1100170000003ffe10001d00000054e0110000000000a9a211000b0000007cfc1000280000005cfe100024000000351411000d0000002cfe10001300000080fe10001400000094fe10004f00000027a311000c00000063616e63656c000000000000ddfd1000040000000000000020be11000e000000000000005ca3110005000000000000006890110003000000e1fd10002600000054e0110000000000a9a211000b0000007cfc10002800000007fe100025000000351411000d0000002cfe100013000000e4fc10001c00000000fd10005000000027a311000c0000007363686564756c655f6e616d6564000000000000c5fb10000200000000000000ff7a11000700000000000000ddfd1000040000000000000020be11000e00000000000000ccfb10000e00000000000000dafb1000280000000000000002fc100008000000000000000afc100012000000000000006aab110004000000000000006eab11001700000050fd10001700000054e0110000000000a9a211000b0000007cfc10002800000067fd100023000000351411000d000000c9fc10001b000000e4fc10001c0000008afd10005300000027a311000c00000063616e63656c5f6e616d656400000000c5fb10000200000000000000ff7a1100070000005dfc10001f00000054e0110000000000a9a211000b0000007cfc100028000000a4fc100025000000351411000d000000c9fc10001b000000e4fc10001c00000000fd10005000000027a311000c0000007363686564756c655f6166746572000000000000c7fb1000050000000000000020be11000e00000000000000ccfb10000e00000000000000dafb1000280000000000000002fc100008000000000000000afc100012000000000000006aab110004000000000000006eab1100170000001cfc10002b00000054e0110000000000a9a211000b00000047fc10001600000027a311000c0000007363686564756c655f6e616d65645f616674657200000000c5fb10000200000000000000ff7a11000700000000000000c7fb1000050000000000000020be11000e00000000000000ccfb10000e00000000000000dafb1000280000000000000002fc100008000000000000000afc100012000000000000006aab110004000000000000006eab11001700000084fb10002500000054e0110000000000a9a211000b000000a9fb10001c00000027a311000c000000205363686564756c652061206e616d6564207461736b20616674657220612064656c61792e2053616d65206173205b607363686564756c655f6e616d6564605d2e696461667465726d617962655f706572696f6469634f7074696f6e3c7363686564756c653a3a506572696f643c543a3a426c6f636b4e756d6265723e3e7072696f726974797363686564756c653a3a5072696f7269747920416e6f6e796d6f75736c79207363686564756c652061207461736b20616674657220612064656c61792e2053616d65206173205b607363686564756c65605d2e2043616e63656c2061206e616d6564207363686564756c6564207461736b2e202d2053203d204e756d626572206f6620616c7265616479207363686564756c65642063616c6c73202d2042617365205765696768743a2032342e3931202b20322e393037202a205320c2b57320202020202d20526561643a204167656e64612c204c6f6f6b757020202020202d2057726974653a204167656e64612c204c6f6f6b7570202d2057696c6c20757365206261736520776569676874206f66203130302077686963682073686f756c6420626520676f6f6420666f7220757020746f203330207363686564756c65642063616c6c73205363686564756c652061206e616d6564207461736b2e202d2042617365205765696768743a2032392e36202b202e313539202a205320c2b573202d2057696c6c20757365206261736520776569676874206f662033352077686963682073686f756c6420626520676f6f6420666f72206d6f7265207468616e203330207363686564756c65642063616c6c737768656e2043616e63656c20616e20616e6f6e796d6f75736c79207363686564756c6564207461736b2e202d2042617365205765696768743a2032322e3135202b20322e383639202a205320c2b57320202020202d20526561643a204167656e646120416e6f6e796d6f75736c79207363686564756c652061207461736b2e202d2042617365205765696768743a2032322e3239202b202e313236202a205320c2b57320202020202d2057726974653a204167656e6461202d2057696c6c20757365206261736520776569676874206f662032352077686963682073686f756c6420626520676f6f6420666f7220757020746f203330207363686564756c65642063616c6c730000000000b2d0100006000000010500000000000020be11000e00000000000000ecff10005b0000000000000000000000000000000000000054e011004800110000000000000000005800110001000000000000000100000000000000acd01000060000000105000000000000ff7a11000700000000000000600011001b0000000000000000000000000000000000000054e011007c00110000000000000000008c00110001000000000000000000000000000000205911000e00000000000000000000002e591100080000000000000000000000000000000000000000000000000000000000000054e01100940011000000000000000000a40011000300000000000000010000005665633c4f7074696f6e3c5363686564756c65643c3c542061732054726169743e3a3a43616c6c2c20543a3a426c6f636b4e756d6265722c20543a3a0a50616c6c6574734f726967696e2c20543a3a4163636f756e7449643e3e3e001900000000000000010000002f00000022011100530000005461736b416464726573733c543a3a426c6f636b4e756d6265723e0019000000000000000100000032000000e2001100400000001900000000000000010000005300000094ef10001f00000054e0110000000000bc00110026000000204e6577206e6574776f726b732073746172742077697468206c6173742076657273696f6e2e204c6f6f6b75702066726f6d206964656e7469747920746f2074686520626c6f636b206e756d62657220616e6420696e646578206f6620746865207461736b2e204974656d7320746f2062652065786563757465642c20696e64657865642062792074686520626c6f636b206e756d626572207468617420746865792073686f756c64206265206578656375746564206f6e2e00000000000000fc011100090000000000000008021100020000000000000000000000180211000100000000000000000000002002110008000000000000000802110002000000000000000000000028021100010000000000000000000000300211000a000000000000003c0211000300000000000000000000005402110001000000000000005363686564756c6564000000f10211000b0000006890110003000000ce0211002300000043616e63656c6564ac0211002200000044697370617463686564000085021100180000009d0211000f00000046b011000e0000005c02110029000000204469737061746368656420736f6d65207461736b2e205b7461736b2c2069642c20726573756c745d5461736b416464726573733c426c6f636b4e756d6265723e4f7074696f6e3c5665633c75383e3e2043616e63656c656420736f6d65207461736b2e205b7768656e2c20696e6465785d205363686564756c656420736f6d65207461736b2e205b7768656e2c20696e6465785d426c6f636b4e756d62657204031100260000005375626d6974746564204752414e4450412065717569766f636174696f6e207265706f72742e0000e703110016000000fd03110016000000b40311002d000000e103110003000000e40311000300000000000000200000000000000002000000000000000200000000000000030000000100000020000000080000000200000000000000000000000200000003000000020000002000000000000000020000000000000002000000000000000300000042697450747220726567696f6e2063616e6e6f7420777261702074686520616464726573732073706163653a20202b20203d204269745074722063616e6e6f7420616464726573732020626974733b20746865206d6178696d756d206973200000000000dcd010000a0000000000000068041100010000000000000000000000c5d01000170000000000000070041100010000000000000000000000e6d0100009000000000000007804110001000000000000001905110022000000c204110057000000800411004200000020416d6f756e74206265696e67207472616e7366657272656420697320746f6f206c6f7720746f2063726561746520612076657374696e67207363686564756c652e20416e206578697374696e672076657374696e67207363686564756c6520616c72656164792065786973747320666f722074686973206163636f756e7420746861742063616e6e6f7420626520636c6f6262657265642e20546865206163636f756e7420676976656e206973206e6f742076657374696e672e000000000083f6100010000000000000009005110001000000000000000000000075f610000e000000000000009805110001000000000000000000000093f610001700000000000000a00511000100000000000000f40511001a000000d205110022000000a80511002a00000020476976656e2074617267657420626c6f636b206e756d62657220697320696e2074686520706173742e204661696c656420746f2063616e63656c2061207363686564756c65642063616c6c204661696c656420746f207363686564756c6520612063616c6c00000000000005e010000e00000000000000f0061100010000000000000000000000f0df10001500000000000000f8061100010000000000000000000000e8df1000080000000000000000071100010000000000000000000000d5df1000130000000000000008071100010000000000000000000000c3df1000120000000000000010071100010000000000000000000000badf1000090000000000000018071100010000000000000000000000c5d0100017000000000000002007110001000000000000000000000013e010000b0000000000000028071100010000000000000052081100270000002008110032000000030811001d000000e50711001e000000aa0711003b0000008607110024000000530711003300000030071100230000002042656e6566696369617279206163636f756e74206d757374207072652d657869737420412076657374696e67207363686564756c6520616c72656164792065786973747320666f722074686973206163636f756e74205472616e736665722f7061796d656e7420776f756c64206b696c6c206163636f756e742056616c756520746f6f206c6f7720746f20637265617465206163636f756e742064756520746f206578697374656e7469616c206465706f7369742042616c616e636520746f6f206c6f7720746f2073656e642076616c756520476f7420616e206f766572666c6f7720616674657220616464696e67204163636f756e74206c6971756964697479207265737472696374696f6e732070726576656e74207769746864726177616c2056657374696e672062616c616e636520746f6f206869676820746f2073656e642076616c75657573657220646f6573206e6f74206861766520616e206578697374696e672076657374696e67207363686564756c653b20712e652e642e190000000c0000000400000055000000e00811005e0000001d01000012000000e00811005e00000046010000120000002f686f6d652f6261737469616e2f2e636172676f2f6769742f636865636b6f7574732f7375627374726174652d376530383433336434633337306132312f383730363363332f6672616d652f76657374696e672f7372632f6c69622e7273436865636b47656e65736973436865636b547856657273696f6e436865636b4e6f6e63654163636f756e74426c6f636b486173684e6f6e44656661756c74436f6d706f736974654661696c6564546f4578747261637452756e74696d6556657273696f6e5370656356657273696f6e4e65656473546f496e637265617365496e76616c6964537065634e616d654e6f6e5a65726f526566436f756e743a65787472696e7369635f696e6465784e756d626572446967657374506172656e744861736845787472696e73696373526f6f744576656e74734576656e74546f706963730000000000d80b11000a00000000000000e40b1100010000000000000000000000fc0b1100010000000000000000000000864b11000600000000000000040c11000100000000000000000000001c0c1100070000000000000000000000540c11000e00000000000000640c11000100000000000000000000007c0c1100080000000000000000000000bc0c11000800000000000000c40c1100010000000000000000000000dc0c11000a00000000000000000000002c0d11001700000000000000c40c1100010000000000000000000000440d1100080000000000000000000000840d110017000000000000009c0d1100010000000000000000000000b40d11000a0000000000000000000000040e11000b00000000000000100e1100010000000000000000000000280e1100080000000000000000000000680e11000c00000000000000740e11000100000000000000000000008c0e1100080000000000000000000000cc0e11000b00000000000000d80e1100020000000000000000000000080f11000b0000000000000000000000600f1100070000000000000054e01100000000000000000000000000680f11000a0000000000000066696c6c5f626c6f636b0000000000001818110006000000000000001e18110007000000d61711004200000000000000cf1711000700000000000000ff7a110007000000681711001b00000054e0110000000000a9a211000b00000035101100090000008317110038000000bb1711001400000027a311000c0000007365745f686561705f7061676573000000000000631711000500000000000000be8e110003000000e01611003f00000054e0110000000000a9a211000b00000035101100090000001f1711001300000032171100190000004b1711001800000027a311000c0000007365745f636f646500000000dc1611000400000000000000ff7a110007000000941511001a00000054e0110000000000a9a211000b000000ae1511004d0000000a15110022000000fb1511005e0000002c1511000b000000591611005f000000b81611002400000027a311000c0000007365745f636f64655f776974686f75745f636865636b73009f1411004700000054e0110000000000a9a211000b000000e6141100240000000a151100220000002c1511000b000000371511005d00000027a311000c0000007365745f6368616e6765735f747269655f636f6e66696700000000006c14110013000000000000007f14110020000000921311002800000054e0110000000000a9a211000b0000003510110009000000ba1311002c000000e6131100360000001c14110019000000351411000d000000421411002a00000027a311000c0000007365745f73746f726167650000000000801311000500000000000000851311000d000000041311001b00000054e0110000000000a9a211000b0000001f13110025000000441311001f000000631311001d000000de1211001a00000027a311000c0000006b696c6c5f73746f7261676500000000f81211000400000000000000fc121100080000004c1211001e00000054e0110000000000a9a211000b0000006a1211003f000000a912110019000000c21211001c000000de1211001a00000027a311000c0000006b696c6c5f70726566697800000000003e1211000600000000000000e861110003000000000000004412110008000000000000006890110003000000cd1011004500000054e0110000000000121111004f000000611111005000000054e0110000000000a9a211000b000000b111110037000000e811110019000000011211001d0000001e1211002000000027a311000c0000007375696369646500b80f110059000000111011002400000054e0110000000000a9a211000b00000035101100090000003e1011001f0000005d101100150000007210110017000000891011004400000027a311000c000000204b696c6c207468652073656e64696e67206163636f756e742c20617373756d696e6720746865726520617265206e6f207265666572656e636573206f75747374616e64696e6720616e642074686520636f6d706f73697465206461746120697320657175616c20746f206974732064656661756c742076616c75652e202d20604f28312960202d20312073746f72616765207265616420616e642064656c6574696f6e2e202d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2042617365205765696768743a20382e36323620c2b573204e6f2044422052656164206f72205772697465206f7065726174696f6e7320626563617573652063616c6c657220697320616c726561647920696e206f7665726c6179204b696c6c20616c6c2073746f72616765206974656d7320776974682061206b657920746861742073746172747320776974682074686520676976656e207072656669782e202a2a4e4f54453a2a2a2057652072656c79206f6e2074686520526f6f74206f726967696e20746f2070726f7669646520757320746865206e756d626572206f66207375626b65797320756e6465722074686520707265666978207765206172652072656d6f76696e6720746f2061636375726174656c792063616c63756c6174652074686520776569676874206f6620746869732066756e6374696f6e2e202d20604f285029602077686572652060506020616d6f756e74206f66206b657973207769746820707265666978206070726566697860202d206050602073746f726167652064656c6574696f6e732e202d2042617365205765696768743a20302e383334202a205020c2b573202d205772697465733a204e756d626572206f66207375626b657973202b20317072656669785f7375626b657973204b696c6c20736f6d65206974656d732066726f6d2073746f726167652e202d20604f28494b296020776865726520604960206c656e677468206f6620606b6579736020616e6420604b60206c656e677468206f66206f6e65206b6579202d206049602073746f726167652064656c6574696f6e732e202d2042617365205765696768743a202e333738202a206920c2b573202d205772697465733a204e756d626572206f66206974656d736b6579735665633c4b65793e2053657420736f6d65206974656d73206f662073746f726167652e202d20604f2849296020776865726520604960206c656e677468206f6620606974656d7360202d206049602073746f72616765207772697465732028604f28312960292e202d2042617365205765696768743a20302e353638202a206920c2b5736974656d735665633c4b657956616c75653e2053657420746865206e6577206368616e676573207472696520636f6e66696775726174696f6e2e202d20312073746f72616765207772697465206f722064656c6574652028636f64656320604f28312960292e202d20312063616c6c20746f20606465706f7369745f6c6f67603a20557365732060617070656e6460204150492c20736f204f283129202d2042617365205765696768743a20372e32313820c2b573202d204442205765696768743a20202020202d205772697465733a204368616e67657320547269652c2053797374656d204469676573746368616e6765735f747269655f636f6e6669674f7074696f6e3c4368616e67657354726965436f6e66696775726174696f6e3e2053657420746865206e65772072756e74696d6520636f646520776974686f757420646f696e6720616e7920636865636b73206f662074686520676976656e2060636f6465602e202d20604f2843296020776865726520604360206c656e677468206f662060636f646560202d20312073746f726167652077726974652028636f64656320604f28432960292e202d2031206576656e742e2054686520776569676874206f6620746869732066756e6374696f6e20697320646570656e64656e74206f6e207468652072756e74696d652e2057652077696c6c207472656174207468697320617320612066756c6c20626c6f636b2e2053657420746865206e65772072756e74696d6520636f64652e202d20604f2843202b2053296020776865726520604360206c656e677468206f662060636f64656020616e642060536020636f6d706c6578697479206f66206063616e5f7365745f636f646560202d20312063616c6c20746f206063616e5f7365745f636f6465603a20604f28532960202863616c6c73206073705f696f3a3a6d6973633a3a72756e74696d655f76657273696f6e6020776869636820697320657870656e73697665292e2054686520776569676874206f6620746869732066756e6374696f6e20697320646570656e64656e74206f6e207468652072756e74696d652c206275742067656e6572616c6c792074686973206973207665727920657870656e736976652e2057652077696c6c207472656174207468697320617320612066756c6c20626c6f636b2e636f64652053657420746865206e756d626572206f6620706167657320696e2074686520576562417373656d626c7920656e7669726f6e6d656e74277320686561702e202d20312073746f726167652077726974652e202d2042617365205765696768743a20312e34303520c2b573202d203120777269746520746f20484541505f50414745537061676573204d616b6520736f6d65206f6e2d636861696e2072656d61726b2e202d2042617365205765696768743a20302e36363520c2b5732c20696e646570656e64656e74206f662072656d61726b206c656e6774682e202d204e6f204442206f7065726174696f6e732e5f72656d61726b204120646973706174636820746861742077696c6c2066696c6c2074686520626c6f636b2077656967687420757020746f2074686520676976656e20726174696f2e5f726174696f50657262696c6c00000000000000620911000700000001020000000000003aa311000c00000000000000501d1100250000000000000000000000000000000000000054e01100781d11000000000000000000881d110001000000000000000100000000000000901d11000e000000000000000000000068901100030000000000000000000000000000000000000000000000000000000000000054e01100a01d11000000000000000000b01d110001000000000000000000000000000000b81d11000b0000000000000000000000c31d1100190000000000000000000000000000000000000000000000000000000000000054e01100dc1d11000000000000000000ec1d110001000000000000000100000000000000f41d110010000000000000000000000068901100030000000000000000000000000000000000000000000000000000000000000054e01100041e11000000000000000000141e1100010000000000000000000000000000006909110009000000010500000000000020be11000e000000000000001c1e1100070000000000000000000000000000000000000054e01100241e11000000000000000000341e1100010000000000000001000000000000003c1e11000d0000000105000000000000689011000300000000000000ff7a1100070000000000000000000000000000000000000054e011004c1e110000000000000000005c1e110001000000000000000100000000000000ea09110006000000000000000000000020be11000e0000000000000000000000000000000000000000000000000000000000000054e01100641e11000000000000000000741e110001000000000000000100000000000000f60911000a00000000000000000000001c1e1100070000000000000000000000000000000000000000000000000000000000000054e011007c1e110000000000000000008c1e110001000000000000000100000000000000000a11000e00000000000000000000001c1e1100070000000000000000000000000000000000000000000000000000000000000054e01100941e11000000000000000000a41e110001000000000000000100000000000000f0091100060000000000000000000000ac1e11000b0000000000000000000000000000000000000000000000000000000000000054e01100b81e11000000000000000000c81e1100010000000000000001000000000000000e0a1100060000000000000000000000d01e1100230000000000000000000000000000000000000000000000000000000000000054e01100f41e11000000000000000000041f1100010000000000000001000000000000000c1f11000a0000000000000000000000161f11000a0000000000000000000000000000000000000000000000000000000000000054e01100201f11000000000000000000301f110001000000000000000100000000000000140a11000b00000001020000000000001c1e11000700000000000000381f1100210000000000000000000000000000000000000054e011005c1f110000000000000000006c1f11000a000000000000000100000000000000bc1f1100120000000000000000000000ce1f1100160000000000000000000000000000000000000000000000000000000000000054e01100e41f11000000000000000000f41f110001000000000000000000000000000000fc1f11000e00000000000000000000000a201100050000000000000000000000000000000000000000000000000000000000000054e01100102011000000000000000000202011000100000000000000000000004163636f756e74496e666f3c543a3a496e6465782c20543a3a4163636f756e74446174613e000000190000000000000001000000560000001b2511003a00000045787472696e736963436f756e74000019000000000000000100000032000000ed2411002e000000426c6f636b576569676874776569676874733a3a45787472696e7369637357656967687419000000000000000100000057000000cb24110022000000416c6c45787472696e736963734c656e190000000000000001000000320000007b24110050000000543a3a486173680019000000000000000100000058000000552411002600000045787472696e736963446174610000001900000000000000010000003f000000062411004f0000001900000000000000010000002e000000c42311004200000019000000000000000100000058000000a82311001c0000001900000000000000010000005800000063231100450000004469676573744f663c543e001900000000000000010000002f000000272311003c0000005665633c4576656e745265636f72643c543a3a4576656e742c20543a3a486173683e3e001900000000000000010000002f000000ff221100280000004576656e74436f756e744576656e74496e6465781900000000000000010000002e000000d12211002e0000005665633c28543a3a426c6f636b4e756d6265722c204576656e74496e646578293e000000190000000000000001000000590000009f20110049000000e82011002500000054e01100000000000d211100540000006121110051000000b22111003900000054e0110000000000eb211100530000003e2211005300000091221100400000004c61737452756e74696d65557067726164654c61737452756e74696d6555706772616465496e666f190000000000000001000000320000004a20110055000000457865637574696f6e50686173655068617365001900000000000000010000003200000028201100220000002054686520657865637574696f6e207068617365206f662074686520626c6f636b2e2053746f726573207468652060737065635f76657273696f6e6020616e642060737065635f6e616d6560206f66207768656e20746865206c6173742072756e74696d6520757067726164652068617070656e65642e204d617070696e67206265747765656e206120746f7069632028726570726573656e74656420627920543a3a486173682920616e64206120766563746f72206f6620696e6465786573206f66206576656e747320696e2074686520603c4576656e74733c543e3e60206c6973742e20416c6c20746f70696320766563746f727320686176652064657465726d696e69737469632073746f72616765206c6f636174696f6e7320646570656e64696e67206f6e2074686520746f7069632e205468697320616c6c6f7773206c696768742d636c69656e747320746f206c6576657261676520746865206368616e67657320747269652073746f7261676520747261636b696e67206d656368616e69736d20616e6420696e2063617365206f66206368616e67657320666574636820746865206c697374206f66206576656e7473206f6620696e7465726573742e205468652076616c756520686173207468652074797065206028543a3a426c6f636b4e756d6265722c204576656e74496e646578296020626563617573652069662077652075736564206f6e6c79206a7573742074686520604576656e74496e64657860207468656e20696e20636173652069662074686520746f70696320686173207468652073616d6520636f6e74656e7473206f6e20746865206e65787420626c6f636b206e6f206e6f74696669636174696f6e2077696c6c20626520747269676765726564207468757320746865206576656e74206d69676874206265206c6f73742e20546865206e756d626572206f66206576656e747320696e2074686520604576656e74733c543e60206c6973742e204576656e7473206465706f736974656420666f72207468652063757272656e7420626c6f636b2e20446967657374206f66207468652063757272656e7420626c6f636b2c20616c736f2070617274206f662074686520626c6f636b206865616465722e2045787472696e7369637320726f6f74206f66207468652063757272656e7420626c6f636b2c20616c736f2070617274206f662074686520626c6f636b206865616465722e2048617368206f66207468652070726576696f757320626c6f636b2e205468652063757272656e7420626c6f636b206e756d626572206265696e672070726f6365737365642e205365742062792060657865637574655f626c6f636b602e2045787472696e73696373206461746120666f72207468652063757272656e7420626c6f636b20286d61707320616e2065787472696e736963277320696e64657820746f206974732064617461292e204d6170206f6620626c6f636b206e756d6265727320746f20626c6f636b206861736865732e20546f74616c206c656e6774682028696e2062797465732920666f7220616c6c2065787472696e736963732070757420746f6765746865722c20666f72207468652063757272656e7420626c6f636b2e205468652063757272656e742077656967687420666f722074686520626c6f636b2e20546f74616c2065787472696e7369637320636f756e7420666f72207468652063757272656e7420626c6f636b2e205468652066756c6c206163636f756e7420696e666f726d6174696f6e20666f72206120706172746963756c6172206163636f756e742049442e00000000000000a82611000e0000000000000020be11000e0000000000000054e01100b82611000000000000000000c8261100010000000000000000000000d0261100120000000000000089611100060000000000000054e01100e42611000000000000000000f4261100010000000000000000000000fc2611000800000000000000042711000f0000000000000054e01100142711000000000000000000242711000100000000000000000000002c271100140000000000000089611100060000000000000054e011004027110000000000000000005027110001000000000000000000000058271100130000000000000089611100060000000000000054e011006c27110000000000000000007c27110001000000000000000000000084271100120000000000000068901100030000000000000054e01100982711000000000000000000a82711000100000000000000426c6f636b48617368436f756e7400001900000000000000010000005a000000ed281100360000004d6178696d756d426c6f636b57656967687400001900000000000000010000005b000000ce2811001f000000446257656967687452756e74696d654462576569676874001900000000000000010000005c0000008c28110042000000426c6f636b457865637574696f6e5765696768741900000000000000010000005d000000382811005400000045787472696e73696342617365576569676874001900000000000000010000005e000000da2711005e0000004d6178696d756d426c6f636b4c656e67746800001900000000000000010000005f000000b02711002a00000020546865206d6178696d756d206c656e677468206f66206120626c6f636b2028696e206279746573292e20546865206261736520776569676874206f6620616e2045787472696e73696320696e2074686520626c6f636b2c20696e646570656e64656e74206f6620746865206f662065787472696e736963206265696e672065786563757465642e20546865206261736520776569676874206f6620657865637574696e67206120626c6f636b2c20696e646570656e64656e74206f6620746865207472616e73616374696f6e7320696e2074686520626c6f636b2e2054686520776569676874206f662072756e74696d65206461746162617365206f7065726174696f6e73207468652072756e74696d652063616e20696e766f6b652e20546865206d6178696d756d20776569676874206f66206120626c6f636b2e20546865206d6178696d756d206e756d626572206f6620626c6f636b7320746f20616c6c6f7720696e206d6f7274616c20657261732e4e6f646520697320636f6e6669677572656420746f20757365207468652073616d6520686173683b20716564001900000000000000010000001d000000802911005d0000001f0400000e000000802911005d00000027040000160000002f686f6d652f6261737469616e2f2e636172676f2f6769742f636865636b6f7574732f7375627374726174652d376530383433336434633337306132312f383730363363332f6672616d652f73797374656d2f7372632f6c69622e727300000000000000bc2a11001000000000000000cc2a1100010000000000000000000000d42a1100010000000000000000000000dc2a11000f00000000000000ec2a1100020000000000000000000000fc2a1100010000000000000000000000042b11000b0000000000000054e01100000000000000000000000000102b1100010000000000000000000000182b11000a00000000000000c8621100010000000000000000000000242b11000100000000000000000000002c2b11000d00000000000000c86211000100000000000000000000003c2b1100010000000000000045787472696e73696353756363657373b22b11000c000000be2b11002c00000045787472696e7369634661696c65640018d911000d000000b22b11000c0000008f2b110023000000436f646555706461746564007a2b1100150000004e65774163636f756e7400005d2b11001d0000004b696c6c65644163636f756e74000000442b11001900000020416e205b6163636f756e745d20776173207265617065642e2041206e6577205b6163636f756e745d2077617320637265617465642e20603a636f6465602077617320757064617465642e20416e2065787472696e736963206661696c65642e205b6572726f722c20696e666f5d4469737061746368496e666f20416e2065787472696e73696320636f6d706c65746564207375636365737366756c6c792e205b696e666f5d617373657274696f6e206661696c65643a2073656c662e6361702829203d3d206f6c645f636170202a203200000098db110067000000700000002e00000098db1100670000008f0000003400000098db110067000000680000003400000000000000bc0911000f00000000000000d42c1100020000000000000000000000a20911001a00000000000000e42c1100020000000000000000000000850911001d00000000000000f42c11000300000000000000000000007209110013000000000000000c2d1100010000000000000000000000cb0911000f00000000000000142d110001000000000000008f2e1100450000007a2e110015000000292e1100510000007a2e110015000000aa2d11003c00000054e0110000000000e62d1100430000006a2d1100400000001c2d11004e0000002054686572652069732061206e6f6e2d7a65726f207265666572656e636520636f756e742070726576656e74696e6720746865206163636f756e742066726f6d206265696e67207075726765642e20537569636964652063616c6c6564207768656e20746865206163636f756e7420686173206e6f6e2d64656661756c7420636f6d706f7369746520646174612e204661696c656420746f2065787472616374207468652072756e74696d652076657273696f6e2066726f6d20746865206e65772072756e74696d652e204569746865722063616c6c696e672060436f72655f76657273696f6e60206f72206465636f64696e67206052756e74696d6556657273696f6e60206661696c65642e205468652073706563696669636174696f6e2076657273696f6e206973206e6f7420616c6c6f77656420746f206465637265617365206265747765656e207468652063757272656e742072756e74696d6520616e6420746865206e65772072756e74696d652e20546865206e616d65206f662073706563696669636174696f6e20646f6573206e6f74206d61746368206265747765656e207468652063757272656e742072756e74696d65617373657274696f6e206661696c65643a206d6964203c3d206c656e002f11008f000000680900000e0000002f6e69782f73746f72652f39357734373162393862373934323470796c393364347a37686a6735693931372d727573742d312e34362e302d6e696768746c792d323032302d30362d33302d3136393537626434642f6c69622f727573746c69622f7372632f727573742f7372632f6c6962616c6c6f632f636f6c6c656374696f6e732f7665635f64657175652e72730098db110067000000d30000001100000098db110067000000d8000000090000003a6865617070616765733a636f64653a6368616e6765735f74726965e62f11003c00000073797374656d6672616d655f73797374656d5741524e494e473a205265666572656e636564206163636f756e742064656c657465642e20546869732069732070726f6261626c792061206275672e6e6577686561647350617261636861696e20686561647320636f756c64206e6f74206265206465636f6465642e0019000000080000000400000040000000bc30110047000000020600000e0000004e6f2070617261636861696e20686561647320666f756e6420696e20696e686572656e7420646174612e0000bc30110047000000030600000e000000bc301100470000001e0500002b0000002f686f6d652f6261737469616e2f70726f6a656374732f7061726974792f706f6c6b61646f742f72756e74696d652f636f6d6d6f6e2f7372632f70617261636861696e732e727376616c696461746f725f726f6c655f7061697273003831110082000000ff01000023000000383111008200000000020000230000002f6e69782f73746f72652f39357734373162393862373934323470796c393364347a37686a6735693931372d727573742d312e34362e302d6e696768746c792d323032302d30362d33302d3136393537626434642f6c69622f727573746c69622f7372632f727573742f7372632f6c6962636f72652f736c6963652f6d6f642e727373656e645f78636d705f6d6573736167657472616e736665725f746f5f70617261636861696e7265706f72745f646f75626c655f766f74657365745f686561647300000000002c34110012000000000000004034110001000000000000000000000048341100150000000000000060341100010000000000000000000000683411000f000000000000007834110001000000000000000000000080341100100000000000000090341100010000000000000000000000983411000f00000000000000a8341100010000000000000000000000b03411000900000000000000bc341100010000000000000000000000c43411001400000000000000d8341100010000000000000000000000e03411001000000000000000f0341100010000000000000000000000f8341100160000000000000010351100010000000000000000000000183511001700000000000000303511000100000000000000000000003835110017000000000000005035110001000000000000000000000058351100100000000000000068351100010000000000000000000000703511000d0000000000000080351100010000000000000000000000883511000e0000000000000098351100010000000000000000000000a03511001000000000000000b0351100010000000000000000000000b83511001600000000000000d0351100010000000000000000000000d83511001500000000000000f0351100010000000000000000000000f83511000d000000000000000836110001000000000000000000000010361100150000000000000028361100010000000000000000000000303611001800000000000000483611000100000000000000546f6f4d616e79486561645570646174657300008439110038000000546f6f4d616e795061726143616e64696461746573000000653911001f00000048656164734f75744f664f72646572001b3911004a000000556e7265676973746572656450617261ef3811002c000000496e76616c6964436f6c6c61746f7200dd38110012000000517565756546756c6c0000009638110047000000496e76616c69644d6573736167654f726967696e773811001f0000004e6f56616c696461746f7247726f757055381100220000004e6f74456e6f75676856616c6964697479566f74657300002c38110029000000566f74657345786365656473417574686f72697469657300ee3711003e00000057726f6e6756616c696461746f72417474657374696e6700b537110039000000496e76616c69645369676e61747572659437110021000000556e746167676564566f7465730000006037110034000000506172656e744d69736d61746368000037371100290000004865616444617461546f6f4c617267651e3711001900000056616c69646174696f6e436f6465546f6f4c617267650000fb36110023000000446973616c6c6f776564436f646555706772616465000000e23611001900000043616e6e6f7450617946656573000000b33611002f000000556e657870656374656452656c6179506172656e740000008236110031000000446f776e776172644d657373616765517565756546756c6c503611003200000020446f776e77617264206d6573736167652071756575652069732066756c6c20666f72207468652050617261636861696e2e20556e65787065637465642072656c61792d706172656e7420666f7220612063616e64696461746520726563656970742e205061726120646f6573206e6f74206861766520656e6f7567682062616c616e636520746f2070617920666565732e20446973616c6c6f77656420636f646520757067726164652e204e65772076616c69646174696f6e20636f64652077617320746f6f206c617267652e204865616420646174612077617320746f6f206c617267652e2057726f6e6720706172656e74206865616420666f722070617261636861696e20726563656970742e20457874726120756e7461676765642076616c696469747920766f74657320616c6f6e6720776974682063616e6469646174652e20496e76616c6964207369676e61747572652066726f6d2061747465737465722e20417474657374696e672076616c696461746f72206e6f74206f6e207468697320636861696e27732076616c69646174696f6e20647574792e20546865206e756d626572206f66206174746573746174696f6e73206578636565647320746865206e756d626572206f6620617574686f7269746965732e204e6f7420656e6f7567682076616c696469747920766f74657320666f722063616e6469646174652e204e6f2076616c696461746f722067726f757020666f722070617261636861696e2e20546865206d657373616765206f726967696e20697320696e76616c69642e20546865206d6573736167652071756575652069732066756c6c2e204d657373616765732077696c6c206265206164646564207768656e2074686572652069732073706163652e20496e76616c696420636f6c6c61746f722e2043616e64696461746520697320666f7220616e20756e726567697374657265642070617261636861696e2e2050726f706f736564206865616473206d75737420626520617363656e64696e67206f726465722062792070617261636861696e20494420776974686f7574206475706c69636174652e20546f6f206d616e792070617261636861696e2063616e646964617465732e2050617261636861696e206865616473206d7573742062652075706461746564206f6e6c79206f6e636520696e2074686520626c6f636b2e7672662d6e6d2d706b436865636b4d6f7274616c6974794368617267655472616e73616374696f6e5061796d656e7456616c6964617465446f75626c65566f74655265706f727473bc301100470000006f0600003500000054696d657374616d70206d7573742062652075706461746564206f6e636520696e2074686520626c6f636b50617261636861696e206865616473206d7573742062652075706461746564206f6e636520696e2074686520626c6f636b803a11002e000000ae3a11000d0000004552524f523a2072657475726e6564206e6578745f6b657920686173206e6f2076616c75653a0a6b6579206973200a6e6578745f6b65792069732050617374436f64655072756e696e6750617374436f646550617374436f64654d657461496e76616c69642f6f75746461746564206b6579206f776e6572736869702070726f6f662e4661696c656420746f207265706f7274206f6666656e6365446f776e776172644d65737361676551756575656f7264657265645f6e656564735f646973706174636820636f6e7461696e732069643f2100bc301100470000004c0400001d000000467574757265436f64655570677261646573000000000000d03b11000500000000000000d83b1100010000000000000000000000f03b1100140000000000000000000000903c11000d00000000000000a03c1100020000000000000000000000d03c110012000000000000006261746368000000000000007e42110005000000000000008342110017000000953f11002000000054e0110000000000b53f11001f00000054e0110000000000d43f11003c00000054e01100000000001040110058000000684011003200000054e0110000000000a9a211000b0000009a40110024000000be4011002e000000ec4011003100000027a311000c00000054e01100000000001d41110056000000734111004d000000c04111005600000016421100540000006a4211001400000061735f64657269766174697665000000000000005ca31100050000000000000061a3110003000000000000006aab110004000000000000006eab110017000000603d11003800000054e0110000000000983d110056000000ee3d11003000000054e01100000000001e3e110052000000703e110059000000c93e1100550000001e3f11002000000054e01100000000003e3f11003e00000054e0110000000000b8a611003400000054e0110000000000a9a211000b0000007c3f11001900000022ab11002000000027a311000c0000002053656e6420612063616c6c207468726f75676820616e20696e64657865642070736575646f6e796d206f66207468652073656e6465722e2046696c7465722066726f6d206f726967696e206172652070617373656420616c6f6e672e205468652063616c6c2077696c6c2062652064697370617463686564207769746820616e206f726967696e20776869636820757365207468652073616d652066696c74657220617320746865206f726967696e206f6620746869732063616c6c2e204e4f54453a20496620796f75206e65656420746f20656e73757265207468617420616e79206163636f756e742d62617365642066696c746572696e67206973206e6f7420686f6e6f7265642028692e652e206265636175736520796f7520657870656374206070726f78796020746f2068617665206265656e2075736564207072696f7220696e207468652063616c6c20737461636b20616e6420796f7520646f206e6f742077616e74207468652063616c6c207265737472696374696f6e7320746f206170706c7920746f20616e79207375622d6163636f756e7473292c207468656e20757365206061735f6d756c74695f7468726573686f6c645f316020696e20746865204d756c74697369672070616c6c657420696e73746561642e204e4f54453a205072696f7220746f2076657273696f6e202a31322c2074686973207761732063616c6c6564206061735f6c696d697465645f737562602e202d2042617365207765696768743a20322e38363120c2b5732053656e642061206261746368206f662064697370617463682063616c6c732e204d61792062652063616c6c65642066726f6d20616e79206f726967696e2e202d206063616c6c73603a205468652063616c6c7320746f20626520646973706174636865642066726f6d207468652073616d65206f726967696e2e204966206f726967696e20697320726f6f74207468656e2063616c6c2061726520646973706174636820776974686f757420636865636b696e67206f726967696e2066696c7465722e20285468697320696e636c7564657320627970617373696e6720606672616d655f73797374656d3a3a54726169743a3a4261736543616c6c46696c74657260292e202d2042617365207765696768743a2031342e3339202b202e393837202a206320c2b573202d20506c7573207468652073756d206f66207468652077656967687473206f6620746865206063616c6c73602e202d20506c7573206f6e65206164646974696f6e616c206576656e742e202872657065617420726561642f77726974652920546869732077696c6c2072657475726e20604f6b6020696e20616c6c2063697263756d7374616e6365732e20546f2064657465726d696e65207468652073756363657373206f66207468652062617463682c20616e206576656e74206973206465706f73697465642e20496620612063616c6c206661696c656420616e64207468652062617463682077617320696e7465727275707465642c207468656e2074686520604261746368496e74657272757074656460206576656e74206973206465706f73697465642c20616c6f6e67207769746820746865206e756d626572206f66207375636365737366756c2063616c6c73206d61646520616e6420746865206572726f72206f6620746865206661696c65642063616c6c2e20496620616c6c2077657265207375636365737366756c2c207468656e2074686520604261746368436f6d706c6574656460206576656e74206973206465706f73697465642e63616c6c735665633c3c542061732054726169743e3a3a43616c6c3e000000000000c84211000300000000000000cc421100010000000000000000000000e4421100120000000000000073657400000000003a46110003000000000000003d46110012000000744311001600000054e01100000000008a43110056000000e04311003600000054e01100000000001644110051000000674411001100000054e0110000000000784411003600000054e0110000000000a9a211000b000000ae44110034000000e2441100680000004a4511002d000000774511002a000000a145110060000000014611003900000027a311000c00000020536574207468652063757272656e742074696d652e20546869732063616c6c2073686f756c6420626520696e766f6b65642065786163746c79206f6e63652070657220626c6f636b2e2049742077696c6c2070616e6963206174207468652066696e616c697a6174696f6e2070686173652c20696620746869732063616c6c206861736e2774206265656e20696e766f6b656420627920746861742074696d652e205468652074696d657374616d702073686f756c642062652067726561746572207468616e207468652070726576696f7573206f6e652062792074686520616d6f756e742073706563696669656420627920604d696e696d756d506572696f64602e20546865206469737061746368206f726967696e20666f7220746869732063616c6c206d7573742062652060496e686572656e74602e202d20604f285429602077686572652060546020636f6d706c6578697479206f6620606f6e5f74696d657374616d705f73657460202d20312073746f72616765207265616420616e6420312073746f72616765206d75746174696f6e2028636f64656320604f28312960292e202862656361757365206f6620604469645570646174653a3a74616b656020696e20606f6e5f66696e616c697a656029202d2031206576656e742068616e646c657220606f6e5f74696d657374616d705f7365746020604f285429602e202d2042656e63686d61726b3a20372e36373820286d696e207371756172657320616e616c79736973292020202d204e4f54453a20546869732062656e63686d61726b2077617320646f6e6520666f7220612072756e74696d65207769746820696e7369676e69666963616e7420606f6e5f74696d657374616d705f736574602068616e646c6572732e20202020204e65772062656e63686d61726b696e67206973206e6565646564207768656e20616464696e67206e65772068616e646c6572732e6e6f77436f6d706163743c543a3a4d6f6d656e743e000000000000471100030000000000000000000000c9971100090000000000000000000000000000000000000000000000000000000000000054e01100044711000000000000000000144711000100000000000000010000000000000054b311000900000000000000000000006bbe1100040000000000000000000000000000000000000000000000000000000000000054e011001c47110000000000000000002c4711000100000000000000010000004e6f770019000000000000000100000060000000614711002400000019000000000000000100000032000000344711002d00000020446964207468652074696d657374616d7020676574207570646174656420696e207468697320626c6f636b3f2043757272656e742074696d6520666f72207468652063757272656e7420626c6f636b2e00000000000000c04711000d00000000000000c9971100090000000000000054e01100d04711000000000000000000e047110004000000000000004d696e696d756d506572696f6400000019000000000000000100000061000000004811005a0000005a4811005a000000b4481100590000000d4911001c00000020546865206d696e696d756d20706572696f64206265747765656e20626c6f636b732e204265776172652074686174207468697320697320646966666572656e7420746f20746865202a65787065637465642a20706572696f6420746861742074686520626c6f636b2070726f64756374696f6e206170706172617475732070726f76696465732e20596f75722063686f73656e20636f6e73656e7375732073797374656d2077696c6c2067656e6572616c6c7920776f726b2077697468207468697320746f2064657465726d696e6520612073656e7369626c6520626c6f636b2074696d652e20652e672e20466f7220417572612c2069742077696c6c20626520646f75626c65207468697320706572696f64206f6e2064656661756c742073657474696e67732e00000000000000f23111000900000000000000dc49110001000000000000000000000084b11100010000000000000000000000e03111001200000000000000f44911000100000000000000000000000c4a1100040000000000000000000000cb31110015000000000000002c4a1100030000000000000000000000744a1100010000000000000000000000ba31110011000000000000007c4a1100020000000000000000000000ac4a1100030000000000000000000000a14c11000500000000000000a64c11001600000000000000284c110006000000000000002e4c110073000000924b11004000000054e0110000000000d24b110046000000184c11001000000000000000164b11000200000000000000184b11000600000000000000794b110006000000000000007f4b11000700000000000000864b110006000000000000008c4b110006000000214b11005800000000000000164b11000200000000000000184b110006000000000000001e4b11000300000000000000ff7a110007000000c44a11002c00000054e0110000000000f04a1100260000002053656e6420612058434d50206d65737361676520746f2074686520676976656e2070617261636861696e2e20546865206f726967696e206d75737420626520616e6f746865722070617261636861696e2e746f5061726149646d7367205472616e7366657220736f6d6520746f6b656e7320696e746f20612070617261636861696e20616e64206c656176652061206d65737361676520696e2074686520646f776e7761726420717565756520666f722069742e616d6f756e7442616c616e636572656d61726b52656d61726b2050726f7669646520612070726f6f66207468617420736f6d652076616c696461746f722068617320636f6d6d69746564206120646f75626c652d766f74652e205468652077656967687420697320303b20696e206f7264657220746f2061766f696420446f53206120605369676e6564457874656e73696f6e602076616c69646174696f6e20697320696d706c656d656e7465642e7265706f7274446f75626c65566f74655265706f72743c3c543a3a4b65794f776e657250726f6f6653797374656d2061730a20202020202020202020202020202020204b65794f776e657250726f6f6653797374656d3c284b65795479706549642c2056616c696461746f724964293e3e3a3a50726f6f663e68656164735665633c417474657374656443616e6469646174653e00000000dc8e11000b000000000000000000000034511100100000000000000000000000000000000000000000000000000000000000000054e0110044511100000000000000000054511100010000000000000001000000000000005c511100040000000105000000000000184b11000600000000000000605111000e0000000000000000000000000000000000000054e011007051110000000000000000008051110001000000000000000000000000000000d23a11000c0000000105000000000000184b1100060000000000000088511100200000000000000000000000000000000000000054e01100a85111000000000000000000b851110003000000000000000100000000000000ca3a1100080000000105000000000000d05111001800000000000000605111000e0000000000000000000000000000000000000054e01100e85111000000000000000000f851110002000000000000000000000000000000bb3a11000f0000000000000000000000085211001d0000000000000000000000000000000000000000000000000000000000000054e011002852110000000000000000003852110001000000000000000100000000000000643b1100120000000105000000000000184b1100060000000000000020be11000e0000000000000000000000000000000000000054e0110040521100000000000000000054e0110000000000000000000000000000000000505211000a0000000105000000000000184b11000600000000000000605111000e0000000000000000000000000000000000000054e011005c521100000000000000000054e01100000000000000000001000000000000006c521100050000000105000000000000184b1100060000000000000071521100080000000000000000000000000000000000000054e011007c52110000000000000000008c5211000100000000000000000000000000000094521100120000000105000000000000184b11000600000000000000a6521100120000000000000000000000000000000000000054e01100b85211000000000000000000c852110002000000000000000100000000000000d8521100160000000105000000000000184b11000600000000000000ee5211000a0000000000000000000000000000000000000054e01100f852110000000000000000000853110003000000000000000100000000000000205311000d00000000000000000000002d5311000b0000000000000000000000000000000000000000000000000000000000000054e01100385311000000000000000000485311000100000000000000010000000000000054b311000900000000000000000000002d5311000b0000000000000000000000000000000000000000000000000000000000000054e0110050531100000000000000000060531100040000000000000000000000000000001b3b1100140000000105000000000000184b1100060000000000000080531100220000000000000000000000000000000000000054e01100a45311000000000000000000b45311000100000000000000010000005665633c56616c696461746f7249643e190000000000000001000000620000001d58110025000000436f646556616c69646174696f6e436f6465000019000000000000000100000032000000e8571100350000005061726150617374436f64654d6574613c543a3a426c6f636b4e756d6265723e1900000000000000010000006300000027571100520000007957110052000000cb5711001d000000285061726149642c20543a3a426c6f636b4e756d6265722919000000000000000100000032000000c85611004e00000016571100110000005665633c285061726149642c20543a3a426c6f636b4e756d626572293e0000001900000000000000010000002f0000009f5611002900000019000000000000000100000032000000467574757265436f646500001900000000000000010000006400000048656164734865616444617461000000190000000000000001000000320000006c5611003300000052656c6179446973706174636851756575655665633c5570776172644d6573736167653e1900000000000000010000002f000000f3551100470000003a5611003200000052656c61794469737061746368517565756553697a65287533322c2075333229190000000000000001000000650000000d551100510000005e55110056000000b45511003f0000004e6565647344697370617463685665633c5061726149643e1900000000000000010000002d000000c9541100440000001900000000000000010000003200000006541100560000005c5411005200000054e0110000000000ae5411001b0000005665633c446f776e776172644d6573736167653c543a3a4163636f756e7449643e3e00001900000000000000010000002f000000bc5311004a000000204d657373616765732077616974696e6720746f2062652064656c6976657265642066726f6d207468652052656c617920636861696e20696e746f207468652070617261636861696e2e2060536f6d6560206966207468652070617261636861696e20686561647320676574207570646174656420696e207468697320626c6f636b2c20616c6f6e672077697468207468652070617261636861696e20494473207468617420646964207570646174652e204f72646572656420696e207468652073616d652077617920617320607265676973747261723a3a416374697665602028692e652e20627920506172614964292e20604e6f6e6560206966206e6f742079657420757064617465642e20546865206f726465726564206c697374206f662050617261496473207468617420686176652061206052656c6179446973706174636851756575656020656e7472792e2053697a65206f6620746865206469737061746368207175657565732e205365706172617465642066726f6d2061637475616c206461746120696e206f7264657220746f2061766f696420636f73746c79206465636f64696e67207768656e20636865636b696e6720726563656970742076616c69646974792e204669727374206974656d20696e207475706c652069732074686520636f756e74206f66206d65737361676573207365636f6e642069662074686520746f74616c206c656e6774682028696e20627974657329206f6620746865206d657373616765207061796c6f6164732e204d6573736167657320726561647920746f2062652064697370617463686564206f6e746f207468652072656c617920636861696e2e204974206973207375626a65637420746f20604d41585f4d4553534147455f434f554e546020616e64206057415445524d41524b5f4d4553534147455f53495a45602e20546865206865616473206f66207468652070617261636861696e7320726567697374657265642061742070726573656e742e205061737420636f6465207072756e696e672c20696e206f72646572206f66207072696f726974792e2041637475616c207061737420636f64652c20696e64696361746564206279207468652070617261636861696e20616e642074686520626c6f636b206e756d62657220617420776869636820697420626563616d65206f757464617465642e205061737420636f6465206f662070617261636861696e732e205468652070617261636861696e73207468656d73656c766573206d6179206e6f74206265207265676973746572656420616e796d6f72652c2062757420776520616c736f206b65657020746865697220636f6465206f6e2d636861696e20666f72207468652073616d6520616d6f756e74206f662074696d65206173206f7574646174656420636f646520746f20617373697374207769746820617661696c6162696c6974792e205468652061637469766520636f6465206f6620612063757272656e746c792d726567697374657265642070617261636861696e2e20416c6c20617574686f72697469657327206b65797320617420746865206d6f6d656e742e000000000000f4581100110000000000000000000000055911000a0000000000000000000000000000000000000000000000000000000000000054e0110010591100000000000000000054e0110000000000000000000100000000000000205911000e00000000000000000000002e591100080000000000000000000000000000000000000000000000000000000000000054e0110038591100000000000000000054e011000000000000000000010000004e6578744665654d756c7469706c6965724d756c7469706c696572001900000000000000010000006600000053746f7261676556657273696f6e52656c656173657300001900000000000000010000005300000000000000b859110012000000000000008cad11000c0000000000000054e01100cc5911000000000000000000dc591100010000000000000000000000e45911000b00000000000000ef591100290000000000000054e01100185a11000000000000000000285a110001000000000000005472616e73616374696f6e42797465466565000019000000000000000100000067000000735a110043000000576569676874546f4665655665633c576569676874546f466565436f656666696369656e743c42616c616e63654f663c543e3e3e19000000000000000100000068000000305a1100430000002054686520706f6c796e6f6d69616c2074686174206973206170706c69656420696e206f7264657220746f20646572697665206665652066726f6d207765696768742e205468652066656520746f206265207061696420666f72206d616b696e672061207472616e73616374696f6e3b20746865207065722d6279746520706f7274696f6e2e0000bc3011004700000061040000220000000000000000000000617474656d707420746f20646976696465206279207a65726f000000bc30110047000000600400001b00000054696d657374616d7020746f6f2066617220696e2066757475726520746f206163636570744765747320616e64206465636f6465732074696d657374616d7020696e686572656e7420646174610000006900000010000000040000006a0000006c5b110060000000f70000000e0000002f686f6d652f6261737469616e2f2e636172676f2f6769742f636865636b6f7574732f7375627374726174652d376530383433336434633337306132312f383730363363332f6672616d652f74696d657374616d702f7372632f6c69622e72736d6f646c70792f7574696c697375626154696d657374616d70206d7573742062652075706461746564206f6e6c79206f6e636520696e2074686520626c6f636b54696d657374616d70206d75737420696e6372656d656e74206279206174206c65617374203c4d696e696d756d506572696f643e206265747765656e2073657175656e7469616c20626c6f636b73417574686f72556e636c6573526571756972655375646f00000000000000245d11000400000000000000285d1100010000000000000000000000405d11000a0000000000000000000000905d11001500000000000000a85d1100020000000000000000000000d85d11000a0000000000000000000000285e11000700000000000000305e1100010000000000000000000000485e1100090000000000000000000000905e11000700000000000000985e1100020000000000000000000000c85e11000b000000000000007375646f000000006aab110004000000000000006eab110017000000876011004e00000054e0110000000000b8a611003400000054e0110000000000a9a211000b000000855f1100080000008d5f110019000000a65f110018000000be5f11003200000027a311000c0000007375646f5f756e636865636b65645f776569676874000000000000006aab110004000000000000006eab110017000000000000008261110007000000000000008961110006000000876011004e000000d56011004c000000216111002d00000054e0110000000000b8a611003400000054e0110000000000a9a211000b000000855f1100080000004e6111003400000027a311000c0000007365745f6b65790000000000846011000300000000000000f35f110023000000166011005d00000054e0110000000000b8a611003400000054e0110000000000a9a211000b000000855f1100080000008d5f110019000000736011001100000027a311000c0000007375646f5f61730000000000f05f11000300000000000000f35f110023000000000000006aab110004000000000000006eab110017000000205f110054000000745f11001100000054e0110000000000b8a611003400000054e0110000000000a9a211000b000000855f1100080000008d5f110019000000a65f110018000000be5f11003200000027a311000c0000002041757468656e7469636174657320746865207375646f206b657920616e64206469737061746368657320612066756e6374696f6e2063616c6c207769746820605369676e656460206f726967696e2066726f6d206120676976656e206163636f756e742e202d204f2831292e202d204c696d697465642073746f726167652072656164732e202d204f6e6520444220777269746520286576656e74292e202d20576569676874206f662064657269766174697665206063616c6c6020657865637574696f6e202b2031302c3030302e77686f3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263652041757468656e74696361746573207468652063757272656e74207375646f206b657920616e6420736574732074686520676976656e204163636f756e7449642028606e6577602920617320746865206e6577207375646f206b65792e202d204f6e65204442206368616e67652e6e65772041757468656e7469636174657320746865207375646f206b657920616e64206469737061746368657320612066756e6374696f6e2063616c6c20776974682060526f6f7460206f726967696e2e20546869732066756e6374696f6e20646f6573206e6f7420636865636b2074686520776569676874206f66207468652063616c6c2c20616e6420696e737465616420616c6c6f777320746865205375646f207573657220746f20737065636966792074686520776569676874206f66207468652063616c6c2e202d2054686520776569676874206f6620746869732063616c6c20697320646566696e6564206279207468652063616c6c65722e5f7765696768745765696768740000000000e86111000300000000000000000000003aa311000c0000000000000000000000000000000000000000000000000000000000000054e01100ec6111000000000000000000fc6111000100000000000000010000004b6579001900000000000000010000003300000004621100210000002054686520604163636f756e74496460206f6620746865207375646f206b65792e00000000000000ac621100050000000000000018af1100010000000000000000000000b4621100010000000000000000000000bc6211000a00000000000000c8621100010000000000000000000000d0621100010000000000000000000000d86211000a00000000000000e4621100010000000000000000000000b4621100010000000000000053756469640000002a631100210000004b65794368616e6765640000fbaf110009000000ec6211003e0000005375646f4173446f6e6500006bbe11000400000020546865205b7375646f65725d206a757374207377697463686564206964656e746974793b20746865206f6c64206b657920697320737570706c6965642e2041207375646f206a75737420746f6f6b20706c6163652e205b726573756c745d556e636c65416c7265616479496e636c75646564546f6f48696768556e636c6547656e65736973556e636c65546f6f4d616e79556e636c6573556e636c6573416c7265616479536574496e76616c6964556e636c65506172656e744f6c64556e636c65000000000000dc6311000a00000000000000e86311000100000000000000000000000064110001000000000000007365745f756e636c6573000000000000216411000a000000000000002b6411000e00000008641100190000002050726f76696465206120736574206f6620756e636c65732e6e65775f756e636c65735665633c543a3a4865616465723e00000000000000605c1100060000000000000000000000446511003a0000000000000000000000000000000000000000000000000000000000000054e0110080651100000000000000000090651100010000000000000001000000000000005a5c11000600000000000000000000003aa311000c0000000000000000000000000000000000000000000000000000000000000054e01100986511000000000000000000a865110001000000000000000000000000000000b06511000c00000000000000000000006bbe1100040000000000000000000000000000000000000000000000000000000000000054e01100bc6511000000000000000000cc6511000100000000000000010000005665633c556e636c65456e7472794974656d3c543a3a426c6f636b4e756d6265722c20543a3a486173682c20543a3a4163636f756e7449643e3e00001900000000000000010000006b0000001c66110007000000190000000000000001000000320000000366110019000000446964536574556e636c657319000000000000000100000032000000d46511002f000000205768657468657220756e636c6573207765726520616c72656164792073657420696e207468697320626c6f636b2e20417574686f72206f662063757272656e7420626c6f636b2e20556e636c657300a46611007f000000c803000022000000a46611007f0000001c0300001e000000a46611007f000000e403000015000000a46611007f000000f20300001e000000a46611007f000000fb03000018000000a46611007f000000fc03000019000000a46611007f000000ff0300001a000000a46611007f000000050400000d0000002f6e69782f73746f72652f39357734373162393862373934323470796c393364347a37686a6735693931372d727573742d312e34362e302d6e696768746c792d323032302d30362d33302d3136393537626434642f6c69622f727573746c69622f7372632f727573742f7372632f6c6962616c6c6f632f736c6963652e72730000000000665c11000b0000000000000040671100010000000000000048671100200000002053656e646572206d75737420626520746865205375646f206163636f756e74000000009463110012000000000000002c68110001000000000000000000000084631100100000000000000034681100010000000000000000000000776311000d000000000000003c6811000100000000000000000000006b6311000c00000000000000446811000100000000000000000000005f6311000c000000000000004c6811000100000000000000000000004b631100140000000000000054681100010000000000000000000000a663110008000000000000005c68110001000000000000001969110023000000f868110021000000e768110011000000d168110016000000b168110020000000926811001f000000646811002e0000002054686520756e636c652069736e277420726563656e7420656e6f75676820746f20626520696e636c756465642e2054686520756e636c6520697320616c726561647920696e636c756465642e2054686520756e636c6520697320746f6f206869676820696e20636861696e2e2054686520756e636c652069732067656e657369732e20546f6f206d616e7920756e636c65732e20556e636c657320616c72656164792073657420696e2074686520626c6f636b2e2054686520756e636c6520706172656e74206e6f7420696e2074686520636861696e2e4b657973417574686f726564426c6f636b732f686f6d652f6261737469616e2f2e636172676f2f6769742f636865636b6f7574732f7375627374726174652d376530383433336434633337306132312f383730363363332f6672616d652f696d2d6f6e6c696e652f7372632f6c69622e72734772616e64706146696e616c69747950656e64696e674368616e67653a6772616e6470615f617574686f726974696573537461746548656172746265617441667465720000002c6a11001600000014d71100020000002c6a110016000000426a110012000000696d6f6e6c696e6570616c6c65745f696d5f6f6e6c696e65536b697070696e6720686561727462656174206174202e204e6f7420612076616c696461746f722e636b11001c000000356b11002e000000036b11001a0000001d6b110018000000e76a11000a000000f16a110012000000cf6a110018000000b96a1100160000009c6a11001d0000004661696c656420746f206665746368206e6574776f726b2073746174654661696c656420746f2061637175697265206c6f636b4661696c656420746f207369676e20686561727462656174417574686f726974792020697320616c7265616479206f6e6c696e6548656172746265617420616c72656164792073656e74206174202e2057616974696e6720666f7220696e636c7573696f6e2e546f6f206561726c7920746f2073656e64206865617274626561742c206e657874206578706563746564206174204661696c656420746f207375626d6974207472616e73616374696f6e004e6911006000000036020000340000007061726974792f696d2d6f6e6c696e652d6865617274626561742f00cc6b110008000000d46b110020000000f46b11000b000000ff6b1100030000005b696e6465783a205d205265706f7274696e6720696d2d6f6e6c696e6520617420626c6f636b3a20202873657373696f6e3a20293a2000003c6c11000900000054e011000000000054e01100000000001900000004000000040000006c0000001900000004000000040000006c0000006865617274626561745374616c6c65644e657874466f726365644772616e64706145717569766f636174696f6e61666770616c6c65745f6772616e6470613a3a65717569766f636174696f6e2f686f6d652f6261737469616e2f2e636172676f2f6769742f636865636b6f7574732f7375627374726174652d376530383433336434633337306132312f383730363363332f6672616d652f6772616e6470612f7372632f65717569766f636174696f6e2e7273546f6f536f6f6e4368616e676550656e64696e67526573756d654661696c656450617573654661696c65640000000000002c8811001300000000000000a06d1100020000000000000000000000d06d1100040000000000000000000000908811001c00000000000000a06d1100020000000000000000000000f06d1100090000000000000000000000386e11000c00000000000000446e1100020000000000000000000000746e11000700000000000000000000009c8a11001200000000000000677111002a00000000000000ca8a11000f00000000000000d98a1100100000009570110043000000d87011003e000000167111003f00000055711100120000009570110043000000d87011003e000000167111003f000000557111001200000054e0110000000000c289110044000000068a1100460000004c8a110046000000928a11000a0000006e6f74655f7374616c6c65640000000075701100050000000000000020be11000e000000000000007a7011001b0000000000000020be11000e000000ac6e110047000000f36e11004a0000003d6f110048000000856f110045000000ca6f11004a000000147011004a0000005e70110017000000204e6f74652074686174207468652063757272656e7420617574686f7269747920736574206f6620746865204752414e4450412066696e616c6974792067616467657420686173207374616c6c65642e20546869732077696c6c2074726967676572206120666f7263656420617574686f7269747920736574206368616e67652061742074686520626567696e6e696e67206f6620746865206e6578742073657373696f6e2c20746f20626520656e6163746564206064656c61796020626c6f636b7320616674657220746861742e205468652064656c61792073686f756c64206265206869676820656e6f75676820746f20736166656c7920617373756d6520746861742074686520626c6f636b207369676e616c6c696e672074686520666f72636564206368616e67652077696c6c206e6f742062652072652d6f726765642028652e672e203130303020626c6f636b73292e20546865204752414e44504120766f746572732077696c6c20737461727420746865206e657720617574686f7269747920736574207573696e672074686520676976656e2066696e616c697a656420626c6f636b20617320626173652e204f6e6c792063616c6c61626c6520627920726f6f742e64656c6179626573745f66696e616c697a65645f626c6f636b5f6e756d626572205265706f727420766f7465722065717569766f636174696f6e2f6d69736265686176696f722e2054686973206d6574686f642077696c6c20766572696679207468652065717569766f636174696f6e2070726f6f6620616e642076616c69646174652074686520676976656e206b6579206f776e6572736869702070726f6f6620616761696e73742074686520657874726163746564206f6666656e6465722e20496620626f7468206172652076616c69642c20746865206f6666656e63652077696c6c206265207265706f727465642e45717569766f636174696f6e50726f6f663c543a3a486173682c20543a3a426c6f636b4e756d6265723e00000000000000de691100050000000000000000000000a47311001b0000000000000000000000000000000000000000000000000000000000000054e01100c07311000000000000000000d073110001000000000000000100000000000000bd6911000d0000000000000000000000d8731100230000000000000000000000000000000000000000000000000000000000000054e01100fc73110000000000000000000c741100010000000000000000000000000000004c6c11000a000000000000000000000020be11000e0000000000000000000000000000000000000000000000000000000000000054e011001474110000000000000000002474110001000000000000000000000000000000456c11000700000000000000000000002c741100200000000000000000000000000000000000000000000000000000000000000054e011004c74110000000000000000005c74110001000000000000000000000000000000647411000c000000000000000000000070741100050000000000000000000000000000000000000000000000000000000000000054e011007874110000000000000000008874110002000000000000000100000000000000987411000c0000000105000000000000707411000500000000000000a47411000c0000000000000000000000000000000000000054e01100b07411000000000000000000c074110004000000000000000000000053746f72656453746174653c543a3a426c6f636b4e756d6265723e001900000000000000010000006d0000008a7611002400000053746f72656450656e64696e674368616e67653c543a3a426c6f636b4e756d6265723e00190000000000000001000000320000005976110031000000190000000000000001000000320000002a7611002f00000028543a3a426c6f636b4e756d6265722c20543a3a426c6f636b4e756d6265722919000000000000000100000032000000067611002400000043757272656e7453657449645365744964000000190000000000000001000000600000007e75110057000000d575110031000000536574496453657373696f6e53657373696f6e496e64657819000000000000000100000032000000e074110056000000367511001a00000054e0110000000000507511002e0000002041206d617070696e672066726f6d206772616e6470612073657420494420746f2074686520696e646578206f6620746865202a6d6f737420726563656e742a2073657373696f6e20666f7220776869636820697473206d656d62657273207765726520726573706f6e7369626c652e2054574f582d4e4f54453a2060536574496460206973206e6f7420756e646572207573657220636f6e74726f6c2e20546865206e756d626572206f66206368616e6765732028626f746820696e207465726d73206f66206b65797320616e6420756e6465726c79696e672065636f6e6f6d696320726573706f6e736962696c69746965732920696e20746865202273657422206f66204772616e6470612076616c696461746f72732066726f6d2067656e657369732e20607472756560206966207765206172652063757272656e746c79207374616c6c65642e206e65787420626c6f636b206e756d6265722077686572652077652063616e20666f7263652061206368616e67652e2050656e64696e67206368616e67653a20287369676e616c65642061742c207363686564756c6564206368616e6765292e205374617465206f66207468652063757272656e7420617574686f72697479207365742e496e76616c69644b65794475706c69636174656448656172746265617400000000003c6c11000900000000000000f8761100020000000000000000000000287711000a00000000000000000000003c6c11000900000000000000c37811001900000000000000dc7811000a00000000000000e67811002f000000a9a211000b0000007877110048000000c07711002d00000054e0110000000000ed77110023000000107811002c0000003c7811004f0000008b78110017000000a27811002100000027a311000c000000202d20436f6d706c65786974793a20604f284b202b20452960207768657265204b206973206c656e677468206f6620604b6579736020616e642045206973206c656e677468206f66202020604865617274626561742e6e6574776f726b5f73746174652e65787465726e616c5f61646472657373602020202d20604f284b29603a206465636f64696e67206f66206c656e67746820604b602020202d20604f284529603a206465636f64696e672f656e636f64696e67206f66206c656e67746820604560202d20446252656164733a2070616c6c65745f73657373696f6e206056616c696461746f7273602c2070616c6c65745f73657373696f6e206043757272656e74496e646578602c20604b657973602c2020206052656365697665644865617274626561747360202d2044625772697465733a2060526563656976656448656172746265617473604865617274626561743c543a3a426c6f636b4e756d6265723e5f7369676e61747572653c543a3a417574686f7269747949642061732052756e74696d654170705075626c69633e3a3a5369676e617475726500000000000000e36911000e000000000000000000000020be11000e0000000000000000000000000000000000000000000000000000000000000054e01100787a11000000000000000000887a1100060000000000000001000000000000003c691100040000000000000000000000b87a1100130000000000000000000000000000000000000000000000000000000000000054e01100cc7a11000000000000000000dc7a110001000000000000000100000000000000e47a1100120000000205050000000000a47411000c00000000000000f67a11000900000000000000ff7a1100070000000000000054e01100087b11000000000000000000187b110002000000000000000000000000000000406911000e0000000205050000000000a47411000c00000000000000287b11000e0000000000000068901100030000000000000054e01100387b11000000000000000000487b11000200000000000000010000001900000000000000010000002e0000005f7c11004c00000054e0110000000000ab7c110044000000ef7c110034000000237d110040000000637d11004e0000005665633c543a3a417574686f7269747949643e001900000000000000010000002f0000002b7c11003400000052656365697665644865617274626561747341757468496e6465785665633c75383e000019000000000000000100000032000000cf7b11003c0000000b7c110020000000543a3a56616c696461746f72496400001900000000000000010000002e000000587b1100450000009d7b11003200000020466f7220656163682073657373696f6e20696e6465782c207765206b6565702061206d617070696e67206f662060543a3a56616c696461746f7249646020746f20746865206e756d626572206f6620626c6f636b7320617574686f7265642062792074686520676976656e20617574686f726974792e20466f7220656163682073657373696f6e20696e6465782c207765206b6565702061206d617070696e67206f66206041757468496e6465786020746f20606f6666636861696e3a3a4f70617175654e6574776f726b5374617465602e205468652063757272656e7420736574206f66206b6579732074686174206d61792069737375652061206865617274626561742e2054686520626c6f636b206e756d6265722061667465722077686963682069742773206f6b20746f2073656e64206865617274626561747320696e2063757272656e742073657373696f6e2e2041742074686520626567696e6e696e67206f6620656163682073657373696f6e20776520736574207468697320746f20612076616c756520746861742073686f756c642066616c6c20726f7567686c7920696e20746865206d6964646c65206f66207468652073657373696f6e206475726174696f6e2e20546865206964656120697320746f206669727374207761697420666f72207468652076616c696461746f727320746f2070726f64756365206120626c6f636b20696e207468652063757272656e742073657373696f6e2c20736f20746861742074686520686561727462656174206c61746572206f6e2077696c6c206e6f74206265206e65636573736172792e00000000000000387e110011000000000000004c7e1100010000000000000000000000547e11000100000000000000000000005c7e1100070000000000000054e01100000000000000000000000000647e11000100000000000000000000006c7e11000b00000000000000787e1100010000000000000000000000807e110001000000000000004865617274626561745265636569766564000000617f11000b000000227f11003f000000416c6c476f6f6400ed7e110035000000536f6d654f66666c696e6500d57e110018000000887e11004d0000002041742074686520656e64206f66207468652073657373696f6e2c206174206c65617374206f6e652076616c696461746f722077617320666f756e6420746f206265205b6f66666c696e655d2e5665633c4964656e74696669636174696f6e5475706c653e2041742074686520656e64206f66207468652073657373696f6e2c206e6f206f6666656e63652077617320636f6d6d69747465642e2041206e657720686561727462656174207761732072656365697665642066726f6d2060417574686f72697479496460205b617574686f726974795f69645d417574686f726974794964000000000f6d11000b0000000000000030801100020000000000000000000000036d11000c0000000000000040801100020000000000000000000000f66c11000d0000000000000050801100010000000000000000000000ef6c11000700000000000000588011000100000000000000000000008c871100180000000000000060801100010000000000000000000000a4871100180000000000000068801100010000000000000000000000bc87110016000000000000007080110001000000000000003182110042000000738211002a000000c3811100450000000882110029000000888111003b00000058811100300000000b8111004d000000be8011004d0000007880110046000000204120676976656e2065717569766f636174696f6e207265706f72742069732076616c69642062757420616c72656164792070726576696f75736c79207265706f727465642e20416e2065717569766f636174696f6e2070726f6f662070726f76696465642061732070617274206f6620616e2065717569766f636174696f6e207265706f727420697320696e76616c69642e2041206b6579206f776e6572736869702070726f6f662070726f76696465642061732070617274206f6620616e2065717569766f636174696f6e207265706f727420697320696e76616c69642e2043616e6e6f74207369676e616c20666f72636564206368616e676520736f20736f6f6e206166746572206c6173742e20417474656d707420746f207369676e616c204752414e445041206368616e67652077697468206f6e6520616c72656164792070656e64696e672e20417474656d707420746f207369676e616c204752414e44504120726573756d65207768656e2074686520617574686f72697479207365742069736e2774207061757365642028656974686572206c697665206f7220616c72656164792070656e64696e6720726573756d65292e20417474656d707420746f207369676e616c204752414e445041207061757365207768656e2074686520617574686f72697479207365742069736e2774206c697665202865697468657220706175736564206f7220616c72656164792070656e64696e67207061757365292e00000000000000ae7611000a00000000000000d8821100010000000000000000000000b87611001300000000000000e08211000100000000000000fe82110019000000e882110016000000204475706c696361746564206865617274626561742e204e6f6e206578697374656e74207075626c6963206b65792e4469676573744974656d206e6f7420657175616c50726576696f7573206d617463682061726d206d61746368657320616e7974696e67206c657373207468616e20325e33303b20716564000000000000000000000000000000788311003d000000736869667465642073756666696369656e74206269747320726967687420746f206c656164206f6e6c79206c656164696e67207a65726f733b2071656400000000000000000000000000000000000000506172656e7420686173682073686f756c642062652076616c69642e5472616e73616374696f6e207472696520726f6f74206d7573742062652076616c69642e7d84110032000000446967657374206974656d206d757374206d6174636820746861742063616c63756c617465642e53746f7261676520726f6f74206d757374206d6174636820746861742063616c63756c617465642e5369676e617475726520766572696669636174696f6e206661696c65642e4e756d626572206f6620646967657374206974656d73206d757374206d6174636820746861742063616c63756c617465642e00c08411005d000000740100001b0000002f686f6d652f6261737469616e2f2e636172676f2f72656769737472792f7372632f6769746875622e636f6d2d316563633632393964623965633832332f747269652d64622d302e32322e302f7372632f7472696564626d75742e727363616c6c656420604f7074696f6e3a3a756e77726170282960206f6e206120604e6f6e65602076616c7565588511008f000000200600002f0000002f6e69782f73746f72652f39357734373162393862373934323470796c393364347a37686a6735693931372d727573742d312e34362e302d6e696768746c792d323032302d30362d33302d3136393537626434642f6c69622f727573746c69622f7372632f727573742f7372632f6c6962616c6c6f632f636f6c6c656374696f6e732f62747265652f6d61702e727300f885110006000000fe85110010000000496e64657820206f7574206f6620626f756e64733a200000c08411005d000000670100000d000000496e73657274696f6e206e657665722064656c657465732ec08411005d000000640200000d000000617373657274696f6e206661696c65643a20216578697374696e675f6b65792e69735f656d70747928296d6f72655f6174746573746174696f6e734c6174656e65737300948611001a0000004552524f523a20436f7272757074656420737461746520617420000000000000cc8611001300000000000000e08611000100000000000000546f6f4d616e794174746573746174696f6e7300e886110035000000204d6f7265206174746573746174696f6e732063616e206265206164646564206f6e6c79206f6e636520696e206120626c6f636b2e4261626545717569766f636174696f6e000000388711005400000072656a656374696e6720756e7369676e6564207265706f72742065717569766f636174696f6e207472616e73616374696f6e2062656361757365206974206973206e6f74206c6f63616c2f696e2d626c6f636b2e496e76616c69644b65794f776e65727368697050726f6f66496e76616c696445717569766f636174696f6e50726f6f664475706c69636174654f6666656e63655265706f72740000000000002c88110013000000000000004088110002000000000000000000000070881100040000000000000000000000908811001c0000000000000040881100020000000000000000000000ac88110008000000000000007265706f72745f65717569766f636174696f6e00000000009c8a11001200000000000000ae8a11001c00000000000000ca8a11000f00000000000000d98a110010000000ec881100430000002f891100420000007189110044000000b58911000d0000007265706f72745f65717569766f636174696f6e5f756e7369676e6564ec881100430000002f891100420000007189110044000000b58911000d000000c289110044000000068a1100460000004c8a110046000000928a11000a000000205265706f727420617574686f726974792065717569766f636174696f6e2f6d69736265686176696f722e2054686973206d6574686f642077696c6c20766572696679207468652065717569766f636174696f6e2070726f6f6620616e642076616c69646174652074686520676976656e206b6579206f776e6572736869702070726f6f6620616761696e73742074686520657874726163746564206f6666656e6465722e20496620626f7468206172652076616c69642c20746865206f6666656e63652077696c6c206265207265706f727465642e20546869732065787472696e736963206d7573742062652063616c6c656420756e7369676e656420616e642069742069732065787065637465642074686174206f6e6c7920626c6f636b20617574686f72732077696c6c2063616c6c206974202876616c69646174656420696e206056616c6964617465556e7369676e656460292c20617320737563682069662074686520626c6f636b20617574686f7220697320646566696e65642069742077696c6c20626520646566696e6564206173207468652065717569766f636174696f6e207265706f727465722e65717569766f636174696f6e5f70726f6f6645717569766f636174696f6e50726f6f663c543a3a4865616465723e6b65795f6f776e65725f70726f6f66543a3a4b65794f776e657250726f6f6600000000000000b48e11000a0000000000000000000000be8e1100030000000000000000000000000000000000000000000000000000000000000054e01100c48e11000000000000000000d48e110001000000000000000100000000000000dc8e11000b0000000000000000000000e78e1100270000000000000000000000000000000000000000000000000000000000000054e01100108f11000000000000000000208f110001000000000000000100000000000000288f11000b0000000000000000000000be8e1100030000000000000000000000000000000000000000000000000000000000000054e01100348f11000000000000000000448f110002000000000000000100000000000000548f11000b0000000000000000000000be8e1100030000000000000000000000000000000000000000000000000000000000000054e01100608f11000000000000000000708f110001000000000000000100000000000000788f11000a0000000000000000000000828f1100160000000000000000000000000000000000000000000000000000000000000054e01100988f11000000000000000000a88f11000a000000000000000100000000000000f88f11000f000000000000000000000007901100140000000000000000000000000000000000000000000000000000000000000054e011001c90110000000000000000002c90110001000000000000000000000000000000349011000e0000000000000000000000828f1100160000000000000000000000000000000000000000000000000000000000000054e0110044901100000000000000000054901100010000000000000001000000000000005c9011000c000000000000000000000068901100030000000000000000000000000000000000000000000000000000000000000054e011006c90110000000000000000007c90110009000000000000000100000000000000c4901100110000000105000000000000689011000300000000000000d59011001b0000000000000000000000000000000000000054e01100f09011000000000000000000009111000100000000000000010000000000000060be11000b0000000000000000000000089111000f0000000000000000000000000000000000000000000000000000000000000054e0110018911100000000000000000028911100020000000000000000000000000000008386110008000000000000000000000020be11000e0000000000000000000000000000000000000000000000000000000000000054e011003891110000000000000000004891110005000000000000000100000045706f6368496e646578753634000000190000000000000001000000600000000197110015000000417574686f7269746965735665633c28417574686f7269747949642c2042616265417574686f72697479576569676874293e00001900000000000000010000002f000000e69611001b00000047656e65736973536c6f740019000000000000000100000060000000849611003e000000c29611002400000043757272656e74536c6f7400190000000000000001000000600000006f9611001500000052616e646f6d6e6573737363686e6f72726b656c3a3a52616e646f6d6e6573731900000000000000010000006e000000a99411002e00000054e0110000000000d79411000b00000054e0110000000000e294110041000000239511003e0000006195110045000000a695110045000000eb951100410000002c961100430000004e65787445706f6368436f6e6669674e657874436f6e66696744657363726970746f72001900000000000000010000003200000083941100260000004e65787452616e646f6d6e65737300001900000000000000010000006e0000006c941100170000005365676d656e74496e646578753332001900000000000000010000002e000000279311001f00000054e0110000000000469311003d0000008393110040000000c39311002500000054e0110000000000e89311003b00000023941100420000006594110007000000556e646572436f6e737472756374696f6e5665633c7363686e6f72726b656c3a3a52616e646f6d6e6573733e19000000000000000100000059000000e2921100450000004d6179626552616e646f6d6e65737300190000000000000001000000320000005b921100400000009b921100470000001900000000000000010000002e000000709111003600000054e0110000000000a691110045000000eb911100440000002f9211002c00000020486f77206c617465207468652063757272656e7420626c6f636b20697320636f6d706172656420746f2069747320706172656e742e205468697320656e74727920697320706f70756c617465642061732070617274206f6620626c6f636b20657865637574696f6e20616e6420697320636c65616e6564207570206f6e20626c6f636b2066696e616c697a6174696f6e2e205175657279696e6720746869732073746f7261676520656e747279206f757473696465206f6620626c6f636b20657865637574696f6e20636f6e746578742073686f756c6420616c77617973207969656c64207a65726f2e2054656d706f726172792076616c75652028636c656172656420617420626c6f636b2066696e616c697a6174696f6e292077686963682069732060536f6d6560206966207065722d626c6f636b20696e697469616c697a6174696f6e2068617320616c7265616479206265656e2063616c6c656420666f722063757272656e7420626c6f636b2e2054574f582d4e4f54453a20605365676d656e74496e6465786020697320616e20696e6372656173696e6720696e74656765722c20736f2074686973206973206f6b61792e2052616e646f6d6e65737320756e64657220636f6e737472756374696f6e2e205765206d616b6520612074726164656f6666206265747765656e2073746f7261676520616363657373657320616e64206c697374206c656e6774682e2057652073746f72652074686520756e6465722d636f6e737472756374696f6e2072616e646f6d6e65737320696e207365676d656e7473206f6620757020746f2060554e4445525f434f4e535452554354494f4e5f5345474d454e545f4c454e475448602e204f6e63652061207365676d656e7420726561636865732074686973206c656e6774682c20776520626567696e20746865206e657874206f6e652e20576520726573657420616c6c207365676d656e747320616e642072657475726e20746f206030602061742074686520626567696e6e696e67206f662065766572792065706f63682e204e6578742065706f63682072616e646f6d6e6573732e204e6578742065706f636820636f6e66696775726174696f6e2c206966206368616e6765642e205468652065706f63682072616e646f6d6e65737320666f7220746865202a63757272656e742a2065706f63682e20232053656375726974792054686973204d555354204e4f54206265207573656420666f722067616d626c696e672c2061732069742063616e20626520696e666c75656e6365642062792061206d616c6963696f75732076616c696461746f7220696e207468652073686f7274207465726d2e204974204d4159206265207573656420696e206d616e792063727970746f677261706869632070726f746f636f6c732c20686f77657665722c20736f206c6f6e67206173206f6e652072656d656d626572732074686174207468697320286c696b652065766572797468696e6720656c7365206f6e2d636861696e29206974206973207075626c69632e20466f72206578616d706c652c2069742063616e20626520757365642077686572652061206e756d626572206973206e656564656420746861742063616e6e6f742068617665206265656e2063686f73656e20627920616e206164766572736172792c20666f7220707572706f7365732073756368206173207075626c69632d636f696e207a65726f2d6b6e6f776c656467652070726f6f66732e2043757272656e7420736c6f74206e756d6265722e2054686520736c6f74206174207768696368207468652066697273742065706f63682061637475616c6c7920737461727465642e2054686973206973203020756e74696c2074686520666972737420626c6f636b206f662074686520636861696e2e2043757272656e742065706f636820617574686f7269746965732e2043757272656e742065706f636820696e6465782e000000000000889711000d00000000000000be8e1100030000000000000054e01100989711000000000000000000a8971100020000000000000000000000b89711001100000000000000c9971100090000000000000054e01100d49711000000000000000000e4971100050000000000000045706f63684475726174696f6e0000001900000000000000010000006f0000003c991100430000007f9911003f0000004578706563746564426c6f636b54696d65543a3a4d6f6d656e740000190000000000000001000000700000000c981100410000004d981100440000009198110041000000d298110042000000149911002800000020546865206578706563746564206176657261676520626c6f636b2074696d6520617420776869636820424142452073686f756c64206265206372656174696e6720626c6f636b732e2053696e636520424142452069732070726f626162696c6973746963206974206973206e6f74207472697669616c20746f20666967757265206f7574207768617420746865206578706563746564206176657261676520626c6f636b2074696d652073686f756c64206265206261736564206f6e2074686520736c6f74206475726174696f6e20616e642074686520736563757269747920706172616d657465722060636020287768657265206031202d20636020726570726573656e7473207468652070726f626162696c697479206f66206120736c6f74206265696e6720656d707479292e20546865206e756d626572206f66202a2a736c6f74732a2a207468617420616e2065706f63682074616b65732e20576520636f75706c652073657373696f6e7320746f2065706f6368732c20692e652e2077652073746172742061206e65772073657373696f6e206f6e636520746865206e65772065706f636820626567696e732e4475706c6963617465556e70726f787961626c654e6f7450726f78794e6f74466f756e64546f6f4d616e794e6f5065726d697373696f6e00000000000000009b11000500000000000000089b1100030000000000000000000000509b1100100000000000000000000000d09b11000900000000000000dc9b11000200000000000000000000000c9c11000d0000000000000000000000749c11000c00000000000000dc9b1100020000000000000000000000809c11000d0000000000000000000000e89c11000e0000000000000054e01100000000000000000000000000f89c11000c0000000000000000000000589d11000900000000000000649d1100020000000000000000000000949d1100160000000000000000000000449e11000e00000000000000549e1100050000000000000000000000cc9e1100160000000000000070726f78790000000000000042ab110004000000000000003aa311000c0000000000000046ab1100100000000000000056ab110014000000000000006aab110004000000000000006eab110017000000aea911005400000002aa11000d00000054e0110000000000b8a611003400000054e0110000000000e8a711000c0000000faa11004400000053aa110059000000acaa11003500000054e0110000000000a9a211000b000000b4a2110028000000e1aa11002400000005ab11001d00000022ab11002000000027a311000c0000006164645f70726f787900000000000000009b110005000000000000003aa311000c0000000000000046a311000a0000000000000050a311000c000000b3a811005200000054e0110000000000b8a611003400000054e0110000000000e8a711000c00000005a91100450000004aa911004000000054e0110000000000a9a211000b000000b4a21100280000008aa911002400000000a311002700000027a311000c00000072656d6f76655f70726f7879bda711002b00000054e0110000000000b8a611003400000054e0110000000000e8a711000c000000f4a711004a0000003ea811005100000054e0110000000000a9a211000b000000b4a21100280000008fa811002400000000a311002700000027a311000c00000072656d6f76655f70726f7869657300008aa611002e00000054e0110000000000b8a611003400000054e0110000000000eca611005600000042a711005700000054e0110000000000a9a211000b000000b4a211002800000099a711002400000000a311002700000027a311000c000000616e6f6e796d6f75730000000000000046a311000a0000000000000050a311000c000000000000005ca31100050000000000000061a31100030000007fa311004f000000cea311004000000054e01100000000000ea411001c00000054e01100000000002aa41100550000007fa4110054000000d3a411001f000000f2a411005500000047a51100580000009fa511001100000054e0110000000000b0a511005500000005a611002700000054e01100000000002ca611003a00000054e0110000000000a9a211000b000000b4a211002800000066a611002400000000a311002700000027a311000c0000006b696c6c5f616e6f6e796d6f757300000000000033a3110007000000000000003aa311000c0000000000000046a311000a0000000000000050a311000c000000000000005ca31100050000000000000061a31100030000000000000064a3110006000000000000000cbc110017000000000000006aa31100090000000000000073a311000c0000007c9f11002e00000054e0110000000000aa9f110053000000fd9f11000e00000054e01100000000000ba011005700000062a011002b00000054e01100000000008da0110054000000e1a011005400000035a111004100000076a1110050000000c6a111005300000054e011000000000019a21100530000006ca211003d00000054e0110000000000a9a211000b000000b4a2110028000000dca211002400000000a311002700000027a311000c0000002052656d6f76657320612070726576696f75736c7920737061776e656420616e6f6e796d6f75732070726f78792e205741524e494e473a202a2a416c6c2061636365737320746f2074686973206163636f756e742077696c6c206265206c6f73742e2a2a20416e792066756e64732068656c6420696e2069742077696c6c20626520696e61636365737369626c652e205265717569726573206120605369676e656460206f726967696e2c20616e64207468652073656e646572206163636f756e74206d7573742068617665206265656e206372656174656420627920612063616c6c20746f2060616e6f6e796d6f757360207769746820636f72726573706f6e64696e6720706172616d65746572732e202d2060737061776e6572603a20546865206163636f756e742074686174206f726967696e616c6c792063616c6c65642060616e6f6e796d6f75736020746f206372656174652074686973206163636f756e742e202d2060696e646578603a2054686520646973616d626967756174696f6e20696e646578206f726967696e616c6c792070617373656420746f2060616e6f6e796d6f7573602e2050726f6261626c79206030602e202d206070726f78795f74797065603a205468652070726f78792074797065206f726967696e616c6c792070617373656420746f2060616e6f6e796d6f7573602e202d2060686569676874603a2054686520686569676874206f662074686520636861696e207768656e207468652063616c6c20746f2060616e6f6e796d6f757360207761732070726f6365737365642e202d20606578745f696e646578603a205468652065787472696e73696320696e64657820696e207768696368207468652063616c6c20746f2060616e6f6e796d6f757360207761732070726f6365737365642e204661696c73207769746820604e6f5065726d697373696f6e6020696e2063617365207468652063616c6c6572206973206e6f7420612070726576696f75736c79206372656174656420616e6f6e796d6f7573206163636f756e742077686f73652060616e6f6e796d6f7573602063616c6c2068617320636f72726573706f6e64696e6720706172616d65746572732e2023203c7765696768743e205020697320746865206e756d626572206f662070726f7869657320746865207573657220686173202d2042617365207765696768743a2031352e3635202b202e313337202a205020c2b573202d204442207765696768743a20312073746f72616765207265616420616e642077726974652e2023203c2f7765696768743e737061776e6572543a3a4163636f756e74496470726f78795f74797065543a3a50726f787954797065696e6465787531366865696768746578745f696e646578436f6d706163743c7533323e20537061776e2061206672657368206e6577206163636f756e7420746861742069732067756172616e7465656420746f206265206f746865727769736520696e61636365737369626c652c20616e6420696e697469616c697a65206974207769746820612070726f7879206f66206070726f78795f747970656020666f7220606f726967696e602073656e6465722e205265717569726573206120605369676e656460206f726967696e2e202d206070726f78795f74797065603a205468652074797065206f66207468652070726f78792074686174207468652073656e6465722077696c6c2062652072656769737465726564206173206f76657220746865206e6577206163636f756e742e20546869732077696c6c20616c6d6f737420616c7761797320626520746865206d6f7374207065726d697373697665206050726f7879547970656020706f737369626c6520746f20616c6c6f7720666f72206d6178696d756d20666c65786962696c6974792e202d2060696e646578603a204120646973616d626967756174696f6e20696e6465782c20696e206361736520746869732069732063616c6c6564206d756c7469706c652074696d657320696e207468652073616d65207472616e73616374696f6e2028652e672e207769746820607574696c6974793a3a626174636860292e20556e6c65737320796f75277265207573696e67206062617463686020796f752070726f6261626c79206a7573742077616e7420746f20757365206030602e204661696c73207769746820604475706c69636174656020696620746869732068617320616c7265616479206265656e2063616c6c656420696e2074686973207472616e73616374696f6e2c2066726f6d207468652073616d652073656e6465722c2077697468207468652073616d6520706172616d65746572732e204661696c732069662074686572652061726520696e73756666696369656e742066756e647320746f2070617920666f72206465706f7369742e202d2042617365207765696768743a2033362e3438202b202e303339202a205020c2b57320556e726567697374657220616c6c2070726f7879206163636f756e747320666f72207468652073656e6465722e20546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e205741524e494e473a2054686973206d61792062652063616c6c6564206f6e206163636f756e747320637265617465642062792060616e6f6e796d6f7573602c20686f776576657220696620646f6e652c207468656e2074686520756e726573657276656420666565732077696c6c20626520696e61636365737369626c652e202a2a416c6c2061636365737320746f2074686973206163636f756e742077696c6c206265206c6f73742e2a2a202d2042617365207765696768743a2031332e3733202b202e313239202a205020c2b57320556e726567697374657220612070726f7879206163636f756e7420666f72207468652073656e6465722e20506172616d65746572733a202d206070726f7879603a20546865206163636f756e74207468617420746865206063616c6c65726020776f756c64206c696b6520746f2072656d6f766520617320612070726f78792e202d206070726f78795f74797065603a20546865207065726d697373696f6e732063757272656e746c7920656e61626c656420666f72207468652072656d6f7665642070726f7879206163636f756e742e202d2042617365207765696768743a2031342e3337202b202e313634202a205020c2b57320526567697374657220612070726f7879206163636f756e7420666f72207468652073656e64657220746861742069732061626c6520746f206d616b652063616c6c73206f6e2069747320626568616c662e202d206070726f7879603a20546865206163636f756e74207468617420746865206063616c6c65726020776f756c64206c696b6520746f206d616b6520612070726f78792e202d206070726f78795f74797065603a20546865207065726d697373696f6e7320616c6c6f77656420666f7220746869732070726f7879206163636f756e742e202d2042617365207765696768743a2031372e3438202b202e313736202a205020c2b5732044697370617463682074686520676976656e206063616c6c602066726f6d20616e206163636f756e742074686174207468652073656e64657220697320617574686f726973656420666f72207468726f75676820606164645f70726f7879602e202d20607265616c603a20546865206163636f756e742074686174207468652070726f78792077696c6c206d616b6520612063616c6c206f6e20626568616c66206f662e202d2060666f7263655f70726f78795f74797065603a2053706563696679207468652065786163742070726f7879207479706520746f206265207573656420616e6420636865636b656420666f7220746869732063616c6c2e202d206063616c6c603a205468652063616c6c20746f206265206d6164652062792074686520607265616c60206163636f756e742e202d2042617365207765696768743a2031392e3837202b202e313431202a205020c2b573202d204442207765696768743a20312073746f7261676520726561642e202d20506c75732074686520776569676874206f6620746865206063616c6c607265616c666f7263655f70726f78795f747970654f7074696f6e3c543a3a50726f7879547970653e63616c6c426f783c3c542061732054726169743e3a3a43616c6c3e00000000000000e0ab11000700000001050000000000003aa311000c00000000000000e7ab1100310000000000000000000000000000000000000054e0110018ac1100000000000000000028ac110002000000000000000100000050726f78696573285665633c28543a3a4163636f756e7449642c20543a3a50726f787954797065293e2c2042616c616e63654f663c543e291900000000000000010000007100000038ac11005100000089ac1100480000002054686520736574206f66206163636f756e742070726f786965732e204d61707320746865206163636f756e74207768696368206861732064656c65676174656420746f20746865206163636f756e747320776869636820617265206265696e672064656c65676174656420746f2c20746f67657468657220776974682074686520616d6f756e742068656c64206f6e206465706f7369742e000000000000007cad110010000000000000008cad11000c0000000000000054e0110098ad11000000000000000000a8ad1100010000000000000000000000b0ad110012000000000000008cad11000c0000000000000054e01100c4ad11000000000000000000d4ad1100010000000000000000000000dcad11000a0000000000000061a31100030000000000000054e01100e8ad11000000000000000000f8ad1100010000000000000050726f78794465706f7369744261736542616c616e63654f663c543e190000000000000001000000720000006bae11004400000050726f78794465706f736974466163746f720000190000000000000001000000730000003cae11002f0000004d617850726f7869657300001900000000000000010000007400000000ae11003c00000020546865206d6178696d756d20616d6f756e74206f662070726f7869657320616c6c6f77656420666f7220612073696e676c65206163636f756e742e2054686520616d6f756e74206f662063757272656e6379206e6565646564207065722070726f78792061646465642e20546865206261736520616d6f756e74206f662063757272656e6379206e656564656420746f207265736572766520666f72206372656174696e6720612070726f78792e000000000008af11000d0000000000000018af110001000000000000000000000020af110001000000000000000000000028af1100100000000000000038af110004000000000000000000000058af1100020000000000000050726f7879457865637574656400000046b011000e0000000db0110039000000416e6f6e796d6f757343726561746564fbaf110009000000fbaf11000900000004b011000900000061a311000300000068af11003b000000a3af11005800000020416e6f6e796d6f7573206163636f756e7420686173206265656e2063726561746564206279206e65772070726f7879207769746820676976656e20646973616d626967756174696f6e20696e64657820616e642070726f787920747970652e205b616e6f6e796d6f75732c2077686f2c2070726f78795f747970652c20646973616d626967756174696f6e5f696e6465785d4163636f756e74496450726f78795479706520412070726f78792077617320657865637574656420636f72726563746c792c20776974682074686520676976656e205b726573756c745d2e4469737061746368526573756c7465706f636820696e64696365732077696c6c206e6576657220726561636820325e3634206265666f726520746865206465617468206f662074686520756e6976657273653b20716564000000c0b011005b000000c90100000e000000c0b011005b000000d10100000e0000002f686f6d652f6261737469616e2f2e636172676f2f6769742f636865636b6f7574732f7375627374726174652d376530383433336434633337306132312f383730363363332f6672616d652f626162652f7372632f6c69622e727350617261426c6f636b4174746573746174696f6e73526563656e7450617261426c6f636b73000000007286110011000000000000006cb1110001000000000000000000000084b11100010000000000000000000000d1b111000500000000000000d6b11100100000008cb11100450000002050726f766964652063616e64696461746520726563656970747320666f722070617261636861696e732c20696e20617363656e64696e67206f726465722062792069642e5f6d6f72654d6f72654174746573746174696f6e7300000000000030b1110010000000010500000000000020be11000e00000000000000f0b21100110000000000000000000000000000000000000054e0110004b31100000000000000000014b31100020000000000000000000000000000001bb1110015000000020506000000000020be11000e0000000000000024b31100040000000000000028b31100140000000000000054e011003cb3110000000000000000004cb311000100000000000000000000000000000054b311000900000000000000000000006bbe1100040000000000000000000000000000000000000000000000000000000000000054e0110060b31100000000000000000054e01100000000000000000001000000496e636c75646564426c6f636b733c543e000000190000000000000001000000320000009ab311003c000000d6b311003300000048617368426c6f636b4174746573746174696f6e733c543e1900000000000000010000003200000070b311002a00000044696455706461746500000019000000000000000100000032000000204174746573746174696f6e73206f6e206120726563656e742070617261636861696e20626c6f636b2e2041206d617070696e672066726f6d206d6f64756c617220626c6f636b206e756d62657220286e2025204174746573746174696f6e506572696f642920746f2073657373696f6e20696e64657820616e6420746865206c697374206f662063616e646964617465206861736865732e617373657274696f6e206661696c65643a20656467652e686569676874203d3d2073656c662e686569676874202d2031617373657274696f6e206661696c65643a2073656c662e6c656e2829203c204341504143495459617373657274696f6e206661696c65643a20656467652e686569676874203d3d2073656c662e6e6f64652e686569676874202d203174696d657374616d702073657420696e20626c6f636b20646f65736e2774206d6174636820736c6f7420696e207365616c000000000000e2991100070000000000000070b51100010000000000000000000000da991100080000000000000078b51100010000000000000000000000d2991100080000000000000080b51100010000000000000000000000c79911000b0000000000000088b51100010000000000000000000000be991100090000000000000090b51100010000000000000000000000e99911000c0000000000000098b5110001000000000000009db61100270000007fb611001e0000004bb611003400000002b6110049000000e6b511001c000000a0b51100460000002043616c6c206d6179206e6f74206265206d6164652062792070726f78792062656361757365206974206d617920657363616c617465206974732070726976696c656765732e204163636f756e7420697320616c726561647920612070726f78792e20412063616c6c20776869636820697320696e636f6d70617469626c652077697468207468652070726f7879207479706527732066696c7465722077617320617474656d707465642e2053656e646572206973206e6f7420612070726f7879206f6620746865206163636f756e7420746f2062652070726f786965642e2050726f787920726567697374726174696f6e206e6f7420666f756e642e2054686572652061726520746f6f206d616e792070726f7869657320726567697374657265642e6d6f646c70792f70726f78795f5f5f5f0eb7110023000000e4b611002a000000696e7465726e616c206572726f723a20656e746572656420756e726561636861626c6520636f64653a205f5f5068616e746f6d4974656d2073686f756c64206e6576657220626520757365642e55706461746556524648617368565246526573756c747672662d696e7672662d6f7574436865636b576569676874526563656e7448696e74734f72646572656448696e74734d656469616e616c77617973206174206c65617374206f6e6520726563656e742073616d706c653b20716564000078b8110067000000710000000e000000726563656e7420616e64206f72646572656420636f6e7461696e207468652073616d65206974656d733b2071656400001900000004000000040000001300000078b81100670000007c000000160000007072756e696e672064696374617465642062792077696e646f775f73697a6520776869636820697320616c776179732073617475726174656420617420313b207165640078b8110067000000960000001100000078b8110067000000900000001900000078b811006700000091000000190000002f686f6d652f6261737469616e2f2e636172676f2f6769742f636865636b6f7574732f7375627374726174652d376530383433336434633337306132312f383730363363332f6672616d652f66696e616c6974792d747261636b65722f7372632f6c69622e7273426164206d616e64616e746f7279000000a5b91100230000007db911002600000070616c6c65745f626162653a3a65717569766f636174696f6e2f686f6d652f6261737469616e2f2e636172676f2f6769742f636865636b6f7574732f7375627374726174652d376530383433336434633337306132312f383730363363332f6672616d652f626162652f7372632f65717569766f636174696f6e2e72734572726f72207375626d697474696e672065717569766f636174696f6e207265706f72743a2028295375626d697474656420424142452065717569766f636174696f6e207265706f72742e617373657274696f6e206661696c65643a2062697473203c3d20726573756c742e6c656e2829566563746f72206361706163697479206f766572666c6f77000084ba11005a0000004d0000000e000000ffffff1f3cba1100130000006aba11001a0000003cba1100130000004fba11001b0000004361706163697479206f766572666c6f773a20206f766572666c6f777320616c6c6f636174696f6e2073697a6520206f766572666c6f7773206d6178696d756d206c656e677468202f686f6d652f6261737469616e2f2e636172676f2f72656769737472792f7372632f6769746875622e636f6d2d316563633632393964623965633832332f6269747665632d302e31372e342f7372632f7665632f6170692e7273000000000004f4ba11000e00000002bb11000b000000566563746f72206c656e67746820206f766572666c6f77732000000018bb110023000000605f5f49676e6f7265602063616e206e6576657220626520636f6e7374727563746564416c72656164795570646174656442616448696e74000000007cbb11000a0000000000000088bb1100010000000000000000000000a0bb1100020000000000000066696e616c5f68696e7400000000000008bc110004000000000000000cbc110017000000b0bb11003d000000edbb11001b0000002048696e7420746861742074686520617574686f72206f66207468697320626c6f636b207468696e6b732074686520626573742066696e616c697a656420626c6f636b2069732074686520676976656e206e756d6265722e68696e74436f6d706163743c543a3a426c6f636b4e756d6265723e00000000005fb711000b0000000000000000000000dcbd1100130000000000000000000000000000000000000000000000000000000000000054e01100f0bd1100000000000000000000be1100010000000000000001000000000000006ab711000c0000000000000000000000dcbd1100130000000000000000000000000000000000000000000000000000000000000054e0110008be1100000000000000000018be11000100000000000000010000000000000076b7110006000000000000000000000020be11000e0000000000000000000000000000000000000000000000000000000000000054e0110030be1100000000000000000040be11000100000000000000010000000000000031b7110006000000000000000000000020be11000e0000000000000000000000000000000000000000000000000000000000000054e0110048be1100000000000000000058be11000100000000000000000000000000000060be11000b00000000000000000000006bbe1100040000000000000000000000000000000000000000000000000000000000000054e0110070be1100000000000000000054e011000000000000000000010000005665633c543a3a426c6f636b4e756d6265723e0019000000000000000100000041000000e3be11000e00000019000000000000000100000041000000cdbe110016000000543a3a426c6f636b4e756d62657200001900000000000000010000002e000000c1be11000c0000001900000000000000010000003200000080be110041000000496e697469616c697a6564626f6f6c00190000000000000001000000320000002046696e616c2068696e7420746f206170706c7920696e2074686520626c6f636b2e20604e6f6e6560206d65616e73202273616d6520617320706172656e74222e20546865206d656469616e2e204f72646572656420726563656e742068696e74732e20526563656e742068696e74732e0000000000000064bf11000a0000000000000020be11000e0000000000000054e0110070bf1100000000000000000080bf110001000000000000000000000088bf11000d0000000000000020be11000e0000000000000054e0110098bf11000000000000000000a8bf1100010000000000000057696e646f7753697a65000019000000000000000100000075000000f7bf1100460000005265706f72744c6174656e637900000019000000000000000100000031000000b0bf110047000000205468652064656c617920616674657220776869636820706f696e74207468696e6773206265636f6d6520737573706963696f75732e2044656661756c7420697320313030302e20546865206e756d626572206f6620726563656e742073616d706c657320746f206b6565702066726f6d207468697320636861696e2e2044656661756c74206973203130312e0001696e7465726e616c206572726f723a20656e746572656420756e726561636861626c6520636f646500460000005000000008000000490000004a0000004b0000004c0000004d0000004e0000004f000000000000003bbb11000e00000000000000c8c0110001000000000000000000000049bb11000700000000000000d0c011000100000000000000fcc0110032000000d8c01100240000002046696e616c697a6564206865696768742061626f766520626c6f636b206e756d6265722046696e616c2068696e74206d7573742062652075706461746564206f6e6c79206f6e636520696e2074686520626c6f636b0000b3c111000700000098c111001b00000014d711000200000058c1110040000000f0020000010000002f686f6d652f6261737469616e2f70726f6a656374732f7061726974792f706f6c6b61646f742f72756e74696d652f726f636f636f2f7372632f6c69622e727342616420696e70757420646174612070726f766964656420746f2076657273696f6e0000c4c111000d000000657865637574655f626c6f636b000000dcc1110010000000696e697469616c697a655f626c6f636bf4c11100080000006d6574616461746104c211000f0000006170706c795f65787472696e736963001cc211000e00000066696e616c697a655f626c6f636b000034c2110013000000696e686572656e745f65787472696e736963730050c211000f000000636865636b5f696e686572656e74730068c211000b00000072616e646f6d5f73656564007cc211001400000076616c69646174655f7472616e73616374696f6e98c211000f0000006f6666636861696e5f776f726b657200b0c211000a00000076616c696461746f72730000c4c211000b000000647574795f726f7374657200d8c21100110000006163746976655f70617261636861696e73000000f4c2110016000000676c6f62616c5f76616c69646174696f6e5f64617461000014c31100150000006c6f63616c5f76616c69646174696f6e5f6461746100000034c311000e00000070617261636861696e5f636f646500004cc31100090000006765745f686561647300000060c311000f0000007369676e696e675f636f6e746578740078c3110011000000646f776e776172645f6d6573736167657300000094c31100130000006772616e6470615f617574686f72697469657300b0c311002d0000007375626d69745f7265706f72745f65717569766f636174696f6e5f756e7369676e65645f65787472696e736963000000e8c311001c00000067656e65726174655f6b65795f6f776e6572736869705f70726f6f660cc411000d000000636f6e66696775726174696f6e00000024c411001300000063757272656e745f65706f63685f73746172740040c411000b000000617574686f7269746965730054c411001500000067656e65726174655f73657373696f6e5f6b65797300000074c41100130000006465636f64655f73657373696f6e5f6b6579730090c411000d0000006163636f756e745f6e6f6e6365000000a8c411000a00000071756572795f696e666f62616265000019000000000000000100000076000000760000007700000019000000000000000100000078000000790000007a0000000000000028c511000600000000000000000000002ec511000d00000000000000020000000000000000000000000000003cc511000c0000000000000000000000726f636f636f7061726974792d726f636f636f00df6acb689907609b0300000037e397fc7c91f5e40100000040fe3ad401f8959a04000000d2bc9897eed08f1502000000f78b278be53f454c02000000af2c0297a23e6d3d03000000ed99c5acb25eedf502000000cbca25e39f14238702000000687ad44ad37f03c201000000ab3c0572291feb8b01000000bc9d89904f5b923f0100000037c8bb1350a9a2a8010000006772616e62616265696d6f6e70617261617564697b00000008000000040000007c0000007c0000007d0000004d756c746973696753797374656d4261626554696d657374616d70496e646963657342616c616e636573417574686f72736869704f6666656e63657353657373696f6e46696e616c697479547261636b65724772616e647061496d4f6e6c696e65417574686f72697479446973636f7665727950617261636861696e734174746573746174696f6e735265676973747261725574696c6974794964656e746974795265636f7665727956657374696e675363686564756c65725375646f50726f787900000000000000c6110006000000000000007e000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000800000000000000000000000000000008100000000000000000000000000000082000000000000000000000000000000b4d11100180000000000000083000000000000000000000000000000000000000000000000000000020000000000000000000000000000000200000000000000000000000000000000000000840000000000000000000000000000008400000000000000000000000000000006c6110004000000000000008500000000000000000000000000000000000000000000000000000000000000860000000000000000000000020000000000000000000000000000000000000087000000000000000000000000000000840000000000000000000000000000000ac611000900000000000000880000000000000000000000000000000000000000000000000000000000000089000000000000000000000002000000000000000000000000000000000000008a0000000000000000000000000000008400000000000000000000000000000013c6110007000000000000008b000000000000000000000000000000000000000000000000000000000000008c0000000000000000000000000000008d00000000000000000000000000000084000000000000000000000000000000840000000000000000000000000000001ac6110008000000000000008e000000000000000000000000000000000000000000000000000000000000008f000000000000000000000000000000900000000000000000000000000000009100000000000000000000000000000092000000000000000000000000000000ccd11100120000000000000093000000000000000000000000000000000000000000000000000000020000000000000000000000000000000200000000000000000000000000000000000000940000000000000000000000000000008400000000000000000000000000000022c611000a000000000000009500000000000000000000000000000000000000000000000000000000000000960000000000000000000000020000000000000000000000000000000000000084000000000000000000000000000000970000000000000000000000000000002cc611000800000000000000980000000000000000000000000000000000000000000000000000000000000084000000000000000000000000000000990000000000000000000000000000008400000000000000000000000000000084000000000000000000000000000000ded111000a0000000200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000200000000000000000000000000000000000000840000000000000000000000000000008400000000000000000000000000000034c6110007000000000000009a000000000000000000000000000000000000000000000000000000000000009b0000000000000000000000000000009c000000000000000000000000000000840000000000000000000000000000009d0000000000000000000000000000003bc611000f000000000000009e000000000000000000000000000000000000000000000000000000000000009f00000000000000000000000200000000000000000000000000000000000000a0000000000000000000000000000000a10000000000000000000000000000004ac611000700000000000000a200000000000000000000000000000000000000000000000000000000000000a3000000000000000000000000000000a400000000000000000000000000000084000000000000000000000000000000a500000000000000000000000000000051c611000800000000000000a600000000000000000000000000000000000000000000000000000000000000a7000000000000000000000000000000a800000000000000000000000000000084000000000000000000000000000000a900000000000000000000000000000059c6110012000000020000000000000000000000000000000000000000000000000000000000000000000000840000000000000000000000020000000000000000000000000000000000000084000000000000000000000000000000840000000000000000000000000000006bc611000a00000000000000aa00000000000000000000000000000000000000000000000000000000000000ab0000000000000000000000020000000000000000000000000000000000000084000000000000000000000000000000ac00000000000000000000000000000075c611000c00000000000000ad00000000000000000000000000000000000000000000000000000000000000ae0000000000000000000000020000000000000000000000000000000000000084000000000000000000000000000000af00000000000000000000000000000081c611000900000000000000b000000000000000000000000000000000000000000000000000000000000000b1000000000000000000000000000000b200000000000000000000000000000084000000000000000000000000000000b30000000000000000000000000000008ac6110007000000020000000000000000000000000000000000000000000000000000000000000000000000b4000000000000000000000000000000b5000000000000000000000000000000840000000000000000000000000000008400000000000000000000000000000091c611000800000000000000b600000000000000000000000000000000000000000000000000000000000000b7000000000000000000000000000000b8000000000000000000000000000000b9000000000000000000000000000000ba00000000000000000000000000000099c611000800000000000000bb00000000000000000000000000000000000000000000000000000000000000bc000000000000000000000000000000bd000000000000000000000000000000be000000000000000000000000000000bf000000000000000000000000000000a1c611000700000000000000c000000000000000000000000000000000000000000000000000000000000000c1000000000000000000000000000000c2000000000000000000000000000000c3000000000000000000000000000000c4000000000000000000000000000000a8c611000900000000000000c500000000000000000000000000000000000000000000000000000000000000c6000000000000000000000000000000c700000000000000000000000000000084000000000000000000000000000000c8000000000000000000000000000000b1c611000400000000000000c900000000000000000000000000000000000000000000000000000000000000ca000000000000000000000000000000cb00000000000000000000000000000084000000000000000000000000000000cc000000000000000000000000000000b5c611000500000000000000cd00000000000000000000000000000000000000000000000000000000000000ce000000000000000000000000000000cf000000000000000000000000000000d0000000000000000000000000000000d1000000000000000000000000000000f8c511000800000000000000d200000000000000000000000000000000000000000000000000000000000000d3000000000000000000000000000000d400000000000000000000000000000084000000000000000000000000000000d5000000000000000000000052616e646f6d6e657373436f6c6c656374697665466c69705472616e73616374696f6e5061796d656e74486973746f726963616c72656d696e646572206f6620646976206279206320697320616c77617973206c657373207468616e20633b2071656400190000000800000004000000d600000051d21100710000006a00000012000000726573756c742063616e6e6f742066697420696e20753132382f686f6d652f6261737469616e2f2e636172676f2f6769742f636865636b6f7574732f7375627374726174652d376530383433336434633337306132312f383730363363332f7072696d6974697665732f61726974686d657469632f7372632f68656c706572735f3132386269742e72732f686f6d652f6261737469616e2f2e636172676f2f6769742f636865636b6f7574732f7375627374726174652d376530383433336434633337306132312f383730363363332f7072696d6974697665732f61726974686d657469632f7372632f7065725f7468696e67732e72730040d311006a0000006e000000090000002f686f6d652f6261737469616e2f2e636172676f2f6769742f636865636b6f7574732f7375627374726174652d376530383433336434633337306132312f383730363363332f7072696d6974697665732f61726974686d657469632f7372632f62696775696e742e727363616e6e6f74206669742061206e756d62657220696e746f20753132380040d311006a0000009d0000001b00000040d311006a0000007f0000000900000040d311006a00000091000000090000000000000000000000617474656d707420746f20646976696465206279207a65726f00000040d311006a000000450000000d000000616c7265616479206d757461626c7920626f72726f776564190000000000000001000000d700000064d411007d000000180300001b0000002f6e69782f73746f72652f39357734373162393862373934323470796c393364347a37686a6735693931372d727573742d312e34362e302d6e696768746c792d323032302d30362d33302d3136393537626434642f6c69622f727573746c69622f7372632f727573742f7372632f6c6962636f72652f63656c6c2e7273616c726561647920626f72726f776564000000190000000000000001000000d800000064d411007d000000630300001f0000002f686f6d652f6261737469616e2f2e636172676f2f6769742f636865636b6f7574732f7375627374726174652d376530383433336434633337306132312f383730363363332f7072696d6974697665732f61726974686d657469632f7372632f66697865645f706f696e742e7273617474656d707420746f206469766964652077697468206f766572666c6f7700000014d511006e0000004e0600000100000062616265736c6f74436f756c64206e6f74206465636f64652072657175657374656420696e686572656e742074797065214241424520696e686572656e742064617461206e6f7420666f756e6442616265565246496e4f7574436f6e7465787442414245736c6f74206e756d62657263757272656e742065706f6368636861696e2072616e646f6d6e6573731900000000000000010000001d00000060d611006f000000ce0000002a0000002f686f6d652f6261737469616e2f2e636172676f2f6769742f636865636b6f7574732f7375627374726174652d376530383433336434633337306132312f383730363363332f7072696d6974697665732f72756e74696d652d696e746572666163652f7372632f696d706c732e72730054e011000000000072756e74696d6552756e74696d65206d656d6f7279206578686175737465642e2041626f7274696e6700000054e011000000000014d71100020000003a20486f737420746f207761736d2076616c7565732061726520656e636f64656420636f72726563746c793b207165641900000000000000010000001d00000064d711007100000009010000260000002f686f6d652f6261737469616e2f2e636172676f2f6769742f636865636b6f7574732f7375627374726174652d376530383433336434633337306132312f383730363363332f7072696d6974697665732f72756e74696d652d696e746572666163652f7372632f706173735f62792e727348617368206e6f7420657175616c00000000000000000000000000617474656d707420746f20646976696465206279207a65726f0000001cd811006b000000600000002b0000002f686f6d652f6261737469616e2f2e636172676f2f6769742f636865636b6f7574732f7375627374726174652d376530383433336434633337306132312f383730363363332f7072696d6974697665732f72756e74696d652f7372632f67656e657269632f6572612e72732f686f6d652f6261737469616e2f2e636172676f2f6769742f636865636b6f7574732f7375627374726174652d376530383433336434633337306132312f383730363363332f7072696d6974697665732f72756e74696d652f7372632f7472616974732e727300000087d81100660000002004000013000000426164206f726967696e43616e206e6f74206c6f6f6b757044697370617463684572726f723c7761736d3a73747269707065643e5472616e73616374696f6e206469737061746368206973206d616e6461746f72793b207472616e73616374696f6e73206d6179206e6f742068617665206d616e6461746f727920646973706174636865732e412063616c6c20776173206c6162656c6c6564206173206d616e6461746f72792c2062757420726573756c74656420696e20616e204572726f722e5472616e73616374696f6e20776f756c642065786861757374732074686520626c6f636b206c696d6974735472616e73616374696f6e2068617320616e20616e6369656e7420626972746820626c6f636b5472616e73616374696f6e20686173206120626164207369676e61747572655472616e73616374696f6e206973206f757464617465645472616e73616374696f6e2077696c6c2062652076616c696420696e2074686520667574757265496e6162696c69747920746f2070617920736f6d6520666565732028652e672e206163636f756e742062616c616e636520746f6f206c6f77295472616e73616374696f6e2063616c6c206973206e6f74206578706563746564496e76616c69645472616e73616374696f6e20637573746f6d206572726f72436f756c64206e6f742066696e6420616e20756e7369676e65642076616c696461746f7220666f722074686520756e7369676e6564207472616e73616374696f6e436f756c64206e6f74206c6f6f6b757020696e666f726d6174696f6e20726571756972656420746f2076616c696461746520746865207472616e73616374696f6e556e6b6e6f776e5472616e73616374696f6e20637573746f6d206572726f7298db110067000000460000001f0000002f686f6d652f6261737469616e2f2e636172676f2f6769742f636865636b6f7574732f7375627374726174652d376530383433336434633337306132312f383730363363332f7072696d6974697665732f747269652f7372632f6e6f64655f636f6465632e72730098db1100670000004f000000140000006c656e20213d20302073696e6365206c656e2025203220213d20303b20696e6e6572206861732061206c61737420656c656d656e743b2071656400005cdc1100640000003d000000120000002f686f6d652f6261737469616e2f2e636172676f2f72656769737472792f7372632f6769746875622e636f6d2d316563633632393964623965633832332f747269652d64622d302e32322e302f7372632f6e6962626c652f6e6962626c657665632e72735cdc11006400000060000000330000005cdc110064000000600000000d0000005cdc1100640000006b0000000f0000005cdc1100640000006b0000003e0000005cdc110064000000690000000f0000005cdc11006400000091000000390000005cdc11006400000091000000110000005cdc11006400000093000000110000005cdc110064000000940000004000000070dd110066000000980000001700000070dd11006600000096000000290000002f686f6d652f6261737469616e2f2e636172676f2f72656769737472792f7372632f6769746875622e636f6d2d316563633632393964623965633832332f747269652d64622d302e32322e302f7372632f6e6962626c652f6e6962626c65736c6963652e7273000084df11005e0000004d0000001c00000070dd110066000000400000001200000070dd110066000000550000003200000070dd1100660000004f0000002d00000070dd110066000000e10000000f00000070dd110066000000df0000000f00000070dd110066000000e10000003d0000006361706163697479206f766572666c6f770000007ce01100830000000a00000009000000617373657274696f6e206661696c65643a206e65775f636170203e3d206c656e617373657274696f6e206661696c65643a20696e646578203c3d206c656e000084df11005e0000008d0000003c00000084df11005e0000008d0000005100000084df11005e0000008d00000031000000fcde1100580000004b00000042000000fcde1100580000004a0000003e0000002f686f6d652f6261737469616e2f2e636172676f2f72656769737472792f7372632f6769746875622e636f6d2d316563633632393964623965633832332f747269652d64622d302e32322e302f7372632f6e6f64652e7273fcde1100580000006b00000022000000fcde1100580000009a00000032000000fcde110058000000aa0000003e0000002f686f6d652f6261737469616e2f2e636172676f2f72656769737472792f7372632f6769746875622e636f6d2d316563633632393964623965633832332f747269652d64622d302e32322e302f7372632f6e6962626c652f6d6f642e7273000084df11005e000000860000003100000084df11005e000000860000004200000084df11005e000000860000002600000084df11005e000000870000001d00000084df11005e000000870000000d00000084df11005e0000008e0000001800000084df11005e0000008e0000000d000000ffe011002d0000002ce111000c00000038e11100030000007ce011008300000010000000090000002f6e69782f73746f72652f39357734373162393862373934323470796c393364347a37686a6735693931372d727573742d312e34362e302d6e696768746c792d323032302d30362d33302d3136393537626434642f6c69622f727573746c69622f7372632f727573742f7372632f6c6962636f72652f6d6163726f732f6d6f642e7273617373657274696f6e206661696c65643a2060286c656674203d3d20726967687429600a20206c6566743a2060602c0a2072696768743a2060603a200041bcc2c7000b0c4f8167f754e01100981010000041c8c2c7000b08000000000000000000ef8b04046e616d6501e68b04d506001c6578745f616c6c6f6361746f725f667265655f76657273696f6e5f31011e6578745f616c6c6f6361746f725f6d616c6c6f635f76657273696f6e5f3102256578745f63727970746f5f656432353531395f67656e65726174655f76657273696f6e5f3103236578745f63727970746f5f656432353531395f7665726966795f76657273696f6e5f3104286578745f63727970746f5f66696e6973685f62617463685f7665726966795f76657273696f6e5f3105376578745f63727970746f5f736563703235366b315f65636473615f7265636f7665725f636f6d707265737365645f76657273696f6e5f3106256578745f63727970746f5f737232353531395f67656e65726174655f76657273696f6e5f3107286578745f63727970746f5f737232353531395f7075626c69635f6b6579735f76657273696f6e5f3108216578745f63727970746f5f737232353531395f7369676e5f76657273696f6e5f3109236578745f63727970746f5f737232353531395f7665726966795f76657273696f6e5f320a276578745f63727970746f5f73746172745f62617463685f7665726966795f76657273696f6e5f310b2a6578745f747269655f626c616b65325f3235365f6f7264657265645f726f6f745f76657273696f6e5f310c1c6578745f6d6973635f7072696e745f6865785f76657273696f6e5f310d1c6578745f6d6973635f7072696e745f6e756d5f76657273696f6e5f310e1d6578745f6d6973635f7072696e745f757466385f76657273696f6e5f310f226578745f6d6973635f72756e74696d655f76657273696f6e5f76657273696f6e5f3110206578745f68617368696e675f626c616b65325f3132385f76657273696f6e5f3111206578745f68617368696e675f626c616b65325f3235365f76657273696f6e5f31121e6578745f68617368696e675f74776f785f3132385f76657273696f6e5f31131d6578745f68617368696e675f74776f785f36345f76657273696f6e5f3114236578745f6f6666636861696e5f69735f76616c696461746f725f76657273696f6e5f3115346578745f6f6666636861696e5f6c6f63616c5f73746f726167655f636f6d706172655f616e645f7365745f76657273696f6e5f3116286578745f6f6666636861696e5f6c6f63616c5f73746f726167655f6765745f76657273696f6e5f3117286578745f6f6666636861696e5f6c6f63616c5f73746f726167655f7365745f76657273696f6e5f3118246578745f6f6666636861696e5f6e6574776f726b5f73746174655f76657273696f6e5f3119296578745f6f6666636861696e5f7375626d69745f7472616e73616374696f6e5f76657273696f6e5f311a1c6578745f73746f726167655f617070656e645f76657273696f6e5f311b226578745f73746f726167655f6368616e6765735f726f6f745f76657273696f6e5f311c1b6578745f73746f726167655f636c6561725f76657273696f6e5f311d226578745f73746f726167655f636c6561725f7072656669785f76657273696f6e5f311e196578745f73746f726167655f6765745f76657273696f6e5f311f1e6578745f73746f726167655f6e6578745f6b65795f76657273696f6e5f31201a6578745f73746f726167655f726561645f76657273696f6e5f31211a6578745f73746f726167655f726f6f745f76657273696f6e5f3122196578745f73746f726167655f7365745f76657273696f6e5f3123196578745f6c6f6767696e675f6c6f675f76657273696f6e5f31240c5f5f727573745f616c6c6f63250a5f5f72675f616c6c6f63260e5f5f727573745f6465616c6c6f63270c5f5f72675f6465616c6c6f63280e5f5f727573745f7265616c6c6f63290c5f5f72675f7265616c6c6f632a135f5f727573745f616c6c6f635f7a65726f65642b115f5f72675f616c6c6f635f7a65726f65642c33616c6c6f633a3a616c6c6f633a3a68616e646c655f616c6c6f635f6572726f723a3a68653632313735653032626233666365652d08727573745f6f6f6d2e34616c6c6f633a3a7261775f7665633a3a63617061636974795f6f766572666c6f773a3a68613336393737366230373631383065652f29636f72653a3a70616e69636b696e673a3a70616e69633a3a6839346334623863356132363962363731302e616c6c6f633a3a7665633a3a5665633c543e3a3a726573657276653a3a68326664393833333333373438666634363125616c6c6f633a3a666d743a3a666f726d61743a3a68643637636237326439366365616537343236636f72653a3a70616e69636b696e673a3a70616e69635f626f756e64735f636865636b3a3a68613434306634316430653465636135663348616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a616c6c6f636174655f696e3a3a7b7b636c6f737572657d7d3a3a68303133303137326566613837613461653448616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a616c6c6f636174655f696e3a3a7b7b636c6f737572657d7d3a3a68303034366462373935323539353336313523636f72653a3a666d743a3a77726974653a3a68386239393664386166303134373563393633636f72653a3a6f7074696f6e3a3a6578706563745f6e6f6e655f6661696c65643a3a6838303738353131373231323537393064372b636f72653a3a7074723a3a64726f705f696e5f706c6163653a3a6830313861303038323436343338333764383a3c266d7574205720617320636f72653a3a666d743a3a57726974653e3a3a77726974655f7374723a3a6837616334366139636662626237663461393b3c266d7574205720617320636f72653a3a666d743a3a57726974653e3a3a77726974655f636861723a3a68653539656531663161303234396433323a3a3c266d7574205720617320636f72653a3a666d743a3a57726974653e3a3a77726974655f666d743a3a68633030396438636138326136323866333b3c616c6c6f633a3a7665633a3a5665633c543e3a3a696e736572743a3a6173736572745f6661696c65643a3a68326566373438333464333633663232323c4e636f72653a3a666d743a3a6e756d3a3a696d703a3a3c696d706c20636f72653a3a666d743a3a446973706c617920666f72207533323e3a3a666d743a3a68643732333966663762346432373961393d2d636f72653a3a70616e69636b696e673a3a70616e69635f666d743a3a68363266376536303563646636356438333e3c616c6c6f633a3a7665633a3a5665633c543e3a3a72656d6f76653a3a6173736572745f6661696c65643a3a68643539363966396362383933383437313f41616c6c6f633a3a7665633a3a5665633c543e3a3a647261696e3a3a73746172745f6173736572745f6661696c65643a3a6864646434393434383437313434653633403f616c6c6f633a3a7665633a3a5665633c543e3a3a647261696e3a3a656e645f6173736572745f6661696c65643a3a68326530323239653865373632663830304139636f72653a3a6f70733a3a66756e6374696f6e3a3a466e4f6e63653a3a63616c6c5f6f6e63653a3a6862623166383165373465613561666362422f636f72653a3a666d743a3a6e756d3a3a696d703a3a666d745f7536343a3a68353038316364363232323036356666324311727573745f626567696e5f756e77696e6444313c5420617320636f72653a3a616e793a3a416e793e3a3a747970655f69643a3a68343666323535323531313665396437634535636f72653a3a666d743a3a466f726d61747465723a3a7061645f696e74656772616c3a3a68666436353332623361343165653538344643636f72653a3a666d743a3a466f726d61747465723a3a7061645f696e74656772616c3a3a77726974655f7072656669783a3a68363264373865303166366665343461394734636f72653a3a736c6963653a3a736c6963655f696e6465785f6c656e5f6661696c3a3a68366534666663353665383436303233384836636f72653a3a736c6963653a3a736c6963655f696e6465785f6f726465725f6661696c3a3a6830303962373431346231373064363864492c636f72653a3a666d743a3a466f726d61747465723a3a7061643a3a68363731633633656232653631393637634a2e636f72653a3a7374723a3a736c6963655f6572726f725f6661696c3a3a68626664643838393335666463613565614b323c265420617320636f72653a3a666d743a3a446973706c61793e3a3a666d743a3a68356434336134343437613230356536654c4a3c636f72653a3a6f70733a3a72616e67653a3a52616e67653c4964783e20617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a68386338613937623836363031303139364d323c6368617220617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a68353161356131613465363632666638304e47636f72653a3a756e69636f64653a3a756e69636f64655f646174613a3a6772617068656d655f657874656e643a3a6c6f6f6b75703a3a68316666386161666230623631653664624f32636f72653a3a756e69636f64653a3a7072696e7461626c653a3a636865636b3a3a68386637326663363333633535303737665049636f72653a3a666d743a3a6e756d3a3a3c696d706c20636f72653a3a666d743a3a446562756720666f72207573697a653e3a3a666d743a3a686439636361643930306463343933373351453c636f72653a3a63656c6c3a3a426f72726f774572726f7220617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a683264666531646132313831643233636252483c636f72653a3a63656c6c3a3a426f72726f774d75744572726f7220617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6864363263656565646535323462383636532e636f72653a3a6f7074696f6e3a3a6578706563745f6661696c65643a3a683136653931616233356565313062343654303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a683465336439326132303130393332393655323c265420617320636f72653a3a666d743a3a446973706c61793e3a3a666d743a3a683533316164306131613231323765346156533c636f72653a3a666d743a3a6275696c646572733a3a5061644164617074657220617320636f72653a3a666d743a3a57726974653e3a3a77726974655f7374723a3a6836333666376138303163336364366463572e636f72653a3a736c6963653a3a6d656d6368723a3a6d656d6368723a3a6863373431653832636430303036316535582f636f72653a3a666d743a3a57726974653a3a77726974655f636861723a3a6863343962306130636531313234303565592e636f72653a3a666d743a3a57726974653a3a77726974655f666d743a3a68666665616534626662336532373830665a3a3c266d7574205720617320636f72653a3a666d743a3a57726974653e3a3a77726974655f7374723a3a68303239336431643562663030386430365b3b3c266d7574205720617320636f72653a3a666d743a3a57726974653e3a3a77726974655f636861723a3a68636362323039373264393463383036615c3a3c266d7574205720617320636f72653a3a666d743a3a57726974653e3a3a77726974655f666d743a3a68363162353730316535353330333966375d39636f72653a3a666d743a3a6275696c646572733a3a44656275675475706c653a3a6669656c643a3a68633230333562333664386530643261645e443c636f72653a3a666d743a3a417267756d656e747320617320636f72653a3a666d743a3a446973706c61793e3a3a666d743a3a68633031626238373335313438633732365f313c73747220617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6862326439653463323663616330393935608001636f72653a3a7374723a3a7472616974733a3a3c696d706c20636f72653a3a736c6963653a3a536c696365496e6465783c7374723e20666f7220636f72653a3a6f70733a3a72616e67653a3a52616e67653c7573697a653e3e3a3a696e6465783a3a7b7b636c6f737572657d7d3a3a68623965386634643732643637653933356147636f72653a3a666d743a3a6e756d3a3a3c696d706c20636f72653a3a666d743a3a42696e61727920666f722069383e3a3a666d743a3a6833353561643532653161646137623134624a636f72653a3a666d743a3a6e756d3a3a3c696d706c20636f72653a3a666d743a3a557070657248657820666f72206933323e3a3a666d743a3a6834643733343930623063636562373936633e3c636f72653a3a666d743a3a4572726f7220617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6835333665363830323363633462616533645a637572766532353531395f64616c656b3a3a6261636b656e643a3a73657269616c3a3a7536343a3a6669656c643a3a4669656c64456c656d656e7435313a3a746f5f62797465733a3a6830393531643738613764653633313737659201637572766532353531395f64616c656b3a3a6669656c643a3a3c696d706c20737562746c653a3a436f6e7374616e7454696d65457120666f7220637572766532353531395f64616c656b3a3a6261636b656e643a3a73657269616c3a3a7536343a3a6669656c643a3a4669656c64456c656d656e7435313e3a3a63745f65713a3a68623133373865663162356631323032656624737562746c653a3a626c61636b5f626f783a3a68376230666664303465623963363730666757637572766532353531395f64616c656b3a3a6261636b656e643a3a73657269616c3a3a7536343a3a6669656c643a3a4669656c64456c656d656e7435313a3a706f77326b3a3a6864383232323234376135656461396438687e637572766532353531395f64616c656b3a3a6669656c643a3a3c696d706c20637572766532353531395f64616c656b3a3a6261636b656e643a3a73657269616c3a3a7536343a3a6669656c643a3a4669656c64456c656d656e7435313e3a3a737172745f726174696f5f693a3a6831376163643437383936303734346165695a637572766532353531395f64616c656b3a3a72697374726574746f3a3a52697374726574746f506f696e743a3a656c6c696761746f725f72697374726574746f5f666c61766f723a3a68386364616166376531356262376533336a49637572766532353531395f64616c656b3a3a7363616c61723a3a5363616c61723a3a66726f6d5f63616e6f6e6963616c5f62797465733a3a68306161323833623732643632303939366b483c5b545d206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a68356535663538306162366364613632336c6c3c7061726974795f7363616c655f636f6465633a3a636f6d706163743a3a436f6d706163743c543e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a68336530336338353063663732313832366d37616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a726573657276653a3a68323433663138363235666239323735376e3a7061726974795f7363616c655f636f6465633a3a636f6465633a3a4f75747075743a3a707573683a3a68336534623230356261623737333830316f3a7061726974795f7363616c655f636f6465633a3a636f6465633a3a4f75747075743a3a707573683a3a6864323662363561303561326634393036703a7061726974795f7363616c655f636f6465633a3a636f6465633a3a4f75747075743a3a707573683a3a683139653839376633303761633532306171483c5b545d206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a6866623836363664613163616230346339723a7061726974795f7363616c655f636f6465633a3a636f6465633a3a4f75747075743a3a707573683a3a683462383864663565333738353961646473513c616c6c6f633a3a7665633a3a5665633c543e20617320616c6c6f633a3a7665633a3a53706563457874656e643c542c493e3e3a3a66726f6d5f697465723a3a6836326163663332643830626132643833743a3c266d7574205720617320636f72653a3a666d743a3a57726974653e3a3a77726974655f7374723a3a6830626165366431323835323461623531753a3c266d7574205720617320636f72653a3a666d743a3a57726974653e3a3a77726974655f666d743a3a6866393963623535633662383161343831764d3c6672616d655f737570706f72743a3a64656275673a3a52756e74696d654c6f67676572206173206c6f673a3a4c6f673e3a3a656e61626c65643a3a683630343139346337636439353431666377493c6672616d655f737570706f72743a3a64656275673a3a52756e74696d654c6f67676572206173206c6f673a3a4c6f673e3a3a6c6f673a3a683864346464633634643437336335623278323c265420617320636f72653a3a666d743a3a446973706c61793e3a3a666d743a3a6837343232323361653065303339373233794273705f696f3a3a6c6f6767696e673a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a6c6f673a3a68636138393936396338313134386631317a206b656363616b3a3a66313630303a3a68623764386665303334666634363062337b383c6c6f673a3a4e6f704c6f67676572206173206c6f673a3a4c6f673e3a3a656e61626c65643a3a68613335383238356434366663616432387c343c6c6f673a3a4e6f704c6f67676572206173206c6f673a3a4c6f673e3a3a6c6f673a3a68316637326539323462333563613064647d363c6c6f673a3a4e6f704c6f67676572206173206c6f673a3a4c6f673e3a3a666c7573683a3a68383234326330616232623665633035657e366d65726c696e3a3a7374726f62653a3a5374726f62653132383a3a626567696e5f6f703a3a68353636363836323334636166333933317f303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a68313033313635656563353434323933398001366d65726c696e3a3a7472616e7363726970743a3a5472616e7363726970743a3a6e65773a3a68393637623031386331316636633038388101416d65726c696e3a3a7472616e7363726970743a3a5472616e7363726970743a3a617070656e645f6d6573736167653a3a683965356639326362623666316335353682013d6d65726c696e3a3a7472616e7363726970743a3a5472616e7363726970743a3a617070656e645f7536343a3a68333434333833373265373065386234398301426d65726c696e3a3a7472616e7363726970743a3a5472616e7363726970743a3a6368616c6c656e67655f62797465733a3a68326633313338663230613830663562338401513c616c6c6f633a3a7665633a3a5665633c543e20617320616c6c6f633a3a7665633a3a53706563457874656e643c542c493e3e3a3a66726f6d5f697465723a3a68343966613337346633366565376437628501573c70616c6c65745f6964656e746974793a3a44617461206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64653a3a683039313132666330333437633462326286013a70616c6c65745f74696d657374616d703a3a657874726163745f696e686572656e745f646174613a3a68326562643639356236663064386466308701453c737472206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64653a3a6863366436366233663533653265616162880149706f6c6b61646f745f72756e74696d655f636f6d6d6f6e3a3a70617261636861696e733a3a6c6f63616c697a65645f7061796c6f61643a3a683335353839653363356332323261636589013a7061726974795f7363616c655f636f6465633a3a636f6465633a3a4f75747075743a3a707573683a3a68623664623936333730353164613761378a014a706f6c6b61646f745f72756e74696d655f636f6d6d6f6e3a3a70617261636861696e733a3a6d616b655f736f727465645f6475746965733a3a68313464333963346134333764646337378b01693c616c6c6f633a3a7665633a3a5665633c543e20617320616c6c6f633a3a7665633a3a53706563457874656e643c542c616c6c6f633a3a7665633a3a496e746f497465723c543e3e3e3a3a737065635f657874656e643a3a68386432333031373230313832323832358c017c7061726974795f7363616c655f636f6465633a3a636f6465633a3a696e6e65725f7475706c655f696d706c3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f646520666f72202851302c5230293e3a3a6465636f64653a3a68316161666337346164383264303762368d016b3c7061726974795f7363616c655f636f6465633a3a636f6d706163743a3a436f6d706163743c7533323e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a68633262633663623164623230326135308e01543c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a68313938323934633264303661393564668f016b3c7061726974795f7363616c655f636f6465633a3a636f6d706163743a3a436f6d706163743c7533323e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6863656237373237303139626431326262900137616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a726573657276653a3a683162363066643435336639356362393791017c7061726974795f7363616c655f636f6465633a3a636f6465633a3a696e6e65725f7475706c655f696d706c3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f646520666f72202851302c5230293e3a3a6465636f64653a3a68363238333566663339623665666261669201543c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6834633033376662663932623061623062930137616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a726573657276653a3a68343739356138613937323762646436349401437061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a68356565646365323138343536363366389501483c5b545d206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a683832643165356431316662643465616496014973705f696f3a3a68617368696e673a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a626c616b65325f3235363a3a686233393332623632633561316366393497013a7061726974795f7363616c655f636f6465633a3a636f6465633a3a4f75747075743a3a707573683a3a683131663238333238353234383934303298013a7061726974795f7363616c655f636f6465633a3a636f6465633a3a4f75747075743a3a707573683a3a683164376561633664303631653132313099013a7061726974795f7363616c655f636f6465633a3a636f6465633a3a4f75747075743a3a707573683a3a68323738353236343639666665643737339a013a7061726974795f7363616c655f636f6465633a3a636f6465633a3a4f75747075743a3a707573683a3a68353266353732316266333737636230329b013a7061726974795f7363616c655f636f6465633a3a636f6465633a3a4f75747075743a3a707573683a3a68353530623533366231386634663138349c01437061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a68656330653863396264393962636533399d013a7061726974795f7363616c655f636f6465633a3a636f6465633a3a4f75747075743a3a707573683a3a68613765663065613533663734386135639e013a7061726974795f7363616c655f636f6465633a3a636f6465633a3a4f75747075743a3a707573683a3a68366337333065636639613761656337669f013a7061726974795f7363616c655f636f6465633a3a636f6465633a3a4f75747075743a3a707573683a3a6837376438666365383431623061333235a0013a7061726974795f7363616c655f636f6465633a3a636f6465633a3a4f75747075743a3a707573683a3a6838343039383033353639623438663338a101437061726974795f7363616c655f636f6465633a3a636f6465633a3a636f6d706163745f656e636f64655f6c656e5f746f3a3a6832323362363236383030666464306461a2016f3c73705f72756e74696d653a3a67656e657269633a3a6469676573743a3a4469676573744974656d3c486173683e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64653a3a6864326234346461376362643631623834a3013a7061726974795f7363616c655f636f6465633a3a636f6465633a3a4f75747075743a3a707573683a3a6838376630396436643732343461373366a4013a7061726974795f7363616c655f636f6465633a3a636f6465633a3a4f75747075743a3a707573683a3a6838636564326635316566613131656539a5013a7061726974795f7363616c655f636f6465633a3a636f6465633a3a4f75747075743a3a707573683a3a6838663832663066313333333365643864a6013a7061726974795f7363616c655f636f6465633a3a636f6465633a3a4f75747075743a3a707573683a3a6839363966363839363831663831303236a7013a7061726974795f7363616c655f636f6465633a3a636f6465633a3a4f75747075743a3a707573683a3a6861326531393631323663363661323239a8013a7061726974795f7363616c655f636f6465633a3a636f6465633a3a4f75747075743a3a707573683a3a6863633135653937663964616439396138a9013a7061726974795f7363616c655f636f6465633a3a636f6465633a3a4f75747075743a3a707573683a3a6861386362646336643334383538613234aa013a7061726974795f7363616c655f636f6465633a3a636f6465633a3a4f75747075743a3a707573683a3a6861643762363332303734343133646235ab013a7061726974795f7363616c655f636f6465633a3a636f6465633a3a4f75747075743a3a707573683a3a6863383237333234343737343732336163ac013a7061726974795f7363616c655f636f6465633a3a636f6465633a3a4f75747075743a3a707573683a3a6864363362386138363334653537303665ad013a7061726974795f7363616c655f636f6465633a3a636f6465633a3a4f75747075743a3a707573683a3a6864383936383737626662663137613464ae013a7061726974795f7363616c655f636f6465633a3a636f6465633a3a4f75747075743a3a707573683a3a6864386432353237656162323838303031af013a7061726974795f7363616c655f636f6465633a3a636f6465633a3a4f75747075743a3a707573683a3a6866306637643531383535346533643663b001303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6864363136633836623336663566643832b1013a636f72653a3a666d743a3a6275696c646572733a3a44656275674c6973743a3a656e74726965733a3a6864386561666435323162313666323733b2014a3c58206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653e3a3a7573696e675f656e636f6465643a3a6834363837336466363637323065383334b3014273705f696f3a3a73746f726167653a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a7365743a3a6862313039316161313265383232613936b4013c7061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653a3a656e636f64653a3a6832316432653433353738346636363532b5014a3c58206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653e3a3a7573696e675f656e636f6465643a3a6865333838383236643634626566393132b601483c5b545d206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a6830393962326231343762356630663835b701433c58206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64653a3a6830663565313766613832366662303732b801433c58206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64653a3a6838636166616332656562336539366534b901433c58206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64653a3a6839396466343635313163646334336366ba015c3c636f72653a3a6f7074696f6e3a3a4f7074696f6e3c543e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a6864653336316432656131303061316539bb01433c58206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64653a3a6862666439623263333761646538323438bc01433c58206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64653a3a6864346365326536616636616634303337bd01433c58206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64653a3a6864663436333135356561663639663562be012e616c6c6f633a3a7665633a3a5665633c543e3a3a726573657276653a3a6830363632303162343563313962623462bf012e616c6c6f633a3a7665633a3a5665633c543e3a3a726573657276653a3a6861663436653265636636666136663231c001443c616c6c6f633a3a7665633a3a5665633c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a6834653330373539346336643032383634c10137616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a726573657276653a3a6834336166313439663831313635326132c201443c616c6c6f633a3a7665633a3a5665633c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a6866323664366334346663626366376332c301443c616c6c6f633a3a7665633a3a5665633c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a6835313462356135343037353162633363c401443c616c6c6f633a3a7665633a3a5665633c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a6835633837336238633534643237643633c50137616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a726573657276653a3a6862313934326538656235623835386230c6014b3c726f636f636f5f72756e74696d653a3a43616c6c20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a68666235613862353665626234353231352e32393537c701443c616c6c6f633a3a7665633a3a5665633c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a6835663464666632653864393437653865c801443c616c6c6f633a3a7665633a3a5665633c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a6836333832653735656663326635653730c90137616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a726573657276653a3a6832613731346666656530356239333331ca01443c616c6c6f633a3a7665633a3a5665633c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a6836663064373830653037346663613931cb0137616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a726573657276653a3a6831396462373236623662313533366435cc01443c616c6c6f633a3a7665633a3a5665633c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a6862633931623132616636653664313265cd0137616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a726573657276653a3a6839303664666136393230393866316163ce01443c616c6c6f633a3a7665633a3a5665633c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a6863636362363733626664616564663038cf0137616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a726573657276653a3a6833306639656161383637613737666665d001443c616c6c6f633a3a7665633a3a5665633c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a6865396664306233323230366435336532d10137616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a726573657276653a3a6834633266373462306135356433393864d201543c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6836636135336131613438356537396261d3019c013c73705f72756e74696d653a3a67656e657269633a3a756e636865636b65645f65787472696e7369633a3a556e636865636b656445787472696e7369633c416464726573732c43616c6c2c5369676e61747572652c45787472613e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6862316531303764663636336338386632d40137616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a726573657276653a3a6834323532376564643262316162613766d5012b636f72653a3a7074723a3a64726f705f696e5f706c6163653a3a6865333737343231393432626563363130d601463c616c6c6f633a3a7665633a3a5665633c543e20617320636f72653a3a6f70733a3a64726f703a3a44726f703e3a3a64726f703a3a6833373434623330643739653564613465d7012b636f72653a3a7074723a3a64726f705f696e5f706c6163653a3a6834656632316565653039316564313738d801533c616c6c6f633a3a7665633a3a5665633c543e20617320616c6c6f633a3a7665633a3a53706563457874656e643c542c493e3e3a3a737065635f657874656e643a3a6865366439376132653733343437346562d901543c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6831376661663162323463393265323962da01543c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6831616164663366396332616365643063db01543c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6831633830363131373965626261303138dc01493c5b543b2036345d206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6838313363623034316461376265636361dd01543c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6837653231376334626664333538353862de01376269747665633a3a7665633a3a4269745665633c4f2c543e3a3a66726f6d5f736c6963653a3a6831666563303962663732383537343364df014d6269747665633a3a7665633a3a6170693a3a3c696d706c206269747665633a3a7665633a3a4269745665633c4f2c543e3e3a3a7365745f6c656e3a3a6865313439653561613330366563663332e00137616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a726573657276653a3a6862376663633432613637333664646237e101543c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6834346561396132316666323236326134e201543c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6835336666303035613762303561616133e301543c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6861343563396136366531643661656138e40137616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a726573657276653a3a6862663862333536386462306336306435e501543c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6862303732393730303231393336663633e601543c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6866616663383835626637666437663563e70137616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a726573657276653a3a6838626435636563373132646534363436e80137616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a726573657276653a3a6831333638383532323562613532363337e90137616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a726573657276653a3a6831373032633963633964336237626166ea0137616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a726573657276653a3a6832643264356664386432633036323862eb0137616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a726573657276653a3a6833626665383962366132376232326233ec0137616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a726573657276653a3a6834616131313863353937626566363264ed0137616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a726573657276653a3a6837353234636165333666616363353732ee0137616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a726573657276653a3a6839303532396666653735303066613063ef0137616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a726573657276653a3a6839313631643535643933343236663362f00137616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a726573657276653a3a6839336239623135393062646532626533f10137616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a726573657276653a3a6839616463333934373263656466386431f20137616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a726573657276653a3a6862636536616530303539356138316639f30137616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a726573657276653a3a6863346634666531363161356261333936f40137616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a726573657276653a3a6863373963663562363037666132386235f50137616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a726573657276653a3a6864326437346463333364353131333334f60137616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a726573657276653a3a6865396164633035373766646165393139f70137616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a726573657276653a3a6866616133663438386266626138376434f801723c70616c6c65745f72616e646f6d6e6573735f636f6c6c6563746976655f666c69703a3a4d6f64756c653c543e206173206672616d655f6d657461646174613a3a4d6f64756c654572726f724d657461646174613e3a3a6d657461646174613a3a6866396330346239613337356234326532f901733c706f6c6b61646f745f72756e74696d655f636f6d6d6f6e3a3a7265676973747261723a3a4d6f64756c653c543e206173206672616d655f6d657461646174613a3a4d6f64756c654572726f724d657461646174613e3a3a6d657461646174613a3a6865353266623730653163626338333034fa01713c285475706c65456c656d656e74302c5475706c65456c656d656e743129206173206672616d655f737570706f72743a3a7472616974733a3a4f6e46696e616c697a653c426c6f636b4e756d6265723e3e3a3a6f6e5f66696e616c697a653a3a6839363833396661636637613238306238fb014773705f696f3a3a68617368696e673a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a74776f785f3132383a3a6831336463633238336331666666313461fc01386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6839613664306266626232346363623861fd01386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6839636166643634333633616432306531fe01386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6862393631643433343161323764303830ff014473705f696f3a3a73746f726167653a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a636c6561723a3a68373735656265393264633030333633328002386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a7075743a3a686131623232333563353561396633643481024373705f696f3a3a73746f726167653a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a726561643a3a683935613735333637353361383134343082024273705f696f3a3a73746f726167653a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a6765743a3a68666464336662333534356530313933398302303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a683438313535346633336636356534383684024673705f696f3a3a6d6973633a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a7072696e745f757466383a3a683331313862613231653931356264393485023c7061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653a3a656e636f64653a3a68623539366165646236366138363661388602376672616d655f73797374656d3a3a4d6f64756c653c543e3a3a6465706f7369745f6c6f673a3a68363333343738636366646265393830308702416672616d655f73797374656d3a3a4d6f64756c653c543e3a3a6465706f7369745f6576656e745f696e64657865643a3a686337613361363164396666333630323388023c7061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653a3a656e636f64653a3a68373334353432353863373066323736378902386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a68643461393333376235656462373431648a02386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a68333163306361333838373031376239648b02386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a7075743a3a68653765393034383631636466356234618c02386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a68623435343063616132366432306138348d02386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a68363930613066643330653936383464368e024673705f61726974686d657469633a3a68656c706572735f3132386269743a3a6d756c7469706c795f62795f726174696f6e616c3a3a68346236323532323033383839306265318f02386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a68303761373966303665623535633461399002386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a683434376362396561626130643530326291025c6672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6d61703a3a53746f726167654d61703a3a73746f726167655f6d61705f66696e616c5f6b65793a3a68303164336332316165323261386431309202386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a68366436323738633738666464363261659302653c73705f61726974686d657469633a3a66697865645f706f696e743a3a46697865645531323820617320636f72653a3a6f70733a3a61726974683a3a4469763e3a3a6469763a3a7b7b636c6f737572657d7d3a3a68613536383834643037366331376436649402a9013c706f6c6b61646f745f72756e74696d655f636f6d6d6f6e3a3a7265676973747261723a3a4d6f64756c653c543e20617320706f6c6b61646f745f72756e74696d655f636f6d6d6f6e3a3a7265676973747261723a3a5265676973747261723c3c54206173206672616d655f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a72656769737465725f706172613a3a686264353237353037303863663130616195025c6672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6d61703a3a53746f726167654d61703a3a73746f726167655f6d61705f66696e616c5f6b65793a3a68643465326365353731366130333562649602a301706f6c6b61646f745f72756e74696d655f636f6d6d6f6e3a3a7265676973747261723a3a3c696d706c20636f72653a3a636f6e766572743a3a46726f6d3c706f6c6b61646f745f72756e74696d655f636f6d6d6f6e3a3a7265676973747261723a3a4572726f723c543e3e20666f722073705f72756e74696d653a3a44697370617463684572726f723e3a3a66726f6d3a3a68366535326438303138326438336265669702386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a7075743a3a686336346563626236386234326265323998025c6672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6d61703a3a53746f726167654d61703a3a73746f726167655f6d61705f66696e616c5f6b65793a3a68306363643230313737613938623334399902386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a7075743a3a68353066353830343664333863396466359a025c6672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6d61703a3a53746f726167654d61703a3a73746f726167655f6d61705f66696e616c5f6b65793a3a68653764313339313934343138396136659b02ab013c706f6c6b61646f745f72756e74696d655f636f6d6d6f6e3a3a7265676973747261723a3a4d6f64756c653c543e20617320706f6c6b61646f745f72756e74696d655f636f6d6d6f6e3a3a7265676973747261723a3a5265676973747261723c3c54206173206672616d655f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a646572656769737465725f706172613a3a68623031663336303266613430663736659c02386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a68333638333835343066336264663733619d02386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a68313863313336323861326532326336349e025c6672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6d61703a3a53746f726167654d61703a3a73746f726167655f6d61705f66696e616c5f6b65793a3a68366232393466636236623336326231629f025c6672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6d61703a3a53746f726167654d61703a3a73746f726167655f6d61705f66696e616c5f6b65793a3a6834383935666437303864363831623161a00251706f6c6b61646f745f72756e74696d655f636f6d6d6f6e3a3a70617261636861696e733a3a4d6f64756c653c543e3a3a6e6f74655f706173745f636f64653a3a6837303063613466353631386539383961a1025c6672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6d61703a3a53746f726167654d61703a3a73746f726167655f6d61705f66696e616c5f6b65793a3a6837616365386463323733623830316665a2024673705f696f3a3a68617368696e673a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a74776f785f36343a3a6830663430643236643330653334333632a3025c6672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6d61703a3a53746f726167654d61703a3a73746f726167655f6d61705f66696e616c5f6b65793a3a6831336662383439666163396134393063a40290013c70616c6c65745f72616e646f6d6e6573735f636f6c6c6563746976655f666c69703a3a4d6f64756c653c543e206173206672616d655f737570706f72743a3a7472616974733a3a52616e646f6d6e6573733c3c54206173206672616d655f73797374656d3a3a54726169743e3a3a486173683e3e3a3a72616e646f6d3a3a6832386366386437356437326438346364a502386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6836306666356261626630373733363266a60294017061726974795f7363616c655f636f6465633a3a636f6465633a3a696e6e65725f7475706c655f696d706c3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f646520666f7220284a302c4b302c4c302c4d302c4e302c4f302c50302c51302c5230293e3a3a656e636f64655f746f3a3a6834346362343530306632636633393864a702723c7061726974795f7363616c655f636f6465633a3a636f6d706163743a3a436f6d706163745265663c753132383e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a6834626330653932396363313930336561a80283013c706f6c6b61646f745f72756e74696d655f636f6d6d6f6e3a3a7265676973747261723a3a4c696d697450617261746872656164436f6d6d6974733c543e2061732073705f72756e74696d653a3a7472616974733a3a5369676e6564457874656e73696f6e3e3a3a76616c69646174653a3a6866383661626261643137376462653639a90251706f6c6b61646f745f72756e74696d655f636f6d6d6f6e3a3a70617261636861696e733a3a4d6f64756c653c543e3a3a70617261636861696e5f686561643a3a6863643736333230626230386564353337aa0250706f6c6b61646f745f72756e74696d655f636f6d6d6f6e3a3a7265676973747261723a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6830383139373631613936326232336533ab0252706f6c6b61646f745f72756e74696d655f636f6d6d6f6e3a3a7265676973747261723a3a4d6f64756c653c543e3a3a73746f726167655f6d657461646174613a3a6862323836383834653963663030636364ac027f3c706f6c6b61646f745f72756e74696d655f636f6d6d6f6e3a3a7265676973747261723a3a5f5f47657442797465537472756374446562746f72733c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6838663362373561656635613633643631ad0282013c706f6c6b61646f745f72756e74696d655f636f6d6d6f6e3a3a7265676973747261723a3a5f5f476574427974655374727563744e6578744672656549643c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6835343762376661323336623463363736ae027e3c706f6c6b61646f745f72756e74696d655f636f6d6d6f6e3a3a7265676973747261723a3a5f5f476574427974655374727563744163746976653c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6837346363373237306635656230316164af0282013c706f6c6b61646f745f72756e74696d655f636f6d6d6f6e3a3a7265676973747261723a3a5f5f4765744279746553747275637450617261636861696e733c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6836383632383633366336333837366530b0025170616c6c65745f72616e646f6d6e6573735f636f6c6c6563746976655f666c69703a3a4d6f64756c653c543e3a3a73746f726167655f6d657461646174613a3a6830666532306230366536663262666538b1023b3c266d7574205720617320636f72653a3a666d743a3a57726974653e3a3a77726974655f636861723a3a6836363133373831353738396631643237b2023a3c266d7574205720617320636f72653a3a666d743a3a57726974653e3a3a77726974655f666d743a3a6864666565323532356365363034343361b302433c58206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6862346265393835333961323332363834b4026f726f636f636f5f72756e74696d653a3a5f3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f646520666f7220726f636f636f5f72756e74696d653a3a43616c6c3e3a3a6465636f64653a3a6838363363316338353038363139653765b502433c58206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6865666635653764623137663465326562b6026f726f636f636f5f72756e74696d653a3a5f3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f646520666f7220726f636f636f5f72756e74696d653a3a43616c6c3e3a3a6465636f64653a3a6836646165323537343931633530343364b7025d3c706f6c6b61646f745f72756e74696d655f636f6d6d6f6e3a3a7265676973747261723a3a43616c6c3c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a6864353730353335353530653838373765b8023e6861736862726f776e3a3a7261773a3a5261775461626c653c543e3a3a726573657276655f7265686173683a3a6833626335383834343564306563373462b9024d636f72653a3a686173683a3a696d706c733a3a3c696d706c20636f72653a3a686173683a3a4861736820666f722028412c42293e3a3a686173683a3a6836663764363732343566336664623663ba023e6861736862726f776e3a3a7261773a3a5261775461626c653c543e3a3a726573657276655f7265686173683a3a6861356435383264306636653537323131bb025c6672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6d61703a3a53746f726167654d61703a3a73746f726167655f6d61705f66696e616c5f6b65793a3a6862306238366566303335626366616639bc024973705f696f3a3a68617368696e673a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a626c616b65325f3132383a3a6830623030323362343066626663643733bd023d70616c6c65745f6964656e746974793a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6834346362396262663533303363323932be023f70616c6c65745f6964656e746974793a3a4d6f64756c653c543e3a3a73746f726167655f6d657461646174613a3a6839643736346264303935346536636236bf026f3c70616c6c65745f6964656e746974793a3a5f5f47657442797465537472756374526567697374726172733c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6862366430646137333032303635383464c0023c7061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653a3a656e636f64653a3a6835656665303232633630333637326132c1026b3c70616c6c65745f6964656e746974793a3a5f5f47657442797465537472756374537562734f663c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6839666565346461383065393638363033c2026c3c70616c6c65745f6964656e746974793a3a5f5f4765744279746553747275637453757065724f663c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6865323930386431316334383139363834c3026f3c70616c6c65745f6964656e746974793a3a5f5f476574427974655374727563744964656e746974794f663c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6861626437646331353939623639653339c4022b636f72653a3a7074723a3a64726f705f696e5f706c6163653a3a6863383365396662646565633631626166c5024870616c6c65745f6964656e746974793a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a6835363833616466306534316536376164c6029a013c70616c6c65745f6964656e746974793a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a4d61785265676973747261727344656661756c74427974654765747465723c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6832303664633831393235663632346536c7029b013c70616c6c65745f6964656e746974793a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a4d61785375624163636f756e747344656661756c74427974654765747465723c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6833373535306336353530353362323939c8029e013c70616c6c65745f6964656e746974793a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a5375624163636f756e744465706f73697444656661756c74427974654765747465723c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6839616662353130643166393332373763c90299013c70616c6c65745f6964656e746974793a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a4669656c644465706f73697444656661756c74427974654765747465723c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6834643235613831383166373936336439ca0299013c70616c6c65745f6964656e746974793a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a42617369634465706f73697444656661756c74427974654765747465723c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6861633530376566366261666537353437cb02820170616c6c65745f6964656e746974793a3a5f3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f646520666f722070616c6c65745f6964656e746974793a3a4a756467656d656e743c42616c616e63653e3e3a3a656e636f64655f746f3a3a6862333734313137616534316561323032cc02573c70616c6c65745f6964656e746974793a3a44617461206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6865323761353335636164353036633962cd02493c5b543b2033325d206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6865366334333231373162363039323536ce02573c70616c6c65745f6964656e746974793a3a44617461206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6861303136356533383530306436306535cf02573c70616c6c65745f6964656e746974793a3a44617461206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6837343636393433353533626334383435d0024a3c70616c6c65745f6964656e746974793a3a43616c6c3c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a6834343631613765343432326264653661d102603c70616c6c65745f6964656e746974793a3a4d6f64756c653c543e206173206672616d655f6d657461646174613a3a4d6f64756c654572726f724d657461646174613e3a3a6d657461646174613a3a6861333632636165363730386334343663d202763c70616c6c65745f6964656e746974793a3a43616c6c3c543e206173206672616d655f737570706f72743a3a7472616974733a3a556e66696c7465726564446973706174636861626c653e3a3a64697370617463685f6279706173735f66696c7465723a3a6861626264386636623432656535356266d302456672616d655f737570706f72743a3a7472616974733a3a456e737572654f726967696e3a3a656e737572655f6f726967696e3a3a6861393330333633346531323838353265d402766672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a76616c75653a3a3c696d706c206672616d655f737570706f72743a3a73746f726167653a3a53746f7261676556616c75653c543e20666f7220473e3a3a6765743a3a6865646134613838376532356264616465d5027d70616c6c65745f6964656e746974793a3a3c696d706c20636f72653a3a636f6e766572743a3a46726f6d3c70616c6c65745f6964656e746974793a3a4572726f723c543e3e20666f722073705f72756e74696d653a3a44697370617463684572726f723e3a3a66726f6d3a3a6862636233316363353637323033363937d6022e6672616d655f73797374656d3a3a656e737572655f7369676e65643a3a6862333464626234633130326565663338d7025c6672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6d61703a3a53746f726167654d61703a3a73746f726167655f6d61705f66696e616c5f6b65793a3a6833616331623530636266636565343463d802386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6831323236613930353833323566646362d9028e013c70616c6c65745f62616c616e6365733a3a4d6f64756c653c542c493e206173206672616d655f737570706f72743a3a7472616974733a3a52657365727661626c6543757272656e63793c3c54206173206672616d655f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a726573657276653a3a6836616436643161383532613865373361da0290013c70616c6c65745f62616c616e6365733a3a4d6f64756c653c542c493e206173206672616d655f737570706f72743a3a7472616974733a3a52657365727661626c6543757272656e63793c3c54206173206672616d655f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a756e726573657276653a3a6865633262376366356263323232366439db02386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a7075743a3a6831636131383165366537366463316366dc025c6672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6d61703a3a53746f726167654d61703a3a73746f726167655f6d61705f66696e616c5f6b65793a3a6835633330623137333865373466623163dd02386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6834303564356532646465306135626262de02386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6833326365636134313661306332636639df02386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a7075743a3a6839643535386539313266333866386130e0029a013c70616c6c65745f62616c616e6365733a3a4d6f64756c653c542c493e206173206672616d655f737570706f72743a3a7472616974733a3a52657365727661626c6543757272656e63793c3c54206173206672616d655f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a726570617472696174655f72657365727665643a3a6838653137323138656232323761633133e10295013c70616c6c65745f62616c616e6365733a3a4d6f64756c653c542c493e206173206672616d655f737570706f72743a3a7472616974733a3a52657365727661626c6543757272656e63793c3c54206173206672616d655f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a736c6173685f72657365727665643a3a6830303961376235306563346236623138e202386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a7075743a3a6838656137623739316136363036366236e302723c73705f72756e74696d653a3a67656e657269633a3a6865616465723a3a4865616465723c4e756d6265722c486173683e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6832396139343663643432386463646532e402910173705f72756e74696d653a3a67656e657269633a3a6469676573743a3a5f3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f646520666f722073705f72756e74696d653a3a67656e657269633a3a6469676573743a3a4469676573743c486173683e3e3a3a6465636f64653a3a6862396338303133353366663333326139e502723c73705f72756e74696d653a3a67656e657269633a3a6865616465723a3a4865616465723c4e756d6265722c486173683e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6865343532316138366439613662616562e602776672616d655f73797374656d3a3a3c696d706c20636f72653a3a636f6e766572743a3a46726f6d3c6672616d655f73797374656d3a3a4572726f723c543e3e20666f722073705f72756e74696d653a3a44697370617463684572726f723e3a3a66726f6d3a3a6831643262343466613034373362633261e7027770616c6c65745f70726f78793a3a3c696d706c20636f72653a3a636f6e766572743a3a46726f6d3c70616c6c65745f70726f78793a3a4572726f723c543e3e20666f722073705f72756e74696d653a3a44697370617463684572726f723e3a3a66726f6d3a3a6838666632373230353961646537643532e8027b70616c6c65745f6772616e6470613a3a3c696d706c20636f72653a3a636f6e766572743a3a46726f6d3c70616c6c65745f6772616e6470613a3a4572726f723c543e3e20666f722073705f72756e74696d653a3a44697370617463684572726f723e3a3a66726f6d3a3a6861633463303766303363333132333932e9027b70616c6c65745f696e64696365733a3a3c696d706c20636f72653a3a636f6e766572743a3a46726f6d3c70616c6c65745f696e64696365733a3a4572726f723c543e3e20666f722073705f72756e74696d653a3a44697370617463684572726f723e3a3a66726f6d3a3a6864633139626135616633333035623262ea027b70616c6c65745f76657374696e673a3a3c696d706c20636f72653a3a636f6e766572743a3a46726f6d3c70616c6c65745f76657374696e673a3a4572726f723c543e3e20666f722073705f72756e74696d653a3a44697370617463684572726f723e3a3a66726f6d3a3a6835326435643661333936636532356163eb027f70616c6c65745f62616c616e6365733a3a3c696d706c20636f72653a3a636f6e766572743a3a46726f6d3c70616c6c65745f62616c616e6365733a3a4572726f723c542c493e3e20666f722073705f72756e74696d653a3a44697370617463684572726f723e3a3a66726f6d3a3a6866303062666633383966663762383830ec027d70616c6c65745f6d756c74697369673a3a3c696d706c20636f72653a3a636f6e766572743a3a46726f6d3c70616c6c65745f6d756c74697369673a3a4572726f723c543e3e20666f722073705f72756e74696d653a3a44697370617463684572726f723e3a3a66726f6d3a3a6833363565396230663835356263656637ed023f70616c6c65745f6f6666656e6365733a3a4d6f64756c653c543e3a3a73746f726167655f6d657461646174613a3a6833336633353831636337393030393037ee02773c70616c6c65745f6f6666656e6365733a3a5f5f476574427974655374727563745265706f72747342794b696e64496e6465783c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6834363633643963376637373236663866ef027b3c70616c6c65745f6f6666656e6365733a3a5f5f47657442797465537472756374436f6e63757272656e745265706f727473496e6465783c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6831313239326232326636626261643032f002753c70616c6c65745f6f6666656e6365733a3a5f5f4765744279746553747275637444656665727265644f6666656e6365733c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6862333565636139663031363663646633f1027d70616c6c65745f7265636f766572793a3a3c696d706c20636f72653a3a636f6e766572743a3a46726f6d3c70616c6c65745f7265636f766572793a3a4572726f723c543e3e20666f722073705f72756e74696d653a3a44697370617463684572726f723e3a3a66726f6d3a3a6839366231646132643161333037373037f202810170616c6c65745f617574686f72736869703a3a3c696d706c20636f72653a3a636f6e766572743a3a46726f6d3c70616c6c65745f617574686f72736869703a3a4572726f723c543e3e20666f722073705f72756e74696d653a3a44697370617463684572726f723e3a3a66726f6d3a3a6864356265626563353561383662343138f3024b73705f636f6e73656e7375735f626162653a3a636865636b5f65717569766f636174696f6e5f70726f6f663a3a7b7b636c6f737572657d7d3a3a6837333731333231373765653632376361f4023473705f72756e74696d653a3a7472616974733a3a486173683a3a686173685f6f663a3a6864623864653065316630353163396136f5024c73705f696f3a3a63727970746f3a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a737232353531395f7665726966793a3a6832653038303662653931326230666334f602437061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a6839376463653833396230383431356562f702437061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a6863656139643835303338303838656537f8025e3c636f72653a3a726573756c743a3a526573756c743c542c453e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a6838626339626466326238376130353334f9023c7061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653a3a656e636f64653a3a6865396235666363383064303566303736fa023f7061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653a3a656e636f64655f746f3a3a6831343766363837386139393535366434fb025c6672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6d61703a3a53746f726167654d61703a3a73746f726167655f6d61705f66696e616c5f6b65793a3a6861303535646537653362396537666439fc02706672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a646f75626c655f6d61703a3a53746f72616765446f75626c654d61703a3a73746f726167655f646f75626c655f6d61705f66696e616c5f6b65793a3a6835303733663931353531323532393539fd02437061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a6833396166313932646266643366636566fe025c6672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6d61703a3a53746f726167654d61703a3a73746f726167655f6d61705f66696e616c5f6b65793a3a6834386363393231326138313133393534ff02a501706f6c6b61646f745f72756e74696d655f636f6d6d6f6e3a3a70617261636861696e733a3a3c696d706c20636f72653a3a636f6e766572743a3a46726f6d3c706f6c6b61646f745f72756e74696d655f636f6d6d6f6e3a3a70617261636861696e733a3a4572726f723c543e3e20666f722073705f72756e74696d653a3a44697370617463684572726f723e3a3a66726f6d3a3a6865663330656539353532323032643665800339636f72653a3a736c6963653a3a3c696d706c205b545d3e3a3a62696e6172795f7365617263683a3a683731373032643337396662393732373381034a3c70616c6c65745f6f6666656e6365733a3a43616c6c3c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a68626339393161663866613064303163348203553c73705f72756e74696d653a3a4d756c74695369676e61747572652061732073705f72756e74696d653a3a7472616974733a3a5665726966793e3a3a7665726966793a3a683862623233323765303364656365653083034c73705f696f3a3a63727970746f3a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a656432353531395f7665726966793a3a683362373531323063396639333436633184036073705f696f3a3a63727970746f3a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a736563703235366b315f65636473615f7265636f7665725f636f6d707265737365643a3a686664386464613766643139643462303285033c70616c6c65745f696e64696365733a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a686532393731396335393834626338316486033e70616c6c65745f696e64696365733a3a4d6f64756c653c543e3a3a73746f726167655f6d657461646174613a3a683035613062616233663364663534383387033d70616c6c65745f6d756c74697369673a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a683461666334623439663236373838363688033f70616c6c65745f6d756c74697369673a3a4d6f64756c653c543e3a3a73746f726167655f6d657461646174613a3a68613662356236656265323336363734388903303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a68306266613739353439616465356264338a03303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a68346461313966376161396563383965328b03303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a68663263323065643531356137623131648c03383c2a636f6e7374205420617320636f72653a3a666d743a3a506f696e7465723e3a3a666d743a3a68656164323032343166653239393439308d034a3c70616c6c65745f6d756c74697369673a3a43616c6c3c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a68393465313638373732313338626365628e03473c6672616d655f73797374656d3a3a43616c6c3c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a68343734306330383931366233336436398f03463c70616c6c65745f626162653a3a43616c6c3c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a68376638633430386664643762646536629003493c70616c6c65745f6772616e6470613a3a43616c6c3c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a683264613166656236343832363565623791035e3c706f6c6b61646f745f72756e74696d655f636f6d6d6f6e3a3a70617261636861696e733a3a43616c6c3c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a683335363232396232323138333935323292034a3c70616c6c65745f7265636f766572793a3a43616c6c3c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a683034656633616237386363376437613193034b3c70616c6c65745f7363686564756c65723a3a43616c6c3c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a68653633653334623337333564376332619403463c70616c6c65745f7375646f3a3a43616c6c3c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a686537616163313630343239653164313795034b3c726f636f636f5f72756e74696d653a3a43616c6c20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a68666235613862353665626234353231352e343238369603603c70616c6c65745f6d756c74697369673a3a4d6f64756c653c543e206173206672616d655f6d657461646174613a3a4d6f64756c654572726f724d657461646174613e3a3a6d657461646174613a3a683262366530333962333462386234323197035c6672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6d61703a3a53746f726167654d61703a3a73746f726167655f6d61705f66696e616c5f6b65793a3a6866313038633762633762383861376533980330636f72653a3a7074723a3a64726f705f696e5f706c6163653a3a68653337373432313934326265633631302e3137373399034770616c6c65745f6d756c74697369673a3a4d6f64756c653c543e3a3a656e737572655f736f727465645f616e645f696e736572743a3a68383862613961353062663335643038319a033670616c6c65745f6d756c74697369673a3a4d6f64756c653c543e3a3a6f7065726174653a3a68616464353063333935323135626233379b03706672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a646f75626c655f6d61703a3a53746f72616765446f75626c654d61703a3a73746f726167655f646f75626c655f6d61705f66696e616c5f6b65793a3a68653838353830346237383133363737669c03386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a68376263613535353766636165363133379d034570616c6c65745f6d756c74697369673a3a4d6f64756c653c543e3a3a73746f72655f63616c6c5f616e645f726573657276653a3a68326531313461653430623433653939339e03386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a7075743a3a68646234643864333635353735333165359f035c6672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6d61703a3a53746f726167654d61703a3a73746f726167655f6d61705f66696e616c5f6b65793a3a6835373565373332313538356562616565a003386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6839333735323065643561386261623465a103673c726f636f636f5f72756e74696d653a3a43616c6c206173206672616d655f737570706f72743a3a776569676874733a3a4765744469737061746368496e666f3e3a3a6765745f64697370617463685f696e666f3a3a6831333337336430616565316630626361a2033970616c6c65745f6d756c74697369673a3a4d6f64756c653c543e3a3a636c6561725f63616c6c3a3a6830626637353635643363346636316237a303723c726f636f636f5f72756e74696d653a3a43616c6c206173206672616d655f737570706f72743a3a7472616974733a3a556e66696c7465726564446973706174636861626c653e3a3a64697370617463685f6279706173735f66696c7465723a3a6861353434326336313864626432343761a4034073705f696e686572656e74733a3a436865636b496e686572656e7473526573756c743a3a7075745f6572726f723a3a6834656462313434336266333930626166a503613c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a42547265654d61703c4b2c563e20617320636f72653a3a6f70733a3a64726f703a3a44726f703e3a3a64726f703a3a6837643766653638636234363663313066a60341616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a7365617263683a3a7365617263685f747265653a3a6838376438663061373130656630373231a7034b616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a566163616e74456e7472793c4b2c563e3a3a696e736572743a3a6832653839343963643966623030386434a8034073705f696e686572656e74733a3a436865636b496e686572656e7473526573756c743a3a7075745f6572726f723a3a6837623061336265616663383931623865a903753c285475706c65456c656d656e74302c5475706c65456c656d656e743129206173206672616d655f737570706f72743a3a7472616974733a3a4f6e496e697469616c697a653c426c6f636b4e756d6265723e3e3a3a6f6e5f696e697469616c697a653a3a6833643932393235636437323937393437aa033870616c6c65745f626162653a3a4d6f64756c653c543e3a3a646f5f696e697469616c697a653a3a6864336637386661316162393739663030ab03386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6831646666336235656634396135303663ac03766672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a76616c75653a3a3c696d706c206672616d655f737570706f72743a3a73746f726167653a3a53746f7261676556616c75653c543e20666f7220473e3a3a6765743a3a6839323131383335656665633839623035ad03766672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a76616c75653a3a3c696d706c206672616d655f737570706f72743a3a73746f726167653a3a53746f7261676556616c75653c543e20666f7220473e3a3a6765743a3a6833643434646136383137303238346266ae033d70616c6c65745f696d5f6f6e6c696e653a3a4d6f64756c653c543e3a3a69735f6f6e6c696e655f6175783a3a6862613231636636383864333164633966af034b73705f696f3a3a73746f726167653a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a636c6561725f7072656669783a3a6831663039323935353735663430373365b00376726f636f636f5f72756e74696d653a3a5f3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f646520666f7220726f636f636f5f72756e74696d653a3a53657373696f6e4b6579733e3a3a6465636f64653a3a6839313864363166656636353862373739b1035c6672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6d61703a3a53746f726167654d61703a3a73746f726167655f6d61705f66696e616c5f6b65793a3a6866633762623431333761623330373239b203386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6866623434396465373163333266623937b30393013c285475706c65456c656d656e74302c5475706c65456c656d656e74312c5475706c65456c656d656e74322c5475706c65456c656d656e74332c5475706c65456c656d656e7434292061732070616c6c65745f73657373696f6e3a3a53657373696f6e48616e646c65723c4149643e3e3a3a6f6e5f6e65775f73657373696f6e3a3a6865643233656161373862363066653231b403766672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a76616c75653a3a3c696d706c206672616d655f737570706f72743a3a73746f726167653a3a53746f7261676556616c75653c543e20666f7220473e3a3a6765743a3a6835373233336438396363313162646564b5033c7061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653a3a656e636f64653a3a6839393532666633356232326661353066b6033770616c6c65745f617574686f72736869703a3a4d6f64756c653c543e3a3a617574686f723a3a6837313562326464396166303736383732b7033f70616c6c65745f696d5f6f6e6c696e653a3a4d6f64756c653c543e3a3a6e6f74655f617574686f72736869703a3a6835386130326562366366653463343032b803386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6835376266333034653634633738353331b9033c70616c6c65745f73657373696f6e3a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6833353561613362396639323636353766ba033e70616c6c65745f73657373696f6e3a3a4d6f64756c653c543e3a3a73746f726167655f6d657461646174613a3a6865343565363630346464633863636333bb03763c70616c6c65745f73657373696f6e3a3a5f5f4765744279746553747275637444697361626c656456616c696461746f72733c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6862636566666566323163626164643165bc03703c70616c6c65745f73657373696f6e3a3a5f5f4765744279746553747275637443757272656e74496e6465783c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6835376664343661353964616336323138bd035c6672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6d61703a3a53746f726167654d61703a3a73746f726167655f6d61705f66696e616c5f6b65793a3a6866313630376439666663336261373863be033d70616c6c65745f7265636f766572793a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6831353333646131313536363063363633bf033f70616c6c65745f7265636f766572793a3a4d6f64756c653c543e3a3a73746f726167655f6d657461646174613a3a6837356532343862383861356566663865c0034870616c6c65745f7265636f766572793a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a6863663166626537323338633637636664c1039c013c70616c6c65745f7265636f766572793a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a5265636f766572794465706f73697444656661756c74427974654765747465723c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6865373561396435643239623339656639c20397013c70616c6c65745f7265636f766572793a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a4d6178467269656e647344656661756c74427974654765747465723c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6866323832633739376566393638363434c303a0013c70616c6c65745f7265636f766572793a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a467269656e644465706f736974466163746f7244656661756c74427974654765747465723c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6862353666636634306666623365666663c4037470616c6c65745f7265636f766572793a3a5f3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f646520666f722070616c6c65745f7265636f766572793a3a43616c6c3c543e3e3a3a6465636f64653a3a6834386433626566316431316662396439c5037470616c6c65745f7265636f766572793a3a5f3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f646520666f722070616c6c65745f7265636f766572793a3a43616c6c3c543e3e3a3a6465636f64653a3a6865633437363931313839346561613836c6036a636f72653a3a6f70733a3a66756e6374696f6e3a3a696d706c733a3a3c696d706c20636f72653a3a6f70733a3a66756e6374696f6e3a3a466e4f6e63653c413e20666f7220266d757420463e3a3a63616c6c5f6f6e63653a3a6862396435376135313563663632623761c7035b3c726f636f636f5f72756e74696d653a3a53657373696f6e4b6579732061732073705f72756e74696d653a3a7472616974733a3a4f70617175654b6579733e3a3a6765745f7261773a3a6862663332373138353231333631653062c8036a636f72653a3a6f70733a3a66756e6374696f6e3a3a696d706c733a3a3c696d706c20636f72653a3a6f70733a3a66756e6374696f6e3a3a466e4f6e63653c413e20666f7220266d757420463e3a3a63616c6c5f6f6e63653a3a6865613466653463353031383334333539c9035f3c70616c6c65745f73657373696f6e3a3a4d6f64756c653c543e206173206672616d655f6d657461646174613a3a4d6f64756c654572726f724d657461646174613e3a3a6d657461646174613a3a6834306134303661333064643034626166ca03603c70616c6c65745f7265636f766572793a3a4d6f64756c653c543e206173206672616d655f6d657461646174613a3a4d6f64756c654572726f724d657461646174613e3a3a6d657461646174613a3a6838363335333165363466656266653632cb03763c70616c6c65745f7265636f766572793a3a43616c6c3c543e206173206672616d655f737570706f72743a3a7472616974733a3a556e66696c7465726564446973706174636861626c653e3a3a64697370617463685f6279706173735f66696c7465723a3a6838343164656537633832346665313936cc035c6672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6d61703a3a53746f726167654d61703a3a73746f726167655f6d61705f66696e616c5f6b65793a3a6865393166633039636261376465613965cd032c6672616d655f73797374656d3a3a656e737572655f726f6f743a3a6831636133396365613262393966356536ce03386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a7075743a3a6830356131343630393764616363303737cf035c6672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6d61703a3a53746f726167654d61703a3a73746f726167655f6d61705f66696e616c5f6b65793a3a6866353930393362336566373564396230d003706672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a646f75626c655f6d61703a3a53746f72616765446f75626c654d61703a3a73746f726167655f646f75626c655f6d61705f66696e616c5f6b65793a3a6830303665616163646263616235646431d103386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a7075743a3a6861383830383033376461333031393061d203386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6864653766306332653434336436663765d303386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6837646339616338626234363561386531d403336672616d655f73797374656d3a3a4d6f64756c653c543e3a3a696e635f7265663a3a6831616639623465633834646665663133d5034773705f696f3a3a73746f726167653a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a6e6578745f6b65793a3a6834366239666134663764306132656437d603336672616d655f73797374656d3a3a4d6f64756c653c543e3a3a6465635f7265663a3a6861626433633135356634663533656538d70385013c70616c6c65745f62616c616e6365733a3a4d6f64756c653c542c493e206173206672616d655f737570706f72743a3a7472616974733a3a43757272656e63793c3c54206173206672616d655f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a7472616e736665723a3a6861343537666136313736636131653264d8035c6672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6d61703a3a53746f726167654d61703a3a73746f726167655f6d61705f66696e616c5f6b65793a3a6865653439343834356465353562633931d903386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6837643163653162636634383063333430da03386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a7075743a3a6866373661623562666539353764323966db034873705f72756e74696d653a3a7472616974733a3a4163636f756e744964436f6e76657273696f6e3a3a696e746f5f6163636f756e743a3a6865393431626533633231393264363037dc03753c285475706c65456c656d656e74302c5475706c65456c656d656e743129206173206672616d655f737570706f72743a3a7472616974733a3a4f6e496e697469616c697a653c426c6f636b4e756d6265723e3e3a3a6f6e5f696e697469616c697a653a3a6836316538316233303732303233363362dd035c6672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6d61703a3a53746f726167654d61703a3a73746f726167655f6d61705f66696e616c5f6b65793a3a6866356664613930643431613635643664de03386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6862323332616435633736666634326664df034b3c726f636f636f5f72756e74696d653a3a43616c6c20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a68666235613862353665626234353231352e31393533e0035c6672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6d61703a3a53746f726167654d61703a3a73746f726167655f6d61705f66696e616c5f6b65793a3a6865376438376634633132656666623963e103386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a7075743a3a6835653861616563313539393937653532e203776672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6d61703a3a3c696d706c206672616d655f737570706f72743a3a73746f726167653a3a53746f726167654d61703c4b2c563e20666f7220473e3a3a617070656e643a3a6831643032323836386131376161643665e303766672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a76616c75653a3a3c696d706c206672616d655f737570706f72743a3a73746f726167653a3a53746f7261676556616c75653c543e20666f7220473e3a3a6765743a3a6837663431636365666134323438313261e4035c6672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6d61703a3a53746f726167654d61703a3a73746f726167655f6d61705f66696e616c5f6b65793a3a6862303037656263366465306436653164e503386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6831383239373034306436656262393664e6035c6672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6d61703a3a53746f726167654d61703a3a73746f726167655f6d61705f66696e616c5f6b65793a3a6832376263396164666662386633383961e703386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a7075743a3a6835386132363731623135366162363162e803a70170616c6c65745f7363686564756c65723a3a5f3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f646520666f722070616c6c65745f7363686564756c65723a3a5363686564756c656456323c43616c6c2c426c6f636b4e756d6265722c50616c6c6574734f726967696e2c4163636f756e7449643e3e3a3a656e636f64655f746f3a3a6837623538653531336165653038323363e9034573705f696f3a3a73746f726167653a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a617070656e643a3a6837383932316438383933663531666363ea038b013c73705f72756e74696d653a3a67656e657269633a3a636865636b65645f65787472696e7369633a3a436865636b656445787472696e7369633c4163636f756e7449642c43616c6c2c45787472613e2061732073705f72756e74696d653a3a7472616974733a3a4170706c7961626c653e3a3a6170706c793a3a6836346666373837366464333739333233eb035a6672616d655f73797374656d3a3a657874656e73696f6e733a3a636865636b5f7765696768743a3a436865636b5765696768743c543e3a3a646f5f7072655f64697370617463683a3a6834633938303433316138613833306165ec034970616c6c65745f7472616e73616374696f6e5f7061796d656e743a3a4d6f64756c653c543e3a3a636f6d707574655f6665655f7261773a3a6866666432353439383531376232323765ed03b2013c6672616d655f73797374656d3a3a4d6f64756c653c543e206173206672616d655f737570706f72743a3a7472616974733a3a53746f7265644d61703c3c54206173206672616d655f73797374656d3a3a54726169743e3a3a4163636f756e7449642c3c54206173206672616d655f73797374656d3a3a54726169743e3a3a4163636f756e74446174613e3e3a3a7472795f6d75746174655f6578697374733a3a6865373039363364316532333963663437ee0387013c706f6c6b61646f745f72756e74696d655f636f6d6d6f6e3a3a70617261636861696e733a3a56616c6964617465446f75626c65566f74655265706f7274733c543e2061732073705f72756e74696d653a3a7472616974733a3a5369676e6564457874656e73696f6e3e3a3a76616c69646174653a3a6864613631346532656635356338353432ef0395013c70616c6c65745f73657373696f6e3a3a686973746f726963616c3a3a4d6f64756c653c543e206173206672616d655f737570706f72743a3a7472616974733a3a4b65794f776e657250726f6f6653797374656d3c2873705f636f72653a3a63727970746f3a3a4b65795479706549642c44293e3e3a3a636865636b5f70726f6f663a3a6834393938346137636339383332326636f0036b3c70616c6c65745f696d5f6f6e6c696e653a3a4d6f64756c653c543e2061732073705f72756e74696d653a3a7472616974733a3a56616c6964617465556e7369676e65643e3a3a76616c69646174655f756e7369676e65643a3a6830643335336363656664306230346664f103386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a7075743a3a6834306331303064366637343733373533f2034573705f696f3a3a6d6973633a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a7072696e745f6e756d3a3a6831346633623939376166663436663361f3038e013c73705f72756e74696d653a3a67656e657269633a3a636865636b65645f65787472696e7369633a3a436865636b656445787472696e7369633c4163636f756e7449642c43616c6c2c45787472613e2061732073705f72756e74696d653a3a7472616974733a3a4170706c7961626c653e3a3a76616c69646174653a3a6834356232623765393037323461366266f4035373705f72756e74696d653a3a7472616e73616374696f6e5f76616c69646974793a3a56616c69645472616e73616374696f6e3a3a636f6d62696e655f776974683a3a6863343731303137356632366539343865f503566672616d655f73797374656d3a3a657874656e73696f6e733a3a636865636b5f7765696768743a3a436865636b5765696768743c543e3a3a646f5f76616c69646174653a3a6831373363353862333030343965373038f6033c70616c6c65745f76657374696e673a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6831383834613564326561393961653265f7033e70616c6c65745f76657374696e673a3a4d6f64756c653c543e3a3a73746f726167655f6d657461646174613a3a6838373566306234653835666463306238f8034770616c6c65745f76657374696e673a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a6864643138393964623034623736643933f9039d013c70616c6c65745f76657374696e673a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a4d696e5665737465645472616e7366657244656661756c74427974654765747465723c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6862653761333133363233663962653563fa03746672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6d61703a3a3c696d706c206672616d655f737570706f72743a3a73746f726167653a3a53746f726167654d61703c4b2c563e20666f7220473e3a3a6765743a3a6834343934356266343730613834316137fb03553c6d656d6f72795f64623a3a4d656d6f727944423c482c4b462c542c4d3e20617320636f72653a3a64656661756c743a3a44656661756c743e3a3a64656661756c743a3a6865383134633733343163663562393065fc03523c6d656d6f72795f64623a3a4d656d6f727944423c482c4b462c542c4d3e20617320686173685f64623a3a4861736844423c482c543e3e3a3a696e736572743a3a6839313231366535636130356638303961fd034470616c6c65745f73657373696f6e3a3a686973746f726963616c3a3a50726f76696e67547269653c543e3a3a71756572793a3a6832656231316532386362633634663564fe032b636f72653a3a7074723a3a64726f705f696e5f706c6163653a3a6864613531373863663664376232656536ff03366861736862726f776e3a3a6d61703a3a486173684d61703c4b2c562c533e3a3a6765743a3a6834333734643233393730643062333563800438747269655f64623a3a6c6f6f6b75703a3a4c6f6f6b75703c4c2c513e3a3a6c6f6f6b5f75703a3a683335303866353430386466316463396281044b70616c6c65745f73657373696f6e3a3a686973746f726963616c3a3a50726f76696e67547269653c543e3a3a67656e65726174655f666f723a3a68363530656531613763346162363339378204543c747269655f64623a3a7472696564626d75743a3a5472696544424d75743c4c3e20617320747269655f64623a3a547269654d75743c4c3e3e3a3a696e736572743a3a686435633933306464653962396465373883042b636f72653a3a7074723a3a64726f705f696e5f706c6163653a3a686265663038633330333132626333623284044470616c6c65745f73657373696f6e3a3a686973746f726963616c3a3a50726f76696e67547269653c543e3a3a70726f76653a3a6865623934633432306363626138343739850438747269655f64623a3a6c6f6f6b75703a3a4c6f6f6b75703c4c2c513e3a3a6c6f6f6b5f75703a3a6830653935656231353638373464383962860443616c6c6f633a3a636f6c6c656374696f6e733a3a7665635f64657175653a3a56656344657175653c543e3a3a67726f773a3a683262323432316232383665396661346287043c747269655f64623a3a7472696564626d75743a3a4e6f646553746f726167653c483e3a3a616c6c6f633a3a68663332386162653934643738313436648804653c73705f747269653a3a6e6f64655f6865616465723a3a4e6f6465486561646572206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a68333564386565356662613366653061328904633c73705f747269653a3a6e6f64655f636f6465633a3a4e6f6465436f6465633c483e20617320747269655f64623a3a6e6f64655f636f6465633a3a4e6f6465436f6465633e3a3a6c6561665f6e6f64653a3a68623334333838666565386265636562398a0460747269655f64623a3a6e6962626c653a3a6e6962626c65736c6963653a3a3c696d706c20747269655f64623a3a6e6962626c653a3a4e6962626c65536c6963653e3a3a72696768745f697465723a3a68373530333865346361386134633864368b0472747269655f64623a3a6e6962626c653a3a6e6962626c657665633a3a3c696d706c20747269655f64623a3a6e6962626c653a3a4e6962626c655665633e3a3a617070656e645f6f7074696f6e616c5f736c6963655f616e645f6e6962626c653a3a68656166363331313731623937303430318c0441747269655f64623a3a7472696564626d75743a3a5472696544424d75743c4c3e3a3a636f6d6d69745f6368696c643a3a68636235396231323236663032333362638d045c747269655f64623a3a6e6962626c653a3a6e6962626c657665633a3a3c696d706c20747269655f64623a3a6e6962626c653a3a4e6962626c655665633e3a3a64726f705f6c617374733a3a68636266613539343437393035626162618e043f70616c6c65745f62616c616e6365733a3a4d6f64756c653c542c493e3a3a63616c6c5f66756e6374696f6e733a3a68623537363736313365623361326662368f044170616c6c65745f62616c616e6365733a3a4d6f64756c653c542c493e3a3a73746f726167655f6d657461646174613a3a686533656437636631366639646435643890046c3c70616c6c65745f62616c616e6365733a3a5f5f476574427974655374727563744c6f636b733c542c493e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a683930396562633335343837613633346691043c7061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653a3a656e636f64653a3a683166386537386162653266633938393192046e3c70616c6c65745f62616c616e6365733a3a5f5f476574427974655374727563744163636f756e743c542c493e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a68633362656137393530366164353463619304743c70616c6c65745f62616c616e6365733a3a5f5f47657442797465537472756374546f74616c49737375616e63653c542c493e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a686631666261336361336364633736616494044a70616c6c65745f62616c616e6365733a3a4d6f64756c653c542c493e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a68656663333836326336663831643962649504a3013c70616c6c65745f62616c616e6365733a3a4d6f64756c653c542c493e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a4578697374656e7469616c4465706f73697444656661756c74427974654765747465723c542c493e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a683230396464623032376633393564356496043e70616c6c65745f7363686564756c65723a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a683436336439393831616664653666383697044070616c6c65745f7363686564756c65723a3a4d6f64756c653c543e3a3a73746f726167655f6d657461646174613a3a68653962636162333062373131356262639804743c70616c6c65745f7363686564756c65723a3a5f5f4765744279746553747275637453746f7261676556657273696f6e3c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6862643231356234346330663733656537990472726f636f636f5f72756e74696d653a3a5f3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f646520666f7220726f636f636f5f72756e74696d653a3a43616c6c3e3a3a656e636f64655f746f3a3a68666332376439646436653163333536329a047670616c6c65745f7363686564756c65723a3a5f3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f646520666f722070616c6c65745f7363686564756c65723a3a43616c6c3c543e3e3a3a6465636f64653a3a68383532643235646137363135616265309b047670616c6c65745f7363686564756c65723a3a5f3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f646520666f722070616c6c65745f7363686564756c65723a3a43616c6c3c543e3e3a3a6465636f64653a3a68393762396661326536393733633539389c04593c636f72653a3a6f7074696f6e3a3a4f7074696f6e3c543e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a68303663643732323530323935636466659d048c0173705f636f6e73656e7375735f626162653a3a646967657374733a3a5f3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f646520666f722073705f636f6e73656e7375735f626162653a3a646967657374733a3a5072654469676573743e3a3a6465636f64653a3a68376366663364643765616636613131359e04683c73705f636f6e73656e7375735f7672663a3a7363686e6f72726b656c3a3a56524650726f6f66206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a68633937386661613233303361343065619f049c01706f6c6b61646f745f636f72655f7072696d6974697665733a3a5f3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f646520666f7220706f6c6b61646f745f636f72655f7072696d6974697665733a3a446f776e776172644d6573736167653c4163636f756e7449643e3e3a3a656e636f64655f746f3a3a6862373032613765366163396363373834a004303c282920617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6864613766326361643164616135323539a1045f3c70616c6c65745f76657374696e673a3a4d6f64756c653c543e206173206672616d655f6d657461646174613a3a4d6f64756c654572726f724d657461646174613e3a3a6d657461646174613a3a6861386138393133663264613130353162a204613c70616c6c65745f7363686564756c65723a3a4d6f64756c653c543e206173206672616d655f6d657461646174613a3a4d6f64756c654572726f724d657461646174613e3a3a6d657461646174613a3a6837636633356135306634343461356236a304623c70616c6c65745f62616c616e6365733a3a4d6f64756c653c542c493e206173206672616d655f6d657461646174613a3a4d6f64756c654572726f724d657461646174613e3a3a6d657461646174613a3a6836663831633661396666366534636461a4043970616c6c65745f76657374696e673a3a4d6f64756c653c543e3a3a7570646174655f6c6f636b3a3a6834333834643361316462343436383466a5045c6672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6d61703a3a53746f726167654d61703a3a73746f726167655f6d61705f66696e616c5f6b65793a3a6838343066363163666465643936373637a6045c6672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6d61703a3a53746f726167654d61703a3a73746f726167655f6d61705f66696e616c5f6b65793a3a6837643838623564336338656164653764a704386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6835666134376636373866313333373166a8043d70616c6c65745f62616c616e6365733a3a4d6f64756c653c542c493e3a3a7570646174655f6c6f636b733a3a6837663765636365323232356331613764a90495013c70616c6c65745f76657374696e673a3a4d6f64756c653c543e206173206672616d655f737570706f72743a3a7472616974733a3a56657374696e675363686564756c653c3c54206173206672616d655f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a6164645f76657374696e675f7363686564756c653a3a6834343465666232303434303032663065aa043b70616c6c65745f7363686564756c65723a3a4d6f64756c653c543e3a3a646f5f7363686564756c653a3a6839616666386538323830373638653334ab045c6672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6d61703a3a53746f726167654d61703a3a73746f726167655f6d61705f66696e616c5f6b65793a3a6830636332333930393262346630316433ac044170616c6c65745f7363686564756c65723a3a4d6f64756c653c543e3a3a646f5f7363686564756c655f6e616d65643a3a6836613734343762333139646262633862ad04386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a7075743a3a6837386132633165643561653932343564ae04aa0173705f72756e74696d653a3a7472616e73616374696f6e5f76616c69646974793a3a5f3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f646520666f722073705f72756e74696d653a3a7472616e73616374696f6e5f76616c69646974793a3a5472616e73616374696f6e56616c69646974794572726f723e3a3a656e636f64655f746f3a3a6864356631376434613761653838386561af043e73705f72756e74696d653a3a67656e657269633a3a656e636f64655f776974685f7665635f7072656669783a3a6862383834356633333833313730643666b0045c6672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6d61703a3a53746f726167654d61703a3a73746f726167655f6d61705f66696e616c5f6b65793a3a6835653361383430303664363334646165b1042c6672616d655f73797374656d3a3a656e737572655f6e6f6e653a3a6861646439626132653539333637326233b204366672616d655f73797374656d3a3a4d6f64756c653c543e3a3a626c6f636b5f686173683a3a6862653062656261663364393663386431b304366672616d655f73797374656d3a3a4d6f64756c653c543e3a3a696e697469616c697a653a3a6862613466643565386535333636376431b404386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a7075743a3a6862313431333862386164636631316465b5046f6672616d655f73797374656d3a3a5f3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f646520666f72206672616d655f73797374656d3a3a50686173653e3a3a656e636f64655f746f3a3a6865386332393830633466623234353234b60473726f636f636f5f72756e74696d653a3a5f3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f646520666f7220726f636f636f5f72756e74696d653a3a4576656e743e3a3a656e636f64655f746f3a3a6834663761366563306166626331323361b7042b636f72653a3a7074723a3a64726f705f696e5f706c6163653a3a6830666638356636373036356331646261b8043a6672616d655f73797374656d3a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6862353230663632376638306362356563b9045c6672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6d61703a3a53746f726167654d61703a3a73746f726167655f6d61705f66696e616c5f6b65793a3a6831623336373131333633356164343961ba043c6672616d655f73797374656d3a3a4d6f64756c653c543e3a3a73746f726167655f6d657461646174613a3a6861336439353164373866643064306534bb04703c6672616d655f73797374656d3a3a5f5f47657442797465537472756374457865637574696f6e50686173653c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6862333538343731633736613136616634bc04703c6672616d655f73797374656d3a3a5f5f4765744279746553747275637445787472696e73696373526f6f743c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6864376233643033633861376262656537bd046d3c6672616d655f73797374656d3a3a5f5f47657442797465537472756374426c6f636b5765696768743c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6835303663663737633931356434313136be04693c6672616d655f73797374656d3a3a5f5f476574427974655374727563744163636f756e743c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6863666665346538333763653365306139bf04446672616d655f73797374656d3a3a4d6f64756c653c543e3a3a6e6f74655f66696e69736865645f65787472696e736963733a3a6837643962376532383365343836393266c004456672616d655f73797374656d3a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a6831313965376233383930366232646462c1049c013c6672616d655f73797374656d3a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a4d6178696d756d426c6f636b4c656e67746844656661756c74427974654765747465723c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6866643537643634626131636465383331c2049d013c6672616d655f73797374656d3a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a45787472696e7369634261736557656967687444656661756c74427974654765747465723c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6862333837616138613136323739353532c3049e013c6672616d655f73797374656d3a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a426c6f636b457865637574696f6e57656967687444656661756c74427974654765747465723c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6837363739373535343830383233313761c40492013c6672616d655f73797374656d3a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a446257656967687444656661756c74427974654765747465723c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6833623065373561393736323538323965c5049c013c6672616d655f73797374656d3a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a4d6178696d756d426c6f636b57656967687444656661756c74427974654765747465723c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6833353962646339383763326431393233c60498013c6672616d655f73797374656d3a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a426c6f636b48617368436f756e7444656661756c74427974654765747465723c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6837366234663630313362353237613931c7044b6672616d655f73797374656d3a3a4d6f64756c653c543e3a3a72656769737465725f65787472615f7765696768745f756e636865636b65643a3a6866623565336366643363303634333635c804346672616d655f73797374656d3a3a4d6f64756c653c543e3a3a66696e616c697a653a3a6833303765613037396161663366376633c904386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6832626130323131326465393966386538ca044373705f696f3a3a73746f726167653a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a726f6f743a3a6839643938616566666130333639396537cb044b73705f696f3a3a73746f726167653a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a6368616e6765735f726f6f743a3a6832646130313464663236393663653962cc04773c736d616c6c7665633a3a536d616c6c5665633c413e20617320636f72653a3a697465723a3a7472616974733a3a636f6c6c6563743a3a457874656e643c3c4120617320736d616c6c7665633a3a41727261793e3a3a4974656d3e3e3a3a657874656e643a3a6863636163316131626333376637306366cd0435736d616c6c7665633a3a536d616c6c5665633c413e3a3a7472795f726573657276653a3a6831656336623838643234336232386666ce048b0173705f66696e616c6974795f6772616e6470613a3a5f3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f646520666f722073705f66696e616c6974795f6772616e6470613a3a45717569766f636174696f6e50726f6f663c482c4e3e3e3a3a6465636f64653a3a6837343633343033396532313830313561cf048b0173705f66696e616c6974795f6772616e6470613a3a5f3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f646520666f722073705f66696e616c6974795f6772616e6470613a3a45717569766f636174696f6e50726f6f663c482c4e3e3e3a3a6465636f64653a3a6865373337663338366561613930323465d0043f73705f66696e616c6974795f6772616e6470613a3a636865636b5f6d6573736167655f7369676e61747572653a3a6834626665346334386538326561386436d104363c5420617320636f72653a3a636f6e766572743a3a496e746f3c553e3e3a3a696e746f3a3a6831663064363265326165623239346530d20439747269655f64623a3a6e6f64655f636f6465633a3a4e6f6465436f6465633a3a6465636f64653a3a6830366261306438373939383631303431d3046b3c7061726974795f7363616c655f636f6465633a3a636f6d706163743a3a436f6d706163743c7533323e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6864653464643564383737333764316431d4045d3c6672616d655f73797374656d3a3a4d6f64756c653c543e206173206672616d655f6d657461646174613a3a4d6f64756c654572726f724d657461646174613e3a3a6d657461646174613a3a6832373134636565616333346631633030d5043f73705f747269653a3a6e6f64655f6865616465723a3a656e636f64655f73697a655f616e645f7072656669783a3a6861383836616138303664353861613463d604733c6672616d655f73797374656d3a3a43616c6c3c543e206173206672616d655f737570706f72743a3a7472616974733a3a556e66696c7465726564446973706174636861626c653e3a3a64697370617463685f6279706173735f66696c7465723a3a6834303934386237653136363461333664d7044b73705f696f3a3a6d6973633a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a72756e74696d655f76657273696f6e3a3a6838356135633630633063313266666132d804483c5b543b20385d206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6861373466386331613064666631383739d90458706f6c6b61646f745f72756e74696d655f636f6d6d6f6e3a3a70617261636861696e733a3a4d6f64756c653c543e3a3a63616c63756c6174655f647574795f726f737465723a3a6836313863363135346231633263393966da04386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6837326363633430626130316336353164db045e706f6c6b61646f745f72756e74696d655f636f6d6d6f6e3a3a70617261636861696e733a3a4d6f64756c653c543e3a3a7665726966795f63616e6469646174655f7369676e6174757265733a3a6834303231663433633161373735353461dc044d706f6c6b61646f745f7072696d6974697665733a3a76303a3a416272696467656443616e646964617465526563656970743c483e3a3a686173683a3a6864663064353261616462303335626230dd04546269747665633a3a736c6963653a3a6170693a3a3c696d706c206269747665633a3a736c6963653a3a426974536c6963653c4f2c543e3e3a3a73706c69745f61743a3a6863636330616465343366663132626264de04743c706f6c6b61646f745f72756e74696d655f636f6d6d6f6e3a3a70617261636861696e733a3a4d6f64756c653c543e206173206672616d655f6d657461646174613a3a4d6f64756c654572726f724d657461646174613e3a3a6d657461646174613a3a6831616634653764326434393834323535df044c706f6c6b61646f745f72756e74696d655f636f6d6d6f6e3a3a70617261636861696e733a3a4d6f64756c653c543e3a3a7365745f68656164733a3a6863376637323262633366643932313732e0045c6672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6d61703a3a53746f726167654d61703a3a73746f726167655f6d61705f66696e616c5f6b65793a3a6830633563333635343030353565663732e104386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6835383435666564313163323937396238e2045c6672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6d61703a3a53746f726167654d61703a3a73746f726167655f6d61705f66696e616c5f6b65793a3a6831333666636331626439386138306338e304386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6861633261646462323437643333623563e40458706f6c6b61646f745f72756e74696d655f636f6d6d6f6e3a3a70617261636861696e733a3a4d6f64756c653c543e3a3a6c6f63616c5f76616c69646174696f6e5f646174613a3a6834373666613933313936343537303230e50452706f6c6b61646f745f72756e74696d655f636f6d6d6f6e3a3a70617261636861696e733a3a4d6f64756c653c543e3a3a646f5f636f64655f757067726164653a3a6865306435656262326336373336396563e604386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a7075743a3a6832363537613965343237343866306462e7045c6672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6d61703a3a53746f726167654d61703a3a73746f726167655f6d61705f66696e616c5f6b65793a3a6834313533346666343166373366386432e804386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a7075743a3a6833646331336437333763313530353237e904776672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6d61703a3a3c696d706c206672616d655f737570706f72743a3a73746f726167653a3a53746f726167654d61703c4b2c563e20666f7220473e3a3a617070656e643a3a6835373962353135393263306133653431ea044770616c6c65745f7472616e73616374696f6e5f7061796d656e743a3a4d6f64756c653c543e3a3a7765696768745f746f5f6665653a3a6838666433613139636636353830626563eb043c70616c6c65745f7574696c6974793a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6830666338383836373237373566353164ec046c3c7061726974795f7363616c655f636f6465633a3a636f6d706163743a3a436f6d706163743c753132383e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6864643365643238343165313163326231ed049f013c73705f72756e74696d653a3a67656e657269633a3a756e636865636b65645f65787472696e7369633a3a556e636865636b656445787472696e7369633c416464726573732c43616c6c2c5369676e61747572652c45787472613e2061732073705f72756e74696d653a3a7472616974733a3a436865636b61626c653c4c6f6f6b75703e3e3a3a636865636b3a3a6863346239383866323038613538343136ee043e70616c6c65745f74696d657374616d703a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6835373062326333323363323139346331ef044070616c6c65745f74696d657374616d703a3a4d6f64756c653c543e3a3a73746f726167655f6d657461646174613a3a6837623733326131353765643566393734f0044970616c6c65745f74696d657374616d703a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a6862326633373330613537666566386133f1049b013c70616c6c65745f74696d657374616d703a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a4d696e696d756d506572696f6444656661756c74427974654765747465723c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6865306438643231326266373332666639f20451706f6c6b61646f745f72756e74696d655f636f6d6d6f6e3a3a70617261636861696e733a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6865376564633161393936323761366564f30453706f6c6b61646f745f72756e74696d655f636f6d6d6f6e3a3a70617261636861696e733a3a4d6f64756c653c543e3a3a73746f726167655f6d657461646174613a3a6836313131306234396230306139386365f4048f013c706f6c6b61646f745f72756e74696d655f636f6d6d6f6e3a3a70617261636861696e733a3a5f5f4765744279746553747275637452656c61794469737061746368517565756553697a653c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6864353764303263653433623465636635f50483013c706f6c6b61646f745f72756e74696d655f636f6d6d6f6e3a3a70617261636861696e733a3a5f5f47657442797465537472756374467574757265436f64653c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6832383733343066343934353865333266f60485013c706f6c6b61646f745f72756e74696d655f636f6d6d6f6e3a3a70617261636861696e733a3a5f5f4765744279746553747275637450617374436f64654d6574613c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6864303066323363343639646162303665f70484013c706f6c6b61646f745f72756e74696d655f636f6d6d6f6e3a3a70617261636861696e733a3a5f5f47657442797465537472756374417574686f7269746965733c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6865376164326335343165633763373739f80448706f6c6b61646f745f72756e74696d655f636f6d6d6f6e3a3a70617261636861696e733a3a656e737572655f70617261636861696e3a3a6837393263383262646234663631663961f9044a70616c6c65745f7472616e73616374696f6e5f7061796d656e743a3a4d6f64756c653c543e3a3a73746f726167655f6d657461646174613a3a6833333865343164643866653664623162fa0481013c70616c6c65745f7472616e73616374696f6e5f7061796d656e743a3a5f5f476574427974655374727563744e6578744665654d756c7469706c6965723c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6865663864343761633232613039646334fb045370616c6c65745f7472616e73616374696f6e5f7061796d656e743a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a6861363932613633343238633664316330fc04a3013c70616c6c65745f7472616e73616374696f6e5f7061796d656e743a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a576569676874546f46656544656661756c74427974654765747465723c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6831343862323532323532623464393138fd04aa013c70616c6c65745f7472616e73616374696f6e5f7061796d656e743a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a5472616e73616374696f6e4279746546656544656661756c74427974654765747465723c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6837333465663536633334346565303733fe04656269747665633a3a7665633a3a7472616974733a3a3c696d706c20636f72653a3a636c6f6e653a3a436c6f6e6520666f72206269747665633a3a7665633a3a4269745665633c4f2c543e3e3a3a636c6f6e653a3a6863326639616437663831336538613430ff043d73705f636f72653a3a746f5f7375627374726174655f7761736d5f666e5f72657475726e5f76616c75653a3a683230373964643861336238313736653480052b636f72653a3a7074723a3a64726f705f696e5f706c6163653a3a686266663362316234306238303139393281053970616c6c65745f7375646f3a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a686162393735656263343262643662303282053b70616c6c65745f7375646f3a3a4d6f64756c653c543e3a3a73746f726167655f6d657461646174613a3a683166666635623562336637653037333683056c70616c6c65745f7375646f3a3a5f3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f646520666f722070616c6c65745f7375646f3a3a43616c6c3c543e3e3a3a6465636f64653a3a683234653661316234326462313961633584056c70616c6c65745f7375646f3a3a5f3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f646520666f722070616c6c65745f7375646f3a3a43616c6c3c543e3e3a3a6465636f64653a3a683331383333626266366436333039303485053f70616c6c65745f617574686f72736869703a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a686462306137366236633436373063656686054170616c6c65745f617574686f72736869703a3a4d6f64756c653c543e3a3a73746f726167655f6d657461646174613a3a686561653235356238386266653535633587056d3c70616c6c65745f617574686f72736869703a3a5f5f47657442797465537472756374556e636c65733c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a683065333934363261323738353436366688052c616c6c6f633a3a736c6963653a3a696e736572745f686561643a3a686463653939316139313766653130343789054b3c726f636f636f5f72756e74696d653a3a43616c6c20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a68666235613862353665626234353231352e333335398a055c3c70616c6c65745f7375646f3a3a4d6f64756c653c543e206173206672616d655f6d657461646174613a3a4d6f64756c654572726f724d657461646174613e3a3a6d657461646174613a3a68636464623531333437353736383462368b05623c70616c6c65745f617574686f72736869703a3a4d6f64756c653c543e206173206672616d655f6d657461646174613a3a4d6f64756c654572726f724d657461646174613e3a3a6d657461646174613a3a68396335386139646236376461346330318c05723c70616c6c65745f7375646f3a3a43616c6c3c543e206173206672616d655f737570706f72743a3a7472616974733a3a556e66696c7465726564446973706174636861626c653e3a3a64697370617463685f6279706173735f66696c7465723a3a68653431306433393263363266303730338d05386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a7075743a3a68666465333734353962653830633136628e05706672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a646f75626c655f6d61703a3a53746f72616765446f75626c654d61703a3a73746f726167655f646f75626c655f6d61705f66696e616c5f6b65793a3a68303931623463386566623530353362638f05633c636f72653a3a697465723a3a61646170746572733a3a4d61703c492c463e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a6e6578743a3a683931663831346233333934663535333490055173705f696f3a3a6f6666636861696e3a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a6c6f63616c5f73746f726167655f6765743a3a686531616339323032373432346630656491055d73705f696f3a3a6f6666636861696e3a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a6c6f63616c5f73746f726167655f636f6d706172655f616e645f7365743a3a683764363564656361373961303130646692054d73705f696f3a3a6f6666636861696e3a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a6e6574776f726b5f73746174653a3a683666393335366361363139623638616493054a73705f696f3a3a63727970746f3a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a737232353531395f7369676e3a3a68633636363835323862646234373235359405473c70616c6c65745f696d5f6f6e6c696e653a3a43616c6c3c543e20617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6835623935663763636531336338353833950547636f72653a3a666d743a3a6e756d3a3a3c696d706c20636f72653a3a666d743a3a446562756720666f72207533323e3a3a666d743a3a683764653264323566613033643265383396055273705f696f3a3a6f6666636861696e3a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a7375626d69745f7472616e73616374696f6e3a3a683838646637656163633839373364306497055173705f696f3a3a6f6666636861696e3a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a6c6f63616c5f73746f726167655f7365743a3a68383162326134303061366431623463379805583c70616c6c65745f696d5f6f6e6c696e653a3a4f6666636861696e4572723c426c6f636b4e756d6265723e20617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a68663133326532323262663430653261639905373c285431302c5431312920617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a68653661303432346137313435353935349a05303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a68363561376635613966613534353831629b055c6672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6d61703a3a53746f726167654d61703a3a73746f726167655f6d61705f66696e616c5f6b65793a3a68346130303731306266346235623533399c05633c636f72653a3a697465723a3a61646170746572733a3a4d61703c492c463e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a6e6578743a3a68623661336431323364663963633436309d05683c636f72653a3a697465723a3a61646170746572733a3a4d61703c492c463e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a73697a655f68696e743a3a68323365663462363630656336366437639e053d70616c6c65745f6772616e6470613a3a4d6f64756c653c543e3a3a7363686564756c655f6368616e67653a3a68393433393863313638393535353236309f05633c636f72653a3a697465723a3a61646170746572733a3a4d61703c492c463e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a6e6578743a3a6832306264656634303638636363313637a005386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6865313565363564343161613531646437a105633c636f72653a3a697465723a3a61646170746572733a3a4d61703c492c463e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a6e6578743a3a6862353864663535383431353134373763a205633c636f72653a3a697465723a3a61646170746572733a3a4d61703c492c463e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a6e6578743a3a6834383864636339646665646136363630a305633c636f72653a3a697465723a3a61646170746572733a3a4d61703c492c463e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a6e6578743a3a6864313635393339616364313530663830a4053c70616c6c65745f6772616e6470613a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6835663430333232376563656564373763a5053e70616c6c65745f6772616e6470613a3a4d6f64756c653c543e3a3a73746f726167655f6d657461646174613a3a6864333165386136343861393633306661a605703c70616c6c65745f6772616e6470613a3a5f5f4765744279746553747275637443757272656e7453657449643c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6862633333376431623633633338373030a705693c70616c6c65745f6772616e6470613a3a5f5f4765744279746553747275637453746174653c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6835633134373362356335373539353665a8053e70616c6c65745f696d5f6f6e6c696e653a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6861363563343137346462386530643631a9054070616c6c65745f696d5f6f6e6c696e653a3a4d6f64756c653c543e3a3a73746f726167655f6d657461646174613a3a6865353165383035623861633161633865aa055d3c73705f66696e616c6974795f6772616e6470613a3a45717569766f636174696f6e50726f6f663c482c4e3e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a6831303663366631353237653032623230ab05593c636f72653a3a6f7074696f6e3a3a4f7074696f6e3c543e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6861626331653631323330663664383063ac055f3c70616c6c65745f6772616e6470613a3a4d6f64756c653c543e206173206672616d655f6d657461646174613a3a4d6f64756c654572726f724d657461646174613e3a3a6d657461646174613a3a6865373433393537303133663165363036ad05613c70616c6c65745f696d5f6f6e6c696e653a3a4d6f64756c653c543e206173206672616d655f6d657461646174613a3a4d6f64756c654572726f724d657461646174613e3a3a6d657461646174613a3a6836356338613331373034303261373033ae054470616c6c65745f6772616e6470613a3a4d6f64756c653c543e3a3a646f5f7265706f72745f65717569766f636174696f6e3a3a6831633662373666363561396339663661af05386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a7075743a3a6839306336653139653664623562303837b005386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6838343031343932616238626333363836b105386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a7075743a3a6837396161346264373962643037616536b2056b3c7061726974795f7363616c655f636f6465633a3a636f6d706163743a3a436f6d706163743c7533323e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6830306465303632666632653138376664b3056c3c7061726974795f7363616c655f636f6465633a3a636f6d706163743a3a436f6d706163743c753132383e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6839346438666666623666623836323334b4056f3c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a42547265654d61703c4b2c563e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6864366162613562633232343437333536b50584016672616d655f6578656375746976653a3a4578656375746976653c53797374656d2c426c6f636b2c436f6e746578742c556e7369676e656456616c696461746f722c416c6c4d6f64756c65732c434f6e52756e74696d65557067726164653e3a3a696e697469616c697a655f626c6f636b3a3a6864323836386661373332333733343937b60586016672616d655f6578656375746976653a3a4578656375746976653c53797374656d2c426c6f636b2c436f6e746578742c556e7369676e656456616c696461746f722c416c6c4d6f64756c65732c434f6e52756e74696d65557067726164653e3a3a657874726163745f7072655f6469676573743a3a6831353431316563353761663064393635b7058c016672616d655f6578656375746976653a3a4578656375746976653c53797374656d2c426c6f636b2c436f6e746578742c556e7369676e656456616c696461746f722c416c6c4d6f64756c65732c434f6e52756e74696d65557067726164653e3a3a6170706c795f65787472696e7369635f776974685f6c656e3a3a6838393064383636383132363139366461b80545616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a42547265654d61703c4b2c563e3a3a6765743a3a6830626138646236393739663335656434b9053e747269655f64623a3a7472696564626d75743a3a5472696544424d75743c4c3e3a3a696e736572745f61743a3a6865323836646536303162343933383234ba053c747269655f64623a3a7472696564626d75743a3a4e6f64653c4f3e3a3a66726f6d5f656e636f6465643a3a6838346461333331363534326634346162bb0545747269655f64623a3a7472696564626d75743a3a5472696544424d75743c4c3e3a3a696e736572745f696e73706563746f723a3a6863313165643336663430386463623532bc05363c5420617320636f72653a3a636f6e766572743a3a496e746f3c553e3e3a3a696e746f3a3a6864643439366363656165333165366330bd05376861736862726f776e3a3a7365743a3a486173685365743c542c533e3a3a696e736572743a3a6863636635613161623930623637363532be053e747269655f64623a3a7472696564626d75743a3a4e6f64653c4f3e3a3a696e6c696e655f6f725f686173683a3a6866636664636638663432393161326538bf0535747269655f64623a3a7472696564626d75743a3a656d7074795f6368696c6472656e3a3a6832366562343131326433366139346235c00565747269655f64623a3a6e6962626c653a3a6e6962626c65736c6963653a3a3c696d706c20747269655f64623a3a6e6962626c653a3a4e6962626c65536c6963653e3a3a746f5f73746f7265645f72616e67653a3a6835306131326136343339633539383535c105763c706f6c6b61646f745f72756e74696d655f636f6d6d6f6e3a3a6174746573746174696f6e733a3a4d6f64756c653c543e206173206672616d655f6d657461646174613a3a4d6f64756c654572726f724d657461646174613e3a3a6d657461646174613a3a6866616433346233326166636630646165c205766672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a76616c75653a3a3c696d706c206672616d655f737570706f72743a3a73746f726167653a3a53746f7261676556616c75653c543e20666f7220473e3a3a6765743a3a6839353565376234313565666332393066c305457363686e6f72726b656c3a3a706f696e74733a3a52697374726574746f426f74683a3a66726f6d5f636f6d707265737365643a3a6862363438363662393331373064653061c405367363686e6f72726b656c3a3a7672663a3a7672665f6d616c6c6561626c655f686173683a3a6863363136313438323662396439636136c5053970616c6c65745f626162653a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6864373035346332663330363365643030c6053b70616c6c65745f626162653a3a4d6f64756c653c543e3a3a73746f726167655f6d657461646174613a3a6836393137313735323231653237366337c705723c70616c6c65745f626162653a3a5f5f47657442797465537472756374556e646572436f6e737472756374696f6e3c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6835336639366162663435656363323834c8056b3c70616c6c65745f626162653a3a5f5f4765744279746553747275637452616e646f6d6e6573733c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6863313939303337363366623630316433c9054470616c6c65745f626162653a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a6833396538333265613938646636643761ca059a013c70616c6c65745f626162653a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a4578706563746564426c6f636b54696d6544656661756c74427974654765747465723c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6864353563626537316361613965613134cb0596013c70616c6c65745f626162653a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a45706f63684475726174696f6e44656661756c74427974654765747465723c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6838643465343337306261333434343934cc053a70616c6c65745f70726f78793a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6833653039336463393866663536383335cd053c70616c6c65745f70726f78793a3a4d6f64756c653c543e3a3a73746f726167655f6d657461646174613a3a6862356565343237363165313330663737ce05693c70616c6c65745f70726f78793a3a5f5f4765744279746553747275637450726f786965733c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6861643066333331343636656534373230cf054570616c6c65745f70726f78793a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a6861643831333633393639333838333938d00594013c70616c6c65745f70726f78793a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a4d617850726f7869657344656661756c74427974654765747465723c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6862653134623462363735303766333666d1059c013c70616c6c65745f70726f78793a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a50726f78794465706f736974466163746f7244656661756c74427974654765747465723c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6830653538366434386261666536643334d2059a013c70616c6c65745f70726f78793a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a50726f78794465706f7369744261736544656661756c74427974654765747465723c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6833626532643664656462653537613132d305386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6864613831323330353437363533323831d405386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a7075743a3a6830396238656638623834633363323436d505386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a7075743a3a6863333730646435336136663065636366d60553706f6c6b61646f745f72756e74696d655f636f6d6d6f6e3a3a6174746573746174696f6e733a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6835303639356263333936316630373861d70555706f6c6b61646f745f72756e74696d655f636f6d6d6f6e3a3a6174746573746174696f6e733a3a4d6f64756c653c543e3a3a73746f726167655f6d657461646174613a3a6830313138623162336634303538613961d8055d3c70616c6c65745f70726f78793a3a4d6f64756c653c543e206173206672616d655f6d657461646174613a3a4d6f64756c654572726f724d657461646174613e3a3a6d657461646174613a3a6832343933356634343163646161626235d9054170616c6c65745f626162653a3a4d6f64756c653c543e3a3a646f5f7265706f72745f65717569766f636174696f6e3a3a6863373264386234613138313263313136da05733c70616c6c65745f70726f78793a3a43616c6c3c543e206173206672616d655f737570706f72743a3a7472616974733a3a556e66696c7465726564446973706174636861626c653e3a3a64697370617463685f6279706173735f66696c7465723a3a6830356536653361303735643461616261db055c6672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6d61703a3a53746f726167654d61703a3a73746f726167655f6d61705f66696e616c5f6b65793a3a6866363938343463343530353264636433dc05386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6864343366633030343564313335393230dd05763c70616c6c65745f617574686f726974795f646973636f766572793a3a43616c6c3c543e206173206672616d655f737570706f72743a3a776569676874733a3a4765744469737061746368496e666f3e3a3a6765745f64697370617463685f696e666f3a3a6831626661316661633461666362386438de057273705f73657373696f6e3a3a5f3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f646520666f722073705f73657373696f6e3a3a4d656d6265727368697050726f6f663e3a3a6465636f64653a3a6835316132623934346438313438653538df057273705f73657373696f6e3a3a5f3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f646520666f722073705f73657373696f6e3a3a4d656d6265727368697050726f6f663e3a3a6465636f64653a3a6864643863303431623439643939613332e0057c7061726974795f7363616c655f636f6465633a3a636f6465633a3a696e6e65725f7475706c655f696d706c3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f646520666f72202851302c5230293e3a3a6465636f64653a3a6839336230366665326163396337323834e1057c7061726974795f7363616c655f636f6465633a3a636f6465633a3a696e6e65725f7475706c655f696d706c3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f646520666f72202851302c5230293e3a3a6465636f64653a3a6864326330333566643136396666363364e2053c7061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653a3a656e636f64653a3a6838323861663762383466313436336438e3058f0173705f636f6e73656e7375735f736c6f74733a3a5f3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f646520666f722073705f636f6e73656e7375735f736c6f74733a3a45717569766f636174696f6e50726f6f663c4865616465722c49643e3e3a3a6465636f64653a3a6834316238383335303431653635666237e4058f0173705f636f6e73656e7375735f736c6f74733a3a5f3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f646520666f722073705f636f6e73656e7375735f736c6f74733a3a45717569766f636174696f6e50726f6f663c4865616465722c49643e3e3a3a6465636f64653a3a6864326434666539663235323865363230e5054570616c6c65745f66696e616c6974795f747261636b65723a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6830343833663332353162383465353765e6054770616c6c65745f66696e616c6974795f747261636b65723a3a4d6f64756c653c543e3a3a73746f726167655f6d657461646174613a3a6833306665336130663964316164393236e7055070616c6c65745f66696e616c6974795f747261636b65723a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a6863383131613236393033363434366264e8059f013c70616c6c65745f66696e616c6974795f747261636b65723a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a57696e646f7753697a6544656661756c74427974654765747465723c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6834646636376635663363366366313863e9054f3c6d656d6f72795f64623a3a4d656d6f727944423c482c4b462c542c4d3e20617320686173685f64623a3a4861736844423c482c543e3e3a3a6765743a3a6838313565353138313635383036303639ea05533c6d656d6f72795f64623a3a4d656d6f727944423c482c4b462c542c4d3e20617320686173685f64623a3a4861736844423c482c543e3e3a3a656d706c6163653a3a6839353537373630323164623836663064eb05386861736862726f776e3a3a6d61703a3a486173684d61703c4b2c562c533e3a3a656e7472793a3a6835333436376631623863356566383032ec053d6861736862726f776e3a3a6d61703a3a566163616e74456e7472793c4b2c562c533e3a3a696e736572743a3a6836396264623133626332396431306236ed05523c6d656d6f72795f64623a3a4d656d6f727944423c482c4b462c542c4d3e20617320686173685f64623a3a4861736844423c482c543e3e3a3a72656d6f76653a3a6834396331616638613039323335396236ee05543c6d656d6f72795f64623a3a4d656d6f727944423c482c4b462c542c4d3e20617320686173685f64623a3a4861736844423c482c543e3e3a3a636f6e7461696e733a3a6864656264616562366266376435363534ef05583c6d656d6f72795f64623a3a4d656d6f727944423c482c4b462c542c4d3e20617320686173685f64623a3a41734861736844423c482c543e3e3a3a61735f686173685f64623a3a6833333332343964333930373962356265f0055c3c6d656d6f72795f64623a3a4d656d6f727944423c482c4b462c542c4d3e20617320686173685f64623a3a41734861736844423c482c543e3e3a3a61735f686173685f64625f6d75743a3a6865346131633864613739316664663337f105523c6d656d6f72795f64623a3a4d656d6f727944423c482c4b462c542c4d3e20617320686173685f64623a3a4861736844425265663c482c543e3e3a3a6765743a3a6837366133303563356138376239393838f205573c6d656d6f72795f64623a3a4d656d6f727944423c482c4b462c542c4d3e20617320686173685f64623a3a4861736844425265663c482c543e3e3a3a636f6e7461696e733a3a6839313863353637343562366166616361f305683c70616c6c65745f66696e616c6974795f747261636b65723a3a4d6f64756c653c543e206173206672616d655f6d657461646174613a3a4d6f64756c654572726f724d657461646174613e3a3a6d657461646174613a3a6839616333616136356334653766333861f4050c436f72655f76657273696f6ef50512436f72655f657865637574655f626c6f636bf6055373705f696f3a3a747269653a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a626c616b65325f3235365f6f7264657265645f726f6f743a3a6866623330343735613235373462383663f7054573705f696f3a3a6d6973633a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a7072696e745f6865783a3a6861316639643430303039396539613633f8055073705f696f3a3a63727970746f3a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a73746172745f62617463685f7665726966793a3a6837323032643663666162336562616531f9055173705f696f3a3a63727970746f3a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a66696e6973685f62617463685f7665726966793a3a6861313731616133666361346631656137fa0515436f72655f696e697469616c697a655f626c6f636bfb05114d657461646174615f6d65746164617461fc051c426c6f636b4275696c6465725f6170706c795f65787472696e736963fd051b426c6f636b4275696c6465725f66696e616c697a655f626c6f636bfe0520426c6f636b4275696c6465725f696e686572656e745f65787472696e73696373ff051c426c6f636b4275696c6465725f636865636b5f696e686572656e7473800618426c6f636b4275696c6465725f72616e646f6d5f7365656481062b5461676765645472616e73616374696f6e51756575655f76616c69646174655f7472616e73616374696f6e8206214f6666636861696e576f726b65724170695f6f6666636861696e5f776f726b657283064c73705f696f3a3a6f6666636861696e3a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a69735f76616c696461746f723a3a686136663531373133336335323462366684065173705f696f3a3a63727970746f3a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a737232353531395f7075626c69635f6b6579733a3a683462326365353339363831353032616485061850617261636861696e486f73745f76616c696461746f727386061950617261636861696e486f73745f647574795f726f7374657287061f50617261636861696e486f73745f6163746976655f70617261636861696e7388062450617261636861696e486f73745f676c6f62616c5f76616c69646174696f6e5f6461746189062350617261636861696e486f73745f6c6f63616c5f76616c69646174696f6e5f646174618a061c50617261636861696e486f73745f70617261636861696e5f636f64658b061750617261636861696e486f73745f6765745f68656164738c061d50617261636861696e486f73745f7369676e696e675f636f6e746578748d061f50617261636861696e486f73745f646f776e776172645f6d657373616765738e061e4772616e6470614170695f6772616e6470615f617574686f7269746965738f06384772616e6470614170695f7375626d69745f7265706f72745f65717569766f636174696f6e5f756e7369676e65645f65787472696e7369639006274772616e6470614170695f67656e65726174655f6b65795f6f776e6572736869705f70726f6f66910615426162654170695f636f6e66696775726174696f6e92061b426162654170695f63757272656e745f65706f63685f7374617274930624426162654170695f67656e65726174655f6b65795f6f776e6572736869705f70726f6f66940635426162654170695f7375626d69745f7265706f72745f65717569766f636174696f6e5f756e7369676e65645f65787472696e736963950621417574686f72697479446973636f766572794170695f617574686f72697469657396062153657373696f6e4b6579735f67656e65726174655f73657373696f6e5f6b65797397064e73705f696f3a3a63727970746f3a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a656432353531395f67656e65726174653a3a686232396465326238306332333266393598064e73705f696f3a3a63727970746f3a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a737232353531395f67656e65726174653a3a686434373634326163663035613736393199061f53657373696f6e4b6579735f6465636f64655f73657373696f6e5f6b6579739a0638616c6c6f633a3a7665633a3a5665633c543e3a3a657874656e645f66726f6d5f736c6963653a3a68393135326230383466613061636238339b061d4163636f756e744e6f6e63654170695f6163636f756e745f6e6f6e63659c06205472616e73616374696f6e5061796d656e744170695f71756572795f696e666f9d0630636f72653a3a6f70733a3a66756e6374696f6e3a3a466e3a3a63616c6c3a3a68313635656634323061633631326637319e0637636f72653a3a6f70733a3a66756e6374696f6e3a3a466e4d75743a3a63616c6c5f6d75743a3a68363430623537663864353133316631319f0648636f72653a3a6f70733a3a66756e6374696f6e3a3a466e4f6e63653a3a63616c6c5f6f6e63657b7b767461626c652e7368696d7d7d3a3a6837336634623564623431653963643932a006733c726f636f636f5f72756e74696d653a3a4f726967696e20617320636f72653a3a636f6e766572743a3a46726f6d3c726f636f636f5f72756e74696d653a3a4f726967696e43616c6c65723e3e3a3a66726f6d3a3a7b7b636c6f737572657d7d3a3a6831613538653365656361636466643366a10648636f72653a3a6f70733a3a66756e6374696f6e3a3a466e4f6e63653a3a63616c6c5f6f6e63657b7b767461626c652e7368696d7d7d3a3a6863396538373238653536636162663935a206753c726f636f636f5f72756e74696d653a3a50726f787954797065206173206672616d655f737570706f72743a3a7472616974733a3a496e7374616e636546696c7465723c726f636f636f5f72756e74696d653a3a43616c6c3e3e3a3a66696c7465723a3a6866313735356538643765666266353264a30642726f636f636f5f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f73797374656d3a3a6831653538643334623063333238353537a40643726f636f636f5f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f696e64696365733a3a6866643830323965633837626263653862a50644726f636f636f5f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f62616c616e6365733a3a6864336363643062323233663733303763a60644726f636f636f5f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f6f6666656e6365733a3a6833643764373964636538353963373766a70643726f636f636f5f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f73657373696f6e3a3a6861306161613762303065666236376138a80643726f636f636f5f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f6772616e6470613a3a6830393961613537636464303831306533a90645726f636f636f5f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f696d5f6f6e6c696e653a3a6864653337316439393362383539313332aa0645726f636f636f5f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f7265676973747261723a3a6865393932356365656339396530633766ab0643726f636f636f5f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f7574696c6974793a3a6833633363356461356163373831636563ac0644726f636f636f5f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f6964656e746974793a3a6862386561353865346637343331376638ad0644726f636f636f5f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f7265636f766572793a3a6863666339333134343438393334323464ae0643726f636f636f5f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f76657374696e673a3a6831383330343461373839626462613334af0645726f636f636f5f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f7363686564756c65723a3a6837646130363466396632616363393938b00640726f636f636f5f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f7375646f3a3a6837373634373536373566623636323561b10641726f636f636f5f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f70726f78793a3a6862333266373133616330313938316565b20644726f636f636f5f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f6d756c74697369673a3a6861333430396564343537663165373636b3062b636f72653a3a7074723a3a64726f705f696e5f706c6163653a3a6833363838613234616338636465656361b4066a3c726f636f636f5f72756e74696d653a3a4f726967696e206173206672616d655f737570706f72743a3a7472616974733a3a4f726967696e54726169743e3a3a6164645f66696c7465723a3a7b7b636c6f737572657d7d3a3a6862316431376263343565323734373639b50648636f72653a3a6f70733a3a66756e6374696f6e3a3a466e4f6e63653a3a63616c6c5f6f6e63657b7b767461626c652e7368696d7d7d3a3a6834626464356363646137336366366666b6062b636f72653a3a7074723a3a64726f705f696e5f706c6163653a3a6832343233666530373236666163346233b7062b636f72653a3a7074723a3a64726f705f696e5f706c6163653a3a6861636630306366306165636636373661b8063a73705f61726974686d657469633a3a62696775696e743a3a42696755696e743a3a6c73747269703a3a6835393539303133353339313864303830b9063773705f61726974686d657469633a3a62696775696e743a3a42696755696e743a3a6d756c3a3a6861333732333935373531313631383134ba06443c616c6c6f633a3a7665633a3a5665633c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a6865613935616563663562326134363430bb064473705f61726974686d657469633a3a62696775696e743a3a42696755696e743a3a6469763a3a7b7b636c6f737572657d7d3a3a6865373966343662363133666162616636bc063773705f61726974686d657469633a3a62696775696e743a3a42696755696e743a3a6164643a3a6838646463616135646437613362333863bd063d3c5420617320636f72653a3a636f6e766572743a3a547279496e746f3c553e3e3a3a7472795f696e746f3a3a6835636664643635653231646537623865be06303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6839653165323032643638333262383633bf06413c73705f696e686572656e74733a3a4572726f7220617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6831386131643738356235326462396339c006543c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6865326236623337333565616333636431c106323c265420617320636f72653a3a666d743a3a446973706c61793e3a3a666d743a3a6838613933333264653834633763623137c2064573705f696f3a3a616c6c6f6361746f723a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a667265653a3a6831616165643832336233643730336661c3064773705f696f3a3a616c6c6f6361746f723a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a6d616c6c6f633a3a6839346463613132306433643433323736c4067773705f72756e74696d655f696e746572666163653a3a706173735f62793a3a3c696d706c2073705f72756e74696d655f696e746572666163653a3a7761736d3a3a496e746f46464956616c756520666f7220543e3a3a696e746f5f6666695f76616c75653a3a6837366166306464323866336132303062c5067773705f72756e74696d655f696e746572666163653a3a706173735f62793a3a3c696d706c2073705f72756e74696d655f696e746572666163653a3a7761736d3a3a46726f6d46464956616c756520666f7220543e3a3a66726f6d5f6666695f76616c75653a3a6834653365363235663264636464383737c606573c73705f72756e74696d653a3a72756e74696d655f737472696e673a3a52756e74696d65537472696e6720617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6839633331373336363132653833643264c7062e616c6c6f633a3a7665633a3a5665633c543e3a3a726573657276653a3a6864643464613030373539303263323065c806473c73705f72756e74696d653a3a44697370617463684572726f7220617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6863633731656132363336666663613763c90656747269655f64623a3a6e6962626c653a3a6e6962626c657665633a3a3c696d706c20747269655f64623a3a6e6962626c653a3a4e6962626c655665633e3a3a707573683a3a6830613835333665303433633337636633ca0634736d616c6c7665633a3a536d616c6c5665633c413e3a3a66726f6d5f736c6963653a3a6865613836363432393362316462653231cb06095f5f756d6f64746933cc06085f5f6d756c746933cd06095f5f6173686c746933ce063d636f6d70696c65725f6275696c74696e733a3a696e743a3a756469763a3a5f5f756469766d6f647469343a3a6863323931636637303831626632373330cf06066d656d637079d006076d656d6d6f7665d106066d656d736574d2060462636d70d306095f5f75646976746933d406095f5f6c73687274693300550970726f64756365727302086c616e6775616765010452757374000c70726f6365737365642d62790105727573746325312e34362e302d6e696768746c79202831363935376264346420323032302d30362d333029", + "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb3d560e0b6940e074462475fe5406a7cb6a64c51d0af9d3ab5c2151bcae982fb812f7a76b706914d6a": "0x0e6d7d1afbcc6547b92995a394ba0daed07a2420be08220a5a1336c6731f0bfaa076ef1280d768051f21d060623da3ab5b56944d681d303ed2d4bf658c5bed3586975a37211f8704e947a365b720f7a3e2757988eaa7d0f197e83dba355ef74306a7f34a2ae69cc0cca633c7a82b37cfba821707eb62ffe065b242e1230e4661f49eae66a0ac9f610316906ec8f1a0928e20d7059d76a5ca53cbcb5a9b50dd3c", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19500d1064d79ff558056772616e800e6d7d1afbcc6547b92995a394ba0daed07a2420be08220a5a1336c6731f0bfa": "0x62475fe5406a7cb6a64c51d0af9d3ab5c2151bcae982fb812f7a76b706914d6a", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950438ac98f6d864839696d6f6e80d2f9d537ffa59919a4028afdb627c14c14c97a1547e13e8e82203d2049b15b1a": "0x02a2d8cfcf75dda85fafc04ace3bcb73160034ed1964c43098fb1fe831de1b16", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa195068dec3fce5ade0966261626580da6b2df18f0f9001a6dcf1d301b92534fe9b1f3ccfa10c49449fee93adaa8349": "0x8062e9c21f1d92926103119f7e8153cebdb1e5ab3e52d6f395be80bb193eab47", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950a00d3cb0425699a66772616e804bea0b37e0cce9bddd80835fa2bfd5606f5dcfb8388bbb10b10c483f0856cf14": "0xfa373e25a1c4fe19c7148acde13bc3db1811cf656dc086820f3dda736b9c4a00", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa195043d506aedab0d2ce696d6f6e8048a910c0af90898f11bd57d37ceaea53c78994f8e1833a7ade483c9a84bde055": "0x520b48452969f6ddf263b664de0adb0c729d0e0ad3b0e5f3cb636c541bc9022a", + "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb33bb8d7990ae3975438f3c2f38f6d47f161e98c697bbe3ca0e47c033460afda0dda314ab4222a0404": "0x36be9069cdb4a8a07ecd51f257875150f0a8a1be44a10d9d98dabf10a030aef4764186bc30fd5a02477f19948dc723d6d57ab174debd4f80ed6038ec960bfe218e95b9b5b4dc69790b67b566567ca8bf8cdef3a3a8bb65393c0d1d1c87cd2d2cf2d19482d1da872af925e84478787e0719f637bd1f88c0c99316bdf2658d54782496f28d887d84705c6dae98aee8bf90fc5ad10bb5545eca1de6b68425b70f7c", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950520b06fa3d6f6aa67061726180a809aaaaebc04051536c99166c99f0cba19c7b5950cd8a37882dd56220f2e84f": "0xfa373e25a1c4fe19c7148acde13bc3db1811cf656dc086820f3dda736b9c4a00", + "0x3a6772616e6470615f617574686f726974696573": "0x01200e6d7d1afbcc6547b92995a394ba0daed07a2420be08220a5a1336c6731f0bfa0100000000000000fcd5f87a6fd5707a25122a01b4dac0a8482259df7d42a9a096606df1320df08d0100000000000000e1b68fbd84333e31486c08e6153d9a1415b2e7e71b413702b7d64e9b631184a1010000000000000036be9069cdb4a8a07ecd51f257875150f0a8a1be44a10d9d98dabf10a030aef401000000000000006c878e33b83c20324238d22240f735457b6fba544b383e70bb62a27b57380c810100000000000000d9c056c98ca0e6b4eb7f5c58c007c1db7be0fe1f3776108f797dd4990d1ccc3301000000000000004bea0b37e0cce9bddd80835fa2bfd5606f5dcfb8388bbb10b10c483f0856cf1401000000000000004ee66173993dd0db5d628c4c9cb61a27b76611ad3c3925947f0d0011ee2c5dcc0100000000000000", + "0x3fba98689ebed1138735e0e7a5a790ab0b76934f4cc08dee01012d059e1b83ee": "0x00", + "0x2b06af9719ac64d755623cda8ddd9b949f99a2ce711f3a31b2fc05604c93f179": "0x2086975a37211f8704e947a365b720f7a3e2757988eaa7d0f197e83dba355ef74348a910c0af90898f11bd57d37ceaea53c78994f8e1833a7ade483c9a84bde055ee93e26259decb89afcf17ef2aa0fa2db2e1042fb8f56ecfb24d19eae86298788e95b9b5b4dc69790b67b566567ca8bf8cdef3a3a8bb65393c0d1d1c87cd2d2cd2f9d537ffa59919a4028afdb627c14c14c97a1547e13e8e82203d2049b15b1ac4a980da30939d5bb9e4a734d12bf81259ae286aa21fa4b65405347fa40eff35560d90ca51e9c9481b8a9810060e04d0708d246714960439f804e5c6f40ca65192156f54a114ee191415898f2da013d9db6a5362d6b36330d5fc23e27360ab66", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19503d7dc9205a149f6a6175646980306ac5c772fe858942f92b6e28bd82fb7dd8cdd25f9a4626c1b0eee075fcb531": "0x02a2d8cfcf75dda85fafc04ace3bcb73160034ed1964c43098fb1fe831de1b16", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950585cf1f6f8e46326696d6f6e8086975a37211f8704e947a365b720f7a3e2757988eaa7d0f197e83dba355ef743": "0x62475fe5406a7cb6a64c51d0af9d3ab5c2151bcae982fb812f7a76b706914d6a", + "0x0b76934f4cc08dee01012d059e1b83ee5e0621c4869aa60c02be9adcc98a0d1d": "0x2006a7f34a2ae69cc0cca633c7a82b37cfba821707eb62ffe065b242e1230e4661ac3ce74c09d1bb387d3f79dc8df88d661da689d5364eb8131c83fcc8ecb2fc5b6caf2fe2cf01fc3f07e113a2940a1d6c7bc1ab9d8974f152c2ee201d4f16f67af2d19482d1da872af925e84478787e0719f637bd1f88c0c99316bdf2658d547846d6245026e0e4f4a120cfdfbc9f36a37de202489c4c7ff05b6c54d1811aee2c0062a5ab339962d84b6711b86fa67b457483fcd3d75dafb7bd15f182b7434227a809aaaaebc04051536c99166c99f0cba19c7b5950cd8a37882dd56220f2e84f6edd19e3c5230998e533e165a26438afe663368d0eab37fabff734a36119ce0e", + "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9b483908290ae9b936c519917440306ea62475fe5406a7cb6a64c51d0af9d3ab5c2151bcae982fb812f7a76b706914d6a": "0x000000000100407a10f35a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb3c25dd840975e8979fa373e25a1c4fe19c7148acde13bc3db1811cf656dc086820f3dda736b9c4a00": "0x4bea0b37e0cce9bddd80835fa2bfd5606f5dcfb8388bbb10b10c483f0856cf14720537e2c1c554654d73b3889c3ef4c3c2f95a65dd3f7c185ebe4afebed78372560d90ca51e9c9481b8a9810060e04d0708d246714960439f804e5c6f40ca651a809aaaaebc04051536c99166c99f0cba19c7b5950cd8a37882dd56220f2e84f64d59feddb3d00316a55906953fb3db8985797472bd2e6c7ea1ab730cc339d7f", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa195012b62e212b6a7a9c696d6f6e808e95b9b5b4dc69790b67b566567ca8bf8cdef3a3a8bb65393c0d1d1c87cd2d2c": "0x38f3c2f38f6d47f161e98c697bbe3ca0e47c033460afda0dda314ab4222a0404", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950ee41af0530f856db6772616e8036be9069cdb4a8a07ecd51f257875150f0a8a1be44a10d9d98dabf10a030aef4": "0x38f3c2f38f6d47f161e98c697bbe3ca0e47c033460afda0dda314ab4222a0404", + "0xc2261276cc9d1f8598ea4b6a74b15c2f308ce9615de0775a82f8a94dc3d285a1": "0x01", + "0x1cb6f36e027abb2091cfb5110ab5087f5e0621c4869aa60c02be9adcc98a0d1d": "0x20a076ef1280d768051f21d060623da3ab5b56944d681d303ed2d4bf658c5bed35010000000000000038757d0de00a0c739e7d7984ef4bc01161bd61e198b7c01b618425c16bb5bd5f0100000000000000d2644c1ab2c63a3ad8d40ad70d4b260969e3abfe6d7e6665f50dc9f6365c9d2a0100000000000000764186bc30fd5a02477f19948dc723d6d57ab174debd4f80ed6038ec960bfe2101000000000000007c94715e5dd8ab54221b1b6b2bfa5666f593f28a92a18e28052531de1bd808130100000000000000bab3cccdcc34401e9b3971b96a662686cf755aa869a5c4b762199ce531b12c5b0100000000000000720537e2c1c554654d73b3889c3ef4c3c2f95a65dd3f7c185ebe4afebed783720100000000000000da6b2df18f0f9001a6dcf1d301b92534fe9b1f3ccfa10c49449fee93adaa83490100000000000000", + "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da90d10cc4959af6a68eba3bc06d5c7bc28520b48452969f6ddf263b664de0adb0c729d0e0ad3b0e5f3cb636c541bc9022a": "0x000000000100407a10f35a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19501e69501baac264d4696d6f6e80ee93e26259decb89afcf17ef2aa0fa2db2e1042fb8f56ecfb24d19eae8629878": "0x92ef83665b39d7a565e11bf8d18d41d45a8011601c339e57a8ea88c8ff7bba6f", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19503c75eb9438a505fc6261626580a076ef1280d768051f21d060623da3ab5b56944d681d303ed2d4bf658c5bed35": "0x62475fe5406a7cb6a64c51d0af9d3ab5c2151bcae982fb812f7a76b706914d6a", + "0x26aa394eea5630e07c48ae0c9558cef78a42f33323cb5ced3b44dd825fda9fcc": "0x4545454545454545454545454545454545454545454545454545454545454545", + "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9a606acaa4558183a2102457959a213a192ef83665b39d7a565e11bf8d18d41d45a8011601c339e57a8ea88c8ff7bba6f": "0x000000000100407a10f35a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950776743a4ae520892617564698064d59feddb3d00316a55906953fb3db8985797472bd2e6c7ea1ab730cc339d7f": "0xfa373e25a1c4fe19c7148acde13bc3db1811cf656dc086820f3dda736b9c4a00", + "0xcec5070d609dd3497f72bde07fc96ba0e0cdd062e6eaf24295ad4ccfc41d4609": "0x2062475fe5406a7cb6a64c51d0af9d3ab5c2151bcae982fb812f7a76b706914d6a0e6d7d1afbcc6547b92995a394ba0daed07a2420be08220a5a1336c6731f0bfaa076ef1280d768051f21d060623da3ab5b56944d681d303ed2d4bf658c5bed3586975a37211f8704e947a365b720f7a3e2757988eaa7d0f197e83dba355ef74306a7f34a2ae69cc0cca633c7a82b37cfba821707eb62ffe065b242e1230e4661f49eae66a0ac9f610316906ec8f1a0928e20d7059d76a5ca53cbcb5a9b50dd3c520b48452969f6ddf263b664de0adb0c729d0e0ad3b0e5f3cb636c541bc9022afcd5f87a6fd5707a25122a01b4dac0a8482259df7d42a9a096606df1320df08d38757d0de00a0c739e7d7984ef4bc01161bd61e198b7c01b618425c16bb5bd5f48a910c0af90898f11bd57d37ceaea53c78994f8e1833a7ade483c9a84bde055ac3ce74c09d1bb387d3f79dc8df88d661da689d5364eb8131c83fcc8ecb2fc5bf6f8fe475130d21165446a02fb1dbce3a7bf36412e5d98f4f0473aed9252f34992ef83665b39d7a565e11bf8d18d41d45a8011601c339e57a8ea88c8ff7bba6fe1b68fbd84333e31486c08e6153d9a1415b2e7e71b413702b7d64e9b631184a1d2644c1ab2c63a3ad8d40ad70d4b260969e3abfe6d7e6665f50dc9f6365c9d2aee93e26259decb89afcf17ef2aa0fa2db2e1042fb8f56ecfb24d19eae86298786caf2fe2cf01fc3f07e113a2940a1d6c7bc1ab9d8974f152c2ee201d4f16f67a2c57f81fd311c1ab53813c6817fe67f8947f8d39258252663b3384ab4195494d38f3c2f38f6d47f161e98c697bbe3ca0e47c033460afda0dda314ab4222a040436be9069cdb4a8a07ecd51f257875150f0a8a1be44a10d9d98dabf10a030aef4764186bc30fd5a02477f19948dc723d6d57ab174debd4f80ed6038ec960bfe218e95b9b5b4dc69790b67b566567ca8bf8cdef3a3a8bb65393c0d1d1c87cd2d2cf2d19482d1da872af925e84478787e0719f637bd1f88c0c99316bdf2658d54782496f28d887d84705c6dae98aee8bf90fc5ad10bb5545eca1de6b68425b70f7c02a2d8cfcf75dda85fafc04ace3bcb73160034ed1964c43098fb1fe831de1b166c878e33b83c20324238d22240f735457b6fba544b383e70bb62a27b57380c817c94715e5dd8ab54221b1b6b2bfa5666f593f28a92a18e28052531de1bd80813d2f9d537ffa59919a4028afdb627c14c14c97a1547e13e8e82203d2049b15b1a46d6245026e0e4f4a120cfdfbc9f36a37de202489c4c7ff05b6c54d1811aee2c306ac5c772fe858942f92b6e28bd82fb7dd8cdd25f9a4626c1b0eee075fcb53102ea6bfa8b23b92fe4b5db1063a1f9475e3acd0ab61e6b4f454ed6ba00b5f864d9c056c98ca0e6b4eb7f5c58c007c1db7be0fe1f3776108f797dd4990d1ccc33bab3cccdcc34401e9b3971b96a662686cf755aa869a5c4b762199ce531b12c5bc4a980da30939d5bb9e4a734d12bf81259ae286aa21fa4b65405347fa40eff350062a5ab339962d84b6711b86fa67b457483fcd3d75dafb7bd15f182b7434227160ea09c5717270e958a3da42673fa011613a9539b2e4ebcad8626bc117ca04afa373e25a1c4fe19c7148acde13bc3db1811cf656dc086820f3dda736b9c4a004bea0b37e0cce9bddd80835fa2bfd5606f5dcfb8388bbb10b10c483f0856cf14720537e2c1c554654d73b3889c3ef4c3c2f95a65dd3f7c185ebe4afebed78372560d90ca51e9c9481b8a9810060e04d0708d246714960439f804e5c6f40ca651a809aaaaebc04051536c99166c99f0cba19c7b5950cd8a37882dd56220f2e84f64d59feddb3d00316a55906953fb3db8985797472bd2e6c7ea1ab730cc339d7f8062e9c21f1d92926103119f7e8153cebdb1e5ab3e52d6f395be80bb193eab474ee66173993dd0db5d628c4c9cb61a27b76611ad3c3925947f0d0011ee2c5dccda6b2df18f0f9001a6dcf1d301b92534fe9b1f3ccfa10c49449fee93adaa834992156f54a114ee191415898f2da013d9db6a5362d6b36330d5fc23e27360ab666edd19e3c5230998e533e165a26438afe663368d0eab37fabff734a36119ce0e4e262811acdfe94528bfc3c65036080426a0e1301b9ada8d687a70ffcae99c26", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950d7ce35a3ce71c3d76175646980160ea09c5717270e958a3da42673fa011613a9539b2e4ebcad8626bc117ca04a": "0x02ea6bfa8b23b92fe4b5db1063a1f9475e3acd0ab61e6b4f454ed6ba00b5f864", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950eaa747c43246bd0170617261806edd19e3c5230998e533e165a26438afe663368d0eab37fabff734a36119ce0e": "0x8062e9c21f1d92926103119f7e8153cebdb1e5ab3e52d6f395be80bb193eab47", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950f7aec8a47707294b61756469802c57f81fd311c1ab53813c6817fe67f8947f8d39258252663b3384ab4195494d": "0x92ef83665b39d7a565e11bf8d18d41d45a8011601c339e57a8ea88c8ff7bba6f", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950f6584bfaf470c1b26175646980f6f8fe475130d21165446a02fb1dbce3a7bf36412e5d98f4f0473aed9252f349": "0x520b48452969f6ddf263b664de0adb0c729d0e0ad3b0e5f3cb636c541bc9022a", + "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da914076ec446ba6876ba5cb99bdb7129be8062e9c21f1d92926103119f7e8153cebdb1e5ab3e52d6f395be80bb193eab47": "0x000000000100407a10f35a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950bad35ce880ec90d4696d6f6e80c4a980da30939d5bb9e4a734d12bf81259ae286aa21fa4b65405347fa40eff35": "0x02ea6bfa8b23b92fe4b5db1063a1f9475e3acd0ab61e6b4f454ed6ba00b5f864", + "0x3a65787472696e7369635f696e646578": "0x00000000", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950a31727416d0095b96772616e80e1b68fbd84333e31486c08e6153d9a1415b2e7e71b413702b7d64e9b631184a1": "0x92ef83665b39d7a565e11bf8d18d41d45a8011601c339e57a8ea88c8ff7bba6f", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950636f684eb09a15046772616e80d9c056c98ca0e6b4eb7f5c58c007c1db7be0fe1f3776108f797dd4990d1ccc33": "0x02ea6bfa8b23b92fe4b5db1063a1f9475e3acd0ab61e6b4f454ed6ba00b5f864", + "0x1cb6f36e027abb2091cfb5110ab5087f66e8f035c8adbe7f1547b43c51e6f8a4": "0x00000000", + "0xc2261276cc9d1f8598ea4b6a74b15c2f57c875e4cff74148e4628f264b974c80": "0x0000362b4c8ee30d0000000000000000", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950380896fa42b08eb470617261800062a5ab339962d84b6711b86fa67b457483fcd3d75dafb7bd15f182b7434227": "0x02ea6bfa8b23b92fe4b5db1063a1f9475e3acd0ab61e6b4f454ed6ba00b5f864", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950e7240ce913e160eb6261626580bab3cccdcc34401e9b3971b96a662686cf755aa869a5c4b762199ce531b12c5b": "0x02ea6bfa8b23b92fe4b5db1063a1f9475e3acd0ab61e6b4f454ed6ba00b5f864", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa195021e85cbadb3ce9a26772616e806c878e33b83c20324238d22240f735457b6fba544b383e70bb62a27b57380c81": "0x02a2d8cfcf75dda85fafc04ace3bcb73160034ed1964c43098fb1fe831de1b16", + "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da99677d775b618280f5c76d192b43ea38c38f3c2f38f6d47f161e98c697bbe3ca0e47c033460afda0dda314ab4222a0404": "0x000000000100407a10f35a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "0x26aa394eea5630e07c48ae0c9558cef7a44704b568d21667356a5a050c118746b4def25cfda6ef3a00000000": "0x4545454545454545454545454545454545454545454545454545454545454545", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa195043f25e7a03a30387696d6f6e8092156f54a114ee191415898f2da013d9db6a5362d6b36330d5fc23e27360ab66": "0x8062e9c21f1d92926103119f7e8153cebdb1e5ab3e52d6f395be80bb193eab47" + }, + "childrenDefault": {} + } + } +} diff --git a/service/src/chain_spec.rs b/service/src/chain_spec.rs index d360816ebb..7057aca5eb 100644 --- a/service/src/chain_spec.rs +++ b/service/src/chain_spec.rs @@ -21,9 +21,11 @@ use polkadot_primitives::v0::{AccountId, AccountPublic, ValidatorId}; use polkadot_runtime as polkadot; use kusama_runtime as kusama; use westend_runtime as westend; +use rococo_runtime as rococo; use polkadot::constants::currency::DOTS; use kusama::constants::currency::DOTS as KSM; use westend::constants::currency::DOTS as WND; +use rococo_runtime::constants::currency::DOTS as ROC; use sc_chain_spec::{ChainSpecExtension, ChainType}; use sp_runtime::{traits::IdentifyAccount, Perbill}; use serde::{Serialize, Deserialize}; @@ -71,6 +73,12 @@ pub type WestendChainSpec = service::GenericChainSpec< Extensions, >; +/// The `ChainSpec parametrised for rococo runtime`. +pub type RococoChainSpec = service::GenericChainSpec< + rococo_runtime::GenesisConfig, + Extensions, +>; + pub fn polkadot_config() -> Result { PolkadotChainSpec::from_json_bytes(&include_bytes!("../res/polkadot.json")[..]) } @@ -79,8 +87,12 @@ pub fn kusama_config() -> Result { KusamaChainSpec::from_json_bytes(&include_bytes!("../res/kusama.json")[..]) } -pub fn westend_config() -> Result { - PolkadotChainSpec::from_json_bytes(&include_bytes!("../res/westend.json")[..]) +pub fn westend_config() -> Result { + WestendChainSpec::from_json_bytes(&include_bytes!("../res/westend.json")[..]) +} + +pub fn rococo_config() -> Result { + RococoChainSpec::from_json_bytes(&include_bytes!("../res/rococo.json")[..]) } fn polkadot_session_keys( @@ -113,6 +125,16 @@ fn westend_session_keys( westend::SessionKeys { babe, grandpa, im_online, parachain_validator, authority_discovery } } +fn rococo_session_keys( + babe: BabeId, + grandpa: GrandpaId, + im_online: ImOnlineId, + parachain_validator: ValidatorId, + authority_discovery: AuthorityDiscoveryId +) -> rococo_runtime::SessionKeys { + rococo_runtime::SessionKeys { babe, grandpa, im_online, parachain_validator, authority_discovery } +} + fn polkadot_staging_testnet_config_genesis(wasm_binary: &[u8]) -> polkadot::GenesisConfig { // subkey inspect "$SECRET" let endowed_accounts = vec![]; @@ -337,6 +359,197 @@ fn westend_staging_testnet_config_genesis(wasm_binary: &[u8]) -> westend::Genesi } } +fn rococo_staging_testnet_config_genesis(wasm_binary: &[u8]) -> rococo_runtime::GenesisConfig { + // subkey inspect "$SECRET" + let endowed_accounts = vec![ + // 5FeyRQmjtdHoPH56ASFW76AJEP1yaQC1K9aEMvJTF9nzt9S9 + hex!["9ed7705e3c7da027ba0583a22a3212042f7e715d3c168ba14f1424e2bc111d00"].into(), + ]; + + // ./scripts/prepare-test-net.sh 8 + let initial_authorities: Vec<( + AccountId, + AccountId, + BabeId, + GrandpaId, + ImOnlineId, + ValidatorId, + AuthorityDiscoveryId + )> = vec![( + //5EHZkbp22djdbuMFH9qt1DVzSCvqi3zWpj6DAYfANa828oei + hex!["62475fe5406a7cb6a64c51d0af9d3ab5c2151bcae982fb812f7a76b706914d6a"].into(), + //5FeSEpi9UYYaWwXXb3tV88qtZkmSdB3mvgj3pXkxKyYLGhcd + hex!["9e6e781a76810fe93187af44c79272c290c2b9e2b8b92ee11466cd79d8023f50"].into(), + //5Fh6rDpMDhM363o1Z3Y9twtaCPfizGQWCi55BSykTQjGbP7H + hex!["a076ef1280d768051f21d060623da3ab5b56944d681d303ed2d4bf658c5bed35"].unchecked_into(), + //5CPd3zoV9Aaah4xWucuDivMHJ2nEEmpdi864nPTiyRZp4t87 + hex!["0e6d7d1afbcc6547b92995a394ba0daed07a2420be08220a5a1336c6731f0bfa"].unchecked_into(), + //5F7BEa1LGFksUihyatf3dCDYneB8pWzVyavnByCsm5nBgezi + hex!["86975a37211f8704e947a365b720f7a3e2757988eaa7d0f197e83dba355ef743"].unchecked_into(), + //5CDS33qmzmrBHWxVx5Vcz2Wim5b4aVS5C9yh3HpxqwmkrFwt + hex!["06a7f34a2ae69cc0cca633c7a82b37cfba821707eb62ffe065b242e1230e4661"].unchecked_into(), + //5HbSgM72xVuscsopsdeG3sCSCYdAeM1Tay9p79N6ky6vwDGq + hex!["f49eae66a0ac9f610316906ec8f1a0928e20d7059d76a5ca53cbcb5a9b50dd3c"].unchecked_into(), + ), + ( + //5DvH8oEjQPYhzCoQVo7WDU91qmQfLZvxe9wJcrojmJKebCmG + hex!["520b48452969f6ddf263b664de0adb0c729d0e0ad3b0e5f3cb636c541bc9022a"].into(), + //5ENZvCRzyXJJYup8bM6yEzb2kQHEb1NDpY2ZEyVGBkCfRdj3 + hex!["6618289af7ae8621981ffab34591e7a6486e12745dfa3fd3b0f7e6a3994c7b5b"].into(), + //5DLjSUfqZVNAADbwYLgRvHvdzXypiV1DAEaDMjcESKTcqMoM + hex!["38757d0de00a0c739e7d7984ef4bc01161bd61e198b7c01b618425c16bb5bd5f"].unchecked_into(), + //5HnDVBN9mD6mXyx8oryhDbJtezwNSj1VRXgLoYCBA6uEkiao + hex!["fcd5f87a6fd5707a25122a01b4dac0a8482259df7d42a9a096606df1320df08d"].unchecked_into(), + //5DhyXZiuB1LvqYKFgT5tRpgGsN3is2cM9QxgW7FikvakbAZP + hex!["48a910c0af90898f11bd57d37ceaea53c78994f8e1833a7ade483c9a84bde055"].unchecked_into(), + //5FxYBi73N4C9HQphtjCRDthxT2XLhd8e6BuYnxERQ7UJtAx6 + hex!["ac3ce74c09d1bb387d3f79dc8df88d661da689d5364eb8131c83fcc8ecb2fc5b"].unchecked_into(), + //5HeXbwb5PxtcRoopPZTp5CQun38atn2UudQ8p2AxR5BzoaXw + hex!["f6f8fe475130d21165446a02fb1dbce3a7bf36412e5d98f4f0473aed9252f349"].unchecked_into(), + ), + ( + //5FPMzsezo1PRxYbVpJMWK7HNbR2kUxidsAAxH4BosHa4wd6S + hex!["92ef83665b39d7a565e11bf8d18d41d45a8011601c339e57a8ea88c8ff7bba6f"].into(), + //5G6NQidFG7YiXsvV7hQTLGArir9tsYqD4JDxByhgxKvSKwRx + hex!["b235f57244230589523271c27b8a490922ffd7dccc83b044feaf22273c1dc735"].into(), + //5GpZhzAVg7SAtzLvaAC777pjquPEcNy1FbNUAG2nZvhmd6eY + hex!["d2644c1ab2c63a3ad8d40ad70d4b260969e3abfe6d7e6665f50dc9f6365c9d2a"].unchecked_into(), + //5HAes2RQYPbYKbLBfKb88f4zoXv6pPA6Ke8CjN7dob3GpmSP + hex!["e1b68fbd84333e31486c08e6153d9a1415b2e7e71b413702b7d64e9b631184a1"].unchecked_into(), + //5HTXBf36LXmkFWJLokNUK6fPxVpkr2ToUnB1pvaagdGu4c1T + hex!["ee93e26259decb89afcf17ef2aa0fa2db2e1042fb8f56ecfb24d19eae8629878"].unchecked_into(), + //5EXD52Bdz24J1N6i8hss7a5pfAARYmURgESatGXgjsV274Rk + hex!["6caf2fe2cf01fc3f07e113a2940a1d6c7bc1ab9d8974f152c2ee201d4f16f67a"].unchecked_into(), + //5D4r6YaB6F7A7nvMRHNFNF6zrR9g39bqDJFenrcaFmTCRwfa + hex!["2c57f81fd311c1ab53813c6817fe67f8947f8d39258252663b3384ab4195494d"].unchecked_into(), + ), + ( + //5DMNx7RoX6d7JQ38NEM7DWRcW2THu92LBYZEWvBRhJeqcWgR + hex!["38f3c2f38f6d47f161e98c697bbe3ca0e47c033460afda0dda314ab4222a0404"].into(), + //5GGdKNDr9P47dpVnmtq3m8Tvowwf1ot1abw6tPsTYYFoKm2v + hex!["ba0898c1964196474c0be08d364cdf4e9e1d47088287f5235f70b0590dfe1704"].into(), + //5EjkyPCzR2SjhDZq8f7ufsw6TfkvgNRepjCRQFc4TcdXdaB1 + hex!["764186bc30fd5a02477f19948dc723d6d57ab174debd4f80ed6038ec960bfe21"].unchecked_into(), + //5DJV3zCBTJBLGNDCcdWrYxWDacSz84goGTa4pFeKVvehEBte + hex!["36be9069cdb4a8a07ecd51f257875150f0a8a1be44a10d9d98dabf10a030aef4"].unchecked_into(), + //5FHf8kpK4fPjEJeYcYon2gAPwEBubRvtwpzkUbhMWSweKPUY + hex!["8e95b9b5b4dc69790b67b566567ca8bf8cdef3a3a8bb65393c0d1d1c87cd2d2c"].unchecked_into(), + //5HZ5hm2WTQEXaYAeH24h5kh2Q2rCbnJeiXNm9nhkxNXwwn8M + hex!["f2d19482d1da872af925e84478787e0719f637bd1f88c0c99316bdf2658d5478"].unchecked_into(), + //5CtgRR74VypK4h154s369abs78hDUxZSJqcbWsfXvsjcHJNA + hex!["2496f28d887d84705c6dae98aee8bf90fc5ad10bb5545eca1de6b68425b70f7c"].unchecked_into(), + ), + ( + //5C8AL1Zb4bVazgT3EgDxFgcow1L4SJjVu44XcLC9CrYqFN4N + hex!["02a2d8cfcf75dda85fafc04ace3bcb73160034ed1964c43098fb1fe831de1b16"].into(), + //5FLYy3YKsAnooqE4hCudttAsoGKbVG3hYYBtVzwMjJQrevPa + hex!["90cab33f0bb501727faa8319f0845faef7d31008f178b65054b6629fe531b772"].into(), + //5Et3tfbVf1ByFThNAuUq5pBssdaPPskip5yob5GNyUFojXC7 + hex!["7c94715e5dd8ab54221b1b6b2bfa5666f593f28a92a18e28052531de1bd80813"].unchecked_into(), + //5EX1JBghGbQqWohTPU6msR9qZ2nYPhK9r3RTQ2oD1K8TCxaG + hex!["6c878e33b83c20324238d22240f735457b6fba544b383e70bb62a27b57380c81"].unchecked_into(), + //5GqL8RbVAuNXpDhjQi1KrS1MyNuKhvus2AbmQwRGjpuGZmFu + hex!["d2f9d537ffa59919a4028afdb627c14c14c97a1547e13e8e82203d2049b15b1a"].unchecked_into(), + //5DfapfASpVBDsVxgM2FctoQXRX6oa9AbXY5uH7VxWu9esQFy + hex!["46d6245026e0e4f4a120cfdfbc9f36a37de202489c4c7ff05b6c54d1811aee2c"].unchecked_into(), + //5DABsdQCDUGuhzVGWe5xXzYQ9rtrVxRygW7RXf9Tsjsw1aGJ + hex!["306ac5c772fe858942f92b6e28bd82fb7dd8cdd25f9a4626c1b0eee075fcb531"].unchecked_into(), + ), + ( + //5C8XbDXdMNKJrZSrQURwVCxdNdk8AzG6xgLggbzuA399bBBF + hex!["02ea6bfa8b23b92fe4b5db1063a1f9475e3acd0ab61e6b4f454ed6ba00b5f864"].into(), + //5GsyzFP8qtF8tXPSsjhjxAeU1v7D1PZofuQKN9TdCc7Dp1JM + hex!["d4ffc4c05b47d1115ad200f7f86e307b20b46c50e1b72a912ec4f6f7db46b616"].into(), + //5GHWB8ZDzegLcMW7Gdd1BS6WHVwDdStfkkE4G7KjPjZNJBtD + hex!["bab3cccdcc34401e9b3971b96a662686cf755aa869a5c4b762199ce531b12c5b"].unchecked_into(), + //5GzDPGbUM9uH52ZEwydasTj8edokGUJ7vEpoFWp9FE1YNuFB + hex!["d9c056c98ca0e6b4eb7f5c58c007c1db7be0fe1f3776108f797dd4990d1ccc33"].unchecked_into(), + //5GWZbVkJEfWZ7fRca39YAQeqri2Z7pkeHyd7rUctUHyQifLp + hex!["c4a980da30939d5bb9e4a734d12bf81259ae286aa21fa4b65405347fa40eff35"].unchecked_into(), + //5C5DAKUwKcxU2eT9fZU23HPEJcJLPQRt7YX5sAyifKKsnBNd + hex!["0062a5ab339962d84b6711b86fa67b457483fcd3d75dafb7bd15f182b7434227"].unchecked_into(), + //5CZdFnyzZvKetZTeUwj5APAYskVJe4QFiTezo5dQNsrnehGd + hex!["160ea09c5717270e958a3da42673fa011613a9539b2e4ebcad8626bc117ca04a"].unchecked_into(), + ), + ( + //5HinEonzr8MywkqedcpsmwpxKje2jqr9miEwuzyFXEBCvVXM + hex!["fa373e25a1c4fe19c7148acde13bc3db1811cf656dc086820f3dda736b9c4a00"].into(), + //5EHJbj6Td6ks5HDnyfN4ttTSi57osxcQsQexm7XpazdeqtV7 + hex!["62145d721967bd88622d08625f0f5681463c0f1b8bcd97eb3c2c53f7660fd513"].into(), + //5EeCsC58XgJ1DFaoYA1WktEpP27jvwGpKdxPMFjicpLeYu96 + hex!["720537e2c1c554654d73b3889c3ef4c3c2f95a65dd3f7c185ebe4afebed78372"].unchecked_into(), + //5DnEySxbnppWEyN8cCLqvGjAorGdLRg2VmkY96dbJ1LHFK8N + hex!["4bea0b37e0cce9bddd80835fa2bfd5606f5dcfb8388bbb10b10c483f0856cf14"].unchecked_into(), + //5E1Y1FJ7dVP7qtE3wm241pTm72rTMcDT5Jd8Czv7Pwp7N3AH + hex!["560d90ca51e9c9481b8a9810060e04d0708d246714960439f804e5c6f40ca651"].unchecked_into(), + //5Fs2mowfPb93ByRTKtzTE5evCh2SfVLJfpBBM5SmpYGdG6yK + hex!["a809aaaaebc04051536c99166c99f0cba19c7b5950cd8a37882dd56220f2e84f"].unchecked_into(), + //5ELv74v7QcsS6FdzvG4vL2NnYDGWmRnJUSMKYwdyJD7Xcdi7 + hex!["64d59feddb3d00316a55906953fb3db8985797472bd2e6c7ea1ab730cc339d7f"].unchecked_into(), + ), + ( + //5Ey3NQ3dfabaDc16NUv7wRLsFCMDFJSqZFzKVycAsWuUC6Di + hex!["8062e9c21f1d92926103119f7e8153cebdb1e5ab3e52d6f395be80bb193eab47"].into(), + //5HiWsuSBqt8nS9pnggexXuHageUifVPKPHDE2arTKqhTp1dV + hex!["fa0388fa88f3f0cb43d583e2571fbc0edad57dff3a6fd89775451dd2c2b8ea00"].into(), + //5H168nKX2Yrfo3bxj7rkcg25326Uv3CCCnKUGK6uHdKMdPt8 + hex!["da6b2df18f0f9001a6dcf1d301b92534fe9b1f3ccfa10c49449fee93adaa8349"].unchecked_into(), + //5DrA2fZdzmNqT5j6DXNwVxPBjDV9jhkAqvjt6Us3bQHKy3cF + hex!["4ee66173993dd0db5d628c4c9cb61a27b76611ad3c3925947f0d0011ee2c5dcc"].unchecked_into(), + //5FNFDUGNLUtqg5LgrwYLNmBiGoP8KRxsvQpBkc7GQP6qaBUG + hex!["92156f54a114ee191415898f2da013d9db6a5362d6b36330d5fc23e27360ab66"].unchecked_into(), + //5Ea4of4L3i5Nc8QcPE648cN8CL8iuo9v4xc2LpKAtr6oShFU + hex!["6edd19e3c5230998e533e165a26438afe663368d0eab37fabff734a36119ce0e"].unchecked_into(), + //5DqAvikdpfRdk5rR35ZobZhqaC5bJXZcEuvzGtexAZP1hU3T + hex!["4e262811acdfe94528bfc3c65036080426a0e1301b9ada8d687a70ffcae99c26"].unchecked_into(), + )]; + + const ENDOWMENT: u128 = 1_000_000 * ROC; + const STASH: u128 = 100 * ROC; + + rococo_runtime::GenesisConfig { + system: Some(rococo_runtime::SystemConfig { + code: wasm_binary.to_vec(), + changes_trie_config: Default::default(), + }), + balances: Some(rococo_runtime::BalancesConfig { + balances: endowed_accounts.iter() + .map(|k: &AccountId| (k.clone(), ENDOWMENT)) + .chain(initial_authorities.iter().map(|x| (x.0.clone(), STASH))) + .collect(), + }), + indices: Some(rococo_runtime::IndicesConfig { + indices: vec![], + }), + session: Some(rococo_runtime::SessionConfig { + keys: initial_authorities.iter().map(|x| ( + x.0.clone(), + x.0.clone(), + rococo_session_keys(x.2.clone(), x.3.clone(), x.4.clone(), x.5.clone(), x.6.clone()), + )).collect::>(), + }), + babe: Some(Default::default()), + grandpa: Some(Default::default()), + im_online: Some(Default::default()), + authority_discovery: Some(rococo_runtime::AuthorityDiscoveryConfig { + keys: vec![], + }), + parachains: Some(rococo_runtime::ParachainsConfig { + authorities: vec![], + }), + registrar: Some(rococo_runtime::RegistrarConfig { + parachains: vec![], + _phdata: Default::default(), + }), + vesting: Some(rococo_runtime::VestingConfig { + vesting: vec![], + }), + sudo: Some(rococo_runtime::SudoConfig { + key: endowed_accounts[0].clone(), + }), + } +} + fn kusama_staging_testnet_config_genesis(wasm_binary: &[u8]) -> kusama::GenesisConfig { // subkey inspect "$SECRET" let endowed_accounts = vec![ @@ -546,6 +759,25 @@ pub fn westend_staging_testnet_config() -> Result { )) } +/// Rococo staging testnet config. +pub fn rococo_staging_testnet_config() -> Result { + let wasm_binary = rococo::WASM_BINARY.ok_or("Rococo development wasm not available")?; + let boot_nodes = vec![]; + + Ok(RococoChainSpec::from_genesis( + "Rococo Staging Testnet", + "rococo_staging_testnet", + ChainType::Live, + move || rococo_staging_testnet_config_genesis(wasm_binary), + boot_nodes, + Some(TelemetryEndpoints::new(vec![(WESTEND_STAGING_TELEMETRY_URL.to_string(), 0)]) + .expect("Rococo Staging telemetry url is valid; qed")), + Some(DEFAULT_PROTOCOL_ID), + None, + Default::default(), + )) +} + /// Helper function to generate a crypto pair from seed pub fn get_from_seed(seed: &str) -> ::Public { TPublic::Pair::from_string(&format!("//{}", seed), None) @@ -812,6 +1044,57 @@ pub fn westend_testnet_genesis( } } +/// Helper function to create rococo GenesisConfig for testing +pub fn rococo_testnet_genesis( + wasm_binary: &[u8], + initial_authorities: Vec<(AccountId, AccountId, BabeId, GrandpaId, ImOnlineId, ValidatorId, AuthorityDiscoveryId)>, + root_key: AccountId, + endowed_accounts: Option>, +) -> rococo_runtime::GenesisConfig { + let endowed_accounts: Vec = endowed_accounts.unwrap_or_else(testnet_accounts); + + const ENDOWMENT: u128 = 1_000_000 * DOTS; + + rococo_runtime::GenesisConfig { + system: Some(rococo_runtime::SystemConfig { + code: wasm_binary.to_vec(), + changes_trie_config: Default::default(), + }), + indices: Some(rococo_runtime::IndicesConfig { + indices: vec![], + }), + balances: Some(rococo_runtime::BalancesConfig { + balances: endowed_accounts.iter().map(|k| (k.clone(), ENDOWMENT)).collect(), + }), + session: Some(rococo_runtime::SessionConfig { + keys: initial_authorities.iter().map(|x| ( + x.0.clone(), + x.0.clone(), + rococo_session_keys(x.2.clone(), x.3.clone(), x.4.clone(), x.5.clone(), x.6.clone()), + )).collect::>(), + }), + babe: Some(Default::default()), + grandpa: Some(Default::default()), + im_online: Some(Default::default()), + authority_discovery: Some(rococo_runtime::AuthorityDiscoveryConfig { + keys: vec![], + }), + parachains: Some(rococo_runtime::ParachainsConfig { + authorities: vec![], + }), + registrar: Some(rococo_runtime::RegistrarConfig{ + parachains: vec![], + _phdata: Default::default(), + }), + vesting: Some(rococo_runtime::VestingConfig { + vesting: vec![], + }), + sudo: Some(rococo_runtime::SudoConfig { + key: root_key, + }), + } +} + fn polkadot_development_config_genesis(wasm_binary: &[u8]) -> polkadot::GenesisConfig { polkadot_testnet_genesis( wasm_binary, @@ -966,6 +1249,18 @@ fn westend_local_testnet_genesis(wasm_binary: &[u8]) -> westend::GenesisConfig { ) } +fn rococo_local_testnet_genesis(wasm_binary: &[u8]) -> rococo_runtime::GenesisConfig { + rococo_testnet_genesis( + wasm_binary, + vec![ + get_authority_keys_from_seed("Alice"), + get_authority_keys_from_seed("Bob"), + ], + get_account_id_from_seed::("Alice"), + None, + ) +} + /// Westend local testnet config (multivalidator Alice + Bob) pub fn westend_local_testnet_config() -> Result { let wasm_binary = westend::WASM_BINARY.ok_or("Westend development wasm not available")?; @@ -982,3 +1277,20 @@ pub fn westend_local_testnet_config() -> Result { Default::default(), )) } + +/// Rococo local testnet config (multivalidator Alice + Bob) +pub fn rococo_local_testnet_config() -> Result { + let wasm_binary = rococo::WASM_BINARY.ok_or("Rococo development wasm not available")?; + + Ok(RococoChainSpec::from_genesis( + "Rococo Local Testnet", + "rococo_local_testnet", + ChainType::Local, + move || rococo_local_testnet_genesis(wasm_binary), + vec![], + None, + Some(DEFAULT_PROTOCOL_ID), + None, + Default::default(), + )) +} diff --git a/service/src/lib.rs b/service/src/lib.rs index 2aaa2971fd..30fb4c0cff 100644 --- a/service/src/lib.rs +++ b/service/src/lib.rs @@ -75,6 +75,13 @@ native_executor_instance!( frame_benchmarking::benchmarking::HostFunctions, ); +native_executor_instance!( + pub RococoExecutor, + rococo_runtime::api::dispatch, + rococo_runtime::native_version, + frame_benchmarking::benchmarking::HostFunctions, +); + /// A set of APIs that polkadot-like runtimes must implement. pub trait RuntimeApiCollection: sp_transaction_pool::runtime_api::TaggedTransactionQueue @@ -118,15 +125,23 @@ pub trait IdentifyVariant { /// Returns if this is a configuration for the `Westend` network. fn is_westend(&self) -> bool; + + /// Returns if this is a configuration for the `Rococo` network. + fn is_rococo(&self) -> bool; } impl IdentifyVariant for Box { fn is_kusama(&self) -> bool { self.id().starts_with("kusama") || self.id().starts_with("ksm") } + fn is_westend(&self) -> bool { self.id().starts_with("westend") || self.id().starts_with("wnd") } + + fn is_rococo(&self) -> bool { + self.id().starts_with("rococo") || self.id().starts_with("roc") + } } type FullBackend = service::TFullBackend; @@ -771,7 +786,7 @@ pub fn kusama_new_full( Ok((service, client, handles)) } -/// Create a new Kusama service for a full node. +/// Create a new Westend service for a full node. #[cfg(feature = "full-node")] pub fn westend_new_full( config: Configuration, @@ -804,6 +819,39 @@ pub fn westend_new_full( Ok((service, client, handles)) } +/// Create a new Rococo service for a full node. +#[cfg(feature = "full-node")] +pub fn rococo_new_full( + config: Configuration, + collating_for: Option<(CollatorId, parachain::Id)>, + max_block_data_size: Option, + authority_discovery_disabled: bool, + slot_duration: u64, + grandpa_pause: Option<(u32, u32)>, +) + -> Result<( + TaskManager, + Arc, + rococo_runtime::RuntimeApi + >>, + FullNodeHandles, + ), ServiceError> +{ + let (service, client, handles, _, _) = new_full::( + config, + collating_for, + max_block_data_size, + authority_discovery_disabled, + slot_duration, + grandpa_pause, + false, + )?; + + Ok((service, client, handles)) +} + /// Handles to other sub-services that full nodes instantiate, which consumers /// of the node may use. #[cfg(feature = "full-node")] @@ -838,6 +886,10 @@ impl NodeBuilder { new_light::( self.config, ) + } else if self.config.chain_spec.is_rococo() { + new_light::( + self.config, + ) } else { new_light::( self.config, @@ -875,6 +927,16 @@ impl NodeBuilder { grandpa_pause, false, ).map(|(task_manager, _, _, _, _)| task_manager) + } else if self.config.chain_spec.is_rococo() { + new_full::( + self.config, + collating_for, + max_block_data_size, + authority_discovery_disabled, + slot_duration, + grandpa_pause, + false, + ).map(|(task_manager, _, _, _, _)| task_manager) } else { new_full::( self.config, -- GitLab From e7600080687dc656574a2c18f5df198b5c3ecd85 Mon Sep 17 00:00:00 2001 From: Andronik Ordian Date: Tue, 4 Aug 2020 14:32:42 +0200 Subject: [PATCH 140/192] Integrate ChainApi with all messages (#1533) * propagate chain_api subsystem through various locations * add ChainApi to AllMessages Co-authored-by: Peter Goodspeed-Niklaus --- node/core/chain-api/src/lib.rs | 6 ++-- node/overseer/examples/minimal-example.rs | 1 + node/overseer/src/lib.rs | 39 ++++++++++++++++++++--- node/service/src/lib.rs | 1 + node/subsystem/src/messages.rs | 4 ++- 5 files changed, 43 insertions(+), 8 deletions(-) diff --git a/node/core/chain-api/src/lib.rs b/node/core/chain-api/src/lib.rs index 9af759aab7..a9e93ca9dd 100644 --- a/node/core/chain-api/src/lib.rs +++ b/node/core/chain-api/src/lib.rs @@ -142,9 +142,9 @@ mod tests { Header { parent_hash: Hash::zero(), number: 100500, - state_root: Hash::zero(), - extrinsics_root: Hash::zero(), - digest: Default::default(), + state_root: Hash::zero(), + extrinsics_root: Hash::zero(), + digest: Default::default(), } } diff --git a/node/overseer/examples/minimal-example.rs b/node/overseer/examples/minimal-example.rs index 1dae921426..c1eab3d8a8 100644 --- a/node/overseer/examples/minimal-example.rs +++ b/node/overseer/examples/minimal-example.rs @@ -154,6 +154,7 @@ fn main() { runtime_api: DummySubsystem, availability_store: DummySubsystem, network_bridge: DummySubsystem, + chain_api: DummySubsystem, }; let (overseer, _handler) = Overseer::new( vec![], diff --git a/node/overseer/src/lib.rs b/node/overseer/src/lib.rs index 9aa3468c0d..dac25ab522 100644 --- a/node/overseer/src/lib.rs +++ b/node/overseer/src/lib.rs @@ -76,7 +76,7 @@ use client::{BlockImportNotification, BlockchainEvents, FinalityNotification}; use polkadot_subsystem::messages::{ CandidateValidationMessage, CandidateBackingMessage, - CandidateSelectionMessage, StatementDistributionMessage, + CandidateSelectionMessage, ChainApiMessage, StatementDistributionMessage, AvailabilityDistributionMessage, BitfieldSigningMessage, BitfieldDistributionMessage, ProvisionerMessage, PoVDistributionMessage, RuntimeApiMessage, AvailabilityStoreMessage, NetworkBridgeMessage, AllMessages, @@ -360,6 +360,8 @@ pub struct Overseer { /// A network bridge subsystem. network_bridge_subsystem: OverseenSubsystem, + /// A Chain API subsystem + chain_api_subsystem: OverseenSubsystem, /// Spawner to spawn tasks to. s: S, @@ -393,7 +395,7 @@ pub struct Overseer { /// /// [`Subsystem`]: trait.Subsystem.html /// [`DummySubsystem`]: struct.DummySubsystem.html -pub struct AllSubsystems { +pub struct AllSubsystems { /// A candidate validation subsystem. pub candidate_validation: CV, /// A candidate backing subsystem. @@ -418,6 +420,8 @@ pub struct AllSubsystems { pub availability_store: AS, /// A network bridge subsystem. pub network_bridge: NB, + /// A Chain API subsystem. + pub chain_api: CA, } impl Overseer @@ -499,6 +503,7 @@ where /// runtime_api: DummySubsystem, /// availability_store: DummySubsystem, /// network_bridge: DummySubsystem, + /// chain_api: DummySubsystem, /// }; /// let (overseer, _handler) = Overseer::new( /// vec![], @@ -519,9 +524,9 @@ where /// # /// # }); } /// ``` - pub fn new( + pub fn new( leaves: impl IntoIterator, - all_subsystems: AllSubsystems, + all_subsystems: AllSubsystems, mut s: S, ) -> SubsystemResult<(Self, OverseerHandler)> where @@ -537,6 +542,7 @@ where RA: Subsystem> + Send, AS: Subsystem> + Send, NB: Subsystem> + Send, + CA: Subsystem> + Send, { let (events_tx, events_rx) = mpsc::channel(CHANNEL_CAPACITY); @@ -631,6 +637,13 @@ where all_subsystems.network_bridge, )?; + let chain_api_subsystem = spawn( + &mut s, + &mut running_subsystems, + &mut running_subsystems_rx, + all_subsystems.chain_api, + )?; + let active_leaves = HashSet::new(); let leaves = leaves @@ -651,6 +664,7 @@ where runtime_api_subsystem, availability_store_subsystem, network_bridge_subsystem, + chain_api_subsystem, s, running_subsystems, running_subsystems_rx, @@ -708,6 +722,10 @@ where let _ = s.tx.send(FromOverseer::Signal(OverseerSignal::Conclude)).await; } + if let Some(ref mut s) = self.chain_api_subsystem.instance { + let _ = s.tx.send(FromOverseer::Signal(OverseerSignal::Conclude)).await; + } + let mut stop_delay = Delay::new(Duration::from_secs(STOP_DELAY)).fuse(); loop { @@ -855,6 +873,10 @@ where } if let Some(ref mut s) = self.network_bridge_subsystem.instance { + s.tx.send(FromOverseer::Signal(signal.clone())).await?; + } + + if let Some(ref mut s) = self.chain_api_subsystem.instance { s.tx.send(FromOverseer::Signal(signal)).await?; } @@ -923,6 +945,11 @@ where let _ = s.tx.send(FromOverseer::Communication { msg }).await; } } + AllMessages::ChainApi(msg) => { + if let Some(ref mut s) = self.chain_api_subsystem.instance { + let _ = s.tx.send(FromOverseer::Communication { msg }).await; + } + } } } @@ -1084,6 +1111,7 @@ mod tests { runtime_api: DummySubsystem, availability_store: DummySubsystem, network_bridge: DummySubsystem, + chain_api: DummySubsystem, }; let (overseer, mut handler) = Overseer::new( vec![], @@ -1147,6 +1175,7 @@ mod tests { runtime_api: DummySubsystem, availability_store: DummySubsystem, network_bridge: DummySubsystem, + chain_api: DummySubsystem, }; let (overseer, _handle) = Overseer::new( vec![], @@ -1263,6 +1292,7 @@ mod tests { runtime_api: DummySubsystem, availability_store: DummySubsystem, network_bridge: DummySubsystem, + chain_api: DummySubsystem, }; let (overseer, mut handler) = Overseer::new( vec![first_block], @@ -1364,6 +1394,7 @@ mod tests { runtime_api: DummySubsystem, availability_store: DummySubsystem, network_bridge: DummySubsystem, + chain_api: DummySubsystem, }; // start with two forks of different height. let (overseer, mut handler) = Overseer::new( diff --git a/node/service/src/lib.rs b/node/service/src/lib.rs index 01c70f5785..e7e75369fc 100644 --- a/node/service/src/lib.rs +++ b/node/service/src/lib.rs @@ -287,6 +287,7 @@ fn real_overseer( runtime_api: DummySubsystem, availability_store: DummySubsystem, network_bridge: DummySubsystem, + chain_api: DummySubsystem, }; Overseer::new( leaves, diff --git a/node/subsystem/src/messages.rs b/node/subsystem/src/messages.rs index b508c34a8a..e3a4a419a5 100644 --- a/node/subsystem/src/messages.rs +++ b/node/subsystem/src/messages.rs @@ -310,7 +310,7 @@ pub enum ChainApiMessage { hash: Hash, /// The number of ancestors to request. k: usize, - /// The response channel. + /// The response channel. response_channel: ChainApiResponseChannel>, }, } @@ -488,6 +488,8 @@ pub enum AllMessages { CandidateBacking(CandidateBackingMessage), /// Message for the candidate selection subsystem. CandidateSelection(CandidateSelectionMessage), + /// Message for the Chain API subsystem. + ChainApi(ChainApiMessage), /// Message for the statement distribution subsystem. StatementDistribution(StatementDistributionMessage), /// Message for the availability distribution subsystem. -- GitLab From f5c842540887ebee56e5cf71b249287c1e2b1219 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Tue, 4 Aug 2020 14:53:47 +0200 Subject: [PATCH 141/192] Rewrite client handling (#1531) * Rewrite client handling We are supporting muliple polkadot-like chains and all have different client types. This pr reworks the client handling by having all of them in one enum combined. Besides that, there is added a special trait `ExecuteWithClient` to use the internal client. * Apply suggestions from code review Co-authored-by: Robert Habermeier * Up the versions * Fix Cargo.lock * Fix merge conflict * ...................... * ....v2 * yep * I'm dumb... * Browser lol Co-authored-by: Robert Habermeier --- Cargo.lock | 4 +- cli/src/browser.rs | 3 +- cli/src/command.rs | 8 +- collator/src/lib.rs | 385 ++++++++---------- node/test-service/src/lib.rs | 8 +- .../adder/collator/src/main.rs | 11 +- runtime/rococo-v1/Cargo.toml | 2 +- runtime/rococo/Cargo.toml | 2 +- service/src/client.rs | 125 +++++- service/src/lib.rs | 207 +++------- 10 files changed, 369 insertions(+), 386 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index bf31c0490d..e3d65f2922 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5997,7 +5997,7 @@ dependencies = [ [[package]] name = "rococo-runtime" -version = "0.8.14" +version = "0.8.22" dependencies = [ "bitvec", "frame-benchmarking", @@ -6073,7 +6073,7 @@ dependencies = [ [[package]] name = "rococo-v1-runtime" -version = "0.8.19" +version = "0.8.22" dependencies = [ "frame-executive", "frame-support", diff --git a/cli/src/browser.rs b/cli/src/browser.rs index 17ef9ae802..d3523e92a6 100644 --- a/cli/src/browser.rs +++ b/cli/src/browser.rs @@ -46,8 +46,7 @@ async fn start_inner(chain_spec: String, log_level: String) -> Result Result<()> { runner.run_node_until_exit(|config| { let role = config.role.clone(); - let builder = service::NodeBuilder::new(config); match role { - Role::Light => builder.build_light().map(|(task_manager, _)| task_manager), - _ => builder.build_full( + Role::Light => service::build_light(config).map(|(task_manager, _)| task_manager), + _ => service::build_full( + config, None, None, authority_discovery_disabled, 6000, grandpa_pause, - ), + ).map(|r| r.0), } }) }, diff --git a/collator/src/lib.rs b/collator/src/lib.rs index 3eee4aba1e..cfe4000513 100644 --- a/collator/src/lib.rs +++ b/collator/src/lib.rs @@ -51,8 +51,6 @@ use std::time::Duration; use std::pin::Pin; use futures::{future, Future, Stream, FutureExt, StreamExt}; -use sc_client_api::{StateBackend, BlockchainEvents}; -use sp_blockchain::HeaderBackend; use sp_core::Pair; use polkadot_primitives::v0::{ BlockId, Hash, Block, DownwardMessage, @@ -60,27 +58,24 @@ use polkadot_primitives::v0::{ PoVBlock, ValidatorId, CollatorPair, LocalValidationData, GlobalValidationData, Collation, CollationInfo, collator_signature_payload, }; -use polkadot_cli::{ - ProvideRuntimeApi, ParachainHost, IdentifyVariant, - service::{self, Role} -}; +use polkadot_cli::service::{self, Role}; pub use polkadot_cli::service::Configuration; pub use polkadot_cli::Cli; pub use polkadot_validation::SignedStatement; pub use polkadot_primitives::v0::CollatorId; pub use sc_network::PeerId; -pub use service::RuntimeApiCollection; +pub use service::{RuntimeApiCollection, Client}; pub use sc_cli::SubstrateCli; -use sp_api::{ConstructRuntimeApi, ApiExt, HashFor}; #[cfg(not(feature = "service-rewr"))] -use polkadot_service::{FullNodeHandles, PolkadotClient}; +use polkadot_service::{FullNodeHandles, AbstractClient}; #[cfg(feature = "service-rewr")] use polkadot_service_new::{ self as polkadot_service, - Error as ServiceError, FullNodeHandles, PolkadotClient, + Error as ServiceError, FullNodeHandles, AbstractClient, }; use sc_service::SpawnTaskHandle; use sp_core::traits::SpawnNamed; +use sp_runtime::traits::BlakeTwo256; const COLLATION_TIMEOUT: Duration = Duration::from_secs(30); @@ -121,16 +116,13 @@ pub trait BuildParachainContext { type ParachainContext: self::ParachainContext; /// Build the `ParachainContext`. - fn build( + fn build( self, - client: Arc, + client: polkadot_service::Client, spawner: SP, network: impl Network + Clone + 'static, ) -> Result where - Client: ProvideRuntimeApi + HeaderBackend + BlockchainEvents + Send + Sync + 'static, - Client::Api: RuntimeApiCollection, - >::StateBackend: StateBackend>, SP: SpawnNamed + Clone + Send + Sync + 'static; } @@ -202,171 +194,179 @@ pub async fn collate

( } #[cfg(feature = "service-rewr")] -fn build_collator_service( - _spawner: SP, - _handles: FullNodeHandles, - _client: Arc, - _para_id: ParaId, - _key: Arc, - _build_parachain_context: P, -) -> Result, polkadot_service::Error> +fn build_collator_service

( + spawner: SpawnTaskHandle, + handles: FullNodeHandles, + client: polkadot_service::Client, + para_id: ParaId, + key: Arc, + build_parachain_context: P, +) -> Result + Send + 'static>>, polkadot_service::Error> where - C: PolkadotClient< - service::Block, - service::TFullBackend, - R - > + 'static, - R: ConstructRuntimeApi + Sync + Send, - >::RuntimeApi: - sp_api::ApiExt< - service::Block, - StateBackend = as service::Backend>::State, - > - + RuntimeApiCollection< - StateBackend = as service::Backend>::State, - > - + Sync + Send, P: BuildParachainContext, P::ParachainContext: Send + 'static, ::ProduceCandidate: Send, - SP: SpawnNamed + Clone + Send + Sync + 'static, { Err("Collator is not functional with the new service yet".into()) } - -#[cfg(not(feature = "service-rewr"))] -fn build_collator_service( - spawner: SpawnTaskHandle, - handles: FullNodeHandles, - client: Arc, +struct BuildCollationWork

{ + handles: polkadot_service::FullNodeHandles, para_id: ParaId, key: Arc, build_parachain_context: P, -) -> Result + Send + 'static, polkadot_service::Error> + spawner: SpawnTaskHandle, + client: polkadot_service::Client, +} + +impl

polkadot_service::ExecuteWithClient for BuildCollationWork

where - C: PolkadotClient< - service::Block, - service::TFullBackend, - R - > + 'static, - R: ConstructRuntimeApi + Sync + Send, - >::RuntimeApi: - sp_api::ApiExt< - service::Block, - StateBackend = as service::Backend>::State, - > - + RuntimeApiCollection< - StateBackend = as service::Backend>::State, - > - + Sync + Send, P: BuildParachainContext, P::ParachainContext: Send + 'static, ::ProduceCandidate: Send, { - let polkadot_network = handles.polkadot_network - .ok_or_else(|| "Collator cannot run when Polkadot-specific networking has not been started")?; - - // We don't require this here, but we need to make sure that the validation service is started. - // This service makes sure the collator is joining the correct gossip topics and receives the appropiate - // messages. - handles.validation_service_handle - .ok_or_else(|| "Collator cannot run when validation networking has not been started")?; - - let parachain_context = match build_parachain_context.build( - client.clone(), - spawner.clone(), - polkadot_network.clone(), - ) { - Ok(ctx) => ctx, - Err(()) => { - return Err("Could not build the parachain context!".into()) - } - }; - - let work = async move { - let mut notification_stream = client.import_notification_stream(); - - while let Some(notification) = notification_stream.next().await { - macro_rules! try_fr { - ($e:expr) => { - match $e { - Ok(x) => x, - Err(e) => return future::Either::Left(future::err(Error::Polkadot( - format!("{:?}", e) - ))), + type Output = Result + Send + 'static>>, polkadot_service::Error>; + + fn execute_with_client(self, client: Arc) -> Self::Output + where>::StateBackend: sp_api::StateBackend, + Backend: sc_client_api::Backend, + Backend::State: sp_api::StateBackend, + Api: RuntimeApiCollection, + Client: AbstractClient + 'static + { + let polkadot_network = self.handles + .polkadot_network + .ok_or_else(|| "Collator cannot run when Polkadot-specific networking has not been started")?; + + // We don't require this here, but we need to make sure that the validation service is started. + // This service makes sure the collator is joining the correct gossip topics and receives the appropiate + // messages. + self.handles.validation_service_handle + .ok_or_else(|| "Collator cannot run when validation networking has not been started")?; + + let parachain_context = match self.build_parachain_context.build( + self.client, + self.spawner.clone(), + polkadot_network.clone(), + ) { + Ok(ctx) => ctx, + Err(()) => { + return Err("Could not build the parachain context!".into()) + } + }; + + let key = self.key; + let para_id = self.para_id; + let spawner = self.spawner; + + let res = async move { + let mut notification_stream = client.import_notification_stream(); + + while let Some(notification) = notification_stream.next().await { + macro_rules! try_fr { + ($e:expr) => { + match $e { + Ok(x) => x, + Err(e) => return future::Either::Left(future::err(Error::Polkadot( + format!("{:?}", e) + ))), + } } } - } - let relay_parent = notification.hash; - let id = BlockId::hash(relay_parent); - - let network = polkadot_network.clone(); - let client = client.clone(); - let key = key.clone(); - let parachain_context = parachain_context.clone(); - - let work = future::lazy(move |_| { - let api = client.runtime_api(); - let global_validation = try_fr!(api.global_validation_data(&id)); - let local_validation = match try_fr!(api.local_validation_data(&id, para_id)) { - Some(local_validation) => local_validation, - None => return future::Either::Left(future::ok(())), - }; - let downward_messages = try_fr!(api.downward_messages(&id, para_id)); - - let validators = try_fr!(api.validators(&id)); - - let targets = compute_targets( - para_id, - validators.as_slice(), - try_fr!(api.duty_roster(&id)), - ); + let relay_parent = notification.hash; + let id = BlockId::hash(relay_parent); + + let network = polkadot_network.clone(); + let client = client.clone(); + let key = key.clone(); + let parachain_context = parachain_context.clone(); + + let work = future::lazy(move |_| { + let api = client.runtime_api(); + let global_validation = try_fr!(api.global_validation_data(&id)); + let local_validation = match try_fr!(api.local_validation_data(&id, para_id)) { + Some(local_validation) => local_validation, + None => return future::Either::Left(future::ok(())), + }; + let downward_messages = try_fr!(api.downward_messages(&id, para_id)); + + let validators = try_fr!(api.validators(&id)); + + let targets = compute_targets( + para_id, + validators.as_slice(), + try_fr!(api.duty_roster(&id)), + ); + + let collation_work = collate( + relay_parent, + para_id, + global_validation, + local_validation, + downward_messages, + parachain_context, + key, + ).map(move |collation| { + match collation { + Some(collation) => network.distribute_collation(targets, collation), + None => log::trace!("Skipping collation as `collate` returned `None`"), + } - let collation_work = collate( - relay_parent, - para_id, - global_validation, - local_validation, - downward_messages, - parachain_context, - key, - ).map(move |collation| { - match collation { - Some(collation) => network.distribute_collation(targets, collation), - None => log::trace!("Skipping collation as `collate` returned `None`"), - } + Ok(()) + }); - Ok(()) + future::Either::Right(collation_work) }); - future::Either::Right(collation_work) - }); - - let deadlined = future::select( - work.then(|f| f).boxed(), - futures_timer::Delay::new(COLLATION_TIMEOUT) - ); + let deadlined = future::select( + work.then(|f| f).boxed(), + futures_timer::Delay::new(COLLATION_TIMEOUT) + ); - let silenced = deadlined - .map(|either| { - match either { - future::Either::Right(_) => log::warn!("Collation failure: timeout"), - future::Either::Left((Err(e), _)) => { - log::error!("Collation failed: {:?}", e) + let silenced = deadlined + .map(|either| { + match either { + future::Either::Right(_) => log::warn!("Collation failure: timeout"), + future::Either::Left((Err(e), _)) => { + log::error!("Collation failed: {:?}", e) + } + future::Either::Left((Ok(()), _)) => {}, } - future::Either::Left((Ok(()), _)) => {}, - } - }); + }); - let future = silenced.map(drop); + let future = silenced.map(drop); - spawner.spawn("collation-work", future); - } - }.boxed(); + spawner.spawn("collation-work", future); + } + }; - Ok(work) + Ok(res.boxed()) + } +} + +#[cfg(not(feature = "service-rewr"))] +fn build_collator_service

( + spawner: SpawnTaskHandle, + handles: FullNodeHandles, + client: polkadot_service::Client, + para_id: ParaId, + key: Arc, + build_parachain_context: P, +) -> Result + Send + 'static>>, polkadot_service::Error> + where + P: BuildParachainContext, + P::ParachainContext: Send + 'static, + ::ProduceCandidate: Send, +{ + client.execute_with(BuildCollationWork { + handles, + para_id, + key, + build_parachain_context, + spawner, + client: client.clone(), + }) } /// Async function that will run the collator node with the given `RelayChainContext` and `ParachainContext` @@ -391,64 +391,25 @@ where .into()); } - if config.chain_spec.is_kusama() { - let (task_manager, client, handlers) = service::kusama_new_full( - config, - Some((key.public(), para_id)), - None, - false, - 6000, - None, - )?; - let spawn_handle = task_manager.spawn_handle(); - let future = build_collator_service( - spawn_handle, - handlers, - client, - para_id, - key, - build_parachain_context - )?; - Ok((future.boxed(), task_manager)) - } else if config.chain_spec.is_westend() { - let (task_manager, client, handlers) = service::westend_new_full( - config, - Some((key.public(), para_id)), - None, - false, - 6000, - None, - )?; - let spawn_handle = task_manager.spawn_handle(); - let future = build_collator_service( - spawn_handle, - handlers, - client, - para_id, - key, - build_parachain_context - )?; - Ok((future.boxed(), task_manager)) - } else { - let (task_manager, client, handles) = service::polkadot_new_full( - config, - Some((key.public(), para_id)), - None, - false, - 6000, - None, - )?; - let spawn_handle = task_manager.spawn_handle(); - let future = build_collator_service( - spawn_handle, - handles, - client, - para_id, - key, - build_parachain_context - )?; - Ok((future.boxed(), task_manager)) - } + let (task_manager, client, handlers) = polkadot_service::build_full( + config, + Some((key.public(), para_id)), + None, + false, + 6000, + None, + )?; + + let future = build_collator_service( + task_manager.spawn_handle(), + handlers, + client, + para_id, + key, + build_parachain_context + )?; + + Ok((future, task_manager)) } #[cfg(not(feature = "service-rewr"))] @@ -492,9 +453,9 @@ mod tests { impl BuildParachainContext for BuildDummyParachainContext { type ParachainContext = DummyParachainContext; - fn build( + fn build( self, - _: Arc, + _: polkadot_service::Client, _: SP, _: impl Network + Clone + 'static, ) -> Result { diff --git a/node/test-service/src/lib.rs b/node/test-service/src/lib.rs index e45b931464..bc210c2384 100644 --- a/node/test-service/src/lib.rs +++ b/node/test-service/src/lib.rs @@ -26,9 +26,7 @@ use polkadot_primitives::v0::{ Block, Hash, CollatorId, Id as ParaId, }; use polkadot_runtime_common::{parachains, registrar, BlockHashCount}; -use polkadot_service::{ - new_full, FullNodeHandles, PolkadotClient, -}; +use polkadot_service::{new_full, FullNodeHandles, AbstractClient}; use polkadot_test_runtime::{RestrictFunctionality, Runtime, SignedExtra, SignedPayload, VERSION}; use sc_chain_spec::ChainSpec; use sc_client_api::{execution_extensions::ExecutionStrategies, BlockchainEvents}; @@ -69,7 +67,7 @@ pub fn polkadot_test_new_full( ) -> Result< ( TaskManager, - Arc, polkadot_test_runtime::RuntimeApi>>, + Arc>>, FullNodeHandles, Arc>, Arc, @@ -196,7 +194,7 @@ pub fn run_test_node( boot_nodes: Vec, ) -> PolkadotTestNode< TaskManager, - impl PolkadotClient, polkadot_test_runtime::RuntimeApi>, + impl AbstractClient>, > { let config = node_config(storage_update_func, task_executor, key, boot_nodes); let multiaddr = config.network.listen_addresses[0].clone(); diff --git a/parachain/test-parachains/adder/collator/src/main.rs b/parachain/test-parachains/adder/collator/src/main.rs index 9136cc0ca9..2bddff6f86 100644 --- a/parachain/test-parachains/adder/collator/src/main.rs +++ b/parachain/test-parachains/adder/collator/src/main.rs @@ -89,8 +89,11 @@ impl ParachainContext for AdderContext { 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); + 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); ready(Some((encoded_body, encoded_head))) @@ -100,9 +103,9 @@ impl ParachainContext for AdderContext { impl BuildParachainContext for AdderContext { type ParachainContext = Self; - fn build( + fn build( self, - _: Arc, + _: collator::Client, _: SP, network: impl Network + Clone + 'static, ) -> Result { diff --git a/runtime/rococo-v1/Cargo.toml b/runtime/rococo-v1/Cargo.toml index fbd7d617fa..8a9228a6ac 100644 --- a/runtime/rococo-v1/Cargo.toml +++ b/runtime/rococo-v1/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "rococo-v1-runtime" -version = "0.8.19" +version = "0.8.22" authors = ["Parity Technologies "] edition = "2018" build = "build.rs" diff --git a/runtime/rococo/Cargo.toml b/runtime/rococo/Cargo.toml index 2c5ab8add3..5eb029fbf3 100644 --- a/runtime/rococo/Cargo.toml +++ b/runtime/rococo/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "rococo-runtime" -version = "0.8.14" +version = "0.8.22" authors = ["Parity Technologies "] edition = "2018" build = "build.rs" diff --git a/service/src/client.rs b/service/src/client.rs index 28d2bccabb..786d3b8fba 100644 --- a/service/src/client.rs +++ b/service/src/client.rs @@ -14,40 +14,137 @@ // You should have received a copy of the GNU General Public License // along with Polkadot. If not, see . -//! Polkadot Client meta trait +//! Polkadot Client abstractions. -use sp_api::{ProvideRuntimeApi, ConstructRuntimeApi, CallApiAt}; +use std::sync::Arc; +use sp_api::{ProvideRuntimeApi, CallApiAt}; use sp_blockchain::HeaderBackend; -use sp_runtime::traits::Block as BlockT; +use sp_runtime::traits::{Block as BlockT, BlakeTwo256}; use sc_client_api::{Backend as BackendT, BlockchainEvents}; +use polkadot_primitives::v0::{Block, ParachainHost, AccountId, Nonce, Balance}; -/// Polkadot client abstraction, this super trait only pulls in functionality required for -/// polkadot internal crates like polkadot-collator. -pub trait PolkadotClient: +/// A set of APIs that polkadot-like runtimes must implement. +pub trait RuntimeApiCollection: + sp_transaction_pool::runtime_api::TaggedTransactionQueue + + sp_api::ApiExt + + babe_primitives::BabeApi + + grandpa_primitives::GrandpaApi + + ParachainHost + + sp_block_builder::BlockBuilder + + system_rpc_runtime_api::AccountNonceApi + + pallet_transaction_payment_rpc_runtime_api::TransactionPaymentApi + + sp_api::Metadata + + sp_offchain::OffchainWorkerApi + + sp_session::SessionKeys + + authority_discovery_primitives::AuthorityDiscoveryApi +where + >::StateBackend: sp_api::StateBackend, +{} + +impl RuntimeApiCollection for Api +where + Api: + sp_transaction_pool::runtime_api::TaggedTransactionQueue + + sp_api::ApiExt + + babe_primitives::BabeApi + + grandpa_primitives::GrandpaApi + + ParachainHost + + sp_block_builder::BlockBuilder + + system_rpc_runtime_api::AccountNonceApi + + pallet_transaction_payment_rpc_runtime_api::TransactionPaymentApi + + sp_api::Metadata + + sp_offchain::OffchainWorkerApi + + sp_session::SessionKeys + + authority_discovery_primitives::AuthorityDiscoveryApi, + >::StateBackend: sp_api::StateBackend, +{} + +/// Trait that abstracts over all available client implementations. +/// +/// For a concrete type there exists [`Client`]. +pub trait AbstractClient: BlockchainEvents + Sized + Send + Sync - + ProvideRuntimeApi + + ProvideRuntimeApi + HeaderBackend + CallApiAt< Block, Error = sp_blockchain::Error, - StateBackend = Backend ::State + StateBackend = Backend::State > where Block: BlockT, Backend: BackendT, - Runtime: ConstructRuntimeApi + Backend::State: sp_api::StateBackend, + Self::Api: RuntimeApiCollection, {} -impl PolkadotClient for Client +impl AbstractClient for Client where Block: BlockT, - Runtime: ConstructRuntimeApi, Backend: BackendT, - Client: BlockchainEvents + ProvideRuntimeApi + HeaderBackend + Backend::State: sp_api::StateBackend, + Client: BlockchainEvents + ProvideRuntimeApi + HeaderBackend + Sized + Send + Sync + CallApiAt< Block, Error = sp_blockchain::Error, - StateBackend = Backend ::State - > + StateBackend = Backend::State + >, + Client::Api: RuntimeApiCollection, {} + +/// Execute something with the client instance. +/// +/// As there exist multiple chains inside Polkadot, like Polkadot itself, Kusama, Westend etc, +/// there can exist different kinds of client types. As these client types differ in the generics +/// that are being used, we can not easily return them from a function. For returning them from a +/// function there exists [`Client`]. However, the problem on how to use this client instance still +/// exists. This trait "solves" it in a dirty way. It requires a type to implement this trait and +/// than the [`execute_with_client`](ExecuteWithClient::execute_with_client) function can be called +/// with any possible client instance. +/// +/// In a perfect world, we could make a closure work in this way. +pub trait ExecuteWithClient { + /// The return type when calling this instance. + type Output; + + /// Execute whatever should be executed with the given client instance. + fn execute_with_client(self, client: Arc) -> Self::Output + where + >::StateBackend: sp_api::StateBackend, + Backend: sc_client_api::Backend, + Backend::State: sp_api::StateBackend, + Api: crate::RuntimeApiCollection, + Client: AbstractClient + 'static; +} + +/// A client instance of Polkadot. +/// +/// See [`ExecuteWithClient`] for more information. +#[derive(Clone)] +pub enum Client { + Polkadot(Arc>), + Westend(Arc>), + Kusama(Arc>), + Rococo(Arc>), +} + +impl Client { + /// Execute the given something with the client. + pub fn execute_with(&self, t: T) -> T::Output { + match self { + Self::Polkadot(client) => { + T::execute_with_client::<_, _, crate::FullBackend>(t, client.clone()) + }, + Self::Westend(client) => { + T::execute_with_client::<_, _, crate::FullBackend>(t, client.clone()) + }, + Self::Kusama(client) => { + T::execute_with_client::<_, _, crate::FullBackend>(t, client.clone()) + }, + Self::Rococo(client) => { + T::execute_with_client::<_, _, crate::FullBackend>(t, client.clone()) + } + } + } +} diff --git a/service/src/lib.rs b/service/src/lib.rs index 30fb4c0cff..1897e026dd 100644 --- a/service/src/lib.rs +++ b/service/src/lib.rs @@ -22,7 +22,7 @@ mod client; use std::sync::Arc; use std::time::Duration; -use polkadot_primitives::v0::{self as parachain, Hash, BlockId, AccountId, Nonce, Balance}; +use polkadot_primitives::v0::{self as parachain, Hash, BlockId}; #[cfg(feature = "full-node")] use polkadot_network::{legacy::gossip::Known, protocol as network_protocol}; use service::{error::Error as ServiceError}; @@ -52,7 +52,7 @@ pub use polkadot_runtime; pub use kusama_runtime; pub use westend_runtime; use prometheus_endpoint::Registry; -pub use self::client::PolkadotClient; +pub use self::client::*; native_executor_instance!( pub PolkadotExecutor, @@ -82,42 +82,6 @@ native_executor_instance!( frame_benchmarking::benchmarking::HostFunctions, ); -/// A set of APIs that polkadot-like runtimes must implement. -pub trait RuntimeApiCollection: - sp_transaction_pool::runtime_api::TaggedTransactionQueue - + sp_api::ApiExt - + babe_primitives::BabeApi - + grandpa_primitives::GrandpaApi - + ParachainHost - + sp_block_builder::BlockBuilder - + system_rpc_runtime_api::AccountNonceApi - + pallet_transaction_payment_rpc_runtime_api::TransactionPaymentApi - + sp_api::Metadata - + sp_offchain::OffchainWorkerApi - + sp_session::SessionKeys - + authority_discovery_primitives::AuthorityDiscoveryApi -where - >::StateBackend: sp_api::StateBackend, -{} - -impl RuntimeApiCollection for Api -where - Api: - sp_transaction_pool::runtime_api::TaggedTransactionQueue - + sp_api::ApiExt - + babe_primitives::BabeApi - + grandpa_primitives::GrandpaApi - + ParachainHost - + sp_block_builder::BlockBuilder - + system_rpc_runtime_api::AccountNonceApi - + pallet_transaction_payment_rpc_runtime_api::TransactionPaymentApi - + sp_api::Metadata - + sp_offchain::OffchainWorkerApi - + sp_session::SessionKeys - + authority_discovery_primitives::AuthorityDiscoveryApi, - >::StateBackend: sp_api::StateBackend, -{} - /// Can be called for a `Configuration` to check if it is a configuration for the `Kusama` network. pub trait IdentifyVariant { /// Returns if this is a configuration for the `Kusama` network. @@ -732,11 +696,7 @@ pub fn polkadot_new_full( ) -> Result<( TaskManager, - Arc>, + Arc>, FullNodeHandles, ), ServiceError> { @@ -764,12 +724,7 @@ pub fn kusama_new_full( grandpa_pause: Option<(u32, u32)>, ) -> Result<( TaskManager, - Arc - >, + Arc>, FullNodeHandles ), ServiceError> { @@ -798,11 +753,7 @@ pub fn westend_new_full( ) -> Result<( TaskManager, - Arc>, + Arc>, FullNodeHandles, ), ServiceError> { @@ -831,11 +782,7 @@ pub fn rococo_new_full( ) -> Result<( TaskManager, - Arc, - rococo_runtime::RuntimeApi - >>, + Arc>>, FullNodeHandles, ), ServiceError> { @@ -863,90 +810,68 @@ pub struct FullNodeHandles { pub validation_service_handle: Option, } -/// A builder for a node. -pub struct NodeBuilder { - config: Configuration, +/// Build a new light node. +pub fn build_light(config: Configuration) -> Result<(TaskManager, Arc), ServiceError> { + if config.chain_spec.is_kusama() { + new_light::(config) + } else if config.chain_spec.is_westend() { + new_light::(config) + } else if config.chain_spec.is_rococo() { + new_light::(config) + } else { + new_light::(config) + } } -impl NodeBuilder { - /// Create a new node builder. - pub fn new(config: Configuration) -> Self { - Self { +/// Build a new full node. +#[cfg(feature = "full-node")] +pub fn build_full( + config: Configuration, + collating_for: Option<(CollatorId, parachain::Id)>, + max_block_data_size: Option, + authority_discovery_disabled: bool, + slot_duration: u64, + grandpa_pause: Option<(u32, u32)>, +) -> Result<(TaskManager, Client, FullNodeHandles), ServiceError> { + if config.chain_spec.is_kusama() { + new_full::( config, - } - } - - /// Build a new light node. - pub fn build_light(self) -> Result<(TaskManager, Arc), ServiceError> { - if self.config.chain_spec.is_kusama() { - new_light::( - self.config, - ) - } else if self.config.chain_spec.is_westend() { - new_light::( - self.config, - ) - } else if self.config.chain_spec.is_rococo() { - new_light::( - self.config, - ) - } else { - new_light::( - self.config, - ) - } - } - - /// Build a new full node. - #[cfg(feature = "full-node")] - pub fn build_full( - self, - collating_for: Option<(CollatorId, parachain::Id)>, - max_block_data_size: Option, - authority_discovery_disabled: bool, - slot_duration: u64, - grandpa_pause: Option<(u32, u32)>, - ) -> Result { - if self.config.chain_spec.is_kusama() { - new_full::( - self.config, - collating_for, - max_block_data_size, - authority_discovery_disabled, - slot_duration, - grandpa_pause, - false, - ).map(|(task_manager, _, _, _, _)| task_manager) - } else if self.config.chain_spec.is_westend() { - new_full::( - self.config, - collating_for, - max_block_data_size, - authority_discovery_disabled, - slot_duration, - grandpa_pause, - false, - ).map(|(task_manager, _, _, _, _)| task_manager) - } else if self.config.chain_spec.is_rococo() { - new_full::( - self.config, - collating_for, - max_block_data_size, - authority_discovery_disabled, - slot_duration, - grandpa_pause, - false, - ).map(|(task_manager, _, _, _, _)| task_manager) - } else { - new_full::( - self.config, - collating_for, - max_block_data_size, - authority_discovery_disabled, - slot_duration, - grandpa_pause, - false, - ).map(|(task_manager, _, _, _, _)| task_manager) - } + collating_for, + max_block_data_size, + authority_discovery_disabled, + slot_duration, + grandpa_pause, + false, + ).map(|(task_manager, client, handles, _, _)| (task_manager, Client::Kusama(client), handles)) + } else if config.chain_spec.is_westend() { + new_full::( + config, + collating_for, + max_block_data_size, + authority_discovery_disabled, + slot_duration, + grandpa_pause, + false, + ).map(|(task_manager, client, handles, _, _)| (task_manager, Client::Westend(client), handles)) + } else if config.chain_spec.is_rococo() { + new_full::( + config, + collating_for, + max_block_data_size, + authority_discovery_disabled, + slot_duration, + grandpa_pause, + false, + ).map(|(task_manager, client, handles, _, _)| (task_manager, Client::Rococo(client), handles)) + } else { + new_full::( + config, + collating_for, + max_block_data_size, + authority_discovery_disabled, + slot_duration, + grandpa_pause, + false, + ).map(|(task_manager, client, handles, _, _)| (task_manager, Client::Polkadot(client), handles)) } } -- GitLab From 19b88fffbc93b8c47233af4e5c27d1bb95e94e76 Mon Sep 17 00:00:00 2001 From: Shawn Tabrizi Date: Tue, 4 Aug 2020 15:23:33 +0200 Subject: [PATCH 142/192] Unalias Substrate Imports (#1530) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * cargo.toml updates * session and system * more * more * more * more * more * fix * compiles * fix tests * fix more tests * fix mock * fix deleted space * Update validation/Cargo.toml Co-authored-by: Bastian Köcher * Update Cargo.lock * update rococo * remove unused warning * update add benchmarks * rename weight file * forgot a file * Update chain_spec.rs * Revert "remove unused warning" This reverts commit 4227cd0d1525286fb466dccb817564c9b37f8645. * fix merge Co-authored-by: Bastian Köcher --- Cargo.lock | 2 - node/service/Cargo.toml | 4 +- node/service/src/chain_spec.rs | 166 ++++----- node/service/src/lib.rs | 4 +- node/test-service/src/chain_spec.rs | 20 +- runtime/common/Cargo.toml | 42 +-- runtime/common/src/attestations.rs | 10 +- runtime/common/src/claims.rs | 53 ++- runtime/common/src/crowdfund.rs | 82 ++--- runtime/common/src/impls.rs | 28 +- runtime/common/src/lib.rs | 18 +- runtime/common/src/parachains.rs | 174 +++++----- runtime/common/src/paras_sudo_wrapper.rs | 4 +- runtime/common/src/purchase.rs | 42 +-- runtime/common/src/registrar.rs | 104 +++--- runtime/common/src/slots.rs | 48 +-- runtime/kusama/Cargo.toml | 160 ++++----- runtime/kusama/src/constants.rs | 2 +- runtime/kusama/src/lib.rs | 316 ++++++++--------- runtime/kusama/src/weights/mod.rs | 2 +- .../{balances.rs => pallet_balances.rs} | 2 +- runtime/parachains/Cargo.toml | 38 +-- runtime/parachains/src/configuration.rs | 8 +- runtime/parachains/src/inclusion.rs | 16 +- runtime/parachains/src/inclusion_inherent.rs | 6 +- runtime/parachains/src/initializer.rs | 10 +- runtime/parachains/src/mock.rs | 12 +- runtime/parachains/src/paras.rs | 12 +- runtime/parachains/src/runtime_api_impl/v1.rs | 4 +- runtime/parachains/src/scheduler.rs | 18 +- runtime/polkadot/Cargo.toml | 146 ++++---- runtime/polkadot/src/constants.rs | 2 +- runtime/polkadot/src/lib.rs | 318 +++++++++--------- runtime/polkadot/src/weights/mod.rs | 2 +- .../{balances.rs => pallet_balances.rs} | 2 +- runtime/polkadot/tests/weights.rs | 22 +- runtime/rococo-v1/Cargo.toml | 68 ++-- runtime/rococo-v1/src/constants.rs | 2 +- runtime/rococo-v1/src/lib.rs | 142 ++++---- runtime/rococo/Cargo.toml | 167 +++++---- runtime/rococo/src/constants.rs | 2 +- runtime/rococo/src/lib.rs | 232 ++++++------- runtime/test-runtime/Cargo.toml | 78 ++--- runtime/test-runtime/src/constants.rs | 2 +- runtime/test-runtime/src/lib.rs | 144 ++++---- runtime/westend/Cargo.toml | 164 ++++----- runtime/westend/src/constants.rs | 2 +- runtime/westend/src/lib.rs | 249 +++++++------- runtime/westend/src/weights/mod.rs | 2 +- .../{balances.rs => pallet_balances.rs} | 2 +- service/Cargo.toml | 4 +- service/src/chain_spec.rs | 206 ++++++------ service/src/client.rs | 4 +- validation/Cargo.toml | 1 - 54 files changed, 1680 insertions(+), 1690 deletions(-) rename runtime/kusama/src/weights/{balances.rs => pallet_balances.rs} (97%) rename runtime/polkadot/src/weights/{balances.rs => pallet_balances.rs} (97%) rename runtime/westend/src/weights/{balances.rs => pallet_balances.rs} (97%) diff --git a/Cargo.lock b/Cargo.lock index e3d65f2922..b3db7a17f4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5304,7 +5304,6 @@ dependencies = [ "futures 0.3.5", "futures-timer 2.0.2", "log 0.4.8", - "pallet-babe", "parity-scale-codec", "parking_lot 0.9.0", "polkadot-availability-store", @@ -6032,7 +6031,6 @@ dependencies = [ "pallet-scheduler", "pallet-session", "pallet-session-benchmarking", - "pallet-society", "pallet-staking", "pallet-staking-reward-curve", "pallet-sudo", diff --git a/node/service/Cargo.toml b/node/service/Cargo.toml index 0c32e5a971..48b3ceba36 100644 --- a/node/service/Cargo.toml +++ b/node/service/Cargo.toml @@ -45,14 +45,14 @@ sp-transaction-pool = { git = "https://github.com/paritytech/substrate", branch sc-keystore = { git = "https://github.com/paritytech/substrate", branch = "master" } pallet-babe = { git = "https://github.com/paritytech/substrate", branch = "master" } pallet-staking = { git = "https://github.com/paritytech/substrate", branch = "master" } -im-online = { package = "pallet-im-online", git = "https://github.com/paritytech/substrate", branch = "master" } +pallet-im-online = { git = "https://github.com/paritytech/substrate", branch = "master" } authority-discovery = { package = "sc-authority-discovery", git = "https://github.com/paritytech/substrate", branch = "master" } authority-discovery-primitives = { package = "sp-authority-discovery", git = "https://github.com/paritytech/substrate", branch = "master" } babe = { package = "sc-consensus-babe", git = "https://github.com/paritytech/substrate", branch = "master" } babe-primitives = { package = "sp-consensus-babe", git = "https://github.com/paritytech/substrate", branch = "master" } sp-block-builder = { git = "https://github.com/paritytech/substrate", branch = "master" } pallet-transaction-payment-rpc-runtime-api = { git = "https://github.com/paritytech/substrate", branch = "master" } -system_rpc_runtime_api = { package = "frame-system-rpc-runtime-api", git = "https://github.com/paritytech/substrate", branch = "master" } +frame-system-rpc-runtime-api = { git = "https://github.com/paritytech/substrate", branch = "master" } codec = { package = "parity-scale-codec", version = "1.3.4" } sp-session = { git = "https://github.com/paritytech/substrate", branch = "master" } sp-offchain = { package = "sp-offchain", git = "https://github.com/paritytech/substrate", branch = "master" } diff --git a/node/service/src/chain_spec.rs b/node/service/src/chain_spec.rs index 401337c218..b90207c53b 100644 --- a/node/service/src/chain_spec.rs +++ b/node/service/src/chain_spec.rs @@ -31,7 +31,7 @@ use telemetry::TelemetryEndpoints; use hex_literal::hex; use babe_primitives::AuthorityId as BabeId; use grandpa::AuthorityId as GrandpaId; -use im_online::sr25519::{AuthorityId as ImOnlineId}; +use pallet_im_online::sr25519::{AuthorityId as ImOnlineId}; use authority_discovery_primitives::AuthorityId as AuthorityDiscoveryId; use pallet_staking::Forcing; @@ -131,27 +131,27 @@ fn polkadot_staging_testnet_config_genesis(wasm_binary: &[u8]) -> polkadot::Gene const STASH: u128 = 100 * DOTS; polkadot::GenesisConfig { - system: Some(polkadot::SystemConfig { + frame_system: Some(polkadot::SystemConfig { code: wasm_binary.to_vec(), changes_trie_config: Default::default(), }), - balances: Some(polkadot::BalancesConfig { + pallet_balances: Some(polkadot::BalancesConfig { balances: endowed_accounts.iter() .map(|k: &AccountId| (k.clone(), ENDOWMENT)) .chain(initial_authorities.iter().map(|x| (x.0.clone(), STASH))) .collect(), }), - indices: Some(polkadot::IndicesConfig { + pallet_indices: Some(polkadot::IndicesConfig { indices: vec![], }), - session: Some(polkadot::SessionConfig { + pallet_session: Some(polkadot::SessionConfig { keys: initial_authorities.iter().map(|x| ( x.0.clone(), x.0.clone(), polkadot_session_keys(x.2.clone(), x.3.clone(), x.4.clone(), x.5.clone(), x.6.clone()), )).collect::>(), }), - staking: Some(polkadot::StakingConfig { + pallet_staking: Some(polkadot::StakingConfig { validator_count: 50, minimum_validator_count: 4, stakers: initial_authorities @@ -163,21 +163,21 @@ fn polkadot_staging_testnet_config_genesis(wasm_binary: &[u8]) -> polkadot::Gene slash_reward_fraction: Perbill::from_percent(10), .. Default::default() }), - elections_phragmen: Some(Default::default()), - democracy: Some(Default::default()), - collective_Instance1: Some(polkadot::CouncilConfig { + pallet_elections_phragmen: Some(Default::default()), + pallet_democracy: Some(Default::default()), + pallet_collective_Instance1: Some(polkadot::CouncilConfig { members: vec![], phantom: Default::default(), }), - collective_Instance2: Some(polkadot::TechnicalCommitteeConfig { + pallet_collective_Instance2: Some(polkadot::TechnicalCommitteeConfig { members: vec![], phantom: Default::default(), }), - membership_Instance1: Some(Default::default()), - babe: Some(Default::default()), - grandpa: Some(Default::default()), - im_online: Some(Default::default()), - authority_discovery: Some(polkadot::AuthorityDiscoveryConfig { + pallet_membership_Instance1: Some(Default::default()), + pallet_babe: Some(Default::default()), + pallet_grandpa: Some(Default::default()), + pallet_im_online: Some(Default::default()), + pallet_authority_discovery: Some(polkadot::AuthorityDiscoveryConfig { keys: vec![], }), parachains: Some(polkadot::ParachainsConfig { @@ -191,7 +191,7 @@ fn polkadot_staging_testnet_config_genesis(wasm_binary: &[u8]) -> polkadot::Gene claims: vec![], vesting: vec![], }), - vesting: Some(polkadot::VestingConfig { + pallet_vesting: Some(polkadot::VestingConfig { vesting: vec![], }), } @@ -283,27 +283,27 @@ fn westend_staging_testnet_config_genesis(wasm_binary: &[u8]) -> westend::Genesi const STASH: u128 = 100 * WND; westend::GenesisConfig { - system: Some(westend::SystemConfig { + frame_system: Some(westend::SystemConfig { code: wasm_binary.to_vec(), changes_trie_config: Default::default(), }), - balances: Some(westend::BalancesConfig { + pallet_balances: Some(westend::BalancesConfig { balances: endowed_accounts.iter() .map(|k: &AccountId| (k.clone(), ENDOWMENT)) .chain(initial_authorities.iter().map(|x| (x.0.clone(), STASH))) .collect(), }), - indices: Some(westend::IndicesConfig { + pallet_indices: Some(westend::IndicesConfig { indices: vec![], }), - session: Some(westend::SessionConfig { + pallet_session: Some(westend::SessionConfig { keys: initial_authorities.iter().map(|x| ( x.0.clone(), x.0.clone(), westend_session_keys(x.2.clone(), x.3.clone(), x.4.clone(), x.5.clone(), x.6.clone()), )).collect::>(), }), - staking: Some(westend::StakingConfig { + pallet_staking: Some(westend::StakingConfig { validator_count: 50, minimum_validator_count: 4, stakers: initial_authorities @@ -315,10 +315,10 @@ fn westend_staging_testnet_config_genesis(wasm_binary: &[u8]) -> westend::Genesi slash_reward_fraction: Perbill::from_percent(10), .. Default::default() }), - babe: Some(Default::default()), - grandpa: Some(Default::default()), - im_online: Some(Default::default()), - authority_discovery: Some(westend::AuthorityDiscoveryConfig { + pallet_babe: Some(Default::default()), + pallet_grandpa: Some(Default::default()), + pallet_im_online: Some(Default::default()), + pallet_authority_discovery: Some(westend::AuthorityDiscoveryConfig { keys: vec![], }), parachains: Some(westend::ParachainsConfig { @@ -328,10 +328,10 @@ fn westend_staging_testnet_config_genesis(wasm_binary: &[u8]) -> westend::Genesi parachains: vec![], _phdata: Default::default(), }), - vesting: Some(westend::VestingConfig { + pallet_vesting: Some(westend::VestingConfig { vesting: vec![], }), - sudo: Some(westend::SudoConfig { + pallet_sudo: Some(westend::SudoConfig { key: endowed_accounts[0].clone(), }), } @@ -423,27 +423,27 @@ fn kusama_staging_testnet_config_genesis(wasm_binary: &[u8]) -> kusama::GenesisC const STASH: u128 = 100 * KSM; kusama::GenesisConfig { - system: Some(kusama::SystemConfig { + frame_system: Some(kusama::SystemConfig { code: wasm_binary.to_vec(), changes_trie_config: Default::default(), }), - balances: Some(kusama::BalancesConfig { + pallet_balances: Some(kusama::BalancesConfig { balances: endowed_accounts.iter() .map(|k: &AccountId| (k.clone(), ENDOWMENT)) .chain(initial_authorities.iter().map(|x| (x.0.clone(), STASH))) .collect(), }), - indices: Some(kusama::IndicesConfig { + pallet_indices: Some(kusama::IndicesConfig { indices: vec![], }), - session: Some(kusama::SessionConfig { + pallet_session: Some(kusama::SessionConfig { keys: initial_authorities.iter().map(|x| ( x.0.clone(), x.0.clone(), kusama_session_keys(x.2.clone(), x.3.clone(), x.4.clone(), x.5.clone(), x.6.clone()), )).collect::>(), }), - staking: Some(kusama::StakingConfig { + pallet_staking: Some(kusama::StakingConfig { validator_count: 50, minimum_validator_count: 4, stakers: initial_authorities @@ -455,21 +455,21 @@ fn kusama_staging_testnet_config_genesis(wasm_binary: &[u8]) -> kusama::GenesisC slash_reward_fraction: Perbill::from_percent(10), .. Default::default() }), - elections_phragmen: Some(Default::default()), - democracy: Some(Default::default()), - collective_Instance1: Some(kusama::CouncilConfig { + pallet_elections_phragmen: Some(Default::default()), + pallet_democracy: Some(Default::default()), + pallet_collective_Instance1: Some(kusama::CouncilConfig { members: vec![], phantom: Default::default(), }), - collective_Instance2: Some(kusama::TechnicalCommitteeConfig { + pallet_collective_Instance2: Some(kusama::TechnicalCommitteeConfig { members: vec![], phantom: Default::default(), }), - membership_Instance1: Some(Default::default()), - babe: Some(Default::default()), - grandpa: Some(Default::default()), - im_online: Some(Default::default()), - authority_discovery: Some(kusama::AuthorityDiscoveryConfig { + pallet_membership_Instance1: Some(Default::default()), + pallet_babe: Some(Default::default()), + pallet_grandpa: Some(Default::default()), + pallet_im_online: Some(Default::default()), + pallet_authority_discovery: Some(kusama::AuthorityDiscoveryConfig { keys: vec![], }), parachains: Some(kusama::ParachainsConfig { @@ -483,7 +483,7 @@ fn kusama_staging_testnet_config_genesis(wasm_binary: &[u8]) -> kusama::GenesisC claims: vec![], vesting: vec![], }), - vesting: Some(kusama::VestingConfig { + pallet_vesting: Some(kusama::VestingConfig { vesting: vec![], }), } @@ -612,24 +612,24 @@ pub fn polkadot_testnet_genesis( const STASH: u128 = 100 * DOTS; polkadot::GenesisConfig { - system: Some(polkadot::SystemConfig { + frame_system: Some(polkadot::SystemConfig { code: wasm_binary.to_vec(), changes_trie_config: Default::default(), }), - indices: Some(polkadot::IndicesConfig { + pallet_indices: Some(polkadot::IndicesConfig { indices: vec![], }), - balances: Some(polkadot::BalancesConfig { + pallet_balances: Some(polkadot::BalancesConfig { balances: endowed_accounts.iter().map(|k| (k.clone(), ENDOWMENT)).collect(), }), - session: Some(polkadot::SessionConfig { + pallet_session: Some(polkadot::SessionConfig { keys: initial_authorities.iter().map(|x| ( x.0.clone(), x.0.clone(), polkadot_session_keys(x.2.clone(), x.3.clone(), x.4.clone(), x.5.clone(), x.6.clone()), )).collect::>(), }), - staking: Some(polkadot::StakingConfig { + pallet_staking: Some(polkadot::StakingConfig { minimum_validator_count: 1, validator_count: 2, stakers: initial_authorities.iter() @@ -640,21 +640,21 @@ pub fn polkadot_testnet_genesis( slash_reward_fraction: Perbill::from_percent(10), .. Default::default() }), - elections_phragmen: Some(Default::default()), - democracy: Some(polkadot::DemocracyConfig::default()), - collective_Instance1: Some(polkadot::CouncilConfig { + pallet_elections_phragmen: Some(Default::default()), + pallet_democracy: Some(polkadot::DemocracyConfig::default()), + pallet_collective_Instance1: Some(polkadot::CouncilConfig { members: vec![], phantom: Default::default(), }), - collective_Instance2: Some(polkadot::TechnicalCommitteeConfig { + pallet_collective_Instance2: Some(polkadot::TechnicalCommitteeConfig { members: vec![], phantom: Default::default(), }), - membership_Instance1: Some(Default::default()), - babe: Some(Default::default()), - grandpa: Some(Default::default()), - im_online: Some(Default::default()), - authority_discovery: Some(polkadot::AuthorityDiscoveryConfig { + pallet_membership_Instance1: Some(Default::default()), + pallet_babe: Some(Default::default()), + pallet_grandpa: Some(Default::default()), + pallet_im_online: Some(Default::default()), + pallet_authority_discovery: Some(polkadot::AuthorityDiscoveryConfig { keys: vec![], }), parachains: Some(polkadot::ParachainsConfig { @@ -668,7 +668,7 @@ pub fn polkadot_testnet_genesis( claims: vec![], vesting: vec![], }), - vesting: Some(polkadot::VestingConfig { + pallet_vesting: Some(polkadot::VestingConfig { vesting: vec![], }), } @@ -687,24 +687,24 @@ pub fn kusama_testnet_genesis( const STASH: u128 = 100 * KSM; kusama::GenesisConfig { - system: Some(kusama::SystemConfig { + frame_system: Some(kusama::SystemConfig { code: wasm_binary.to_vec(), changes_trie_config: Default::default(), }), - indices: Some(kusama::IndicesConfig { + pallet_indices: Some(kusama::IndicesConfig { indices: vec![], }), - balances: Some(kusama::BalancesConfig { + pallet_balances: Some(kusama::BalancesConfig { balances: endowed_accounts.iter().map(|k| (k.clone(), ENDOWMENT)).collect(), }), - session: Some(kusama::SessionConfig { + pallet_session: Some(kusama::SessionConfig { keys: initial_authorities.iter().map(|x| ( x.0.clone(), x.0.clone(), kusama_session_keys(x.2.clone(), x.3.clone(), x.4.clone(), x.5.clone(), x.6.clone()), )).collect::>(), }), - staking: Some(kusama::StakingConfig { + pallet_staking: Some(kusama::StakingConfig { minimum_validator_count: 1, validator_count: 2, stakers: initial_authorities.iter() @@ -715,21 +715,21 @@ pub fn kusama_testnet_genesis( slash_reward_fraction: Perbill::from_percent(10), .. Default::default() }), - elections_phragmen: Some(Default::default()), - democracy: Some(kusama::DemocracyConfig::default()), - collective_Instance1: Some(kusama::CouncilConfig { + pallet_elections_phragmen: Some(Default::default()), + pallet_democracy: Some(kusama::DemocracyConfig::default()), + pallet_collective_Instance1: Some(kusama::CouncilConfig { members: vec![], phantom: Default::default(), }), - collective_Instance2: Some(kusama::TechnicalCommitteeConfig { + pallet_collective_Instance2: Some(kusama::TechnicalCommitteeConfig { members: vec![], phantom: Default::default(), }), - membership_Instance1: Some(Default::default()), - babe: Some(Default::default()), - grandpa: Some(Default::default()), - im_online: Some(Default::default()), - authority_discovery: Some(kusama::AuthorityDiscoveryConfig { + pallet_membership_Instance1: Some(Default::default()), + pallet_babe: Some(Default::default()), + pallet_grandpa: Some(Default::default()), + pallet_im_online: Some(Default::default()), + pallet_authority_discovery: Some(kusama::AuthorityDiscoveryConfig { keys: vec![], }), parachains: Some(kusama::ParachainsConfig { @@ -743,7 +743,7 @@ pub fn kusama_testnet_genesis( claims: vec![], vesting: vec![], }), - vesting: Some(kusama::VestingConfig { + pallet_vesting: Some(kusama::VestingConfig { vesting: vec![], }), } @@ -762,24 +762,24 @@ pub fn westend_testnet_genesis( const STASH: u128 = 100 * DOTS; westend::GenesisConfig { - system: Some(westend::SystemConfig { + frame_system: Some(westend::SystemConfig { code: wasm_binary.to_vec(), changes_trie_config: Default::default(), }), - indices: Some(westend::IndicesConfig { + pallet_indices: Some(westend::IndicesConfig { indices: vec![], }), - balances: Some(westend::BalancesConfig { + pallet_balances: Some(westend::BalancesConfig { balances: endowed_accounts.iter().map(|k| (k.clone(), ENDOWMENT)).collect(), }), - session: Some(westend::SessionConfig { + pallet_session: Some(westend::SessionConfig { keys: initial_authorities.iter().map(|x| ( x.0.clone(), x.0.clone(), westend_session_keys(x.2.clone(), x.3.clone(), x.4.clone(), x.5.clone(), x.6.clone()), )).collect::>(), }), - staking: Some(westend::StakingConfig { + pallet_staking: Some(westend::StakingConfig { minimum_validator_count: 1, validator_count: 2, stakers: initial_authorities.iter() @@ -790,10 +790,10 @@ pub fn westend_testnet_genesis( slash_reward_fraction: Perbill::from_percent(10), .. Default::default() }), - babe: Some(Default::default()), - grandpa: Some(Default::default()), - im_online: Some(Default::default()), - authority_discovery: Some(westend::AuthorityDiscoveryConfig { + pallet_babe: Some(Default::default()), + pallet_grandpa: Some(Default::default()), + pallet_im_online: Some(Default::default()), + pallet_authority_discovery: Some(westend::AuthorityDiscoveryConfig { keys: vec![], }), parachains: Some(westend::ParachainsConfig { @@ -803,10 +803,10 @@ pub fn westend_testnet_genesis( parachains: vec![], _phdata: Default::default(), }), - vesting: Some(westend::VestingConfig { + pallet_vesting: Some(westend::VestingConfig { vesting: vec![], }), - sudo: Some(westend::SudoConfig { + pallet_sudo: Some(westend::SudoConfig { key: root_key, }), } diff --git a/node/service/src/lib.rs b/node/service/src/lib.rs index e7e75369fc..c347c94ec0 100644 --- a/node/service/src/lib.rs +++ b/node/service/src/lib.rs @@ -84,7 +84,7 @@ pub trait RuntimeApiCollection: + babe_primitives::BabeApi + grandpa_primitives::GrandpaApi + sp_block_builder::BlockBuilder - + system_rpc_runtime_api::AccountNonceApi + + frame_system_rpc_runtime_api::AccountNonceApi + pallet_transaction_payment_rpc_runtime_api::TransactionPaymentApi + sp_api::Metadata + sp_offchain::OffchainWorkerApi @@ -102,7 +102,7 @@ where + babe_primitives::BabeApi + grandpa_primitives::GrandpaApi + sp_block_builder::BlockBuilder - + system_rpc_runtime_api::AccountNonceApi + + frame_system_rpc_runtime_api::AccountNonceApi + pallet_transaction_payment_rpc_runtime_api::TransactionPaymentApi + sp_api::Metadata + sp_offchain::OffchainWorkerApi diff --git a/node/test-service/src/chain_spec.rs b/node/test-service/src/chain_spec.rs index 67d1667469..45d9da8f9a 100644 --- a/node/test-service/src/chain_spec.rs +++ b/node/test-service/src/chain_spec.rs @@ -106,18 +106,18 @@ fn polkadot_testnet_genesis( const STASH: u128 = 100 * DOTS; polkadot::GenesisConfig { - system: Some(polkadot::SystemConfig { + frame_system: Some(polkadot::SystemConfig { code: polkadot::WASM_BINARY.expect("Wasm binary must be built for testing").to_vec(), changes_trie_config, }), - indices: Some(polkadot::IndicesConfig { indices: vec![] }), - balances: Some(polkadot::BalancesConfig { + pallet_indices: Some(polkadot::IndicesConfig { indices: vec![] }), + pallet_balances: Some(polkadot::BalancesConfig { balances: endowed_accounts .iter() .map(|k| (k.clone(), ENDOWMENT)) .collect(), }), - session: Some(polkadot::SessionConfig { + pallet_session: Some(polkadot::SessionConfig { keys: initial_authorities .iter() .map(|x| { @@ -133,7 +133,7 @@ fn polkadot_testnet_genesis( }) .collect::>(), }), - staking: Some(polkadot::StakingConfig { + pallet_staking: Some(polkadot::StakingConfig { minimum_validator_count: 1, validator_count: 2, stakers: initial_authorities @@ -152,9 +152,9 @@ fn polkadot_testnet_genesis( slash_reward_fraction: Perbill::from_percent(10), ..Default::default() }), - babe: Some(Default::default()), - grandpa: Some(Default::default()), - authority_discovery: Some(polkadot::AuthorityDiscoveryConfig { keys: vec![] }), + pallet_babe: Some(Default::default()), + pallet_grandpa: Some(Default::default()), + pallet_authority_discovery: Some(polkadot::AuthorityDiscoveryConfig { keys: vec![] }), parachains: Some(polkadot::ParachainsConfig { authorities: vec![], }), @@ -166,8 +166,8 @@ fn polkadot_testnet_genesis( claims: vec![], vesting: vec![], }), - vesting: Some(polkadot::VestingConfig { vesting: vec![] }), - sudo: Some(polkadot::SudoConfig { key: root_key }), + pallet_vesting: Some(polkadot::VestingConfig { vesting: vec![] }), + pallet_sudo: Some(polkadot::SudoConfig { key: root_key }), } } diff --git a/runtime/common/Cargo.toml b/runtime/common/Cargo.toml index 72694c33b9..3d3b0e44b0 100644 --- a/runtime/common/Cargo.toml +++ b/runtime/common/Cargo.toml @@ -22,16 +22,16 @@ sp-session = { git = "https://github.com/paritytech/substrate", branch = "master sp-staking = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } sp-core = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -authorship = { package = "pallet-authorship", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -balances = { package = "pallet-balances", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -session = { package = "pallet-session", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-authorship = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-balances = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-session = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } frame-support = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -staking = { package = "pallet-staking", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -system = { package = "frame-system", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -timestamp = { package = "pallet-timestamp", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -vesting = { package = "pallet-vesting", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -offences = { package = "pallet-offences", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -transaction-payment = { package = "pallet-transaction-payment", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-staking = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +frame-system = {git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-timestamp = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-vesting = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-offences = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-transaction-payment = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } frame-benchmarking = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false, optional = true } primitives = { package = "polkadot-primitives", path = "../../primitives", default-features = false } @@ -42,11 +42,11 @@ runtime-parachains = { package = "polkadot-runtime-parachains", path = "../parac hex-literal = "0.2.1" keyring = { package = "sp-keyring", git = "https://github.com/paritytech/substrate", branch = "master" } sp-trie = { git = "https://github.com/paritytech/substrate", branch = "master" } -babe = { package = "pallet-babe", git = "https://github.com/paritytech/substrate", branch = "master" } +pallet-babe = { git = "https://github.com/paritytech/substrate", branch = "master" } sp-application-crypto = { git = "https://github.com/paritytech/substrate", branch = "master" } -randomness-collective-flip = { package = "pallet-randomness-collective-flip", git = "https://github.com/paritytech/substrate", branch = "master" } +pallet-randomness-collective-flip = { git = "https://github.com/paritytech/substrate", branch = "master" } pallet-staking-reward-curve = { git = "https://github.com/paritytech/substrate", branch = "master" } -treasury = { package = "pallet-treasury", git = "https://github.com/paritytech/substrate", branch = "master" } +pallet-treasury = { git = "https://github.com/paritytech/substrate", branch = "master" } trie-db = "0.22.0" serde_json = "1.0.41" libsecp256k1 = "0.3.2" @@ -68,21 +68,21 @@ std = [ "sp-std/std", "sp-io/std", "frame-support/std", - "authorship/std", - "balances/std", + "pallet-authorship/std", + "pallet-balances/std", "sp-runtime/std", "sp-session/std", "sp-staking/std", - "session/std", - "staking/std", - "system/std", - "timestamp/std", - "vesting/std", - "transaction-payment/std", + "pallet-session/std", + "pallet-staking/std", + "frame-system/std", + "pallet-timestamp/std", + "pallet-vesting/std", + "pallet-transaction-payment/std", ] runtime-benchmarks = [ "libsecp256k1/hmac", "frame-benchmarking", "frame-support/runtime-benchmarks", - "system/runtime-benchmarks", + "frame-system/runtime-benchmarks", ] diff --git a/runtime/common/src/attestations.rs b/runtime/common/src/attestations.rs index e7a6854bbb..6492f31cea 100644 --- a/runtime/common/src/attestations.rs +++ b/runtime/common/src/attestations.rs @@ -33,7 +33,7 @@ use sp_runtime::RuntimeDebug; use sp_staking::SessionIndex; use inherents::{ProvideInherent, InherentData, MakeFatalError, InherentIdentifier}; -use system::ensure_none; +use frame_system::ensure_none; /// Parachain blocks included in a recent relay-chain block. #[derive(Encode, Decode)] @@ -76,9 +76,9 @@ impl RewardAttestation for () { } } -impl RewardAttestation for staking::Module { +impl RewardAttestation for pallet_staking::Module { fn reward_immediate(validator_indices: impl IntoIterator) { - use staking::SessionInterface; + use pallet_staking::SessionInterface; // The number of points to reward for a validity statement. // https://research.web3.foundation/en/latest/polkadot/Token%20Economics/#payment-details @@ -94,7 +94,7 @@ impl RewardAttestation for staking::Module { } } -pub trait Trait: session::Trait { +pub trait Trait: pallet_session::Trait { /// How many blocks ago we're willing to accept attestations for. type AttestationPeriod: Get; @@ -130,7 +130,7 @@ decl_error! { decl_module! { /// Parachain-attestations module. - pub struct Module for enum Call where origin: ::Origin, system = system { + pub struct Module for enum Call where origin: ::Origin { type Error = Error; /// Provide candidate receipts for parachains, in ascending order by id. diff --git a/runtime/common/src/claims.rs b/runtime/common/src/claims.rs index b56fa2ead7..6a51da0675 100644 --- a/runtime/common/src/claims.rs +++ b/runtime/common/src/claims.rs @@ -22,7 +22,7 @@ use frame_support::{ decl_event, decl_storage, decl_module, decl_error, ensure, dispatch::IsSubType, traits::{Currency, Get, VestingSchedule, EnsureOrigin}, weights::{Pays, DispatchClass} }; -use system::{ensure_signed, ensure_root, ensure_none}; +use frame_system::{ensure_signed, ensure_root, ensure_none}; use codec::{Encode, Decode}; #[cfg(feature = "std")] use serde::{self, Serialize, Deserialize, Serializer, Deserializer}; @@ -37,13 +37,13 @@ use sp_runtime::{ }; use primitives::v0::ValidityError; -type CurrencyOf = <::VestingSchedule as VestingSchedule<::AccountId>>::Currency; -type BalanceOf = as Currency<::AccountId>>::Balance; +type CurrencyOf = <::VestingSchedule as VestingSchedule<::AccountId>>::Currency; +type BalanceOf = as Currency<::AccountId>>::Balance; /// Configuration trait. -pub trait Trait: system::Trait { +pub trait Trait: frame_system::Trait { /// The overarching event type. - type Event: From> + Into<::Event>; + type Event: From> + Into<::Event>; type VestingSchedule: VestingSchedule; type Prefix: Get<&'static [u8]>; type MoveClaimOrigin: EnsureOrigin; @@ -130,7 +130,7 @@ impl sp_std::fmt::Debug for EcdsaSignature { decl_event!( pub enum Event where Balance = BalanceOf, - AccountId = ::AccountId + AccountId = ::AccountId { /// Someone claimed some DOTs. Claimed(AccountId, EthereumAddress, Balance), @@ -194,7 +194,7 @@ decl_storage! { } decl_module! { - pub struct Module for enum Call where origin: T::Origin, system = system { + pub struct Module for enum Call where origin: T::Origin { type Error = Error; /// The Prefix that is used in signed Ethereum messages for this network @@ -539,10 +539,10 @@ impl sp_runtime::traits::ValidateUnsigned for Module { /// otherwise free to place on chain. #[derive(Encode, Decode, Clone, Eq, PartialEq)] pub struct PrevalidateAttests(sp_std::marker::PhantomData) where - ::Call: IsSubType>; + ::Call: IsSubType>; impl Debug for PrevalidateAttests where - ::Call: IsSubType> + ::Call: IsSubType> { #[cfg(feature = "std")] fn fmt(&self, f: &mut sp_std::fmt::Formatter) -> sp_std::fmt::Result { @@ -556,7 +556,7 @@ impl Debug for PrevalidateAttests where } impl PrevalidateAttests where - ::Call: IsSubType> + ::Call: IsSubType> { /// Create new `SignedExtension` to check runtime version. pub fn new() -> Self { @@ -565,10 +565,10 @@ impl PrevalidateAttests where } impl SignedExtension for PrevalidateAttests where - ::Call: IsSubType> + ::Call: IsSubType> { type AccountId = T::AccountId; - type Call = ::Call; + type Call = ::Call; type AdditionalSigned = (); type Pre = (); const IDENTIFIER: &'static str = "PrevalidateAttests"; @@ -642,11 +642,11 @@ mod tests { ord_parameter_types, weights::{Pays, GetDispatchInfo}, traits::ExistenceRequirement, dispatch::DispatchError::BadOrigin, }; - use balances; + use pallet_balances; use super::Call as ClaimsCall; impl_outer_origin! { - pub enum Origin for Test where system = system {} + pub enum Origin for Test {} } impl_outer_dispatch! { @@ -665,7 +665,7 @@ mod tests { pub const MaximumBlockLength: u32 = 4 * 1024 * 1024; pub const AvailableBlockRatio: Perbill = Perbill::from_percent(75); } - impl system::Trait for Test { + impl frame_system::Trait for Test { type BaseCallFilter = (); type Origin = Origin; type Call = Call; @@ -687,7 +687,7 @@ mod tests { type AvailableBlockRatio = AvailableBlockRatio; type Version = (); type ModuleToIndex = (); - type AccountData = balances::AccountData; + type AccountData = pallet_balances::AccountData; type OnNewAccount = (); type OnKilledAccount = Balances; type SystemWeightInfo = (); @@ -699,7 +699,7 @@ mod tests { pub const MinVestedTransfer: u64 = 0; } - impl balances::Trait for Test { + impl pallet_balances::Trait for Test { type Balance = u64; type Event = (); type DustRemoval = (); @@ -708,7 +708,7 @@ mod tests { type WeightInfo = (); } - impl vesting::Trait for Test { + impl pallet_vesting::Trait for Test { type Event = (); type Currency = Balances; type BlockNumberToBalance = Identity; @@ -727,11 +727,11 @@ mod tests { type Event = (); type VestingSchedule = Vesting; type Prefix = Prefix; - type MoveClaimOrigin = system::EnsureSignedBy; + type MoveClaimOrigin = frame_system::EnsureSignedBy; } - type System = system::Module; - type Balances = balances::Module; - type Vesting = vesting::Module; + type System = frame_system::Module; + type Balances = pallet_balances::Module; + type Vesting = pallet_vesting::Module; type Claims = Module; fn alice() -> secp256k1::SecretKey { @@ -753,9 +753,9 @@ mod tests { // This function basically just builds a genesis storage key/value store according to // our desired mockup. pub fn new_test_ext() -> sp_io::TestExternalities { - let mut t = system::GenesisConfig::default().build_storage::().unwrap(); + let mut t = frame_system::GenesisConfig::default().build_storage::().unwrap(); // We use default for brevity, but you can configure as desired if needed. - balances::GenesisConfig::::default().assimilate_storage(&mut t).unwrap(); + pallet_balances::GenesisConfig::::default().assimilate_storage(&mut t).unwrap(); GenesisConfig::{ claims: vec![ (eth(&alice()), 100, None, None), @@ -982,7 +982,7 @@ mod tests { // Make sure we can not transfer the vested balance. assert_err!( >::transfer(&69, &80, 180, ExistenceRequirement::AllowDeath), - balances::Error::::LiquidityRestrictions, + pallet_balances::Error::::LiquidityRestrictions, ); }); } @@ -1167,8 +1167,7 @@ mod tests { mod benchmarking { use super::*; use secp_utils::*; - use system::RawOrigin; - use system as frame_system; // NOTE: required for the benchmarks! macro + use frame_system::RawOrigin; use frame_benchmarking::{benchmarks, account}; use sp_runtime::DispatchResult; use sp_runtime::traits::ValidateUnsigned; diff --git a/runtime/common/src/crowdfund.rs b/runtime/common/src/crowdfund.rs index 942b319766..be4d8c0ffb 100644 --- a/runtime/common/src/crowdfund.rs +++ b/runtime/common/src/crowdfund.rs @@ -72,7 +72,7 @@ use frame_support::{ Currency, Get, OnUnbalanced, WithdrawReason, ExistenceRequirement::AllowDeath }, }; -use system::ensure_signed; +use frame_system::ensure_signed; use sp_runtime::{ModuleId, traits::{AccountIdConversion, Hash, Saturating, Zero, CheckedAdd} }; @@ -82,13 +82,13 @@ use sp_std::vec::Vec; use primitives::v0::{Id as ParaId, HeadData}; pub type BalanceOf = - <::Currency as Currency<::AccountId>>::Balance; + <::Currency as Currency<::AccountId>>::Balance; #[allow(dead_code)] pub type NegativeImbalanceOf = - <::Currency as Currency<::AccountId>>::NegativeImbalance; + <::Currency as Currency<::AccountId>>::NegativeImbalance; pub trait Trait: slots::Trait { - type Event: From> + Into<::Event>; + type Event: From> + Into<::Event>; /// ModuleID for the crowdfund module. An appropriate value could be ```ModuleId(*b"py/cfund")``` type ModuleId: Get; @@ -184,7 +184,7 @@ decl_storage! { decl_event! { pub enum Event where - ::AccountId, + ::AccountId, Balance = BalanceOf, { Created(FundIndex), @@ -244,7 +244,7 @@ decl_error! { } decl_module! { - pub struct Module for enum Call where origin: T::Origin, system = system { + pub struct Module for enum Call where origin: T::Origin { type Error = Error; const ModuleId: ModuleId = T::ModuleId::get(); @@ -263,7 +263,7 @@ decl_module! { ensure!(first_slot < last_slot, Error::::LastSlotBeforeFirstSlot); ensure!(last_slot <= first_slot + 3.into(), Error::::LastSlotTooFarInFuture); - ensure!(end > >::block_number(), Error::::CannotEndInPast); + ensure!(end > >::block_number(), Error::::CannotEndInPast); let deposit = T::SubmissionDeposit::get(); let transfer = WithdrawReason::Transfer.into(); @@ -306,7 +306,7 @@ decl_module! { ensure!(fund.raised <= fund.cap, Error::::CapExceeded); // Make sure crowdfund has not ended - let now = >::block_number(); + let now = >::block_number(); ensure!(fund.end > now, Error::::ContributionPeriodOver); T::Currency::transfer(&who, &Self::fund_account_id(index), value, AllowDeath)?; @@ -394,7 +394,7 @@ decl_module! { ensure!(fund.parachain.is_none(), Error::::AlreadyOnboard); fund.parachain = Some(para_id); - let fund_origin = system::RawOrigin::Signed(Self::fund_account_id(index)).into(); + let fund_origin = frame_system::RawOrigin::Signed(Self::fund_account_id(index)).into(); >::fix_deploy_data( fund_origin, index, @@ -423,7 +423,7 @@ decl_module! { ensure!(T::Currency::free_balance(&account) >= fund.raised, Error::::FundsNotReturned); // This fund just ended. Withdrawal period begins. - let now = >::block_number(); + let now = >::block_number(); fund.end = now; >::insert(index, &fund); @@ -438,7 +438,7 @@ decl_module! { let mut fund = Self::funds(index).ok_or(Error::::InvalidFundIndex)?; ensure!(fund.parachain.is_none(), Error::::FundNotRetired); - let now = >::block_number(); + let now = >::block_number(); // `fund.end` can represent the end of a failed crowdsale or the beginning of retirement ensure!(now >= fund.end, Error::::FundNotEnded); @@ -469,7 +469,7 @@ decl_module! { let fund = Self::funds(index).ok_or(Error::::InvalidFundIndex)?; ensure!(fund.parachain.is_none(), Error::::HasActiveParachain); - let now = >::block_number(); + let now = >::block_number(); ensure!( now >= fund.end.saturating_add(T::RetirementPeriod::get()), Error::::InRetirementPeriod @@ -578,7 +578,7 @@ mod tests { use crate::registrar::Registrar; impl_outer_origin! { - pub enum Origin for Test where system = system {} + pub enum Origin for Test {} } // For testing the module, we construct most of a mock runtime. This means @@ -592,7 +592,7 @@ mod tests { pub const MaximumBlockLength: u32 = 4 * 1024 * 1024; pub const AvailableBlockRatio: Perbill = Perbill::from_percent(75); } - impl system::Trait for Test { + impl frame_system::Trait for Test { type BaseCallFilter = (); type Origin = Origin; type Call = (); @@ -614,7 +614,7 @@ mod tests { type AvailableBlockRatio = AvailableBlockRatio; type Version = (); type ModuleToIndex = (); - type AccountData = balances::AccountData; + type AccountData = pallet_balances::AccountData; type OnNewAccount = (); type OnKilledAccount = Balances; type SystemWeightInfo = (); @@ -622,7 +622,7 @@ mod tests { parameter_types! { pub const ExistentialDeposit: u64 = 1; } - impl balances::Trait for Test { + impl pallet_balances::Trait for Test { type Balance = u64; type Event = (); type DustRemoval = (); @@ -653,10 +653,10 @@ mod tests { fn min_len() -> usize { 0 } fn max_len() -> usize { 0 } } - impl treasury::Trait for Test { - type Currency = balances::Module; - type ApproveOrigin = system::EnsureRoot; - type RejectOrigin = system::EnsureRoot; + impl pallet_treasury::Trait for Test { + type Currency = pallet_balances::Module; + type ApproveOrigin = frame_system::EnsureRoot; + type RejectOrigin = frame_system::EnsureRoot; type Event = (); type ProposalRejection = (); type ProposalBond = ProposalBond; @@ -756,20 +756,20 @@ mod tests { type ModuleId = CrowdfundModuleId; } - type System = system::Module; - type Balances = balances::Module; + type System = frame_system::Module; + type Balances = pallet_balances::Module; type Slots = slots::Module; - type Treasury = treasury::Module; + type Treasury = pallet_treasury::Module; type Crowdfund = Module; - type RandomnessCollectiveFlip = randomness_collective_flip::Module; - use balances::Error as BalancesError; + type RandomnessCollectiveFlip = pallet_randomness_collective_flip::Module; + use pallet_balances::Error as BalancesError; use slots::Error as SlotsError; // This function basically just builds a genesis storage key/value store according to // our desired mockup. fn new_test_ext() -> sp_io::TestExternalities { - let mut t = system::GenesisConfig::default().build_storage::().unwrap(); - balances::GenesisConfig::{ + let mut t = frame_system::GenesisConfig::default().build_storage::().unwrap(); + pallet_balances::GenesisConfig::{ balances: vec![(1, 1000), (2, 2000), (3, 3000), (4, 4000)], }.assimilate_storage(&mut t).unwrap(); t.into() @@ -920,7 +920,7 @@ mod tests { assert_ok!(Crowdfund::fix_deploy_data( Origin::signed(1), 0, - ::Hash::default(), + ::Hash::default(), 0, vec![0].into() )); @@ -931,7 +931,7 @@ mod tests { assert_eq!( fund.deploy_data, Some(DeployData { - code_hash: ::Hash::default(), + code_hash: ::Hash::default(), code_size: 0, initial_head_data: vec![0].into(), }), @@ -950,7 +950,7 @@ mod tests { assert_noop!(Crowdfund::fix_deploy_data( Origin::signed(2), 0, - ::Hash::default(), + ::Hash::default(), 0, vec![0].into()), Error::::InvalidOrigin @@ -960,7 +960,7 @@ mod tests { assert_noop!(Crowdfund::fix_deploy_data( Origin::signed(1), 1, - ::Hash::default(), + ::Hash::default(), 0, vec![0].into()), Error::::InvalidFundIndex @@ -970,7 +970,7 @@ mod tests { assert_ok!(Crowdfund::fix_deploy_data( Origin::signed(1), 0, - ::Hash::default(), + ::Hash::default(), 0, vec![0].into(), )); @@ -978,7 +978,7 @@ mod tests { assert_noop!(Crowdfund::fix_deploy_data( Origin::signed(1), 0, - ::Hash::default(), + ::Hash::default(), 0, vec![1].into()), Error::::ExistingDeployData @@ -998,7 +998,7 @@ mod tests { assert_ok!(Crowdfund::fix_deploy_data( Origin::signed(1), 0, - ::Hash::default(), + ::Hash::default(), 0, vec![0].into(), )); @@ -1044,7 +1044,7 @@ mod tests { assert_ok!(Crowdfund::fix_deploy_data( Origin::signed(1), 0, - ::Hash::default(), + ::Hash::default(), 0, vec![0].into(), )); @@ -1072,7 +1072,7 @@ mod tests { assert_ok!(Crowdfund::fix_deploy_data( Origin::signed(1), 0, - ::Hash::default(), + ::Hash::default(), 0, vec![0].into(), )); @@ -1115,7 +1115,7 @@ mod tests { assert_ok!(Crowdfund::fix_deploy_data( Origin::signed(1), 0, - ::Hash::default(), + ::Hash::default(), 0, vec![0].into(), )); @@ -1257,7 +1257,7 @@ mod tests { assert_ok!(Crowdfund::fix_deploy_data( Origin::signed(1), 0, - ::Hash::default(), + ::Hash::default(), 0, vec![0].into(), )); @@ -1286,7 +1286,7 @@ mod tests { assert_ok!(Crowdfund::fix_deploy_data( Origin::signed(1), 0, - ::Hash::default(), + ::Hash::default(), 0, vec![0].into(), )); @@ -1325,14 +1325,14 @@ mod tests { assert_ok!(Crowdfund::fix_deploy_data( Origin::signed(1), 0, - ::Hash::default(), + ::Hash::default(), 0, vec![0].into(), )); assert_ok!(Crowdfund::fix_deploy_data( Origin::signed(2), 1, - ::Hash::default(), + ::Hash::default(), 0, vec![0].into(), )); diff --git a/runtime/common/src/impls.rs b/runtime/common/src/impls.rs index 7e3b6d917f..47349d1f2e 100644 --- a/runtime/common/src/impls.rs +++ b/runtime/common/src/impls.rs @@ -25,20 +25,20 @@ pub struct ToAuthor(sp_std::marker::PhantomData); impl OnUnbalanced> for ToAuthor where - R: balances::Trait + authorship::Trait, - ::AccountId: From, - ::AccountId: Into, - ::Event: From::AccountId, - ::Balance, - balances::DefaultInstance> + R: pallet_balances::Trait + pallet_authorship::Trait, + ::AccountId: From, + ::AccountId: Into, + ::Event: From::AccountId, + ::Balance, + pallet_balances::DefaultInstance> >, { fn on_nonzero_unbalanced(amount: NegativeImbalance) { let numeric_amount = amount.peek(); - let author = >::author(); - >::resolve_creating(&>::author(), amount); - >::deposit_event(balances::RawEvent::Deposit(author, numeric_amount)); + let author = >::author(); + >::resolve_creating(&>::author(), amount); + >::deposit_event(pallet_balances::RawEvent::Deposit(author, numeric_amount)); } } @@ -47,18 +47,18 @@ pub struct CurrencyToVoteHandler(sp_std::marker::PhantomData); impl CurrencyToVoteHandler where - R: balances::Trait, + R: pallet_balances::Trait, R::Balance: Into, { fn factor() -> u128 { - let issuance: u128 = >::total_issuance().into(); + let issuance: u128 = >::total_issuance().into(); (issuance / u64::max_value() as u128).max(1) } } impl Convert for CurrencyToVoteHandler where - R: balances::Trait, + R: pallet_balances::Trait, R::Balance: Into, { fn convert(x: u128) -> u64 { (x / Self::factor()) as u64 } @@ -66,7 +66,7 @@ where impl Convert for CurrencyToVoteHandler where - R: balances::Trait, + R: pallet_balances::Trait, R::Balance: Into, { fn convert(x: u128) -> u128 { x * Self::factor() } diff --git a/runtime/common/src/lib.rs b/runtime/common/src/lib.rs index 3fb6e8140b..c512e822cf 100644 --- a/runtime/common/src/lib.rs +++ b/runtime/common/src/lib.rs @@ -35,23 +35,23 @@ use frame_support::{ parameter_types, traits::{Currency}, weights::{Weight, constants::WEIGHT_PER_SECOND}, }; -use transaction_payment::{TargetedFeeAdjustment, Multiplier}; +use pallet_transaction_payment::{TargetedFeeAdjustment, Multiplier}; use static_assertions::const_assert; pub use frame_support::weights::constants::{BlockExecutionWeight, ExtrinsicBaseWeight, RocksDbWeight}; #[cfg(feature = "std")] -pub use staking::StakerStatus; +pub use pallet_staking::StakerStatus; #[cfg(any(feature = "std", test))] pub use sp_runtime::BuildStorage; -pub use timestamp::Call as TimestampCall; -pub use balances::Call as BalancesCall; +pub use pallet_timestamp::Call as TimestampCall; +pub use pallet_balances::Call as BalancesCall; pub use attestations::{Call as AttestationsCall, MORE_ATTESTATIONS_IDENTIFIER}; pub use parachains::Call as ParachainsCall; /// Implementations of some helper traits passed into runtime modules as associated types. pub use impls::{CurrencyToVoteHandler, ToAuthor}; -pub type NegativeImbalance = as Currency<::AccountId>>::NegativeImbalance; +pub type NegativeImbalance = as Currency<::AccountId>>::NegativeImbalance; /// We assume that an on-initialize consumes 10% of the weight on average, hence a single extrinsic /// will not be allowed to consume more than `AvailableBlockRatio - 10%`. @@ -107,7 +107,7 @@ mod multiplier_tests { pub struct Runtime; impl_outer_origin!{ - pub enum Origin for Runtime where system = system {} + pub enum Origin for Runtime {} } parameter_types! { @@ -118,7 +118,7 @@ mod multiplier_tests { pub const AvailableBlockRatio: Perbill = Perbill::one(); } - impl system::Trait for Runtime { + impl frame_system::Trait for Runtime { type BaseCallFilter = (); type Origin = Origin; type Index = u64; @@ -146,11 +146,11 @@ mod multiplier_tests { type SystemWeightInfo = (); } - type System = system::Module; + type System = frame_system::Module; fn run_with_system_weight(w: Weight, assertions: F) where F: Fn() -> () { let mut t: sp_io::TestExternalities = - system::GenesisConfig::default().build_storage::().unwrap().into(); + frame_system::GenesisConfig::default().build_storage::().unwrap().into(); t.execute_with(|| { System::set_block_limits(w, 0); assertions() diff --git a/runtime/common/src/parachains.rs b/runtime/common/src/parachains.rs index a5d81989aa..ce28012aae 100644 --- a/runtime/common/src/parachains.rs +++ b/runtime/common/src/parachains.rs @@ -54,7 +54,7 @@ use sp_runtime::transaction_validity::InvalidTransaction; use inherents::{ProvideInherent, InherentData, MakeFatalError, InherentIdentifier}; -use system::{ +use frame_system::{ ensure_none, ensure_signed, offchain::{CreateSignedTransaction, SendSignedTransaction, Signer}, }; @@ -232,9 +232,9 @@ impl DoubleVoteReport { } } -impl Get> for ValidatorIdentities { +impl Get> for ValidatorIdentities { fn get() -> Vec { - >::validators() + >::validators() } } @@ -249,13 +249,13 @@ impl GetSessionNumber for sp_session::MembershipProof { } } -pub trait Trait: CreateSignedTransaction> + attestations::Trait + session::historical::Trait { +pub trait Trait: CreateSignedTransaction> + attestations::Trait + pallet_session::historical::Trait { // The transaction signing authority - type AuthorityId: system::offchain::AppCrypto; + type AuthorityId: frame_system::offchain::AppCrypto; /// The outer origin type. type Origin: From - + From<::Origin> + + From<::Origin> + Into::Origin>>; /// The outer call dispatch type. @@ -572,7 +572,7 @@ decl_error! { decl_module! { /// Parachains module. - pub struct Module for enum Call where origin: ::Origin, system = system { + pub struct Module for enum Call where origin: ::Origin { type Error = Error; fn on_initialize(now: T::BlockNumber) -> Weight { @@ -683,7 +683,7 @@ decl_module! { ) -> DispatchResult { let reporter = ensure_signed(origin)?; - let validators = >::validators(); + let validators = >::validators(); let validator_set_count = validators.len() as u32; let session_index = report.proof.session(); @@ -845,7 +845,7 @@ impl Module { } if let Some(code) = code { - Self::note_past_code(id, >::block_number(), code); + Self::note_past_code(id, >::block_number(), code); } } @@ -916,8 +916,8 @@ impl Module { /// Get a `SigningContext` with a current `SessionIndex` and parent hash. pub fn signing_context() -> SigningContext { - let session_index = >::current_index(); - let parent_hash = >::parent_hash(); + let session_index = >::current_index(); + let parent_hash = >::parent_hash(); SigningContext { session_index, @@ -948,11 +948,11 @@ impl Module { if let Ok(message_call) = ::Call::decode(&mut &data[..]) { let origin: ::Origin = match origin { ParachainDispatchOrigin::Signed => - ::Origin::from(::Origin::from(system::RawOrigin::Signed(id.into_account()))), + ::Origin::from(::Origin::from(frame_system::RawOrigin::Signed(id.into_account()))), ParachainDispatchOrigin::Parachain => Origin::Parachain(id).into(), ParachainDispatchOrigin::Root => - ::Origin::from(::Origin::from(system::RawOrigin::Root)), + ::Origin::from(::Origin::from(frame_system::RawOrigin::Root)), }; let _ok = message_call.dispatch(origin).is_ok(); // Not much to do with the result as it is. It's up to the parachain to ensure that the @@ -1169,7 +1169,7 @@ impl Module { /// Get the global validation schedule for all parachains. pub fn global_validation_data() -> GlobalValidationData { - let now = >::block_number(); + let now = >::block_number(); GlobalValidationData { max_code_size: T::MaxCodeSize::get(), max_head_data_size: T::MaxHeadDataSize::get(), @@ -1185,7 +1185,7 @@ impl Module { /// Get the local validation schedule for a particular parachain. pub fn local_validation_data(id: &ParaId, perceived_height: T::BlockNumber) -> Option { - if perceived_height + One::one() != >::block_number() { + if perceived_height + One::one() != >::block_number() { // sanity-check - no non-direct-parent blocks allowed at the moment. return None } @@ -1232,7 +1232,7 @@ impl Module { /// Get the local validation data for a particular parent w.r.t. the current /// block height. pub fn current_local_validation_data(id: &ParaId) -> Option { - let now: T::BlockNumber = >::block_number(); + let now: T::BlockNumber = >::block_number(); if now >= One::one() { Self::local_validation_data(id, now - One::one()) } else { @@ -1353,8 +1353,8 @@ impl Module { let sorted_validators = make_sorted_duties(&duty_roster.validator_duty); - let relay_height_now = >::block_number(); - let parent_hash = >::parent_hash(); + let relay_height_now = >::block_number(); + let parent_hash = >::parent_hash(); let signing_context = Self::signing_context(); let code_upgrade_delay = T::ValidationUpgradeDelay::get(); @@ -1380,7 +1380,7 @@ impl Module { ); // Since we only allow execution in context of parent hash. - let perceived_relay_block_height = >::block_number() - One::one(); + let perceived_relay_block_height = >::block_number() - One::one(); ensure!( candidate.validity_votes.len() >= majority_of(validator_group.len()), @@ -1452,7 +1452,7 @@ impl Module { Ok(IncludedBlocks { actual_number: relay_height_now, - session: >::current_index(), + session: >::current_index(), random_seed, active_parachains: active_parachains.iter().map(|x| x.0).collect(), para_blocks: para_block_hashes, @@ -1506,7 +1506,7 @@ impl sp_runtime::BoundToRuntimeAppPublic for Module { type Public = ValidatorId; } -impl session::OneSessionHandler for Module { +impl pallet_session::OneSessionHandler for Module { type Key = ValidatorId; fn on_genesis_session<'a, I: 'a>(validators: I) @@ -1602,11 +1602,11 @@ pub enum DoubleVoteValidityError { } impl SignedExtension for ValidateDoubleVoteReports where - ::Call: IsSubType> + ::Call: IsSubType> { const IDENTIFIER: &'static str = "ValidateDoubleVoteReports"; type AccountId = T::AccountId; - type Call = ::Call; + type Call = ::Call; type AdditionalSigned = (); type Pre = (); @@ -1627,7 +1627,7 @@ impl SignedExtension for ValidateDoubleVoteReports wh if let Some(local_call) = call.is_sub_type() { if let Call::report_double_vote(report) = local_call { - let validators = >::validators(); + let validators = >::validators(); let expected_session = report.signing_context.session_index; let session = report.proof.session(); @@ -1692,8 +1692,8 @@ mod tests { use crate::parachains; use crate::registrar; use crate::slots; - use session::{SessionHandler, SessionManager}; - use staking::EraIndex; + use pallet_session::{SessionHandler, SessionManager}; + use pallet_staking::EraIndex; // result of as trie_db::NodeCodec>::hashed_null_node() const EMPTY_TRIE_ROOT: [u8; 32] = [ @@ -1702,7 +1702,7 @@ mod tests { ]; impl_outer_origin! { - pub enum Origin for Test where system = system { + pub enum Origin for Test { parachains } } @@ -1729,7 +1729,7 @@ mod tests { pub const AvailableBlockRatio: Perbill = Perbill::from_percent(75); } - impl system::Trait for Test { + impl frame_system::Trait for Test { type BaseCallFilter = (); type Origin = Origin; type Call = Call; @@ -1751,13 +1751,13 @@ mod tests { type AvailableBlockRatio = AvailableBlockRatio; type Version = (); type ModuleToIndex = (); - type AccountData = balances::AccountData; + type AccountData = pallet_balances::AccountData; type OnNewAccount = (); type OnKilledAccount = (); type SystemWeightInfo = (); } - impl system::offchain::SendTransactionTypes for Test where + impl frame_system::offchain::SendTransactionTypes for Test where Call: From, { type OverarchingCall = Call; @@ -1784,28 +1784,28 @@ mod tests { fn on_disabled(_: usize) {} } - impl session::Trait for Test { + impl pallet_session::Trait for Test { type Event = (); type ValidatorId = u64; - type ValidatorIdOf = staking::StashOf; - type ShouldEndSession = session::PeriodicSessions; - type NextSessionRotation = session::PeriodicSessions; - type SessionManager = session::historical::NoteHistoricalRoot; + type ValidatorIdOf = pallet_staking::StashOf; + type ShouldEndSession = pallet_session::PeriodicSessions; + type NextSessionRotation = pallet_session::PeriodicSessions; + type SessionManager = pallet_session::historical::NoteHistoricalRoot; type SessionHandler = TestSessionHandler; type Keys = TestSessionKeys; type DisabledValidatorsThreshold = DisabledValidatorsThreshold; type WeightInfo = (); } - impl session::historical::Trait for Test { - type FullIdentification = staking::Exposure; - type FullIdentificationOf = staking::ExposureOf; + impl pallet_session::historical::Trait for Test { + type FullIdentification = pallet_staking::Exposure; + type FullIdentificationOf = pallet_staking::ExposureOf; } parameter_types! { pub const MinimumPeriod: u64 = 3; } - impl timestamp::Trait for Test { + impl pallet_timestamp::Trait for Test { type Moment = u64; type OnTimestampSet = (); type MinimumPeriod = MinimumPeriod; @@ -1825,23 +1825,23 @@ mod tests { pub const ExpectedBlockTime: u64 = time::MILLISECS_PER_BLOCK; } - impl babe::Trait for Test { + impl pallet_babe::Trait for Test { type EpochDuration = EpochDuration; type ExpectedBlockTime = ExpectedBlockTime; // session module is the trigger - type EpochChangeTrigger = babe::ExternalTrigger; + type EpochChangeTrigger = pallet_babe::ExternalTrigger; type KeyOwnerProofSystem = (); type KeyOwnerProof = >::Proof; type KeyOwnerIdentification = >::IdentificationTuple; type HandleEquivocation = (); @@ -1851,7 +1851,7 @@ mod tests { pub const ExistentialDeposit: Balance = 1; } - impl balances::Trait for Test { + impl pallet_balances::Trait for Test { type Balance = u128; type DustRemoval = (); type Event = (); @@ -1873,8 +1873,8 @@ mod tests { parameter_types! { pub const SessionsPerEra: sp_staking::SessionIndex = 3; - pub const BondingDuration: staking::EraIndex = 3; - pub const SlashDeferDuration: staking::EraIndex = 0; + pub const BondingDuration: pallet_staking::EraIndex = 3; + pub const SlashDeferDuration: pallet_staking::EraIndex = 0; pub const AttestationPeriod: BlockNumber = 100; pub const RewardCurve: &'static PiecewiseLinear<'static> = &REWARD_CURVE; pub const MaxNominatorRewardedPerValidator: u32 = 64; @@ -1892,7 +1892,7 @@ mod tests { fn convert(x: u128) -> u64 { x.saturated_into() } } - impl staking::Trait for Test { + impl pallet_staking::Trait for Test { type RewardRemainder = (); type CurrencyToVote = CurrencyToVoteHandler; type Event = (); @@ -1902,9 +1902,9 @@ mod tests { type SessionsPerEra = SessionsPerEra; type BondingDuration = BondingDuration; type SlashDeferDuration = SlashDeferDuration; - type SlashCancelOrigin = system::EnsureRoot; + type SlashCancelOrigin = frame_system::EnsureRoot; type SessionInterface = Self; - type UnixTime = timestamp::Module; + type UnixTime = pallet_timestamp::Module; type RewardCurve = RewardCurve; type MaxNominatorRewardedPerValidator = MaxNominatorRewardedPerValidator; type NextNewSession = Session; @@ -1956,9 +1956,9 @@ mod tests { pub OffencesWeightSoftLimit: Weight = Perbill::from_percent(60) * MaximumBlockWeight::get(); } - impl offences::Trait for Test { + impl pallet_offences::Trait for Test { type Event = (); - type IdentificationTuple = session::historical::IdentificationTuple; + type IdentificationTuple = pallet_session::historical::IdentificationTuple; type OnOffenceHandler = Staking; type WeightSoftLimit = OffencesWeightSoftLimit; type WeightInfo = (); @@ -1995,7 +1995,7 @@ mod tests { pub type ReporterId = app::Public; pub struct ReporterAuthorityId; - impl system::offchain::AppCrypto for ReporterAuthorityId { + impl frame_system::offchain::AppCrypto for ReporterAuthorityId { type RuntimeAppPublic = ReporterId; type GenericSignature = sr25519::Signature; type GenericPublic = sr25519::Public; @@ -2027,40 +2027,40 @@ mod tests { type Extrinsic = TestXt; - impl system::offchain::CreateSignedTransaction for Test where + impl frame_system::offchain::CreateSignedTransaction for Test where Call: From, { - fn create_transaction>( + fn create_transaction>( call: Call, _public: test_keys::ReporterId, - _account: ::AccountId, - nonce: ::Index, + _account: ::AccountId, + nonce: ::Index, ) -> Option<(Call, ::SignaturePayload)> { Some((call, (nonce, ()))) } } - impl system::offchain::SigningTypes for Test { + impl frame_system::offchain::SigningTypes for Test { type Public = test_keys::ReporterId; type Signature = sr25519::Signature; } type Parachains = Module; - type Balances = balances::Module; - type System = system::Module; - type Offences = offences::Module; - type Staking = staking::Module; - type Session = session::Module; - type Timestamp = timestamp::Module; - type RandomnessCollectiveFlip = randomness_collective_flip::Module; + type Balances = pallet_balances::Module; + type System = frame_system::Module; + type Offences = pallet_offences::Module; + type Staking = pallet_staking::Module; + type Session = pallet_session::Module; + type Timestamp = pallet_timestamp::Module; + type RandomnessCollectiveFlip = pallet_randomness_collective_flip::Module; type Registrar = registrar::Module; - type Historical = session::historical::Module; + type Historical = pallet_session::historical::Module; fn new_test_ext(parachains: Vec<(ParaId, ValidationCode, HeadData)>) -> TestExternalities { - use staking::StakerStatus; - use babe::AuthorityId as BabeAuthorityId; + use pallet_staking::StakerStatus; + use pallet_babe::AuthorityId as BabeAuthorityId; - let mut t = system::GenesisConfig::default().build_storage::().unwrap(); + let mut t = frame_system::GenesisConfig::default().build_storage::().unwrap(); let authority_keys = [ Sr25519Keyring::Alice, @@ -2105,22 +2105,22 @@ mod tests { _phdata: Default::default(), }.assimilate_storage(&mut t).unwrap(); - session::GenesisConfig:: { + pallet_session::GenesisConfig:: { keys: session_keys, }.assimilate_storage(&mut t).unwrap(); - babe::GenesisConfig { + pallet_babe::GenesisConfig { authorities: babe_authorities, }.assimilate_storage::(&mut t).unwrap(); - balances::GenesisConfig:: { + pallet_balances::GenesisConfig:: { balances, }.assimilate_storage(&mut t).unwrap(); - staking::GenesisConfig:: { + pallet_staking::GenesisConfig:: { stakers, validator_count: 8, - force_era: staking::Forcing::ForceNew, + force_era: pallet_staking::Forcing::ForceNew, minimum_validator_count: 0, invulnerables: vec![], .. Default::default() @@ -3161,7 +3161,7 @@ mod tests { assert_eq!( Staking::eras_stakers(1, i as u64), - staking::Exposure { + pallet_staking::Exposure { total: 10_000, own: 10_000, others: vec![], @@ -3192,7 +3192,7 @@ mod tests { assert_eq!( Staking::eras_stakers(2, 0), - staking::Exposure { + pallet_staking::Exposure { total: 0, own: 0, others: vec![], @@ -3206,7 +3206,7 @@ mod tests { assert_eq!( Staking::eras_stakers(2, i as u64), - staking::Exposure { + pallet_staking::Exposure { total: 10_000, own: 10_000, others: vec![], @@ -3256,7 +3256,7 @@ mod tests { assert_eq!( Staking::eras_stakers(1, i as u64), - staking::Exposure { + pallet_staking::Exposure { total: 10_000, own: 10_000, others: vec![], @@ -3285,7 +3285,7 @@ mod tests { assert_eq!( Staking::eras_stakers(Staking::current_era().unwrap(), 0), - staking::Exposure { + pallet_staking::Exposure { total: 0, own: 0, others: vec![], @@ -3299,7 +3299,7 @@ mod tests { assert_eq!( Staking::eras_stakers(2, i as u64), - staking::Exposure { + pallet_staking::Exposure { total: 10_000, own: 10_000, others: vec![], @@ -3350,7 +3350,7 @@ mod tests { assert_eq!( Staking::eras_stakers(1, i as u64), - staking::Exposure { + pallet_staking::Exposure { total: 10_000, own: 10_000, others: vec![], @@ -3379,7 +3379,7 @@ mod tests { assert_eq!( Staking::eras_stakers(2, 0), - staking::Exposure { + pallet_staking::Exposure { total: 0, own: 0, others: vec![], @@ -3393,7 +3393,7 @@ mod tests { assert_eq!( Staking::eras_stakers(2, i as u64), - staking::Exposure { + pallet_staking::Exposure { total: 10_000, own: 10_000, others: vec![], @@ -3447,7 +3447,7 @@ mod tests { assert_eq!( Staking::eras_stakers(1, i as u64), - staking::Exposure { + pallet_staking::Exposure { total: 10_000, own: 10_000, others: vec![], @@ -3479,7 +3479,7 @@ mod tests { assert_eq!( Staking::eras_stakers(2, 0), - staking::Exposure { + pallet_staking::Exposure { total: 0, own: 0, others: vec![], @@ -3493,7 +3493,7 @@ mod tests { assert_eq!( Staking::eras_stakers(2, i as u64), - staking::Exposure { + pallet_staking::Exposure { total: 10_000, own: 10_000, others: vec![], @@ -3611,7 +3611,7 @@ mod tests { assert_eq!( Staking::eras_stakers(1, i as u64), - staking::Exposure { + pallet_staking::Exposure { total: 10_000, own: 10_000, others: vec![], @@ -3643,7 +3643,7 @@ mod tests { assert_eq!( Staking::eras_stakers(1, i as u64), - staking::Exposure { + pallet_staking::Exposure { total: 10_000, own: 10_000, others: vec![], diff --git a/runtime/common/src/paras_sudo_wrapper.rs b/runtime/common/src/paras_sudo_wrapper.rs index e1e1ccae09..d165123b42 100644 --- a/runtime/common/src/paras_sudo_wrapper.rs +++ b/runtime/common/src/paras_sudo_wrapper.rs @@ -21,7 +21,7 @@ use frame_support::{ dispatch::DispatchResult, weights::DispatchClass, }; -use system::ensure_root; +use frame_system::ensure_root; use runtime_parachains::paras::{ self, ParaGenesisArgs, @@ -37,7 +37,7 @@ decl_error! { decl_module! { /// A sudo wrapper to call into v1 paras module. - pub struct Module for enum Call where origin: ::Origin, system = system { + pub struct Module for enum Call where origin: ::Origin { type Error = Error; /// Schedule a para to be initialized at the start of the next session. diff --git a/runtime/common/src/purchase.rs b/runtime/common/src/purchase.rs index 9a1856a549..ff36013f55 100644 --- a/runtime/common/src/purchase.rs +++ b/runtime/common/src/purchase.rs @@ -23,14 +23,14 @@ use frame_support::{decl_event, decl_storage, decl_module, decl_error, ensure}; use frame_support::traits::{ EnsureOrigin, Currency, ExistenceRequirement, VestingSchedule, Get }; -use system::ensure_signed; +use frame_system::ensure_signed; use sp_core::sr25519; use sp_std::prelude::*; /// Configuration trait. -pub trait Trait: system::Trait { +pub trait Trait: frame_system::Trait { /// The overarching event type. - type Event: From> + Into<::Event>; + type Event: From> + Into<::Event>; /// Balances Pallet type Currency: Currency; /// Vesting Pallet @@ -47,7 +47,7 @@ pub trait Trait: system::Trait { type MaxUnlocked: Get>; } -type BalanceOf = <::Currency as Currency<::AccountId>>::Balance; +type BalanceOf = <::Currency as Currency<::AccountId>>::Balance; /// The kind of a statement an account needs to make for a claim to be valid. #[derive(Encode, Decode, Clone, Copy, Eq, PartialEq, RuntimeDebug)] @@ -103,9 +103,9 @@ pub struct AccountStatus { decl_event!( pub enum Event where - AccountId = ::AccountId, + AccountId = ::AccountId, Balance = BalanceOf, - BlockNumber = ::BlockNumber, + BlockNumber = ::BlockNumber, { /// A new account was created AccountCreated(AccountId), @@ -159,7 +159,7 @@ decl_storage! { } decl_module! { - pub struct Module for enum Call where origin: T::Origin, system = system { + pub struct Module for enum Call where origin: T::Origin { type Error = Error; /// The maximum statement length for the statement users to sign when creating an account. @@ -332,7 +332,7 @@ decl_module! { #[weight = T::DbWeight::get().writes(1)] fn set_unlock_block(origin, unlock_block: T::BlockNumber) { T::ConfigurationOrigin::ensure_origin(origin)?; - ensure!(unlock_block > system::Module::::block_number(), Error::::InvalidUnlockBlock); + ensure!(unlock_block > frame_system::Module::::block_number(), Error::::InvalidUnlockBlock); // Possibly this is worse than having the caller account be the payment account? UnlockBlock::::set(unlock_block); Self::deposit_event(RawEvent::UnlockBlockUpdated(unlock_block)); @@ -388,10 +388,10 @@ mod tests { ord_parameter_types, dispatch::DispatchError::BadOrigin, }; use frame_support::traits::Currency; - use balances::Error as BalancesError; + use pallet_balances::Error as BalancesError; impl_outer_origin! { - pub enum Origin for Test where system = system {} + pub enum Origin for Test {} } impl_outer_dispatch! { @@ -414,7 +414,7 @@ mod tests { pub const MaximumBlockLength: u32 = 4 * 1024 * 1024; pub const AvailableBlockRatio: Perbill = Perbill::from_percent(75); } - impl system::Trait for Test { + impl frame_system::Trait for Test { type BaseCallFilter = (); type Origin = Origin; type Call = Call; @@ -436,7 +436,7 @@ mod tests { type AvailableBlockRatio = AvailableBlockRatio; type Version = (); type ModuleToIndex = (); - type AccountData = balances::AccountData; + type AccountData = pallet_balances::AccountData; type OnNewAccount = (); type OnKilledAccount = Balances; type SystemWeightInfo = (); @@ -446,7 +446,7 @@ mod tests { pub const ExistentialDeposit: u64 = 1; } - impl balances::Trait for Test { + impl pallet_balances::Trait for Test { type Balance = u64; type Event = (); type DustRemoval = (); @@ -459,7 +459,7 @@ mod tests { pub const MinVestedTransfer: u64 = 0; } - impl vesting::Trait for Test { + impl pallet_vesting::Trait for Test { type Event = (); type Currency = Balances; type BlockNumberToBalance = Identity; @@ -483,22 +483,22 @@ mod tests { type Event = (); type Currency = Balances; type VestingSchedule = Vesting; - type ValidityOrigin = system::EnsureSignedBy; - type ConfigurationOrigin = system::EnsureSignedBy; + type ValidityOrigin = frame_system::EnsureSignedBy; + type ConfigurationOrigin = frame_system::EnsureSignedBy; type MaxStatementLength = MaxStatementLength; type UnlockedProportion = UnlockedProportion; type MaxUnlocked = MaxUnlocked; } - type System = system::Module; - type Balances = balances::Module; - type Vesting = vesting::Module; + type System = frame_system::Module; + type Balances = pallet_balances::Module; + type Vesting = pallet_vesting::Module; type Purchase = Module; // This function basically just builds a genesis storage key/value store according to // our desired mockup. It also executes our `setup` function which sets up this pallet for use. pub fn new_test_ext() -> sp_io::TestExternalities { - let t = system::GenesisConfig::default().build_storage::().unwrap(); + let t = frame_system::GenesisConfig::default().build_storage::().unwrap(); let mut ext = sp_io::TestExternalities::new(t); ext.execute_with(|| setup()); ext @@ -948,7 +948,7 @@ mod tests { ); // Vesting lock is removed in whole on block 101 (100 blocks after block 1) System::set_block_number(100); - let vest_call = Call::Vesting(vesting::Call::::vest()); + let vest_call = Call::Vesting(pallet_vesting::Call::::vest()); assert_ok!(vest_call.clone().dispatch(Origin::signed(alice()))); assert_ok!(vest_call.clone().dispatch(Origin::signed(bob()))); assert_eq!(::VestingSchedule::vesting_balance(&alice()), Some(45)); diff --git a/runtime/common/src/registrar.rs b/runtime/common/src/registrar.rs index bf56d733ca..eeb4552fee 100644 --- a/runtime/common/src/registrar.rs +++ b/runtime/common/src/registrar.rs @@ -33,7 +33,7 @@ use frame_support::{ dispatch::{DispatchResult, IsSubType}, traits::{Get, Currency, ReservableCurrency}, weights::{DispatchClass, Weight}, }; -use system::{self, ensure_root, ensure_signed}; +use frame_system::{self, ensure_root, ensure_signed}; use primitives::v0::{ Id as ParaId, CollatorId, Scheduling, LOWEST_USER_ID, SwapAux, Info as ParaInfo, ActiveParas, Retriable, ValidationCode, HeadData, @@ -129,17 +129,17 @@ impl Registrar for Module { } type BalanceOf = - <::Currency as Currency<::AccountId>>::Balance; + <::Currency as Currency<::AccountId>>::Balance; pub trait Trait: parachains::Trait { /// The overarching event type. - type Event: From + Into<::Event>; + type Event: From + Into<::Event>; /// The aggregated origin type must support the parachains origin. We require that we can /// infallibly convert between this origin and the system origin, but in reality, they're the /// same type, we just can't express that to the Rust type system without writing a `where` /// clause everywhere. - type Origin: From<::Origin> + type Origin: From<::Origin> + Into::Origin>>; /// The system's currency for parathread payment. @@ -254,7 +254,7 @@ decl_error! { decl_module! { /// Parachains module. - pub struct Module for enum Call where origin: ::Origin, system = system { + pub struct Module for enum Call where origin: ::Origin { type Error = Error; fn deposit_event() = default; @@ -561,10 +561,10 @@ impl ActiveParas for Module { /// Ensure that parathread selections happen prioritized by fees. #[derive(Encode, Decode, Clone, Eq, PartialEq)] pub struct LimitParathreadCommits(sp_std::marker::PhantomData) where - ::Call: IsSubType>; + ::Call: IsSubType>; impl LimitParathreadCommits where - ::Call: IsSubType> + ::Call: IsSubType> { /// Create a new `LimitParathreadCommits` struct. pub fn new() -> Self { @@ -573,7 +573,7 @@ impl LimitParathreadCommits where } impl sp_std::fmt::Debug for LimitParathreadCommits where - ::Call: IsSubType> + ::Call: IsSubType> { fn fmt(&self, f: &mut sp_std::fmt::Formatter) -> sp_std::fmt::Result { write!(f, "LimitParathreadCommits") @@ -590,11 +590,11 @@ pub enum ValidityError { } impl SignedExtension for LimitParathreadCommits where - ::Call: IsSubType> + ::Call: IsSubType> { const IDENTIFIER: &'static str = "LimitParathreadCommits"; type AccountId = T::AccountId; - type Call = ::Call; + type Call = ::Call; type AdditionalSigned = (); type Pre = (); @@ -688,7 +688,7 @@ mod tests { use crate::attestations; impl_outer_origin! { - pub enum Origin for Test where system = system { + pub enum Origin for Test { parachains, } } @@ -720,7 +720,7 @@ mod tests { pub const MaximumBlockLength: u32 = 4 * 1024 * 1024; pub const AvailableBlockRatio: Perbill = Perbill::from_percent(75); } - impl system::Trait for Test { + impl frame_system::Trait for Test { type BaseCallFilter = (); type Origin = Origin; type Call = Call; @@ -742,13 +742,13 @@ mod tests { type AvailableBlockRatio = AvailableBlockRatio; type Version = (); type ModuleToIndex = (); - type AccountData = balances::AccountData; + type AccountData = pallet_balances::AccountData; type OnNewAccount = (); type OnKilledAccount = Balances; type SystemWeightInfo = (); } - impl system::offchain::SendTransactionTypes for Test where + impl frame_system::offchain::SendTransactionTypes for Test where Call: From, { type OverarchingCall = Call; @@ -759,7 +759,7 @@ mod tests { pub const ExistentialDeposit: Balance = 1; } - impl balances::Trait for Test { + impl pallet_balances::Trait for Test { type Balance = u128; type DustRemoval = (); type Event = (); @@ -775,7 +775,7 @@ mod tests { impl slots::Trait for Test { type Event = (); - type Currency = balances::Module; + type Currency = pallet_balances::Module; type Parachains = Registrar; type EndingPeriod = EndingPeriod; type LeasePeriod = LeasePeriod; @@ -783,11 +783,11 @@ mod tests { } parameter_types!{ - pub const SlashDeferDuration: staking::EraIndex = 7; + pub const SlashDeferDuration: pallet_staking::EraIndex = 7; pub const AttestationPeriod: BlockNumber = 100; pub const MinimumPeriod: u64 = 3; pub const SessionsPerEra: sp_staking::SessionIndex = 6; - pub const BondingDuration: staking::EraIndex = 28; + pub const BondingDuration: pallet_staking::EraIndex = 28; pub const MaxNominatorRewardedPerValidator: u32 = 64; } @@ -804,12 +804,12 @@ mod tests { pub const RewardCurve: &'static PiecewiseLinear<'static> = &REWARD_CURVE; } - impl session::Trait for Test { + impl pallet_session::Trait for Test { type SessionManager = (); type Keys = UintAuthorityId; - type ShouldEndSession = session::PeriodicSessions; - type NextSessionRotation = session::PeriodicSessions; - type SessionHandler = session::TestSessionHandler; + type ShouldEndSession = pallet_session::PeriodicSessions; + type NextSessionRotation = pallet_session::PeriodicSessions; + type SessionHandler = pallet_session::TestSessionHandler; type Event = (); type ValidatorId = u64; type ValidatorIdOf = (); @@ -828,19 +828,19 @@ mod tests { pub const StakingUnsignedPriority: u64 = u64::max_value() / 2; } - impl staking::Trait for Test { + impl pallet_staking::Trait for Test { type RewardRemainder = (); type CurrencyToVote = (); type Event = (); - type Currency = balances::Module; + type Currency = pallet_balances::Module; type Slash = (); type Reward = (); type SessionsPerEra = SessionsPerEra; type BondingDuration = BondingDuration; type SlashDeferDuration = SlashDeferDuration; - type SlashCancelOrigin = system::EnsureRoot; + type SlashCancelOrigin = frame_system::EnsureRoot; type SessionInterface = Self; - type UnixTime = timestamp::Module; + type UnixTime = pallet_timestamp::Module; type RewardCurve = RewardCurve; type MaxNominatorRewardedPerValidator = MaxNominatorRewardedPerValidator; type NextNewSession = Session; @@ -852,16 +852,16 @@ mod tests { type WeightInfo = (); } - impl timestamp::Trait for Test { + impl pallet_timestamp::Trait for Test { type Moment = u64; type OnTimestampSet = (); type MinimumPeriod = MinimumPeriod; type WeightInfo = (); } - impl session::historical::Trait for Test { - type FullIdentification = staking::Exposure; - type FullIdentificationOf = staking::ExposureOf; + impl pallet_session::historical::Trait for Test { + type FullIdentification = pallet_staking::Exposure; + type FullIdentificationOf = pallet_staking::ExposureOf; } // This is needed for a custom `AccountId` type which is `u64` in testing here. @@ -889,7 +889,7 @@ mod tests { pub type ReporterId = app::Public; pub struct ReporterAuthorityId; - impl system::offchain::AppCrypto for ReporterAuthorityId { + impl frame_system::offchain::AppCrypto for ReporterAuthorityId { type RuntimeAppPublic = ReporterId; type GenericSignature = sr25519::Signature; type GenericPublic = sr25519::Public; @@ -900,7 +900,7 @@ mod tests { type AuthorityId = test_keys::ReporterAuthorityId; type Origin = Origin; type Call = Call; - type ParachainCurrency = balances::Module; + type ParachainCurrency = pallet_balances::Module; type BlockNumberConversion = sp_runtime::traits::Identity; type ActiveParachains = Registrar; type Registrar = Registrar; @@ -911,7 +911,7 @@ mod tests { type ValidationUpgradeDelay = ValidationUpgradeDelay; type SlashPeriod = SlashPeriod; type Proof = sp_session::MembershipProof; - type KeyOwnerProofSystem = session::historical::Module; + type KeyOwnerProofSystem = pallet_session::historical::Module; type IdentificationTuple = , @@ -922,20 +922,20 @@ mod tests { type Extrinsic = TestXt; - impl system::offchain::CreateSignedTransaction for Test where + impl frame_system::offchain::CreateSignedTransaction for Test where Call: From, { - fn create_transaction>( + fn create_transaction>( call: Call, _public: test_keys::ReporterId, - _account: ::AccountId, - nonce: ::Index, + _account: ::AccountId, + nonce: ::Index, ) -> Option<(Call, ::SignaturePayload)> { Some((call, (nonce, ()))) } } - impl system::offchain::SigningTypes for Test { + impl frame_system::offchain::SigningTypes for Test { type Public = test_keys::ReporterId; type Signature = Signature; } @@ -949,21 +949,21 @@ mod tests { impl Trait for Test { type Event = (); type Origin = Origin; - type Currency = balances::Module; + type Currency = pallet_balances::Module; type ParathreadDeposit = ParathreadDeposit; type SwapAux = slots::Module; type QueueSize = QueueSize; type MaxRetries = MaxRetries; } - type Balances = balances::Module; + type Balances = pallet_balances::Module; type Parachains = parachains::Module; - type System = system::Module; + type System = frame_system::Module; type Slots = slots::Module; type Registrar = Module; - type RandomnessCollectiveFlip = randomness_collective_flip::Module; - type Session = session::Module; - type Staking = staking::Module; + type RandomnessCollectiveFlip = pallet_randomness_collective_flip::Module; + type Session = pallet_session::Module; + type Staking = pallet_staking::Module; const AUTHORITY_KEYS: [Sr25519Keyring; 8] = [ Sr25519Keyring::Alice, @@ -977,7 +977,7 @@ mod tests { ]; fn new_test_ext(parachains: Vec<(ParaId, ValidationCode, HeadData)>) -> TestExternalities { - let mut t = system::GenesisConfig::default().build_storage::().unwrap(); + let mut t = frame_system::GenesisConfig::default().build_storage::().unwrap(); let authority_keys = [ Sr25519Keyring::Alice, @@ -1008,11 +1008,11 @@ mod tests { _phdata: Default::default(), }.assimilate_storage(&mut t).unwrap(); - session::GenesisConfig:: { + pallet_session::GenesisConfig:: { keys: session_keys, }.assimilate_storage(&mut t).unwrap(); - balances::GenesisConfig:: { + pallet_balances::GenesisConfig:: { balances, }.assimilate_storage(&mut t).unwrap(); @@ -1034,7 +1034,7 @@ mod tests { println!("Finalizing {}", System::block_number()); if !parachains::DidUpdate::exists() { println!("Null heads update"); - assert_ok!(Parachains::set_heads(system::RawOrigin::None.into(), vec![])); + assert_ok!(Parachains::set_heads(frame_system::RawOrigin::None.into(), vec![])); } Slots::on_finalize(System::block_number()); Parachains::on_finalize(System::block_number()); @@ -1082,7 +1082,7 @@ mod tests { }; let (candidate, _) = candidate.abridge(); let candidate_hash = candidate.hash(); - let payload = (Statement::Valid(candidate_hash), session::Module::::current_index(), System::parent_hash()).encode(); + let payload = (Statement::Valid(candidate_hash), pallet_session::Module::::current_index(), System::parent_hash()).encode(); let roster = Parachains::calculate_duty_roster().0.validator_duty; AttestedCandidate { candidate, @@ -1498,8 +1498,8 @@ mod tests { let good_para_id = user_id(0); let bad_para_id = user_id(1); - let bad_head_hash = ::Hashing::hash(&vec![1, 2, 1]); - let good_head_hash = ::Hashing::hash(&vec![1, 1, 1]); + let bad_head_hash = ::Hashing::hash(&vec![1, 2, 1]); + let good_head_hash = ::Hashing::hash(&vec![1, 1, 1]); let info = &DispatchInfo::default(); // Allow for threads @@ -1562,7 +1562,7 @@ mod tests { for x in 0..5 { let para_id = user_id(x as u32); let collator_id = CollatorId::default(); - let head_hash = ::Hashing::hash(&vec![x; 3]); + let head_hash = ::Hashing::hash(&vec![x; 3]); let inner = super::Call::select_parathread(para_id, collator_id, head_hash); let call = Call::Registrar(inner); let info = &DispatchInfo::default(); diff --git a/runtime/common/src/slots.rs b/runtime/common/src/slots.rs index 5fe4c3b048..0731900c5a 100644 --- a/runtime/common/src/slots.rs +++ b/runtime/common/src/slots.rs @@ -31,16 +31,16 @@ use frame_support::{ use primitives::v0::{ SwapAux, PARACHAIN_INFO, Id as ParaId, ValidationCode, HeadData, }; -use system::{ensure_signed, ensure_root}; +use frame_system::{ensure_signed, ensure_root}; use crate::registrar::{Registrar, swap_ordered_existence}; use crate::slot_range::{SlotRange, SLOT_RANGE_COUNT}; -type BalanceOf = <::Currency as Currency<::AccountId>>::Balance; +type BalanceOf = <::Currency as Currency<::AccountId>>::Balance; /// The module's configuration trait. -pub trait Trait: system::Trait { +pub trait Trait: frame_system::Trait { /// The overarching event type. - type Event: From> + Into<::Event>; + type Event: From> + Into<::Event>; /// The currency type used for bidding. type Currency: ReservableCurrency; @@ -118,14 +118,14 @@ pub enum IncomingParachain { Deploy { code: ValidationCode, initial_head_data: HeadData }, } -type LeasePeriodOf = ::BlockNumber; +type LeasePeriodOf = ::BlockNumber; // Winning data type. This encodes the top bidders of each range together with their bid. type WinningData = - [Option<(Bidder<::AccountId>, BalanceOf)>; SLOT_RANGE_COUNT]; + [Option<(Bidder<::AccountId>, BalanceOf)>; SLOT_RANGE_COUNT]; // Winners data type. This encodes each of the final winners of a parachain auction, the parachain // index assigned to them, their winning bid and the range that they won. type WinnersData = - Vec<(Option::AccountId>>, ParaId, BalanceOf, SlotRange)>; + Vec<(Option::AccountId>>, ParaId, BalanceOf, SlotRange)>; // This module's storage items. decl_storage! { @@ -204,8 +204,8 @@ impl SwapAux for Module { decl_event!( pub enum Event where - AccountId = ::AccountId, - BlockNumber = ::BlockNumber, + AccountId = ::AccountId, + BlockNumber = ::BlockNumber, LeasePeriod = LeasePeriodOf, ParaId = ParaId, Balance = BalanceOf, @@ -262,7 +262,7 @@ decl_error! { } decl_module! { - pub struct Module for enum Call where origin: T::Origin, system = system { + pub struct Module for enum Call where origin: T::Origin { type Error = Error; fn deposit_event() = default; @@ -322,7 +322,7 @@ decl_module! { let n = ::mutate(|n| { *n += 1; *n }); // Set the information. - let ending = >::block_number() + duration; + let ending = >::block_number() + duration; >::put((lease_period_index, ending)); Self::deposit_event(RawEvent::AuctionStarted(n, lease_period_index, ending)) @@ -459,7 +459,7 @@ decl_module! { .ok_or(Error::::ParaNotOnboarding)?; if let IncomingParachain::Fixed{code_hash, code_size, initial_head_data} = details { ensure!(code.0.len() as u32 == code_size, Error::::InvalidCode); - ensure!(::Hashing::hash(&code.0) == code_hash, Error::::InvalidCode); + ensure!(::Hashing::hash(&code.0) == code_hash, Error::::InvalidCode); if starts > Self::lease_period_index() { // Hasn't yet begun. Replace the on-boarding entry with the new information. @@ -507,7 +507,7 @@ impl Module { /// Returns the current lease period. fn lease_period_index() -> LeasePeriodOf { - (>::block_number() / T::LeasePeriod::get()).into() + (>::block_number() / T::LeasePeriod::get()).into() } /// Some when the auction's end is known (with the end block number). None if it is unknown. @@ -751,7 +751,7 @@ impl Module { // Range as an array index. let range_index = range as u8 as usize; // The offset into the auction ending set. - let offset = Self::is_ending(>::block_number()).unwrap_or_default(); + let offset = Self::is_ending(>::block_number()).unwrap_or_default(); // The current winning ranges. let mut current_winning = >::get(offset) .or_else(|| offset.checked_sub(&One::one()).and_then(>::get)) @@ -889,11 +889,11 @@ mod tests { impl_outer_origin, parameter_types, assert_ok, assert_noop, traits::{OnInitialize, OnFinalize} }; - use balances; + use pallet_balances; use primitives::v0::{BlockNumber, Header, Id as ParaId, Info as ParaInfo, Scheduling}; impl_outer_origin! { - pub enum Origin for Test where system = system {} + pub enum Origin for Test {} } // For testing the module, we construct most of a mock runtime. This means @@ -907,7 +907,7 @@ mod tests { pub const MaximumBlockLength: u32 = 4 * 1024 * 1024; pub const AvailableBlockRatio: Perbill = Perbill::from_percent(75); } - impl system::Trait for Test { + impl frame_system::Trait for Test { type BaseCallFilter = (); type Origin = Origin; type Call = (); @@ -929,7 +929,7 @@ mod tests { type AvailableBlockRatio = AvailableBlockRatio; type Version = (); type ModuleToIndex = (); - type AccountData = balances::AccountData; + type AccountData = pallet_balances::AccountData; type OnNewAccount = (); type OnKilledAccount = Balances; type SystemWeightInfo = (); @@ -939,7 +939,7 @@ mod tests { pub const ExistentialDeposit: u64 = 1; } - impl balances::Trait for Test { + impl pallet_balances::Trait for Test { type Balance = u64; type Event = (); type DustRemoval = (); @@ -1025,16 +1025,16 @@ mod tests { type Randomness = RandomnessCollectiveFlip; } - type System = system::Module; - type Balances = balances::Module; + type System = frame_system::Module; + type Balances = pallet_balances::Module; type Slots = Module; - type RandomnessCollectiveFlip = randomness_collective_flip::Module; + type RandomnessCollectiveFlip = pallet_randomness_collective_flip::Module; // This function basically just builds a genesis storage key/value store according to // our desired mock up. fn new_test_ext() -> sp_io::TestExternalities { - let mut t = system::GenesisConfig::default().build_storage::().unwrap(); - balances::GenesisConfig::{ + let mut t = frame_system::GenesisConfig::default().build_storage::().unwrap(); + pallet_balances::GenesisConfig::{ balances: vec![(1, 10), (2, 20), (3, 30), (4, 40), (5, 50), (6, 60)], }.assimilate_storage(&mut t).unwrap(); t.into() diff --git a/runtime/kusama/Cargo.toml b/runtime/kusama/Cargo.toml index b8f2e5a248..8b56dc17fa 100644 --- a/runtime/kusama/Cargo.toml +++ b/runtime/kusama/Cargo.toml @@ -26,44 +26,44 @@ sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "master sp-staking = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } sp-core = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } sp-session = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -version = { package = "sp-version", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +sp-version = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } tx-pool-api = { package = "sp-transaction-pool", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } block-builder-api = { package = "sp-block-builder", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -authority-discovery = { package = "pallet-authority-discovery", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -authorship = { package = "pallet-authorship", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -babe = { package = "pallet-babe", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -balances = { package = "pallet-balances", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -transaction-payment = { package = "pallet-transaction-payment", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -transaction-payment-rpc-runtime-api = { package = "pallet-transaction-payment-rpc-runtime-api", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -collective = { package = "pallet-collective", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -democracy = { package = "pallet-democracy", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -elections-phragmen = { package = "pallet-elections-phragmen", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -executive = { package = "frame-executive", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -finality-tracker = { package = "pallet-finality-tracker", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -grandpa = { package = "pallet-grandpa", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -identity = { package = "pallet-identity", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -im-online = { package = "pallet-im-online", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -indices = { package = "pallet-indices", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -membership = { package = "pallet-membership", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -multisig = { package = "pallet-multisig", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -nicks = { package = "pallet-nicks", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -offences = { package = "pallet-offences", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -proxy = { package = "pallet-proxy", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -randomness-collective-flip = { package = "pallet-randomness-collective-flip", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -recovery = { package = "pallet-recovery", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -scheduler = { package = "pallet-scheduler", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -session = { package = "pallet-session", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -society = { package = "pallet-society", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-authority-discovery = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-authorship = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-babe = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-balances = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-transaction-payment = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-transaction-payment-rpc-runtime-api = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-collective = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-democracy = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-elections-phragmen = { package = "pallet-elections-phragmen", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +frame-executive = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-finality-tracker = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-grandpa = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-identity = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-im-online = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-indices = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-membership = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-multisig = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-nicks = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-offences = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-proxy = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-randomness-collective-flip = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-recovery = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-scheduler = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-session = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-society = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } frame-support = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -staking = { package = "pallet-staking", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-staking = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } pallet-staking-reward-curve = { package = "pallet-staking-reward-curve", git = "https://github.com/paritytech/substrate", branch = "master" } -system = { package = "frame-system", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -system_rpc_runtime_api = { package = "frame-system-rpc-runtime-api", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -timestamp = { package = "pallet-timestamp", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -treasury = { package = "pallet-treasury", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -utility = { package = "pallet-utility", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -vesting = { package = "pallet-vesting", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +frame-system = {git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +frame-system-rpc-runtime-api = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-timestamp = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-treasury = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-utility = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-vesting = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } frame-benchmarking = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false, optional = true } pallet-offences-benchmarking = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false, optional = true } @@ -91,7 +91,7 @@ no_std = [] only-staking = [] std = [ "authority-discovery-primitives/std", - "authority-discovery/std", + "pallet-authority-discovery/std", "bitvec/std", "primitives/std", "rustc-hex/std", @@ -105,45 +105,45 @@ std = [ "sp-std/std", "sp-io/std", "frame-support/std", - "authorship/std", - "balances/std", - "transaction-payment/std", - "transaction-payment-rpc-runtime-api/std", - "collective/std", - "elections-phragmen/std", - "democracy/std", - "executive/std", - "finality-tracker/std", - "grandpa/std", - "identity/std", - "im-online/std", - "indices/std", - "membership/std", - "multisig/std", - "nicks/std", - "offences/std", - "proxy/std", - "recovery/std", + "pallet-authorship/std", + "pallet-balances/std", + "pallet-transaction-payment/std", + "pallet-transaction-payment-rpc-runtime-api/std", + "pallet-collective/std", + "pallet-elections-phragmen/std", + "pallet-democracy/std", + "frame-executive/std", + "pallet-finality-tracker/std", + "pallet-grandpa/std", + "pallet-identity/std", + "pallet-im-online/std", + "pallet-indices/std", + "pallet-membership/std", + "pallet-multisig/std", + "pallet-nicks/std", + "pallet-offences/std", + "pallet-proxy/std", + "pallet-recovery/std", "sp-runtime/std", "sp-staking/std", - "scheduler/std", - "session/std", - "society/std", - "staking/std", - "system/std", - "system_rpc_runtime_api/std", - "timestamp/std", - "treasury/std", - "version/std", - "utility/std", - "vesting/std", + "pallet-scheduler/std", + "pallet-session/std", + "pallet-society/std", + "pallet-staking/std", + "frame-system/std", + "frame-system-rpc-runtime-api/std", + "pallet-timestamp/std", + "pallet-treasury/std", + "sp-version/std", + "pallet-utility/std", + "pallet-vesting/std", "serde_derive", "serde/std", "log", - "babe/std", + "pallet-babe/std", "babe-primitives/std", "sp-session/std", - "randomness-collective-flip/std", + "pallet-randomness-collective-flip/std", "runtime-common/std", ] runtime-benchmarks = [ @@ -151,21 +151,21 @@ runtime-benchmarks = [ "frame-benchmarking", "frame-support/runtime-benchmarks", "frame-system-benchmarking", - "system/runtime-benchmarks", + "frame-system/runtime-benchmarks", "sp-runtime/runtime-benchmarks", - "balances/runtime-benchmarks", - "collective/runtime-benchmarks", - "democracy/runtime-benchmarks", - "elections-phragmen/runtime-benchmarks", - "identity/runtime-benchmarks", - "im-online/runtime-benchmarks", - "scheduler/runtime-benchmarks", - "society/runtime-benchmarks", - "staking/runtime-benchmarks", - "timestamp/runtime-benchmarks", - "treasury/runtime-benchmarks", - "utility/runtime-benchmarks", - "vesting/runtime-benchmarks", + "pallet-balances/runtime-benchmarks", + "pallet-collective/runtime-benchmarks", + "pallet-democracy/runtime-benchmarks", + "pallet-elections-phragmen/runtime-benchmarks", + "pallet-identity/runtime-benchmarks", + "pallet-im-online/runtime-benchmarks", + "pallet-scheduler/runtime-benchmarks", + "pallet-society/runtime-benchmarks", + "pallet-staking/runtime-benchmarks", + "pallet-timestamp/runtime-benchmarks", + "pallet-treasury/runtime-benchmarks", + "pallet-utility/runtime-benchmarks", + "pallet-vesting/runtime-benchmarks", "pallet-offences-benchmarking", "pallet-session-benchmarking", "hex-literal", diff --git a/runtime/kusama/src/constants.rs b/runtime/kusama/src/constants.rs index 560d83347d..5d81cf0bb8 100644 --- a/runtime/kusama/src/constants.rs +++ b/runtime/kusama/src/constants.rs @@ -69,7 +69,7 @@ pub mod fee { /// node's balance type. /// /// This should typically create a mapping between the following ranges: - /// - [0, system::MaximumBlockWeight] + /// - [0, frame_system::MaximumBlockWeight] /// - [Balance::min, Balance::max] /// /// Yet, it can be used for any other sort of change to weight-fee. Some examples being: diff --git a/runtime/kusama/src/lib.rs b/runtime/kusama/src/lib.rs index 0780de62c4..e2f9b03a04 100644 --- a/runtime/kusama/src/lib.rs +++ b/runtime/kusama/src/lib.rs @@ -47,10 +47,10 @@ use sp_runtime::{ }; #[cfg(feature = "runtime-benchmarks")] use sp_runtime::RuntimeString; -use version::RuntimeVersion; -use grandpa::{AuthorityId as GrandpaId, fg_primitives}; +use sp_version::RuntimeVersion; +use pallet_grandpa::{AuthorityId as GrandpaId, fg_primitives}; #[cfg(any(feature = "std", test))] -use version::NativeVersion; +use sp_version::NativeVersion; use sp_core::OpaqueMetadata; use sp_staking::SessionIndex; use frame_support::{ @@ -58,19 +58,19 @@ use frame_support::{ traits::{KeyOwnerProofSystem, SplitTwoWays, Randomness, LockIdentifier, Filter, InstanceFilter}, weights::Weight, }; -use system::{EnsureRoot, EnsureOneOf}; -use im_online::sr25519::AuthorityId as ImOnlineId; +use frame_system::{EnsureRoot, EnsureOneOf}; +use pallet_im_online::sr25519::AuthorityId as ImOnlineId; use authority_discovery_primitives::AuthorityId as AuthorityDiscoveryId; -use transaction_payment_rpc_runtime_api::RuntimeDispatchInfo; -use session::{historical as session_historical}; +use pallet_transaction_payment_rpc_runtime_api::RuntimeDispatchInfo; +use pallet_session::{historical as session_historical}; use static_assertions::const_assert; #[cfg(feature = "std")] -pub use staking::StakerStatus; +pub use pallet_staking::StakerStatus; #[cfg(any(feature = "std", test))] pub use sp_runtime::BuildStorage; -pub use timestamp::Call as TimestampCall; -pub use balances::Call as BalancesCall; +pub use pallet_timestamp::Call as TimestampCall; +pub use pallet_balances::Call as BalancesCall; pub use attestations::{Call as AttestationsCall, MORE_ATTESTATIONS_IDENTIFIER}; pub use parachains::Call as ParachainsCall; @@ -95,7 +95,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { #[cfg(not(feature = "disable-runtime-api"))] apis: RUNTIME_API_VERSIONS, #[cfg(feature = "disable-runtime-api")] - apis: version::create_apis_vec![[]], + apis: sp_version::create_apis_vec![[]], transaction_version: 2, }; @@ -119,14 +119,14 @@ impl Filter for BaseFilter { type MoreThanHalfCouncil = EnsureOneOf< AccountId, EnsureRoot, - collective::EnsureProportionMoreThan<_1, _2, AccountId, CouncilCollective> + pallet_collective::EnsureProportionMoreThan<_1, _2, AccountId, CouncilCollective> >; parameter_types! { pub const Version: RuntimeVersion = VERSION; } -impl system::Trait for Runtime { +impl frame_system::Trait for Runtime { type BaseCallFilter = BaseFilter; type Origin = Origin; type Call = Call; @@ -148,13 +148,13 @@ impl system::Trait for Runtime { type AvailableBlockRatio = AvailableBlockRatio; type Version = Version; type ModuleToIndex = ModuleToIndex; - type AccountData = balances::AccountData; + type AccountData = pallet_balances::AccountData; type OnNewAccount = (); type OnKilledAccount = (); type SystemWeightInfo = (); } -impl scheduler::Trait for Runtime { +impl pallet_scheduler::Trait for Runtime { type Event = Event; type Origin = Origin; type PalletsOrigin = OriginCaller; @@ -169,34 +169,34 @@ parameter_types! { pub const ExpectedBlockTime: Moment = MILLISECS_PER_BLOCK; } -impl babe::Trait for Runtime { +impl pallet_babe::Trait for Runtime { type EpochDuration = EpochDuration; type ExpectedBlockTime = ExpectedBlockTime; // session module is the trigger - type EpochChangeTrigger = babe::ExternalTrigger; + type EpochChangeTrigger = pallet_babe::ExternalTrigger; type KeyOwnerProofSystem = Historical; type KeyOwnerProof = >::Proof; type KeyOwnerIdentification = >::IdentificationTuple; type HandleEquivocation = - babe::EquivocationHandler; + pallet_babe::EquivocationHandler; } parameter_types! { pub const IndexDeposit: Balance = 1 * DOLLARS; } -impl indices::Trait for Runtime { +impl pallet_indices::Trait for Runtime { type AccountIndex = AccountIndex; type Currency = Balances; type Deposit = IndexDeposit; @@ -216,20 +216,20 @@ pub type DealWithFees = SplitTwoWays< _1, ToAuthor, // 1 part (20%) goes to the block author. >; -impl balances::Trait for Runtime { +impl pallet_balances::Trait for Runtime { type Balance = Balance; type DustRemoval = (); type Event = Event; type ExistentialDeposit = ExistentialDeposit; type AccountStore = System; - type WeightInfo = weights::balances::WeightInfo; + type WeightInfo = weights::pallet_balances::WeightInfo; } parameter_types! { pub const TransactionByteFee: Balance = 10 * MILLICENTS; } -impl transaction_payment::Trait for Runtime { +impl pallet_transaction_payment::Trait for Runtime { type Currency = Balances; type OnTransactionPayment = DealWithFees; type TransactionByteFee = TransactionByteFee; @@ -240,7 +240,7 @@ impl transaction_payment::Trait for Runtime { parameter_types! { pub const MinimumPeriod: u64 = SLOT_DURATION / 2; } -impl timestamp::Trait for Runtime { +impl pallet_timestamp::Trait for Runtime { type Moment = u64; type OnTimestampSet = Babe; type MinimumPeriod = MinimumPeriod; @@ -252,8 +252,8 @@ parameter_types! { } // TODO: substrate#2986 implement this properly -impl authorship::Trait for Runtime { - type FindAuthor = session::FindAccountFromAuthorIndex; +impl pallet_authorship::Trait for Runtime { + type FindAuthor = pallet_session::FindAccountFromAuthorIndex; type UncleGenerations = UncleGenerations; type FilterUncle = (); type EventHandler = (Staking, ImOnline); @@ -278,22 +278,22 @@ parameter_types! { pub const DisabledValidatorsThreshold: Perbill = Perbill::from_percent(17); } -impl session::Trait for Runtime { +impl pallet_session::Trait for Runtime { type Event = Event; type ValidatorId = AccountId; - type ValidatorIdOf = staking::StashOf; + type ValidatorIdOf = pallet_staking::StashOf; type ShouldEndSession = Babe; type NextSessionRotation = Babe; - type SessionManager = session::historical::NoteHistoricalRoot; + type SessionManager = pallet_session::historical::NoteHistoricalRoot; type SessionHandler = ::KeyTypeIdProviders; type Keys = SessionKeys; type DisabledValidatorsThreshold = DisabledValidatorsThreshold; type WeightInfo = (); } -impl session::historical::Trait for Runtime { - type FullIdentification = staking::Exposure; - type FullIdentificationOf = staking::ExposureOf; +impl pallet_session::historical::Trait for Runtime { + type FullIdentification = pallet_staking::Exposure; + type FullIdentificationOf = pallet_staking::ExposureOf; } // TODO #6469: This shouldn't be static, but a lazily cached value, not built unless needed, and @@ -316,9 +316,9 @@ parameter_types! { // Six sessions in an era (6 hours). pub const SessionsPerEra: SessionIndex = 6; // 28 eras for unbonding (7 days). - pub const BondingDuration: staking::EraIndex = 28; + pub const BondingDuration: pallet_staking::EraIndex = 28; // 27 eras in which slashes can be cancelled (slightly less than 7 days). - pub const SlashDeferDuration: staking::EraIndex = 27; + pub const SlashDeferDuration: pallet_staking::EraIndex = 27; pub const RewardCurve: &'static PiecewiseLinear<'static> = &REWARD_CURVE; pub const MaxNominatorRewardedPerValidator: u32 = 64; // quarter of the last session will be for election. @@ -330,10 +330,10 @@ parameter_types! { type SlashCancelOrigin = EnsureOneOf< AccountId, EnsureRoot, - collective::EnsureProportionAtLeast<_1, _2, AccountId, CouncilCollective> + pallet_collective::EnsureProportionAtLeast<_1, _2, AccountId, CouncilCollective> >; -impl staking::Trait for Runtime { +impl pallet_staking::Trait for Runtime { type Currency = Balances; type UnixTime = Timestamp; type CurrencyToVote = CurrencyToVoteHandler; @@ -371,7 +371,7 @@ parameter_types! { pub const MaxVotes: u32 = 100; } -impl democracy::Trait for Runtime { +impl pallet_democracy::Trait for Runtime { type Proposal = Call; type Event = Event; type Currency = Balances; @@ -380,30 +380,30 @@ impl democracy::Trait for Runtime { type VotingPeriod = VotingPeriod; type MinimumDeposit = MinimumDeposit; /// A straight majority of the council can decide what their next motion is. - type ExternalOrigin = collective::EnsureProportionAtLeast<_1, _2, AccountId, CouncilCollective>; + type ExternalOrigin = pallet_collective::EnsureProportionAtLeast<_1, _2, AccountId, CouncilCollective>; /// A majority can have the next scheduled referendum be a straight majority-carries vote. - type ExternalMajorityOrigin = collective::EnsureProportionAtLeast<_1, _2, AccountId, CouncilCollective>; + type ExternalMajorityOrigin = pallet_collective::EnsureProportionAtLeast<_1, _2, AccountId, CouncilCollective>; /// A unanimous council can have the next scheduled referendum be a straight default-carries /// (NTB) vote. - type ExternalDefaultOrigin = collective::EnsureProportionAtLeast<_1, _1, AccountId, CouncilCollective>; + type ExternalDefaultOrigin = pallet_collective::EnsureProportionAtLeast<_1, _1, AccountId, CouncilCollective>; /// Two thirds of the technical committee can have an ExternalMajority/ExternalDefault vote /// be tabled immediately and with a shorter voting/enactment period. - type FastTrackOrigin = collective::EnsureProportionAtLeast<_2, _3, AccountId, TechnicalCollective>; - type InstantOrigin = collective::EnsureProportionAtLeast<_1, _1, AccountId, TechnicalCollective>; + type FastTrackOrigin = pallet_collective::EnsureProportionAtLeast<_2, _3, AccountId, TechnicalCollective>; + type InstantOrigin = pallet_collective::EnsureProportionAtLeast<_1, _1, AccountId, TechnicalCollective>; type InstantAllowed = InstantAllowed; type FastTrackVotingPeriod = FastTrackVotingPeriod; // To cancel a proposal which has been passed, 2/3 of the council must agree to it. - type CancellationOrigin = collective::EnsureProportionAtLeast<_2, _3, AccountId, CouncilCollective>; + type CancellationOrigin = pallet_collective::EnsureProportionAtLeast<_2, _3, AccountId, CouncilCollective>; // Any single technical committee member may veto a coming council proposal, however they can // only do it once and it lasts only for the cooloff period. - type VetoOrigin = collective::EnsureMember; + type VetoOrigin = pallet_collective::EnsureMember; type CooloffPeriod = CooloffPeriod; type PreimageByteDeposit = PreimageByteDeposit; type Slash = Treasury; type Scheduler = Scheduler; type PalletsOrigin = OriginCaller; type MaxVotes = MaxVotes; - type OperationalPreimageOrigin = collective::EnsureMember; + type OperationalPreimageOrigin = pallet_collective::EnsureMember; type WeightInfo = (); } @@ -412,8 +412,8 @@ parameter_types! { pub const CouncilMaxProposals: u32 = 100; } -type CouncilCollective = collective::Instance1; -impl collective::Trait for Runtime { +type CouncilCollective = pallet_collective::Instance1; +impl pallet_collective::Trait for Runtime { type Origin = Origin; type Proposal = Call; type Event = Event; @@ -432,9 +432,9 @@ parameter_types! { pub const ElectionsPhragmenModuleId: LockIdentifier = *b"phrelect"; } // Make sure that there are no more than MAX_MEMBERS members elected via phragmen. -const_assert!(DesiredMembers::get() <= collective::MAX_MEMBERS); +const_assert!(DesiredMembers::get() <= pallet_collective::MAX_MEMBERS); -impl elections_phragmen::Trait for Runtime { +impl pallet_elections_phragmen::Trait for Runtime { type Event = Event; type Currency = Balances; type ChangeMembers = Council; @@ -457,8 +457,8 @@ parameter_types! { pub const TechnicalMaxProposals: u32 = 100; } -type TechnicalCollective = collective::Instance2; -impl collective::Trait for Runtime { +type TechnicalCollective = pallet_collective::Instance2; +impl pallet_collective::Trait for Runtime { type Origin = Origin; type Proposal = Call; type Event = Event; @@ -467,7 +467,7 @@ impl collective::Trait for Runtime { type WeightInfo = (); } -impl membership::Trait for Runtime { +impl pallet_membership::Trait for Runtime { type Event = Event; type AddOrigin = MoreThanHalfCouncil; type RemoveOrigin = MoreThanHalfCouncil; @@ -494,10 +494,10 @@ parameter_types! { type ApproveOrigin = EnsureOneOf< AccountId, EnsureRoot, - collective::EnsureProportionAtLeast<_3, _5, AccountId, CouncilCollective> + pallet_collective::EnsureProportionAtLeast<_3, _5, AccountId, CouncilCollective> >; -impl treasury::Trait for Runtime { +impl pallet_treasury::Trait for Runtime { type Currency = Balances; type ApproveOrigin = ApproveOrigin; type RejectOrigin = MoreThanHalfCouncil; @@ -521,15 +521,15 @@ parameter_types! { pub OffencesWeightSoftLimit: Weight = Perbill::from_percent(60) * MaximumBlockWeight::get(); } -impl offences::Trait for Runtime { +impl pallet_offences::Trait for Runtime { type Event = Event; - type IdentificationTuple = session::historical::IdentificationTuple; + type IdentificationTuple = pallet_session::historical::IdentificationTuple; type OnOffenceHandler = Staking; type WeightSoftLimit = OffencesWeightSoftLimit; type WeightInfo = (); } -impl authority_discovery::Trait for Runtime {} +impl pallet_authority_discovery::Trait for Runtime {} parameter_types! { pub const SessionDuration: BlockNumber = EPOCH_DURATION_IN_BLOCKS as _; @@ -540,7 +540,7 @@ parameter_types! { pub const ImOnlineUnsignedPriority: TransactionPriority = TransactionPriority::max_value(); } -impl im_online::Trait for Runtime { +impl pallet_im_online::Trait for Runtime { type AuthorityId = ImOnlineId; type Event = Event; type ReportUnresponsiveness = Offences; @@ -549,7 +549,7 @@ impl im_online::Trait for Runtime { type WeightInfo = (); } -impl grandpa::Trait for Runtime { +impl pallet_grandpa::Trait for Runtime { type Event = Event; type Call = Call; @@ -563,15 +563,15 @@ impl grandpa::Trait for Runtime { GrandpaId, )>>::IdentificationTuple; - type HandleEquivocation = grandpa::EquivocationHandler; + type HandleEquivocation = pallet_grandpa::EquivocationHandler; } parameter_types! { - pub WindowSize: BlockNumber = finality_tracker::DEFAULT_WINDOW_SIZE.into(); - pub ReportLatency: BlockNumber = finality_tracker::DEFAULT_REPORT_LATENCY.into(); + pub WindowSize: BlockNumber = pallet_finality_tracker::DEFAULT_WINDOW_SIZE.into(); + pub ReportLatency: BlockNumber = pallet_finality_tracker::DEFAULT_REPORT_LATENCY.into(); } -impl finality_tracker::Trait for Runtime { +impl pallet_finality_tracker::Trait for Runtime { type OnFinalizationStalled = (); type WindowSize = WindowSize; type ReportLatency = ReportLatency; @@ -612,7 +612,7 @@ impl parachains::Trait for Runtime { type SlashPeriod = SlashPeriod; type Proof = sp_session::MembershipProof; - type KeyOwnerProofSystem = session::historical::Module; + type KeyOwnerProofSystem = pallet_session::historical::Module; type IdentificationTuple = )>>::IdentificationTuple; type ReportOffence = Offences; type BlockHashConversion = sp_runtime::traits::Identity; @@ -620,14 +620,14 @@ impl parachains::Trait for Runtime { /// Submits transaction with the node's public and signature type. Adheres to the signed extension /// format of the chain. -impl system::offchain::CreateSignedTransaction for Runtime where +impl frame_system::offchain::CreateSignedTransaction for Runtime where Call: From, { - fn create_transaction>( + fn create_transaction>( call: Call, public: ::Signer, account: AccountId, - nonce: ::Index, + nonce: ::Index, ) -> Option<(Call, ::SignaturePayload)> { // take the biggest period possible. let period = BlockHashCount::get() @@ -642,13 +642,13 @@ impl system::offchain::CreateSignedTransaction for Runtime .saturating_sub(1); let tip = 0; let extra: SignedExtra = ( - system::CheckSpecVersion::::new(), - system::CheckTxVersion::::new(), - system::CheckGenesis::::new(), - system::CheckMortality::::from(generic::Era::mortal(period, current_block)), - system::CheckNonce::::from(nonce), - system::CheckWeight::::new(), - transaction_payment::ChargeTransactionPayment::::from(tip), + frame_system::CheckSpecVersion::::new(), + frame_system::CheckTxVersion::::new(), + frame_system::CheckGenesis::::new(), + frame_system::CheckMortality::::from(generic::Era::mortal(period, current_block)), + frame_system::CheckNonce::::from(nonce), + frame_system::CheckWeight::::new(), + pallet_transaction_payment::ChargeTransactionPayment::::from(tip), registrar::LimitParathreadCommits::::new(), parachains::ValidateDoubleVoteReports::::new(), ); @@ -663,12 +663,12 @@ impl system::offchain::CreateSignedTransaction for Runtime } } -impl system::offchain::SigningTypes for Runtime { +impl frame_system::offchain::SigningTypes for Runtime { type Public = ::Signer; type Signature = Signature; } -impl system::offchain::SendTransactionTypes for Runtime where +impl frame_system::offchain::SendTransactionTypes for Runtime where Call: From, { type OverarchingCall = Call; @@ -713,7 +713,7 @@ impl claims::Trait for Runtime { type Event = Event; type VestingSchedule = Vesting; type Prefix = Prefix; - type MoveClaimOrigin = collective::EnsureProportionMoreThan<_1, _2, AccountId, CouncilCollective>; + type MoveClaimOrigin = pallet_collective::EnsureProportionMoreThan<_1, _2, AccountId, CouncilCollective>; } parameter_types! { @@ -726,7 +726,7 @@ parameter_types! { pub const MaxRegistrars: u32 = 20; } -impl identity::Trait for Runtime { +impl pallet_identity::Trait for Runtime { type Event = Event; type Currency = Balances; type Slashed = Treasury; @@ -741,7 +741,7 @@ impl identity::Trait for Runtime { type WeightInfo = (); } -impl utility::Trait for Runtime { +impl pallet_utility::Trait for Runtime { type Event = Event; type Call = Call; type WeightInfo = (); @@ -755,7 +755,7 @@ parameter_types! { pub const MaxSignatories: u16 = 100; } -impl multisig::Trait for Runtime { +impl pallet_multisig::Trait for Runtime { type Event = Event; type Call = Call; type Currency = Balances; @@ -772,7 +772,7 @@ parameter_types! { pub const RecoveryDeposit: Balance = 5 * DOLLARS; } -impl recovery::Trait for Runtime { +impl pallet_recovery::Trait for Runtime { type Event = Event; type Call = Call; type Currency = Balances; @@ -793,7 +793,7 @@ parameter_types! { pub const SocietyModuleId: ModuleId = ModuleId(*b"py/socie"); } -impl society::Trait for Runtime { +impl pallet_society::Trait for Runtime { type Event = Event; type Currency = Balances; type Randomness = RandomnessCollectiveFlip; @@ -804,8 +804,8 @@ impl society::Trait for Runtime { type MembershipChanged = (); type RotationPeriod = RotationPeriod; type MaxLockDuration = MaxLockDuration; - type FounderSetOrigin = collective::EnsureProportionMoreThan<_1, _2, AccountId, CouncilCollective>; - type SuspensionJudgementOrigin = society::EnsureFounder; + type FounderSetOrigin = pallet_collective::EnsureProportionMoreThan<_1, _2, AccountId, CouncilCollective>; + type SuspensionJudgementOrigin = pallet_society::EnsureFounder; type ChallengePeriod = ChallengePeriod; type ModuleId = SocietyModuleId; } @@ -814,7 +814,7 @@ parameter_types! { pub const MinVestedTransfer: Balance = 100 * DOLLARS; } -impl vesting::Trait for Runtime { +impl pallet_vesting::Trait for Runtime { type Event = Event; type Currency = Balances; type BlockNumberToBalance = ConvertInto; @@ -848,9 +848,9 @@ impl InstanceFilter for ProxyType { Call::System(..) | Call::Babe(..) | Call::Timestamp(..) | - Call::Indices(indices::Call::claim(..)) | - Call::Indices(indices::Call::free(..)) | - Call::Indices(indices::Call::freeze(..)) | + Call::Indices(pallet_indices::Call::claim(..)) | + Call::Indices(pallet_indices::Call::free(..)) | + Call::Indices(pallet_indices::Call::freeze(..)) | // Specifically omitting Indices `transfer`, `force_transfer` // Specifically omitting the entire Balances pallet Call::Authorship(..) | @@ -875,15 +875,15 @@ impl InstanceFilter for ProxyType { Call::Utility(..) | Call::Identity(..) | Call::Society(..) | - Call::Recovery(recovery::Call::as_recovered(..)) | - Call::Recovery(recovery::Call::vouch_recovery(..)) | - Call::Recovery(recovery::Call::claim_recovery(..)) | - Call::Recovery(recovery::Call::close_recovery(..)) | - Call::Recovery(recovery::Call::remove_recovery(..)) | - Call::Recovery(recovery::Call::cancel_recovered(..)) | + Call::Recovery(pallet_recovery::Call::as_recovered(..)) | + Call::Recovery(pallet_recovery::Call::vouch_recovery(..)) | + Call::Recovery(pallet_recovery::Call::claim_recovery(..)) | + Call::Recovery(pallet_recovery::Call::close_recovery(..)) | + Call::Recovery(pallet_recovery::Call::remove_recovery(..)) | + Call::Recovery(pallet_recovery::Call::cancel_recovered(..)) | // Specifically omitting Recovery `create_recovery`, `initiate_recovery` - Call::Vesting(vesting::Call::vest(..)) | - Call::Vesting(vesting::Call::vest_other(..)) | + Call::Vesting(pallet_vesting::Call::vest(..)) | + Call::Vesting(pallet_vesting::Call::vest_other(..)) | // Specifically omitting Vesting `vested_transfer`, and `force_vested_transfer` Call::Scheduler(..) | Call::Proxy(..) | @@ -897,8 +897,8 @@ impl InstanceFilter for ProxyType { Call::Staking(..) | Call::Utility(..) ), ProxyType::IdentityJudgement => matches!(c, - Call::Identity(identity::Call::provide_judgement(..)) - | Call::Utility(utility::Call::batch(..)) + Call::Identity(pallet_identity::Call::provide_judgement(..)) + | Call::Utility(pallet_utility::Call::batch(..)) ) } } @@ -913,7 +913,7 @@ impl InstanceFilter for ProxyType { } } -impl proxy::Trait for Runtime { +impl pallet_proxy::Trait for Runtime { type Event = Event; type Call = Call; type Currency = Balances; @@ -927,10 +927,10 @@ impl proxy::Trait for Runtime { pub struct CustomOnRuntimeUpgrade; impl frame_support::traits::OnRuntimeUpgrade for CustomOnRuntimeUpgrade { fn on_runtime_upgrade() -> frame_support::weights::Weight { - if scheduler::Module::::migrate_v1_to_t2() { - ::MaximumBlockWeight::get() + if pallet_scheduler::Module::::migrate_v1_to_t2() { + ::MaximumBlockWeight::get() } else { - ::DbWeight::get().reads(1) + 500_000_000 + ::DbWeight::get().reads(1) + 500_000_000 } } } @@ -942,35 +942,35 @@ construct_runtime! { UncheckedExtrinsic = UncheckedExtrinsic { // Basic stuff; balances is uncallable initially. - System: system::{Module, Call, Storage, Config, Event}, - RandomnessCollectiveFlip: randomness_collective_flip::{Module, Storage}, + System: frame_system::{Module, Call, Storage, Config, Event}, + RandomnessCollectiveFlip: pallet_randomness_collective_flip::{Module, Storage}, // Must be before session. - Babe: babe::{Module, Call, Storage, Config, Inherent, ValidateUnsigned}, + Babe: pallet_babe::{Module, Call, Storage, Config, Inherent, ValidateUnsigned}, - Timestamp: timestamp::{Module, Call, Storage, Inherent}, - Indices: indices::{Module, Call, Storage, Config, Event}, - Balances: balances::{Module, Call, Storage, Config, Event}, - TransactionPayment: transaction_payment::{Module, Storage}, + Timestamp: pallet_timestamp::{Module, Call, Storage, Inherent}, + Indices: pallet_indices::{Module, Call, Storage, Config, Event}, + Balances: pallet_balances::{Module, Call, Storage, Config, Event}, + TransactionPayment: pallet_transaction_payment::{Module, Storage}, // Consensus support. - Authorship: authorship::{Module, Call, Storage}, - Staking: staking::{Module, Call, Storage, Config, Event, ValidateUnsigned}, - Offences: offences::{Module, Call, Storage, Event}, + Authorship: pallet_authorship::{Module, Call, Storage}, + Staking: pallet_staking::{Module, Call, Storage, Config, Event, ValidateUnsigned}, + Offences: pallet_offences::{Module, Call, Storage, Event}, Historical: session_historical::{Module}, - Session: session::{Module, Call, Storage, Event, Config}, - FinalityTracker: finality_tracker::{Module, Call, Storage, Inherent}, - Grandpa: grandpa::{Module, Call, Storage, Config, Event, ValidateUnsigned}, - ImOnline: im_online::{Module, Call, Storage, Event, ValidateUnsigned, Config}, - AuthorityDiscovery: authority_discovery::{Module, Call, Config}, + Session: pallet_session::{Module, Call, Storage, Event, Config}, + FinalityTracker: pallet_finality_tracker::{Module, Call, Storage, Inherent}, + Grandpa: pallet_grandpa::{Module, Call, Storage, Config, Event, ValidateUnsigned}, + ImOnline: pallet_im_online::{Module, Call, Storage, Event, ValidateUnsigned, Config}, + AuthorityDiscovery: pallet_authority_discovery::{Module, Call, Config}, // Governance stuff; uncallable initially. - Democracy: democracy::{Module, Call, Storage, Config, Event}, - Council: collective::::{Module, Call, Storage, Origin, Event, Config}, - TechnicalCommittee: collective::::{Module, Call, Storage, Origin, Event, Config}, - ElectionsPhragmen: elections_phragmen::{Module, Call, Storage, Event, Config}, - TechnicalMembership: membership::::{Module, Call, Storage, Event, Config}, - Treasury: treasury::{Module, Call, Storage, Event}, + Democracy: pallet_democracy::{Module, Call, Storage, Config, Event}, + Council: pallet_collective::::{Module, Call, Storage, Origin, Event, Config}, + TechnicalCommittee: pallet_collective::::{Module, Call, Storage, Origin, Event, Config}, + ElectionsPhragmen: pallet_elections_phragmen::{Module, Call, Storage, Event, Config}, + TechnicalMembership: pallet_membership::::{Module, Call, Storage, Event, Config}, + Treasury: pallet_treasury::{Module, Call, Storage, Event}, // Claims. Usable initially. Claims: claims::{Module, Call, Storage, Event, Config, ValidateUnsigned}, @@ -983,28 +983,28 @@ construct_runtime! { Registrar: registrar::{Module, Call, Storage, Event, Config}, // Utility module. - Utility: utility::{Module, Call, Event}, + Utility: pallet_utility::{Module, Call, Event}, // Less simple identity module. - Identity: identity::{Module, Call, Storage, Event}, + Identity: pallet_identity::{Module, Call, Storage, Event}, // Society module. - Society: society::{Module, Call, Storage, Event}, + Society: pallet_society::{Module, Call, Storage, Event}, // Social recovery module. - Recovery: recovery::{Module, Call, Storage, Event}, + Recovery: pallet_recovery::{Module, Call, Storage, Event}, // Vesting. Usable initially, but removed once all vesting is finished. - Vesting: vesting::{Module, Call, Storage, Event, Config}, + Vesting: pallet_vesting::{Module, Call, Storage, Event, Config}, // System scheduler. - Scheduler: scheduler::{Module, Call, Storage, Event}, + Scheduler: pallet_scheduler::{Module, Call, Storage, Event}, // Proxy module. Late addition. - Proxy: proxy::{Module, Call, Storage, Event}, + Proxy: pallet_proxy::{Module, Call, Storage, Event}, // Multisig module. Late addition. - Multisig: multisig::{Module, Call, Storage, Event}, + Multisig: pallet_multisig::{Module, Call, Storage, Event}, } } @@ -1020,13 +1020,13 @@ pub type SignedBlock = generic::SignedBlock; pub type BlockId = generic::BlockId; /// The SignedExtension to the basic transaction logic. pub type SignedExtra = ( - system::CheckSpecVersion, - system::CheckTxVersion, - system::CheckGenesis, - system::CheckMortality, - system::CheckNonce, - system::CheckWeight, - transaction_payment::ChargeTransactionPayment, + frame_system::CheckSpecVersion, + frame_system::CheckTxVersion, + frame_system::CheckGenesis, + frame_system::CheckMortality, + frame_system::CheckNonce, + frame_system::CheckWeight, + pallet_transaction_payment::ChargeTransactionPayment, registrar::LimitParathreadCommits, parachains::ValidateDoubleVoteReports, ); @@ -1035,10 +1035,10 @@ pub type UncheckedExtrinsic = generic::UncheckedExtrinsic; /// Executive: handles dispatch to the various modules. -pub type Executive = executive::Executive< +pub type Executive = frame_executive::Executive< Runtime, Block, - system::ChainContext, + frame_system::ChainContext, Runtime, AllModules, CustomOnRuntimeUpgrade @@ -1245,13 +1245,13 @@ sp_api::impl_runtime_apis! { } } - impl system_rpc_runtime_api::AccountNonceApi for Runtime { + impl frame_system_rpc_runtime_api::AccountNonceApi for Runtime { fn account_nonce(account: AccountId) -> Nonce { System::account_nonce(account) } } - impl transaction_payment_rpc_runtime_api::TransactionPaymentApi< + impl pallet_transaction_payment_rpc_runtime_api::TransactionPaymentApi< Block, Balance, > for Runtime { @@ -1315,21 +1315,21 @@ sp_api::impl_runtime_apis! { // Polkadot add_benchmark!(params, batches, claims, Claims); // Substrate - add_benchmark!(params, batches, balances, Balances); - add_benchmark!(params, batches, collective, Council); - add_benchmark!(params, batches, democracy, Democracy); - add_benchmark!(params, batches, elections_phragmen, ElectionsPhragmen); - add_benchmark!(params, batches, identity, Identity); - add_benchmark!(params, batches, im_online, ImOnline); - add_benchmark!(params, batches, offences, OffencesBench::); - add_benchmark!(params, batches, scheduler, Scheduler); - add_benchmark!(params, batches, session, SessionBench::); - add_benchmark!(params, batches, staking, Staking); - add_benchmark!(params, batches, system, SystemBench::); - add_benchmark!(params, batches, timestamp, Timestamp); - add_benchmark!(params, batches, treasury, Treasury); - add_benchmark!(params, batches, utility, Utility); - add_benchmark!(params, batches, vesting, Vesting); + add_benchmark!(params, batches, pallet_balances, Balances); + add_benchmark!(params, batches, pallet_collective, Council); + add_benchmark!(params, batches, pallet_democracy, Democracy); + add_benchmark!(params, batches, pallet_elections_phragmen, ElectionsPhragmen); + add_benchmark!(params, batches, pallet_identity, Identity); + add_benchmark!(params, batches, pallet_im_online, ImOnline); + add_benchmark!(params, batches, pallet_offences, OffencesBench::); + add_benchmark!(params, batches, pallet_scheduler, Scheduler); + add_benchmark!(params, batches, pallet_session, SessionBench::); + add_benchmark!(params, batches, pallet_staking, Staking); + add_benchmark!(params, batches, frame_system, SystemBench::); + add_benchmark!(params, batches, pallet_timestamp, Timestamp); + add_benchmark!(params, batches, pallet_treasury, Treasury); + add_benchmark!(params, batches, pallet_utility, Utility); + add_benchmark!(params, batches, pallet_vesting, Vesting); if batches.is_empty() { return Err("Benchmark not found for this pallet.".into()) } Ok(batches) diff --git a/runtime/kusama/src/weights/mod.rs b/runtime/kusama/src/weights/mod.rs index 75cabca0c6..b94314e339 100644 --- a/runtime/kusama/src/weights/mod.rs +++ b/runtime/kusama/src/weights/mod.rs @@ -16,4 +16,4 @@ /// A collection of weight modules used for pallets in the runtime. -pub mod balances; +pub mod pallet_balances; diff --git a/runtime/kusama/src/weights/balances.rs b/runtime/kusama/src/weights/pallet_balances.rs similarity index 97% rename from runtime/kusama/src/weights/balances.rs rename to runtime/kusama/src/weights/pallet_balances.rs index bc2f3ac18a..53431ba48f 100644 --- a/runtime/kusama/src/weights/balances.rs +++ b/runtime/kusama/src/weights/pallet_balances.rs @@ -18,7 +18,7 @@ use frame_support::weights::{Weight, constants::RocksDbWeight as DbWeight}; pub struct WeightInfo; -impl balances::WeightInfo for WeightInfo { +impl pallet_balances::WeightInfo for WeightInfo { fn transfer() -> Weight { (65949000 as Weight) .saturating_add(DbWeight::get().reads(1 as Weight)) diff --git a/runtime/parachains/Cargo.toml b/runtime/parachains/Cargo.toml index ec3f2712bf..a2aef4d65c 100644 --- a/runtime/parachains/Cargo.toml +++ b/runtime/parachains/Cargo.toml @@ -21,15 +21,15 @@ sp-session = { git = "https://github.com/paritytech/substrate", branch = "master sp-staking = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } sp-core = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -authorship = { package = "pallet-authorship", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -balances = { package = "pallet-balances", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -session = { package = "pallet-session", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-authorship = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-balances = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-session = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } frame-support = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -staking = { package = "pallet-staking", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -system = { package = "frame-system", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -timestamp = { package = "pallet-timestamp", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -vesting = { package = "pallet-vesting", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -offences = { package = "pallet-offences", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-staking = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +frame-system = {git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-timestamp = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-vesting = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-offences = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } frame-benchmarking = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false, optional = true } primitives = { package = "polkadot-primitives", path = "../../primitives", default-features = false } @@ -42,11 +42,11 @@ rand_chacha = { version = "0.2.2", default-features = false } hex-literal = "0.2.1" keyring = { package = "sp-keyring", git = "https://github.com/paritytech/substrate", branch = "master" } sp-trie = { git = "https://github.com/paritytech/substrate", branch = "master" } -babe = { package = "pallet-babe", git = "https://github.com/paritytech/substrate", branch = "master" } +pallet-babe = { git = "https://github.com/paritytech/substrate", branch = "master" } sp-application-crypto = { git = "https://github.com/paritytech/substrate", branch = "master" } -randomness-collective-flip = { package = "pallet-randomness-collective-flip", git = "https://github.com/paritytech/substrate", branch = "master" } +pallet-randomness-collective-flip = { git = "https://github.com/paritytech/substrate", branch = "master" } pallet-staking-reward-curve = { git = "https://github.com/paritytech/substrate", branch = "master" } -treasury = { package = "pallet-treasury", git = "https://github.com/paritytech/substrate", branch = "master" } +pallet-treasury = { git = "https://github.com/paritytech/substrate", branch = "master" } serde_json = "1.0.41" libsecp256k1 = "0.3.2" sp-version = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } @@ -69,20 +69,20 @@ std = [ "sp-std/std", "sp-io/std", "frame-support/std", - "authorship/std", - "balances/std", + "pallet-authorship/std", + "pallet-balances/std", "sp-runtime/std", "sp-session/std", "sp-staking/std", - "session/std", - "staking/std", - "system/std", - "timestamp/std", - "vesting/std", + "pallet-session/std", + "pallet-staking/std", + "frame-system/std", + "pallet-timestamp/std", + "pallet-vesting/std", ] runtime-benchmarks = [ "libsecp256k1/hmac", "frame-benchmarking", "frame-support/runtime-benchmarks", - "system/runtime-benchmarks", + "frame-system/runtime-benchmarks", ] diff --git a/runtime/parachains/src/configuration.rs b/runtime/parachains/src/configuration.rs index 6fc9dd4230..ae85e751bf 100644 --- a/runtime/parachains/src/configuration.rs +++ b/runtime/parachains/src/configuration.rs @@ -27,7 +27,7 @@ use frame_support::{ }; use sp_runtime::traits::One; use codec::{Encode, Decode}; -use system::ensure_root; +use frame_system::ensure_root; /// All configuration of the runtime with respect to parachains and parathreads. #[derive(Clone, Encode, Decode, PartialEq, Default)] @@ -61,7 +61,7 @@ pub struct HostConfiguration { pub scheduling_lookahead: u32, } -pub trait Trait: system::Trait { } +pub trait Trait: frame_system::Trait { } decl_storage! { trait Store for Module as Configuration { @@ -78,7 +78,7 @@ decl_error! { decl_module! { /// The parachains configuration module. - pub struct Module for enum Call where origin: ::Origin, system = system { + pub struct Module for enum Call where origin: ::Origin { type Error = Error; /// Set the validation upgrade frequency. @@ -227,7 +227,7 @@ impl Module { GlobalValidationData { max_code_size: config.max_code_size, max_head_data_size: config.max_head_data_size, - block_number: >::block_number() - One::one(), + block_number: >::block_number() - One::one(), } } } diff --git a/runtime/parachains/src/inclusion.rs b/runtime/parachains/src/inclusion.rs index e6f5ff1a0a..07d2df50d1 100644 --- a/runtime/parachains/src/inclusion.rs +++ b/runtime/parachains/src/inclusion.rs @@ -87,9 +87,9 @@ impl CandidatePendingAvailability { } pub trait Trait: - system::Trait + paras::Trait + configuration::Trait + frame_system::Trait + paras::Trait + configuration::Trait { - type Event: From> + Into<::Event>; + type Event: From> + Into<::Event>; } decl_storage! { @@ -154,7 +154,7 @@ decl_error! { } decl_event! { - pub enum Event where ::Hash { + pub enum Event where ::Hash { /// A candidate was backed. CandidateBacked(CandidateReceipt, HeadData), /// A candidate was included. @@ -167,7 +167,7 @@ decl_event! { decl_module! { /// The parachain-candidate inclusion module. pub struct Module - for enum Call where origin: ::Origin, system = system + for enum Call where origin: ::Origin { type Error = Error; @@ -230,7 +230,7 @@ impl Module { let mut last_index = None; let signing_context = SigningContext { - parent_hash: >::parent_hash(), + parent_hash: >::parent_hash(), session_index, }; @@ -266,7 +266,7 @@ impl Module { } } - let now = >::block_number(); + let now = >::block_number(); for signed_bitfield in signed_bitfields { for (bit_idx, _) in signed_bitfield.payload().0.iter().enumerate().filter(|(_, is_av)| **is_av) @@ -356,9 +356,9 @@ impl Module { } let validators = Validators::get(); - let parent_hash = >::parent_hash(); + let parent_hash = >::parent_hash(); let config = >::config(); - let now = >::block_number(); + let now = >::block_number(); let relay_parent_number = now - One::one(); // do all checks before writing storage. diff --git a/runtime/parachains/src/inclusion_inherent.rs b/runtime/parachains/src/inclusion_inherent.rs index 6d06961b46..f9a7465d91 100644 --- a/runtime/parachains/src/inclusion_inherent.rs +++ b/runtime/parachains/src/inclusion_inherent.rs @@ -31,7 +31,7 @@ use frame_support::{ weights::{DispatchClass, Weight}, traits::Get, }; -use system::ensure_none; +use frame_system::ensure_none; use crate::{ inclusion, scheduler::{self, FreedReason}, @@ -61,7 +61,7 @@ decl_error! { decl_module! { /// The inclusion inherent module. - pub struct Module for enum Call where origin: ::Origin, system = system { + pub struct Module for enum Call where origin: ::Origin { type Error = Error; fn on_initialize() -> Weight { @@ -134,7 +134,7 @@ impl ProvideInherent for Module { .map(|(signed_bitfields, backed_candidates): (SignedAvailabilityBitfields, Vec>)| { // Sanity check: session changes can invalidate an inherent, and we _really_ don't want that to happen. // See github.com/paritytech/polkadot/issues/1327 - if Self::inclusion(system::RawOrigin::None.into(), signed_bitfields.clone(), backed_candidates.clone()).is_ok() { + if Self::inclusion(frame_system::RawOrigin::None.into(), signed_bitfields.clone(), backed_candidates.clone()).is_ok() { Call::inclusion(signed_bitfields, backed_candidates) } else { Call::inclusion(Vec::new().into(), Vec::new()) diff --git a/runtime/parachains/src/initializer.rs b/runtime/parachains/src/initializer.rs index 0c4f83ccce..11481e7ffd 100644 --- a/runtime/parachains/src/initializer.rs +++ b/runtime/parachains/src/initializer.rs @@ -55,7 +55,7 @@ struct BufferedSessionChange { } pub trait Trait: - system::Trait + configuration::Trait + paras::Trait + scheduler::Trait + inclusion::Trait + frame_system::Trait + configuration::Trait + paras::Trait + scheduler::Trait + inclusion::Trait { /// A randomness beacon. type Randomness: Randomness; @@ -89,7 +89,7 @@ decl_error! { decl_module! { /// The initializer module. - pub struct Module for enum Call where origin: ::Origin, system = system { + pub struct Module for enum Call where origin: ::Origin { type Error = Error; fn on_initialize(now: T::BlockNumber) -> Weight { @@ -190,7 +190,7 @@ impl Module { }; >::mutate(|v| v.push(BufferedSessionChange { - apply_at: >::block_number() + One::one(), + apply_at: >::block_number() + One::one(), validators, queued, session_index, @@ -202,7 +202,7 @@ impl sp_runtime::BoundToRuntimeAppPublic for Module { type Public = ValidatorId; } -impl session::OneSessionHandler for Module { +impl pallet_session::OneSessionHandler for Module { type Key = ValidatorId; fn on_genesis_session<'a, I: 'a>(_validators: I) @@ -214,7 +214,7 @@ impl session::OneSessionHandler for Mod fn on_new_session<'a, I: 'a>(changed: bool, validators: I, queued: I) where I: Iterator { - let session_index = >::current_index(); + let session_index = >::current_index(); >::on_new_session(changed, session_index, validators, Some(queued)); } diff --git a/runtime/parachains/src/mock.rs b/runtime/parachains/src/mock.rs index 21ee83433d..7001b1c1df 100644 --- a/runtime/parachains/src/mock.rs +++ b/runtime/parachains/src/mock.rs @@ -36,7 +36,7 @@ use crate::inclusion; pub struct Test; impl_outer_origin! { - pub enum Origin for Test where system = system { } + pub enum Origin for Test { } } impl_outer_dispatch! { @@ -47,7 +47,7 @@ impl_outer_dispatch! { impl_outer_event! { pub enum TestEvent for Test { - system, + frame_system, inclusion, } } @@ -67,7 +67,7 @@ parameter_types! { pub const AvailableBlockRatio: Perbill = Perbill::from_percent(75); } -impl system::Trait for Test { +impl frame_system::Trait for Test { type BaseCallFilter = (); type Origin = Origin; type Call = Call; @@ -89,7 +89,7 @@ impl system::Trait for Test { type AvailableBlockRatio = AvailableBlockRatio; type Version = (); type ModuleToIndex = (); - type AccountData = balances::AccountData; + type AccountData = pallet_balances::AccountData; type OnNewAccount = (); type OnKilledAccount = (); type SystemWeightInfo = (); @@ -109,7 +109,7 @@ impl crate::inclusion::Trait for Test { type Event = TestEvent; } -pub type System = system::Module; +pub type System = frame_system::Module; /// Mocked initializer. pub type Initializer = crate::initializer::Module; @@ -137,7 +137,7 @@ pub fn new_test_ext(state: GenesisConfig) -> TestExternalities { #[derive(Default)] pub struct GenesisConfig { - pub system: system::GenesisConfig, + pub system: frame_system::GenesisConfig, pub configuration: crate::configuration::GenesisConfig, pub paras: crate::paras::GenesisConfig, } diff --git a/runtime/parachains/src/paras.rs b/runtime/parachains/src/paras.rs index 1f65bcd0c2..b1e48ca3ce 100644 --- a/runtime/parachains/src/paras.rs +++ b/runtime/parachains/src/paras.rs @@ -41,7 +41,7 @@ use sp_core::RuntimeDebug; #[cfg(feature = "std")] use serde::{Serialize, Deserialize}; -pub trait Trait: system::Trait + configuration::Trait { } +pub trait Trait: frame_system::Trait + configuration::Trait { } // the two key times necessary to track for every code replacement. #[derive(Default, Encode, Decode)] @@ -241,7 +241,7 @@ decl_error! { decl_module! { /// The parachains configuration module. - pub struct Module for enum Call where origin: ::Origin, system = system { + pub struct Module for enum Call where origin: ::Origin { type Error = Error; } } @@ -257,7 +257,7 @@ impl Module { /// Called by the initializer to note that a new session has started. pub(crate) fn initializer_on_new_session(_notification: &SessionChangeNotification) { - let now = >::block_number(); + let now = >::block_number(); let mut parachains = Self::clean_up_outgoing(now); Self::apply_incoming(&mut parachains); ::Parachains::set(parachains); @@ -477,7 +477,7 @@ impl Module { CurrentCode::insert(&id, &new_code); // `now` is only used for registering pruning as part of `fn note_past_code` - let now = >::block_number(); + let now = >::block_number(); let weight = Self::note_past_code( id, @@ -509,7 +509,7 @@ impl Module { at: T::BlockNumber, assume_intermediate: Option, ) -> Option { - let now = >::block_number(); + let now = >::block_number(); let config = >::config(); if assume_intermediate.as_ref().map_or(false, |i| &at <= i) { @@ -553,7 +553,7 @@ impl Module { /// Compute the local-validation data based on the head of the para. This assumes the /// relay-parent is the parent of the current block. pub(crate) fn local_validation_data(para_id: ParaId) -> Option> { - let relay_parent_number = >::block_number() - One::one(); + let relay_parent_number = >::block_number() - One::one(); let config = >::config(); let freq = config.validation_upgrade_frequency; diff --git a/runtime/parachains/src/runtime_api_impl/v1.rs b/runtime/parachains/src/runtime_api_impl/v1.rs index a3bb6afff6..0a19e798f1 100644 --- a/runtime/parachains/src/runtime_api_impl/v1.rs +++ b/runtime/parachains/src/runtime_api_impl/v1.rs @@ -243,11 +243,11 @@ pub fn candidate_pending_availability(para_id: ParaId) pub fn candidate_events(extract_event: F) -> Vec> where T: initializer::Trait, - F: Fn(::Event) -> Option>, + F: Fn(::Event) -> Option>, { use inclusion::Event as RawEvent; - >::events().into_iter() + >::events().into_iter() .filter_map(|record| extract_event(record.event)) .map(|event| match event { RawEvent::::CandidateBacked(c, h) => CandidateEvent::CandidateBacked(c, h), diff --git a/runtime/parachains/src/scheduler.rs b/runtime/parachains/src/scheduler.rs index d664f07225..a3ed466a2c 100644 --- a/runtime/parachains/src/scheduler.rs +++ b/runtime/parachains/src/scheduler.rs @@ -105,7 +105,7 @@ pub enum FreedReason { TimedOut, } -pub trait Trait: system::Trait + configuration::Trait + paras::Trait { } +pub trait Trait: frame_system::Trait + configuration::Trait + paras::Trait { } decl_storage! { trait Store for Module as ParaScheduler { @@ -147,7 +147,7 @@ decl_error! { decl_module! { /// The scheduler module. - pub struct Module for enum Call where origin: ::Origin, system = system { + pub struct Module for enum Call where origin: ::Origin { type Error = Error; } } @@ -195,7 +195,7 @@ impl Module { let n_parachains = >::parachains().len() as u32; let n_cores = n_parachains + config.parathread_cores; - >::set(>::block_number()); + >::set(>::block_number()); AvailabilityCores::mutate(|cores| { // clear all occupied cores. for maybe_occupied in cores.iter_mut() { @@ -355,7 +355,7 @@ impl Module { let parachains = >::parachains(); let mut scheduled = Scheduled::get(); let mut parathread_queue = ParathreadQueue::get(); - let now = >::block_number(); + let now = >::block_number(); if ValidatorGroups::get().is_empty() { return } @@ -548,7 +548,7 @@ impl Module { /// https://github.com/rust-lang/rust/issues/73226 /// which prevents us from testing the code if using `impl Trait`. pub(crate) fn availability_timeout_predicate() -> Option bool>> { - let now = >::block_number(); + let now = >::block_number(); let config = >::config(); let session_start = >::get(); @@ -596,7 +596,7 @@ impl Module { /// Returns a helper for determining group rotation. pub(crate) fn group_rotation_info() -> GroupRotationInfo { let session_start_block = Self::session_start_block(); - let now = >::block_number(); + let now = >::block_number(); let group_rotation_frequency = >::config() .group_rotation_frequency; @@ -1539,8 +1539,8 @@ mod tests { fn availability_predicate_no_rotation() { let genesis_config = MockGenesisConfig { configuration: crate::configuration::GenesisConfig { - config: HostConfiguration { - group_rotation_frequency: 0, // no rotation + config: HostConfiguration { + group_rotation_frequency: 0, // no rotation ..default_config() }, ..Default::default() @@ -1571,7 +1571,7 @@ mod tests { run_to_block(1, |number| match number { 1 => Some(SessionChangeNotification { new_config: HostConfiguration{ - // Note: the `group_rotation_frequency` config change + // Note: the `group_rotation_frequency` config change // is not accounted for on session change // group_rotation_frequency: 0, ..default_config() diff --git a/runtime/polkadot/Cargo.toml b/runtime/polkadot/Cargo.toml index cd1b5e1436..42e679a877 100644 --- a/runtime/polkadot/Cargo.toml +++ b/runtime/polkadot/Cargo.toml @@ -26,42 +26,42 @@ sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "master sp-staking = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } sp-core = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } sp-session = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -version = { package = "sp-version", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +sp-version = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } tx-pool-api = { package = "sp-transaction-pool", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } block-builder-api = { package = "sp-block-builder", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -authority-discovery = { package = "pallet-authority-discovery", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -authorship = { package = "pallet-authorship", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -babe = { package = "pallet-babe", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -balances = { package = "pallet-balances", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -transaction-payment = { package = "pallet-transaction-payment", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -transaction-payment-rpc-runtime-api = { package = "pallet-transaction-payment-rpc-runtime-api", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -collective = { package = "pallet-collective", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -democracy = { package = "pallet-democracy", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -elections-phragmen = { package = "pallet-elections-phragmen", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -executive = { package = "frame-executive", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -finality-tracker = { package = "pallet-finality-tracker", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -grandpa = { package = "pallet-grandpa", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -identity = { package = "pallet-identity", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -im-online = { package = "pallet-im-online", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -indices = { package = "pallet-indices", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -membership = { package = "pallet-membership", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -multisig = { package = "pallet-multisig", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -nicks = { package = "pallet-nicks", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -offences = { package = "pallet-offences", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -proxy = { package = "pallet-proxy", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -randomness-collective-flip = { package = "pallet-randomness-collective-flip", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -scheduler = { package = "pallet-scheduler", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -session = { package = "pallet-session", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-authority-discovery = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-authorship = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-babe = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-balances = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-transaction-payment = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-transaction-payment-rpc-runtime-api = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-collective = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-democracy = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-elections-phragmen = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +frame-executive = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-finality-tracker = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-grandpa = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-identity = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-im-online = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-indices = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-membership = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-multisig = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-nicks = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-offences = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-proxy = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-randomness-collective-flip = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-scheduler = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-session = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } frame-support = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -staking = { package = "pallet-staking", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-staking = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } pallet-staking-reward-curve = { git = "https://github.com/paritytech/substrate", branch = "master" } -system = { package = "frame-system", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -system_rpc_runtime_api = { package = "frame-system-rpc-runtime-api", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -timestamp = { package = "pallet-timestamp", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -treasury = { package = "pallet-treasury", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -vesting = { package = "pallet-vesting", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -utility = { package = "pallet-utility", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +frame-system = {git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +frame-system-rpc-runtime-api = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-timestamp = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-treasury = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-vesting = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-utility = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } frame-benchmarking = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false, optional = true } frame-system-benchmarking = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false, optional = true } @@ -90,7 +90,7 @@ no_std = [] only-staking = [] std = [ "authority-discovery-primitives/std", - "authority-discovery/std", + "pallet-authority-discovery/std", "bitvec/std", "primitives/std", "rustc-hex/std", @@ -103,62 +103,62 @@ std = [ "offchain-primitives/std", "sp-std/std", "frame-support/std", - "authorship/std", - "balances/std", - "transaction-payment/std", - "transaction-payment-rpc-runtime-api/std", - "collective/std", - "elections-phragmen/std", - "democracy/std", - "executive/std", - "finality-tracker/std", - "grandpa/std", - "identity/std", - "im-online/std", - "indices/std", - "membership/std", - "multisig/std", - "nicks/std", - "offences/std", - "proxy/std", + "pallet-authorship/std", + "pallet-balances/std", + "pallet-transaction-payment/std", + "pallet-transaction-payment-rpc-runtime-api/std", + "pallet-collective/std", + "pallet-elections-phragmen/std", + "pallet-democracy/std", + "frame-executive/std", + "pallet-finality-tracker/std", + "pallet-grandpa/std", + "pallet-identity/std", + "pallet-im-online/std", + "pallet-indices/std", + "pallet-membership/std", + "pallet-multisig/std", + "pallet-nicks/std", + "pallet-offences/std", + "pallet-proxy/std", "sp-runtime/std", "sp-staking/std", - "scheduler/std", - "session/std", - "staking/std", - "system/std", - "system_rpc_runtime_api/std", - "timestamp/std", - "treasury/std", - "version/std", + "pallet-scheduler/std", + "pallet-session/std", + "pallet-staking/std", + "frame-system/std", + "frame-system-rpc-runtime-api/std", + "pallet-timestamp/std", + "pallet-treasury/std", + "sp-version/std", "serde_derive", "serde/std", "log", - "babe/std", + "pallet-babe/std", "babe-primitives/std", "sp-session/std", - "randomness-collective-flip/std", + "pallet-randomness-collective-flip/std", "runtime-common/std", - "vesting/std", - "utility/std", + "pallet-vesting/std", + "pallet-utility/std", ] runtime-benchmarks = [ "runtime-common/runtime-benchmarks", "frame-benchmarking", "frame-support/runtime-benchmarks", "frame-system-benchmarking", - "system/runtime-benchmarks", + "frame-system/runtime-benchmarks", "sp-runtime/runtime-benchmarks", - "balances/runtime-benchmarks", - "collective/runtime-benchmarks", - "democracy/runtime-benchmarks", - "elections-phragmen/runtime-benchmarks", - "im-online/runtime-benchmarks", - "scheduler/runtime-benchmarks", - "staking/runtime-benchmarks", - "timestamp/runtime-benchmarks", - "treasury/runtime-benchmarks", - "vesting/runtime-benchmarks", + "pallet-balances/runtime-benchmarks", + "pallet-collective/runtime-benchmarks", + "pallet-democracy/runtime-benchmarks", + "pallet-elections-phragmen/runtime-benchmarks", + "pallet-im-online/runtime-benchmarks", + "pallet-scheduler/runtime-benchmarks", + "pallet-staking/runtime-benchmarks", + "pallet-timestamp/runtime-benchmarks", + "pallet-treasury/runtime-benchmarks", + "pallet-vesting/runtime-benchmarks", "pallet-offences-benchmarking", "pallet-session-benchmarking", # renable when optional diff --git a/runtime/polkadot/src/constants.rs b/runtime/polkadot/src/constants.rs index 8ad5478bca..f784e9fca1 100644 --- a/runtime/polkadot/src/constants.rs +++ b/runtime/polkadot/src/constants.rs @@ -61,7 +61,7 @@ pub mod fee { /// node's balance type. /// /// This should typically create a mapping between the following ranges: - /// - [0, system::MaximumBlockWeight] + /// - [0, frame_system::MaximumBlockWeight] /// - [Balance::min, Balance::max] /// /// Yet, it can be used for any other sort of change to weight-fee. Some examples being: diff --git a/runtime/polkadot/src/lib.rs b/runtime/polkadot/src/lib.rs index 13de7985ed..77b53f2563 100644 --- a/runtime/polkadot/src/lib.rs +++ b/runtime/polkadot/src/lib.rs @@ -44,10 +44,10 @@ use sp_runtime::{create_runtime_str, generic, impl_opaque_keys, ModuleId, ApplyE }}; #[cfg(feature = "runtime-benchmarks")] use sp_runtime::RuntimeString; -use version::RuntimeVersion; -use grandpa::{AuthorityId as GrandpaId, fg_primitives}; +use sp_version::RuntimeVersion; +use pallet_grandpa::{AuthorityId as GrandpaId, fg_primitives}; #[cfg(any(feature = "std", test))] -use version::NativeVersion; +use sp_version::NativeVersion; use sp_core::OpaqueMetadata; use sp_staking::SessionIndex; use frame_support::{ @@ -55,19 +55,19 @@ use frame_support::{ traits::{KeyOwnerProofSystem, SplitTwoWays, Randomness, LockIdentifier, Filter}, weights::Weight, }; -use system::{EnsureRoot, EnsureOneOf, EnsureSignedBy}; -use im_online::sr25519::AuthorityId as ImOnlineId; +use frame_system::{EnsureRoot, EnsureOneOf, EnsureSignedBy}; +use pallet_im_online::sr25519::AuthorityId as ImOnlineId; use authority_discovery_primitives::AuthorityId as AuthorityDiscoveryId; -use transaction_payment_rpc_runtime_api::RuntimeDispatchInfo; -use session::historical as session_historical; +use pallet_transaction_payment_rpc_runtime_api::RuntimeDispatchInfo; +use pallet_session::historical as session_historical; use static_assertions::const_assert; #[cfg(feature = "std")] -pub use staking::StakerStatus; +pub use pallet_staking::StakerStatus; #[cfg(any(feature = "std", test))] pub use sp_runtime::BuildStorage; -pub use timestamp::Call as TimestampCall; -pub use balances::Call as BalancesCall; +pub use pallet_timestamp::Call as TimestampCall; +pub use pallet_balances::Call as BalancesCall; pub use attestations::{Call as AttestationsCall, MORE_ATTESTATIONS_IDENTIFIER}; pub use parachains::Call as ParachainsCall; @@ -94,7 +94,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { #[cfg(not(feature = "disable-runtime-api"))] apis: RUNTIME_API_VERSIONS, #[cfg(feature = "disable-runtime-api")] - apis: version::create_apis_vec![[]], + apis: sp_version::create_apis_vec![[]], transaction_version: 4, }; @@ -136,14 +136,14 @@ impl Filter for BaseFilter { type MoreThanHalfCouncil = EnsureOneOf< AccountId, EnsureRoot, - collective::EnsureProportionMoreThan<_1, _2, AccountId, CouncilCollective> + pallet_collective::EnsureProportionMoreThan<_1, _2, AccountId, CouncilCollective> >; parameter_types! { pub const Version: RuntimeVersion = VERSION; } -impl system::Trait for Runtime { +impl frame_system::Trait for Runtime { type BaseCallFilter = BaseFilter; type Origin = Origin; type Call = Call; @@ -165,13 +165,13 @@ impl system::Trait for Runtime { type AvailableBlockRatio = AvailableBlockRatio; type Version = Version; type ModuleToIndex = ModuleToIndex; - type AccountData = balances::AccountData; + type AccountData = pallet_balances::AccountData; type OnNewAccount = (); type OnKilledAccount = (); type SystemWeightInfo = (); } -impl scheduler::Trait for Runtime { +impl pallet_scheduler::Trait for Runtime { type Event = Event; type Origin = Origin; type PalletsOrigin = OriginCaller; @@ -186,34 +186,34 @@ parameter_types! { pub const ExpectedBlockTime: Moment = MILLISECS_PER_BLOCK; } -impl babe::Trait for Runtime { +impl pallet_babe::Trait for Runtime { type EpochDuration = EpochDuration; type ExpectedBlockTime = ExpectedBlockTime; // session module is the trigger - type EpochChangeTrigger = babe::ExternalTrigger; + type EpochChangeTrigger = pallet_babe::ExternalTrigger; type KeyOwnerProofSystem = Historical; type KeyOwnerProof = >::Proof; type KeyOwnerIdentification = >::IdentificationTuple; type HandleEquivocation = - babe::EquivocationHandler; + pallet_babe::EquivocationHandler; } parameter_types! { pub const IndexDeposit: Balance = 10 * DOLLARS; } -impl indices::Trait for Runtime { +impl pallet_indices::Trait for Runtime { type AccountIndex = AccountIndex; type Currency = Balances; type Deposit = IndexDeposit; @@ -233,20 +233,20 @@ pub type DealWithFees = SplitTwoWays< _1, ToAuthor, // 1 part (20%) goes to the block author. >; -impl balances::Trait for Runtime { +impl pallet_balances::Trait for Runtime { type Balance = Balance; type DustRemoval = (); type Event = Event; type ExistentialDeposit = ExistentialDeposit; type AccountStore = System; - type WeightInfo = weights::balances::WeightInfo; + type WeightInfo = weights::pallet_balances::WeightInfo; } parameter_types! { pub const TransactionByteFee: Balance = 10 * MILLICENTS; } -impl transaction_payment::Trait for Runtime { +impl pallet_transaction_payment::Trait for Runtime { type Currency = Balances; type OnTransactionPayment = DealWithFees; type TransactionByteFee = TransactionByteFee; @@ -257,7 +257,7 @@ impl transaction_payment::Trait for Runtime { parameter_types! { pub const MinimumPeriod: u64 = SLOT_DURATION / 2; } -impl timestamp::Trait for Runtime { +impl pallet_timestamp::Trait for Runtime { type Moment = u64; type OnTimestampSet = Babe; type MinimumPeriod = MinimumPeriod; @@ -269,8 +269,8 @@ parameter_types! { } // TODO: substrate#2986 implement this properly -impl authorship::Trait for Runtime { - type FindAuthor = session::FindAccountFromAuthorIndex; +impl pallet_authorship::Trait for Runtime { + type FindAuthor = pallet_session::FindAccountFromAuthorIndex; type UncleGenerations = UncleGenerations; type FilterUncle = (); type EventHandler = (Staking, ImOnline); @@ -290,22 +290,22 @@ parameter_types! { pub const DisabledValidatorsThreshold: Perbill = Perbill::from_percent(17); } -impl session::Trait for Runtime { +impl pallet_session::Trait for Runtime { type Event = Event; type ValidatorId = AccountId; - type ValidatorIdOf = staking::StashOf; + type ValidatorIdOf = pallet_staking::StashOf; type ShouldEndSession = Babe; type NextSessionRotation = Babe; - type SessionManager = session::historical::NoteHistoricalRoot; + type SessionManager = pallet_session::historical::NoteHistoricalRoot; type SessionHandler = ::KeyTypeIdProviders; type Keys = SessionKeys; type DisabledValidatorsThreshold = DisabledValidatorsThreshold; type WeightInfo = (); } -impl session::historical::Trait for Runtime { - type FullIdentification = staking::Exposure; - type FullIdentificationOf = staking::ExposureOf; +impl pallet_session::historical::Trait for Runtime { + type FullIdentification = pallet_staking::Exposure; + type FullIdentificationOf = pallet_staking::ExposureOf; } // TODO #6469: This shouldn't be static, but a lazily cached value, not built unless needed, and @@ -328,8 +328,8 @@ parameter_types! { // Six sessions in an era (24 hours). pub const SessionsPerEra: SessionIndex = 6; // 28 eras for unbonding (28 days). - pub const BondingDuration: staking::EraIndex = 28; - pub const SlashDeferDuration: staking::EraIndex = 27; + pub const BondingDuration: pallet_staking::EraIndex = 28; + pub const SlashDeferDuration: pallet_staking::EraIndex = 27; pub const RewardCurve: &'static PiecewiseLinear<'static> = &REWARD_CURVE; pub const MaxNominatorRewardedPerValidator: u32 = 64; // last 15 minutes of the last session will be for election. @@ -341,10 +341,10 @@ parameter_types! { type SlashCancelOrigin = EnsureOneOf< AccountId, EnsureRoot, - collective::EnsureProportionAtLeast<_3, _4, AccountId, CouncilCollective> + pallet_collective::EnsureProportionAtLeast<_3, _4, AccountId, CouncilCollective> >; -impl staking::Trait for Runtime { +impl pallet_staking::Trait for Runtime { type Currency = Balances; type UnixTime = Timestamp; type CurrencyToVote = CurrencyToVoteHandler; @@ -379,7 +379,7 @@ parameter_types! { pub const MaxRegistrars: u32 = 20; } -impl identity::Trait for Runtime { +impl pallet_identity::Trait for Runtime { type Event = Event; type Currency = Balances; type BasicDeposit = BasicDeposit; @@ -407,7 +407,7 @@ parameter_types! { pub const MaxVotes: u32 = 100; } -impl democracy::Trait for Runtime { +impl pallet_democracy::Trait for Runtime { type Proposal = Call; type Event = Event; type Currency = Balances; @@ -416,44 +416,44 @@ impl democracy::Trait for Runtime { type VotingPeriod = VotingPeriod; type MinimumDeposit = MinimumDeposit; /// A straight majority of the council can decide what their next motion is. - type ExternalOrigin = system::EnsureOneOf, - system::EnsureRoot, + type ExternalOrigin = frame_system::EnsureOneOf, + frame_system::EnsureRoot, >; /// A 60% super-majority can have the next scheduled referendum be a straight majority-carries vote. - type ExternalMajorityOrigin = system::EnsureOneOf, - system::EnsureRoot, + type ExternalMajorityOrigin = frame_system::EnsureOneOf, + frame_system::EnsureRoot, >; /// A unanimous council can have the next scheduled referendum be a straight default-carries /// (NTB) vote. - type ExternalDefaultOrigin = system::EnsureOneOf, - system::EnsureRoot, + type ExternalDefaultOrigin = frame_system::EnsureOneOf, + frame_system::EnsureRoot, >; /// Two thirds of the technical committee can have an ExternalMajority/ExternalDefault vote /// be tabled immediately and with a shorter voting/enactment period. - type FastTrackOrigin = system::EnsureOneOf, - system::EnsureRoot, + type FastTrackOrigin = frame_system::EnsureOneOf, + frame_system::EnsureRoot, >; - type InstantOrigin = system::EnsureOneOf, - system::EnsureRoot, + type InstantOrigin = frame_system::EnsureOneOf, + frame_system::EnsureRoot, >; type InstantAllowed = InstantAllowed; type FastTrackVotingPeriod = FastTrackVotingPeriod; // To cancel a proposal which has been passed, 2/3 of the council must agree to it. - type CancellationOrigin = system::EnsureOneOf, - system::EnsureRoot, + type CancellationOrigin = frame_system::EnsureOneOf, + frame_system::EnsureRoot, >; // Any single technical committee member may veto a coming council proposal, however they can // only do it once and it lasts only for the cooloff period. - type VetoOrigin = collective::EnsureMember; + type VetoOrigin = pallet_collective::EnsureMember; type CooloffPeriod = CooloffPeriod; type PreimageByteDeposit = PreimageByteDeposit; - type OperationalPreimageOrigin = collective::EnsureMember; + type OperationalPreimageOrigin = pallet_collective::EnsureMember; type Slash = Treasury; type Scheduler = Scheduler; type PalletsOrigin = OriginCaller; @@ -466,8 +466,8 @@ parameter_types! { pub const CouncilMaxProposals: u32 = 100; } -type CouncilCollective = collective::Instance1; -impl collective::Trait for Runtime { +type CouncilCollective = pallet_collective::Instance1; +impl pallet_collective::Trait for Runtime { type Origin = Origin; type Proposal = Call; type Event = Event; @@ -487,9 +487,9 @@ parameter_types! { pub const ElectionsPhragmenModuleId: LockIdentifier = *b"phrelect"; } // Make sure that there are no more than MAX_MEMBERS members elected via phragmen. -const_assert!(DesiredMembers::get() <= collective::MAX_MEMBERS); +const_assert!(DesiredMembers::get() <= pallet_collective::MAX_MEMBERS); -impl elections_phragmen::Trait for Runtime { +impl pallet_elections_phragmen::Trait for Runtime { type Event = Event; type ModuleId = ElectionsPhragmenModuleId; type Currency = Balances; @@ -512,8 +512,8 @@ parameter_types! { pub const TechnicalMaxProposals: u32 = 100; } -type TechnicalCollective = collective::Instance2; -impl collective::Trait for Runtime { +type TechnicalCollective = pallet_collective::Instance2; +impl pallet_collective::Trait for Runtime { type Origin = Origin; type Proposal = Call; type Event = Event; @@ -522,7 +522,7 @@ impl collective::Trait for Runtime { type WeightInfo = (); } -impl membership::Trait for Runtime { +impl pallet_membership::Trait for Runtime { type Event = Event; type AddOrigin = MoreThanHalfCouncil; type RemoveOrigin = MoreThanHalfCouncil; @@ -549,10 +549,10 @@ parameter_types! { type ApproveOrigin = EnsureOneOf< AccountId, EnsureRoot, - collective::EnsureProportionAtLeast<_3, _5, AccountId, CouncilCollective> + pallet_collective::EnsureProportionAtLeast<_3, _5, AccountId, CouncilCollective> >; -impl treasury::Trait for Runtime { +impl pallet_treasury::Trait for Runtime { type ModuleId = TreasuryModuleId; type Currency = Balances; type ApproveOrigin = ApproveOrigin; @@ -576,15 +576,15 @@ parameter_types! { pub OffencesWeightSoftLimit: Weight = Perbill::from_percent(60) * MaximumBlockWeight::get(); } -impl offences::Trait for Runtime { +impl pallet_offences::Trait for Runtime { type Event = Event; - type IdentificationTuple = session::historical::IdentificationTuple; + type IdentificationTuple = pallet_session::historical::IdentificationTuple; type OnOffenceHandler = Staking; type WeightSoftLimit = OffencesWeightSoftLimit; type WeightInfo = (); } -impl authority_discovery::Trait for Runtime {} +impl pallet_authority_discovery::Trait for Runtime {} parameter_types! { pub const SessionDuration: BlockNumber = EPOCH_DURATION_IN_BLOCKS as _; @@ -595,7 +595,7 @@ parameter_types! { pub const ImOnlineUnsignedPriority: TransactionPriority = TransactionPriority::max_value(); } -impl im_online::Trait for Runtime { +impl pallet_im_online::Trait for Runtime { type AuthorityId = ImOnlineId; type Event = Event; type SessionDuration = SessionDuration; @@ -604,7 +604,7 @@ impl im_online::Trait for Runtime { type WeightInfo = (); } -impl grandpa::Trait for Runtime { +impl pallet_grandpa::Trait for Runtime { type Event = Event; type Call = Call; @@ -618,15 +618,15 @@ impl grandpa::Trait for Runtime { type KeyOwnerProofSystem = Historical; - type HandleEquivocation = grandpa::EquivocationHandler; + type HandleEquivocation = pallet_grandpa::EquivocationHandler; } parameter_types! { - pub WindowSize: BlockNumber = finality_tracker::DEFAULT_WINDOW_SIZE.into(); - pub ReportLatency: BlockNumber = finality_tracker::DEFAULT_REPORT_LATENCY.into(); + pub WindowSize: BlockNumber = pallet_finality_tracker::DEFAULT_WINDOW_SIZE.into(); + pub ReportLatency: BlockNumber = pallet_finality_tracker::DEFAULT_REPORT_LATENCY.into(); } -impl finality_tracker::Trait for Runtime { +impl pallet_finality_tracker::Trait for Runtime { type OnFinalizationStalled = (); type WindowSize = WindowSize; type ReportLatency = ReportLatency; @@ -668,7 +668,7 @@ impl parachains::Trait for Runtime { type SlashPeriod = SlashPeriod; type Proof = sp_session::MembershipProof; - type KeyOwnerProofSystem = session::historical::Module; + type KeyOwnerProofSystem = pallet_session::historical::Module; type IdentificationTuple = )>>::IdentificationTuple; type ReportOffence = Offences; type BlockHashConversion = sp_runtime::traits::Identity; @@ -676,14 +676,14 @@ impl parachains::Trait for Runtime { /// Submits a transaction with the node's public and signature type. Adheres to the signed extension /// format of the chain. -impl system::offchain::CreateSignedTransaction for Runtime where +impl frame_system::offchain::CreateSignedTransaction for Runtime where Call: From, { - fn create_transaction>( + fn create_transaction>( call: Call, public: ::Signer, account: AccountId, - nonce: ::Index, + nonce: ::Index, ) -> Option<(Call, ::SignaturePayload)> { // take the biggest period possible. let period = BlockHashCount::get() @@ -698,13 +698,13 @@ impl system::offchain::CreateSignedTransaction for Runtime .saturating_sub(1); let tip = 0; let extra: SignedExtra = ( - system::CheckSpecVersion::::new(), - system::CheckTxVersion::::new(), - system::CheckGenesis::::new(), - system::CheckMortality::::from(generic::Era::mortal(period, current_block)), - system::CheckNonce::::from(nonce), - system::CheckWeight::::new(), - transaction_payment::ChargeTransactionPayment::::from(tip), + frame_system::CheckSpecVersion::::new(), + frame_system::CheckTxVersion::::new(), + frame_system::CheckGenesis::::new(), + frame_system::CheckMortality::::from(generic::Era::mortal(period, current_block)), + frame_system::CheckNonce::::from(nonce), + frame_system::CheckWeight::::new(), + pallet_transaction_payment::ChargeTransactionPayment::::from(tip), registrar::LimitParathreadCommits::::new(), parachains::ValidateDoubleVoteReports::::new(), claims::PrevalidateAttests::::new(), @@ -720,12 +720,12 @@ impl system::offchain::CreateSignedTransaction for Runtime } } -impl system::offchain::SigningTypes for Runtime { +impl frame_system::offchain::SigningTypes for Runtime { type Public = ::Signer; type Signature = Signature; } -impl system::offchain::SendTransactionTypes for Runtime where Call: From { +impl frame_system::offchain::SendTransactionTypes for Runtime where Call: From { type Extrinsic = UncheckedExtrinsic; type OverarchingCall = Call; } @@ -769,14 +769,14 @@ impl claims::Trait for Runtime { type VestingSchedule = Vesting; type Prefix = Prefix; /// At least 3/4 of the council must agree to a claim move before it can happen. - type MoveClaimOrigin = collective::EnsureProportionAtLeast<_3, _4, AccountId, CouncilCollective>; + type MoveClaimOrigin = pallet_collective::EnsureProportionAtLeast<_3, _4, AccountId, CouncilCollective>; } parameter_types! { pub const MinVestedTransfer: Balance = 100 * DOLLARS; } -impl vesting::Trait for Runtime { +impl pallet_vesting::Trait for Runtime { type Event = Event; type Currency = Balances; type BlockNumberToBalance = ConvertInto; @@ -784,7 +784,7 @@ impl vesting::Trait for Runtime { type WeightInfo = (); } -impl utility::Trait for Runtime { +impl pallet_utility::Trait for Runtime { type Event = Event; type Call = Call; type WeightInfo = (); @@ -798,7 +798,7 @@ parameter_types! { pub const MaxSignatories: u16 = 100; } -impl multisig::Trait for Runtime { +impl pallet_multisig::Trait for Runtime { type Event = Event; type Call = Call; type Currency = Balances; @@ -866,9 +866,9 @@ impl InstanceFilter for ProxyType { Call::Scheduler(..) | Call::Babe(..) | Call::Timestamp(..) | - Call::Indices(indices::Call::claim(..)) | - Call::Indices(indices::Call::free(..)) | - Call::Indices(indices::Call::freeze(..)) | + Call::Indices(pallet_indices::Call::claim(..)) | + Call::Indices(pallet_indices::Call::free(..)) | + Call::Indices(pallet_indices::Call::freeze(..)) | // Specifically omitting Indices `transfer`, `force_transfer` // Specifically omitting the entire Balances pallet Call::Authorship(..) | @@ -890,8 +890,8 @@ impl InstanceFilter for ProxyType { Call::Slots(..) | Call::Registrar(..) | Call::Claims(..) | - Call::Vesting(vesting::Call::vest(..)) | - Call::Vesting(vesting::Call::vest_other(..)) | + Call::Vesting(pallet_vesting::Call::vest(..)) | + Call::Vesting(pallet_vesting::Call::vest_other(..)) | // Specifically omitting Vesting `vested_transfer`, and `force_vested_transfer` Call::Utility(..) | Call::Identity(..) | @@ -903,11 +903,11 @@ impl InstanceFilter for ProxyType { | Call::ElectionsPhragmen(..) | Call::Treasury(..) | Call::Utility(..) ), ProxyType::Staking => matches!(c, - Call::Staking(..) | Call::Utility(utility::Call::batch(..)) | Call::Utility(..) + Call::Staking(..) | Call::Utility(pallet_utility::Call::batch(..)) | Call::Utility(..) ), ProxyType::IdentityJudgement => matches!(c, - Call::Identity(identity::Call::provide_judgement(..)) - | Call::Utility(utility::Call::batch(..)) + Call::Identity(pallet_identity::Call::provide_judgement(..)) + | Call::Utility(pallet_utility::Call::batch(..)) ) } } @@ -922,7 +922,7 @@ impl InstanceFilter for ProxyType { } } -impl proxy::Trait for Runtime { +impl pallet_proxy::Trait for Runtime { type Event = Event; type Call = Call; type Currency = Balances; @@ -937,7 +937,7 @@ pub struct CustomOnRuntimeUpgrade; impl frame_support::traits::OnRuntimeUpgrade for CustomOnRuntimeUpgrade { fn on_runtime_upgrade() -> frame_support::weights::Weight { use frame_support::storage::{StorageMap, IterableStorageMap}; - use democracy::{VotingOf, Conviction, Voting::Direct, AccountVote::Standard}; + use pallet_democracy::{VotingOf, Conviction, Voting::Direct, AccountVote::Standard}; // Cancel convictions for Referendum Zero (for removing Sudo - this is something we would // have done anyway). for (who, mut voting) in VotingOf::::iter() { @@ -949,7 +949,7 @@ impl frame_support::traits::OnRuntimeUpgrade for CustomOnRuntimeUpgrade { VotingOf::::insert(who, voting); } - ::MaximumBlockWeight::get() + ::MaximumBlockWeight::get() } } @@ -957,9 +957,9 @@ impl frame_support::traits::OnRuntimeUpgrade for CustomOnRuntimeUpgrade { fn test_rm_ref_0() { use sp_runtime::AccountId32; use frame_support::{traits::OnRuntimeUpgrade, storage::StorageMap}; - use democracy::{VotingOf, Vote, Voting::{Direct, Delegating}, AccountVote::{Standard, Split}}; - use democracy::Conviction::{Locked1x, Locked2x, Locked3x, None as NoConviction}; - let t = system::GenesisConfig::default().build_storage::().unwrap(); + use pallet_democracy::{VotingOf, Vote, Voting::{Direct, Delegating}, AccountVote::{Standard, Split}}; + use pallet_democracy::Conviction::{Locked1x, Locked2x, Locked3x, None as NoConviction}; + let t = frame_system::GenesisConfig::default().build_storage::().unwrap(); let mut ext = sp_io::TestExternalities::new(t); ext.execute_with(|| { let a = |i| AccountId32::from([i; 32]); @@ -1087,36 +1087,36 @@ construct_runtime! { UncheckedExtrinsic = UncheckedExtrinsic { // Basic stuff; balances is uncallable initially. - System: system::{Module, Call, Storage, Config, Event}, - RandomnessCollectiveFlip: randomness_collective_flip::{Module, Storage}, - Scheduler: scheduler::{Module, Call, Storage, Event}, + System: frame_system::{Module, Call, Storage, Config, Event}, + RandomnessCollectiveFlip: pallet_randomness_collective_flip::{Module, Storage}, + Scheduler: pallet_scheduler::{Module, Call, Storage, Event}, // Must be before session. - Babe: babe::{Module, Call, Storage, Config, Inherent, ValidateUnsigned}, + Babe: pallet_babe::{Module, Call, Storage, Config, Inherent, ValidateUnsigned}, - Timestamp: timestamp::{Module, Call, Storage, Inherent}, - Indices: indices::{Module, Call, Storage, Config, Event}, - Balances: balances::{Module, Call, Storage, Config, Event}, - TransactionPayment: transaction_payment::{Module, Storage}, + Timestamp: pallet_timestamp::{Module, Call, Storage, Inherent}, + Indices: pallet_indices::{Module, Call, Storage, Config, Event}, + Balances: pallet_balances::{Module, Call, Storage, Config, Event}, + TransactionPayment: pallet_transaction_payment::{Module, Storage}, // Consensus support. - Authorship: authorship::{Module, Call, Storage}, - Staking: staking::{Module, Call, Storage, Config, Event, ValidateUnsigned}, - Offences: offences::{Module, Call, Storage, Event}, + Authorship: pallet_authorship::{Module, Call, Storage}, + Staking: pallet_staking::{Module, Call, Storage, Config, Event, ValidateUnsigned}, + Offences: pallet_offences::{Module, Call, Storage, Event}, Historical: session_historical::{Module}, - Session: session::{Module, Call, Storage, Event, Config}, - FinalityTracker: finality_tracker::{Module, Call, Storage, Inherent}, - Grandpa: grandpa::{Module, Call, Storage, Config, Event, ValidateUnsigned}, - ImOnline: im_online::{Module, Call, Storage, Event, ValidateUnsigned, Config}, - AuthorityDiscovery: authority_discovery::{Module, Call, Config}, + Session: pallet_session::{Module, Call, Storage, Event, Config}, + FinalityTracker: pallet_finality_tracker::{Module, Call, Storage, Inherent}, + Grandpa: pallet_grandpa::{Module, Call, Storage, Config, Event, ValidateUnsigned}, + ImOnline: pallet_im_online::{Module, Call, Storage, Event, ValidateUnsigned, Config}, + AuthorityDiscovery: pallet_authority_discovery::{Module, Call, Config}, // Governance stuff. - Democracy: democracy::{Module, Call, Storage, Config, Event}, - Council: collective::::{Module, Call, Storage, Origin, Event, Config}, - TechnicalCommittee: collective::::{Module, Call, Storage, Origin, Event, Config}, - ElectionsPhragmen: elections_phragmen::{Module, Call, Storage, Event, Config}, - TechnicalMembership: membership::::{Module, Call, Storage, Event, Config}, - Treasury: treasury::{Module, Call, Storage, Event}, + Democracy: pallet_democracy::{Module, Call, Storage, Config, Event}, + Council: pallet_collective::::{Module, Call, Storage, Origin, Event, Config}, + TechnicalCommittee: pallet_collective::::{Module, Call, Storage, Origin, Event, Config}, + ElectionsPhragmen: pallet_elections_phragmen::{Module, Call, Storage, Event, Config}, + TechnicalMembership: pallet_membership::::{Module, Call, Storage, Event, Config}, + Treasury: pallet_treasury::{Module, Call, Storage, Event}, // Parachains stuff; slots are disabled (no auctions initially). The rest are safe as they // have no public dispatchables. Disabled `Call` on all of them, but this should be @@ -1129,21 +1129,21 @@ construct_runtime! { // Claims. Usable initially. Claims: claims::{Module, Call, Storage, Event, Config, ValidateUnsigned}, // Vesting. Usable initially, but removed once all vesting is finished. - Vesting: vesting::{Module, Call, Storage, Event, Config}, + Vesting: pallet_vesting::{Module, Call, Storage, Event, Config}, // Cunning utilities. Usable initially. - Utility: utility::{Module, Call, Event}, + Utility: pallet_utility::{Module, Call, Event}, // DOT Purchase module. Late addition; this is in place of Sudo. Purchase: purchase::{Module, Call, Storage, Event}, // Identity. Late addition. - Identity: identity::{Module, Call, Storage, Event}, + Identity: pallet_identity::{Module, Call, Storage, Event}, // Proxy module. Late addition. - Proxy: proxy::{Module, Call, Storage, Event}, + Proxy: pallet_proxy::{Module, Call, Storage, Event}, // Multisig dispatch. Late addition. - Multisig: multisig::{Module, Call, Storage, Event}, + Multisig: pallet_multisig::{Module, Call, Storage, Event}, } } @@ -1159,13 +1159,13 @@ pub type SignedBlock = generic::SignedBlock; pub type BlockId = generic::BlockId; /// The SignedExtension to the basic transaction logic. pub type SignedExtra = ( - system::CheckSpecVersion, - system::CheckTxVersion, - system::CheckGenesis, - system::CheckMortality, - system::CheckNonce, - system::CheckWeight, - transaction_payment::ChargeTransactionPayment, + frame_system::CheckSpecVersion, + frame_system::CheckTxVersion, + frame_system::CheckGenesis, + frame_system::CheckMortality, + frame_system::CheckNonce, + frame_system::CheckWeight, + pallet_transaction_payment::ChargeTransactionPayment, registrar::LimitParathreadCommits, parachains::ValidateDoubleVoteReports, claims::PrevalidateAttests, @@ -1175,10 +1175,10 @@ pub type UncheckedExtrinsic = generic::UncheckedExtrinsic; /// Executive: handles dispatch to the various modules. -pub type Executive = executive::Executive< +pub type Executive = frame_executive::Executive< Runtime, Block, - system::ChainContext, + frame_system::ChainContext, Runtime, AllModules, CustomOnRuntimeUpgrade @@ -1385,13 +1385,13 @@ sp_api::impl_runtime_apis! { } } - impl system_rpc_runtime_api::AccountNonceApi for Runtime { + impl frame_system_rpc_runtime_api::AccountNonceApi for Runtime { fn account_nonce(account: AccountId) -> Nonce { System::account_nonce(account) } } - impl transaction_payment_rpc_runtime_api::TransactionPaymentApi< + impl pallet_transaction_payment_rpc_runtime_api::TransactionPaymentApi< Block, Balance, > for Runtime { @@ -1455,19 +1455,19 @@ sp_api::impl_runtime_apis! { // Polkadot add_benchmark!(params, batches, claims, Claims); // Substrate - add_benchmark!(params, batches, balances, Balances); - add_benchmark!(params, batches, collective, Council); - add_benchmark!(params, batches, democracy, Democracy); - add_benchmark!(params, batches, elections_phragmen, ElectionsPhragmen); - add_benchmark!(params, batches, im_online, ImOnline); - add_benchmark!(params, batches, offences, OffencesBench::); - add_benchmark!(params, batches, scheduler, Scheduler); - add_benchmark!(params, batches, session, SessionBench::); - add_benchmark!(params, batches, staking, Staking); - add_benchmark!(params, batches, system, SystemBench::); - add_benchmark!(params, batches, timestamp, Timestamp); - add_benchmark!(params, batches, treasury, Treasury); - add_benchmark!(params, batches, vesting, Vesting); + add_benchmark!(params, batches, pallet_balances, Balances); + add_benchmark!(params, batches, pallet_collective, Council); + add_benchmark!(params, batches, pallet_democracy, Democracy); + add_benchmark!(params, batches, pallet_elections_phragmen, ElectionsPhragmen); + add_benchmark!(params, batches, pallet_im_online, ImOnline); + add_benchmark!(params, batches, pallet_offences, OffencesBench::); + add_benchmark!(params, batches, pallet_scheduler, Scheduler); + add_benchmark!(params, batches, pallet_session, SessionBench::); + add_benchmark!(params, batches, pallet_staking, Staking); + add_benchmark!(params, batches, frame_system, SystemBench::); + add_benchmark!(params, batches, pallet_timestamp, Timestamp); + add_benchmark!(params, batches, pallet_treasury, Treasury); + add_benchmark!(params, batches, pallet_vesting, Vesting); if batches.is_empty() { return Err("Benchmark not found for this pallet.".into()) } Ok(batches) diff --git a/runtime/polkadot/src/weights/mod.rs b/runtime/polkadot/src/weights/mod.rs index 75cabca0c6..b94314e339 100644 --- a/runtime/polkadot/src/weights/mod.rs +++ b/runtime/polkadot/src/weights/mod.rs @@ -16,4 +16,4 @@ /// A collection of weight modules used for pallets in the runtime. -pub mod balances; +pub mod pallet_balances; diff --git a/runtime/polkadot/src/weights/balances.rs b/runtime/polkadot/src/weights/pallet_balances.rs similarity index 97% rename from runtime/polkadot/src/weights/balances.rs rename to runtime/polkadot/src/weights/pallet_balances.rs index bc2f3ac18a..53431ba48f 100644 --- a/runtime/polkadot/src/weights/balances.rs +++ b/runtime/polkadot/src/weights/pallet_balances.rs @@ -18,7 +18,7 @@ use frame_support::weights::{Weight, constants::RocksDbWeight as DbWeight}; pub struct WeightInfo; -impl balances::WeightInfo for WeightInfo { +impl pallet_balances::WeightInfo for WeightInfo { fn transfer() -> Weight { (65949000 as Weight) .saturating_add(DbWeight::get().reads(1 as Weight)) diff --git a/runtime/polkadot/tests/weights.rs b/runtime/polkadot/tests/weights.rs index 70f9d7e4f9..51b9258341 100644 --- a/runtime/polkadot/tests/weights.rs +++ b/runtime/polkadot/tests/weights.rs @@ -19,7 +19,7 @@ //! //! These test are not meant to be exhaustive, as it is inevitable that //! weights in Substrate will change. Instead they are supposed to provide -//! some sort of indicator that calls we consider important (e.g Balances::transfer) +//! some sort of indicator that calls we consider important (e.g pallet_balances::transfer) //! have not suddenly changed from under us. use frame_support::{ @@ -32,14 +32,14 @@ use polkadot_runtime::{self, Runtime}; use primitives::v0::AccountId; use runtime_common::MaximumBlockWeight; -use democracy::Call as DemocracyCall; -use elections_phragmen::Call as PhragmenCall; -use session::Call as SessionCall; -use staking::Call as StakingCall; -use system::Call as SystemCall; -use treasury::Call as TreasuryCall; +use pallet_democracy::Call as DemocracyCall; +use pallet_elections_phragmen::Call as PhragmenCall; +use pallet_session::Call as SessionCall; +use pallet_staking::Call as StakingCall; +use frame_system::Call as SystemCall; +use pallet_treasury::Call as TreasuryCall; -type DbWeight = ::DbWeight; +type DbWeight = ::DbWeight; #[test] fn sanity_check_weight_per_time_constants_are_as_expected() { @@ -170,7 +170,7 @@ fn weight_of_democracy_propose_is_correct() { #[test] fn weight_of_democracy_vote_is_correct() { - use democracy::AccountVote; + use pallet_democracy::AccountVote; let vote = AccountVote::Standard { vote: Default::default(), balance: Default::default() }; // #[weight = 50_000_000 + 350_000 * Weight::from(T::MaxVotes::get()) + T::DbWeight::get().reads_writes(3, 3)] @@ -213,7 +213,7 @@ fn weight_of_phragmen_submit_candidacy_is_correct() { #[test] fn weight_of_phragmen_renounce_candidacy_is_correct() { let expected_weight = 46 * WEIGHT_PER_MICROS + DbWeight::get().reads_writes(2, 2); - let weight = PhragmenCall::renounce_candidacy::(elections_phragmen::Renouncing::Member) + let weight = PhragmenCall::renounce_candidacy::(pallet_elections_phragmen::Renouncing::Member) .get_dispatch_info().weight; assert_eq!(weight, expected_weight); @@ -240,7 +240,7 @@ fn weight_of_treasury_approve_proposal_is_correct() { #[test] fn weight_of_treasury_tip_is_correct() { - let max_len: Weight = ::Tippers::max_len() as Weight; + let max_len: Weight = ::Tippers::max_len() as Weight; // #[weight = 68_000_000 + 2_000_000 * T::Tippers::max_len() as Weight // + T::DbWeight::get().reads_writes(2, 1)] diff --git a/runtime/rococo-v1/Cargo.toml b/runtime/rococo-v1/Cargo.toml index 8a9228a6ac..25e49e6e29 100644 --- a/runtime/rococo-v1/Cargo.toml +++ b/runtime/rococo-v1/Cargo.toml @@ -19,33 +19,33 @@ sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "master sp-session = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } sp-staking = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } sp-core = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -version = { package = "sp-version", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +sp-version = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } tx-pool-api = { package = "sp-transaction-pool", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } block-builder-api = { package = "sp-block-builder", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } inherents = { package = "sp-inherents", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } offchain-primitives = { package = "sp-offchain", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -authority-discovery = { package = "pallet-authority-discovery", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -authorship = { package = "pallet-authorship", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -babe = { package = "pallet-babe", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-authority-discovery = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-authorship = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-babe = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } babe-primitives = { package = "sp-consensus-babe", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -balances = { package = "pallet-balances", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -session = { package = "pallet-session", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -im-online = { package = "pallet-im-online", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -indices = { package = "pallet-indices", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -transaction-payment = { package = "pallet-transaction-payment", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -transaction-payment-rpc-runtime-api = { package = "pallet-transaction-payment-rpc-runtime-api", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -staking = { package = "pallet-staking", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-balances = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-session = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-im-online = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-indices = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-transaction-payment = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-transaction-payment-rpc-runtime-api = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-staking = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } pallet-staking-reward-curve = { package = "pallet-staking-reward-curve", git = "https://github.com/paritytech/substrate", branch = "master" } -executive = { package = "frame-executive", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -grandpa = { package = "pallet-grandpa", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -timestamp = { package = "pallet-timestamp", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -offences = { package = "pallet-offences", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +frame-executive = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-grandpa = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-timestamp = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-offences = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } authority-discovery-primitives = { package = "sp-authority-discovery", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -system = { package = "frame-system", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -system_rpc_runtime_api = { package = "frame-system-rpc-runtime-api", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +frame-system = {git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +frame-system-rpc-runtime-api = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } runtime-common = { package = "polkadot-runtime-common", path = "../common", default-features = false } primitives = { package = "polkadot-primitives", path = "../../primitives", default-features = false } @@ -60,23 +60,23 @@ default = ["std"] no_std = [] std = [ "authority-discovery-primitives/std", - "authority-discovery/std", - "authorship/std", - "babe/std", + "pallet-authority-discovery/std", + "pallet-authorship/std", + "pallet-babe/std", "babe-primitives/std", - "balances/std", + "pallet-balances/std", "codec/std", - "executive/std", - "grandpa/std", - "indices/std", - "im-online/std", + "frame-executive/std", + "pallet-grandpa/std", + "pallet-indices/std", + "pallet-im-online/std", "inherents/std", "frame-support/std", "polkadot-parachain/std", "primitives/std", "runtime-common/std", "runtime-parachains/std", - "session/std", + "pallet-session/std", "sp-api/std", "sp-core/std", "sp-io/std", @@ -84,17 +84,17 @@ std = [ "sp-session/std", "sp-staking/std", "sp-std/std", - "staking/std", - "system/std", - "system_rpc_runtime_api/std", + "pallet-staking/std", + "frame-system/std", + "frame-system-rpc-runtime-api/std", "offchain-primitives/std", - "offences/std", - "timestamp/std", - "transaction-payment/std", - "transaction-payment-rpc-runtime-api/std", + "pallet-offences/std", + "pallet-timestamp/std", + "pallet-transaction-payment/std", + "pallet-transaction-payment-rpc-runtime-api/std", "block-builder-api/std", "tx-pool-api/std", - "version/std", + "sp-version/std", "serde_derive", "serde/std", ] diff --git a/runtime/rococo-v1/src/constants.rs b/runtime/rococo-v1/src/constants.rs index de95703fcc..a565ca4dbc 100644 --- a/runtime/rococo-v1/src/constants.rs +++ b/runtime/rococo-v1/src/constants.rs @@ -61,7 +61,7 @@ pub mod fee { /// node's balance type. /// /// This should typically create a mapping between the following ranges: - /// - [0, system::MaximumBlockWeight] + /// - [0, frame_system::MaximumBlockWeight] /// - [Balance::min, Balance::max] /// /// Yet, it can be used for any other sort of change to weight-fee. Some examples being: diff --git a/runtime/rococo-v1/src/lib.rs b/runtime/rococo-v1/src/lib.rs index d7df68199d..f1af47613e 100644 --- a/runtime/rococo-v1/src/lib.rs +++ b/runtime/rococo-v1/src/lib.rs @@ -52,15 +52,15 @@ use sp_runtime::{ Extrinsic as ExtrinsicT, SaturatedConversion, Verify, }, }; -use im_online::sr25519::AuthorityId as ImOnlineId; +use pallet_im_online::sr25519::AuthorityId as ImOnlineId; use authority_discovery_primitives::AuthorityId as AuthorityDiscoveryId; -use version::RuntimeVersion; -use transaction_payment_rpc_runtime_api::RuntimeDispatchInfo; -use grandpa::{AuthorityId as GrandpaId, fg_primitives}; +use sp_version::RuntimeVersion; +use pallet_transaction_payment_rpc_runtime_api::RuntimeDispatchInfo; +use pallet_grandpa::{AuthorityId as GrandpaId, fg_primitives}; use sp_core::OpaqueMetadata; use sp_staking::SessionIndex; -use session::historical as session_historical; -use system::EnsureRoot; +use pallet_session::historical as session_historical; +use frame_system::EnsureRoot; use runtime_common::paras_sudo_wrapper as paras_sudo_wrapper; use runtime_parachains::configuration as parachains_configuration; @@ -70,7 +70,7 @@ use runtime_parachains::initializer as parachains_initializer; use runtime_parachains::paras as parachains_paras; use runtime_parachains::scheduler as parachains_scheduler; -pub use balances::Call as BalancesCall; +pub use pallet_balances::Call as BalancesCall; /// Constant values used within the runtime. pub mod constants; @@ -92,13 +92,13 @@ pub type SignedBlock = generic::SignedBlock; pub type BlockId = generic::BlockId; /// The SignedExtension to the basic transaction logic. pub type SignedExtra = ( - system::CheckSpecVersion, - system::CheckTxVersion, - system::CheckGenesis, - system::CheckMortality, - system::CheckNonce, - system::CheckWeight, - transaction_payment::ChargeTransactionPayment, + frame_system::CheckSpecVersion, + frame_system::CheckTxVersion, + frame_system::CheckGenesis, + frame_system::CheckMortality, + frame_system::CheckNonce, + frame_system::CheckWeight, + pallet_transaction_payment::ChargeTransactionPayment, ); #[cfg(not(feature = "disable-runtime-api"))] @@ -305,13 +305,13 @@ sp_api::impl_runtime_apis! { } } - impl system_rpc_runtime_api::AccountNonceApi for Runtime { + impl frame_system_rpc_runtime_api::AccountNonceApi for Runtime { fn account_nonce(account: AccountId) -> Nonce { System::account_nonce(account) } } - impl transaction_payment_rpc_runtime_api::TransactionPaymentApi< + impl pallet_transaction_payment_rpc_runtime_api::TransactionPaymentApi< Block, Balance, > for Runtime { @@ -325,7 +325,7 @@ pub type UncheckedExtrinsic = generic::UncheckedExtrinsic; /// Executive: handles dispatch to the various modules. -pub type Executive = executive::Executive, Runtime, AllModules>; +pub type Executive = frame_executive::Executive, Runtime, AllModules>; /// The payload being signed in transactions. pub type SignedPayload = generic::SignedPayload; @@ -343,25 +343,25 @@ construct_runtime! { NodeBlock = primitives::v1::Block, UncheckedExtrinsic = UncheckedExtrinsic { - System: system::{Module, Call, Storage, Config, Event}, + System: frame_system::{Module, Call, Storage, Config, Event}, // Must be before session. - Babe: babe::{Module, Call, Storage, Config, Inherent, ValidateUnsigned}, + Babe: pallet_babe::{Module, Call, Storage, Config, Inherent, ValidateUnsigned}, - Timestamp: timestamp::{Module, Call, Storage, Inherent}, - Indices: indices::{Module, Call, Storage, Config, Event}, - Balances: balances::{Module, Call, Storage, Config, Event}, - TransactionPayment: transaction_payment::{Module, Storage}, + Timestamp: pallet_timestamp::{Module, Call, Storage, Inherent}, + Indices: pallet_indices::{Module, Call, Storage, Config, Event}, + Balances: pallet_balances::{Module, Call, Storage, Config, Event}, + TransactionPayment: pallet_transaction_payment::{Module, Storage}, // Consensus support. - Authorship: authorship::{Module, Call, Storage}, - Staking: staking::{Module, Call, Storage, Config, Event, ValidateUnsigned}, - Offences: offences::{Module, Call, Storage, Event}, + Authorship: pallet_authorship::{Module, Call, Storage}, + Staking: pallet_staking::{Module, Call, Storage, Config, Event, ValidateUnsigned}, + Offences: pallet_offences::{Module, Call, Storage, Event}, Historical: session_historical::{Module}, - Session: session::{Module, Call, Storage, Event, Config}, - Grandpa: grandpa::{Module, Call, Storage, Config, Event, ValidateUnsigned}, - ImOnline: im_online::{Module, Call, Storage, Event, ValidateUnsigned, Config}, - AuthorityDiscovery: authority_discovery::{Module, Call, Config}, + Session: pallet_session::{Module, Call, Storage, Event, Config}, + Grandpa: pallet_grandpa::{Module, Call, Storage, Config, Event, ValidateUnsigned}, + ImOnline: pallet_im_online::{Module, Call, Storage, Event, ValidateUnsigned, Config}, + AuthorityDiscovery: pallet_authority_discovery::{Module, Call, Config}, // Parachains modules. Config: parachains_configuration::{Module, Call, Storage}, @@ -392,7 +392,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { #[cfg(not(feature = "disable-runtime-api"))] apis: RUNTIME_API_VERSIONS, #[cfg(feature = "disable-runtime-api")] - apis: version::create_apis_vec![[]], + apis: sp_version::create_apis_vec![[]], transaction_version: 2, }; @@ -400,7 +400,7 @@ parameter_types! { pub const Version: RuntimeVersion = VERSION; } -impl system::Trait for Runtime { +impl frame_system::Trait for Runtime { type BaseCallFilter = BaseFilter; type Origin = Origin; type Call = Call; @@ -422,7 +422,7 @@ impl system::Trait for Runtime { type AvailableBlockRatio = AvailableBlockRatio; type Version = Version; type ModuleToIndex = ModuleToIndex; - type AccountData = balances::AccountData; + type AccountData = pallet_balances::AccountData; type OnNewAccount = (); type OnKilledAccount = (); type SystemWeightInfo = (); @@ -438,14 +438,14 @@ parameter_types! { /// Submits a transaction with the node's public and signature type. Adheres to the signed extension /// format of the chain. -impl system::offchain::CreateSignedTransaction for Runtime where +impl frame_system::offchain::CreateSignedTransaction for Runtime where Call: From, { - fn create_transaction>( + fn create_transaction>( call: Call, public: ::Signer, account: AccountId, - nonce: ::Index, + nonce: ::Index, ) -> Option<(Call, ::SignaturePayload)> { // take the biggest period possible. let period = BlockHashCount::get() @@ -460,13 +460,13 @@ impl system::offchain::CreateSignedTransaction for Runtime .saturating_sub(1); let tip = 0; let extra: SignedExtra = ( - system::CheckSpecVersion::::new(), - system::CheckTxVersion::::new(), - system::CheckGenesis::::new(), - system::CheckMortality::::from(generic::Era::mortal(period, current_block)), - system::CheckNonce::::from(nonce), - system::CheckWeight::::new(), - transaction_payment::ChargeTransactionPayment::::from(tip), + frame_system::CheckSpecVersion::::new(), + frame_system::CheckTxVersion::::new(), + frame_system::CheckGenesis::::new(), + frame_system::CheckMortality::::from(generic::Era::mortal(period, current_block)), + frame_system::CheckNonce::::from(nonce), + frame_system::CheckWeight::::new(), + pallet_transaction_payment::ChargeTransactionPayment::::from(tip), ); let raw_payload = SignedPayload::new(call, extra).map_err(|e| { debug::warn!("Unable to create signed payload: {:?}", e); @@ -479,14 +479,14 @@ impl system::offchain::CreateSignedTransaction for Runtime } } -impl system::offchain::SigningTypes for Runtime { +impl frame_system::offchain::SigningTypes for Runtime { type Public = ::Signer; type Signature = Signature; } -impl session::historical::Trait for Runtime { - type FullIdentification = staking::Exposure; - type FullIdentificationOf = staking::ExposureOf; +impl pallet_session::historical::Trait for Runtime { + type FullIdentification = pallet_staking::Exposure; + type FullIdentificationOf = pallet_staking::ExposureOf; } pallet_staking_reward_curve::build! { @@ -504,9 +504,9 @@ parameter_types! { // Six sessions in an era (6 hours). pub const SessionsPerEra: SessionIndex = 6; // 28 eras for unbonding (7 days). - pub const BondingDuration: staking::EraIndex = 28; + pub const BondingDuration: pallet_staking::EraIndex = 28; // 27 eras in which slashes can be cancelled (~7 days). - pub const SlashDeferDuration: staking::EraIndex = 27; + pub const SlashDeferDuration: pallet_staking::EraIndex = 27; pub const RewardCurve: &'static PiecewiseLinear<'static> = &REWARD_CURVE; pub const MaxNominatorRewardedPerValidator: u32 = 64; // quarter of the last session will be for election. @@ -524,7 +524,7 @@ parameter_types! { pub const ImOnlineUnsignedPriority: TransactionPriority = TransactionPriority::max_value(); } -impl im_online::Trait for Runtime { +impl pallet_im_online::Trait for Runtime { type AuthorityId = ImOnlineId; type Event = Event; type ReportUnresponsiveness = Offences; @@ -533,7 +533,7 @@ impl im_online::Trait for Runtime { type WeightInfo = (); } -impl staking::Trait for Runtime { +impl pallet_staking::Trait for Runtime { type Currency = Balances; type UnixTime = Timestamp; type CurrencyToVote = CurrencyToVoteHandler; @@ -562,7 +562,7 @@ parameter_types! { pub const ExistentialDeposit: Balance = 1 * CENTS; } -impl balances::Trait for Runtime { +impl pallet_balances::Trait for Runtime { type Balance = Balance; type DustRemoval = (); type Event = Event; @@ -571,7 +571,7 @@ impl balances::Trait for Runtime { type WeightInfo = (); } -impl system::offchain::SendTransactionTypes for Runtime where +impl frame_system::offchain::SendTransactionTypes for Runtime where Call: From, { type OverarchingCall = Call; @@ -588,20 +588,20 @@ parameter_types! { pub OffencesWeightSoftLimit: Weight = Perbill::from_percent(60) * MaximumBlockWeight::get(); } -impl offences::Trait for Runtime { +impl pallet_offences::Trait for Runtime { type Event = Event; - type IdentificationTuple = session::historical::IdentificationTuple; + type IdentificationTuple = pallet_session::historical::IdentificationTuple; type OnOffenceHandler = Staking; type WeightSoftLimit = OffencesWeightSoftLimit; type WeightInfo = (); } -impl authority_discovery::Trait for Runtime {} +impl pallet_authority_discovery::Trait for Runtime {} parameter_types! { pub const MinimumPeriod: u64 = SLOT_DURATION / 2; } -impl timestamp::Trait for Runtime { +impl pallet_timestamp::Trait for Runtime { type Moment = u64; type OnTimestampSet = Babe; type MinimumPeriod = MinimumPeriod; @@ -612,7 +612,7 @@ parameter_types! { pub const TransactionByteFee: Balance = 10 * MILLICENTS; } -impl transaction_payment::Trait for Runtime { +impl pallet_transaction_payment::Trait for Runtime { type Currency = Balances; type OnTransactionPayment = ToAuthor; type TransactionByteFee = TransactionByteFee; @@ -624,13 +624,13 @@ parameter_types! { pub const DisabledValidatorsThreshold: Perbill = Perbill::from_percent(17); } -impl session::Trait for Runtime { +impl pallet_session::Trait for Runtime { type Event = Event; type ValidatorId = AccountId; - type ValidatorIdOf = staking::StashOf; + type ValidatorIdOf = pallet_staking::StashOf; type ShouldEndSession = Babe; type NextSessionRotation = Babe; - type SessionManager = session::historical::NoteHistoricalRoot; + type SessionManager = pallet_session::historical::NoteHistoricalRoot; type SessionHandler = ::KeyTypeIdProviders; type Keys = SessionKeys; type DisabledValidatorsThreshold = DisabledValidatorsThreshold; @@ -642,34 +642,34 @@ parameter_types! { pub const ExpectedBlockTime: Moment = MILLISECS_PER_BLOCK; } -impl babe::Trait for Runtime { +impl pallet_babe::Trait for Runtime { type EpochDuration = EpochDuration; type ExpectedBlockTime = ExpectedBlockTime; // session module is the trigger - type EpochChangeTrigger = babe::ExternalTrigger; + type EpochChangeTrigger = pallet_babe::ExternalTrigger; type KeyOwnerProofSystem = Historical; type KeyOwnerProof = >::Proof; type KeyOwnerIdentification = >::IdentificationTuple; type HandleEquivocation = - babe::EquivocationHandler; + pallet_babe::EquivocationHandler; } parameter_types! { pub const IndexDeposit: Balance = 1 * DOLLARS; } -impl indices::Trait for Runtime { +impl pallet_indices::Trait for Runtime { type AccountIndex = AccountIndex; type Currency = Balances; type Deposit = IndexDeposit; @@ -681,7 +681,7 @@ parameter_types! { pub const AttestationPeriod: BlockNumber = 50; } -impl grandpa::Trait for Runtime { +impl pallet_grandpa::Trait for Runtime { type Event = Event; type Call = Call; @@ -695,7 +695,7 @@ impl grandpa::Trait for Runtime { GrandpaId, )>>::IdentificationTuple; - type HandleEquivocation = grandpa::EquivocationHandler; + type HandleEquivocation = pallet_grandpa::EquivocationHandler; } parameter_types! { @@ -703,8 +703,8 @@ parameter_types! { } // TODO: substrate#2986 implement this properly -impl authorship::Trait for Runtime { - type FindAuthor = session::FindAccountFromAuthorIndex; +impl pallet_authorship::Trait for Runtime { + type FindAuthor = pallet_session::FindAccountFromAuthorIndex; type UncleGenerations = UncleGenerations; type FilterUncle = (); type EventHandler = (Staking, ImOnline); diff --git a/runtime/rococo/Cargo.toml b/runtime/rococo/Cargo.toml index 5eb029fbf3..804baa3dfb 100644 --- a/runtime/rococo/Cargo.toml +++ b/runtime/rococo/Cargo.toml @@ -7,63 +7,62 @@ build = "build.rs" [dependencies] bitvec = { version = "0.17.4", default-features = false, features = ["alloc"] } -codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } +codec = { package = "parity-scale-codec", version = "1.3.4", default-features = false, features = ["derive"] } log = { version = "0.3.9", optional = true } rustc-hex = { version = "2.0.1", default-features = false } serde = { version = "1.0.102", default-features = false } serde_derive = { version = "1.0.102", optional = true } -smallvec = "1.4.0" static_assertions = "1.1.0" +smallvec = "1.4.1" authority-discovery-primitives = { package = "sp-authority-discovery", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } babe-primitives = { package = "sp-consensus-babe", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } sp-api = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } inherents = { package = "sp-inherents", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } offchain-primitives = { package = "sp-offchain", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -sp-std = { package = "sp-std", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +sp-std = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } sp-io = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } sp-core = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } sp-session = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -version = { package = "sp-version", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +sp-version = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } tx-pool-api = { package = "sp-transaction-pool", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } block-builder-api = { package = "sp-block-builder", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -authority-discovery = { package = "pallet-authority-discovery", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -authorship = { package = "pallet-authorship", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -babe = { package = "pallet-babe", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -balances = { package = "pallet-balances", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -transaction-payment = { package = "pallet-transaction-payment", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -transaction-payment-rpc-runtime-api = { package = "pallet-transaction-payment-rpc-runtime-api", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -collective = { package = "pallet-collective", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -democracy = { package = "pallet-democracy", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -elections-phragmen = { package = "pallet-elections-phragmen", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -executive = { package = "frame-executive", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -finality-tracker = { package = "pallet-finality-tracker", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -grandpa = { package = "pallet-grandpa", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -identity = { package = "pallet-identity", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -im-online = { package = "pallet-im-online", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -indices = { package = "pallet-indices", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -membership = { package = "pallet-membership", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -multisig = { package = "pallet-multisig", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -nicks = { package = "pallet-nicks", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -offences = { package = "pallet-offences", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -proxy = { package = "pallet-proxy", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -randomness-collective-flip = { package = "pallet-randomness-collective-flip", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -recovery = { package = "pallet-recovery", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -scheduler = { package = "pallet-scheduler", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -session = { package = "pallet-session", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -society = { package = "pallet-society", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-authority-discovery = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-authorship = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-babe = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-balances = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-transaction-payment = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-transaction-payment-rpc-runtime-api = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-collective = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-democracy = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-elections-phragmen = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +frame-executive = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-finality-tracker = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-grandpa = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-identity = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-im-online = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-indices = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-membership = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-multisig = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-nicks = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-offences = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-proxy = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-recovery = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-randomness-collective-flip = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-scheduler = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-session = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } frame-support = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -staking = { package = "pallet-staking", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -pallet-staking-reward-curve = { package = "pallet-staking-reward-curve", git = "https://github.com/paritytech/substrate", branch = "master" } -sudo = { package = "pallet-sudo", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -system = { package = "frame-system", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -system_rpc_runtime_api = { package = "frame-system-rpc-runtime-api", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -timestamp = { package = "pallet-timestamp", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -treasury = { package = "pallet-treasury", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -utility = { package = "pallet-utility", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -vesting = { package = "pallet-vesting", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-staking = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-staking-reward-curve = { git = "https://github.com/paritytech/substrate", branch = "master" } +pallet-sudo = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +frame-system = {git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +frame-system-rpc-runtime-api = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-timestamp = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-treasury = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-vesting = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-utility = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } frame-benchmarking = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false, optional = true } frame-system-benchmarking = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false, optional = true } @@ -92,7 +91,7 @@ no_std = [] only-staking = [] std = [ "authority-discovery-primitives/std", - "authority-discovery/std", + "pallet-authority-discovery/std", "bitvec/std", "primitives/std", "rustc-hex/std", @@ -107,67 +106,63 @@ std = [ "sp-std/std", "sp-io/std", "frame-support/std", - "authorship/std", - "balances/std", - "transaction-payment/std", - "transaction-payment-rpc-runtime-api/std", - "collective/std", - "elections-phragmen/std", - "democracy/std", - "executive/std", - "finality-tracker/std", - "grandpa/std", - "identity/std", - "im-online/std", - "indices/std", - "membership/std", - "multisig/std", - "nicks/std", - "offences/std", - "proxy/std", - "recovery/std", + "pallet-authorship/std", + "pallet-balances/std", + "pallet-transaction-payment/std", + "pallet-transaction-payment-rpc-runtime-api/std", + "pallet-collective/std", + "pallet-elections-phragmen/std", + "pallet-democracy/std", + "frame-executive/std", + "pallet-finality-tracker/std", + "pallet-grandpa/std", + "pallet-identity/std", + "pallet-im-online/std", + "pallet-indices/std", + "pallet-membership/std", + "pallet-multisig/std", + "pallet-nicks/std", + "pallet-offences/std", + "pallet-proxy/std", + "pallet-recovery/std", "sp-runtime/std", - "scheduler/std", - "session/std", - "society/std", - "staking/std", - "sudo/std", - "system/std", - "system_rpc_runtime_api/std", - "timestamp/std", - "treasury/std", - "version/std", - "utility/std", - "vesting/std", + "pallet-scheduler/std", + "pallet-session/std", + "pallet-staking/std", + "pallet-sudo/std", + "frame-system/std", + "frame-system-rpc-runtime-api/std", + "pallet-timestamp/std", + "pallet-treasury/std", + "sp-version/std", "serde_derive", "serde/std", "log", - "babe/std", + "pallet-babe/std", "babe-primitives/std", "sp-session/std", - "randomness-collective-flip/std", + "pallet-randomness-collective-flip/std", "runtime-common/std", + "pallet-vesting/std", + "pallet-utility/std", ] runtime-benchmarks = [ "runtime-common/runtime-benchmarks", "frame-benchmarking", "frame-support/runtime-benchmarks", "frame-system-benchmarking", - "system/runtime-benchmarks", + "frame-system/runtime-benchmarks", "sp-runtime/runtime-benchmarks", - "balances/runtime-benchmarks", - "collective/runtime-benchmarks", - "democracy/runtime-benchmarks", - "elections-phragmen/runtime-benchmarks", - "identity/runtime-benchmarks", - "im-online/runtime-benchmarks", - "scheduler/runtime-benchmarks", - "society/runtime-benchmarks", - "staking/runtime-benchmarks", - "timestamp/runtime-benchmarks", - "treasury/runtime-benchmarks", - "utility/runtime-benchmarks", - "vesting/runtime-benchmarks", + "pallet-balances/runtime-benchmarks", + "pallet-collective/runtime-benchmarks", + "pallet-democracy/runtime-benchmarks", + "pallet-elections-phragmen/runtime-benchmarks", + "pallet-im-online/runtime-benchmarks", + "pallet-scheduler/runtime-benchmarks", + "pallet-staking/runtime-benchmarks", + "pallet-timestamp/runtime-benchmarks", + "pallet-treasury/runtime-benchmarks", + "pallet-vesting/runtime-benchmarks", "pallet-offences-benchmarking", "pallet-session-benchmarking", # uncomment when it is made optional again diff --git a/runtime/rococo/src/constants.rs b/runtime/rococo/src/constants.rs index de95703fcc..a565ca4dbc 100644 --- a/runtime/rococo/src/constants.rs +++ b/runtime/rococo/src/constants.rs @@ -61,7 +61,7 @@ pub mod fee { /// node's balance type. /// /// This should typically create a mapping between the following ranges: - /// - [0, system::MaximumBlockWeight] + /// - [0, frame_system::MaximumBlockWeight] /// - [Balance::min, Balance::max] /// /// Yet, it can be used for any other sort of change to weight-fee. Some examples being: diff --git a/runtime/rococo/src/lib.rs b/runtime/rococo/src/lib.rs index 3083c002f3..c8fa47230a 100644 --- a/runtime/rococo/src/lib.rs +++ b/runtime/rococo/src/lib.rs @@ -44,28 +44,28 @@ use sp_runtime::{ }; #[cfg(feature = "runtime-benchmarks")] use sp_runtime::RuntimeString; -use version::RuntimeVersion; -use grandpa::{AuthorityId as GrandpaId, fg_primitives}; +use sp_version::RuntimeVersion; +use pallet_grandpa::{AuthorityId as GrandpaId, fg_primitives}; #[cfg(any(feature = "std", test))] -use version::NativeVersion; +use sp_version::NativeVersion; use sp_core::OpaqueMetadata; use frame_support::{ parameter_types, construct_runtime, debug, RuntimeDebug, traits::{KeyOwnerProofSystem, Randomness, Filter, InstanceFilter}, weights::Weight, }; -use im_online::sr25519::AuthorityId as ImOnlineId; +use pallet_im_online::sr25519::AuthorityId as ImOnlineId; use authority_discovery_primitives::AuthorityId as AuthorityDiscoveryId; -use transaction_payment_rpc_runtime_api::RuntimeDispatchInfo; -use session::historical as session_historical; -use system::EnsureRoot; +use pallet_transaction_payment_rpc_runtime_api::RuntimeDispatchInfo; +use pallet_session::historical as session_historical; +use frame_system::EnsureRoot; #[cfg(feature = "std")] -pub use staking::StakerStatus; +pub use pallet_staking::StakerStatus; #[cfg(any(feature = "std", test))] pub use sp_runtime::BuildStorage; -pub use timestamp::Call as TimestampCall; -pub use balances::Call as BalancesCall; +pub use pallet_timestamp::Call as TimestampCall; +pub use pallet_balances::Call as BalancesCall; pub use attestations::{Call as AttestationsCall, MORE_ATTESTATIONS_IDENTIFIER}; pub use parachains::Call as ParachainsCall; @@ -112,7 +112,7 @@ parameter_types! { pub const Version: RuntimeVersion = VERSION; } -impl system::Trait for Runtime { +impl frame_system::Trait for Runtime { type BaseCallFilter = BaseFilter; type Origin = Origin; type Call = Call; @@ -134,13 +134,13 @@ impl system::Trait for Runtime { type AvailableBlockRatio = AvailableBlockRatio; type Version = Version; type ModuleToIndex = ModuleToIndex; - type AccountData = balances::AccountData; + type AccountData = pallet_balances::AccountData; type OnNewAccount = (); type OnKilledAccount = (); type SystemWeightInfo = (); } -impl scheduler::Trait for Runtime { +impl pallet_scheduler::Trait for Runtime { type Event = Event; type Origin = Origin; type PalletsOrigin = OriginCaller; @@ -155,34 +155,34 @@ parameter_types! { pub const ExpectedBlockTime: Moment = MILLISECS_PER_BLOCK; } -impl babe::Trait for Runtime { +impl pallet_babe::Trait for Runtime { type EpochDuration = EpochDuration; type ExpectedBlockTime = ExpectedBlockTime; // session module is the trigger - type EpochChangeTrigger = babe::ExternalTrigger; + type EpochChangeTrigger = pallet_babe::ExternalTrigger; type KeyOwnerProofSystem = Historical; type KeyOwnerProof = >::Proof; type KeyOwnerIdentification = >::IdentificationTuple; type HandleEquivocation = - babe::EquivocationHandler; + pallet_babe::EquivocationHandler; } parameter_types! { pub const IndexDeposit: Balance = 1 * DOLLARS; } -impl indices::Trait for Runtime { +impl pallet_indices::Trait for Runtime { type AccountIndex = AccountIndex; type Currency = Balances; type Deposit = IndexDeposit; @@ -194,7 +194,7 @@ parameter_types! { pub const ExistentialDeposit: Balance = 1 * CENTS; } -impl balances::Trait for Runtime { +impl pallet_balances::Trait for Runtime { type Balance = Balance; type DustRemoval = (); type Event = Event; @@ -207,7 +207,7 @@ parameter_types! { pub const TransactionByteFee: Balance = 10 * MILLICENTS; } -impl transaction_payment::Trait for Runtime { +impl pallet_transaction_payment::Trait for Runtime { type Currency = Balances; type OnTransactionPayment = ToAuthor; type TransactionByteFee = TransactionByteFee; @@ -218,7 +218,7 @@ impl transaction_payment::Trait for Runtime { parameter_types! { pub const MinimumPeriod: u64 = SLOT_DURATION / 2; } -impl timestamp::Trait for Runtime { +impl pallet_timestamp::Trait for Runtime { type Moment = u64; type OnTimestampSet = Babe; type MinimumPeriod = MinimumPeriod; @@ -230,8 +230,8 @@ parameter_types! { } // TODO: substrate#2986 implement this properly -impl authorship::Trait for Runtime { - type FindAuthor = session::FindAccountFromAuthorIndex; +impl pallet_authorship::Trait for Runtime { + type FindAuthor = pallet_session::FindAccountFromAuthorIndex; type UncleGenerations = UncleGenerations; type FilterUncle = (); type EventHandler = ImOnline; @@ -256,7 +256,7 @@ parameter_types! { pub const DisabledValidatorsThreshold: Perbill = Perbill::from_percent(17); } -impl session::Trait for Runtime { +impl pallet_session::Trait for Runtime { type Event = Event; type ValidatorId = AccountId; type ValidatorIdOf = (); @@ -269,7 +269,7 @@ impl session::Trait for Runtime { type WeightInfo = (); } -impl session::historical::Trait for Runtime { +impl pallet_session::historical::Trait for Runtime { type FullIdentification = (); type FullIdentificationOf = (); } @@ -287,9 +287,9 @@ pallet_staking_reward_curve::build! { parameter_types! { // 28 eras for unbonding (7 days). - pub const BondingDuration: staking::EraIndex = 28; + pub const BondingDuration: pallet_staking::EraIndex = 28; // 28 eras in which slashes can be cancelled (7 days). - pub const SlashDeferDuration: staking::EraIndex = 27; + pub const SlashDeferDuration: pallet_staking::EraIndex = 27; pub const RewardCurve: &'static PiecewiseLinear<'static> = &REWARD_CURVE; pub const MaxNominatorRewardedPerValidator: u32 = 64; // quarter of the last session will be for election. @@ -314,15 +314,15 @@ parameter_types! { pub OffencesWeightSoftLimit: Weight = Perbill::from_percent(60) * MaximumBlockWeight::get(); } -impl offences::Trait for Runtime { +impl pallet_offences::Trait for Runtime { type Event = Event; - type IdentificationTuple = session::historical::IdentificationTuple; + type IdentificationTuple = pallet_session::historical::IdentificationTuple; type OnOffenceHandler = (); type WeightSoftLimit = OffencesWeightSoftLimit; type WeightInfo = (); } -impl authority_discovery::Trait for Runtime {} +impl pallet_authority_discovery::Trait for Runtime {} parameter_types! { pub const SessionDuration: BlockNumber = EPOCH_DURATION_IN_BLOCKS as _; @@ -333,7 +333,7 @@ parameter_types! { pub const ImOnlineUnsignedPriority: TransactionPriority = TransactionPriority::max_value(); } -impl im_online::Trait for Runtime { +impl pallet_im_online::Trait for Runtime { type AuthorityId = ImOnlineId; type Event = Event; type ReportUnresponsiveness = Offences; @@ -342,7 +342,7 @@ impl im_online::Trait for Runtime { type WeightInfo = (); } -impl grandpa::Trait for Runtime { +impl pallet_grandpa::Trait for Runtime { type Event = Event; type Call = Call; @@ -356,15 +356,15 @@ impl grandpa::Trait for Runtime { GrandpaId, )>>::IdentificationTuple; - type HandleEquivocation = grandpa::EquivocationHandler; + type HandleEquivocation = pallet_grandpa::EquivocationHandler; } parameter_types! { - pub WindowSize: BlockNumber = finality_tracker::DEFAULT_WINDOW_SIZE.into(); - pub ReportLatency: BlockNumber = finality_tracker::DEFAULT_REPORT_LATENCY.into(); + pub WindowSize: BlockNumber = pallet_finality_tracker::DEFAULT_WINDOW_SIZE.into(); + pub ReportLatency: BlockNumber = pallet_finality_tracker::DEFAULT_REPORT_LATENCY.into(); } -impl finality_tracker::Trait for Runtime { +impl pallet_finality_tracker::Trait for Runtime { type OnFinalizationStalled = (); type WindowSize = WindowSize; type ReportLatency = ReportLatency; @@ -405,7 +405,7 @@ impl parachains::Trait for Runtime { type SlashPeriod = SlashPeriod; type Proof = sp_session::MembershipProof; - type KeyOwnerProofSystem = session::historical::Module; + type KeyOwnerProofSystem = pallet_session::historical::Module; type IdentificationTuple = )>>::IdentificationTuple; type ReportOffence = Offences; type BlockHashConversion = sp_runtime::traits::Identity; @@ -413,14 +413,14 @@ impl parachains::Trait for Runtime { /// Submits a transaction with the node's public and signature type. Adheres to the signed extension /// format of the chain. -impl system::offchain::CreateSignedTransaction for Runtime where +impl frame_system::offchain::CreateSignedTransaction for Runtime where Call: From, { - fn create_transaction>( + fn create_transaction>( call: Call, public: ::Signer, account: AccountId, - nonce: ::Index, + nonce: ::Index, ) -> Option<(Call, ::SignaturePayload)> { // take the biggest period possible. let period = BlockHashCount::get() @@ -435,13 +435,13 @@ impl system::offchain::CreateSignedTransaction for Runtime .saturating_sub(1); let tip = 0; let extra: SignedExtra = ( - system::CheckSpecVersion::::new(), - system::CheckTxVersion::::new(), - system::CheckGenesis::::new(), - system::CheckMortality::::from(generic::Era::mortal(period, current_block)), - system::CheckNonce::::from(nonce), - system::CheckWeight::::new(), - transaction_payment::ChargeTransactionPayment::::from(tip), + frame_system::CheckSpecVersion::::new(), + frame_system::CheckTxVersion::::new(), + frame_system::CheckGenesis::::new(), + frame_system::CheckMortality::::from(generic::Era::mortal(period, current_block)), + frame_system::CheckNonce::::from(nonce), + frame_system::CheckWeight::::new(), + pallet_transaction_payment::ChargeTransactionPayment::::from(tip), registrar::LimitParathreadCommits::::new(), parachains::ValidateDoubleVoteReports::::new(), ); @@ -456,12 +456,12 @@ impl system::offchain::CreateSignedTransaction for Runtime } } -impl system::offchain::SigningTypes for Runtime { +impl frame_system::offchain::SigningTypes for Runtime { type Public = ::Signer; type Signature = Signature; } -impl system::offchain::SendTransactionTypes for Runtime where +impl frame_system::offchain::SendTransactionTypes for Runtime where Call: From, { type OverarchingCall = Call; @@ -494,7 +494,7 @@ parameter_types! { pub const MaxRegistrars: u32 = 20; } -impl identity::Trait for Runtime { +impl pallet_identity::Trait for Runtime { type Event = Event; type Currency = Balances; type Slashed = (); @@ -504,12 +504,12 @@ impl identity::Trait for Runtime { type MaxSubAccounts = MaxSubAccounts; type MaxAdditionalFields = MaxAdditionalFields; type MaxRegistrars = MaxRegistrars; - type RegistrarOrigin = system::EnsureRoot; - type ForceOrigin = system::EnsureRoot; + type RegistrarOrigin = frame_system::EnsureRoot; + type ForceOrigin = frame_system::EnsureRoot; type WeightInfo = (); } -impl utility::Trait for Runtime { +impl pallet_utility::Trait for Runtime { type Event = Event; type Call = Call; type WeightInfo = (); @@ -523,7 +523,7 @@ parameter_types! { pub const MaxSignatories: u16 = 100; } -impl multisig::Trait for Runtime { +impl pallet_multisig::Trait for Runtime { type Event = Event; type Call = Call; type Currency = Balances; @@ -540,7 +540,7 @@ parameter_types! { pub const RecoveryDeposit: Balance = 5 * DOLLARS; } -impl recovery::Trait for Runtime { +impl pallet_recovery::Trait for Runtime { type Event = Event; type Call = Call; type Currency = Balances; @@ -554,7 +554,7 @@ parameter_types! { pub const MinVestedTransfer: Balance = 100 * DOLLARS; } -impl vesting::Trait for Runtime { +impl pallet_vesting::Trait for Runtime { type Event = Event; type Currency = Balances; type BlockNumberToBalance = ConvertInto; @@ -562,7 +562,7 @@ impl vesting::Trait for Runtime { type WeightInfo = (); } -impl sudo::Trait for Runtime { +impl pallet_sudo::Trait for Runtime { type Event = Event; type Call = Call; } @@ -592,9 +592,9 @@ impl InstanceFilter for ProxyType { Call::System(..) | Call::Babe(..) | Call::Timestamp(..) | - Call::Indices(indices::Call::claim(..)) | - Call::Indices(indices::Call::free(..)) | - Call::Indices(indices::Call::freeze(..)) | + Call::Indices(pallet_indices::Call::claim(..)) | + Call::Indices(pallet_indices::Call::free(..)) | + Call::Indices(pallet_indices::Call::freeze(..)) | // Specifically omitting Indices `transfer`, `force_transfer` // Specifically omitting the entire Balances pallet Call::Authorship(..) | @@ -609,15 +609,15 @@ impl InstanceFilter for ProxyType { Call::Registrar(..) | Call::Utility(..) | Call::Identity(..) | - Call::Recovery(recovery::Call::as_recovered(..)) | - Call::Recovery(recovery::Call::vouch_recovery(..)) | - Call::Recovery(recovery::Call::claim_recovery(..)) | - Call::Recovery(recovery::Call::close_recovery(..)) | - Call::Recovery(recovery::Call::remove_recovery(..)) | - Call::Recovery(recovery::Call::cancel_recovered(..)) | + Call::Recovery(pallet_recovery::Call::as_recovered(..)) | + Call::Recovery(pallet_recovery::Call::vouch_recovery(..)) | + Call::Recovery(pallet_recovery::Call::claim_recovery(..)) | + Call::Recovery(pallet_recovery::Call::close_recovery(..)) | + Call::Recovery(pallet_recovery::Call::remove_recovery(..)) | + Call::Recovery(pallet_recovery::Call::cancel_recovered(..)) | // Specifically omitting Recovery `create_recovery`, `initiate_recovery` - Call::Vesting(vesting::Call::vest(..)) | - Call::Vesting(vesting::Call::vest_other(..)) | + Call::Vesting(pallet_vesting::Call::vest(..)) | + Call::Vesting(pallet_vesting::Call::vest_other(..)) | // Specifically omitting Vesting `vested_transfer`, and `force_vested_transfer` Call::Scheduler(..) | // Specifically omitting Sudo pallet @@ -625,13 +625,13 @@ impl InstanceFilter for ProxyType { Call::Multisig(..) ), ProxyType::SudoBalances => match c { - Call::Sudo(sudo::Call::sudo(ref x)) => matches!(x.as_ref(), &Call::Balances(..)), + Call::Sudo(pallet_sudo::Call::sudo(ref x)) => matches!(x.as_ref(), &Call::Balances(..)), Call::Utility(..) => true, _ => false, }, ProxyType::IdentityJudgement => matches!(c, - Call::Identity(identity::Call::provide_judgement(..)) - | Call::Utility(utility::Call::batch(..)) + Call::Identity(pallet_identity::Call::provide_judgement(..)) + | Call::Utility(pallet_utility::Call::batch(..)) ) } } @@ -646,7 +646,7 @@ impl InstanceFilter for ProxyType { } } -impl proxy::Trait for Runtime { +impl pallet_proxy::Trait for Runtime { type Event = Event; type Call = Call; type Currency = Balances; @@ -664,26 +664,26 @@ construct_runtime! { UncheckedExtrinsic = UncheckedExtrinsic { // Basic stuff; balances is uncallable initially. - System: system::{Module, Call, Storage, Config, Event}, - RandomnessCollectiveFlip: randomness_collective_flip::{Module, Storage}, + System: frame_system::{Module, Call, Storage, Config, Event}, + RandomnessCollectiveFlip: pallet_randomness_collective_flip::{Module, Storage}, // Must be before session. - Babe: babe::{Module, Call, Storage, Config, Inherent, ValidateUnsigned}, + Babe: pallet_babe::{Module, Call, Storage, Config, Inherent, ValidateUnsigned}, - Timestamp: timestamp::{Module, Call, Storage, Inherent}, - Indices: indices::{Module, Call, Storage, Config, Event}, - Balances: balances::{Module, Call, Storage, Config, Event}, - TransactionPayment: transaction_payment::{Module, Storage}, + Timestamp: pallet_timestamp::{Module, Call, Storage, Inherent}, + Indices: pallet_indices::{Module, Call, Storage, Config, Event}, + Balances: pallet_balances::{Module, Call, Storage, Config, Event}, + TransactionPayment: pallet_transaction_payment::{Module, Storage}, // Consensus support. - Authorship: authorship::{Module, Call, Storage}, - Offences: offences::{Module, Call, Storage, Event}, + Authorship: pallet_authorship::{Module, Call, Storage}, + Offences: pallet_offences::{Module, Call, Storage, Event}, Historical: session_historical::{Module}, - Session: session::{Module, Call, Storage, Event, Config}, - FinalityTracker: finality_tracker::{Module, Call, Storage, Inherent}, - Grandpa: grandpa::{Module, Call, Storage, Config, Event, ValidateUnsigned}, - ImOnline: im_online::{Module, Call, Storage, Event, ValidateUnsigned, Config}, - AuthorityDiscovery: authority_discovery::{Module, Call, Config}, + Session: pallet_session::{Module, Call, Storage, Event, Config}, + FinalityTracker: pallet_finality_tracker::{Module, Call, Storage, Inherent}, + Grandpa: pallet_grandpa::{Module, Call, Storage, Config, Event, ValidateUnsigned}, + ImOnline: pallet_im_online::{Module, Call, Storage, Event, ValidateUnsigned, Config}, + AuthorityDiscovery: pallet_authority_discovery::{Module, Call, Config}, // Parachains stuff; slots are disabled (no auctions initially). The rest are safe as they // have no public dispatchables. @@ -692,28 +692,28 @@ construct_runtime! { Registrar: registrar::{Module, Call, Storage, Event, Config}, // Utility module. - Utility: utility::{Module, Call, Event}, + Utility: pallet_utility::{Module, Call, Event}, // Less simple identity module. - Identity: identity::{Module, Call, Storage, Event}, + Identity: pallet_identity::{Module, Call, Storage, Event}, // Social recovery module. - Recovery: recovery::{Module, Call, Storage, Event}, + Recovery: pallet_recovery::{Module, Call, Storage, Event}, // Vesting. Usable initially, but removed once all vesting is finished. - Vesting: vesting::{Module, Call, Storage, Event, Config}, + Vesting: pallet_vesting::{Module, Call, Storage, Event, Config}, // System scheduler. - Scheduler: scheduler::{Module, Call, Storage, Event}, + Scheduler: pallet_scheduler::{Module, Call, Storage, Event}, // Sudo. - Sudo: sudo::{Module, Call, Storage, Event, Config}, + Sudo: pallet_sudo::{Module, Call, Storage, Event, Config}, // Proxy module. Late addition. - Proxy: proxy::{Module, Call, Storage, Event}, + Proxy: pallet_proxy::{Module, Call, Storage, Event}, // Multisig module. Late addition. - Multisig: multisig::{Module, Call, Storage, Event}, + Multisig: pallet_multisig::{Module, Call, Storage, Event}, } } @@ -729,13 +729,13 @@ pub type SignedBlock = generic::SignedBlock; pub type BlockId = generic::BlockId; /// The SignedExtension to the basic transaction logic. pub type SignedExtra = ( - system::CheckSpecVersion, - system::CheckTxVersion, - system::CheckGenesis, - system::CheckMortality, - system::CheckNonce, - system::CheckWeight, - transaction_payment::ChargeTransactionPayment, + frame_system::CheckSpecVersion, + frame_system::CheckTxVersion, + frame_system::CheckGenesis, + frame_system::CheckMortality, + frame_system::CheckNonce, + frame_system::CheckWeight, + pallet_transaction_payment::ChargeTransactionPayment, registrar::LimitParathreadCommits, parachains::ValidateDoubleVoteReports, ); @@ -744,7 +744,7 @@ pub type UncheckedExtrinsic = generic::UncheckedExtrinsic; /// Executive: handles dispatch to the various modules. -pub type Executive = executive::Executive, Runtime, AllModules>; +pub type Executive = frame_executive::Executive, Runtime, AllModules>; /// The payload being signed in transactions. pub type SignedPayload = generic::SignedPayload; @@ -947,13 +947,13 @@ sp_api::impl_runtime_apis! { } } - impl system_rpc_runtime_api::AccountNonceApi for Runtime { + impl frame_system_rpc_runtime_api::AccountNonceApi for Runtime { fn account_nonce(account: AccountId) -> Nonce { System::account_nonce(account) } } - impl transaction_payment_rpc_runtime_api::TransactionPaymentApi< + impl pallet_transaction_payment_rpc_runtime_api::TransactionPaymentApi< Block, Balance, > for Runtime { @@ -1005,17 +1005,17 @@ sp_api::impl_runtime_apis! { let mut batches = Vec::::new(); let params = (&pallet, &benchmark, &lowest_range_values, &highest_range_values, &steps, repeat, &whitelist); - add_benchmark!(params, batches, balances,Balances); - add_benchmark!(params, batches, identity,Identity); - add_benchmark!(params, batches, im_online,ImOnline); - add_benchmark!(params, batches, offences,OffencesBench::); - add_benchmark!(params, batches, scheduler, Scheduler); - add_benchmark!(params, batches, session, SessionBench::); - add_benchmark!(params, batches, staking, Staking); - add_benchmark!(params, batches, system, SystemBench::); - add_benchmark!(params, batches, timestamp, Timestamp); - add_benchmark!(params, batches, utility, Utility); - add_benchmark!(params, batches, vesting, Vesting); + add_benchmark!(params, batches, pallet_balances, Balances); + add_benchmark!(params, batches, pallet_identity, Identity); + add_benchmark!(params, batches, pallet_im_online, ImOnline); + add_benchmark!(params, batches, pallet_offences, OffencesBench::); + add_benchmark!(params, batches, pallet_scheduler, Scheduler); + add_benchmark!(params, batches, pallet_session, SessionBench::); + add_benchmark!(params, batches, pallet_staking, Staking); + add_benchmark!(params, batches, frame_system, SystemBench::); + add_benchmark!(params, batches, pallet_timestamp, Timestamp); + add_benchmark!(params, batches, pallet_utility, Utility); + add_benchmark!(params, batches, pallet_vesting, Vesting); if batches.is_empty() { return Err("Benchmark not found for this pallet.".into()) } Ok(batches) diff --git a/runtime/test-runtime/Cargo.toml b/runtime/test-runtime/Cargo.toml index 100b373935..4dc975c689 100644 --- a/runtime/test-runtime/Cargo.toml +++ b/runtime/test-runtime/Cargo.toml @@ -25,32 +25,32 @@ sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "master sp-staking = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } sp-core = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } sp-session = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -version = { package = "sp-version", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +sp-version = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } tx-pool-api = { package = "sp-transaction-pool", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } block-builder-api = { package = "sp-block-builder", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -authority-discovery = { package = "pallet-authority-discovery", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -authorship = { package = "pallet-authorship", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -babe = { package = "pallet-babe", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -balances = { package = "pallet-balances", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -transaction-payment = { package = "pallet-transaction-payment", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-authority-discovery = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-authorship = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-babe = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-balances = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-transaction-payment = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } pallet-transaction-payment-rpc-runtime-api = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -executive = { package = "frame-executive", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -finality-tracker = { package = "pallet-finality-tracker", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -grandpa = { package = "pallet-grandpa", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -indices = { package = "pallet-indices", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -nicks = { package = "pallet-nicks", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -offences = { package = "pallet-offences", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -randomness-collective-flip = { package = "pallet-randomness-collective-flip", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -session = { package = "pallet-session", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +frame-executive = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-finality-tracker = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-grandpa = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-indices = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-nicks = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-offences = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-randomness-collective-flip = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-session = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } frame-support = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -staking = { package = "pallet-staking", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-staking = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } pallet-staking-reward-curve = { git = "https://github.com/paritytech/substrate", branch = "master" } -system = { package = "frame-system", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -system_rpc_runtime_api = { package = "frame-system-rpc-runtime-api", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -timestamp = { package = "pallet-timestamp", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -sudo = { package = "pallet-sudo", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -vesting = { package = "pallet-vesting", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +frame-system = {git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +frame-system-rpc-runtime-api = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-timestamp = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-sudo = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-vesting = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } runtime-common = { package = "polkadot-runtime-common", path = "../common", default-features = false } primitives = { package = "polkadot-primitives", path = "../../primitives", default-features = false } @@ -73,7 +73,7 @@ no_std = [] only-staking = [] std = [ "authority-discovery-primitives/std", - "authority-discovery/std", + "pallet-authority-discovery/std", "bitvec/std", "primitives/std", "rustc-hex/std", @@ -88,31 +88,31 @@ std = [ "rstd/std", "sp-io/std", "frame-support/std", - "authorship/std", - "balances/std", - "transaction-payment/std", + "pallet-authorship/std", + "pallet-balances/std", + "pallet-transaction-payment/std", "pallet-transaction-payment-rpc-runtime-api/std", - "executive/std", - "finality-tracker/std", - "grandpa/std", - "indices/std", - "nicks/std", - "offences/std", + "frame-executive/std", + "pallet-finality-tracker/std", + "pallet-grandpa/std", + "pallet-indices/std", + "pallet-nicks/std", + "pallet-offences/std", "sp-runtime/std", "sp-staking/std", - "session/std", - "staking/std", - "system/std", - "system_rpc_runtime_api/std", - "timestamp/std", - "version/std", - "vesting/std", + "pallet-session/std", + "pallet-staking/std", + "frame-system/std", + "frame-system-rpc-runtime-api/std", + "pallet-timestamp/std", + "sp-version/std", + "pallet-vesting/std", "serde_derive", "serde/std", "log", - "babe/std", + "pallet-babe/std", "babe-primitives/std", "sp-session/std", - "randomness-collective-flip/std", + "pallet-randomness-collective-flip/std", "runtime-common/std", ] diff --git a/runtime/test-runtime/src/constants.rs b/runtime/test-runtime/src/constants.rs index ac90417b21..b18501b714 100644 --- a/runtime/test-runtime/src/constants.rs +++ b/runtime/test-runtime/src/constants.rs @@ -59,7 +59,7 @@ pub mod fee { /// node's balance type. /// /// This should typically create a mapping between the following ranges: - /// - [0, system::MaximumBlockWeight] + /// - [0, frame_system::MaximumBlockWeight] /// - [Balance::min, Balance::max] /// /// Yet, it can be used for any other sort of change to weight-fee. Some examples being: diff --git a/runtime/test-runtime/src/lib.rs b/runtime/test-runtime/src/lib.rs index aa92b40e78..18df03333c 100644 --- a/runtime/test-runtime/src/lib.rs +++ b/runtime/test-runtime/src/lib.rs @@ -45,10 +45,10 @@ use sp_runtime::{ DispatchInfoOf, Extrinsic as ExtrinsicT, SaturatedConversion, Verify, }, }; -use version::RuntimeVersion; -use grandpa::{AuthorityId as GrandpaId, fg_primitives}; +use sp_version::RuntimeVersion; +use pallet_grandpa::{AuthorityId as GrandpaId, fg_primitives}; #[cfg(any(feature = "std", test))] -use version::NativeVersion; +use sp_version::NativeVersion; use sp_core::OpaqueMetadata; use sp_staking::SessionIndex; use frame_support::{ @@ -58,14 +58,14 @@ use frame_support::{ }; use authority_discovery_primitives::AuthorityId as AuthorityDiscoveryId; use pallet_transaction_payment_rpc_runtime_api::RuntimeDispatchInfo; -use session::historical as session_historical; +use pallet_session::historical as session_historical; #[cfg(feature = "std")] -pub use staking::StakerStatus; +pub use pallet_staking::StakerStatus; #[cfg(any(feature = "std", test))] pub use sp_runtime::BuildStorage; -pub use timestamp::Call as TimestampCall; -pub use balances::Call as BalancesCall; +pub use pallet_timestamp::Call as TimestampCall; +pub use pallet_balances::Call as BalancesCall; pub use attestations::{Call as AttestationsCall, MORE_ATTESTATIONS_IDENTIFIER}; pub use parachains::Call as ParachainsCall; @@ -130,7 +130,7 @@ parameter_types! { pub const Version: RuntimeVersion = VERSION; } -impl system::Trait for Runtime { +impl frame_system::Trait for Runtime { type BaseCallFilter = (); type Origin = Origin; type Call = Call; @@ -152,13 +152,13 @@ impl system::Trait for Runtime { type AvailableBlockRatio = AvailableBlockRatio; type Version = Version; type ModuleToIndex = ModuleToIndex; - type AccountData = balances::AccountData; + type AccountData = pallet_balances::AccountData; type OnNewAccount = (); type OnKilledAccount = (); type SystemWeightInfo = (); } -impl system::offchain::SendTransactionTypes for Runtime where +impl frame_system::offchain::SendTransactionTypes for Runtime where Call: From, { type OverarchingCall = Call; @@ -170,23 +170,23 @@ parameter_types! { pub storage ExpectedBlockTime: Moment = MILLISECS_PER_BLOCK; } -impl babe::Trait for Runtime { +impl pallet_babe::Trait for Runtime { type EpochDuration = EpochDuration; type ExpectedBlockTime = ExpectedBlockTime; // session module is the trigger - type EpochChangeTrigger = babe::ExternalTrigger; + type EpochChangeTrigger = pallet_babe::ExternalTrigger; type KeyOwnerProofSystem = (); type KeyOwnerProof = >::Proof; type KeyOwnerIdentification = >::IdentificationTuple; type HandleEquivocation = (); @@ -196,7 +196,7 @@ parameter_types! { pub storage IndexDeposit: Balance = 1 * DOLLARS; } -impl indices::Trait for Runtime { +impl pallet_indices::Trait for Runtime { type AccountIndex = AccountIndex; type Currency = Balances; type Deposit = IndexDeposit; @@ -208,7 +208,7 @@ parameter_types! { pub storage ExistentialDeposit: Balance = 1 * CENTS; } -impl balances::Trait for Runtime { +impl pallet_balances::Trait for Runtime { type Balance = Balance; type DustRemoval = (); type Event = Event; @@ -221,7 +221,7 @@ parameter_types! { pub storage TransactionByteFee: Balance = 10 * MILLICENTS; } -impl transaction_payment::Trait for Runtime { +impl pallet_transaction_payment::Trait for Runtime { type Currency = Balances; type OnTransactionPayment = (); type TransactionByteFee = TransactionByteFee; @@ -233,7 +233,7 @@ parameter_types! { pub storage SlotDuration: u64 = SLOT_DURATION; pub storage MinimumPeriod: u64 = SlotDuration::get() / 2; } -impl timestamp::Trait for Runtime { +impl pallet_timestamp::Trait for Runtime { type Moment = u64; type OnTimestampSet = Babe; type MinimumPeriod = MinimumPeriod; @@ -245,8 +245,8 @@ parameter_types! { } // TODO: substrate#2986 implement this properly -impl authorship::Trait for Runtime { - type FindAuthor = session::FindAccountFromAuthorIndex; +impl pallet_authorship::Trait for Runtime { + type FindAuthor = pallet_session::FindAccountFromAuthorIndex; type UncleGenerations = UncleGenerations; type FilterUncle = (); type EventHandler = Staking; @@ -269,10 +269,10 @@ parameter_types! { pub storage DisabledValidatorsThreshold: Perbill = Perbill::from_percent(17); } -impl session::Trait for Runtime { +impl pallet_session::Trait for Runtime { type Event = Event; type ValidatorId = AccountId; - type ValidatorIdOf = staking::StashOf; + type ValidatorIdOf = pallet_staking::StashOf; type ShouldEndSession = Babe; type NextSessionRotation = Babe; type SessionManager = Staking; @@ -282,9 +282,9 @@ impl session::Trait for Runtime { type WeightInfo = (); } -impl session::historical::Trait for Runtime { - type FullIdentification = staking::Exposure; - type FullIdentificationOf = staking::ExposureOf; +impl pallet_session::historical::Trait for Runtime { + type FullIdentification = pallet_staking::Exposure; + type FullIdentificationOf = pallet_staking::ExposureOf; } pallet_staking_reward_curve::build! { @@ -302,9 +302,9 @@ parameter_types! { // Six sessions in an era (6 hours). pub storage SessionsPerEra: SessionIndex = 6; // 28 eras for unbonding (7 days). - pub storage BondingDuration: staking::EraIndex = 28; + pub storage BondingDuration: pallet_staking::EraIndex = 28; // 27 eras in which slashes can be cancelled (a bit less than 7 days). - pub storage SlashDeferDuration: staking::EraIndex = 27; + pub storage SlashDeferDuration: pallet_staking::EraIndex = 27; pub const RewardCurve: &'static PiecewiseLinear<'static> = &REWARD_CURVE; pub storage MaxNominatorRewardedPerValidator: u32 = 64; pub storage ElectionLookahead: BlockNumber = 0; @@ -313,7 +313,7 @@ parameter_types! { pub MinSolutionScoreBump: Perbill = Perbill::from_rational_approximation(5u32, 10_000); } -impl staking::Trait for Runtime { +impl pallet_staking::Trait for Runtime { type Currency = Balances; type UnixTime = Timestamp; type CurrencyToVote = CurrencyToVoteHandler; @@ -325,7 +325,7 @@ impl staking::Trait for Runtime { type BondingDuration = BondingDuration; type SlashDeferDuration = SlashDeferDuration; // A majority of the council can cancel the slash. - type SlashCancelOrigin = system::EnsureNever<()>; + type SlashCancelOrigin = frame_system::EnsureNever<()>; type SessionInterface = Self; type RewardCurve = RewardCurve; type MaxNominatorRewardedPerValidator = MaxNominatorRewardedPerValidator; @@ -339,7 +339,7 @@ impl staking::Trait for Runtime { } -impl grandpa::Trait for Runtime { +impl pallet_grandpa::Trait for Runtime { type Event = Event; type Call = Call; @@ -392,7 +392,7 @@ impl parachains::Trait for Runtime { type SlashPeriod = SlashPeriod; type Proof = sp_session::MembershipProof; - type KeyOwnerProofSystem = session::historical::Module; + type KeyOwnerProofSystem = pallet_session::historical::Module; type IdentificationTuple = < Self::KeyOwnerProofSystem as KeyOwnerProofSystem<(KeyTypeId, Vec)> >::IdentificationTuple; @@ -400,14 +400,14 @@ impl parachains::Trait for Runtime { type BlockHashConversion = sp_runtime::traits::Identity; } -impl system::offchain::CreateSignedTransaction for Runtime where +impl frame_system::offchain::CreateSignedTransaction for Runtime where Call: From, { - fn create_transaction>( + fn create_transaction>( call: Call, public: ::Signer, account: AccountId, - nonce: ::Index, + nonce: ::Index, ) -> Option<(Call, ::SignaturePayload)> { let period = BlockHashCount::get() .checked_next_power_of_two() @@ -420,13 +420,13 @@ impl system::offchain::CreateSignedTransaction for Runtime let tip = 0; let extra: SignedExtra = ( RestrictFunctionality, - system::CheckSpecVersion::::new(), - system::CheckTxVersion::::new(), - system::CheckGenesis::::new(), - system::CheckMortality::::from(generic::Era::mortal(period, current_block)), - system::CheckNonce::::from(nonce), - system::CheckWeight::::new(), - transaction_payment::ChargeTransactionPayment::::from(tip), + frame_system::CheckSpecVersion::::new(), + frame_system::CheckTxVersion::::new(), + frame_system::CheckGenesis::::new(), + frame_system::CheckMortality::::from(generic::Era::mortal(period, current_block)), + frame_system::CheckNonce::::from(nonce), + frame_system::CheckWeight::::new(), + pallet_transaction_payment::ChargeTransactionPayment::::from(tip), registrar::LimitParathreadCommits::::new(), parachains::ValidateDoubleVoteReports::::new(), ); @@ -442,7 +442,7 @@ impl system::offchain::CreateSignedTransaction for Runtime } } -impl system::offchain::SigningTypes for Runtime { +impl frame_system::offchain::SigningTypes for Runtime { type Public = ::Signer; type Signature = Signature; } @@ -451,15 +451,15 @@ parameter_types! { pub storage OffencesWeightSoftLimit: Weight = Perbill::from_percent(60) * MaximumBlockWeight::get(); } -impl offences::Trait for Runtime { +impl pallet_offences::Trait for Runtime { type Event = Event; - type IdentificationTuple = session::historical::IdentificationTuple; + type IdentificationTuple = pallet_session::historical::IdentificationTuple; type OnOffenceHandler = Staking; type WeightSoftLimit = OffencesWeightSoftLimit; type WeightInfo = (); } -impl authority_discovery::Trait for Runtime {} +impl pallet_authority_discovery::Trait for Runtime {} parameter_types! { pub storage ParathreadDeposit: Balance = 5 * DOLLARS; @@ -499,14 +499,14 @@ impl claims::Trait for Runtime { type Event = Event; type VestingSchedule = Vesting; type Prefix = Prefix; - type MoveClaimOrigin = system::EnsureRoot; + type MoveClaimOrigin = frame_system::EnsureRoot; } parameter_types! { pub storage MinVestedTransfer: Balance = 100 * DOLLARS; } -impl vesting::Trait for Runtime { +impl pallet_vesting::Trait for Runtime { type Event = Event; type Currency = Balances; type BlockNumberToBalance = ConvertInto; @@ -514,7 +514,7 @@ impl vesting::Trait for Runtime { type WeightInfo = (); } -impl sudo::Trait for Runtime { +impl pallet_sudo::Trait for Runtime { type Event = Event; type Call = Call; } @@ -526,25 +526,25 @@ construct_runtime! { UncheckedExtrinsic = UncheckedExtrinsic { // Basic stuff; balances is uncallable initially. - System: system::{Module, Call, Storage, Config, Event}, - RandomnessCollectiveFlip: randomness_collective_flip::{Module, Storage}, + System: frame_system::{Module, Call, Storage, Config, Event}, + RandomnessCollectiveFlip: pallet_randomness_collective_flip::{Module, Storage}, // Must be before session. - Babe: babe::{Module, Call, Storage, Config, Inherent}, + Babe: pallet_babe::{Module, Call, Storage, Config, Inherent}, - Timestamp: timestamp::{Module, Call, Storage, Inherent}, - Indices: indices::{Module, Call, Storage, Config, Event}, - Balances: balances::{Module, Call, Storage, Config, Event}, - TransactionPayment: transaction_payment::{Module, Storage}, + Timestamp: pallet_timestamp::{Module, Call, Storage, Inherent}, + Indices: pallet_indices::{Module, Call, Storage, Config, Event}, + Balances: pallet_balances::{Module, Call, Storage, Config, Event}, + TransactionPayment: pallet_transaction_payment::{Module, Storage}, // Consensus support. - Authorship: authorship::{Module, Call, Storage}, - Staking: staking::{Module, Call, Storage, Config, Event, ValidateUnsigned}, - Offences: offences::{Module, Call, Storage, Event}, + Authorship: pallet_authorship::{Module, Call, Storage}, + Staking: pallet_staking::{Module, Call, Storage, Config, Event, ValidateUnsigned}, + Offences: pallet_offences::{Module, Call, Storage, Event}, Historical: session_historical::{Module}, - Session: session::{Module, Call, Storage, Event, Config}, - Grandpa: grandpa::{Module, Call, Storage, Config, Event}, - AuthorityDiscovery: authority_discovery::{Module, Call, Config}, + Session: pallet_session::{Module, Call, Storage, Event, Config}, + Grandpa: pallet_grandpa::{Module, Call, Storage, Config, Event}, + AuthorityDiscovery: pallet_authority_discovery::{Module, Call, Config}, // Claims. Usable initially. Claims: claims::{Module, Call, Storage, Event, Config, ValidateUnsigned}, @@ -557,10 +557,10 @@ construct_runtime! { Registrar: registrar::{Module, Call, Storage, Event, Config}, // Vesting. Usable initially, but removed once all vesting is finished. - Vesting: vesting::{Module, Call, Storage, Event, Config}, + Vesting: pallet_vesting::{Module, Call, Storage, Event, Config}, // Sudo. Last module. - Sudo: sudo::{Module, Call, Storage, Config, Event}, + Sudo: pallet_sudo::{Module, Call, Storage, Config, Event}, } } @@ -577,13 +577,13 @@ pub type BlockId = generic::BlockId; /// The SignedExtension to the basic transaction logic. pub type SignedExtra = ( RestrictFunctionality, - system::CheckSpecVersion, - system::CheckTxVersion, - system::CheckGenesis, - system::CheckMortality, - system::CheckNonce, - system::CheckWeight, - transaction_payment::ChargeTransactionPayment::, + frame_system::CheckSpecVersion, + frame_system::CheckTxVersion, + frame_system::CheckGenesis, + frame_system::CheckMortality, + frame_system::CheckNonce, + frame_system::CheckWeight, + pallet_transaction_payment::ChargeTransactionPayment::, registrar::LimitParathreadCommits, parachains::ValidateDoubleVoteReports, ); @@ -592,7 +592,7 @@ pub type UncheckedExtrinsic = generic::UncheckedExtrinsic; /// Executive: handles dispatch to the various modules. -pub type Executive = executive::Executive, Runtime, AllModules>; +pub type Executive = frame_executive::Executive, Runtime, AllModules>; /// The payload being signed in transactions. pub type SignedPayload = generic::SignedPayload; @@ -779,7 +779,7 @@ sp_api::impl_runtime_apis! { } } - impl system_rpc_runtime_api::AccountNonceApi for Runtime { + impl frame_system_rpc_runtime_api::AccountNonceApi for Runtime { fn account_nonce(account: AccountId) -> Nonce { System::account_nonce(account) } diff --git a/runtime/westend/Cargo.toml b/runtime/westend/Cargo.toml index 3e1d100105..739bbcc8ea 100644 --- a/runtime/westend/Cargo.toml +++ b/runtime/westend/Cargo.toml @@ -26,45 +26,45 @@ sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "master sp-staking = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } sp-core = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } sp-session = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -version = { package = "sp-version", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +sp-version = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } tx-pool-api = { package = "sp-transaction-pool", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } block-builder-api = { package = "sp-block-builder", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -authority-discovery = { package = "pallet-authority-discovery", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -authorship = { package = "pallet-authorship", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -babe = { package = "pallet-babe", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -balances = { package = "pallet-balances", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -transaction-payment = { package = "pallet-transaction-payment", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -transaction-payment-rpc-runtime-api = { package = "pallet-transaction-payment-rpc-runtime-api", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -collective = { package = "pallet-collective", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -democracy = { package = "pallet-democracy", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -elections-phragmen = { package = "pallet-elections-phragmen", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -executive = { package = "frame-executive", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -finality-tracker = { package = "pallet-finality-tracker", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -grandpa = { package = "pallet-grandpa", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -identity = { package = "pallet-identity", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -im-online = { package = "pallet-im-online", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -indices = { package = "pallet-indices", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -membership = { package = "pallet-membership", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -multisig = { package = "pallet-multisig", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -nicks = { package = "pallet-nicks", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -offences = { package = "pallet-offences", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -proxy = { package = "pallet-proxy", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -randomness-collective-flip = { package = "pallet-randomness-collective-flip", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -recovery = { package = "pallet-recovery", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -scheduler = { package = "pallet-scheduler", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -session = { package = "pallet-session", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -society = { package = "pallet-society", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-authority-discovery = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-authorship = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-babe = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-balances = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-transaction-payment = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-transaction-payment-rpc-runtime-api = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-collective = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-democracy = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-elections-phragmen = { package = "pallet-elections-phragmen", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +frame-executive = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-finality-tracker = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-grandpa = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-identity = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-im-online = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-indices = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-membership = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-multisig = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-nicks = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-offences = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-proxy = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-randomness-collective-flip = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-recovery = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-scheduler = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-session = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-society = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } frame-support = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -staking = { package = "pallet-staking", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-staking = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } pallet-staking-reward-curve = { package = "pallet-staking-reward-curve", git = "https://github.com/paritytech/substrate", branch = "master" } -sudo = { package = "pallet-sudo", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -system = { package = "frame-system", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -system_rpc_runtime_api = { package = "frame-system-rpc-runtime-api", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -timestamp = { package = "pallet-timestamp", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -treasury = { package = "pallet-treasury", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -utility = { package = "pallet-utility", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -vesting = { package = "pallet-vesting", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-sudo = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +frame-system = {git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +frame-system-rpc-runtime-api = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-timestamp = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-treasury = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-utility = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-vesting = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } frame-benchmarking = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false, optional = true } frame-system-benchmarking = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false, optional = true } @@ -93,7 +93,7 @@ no_std = [] only-staking = [] std = [ "authority-discovery-primitives/std", - "authority-discovery/std", + "pallet-authority-discovery/std", "bitvec/std", "primitives/std", "rustc-hex/std", @@ -108,46 +108,46 @@ std = [ "sp-std/std", "sp-io/std", "frame-support/std", - "authorship/std", - "balances/std", - "transaction-payment/std", - "transaction-payment-rpc-runtime-api/std", - "collective/std", - "elections-phragmen/std", - "democracy/std", - "executive/std", - "finality-tracker/std", - "grandpa/std", - "identity/std", - "im-online/std", - "indices/std", - "membership/std", - "multisig/std", - "nicks/std", - "offences/std", - "proxy/std", - "recovery/std", + "pallet-authorship/std", + "pallet-balances/std", + "pallet-transaction-payment/std", + "pallet-transaction-payment-rpc-runtime-api/std", + "pallet-collective/std", + "pallet-elections-phragmen/std", + "pallet-democracy/std", + "frame-executive/std", + "pallet-finality-tracker/std", + "pallet-grandpa/std", + "pallet-identity/std", + "pallet-im-online/std", + "pallet-indices/std", + "pallet-membership/std", + "pallet-multisig/std", + "pallet-nicks/std", + "pallet-offences/std", + "pallet-proxy/std", + "pallet-recovery/std", "sp-runtime/std", "sp-staking/std", - "scheduler/std", - "session/std", - "society/std", - "staking/std", - "sudo/std", - "system/std", - "system_rpc_runtime_api/std", - "timestamp/std", - "treasury/std", - "version/std", - "utility/std", - "vesting/std", + "pallet-scheduler/std", + "pallet-session/std", + "pallet-society/std", + "pallet-staking/std", + "pallet-sudo/std", + "frame-system/std", + "frame-system-rpc-runtime-api/std", + "pallet-timestamp/std", + "pallet-treasury/std", + "sp-version/std", + "pallet-utility/std", + "pallet-vesting/std", "serde_derive", "serde/std", "log", - "babe/std", + "pallet-babe/std", "babe-primitives/std", "sp-session/std", - "randomness-collective-flip/std", + "pallet-randomness-collective-flip/std", "runtime-common/std", ] runtime-benchmarks = [ @@ -155,21 +155,21 @@ runtime-benchmarks = [ "frame-benchmarking", "frame-support/runtime-benchmarks", "frame-system-benchmarking", - "system/runtime-benchmarks", + "frame-system/runtime-benchmarks", "sp-runtime/runtime-benchmarks", - "balances/runtime-benchmarks", - "collective/runtime-benchmarks", - "democracy/runtime-benchmarks", - "elections-phragmen/runtime-benchmarks", - "identity/runtime-benchmarks", - "im-online/runtime-benchmarks", - "scheduler/runtime-benchmarks", - "society/runtime-benchmarks", - "staking/runtime-benchmarks", - "timestamp/runtime-benchmarks", - "treasury/runtime-benchmarks", - "utility/runtime-benchmarks", - "vesting/runtime-benchmarks", + "pallet-balances/runtime-benchmarks", + "pallet-collective/runtime-benchmarks", + "pallet-democracy/runtime-benchmarks", + "pallet-elections-phragmen/runtime-benchmarks", + "pallet-identity/runtime-benchmarks", + "pallet-im-online/runtime-benchmarks", + "pallet-scheduler/runtime-benchmarks", + "pallet-society/runtime-benchmarks", + "pallet-staking/runtime-benchmarks", + "pallet-timestamp/runtime-benchmarks", + "pallet-treasury/runtime-benchmarks", + "pallet-utility/runtime-benchmarks", + "pallet-vesting/runtime-benchmarks", "pallet-offences-benchmarking", "pallet-session-benchmarking", # uncomment when it is made optional again diff --git a/runtime/westend/src/constants.rs b/runtime/westend/src/constants.rs index f59a384fba..6fb7e934e1 100644 --- a/runtime/westend/src/constants.rs +++ b/runtime/westend/src/constants.rs @@ -61,7 +61,7 @@ pub mod fee { /// node's balance type. /// /// This should typically create a mapping between the following ranges: - /// - [0, system::MaximumBlockWeight] + /// - [0, frame_system::MaximumBlockWeight] /// - [Balance::min, Balance::max] /// /// Yet, it can be used for any other sort of change to weight-fee. Some examples being: diff --git a/runtime/westend/src/lib.rs b/runtime/westend/src/lib.rs index 7e2cb3a71d..0c11900bea 100644 --- a/runtime/westend/src/lib.rs +++ b/runtime/westend/src/lib.rs @@ -44,10 +44,10 @@ use sp_runtime::{ }; #[cfg(feature = "runtime-benchmarks")] use sp_runtime::RuntimeString; -use version::RuntimeVersion; -use grandpa::{AuthorityId as GrandpaId, fg_primitives}; +use sp_version::RuntimeVersion; +use pallet_grandpa::{AuthorityId as GrandpaId, fg_primitives}; #[cfg(any(feature = "std", test))] -use version::NativeVersion; +use sp_version::NativeVersion; use sp_core::OpaqueMetadata; use sp_staking::SessionIndex; use frame_support::{ @@ -55,18 +55,18 @@ use frame_support::{ traits::{KeyOwnerProofSystem, Randomness, Filter, InstanceFilter}, weights::Weight, }; -use im_online::sr25519::AuthorityId as ImOnlineId; +use pallet_im_online::sr25519::AuthorityId as ImOnlineId; use authority_discovery_primitives::AuthorityId as AuthorityDiscoveryId; -use transaction_payment_rpc_runtime_api::RuntimeDispatchInfo; -use session::historical as session_historical; -use system::{EnsureRoot, EnsureSignedBy, EnsureOneOf}; +use pallet_transaction_payment_rpc_runtime_api::RuntimeDispatchInfo; +use pallet_session::historical as session_historical; +use frame_system::{EnsureRoot, EnsureSignedBy, EnsureOneOf}; #[cfg(feature = "std")] -pub use staking::StakerStatus; +pub use pallet_staking::StakerStatus; #[cfg(any(feature = "std", test))] pub use sp_runtime::BuildStorage; -pub use timestamp::Call as TimestampCall; -pub use balances::Call as BalancesCall; +pub use pallet_timestamp::Call as TimestampCall; +pub use pallet_balances::Call as BalancesCall; pub use attestations::{Call as AttestationsCall, MORE_ATTESTATIONS_IDENTIFIER}; pub use parachains::Call as ParachainsCall; @@ -91,7 +91,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { #[cfg(not(feature = "disable-runtime-api"))] apis: RUNTIME_API_VERSIONS, #[cfg(feature = "disable-runtime-api")] - apis: version::create_apis_vec![[]], + apis: sp_version::create_apis_vec![[]], transaction_version: 2, }; @@ -116,7 +116,7 @@ parameter_types! { pub const Version: RuntimeVersion = VERSION; } -impl system::Trait for Runtime { +impl frame_system::Trait for Runtime { type BaseCallFilter = BaseFilter; type Origin = Origin; type Call = Call; @@ -138,13 +138,13 @@ impl system::Trait for Runtime { type AvailableBlockRatio = AvailableBlockRatio; type Version = Version; type ModuleToIndex = ModuleToIndex; - type AccountData = balances::AccountData; + type AccountData = pallet_balances::AccountData; type OnNewAccount = (); type OnKilledAccount = (); type SystemWeightInfo = (); } -impl scheduler::Trait for Runtime { +impl pallet_scheduler::Trait for Runtime { type Event = Event; type Origin = Origin; type PalletsOrigin = OriginCaller; @@ -159,34 +159,34 @@ parameter_types! { pub const ExpectedBlockTime: Moment = MILLISECS_PER_BLOCK; } -impl babe::Trait for Runtime { +impl pallet_babe::Trait for Runtime { type EpochDuration = EpochDuration; type ExpectedBlockTime = ExpectedBlockTime; // session module is the trigger - type EpochChangeTrigger = babe::ExternalTrigger; + type EpochChangeTrigger = pallet_babe::ExternalTrigger; type KeyOwnerProofSystem = Historical; type KeyOwnerProof = >::Proof; type KeyOwnerIdentification = >::IdentificationTuple; type HandleEquivocation = - babe::EquivocationHandler; + pallet_babe::EquivocationHandler; } parameter_types! { pub const IndexDeposit: Balance = 1 * DOLLARS; } -impl indices::Trait for Runtime { +impl pallet_indices::Trait for Runtime { type AccountIndex = AccountIndex; type Currency = Balances; type Deposit = IndexDeposit; @@ -198,20 +198,20 @@ parameter_types! { pub const ExistentialDeposit: Balance = 1 * CENTS; } -impl balances::Trait for Runtime { +impl pallet_balances::Trait for Runtime { type Balance = Balance; type DustRemoval = (); type Event = Event; type ExistentialDeposit = ExistentialDeposit; type AccountStore = System; - type WeightInfo = weights::balances::WeightInfo; + type WeightInfo = weights::pallet_balances::WeightInfo; } parameter_types! { pub const TransactionByteFee: Balance = 10 * MILLICENTS; } -impl transaction_payment::Trait for Runtime { +impl pallet_transaction_payment::Trait for Runtime { type Currency = Balances; type OnTransactionPayment = ToAuthor; type TransactionByteFee = TransactionByteFee; @@ -222,7 +222,7 @@ impl transaction_payment::Trait for Runtime { parameter_types! { pub const MinimumPeriod: u64 = SLOT_DURATION / 2; } -impl timestamp::Trait for Runtime { +impl pallet_timestamp::Trait for Runtime { type Moment = u64; type OnTimestampSet = Babe; type MinimumPeriod = MinimumPeriod; @@ -234,8 +234,8 @@ parameter_types! { } // TODO: substrate#2986 implement this properly -impl authorship::Trait for Runtime { - type FindAuthor = session::FindAccountFromAuthorIndex; +impl pallet_authorship::Trait for Runtime { + type FindAuthor = pallet_session::FindAccountFromAuthorIndex; type UncleGenerations = UncleGenerations; type FilterUncle = (); type EventHandler = (Staking, ImOnline); @@ -260,22 +260,22 @@ parameter_types! { pub const DisabledValidatorsThreshold: Perbill = Perbill::from_percent(17); } -impl session::Trait for Runtime { +impl pallet_session::Trait for Runtime { type Event = Event; type ValidatorId = AccountId; - type ValidatorIdOf = staking::StashOf; + type ValidatorIdOf = pallet_staking::StashOf; type ShouldEndSession = Babe; type NextSessionRotation = Babe; - type SessionManager = session::historical::NoteHistoricalRoot; + type SessionManager = pallet_session::historical::NoteHistoricalRoot; type SessionHandler = ::KeyTypeIdProviders; type Keys = SessionKeys; type DisabledValidatorsThreshold = DisabledValidatorsThreshold; type WeightInfo = (); } -impl session::historical::Trait for Runtime { - type FullIdentification = staking::Exposure; - type FullIdentificationOf = staking::ExposureOf; +impl pallet_session::historical::Trait for Runtime { + type FullIdentification = pallet_staking::Exposure; + type FullIdentificationOf = pallet_staking::ExposureOf; } pallet_staking_reward_curve::build! { @@ -293,9 +293,9 @@ parameter_types! { // Six sessions in an era (6 hours). pub const SessionsPerEra: SessionIndex = 6; // 28 eras for unbonding (7 days). - pub const BondingDuration: staking::EraIndex = 28; + pub const BondingDuration: pallet_staking::EraIndex = 28; // 27 eras in which slashes can be cancelled (slightly less than 7 days). - pub const SlashDeferDuration: staking::EraIndex = 27; + pub const SlashDeferDuration: pallet_staking::EraIndex = 27; pub const RewardCurve: &'static PiecewiseLinear<'static> = &REWARD_CURVE; pub const MaxNominatorRewardedPerValidator: u32 = 64; // quarter of the last session will be for election. @@ -304,7 +304,7 @@ parameter_types! { pub MinSolutionScoreBump: Perbill = Perbill::from_rational_approximation(5u32, 10_000); } -impl staking::Trait for Runtime { +impl pallet_staking::Trait for Runtime { type Currency = Balances; type UnixTime = Timestamp; type CurrencyToVote = CurrencyToVoteHandler; @@ -345,15 +345,15 @@ parameter_types! { pub OffencesWeightSoftLimit: Weight = Perbill::from_percent(60) * MaximumBlockWeight::get(); } -impl offences::Trait for Runtime { +impl pallet_offences::Trait for Runtime { type Event = Event; - type IdentificationTuple = session::historical::IdentificationTuple; + type IdentificationTuple = pallet_session::historical::IdentificationTuple; type OnOffenceHandler = Staking; type WeightSoftLimit = OffencesWeightSoftLimit; type WeightInfo = (); } -impl authority_discovery::Trait for Runtime {} +impl pallet_authority_discovery::Trait for Runtime {} parameter_types! { pub const SessionDuration: BlockNumber = EPOCH_DURATION_IN_BLOCKS as _; @@ -364,7 +364,7 @@ parameter_types! { pub const ImOnlineUnsignedPriority: TransactionPriority = TransactionPriority::max_value(); } -impl im_online::Trait for Runtime { +impl pallet_im_online::Trait for Runtime { type AuthorityId = ImOnlineId; type Event = Event; type ReportUnresponsiveness = Offences; @@ -373,7 +373,7 @@ impl im_online::Trait for Runtime { type WeightInfo = (); } -impl grandpa::Trait for Runtime { +impl pallet_grandpa::Trait for Runtime { type Event = Event; type Call = Call; @@ -387,15 +387,15 @@ impl grandpa::Trait for Runtime { GrandpaId, )>>::IdentificationTuple; - type HandleEquivocation = grandpa::EquivocationHandler; + type HandleEquivocation = pallet_grandpa::EquivocationHandler; } parameter_types! { - pub WindowSize: BlockNumber = finality_tracker::DEFAULT_WINDOW_SIZE.into(); - pub ReportLatency: BlockNumber = finality_tracker::DEFAULT_REPORT_LATENCY.into(); + pub WindowSize: BlockNumber = pallet_finality_tracker::DEFAULT_WINDOW_SIZE.into(); + pub ReportLatency: BlockNumber = pallet_finality_tracker::DEFAULT_REPORT_LATENCY.into(); } -impl finality_tracker::Trait for Runtime { +impl pallet_finality_tracker::Trait for Runtime { type OnFinalizationStalled = (); type WindowSize = WindowSize; type ReportLatency = ReportLatency; @@ -436,7 +436,7 @@ impl parachains::Trait for Runtime { type SlashPeriod = SlashPeriod; type Proof = sp_session::MembershipProof; - type KeyOwnerProofSystem = session::historical::Module; + type KeyOwnerProofSystem = pallet_session::historical::Module; type IdentificationTuple = )>>::IdentificationTuple; type ReportOffence = Offences; type BlockHashConversion = sp_runtime::traits::Identity; @@ -444,14 +444,14 @@ impl parachains::Trait for Runtime { /// Submits a transaction with the node's public and signature type. Adheres to the signed extension /// format of the chain. -impl system::offchain::CreateSignedTransaction for Runtime where +impl frame_system::offchain::CreateSignedTransaction for Runtime where Call: From, { - fn create_transaction>( + fn create_transaction>( call: Call, public: ::Signer, account: AccountId, - nonce: ::Index, + nonce: ::Index, ) -> Option<(Call, ::SignaturePayload)> { // take the biggest period possible. let period = BlockHashCount::get() @@ -466,13 +466,13 @@ impl system::offchain::CreateSignedTransaction for Runtime .saturating_sub(1); let tip = 0; let extra: SignedExtra = ( - system::CheckSpecVersion::::new(), - system::CheckTxVersion::::new(), - system::CheckGenesis::::new(), - system::CheckMortality::::from(generic::Era::mortal(period, current_block)), - system::CheckNonce::::from(nonce), - system::CheckWeight::::new(), - transaction_payment::ChargeTransactionPayment::::from(tip), + frame_system::CheckSpecVersion::::new(), + frame_system::CheckTxVersion::::new(), + frame_system::CheckGenesis::::new(), + frame_system::CheckMortality::::from(generic::Era::mortal(period, current_block)), + frame_system::CheckNonce::::from(nonce), + frame_system::CheckWeight::::new(), + pallet_transaction_payment::ChargeTransactionPayment::::from(tip), registrar::LimitParathreadCommits::::new(), parachains::ValidateDoubleVoteReports::::new(), ); @@ -487,12 +487,12 @@ impl system::offchain::CreateSignedTransaction for Runtime } } -impl system::offchain::SigningTypes for Runtime { +impl frame_system::offchain::SigningTypes for Runtime { type Public = ::Signer; type Signature = Signature; } -impl system::offchain::SendTransactionTypes for Runtime where +impl frame_system::offchain::SendTransactionTypes for Runtime where Call: From, { type OverarchingCall = Call; @@ -525,7 +525,7 @@ parameter_types! { pub const MaxRegistrars: u32 = 20; } -impl identity::Trait for Runtime { +impl pallet_identity::Trait for Runtime { type Event = Event; type Currency = Balances; type Slashed = (); @@ -535,12 +535,12 @@ impl identity::Trait for Runtime { type MaxSubAccounts = MaxSubAccounts; type MaxAdditionalFields = MaxAdditionalFields; type MaxRegistrars = MaxRegistrars; - type RegistrarOrigin = system::EnsureRoot; - type ForceOrigin = system::EnsureRoot; + type RegistrarOrigin = frame_system::EnsureRoot; + type ForceOrigin = frame_system::EnsureRoot; type WeightInfo = (); } -impl utility::Trait for Runtime { +impl pallet_utility::Trait for Runtime { type Event = Event; type Call = Call; type WeightInfo = (); @@ -554,7 +554,7 @@ parameter_types! { pub const MaxSignatories: u16 = 100; } -impl multisig::Trait for Runtime { +impl pallet_multisig::Trait for Runtime { type Event = Event; type Call = Call; type Currency = Balances; @@ -571,7 +571,7 @@ parameter_types! { pub const RecoveryDeposit: Balance = 5 * DOLLARS; } -impl recovery::Trait for Runtime { +impl pallet_recovery::Trait for Runtime { type Event = Event; type Call = Call; type Currency = Balances; @@ -585,7 +585,7 @@ parameter_types! { pub const MinVestedTransfer: Balance = 100 * DOLLARS; } -impl vesting::Trait for Runtime { +impl pallet_vesting::Trait for Runtime { type Event = Event; type Currency = Balances; type BlockNumberToBalance = ConvertInto; @@ -593,7 +593,7 @@ impl vesting::Trait for Runtime { type WeightInfo = (); } -impl sudo::Trait for Runtime { +impl pallet_sudo::Trait for Runtime { type Event = Event; type Call = Call; } @@ -624,9 +624,9 @@ impl InstanceFilter for ProxyType { Call::System(..) | Call::Babe(..) | Call::Timestamp(..) | - Call::Indices(indices::Call::claim(..)) | - Call::Indices(indices::Call::free(..)) | - Call::Indices(indices::Call::freeze(..)) | + Call::Indices(pallet_indices::Call::claim(..)) | + Call::Indices(pallet_indices::Call::free(..)) | + Call::Indices(pallet_indices::Call::freeze(..)) | // Specifically omitting Indices `transfer`, `force_transfer` // Specifically omitting the entire Balances pallet Call::Authorship(..) | @@ -642,15 +642,15 @@ impl InstanceFilter for ProxyType { Call::Registrar(..) | Call::Utility(..) | Call::Identity(..) | - Call::Recovery(recovery::Call::as_recovered(..)) | - Call::Recovery(recovery::Call::vouch_recovery(..)) | - Call::Recovery(recovery::Call::claim_recovery(..)) | - Call::Recovery(recovery::Call::close_recovery(..)) | - Call::Recovery(recovery::Call::remove_recovery(..)) | - Call::Recovery(recovery::Call::cancel_recovered(..)) | + Call::Recovery(pallet_recovery::Call::as_recovered(..)) | + Call::Recovery(pallet_recovery::Call::vouch_recovery(..)) | + Call::Recovery(pallet_recovery::Call::claim_recovery(..)) | + Call::Recovery(pallet_recovery::Call::close_recovery(..)) | + Call::Recovery(pallet_recovery::Call::remove_recovery(..)) | + Call::Recovery(pallet_recovery::Call::cancel_recovered(..)) | // Specifically omitting Recovery `create_recovery`, `initiate_recovery` - Call::Vesting(vesting::Call::vest(..)) | - Call::Vesting(vesting::Call::vest_other(..)) | + Call::Vesting(pallet_vesting::Call::vest(..)) | + Call::Vesting(pallet_vesting::Call::vest_other(..)) | // Specifically omitting Vesting `vested_transfer`, and `force_vested_transfer` Call::Scheduler(..) | // Specifically omitting Sudo pallet @@ -661,13 +661,13 @@ impl InstanceFilter for ProxyType { Call::Staking(..) | Call::Utility(..) ), ProxyType::SudoBalances => match c { - Call::Sudo(sudo::Call::sudo(ref x)) => matches!(x.as_ref(), &Call::Balances(..)), + Call::Sudo(pallet_sudo::Call::sudo(ref x)) => matches!(x.as_ref(), &Call::Balances(..)), Call::Utility(..) => true, _ => false, }, ProxyType::IdentityJudgement => matches!(c, - Call::Identity(identity::Call::provide_judgement(..)) - | Call::Utility(utility::Call::batch(..)) + Call::Identity(pallet_identity::Call::provide_judgement(..)) + | Call::Utility(pallet_utility::Call::batch(..)) ) } } @@ -682,7 +682,7 @@ impl InstanceFilter for ProxyType { } } -impl proxy::Trait for Runtime { +impl pallet_proxy::Trait for Runtime { type Event = Event; type Call = Call; type Currency = Balances; @@ -740,27 +740,27 @@ construct_runtime! { UncheckedExtrinsic = UncheckedExtrinsic { // Basic stuff; balances is uncallable initially. - System: system::{Module, Call, Storage, Config, Event}, - RandomnessCollectiveFlip: randomness_collective_flip::{Module, Storage}, + System: frame_system::{Module, Call, Storage, Config, Event}, + RandomnessCollectiveFlip: pallet_randomness_collective_flip::{Module, Storage}, // Must be before session. - Babe: babe::{Module, Call, Storage, Config, Inherent, ValidateUnsigned}, + Babe: pallet_babe::{Module, Call, Storage, Config, Inherent, ValidateUnsigned}, - Timestamp: timestamp::{Module, Call, Storage, Inherent}, - Indices: indices::{Module, Call, Storage, Config, Event}, - Balances: balances::{Module, Call, Storage, Config, Event}, - TransactionPayment: transaction_payment::{Module, Storage}, + Timestamp: pallet_timestamp::{Module, Call, Storage, Inherent}, + Indices: pallet_indices::{Module, Call, Storage, Config, Event}, + Balances: pallet_balances::{Module, Call, Storage, Config, Event}, + TransactionPayment: pallet_transaction_payment::{Module, Storage}, // Consensus support. - Authorship: authorship::{Module, Call, Storage}, - Staking: staking::{Module, Call, Storage, Config, Event, ValidateUnsigned}, - Offences: offences::{Module, Call, Storage, Event}, + Authorship: pallet_authorship::{Module, Call, Storage}, + Staking: pallet_staking::{Module, Call, Storage, Config, Event, ValidateUnsigned}, + Offences: pallet_offences::{Module, Call, Storage, Event}, Historical: session_historical::{Module}, - Session: session::{Module, Call, Storage, Event, Config}, - FinalityTracker: finality_tracker::{Module, Call, Storage, Inherent}, - Grandpa: grandpa::{Module, Call, Storage, Config, Event, ValidateUnsigned}, - ImOnline: im_online::{Module, Call, Storage, Event, ValidateUnsigned, Config}, - AuthorityDiscovery: authority_discovery::{Module, Call, Config}, + Session: pallet_session::{Module, Call, Storage, Event, Config}, + FinalityTracker: pallet_finality_tracker::{Module, Call, Storage, Inherent}, + Grandpa: pallet_grandpa::{Module, Call, Storage, Config, Event, ValidateUnsigned}, + ImOnline: pallet_im_online::{Module, Call, Storage, Event, ValidateUnsigned, Config}, + AuthorityDiscovery: pallet_authority_discovery::{Module, Call, Config}, // Parachains stuff; slots are disabled (no auctions initially). The rest are safe as they // have no public dispatchables. @@ -769,28 +769,28 @@ construct_runtime! { Registrar: registrar::{Module, Call, Storage, Event, Config}, // Utility module. - Utility: utility::{Module, Call, Event}, + Utility: pallet_utility::{Module, Call, Event}, // Less simple identity module. - Identity: identity::{Module, Call, Storage, Event}, + Identity: pallet_identity::{Module, Call, Storage, Event}, // Social recovery module. - Recovery: recovery::{Module, Call, Storage, Event}, + Recovery: pallet_recovery::{Module, Call, Storage, Event}, // Vesting. Usable initially, but removed once all vesting is finished. - Vesting: vesting::{Module, Call, Storage, Event, Config}, + Vesting: pallet_vesting::{Module, Call, Storage, Event, Config}, // System scheduler. - Scheduler: scheduler::{Module, Call, Storage, Event}, + Scheduler: pallet_scheduler::{Module, Call, Storage, Event}, // Sudo. - Sudo: sudo::{Module, Call, Storage, Event, Config}, + Sudo: pallet_sudo::{Module, Call, Storage, Event, Config}, // Proxy module. Late addition. - Proxy: proxy::{Module, Call, Storage, Event}, + Proxy: pallet_proxy::{Module, Call, Storage, Event}, // Multisig module. Late addition. - Multisig: multisig::{Module, Call, Storage, Event}, + Multisig: pallet_multisig::{Module, Call, Storage, Event}, // Purchase module. Late addition. Purchase: purchase::{Module, Call, Storage, Event}, @@ -809,13 +809,13 @@ pub type SignedBlock = generic::SignedBlock; pub type BlockId = generic::BlockId; /// The SignedExtension to the basic transaction logic. pub type SignedExtra = ( - system::CheckSpecVersion, - system::CheckTxVersion, - system::CheckGenesis, - system::CheckMortality, - system::CheckNonce, - system::CheckWeight, - transaction_payment::ChargeTransactionPayment, + frame_system::CheckSpecVersion, + frame_system::CheckTxVersion, + frame_system::CheckGenesis, + frame_system::CheckMortality, + frame_system::CheckNonce, + frame_system::CheckWeight, + pallet_transaction_payment::ChargeTransactionPayment, registrar::LimitParathreadCommits, parachains::ValidateDoubleVoteReports, ); @@ -824,7 +824,7 @@ pub type UncheckedExtrinsic = generic::UncheckedExtrinsic; /// Executive: handles dispatch to the various modules. -pub type Executive = executive::Executive, Runtime, AllModules>; +pub type Executive = frame_executive::Executive, Runtime, AllModules>; /// The payload being signed in transactions. pub type SignedPayload = generic::SignedPayload; @@ -1027,13 +1027,13 @@ sp_api::impl_runtime_apis! { } } - impl system_rpc_runtime_api::AccountNonceApi for Runtime { + impl frame_system_rpc_runtime_api::AccountNonceApi for Runtime { fn account_nonce(account: AccountId) -> Nonce { System::account_nonce(account) } } - impl transaction_payment_rpc_runtime_api::TransactionPaymentApi< + impl pallet_transaction_payment_rpc_runtime_api::TransactionPaymentApi< Block, Balance, > for Runtime { @@ -1095,21 +1095,20 @@ sp_api::impl_runtime_apis! { extra, ); - add_benchmark!(params, batches, balances,Balances); - add_benchmark!(params, batches, identity,Identity); - add_benchmark!(params, batches, im_online,ImOnline); - add_benchmark!(params, batches, offences,OffencesBench::); - add_benchmark!(params, batches, scheduler, Scheduler); - add_benchmark!(params, batches, session, SessionBench::); - add_benchmark!(params, batches, staking, Staking); - add_benchmark!(params, batches, system, SystemBench::); - add_benchmark!(params, batches, timestamp, Timestamp); - add_benchmark!(params, batches, utility, Utility); - add_benchmark!(params, batches, vesting, Vesting); + add_benchmark!(params, batches, pallet_balances, Balances); + add_benchmark!(params, batches, pallet_identity, Identity); + add_benchmark!(params, batches, pallet_im_online, ImOnline); + add_benchmark!(params, batches, pallet_offences, OffencesBench::); + add_benchmark!(params, batches, pallet_scheduler, Scheduler); + add_benchmark!(params, batches, pallet_session, SessionBench::); + add_benchmark!(params, batches, pallet_staking, Staking); + add_benchmark!(params, batches, frame_system, SystemBench::); + add_benchmark!(params, batches, pallet_timestamp, Timestamp); + add_benchmark!(params, batches, pallet_utility, Utility); + add_benchmark!(params, batches, pallet_vesting, Vesting); if batches.is_empty() { return Err("Benchmark not found for this pallet.".into()) } Ok(batches) } } } - diff --git a/runtime/westend/src/weights/mod.rs b/runtime/westend/src/weights/mod.rs index 75cabca0c6..b94314e339 100644 --- a/runtime/westend/src/weights/mod.rs +++ b/runtime/westend/src/weights/mod.rs @@ -16,4 +16,4 @@ /// A collection of weight modules used for pallets in the runtime. -pub mod balances; +pub mod pallet_balances; diff --git a/runtime/westend/src/weights/balances.rs b/runtime/westend/src/weights/pallet_balances.rs similarity index 97% rename from runtime/westend/src/weights/balances.rs rename to runtime/westend/src/weights/pallet_balances.rs index bc2f3ac18a..53431ba48f 100644 --- a/runtime/westend/src/weights/balances.rs +++ b/runtime/westend/src/weights/pallet_balances.rs @@ -18,7 +18,7 @@ use frame_support::weights::{Weight, constants::RocksDbWeight as DbWeight}; pub struct WeightInfo; -impl balances::WeightInfo for WeightInfo { +impl pallet_balances::WeightInfo for WeightInfo { fn transfer() -> Weight { (65949000 as Weight) .saturating_add(DbWeight::get().reads(1 as Weight)) diff --git a/service/Cargo.toml b/service/Cargo.toml index 858d1e415c..c5dd68e57f 100644 --- a/service/Cargo.toml +++ b/service/Cargo.toml @@ -45,14 +45,14 @@ sp-transaction-pool = { git = "https://github.com/paritytech/substrate", branch sc-keystore = { git = "https://github.com/paritytech/substrate", branch = "master" } pallet-babe = { git = "https://github.com/paritytech/substrate", branch = "master" } pallet-staking = { git = "https://github.com/paritytech/substrate", branch = "master" } -im-online = { package = "pallet-im-online", git = "https://github.com/paritytech/substrate", branch = "master" } +pallet-im-online = { git = "https://github.com/paritytech/substrate", branch = "master" } authority-discovery = { package = "sc-authority-discovery", git = "https://github.com/paritytech/substrate", branch = "master" } authority-discovery-primitives = { package = "sp-authority-discovery", git = "https://github.com/paritytech/substrate", branch = "master" } babe = { package = "sc-consensus-babe", git = "https://github.com/paritytech/substrate", branch = "master" } babe-primitives = { package = "sp-consensus-babe", git = "https://github.com/paritytech/substrate", branch = "master" } sp-block-builder = { git = "https://github.com/paritytech/substrate", branch = "master" } pallet-transaction-payment-rpc-runtime-api = { git = "https://github.com/paritytech/substrate", branch = "master" } -system_rpc_runtime_api = { package = "frame-system-rpc-runtime-api", git = "https://github.com/paritytech/substrate", branch = "master" } +frame-system-rpc-runtime-api = { git = "https://github.com/paritytech/substrate", branch = "master" } codec = { package = "parity-scale-codec", version = "1.3.4" } sp-session = { git = "https://github.com/paritytech/substrate", branch = "master" } sp-offchain = { package = "sp-offchain", git = "https://github.com/paritytech/substrate", branch = "master" } diff --git a/service/src/chain_spec.rs b/service/src/chain_spec.rs index 7057aca5eb..580d00b946 100644 --- a/service/src/chain_spec.rs +++ b/service/src/chain_spec.rs @@ -33,7 +33,7 @@ use telemetry::TelemetryEndpoints; use hex_literal::hex; use babe_primitives::AuthorityId as BabeId; use grandpa::AuthorityId as GrandpaId; -use im_online::sr25519::{AuthorityId as ImOnlineId}; +use pallet_im_online::sr25519::{AuthorityId as ImOnlineId}; use authority_discovery_primitives::AuthorityId as AuthorityDiscoveryId; use pallet_staking::Forcing; @@ -153,27 +153,27 @@ fn polkadot_staging_testnet_config_genesis(wasm_binary: &[u8]) -> polkadot::Gene const STASH: u128 = 100 * DOTS; polkadot::GenesisConfig { - system: Some(polkadot::SystemConfig { + frame_system: Some(polkadot::SystemConfig { code: wasm_binary.to_vec(), changes_trie_config: Default::default(), }), - balances: Some(polkadot::BalancesConfig { + pallet_balances: Some(polkadot::BalancesConfig { balances: endowed_accounts.iter() .map(|k: &AccountId| (k.clone(), ENDOWMENT)) .chain(initial_authorities.iter().map(|x| (x.0.clone(), STASH))) .collect(), }), - indices: Some(polkadot::IndicesConfig { + pallet_indices: Some(polkadot::IndicesConfig { indices: vec![], }), - session: Some(polkadot::SessionConfig { + pallet_session: Some(polkadot::SessionConfig { keys: initial_authorities.iter().map(|x| ( x.0.clone(), x.0.clone(), polkadot_session_keys(x.2.clone(), x.3.clone(), x.4.clone(), x.5.clone(), x.6.clone()), )).collect::>(), }), - staking: Some(polkadot::StakingConfig { + pallet_staking: Some(polkadot::StakingConfig { validator_count: 50, minimum_validator_count: 4, stakers: initial_authorities @@ -185,21 +185,21 @@ fn polkadot_staging_testnet_config_genesis(wasm_binary: &[u8]) -> polkadot::Gene slash_reward_fraction: Perbill::from_percent(10), .. Default::default() }), - elections_phragmen: Some(Default::default()), - democracy: Some(Default::default()), - collective_Instance1: Some(polkadot::CouncilConfig { + pallet_elections_phragmen: Some(Default::default()), + pallet_democracy: Some(Default::default()), + pallet_collective_Instance1: Some(polkadot::CouncilConfig { members: vec![], phantom: Default::default(), }), - collective_Instance2: Some(polkadot::TechnicalCommitteeConfig { + pallet_collective_Instance2: Some(polkadot::TechnicalCommitteeConfig { members: vec![], phantom: Default::default(), }), - membership_Instance1: Some(Default::default()), - babe: Some(Default::default()), - grandpa: Some(Default::default()), - im_online: Some(Default::default()), - authority_discovery: Some(polkadot::AuthorityDiscoveryConfig { + pallet_membership_Instance1: Some(Default::default()), + pallet_babe: Some(Default::default()), + pallet_grandpa: Some(Default::default()), + pallet_im_online: Some(Default::default()), + pallet_authority_discovery: Some(polkadot::AuthorityDiscoveryConfig { keys: vec![], }), parachains: Some(polkadot::ParachainsConfig { @@ -213,7 +213,7 @@ fn polkadot_staging_testnet_config_genesis(wasm_binary: &[u8]) -> polkadot::Gene claims: vec![], vesting: vec![], }), - vesting: Some(polkadot::VestingConfig { + pallet_vesting: Some(polkadot::VestingConfig { vesting: vec![], }), } @@ -305,27 +305,27 @@ fn westend_staging_testnet_config_genesis(wasm_binary: &[u8]) -> westend::Genesi const STASH: u128 = 100 * WND; westend::GenesisConfig { - system: Some(westend::SystemConfig { + frame_system: Some(westend::SystemConfig { code: wasm_binary.to_vec(), changes_trie_config: Default::default(), }), - balances: Some(westend::BalancesConfig { + pallet_balances: Some(westend::BalancesConfig { balances: endowed_accounts.iter() .map(|k: &AccountId| (k.clone(), ENDOWMENT)) .chain(initial_authorities.iter().map(|x| (x.0.clone(), STASH))) .collect(), }), - indices: Some(westend::IndicesConfig { + pallet_indices: Some(westend::IndicesConfig { indices: vec![], }), - session: Some(westend::SessionConfig { + pallet_session: Some(westend::SessionConfig { keys: initial_authorities.iter().map(|x| ( x.0.clone(), x.0.clone(), westend_session_keys(x.2.clone(), x.3.clone(), x.4.clone(), x.5.clone(), x.6.clone()), )).collect::>(), }), - staking: Some(westend::StakingConfig { + pallet_staking: Some(westend::StakingConfig { validator_count: 50, minimum_validator_count: 4, stakers: initial_authorities @@ -337,10 +337,10 @@ fn westend_staging_testnet_config_genesis(wasm_binary: &[u8]) -> westend::Genesi slash_reward_fraction: Perbill::from_percent(10), .. Default::default() }), - babe: Some(Default::default()), - grandpa: Some(Default::default()), - im_online: Some(Default::default()), - authority_discovery: Some(westend::AuthorityDiscoveryConfig { + pallet_babe: Some(Default::default()), + pallet_grandpa: Some(Default::default()), + pallet_im_online: Some(Default::default()), + pallet_authority_discovery: Some(westend::AuthorityDiscoveryConfig { keys: vec![], }), parachains: Some(westend::ParachainsConfig { @@ -350,10 +350,10 @@ fn westend_staging_testnet_config_genesis(wasm_binary: &[u8]) -> westend::Genesi parachains: vec![], _phdata: Default::default(), }), - vesting: Some(westend::VestingConfig { + pallet_vesting: Some(westend::VestingConfig { vesting: vec![], }), - sudo: Some(westend::SudoConfig { + pallet_sudo: Some(westend::SudoConfig { key: endowed_accounts[0].clone(), }), } @@ -508,30 +508,30 @@ fn rococo_staging_testnet_config_genesis(wasm_binary: &[u8]) -> rococo_runtime:: const STASH: u128 = 100 * ROC; rococo_runtime::GenesisConfig { - system: Some(rococo_runtime::SystemConfig { + frame_system: Some(rococo_runtime::SystemConfig { code: wasm_binary.to_vec(), changes_trie_config: Default::default(), }), - balances: Some(rococo_runtime::BalancesConfig { + pallet_balances: Some(rococo_runtime::BalancesConfig { balances: endowed_accounts.iter() .map(|k: &AccountId| (k.clone(), ENDOWMENT)) .chain(initial_authorities.iter().map(|x| (x.0.clone(), STASH))) .collect(), }), - indices: Some(rococo_runtime::IndicesConfig { + pallet_indices: Some(rococo_runtime::IndicesConfig { indices: vec![], }), - session: Some(rococo_runtime::SessionConfig { + pallet_session: Some(rococo_runtime::SessionConfig { keys: initial_authorities.iter().map(|x| ( x.0.clone(), x.0.clone(), rococo_session_keys(x.2.clone(), x.3.clone(), x.4.clone(), x.5.clone(), x.6.clone()), )).collect::>(), }), - babe: Some(Default::default()), - grandpa: Some(Default::default()), - im_online: Some(Default::default()), - authority_discovery: Some(rococo_runtime::AuthorityDiscoveryConfig { + pallet_babe: Some(Default::default()), + pallet_grandpa: Some(Default::default()), + pallet_im_online: Some(Default::default()), + pallet_authority_discovery: Some(rococo_runtime::AuthorityDiscoveryConfig { keys: vec![], }), parachains: Some(rococo_runtime::ParachainsConfig { @@ -541,10 +541,10 @@ fn rococo_staging_testnet_config_genesis(wasm_binary: &[u8]) -> rococo_runtime:: parachains: vec![], _phdata: Default::default(), }), - vesting: Some(rococo_runtime::VestingConfig { + pallet_vesting: Some(rococo_runtime::VestingConfig { vesting: vec![], }), - sudo: Some(rococo_runtime::SudoConfig { + pallet_sudo: Some(rococo_runtime::SudoConfig { key: endowed_accounts[0].clone(), }), } @@ -636,27 +636,27 @@ fn kusama_staging_testnet_config_genesis(wasm_binary: &[u8]) -> kusama::GenesisC const STASH: u128 = 100 * KSM; kusama::GenesisConfig { - system: Some(kusama::SystemConfig { + frame_system: Some(kusama::SystemConfig { code: wasm_binary.to_vec(), changes_trie_config: Default::default(), }), - balances: Some(kusama::BalancesConfig { + pallet_balances: Some(kusama::BalancesConfig { balances: endowed_accounts.iter() .map(|k: &AccountId| (k.clone(), ENDOWMENT)) .chain(initial_authorities.iter().map(|x| (x.0.clone(), STASH))) .collect(), }), - indices: Some(kusama::IndicesConfig { + pallet_indices: Some(kusama::IndicesConfig { indices: vec![], }), - session: Some(kusama::SessionConfig { + pallet_session: Some(kusama::SessionConfig { keys: initial_authorities.iter().map(|x| ( x.0.clone(), x.0.clone(), kusama_session_keys(x.2.clone(), x.3.clone(), x.4.clone(), x.5.clone(), x.6.clone()), )).collect::>(), }), - staking: Some(kusama::StakingConfig { + pallet_staking: Some(kusama::StakingConfig { validator_count: 50, minimum_validator_count: 4, stakers: initial_authorities @@ -668,21 +668,21 @@ fn kusama_staging_testnet_config_genesis(wasm_binary: &[u8]) -> kusama::GenesisC slash_reward_fraction: Perbill::from_percent(10), .. Default::default() }), - elections_phragmen: Some(Default::default()), - democracy: Some(Default::default()), - collective_Instance1: Some(kusama::CouncilConfig { + pallet_elections_phragmen: Some(Default::default()), + pallet_democracy: Some(Default::default()), + pallet_collective_Instance1: Some(kusama::CouncilConfig { members: vec![], phantom: Default::default(), }), - collective_Instance2: Some(kusama::TechnicalCommitteeConfig { + pallet_collective_Instance2: Some(kusama::TechnicalCommitteeConfig { members: vec![], phantom: Default::default(), }), - membership_Instance1: Some(Default::default()), - babe: Some(Default::default()), - grandpa: Some(Default::default()), - im_online: Some(Default::default()), - authority_discovery: Some(kusama::AuthorityDiscoveryConfig { + pallet_membership_Instance1: Some(Default::default()), + pallet_babe: Some(Default::default()), + pallet_grandpa: Some(Default::default()), + pallet_im_online: Some(Default::default()), + pallet_authority_discovery: Some(kusama::AuthorityDiscoveryConfig { keys: vec![], }), parachains: Some(kusama::ParachainsConfig { @@ -696,7 +696,7 @@ fn kusama_staging_testnet_config_genesis(wasm_binary: &[u8]) -> kusama::GenesisC claims: vec![], vesting: vec![], }), - vesting: Some(kusama::VestingConfig { + pallet_vesting: Some(kusama::VestingConfig { vesting: vec![], }), } @@ -844,24 +844,24 @@ pub fn polkadot_testnet_genesis( const STASH: u128 = 100 * DOTS; polkadot::GenesisConfig { - system: Some(polkadot::SystemConfig { + frame_system: Some(polkadot::SystemConfig { code: wasm_binary.to_vec(), changes_trie_config: Default::default(), }), - indices: Some(polkadot::IndicesConfig { + pallet_indices: Some(polkadot::IndicesConfig { indices: vec![], }), - balances: Some(polkadot::BalancesConfig { + pallet_balances: Some(polkadot::BalancesConfig { balances: endowed_accounts.iter().map(|k| (k.clone(), ENDOWMENT)).collect(), }), - session: Some(polkadot::SessionConfig { + pallet_session: Some(polkadot::SessionConfig { keys: initial_authorities.iter().map(|x| ( x.0.clone(), x.0.clone(), polkadot_session_keys(x.2.clone(), x.3.clone(), x.4.clone(), x.5.clone(), x.6.clone()), )).collect::>(), }), - staking: Some(polkadot::StakingConfig { + pallet_staking: Some(polkadot::StakingConfig { minimum_validator_count: 1, validator_count: 2, stakers: initial_authorities.iter() @@ -872,21 +872,21 @@ pub fn polkadot_testnet_genesis( slash_reward_fraction: Perbill::from_percent(10), .. Default::default() }), - elections_phragmen: Some(Default::default()), - democracy: Some(polkadot::DemocracyConfig::default()), - collective_Instance1: Some(polkadot::CouncilConfig { + pallet_elections_phragmen: Some(Default::default()), + pallet_democracy: Some(polkadot::DemocracyConfig::default()), + pallet_collective_Instance1: Some(polkadot::CouncilConfig { members: vec![], phantom: Default::default(), }), - collective_Instance2: Some(polkadot::TechnicalCommitteeConfig { + pallet_collective_Instance2: Some(polkadot::TechnicalCommitteeConfig { members: vec![], phantom: Default::default(), }), - membership_Instance1: Some(Default::default()), - babe: Some(Default::default()), - grandpa: Some(Default::default()), - im_online: Some(Default::default()), - authority_discovery: Some(polkadot::AuthorityDiscoveryConfig { + pallet_membership_Instance1: Some(Default::default()), + pallet_babe: Some(Default::default()), + pallet_grandpa: Some(Default::default()), + pallet_im_online: Some(Default::default()), + pallet_authority_discovery: Some(polkadot::AuthorityDiscoveryConfig { keys: vec![], }), parachains: Some(polkadot::ParachainsConfig { @@ -900,7 +900,7 @@ pub fn polkadot_testnet_genesis( claims: vec![], vesting: vec![], }), - vesting: Some(polkadot::VestingConfig { + pallet_vesting: Some(polkadot::VestingConfig { vesting: vec![], }), } @@ -919,24 +919,24 @@ pub fn kusama_testnet_genesis( const STASH: u128 = 100 * KSM; kusama::GenesisConfig { - system: Some(kusama::SystemConfig { + frame_system: Some(kusama::SystemConfig { code: wasm_binary.to_vec(), changes_trie_config: Default::default(), }), - indices: Some(kusama::IndicesConfig { + pallet_indices: Some(kusama::IndicesConfig { indices: vec![], }), - balances: Some(kusama::BalancesConfig { + pallet_balances: Some(kusama::BalancesConfig { balances: endowed_accounts.iter().map(|k| (k.clone(), ENDOWMENT)).collect(), }), - session: Some(kusama::SessionConfig { + pallet_session: Some(kusama::SessionConfig { keys: initial_authorities.iter().map(|x| ( x.0.clone(), x.0.clone(), kusama_session_keys(x.2.clone(), x.3.clone(), x.4.clone(), x.5.clone(), x.6.clone()), )).collect::>(), }), - staking: Some(kusama::StakingConfig { + pallet_staking: Some(kusama::StakingConfig { minimum_validator_count: 1, validator_count: 2, stakers: initial_authorities.iter() @@ -947,21 +947,21 @@ pub fn kusama_testnet_genesis( slash_reward_fraction: Perbill::from_percent(10), .. Default::default() }), - elections_phragmen: Some(Default::default()), - democracy: Some(kusama::DemocracyConfig::default()), - collective_Instance1: Some(kusama::CouncilConfig { + pallet_elections_phragmen: Some(Default::default()), + pallet_democracy: Some(kusama::DemocracyConfig::default()), + pallet_collective_Instance1: Some(kusama::CouncilConfig { members: vec![], phantom: Default::default(), }), - collective_Instance2: Some(kusama::TechnicalCommitteeConfig { + pallet_collective_Instance2: Some(kusama::TechnicalCommitteeConfig { members: vec![], phantom: Default::default(), }), - membership_Instance1: Some(Default::default()), - babe: Some(Default::default()), - grandpa: Some(Default::default()), - im_online: Some(Default::default()), - authority_discovery: Some(kusama::AuthorityDiscoveryConfig { + pallet_membership_Instance1: Some(Default::default()), + pallet_babe: Some(Default::default()), + pallet_grandpa: Some(Default::default()), + pallet_im_online: Some(Default::default()), + pallet_authority_discovery: Some(kusama::AuthorityDiscoveryConfig { keys: vec![], }), parachains: Some(kusama::ParachainsConfig { @@ -975,7 +975,7 @@ pub fn kusama_testnet_genesis( claims: vec![], vesting: vec![], }), - vesting: Some(kusama::VestingConfig { + pallet_vesting: Some(kusama::VestingConfig { vesting: vec![], }), } @@ -994,24 +994,24 @@ pub fn westend_testnet_genesis( const STASH: u128 = 100 * DOTS; westend::GenesisConfig { - system: Some(westend::SystemConfig { + frame_system: Some(westend::SystemConfig { code: wasm_binary.to_vec(), changes_trie_config: Default::default(), }), - indices: Some(westend::IndicesConfig { + pallet_indices: Some(westend::IndicesConfig { indices: vec![], }), - balances: Some(westend::BalancesConfig { + pallet_balances: Some(westend::BalancesConfig { balances: endowed_accounts.iter().map(|k| (k.clone(), ENDOWMENT)).collect(), }), - session: Some(westend::SessionConfig { + pallet_session: Some(westend::SessionConfig { keys: initial_authorities.iter().map(|x| ( x.0.clone(), x.0.clone(), westend_session_keys(x.2.clone(), x.3.clone(), x.4.clone(), x.5.clone(), x.6.clone()), )).collect::>(), }), - staking: Some(westend::StakingConfig { + pallet_staking: Some(westend::StakingConfig { minimum_validator_count: 1, validator_count: 2, stakers: initial_authorities.iter() @@ -1022,10 +1022,10 @@ pub fn westend_testnet_genesis( slash_reward_fraction: Perbill::from_percent(10), .. Default::default() }), - babe: Some(Default::default()), - grandpa: Some(Default::default()), - im_online: Some(Default::default()), - authority_discovery: Some(westend::AuthorityDiscoveryConfig { + pallet_babe: Some(Default::default()), + pallet_grandpa: Some(Default::default()), + pallet_im_online: Some(Default::default()), + pallet_authority_discovery: Some(westend::AuthorityDiscoveryConfig { keys: vec![], }), parachains: Some(westend::ParachainsConfig { @@ -1035,10 +1035,10 @@ pub fn westend_testnet_genesis( parachains: vec![], _phdata: Default::default(), }), - vesting: Some(westend::VestingConfig { + pallet_vesting: Some(westend::VestingConfig { vesting: vec![], }), - sudo: Some(westend::SudoConfig { + pallet_sudo: Some(westend::SudoConfig { key: root_key, }), } @@ -1056,27 +1056,27 @@ pub fn rococo_testnet_genesis( const ENDOWMENT: u128 = 1_000_000 * DOTS; rococo_runtime::GenesisConfig { - system: Some(rococo_runtime::SystemConfig { + frame_system: Some(rococo_runtime::SystemConfig { code: wasm_binary.to_vec(), changes_trie_config: Default::default(), }), - indices: Some(rococo_runtime::IndicesConfig { + pallet_indices: Some(rococo_runtime::IndicesConfig { indices: vec![], }), - balances: Some(rococo_runtime::BalancesConfig { + pallet_balances: Some(rococo_runtime::BalancesConfig { balances: endowed_accounts.iter().map(|k| (k.clone(), ENDOWMENT)).collect(), }), - session: Some(rococo_runtime::SessionConfig { + pallet_session: Some(rococo_runtime::SessionConfig { keys: initial_authorities.iter().map(|x| ( x.0.clone(), x.0.clone(), rococo_session_keys(x.2.clone(), x.3.clone(), x.4.clone(), x.5.clone(), x.6.clone()), )).collect::>(), }), - babe: Some(Default::default()), - grandpa: Some(Default::default()), - im_online: Some(Default::default()), - authority_discovery: Some(rococo_runtime::AuthorityDiscoveryConfig { + pallet_babe: Some(Default::default()), + pallet_grandpa: Some(Default::default()), + pallet_im_online: Some(Default::default()), + pallet_authority_discovery: Some(rococo_runtime::AuthorityDiscoveryConfig { keys: vec![], }), parachains: Some(rococo_runtime::ParachainsConfig { @@ -1086,10 +1086,10 @@ pub fn rococo_testnet_genesis( parachains: vec![], _phdata: Default::default(), }), - vesting: Some(rococo_runtime::VestingConfig { + pallet_vesting: Some(rococo_runtime::VestingConfig { vesting: vec![], }), - sudo: Some(rococo_runtime::SudoConfig { + pallet_sudo: Some(rococo_runtime::SudoConfig { key: root_key, }), } diff --git a/service/src/client.rs b/service/src/client.rs index 786d3b8fba..e7743e8530 100644 --- a/service/src/client.rs +++ b/service/src/client.rs @@ -31,7 +31,7 @@ pub trait RuntimeApiCollection: + grandpa_primitives::GrandpaApi + ParachainHost + sp_block_builder::BlockBuilder - + system_rpc_runtime_api::AccountNonceApi + + frame_system_rpc_runtime_api::AccountNonceApi + pallet_transaction_payment_rpc_runtime_api::TransactionPaymentApi + sp_api::Metadata + sp_offchain::OffchainWorkerApi @@ -50,7 +50,7 @@ where + grandpa_primitives::GrandpaApi + ParachainHost + sp_block_builder::BlockBuilder - + system_rpc_runtime_api::AccountNonceApi + + frame_system_rpc_runtime_api::AccountNonceApi + pallet_transaction_payment_rpc_runtime_api::TransactionPaymentApi + sp_api::Metadata + sp_offchain::OffchainWorkerApi diff --git a/validation/Cargo.toml b/validation/Cargo.toml index 95d4643ada..2c345b0c62 100644 --- a/validation/Cargo.toml +++ b/validation/Cargo.toml @@ -32,7 +32,6 @@ block-builder = { package = "sc-block-builder", git = "https://github.com/parity trie = { package = "sp-trie", git = "https://github.com/paritytech/substrate", branch = "master" } runtime_primitives = { package = "sp-runtime", git = "https://github.com/paritytech/substrate", branch = "master" } bitvec = { version = "0.17.4", default-features = false, features = ["alloc"] } -runtime_babe = { package = "pallet-babe", git = "https://github.com/paritytech/substrate", branch = "master" } babe-primitives = { package = "sp-consensus-babe", git = "https://github.com/paritytech/substrate", branch = "master" } keystore = { package = "sc-keystore", git = "https://github.com/paritytech/substrate", branch = "master" } prometheus-endpoint = { package = "substrate-prometheus-endpoint", git = "https://github.com/paritytech/substrate", branch = "master" } -- GitLab From 4817654f36492cf00c9bf0c22ec096566e825ff0 Mon Sep 17 00:00:00 2001 From: Guillaume Thiolliere Date: Tue, 4 Aug 2020 21:17:23 +0200 Subject: [PATCH 143/192] Companion PR: add weightinfo for democracy (#1522) * add weight for democracy * update companion * update companion * remove democracy weight tests * fix import * fix name * fix merge * cargo update -p sp-io * fix compile Co-authored-by: Shawn Tabrizi --- Cargo.lock | 275 +++++++++--------- runtime/kusama/src/lib.rs | 2 +- runtime/kusama/src/weights/mod.rs | 1 + .../kusama/src/weights/pallet_democracy.rs | 156 ++++++++++ runtime/polkadot/src/lib.rs | 2 +- runtime/polkadot/src/weights/mod.rs | 1 + .../polkadot/src/weights/pallet_democracy.rs | 156 ++++++++++ runtime/polkadot/tests/weights.rs | 35 --- 8 files changed, 453 insertions(+), 175 deletions(-) create mode 100644 runtime/kusama/src/weights/pallet_democracy.rs create mode 100644 runtime/polkadot/src/weights/pallet_democracy.rs diff --git a/Cargo.lock b/Cargo.lock index b3db7a17f4..a840b06689 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1370,7 +1370,7 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "fork-tree" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" +source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" dependencies = [ "parity-scale-codec", ] @@ -1378,7 +1378,7 @@ dependencies = [ [[package]] name = "frame-benchmarking" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" +source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" dependencies = [ "frame-support", "frame-system", @@ -1395,9 +1395,8 @@ dependencies = [ [[package]] name = "frame-benchmarking-cli" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" +source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" dependencies = [ - "Inflector", "frame-benchmarking", "parity-scale-codec", "sc-cli", @@ -1414,7 +1413,7 @@ dependencies = [ [[package]] name = "frame-executive" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" +source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" dependencies = [ "frame-support", "frame-system", @@ -1429,7 +1428,7 @@ dependencies = [ [[package]] name = "frame-metadata" version = "11.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" +source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" dependencies = [ "parity-scale-codec", "serde", @@ -1440,7 +1439,7 @@ dependencies = [ [[package]] name = "frame-support" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" +source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" dependencies = [ "bitmask", "frame-metadata", @@ -1465,7 +1464,7 @@ dependencies = [ [[package]] name = "frame-support-procedural" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" +source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" dependencies = [ "frame-support-procedural-tools", "proc-macro2 1.0.18", @@ -1476,7 +1475,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" +source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" dependencies = [ "frame-support-procedural-tools-derive", "proc-macro-crate", @@ -1488,7 +1487,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools-derive" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" +source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" dependencies = [ "proc-macro2 1.0.18", "quote 1.0.7", @@ -1498,7 +1497,7 @@ dependencies = [ [[package]] name = "frame-system" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" +source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" dependencies = [ "frame-support", "impl-trait-for-tuples", @@ -1514,7 +1513,7 @@ dependencies = [ [[package]] name = "frame-system-benchmarking" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" +source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" dependencies = [ "frame-benchmarking", "frame-support", @@ -1528,7 +1527,7 @@ dependencies = [ [[package]] name = "frame-system-rpc-runtime-api" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" +source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" dependencies = [ "parity-scale-codec", "sp-api", @@ -3542,7 +3541,7 @@ dependencies = [ [[package]] name = "pallet-authority-discovery" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" +source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" dependencies = [ "frame-support", "frame-system", @@ -3558,7 +3557,7 @@ dependencies = [ [[package]] name = "pallet-authorship" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" +source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" dependencies = [ "frame-support", "frame-system", @@ -3573,7 +3572,7 @@ dependencies = [ [[package]] name = "pallet-babe" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" +source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" dependencies = [ "frame-benchmarking", "frame-support", @@ -3598,7 +3597,7 @@ dependencies = [ [[package]] name = "pallet-balances" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" +source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" dependencies = [ "frame-benchmarking", "frame-support", @@ -3612,7 +3611,7 @@ dependencies = [ [[package]] name = "pallet-collective" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" +source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" dependencies = [ "frame-benchmarking", "frame-support", @@ -3628,7 +3627,7 @@ dependencies = [ [[package]] name = "pallet-democracy" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" +source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" dependencies = [ "frame-benchmarking", "frame-support", @@ -3643,7 +3642,7 @@ dependencies = [ [[package]] name = "pallet-elections-phragmen" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" +source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" dependencies = [ "frame-benchmarking", "frame-support", @@ -3658,7 +3657,7 @@ dependencies = [ [[package]] name = "pallet-finality-tracker" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" +source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" dependencies = [ "frame-support", "frame-system", @@ -3674,7 +3673,7 @@ dependencies = [ [[package]] name = "pallet-grandpa" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" +source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" dependencies = [ "frame-benchmarking", "frame-support", @@ -3696,7 +3695,7 @@ dependencies = [ [[package]] name = "pallet-identity" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" +source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" dependencies = [ "enumflags2", "frame-benchmarking", @@ -3712,7 +3711,7 @@ dependencies = [ [[package]] name = "pallet-im-online" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" +source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" dependencies = [ "frame-benchmarking", "frame-support", @@ -3732,7 +3731,7 @@ dependencies = [ [[package]] name = "pallet-indices" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" +source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" dependencies = [ "frame-support", "frame-system", @@ -3748,7 +3747,7 @@ dependencies = [ [[package]] name = "pallet-membership" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" +source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" dependencies = [ "frame-support", "frame-system", @@ -3762,7 +3761,7 @@ dependencies = [ [[package]] name = "pallet-multisig" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" +source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" dependencies = [ "frame-support", "frame-system", @@ -3777,7 +3776,7 @@ dependencies = [ [[package]] name = "pallet-nicks" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" +source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" dependencies = [ "frame-support", "frame-system", @@ -3791,7 +3790,7 @@ dependencies = [ [[package]] name = "pallet-offences" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" +source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" dependencies = [ "frame-support", "frame-system", @@ -3806,7 +3805,7 @@ dependencies = [ [[package]] name = "pallet-offences-benchmarking" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" +source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" dependencies = [ "frame-benchmarking", "frame-support", @@ -3827,7 +3826,7 @@ dependencies = [ [[package]] name = "pallet-proxy" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" +source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" dependencies = [ "frame-support", "frame-system", @@ -3842,7 +3841,7 @@ dependencies = [ [[package]] name = "pallet-randomness-collective-flip" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" +source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" dependencies = [ "frame-support", "frame-system", @@ -3855,7 +3854,7 @@ dependencies = [ [[package]] name = "pallet-recovery" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" +source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" dependencies = [ "enumflags2", "frame-support", @@ -3870,7 +3869,7 @@ dependencies = [ [[package]] name = "pallet-scheduler" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" +source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" dependencies = [ "frame-benchmarking", "frame-support", @@ -3885,7 +3884,7 @@ dependencies = [ [[package]] name = "pallet-session" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" +source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" dependencies = [ "frame-support", "frame-system", @@ -3905,7 +3904,7 @@ dependencies = [ [[package]] name = "pallet-session-benchmarking" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" +source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" dependencies = [ "frame-benchmarking", "frame-support", @@ -3921,7 +3920,7 @@ dependencies = [ [[package]] name = "pallet-society" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" +source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" dependencies = [ "frame-support", "frame-system", @@ -3935,7 +3934,7 @@ dependencies = [ [[package]] name = "pallet-staking" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" +source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" dependencies = [ "frame-benchmarking", "frame-support", @@ -3957,7 +3956,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-curve" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" +source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -3968,7 +3967,7 @@ dependencies = [ [[package]] name = "pallet-sudo" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" +source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" dependencies = [ "frame-support", "frame-system", @@ -3982,7 +3981,7 @@ dependencies = [ [[package]] name = "pallet-timestamp" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" +source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" dependencies = [ "frame-benchmarking", "frame-support", @@ -4000,7 +3999,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" +source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" dependencies = [ "frame-support", "frame-system", @@ -4017,7 +4016,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" +source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" dependencies = [ "jsonrpc-core", "jsonrpc-core-client", @@ -4035,7 +4034,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc-runtime-api" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" +source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" dependencies = [ "frame-support", "parity-scale-codec", @@ -4048,7 +4047,7 @@ dependencies = [ [[package]] name = "pallet-treasury" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" +source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" dependencies = [ "frame-benchmarking", "frame-support", @@ -4063,7 +4062,7 @@ dependencies = [ [[package]] name = "pallet-utility" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" +source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" dependencies = [ "frame-benchmarking", "frame-support", @@ -4079,7 +4078,7 @@ dependencies = [ [[package]] name = "pallet-vesting" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" +source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" dependencies = [ "enumflags2", "frame-benchmarking", @@ -6225,7 +6224,7 @@ dependencies = [ [[package]] name = "sc-authority-discovery" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" +source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" dependencies = [ "bytes 0.5.5", "derive_more 0.99.9", @@ -6252,7 +6251,7 @@ dependencies = [ [[package]] name = "sc-basic-authorship" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" +source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6276,7 +6275,7 @@ dependencies = [ [[package]] name = "sc-block-builder" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" +source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" dependencies = [ "parity-scale-codec", "sc-client-api", @@ -6293,7 +6292,7 @@ dependencies = [ [[package]] name = "sc-chain-spec" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" +source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" dependencies = [ "impl-trait-for-tuples", "sc-chain-spec-derive", @@ -6309,7 +6308,7 @@ dependencies = [ [[package]] name = "sc-chain-spec-derive" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" +source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -6320,7 +6319,7 @@ dependencies = [ [[package]] name = "sc-cli" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" +source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" dependencies = [ "ansi_term 0.12.1", "atty", @@ -6361,7 +6360,7 @@ dependencies = [ [[package]] name = "sc-client-api" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" +source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" dependencies = [ "derive_more 0.99.9", "fnv", @@ -6397,7 +6396,7 @@ dependencies = [ [[package]] name = "sc-client-db" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" +source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" dependencies = [ "blake2-rfc", "hash-db", @@ -6427,7 +6426,7 @@ dependencies = [ [[package]] name = "sc-consensus" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" +source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" dependencies = [ "sc-client-api", "sp-blockchain", @@ -6438,7 +6437,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" +source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" dependencies = [ "derive_more 0.99.9", "fork-tree", @@ -6482,7 +6481,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe-rpc" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" +source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -6506,7 +6505,7 @@ dependencies = [ [[package]] name = "sc-consensus-epochs" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" +source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" dependencies = [ "fork-tree", "parity-scale-codec", @@ -6519,7 +6518,7 @@ dependencies = [ [[package]] name = "sc-consensus-slots" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" +source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6542,7 +6541,7 @@ dependencies = [ [[package]] name = "sc-consensus-uncles" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" +source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" dependencies = [ "log 0.4.8", "sc-client-api", @@ -6556,7 +6555,7 @@ dependencies = [ [[package]] name = "sc-executor" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" +source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" dependencies = [ "derive_more 0.99.9", "lazy_static", @@ -6584,7 +6583,7 @@ dependencies = [ [[package]] name = "sc-executor-common" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" +source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" dependencies = [ "derive_more 0.99.9", "log 0.4.8", @@ -6601,7 +6600,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmi" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" +source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" dependencies = [ "log 0.4.8", "parity-scale-codec", @@ -6616,7 +6615,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmtime" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" +source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" dependencies = [ "cranelift-codegen", "cranelift-wasm", @@ -6637,7 +6636,7 @@ dependencies = [ [[package]] name = "sc-finality-grandpa" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" +source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" dependencies = [ "assert_matches", "derive_more 0.99.9", @@ -6675,7 +6674,7 @@ dependencies = [ [[package]] name = "sc-finality-grandpa-rpc" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" +source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" dependencies = [ "derive_more 0.99.9", "finality-grandpa", @@ -6692,7 +6691,7 @@ dependencies = [ [[package]] name = "sc-informant" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" +source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" dependencies = [ "ansi_term 0.12.1", "futures 0.3.5", @@ -6710,7 +6709,7 @@ dependencies = [ [[package]] name = "sc-keystore" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" +source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" dependencies = [ "derive_more 0.99.9", "hex", @@ -6726,7 +6725,7 @@ dependencies = [ [[package]] name = "sc-light" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" +source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" dependencies = [ "hash-db", "lazy_static", @@ -6745,7 +6744,7 @@ dependencies = [ [[package]] name = "sc-network" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" +source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" dependencies = [ "bitflags", "bs58", @@ -6797,7 +6796,7 @@ dependencies = [ [[package]] name = "sc-network-gossip" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" +source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6812,7 +6811,7 @@ dependencies = [ [[package]] name = "sc-network-test" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" +source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" dependencies = [ "env_logger", "futures 0.3.5", @@ -6839,7 +6838,7 @@ dependencies = [ [[package]] name = "sc-offchain" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" +source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" dependencies = [ "bytes 0.5.5", "fnv", @@ -6866,7 +6865,7 @@ dependencies = [ [[package]] name = "sc-peerset" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" +source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" dependencies = [ "futures 0.3.5", "libp2p", @@ -6879,7 +6878,7 @@ dependencies = [ [[package]] name = "sc-proposer-metrics" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" +source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" dependencies = [ "log 0.4.8", "substrate-prometheus-endpoint", @@ -6888,7 +6887,7 @@ dependencies = [ [[package]] name = "sc-rpc" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" +source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" dependencies = [ "futures 0.3.5", "hash-db", @@ -6920,7 +6919,7 @@ dependencies = [ [[package]] name = "sc-rpc-api" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" +source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -6944,7 +6943,7 @@ dependencies = [ [[package]] name = "sc-rpc-server" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" +source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" dependencies = [ "jsonrpc-core", "jsonrpc-http-server", @@ -6960,7 +6959,7 @@ dependencies = [ [[package]] name = "sc-service" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" +source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" dependencies = [ "derive_more 0.99.9", "directories", @@ -7023,7 +7022,7 @@ dependencies = [ [[package]] name = "sc-state-db" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" +source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" dependencies = [ "log 0.4.8", "parity-scale-codec", @@ -7037,7 +7036,7 @@ dependencies = [ [[package]] name = "sc-telemetry" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" +source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -7058,7 +7057,7 @@ dependencies = [ [[package]] name = "sc-tracing" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" +source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" dependencies = [ "erased-serde", "log 0.4.8", @@ -7075,7 +7074,7 @@ dependencies = [ [[package]] name = "sc-transaction-graph" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" +source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -7096,7 +7095,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" +source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -7551,7 +7550,7 @@ dependencies = [ [[package]] name = "sp-allocator" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" +source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" dependencies = [ "derive_more 0.99.9", "log 0.4.8", @@ -7563,7 +7562,7 @@ dependencies = [ [[package]] name = "sp-api" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" +source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" dependencies = [ "hash-db", "parity-scale-codec", @@ -7578,7 +7577,7 @@ dependencies = [ [[package]] name = "sp-api-proc-macro" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" +source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" dependencies = [ "blake2-rfc", "proc-macro-crate", @@ -7590,7 +7589,7 @@ dependencies = [ [[package]] name = "sp-application-crypto" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" +source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" dependencies = [ "parity-scale-codec", "serde", @@ -7602,7 +7601,7 @@ dependencies = [ [[package]] name = "sp-arithmetic" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" +source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" dependencies = [ "integer-sqrt", "num-traits 0.2.12", @@ -7615,7 +7614,7 @@ dependencies = [ [[package]] name = "sp-authority-discovery" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" +source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" dependencies = [ "parity-scale-codec", "sp-api", @@ -7627,7 +7626,7 @@ dependencies = [ [[package]] name = "sp-authorship" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" +source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" dependencies = [ "parity-scale-codec", "sp-inherents", @@ -7638,7 +7637,7 @@ dependencies = [ [[package]] name = "sp-block-builder" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" +source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" dependencies = [ "parity-scale-codec", "sp-api", @@ -7650,7 +7649,7 @@ dependencies = [ [[package]] name = "sp-blockchain" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" +source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" dependencies = [ "derive_more 0.99.9", "log 0.4.8", @@ -7667,7 +7666,7 @@ dependencies = [ [[package]] name = "sp-chain-spec" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" +source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" dependencies = [ "serde", "serde_json", @@ -7676,7 +7675,7 @@ dependencies = [ [[package]] name = "sp-consensus" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" +source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -7702,7 +7701,7 @@ dependencies = [ [[package]] name = "sp-consensus-aura" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" +source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" dependencies = [ "parity-scale-codec", "sp-api", @@ -7716,7 +7715,7 @@ dependencies = [ [[package]] name = "sp-consensus-babe" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" +source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" dependencies = [ "merlin", "parity-scale-codec", @@ -7735,7 +7734,7 @@ dependencies = [ [[package]] name = "sp-consensus-slots" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" +source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" dependencies = [ "parity-scale-codec", "sp-runtime", @@ -7744,7 +7743,7 @@ dependencies = [ [[package]] name = "sp-consensus-vrf" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" +source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" dependencies = [ "parity-scale-codec", "schnorrkel", @@ -7756,7 +7755,7 @@ dependencies = [ [[package]] name = "sp-core" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" +source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" dependencies = [ "base58", "blake2-rfc", @@ -7800,7 +7799,7 @@ dependencies = [ [[package]] name = "sp-database" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" +source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" dependencies = [ "kvdb", "parking_lot 0.10.2", @@ -7809,7 +7808,7 @@ dependencies = [ [[package]] name = "sp-debug-derive" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" +source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" dependencies = [ "proc-macro2 1.0.18", "quote 1.0.7", @@ -7819,7 +7818,7 @@ dependencies = [ [[package]] name = "sp-externalities" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" +source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" dependencies = [ "environmental", "parity-scale-codec", @@ -7830,7 +7829,7 @@ dependencies = [ [[package]] name = "sp-finality-grandpa" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" +source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" dependencies = [ "finality-grandpa", "log 0.4.8", @@ -7846,7 +7845,7 @@ dependencies = [ [[package]] name = "sp-finality-tracker" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" +source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" dependencies = [ "parity-scale-codec", "sp-inherents", @@ -7856,7 +7855,7 @@ dependencies = [ [[package]] name = "sp-inherents" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" +source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" dependencies = [ "derive_more 0.99.9", "parity-scale-codec", @@ -7868,7 +7867,7 @@ dependencies = [ [[package]] name = "sp-io" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" +source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" dependencies = [ "futures 0.3.5", "hash-db", @@ -7889,7 +7888,7 @@ dependencies = [ [[package]] name = "sp-keyring" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" +source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" dependencies = [ "lazy_static", "sp-core", @@ -7900,7 +7899,7 @@ dependencies = [ [[package]] name = "sp-npos-elections" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" +source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" dependencies = [ "parity-scale-codec", "serde", @@ -7912,7 +7911,7 @@ dependencies = [ [[package]] name = "sp-npos-elections-compact" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" +source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -7923,7 +7922,7 @@ dependencies = [ [[package]] name = "sp-offchain" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" +source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" dependencies = [ "sp-api", "sp-core", @@ -7933,7 +7932,7 @@ dependencies = [ [[package]] name = "sp-panic-handler" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" +source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" dependencies = [ "backtrace", "log 0.4.8", @@ -7942,7 +7941,7 @@ dependencies = [ [[package]] name = "sp-rpc" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" +source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" dependencies = [ "serde", "sp-core", @@ -7951,7 +7950,7 @@ dependencies = [ [[package]] name = "sp-runtime" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" +source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" dependencies = [ "either", "hash256-std-hasher", @@ -7973,7 +7972,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" +source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" dependencies = [ "parity-scale-codec", "primitive-types", @@ -7988,7 +7987,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" +source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" dependencies = [ "Inflector", "proc-macro-crate", @@ -8000,7 +7999,7 @@ dependencies = [ [[package]] name = "sp-serializer" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" +source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" dependencies = [ "serde", "serde_json", @@ -8009,7 +8008,7 @@ dependencies = [ [[package]] name = "sp-session" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" +source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" dependencies = [ "parity-scale-codec", "sp-api", @@ -8022,7 +8021,7 @@ dependencies = [ [[package]] name = "sp-staking" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" +source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" dependencies = [ "parity-scale-codec", "sp-runtime", @@ -8032,7 +8031,7 @@ dependencies = [ [[package]] name = "sp-state-machine" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" +source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" dependencies = [ "hash-db", "itertools 0.9.0", @@ -8053,12 +8052,12 @@ dependencies = [ [[package]] name = "sp-std" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" +source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" [[package]] name = "sp-storage" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" +source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" dependencies = [ "impl-serde 0.2.3", "ref-cast", @@ -8070,7 +8069,7 @@ dependencies = [ [[package]] name = "sp-timestamp" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" +source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -8084,7 +8083,7 @@ dependencies = [ [[package]] name = "sp-tracing" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" +source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" dependencies = [ "log 0.4.8", "rental", @@ -8094,7 +8093,7 @@ dependencies = [ [[package]] name = "sp-transaction-pool" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" +source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -8109,7 +8108,7 @@ dependencies = [ [[package]] name = "sp-trie" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" +source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" dependencies = [ "hash-db", "memory-db", @@ -8123,7 +8122,7 @@ dependencies = [ [[package]] name = "sp-utils" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" +source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" dependencies = [ "futures 0.3.5", "futures-core", @@ -8135,7 +8134,7 @@ dependencies = [ [[package]] name = "sp-version" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" +source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" dependencies = [ "impl-serde 0.2.3", "parity-scale-codec", @@ -8147,7 +8146,7 @@ dependencies = [ [[package]] name = "sp-wasm-interface" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" +source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -8278,7 +8277,7 @@ dependencies = [ [[package]] name = "substrate-browser-utils" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" +source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" dependencies = [ "chrono", "console_error_panic_hook", @@ -8304,7 +8303,7 @@ dependencies = [ [[package]] name = "substrate-build-script-utils" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" +source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" dependencies = [ "platforms", ] @@ -8312,7 +8311,7 @@ dependencies = [ [[package]] name = "substrate-frame-rpc-system" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" +source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" dependencies = [ "frame-system-rpc-runtime-api", "futures 0.3.5", @@ -8335,7 +8334,7 @@ dependencies = [ [[package]] name = "substrate-prometheus-endpoint" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" +source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" dependencies = [ "async-std", "derive_more 0.99.9", @@ -8349,7 +8348,7 @@ dependencies = [ [[package]] name = "substrate-test-client" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" +source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" dependencies = [ "futures 0.1.29", "futures 0.3.5", @@ -8375,7 +8374,7 @@ dependencies = [ [[package]] name = "substrate-test-runtime" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" +source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" dependencies = [ "cfg-if", "frame-executive", @@ -8415,7 +8414,7 @@ dependencies = [ [[package]] name = "substrate-test-runtime-client" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" +source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" dependencies = [ "futures 0.3.5", "parity-scale-codec", @@ -8436,7 +8435,7 @@ dependencies = [ [[package]] name = "substrate-wasm-builder-runner" version = "1.0.6" -source = "git+https://github.com/paritytech/substrate#54e6298523ea896f2129546c26dd7a47dbbeedc9" +source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" [[package]] name = "substrate-wasm-builder-runner" diff --git a/runtime/kusama/src/lib.rs b/runtime/kusama/src/lib.rs index e2f9b03a04..6049a3d573 100644 --- a/runtime/kusama/src/lib.rs +++ b/runtime/kusama/src/lib.rs @@ -404,7 +404,7 @@ impl pallet_democracy::Trait for Runtime { type PalletsOrigin = OriginCaller; type MaxVotes = MaxVotes; type OperationalPreimageOrigin = pallet_collective::EnsureMember; - type WeightInfo = (); + type WeightInfo = weights::pallet_democracy::WeightInfo; } parameter_types! { diff --git a/runtime/kusama/src/weights/mod.rs b/runtime/kusama/src/weights/mod.rs index b94314e339..fb7c53c603 100644 --- a/runtime/kusama/src/weights/mod.rs +++ b/runtime/kusama/src/weights/mod.rs @@ -17,3 +17,4 @@ /// A collection of weight modules used for pallets in the runtime. pub mod pallet_balances; +pub mod pallet_democracy; diff --git a/runtime/kusama/src/weights/pallet_democracy.rs b/runtime/kusama/src/weights/pallet_democracy.rs new file mode 100644 index 0000000000..676281309c --- /dev/null +++ b/runtime/kusama/src/weights/pallet_democracy.rs @@ -0,0 +1,156 @@ +// Copyright 2019-2020 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 . + +//! Weights for the Democracy Pallet +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 2.0.0-rc5 + +use frame_support::weights::{Weight, constants::RocksDbWeight as DbWeight}; + +pub struct WeightInfo; +impl pallet_democracy::WeightInfo for WeightInfo { + fn propose() -> Weight { + (49113000 as Weight) + .saturating_add(DbWeight::get().reads(2 as Weight)) + .saturating_add(DbWeight::get().writes(3 as Weight)) + } + fn second(s: u32, ) -> Weight { + (42067000 as Weight) + .saturating_add((220000 as Weight).saturating_mul(s as Weight)) + .saturating_add(DbWeight::get().reads(1 as Weight)) + .saturating_add(DbWeight::get().writes(1 as Weight)) + } + fn vote_new(r: u32, ) -> Weight { + (54159000 as Weight) + .saturating_add((252000 as Weight).saturating_mul(r as Weight)) + .saturating_add(DbWeight::get().reads(3 as Weight)) + .saturating_add(DbWeight::get().writes(3 as Weight)) + } + fn vote_existing(r: u32, ) -> Weight { + (54145000 as Weight) + .saturating_add((262000 as Weight).saturating_mul(r as Weight)) + .saturating_add(DbWeight::get().reads(3 as Weight)) + .saturating_add(DbWeight::get().writes(3 as Weight)) + } + fn emergency_cancel() -> Weight { + (31071000 as Weight) + .saturating_add(DbWeight::get().reads(2 as Weight)) + .saturating_add(DbWeight::get().writes(2 as Weight)) + } + fn external_propose(v: u32, ) -> Weight { + (14282000 as Weight) + .saturating_add((109000 as Weight).saturating_mul(v as Weight)) + .saturating_add(DbWeight::get().reads(2 as Weight)) + .saturating_add(DbWeight::get().writes(1 as Weight)) + } + fn external_propose_majority() -> Weight { + (3478000 as Weight) + .saturating_add(DbWeight::get().writes(1 as Weight)) + } + fn external_propose_default() -> Weight { + (3442000 as Weight) + .saturating_add(DbWeight::get().writes(1 as Weight)) + } + fn fast_track() -> Weight { + (30820000 as Weight) + .saturating_add(DbWeight::get().reads(2 as Weight)) + .saturating_add(DbWeight::get().writes(3 as Weight)) + } + fn veto_external(v: u32, ) -> Weight { + (30971000 as Weight) + .saturating_add((184000 as Weight).saturating_mul(v as Weight)) + .saturating_add(DbWeight::get().reads(2 as Weight)) + .saturating_add(DbWeight::get().writes(2 as Weight)) + } + fn cancel_referendum() -> Weight { + (20431000 as Weight) + .saturating_add(DbWeight::get().writes(1 as Weight)) + } + fn cancel_queued(r: u32, ) -> Weight { + (42438000 as Weight) + .saturating_add((3284000 as Weight).saturating_mul(r as Weight)) + .saturating_add(DbWeight::get().reads(2 as Weight)) + .saturating_add(DbWeight::get().writes(2 as Weight)) + } + fn on_initialize_base(r: u32, ) -> Weight { + (70826000 as Weight) + .saturating_add((10716000 as Weight).saturating_mul(r as Weight)) + .saturating_add(DbWeight::get().reads(6 as Weight)) + .saturating_add(DbWeight::get().reads((2 as Weight).saturating_mul(r as Weight))) + .saturating_add(DbWeight::get().writes(5 as Weight)) + } + fn delegate(r: u32, ) -> Weight { + (72046000 as Weight) + .saturating_add((7837000 as Weight).saturating_mul(r as Weight)) + .saturating_add(DbWeight::get().reads(4 as Weight)) + .saturating_add(DbWeight::get().reads((1 as Weight).saturating_mul(r as Weight))) + .saturating_add(DbWeight::get().writes(4 as Weight)) + .saturating_add(DbWeight::get().writes((1 as Weight).saturating_mul(r as Weight))) + } + fn undelegate(r: u32, ) -> Weight { + (41028000 as Weight) + .saturating_add((7810000 as Weight).saturating_mul(r as Weight)) + .saturating_add(DbWeight::get().reads(2 as Weight)) + .saturating_add(DbWeight::get().reads((1 as Weight).saturating_mul(r as Weight))) + .saturating_add(DbWeight::get().writes(2 as Weight)) + .saturating_add(DbWeight::get().writes((1 as Weight).saturating_mul(r as Weight))) + } + fn clear_public_proposals() -> Weight { + (3643000 as Weight) + .saturating_add(DbWeight::get().writes(1 as Weight)) + } + fn note_preimage(b: u32, ) -> Weight { + (46629000 as Weight) + .saturating_add((4000 as Weight).saturating_mul(b as Weight)) + .saturating_add(DbWeight::get().reads(1 as Weight)) + .saturating_add(DbWeight::get().writes(1 as Weight)) + } + fn note_imminent_preimage(b: u32, ) -> Weight { + (31147000 as Weight) + .saturating_add((3000 as Weight).saturating_mul(b as Weight)) + .saturating_add(DbWeight::get().reads(1 as Weight)) + .saturating_add(DbWeight::get().writes(1 as Weight)) + } + fn reap_preimage(b: u32, ) -> Weight { + (42848000 as Weight) + .saturating_add((3000 as Weight).saturating_mul(b as Weight)) + .saturating_add(DbWeight::get().reads(2 as Weight)) + .saturating_add(DbWeight::get().writes(1 as Weight)) + } + fn unlock_remove(r: u32, ) -> Weight { + (45333000 as Weight) + .saturating_add((171000 as Weight).saturating_mul(r as Weight)) + .saturating_add(DbWeight::get().reads(3 as Weight)) + .saturating_add(DbWeight::get().writes(3 as Weight)) + } + fn unlock_set(r: u32, ) -> Weight { + (44424000 as Weight) + .saturating_add((291000 as Weight).saturating_mul(r as Weight)) + .saturating_add(DbWeight::get().reads(3 as Weight)) + .saturating_add(DbWeight::get().writes(3 as Weight)) + } + fn remove_vote(r: u32, ) -> Weight { + (28250000 as Weight) + .saturating_add((283000 as Weight).saturating_mul(r as Weight)) + .saturating_add(DbWeight::get().reads(2 as Weight)) + .saturating_add(DbWeight::get().writes(2 as Weight)) + } + fn remove_other_vote(r: u32, ) -> Weight { + (28250000 as Weight) + .saturating_add((283000 as Weight).saturating_mul(r as Weight)) + .saturating_add(DbWeight::get().reads(2 as Weight)) + .saturating_add(DbWeight::get().writes(2 as Weight)) + } +} diff --git a/runtime/polkadot/src/lib.rs b/runtime/polkadot/src/lib.rs index 77b53f2563..effa529458 100644 --- a/runtime/polkadot/src/lib.rs +++ b/runtime/polkadot/src/lib.rs @@ -458,7 +458,7 @@ impl pallet_democracy::Trait for Runtime { type Scheduler = Scheduler; type PalletsOrigin = OriginCaller; type MaxVotes = MaxVotes; - type WeightInfo = (); + type WeightInfo = weights::pallet_democracy::WeightInfo; } parameter_types! { diff --git a/runtime/polkadot/src/weights/mod.rs b/runtime/polkadot/src/weights/mod.rs index b94314e339..fb7c53c603 100644 --- a/runtime/polkadot/src/weights/mod.rs +++ b/runtime/polkadot/src/weights/mod.rs @@ -17,3 +17,4 @@ /// A collection of weight modules used for pallets in the runtime. pub mod pallet_balances; +pub mod pallet_democracy; diff --git a/runtime/polkadot/src/weights/pallet_democracy.rs b/runtime/polkadot/src/weights/pallet_democracy.rs new file mode 100644 index 0000000000..676281309c --- /dev/null +++ b/runtime/polkadot/src/weights/pallet_democracy.rs @@ -0,0 +1,156 @@ +// Copyright 2019-2020 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 . + +//! Weights for the Democracy Pallet +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 2.0.0-rc5 + +use frame_support::weights::{Weight, constants::RocksDbWeight as DbWeight}; + +pub struct WeightInfo; +impl pallet_democracy::WeightInfo for WeightInfo { + fn propose() -> Weight { + (49113000 as Weight) + .saturating_add(DbWeight::get().reads(2 as Weight)) + .saturating_add(DbWeight::get().writes(3 as Weight)) + } + fn second(s: u32, ) -> Weight { + (42067000 as Weight) + .saturating_add((220000 as Weight).saturating_mul(s as Weight)) + .saturating_add(DbWeight::get().reads(1 as Weight)) + .saturating_add(DbWeight::get().writes(1 as Weight)) + } + fn vote_new(r: u32, ) -> Weight { + (54159000 as Weight) + .saturating_add((252000 as Weight).saturating_mul(r as Weight)) + .saturating_add(DbWeight::get().reads(3 as Weight)) + .saturating_add(DbWeight::get().writes(3 as Weight)) + } + fn vote_existing(r: u32, ) -> Weight { + (54145000 as Weight) + .saturating_add((262000 as Weight).saturating_mul(r as Weight)) + .saturating_add(DbWeight::get().reads(3 as Weight)) + .saturating_add(DbWeight::get().writes(3 as Weight)) + } + fn emergency_cancel() -> Weight { + (31071000 as Weight) + .saturating_add(DbWeight::get().reads(2 as Weight)) + .saturating_add(DbWeight::get().writes(2 as Weight)) + } + fn external_propose(v: u32, ) -> Weight { + (14282000 as Weight) + .saturating_add((109000 as Weight).saturating_mul(v as Weight)) + .saturating_add(DbWeight::get().reads(2 as Weight)) + .saturating_add(DbWeight::get().writes(1 as Weight)) + } + fn external_propose_majority() -> Weight { + (3478000 as Weight) + .saturating_add(DbWeight::get().writes(1 as Weight)) + } + fn external_propose_default() -> Weight { + (3442000 as Weight) + .saturating_add(DbWeight::get().writes(1 as Weight)) + } + fn fast_track() -> Weight { + (30820000 as Weight) + .saturating_add(DbWeight::get().reads(2 as Weight)) + .saturating_add(DbWeight::get().writes(3 as Weight)) + } + fn veto_external(v: u32, ) -> Weight { + (30971000 as Weight) + .saturating_add((184000 as Weight).saturating_mul(v as Weight)) + .saturating_add(DbWeight::get().reads(2 as Weight)) + .saturating_add(DbWeight::get().writes(2 as Weight)) + } + fn cancel_referendum() -> Weight { + (20431000 as Weight) + .saturating_add(DbWeight::get().writes(1 as Weight)) + } + fn cancel_queued(r: u32, ) -> Weight { + (42438000 as Weight) + .saturating_add((3284000 as Weight).saturating_mul(r as Weight)) + .saturating_add(DbWeight::get().reads(2 as Weight)) + .saturating_add(DbWeight::get().writes(2 as Weight)) + } + fn on_initialize_base(r: u32, ) -> Weight { + (70826000 as Weight) + .saturating_add((10716000 as Weight).saturating_mul(r as Weight)) + .saturating_add(DbWeight::get().reads(6 as Weight)) + .saturating_add(DbWeight::get().reads((2 as Weight).saturating_mul(r as Weight))) + .saturating_add(DbWeight::get().writes(5 as Weight)) + } + fn delegate(r: u32, ) -> Weight { + (72046000 as Weight) + .saturating_add((7837000 as Weight).saturating_mul(r as Weight)) + .saturating_add(DbWeight::get().reads(4 as Weight)) + .saturating_add(DbWeight::get().reads((1 as Weight).saturating_mul(r as Weight))) + .saturating_add(DbWeight::get().writes(4 as Weight)) + .saturating_add(DbWeight::get().writes((1 as Weight).saturating_mul(r as Weight))) + } + fn undelegate(r: u32, ) -> Weight { + (41028000 as Weight) + .saturating_add((7810000 as Weight).saturating_mul(r as Weight)) + .saturating_add(DbWeight::get().reads(2 as Weight)) + .saturating_add(DbWeight::get().reads((1 as Weight).saturating_mul(r as Weight))) + .saturating_add(DbWeight::get().writes(2 as Weight)) + .saturating_add(DbWeight::get().writes((1 as Weight).saturating_mul(r as Weight))) + } + fn clear_public_proposals() -> Weight { + (3643000 as Weight) + .saturating_add(DbWeight::get().writes(1 as Weight)) + } + fn note_preimage(b: u32, ) -> Weight { + (46629000 as Weight) + .saturating_add((4000 as Weight).saturating_mul(b as Weight)) + .saturating_add(DbWeight::get().reads(1 as Weight)) + .saturating_add(DbWeight::get().writes(1 as Weight)) + } + fn note_imminent_preimage(b: u32, ) -> Weight { + (31147000 as Weight) + .saturating_add((3000 as Weight).saturating_mul(b as Weight)) + .saturating_add(DbWeight::get().reads(1 as Weight)) + .saturating_add(DbWeight::get().writes(1 as Weight)) + } + fn reap_preimage(b: u32, ) -> Weight { + (42848000 as Weight) + .saturating_add((3000 as Weight).saturating_mul(b as Weight)) + .saturating_add(DbWeight::get().reads(2 as Weight)) + .saturating_add(DbWeight::get().writes(1 as Weight)) + } + fn unlock_remove(r: u32, ) -> Weight { + (45333000 as Weight) + .saturating_add((171000 as Weight).saturating_mul(r as Weight)) + .saturating_add(DbWeight::get().reads(3 as Weight)) + .saturating_add(DbWeight::get().writes(3 as Weight)) + } + fn unlock_set(r: u32, ) -> Weight { + (44424000 as Weight) + .saturating_add((291000 as Weight).saturating_mul(r as Weight)) + .saturating_add(DbWeight::get().reads(3 as Weight)) + .saturating_add(DbWeight::get().writes(3 as Weight)) + } + fn remove_vote(r: u32, ) -> Weight { + (28250000 as Weight) + .saturating_add((283000 as Weight).saturating_mul(r as Weight)) + .saturating_add(DbWeight::get().reads(2 as Weight)) + .saturating_add(DbWeight::get().writes(2 as Weight)) + } + fn remove_other_vote(r: u32, ) -> Weight { + (28250000 as Weight) + .saturating_add((283000 as Weight).saturating_mul(r as Weight)) + .saturating_add(DbWeight::get().reads(2 as Weight)) + .saturating_add(DbWeight::get().writes(2 as Weight)) + } +} diff --git a/runtime/polkadot/tests/weights.rs b/runtime/polkadot/tests/weights.rs index 51b9258341..5cbdaf82ab 100644 --- a/runtime/polkadot/tests/weights.rs +++ b/runtime/polkadot/tests/weights.rs @@ -32,7 +32,6 @@ use polkadot_runtime::{self, Runtime}; use primitives::v0::AccountId; use runtime_common::MaximumBlockWeight; -use pallet_democracy::Call as DemocracyCall; use pallet_elections_phragmen::Call as PhragmenCall; use pallet_session::Call as SessionCall; use pallet_staking::Call as StakingCall; @@ -159,40 +158,6 @@ fn weight_of_session_purge_keys_is_correct() { assert_eq!(weight, expected_weight); } -#[test] -fn weight_of_democracy_propose_is_correct() { - // #[weight = 50_000_000 + T::DbWeight::get().reads_writes(2, 3)] - let expected_weight = 50_000_000 + (DbWeight::get().read * 2) + (DbWeight::get().write * 3); - let weight = DemocracyCall::propose::(Default::default(), Default::default()).get_dispatch_info().weight; - - assert_eq!(weight, expected_weight); -} - -#[test] -fn weight_of_democracy_vote_is_correct() { - use pallet_democracy::AccountVote; - let vote = AccountVote::Standard { vote: Default::default(), balance: Default::default() }; - - // #[weight = 50_000_000 + 350_000 * Weight::from(T::MaxVotes::get()) + T::DbWeight::get().reads_writes(3, 3)] - let expected_weight = 50_000_000 - + 350_000 * (Weight::from(polkadot_runtime::MaxVotes::get())) - + (DbWeight::get().read * 3) - + (DbWeight::get().write * 3); - let weight = DemocracyCall::vote::(Default::default(), vote).get_dispatch_info().weight; - - assert_eq!(weight, expected_weight); -} - -#[test] -fn weight_of_democracy_enact_proposal_is_correct() { - // #[weight = T::MaximumBlockWeight::get()] - let expected_weight = MaximumBlockWeight::get(); - let weight = - DemocracyCall::enact_proposal::(Default::default(), Default::default()).get_dispatch_info().weight; - - assert_eq!(weight, expected_weight); -} - #[test] fn weight_of_phragmen_vote_is_correct() { // #[weight = 100_000_000] -- GitLab From 8e75ca3b0fb46af0ce612458147a8a37e7ba4f0a Mon Sep 17 00:00:00 2001 From: ddorgan Date: Wed, 5 Aug 2020 10:55:18 +0200 Subject: [PATCH 144/192] Use DNS hostnames for westend bootnodes (#1528) --- service/res/westend.json | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/service/res/westend.json b/service/res/westend.json index 5aebe04d23..2f4c53ee84 100644 --- a/service/res/westend.json +++ b/service/res/westend.json @@ -2,14 +2,14 @@ "name": "Westend", "id": "westend2", "bootNodes": [ - "/ip4/104.155.79.90/tcp/30333/p2p/QmZ4HcUygvbrPaABU9MfjqFsSPUKwmH6LyXBFYX2xSXGo2", - "/ip4/104.155.79.90/tcp/30334/ws/p2p/QmZ4HcUygvbrPaABU9MfjqFsSPUKwmH6LyXBFYX2xSXGo2", - "/ip4/35.205.142.129/tcp/30333/p2p/QmaynNd1C321UowxH8a8MVBe6R8FUYQmaU6Sm4wnvdTyuq", - "/ip4/35.205.142.129/tcp/30334/ws/p2p/QmaynNd1C321UowxH8a8MVBe6R8FUYQmaU6Sm4wnvdTyuq", - "/ip4/34.73.55.183/tcp/30333/p2p/QmPDkHPQtjVQzhVUwhg1hKyV3U2rmF46aUN4pDUXopZd9j", - "/ip4/34.73.55.183/tcp/30334/ws/p2p/QmPDkHPQtjVQzhVUwhg1hKyV3U2rmF46aUN4pDUXopZd9j", - "/ip4/35.243.227.147/tcp/30333/p2p/QmfZHq4crnQyJky6vLgUECCVmLiCM1VuiGUpdw44FvLEr5", - "/ip4/35.243.227.147/tcp/30334/ws/p2p/QmfZHq4crnQyJky6vLgUECCVmLiCM1VuiGUpdw44FvLEr5" + "/dns/0.westend.paritytech.net/tcp/30333/p2p/12D3KooWKer94o1REDPtAhjtYR4SdLehnSrN8PEhBnZm5NBoCrMC", + "/dns/0.westend.paritytech.net/tcp/30334/ws/p2p/12D3KooWKer94o1REDPtAhjtYR4SdLehnSrN8PEhBnZm5NBoCrMC", + "/dns/1.westend.paritytech.net/tcp/30333/p2p/12D3KooWPVPzs42GvRBShdUMtFsk4SvnByrSdWqb6aeAAHvLMSLS", + "/dns/1.westend.paritytech.net/tcp/30334/ws/p2p/12D3KooWPVPzs42GvRBShdUMtFsk4SvnByrSdWqb6aeAAHvLMSLS", + "/dns/2.westend.paritytech.net/tcp/30333/p2p/12D3KooWByVpK92hMi9CzTjyFg9cPHDU5ariTM3EPMq9vdh5S5Po", + "/dns/2.westend.paritytech.net/tcp/30334/ws/p2p/12D3KooWByVpK92hMi9CzTjyFg9cPHDU5ariTM3EPMq9vdh5S5Po", + "/dns/3.westend.paritytech.net/tcp/30333/p2p/12D3KooWGi1tCpKXLMYED9y28QXLnwgD4neYb1Arqq4QpeV1Sv3K", + "/dns/3.westend.paritytech.net/tcp/30334/ws/p2p/12D3KooWGi1tCpKXLMYED9y28QXLnwgD4neYb1Arqq4QpeV1Sv3K" ], "telemetryEndpoints": [ [ -- GitLab From 125efa9996048dbe7e3197281fa4eeaaf539130e Mon Sep 17 00:00:00 2001 From: Robert Habermeier Date: Wed, 5 Aug 2020 11:04:05 +0200 Subject: [PATCH 145/192] Network Bridge Refactoring (#1535) * rename protocol ID to network capability * guide: `ProtocolId` -> `NetworkCapability` * guide: remove `RegisterEventProducer` * capabilities and expand on underlying network assumptions * guide: create network.md types file * guide: network bridge is aware of network messages * revert changes in code * Update roadmap/implementers-guide/src/SUMMARY.md Co-authored-by: Pierre Krieger * remove references to NetworkCapability * Update roadmap/implementers-guide/src/types/network.md Co-authored-by: Sergei Shulepov Co-authored-by: Pierre Krieger Co-authored-by: Sergei Shulepov --- roadmap/implementers-guide/src/SUMMARY.md | 1 + .../availability/availability-distribution.md | 9 +- .../availability/bitfield-distribution.md | 7 +- .../src/node/backing/pov-distribution.md | 18 +-- .../node/backing/statement-distribution.md | 7 +- .../src/node/collators/collator-protocol.md | 16 +-- .../src/node/utility/network-bridge.md | 109 ++++++++++++---- .../implementers-guide/src/types/network.md | 119 ++++++++++++++++++ .../src/types/overseer-protocol.md | 55 ++++---- 9 files changed, 244 insertions(+), 97 deletions(-) create mode 100644 roadmap/implementers-guide/src/types/network.md diff --git a/roadmap/implementers-guide/src/SUMMARY.md b/roadmap/implementers-guide/src/SUMMARY.md index 63280e5142..59df20db21 100644 --- a/roadmap/implementers-guide/src/SUMMARY.md +++ b/roadmap/implementers-guide/src/SUMMARY.md @@ -48,6 +48,7 @@ - [Runtime](types/runtime.md) - [Chain](types/chain.md) - [Messages](types/messages.md) + - [Network](types/network.md) [Glossary](glossary.md) [Further Reading](further-reading.md) diff --git a/roadmap/implementers-guide/src/node/availability/availability-distribution.md b/roadmap/implementers-guide/src/node/availability/availability-distribution.md index 3c530bde84..e34250782a 100644 --- a/roadmap/implementers-guide/src/node/availability/availability-distribution.md +++ b/roadmap/implementers-guide/src/node/availability/availability-distribution.md @@ -6,24 +6,21 @@ After a candidate is backed, the availability of the PoV block must be confirmed ## Protocol -`ProtocolId`:`b"avad"`: `PeerSet`: `Validation` +`PeerSet`: `Validation` Input: -- NetworkBridgeUpdate(update) +- NetworkBridgeUpdateV1(update) Output: -- NetworkBridge::RegisterEventProducer(`ProtocolId`) -- NetworkBridge::SendMessage(`[PeerId]`, `ProtocolId`, `Bytes`) +- NetworkBridge::SendValidationMessage(`[PeerId]`, message) - NetworkBridge::ReportPeer(PeerId, cost_or_benefit) - AvailabilityStore::QueryPoV(candidate_hash, response_channel) - AvailabilityStore::StoreChunk(candidate_hash, chunk_index, inclusion_proof, chunk_data) ## Functionality -Register on startup an event producer with `NetworkBridge::RegisterEventProducer`. - For each relay-parent in our local view update, look at all backed candidates pending availability. Distribute via gossip all erasure chunks for all candidates that we have to peers. We define an operation `live_candidates(relay_heads) -> Set` which returns a set of [`CommittedCandidateReceipt`s](../../types/candidate.md#committed-candidate-receipt) a given set of relay chain heads that implies a set of candidates whose availability chunks should be currently gossiped. This is defined as all candidates pending availability in any of those relay-chain heads or any of their last `K` ancestors. We assume that state is not pruned within `K` blocks of the chain-head. diff --git a/roadmap/implementers-guide/src/node/availability/bitfield-distribution.md b/roadmap/implementers-guide/src/node/availability/bitfield-distribution.md index faf1985c92..53bd8a1bce 100644 --- a/roadmap/implementers-guide/src/node/availability/bitfield-distribution.md +++ b/roadmap/implementers-guide/src/node/availability/bitfield-distribution.md @@ -4,22 +4,21 @@ Validators vote on the availability of a backed candidate by issuing signed bitf ## Protocol -`ProtocolId`: `b"bitd"`: `PeerSet`: `Validation` +`PeerSet`: `Validation` Input: [`BitfieldDistributionMessage`](../../types/overseer-protocol.md#bitfield-distribution-message) which are gossiped to all peers, no matter if validator or not. Output: -- `NetworkBridge::RegisterEventProducer(ProtocolId)` in order to register ourself as an event provider for the protocol. -- `NetworkBridge::SendMessage([PeerId], ProtocolId, Bytes)` gossip a verified incoming bitfield on to interested subsystems within this validator node. +- `NetworkBridge::SendValidationMessage([PeerId], message)` gossip a verified incoming bitfield on to interested subsystems within this validator node. - `NetworkBridge::ReportPeer(PeerId, cost_or_benefit)` improve or penalize the reputation of peers based on the messages that are received relative to the current view. - `ProvisionerMessage::ProvisionableData(ProvisionableData::Bitfield(relay_parent, SignedAvailabilityBitfield))` pass on the bitfield to the other submodules via the overseer. ## Functionality -This is implemented as a gossip system. Register a [network bridge](../utility/network-bridge.md) event producer on startup. +This is implemented as a gossip system. It is necessary to track peer connection, view change, and disconnection events, in order to maintain an index of which peers are interested in which relay parent bitfields. diff --git a/roadmap/implementers-guide/src/node/backing/pov-distribution.md b/roadmap/implementers-guide/src/node/backing/pov-distribution.md index 486ba96fcc..9b32abbd56 100644 --- a/roadmap/implementers-guide/src/node/backing/pov-distribution.md +++ b/roadmap/implementers-guide/src/node/backing/pov-distribution.md @@ -4,15 +4,14 @@ This subsystem is responsible for distributing PoV blocks. For now, unified with ## Protocol -`ProtocolId`: `b"povd"`, `PeerSet`: `Validation` +`PeerSet`: `Validation` Input: [`PoVDistributionMessage`](../../types/overseer-protocol.md#pov-distribution-message) Output: -- NetworkBridge::RegisterEventProducer(`ProtocolId`) -- NetworkBridge::SendMessage(`[PeerId]`, `ProtocolId`, `Bytes`) +- NetworkBridge::SendMessage(`[PeerId]`, message) - NetworkBridge::ReportPeer(PeerId, cost_or_benefit) @@ -56,18 +55,7 @@ struct PeerState { } ``` -We also assume the following network messages, which are sent and received by the [Network Bridge](../utility/network-bridge.md) - -```rust -enum NetworkMessage { - /// Notification that we are awaiting the given PoVs (by hash) against a - /// specific relay-parent hash. - Awaiting(Hash, Vec), - /// Notification of an awaited PoV, in a given relay-parent context. - /// (relay_parent, pov_hash, pov) - SendPoV(Hash, Hash, PoV), -} -``` +We also use the [`PoVDistributionV1Message`](../../types/network.md#pov-distribution) as our `NetworkMessage`, which are sent and received by the [Network Bridge](../utility/network-bridge.md) Here is the logic of the state machine: diff --git a/roadmap/implementers-guide/src/node/backing/statement-distribution.md b/roadmap/implementers-guide/src/node/backing/statement-distribution.md index b9a8914a99..f5258b4155 100644 --- a/roadmap/implementers-guide/src/node/backing/statement-distribution.md +++ b/roadmap/implementers-guide/src/node/backing/statement-distribution.md @@ -4,7 +4,7 @@ The Statement Distribution Subsystem is responsible for distributing statements ## Protocol -`ProtocolId`: `b"stmd"`, `PeerSet`: `Validation` +`PeerSet`: `Validation` Input: @@ -12,13 +12,12 @@ Input: Output: -- NetworkBridge::RegisterEventProducer(`ProtocolId`) -- NetworkBridge::SendMessage(`[PeerId]`, `ProtocolId`, `Bytes`) +- NetworkBridge::SendMessage(`[PeerId]`, message) - NetworkBridge::ReportPeer(PeerId, cost_or_benefit) ## Functionality -Implemented as a gossip protocol. Register a network event producer on startup. Handle updates to our view and peers' views. Neighbor packets are used to inform peers which chain heads we are interested in data for. +Implemented as a gossip protocol. Handle updates to our view and peers' views. Neighbor packets are used to inform peers which chain heads we are interested in data for. Statement Distribution is the only backing subsystem which has any notion of peer nodes, who are any full nodes on the network. Validators will also act as peer nodes. diff --git a/roadmap/implementers-guide/src/node/collators/collator-protocol.md b/roadmap/implementers-guide/src/node/collators/collator-protocol.md index 526aab31ae..8863c3e23d 100644 --- a/roadmap/implementers-guide/src/node/collators/collator-protocol.md +++ b/roadmap/implementers-guide/src/node/collators/collator-protocol.md @@ -24,21 +24,7 @@ Output: This network protocol uses the `Collation` peer-set of the [`NetworkBridge`][NB]. -```rust -type RequestId = u64; - -enum WireMessage { - /// Declare the intent to advertise collations under a collator ID. - Declare(CollatorId), - /// Advertise a collation to a validator. Can only be sent once the peer has declared - /// that they are a collator with given ID. - AdvertiseCollation(Hash, ParaId), - /// Request the advertised collation at that relay-parent. - RequestCollation(RequestId, Hash, ParaId), - /// A requested collation. - Collation(RequestId, CandidateReceipt, PoV), -} -``` +It uses the [`CollatorProtocolV1Message`](../../types/network.md#collator-protocol) as its `WireMessage` Since this protocol functions both for validators and collators, it is easiest to go through the protocol actions for each of them separately. diff --git a/roadmap/implementers-guide/src/node/utility/network-bridge.md b/roadmap/implementers-guide/src/node/utility/network-bridge.md index bd4a6a3d75..ef04090629 100644 --- a/roadmap/implementers-guide/src/node/utility/network-bridge.md +++ b/roadmap/implementers-guide/src/node/utility/network-bridge.md @@ -6,55 +6,118 @@ The most notable challenge is coordinating and eliminating race conditions of pe One other piece of shared state to track is peer reputation. When peers are found to have provided value or cost, we adjust their reputation accordingly. -So in short, this Subsystem acts as a bridge between an actual network component and a subsystem's protocol. +So in short, this Subsystem acts as a bridge between an actual network component and a subsystem's protocol. The implementation of the underlying network component is beyond the scope of this module. We make certain assumptions about the network component: + * The network allows registering of protocols and multiple versions of each protocol. + * The network handles version negotiation of protocols with peers and only connects the peer on the highest version of the protocol. + * Each protocol has its own peer-set, although there may be some overlap. + * The network provides peer-set management utilities for discovering the peer-IDs of validators and a means of dialing peers with given IDs. -The other component of the network bridge is which peer-set to use. Different peer-sets can be connected for different purposes. The network bridge is not generic over peer-set, but instead exposes two peer-sets that event producers can attach to: `Validation` and `Collation`. More information can be found on the documentation of the [`NetworkBridgeMessage`][NBM]. + +The network bridge makes use of the peer-set feature, but is not generic over peer-set. Instead, it exposes two peer-sets that event producers can attach to: `Validation` and `Collation`. More information can be found on the documentation of the [`NetworkBridgeMessage`][NBM]. ## Protocol Input: [`NetworkBridgeMessage`][NBM] -Output: Varying, based on registered event producers. + + +Output: + - [`AvailabilityDistributionMessage`][AvD]`::NetworkBridgeUpdateV1` + - [`BitfieldDistributionMessage`][BitD]`::NetworkBridgeUpdateV1` + - [`PoVDistributionMessage`][PoVD]`::NetworkBridgeUpdateV1` + - [`StatementDistributionMessage`][StmtD]`::NetworkBridgeUpdateV1` + - [`CollatorProtocolMessage`][CollP]`::NetworkBridgeUpdateV1` ## Functionality -Track a set of all Event Producers, each associated with a 4-byte protocol ID and the `PeerSet` it is associated on. +This network bridge sends messages of these types over the network. + +```rust +enum ProtocolMessage { + ProtocolMessage(M), + ViewUpdate(View), +} +``` + +and instantiates this type twice, once using the [`ValidationProtocolV1`][VP1] message type, and once with the [`CollationProtocolV1`][CP1] message type. + +```rust +type ValidationV1Message = ProtocolMessage; +type CollationV1Message = ProtocolMessage; +``` + +### Startup + +On startup, we register two protocols with the underlying network utility. One for validation and one for collation. We register only version 1 of each of these protocols. + +### Main Loop + +The bulk of the work done by this subsystem is in responding to network events, signals from the overseer, and messages from other subsystems. + +Each network event is associated with a particular peer-set. -There are two types of network messages this sends and receives: +### Overseer Signal: ActiveLeavesUpdate -- ProtocolMessage(ProtocolId, Bytes) -- ViewUpdate(View) +The `activated` and `deactivated` lists determine the evolution of our local view over time. A `ProtocolMessage::ViewUpdate` is issued to each connected peer on each peer-set, and a `NetworkBridgeEvent::OurViewChange` is issued to each event handler for each protocol. -Each of these network messages is associated with a particular peer-set. If we are connected to the same peer on both peer-sets, we will receive two `ViewUpdate`s from them every time they change their view. +If we are connected to the same peer on both peer-sets, we will send the peer two view updates as a result. -`ActiveLeavesUpdate`'s `activated` and `deactivated` lists determine the evolution of our local view over time. A `ViewUpdate` is issued to each connected peer after each update, and a `NetworkBridgeUpdate::OurViewChange` is issued for each registered event producer. +### Network Event: Peer Connected -On `RegisterEventProducer`: +Issue a `NetworkBridgeEvent::PeerConnected` for each [Event Handler](#event-handlers) of the peer-set and negotiated protocol version of the peer. -- Add the event producer to the set of event producers. If there is a competing entry, ignore the request. +### Network Event: Peer Disconnected -On `ProtocolMessage` arrival: +Issue a `NetworkBridgeEvent::PeerDisconnected` for each [Event Handler](#event-handlers) of the peer-set and negotiated protocol version of the peer. -- If the protocol ID matches an event producer, produce the message from the `NetworkBridgeEvent::PeerMessage(sender, bytes)`, otherwise ignore and reduce peer reputation slightly -- dispatch message via overseer. +### Network Event: ProtocolMessage -On `ViewUpdate` arrival: +Map the message onto the corresponding [Event Handler](#event-handlers) based on the peer-set this message was received on and dispatch via overseer. -- Do validity checks and note the most recent view update of the peer. -- For each event producer, dispatch the result of a `NetworkBridgeEvent::PeerViewChange(view)` via overseer. +### Network Event: ViewUpdate -On `ReportPeer` message: +- Check that the new view is valid and note it as the most recent view update of the peer on this peer-set. +- Map a `NetworkBridgeEvent::PeerViewChange` onto the corresponding [Event Handler](#event-handlers) based on the peer-set this message was received on and dispatch via overseer. + +### ReportPeer - Adjust peer reputation according to cost or benefit provided -On `SendMessage` message: +### SendValidationMessage -- Issue a corresponding `ProtocolMessage` to each listed peer with given protocol ID and bytes. +- Issue a corresponding `ProtocolMessage` to each listed peer on the validation peer-set. -[NBM]: ../../types/overseer-protocol.md#network-bridge-message +### SendCollationMessage + +- Issue a corresponding `ProtocolMessage` to each listed peer on the collation peer-set. -On `ConnectToValidators` message: +### ConnectToValidators - Determine the DHT keys to use for each validator based on the relay-chain state and Runtime API. - Recover the Peer IDs of the validators from the DHT. There may be more than one peer ID per validator. - Accumulate all `(ValidatorId, PeerId)` pairs and send on the response channel. -- Feed all Peer IDs to the discovery utility the underlying network provides. +- Feed all Peer IDs to peer set manager the underlying network provides, indicating the expected peer-set. + +## Event Handlers + +Network bridge event handlers are the intended recipients of particular network protocol messages. These are each a variant of a message to be sent via the overseer. + +### Validation V1 + +* `StatementDistributionV1Message -> StatementDistributionMessage::NetworkBridgeUpdateV1` +* `PoVDistributionV1Message -> PoVDistributionMessage::NetworkBridgeUpdateV1` +* `AvailabilityDistributionV1Message -> AvailabilityDistributionMessage::NetworkBridgeUpdateV1` +* `BitfieldDistributionV1Message -> BitfieldDistributionMessage::NetworkBridgeUpdateV1` + +### Collation V1 + +* `CollatorProtocolV1Message -> CollatorProtocolMessage::NetworkBridgeUpdateV1` + +[NBM]: ../../types/overseer-protocol.md#network-bridge-message +[AvD]: ../../types/overseer-protocol.md#availability-distribution-message +[BitD]: ../../types/overseer-protocol.md#bitfield-distribution-message +[PoVD]: ../../types/overseer-protocol.md#pov-distribution-message +[StmtD]: ../../types/overseer-protocol.md#statement-distribution-message +[CollP]: ../../types/overseer-protocol.md#collator-protocol-message + +[VP1]: ../../types/network.md#validation-v1 +[CP1]: ../../types/network.md#collation-v1 diff --git a/roadmap/implementers-guide/src/types/network.md b/roadmap/implementers-guide/src/types/network.md new file mode 100644 index 0000000000..75f251613f --- /dev/null +++ b/roadmap/implementers-guide/src/types/network.md @@ -0,0 +1,119 @@ +# Network Types + +These types are those that are actually sent over the network to subsystems. + +## Universal Types + +```rust +type RequestId = u64; +type ProtocolVersion = u32; +struct PeerId(...); // opaque, unique identifier of a peer. +struct View(Vec); // Up to `N` (5?) chain heads. + +enum ObservedRole { + Full, + Light, +} +``` + +## V1 Network Subsystem Message Types + +### Availability Distribution V1 + +```rust +enum AvailabilityDistributionV1Message { + /// An erasure chunk for a given candidate hash. + Chunk(Hash, ErasureChunk), +} +``` + +### Bitfield Distribution V1 + +```rust +enum BitfieldDistributionV1Message { + /// A signed availability bitfield for a given relay-parent hash. + Bitfield(Hash, SignedAvailabilityBitfield), +} +``` + +### PoV Distribution V1 + +```rust +enum PoVDistributionV1Message { + /// Notification that we are awaiting the given PoVs (by hash) against a + /// specific relay-parent hash. + Awaiting(Hash, Vec), + /// Notification of an awaited PoV, in a given relay-parent context. + /// (relay_parent, pov_hash, pov) + SendPoV(Hash, Hash, PoV), +} +``` + +### Statement Distribution V1 + +```rust +enum StatementDistributionV1Message { + /// A signed full statement under a given relay-parent. + Statement(Hash, SignedFullStatement) +} +``` + +### Collator Protocol V1 + +```rust +enum CollatorProtocolV1Message { + /// Declare the intent to advertise collations under a collator ID. + Declare(CollatorId), + /// Advertise a collation to a validator. Can only be sent once the peer has declared + /// that they are a collator with given ID. + AdvertiseCollation(Hash, ParaId), + /// Request the advertised collation at that relay-parent. + RequestCollation(RequestId, Hash, ParaId), + /// A requested collation. + Collation(RequestId, CandidateReceipt, PoV), +} +``` + +## V1 Wire Protocols + +### Validation V1 + +These are the messages for the protocol on the validation peer-set. + +```rust +enum ValidationProtocolV1 { + AvailabilityDistribution(AvailabilityDistributionV1Message), + BitfieldDistribution(BitfieldDistributionV1Message), + PoVDistribution(PoVDistributionV1Message), + StatementDistribution(StatementDistributionV1Message), +} +``` + +### Collation V1 + +These are the messages for the protocol on the collation peer-set + +```rust +enum CollationProtocolV1 { + CollatorProtocol(CollatorProtocolV1Message), +} +``` + +## Network Bridge Event + +These updates are posted from the [Network Bridge Subsystem](../node/utility/network-bridge.md) to other subsystems based on registered listeners. + +```rust +enum NetworkBridgeEvent { + /// A peer with given ID is now connected. + PeerConnected(PeerId, ObservedRole), + /// A peer with given ID is now disconnected. + PeerDisconnected(PeerId), + /// We received a message from the given peer. + PeerMessage(PeerId, M), + /// The given peer has updated its description of its view. + PeerViewChange(PeerId, View), // guaranteed to come after peer connected event. + /// We have posted the given view update to all connected peers. + OurViewChange(View), +} +``` diff --git a/roadmap/implementers-guide/src/types/overseer-protocol.md b/roadmap/implementers-guide/src/types/overseer-protocol.md index cfa66c089a..355af62f07 100644 --- a/roadmap/implementers-guide/src/types/overseer-protocol.md +++ b/roadmap/implementers-guide/src/types/overseer-protocol.md @@ -41,6 +41,8 @@ struct ActiveLeavesUpdate { Messages received by the availability distribution subsystem. +This is a network protocol that receives messages of type [`AvailabilityDistributionV1Message`][AvailabilityDistributionV1NetworkMessage]. + ```rust enum AvailabilityDistributionMessage { /// Distribute an availability chunk to other validators. @@ -49,7 +51,7 @@ enum AvailabilityDistributionMessage { FetchChunk(Hash, u32), /// Event from the network. /// An update on network state from the network bridge. - NetworkBridgeUpdate(NetworkBridgeEvent), + NetworkBridgeUpdateV1(NetworkBridgeEvent), } ``` @@ -78,6 +80,7 @@ enum AvailabilityStoreMessage { ## Bitfield Distribution Message Messages received by the bitfield distribution subsystem. +This is a network protocol that receives messages of type [`BitfieldDistributionV1Message`][BitfieldDistributionV1NetworkMessage]. ```rust enum BitfieldDistributionMessage { @@ -85,7 +88,7 @@ enum BitfieldDistributionMessage { /// The bitfield distribution subsystem will assume this is indeed correctly signed. DistributeBitfield(relay_parent, SignedAvailabilityBitfield), /// Receive a network bridge update. - NetworkBridgeUpdate(NetworkBridgeEvent), + NetworkBridgeUpdateV1(NetworkBridgeEvent), } ``` @@ -161,6 +164,8 @@ enum ChainApiMessage { Messages received by the [Collator Protocol subsystem](../node/collators/collator-protocol.md) +This is a network protocol that receives messages of type [`CollatorProtocolV1Message`][CollatorProtocolV1NetworkMessage]. + ```rust enum CollatorProtocolMessage { /// Signal to the collator protocol that it should connect to validators with the expectation @@ -199,13 +204,12 @@ enum PeerSet { } enum NetworkBridgeMessage { - /// Register an event producer with the network bridge. This should be done early and cannot - /// be de-registered. - RegisterEventProducer(PeerSet, ProtocolId, Fn(NetworkBridgeEvent) -> AllMessages), /// Report a cost or benefit of a peer. Negative values are costs, positive are benefits. ReportPeer(PeerSet, PeerId, cost_benefit: i32), - /// Send a message to one or more peers on the given protocol ID. - SendMessage(PeerSet, [PeerId], ProtocolId, Bytes), + /// Send a message to one or more peers on the validation peerset. + SendValidationMessage([PeerId], ValidationProtocolV1), + /// Send a message to one or more peers on the collation peerset. + SendCollationMessage([PeerId], ValidationProtocolV1), /// Connect to peers who represent the given `ValidatorId`s at the given relay-parent. /// /// Also accepts a response channel by which the issuer can learn the `PeerId`s of those @@ -214,27 +218,7 @@ enum NetworkBridgeMessage { } ``` -## Network Bridge Update - -These updates are posted from the [Network Bridge Subsystem](../node/utility/network-bridge.md) to other subsystems based on registered listeners. - -```rust -struct View(Vec); // Up to `N` (5?) chain heads. - -enum NetworkBridgeEvent { - /// A peer with given ID is now connected. - PeerConnected(PeerId, ObservedRole), // role is one of Full, Light, OurGuardedAuthority, OurSentry - /// A peer with given ID is now disconnected. - PeerDisconnected(PeerId), - /// We received a message from the given peer. Protocol ID should be apparent from context. - PeerMessage(PeerId, Bytes), - /// The given peer has updated its description of its view. - PeerViewChange(PeerId, View), // guaranteed to come after peer connected event. - /// We have posted the given view update to all connected peers. - OurViewChange(View), -} -``` - +## Misbehavior Report ```rust enum MisbehaviorReport { @@ -258,6 +242,8 @@ If this subsystem chooses to second a parachain block, it dispatches a `Candidat ## PoV Distribution Message +This is a network protocol that receives messages of type [`PoVDistributionV1Message`][PoVDistributionV1NetworkMessage]. + ```rust enum PoVDistributionMessage { /// Fetch a PoV from the network. @@ -269,7 +255,7 @@ enum PoVDistributionMessage { /// The PoV should correctly hash to the PoV hash mentioned in the CandidateDescriptor DistributePoV(Hash, CandidateDescriptor, PoV), /// An update from the network bridge. - NetworkBridgeUpdate(NetworkBridgeEvent), + NetworkBridgeUpdateV1(NetworkBridgeEvent), } ``` @@ -357,10 +343,12 @@ enum RuntimeApiMessage { The Statement Distribution subsystem distributes signed statements and candidates from validators to other validators. It does this by distributing full statements, which embed the candidate receipt, as opposed to compact statements which don't. It receives updates from the network bridge and signed statements to share with other validators. +This is a network protocol that receives messages of type [`StatementDistributionV1Message`][StatementDistributionV1NetworkMessage]. + ```rust enum StatementDistributionMessage { /// An update from the network bridge. - NetworkBridgeUpdate(NetworkBridgeEvent), + NetworkBridgeUpdateV1(NetworkBridgeEvent), /// We have validated a candidate and want to share our judgment with our peers. /// The hash is the relay parent. /// @@ -412,3 +400,10 @@ enum CandidateValidationMessage { ), } ``` + +[NBE]: ../network.md#network-bridge-event +[AvailabilityDistributionV1NetworkMessage]: network.md#availability-distribution-v1 +[BitfieldDistributionV1NetworkMessage]: network.md#bitfield-distribution-v1 +[PoVDistributionV1NetworkMessage]: network.md#pov-distribution-v1 +[StatementDistributionV1NetworkMessage]: network.md#statement-distribution-v1 +[CollatorProtocolV1NetworkMessage]: network.md#collator-protocol-v1 -- GitLab From 671cc75c4dcc8e05bdf3b722ddd63880f8166d8a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Silva?= <123550+andresilva@users.noreply.github.com> Date: Wed, 5 Aug 2020 13:10:43 +0100 Subject: [PATCH 146/192] revert enabling authority discovery by default (#1532) --- cli/src/cli.rs | 9 +++------ cli/src/command.rs | 4 ++-- node/service/src/lib.rs | 14 +++++++------- node/test-service/src/lib.rs | 8 ++++---- service/src/lib.rs | 30 +++++++++++++++--------------- 5 files changed, 31 insertions(+), 34 deletions(-) diff --git a/cli/src/cli.rs b/cli/src/cli.rs index 0287a33312..d3ec195a97 100644 --- a/cli/src/cli.rs +++ b/cli/src/cli.rs @@ -59,10 +59,7 @@ pub struct RunCmd { #[structopt(long = "force-westend")] pub force_westend: bool, - /// Disable the authority discovery module on validator or sentry nodes. - /// - /// Enabled by default on validator and sentry nodes. Always disabled on - /// non validator or sentry nodes. + /// Enable the authority discovery module on validator or sentry nodes. /// /// When enabled: /// @@ -73,8 +70,8 @@ pub struct RunCmd { /// (2) As a validator or sentry node: Discover addresses of validators or /// addresses of their sentry nodes and maintain a permanent connection /// to a subset. - #[structopt(long = "disable-authority-discovery")] - pub authority_discovery_disabled: bool, + #[structopt(long = "enable-authority-discovery")] + pub authority_discovery_enabled: bool, /// Setup a GRANDPA scheduled voting pause. /// diff --git a/cli/src/command.rs b/cli/src/command.rs index 2d256374cd..86e8796408 100644 --- a/cli/src/command.rs +++ b/cli/src/command.rs @@ -114,7 +114,7 @@ pub fn run() -> Result<()> { set_default_ss58_version(chain_spec); - let authority_discovery_disabled = cli.run.authority_discovery_disabled; + let authority_discovery_enabled = cli.run.authority_discovery_enabled; let grandpa_pause = if cli.run.grandpa_pause.is_empty() { None } else { @@ -138,7 +138,7 @@ pub fn run() -> Result<()> { config, None, None, - authority_discovery_disabled, + authority_discovery_enabled, 6000, grandpa_pause, ).map(|r| r.0), diff --git a/node/service/src/lib.rs b/node/service/src/lib.rs index c347c94ec0..836e3f06f0 100644 --- a/node/service/src/lib.rs +++ b/node/service/src/lib.rs @@ -301,7 +301,7 @@ fn new_full( mut config: Configuration, collating_for: Option<(CollatorId, ParaId)>, _max_block_data_size: Option, - _authority_discovery_disabled: bool, + _authority_discovery_enabled: bool, _slot_duration: u64, grandpa_pause: Option<(u32, u32)>, ) -> Result<( @@ -644,7 +644,7 @@ pub fn polkadot_new_full( config: Configuration, collating_for: Option<(CollatorId, ParaId)>, max_block_data_size: Option, - authority_discovery_disabled: bool, + authority_discovery_enabled: bool, slot_duration: u64, grandpa_pause: Option<(u32, u32)>, ) @@ -662,7 +662,7 @@ pub fn polkadot_new_full( config, collating_for, max_block_data_size, - authority_discovery_disabled, + authority_discovery_enabled, slot_duration, grandpa_pause, )?; @@ -676,7 +676,7 @@ pub fn kusama_new_full( config: Configuration, collating_for: Option<(CollatorId, ParaId)>, max_block_data_size: Option, - authority_discovery_disabled: bool, + authority_discovery_enabled: bool, slot_duration: u64, grandpa_pause: Option<(u32, u32)>, ) -> Result<( @@ -694,7 +694,7 @@ pub fn kusama_new_full( config, collating_for, max_block_data_size, - authority_discovery_disabled, + authority_discovery_enabled, slot_duration, grandpa_pause, )?; @@ -708,7 +708,7 @@ pub fn westend_new_full( config: Configuration, collating_for: Option<(CollatorId, ParaId)>, max_block_data_size: Option, - authority_discovery_disabled: bool, + authority_discovery_enabled: bool, slot_duration: u64, grandpa_pause: Option<(u32, u32)>, ) @@ -726,7 +726,7 @@ pub fn westend_new_full( config, collating_for, max_block_data_size, - authority_discovery_disabled, + authority_discovery_enabled, slot_duration, grandpa_pause, )?; diff --git a/node/test-service/src/lib.rs b/node/test-service/src/lib.rs index bc210c2384..03b8dd6aa6 100644 --- a/node/test-service/src/lib.rs +++ b/node/test-service/src/lib.rs @@ -62,7 +62,7 @@ pub fn polkadot_test_new_full( config: Configuration, collating_for: Option<(CollatorId, ParaId)>, max_block_data_size: Option, - authority_discovery_disabled: bool, + authority_discovery_enabled: bool, slot_duration: u64, ) -> Result< ( @@ -79,7 +79,7 @@ pub fn polkadot_test_new_full( config, collating_for, max_block_data_size, - authority_discovery_disabled, + authority_discovery_enabled, slot_duration, None, true, @@ -198,9 +198,9 @@ pub fn run_test_node( > { let config = node_config(storage_update_func, task_executor, key, boot_nodes); let multiaddr = config.network.listen_addresses[0].clone(); - let authority_discovery_disabled = true; + let authority_discovery_enabled = false; let (task_manager, client, handles, network, rpc_handlers) = - polkadot_test_new_full(config, None, None, authority_discovery_disabled, 6000) + polkadot_test_new_full(config, None, None, authority_discovery_enabled, 6000) .expect("could not create Polkadot test service"); let peer_id = network.local_peer_id().clone(); diff --git a/service/src/lib.rs b/service/src/lib.rs index 1897e026dd..5a45147caf 100644 --- a/service/src/lib.rs +++ b/service/src/lib.rs @@ -250,7 +250,7 @@ pub fn new_full( mut config: Configuration, collating_for: Option<(CollatorId, parachain::Id)>, max_block_data_size: Option, - authority_discovery_disabled: bool, + authority_discovery_enabled: bool, slot_duration: u64, grandpa_pause: Option<(u32, u32)>, test: bool, @@ -453,7 +453,7 @@ pub fn new_full( } if matches!(role, Role::Authority{..} | Role::Sentry{..}) { - if !authority_discovery_disabled { + if authority_discovery_enabled { let (sentries, authority_discovery_role) = match role { Role::Authority { ref sentry_nodes } => ( sentry_nodes.clone(), @@ -690,7 +690,7 @@ pub fn polkadot_new_full( config: Configuration, collating_for: Option<(CollatorId, parachain::Id)>, max_block_data_size: Option, - authority_discovery_disabled: bool, + authority_discovery_enabled: bool, slot_duration: u64, grandpa_pause: Option<(u32, u32)>, ) @@ -704,7 +704,7 @@ pub fn polkadot_new_full( config, collating_for, max_block_data_size, - authority_discovery_disabled, + authority_discovery_enabled, slot_duration, grandpa_pause, false, @@ -719,7 +719,7 @@ pub fn kusama_new_full( config: Configuration, collating_for: Option<(CollatorId, parachain::Id)>, max_block_data_size: Option, - authority_discovery_disabled: bool, + authority_discovery_enabled: bool, slot_duration: u64, grandpa_pause: Option<(u32, u32)>, ) -> Result<( @@ -732,7 +732,7 @@ pub fn kusama_new_full( config, collating_for, max_block_data_size, - authority_discovery_disabled, + authority_discovery_enabled, slot_duration, grandpa_pause, false, @@ -747,7 +747,7 @@ pub fn westend_new_full( config: Configuration, collating_for: Option<(CollatorId, parachain::Id)>, max_block_data_size: Option, - authority_discovery_disabled: bool, + authority_discovery_enabled: bool, slot_duration: u64, grandpa_pause: Option<(u32, u32)>, ) @@ -761,7 +761,7 @@ pub fn westend_new_full( config, collating_for, max_block_data_size, - authority_discovery_disabled, + authority_discovery_enabled, slot_duration, grandpa_pause, false, @@ -776,7 +776,7 @@ pub fn rococo_new_full( config: Configuration, collating_for: Option<(CollatorId, parachain::Id)>, max_block_data_size: Option, - authority_discovery_disabled: bool, + authority_discovery_enabled: bool, slot_duration: u64, grandpa_pause: Option<(u32, u32)>, ) @@ -790,7 +790,7 @@ pub fn rococo_new_full( config, collating_for, max_block_data_size, - authority_discovery_disabled, + authority_discovery_enabled, slot_duration, grandpa_pause, false, @@ -829,7 +829,7 @@ pub fn build_full( config: Configuration, collating_for: Option<(CollatorId, parachain::Id)>, max_block_data_size: Option, - authority_discovery_disabled: bool, + authority_discovery_enabled: bool, slot_duration: u64, grandpa_pause: Option<(u32, u32)>, ) -> Result<(TaskManager, Client, FullNodeHandles), ServiceError> { @@ -838,7 +838,7 @@ pub fn build_full( config, collating_for, max_block_data_size, - authority_discovery_disabled, + authority_discovery_enabled, slot_duration, grandpa_pause, false, @@ -848,7 +848,7 @@ pub fn build_full( config, collating_for, max_block_data_size, - authority_discovery_disabled, + authority_discovery_enabled, slot_duration, grandpa_pause, false, @@ -858,7 +858,7 @@ pub fn build_full( config, collating_for, max_block_data_size, - authority_discovery_disabled, + authority_discovery_enabled, slot_duration, grandpa_pause, false, @@ -868,7 +868,7 @@ pub fn build_full( config, collating_for, max_block_data_size, - authority_discovery_disabled, + authority_discovery_enabled, slot_duration, grandpa_pause, false, -- GitLab From b5c25e92c6d8e00d15de7eff2bc022c9a2c941df Mon Sep 17 00:00:00 2001 From: s3krit Date: Wed, 5 Aug 2020 15:41:16 +0200 Subject: [PATCH 147/192] Update check_labels runtimenoteworthy label (#1540) --- scripts/gitlab/check_labels.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/gitlab/check_labels.sh b/scripts/gitlab/check_labels.sh index b2feebc09c..c70599912c 100755 --- a/scripts/gitlab/check_labels.sh +++ b/scripts/gitlab/check_labels.sh @@ -18,7 +18,7 @@ ensure_labels() { releasenotes_labels=( 'B0-silent' 'B1-releasenotes' - 'B2-runtimenoteworthy' + 'B7-runtimenoteworthy' ) priority_labels=( -- GitLab From 9ee2fc4fbfee727d54a120535e0e4b5e45148109 Mon Sep 17 00:00:00 2001 From: Gavin Wood Date: Wed, 5 Aug 2020 16:46:04 +0200 Subject: [PATCH 148/192] Bump Substrate, version (#1541) * Bump Substrate, version * 0.8.22 --- Cargo.lock | 274 ++++++++++++++++++------------------ runtime/kusama/src/lib.rs | 2 +- runtime/polkadot/src/lib.rs | 2 +- runtime/westend/src/lib.rs | 2 +- 4 files changed, 140 insertions(+), 140 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a840b06689..c5510f3bc3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1370,7 +1370,7 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "fork-tree" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" +source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" dependencies = [ "parity-scale-codec", ] @@ -1378,7 +1378,7 @@ dependencies = [ [[package]] name = "frame-benchmarking" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" +source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" dependencies = [ "frame-support", "frame-system", @@ -1395,7 +1395,7 @@ dependencies = [ [[package]] name = "frame-benchmarking-cli" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" +source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" dependencies = [ "frame-benchmarking", "parity-scale-codec", @@ -1413,7 +1413,7 @@ dependencies = [ [[package]] name = "frame-executive" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" +source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" dependencies = [ "frame-support", "frame-system", @@ -1428,7 +1428,7 @@ dependencies = [ [[package]] name = "frame-metadata" version = "11.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" +source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" dependencies = [ "parity-scale-codec", "serde", @@ -1439,7 +1439,7 @@ dependencies = [ [[package]] name = "frame-support" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" +source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" dependencies = [ "bitmask", "frame-metadata", @@ -1464,7 +1464,7 @@ dependencies = [ [[package]] name = "frame-support-procedural" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" +source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" dependencies = [ "frame-support-procedural-tools", "proc-macro2 1.0.18", @@ -1475,7 +1475,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" +source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" dependencies = [ "frame-support-procedural-tools-derive", "proc-macro-crate", @@ -1487,7 +1487,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools-derive" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" +source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" dependencies = [ "proc-macro2 1.0.18", "quote 1.0.7", @@ -1497,7 +1497,7 @@ dependencies = [ [[package]] name = "frame-system" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" +source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" dependencies = [ "frame-support", "impl-trait-for-tuples", @@ -1513,7 +1513,7 @@ dependencies = [ [[package]] name = "frame-system-benchmarking" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" +source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" dependencies = [ "frame-benchmarking", "frame-support", @@ -1527,7 +1527,7 @@ dependencies = [ [[package]] name = "frame-system-rpc-runtime-api" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" +source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" dependencies = [ "parity-scale-codec", "sp-api", @@ -3541,7 +3541,7 @@ dependencies = [ [[package]] name = "pallet-authority-discovery" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" +source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" dependencies = [ "frame-support", "frame-system", @@ -3557,7 +3557,7 @@ dependencies = [ [[package]] name = "pallet-authorship" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" +source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" dependencies = [ "frame-support", "frame-system", @@ -3572,7 +3572,7 @@ dependencies = [ [[package]] name = "pallet-babe" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" +source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" dependencies = [ "frame-benchmarking", "frame-support", @@ -3597,7 +3597,7 @@ dependencies = [ [[package]] name = "pallet-balances" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" +source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" dependencies = [ "frame-benchmarking", "frame-support", @@ -3611,7 +3611,7 @@ dependencies = [ [[package]] name = "pallet-collective" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" +source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" dependencies = [ "frame-benchmarking", "frame-support", @@ -3627,7 +3627,7 @@ dependencies = [ [[package]] name = "pallet-democracy" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" +source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" dependencies = [ "frame-benchmarking", "frame-support", @@ -3642,7 +3642,7 @@ dependencies = [ [[package]] name = "pallet-elections-phragmen" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" +source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" dependencies = [ "frame-benchmarking", "frame-support", @@ -3657,7 +3657,7 @@ dependencies = [ [[package]] name = "pallet-finality-tracker" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" +source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" dependencies = [ "frame-support", "frame-system", @@ -3673,7 +3673,7 @@ dependencies = [ [[package]] name = "pallet-grandpa" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" +source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" dependencies = [ "frame-benchmarking", "frame-support", @@ -3695,7 +3695,7 @@ dependencies = [ [[package]] name = "pallet-identity" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" +source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" dependencies = [ "enumflags2", "frame-benchmarking", @@ -3711,7 +3711,7 @@ dependencies = [ [[package]] name = "pallet-im-online" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" +source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" dependencies = [ "frame-benchmarking", "frame-support", @@ -3731,7 +3731,7 @@ dependencies = [ [[package]] name = "pallet-indices" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" +source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" dependencies = [ "frame-support", "frame-system", @@ -3747,7 +3747,7 @@ dependencies = [ [[package]] name = "pallet-membership" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" +source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" dependencies = [ "frame-support", "frame-system", @@ -3761,7 +3761,7 @@ dependencies = [ [[package]] name = "pallet-multisig" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" +source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" dependencies = [ "frame-support", "frame-system", @@ -3776,7 +3776,7 @@ dependencies = [ [[package]] name = "pallet-nicks" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" +source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" dependencies = [ "frame-support", "frame-system", @@ -3790,7 +3790,7 @@ dependencies = [ [[package]] name = "pallet-offences" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" +source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" dependencies = [ "frame-support", "frame-system", @@ -3805,7 +3805,7 @@ dependencies = [ [[package]] name = "pallet-offences-benchmarking" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" +source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" dependencies = [ "frame-benchmarking", "frame-support", @@ -3826,7 +3826,7 @@ dependencies = [ [[package]] name = "pallet-proxy" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" +source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" dependencies = [ "frame-support", "frame-system", @@ -3841,7 +3841,7 @@ dependencies = [ [[package]] name = "pallet-randomness-collective-flip" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" +source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" dependencies = [ "frame-support", "frame-system", @@ -3854,7 +3854,7 @@ dependencies = [ [[package]] name = "pallet-recovery" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" +source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" dependencies = [ "enumflags2", "frame-support", @@ -3869,7 +3869,7 @@ dependencies = [ [[package]] name = "pallet-scheduler" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" +source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" dependencies = [ "frame-benchmarking", "frame-support", @@ -3884,7 +3884,7 @@ dependencies = [ [[package]] name = "pallet-session" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" +source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" dependencies = [ "frame-support", "frame-system", @@ -3904,7 +3904,7 @@ dependencies = [ [[package]] name = "pallet-session-benchmarking" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" +source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" dependencies = [ "frame-benchmarking", "frame-support", @@ -3920,7 +3920,7 @@ dependencies = [ [[package]] name = "pallet-society" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" +source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" dependencies = [ "frame-support", "frame-system", @@ -3934,7 +3934,7 @@ dependencies = [ [[package]] name = "pallet-staking" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" +source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" dependencies = [ "frame-benchmarking", "frame-support", @@ -3956,7 +3956,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-curve" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" +source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -3967,7 +3967,7 @@ dependencies = [ [[package]] name = "pallet-sudo" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" +source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" dependencies = [ "frame-support", "frame-system", @@ -3981,7 +3981,7 @@ dependencies = [ [[package]] name = "pallet-timestamp" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" +source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" dependencies = [ "frame-benchmarking", "frame-support", @@ -3999,7 +3999,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" +source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" dependencies = [ "frame-support", "frame-system", @@ -4016,7 +4016,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" +source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" dependencies = [ "jsonrpc-core", "jsonrpc-core-client", @@ -4034,7 +4034,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc-runtime-api" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" +source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" dependencies = [ "frame-support", "parity-scale-codec", @@ -4047,7 +4047,7 @@ dependencies = [ [[package]] name = "pallet-treasury" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" +source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" dependencies = [ "frame-benchmarking", "frame-support", @@ -4062,7 +4062,7 @@ dependencies = [ [[package]] name = "pallet-utility" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" +source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" dependencies = [ "frame-benchmarking", "frame-support", @@ -4078,7 +4078,7 @@ dependencies = [ [[package]] name = "pallet-vesting" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" +source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" dependencies = [ "enumflags2", "frame-benchmarking", @@ -6224,7 +6224,7 @@ dependencies = [ [[package]] name = "sc-authority-discovery" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" +source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" dependencies = [ "bytes 0.5.5", "derive_more 0.99.9", @@ -6251,7 +6251,7 @@ dependencies = [ [[package]] name = "sc-basic-authorship" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" +source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6275,7 +6275,7 @@ dependencies = [ [[package]] name = "sc-block-builder" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" +source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" dependencies = [ "parity-scale-codec", "sc-client-api", @@ -6292,7 +6292,7 @@ dependencies = [ [[package]] name = "sc-chain-spec" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" +source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" dependencies = [ "impl-trait-for-tuples", "sc-chain-spec-derive", @@ -6308,7 +6308,7 @@ dependencies = [ [[package]] name = "sc-chain-spec-derive" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" +source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -6319,7 +6319,7 @@ dependencies = [ [[package]] name = "sc-cli" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" +source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" dependencies = [ "ansi_term 0.12.1", "atty", @@ -6360,7 +6360,7 @@ dependencies = [ [[package]] name = "sc-client-api" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" +source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" dependencies = [ "derive_more 0.99.9", "fnv", @@ -6396,7 +6396,7 @@ dependencies = [ [[package]] name = "sc-client-db" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" +source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" dependencies = [ "blake2-rfc", "hash-db", @@ -6426,7 +6426,7 @@ dependencies = [ [[package]] name = "sc-consensus" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" +source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" dependencies = [ "sc-client-api", "sp-blockchain", @@ -6437,7 +6437,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" +source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" dependencies = [ "derive_more 0.99.9", "fork-tree", @@ -6481,7 +6481,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe-rpc" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" +source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -6505,7 +6505,7 @@ dependencies = [ [[package]] name = "sc-consensus-epochs" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" +source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" dependencies = [ "fork-tree", "parity-scale-codec", @@ -6518,7 +6518,7 @@ dependencies = [ [[package]] name = "sc-consensus-slots" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" +source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6541,7 +6541,7 @@ dependencies = [ [[package]] name = "sc-consensus-uncles" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" +source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" dependencies = [ "log 0.4.8", "sc-client-api", @@ -6555,7 +6555,7 @@ dependencies = [ [[package]] name = "sc-executor" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" +source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" dependencies = [ "derive_more 0.99.9", "lazy_static", @@ -6583,7 +6583,7 @@ dependencies = [ [[package]] name = "sc-executor-common" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" +source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" dependencies = [ "derive_more 0.99.9", "log 0.4.8", @@ -6600,7 +6600,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmi" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" +source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" dependencies = [ "log 0.4.8", "parity-scale-codec", @@ -6615,7 +6615,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmtime" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" +source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" dependencies = [ "cranelift-codegen", "cranelift-wasm", @@ -6636,7 +6636,7 @@ dependencies = [ [[package]] name = "sc-finality-grandpa" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" +source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" dependencies = [ "assert_matches", "derive_more 0.99.9", @@ -6674,7 +6674,7 @@ dependencies = [ [[package]] name = "sc-finality-grandpa-rpc" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" +source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" dependencies = [ "derive_more 0.99.9", "finality-grandpa", @@ -6691,7 +6691,7 @@ dependencies = [ [[package]] name = "sc-informant" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" +source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" dependencies = [ "ansi_term 0.12.1", "futures 0.3.5", @@ -6709,7 +6709,7 @@ dependencies = [ [[package]] name = "sc-keystore" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" +source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" dependencies = [ "derive_more 0.99.9", "hex", @@ -6725,7 +6725,7 @@ dependencies = [ [[package]] name = "sc-light" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" +source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" dependencies = [ "hash-db", "lazy_static", @@ -6744,7 +6744,7 @@ dependencies = [ [[package]] name = "sc-network" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" +source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" dependencies = [ "bitflags", "bs58", @@ -6796,7 +6796,7 @@ dependencies = [ [[package]] name = "sc-network-gossip" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" +source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6811,7 +6811,7 @@ dependencies = [ [[package]] name = "sc-network-test" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" +source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" dependencies = [ "env_logger", "futures 0.3.5", @@ -6838,7 +6838,7 @@ dependencies = [ [[package]] name = "sc-offchain" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" +source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" dependencies = [ "bytes 0.5.5", "fnv", @@ -6865,7 +6865,7 @@ dependencies = [ [[package]] name = "sc-peerset" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" +source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" dependencies = [ "futures 0.3.5", "libp2p", @@ -6878,7 +6878,7 @@ dependencies = [ [[package]] name = "sc-proposer-metrics" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" +source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" dependencies = [ "log 0.4.8", "substrate-prometheus-endpoint", @@ -6887,7 +6887,7 @@ dependencies = [ [[package]] name = "sc-rpc" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" +source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" dependencies = [ "futures 0.3.5", "hash-db", @@ -6919,7 +6919,7 @@ dependencies = [ [[package]] name = "sc-rpc-api" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" +source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -6943,7 +6943,7 @@ dependencies = [ [[package]] name = "sc-rpc-server" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" +source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" dependencies = [ "jsonrpc-core", "jsonrpc-http-server", @@ -6959,7 +6959,7 @@ dependencies = [ [[package]] name = "sc-service" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" +source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" dependencies = [ "derive_more 0.99.9", "directories", @@ -7022,7 +7022,7 @@ dependencies = [ [[package]] name = "sc-state-db" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" +source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" dependencies = [ "log 0.4.8", "parity-scale-codec", @@ -7036,7 +7036,7 @@ dependencies = [ [[package]] name = "sc-telemetry" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" +source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -7057,7 +7057,7 @@ dependencies = [ [[package]] name = "sc-tracing" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" +source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" dependencies = [ "erased-serde", "log 0.4.8", @@ -7074,7 +7074,7 @@ dependencies = [ [[package]] name = "sc-transaction-graph" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" +source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -7095,7 +7095,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" +source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -7550,7 +7550,7 @@ dependencies = [ [[package]] name = "sp-allocator" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" +source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" dependencies = [ "derive_more 0.99.9", "log 0.4.8", @@ -7562,7 +7562,7 @@ dependencies = [ [[package]] name = "sp-api" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" +source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" dependencies = [ "hash-db", "parity-scale-codec", @@ -7577,7 +7577,7 @@ dependencies = [ [[package]] name = "sp-api-proc-macro" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" +source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" dependencies = [ "blake2-rfc", "proc-macro-crate", @@ -7589,7 +7589,7 @@ dependencies = [ [[package]] name = "sp-application-crypto" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" +source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" dependencies = [ "parity-scale-codec", "serde", @@ -7601,7 +7601,7 @@ dependencies = [ [[package]] name = "sp-arithmetic" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" +source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" dependencies = [ "integer-sqrt", "num-traits 0.2.12", @@ -7614,7 +7614,7 @@ dependencies = [ [[package]] name = "sp-authority-discovery" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" +source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" dependencies = [ "parity-scale-codec", "sp-api", @@ -7626,7 +7626,7 @@ dependencies = [ [[package]] name = "sp-authorship" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" +source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" dependencies = [ "parity-scale-codec", "sp-inherents", @@ -7637,7 +7637,7 @@ dependencies = [ [[package]] name = "sp-block-builder" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" +source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" dependencies = [ "parity-scale-codec", "sp-api", @@ -7649,7 +7649,7 @@ dependencies = [ [[package]] name = "sp-blockchain" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" +source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" dependencies = [ "derive_more 0.99.9", "log 0.4.8", @@ -7666,7 +7666,7 @@ dependencies = [ [[package]] name = "sp-chain-spec" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" +source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" dependencies = [ "serde", "serde_json", @@ -7675,7 +7675,7 @@ dependencies = [ [[package]] name = "sp-consensus" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" +source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -7701,7 +7701,7 @@ dependencies = [ [[package]] name = "sp-consensus-aura" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" +source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" dependencies = [ "parity-scale-codec", "sp-api", @@ -7715,7 +7715,7 @@ dependencies = [ [[package]] name = "sp-consensus-babe" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" +source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" dependencies = [ "merlin", "parity-scale-codec", @@ -7734,7 +7734,7 @@ dependencies = [ [[package]] name = "sp-consensus-slots" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" +source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" dependencies = [ "parity-scale-codec", "sp-runtime", @@ -7743,7 +7743,7 @@ dependencies = [ [[package]] name = "sp-consensus-vrf" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" +source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" dependencies = [ "parity-scale-codec", "schnorrkel", @@ -7755,7 +7755,7 @@ dependencies = [ [[package]] name = "sp-core" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" +source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" dependencies = [ "base58", "blake2-rfc", @@ -7799,7 +7799,7 @@ dependencies = [ [[package]] name = "sp-database" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" +source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" dependencies = [ "kvdb", "parking_lot 0.10.2", @@ -7808,7 +7808,7 @@ dependencies = [ [[package]] name = "sp-debug-derive" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" +source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" dependencies = [ "proc-macro2 1.0.18", "quote 1.0.7", @@ -7818,7 +7818,7 @@ dependencies = [ [[package]] name = "sp-externalities" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" +source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" dependencies = [ "environmental", "parity-scale-codec", @@ -7829,7 +7829,7 @@ dependencies = [ [[package]] name = "sp-finality-grandpa" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" +source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" dependencies = [ "finality-grandpa", "log 0.4.8", @@ -7845,7 +7845,7 @@ dependencies = [ [[package]] name = "sp-finality-tracker" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" +source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" dependencies = [ "parity-scale-codec", "sp-inherents", @@ -7855,7 +7855,7 @@ dependencies = [ [[package]] name = "sp-inherents" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" +source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" dependencies = [ "derive_more 0.99.9", "parity-scale-codec", @@ -7867,7 +7867,7 @@ dependencies = [ [[package]] name = "sp-io" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" +source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" dependencies = [ "futures 0.3.5", "hash-db", @@ -7888,7 +7888,7 @@ dependencies = [ [[package]] name = "sp-keyring" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" +source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" dependencies = [ "lazy_static", "sp-core", @@ -7899,7 +7899,7 @@ dependencies = [ [[package]] name = "sp-npos-elections" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" +source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" dependencies = [ "parity-scale-codec", "serde", @@ -7911,7 +7911,7 @@ dependencies = [ [[package]] name = "sp-npos-elections-compact" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" +source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -7922,7 +7922,7 @@ dependencies = [ [[package]] name = "sp-offchain" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" +source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" dependencies = [ "sp-api", "sp-core", @@ -7932,7 +7932,7 @@ dependencies = [ [[package]] name = "sp-panic-handler" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" +source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" dependencies = [ "backtrace", "log 0.4.8", @@ -7941,7 +7941,7 @@ dependencies = [ [[package]] name = "sp-rpc" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" +source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" dependencies = [ "serde", "sp-core", @@ -7950,7 +7950,7 @@ dependencies = [ [[package]] name = "sp-runtime" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" +source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" dependencies = [ "either", "hash256-std-hasher", @@ -7972,7 +7972,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" +source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" dependencies = [ "parity-scale-codec", "primitive-types", @@ -7987,7 +7987,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" +source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" dependencies = [ "Inflector", "proc-macro-crate", @@ -7999,7 +7999,7 @@ dependencies = [ [[package]] name = "sp-serializer" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" +source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" dependencies = [ "serde", "serde_json", @@ -8008,7 +8008,7 @@ dependencies = [ [[package]] name = "sp-session" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" +source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" dependencies = [ "parity-scale-codec", "sp-api", @@ -8021,7 +8021,7 @@ dependencies = [ [[package]] name = "sp-staking" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" +source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" dependencies = [ "parity-scale-codec", "sp-runtime", @@ -8031,7 +8031,7 @@ dependencies = [ [[package]] name = "sp-state-machine" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" +source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" dependencies = [ "hash-db", "itertools 0.9.0", @@ -8052,12 +8052,12 @@ dependencies = [ [[package]] name = "sp-std" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" +source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" [[package]] name = "sp-storage" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" +source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" dependencies = [ "impl-serde 0.2.3", "ref-cast", @@ -8069,7 +8069,7 @@ dependencies = [ [[package]] name = "sp-timestamp" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" +source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -8083,7 +8083,7 @@ dependencies = [ [[package]] name = "sp-tracing" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" +source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" dependencies = [ "log 0.4.8", "rental", @@ -8093,7 +8093,7 @@ dependencies = [ [[package]] name = "sp-transaction-pool" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" +source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -8108,7 +8108,7 @@ dependencies = [ [[package]] name = "sp-trie" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" +source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" dependencies = [ "hash-db", "memory-db", @@ -8122,7 +8122,7 @@ dependencies = [ [[package]] name = "sp-utils" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" +source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" dependencies = [ "futures 0.3.5", "futures-core", @@ -8134,7 +8134,7 @@ dependencies = [ [[package]] name = "sp-version" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" +source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" dependencies = [ "impl-serde 0.2.3", "parity-scale-codec", @@ -8146,7 +8146,7 @@ dependencies = [ [[package]] name = "sp-wasm-interface" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" +source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -8277,7 +8277,7 @@ dependencies = [ [[package]] name = "substrate-browser-utils" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" +source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" dependencies = [ "chrono", "console_error_panic_hook", @@ -8303,7 +8303,7 @@ dependencies = [ [[package]] name = "substrate-build-script-utils" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" +source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" dependencies = [ "platforms", ] @@ -8311,7 +8311,7 @@ dependencies = [ [[package]] name = "substrate-frame-rpc-system" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" +source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" dependencies = [ "frame-system-rpc-runtime-api", "futures 0.3.5", @@ -8334,7 +8334,7 @@ dependencies = [ [[package]] name = "substrate-prometheus-endpoint" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" +source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" dependencies = [ "async-std", "derive_more 0.99.9", @@ -8348,7 +8348,7 @@ dependencies = [ [[package]] name = "substrate-test-client" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" +source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" dependencies = [ "futures 0.1.29", "futures 0.3.5", @@ -8374,7 +8374,7 @@ dependencies = [ [[package]] name = "substrate-test-runtime" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" +source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" dependencies = [ "cfg-if", "frame-executive", @@ -8414,7 +8414,7 @@ dependencies = [ [[package]] name = "substrate-test-runtime-client" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" +source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" dependencies = [ "futures 0.3.5", "parity-scale-codec", @@ -8435,7 +8435,7 @@ dependencies = [ [[package]] name = "substrate-wasm-builder-runner" version = "1.0.6" -source = "git+https://github.com/paritytech/substrate#549050b7f1740c90855e777daf3f9700750ad7ff" +source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" [[package]] name = "substrate-wasm-builder-runner" diff --git a/runtime/kusama/src/lib.rs b/runtime/kusama/src/lib.rs index 6049a3d573..12e8b08a7f 100644 --- a/runtime/kusama/src/lib.rs +++ b/runtime/kusama/src/lib.rs @@ -90,7 +90,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("kusama"), impl_name: create_runtime_str!("parity-kusama"), authoring_version: 2, - spec_version: 2023, + spec_version: 2022, impl_version: 0, #[cfg(not(feature = "disable-runtime-api"))] apis: RUNTIME_API_VERSIONS, diff --git a/runtime/polkadot/src/lib.rs b/runtime/polkadot/src/lib.rs index effa529458..d15cce417d 100644 --- a/runtime/polkadot/src/lib.rs +++ b/runtime/polkadot/src/lib.rs @@ -89,7 +89,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("polkadot"), impl_name: create_runtime_str!("parity-polkadot"), authoring_version: 0, - spec_version: 23, + spec_version: 22, impl_version: 0, #[cfg(not(feature = "disable-runtime-api"))] apis: RUNTIME_API_VERSIONS, diff --git a/runtime/westend/src/lib.rs b/runtime/westend/src/lib.rs index 0c11900bea..30a450d976 100644 --- a/runtime/westend/src/lib.rs +++ b/runtime/westend/src/lib.rs @@ -86,7 +86,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("westend"), impl_name: create_runtime_str!("parity-westend"), authoring_version: 2, - spec_version: 43, + spec_version: 42, impl_version: 0, #[cfg(not(feature = "disable-runtime-api"))] apis: RUNTIME_API_VERSIONS, -- GitLab From 00e45561d50fc5238d3cf4918042adb7cbd5d13c Mon Sep 17 00:00:00 2001 From: s3krit Date: Wed, 5 Aug 2020 19:32:03 +0200 Subject: [PATCH 149/192] [CI] Fix draft release publishing (#1546) Small oversight, realised I was checking `git log version..old_version` rather than the other way round. Not sure how this slipped through --- scripts/github/generate_release_text.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/github/generate_release_text.rb b/scripts/github/generate_release_text.rb index bb08f0820b..d113c5b1f1 100644 --- a/scripts/github/generate_release_text.rb +++ b/scripts/github/generate_release_text.rb @@ -27,7 +27,7 @@ last_version = pg .sort_by { |v| Gem::Version.new(v.slice(1...)) }[-2] polkadot_cl = Changelog.new( - 'paritytech/polkadot', version, last_version, token: token + 'paritytech/polkadot', last_version, version, token: token ) # Get prev and cur substrate SHAs - parse the old and current Cargo.lock for -- GitLab From 0be79eedea097a581bd8192f0eabb1a980489650 Mon Sep 17 00:00:00 2001 From: Fedor Sakharov Date: Wed, 5 Aug 2020 22:24:20 +0300 Subject: [PATCH 150/192] Add an Origin to parachains v1 (#1542) --- runtime/parachains/src/lib.rs | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/runtime/parachains/src/lib.rs b/runtime/parachains/src/lib.rs index 5abc2fa32c..b41968b480 100644 --- a/runtime/parachains/src/lib.rs +++ b/runtime/parachains/src/lib.rs @@ -23,6 +23,11 @@ #![cfg_attr(not(feature = "std"), no_std)] +use sp_std::result; +use sp_runtime::traits::BadOrigin; +use primitives::v1::Id as ParaId; +use codec::{Decode, Encode}; + pub mod configuration; pub mod inclusion; pub mod inclusion_inherent; @@ -35,3 +40,22 @@ pub mod runtime_api_impl; #[cfg(test)] mod mock; + +/// Origin for the parachains. +#[derive(PartialEq, Eq, Clone, Encode, Decode)] +#[cfg_attr(feature = "std", derive(Debug))] +pub enum Origin { + /// It comes from a parachain. + Parachain(ParaId), +} + +/// Ensure that the origin `o` represents a parachain. +/// Returns `Ok` with the parachain ID that effected the extrinsic or an `Err` otherwise. +pub fn ensure_parachain(o: OuterOrigin) -> result::Result + where OuterOrigin: Into> +{ + match o.into() { + Ok(Origin::Parachain(id)) => Ok(id), + _ => Err(BadOrigin), + } +} -- GitLab From 161ff37d351de8fcf4695c5c8cde1bf45ec42ae6 Mon Sep 17 00:00:00 2001 From: Cecile Tonglet Date: Thu, 6 Aug 2020 06:52:03 +0200 Subject: [PATCH 151/192] Ignore checks for companion PRs (#1455) --- .editorconfig | 6 + .gitlab-ci.yml | 25 +- scripts/gitlab/check_runtime.sh | 292 +++++++++++---------- scripts/gitlab/check_runtime_benchmarks.sh | 8 + scripts/gitlab/check_web_wasm.sh | 15 ++ scripts/gitlab/lib.sh | 15 ++ scripts/gitlab/test_deterministic_wasm.sh | 17 ++ scripts/gitlab/test_linux_stable.sh | 8 + 8 files changed, 220 insertions(+), 166 deletions(-) create mode 100755 scripts/gitlab/check_runtime_benchmarks.sh create mode 100755 scripts/gitlab/check_web_wasm.sh create mode 100755 scripts/gitlab/test_deterministic_wasm.sh create mode 100755 scripts/gitlab/test_linux_stable.sh diff --git a/.editorconfig b/.editorconfig index f511aad460..dda39da09e 100644 --- a/.editorconfig +++ b/.editorconfig @@ -14,3 +14,9 @@ indent_style=space indent_size=2 tab_width=8 end_of_line=lf + +[*.sh] +indent_style=space +indent_size=2 +tab_width=8 +end_of_line=lf diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 11312ad649..1f2ef6ded2 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -99,17 +99,7 @@ test-deterministic-wasm: <<: *docker-env except: script: - # build runtime - - WASM_BUILD_NO_COLOR=1 cargo build --verbose --release -p kusama-runtime -p polkadot-runtime -p westend-runtime - # make checksum - - sha256sum target/release/wbuild/target/wasm32-unknown-unknown/release/*.wasm > checksum.sha256 - # clean up – FIXME: can we reuse some of the artifacts? - - cargo clean - # build again - - WASM_BUILD_NO_COLOR=1 cargo build --verbose --release -p kusama-runtime -p polkadot-runtime -p westend-runtime - # confirm checksum - - sha256sum -c checksum.sha256 - + - ./scripts/gitlab/test_deterministic_wasm.sh test-linux-stable: &test stage: test @@ -123,7 +113,7 @@ test-linux-stable: &test RUSTFLAGS: "-Cdebug-assertions=y -Dwarnings" TARGET: native script: - - time cargo test --all --release --verbose --locked --features runtime-benchmarks + - ./scripts/gitlab/test_linux_stable.sh - sccache -s check-web-wasm: &test @@ -134,14 +124,7 @@ check-web-wasm: &test script: # WASM support is in progress. As more and more crates support WASM, we # should add entries here. See https://github.com/paritytech/polkadot/issues/625 - - time cargo build --locked --target=wasm32-unknown-unknown --manifest-path runtime/polkadot/Cargo.toml - - time cargo build --locked --target=wasm32-unknown-unknown --manifest-path runtime/kusama/Cargo.toml - - time cargo build --locked --target=wasm32-unknown-unknown --manifest-path erasure-coding/Cargo.toml - - time cargo build --locked --target=wasm32-unknown-unknown --manifest-path parachain/Cargo.toml - - time cargo build --locked --target=wasm32-unknown-unknown --manifest-path primitives/Cargo.toml - - time cargo build --locked --target=wasm32-unknown-unknown --manifest-path rpc/Cargo.toml - - time cargo build --locked --target=wasm32-unknown-unknown --manifest-path statement-table/Cargo.toml - - time cargo build --locked --target=wasm32-unknown-unknown --manifest-path cli/Cargo.toml --no-default-features --features browser + - ./scripts/gitlab/check_web_wasm.sh - sccache -s check-runtime-benchmarks: &test @@ -151,7 +134,7 @@ check-runtime-benchmarks: &test <<: *compiler_info script: # Check that the node will compile with `runtime-benchmarks` feature flag. - - time cargo check --features runtime-benchmarks + - ./scripts/gitlab/check_runtime_benchmarks.sh - sccache -s build-wasm-release: diff --git a/scripts/gitlab/check_runtime.sh b/scripts/gitlab/check_runtime.sh index 30fdcd455c..0c635c8824 100755 --- a/scripts/gitlab/check_runtime.sh +++ b/scripts/gitlab/check_runtime.sh @@ -34,13 +34,13 @@ boldprint "make sure the master branch is available in shallow clones" git fetch --depth="${GIT_DEPTH:-100}" origin master runtimes=( - "kusama" - "polkadot" - "westend" + "kusama" + "polkadot" + "westend" ) common_dirs=( - "common" + "common" ) # Helper function to join elements in an array with a multi-char delimiter @@ -52,176 +52,178 @@ runtime_regex="^runtime/$(join_by '|^runtime/' "${runtimes[@]}" "${common_dirs[@ boldprint "check if the wasm sources changed since ${LATEST_TAG}" if ! git diff --name-only "refs/tags/${LATEST_TAG}...${CI_COMMIT_SHA}" \ - | grep -E -q -e "$runtime_regex" + | grep -E -q -e "$runtime_regex" then - boldprint "no changes to any runtime source code detected" - # continue checking if Cargo.lock was updated with a new substrate reference - # and if that change includes a {spec|impl}_version update. - - SUBSTRATE_REFS_CHANGED="$( - git diff "refs/tags/${LATEST_TAG}...${CI_COMMIT_SHA}" Cargo.lock \ - | sed -n -r "s~^[\+\-]source = \"${SUBSTRATE_REPO_CARGO}#([a-f0-9]+)\".*$~\1~p" | sort -u | wc -l - )" - - # check Cargo.lock for substrate ref change - case "${SUBSTRATE_REFS_CHANGED}" in - (0) - boldprint "substrate refs not changed in Cargo.lock" - exit 0 - ;; - (2) - boldprint "substrate refs updated since ${LATEST_TAG}" - ;; - (*) - boldprint "check unsupported: more than one commit targeted in repo ${SUBSTRATE_REPO_CARGO}" - exit 1 - esac - - - SUBSTRATE_PREV_REF="$( - git diff "refs/tags/${LATEST_TAG}...${CI_COMMIT_SHA}" Cargo.lock \ - | sed -n -r "s~^\-source = \"${SUBSTRATE_REPO_CARGO}#([a-f0-9]+)\".*$~\1~p" | sort -u | head -n 1 - )" - - SUBSTRATE_NEW_REF="$( - git diff "refs/tags/${LATEST_TAG}...${CI_COMMIT_SHA}" Cargo.lock \ - | sed -n -r "s~^\+source = \"${SUBSTRATE_REPO_CARGO}#([a-f0-9]+)\".*$~\1~p" | sort -u | head -n 1 - )" - - - boldcat <<-EOT - previous substrate commit id ${SUBSTRATE_PREV_REF} - new substrate commit id ${SUBSTRATE_NEW_REF} - EOT - - # okay so now need to fetch the substrate repository and check whether spec_version or impl_version has changed there - SUBSTRATE_CLONE_DIR="$(mktemp -t -d substrate-XXXXXX)" - trap 'rm -rf "${SUBSTRATE_CLONE_DIR}"' INT QUIT TERM ABRT EXIT - - git clone --depth="${GIT_DEPTH:-100}" --no-tags \ - "${SUBSTRATE_REPO}" "${SUBSTRATE_CLONE_DIR}" - - # check if there are changes to the spec|impl versions - git -C "${SUBSTRATE_CLONE_DIR}" diff \ - "${SUBSTRATE_PREV_REF}..${SUBSTRATE_NEW_REF}" "${SUBSTRATE_VERSIONS_FILE}" \ - | grep -E '^[\+\-][[:space:]]+(spec|impl)_version: +([0-9]+),$' || exit 0 - - boldcat <<-EOT - spec_version or or impl_version have changed in substrate after updating Cargo.lock - please make sure versions are bumped in polkadot accordingly - EOT - - # Now check if any of the substrate changes have been tagged D2-breaksapi - ( - cd "${SUBSTRATE_CLONE_DIR}" - substrate_changes="$(sanitised_git_logs "${SUBSTRATE_PREV_REF}" "${SUBSTRATE_NEW_REF}")" - echo "$substrate_changes" | while read -r line; do - pr_id=$(echo "$line" | sed -E 's/.*#([0-9]+)\)$/\1/') - - if has_label 'paritytech/substrate' "$pr_id" 'D2-breaksapi'; then - boldprint "Substrate change labelled with D2-breaksapi. Labelling..." - github_label "D2-breaksapi" - exit 1 - fi - done - ) + boldprint "no changes to any runtime source code detected" + # continue checking if Cargo.lock was updated with a new substrate reference + # and if that change includes a {spec|impl}_version update. + + SUBSTRATE_REFS_CHANGED="$( + git diff "refs/tags/${LATEST_TAG}...${CI_COMMIT_SHA}" Cargo.lock \ + | sed -n -r "s~^[\+\-]source = \"${SUBSTRATE_REPO_CARGO}#([a-f0-9]+)\".*$~\1~p" | sort -u | wc -l + )" + + # check Cargo.lock for substrate ref change + case "${SUBSTRATE_REFS_CHANGED}" in + (0) + boldprint "substrate refs not changed in Cargo.lock" + exit 0 + ;; + (2) + boldprint "substrate refs updated since ${LATEST_TAG}" + ;; + (*) + boldprint "check unsupported: more than one commit targeted in repo ${SUBSTRATE_REPO_CARGO}" + exit 1 + esac + + + SUBSTRATE_PREV_REF="$( + git diff "refs/tags/${LATEST_TAG}...${CI_COMMIT_SHA}" Cargo.lock \ + | sed -n -r "s~^\-source = \"${SUBSTRATE_REPO_CARGO}#([a-f0-9]+)\".*$~\1~p" | sort -u | head -n 1 + )" + + SUBSTRATE_NEW_REF="$( + git diff "refs/tags/${LATEST_TAG}...${CI_COMMIT_SHA}" Cargo.lock \ + | sed -n -r "s~^\+source = \"${SUBSTRATE_REPO_CARGO}#([a-f0-9]+)\".*$~\1~p" | sort -u | head -n 1 + )" + + + boldcat < ${add_spec_version} +changes to the ${RUNTIME} runtime sources and changes in the spec version. - EOT - continue +spec_version: ${sub_spec_version} -> ${add_spec_version} - else - # check for impl_version updates: if only the impl versions changed, we assume - # there is no consensus-critical logic that has changed. +EOT + continue - add_impl_version="$( - git diff refs/tags/"${LATEST_TAG}...${CI_COMMIT_SHA}" "runtime/${RUNTIME}/src/lib.rs" \ - | sed -n -r 's/^\+[[:space:]]+impl_version: +([0-9]+),$/\1/p' - )" - sub_impl_version="$( - git diff refs/tags/"${LATEST_TAG}...${CI_COMMIT_SHA}" "runtime/${RUNTIME}/src/lib.rs" \ - | sed -n -r 's/^\-[[:space:]]+impl_version: +([0-9]+),$/\1/p' - )" + else + # check for impl_version updates: if only the impl versions changed, we assume + # there is no consensus-critical logic that has changed. + add_impl_version="$( + git diff refs/tags/"${LATEST_TAG}...${CI_COMMIT_SHA}" "runtime/${RUNTIME}/src/lib.rs" \ + | sed -n -r 's/^\+[[:space:]]+impl_version: +([0-9]+),$/\1/p' + )" + sub_impl_version="$( + git diff refs/tags/"${LATEST_TAG}...${CI_COMMIT_SHA}" "runtime/${RUNTIME}/src/lib.rs" \ + | sed -n -r 's/^\-[[:space:]]+impl_version: +([0-9]+),$/\1/p' + )" - # see if the impl version changed - if [ "${add_impl_version}" != "${sub_impl_version}" ] - then - boldcat <<-EOT - ## RUNTIME: ${RUNTIME} ## + # see if the impl version changed + if [ "${add_impl_version}" != "${sub_impl_version}" ] + then + boldcat < ${add_impl_version} +changes to the ${RUNTIME} runtime sources and changes in the impl version. - EOT - continue - fi +impl_version: ${sub_impl_version} -> ${add_impl_version} +EOT + continue + fi - boldcat <<-EOT - wasm source files changed or the spec version in the substrate reference in - the Cargo.lock but not the spec/impl version. If changes made do not alter - logic, just bump 'impl_version'. If they do change logic, bump - 'spec_version'. + failed_runtime_checks+=("$RUNTIME") + fi +done - source file directories: - - runtime +if [ ${#failed_runtime_checks} -gt 0 ]; then + boldcat </dev/null 2>&1 && pwd )/lib.sh" + +skip_if_companion_pr + +time cargo check --features runtime-benchmarks diff --git a/scripts/gitlab/check_web_wasm.sh b/scripts/gitlab/check_web_wasm.sh new file mode 100755 index 0000000000..056e90d1e3 --- /dev/null +++ b/scripts/gitlab/check_web_wasm.sh @@ -0,0 +1,15 @@ +#!/usr/bin/env bash + +#shellcheck source=lib.sh +source "$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )/lib.sh" + +skip_if_companion_pr + +time cargo build --locked --target=wasm32-unknown-unknown --manifest-path runtime/polkadot/Cargo.toml +time cargo build --locked --target=wasm32-unknown-unknown --manifest-path runtime/kusama/Cargo.toml +time cargo build --locked --target=wasm32-unknown-unknown --manifest-path erasure-coding/Cargo.toml +time cargo build --locked --target=wasm32-unknown-unknown --manifest-path parachain/Cargo.toml +time cargo build --locked --target=wasm32-unknown-unknown --manifest-path primitives/Cargo.toml +time cargo build --locked --target=wasm32-unknown-unknown --manifest-path rpc/Cargo.toml +time cargo build --locked --target=wasm32-unknown-unknown --manifest-path statement-table/Cargo.toml +time cargo build --locked --target=wasm32-unknown-unknown --manifest-path cli/Cargo.toml --no-default-features --features browser diff --git a/scripts/gitlab/lib.sh b/scripts/gitlab/lib.sh index ab2e7c86f6..993cab35e3 100755 --- a/scripts/gitlab/lib.sh +++ b/scripts/gitlab/lib.sh @@ -96,3 +96,18 @@ curl -XPOST -d "$1" "https://matrix.parity.io/_matrix/client/r0/rooms/$2/send/m. # Pretty-printing functions boldprint () { printf "|\n| \033[1m%s\033[0m\n|\n" "${@}"; } boldcat () { printf "|\n"; while read -r l; do printf "| \033[1m%s\033[0m\n" "${l}"; done; printf "|\n" ; } + +skip_if_companion_pr() { + url="https://api.github.com/repos/paritytech/polkadot/pulls/${CI_COMMIT_REF_NAME}" + echo "[+] API URL: $url" + + pr_title=$(curl -sSL -H "Authorization: token ${GITHUB_PR_TOKEN}" "$url" | jq -r .title) + echo "[+] PR title: $pr_title" + + if echo "$pr_title" | grep -qi '^companion'; then + echo "[!] PR is a companion PR. Build is already done in substrate" + exit 0 + else + echo "[+] PR is not a companion PR. Proceeding test" + fi +} diff --git a/scripts/gitlab/test_deterministic_wasm.sh b/scripts/gitlab/test_deterministic_wasm.sh new file mode 100755 index 0000000000..f2bf2a4f05 --- /dev/null +++ b/scripts/gitlab/test_deterministic_wasm.sh @@ -0,0 +1,17 @@ +#!/usr/bin/env bash + +#shellcheck source=lib.sh +source "$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )/lib.sh" + +skip_if_companion_pr + +# build runtime +WASM_BUILD_NO_COLOR=1 cargo build --verbose --release -p kusama-runtime -p polkadot-runtime -p westend-runtime +# make checksum +sha256sum target/release/wbuild/target/wasm32-unknown-unknown/release/*.wasm > checksum.sha256 +# clean up - FIXME: can we reuse some of the artifacts? +cargo clean +# build again +WASM_BUILD_NO_COLOR=1 cargo build --verbose --release -p kusama-runtime -p polkadot-runtime -p westend-runtime +# confirm checksum +sha256sum -c checksum.sha256 diff --git a/scripts/gitlab/test_linux_stable.sh b/scripts/gitlab/test_linux_stable.sh new file mode 100755 index 0000000000..f523e24434 --- /dev/null +++ b/scripts/gitlab/test_linux_stable.sh @@ -0,0 +1,8 @@ +#!/usr/bin/env bash + +#shellcheck source=lib.sh +source "$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )/lib.sh" + +skip_if_companion_pr + +time cargo test --all --release --verbose --locked --features runtime-benchmarks -- GitLab From 9c04ebb5660634b72cd950dd53e10c9d8c1928ac Mon Sep 17 00:00:00 2001 From: Cecile Tonglet Date: Thu, 6 Aug 2020 10:15:21 +0200 Subject: [PATCH 152/192] Add SyncOracle to network's Service (#1543) * WIP * WIP Forked at: e91642361133dba084a9c9b3efa45fcb6cd3c5ca Parent branch: origin/rococo-branch * WIP Forked at: e91642361133dba084a9c9b3efa45fcb6cd3c5ca Parent branch: origin/rococo-branch * Apply suggestions from code review * Update collator/src/lib.rs * Update collator/src/lib.rs * Update network/src/protocol/mod.rs --- Cargo.lock | 1 + collator/src/lib.rs | 9 +++++---- network/Cargo.toml | 1 + network/src/protocol/mod.rs | 10 ++++++++++ 4 files changed, 17 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index c5510f3bc3..b71a6dfc32 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4532,6 +4532,7 @@ dependencies = [ "sc-network-gossip", "sp-api", "sp-blockchain", + "sp-consensus", "sp-core", "sp-keyring", "sp-runtime", diff --git a/collator/src/lib.rs b/collator/src/lib.rs index cfe4000513..070740bf7f 100644 --- a/collator/src/lib.rs +++ b/collator/src/lib.rs @@ -76,6 +76,7 @@ use polkadot_service_new::{ use sc_service::SpawnTaskHandle; use sp_core::traits::SpawnNamed; use sp_runtime::traits::BlakeTwo256; +use consensus_common::SyncOracle; const COLLATION_TIMEOUT: Duration = Duration::from_secs(30); @@ -120,7 +121,7 @@ pub trait BuildParachainContext { self, client: polkadot_service::Client, spawner: SP, - network: impl Network + Clone + 'static, + network: impl Network + SyncOracle + Clone + 'static, ) -> Result where SP: SpawnNamed + Clone + Send + Sync + 'static; @@ -391,7 +392,7 @@ where .into()); } - let (task_manager, client, handlers) = polkadot_service::build_full( + let (task_manager, client, handles) = polkadot_service::build_full( config, Some((key.public(), para_id)), None, @@ -402,11 +403,11 @@ where let future = build_collator_service( task_manager.spawn_handle(), - handlers, + handles, client, para_id, key, - build_parachain_context + build_parachain_context, )?; Ok((future, task_manager)) diff --git a/network/Cargo.toml b/network/Cargo.toml index 6685bbb382..748bc20c09 100644 --- a/network/Cargo.toml +++ b/network/Cargo.toml @@ -17,6 +17,7 @@ polkadot-erasure-coding = { path = "../erasure-coding" } codec = { package = "parity-scale-codec", version = "1.3.4", default-features = false, features = ["derive"] } sc-network = { git = "https://github.com/paritytech/substrate", branch = "master" } sc-network-gossip = { git = "https://github.com/paritytech/substrate", branch = "master" } +sp-consensus = { git = "https://github.com/paritytech/substrate", branch = "master" } sp-core = { git = "https://github.com/paritytech/substrate", branch = "master" } sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "master" } futures = "0.3.5" diff --git a/network/src/protocol/mod.rs b/network/src/protocol/mod.rs index 6dfef09da8..2626a5a373 100644 --- a/network/src/protocol/mod.rs +++ b/network/src/protocol/mod.rs @@ -1488,6 +1488,16 @@ impl av_store::ErasureNetworking for Service { } } +impl sp_consensus::SyncOracle for Service where for<'r> &'r N: sp_consensus::SyncOracle { + fn is_major_syncing(&mut self) -> bool { + self.network_service.is_major_syncing() + } + + fn is_offline(&mut self) -> bool { + self.network_service.is_offline() + } +} + /// Errors when interacting with the statement router. #[derive(Debug, derive_more::Display, derive_more::From)] pub enum RouterError { -- GitLab From 3487a93ce6dcedef69d926ee2126554267d3eb87 Mon Sep 17 00:00:00 2001 From: Pierre Krieger Date: Thu, 6 Aug 2020 14:30:19 +0200 Subject: [PATCH 153/192] Companion PR to delaying network startup to after initialization (#1547) --- node/service/src/lib.rs | 8 ++++++-- service/src/lib.rs | 8 ++++++-- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/node/service/src/lib.rs b/node/service/src/lib.rs index 836e3f06f0..bb60eed9c6 100644 --- a/node/service/src/lib.rs +++ b/node/service/src/lib.rs @@ -335,7 +335,7 @@ fn new_full( let finality_proof_provider = GrandpaFinalityProofProvider::new_for_service(backend.clone(), client.clone()); - let (network, network_status_sinks, system_rpc_tx) = + let (network, network_status_sinks, system_rpc_tx, network_starter) = service::build_network(service::BuildNetworkParams { config: &config, client: client.clone(), @@ -512,6 +512,8 @@ fn new_full( )?; } + network_starter.start_network(); + Ok((task_manager, client)) } @@ -574,7 +576,7 @@ fn new_light(mut config: Configuration) -> Result(mut config: Configuration) -> Result( let finality_proof_provider = GrandpaFinalityProofProvider::new_for_service(backend.clone(), client.clone()); - let (network, network_status_sinks, system_rpc_tx) = + let (network, network_status_sinks, system_rpc_tx, network_starter) = service::build_network(service::BuildNetworkParams { config: &config, client: client.clone(), @@ -555,6 +555,8 @@ pub fn new_full( )?; } + network_starter.start_network(); + handles.polkadot_network = Some(polkadot_network_service); Ok((task_manager, client, handles, network, rpc_handlers)) } @@ -620,7 +622,7 @@ fn new_light(mut config: Configuration) -> Result<(TaskManage let finality_proof_provider = GrandpaFinalityProofProvider::new_for_service(backend.clone(), client.clone()); - let (network, network_status_sinks, system_rpc_tx) = + let (network, network_status_sinks, system_rpc_tx, network_starter) = service::build_network(service::BuildNetworkParams { config: &config, client: client.clone(), @@ -658,6 +660,8 @@ fn new_light(mut config: Configuration) -> Result<(TaskManage system_rpc_tx, })?; + network_starter.start_network(); + Ok((task_manager, rpc_handlers)) } -- GitLab From c6ee86756b61800159b1b5f09bd048af99a618fe Mon Sep 17 00:00:00 2001 From: Gavin Wood Date: Thu, 6 Aug 2020 15:42:05 +0200 Subject: [PATCH 154/192] Bump Substrate (#1548) * Bump Substrate * Bumb substrate again Co-authored-by: Ashley Ruglys --- Cargo.lock | 404 ++++++++++++++++++----------------------------------- 1 file changed, 137 insertions(+), 267 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index b71a6dfc32..6c853480ca 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -25,12 +25,6 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ccc9a9dd069569f212bc4330af9f17c4afb5e8ce185e83dbb14f1349dda18b10" -[[package]] -name = "adler32" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567b077b825e468cc974f0020d4082ee6e03132512f207ef1a02fd5d00d1f32d" - [[package]] name = "aead" version = "0.3.2" @@ -1125,17 +1119,6 @@ version = "1.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bb1f6b1ce1c140482ea30ddd3335fc0024ac7ee112895426e0a629a6c20adfe3" -[[package]] -name = "enum-primitive-derive" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2b90e520ec62c1864c8c78d637acbfe8baf5f63240f2fb8165b8325c07812dd" -dependencies = [ - "num-traits 0.1.43", - "quote 0.3.15", - "syn 0.11.11", -] - [[package]] name = "enum_primitive" version = "0.1.1" @@ -1370,7 +1353,7 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "fork-tree" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" +source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" dependencies = [ "parity-scale-codec", ] @@ -1378,7 +1361,7 @@ dependencies = [ [[package]] name = "frame-benchmarking" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" +source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" dependencies = [ "frame-support", "frame-system", @@ -1395,7 +1378,7 @@ dependencies = [ [[package]] name = "frame-benchmarking-cli" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" +source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" dependencies = [ "frame-benchmarking", "parity-scale-codec", @@ -1413,7 +1396,7 @@ dependencies = [ [[package]] name = "frame-executive" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" +source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" dependencies = [ "frame-support", "frame-system", @@ -1428,7 +1411,7 @@ dependencies = [ [[package]] name = "frame-metadata" version = "11.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" +source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" dependencies = [ "parity-scale-codec", "serde", @@ -1439,7 +1422,7 @@ dependencies = [ [[package]] name = "frame-support" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" +source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" dependencies = [ "bitmask", "frame-metadata", @@ -1464,7 +1447,7 @@ dependencies = [ [[package]] name = "frame-support-procedural" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" +source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" dependencies = [ "frame-support-procedural-tools", "proc-macro2 1.0.18", @@ -1475,7 +1458,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" +source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" dependencies = [ "frame-support-procedural-tools-derive", "proc-macro-crate", @@ -1487,7 +1470,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools-derive" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" +source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" dependencies = [ "proc-macro2 1.0.18", "quote 1.0.7", @@ -1497,7 +1480,7 @@ dependencies = [ [[package]] name = "frame-system" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" +source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" dependencies = [ "frame-support", "impl-trait-for-tuples", @@ -1513,7 +1496,7 @@ dependencies = [ [[package]] name = "frame-system-benchmarking" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" +source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" dependencies = [ "frame-benchmarking", "frame-support", @@ -1527,7 +1510,7 @@ dependencies = [ [[package]] name = "frame-system-rpc-runtime-api" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" +source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" dependencies = [ "parity-scale-codec", "sp-api", @@ -2639,24 +2622,6 @@ version = "0.2.72" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a9f8082297d534141b30c8d39e9b1773713ab50fdbe4ff30f750d063b3bfd701" -[[package]] -name = "libflate" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9bac9023e1db29c084f9f8cd9d3852e5e8fddf98fb47c4964a0ea4663d95949" -dependencies = [ - "adler32", - "crc32fast", - "libflate_lz77", - "rle-decode-fast", -] - -[[package]] -name = "libflate_lz77" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3286f09f7d4926fc486334f28d8d2e6ebe4f7f9994494b6dab27ddfad2c9b11b" - [[package]] name = "libloading" version = "0.5.2" @@ -3341,20 +3306,6 @@ dependencies = [ "winapi 0.3.9", ] -[[package]] -name = "netstat2" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29449d242064c48d3057a194b049a2bdcccadda16faa18a91468677b44e8d422" -dependencies = [ - "bitflags", - "byteorder", - "enum-primitive-derive", - "libc", - "num-traits 0.2.12", - "thiserror", -] - [[package]] name = "nix" version = "0.10.0" @@ -3404,15 +3355,6 @@ dependencies = [ "version_check", ] -[[package]] -name = "ntapi" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a31937dea023539c72ddae0e3571deadc1414b300483fa7aaec176168cfa9d2" -dependencies = [ - "winapi 0.3.9", -] - [[package]] name = "num-bigint" version = "0.2.6" @@ -3541,7 +3483,7 @@ dependencies = [ [[package]] name = "pallet-authority-discovery" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" +source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" dependencies = [ "frame-support", "frame-system", @@ -3557,7 +3499,7 @@ dependencies = [ [[package]] name = "pallet-authorship" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" +source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" dependencies = [ "frame-support", "frame-system", @@ -3572,7 +3514,7 @@ dependencies = [ [[package]] name = "pallet-babe" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" +source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" dependencies = [ "frame-benchmarking", "frame-support", @@ -3597,7 +3539,7 @@ dependencies = [ [[package]] name = "pallet-balances" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" +source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" dependencies = [ "frame-benchmarking", "frame-support", @@ -3611,7 +3553,7 @@ dependencies = [ [[package]] name = "pallet-collective" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" +source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" dependencies = [ "frame-benchmarking", "frame-support", @@ -3627,7 +3569,7 @@ dependencies = [ [[package]] name = "pallet-democracy" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" +source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" dependencies = [ "frame-benchmarking", "frame-support", @@ -3642,7 +3584,7 @@ dependencies = [ [[package]] name = "pallet-elections-phragmen" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" +source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" dependencies = [ "frame-benchmarking", "frame-support", @@ -3657,7 +3599,7 @@ dependencies = [ [[package]] name = "pallet-finality-tracker" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" +source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" dependencies = [ "frame-support", "frame-system", @@ -3673,7 +3615,7 @@ dependencies = [ [[package]] name = "pallet-grandpa" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" +source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" dependencies = [ "frame-benchmarking", "frame-support", @@ -3695,7 +3637,7 @@ dependencies = [ [[package]] name = "pallet-identity" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" +source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" dependencies = [ "enumflags2", "frame-benchmarking", @@ -3711,7 +3653,7 @@ dependencies = [ [[package]] name = "pallet-im-online" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" +source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" dependencies = [ "frame-benchmarking", "frame-support", @@ -3731,7 +3673,7 @@ dependencies = [ [[package]] name = "pallet-indices" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" +source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" dependencies = [ "frame-support", "frame-system", @@ -3747,7 +3689,7 @@ dependencies = [ [[package]] name = "pallet-membership" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" +source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" dependencies = [ "frame-support", "frame-system", @@ -3761,7 +3703,7 @@ dependencies = [ [[package]] name = "pallet-multisig" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" +source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" dependencies = [ "frame-support", "frame-system", @@ -3776,7 +3718,7 @@ dependencies = [ [[package]] name = "pallet-nicks" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" +source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" dependencies = [ "frame-support", "frame-system", @@ -3790,7 +3732,7 @@ dependencies = [ [[package]] name = "pallet-offences" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" +source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" dependencies = [ "frame-support", "frame-system", @@ -3805,7 +3747,7 @@ dependencies = [ [[package]] name = "pallet-offences-benchmarking" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" +source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" dependencies = [ "frame-benchmarking", "frame-support", @@ -3826,7 +3768,7 @@ dependencies = [ [[package]] name = "pallet-proxy" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" +source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" dependencies = [ "frame-support", "frame-system", @@ -3841,7 +3783,7 @@ dependencies = [ [[package]] name = "pallet-randomness-collective-flip" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" +source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" dependencies = [ "frame-support", "frame-system", @@ -3854,7 +3796,7 @@ dependencies = [ [[package]] name = "pallet-recovery" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" +source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" dependencies = [ "enumflags2", "frame-support", @@ -3869,7 +3811,7 @@ dependencies = [ [[package]] name = "pallet-scheduler" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" +source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" dependencies = [ "frame-benchmarking", "frame-support", @@ -3884,7 +3826,7 @@ dependencies = [ [[package]] name = "pallet-session" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" +source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" dependencies = [ "frame-support", "frame-system", @@ -3904,7 +3846,7 @@ dependencies = [ [[package]] name = "pallet-session-benchmarking" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" +source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" dependencies = [ "frame-benchmarking", "frame-support", @@ -3920,7 +3862,7 @@ dependencies = [ [[package]] name = "pallet-society" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" +source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" dependencies = [ "frame-support", "frame-system", @@ -3934,7 +3876,7 @@ dependencies = [ [[package]] name = "pallet-staking" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" +source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" dependencies = [ "frame-benchmarking", "frame-support", @@ -3956,7 +3898,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-curve" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" +source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -3967,7 +3909,7 @@ dependencies = [ [[package]] name = "pallet-sudo" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" +source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" dependencies = [ "frame-support", "frame-system", @@ -3981,7 +3923,7 @@ dependencies = [ [[package]] name = "pallet-timestamp" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" +source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" dependencies = [ "frame-benchmarking", "frame-support", @@ -3999,7 +3941,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" +source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" dependencies = [ "frame-support", "frame-system", @@ -4016,7 +3958,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" +source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" dependencies = [ "jsonrpc-core", "jsonrpc-core-client", @@ -4034,7 +3976,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc-runtime-api" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" +source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" dependencies = [ "frame-support", "parity-scale-codec", @@ -4047,7 +3989,7 @@ dependencies = [ [[package]] name = "pallet-treasury" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" +source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" dependencies = [ "frame-benchmarking", "frame-support", @@ -4062,7 +4004,7 @@ dependencies = [ [[package]] name = "pallet-utility" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" +source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" dependencies = [ "frame-benchmarking", "frame-support", @@ -4078,7 +4020,7 @@ dependencies = [ [[package]] name = "pallet-vesting" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" +source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" dependencies = [ "enumflags2", "frame-benchmarking", @@ -5469,21 +5411,6 @@ dependencies = [ "unicode-xid 0.2.1", ] -[[package]] -name = "procfs" -version = "0.7.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c434e93ef69c216e68e4f417c927b4f31502c3560b72cfdb6827e2321c5c6b3e" -dependencies = [ - "bitflags", - "byteorder", - "chrono", - "hex", - "lazy_static", - "libc", - "libflate", -] - [[package]] name = "prometheus" version = "0.9.0" @@ -5565,12 +5492,6 @@ dependencies = [ "pin-project-lite", ] -[[package]] -name = "quote" -version = "0.3.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a6e920b65c65f10b2ae65c831a81a073a89edd28c7cce89475bff467ab4167a" - [[package]] name = "quote" version = "0.6.13" @@ -5978,12 +5899,6 @@ dependencies = [ "winapi 0.3.9", ] -[[package]] -name = "rle-decode-fast" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cabe4fa914dec5870285fa7f71f602645da47c486e68486d2b4ceb4a343e90ac" - [[package]] name = "rocksdb" version = "0.14.0" @@ -6225,7 +6140,7 @@ dependencies = [ [[package]] name = "sc-authority-discovery" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" +source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" dependencies = [ "bytes 0.5.5", "derive_more 0.99.9", @@ -6252,7 +6167,7 @@ dependencies = [ [[package]] name = "sc-basic-authorship" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" +source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6276,7 +6191,7 @@ dependencies = [ [[package]] name = "sc-block-builder" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" +source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" dependencies = [ "parity-scale-codec", "sc-client-api", @@ -6293,7 +6208,7 @@ dependencies = [ [[package]] name = "sc-chain-spec" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" +source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" dependencies = [ "impl-trait-for-tuples", "sc-chain-spec-derive", @@ -6309,7 +6224,7 @@ dependencies = [ [[package]] name = "sc-chain-spec-derive" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" +source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -6320,7 +6235,7 @@ dependencies = [ [[package]] name = "sc-cli" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" +source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" dependencies = [ "ansi_term 0.12.1", "atty", @@ -6361,7 +6276,7 @@ dependencies = [ [[package]] name = "sc-client-api" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" +source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" dependencies = [ "derive_more 0.99.9", "fnv", @@ -6397,7 +6312,7 @@ dependencies = [ [[package]] name = "sc-client-db" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" +source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" dependencies = [ "blake2-rfc", "hash-db", @@ -6427,7 +6342,7 @@ dependencies = [ [[package]] name = "sc-consensus" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" +source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" dependencies = [ "sc-client-api", "sp-blockchain", @@ -6438,7 +6353,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" +source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" dependencies = [ "derive_more 0.99.9", "fork-tree", @@ -6482,7 +6397,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe-rpc" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" +source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -6506,7 +6421,7 @@ dependencies = [ [[package]] name = "sc-consensus-epochs" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" +source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" dependencies = [ "fork-tree", "parity-scale-codec", @@ -6519,7 +6434,7 @@ dependencies = [ [[package]] name = "sc-consensus-slots" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" +source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6542,7 +6457,7 @@ dependencies = [ [[package]] name = "sc-consensus-uncles" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" +source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" dependencies = [ "log 0.4.8", "sc-client-api", @@ -6556,7 +6471,7 @@ dependencies = [ [[package]] name = "sc-executor" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" +source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" dependencies = [ "derive_more 0.99.9", "lazy_static", @@ -6584,7 +6499,7 @@ dependencies = [ [[package]] name = "sc-executor-common" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" +source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" dependencies = [ "derive_more 0.99.9", "log 0.4.8", @@ -6601,7 +6516,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmi" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" +source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" dependencies = [ "log 0.4.8", "parity-scale-codec", @@ -6616,7 +6531,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmtime" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" +source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" dependencies = [ "cranelift-codegen", "cranelift-wasm", @@ -6637,9 +6552,8 @@ dependencies = [ [[package]] name = "sc-finality-grandpa" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" +source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" dependencies = [ - "assert_matches", "derive_more 0.99.9", "finality-grandpa", "fork-tree", @@ -6675,7 +6589,7 @@ dependencies = [ [[package]] name = "sc-finality-grandpa-rpc" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" +source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" dependencies = [ "derive_more 0.99.9", "finality-grandpa", @@ -6692,7 +6606,7 @@ dependencies = [ [[package]] name = "sc-informant" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" +source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" dependencies = [ "ansi_term 0.12.1", "futures 0.3.5", @@ -6710,7 +6624,7 @@ dependencies = [ [[package]] name = "sc-keystore" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" +source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" dependencies = [ "derive_more 0.99.9", "hex", @@ -6726,7 +6640,7 @@ dependencies = [ [[package]] name = "sc-light" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" +source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" dependencies = [ "hash-db", "lazy_static", @@ -6745,7 +6659,7 @@ dependencies = [ [[package]] name = "sc-network" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" +source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" dependencies = [ "bitflags", "bs58", @@ -6797,7 +6711,7 @@ dependencies = [ [[package]] name = "sc-network-gossip" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" +source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6812,7 +6726,7 @@ dependencies = [ [[package]] name = "sc-network-test" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" +source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" dependencies = [ "env_logger", "futures 0.3.5", @@ -6839,7 +6753,7 @@ dependencies = [ [[package]] name = "sc-offchain" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" +source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" dependencies = [ "bytes 0.5.5", "fnv", @@ -6866,7 +6780,7 @@ dependencies = [ [[package]] name = "sc-peerset" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" +source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" dependencies = [ "futures 0.3.5", "libp2p", @@ -6879,7 +6793,7 @@ dependencies = [ [[package]] name = "sc-proposer-metrics" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" +source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" dependencies = [ "log 0.4.8", "substrate-prometheus-endpoint", @@ -6888,7 +6802,7 @@ dependencies = [ [[package]] name = "sc-rpc" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" +source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" dependencies = [ "futures 0.3.5", "hash-db", @@ -6920,7 +6834,7 @@ dependencies = [ [[package]] name = "sc-rpc-api" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" +source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -6944,7 +6858,7 @@ dependencies = [ [[package]] name = "sc-rpc-server" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" +source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" dependencies = [ "jsonrpc-core", "jsonrpc-http-server", @@ -6960,7 +6874,7 @@ dependencies = [ [[package]] name = "sc-service" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" +source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" dependencies = [ "derive_more 0.99.9", "directories", @@ -6972,12 +6886,10 @@ dependencies = [ "jsonrpc-pubsub", "lazy_static", "log 0.4.8", - "netstat2", "parity-scale-codec", "parity-util-mem", "parking_lot 0.10.2", "pin-project", - "procfs", "rand 0.7.3", "sc-block-builder", "sc-chain-spec", @@ -7014,7 +6926,6 @@ dependencies = [ "sp-utils", "sp-version", "substrate-prometheus-endpoint", - "sysinfo", "tempfile", "tracing", "wasm-timer", @@ -7023,7 +6934,7 @@ dependencies = [ [[package]] name = "sc-state-db" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" +source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" dependencies = [ "log 0.4.8", "parity-scale-codec", @@ -7037,7 +6948,7 @@ dependencies = [ [[package]] name = "sc-telemetry" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" +source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -7058,7 +6969,7 @@ dependencies = [ [[package]] name = "sc-tracing" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" +source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" dependencies = [ "erased-serde", "log 0.4.8", @@ -7075,7 +6986,7 @@ dependencies = [ [[package]] name = "sc-transaction-graph" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" +source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -7096,7 +7007,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" +source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -7551,7 +7462,7 @@ dependencies = [ [[package]] name = "sp-allocator" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" +source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" dependencies = [ "derive_more 0.99.9", "log 0.4.8", @@ -7563,7 +7474,7 @@ dependencies = [ [[package]] name = "sp-api" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" +source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" dependencies = [ "hash-db", "parity-scale-codec", @@ -7578,7 +7489,7 @@ dependencies = [ [[package]] name = "sp-api-proc-macro" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" +source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" dependencies = [ "blake2-rfc", "proc-macro-crate", @@ -7590,7 +7501,7 @@ dependencies = [ [[package]] name = "sp-application-crypto" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" +source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" dependencies = [ "parity-scale-codec", "serde", @@ -7602,7 +7513,7 @@ dependencies = [ [[package]] name = "sp-arithmetic" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" +source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" dependencies = [ "integer-sqrt", "num-traits 0.2.12", @@ -7615,7 +7526,7 @@ dependencies = [ [[package]] name = "sp-authority-discovery" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" +source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" dependencies = [ "parity-scale-codec", "sp-api", @@ -7627,7 +7538,7 @@ dependencies = [ [[package]] name = "sp-authorship" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" +source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" dependencies = [ "parity-scale-codec", "sp-inherents", @@ -7638,7 +7549,7 @@ dependencies = [ [[package]] name = "sp-block-builder" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" +source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" dependencies = [ "parity-scale-codec", "sp-api", @@ -7650,7 +7561,7 @@ dependencies = [ [[package]] name = "sp-blockchain" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" +source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" dependencies = [ "derive_more 0.99.9", "log 0.4.8", @@ -7667,7 +7578,7 @@ dependencies = [ [[package]] name = "sp-chain-spec" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" +source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" dependencies = [ "serde", "serde_json", @@ -7676,7 +7587,7 @@ dependencies = [ [[package]] name = "sp-consensus" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" +source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -7702,7 +7613,7 @@ dependencies = [ [[package]] name = "sp-consensus-aura" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" +source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" dependencies = [ "parity-scale-codec", "sp-api", @@ -7716,7 +7627,7 @@ dependencies = [ [[package]] name = "sp-consensus-babe" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" +source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" dependencies = [ "merlin", "parity-scale-codec", @@ -7735,7 +7646,7 @@ dependencies = [ [[package]] name = "sp-consensus-slots" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" +source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" dependencies = [ "parity-scale-codec", "sp-runtime", @@ -7744,7 +7655,7 @@ dependencies = [ [[package]] name = "sp-consensus-vrf" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" +source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" dependencies = [ "parity-scale-codec", "schnorrkel", @@ -7756,7 +7667,7 @@ dependencies = [ [[package]] name = "sp-core" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" +source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" dependencies = [ "base58", "blake2-rfc", @@ -7800,7 +7711,7 @@ dependencies = [ [[package]] name = "sp-database" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" +source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" dependencies = [ "kvdb", "parking_lot 0.10.2", @@ -7809,7 +7720,7 @@ dependencies = [ [[package]] name = "sp-debug-derive" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" +source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" dependencies = [ "proc-macro2 1.0.18", "quote 1.0.7", @@ -7819,7 +7730,7 @@ dependencies = [ [[package]] name = "sp-externalities" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" +source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" dependencies = [ "environmental", "parity-scale-codec", @@ -7830,7 +7741,7 @@ dependencies = [ [[package]] name = "sp-finality-grandpa" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" +source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" dependencies = [ "finality-grandpa", "log 0.4.8", @@ -7846,7 +7757,7 @@ dependencies = [ [[package]] name = "sp-finality-tracker" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" +source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" dependencies = [ "parity-scale-codec", "sp-inherents", @@ -7856,7 +7767,7 @@ dependencies = [ [[package]] name = "sp-inherents" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" +source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" dependencies = [ "derive_more 0.99.9", "parity-scale-codec", @@ -7868,7 +7779,7 @@ dependencies = [ [[package]] name = "sp-io" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" +source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" dependencies = [ "futures 0.3.5", "hash-db", @@ -7889,7 +7800,7 @@ dependencies = [ [[package]] name = "sp-keyring" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" +source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" dependencies = [ "lazy_static", "sp-core", @@ -7900,7 +7811,7 @@ dependencies = [ [[package]] name = "sp-npos-elections" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" +source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" dependencies = [ "parity-scale-codec", "serde", @@ -7912,7 +7823,7 @@ dependencies = [ [[package]] name = "sp-npos-elections-compact" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" +source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -7923,7 +7834,7 @@ dependencies = [ [[package]] name = "sp-offchain" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" +source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" dependencies = [ "sp-api", "sp-core", @@ -7933,7 +7844,7 @@ dependencies = [ [[package]] name = "sp-panic-handler" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" +source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" dependencies = [ "backtrace", "log 0.4.8", @@ -7942,7 +7853,7 @@ dependencies = [ [[package]] name = "sp-rpc" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" +source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" dependencies = [ "serde", "sp-core", @@ -7951,7 +7862,7 @@ dependencies = [ [[package]] name = "sp-runtime" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" +source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" dependencies = [ "either", "hash256-std-hasher", @@ -7973,7 +7884,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" +source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" dependencies = [ "parity-scale-codec", "primitive-types", @@ -7988,7 +7899,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" +source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" dependencies = [ "Inflector", "proc-macro-crate", @@ -8000,7 +7911,7 @@ dependencies = [ [[package]] name = "sp-serializer" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" +source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" dependencies = [ "serde", "serde_json", @@ -8009,7 +7920,7 @@ dependencies = [ [[package]] name = "sp-session" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" +source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" dependencies = [ "parity-scale-codec", "sp-api", @@ -8022,7 +7933,7 @@ dependencies = [ [[package]] name = "sp-staking" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" +source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" dependencies = [ "parity-scale-codec", "sp-runtime", @@ -8032,7 +7943,7 @@ dependencies = [ [[package]] name = "sp-state-machine" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" +source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" dependencies = [ "hash-db", "itertools 0.9.0", @@ -8053,12 +7964,12 @@ dependencies = [ [[package]] name = "sp-std" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" +source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" [[package]] name = "sp-storage" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" +source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" dependencies = [ "impl-serde 0.2.3", "ref-cast", @@ -8070,7 +7981,7 @@ dependencies = [ [[package]] name = "sp-timestamp" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" +source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -8084,7 +7995,7 @@ dependencies = [ [[package]] name = "sp-tracing" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" +source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" dependencies = [ "log 0.4.8", "rental", @@ -8094,7 +8005,7 @@ dependencies = [ [[package]] name = "sp-transaction-pool" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" +source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -8109,7 +8020,7 @@ dependencies = [ [[package]] name = "sp-trie" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" +source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" dependencies = [ "hash-db", "memory-db", @@ -8123,7 +8034,7 @@ dependencies = [ [[package]] name = "sp-utils" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" +source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" dependencies = [ "futures 0.3.5", "futures-core", @@ -8135,7 +8046,7 @@ dependencies = [ [[package]] name = "sp-version" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" +source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" dependencies = [ "impl-serde 0.2.3", "parity-scale-codec", @@ -8147,7 +8058,7 @@ dependencies = [ [[package]] name = "sp-wasm-interface" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" +source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -8278,7 +8189,7 @@ dependencies = [ [[package]] name = "substrate-browser-utils" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" +source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" dependencies = [ "chrono", "console_error_panic_hook", @@ -8304,7 +8215,7 @@ dependencies = [ [[package]] name = "substrate-build-script-utils" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" +source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" dependencies = [ "platforms", ] @@ -8312,7 +8223,7 @@ dependencies = [ [[package]] name = "substrate-frame-rpc-system" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" +source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" dependencies = [ "frame-system-rpc-runtime-api", "futures 0.3.5", @@ -8335,7 +8246,7 @@ dependencies = [ [[package]] name = "substrate-prometheus-endpoint" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" +source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" dependencies = [ "async-std", "derive_more 0.99.9", @@ -8349,7 +8260,7 @@ dependencies = [ [[package]] name = "substrate-test-client" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" +source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" dependencies = [ "futures 0.1.29", "futures 0.3.5", @@ -8375,7 +8286,7 @@ dependencies = [ [[package]] name = "substrate-test-runtime" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" +source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" dependencies = [ "cfg-if", "frame-executive", @@ -8415,7 +8326,7 @@ dependencies = [ [[package]] name = "substrate-test-runtime-client" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" +source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" dependencies = [ "futures 0.3.5", "parity-scale-codec", @@ -8436,7 +8347,7 @@ dependencies = [ [[package]] name = "substrate-wasm-builder-runner" version = "1.0.6" -source = "git+https://github.com/paritytech/substrate#b8ffd568b3cf7a0f5bcd0776398767082d18792d" +source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" [[package]] name = "substrate-wasm-builder-runner" @@ -8481,17 +8392,6 @@ version = "2.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "502d53007c02d7605a05df1c1a73ee436952781653da5d0bf57ad608f66932c1" -[[package]] -name = "syn" -version = "0.11.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3b891b9015c88c576343b9b3e41c2c11a51c219ef067b264bd9c8aa9b441dad" -dependencies = [ - "quote 0.3.15", - "synom", - "unicode-xid 0.0.4", -] - [[package]] name = "syn" version = "0.15.44" @@ -8525,15 +8425,6 @@ dependencies = [ "syn 1.0.33", ] -[[package]] -name = "synom" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a393066ed9010ebaed60b9eafa373d4b1baac186dd7e008555b0f702b51945b6" -dependencies = [ - "unicode-xid 0.0.4", -] - [[package]] name = "synstructure" version = "0.12.4" @@ -8546,21 +8437,6 @@ dependencies = [ "unicode-xid 0.2.1", ] -[[package]] -name = "sysinfo" -version = "0.14.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2983daff11a197c7c406b130579bc362177aa54cf2cc1f34d6ac88fccaa6a5e1" -dependencies = [ - "cfg-if", - "doc-comment", - "libc", - "ntapi", - "once_cell", - "rayon", - "winapi 0.3.9", -] - [[package]] name = "take_mut" version = "0.2.2" @@ -9208,12 +9084,6 @@ version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9337591893a19b88d8d87f2cec1e73fad5cdfd10e5a6f349f498ad6ea2ffb1e3" -[[package]] -name = "unicode-xid" -version = "0.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c1f860d7d29cf02cb2f3f359fd35991af3d30bac52c57d265a3c461074cb4dc" - [[package]] name = "unicode-xid" version = "0.1.0" -- GitLab From c1b96c459fb75bba1124ab2d1222ccc1f7ac7f09 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Thu, 6 Aug 2020 17:08:06 +0200 Subject: [PATCH 155/192] Revert "Ignore checks for companion PRs (#1455)" (#1549) --- scripts/gitlab/check_runtime_benchmarks.sh | 2 -- scripts/gitlab/check_web_wasm.sh | 2 -- scripts/gitlab/test_deterministic_wasm.sh | 2 -- scripts/gitlab/test_linux_stable.sh | 2 -- 4 files changed, 8 deletions(-) diff --git a/scripts/gitlab/check_runtime_benchmarks.sh b/scripts/gitlab/check_runtime_benchmarks.sh index 6714279d5e..d215106ef2 100755 --- a/scripts/gitlab/check_runtime_benchmarks.sh +++ b/scripts/gitlab/check_runtime_benchmarks.sh @@ -3,6 +3,4 @@ #shellcheck source=lib.sh source "$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )/lib.sh" -skip_if_companion_pr - time cargo check --features runtime-benchmarks diff --git a/scripts/gitlab/check_web_wasm.sh b/scripts/gitlab/check_web_wasm.sh index 056e90d1e3..9d9006e908 100755 --- a/scripts/gitlab/check_web_wasm.sh +++ b/scripts/gitlab/check_web_wasm.sh @@ -3,8 +3,6 @@ #shellcheck source=lib.sh source "$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )/lib.sh" -skip_if_companion_pr - time cargo build --locked --target=wasm32-unknown-unknown --manifest-path runtime/polkadot/Cargo.toml time cargo build --locked --target=wasm32-unknown-unknown --manifest-path runtime/kusama/Cargo.toml time cargo build --locked --target=wasm32-unknown-unknown --manifest-path erasure-coding/Cargo.toml diff --git a/scripts/gitlab/test_deterministic_wasm.sh b/scripts/gitlab/test_deterministic_wasm.sh index f2bf2a4f05..db391ca0a2 100755 --- a/scripts/gitlab/test_deterministic_wasm.sh +++ b/scripts/gitlab/test_deterministic_wasm.sh @@ -3,8 +3,6 @@ #shellcheck source=lib.sh source "$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )/lib.sh" -skip_if_companion_pr - # build runtime WASM_BUILD_NO_COLOR=1 cargo build --verbose --release -p kusama-runtime -p polkadot-runtime -p westend-runtime # make checksum diff --git a/scripts/gitlab/test_linux_stable.sh b/scripts/gitlab/test_linux_stable.sh index f523e24434..a18ff43874 100755 --- a/scripts/gitlab/test_linux_stable.sh +++ b/scripts/gitlab/test_linux_stable.sh @@ -3,6 +3,4 @@ #shellcheck source=lib.sh source "$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )/lib.sh" -skip_if_companion_pr - time cargo test --all --release --verbose --locked --features runtime-benchmarks -- GitLab From 864fff12fade2123e06ecee45404d154d74d1245 Mon Sep 17 00:00:00 2001 From: Sergei Shulepov Date: Thu, 6 Aug 2020 17:29:05 +0200 Subject: [PATCH 156/192] Implementer's guide: downward messages and HRMP, take 2 (#1503) * First stab at downward messages. That also includes a notion of horizontal messages. * Add some structure to the router. * Update `ValidationOutputs` * Add `processed_downward_messages` to `ValidationOutputs`. Forgot to check that in. * s/AccountId/ParaId * DownwardMessage::ParachainSpecfic * s/ensure_horizontal_messages_fits/ensure_horizontal_messages_fit * Clarify that Router called for each candidate * Update the preamble for Router. * Rewrite the relay-chain extrinsic routines * Update gloassary * Add DMP to the glossary * If the queue is empty, `processed_downward_messages` can be 0 * WIP * Add condemned list * Pivot to message-storing channel based HRMP * Finished draft * Tidy up * Remove a duplicate glossary entry * Fix typo * Fix wording to emphasize that the channel is unidirectional * Proper decrement `HrmpOpenChannelRequestCount` * Add a comment for `HrmpOpenChannelRequestCount`. * Remove old configuration values. * Be more specific about the para{chain,thread} hrmp chan limits. * Fix indentation so the lists are rendendered properly * "to answer **the**" question instead of "a" * Add a missing call to `check_processed_downward_messages` * Clean more stuff during offboarding * Fix typo * Fix typo for the config * Add a call to `prune_dmq` * Add explicit invariants for ingress/egress indexes * Add comments for the sender/reciever deposit config fields * Document various fields and structs in Router module * More docs * Missing docs in Candidate.md * Tabs to spaces in router.md * Apply Rob's suggestion * Add the hrmp_ prefix to the router messages * Those are entry points * Use SessionIndex type for the `age` field * Use a struct to represent `HrmpChannelId` * Put only MQCs into the LocalValidationData * Close request can be initiated by the runtime directly * Close request can be initiated by the runtime directly * tabs/spaces * Maintain the list of the outgoing paras in Router * Update roadmap/implementers-guide/src/runtime/inclusion.md Co-authored-by: Robert Habermeier * fix typo * Remove an unnecessary pair of code quotes Co-authored-by: Robert Habermeier --- roadmap/implementers-guide/src/glossary.md | 6 + .../src/runtime/inclusion.md | 7 + .../implementers-guide/src/runtime/paras.md | 3 +- .../implementers-guide/src/runtime/router.md | 211 +++++++++++++++++- .../implementers-guide/src/types/candidate.md | 16 ++ .../implementers-guide/src/types/messages.md | 41 ++++ .../implementers-guide/src/types/runtime.md | 14 ++ 7 files changed, 294 insertions(+), 4 deletions(-) diff --git a/roadmap/implementers-guide/src/glossary.md b/roadmap/implementers-guide/src/glossary.md index 21cf5fc291..63294d1d77 100644 --- a/roadmap/implementers-guide/src/glossary.md +++ b/roadmap/implementers-guide/src/glossary.md @@ -7,12 +7,15 @@ Here you can find definitions of a bunch of jargon, usually specific to the Polk - Backed Candidate: A Backable Candidate noted in a relay-chain block - Backing: A set of statements proving that a Parachain Candidate is backable. - Collator: A node who generates Proofs-of-Validity (PoV) for blocks of a specific parachain. +- DMP: (Downward Message Passing). Message passing from the relay-chain to a parachain. - Extrinsic: An element of a relay-chain block which triggers a specific entry-point of a runtime module with given arguments. - GRANDPA: (Ghost-based Recursive ANcestor Deriving Prefix Agreement). The algorithm validators use to guarantee finality of the Relay Chain. +- HRMP: (Horizontally Relay-routed Message Passing). A mechanism for message passing between parachains (hence horizontal) that leverages the relay-chain storage. Predates XCMP. - Inclusion Pipeline: The set of steps taken to carry a Parachain Candidate from authoring, to backing, to availability and full inclusion in an active fork of its parachain. - Module: A component of the Runtime logic, encapsulating storage, routines, and entry-points. - Module Entry Point: A recipient of new information presented to the Runtime. This may trigger routines. - Module Routine: A piece of code executed within a module by block initialization, closing, or upon an entry point being triggered. This may execute computation, and read or write storage. +- MQC: (Message Queue Chain). A cryptographic data structure that resembles an append-only linked list which doesn't store original values but only their hashes. The whole structure is described by a single hash, referred as a "head". When a value is appended, it's contents hashed with the previous head creating a hash that becomes a new head. - Node: A participant in the Polkadot network, who follows the protocols of communication and connection to other nodes. Nodes form a peer-to-peer network topology without a central authority. - Parachain Candidate, or Candidate: A proposed block for inclusion into a parachain. - Parablock: A block in a parachain. @@ -26,8 +29,11 @@ Here you can find definitions of a bunch of jargon, usually specific to the Polk - Runtime API: A means for the node-side behavior to access structured information based on the state of a fork of the blockchain. - Secondary Checker: A validator who has been randomly selected to perform secondary approval checks on a parablock which is pending approval. - Subsystem: A long-running task which is responsible for carrying out a particular category of work. +- UMP: (Upward Message Passing) A vertical message passing mechanism from a parachain to the relay chain. - Validator: Specially-selected node in the network who is responsible for validating parachain blocks and issuing attestations about their validity. - Validation Function: A piece of Wasm code that describes the state-transition function of a parachain. +- VMP: (Vertical Message Passing) A family of mechanisms that are responsible for message exchange between the relay chain and parachains. +- XCMP (Cross-Chain Message Passing) A type of horizontal message passing (i.e. between parachains) that allows secure message passing directly between parachains and has minimal resource requirements from the relay chain, thus highly scalable. Also of use is the [Substrate Glossary](https://substrate.dev/docs/en/knowledgebase/getting-started/glossary). diff --git a/roadmap/implementers-guide/src/runtime/inclusion.md b/roadmap/implementers-guide/src/runtime/inclusion.md index 898f757095..76eec45910 100644 --- a/roadmap/implementers-guide/src/runtime/inclusion.md +++ b/roadmap/implementers-guide/src/runtime/inclusion.md @@ -69,6 +69,10 @@ All failed checks should lead to an unrecoverable error making the block invalid 1. Check the collator's signature on the candidate data. 1. check the backing of the candidate using the signatures and the bitfields, comparing against the validators assigned to the groups, fetched with the `group_validators` lookup. 1. check that the upward messages, when combined with the existing queue size, are not exceeding `config.max_upward_queue_count` and `config.watermark_upward_queue_size` parameters. + 1. call `Router::check_processed_downward_messages(para, commitments.processed_downward_messages)` to check that the DMQ is properly drained. + 1. call `Router::check_hrmp_watermark(para, commitments.hrmp_watermark)` for each candidate to check rules of processing the HRMP watermark. + 1. check that in the commitments of each candidate the horizontal messages are sorted by ascending recipient ParaId and there is no two horizontal messages have the same recipient. + 1. using `Router::verify_outbound_hrmp(sender, commitments.horizontal_messages)` ensure that the each candidate send a valid set of horizontal messages 1. create an entry in the `PendingAvailability` map for each backed candidate with a blank `availability_votes` bitfield. 1. create a corresponding entry in the `PendingAvailabilityCommitments` with the commitments. 1. Return a `Vec` of all scheduled cores of the list of passed assignments that a candidate was successfully backed for, sorted ascending by CoreIndex. @@ -76,6 +80,9 @@ All failed checks should lead to an unrecoverable error making the block invalid 1. If the receipt contains a code upgrade, Call `Paras::schedule_code_upgrade(para_id, code, relay_parent_number + config.validationl_upgrade_delay)`. > TODO: Note that this is safe as long as we never enact candidates where the relay parent is across a session boundary. In that case, which we should be careful to avoid with contextual execution, the configuration might have changed and the para may de-sync from the host's understanding of it. 1. call `Router::queue_upward_messages` for each backed candidate, using the [`UpwardMessage`s](../types/messages.md#upward-message) from the [`CandidateCommitments`](../types/candidate.md#candidate-commitments). + 1. call `Router::queue_outbound_hrmp` with the para id of the candidate and the list of horizontal messages taken from the commitment, + 1. call `Router::prune_hrmp` with the para id of the candiate and the candidate's `hrmp_watermark`. + 1. call `Router::prune_dmq` with the para id of the candidate and the candidate's `processed_downward_messages`. 1. Call `Paras::note_new_head` using the `HeadData` from the receipt and `relay_parent_number`. * `collect_pending`: diff --git a/roadmap/implementers-guide/src/runtime/paras.md b/roadmap/implementers-guide/src/runtime/paras.md index 97c49ae167..d29d760f57 100644 --- a/roadmap/implementers-guide/src/runtime/paras.md +++ b/roadmap/implementers-guide/src/runtime/paras.md @@ -93,7 +93,8 @@ OutgoingParas: Vec; ## Session Change -1. Clean up outgoing paras. This means removing the entries under `Heads`, `ValidationCode`, `FutureCodeUpgrades`, and `FutureCode`. An according entry should be added to `PastCode`, `PastCodeMeta`, and `PastCodePruning` using the outgoing `ParaId` and removed `ValidationCode` value. This is because any outdated validation code must remain available on-chain for a determined amount of blocks, and validation code outdated by de-registering the para is still subject to that invariant. +1. Clean up outgoing paras. + 1. This means removing the entries under `Heads`, `ValidationCode`, `FutureCodeUpgrades`, and `FutureCode`. An according entry should be added to `PastCode`, `PastCodeMeta`, and `PastCodePruning` using the outgoing `ParaId` and removed `ValidationCode` value. This is because any outdated validation code must remain available on-chain for a determined amount of blocks, and validation code outdated by de-registering the para is still subject to that invariant. 1. Apply all incoming paras by initializing the `Heads` and `ValidationCode` using the genesis parameters. 1. Amend the `Parachains` list to reflect changes in registered parachains. 1. Amend the `Parathreads` set to reflect changes in registered parathreads. diff --git a/roadmap/implementers-guide/src/runtime/router.md b/roadmap/implementers-guide/src/runtime/router.md index 4f7adeaa04..752d15019b 100644 --- a/roadmap/implementers-guide/src/runtime/router.md +++ b/roadmap/implementers-guide/src/runtime/router.md @@ -1,14 +1,15 @@ # Router Module -The Router module is responsible for storing and dispatching Upward and Downward messages from and to parachains respectively. It is intended to later handle the XCMP logic as well. - -For each enacted block the `queue_upward_messages` entry-point is called. +The Router module is responsible for all messaging mechanisms supported between paras and the relay chain, specifically: UMP, DMP, HRMP and later XCMP. ## Storage Storage layout: ```rust,ignore +/// Paras that are to be cleaned up at the end of the session. +/// The entries are sorted ascending by the para id. +OutgoingParas: Vec; /// Messages ready to be dispatched onto the relay chain. /// This is subject to `max_upward_queue_count` and /// `watermark_queue_size` from `HostConfiguration`. @@ -19,17 +20,221 @@ RelayDispatchQueues: map ParaId => Vec; RelayDispatchQueueSize: map ParaId => (u32, u32); /// The ordered list of `ParaId`s that have a `RelayDispatchQueue` entry. NeedsDispatch: Vec; +/// The downward messages addressed for a certain para. +DownwardMessageQueues: map ParaId => Vec; +``` + +### HRMP + +HRMP related structs: + +```rust,ignore +/// A type used to designate a HRMP channel between a (sender, recipient). +struct HrmpChannelId { + sender: ParaId, + recipient: ParaId, +} + +/// A description of a request to open an HRMP channel. +struct HrmpOpenChannelRequest { + /// The sender and the initiator of this request. + sender: ParaId, + /// The recipient of the opened request. + recipient: ParaId, + /// Indicates if this request was confirmed by the recipient. + confirmed: bool, + /// How many session boundaries ago this request was seen. + age: SessionIndex, + /// The amount that the sender supplied at the time of creation of this request. + sender_deposit: Balance, + /// The maximum number of messages that can be pending in the channel at once. + limit_used_places: u32, + /// The maximum total size of the messages that can be pending in the channel at once. + limit_used_bytes: u32, +} + +/// A description of a request to close an opened HRMP channel. +struct HrmpCloseChannelRequest { + /// The para which initiated closing an existing channel. + /// + /// Invariant: it should be equal to one of the following + /// - `Some(sender)` + /// - `Some(recipient)` + /// - `None` in case the request initiated by the runtime (including governance, migration, etc) + initiator: Option, + /// The identifier of an HRMP channel to be closed. + id: HrmpChannelId, +} + +/// A metadata of an HRMP channel. +struct HrmpChannel { + /// The amount that the sender supplied as a deposit when opening this channel. + sender_deposit: Balance, + /// The amount that the recipient supplied as a deposit when accepting opening this channel. + recipient_deposit: Balance, + /// The maximum number of messages that can be pending in the channel at once. + limit_used_places: u32, + /// The maximum total size of the messages that can be pending in the channel at once. + limit_used_bytes: u32, + /// The current number of messages pending in the channel. + /// Invariant: should be less or equal to `limit_used_places`. + used_places: u32, + /// The total size in bytes of all message payloads in the channel. + /// Invariant: should be less or equal to `limit_used_bytes`. + used_bytes: u32, + /// A head of the Message Queue Chain for this channel. Each link in this chain has a form: + /// `(prev_head, B, H(M))`, where + /// - `prev_head`: is the previous value of `mqc_head`. + /// - `B`: is the [relay-chain] block number in which a message was appended + /// - `H(M)`: is the hash of the message being appended. + /// This value is initialized to a special value that consists of all zeroes which indicates + /// that no messages were previously added. + mqc_head: Hash, +} +``` +HRMP related storage layout + +```rust,ignore +/// Pending HRMP open channel requests. +HrmpOpenChannelRequests: Vec; +/// This mapping tracks how many open channel requests are inititated by a given sender para. +/// Invariant: `HrmpOpenChannelRequests` should contain the same number of items that has `_.sender == X` +/// as the number of `HrmpOpenChannelRequestCount` for `X`. +HrmpOpenChannelRequestCount: map ParaId => u32; +/// Pending HRMP close channel requests. +HrmpCloseChannelRequests: Vec; +/// The HRMP watermark associated with each para. +HrmpWatermarks: map ParaId => Option; +/// HRMP channel data associated with each para. +HrmpChannels: map HrmpChannelId => Option; +/// The indexes that map all senders to their recievers and vise versa. +/// Invariants: +/// - for each ingress index entry for `P` each item `I` in the index should present in `HrmpChannels` as `(I, P)`. +/// - for each egress index entry for `P` each item `E` in the index should present in `HrmpChannels` as `(P, E)`. +/// - there should be no other dangling channels in `HrmpChannels`. +HrmpIngressChannelsIndex: map ParaId => Vec; +HrmpEgressChannelsIndex: map ParaId => Vec; +/// Storage for the messages for each channel. +/// Invariant: cannot be non-empty if the corresponding channel in `HrmpChannels` is `None`. +HrmpChannelContents: map HrmpChannelId => Vec; +/// Maintains a mapping that can be used to answer the question: +/// What paras sent a message at the given block number for a given reciever. +HrmpChannelDigests: map ParaId => Vec<(BlockNumber, Vec)>; ``` ## Initialization No initialization routine runs for this module. +## Entry points + +The following routines are intended to be invoked by paras' upward messages. + +* `hrmp_init_open_channel(recipient)`: + 1. Check that the origin of this message is a para. We say that the origin of this message is the `sender`. + 1. Check that the `sender` is not `recipient`. + 1. Check that the `recipient` para exists. + 1. Check that there is no existing open channel request from sender to recipient. + 1. Check that the sum of the number of already opened HRMP channels by the `sender` (the size of the set found `HrmpEgressChannelsIndex` for `sender`) and the number of open requests by the `sender` (the value from `HrmpOpenChannelRequestCount` for `sender`) doesn't exceed the limit of channels (`config.hrmp_max_parachain_outbound_channels` or `config.hrmp_max_parathread_outbound_channels`) minus 1. + 1. Reserve the deposit for the `sender` according to `config.hrmp_sender_deposit` + 1. Add a new entry to `HrmpOpenChannelRequests` and increase `HrmpOpenChannelRequestCount` by 1 for the `sender`. + 1. Set `sender_deposit` to `config.hrmp_sender_deposit` + 1. Set `limit_used_places` to `config.hrmp_channel_max_places` + 1. Set `limit_limit_used_bytes` to `config.hrmp_channel_max_size` + +* `hrmp_accept_open_channel(i)`, `i` - is the index of open channel request: + 1. Check that the designated open channel request exists + 1. Check that the request's `recipient` corresponds to the origin of this message. + 1. Reserve the deposit for the `recipient` according to `config.hrmp_recipient_deposit` + 1. Set the request's `confirmed` flag to `true`. + +* `hrmp_close_channel(sender, recipient)`: + 1. Check that the channel between `sender` and `recipient` exists + 1. Check that the origin of the message is either `sender` or `recipient` + 1. Check that there is no existing intention to close the channel between `sender` and `recipient`. + 1. Add a new entry to `HrmpCloseChannelRequests` with initiator set to the `Some` variant with the origin of this message. + ## Routines +Candidate Acceptance Function: + +* `check_processed_downward_messages(P: ParaId, processed_downward_messages)`: + 1. Checks that `DownwardMessageQueues` for `P` is at least `processed_downward_messages` long. + 1. Checks that `processed_downward_messages` is at least 1 if `DownwardMessageQueues` for `P` is not empty. +* `check_hrmp_watermark(P: ParaId, new_hrmp_watermark)`: + 1. `new_hrmp_watermark` should be strictly greater than the value of `HrmpWatermarks` for `P` (if any). + 1. `new_hrmp_watermark` must not be greater than the context's block number. + 1. in `HrmpChannelDigests` for `P` an entry with the block number equal to `new_hrmp_watermark` should exist. +* `verify_outbound_hrmp(sender: ParaId, Vec)`: + 1. For each horizontal message `M` with the channel `C` identified by `(sender, M.recipient)` check: + 1. exists + 1. `M`'s payload size summed with the `C.used_bytes` doesn't exceed a preconfigured limit `C.limit_used_bytes`. + 1. `C.used_places + 1` doesn't exceed a preconfigured limit `C.limit_used_places`. + +Candidate Enactment: + +* `queue_outbound_hrmp(sender: ParaId, Vec)`: + 1. For each horizontal message `HM` with the channel `C` identified by `(sender, HM.recipient)`: + 1. Append `HM` into `HrmpChannelContents` that corresponds to `C`. + 1. Locate or create an entry in ``HrmpChannelDigests`` for `HM.recipient` and append `sender` into the entry's list. + 1. Increment `C.used_places` + 1. Increment `C.used_bytes` by `HM`'s payload size + 1. Append a new link to the MQC and save the new head in `C.mqc_head`. Note that the current block number as of enactment is used for the link. +* `prune_hrmp(recipient, new_hrmp_watermark)`: + 1. From ``HrmpChannelDigests`` for `recipient` remove all entries up to an entry with block number equal to `new_hrmp_watermark`. + 1. From the removed digests construct a set of paras that sent new messages within the interval between the old and new watermarks. + 1. For each channel `C` identified by `(sender, recipient)` for each `sender` coming from the set, prune messages up to the `new_hrmp_watermark`. + 1. For each pruned message `M` from channel `C`: + 1. Decrement `C.used_places` + 1. Decrement `C.used_bytes` by `M`'s payload size. + 1. Set `HrmpWatermarks` for `P` to be equal to `new_hrmp_watermark` +* `prune_dmq(P: ParaId, processed_downward_messages)`: + 1. Remove the first `processed_downward_messages` from the `DownwardMessageQueues` of `P`. + * `queue_upward_messages(ParaId, Vec)`: 1. Updates `NeedsDispatch`, and enqueues upward messages into `RelayDispatchQueue` and modifies the respective entry in `RelayDispatchQueueSize`. +The following routine is intended to be called in the same time when `Paras::schedule_para_cleanup` is called. + +`schedule_para_cleanup(ParaId)`: + 1. Add the para into the `OutgoingParas` vector maintaining the sorted order. + +## Session Change + +1. Drain `OutgoingParas`. For each `P` happened to be in the list: + 1. Remove all inbound channels of `P`, i.e. `(_, P)`, + 1. Remove all outbound channels of `P`, i.e. `(P, _)`, + 1. Remove all `DownwardMessageQueues` of `P`. + 1. Remove `RelayDispatchQueueSize` of `P`. + 1. Remove `RelayDispatchQueues` of `P`. + - Note that we don't remove the open/close requests since they are gon die out naturally. +TODO: What happens with the deposits in channels or open requests? +1. For each request `R` in `HrmpOpenChannelRequests`: + 1. if `R.confirmed = false`: + 1. increment `R.age` by 1. + 1. if `R.age` reached a preconfigured time-to-live limit `config.hrmp_open_request_ttl`, then: + 1. refund `R.sender_deposit` to the sender + 1. decrement `HrmpOpenChannelRequestCount` for `R.sender` by 1. + 1. remove `R` + 2. if `R.confirmed = true`, + 1. check that `R.sender` and `R.recipient` are not offboarded. + 1. create a new channel `C` between `(R.sender, R.recipient)`. + 1. Initialize the `C.sender_deposit` with `R.sender_deposit` and `C.recipient_deposit` with the value found in the configuration `config.hrmp_recipient_deposit`. + 1. Insert `sender` into the set `HrmpIngressChannelsIndex` for the `recipient`. + 1. Insert `recipient` into the set `HrmpEgressChannelsIndex` for the `sender`. + 1. decrement `HrmpOpenChannelRequestCount` for `R.sender` by 1. + 1. remove `R` +1. For each request `R` in `HrmpCloseChannelRequests` remove the channel identified by `R.id`, if exists. + +To remove a channel `C` identified with a tuple `(sender, recipient)`: + +1. Return `C.sender_deposit` to the `sender`. +1. Return `C.recipient_deposit` to the `recipient`. +1. Remove `C` from `HrmpChannels`. +1. Remove `C` from `HrmpChannelContents`. +1. Remove `recipient` from the set `HrmpEgressChannelsIndex` for `sender`. +1. Remove `sender` from the set `HrmpIngressChannelsIndex` for `recipient`. + ## Finalization 1. Dispatch queued upward messages from `RelayDispatchQueues` in a FIFO order applying the `config.watermark_upward_queue_size` and `config.max_upward_queue_count` limits. diff --git a/roadmap/implementers-guide/src/types/candidate.md b/roadmap/implementers-guide/src/types/candidate.md index cd4ffae9bd..85416450d7 100644 --- a/roadmap/implementers-guide/src/types/candidate.md +++ b/roadmap/implementers-guide/src/types/candidate.md @@ -151,6 +151,10 @@ struct LocalValidationData { /// which case the code upgrade should be applied at the end of the signaling /// block. code_upgrade_allowed: Option, + /// The list of MQC heads for the inbound channels paired with the sender para ids. This + /// vector is sorted ascending by the para id and doesn't contain multiple entries with the same + /// sender. + hrmp_mqc_heads: Vec<(ParaId, Hash)>, } ``` @@ -173,6 +177,8 @@ The execution and validation of parachain or parathread candidates produces a nu struct CandidateCommitments { /// Fees paid from the chain to the relay chain validators. fees: Balance, + /// Messages directed to other paras routed via the relay chain. + horizontal_messages: Vec, /// Messages destined to be interpreted by the Relay chain itself. upward_messages: Vec, /// The root of a block's erasure encoding Merkle tree. @@ -181,6 +187,10 @@ struct CandidateCommitments { new_validation_code: Option, /// The head-data produced as a result of execution. head_data: HeadData, + /// The number of messages processed from the DMQ. + processed_downward_messages: u32, + /// The mark which specifies the block number up to which all inbound HRMP messages are processed. + hrmp_watermark: BlockNumber, } ``` @@ -209,11 +219,17 @@ struct ValidationOutputs { global_validation_data: GlobalValidationData, /// The local validation data. local_validation_data: LocalValidationData, + /// Messages directed to other paras routed via the relay chain. + horizontal_messages: Vec, /// Upwards messages to the relay chain. upwards_messages: Vec, /// Fees paid to the validators of the relay-chain. fees: Balance, /// The new validation code submitted by the execution, if any. new_validation_code: Option, + /// The number of messages processed from the DMQ. + processed_downward_messages: u32, + /// The mark which specifies the block number up to which all inbound HRMP messages are processed. + hrmp_watermark: BlockNumber, } ``` diff --git a/roadmap/implementers-guide/src/types/messages.md b/roadmap/implementers-guide/src/types/messages.md index 14218eb033..8def95ee04 100644 --- a/roadmap/implementers-guide/src/types/messages.md +++ b/roadmap/implementers-guide/src/types/messages.md @@ -2,6 +2,9 @@ Types of messages that are passed between parachains and the relay chain: UMP, DMP, XCMP. +There is also HRMP (Horizontally Relay-routed Message Passing) which provides the same functionality +although with smaller scalability potential. + ## Upward Message A type of messages dispatched from a parachain to the relay chain. @@ -26,3 +29,41 @@ struct UpwardMessage { pub data: Vec, } ``` + +## Horizontal Message + +This is a message sent from a parachain to another parachain that travels through the relay chain. +This message ends up in the recipient's mailbox. A size of a horizontal message is defined by its +`data` payload. + +```rust,ignore +struct OutboundHrmpMessage { + /// The para that will get this message in its downward message queue. + pub recipient: ParaId, + /// The message payload. + pub data: Vec, +} + +struct InboundHrmpMessage { + pub sent_at: BlockNumber, + /// The message payload. + pub data: Vec, +} +``` + +## Downward Message + +A message that go down from the relay chain to a parachain. Such a message could be initiated either +as a result of an operation took place on the relay chain. + +```rust,ignore +enum DownwardMessage { + /// Some funds were transferred into the parachain's account. The hash is the identifier that + /// was given with the transfer. + TransferInto(AccountId, Balance, Remark), + /// An opaque message which interpretation is up to the recipient para. This variant ought + /// to be used as a basis for special protocols between the relay chain and, typically system, + /// paras. + ParachainSpecific(Vec), +} +``` diff --git a/roadmap/implementers-guide/src/types/runtime.md b/roadmap/implementers-guide/src/types/runtime.md index f9faf5ab65..03494ed902 100644 --- a/roadmap/implementers-guide/src/types/runtime.md +++ b/roadmap/implementers-guide/src/types/runtime.md @@ -40,5 +40,19 @@ struct HostConfiguration { /// no further messages may be added to it. If it exceeds this then the queue may contain only /// a single message. pub watermark_upward_queue_size: u32, + /// Number of sessions after which an HRMP open channel request expires. + pub hrmp_open_request_ttl: u32, + /// The deposit that the sender should provide for opening an HRMP channel. + pub hrmp_sender_deposit: u32, + /// The deposit that the recipient should provide for accepting opening an HRMP channel. + pub hrmp_recipient_deposit: u32, + /// The maximum number of messages allowed in an HRMP channel at once. + pub hrmp_channel_max_places: u32, + /// The maximum total size of messages in bytes allowed in an HRMP channel at once. + pub hrmp_channel_max_size: u32, + /// The maximum number of outbound HRMP channels a parachain is allowed to open. + pub hrmp_max_parachain_outbound_channels: u32, + /// The maximum number of outbound HRMP channels a parathread is allowed to open. + pub hrmp_max_parathread_outbound_channels: u32, } ``` -- GitLab From a39d880357b2d9358eb8a739e55d6deefd07c592 Mon Sep 17 00:00:00 2001 From: Peter Goodspeed-Niklaus Date: Thu, 6 Aug 2020 18:12:15 +0200 Subject: [PATCH 157/192] implement provisioner (#1473) * sketch out provisioner basics * handle provisionable data * stub out select_inherent_data * split runtime APIs into sub-chapters to improve linkability * explain SignedAvailabilityBitfield semantics * add internal link to further documentation * some more work figuring out how the provisioner can do its thing * fix broken link * don't import enum variants where it's one layer deep * make request_availability_cores a free fn in util * document more precisely what should happen on block production * finish first-draft implementation of provisioner * start working on the full and proper backed candidate selection rule * Pass number of block under construction via RequestInherentData * Revert "Pass number of block under construction via RequestInherentData" This reverts commit 850fe62cc0dfb04252580c21a985962000e693c8. That initially looked like the better approach--it spent the time budget for fetching the block number in the proposer, instead of the provisioner, and that felt more appropriate--but it turns out not to be obvious how to get the block number of the block under construction from within the proposer. The Chain API may be less ideal, but it should be easier to implement. * wip: get the block under production from the Chain API * add ChainApiMessage to AllMessages * don't break the run loop if a provisionable data channel closes * clone only those backed candidates which are coherent * propagate chain_api subsystem through various locations * add delegated_subsystem! macro to ease delegating subsystems Unfortunately, it doesn't work right: ``` error[E0446]: private type `CandidateBackingJob` in public interface --> node/core/backing/src/lib.rs:775:1 | 86 | struct CandidateBackingJob { | - `CandidateBackingJob` declared as private ... 775 | delegated_subsystem!(CandidateBackingJob as CandidateBackingSubsystem); | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ can't leak private type ``` I'm not sure precisely what's going wrong, here; I suspect the problem is the use of `$job as JobTrait>::RunArgs` and `::ToJob`; the failure would be that it's not reifying the types to verify that the actual types are public, but instead referring to them via `CandidateBackingJob`, which is in fact private; that privacy is the point. Going to see if I can generic my way out of this, but we may be headed for a quick revert here. * fix delegated_subsystem The invocation is a bit more verbose than I'd prefer, but it's also more explicit about what types need to be public. I'll take it as a win. * add provisioning subsystem; reduce public interface of provisioner * deny missing docs in provisioner * refactor core selection per code review suggestion This is twice as much code when measured by line, but IMO it is in fact somewhat clearer to read, so overall a win. Also adds an improved rule for selecting availability bitfields, which (unlike the previous implementation) guarantees that the appropriate postconditions hold there. * fix bad merge double-declaration * update guide with (hopefully) complete provisioner candidate selection procedure * clarify candidate selection algorithm * Revert "clarify candidate selection algorithm" This reverts commit c68a02ac9cf42b3a4a28eb197d38633a40d0e3e6. * clarify candidate selection algorithm * update provisioner to implement candidate selection per the guide * add test that no more than one bitfield is selected per validator * add test that each selected bitfield corresponds to an occupied core * add test that more set bits win conflicts * add macro for specializing runtime requests; specailize all runtime requests * add tests harness for select_candidates tests * add first real select_candidates test, fix test_harness * add mock overseer and test that success is possible * add test that the candidate selection algorithm picks the right ones * make candidate selection test somewhat more stringent --- Cargo.lock | 17 +- Cargo.toml | 3 +- node/core/backing/src/lib.rs | 44 +- node/core/provisioner/Cargo.toml | 18 + node/core/provisioner/src/lib.rs | 844 ++++++++++++++++++ node/primitives/src/lib.rs | 2 +- node/subsystem/src/messages.rs | 7 +- node/subsystem/src/util.rs | 335 ++++--- primitives/src/v1.rs | 15 +- roadmap/implementers-guide/src/SUMMARY.md | 9 + .../src/node/utility/provisioner.md | 57 +- .../src/runtime-api/README.md | 197 +--- .../src/runtime-api/availability-cores.md | 56 ++ .../src/runtime-api/candidate-events.md | 16 + .../candidate-pending-availability.md | 7 + .../src/runtime-api/global-validation-data.md | 7 + .../src/runtime-api/local-validation-data.md | 23 + .../src/runtime-api/session-index.md | 12 + .../src/runtime-api/validation-code.md | 7 + .../src/runtime-api/validator-groups.md | 35 + .../src/runtime-api/validators.md | 7 + .../src/runtime/scheduler.md | 100 ++- .../src/types/availability.md | 10 + 23 files changed, 1441 insertions(+), 387 deletions(-) create mode 100644 node/core/provisioner/Cargo.toml create mode 100644 node/core/provisioner/src/lib.rs create mode 100644 roadmap/implementers-guide/src/runtime-api/availability-cores.md create mode 100644 roadmap/implementers-guide/src/runtime-api/candidate-events.md create mode 100644 roadmap/implementers-guide/src/runtime-api/candidate-pending-availability.md create mode 100644 roadmap/implementers-guide/src/runtime-api/global-validation-data.md create mode 100644 roadmap/implementers-guide/src/runtime-api/local-validation-data.md create mode 100644 roadmap/implementers-guide/src/runtime-api/session-index.md create mode 100644 roadmap/implementers-guide/src/runtime-api/validation-code.md create mode 100644 roadmap/implementers-guide/src/runtime-api/validator-groups.md create mode 100644 roadmap/implementers-guide/src/runtime-api/validators.md diff --git a/Cargo.lock b/Cargo.lock index 6c853480ca..10b016a8dc 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4313,7 +4313,7 @@ checksum = "feb3b2b1033b8a60b4da6ee470325f887758c95d5320f52f9ce0df055a55940e" [[package]] name = "polkadot" -version = "0.8.22" +version = "0.8.19" dependencies = [ "assert_cmd", "futures 0.3.5", @@ -4633,6 +4633,21 @@ dependencies = [ "wasm-timer", ] +[[package]] +name = "polkadot-node-core-provisioner" +version = "0.1.0" +dependencies = [ + "bitvec", + "derive_more 0.99.9", + "futures 0.3.5", + "lazy_static", + "log 0.4.8", + "polkadot-node-subsystem", + "polkadot-primitives", + "sp-core", + "tokio 0.2.21", +] + [[package]] name = "polkadot-node-core-runtime-api" version = "0.1.0" diff --git a/Cargo.toml b/Cargo.toml index c5d741b155..a56de658b3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,7 +4,7 @@ path = "src/main.rs" [package] name = "polkadot" -version = "0.8.22" +version = "0.8.19" authors = ["Parity Technologies "] edition = "2018" @@ -51,6 +51,7 @@ members = [ "node/core/candidate-validation", "node/core/chain-api", "node/core/proposer", + "node/core/provisioner", "node/core/runtime-api", "node/network/bridge", "node/network/pov-distribution", diff --git a/node/core/backing/src/lib.rs b/node/core/backing/src/lib.rs index 11f82d3d83..f7608f0d0f 100644 --- a/node/core/backing/src/lib.rs +++ b/node/core/backing/src/lib.rs @@ -36,10 +36,9 @@ use polkadot_primitives::v1::{ }; use polkadot_node_primitives::{ FromTableMisbehavior, Statement, SignedFullStatement, MisbehaviorReport, - ValidationOutputs, ValidationResult, SpawnNamed, + ValidationOutputs, ValidationResult, }; use polkadot_subsystem::{ - Subsystem, SubsystemContext, SpawnedSubsystem, messages::{ AllMessages, AvailabilityStoreMessage, CandidateBackingMessage, CandidateSelectionMessage, CandidateValidationMessage, NewBackedCandidate, PoVDistributionMessage, ProvisionableData, @@ -54,6 +53,7 @@ use polkadot_subsystem::{ request_from_runtime, Validator, }, + delegated_subsystem, }; use statement_table::{ generic::AttestedCandidate as TableAttestedCandidate, @@ -772,45 +772,7 @@ impl util::JobTrait for CandidateBackingJob { } } -/// Manager type for the CandidateBackingSubsystem -type Manager = util::JobManager; - -/// An implementation of the Candidate Backing subsystem. -pub struct CandidateBackingSubsystem { - manager: Manager, -} - -impl CandidateBackingSubsystem -where - Spawner: Clone + SpawnNamed + Send + Unpin, - Context: SubsystemContext, - ToJob: From<::Message>, -{ - /// Creates a new `CandidateBackingSubsystem`. - pub fn new(spawner: Spawner, keystore: KeyStorePtr) -> Self { - CandidateBackingSubsystem { - manager: util::JobManager::new(spawner, keystore) - } - } - - /// Run this subsystem - pub async fn run(ctx: Context, keystore: KeyStorePtr, spawner: Spawner) { - >::run(ctx, keystore, spawner, None).await - } -} - -impl Subsystem for CandidateBackingSubsystem -where - Spawner: SpawnNamed + Send + Clone + Unpin + 'static, - Context: SubsystemContext, - ::Message: Into, -{ - fn start(self, ctx: Context) -> SpawnedSubsystem { - self.manager.start(ctx) - } -} - - +delegated_subsystem!(CandidateBackingJob(KeyStorePtr) <- ToJob as CandidateBackingSubsystem); #[cfg(test)] mod tests { diff --git a/node/core/provisioner/Cargo.toml b/node/core/provisioner/Cargo.toml new file mode 100644 index 0000000000..6c6477c904 --- /dev/null +++ b/node/core/provisioner/Cargo.toml @@ -0,0 +1,18 @@ +[package] +name = "polkadot-node-core-provisioner" +version = "0.1.0" +authors = ["Parity Technologies "] +edition = "2018" + +[dependencies] +bitvec = { version = "0.17.4", default-features = false, features = ["alloc"] } +derive_more = "0.99.9" +futures = "0.3.5" +log = "0.4.8" +polkadot-primitives = { path = "../../../primitives" } +polkadot-node-subsystem = { path = "../../subsystem" } + +[dev-dependencies] +lazy_static = "1.4" +sp-core = { git = "https://github.com/paritytech/substrate", branch = "master" } +tokio = "0.2" diff --git a/node/core/provisioner/src/lib.rs b/node/core/provisioner/src/lib.rs new file mode 100644 index 0000000000..712c1a834f --- /dev/null +++ b/node/core/provisioner/src/lib.rs @@ -0,0 +1,844 @@ +// Copyright 2020 Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Polkadot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . + +//! The provisioner is responsible for assembling a relay chain block +//! from a set of available parachain candidates of its choice. + +#![deny(missing_docs)] + +use bitvec::vec::BitVec; +use futures::{ + channel::{mpsc, oneshot}, + prelude::*, +}; +use polkadot_node_subsystem::{ + delegated_subsystem, + errors::{ChainApiError, RuntimeApiError}, + messages::{ + AllMessages, ChainApiMessage, ProvisionableData, ProvisionerInherentData, + ProvisionerMessage, RuntimeApiMessage, + }, + util::{ + self, request_availability_cores, request_global_validation_data, + request_local_validation_data, JobTrait, ToJobTrait, + }, +}; +use polkadot_primitives::v1::{ + validation_data_hash, BackedCandidate, BlockNumber, CoreState, Hash, OccupiedCoreAssumption, + SignedAvailabilityBitfield, +}; +use std::{collections::HashMap, convert::TryFrom, pin::Pin}; + +struct ProvisioningJob { + relay_parent: Hash, + sender: mpsc::Sender, + receiver: mpsc::Receiver, + provisionable_data_channels: Vec>, + backed_candidates: Vec, + signed_bitfields: Vec, +} + +/// This enum defines the messages that the provisioner is prepared to receive. +pub enum ToJob { + /// The provisioner message is the main input to the provisioner. + Provisioner(ProvisionerMessage), + /// This message indicates that the provisioner should shut itself down. + Stop, +} + +impl ToJobTrait for ToJob { + const STOP: Self = Self::Stop; + + fn relay_parent(&self) -> Option { + match self { + Self::Provisioner(pm) => pm.relay_parent(), + Self::Stop => None, + } + } +} + +impl TryFrom for ToJob { + type Error = (); + + fn try_from(msg: AllMessages) -> Result { + match msg { + AllMessages::Provisioner(pm) => Ok(Self::Provisioner(pm)), + _ => Err(()), + } + } +} + +impl From for ToJob { + fn from(pm: ProvisionerMessage) -> Self { + Self::Provisioner(pm) + } +} + +enum FromJob { + ChainApi(ChainApiMessage), + Runtime(RuntimeApiMessage), +} + +impl From for AllMessages { + fn from(from_job: FromJob) -> AllMessages { + match from_job { + FromJob::ChainApi(cam) => AllMessages::ChainApi(cam), + FromJob::Runtime(ram) => AllMessages::RuntimeApi(ram), + } + } +} + +impl TryFrom for FromJob { + type Error = (); + + fn try_from(msg: AllMessages) -> Result { + match msg { + AllMessages::ChainApi(chain) => Ok(FromJob::ChainApi(chain)), + AllMessages::RuntimeApi(runtime) => Ok(FromJob::Runtime(runtime)), + _ => Err(()), + } + } +} + +#[derive(Debug, derive_more::From)] +enum Error { + #[from] + Sending(mpsc::SendError), + #[from] + Util(util::Error), + #[from] + OneshotRecv(oneshot::Canceled), + #[from] + ChainApi(ChainApiError), + #[from] + Runtime(RuntimeApiError), + OneshotSend, +} + +impl JobTrait for ProvisioningJob { + type ToJob = ToJob; + type FromJob = FromJob; + type Error = Error; + type RunArgs = (); + + const NAME: &'static str = "ProvisioningJob"; + + /// Run a job for the parent block indicated + // + // this function is in charge of creating and executing the job's main loop + fn run( + relay_parent: Hash, + _run_args: Self::RunArgs, + receiver: mpsc::Receiver, + sender: mpsc::Sender, + ) -> Pin> + Send>> { + async move { + let job = ProvisioningJob::new(relay_parent, sender, receiver); + + // it isn't necessary to break run_loop into its own function, + // but it's convenient to separate the concerns in this way + job.run_loop().await + } + .boxed() + } +} + +impl ProvisioningJob { + pub fn new( + relay_parent: Hash, + sender: mpsc::Sender, + receiver: mpsc::Receiver, + ) -> Self { + Self { + relay_parent, + sender, + receiver, + provisionable_data_channels: Vec::new(), + backed_candidates: Vec::new(), + signed_bitfields: Vec::new(), + } + } + + async fn run_loop(mut self) -> Result<(), Error> { + while let Some(msg) = self.receiver.next().await { + use ProvisionerMessage::{ + ProvisionableData, RequestBlockAuthorshipData, RequestInherentData, + }; + + match msg { + ToJob::Provisioner(RequestInherentData(_, return_sender)) => { + if let Err(err) = send_inherent_data( + self.relay_parent, + &self.signed_bitfields, + &self.backed_candidates, + return_sender, + self.sender.clone(), + ) + .await + { + log::warn!(target: "provisioner", "failed to send inherent data: {:?}", err); + } + } + ToJob::Provisioner(RequestBlockAuthorshipData(_, sender)) => { + self.provisionable_data_channels.push(sender) + } + ToJob::Provisioner(ProvisionableData(data)) => { + let mut bad_indices = Vec::new(); + for (idx, channel) in self.provisionable_data_channels.iter_mut().enumerate() { + match channel.send(data.clone()).await { + Ok(_) => {} + Err(_) => bad_indices.push(idx), + } + } + self.note_provisionable_data(data); + + // clean up our list of channels by removing the bad indices + // start by reversing it for efficient pop + bad_indices.reverse(); + // Vec::retain would be nicer here, but it doesn't provide + // an easy API for retaining by index, so we re-collect instead. + self.provisionable_data_channels = self + .provisionable_data_channels + .into_iter() + .enumerate() + .filter(|(idx, _)| { + if bad_indices.is_empty() { + return true; + } + let tail = bad_indices[bad_indices.len() - 1]; + let retain = *idx != tail; + if *idx >= tail { + bad_indices.pop(); + } + retain + }) + .map(|(_, item)| item) + .collect(); + } + ToJob::Stop => break, + } + } + + Ok(()) + } + + fn note_provisionable_data(&mut self, provisionable_data: ProvisionableData) { + match provisionable_data { + ProvisionableData::Bitfield(_, signed_bitfield) => { + self.signed_bitfields.push(signed_bitfield) + } + ProvisionableData::BackedCandidate(backed_candidate) => { + self.backed_candidates.push(backed_candidate) + } + _ => {} + } + } +} + +type CoreAvailability = BitVec; + +// The provisioner is the subsystem best suited to choosing which specific +// backed candidates and availability bitfields should be assembled into the +// block. To engage this functionality, a +// `ProvisionerMessage::RequestInherentData` is sent; the response is a set of +// non-conflicting candidates and the appropriate bitfields. Non-conflicting +// means that there are never two distinct parachain candidates included for +// the same parachain and that new parachain candidates cannot be included +// until the previous one either gets declared available or expired. +// +// The main complication here is going to be around handling +// occupied-core-assumptions. We might have candidates that are only +// includable when some bitfields are included. And we might have candidates +// that are not includable when certain bitfields are included. +// +// When we're choosing bitfields to include, the rule should be simple: +// maximize availability. So basically, include all bitfields. And then +// choose a coherent set of candidates along with that. +async fn send_inherent_data( + relay_parent: Hash, + bitfields: &[SignedAvailabilityBitfield], + candidates: &[BackedCandidate], + return_sender: oneshot::Sender, + mut from_job: mpsc::Sender, +) -> Result<(), Error> { + let availability_cores = match request_availability_cores(relay_parent, &mut from_job) + .await? + .await? + { + Ok(cores) => cores, + Err(runtime_err) => { + // Don't take down the node on runtime API errors. + log::warn!(target: "provisioner", "Encountered a runtime API error: {:?}", runtime_err); + return Ok(()); + } + }; + + let bitfields = select_availability_bitfields(&availability_cores, bitfields); + let candidates = select_candidates( + &availability_cores, + &bitfields, + candidates, + relay_parent, + &mut from_job, + ) + .await?; + + return_sender + .send((bitfields, candidates)) + .map_err(|_| Error::OneshotSend)?; + Ok(()) +} + +// in general, we want to pick all the bitfields. However, we have the following constraints: +// +// - not more than one per validator +// - each must correspond to an occupied core +// +// If we have too many, an arbitrary selection policy is fine. For purposes of maximizing availability, +// we pick the one with the greatest number of 1 bits. +// +// note: this does not enforce any sorting precondition on the output; the ordering there will be unrelated +// to the sorting of the input. +fn select_availability_bitfields( + cores: &[CoreState], + bitfields: &[SignedAvailabilityBitfield], +) -> Vec { + let mut fields_by_core: HashMap<_, Vec<_>> = HashMap::new(); + for bitfield in bitfields.iter() { + let core_idx = bitfield.validator_index() as usize; + if let CoreState::Occupied(_) = cores[core_idx] { + fields_by_core + .entry(core_idx) + // there cannot be a value list in field_by_core with len < 1 + .or_default() + .push(bitfield.clone()); + } + } + + let mut out = Vec::with_capacity(fields_by_core.len()); + for (_, core_bitfields) in fields_by_core.iter_mut() { + core_bitfields.sort_by_key(|bitfield| bitfield.payload().0.count_ones()); + out.push( + core_bitfields + .pop() + .expect("every core bitfield has at least 1 member; qed"), + ); + } + + out +} + +// determine which cores are free, and then to the degree possible, pick a candidate appropriate to each free core. +// +// follow the candidate selection algorithm from the guide +async fn select_candidates( + availability_cores: &[CoreState], + bitfields: &[SignedAvailabilityBitfield], + candidates: &[BackedCandidate], + relay_parent: Hash, + sender: &mut mpsc::Sender, +) -> Result, Error> { + let block_number = get_block_number_under_construction(relay_parent, sender).await?; + + let global_validation_data = request_global_validation_data(relay_parent, sender) + .await? + .await??; + + let mut selected_candidates = + Vec::with_capacity(candidates.len().min(availability_cores.len())); + + for (core_idx, core) in availability_cores.iter().enumerate() { + let (scheduled_core, assumption) = match core { + CoreState::Scheduled(scheduled_core) => (scheduled_core, OccupiedCoreAssumption::Free), + CoreState::Occupied(occupied_core) => { + if bitfields_indicate_availability(core_idx, bitfields, &occupied_core.availability) + { + if let Some(ref scheduled_core) = occupied_core.next_up_on_available { + (scheduled_core, OccupiedCoreAssumption::Included) + } else { + continue; + } + } else { + if occupied_core.time_out_at != block_number { + continue; + } + if let Some(ref scheduled_core) = occupied_core.next_up_on_time_out { + (scheduled_core, OccupiedCoreAssumption::TimedOut) + } else { + continue; + } + } + } + _ => continue, + }; + + let local_validation_data = match request_local_validation_data( + relay_parent, + scheduled_core.para_id, + assumption, + sender, + ) + .await? + .await?? + { + Some(local_validation_data) => local_validation_data, + None => continue, + }; + + let computed_validation_data_hash = + validation_data_hash(&global_validation_data, &local_validation_data); + + // we arbitrarily pick the first of the backed candidates which match the appropriate selection criteria + if let Some(candidate) = candidates.iter().find(|backed_candidate| { + let descriptor = &backed_candidate.candidate.descriptor; + descriptor.para_id == scheduled_core.para_id + && descriptor.validation_data_hash == computed_validation_data_hash + }) { + selected_candidates.push(candidate.clone()); + } + } + + Ok(selected_candidates) +} + +// produces a block number 1 higher than that of the relay parent +// in the event of an invalid `relay_parent`, returns `Ok(0)` +async fn get_block_number_under_construction( + relay_parent: Hash, + sender: &mut mpsc::Sender, +) -> Result { + let (tx, rx) = oneshot::channel(); + sender + .send(FromJob::ChainApi(ChainApiMessage::BlockNumber( + relay_parent, + tx, + ))) + .await + .map_err(|_| Error::OneshotSend)?; + match rx.await? { + Ok(Some(n)) => Ok(n + 1), + Ok(None) => Ok(0), + Err(err) => Err(err.into()), + } +} + +// the availability bitfield for a given core is the transpose +// of a set of signed availability bitfields. It goes like this: +// +// - construct a transverse slice along `core_idx` +// - bitwise-or it with the availability slice +// - count the 1 bits, compare to the total length; true on 2/3+ +fn bitfields_indicate_availability( + core_idx: usize, + bitfields: &[SignedAvailabilityBitfield], + availability: &CoreAvailability, +) -> bool { + let mut availability = availability.clone(); + // we need to pre-compute this to avoid a borrow-immutable-while-borrowing-mutable error in the error message + let availability_len = availability.len(); + + for bitfield in bitfields { + let validator_idx = bitfield.validator_index() as usize; + match availability.get_mut(validator_idx) { + None => { + // in principle, this function might return a `Result` so that we can more clearly express this error condition + // however, in practice, that would just push off an error-handling routine which would look a whole lot like this one. + // simpler to just handle the error internally here. + log::warn!(target: "provisioner", "attempted to set a transverse bit at idx {} which is greater than bitfield size {}", validator_idx, availability_len); + return false; + } + Some(mut bit_mut) => *bit_mut |= bitfield.payload().0[core_idx], + } + } + 3 * availability.count_ones() >= 2 * availability.len() +} + +delegated_subsystem!(ProvisioningJob(()) <- ToJob as ProvisioningSubsystem); + +#[cfg(test)] +mod tests { + use super::*; + use bitvec::bitvec; + use polkadot_primitives::v1::{OccupiedCore, ScheduledCore}; + + pub fn occupied_core(para_id: u32) -> CoreState { + CoreState::Occupied(OccupiedCore { + para_id: para_id.into(), + group_responsible: para_id.into(), + next_up_on_available: None, + occupied_since: 100_u32, + time_out_at: 200_u32, + next_up_on_time_out: None, + availability: default_bitvec(), + }) + } + + pub fn build_occupied_core(para_id: u32, builder: Builder) -> CoreState + where + Builder: FnOnce(&mut OccupiedCore), + { + let mut core = match occupied_core(para_id) { + CoreState::Occupied(core) => core, + _ => unreachable!(), + }; + + builder(&mut core); + + CoreState::Occupied(core) + } + + pub fn default_bitvec() -> CoreAvailability { + bitvec![bitvec::order::Lsb0, u8; 0; 32] + } + + pub fn scheduled_core(id: u32) -> ScheduledCore { + ScheduledCore { + para_id: id.into(), + ..Default::default() + } + } + + mod select_availability_bitfields { + use super::super::*; + use super::{default_bitvec, occupied_core}; + use lazy_static::lazy_static; + use polkadot_primitives::v1::{SigningContext, ValidatorIndex, ValidatorPair}; + use sp_core::crypto::Pair; + use std::sync::Mutex; + + lazy_static! { + // we can use a normal mutex here, not a futures-aware one, because we don't use any futures-based + // concurrency when accessing this. The risk of contention is that multiple tests are run in parallel, + // in independent threads, in which case a standard mutex suffices. + static ref VALIDATORS: Mutex> = Mutex::new(HashMap::new()); + } + + fn signed_bitfield( + field: CoreAvailability, + validator_idx: ValidatorIndex, + ) -> SignedAvailabilityBitfield { + let mut lock = VALIDATORS.lock().unwrap(); + let validator = lock + .entry(validator_idx) + .or_insert_with(|| ValidatorPair::generate().0); + SignedAvailabilityBitfield::sign( + field.into(), + &>::default(), + validator_idx, + validator, + ) + } + + #[test] + fn not_more_than_one_per_validator() { + let bitvec = default_bitvec(); + + let cores = vec![occupied_core(0), occupied_core(1)]; + + // we pass in three bitfields with two validators + // this helps us check the postcondition that we get two bitfields back, for which the validators differ + let bitfields = vec![ + signed_bitfield(bitvec.clone(), 0), + signed_bitfield(bitvec.clone(), 1), + signed_bitfield(bitvec, 1), + ]; + + let mut selected_bitfields = select_availability_bitfields(&cores, &bitfields); + selected_bitfields.sort_by_key(|bitfield| bitfield.validator_index()); + + assert_eq!(selected_bitfields.len(), 2); + assert_eq!(selected_bitfields[0], bitfields[0]); + // we don't know which of the (otherwise equal) bitfields will be selected + assert!(selected_bitfields[1] == bitfields[1] || selected_bitfields[1] == bitfields[2]); + } + + #[test] + fn each_corresponds_to_an_occupied_core() { + let bitvec = default_bitvec(); + + let cores = vec![CoreState::Free, CoreState::Scheduled(Default::default())]; + + let bitfields = vec![ + signed_bitfield(bitvec.clone(), 0), + signed_bitfield(bitvec.clone(), 1), + signed_bitfield(bitvec, 1), + ]; + + let mut selected_bitfields = select_availability_bitfields(&cores, &bitfields); + selected_bitfields.sort_by_key(|bitfield| bitfield.validator_index()); + + // bitfields not corresponding to occupied cores are not selected + assert!(selected_bitfields.is_empty()); + } + + #[test] + fn more_set_bits_win_conflicts() { + let bitvec_zero = default_bitvec(); + let bitvec_one = { + let mut bitvec = bitvec_zero.clone(); + bitvec.set(0, true); + bitvec + }; + + let cores = vec![occupied_core(0)]; + + let bitfields = vec![ + signed_bitfield(bitvec_zero, 0), + signed_bitfield(bitvec_one.clone(), 0), + ]; + + // this test is probablistic: chances are excellent that it does what it claims to. + // it cannot fail unless things are broken. + // however, there is a (very small) chance that it passes when things are broken. + for _ in 0..64 { + let selected_bitfields = select_availability_bitfields(&cores, &bitfields); + assert_eq!(selected_bitfields.len(), 1); + assert_eq!(selected_bitfields[0].payload().0, bitvec_one); + } + } + } + + mod select_candidates { + use super::super::*; + use super::{build_occupied_core, default_bitvec, occupied_core, scheduled_core}; + use polkadot_node_subsystem::messages::RuntimeApiRequest::{ + AvailabilityCores, GlobalValidationData, LocalValidationData, + }; + use polkadot_primitives::v1::{ + BlockNumber, CandidateDescriptor, CommittedCandidateReceipt, + }; + use FromJob::{ChainApi, Runtime}; + + const BLOCK_UNDER_PRODUCTION: BlockNumber = 128; + + fn test_harness( + overseer_factory: OverseerFactory, + test_factory: TestFactory, + ) where + OverseerFactory: FnOnce(mpsc::Receiver) -> Overseer, + Overseer: Future, + TestFactory: FnOnce(mpsc::Sender) -> Test, + Test: Future, + { + let (tx, rx) = mpsc::channel(64); + let overseer = overseer_factory(rx); + let test = test_factory(tx); + + futures::pin_mut!(overseer, test); + + tokio::runtime::Runtime::new() + .unwrap() + .block_on(future::select(overseer, test)); + } + + // For test purposes, we always return this set of availability cores: + // + // [ + // 0: Free, + // 1: Scheduled(default), + // 2: Occupied(no next_up set), + // 3: Occupied(next_up_on_available set but not available), + // 4: Occupied(next_up_on_available set and available), + // 5: Occupied(next_up_on_time_out set but not timeout), + // 6: Occupied(next_up_on_time_out set and timeout but available), + // 7: Occupied(next_up_on_time_out set and timeout and not available), + // 8: Occupied(both next_up set, available), + // 9: Occupied(both next_up set, not available, no timeout), + // 10: Occupied(both next_up set, not available, timeout), + // 11: Occupied(next_up_on_available and available, but different successor para_id) + // ] + fn mock_availability_cores() -> Vec { + use std::ops::Not; + use CoreState::{Free, Scheduled}; + + vec![ + // 0: Free, + Free, + // 1: Scheduled(default), + Scheduled(scheduled_core(1)), + // 2: Occupied(no next_up set), + occupied_core(2), + // 3: Occupied(next_up_on_available set but not available), + build_occupied_core(3, |core| { + core.next_up_on_available = Some(scheduled_core(3)); + }), + // 4: Occupied(next_up_on_available set and available), + build_occupied_core(4, |core| { + core.next_up_on_available = Some(scheduled_core(4)); + core.availability = core.availability.clone().not(); + }), + // 5: Occupied(next_up_on_time_out set but not timeout), + build_occupied_core(5, |core| { + core.next_up_on_time_out = Some(scheduled_core(5)); + }), + // 6: Occupied(next_up_on_time_out set and timeout but available), + build_occupied_core(6, |core| { + core.next_up_on_time_out = Some(scheduled_core(6)); + core.time_out_at = BLOCK_UNDER_PRODUCTION; + core.availability = core.availability.clone().not(); + }), + // 7: Occupied(next_up_on_time_out set and timeout and not available), + build_occupied_core(7, |core| { + core.next_up_on_time_out = Some(scheduled_core(7)); + core.time_out_at = BLOCK_UNDER_PRODUCTION; + }), + // 8: Occupied(both next_up set, available), + build_occupied_core(8, |core| { + core.next_up_on_available = Some(scheduled_core(8)); + core.next_up_on_time_out = Some(scheduled_core(8)); + core.availability = core.availability.clone().not(); + }), + // 9: Occupied(both next_up set, not available, no timeout), + build_occupied_core(9, |core| { + core.next_up_on_available = Some(scheduled_core(9)); + core.next_up_on_time_out = Some(scheduled_core(9)); + }), + // 10: Occupied(both next_up set, not available, timeout), + build_occupied_core(10, |core| { + core.next_up_on_available = Some(scheduled_core(10)); + core.next_up_on_time_out = Some(scheduled_core(10)); + core.time_out_at = BLOCK_UNDER_PRODUCTION; + }), + // 11: Occupied(next_up_on_available and available, but different successor para_id) + build_occupied_core(11, |core| { + core.next_up_on_available = Some(scheduled_core(12)); + core.availability = core.availability.clone().not(); + }), + ] + } + + async fn mock_overseer(mut receiver: mpsc::Receiver) { + use ChainApiMessage::BlockNumber; + use RuntimeApiMessage::Request; + + while let Some(from_job) = receiver.next().await { + match from_job { + ChainApi(BlockNumber(_relay_parent, tx)) => { + tx.send(Ok(Some(BLOCK_UNDER_PRODUCTION - 1))).unwrap() + } + Runtime(Request(_parent_hash, GlobalValidationData(tx))) => { + tx.send(Ok(Default::default())).unwrap() + } + Runtime(Request( + _parent_hash, + LocalValidationData(_para_id, _assumption, tx), + )) => tx.send(Ok(Some(Default::default()))).unwrap(), + Runtime(Request(_parent_hash, AvailabilityCores(tx))) => { + tx.send(Ok(mock_availability_cores())).unwrap() + } + // non-exhaustive matches are fine for testing + _ => unimplemented!(), + } + } + } + + #[test] + fn handles_overseer_failure() { + let overseer = |rx: mpsc::Receiver| async move { + // drop the receiver so it closes and the sender can't send, then just sleep long enough that + // this is almost certainly not the first of the two futures to complete + std::mem::drop(rx); + tokio::time::delay_for(std::time::Duration::from_secs(1)).await; + }; + + let test = |mut tx: mpsc::Sender| async move { + // wait so that the overseer can drop the rx before we attempt to send + tokio::time::delay_for(std::time::Duration::from_millis(50)).await; + let result = select_candidates(&[], &[], &[], Default::default(), &mut tx).await; + println!("{:?}", result); + assert!(std::matches!(result, Err(Error::OneshotSend))); + }; + + test_harness(overseer, test); + } + + #[test] + fn can_succeed() { + test_harness(mock_overseer, |mut tx: mpsc::Sender| async move { + let result = select_candidates(&[], &[], &[], Default::default(), &mut tx).await; + println!("{:?}", result); + assert!(result.is_ok()); + }) + } + + // this tests that only the appropriate candidates get selected. + // To accomplish this, we supply a candidate list containing one candidate per possible core; + // the candidate selection algorithm must filter them to the appropriate set + #[test] + fn selects_correct_candidates() { + let mock_cores = mock_availability_cores(); + + let empty_hash = + validation_data_hash::(&Default::default(), &Default::default()); + dbg!(empty_hash); + + let candidate_template = BackedCandidate { + candidate: CommittedCandidateReceipt { + descriptor: CandidateDescriptor { + validation_data_hash: empty_hash, + ..Default::default() + }, + ..Default::default() + }, + validity_votes: Vec::new(), + validator_indices: default_bitvec(), + }; + + let candidates: Vec<_> = std::iter::repeat(candidate_template) + .take(mock_cores.len()) + .enumerate() + .map(|(idx, mut candidate)| { + candidate.candidate.descriptor.para_id = idx.into(); + candidate + }) + .cycle() + .take(mock_cores.len() * 3) + .enumerate() + .map(|(idx, mut candidate)| { + if idx < mock_cores.len() { + // first go-around: use candidates which should work + candidate + } else if idx < mock_cores.len() * 2 { + // for the second repetition of the candidates, give them the wrong hash + candidate.candidate.descriptor.validation_data_hash = Default::default(); + candidate + } else { + // third go-around: right hash, wrong para_id + candidate.candidate.descriptor.para_id = idx.into(); + candidate + } + }) + .collect(); + + // why those particular indices? see the comments on mock_availability_cores() + let expected_candidates: Vec<_> = [1, 4, 7, 8, 10] + .iter() + .map(|&idx| candidates[idx].clone()) + .collect(); + + test_harness(mock_overseer, |mut tx: mpsc::Sender| async move { + let result = + select_candidates(&mock_cores, &[], &candidates, Default::default(), &mut tx) + .await; + + if result.is_err() { + println!("{:?}", result); + } + assert_eq!(result.unwrap(), expected_candidates); + }) + } + } +} diff --git a/node/primitives/src/lib.rs b/node/primitives/src/lib.rs index 201522abb5..2e5f993a7e 100644 --- a/node/primitives/src/lib.rs +++ b/node/primitives/src/lib.rs @@ -83,7 +83,7 @@ impl EncodeAs for Statement { pub type SignedFullStatement = Signed; /// A misbehaviour report. -#[derive(Debug)] +#[derive(Debug, Clone)] pub enum MisbehaviorReport { /// These validator nodes disagree on this candidate's validity, please figure it out /// diff --git a/node/subsystem/src/messages.rs b/node/subsystem/src/messages.rs index e3a4a419a5..29014c55a8 100644 --- a/node/subsystem/src/messages.rs +++ b/node/subsystem/src/messages.rs @@ -407,7 +407,8 @@ impl StatementDistributionMessage { } /// This data becomes intrinsics or extrinsics which should be included in a future relay chain block. -#[derive(Debug)] +// It needs to be cloneable because multiple potential block authors can request copies. +#[derive(Debug, Clone)] pub enum ProvisionableData { /// This bitfield indicates the availability of various candidate blocks. Bitfield(Hash, SignedAvailabilityBitfield), @@ -488,8 +489,6 @@ pub enum AllMessages { CandidateBacking(CandidateBackingMessage), /// Message for the candidate selection subsystem. CandidateSelection(CandidateSelectionMessage), - /// Message for the Chain API subsystem. - ChainApi(ChainApiMessage), /// Message for the statement distribution subsystem. StatementDistribution(StatementDistributionMessage), /// Message for the availability distribution subsystem. @@ -508,6 +507,8 @@ pub enum AllMessages { AvailabilityStore(AvailabilityStoreMessage), /// Message for the network bridge subsystem. NetworkBridge(NetworkBridgeMessage), + /// Message for the Chain API subsystem + ChainApi(ChainApiMessage), /// Test message /// /// This variant is only valid while testing, but makes the process of testing the diff --git a/node/subsystem/src/util.rs b/node/subsystem/src/util.rs index 14f6f96ed2..7472ebeb8a 100644 --- a/node/subsystem/src/util.rs +++ b/node/subsystem/src/util.rs @@ -21,10 +21,8 @@ //! this module. use crate::{ - messages::{ - AllMessages, RuntimeApiMessage, RuntimeApiRequest, RuntimeApiSender, - }, errors::{ChainApiError, RuntimeApiError}, + messages::{AllMessages, RuntimeApiMessage, RuntimeApiRequest, RuntimeApiSender}, FromOverseer, SpawnedSubsystem, Subsystem, SubsystemContext, SubsystemError, SubsystemResult, }; use futures::{ @@ -40,13 +38,12 @@ use keystore::KeyStorePtr; use parity_scale_codec::Encode; use pin_project::{pin_project, pinned_drop}; use polkadot_primitives::v1::{ - EncodeAs, Hash, Signed, SigningContext, SessionIndex, - ValidatorId, ValidatorIndex, ValidatorPair, GroupRotationInfo, -}; -use sp_core::{ - Pair, - traits::SpawnNamed, + CandidateEvent, CommittedCandidateReceipt, CoreState, EncodeAs, GlobalValidationData, + GroupRotationInfo, Hash, Id as ParaId, LocalValidationData, OccupiedCoreAssumption, + SessionIndex, Signed, SigningContext, ValidationCode, ValidatorId, ValidatorIndex, + ValidatorPair, }; +use sp_core::Pair; use std::{ collections::HashMap, convert::{TryFrom, TryInto}, @@ -56,6 +53,11 @@ use std::{ }; use streamunordered::{StreamUnordered, StreamYield}; +/// This reexport is required so that external crates can use the `delegated_subsystem` macro properly. +/// +/// Otherwise, downstream crates might have to modify their `Cargo.toml` to ensure `sp-core` appeared there. +pub use sp_core::traits::SpawnNamed; + /// Duration a job will wait after sending a stop signal before hard-aborting. pub const JOB_GRACEFUL_STOP_DURATION: Duration = Duration::from_secs(1); /// Capacity of channels to and from individual jobs @@ -119,42 +121,67 @@ where Ok(rx) } -/// Request a validator set from the `RuntimeApi`. -pub async fn request_validators( - parent: Hash, - s: &mut mpsc::Sender, -) -> Result>, Error> -where - FromJob: TryFrom, - >::Error: std::fmt::Debug, -{ - request_from_runtime(parent, s, |tx| RuntimeApiRequest::Validators(tx)).await -} +/// Construct specialized request functions for the runtime. +/// +/// These would otherwise get pretty repetitive. +macro_rules! specialize_requests { + // expand return type name for documentation purposes + (fn $func_name:ident( $( $param_name:ident : $param_ty:ty ),* ) -> $return_ty:ty ; $request_variant:ident;) => { + specialize_requests!{ + named stringify!($request_variant) ; fn $func_name( $( $param_name : $param_ty ),* ) -> $return_ty ; $request_variant; + } + }; -/// Request the validator groups. -pub async fn request_validator_groups( - parent: Hash, - s: &mut mpsc::Sender, -) -> Result>, GroupRotationInfo)>, Error> -where - FromJob: TryFrom, - >::Error: std::fmt::Debug, -{ - request_from_runtime(parent, s, |tx| RuntimeApiRequest::ValidatorGroups(tx)).await + // create a single specialized request function + (named $doc_name:expr ; fn $func_name:ident( $( $param_name:ident : $param_ty:ty ),* ) -> $return_ty:ty ; $request_variant:ident;) => { + #[doc = "Request `"] + #[doc = $doc_name] + #[doc = "` from the runtime"] + pub async fn $func_name( + parent: Hash, + $( + $param_name: $param_ty, + )* + sender: &mut mpsc::Sender, + ) -> Result, Error> + where + FromJob: TryFrom, + >::Error: std::fmt::Debug, + { + request_from_runtime(parent, sender, |tx| RuntimeApiRequest::$request_variant( + $( $param_name, )* tx + )).await + } + }; + + // recursive decompose + ( + fn $func_name:ident( $( $param_name:ident : $param_ty:ty ),* ) -> $return_ty:ty ; $request_variant:ident; + $( + fn $t_func_name:ident( $( $t_param_name:ident : $t_param_ty:ty ),* ) -> $t_return_ty:ty ; $t_request_variant:ident; + )+ + ) => { + specialize_requests!{ + fn $func_name( $( $param_name : $param_ty ),* ) -> $return_ty ; $request_variant ; + } + specialize_requests!{ + $( + fn $t_func_name( $( $t_param_name : $t_param_ty ),* ) -> $t_return_ty ; $t_request_variant ; + )+ + } + }; } -/// Request the session index of the child block. -pub async fn request_session_index_for_child( - parent: Hash, - s: &mut mpsc::Sender, -) -> Result, Error> -where - FromJob: TryFrom, - >::Error: std::fmt::Debug, -{ - request_from_runtime(parent, s, |tx| { - RuntimeApiRequest::SessionIndexForChild(tx) - }).await +specialize_requests! { + fn request_validators() -> Vec; Validators; + fn request_validator_groups() -> (Vec>, GroupRotationInfo); ValidatorGroups; + fn request_availability_cores() -> Vec; AvailabilityCores; + fn request_global_validation_data() -> GlobalValidationData; GlobalValidationData; + fn request_local_validation_data(para_id: ParaId, assumption: OccupiedCoreAssumption) -> Option; LocalValidationData; + fn request_session_index_for_child() -> SessionIndex; SessionIndexForChild; + fn request_validation_code(para_id: ParaId, assumption: OccupiedCoreAssumption) -> Option; ValidationCode; + fn request_candidate_pending_availability(para_id: ParaId) -> Option; CandidatePendingAvailability; + fn request_candidate_events() -> Vec; CandidateEvents; } /// From the given set of validators, find the first key we can sign with, if any. @@ -405,8 +432,13 @@ impl Jobs { /// the error is forwarded onto the provided channel. /// /// Errors if the error channel already exists. - pub fn forward_errors(&mut self, tx: mpsc::Sender<(Option, JobsError)>) -> Result<(), Error> { - if self.errors.is_some() { return Err(Error::AlreadyForwarding) } + pub fn forward_errors( + &mut self, + tx: mpsc::Sender<(Option, JobsError)>, + ) -> Result<(), Error> { + if self.errors.is_some() { + return Err(Error::AlreadyForwarding); + } self.errors = Some(tx); Ok(()) } @@ -510,13 +542,12 @@ where fn poll_next(self: Pin<&mut Self>, cx: &mut task::Context) -> task::Poll> { // pin-project the outgoing messages - self.project() - .outgoing_msgs - .poll_next(cx) - .map(|opt| opt.and_then(|(stream_yield, _)| match stream_yield { + self.project().outgoing_msgs.poll_next(cx).map(|opt| { + opt.and_then(|(stream_yield, _)| match stream_yield { StreamYield::Item(msg) => Some(msg), StreamYield::Finished(_) => None, - })) + }) + }) } } @@ -559,8 +590,13 @@ where /// the error is forwarded onto the provided channel. /// /// Errors if the error channel already exists. - pub fn forward_errors(&mut self, tx: mpsc::Sender<(Option, JobsError)>) -> Result<(), Error> { - if self.errors.is_some() { return Err(Error::AlreadyForwarding) } + pub fn forward_errors( + &mut self, + tx: mpsc::Sender<(Option, JobsError)>, + ) -> Result<(), Error> { + if self.errors.is_some() { + return Err(Error::AlreadyForwarding); + } self.errors = Some(tx); Ok(()) } @@ -576,10 +612,16 @@ where /// /// If `err_tx` is not `None`, errors are forwarded onto that channel as they occur. /// Otherwise, most are logged and then discarded. - pub async fn run(mut ctx: Context, run_args: Job::RunArgs, spawner: Spawner, mut err_tx: Option, JobsError)>>) { + pub async fn run( + mut ctx: Context, + run_args: Job::RunArgs, + spawner: Spawner, + mut err_tx: Option, JobsError)>>, + ) { let mut jobs = Jobs::new(spawner.clone()); if let Some(ref err_tx) = err_tx { - jobs.forward_errors(err_tx.clone()).expect("we never call this twice in this context; qed"); + jobs.forward_errors(err_tx.clone()) + .expect("we never call this twice in this context; qed"); } loop { @@ -592,7 +634,11 @@ where } // if we have a channel on which to forward errors, do so - async fn fwd_err(hash: Option, err: JobsError, err_tx: &mut Option, JobsError)>>) { + async fn fwd_err( + hash: Option, + err: JobsError, + err_tx: &mut Option, JobsError)>>, + ) { if let Some(err_tx) = err_tx { // if we can't send on the error transmission channel, we can't do anything useful about it // still, we can at least log the failure @@ -607,14 +653,17 @@ where incoming: SubsystemResult>, jobs: &mut Jobs, run_args: &Job::RunArgs, - err_tx: &mut Option, JobsError)>> + err_tx: &mut Option, JobsError)>>, ) -> bool { - use crate::FromOverseer::{Communication, Signal}; use crate::ActiveLeavesUpdate; - use crate::OverseerSignal::{BlockFinalized, Conclude, ActiveLeaves}; + use crate::FromOverseer::{Communication, Signal}; + use crate::OverseerSignal::{ActiveLeaves, BlockFinalized, Conclude}; match incoming { - Ok(Signal(ActiveLeaves(ActiveLeavesUpdate { activated, deactivated }))) => { + Ok(Signal(ActiveLeaves(ActiveLeavesUpdate { + activated, + deactivated, + }))) => { for hash in activated { if let Err(e) = jobs.spawn_job(hash, run_args.clone()) { log::error!("Failed to spawn a job: {:?}", e); @@ -638,10 +687,11 @@ where // Forwarding the stream to a drain means we wait until all of the items in the stream // have completed. Contrast with `into_future`, which turns it into a future of `(head, rest_stream)`. use futures::sink::drain; - use futures::stream::StreamExt; use futures::stream::FuturesUnordered; + use futures::stream::StreamExt; - if let Err(e) = jobs.running + if let Err(e) = jobs + .running .drain() .map(|(_, handle)| handle.stop()) .collect::>() @@ -686,7 +736,11 @@ where } // handle an outgoing message. return true if we should break afterwards. - async fn handle_outgoing(outgoing: Option, ctx: &mut Context, err_tx: &mut Option, JobsError)>>) -> bool { + async fn handle_outgoing( + outgoing: Option, + ctx: &mut Context, + err_tx: &mut Option, JobsError)>>, + ) -> bool { match outgoing { Some(msg) => { if let Err(e) = ctx.send_message(msg.into()).await { @@ -713,7 +767,6 @@ where let run_args = self.run_args.clone(); let errors = self.errors; - let future = Box::pin(async move { Self::run(ctx, run_args, spawner, errors).await; }); @@ -725,41 +778,107 @@ where } } +/// Create a delegated subsystem +/// +/// It is possible to create a type which implements `Subsystem` by simply doing: +/// +/// ```ignore +/// pub type ExampleSubsystem = util::JobManager; +/// ``` +/// +/// However, doing this requires that job itself and all types which comprise it (i.e. `ToJob`, `FromJob`, `Error`, `RunArgs`) +/// are public, to avoid exposing private types in public interfaces. It's possible to delegate instead, which +/// can reduce the total number of public types exposed, i.e. +/// +/// ```ignore +/// type Manager = util::JobManager; +/// pub struct ExampleSubsystem { +/// manager: Manager, +/// } +/// +/// impl Subsystem for ExampleSubsystem { ... } +/// ``` +/// +/// This dramatically reduces the number of public types in the crate; the only things which must be public are now +/// +/// - `struct ExampleSubsystem` (defined by this macro) +/// - `type ToJob` (because it appears in a trait bound) +/// - `type RunArgs` (because it appears in a function signature) +/// +/// Implementing this all manually is of course possible, but it's tedious; why bother? This macro exists for +/// the purpose of doing it automatically: +/// +/// ```ignore +/// delegated_subsystem!(ExampleJob(ExampleRunArgs) <- ExampleToJob as ExampleSubsystem); +/// ``` +#[macro_export] +macro_rules! delegated_subsystem { + ($job:ident($run_args:ty) <- $to_job:ty as $subsystem:ident) => { + delegated_subsystem!($job($run_args) <- $to_job as $subsystem; stringify!($subsystem)); + }; + + ($job:ident($run_args:ty) <- $to_job:ty as $subsystem:ident; $subsystem_name:expr) => { + #[doc = "Manager type for the "] + #[doc = $subsystem_name] + type Manager = $crate::util::JobManager; + + #[doc = "An implementation of the "] + #[doc = $subsystem_name] + pub struct $subsystem { + manager: Manager, + } + + impl $subsystem + where + Spawner: Clone + $crate::util::SpawnNamed + Send + Unpin, + Context: $crate::SubsystemContext, + ::Message: Into<$to_job>, + { + #[doc = "Creates a new "] + #[doc = $subsystem_name] + pub fn new(spawner: Spawner, run_args: $run_args) -> Self { + $subsystem { + manager: $crate::util::JobManager::new(spawner, run_args) + } + } + + /// Run this subsystem + pub async fn run(ctx: Context, run_args: $run_args, spawner: Spawner) { + >::run(ctx, run_args, spawner, None).await + } + } + + impl $crate::Subsystem for $subsystem + where + Spawner: $crate::util::SpawnNamed + Send + Clone + Unpin + 'static, + Context: $crate::SubsystemContext, + ::Message: Into<$to_job>, + { + fn start(self, ctx: Context) -> $crate::SpawnedSubsystem { + self.manager.start(ctx) + } + } + }; +} + #[cfg(test)] mod tests { - use assert_matches::assert_matches; use crate::{ messages::{AllMessages, CandidateSelectionMessage}, test_helpers::{self, make_subsystem_context}, - util::{ - self, - JobsError, - JobManager, - JobTrait, - ToJobTrait, - }, - ActiveLeavesUpdate, - FromOverseer, - OverseerSignal, - SpawnedSubsystem, - Subsystem, + util::{self, JobManager, JobTrait, JobsError, ToJobTrait}, + ActiveLeavesUpdate, FromOverseer, OverseerSignal, SpawnedSubsystem, Subsystem, }; + use assert_matches::assert_matches; use futures::{ channel::mpsc, executor, - Future, - FutureExt, stream::{self, StreamExt}, - SinkExt, + Future, FutureExt, SinkExt, }; use futures_timer::Delay; use polkadot_primitives::v1::Hash; - use std::{ - collections::HashMap, - convert::TryFrom, - pin::Pin, - time::Duration, - }; + use std::{collections::HashMap, convert::TryFrom, pin::Pin, time::Duration}; // basic usage: in a nutshell, when you want to define a subsystem, just focus on what its jobs do; // you can leave the subsystem itself to the job manager. @@ -803,7 +922,7 @@ mod tests { fn try_from(msg: AllMessages) -> Result { match msg { AllMessages::CandidateSelection(csm) => Ok(ToJob::CandidateSelection(csm)), - _ => Err(()) + _ => Err(()), } } } @@ -839,7 +958,7 @@ mod tests { #[derive(Debug, derive_more::From)] enum Error { #[from] - Sending(mpsc::SendError) + Sending(mpsc::SendError), } impl JobTrait for FakeCandidateSelectionJob { @@ -867,9 +986,7 @@ mod tests { mut sender: mpsc::Sender, ) -> Pin> + Send>> { async move { - let job = FakeCandidateSelectionJob { - receiver, - }; + let job = FakeCandidateSelectionJob { receiver }; // most jobs will have a request-response cycle at the heart of their run loop. // however, in this case, we never receive valid messages, so we may as well @@ -881,7 +998,8 @@ mod tests { // it isn't necessary to break run_loop into its own function, // but it's convenient to separate the concerns in this way job.run_loop().await - }.boxed() + } + .boxed() } } @@ -901,12 +1019,16 @@ mod tests { } // with the job defined, it's straightforward to get a subsystem implementation. - type FakeCandidateSelectionSubsystem = JobManager; + type FakeCandidateSelectionSubsystem = + JobManager; // this type lets us pretend to be the overseer type OverseerHandle = test_helpers::TestSubsystemContextHandle; - fn test_harness>(run_args: HashMap>, test: impl FnOnce(OverseerHandle, mpsc::Receiver<(Option, JobsError)>) -> T) { + fn test_harness>( + run_args: HashMap>, + test: impl FnOnce(OverseerHandle, mpsc::Receiver<(Option, JobsError)>) -> T, + ) { let pool = sp_core::testing::TaskExecutor::new(); let (context, overseer_handle) = make_subsystem_context(pool.clone()); let (err_tx, err_rx) = mpsc::channel(16); @@ -933,15 +1055,26 @@ mod tests { let relay_parent: Hash = [0; 32].into(); let mut run_args = HashMap::new(); let test_message = format!("greetings from {}", relay_parent); - run_args.insert(relay_parent.clone(), vec![FromJob::Test(test_message.clone())]); + run_args.insert( + relay_parent.clone(), + vec![FromJob::Test(test_message.clone())], + ); test_harness(run_args, |mut overseer_handle, err_rx| async move { - overseer_handle.send(FromOverseer::Signal(OverseerSignal::ActiveLeaves(ActiveLeavesUpdate::start_work(relay_parent)))).await; + overseer_handle + .send(FromOverseer::Signal(OverseerSignal::ActiveLeaves( + ActiveLeavesUpdate::start_work(relay_parent), + ))) + .await; assert_matches!( overseer_handle.recv().await, AllMessages::Test(msg) if msg == test_message ); - overseer_handle.send(FromOverseer::Signal(OverseerSignal::ActiveLeaves(ActiveLeavesUpdate::stop_work(relay_parent)))).await; + overseer_handle + .send(FromOverseer::Signal(OverseerSignal::ActiveLeaves( + ActiveLeavesUpdate::stop_work(relay_parent), + ))) + .await; let errs: Vec<_> = err_rx.collect().await; assert_eq!(errs.len(), 0); @@ -954,7 +1087,11 @@ mod tests { let run_args = HashMap::new(); test_harness(run_args, |mut overseer_handle, err_rx| async move { - overseer_handle.send(FromOverseer::Signal(OverseerSignal::ActiveLeaves(ActiveLeavesUpdate::stop_work(relay_parent)))).await; + overseer_handle + .send(FromOverseer::Signal(OverseerSignal::ActiveLeaves( + ActiveLeavesUpdate::stop_work(relay_parent), + ))) + .await; let errs: Vec<_> = err_rx.collect().await; assert_eq!(errs.len(), 1); @@ -971,10 +1108,8 @@ mod tests { let pool = sp_core::testing::TaskExecutor::new(); let (context, _) = make_subsystem_context::(pool.clone()); - let SpawnedSubsystem { name, .. } = FakeCandidateSelectionSubsystem::new( - pool, - HashMap::new(), - ).start(context); + let SpawnedSubsystem { name, .. } = + FakeCandidateSelectionSubsystem::new(pool, HashMap::new()).start(context); assert_eq!(name, "FakeCandidateSelection"); } } diff --git a/primitives/src/v1.rs b/primitives/src/v1.rs index 67926f2ab3..781f6f7711 100644 --- a/primitives/src/v1.rs +++ b/primitives/src/v1.rs @@ -585,7 +585,7 @@ pub struct OccupiedCore { /// Information about a core which is currently occupied. #[derive(Clone, Encode, Decode)] -#[cfg_attr(feature = "std", derive(PartialEq, Debug))] +#[cfg_attr(feature = "std", derive(PartialEq, Debug, Default))] pub struct ScheduledCore { /// The ID of a para scheduled. pub para_id: Id, @@ -613,8 +613,19 @@ pub enum CoreState { Free, } +impl CoreState { + /// If this core state has a `para_id`, return it. + pub fn para_id(&self) -> Option { + match self { + Self::Occupied(OccupiedCore { para_id, ..}) => Some(*para_id), + Self::Scheduled(ScheduledCore { para_id, .. }) => Some(*para_id), + Self::Free => None, + } + } +} + /// An assumption being made about the state of an occupied core. -#[derive(Clone, Encode, Decode)] +#[derive(Clone, Copy, Encode, Decode)] #[cfg_attr(feature = "std", derive(PartialEq, Debug))] pub enum OccupiedCoreAssumption { /// The candidate occupying the core was made available and included to free the core. diff --git a/roadmap/implementers-guide/src/SUMMARY.md b/roadmap/implementers-guide/src/SUMMARY.md index 59df20db21..fa364ac490 100644 --- a/roadmap/implementers-guide/src/SUMMARY.md +++ b/roadmap/implementers-guide/src/SUMMARY.md @@ -15,6 +15,15 @@ - [Validity Module](runtime/validity.md) - [Router Module](runtime/router.md) - [Runtime APIs](runtime-api/README.md) + - [Validators](runtime-api/validators.md) + - [Validator Groups](runtime-api/validator-groups.md) + - [Availability Cores](runtime-api/availability-cores.md) + - [Global Validation Data](runtime-api/global-validation-data.md) + - [Local Validation Data](runtime-api/local-validation-data.md) + - [Session Index](runtime-api/session-index.md) + - [Validation Code](runtime-api/validation-code.md) + - [Candidate Pending Availability](runtime-api/candidate-pending-availability.md) + - [Candidate Events](runtime-api/candidate-events.md) - [Node Architecture](node/README.md) - [Subsystems and Jobs](node/subsystems-and-jobs.md) - [Overseer](node/overseer.md) diff --git a/roadmap/implementers-guide/src/node/utility/provisioner.md b/roadmap/implementers-guide/src/node/utility/provisioner.md index 7692cd885d..8e6afc9d31 100644 --- a/roadmap/implementers-guide/src/node/utility/provisioner.md +++ b/roadmap/implementers-guide/src/node/utility/provisioner.md @@ -40,7 +40,54 @@ Note that block authors must re-send a `ProvisionerMessage::RequestBlockAuthorsh ## Block Production -When a validator is selected by BABE to author a block, it becomes a block producer. The provisioner is the subsystem best suited to choosing which specific backed candidates and availability bitfields should be assembled into the block. To engage this functionality, a `ProvisionerMessage::RequestInherentData` is sent; the response is a set of non-conflicting candidates and the appropriate bitfields. Non-conflicting means that there are never two distinct parachain candidates included for the same parachain and that new parachain candidates cannot be included until the previous one either gets declared available or expired. +When a validator is selected by BABE to author a block, it becomes a block producer. The provisioner is the subsystem best suited to choosing which specific backed candidates and availability bitfields should be assembled into the block. To engage this functionality, a `ProvisionerMessage::RequestInherentData` is sent; the response is a set of non-conflicting candidates and the appropriate bitfields. Non-conflicting means that there are never two distinct parachain candidates included for the same parachain and that new parachain candidates cannot be backed until the previous one either gets declared available or expired. + +### Bitfield Selection + +Our goal with respect to bitfields is simple: maximize availability. However, it's not quite as simple as always including all bitfields; there are constraints which still need to be met: + +- We cannot choose more than one bitfield per validator. +- Each bitfield must correspond to an occupied core. + +Beyond that, a semi-arbitrary selection policy is fine. In order to meet the goal of maximizing availability, a heuristic of picking the bitfield with the greatest number of 1 bits set in the event of conflict is useful. + +### Candidate Selection + +The goal of candidate selection is to determine which cores are free, and then to the degree possible, pick a candidate appropriate to each free core. + +To determine availability: + +- Get the list of core states from the runtime API +- For each core state: + - On `CoreState::Scheduled`, then we can make an `OccupiedCoreAssumption::Free`. + - On `CoreState::Occupied`, then we may be able to make an assumption: + - If the bitfields indicate availability and there is a scheduled `next_up_on_available`, then we can make an `OccupiedCoreAssumption::Included`. + - If the bitfields do not indicate availability, and there is a scheduled `next_up_on_time_out`, and `occupied_core.time_out_at == block_number_under_production`, then we can make an `OccupiedCoreAssumption::TimedOut`. + - If we did not make an `OccupiedCoreAssumption`, then continue on to the next core. + - Now compute the core's `validation_data_hash`: get the `LocalValidationData` from the runtime, given the known `ParaId` and `OccupiedCoreAssumption`; this can be combined with a cached `GlobalValidationData` to compute the hash. + - Find an appropriate candidate for the core. + - There are two constraints: `backed_candidate.candidate.descriptor.para_id == scheduled_core.para_id && candidate.candidate.descriptor.validation_data_hash == computed_validation_data_hash`. + - In the event that more than one candidate meets the constraints, selection between the candidates is arbitrary. However, not more than one candidate can be selected per core. + +The end result of this process is a vector of `BackedCandidate`s, sorted in order of their core index. + +### Determining Bitfield Availability + +An occupied core has a `CoreAvailability` bitfield. We also have a list of `SignedAvailabilityBitfield`s. We need to determine from these whether or not a core at a particular index has become available. + +The key insight required is that `CoreAvailability` is transverse to the `SignedAvailabilityBitfield`s: if we conceptualize the list of bitfields as many rows, each bit of which is its own column, then `CoreAvailability` for a given core index is the vertical slice of bits in the set at that index. + +To compute bitfield availability, then: + +- Start with a copy of `OccupiedCore.availability` +- For each bitfield in the list of `SignedAvailabilityBitfield`s: + - Get the bitfield's `validator_index` + - Update the availability. Conceptually, assuming bit vectors: `availability[validator_index] |= bitfield[core_idx]` +- Availability has a 2/3 threshold. Therefore: `3 * availability.count_ones() >= 2 * availability.len()` + +### Notes + +See also: [Scheduler Module: Availability Cores](../../runtime/scheduler.md#availability-cores). One might ask: given `ProvisionerMessage::RequestInherentData`, what's the point of `ProvisionerMessage::RequestBlockAuthorshipData`? The answer is that the block authorship data includes more information than is present in the inherent data; disputes, for example. @@ -51,10 +98,10 @@ The subsystem should maintain a set of handles to Block Authorship Provisioning ### On Overseer Signal - `ActiveLeavesUpdate`: - - For each `activated` head: - - spawn a Block Authorship Provisioning Job with the given relay parent, storing a bidirectional channel with that job. - - For each `deactivated` head: - - terminate the Block Authorship Provisioning Job for the given relay parent, if any. + - For each `activated` head: + - spawn a Block Authorship Provisioning Job with the given relay parent, storing a bidirectional channel with that job. + - For each `deactivated` head: + - terminate the Block Authorship Provisioning Job for the given relay parent, if any. - `Conclude`: Forward `Conclude` to all jobs, waiting a small amount of time for them to join, and then hard-exiting. ### On `ProvisionerMessage` diff --git a/roadmap/implementers-guide/src/runtime-api/README.md b/roadmap/implementers-guide/src/runtime-api/README.md index cb8998230d..ce1d3948f0 100644 --- a/roadmap/implementers-guide/src/runtime-api/README.md +++ b/roadmap/implementers-guide/src/runtime-api/README.md @@ -7,17 +7,19 @@ Every block in the relay-chain contains a *state root* which is the root hash of Although Runtime APIs are often used for simple storage access, they are actually empowered to do arbitrary computation. The implementation of the Runtime APIs lives within the Runtime as Wasm code and exposes extern functions that can be invoked with arguments and have a return value. Runtime APIs have access to a variety of host functions, which are contextual functions provided by the Wasm execution context, that allow it to carry out many different types of behaviors. Abilities provided by host functions includes: - * State Access - * Offchain-DB Access - * Submitting transactions to the transaction queue - * Optimized versions of cryptographic functions - * More + +* State Access +* Offchain-DB Access +* Submitting transactions to the transaction queue +* Optimized versions of cryptographic functions +* More So it is clear that Runtime APIs are a versatile and powerful tool to leverage the state of the chain. In general, we will use Runtime APIs for these purposes: - * Access of a storage item - * Access of a bundle of related storage items - * Deriving a value from storage based on arguments - * Submitting misbehavior reports + +* Access of a storage item +* Access of a bundle of related storage items +* Deriving a value from storage based on arguments +* Submitting misbehavior reports More broadly, we have the goal of using Runtime APIs to write Node-side code that fulfills the requirements set by the Runtime. In particular, the constraints set forth by the [Scheduler](../runtime/scheduler.md) and [Inclusion](../runtime/inclusion.md) modules. These modules are responsible for advancing paras with a two-phase protocol where validators are first chosen to validate and back a candidate and then required to ensure availability of referenced data. In the second phase, validators are meant to attest to those para-candidates that they have their availability chunk for. As the Node-side code needs to generate the inputs into these two phases, the runtime API needs to transmit information from the runtime that is aware of the Availability Cores model instantiated by the Scheduler and Inclusion modules. @@ -35,180 +37,3 @@ The next sections will contain information on specific runtime APIs. The format /// best for the implementation to return an error indicating the failure mode. fn some_runtime_api(at: Block, arg1: Type1, arg2: Type2, ...) -> ReturnValue; ``` - -## Validators - -Yields the validator-set at the state of a given block. This validator set is always the one responsible for backing parachains in the child of the provided block. - -```rust -fn validators(at: Block) -> Vec; -``` - -## Validator Groups - -Yields the validator groups used during the current session. The validators in the groups are referred to by their index into the validator-set. - -```rust -/// A helper data-type for tracking validator-group rotations. -struct GroupRotationInfo { - session_start_block: BlockNumber, - group_rotation_frequency: BlockNumber, - now: BlockNumber, -} - -impl GroupRotationInfo { - /// Returns the index of the group needed to validate the core at the given index, - /// assuming the given amount of cores/groups. - fn group_for_core(&self, core_index, cores) -> GroupIndex; - - /// Returns the block number of the next rotation after the current block. If the current block - /// is 10 and the rotation frequency is 5, this should return 15. - /// - /// If the group rotation frequency is 0, returns 0. - fn next_rotation_at(&self) -> BlockNumber; - - /// Returns the block number of the last rotation before or including the current block. If the - /// current block is 10 and the rotation frequency is 5, this should return 10. - /// - /// If the group rotation frequency is 0, returns 0. - fn last_rotation_at(&self) -> BlockNumber; -} - -/// Returns the validator groups and rotation info localized based on the block whose state -/// this is invoked on. Note that `now` in the `GroupRotationInfo` should be the successor of -/// the number of the block. -fn validator_groups(at: Block) -> (Vec>, GroupRotationInfo); -``` - -## Availability Cores - -Yields information on all availability cores. Cores are either free or occupied. Free cores can have paras assigned to them. Occupied cores don't, but they can become available part-way through a block due to bitfields and then have something scheduled on them. To allow optimistic validation of candidates, the occupied cores are accompanied by information on what is upcoming. This information can be leveraged when validators perceive that there is a high likelihood of a core becoming available based on bitfields seen, and then optimistically validate something that would become scheduled based on that, although there is no guarantee on what the block producer will actually include in the block. - -```rust -fn availability_cores(at: Block) -> Vec; -``` - -This is all the information that a validator needs about scheduling for the current block. It includes all information on [Scheduler](../runtime/scheduler.md) core-assignments and [Inclusion](../runtime/inclusion.md) state of blocks occupying availability cores. It includes data necessary to determine not only which paras are assigned now, but which cores are likely to become freed after processing bitfields, and exactly which bitfields would be necessary to make them so. - -```rust -struct OccupiedCore { - /// The ID of the para occupying the core. - para_id: ParaId, - /// If this core is freed by availability, this is the assignment that is next up on this - /// core, if any. None if there is nothing queued for this core. - next_up_on_available: Option, - /// The relay-chain block number this began occupying the core at. - occupied_since: BlockNumber, - /// The relay-chain block this will time-out at, if any. - time_out_at: BlockNumber, - /// If this core is freed by being timed-out, this is the assignment that is next up on this - /// core. None if there is nothing queued for this core or there is no possibility of timing - /// out. - next_up_on_time_out: Option, - /// A bitfield with 1 bit for each validator in the set. `1` bits mean that the corresponding - /// validators has attested to availability on-chain. A 2/3+ majority of `1` bits means that - /// this will be available. - availability: Bitfield, - /// The group assigned to distribute availability pieces of this candidate. - group_responsible: GroupIndex, -} - -struct ScheduledCore { - /// The ID of a para scheduled. - para_id: ParaId, - /// The collator required to author the block, if any. - collator: Option, -} - -enum CoreState { - /// The core is currently occupied. - Occupied(OccupiedCore), - /// The core is currently free, with a para scheduled and given the opportunity - /// to occupy. - /// - /// If a particular Collator is required to author this block, that is also present in this - /// variant. - Scheduled(ScheduledCore), - /// The core is currently free and there is nothing scheduled. This can be the case for parathread - /// cores when there are no parathread blocks queued. Parachain cores will never be left idle. - Free, -} -``` - -## Global Validation Schedule - -Yields the [`GlobalValidationData`](../types/candidate.md#globalvalidationschedule) at the state of a given block. This applies to all para candidates with the relay-parent equal to that block. - -```rust -fn global_validation_data(at: Block) -> GlobalValidationData; -``` - -## Local Validation Data - -Yields the [`LocalValidationData`](../types/candidate.md#localvalidationdata) for the given [`ParaId`](../types/candidate.md#paraid) along with an assumption that should be used if the para currently occupies a core: whether the candidate occupying that core should be assumed to have been made available and included or timed out and discarded, along with a third option to assert that the core was not occupied. This choice affects everything from the parent head-data, the validation code, and the state of message-queues. Typically, users will take the assumption that either the core was free or that the occupying candidate was included, as timeouts are expected only in adversarial circumstances and even so, only in a small minority of blocks directly following validator set rotations. - -The documentation of [`LocalValidationData`](../types/candidate.md#localvalidationdata) has more information on this dichotomy. - -```rust -/// An assumption being made about the state of an occupied core. -enum OccupiedCoreAssumption { - /// The candidate occupying the core was made available and included to free the core. - Included, - /// The candidate occupying the core timed out and freed the core without advancing the para. - TimedOut, - /// The core was not occupied to begin with. - Free, -} - -/// Returns the local validation data for the given para and occupied core assumption. -/// -/// Returns `None` if either the para is not registered or the assumption is `Freed` -/// and the para already occupies a core. -fn local_validation_data(at: Block, ParaId, OccupiedCoreAssumption) -> Option; -``` - -## Session Index - -Get the session index that is expected at the child of a block. - -In the [`Initializer`](../runtime/initializer.md) module, session changes are buffered by one block. The session index of the child of any relay block is always predictable by that block's state. - -This session index can be used to derive a [`SigningContext`](../types/candidate.md#signing-context). - -```rust -/// Returns the session index expected at a child of the block. -fn session_index_for_child(at: Block) -> SessionIndex; -``` - -## Validation Code - -Fetch the validation code used by a para, making the given `OccupiedCoreAssumption`. - -```rust -fn validation_code(at: Block, ParaId, OccupiedCoreAssumption) -> Option; -``` - -## Candidate Pending Availability - -Get the receipt of a candidate pending availability. This returns `Some` for any paras assigned to occupied cores in `availability_cores` and `None` otherwise. - -```rust -fn candidate_pending_availability(at: Block, ParaId) -> Option; -``` - -## Candidate Events - -Yields a vector of events concerning candidates that occurred within the given block. - -```rust -enum CandidateEvent { - /// This candidate receipt was backed in the most recent block. - CandidateBacked(CandidateReceipt, HeadData), - /// This candidate receipt was included and became a parablock at the most recent block. - CandidateIncluded(CandidateReceipt, HeadData), - /// This candidate receipt was not made available in time and timed out. - CandidateTimedOut(CandidateReceipt, HeadData), -} - -fn candidate_events(at: Block) -> Vec; -``` diff --git a/roadmap/implementers-guide/src/runtime-api/availability-cores.md b/roadmap/implementers-guide/src/runtime-api/availability-cores.md new file mode 100644 index 0000000000..561e817cca --- /dev/null +++ b/roadmap/implementers-guide/src/runtime-api/availability-cores.md @@ -0,0 +1,56 @@ +# Availability Cores + +Yields information on all availability cores. Cores are either free or occupied. Free cores can have paras assigned to them. Occupied cores don't, but they can become available part-way through a block due to bitfields and then have something scheduled on them. To allow optimistic validation of candidates, the occupied cores are accompanied by information on what is upcoming. This information can be leveraged when validators perceive that there is a high likelihood of a core becoming available based on bitfields seen, and then optimistically validate something that would become scheduled based on that, although there is no guarantee on what the block producer will actually include in the block. + +See also the [Scheduler Module](../runtime/scheduler.md) for a high-level description of what an availability core is and why it exists. + +```rust +fn availability_cores(at: Block) -> Vec; +``` + +This is all the information that a validator needs about scheduling for the current block. It includes all information on [Scheduler](../runtime/scheduler.md) core-assignments and [Inclusion](../runtime/inclusion.md) state of blocks occupying availability cores. It includes data necessary to determine not only which paras are assigned now, but which cores are likely to become freed after processing bitfields, and exactly which bitfields would be necessary to make them so. + +```rust +struct OccupiedCore { + /// The ID of the para occupying the core. + para_id: ParaId, + /// If this core is freed by availability, this is the assignment that is next up on this + /// core, if any. None if there is nothing queued for this core. + next_up_on_available: Option, + /// The relay-chain block number this began occupying the core at. + occupied_since: BlockNumber, + /// The relay-chain block this will time-out at, if any. + time_out_at: BlockNumber, + /// If this core is freed by being timed-out, this is the assignment that is next up on this + /// core. None if there is nothing queued for this core or there is no possibility of timing + /// out. + next_up_on_time_out: Option, + /// A bitfield with 1 bit for each validator in the set. `1` bits mean that the corresponding + /// validators has attested to availability on-chain. A 2/3+ majority of `1` bits means that + /// this will be available. + availability: Bitfield, + /// The group assigned to distribute availability pieces of this candidate. + group_responsible: GroupIndex, +} + +struct ScheduledCore { + /// The ID of a para scheduled. + para_id: ParaId, + /// The collator required to author the block, if any. + collator: Option, +} + +enum CoreState { + /// The core is currently occupied. + Occupied(OccupiedCore), + /// The core is currently free, with a para scheduled and given the opportunity + /// to occupy. + /// + /// If a particular Collator is required to author this block, that is also present in this + /// variant. + Scheduled(ScheduledCore), + /// The core is currently free and there is nothing scheduled. This can be the case for parathread + /// cores when there are no parathread blocks queued. Parachain cores will never be left idle. + Free, +} +``` diff --git a/roadmap/implementers-guide/src/runtime-api/candidate-events.md b/roadmap/implementers-guide/src/runtime-api/candidate-events.md new file mode 100644 index 0000000000..3ebdcd0491 --- /dev/null +++ b/roadmap/implementers-guide/src/runtime-api/candidate-events.md @@ -0,0 +1,16 @@ +# Candidate Events + +Yields a vector of events concerning candidates that occurred within the given block. + +```rust +enum CandidateEvent { + /// This candidate receipt was backed in the most recent block. + CandidateBacked(CandidateReceipt, HeadData), + /// This candidate receipt was included and became a parablock at the most recent block. + CandidateIncluded(CandidateReceipt, HeadData), + /// This candidate receipt was not made available in time and timed out. + CandidateTimedOut(CandidateReceipt, HeadData), +} + +fn candidate_events(at: Block) -> Vec; +``` diff --git a/roadmap/implementers-guide/src/runtime-api/candidate-pending-availability.md b/roadmap/implementers-guide/src/runtime-api/candidate-pending-availability.md new file mode 100644 index 0000000000..9c8969f6a9 --- /dev/null +++ b/roadmap/implementers-guide/src/runtime-api/candidate-pending-availability.md @@ -0,0 +1,7 @@ +# Candidate Pending Availability + +Get the receipt of a candidate pending availability. This returns `Some` for any paras assigned to occupied cores in `availability_cores` and `None` otherwise. + +```rust +fn candidate_pending_availability(at: Block, ParaId) -> Option; +``` diff --git a/roadmap/implementers-guide/src/runtime-api/global-validation-data.md b/roadmap/implementers-guide/src/runtime-api/global-validation-data.md new file mode 100644 index 0000000000..249f9b9a06 --- /dev/null +++ b/roadmap/implementers-guide/src/runtime-api/global-validation-data.md @@ -0,0 +1,7 @@ +# Global Validation Data + +Yields the [`GlobalValidationData`](../types/candidate.md#globalvalidationschedule) at the state of a given block. This applies to all para candidates with the relay-parent equal to that block. + +```rust +fn global_validation_data(at: Block) -> GlobalValidationData; +``` diff --git a/roadmap/implementers-guide/src/runtime-api/local-validation-data.md b/roadmap/implementers-guide/src/runtime-api/local-validation-data.md new file mode 100644 index 0000000000..10f5d78ede --- /dev/null +++ b/roadmap/implementers-guide/src/runtime-api/local-validation-data.md @@ -0,0 +1,23 @@ +# Local Validation Data + +Yields the [`LocalValidationData`](../types/candidate.md#localvalidationdata) for the given [`ParaId`](../types/candidate.md#paraid) along with an assumption that should be used if the para currently occupies a core: whether the candidate occupying that core should be assumed to have been made available and included or timed out and discarded, along with a third option to assert that the core was not occupied. This choice affects everything from the parent head-data, the validation code, and the state of message-queues. Typically, users will take the assumption that either the core was free or that the occupying candidate was included, as timeouts are expected only in adversarial circumstances and even so, only in a small minority of blocks directly following validator set rotations. + +The documentation of [`LocalValidationData`](../types/candidate.md#localvalidationdata) has more information on this dichotomy. + +```rust +/// An assumption being made about the state of an occupied core. +enum OccupiedCoreAssumption { + /// The candidate occupying the core was made available and included to free the core. + Included, + /// The candidate occupying the core timed out and freed the core without advancing the para. + TimedOut, + /// The core was not occupied to begin with. + Free, +} + +/// Returns the local validation data for the given para and occupied core assumption. +/// +/// Returns `None` if either the para is not registered or the assumption is `Freed` +/// and the para already occupies a core. +fn local_validation_data(at: Block, ParaId, OccupiedCoreAssumption) -> Option; +``` diff --git a/roadmap/implementers-guide/src/runtime-api/session-index.md b/roadmap/implementers-guide/src/runtime-api/session-index.md new file mode 100644 index 0000000000..1baf6a167d --- /dev/null +++ b/roadmap/implementers-guide/src/runtime-api/session-index.md @@ -0,0 +1,12 @@ +# Session Index + +Get the session index that is expected at the child of a block. + +In the [`Initializer`](../runtime/initializer.md) module, session changes are buffered by one block. The session index of the child of any relay block is always predictable by that block's state. + +This session index can be used to derive a [`SigningContext`](../types/candidate.md#signing-context). + +```rust +/// Returns the session index expected at a child of the block. +fn session_index_for_child(at: Block) -> SessionIndex; +``` diff --git a/roadmap/implementers-guide/src/runtime-api/validation-code.md b/roadmap/implementers-guide/src/runtime-api/validation-code.md new file mode 100644 index 0000000000..908e3bfbd1 --- /dev/null +++ b/roadmap/implementers-guide/src/runtime-api/validation-code.md @@ -0,0 +1,7 @@ +# Validation Code + +Fetch the validation code used by a para, making the given `OccupiedCoreAssumption`. + +```rust +fn validation_code(at: Block, ParaId, OccupiedCoreAssumption) -> Option; +``` diff --git a/roadmap/implementers-guide/src/runtime-api/validator-groups.md b/roadmap/implementers-guide/src/runtime-api/validator-groups.md new file mode 100644 index 0000000000..42b39f976d --- /dev/null +++ b/roadmap/implementers-guide/src/runtime-api/validator-groups.md @@ -0,0 +1,35 @@ +# Validator Groups + +Yields the validator groups used during the current session. The validators in the groups are referred to by their index into the validator-set. + +```rust +/// A helper data-type for tracking validator-group rotations. +struct GroupRotationInfo { + session_start_block: BlockNumber, + group_rotation_frequency: BlockNumber, + now: BlockNumber, +} + +impl GroupRotationInfo { + /// Returns the index of the group needed to validate the core at the given index, + /// assuming the given amount of cores/groups. + fn group_for_core(&self, core_index, cores) -> GroupIndex; + + /// Returns the block number of the next rotation after the current block. If the current block + /// is 10 and the rotation frequency is 5, this should return 15. + /// + /// If the group rotation frequency is 0, returns 0. + fn next_rotation_at(&self) -> BlockNumber; + + /// Returns the block number of the last rotation before or including the current block. If the + /// current block is 10 and the rotation frequency is 5, this should return 10. + /// + /// If the group rotation frequency is 0, returns 0. + fn last_rotation_at(&self) -> BlockNumber; +} + +/// Returns the validator groups and rotation info localized based on the block whose state +/// this is invoked on. Note that `now` in the `GroupRotationInfo` should be the successor of +/// the number of the block. +fn validator_groups(at: Block) -> (Vec>, GroupRotationInfo); +``` diff --git a/roadmap/implementers-guide/src/runtime-api/validators.md b/roadmap/implementers-guide/src/runtime-api/validators.md new file mode 100644 index 0000000000..b7f1d96475 --- /dev/null +++ b/roadmap/implementers-guide/src/runtime-api/validators.md @@ -0,0 +1,7 @@ +# Validators + +Yields the validator-set at the state of a given block. This validator set is always the one responsible for backing parachains in the child of the provided block. + +```rust +fn validators(at: Block) -> Vec; +``` diff --git a/roadmap/implementers-guide/src/runtime/scheduler.md b/roadmap/implementers-guide/src/runtime/scheduler.md index 96641484e4..fa78237089 100644 --- a/roadmap/implementers-guide/src/runtime/scheduler.md +++ b/roadmap/implementers-guide/src/runtime/scheduler.md @@ -14,82 +14,88 @@ It aims to achieve these tasks with these goals in mind: - Validator assignments should not be gameable. Malicious cartels should not be able to manipulate the scheduler to assign themselves as desired. - High or close to optimal throughput of parachains and parathreads. Work among validator groups should be balanced. +## Availability Cores + The Scheduler manages resource allocation using the concept of "Availability Cores". There will be one availability core for each parachain, and a fixed number of cores used for multiplexing parathreads. Validators will be partitioned into groups, with the same number of groups as availability cores. Validator groups will be assigned to different availability cores over time. An availability core can exist in either one of two states at the beginning or end of a block: free or occupied. A free availability core can have a parachain or parathread assigned to it for the potential to have a backed candidate included. After backing, the core enters the occupied state as the backed candidate is pending availability. There is an important distinction: a core is not considered occupied until it is in charge of a block pending availability, although the implementation may treat scheduled cores the same as occupied ones for brevity. A core exits the occupied state when the candidate is no longer pending availability - either on timeout or on availability. A core starting in the occupied state can move to the free state and back to occupied all within a single block, as availability bitfields are processed before backed candidates. At the end of the block, there is a possible timeout on availability which can move the core back to the free state if occupied. +Cores are treated as an ordered list and are typically referred to by their index in that list. + ```dot process digraph { - label = "Availability Core State Machine\n\n\n"; - labelloc = "t"; + label = "Availability Core State Machine\n\n\n"; + labelloc = "t"; - { rank=same vg1 vg2 } + { rank=same vg1 vg2 } - vg1 [label = "Free" shape=rectangle] - vg2 [label = "Occupied" shape=rectangle] + vg1 [label = "Free" shape=rectangle] + vg2 [label = "Occupied" shape=rectangle] - vg1 -> vg2 [label = "Assignment & Backing" ] - vg2 -> vg1 [label = "Availability or Timeout" ] + vg1 -> vg2 [label = "Assignment & Backing" ] + vg2 -> vg1 [label = "Availability or Timeout" ] } ``` ```dot process digraph { - label = "Availability Core Transitions within Block\n\n\n"; - labelloc = "t"; - splines="line"; - - subgraph cluster_left { - label = ""; - labelloc = "t"; - - fr1 [label = "Free" shape=rectangle] - fr2 [label = "Free" shape=rectangle] - occ [label = "Occupied" shape=rectangle] - - fr1 -> fr2 [label = "No Backing"] - fr1 -> occ [label = "Backing"] - - { rank=same fr2 occ } - } - - subgraph cluster_right { - label = ""; - labelloc = "t"; - - occ2 [label = "Occupied" shape=rectangle] - fr3 [label = "Free" shape=rectangle] - fr4 [label = "Free" shape=rectangle] - occ3 [label = "Occupied" shape=rectangle] - occ4 [label = "Occupied" shape=rectangle] - - occ2 -> fr3 [label = "Availability"] - occ2 -> occ3 [label = "No availability"] - fr3 -> fr4 [label = "No backing"] - fr3 -> occ4 [label = "Backing"] - occ3 -> occ4 [label = "(no change)"] - occ3 -> fr3 [label = "Availability Timeout"] - - { rank=same; fr3[group=g1]; occ3[group=g2] } - { rank=same; fr4[group=g1]; occ4[group=g2] } - } + label = "Availability Core Transitions within Block\n\n\n"; + labelloc = "t"; + splines="line"; + + subgraph cluster_left { + label = ""; + labelloc = "t"; + + fr1 [label = "Free" shape=rectangle] + fr2 [label = "Free" shape=rectangle] + occ [label = "Occupied" shape=rectangle] + + fr1 -> fr2 [label = "No Backing"] + fr1 -> occ [label = "Backing"] + + { rank=same fr2 occ } + } + + subgraph cluster_right { + label = ""; + labelloc = "t"; + + occ2 [label = "Occupied" shape=rectangle] + fr3 [label = "Free" shape=rectangle] + fr4 [label = "Free" shape=rectangle] + occ3 [label = "Occupied" shape=rectangle] + occ4 [label = "Occupied" shape=rectangle] + + occ2 -> fr3 [label = "Availability"] + occ2 -> occ3 [label = "No availability"] + fr3 -> fr4 [label = "No backing"] + fr3 -> occ4 [label = "Backing"] + occ3 -> occ4 [label = "(no change)"] + occ3 -> fr3 [label = "Availability Timeout"] + + { rank=same; fr3[group=g1]; occ3[group=g2] } + { rank=same; fr4[group=g1]; occ4[group=g2] } + } } ``` +## Validator Groups + Validator group assignments do not need to change very quickly. The security benefits of fast rotation is redundant with the challenge mechanism in the [Validity module](validity.md). Because of this, we only divide validators into groups at the beginning of the session and do not shuffle membership during the session. However, we do take steps to ensure that no particular validator group has dominance over a single parachain or parathread-multiplexer for an entire session to provide better guarantees of liveness. Validator groups rotate across availability cores in a round-robin fashion, with rotation occurring at fixed intervals. The i'th group will be assigned to the `(i+k)%n`'th core at any point in time, where `k` is the number of rotations that have occurred in the session, and `n` is the number of cores. This makes upcoming rotations within the same session predictable. When a rotation occurs, validator groups are still responsible for distributing availability chunks for any previous cores that are still occupied and pending availability. In practice, rotation and availability-timeout frequencies should be set so this will only be the core they have just been rotated from. It is possible that a validator group is rotated onto a core which is currently occupied. In this case, the validator group will have nothing to do until the previously-assigned group finishes their availability work and frees the core or the availability process times out. Depending on if the core is for a parachain or parathread, a different timeout `t` from the [`HostConfiguration`](../types/runtime.md#host-configuration) will apply. Availability timeouts should only be triggered in the first `t-1` blocks after the beginning of a rotation. +## Claims + Parathreads operate on a system of claims. Collators participate in auctions to stake a claim on authoring the next block of a parathread, although the auction mechanism is beyond the scope of the scheduler. The scheduler guarantees that they'll be given at least a certain number of attempts to author a candidate that is backed. Attempts that fail during the availability phase are not counted, since ensuring availability at that stage is the responsibility of the backing validators, not of the collator. When a claim is accepted, it is placed into a queue of claims, and each claim is assigned to a particular parathread-multiplexing core in advance. Given that the current assignments of validator groups to cores are known, and the upcoming assignments are predictable, it is possible for parathread collators to know who they should be talking to now and how they should begin establishing connections with as a fallback. With this information, the Node-side can be aware of which parathreads have a good chance of being includable within the relay-chain block and can focus any additional resources on backing candidates from those parathreads. Furthermore, Node-side code is aware of which validator group will be responsible for that thread. If the necessary conditions are reached for core reassignment, those candidates can be backed within the same block as the core being freed. Parathread claims, when scheduled onto a free core, may not result in a block pending availability. This may be due to collator error, networking timeout, or censorship by the validator group. In this case, the claims should be retried a certain number of times to give the collator a fair shot. -Cores are treated as an ordered list of cores and are typically referred to by their index in that list. - ## Storage Utility structs: diff --git a/roadmap/implementers-guide/src/types/availability.md b/roadmap/implementers-guide/src/types/availability.md index 3afa8d8df5..241314067a 100644 --- a/roadmap/implementers-guide/src/types/availability.md +++ b/roadmap/implementers-guide/src/types/availability.md @@ -14,6 +14,16 @@ type SignedAvailabilityBitfield = Signed; struct Bitfields(Vec<(SignedAvailabilityBitfield)>), // bitfields sorted by validator index, ascending ``` +### Semantics + +A `SignedAvailabilityBitfield` represents the view from a particular validator's perspective. Each bit in the bitfield corresponds to a single [availability core](../runtime-api/availability-cores.md). A `1` bit indicates that the validator believes the following statements to be true for a core: + +- the availability core is occupied +- there exists a [`CommittedCandidateReceipt`](candidate.html#committed-candidate-receipt) corresponding to that core. In other words, that para has a block in progress. +- the validator's [Availability Store](../node/utility/availability-store.md) contains a chunk of that parablock's PoV. + +In other words, it is the transpose of [`OccupiedCore::availability`](../runtime-api/availability-cores.md). + ## Proof-of-Validity Often referred to as PoV, this is a type-safe wrapper around bytes (`Vec`) when referring to data that acts as a stateless-client proof of validity of a candidate, when used as input to the validation function of the para. -- GitLab From 976a319e704d5afed69b71fb76fb69fe7fdffa6f Mon Sep 17 00:00:00 2001 From: Peter Goodspeed-Niklaus Date: Fri, 7 Aug 2020 16:51:36 +0200 Subject: [PATCH 158/192] break out subsystem-util and subsystem-test-helpers into individual crates (#1553) * break out subsystem-util and subsystem-test-helpers into individual crates * cause all packages to check successfully --- Cargo.lock | 58 ++++++++++++++++- Cargo.toml | 2 + node/core/av-store/Cargo.toml | 2 +- node/core/av-store/src/lib.rs | 2 +- node/core/backing/Cargo.toml | 3 +- node/core/backing/src/lib.rs | 22 +++---- node/core/bitfield-signing/Cargo.toml | 1 + node/core/bitfield-signing/src/lib.rs | 4 +- node/core/candidate-validation/Cargo.toml | 2 +- node/core/candidate-validation/src/lib.rs | 2 +- node/core/chain-api/Cargo.toml | 2 +- node/core/chain-api/src/lib.rs | 2 +- node/core/provisioner/Cargo.toml | 1 + node/core/provisioner/src/lib.rs | 11 ++-- node/core/runtime-api/Cargo.toml | 2 +- node/core/runtime-api/src/lib.rs | 2 +- node/network/bitfield-distribution/Cargo.toml | 2 +- node/network/bitfield-distribution/src/lib.rs | 2 +- node/network/bridge/Cargo.toml | 2 +- node/network/bridge/src/lib.rs | 8 +-- node/network/pov-distribution/Cargo.toml | 2 +- node/network/pov-distribution/src/lib.rs | 24 +++---- .../network/statement-distribution/Cargo.toml | 2 +- .../network/statement-distribution/src/lib.rs | 4 +- node/primitives/Cargo.toml | 1 - node/subsystem-test-helpers/Cargo.toml | 23 +++++++ .../src/lib.rs} | 4 +- node/subsystem-util/Cargo.toml | 32 ++++++++++ .../src/util.rs => subsystem-util/src/lib.rs} | 64 ++++++++++--------- node/subsystem/Cargo.toml | 6 +- node/subsystem/src/lib.rs | 3 - node/subsystem/src/messages.rs | 12 ++-- 32 files changed, 212 insertions(+), 97 deletions(-) create mode 100644 node/subsystem-test-helpers/Cargo.toml rename node/{subsystem/src/test_helpers.rs => subsystem-test-helpers/src/lib.rs} (97%) create mode 100644 node/subsystem-util/Cargo.toml rename node/{subsystem/src/util.rs => subsystem-util/src/lib.rs} (94%) diff --git a/Cargo.lock b/Cargo.lock index 10b016a8dc..6a4606dc70 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4342,6 +4342,7 @@ dependencies = [ "polkadot-network-bridge", "polkadot-node-primitives", "polkadot-node-subsystem", + "polkadot-node-subsystem-test-helpers", "polkadot-primitives", "sc-network", "smol 0.2.0", @@ -4494,6 +4495,7 @@ dependencies = [ "parking_lot 0.10.2", "polkadot-node-primitives", "polkadot-node-subsystem", + "polkadot-node-subsystem-test-helpers", "polkadot-primitives", "sc-network", "sp-core", @@ -4536,6 +4538,7 @@ dependencies = [ "parity-scale-codec", "polkadot-erasure-coding", "polkadot-node-subsystem", + "polkadot-node-subsystem-test-helpers", "polkadot-overseer", "polkadot-primitives", "sp-core", @@ -4553,6 +4556,8 @@ dependencies = [ "polkadot-erasure-coding", "polkadot-node-primitives", "polkadot-node-subsystem", + "polkadot-node-subsystem-test-helpers", + "polkadot-node-subsystem-util", "polkadot-primitives", "polkadot-statement-table", "sc-client-api", @@ -4572,6 +4577,7 @@ dependencies = [ "futures 0.3.5", "log 0.4.8", "polkadot-node-subsystem", + "polkadot-node-subsystem-util", "polkadot-primitives", "sc-keystore", "wasm-timer", @@ -4588,6 +4594,7 @@ dependencies = [ "parity-scale-codec", "polkadot-node-primitives", "polkadot-node-subsystem", + "polkadot-node-subsystem-test-helpers", "polkadot-parachain", "polkadot-primitives", "sp-blockchain", @@ -4602,6 +4609,7 @@ dependencies = [ "futures 0.3.5", "maplit", "polkadot-node-subsystem", + "polkadot-node-subsystem-test-helpers", "polkadot-primitives", "sp-blockchain", "sp-core", @@ -4643,6 +4651,7 @@ dependencies = [ "lazy_static", "log 0.4.8", "polkadot-node-subsystem", + "polkadot-node-subsystem-util", "polkadot-primitives", "sp-core", "tokio 0.2.21", @@ -4655,6 +4664,7 @@ dependencies = [ "futures 0.3.5", "polkadot-node-primitives", "polkadot-node-subsystem", + "polkadot-node-subsystem-test-helpers", "polkadot-primitives", "sp-api", "sp-blockchain", @@ -4665,7 +4675,6 @@ dependencies = [ name = "polkadot-node-primitives" version = "0.1.0" dependencies = [ - "async-trait", "parity-scale-codec", "polkadot-primitives", "polkadot-statement-table", @@ -4687,6 +4696,51 @@ dependencies = [ "parking_lot 0.10.2", "pin-project", "polkadot-node-primitives", + "polkadot-node-subsystem-test-helpers", + "polkadot-primitives", + "polkadot-statement-table", + "sc-network", + "smallvec 1.4.1", + "sp-core", +] + +[[package]] +name = "polkadot-node-subsystem-test-helpers" +version = "0.1.0" +dependencies = [ + "async-trait", + "derive_more 0.99.9", + "futures 0.3.5", + "futures-timer 3.0.2", + "log 0.4.8", + "parity-scale-codec", + "parking_lot 0.10.2", + "pin-project", + "polkadot-node-primitives", + "polkadot-node-subsystem", + "polkadot-primitives", + "polkadot-statement-table", + "sc-network", + "smallvec 1.4.1", + "sp-core", +] + +[[package]] +name = "polkadot-node-subsystem-util" +version = "0.1.0" +dependencies = [ + "assert_matches", + "async-trait", + "derive_more 0.99.9", + "futures 0.3.5", + "futures-timer 3.0.2", + "log 0.4.8", + "parity-scale-codec", + "parking_lot 0.10.2", + "pin-project", + "polkadot-node-primitives", + "polkadot-node-subsystem", + "polkadot-node-subsystem-test-helpers", "polkadot-primitives", "polkadot-statement-table", "sc-keystore", @@ -4746,6 +4800,7 @@ dependencies = [ "parking_lot 0.10.2", "polkadot-node-primitives", "polkadot-node-subsystem", + "polkadot-node-subsystem-test-helpers", "polkadot-primitives", "sc-network", "sp-core", @@ -5102,6 +5157,7 @@ dependencies = [ "parking_lot 0.10.2", "polkadot-node-primitives", "polkadot-node-subsystem", + "polkadot-node-subsystem-test-helpers", "polkadot-primitives", "sp-core", "sp-keyring", diff --git a/Cargo.toml b/Cargo.toml index a56de658b3..60d2f5671d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -61,6 +61,8 @@ members = [ "node/primitives", "node/service", "node/subsystem", + "node/subsystem-test-helpers", + "node/subsystem-util", "node/test-service", "parachain/test-parachains", diff --git a/node/core/av-store/Cargo.toml b/node/core/av-store/Cargo.toml index e89ef7a6ec..68137b6ae7 100644 --- a/node/core/av-store/Cargo.toml +++ b/node/core/av-store/Cargo.toml @@ -19,6 +19,6 @@ derive_more = "0.99.9" [dev-dependencies] sp-core = { git = "https://github.com/paritytech/substrate", branch = "master" } futures = { version = "0.3.5", features = ["thread-pool"] } -polkadot-subsystem = { package = "polkadot-node-subsystem", path = "../../subsystem", features = [ "test-helpers" ] } +polkadot-node-subsystem-test-helpers = { path = "../../subsystem-test-helpers" } kvdb-memorydb = "0.7.0" assert_matches = "1.3.0" diff --git a/node/core/av-store/src/lib.rs b/node/core/av-store/src/lib.rs index 14f027dc86..9c33052afc 100644 --- a/node/core/av-store/src/lib.rs +++ b/node/core/av-store/src/lib.rs @@ -316,7 +316,7 @@ mod tests { AvailableData, BlockData, HeadData, GlobalValidationData, LocalValidationData, PoV, OmittedValidationData, }; - use polkadot_subsystem::test_helpers; + use polkadot_node_subsystem_test_helpers as test_helpers; struct TestHarness { virtual_overseer: test_helpers::TestSubsystemContextHandle, diff --git a/node/core/backing/Cargo.toml b/node/core/backing/Cargo.toml index 22f8dcc734..9401290f2b 100644 --- a/node/core/backing/Cargo.toml +++ b/node/core/backing/Cargo.toml @@ -13,6 +13,7 @@ keystore = { package = "sc-keystore", git = "https://github.com/paritytech/subst polkadot-primitives = { path = "../../../primitives" } polkadot-node-primitives = { path = "../../primitives" } polkadot-subsystem = { package = "polkadot-node-subsystem", path = "../../subsystem" } +polkadot-node-subsystem-util = { path = "../../subsystem-util" } erasure-coding = { package = "polkadot-erasure-coding", path = "../../../erasure-coding" } statement-table = { package = "polkadot-statement-table", path = "../../../statement-table" } derive_more = "0.99.9" @@ -24,4 +25,4 @@ sp-core = { git = "https://github.com/paritytech/substrate", branch = "master" } sp-keyring = { git = "https://github.com/paritytech/substrate", branch = "master" } futures = { version = "0.3.5", features = ["thread-pool"] } assert_matches = "1.3.0" -polkadot-subsystem = { package = "polkadot-node-subsystem", path = "../../subsystem", features = [ "test-helpers" ] } +polkadot-node-subsystem-test-helpers = { path = "../../subsystem-test-helpers" } diff --git a/node/core/backing/src/lib.rs b/node/core/backing/src/lib.rs index f7608f0d0f..a77d98cd23 100644 --- a/node/core/backing/src/lib.rs +++ b/node/core/backing/src/lib.rs @@ -45,14 +45,14 @@ use polkadot_subsystem::{ ProvisionerMessage, RuntimeApiMessage, StatementDistributionMessage, ValidationFailed, RuntimeApiRequest, }, - util::{ - self, - request_session_index_for_child, - request_validator_groups, - request_validators, - request_from_runtime, - Validator, - }, +}; +use polkadot_node_subsystem_util::{ + self as util, + request_session_index_for_child, + request_validator_groups, + request_validators, + request_from_runtime, + Validator, delegated_subsystem, }; use statement_table::{ @@ -896,13 +896,13 @@ mod tests { } struct TestHarness { - virtual_overseer: polkadot_subsystem::test_helpers::TestSubsystemContextHandle, + virtual_overseer: polkadot_node_subsystem_test_helpers::TestSubsystemContextHandle, } fn test_harness>(keystore: KeyStorePtr, test: impl FnOnce(TestHarness) -> T) { let pool = sp_core::testing::TaskExecutor::new(); - let (context, virtual_overseer) = polkadot_subsystem::test_helpers::make_subsystem_context(pool.clone()); + let (context, virtual_overseer) = polkadot_node_subsystem_test_helpers::make_subsystem_context(pool.clone()); let subsystem = CandidateBackingSubsystem::run(context, keystore, pool.clone()); @@ -960,7 +960,7 @@ mod tests { // Tests that the subsystem performs actions that are requied on startup. async fn test_startup( - virtual_overseer: &mut polkadot_subsystem::test_helpers::TestSubsystemContextHandle, + virtual_overseer: &mut polkadot_node_subsystem_test_helpers::TestSubsystemContextHandle, test_state: &TestState, ) { // Start work on some new parent. diff --git a/node/core/bitfield-signing/Cargo.toml b/node/core/bitfield-signing/Cargo.toml index b8a6cedcc5..11bfef713c 100644 --- a/node/core/bitfield-signing/Cargo.toml +++ b/node/core/bitfield-signing/Cargo.toml @@ -11,5 +11,6 @@ futures = "0.3.5" log = "0.4.8" polkadot-primitives = { path = "../../../primitives" } polkadot-node-subsystem = { path = "../../subsystem" } +polkadot-node-subsystem-util = { path = "../../subsystem-util" } keystore = { package = "sc-keystore", git = "https://github.com/paritytech/substrate", branch = "master" } wasm-timer = "0.2.4" diff --git a/node/core/bitfield-signing/src/lib.rs b/node/core/bitfield-signing/src/lib.rs index 4e409a2576..feca8f0c8f 100644 --- a/node/core/bitfield-signing/src/lib.rs +++ b/node/core/bitfield-signing/src/lib.rs @@ -29,7 +29,9 @@ use polkadot_node_subsystem::{ BitfieldSigningMessage, CandidateBackingMessage, RuntimeApiMessage, }, errors::RuntimeApiError, - util::{self, JobManager, JobTrait, ToJobTrait, Validator}, +}; +use polkadot_node_subsystem_util::{ + self as util, JobManager, JobTrait, ToJobTrait, Validator }; use polkadot_primitives::v1::{AvailabilityBitfield, CoreState, Hash, ValidatorIndex}; use std::{convert::TryFrom, pin::Pin, time::Duration}; diff --git a/node/core/candidate-validation/Cargo.toml b/node/core/candidate-validation/Cargo.toml index 3c36b16758..8f1b7a0fa0 100644 --- a/node/core/candidate-validation/Cargo.toml +++ b/node/core/candidate-validation/Cargo.toml @@ -21,4 +21,4 @@ log = "0.4.8" sp-keyring = { git = "https://github.com/paritytech/substrate", branch = "master" } futures = { version = "0.3.5", features = ["thread-pool"] } assert_matches = "1.3.0" -polkadot-subsystem = { package = "polkadot-node-subsystem", path = "../../subsystem", features = ["test-helpers"] } +polkadot-node-subsystem-test-helpers = { path = "../../subsystem-test-helpers" } diff --git a/node/core/candidate-validation/src/lib.rs b/node/core/candidate-validation/src/lib.rs index 8dcc0a574b..f12f6b1b9d 100644 --- a/node/core/candidate-validation/src/lib.rs +++ b/node/core/candidate-validation/src/lib.rs @@ -470,7 +470,7 @@ fn validate_candidate_exhaustive( #[cfg(test)] mod tests { use super::*; - use polkadot_subsystem::test_helpers; + use polkadot_node_subsystem_test_helpers as test_helpers; use polkadot_primitives::v1::{HeadData, BlockData}; use sp_core::testing::TaskExecutor; use futures::executor; diff --git a/node/core/chain-api/Cargo.toml b/node/core/chain-api/Cargo.toml index 61ca313e33..d626a0d932 100644 --- a/node/core/chain-api/Cargo.toml +++ b/node/core/chain-api/Cargo.toml @@ -13,5 +13,5 @@ polkadot-subsystem = { package = "polkadot-node-subsystem", path = "../../subsys [dev-dependencies] futures = { version = "0.3.5", features = ["thread-pool"] } maplit = "1.0.2" -polkadot-subsystem = { package = "polkadot-node-subsystem", path = "../../subsystem", features = ["test-helpers"] } +polkadot-node-subsystem-test-helpers = { path = "../../subsystem-test-helpers" } sp-core = { git = "https://github.com/paritytech/substrate", branch = "master" } diff --git a/node/core/chain-api/src/lib.rs b/node/core/chain-api/src/lib.rs index a9e93ca9dd..20213e3c08 100644 --- a/node/core/chain-api/src/lib.rs +++ b/node/core/chain-api/src/lib.rs @@ -121,7 +121,7 @@ mod tests { use futures::{future::BoxFuture, channel::oneshot}; use polkadot_primitives::v1::{Hash, BlockNumber, BlockId, Header}; - use polkadot_subsystem::test_helpers::{make_subsystem_context, TestSubsystemContextHandle}; + use polkadot_node_subsystem_test_helpers::{make_subsystem_context, TestSubsystemContextHandle}; use sp_blockchain::Info as BlockInfo; use sp_core::testing::TaskExecutor; diff --git a/node/core/provisioner/Cargo.toml b/node/core/provisioner/Cargo.toml index 6c6477c904..c391f8e45a 100644 --- a/node/core/provisioner/Cargo.toml +++ b/node/core/provisioner/Cargo.toml @@ -11,6 +11,7 @@ futures = "0.3.5" log = "0.4.8" polkadot-primitives = { path = "../../../primitives" } polkadot-node-subsystem = { path = "../../subsystem" } +polkadot-node-subsystem-util = { path = "../../subsystem-util" } [dev-dependencies] lazy_static = "1.4" diff --git a/node/core/provisioner/src/lib.rs b/node/core/provisioner/src/lib.rs index 712c1a834f..9a92858a9e 100644 --- a/node/core/provisioner/src/lib.rs +++ b/node/core/provisioner/src/lib.rs @@ -25,16 +25,17 @@ use futures::{ prelude::*, }; use polkadot_node_subsystem::{ - delegated_subsystem, errors::{ChainApiError, RuntimeApiError}, messages::{ AllMessages, ChainApiMessage, ProvisionableData, ProvisionerInherentData, ProvisionerMessage, RuntimeApiMessage, }, - util::{ - self, request_availability_cores, request_global_validation_data, - request_local_validation_data, JobTrait, ToJobTrait, - }, +}; +use polkadot_node_subsystem_util::{ + self as util, + delegated_subsystem, + request_availability_cores, request_global_validation_data, + request_local_validation_data, JobTrait, ToJobTrait, }; use polkadot_primitives::v1::{ validation_data_hash, BackedCandidate, BlockNumber, CoreState, Hash, OccupiedCoreAssumption, diff --git a/node/core/runtime-api/Cargo.toml b/node/core/runtime-api/Cargo.toml index 7dfde63947..229366627a 100644 --- a/node/core/runtime-api/Cargo.toml +++ b/node/core/runtime-api/Cargo.toml @@ -16,4 +16,4 @@ polkadot-subsystem = { package = "polkadot-node-subsystem", path = "../../subsys [dev-dependencies] sp-core = { git = "https://github.com/paritytech/substrate", branch = "master" } futures = { version = "0.3.5", features = ["thread-pool"] } -polkadot-subsystem = { package = "polkadot-node-subsystem", path = "../../subsystem", features = ["test-helpers"] } +polkadot-node-subsystem-test-helpers = { path = "../../subsystem-test-helpers" } diff --git a/node/core/runtime-api/src/lib.rs b/node/core/runtime-api/src/lib.rs index 34d73f91ec..9b93bb914b 100644 --- a/node/core/runtime-api/src/lib.rs +++ b/node/core/runtime-api/src/lib.rs @@ -123,7 +123,7 @@ mod tests { Id as ParaId, OccupiedCoreAssumption, LocalValidationData, SessionIndex, ValidationCode, CommittedCandidateReceipt, CandidateEvent, }; - use polkadot_subsystem::test_helpers; + use polkadot_node_subsystem_test_helpers as test_helpers; use sp_core::testing::TaskExecutor; use std::collections::HashMap; diff --git a/node/network/bitfield-distribution/Cargo.toml b/node/network/bitfield-distribution/Cargo.toml index 2addbbfd3f..bf7d23a900 100644 --- a/node/network/bitfield-distribution/Cargo.toml +++ b/node/network/bitfield-distribution/Cargo.toml @@ -18,7 +18,7 @@ polkadot-network = { path = "../../../network" } sc-network = { git = "https://github.com/paritytech/substrate", branch = "master" } [dev-dependencies] -polkadot-subsystem = { package = "polkadot-node-subsystem", path = "../../subsystem", features = [ "test-helpers" ] } +polkadot-node-subsystem-test-helpers = { path = "../../subsystem-test-helpers" } bitvec = { version = "0.17.4", default-features = false, features = ["alloc"] } sp-core = { git = "https://github.com/paritytech/substrate", branch = "master" } parking_lot = "0.10.0" diff --git a/node/network/bitfield-distribution/src/lib.rs b/node/network/bitfield-distribution/src/lib.rs index 66f9ca9509..d67b5e353f 100644 --- a/node/network/bitfield-distribution/src/lib.rs +++ b/node/network/bitfield-distribution/src/lib.rs @@ -607,7 +607,7 @@ mod test { use futures::executor; use maplit::hashmap; use polkadot_primitives::v1::{Signed, ValidatorPair, AvailabilityBitfield}; - use polkadot_subsystem::test_helpers::make_subsystem_context; + use polkadot_node_subsystem_test_helpers::make_subsystem_context; use smol_timeout::TimeoutExt; use sp_core::crypto::Pair; use std::time::Duration; diff --git a/node/network/bridge/Cargo.toml b/node/network/bridge/Cargo.toml index 3e405d3d75..ef8b605bb1 100644 --- a/node/network/bridge/Cargo.toml +++ b/node/network/bridge/Cargo.toml @@ -19,5 +19,5 @@ polkadot-subsystem = { package = "polkadot-node-subsystem", path = "../../subsys [dev-dependencies] assert_matches = "1.3.0" parking_lot = "0.10.0" -polkadot-subsystem = { package = "polkadot-node-subsystem", path = "../../subsystem", features = [ "test-helpers" ] } +polkadot-node-subsystem-test-helpers = { path = "../../subsystem-test-helpers" } sp-core = { git = "https://github.com/paritytech/substrate", branch = "master" } diff --git a/node/network/bridge/src/lib.rs b/node/network/bridge/src/lib.rs index 56117732f9..85063b2b0c 100644 --- a/node/network/bridge/src/lib.rs +++ b/node/network/bridge/src/lib.rs @@ -521,7 +521,7 @@ mod tests { use assert_matches::assert_matches; use polkadot_subsystem::messages::{StatementDistributionMessage, BitfieldDistributionMessage}; - use polkadot_subsystem::test_helpers::{SingleItemSink, SingleItemStream}; + use polkadot_node_subsystem_test_helpers::{SingleItemSink, SingleItemStream}; // The subsystem's view of the network - only supports a single call to `event_stream`. struct TestNetwork { @@ -540,7 +540,7 @@ mod tests { TestNetwork, TestNetworkHandle, ) { - let (net_tx, net_rx) = polkadot_subsystem::test_helpers::single_item_sink(); + let (net_tx, net_rx) = polkadot_node_subsystem_test_helpers::single_item_sink(); let (action_tx, action_rx) = mpsc::unbounded(); ( @@ -621,13 +621,13 @@ mod tests { struct TestHarness { network_handle: TestNetworkHandle, - virtual_overseer: polkadot_subsystem::test_helpers::TestSubsystemContextHandle, + virtual_overseer: polkadot_node_subsystem_test_helpers::TestSubsystemContextHandle, } fn test_harness>(test: impl FnOnce(TestHarness) -> T) { let pool = sp_core::testing::TaskExecutor::new(); let (network, network_handle) = new_test_network(); - let (context, virtual_overseer) = polkadot_subsystem::test_helpers::make_subsystem_context(pool); + let (context, virtual_overseer) = polkadot_node_subsystem_test_helpers::make_subsystem_context(pool); let network_bridge = run_network( network, diff --git a/node/network/pov-distribution/Cargo.toml b/node/network/pov-distribution/Cargo.toml index c6bfd4b14c..74a566f35d 100644 --- a/node/network/pov-distribution/Cargo.toml +++ b/node/network/pov-distribution/Cargo.toml @@ -20,4 +20,4 @@ polkadot-subsystem = { package = "polkadot-node-subsystem", path = "../../subsys parking_lot = "0.10.0" assert_matches = "1.3.0" sp-core = { git = "https://github.com/paritytech/substrate", branch = "master" } -polkadot-subsystem = { package = "polkadot-node-subsystem", path = "../../subsystem", features = [ "test-helpers" ] } +polkadot-node-subsystem-test-helpers = { path = "../../subsystem-test-helpers" } diff --git a/node/network/pov-distribution/src/lib.rs b/node/network/pov-distribution/src/lib.rs index 4409d7f1ea..9589e2fad9 100644 --- a/node/network/pov-distribution/src/lib.rs +++ b/node/network/pov-distribution/src/lib.rs @@ -639,7 +639,7 @@ mod tests { }; let pool = sp_core::testing::TaskExecutor::new(); - let (mut ctx, mut handle) = polkadot_subsystem::test_helpers::make_subsystem_context(pool); + let (mut ctx, mut handle) = polkadot_node_subsystem_test_helpers::make_subsystem_context(pool); let mut descriptor = CandidateDescriptor::default(); descriptor.pov_hash = pov_hash; @@ -719,7 +719,7 @@ mod tests { }; let pool = sp_core::testing::TaskExecutor::new(); - let (mut ctx, mut handle) = polkadot_subsystem::test_helpers::make_subsystem_context(pool); + let (mut ctx, mut handle) = polkadot_node_subsystem_test_helpers::make_subsystem_context(pool); let mut descriptor = CandidateDescriptor::default(); descriptor.pov_hash = pov_hash; @@ -797,7 +797,7 @@ mod tests { }; let pool = sp_core::testing::TaskExecutor::new(); - let (mut ctx, mut handle) = polkadot_subsystem::test_helpers::make_subsystem_context(pool); + let (mut ctx, mut handle) = polkadot_node_subsystem_test_helpers::make_subsystem_context(pool); executor::block_on(async move { handle_network_update( @@ -869,7 +869,7 @@ mod tests { }; let pool = sp_core::testing::TaskExecutor::new(); - let (mut ctx, mut handle) = polkadot_subsystem::test_helpers::make_subsystem_context(pool); + let (mut ctx, mut handle) = polkadot_node_subsystem_test_helpers::make_subsystem_context(pool); executor::block_on(async move { // Peer A answers our request before peer B. @@ -957,7 +957,7 @@ mod tests { }; let pool = sp_core::testing::TaskExecutor::new(); - let (mut ctx, mut handle) = polkadot_subsystem::test_helpers::make_subsystem_context(pool); + let (mut ctx, mut handle) = polkadot_node_subsystem_test_helpers::make_subsystem_context(pool); executor::block_on(async move { // Peer A answers our request: right relay parent, awaited hash, wrong PoV. @@ -1020,7 +1020,7 @@ mod tests { }; let pool = sp_core::testing::TaskExecutor::new(); - let (mut ctx, mut handle) = polkadot_subsystem::test_helpers::make_subsystem_context(pool); + let (mut ctx, mut handle) = polkadot_node_subsystem_test_helpers::make_subsystem_context(pool); executor::block_on(async move { // Peer A answers our request: right relay parent, awaited hash, wrong PoV. @@ -1081,7 +1081,7 @@ mod tests { }; let pool = sp_core::testing::TaskExecutor::new(); - let (mut ctx, mut handle) = polkadot_subsystem::test_helpers::make_subsystem_context(pool); + let (mut ctx, mut handle) = polkadot_node_subsystem_test_helpers::make_subsystem_context(pool); executor::block_on(async move { // Peer A answers our request: right relay parent, awaited hash, wrong PoV. @@ -1139,7 +1139,7 @@ mod tests { }; let pool = sp_core::testing::TaskExecutor::new(); - let (mut ctx, mut handle) = polkadot_subsystem::test_helpers::make_subsystem_context(pool); + let (mut ctx, mut handle) = polkadot_node_subsystem_test_helpers::make_subsystem_context(pool); executor::block_on(async move { let max_plausibly_awaited = n_validators * 2; @@ -1224,7 +1224,7 @@ mod tests { }; let pool = sp_core::testing::TaskExecutor::new(); - let (mut ctx, mut handle) = polkadot_subsystem::test_helpers::make_subsystem_context(pool); + let (mut ctx, mut handle) = polkadot_node_subsystem_test_helpers::make_subsystem_context(pool); executor::block_on(async move { let pov_hash = make_pov(vec![1, 2, 3]).hash(); @@ -1286,7 +1286,7 @@ mod tests { }; let pool = sp_core::testing::TaskExecutor::new(); - let (mut ctx, mut handle) = polkadot_subsystem::test_helpers::make_subsystem_context(pool); + let (mut ctx, mut handle) = polkadot_node_subsystem_test_helpers::make_subsystem_context(pool); executor::block_on(async move { let pov_hash = make_pov(vec![1, 2, 3]).hash(); @@ -1363,7 +1363,7 @@ mod tests { }; let pool = sp_core::testing::TaskExecutor::new(); - let (mut ctx, mut handle) = polkadot_subsystem::test_helpers::make_subsystem_context(pool); + let (mut ctx, mut handle) = polkadot_node_subsystem_test_helpers::make_subsystem_context(pool); executor::block_on(async move { handle_network_update( @@ -1446,7 +1446,7 @@ mod tests { }; let pool = sp_core::testing::TaskExecutor::new(); - let (mut ctx, mut handle) = polkadot_subsystem::test_helpers::make_subsystem_context(pool); + let (mut ctx, mut handle) = polkadot_node_subsystem_test_helpers::make_subsystem_context(pool); executor::block_on(async move { handle_network_update( diff --git a/node/network/statement-distribution/Cargo.toml b/node/network/statement-distribution/Cargo.toml index 04e6def40e..6dfaee78bb 100644 --- a/node/network/statement-distribution/Cargo.toml +++ b/node/network/statement-distribution/Cargo.toml @@ -21,7 +21,7 @@ indexmap = "1.4.0" [dev-dependencies] parking_lot = "0.10.0" -polkadot-subsystem = { package = "polkadot-node-subsystem", path = "../../subsystem", features = ["test-helpers"] } +polkadot-node-subsystem-test-helpers = { path = "../../subsystem-test-helpers" } assert_matches = "1.3.0" sp-keyring = { git = "https://github.com/paritytech/substrate", branch = "master" } sp-core = { git = "https://github.com/paritytech/substrate", branch = "master" } diff --git a/node/network/statement-distribution/src/lib.rs b/node/network/statement-distribution/src/lib.rs index 5cc67cfea0..f58e6da4d4 100644 --- a/node/network/statement-distribution/src/lib.rs +++ b/node/network/statement-distribution/src/lib.rs @@ -1235,7 +1235,7 @@ mod tests { }; let pool = sp_core::testing::TaskExecutor::new(); - let (mut ctx, mut handle) = polkadot_subsystem::test_helpers::make_subsystem_context(pool); + let (mut ctx, mut handle) = polkadot_node_subsystem_test_helpers::make_subsystem_context(pool); let peer = PeerId::random(); executor::block_on(async move { @@ -1327,7 +1327,7 @@ mod tests { ].into_iter().collect(); let pool = sp_core::testing::TaskExecutor::new(); - let (mut ctx, mut handle) = polkadot_subsystem::test_helpers::make_subsystem_context(pool); + let (mut ctx, mut handle) = polkadot_node_subsystem_test_helpers::make_subsystem_context(pool); executor::block_on(async move { let statement = { diff --git a/node/primitives/Cargo.toml b/node/primitives/Cargo.toml index df288438a8..b38e7e542e 100644 --- a/node/primitives/Cargo.toml +++ b/node/primitives/Cargo.toml @@ -10,5 +10,4 @@ polkadot-primitives = { path = "../../primitives" } polkadot-statement-table = { path = "../../statement-table" } parity-scale-codec = { version = "1.3.4", default-features = false, features = ["derive"] } runtime_primitives = { package = "sp-runtime", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -async-trait = "0.1" sp-core = { git = "https://github.com/paritytech/substrate", branch = "master" } diff --git a/node/subsystem-test-helpers/Cargo.toml b/node/subsystem-test-helpers/Cargo.toml new file mode 100644 index 0000000000..105e6b5816 --- /dev/null +++ b/node/subsystem-test-helpers/Cargo.toml @@ -0,0 +1,23 @@ +[package] +name = "polkadot-node-subsystem-test-helpers" +version = "0.1.0" +authors = ["Parity Technologies "] +edition = "2018" +description = "Subsystem traits and message definitions" + +[dependencies] +async-trait = "0.1" +derive_more = "0.99.9" +futures = "0.3.5" +futures-timer = "3.0.2" +log = "0.4.8" +parity-scale-codec = "1.3.4" +parking_lot = "0.10.0" +pin-project = "0.4.22" +polkadot-node-primitives = { path = "../primitives" } +polkadot-node-subsystem = { path = "../subsystem" } +polkadot-primitives = { path = "../../primitives" } +polkadot-statement-table = { path = "../../statement-table" } +sc-network = { git = "https://github.com/paritytech/substrate", branch = "master" } +smallvec = "1.4.1" +sp-core = { git = "https://github.com/paritytech/substrate", branch = "master" } diff --git a/node/subsystem/src/test_helpers.rs b/node/subsystem-test-helpers/src/lib.rs similarity index 97% rename from node/subsystem/src/test_helpers.rs rename to node/subsystem-test-helpers/src/lib.rs index 256a928b43..a4070c028c 100644 --- a/node/subsystem/src/test_helpers.rs +++ b/node/subsystem-test-helpers/src/lib.rs @@ -16,8 +16,8 @@ //! Utilities for testing subsystems. -use crate::{SubsystemContext, FromOverseer, SubsystemResult, SubsystemError}; -use crate::messages::AllMessages; +use polkadot_node_subsystem::{SubsystemContext, FromOverseer, SubsystemResult, SubsystemError}; +use polkadot_node_subsystem::messages::AllMessages; use futures::prelude::*; use futures::channel::mpsc; diff --git a/node/subsystem-util/Cargo.toml b/node/subsystem-util/Cargo.toml new file mode 100644 index 0000000000..6ed2999213 --- /dev/null +++ b/node/subsystem-util/Cargo.toml @@ -0,0 +1,32 @@ +[package] +name = "polkadot-node-subsystem-util" +version = "0.1.0" +authors = ["Parity Technologies "] +edition = "2018" +description = "Subsystem traits and message definitions" + +[dependencies] +async-trait = "0.1" +derive_more = "0.99.9" +futures = "0.3.5" +futures-timer = "3.0.2" +keystore = { package = "sc-keystore", git = "https://github.com/paritytech/substrate", branch = "master" } +log = "0.4.8" +parity-scale-codec = "1.3.4" +parking_lot = { version = "0.10.0", optional = true } +pin-project = "0.4.22" +polkadot-node-primitives = { path = "../primitives" } +polkadot-node-subsystem = { path = "../subsystem" } +polkadot-primitives = { path = "../../primitives" } +polkadot-statement-table = { path = "../../statement-table" } +sc-network = { git = "https://github.com/paritytech/substrate", branch = "master" } +smallvec = "1.4.1" +sp-core = { git = "https://github.com/paritytech/substrate", branch = "master" } +streamunordered = "0.5.1" + +[dev-dependencies] +assert_matches = "1.3.0" +async-trait = "0.1" +futures = { version = "0.3.5", features = ["thread-pool"] } +parking_lot = "0.10.0" +polkadot-node-subsystem-test-helpers = { path = "../subsystem-test-helpers" } diff --git a/node/subsystem/src/util.rs b/node/subsystem-util/src/lib.rs similarity index 94% rename from node/subsystem/src/util.rs rename to node/subsystem-util/src/lib.rs index 7472ebeb8a..cc8cbd239d 100644 --- a/node/subsystem/src/util.rs +++ b/node/subsystem-util/src/lib.rs @@ -20,7 +20,7 @@ //! or determining what their validator ID is. These common interests are factored into //! this module. -use crate::{ +use polkadot_node_subsystem::{ errors::{ChainApiError, RuntimeApiError}, messages::{AllMessages, RuntimeApiMessage, RuntimeApiRequest, RuntimeApiSender}, FromOverseer, SpawnedSubsystem, Subsystem, SubsystemContext, SubsystemError, SubsystemResult, @@ -43,7 +43,7 @@ use polkadot_primitives::v1::{ SessionIndex, Signed, SigningContext, ValidationCode, ValidatorId, ValidatorIndex, ValidatorPair, }; -use sp_core::Pair; +use sp_core::{Pair, traits::SpawnNamed}; use std::{ collections::HashMap, convert::{TryFrom, TryInto}, @@ -53,10 +53,15 @@ use std::{ }; use streamunordered::{StreamUnordered, StreamYield}; -/// This reexport is required so that external crates can use the `delegated_subsystem` macro properly. -/// -/// Otherwise, downstream crates might have to modify their `Cargo.toml` to ensure `sp-core` appeared there. -pub use sp_core::traits::SpawnNamed; +/// These reexports are required so that external crates can use the `delegated_subsystem` macro properly. +pub mod reexports { + pub use sp_core::traits::SpawnNamed; + pub use polkadot_node_subsystem::{ + SpawnedSubsystem, + Subsystem, + SubsystemContext, + }; +} /// Duration a job will wait after sending a stop signal before hard-aborting. pub const JOB_GRACEFUL_STOP_DURATION: Duration = Duration::from_secs(1); @@ -655,9 +660,9 @@ where run_args: &Job::RunArgs, err_tx: &mut Option, JobsError)>>, ) -> bool { - use crate::ActiveLeavesUpdate; - use crate::FromOverseer::{Communication, Signal}; - use crate::OverseerSignal::{ActiveLeaves, BlockFinalized, Conclude}; + use polkadot_node_subsystem::ActiveLeavesUpdate; + use polkadot_node_subsystem::FromOverseer::{Communication, Signal}; + use polkadot_node_subsystem::OverseerSignal::{ActiveLeaves, BlockFinalized, Conclude}; match incoming { Ok(Signal(ActiveLeaves(ActiveLeavesUpdate { @@ -783,7 +788,7 @@ where /// It is possible to create a type which implements `Subsystem` by simply doing: /// /// ```ignore -/// pub type ExampleSubsystem = util::JobManager; +/// pub type ExampleSubsystem = JobManager; /// ``` /// /// However, doing this requires that job itself and all types which comprise it (i.e. `ToJob`, `FromJob`, `Error`, `RunArgs`) @@ -791,7 +796,7 @@ where /// can reduce the total number of public types exposed, i.e. /// /// ```ignore -/// type Manager = util::JobManager; +/// type Manager = JobManager; /// pub struct ExampleSubsystem { /// manager: Manager, /// } @@ -820,7 +825,7 @@ macro_rules! delegated_subsystem { ($job:ident($run_args:ty) <- $to_job:ty as $subsystem:ident; $subsystem_name:expr) => { #[doc = "Manager type for the "] #[doc = $subsystem_name] - type Manager = $crate::util::JobManager; + type Manager = $crate::JobManager; #[doc = "An implementation of the "] #[doc = $subsystem_name] @@ -830,15 +835,15 @@ macro_rules! delegated_subsystem { impl $subsystem where - Spawner: Clone + $crate::util::SpawnNamed + Send + Unpin, - Context: $crate::SubsystemContext, - ::Message: Into<$to_job>, + Spawner: Clone + $crate::reexports::SpawnNamed + Send + Unpin, + Context: $crate::reexports::SubsystemContext, + ::Message: Into<$to_job>, { #[doc = "Creates a new "] #[doc = $subsystem_name] pub fn new(spawner: Spawner, run_args: $run_args) -> Self { $subsystem { - manager: $crate::util::JobManager::new(spawner, run_args) + manager: $crate::JobManager::new(spawner, run_args) } } @@ -848,13 +853,13 @@ macro_rules! delegated_subsystem { } } - impl $crate::Subsystem for $subsystem + impl $crate::reexports::Subsystem for $subsystem where - Spawner: $crate::util::SpawnNamed + Send + Clone + Unpin + 'static, - Context: $crate::SubsystemContext, - ::Message: Into<$to_job>, + Spawner: $crate::reexports::SpawnNamed + Send + Clone + Unpin + 'static, + Context: $crate::reexports::SubsystemContext, + ::Message: Into<$to_job>, { - fn start(self, ctx: Context) -> $crate::SpawnedSubsystem { + fn start(self, ctx: Context) -> $crate::reexports::SpawnedSubsystem { self.manager.start(ctx) } } @@ -863,10 +868,9 @@ macro_rules! delegated_subsystem { #[cfg(test)] mod tests { - use crate::{ + use super::{Error as UtilError, JobManager, JobTrait, JobsError, ToJobTrait}; + use polkadot_node_subsystem::{ messages::{AllMessages, CandidateSelectionMessage}, - test_helpers::{self, make_subsystem_context}, - util::{self, JobManager, JobTrait, JobsError, ToJobTrait}, ActiveLeavesUpdate, FromOverseer, OverseerSignal, SpawnedSubsystem, Subsystem, }; use assert_matches::assert_matches; @@ -878,6 +882,7 @@ mod tests { }; use futures_timer::Delay; use polkadot_primitives::v1::Hash; + use polkadot_node_subsystem_test_helpers::{self as test_helpers, make_subsystem_context}; use std::{collections::HashMap, convert::TryFrom, pin::Pin, time::Duration}; // basic usage: in a nutshell, when you want to define a subsystem, just focus on what its jobs do; @@ -941,13 +946,13 @@ mod tests { // we include it in the RunArgs #[derive(Clone)] enum FromJob { - Test(String), + Test, } impl From for AllMessages { fn from(from_job: FromJob) -> AllMessages { match from_job { - FromJob::Test(s) => AllMessages::Test(s), + FromJob::Test => AllMessages::CandidateSelection(CandidateSelectionMessage::default()), } } } @@ -1054,10 +1059,9 @@ mod tests { fn starting_and_stopping_job_works() { let relay_parent: Hash = [0; 32].into(); let mut run_args = HashMap::new(); - let test_message = format!("greetings from {}", relay_parent); run_args.insert( relay_parent.clone(), - vec![FromJob::Test(test_message.clone())], + vec![FromJob::Test], ); test_harness(run_args, |mut overseer_handle, err_rx| async move { @@ -1068,7 +1072,7 @@ mod tests { .await; assert_matches!( overseer_handle.recv().await, - AllMessages::Test(msg) if msg == test_message + AllMessages::CandidateSelection(_) ); overseer_handle .send(FromOverseer::Signal(OverseerSignal::ActiveLeaves( @@ -1098,7 +1102,7 @@ mod tests { assert_eq!(errs[0].0, Some(relay_parent)); assert_matches!( errs[0].1, - JobsError::Utility(util::Error::JobNotFound(match_relay_parent)) if relay_parent == match_relay_parent + JobsError::Utility(UtilError::JobNotFound(match_relay_parent)) if relay_parent == match_relay_parent ); }); } diff --git a/node/subsystem/Cargo.toml b/node/subsystem/Cargo.toml index f924808182..3e676cb4f1 100644 --- a/node/subsystem/Cargo.toml +++ b/node/subsystem/Cargo.toml @@ -10,7 +10,6 @@ async-trait = "0.1" derive_more = "0.99.9" futures = "0.3.5" futures-timer = "3.0.2" -keystore = { package = "sc-keystore", git = "https://github.com/paritytech/substrate", branch = "master" } log = "0.4.8" parity-scale-codec = "1.3.4" parking_lot = { version = "0.10.0", optional = true } @@ -21,13 +20,10 @@ polkadot-statement-table = { path = "../../statement-table" } sc-network = { git = "https://github.com/paritytech/substrate", branch = "master" } smallvec = "1.4.1" sp-core = { git = "https://github.com/paritytech/substrate", branch = "master" } -streamunordered = "0.5.1" [dev-dependencies] assert_matches = "1.3.0" async-trait = "0.1" futures = { version = "0.3.5", features = ["thread-pool"] } parking_lot = "0.10.0" - -[features] -test-helpers = [ "parking_lot" ] +polkadot-node-subsystem-test-helpers = { path = "../subsystem-test-helpers" } diff --git a/node/subsystem/src/lib.rs b/node/subsystem/src/lib.rs index 7e112f5439..3f72e2f269 100644 --- a/node/subsystem/src/lib.rs +++ b/node/subsystem/src/lib.rs @@ -36,9 +36,6 @@ use crate::messages::AllMessages; pub mod errors; pub mod messages; -pub mod util; -#[cfg(any(test, feature = "test-helpers"))] -pub mod test_helpers; /// How many slots are stack-reserved for active leaves updates /// diff --git a/node/subsystem/src/messages.rs b/node/subsystem/src/messages.rs index 29014c55a8..acc41a2e7f 100644 --- a/node/subsystem/src/messages.rs +++ b/node/subsystem/src/messages.rs @@ -61,6 +61,12 @@ impl CandidateSelectionMessage { } } +impl Default for CandidateSelectionMessage { + fn default() -> Self { + CandidateSelectionMessage::Invalid(Default::default(), Default::default()) + } +} + /// Messages received by the Candidate Backing subsystem. #[derive(Debug)] pub enum CandidateBackingMessage { @@ -509,10 +515,4 @@ pub enum AllMessages { NetworkBridge(NetworkBridgeMessage), /// Message for the Chain API subsystem ChainApi(ChainApiMessage), - /// Test message - /// - /// This variant is only valid while testing, but makes the process of testing the - /// subsystem job manager much simpler. - #[cfg(test)] - Test(String), } -- GitLab From e8d5146004a6e3ce1fc250397f3327962883631c Mon Sep 17 00:00:00 2001 From: Jun Jiang Date: Fri, 7 Aug 2020 23:17:09 +0800 Subject: [PATCH 159/192] Align for "Starting parachain attestation session" (#1554) --- validation/src/validation_service/mod.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/validation/src/validation_service/mod.rs b/validation/src/validation_service/mod.rs index 538e987c43..d30b52ef5c 100644 --- a/validation/src/validation_service/mod.rs +++ b/validation/src/validation_service/mod.rs @@ -383,13 +383,13 @@ impl ParachainValidationInstances where if let Some(ref duty) = local_duty { info!( - "✍️ Starting parachain attestation session (parent: {}) with active duty {}", + "✍️ Starting parachain attestation session (parent: {}) with active duty {}", parent_hash, Colour::Red.bold().paint(format!("{:?}", duty)), ); } else { debug!( - "✍️ Starting parachain attestation session (parent: {}). No local duty..", + "✍️ Starting parachain attestation session (parent: {}). No local duty..", parent_hash, ); } -- GitLab From 55f69f3679192264c38ffff3b3a0f2d833b52c8f Mon Sep 17 00:00:00 2001 From: Sergei Shulepov Date: Fri, 7 Aug 2020 18:01:05 +0200 Subject: [PATCH 160/192] Implementer's guide: Messaging overview stub (#1405) * Introduce the Messaging Overview doc * Update to the latest thinking --- roadmap/implementers-guide/src/SUMMARY.md | 1 + roadmap/implementers-guide/src/messaging.md | 91 +++++++++++++++++++++ 2 files changed, 92 insertions(+) create mode 100644 roadmap/implementers-guide/src/messaging.md diff --git a/roadmap/implementers-guide/src/SUMMARY.md b/roadmap/implementers-guide/src/SUMMARY.md index fa364ac490..5569f4c361 100644 --- a/roadmap/implementers-guide/src/SUMMARY.md +++ b/roadmap/implementers-guide/src/SUMMARY.md @@ -5,6 +5,7 @@ - [Whence Parachains](whence-parachains.md) - [Parachains Overview](parachains-overview.md) - [Architecture Overview](architecture.md) +- [Messaging Overview](messaging.md) - [Runtime Architecture](runtime/README.md) - [Initializer Module](runtime/initializer.md) - [Configuration Module](runtime/configuration.md) diff --git a/roadmap/implementers-guide/src/messaging.md b/roadmap/implementers-guide/src/messaging.md new file mode 100644 index 0000000000..3795db3771 --- /dev/null +++ b/roadmap/implementers-guide/src/messaging.md @@ -0,0 +1,91 @@ +# Messaging Overview + +Polkadot has a few mechanisms that are responsible for message passing. They can be generally divided +on two categories: Horizontal and Vertical. Horizontal Message Passing (HMP) refers to mechanisms +that are responsible for exchanging messages between parachains. Vertical Message Passing (VMP) is +used for communication between the relay chain and parachains. + +## Vertical Message Passing + +```dot process +digraph { + rc [shape=Mdiamond label="Relay Chain"]; + p1 [shape=box label = "Parachain"]; + + rc -> p1 [label="DMP"]; + p1 -> rc [label="UMP"]; +} +``` + +Downward Message Passing (DMP) is a mechanism for delivering messages to parachains from the relay chain. Downward +messages may originate not from the relay chain, but rather from another parachain via a mechanism +called HRMP (Will be described later). + +Each parachain has its own queue that stores all pending inbound downward messages. A parachain +doesn't have to process all messages at once, however, there are rules as to how the downward message queue +should be processed. Currently, at least one message must be consumed per candidate if the queue is not empty. +The downward message queue doesn't have a cap on its size and it is up to the relay-chain to put mechanisms +that prevent spamming in place. + +Upward Message Passing (UMP) is a mechanism responsible for delivering messages in the opposite direction: +from a parachain up to the relay chain. Upward messages are dispatched to Runtime entrypoints and +typically used for invoking some actions on the relay chain on behalf of the parachain. + +> NOTE: It is conceivable that upward messages will be divided to more fine-grained kinds with a dispatchable upward message +being only one kind of multiple. That would make upward messages inspectable and therefore would allow imposing additional +validity criteria for the candidates that contain these messages. + +Semantically, there is a queue of upward messages queue where messages from each parachain are stored. Each parachain +can have a limited number of messages and the total sum of pending messages is also limited. Each parachain can dispatch +multiple upward messages per candidate. + +## Horizontal Message Passing + +```dot process +digraph { + rc [shape=Mdiamond color="gray" fontcolor="gray" label="Relay Chain"]; + + subgraph { + rank = "same" + p1 [shape=box label = "Parachain 1"]; + p2 [shape=box label = "Parachain 2"]; + } + + rc -> p1 [label="DMP" color="gray" fontcolor="gray"]; + p1 -> rc [label="UMP" color="gray" fontcolor="gray"]; + + rc -> p2 [label="DMP" color="gray" fontcolor="gray"]; + p2 -> rc [label="UMP" color="gray" fontcolor="gray"]; + + p2 -> p1 [dir=both label="XCMP"]; +} +``` + +The most important member of this family is XCMP. + +> ℹ️ XCMP is currently under construction and details are subject for change. + +XCMP is a message passing mechanism between parachains that require minimal involvement of the relay chain. +The relay chain provides means for sending parachains to authenticate messages sent to recipient parachains. + +Semantically communication occurs through so called channels. A channel is unidirectional and it has +two endpoints, for sender and for recipient. A channel can be opened only if the both parties agree +and closed unilaterally. + +Only the channel metadata is stored on the relay-chain in a very compact form: all messages and their +contents sent by the sender parachain are encoded using only one root hash. This root is referred as +MQC head. + +The authenticity of the messages must be proven using that root hash to the receiving party at the +candidate authoring time. The proof stems from the relay parent storage that contains the root hash of the channel. +Since not all messages are required to be processed by the receiver's candidate, only the processed +messages are supplied (i.e. preimages), rest are provided as hashes. + +Further details can be found at the [W3F research website](https://research.web3.foundation/en/latest/polkadot/XCMP.html) +and [this blogpost](https://medium.com/web3foundation/polkadots-messaging-scheme-b1ec560908b7). + +HRMP (Horizontally Relay-routed Message Passing) is a stop gap that predates XCMP. Semantically, it mimics XCMP's interface. +The crucial difference from XCMP though is that all the messages are stored in the relay-chain storage. That makes +things simple but at the same time that makes HRMP more demanding in terms of resources thus making it more expensive. + +Once XCMP is available we expect to retire HRMP. -- GitLab From 84043d49abbc9428e52757b95823ed3f15e7a300 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20H=C3=A4ggblad?= Date: Mon, 10 Aug 2020 12:57:42 +0200 Subject: [PATCH 161/192] companion PR for #5732: pubsub RPC for grandpa justifications (#1346) * Companion PR for #5732 Add subscription RPC for listening on GRANDPA justifications. * grandpa-rpc: some merge fixes * "Update Substrate" Co-authored-by: parity-processbot <> --- Cargo.lock | 279 ++++++++++++++++++++-------------------- node/service/src/lib.rs | 7 +- rpc/Cargo.toml | 1 + rpc/src/lib.rs | 9 ++ service/src/lib.rs | 7 +- 5 files changed, 162 insertions(+), 141 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 6a4606dc70..17cdc18bb9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1353,7 +1353,7 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "fork-tree" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" +source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "parity-scale-codec", ] @@ -1361,7 +1361,7 @@ dependencies = [ [[package]] name = "frame-benchmarking" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" +source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "frame-support", "frame-system", @@ -1378,7 +1378,7 @@ dependencies = [ [[package]] name = "frame-benchmarking-cli" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" +source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "frame-benchmarking", "parity-scale-codec", @@ -1396,7 +1396,7 @@ dependencies = [ [[package]] name = "frame-executive" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" +source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "frame-support", "frame-system", @@ -1411,7 +1411,7 @@ dependencies = [ [[package]] name = "frame-metadata" version = "11.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" +source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "parity-scale-codec", "serde", @@ -1422,7 +1422,7 @@ dependencies = [ [[package]] name = "frame-support" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" +source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "bitmask", "frame-metadata", @@ -1447,7 +1447,7 @@ dependencies = [ [[package]] name = "frame-support-procedural" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" +source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "frame-support-procedural-tools", "proc-macro2 1.0.18", @@ -1458,7 +1458,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" +source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "frame-support-procedural-tools-derive", "proc-macro-crate", @@ -1470,7 +1470,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools-derive" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" +source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "proc-macro2 1.0.18", "quote 1.0.7", @@ -1480,7 +1480,7 @@ dependencies = [ [[package]] name = "frame-system" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" +source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "frame-support", "impl-trait-for-tuples", @@ -1496,7 +1496,7 @@ dependencies = [ [[package]] name = "frame-system-benchmarking" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" +source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "frame-benchmarking", "frame-support", @@ -1510,7 +1510,7 @@ dependencies = [ [[package]] name = "frame-system-rpc-runtime-api" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" +source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "parity-scale-codec", "sp-api", @@ -3483,7 +3483,7 @@ dependencies = [ [[package]] name = "pallet-authority-discovery" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" +source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "frame-support", "frame-system", @@ -3499,7 +3499,7 @@ dependencies = [ [[package]] name = "pallet-authorship" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" +source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "frame-support", "frame-system", @@ -3514,7 +3514,7 @@ dependencies = [ [[package]] name = "pallet-babe" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" +source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "frame-benchmarking", "frame-support", @@ -3539,7 +3539,7 @@ dependencies = [ [[package]] name = "pallet-balances" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" +source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "frame-benchmarking", "frame-support", @@ -3553,7 +3553,7 @@ dependencies = [ [[package]] name = "pallet-collective" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" +source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "frame-benchmarking", "frame-support", @@ -3569,7 +3569,7 @@ dependencies = [ [[package]] name = "pallet-democracy" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" +source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "frame-benchmarking", "frame-support", @@ -3584,7 +3584,7 @@ dependencies = [ [[package]] name = "pallet-elections-phragmen" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" +source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "frame-benchmarking", "frame-support", @@ -3599,7 +3599,7 @@ dependencies = [ [[package]] name = "pallet-finality-tracker" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" +source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "frame-support", "frame-system", @@ -3615,7 +3615,7 @@ dependencies = [ [[package]] name = "pallet-grandpa" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" +source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "frame-benchmarking", "frame-support", @@ -3637,7 +3637,7 @@ dependencies = [ [[package]] name = "pallet-identity" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" +source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "enumflags2", "frame-benchmarking", @@ -3653,7 +3653,7 @@ dependencies = [ [[package]] name = "pallet-im-online" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" +source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "frame-benchmarking", "frame-support", @@ -3673,7 +3673,7 @@ dependencies = [ [[package]] name = "pallet-indices" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" +source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "frame-support", "frame-system", @@ -3689,7 +3689,7 @@ dependencies = [ [[package]] name = "pallet-membership" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" +source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "frame-support", "frame-system", @@ -3703,7 +3703,7 @@ dependencies = [ [[package]] name = "pallet-multisig" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" +source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "frame-support", "frame-system", @@ -3718,7 +3718,7 @@ dependencies = [ [[package]] name = "pallet-nicks" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" +source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "frame-support", "frame-system", @@ -3732,7 +3732,7 @@ dependencies = [ [[package]] name = "pallet-offences" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" +source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "frame-support", "frame-system", @@ -3747,7 +3747,7 @@ dependencies = [ [[package]] name = "pallet-offences-benchmarking" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" +source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "frame-benchmarking", "frame-support", @@ -3768,7 +3768,7 @@ dependencies = [ [[package]] name = "pallet-proxy" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" +source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "frame-support", "frame-system", @@ -3783,7 +3783,7 @@ dependencies = [ [[package]] name = "pallet-randomness-collective-flip" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" +source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "frame-support", "frame-system", @@ -3796,7 +3796,7 @@ dependencies = [ [[package]] name = "pallet-recovery" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" +source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "enumflags2", "frame-support", @@ -3811,7 +3811,7 @@ dependencies = [ [[package]] name = "pallet-scheduler" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" +source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "frame-benchmarking", "frame-support", @@ -3826,7 +3826,7 @@ dependencies = [ [[package]] name = "pallet-session" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" +source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "frame-support", "frame-system", @@ -3846,7 +3846,7 @@ dependencies = [ [[package]] name = "pallet-session-benchmarking" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" +source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "frame-benchmarking", "frame-support", @@ -3862,7 +3862,7 @@ dependencies = [ [[package]] name = "pallet-society" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" +source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "frame-support", "frame-system", @@ -3876,7 +3876,7 @@ dependencies = [ [[package]] name = "pallet-staking" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" +source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "frame-benchmarking", "frame-support", @@ -3898,7 +3898,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-curve" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" +source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -3909,7 +3909,7 @@ dependencies = [ [[package]] name = "pallet-sudo" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" +source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "frame-support", "frame-system", @@ -3923,7 +3923,7 @@ dependencies = [ [[package]] name = "pallet-timestamp" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" +source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "frame-benchmarking", "frame-support", @@ -3941,7 +3941,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" +source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "frame-support", "frame-system", @@ -3958,7 +3958,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" +source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "jsonrpc-core", "jsonrpc-core-client", @@ -3976,7 +3976,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc-runtime-api" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" +source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "frame-support", "parity-scale-codec", @@ -3989,7 +3989,7 @@ dependencies = [ [[package]] name = "pallet-treasury" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" +source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "frame-benchmarking", "frame-support", @@ -4004,7 +4004,7 @@ dependencies = [ [[package]] name = "pallet-utility" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" +source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "frame-benchmarking", "frame-support", @@ -4020,7 +4020,7 @@ dependencies = [ [[package]] name = "pallet-vesting" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" +source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "enumflags2", "frame-benchmarking", @@ -4837,6 +4837,7 @@ name = "polkadot-rpc" version = "0.8.22" dependencies = [ "jsonrpc-core", + "jsonrpc-pubsub", "pallet-transaction-payment-rpc", "parity-scale-codec", "polkadot-primitives", @@ -6211,7 +6212,7 @@ dependencies = [ [[package]] name = "sc-authority-discovery" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" +source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "bytes 0.5.5", "derive_more 0.99.9", @@ -6238,7 +6239,7 @@ dependencies = [ [[package]] name = "sc-basic-authorship" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" +source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6262,7 +6263,7 @@ dependencies = [ [[package]] name = "sc-block-builder" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" +source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "parity-scale-codec", "sc-client-api", @@ -6279,7 +6280,7 @@ dependencies = [ [[package]] name = "sc-chain-spec" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" +source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "impl-trait-for-tuples", "sc-chain-spec-derive", @@ -6295,7 +6296,7 @@ dependencies = [ [[package]] name = "sc-chain-spec-derive" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" +source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -6306,7 +6307,7 @@ dependencies = [ [[package]] name = "sc-cli" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" +source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "ansi_term 0.12.1", "atty", @@ -6347,7 +6348,7 @@ dependencies = [ [[package]] name = "sc-client-api" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" +source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "derive_more 0.99.9", "fnv", @@ -6383,7 +6384,7 @@ dependencies = [ [[package]] name = "sc-client-db" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" +source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "blake2-rfc", "hash-db", @@ -6413,7 +6414,7 @@ dependencies = [ [[package]] name = "sc-consensus" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" +source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "sc-client-api", "sp-blockchain", @@ -6424,7 +6425,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" +source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "derive_more 0.99.9", "fork-tree", @@ -6468,7 +6469,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe-rpc" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" +source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -6492,7 +6493,7 @@ dependencies = [ [[package]] name = "sc-consensus-epochs" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" +source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "fork-tree", "parity-scale-codec", @@ -6505,7 +6506,7 @@ dependencies = [ [[package]] name = "sc-consensus-slots" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" +source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6528,7 +6529,7 @@ dependencies = [ [[package]] name = "sc-consensus-uncles" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" +source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "log 0.4.8", "sc-client-api", @@ -6542,7 +6543,7 @@ dependencies = [ [[package]] name = "sc-executor" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" +source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "derive_more 0.99.9", "lazy_static", @@ -6570,7 +6571,7 @@ dependencies = [ [[package]] name = "sc-executor-common" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" +source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "derive_more 0.99.9", "log 0.4.8", @@ -6587,7 +6588,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmi" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" +source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "log 0.4.8", "parity-scale-codec", @@ -6602,7 +6603,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmtime" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" +source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "cranelift-codegen", "cranelift-wasm", @@ -6623,7 +6624,7 @@ dependencies = [ [[package]] name = "sc-finality-grandpa" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" +source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "derive_more 0.99.9", "finality-grandpa", @@ -6660,7 +6661,7 @@ dependencies = [ [[package]] name = "sc-finality-grandpa-rpc" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" +source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "derive_more 0.99.9", "finality-grandpa", @@ -6668,16 +6669,20 @@ dependencies = [ "jsonrpc-core", "jsonrpc-core-client", "jsonrpc-derive", + "jsonrpc-pubsub", "log 0.4.8", + "parity-scale-codec", "sc-finality-grandpa", + "sc-rpc", "serde", "serde_json", + "sp-runtime", ] [[package]] name = "sc-informant" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" +source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "ansi_term 0.12.1", "futures 0.3.5", @@ -6695,7 +6700,7 @@ dependencies = [ [[package]] name = "sc-keystore" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" +source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "derive_more 0.99.9", "hex", @@ -6711,7 +6716,7 @@ dependencies = [ [[package]] name = "sc-light" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" +source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "hash-db", "lazy_static", @@ -6730,7 +6735,7 @@ dependencies = [ [[package]] name = "sc-network" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" +source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "bitflags", "bs58", @@ -6782,7 +6787,7 @@ dependencies = [ [[package]] name = "sc-network-gossip" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" +source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6797,7 +6802,7 @@ dependencies = [ [[package]] name = "sc-network-test" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" +source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "env_logger", "futures 0.3.5", @@ -6824,7 +6829,7 @@ dependencies = [ [[package]] name = "sc-offchain" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" +source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "bytes 0.5.5", "fnv", @@ -6851,7 +6856,7 @@ dependencies = [ [[package]] name = "sc-peerset" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" +source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "futures 0.3.5", "libp2p", @@ -6864,7 +6869,7 @@ dependencies = [ [[package]] name = "sc-proposer-metrics" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" +source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "log 0.4.8", "substrate-prometheus-endpoint", @@ -6873,7 +6878,7 @@ dependencies = [ [[package]] name = "sc-rpc" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" +source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "futures 0.3.5", "hash-db", @@ -6905,7 +6910,7 @@ dependencies = [ [[package]] name = "sc-rpc-api" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" +source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -6929,7 +6934,7 @@ dependencies = [ [[package]] name = "sc-rpc-server" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" +source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "jsonrpc-core", "jsonrpc-http-server", @@ -6945,7 +6950,7 @@ dependencies = [ [[package]] name = "sc-service" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" +source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "derive_more 0.99.9", "directories", @@ -7005,7 +7010,7 @@ dependencies = [ [[package]] name = "sc-state-db" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" +source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "log 0.4.8", "parity-scale-codec", @@ -7019,7 +7024,7 @@ dependencies = [ [[package]] name = "sc-telemetry" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" +source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -7040,7 +7045,7 @@ dependencies = [ [[package]] name = "sc-tracing" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" +source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "erased-serde", "log 0.4.8", @@ -7057,7 +7062,7 @@ dependencies = [ [[package]] name = "sc-transaction-graph" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" +source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -7078,7 +7083,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" +source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -7533,7 +7538,7 @@ dependencies = [ [[package]] name = "sp-allocator" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" +source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "derive_more 0.99.9", "log 0.4.8", @@ -7545,7 +7550,7 @@ dependencies = [ [[package]] name = "sp-api" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" +source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "hash-db", "parity-scale-codec", @@ -7560,7 +7565,7 @@ dependencies = [ [[package]] name = "sp-api-proc-macro" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" +source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "blake2-rfc", "proc-macro-crate", @@ -7572,7 +7577,7 @@ dependencies = [ [[package]] name = "sp-application-crypto" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" +source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "parity-scale-codec", "serde", @@ -7584,7 +7589,7 @@ dependencies = [ [[package]] name = "sp-arithmetic" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" +source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "integer-sqrt", "num-traits 0.2.12", @@ -7597,7 +7602,7 @@ dependencies = [ [[package]] name = "sp-authority-discovery" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" +source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "parity-scale-codec", "sp-api", @@ -7609,7 +7614,7 @@ dependencies = [ [[package]] name = "sp-authorship" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" +source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "parity-scale-codec", "sp-inherents", @@ -7620,7 +7625,7 @@ dependencies = [ [[package]] name = "sp-block-builder" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" +source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "parity-scale-codec", "sp-api", @@ -7632,7 +7637,7 @@ dependencies = [ [[package]] name = "sp-blockchain" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" +source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "derive_more 0.99.9", "log 0.4.8", @@ -7649,7 +7654,7 @@ dependencies = [ [[package]] name = "sp-chain-spec" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" +source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "serde", "serde_json", @@ -7658,7 +7663,7 @@ dependencies = [ [[package]] name = "sp-consensus" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" +source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -7684,7 +7689,7 @@ dependencies = [ [[package]] name = "sp-consensus-aura" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" +source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "parity-scale-codec", "sp-api", @@ -7698,7 +7703,7 @@ dependencies = [ [[package]] name = "sp-consensus-babe" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" +source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "merlin", "parity-scale-codec", @@ -7717,7 +7722,7 @@ dependencies = [ [[package]] name = "sp-consensus-slots" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" +source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "parity-scale-codec", "sp-runtime", @@ -7726,7 +7731,7 @@ dependencies = [ [[package]] name = "sp-consensus-vrf" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" +source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "parity-scale-codec", "schnorrkel", @@ -7738,7 +7743,7 @@ dependencies = [ [[package]] name = "sp-core" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" +source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "base58", "blake2-rfc", @@ -7782,7 +7787,7 @@ dependencies = [ [[package]] name = "sp-database" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" +source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "kvdb", "parking_lot 0.10.2", @@ -7791,7 +7796,7 @@ dependencies = [ [[package]] name = "sp-debug-derive" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" +source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "proc-macro2 1.0.18", "quote 1.0.7", @@ -7801,7 +7806,7 @@ dependencies = [ [[package]] name = "sp-externalities" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" +source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "environmental", "parity-scale-codec", @@ -7812,7 +7817,7 @@ dependencies = [ [[package]] name = "sp-finality-grandpa" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" +source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "finality-grandpa", "log 0.4.8", @@ -7828,7 +7833,7 @@ dependencies = [ [[package]] name = "sp-finality-tracker" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" +source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "parity-scale-codec", "sp-inherents", @@ -7838,7 +7843,7 @@ dependencies = [ [[package]] name = "sp-inherents" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" +source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "derive_more 0.99.9", "parity-scale-codec", @@ -7850,7 +7855,7 @@ dependencies = [ [[package]] name = "sp-io" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" +source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "futures 0.3.5", "hash-db", @@ -7871,7 +7876,7 @@ dependencies = [ [[package]] name = "sp-keyring" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" +source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "lazy_static", "sp-core", @@ -7882,7 +7887,7 @@ dependencies = [ [[package]] name = "sp-npos-elections" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" +source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "parity-scale-codec", "serde", @@ -7894,7 +7899,7 @@ dependencies = [ [[package]] name = "sp-npos-elections-compact" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" +source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -7905,7 +7910,7 @@ dependencies = [ [[package]] name = "sp-offchain" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" +source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "sp-api", "sp-core", @@ -7915,7 +7920,7 @@ dependencies = [ [[package]] name = "sp-panic-handler" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" +source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "backtrace", "log 0.4.8", @@ -7924,7 +7929,7 @@ dependencies = [ [[package]] name = "sp-rpc" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" +source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "serde", "sp-core", @@ -7933,7 +7938,7 @@ dependencies = [ [[package]] name = "sp-runtime" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" +source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "either", "hash256-std-hasher", @@ -7955,7 +7960,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" +source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "parity-scale-codec", "primitive-types", @@ -7970,7 +7975,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" +source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "Inflector", "proc-macro-crate", @@ -7982,7 +7987,7 @@ dependencies = [ [[package]] name = "sp-serializer" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" +source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "serde", "serde_json", @@ -7991,7 +7996,7 @@ dependencies = [ [[package]] name = "sp-session" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" +source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "parity-scale-codec", "sp-api", @@ -8004,7 +8009,7 @@ dependencies = [ [[package]] name = "sp-staking" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" +source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "parity-scale-codec", "sp-runtime", @@ -8014,7 +8019,7 @@ dependencies = [ [[package]] name = "sp-state-machine" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" +source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "hash-db", "itertools 0.9.0", @@ -8035,12 +8040,12 @@ dependencies = [ [[package]] name = "sp-std" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" +source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" [[package]] name = "sp-storage" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" +source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "impl-serde 0.2.3", "ref-cast", @@ -8052,7 +8057,7 @@ dependencies = [ [[package]] name = "sp-timestamp" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" +source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -8066,7 +8071,7 @@ dependencies = [ [[package]] name = "sp-tracing" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" +source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "log 0.4.8", "rental", @@ -8076,7 +8081,7 @@ dependencies = [ [[package]] name = "sp-transaction-pool" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" +source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -8091,7 +8096,7 @@ dependencies = [ [[package]] name = "sp-trie" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" +source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "hash-db", "memory-db", @@ -8105,7 +8110,7 @@ dependencies = [ [[package]] name = "sp-utils" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" +source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "futures 0.3.5", "futures-core", @@ -8117,7 +8122,7 @@ dependencies = [ [[package]] name = "sp-version" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" +source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "impl-serde 0.2.3", "parity-scale-codec", @@ -8129,7 +8134,7 @@ dependencies = [ [[package]] name = "sp-wasm-interface" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" +source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -8260,7 +8265,7 @@ dependencies = [ [[package]] name = "substrate-browser-utils" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" +source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "chrono", "console_error_panic_hook", @@ -8286,7 +8291,7 @@ dependencies = [ [[package]] name = "substrate-build-script-utils" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" +source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "platforms", ] @@ -8294,7 +8299,7 @@ dependencies = [ [[package]] name = "substrate-frame-rpc-system" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" +source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "frame-system-rpc-runtime-api", "futures 0.3.5", @@ -8317,7 +8322,7 @@ dependencies = [ [[package]] name = "substrate-prometheus-endpoint" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" +source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "async-std", "derive_more 0.99.9", @@ -8331,7 +8336,7 @@ dependencies = [ [[package]] name = "substrate-test-client" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" +source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "futures 0.1.29", "futures 0.3.5", @@ -8357,7 +8362,7 @@ dependencies = [ [[package]] name = "substrate-test-runtime" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" +source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "cfg-if", "frame-executive", @@ -8397,7 +8402,7 @@ dependencies = [ [[package]] name = "substrate-test-runtime-client" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" +source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "futures 0.3.5", "parity-scale-codec", @@ -8418,7 +8423,7 @@ dependencies = [ [[package]] name = "substrate-wasm-builder-runner" version = "1.0.6" -source = "git+https://github.com/paritytech/substrate#52494a465ab68904343c0525e86261ebcb166808" +source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" [[package]] name = "substrate-wasm-builder-runner" diff --git a/node/service/src/lib.rs b/node/service/src/lib.rs index bb60eed9c6..df4bd64b8a 100644 --- a/node/service/src/lib.rs +++ b/node/service/src/lib.rs @@ -157,7 +157,7 @@ fn new_partial(config: &mut Configuration) -> Result< consensus_common::DefaultImportQueue>, sc_transaction_pool::FullPool>, ( - impl Fn(polkadot_rpc::DenyUnsafe) -> polkadot_rpc::RpcExtension, + impl Fn(polkadot_rpc::DenyUnsafe, polkadot_rpc::SubscriptionManager) -> polkadot_rpc::RpcExtension, ( babe::BabeBlockImport< Block, FullClient, FullGrandpaBlockImport @@ -227,6 +227,7 @@ fn new_partial(config: &mut Configuration) -> Result< config.prometheus_registry(), )?; + let justification_stream = grandpa_link.justification_stream(); let shared_authority_set = grandpa_link.shared_authority_set().clone(); let shared_voter_state = grandpa::SharedVoterState::empty(); @@ -242,7 +243,7 @@ fn new_partial(config: &mut Configuration) -> Result< let transaction_pool = transaction_pool.clone(); let select_chain = select_chain.clone(); - move |deny_unsafe| -> polkadot_rpc::RpcExtension { + move |deny_unsafe, subscriptions| -> polkadot_rpc::RpcExtension { let deps = polkadot_rpc::FullDeps { client: client.clone(), pool: transaction_pool.clone(), @@ -256,6 +257,8 @@ fn new_partial(config: &mut Configuration) -> Result< grandpa: polkadot_rpc::GrandpaDeps { shared_voter_state: shared_voter_state.clone(), shared_authority_set: shared_authority_set.clone(), + justification_stream: justification_stream.clone(), + subscriptions, }, }; diff --git a/rpc/Cargo.toml b/rpc/Cargo.toml index 04034f45ed..35ff0f9e91 100644 --- a/rpc/Cargo.toml +++ b/rpc/Cargo.toml @@ -6,6 +6,7 @@ edition = "2018" [dependencies] jsonrpc-core = "14.0.3" +jsonrpc-pubsub = "14.0.3" polkadot-primitives = { path = "../primitives" } sc-client-api = { git = "https://github.com/paritytech/substrate", branch = "master" } sp-blockchain = { git = "https://github.com/paritytech/substrate", branch = "master" } diff --git a/rpc/src/lib.rs b/rpc/src/lib.rs index b09c1b5d42..4867e14f15 100644 --- a/rpc/src/lib.rs +++ b/rpc/src/lib.rs @@ -30,6 +30,7 @@ use sc_client_api::light::{Fetcher, RemoteBlockchain}; use sc_consensus_babe::Epoch; use sp_block_builder::BlockBuilder; pub use sc_rpc::DenyUnsafe; +pub use jsonrpc_pubsub::manager::SubscriptionManager; /// A type representing all RPC extensions. pub type RpcExtension = jsonrpc_core::IoHandler; @@ -62,6 +63,10 @@ pub struct GrandpaDeps { pub shared_voter_state: sc_finality_grandpa::SharedVoterState, /// Authority set info. pub shared_authority_set: sc_finality_grandpa::SharedAuthoritySet, + /// Receives notifications about justification events from Grandpa. + pub justification_stream: sc_finality_grandpa::GrandpaJustificationStream, + /// Subscription manager to keep track of pubsub subscribers. + pub subscriptions: jsonrpc_pubsub::manager::SubscriptionManager, } /// Full client dependencies @@ -114,6 +119,8 @@ pub fn create_full(deps: FullDeps) -> RpcExtension where let GrandpaDeps { shared_voter_state, shared_authority_set, + justification_stream, + subscriptions, } = grandpa; io.extend_with( @@ -138,6 +145,8 @@ pub fn create_full(deps: FullDeps) -> RpcExtension where GrandpaApi::to_delegate(GrandpaRpcHandler::new( shared_authority_set, shared_voter_state, + justification_stream, + subscriptions, )) ); io diff --git a/service/src/lib.rs b/service/src/lib.rs index 24796d0f50..a8b8d39899 100644 --- a/service/src/lib.rs +++ b/service/src/lib.rs @@ -127,7 +127,7 @@ pub fn new_partial(config: &mut Configuration, test: bool) consensus_common::DefaultImportQueue>, sc_transaction_pool::FullPool>, ( - impl Fn(polkadot_rpc::DenyUnsafe) -> polkadot_rpc::RpcExtension, + impl Fn(polkadot_rpc::DenyUnsafe, polkadot_rpc::SubscriptionManager) -> polkadot_rpc::RpcExtension, ( babe::BabeBlockImport< Block, FullClient, FullGrandpaBlockImport @@ -202,6 +202,7 @@ pub fn new_partial(config: &mut Configuration, test: bool) config.prometheus_registry(), )?; + let justification_stream = grandpa_link.justification_stream(); let shared_authority_set = grandpa_link.shared_authority_set().clone(); let shared_voter_state = grandpa::SharedVoterState::empty(); @@ -217,7 +218,7 @@ pub fn new_partial(config: &mut Configuration, test: bool) let transaction_pool = transaction_pool.clone(); let select_chain = select_chain.clone(); - move |deny_unsafe| -> polkadot_rpc::RpcExtension { + move |deny_unsafe, subscriptions| -> polkadot_rpc::RpcExtension { let deps = polkadot_rpc::FullDeps { client: client.clone(), pool: transaction_pool.clone(), @@ -231,6 +232,8 @@ pub fn new_partial(config: &mut Configuration, test: bool) grandpa: polkadot_rpc::GrandpaDeps { shared_voter_state: shared_voter_state.clone(), shared_authority_set: shared_authority_set.clone(), + justification_stream: justification_stream.clone(), + subscriptions, }, }; -- GitLab From 8198a100e61c5d861b26cf8bca47be81cd10c981 Mon Sep 17 00:00:00 2001 From: Bernhard Schuster Date: Mon, 10 Aug 2020 15:02:30 +0200 Subject: [PATCH 162/192] impl availability distribution Closes #1237 --- Cargo.lock | 434 ++++--- Cargo.toml | 1 + .../availability-distribution/Cargo.toml | 34 + .../availability-distribution/src/lib.rs | 1092 +++++++++++++++++ .../availability-distribution/src/tests.rs | 975 +++++++++++++++ node/network/bitfield-distribution/Cargo.toml | 4 +- node/network/bitfield-distribution/src/lib.rs | 20 +- node/subsystem-test-helpers/src/lib.rs | 2 +- node/subsystem/src/lib.rs | 2 +- node/subsystem/src/messages.rs | 12 +- parachain/src/primitives.rs | 8 +- primitives/src/v0.rs | 6 +- primitives/src/v1.rs | 10 +- .../availability/availability-distribution.md | 13 +- 14 files changed, 2413 insertions(+), 200 deletions(-) create mode 100644 node/network/availability-distribution/Cargo.toml create mode 100644 node/network/availability-distribution/src/lib.rs create mode 100644 node/network/availability-distribution/src/tests.rs diff --git a/Cargo.lock b/Cargo.lock index 17cdc18bb9..6ff134014b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -224,11 +224,25 @@ dependencies = [ "futures-core", ] +[[package]] +name = "async-executor" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90f47c78ea98277cb1f5e6f60ba4fc762f5eafe9f6511bc2f7dfd8b75c225650" +dependencies = [ + "async-io", + "futures-lite", + "multitask", + "parking", + "scoped-tls 1.0.0", + "waker-fn", +] + [[package]] name = "async-io" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a0fc2017a5cca12763bb5636092a7786b52789c23c5838a392db2eb99963fd3" +checksum = "ca8126ef9fb99355c6fd27575d691be4887b884137a5b6f48c2d961f13590c51" dependencies = [ "cfg-if", "concurrent-queue", @@ -255,7 +269,7 @@ dependencies = [ "futures-io", "futures-timer 3.0.2", "kv-log-macro", - "log 0.4.8", + "log 0.4.11", "memchr", "num_cpus", "once_cell", @@ -380,7 +394,7 @@ dependencies = [ "env_logger", "lazy_static", "lazycell", - "log 0.4.8", + "log 0.4.11", "peeking_take_while", "proc-macro2 1.0.18", "quote 1.0.7", @@ -510,6 +524,19 @@ dependencies = [ "waker-fn", ] +[[package]] +name = "blocking" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76e94bf99b692f54c9d05f97454d3faf11134523fe5b180564a3fb6ed63bcc0a" +dependencies = [ + "async-channel", + "atomic-waker", + "futures-lite", + "once_cell", + "waker-fn", +] + [[package]] name = "bs58" version = "0.3.1" @@ -676,6 +703,15 @@ dependencies = [ "bitflags", ] +[[package]] +name = "cloudabi" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4344512281c643ae7638bbabc3af17a11307803ec8f0fcad9fae512a8bf36467" +dependencies = [ + "bitflags", +] + [[package]] name = "concurrent-queue" version = "1.1.1" @@ -701,7 +737,7 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e7871d2947441b0fdd8e2bd1ce2a2f75304f896582c0d572162d48290683c48" dependencies = [ - "log 0.4.8", + "log 0.4.11", "web-sys", ] @@ -774,7 +810,7 @@ dependencies = [ "cranelift-codegen-shared", "cranelift-entity", "gimli 0.21.0", - "log 0.4.8", + "log 0.4.11", "regalloc", "serde", "smallvec 1.4.1", @@ -814,7 +850,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2ef419efb4f94ecc02e5d9fbcc910d2bb7f0040e2de570e63a454f883bc891d6" dependencies = [ "cranelift-codegen", - "log 0.4.8", + "log 0.4.11", "smallvec 1.4.1", "target-lexicon", ] @@ -839,7 +875,7 @@ dependencies = [ "cranelift-codegen", "cranelift-entity", "cranelift-frontend", - "log 0.4.8", + "log 0.4.11", "serde", "thiserror", "wasmparser 0.59.0", @@ -1090,6 +1126,12 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4c53dc3a653e0f64081026e4bf048d48fec9fce90c66e8326ca7292df0ff2d82" +[[package]] +name = "easy-parallel" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1dd4afd79212583ff429b913ad6605242ed7eec277e950b1438f300748f948f4" + [[package]] name = "ed25519" version = "1.0.1" @@ -1156,7 +1198,7 @@ checksum = "44533bbbb3bb3c1fa17d9f2e4e38bbbaf8396ba82193c4cb1b6445d711445d36" dependencies = [ "atty", "humantime", - "log 0.4.8", + "log 0.4.11", "regex", "termcolor", ] @@ -1204,7 +1246,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "74cf96bec282dcdb07099f7e31d9fed323bca9435a09aba7b6d99b7617bca96d" dependencies = [ "lazy_static", - "log 0.4.8", + "log 0.4.11", "serde", "serde_json", ] @@ -1281,7 +1323,7 @@ checksum = "7b6b21baebbed15551f2170010ca4101b9ed3fdc05822791c8bd4631840eab81" dependencies = [ "cfg-if", "js-sys", - "log 0.4.8", + "log 0.4.11", "serde", "serde_derive", "wasm-bindgen", @@ -1295,7 +1337,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b3937f028664bd0e13df401ba49a4567ccda587420365823242977f06609ed1" dependencies = [ "env_logger", - "log 0.4.8", + "log 0.4.11", ] [[package]] @@ -1307,7 +1349,7 @@ dependencies = [ "either", "futures 0.3.5", "futures-timer 2.0.2", - "log 0.4.8", + "log 0.4.11", "num-traits 0.2.12", "parity-scale-codec", "parking_lot 0.9.0", @@ -1428,7 +1470,7 @@ dependencies = [ "frame-metadata", "frame-support-procedural", "impl-trait-for-tuples", - "log 0.4.8", + "log 0.4.11", "once_cell", "parity-scale-codec", "paste", @@ -1627,7 +1669,7 @@ dependencies = [ "futures 0.1.29", "futures 0.3.5", "lazy_static", - "log 0.4.8", + "log 0.4.11", "parking_lot 0.9.0", "pin-project", "serde", @@ -1654,15 +1696,17 @@ checksum = "de27142b013a8e869c14957e6d2edeef89e97c289e69d042ee3a49acd8b51789" [[package]] name = "futures-lite" -version = "0.1.6" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af0bbcb0ec905ef6ee23fab499119b5da2362b8697d66e08d1ef01a8c0d438e2" +checksum = "bbe71459749b2e8e66fb95df721b22fa08661ad384a0c5b519e11d3893b4692a" dependencies = [ "fastrand", "futures-core", "futures-io", "memchr", + "parking", "pin-project-lite", + "waker-fn", ] [[package]] @@ -1767,7 +1811,7 @@ checksum = "add72f17bb81521258fcc8a7a3245b1e184e916bfbe34f0ea89558f440df5c68" dependencies = [ "cc", "libc", - "log 0.4.8", + "log 0.4.11", "rustc_version", "winapi 0.3.9", ] @@ -1866,7 +1910,7 @@ dependencies = [ "aho-corasick", "bstr", "fnv", - "log 0.4.8", + "log 0.4.11", "regex", ] @@ -1895,7 +1939,7 @@ dependencies = [ "futures 0.1.29", "http 0.1.21", "indexmap", - "log 0.4.8", + "log 0.4.11", "slab", "string", "tokio-io", @@ -1914,7 +1958,7 @@ dependencies = [ "futures-util", "http 0.2.1", "indexmap", - "log 0.4.8", + "log 0.4.11", "slab", "tokio 0.2.21", "tokio-util", @@ -2093,7 +2137,7 @@ dependencies = [ "httparse", "iovec", "itoa", - "log 0.4.8", + "log 0.4.11", "net2", "rustc_version", "time", @@ -2123,7 +2167,7 @@ dependencies = [ "http-body 0.3.1", "httparse", "itoa", - "log 0.4.8", + "log 0.4.11", "pin-project", "socket2", "time", @@ -2142,7 +2186,7 @@ dependencies = [ "ct-logs", "futures-util", "hyper 0.13.6", - "log 0.4.8", + "log 0.4.11", "rustls", "rustls-native-certs", "tokio 0.2.21", @@ -2220,6 +2264,12 @@ dependencies = [ "serde", ] +[[package]] +name = "instant" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b141fdc7836c525d4d594027d318c84161ca17aaf8113ab1f81ab93ae897485" + [[package]] name = "integer-sqrt" version = "0.1.3" @@ -2330,7 +2380,7 @@ dependencies = [ "futures 0.1.29", "jsonrpc-core", "jsonrpc-pubsub", - "log 0.4.8", + "log 0.4.11", "serde", "serde_json", "url 1.7.2", @@ -2343,7 +2393,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a0747307121ffb9703afd93afbd0fb4f854c38fb873f2c8b90e0e902f27c7b62" dependencies = [ "futures 0.1.29", - "log 0.4.8", + "log 0.4.11", "serde", "serde_derive", "serde_json", @@ -2379,7 +2429,7 @@ dependencies = [ "hyper 0.12.35", "jsonrpc-core", "jsonrpc-server-utils", - "log 0.4.8", + "log 0.4.11", "net2", "parking_lot 0.10.2", "unicase", @@ -2393,7 +2443,7 @@ checksum = "dedccd693325d833963b549e959137f30a7a0ea650cde92feda81dc0c1393cb5" dependencies = [ "jsonrpc-core", "jsonrpc-server-utils", - "log 0.4.8", + "log 0.4.11", "parity-tokio-ipc", "parking_lot 0.10.2", "tokio-service", @@ -2406,7 +2456,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2d44f5602a11d657946aac09357956d2841299ed422035edf140c552cb057986" dependencies = [ "jsonrpc-core", - "log 0.4.8", + "log 0.4.11", "parking_lot 0.10.2", "rand 0.7.3", "serde", @@ -2422,7 +2472,7 @@ dependencies = [ "globset", "jsonrpc-core", "lazy_static", - "log 0.4.8", + "log 0.4.11", "tokio 0.1.22", "tokio-codec", "unicase", @@ -2436,7 +2486,7 @@ checksum = "903d3109fe7c4acb932b567e1e607e0f524ed04741b09fb0e61841bc40a022fc" dependencies = [ "jsonrpc-core", "jsonrpc-server-utils", - "log 0.4.8", + "log 0.4.11", "parking_lot 0.10.2", "slab", "ws", @@ -2539,7 +2589,7 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0de8b303297635ad57c9f5059fd9cee7a47f8e8daa09df0fcd07dd39fb22977f" dependencies = [ - "log 0.4.8", + "log 0.4.11", ] [[package]] @@ -2571,7 +2621,7 @@ checksum = "7c341ef15cfb1f923fa3b5138bfbd2d4813a2c1640b473727a53351c7f0b0fa2" dependencies = [ "fs-swap", "kvdb", - "log 0.4.8", + "log 0.4.11", "num_cpus", "owning_ref", "parity-util-mem", @@ -2591,7 +2641,7 @@ dependencies = [ "js-sys", "kvdb", "kvdb-memorydb", - "log 0.4.8", + "log 0.4.11", "parity-util-mem", "send_wrapper 0.3.0", "wasm-bindgen", @@ -2684,7 +2734,7 @@ dependencies = [ "futures-timer 3.0.2", "lazy_static", "libsecp256k1", - "log 0.4.8", + "log 0.4.11", "multihash", "multistream-select", "parity-multiaddr", @@ -2721,7 +2771,7 @@ checksum = "f751924b6b98e350005e0b87a822beb246792a3fb878c684e088f866158120ac" dependencies = [ "futures 0.3.5", "libp2p-core", - "log 0.4.8", + "log 0.4.11", ] [[package]] @@ -2733,7 +2783,7 @@ dependencies = [ "futures 0.3.5", "libp2p-core", "libp2p-swarm", - "log 0.4.8", + "log 0.4.11", "prost", "prost-build", "smallvec 1.4.1", @@ -2754,7 +2804,7 @@ dependencies = [ "futures_codec", "libp2p-core", "libp2p-swarm", - "log 0.4.8", + "log 0.4.11", "multihash", "prost", "prost-build", @@ -2781,7 +2831,7 @@ dependencies = [ "lazy_static", "libp2p-core", "libp2p-swarm", - "log 0.4.8", + "log 0.4.11", "net2", "rand 0.7.3", "smallvec 1.4.1", @@ -2800,7 +2850,7 @@ dependencies = [ "futures 0.3.5", "futures_codec", "libp2p-core", - "log 0.4.8", + "log 0.4.11", "parking_lot 0.10.2", "unsigned-varint 0.4.0", ] @@ -2816,7 +2866,7 @@ dependencies = [ "futures 0.3.5", "lazy_static", "libp2p-core", - "log 0.4.8", + "log 0.4.11", "prost", "prost-build", "rand 0.7.3", @@ -2836,7 +2886,7 @@ dependencies = [ "futures 0.3.5", "libp2p-core", "libp2p-swarm", - "log 0.4.8", + "log 0.4.11", "rand 0.7.3", "void", "wasm-timer", @@ -2850,7 +2900,7 @@ checksum = "f88d5e2a090a2aadf042cd33484e2f015c6dab212567406a59deece5dedbd133" dependencies = [ "futures 0.3.5", "libp2p-core", - "log 0.4.8", + "log 0.4.11", "rand 0.7.3", "smallvec 1.4.1", "void", @@ -2869,7 +2919,7 @@ dependencies = [ "get_if_addrs", "ipnet", "libp2p-core", - "log 0.4.8", + "log 0.4.11", "socket2", ] @@ -2897,7 +2947,7 @@ dependencies = [ "either", "futures 0.3.5", "libp2p-core", - "log 0.4.8", + "log 0.4.11", "quicksink", "rustls", "rw-stream-sink", @@ -2995,20 +3045,29 @@ dependencies = [ "scopeguard", ] +[[package]] +name = "lock_api" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28247cc5a5be2f05fbcd76dd0cf2c7d3b5400cb978a28042abcd4fa0b3f8261c" +dependencies = [ + "scopeguard", +] + [[package]] name = "log" version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e19e8d5c34a3e0e2223db8e060f9e8264aeeb5c5fc64a4ee9965c062211c024b" dependencies = [ - "log 0.4.8", + "log 0.4.11", ] [[package]] name = "log" -version = "0.4.8" +version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14b6052be84e6b71ab17edffc2eeabf5c2c3ae1fdb464aae35ac50c67a44e1f7" +checksum = "4fabed175da42fed1fa0746b0ea71f412aa9d35e76e95e59b192c64b9dc2bf8b" dependencies = [ "cfg-if", ] @@ -3153,7 +3212,7 @@ dependencies = [ "iovec", "kernel32-sys", "libc", - "log 0.4.8", + "log 0.4.11", "miow 0.2.1", "net2", "slab", @@ -3167,7 +3226,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "52403fe290012ce777c4626790c8951324a2b9e3316b3143779c72b029742f19" dependencies = [ "lazycell", - "log 0.4.8", + "log 0.4.11", "mio", "slab", ] @@ -3178,7 +3237,7 @@ version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0840c1c50fd55e521b247f949c241c9997709f23bd7f023b9762cd561e935656" dependencies = [ - "log 0.4.8", + "log 0.4.11", "mio", "miow 0.3.5", "winapi 0.3.9", @@ -3252,7 +3311,7 @@ checksum = "c9157e87afbc2ef0d84cc0345423d715f445edde00141c93721c162de35a05e5" dependencies = [ "bytes 0.5.5", "futures 0.3.5", - "log 0.4.8", + "log 0.4.11", "pin-project", "smallvec 1.4.1", "unsigned-varint 0.4.0", @@ -4041,7 +4100,7 @@ dependencies = [ "blake2-rfc", "crc32fast", "libc", - "log 0.4.8", + "log 0.4.11", "memmap", "parking_lot 0.10.2", ] @@ -4104,7 +4163,7 @@ dependencies = [ "bytes 0.4.12", "futures 0.1.29", "libc", - "log 0.4.8", + "log 0.4.11", "mio-named-pipes", "miow 0.3.5", "rand 0.7.3", @@ -4160,7 +4219,7 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f842b1982eb6c2fe34036a4fbfb06dd185a3f5c8edfaacdf7d1ea10b07de6252" dependencies = [ - "lock_api", + "lock_api 0.3.4", "parking_lot_core 0.6.2", "rustc_version", ] @@ -4171,10 +4230,21 @@ version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3a704eb390aafdc107b0e392f56a82b668e3a71366993b5340f5833fd62505e" dependencies = [ - "lock_api", + "lock_api 0.3.4", "parking_lot_core 0.7.2", ] +[[package]] +name = "parking_lot" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4893845fa2ca272e647da5d0e46660a314ead9c2fdd9a883aabc32e481a8733" +dependencies = [ + "instant", + "lock_api 0.4.1", + "parking_lot_core 0.8.0", +] + [[package]] name = "parking_lot_core" version = "0.6.2" @@ -4182,7 +4252,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b876b1b9e7ac6e1a74a6da34d25c42e17e8862aa409cbbbdcfc8d86c6f3bc62b" dependencies = [ "cfg-if", - "cloudabi", + "cloudabi 0.0.3", "libc", "redox_syscall", "rustc_version", @@ -4197,7 +4267,22 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d58c7c768d4ba344e3e8d72518ac13e259d7c7ade24167003b8488e10b6740a3" dependencies = [ "cfg-if", - "cloudabi", + "cloudabi 0.0.3", + "libc", + "redox_syscall", + "smallvec 1.4.1", + "winapi 0.3.9", +] + +[[package]] +name = "parking_lot_core" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c361aa727dd08437f2f1447be8b59a33b0edd15e0fcee698f935613d9efbca9b" +dependencies = [ + "cfg-if", + "cloudabi 0.1.0", + "instant", "libc", "redox_syscall", "smallvec 1.4.1", @@ -4334,20 +4419,50 @@ dependencies = [ "env_logger", "futures 0.3.5", "futures-timer 3.0.2", - "log 0.4.8", + "log 0.4.11", "maplit", "parity-scale-codec", - "parking_lot 0.10.2", + "parking_lot 0.11.0", + "polkadot-network", + "polkadot-network-bridge", + "polkadot-node-primitives", + "polkadot-node-subsystem", + "polkadot-node-subsystem-test-helpers", + "polkadot-primitives", + "sc-network", + "smol 0.3.3", + "smol-timeout", + "sp-core", + "streamunordered", +] + +[[package]] +name = "polkadot-availability-distribution" +version = "0.1.0" +dependencies = [ + "assert_matches", + "bitvec", + "derive_more 0.99.9", + "env_logger", + "futures 0.3.5", + "futures-timer 3.0.2", + "log 0.4.11", + "parity-scale-codec", + "parking_lot 0.11.0", + "polkadot-erasure-coding", "polkadot-network", "polkadot-network-bridge", "polkadot-node-primitives", "polkadot-node-subsystem", "polkadot-node-subsystem-test-helpers", "polkadot-primitives", + "sc-keystore", "sc-network", - "smol 0.2.0", + "smallvec 1.4.1", "smol-timeout", "sp-core", + "sp-keyring", + "sp-staking", "streamunordered", ] @@ -4361,7 +4476,7 @@ dependencies = [ "kvdb", "kvdb-memorydb", "kvdb-rocksdb", - "log 0.4.8", + "log 0.4.11", "parity-scale-codec", "parking_lot 0.9.0", "polkadot-erasure-coding", @@ -4383,7 +4498,7 @@ version = "0.8.22" dependencies = [ "frame-benchmarking-cli", "futures 0.3.5", - "log 0.4.8", + "log 0.4.11", "polkadot-service", "polkadot-service-new", "sc-cli", @@ -4409,7 +4524,7 @@ version = "0.8.22" dependencies = [ "futures 0.3.5", "futures-timer 2.0.2", - "log 0.4.8", + "log 0.4.11", "parity-scale-codec", "polkadot-cli", "polkadot-network", @@ -4463,7 +4578,7 @@ dependencies = [ "exit-future", "futures 0.3.5", "futures-timer 2.0.2", - "log 0.4.8", + "log 0.4.11", "parity-scale-codec", "parking_lot 0.9.0", "polkadot-availability-store", @@ -4490,7 +4605,7 @@ dependencies = [ "assert_matches", "futures 0.3.5", "futures-timer 3.0.2", - "log 0.4.8", + "log 0.4.11", "parity-scale-codec", "parking_lot 0.10.2", "polkadot-node-primitives", @@ -4508,7 +4623,7 @@ name = "polkadot-network-test" version = "0.8.22" dependencies = [ "futures 0.3.5", - "log 0.4.8", + "log 0.4.11", "parking_lot 0.10.2", "polkadot-test-runtime-client", "rand 0.7.3", @@ -4534,7 +4649,7 @@ dependencies = [ "kvdb", "kvdb-memorydb", "kvdb-rocksdb", - "log 0.4.8", + "log 0.4.11", "parity-scale-codec", "polkadot-erasure-coding", "polkadot-node-subsystem", @@ -4552,7 +4667,7 @@ dependencies = [ "bitvec", "derive_more 0.99.9", "futures 0.3.5", - "log 0.4.8", + "log 0.4.11", "polkadot-erasure-coding", "polkadot-node-primitives", "polkadot-node-subsystem", @@ -4575,7 +4690,7 @@ dependencies = [ "bitvec", "derive_more 0.99.9", "futures 0.3.5", - "log 0.4.8", + "log 0.4.11", "polkadot-node-subsystem", "polkadot-node-subsystem-util", "polkadot-primitives", @@ -4590,7 +4705,7 @@ dependencies = [ "assert_matches", "derive_more 0.99.9", "futures 0.3.5", - "log 0.4.8", + "log 0.4.11", "parity-scale-codec", "polkadot-node-primitives", "polkadot-node-subsystem", @@ -4621,7 +4736,7 @@ version = "0.1.0" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", - "log 0.4.8", + "log 0.4.11", "parity-scale-codec", "polkadot-node-subsystem", "polkadot-overseer", @@ -4649,7 +4764,7 @@ dependencies = [ "derive_more 0.99.9", "futures 0.3.5", "lazy_static", - "log 0.4.8", + "log 0.4.11", "polkadot-node-subsystem", "polkadot-node-subsystem-util", "polkadot-primitives", @@ -4691,7 +4806,7 @@ dependencies = [ "derive_more 0.99.9", "futures 0.3.5", "futures-timer 3.0.2", - "log 0.4.8", + "log 0.4.11", "parity-scale-codec", "parking_lot 0.10.2", "pin-project", @@ -4712,7 +4827,7 @@ dependencies = [ "derive_more 0.99.9", "futures 0.3.5", "futures-timer 3.0.2", - "log 0.4.8", + "log 0.4.11", "parity-scale-codec", "parking_lot 0.10.2", "pin-project", @@ -4734,7 +4849,7 @@ dependencies = [ "derive_more 0.99.9", "futures 0.3.5", "futures-timer 3.0.2", - "log 0.4.8", + "log 0.4.11", "parity-scale-codec", "parking_lot 0.10.2", "pin-project", @@ -4759,7 +4874,7 @@ dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", "kv-log-macro", - "log 0.4.8", + "log 0.4.11", "polkadot-node-primitives", "polkadot-node-subsystem", "polkadot-primitives", @@ -4774,7 +4889,7 @@ version = "0.8.22" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", - "log 0.4.8", + "log 0.4.11", "parity-scale-codec", "parking_lot 0.10.2", "polkadot-core-primitives", @@ -4795,7 +4910,7 @@ dependencies = [ "assert_matches", "futures 0.3.5", "futures-timer 3.0.2", - "log 0.4.8", + "log 0.4.11", "parity-scale-codec", "parking_lot 0.10.2", "polkadot-node-primitives", @@ -5033,7 +5148,7 @@ dependencies = [ "hex-literal", "kusama-runtime", "lazy_static", - "log 0.4.8", + "log 0.4.11", "pallet-babe", "pallet-im-online", "pallet-staking", @@ -5094,7 +5209,7 @@ dependencies = [ "hex-literal", "kusama-runtime", "lazy_static", - "log 0.4.8", + "log 0.4.11", "pallet-babe", "pallet-im-online", "pallet-staking", @@ -5153,7 +5268,7 @@ dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", "indexmap", - "log 0.4.8", + "log 0.4.11", "parity-scale-codec", "parking_lot 0.10.2", "polkadot-node-primitives", @@ -5267,7 +5382,7 @@ dependencies = [ "futures 0.1.29", "futures 0.3.5", "hex", - "log 0.4.8", + "log 0.4.11", "pallet-balances", "pallet-staking", "pallet-transaction-payment", @@ -5317,7 +5432,7 @@ dependencies = [ "exit-future", "futures 0.3.5", "futures-timer 2.0.2", - "log 0.4.8", + "log 0.4.11", "parity-scale-codec", "parking_lot 0.9.0", "polkadot-availability-store", @@ -5515,7 +5630,7 @@ dependencies = [ "bytes 0.5.5", "heck", "itertools 0.8.2", - "log 0.4.8", + "log 0.4.11", "multimap", "petgraph", "prost", @@ -5617,7 +5732,7 @@ version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c618c47cd3ebd209790115ab837de41425723956ad3ce2e6a7f09890947cacb9" dependencies = [ - "cloudabi", + "cloudabi 0.0.3", "fuchsia-cprng", "libc", "rand_core 0.3.1", @@ -5745,7 +5860,7 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7b75f676a1e053fc562eafbb47838d67c84801e38fc1ba459e8f180deabd5071" dependencies = [ - "cloudabi", + "cloudabi 0.0.3", "fuchsia-cprng", "libc", "rand_core 0.4.2", @@ -5885,7 +6000,7 @@ version = "0.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b9ba8aaf5fe7cf307c6dbdaeed85478961d29e25e3bee5169e11b92fa9f027a8" dependencies = [ - "log 0.4.8", + "log 0.4.11", "rustc-hash", "smallvec 1.4.1", ] @@ -6165,7 +6280,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cac94b333ee2aac3284c5b8a1b7fb4dd11cba88c244e3fe33cdbd047af0eb693" dependencies = [ "base64 0.12.3", - "log 0.4.8", + "log 0.4.11", "ring", "sct", "webpki", @@ -6219,7 +6334,7 @@ dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", "libp2p", - "log 0.4.8", + "log 0.4.11", "parity-scale-codec", "prost", "prost-build", @@ -6243,7 +6358,7 @@ source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", - "log 0.4.8", + "log 0.4.11", "parity-scale-codec", "sc-block-builder", "sc-client-api", @@ -6317,7 +6432,7 @@ dependencies = [ "fdlimit", "futures 0.3.5", "lazy_static", - "log 0.4.8", + "log 0.4.11", "names", "nix 0.17.0", "parity-util-mem", @@ -6357,7 +6472,7 @@ dependencies = [ "hex-literal", "kvdb", "lazy_static", - "log 0.4.8", + "log 0.4.11", "parity-scale-codec", "parking_lot 0.10.2", "sc-executor", @@ -6392,7 +6507,7 @@ dependencies = [ "kvdb-memorydb", "kvdb-rocksdb", "linked-hash-map", - "log 0.4.8", + "log 0.4.11", "parity-db", "parity-scale-codec", "parity-util-mem", @@ -6431,7 +6546,7 @@ dependencies = [ "fork-tree", "futures 0.3.5", "futures-timer 3.0.2", - "log 0.4.8", + "log 0.4.11", "merlin", "num-bigint", "num-rational", @@ -6510,7 +6625,7 @@ source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", - "log 0.4.8", + "log 0.4.11", "parity-scale-codec", "parking_lot 0.10.2", "sc-client-api", @@ -6531,7 +6646,7 @@ name = "sc-consensus-uncles" version = "0.8.0-rc5" source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ - "log 0.4.8", + "log 0.4.11", "sc-client-api", "sp-authorship", "sp-consensus", @@ -6548,7 +6663,7 @@ dependencies = [ "derive_more 0.99.9", "lazy_static", "libsecp256k1", - "log 0.4.8", + "log 0.4.11", "parity-scale-codec", "parity-wasm", "parking_lot 0.10.2", @@ -6574,7 +6689,7 @@ version = "0.8.0-rc5" source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "derive_more 0.99.9", - "log 0.4.8", + "log 0.4.11", "parity-scale-codec", "parity-wasm", "sp-allocator", @@ -6590,7 +6705,7 @@ name = "sc-executor-wasmi" version = "0.8.0-rc5" source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ - "log 0.4.8", + "log 0.4.11", "parity-scale-codec", "sc-executor-common", "sp-allocator", @@ -6607,7 +6722,7 @@ source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df dependencies = [ "cranelift-codegen", "cranelift-wasm", - "log 0.4.8", + "log 0.4.11", "parity-scale-codec", "parity-wasm", "sc-executor-common", @@ -6631,7 +6746,7 @@ dependencies = [ "fork-tree", "futures 0.3.5", "futures-timer 3.0.2", - "log 0.4.8", + "log 0.4.11", "parity-scale-codec", "parking_lot 0.10.2", "pin-project", @@ -6670,7 +6785,7 @@ dependencies = [ "jsonrpc-core-client", "jsonrpc-derive", "jsonrpc-pubsub", - "log 0.4.8", + "log 0.4.11", "parity-scale-codec", "sc-finality-grandpa", "sc-rpc", @@ -6686,7 +6801,7 @@ source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df dependencies = [ "ansi_term 0.12.1", "futures 0.3.5", - "log 0.4.8", + "log 0.4.11", "parity-util-mem", "sc-client-api", "sc-network", @@ -6753,7 +6868,7 @@ dependencies = [ "libp2p", "linked-hash-map", "linked_hash_set", - "log 0.4.8", + "log 0.4.11", "lru", "nohash-hasher", "parity-scale-codec", @@ -6792,7 +6907,7 @@ dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", "libp2p", - "log 0.4.8", + "log 0.4.11", "lru", "sc-network", "sp-runtime", @@ -6808,7 +6923,7 @@ dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", "libp2p", - "log 0.4.8", + "log 0.4.11", "parking_lot 0.10.2", "rand 0.7.3", "sc-block-builder", @@ -6837,7 +6952,7 @@ dependencies = [ "futures-timer 3.0.2", "hyper 0.13.6", "hyper-rustls", - "log 0.4.8", + "log 0.4.11", "num_cpus", "parity-scale-codec", "parking_lot 0.10.2", @@ -6860,7 +6975,7 @@ source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df dependencies = [ "futures 0.3.5", "libp2p", - "log 0.4.8", + "log 0.4.11", "serde_json", "sp-utils", "wasm-timer", @@ -6871,7 +6986,7 @@ name = "sc-proposer-metrics" version = "0.8.0-rc5" source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ - "log 0.4.8", + "log 0.4.11", "substrate-prometheus-endpoint", ] @@ -6884,7 +6999,7 @@ dependencies = [ "hash-db", "jsonrpc-core", "jsonrpc-pubsub", - "log 0.4.8", + "log 0.4.11", "parity-scale-codec", "parking_lot 0.10.2", "sc-block-builder", @@ -6918,7 +7033,7 @@ dependencies = [ "jsonrpc-core-client", "jsonrpc-derive", "jsonrpc-pubsub", - "log 0.4.8", + "log 0.4.11", "parity-scale-codec", "parking_lot 0.10.2", "serde", @@ -6941,7 +7056,7 @@ dependencies = [ "jsonrpc-ipc-server", "jsonrpc-pubsub", "jsonrpc-ws-server", - "log 0.4.8", + "log 0.4.11", "serde", "serde_json", "sp-runtime", @@ -6961,7 +7076,7 @@ dependencies = [ "hash-db", "jsonrpc-pubsub", "lazy_static", - "log 0.4.8", + "log 0.4.11", "parity-scale-codec", "parity-util-mem", "parking_lot 0.10.2", @@ -7012,7 +7127,7 @@ name = "sc-state-db" version = "0.8.0-rc5" source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ - "log 0.4.8", + "log 0.4.11", "parity-scale-codec", "parity-util-mem", "parity-util-mem-derive", @@ -7029,7 +7144,7 @@ dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", "libp2p", - "log 0.4.8", + "log 0.4.11", "parking_lot 0.10.2", "pin-project", "rand 0.7.3", @@ -7048,7 +7163,7 @@ version = "2.0.0-rc5" source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "erased-serde", - "log 0.4.8", + "log 0.4.11", "parking_lot 0.10.2", "rustc-hash", "sc-telemetry", @@ -7067,7 +7182,7 @@ dependencies = [ "derive_more 0.99.9", "futures 0.3.5", "linked-hash-map", - "log 0.4.8", + "log 0.4.11", "parity-util-mem", "parking_lot 0.10.2", "retain_mut", @@ -7089,7 +7204,7 @@ dependencies = [ "futures 0.3.5", "futures-diagnose", "intervalier", - "log 0.4.8", + "log 0.4.11", "parity-scale-codec", "parity-util-mem", "parking_lot 0.10.2", @@ -7337,7 +7452,7 @@ dependencies = [ "cfg-if", "enum_primitive", "libc", - "log 0.4.8", + "log 0.4.11", "memrange", "nix 0.10.0", "quick-error", @@ -7452,7 +7567,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "620cbb3c6e34da57d3a248cda0cd01cd5848164dc062e764e65d06fe3ea7aed5" dependencies = [ "async-task", - "blocking", + "blocking 0.4.7", "concurrent-queue", "fastrand", "futures-io", @@ -7468,15 +7583,18 @@ dependencies = [ [[package]] name = "smol" -version = "0.2.0" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "346a94824d48ed7c5fc7247f3cbbf0317bdfe15fc39d08f9262609cccce61254" +checksum = "67583f4ccc13bbb105a0752058d8ad66c47753d85445952809bcaca891954f83" dependencies = [ + "async-channel", + "async-executor", "async-io", - "blocking", - "multitask", + "blocking 0.5.0", + "cfg-if", + "easy-parallel", + "futures-lite", "num_cpus", - "once_cell", ] [[package]] @@ -7530,7 +7648,7 @@ dependencies = [ "flate2", "futures 0.3.5", "httparse", - "log 0.4.8", + "log 0.4.11", "rand 0.7.3", "sha-1", ] @@ -7541,7 +7659,7 @@ version = "2.0.0-rc5" source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "derive_more 0.99.9", - "log 0.4.8", + "log 0.4.11", "sp-core", "sp-std", "sp-wasm-interface", @@ -7640,7 +7758,7 @@ version = "2.0.0-rc5" source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "derive_more 0.99.9", - "log 0.4.8", + "log 0.4.11", "lru", "parity-scale-codec", "parking_lot 0.10.2", @@ -7669,7 +7787,7 @@ dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", "libp2p", - "log 0.4.8", + "log 0.4.11", "parity-scale-codec", "parking_lot 0.10.2", "serde", @@ -7758,7 +7876,7 @@ dependencies = [ "impl-serde 0.3.1", "lazy_static", "libsecp256k1", - "log 0.4.8", + "log 0.4.11", "merlin", "num-traits 0.2.12", "parity-scale-codec", @@ -7820,7 +7938,7 @@ version = "2.0.0-rc5" source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "finality-grandpa", - "log 0.4.8", + "log 0.4.11", "parity-scale-codec", "serde", "sp-api", @@ -7860,7 +7978,7 @@ dependencies = [ "futures 0.3.5", "hash-db", "libsecp256k1", - "log 0.4.8", + "log 0.4.11", "parity-scale-codec", "parking_lot 0.10.2", "sp-core", @@ -7923,7 +8041,7 @@ version = "2.0.0-rc5" source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ "backtrace", - "log 0.4.8", + "log 0.4.11", ] [[package]] @@ -7943,7 +8061,7 @@ dependencies = [ "either", "hash256-std-hasher", "impl-trait-for-tuples", - "log 0.4.8", + "log 0.4.11", "parity-scale-codec", "parity-util-mem", "paste", @@ -8023,7 +8141,7 @@ source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df dependencies = [ "hash-db", "itertools 0.9.0", - "log 0.4.8", + "log 0.4.11", "num-traits 0.2.12", "parity-scale-codec", "parking_lot 0.10.2", @@ -8073,7 +8191,7 @@ name = "sp-tracing" version = "2.0.0-rc5" source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" dependencies = [ - "log 0.4.8", + "log 0.4.11", "rental", "tracing", ] @@ -8085,7 +8203,7 @@ source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df dependencies = [ "derive_more 0.99.9", "futures 0.3.5", - "log 0.4.8", + "log 0.4.11", "parity-scale-codec", "serde", "sp-api", @@ -8276,7 +8394,7 @@ dependencies = [ "js-sys", "kvdb-web", "libp2p-wasm-ext", - "log 0.4.8", + "log 0.4.11", "rand 0.6.5", "rand 0.7.3", "sc-chain-spec", @@ -8306,7 +8424,7 @@ dependencies = [ "jsonrpc-core", "jsonrpc-core-client", "jsonrpc-derive", - "log 0.4.8", + "log 0.4.11", "parity-scale-codec", "sc-client-api", "sc-rpc-api", @@ -8328,7 +8446,7 @@ dependencies = [ "derive_more 0.99.9", "futures-util", "hyper 0.13.6", - "log 0.4.8", + "log 0.4.11", "prometheus", "tokio 0.2.21", ] @@ -8369,7 +8487,7 @@ dependencies = [ "frame-support", "frame-system", "frame-system-rpc-runtime-api", - "log 0.4.8", + "log 0.4.11", "memory-db", "pallet-babe", "pallet-timestamp", @@ -8442,7 +8560,7 @@ dependencies = [ "cfg-if", "lazy_static", "libc", - "log 0.4.8", + "log 0.4.11", "region", "rustc-demangle", "smallvec 1.4.1", @@ -8836,7 +8954,7 @@ checksum = "57fc868aae093479e3131e3d165c93b1c7474109d13c90ec0dda2a1bbfff0674" dependencies = [ "bytes 0.4.12", "futures 0.1.29", - "log 0.4.8", + "log 0.4.11", ] [[package]] @@ -8872,7 +8990,7 @@ dependencies = [ "crossbeam-utils", "futures 0.1.29", "lazy_static", - "log 0.4.8", + "log 0.4.11", "mio", "num_cpus", "parking_lot 0.9.0", @@ -8949,7 +9067,7 @@ dependencies = [ "crossbeam-utils", "futures 0.1.29", "lazy_static", - "log 0.4.8", + "log 0.4.11", "num_cpus", "slab", "tokio-executor 0.1.10", @@ -8975,7 +9093,7 @@ checksum = "e2a0b10e610b39c38b031a2fcab08e4b82f16ece36504988dcbd81dbba650d82" dependencies = [ "bytes 0.4.12", "futures 0.1.29", - "log 0.4.8", + "log 0.4.11", "mio", "tokio-codec", "tokio-io", @@ -8992,7 +9110,7 @@ dependencies = [ "futures 0.1.29", "iovec", "libc", - "log 0.4.8", + "log 0.4.11", "mio", "mio-uds", "tokio-codec", @@ -9009,7 +9127,7 @@ dependencies = [ "bytes 0.5.5", "futures-core", "futures-sink", - "log 0.4.8", + "log 0.4.11", "pin-project-lite", "tokio 0.2.21", ] @@ -9074,7 +9192,7 @@ checksum = "39f1a9a9252d38c5337cf0c5392988821a5cf1b2103245016968f2ab41de9e38" dependencies = [ "hash-db", "hashbrown 0.8.0", - "log 0.4.8", + "log 0.4.11", "rustc-hex", "smallvec 1.4.1", ] @@ -9280,7 +9398,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6395efa4784b027708f7451087e647ec73cc74f5d9bc2e418404248d679a230" dependencies = [ "futures 0.1.29", - "log 0.4.8", + "log 0.4.11", "try-lock", ] @@ -9290,7 +9408,7 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0" dependencies = [ - "log 0.4.8", + "log 0.4.11", "try-lock", ] @@ -9320,7 +9438,7 @@ checksum = "3e53963b583d18a5aa3aaae4b4c1cb535218246131ba22a71f05b518098571df" dependencies = [ "bumpalo", "lazy_static", - "log 0.4.8", + "log 0.4.11", "proc-macro2 1.0.18", "quote 1.0.7", "syn 1.0.33", @@ -9454,7 +9572,7 @@ dependencies = [ "file-per-thread-logger", "indexmap", "libc", - "log 0.4.8", + "log 0.4.11", "more-asserts", "rayon", "serde", @@ -9480,7 +9598,7 @@ dependencies = [ "cranelift-native", "cranelift-wasm", "gimli 0.21.0", - "log 0.4.8", + "log 0.4.11", "more-asserts", "object 0.20.0", "region", @@ -9540,7 +9658,7 @@ dependencies = [ "indexmap", "lazy_static", "libc", - "log 0.4.8", + "log 0.4.11", "memoffset", "more-asserts", "region", @@ -9752,7 +9870,7 @@ dependencies = [ "byteorder", "bytes 0.4.12", "httparse", - "log 0.4.8", + "log 0.4.11", "mio", "mio-extras", "rand 0.7.3", @@ -9789,7 +9907,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cd37e58a1256a0b328ce9c67d8b62ecdd02f4803ba443df478835cb1a41a637c" dependencies = [ "futures 0.3.5", - "log 0.4.8", + "log 0.4.11", "nohash-hasher", "parking_lot 0.10.2", "rand 0.7.3", diff --git a/Cargo.toml b/Cargo.toml index 60d2f5671d..be1bc74858 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -57,6 +57,7 @@ members = [ "node/network/pov-distribution", "node/network/statement-distribution", "node/network/bitfield-distribution", + "node/network/availability-distribution", "node/overseer", "node/primitives", "node/service", diff --git a/node/network/availability-distribution/Cargo.toml b/node/network/availability-distribution/Cargo.toml new file mode 100644 index 0000000000..c2d313c3cf --- /dev/null +++ b/node/network/availability-distribution/Cargo.toml @@ -0,0 +1,34 @@ +[package] +name = "polkadot-availability-distribution" +version = "0.1.0" +authors = ["Parity Technologies "] +edition = "2018" + +[dependencies] +futures = "0.3.5" +log = "0.4.11" +streamunordered = "0.5.1" +codec = { package="parity-scale-codec", version = "1.3.4", features = ["std"] } +node-primitives = { package = "polkadot-node-primitives", path = "../../primitives" } +polkadot-primitives = { path = "../../../primitives" } +polkadot-erasure-coding = { path = "../../../erasure-coding" } +polkadot-subsystem = { package = "polkadot-node-subsystem", path = "../../subsystem" } +polkadot-network-bridge = { path = "../../network/bridge" } +polkadot-network = { path = "../../../network" } +sc-network = { git = "https://github.com/paritytech/substrate", branch = "master" } +sc-keystore = { git = "https://github.com/paritytech/substrate", branch = "master" } +derive_more = "0.99.9" +sp-staking = { git = "https://github.com/paritytech/substrate", branch = "master", features = ["std"] } +sp-core = { git = "https://github.com/paritytech/substrate", branch = "master", features = ["std"] } + +[dev-dependencies] +polkadot-subsystem-testhelpers = { package = "polkadot-node-subsystem-test-helpers", path = "../../subsystem-test-helpers" } +bitvec = { version = "0.17.4", default-features = false, features = ["alloc"] } +sp-core = { git = "https://github.com/paritytech/substrate", branch = "master", features = ["std"] } +sp-keyring = { git = "https://github.com/paritytech/substrate", branch = "master" } +parking_lot = "0.11.0" +futures-timer = "3.0.2" +smol-timeout = "0.1.0" +env_logger = "0.7.1" +assert_matches = "1.3.0" +smallvec = "1" \ No newline at end of file diff --git a/node/network/availability-distribution/src/lib.rs b/node/network/availability-distribution/src/lib.rs new file mode 100644 index 0000000000..b3934ded6f --- /dev/null +++ b/node/network/availability-distribution/src/lib.rs @@ -0,0 +1,1092 @@ +// Copyright 2020 Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Polkadot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . + +//! The availability distribution +//! +//! Transforms `AvailableData` into erasure chunks, which are distributed to peers +//! who are interested in the relevant candidates. +//! Gossip messages received from other peers are verified and gossiped to interested +//! peers. Verified in this context means, the erasure chunks contained merkle proof +//! is checked. + +use codec::{Decode, Encode}; +use futures::{channel::oneshot, FutureExt}; + +use keystore::KeyStorePtr; +use sp_core::{ + crypto::Public, + traits::BareCryptoStore, +}; +use sc_keystore as keystore; + +use node_primitives::{ProtocolId, View}; + +use log::{trace, warn}; +use polkadot_erasure_coding::branch_hash; +use polkadot_primitives::v1::{ + PARACHAIN_KEY_TYPE_ID, + BlakeTwo256, CommittedCandidateReceipt, CoreState, ErasureChunk, + Hash as Hash, HashT, Id as ParaId, + ValidatorId, ValidatorIndex, +}; +use polkadot_subsystem::messages::*; +use polkadot_subsystem::{ + errors::{ChainApiError, RuntimeApiError}, + ActiveLeavesUpdate, FromOverseer, OverseerSignal, SpawnedSubsystem, Subsystem, + SubsystemContext, SubsystemError, +}; +use sc_network::ReputationChange as Rep; +use sp_staking::SessionIndex; +use std::collections::{HashMap, HashSet}; +use std::io; +use std::iter; + +const TARGET: &'static str = "avad"; + +#[derive(Debug, derive_more::From)] +enum Error { + #[from] + Erasure(polkadot_erasure_coding::Error), + #[from] + Io(io::Error), + #[from] + Oneshot(oneshot::Canceled), + #[from] + Subsystem(SubsystemError), + #[from] + RuntimeApi(RuntimeApiError), + #[from] + ChainApi(ChainApiError), +} + +type Result = std::result::Result; + +const COST_MERKLE_PROOF_INVALID: Rep = Rep::new(-100, "Merkle proof was invalid"); +const COST_NOT_A_LIVE_CANDIDATE: Rep = Rep::new(-51, "Candidate is not live"); +const COST_MESSAGE_NOT_DECODABLE: Rep = Rep::new(-100, "Message is not decodable"); +const COST_PEER_DUPLICATE_MESSAGE: Rep = Rep::new(-500, "Peer sent identical messages"); +const BENEFIT_VALID_MESSAGE_FIRST: Rep = Rep::new(15, "Valid message with new information"); +const BENEFIT_VALID_MESSAGE: Rep = Rep::new(10, "Valid message"); + +/// Checked signed availability bitfield that is distributed +/// to other peers. +#[derive(Encode, Decode, Debug, Clone, PartialEq, Eq, Hash)] +pub struct AvailabilityGossipMessage { + /// Anchor hash of the candidate the `ErasureChunk` is associated to. + pub candidate_hash: Hash, + /// The erasure chunk, a encoded information part of `AvailabilityData`. + pub erasure_chunk: ErasureChunk, +} + +/// Data used to track information of peers and relay parents the +/// overseer ordered us to work on. +#[derive(Default, Clone, Debug)] +struct ProtocolState { + /// Track all active peers and their views + /// to determine what is relevant to them. + peer_views: HashMap, + + /// Our own view. + view: View, + + /// Caches a mapping of relay parents or ancestor to live candidate receipts. + /// Allows fast intersection of live candidates with views and consecutive unioning. + /// Maps relay parent / ancestor -> live candidate receipts + its hash. + receipts: HashMap>, + + /// Allow reverse caching of view checks. + /// Maps candidate hash -> relay parent for extracting meta information from `PerRelayParent`. + /// Note that the presence of this is not sufficient to determine if deletion is OK, i.e. + /// two histories could cover this. + reverse: HashMap, + + /// Keeps track of which candidate receipts are required due to ancestors of which relay parents + /// of our view. + /// Maps ancestor -> relay parents in view + ancestry: HashMap>, + + /// Track things needed to start and stop work on a particular relay parent. + per_relay_parent: HashMap, + + /// Track data that is specific to a candidate. + per_candidate: HashMap, +} + +#[derive(Debug, Clone, Default)] +struct PerCandidate { + /// A Candidate and a set of known erasure chunks in form of messages to be gossiped / distributed if the peer view wants that. + /// This is _across_ peers and not specific to a particular one. + /// candidate hash + erasure chunk index -> gossip message + message_vault: HashMap, + + /// Track received candidate hashes and chunk indices from peers. + received_messages: HashMap>, + + /// Track already sent candidate hashes and the erasure chunk index to the peers. + sent_messages: HashMap>, + + /// The set of validators. + validators: Vec, + + /// If this node is a validator, note the index in the validator set. + validator_index: Option, +} + +#[derive(Debug, Clone, Default)] +struct PerRelayParent { + /// Set of `K` ancestors for this relay parent. + ancestors: Vec, +} + +impl ProtocolState { + /// Collects the relay_parents ancestors including the relay parents themselfes. + fn extend_with_ancestors<'a>( + &'a self, + relay_parents: impl IntoIterator + 'a, + ) -> HashSet { + relay_parents + .into_iter() + .map(|relay_parent| { + self.per_relay_parent + .get(relay_parent) + .into_iter() + .map(|per_relay_parent| per_relay_parent.ancestors.iter().cloned()) + .flatten() + .chain(iter::once(*relay_parent)) + }) + .flatten() + .collect::>() + } + + /// Unionize all cached entries for the given relay parents and its ancestors. + /// Ignores all non existent relay parents, so this can be used directly with a peers view. + /// Returns a map from candidate hash -> receipt + fn cached_live_candidates_unioned<'a>( + &'a self, + relay_parents: impl IntoIterator + 'a, + ) -> HashMap { + let relay_parents_and_ancestors = self.extend_with_ancestors(relay_parents); + relay_parents_and_ancestors + .into_iter() + .filter_map(|relay_parent_or_ancestor| self.receipts.get(&relay_parent_or_ancestor)) + .map(|receipt_set| receipt_set.into_iter()) + .flatten() + .map(|(receipt_hash, receipt)| (receipt_hash.clone(), receipt.clone())) + .collect::>() + } + + async fn add_relay_parent( + &mut self, + ctx: &mut Context, + relay_parent: Hash, + validators: Vec, + validator_index: Option, + ) -> Result<()> + where + Context: SubsystemContext, + { + let candidates = + query_live_candidates(ctx, self, std::iter::once(relay_parent)).await?; + + // register the relation of relay_parent to candidate.. + // ..and the reverse association. + for (relay_parent_or_ancestor, (receipt_hash, receipt)) in candidates.clone() { + self + .reverse + .insert(receipt_hash.clone(), relay_parent_or_ancestor.clone()); + let per_candidate = self.per_candidate.entry(receipt_hash.clone()) + .or_default(); + per_candidate.validator_index = validator_index.clone(); + per_candidate.validators = validators.clone(); + + self + .receipts + .entry(relay_parent_or_ancestor) + .or_default() + .insert((receipt_hash, receipt)); + } + + // collect the ancestors again from the hash map + let ancestors = candidates + .iter() + .filter_map(|(ancestor_or_relay_parent, _receipt)| { + if ancestor_or_relay_parent == &relay_parent { + None + } else { + Some(*ancestor_or_relay_parent) + } + }) + .collect::>(); + + // mark all the ancestors as "needed" by this newly added relay parent + for ancestor in ancestors.iter() { + self.ancestry + .entry(ancestor.clone()) + .or_default() + .insert(relay_parent); + } + + self + .per_relay_parent + .entry(relay_parent) + .or_default() + .ancestors = ancestors; + + Ok(()) + } + + fn remove_relay_parent(&mut self, relay_parent: &Hash) -> Result<()> { + // we might be ancestor of some other relay_parent + if let Some(ref mut descendants) = self.ancestry.get_mut(relay_parent) { + // if we were the last user, and it is + // not explicitly set to be worked on by the overseer + if descendants.is_empty() { + // remove from the ancestry index + self.ancestry.remove(relay_parent); + // and also remove the actual receipt + self.receipts.remove(relay_parent); + self.per_candidate.remove(relay_parent); + } + } + if let Some(per_relay_parent) = self.per_relay_parent.remove(relay_parent) { + // remove all "references" from the hash maps and sets for all ancestors + for ancestor in per_relay_parent.ancestors { + // one of our decendants might be ancestor of some other relay_parent + if let Some(ref mut descendants) = self.ancestry.get_mut(&ancestor) { + // we do not need this descendant anymore + descendants.remove(&relay_parent); + // if we were the last user, and it is + // not explicitly set to be worked on by the overseer + if descendants.is_empty() && !self.per_relay_parent.contains_key(&ancestor) { + // remove from the ancestry index + self.ancestry.remove(&ancestor); + // and also remove the actual receipt + self.receipts.remove(&ancestor); + self.per_candidate.remove(&ancestor); + } + } + } + } + Ok(()) + } +} + +fn network_update_message(n: NetworkBridgeEvent) -> AllMessages { + AllMessages::AvailabilityDistribution(AvailabilityDistributionMessage::NetworkBridgeUpdate(n)) +} + +/// Deal with network bridge updates and track what needs to be tracked +/// which depends on the message type received. +async fn handle_network_msg( + ctx: &mut Context, + keystore: KeyStorePtr, + state: &mut ProtocolState, + bridge_message: NetworkBridgeEvent, +) -> Result<()> +where + Context: SubsystemContext, +{ + match bridge_message { + NetworkBridgeEvent::PeerConnected(peerid, _role) => { + // insert if none already present + state.peer_views.entry(peerid).or_default(); + } + NetworkBridgeEvent::PeerDisconnected(peerid) => { + // get rid of superfluous data + state.peer_views.remove(&peerid); + } + NetworkBridgeEvent::PeerViewChange(peerid, view) => { + handle_peer_view_change(ctx, state, peerid, view).await?; + } + NetworkBridgeEvent::OurViewChange(view) => { + handle_our_view_change(ctx, keystore, state, view).await?; + } + NetworkBridgeEvent::PeerMessage(remote, bytes) => { + if let Ok(gossiped_availability) = + AvailabilityGossipMessage::decode(&mut (bytes.as_slice())) + { + trace!( + target: TARGET, + "Received availability gossip from peer {:?}", + &remote + ); + process_incoming_peer_message(ctx, state, remote, gossiped_availability).await?; + } else { + modify_reputation(ctx, remote, COST_MESSAGE_NOT_DECODABLE).await?; + } + } + } + Ok(()) +} + + +/// Handle the changes necessary when our view changes. +async fn handle_our_view_change( + ctx: &mut Context, + keystore: KeyStorePtr, + state: &mut ProtocolState, + view: View, +) -> Result<()> +where + Context: SubsystemContext, +{ + let old_view = std::mem::replace(&mut (state.view), view); + + // needed due to borrow rules + let view = state.view.clone(); + let added = view.difference(&old_view).collect::>(); + + // add all the relay parents and fill the cache + for added in added.iter() { + let added = **added; + let validators = query_validators(ctx, added).await?; + let validator_index = obtain_our_validator_index( + &validators, + keystore.clone(), + ); + state.add_relay_parent(ctx, added, validators, validator_index).await?; + } + + // handle all candidates + for (candidate_hash, _receipt) in state.cached_live_candidates_unioned(added) { + let per_candidate = state + .per_candidate + .entry(candidate_hash) + .or_default(); + + // assure the node has the validator role + if per_candidate.validator_index.is_none() { + continue; + }; + + // check if the availability is present in the store exists + if !query_data_availability(ctx, candidate_hash).await? { + continue; + } + + let validator_count = per_candidate.validators.len(); + + // obtain interested peers in the candidate hash + let peers: Vec = state + .peer_views + .clone() + .into_iter() + .filter(|(_peer, view)| { + // collect all direct interests of a peer w/o ancestors + state + .cached_live_candidates_unioned(view.0.iter()) + .contains_key(&candidate_hash) + }) + .map(|(peer, _view)| peer.clone()) + .collect(); + + // distribute all erasure messages to interested peers + for chunk_index in 0u32..(validator_count as u32) { + + // only the peers which did not receive this particular erasure chunk + let per_candidate = state + .per_candidate + .entry(candidate_hash) + .or_default(); + + // obtain the chunks from the cache, if not fallback + // and query the availability store + let message_id = (candidate_hash, chunk_index); + let erasure_chunk = if let Some(message) = per_candidate.message_vault.get(&chunk_index) { + message.erasure_chunk.clone() + } else if let Some(erasure_chunk) = query_chunk(ctx, candidate_hash, chunk_index as ValidatorIndex).await? { + erasure_chunk + } else { + continue; + }; + + debug_assert_eq!(erasure_chunk.index, chunk_index); + + let peers = peers + .iter() + .filter(|peer| { + // only pick those which were not sent before + !per_candidate + .sent_messages + .get(*peer) + .filter(|set| { + set.contains(&message_id) + }) + .is_some() + }) + .map(|peer| peer.clone()) + .collect::>(); + let message = AvailabilityGossipMessage { + candidate_hash, + erasure_chunk, + }; + + send_tracked_gossip_message_to_peers(ctx, per_candidate, peers, message).await?; + } + } + + // cleanup the removed relay parents and their states + let removed = old_view.difference(&view).collect::>(); + for removed in removed { + state.remove_relay_parent(&removed)?; + } + Ok(()) +} + +#[inline(always)] +async fn send_tracked_gossip_message_to_peers( + ctx: &mut Context, + per_candidate: &mut PerCandidate, + peers: Vec, + message: AvailabilityGossipMessage, +) -> Result<()> +where + Context: SubsystemContext, +{ + send_tracked_gossip_messages_to_peers(ctx, per_candidate, peers, iter::once(message)).await +} + +#[inline(always)] +async fn send_tracked_gossip_messages_to_peer( + ctx: &mut Context, + per_candidate: &mut PerCandidate, + peer: PeerId, + message_iter: impl IntoIterator, +) -> Result<()> +where + Context: SubsystemContext, +{ + send_tracked_gossip_messages_to_peers(ctx, per_candidate, vec![peer], message_iter).await +} + +async fn send_tracked_gossip_messages_to_peers( + ctx: &mut Context, + per_candidate: &mut PerCandidate, + peers: Vec, + message_iter: impl IntoIterator, +) -> Result<()> +where + Context: SubsystemContext, +{ + if peers.is_empty() { + return Ok(()) + } + for message in message_iter { + for peer in peers.iter() { + let message_id = (message.candidate_hash, message.erasure_chunk.index); + per_candidate + .sent_messages + .entry(peer.clone()) + .or_default() + .insert(message_id); + } + + let encoded = message.encode(); + per_candidate + .message_vault + .insert(message.erasure_chunk.index, message); + + ctx.send_message(AllMessages::NetworkBridge( + NetworkBridgeMessage::SendMessage( + peers.clone(), + AvailabilityDistributionSubsystem::PROTOCOL_ID, + encoded, + ), + )) + .await + .map_err::(Into::into)?; + } + + Ok(()) +} + +// Send the difference between two views which were not sent +// to that particular peer. +async fn handle_peer_view_change( + ctx: &mut Context, + state: &mut ProtocolState, + origin: PeerId, + view: View, +) -> Result<()> +where + Context: SubsystemContext, +{ + let current = state.peer_views.entry(origin.clone()).or_default(); + + let added: Vec = view.difference(&*current).cloned().collect(); + + *current = view; + + // only contains the intersection of what we are interested and + // the union of all relay parent's candidates. + let added_candidates = state.cached_live_candidates_unioned(added.iter()); + + // Send all messages we've seen before and the peer is now interested + // in to that peer. + + for (candidate_hash, _receipt) in added_candidates { + let per_candidate = state.per_candidate.entry(candidate_hash).or_default(); + + // obtain the relevant chunk indices not sent yet + let messages = ((0 as ValidatorIndex) + ..(per_candidate.validators.len() as ValidatorIndex)) + .into_iter() + .filter_map(|erasure_chunk_index: ValidatorIndex| { + let message_id = (candidate_hash, erasure_chunk_index); + + // try to pick up the message from the message vault + // so we send as much as we have + per_candidate + .message_vault + .get(&erasure_chunk_index) + .filter(|_| { + // check if that erasure chunk was already sent before + if let Some(sent_set) = per_candidate.sent_messages.get(&origin) { + if sent_set.contains(&message_id) { + return false; + } + } + true + }) + }) + .cloned() + .collect::>(); + + send_tracked_gossip_messages_to_peer(ctx, per_candidate, origin.clone(), messages).await?; + } + Ok(()) +} + +/// Obtain the first key which has a signing key. +/// Returns the index within the validator set as `ValidatorIndex`, if there exists one, +/// otherwise, `None` is returned. +fn obtain_our_validator_index( + validators: &[ValidatorId], + keystore: KeyStorePtr, +) -> Option { + let keystore = keystore.read(); + validators.iter().enumerate().find_map(|(idx, validator)| { + if keystore.has_keys(&[(validator.to_raw_vec(), PARACHAIN_KEY_TYPE_ID)]) { + Some(idx as ValidatorIndex) + } else { + None + } + }) +} + +/// Handle an incoming message from a peer. +async fn process_incoming_peer_message( + ctx: &mut Context, + state: &mut ProtocolState, + origin: PeerId, + message: AvailabilityGossipMessage, +) -> Result<()> +where + Context: SubsystemContext, +{ + // obtain the set of candidates we are interested in based on our current view + let live_candidates = state.cached_live_candidates_unioned(state.view.0.iter()); + + // check if the candidate is of interest + let live_candidate = if let Some(live_candidate) = live_candidates.get(&message.candidate_hash) + { + live_candidate + } else { + return modify_reputation(ctx, origin, COST_NOT_A_LIVE_CANDIDATE).await; + }; + + // check the merkle proof + let root = &live_candidate.commitments.erasure_root; + let anticipated_hash = if let Ok(hash) = branch_hash( + root, + &message.erasure_chunk.proof, + message.erasure_chunk.index as usize, + ) { + hash + } else { + return modify_reputation(ctx, origin, COST_MERKLE_PROOF_INVALID).await; + }; + + let erasure_chunk_hash = BlakeTwo256::hash(&message.erasure_chunk.chunk); + if anticipated_hash != erasure_chunk_hash { + return modify_reputation(ctx, origin, COST_MERKLE_PROOF_INVALID).await; + } + + // an internal unique identifier of this message + let message_id = (message.candidate_hash, message.erasure_chunk.index); + + { + let per_candidate = state.per_candidate.entry(message_id.0.clone()).or_default(); + + // check if this particular erasure chunk was already sent by that peer before + { + let received_set = per_candidate + .received_messages + .entry(origin.clone()) + .or_default(); + if received_set.contains(&message_id) { + return modify_reputation(ctx, origin, COST_PEER_DUPLICATE_MESSAGE).await; + } else { + received_set.insert(message_id.clone()); + } + } + + // insert into known messages and change reputation + if per_candidate + .message_vault + .insert(message_id.1, message.clone()) + .is_some() + { + modify_reputation(ctx, origin, BENEFIT_VALID_MESSAGE).await?; + } else { + modify_reputation(ctx, origin, BENEFIT_VALID_MESSAGE_FIRST).await?; + + // save the chunk for our index + if let Some(validator_index) = per_candidate.validator_index { + if message.erasure_chunk.index == validator_index { + if let Err(_e) = store_chunk( + ctx, + message.candidate_hash.clone(), + message.erasure_chunk.index, + message.erasure_chunk.clone(), + ).await? { + warn!(target: TARGET, "Failed to store erasure chunk to availability store"); + } + } + } + }; + } + // condense the peers to the peers with interest on the candidate + let peers = state + .peer_views + .clone() + .into_iter() + .filter(|(_peer, view)| { + // peers view must contain the candidate hash too + state + .cached_live_candidates_unioned(view.0.iter()) + .contains_key(&message_id.0) + }) + .map(|(peer, _)| -> PeerId { peer.clone() }) + .collect::>(); + + let per_candidate = state.per_candidate.entry(message_id.0.clone()).or_default(); + + let peers = peers + .into_iter() + .filter(|peer| { + let peer: PeerId = peer.clone(); + // avoid sending duplicate messages + per_candidate + .sent_messages + .entry(peer) + .or_default() + .contains(&message_id) + }) + .collect::>(); + + // gossip that message to interested peers + send_tracked_gossip_message_to_peers(ctx, per_candidate, peers, message).await +} + +/// The bitfield distribution subsystem. +pub struct AvailabilityDistributionSubsystem { + /// Pointer to a keystore, which is required for determining this nodes validator index. + keystore: KeyStorePtr, +} + +impl AvailabilityDistributionSubsystem { + /// The protocol identifier for bitfield distribution. + const PROTOCOL_ID: ProtocolId = *b"avad"; + + /// Number of ancestors to keep around for the relay-chain heads. + const K: usize = 3; + + /// Create a new instance of the availability distribution. + pub fn new(keystore: KeyStorePtr) -> Self { + Self { keystore } + } + + /// Start processing work as passed on from the Overseer. + async fn run(self, mut ctx: Context) -> Result<()> + where + Context: SubsystemContext, + { + // startup: register the network protocol with the bridge. + ctx.send_message(AllMessages::NetworkBridge( + NetworkBridgeMessage::RegisterEventProducer(Self::PROTOCOL_ID, network_update_message), + )) + .await + .map_err::(Into::into)?; + + // work: process incoming messages from the overseer. + let mut state = ProtocolState::default(); + loop { + let message = ctx.recv().await.map_err::(Into::into)?; + match message { + FromOverseer::Communication { + msg: AvailabilityDistributionMessage::NetworkBridgeUpdate(event), + } => { + if let Err(e) = handle_network_msg( + &mut ctx, + self.keystore.clone(), + &mut state, + event + ).await { + warn!( + target: TARGET, + "Failed to handle incomming network messages: {:?}", e + ); + } + } + FromOverseer::Signal(OverseerSignal::ActiveLeaves(ActiveLeavesUpdate { + activated: _, + deactivated: _, + })) => { + // handled at view change + } + FromOverseer::Signal(OverseerSignal::BlockFinalized(_)) => {} + FromOverseer::Signal(OverseerSignal::Conclude) => { + return Ok(()); + } + } + } + } +} + +impl Subsystem for AvailabilityDistributionSubsystem +where + Context: SubsystemContext + Sync + Send, +{ + fn start(self, ctx: Context) -> SpawnedSubsystem { + SpawnedSubsystem { + name: "availability-distribution-subsystem", + future: Box::pin(async move { self.run(ctx) }.map(|_| ())), + } + } +} + +/// Obtain all live candidates based on an iterator of relay heads. +async fn query_live_candidates_without_ancestors( + ctx: &mut Context, + relay_parents: impl IntoIterator, +) -> Result> +where + Context: SubsystemContext, +{ + let iter = relay_parents.into_iter(); + let hint = iter.size_hint(); + + let mut live_candidates = HashSet::with_capacity(hint.1.unwrap_or(hint.0)); + for relay_parent in iter { + let paras = query_para_ids(ctx, relay_parent).await?; + for para in paras { + if let Some(ccr) = query_pending_availability(ctx, relay_parent, para).await? { + live_candidates.insert(ccr); + } + } + } + Ok(live_candidates) +} + +/// Obtain all live candidates based on an iterator or relay heads including `k` ancestors. +/// +/// Relay parent. +async fn query_live_candidates( + ctx: &mut Context, + state: &mut ProtocolState, + relay_parents: impl IntoIterator, +) -> Result> +where + Context: SubsystemContext, +{ + let iter = relay_parents.into_iter(); + let hint = iter.size_hint(); + + let capacity = hint.1.unwrap_or(hint.0) * (1 + AvailabilityDistributionSubsystem::K); + let mut live_candidates = + HashMap::::with_capacity(capacity); + + for relay_parent in iter { + + // register one of relay parents (not the ancestors) + let mut ancestors = query_up_to_k_ancestors_in_same_session( + ctx, + relay_parent, + AvailabilityDistributionSubsystem::K, + ) + .await?; + + ancestors.push(relay_parent); + + + // ancestors might overlap, so check the cache too + let unknown = ancestors + .into_iter() + .filter(|relay_parent_or_ancestor| { + // use the ones which we pulled before + // but keep the unknown relay parents + state + .receipts + .get(relay_parent_or_ancestor) + .and_then(|receipts| { + // directly extend the live_candidates with the cached value + live_candidates.extend(receipts.into_iter().map( + |(receipt_hash, receipt)| { + ( + relay_parent, + (receipt_hash.clone(), receipt.clone()), + ) + }, + )); + Some(()) + }) + .is_none() + }) + .collect::>(); + + // query the ones that were not present in the receipts cache + let receipts = query_live_candidates_without_ancestors(ctx, unknown.clone()).await?; + live_candidates.extend( + unknown.into_iter().zip( + receipts + .into_iter() + .map(|receipt| (receipt.hash(), receipt)), + ), + ); + } + Ok(live_candidates) +} + +/// Query all para IDs. +async fn query_para_ids(ctx: &mut Context, relay_parent: Hash) -> Result> +where + Context: SubsystemContext, +{ + let (tx, rx) = oneshot::channel(); + ctx.send_message(AllMessages::RuntimeApi(RuntimeApiMessage::Request( + relay_parent, + RuntimeApiRequest::AvailabilityCores(tx), + ))) + .await + .map_err::(Into::into)?; + + let all_para_ids: Vec<_> = rx + .await??; + + let occupied_para_ids = all_para_ids + .into_iter() + .filter_map(|core_state| { + if let CoreState::Occupied(occupied) = core_state { + Some(occupied.para_id) + } else { + None + } + }) + .collect(); + Ok(occupied_para_ids) +} + +/// Modify the reputation of a peer based on its behavior. +async fn modify_reputation(ctx: &mut Context, peer: PeerId, rep: Rep) -> Result<()> +where + Context: SubsystemContext, +{ + trace!( + target: TARGET, + "Reputation change of {:?} for peer {:?}", + rep, + peer + ); + ctx.send_message(AllMessages::NetworkBridge( + NetworkBridgeMessage::ReportPeer(peer, rep), + )) + .await + .map_err::(Into::into) +} + +/// Query the proof of validity for a particular candidate hash. +async fn query_data_availability( + ctx: &mut Context, + candidate_hash: Hash, +) -> Result +where + Context: SubsystemContext, +{ + let (tx, rx) = oneshot::channel(); + ctx.send_message(AllMessages::AvailabilityStore( + AvailabilityStoreMessage::QueryDataAvailability(candidate_hash, tx), + )) + .await?; + rx.await.map_err::(Into::into) +} + + +async fn query_chunk( + ctx: &mut Context, + candidate_hash: Hash, + validator_index: ValidatorIndex, +) -> Result> +where + Context: SubsystemContext, +{ + let (tx, rx) = oneshot::channel(); + ctx.send_message(AllMessages::AvailabilityStore( + AvailabilityStoreMessage::QueryChunk(candidate_hash, validator_index, tx), + )) + .await?; + rx.await.map_err::(Into::into) +} + + +async fn store_chunk( + ctx: &mut Context, + candidate_hash: Hash, + validator_index: ValidatorIndex, + erasure_chunk: ErasureChunk, +) -> Result> +where + Context: SubsystemContext, +{ + let (tx, rx) = oneshot::channel(); + ctx.send_message(AllMessages::AvailabilityStore( + AvailabilityStoreMessage::StoreChunk(candidate_hash, validator_index, erasure_chunk, tx), + )).await?; + rx.await.map_err::(Into::into) +} + +/// Request the head data for a particular para. +async fn query_pending_availability( + ctx: &mut Context, + relay_parent: Hash, + para: ParaId, +) -> Result> +where + Context: SubsystemContext, +{ + let (tx, rx) = oneshot::channel(); + ctx.send_message(AllMessages::RuntimeApi(RuntimeApiMessage::Request( + relay_parent, + RuntimeApiRequest::CandidatePendingAvailability(para, tx), + ))) + .await?; + rx.await? + .map_err::(Into::into) +} + +/// Query the validator set. +async fn query_validators( + ctx: &mut Context, + relay_parent: Hash, +) -> Result> +where + Context: SubsystemContext, +{ + let (tx, rx) = oneshot::channel(); + let query_validators = AllMessages::RuntimeApi(RuntimeApiMessage::Request( + relay_parent, + RuntimeApiRequest::Validators(tx), + )); + + ctx.send_message(query_validators) + .await?; + rx.await? + .map_err::(Into::into) +} + +/// Query the hash of the `K` ancestors +async fn query_k_ancestors( + ctx: &mut Context, + relay_parent: Hash, + k: usize, +) -> Result> +where + Context: SubsystemContext, +{ + let (tx, rx) = oneshot::channel(); + let query_ancestors = AllMessages::ChainApi(ChainApiMessage::Ancestors { + hash: relay_parent, + k, + response_channel: tx, + }); + + ctx.send_message(query_ancestors) + .await?; + rx.await? + .map_err::(Into::into) +} + +/// Query the session index of a relay parent +async fn query_session_index_for_child( + ctx: &mut Context, + relay_parent: Hash, +) -> Result +where + Context: SubsystemContext, +{ + let (tx, rx) = oneshot::channel(); + let query_session_idx_for_child = AllMessages::RuntimeApi(RuntimeApiMessage::Request( + relay_parent, + RuntimeApiRequest::SessionIndexForChild(tx), + )); + + ctx.send_message(query_session_idx_for_child) + .await?; + rx.await? + .map_err::(Into::into) +} + +/// Queries up to k ancestors with the constraints of equiv session +async fn query_up_to_k_ancestors_in_same_session( + ctx: &mut Context, + relay_parent: Hash, + k: usize, +) -> Result> +where + Context: SubsystemContext, +{ + // k + 1 since we always query the child's session index + // ordering is [parent, grandparent, greatgrandparent, greatgreatgrandparent, ...] + let ancestors = query_k_ancestors(ctx, relay_parent, k + 1).await?; + let desired_session = query_session_index_for_child(ctx, relay_parent).await?; + // we would only need `ancestors.len() - 1`, but the one extra could avoid a re-alloc + // if the consumer wants to push the `relay_parent` onto it too and does not hurt otherwise + let mut acc = Vec::with_capacity(ancestors.len()); + + // iterate from youngest to oldest + let mut iter = ancestors.into_iter().peekable(); + + while let Some(ancestor) = iter.next() { + if let Some(ancestor_parent) = iter.peek() { + let session = query_session_index_for_child(ctx, *ancestor_parent).await?; + if session != desired_session { + break; + } + acc.push(ancestor); + } else { + // either ended up at genesis or the blocks were + // already pruned + break; + } + } + + debug_assert!(acc.len() <= k); + Ok(acc) +} + + +#[cfg(test)] +mod tests; diff --git a/node/network/availability-distribution/src/tests.rs b/node/network/availability-distribution/src/tests.rs new file mode 100644 index 0000000000..130c2700ca --- /dev/null +++ b/node/network/availability-distribution/src/tests.rs @@ -0,0 +1,975 @@ +use super::*; +use assert_matches::assert_matches; +use polkadot_erasure_coding::{branches, obtain_chunks_v1 as obtain_chunks}; +use polkadot_primitives::v1::{ + AvailableData, BlockData, CandidateCommitments, CandidateDescriptor, GlobalValidationData, + GroupIndex, GroupRotationInfo, HeadData, LocalValidationData, OccupiedCore, + OmittedValidationData, PoV, ScheduledCore, ValidatorPair, +}; +use polkadot_subsystem_testhelpers as test_helpers; + +use futures::{executor, future, Future}; +use futures_timer::Delay; +use smallvec::smallvec; +use smol_timeout::TimeoutExt; +use std::time::Duration; + +macro_rules! view { + ( $( $hash:expr ),* $(,)? ) => [ + View(vec![ $( $hash.clone() ),* ]) + ]; + } + +macro_rules! delay { + ($delay:expr) => { + Delay::new(Duration::from_millis($delay)).await; + }; +} + +struct TestHarness { + virtual_overseer: test_helpers::TestSubsystemContextHandle, +} + +fn test_harness>( + keystore: KeyStorePtr, + test: impl FnOnce(TestHarness) -> T, +) { + let _ = env_logger::builder() + .is_test(true) + .filter( + Some("polkadot_availability_distribution"), + log::LevelFilter::Trace, + ) + .try_init(); + + let pool = sp_core::testing::TaskExecutor::new(); + + let (context, virtual_overseer) = test_helpers::make_subsystem_context(pool.clone()); + + let subsystem = AvailabilityDistributionSubsystem::new(keystore); + let subsystem = subsystem.run(context); + + let test_fut = test(TestHarness { virtual_overseer }); + + futures::pin_mut!(test_fut); + futures::pin_mut!(subsystem); + + executor::block_on(future::select(test_fut, subsystem)); +} + +const TIMEOUT: Duration = Duration::from_millis(100); + +async fn overseer_signal( + overseer: &mut test_helpers::TestSubsystemContextHandle, + signal: OverseerSignal, +) { + delay!(50); + overseer + .send(FromOverseer::Signal(signal)) + .timeout(TIMEOUT) + .await + .expect("10ms is more than enough for sending signals."); +} + +async fn overseer_send( + overseer: &mut test_helpers::TestSubsystemContextHandle, + msg: AvailabilityDistributionMessage, +) { + log::trace!("Sending message:\n{:?}", &msg); + overseer + .send(FromOverseer::Communication { msg }) + .timeout(TIMEOUT) + .await + .expect("10ms is more than enough for sending messages."); +} + +async fn overseer_recv( + overseer: &mut test_helpers::TestSubsystemContextHandle, +) -> AllMessages { + log::trace!("Waiting for message ..."); + let msg = overseer + .recv() + .timeout(TIMEOUT) + .await + .expect("TIMEOUT is enough to recv."); + log::trace!("Received message:\n{:?}", &msg); + msg +} + +fn dummy_occupied_core(para: ParaId) -> CoreState { + CoreState::Occupied(OccupiedCore { + para_id: para, + next_up_on_available: None, + occupied_since: 0, + time_out_at: 5, + next_up_on_time_out: None, + availability: Default::default(), + group_responsible: GroupIndex::from(0), + }) +} + +use sp_keyring::Sr25519Keyring; + +#[derive(Clone)] +struct TestState { + chain_ids: Vec, + validators: Vec, + validator_public: Vec, + validator_index: Option, + validator_groups: (Vec>, GroupRotationInfo), + head_data: HashMap, + keystore: KeyStorePtr, + relay_parent: Hash, + ancestors: Vec, + availability_cores: Vec, + global_validation_data: GlobalValidationData, + local_validation_data: LocalValidationData, +} + +fn validator_pubkeys(val_ids: &[Sr25519Keyring]) -> Vec { + val_ids.iter().map(|v| v.public().into()).collect() +} + +impl Default for TestState { + fn default() -> Self { + let chain_a = ParaId::from(1); + let chain_b = ParaId::from(2); + + let chain_ids = vec![chain_a, chain_b]; + + let validators = vec![ + Sr25519Keyring::Ferdie, // <- this node, role: validator + Sr25519Keyring::Alice, + Sr25519Keyring::Bob, + Sr25519Keyring::Charlie, + Sr25519Keyring::Dave, + ]; + + let keystore = keystore::Store::new_in_memory(); + + keystore + .write() + .insert_ephemeral_from_seed::(&validators[0].to_seed()) + .expect("Insert key into keystore"); + + let validator_public = validator_pubkeys(&validators); + + let validator_groups = vec![vec![2, 0, 4], vec![1], vec![3]]; + let group_rotation_info = GroupRotationInfo { + session_start_block: 0, + group_rotation_frequency: 100, + now: 1, + }; + let validator_groups = (validator_groups, group_rotation_info); + + let availability_cores = vec![ + CoreState::Scheduled(ScheduledCore { + para_id: chain_ids[0], + collator: None, + }), + CoreState::Scheduled(ScheduledCore { + para_id: chain_ids[1], + collator: None, + }), + ]; + + let mut head_data = HashMap::new(); + head_data.insert(chain_a, HeadData(vec![4, 5, 6])); + head_data.insert(chain_b, HeadData(vec![7, 8, 9])); + + let ancestors = vec![ + Hash::repeat_byte(0x44), + Hash::repeat_byte(0x33), + Hash::repeat_byte(0x22), + ]; + let relay_parent = Hash::repeat_byte(0x05); + + let local_validation_data = LocalValidationData { + parent_head: HeadData(vec![7, 8, 9]), + balance: Default::default(), + code_upgrade_allowed: None, + validation_code_hash: Default::default(), + }; + + let global_validation_data = GlobalValidationData { + max_code_size: 1000, + max_head_data_size: 1000, + block_number: Default::default(), + }; + + let validator_index = Some((validators.len() - 1) as ValidatorIndex); + + Self { + chain_ids, + keystore, + validators, + validator_public, + validator_groups, + availability_cores, + head_data, + local_validation_data, + global_validation_data, + relay_parent, + ancestors, + validator_index, + } + } +} + +fn make_available_data(test: &TestState, pov: PoV) -> AvailableData { + let omitted_validation = OmittedValidationData { + global_validation: test.global_validation_data.clone(), + local_validation: test.local_validation_data.clone(), + }; + + AvailableData { + omitted_validation, + pov, + } +} + +fn make_erasure_root(test: &TestState, pov: PoV) -> Hash { + let available_data = make_available_data(test, pov); + + let chunks = obtain_chunks(test.validators.len(), &available_data).unwrap(); + branches(&chunks).root() +} + +fn make_valid_availability_gossip( + test: &TestState, + candidate_hash: Hash, + erasure_chunk_index: u32, + pov: PoV, +) -> AvailabilityGossipMessage { + let available_data = make_available_data(test, pov); + + let erasure_chunks = derive_erasure_chunks_with_proofs(test.validators.len(), &available_data); + + let erasure_chunk: ErasureChunk = erasure_chunks + .get(erasure_chunk_index as usize) + .expect("Must be valid or input is oob") + .clone(); + + AvailabilityGossipMessage { + candidate_hash, + erasure_chunk, + } +} + +#[derive(Default)] +struct TestCandidateBuilder { + para_id: ParaId, + head_data: HeadData, + pov_hash: Hash, + relay_parent: Hash, + erasure_root: Hash, +} + +impl TestCandidateBuilder { + fn build(self) -> CommittedCandidateReceipt { + CommittedCandidateReceipt { + descriptor: CandidateDescriptor { + para_id: self.para_id, + pov_hash: self.pov_hash, + relay_parent: self.relay_parent, + ..Default::default() + }, + commitments: CandidateCommitments { + head_data: self.head_data, + erasure_root: self.erasure_root, + ..Default::default() + }, + } + } +} + +#[test] +fn helper_integrity() { + let test_state = TestState::default(); + + let pov_block = PoV { + block_data: BlockData(vec![42, 43, 44]), + }; + + let pov_hash = pov_block.hash(); + + let candidate = TestCandidateBuilder { + para_id: test_state.chain_ids[0], + relay_parent: test_state.relay_parent, + pov_hash: pov_hash, + erasure_root: make_erasure_root(&test_state, pov_block.clone()), + ..Default::default() + } + .build(); + + let message = + make_valid_availability_gossip(&test_state, dbg!(candidate.hash()), 2, pov_block.clone()); + + let root = dbg!(&candidate.commitments.erasure_root); + + let anticipated_hash = branch_hash( + root, + &message.erasure_chunk.proof, + dbg!(message.erasure_chunk.index as usize), + ) + .expect("Must be able to derive branch hash"); + assert_eq!( + anticipated_hash, + BlakeTwo256::hash(&message.erasure_chunk.chunk) + ); +} + +fn derive_erasure_chunks_with_proofs( + n_validators: usize, + available_data: &AvailableData, +) -> Vec { + let chunks: Vec> = obtain_chunks(n_validators, available_data).unwrap(); + + // create proofs for each erasure chunk + let branches = branches(chunks.as_ref()); + + let erasure_chunks = branches + .enumerate() + .map(|(index, (proof, chunk))| ErasureChunk { + chunk: chunk.to_vec(), + index: index as _, + proof, + }) + .collect::>(); + + erasure_chunks +} + +#[test] +fn reputation_verification() { + let test_state = TestState::default(); + + test_harness(test_state.keystore.clone(), |test_harness| async move { + let TestHarness { + mut virtual_overseer, + } = test_harness; + + let expected_head_data = test_state.head_data.get(&test_state.chain_ids[0]).unwrap(); + + let pov_block_a = PoV { + block_data: BlockData(vec![42, 43, 44]), + }; + + let pov_block_b = PoV { + block_data: BlockData(vec![45, 46, 47]), + }; + + let pov_block_c = PoV { + block_data: BlockData(vec![48, 49, 50]), + }; + + let pov_hash_a = pov_block_a.hash(); + let pov_hash_b = pov_block_b.hash(); + let pov_hash_c = pov_block_c.hash(); + + let candidates = vec![ + TestCandidateBuilder { + para_id: test_state.chain_ids[0], + relay_parent: test_state.relay_parent, + pov_hash: pov_hash_a, + erasure_root: make_erasure_root(&test_state, pov_block_a.clone()), + ..Default::default() + } + .build(), + TestCandidateBuilder { + para_id: test_state.chain_ids[0], + relay_parent: test_state.relay_parent, + pov_hash: pov_hash_b, + erasure_root: make_erasure_root(&test_state, pov_block_b.clone()), + head_data: expected_head_data.clone(), + ..Default::default() + } + .build(), + TestCandidateBuilder { + para_id: test_state.chain_ids[1], + relay_parent: Hash::repeat_byte(0xFA), + pov_hash: pov_hash_c, + erasure_root: make_erasure_root(&test_state, pov_block_c.clone()), + head_data: test_state + .head_data + .get(&test_state.chain_ids[1]) + .unwrap() + .clone(), + ..Default::default() + } + .build(), + ]; + + let TestState { + chain_ids, + keystore: _, + validators: _, + validator_public, + validator_groups, + availability_cores, + head_data: _, + local_validation_data: _, + global_validation_data: _, + relay_parent: current, + ancestors, + validator_index: _, + } = test_state.clone(); + + let _ = validator_groups; + let _ = availability_cores; + + let peer_a = PeerId::random(); + let peer_b = PeerId::random(); + assert_ne!(&peer_a, &peer_b); + + log::trace!("peer A: {:?}", peer_a); + log::trace!("peer B: {:?}", peer_b); + + log::trace!("candidate A: {:?}", candidates[0].hash()); + log::trace!("candidate B: {:?}", candidates[1].hash()); + + overseer_signal( + &mut virtual_overseer, + OverseerSignal::ActiveLeaves(ActiveLeavesUpdate { + activated: smallvec![current.clone()], + deactivated: smallvec![], + }), + ) + .await; + + // ignore event producer registration + let _ = overseer_recv(&mut virtual_overseer).await; + + overseer_send( + &mut virtual_overseer, + AvailabilityDistributionMessage::NetworkBridgeUpdate( + NetworkBridgeEvent::OurViewChange(view![current,]), + ), + ) + .await; + + // obtain the validators per relay parent + assert_matches!( + overseer_recv(&mut virtual_overseer).await, + AllMessages::RuntimeApi(RuntimeApiMessage::Request( + relay_parent, + RuntimeApiRequest::Validators(tx), + )) => { + assert_eq!(relay_parent, current); + tx.send(Ok(validator_public.clone())).unwrap(); + } + ); + + let genesis = Hash::repeat_byte(0xAA); + // query of k ancestors, we only provide one + assert_matches!( + overseer_recv(&mut virtual_overseer).await, + AllMessages::ChainApi(ChainApiMessage::Ancestors { + hash: relay_parent, + k, + response_channel: tx, + }) => { + assert_eq!(relay_parent, current); + assert_eq!(k, AvailabilityDistributionSubsystem::K + 1); + // 0xAA..AA will not be included, since there is no mean to determine + // its session index + tx.send(Ok(vec![ancestors[0].clone(), genesis])).unwrap(); + } + ); + + // state query for each of them + assert_matches!( + overseer_recv(&mut virtual_overseer).await, + AllMessages::RuntimeApi(RuntimeApiMessage::Request( + relay_parent, + RuntimeApiRequest::SessionIndexForChild(tx) + )) => { + assert_eq!(relay_parent, current); + tx.send(Ok(1 as SessionIndex)).unwrap(); + } + ); + + assert_matches!( + overseer_recv(&mut virtual_overseer).await, + AllMessages::RuntimeApi(RuntimeApiMessage::Request( + relay_parent, + RuntimeApiRequest::SessionIndexForChild(tx) + )) => { + assert_eq!(relay_parent, genesis); + tx.send(Ok(1 as SessionIndex)).unwrap(); + } + ); + + // subsystem peer id collection + // which will query the availability cores + assert_matches!( + overseer_recv(&mut virtual_overseer).await, + AllMessages::RuntimeApi(RuntimeApiMessage::Request( + relay_parent, + RuntimeApiRequest::AvailabilityCores(tx) + )) => { + assert_eq!(relay_parent, ancestors[0]); + // respond with a set of availability core states + tx.send(Ok(vec![ + dummy_occupied_core(chain_ids[0]), + dummy_occupied_core(chain_ids[1]) + ])).unwrap(); + } + ); + + // now each of the relay parents in the view (1) will + assert_matches!( + overseer_recv(&mut virtual_overseer).await, + AllMessages::RuntimeApi(RuntimeApiMessage::Request( + relay_parent, + RuntimeApiRequest::CandidatePendingAvailability(para, tx) + )) => { + assert_eq!(relay_parent, ancestors[0]); + assert_eq!(para, chain_ids[0]); + tx.send(Ok(Some( + candidates[0].clone() + ))).unwrap(); + } + ); + + assert_matches!( + overseer_recv(&mut virtual_overseer).await, + AllMessages::RuntimeApi(RuntimeApiMessage::Request( + relay_parent, + RuntimeApiRequest::CandidatePendingAvailability(para, tx) + )) => { + assert_eq!(relay_parent, ancestors[0]); + assert_eq!(para, chain_ids[1]); + tx.send(Ok(Some( + candidates[1].clone() + ))).unwrap(); + } + ); + + for _ in 0usize..1 { + assert_matches!( + overseer_recv(&mut virtual_overseer).await, + AllMessages::RuntimeApi(RuntimeApiMessage::Request( + _relay_parent, + RuntimeApiRequest::AvailabilityCores(tx), + )) => { + tx.send(Ok(vec![ + CoreState::Occupied(OccupiedCore { + para_id: chain_ids[0].clone(), + next_up_on_available: None, + occupied_since: 0, + time_out_at: 10, + next_up_on_time_out: None, + availability: Default::default(), + group_responsible: GroupIndex::from(0), + }), + CoreState::Free, + CoreState::Free, + CoreState::Occupied(OccupiedCore { + para_id: chain_ids[1].clone(), + next_up_on_available: None, + occupied_since: 1, + time_out_at: 7, + next_up_on_time_out: None, + availability: Default::default(), + group_responsible: GroupIndex::from(0), + }), + CoreState::Free, + CoreState::Free, + ])).unwrap(); + } + ); + + // query the availability cores for each of the paras (2) + assert_matches!( + overseer_recv(&mut virtual_overseer).await, + AllMessages::RuntimeApi( + RuntimeApiMessage::Request( + _relay_parent, + RuntimeApiRequest::CandidatePendingAvailability(para, tx), + ) + ) => { + assert_eq!(para, chain_ids[0]); + tx.send(Ok(Some( + candidates[0].clone() + ))).unwrap(); + } + ); + + assert_matches!( + overseer_recv(&mut virtual_overseer).await, + AllMessages::RuntimeApi(RuntimeApiMessage::Request( + _relay_parent, + RuntimeApiRequest::CandidatePendingAvailability(para, tx), + )) => { + assert_eq!(para, chain_ids[1]); + tx.send(Ok(Some( + candidates[1].clone() + ))).unwrap(); + } + ); + } + + let mut candidates2 = candidates.clone(); + // check if the availability store can provide the desired erasure chunks + for i in 0usize..2 { + log::trace!("0000"); + let avail_data = make_available_data(&test_state, pov_block_a.clone()); + let chunks = + derive_erasure_chunks_with_proofs(test_state.validators.len(), &avail_data); + + let expected; + // store the chunk to the av store + assert_matches!( + overseer_recv(&mut virtual_overseer).await, + AllMessages::AvailabilityStore( + AvailabilityStoreMessage::QueryDataAvailability( + candidate_hash, + tx, + ) + ) => { + let index = candidates2.iter().enumerate().find(|x| { x.1.hash() == candidate_hash }).map(|x| x.0).unwrap(); + expected = dbg!(candidates2.swap_remove(index).hash()); + tx.send( + i == 0 + ).unwrap(); + } + ); + + assert_eq!(chunks.len(), test_state.validators.len()); + + log::trace!("xxxx"); + // retrieve a stored chunk + for (j, chunk) in chunks.into_iter().enumerate() { + log::trace!("yyyy i={}, j={}", i, j); + if i != 0 { + // not a validator, so this never happens + break; + } + assert_matches!( + overseer_recv(&mut virtual_overseer).await, + AllMessages::AvailabilityStore( + AvailabilityStoreMessage::QueryChunk( + candidate_hash, + idx, + tx, + ) + ) => { + assert_eq!(candidate_hash, expected); + assert_eq!(j as u32, chunk.index); + assert_eq!(idx, j as u32); + tx.send( + Some(chunk.clone()) + ).unwrap(); + } + ); + } + } + // setup peer a with interest in current + overseer_send( + &mut virtual_overseer, + AvailabilityDistributionMessage::NetworkBridgeUpdate( + NetworkBridgeEvent::PeerConnected(peer_a.clone(), ObservedRole::Full), + ), + ) + .await; + + overseer_send( + &mut virtual_overseer, + AvailabilityDistributionMessage::NetworkBridgeUpdate( + NetworkBridgeEvent::PeerViewChange(peer_a.clone(), view![current]), + ), + ) + .await; + + // setup peer b with interest in ancestor + overseer_send( + &mut virtual_overseer, + AvailabilityDistributionMessage::NetworkBridgeUpdate( + NetworkBridgeEvent::PeerConnected(peer_b.clone(), ObservedRole::Full), + ), + ) + .await; + + overseer_send( + &mut virtual_overseer, + AvailabilityDistributionMessage::NetworkBridgeUpdate( + NetworkBridgeEvent::PeerViewChange(peer_b.clone(), view![ancestors[0]]), + ), + ) + .await; + + delay!(100); + + ///////////////////////////////////////////////////////// + // ready for action + + // check if garbage messages are detected and peer rep is changed as expected + let garbage = b"I am garbage"; + + overseer_send( + &mut virtual_overseer, + AvailabilityDistributionMessage::NetworkBridgeUpdate(NetworkBridgeEvent::PeerMessage( + peer_b.clone(), + // AvailabilityDistributionSubsystem::PROTOCOL_ID, + garbage.to_vec(), + )), + ) + .await; + + assert_matches!( + overseer_recv(&mut virtual_overseer).await, + AllMessages::NetworkBridge( + NetworkBridgeMessage::ReportPeer( + peer, + rep + ) + ) => { + assert_eq!(peer, peer_b); + assert_eq!(rep, COST_MESSAGE_NOT_DECODABLE); + } + ); + + let valid: AvailabilityGossipMessage = make_valid_availability_gossip( + &test_state, + candidates[0].hash(), + 2, + pov_block_a.clone(), + ); + + { + // valid (first, from b) + overseer_send( + &mut virtual_overseer, + AvailabilityDistributionMessage::NetworkBridgeUpdate( + NetworkBridgeEvent::PeerMessage(peer_b.clone(), valid.encode()), + ), + ) + .await; + + assert_matches!( + overseer_recv(&mut virtual_overseer).await, + AllMessages::NetworkBridge( + NetworkBridgeMessage::ReportPeer( + peer, + rep + ) + ) => { + assert_eq!(peer, peer_b); + assert_eq!(rep, BENEFIT_VALID_MESSAGE_FIRST); + } + ); + } + + { + // valid (duplicate, from b) + overseer_send( + &mut virtual_overseer, + AvailabilityDistributionMessage::NetworkBridgeUpdate( + NetworkBridgeEvent::PeerMessage(peer_b.clone(), valid.encode()), + ), + ) + .await; + + assert_matches!( + overseer_recv(&mut virtual_overseer).await, + AllMessages::NetworkBridge( + NetworkBridgeMessage::ReportPeer( + peer, + rep + ) + ) => { + assert_eq!(peer, peer_b); + assert_eq!(rep, COST_PEER_DUPLICATE_MESSAGE); + } + ); + } + + { + // valid (second, from a) + overseer_send( + &mut virtual_overseer, + AvailabilityDistributionMessage::NetworkBridgeUpdate( + NetworkBridgeEvent::PeerMessage(peer_a.clone(), valid.encode()), + ), + ) + .await; + + assert_matches!( + overseer_recv(&mut virtual_overseer).await, + AllMessages::NetworkBridge( + NetworkBridgeMessage::ReportPeer( + peer, + rep + ) + ) => { + assert_eq!(peer, peer_a); + assert_eq!(rep, BENEFIT_VALID_MESSAGE); + } + ); + } + + // peer a is not interested in anything anymore + overseer_send( + &mut virtual_overseer, + AvailabilityDistributionMessage::NetworkBridgeUpdate( + NetworkBridgeEvent::PeerViewChange(peer_a.clone(), view![]), + ), + ) + .await; + + { + // send the a message again, so we should detect the duplicate + overseer_send( + &mut virtual_overseer, + AvailabilityDistributionMessage::NetworkBridgeUpdate( + NetworkBridgeEvent::PeerMessage(peer_a.clone(), valid.encode()), + ), + ) + .await; + + assert_matches!( + overseer_recv(&mut virtual_overseer).await, + AllMessages::NetworkBridge( + NetworkBridgeMessage::ReportPeer( + peer, + rep + ) + ) => { + assert_eq!(peer, peer_a); + assert_eq!(rep, COST_PEER_DUPLICATE_MESSAGE); + } + ); + } + + // peer b sends a message before we have the view + // setup peer a with interest in parent x + overseer_send( + &mut virtual_overseer, + AvailabilityDistributionMessage::NetworkBridgeUpdate( + NetworkBridgeEvent::PeerDisconnected(peer_b.clone()), + ), + ) + .await; + + delay!(10); + + overseer_send( + &mut virtual_overseer, + AvailabilityDistributionMessage::NetworkBridgeUpdate( + NetworkBridgeEvent::PeerConnected(peer_b.clone(), ObservedRole::Full), + ), + ) + .await; + + { + // send another message + let valid2: AvailabilityGossipMessage = make_valid_availability_gossip( + &test_state, + candidates[2].hash(), + 1, + pov_block_c.clone(), + ); + + // send the a message before we send a view update + overseer_send( + &mut virtual_overseer, + AvailabilityDistributionMessage::NetworkBridgeUpdate( + NetworkBridgeEvent::PeerMessage(peer_a.clone(), valid2.encode()), + ), + ) + .await; + + assert_matches!( + overseer_recv(&mut virtual_overseer).await, + AllMessages::NetworkBridge( + NetworkBridgeMessage::ReportPeer( + peer, + rep + ) + ) => { + assert_eq!(peer, peer_a); + assert_eq!(rep, COST_NOT_A_LIVE_CANDIDATE); + } + ); + } + }); +} + +#[test] +fn k_ancestors_in_session() { + let pool = sp_core::testing::TaskExecutor::new(); + let (mut ctx, mut virtual_overseer) = + test_helpers::make_subsystem_context::(pool); + + const DATA: &[(Hash, SessionIndex)] = &[ + (Hash::repeat_byte(0x32), 3), // relay parent + (Hash::repeat_byte(0x31), 3), // grand parent + (Hash::repeat_byte(0x30), 3), // great ... + (Hash::repeat_byte(0x20), 2), + (Hash::repeat_byte(0x12), 1), + (Hash::repeat_byte(0x11), 1), + (Hash::repeat_byte(0x10), 1), + ]; + const K: usize = 5; + + const EXPECTED: &[Hash] = &[DATA[1].0, DATA[2].0]; + + let test_fut = async move { + assert_matches!( + overseer_recv(&mut virtual_overseer).await, + AllMessages::ChainApi(ChainApiMessage::Ancestors { + hash: relay_parent, + k, + response_channel: tx, + }) => { + assert_eq!(k, K+1); + assert_eq!(relay_parent, DATA[0].0); + tx.send(Ok(DATA[1..=k].into_iter().map(|x| x.0).collect::>())).unwrap(); + } + ); + + // query the desired session index of the relay parent + assert_matches!( + overseer_recv(&mut virtual_overseer).await, + AllMessages::RuntimeApi(RuntimeApiMessage::Request( + relay_parent, + RuntimeApiRequest::SessionIndexForChild(tx), + )) => { + assert_eq!(relay_parent, DATA[0].0); + let session: SessionIndex = DATA[0].1; + tx.send(Ok(session)).unwrap(); + } + ); + + // query ancestors + for i in 2usize..=(EXPECTED.len() + 1 + 1) { + assert_matches!( + overseer_recv(&mut virtual_overseer).await, + AllMessages::RuntimeApi(RuntimeApiMessage::Request( + relay_parent, + RuntimeApiRequest::SessionIndexForChild(tx), + )) => { + // query is for ancestor_parent + let x = &DATA[i]; + assert_eq!(relay_parent, x.0); + // but needs to yield ancestor_parent's child's session index + let x = &DATA[i-1]; + tx.send(Ok(x.1)).unwrap(); + } + ); + } + }; + + let sut = async move { + let ancestors = query_up_to_k_ancestors_in_same_session(&mut ctx, DATA[0].0, K) + .await + .unwrap(); + assert_eq!(ancestors, EXPECTED.to_vec()); + }; + + futures::pin_mut!(test_fut); + futures::pin_mut!(sut); + + executor::block_on(future::join(test_fut, sut).timeout(Duration::from_millis(1000))); +} diff --git a/node/network/bitfield-distribution/Cargo.toml b/node/network/bitfield-distribution/Cargo.toml index bf7d23a900..0ae5ad5a3d 100644 --- a/node/network/bitfield-distribution/Cargo.toml +++ b/node/network/bitfield-distribution/Cargo.toml @@ -21,9 +21,9 @@ sc-network = { git = "https://github.com/paritytech/substrate", branch = "master polkadot-node-subsystem-test-helpers = { path = "../../subsystem-test-helpers" } bitvec = { version = "0.17.4", default-features = false, features = ["alloc"] } sp-core = { git = "https://github.com/paritytech/substrate", branch = "master" } -parking_lot = "0.10.0" +parking_lot = "0.11.0" maplit = "1.0.2" -smol = "0.2.0" +smol = "0.3.3" smol-timeout = "0.1.0" env_logger = "0.7.1" assert_matches = "1.3.0" diff --git a/node/network/bitfield-distribution/src/lib.rs b/node/network/bitfield-distribution/src/lib.rs index d67b5e353f..939b6616df 100644 --- a/node/network/bitfield-distribution/src/lib.rs +++ b/node/network/bitfield-distribution/src/lib.rs @@ -46,9 +46,9 @@ const COST_MESSAGE_NOT_DECODABLE: ReputationChange = ReputationChange::new(-100, "Not interested in that parent hash"); const COST_PEER_DUPLICATE_MESSAGE: ReputationChange = ReputationChange::new(-500, "Peer sent the same message multiple times"); -const GAIN_VALID_MESSAGE_FIRST: ReputationChange = +const BENEFIT_VALID_MESSAGE_FIRST: ReputationChange = ReputationChange::new(15, "Valid message with new information"); -const GAIN_VALID_MESSAGE: ReputationChange = +const BENEFIT_VALID_MESSAGE: ReputationChange = ReputationChange::new(10, "Valid message"); /// Checked signed availability bitfield that is distributed @@ -396,14 +396,14 @@ where "Already received a message for validator at index {}", validator_index ); - modify_reputation(ctx, origin, GAIN_VALID_MESSAGE).await?; + modify_reputation(ctx, origin, BENEFIT_VALID_MESSAGE).await?; return Ok(()); } one_per_validator.insert(validator.clone(), message.clone()); relay_message(ctx, job_data, &mut state.peer_views, validator, message).await?; - modify_reputation(ctx, origin, GAIN_VALID_MESSAGE_FIRST).await + modify_reputation(ctx, origin, BENEFIT_VALID_MESSAGE_FIRST).await } else { modify_reputation(ctx, origin, COST_SIGNATURE_INVALID).await } @@ -479,14 +479,14 @@ where { let current = state.peer_views.entry(origin.clone()).or_default(); - let delta_vec: Vec = (*current).difference(&view).cloned().collect(); + let added: Vec = view.difference(&*current).cloned().collect(); *current = view; // Send all messages we've seen before and the peer is now interested // in to that peer. - let delta_set: Vec<(ValidatorId, BitfieldGossipMessage)> = delta_vec + let delta_set: Vec<(ValidatorId, BitfieldGossipMessage)> = added .into_iter() .filter_map(|new_relay_parent_interest| { if let Some(job_data) = (&*state).per_relay_parent.get(&new_relay_parent_interest) { @@ -558,7 +558,7 @@ where { fn start(self, ctx: C) -> SpawnedSubsystem { SpawnedSubsystem { - name: "bitfield-distribution", + name: "bitfield-distribution-subsystem", future: Box::pin(async move { Self::run(ctx) }.map(|_| ())), } } @@ -870,7 +870,7 @@ mod test { NetworkBridgeMessage::ReportPeer(peer, rep) ) => { assert_eq!(peer, peer_b); - assert_eq!(rep, GAIN_VALID_MESSAGE_FIRST) + assert_eq!(rep, BENEFIT_VALID_MESSAGE_FIRST) } ); @@ -887,7 +887,7 @@ mod test { NetworkBridgeMessage::ReportPeer(peer, rep) ) => { assert_eq!(peer, peer_a); - assert_eq!(rep, GAIN_VALID_MESSAGE) + assert_eq!(rep, BENEFIT_VALID_MESSAGE) } ); @@ -993,7 +993,7 @@ mod test { NetworkBridgeMessage::ReportPeer(peer, rep) ) => { assert_eq!(peer, peer_b); - assert_eq!(rep, GAIN_VALID_MESSAGE_FIRST) + assert_eq!(rep, BENEFIT_VALID_MESSAGE_FIRST) } ); diff --git a/node/subsystem-test-helpers/src/lib.rs b/node/subsystem-test-helpers/src/lib.rs index a4070c028c..4d9b70d4f8 100644 --- a/node/subsystem-test-helpers/src/lib.rs +++ b/node/subsystem-test-helpers/src/lib.rs @@ -229,4 +229,4 @@ pub fn make_subsystem_context(spawn: S) rx: all_messages_rx }, ) -} +} \ No newline at end of file diff --git a/node/subsystem/src/lib.rs b/node/subsystem/src/lib.rs index 3f72e2f269..91d485739b 100644 --- a/node/subsystem/src/lib.rs +++ b/node/subsystem/src/lib.rs @@ -220,4 +220,4 @@ impl Subsystem for DummySubsystem { future, } } -} +} \ No newline at end of file diff --git a/node/subsystem/src/messages.rs b/node/subsystem/src/messages.rs index acc41a2e7f..ae1d429d75 100644 --- a/node/subsystem/src/messages.rs +++ b/node/subsystem/src/messages.rs @@ -188,12 +188,6 @@ impl NetworkBridgeMessage { /// Availability Distribution Message. #[derive(Debug)] pub enum AvailabilityDistributionMessage { - /// Distribute an availability chunk to other validators. - DistributeChunk(Hash, ErasureChunk), - - /// Fetch an erasure chunk from networking by candidate hash and chunk index. - FetchChunk(Hash, u32), - /// Event from the network bridge. NetworkBridgeUpdate(NetworkBridgeEvent), } @@ -202,8 +196,6 @@ impl AvailabilityDistributionMessage { /// If the current variant contains the relay parent hash, return it. pub fn relay_parent(&self) -> Option { match self { - Self::DistributeChunk(hash, _) => Some(*hash), - Self::FetchChunk(hash, _) => Some(*hash), Self::NetworkBridgeUpdate(_) => None, } } @@ -255,7 +247,7 @@ pub enum AvailabilityStoreMessage { /// megabytes of data to get a single bit of information. QueryDataAvailability(Hash, oneshot::Sender), - /// Query an `ErasureChunk` from the AV store. + /// Query an `ErasureChunk` from the AV store by the candidate hash and validator index. QueryChunk(Hash, ValidatorIndex, oneshot::Sender>), /// Query whether an `ErasureChunk` exists within the AV Store. @@ -513,6 +505,6 @@ pub enum AllMessages { AvailabilityStore(AvailabilityStoreMessage), /// Message for the network bridge subsystem. NetworkBridge(NetworkBridgeMessage), - /// Message for the Chain API subsystem + /// Message for the Chain API subsystem. ChainApi(ChainApiMessage), } diff --git a/parachain/src/primitives.rs b/parachain/src/primitives.rs index 65d890e26d..955842e30f 100644 --- a/parachain/src/primitives.rs +++ b/parachain/src/primitives.rs @@ -33,7 +33,7 @@ pub use polkadot_core_primitives::BlockNumber as RelayChainBlockNumber; /// Parachain head data included in the chain. #[derive(PartialEq, Eq, Clone, PartialOrd, Ord, Encode, Decode, RuntimeDebug)] -#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Default))] +#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Default, Hash))] pub struct HeadData(#[cfg_attr(feature = "std", serde(with="bytes"))] pub Vec); impl From> for HeadData { @@ -44,7 +44,7 @@ impl From> for HeadData { /// Parachain validation code. #[derive(Default, PartialEq, Eq, Clone, Encode, Decode, RuntimeDebug)] -#[cfg_attr(feature = "std", derive(Serialize, Deserialize))] +#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Hash))] pub struct ValidationCode(#[cfg_attr(feature = "std", serde(with="bytes"))] pub Vec); impl From> for ValidationCode { @@ -186,7 +186,7 @@ impl AccountIdConversion for Id { /// Which origin a parachain's message to the relay chain should be dispatched from. #[derive(Clone, PartialEq, Eq, Encode, Decode)] -#[cfg_attr(feature = "std", derive(Debug))] +#[cfg_attr(feature = "std", derive(Debug, Hash))] #[repr(u8)] pub enum ParachainDispatchOrigin { /// As a simple `Origin::Signed`, using `ParaId::account_id` as its value. This is good when @@ -215,7 +215,7 @@ impl sp_std::convert::TryFrom for ParachainDispatchOrigin { /// A message from a parachain to its Relay Chain. #[derive(Clone, PartialEq, Eq, Encode, Decode)] -#[cfg_attr(feature = "std", derive(Debug))] +#[cfg_attr(feature = "std", derive(Debug, Hash))] pub struct UpwardMessage { /// The origin for the message to be sent from. pub origin: ParachainDispatchOrigin, diff --git a/primitives/src/v0.rs b/primitives/src/v0.rs index 11d62a4c2e..9f014c80c2 100644 --- a/primitives/src/v0.rs +++ b/primitives/src/v0.rs @@ -612,7 +612,7 @@ pub struct AvailableData { /// A chunk of erasure-encoded block data. #[derive(PartialEq, Eq, Clone, Encode, Decode, Default)] -#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] +#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug, Hash))] pub struct ErasureChunk { /// The erasure-encoded chunk of data belonging to the candidate block. pub chunk: Vec, @@ -624,8 +624,8 @@ pub struct ErasureChunk { /// Statements that can be made about parachain candidates. These are the /// actual values that are signed. -#[derive(Clone, PartialEq, Eq, Encode, Decode, Hash)] -#[cfg_attr(feature = "std", derive(Debug))] +#[derive(Clone, PartialEq, Eq, Encode, Decode)] +#[cfg_attr(feature = "std", derive(Debug, Hash))] pub enum CompactStatement { /// Proposal of a parachain candidate. #[codec(index = "1")] diff --git a/primitives/src/v1.rs b/primitives/src/v1.rs index 781f6f7711..f79a6cb4c0 100644 --- a/primitives/src/v1.rs +++ b/primitives/src/v1.rs @@ -25,7 +25,7 @@ use runtime_primitives::traits::AppVerify; use inherents::InherentIdentifier; use sp_arithmetic::traits::{BaseArithmetic, Saturating, Zero}; -use runtime_primitives::traits::{BlakeTwo256, Hash as HashT}; +pub use runtime_primitives::traits::{BlakeTwo256, Hash as HashT}; // Export some core primitives. pub use polkadot_core_primitives::v1::{ @@ -106,7 +106,7 @@ pub fn validation_data_hash( /// A unique descriptor of the candidate receipt. #[derive(PartialEq, Eq, Clone, Encode, Decode)] -#[cfg_attr(feature = "std", derive(Debug, Default))] +#[cfg_attr(feature = "std", derive(Debug, Default, Hash))] pub struct CandidateDescriptor { /// The ID of the para this is a candidate for. pub para_id: Id, @@ -176,7 +176,7 @@ pub struct FullCandidateReceipt { /// A candidate-receipt with commitments directly included. #[derive(PartialEq, Eq, Clone, Encode, Decode)] -#[cfg_attr(feature = "std", derive(Debug, Default))] +#[cfg_attr(feature = "std", derive(Debug, Default, Hash))] pub struct CommittedCandidateReceipt { /// The descriptor of the candidate. pub descriptor: CandidateDescriptor, @@ -266,7 +266,7 @@ pub struct GlobalValidationData { /// Commitments made in a `CandidateReceipt`. Many of these are outputs of validation. #[derive(PartialEq, Eq, Clone, Encode, Decode)] -#[cfg_attr(feature = "std", derive(Debug, Default))] +#[cfg_attr(feature = "std", derive(Debug, Default, Hash))] pub struct CandidateCommitments { /// Fees paid from the chain to the relay chain validators. pub fees: Balance, @@ -484,7 +484,7 @@ impl CoreAssignment { /// Validation data omitted from most candidate descriptor structs, as it can be derived from the /// relay-parent. #[derive(Clone, Encode, Decode)] -#[cfg_attr(feature = "std", derive(PartialEq, Debug))] +#[cfg_attr(feature = "std", derive(PartialEq, Debug, Default))] pub struct OmittedValidationData { /// The global validation schedule. pub global_validation: GlobalValidationData, diff --git a/roadmap/implementers-guide/src/node/availability/availability-distribution.md b/roadmap/implementers-guide/src/node/availability/availability-distribution.md index e34250782a..de34f3b8ed 100644 --- a/roadmap/implementers-guide/src/node/availability/availability-distribution.md +++ b/roadmap/implementers-guide/src/node/availability/availability-distribution.md @@ -23,16 +23,17 @@ Output: For each relay-parent in our local view update, look at all backed candidates pending availability. Distribute via gossip all erasure chunks for all candidates that we have to peers. -We define an operation `live_candidates(relay_heads) -> Set` which returns a set of [`CommittedCandidateReceipt`s](../../types/candidate.md#committed-candidate-receipt) a given set of relay chain heads that implies a set of candidates whose availability chunks should be currently gossiped. This is defined as all candidates pending availability in any of those relay-chain heads or any of their last `K` ancestors. We assume that state is not pruned within `K` blocks of the chain-head. +We define an operation `live_candidates(relay_heads) -> Set` which returns a set of [`CommittedCandidateReceipt`s](../../types/candidate.md#committed-candidate-receipt). +This is defined as all candidates pending availability in any of those relay-chain heads or any of their last `K` ancestors in the same session. We assume that state is not pruned within `K` blocks of the chain-head. `K` commonly is small and is currently fixed to `K=3`. -We will send any erasure-chunks that correspond to candidates in `live_candidates(peer_most_recent_view_update)`. Likewise, we only accept and forward messages pertaining to a candidate in `live_candidates(current_heads)`. Each erasure chunk should be accompanied by a merkle proof that it is committed to by the erasure trie root in the candidate receipt, and this gossip system is responsible for checking such proof. +We will send any erasure-chunks that correspond to candidates in `live_candidates(peer_most_recent_view_update)`. +Likewise, we only accept and forward messages pertaining to a candidate in `live_candidates(current_heads)`. +Each erasure chunk should be accompanied by a merkle proof that it is committed to by the erasure trie root in the candidate receipt, and this gossip system is responsible for checking such proof. We re-attempt to send anything live to a peer upon any view update from that peer. -On our view change, for all live candidates, we will check if we have the PoV by issuing a `QueryPoV` message and waiting for the response. If the query returns `Some`, we will perform the erasure-coding and distribute all messages to peers that will accept them. +On our view change, for all live candidates, we will check if we have the PoV by issuing a `QueryAvailabileData` message and waiting for the response. If the query returns `Some`, we will perform the erasure-coding and distribute all messages to peers that will accept them. If we are operating as a validator, we note our index `i` in the validator set and keep the `i`th availability chunk for any live candidate, as we receive it. We keep the chunk and its merkle proof in the [Availability Store](../utility/availability-store.md) by sending a `StoreChunk` command. This includes chunks and proofs generated as the result of a successful `QueryPoV`. -> TODO: back-and-forth is kind of ugly but drastically simplifies the pruning in the availability store, as it creates an invariant that chunks are only stored if the candidate was actually backed -> -> K=3? +The back-and-forth seems suboptimal at first glance, but drastically simplifies the pruning in the availability store, as it creates an invariant that chunks are only stored if the candidate was actually backed. -- GitLab From 78c8a6463eb078dd12665a40e2680443bc19c091 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Tue, 11 Aug 2020 13:06:53 +0200 Subject: [PATCH 163/192] Support `build-spec` for other chains than Polkadot (#1567) * Support `build-spec` for other chains than Polkadot The problem when building a chain specification is that you require the native runtime to parse the json file (assuming the chain spec is not raw yet). Before this pr we could only overwrite the native runtime when running the node using `force_*`. This pr now adds support to load the native runtime when the filename starts with the name of the chain. So, when usng `build-spec --chain rococo-something-else.jon` it will use the rococo native runtime to load the chain spec. * Apply suggestions from code review Co-authored-by: Andronik Ordian Co-authored-by: Andronik Ordian --- cli/src/cli.rs | 4 ++++ cli/src/command.rs | 26 ++++++++++++++++++++------ service/src/lib.rs | 9 +++++---- 3 files changed, 29 insertions(+), 10 deletions(-) diff --git a/cli/src/cli.rs b/cli/src/cli.rs index d3ec195a97..cb3cfa19f6 100644 --- a/cli/src/cli.rs +++ b/cli/src/cli.rs @@ -59,6 +59,10 @@ pub struct RunCmd { #[structopt(long = "force-westend")] pub force_westend: bool, + /// Force using Rococo native runtime. + #[structopt(long)] + pub force_rococo: bool, + /// Enable the authority discovery module on validator or sentry nodes. /// /// When enabled: diff --git a/cli/src/command.rs b/cli/src/command.rs index 86e8796408..1ce9b5550b 100644 --- a/cli/src/command.rs +++ b/cli/src/command.rs @@ -68,13 +68,25 @@ impl SubstrateCli for Cli { "rococo-staging" => Box::new(service::chain_spec::rococo_staging_testnet_config()?), "rococo-local" => Box::new(service::chain_spec::rococo_local_testnet_config()?), "rococo" => Box::new(service::chain_spec::rococo_config()?), - path if self.run.force_kusama => { - Box::new(service::KusamaChainSpec::from_json_file(std::path::PathBuf::from(path))?) - }, - path if self.run.force_westend => { - Box::new(service::WestendChainSpec::from_json_file(std::path::PathBuf::from(path))?) + path => { + let path = std::path::PathBuf::from(path); + + let starts_with = |prefix: &str| { + path.file_name().map(|f| f.to_str().map(|s| s.starts_with(&prefix))).flatten().unwrap_or(false) + }; + + // When `force_*` is given or the file name starts with the name of one of the known chains, + // we use the chain spec for the specific chain. + if self.run.force_rococo || starts_with("rococo") { + Box::new(service::RococoChainSpec::from_json_file(path)?) + } else if self.run.force_kusama || starts_with("kusama") { + Box::new(service::KusamaChainSpec::from_json_file(path)?) + } else if self.run.force_westend || starts_with("westend") { + Box::new(service::WestendChainSpec::from_json_file(path)?) + } else { + Box::new(service::PolkadotChainSpec::from_json_file(path)?) + } }, - path => Box::new(service::PolkadotChainSpec::from_json_file(std::path::PathBuf::from(path))?), }) } @@ -83,6 +95,8 @@ impl SubstrateCli for Cli { &service::kusama_runtime::VERSION } else if spec.is_westend() { &service::westend_runtime::VERSION + } else if spec.is_rococo() { + &service::rococo_runtime::VERSION } else { &service::polkadot_runtime::VERSION } diff --git a/service/src/lib.rs b/service/src/lib.rs index a8b8d39899..d5ecec9f21 100644 --- a/service/src/lib.rs +++ b/service/src/lib.rs @@ -25,11 +25,12 @@ use std::time::Duration; use polkadot_primitives::v0::{self as parachain, Hash, BlockId}; #[cfg(feature = "full-node")] use polkadot_network::{legacy::gossip::Known, protocol as network_protocol}; -use service::{error::Error as ServiceError}; +use service::error::Error as ServiceError; use grandpa::{self, FinalityProofProvider as GrandpaFinalityProofProvider}; use sc_executor::native_executor_instance; use log::info; use sp_trie::PrefixedMemoryDB; +use prometheus_endpoint::Registry; pub use service::{ Role, PruningMode, TransactionPoolOptions, Error, RuntimeGenesis, RpcHandlers, TFullClient, TLightClient, TFullBackend, TLightBackend, TFullCallExecutor, TLightCallExecutor, @@ -44,14 +45,14 @@ pub use sp_runtime::traits::{HashFor, NumberFor}; pub use consensus_common::{SelectChain, BlockImport, block_validation::Chain}; pub use polkadot_primitives::v0::{Block, CollatorId, ParachainHost}; pub use sp_runtime::traits::{Block as BlockT, self as runtime_traits, BlakeTwo256}; -pub use chain_spec::{PolkadotChainSpec, KusamaChainSpec, WestendChainSpec}; +pub use chain_spec::{PolkadotChainSpec, KusamaChainSpec, WestendChainSpec, RococoChainSpec}; #[cfg(feature = "full-node")] pub use consensus::run_validation_worker; pub use codec::Codec; pub use polkadot_runtime; pub use kusama_runtime; pub use westend_runtime; -use prometheus_endpoint::Registry; +pub use rococo_runtime; pub use self::client::*; native_executor_instance!( @@ -364,7 +365,7 @@ pub fn new_full( let polkadot_network_service = network_protocol::start( network.clone(), network_protocol::Config { - collating_for: collating_for, + collating_for, }, (is_known, client.clone()), client.clone(), -- GitLab From fb83176884a9cb3a6dd92888704493fed1dbf0c3 Mon Sep 17 00:00:00 2001 From: Dan Forbes Date: Wed, 12 Aug 2020 03:02:43 -0700 Subject: [PATCH 164/192] Augment Implementer's Guide XCMP docs (#1569) * Augment Implementer's Guide XCMP docs * Remove the note about the third category * Make Cross-Chain Message Passing a h3 Co-authored-by: Sergei Shulepov --- roadmap/implementers-guide/src/messaging.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/roadmap/implementers-guide/src/messaging.md b/roadmap/implementers-guide/src/messaging.md index 3795db3771..e9e228f30f 100644 --- a/roadmap/implementers-guide/src/messaging.md +++ b/roadmap/implementers-guide/src/messaging.md @@ -61,6 +61,8 @@ digraph { } ``` +### Cross-Chain Message Passing + The most important member of this family is XCMP. > ℹ️ XCMP is currently under construction and details are subject for change. @@ -81,8 +83,10 @@ candidate authoring time. The proof stems from the relay parent storage that con Since not all messages are required to be processed by the receiver's candidate, only the processed messages are supplied (i.e. preimages), rest are provided as hashes. -Further details can be found at the [W3F research website](https://research.web3.foundation/en/latest/polkadot/XCMP.html) -and [this blogpost](https://medium.com/web3foundation/polkadots-messaging-scheme-b1ec560908b7). +Further details can be found at the official repository for the +[Cross-Consensus Message Format (XCM)](https://github.com/paritytech/xcm-format/blob/master/README.md), as well as +at the [W3F research website](https://research.web3.foundation/en/latest/polkadot/XCMP.html) and +[this blogpost](https://medium.com/web3foundation/polkadots-messaging-scheme-b1ec560908b7). HRMP (Horizontally Relay-routed Message Passing) is a stop gap that predates XCMP. Semantically, it mimics XCMP's interface. The crucial difference from XCMP though is that all the messages are stored in the relay-chain storage. That makes -- GitLab From 1e9c0540cecb534635401d2aeb809f2381665479 Mon Sep 17 00:00:00 2001 From: Robert Habermeier Date: Wed, 12 Aug 2020 13:16:28 +0200 Subject: [PATCH 165/192] Network bridge refactoring impl (#1537) * update networking types * port over overseer-protocol message types * Add the collation protocol to network bridge * message sending * stub for ConnectToValidators * add some helper traits and methods to protocol types * add collator protocol message * leaves-updating * peer connection and disconnection * add utilities for dispatching multiple events * implement message handling * add an observedrole enum with equality and no sentry nodes * derive partial-eq on network bridge event * add PartialEq impls for network message types * add Into implementation for observedrole * port over existing network bridge tests * add some more tests * port bitfield distribution * port over bitfield distribution tests * add codec indices * port PoV distribution * port over PoV distribution tests * port over statement distribution * port over statement distribution tests * update overseer and service-new * address review comments * port availability distribution * port over availability distribution tests --- Cargo.lock | 26 +- Cargo.toml | 1 + .../availability-distribution/Cargo.toml | 7 +- .../availability-distribution/src/lib.rs | 67 +- .../availability-distribution/src/tests.rs | 109 +- node/network/bitfield-distribution/Cargo.toml | 2 +- node/network/bitfield-distribution/src/lib.rs | 170 +-- node/network/bridge/Cargo.toml | 3 +- node/network/bridge/src/lib.rs | 1257 ++++++++++++----- node/network/pov-distribution/Cargo.toml | 2 +- node/network/pov-distribution/src/lib.rs | 157 +- node/network/protocol/Cargo.toml | 14 + node/network/protocol/src/lib.rs | 269 ++++ .../network/statement-distribution/Cargo.toml | 1 + .../network/statement-distribution/src/lib.rs | 105 +- node/overseer/examples/minimal-example.rs | 1 + node/overseer/src/lib.rs | 40 +- node/primitives/src/lib.rs | 26 - node/service/src/lib.rs | 1 + node/subsystem/Cargo.toml | 1 + node/subsystem/src/messages.rs | 101 +- 21 files changed, 1551 insertions(+), 809 deletions(-) create mode 100644 node/network/protocol/Cargo.toml create mode 100644 node/network/protocol/src/lib.rs diff --git a/Cargo.lock b/Cargo.lock index 6ff134014b..ab125cb005 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4423,8 +4423,8 @@ dependencies = [ "maplit", "parity-scale-codec", "parking_lot 0.11.0", - "polkadot-network", "polkadot-network-bridge", + "polkadot-node-network-protocol", "polkadot-node-primitives", "polkadot-node-subsystem", "polkadot-node-subsystem-test-helpers", @@ -4450,19 +4450,16 @@ dependencies = [ "parity-scale-codec", "parking_lot 0.11.0", "polkadot-erasure-coding", - "polkadot-network", "polkadot-network-bridge", - "polkadot-node-primitives", + "polkadot-node-network-protocol", "polkadot-node-subsystem", "polkadot-node-subsystem-test-helpers", "polkadot-primitives", "sc-keystore", - "sc-network", "smallvec 1.4.1", "smol-timeout", "sp-core", "sp-keyring", - "sp-staking", "streamunordered", ] @@ -4608,12 +4605,13 @@ dependencies = [ "log 0.4.11", "parity-scale-codec", "parking_lot 0.10.2", - "polkadot-node-primitives", + "polkadot-node-network-protocol", "polkadot-node-subsystem", "polkadot-node-subsystem-test-helpers", "polkadot-primitives", "sc-network", "sp-core", + "sp-keyring", "sp-runtime", "streamunordered", ] @@ -4786,6 +4784,18 @@ dependencies = [ "sp-core", ] +[[package]] +name = "polkadot-node-network-protocol" +version = "0.1.0" +dependencies = [ + "parity-scale-codec", + "polkadot-node-primitives", + "polkadot-primitives", + "sc-network", + "sp-core", + "sp-runtime", +] + [[package]] name = "polkadot-node-primitives" version = "0.1.0" @@ -4810,6 +4820,7 @@ dependencies = [ "parity-scale-codec", "parking_lot 0.10.2", "pin-project", + "polkadot-node-network-protocol", "polkadot-node-primitives", "polkadot-node-subsystem-test-helpers", "polkadot-primitives", @@ -4913,11 +4924,11 @@ dependencies = [ "log 0.4.11", "parity-scale-codec", "parking_lot 0.10.2", + "polkadot-node-network-protocol", "polkadot-node-primitives", "polkadot-node-subsystem", "polkadot-node-subsystem-test-helpers", "polkadot-primitives", - "sc-network", "sp-core", "sp-runtime", "streamunordered", @@ -5271,6 +5282,7 @@ dependencies = [ "log 0.4.11", "parity-scale-codec", "parking_lot 0.10.2", + "polkadot-node-network-protocol", "polkadot-node-primitives", "polkadot-node-subsystem", "polkadot-node-subsystem-test-helpers", diff --git a/Cargo.toml b/Cargo.toml index be1bc74858..0fa1ae7e24 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -55,6 +55,7 @@ members = [ "node/core/runtime-api", "node/network/bridge", "node/network/pov-distribution", + "node/network/protocol", "node/network/statement-distribution", "node/network/bitfield-distribution", "node/network/availability-distribution", diff --git a/node/network/availability-distribution/Cargo.toml b/node/network/availability-distribution/Cargo.toml index c2d313c3cf..a966c769bd 100644 --- a/node/network/availability-distribution/Cargo.toml +++ b/node/network/availability-distribution/Cargo.toml @@ -9,16 +9,13 @@ futures = "0.3.5" log = "0.4.11" streamunordered = "0.5.1" codec = { package="parity-scale-codec", version = "1.3.4", features = ["std"] } -node-primitives = { package = "polkadot-node-primitives", path = "../../primitives" } polkadot-primitives = { path = "../../../primitives" } polkadot-erasure-coding = { path = "../../../erasure-coding" } polkadot-subsystem = { package = "polkadot-node-subsystem", path = "../../subsystem" } polkadot-network-bridge = { path = "../../network/bridge" } -polkadot-network = { path = "../../../network" } -sc-network = { git = "https://github.com/paritytech/substrate", branch = "master" } +polkadot-node-network-protocol = { path = "../../network/protocol" } sc-keystore = { git = "https://github.com/paritytech/substrate", branch = "master" } derive_more = "0.99.9" -sp-staking = { git = "https://github.com/paritytech/substrate", branch = "master", features = ["std"] } sp-core = { git = "https://github.com/paritytech/substrate", branch = "master", features = ["std"] } [dev-dependencies] @@ -31,4 +28,4 @@ futures-timer = "3.0.2" smol-timeout = "0.1.0" env_logger = "0.7.1" assert_matches = "1.3.0" -smallvec = "1" \ No newline at end of file +smallvec = "1" diff --git a/node/network/availability-distribution/src/lib.rs b/node/network/availability-distribution/src/lib.rs index b3934ded6f..2a5a086065 100644 --- a/node/network/availability-distribution/src/lib.rs +++ b/node/network/availability-distribution/src/lib.rs @@ -32,24 +32,27 @@ use sp_core::{ }; use sc_keystore as keystore; -use node_primitives::{ProtocolId, View}; - use log::{trace, warn}; use polkadot_erasure_coding::branch_hash; use polkadot_primitives::v1::{ PARACHAIN_KEY_TYPE_ID, BlakeTwo256, CommittedCandidateReceipt, CoreState, ErasureChunk, Hash as Hash, HashT, Id as ParaId, - ValidatorId, ValidatorIndex, + ValidatorId, ValidatorIndex, SessionIndex, +}; +use polkadot_subsystem::messages::{ + AllMessages, AvailabilityDistributionMessage, NetworkBridgeMessage, RuntimeApiMessage, + RuntimeApiRequest, AvailabilityStoreMessage, ChainApiMessage, }; -use polkadot_subsystem::messages::*; use polkadot_subsystem::{ errors::{ChainApiError, RuntimeApiError}, ActiveLeavesUpdate, FromOverseer, OverseerSignal, SpawnedSubsystem, Subsystem, SubsystemContext, SubsystemError, }; -use sc_network::ReputationChange as Rep; -use sp_staking::SessionIndex; +use polkadot_node_network_protocol::{ + v1 as protocol_v1, View, ReputationChange as Rep, PeerId, + NetworkBridgeEvent, +}; use std::collections::{HashMap, HashSet}; use std::io; use std::iter; @@ -76,7 +79,6 @@ type Result = std::result::Result; const COST_MERKLE_PROOF_INVALID: Rep = Rep::new(-100, "Merkle proof was invalid"); const COST_NOT_A_LIVE_CANDIDATE: Rep = Rep::new(-51, "Candidate is not live"); -const COST_MESSAGE_NOT_DECODABLE: Rep = Rep::new(-100, "Message is not decodable"); const COST_PEER_DUPLICATE_MESSAGE: Rep = Rep::new(-500, "Peer sent identical messages"); const BENEFIT_VALID_MESSAGE_FIRST: Rep = Rep::new(15, "Valid message with new information"); const BENEFIT_VALID_MESSAGE: Rep = Rep::new(10, "Valid message"); @@ -284,17 +286,13 @@ impl ProtocolState { } } -fn network_update_message(n: NetworkBridgeEvent) -> AllMessages { - AllMessages::AvailabilityDistribution(AvailabilityDistributionMessage::NetworkBridgeUpdate(n)) -} - /// Deal with network bridge updates and track what needs to be tracked /// which depends on the message type received. async fn handle_network_msg( ctx: &mut Context, keystore: KeyStorePtr, state: &mut ProtocolState, - bridge_message: NetworkBridgeEvent, + bridge_message: NetworkBridgeEvent, ) -> Result<()> where Context: SubsystemContext, @@ -314,19 +312,13 @@ where NetworkBridgeEvent::OurViewChange(view) => { handle_our_view_change(ctx, keystore, state, view).await?; } - NetworkBridgeEvent::PeerMessage(remote, bytes) => { - if let Ok(gossiped_availability) = - AvailabilityGossipMessage::decode(&mut (bytes.as_slice())) - { - trace!( - target: TARGET, - "Received availability gossip from peer {:?}", - &remote - ); - process_incoming_peer_message(ctx, state, remote, gossiped_availability).await?; - } else { - modify_reputation(ctx, remote, COST_MESSAGE_NOT_DECODABLE).await?; - } + NetworkBridgeEvent::PeerMessage(remote, msg) => { + let gossiped_availability = match msg { + protocol_v1::AvailabilityDistributionMessage::Chunk(candidate_hash, chunk) => + AvailabilityGossipMessage { candidate_hash, erasure_chunk: chunk } + }; + + process_incoming_peer_message(ctx, state, remote, gossiped_availability).await?; } } Ok(()) @@ -494,16 +486,19 @@ where .insert(message_id); } - let encoded = message.encode(); per_candidate .message_vault - .insert(message.erasure_chunk.index, message); + .insert(message.erasure_chunk.index, message.clone()); + + let wire_message = protocol_v1::AvailabilityDistributionMessage::Chunk( + message.candidate_hash, + message.erasure_chunk, + ); ctx.send_message(AllMessages::NetworkBridge( - NetworkBridgeMessage::SendMessage( + NetworkBridgeMessage::SendValidationMessage( peers.clone(), - AvailabilityDistributionSubsystem::PROTOCOL_ID, - encoded, + protocol_v1::ValidationProtocol::AvailabilityDistribution(wire_message), ), )) .await @@ -709,9 +704,6 @@ pub struct AvailabilityDistributionSubsystem { } impl AvailabilityDistributionSubsystem { - /// The protocol identifier for bitfield distribution. - const PROTOCOL_ID: ProtocolId = *b"avad"; - /// Number of ancestors to keep around for the relay-chain heads. const K: usize = 3; @@ -725,20 +717,13 @@ impl AvailabilityDistributionSubsystem { where Context: SubsystemContext, { - // startup: register the network protocol with the bridge. - ctx.send_message(AllMessages::NetworkBridge( - NetworkBridgeMessage::RegisterEventProducer(Self::PROTOCOL_ID, network_update_message), - )) - .await - .map_err::(Into::into)?; - // work: process incoming messages from the overseer. let mut state = ProtocolState::default(); loop { let message = ctx.recv().await.map_err::(Into::into)?; match message { FromOverseer::Communication { - msg: AvailabilityDistributionMessage::NetworkBridgeUpdate(event), + msg: AvailabilityDistributionMessage::NetworkBridgeUpdateV1(event), } => { if let Err(e) = handle_network_msg( &mut ctx, diff --git a/node/network/availability-distribution/src/tests.rs b/node/network/availability-distribution/src/tests.rs index 130c2700ca..f4988fd8b7 100644 --- a/node/network/availability-distribution/src/tests.rs +++ b/node/network/availability-distribution/src/tests.rs @@ -1,3 +1,19 @@ +// Copyright 2020 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 . + use super::*; use assert_matches::assert_matches; use polkadot_erasure_coding::{branches, obtain_chunks_v1 as obtain_chunks}; @@ -7,6 +23,7 @@ use polkadot_primitives::v1::{ OmittedValidationData, PoV, ScheduledCore, ValidatorPair, }; use polkadot_subsystem_testhelpers as test_helpers; +use polkadot_node_network_protocol::ObservedRole; use futures::{executor, future, Future}; use futures_timer::Delay; @@ -26,6 +43,15 @@ macro_rules! delay { }; } +fn chunk_protocol_message(message: AvailabilityGossipMessage) + -> protocol_v1::AvailabilityDistributionMessage +{ + protocol_v1::AvailabilityDistributionMessage::Chunk( + message.candidate_hash, + message.erasure_chunk, + ) +} + struct TestHarness { virtual_overseer: test_helpers::TestSubsystemContextHandle, } @@ -437,12 +463,9 @@ fn reputation_verification() { ) .await; - // ignore event producer registration - let _ = overseer_recv(&mut virtual_overseer).await; - overseer_send( &mut virtual_overseer, - AvailabilityDistributionMessage::NetworkBridgeUpdate( + AvailabilityDistributionMessage::NetworkBridgeUpdateV1( NetworkBridgeEvent::OurViewChange(view![current,]), ), ) @@ -668,7 +691,7 @@ fn reputation_verification() { // setup peer a with interest in current overseer_send( &mut virtual_overseer, - AvailabilityDistributionMessage::NetworkBridgeUpdate( + AvailabilityDistributionMessage::NetworkBridgeUpdateV1( NetworkBridgeEvent::PeerConnected(peer_a.clone(), ObservedRole::Full), ), ) @@ -676,7 +699,7 @@ fn reputation_verification() { overseer_send( &mut virtual_overseer, - AvailabilityDistributionMessage::NetworkBridgeUpdate( + AvailabilityDistributionMessage::NetworkBridgeUpdateV1( NetworkBridgeEvent::PeerViewChange(peer_a.clone(), view![current]), ), ) @@ -685,7 +708,7 @@ fn reputation_verification() { // setup peer b with interest in ancestor overseer_send( &mut virtual_overseer, - AvailabilityDistributionMessage::NetworkBridgeUpdate( + AvailabilityDistributionMessage::NetworkBridgeUpdateV1( NetworkBridgeEvent::PeerConnected(peer_b.clone(), ObservedRole::Full), ), ) @@ -693,7 +716,7 @@ fn reputation_verification() { overseer_send( &mut virtual_overseer, - AvailabilityDistributionMessage::NetworkBridgeUpdate( + AvailabilityDistributionMessage::NetworkBridgeUpdateV1( NetworkBridgeEvent::PeerViewChange(peer_b.clone(), view![ancestors[0]]), ), ) @@ -701,35 +724,6 @@ fn reputation_verification() { delay!(100); - ///////////////////////////////////////////////////////// - // ready for action - - // check if garbage messages are detected and peer rep is changed as expected - let garbage = b"I am garbage"; - - overseer_send( - &mut virtual_overseer, - AvailabilityDistributionMessage::NetworkBridgeUpdate(NetworkBridgeEvent::PeerMessage( - peer_b.clone(), - // AvailabilityDistributionSubsystem::PROTOCOL_ID, - garbage.to_vec(), - )), - ) - .await; - - assert_matches!( - overseer_recv(&mut virtual_overseer).await, - AllMessages::NetworkBridge( - NetworkBridgeMessage::ReportPeer( - peer, - rep - ) - ) => { - assert_eq!(peer, peer_b); - assert_eq!(rep, COST_MESSAGE_NOT_DECODABLE); - } - ); - let valid: AvailabilityGossipMessage = make_valid_availability_gossip( &test_state, candidates[0].hash(), @@ -741,8 +735,11 @@ fn reputation_verification() { // valid (first, from b) overseer_send( &mut virtual_overseer, - AvailabilityDistributionMessage::NetworkBridgeUpdate( - NetworkBridgeEvent::PeerMessage(peer_b.clone(), valid.encode()), + AvailabilityDistributionMessage::NetworkBridgeUpdateV1( + NetworkBridgeEvent::PeerMessage( + peer_b.clone(), + chunk_protocol_message(valid.clone()), + ), ), ) .await; @@ -765,8 +762,11 @@ fn reputation_verification() { // valid (duplicate, from b) overseer_send( &mut virtual_overseer, - AvailabilityDistributionMessage::NetworkBridgeUpdate( - NetworkBridgeEvent::PeerMessage(peer_b.clone(), valid.encode()), + AvailabilityDistributionMessage::NetworkBridgeUpdateV1( + NetworkBridgeEvent::PeerMessage( + peer_b.clone(), + chunk_protocol_message(valid.clone()), + ), ), ) .await; @@ -789,8 +789,11 @@ fn reputation_verification() { // valid (second, from a) overseer_send( &mut virtual_overseer, - AvailabilityDistributionMessage::NetworkBridgeUpdate( - NetworkBridgeEvent::PeerMessage(peer_a.clone(), valid.encode()), + AvailabilityDistributionMessage::NetworkBridgeUpdateV1( + NetworkBridgeEvent::PeerMessage( + peer_a.clone(), + chunk_protocol_message(valid.clone()), + ), ), ) .await; @@ -812,7 +815,7 @@ fn reputation_verification() { // peer a is not interested in anything anymore overseer_send( &mut virtual_overseer, - AvailabilityDistributionMessage::NetworkBridgeUpdate( + AvailabilityDistributionMessage::NetworkBridgeUpdateV1( NetworkBridgeEvent::PeerViewChange(peer_a.clone(), view![]), ), ) @@ -822,8 +825,11 @@ fn reputation_verification() { // send the a message again, so we should detect the duplicate overseer_send( &mut virtual_overseer, - AvailabilityDistributionMessage::NetworkBridgeUpdate( - NetworkBridgeEvent::PeerMessage(peer_a.clone(), valid.encode()), + AvailabilityDistributionMessage::NetworkBridgeUpdateV1( + NetworkBridgeEvent::PeerMessage( + peer_a.clone(), + chunk_protocol_message(valid.clone()), + ), ), ) .await; @@ -846,7 +852,7 @@ fn reputation_verification() { // setup peer a with interest in parent x overseer_send( &mut virtual_overseer, - AvailabilityDistributionMessage::NetworkBridgeUpdate( + AvailabilityDistributionMessage::NetworkBridgeUpdateV1( NetworkBridgeEvent::PeerDisconnected(peer_b.clone()), ), ) @@ -856,7 +862,7 @@ fn reputation_verification() { overseer_send( &mut virtual_overseer, - AvailabilityDistributionMessage::NetworkBridgeUpdate( + AvailabilityDistributionMessage::NetworkBridgeUpdateV1( NetworkBridgeEvent::PeerConnected(peer_b.clone(), ObservedRole::Full), ), ) @@ -874,8 +880,11 @@ fn reputation_verification() { // send the a message before we send a view update overseer_send( &mut virtual_overseer, - AvailabilityDistributionMessage::NetworkBridgeUpdate( - NetworkBridgeEvent::PeerMessage(peer_a.clone(), valid2.encode()), + AvailabilityDistributionMessage::NetworkBridgeUpdateV1( + NetworkBridgeEvent::PeerMessage( + peer_a.clone(), + chunk_protocol_message(valid2), + ), ), ) .await; diff --git a/node/network/bitfield-distribution/Cargo.toml b/node/network/bitfield-distribution/Cargo.toml index 0ae5ad5a3d..768d63e1f6 100644 --- a/node/network/bitfield-distribution/Cargo.toml +++ b/node/network/bitfield-distribution/Cargo.toml @@ -14,7 +14,7 @@ node-primitives = { package = "polkadot-node-primitives", path = "../../primitiv polkadot-primitives = { path = "../../../primitives" } polkadot-subsystem = { package = "polkadot-node-subsystem", path = "../../subsystem" } polkadot-network-bridge = { path = "../../network/bridge" } -polkadot-network = { path = "../../../network" } +polkadot-node-network-protocol = { path = "../../network/protocol" } sc-network = { git = "https://github.com/paritytech/substrate", branch = "master" } [dev-dependencies] diff --git a/node/network/bitfield-distribution/src/lib.rs b/node/network/bitfield-distribution/src/lib.rs index 939b6616df..8da071bddd 100644 --- a/node/network/bitfield-distribution/src/lib.rs +++ b/node/network/bitfield-distribution/src/lib.rs @@ -23,15 +23,13 @@ use codec::{Decode, Encode}; use futures::{channel::oneshot, FutureExt}; -use node_primitives::{ProtocolId, View}; - use log::{trace, warn}; use polkadot_subsystem::messages::*; use polkadot_subsystem::{ ActiveLeavesUpdate, FromOverseer, OverseerSignal, SpawnedSubsystem, Subsystem, SubsystemContext, SubsystemResult, }; use polkadot_primitives::v1::{Hash, SignedAvailabilityBitfield, SigningContext, ValidatorId}; -use sc_network::ReputationChange; +use polkadot_node_network_protocol::{v1 as protocol_v1, PeerId, NetworkBridgeEvent, View, ReputationChange}; use std::collections::{HashMap, HashSet}; const COST_SIGNATURE_INVALID: ReputationChange = @@ -42,8 +40,6 @@ const COST_MISSING_PEER_SESSION_KEY: ReputationChange = ReputationChange::new(-133, "Missing peer session key"); const COST_NOT_IN_VIEW: ReputationChange = ReputationChange::new(-51, "Not interested in that parent hash"); -const COST_MESSAGE_NOT_DECODABLE: ReputationChange = - ReputationChange::new(-100, "Not interested in that parent hash"); const COST_PEER_DUPLICATE_MESSAGE: ReputationChange = ReputationChange::new(-500, "Peer sent the same message multiple times"); const BENEFIT_VALID_MESSAGE_FIRST: ReputationChange = @@ -54,11 +50,28 @@ const BENEFIT_VALID_MESSAGE: ReputationChange = /// Checked signed availability bitfield that is distributed /// to other peers. #[derive(Encode, Decode, Debug, Clone, PartialEq, Eq)] -pub struct BitfieldGossipMessage { +struct BitfieldGossipMessage { /// The relay parent this message is relative to. - pub relay_parent: Hash, + relay_parent: Hash, /// The actual signed availability bitfield. - pub signed_availability: SignedAvailabilityBitfield, + signed_availability: SignedAvailabilityBitfield, +} + +impl BitfieldGossipMessage { + fn into_validation_protocol(self) -> protocol_v1::ValidationProtocol { + protocol_v1::ValidationProtocol::BitfieldDistribution( + self.into_network_message() + ) + } + + fn into_network_message(self) + -> protocol_v1::BitfieldDistributionMessage + { + protocol_v1::BitfieldDistributionMessage::Bitfield( + self.relay_parent, + self.signed_availability, + ) + } } /// Data used to track information of peers and relay parents the @@ -114,28 +127,15 @@ impl PerRelayParentData { } } -fn network_update_message(n: NetworkBridgeEvent) -> AllMessages { - AllMessages::BitfieldDistribution(BitfieldDistributionMessage::NetworkBridgeUpdate(n)) -} - /// The bitfield distribution subsystem. pub struct BitfieldDistribution; impl BitfieldDistribution { - /// The protocol identifier for bitfield distribution. - const PROTOCOL_ID: ProtocolId = *b"bitd"; - /// Start processing work as passed on from the Overseer. async fn run(mut ctx: Context) -> SubsystemResult<()> where Context: SubsystemContext, { - // startup: register the network protocol with the bridge. - ctx.send_message(AllMessages::NetworkBridge( - NetworkBridgeMessage::RegisterEventProducer(Self::PROTOCOL_ID, network_update_message), - )) - .await?; - // work: process incoming messages from the overseer and process accordingly. let mut state = ProtocolState::default(); loop { @@ -149,7 +149,7 @@ impl BitfieldDistribution { .await?; } FromOverseer::Communication { - msg: BitfieldDistributionMessage::NetworkBridgeUpdate(event), + msg: BitfieldDistributionMessage::NetworkBridgeUpdateV1(event), } => { trace!(target: "bitd", "Processing NetworkMessage"); // a network message was received @@ -314,10 +314,9 @@ where ); } else { ctx.send_message(AllMessages::NetworkBridge( - NetworkBridgeMessage::SendMessage( + NetworkBridgeMessage::SendValidationMessage( interested_peers, - BitfieldDistribution::PROTOCOL_ID, - message.encode(), + message.into_validation_protocol(), ), )) .await?; @@ -413,7 +412,7 @@ where async fn handle_network_msg( ctx: &mut Context, state: &mut ProtocolState, - bridge_message: NetworkBridgeEvent, + bridge_message: NetworkBridgeEvent, ) -> SubsystemResult<()> where Context: SubsystemContext, @@ -433,12 +432,16 @@ where NetworkBridgeEvent::OurViewChange(view) => { handle_our_view_change(state, view)?; } - NetworkBridgeEvent::PeerMessage(remote, bytes) => { - if let Ok(gossiped_bitfield) = BitfieldGossipMessage::decode(&mut (bytes.as_slice())) { - trace!(target: "bitd", "Received bitfield gossip from peer {:?}", &remote); - process_incoming_peer_message(ctx, state, remote, gossiped_bitfield).await?; - } else { - modify_reputation(ctx, remote, COST_MESSAGE_NOT_DECODABLE).await?; + NetworkBridgeEvent::PeerMessage(remote, message) => { + match message { + protocol_v1::BitfieldDistributionMessage::Bitfield(relay_parent, bitfield) => { + trace!(target: "bitd", "Received bitfield gossip from peer {:?}", &remote); + let gossiped_bitfield = BitfieldGossipMessage { + relay_parent, + signed_availability: bitfield, + }; + process_incoming_peer_message(ctx, state, remote, gossiped_bitfield).await?; + } } } } @@ -541,10 +544,9 @@ where .insert(validator.clone()); ctx.send_message(AllMessages::NetworkBridge( - NetworkBridgeMessage::SendMessage( + NetworkBridgeMessage::SendValidationMessage( vec![dest], - BitfieldDistribution::PROTOCOL_ID, - message.encode(), + message.into_validation_protocol(), ), )) .await?; @@ -612,6 +614,7 @@ mod test { use sp_core::crypto::Pair; use std::time::Duration; use assert_matches::assert_matches; + use polkadot_node_network_protocol::ObservedRole; macro_rules! view { ( $( $hash:expr ),* $(,)? ) => [ @@ -742,7 +745,7 @@ mod test { launch!(handle_network_msg( &mut ctx, &mut state, - NetworkBridgeEvent::PeerMessage(peer_b.clone(), msg.encode()), + NetworkBridgeEvent::PeerMessage(peer_b.clone(), msg.into_network_message()), )); // reputation change due to invalid validator index @@ -795,7 +798,7 @@ mod test { launch!(handle_network_msg( &mut ctx, &mut state, - NetworkBridgeEvent::PeerMessage(peer_b.clone(), msg.encode()), + NetworkBridgeEvent::PeerMessage(peer_b.clone(), msg.into_network_message()), )); // reputation change due to invalid validator index @@ -848,7 +851,10 @@ mod test { launch!(handle_network_msg( &mut ctx, &mut state, - NetworkBridgeEvent::PeerMessage(peer_b.clone(), msg.encode()), + NetworkBridgeEvent::PeerMessage( + peer_b.clone(), + msg.clone().into_network_message(), + ), )); // none of our peers has any interest in any messages @@ -878,7 +884,10 @@ mod test { launch!(handle_network_msg( &mut ctx, &mut state, - NetworkBridgeEvent::PeerMessage(peer_a.clone(), msg.encode()), + NetworkBridgeEvent::PeerMessage( + peer_a.clone(), + msg.clone().into_network_message(), + ), )); assert_matches!( @@ -895,7 +904,10 @@ mod test { launch!(handle_network_msg( &mut ctx, &mut state, - NetworkBridgeEvent::PeerMessage(peer_b.clone(), msg.encode()), + NetworkBridgeEvent::PeerMessage( + peer_b.clone(), + msg.clone().into_network_message(), + ), )); assert_matches!( @@ -909,6 +921,7 @@ mod test { ); }); } + #[test] fn changing_view() { let _ = env_logger::builder() @@ -960,7 +973,10 @@ mod test { launch!(handle_network_msg( &mut ctx, &mut state, - NetworkBridgeEvent::PeerMessage(peer_b.clone(), msg.encode()), + NetworkBridgeEvent::PeerMessage( + peer_b.clone(), + msg.clone().into_network_message(), + ), )); // gossip to the overseer @@ -977,12 +993,11 @@ mod test { // gossip to the network assert_matches!( handle.recv().await, - AllMessages::NetworkBridge(NetworkBridgeMessage::SendMessage ( - peers, proto, bytes + AllMessages::NetworkBridge(NetworkBridgeMessage::SendValidationMessage ( + peers, out_msg, )) => { assert_eq!(peers, peers![peer_b]); - assert_eq!(proto, BitfieldDistribution::PROTOCOL_ID); - assert_eq!(bytes, msg.encode()); + assert_eq!(out_msg, msg.clone().into_validation_protocol()); } ); @@ -1014,7 +1029,10 @@ mod test { launch!(handle_network_msg( &mut ctx, &mut state, - NetworkBridgeEvent::PeerMessage(peer_b.clone(), msg.encode()), + NetworkBridgeEvent::PeerMessage( + peer_b.clone(), + msg.clone().into_network_message(), + ), )); // reputation change for peer B @@ -1042,7 +1060,10 @@ mod test { launch!(handle_network_msg( &mut ctx, &mut state, - NetworkBridgeEvent::PeerMessage(peer_a.clone(), msg.encode()), + NetworkBridgeEvent::PeerMessage( + peer_a.clone(), + msg.clone().into_network_message(), + ), )); // reputation change for peer B @@ -1058,59 +1079,4 @@ mod test { }); } - - - #[test] - fn invalid_peer_message() { - let _ = env_logger::builder() - .filter(None, log::LevelFilter::Trace) - .is_test(true) - .try_init(); - - let hash_a: Hash = [0; 32].into(); - let peer_a = PeerId::random(); - - // validator 0 key pair - let (mut state, _signing_context, _validator_pair) = state_with_view(view![], hash_a.clone()); - - let pool = sp_core::testing::TaskExecutor::new(); - let (mut ctx, mut handle) = - make_subsystem_context::(pool); - - executor::block_on(async move { - launch!(handle_network_msg( - &mut ctx, - &mut state, - NetworkBridgeEvent::PeerConnected(peer_a.clone(), ObservedRole::Full), - )); - - // make peer b interested - launch!(handle_network_msg( - &mut ctx, - &mut state, - NetworkBridgeEvent::PeerViewChange(peer_a.clone(), view![hash_a]), - )); - - assert!(state.peer_views.contains_key(&peer_a)); - - // recv a first message from the network - launch!(handle_network_msg( - &mut ctx, - &mut state, - NetworkBridgeEvent::PeerMessage(peer_a.clone(), b"00AaBbCcDdEeFf".to_vec()), - )); - - // reputation change for peer A - assert_matches!( - handle.recv().await, - AllMessages::NetworkBridge( - NetworkBridgeMessage::ReportPeer(peer, rep) - ) => { - assert_eq!(peer, peer_a); - assert_eq!(rep, COST_MESSAGE_NOT_DECODABLE); - } - ); - - }); - } } diff --git a/node/network/bridge/Cargo.toml b/node/network/bridge/Cargo.toml index ef8b605bb1..555f158b78 100644 --- a/node/network/bridge/Cargo.toml +++ b/node/network/bridge/Cargo.toml @@ -10,14 +10,15 @@ log = "0.4.8" futures-timer = "3.0.2" streamunordered = "0.5.1" polkadot-primitives = { path = "../../../primitives" } -node-primitives = { package = "polkadot-node-primitives", path = "../../primitives" } parity-scale-codec = "1.3.4" sc-network = { git = "https://github.com/paritytech/substrate", branch = "master" } sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "master" } polkadot-subsystem = { package = "polkadot-node-subsystem", path = "../../subsystem" } +polkadot-node-network-protocol = { path = "../protocol" } [dev-dependencies] assert_matches = "1.3.0" parking_lot = "0.10.0" polkadot-node-subsystem-test-helpers = { path = "../../subsystem-test-helpers" } sp-core = { git = "https://github.com/paritytech/substrate", branch = "master" } +sp-keyring = { git = "https://github.com/paritytech/substrate", branch = "master" } diff --git a/node/network/bridge/src/lib.rs b/node/network/bridge/src/lib.rs index 85063b2b0c..9f347d39f1 100644 --- a/node/network/bridge/src/lib.rs +++ b/node/network/bridge/src/lib.rs @@ -20,23 +20,27 @@ use parity_scale_codec::{Encode, Decode}; use futures::prelude::*; use futures::future::BoxFuture; use futures::stream::BoxStream; +use futures::channel::oneshot; -use sc_network::{ - ObservedRole, ReputationChange, PeerId, - Event as NetworkEvent, -}; +use sc_network::Event as NetworkEvent; use sp_runtime::ConsensusEngineId; use polkadot_subsystem::{ ActiveLeavesUpdate, FromOverseer, OverseerSignal, Subsystem, SubsystemContext, SpawnedSubsystem, SubsystemError, SubsystemResult, }; -use polkadot_subsystem::messages::{NetworkBridgeEvent, NetworkBridgeMessage, AllMessages}; -use node_primitives::{ProtocolId, View}; -use polkadot_primitives::v1::{Block, Hash}; +use polkadot_subsystem::messages::{ + NetworkBridgeMessage, AllMessages, AvailabilityDistributionMessage, + BitfieldDistributionMessage, PoVDistributionMessage, StatementDistributionMessage, + CollatorProtocolMessage, +}; +use polkadot_primitives::v1::{Block, Hash, ValidatorId}; +use polkadot_node_network_protocol::{ + ObservedRole, ReputationChange, PeerId, PeerSet, View, NetworkBridgeEvent, v1 as protocol_v1 +}; -use std::collections::btree_map::{BTreeMap, Entry as BEntry}; use std::collections::hash_map::{HashMap, Entry as HEntry}; +use std::iter::ExactSizeIterator; use std::pin::Pin; use std::sync::Arc; @@ -45,15 +49,19 @@ use std::sync::Arc; /// We use the same limit to compute the view sent to peers locally. const MAX_VIEW_HEADS: usize = 5; -/// The engine ID of the polkadot network protocol. -pub const POLKADOT_ENGINE_ID: ConsensusEngineId = *b"dot2"; -/// The protocol name. -pub const POLKADOT_PROTOCOL_NAME: &[u8] = b"/polkadot/2"; +/// The engine ID of the validation protocol. +pub const VALIDATION_PROTOCOL_ID: ConsensusEngineId = *b"pvn1"; +/// The protocol name for the validation peer-set. +pub const VALIDATION_PROTOCOL_NAME: &[u8] = b"/polkadot/validation/1"; +/// The engine ID of the collation protocol. +pub const COLLATION_PROTOCOL_ID: ConsensusEngineId = *b"pcn1"; +/// The protocol name for the collation peer-set. +pub const COLLATION_PROTOCOL_NAME: &[u8] = b"/polkadot/collation/1"; const MALFORMED_MESSAGE_COST: ReputationChange = ReputationChange::new(-500, "Malformed Network-bridge message"); -const UNKNOWN_PROTO_COST: ReputationChange - = ReputationChange::new(-50, "Message sent to unknown protocol"); +const UNCONNECTED_PEERSET_COST: ReputationChange + = ReputationChange::new(-50, "Message sent to un-connected peer-set"); const MALFORMED_VIEW_COST: ReputationChange = ReputationChange::new(-500, "Malformed view"); @@ -62,10 +70,10 @@ const TARGET: &'static str = "network_bridge"; /// Messages received on the network. #[derive(Debug, Encode, Decode, Clone)] -pub enum WireMessage { +pub enum WireMessage { /// A message from a peer on a specific protocol. #[codec(index = "1")] - ProtocolMessage(ProtocolId, Vec), + ProtocolMessage(M), /// A view update from a peer. #[codec(index = "2")] ViewUpdate(View), @@ -73,24 +81,28 @@ pub enum WireMessage { /// Information about the notifications protocol. Should be used during network configuration /// or shortly after startup to register the protocol with the network service. -pub fn notifications_protocol_info() -> (ConsensusEngineId, std::borrow::Cow<'static, [u8]>) { - (POLKADOT_ENGINE_ID, POLKADOT_PROTOCOL_NAME.into()) +pub fn notifications_protocol_info() -> Vec<(ConsensusEngineId, std::borrow::Cow<'static, [u8]>)> { + vec![ + (VALIDATION_PROTOCOL_ID, VALIDATION_PROTOCOL_NAME.into()), + (COLLATION_PROTOCOL_ID, COLLATION_PROTOCOL_NAME.into()), + ] } /// An action to be carried out by the network. -#[derive(PartialEq)] +#[derive(Debug, PartialEq)] pub enum NetworkAction { /// Note a change in reputation for a peer. ReputationChange(PeerId, ReputationChange), - /// Write a notification to a given peer. - WriteNotification(PeerId, Vec), + /// Write a notification to a given peer on the given peer-set. + WriteNotification(PeerId, PeerSet, Vec), } /// An abstraction over networking for the purposes of this subsystem. pub trait Network: Send + 'static { /// Get a stream of all events occurring on the network. This may include events unrelated /// to the Polkadot protocol - the user of this function should filter only for events related - /// to the [`POLKADOT_ENGINE_ID`](POLKADOT_ENGINE_ID). + /// to the [`VALIDATION_PROTOCOL_ID`](VALIDATION_PROTOCOL_ID) + /// or [`COLLATION_PROTOCOL_ID`](COLLATION_PROTOCOL_ID) fn event_stream(&mut self) -> BoxStream<'static, NetworkEvent>; /// Get access to an underlying sink for all network actions. @@ -107,12 +119,12 @@ pub trait Network: Send + 'static { }.boxed() } - /// Write a notification to a peer on the [`POLKADOT_ENGINE_ID`](POLKADOT_ENGINE_ID) topic. - fn write_notification(&mut self, who: PeerId, message: Vec) + /// Write a notification to a peer on the given peer-set's protocol. + fn write_notification(&mut self, who: PeerId, peer_set: PeerSet, message: Vec) -> BoxFuture> { async move { - self.action_sink().send(NetworkAction::WriteNotification(who, message)).await + self.action_sink().send(NetworkAction::WriteNotification(who, peer_set, message)).await }.boxed() } } @@ -143,11 +155,20 @@ impl Network for Arc> { peer, cost_benefit, ), - NetworkAction::WriteNotification(peer, message) => self.0.write_notification( - peer, - POLKADOT_ENGINE_ID, - message, - ), + NetworkAction::WriteNotification(peer, peer_set, message) => { + match peer_set { + PeerSet::Validation => self.0.write_notification( + peer, + VALIDATION_PROTOCOL_ID, + message, + ), + PeerSet::Collation => self.0.write_notification( + peer, + COLLATION_PROTOCOL_ID, + message, + ), + } + } } Ok(()) @@ -197,20 +218,24 @@ impl Subsystem for NetworkBridge struct PeerData { /// Latest view sent by the peer. view: View, - /// The role of the peer. - role: ObservedRole, } #[derive(Debug)] enum Action { - RegisterEventProducer(ProtocolId, fn(NetworkBridgeEvent) -> AllMessages), - SendMessage(Vec, ProtocolId, Vec), + SendValidationMessage(Vec, protocol_v1::ValidationProtocol), + SendCollationMessage(Vec, protocol_v1::CollationProtocol), + ConnectToValidators(PeerSet, Vec, oneshot::Sender>), ReportPeer(PeerId, ReputationChange), + ActiveLeaves(ActiveLeavesUpdate), - PeerConnected(PeerId, ObservedRole), - PeerDisconnected(PeerId), - PeerMessages(PeerId, Vec), + PeerConnected(PeerSet, PeerId, ObservedRole), + PeerDisconnected(PeerSet, PeerId), + PeerMessages( + PeerId, + Vec>, + Vec>, + ), Abort, Nop, @@ -224,11 +249,13 @@ fn action_from_overseer_message( => Action::ActiveLeaves(active_leaves), Ok(FromOverseer::Signal(OverseerSignal::Conclude)) => Action::Abort, Ok(FromOverseer::Communication { msg }) => match msg { - NetworkBridgeMessage::RegisterEventProducer(protocol_id, message_producer) - => Action::RegisterEventProducer(protocol_id, message_producer), NetworkBridgeMessage::ReportPeer(peer, rep) => Action::ReportPeer(peer, rep), - NetworkBridgeMessage::SendMessage(peers, protocol, message) - => Action::SendMessage(peers, protocol, message), + NetworkBridgeMessage::SendValidationMessage(peers, msg) + => Action::SendValidationMessage(peers, msg), + NetworkBridgeMessage::SendCollationMessage(peers, msg) + => Action::SendCollationMessage(peers, msg), + NetworkBridgeMessage::ConnectToValidators(peer_set, validators, res) + => Action::ConnectToValidators(peer_set, validators, res), }, Ok(FromOverseer::Signal(OverseerSignal::BlockFinalized(_))) => Action::Nop, @@ -239,40 +266,55 @@ fn action_from_overseer_message( } } -fn action_from_network_message(event: Option) -> Option { +fn action_from_network_message(event: Option) -> Action { match event { None => { log::info!(target: TARGET, "Shutting down Network Bridge: underlying event stream concluded"); - Some(Action::Abort) + Action::Abort } - Some(NetworkEvent::Dht(_)) => None, + Some(NetworkEvent::Dht(_)) => Action::Nop, Some(NetworkEvent::NotificationStreamOpened { remote, engine_id, role }) => { - if engine_id == POLKADOT_ENGINE_ID { - Some(Action::PeerConnected(remote, role)) - } else { - None + let role = role.into(); + match engine_id { + x if x == VALIDATION_PROTOCOL_ID + => Action::PeerConnected(PeerSet::Validation, remote, role), + x if x == COLLATION_PROTOCOL_ID + => Action::PeerConnected(PeerSet::Collation, remote, role), + _ => Action::Nop, } } Some(NetworkEvent::NotificationStreamClosed { remote, engine_id }) => { - if engine_id == POLKADOT_ENGINE_ID { - Some(Action::PeerDisconnected(remote)) - } else { - None + match engine_id { + x if x == VALIDATION_PROTOCOL_ID + => Action::PeerDisconnected(PeerSet::Validation, remote), + x if x == COLLATION_PROTOCOL_ID + => Action::PeerDisconnected(PeerSet::Collation, remote), + _ => Action::Nop, } } Some(NetworkEvent::NotificationsReceived { remote, messages }) => { - let v: Result, _> = messages.iter() - .filter(|(engine_id, _)| engine_id == &POLKADOT_ENGINE_ID) + let v_messages: Result, _> = messages.iter() + .filter(|(engine_id, _)| engine_id == &VALIDATION_PROTOCOL_ID) + .map(|(_, msg_bytes)| WireMessage::decode(&mut msg_bytes.as_ref())) + .collect(); + + let v_messages = match v_messages { + Err(_) => return Action::ReportPeer(remote, MALFORMED_MESSAGE_COST), + Ok(v) => v, + }; + + let c_messages: Result, _> = messages.iter() + .filter(|(engine_id, _)| engine_id == &COLLATION_PROTOCOL_ID) .map(|(_, msg_bytes)| WireMessage::decode(&mut msg_bytes.as_ref())) .collect(); - match v { - Err(_) => Some(Action::ReportPeer(remote, MALFORMED_MESSAGE_COST)), - Ok(v) => if v.is_empty() { - None + match c_messages { + Err(_) => Action::ReportPeer(remote, MALFORMED_MESSAGE_COST), + Ok(c_messages) => if v_messages.is_empty() && c_messages.is_empty() { + Action::Nop } else { - Some(Action::PeerMessages(remote, v)) - } + Action::PeerMessages(remote, v_messages, c_messages) + }, } } } @@ -282,37 +324,218 @@ fn construct_view(live_heads: &[Hash]) -> View { View(live_heads.iter().rev().take(MAX_VIEW_HEADS).cloned().collect()) } -async fn dispatch_update_to_all( - update: NetworkBridgeEvent, - event_producers: impl IntoIterator AllMessages>, - ctx: &mut impl SubsystemContext, -) -> polkadot_subsystem::SubsystemResult<()> { - // collect messages here to avoid the borrow lasting across await boundary. - let messages: Vec<_> = event_producers.into_iter() - .map(|producer| producer(update.clone())) - .collect(); - - ctx.send_messages(messages).await -} - async fn update_view( - peers: &HashMap, - live_heads: &[Hash], net: &mut impl Network, + ctx: &mut impl SubsystemContext, + live_heads: &[Hash], local_view: &mut View, -) -> SubsystemResult> { + validation_peers: &HashMap, + collation_peers: &HashMap, +) -> SubsystemResult<()> { let new_view = construct_view(live_heads); - if *local_view == new_view { return Ok(None) } + if *local_view == new_view { return Ok(()) } + *local_view = new_view.clone(); - let message = WireMessage::ViewUpdate(new_view.clone()).encode(); + send_validation_message( + net, + validation_peers.keys().cloned(), + WireMessage::ViewUpdate(new_view.clone()), + ).await?; + + send_collation_message( + net, + collation_peers.keys().cloned(), + WireMessage::ViewUpdate(new_view.clone()), + ).await?; + + if let Err(e) = dispatch_validation_event_to_all( + NetworkBridgeEvent::OurViewChange(new_view.clone()), + ctx, + ).await { + log::warn!(target: TARGET, "Aborting - Failure to dispatch messages to overseer"); + return Err(e) + } + + if let Err(e) = dispatch_collation_event_to_all( + NetworkBridgeEvent::OurViewChange(new_view.clone()), + ctx, + ).await { + log::warn!(target: TARGET, "Aborting - Failure to dispatch messages to overseer"); + return Err(e) + } + + Ok(()) +} + +// Handle messages on a specific peer-set. The peer is expected to be connected on that +// peer-set. +async fn handle_peer_messages( + peer: PeerId, + peers: &mut HashMap, + messages: Vec>, + net: &mut impl Network, +) -> SubsystemResult>> { + let peer_data = match peers.get_mut(&peer) { + None => { + net.report_peer(peer, UNCONNECTED_PEERSET_COST).await?; - let notifications = peers.keys().cloned() - .map(move |peer| Ok(NetworkAction::WriteNotification(peer, message.clone()))); + return Ok(Vec::new()); + }, + Some(d) => d, + }; + + let mut outgoing_messages = Vec::with_capacity(messages.len()); + for message in messages { + outgoing_messages.push(match message { + WireMessage::ViewUpdate(new_view) => { + if new_view.0.len() > MAX_VIEW_HEADS { + net.report_peer( + peer.clone(), + MALFORMED_VIEW_COST, + ).await?; + + continue + } else if new_view == peer_data.view { + continue + } else { + peer_data.view = new_view; - net.action_sink().send_all(&mut stream::iter(notifications)).await?; + NetworkBridgeEvent::PeerViewChange( + peer.clone(), + peer_data.view.clone(), + ) + } + } + WireMessage::ProtocolMessage(message) => { + NetworkBridgeEvent::PeerMessage(peer.clone(), message) + } + }) + } - Ok(Some(NetworkBridgeEvent::OurViewChange(local_view.clone()))) + Ok(outgoing_messages) +} + +async fn send_validation_message( + net: &mut impl Network, + peers: I, + message: WireMessage, +) -> SubsystemResult<()> + where + I: IntoIterator, + I::IntoIter: ExactSizeIterator, +{ + send_message(net, peers, PeerSet::Validation, message).await +} + +async fn send_collation_message( + net: &mut impl Network, + peers: I, + message: WireMessage, +) -> SubsystemResult<()> + where + I: IntoIterator, + I::IntoIter: ExactSizeIterator, +{ + send_message(net, peers, PeerSet::Collation, message).await +} + +async fn send_message( + net: &mut impl Network, + peers: I, + peer_set: PeerSet, + message: WireMessage, +) -> SubsystemResult<()> + where + M: Encode + Clone, + I: IntoIterator, + I::IntoIter: ExactSizeIterator, +{ + let mut message_producer = stream::iter({ + let peers = peers.into_iter(); + let n_peers = peers.len(); + let mut message = Some(message.encode()); + + peers.enumerate().map(move |(i, peer)| { + // optimization: avoid cloning the message for the last peer in the + // list. The message payload can be quite large. If the underlying + // network used `Bytes` this would not be necessary. + let message = if i == n_peers - 1 { + message.take() + .expect("Only taken in last iteration of loop, never afterwards; qed") + } else { + message.as_ref() + .expect("Only taken in last iteration of loop, we are not there yet; qed") + .clone() + }; + + Ok(NetworkAction::WriteNotification(peer, peer_set, message)) + }) + }); + + net.action_sink().send_all(&mut message_producer).await +} + +async fn dispatch_validation_event_to_all( + event: NetworkBridgeEvent, + ctx: &mut impl SubsystemContext, +) -> SubsystemResult<()> { + dispatch_validation_events_to_all(std::iter::once(event), ctx).await +} + +async fn dispatch_collation_event_to_all( + event: NetworkBridgeEvent, + ctx: &mut impl SubsystemContext, +) -> SubsystemResult<()> { + dispatch_collation_events_to_all(std::iter::once(event), ctx).await +} + +async fn dispatch_validation_events_to_all( + events: I, + ctx: &mut impl SubsystemContext, +) -> SubsystemResult<()> + where + I: IntoIterator>, + I::IntoIter: Send, +{ + let messages_for = |event: NetworkBridgeEvent| { + let a = std::iter::once(event.focus().ok().map(|m| AllMessages::AvailabilityDistribution( + AvailabilityDistributionMessage::NetworkBridgeUpdateV1(m) + ))); + + let b = std::iter::once(event.focus().ok().map(|m| AllMessages::BitfieldDistribution( + BitfieldDistributionMessage::NetworkBridgeUpdateV1(m) + ))); + + let p = std::iter::once(event.focus().ok().map(|m| AllMessages::PoVDistribution( + PoVDistributionMessage::NetworkBridgeUpdateV1(m) + ))); + + let s = std::iter::once(event.focus().ok().map(|m| AllMessages::StatementDistribution( + StatementDistributionMessage::NetworkBridgeUpdateV1(m) + ))); + + a.chain(b).chain(p).chain(s).filter_map(|x| x) + }; + + ctx.send_messages(events.into_iter().flat_map(messages_for)).await +} + +async fn dispatch_collation_events_to_all( + events: I, + ctx: &mut impl SubsystemContext, +) -> SubsystemResult<()> + where + I: IntoIterator>, + I::IntoIter: Send, +{ + let messages_for = |event: NetworkBridgeEvent| { + event.focus().ok().map(|m| AllMessages::CollatorProtocol( + CollatorProtocolMessage::NetworkBridgeUpdateV1(m) + )) + }; + + ctx.send_messages(events.into_iter().flat_map(messages_for)).await } async fn run_network( @@ -322,11 +545,11 @@ async fn run_network( let mut event_stream = net.event_stream().fuse(); // Most recent heads are at the back. - let mut live_heads = Vec::with_capacity(MAX_VIEW_HEADS); + let mut live_heads: Vec = Vec::with_capacity(MAX_VIEW_HEADS); let mut local_view = View(Vec::new()); - let mut peers: HashMap = HashMap::new(); - let mut event_producers = BTreeMap::new(); + let mut validation_peers: HashMap = HashMap::new(); + let mut collation_peers: HashMap = HashMap::new(); loop { let action = { @@ -334,178 +557,161 @@ async fn run_network( let mut net_event_next = event_stream.next().fuse(); futures::pin_mut!(subsystem_next); - let action = futures::select! { - subsystem_msg = subsystem_next => Some(action_from_overseer_message(subsystem_msg)), + futures::select! { + subsystem_msg = subsystem_next => action_from_overseer_message(subsystem_msg), net_event = net_event_next => action_from_network_message(net_event), - }; - - match action { - Some(a) => a, - None => continue, } }; match action { - Action::RegisterEventProducer(protocol_id, event_producer) => { - // insert only if none present. - if let BEntry::Vacant(entry) = event_producers.entry(protocol_id) { - let event_producer = entry.insert(event_producer); - - // send the event producer information on all connected peers. - let mut messages = Vec::with_capacity(peers.len() * 2); - for (peer, data) in &peers { - messages.push(event_producer( - NetworkBridgeEvent::PeerConnected(peer.clone(), data.role.clone()) - )); - - messages.push(event_producer( - NetworkBridgeEvent::PeerViewChange(peer.clone(), data.view.clone()) - )); - } + Action::Nop => {} + Action::Abort => return Ok(()), - ctx.send_messages(messages).await?; - } + Action::SendValidationMessage(peers, msg) => send_message( + &mut net, + peers, + PeerSet::Validation, + WireMessage::ProtocolMessage(msg), + ).await?, + + Action::SendCollationMessage(peers, msg) => send_message( + &mut net, + peers, + PeerSet::Collation, + WireMessage::ProtocolMessage(msg), + ).await?, + + Action::ConnectToValidators(_peer_set, _validators, _res) => { + // TODO: https://github.com/paritytech/polkadot/issues/1461 } - Action::SendMessage(peers, protocol, message) => { - let mut message_producer = stream::iter({ - let n_peers = peers.len(); - let mut message = Some( - WireMessage::ProtocolMessage(protocol, message).encode() - ); - - peers.iter().cloned().enumerate().map(move |(i, peer)| { - // optimization: avoid cloning the message for the last peer in the - // list. The message payload can be quite large. If the underlying - // network used `Bytes` this would not be necessary. - let message = if i == n_peers - 1 { - message.take() - .expect("Only taken in last iteration of loop, never afterwards; qed") - } else { - message.as_ref() - .expect("Only taken in last iteration of loop, we are not there yet; qed") - .clone() - }; - Ok(NetworkAction::WriteNotification(peer, message)) - }) - }); + Action::ReportPeer(peer, rep) => net.report_peer(peer, rep).await?, - net.action_sink().send_all(&mut message_producer).await?; - } - Action::ReportPeer(peer, rep) => { - net.report_peer(peer, rep).await?; - } Action::ActiveLeaves(ActiveLeavesUpdate { activated, deactivated }) => { live_heads.extend(activated); live_heads.retain(|h| !deactivated.contains(h)); - if let Some(view_update) - = update_view(&peers, &live_heads, &mut net, &mut local_view).await? - { - if let Err(e) = dispatch_update_to_all( - view_update, - event_producers.values(), - &mut ctx, - ).await { - log::warn!(target: TARGET, "Aborting - Failure to dispatch messages to overseer"); - return Err(e) - } - } + update_view( + &mut net, + &mut ctx, + &live_heads, + &mut local_view, + &validation_peers, + &collation_peers, + ).await?; } - Action::PeerConnected(peer, role) => { - match peers.entry(peer.clone()) { + + Action::PeerConnected(peer_set, peer, role) => { + let peer_map = match peer_set { + PeerSet::Validation => &mut validation_peers, + PeerSet::Collation => &mut collation_peers, + }; + + match peer_map.entry(peer.clone()) { HEntry::Occupied(_) => continue, HEntry::Vacant(vacant) => { vacant.insert(PeerData { view: View(Vec::new()), - role: role.clone(), }); - if let Err(e) = dispatch_update_to_all( - NetworkBridgeEvent::PeerConnected(peer, role), - event_producers.values(), - &mut ctx, - ).await { + let res = match peer_set { + PeerSet::Validation => dispatch_validation_events_to_all( + vec![ + NetworkBridgeEvent::PeerConnected(peer.clone(), role), + NetworkBridgeEvent::PeerViewChange( + peer, + View(Default::default()), + ), + ], + &mut ctx, + ).await, + PeerSet::Collation => dispatch_collation_events_to_all( + vec![ + NetworkBridgeEvent::PeerConnected(peer.clone(), role), + NetworkBridgeEvent::PeerViewChange( + peer, + View(Default::default()), + ), + ], + &mut ctx, + ).await, + }; + + if let Err(e) = res { log::warn!("Aborting - Failure to dispatch messages to overseer"); - return Err(e) + return Err(e); } } } } - Action::PeerDisconnected(peer) => { - if peers.remove(&peer).is_some() { - if let Err(e) = dispatch_update_to_all( - NetworkBridgeEvent::PeerDisconnected(peer), - event_producers.values(), - &mut ctx, - ).await { - log::warn!(target: TARGET, "Aborting - Failure to dispatch messages to overseer"); + Action::PeerDisconnected(peer_set, peer) => { + let peer_map = match peer_set { + PeerSet::Validation => &mut validation_peers, + PeerSet::Collation => &mut collation_peers, + }; + + if peer_map.remove(&peer).is_some() { + let res = match peer_set { + PeerSet::Validation => dispatch_validation_event_to_all( + NetworkBridgeEvent::PeerDisconnected(peer), + &mut ctx, + ).await, + PeerSet::Collation => dispatch_collation_event_to_all( + NetworkBridgeEvent::PeerDisconnected(peer), + &mut ctx, + ).await, + }; + + if let Err(e) = res { + log::warn!( + target: TARGET, + "Aborting - Failure to dispatch messages to overseer", + ); return Err(e) } } }, - Action::PeerMessages(peer, messages) => { - let peer_data = match peers.get_mut(&peer) { - None => continue, - Some(d) => d, - }; - - let mut outgoing_messages = Vec::with_capacity(messages.len()); - for message in messages { - match message { - WireMessage::ViewUpdate(new_view) => { - if new_view.0.len() > MAX_VIEW_HEADS { - net.report_peer( - peer.clone(), - MALFORMED_VIEW_COST, - ).await?; - - continue - } - - if new_view == peer_data.view { continue } - peer_data.view = new_view; - - let update = NetworkBridgeEvent::PeerViewChange( - peer.clone(), - peer_data.view.clone(), - ); - - outgoing_messages.extend( - event_producers.values().map(|producer| producer(update.clone())) - ); - } - WireMessage::ProtocolMessage(protocol, message) => { - let message = match event_producers.get(&protocol) { - Some(producer) => Some(producer( - NetworkBridgeEvent::PeerMessage(peer.clone(), message) - )), - None => { - net.report_peer( - peer.clone(), - UNKNOWN_PROTO_COST, - ).await?; - - None - } - }; - - if let Some(message) = message { - outgoing_messages.push(message); - } - } + Action::PeerMessages(peer, v_messages, c_messages) => { + if !v_messages.is_empty() { + let events = handle_peer_messages( + peer.clone(), + &mut validation_peers, + v_messages, + &mut net, + ).await?; + + if let Err(e) = dispatch_validation_events_to_all( + events, + &mut ctx, + ).await { + log::warn!( + target: TARGET, + "Aborting - Failure to dispatch messages to overseer", + ); + return Err(e) } } - let send_messages = ctx.send_messages(outgoing_messages); - if let Err(e) = send_messages.await { - log::warn!(target: TARGET, "Aborting - Failure to dispatch messages to overseer"); - return Err(e) + if !c_messages.is_empty() { + let events = handle_peer_messages( + peer.clone(), + &mut collation_peers, + c_messages, + &mut net, + ).await?; + + if let Err(e) = dispatch_collation_events_to_all( + events, + &mut ctx, + ).await { + log::warn!( + target: TARGET, + "Aborting - Failure to dispatch messages to overseer", + ); + return Err(e) + } } }, - - Action::Abort => return Ok(()), - Action::Nop => (), } } } @@ -521,7 +727,10 @@ mod tests { use assert_matches::assert_matches; use polkadot_subsystem::messages::{StatementDistributionMessage, BitfieldDistributionMessage}; - use polkadot_node_subsystem_test_helpers::{SingleItemSink, SingleItemStream}; + use polkadot_node_subsystem_test_helpers::{ + SingleItemSink, SingleItemStream, TestSubsystemContextHandle, + }; + use sp_keyring::Sr25519Keyring; // The subsystem's view of the network - only supports a single call to `event_stream`. struct TestNetwork { @@ -555,6 +764,13 @@ mod tests { ) } + fn peer_set_engine_id(peer_set: PeerSet) -> ConsensusEngineId { + match peer_set { + PeerSet::Validation => VALIDATION_PROTOCOL_ID, + PeerSet::Collation => COLLATION_PROTOCOL_ID, + } + } + impl Network for TestNetwork { fn event_stream(&mut self) -> BoxStream<'static, NetworkEvent> { self.net_events.lock() @@ -586,25 +802,25 @@ mod tests { v } - async fn connect_peer(&mut self, peer: PeerId, role: ObservedRole) { + async fn connect_peer(&mut self, peer: PeerId, peer_set: PeerSet, role: ObservedRole) { self.send_network_event(NetworkEvent::NotificationStreamOpened { remote: peer, - engine_id: POLKADOT_ENGINE_ID, - role, + engine_id: peer_set_engine_id(peer_set), + role: role.into(), }).await; } - async fn disconnect_peer(&mut self, peer: PeerId) { + async fn disconnect_peer(&mut self, peer: PeerId, peer_set: PeerSet) { self.send_network_event(NetworkEvent::NotificationStreamClosed { remote: peer, - engine_id: POLKADOT_ENGINE_ID, + engine_id: peer_set_engine_id(peer_set), }).await; } - async fn peer_message(&mut self, peer: PeerId, message: Vec) { + async fn peer_message(&mut self, peer: PeerId, peer_set: PeerSet, message: Vec) { self.send_network_event(NetworkEvent::NotificationsReceived { remote: peer, - messages: vec![(POLKADOT_ENGINE_ID, message.into())], + messages: vec![(peer_set_engine_id(peer_set), message.into())], }).await; } @@ -621,7 +837,7 @@ mod tests { struct TestHarness { network_handle: TestNetworkHandle, - virtual_overseer: polkadot_node_subsystem_test_helpers::TestSubsystemContextHandle, + virtual_overseer: TestSubsystemContextHandle, } fn test_harness>(test: impl FnOnce(TestHarness) -> T) { @@ -647,6 +863,51 @@ mod tests { executor::block_on(future::select(test_fut, network_bridge)); } + async fn assert_sends_validation_event_to_all( + event: NetworkBridgeEvent, + virtual_overseer: &mut TestSubsystemContextHandle, + ) { + assert_matches!( + virtual_overseer.recv().await, + AllMessages::AvailabilityDistribution( + AvailabilityDistributionMessage::NetworkBridgeUpdateV1(e) + ) if e == event.focus().expect("could not focus message") + ); + + assert_matches!( + virtual_overseer.recv().await, + AllMessages::BitfieldDistribution( + BitfieldDistributionMessage::NetworkBridgeUpdateV1(e) + ) if e == event.focus().expect("could not focus message") + ); + + assert_matches!( + virtual_overseer.recv().await, + AllMessages::PoVDistribution( + PoVDistributionMessage::NetworkBridgeUpdateV1(e) + ) if e == event.focus().expect("could not focus message") + ); + + assert_matches!( + virtual_overseer.recv().await, + AllMessages::StatementDistribution( + StatementDistributionMessage::NetworkBridgeUpdateV1(e) + ) if e == event.focus().expect("could not focus message") + ); + } + + async fn assert_sends_collation_event_to_all( + event: NetworkBridgeEvent, + virtual_overseer: &mut TestSubsystemContextHandle, + ) { + assert_matches!( + virtual_overseer.recv().await, + AllMessages::CollatorProtocol( + CollatorProtocolMessage::NetworkBridgeUpdateV1(e) + ) if e == event.focus().expect("could not focus message") + ) + } + #[test] fn sends_view_updates_to_peers() { test_harness(|test_harness| async move { @@ -655,23 +916,44 @@ mod tests { let peer_a = PeerId::random(); let peer_b = PeerId::random(); - network_handle.connect_peer(peer_a.clone(), ObservedRole::Full).await; - network_handle.connect_peer(peer_b.clone(), ObservedRole::Full).await; + network_handle.connect_peer( + peer_a.clone(), + PeerSet::Validation, + ObservedRole::Full, + ).await; + network_handle.connect_peer( + peer_b.clone(), + PeerSet::Validation, + ObservedRole::Full, + ).await; let hash_a = Hash::from([1; 32]); - virtual_overseer.send(FromOverseer::Signal(OverseerSignal::ActiveLeaves(ActiveLeavesUpdate::start_work(hash_a)))).await; + virtual_overseer.send( + FromOverseer::Signal(OverseerSignal::ActiveLeaves(ActiveLeavesUpdate::start_work(hash_a))) + ).await; let actions = network_handle.next_network_actions(2).await; - let wire_message = WireMessage::ViewUpdate(View(vec![hash_a])).encode(); + let wire_message = WireMessage::::ViewUpdate( + View(vec![hash_a]) + ).encode(); + assert!(network_actions_contains( &actions, - &NetworkAction::WriteNotification(peer_a, wire_message.clone()), + &NetworkAction::WriteNotification( + peer_a, + PeerSet::Validation, + wire_message.clone(), + ), )); assert!(network_actions_contains( &actions, - &NetworkAction::WriteNotification(peer_b, wire_message.clone()), + &NetworkAction::WriteNotification( + peer_b, + PeerSet::Validation, + wire_message.clone(), + ), )); }); } @@ -686,106 +968,108 @@ mod tests { let peer = PeerId::random(); - let proto_statement = *b"abcd"; - let proto_bitfield = *b"wxyz"; + network_handle.connect_peer(peer.clone(), PeerSet::Validation, ObservedRole::Full).await; - network_handle.connect_peer(peer.clone(), ObservedRole::Full).await; + let view = View(vec![Hash::from([1u8; 32])]); - virtual_overseer.send(FromOverseer::Communication { - msg: NetworkBridgeMessage::RegisterEventProducer( - proto_statement, - |event| AllMessages::StatementDistribution( - StatementDistributionMessage::NetworkBridgeUpdate(event) - ) - ), - }).await; + // bridge will inform about all connected peers. + { + assert_sends_validation_event_to_all( + NetworkBridgeEvent::PeerConnected(peer.clone(), ObservedRole::Full), + &mut virtual_overseer, + ).await; + + assert_sends_validation_event_to_all( + NetworkBridgeEvent::PeerViewChange(peer.clone(), View(Default::default())), + &mut virtual_overseer, + ).await; + } - virtual_overseer.send(FromOverseer::Communication { - msg: NetworkBridgeMessage::RegisterEventProducer( - proto_bitfield, - |event| AllMessages::BitfieldDistribution( - BitfieldDistributionMessage::NetworkBridgeUpdate(event) - ) - ), - }).await; + network_handle.peer_message( + peer.clone(), + PeerSet::Validation, + WireMessage::::ViewUpdate( + view.clone(), + ).encode(), + ).await; - let view = View(vec![Hash::from([1u8; 32])]); + assert_sends_validation_event_to_all( + NetworkBridgeEvent::PeerViewChange(peer.clone(), view), + &mut virtual_overseer, + ).await; + }); + } - // bridge will inform about all previously-connected peers. - { - assert_matches!( - virtual_overseer.recv().await, - AllMessages::StatementDistribution( - StatementDistributionMessage::NetworkBridgeUpdate( - NetworkBridgeEvent::PeerConnected(p, ObservedRole::Full) - ) - ) if p == peer - ); + #[test] + fn peer_messages_sent_via_overseer() { + test_harness(|test_harness| async move { + let TestHarness { + mut network_handle, + mut virtual_overseer, + } = test_harness; - assert_matches!( - virtual_overseer.recv().await, - AllMessages::StatementDistribution( - StatementDistributionMessage::NetworkBridgeUpdate( - NetworkBridgeEvent::PeerViewChange(p, v) - ) - ) if p == peer && v == View(Default::default()) - ); + let peer = PeerId::random(); - assert_matches!( - virtual_overseer.recv().await, - AllMessages::BitfieldDistribution( - BitfieldDistributionMessage::NetworkBridgeUpdate( - NetworkBridgeEvent::PeerConnected(p, ObservedRole::Full) - ) - ) if p == peer - ); + network_handle.connect_peer( + peer.clone(), + PeerSet::Validation, + ObservedRole::Full, + ).await; - assert_matches!( - virtual_overseer.recv().await, - AllMessages::BitfieldDistribution( - BitfieldDistributionMessage::NetworkBridgeUpdate( - NetworkBridgeEvent::PeerViewChange(p, v) - ) - ) if p == peer && v == View(Default::default()) - ); + // bridge will inform about all connected peers. + { + assert_sends_validation_event_to_all( + NetworkBridgeEvent::PeerConnected(peer.clone(), ObservedRole::Full), + &mut virtual_overseer, + ).await; + + assert_sends_validation_event_to_all( + NetworkBridgeEvent::PeerViewChange(peer.clone(), View(Default::default())), + &mut virtual_overseer, + ).await; } + let pov_distribution_message = protocol_v1::PoVDistributionMessage::Awaiting( + [0; 32].into(), + vec![[1; 32].into()], + ); + + let message = protocol_v1::ValidationProtocol::PoVDistribution( + pov_distribution_message.clone(), + ); + network_handle.peer_message( peer.clone(), - WireMessage::ViewUpdate(view.clone()).encode(), + PeerSet::Validation, + WireMessage::ProtocolMessage(message.clone()).encode(), ).await; - // statement distribution message comes first because handlers are ordered by - // protocol ID. + network_handle.disconnect_peer(peer.clone(), PeerSet::Validation).await; - assert_matches!( - virtual_overseer.recv().await, - AllMessages::StatementDistribution( - StatementDistributionMessage::NetworkBridgeUpdate( - NetworkBridgeEvent::PeerViewChange(p, v) - ) - ) => { - assert_eq!(p, peer); - assert_eq!(v, view); - } - ); + // PoV distribution message comes first, and the message is only sent to that subsystem. + // then a disconnection event arises that is sent to all validation networking subsystems. assert_matches!( virtual_overseer.recv().await, - AllMessages::BitfieldDistribution( - BitfieldDistributionMessage::NetworkBridgeUpdate( - NetworkBridgeEvent::PeerViewChange(p, v) + AllMessages::PoVDistribution( + PoVDistributionMessage::NetworkBridgeUpdateV1( + NetworkBridgeEvent::PeerMessage(p, m) ) ) => { assert_eq!(p, peer); - assert_eq!(v, view); + assert_eq!(m, pov_distribution_message); } ); + + assert_sends_validation_event_to_all( + NetworkBridgeEvent::PeerDisconnected(peer), + &mut virtual_overseer, + ).await; }); } #[test] - fn peer_messages_sent_via_overseer() { + fn peer_disconnect_from_just_one_peerset() { test_harness(|test_harness| async move { let TestHarness { mut network_handle, @@ -794,103 +1078,310 @@ mod tests { let peer = PeerId::random(); - let proto_statement = *b"abcd"; - let proto_bitfield = *b"wxyz"; + network_handle.connect_peer(peer.clone(), PeerSet::Validation, ObservedRole::Full).await; + network_handle.connect_peer(peer.clone(), PeerSet::Collation, ObservedRole::Full).await; - network_handle.connect_peer(peer.clone(), ObservedRole::Full).await; + // bridge will inform about all connected peers. + { + assert_sends_validation_event_to_all( + NetworkBridgeEvent::PeerConnected(peer.clone(), ObservedRole::Full), + &mut virtual_overseer, + ).await; + + assert_sends_validation_event_to_all( + NetworkBridgeEvent::PeerViewChange(peer.clone(), View(Default::default())), + &mut virtual_overseer, + ).await; + } - virtual_overseer.send(FromOverseer::Communication { - msg: NetworkBridgeMessage::RegisterEventProducer( - proto_statement, - |event| AllMessages::StatementDistribution( - StatementDistributionMessage::NetworkBridgeUpdate(event) - ) - ), - }).await; + { + assert_sends_collation_event_to_all( + NetworkBridgeEvent::PeerConnected(peer.clone(), ObservedRole::Full), + &mut virtual_overseer, + ).await; + + assert_sends_collation_event_to_all( + NetworkBridgeEvent::PeerViewChange(peer.clone(), View(Default::default())), + &mut virtual_overseer, + ).await; + } - virtual_overseer.send(FromOverseer::Communication { - msg: NetworkBridgeMessage::RegisterEventProducer( - proto_bitfield, - |event| AllMessages::BitfieldDistribution( - BitfieldDistributionMessage::NetworkBridgeUpdate(event) - ) + network_handle.disconnect_peer(peer.clone(), PeerSet::Validation).await; + + assert_sends_validation_event_to_all( + NetworkBridgeEvent::PeerDisconnected(peer.clone()), + &mut virtual_overseer, + ).await; + + // to show that we're still connected on the collation protocol, send a view update. + + let hash_a = Hash::from([1; 32]); + + virtual_overseer.send( + FromOverseer::Signal(OverseerSignal::ActiveLeaves(ActiveLeavesUpdate::start_work(hash_a))) + ).await; + + let actions = network_handle.next_network_actions(1).await; + let wire_message = WireMessage::::ViewUpdate( + View(vec![hash_a]) + ).encode(); + + assert!(network_actions_contains( + &actions, + &NetworkAction::WriteNotification( + peer.clone(), + PeerSet::Collation, + wire_message.clone(), ), - }).await; + )); + }); + } - // bridge will inform about all previously-connected peers. - { - assert_matches!( - virtual_overseer.recv().await, - AllMessages::StatementDistribution( - StatementDistributionMessage::NetworkBridgeUpdate( - NetworkBridgeEvent::PeerConnected(p, ObservedRole::Full) - ) - ) if p == peer - ); + #[test] + fn relays_collation_protocol_messages() { + test_harness(|test_harness| async move { + let TestHarness { + mut network_handle, + mut virtual_overseer, + } = test_harness; - assert_matches!( - virtual_overseer.recv().await, - AllMessages::StatementDistribution( - StatementDistributionMessage::NetworkBridgeUpdate( - NetworkBridgeEvent::PeerViewChange(p, v) - ) - ) if p == peer && v == View(Default::default()) - ); + let peer_a = PeerId::random(); + let peer_b = PeerId::random(); - assert_matches!( - virtual_overseer.recv().await, - AllMessages::BitfieldDistribution( - BitfieldDistributionMessage::NetworkBridgeUpdate( - NetworkBridgeEvent::PeerConnected(p, ObservedRole::Full) - ) - ) if p == peer - ); + network_handle.connect_peer(peer_a.clone(), PeerSet::Validation, ObservedRole::Full).await; + network_handle.connect_peer(peer_b.clone(), PeerSet::Collation, ObservedRole::Full).await; - assert_matches!( - virtual_overseer.recv().await, - AllMessages::BitfieldDistribution( - BitfieldDistributionMessage::NetworkBridgeUpdate( - NetworkBridgeEvent::PeerViewChange(p, v) - ) - ) if p == peer && v == View(Default::default()) - ); + // bridge will inform about all connected peers. + { + assert_sends_validation_event_to_all( + NetworkBridgeEvent::PeerConnected(peer_a.clone(), ObservedRole::Full), + &mut virtual_overseer, + ).await; + + assert_sends_validation_event_to_all( + NetworkBridgeEvent::PeerViewChange(peer_a.clone(), View(Default::default())), + &mut virtual_overseer, + ).await; } - let payload = vec![1, 2, 3]; + { + assert_sends_collation_event_to_all( + NetworkBridgeEvent::PeerConnected(peer_b.clone(), ObservedRole::Full), + &mut virtual_overseer, + ).await; + + assert_sends_collation_event_to_all( + NetworkBridgeEvent::PeerViewChange(peer_b.clone(), View(Default::default())), + &mut virtual_overseer, + ).await; + } + + // peer A gets reported for sending a collation message. + + let collator_protocol_message = protocol_v1::CollatorProtocolMessage::Declare( + Sr25519Keyring::Alice.public().into() + ); + + let message = protocol_v1::CollationProtocol::CollatorProtocol( + collator_protocol_message.clone() + ); network_handle.peer_message( - peer.clone(), - WireMessage::ProtocolMessage(proto_statement, payload.clone()).encode(), + peer_a.clone(), + PeerSet::Collation, + WireMessage::ProtocolMessage(message.clone()).encode(), ).await; - network_handle.disconnect_peer(peer.clone()).await; + let actions = network_handle.next_network_actions(1).await; + assert!(network_actions_contains( + &actions, + &NetworkAction::ReputationChange( + peer_a.clone(), + UNCONNECTED_PEERSET_COST, + ), + )); + + // peer B has the message relayed. - // statement distribution message comes first because handlers are ordered by - // protocol ID, and then a disconnection event comes - indicating that the message - // was only sent to the correct protocol. + network_handle.peer_message( + peer_b.clone(), + PeerSet::Collation, + WireMessage::ProtocolMessage(message.clone()).encode(), + ).await; assert_matches!( virtual_overseer.recv().await, - AllMessages::StatementDistribution( - StatementDistributionMessage::NetworkBridgeUpdate( + AllMessages::CollatorProtocol( + CollatorProtocolMessage::NetworkBridgeUpdateV1( NetworkBridgeEvent::PeerMessage(p, m) ) ) => { - assert_eq!(p, peer); - assert_eq!(m, payload); + assert_eq!(p, peer_b); + assert_eq!(m, collator_protocol_message); } ); + }); + } - assert_matches!( - virtual_overseer.recv().await, - AllMessages::StatementDistribution( - StatementDistributionMessage::NetworkBridgeUpdate( - NetworkBridgeEvent::PeerDisconnected(p) + #[test] + fn different_views_on_different_peer_sets() { + test_harness(|test_harness| async move { + let TestHarness { + mut network_handle, + mut virtual_overseer, + } = test_harness; + + let peer = PeerId::random(); + + network_handle.connect_peer(peer.clone(), PeerSet::Validation, ObservedRole::Full).await; + network_handle.connect_peer(peer.clone(), PeerSet::Collation, ObservedRole::Full).await; + + // bridge will inform about all connected peers. + { + assert_sends_validation_event_to_all( + NetworkBridgeEvent::PeerConnected(peer.clone(), ObservedRole::Full), + &mut virtual_overseer, + ).await; + + assert_sends_validation_event_to_all( + NetworkBridgeEvent::PeerViewChange(peer.clone(), View(Default::default())), + &mut virtual_overseer, + ).await; + } + + { + assert_sends_collation_event_to_all( + NetworkBridgeEvent::PeerConnected(peer.clone(), ObservedRole::Full), + &mut virtual_overseer, + ).await; + + assert_sends_collation_event_to_all( + NetworkBridgeEvent::PeerViewChange(peer.clone(), View(Default::default())), + &mut virtual_overseer, + ).await; + } + + let view_a = View(vec![[1; 32].into()]); + let view_b = View(vec![[2; 32].into()]); + + network_handle.peer_message( + peer.clone(), + PeerSet::Validation, + WireMessage::::ViewUpdate(view_a.clone()).encode(), + ).await; + + network_handle.peer_message( + peer.clone(), + PeerSet::Collation, + WireMessage::::ViewUpdate(view_b.clone()).encode(), + ).await; + + assert_sends_validation_event_to_all( + NetworkBridgeEvent::PeerViewChange(peer.clone(), view_a.clone()), + &mut virtual_overseer, + ).await; + + assert_sends_collation_event_to_all( + NetworkBridgeEvent::PeerViewChange(peer.clone(), view_b.clone()), + &mut virtual_overseer, + ).await; + }); + } + + #[test] + fn send_messages_to_peers() { + test_harness(|test_harness| async move { + let TestHarness { + mut network_handle, + mut virtual_overseer, + } = test_harness; + + let peer = PeerId::random(); + + network_handle.connect_peer(peer.clone(), PeerSet::Validation, ObservedRole::Full).await; + network_handle.connect_peer(peer.clone(), PeerSet::Collation, ObservedRole::Full).await; + + // bridge will inform about all connected peers. + { + assert_sends_validation_event_to_all( + NetworkBridgeEvent::PeerConnected(peer.clone(), ObservedRole::Full), + &mut virtual_overseer, + ).await; + + assert_sends_validation_event_to_all( + NetworkBridgeEvent::PeerViewChange(peer.clone(), View(Default::default())), + &mut virtual_overseer, + ).await; + } + + { + assert_sends_collation_event_to_all( + NetworkBridgeEvent::PeerConnected(peer.clone(), ObservedRole::Full), + &mut virtual_overseer, + ).await; + + assert_sends_collation_event_to_all( + NetworkBridgeEvent::PeerViewChange(peer.clone(), View(Default::default())), + &mut virtual_overseer, + ).await; + } + + // send a validation protocol message. + + { + let pov_distribution_message = protocol_v1::PoVDistributionMessage::Awaiting( + [0; 32].into(), + vec![[1; 32].into()], + ); + + let message = protocol_v1::ValidationProtocol::PoVDistribution( + pov_distribution_message.clone(), + ); + + virtual_overseer.send(FromOverseer::Communication { + msg: NetworkBridgeMessage::SendValidationMessage( + vec![peer.clone()], + message.clone(), ) - ) => { - assert_eq!(p, peer); - } - ); + }).await; + + assert_eq!( + network_handle.next_network_action().await, + NetworkAction::WriteNotification( + peer.clone(), + PeerSet::Validation, + WireMessage::ProtocolMessage(message).encode(), + ) + ); + } + + // send a collation protocol message. + + { + let collator_protocol_message = protocol_v1::CollatorProtocolMessage::Declare( + Sr25519Keyring::Alice.public().into() + ); + + let message = protocol_v1::CollationProtocol::CollatorProtocol( + collator_protocol_message.clone() + ); + + virtual_overseer.send(FromOverseer::Communication { + msg: NetworkBridgeMessage::SendCollationMessage( + vec![peer.clone()], + message.clone(), + ) + }).await; + + assert_eq!( + network_handle.next_network_action().await, + NetworkAction::WriteNotification( + peer.clone(), + PeerSet::Collation, + WireMessage::ProtocolMessage(message).encode(), + ) + ); + } }); } } diff --git a/node/network/pov-distribution/Cargo.toml b/node/network/pov-distribution/Cargo.toml index 74a566f35d..cedc94732c 100644 --- a/node/network/pov-distribution/Cargo.toml +++ b/node/network/pov-distribution/Cargo.toml @@ -12,9 +12,9 @@ streamunordered = "0.5.1" polkadot-primitives = { path = "../../../primitives" } node-primitives = { package = "polkadot-node-primitives", path = "../../primitives" } parity-scale-codec = "1.3.4" -sc-network = { git = "https://github.com/paritytech/substrate", branch = "master" } sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "master" } polkadot-subsystem = { package = "polkadot-node-subsystem", path = "../../subsystem" } +polkadot-node-network-protocol = { path = "../../network/protocol" } [dev-dependencies] parking_lot = "0.10.0" diff --git a/node/network/pov-distribution/src/lib.rs b/node/network/pov-distribution/src/lib.rs index 9589e2fad9..994090c0d5 100644 --- a/node/network/pov-distribution/src/lib.rs +++ b/node/network/pov-distribution/src/lib.rs @@ -24,21 +24,20 @@ use polkadot_subsystem::{ ActiveLeavesUpdate, OverseerSignal, SubsystemContext, Subsystem, SubsystemResult, FromOverseer, SpawnedSubsystem, }; use polkadot_subsystem::messages::{ - PoVDistributionMessage, NetworkBridgeEvent, ReputationChange as Rep, PeerId, - RuntimeApiMessage, RuntimeApiRequest, AllMessages, NetworkBridgeMessage, + PoVDistributionMessage, RuntimeApiMessage, RuntimeApiRequest, AllMessages, NetworkBridgeMessage, +}; +use polkadot_node_network_protocol::{ + v1 as protocol_v1, ReputationChange as Rep, NetworkBridgeEvent, PeerId, View, }; -use node_primitives::{View, ProtocolId}; use futures::prelude::*; use futures::channel::oneshot; -use parity_scale_codec::{Encode, Decode}; use std::collections::{hash_map::{Entry, HashMap}, HashSet}; use std::sync::Arc; const COST_APPARENT_FLOOD: Rep = Rep::new(-500, "Peer appears to be flooding us with PoV requests"); const COST_UNEXPECTED_POV: Rep = Rep::new(-500, "Peer sent us an unexpected PoV"); -const COST_MALFORMED_MESSAGE: Rep = Rep::new(-500, "Peer sent us a malformed message"); const COST_AWAITED_NOT_IN_VIEW: Rep = Rep::new(-100, "Peer claims to be awaiting something outside of its view"); @@ -46,20 +45,6 @@ const BENEFIT_FRESH_POV: Rep = Rep::new(25, "Peer supplied us with an awaited Po const BENEFIT_LATE_POV: Rep = Rep::new(10, "Peer supplied us with an awaited PoV, \ but was not the first to do so"); -const PROTOCOL_V1: ProtocolId = *b"pvd1"; - -#[derive(Encode, Decode)] -enum WireMessage { - /// Notification that we are awaiting the given PoVs (by hash) against a - /// specific relay-parent hash. - #[codec(index = "0")] - Awaiting(Hash, Vec), - /// Notification of an awaited PoV, in a given relay-parent context. - /// (relay_parent, pov_hash, pov) - #[codec(index = "1")] - SendPoV(Hash, Hash, PoV), -} - /// The PoV Distribution Subsystem. pub struct PoVDistribution; @@ -98,6 +83,22 @@ struct PeerState { awaited: HashMap>, } +fn awaiting_message(relay_parent: Hash, awaiting: Vec) + -> protocol_v1::ValidationProtocol +{ + protocol_v1::ValidationProtocol::PoVDistribution( + protocol_v1::PoVDistributionMessage::Awaiting(relay_parent, awaiting) + ) +} + +fn send_pov_message(relay_parent: Hash, pov_hash: Hash, pov: PoV) + -> protocol_v1::ValidationProtocol +{ + protocol_v1::ValidationProtocol::PoVDistribution( + protocol_v1::PoVDistributionMessage::SendPoV(relay_parent, pov_hash, pov) + ) +} + /// Handles the signal. If successful, returns `true` if the subsystem should conclude, /// `false` otherwise. async fn handle_signal( @@ -169,11 +170,10 @@ async fn notify_all_we_are_awaiting( if peers_to_send.is_empty() { return Ok(()) } - let payload = WireMessage::Awaiting(relay_parent, vec![pov_hash]).encode(); + let payload = awaiting_message(relay_parent, vec![pov_hash]); - ctx.send_message(AllMessages::NetworkBridge(NetworkBridgeMessage::SendMessage( + ctx.send_message(AllMessages::NetworkBridge(NetworkBridgeMessage::SendValidationMessage( peers_to_send, - PROTOCOL_V1, payload, ))).await } @@ -194,11 +194,10 @@ async fn notify_one_we_are_awaiting_many( if awaiting_hashes.is_empty() { return Ok(()) } - let payload = WireMessage::Awaiting(relay_parent, awaiting_hashes).encode(); + let payload = awaiting_message(relay_parent, awaiting_hashes); - ctx.send_message(AllMessages::NetworkBridge(NetworkBridgeMessage::SendMessage( + ctx.send_message(AllMessages::NetworkBridge(NetworkBridgeMessage::SendValidationMessage( vec![peer.clone()], - PROTOCOL_V1, payload, ))).await } @@ -226,11 +225,10 @@ async fn distribute_to_awaiting( if peers_to_send.is_empty() { return Ok(()) } - let payload = WireMessage::SendPoV(relay_parent, pov_hash, pov.clone()).encode(); + let payload = send_pov_message(relay_parent, pov_hash, pov.clone()); - ctx.send_message(AllMessages::NetworkBridge(NetworkBridgeMessage::SendMessage( + ctx.send_message(AllMessages::NetworkBridge(NetworkBridgeMessage::SendValidationMessage( peers_to_send, - PROTOCOL_V1, payload, ))).await } @@ -361,11 +359,10 @@ async fn handle_awaiting( // For all requested PoV hashes, if we have it, we complete the request immediately. // Otherwise, we note that the peer is awaiting the PoV. if let Some(pov) = relay_parent_state.known.get(&pov_hash) { - ctx.send_message(AllMessages::NetworkBridge(NetworkBridgeMessage::SendMessage( - vec![peer.clone()], - PROTOCOL_V1, - WireMessage::SendPoV(relay_parent, pov_hash, (&**pov).clone()).encode(), - ))).await?; + let payload = send_pov_message(relay_parent, pov_hash, (&**pov).clone()); + ctx.send_message(AllMessages::NetworkBridge( + NetworkBridgeMessage::SendValidationMessage(vec![peer.clone()], payload) + )).await?; } else { peer_awaiting.insert(pov_hash); } @@ -449,7 +446,7 @@ async fn handle_incoming_pov( async fn handle_network_update( state: &mut State, ctx: &mut impl SubsystemContext, - update: NetworkBridgeEvent, + update: NetworkBridgeEvent, ) -> SubsystemResult<()> { match update { NetworkBridgeEvent::PeerConnected(peer, _observed_role) => { @@ -483,17 +480,18 @@ async fn handle_network_update( Ok(()) } - NetworkBridgeEvent::PeerMessage(peer, bytes) => { - match WireMessage::decode(&mut &bytes[..]) { - Ok(msg) => match msg { - WireMessage::Awaiting(relay_parent, pov_hashes) => handle_awaiting( + NetworkBridgeEvent::PeerMessage(peer, message) => { + match message { + protocol_v1::PoVDistributionMessage::Awaiting(relay_parent, pov_hashes) + => handle_awaiting( state, ctx, peer, relay_parent, pov_hashes, ).await, - WireMessage::SendPoV(relay_parent, pov_hash, pov) => handle_incoming_pov( + protocol_v1::PoVDistributionMessage::SendPoV(relay_parent, pov_hash, pov) + => handle_incoming_pov( state, ctx, peer, @@ -501,11 +499,6 @@ async fn handle_network_update( pov_hash, pov, ).await, - }, - Err(_) => { - report_peer(ctx, peer, COST_MALFORMED_MESSAGE).await?; - Ok(()) - } } } NetworkBridgeEvent::OurViewChange(view) => { @@ -515,19 +508,9 @@ async fn handle_network_update( } } -fn network_update_message(update: NetworkBridgeEvent) -> AllMessages { - AllMessages::PoVDistribution(PoVDistributionMessage::NetworkBridgeUpdate(update)) -} - async fn run( mut ctx: impl SubsystemContext, ) -> SubsystemResult<()> { - // startup: register the network protocol with the bridge. - ctx.send_message(AllMessages::NetworkBridge(NetworkBridgeMessage::RegisterEventProducer( - PROTOCOL_V1, - network_update_message, - ))).await?; - let mut state = State { relay_parent_state: HashMap::new(), peer_state: HashMap::new(), @@ -556,7 +539,7 @@ async fn run( descriptor, pov, ).await?, - PoVDistributionMessage::NetworkBridgeUpdate(event) => + PoVDistributionMessage::NetworkBridgeUpdateV1(event) => handle_network_update( &mut state, &mut ctx, @@ -661,13 +644,12 @@ mod tests { assert_matches!( handle.recv().await, AllMessages::NetworkBridge( - NetworkBridgeMessage::SendMessage(peers, protocol, message) + NetworkBridgeMessage::SendValidationMessage(peers, message) ) => { assert_eq!(peers, vec![peer_a.clone()]); - assert_eq!(protocol, PROTOCOL_V1); assert_eq!( message, - WireMessage::SendPoV(hash_a, pov_hash, pov.clone()).encode(), + send_pov_message(hash_a, pov_hash, pov.clone()), ); } ) @@ -737,13 +719,12 @@ mod tests { assert_matches!( handle.recv().await, AllMessages::NetworkBridge( - NetworkBridgeMessage::SendMessage(peers, protocol, message) + NetworkBridgeMessage::SendValidationMessage(peers, message) ) => { assert_eq!(peers, vec![peer_a.clone()]); - assert_eq!(protocol, PROTOCOL_V1); assert_eq!( message, - WireMessage::Awaiting(hash_a, vec![pov_hash]).encode(), + awaiting_message(hash_a, vec![pov_hash]), ); } ) @@ -809,13 +790,12 @@ mod tests { assert_matches!( handle.recv().await, AllMessages::NetworkBridge( - NetworkBridgeMessage::SendMessage(peers, protocol, message) + NetworkBridgeMessage::SendValidationMessage(peers, message) ) => { assert_eq!(peers, vec![peer_a.clone()]); - assert_eq!(protocol, PROTOCOL_V1); assert_eq!( message, - WireMessage::Awaiting(hash_a, vec![pov_a_hash]).encode(), + awaiting_message(hash_a, vec![pov_a_hash]), ); } ) @@ -878,8 +858,8 @@ mod tests { &mut ctx, NetworkBridgeEvent::PeerMessage( peer_a.clone(), - WireMessage::SendPoV(hash_a, pov_hash, pov.clone()).encode(), - ), + send_pov_message(hash_a, pov_hash, pov.clone()), + ).focus().unwrap(), ).await.unwrap(); handle_network_update( @@ -887,8 +867,8 @@ mod tests { &mut ctx, NetworkBridgeEvent::PeerMessage( peer_b.clone(), - WireMessage::SendPoV(hash_a, pov_hash, pov.clone()).encode(), - ), + send_pov_message(hash_a, pov_hash, pov.clone()), + ).focus().unwrap(), ).await.unwrap(); assert_eq!(&*pov_recv.await.unwrap(), &pov); @@ -966,8 +946,8 @@ mod tests { &mut ctx, NetworkBridgeEvent::PeerMessage( peer_a.clone(), - WireMessage::SendPoV(hash_a, pov_hash, bad_pov.clone()).encode(), - ), + send_pov_message(hash_a, pov_hash, bad_pov.clone()), + ).focus().unwrap(), ).await.unwrap(); // didn't complete our sender. @@ -1029,8 +1009,8 @@ mod tests { &mut ctx, NetworkBridgeEvent::PeerMessage( peer_a.clone(), - WireMessage::SendPoV(hash_a, pov_hash, pov.clone()).encode(), - ), + send_pov_message(hash_a, pov_hash, pov.clone()), + ).focus().unwrap(), ).await.unwrap(); assert_matches!( @@ -1090,8 +1070,8 @@ mod tests { &mut ctx, NetworkBridgeEvent::PeerMessage( peer_a.clone(), - WireMessage::SendPoV(hash_b, pov_hash, pov.clone()).encode(), - ), + send_pov_message(hash_b, pov_hash, pov.clone()), + ).focus().unwrap(), ).await.unwrap(); assert_matches!( @@ -1152,8 +1132,8 @@ mod tests { &mut ctx, NetworkBridgeEvent::PeerMessage( peer_a.clone(), - WireMessage::Awaiting(hash_a, vec![pov_hash]).encode(), - ), + awaiting_message(hash_a, vec![pov_hash]), + ).focus().unwrap(), ).await.unwrap(); } @@ -1166,8 +1146,8 @@ mod tests { &mut ctx, NetworkBridgeEvent::PeerMessage( peer_a.clone(), - WireMessage::Awaiting(hash_a, vec![last_pov_hash]).encode(), - ), + awaiting_message(hash_a, vec![last_pov_hash]), + ).focus().unwrap(), ).await.unwrap(); // No more bookkeeping for you! @@ -1235,8 +1215,8 @@ mod tests { &mut ctx, NetworkBridgeEvent::PeerMessage( peer_a.clone(), - WireMessage::Awaiting(hash_b, vec![pov_hash]).encode(), - ), + awaiting_message(hash_b, vec![pov_hash]), + ).focus().unwrap(), ).await.unwrap(); assert!(state.peer_state[&peer_a].awaited.get(&hash_b).is_none()); @@ -1297,8 +1277,8 @@ mod tests { &mut ctx, NetworkBridgeEvent::PeerMessage( peer_a.clone(), - WireMessage::Awaiting(hash_b, vec![pov_hash]).encode(), - ), + awaiting_message(hash_b, vec![pov_hash]), + ).focus().unwrap(), ).await.unwrap(); // Illegal `awaited` is ignored. @@ -1371,8 +1351,8 @@ mod tests { &mut ctx, NetworkBridgeEvent::PeerMessage( peer_a.clone(), - WireMessage::SendPoV(hash_a, pov_hash, pov.clone()).encode(), - ), + send_pov_message(hash_a, pov_hash, pov.clone()), + ).focus().unwrap(), ).await.unwrap(); assert_eq!(&*pov_recv.await.unwrap(), &pov); @@ -1390,13 +1370,12 @@ mod tests { assert_matches!( handle.recv().await, AllMessages::NetworkBridge( - NetworkBridgeMessage::SendMessage(peers, protocol, message) + NetworkBridgeMessage::SendValidationMessage(peers, message) ) => { assert_eq!(peers, vec![peer_b.clone()]); - assert_eq!(protocol, PROTOCOL_V1); assert_eq!( message, - WireMessage::SendPoV(hash_a, pov_hash, pov.clone()).encode(), + send_pov_message(hash_a, pov_hash, pov.clone()), ); } ); @@ -1454,8 +1433,8 @@ mod tests { &mut ctx, NetworkBridgeEvent::PeerMessage( peer_a.clone(), - WireMessage::SendPoV(hash_a, pov_hash, pov.clone()).encode(), - ), + send_pov_message(hash_a, pov_hash, pov.clone()), + ).focus().unwrap(), ).await.unwrap(); assert_eq!(&*pov_recv.await.unwrap(), &pov); diff --git a/node/network/protocol/Cargo.toml b/node/network/protocol/Cargo.toml new file mode 100644 index 0000000000..abcb6ae2ad --- /dev/null +++ b/node/network/protocol/Cargo.toml @@ -0,0 +1,14 @@ +[package] +name = "polkadot-node-network-protocol" +version = "0.1.0" +authors = ["Parity Technologies "] +edition = "2018" +description = "Primitives types for the Node-side" + +[dependencies] +polkadot-primitives = { path = "../../../primitives" } +polkadot-node-primitives = { path = "../../primitives" } +parity-scale-codec = { version = "1.3.4", default-features = false, features = ["derive"] } +runtime_primitives = { package = "sp-runtime", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +sp-core = { git = "https://github.com/paritytech/substrate", branch = "master" } +sc-network = { git = "https://github.com/paritytech/substrate", branch = "master" } diff --git a/node/network/protocol/src/lib.rs b/node/network/protocol/src/lib.rs new file mode 100644 index 0000000000..7658048ca5 --- /dev/null +++ b/node/network/protocol/src/lib.rs @@ -0,0 +1,269 @@ +// Copyright 2020 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 . + +//! Network protocol types for parachains. + +use polkadot_primitives::v1::Hash; +use parity_scale_codec::{Encode, Decode}; +use std::convert::TryFrom; + +pub use sc_network::{ReputationChange, PeerId}; + +/// A unique identifier of a request. +pub type RequestId = u64; + +/// A version of the protocol. +pub type ProtocolVersion = u32; + +/// An error indicating that this the over-arching message type had the wrong variant +#[derive(Debug, Clone, Copy, PartialEq)] +pub struct WrongVariant; + +/// The peer-sets that the network manages. Different subsystems will use different peer-sets. +#[derive(Debug, Clone, Copy, PartialEq)] +pub enum PeerSet { + /// The validation peer-set is responsible for all messages related to candidate validation and communication among validators. + Validation, + /// The collation peer-set is used for validator<>collator communication. + Collation, +} + +/// The advertised role of a node. +#[derive(Debug, Clone, Copy, PartialEq)] +pub enum ObservedRole { + /// A light node. + Light, + /// A full node. + Full, + /// A node claiming to be an authority (unauthenticated) + Authority, +} + +impl From for ObservedRole { + fn from(role: sc_network::ObservedRole) -> ObservedRole { + match role { + sc_network::ObservedRole::Light => ObservedRole::Light, + sc_network::ObservedRole::Authority => ObservedRole::Authority, + sc_network::ObservedRole::Full + | sc_network::ObservedRole::OurSentry + | sc_network::ObservedRole::OurGuardedAuthority + => ObservedRole::Full, + } + } +} + +impl Into for ObservedRole { + fn into(self) -> sc_network::ObservedRole { + match self { + ObservedRole::Light => sc_network::ObservedRole::Light, + ObservedRole::Full => sc_network::ObservedRole::Full, + ObservedRole::Authority => sc_network::ObservedRole::Authority, + } + } +} + +/// Events from network. +#[derive(Debug, Clone, PartialEq)] +pub enum NetworkBridgeEvent { + /// A peer has connected. + PeerConnected(PeerId, ObservedRole), + + /// A peer has disconnected. + PeerDisconnected(PeerId), + + /// Peer has sent a message. + PeerMessage(PeerId, M), + + /// Peer's `View` has changed. + PeerViewChange(PeerId, View), + + /// Our `View` has changed. + OurViewChange(View), +} + +macro_rules! impl_try_from { + ($m_ty:ident, $variant:ident, $out:ty) => { + impl TryFrom<$m_ty> for $out { + type Error = crate::WrongVariant; + + #[allow(unreachable_patterns)] // when there is only one variant + fn try_from(x: $m_ty) -> Result<$out, Self::Error> { + match x { + $m_ty::$variant(y) => Ok(y), + _ => Err(crate::WrongVariant), + } + } + } + + impl<'a> TryFrom<&'a $m_ty> for &'a $out { + type Error = crate::WrongVariant; + + fn try_from(x: &'a $m_ty) -> Result<&'a $out, Self::Error> { + #[allow(unreachable_patterns)] // when there is only one variant + match *x { + $m_ty::$variant(ref y) => Ok(y), + _ => Err(crate::WrongVariant), + } + } + } + } +} + +impl NetworkBridgeEvent { + /// Focus an overarching network-bridge event into some more specific variant. + /// + /// This acts as a call to `clone`, except in the case where the event is a message event, + /// in which case the clone can be expensive and it only clones if the message type can + /// be focused. + pub fn focus<'a, T>(&'a self) -> Result, WrongVariant> + where T: 'a + Clone, &'a T: TryFrom<&'a M, Error = WrongVariant> + { + Ok(match *self { + NetworkBridgeEvent::PeerConnected(ref peer, ref role) + => NetworkBridgeEvent::PeerConnected(peer.clone(), role.clone()), + NetworkBridgeEvent::PeerDisconnected(ref peer) + => NetworkBridgeEvent::PeerDisconnected(peer.clone()), + NetworkBridgeEvent::PeerMessage(ref peer, ref msg) + => NetworkBridgeEvent::PeerMessage(peer.clone(), <&'a T>::try_from(msg)?.clone()), + NetworkBridgeEvent::PeerViewChange(ref peer, ref view) + => NetworkBridgeEvent::PeerViewChange(peer.clone(), view.clone()), + NetworkBridgeEvent::OurViewChange(ref view) + => NetworkBridgeEvent::OurViewChange(view.clone()), + }) + } +} + +/// A succinct representation of a peer's view. This consists of a bounded amount of chain heads. +/// +/// Up to `N` (5?) chain heads. +#[derive(Default, Debug, Clone, PartialEq, Eq, Encode, Decode)] +pub struct View(pub Vec); + +impl View { + /// Returns an iterator of the hashes present in `Self` but not in `other`. + pub fn difference<'a>(&'a self, other: &'a View) -> impl Iterator + 'a { + self.0.iter().filter(move |h| !other.contains(h)) + } + + /// An iterator containing hashes present in both `Self` and in `other`. + pub fn intersection<'a>(&'a self, other: &'a View) -> impl Iterator + 'a { + self.0.iter().filter(move |h| other.contains(h)) + } + + /// Whether the view contains a given hash. + pub fn contains(&self, hash: &Hash) -> bool { + self.0.contains(hash) + } +} + +/// v1 protocol types. +pub mod v1 { + use polkadot_primitives::v1::{ + Hash, CollatorId, Id as ParaId, ErasureChunk, CandidateReceipt, + SignedAvailabilityBitfield, PoV, + }; + use polkadot_node_primitives::SignedFullStatement; + use parity_scale_codec::{Encode, Decode}; + use std::convert::TryFrom; + use super::RequestId; + + /// Network messages used by the availability distribution subsystem + #[derive(Debug, Clone, Encode, Decode, PartialEq)] + pub enum AvailabilityDistributionMessage { + /// An erasure chunk for a given candidate hash. + #[codec(index = "0")] + Chunk(Hash, ErasureChunk), + } + + /// Network messages used by the bitfield distribution subsystem. + #[derive(Debug, Clone, Encode, Decode, PartialEq)] + pub enum BitfieldDistributionMessage { + /// A signed availability bitfield for a given relay-parent hash. + #[codec(index = "0")] + Bitfield(Hash, SignedAvailabilityBitfield), + } + + /// Network messages used by the PoV distribution subsystem. + #[derive(Debug, Clone, Encode, Decode, PartialEq)] + pub enum PoVDistributionMessage { + /// Notification that we are awaiting the given PoVs (by hash) against a + /// specific relay-parent hash. + #[codec(index = "0")] + Awaiting(Hash, Vec), + /// Notification of an awaited PoV, in a given relay-parent context. + /// (relay_parent, pov_hash, pov) + #[codec(index = "1")] + SendPoV(Hash, Hash, PoV), + } + + /// Network messages used by the statement distribution subsystem. + #[derive(Debug, Clone, Encode, Decode, PartialEq)] + pub enum StatementDistributionMessage { + /// A signed full statement under a given relay-parent. + #[codec(index = "0")] + Statement(Hash, SignedFullStatement) + } + + /// Network messages used by the collator protocol subsystem + #[derive(Debug, Clone, Encode, Decode, PartialEq)] + pub enum CollatorProtocolMessage { + /// Declare the intent to advertise collations under a collator ID. + #[codec(index = "0")] + Declare(CollatorId), + /// Advertise a collation to a validator. Can only be sent once the peer has declared + /// that they are a collator with given ID. + #[codec(index = "1")] + AdvertiseCollation(Hash, ParaId), + /// Request the advertised collation at that relay-parent. + #[codec(index = "2")] + RequestCollation(RequestId, Hash, ParaId), + /// A requested collation. + #[codec(index = "3")] + Collation(RequestId, CandidateReceipt, PoV), + } + + /// All network messages on the validation peer-set. + #[derive(Debug, Clone, Encode, Decode, PartialEq)] + pub enum ValidationProtocol { + /// Availability distribution messages + #[codec(index = "0")] + AvailabilityDistribution(AvailabilityDistributionMessage), + /// Bitfield distribution messages + #[codec(index = "1")] + BitfieldDistribution(BitfieldDistributionMessage), + /// PoV Distribution messages + #[codec(index = "2")] + PoVDistribution(PoVDistributionMessage), + /// Statement distribution messages + #[codec(index = "3")] + StatementDistribution(StatementDistributionMessage), + } + + impl_try_from!(ValidationProtocol, AvailabilityDistribution, AvailabilityDistributionMessage); + impl_try_from!(ValidationProtocol, BitfieldDistribution, BitfieldDistributionMessage); + impl_try_from!(ValidationProtocol, PoVDistribution, PoVDistributionMessage); + impl_try_from!(ValidationProtocol, StatementDistribution, StatementDistributionMessage); + + /// All network messages on the collation peer-set. + #[derive(Debug, Clone, Encode, Decode, PartialEq)] + pub enum CollationProtocol { + /// Collator protocol messages + #[codec(index = "0")] + CollatorProtocol(CollatorProtocolMessage), + } + + impl_try_from!(CollationProtocol, CollatorProtocol, CollatorProtocolMessage); +} diff --git a/node/network/statement-distribution/Cargo.toml b/node/network/statement-distribution/Cargo.toml index 6dfaee78bb..c92fdcf6db 100644 --- a/node/network/statement-distribution/Cargo.toml +++ b/node/network/statement-distribution/Cargo.toml @@ -16,6 +16,7 @@ parity-scale-codec = "1.3.4" sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "master" } sp-staking = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } polkadot-subsystem = { package = "polkadot-node-subsystem", path = "../../subsystem" } +polkadot-node-network-protocol = { path = "../../network/protocol" } arrayvec = "0.5.1" indexmap = "1.4.0" diff --git a/node/network/statement-distribution/src/lib.rs b/node/network/statement-distribution/src/lib.rs index f58e6da4d4..3f8e6842a8 100644 --- a/node/network/statement-distribution/src/lib.rs +++ b/node/network/statement-distribution/src/lib.rs @@ -24,15 +24,16 @@ use polkadot_subsystem::{ ActiveLeavesUpdate, FromOverseer, OverseerSignal, }; use polkadot_subsystem::messages::{ - AllMessages, NetworkBridgeMessage, NetworkBridgeEvent, StatementDistributionMessage, - PeerId, ReputationChange as Rep, CandidateBackingMessage, RuntimeApiMessage, - RuntimeApiRequest, + AllMessages, NetworkBridgeMessage, StatementDistributionMessage, CandidateBackingMessage, + RuntimeApiMessage, RuntimeApiRequest, }; -use node_primitives::{ProtocolId, View, SignedFullStatement}; +use node_primitives::SignedFullStatement; use polkadot_primitives::v1::{ Hash, CompactStatement, ValidatorIndex, ValidatorId, SigningContext, ValidatorSignature, }; -use parity_scale_codec::{Encode, Decode}; +use polkadot_node_network_protocol::{ + v1 as protocol_v1, View, PeerId, ReputationChange as Rep, NetworkBridgeEvent, +}; use futures::prelude::*; use futures::channel::oneshot; @@ -40,11 +41,8 @@ use indexmap::IndexSet; use std::collections::{HashMap, HashSet}; -const PROTOCOL_V1: ProtocolId = *b"sdn1"; - const COST_UNEXPECTED_STATEMENT: Rep = Rep::new(-100, "Unexpected Statement"); const COST_INVALID_SIGNATURE: Rep = Rep::new(-500, "Invalid Statement Signature"); -const COST_INVALID_MESSAGE: Rep = Rep::new(-500, "Invalid message"); const COST_DUPLICATE_STATEMENT: Rep = Rep::new(-250, "Statement sent more than once by peer"); const COST_APPARENT_FLOOD: Rep = Rep::new(-1000, "Peer appears to be flooding us with statements"); @@ -77,10 +75,6 @@ impl Subsystem for StatementDistribution } } -fn network_update_message(n: NetworkBridgeEvent) -> AllMessages { - AllMessages::StatementDistribution(StatementDistributionMessage::NetworkBridgeUpdate(n)) -} - /// Tracks our impression of a single peer's view of the candidates a validator has seconded /// for a given relay-parent. /// @@ -480,13 +474,6 @@ fn check_statement_signature( .and_then(|v| statement.check_signature(&signing_context, v)) } -#[derive(Encode, Decode)] -enum WireMessage { - /// relay-parent, full statement. - #[codec(index = "0")] - Statement(Hash, SignedFullStatement), -} - /// Places the statement in storage if it is new, and then /// circulates the statement to all peers who have not seen it yet, and /// sends all statements dependent on that statement to peers who could previously not receive @@ -534,6 +521,14 @@ async fn circulate_statement_and_dependents( Ok(()) } +fn statement_message(relay_parent: Hash, statement: SignedFullStatement) + -> protocol_v1::ValidationProtocol +{ + protocol_v1::ValidationProtocol::StatementDistribution( + protocol_v1::StatementDistributionMessage::Statement(relay_parent, statement) + ) +} + /// Circulates a statement to all peers who have not seen it yet, and returns /// an iterator over peers who need to have dependent statements sent. async fn circulate_statement( @@ -554,10 +549,9 @@ async fn circulate_statement( // Send all these peers the initial statement. if !peers_to_send.is_empty() { - let payload = WireMessage::Statement(relay_parent, stored.statement.clone()).encode(); - ctx.send_message(AllMessages::NetworkBridge(NetworkBridgeMessage::SendMessage( + let payload = statement_message(relay_parent, stored.statement.clone()); + ctx.send_message(AllMessages::NetworkBridge(NetworkBridgeMessage::SendValidationMessage( peers_to_send.keys().cloned().collect(), - PROTOCOL_V1, payload, ))).await?; } @@ -580,16 +574,14 @@ async fn send_statements_about( ) -> SubsystemResult<()> { for statement in active_head.statements_about(candidate_hash) { if peer_data.send(&relay_parent, &statement.fingerprint()).is_some() { - let payload = WireMessage::Statement( + let payload = statement_message( relay_parent, statement.statement.clone(), - ).encode(); + ); - ctx.send_message(AllMessages::NetworkBridge(NetworkBridgeMessage::SendMessage( - vec![peer.clone()], - PROTOCOL_V1, - payload, - ))).await?; + ctx.send_message(AllMessages::NetworkBridge( + NetworkBridgeMessage::SendValidationMessage(vec![peer.clone()], payload) + )).await?; } } @@ -606,16 +598,14 @@ async fn send_statements( ) -> SubsystemResult<()> { for statement in active_head.statements() { if peer_data.send(&relay_parent, &statement.fingerprint()).is_some() { - let payload = WireMessage::Statement( + let payload = statement_message( relay_parent, statement.statement.clone(), - ).encode(); + ); - ctx.send_message(AllMessages::NetworkBridge(NetworkBridgeMessage::SendMessage( - vec![peer.clone()], - PROTOCOL_V1, - payload, - ))).await?; + ctx.send_message(AllMessages::NetworkBridge( + NetworkBridgeMessage::SendValidationMessage(vec![peer.clone()], payload) + )).await?; } } @@ -643,11 +633,10 @@ async fn handle_incoming_message<'a>( our_view: &View, active_heads: &'a mut HashMap, ctx: &mut impl SubsystemContext, - message: Vec, + message: protocol_v1::StatementDistributionMessage, ) -> SubsystemResult> { - let (relay_parent, statement) = match WireMessage::decode(&mut &message[..]) { - Err(_) => return report_peer(ctx, peer, COST_INVALID_MESSAGE).await.map(|_| None), - Ok(WireMessage::Statement(r, s)) => (r, s), + let (relay_parent, statement) = match message { + protocol_v1::StatementDistributionMessage::Statement(r, s) => (r, s), }; if !our_view.contains(&relay_parent) { @@ -750,7 +739,7 @@ async fn handle_network_update( active_heads: &mut HashMap, ctx: &mut impl SubsystemContext, our_view: &mut View, - update: NetworkBridgeEvent, + update: NetworkBridgeEvent, ) -> SubsystemResult<()> { match update { NetworkBridgeEvent::PeerConnected(peer, _role) => { @@ -827,12 +816,6 @@ async fn handle_network_update( async fn run( mut ctx: impl SubsystemContext, ) -> SubsystemResult<()> { - // startup: register the network protocol with the bridge. - ctx.send_message(AllMessages::NetworkBridge(NetworkBridgeMessage::RegisterEventProducer( - PROTOCOL_V1, - network_update_message, - ))).await?; - let mut peers: HashMap = HashMap::new(); let mut our_view = View::default(); let mut active_heads: HashMap = HashMap::new(); @@ -897,13 +880,14 @@ async fn run( relay_parent, statement, ).await?, - StatementDistributionMessage::NetworkBridgeUpdate(event) => handle_network_update( - &mut peers, - &mut active_heads, - &mut ctx, - &mut our_view, - event, - ).await?, + StatementDistributionMessage::NetworkBridgeUpdateV1(event) => + handle_network_update( + &mut peers, + &mut active_heads, + &mut ctx, + &mut our_view, + event, + ).await?, } } } @@ -1272,19 +1256,16 @@ mod tests { for statement in active_head.statements_about(candidate_hash) { let message = handle.recv().await; let expected_to = vec![peer.clone()]; - let expected_protocol = PROTOCOL_V1; let expected_payload - = WireMessage::Statement(hash_c, statement.statement.clone()).encode(); + = statement_message(hash_c, statement.statement.clone()); assert_matches!( message, - AllMessages::NetworkBridge(NetworkBridgeMessage::SendMessage( + AllMessages::NetworkBridge(NetworkBridgeMessage::SendValidationMessage( to, - protocol, payload, )) => { assert_eq!(to, expected_to); - assert_eq!(protocol, expected_protocol); assert_eq!(payload, expected_payload) } ) @@ -1383,19 +1364,17 @@ mod tests { let message = handle.recv().await; assert_matches!( message, - AllMessages::NetworkBridge(NetworkBridgeMessage::SendMessage( + AllMessages::NetworkBridge(NetworkBridgeMessage::SendValidationMessage( to, - protocol, payload, )) => { assert_eq!(to.len(), 2); assert!(to.contains(&peer_b)); assert!(to.contains(&peer_c)); - assert_eq!(protocol, PROTOCOL_V1); assert_eq!( payload, - WireMessage::Statement(hash_b, statement.statement.clone()).encode(), + statement_message(hash_b, statement.statement.clone()), ); } ) diff --git a/node/overseer/examples/minimal-example.rs b/node/overseer/examples/minimal-example.rs index c1eab3d8a8..3b12da323b 100644 --- a/node/overseer/examples/minimal-example.rs +++ b/node/overseer/examples/minimal-example.rs @@ -145,6 +145,7 @@ fn main() { candidate_validation: Subsystem2, candidate_backing: Subsystem1, candidate_selection: DummySubsystem, + collator_protocol: DummySubsystem, statement_distribution: DummySubsystem, availability_distribution: DummySubsystem, bitfield_signing: DummySubsystem, diff --git a/node/overseer/src/lib.rs b/node/overseer/src/lib.rs index dac25ab522..d4931baa33 100644 --- a/node/overseer/src/lib.rs +++ b/node/overseer/src/lib.rs @@ -78,7 +78,7 @@ use polkadot_subsystem::messages::{ CandidateValidationMessage, CandidateBackingMessage, CandidateSelectionMessage, ChainApiMessage, StatementDistributionMessage, AvailabilityDistributionMessage, BitfieldSigningMessage, BitfieldDistributionMessage, - ProvisionerMessage, PoVDistributionMessage, RuntimeApiMessage, + ProvisionerMessage, PoVDistributionMessage, RuntimeApiMessage, CollatorProtocolMessage, AvailabilityStoreMessage, NetworkBridgeMessage, AllMessages, }; pub use polkadot_subsystem::{ @@ -333,6 +333,9 @@ pub struct Overseer { /// A candidate selection subsystem. candidate_selection_subsystem: OverseenSubsystem, + /// A collator protocol subsystem + collator_protocol_subsystem: OverseenSubsystem, + /// A statement distribution subsystem. statement_distribution_subsystem: OverseenSubsystem, @@ -395,13 +398,15 @@ pub struct Overseer { /// /// [`Subsystem`]: trait.Subsystem.html /// [`DummySubsystem`]: struct.DummySubsystem.html -pub struct AllSubsystems { +pub struct AllSubsystems { /// A candidate validation subsystem. pub candidate_validation: CV, /// A candidate backing subsystem. pub candidate_backing: CB, /// A candidate selection subsystem. pub candidate_selection: CS, + /// A collator protocol subsystem. + pub collator_protocol: CP, /// A statement distribution subsystem. pub statement_distribution: SD, /// An availability distribution subsystem. @@ -494,6 +499,7 @@ where /// candidate_validation: ValidationSubsystem, /// candidate_backing: DummySubsystem, /// candidate_selection: DummySubsystem, + /// collator_protocol: DummySubsystem, /// statement_distribution: DummySubsystem, /// availability_distribution: DummySubsystem, /// bitfield_signing: DummySubsystem, @@ -524,15 +530,16 @@ where /// # /// # }); } /// ``` - pub fn new( + pub fn new( leaves: impl IntoIterator, - all_subsystems: AllSubsystems, + all_subsystems: AllSubsystems, mut s: S, ) -> SubsystemResult<(Self, OverseerHandler)> where CV: Subsystem> + Send, CB: Subsystem> + Send, CS: Subsystem> + Send, + CP: Subsystem> + Send, SD: Subsystem> + Send, AD: Subsystem> + Send, BS: Subsystem> + Send, @@ -574,6 +581,13 @@ where all_subsystems.candidate_selection, )?; + let collator_protocol_subsystem = spawn( + &mut s, + &mut running_subsystems, + &mut running_subsystems_rx, + all_subsystems.collator_protocol, + )?; + let statement_distribution_subsystem = spawn( &mut s, &mut running_subsystems, @@ -655,6 +669,7 @@ where candidate_validation_subsystem, candidate_backing_subsystem, candidate_selection_subsystem, + collator_protocol_subsystem, statement_distribution_subsystem, availability_distribution_subsystem, bitfield_signing_subsystem, @@ -690,6 +705,10 @@ where let _ = s.tx.send(FromOverseer::Signal(OverseerSignal::Conclude)).await; } + if let Some(ref mut s) = self.collator_protocol_subsystem.instance { + let _ = s.tx.send(FromOverseer::Signal(OverseerSignal::Conclude)).await; + } + if let Some(ref mut s) = self.statement_distribution_subsystem.instance { let _ = s.tx.send(FromOverseer::Signal(OverseerSignal::Conclude)).await; } @@ -844,6 +863,10 @@ where s.tx.send(FromOverseer::Signal(signal.clone())).await?; } + if let Some(ref mut s) = self.collator_protocol_subsystem.instance { + s.tx.send(FromOverseer::Signal(signal.clone())).await?; + } + if let Some(ref mut s) = self.statement_distribution_subsystem.instance { s.tx.send(FromOverseer::Signal(signal.clone())).await?; } @@ -900,6 +923,11 @@ where let _ = s.tx.send(FromOverseer::Communication { msg }).await; } } + AllMessages::CollatorProtocol(msg) => { + if let Some(ref mut s) = self.collator_protocol_subsystem.instance { + let _ = s.tx.send(FromOverseer::Communication { msg }).await; + } + } AllMessages::StatementDistribution(msg) => { if let Some(ref mut s) = self.statement_distribution_subsystem.instance { let _ = s.tx.send(FromOverseer::Communication { msg }).await; @@ -1102,6 +1130,7 @@ mod tests { candidate_validation: TestSubsystem1(s1_tx), candidate_backing: TestSubsystem2(s2_tx), candidate_selection: DummySubsystem, + collator_protocol: DummySubsystem, statement_distribution: DummySubsystem, availability_distribution: DummySubsystem, bitfield_signing: DummySubsystem, @@ -1166,6 +1195,7 @@ mod tests { candidate_validation: TestSubsystem1(s1_tx), candidate_backing: TestSubsystem4, candidate_selection: DummySubsystem, + collator_protocol: DummySubsystem, statement_distribution: DummySubsystem, availability_distribution: DummySubsystem, bitfield_signing: DummySubsystem, @@ -1283,6 +1313,7 @@ mod tests { candidate_validation: TestSubsystem5(tx_5), candidate_backing: TestSubsystem6(tx_6), candidate_selection: DummySubsystem, + collator_protocol: DummySubsystem, statement_distribution: DummySubsystem, availability_distribution: DummySubsystem, bitfield_signing: DummySubsystem, @@ -1385,6 +1416,7 @@ mod tests { candidate_validation: TestSubsystem5(tx_5), candidate_backing: TestSubsystem6(tx_6), candidate_selection: DummySubsystem, + collator_protocol: DummySubsystem, statement_distribution: DummySubsystem, availability_distribution: DummySubsystem, bitfield_signing: DummySubsystem, diff --git a/node/primitives/src/lib.rs b/node/primitives/src/lib.rs index 2e5f993a7e..2bcc7a3926 100644 --- a/node/primitives/src/lib.rs +++ b/node/primitives/src/lib.rs @@ -258,29 +258,3 @@ impl std::convert::TryFrom for MisbehaviorReport { } } } - -/// A unique identifier for a network protocol. -pub type ProtocolId = [u8; 4]; - -/// A succinct representation of a peer's view. This consists of a bounded amount of chain heads. -/// -/// Up to `N` (5?) chain heads. -#[derive(Default, Debug, Clone, PartialEq, Eq, Encode, Decode)] -pub struct View(pub Vec); - -impl View { - /// Returns an iterator of the hashes present in `Self` but not in `other`. - pub fn difference<'a>(&'a self, other: &'a View) -> impl Iterator + 'a { - self.0.iter().filter(move |h| !other.contains(h)) - } - - /// An iterator containing hashes present in both `Self` and in `other`. - pub fn intersection<'a>(&'a self, other: &'a View) -> impl Iterator + 'a { - self.0.iter().filter(move |h| other.contains(h)) - } - - /// Whether the view contains a given hash. - pub fn contains(&self, hash: &Hash) -> bool { - self.0.contains(hash) - } -} diff --git a/node/service/src/lib.rs b/node/service/src/lib.rs index df4bd64b8a..ca350454f0 100644 --- a/node/service/src/lib.rs +++ b/node/service/src/lib.rs @@ -281,6 +281,7 @@ fn real_overseer( candidate_validation: DummySubsystem, candidate_backing: DummySubsystem, candidate_selection: DummySubsystem, + collator_protocol: DummySubsystem, statement_distribution: DummySubsystem, availability_distribution: DummySubsystem, bitfield_signing: DummySubsystem, diff --git a/node/subsystem/Cargo.toml b/node/subsystem/Cargo.toml index 3e676cb4f1..6ad013c177 100644 --- a/node/subsystem/Cargo.toml +++ b/node/subsystem/Cargo.toml @@ -15,6 +15,7 @@ parity-scale-codec = "1.3.4" parking_lot = { version = "0.10.0", optional = true } pin-project = "0.4.22" polkadot-node-primitives = { path = "../primitives" } +polkadot-node-network-protocol = { path = "../network/protocol" } polkadot-primitives = { path = "../../primitives" } polkadot-statement-table = { path = "../../statement-table" } sc-network = { git = "https://github.com/paritytech/substrate", branch = "master" } diff --git a/node/subsystem/src/messages.rs b/node/subsystem/src/messages.rs index ae1d429d75..6081312401 100644 --- a/node/subsystem/src/messages.rs +++ b/node/subsystem/src/messages.rs @@ -25,7 +25,7 @@ use futures::channel::{mpsc, oneshot}; use polkadot_primitives::v1::{ - Hash, CommittedCandidateReceipt, + Hash, CommittedCandidateReceipt, CollatorId, CandidateReceipt, PoV, ErasureChunk, BackedCandidate, Id as ParaId, SignedAvailabilityBitfield, ValidatorId, ValidationCode, ValidatorIndex, CoreAssignment, CoreOccupied, CandidateDescriptor, @@ -34,12 +34,13 @@ use polkadot_primitives::v1::{ CandidateEvent, SessionIndex, BlockNumber, }; use polkadot_node_primitives::{ - MisbehaviorReport, SignedFullStatement, View, ProtocolId, ValidationResult, + MisbehaviorReport, SignedFullStatement, ValidationResult, +}; +use polkadot_node_network_protocol::{ + v1 as protocol_v1, NetworkBridgeEvent, ReputationChange, PeerId, PeerSet, }; use std::sync::Arc; -pub use sc_network::{ObservedRole, ReputationChange, PeerId}; - /// A notification of a new backed candidate. #[derive(Debug)] pub struct NewBackedCandidate(pub BackedCandidate); @@ -142,45 +143,71 @@ impl CandidateValidationMessage { } } -/// Events from network. -#[derive(Debug, Clone)] -pub enum NetworkBridgeEvent { - /// A peer has connected. - PeerConnected(PeerId, ObservedRole), - - /// A peer has disconnected. - PeerDisconnected(PeerId), - - /// Peer has sent a message. - PeerMessage(PeerId, Vec), - /// Peer's `View` has changed. - PeerViewChange(PeerId, View), +/// Messages received by the Collator Protocol subsystem. +#[derive(Debug)] +pub enum CollatorProtocolMessage { + /// Signal to the collator protocol that it should connect to validators with the expectation + /// of collating on the given para. This is only expected to be called once, early on, if at all, + /// and only by the Collation Generation subsystem. As such, it will overwrite the value of + /// the previous signal. + /// + /// This should be sent before any `DistributeCollation` message. + CollateOn(ParaId), + /// Provide a collation to distribute to validators. + DistributeCollation(CandidateReceipt, PoV), + /// Fetch a collation under the given relay-parent for the given ParaId. + FetchCollation(Hash, ParaId, oneshot::Sender<(CandidateReceipt, PoV)>), + /// Report a collator as having provided an invalid collation. This should lead to disconnect + /// and blacklist of the collator. + ReportCollator(CollatorId), + /// Note a collator as having provided a good collation. + NoteGoodCollation(CollatorId), + /// Get a network bridge update. + NetworkBridgeUpdateV1(NetworkBridgeEvent), +} - /// Our `View` has changed. - OurViewChange(View), +impl CollatorProtocolMessage { + /// If the current variant contains the relay parent hash, return it. + pub fn relay_parent(&self) -> Option { + match self { + Self::CollateOn(_) => None, + Self::DistributeCollation(receipt, _) => Some(receipt.descriptor().relay_parent), + Self::FetchCollation(relay_parent, _, _) => Some(*relay_parent), + Self::ReportCollator(_) => None, + Self::NoteGoodCollation(_) => None, + Self::NetworkBridgeUpdateV1(_) => None, + } + } } /// Messages received by the network bridge subsystem. #[derive(Debug)] pub enum NetworkBridgeMessage { - /// Register an event producer on startup. - RegisterEventProducer(ProtocolId, fn(NetworkBridgeEvent) -> AllMessages), - /// Report a peer for their actions. ReportPeer(PeerId, ReputationChange), - /// Send a message to multiple peers. - SendMessage(Vec, ProtocolId, Vec), + /// Send a message to one or more peers on the validation peer-set. + SendValidationMessage(Vec, protocol_v1::ValidationProtocol), + + /// Send a message to one or more peers on the collation peer-set. + SendCollationMessage(Vec, protocol_v1::CollationProtocol), + + /// Connect to peers who represent the given `ValidatorId`s at the given relay-parent. + /// + /// Also accepts a response channel by which the issuer can learn the `PeerId`s of those + /// validators. + ConnectToValidators(PeerSet, Vec, oneshot::Sender>), } impl NetworkBridgeMessage { /// If the current variant contains the relay parent hash, return it. pub fn relay_parent(&self) -> Option { match self { - Self::RegisterEventProducer(_, _) => None, Self::ReportPeer(_, _) => None, - Self::SendMessage(_, _, _) => None, + Self::SendValidationMessage(_, _) => None, + Self::SendCollationMessage(_, _) => None, + Self::ConnectToValidators(_, _, _) => None, } } } @@ -189,14 +216,14 @@ impl NetworkBridgeMessage { #[derive(Debug)] pub enum AvailabilityDistributionMessage { /// Event from the network bridge. - NetworkBridgeUpdate(NetworkBridgeEvent), + NetworkBridgeUpdateV1(NetworkBridgeEvent), } impl AvailabilityDistributionMessage { /// If the current variant contains the relay parent hash, return it. pub fn relay_parent(&self) -> Option { match self { - Self::NetworkBridgeUpdate(_) => None, + Self::NetworkBridgeUpdateV1(_) => None, } } } @@ -208,7 +235,7 @@ pub enum BitfieldDistributionMessage { DistributeBitfield(Hash, SignedAvailabilityBitfield), /// Event from the network bridge. - NetworkBridgeUpdate(NetworkBridgeEvent), + NetworkBridgeUpdateV1(NetworkBridgeEvent), } impl BitfieldDistributionMessage { @@ -216,7 +243,7 @@ impl BitfieldDistributionMessage { pub fn relay_parent(&self) -> Option { match self { Self::DistributeBitfield(hash, _) => Some(*hash), - Self::NetworkBridgeUpdate(_) => None, + Self::NetworkBridgeUpdateV1(_) => None, } } } @@ -391,7 +418,7 @@ pub enum StatementDistributionMessage { /// given relay-parent hash and it should be distributed to other validators. Share(Hash, SignedFullStatement), /// Event from the network bridge. - NetworkBridgeUpdate(NetworkBridgeEvent), + NetworkBridgeUpdateV1(NetworkBridgeEvent), } impl StatementDistributionMessage { @@ -399,7 +426,7 @@ impl StatementDistributionMessage { pub fn relay_parent(&self) -> Option { match self { Self::Share(hash, _) => Some(*hash), - Self::NetworkBridgeUpdate(_) => None, + Self::NetworkBridgeUpdateV1(_) => None, } } } @@ -464,7 +491,7 @@ pub enum PoVDistributionMessage { /// The PoV should correctly hash to the PoV hash mentioned in the CandidateDescriptor DistributePoV(Hash, CandidateDescriptor, Arc), /// An update from the network bridge. - NetworkBridgeUpdate(NetworkBridgeEvent), + NetworkBridgeUpdateV1(NetworkBridgeEvent), } impl PoVDistributionMessage { @@ -473,7 +500,7 @@ impl PoVDistributionMessage { match self { Self::FetchPoV(hash, _, _) => Some(*hash), Self::DistributePoV(hash, _, _) => Some(*hash), - Self::NetworkBridgeUpdate(_) => None, + Self::NetworkBridgeUpdateV1(_) => None, } } } @@ -487,6 +514,10 @@ pub enum AllMessages { CandidateBacking(CandidateBackingMessage), /// Message for the candidate selection subsystem. CandidateSelection(CandidateSelectionMessage), + /// Message for the Chain API subsystem. + ChainApi(ChainApiMessage), + /// Message for the Collator Protocol subsystem. + CollatorProtocol(CollatorProtocolMessage), /// Message for the statement distribution subsystem. StatementDistribution(StatementDistributionMessage), /// Message for the availability distribution subsystem. @@ -505,6 +536,4 @@ pub enum AllMessages { AvailabilityStore(AvailabilityStoreMessage), /// Message for the network bridge subsystem. NetworkBridge(NetworkBridgeMessage), - /// Message for the Chain API subsystem. - ChainApi(ChainApiMessage), } -- GitLab From 305355d5c1ebdd5d85fb95cad84a643fc65c0b0f Mon Sep 17 00:00:00 2001 From: Federico Gimenez Date: Wed, 12 Aug 2020 14:09:52 +0200 Subject: [PATCH 166/192] pre-redenomination tockenSymbol change (#1561) --- service/res/polkadot.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/service/res/polkadot.json b/service/res/polkadot.json index 4f5b99fa88..9d6742d5ce 100644 --- a/service/res/polkadot.json +++ b/service/res/polkadot.json @@ -22,7 +22,7 @@ "properties": { "ss58Format": 0, "tokenDecimals": 12, - "tokenSymbol": "DOT" + "tokenSymbol": "DOT (old)" }, "forkBlocks": null, "badBlocks": null, -- GitLab From 4867851345b5f74f47878513da65afbc0971bff2 Mon Sep 17 00:00:00 2001 From: mattrutherford <44339188+mattrutherford@users.noreply.github.com> Date: Wed, 12 Aug 2020 13:15:11 +0100 Subject: [PATCH 167/192] Companion PR for substrate #6672 (#1560) * update Cargo.lock * "Update Substrate" Co-authored-by: Matt Rutherford Co-authored-by: parity-processbot <> --- Cargo.lock | 423 +++++++++++++++++++++++++++++++---------------------- 1 file changed, 251 insertions(+), 172 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index ab125cb005..6b41d54242 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1395,7 +1395,7 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "fork-tree" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" +source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" dependencies = [ "parity-scale-codec", ] @@ -1403,7 +1403,7 @@ dependencies = [ [[package]] name = "frame-benchmarking" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" +source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" dependencies = [ "frame-support", "frame-system", @@ -1420,7 +1420,7 @@ dependencies = [ [[package]] name = "frame-benchmarking-cli" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" +source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" dependencies = [ "frame-benchmarking", "parity-scale-codec", @@ -1438,7 +1438,7 @@ dependencies = [ [[package]] name = "frame-executive" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" +source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" dependencies = [ "frame-support", "frame-system", @@ -1453,7 +1453,7 @@ dependencies = [ [[package]] name = "frame-metadata" version = "11.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" +source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" dependencies = [ "parity-scale-codec", "serde", @@ -1464,7 +1464,7 @@ dependencies = [ [[package]] name = "frame-support" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" +source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" dependencies = [ "bitmask", "frame-metadata", @@ -1489,7 +1489,7 @@ dependencies = [ [[package]] name = "frame-support-procedural" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" +source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" dependencies = [ "frame-support-procedural-tools", "proc-macro2 1.0.18", @@ -1500,7 +1500,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" +source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" dependencies = [ "frame-support-procedural-tools-derive", "proc-macro-crate", @@ -1512,7 +1512,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools-derive" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" +source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" dependencies = [ "proc-macro2 1.0.18", "quote 1.0.7", @@ -1522,7 +1522,7 @@ dependencies = [ [[package]] name = "frame-system" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" +source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" dependencies = [ "frame-support", "impl-trait-for-tuples", @@ -1538,7 +1538,7 @@ dependencies = [ [[package]] name = "frame-system-benchmarking" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" +source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" dependencies = [ "frame-benchmarking", "frame-support", @@ -1552,7 +1552,7 @@ dependencies = [ [[package]] name = "frame-system-rpc-runtime-api" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" +source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" dependencies = [ "parity-scale-codec", "sp-api", @@ -3107,6 +3107,15 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3e2e65a1a2e43cfcb47a895c4c8b10d1f4a61097f9f254f183aee60cad9c651d" +[[package]] +name = "matchers" +version = "0.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f099785f7595cc4b4553a174ce30dd7589ef93391ff414dbb67f62392b9e0ce1" +dependencies = [ + "regex-automata", +] + [[package]] name = "matches" version = "0.1.8" @@ -3542,7 +3551,7 @@ dependencies = [ [[package]] name = "pallet-authority-discovery" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" +source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" dependencies = [ "frame-support", "frame-system", @@ -3558,7 +3567,7 @@ dependencies = [ [[package]] name = "pallet-authorship" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" +source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" dependencies = [ "frame-support", "frame-system", @@ -3573,7 +3582,7 @@ dependencies = [ [[package]] name = "pallet-babe" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" +source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" dependencies = [ "frame-benchmarking", "frame-support", @@ -3598,7 +3607,7 @@ dependencies = [ [[package]] name = "pallet-balances" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" +source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" dependencies = [ "frame-benchmarking", "frame-support", @@ -3612,7 +3621,7 @@ dependencies = [ [[package]] name = "pallet-collective" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" +source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" dependencies = [ "frame-benchmarking", "frame-support", @@ -3628,7 +3637,7 @@ dependencies = [ [[package]] name = "pallet-democracy" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" +source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" dependencies = [ "frame-benchmarking", "frame-support", @@ -3643,7 +3652,7 @@ dependencies = [ [[package]] name = "pallet-elections-phragmen" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" +source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" dependencies = [ "frame-benchmarking", "frame-support", @@ -3658,7 +3667,7 @@ dependencies = [ [[package]] name = "pallet-finality-tracker" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" +source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" dependencies = [ "frame-support", "frame-system", @@ -3674,7 +3683,7 @@ dependencies = [ [[package]] name = "pallet-grandpa" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" +source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" dependencies = [ "frame-benchmarking", "frame-support", @@ -3696,7 +3705,7 @@ dependencies = [ [[package]] name = "pallet-identity" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" +source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" dependencies = [ "enumflags2", "frame-benchmarking", @@ -3712,7 +3721,7 @@ dependencies = [ [[package]] name = "pallet-im-online" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" +source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" dependencies = [ "frame-benchmarking", "frame-support", @@ -3732,7 +3741,7 @@ dependencies = [ [[package]] name = "pallet-indices" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" +source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" dependencies = [ "frame-support", "frame-system", @@ -3748,7 +3757,7 @@ dependencies = [ [[package]] name = "pallet-membership" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" +source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" dependencies = [ "frame-support", "frame-system", @@ -3762,7 +3771,7 @@ dependencies = [ [[package]] name = "pallet-multisig" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" +source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" dependencies = [ "frame-support", "frame-system", @@ -3777,7 +3786,7 @@ dependencies = [ [[package]] name = "pallet-nicks" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" +source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" dependencies = [ "frame-support", "frame-system", @@ -3791,7 +3800,7 @@ dependencies = [ [[package]] name = "pallet-offences" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" +source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" dependencies = [ "frame-support", "frame-system", @@ -3806,7 +3815,7 @@ dependencies = [ [[package]] name = "pallet-offences-benchmarking" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" +source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" dependencies = [ "frame-benchmarking", "frame-support", @@ -3827,7 +3836,7 @@ dependencies = [ [[package]] name = "pallet-proxy" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" +source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" dependencies = [ "frame-support", "frame-system", @@ -3842,7 +3851,7 @@ dependencies = [ [[package]] name = "pallet-randomness-collective-flip" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" +source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" dependencies = [ "frame-support", "frame-system", @@ -3855,7 +3864,7 @@ dependencies = [ [[package]] name = "pallet-recovery" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" +source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" dependencies = [ "enumflags2", "frame-support", @@ -3870,7 +3879,7 @@ dependencies = [ [[package]] name = "pallet-scheduler" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" +source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" dependencies = [ "frame-benchmarking", "frame-support", @@ -3885,7 +3894,7 @@ dependencies = [ [[package]] name = "pallet-session" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" +source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" dependencies = [ "frame-support", "frame-system", @@ -3905,7 +3914,7 @@ dependencies = [ [[package]] name = "pallet-session-benchmarking" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" +source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" dependencies = [ "frame-benchmarking", "frame-support", @@ -3921,7 +3930,7 @@ dependencies = [ [[package]] name = "pallet-society" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" +source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" dependencies = [ "frame-support", "frame-system", @@ -3935,7 +3944,7 @@ dependencies = [ [[package]] name = "pallet-staking" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" +source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" dependencies = [ "frame-benchmarking", "frame-support", @@ -3957,7 +3966,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-curve" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" +source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -3968,7 +3977,7 @@ dependencies = [ [[package]] name = "pallet-sudo" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" +source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" dependencies = [ "frame-support", "frame-system", @@ -3982,7 +3991,7 @@ dependencies = [ [[package]] name = "pallet-timestamp" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" +source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" dependencies = [ "frame-benchmarking", "frame-support", @@ -4000,7 +4009,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" +source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" dependencies = [ "frame-support", "frame-system", @@ -4017,7 +4026,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" +source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" dependencies = [ "jsonrpc-core", "jsonrpc-core-client", @@ -4035,7 +4044,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc-runtime-api" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" +source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" dependencies = [ "frame-support", "parity-scale-codec", @@ -4048,7 +4057,7 @@ dependencies = [ [[package]] name = "pallet-treasury" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" +source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" dependencies = [ "frame-benchmarking", "frame-support", @@ -4063,7 +4072,7 @@ dependencies = [ [[package]] name = "pallet-utility" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" +source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" dependencies = [ "frame-benchmarking", "frame-support", @@ -4079,7 +4088,7 @@ dependencies = [ [[package]] name = "pallet-vesting" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" +source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" dependencies = [ "enumflags2", "frame-benchmarking", @@ -5674,6 +5683,17 @@ dependencies = [ "prost", ] +[[package]] +name = "pwasm-utils" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f53bc2558e8376358ebdc28301546471d67336584f6438ed4b7c7457a055fd7" +dependencies = [ + "byteorder", + "log 0.4.11", + "parity-wasm", +] + [[package]] name = "quick-error" version = "1.2.3" @@ -6029,6 +6049,16 @@ dependencies = [ "thread_local", ] +[[package]] +name = "regex-automata" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae1ded71d66a4a97f5e961fd0cb25a5f366a42a41570d16a763a69c092c26ae4" +dependencies = [ + "byteorder", + "regex-syntax", +] + [[package]] name = "regex-syntax" version = "0.6.18" @@ -6339,7 +6369,7 @@ dependencies = [ [[package]] name = "sc-authority-discovery" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" +source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" dependencies = [ "bytes 0.5.5", "derive_more 0.99.9", @@ -6366,7 +6396,7 @@ dependencies = [ [[package]] name = "sc-basic-authorship" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" +source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6390,7 +6420,7 @@ dependencies = [ [[package]] name = "sc-block-builder" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" +source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" dependencies = [ "parity-scale-codec", "sc-client-api", @@ -6407,7 +6437,7 @@ dependencies = [ [[package]] name = "sc-chain-spec" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" +source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" dependencies = [ "impl-trait-for-tuples", "sc-chain-spec-derive", @@ -6423,7 +6453,7 @@ dependencies = [ [[package]] name = "sc-chain-spec-derive" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" +source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -6434,7 +6464,7 @@ dependencies = [ [[package]] name = "sc-cli" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" +source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" dependencies = [ "ansi_term 0.12.1", "atty", @@ -6475,7 +6505,7 @@ dependencies = [ [[package]] name = "sc-client-api" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" +source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" dependencies = [ "derive_more 0.99.9", "fnv", @@ -6511,7 +6541,7 @@ dependencies = [ [[package]] name = "sc-client-db" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" +source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" dependencies = [ "blake2-rfc", "hash-db", @@ -6541,7 +6571,7 @@ dependencies = [ [[package]] name = "sc-consensus" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" +source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" dependencies = [ "sc-client-api", "sp-blockchain", @@ -6552,7 +6582,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" +source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" dependencies = [ "derive_more 0.99.9", "fork-tree", @@ -6596,7 +6626,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe-rpc" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" +source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -6620,7 +6650,7 @@ dependencies = [ [[package]] name = "sc-consensus-epochs" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" +source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" dependencies = [ "fork-tree", "parity-scale-codec", @@ -6633,7 +6663,7 @@ dependencies = [ [[package]] name = "sc-consensus-slots" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" +source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6656,7 +6686,7 @@ dependencies = [ [[package]] name = "sc-consensus-uncles" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" +source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" dependencies = [ "log 0.4.11", "sc-client-api", @@ -6670,7 +6700,7 @@ dependencies = [ [[package]] name = "sc-executor" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" +source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" dependencies = [ "derive_more 0.99.9", "lazy_static", @@ -6698,7 +6728,7 @@ dependencies = [ [[package]] name = "sc-executor-common" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" +source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" dependencies = [ "derive_more 0.99.9", "log 0.4.11", @@ -6715,7 +6745,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmi" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" +source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" dependencies = [ "log 0.4.11", "parity-scale-codec", @@ -6730,28 +6760,25 @@ dependencies = [ [[package]] name = "sc-executor-wasmtime" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" +source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" dependencies = [ - "cranelift-codegen", - "cranelift-wasm", "log 0.4.11", "parity-scale-codec", "parity-wasm", + "pwasm-utils", "sc-executor-common", "scoped-tls 1.0.0", "sp-allocator", "sp-core", "sp-runtime-interface", "sp-wasm-interface", - "substrate-wasmtime", - "wasmtime-environ", - "wasmtime-runtime", + "wasmtime", ] [[package]] name = "sc-finality-grandpa" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" +source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" dependencies = [ "derive_more 0.99.9", "finality-grandpa", @@ -6788,7 +6815,7 @@ dependencies = [ [[package]] name = "sc-finality-grandpa-rpc" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" +source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" dependencies = [ "derive_more 0.99.9", "finality-grandpa", @@ -6809,7 +6836,7 @@ dependencies = [ [[package]] name = "sc-informant" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" +source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" dependencies = [ "ansi_term 0.12.1", "futures 0.3.5", @@ -6827,7 +6854,7 @@ dependencies = [ [[package]] name = "sc-keystore" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" +source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" dependencies = [ "derive_more 0.99.9", "hex", @@ -6843,7 +6870,7 @@ dependencies = [ [[package]] name = "sc-light" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" +source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" dependencies = [ "hash-db", "lazy_static", @@ -6862,7 +6889,7 @@ dependencies = [ [[package]] name = "sc-network" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" +source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" dependencies = [ "bitflags", "bs58", @@ -6914,7 +6941,7 @@ dependencies = [ [[package]] name = "sc-network-gossip" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" +source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6929,7 +6956,7 @@ dependencies = [ [[package]] name = "sc-network-test" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" +source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" dependencies = [ "env_logger", "futures 0.3.5", @@ -6956,7 +6983,7 @@ dependencies = [ [[package]] name = "sc-offchain" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" +source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" dependencies = [ "bytes 0.5.5", "fnv", @@ -6983,7 +7010,7 @@ dependencies = [ [[package]] name = "sc-peerset" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" +source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" dependencies = [ "futures 0.3.5", "libp2p", @@ -6996,7 +7023,7 @@ dependencies = [ [[package]] name = "sc-proposer-metrics" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" +source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" dependencies = [ "log 0.4.11", "substrate-prometheus-endpoint", @@ -7005,7 +7032,7 @@ dependencies = [ [[package]] name = "sc-rpc" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" +source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" dependencies = [ "futures 0.3.5", "hash-db", @@ -7037,7 +7064,7 @@ dependencies = [ [[package]] name = "sc-rpc-api" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" +source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -7061,7 +7088,7 @@ dependencies = [ [[package]] name = "sc-rpc-server" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" +source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" dependencies = [ "jsonrpc-core", "jsonrpc-http-server", @@ -7077,7 +7104,7 @@ dependencies = [ [[package]] name = "sc-service" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" +source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" dependencies = [ "derive_more 0.99.9", "directories", @@ -7137,7 +7164,7 @@ dependencies = [ [[package]] name = "sc-state-db" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" +source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" dependencies = [ "log 0.4.11", "parity-scale-codec", @@ -7151,7 +7178,7 @@ dependencies = [ [[package]] name = "sc-telemetry" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" +source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -7172,7 +7199,7 @@ dependencies = [ [[package]] name = "sc-tracing" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" +source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" dependencies = [ "erased-serde", "log 0.4.11", @@ -7183,13 +7210,14 @@ dependencies = [ "serde_json", "slog", "sp-tracing", - "tracing-core", + "tracing", + "tracing-subscriber", ] [[package]] name = "sc-transaction-graph" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" +source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -7210,7 +7238,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" +source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -7455,6 +7483,15 @@ dependencies = [ "opaque-debug 0.2.3", ] +[[package]] +name = "sharded-slab" +version = "0.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06d5a3f5166fb5b42a5439f2eee8b9de149e235961e3eb21c5808fc3ea17ff3e" +dependencies = [ + "lazy_static", +] + [[package]] name = "shared_memory" version = "0.10.0" @@ -7668,7 +7705,7 @@ dependencies = [ [[package]] name = "sp-allocator" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" +source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" dependencies = [ "derive_more 0.99.9", "log 0.4.11", @@ -7680,7 +7717,7 @@ dependencies = [ [[package]] name = "sp-api" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" +source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" dependencies = [ "hash-db", "parity-scale-codec", @@ -7695,7 +7732,7 @@ dependencies = [ [[package]] name = "sp-api-proc-macro" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" +source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" dependencies = [ "blake2-rfc", "proc-macro-crate", @@ -7707,7 +7744,7 @@ dependencies = [ [[package]] name = "sp-application-crypto" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" +source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" dependencies = [ "parity-scale-codec", "serde", @@ -7719,7 +7756,7 @@ dependencies = [ [[package]] name = "sp-arithmetic" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" +source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" dependencies = [ "integer-sqrt", "num-traits 0.2.12", @@ -7732,7 +7769,7 @@ dependencies = [ [[package]] name = "sp-authority-discovery" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" +source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" dependencies = [ "parity-scale-codec", "sp-api", @@ -7744,7 +7781,7 @@ dependencies = [ [[package]] name = "sp-authorship" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" +source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" dependencies = [ "parity-scale-codec", "sp-inherents", @@ -7755,7 +7792,7 @@ dependencies = [ [[package]] name = "sp-block-builder" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" +source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" dependencies = [ "parity-scale-codec", "sp-api", @@ -7767,7 +7804,7 @@ dependencies = [ [[package]] name = "sp-blockchain" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" +source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" dependencies = [ "derive_more 0.99.9", "log 0.4.11", @@ -7784,7 +7821,7 @@ dependencies = [ [[package]] name = "sp-chain-spec" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" +source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" dependencies = [ "serde", "serde_json", @@ -7793,7 +7830,7 @@ dependencies = [ [[package]] name = "sp-consensus" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" +source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -7819,7 +7856,7 @@ dependencies = [ [[package]] name = "sp-consensus-aura" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" +source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" dependencies = [ "parity-scale-codec", "sp-api", @@ -7833,7 +7870,7 @@ dependencies = [ [[package]] name = "sp-consensus-babe" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" +source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" dependencies = [ "merlin", "parity-scale-codec", @@ -7852,7 +7889,7 @@ dependencies = [ [[package]] name = "sp-consensus-slots" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" +source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" dependencies = [ "parity-scale-codec", "sp-runtime", @@ -7861,7 +7898,7 @@ dependencies = [ [[package]] name = "sp-consensus-vrf" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" +source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" dependencies = [ "parity-scale-codec", "schnorrkel", @@ -7873,7 +7910,7 @@ dependencies = [ [[package]] name = "sp-core" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" +source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" dependencies = [ "base58", "blake2-rfc", @@ -7917,7 +7954,7 @@ dependencies = [ [[package]] name = "sp-database" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" +source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" dependencies = [ "kvdb", "parking_lot 0.10.2", @@ -7926,7 +7963,7 @@ dependencies = [ [[package]] name = "sp-debug-derive" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" +source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" dependencies = [ "proc-macro2 1.0.18", "quote 1.0.7", @@ -7936,7 +7973,7 @@ dependencies = [ [[package]] name = "sp-externalities" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" +source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" dependencies = [ "environmental", "parity-scale-codec", @@ -7947,7 +7984,7 @@ dependencies = [ [[package]] name = "sp-finality-grandpa" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" +source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" dependencies = [ "finality-grandpa", "log 0.4.11", @@ -7963,7 +8000,7 @@ dependencies = [ [[package]] name = "sp-finality-tracker" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" +source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" dependencies = [ "parity-scale-codec", "sp-inherents", @@ -7973,7 +8010,7 @@ dependencies = [ [[package]] name = "sp-inherents" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" +source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" dependencies = [ "derive_more 0.99.9", "parity-scale-codec", @@ -7985,7 +8022,7 @@ dependencies = [ [[package]] name = "sp-io" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" +source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" dependencies = [ "futures 0.3.5", "hash-db", @@ -8006,7 +8043,7 @@ dependencies = [ [[package]] name = "sp-keyring" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" +source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" dependencies = [ "lazy_static", "sp-core", @@ -8017,7 +8054,7 @@ dependencies = [ [[package]] name = "sp-npos-elections" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" +source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" dependencies = [ "parity-scale-codec", "serde", @@ -8029,7 +8066,7 @@ dependencies = [ [[package]] name = "sp-npos-elections-compact" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" +source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -8040,7 +8077,7 @@ dependencies = [ [[package]] name = "sp-offchain" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" +source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" dependencies = [ "sp-api", "sp-core", @@ -8050,7 +8087,7 @@ dependencies = [ [[package]] name = "sp-panic-handler" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" +source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" dependencies = [ "backtrace", "log 0.4.11", @@ -8059,7 +8096,7 @@ dependencies = [ [[package]] name = "sp-rpc" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" +source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" dependencies = [ "serde", "sp-core", @@ -8068,7 +8105,7 @@ dependencies = [ [[package]] name = "sp-runtime" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" +source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" dependencies = [ "either", "hash256-std-hasher", @@ -8090,7 +8127,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" +source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" dependencies = [ "parity-scale-codec", "primitive-types", @@ -8105,7 +8142,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" +source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" dependencies = [ "Inflector", "proc-macro-crate", @@ -8117,7 +8154,7 @@ dependencies = [ [[package]] name = "sp-serializer" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" +source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" dependencies = [ "serde", "serde_json", @@ -8126,7 +8163,7 @@ dependencies = [ [[package]] name = "sp-session" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" +source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" dependencies = [ "parity-scale-codec", "sp-api", @@ -8139,7 +8176,7 @@ dependencies = [ [[package]] name = "sp-staking" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" +source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" dependencies = [ "parity-scale-codec", "sp-runtime", @@ -8149,7 +8186,7 @@ dependencies = [ [[package]] name = "sp-state-machine" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" +source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" dependencies = [ "hash-db", "itertools 0.9.0", @@ -8170,12 +8207,12 @@ dependencies = [ [[package]] name = "sp-std" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" +source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" [[package]] name = "sp-storage" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" +source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" dependencies = [ "impl-serde 0.2.3", "ref-cast", @@ -8187,7 +8224,7 @@ dependencies = [ [[package]] name = "sp-timestamp" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" +source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -8201,7 +8238,7 @@ dependencies = [ [[package]] name = "sp-tracing" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" +source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" dependencies = [ "log 0.4.11", "rental", @@ -8211,7 +8248,7 @@ dependencies = [ [[package]] name = "sp-transaction-pool" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" +source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -8226,7 +8263,7 @@ dependencies = [ [[package]] name = "sp-trie" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" +source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" dependencies = [ "hash-db", "memory-db", @@ -8240,7 +8277,7 @@ dependencies = [ [[package]] name = "sp-utils" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" +source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" dependencies = [ "futures 0.3.5", "futures-core", @@ -8252,7 +8289,7 @@ dependencies = [ [[package]] name = "sp-version" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" +source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" dependencies = [ "impl-serde 0.2.3", "parity-scale-codec", @@ -8264,7 +8301,7 @@ dependencies = [ [[package]] name = "sp-wasm-interface" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" +source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -8395,7 +8432,7 @@ dependencies = [ [[package]] name = "substrate-browser-utils" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" +source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" dependencies = [ "chrono", "console_error_panic_hook", @@ -8421,7 +8458,7 @@ dependencies = [ [[package]] name = "substrate-build-script-utils" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" +source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" dependencies = [ "platforms", ] @@ -8429,7 +8466,7 @@ dependencies = [ [[package]] name = "substrate-frame-rpc-system" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" +source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" dependencies = [ "frame-system-rpc-runtime-api", "futures 0.3.5", @@ -8452,7 +8489,7 @@ dependencies = [ [[package]] name = "substrate-prometheus-endpoint" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" +source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" dependencies = [ "async-std", "derive_more 0.99.9", @@ -8466,7 +8503,7 @@ dependencies = [ [[package]] name = "substrate-test-client" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" +source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" dependencies = [ "futures 0.1.29", "futures 0.3.5", @@ -8492,7 +8529,7 @@ dependencies = [ [[package]] name = "substrate-test-runtime" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" +source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" dependencies = [ "cfg-if", "frame-executive", @@ -8532,7 +8569,7 @@ dependencies = [ [[package]] name = "substrate-test-runtime-client" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" +source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" dependencies = [ "futures 0.3.5", "parity-scale-codec", @@ -8553,7 +8590,7 @@ dependencies = [ [[package]] name = "substrate-wasm-builder-runner" version = "1.0.6" -source = "git+https://github.com/paritytech/substrate#eb0e05e126a027499d0993c0df8833c55bc359e0" +source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" [[package]] name = "substrate-wasm-builder-runner" @@ -8561,31 +8598,6 @@ version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d2a965994514ab35d3893e9260245f2947fd1981cdd4fffd2c6e6d1a9ce02e6a" -[[package]] -name = "substrate-wasmtime" -version = "0.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d75a69f5b3afef86e3e372529bf3fb1f7219b20287c4490e4cb4b4e91970f4f5" -dependencies = [ - "anyhow", - "backtrace", - "cfg-if", - "lazy_static", - "libc", - "log 0.4.11", - "region", - "rustc-demangle", - "smallvec 1.4.1", - "target-lexicon", - "wasmparser 0.59.0", - "wasmtime-environ", - "wasmtime-jit", - "wasmtime-profiling", - "wasmtime-runtime", - "wat", - "winapi 0.3.9", -] - [[package]] name = "subtle" version = "1.0.0" @@ -9161,9 +9173,9 @@ checksum = "e987b6bf443f4b5b3b6f38704195592cca41c5bb7aedd3c3693c7081f8289860" [[package]] name = "tracing" -version = "0.1.16" +version = "0.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2e2a2de6b0d5cbb13fc21193a2296888eaab62b6044479aafb3c54c01c29fcd" +checksum = "f0aae59226cf195d8e74d4b34beae1859257efb4e5fed3f147d2dc2c7d372178" dependencies = [ "cfg-if", "tracing-attributes", @@ -9183,13 +9195,55 @@ dependencies = [ [[package]] name = "tracing-core" -version = "0.1.11" +version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94ae75f0d28ae10786f3b1895c55fe72e79928fd5ccdebb5438c75e93fec178f" +checksum = "d593f98af59ebc017c0648f0117525db358745a8894a8d684e185ba3f45954f9" dependencies = [ "lazy_static", ] +[[package]] +name = "tracing-log" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e0f8c7178e13481ff6765bd169b33e8d554c5d2bbede5e32c356194be02b9b9" +dependencies = [ + "lazy_static", + "log 0.4.11", + "tracing-core", +] + +[[package]] +name = "tracing-serde" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6ccba2f8f16e0ed268fc765d9b7ff22e965e7185d32f8f1ec8294fe17d86e79" +dependencies = [ + "serde", + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "abd165311cc4d7a555ad11cc77a37756df836182db0d81aac908c8184c584f40" +dependencies = [ + "ansi_term 0.12.1", + "chrono", + "lazy_static", + "matchers", + "regex", + "serde", + "serde_json", + "sharded-slab", + "smallvec 1.4.1", + "thread_local", + "tracing-core", + "tracing-log", + "tracing-serde", +] + [[package]] name = "treeline" version = "0.1.0" @@ -9549,6 +9603,31 @@ version = "0.59.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a950e6a618f62147fd514ff445b2a0b53120d382751960797f85f058c7eda9b9" +[[package]] +name = "wasmtime" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cd3c4f449382779ef6e0a7c3ec6752ae614e20a42e4100000c3efdc973100e2" +dependencies = [ + "anyhow", + "backtrace", + "cfg-if", + "lazy_static", + "libc", + "log 0.4.11", + "region", + "rustc-demangle", + "smallvec 1.4.1", + "target-lexicon", + "wasmparser 0.59.0", + "wasmtime-environ", + "wasmtime-jit", + "wasmtime-profiling", + "wasmtime-runtime", + "wat", + "winapi 0.3.9", +] + [[package]] name = "wasmtime-debug" version = "0.19.0" -- GitLab From c78c2b4683020c4440b0cb87f01610185cd9dc3a Mon Sep 17 00:00:00 2001 From: Sergei Shulepov Date: Wed, 12 Aug 2020 15:55:32 +0200 Subject: [PATCH 168/192] Update .editorconfig to what we have in practice (#1545) While editing the impl guide markdowns I tried to be inline with what seemingly more common way to indent them: spaces. However, despite that I changed it kept reseting. Turned out the culprit is the .editorconfig file. This commit addresses this issue. I didn't try to deduplicate the rules since I found that the formal specification is a bit ambigious and it is not a big deal anyway. --- .editorconfig | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/.editorconfig b/.editorconfig index dda39da09e..6b736d884f 100644 --- a/.editorconfig +++ b/.editorconfig @@ -1,12 +1,13 @@ root = true -[*] + +[*.rs] indent_style=tab indent_size=tab tab_width=4 +max_line_length=120 end_of_line=lf charset=utf-8 trim_trailing_whitespace=true -max_line_length=120 insert_final_newline=true [*.yml] @@ -14,6 +15,9 @@ indent_style=space indent_size=2 tab_width=8 end_of_line=lf +charset=utf-8 +trim_trailing_whitespace=true +insert_final_newline=true [*.sh] indent_style=space -- GitLab From f73f2a86ebad691742c83dcca105f15b3213d508 Mon Sep 17 00:00:00 2001 From: Max Inden Date: Wed, 12 Aug 2020 18:06:12 +0200 Subject: [PATCH 169/192] service/src/lib: Update authority discovery construction (#1563) * service/src/lib: Update authority discovery construction https://github.com/paritytech/substrate/pull/6760 introduces the concept of an authority discovery `Service` allowing one to communicate with an authority discovery `Worker`, e.g. to learn the `Multiaddr`s for a given `AuthorityId`. Along with the new `Service` structure it also alters the authority discovery constructor to return both a worker and a service. This commit adjusts the callside of the constructor, ignoring the `Service` for now. * "Update Substrate" * Revert ""Update Substrate"" This reverts commit 04fb79c465f91b55422e22d4ea266f08f4072854. * Update Substrate Co-authored-by: parity-processbot <> --- Cargo.lock | 274 ++++++++++++++++++++++----------------------- service/src/lib.rs | 4 +- 2 files changed, 139 insertions(+), 139 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 6b41d54242..e86e42238c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1395,7 +1395,7 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "fork-tree" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" dependencies = [ "parity-scale-codec", ] @@ -1403,7 +1403,7 @@ dependencies = [ [[package]] name = "frame-benchmarking" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" dependencies = [ "frame-support", "frame-system", @@ -1420,7 +1420,7 @@ dependencies = [ [[package]] name = "frame-benchmarking-cli" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" dependencies = [ "frame-benchmarking", "parity-scale-codec", @@ -1438,7 +1438,7 @@ dependencies = [ [[package]] name = "frame-executive" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" dependencies = [ "frame-support", "frame-system", @@ -1453,7 +1453,7 @@ dependencies = [ [[package]] name = "frame-metadata" version = "11.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" dependencies = [ "parity-scale-codec", "serde", @@ -1464,7 +1464,7 @@ dependencies = [ [[package]] name = "frame-support" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" dependencies = [ "bitmask", "frame-metadata", @@ -1489,7 +1489,7 @@ dependencies = [ [[package]] name = "frame-support-procedural" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" dependencies = [ "frame-support-procedural-tools", "proc-macro2 1.0.18", @@ -1500,7 +1500,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" dependencies = [ "frame-support-procedural-tools-derive", "proc-macro-crate", @@ -1512,7 +1512,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools-derive" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" dependencies = [ "proc-macro2 1.0.18", "quote 1.0.7", @@ -1522,7 +1522,7 @@ dependencies = [ [[package]] name = "frame-system" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" dependencies = [ "frame-support", "impl-trait-for-tuples", @@ -1538,7 +1538,7 @@ dependencies = [ [[package]] name = "frame-system-benchmarking" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" dependencies = [ "frame-benchmarking", "frame-support", @@ -1552,7 +1552,7 @@ dependencies = [ [[package]] name = "frame-system-rpc-runtime-api" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" dependencies = [ "parity-scale-codec", "sp-api", @@ -3551,7 +3551,7 @@ dependencies = [ [[package]] name = "pallet-authority-discovery" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" dependencies = [ "frame-support", "frame-system", @@ -3567,7 +3567,7 @@ dependencies = [ [[package]] name = "pallet-authorship" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" dependencies = [ "frame-support", "frame-system", @@ -3582,7 +3582,7 @@ dependencies = [ [[package]] name = "pallet-babe" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" dependencies = [ "frame-benchmarking", "frame-support", @@ -3607,7 +3607,7 @@ dependencies = [ [[package]] name = "pallet-balances" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" dependencies = [ "frame-benchmarking", "frame-support", @@ -3621,7 +3621,7 @@ dependencies = [ [[package]] name = "pallet-collective" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" dependencies = [ "frame-benchmarking", "frame-support", @@ -3637,7 +3637,7 @@ dependencies = [ [[package]] name = "pallet-democracy" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" dependencies = [ "frame-benchmarking", "frame-support", @@ -3652,7 +3652,7 @@ dependencies = [ [[package]] name = "pallet-elections-phragmen" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" dependencies = [ "frame-benchmarking", "frame-support", @@ -3667,7 +3667,7 @@ dependencies = [ [[package]] name = "pallet-finality-tracker" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" dependencies = [ "frame-support", "frame-system", @@ -3683,7 +3683,7 @@ dependencies = [ [[package]] name = "pallet-grandpa" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" dependencies = [ "frame-benchmarking", "frame-support", @@ -3705,7 +3705,7 @@ dependencies = [ [[package]] name = "pallet-identity" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" dependencies = [ "enumflags2", "frame-benchmarking", @@ -3721,7 +3721,7 @@ dependencies = [ [[package]] name = "pallet-im-online" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" dependencies = [ "frame-benchmarking", "frame-support", @@ -3741,7 +3741,7 @@ dependencies = [ [[package]] name = "pallet-indices" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" dependencies = [ "frame-support", "frame-system", @@ -3757,7 +3757,7 @@ dependencies = [ [[package]] name = "pallet-membership" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" dependencies = [ "frame-support", "frame-system", @@ -3771,7 +3771,7 @@ dependencies = [ [[package]] name = "pallet-multisig" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" dependencies = [ "frame-support", "frame-system", @@ -3786,7 +3786,7 @@ dependencies = [ [[package]] name = "pallet-nicks" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" dependencies = [ "frame-support", "frame-system", @@ -3800,7 +3800,7 @@ dependencies = [ [[package]] name = "pallet-offences" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" dependencies = [ "frame-support", "frame-system", @@ -3815,7 +3815,7 @@ dependencies = [ [[package]] name = "pallet-offences-benchmarking" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" dependencies = [ "frame-benchmarking", "frame-support", @@ -3836,7 +3836,7 @@ dependencies = [ [[package]] name = "pallet-proxy" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" dependencies = [ "frame-support", "frame-system", @@ -3851,7 +3851,7 @@ dependencies = [ [[package]] name = "pallet-randomness-collective-flip" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" dependencies = [ "frame-support", "frame-system", @@ -3864,7 +3864,7 @@ dependencies = [ [[package]] name = "pallet-recovery" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" dependencies = [ "enumflags2", "frame-support", @@ -3879,7 +3879,7 @@ dependencies = [ [[package]] name = "pallet-scheduler" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" dependencies = [ "frame-benchmarking", "frame-support", @@ -3894,7 +3894,7 @@ dependencies = [ [[package]] name = "pallet-session" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" dependencies = [ "frame-support", "frame-system", @@ -3914,7 +3914,7 @@ dependencies = [ [[package]] name = "pallet-session-benchmarking" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" dependencies = [ "frame-benchmarking", "frame-support", @@ -3930,7 +3930,7 @@ dependencies = [ [[package]] name = "pallet-society" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" dependencies = [ "frame-support", "frame-system", @@ -3944,7 +3944,7 @@ dependencies = [ [[package]] name = "pallet-staking" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" dependencies = [ "frame-benchmarking", "frame-support", @@ -3966,7 +3966,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-curve" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -3977,7 +3977,7 @@ dependencies = [ [[package]] name = "pallet-sudo" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" dependencies = [ "frame-support", "frame-system", @@ -3991,7 +3991,7 @@ dependencies = [ [[package]] name = "pallet-timestamp" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" dependencies = [ "frame-benchmarking", "frame-support", @@ -4009,7 +4009,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" dependencies = [ "frame-support", "frame-system", @@ -4026,7 +4026,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" dependencies = [ "jsonrpc-core", "jsonrpc-core-client", @@ -4044,7 +4044,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc-runtime-api" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" dependencies = [ "frame-support", "parity-scale-codec", @@ -4057,7 +4057,7 @@ dependencies = [ [[package]] name = "pallet-treasury" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" dependencies = [ "frame-benchmarking", "frame-support", @@ -4072,7 +4072,7 @@ dependencies = [ [[package]] name = "pallet-utility" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" dependencies = [ "frame-benchmarking", "frame-support", @@ -4088,7 +4088,7 @@ dependencies = [ [[package]] name = "pallet-vesting" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" dependencies = [ "enumflags2", "frame-benchmarking", @@ -6369,7 +6369,7 @@ dependencies = [ [[package]] name = "sc-authority-discovery" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" dependencies = [ "bytes 0.5.5", "derive_more 0.99.9", @@ -6396,7 +6396,7 @@ dependencies = [ [[package]] name = "sc-basic-authorship" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6420,7 +6420,7 @@ dependencies = [ [[package]] name = "sc-block-builder" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" dependencies = [ "parity-scale-codec", "sc-client-api", @@ -6437,7 +6437,7 @@ dependencies = [ [[package]] name = "sc-chain-spec" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" dependencies = [ "impl-trait-for-tuples", "sc-chain-spec-derive", @@ -6453,7 +6453,7 @@ dependencies = [ [[package]] name = "sc-chain-spec-derive" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -6464,7 +6464,7 @@ dependencies = [ [[package]] name = "sc-cli" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" dependencies = [ "ansi_term 0.12.1", "atty", @@ -6505,7 +6505,7 @@ dependencies = [ [[package]] name = "sc-client-api" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" dependencies = [ "derive_more 0.99.9", "fnv", @@ -6541,7 +6541,7 @@ dependencies = [ [[package]] name = "sc-client-db" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" dependencies = [ "blake2-rfc", "hash-db", @@ -6571,7 +6571,7 @@ dependencies = [ [[package]] name = "sc-consensus" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" dependencies = [ "sc-client-api", "sp-blockchain", @@ -6582,7 +6582,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" dependencies = [ "derive_more 0.99.9", "fork-tree", @@ -6626,7 +6626,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe-rpc" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -6650,7 +6650,7 @@ dependencies = [ [[package]] name = "sc-consensus-epochs" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" dependencies = [ "fork-tree", "parity-scale-codec", @@ -6663,7 +6663,7 @@ dependencies = [ [[package]] name = "sc-consensus-slots" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6686,7 +6686,7 @@ dependencies = [ [[package]] name = "sc-consensus-uncles" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" dependencies = [ "log 0.4.11", "sc-client-api", @@ -6700,7 +6700,7 @@ dependencies = [ [[package]] name = "sc-executor" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" dependencies = [ "derive_more 0.99.9", "lazy_static", @@ -6728,7 +6728,7 @@ dependencies = [ [[package]] name = "sc-executor-common" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" dependencies = [ "derive_more 0.99.9", "log 0.4.11", @@ -6745,7 +6745,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmi" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" dependencies = [ "log 0.4.11", "parity-scale-codec", @@ -6760,7 +6760,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmtime" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" dependencies = [ "log 0.4.11", "parity-scale-codec", @@ -6778,7 +6778,7 @@ dependencies = [ [[package]] name = "sc-finality-grandpa" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" dependencies = [ "derive_more 0.99.9", "finality-grandpa", @@ -6815,7 +6815,7 @@ dependencies = [ [[package]] name = "sc-finality-grandpa-rpc" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" dependencies = [ "derive_more 0.99.9", "finality-grandpa", @@ -6836,7 +6836,7 @@ dependencies = [ [[package]] name = "sc-informant" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" dependencies = [ "ansi_term 0.12.1", "futures 0.3.5", @@ -6854,7 +6854,7 @@ dependencies = [ [[package]] name = "sc-keystore" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" dependencies = [ "derive_more 0.99.9", "hex", @@ -6870,7 +6870,7 @@ dependencies = [ [[package]] name = "sc-light" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" dependencies = [ "hash-db", "lazy_static", @@ -6889,7 +6889,7 @@ dependencies = [ [[package]] name = "sc-network" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" dependencies = [ "bitflags", "bs58", @@ -6941,7 +6941,7 @@ dependencies = [ [[package]] name = "sc-network-gossip" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6956,7 +6956,7 @@ dependencies = [ [[package]] name = "sc-network-test" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" dependencies = [ "env_logger", "futures 0.3.5", @@ -6983,7 +6983,7 @@ dependencies = [ [[package]] name = "sc-offchain" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" dependencies = [ "bytes 0.5.5", "fnv", @@ -7010,7 +7010,7 @@ dependencies = [ [[package]] name = "sc-peerset" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" dependencies = [ "futures 0.3.5", "libp2p", @@ -7023,7 +7023,7 @@ dependencies = [ [[package]] name = "sc-proposer-metrics" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" dependencies = [ "log 0.4.11", "substrate-prometheus-endpoint", @@ -7032,7 +7032,7 @@ dependencies = [ [[package]] name = "sc-rpc" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" dependencies = [ "futures 0.3.5", "hash-db", @@ -7064,7 +7064,7 @@ dependencies = [ [[package]] name = "sc-rpc-api" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -7088,7 +7088,7 @@ dependencies = [ [[package]] name = "sc-rpc-server" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" dependencies = [ "jsonrpc-core", "jsonrpc-http-server", @@ -7104,7 +7104,7 @@ dependencies = [ [[package]] name = "sc-service" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" dependencies = [ "derive_more 0.99.9", "directories", @@ -7164,7 +7164,7 @@ dependencies = [ [[package]] name = "sc-state-db" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" dependencies = [ "log 0.4.11", "parity-scale-codec", @@ -7178,7 +7178,7 @@ dependencies = [ [[package]] name = "sc-telemetry" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -7199,7 +7199,7 @@ dependencies = [ [[package]] name = "sc-tracing" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" dependencies = [ "erased-serde", "log 0.4.11", @@ -7217,7 +7217,7 @@ dependencies = [ [[package]] name = "sc-transaction-graph" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -7238,7 +7238,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -7705,7 +7705,7 @@ dependencies = [ [[package]] name = "sp-allocator" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" dependencies = [ "derive_more 0.99.9", "log 0.4.11", @@ -7717,7 +7717,7 @@ dependencies = [ [[package]] name = "sp-api" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" dependencies = [ "hash-db", "parity-scale-codec", @@ -7732,7 +7732,7 @@ dependencies = [ [[package]] name = "sp-api-proc-macro" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" dependencies = [ "blake2-rfc", "proc-macro-crate", @@ -7744,7 +7744,7 @@ dependencies = [ [[package]] name = "sp-application-crypto" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" dependencies = [ "parity-scale-codec", "serde", @@ -7756,7 +7756,7 @@ dependencies = [ [[package]] name = "sp-arithmetic" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" dependencies = [ "integer-sqrt", "num-traits 0.2.12", @@ -7769,7 +7769,7 @@ dependencies = [ [[package]] name = "sp-authority-discovery" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" dependencies = [ "parity-scale-codec", "sp-api", @@ -7781,7 +7781,7 @@ dependencies = [ [[package]] name = "sp-authorship" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" dependencies = [ "parity-scale-codec", "sp-inherents", @@ -7792,7 +7792,7 @@ dependencies = [ [[package]] name = "sp-block-builder" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" dependencies = [ "parity-scale-codec", "sp-api", @@ -7804,7 +7804,7 @@ dependencies = [ [[package]] name = "sp-blockchain" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" dependencies = [ "derive_more 0.99.9", "log 0.4.11", @@ -7821,7 +7821,7 @@ dependencies = [ [[package]] name = "sp-chain-spec" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" dependencies = [ "serde", "serde_json", @@ -7830,7 +7830,7 @@ dependencies = [ [[package]] name = "sp-consensus" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -7856,7 +7856,7 @@ dependencies = [ [[package]] name = "sp-consensus-aura" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" dependencies = [ "parity-scale-codec", "sp-api", @@ -7870,7 +7870,7 @@ dependencies = [ [[package]] name = "sp-consensus-babe" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" dependencies = [ "merlin", "parity-scale-codec", @@ -7889,7 +7889,7 @@ dependencies = [ [[package]] name = "sp-consensus-slots" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" dependencies = [ "parity-scale-codec", "sp-runtime", @@ -7898,7 +7898,7 @@ dependencies = [ [[package]] name = "sp-consensus-vrf" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" dependencies = [ "parity-scale-codec", "schnorrkel", @@ -7910,7 +7910,7 @@ dependencies = [ [[package]] name = "sp-core" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" dependencies = [ "base58", "blake2-rfc", @@ -7954,7 +7954,7 @@ dependencies = [ [[package]] name = "sp-database" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" dependencies = [ "kvdb", "parking_lot 0.10.2", @@ -7963,7 +7963,7 @@ dependencies = [ [[package]] name = "sp-debug-derive" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" dependencies = [ "proc-macro2 1.0.18", "quote 1.0.7", @@ -7973,7 +7973,7 @@ dependencies = [ [[package]] name = "sp-externalities" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" dependencies = [ "environmental", "parity-scale-codec", @@ -7984,7 +7984,7 @@ dependencies = [ [[package]] name = "sp-finality-grandpa" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" dependencies = [ "finality-grandpa", "log 0.4.11", @@ -8000,7 +8000,7 @@ dependencies = [ [[package]] name = "sp-finality-tracker" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" dependencies = [ "parity-scale-codec", "sp-inherents", @@ -8010,7 +8010,7 @@ dependencies = [ [[package]] name = "sp-inherents" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" dependencies = [ "derive_more 0.99.9", "parity-scale-codec", @@ -8022,7 +8022,7 @@ dependencies = [ [[package]] name = "sp-io" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" dependencies = [ "futures 0.3.5", "hash-db", @@ -8043,7 +8043,7 @@ dependencies = [ [[package]] name = "sp-keyring" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" dependencies = [ "lazy_static", "sp-core", @@ -8054,7 +8054,7 @@ dependencies = [ [[package]] name = "sp-npos-elections" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" dependencies = [ "parity-scale-codec", "serde", @@ -8066,7 +8066,7 @@ dependencies = [ [[package]] name = "sp-npos-elections-compact" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -8077,7 +8077,7 @@ dependencies = [ [[package]] name = "sp-offchain" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" dependencies = [ "sp-api", "sp-core", @@ -8087,7 +8087,7 @@ dependencies = [ [[package]] name = "sp-panic-handler" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" dependencies = [ "backtrace", "log 0.4.11", @@ -8096,7 +8096,7 @@ dependencies = [ [[package]] name = "sp-rpc" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" dependencies = [ "serde", "sp-core", @@ -8105,7 +8105,7 @@ dependencies = [ [[package]] name = "sp-runtime" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" dependencies = [ "either", "hash256-std-hasher", @@ -8127,7 +8127,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" dependencies = [ "parity-scale-codec", "primitive-types", @@ -8142,7 +8142,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" dependencies = [ "Inflector", "proc-macro-crate", @@ -8154,7 +8154,7 @@ dependencies = [ [[package]] name = "sp-serializer" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" dependencies = [ "serde", "serde_json", @@ -8163,7 +8163,7 @@ dependencies = [ [[package]] name = "sp-session" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" dependencies = [ "parity-scale-codec", "sp-api", @@ -8176,7 +8176,7 @@ dependencies = [ [[package]] name = "sp-staking" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" dependencies = [ "parity-scale-codec", "sp-runtime", @@ -8186,7 +8186,7 @@ dependencies = [ [[package]] name = "sp-state-machine" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" dependencies = [ "hash-db", "itertools 0.9.0", @@ -8207,12 +8207,12 @@ dependencies = [ [[package]] name = "sp-std" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" [[package]] name = "sp-storage" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" dependencies = [ "impl-serde 0.2.3", "ref-cast", @@ -8224,7 +8224,7 @@ dependencies = [ [[package]] name = "sp-timestamp" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -8238,7 +8238,7 @@ dependencies = [ [[package]] name = "sp-tracing" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" dependencies = [ "log 0.4.11", "rental", @@ -8248,7 +8248,7 @@ dependencies = [ [[package]] name = "sp-transaction-pool" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -8263,7 +8263,7 @@ dependencies = [ [[package]] name = "sp-trie" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" dependencies = [ "hash-db", "memory-db", @@ -8277,7 +8277,7 @@ dependencies = [ [[package]] name = "sp-utils" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" dependencies = [ "futures 0.3.5", "futures-core", @@ -8289,7 +8289,7 @@ dependencies = [ [[package]] name = "sp-version" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" dependencies = [ "impl-serde 0.2.3", "parity-scale-codec", @@ -8301,7 +8301,7 @@ dependencies = [ [[package]] name = "sp-wasm-interface" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -8432,7 +8432,7 @@ dependencies = [ [[package]] name = "substrate-browser-utils" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" dependencies = [ "chrono", "console_error_panic_hook", @@ -8458,7 +8458,7 @@ dependencies = [ [[package]] name = "substrate-build-script-utils" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" dependencies = [ "platforms", ] @@ -8466,7 +8466,7 @@ dependencies = [ [[package]] name = "substrate-frame-rpc-system" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" dependencies = [ "frame-system-rpc-runtime-api", "futures 0.3.5", @@ -8489,7 +8489,7 @@ dependencies = [ [[package]] name = "substrate-prometheus-endpoint" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" dependencies = [ "async-std", "derive_more 0.99.9", @@ -8503,7 +8503,7 @@ dependencies = [ [[package]] name = "substrate-test-client" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" dependencies = [ "futures 0.1.29", "futures 0.3.5", @@ -8529,7 +8529,7 @@ dependencies = [ [[package]] name = "substrate-test-runtime" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" dependencies = [ "cfg-if", "frame-executive", @@ -8569,7 +8569,7 @@ dependencies = [ [[package]] name = "substrate-test-runtime-client" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" dependencies = [ "futures 0.3.5", "parity-scale-codec", @@ -8590,7 +8590,7 @@ dependencies = [ [[package]] name = "substrate-wasm-builder-runner" version = "1.0.6" -source = "git+https://github.com/paritytech/substrate#0c3cdf16d48532969237d1aa0e5cf27d7ade8018" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" [[package]] name = "substrate-wasm-builder-runner" diff --git a/service/src/lib.rs b/service/src/lib.rs index d5ecec9f21..b311117dd2 100644 --- a/service/src/lib.rs +++ b/service/src/lib.rs @@ -477,7 +477,7 @@ pub fn new_full( Event::Dht(e) => Some(e), _ => None, }}).boxed(); - let authority_discovery = authority_discovery::AuthorityDiscovery::new( + let (authority_discovery_worker, _service) = authority_discovery::new_worker_and_service( client.clone(), network.clone(), sentries, @@ -486,7 +486,7 @@ pub fn new_full( prometheus_registry.clone(), ); - task_manager.spawn_handle().spawn("authority-discovery", authority_discovery); + task_manager.spawn_handle().spawn("authority-discovery-worker", authority_discovery_worker); } } -- GitLab From 3b6235793971bb4904b0d44cde1984b9925cab5c Mon Sep 17 00:00:00 2001 From: Cecile Tonglet Date: Thu, 13 Aug 2020 10:40:39 +0200 Subject: [PATCH 170/192] Allow using any polkadot client instead of enum Client (#1575) * WIP Forked at: e91642361133dba084a9c9b3efa45fcb6cd3c5ca Parent branch: origin/rococo-branch * WIP Forked at: e91642361133dba084a9c9b3efa45fcb6cd3c5ca Parent branch: origin/rococo-branch * WIP Forked at: e91642361133dba084a9c9b3efa45fcb6cd3c5ca Parent branch: origin/rococo-branch * WIP Forked at: e91642361133dba084a9c9b3efa45fcb6cd3c5ca Parent branch: origin/rococo-branch * WIP Forked at: e91642361133dba084a9c9b3efa45fcb6cd3c5ca Parent branch: origin/rococo-branch * WIP Forked at: e91642361133dba084a9c9b3efa45fcb6cd3c5ca Parent branch: origin/rococo-branch * WIP Forked at: e91642361133dba084a9c9b3efa45fcb6cd3c5ca Parent branch: origin/rococo-branch * WIP Forked at: e91642361133dba084a9c9b3efa45fcb6cd3c5ca Parent branch: origin/rococo-branch * Apply suggestions from code review * WIP Forked at: e91642361133dba084a9c9b3efa45fcb6cd3c5ca Parent branch: origin/rococo-branch * WIP Forked at: e91642361133dba084a9c9b3efa45fcb6cd3c5ca Parent branch: origin/rococo-branch * WIP Forked at: e91642361133dba084a9c9b3efa45fcb6cd3c5ca Parent branch: origin/rococo-branch * CLEANUP Forked at: e91642361133dba084a9c9b3efa45fcb6cd3c5ca Parent branch: origin/rococo-branch * link in doc * doc --- Cargo.lock | 3 ++ collator/src/lib.rs | 43 ++++++++++++------- node/test-service/src/lib.rs | 13 +++++- .../test-parachains/adder/collator/Cargo.toml | 3 ++ .../adder/collator/src/main.rs | 19 +++++--- service/src/client.rs | 18 ++++++-- service/src/lib.rs | 21 ++++++--- 7 files changed, 89 insertions(+), 31 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index e86e42238c..8b8f0ce91d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -8713,8 +8713,11 @@ dependencies = [ "polkadot-collator", "polkadot-parachain", "polkadot-primitives", + "polkadot-service", "sc-client-api", + "sp-api", "sp-core", + "sp-runtime", "test-parachain-adder", ] diff --git a/collator/src/lib.rs b/collator/src/lib.rs index 070740bf7f..8e0cabb0eb 100644 --- a/collator/src/lib.rs +++ b/collator/src/lib.rs @@ -67,7 +67,7 @@ pub use sc_network::PeerId; pub use service::{RuntimeApiCollection, Client}; pub use sc_cli::SubstrateCli; #[cfg(not(feature = "service-rewr"))] -use polkadot_service::{FullNodeHandles, AbstractClient}; +use polkadot_service::{FullNodeHandles, AbstractClient, ClientHandle}; #[cfg(feature = "service-rewr")] use polkadot_service_new::{ self as polkadot_service, @@ -77,6 +77,7 @@ use sc_service::SpawnTaskHandle; use sp_core::traits::SpawnNamed; use sp_runtime::traits::BlakeTwo256; use consensus_common::SyncOracle; +use sc_client_api::Backend as BackendT; const COLLATION_TIMEOUT: Duration = Duration::from_secs(30); @@ -117,14 +118,19 @@ pub trait BuildParachainContext { type ParachainContext: self::ParachainContext; /// Build the `ParachainContext`. - fn build( + fn build( self, - client: polkadot_service::Client, + client: Arc, spawner: SP, network: impl Network + SyncOracle + Clone + 'static, ) -> Result where - SP: SpawnNamed + Clone + Send + Sync + 'static; + SP: SpawnNamed + Clone + Send + Sync + 'static, + Backend: BackendT, + Backend::State: sp_api::StateBackend, + Client: polkadot_service::AbstractClient + 'static, + Client::Api: RuntimeApiCollection, + ; } /// Parachain context needed for collation. @@ -194,11 +200,12 @@ pub async fn collate

( Some(collation) } +/// Build a collator service based on the `ClientHandle`. #[cfg(feature = "service-rewr")] -fn build_collator_service

( +pub fn build_collator_service

( spawner: SpawnTaskHandle, handles: FullNodeHandles, - client: polkadot_service::Client, + client: impl ClientHandle, para_id: ParaId, key: Arc, build_parachain_context: P, @@ -217,7 +224,6 @@ struct BuildCollationWork

{ key: Arc, build_parachain_context: P, spawner: SpawnTaskHandle, - client: polkadot_service::Client, } impl

polkadot_service::ExecuteWithClient for BuildCollationWork

@@ -233,7 +239,7 @@ impl

polkadot_service::ExecuteWithClient for BuildCollationWork

Backend: sc_client_api::Backend, Backend::State: sp_api::StateBackend, Api: RuntimeApiCollection, - Client: AbstractClient + 'static + Client: AbstractClient + 'static, { let polkadot_network = self.handles .polkadot_network @@ -246,7 +252,7 @@ impl

polkadot_service::ExecuteWithClient for BuildCollationWork

.ok_or_else(|| "Collator cannot run when validation networking has not been started")?; let parachain_context = match self.build_parachain_context.build( - self.client, + client.clone(), self.spawner.clone(), polkadot_network.clone(), ) { @@ -346,11 +352,12 @@ impl

polkadot_service::ExecuteWithClient for BuildCollationWork

} } +/// Build a collator service based on the `ClientHandle`. #[cfg(not(feature = "service-rewr"))] -fn build_collator_service

( +pub fn build_collator_service

( spawner: SpawnTaskHandle, handles: FullNodeHandles, - client: polkadot_service::Client, + client: impl ClientHandle, para_id: ParaId, key: Arc, build_parachain_context: P, @@ -366,7 +373,6 @@ fn build_collator_service

( key, build_parachain_context, spawner, - client: client.clone(), }) } @@ -454,12 +460,19 @@ mod tests { impl BuildParachainContext for BuildDummyParachainContext { type ParachainContext = DummyParachainContext; - fn build( + fn build( self, - _: polkadot_service::Client, + _: Arc, _: SP, _: impl Network + Clone + 'static, - ) -> Result { + ) -> Result + where + SP: SpawnNamed + Clone + Send + Sync + 'static, + Backend: BackendT, + Backend::State: sp_api::StateBackend, + Client: polkadot_service::AbstractClient + 'static, + Client::Api: RuntimeApiCollection, + { Ok(DummyParachainContext) } } diff --git a/node/test-service/src/lib.rs b/node/test-service/src/lib.rs index 03b8dd6aa6..f82c4b7ad3 100644 --- a/node/test-service/src/lib.rs +++ b/node/test-service/src/lib.rs @@ -26,7 +26,7 @@ use polkadot_primitives::v0::{ Block, Hash, CollatorId, Id as ParaId, }; use polkadot_runtime_common::{parachains, registrar, BlockHashCount}; -use polkadot_service::{new_full, FullNodeHandles, AbstractClient}; +use polkadot_service::{new_full, FullNodeHandles, AbstractClient, ClientHandle, ExecuteWithClient}; use polkadot_test_runtime::{RestrictFunctionality, Runtime, SignedExtra, SignedPayload, VERSION}; use sc_chain_spec::ChainSpec; use sc_client_api::{execution_extensions::ExecutionStrategies, BlockchainEvents}; @@ -67,7 +67,7 @@ pub fn polkadot_test_new_full( ) -> Result< ( TaskManager, - Arc>>, + Arc>, FullNodeHandles, Arc>, Arc, @@ -88,6 +88,15 @@ pub fn polkadot_test_new_full( Ok((task_manager, client, handles, network, rpc_handlers)) } +/// A wrapper for the test client that implements `ClientHandle`. +pub struct TestClient(pub Arc>); + +impl ClientHandle for TestClient { + fn execute_with(&self, t: T) -> T::Output { + T::execute_with_client::<_, _, polkadot_service::FullBackend>(t, self.0.clone()) + } +} + /// Create a Polkadot `Configuration`. By default an in-memory socket will be used, therefore you need to provide boot /// nodes if you want the future node to be connected to other nodes. The `storage_update_func` can be used to make /// adjustements to the runtime before the node starts. diff --git a/parachain/test-parachains/adder/collator/Cargo.toml b/parachain/test-parachains/adder/collator/Cargo.toml index dc686fe24e..cab8bbf98b 100644 --- a/parachain/test-parachains/adder/collator/Cargo.toml +++ b/parachain/test-parachains/adder/collator/Cargo.toml @@ -9,8 +9,11 @@ adder = { package = "test-parachain-adder", path = ".." } parachain = { package = "polkadot-parachain", path = "../../.." } collator = { package = "polkadot-collator", path = "../../../../collator" } primitives = { package = "polkadot-primitives", path = "../../../../primitives" } +service = { package = "polkadot-service", path = "../../../../service" } sp-core = { git = "https://github.com/paritytech/substrate", branch = "master" } client-api = { package = "sc-client-api", git = "https://github.com/paritytech/substrate", branch = "master" } +sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "master" } +sp-api = { git = "https://github.com/paritytech/substrate", branch = "master" } parking_lot = "0.10.0" codec = { package = "parity-scale-codec", version = "1.3.4" } futures = "0.3.4" diff --git a/parachain/test-parachains/adder/collator/src/main.rs b/parachain/test-parachains/adder/collator/src/main.rs index 2bddff6f86..318bc6142c 100644 --- a/parachain/test-parachains/adder/collator/src/main.rs +++ b/parachain/test-parachains/adder/collator/src/main.rs @@ -20,15 +20,17 @@ use std::collections::HashMap; use std::sync::Arc; use adder::{HeadData as AdderHead, BlockData as AdderBody}; -use sp_core::Pair; +use sp_core::{traits::SpawnNamed, Pair}; use codec::{Encode, Decode}; use primitives::v0::{ - Hash, DownwardMessage, + Block, Hash, DownwardMessage, HeadData, BlockData, Id as ParaId, LocalValidationData, GlobalValidationData, }; use collator::{ParachainContext, Network, BuildParachainContext, Cli, SubstrateCli}; use parking_lot::Mutex; use futures::future::{Ready, ready, FutureExt}; +use sp_runtime::traits::BlakeTwo256; +use client_api::Backend as BackendT; const GENESIS: AdderHead = AdderHead { number: 0, @@ -103,12 +105,19 @@ impl ParachainContext for AdderContext { impl BuildParachainContext for AdderContext { type ParachainContext = Self; - fn build( + fn build( self, - _: collator::Client, + _: Arc, _: SP, network: impl Network + Clone + 'static, - ) -> Result { + ) -> Result + where + SP: SpawnNamed + Clone + Send + Sync + 'static, + Backend: BackendT, + Backend::State: sp_api::StateBackend, + Client: service::AbstractClient + 'static, + Client::Api: service::RuntimeApiCollection, + { Ok(Self { _network: Some(Arc::new(network)), ..self }) } } diff --git a/service/src/client.rs b/service/src/client.rs index e7743e8530..dad038cf96 100644 --- a/service/src/client.rs +++ b/service/src/client.rs @@ -118,6 +118,19 @@ pub trait ExecuteWithClient { Client: AbstractClient + 'static; } +/// A handle to a Polkadot client instance. +/// +/// The Polkadot service supports multiple different runtimes (Westend, Polkadot itself, etc). As each runtime has a +/// specialized client, we need to hide them behind a trait. This is this trait. +/// +/// When wanting to work with the inner client, you need to use `execute_with`. +/// +/// See [`ExecuteWithClient`](trait.ExecuteWithClient.html) for more information. +pub trait ClientHandle { + /// Execute the given something with the client. + fn execute_with(&self, t: T) -> T::Output; +} + /// A client instance of Polkadot. /// /// See [`ExecuteWithClient`] for more information. @@ -129,9 +142,8 @@ pub enum Client { Rococo(Arc>), } -impl Client { - /// Execute the given something with the client. - pub fn execute_with(&self, t: T) -> T::Output { +impl ClientHandle for Client { + fn execute_with(&self, t: T) -> T::Output { match self { Self::Polkadot(client) => { T::execute_with_client::<_, _, crate::FullBackend>(t, client.clone()) diff --git a/service/src/lib.rs b/service/src/lib.rs index b311117dd2..6bb78a18ce 100644 --- a/service/src/lib.rs +++ b/service/src/lib.rs @@ -109,16 +109,25 @@ impl IdentifyVariant for Box { } } -type FullBackend = service::TFullBackend; -type FullSelectChain = sc_consensus::LongestChain; -type FullClient = service::TFullClient; -type FullGrandpaBlockImport = grandpa::GrandpaBlockImport< +/// Polkadot's full backend. +pub type FullBackend = service::TFullBackend; + +/// Polkadot's select chain. +pub type FullSelectChain = sc_consensus::LongestChain; + +/// Polkadot's full client. +pub type FullClient = service::TFullClient; + +/// Polkadot's full Grandpa block import. +pub type FullGrandpaBlockImport = grandpa::GrandpaBlockImport< FullBackend, Block, FullClient, FullSelectChain >; -type LightBackend = service::TLightBackendWithHash; +/// Polkadot's light backend. +pub type LightBackend = service::TLightBackendWithHash; -type LightClient = +/// Polkadot's light client. +pub type LightClient = service::TLightClientWithBackend; #[cfg(feature = "full-node")] -- GitLab From 2d45432659d0d5d77646eb7834102bd8ea50621b Mon Sep 17 00:00:00 2001 From: s3krit Date: Thu, 13 Aug 2020 13:57:56 +0200 Subject: [PATCH 171/192] [CI] Add github token to generate-release-text (#1581) --- .github/workflows/publish-draft-release.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/publish-draft-release.yml b/.github/workflows/publish-draft-release.yml index 6922c238b5..b81c9f739e 100644 --- a/.github/workflows/publish-draft-release.yml +++ b/.github/workflows/publish-draft-release.yml @@ -85,6 +85,7 @@ jobs: env: RUSTC_STABLE: ${{ needs.get-rust-versions.outputs.rustc-stable }} RUSTC_NIGHTLY: ${{ needs.get-rust-versions.outputs.rustc-nightly }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | gem install changelogerator git toml ruby $GITHUB_WORKSPACE/polkadot/scripts/github/generate_release_text.rb | tee release_text.md -- GitLab From ae5990c70c5f37dd4494e8f40ceecf0c7d2ed36c Mon Sep 17 00:00:00 2001 From: Robert Habermeier Date: Thu, 13 Aug 2020 15:55:27 +0200 Subject: [PATCH 172/192] Remove v0 parachains runtime (#1501) * remove v0 parachains modules and switch to v1 primitives * get tests compiling for runtime-common * remove registrar module * Add a dummy module * remove runtime-parachains * mostly remove old parachains code from polkadot-runtime * remove slots::Trait implementation * remove sp_std prelude import * add a ZeroSizedTypeDifferentiator to dummy * finish porting over polkadot runtime * ZeroSizedTypeDifferentiator was actually unnecessary * westend * kusama * test-runtime (no dummy modules) * fix warning * fix chain-specs * fix test-service * test-client * remove dead import * remove unused needed_extrinsics parameter * runtimes compile * remove rococo-v0 * remove remaining references to Rococo * bump versions --- Cargo.lock | 76 - Cargo.toml | 1 - cli/src/cli.rs | 4 - cli/src/command.rs | 11 +- network/test/src/block_import.rs | 2 +- node/service/src/chain_spec.rs | 42 - node/service/src/grandpa_support.rs | 2 +- node/test-service/src/chain_spec.rs | 7 - node/test-service/src/lib.rs | 14 +- primitives/src/v1.rs | 19 + runtime/common/src/attestations.rs | 214 -- runtime/common/src/claims.rs | 2 +- runtime/common/src/crowdfund.rs | 12 +- runtime/common/src/dummy.rs | 30 + runtime/common/src/impls.rs | 4 +- runtime/common/src/lib.rs | 38 +- runtime/common/src/parachains.rs | 3691 ------------------------ runtime/common/src/registrar.rs | 1637 ----------- runtime/common/src/slots.rs | 76 +- runtime/kusama/src/lib.rs | 187 +- runtime/polkadot/src/lib.rs | 184 +- runtime/rococo/Cargo.toml | 176 -- runtime/rococo/build.rs | 26 - runtime/rococo/src/constants.rs | 113 - runtime/rococo/src/lib.rs | 1024 ------- runtime/test-runtime/client/src/lib.rs | 7 - runtime/test-runtime/src/lib.rs | 209 +- runtime/westend/src/lib.rs | 170 +- service/Cargo.toml | 1 - service/res/rococo.json | 116 - service/src/chain_spec.rs | 354 --- service/src/client.rs | 4 - service/src/grandpa_support.rs | 2 +- service/src/lib.rs | 58 +- 34 files changed, 394 insertions(+), 8119 deletions(-) delete mode 100644 runtime/common/src/attestations.rs create mode 100644 runtime/common/src/dummy.rs delete mode 100644 runtime/common/src/parachains.rs delete mode 100644 runtime/common/src/registrar.rs delete mode 100644 runtime/rococo/Cargo.toml delete mode 100644 runtime/rococo/build.rs delete mode 100644 runtime/rococo/src/constants.rs delete mode 100644 runtime/rococo/src/lib.rs delete mode 100644 service/res/rococo.json diff --git a/Cargo.lock b/Cargo.lock index 8b8f0ce91d..b4af1a108b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5182,7 +5182,6 @@ dependencies = [ "polkadot-runtime", "polkadot-test-runtime-client", "polkadot-validation", - "rococo-runtime", "sc-authority-discovery", "sc-block-builder", "sc-chain-spec", @@ -6138,81 +6137,6 @@ dependencies = [ "librocksdb-sys", ] -[[package]] -name = "rococo-runtime" -version = "0.8.22" -dependencies = [ - "bitvec", - "frame-benchmarking", - "frame-executive", - "frame-support", - "frame-system", - "frame-system-benchmarking", - "frame-system-rpc-runtime-api", - "hex-literal", - "libsecp256k1", - "log 0.3.9", - "pallet-authority-discovery", - "pallet-authorship", - "pallet-babe", - "pallet-balances", - "pallet-collective", - "pallet-democracy", - "pallet-elections-phragmen", - "pallet-finality-tracker", - "pallet-grandpa", - "pallet-identity", - "pallet-im-online", - "pallet-indices", - "pallet-membership", - "pallet-multisig", - "pallet-nicks", - "pallet-offences", - "pallet-offences-benchmarking", - "pallet-proxy", - "pallet-randomness-collective-flip", - "pallet-recovery", - "pallet-scheduler", - "pallet-session", - "pallet-session-benchmarking", - "pallet-staking", - "pallet-staking-reward-curve", - "pallet-sudo", - "pallet-timestamp", - "pallet-transaction-payment", - "pallet-transaction-payment-rpc-runtime-api", - "pallet-treasury", - "pallet-utility", - "pallet-vesting", - "parity-scale-codec", - "polkadot-parachain", - "polkadot-primitives", - "polkadot-runtime-common", - "rustc-hex", - "serde", - "serde_derive", - "serde_json", - "smallvec 1.4.1", - "sp-api", - "sp-authority-discovery", - "sp-block-builder", - "sp-consensus-babe", - "sp-core", - "sp-inherents", - "sp-io", - "sp-keyring", - "sp-offchain", - "sp-runtime", - "sp-session", - "sp-std", - "sp-transaction-pool", - "sp-trie", - "sp-version", - "static_assertions", - "substrate-wasm-builder-runner 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", - "tiny-keccak 1.5.0", -] - [[package]] name = "rococo-v1-runtime" version = "0.8.22" diff --git a/Cargo.toml b/Cargo.toml index 0fa1ae7e24..c36511f813 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -37,7 +37,6 @@ members = [ "runtime/kusama", "runtime/rococo-v1", "runtime/westend", - "runtime/rococo", "runtime/test-runtime", "runtime/test-runtime/client", "service", diff --git a/cli/src/cli.rs b/cli/src/cli.rs index cb3cfa19f6..d3ec195a97 100644 --- a/cli/src/cli.rs +++ b/cli/src/cli.rs @@ -59,10 +59,6 @@ pub struct RunCmd { #[structopt(long = "force-westend")] pub force_westend: bool, - /// Force using Rococo native runtime. - #[structopt(long)] - pub force_rococo: bool, - /// Enable the authority discovery module on validator or sentry nodes. /// /// When enabled: diff --git a/cli/src/command.rs b/cli/src/command.rs index 1ce9b5550b..4952bdf9c1 100644 --- a/cli/src/command.rs +++ b/cli/src/command.rs @@ -47,7 +47,7 @@ impl SubstrateCli for Cli { fn load_spec(&self, id: &str) -> std::result::Result, String> { let id = if id == "" { let n = get_exec_name().unwrap_or_default(); - ["polkadot", "kusama", "westend", "rococo"].iter() + ["polkadot", "kusama", "westend"].iter() .cloned() .find(|&chain| n.starts_with(chain)) .unwrap_or("polkadot") @@ -65,9 +65,6 @@ impl SubstrateCli for Cli { "westend-dev" => Box::new(service::chain_spec::westend_development_config()?), "westend-local" => Box::new(service::chain_spec::westend_local_testnet_config()?), "westend-staging" => Box::new(service::chain_spec::westend_staging_testnet_config()?), - "rococo-staging" => Box::new(service::chain_spec::rococo_staging_testnet_config()?), - "rococo-local" => Box::new(service::chain_spec::rococo_local_testnet_config()?), - "rococo" => Box::new(service::chain_spec::rococo_config()?), path => { let path = std::path::PathBuf::from(path); @@ -77,9 +74,7 @@ impl SubstrateCli for Cli { // When `force_*` is given or the file name starts with the name of one of the known chains, // we use the chain spec for the specific chain. - if self.run.force_rococo || starts_with("rococo") { - Box::new(service::RococoChainSpec::from_json_file(path)?) - } else if self.run.force_kusama || starts_with("kusama") { + if self.run.force_kusama || starts_with("kusama") { Box::new(service::KusamaChainSpec::from_json_file(path)?) } else if self.run.force_westend || starts_with("westend") { Box::new(service::WestendChainSpec::from_json_file(path)?) @@ -95,8 +90,6 @@ impl SubstrateCli for Cli { &service::kusama_runtime::VERSION } else if spec.is_westend() { &service::westend_runtime::VERSION - } else if spec.is_rococo() { - &service::rococo_runtime::VERSION } else { &service::polkadot_runtime::VERSION } diff --git a/network/test/src/block_import.rs b/network/test/src/block_import.rs index 9791b35da6..4ecc38a537 100644 --- a/network/test/src/block_import.rs +++ b/network/test/src/block_import.rs @@ -29,7 +29,7 @@ fn prepare_good_block() -> (TestClient, Hash, u64, PeerId, IncomingBlock) let mut client = polkadot_test_runtime_client::new(); let mut builder = client.new_block(Default::default()).unwrap(); - let extrinsics = polkadot_test_runtime_client::needed_extrinsics(vec![], 0); + let extrinsics = polkadot_test_runtime_client::needed_extrinsics(0); for extrinsic in &extrinsics { builder.push(extrinsic.clone()).unwrap(); diff --git a/node/service/src/chain_spec.rs b/node/service/src/chain_spec.rs index b90207c53b..6a21478e2f 100644 --- a/node/service/src/chain_spec.rs +++ b/node/service/src/chain_spec.rs @@ -180,13 +180,6 @@ fn polkadot_staging_testnet_config_genesis(wasm_binary: &[u8]) -> polkadot::Gene pallet_authority_discovery: Some(polkadot::AuthorityDiscoveryConfig { keys: vec![], }), - parachains: Some(polkadot::ParachainsConfig { - authorities: vec![], - }), - registrar: Some(polkadot::RegistrarConfig { - parachains: vec![], - _phdata: Default::default(), - }), claims: Some(polkadot::ClaimsConfig { claims: vec![], vesting: vec![], @@ -321,13 +314,6 @@ fn westend_staging_testnet_config_genesis(wasm_binary: &[u8]) -> westend::Genesi pallet_authority_discovery: Some(westend::AuthorityDiscoveryConfig { keys: vec![], }), - parachains: Some(westend::ParachainsConfig { - authorities: vec![], - }), - registrar: Some(westend::RegistrarConfig { - parachains: vec![], - _phdata: Default::default(), - }), pallet_vesting: Some(westend::VestingConfig { vesting: vec![], }), @@ -472,13 +458,6 @@ fn kusama_staging_testnet_config_genesis(wasm_binary: &[u8]) -> kusama::GenesisC pallet_authority_discovery: Some(kusama::AuthorityDiscoveryConfig { keys: vec![], }), - parachains: Some(kusama::ParachainsConfig { - authorities: vec![], - }), - registrar: Some(kusama::RegistrarConfig { - parachains: vec![], - _phdata: Default::default(), - }), claims: Some(kusama::ClaimsConfig { claims: vec![], vesting: vec![], @@ -657,13 +636,6 @@ pub fn polkadot_testnet_genesis( pallet_authority_discovery: Some(polkadot::AuthorityDiscoveryConfig { keys: vec![], }), - parachains: Some(polkadot::ParachainsConfig { - authorities: vec![], - }), - registrar: Some(polkadot::RegistrarConfig{ - parachains: vec![], - _phdata: Default::default(), - }), claims: Some(polkadot::ClaimsConfig { claims: vec![], vesting: vec![], @@ -732,13 +704,6 @@ pub fn kusama_testnet_genesis( pallet_authority_discovery: Some(kusama::AuthorityDiscoveryConfig { keys: vec![], }), - parachains: Some(kusama::ParachainsConfig { - authorities: vec![], - }), - registrar: Some(kusama::RegistrarConfig{ - parachains: vec![], - _phdata: Default::default(), - }), claims: Some(kusama::ClaimsConfig { claims: vec![], vesting: vec![], @@ -796,13 +761,6 @@ pub fn westend_testnet_genesis( pallet_authority_discovery: Some(westend::AuthorityDiscoveryConfig { keys: vec![], }), - parachains: Some(westend::ParachainsConfig { - authorities: vec![], - }), - registrar: Some(westend::RegistrarConfig{ - parachains: vec![], - _phdata: Default::default(), - }), pallet_vesting: Some(westend::VestingConfig { vesting: vec![], }), diff --git a/node/service/src/grandpa_support.rs b/node/service/src/grandpa_support.rs index 2a9b73b086..666595f102 100644 --- a/node/service/src/grandpa_support.rs +++ b/node/service/src/grandpa_support.rs @@ -256,7 +256,7 @@ mod tests { for i in 0..n { let mut builder = client.new_block(Default::default()).unwrap(); - for extrinsic in polkadot_test_runtime_client::needed_extrinsics(vec![], base + i) { + for extrinsic in polkadot_test_runtime_client::needed_extrinsics(base + i) { builder.push(extrinsic).unwrap() } diff --git a/node/test-service/src/chain_spec.rs b/node/test-service/src/chain_spec.rs index 45d9da8f9a..93a614b7d3 100644 --- a/node/test-service/src/chain_spec.rs +++ b/node/test-service/src/chain_spec.rs @@ -155,13 +155,6 @@ fn polkadot_testnet_genesis( pallet_babe: Some(Default::default()), pallet_grandpa: Some(Default::default()), pallet_authority_discovery: Some(polkadot::AuthorityDiscoveryConfig { keys: vec![] }), - parachains: Some(polkadot::ParachainsConfig { - authorities: vec![], - }), - registrar: Some(polkadot::RegistrarConfig { - parachains: vec![], - _phdata: Default::default(), - }), claims: Some(polkadot::ClaimsConfig { claims: vec![], vesting: vec![], diff --git a/node/test-service/src/lib.rs b/node/test-service/src/lib.rs index f82c4b7ad3..6b9fbbf4ec 100644 --- a/node/test-service/src/lib.rs +++ b/node/test-service/src/lib.rs @@ -25,9 +25,11 @@ use futures::future::Future; use polkadot_primitives::v0::{ Block, Hash, CollatorId, Id as ParaId, }; -use polkadot_runtime_common::{parachains, registrar, BlockHashCount}; -use polkadot_service::{new_full, FullNodeHandles, AbstractClient, ClientHandle, ExecuteWithClient}; -use polkadot_test_runtime::{RestrictFunctionality, Runtime, SignedExtra, SignedPayload, VERSION}; +use polkadot_runtime_common::BlockHashCount; +use polkadot_service::{ + new_full, FullNodeHandles, AbstractClient, ClientHandle, ExecuteWithClient, +}; +use polkadot_test_runtime::{Runtime, SignedExtra, SignedPayload, VERSION}; use sc_chain_spec::ChainSpec; use sc_client_api::{execution_extensions::ExecutionStrategies, BlockchainEvents}; use sc_executor::native_executor_instance; @@ -258,7 +260,6 @@ where .unwrap_or(2) as u64; let tip = 0; let extra: SignedExtra = ( - RestrictFunctionality, frame_system::CheckSpecVersion::::new(), frame_system::CheckTxVersion::::new(), frame_system::CheckGenesis::::new(), @@ -266,14 +267,11 @@ where frame_system::CheckNonce::::from(nonce), frame_system::CheckWeight::::new(), pallet_transaction_payment::ChargeTransactionPayment::::from(tip), - registrar::LimitParathreadCommits::::new(), - parachains::ValidateDoubleVoteReports::::new(), ); let raw_payload = SignedPayload::from_raw( function.clone(), extra.clone(), ( - (), VERSION.spec_version, VERSION.transaction_version, genesis_block, @@ -281,8 +279,6 @@ where (), (), (), - (), - (), ), ); let signature = raw_payload.using_encoded(|e| caller.sign(e)); diff --git a/primitives/src/v1.rs b/primitives/src/v1.rs index f79a6cb4c0..5436100022 100644 --- a/primitives/src/v1.rs +++ b/primitives/src/v1.rs @@ -705,6 +705,25 @@ sp_api::decl_runtime_apis! { } } +/// Custom validity errors used in Polkadot while validating transactions. +#[repr(u8)] +pub enum ValidityError { + /// The Ethereum signature is invalid. + InvalidEthereumSignature = 0, + /// The signer has no claim. + SignerHasNoClaim = 1, + /// No permission to execute the call. + NoPermission = 2, + /// An invalid statement was made for a claim. + InvalidStatement = 3, +} + +impl From for u8 { + fn from(err: ValidityError) -> Self { + err as u8 + } +} + #[cfg(test)] mod tests { use super::*; diff --git a/runtime/common/src/attestations.rs b/runtime/common/src/attestations.rs deleted file mode 100644 index 6492f31cea..0000000000 --- a/runtime/common/src/attestations.rs +++ /dev/null @@ -1,214 +0,0 @@ -// Copyright 2019-2020 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 . - -//! A module for tracking all attestations that fell on a given candidate receipt. -//! -//! In the future, it is planned that this module will handle dispute resolution -//! as well. - -use sp_std::prelude::*; -use codec::{Encode, Decode}; -use frame_support::{ - decl_storage, decl_module, decl_error, ensure, - dispatch::DispatchResult, - traits::Get, - weights::DispatchClass, -}; - -use primitives::v0::{Hash, AttestedCandidate, AbridgedCandidateReceipt, Id as ParaId}; -use sp_runtime::RuntimeDebug; -use sp_staking::SessionIndex; - -use inherents::{ProvideInherent, InherentData, MakeFatalError, InherentIdentifier}; -use frame_system::ensure_none; - -/// Parachain blocks included in a recent relay-chain block. -#[derive(Encode, Decode)] -pub struct IncludedBlocks { - /// The actual relay chain block number where blocks were included. - pub actual_number: T::BlockNumber, - /// The session index at this block. - pub session: SessionIndex, - /// The randomness seed at this block. - pub random_seed: [u8; 32], - /// All parachain IDs active at this block. - pub active_parachains: Vec, - /// Hashes of the parachain candidates included at this block. - pub para_blocks: Vec, -} - -/// Attestations kept over time on a parachain block. -#[derive(Encode, Decode)] -pub struct BlockAttestations { - receipt: AbridgedCandidateReceipt, - valid: Vec, // stash account ID of voter. - invalid: Vec, // stash account ID of voter. -} - -/// Additional attestations on a parachain block, after it was included. -#[derive(Encode, Decode, Clone, PartialEq, RuntimeDebug)] -pub struct MoreAttestations; - -/// Something which processes rewards for received attestations. -pub trait RewardAttestation { - /// Reward immediate attestations on parachain blocks. The argument is an iterable of - /// validator indices of the attesting validators. - fn reward_immediate(validator_indices: impl IntoIterator); -} - -impl RewardAttestation for () { - fn reward_immediate(validator_indices: impl IntoIterator) { - // ensure side-effecting iterators do work. - for _ in validator_indices {} - } -} - -impl RewardAttestation for pallet_staking::Module { - fn reward_immediate(validator_indices: impl IntoIterator) { - use pallet_staking::SessionInterface; - - // The number of points to reward for a validity statement. - // https://research.web3.foundation/en/latest/polkadot/Token%20Economics/#payment-details - const STAKING_REWARD_POINTS: u32 = 20; - - let validators = T::SessionInterface::validators(); - - let validator_rewards = validator_indices.into_iter() - .filter_map(|i| validators.get(i as usize).cloned()) - .map(|v| (v, STAKING_REWARD_POINTS)); - - Self::reward_by_ids(validator_rewards); - } -} - -pub trait Trait: pallet_session::Trait { - /// How many blocks ago we're willing to accept attestations for. - type AttestationPeriod: Get; - - /// Get a list of the validators' underlying identities. - type ValidatorIdentities: Get>; - - /// Hook for rewarding validators upon attesting. - type RewardAttestation: RewardAttestation; -} - -decl_storage! { - trait Store for Module as Attestations { - /// A mapping from modular block number (n % AttestationPeriod) - /// to session index and the list of candidate hashes. - pub RecentParaBlocks: map hasher(twox_64_concat) T::BlockNumber => Option>; - - /// Attestations on a recent parachain block. - pub ParaBlockAttestations: - double_map hasher(twox_64_concat) T::BlockNumber, hasher(identity) Hash - => Option>; - - // Did we already have more attestations included in this block? - DidUpdate: bool; - } -} - -decl_error! { - pub enum Error for Module { - /// More attestations can be added only once in a block. - TooManyAttestations, - } -} - -decl_module! { - /// Parachain-attestations module. - pub struct Module for enum Call where origin: ::Origin { - type Error = Error; - - /// Provide candidate receipts for parachains, in ascending order by id. - #[weight = (0, DispatchClass::Mandatory)] - fn more_attestations(origin, _more: MoreAttestations) -> DispatchResult { - ensure_none(origin)?; - ensure!(!DidUpdate::exists(), Error::::TooManyAttestations); - DidUpdate::put(true); - - Ok(()) - } - - fn on_finalize(_n: T::BlockNumber) { - DidUpdate::kill(); - } - } -} - -impl Module { - /// Update recent candidates to contain the already-checked parachain candidates. - pub(crate) fn note_included(heads: &[AttestedCandidate], para_blocks: IncludedBlocks) { - let attestation_period = T::AttestationPeriod::get(); - let mod_num = para_blocks.actual_number % attestation_period; - - // clear old entry that was in this place. - if let Some(old_entry) = >::take(&mod_num) { - >::remove_prefix(&old_entry.actual_number); - } - - let validators = T::ValidatorIdentities::get(); - - // make new entry. - for (head, hash) in heads.iter().zip(¶_blocks.para_blocks) { - let mut valid = Vec::new(); - let invalid = Vec::new(); - - { - let attesting_indices = head.validator_indices - .iter() - .enumerate() - .filter(|(_, bit)| **bit) - .inspect(|&(auth_index, _)| { - if let Some(stash_id) = validators.get(auth_index) { - valid.push(stash_id.clone()); - } - }) - .map(|(i, _)| i as u32); - - T::RewardAttestation::reward_immediate(attesting_indices); - } - - let summary = BlockAttestations { - receipt: head.candidate().clone(), - valid, - invalid, - }; - - >::insert(¶_blocks.actual_number, hash, &summary); - } - - >::insert(&mod_num, ¶_blocks); - } -} - -/// An identifier for inherent data that provides after-the-fact attestations -/// on already included parachain blocks. -pub const MORE_ATTESTATIONS_IDENTIFIER: InherentIdentifier = *b"par-atts"; - -pub type InherentType = MoreAttestations; - -impl ProvideInherent for Module { - type Call = Call; - type Error = MakeFatalError; - const INHERENT_IDENTIFIER: InherentIdentifier = MORE_ATTESTATIONS_IDENTIFIER; - - fn create_inherent(data: &InherentData) -> Option { - data.get_data::(&MORE_ATTESTATIONS_IDENTIFIER) - .ok() - .and_then(|x| x.map(Call::more_attestations)) - } -} diff --git a/runtime/common/src/claims.rs b/runtime/common/src/claims.rs index 6a51da0675..a81117eb3c 100644 --- a/runtime/common/src/claims.rs +++ b/runtime/common/src/claims.rs @@ -35,7 +35,7 @@ use sp_runtime::{ TransactionSource, TransactionValidityError, }, }; -use primitives::v0::ValidityError; +use primitives::v1::ValidityError; type CurrencyOf = <::VestingSchedule as VestingSchedule<::AccountId>>::Currency; type BalanceOf = as Currency<::AccountId>>::Balance; diff --git a/runtime/common/src/crowdfund.rs b/runtime/common/src/crowdfund.rs index be4d8c0ffb..11b7f9af7e 100644 --- a/runtime/common/src/crowdfund.rs +++ b/runtime/common/src/crowdfund.rs @@ -79,7 +79,7 @@ use sp_runtime::{ModuleId, use crate::slots; use codec::{Encode, Decode}; use sp_std::vec::Vec; -use primitives::v0::{Id as ParaId, HeadData}; +use primitives::v1::{Id as ParaId, HeadData}; pub type BalanceOf = <::Currency as Currency<::AccountId>>::Balance; @@ -568,14 +568,14 @@ mod tests { }; use frame_support::traits::{Contains, ContainsLengthBound}; use sp_core::H256; - use primitives::v0::{Info as ParaInfo, Id as ParaId, Scheduling, ValidationCode}; + use primitives::v1::{Id as ParaId, ValidationCode}; // The testing primitives are very useful for avoiding having to work with signatures // or public keys. `u64` is used as the `AccountId` and no `Signature`s are requried. use sp_runtime::{ Perbill, Permill, Percent, testing::Header, DispatchResult, traits::{BlakeTwo256, IdentityLookup}, }; - use crate::registrar::Registrar; + use crate::slots::Registrar; impl_outer_origin! { pub enum Origin for Test {} @@ -699,13 +699,9 @@ mod tests { code_size <= MAX_CODE_SIZE } - fn para_info(_id: ParaId) -> Option { - Some(ParaInfo { scheduling: Scheduling::Always }) - } - fn register_para( id: ParaId, - _info: ParaInfo, + _parachain: bool, code: ValidationCode, initial_head_data: HeadData, ) -> DispatchResult { diff --git a/runtime/common/src/dummy.rs b/runtime/common/src/dummy.rs new file mode 100644 index 0000000000..73f5392065 --- /dev/null +++ b/runtime/common/src/dummy.rs @@ -0,0 +1,30 @@ +// Copyright 2020 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 . + +//! A dummy module for holding place of modules in a runtime. + +use frame_support::{decl_module, decl_storage}; + +pub trait Trait: frame_system::Trait { } + +decl_module! { + pub struct Module, I: Instance = DefaultInstance> for enum Call where origin: T::Origin { + } +} + +decl_storage! { + trait Store for Module, I: Instance = DefaultInstance> as Dummy { } +} diff --git a/runtime/common/src/impls.rs b/runtime/common/src/impls.rs index 47349d1f2e..111fc00e24 100644 --- a/runtime/common/src/impls.rs +++ b/runtime/common/src/impls.rs @@ -26,8 +26,8 @@ pub struct ToAuthor(sp_std::marker::PhantomData); impl OnUnbalanced> for ToAuthor where R: pallet_balances::Trait + pallet_authorship::Trait, - ::AccountId: From, - ::AccountId: Into, + ::AccountId: From, + ::AccountId: Into, ::Event: From::AccountId, ::Balance, diff --git a/runtime/common/src/lib.rs b/runtime/common/src/lib.rs index c512e822cf..50218d39d5 100644 --- a/runtime/common/src/lib.rs +++ b/runtime/common/src/lib.rs @@ -18,18 +18,17 @@ #![cfg_attr(not(feature = "std"), no_std)] -pub mod attestations; pub mod claims; -pub mod parachains; pub mod slot_range; -pub mod registrar; pub mod slots; pub mod crowdfund; pub mod purchase; pub mod impls; pub mod paras_sudo_wrapper; -use primitives::v0::BlockNumber; +pub mod dummy; + +use primitives::v1::{BlockNumber, ValidatorId}; use sp_runtime::{Perquintill, Perbill, FixedPointNumber, traits::Saturating}; use frame_support::{ parameter_types, traits::{Currency}, @@ -45,8 +44,6 @@ pub use pallet_staking::StakerStatus; pub use sp_runtime::BuildStorage; pub use pallet_timestamp::Call as TimestampCall; pub use pallet_balances::Call as BalancesCall; -pub use attestations::{Call as AttestationsCall, MORE_ATTESTATIONS_IDENTIFIER}; -pub use parachains::Call as ParachainsCall; /// Implementations of some helper traits passed into runtime modules as associated types. pub use impls::{CurrencyToVoteHandler, ToAuthor}; @@ -92,6 +89,35 @@ pub type SlowAdjustingFeeUpdate = TargetedFeeAdjustment< MinimumMultiplier >; +/// A placeholder since there is currently no provided session key handler for parachain validator +/// keys. +pub struct ParachainSessionKeyPlaceholder(sp_std::marker::PhantomData); +impl sp_runtime::BoundToRuntimeAppPublic for ParachainSessionKeyPlaceholder { + type Public = ValidatorId; +} + +impl + pallet_session::OneSessionHandler for ParachainSessionKeyPlaceholder +{ + type Key = ValidatorId; + + fn on_genesis_session<'a, I: 'a>(_validators: I) where + I: Iterator, + T::AccountId: 'a + { + + } + + fn on_new_session<'a, I: 'a>(_changed: bool, _v: I, _q: I) where + I: Iterator, + T::AccountId: 'a + { + + } + + fn on_disabled(_: usize) { } +} + #[cfg(test)] mod multiplier_tests { use super::*; diff --git a/runtime/common/src/parachains.rs b/runtime/common/src/parachains.rs deleted file mode 100644 index ce28012aae..0000000000 --- a/runtime/common/src/parachains.rs +++ /dev/null @@ -1,3691 +0,0 @@ -// Copyright 2017-2020 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 . - -//! Main parachains logic. For now this is just the determination of which validators do what. - -use sp_std::prelude::*; -use sp_std::result; -use codec::{Decode, Encode}; -use sp_runtime::{ - KeyTypeId, Perbill, RuntimeDebug, - traits::{ - Hash as HashT, BlakeTwo256, Saturating, One, Zero, Dispatchable, - AccountIdConversion, BadOrigin, Convert, SignedExtension, AppVerify, - DispatchInfoOf, - }, - transaction_validity::{TransactionValidityError, ValidTransaction, TransactionValidity}, -}; -use sp_staking::{ - SessionIndex, - offence::{ReportOffence, Offence, Kind}, -}; -use frame_support::{ - traits::KeyOwnerProofSystem, - dispatch::IsSubType, - weights::{DispatchClass, Weight}, -}; -use primitives::v0::{ - Balance, BlockNumber, - Id as ParaId, Chain, DutyRoster, AttestedCandidate, CompactStatement as Statement, ParachainDispatchOrigin, - UpwardMessage, ValidatorId, ActiveParas, CollatorId, Retriable, OmittedValidationData, - CandidateReceipt, GlobalValidationData, AbridgedCandidateReceipt, - LocalValidationData, Scheduling, ValidityAttestation, NEW_HEADS_IDENTIFIER, PARACHAIN_KEY_TYPE_ID, - ValidatorSignature, SigningContext, HeadData, ValidationCode, - Remark, DownwardMessage -}; -use frame_support::{ - Parameter, dispatch::DispatchResult, decl_storage, decl_module, decl_error, ensure, - traits::{Currency, Get, WithdrawReason, ExistenceRequirement, Randomness}, -}; -use sp_runtime::transaction_validity::InvalidTransaction; - -use inherents::{ProvideInherent, InherentData, MakeFatalError, InherentIdentifier}; - -use frame_system::{ - ensure_none, ensure_signed, - offchain::{CreateSignedTransaction, SendSignedTransaction, Signer}, -}; -use crate::attestations::{self, IncludedBlocks}; -use crate::registrar::Registrar; - -// ranges for iteration of general block number don't work, so this -// is a utility to get around that. -struct BlockNumberRange { - low: N, - high: N, -} - -impl Iterator for BlockNumberRange { - type Item = N; - - fn next(&mut self) -> Option { - if self.low >= self.high { - return None - } - - let item = self.low.clone(); - self.low = self.low.clone().saturating_add(One::one()); - Some(item) - } -} - -// wrapper trait because an associated type of `Currency` -// doesn't work.` -pub trait ParachainCurrency { - fn free_balance(para_id: ParaId) -> Balance; - fn deduct(para_id: ParaId, amount: Balance) -> DispatchResult; - fn transfer_in( - source: &AccountId, - dest: ParaId, - amount: Balance, - existence_requirement: ExistenceRequirement, - ) -> DispatchResult; - fn transfer_out( - source: ParaId, - dest: &AccountId, - amount: Balance, - existence_requirement: ExistenceRequirement, - ) -> DispatchResult; -} - -impl> ParachainCurrency for T where - T::Balance: From + Into, - ParaId: AccountIdConversion, -{ - fn free_balance(para_id: ParaId) -> Balance { - let para_account = para_id.into_account(); - T::free_balance(¶_account).into() - } - - // TODO: this should really be the same API as `withdraw`, having NegativeImbalance as an - // associated type. - fn deduct(para_id: ParaId, amount: Balance) -> DispatchResult { - let para_account = para_id.into_account(); - - // burn the fee. - let _ = T::withdraw( - ¶_account, - amount.into(), - WithdrawReason::Fee.into(), - ExistenceRequirement::KeepAlive, - )?; - - Ok(()) - } - - fn transfer_in( - source: &AccountId, - dest: ParaId, - amount: Balance, - existence_requirement: ExistenceRequirement, - ) -> DispatchResult { - T::transfer(source, &dest.into_account(), amount.into(), existence_requirement) - } - - fn transfer_out( - source: ParaId, - dest: &AccountId, - amount: Balance, - existence_requirement: ExistenceRequirement, - ) -> DispatchResult { - T::transfer(&source.into_account(), dest, amount.into(), existence_requirement) - } -} - -/// Interface to the persistent (stash) identities of the current validators. -pub struct ValidatorIdentities(sp_std::marker::PhantomData); - -/// A structure used to report conflicting votes by validators. -/// -/// It is generic over two parameters: -/// `Proof` - proof of historical ownership of a key by some validator. -/// `Hash` - a type of a hash used in the runtime. -#[derive(RuntimeDebug, Encode, Decode)] -#[derive(Clone, Eq, PartialEq)] -pub struct DoubleVoteReport { - /// Identity of the double-voter. - pub identity: ValidatorId, - /// First vote of the double-vote. - pub first: (Statement, ValidatorSignature), - /// Second vote of the double-vote. - pub second: (Statement, ValidatorSignature), - /// Proof that the validator with `identity` id was actually a validator at `parent_hash`. - pub proof: Proof, - /// A `SigningContext` with a session and a parent hash of the moment this offence was commited. - pub signing_context: SigningContext, -} - -impl DoubleVoteReport { - fn verify>( - &self, - ) -> Result<(), DoubleVoteValidityError> { - let first = self.first.clone(); - let second = self.second.clone(); - let id = self.identity.clone(); - - T::KeyOwnerProofSystem::check_proof((PARACHAIN_KEY_TYPE_ID, id), self.proof.clone()) - .ok_or(DoubleVoteValidityError::InvalidProof)?; - - if self.proof.session() != self.signing_context.session_index { - return Err(DoubleVoteValidityError::InvalidReport); - } - - // Check signatures. - Self::verify_vote( - &first, - &self.signing_context, - &self.identity, - )?; - Self::verify_vote( - &second, - &self.signing_context, - &self.identity, - )?; - - match (&first.0, &second.0) { - // If issuing a `Candidate` message on a parachain block, neither a `Valid` or - // `Invalid` vote cannot be issued on that parachain block, as the `Candidate` - // message is an implicit validity vote. - (Statement::Candidate(candidate_hash), Statement::Valid(hash)) | - (Statement::Candidate(candidate_hash), Statement::Invalid(hash)) | - (Statement::Valid(hash), Statement::Candidate(candidate_hash)) | - (Statement::Invalid(hash), Statement::Candidate(candidate_hash)) - if *candidate_hash == *hash => {}, - // Otherwise, it is illegal to cast both a `Valid` and - // `Invalid` vote on a given parachain block. - (Statement::Valid(hash_1), Statement::Invalid(hash_2)) | - (Statement::Invalid(hash_1), Statement::Valid(hash_2)) - if *hash_1 == *hash_2 => {}, - _ => { - return Err(DoubleVoteValidityError::NotDoubleVote); - } - } - - Ok(()) - } - - fn verify_vote( - vote: &(Statement, ValidatorSignature), - signing_context: &SigningContext, - authority: &ValidatorId, - ) -> Result<(), DoubleVoteValidityError> { - let payload = localized_payload(vote.0.clone(), signing_context); - - if !vote.1.verify(&payload[..], authority) { - return Err(DoubleVoteValidityError::InvalidSignature); - } - - Ok(()) - } -} - -impl Get> for ValidatorIdentities { - fn get() -> Vec { - >::validators() - } -} - -/// A trait to get a session number the `MembershipProof` belongs to. -pub trait GetSessionNumber { - fn session(&self) -> SessionIndex; -} - -impl GetSessionNumber for sp_session::MembershipProof { - fn session(&self) -> SessionIndex { - self.session - } -} - -pub trait Trait: CreateSignedTransaction> + attestations::Trait + pallet_session::historical::Trait { - // The transaction signing authority - type AuthorityId: frame_system::offchain::AppCrypto; - - /// The outer origin type. - type Origin: From - + From<::Origin> - + Into::Origin>>; - - /// The outer call dispatch type. - type Call: Parameter + Dispatchable::Origin> + From>; - - /// Some way of interacting with balances for fees and transfers. - type ParachainCurrency: ParachainCurrency; - - /// Polkadot in practice will always use the `BlockNumber` type. - /// Substrate isn't good at giving us ways to bound the supertrait - /// associated type, so we introduce this conversion. - type BlockNumberConversion: Convert; - - /// Something that provides randomness in the runtime. - type Randomness: Randomness; - - /// Means to determine what the current set of active parachains are. - type ActiveParachains: ActiveParas; - - /// The way that we are able to register parachains. - type Registrar: Registrar; - - /// Maximum code size for parachains, in bytes. Note that this is not - /// the entire storage burden of the parachain, as old code is stored for - /// `SlashPeriod` blocks. - type MaxCodeSize: Get; - - /// Max head data size. - type MaxHeadDataSize: Get; - /// The frequency at which paras can upgrade their validation function. - /// This is an integer number of relay-chain blocks that must pass between - /// code upgrades. - type ValidationUpgradeFrequency: Get; - - /// The delay before a validation function upgrade is applied. - type ValidationUpgradeDelay: Get; - - /// The period (in blocks) that slash reports are permitted against an - /// included candidate. - /// - /// After validation function upgrades, the old code is persisted on-chain - /// for this period, to ensure that candidates validated under old functions - /// can be re-checked. - type SlashPeriod: Get; - - /// Proof type. - /// - /// We need this type to bind the `KeyOwnerProofSystem::Proof` to necessary bounds. - /// As soon as https://rust-lang.github.io/rfcs/2289-associated-type-bounds.html - /// gets in this can be simplified. - type Proof: Parameter + GetSessionNumber; - - /// Compute and check proofs of historical key owners. - type KeyOwnerProofSystem: KeyOwnerProofSystem< - (KeyTypeId, ValidatorId), - Proof = Self::Proof, - IdentificationTuple = Self::IdentificationTuple, - >; - - /// An identification tuple type bound to `Parameter`. - type IdentificationTuple: Parameter; - - /// Report an offence. - type ReportOffence: ReportOffence< - Self::AccountId, - Self::IdentificationTuple, - DoubleVoteOffence, - >; - - /// A type that converts the opaque hash type to exact one. - type BlockHashConversion: Convert; -} - -/// Origin for the parachains module. -#[derive(PartialEq, Eq, Clone, Encode, Decode)] -#[cfg_attr(feature = "std", derive(Debug))] -pub enum Origin { - /// It comes from a parachain. - Parachain(ParaId), -} - -/// An offence that is filed if the validator has submitted a double vote. -#[derive(RuntimeDebug)] -#[cfg_attr(feature = "std", derive(Clone, PartialEq, Eq))] -pub struct DoubleVoteOffence { - /// The current session index in which we report a validator. - session_index: SessionIndex, - /// The size of the validator set in current session/era. - validator_set_count: u32, - /// An offender that has submitted two conflicting votes. - offender: Offender, -} - -impl Offence for DoubleVoteOffence { - const ID: Kind = *b"para:double-vote"; - type TimeSlot = SessionIndex; - - fn offenders(&self) -> Vec { - vec![self.offender.clone()] - } - - fn session_index(&self) -> SessionIndex { - self.session_index - } - - fn validator_set_count(&self) -> u32 { - self.validator_set_count - } - - fn time_slot(&self) -> Self::TimeSlot { - self.session_index - } - - fn slash_fraction(_offenders_count: u32, _validator_set_count: u32) -> Perbill { - // Slash 100%. - Perbill::from_percent(100) - } -} - -/// Total number of individual messages allowed in the relay-chain -> parachain message queue. -const MAX_DOWNWARD_QUEUE_COUNT: usize = 10; -/// Total number of individual messages allowed in the parachain -> relay-chain message queue. -const MAX_QUEUE_COUNT: usize = 100; -/// Total size of messages allowed in the parachain -> relay-chain message queue before which no -/// further messages may be added to it. If it exceeds this then the queue may contain only a -/// single message. -const WATERMARK_QUEUE_SIZE: usize = 20000; - -/// Metadata used to track previous parachain validation code that we keep in -/// the state. -#[derive(Default, Encode, Decode)] -#[cfg_attr(test, derive(Debug, Clone, PartialEq))] -pub struct ParaPastCodeMeta { - // Block numbers where the code was replaced. These can be used as indices - // into the `PastCode` map along with the `ParaId` to fetch the code itself. - upgrade_times: Vec, - // This tracks the highest pruned code-replacement, if any. - last_pruned: Option, -} - -#[cfg_attr(test, derive(Debug, PartialEq))] -enum UseCodeAt { - // Use the current code. - Current, - // Use the code that was replaced at the given block number. - ReplacedAt(N), -} - -impl ParaPastCodeMeta { - // note a replacement has occurred at a given block number. - fn note_replacement(&mut self, at: N) { - self.upgrade_times.insert(0, at) - } - - // Yields the block number of the code that should be used for validating at - // the given block number. - // - // a return value of `None` means that there is no code we are aware of that - // should be used to validate at the given height. - fn code_at(&self, at: N) -> Option> { - // The `PastCode` map stores the code which was replaced at `t`. - let end_position = self.upgrade_times.iter().position(|&t| t < at); - if let Some(end_position) = end_position { - Some(if end_position != 0 { - // `end_position` gives us the replacement time where the code used at `at` - // was set. But that code has been replaced: `end_position - 1` yields - // that index. - UseCodeAt::ReplacedAt(self.upgrade_times[end_position - 1]) - } else { - // the most recent tracked replacement is before `at`. - // this means that the code put in place then (i.e. the current code) - // is correct for validating at `at`. - UseCodeAt::Current - }) - } else { - if self.last_pruned.as_ref().map_or(true, |&n| n < at) { - // Our `last_pruned` is before `at`, so we still have the code! - // but no code upgrade entries found before the `at` parameter. - // - // this means one of two things is true: - // 1. there are no non-pruned upgrade logs. in this case use `Current` - // 2. there are non-pruned upgrade logs all after `at`. - // in this case use the oldest upgrade log. - Some(self.upgrade_times.last() - .map(|n| UseCodeAt::ReplacedAt(*n)) - .unwrap_or(UseCodeAt::Current) - ) - } else { - // We don't have the code anymore. - None - } - } - } - - // The block at which the most recently tracked code change occurred. - fn most_recent_change(&self) -> Option { - self.upgrade_times.first().map(|x| x.clone()) - } - - // prunes all code upgrade logs occurring at or before `max`. - // note that code replaced at `x` is the code used to validate all blocks before - // `x`. Thus, `max` should be outside of the slashing window when this is invoked. - // - // returns an iterator of block numbers at which code was replaced, where the replaced - // code should be now pruned, in ascending order. - fn prune_up_to(&'_ mut self, max: N) -> impl Iterator + '_ { - match self.upgrade_times.iter().position(|&t| t <= max) { - None => { - // this is a no-op `drain` - desired because all - // logged code upgrades occurred after `max`. - self.upgrade_times.drain(self.upgrade_times.len()..).rev() - } - Some(pos) => { - self.last_pruned = Some(self.upgrade_times[pos]); - self.upgrade_times.drain(pos..).rev() - } - } - } -} - -decl_storage! { - trait Store for Module as Parachains { - /// All authorities' keys at the moment. - pub Authorities get(fn authorities): Vec; - /// The active code of a currently-registered parachain. - pub Code get(fn parachain_code): map hasher(twox_64_concat) ParaId => Option; - /// Past code of parachains. The parachains themselves may not be registered anymore, - /// but we also keep their code on-chain for the same amount of time as outdated code - /// to assist with availability. - PastCodeMeta get(fn past_code_meta): map hasher(twox_64_concat) ParaId => ParaPastCodeMeta; - /// Actual past code, indicated by the parachain and the block number at which it - /// became outdated. - PastCode: map hasher(twox_64_concat) (ParaId, T::BlockNumber) => Option; - /// Past code pruning, in order of priority. - PastCodePruning get(fn past_code_pruning_tasks): Vec<(ParaId, T::BlockNumber)>; - // The block number at which the planned code change is expected for a para. - // The change will be applied after the first parablock for this ID included which executes - // in the context of a relay chain block with a number >= `expected_at`. - FutureCodeUpgrades get(fn code_upgrade_schedule): map hasher(twox_64_concat) ParaId => Option; - // The actual future code of a para. - FutureCode: map hasher(twox_64_concat) ParaId => ValidationCode; - - /// The heads of the parachains registered at present. - pub Heads get(fn parachain_head): map hasher(twox_64_concat) ParaId => Option; - /// Messages ready to be dispatched onto the relay chain. It is subject to - /// `MAX_MESSAGE_COUNT` and `WATERMARK_MESSAGE_SIZE`. - pub RelayDispatchQueue: map hasher(twox_64_concat) ParaId => Vec; - /// Size of the dispatch queues. Separated from actual data in order to avoid costly - /// decoding when checking receipt validity. First item in tuple is the count of messages - /// second if the total length (in bytes) of the message payloads. - pub RelayDispatchQueueSize: map hasher(twox_64_concat) ParaId => (u32, u32); - /// The ordered list of ParaIds that have a `RelayDispatchQueue` entry. - NeedsDispatch: Vec; - - /// `Some` if the parachain heads get updated in this block, along with the parachain IDs - /// that did update. Ordered in the same way as `registrar::Active` (i.e. by ParaId). - /// - /// `None` if not yet updated. - pub DidUpdate: Option>; - - /// Messages waiting to be delivered from the Relay chain into the parachain. - pub DownwardMessageQueue: map hasher(twox_64_concat) ParaId => Vec>; - } - add_extra_genesis { - config(authorities): Vec; - build(|config| Module::::initialize_authorities(&config.authorities)) - } -} - -decl_error! { - pub enum Error for Module { - /// Parachain heads must be updated only once in the block. - TooManyHeadUpdates, - /// Too many parachain candidates. - TooManyParaCandidates, - /// Proposed heads must be ascending order by parachain ID without duplicate. - HeadsOutOfOrder, - /// Candidate is for an unregistered parachain. - UnregisteredPara, - /// Invalid collator. - InvalidCollator, - /// The message queue is full. Messages will be added when there is space. - QueueFull, - /// The message origin is invalid. - InvalidMessageOrigin, - /// No validator group for parachain. - NoValidatorGroup, - /// Not enough validity votes for candidate. - NotEnoughValidityVotes, - /// The number of attestations exceeds the number of authorities. - VotesExceedsAuthorities, - /// Attesting validator not on this chain's validation duty. - WrongValidatorAttesting, - /// Invalid signature from attester. - InvalidSignature, - /// Extra untagged validity votes along with candidate. - UntaggedVotes, - /// Wrong parent head for parachain receipt. - ParentMismatch, - /// Head data was too large. - HeadDataTooLarge, - /// New validation code was too large. - ValidationCodeTooLarge, - /// Disallowed code upgrade. - DisallowedCodeUpgrade, - /// Para does not have enough balance to pay fees. - CannotPayFees, - /// Unexpected relay-parent for a candidate receipt. - UnexpectedRelayParent, - /// Downward message queue is full for the Parachain. - DownwardMessageQueueFull, - } -} - -decl_module! { - /// Parachains module. - pub struct Module for enum Call where origin: ::Origin { - type Error = Error; - - fn on_initialize(now: T::BlockNumber) -> Weight { - ::DidUpdate::kill(); - - Self::do_old_code_pruning(now); - - // TODO https://github.com/paritytech/polkadot/issues/977: set correctly - 0 - } - - fn on_finalize() { - assert!(::DidUpdate::exists(), "Parachain heads must be updated once in the block"); - } - - /// Provide candidate receipts for parachains, in ascending order by id. - #[weight = (1_000_000_000, DispatchClass::Mandatory)] - pub fn set_heads(origin, heads: Vec) -> DispatchResult { - ensure_none(origin)?; - ensure!(!::exists(), Error::::TooManyHeadUpdates); - - let active_parachains = Self::active_parachains(); - - let parachain_count = active_parachains.len(); - ensure!(heads.len() <= parachain_count, Error::::TooManyParaCandidates); - - let mut proceeded = Vec::with_capacity(heads.len()); - - let schedule = Self::global_validation_data(); - - if !active_parachains.is_empty() { - // perform integrity checks before writing to storage. - { - let mut last_id = None; - - let mut iter = active_parachains.iter(); - for head in &heads { - let id = head.parachain_index(); - // proposed heads must be ascending order by parachain ID without duplicate. - ensure!( - last_id.as_ref().map_or(true, |x| x < &id), - Error::::HeadsOutOfOrder - ); - - // must be unknown since active parachains are always sorted. - let (_, maybe_required_collator) = iter.find(|para| para.0 == id) - .ok_or(Error::::UnregisteredPara)?; - - if let Some((required_collator, _)) = maybe_required_collator { - ensure!(required_collator == &head.candidate.collator, Error::::InvalidCollator); - } - - Self::check_upward_messages( - id, - &head.candidate.commitments.upward_messages, - MAX_QUEUE_COUNT, - WATERMARK_QUEUE_SIZE, - )?; - - Self::remove_processed_downward_messages( - id, - head.candidate.commitments.processed_downward_messages as usize, - ); - - let id = head.parachain_index(); - proceeded.push(id); - last_id = Some(id); - } - } - - let para_blocks = Self::check_candidates( - &schedule, - &heads, - &active_parachains, - )?; - - >::note_included(&heads, para_blocks); - - Self::update_routing( - &heads, - ); - - // note: we dispatch new messages _after_ the call to `check_candidates` - // which deducts any fees. if that were not the case, an upward message - // could be dispatched and spend money that invalidated a candidate. - Self::dispatch_upward_messages( - MAX_QUEUE_COUNT, - WATERMARK_QUEUE_SIZE, - Self::dispatch_message, - ); - } - - DidUpdate::put(proceeded); - - Ok(()) - } - - /// Provide a proof that some validator has commited a double-vote. - /// - /// The weight is 0; in order to avoid DoS a `SignedExtension` validation - /// is implemented. - #[weight = 0] - pub fn report_double_vote( - origin, - report: DoubleVoteReport< - >::Proof, - >, - ) -> DispatchResult { - let reporter = ensure_signed(origin)?; - - let validators = >::validators(); - let validator_set_count = validators.len() as u32; - - let session_index = report.proof.session(); - let DoubleVoteReport { identity, proof, .. } = report; - - // We have already checked this proof in `SignedExtension`, but we need - // this here to get the full identification of the offender. - let offender = T::KeyOwnerProofSystem::check_proof( - (PARACHAIN_KEY_TYPE_ID, identity), - proof, - ).ok_or("Invalid/outdated key ownership proof.")?; - - let offence = DoubleVoteOffence { - session_index, - validator_set_count, - offender, - }; - - // Checks if this is actually a double vote are - // implemented in `ValidateDoubleVoteReports::validete`. - T::ReportOffence::report_offence(vec![reporter], offence) - .map_err(|_| "Failed to report offence")?; - - Ok(()) - } - - /// Transfer some tokens into a parachain and leave a message in the downward queue for it. - #[weight = 100_000] - pub fn transfer_to_parachain( - origin, - to: ParaId, - amount: Balance, - remark: Remark, - ) { - let who = ensure_signed(origin)?; - let downward_queue_count = DownwardMessageQueue::::decode_len(to).unwrap_or(0); - ensure!(downward_queue_count < MAX_DOWNWARD_QUEUE_COUNT, Error::::DownwardMessageQueueFull); - T::ParachainCurrency::transfer_in(&who, to, amount, ExistenceRequirement::AllowDeath)?; - DownwardMessageQueue::::append(to, DownwardMessage::TransferInto(who, amount, remark)); - } - - /// Send a XCMP message to the given parachain. - /// - /// The origin must be another parachain. - #[weight = 100_000] - pub fn send_xcmp_message( - origin, - to: ParaId, - msg: Vec, - ) { - ensure_parachain(::Origin::from(origin))?; - let downward_queue_count = DownwardMessageQueue::::decode_len(to).unwrap_or(0); - ensure!(downward_queue_count < MAX_DOWNWARD_QUEUE_COUNT, Error::::DownwardMessageQueueFull); - DownwardMessageQueue::::append(to, DownwardMessage::XCMPMessage(msg)); - } - } -} - -fn majority_of(list_len: usize) -> usize { - list_len / 2 + list_len % 2 -} - -fn localized_payload( - statement: Statement, - signing_context: &SigningContext, -) -> Vec { - let mut encoded = statement.encode(); - signing_context.using_encoded(|s| encoded.extend(s)); - encoded -} - -/// Iterator that returns groups of validators that are assigned to the same chain. -/// -/// Assumes that the inner validators are sorted by chain id. -struct GroupedDutyIter<'a> { - next_idx: usize, - inner: &'a [(usize, ParaId)], -} - -impl<'a> GroupedDutyIter<'a> { - fn new(inner: &'a [(usize, ParaId)]) -> Self { - GroupedDutyIter { next_idx: 0, inner } - } - - fn group_for(&mut self, wanted_id: ParaId) -> Option<&'a [(usize, ParaId)]> { - while let Some((id, keys)) = self.next() { - if wanted_id == id { - return Some(keys) - } - } - - None - } -} - -impl<'a> Iterator for GroupedDutyIter<'a> { - type Item = (ParaId, &'a [(usize, ParaId)]); - - fn next(&mut self) -> Option { - if self.next_idx == self.inner.len() { return None } - let start_idx = self.next_idx; - self.next_idx += 1; - let start_id = self.inner[start_idx].1; - - while self.inner.get(self.next_idx).map_or(false, |&(_, ref id)| id == &start_id) { - self.next_idx += 1; - } - - Some((start_id, &self.inner[start_idx..self.next_idx])) - } -} - -/// Convert a duty roster, which is originally a Vec, where each -/// item corresponds to the same position in the session keys, into -/// a list containing (index, parachain duty) where indices are into the session keys. -/// This list is sorted ascending by parachain duty, just like the -/// parachain candidates are. -fn make_sorted_duties(duty: &[Chain]) -> Vec<(usize, ParaId)> { - let mut sorted_duties = Vec::with_capacity(duty.len()); - for (val_idx, duty) in duty.iter().enumerate() { - let id = match duty { - Chain::Relay => continue, - Chain::Parachain(id) => id, - }; - - let idx = sorted_duties.binary_search_by_key(&id, |&(_, ref id)| id) - .unwrap_or_else(|idx| idx); - - sorted_duties.insert(idx, (val_idx, *id)); - } - - sorted_duties -} - -impl Module { - /// Initialize the state of a new parachain/parathread. - pub fn initialize_para( - id: ParaId, - code: ValidationCode, - initial_head_data: HeadData, - ) { - ::insert(id, code); - ::insert(id, initial_head_data); - } - - /// Cleanup all storage related to a para. Some pieces of data may remain - /// available in the on-chain state. - pub fn cleanup_para( - id: ParaId, - ) { - let code = ::take(id); - ::remove(id); - - // clean up from all code-upgrade maps. - // we don't clean up the meta or planned-code maps as that's handled - // by the pruning process. - if let Some(_planned_future_at) = ::FutureCodeUpgrades::take(&id) { - ::FutureCode::remove(&id); - } - - if let Some(code) = code { - Self::note_past_code(id, >::block_number(), code); - } - } - - // note replacement of the code of para with given `id`, which occured in the - // context of the given relay-chain block number. provide the replaced code. - // - // `at` for para-triggered replacement is the block number of the relay-chain - // block in whose context the parablock was executed - // (i.e. number of `relay_parent` in the receipt) - fn note_past_code(id: ParaId, at: T::BlockNumber, old_code: ValidationCode) { - ::PastCodeMeta::mutate(&id, |past_meta| { - past_meta.note_replacement(at); - }); - - ::PastCode::insert(&(id, at), old_code); - - // Schedule pruning for this past-code to be removed as soon as it - // exits the slashing window. - ::PastCodePruning::mutate(|pruning| { - let insert_idx = pruning.binary_search_by_key(&at, |&(_, b)| b) - .unwrap_or_else(|idx| idx); - pruning.insert(insert_idx, (id, at)); - }) - } - - // does old code pruning. - fn do_old_code_pruning(now: T::BlockNumber) { - let slash_period = T::SlashPeriod::get(); - if now <= slash_period { return } - - // The height of any changes we no longer should keep around. - let pruning_height = now - (slash_period + One::one()); - - ::PastCodePruning::mutate(|pruning_tasks: &mut Vec<(_, T::BlockNumber)>| { - let pruning_tasks_to_do = { - // find all past code that has just exited the pruning window. - let up_to_idx = pruning_tasks.iter() - .take_while(|&(_, at)| at <= &pruning_height) - .count(); - pruning_tasks.drain(..up_to_idx) - }; - - for (para_id, _) in pruning_tasks_to_do { - let full_deactivate = ::PastCodeMeta::mutate(¶_id, |meta| { - for pruned_repl_at in meta.prune_up_to(pruning_height) { - ::PastCode::remove(&(para_id, pruned_repl_at)); - } - - meta.most_recent_change().is_none() && Self::parachain_head(¶_id).is_none() - }); - - // This parachain has been removed and now the vestigial code - // has been removed from the state. clean up meta as well. - if full_deactivate { - ::PastCodeMeta::remove(¶_id); - } - } - }); - } - - // Performs a code upgrade of a parachain. - fn do_code_upgrade(id: ParaId, at: T::BlockNumber, new_code: &ValidationCode) { - let old_code = Self::parachain_code(&id).unwrap_or_default(); - Code::insert(&id, new_code); - - Self::note_past_code(id, at, old_code); - } - - /// Get a `SigningContext` with a current `SessionIndex` and parent hash. - pub fn signing_context() -> SigningContext { - let session_index = >::current_index(); - let parent_hash = >::parent_hash(); - - SigningContext { - session_index, - parent_hash: T::BlockHashConversion::convert(parent_hash), - } - } - - /// Submit a double vote report. - pub fn submit_double_vote_report( - report: DoubleVoteReport, - ) -> Option<()> { - Signer::::all_accounts() - .send_signed_transaction( - move |_account| { - Call::report_double_vote(report.clone()) - } - ) - .iter() - .find_map(|(_, res)| res.ok().map(|_| ())) - } - - /// Dispatch some messages from a parachain. - fn dispatch_message( - id: ParaId, - origin: ParachainDispatchOrigin, - data: &[u8], - ) { - if let Ok(message_call) = ::Call::decode(&mut &data[..]) { - let origin: ::Origin = match origin { - ParachainDispatchOrigin::Signed => - ::Origin::from(::Origin::from(frame_system::RawOrigin::Signed(id.into_account()))), - ParachainDispatchOrigin::Parachain => - Origin::Parachain(id).into(), - ParachainDispatchOrigin::Root => - ::Origin::from(::Origin::from(frame_system::RawOrigin::Root)), - }; - let _ok = message_call.dispatch(origin).is_ok(); - // Not much to do with the result as it is. It's up to the parachain to ensure that the - // message makes sense. - } - } - - /// Ensure all is well with the upward messages. - fn check_upward_messages( - id: ParaId, - upward_messages: &[UpwardMessage], - max_queue_count: usize, - watermark_queue_size: usize, - ) -> DispatchResult { - // Either there are no more messages to add... - if !upward_messages.is_empty() { - let (count, size) = ::get(id); - ensure!( - // ...or we are appending one message onto an empty queue... - upward_messages.len() + count as usize == 1 - // ...or... - || ( - // ...the total messages in the queue ends up being no greater than the - // limit... - upward_messages.len() + count as usize <= max_queue_count - && - // ...and the total size of the payloads in the queue ends up being no - // greater than the limit. - upward_messages.iter() - .fold(size as usize, |a, x| a + x.data.len()) - <= watermark_queue_size - ), - Error::::QueueFull - ); - if !id.is_system() { - for m in upward_messages.iter() { - ensure!(m.origin != ParachainDispatchOrigin::Root, Error::::InvalidMessageOrigin); - } - } - } - Ok(()) - } - - /// Remove processed downward messages from the `DownwardMessageQueue`. - fn remove_processed_downward_messages(id: ParaId, processed: usize) { - DownwardMessageQueue::::mutate(id, |v| { - if processed > v.len() { - v.clear(); - } else { - *v = v.split_off(processed); - } - }); - } - - /// Update routing information from the parachain heads. This queues upwards - /// messages to the relay chain as well. - fn update_routing( - heads: &[AttestedCandidate], - ) { - // we sort them in order to provide a fast lookup to ensure we can avoid duplicates in the - // needs_dispatch queue. - let mut ordered_needs_dispatch = NeedsDispatch::get(); - - for head in heads.iter() { - let id = head.parachain_index(); - Heads::insert(id, &head.candidate.head_data); - - // Queue up upwards messages (from parachains to relay chain). - Self::queue_upward_messages( - id, - &head.candidate.commitments.upward_messages, - &mut ordered_needs_dispatch, - ); - } - - NeedsDispatch::put(ordered_needs_dispatch); - } - - /// Place any new upward messages into our queue for later dispatch. - /// - /// `ordered_needs_dispatch` is mutated to ensure it reflects the new value of - /// `RelayDispatchQueueSize`. It is up to the caller to guarantee that it gets written into - /// storage after this call. - fn queue_upward_messages( - id: ParaId, - upward_messages: &[UpwardMessage], - ordered_needs_dispatch: &mut Vec, - ) { - if !upward_messages.is_empty() { - RelayDispatchQueueSize::mutate(id, |&mut(ref mut count, ref mut len)| { - *count += upward_messages.len() as u32; - *len += upward_messages.iter() - .fold(0, |a, x| a + x.data.len()) as u32; - }); - - upward_messages.iter().for_each(|m| RelayDispatchQueue::append(id, m)); - - if let Err(i) = ordered_needs_dispatch.binary_search(&id) { - // same. - ordered_needs_dispatch.insert(i, id); - } else { - sp_runtime::print("ordered_needs_dispatch contains id?!"); - } - } - } - - /// Simple FIFO dispatcher. This must be called after parachain fees are checked, - /// as dispatched messages may spend parachain funds. - fn dispatch_upward_messages( - max_queue_count: usize, - watermark_queue_size: usize, - mut dispatch_message: impl FnMut(ParaId, ParachainDispatchOrigin, &[u8]), - ) { - let queueds = NeedsDispatch::get(); - let mut drained_count = 0usize; - let mut dispatched_count = 0usize; - let mut dispatched_size = 0usize; - for id in queueds.iter() { - drained_count += 1; - - let (count, size) = ::get(id); - let count = count as usize; - let size = size as usize; - if dispatched_count == 0 || ( - dispatched_count + count <= max_queue_count - && dispatched_size + size <= watermark_queue_size - ) { - if count > 0 { - // still dispatching messages... - RelayDispatchQueueSize::remove(id); - let messages = RelayDispatchQueue::take(id); - for UpwardMessage { origin, data } in messages.into_iter() { - dispatch_message(*id, origin, &data); - } - dispatched_count += count; - dispatched_size += size; - if dispatched_count >= max_queue_count - || dispatched_size >= watermark_queue_size - { - break - } - } - } - } - NeedsDispatch::put(&queueds[drained_count..]); - } - - /// Calculate the current block's duty roster using system's random seed. - /// Returns the duty roster along with the random seed. - pub fn calculate_duty_roster() -> (DutyRoster, [u8; 32]) { - let parachains = Self::active_parachains(); - let parachain_count = parachains.len(); - - // TODO: use decode length. substrate #2794 - let validator_count = Self::authorities().len(); - let validators_per_parachain = - if parachain_count == 0 { - 0 - } else { - (validator_count - 1) / parachain_count - }; - - 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].0.clone()) - } - _ => Chain::Relay, - }).collect::>(); - - let mut seed = { - let phrase = b"validator_role_pairs"; - let seed = T::Randomness::random(&phrase[..]); - let seed_len = seed.as_ref().len(); - let needed_bytes = validator_count * 4; - - // hash only the needed bits of the random seed. - // if earlier bits are influencable, they will not factor into - // the seed used here. - let seed_off = if needed_bytes >= seed_len { - 0 - } else { - seed_len - needed_bytes - }; - - BlakeTwo256::hash(&seed.as_ref()[seed_off..]) - }; - - let orig_seed = seed.clone().to_fixed_bytes(); - - // shuffle - for i in 0..(validator_count.saturating_sub(1)) { - // 4 bytes of entropy used per cycle, 32 bytes entropy per hash - let offset = (i * 4 % 32) as usize; - - // number of roles remaining to select from. - let remaining = sp_std::cmp::max(1, (validator_count - i) as usize); - - // 8 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; - - if offset == 28 { - // into the last 4 bytes - rehash to gather new entropy - seed = BlakeTwo256::hash(seed.as_ref()); - } - - // exchange last item with randomly chosen first. - roles_val.swap(remaining - 1, val_index); - } - - (DutyRoster { validator_duty: roles_val, }, orig_seed) - } - - /// Get the global validation schedule for all parachains. - pub fn global_validation_data() -> GlobalValidationData { - let now = >::block_number(); - GlobalValidationData { - max_code_size: T::MaxCodeSize::get(), - max_head_data_size: T::MaxHeadDataSize::get(), - block_number: T::BlockNumberConversion::convert(if now.is_zero() { - now - } else { - // parablocks included in this block will execute in the context - // of the current block's parent. - now - One::one() - }), - } - } - - /// Get the local validation schedule for a particular parachain. - pub fn local_validation_data(id: &ParaId, perceived_height: T::BlockNumber) -> Option { - if perceived_height + One::one() != >::block_number() { - // sanity-check - no non-direct-parent blocks allowed at the moment. - return None - } - - let code_upgrade_allowed: Option = (|| { - match T::Registrar::para_info(*id)?.scheduling { - Scheduling::Always => {}, - Scheduling::Dynamic => return None, // parathreads can't upgrade code. - } - - // if perceived-height were not the parent of `now`, then this should - // not be drawn from current-runtime configuration. however the sanity-check - // above prevents that. - let min_upgrade_frequency = T::ValidationUpgradeFrequency::get(); - let upgrade_delay = T::ValidationUpgradeDelay::get(); - - let no_planned = Self::code_upgrade_schedule(id) - .map_or(true, |expected: T::BlockNumber| expected <= perceived_height); - - let can_upgrade_code = no_planned && - Self::past_code_meta(id).most_recent_change() - .map_or(true, |at| at + min_upgrade_frequency < perceived_height); - - if can_upgrade_code { - let applied_at = perceived_height + upgrade_delay; - Some(T::BlockNumberConversion::convert(applied_at)) - } else { - None - } - })(); - - Self::parachain_head(id).map(|parent_head| LocalValidationData { - parent_head, - balance: T::ParachainCurrency::free_balance(*id), - code_upgrade_allowed, - }) - } - - /// Returns the `DownwardMessage`'s for the given parachain. - pub fn downward_messages(id: ParaId) -> Vec> { - DownwardMessageQueue::::get(id) - } - - /// Get the local validation data for a particular parent w.r.t. the current - /// block height. - pub fn current_local_validation_data(id: &ParaId) -> Option { - let now: T::BlockNumber = >::block_number(); - if now >= One::one() { - Self::local_validation_data(id, now - One::one()) - } else { - None - } - } - - /// Fetch the code used for verifying a parachain at a particular height. - pub fn parachain_code_at(id: &ParaId, at: T::BlockNumber) -> Option { - // note - we don't check that the parachain is currently registered - // as this might be a deregistered parachain whose old code should still - // stick around on-chain for some time. - Self::past_code_meta(id).code_at(at).and_then(|to_use| match to_use { - UseCodeAt::Current => Self::parachain_code(id), - UseCodeAt::ReplacedAt(replaced_at) => - ::PastCode::get(&(*id, replaced_at)), - }) - } - - /// Get the currently active set of parachains. - pub fn active_parachains() -> Vec<(ParaId, Option<(CollatorId, Retriable)>)> { - T::ActiveParachains::active_paras() - } - - /// Verify the signatures of all candidates. - /// - /// Returns `false` if a signature is not correct. - fn verify_candidate_signatures( - candidate: &AttestedCandidate, - authorities: &[ValidatorId], - validator_group: &[(usize, ParaId)], - signing_context: &SigningContext, - ) -> DispatchResult { - let mut expected_votes_len = 0; - let mut encoded_implicit = None; - let mut encoded_explicit = None; - let candidate_hash = candidate.candidate().hash(); - - for (vote_index, (auth_index, _)) in candidate.validator_indices - .iter() - .enumerate() - .filter(|(_, bit)| **bit) - .enumerate() - { - let validity_attestation = match candidate.validity_votes.get(vote_index) { - None => Err(Error::::NotEnoughValidityVotes)?, - Some(v) => { - expected_votes_len = vote_index + 1; - v - } - }; - - if validator_group.iter().find(|&(idx, _)| *idx == auth_index).is_none() { - Err(Error::::WrongValidatorAttesting)? - } - - let (payload, sig) = match validity_attestation { - ValidityAttestation::Implicit(sig) => { - let payload = encoded_implicit.get_or_insert_with(|| localized_payload( - Statement::Candidate(candidate_hash), signing_context, - )); - - (payload, sig) - } - ValidityAttestation::Explicit(sig) => { - let payload = encoded_explicit.get_or_insert_with(|| localized_payload( - Statement::Valid(candidate_hash), signing_context, - )); - - (payload, sig) - } - }; - - ensure!( - sig.verify(&payload[..], &authorities[auth_index]), - Error::::InvalidSignature, - ); - } - - if candidate.validity_votes.len() == expected_votes_len { - Ok(()) - } else { - Err(Error::::UntaggedVotes.into()) - } - } - - // check the attestations on these candidates. The candidates should have been checked - // that each candidates' chain ID is valid. - fn check_candidates( - schedule: &GlobalValidationData, - attested_candidates: &[AttestedCandidate], - active_parachains: &[(ParaId, Option<(CollatorId, Retriable)>)] - ) -> sp_std::result::Result, sp_runtime::DispatchError> { - let authorities = Self::authorities(); - let (duty_roster, random_seed) = Self::calculate_duty_roster(); - - // computes the omitted validation data for a particular parachain. - // - // pass the perceived relay chain height of the para-block. This is the block number of - // `abridged.relay_parent`. - let full_candidate = | - abridged: &AbridgedCandidateReceipt, - perceived_height: T::BlockNumber, - | - -> sp_std::result::Result - { - let para_id = abridged.parachain_index; - let local_validation = Self::local_validation_data(¶_id, perceived_height) - .ok_or(Error::::ParentMismatch)?; - - let omitted = OmittedValidationData { - global_validation: schedule.clone(), - local_validation, - }; - - Ok(abridged.clone().complete(omitted)) - }; - - let sorted_validators = make_sorted_duties(&duty_roster.validator_duty); - - let relay_height_now = >::block_number(); - let parent_hash = >::parent_hash(); - let signing_context = Self::signing_context(); - let code_upgrade_delay = T::ValidationUpgradeDelay::get(); - - let mut validator_groups = GroupedDutyIter::new(&sorted_validators[..]); - - let mut para_block_hashes = Vec::new(); - - for candidate in attested_candidates { - let para_id = candidate.parachain_index(); - let validator_group = validator_groups.group_for(para_id) - .ok_or(Error::::NoValidatorGroup)?; - - // NOTE: when changing this to allow older blocks, - // care must be taken in the availability store pruning to ensure that - // data is stored correctly. A block containing a candidate C can be - // orphaned before a block containing C is finalized. Care must be taken - // not to prune the data for C simply because an orphaned block contained - // it. - - ensure!( - candidate.candidate().relay_parent.as_ref() == parent_hash.as_ref(), - Error::::UnexpectedRelayParent, - ); - - // Since we only allow execution in context of parent hash. - let perceived_relay_block_height = >::block_number() - One::one(); - - ensure!( - candidate.validity_votes.len() >= majority_of(validator_group.len()), - Error::::NotEnoughValidityVotes, - ); - - ensure!( - candidate.validity_votes.len() <= authorities.len(), - Error::::VotesExceedsAuthorities, - ); - - ensure!( - schedule.max_head_data_size as usize >= candidate.candidate().head_data.0.len(), - Error::::HeadDataTooLarge, - ); - - let full_candidate = full_candidate( - candidate.candidate(), - perceived_relay_block_height, - )?; - - // apply any scheduled code upgrade. - if let Some(expected_at) = Self::code_upgrade_schedule(¶_id) { - if expected_at <= perceived_relay_block_height { - let new_code = FutureCode::take(¶_id); - ::FutureCodeUpgrades::remove(¶_id); - - Self::do_code_upgrade(para_id, perceived_relay_block_height, &new_code); - } - } - - if let Some(ref new_code) = full_candidate.commitments.new_validation_code { - ensure!( - full_candidate.local_validation.code_upgrade_allowed.is_some(), - Error::::DisallowedCodeUpgrade, - ); - ensure!( - schedule.max_code_size >= new_code.0.len() as u32, - Error::::ValidationCodeTooLarge, - ); - - if code_upgrade_delay.is_zero() { - Self::do_code_upgrade(para_id, perceived_relay_block_height, new_code); - } else { - ::FutureCodeUpgrades::insert( - ¶_id, - &(perceived_relay_block_height + code_upgrade_delay), - ); - FutureCode::insert( - ¶_id, - new_code, - ); - } - } - - let fees = full_candidate.commitments.fees; - - ensure!( - full_candidate.local_validation.balance >= full_candidate.commitments.fees, - Error::::CannotPayFees, - ); - - T::ParachainCurrency::deduct(para_id, fees)?; - - Self::verify_candidate_signatures(candidate, &authorities, validator_group, &signing_context)?; - - para_block_hashes.push(candidate.candidate.hash()); - } - - Ok(IncludedBlocks { - actual_number: relay_height_now, - session: >::current_index(), - random_seed, - active_parachains: active_parachains.iter().map(|x| x.0).collect(), - para_blocks: para_block_hashes, - }) - } - - /// Checks all signatures from all given `candidates`. - /// - /// Returns an error if any signature verification failed. - fn check_candidates_signatures(candidates: &[AttestedCandidate]) -> DispatchResult { - let authorities = Self::authorities(); - let duty_roster = Self::calculate_duty_roster().0; - let sorted_validators = make_sorted_duties(&duty_roster.validator_duty); - let signing_context = Self::signing_context(); - let mut validator_groups = GroupedDutyIter::new(&sorted_validators[..]); - - candidates.iter().try_for_each(|c| { - let para_id = c.parachain_index(); - let validator_group = validator_groups.group_for(para_id) - .ok_or(Error::::NoValidatorGroup)?; - - Self::verify_candidate_signatures(c, &authorities, validator_group, &signing_context) - }) - } - - fn initialize_authorities(authorities: &[ValidatorId]) { - if !authorities.is_empty() { - assert!(Authorities::get().is_empty(), "Authorities are already initialized!"); - Authorities::put(authorities); - } - } - -/* - // TODO: Consider integrating if needed. (https://github.com/paritytech/polkadot/issues/223) - /// 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.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), - } - } -*/ -} - -impl sp_runtime::BoundToRuntimeAppPublic for Module { - type Public = ValidatorId; -} - -impl pallet_session::OneSessionHandler for Module { - type Key = ValidatorId; - - fn on_genesis_session<'a, I: 'a>(validators: I) - where I: Iterator - { - Self::initialize_authorities(&validators.map(|(_, key)| key).collect::>()); - } - - fn on_new_session<'a, I: 'a>(changed: bool, validators: I, _queued: I) - where I: Iterator - { - if changed { - ::Authorities::put(validators.map(|(_, key)| key).collect::>()); - } - } - - fn on_disabled(_i: usize) { } -} - -pub type InherentType = Vec; - -impl ProvideInherent for Module { - type Call = Call; - type Error = MakeFatalError; - const INHERENT_IDENTIFIER: InherentIdentifier = NEW_HEADS_IDENTIFIER; - - fn create_inherent(data: &InherentData) -> Option { - let data = data.get_data::(&NEW_HEADS_IDENTIFIER) - .expect("Parachain heads could not be decoded.") - .expect("No parachain heads found in inherent data."); - - // Temporary solution for: - // https://github.com/paritytech/polkadot/issues/1327 - if Self::check_candidates_signatures(&data).is_ok() { - Some(Call::set_heads(data)) - } else { - Some(Call::set_heads(Vec::new())) - } - } -} - -/// Ensure that the origin `o` represents a parachain. -/// Returns `Ok` with the parachain ID that effected the extrinsic or an `Err` otherwise. -pub fn ensure_parachain(o: OuterOrigin) -> result::Result - where OuterOrigin: Into> -{ - match o.into() { - Ok(Origin::Parachain(id)) => Ok(id), - _ => Err(BadOrigin), - } -} - - -/// Ensure that double vote reports are only processed if valid. -#[derive(Encode, Decode, Clone, Eq, PartialEq)] -pub struct ValidateDoubleVoteReports(sp_std::marker::PhantomData); - -impl sp_std::fmt::Debug for ValidateDoubleVoteReports where -{ - fn fmt(&self, f: &mut sp_std::fmt::Formatter) -> sp_std::fmt::Result { - write!(f, "ValidateDoubleVoteReports") - } -} - -impl ValidateDoubleVoteReports { - /// Create a new `ValidateDoubleVoteReports` struct. - pub fn new() -> Self { - ValidateDoubleVoteReports(sp_std::marker::PhantomData) - } -} - -/// Custom validity error used while validating double vote reports. -#[derive(RuntimeDebug)] -#[repr(u8)] -pub enum DoubleVoteValidityError { - /// The authority being reported is not in the authority set. - NotAnAuthority = 0, - - /// Failed to convert offender's `FullIdentificationOf`. - FailedToConvertId = 1, - - /// The signature on one or both of the statements in the report is wrong. - InvalidSignature = 2, - - /// The two statements in the report are not conflicting. - NotDoubleVote = 3, - - /// Invalid report. Indicates that statement doesn't match the attestation on one of the votes. - InvalidReport = 4, - - /// The proof provided in the report is not valid. - InvalidProof = 5, -} - -impl SignedExtension for ValidateDoubleVoteReports where - ::Call: IsSubType> -{ - const IDENTIFIER: &'static str = "ValidateDoubleVoteReports"; - type AccountId = T::AccountId; - type Call = ::Call; - type AdditionalSigned = (); - type Pre = (); - - fn additional_signed(&self) - -> sp_std::result::Result - { - Ok(()) - } - - fn validate( - &self, - _who: &Self::AccountId, - call: &Self::Call, - _info: &DispatchInfoOf, - _len: usize, - ) -> TransactionValidity { - let r = ValidTransaction::default(); - - if let Some(local_call) = call.is_sub_type() { - if let Call::report_double_vote(report) = local_call { - let validators = >::validators(); - - let expected_session = report.signing_context.session_index; - let session = report.proof.session(); - - if session != expected_session { - return Err(InvalidTransaction::BadProof.into()); - } - - let authorities = Module::::authorities(); - let offender_idx = match authorities.iter().position(|a| *a == report.identity) { - Some(idx) => idx, - None => return Err(InvalidTransaction::Custom( - DoubleVoteValidityError::NotAnAuthority as u8).into() - ), - }; - - if T::FullIdentificationOf::convert(validators[offender_idx].clone()).is_none() { - return Err(InvalidTransaction::Custom( - DoubleVoteValidityError::FailedToConvertId as u8).into() - ); - } - - report - .verify::() - .map_err(|e| TransactionValidityError::from(InvalidTransaction::Custom(e as u8)))?; - } - } - - Ok(r) - } -} - - -#[cfg(test)] -mod tests { - use super::*; - use super::Call as ParachainsCall; - use bitvec::{bitvec, vec::BitVec}; - use sp_io::TestExternalities; - use sp_core::{H256, Blake2Hasher, sr25519}; - use sp_trie::NodeCodec; - use sp_runtime::{ - impl_opaque_keys, - Perbill, curve::PiecewiseLinear, - traits::{ - BlakeTwo256, IdentityLookup, SaturatedConversion, - OpaqueKeys, Extrinsic as ExtrinsicT, - }, - testing::TestXt, - }; - use primitives::v0::{ - CandidateReceipt, ValidityAttestation, ValidatorId, Info as ParaInfo, - Scheduling, CandidateCommitments, - BlockNumber, Header, - }; - use keyring::Sr25519Keyring; - use frame_support::{ - impl_outer_origin, impl_outer_dispatch, assert_ok, assert_err, parameter_types, - traits::{OnInitialize, OnFinalize}, - weights::DispatchInfo, - }; - use crate::parachains; - use crate::registrar; - use crate::slots; - use pallet_session::{SessionHandler, SessionManager}; - use pallet_staking::EraIndex; - - // result of as trie_db::NodeCodec>::hashed_null_node() - const EMPTY_TRIE_ROOT: [u8; 32] = [ - 3, 23, 10, 46, 117, 151, 183, 183, 227, 216, 76, 5, 57, 29, 19, 154, - 98, 177, 87, 231, 135, 134, 216, 192, 130, 242, 157, 207, 76, 17, 19, 20 - ]; - - impl_outer_origin! { - pub enum Origin for Test { - parachains - } - } - - impl_outer_dispatch! { - pub enum Call for Test where origin: Origin { - parachains::Parachains, - staking::Staking, - } - } - - impl_opaque_keys! { - pub struct TestSessionKeys { - pub parachain_validator: super::Module, - } - } - - #[derive(Clone, Eq, PartialEq)] - pub struct Test; - parameter_types! { - pub const BlockHashCount: u32 = 250; - pub const MaximumBlockWeight: Weight = 4 * 1024 * 1024; - pub const MaximumBlockLength: u32 = 4 * 1024 * 1024; - pub const AvailableBlockRatio: Perbill = Perbill::from_percent(75); - } - - impl frame_system::Trait for Test { - type BaseCallFilter = (); - type Origin = Origin; - type Call = Call; - type Index = u64; - type BlockNumber = BlockNumber; - type Hash = H256; - type Hashing = BlakeTwo256; - type AccountId = u64; - type Lookup = IdentityLookup; - type Header = Header; - type Event = (); - type BlockHashCount = BlockHashCount; - type MaximumBlockWeight = MaximumBlockWeight; - type DbWeight = (); - type BlockExecutionWeight = (); - type ExtrinsicBaseWeight = (); - type MaximumExtrinsicWeight = MaximumBlockWeight; - type MaximumBlockLength = MaximumBlockLength; - type AvailableBlockRatio = AvailableBlockRatio; - type Version = (); - type ModuleToIndex = (); - type AccountData = pallet_balances::AccountData; - type OnNewAccount = (); - type OnKilledAccount = (); - type SystemWeightInfo = (); - } - - impl frame_system::offchain::SendTransactionTypes for Test where - Call: From, - { - type OverarchingCall = Call; - type Extrinsic = TestXt; - } - - parameter_types! { - pub const Period: BlockNumber = 1; - pub const Offset: BlockNumber = 0; - pub const DisabledValidatorsThreshold: Perbill = Perbill::from_percent(17); - } - - /// Custom `SessionHandler` since we use `TestSessionKeys` as `Keys`. - pub struct TestSessionHandler; - impl SessionHandler for TestSessionHandler { - const KEY_TYPE_IDS: &'static [KeyTypeId] = &[PARACHAIN_KEY_TYPE_ID]; - - fn on_genesis_session(_: &[(AId, Ks)]) {} - - fn on_new_session(_: bool, _: &[(AId, Ks)], _: &[(AId, Ks)]) {} - - fn on_before_session_ending() {} - - fn on_disabled(_: usize) {} - } - - impl pallet_session::Trait for Test { - type Event = (); - type ValidatorId = u64; - type ValidatorIdOf = pallet_staking::StashOf; - type ShouldEndSession = pallet_session::PeriodicSessions; - type NextSessionRotation = pallet_session::PeriodicSessions; - type SessionManager = pallet_session::historical::NoteHistoricalRoot; - type SessionHandler = TestSessionHandler; - type Keys = TestSessionKeys; - type DisabledValidatorsThreshold = DisabledValidatorsThreshold; - type WeightInfo = (); - } - - impl pallet_session::historical::Trait for Test { - type FullIdentification = pallet_staking::Exposure; - type FullIdentificationOf = pallet_staking::ExposureOf; - } - - parameter_types! { - pub const MinimumPeriod: u64 = 3; - } - impl pallet_timestamp::Trait for Test { - type Moment = u64; - type OnTimestampSet = (); - type MinimumPeriod = MinimumPeriod; - type WeightInfo = (); - } - - mod time { - use primitives::v0::{Moment, BlockNumber}; - pub const MILLISECS_PER_BLOCK: Moment = 6000; - pub const EPOCH_DURATION_IN_BLOCKS: BlockNumber = 1 * HOURS; - // These time units are defined in number of blocks. - const MINUTES: BlockNumber = 60_000 / (MILLISECS_PER_BLOCK as BlockNumber); - const HOURS: BlockNumber = MINUTES * 60; - } - parameter_types! { - pub const EpochDuration: BlockNumber = time::EPOCH_DURATION_IN_BLOCKS; - pub const ExpectedBlockTime: u64 = time::MILLISECS_PER_BLOCK; - } - - impl pallet_babe::Trait for Test { - type EpochDuration = EpochDuration; - type ExpectedBlockTime = ExpectedBlockTime; - - // session module is the trigger - type EpochChangeTrigger = pallet_babe::ExternalTrigger; - - type KeyOwnerProofSystem = (); - - type KeyOwnerProof = >::Proof; - - type KeyOwnerIdentification = >::IdentificationTuple; - - type HandleEquivocation = (); - } - - parameter_types! { - pub const ExistentialDeposit: Balance = 1; - } - - impl pallet_balances::Trait for Test { - type Balance = u128; - type DustRemoval = (); - type Event = (); - type ExistentialDeposit = ExistentialDeposit; - type AccountStore = System; - type WeightInfo = (); - } - - pallet_staking_reward_curve::build! { - const REWARD_CURVE: PiecewiseLinear<'static> = curve!( - min_inflation: 0_025_000u64, - max_inflation: 0_100_000, - ideal_stake: 0_500_000, - falloff: 0_050_000, - max_piece_count: 40, - test_precision: 0_005_000, - ); - } - - parameter_types! { - pub const SessionsPerEra: sp_staking::SessionIndex = 3; - pub const BondingDuration: pallet_staking::EraIndex = 3; - pub const SlashDeferDuration: pallet_staking::EraIndex = 0; - pub const AttestationPeriod: BlockNumber = 100; - pub const RewardCurve: &'static PiecewiseLinear<'static> = &REWARD_CURVE; - pub const MaxNominatorRewardedPerValidator: u32 = 64; - pub const ElectionLookahead: BlockNumber = 0; - pub const StakingUnsignedPriority: u64 = u64::max_value() / 2; - } - - pub struct CurrencyToVoteHandler; - - impl Convert for CurrencyToVoteHandler { - fn convert(x: u128) -> u128 { x } - } - - impl Convert for CurrencyToVoteHandler { - fn convert(x: u128) -> u64 { x.saturated_into() } - } - - impl pallet_staking::Trait for Test { - type RewardRemainder = (); - type CurrencyToVote = CurrencyToVoteHandler; - type Event = (); - type Currency = Balances; - type Slash = (); - type Reward = (); - type SessionsPerEra = SessionsPerEra; - type BondingDuration = BondingDuration; - type SlashDeferDuration = SlashDeferDuration; - type SlashCancelOrigin = frame_system::EnsureRoot; - type SessionInterface = Self; - type UnixTime = pallet_timestamp::Module; - type RewardCurve = RewardCurve; - type MaxNominatorRewardedPerValidator = MaxNominatorRewardedPerValidator; - type NextNewSession = Session; - type ElectionLookahead = ElectionLookahead; - type Call = Call; - type UnsignedPriority = StakingUnsignedPriority; - type MaxIterations = (); - type MinSolutionScoreBump = (); - type WeightInfo = (); - } - - impl attestations::Trait for Test { - type AttestationPeriod = AttestationPeriod; - type ValidatorIdentities = ValidatorIdentities; - type RewardAttestation = (); - } - - parameter_types!{ - pub const LeasePeriod: BlockNumber = 10; - pub const EndingPeriod: BlockNumber = 3; - } - - impl slots::Trait for Test { - type Event = (); - type Currency = Balances; - type Parachains = registrar::Module; - type EndingPeriod = EndingPeriod; - type LeasePeriod = LeasePeriod; - type Randomness = RandomnessCollectiveFlip; - } - - parameter_types! { - pub const ParathreadDeposit: Balance = 10; - pub const QueueSize: usize = 2; - pub const MaxRetries: u32 = 3; - } - - impl registrar::Trait for Test { - type Event = (); - type Origin = Origin; - type Currency = Balances; - type ParathreadDeposit = ParathreadDeposit; - type SwapAux = slots::Module; - type QueueSize = QueueSize; - type MaxRetries = MaxRetries; - } - - parameter_types! { - pub OffencesWeightSoftLimit: Weight = Perbill::from_percent(60) * MaximumBlockWeight::get(); - } - - impl pallet_offences::Trait for Test { - type Event = (); - type IdentificationTuple = pallet_session::historical::IdentificationTuple; - type OnOffenceHandler = Staking; - type WeightSoftLimit = OffencesWeightSoftLimit; - type WeightInfo = (); - } - - parameter_types! { - pub const MaxHeadDataSize: u32 = 100; - pub const MaxCodeSize: u32 = 100; - - pub const ValidationUpgradeFrequency: BlockNumber = 10; - pub const ValidationUpgradeDelay: BlockNumber = 2; - pub const SlashPeriod: BlockNumber = 50; - } - - // This is needed for a custom `AccountId` type which is `u64` in testing here. - pub mod test_keys { - use sp_core::{crypto::KeyTypeId, sr25519}; - pub const KEY_TYPE: KeyTypeId = KeyTypeId(*b"test"); - - mod app { - use sp_application_crypto::{app_crypto, sr25519}; - use super::super::Parachains; - - app_crypto!(sr25519, super::KEY_TYPE); - - impl sp_runtime::traits::IdentifyAccount for Public { - type AccountId = u64; - - fn into_account(self) -> Self::AccountId { - Parachains::authorities().iter().position(|b| *b == self.0.clone().into()).unwrap() as u64 - } - } - } - - pub type ReporterId = app::Public; - pub struct ReporterAuthorityId; - impl frame_system::offchain::AppCrypto for ReporterAuthorityId { - type RuntimeAppPublic = ReporterId; - type GenericSignature = sr25519::Signature; - type GenericPublic = sr25519::Public; - } - } - - impl Trait for Test { - type AuthorityId = test_keys::ReporterAuthorityId; - type Origin = Origin; - type Call = Call; - type ParachainCurrency = Balances; - type BlockNumberConversion = sp_runtime::traits::Identity; - type Randomness = RandomnessCollectiveFlip; - type ActiveParachains = registrar::Module; - type Registrar = registrar::Module; - type MaxCodeSize = MaxCodeSize; - type MaxHeadDataSize = MaxHeadDataSize; - type ValidationUpgradeFrequency = ValidationUpgradeFrequency; - type ValidationUpgradeDelay = ValidationUpgradeDelay; - type SlashPeriod = SlashPeriod; - type Proof = - >::Proof; - type IdentificationTuple = - >::IdentificationTuple; - type ReportOffence = Offences; - type BlockHashConversion = sp_runtime::traits::Identity; - type KeyOwnerProofSystem = Historical; - } - - type Extrinsic = TestXt; - - impl frame_system::offchain::CreateSignedTransaction for Test where - Call: From, - { - fn create_transaction>( - call: Call, - _public: test_keys::ReporterId, - _account: ::AccountId, - nonce: ::Index, - ) -> Option<(Call, ::SignaturePayload)> { - Some((call, (nonce, ()))) - } - } - - impl frame_system::offchain::SigningTypes for Test { - type Public = test_keys::ReporterId; - type Signature = sr25519::Signature; - } - - type Parachains = Module; - type Balances = pallet_balances::Module; - type System = frame_system::Module; - type Offences = pallet_offences::Module; - type Staking = pallet_staking::Module; - type Session = pallet_session::Module; - type Timestamp = pallet_timestamp::Module; - type RandomnessCollectiveFlip = pallet_randomness_collective_flip::Module; - type Registrar = registrar::Module; - type Historical = pallet_session::historical::Module; - - fn new_test_ext(parachains: Vec<(ParaId, ValidationCode, HeadData)>) -> TestExternalities { - use pallet_staking::StakerStatus; - use pallet_babe::AuthorityId as BabeAuthorityId; - - let mut t = frame_system::GenesisConfig::default().build_storage::().unwrap(); - - let authority_keys = [ - Sr25519Keyring::Alice, - Sr25519Keyring::Bob, - Sr25519Keyring::Charlie, - Sr25519Keyring::Dave, - Sr25519Keyring::Eve, - Sr25519Keyring::Ferdie, - Sr25519Keyring::One, - Sr25519Keyring::Two, - ]; - - // stashes are the index. - let session_keys: Vec<_> = authority_keys.iter().enumerate() - .map(|(i, k)| (i as u64, i as u64, TestSessionKeys { - parachain_validator: ValidatorId::from(k.public()), - })) - .collect(); - - let authorities: Vec<_> = authority_keys.iter().map(|k| ValidatorId::from(k.public())).collect(); - let babe_authorities: Vec<_> = authority_keys.iter() - .map(|k| BabeAuthorityId::from(k.public())) - .map(|k| (k, 1)) - .collect(); - - // controllers are the index + 1000 - let stakers: Vec<_> = (0..authority_keys.len()).map(|i| ( - i as u64, - i as u64 + 1000, - 10_000, - StakerStatus::::Validator, - )).collect(); - - let balances: Vec<_> = (0..authority_keys.len()).map(|i| (i as u64, 10_000_000)).collect(); - - GenesisConfig { - authorities: authorities.clone(), - }.assimilate_storage::(&mut t).unwrap(); - - registrar::GenesisConfig:: { - parachains, - _phdata: Default::default(), - }.assimilate_storage(&mut t).unwrap(); - - pallet_session::GenesisConfig:: { - keys: session_keys, - }.assimilate_storage(&mut t).unwrap(); - - pallet_babe::GenesisConfig { - authorities: babe_authorities, - }.assimilate_storage::(&mut t).unwrap(); - - pallet_balances::GenesisConfig:: { - balances, - }.assimilate_storage(&mut t).unwrap(); - - pallet_staking::GenesisConfig:: { - stakers, - validator_count: 8, - force_era: pallet_staking::Forcing::ForceNew, - minimum_validator_count: 0, - invulnerables: vec![], - .. Default::default() - }.assimilate_storage(&mut t).unwrap(); - - t.into() - } - - fn set_heads(v: Vec) -> ParachainsCall { - ParachainsCall::set_heads(v) - } - - fn report_double_vote( - report: DoubleVoteReport, - ) -> Result, TransactionValidityError> { - let inner = ParachainsCall::report_double_vote(report); - let call = Call::Parachains(inner.clone()); - - ValidateDoubleVoteReports::(sp_std::marker::PhantomData) - .validate(&0, &call, &DispatchInfo::default(), 0)?; - - Ok(inner) - } - - // creates a template candidate which pins to correct relay-chain state. - fn raw_candidate(para_id: ParaId) -> CandidateReceipt { - let mut head_data = Parachains::parachain_head(¶_id).unwrap(); - head_data.0.extend(para_id.encode()); - - CandidateReceipt { - parachain_index: para_id, - relay_parent: System::parent_hash(), - head_data, - collator: Default::default(), - signature: Default::default(), - pov_block_hash: Default::default(), - global_validation: Parachains::global_validation_data(), - local_validation: Parachains::current_local_validation_data(¶_id).unwrap(), - commitments: CandidateCommitments::default(), - } - } - - // makes a blank attested candidate from a `CandidateReceipt`. - fn make_blank_attested(candidate: CandidateReceipt) -> AttestedCandidate { - let (candidate, _) = candidate.abridge(); - - AttestedCandidate { - validity_votes: vec![], - validator_indices: BitVec::new(), - candidate, - } - } - - fn make_attestations(candidate: &mut AttestedCandidate) { - let mut vote_implicit = false; - - let (duty_roster, _) = Parachains::calculate_duty_roster(); - let candidate_hash = candidate.candidate.hash(); - - let authorities = Parachains::authorities(); - let extract_key = |public: ValidatorId| { - let mut raw_public = [0; 32]; - raw_public.copy_from_slice(public.as_ref()); - Sr25519Keyring::from_raw_public(raw_public).unwrap() - }; - - let validation_entries = duty_roster.validator_duty.iter() - .enumerate(); - - let mut validator_indices = BitVec::new(); - for (idx, &duty) in validation_entries { - if duty != Chain::Parachain(candidate.parachain_index()) { continue } - vote_implicit = !vote_implicit; - - let key = extract_key(authorities[idx].clone()); - - let statement = if vote_implicit { - Statement::Candidate(candidate_hash.clone()) - } else { - Statement::Valid(candidate_hash.clone()) - }; - - let signing_context = Parachains::signing_context(); - let payload = localized_payload(statement, &signing_context); - let signature = key.sign(&payload[..]).into(); - - candidate.validity_votes.push(if vote_implicit { - ValidityAttestation::Implicit(signature) - } else { - ValidityAttestation::Explicit(signature) - }); - - if validator_indices.len() <= idx { - validator_indices.resize(idx + 1, false); - } - validator_indices.set(idx, true); - } - candidate.validator_indices = validator_indices; - } - - fn new_candidate_with_upward_messages( - id: u32, - upward_messages: Vec<(ParachainDispatchOrigin, Vec)> - ) -> AttestedCandidate { - let mut raw_candidate = raw_candidate(id.into()); - raw_candidate.commitments.upward_messages = upward_messages.into_iter() - .map(|x| UpwardMessage { origin: x.0, data: x.1 }) - .collect(); - - make_blank_attested(raw_candidate) - } - - fn start_session(session_index: SessionIndex) { - let mut parent_hash = System::parent_hash(); - - for i in Session::current_index()..session_index { - println!("session index {}", i); - Staking::on_finalize(System::block_number()); - System::set_block_number((i + 1).into()); - Timestamp::set_timestamp(System::block_number() as primitives::v0::Moment * 6000); - - // In order to be able to use `System::parent_hash()` in the tests - // we need to first get it via `System::finalize` and then set it - // the `System::initialize`. However, it is needed to be taken into - // consideration that finalizing will prune some data in `System` - // storage including old values `BlockHash` if that reaches above - // `BlockHashCount` capacity. - if System::block_number() > 1 { - let hdr = System::finalize(); - parent_hash = hdr.hash(); - } - - System::initialize( - &(i as BlockNumber + 1), - &parent_hash, - &Default::default(), - &Default::default(), - Default::default(), - ); - init_block(); - } - - assert_eq!(Session::current_index(), session_index); - } - - fn start_era(era_index: EraIndex) { - start_session((era_index * 3).into()); - assert_eq!(Staking::current_era(), Some(era_index)); - } - - fn init_block() { - println!("Initializing {}", System::block_number()); - Session::on_initialize(System::block_number()); - System::on_initialize(System::block_number()); - Registrar::on_initialize(System::block_number()); - Parachains::on_initialize(System::block_number()); - } - fn run_to_block(n: BlockNumber) { - println!("Running until block {}", n); - while System::block_number() < n { - if System::block_number() > 1 { - println!("Finalizing {}", System::block_number()); - if !DidUpdate::get().is_some() { - Parachains::set_heads(Origin::none(), vec![]).unwrap(); - } - - Parachains::on_finalize(System::block_number()); - Registrar::on_finalize(System::block_number()); - System::on_finalize(System::block_number()); - } - Staking::new_session(System::block_number() as u32); - System::set_block_number(System::block_number() + 1); - init_block(); - } - } - - fn queue_upward_messages(id: ParaId, upward_messages: &[UpwardMessage]) { - NeedsDispatch::mutate(|nd| - Parachains::queue_upward_messages(id, upward_messages, nd) - ); - } - - #[test] - fn check_dispatch_upward_works() { - let parachains = vec![ - (0u32.into(), vec![].into(), vec![].into()), - (1u32.into(), vec![].into(), vec![].into()), - (2u32.into(), vec![].into(), vec![].into()), - ]; - new_test_ext(parachains.clone()).execute_with(|| { - init_block(); - queue_upward_messages(0.into(), &vec![ - UpwardMessage { origin: ParachainDispatchOrigin::Parachain, data: vec![0; 4] } - ]); - queue_upward_messages(1.into(), &vec![ - UpwardMessage { origin: ParachainDispatchOrigin::Parachain, data: vec![1; 4] } - ]); - let mut dispatched: Vec<(ParaId, ParachainDispatchOrigin, Vec)> = vec![]; - let dummy = |id, origin, data: &[u8]| dispatched.push((id, origin, data.to_vec())); - Parachains::dispatch_upward_messages(2, 3, dummy); - assert_eq!(dispatched, vec![ - (0.into(), ParachainDispatchOrigin::Parachain, vec![0; 4]) - ]); - assert!(::get(ParaId::from(0)).is_empty()); - assert_eq!(::get(ParaId::from(1)).len(), 1); - }); - new_test_ext(parachains.clone()).execute_with(|| { - init_block(); - queue_upward_messages(0.into(), &vec![ - UpwardMessage { origin: ParachainDispatchOrigin::Parachain, data: vec![0; 2] } - ]); - queue_upward_messages(1.into(), &vec![ - UpwardMessage { origin: ParachainDispatchOrigin::Parachain, data: vec![1; 2] } - ]); - queue_upward_messages(2.into(), &vec![ - UpwardMessage { origin: ParachainDispatchOrigin::Parachain, data: vec![2] } - ]); - let mut dispatched: Vec<(ParaId, ParachainDispatchOrigin, Vec)> = vec![]; - let dummy = |id, origin, data: &[u8]| dispatched.push((id, origin, data.to_vec())); - Parachains::dispatch_upward_messages(2, 3, dummy); - assert_eq!(dispatched, vec![ - (0.into(), ParachainDispatchOrigin::Parachain, vec![0; 2]), - (2.into(), ParachainDispatchOrigin::Parachain, vec![2]) - ]); - assert!(::get(ParaId::from(0)).is_empty()); - assert_eq!(::get(ParaId::from(1)).len(), 1); - assert!(::get(ParaId::from(2)).is_empty()); - }); - new_test_ext(parachains.clone()).execute_with(|| { - init_block(); - queue_upward_messages(0.into(), &vec![ - UpwardMessage { origin: ParachainDispatchOrigin::Parachain, data: vec![0; 2] } - ]); - queue_upward_messages(1.into(), &vec![ - UpwardMessage { origin: ParachainDispatchOrigin::Parachain, data: vec![1; 2] } - ]); - queue_upward_messages(2.into(), &vec![ - UpwardMessage { origin: ParachainDispatchOrigin::Parachain, data: vec![2] } - ]); - let mut dispatched: Vec<(ParaId, ParachainDispatchOrigin, Vec)> = vec![]; - let dummy = |id, origin, data: &[u8]| dispatched.push((id, origin, data.to_vec())); - Parachains::dispatch_upward_messages(2, 3, dummy); - assert_eq!(dispatched, vec![ - (0.into(), ParachainDispatchOrigin::Parachain, vec![0; 2]), - (2.into(), ParachainDispatchOrigin::Parachain, vec![2]) - ]); - assert!(::get(ParaId::from(0)).is_empty()); - assert_eq!(::get(ParaId::from(1)).len(), 1); - assert!(::get(ParaId::from(2)).is_empty()); - }); - new_test_ext(parachains.clone()).execute_with(|| { - init_block(); - queue_upward_messages(0.into(), &vec![ - UpwardMessage { origin: ParachainDispatchOrigin::Parachain, data: vec![0; 2] } - ]); - queue_upward_messages(1.into(), &vec![ - UpwardMessage { origin: ParachainDispatchOrigin::Parachain, data: vec![1; 2] } - ]); - queue_upward_messages(2.into(), &vec![ - UpwardMessage { origin: ParachainDispatchOrigin::Parachain, data: vec![2] } - ]); - let mut dispatched: Vec<(ParaId, ParachainDispatchOrigin, Vec)> = vec![]; - let dummy = |id, origin, data: &[u8]| dispatched.push((id, origin, data.to_vec())); - Parachains::dispatch_upward_messages(2, 3, dummy); - assert_eq!(dispatched, vec![ - (0.into(), ParachainDispatchOrigin::Parachain, vec![0; 2]), - (2.into(), ParachainDispatchOrigin::Parachain, vec![2]), - ]); - assert!(::get(ParaId::from(0)).is_empty()); - assert_eq!(::get(ParaId::from(1)).len(), 1); - assert!(::get(ParaId::from(2)).is_empty()); - }); - } - - #[test] - fn check_queue_upward_messages_works() { - let parachains = vec![ - (0u32.into(), vec![].into(), vec![].into()), - ]; - new_test_ext(parachains.clone()).execute_with(|| { - run_to_block(2); - let messages = vec![ - UpwardMessage { origin: ParachainDispatchOrigin::Signed, data: vec![0] } - ]; - assert_ok!(Parachains::check_upward_messages(0.into(), &messages, 2, 3)); - - // all good. - queue_upward_messages(0.into(), &vec![ - UpwardMessage { origin: ParachainDispatchOrigin::Signed, data: vec![0] }, - ]); - let messages = vec![ - UpwardMessage { origin: ParachainDispatchOrigin::Parachain, data: vec![1, 2] } - ]; - assert_ok!(Parachains::check_upward_messages(0.into(), &messages, 2, 3)); - queue_upward_messages(0.into(), &messages); - assert_eq!(::get(ParaId::from(0)), vec![ - UpwardMessage { origin: ParachainDispatchOrigin::Signed, data: vec![0] }, - UpwardMessage { origin: ParachainDispatchOrigin::Parachain, data: vec![1, 2] }, - ]); - }); - } - - #[test] - fn check_queue_full_upward_messages_fails() { - let parachains = vec![ - (0u32.into(), vec![].into(), vec![].into()), - ]; - new_test_ext(parachains.clone()).execute_with(|| { - run_to_block(2); - // oversize, but ok since it's just one and the queue is empty. - let messages = vec![ - UpwardMessage { origin: ParachainDispatchOrigin::Signed, data: vec![0; 4] }, - ]; - assert_ok!(Parachains::check_upward_messages(0.into(), &messages, 2, 3)); - - // oversize and bad since it's not just one. - let messages = vec![ - UpwardMessage { origin: ParachainDispatchOrigin::Signed, data: vec![0] }, - UpwardMessage { origin: ParachainDispatchOrigin::Signed, data: vec![0; 4] }, - ]; - assert_err!( - Parachains::check_upward_messages(0.into(), &messages, 2, 3), - Error::::QueueFull - ); - - // too many messages. - let messages = vec![ - UpwardMessage { origin: ParachainDispatchOrigin::Signed, data: vec![0] }, - UpwardMessage { origin: ParachainDispatchOrigin::Signed, data: vec![1] }, - UpwardMessage { origin: ParachainDispatchOrigin::Signed, data: vec![2] }, - ]; - assert_err!( - Parachains::check_upward_messages(0.into(), &messages, 2, 3), - Error::::QueueFull - ); - }); - } - - #[test] - fn check_queued_too_many_upward_messages_fails() { - let parachains = vec![ - (0u32.into(), vec![].into(), vec![].into()), - ]; - new_test_ext(parachains.clone()).execute_with(|| { - run_to_block(2); - // too many messages. - queue_upward_messages(0.into(), &vec![ - UpwardMessage { origin: ParachainDispatchOrigin::Signed, data: vec![0] }, - ]); - let messages = vec![ - UpwardMessage { origin: ParachainDispatchOrigin::Signed, data: vec![1] }, - UpwardMessage { origin: ParachainDispatchOrigin::Signed, data: vec![2] }, - ]; - assert_err!( - Parachains::check_upward_messages(0.into(), &messages, 2, 3), - Error::::QueueFull - ); - }); - } - - #[test] - fn check_queued_total_oversize_upward_messages_fails() { - let parachains = vec![ - (0u32.into(), vec![].into(), vec![].into()), - ]; - new_test_ext(parachains.clone()).execute_with(|| { - run_to_block(2); - // too much data. - queue_upward_messages(0.into(), &vec![ - UpwardMessage { origin: ParachainDispatchOrigin::Signed, data: vec![0, 1] }, - ]); - let messages = vec![ - UpwardMessage { origin: ParachainDispatchOrigin::Signed, data: vec![2, 3] }, - ]; - assert_err!( - Parachains::check_upward_messages(0.into(), &messages, 2, 3), - Error::::QueueFull - ); - }); - } - - #[test] - fn check_queued_pre_jumbo_upward_messages_fails() { - let parachains = vec![ - (0u32.into(), vec![].into(), vec![].into()), - ]; - new_test_ext(parachains.clone()).execute_with(|| { - run_to_block(2); - // bad - already an oversize messages queued. - queue_upward_messages(0.into(), &vec![ - UpwardMessage { origin: ParachainDispatchOrigin::Signed, data: vec![0; 4] }, - ]); - let messages = vec![ - UpwardMessage { origin: ParachainDispatchOrigin::Signed, data: vec![0] } - ]; - assert_err!( - Parachains::check_upward_messages(0.into(), &messages, 2, 3), - Error::::QueueFull - ); - }); - } - - #[test] - fn check_queued_post_jumbo_upward_messages_fails() { - let parachains = vec![ - (0u32.into(), vec![].into(), vec![].into()), - ]; - new_test_ext(parachains.clone()).execute_with(|| { - run_to_block(2); - // bad - oversized and already a message queued. - queue_upward_messages(0.into(), &vec![ - UpwardMessage { origin: ParachainDispatchOrigin::Signed, data: vec![0] }, - ]); - let messages = vec![ - UpwardMessage { origin: ParachainDispatchOrigin::Signed, data: vec![0; 4] } - ]; - assert_err!( - Parachains::check_upward_messages(0.into(), &messages, 2, 3), - Error::::QueueFull - ); - }); - } - - #[test] - fn upward_queuing_works() { - // That the list of egress queue roots is in ascending order by `ParaId`. - let parachains = vec![ - (0u32.into(), vec![].into(), vec![].into()), - (1u32.into(), vec![].into(), vec![].into()), - ]; - - new_test_ext(parachains.clone()).execute_with(|| { - run_to_block(2); - // parachain 0 is self - let mut candidates = vec![ - new_candidate_with_upward_messages(0, vec![ - (ParachainDispatchOrigin::Signed, vec![1]), - ]), - new_candidate_with_upward_messages(1, vec![ - (ParachainDispatchOrigin::Parachain, vec![2]), - ]) - ]; - candidates.iter_mut().for_each(make_attestations); - - assert_ok!(Call::from(set_heads(candidates)).dispatch(Origin::none())); - - assert!(::get(ParaId::from(0)).is_empty()); - assert!(::get(ParaId::from(1)).is_empty()); - }); - } - - #[test] - fn active_parachains_should_work() { - let parachains = vec![ - (5u32.into(), vec![1,2,3].into(), vec![1].into()), - (100u32.into(), vec![4,5,6].into(), vec![2].into()), - ]; - - new_test_ext(parachains.clone()).execute_with(|| { - run_to_block(2); - assert_eq!(Parachains::active_parachains(), vec![(5u32.into(), None), (100u32.into(), None)]); - assert_eq!(Parachains::parachain_code(ParaId::from(5u32)), Some(vec![1, 2, 3].into())); - assert_eq!(Parachains::parachain_code(ParaId::from(100u32)), Some(vec![4, 5, 6].into())); - }); - } - - #[test] - fn register_deregister() { - let parachains = vec![ - (5u32.into(), vec![1,2,3].into(), vec![1].into()), - (100u32.into(), vec![4,5,6].into(), vec![2,].into()), - ]; - - new_test_ext(parachains.clone()).execute_with(|| { - run_to_block(2); - assert_eq!(Parachains::active_parachains(), vec![(5u32.into(), None), (100u32.into(), None)]); - - assert_eq!(Parachains::parachain_code(ParaId::from(5u32)), Some(vec![1,2,3].into())); - assert_eq!(Parachains::parachain_code(ParaId::from(100u32)), Some(vec![4,5,6].into())); - - assert_ok!(Registrar::register_para( - Origin::root(), - 99u32.into(), - ParaInfo{scheduling: Scheduling::Always}, - vec![7,8,9].into(), - vec![1, 1, 1].into(), - )); - assert_ok!(Parachains::set_heads(Origin::none(), vec![])); - - run_to_block(3); - - assert_eq!(Parachains::active_parachains(), vec![(5u32.into(), None), (99u32.into(), None), (100u32.into(), None)]); - assert_eq!(Parachains::parachain_code(&ParaId::from(99u32)), Some(vec![7,8,9].into())); - - assert_ok!(Registrar::deregister_para(Origin::root(), 5u32.into())); - assert_ok!(Parachains::set_heads(Origin::none(), vec![])); - - // parachain still active this block. another block must pass before it's inactive. - run_to_block(4); - - assert_eq!(Parachains::active_parachains(), vec![(99u32.into(), None), (100u32.into(), None)]); - assert_eq!(Parachains::parachain_code(&ParaId::from(5u32)), None); - }); - } - - #[test] - fn duty_roster_works() { - let parachains = vec![ - (0u32.into(), vec![].into(), vec![].into()), - (1u32.into(), vec![].into(), vec![].into()), - ]; - - new_test_ext(parachains.clone()).execute_with(|| { - run_to_block(2); - let check_roster = |duty_roster: &DutyRoster| { - assert_eq!(duty_roster.validator_duty.len(), 8); - for i in (0..2).map(ParaId::from) { - assert_eq!(duty_roster.validator_duty.iter().filter(|&&j| j == Chain::Parachain(i)).count(), 3); - } - assert_eq!(duty_roster.validator_duty.iter().filter(|&&j| j == Chain::Relay).count(), 2); - }; - - let duty_roster_0 = Parachains::calculate_duty_roster().0; - check_roster(&duty_roster_0); - - System::initialize(&1, &H256::from([1; 32]), &Default::default(), &Default::default(), Default::default()); - RandomnessCollectiveFlip::on_initialize(1); - let duty_roster_1 = Parachains::calculate_duty_roster().0; - check_roster(&duty_roster_1); - assert_ne!(duty_roster_0, duty_roster_1); - - - System::initialize(&2, &H256::from([2; 32]), &Default::default(), &Default::default(), Default::default()); - RandomnessCollectiveFlip::on_initialize(2); - let duty_roster_2 = Parachains::calculate_duty_roster().0; - check_roster(&duty_roster_2); - assert_ne!(duty_roster_0, duty_roster_2); - assert_ne!(duty_roster_1, duty_roster_2); - }); - } - - #[test] - fn unattested_candidate_is_rejected() { - let parachains = vec![ - (0u32.into(), vec![].into(), vec![].into()), - (1u32.into(), vec![].into(), vec![].into()), - ]; - - new_test_ext(parachains.clone()).execute_with(|| { - run_to_block(2); - let candidate = make_blank_attested(raw_candidate(0.into())); - assert!(Call::from(set_heads(vec![candidate])).dispatch(Origin::none()).is_err()); - }) - } - - #[test] - fn attested_candidates_accepted_in_order() { - let parachains = vec![ - (0u32.into(), vec![].into(), vec![].into()), - (1u32.into(), vec![].into(), vec![].into()), - ]; - - new_test_ext(parachains.clone()).execute_with(|| { - run_to_block(2); - assert_eq!(Parachains::active_parachains().len(), 2); - - let mut candidate_a = make_blank_attested(raw_candidate(0.into())); - let mut candidate_b = make_blank_attested(raw_candidate(1.into())); - - make_attestations(&mut candidate_a); - make_attestations(&mut candidate_b); - - assert!(Call::from(set_heads(vec![candidate_b.clone(), candidate_a.clone()])) - .dispatch(Origin::none()).is_err()); - - assert_ok!(Call::from(set_heads(vec![candidate_a.clone(), candidate_b.clone()])) - .dispatch(Origin::none())); - - assert_eq!(Heads::get(&ParaId::from(0)), Some(candidate_a.candidate.head_data)); - assert_eq!(Heads::get(&ParaId::from(1)), Some(candidate_b.candidate.head_data)); - }); - } - - #[test] - fn duplicate_vote_is_rejected() { - let parachains = vec![ - (0u32.into(), vec![].into(), vec![].into()), - (1u32.into(), vec![].into(), vec![].into()), - ]; - - new_test_ext(parachains.clone()).execute_with(|| { - run_to_block(2); - - let mut candidate = make_blank_attested(raw_candidate(0.into())); - make_attestations(&mut candidate); - - let mut double_validity = candidate.clone(); - double_validity.validity_votes.push(candidate.validity_votes[0].clone()); - double_validity.validator_indices.push(true); - - assert!(Call::from(set_heads(vec![double_validity])).dispatch(Origin::none()).is_err()); - }); - } - - #[test] - fn validators_not_from_group_is_rejected() { - let parachains = vec![ - (0u32.into(), vec![].into(), vec![].into()), - (1u32.into(), vec![].into(), vec![].into()), - ]; - - new_test_ext(parachains.clone()).execute_with(|| { - run_to_block(2); - - let mut candidate = make_blank_attested(raw_candidate(0.into())); - make_attestations(&mut candidate); - - // Change the last vote index to make it not corresponding to the assigned group. - assert!(candidate.validator_indices.pop().is_some()); - candidate.validator_indices.append(&mut bitvec![0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]); - - assert!(Call::from(set_heads(vec![candidate])).dispatch(Origin::none()).is_err()); - }); - } - - #[test] - fn empty_trie_root_const_is_blake2_hashed_null_node() { - let hashed_null_node = as trie_db::NodeCodec>::hashed_null_node(); - assert_eq!(hashed_null_node, EMPTY_TRIE_ROOT.into()) - } - - #[test] - fn para_past_code_meta_gives_right_code() { - let mut past_code = ParaPastCodeMeta::default(); - assert_eq!(past_code.code_at(0u32), Some(UseCodeAt::Current)); - - past_code.note_replacement(10); - assert_eq!(past_code.code_at(0), Some(UseCodeAt::ReplacedAt(10))); - assert_eq!(past_code.code_at(10), Some(UseCodeAt::ReplacedAt(10))); - assert_eq!(past_code.code_at(11), Some(UseCodeAt::Current)); - - past_code.note_replacement(20); - assert_eq!(past_code.code_at(1), Some(UseCodeAt::ReplacedAt(10))); - assert_eq!(past_code.code_at(10), Some(UseCodeAt::ReplacedAt(10))); - assert_eq!(past_code.code_at(11), Some(UseCodeAt::ReplacedAt(20))); - assert_eq!(past_code.code_at(20), Some(UseCodeAt::ReplacedAt(20))); - assert_eq!(past_code.code_at(21), Some(UseCodeAt::Current)); - - past_code.last_pruned = Some(5); - assert_eq!(past_code.code_at(1), None); - assert_eq!(past_code.code_at(5), None); - assert_eq!(past_code.code_at(6), Some(UseCodeAt::ReplacedAt(10))); - } - - #[test] - fn para_past_code_pruning_works_correctly() { - let mut past_code = ParaPastCodeMeta::default(); - past_code.note_replacement(10u32); - past_code.note_replacement(20); - past_code.note_replacement(30); - - let old = past_code.clone(); - assert!(past_code.prune_up_to(9).collect::>().is_empty()); - assert_eq!(old, past_code); - - assert_eq!(past_code.prune_up_to(10).collect::>(), vec![10]); - assert_eq!(past_code, ParaPastCodeMeta { - upgrade_times: vec![30, 20], - last_pruned: Some(10), - }); - - assert_eq!(past_code.prune_up_to(21).collect::>(), vec![20]); - assert_eq!(past_code, ParaPastCodeMeta { - upgrade_times: vec![30], - last_pruned: Some(20), - }); - - past_code.note_replacement(40); - past_code.note_replacement(50); - past_code.note_replacement(60); - - assert_eq!(past_code, ParaPastCodeMeta { - upgrade_times: vec![60, 50, 40, 30], - last_pruned: Some(20), - }); - - assert_eq!(past_code.prune_up_to(60).collect::>(), vec![30, 40, 50, 60]); - assert_eq!(past_code, ParaPastCodeMeta { - upgrade_times: Vec::new(), - last_pruned: Some(60), - }); - } - - #[test] - fn para_past_code_pruning_in_initialize() { - let parachains = vec![ - (0u32.into(), vec![].into(), vec![].into()), - (1u32.into(), vec![].into(), vec![].into()), - ]; - - new_test_ext(parachains.clone()).execute_with(|| { - let id = ParaId::from(0u32); - let at_block: BlockNumber = 10; - ::PastCode::insert(&(id, at_block), &ValidationCode(vec![1, 2, 3])); - ::PastCodePruning::put(&vec![(id, at_block)]); - - { - let mut code_meta = Parachains::past_code_meta(&id); - code_meta.note_replacement(at_block); - ::PastCodeMeta::insert(&id, &code_meta); - } - - let pruned_at: BlockNumber = at_block + SlashPeriod::get() + 1; - assert_eq!(::PastCode::get(&(id, at_block)), Some(vec![1, 2, 3].into())); - - run_to_block(pruned_at - 1); - assert_eq!(::PastCode::get(&(id, at_block)), Some(vec![1, 2, 3].into())); - assert_eq!(Parachains::past_code_meta(&id).most_recent_change(), Some(at_block)); - - run_to_block(pruned_at); - assert!(::PastCode::get(&(id, at_block)).is_none()); - assert!(Parachains::past_code_meta(&id).most_recent_change().is_none()); - }); - } - - #[test] - fn note_past_code_sets_up_pruning_correctly() { - let parachains = vec![ - (0u32.into(), vec![].into(), vec![].into()), - (1u32.into(), vec![].into(), vec![].into()), - ]; - - new_test_ext(parachains.clone()).execute_with(|| { - let id_a = ParaId::from(0u32); - let id_b = ParaId::from(1u32); - - Parachains::note_past_code(id_a, 10, vec![1, 2, 3].into()); - Parachains::note_past_code(id_b, 20, vec![4, 5, 6].into()); - - assert_eq!(Parachains::past_code_pruning_tasks(), vec![(id_a, 10), (id_b, 20)]); - assert_eq!( - Parachains::past_code_meta(&id_a), - ParaPastCodeMeta { - upgrade_times: vec![10], - last_pruned: None, - } - ); - assert_eq!( - Parachains::past_code_meta(&id_b), - ParaPastCodeMeta { - upgrade_times: vec![20], - last_pruned: None, - } - ); - }); - } - - #[test] - fn code_upgrade_applied_after_delay() { - let parachains = vec![ - (0u32.into(), vec![1, 2, 3].into(), vec![].into()), - ]; - - new_test_ext(parachains.clone()).execute_with(|| { - let para_id = ParaId::from(0); - let new_code = ValidationCode(vec![4, 5, 6]); - - run_to_block(2); - assert_eq!(Parachains::active_parachains().len(), 1); - assert_eq!(Parachains::parachain_code(¶_id), Some(vec![1, 2, 3].into())); - - let applied_after ={ - let raw_candidate = raw_candidate(para_id); - let applied_after = raw_candidate.local_validation.code_upgrade_allowed.unwrap(); - let mut candidate_a = make_blank_attested(raw_candidate); - - candidate_a.candidate.commitments.new_validation_code = Some(new_code.clone()); - - // this parablock is in the context of block 1. - assert_eq!(applied_after, 1 + ValidationUpgradeDelay::get()); - make_attestations(&mut candidate_a); - - assert_ok!(Call::from(set_heads(vec![candidate_a.clone()])).dispatch(Origin::none())); - - assert!(Parachains::past_code_meta(¶_id).most_recent_change().is_none()); - assert_eq!(Parachains::code_upgrade_schedule(¶_id), Some(applied_after)); - assert_eq!(::FutureCode::get(¶_id), new_code); - assert_eq!(Parachains::parachain_code(¶_id), Some(vec![1, 2, 3].into())); - - applied_after - }; - - run_to_block(applied_after); - - // the candidate is in the context of the parent of `applied_after`, - // thus does not trigger the code upgrade. - { - let raw_candidate = raw_candidate(para_id); - assert!(raw_candidate.local_validation.code_upgrade_allowed.is_none()); - let mut candidate_a = make_blank_attested(raw_candidate); - - make_attestations(&mut candidate_a); - - assert_ok!(Call::from(set_heads(vec![candidate_a.clone()])).dispatch(Origin::none())); - - assert!(Parachains::past_code_meta(¶_id).most_recent_change().is_none()); - assert_eq!(Parachains::code_upgrade_schedule(¶_id), Some(applied_after)); - assert_eq!(::FutureCode::get(¶_id), new_code); - assert_eq!(Parachains::parachain_code(¶_id), Some(vec![1, 2, 3].into())); - } - - run_to_block(applied_after + 1); - - // the candidate is in the context of `applied_after`, and triggers - // the upgrade. - { - let raw_candidate = raw_candidate(para_id); - assert!(raw_candidate.local_validation.code_upgrade_allowed.is_some()); - let mut candidate_a = make_blank_attested(raw_candidate); - - make_attestations(&mut candidate_a); - - assert_ok!(Call::from(set_heads(vec![candidate_a.clone()])).dispatch(Origin::none())); - - assert_eq!( - Parachains::past_code_meta(¶_id).most_recent_change(), - Some(applied_after), - ); - assert_eq!( - ::PastCode::get(&(para_id, applied_after)), - Some(vec![1, 2, 3,].into()), - ); - assert!(Parachains::code_upgrade_schedule(¶_id).is_none()); - assert!(::FutureCode::get(¶_id).0.is_empty()); - assert_eq!(Parachains::parachain_code(¶_id), Some(new_code)); - } - }); - } - - #[test] - fn code_upgrade_applied_after_delay_even_when_late() { - let parachains = vec![ - (0u32.into(), vec![1, 2, 3].into(), vec![].into()), - ]; - - new_test_ext(parachains.clone()).execute_with(|| { - let para_id = ParaId::from(0); - let new_code = ValidationCode(vec![4, 5, 6]); - - run_to_block(2); - assert_eq!(Parachains::active_parachains().len(), 1); - assert_eq!(Parachains::parachain_code(¶_id), Some(vec![1, 2, 3].into())); - - let applied_after ={ - let raw_candidate = raw_candidate(para_id); - let applied_after = raw_candidate.local_validation.code_upgrade_allowed.unwrap(); - let mut candidate_a = make_blank_attested(raw_candidate); - - candidate_a.candidate.commitments.new_validation_code = Some(new_code.clone()); - - // this parablock is in the context of block 1. - assert_eq!(applied_after, 1 + ValidationUpgradeDelay::get()); - make_attestations(&mut candidate_a); - - assert_ok!(Call::from(set_heads(vec![candidate_a.clone()])).dispatch(Origin::none())); - - assert!(Parachains::past_code_meta(¶_id).most_recent_change().is_none()); - assert_eq!(Parachains::code_upgrade_schedule(¶_id), Some(applied_after)); - assert_eq!(::FutureCode::get(¶_id), new_code); - assert_eq!(Parachains::parachain_code(¶_id), Some(vec![1, 2, 3].into())); - - applied_after - }; - - run_to_block(applied_after + 1 + 4); - - { - let raw_candidate = raw_candidate(para_id); - assert!(raw_candidate.local_validation.code_upgrade_allowed.is_some()); - let mut candidate_a = make_blank_attested(raw_candidate); - - make_attestations(&mut candidate_a); - - assert_ok!(Call::from(set_heads(vec![candidate_a.clone()])).dispatch(Origin::none())); - - assert_eq!( - Parachains::past_code_meta(¶_id).most_recent_change(), - Some(applied_after + 4), - ); - assert_eq!( - ::PastCode::get(&(para_id, applied_after + 4)), - Some(vec![1, 2, 3,].into()), - ); - assert!(Parachains::code_upgrade_schedule(¶_id).is_none()); - assert!(::FutureCode::get(¶_id).0.is_empty()); - assert_eq!(Parachains::parachain_code(¶_id), Some(new_code)); - } - }); - } - - #[test] - fn submit_code_change_when_not_allowed_is_err() { - let parachains = vec![ - (0u32.into(), vec![1, 2, 3].into(), vec![].into()), - ]; - - new_test_ext(parachains.clone()).execute_with(|| { - let para_id = ParaId::from(0); - let new_code = ValidationCode(vec![4, 5, 6]); - - run_to_block(2); - - { - let raw_candidate = raw_candidate(para_id); - let mut candidate_a = make_blank_attested(raw_candidate); - - candidate_a.candidate.commitments.new_validation_code = Some(new_code.clone()); - - make_attestations(&mut candidate_a); - - assert_ok!(Call::from(set_heads(vec![candidate_a.clone()])).dispatch(Origin::none())); - }; - - run_to_block(3); - - { - let raw_candidate = raw_candidate(para_id); - assert!(raw_candidate.local_validation.code_upgrade_allowed.is_none()); - let mut candidate_a = make_blank_attested(raw_candidate); - candidate_a.candidate.commitments.new_validation_code = Some(vec![1, 2, 3].into()); - - make_attestations(&mut candidate_a); - - assert_err!( - Call::from(set_heads(vec![candidate_a.clone()])).dispatch(Origin::none()), - Error::::DisallowedCodeUpgrade, - ); - } - }); - } - - #[test] - fn full_parachain_cleanup_storage() { - let parachains = vec![ - (0u32.into(), vec![1, 2, 3].into(), vec![].into()), - ]; - - new_test_ext(parachains.clone()).execute_with(|| { - let para_id = ParaId::from(0); - let new_code = ValidationCode(vec![4, 5, 6]); - - run_to_block(2); - { - let raw_candidate = raw_candidate(para_id); - let applied_after = raw_candidate.local_validation.code_upgrade_allowed.unwrap(); - let mut candidate_a = make_blank_attested(raw_candidate); - - candidate_a.candidate.commitments.new_validation_code = Some(new_code.clone()); - - // this parablock is in the context of block 1. - assert_eq!(applied_after, 1 + ValidationUpgradeDelay::get()); - make_attestations(&mut candidate_a); - - assert_ok!(Call::from(set_heads(vec![candidate_a.clone()])).dispatch(Origin::none())); - - assert!(Parachains::past_code_meta(¶_id).most_recent_change().is_none()); - assert_eq!(Parachains::code_upgrade_schedule(¶_id), Some(applied_after)); - assert_eq!(::FutureCode::get(¶_id), new_code); - assert_eq!(Parachains::parachain_code(¶_id), Some(vec![1, 2, 3].into())); - - assert!(Parachains::past_code_pruning_tasks().is_empty()); - }; - - Parachains::cleanup_para(para_id); - - // cleaning up the parachain should place the current parachain code - // into the past code buffer & schedule cleanup. - assert_eq!(Parachains::past_code_meta(¶_id).most_recent_change(), Some(2)); - assert_eq!(::PastCode::get(&(para_id, 2)), Some(vec![1, 2, 3].into())); - assert_eq!(Parachains::past_code_pruning_tasks(), vec![(para_id, 2)]); - - // any future upgrades haven't been used to validate yet, so those - // are cleaned up immediately. - assert!(Parachains::code_upgrade_schedule(¶_id).is_none()); - assert!(::FutureCode::get(¶_id).0.is_empty()); - assert!(Parachains::parachain_code(¶_id).is_none()); - - let cleaned_up_at = 2 + SlashPeriod::get() + 1; - run_to_block(cleaned_up_at); - - // now the final cleanup: last past code cleaned up, and this triggers meta cleanup. - assert_eq!(Parachains::past_code_meta(¶_id), Default::default()); - assert!(::PastCode::get(&(para_id, 2)).is_none()); - assert!(Parachains::past_code_pruning_tasks().is_empty()); - }); - } - - #[test] - fn double_vote_candidate_and_valid_works() { - let parachains = vec![ - (1u32.into(), vec![].into(), vec![].into()), - ]; - - let extract_key = |public: ValidatorId| { - let mut raw_public = [0; 32]; - raw_public.copy_from_slice(public.as_ref()); - Sr25519Keyring::from_raw_public(raw_public).unwrap() - }; - - // Test that a Candidate and Valid statements on the same candidate get slashed. - new_test_ext(parachains.clone()).execute_with(|| { - assert_eq!(Staking::current_era(), Some(0)); - assert_eq!(Session::current_index(), 0); - - start_era(1); - - let candidate = raw_candidate(1.into()).abridge().0; - let candidate_hash = candidate.hash(); - - let authorities = Parachains::authorities(); - let authority_index = 0; - let key = extract_key(authorities[authority_index].clone()); - - let statement_candidate = Statement::Candidate(candidate_hash.clone()); - let statement_valid = Statement::Valid(candidate_hash.clone()); - - let signing_context = Parachains::signing_context(); - let payload_1 = localized_payload(statement_candidate.clone(), &signing_context); - let payload_2 = localized_payload(statement_valid.clone(), &signing_context); - - let signature_1 = key.sign(&payload_1[..]).into(); - let signature_2 = key.sign(&payload_2[..]).into(); - - // Check that in the beginning the genesis balances are there. - for i in 0..authorities.len() { - assert_eq!(Balances::total_balance(&(i as u64)), 10_000_000); - assert_eq!(Staking::slashable_balance_of(&(i as u64)), 10_000); - - assert_eq!( - Staking::eras_stakers(1, i as u64), - pallet_staking::Exposure { - total: 10_000, - own: 10_000, - others: vec![], - }, - ); - } - - let encoded_key = key.encode(); - let proof = Historical::prove((PARACHAIN_KEY_TYPE_ID, &encoded_key[..])).unwrap(); - - let report = DoubleVoteReport { - identity: ValidatorId::from(key.public()), - first: (statement_candidate, signature_1), - second: (statement_valid, signature_2), - proof, - signing_context, - }; - - let inner = report_double_vote(report).unwrap(); - - assert_ok!(Call::from(inner).dispatch(Origin::signed(1))); - - start_era(2); - - // Check that the balance of 0-th validator is slashed 100%. - assert_eq!(Balances::total_balance(&0), 10_000_000 - 10_000); - assert_eq!(Staking::slashable_balance_of(&0), 0); - - assert_eq!( - Staking::eras_stakers(2, 0), - pallet_staking::Exposure { - total: 0, - own: 0, - others: vec![], - }, - ); - - // Check that the balances of all other validators are left intact. - for i in 1..authorities.len() { - assert_eq!(Balances::total_balance(&(i as u64)), 10_000_000); - assert_eq!(Staking::slashable_balance_of(&(i as u64)), 10_000); - - assert_eq!( - Staking::eras_stakers(2, i as u64), - pallet_staking::Exposure { - total: 10_000, - own: 10_000, - others: vec![], - }, - ); - } - }); - } - - #[test] - fn double_vote_candidate_and_invalid_works() { - let parachains = vec![ - (1u32.into(), vec![].into(), vec![].into()), - ]; - - let extract_key = |public: ValidatorId| { - let mut raw_public = [0; 32]; - raw_public.copy_from_slice(public.as_ref()); - Sr25519Keyring::from_raw_public(raw_public).unwrap() - }; - - // Test that a Candidate and Invalid statements on the same candidate get slashed. - new_test_ext(parachains.clone()).execute_with(|| { - start_era(1); - - let candidate = raw_candidate(1.into()).abridge().0; - let candidate_hash = candidate.hash(); - - let authorities = Parachains::authorities(); - let authority_index = 0; - let key = extract_key(authorities[authority_index].clone()); - - let statement_candidate = Statement::Candidate(candidate_hash); - let statement_invalid = Statement::Invalid(candidate_hash.clone()); - - let signing_context = Parachains::signing_context(); - let payload_1 = localized_payload(statement_candidate.clone(), &signing_context); - let payload_2 = localized_payload(statement_invalid.clone(), &signing_context); - - let signature_1 = key.sign(&payload_1[..]).into(); - let signature_2 = key.sign(&payload_2[..]).into(); - - // Check that in the beginning the genesis balances are there. - for i in 0..authorities.len() { - assert_eq!(Balances::total_balance(&(i as u64)), 10_000_000); - assert_eq!(Staking::slashable_balance_of(&(i as u64)), 10_000); - - assert_eq!( - Staking::eras_stakers(1, i as u64), - pallet_staking::Exposure { - total: 10_000, - own: 10_000, - others: vec![], - }, - ); - } - - let encoded_key = key.encode(); - let proof = Historical::prove((PARACHAIN_KEY_TYPE_ID, &encoded_key[..])).unwrap(); - - let report = DoubleVoteReport { - identity: ValidatorId::from(key.public()), - first: (statement_candidate, signature_1), - second: (statement_invalid, signature_2), - proof, - signing_context, - }; - - assert_ok!(Call::from(report_double_vote(report).unwrap()).dispatch(Origin::signed(1))); - - start_era(2); - - // Check that the balance of 0-th validator is slashed 100%. - assert_eq!(Balances::total_balance(&0), 10_000_000 - 10_000); - assert_eq!(Staking::slashable_balance_of(&0), 0); - - assert_eq!( - Staking::eras_stakers(Staking::current_era().unwrap(), 0), - pallet_staking::Exposure { - total: 0, - own: 0, - others: vec![], - }, - ); - - // Check that the balances of all other validators are left intact. - for i in 1..authorities.len() { - assert_eq!(Balances::total_balance(&(i as u64)), 10_000_000); - assert_eq!(Staking::slashable_balance_of(&(i as u64)), 10_000); - - assert_eq!( - Staking::eras_stakers(2, i as u64), - pallet_staking::Exposure { - total: 10_000, - own: 10_000, - others: vec![], - }, - ); - } - - }); - } - - #[test] - fn double_vote_valid_and_invalid_works() { - let parachains = vec![ - (1u32.into(), vec![].into(), vec![].into()), - ]; - - let extract_key = |public: ValidatorId| { - let mut raw_public = [0; 32]; - raw_public.copy_from_slice(public.as_ref()); - Sr25519Keyring::from_raw_public(raw_public).unwrap() - }; - - // Test that an Invalid and Valid statements on the same candidate get slashed. - new_test_ext(parachains.clone()).execute_with(|| { - start_era(1); - - let candidate = raw_candidate(1.into()).abridge().0; - let candidate_hash = candidate.hash(); - - let authorities = Parachains::authorities(); - let authority_index = 0; - let key = extract_key(authorities[authority_index].clone()); - - let statement_invalid = Statement::Invalid(candidate_hash.clone()); - let statement_valid = Statement::Valid(candidate_hash.clone()); - - let signing_context = Parachains::signing_context(); - let payload_1 = localized_payload(statement_invalid.clone(), &signing_context); - let payload_2 = localized_payload(statement_valid.clone(), &signing_context); - - let signature_1 = key.sign(&payload_1[..]).into(); - let signature_2 = key.sign(&payload_2[..]).into(); - - // Check that in the beginning the genesis balances are there. - for i in 0..authorities.len() { - assert_eq!(Balances::total_balance(&(i as u64)), 10_000_000); - assert_eq!(Staking::slashable_balance_of(&(i as u64)), 10_000); - - assert_eq!( - Staking::eras_stakers(1, i as u64), - pallet_staking::Exposure { - total: 10_000, - own: 10_000, - others: vec![], - }, - ); - } - - let encoded_key = key.encode(); - let proof = Historical::prove((PARACHAIN_KEY_TYPE_ID, &encoded_key[..])).unwrap(); - - let report = DoubleVoteReport { - identity: ValidatorId::from(key.public()), - first: (statement_invalid, signature_1), - second: (statement_valid, signature_2), - proof, - signing_context, - }; - - assert_ok!(Call::from(report_double_vote(report).unwrap()).dispatch(Origin::signed(1))); - - start_era(2); - - // Check that the balance of 0-th validator is slashed 100%. - assert_eq!(Balances::total_balance(&0), 10_000_000 - 10_000); - assert_eq!(Staking::slashable_balance_of(&0), 0); - - assert_eq!( - Staking::eras_stakers(2, 0), - pallet_staking::Exposure { - total: 0, - own: 0, - others: vec![], - }, - ); - - // Check that the balances of all other validators are left intact. - for i in 1..authorities.len() { - assert_eq!(Balances::total_balance(&(i as u64)), 10_000_000); - assert_eq!(Staking::slashable_balance_of(&(i as u64)), 10_000); - - assert_eq!( - Staking::eras_stakers(2, i as u64), - pallet_staking::Exposure { - total: 10_000, - own: 10_000, - others: vec![], - }, - ); - } - }); - } - - // Check that submitting the same report twice errors. - #[test] - fn double_vote_submit_twice_works() { - let parachains = vec![ - (1u32.into(), vec![].into(), vec![].into()), - ]; - - let extract_key = |public: ValidatorId| { - let mut raw_public = [0; 32]; - raw_public.copy_from_slice(public.as_ref()); - Sr25519Keyring::from_raw_public(raw_public).unwrap() - }; - - // Test that a Candidate and Valid statements on the same candidate get slashed. - new_test_ext(parachains.clone()).execute_with(|| { - assert_eq!(Staking::current_era(), Some(0)); - assert_eq!(Session::current_index(), 0); - - start_era(1); - - let candidate = raw_candidate(1.into()).abridge().0; - let candidate_hash = candidate.hash(); - - let authorities = Parachains::authorities(); - let authority_index = 0; - let key = extract_key(authorities[authority_index].clone()); - - let statement_candidate = Statement::Candidate(candidate_hash.clone()); - let statement_valid = Statement::Valid(candidate_hash.clone()); - - let signing_context = Parachains::signing_context(); - let payload_1 = localized_payload(statement_candidate.clone(), &signing_context); - let payload_2 = localized_payload(statement_valid.clone(), &signing_context); - - let signature_1 = key.sign(&payload_1[..]).into(); - let signature_2 = key.sign(&payload_2[..]).into(); - - // Check that in the beginning the genesis balances are there. - for i in 0..authorities.len() { - assert_eq!(Balances::total_balance(&(i as u64)), 10_000_000); - assert_eq!(Staking::slashable_balance_of(&(i as u64)), 10_000); - - assert_eq!( - Staking::eras_stakers(1, i as u64), - pallet_staking::Exposure { - total: 10_000, - own: 10_000, - others: vec![], - }, - ); - } - - let encoded_key = key.encode(); - let proof = Historical::prove((PARACHAIN_KEY_TYPE_ID, &encoded_key[..])).unwrap(); - - let report = DoubleVoteReport { - identity: ValidatorId::from(key.public()), - first: (statement_candidate, signature_1), - second: (statement_valid, signature_2), - proof, - signing_context, - }; - - assert_ok!(Call::from(report_double_vote(report.clone()).unwrap()).dispatch(Origin::signed(1))); - - assert!(Call::from(report_double_vote(report).unwrap()).dispatch(Origin::signed(1)).is_err() - ); - - start_era(2); - - // Check that the balance of 0-th validator is slashed 100%. - assert_eq!(Balances::total_balance(&0), 10_000_000 - 10_000); - assert_eq!(Staking::slashable_balance_of(&0), 0); - - assert_eq!( - Staking::eras_stakers(2, 0), - pallet_staking::Exposure { - total: 0, - own: 0, - others: vec![], - }, - ); - - // Check that the balances of all other validators are left intact. - for i in 1..authorities.len() { - assert_eq!(Balances::total_balance(&(i as u64)), 10_000_000); - assert_eq!(Staking::slashable_balance_of(&(i as u64)), 10_000); - - assert_eq!( - Staking::eras_stakers(2, i as u64), - pallet_staking::Exposure { - total: 10_000, - own: 10_000, - others: vec![], - }, - ); - } - }); - } - - // Check that submitting invalid reports fail. - #[test] - fn double_vote_submit_invalid_works() { - let parachains = vec![ - (1u32.into(), vec![].into(), vec![].into()), - ]; - - let extract_key = |public: ValidatorId| { - let mut raw_public = [0; 32]; - raw_public.copy_from_slice(public.as_ref()); - Sr25519Keyring::from_raw_public(raw_public).unwrap() - }; - - // Test that a Candidate and Valid statements on the same candidate get slashed. - new_test_ext(parachains.clone()).execute_with(|| { - assert_eq!(Staking::current_era(), Some(0)); - assert_eq!(Session::current_index(), 0); - - start_era(1); - - let candidate = raw_candidate(1.into()).abridge().0; - let candidate_hash = candidate.hash(); - - let authorities = Parachains::authorities(); - let authority_1_index = 0; - let authority_2_index = 1; - let key_1 = extract_key(authorities[authority_1_index].clone()); - let key_2 = extract_key(authorities[authority_2_index].clone()); - - let statement_candidate = Statement::Candidate(candidate_hash.clone()); - let statement_valid = Statement::Valid(candidate_hash.clone()); - - let signing_context = Parachains::signing_context(); - let payload_1 = localized_payload(statement_candidate.clone(), &signing_context); - let payload_2 = localized_payload(statement_valid.clone(), &signing_context); - - let signature_1 = key_1.sign(&payload_1[..]).into(); - let signature_2 = key_2.sign(&payload_2[..]).into(); - - let encoded_key = key_1.encode(); - let proof = Historical::prove((PARACHAIN_KEY_TYPE_ID, &encoded_key[..])).unwrap(); - - let report = DoubleVoteReport { - identity: ValidatorId::from(key_1.public()), - first: (statement_candidate, signature_1), - second: (statement_valid, signature_2), - proof, - signing_context, - }; - - assert_eq!( - report_double_vote(report.clone()), - Err(TransactionValidityError::Invalid( - InvalidTransaction::Custom(DoubleVoteValidityError::InvalidSignature as u8) - ) - ), - ); - }); - } - - #[test] - fn double_vote_proof_session_mismatch_fails() { - let parachains = vec![ - (1u32.into(), vec![].into(), vec![].into()), - ]; - - let extract_key = |public: ValidatorId| { - let mut raw_public = [0; 32]; - raw_public.copy_from_slice(public.as_ref()); - Sr25519Keyring::from_raw_public(raw_public).unwrap() - }; - - // Test that submitting a report with a session mismatch between the `parent_hash` - // and the proof itself fails. - new_test_ext(parachains.clone()).execute_with(|| { - assert_eq!(Staking::current_era(), Some(0)); - assert_eq!(Session::current_index(), 0); - - start_era(1); - - let candidate = raw_candidate(1.into()).abridge().0; - let candidate_hash = candidate.hash(); - - let authorities = Parachains::authorities(); - let authority_index = 0; - let key = extract_key(authorities[authority_index].clone()); - - let statement_candidate = Statement::Candidate(candidate_hash.clone()); - let statement_valid = Statement::Valid(candidate_hash.clone()); - let parent_hash = System::parent_hash(); - - let signing_context = SigningContext { - session_index: Session::current_index() - 1, - parent_hash, - }; - let payload_1 = localized_payload(statement_candidate.clone(), &signing_context); - let payload_2 = localized_payload(statement_valid.clone(), &signing_context); - - let signature_1 = key.sign(&payload_1[..]).into(); - let signature_2 = key.sign(&payload_2[..]).into(); - - // Check that in the beginning the genesis balances are there. - for i in 0..authorities.len() { - assert_eq!(Balances::total_balance(&(i as u64)), 10_000_000); - assert_eq!(Staking::slashable_balance_of(&(i as u64)), 10_000); - - assert_eq!( - Staking::eras_stakers(1, i as u64), - pallet_staking::Exposure { - total: 10_000, - own: 10_000, - others: vec![], - }, - ); - } - - // Get the proof from another session. - start_era(2); - let encoded_key = key.encode(); - let proof = Historical::prove((PARACHAIN_KEY_TYPE_ID, &encoded_key[..])).unwrap(); - - let report = DoubleVoteReport { - identity: ValidatorId::from(key.public()), - first: (statement_candidate, signature_1), - second: (statement_valid, signature_2), - proof, - signing_context, - }; - - assert!(report_double_vote(report.clone()).is_err()); - - start_era(3); - - // Check that the balances are unchanged. - for i in 0..authorities.len() { - assert_eq!(Balances::total_balance(&(i as u64)), 10_000_000); - assert_eq!(Staking::slashable_balance_of(&(i as u64)), 10_000); - - assert_eq!( - Staking::eras_stakers(1, i as u64), - pallet_staking::Exposure { - total: 10_000, - own: 10_000, - others: vec![], - }, - ); - } - }); - } - - #[test] - fn downward_message_removal_works() { - let id = ParaId::from(0); - - // That the list of egress queue roots is in ascending order by `ParaId`. - let parachains = vec![ - (id, vec![].into(), vec![].into()), - ]; - - new_test_ext(parachains).execute_with(|| { - run_to_block(2); - - DownwardMessageQueue::::insert( - &id, - vec![ - DownwardMessage::Opaque(vec![1]), - DownwardMessage::Opaque(vec![2]), - DownwardMessage::Opaque(vec![3]) - ] - ); - - let mut raw_candidate = raw_candidate(id); - raw_candidate.commitments.processed_downward_messages = 2; - - let candidate = make_blank_attested(raw_candidate); - let mut candidates = vec![candidate]; - candidates.iter_mut().for_each(make_attestations); - - assert_ok!(Parachains::set_heads(Origin::none(), candidates)); - assert_eq!( - vec![DownwardMessage::Opaque(vec![3])], - DownwardMessageQueue::::get(&id), - ); - }); - } -} diff --git a/runtime/common/src/registrar.rs b/runtime/common/src/registrar.rs deleted file mode 100644 index eeb4552fee..0000000000 --- a/runtime/common/src/registrar.rs +++ /dev/null @@ -1,1637 +0,0 @@ -// Copyright 2017-2020 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 . - -//! Module to handle which parachains/parathreads (collectively referred to as "paras") are -//! registered and which are scheduled. Doesn't manage any of the actual execution/validation logic -//! which is left to `parachains.rs`. - -use sp_std::{prelude::*, result}; -#[cfg(any(feature = "std", test))] -use sp_std::marker::PhantomData; -use codec::{Encode, Decode}; - -use sp_runtime::{ - transaction_validity::{TransactionValidityError, ValidTransaction, TransactionValidity}, - traits::{Hash as HashT, SignedExtension, DispatchInfoOf}, -}; - -use frame_support::{ - decl_storage, decl_module, decl_event, decl_error, ensure, - dispatch::{DispatchResult, IsSubType}, traits::{Get, Currency, ReservableCurrency}, - weights::{DispatchClass, Weight}, -}; -use frame_system::{self, ensure_root, ensure_signed}; -use primitives::v0::{ - Id as ParaId, CollatorId, Scheduling, LOWEST_USER_ID, SwapAux, Info as ParaInfo, ActiveParas, - Retriable, ValidationCode, HeadData, -}; -use crate::parachains; -use sp_runtime::transaction_validity::InvalidTransaction; - -/// Parachain registration API. -pub trait Registrar { - /// Create a new unique parachain identity for later registration. - fn new_id() -> ParaId; - - /// Checks whether the given initial head data size falls within the limit. - fn head_data_size_allowed(head_data_size: u32) -> bool; - - /// Checks whether the given validation code falls within the limit. - fn code_size_allowed(code_size: u32) -> bool; - - /// Fetches metadata for a para by ID, if any. - fn para_info(id: ParaId) -> Option; - - /// Register a parachain with given `code` and `initial_head_data`. `id` must not yet be registered or it will - /// result in a error. - /// - /// This does not enforce any code size or initial head data limits, as these - /// are governable and parameters for parachain initialization are often - /// determined long ahead-of-time. Not checking these values ensures that changes to limits - /// do not invalidate in-progress auction winners. - fn register_para( - id: ParaId, - info: ParaInfo, - code: ValidationCode, - initial_head_data: HeadData, - ) -> DispatchResult; - - /// Deregister a parachain with given `id`. If `id` is not currently registered, an error is returned. - fn deregister_para(id: ParaId) -> DispatchResult; -} - -impl Registrar for Module { - fn new_id() -> ParaId { - ::mutate(|n| { let r = *n; *n = ParaId::from(u32::from(*n) + 1); r }) - } - - fn head_data_size_allowed(head_data_size: u32) -> bool { - head_data_size <= ::MaxHeadDataSize::get() - } - - fn code_size_allowed(code_size: u32) -> bool { - code_size <= ::MaxCodeSize::get() - } - - fn para_info(id: ParaId) -> Option { - Self::paras(&id) - } - - fn register_para( - id: ParaId, - info: ParaInfo, - code: ValidationCode, - initial_head_data: HeadData, - ) -> DispatchResult { - ensure!(!Paras::contains_key(id), Error::::ParaAlreadyExists); - if let Scheduling::Always = info.scheduling { - Parachains::mutate(|parachains| - match parachains.binary_search(&id) { - Ok(_) => Err(Error::::ParaAlreadyExists), - Err(idx) => { - parachains.insert(idx, id); - Ok(()) - } - } - )?; - } - >::initialize_para(id, code, initial_head_data); - Paras::insert(id, info); - Ok(()) - } - - fn deregister_para(id: ParaId) -> DispatchResult { - let info = Paras::take(id).ok_or(Error::::InvalidChainId)?; - if let Scheduling::Always = info.scheduling { - Parachains::mutate(|parachains| - parachains.binary_search(&id) - .map(|index| parachains.remove(index)) - .map_err(|_| Error::::InvalidChainId) - )?; - } - >::cleanup_para(id); - Paras::remove(id); - Ok(()) - } -} - -type BalanceOf = - <::Currency as Currency<::AccountId>>::Balance; - -pub trait Trait: parachains::Trait { - /// The overarching event type. - type Event: From + Into<::Event>; - - /// The aggregated origin type must support the parachains origin. We require that we can - /// infallibly convert between this origin and the system origin, but in reality, they're the - /// same type, we just can't express that to the Rust type system without writing a `where` - /// clause everywhere. - type Origin: From<::Origin> - + Into::Origin>>; - - /// The system's currency for parathread payment. - type Currency: ReservableCurrency; - - /// The deposit to be paid to run a parathread. - type ParathreadDeposit: Get>; - - /// Handler for when two ParaIds are swapped. - type SwapAux: SwapAux; - - /// The number of items in the parathread queue, aka the number of blocks in advance to schedule - /// parachain execution. - type QueueSize: Get; - - /// The number of rotations that you will have as grace if you miss a block. - type MaxRetries: Get; -} - -decl_storage! { - trait Store for Module as Registrar { - // Vector of all parachain IDs, in ascending order. - Parachains: Vec; - - /// The number of threads to schedule per block. - ThreadCount: u32; - - /// An array of the queue of set of threads scheduled for the coming blocks; ordered by - /// ascending para ID. There can be no duplicates of para ID in each list item. - SelectedThreads: Vec>; - - /// Parathreads/chains scheduled for execution this block. If the collator ID is set, then - /// a particular collator has already been chosen for the next block, and no other collator - /// may provide the block. In this case we allow the possibility of the combination being - /// retried in a later block, expressed by `Retriable`. - /// - /// Ordered by ParaId. - Active: Vec<(ParaId, Option<(CollatorId, Retriable)>)>; - - /// The next unused ParaId value. Start this high in order to keep low numbers for - /// system-level chains. - NextFreeId: ParaId = LOWEST_USER_ID; - - /// Pending swap operations. - PendingSwap: map hasher(twox_64_concat) ParaId => Option; - - /// Map of all registered parathreads/chains. - Paras get(fn paras): map hasher(twox_64_concat) ParaId => Option; - - /// The current queue for parathreads that should be retried. - RetryQueue get(fn retry_queue): Vec>; - - /// Users who have paid a parathread's deposit - Debtors: map hasher(twox_64_concat) ParaId => T::AccountId; - } - add_extra_genesis { - config(parachains): Vec<(ParaId, ValidationCode, HeadData)>; - config(_phdata): PhantomData; - build(build::); - } -} - -#[cfg(feature = "std")] -fn build(config: &GenesisConfig) { - let mut p = config.parachains.clone(); - p.sort_by_key(|&(ref id, _, _)| *id); - p.dedup_by_key(|&mut (ref id, _, _)| *id); - - let only_ids: Vec = p.iter().map(|&(ref id, _, _)| id).cloned().collect(); - - Parachains::put(&only_ids); - - for (id, code, genesis) in p { - Paras::insert(id, &primitives::v0::PARACHAIN_INFO); - // no ingress -- a chain cannot be routed to until it is live. - ::insert(&id, &code); - ::insert(&id, &genesis); - // Save initial parachains in registrar - Paras::insert(id, ParaInfo { scheduling: Scheduling::Always }) - } -} - -/// Swap the existence of two items, provided by value, within an ordered list. -/// -/// If neither item exists, or if both items exist this will do nothing. If exactly one of the -/// items exists, then it will be removed and the other inserted. -pub fn swap_ordered_existence(ids: &mut [T], one: T, other: T) { - let maybe_one_pos = ids.binary_search(&one); - let maybe_other_pos = ids.binary_search(&other); - match (maybe_one_pos, maybe_other_pos) { - (Ok(one_pos), Err(_)) => ids[one_pos] = other, - (Err(_), Ok(other_pos)) => ids[other_pos] = one, - _ => return, - }; - ids.sort(); -} - -decl_error! { - pub enum Error for Module { - /// Parachain already exists. - ParaAlreadyExists, - /// Invalid parachain ID. - InvalidChainId, - /// Invalid parathread ID. - InvalidThreadId, - /// Invalid para code size. - CodeTooLarge, - /// Invalid para head data size. - HeadDataTooLarge, - } -} - -decl_module! { - /// Parachains module. - pub struct Module for enum Call where origin: ::Origin { - type Error = Error; - - fn deposit_event() = default; - - /// Register a parachain with given code. Must be called by root. - /// Fails if given ID is already used. - /// - /// Unlike the `Registrar` trait function of the same name, this - /// checks the code and head data against size limits. - #[weight = (5_000_000_000, DispatchClass::Operational)] - pub fn register_para(origin, - #[compact] id: ParaId, - info: ParaInfo, - code: ValidationCode, - initial_head_data: HeadData, - ) -> DispatchResult { - ensure_root(origin)?; - - ensure!( - >::code_size_allowed(code.0.len() as _), - Error::::CodeTooLarge, - ); - - ensure!( - >::head_data_size_allowed( - initial_head_data.0.len() as _ - ), - Error::::HeadDataTooLarge, - ); - >:: - register_para(id, info, code, initial_head_data) - } - - /// Deregister a parachain with given id - #[weight = (10_000_000, DispatchClass::Operational)] - pub fn deregister_para(origin, #[compact] id: ParaId) -> DispatchResult { - ensure_root(origin)?; - >::deregister_para(id) - } - - /// Reset the number of parathreads that can pay to be scheduled in a single block. - /// - /// - `count`: The number of parathreads. - /// - /// Must be called from Root origin. - #[weight = 0] - fn set_thread_count(origin, count: u32) { - ensure_root(origin)?; - ThreadCount::put(count); - } - - /// Register a parathread for immediate use. - /// - /// Must be sent from a Signed origin that is able to have ParathreadDeposit reserved. - /// `code` and `initial_head_data` are used to initialize the parathread's state. - /// - /// Unlike `register_para`, this function does check that the maximum code size - /// and head data size are respected, as parathread registration is an atomic - /// action. - #[weight = 0] - fn register_parathread(origin, - code: ValidationCode, - initial_head_data: HeadData, - ) { - let who = ensure_signed(origin)?; - - ::Currency::reserve(&who, T::ParathreadDeposit::get())?; - - let info = ParaInfo { - scheduling: Scheduling::Dynamic, - }; - - ensure!( - >::code_size_allowed(code.0.len() as _), - Error::::CodeTooLarge, - ); - - ensure!( - >::head_data_size_allowed( - initial_head_data.0.len() as _ - ), - Error::::HeadDataTooLarge, - ); - - let id = >::new_id(); - - let _ = >:: - register_para(id, info, code, initial_head_data); - - >::insert(id, who); - - Self::deposit_event(Event::ParathreadRegistered(id)); - } - - /// Place a bid for a parathread to be progressed in the next block. - /// - /// This is a kind of special transaction that should be heavily prioritized in the - /// transaction pool according to the `value`; only `ThreadCount` of them may be presented - /// in any single block. - #[weight = 0] - fn select_parathread(origin, - #[compact] _id: ParaId, - _collator: CollatorId, - _head_hash: T::Hash, - ) { - ensure_signed(origin)?; - // Everything else is checked for in the transaction `SignedExtension`. - } - - /// Deregister a parathread and retrieve the deposit. - /// - /// Must be sent from a `Parachain` origin which is currently a parathread. - /// - /// Ensure that before calling this that any funds you want emptied from the parathread's - /// account is moved out; after this it will be impossible to retrieve them (without - /// governance intervention). - #[weight = 0] - fn deregister_parathread(origin) { - let id = parachains::ensure_parachain(::Origin::from(origin))?; - - let info = Paras::get(id).ok_or(Error::::InvalidChainId)?; - if let Scheduling::Dynamic = info.scheduling {} else { Err(Error::::InvalidThreadId)? } - - >::deregister_para(id)?; - Self::force_unschedule(|i| i == id); - - let debtor = >::take(id); - let _ = ::Currency::unreserve(&debtor, T::ParathreadDeposit::get()); - - Self::deposit_event(Event::ParathreadRegistered(id)); - } - - /// Swap a parachain with another parachain or parathread. The origin must be a `Parachain`. - /// The swap will happen only if there is already an opposite swap pending. If there is not, - /// the swap will be stored in the pending swaps map, ready for a later confirmatory swap. - /// - /// The `ParaId`s remain mapped to the same head data and code so external code can rely on - /// `ParaId` to be a long-term identifier of a notional "parachain". However, their - /// scheduling info (i.e. whether they're a parathread or parachain), auction information - /// and the auction deposit are switched. - #[weight = 0] - fn swap(origin, #[compact] other: ParaId) { - let id = parachains::ensure_parachain(::Origin::from(origin))?; - - if PendingSwap::get(other) == Some(id) { - // actually do the swap. - T::SwapAux::ensure_can_swap(id, other)?; - - // Remove intention to swap. - PendingSwap::remove(other); - Self::force_unschedule(|i| i == id || i == other); - Parachains::mutate(|ids| swap_ordered_existence(ids, id, other)); - Paras::mutate(id, |i| - Paras::mutate(other, |j| - sp_std::mem::swap(i, j) - ) - ); - - >::mutate(id, |i| - >::mutate(other, |j| - sp_std::mem::swap(i, j) - ) - ); - let _ = T::SwapAux::on_swap(id, other); - } else { - PendingSwap::insert(id, other); - } - } - - /// Block initializer. Clears SelectedThreads and constructs/replaces Active. - fn on_initialize() -> Weight { - let next_up = SelectedThreads::mutate(|t| { - let r = if t.len() >= T::QueueSize::get() { - // Take the first set of parathreads in queue - t.remove(0) - } else { - vec![] - }; - while t.len() < T::QueueSize::get() { - t.push(vec![]); - } - r - }); - // mutable so that we can replace with `None` if parathread appears in new schedule. - let mut retrying = Self::take_next_retry(); - if let Some(((para, _), _)) = retrying { - // this isn't really ideal: better would be if there were an earlier pass that set - // retrying to the first item in the Missed queue that isn't already scheduled, but - // this is potentially O(m*n) in terms of missed queue size and parathread pool size. - if next_up.iter().any(|x| x.0 == para) { - retrying = None - } - } - - let mut paras = Parachains::get().into_iter() - .map(|id| (id, None)) - .chain(next_up.into_iter() - .map(|(para, collator)| - (para, Some((collator, Retriable::WithRetries(0)))) - ) - ).chain(retrying.into_iter() - .map(|((para, collator), retries)| - (para, Some((collator, Retriable::WithRetries(retries + 1)))) - ) - ).collect::>(); - // for Rust's timsort algorithm, sorting a concatenation of two sorted ranges is near - // O(N). - paras.sort_by_key(|&(ref id, _)| *id); - - Active::put(paras); - - 0 - } - - fn on_finalize() { - // a block without this will panic, but let's not panic here. - if let Some(proceeded_vec) = parachains::DidUpdate::get() { - // Active is sorted and DidUpdate is a sorted subset of its elements. - // - // We just go through the contents of active and find any items that don't appear in - // DidUpdate *and* which are enabled for retry. - let mut proceeded = proceeded_vec.into_iter(); - let mut i = proceeded.next(); - for sched in Active::get().into_iter() { - match i { - // Scheduled parachain proceeded properly. Move onto next item. - Some(para) if para == sched.0 => i = proceeded.next(), - // Scheduled `sched` missed their block. - // Queue for retry if it's allowed. - _ => if let (i, Some((c, Retriable::WithRetries(n)))) = sched { - Self::retry_later((i, c), n) - }, - } - } - } - } - } -} - -decl_event!{ - pub enum Event { - /// A parathread was registered; its new ID is supplied. - ParathreadRegistered(ParaId), - - /// The parathread of the supplied ID was de-registered. - ParathreadDeregistered(ParaId), - } -} - -impl Module { - /// Ensures that the given `ParaId` corresponds to a registered parathread, and returns a descriptor if so. - pub fn ensure_thread_id(id: ParaId) -> Option { - Paras::get(id).and_then(|info| if let Scheduling::Dynamic = info.scheduling { - Some(info) - } else { - None - }) - } - - fn retry_later(sched: (ParaId, CollatorId), retries: u32) { - if retries < T::MaxRetries::get() { - RetryQueue::mutate(|q| { - q.resize(T::MaxRetries::get() as usize, vec![]); - q[retries as usize].push(sched); - }); - } - } - - fn take_next_retry() -> Option<((ParaId, CollatorId), u32)> { - RetryQueue::mutate(|q| { - for (i, q) in q.iter_mut().enumerate() { - if !q.is_empty() { - return Some((q.remove(0), i as u32)); - } - } - None - }) - } - - /// Forcibly remove the threads matching `m` from all current and future scheduling. - fn force_unschedule(m: impl Fn(ParaId) -> bool) { - RetryQueue::mutate(|qs| for q in qs.iter_mut() { - q.retain(|i| !m(i.0)) - }); - SelectedThreads::mutate(|qs| for q in qs.iter_mut() { - q.retain(|i| !m(i.0)) - }); - Active::mutate(|a| for i in a.iter_mut() { - if m(i.0) { - if let Some((_, ref mut r)) = i.1 { - *r = Retriable::Never; - } - } - }); - } -} - -impl ActiveParas for Module { - fn active_paras() -> Vec<(ParaId, Option<(CollatorId, Retriable)>)> { - Active::get() - } -} - -/// Ensure that parathread selections happen prioritized by fees. -#[derive(Encode, Decode, Clone, Eq, PartialEq)] -pub struct LimitParathreadCommits(sp_std::marker::PhantomData) where - ::Call: IsSubType>; - -impl LimitParathreadCommits where - ::Call: IsSubType> -{ - /// Create a new `LimitParathreadCommits` struct. - pub fn new() -> Self { - LimitParathreadCommits(sp_std::marker::PhantomData) - } -} - -impl sp_std::fmt::Debug for LimitParathreadCommits where - ::Call: IsSubType> -{ - fn fmt(&self, f: &mut sp_std::fmt::Formatter) -> sp_std::fmt::Result { - write!(f, "LimitParathreadCommits") - } -} - -/// Custom validity errors used in Polkadot while validating transactions. -#[repr(u8)] -pub enum ValidityError { - /// Parathread ID has already been submitted for this block. - Duplicate = 0, - /// Parathread ID does not identify a parathread. - InvalidId = 1, -} - -impl SignedExtension for LimitParathreadCommits where - ::Call: IsSubType> -{ - const IDENTIFIER: &'static str = "LimitParathreadCommits"; - type AccountId = T::AccountId; - type Call = ::Call; - type AdditionalSigned = (); - type Pre = (); - - fn additional_signed(&self) - -> sp_std::result::Result - { - Ok(()) - } - - fn validate( - &self, - _who: &Self::AccountId, - call: &Self::Call, - _info: &DispatchInfoOf, - _len: usize, - ) -> TransactionValidity { - let mut r = ValidTransaction::default(); - if let Some(local_call) = call.is_sub_type() { - if let Call::select_parathread(id, collator, hash) = local_call { - // ensure that the para ID is actually a parathread. - let e = TransactionValidityError::from(InvalidTransaction::Custom(ValidityError::InvalidId as u8)); - >::ensure_thread_id(*id).ok_or(e)?; - - // ensure that we haven't already had a full complement of selected parathreads. - let mut upcoming_selected_threads = SelectedThreads::get(); - if upcoming_selected_threads.is_empty() { - upcoming_selected_threads.push(vec![]); - } - let i = upcoming_selected_threads.len() - 1; - let selected_threads = &mut upcoming_selected_threads[i]; - let thread_count = ThreadCount::get() as usize; - ensure!( - selected_threads.len() < thread_count, - InvalidTransaction::ExhaustsResources, - ); - - // ensure that this is not selecting a duplicate parathread ID - let e = TransactionValidityError::from(InvalidTransaction::Custom(ValidityError::Duplicate as u8)); - let pos = selected_threads - .binary_search_by(|&(ref other_id, _)| other_id.cmp(id)) - .err() - .ok_or(e)?; - - // ensure that this is a live bid (i.e. that the thread's chain head matches) - let e = TransactionValidityError::from(InvalidTransaction::Custom(ValidityError::InvalidId as u8)); - let head = >::parachain_head(id).ok_or(e)?; - let actual = T::Hashing::hash(&head.0); - ensure!(&actual == hash, InvalidTransaction::Stale); - - // updated the selected threads. - selected_threads.insert(pos, (*id, collator.clone())); - sp_std::mem::drop(selected_threads); - SelectedThreads::put(upcoming_selected_threads); - - // provides the state-transition for this head-data-hash; this should cue the pool - // to throw out competing transactions with lesser fees. - r.provides = vec![hash.encode()]; - } - } - Ok(r) - } -} - -#[cfg(test)] -mod tests { - use super::*; - use bitvec::vec::BitVec; - use sp_io::TestExternalities; - use sp_core::{H256, Pair}; - use sp_runtime::{ - traits::{ - BlakeTwo256, IdentityLookup, Dispatchable, - AccountIdConversion, Extrinsic as ExtrinsicT, - }, testing::{UintAuthorityId, TestXt}, KeyTypeId, Perbill, curve::PiecewiseLinear, - }; - use primitives::v0::{ - ValidatorId, Info as ParaInfo, Scheduling, LOWEST_USER_ID, AttestedCandidate, - CandidateReceipt, HeadData, ValidityAttestation, CompactStatement as Statement, Chain, - CollatorPair, CandidateCommitments, - Balance, BlockNumber, Header, Signature, - }; - use frame_support::{ - traits::{KeyOwnerProofSystem, OnInitialize, OnFinalize}, - impl_outer_origin, impl_outer_dispatch, assert_ok, parameter_types, assert_noop, - weights::DispatchInfo, - }; - use keyring::Sr25519Keyring; - - use crate::parachains; - use crate::slots; - use crate::attestations; - - impl_outer_origin! { - pub enum Origin for Test { - parachains, - } - } - - impl_outer_dispatch! { - pub enum Call for Test where origin: Origin { - parachains::Parachains, - registrar::Registrar, - staking::Staking, - } - } - - pallet_staking_reward_curve::build! { - const REWARD_CURVE: PiecewiseLinear<'static> = curve!( - min_inflation: 0_025_000, - max_inflation: 0_100_000, - ideal_stake: 0_500_000, - falloff: 0_050_000, - max_piece_count: 40, - test_precision: 0_005_000, - ); - } - - #[derive(Clone, Eq, PartialEq)] - pub struct Test; - parameter_types! { - pub const BlockHashCount: u32 = 250; - pub const MaximumBlockWeight: u32 = 4 * 1024 * 1024; - pub const MaximumBlockLength: u32 = 4 * 1024 * 1024; - pub const AvailableBlockRatio: Perbill = Perbill::from_percent(75); - } - impl frame_system::Trait for Test { - type BaseCallFilter = (); - type Origin = Origin; - type Call = Call; - type Index = u64; - type BlockNumber = BlockNumber; - type Hash = H256; - type Hashing = BlakeTwo256; - type AccountId = u64; - type Lookup = IdentityLookup; - type Header = Header; - type Event = (); - type BlockHashCount = BlockHashCount; - type MaximumBlockWeight = MaximumBlockWeight; - type DbWeight = (); - type BlockExecutionWeight = (); - type ExtrinsicBaseWeight = (); - type MaximumExtrinsicWeight = MaximumBlockWeight; - type MaximumBlockLength = MaximumBlockLength; - type AvailableBlockRatio = AvailableBlockRatio; - type Version = (); - type ModuleToIndex = (); - type AccountData = pallet_balances::AccountData; - type OnNewAccount = (); - type OnKilledAccount = Balances; - type SystemWeightInfo = (); - } - - impl frame_system::offchain::SendTransactionTypes for Test where - Call: From, - { - type OverarchingCall = Call; - type Extrinsic = TestXt; - } - - parameter_types! { - pub const ExistentialDeposit: Balance = 1; - } - - impl pallet_balances::Trait for Test { - type Balance = u128; - type DustRemoval = (); - type Event = (); - type ExistentialDeposit = ExistentialDeposit; - type AccountStore = System; - type WeightInfo = (); - } - - parameter_types!{ - pub const LeasePeriod: BlockNumber = 10; - pub const EndingPeriod: BlockNumber = 3; - } - - impl slots::Trait for Test { - type Event = (); - type Currency = pallet_balances::Module; - type Parachains = Registrar; - type EndingPeriod = EndingPeriod; - type LeasePeriod = LeasePeriod; - type Randomness = RandomnessCollectiveFlip; - } - - parameter_types!{ - pub const SlashDeferDuration: pallet_staking::EraIndex = 7; - pub const AttestationPeriod: BlockNumber = 100; - pub const MinimumPeriod: u64 = 3; - pub const SessionsPerEra: sp_staking::SessionIndex = 6; - pub const BondingDuration: pallet_staking::EraIndex = 28; - pub const MaxNominatorRewardedPerValidator: u32 = 64; - } - - impl attestations::Trait for Test { - type AttestationPeriod = AttestationPeriod; - type ValidatorIdentities = parachains::ValidatorIdentities; - type RewardAttestation = (); - } - - parameter_types! { - pub const Period: BlockNumber = 1; - pub const Offset: BlockNumber = 0; - pub const DisabledValidatorsThreshold: Perbill = Perbill::from_percent(17); - pub const RewardCurve: &'static PiecewiseLinear<'static> = &REWARD_CURVE; - } - - impl pallet_session::Trait for Test { - type SessionManager = (); - type Keys = UintAuthorityId; - type ShouldEndSession = pallet_session::PeriodicSessions; - type NextSessionRotation = pallet_session::PeriodicSessions; - type SessionHandler = pallet_session::TestSessionHandler; - type Event = (); - type ValidatorId = u64; - type ValidatorIdOf = (); - type DisabledValidatorsThreshold = DisabledValidatorsThreshold; - type WeightInfo = (); - } - - parameter_types! { - pub const MaxHeadDataSize: u32 = 100; - pub const MaxCodeSize: u32 = 100; - - pub const ValidationUpgradeFrequency: BlockNumber = 10; - pub const ValidationUpgradeDelay: BlockNumber = 2; - pub const SlashPeriod: BlockNumber = 50; - pub const ElectionLookahead: BlockNumber = 0; - pub const StakingUnsignedPriority: u64 = u64::max_value() / 2; - } - - impl pallet_staking::Trait for Test { - type RewardRemainder = (); - type CurrencyToVote = (); - type Event = (); - type Currency = pallet_balances::Module; - type Slash = (); - type Reward = (); - type SessionsPerEra = SessionsPerEra; - type BondingDuration = BondingDuration; - type SlashDeferDuration = SlashDeferDuration; - type SlashCancelOrigin = frame_system::EnsureRoot; - type SessionInterface = Self; - type UnixTime = pallet_timestamp::Module; - type RewardCurve = RewardCurve; - type MaxNominatorRewardedPerValidator = MaxNominatorRewardedPerValidator; - type NextNewSession = Session; - type ElectionLookahead = ElectionLookahead; - type Call = Call; - type UnsignedPriority = StakingUnsignedPriority; - type MaxIterations = (); - type MinSolutionScoreBump = (); - type WeightInfo = (); - } - - impl pallet_timestamp::Trait for Test { - type Moment = u64; - type OnTimestampSet = (); - type MinimumPeriod = MinimumPeriod; - type WeightInfo = (); - } - - impl pallet_session::historical::Trait for Test { - type FullIdentification = pallet_staking::Exposure; - type FullIdentificationOf = pallet_staking::ExposureOf; - } - - // This is needed for a custom `AccountId` type which is `u64` in testing here. - pub mod test_keys { - use sp_core::{crypto::KeyTypeId, sr25519}; - use primitives::v0::Signature; - - pub const KEY_TYPE: KeyTypeId = KeyTypeId(*b"test"); - - mod app { - use super::super::Parachains; - use sp_application_crypto::{app_crypto, sr25519}; - - app_crypto!(sr25519, super::KEY_TYPE); - - impl sp_runtime::traits::IdentifyAccount for Public { - type AccountId = u64; - - fn into_account(self) -> Self::AccountId { - let id = self.0.clone().into(); - Parachains::authorities().iter().position(|b| *b == id).unwrap() as u64 - } - } - } - - pub type ReporterId = app::Public; - pub struct ReporterAuthorityId; - impl frame_system::offchain::AppCrypto for ReporterAuthorityId { - type RuntimeAppPublic = ReporterId; - type GenericSignature = sr25519::Signature; - type GenericPublic = sr25519::Public; - } - } - - impl parachains::Trait for Test { - type AuthorityId = test_keys::ReporterAuthorityId; - type Origin = Origin; - type Call = Call; - type ParachainCurrency = pallet_balances::Module; - type BlockNumberConversion = sp_runtime::traits::Identity; - type ActiveParachains = Registrar; - type Registrar = Registrar; - type Randomness = RandomnessCollectiveFlip; - type MaxCodeSize = MaxCodeSize; - type MaxHeadDataSize = MaxHeadDataSize; - type ValidationUpgradeFrequency = ValidationUpgradeFrequency; - type ValidationUpgradeDelay = ValidationUpgradeDelay; - type SlashPeriod = SlashPeriod; - type Proof = sp_session::MembershipProof; - type KeyOwnerProofSystem = pallet_session::historical::Module; - type IdentificationTuple = , - )>>::IdentificationTuple; - type ReportOffence = (); - type BlockHashConversion = sp_runtime::traits::Identity; - } - - type Extrinsic = TestXt; - - impl frame_system::offchain::CreateSignedTransaction for Test where - Call: From, - { - fn create_transaction>( - call: Call, - _public: test_keys::ReporterId, - _account: ::AccountId, - nonce: ::Index, - ) -> Option<(Call, ::SignaturePayload)> { - Some((call, (nonce, ()))) - } - } - - impl frame_system::offchain::SigningTypes for Test { - type Public = test_keys::ReporterId; - type Signature = Signature; - } - - parameter_types! { - pub const ParathreadDeposit: Balance = 10; - pub const QueueSize: usize = 2; - pub const MaxRetries: u32 = 3; - } - - impl Trait for Test { - type Event = (); - type Origin = Origin; - type Currency = pallet_balances::Module; - type ParathreadDeposit = ParathreadDeposit; - type SwapAux = slots::Module; - type QueueSize = QueueSize; - type MaxRetries = MaxRetries; - } - - type Balances = pallet_balances::Module; - type Parachains = parachains::Module; - type System = frame_system::Module; - type Slots = slots::Module; - type Registrar = Module; - type RandomnessCollectiveFlip = pallet_randomness_collective_flip::Module; - type Session = pallet_session::Module; - type Staking = pallet_staking::Module; - - const AUTHORITY_KEYS: [Sr25519Keyring; 8] = [ - Sr25519Keyring::Alice, - Sr25519Keyring::Bob, - Sr25519Keyring::Charlie, - Sr25519Keyring::Dave, - Sr25519Keyring::Eve, - Sr25519Keyring::Ferdie, - Sr25519Keyring::One, - Sr25519Keyring::Two, - ]; - - fn new_test_ext(parachains: Vec<(ParaId, ValidationCode, HeadData)>) -> TestExternalities { - let mut t = frame_system::GenesisConfig::default().build_storage::().unwrap(); - - let authority_keys = [ - Sr25519Keyring::Alice, - Sr25519Keyring::Bob, - Sr25519Keyring::Charlie, - Sr25519Keyring::Dave, - Sr25519Keyring::Eve, - Sr25519Keyring::Ferdie, - Sr25519Keyring::One, - Sr25519Keyring::Two, - ]; - - // stashes are the index. - let session_keys: Vec<_> = authority_keys.iter().enumerate() - .map(|(i, _k)| (i as u64, i as u64, UintAuthorityId(i as u64))) - .collect(); - - let authorities: Vec<_> = authority_keys.iter().map(|k| ValidatorId::from(k.public())).collect(); - - let balances: Vec<_> = (0..authority_keys.len()).map(|i| (i as u64, 10_000_000)).collect(); - - parachains::GenesisConfig { - authorities: authorities.clone(), - }.assimilate_storage::(&mut t).unwrap(); - - GenesisConfig:: { - parachains, - _phdata: Default::default(), - }.assimilate_storage(&mut t).unwrap(); - - pallet_session::GenesisConfig:: { - keys: session_keys, - }.assimilate_storage(&mut t).unwrap(); - - pallet_balances::GenesisConfig:: { - balances, - }.assimilate_storage(&mut t).unwrap(); - - t.into() - } - - fn init_block() { - println!("Initializing {}", System::block_number()); - System::on_initialize(System::block_number()); - Registrar::on_initialize(System::block_number()); - Parachains::on_initialize(System::block_number()); - Slots::on_initialize(System::block_number()); - } - - fn run_to_block(n: BlockNumber) { - println!("Running until block {}", n); - while System::block_number() < n { - if System::block_number() > 1 { - println!("Finalizing {}", System::block_number()); - if !parachains::DidUpdate::exists() { - println!("Null heads update"); - assert_ok!(Parachains::set_heads(frame_system::RawOrigin::None.into(), vec![])); - } - Slots::on_finalize(System::block_number()); - Parachains::on_finalize(System::block_number()); - Registrar::on_finalize(System::block_number()); - System::on_finalize(System::block_number()); - } - System::set_block_number(System::block_number() + 1); - init_block(); - } - } - - fn schedule_thread(id: ParaId, head_data: &[u8], col: &CollatorId) { - let tx: LimitParathreadCommits = LimitParathreadCommits(Default::default()); - let hdh = BlakeTwo256::hash(head_data); - let inner_call = super::Call::select_parathread(id, col.clone(), hdh); - let call = Call::Registrar(inner_call); - let origin = 4u64; - assert!(tx.validate(&origin, &call, &Default::default(), 0).is_ok()); - assert_ok!(call.dispatch(Origin::signed(origin))); - } - - fn user_id(i: u32) -> ParaId { - LOWEST_USER_ID + i - } - - fn attest(id: ParaId, collator: &CollatorPair, head_data: &[u8], block_data: &[u8]) -> AttestedCandidate { - let pov_block_hash = BlakeTwo256::hash(block_data); - let relay_parent = System::parent_hash(); - let candidate = CandidateReceipt { - parachain_index: id, - relay_parent, - head_data: HeadData(head_data.to_vec()), - collator: collator.public(), - signature: pov_block_hash.using_encoded(|d| collator.sign(d)), - pov_block_hash, - global_validation: Parachains::global_validation_data(), - local_validation: Parachains::current_local_validation_data(&id).unwrap(), - commitments: CandidateCommitments { - fees: 0, - upward_messages: vec![], - erasure_root: [1; 32].into(), - new_validation_code: None, - processed_downward_messages: 0, - }, - }; - let (candidate, _) = candidate.abridge(); - let candidate_hash = candidate.hash(); - let payload = (Statement::Valid(candidate_hash), pallet_session::Module::::current_index(), System::parent_hash()).encode(); - let roster = Parachains::calculate_duty_roster().0.validator_duty; - AttestedCandidate { - candidate, - validity_votes: AUTHORITY_KEYS.iter() - .enumerate() - .filter(|(i, _)| roster[*i] == Chain::Parachain(id)) - .map(|(_, k)| k.sign(&payload).into()) - .map(ValidityAttestation::Explicit) - .collect(), - validator_indices: roster.iter() - .map(|i| i == &Chain::Parachain(id)) - .collect::>(), - } - } - - #[test] - fn basic_setup_works() { - new_test_ext(vec![]).execute_with(|| { - assert_eq!(super::Parachains::get(), vec![]); - assert_eq!(ThreadCount::get(), 0); - assert_eq!(Active::get(), vec![]); - assert_eq!(NextFreeId::get(), LOWEST_USER_ID); - assert_eq!(PendingSwap::get(&ParaId::from(0u32)), None); - assert_eq!(Paras::get(&ParaId::from(0u32)), None); - }); - } - - #[test] - fn genesis_registration_works() { - let parachains = vec![ - (5u32.into(), vec![1,2,3].into(), vec![1].into()), - (100u32.into(), vec![4,5,6].into(), vec![2,].into()), - ]; - - new_test_ext(parachains).execute_with(|| { - // Need to trigger on_initialize - run_to_block(2); - // Genesis registration works - assert_eq!(Registrar::active_paras(), vec![(5u32.into(), None), (100u32.into(), None)]); - assert_eq!( - Registrar::paras(&ParaId::from(5u32)), - Some(ParaInfo { scheduling: Scheduling::Always }), - ); - assert_eq!( - Registrar::paras(&ParaId::from(100u32)), - Some(ParaInfo { scheduling: Scheduling::Always }), - ); - assert_eq!(Parachains::parachain_code(&ParaId::from(5u32)), Some(vec![1, 2, 3].into())); - assert_eq!(Parachains::parachain_code(&ParaId::from(100u32)), Some(vec![4, 5, 6].into())); - }); - } - - #[test] - fn swap_chain_and_thread_works() { - new_test_ext(vec![]).execute_with(|| { - assert_ok!(Registrar::set_thread_count(Origin::root(), 1)); - - // Need to trigger on_initialize - run_to_block(2); - - // Register a new parathread - assert_ok!(Registrar::register_parathread( - Origin::signed(1u64), - vec![1; 3].into(), - vec![1; 3].into(), - )); - - // Lease out a new parachain - assert_ok!(Slots::new_auction(Origin::root(), 5, 1)); - assert_ok!(Slots::bid(Origin::signed(1), 0, 1, 1, 4, 1)); - - run_to_block(9); - // Ensure that the thread is scheduled around the swap time. - let col = Sr25519Keyring::One.public().into(); - schedule_thread(user_id(0), &[1; 3], &col); - - run_to_block(10); - let h = BlakeTwo256::hash(&[2u8; 3]); - assert_ok!(Slots::fix_deploy_data(Origin::signed(1), 0, user_id(1), h, 3, vec![2; 3].into())); - assert_ok!(Slots::elaborate_deploy_data(Origin::signed(0), user_id(1), vec![2; 3].into())); - assert_ok!(Slots::set_offboarding(Origin::signed(user_id(1).into_account()), 1)); - - run_to_block(11); - // should be one active parachain and one active parathread. - assert_eq!(Registrar::active_paras(), vec![ - (user_id(0), Some((col.clone(), Retriable::WithRetries(0)))), - (user_id(1), None), - ]); - - // One half of the swap call does not actually trigger the swap. - assert_ok!(Registrar::swap(parachains::Origin::Parachain(user_id(0)).into(), user_id(1))); - - // Nothing changes from what was originally registered - assert_eq!(Registrar::paras(&user_id(0)), Some(ParaInfo { scheduling: Scheduling::Dynamic })); - assert_eq!(Registrar::paras(&user_id(1)), Some(ParaInfo { scheduling: Scheduling::Always })); - assert_eq!(super::Parachains::get(), vec![user_id(1)]); - assert_eq!(Slots::managed_ids(), vec![user_id(1)]); - assert_eq!(Slots::deposits(user_id(1)), vec![1; 3]); - assert_eq!(Slots::offboarding(user_id(1)), 1); - assert_eq!(Parachains::parachain_code(&user_id(0)), Some(vec![1u8; 3].into())); - assert_eq!(Parachains::parachain_head(&user_id(0)), Some(vec![1u8; 3].into())); - assert_eq!(Parachains::parachain_code(&user_id(1)), Some(vec![2u8; 3].into())); - assert_eq!(Parachains::parachain_head(&user_id(1)), Some(vec![2u8; 3].into())); - // Intention to swap is added - assert_eq!(PendingSwap::get(user_id(0)), Some(user_id(1))); - - // Intention to swap is reciprocated, swap actually happens - assert_ok!(Registrar::swap(parachains::Origin::Parachain(user_id(1)).into(), user_id(0))); - - assert_eq!(Registrar::paras(&user_id(0)), Some(ParaInfo { scheduling: Scheduling::Always })); - assert_eq!(Registrar::paras(&user_id(1)), Some(ParaInfo { scheduling: Scheduling::Dynamic })); - assert_eq!(super::Parachains::get(), vec![user_id(0)]); - assert_eq!(Slots::managed_ids(), vec![user_id(0)]); - assert_eq!(Slots::deposits(user_id(0)), vec![1; 3]); - assert_eq!(Slots::offboarding(user_id(0)), 1); - assert_eq!(Parachains::parachain_code(&user_id(0)), Some(vec![1u8; 3].into())); - assert_eq!(Parachains::parachain_head(&user_id(0)), Some(vec![1u8; 3].into())); - assert_eq!(Parachains::parachain_code(&user_id(1)), Some(vec![2u8; 3].into())); - assert_eq!(Parachains::parachain_head(&user_id(1)), Some(vec![2u8; 3].into())); - - // Intention to swap is no longer present - assert_eq!(PendingSwap::get(user_id(0)), None); - assert_eq!(PendingSwap::get(user_id(1)), None); - - run_to_block(12); - // thread should not be queued or scheduled any more, even though it would otherwise be - // being retried.. - assert_eq!(Registrar::active_paras(), vec![(user_id(0), None)]); - }); - } - - #[test] - fn swap_handles_funds_correctly() { - new_test_ext(vec![]).execute_with(|| { - assert_ok!(Registrar::set_thread_count(Origin::root(), 1)); - - // Need to trigger on_initialize - run_to_block(2); - - let initial_1_balance = Balances::free_balance(1); - let initial_2_balance = Balances::free_balance(2); - - // User 1 register a new parathread - assert_ok!(Registrar::register_parathread( - Origin::signed(1), - vec![1; 3].into(), - vec![1; 3].into(), - )); - - // User 2 leases out a new parachain - assert_ok!(Slots::new_auction(Origin::root(), 5, 1)); - assert_ok!(Slots::bid(Origin::signed(2), 0, 1, 1, 4, 1)); - - run_to_block(9); - - // Swap the parachain and parathread - assert_ok!(Registrar::swap(parachains::Origin::Parachain(user_id(0)).into(), user_id(1))); - assert_ok!(Registrar::swap(parachains::Origin::Parachain(user_id(1)).into(), user_id(0))); - - // Deregister the parathread that was originally a parachain - assert_ok!(Registrar::deregister_parathread(parachains::Origin::Parachain(user_id(1)).into())); - - // Go past when a parachain loses its slot - run_to_block(50); - - // Funds are correctly returned - assert_eq!(Balances::free_balance(1), initial_1_balance); - assert_eq!(Balances::free_balance(2), initial_2_balance); - }); - } - - #[test] - fn register_deregister_chains_works() { - let parachains = vec![ - (1u32.into(), vec![1; 3].into(), vec![1; 3].into()), - ]; - - new_test_ext(parachains).execute_with(|| { - // Need to trigger on_initialize - run_to_block(2); - - // Genesis registration works - assert_eq!(Registrar::active_paras(), vec![(1u32.into(), None)]); - assert_eq!( - Registrar::paras(&ParaId::from(1u32)), - Some(ParaInfo { scheduling: Scheduling::Always }) - ); - assert_eq!(Parachains::parachain_code(&ParaId::from(1u32)), Some(vec![1; 3].into())); - - // Register a new parachain - assert_ok!(Registrar::register_para( - Origin::root(), - 2u32.into(), - ParaInfo { scheduling: Scheduling::Always }, - vec![2; 3].into(), - vec![2; 3].into(), - )); - - let orig_bal = Balances::free_balance(&3u64); - // Register a new parathread - assert_ok!(Registrar::register_parathread( - Origin::signed(3u64), - vec![3; 3].into(), - vec![3; 3].into(), - )); - // deposit should be taken (reserved) - assert_eq!(Balances::free_balance(3u64) + ParathreadDeposit::get(), orig_bal); - assert_eq!(Balances::reserved_balance(3u64), ParathreadDeposit::get()); - - run_to_block(3); - - // New paras are registered - assert_eq!(Registrar::active_paras(), vec![(1u32.into(), None), (2u32.into(), None)]); - assert_eq!( - Registrar::paras(&ParaId::from(2u32)), - Some(ParaInfo { scheduling: Scheduling::Always }) - ); - assert_eq!( - Registrar::paras(&user_id(0)), - Some(ParaInfo { scheduling: Scheduling::Dynamic }) - ); - assert_eq!(Parachains::parachain_code(&ParaId::from(2u32)), Some(vec![2; 3].into())); - assert_eq!(Parachains::parachain_code(&user_id(0)), Some(vec![3; 3].into())); - - assert_ok!(Registrar::deregister_para(Origin::root(), 2u32.into())); - assert_ok!(Registrar::deregister_parathread( - parachains::Origin::Parachain(user_id(0)).into() - )); - // reserved balance should be returned. - assert_eq!(Balances::free_balance(3u64), orig_bal); - assert_eq!(Balances::reserved_balance(3u64), 0); - - run_to_block(4); - - assert_eq!(Registrar::active_paras(), vec![(1u32.into(), None)]); - assert_eq!(Registrar::paras(&ParaId::from(2u32)), None); - assert_eq!(Parachains::parachain_code(&ParaId::from(2u32)), None); - assert_eq!(Registrar::paras(&user_id(0)), None); - assert_eq!(Parachains::parachain_code(&user_id(0)), None); - }); - } - - #[test] - fn parathread_scheduling_works() { - new_test_ext(vec![]).execute_with(|| { - assert_ok!(Registrar::set_thread_count(Origin::root(), 1)); - - run_to_block(2); - - // Register a new parathread - assert_ok!(Registrar::register_parathread( - Origin::signed(3u64), - vec![3; 3].into(), - vec![3; 3].into(), - )); - - run_to_block(3); - - // transaction submitted to get parathread progressed. - let col = Sr25519Keyring::One.public().into(); - schedule_thread(user_id(0), &[3; 3], &col); - - run_to_block(5); - assert_eq!(Registrar::active_paras(), vec![ - (user_id(0), Some((col.clone(), Retriable::WithRetries(0)))) - ]); - assert_ok!(Parachains::set_heads(Origin::none(), vec![ - attest(user_id(0), &Sr25519Keyring::One.pair().into(), &[3; 3], &[0; 0]) - ])); - - run_to_block(6); - // at next block, it shouldn't be retried. - assert_eq!(Registrar::active_paras(), vec![]); - }); - } - - #[test] - fn removing_scheduled_parathread_works() { - new_test_ext(vec![]).execute_with(|| { - assert_ok!(Registrar::set_thread_count(Origin::root(), 1)); - - run_to_block(2); - - // Register some parathreads. - assert_ok!(Registrar::register_parathread(Origin::signed(3), vec![3; 3].into(), vec![3; 3].into())); - - run_to_block(3); - // transaction submitted to get parathread progressed. - let col = Sr25519Keyring::One.public().into(); - schedule_thread(user_id(0), &[3; 3], &col); - - // now we remove the parathread - assert_ok!(Registrar::deregister_parathread( - parachains::Origin::Parachain(user_id(0)).into() - )); - - run_to_block(5); - assert_eq!(Registrar::active_paras(), vec![]); // should not be scheduled. - - assert_ok!(Registrar::register_parathread(Origin::signed(3), vec![4; 3].into(), vec![4; 3].into())); - - run_to_block(6); - // transaction submitted to get parathread progressed. - schedule_thread(user_id(1), &[4; 3], &col); - - run_to_block(9); - // thread's slot was missed and is now being re-scheduled. - - assert_ok!(Registrar::deregister_parathread( - parachains::Origin::Parachain(user_id(1)).into() - )); - - run_to_block(10); - // thread's rescheduled slot was missed, but should not be reschedule since it was - // removed. - assert_eq!(Registrar::active_paras(), vec![]); // should not be scheduled. - }); - } - - #[test] - fn parathread_rescheduling_works() { - new_test_ext(vec![]).execute_with(|| { - assert_ok!(Registrar::set_thread_count(Origin::root(), 1)); - - run_to_block(2); - - // Register some parathreads. - assert_ok!(Registrar::register_parathread(Origin::signed(3), vec![3; 3].into(), vec![3; 3].into())); - assert_ok!(Registrar::register_parathread(Origin::signed(4), vec![4; 3].into(), vec![4; 3].into())); - assert_ok!(Registrar::register_parathread(Origin::signed(5), vec![5; 3].into(), vec![5; 3].into())); - - run_to_block(3); - - // transaction submitted to get parathread progressed. - let col = Sr25519Keyring::One.public().into(); - schedule_thread(user_id(0), &[3; 3], &col); - - // 4x: the initial time it was scheduled, plus 3 retries. - for n in 5..9 { - run_to_block(n); - assert_eq!(Registrar::active_paras(), vec![ - (user_id(0), Some((col.clone(), Retriable::WithRetries((n - 5) as u32)))) - ]); - } - - // missed too many times. dropped. - run_to_block(9); - assert_eq!(Registrar::active_paras(), vec![]); - - // schedule and miss all 3 and check that they go through the queueing system ok. - assert_ok!(Registrar::set_thread_count(Origin::root(), 2)); - schedule_thread(user_id(0), &[3; 3], &col); - schedule_thread(user_id(1), &[4; 3], &col); - - run_to_block(10); - schedule_thread(user_id(2), &[5; 3], &col); - - // 0 and 1 scheduled as normal. - run_to_block(11); - assert_eq!(Registrar::active_paras(), vec![ - (user_id(0), Some((col.clone(), Retriable::WithRetries(0)))), - (user_id(1), Some((col.clone(), Retriable::WithRetries(0)))) - ]); - - // 2 scheduled, 0 retried - run_to_block(12); - assert_eq!(Registrar::active_paras(), vec![ - (user_id(0), Some((col.clone(), Retriable::WithRetries(1)))), - (user_id(2), Some((col.clone(), Retriable::WithRetries(0)))), - ]); - - // 1 retried - run_to_block(13); - assert_eq!(Registrar::active_paras(), vec![ - (user_id(1), Some((col.clone(), Retriable::WithRetries(1)))) - ]); - - // 2 retried - run_to_block(14); - assert_eq!(Registrar::active_paras(), vec![ - (user_id(2), Some((col.clone(), Retriable::WithRetries(1)))) - ]); - - run_to_block(15); - assert_eq!(Registrar::active_paras(), vec![ - (user_id(0), Some((col.clone(), Retriable::WithRetries(2)))) - ]); - - run_to_block(16); - assert_eq!(Registrar::active_paras(), vec![ - (user_id(1), Some((col.clone(), Retriable::WithRetries(2)))) - ]); - - run_to_block(17); - assert_eq!(Registrar::active_paras(), vec![ - (user_id(2), Some((col.clone(), Retriable::WithRetries(2)))) - ]); - }); - } - - #[test] - fn parathread_auction_handles_basic_errors() { - new_test_ext(vec![]).execute_with(|| { - run_to_block(2); - let o = Origin::signed(0); - assert_ok!(Registrar::register_parathread(o, vec![7, 8, 9].into(), vec![1, 1, 1].into())); - - run_to_block(3); - assert_eq!( - Registrar::paras(&user_id(0)), - Some(ParaInfo { scheduling: Scheduling::Dynamic }) - ); - - let good_para_id = user_id(0); - let bad_para_id = user_id(1); - let bad_head_hash = ::Hashing::hash(&vec![1, 2, 1]); - let good_head_hash = ::Hashing::hash(&vec![1, 1, 1]); - let info = &DispatchInfo::default(); - - // Allow for threads - assert_ok!(Registrar::set_thread_count(Origin::root(), 10)); - - // Bad parathread id - let col = CollatorId::default(); - let inner = super::Call::select_parathread(bad_para_id, col.clone(), good_head_hash); - let call = Call::Registrar(inner); - assert!( - LimitParathreadCommits::(std::marker::PhantomData) - .validate(&0, &call, info, 0).is_err() - ); - - // Bad head data - let inner = super::Call::select_parathread(good_para_id, col.clone(), bad_head_hash); - let call = Call::Registrar(inner); - assert!( - LimitParathreadCommits::(std::marker::PhantomData) - .validate(&0, &call, info, 0).is_err() - ); - - // No duplicates - let inner = super::Call::select_parathread(good_para_id, col.clone(), good_head_hash); - let call = Call::Registrar(inner); - assert!( - LimitParathreadCommits::(std::marker::PhantomData) - .validate(&0, &call, info, 0).is_ok() - ); - assert!( - LimitParathreadCommits::(std::marker::PhantomData) - .validate(&0, &call, info, 0).is_err() - ); - }); - } - - #[test] - fn parathread_auction_works() { - new_test_ext(vec![]).execute_with(|| { - run_to_block(2); - // Register 5 parathreads - for x in 0..5 { - let o = Origin::signed(x as u64); - assert_ok!(Registrar::register_parathread(o, vec![x; 3].into(), vec![x; 3].into())); - } - - run_to_block(3); - - for x in 0..5 { - assert_eq!( - Registrar::paras(&user_id(x)), - Some(ParaInfo { scheduling: Scheduling::Dynamic }) - ); - } - - // Only 3 slots available... who will win?? - assert_ok!(Registrar::set_thread_count(Origin::root(), 3)); - - // Everyone wants a thread - for x in 0..5 { - let para_id = user_id(x as u32); - let collator_id = CollatorId::default(); - let head_hash = ::Hashing::hash(&vec![x; 3]); - let inner = super::Call::select_parathread(para_id, collator_id, head_hash); - let call = Call::Registrar(inner); - let info = &DispatchInfo::default(); - - // First 3 transactions win a slot - if x < 3 { - assert!( - LimitParathreadCommits::(std::marker::PhantomData) - .validate(&0, &call, info, 0) - .is_ok() - ); - } else { - // All others lose - assert_noop!( - LimitParathreadCommits::(std::marker::PhantomData) - .validate(&0, &call, info, 0), - InvalidTransaction::ExhaustsResources, - ); - } - } - - // 3 Threads are selected - assert_eq!( - SelectedThreads::get()[1], - vec![ - (user_id(0), CollatorId::default()), - (user_id(1), CollatorId::default()), - (user_id(2), CollatorId::default()), - ] - ); - - // Assuming Queue Size is 2 - assert_eq!(::QueueSize::get(), 2); - - // 2 blocks later - run_to_block(5); - // Threads left queue - assert_eq!(SelectedThreads::get()[0], vec![]); - // Threads are active - assert_eq!( - Registrar::active_paras(), - vec![ - (user_id(0), Some((CollatorId::default(), Retriable::WithRetries(0)))), - (user_id(1), Some((CollatorId::default(), Retriable::WithRetries(0)))), - (user_id(2), Some((CollatorId::default(), Retriable::WithRetries(0)))), - ] - ); - }); - } - - #[test] - fn register_does_not_enforce_limits_when_registering() { - new_test_ext(vec![]).execute_with(|| { - let bad_code_size = ::MaxCodeSize::get() + 1; - let bad_head_size = ::MaxHeadDataSize::get() + 1; - - let code = vec![1u8; bad_code_size as _].into(); - let head_data = vec![2u8; bad_head_size as _].into(); - - assert!(!>::code_size_allowed(bad_code_size)); - assert!(!>::head_data_size_allowed(bad_head_size)); - - let id = >::new_id(); - assert_ok!(>::register_para( - id, - ParaInfo { scheduling: Scheduling::Always }, - code, - head_data, - )); - }); - } -} diff --git a/runtime/common/src/slots.rs b/runtime/common/src/slots.rs index 0731900c5a..e42ba04b64 100644 --- a/runtime/common/src/slots.rs +++ b/runtime/common/src/slots.rs @@ -28,11 +28,10 @@ use frame_support::{ traits::{Currency, ReservableCurrency, WithdrawReason, ExistenceRequirement, Get, Randomness}, weights::{DispatchClass, Weight}, }; -use primitives::v0::{ - SwapAux, PARACHAIN_INFO, Id as ParaId, ValidationCode, HeadData, +use primitives::v1::{ + Id as ParaId, ValidationCode, HeadData, }; use frame_system::{ensure_signed, ensure_root}; -use crate::registrar::{Registrar, swap_ordered_existence}; use crate::slot_range::{SlotRange, SLOT_RANGE_COUNT}; type BalanceOf = <::Currency as Currency<::AccountId>>::Balance; @@ -58,6 +57,50 @@ pub trait Trait: frame_system::Trait { type Randomness: Randomness; } +/// Parachain registration API. +pub trait Registrar { + /// Create a new unique parachain identity for later registration. + fn new_id() -> ParaId; + + /// Checks whether the given initial head data size falls within the limit. + fn head_data_size_allowed(head_data_size: u32) -> bool; + + /// Checks whether the given validation code falls within the limit. + fn code_size_allowed(code_size: u32) -> bool; + + /// Register a parachain with given `code` and `initial_head_data`. `id` must not yet be registered or it will + /// result in a error. + /// + /// This does not enforce any code size or initial head data limits, as these + /// are governable and parameters for parachain initialization are often + /// determined long ahead-of-time. Not checking these values ensures that changes to limits + /// do not invalidate in-progress auction winners. + fn register_para( + id: ParaId, + _parachain: bool, + code: ValidationCode, + initial_head_data: HeadData, + ) -> DispatchResult; + + /// Deregister a parachain with given `id`. If `id` is not currently registered, an error is returned. + fn deregister_para(id: ParaId) -> DispatchResult; +} + +/// Auxilliary for when there's an attempt to swap two parachains/parathreads. +pub trait SwapAux { + /// Result describing whether it is possible to swap two parachains. Doesn't mutate state. + fn ensure_can_swap(one: ParaId, other: ParaId) -> Result<(), &'static str>; + + /// Updates any needed state/references to enact a logical swap of two parachains. Identity, + /// code and `head_data` remain equivalent for all parachains/threads, however other properties + /// such as leases, deposits held and thread/chain nature are swapped. + /// + /// May only be called on a state that `ensure_can_swap` has previously returned `Ok` for: if this is + /// not the case, the result is undefined. May only return an error if `ensure_can_swap` also returns + /// an error. + fn on_swap(one: ParaId, other: ParaId) -> Result<(), &'static str>; +} + /// A sub-bidder identifier. Used to distinguish between different logical bidders coming from the /// same account ID. pub type SubId = u32; @@ -187,6 +230,21 @@ decl_storage! { } } +/// Swap the existence of two items, provided by value, within an ordered list. +/// +/// If neither item exists, or if both items exist this will do nothing. If exactly one of the +/// items exists, then it will be removed and the other inserted. +fn swap_ordered_existence(ids: &mut [T], one: T, other: T) { + let maybe_one_pos = ids.binary_search(&one); + let maybe_other_pos = ids.binary_search(&other); + match (maybe_one_pos, maybe_other_pos) { + (Ok(one_pos), Err(_)) => ids[one_pos] = other, + (Err(_), Ok(other_pos)) => ids[other_pos] = one, + _ => return, + }; + ids.sort(); +} + impl SwapAux for Module { fn ensure_can_swap(one: ParaId, other: ParaId) -> Result<(), &'static str> { if >::contains_key(one) || >::contains_key(other) { @@ -470,7 +528,7 @@ decl_module! { // parachain for its immediate start. >::remove(¶_id); let _ = T::Parachains:: - register_para(para_id, PARACHAIN_INFO, code, initial_head_data); + register_para(para_id, true, code, initial_head_data); } Ok(()) @@ -719,7 +777,7 @@ impl Module { // The chain's deployment data is set; go ahead and register it, and remove the // now-redundant on-boarding entry. let _ = T::Parachains:: - register_para(para_id.clone(), PARACHAIN_INFO, code, initial_head_data); + register_para(para_id.clone(), true, code, initial_head_data); // ^^ not much we can do if it fails for some reason. >::remove(para_id) } @@ -890,7 +948,7 @@ mod tests { traits::{OnInitialize, OnFinalize} }; use pallet_balances; - use primitives::v0::{BlockNumber, Header, Id as ParaId, Info as ParaInfo, Scheduling}; + use primitives::v1::{BlockNumber, Header, Id as ParaId}; impl_outer_origin! { pub enum Origin for Test {} @@ -974,13 +1032,9 @@ mod tests { code_size <= MAX_CODE_SIZE } - fn para_info(_id: ParaId) -> Option { - Some(ParaInfo { scheduling: Scheduling::Always }) - } - fn register_para( id: ParaId, - _info: ParaInfo, + _parachain: bool, code: ValidationCode, initial_head_data: HeadData, ) -> DispatchResult { diff --git a/runtime/kusama/src/lib.rs b/runtime/kusama/src/lib.rs index 12e8b08a7f..8f7c165239 100644 --- a/runtime/kusama/src/lib.rs +++ b/runtime/kusama/src/lib.rs @@ -23,17 +23,16 @@ use sp_std::prelude::*; use sp_core::u32_trait::{_1, _2, _3, _4, _5}; use codec::{Encode, Decode}; -use primitives::v0::{ - self as parachain, +use primitives::v1::{ AccountId, AccountIndex, Balance, BlockNumber, Hash, Nonce, Signature, Moment, - ActiveParas, AbridgedCandidateReceipt, SigningContext, }; +use primitives::v0 as p_v0; use runtime_common::{ - attestations, claims, parachains, registrar, slots, SlowAdjustingFeeUpdate, + dummy, claims, SlowAdjustingFeeUpdate, impls::{CurrencyToVoteHandler, ToAuthor}, NegativeImbalance, BlockHashCount, MaximumBlockWeight, AvailableBlockRatio, MaximumBlockLength, BlockExecutionWeight, ExtrinsicBaseWeight, RocksDbWeight, - MaximumExtrinsicWeight, + MaximumExtrinsicWeight, ParachainSessionKeyPlaceholder, }; use sp_runtime::{ create_runtime_str, generic, impl_opaque_keys, ModuleId, @@ -71,8 +70,6 @@ pub use pallet_staking::StakerStatus; pub use sp_runtime::BuildStorage; pub use pallet_timestamp::Call as TimestampCall; pub use pallet_balances::Call as BalancesCall; -pub use attestations::{Call as AttestationsCall, MORE_ATTESTATIONS_IDENTIFIER}; -pub use parachains::Call as ParachainsCall; /// Constant values used within the runtime. pub mod constants; @@ -90,7 +87,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("kusama"), impl_name: create_runtime_str!("parity-kusama"), authoring_version: 2, - spec_version: 2022, + spec_version: 2023, impl_version: 0, #[cfg(not(feature = "disable-runtime-api"))] apis: RUNTIME_API_VERSIONS, @@ -111,8 +108,8 @@ pub fn native_version() -> NativeVersion { /// Avoid processing transactions from slots and parachain registrar. pub struct BaseFilter; impl Filter for BaseFilter { - fn filter(call: &Call) -> bool { - !matches!(call, Call::Slots(_) | Call::Registrar(_)) + fn filter(_: &Call) -> bool { + true } } @@ -269,7 +266,7 @@ impl_opaque_keys! { pub grandpa: Grandpa, pub babe: Babe, pub im_online: ImOnline, - pub parachain_validator: Parachains, + pub parachain_validator: ParachainSessionKeyPlaceholder, pub authority_discovery: AuthorityDiscovery, } } @@ -577,47 +574,6 @@ impl pallet_finality_tracker::Trait for Runtime { type ReportLatency = ReportLatency; } -parameter_types! { - pub const AttestationPeriod: BlockNumber = 50; -} - -impl attestations::Trait for Runtime { - type AttestationPeriod = AttestationPeriod; - type ValidatorIdentities = parachains::ValidatorIdentities; - type RewardAttestation = Staking; -} - -parameter_types! { - pub const MaxCodeSize: u32 = 10 * 1024 * 1024; // 10 MB - pub const MaxHeadDataSize: u32 = 20 * 1024; // 20 KB - pub const ValidationUpgradeFrequency: BlockNumber = 2 * DAYS; - pub const ValidationUpgradeDelay: BlockNumber = 8 * HOURS; - pub const SlashPeriod: BlockNumber = 7 * DAYS; -} - -impl parachains::Trait for Runtime { - type AuthorityId = primitives::v0::fisherman::FishermanAppCrypto; - type Origin = Origin; - type Call = Call; - type ParachainCurrency = Balances; - type BlockNumberConversion = sp_runtime::traits::Identity; - type Randomness = RandomnessCollectiveFlip; - type ActiveParachains = Registrar; - type Registrar = Registrar; - type MaxCodeSize = MaxCodeSize; - type MaxHeadDataSize = MaxHeadDataSize; - - type ValidationUpgradeFrequency = ValidationUpgradeFrequency; - type ValidationUpgradeDelay = ValidationUpgradeDelay; - type SlashPeriod = SlashPeriod; - - type Proof = sp_session::MembershipProof; - type KeyOwnerProofSystem = pallet_session::historical::Module; - type IdentificationTuple = )>>::IdentificationTuple; - type ReportOffence = Offences; - type BlockHashConversion = sp_runtime::traits::Identity; -} - /// Submits transaction with the node's public and signature type. Adheres to the signed extension /// format of the chain. impl frame_system::offchain::CreateSignedTransaction for Runtime where @@ -649,8 +605,6 @@ impl frame_system::offchain::CreateSignedTransaction for R frame_system::CheckNonce::::from(nonce), frame_system::CheckWeight::::new(), pallet_transaction_payment::ChargeTransactionPayment::::from(tip), - registrar::LimitParathreadCommits::::new(), - parachains::ValidateDoubleVoteReports::::new(), ); let raw_payload = SignedPayload::new(call, extra).map_err(|e| { debug::warn!("Unable to create signed payload: {:?}", e); @@ -675,36 +629,6 @@ impl frame_system::offchain::SendTransactionTypes for Runtime where type Extrinsic = UncheckedExtrinsic; } -parameter_types! { - pub const ParathreadDeposit: Balance = 5 * DOLLARS; - pub const QueueSize: usize = 2; - pub const MaxRetries: u32 = 3; -} - -impl registrar::Trait for Runtime { - type Event = Event; - type Origin = Origin; - type Currency = Balances; - type ParathreadDeposit = ParathreadDeposit; - type SwapAux = Slots; - type QueueSize = QueueSize; - type MaxRetries = MaxRetries; -} - -parameter_types! { - pub const LeasePeriod: BlockNumber = 100_000; - pub const EndingPeriod: BlockNumber = 1000; -} - -impl slots::Trait for Runtime { - type Event = Event; - type Currency = Balances; - type Parachains = Registrar; - type LeasePeriod = LeasePeriod; - type EndingPeriod = EndingPeriod; - type Randomness = RandomnessCollectiveFlip; -} - parameter_types! { pub Prefix: &'static [u8] = b"Pay KSMs to the Kusama account:"; } @@ -830,6 +754,8 @@ parameter_types! { pub const MaxProxies: u16 = 32; } +impl dummy::Trait for Runtime { } + /// The type used to represent the kinds of proxying allowed. #[derive(Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Encode, Decode, RuntimeDebug)] pub enum ProxyType { @@ -868,10 +794,10 @@ impl InstanceFilter for ProxyType { Call::TechnicalMembership(..) | Call::Treasury(..) | Call::Claims(..) | - Call::Parachains(..) | - Call::Attestations(..) | - Call::Slots(..) | - Call::Registrar(..) | + Call::DummyParachains(..) | + Call::DummyAttestations(..) | + Call::DummySlots(..) | + Call::DummyRegistrar(..) | Call::Utility(..) | Call::Identity(..) | Call::Society(..) | @@ -938,7 +864,7 @@ impl frame_support::traits::OnRuntimeUpgrade for CustomOnRuntimeUpgrade { construct_runtime! { pub enum Runtime where Block = Block, - NodeBlock = primitives::v0::Block, + NodeBlock = primitives::v1::Block, UncheckedExtrinsic = UncheckedExtrinsic { // Basic stuff; balances is uncallable initially. @@ -975,12 +901,11 @@ construct_runtime! { // Claims. Usable initially. Claims: claims::{Module, Call, Storage, Event, Config, ValidateUnsigned}, - // Parachains stuff; slots are disabled (no auctions initially). The rest are safe as they - // have no public dispatchables. - Parachains: parachains::{Module, Call, Storage, Config, Inherent, Origin}, - Attestations: attestations::{Module, Call, Storage}, - Slots: slots::{Module, Call, Storage, Event}, - Registrar: registrar::{Module, Call, Storage, Event, Config}, + // Old parachains stuff. All dummies to avoid messing up the transaction indices. + DummyParachains: dummy::::{Module, Call}, + DummyAttestations: dummy::::{Module, Call}, + DummySlots: dummy::::{Module, Call}, + DummyRegistrar: dummy::::{Module, Call}, // Utility module. Utility: pallet_utility::{Module, Call, Event}, @@ -1027,8 +952,6 @@ pub type SignedExtra = ( frame_system::CheckNonce, frame_system::CheckWeight, pallet_transaction_payment::ChargeTransactionPayment, - registrar::LimitParathreadCommits, - parachains::ValidateDoubleVoteReports, ); /// Unchecked extrinsic type as expected by this runtime. pub type UncheckedExtrinsic = generic::UncheckedExtrinsic; @@ -1108,45 +1031,55 @@ sp_api::impl_runtime_apis! { } } - impl parachain::ParachainHost for Runtime { - fn validators() -> Vec { - Parachains::authorities() + // Dummy implementation to continue supporting old parachains runtime temporarily. + impl p_v0::ParachainHost for Runtime { + fn validators() -> Vec { + // this is a compile-time check of size equality. note that we don't invoke + // the function and nothing here is unsafe. + let _ = core::mem::transmute::; + + // Yes, these aren't actually the parachain session keys. + // It doesn't matter, but we shouldn't return a zero-sized vector here. + // As there are no parachains + Session::validators() + .into_iter() + .map(|k| k.using_encoded(|s| Decode::decode(&mut &s[..])) + .expect("correct size and raw-bytes; qed")) + .collect() } - fn duty_roster() -> parachain::DutyRoster { - Parachains::calculate_duty_roster().0 + fn duty_roster() -> p_v0::DutyRoster { + let v = Session::validators(); + p_v0::DutyRoster { validator_duty: (0..v.len()).map(|_| p_v0::Chain::Relay).collect() } } - fn active_parachains() -> Vec<(parachain::Id, Option<(parachain::CollatorId, parachain::Retriable)>)> { - Registrar::active_paras() + fn active_parachains() -> Vec<(p_v0::Id, Option<(p_v0::CollatorId, p_v0::Retriable)>)> { + Vec::new() } - fn global_validation_data() -> parachain::GlobalValidationData { - Parachains::global_validation_data() + fn global_validation_data() -> p_v0::GlobalValidationData { + p_v0::GlobalValidationData { + max_code_size: 1, + max_head_data_size: 1, + block_number: System::block_number().saturating_sub(1), + } } - fn local_validation_data(id: parachain::Id) -> Option { - Parachains::current_local_validation_data(&id) + fn local_validation_data(_id: p_v0::Id) -> Option { + None } - fn parachain_code(id: parachain::Id) -> Option { - Parachains::parachain_code(&id) + fn parachain_code(_id: p_v0::Id) -> Option { + None } - fn get_heads(extrinsics: Vec<::Extrinsic>) - -> Option> + fn get_heads(_extrinsics: Vec<::Extrinsic>) + -> Option> { - extrinsics - .into_iter() - .find_map(|ex| match UncheckedExtrinsic::decode(&mut ex.encode().as_slice()) { - Ok(ex) => match ex.function { - Call::Parachains(ParachainsCall::set_heads(heads)) => { - Some(heads.into_iter().map(|c| c.candidate).collect()) - } - _ => None, - } - Err(_) => None, - }) + None } - fn signing_context() -> SigningContext { - Parachains::signing_context() + fn signing_context() -> p_v0::SigningContext { + p_v0::SigningContext { + parent_hash: System::parent_hash(), + session_index: Session::current_index(), + } } - fn downward_messages(id: parachain::Id) -> Vec { - Parachains::downward_messages(id) + fn downward_messages(_id: p_v0::Id) -> Vec { + Vec::new() } } diff --git a/runtime/polkadot/src/lib.rs b/runtime/polkadot/src/lib.rs index d15cce417d..f45757ac66 100644 --- a/runtime/polkadot/src/lib.rs +++ b/runtime/polkadot/src/lib.rs @@ -21,21 +21,20 @@ #![recursion_limit="256"] use runtime_common::{ - attestations, claims, parachains, registrar, slots, SlowAdjustingFeeUpdate, + dummy, claims, SlowAdjustingFeeUpdate, impls::{CurrencyToVoteHandler, ToAuthor}, NegativeImbalance, BlockHashCount, MaximumBlockWeight, AvailableBlockRatio, MaximumBlockLength, BlockExecutionWeight, ExtrinsicBaseWeight, RocksDbWeight, - MaximumExtrinsicWeight, purchase, + MaximumExtrinsicWeight, purchase, ParachainSessionKeyPlaceholder, }; use sp_std::prelude::*; use sp_core::u32_trait::{_1, _2, _3, _4, _5}; use codec::{Encode, Decode}; -use primitives::v0::{ - self as parachain, +use primitives::v1::{ AccountId, AccountIndex, Balance, BlockNumber, Hash, Nonce, Signature, Moment, - ActiveParas, AbridgedCandidateReceipt, SigningContext, }; +use primitives::v0 as p_v0; use sp_runtime::{create_runtime_str, generic, impl_opaque_keys, ModuleId, ApplyExtrinsicResult, KeyTypeId, Percent, Permill, Perbill, transaction_validity::{ TransactionValidity, TransactionSource, TransactionPriority, }, curve::PiecewiseLinear, traits::{ @@ -68,8 +67,6 @@ pub use pallet_staking::StakerStatus; pub use sp_runtime::BuildStorage; pub use pallet_timestamp::Call as TimestampCall; pub use pallet_balances::Call as BalancesCall; -pub use attestations::{Call as AttestationsCall, MORE_ATTESTATIONS_IDENTIFIER}; -pub use parachains::Call as ParachainsCall; /// Constant values used within the runtime. pub mod constants; @@ -89,7 +86,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("polkadot"), impl_name: create_runtime_str!("parity-polkadot"), authoring_version: 0, - spec_version: 22, + spec_version: 23, impl_version: 0, #[cfg(not(feature = "disable-runtime-api"))] apis: RUNTIME_API_VERSIONS, @@ -111,10 +108,8 @@ pub struct BaseFilter; impl Filter for BaseFilter { fn filter(call: &Call) -> bool { match call { - Call::Parachains(parachains::Call::set_heads(..)) => true, - // Parachains stuff - Call::Parachains(_) | Call::Attestations(_) | Call::Slots(_) | Call::Registrar(_) => + Call::DummyParachains(_) | Call::DummyAttestations(_) | Call::DummySlots(_) | Call::DummyRegistrar(_) => false, // These modules are all allowed to be called by transactions: @@ -281,7 +276,7 @@ impl_opaque_keys! { pub grandpa: Grandpa, pub babe: Babe, pub im_online: ImOnline, - pub parachain_validator: Parachains, + pub parachain_validator: ParachainSessionKeyPlaceholder, pub authority_discovery: AuthorityDiscovery, } } @@ -632,48 +627,6 @@ impl pallet_finality_tracker::Trait for Runtime { type ReportLatency = ReportLatency; } -parameter_types! { - pub const AttestationPeriod: BlockNumber = 50; -} - -impl attestations::Trait for Runtime { - type AttestationPeriod = AttestationPeriod; - type ValidatorIdentities = parachains::ValidatorIdentities; - type RewardAttestation = Staking; -} - -parameter_types! { - pub const MaxCodeSize: u32 = 10 * 1024 * 1024; // 10 MB - pub const MaxHeadDataSize: u32 = 20 * 1024; // 20 KB - - pub const ValidationUpgradeFrequency: BlockNumber = 7 * DAYS; - pub const ValidationUpgradeDelay: BlockNumber = 1 * DAYS; - pub const SlashPeriod: BlockNumber = 28 * DAYS; -} - -impl parachains::Trait for Runtime { - type AuthorityId = primitives::v0::fisherman::FishermanAppCrypto; - type Origin = Origin; - type Call = Call; - type ParachainCurrency = Balances; - type BlockNumberConversion = sp_runtime::traits::Identity; - type Randomness = RandomnessCollectiveFlip; - type ActiveParachains = Registrar; - type Registrar = Registrar; - type MaxCodeSize = MaxCodeSize; - type MaxHeadDataSize = MaxHeadDataSize; - - type ValidationUpgradeFrequency = ValidationUpgradeFrequency; - type ValidationUpgradeDelay = ValidationUpgradeDelay; - type SlashPeriod = SlashPeriod; - - type Proof = sp_session::MembershipProof; - type KeyOwnerProofSystem = pallet_session::historical::Module; - type IdentificationTuple = )>>::IdentificationTuple; - type ReportOffence = Offences; - type BlockHashConversion = sp_runtime::traits::Identity; -} - /// Submits a transaction with the node's public and signature type. Adheres to the signed extension /// format of the chain. impl frame_system::offchain::CreateSignedTransaction for Runtime where @@ -705,8 +658,6 @@ impl frame_system::offchain::CreateSignedTransaction for R frame_system::CheckNonce::::from(nonce), frame_system::CheckWeight::::new(), pallet_transaction_payment::ChargeTransactionPayment::::from(tip), - registrar::LimitParathreadCommits::::new(), - parachains::ValidateDoubleVoteReports::::new(), claims::PrevalidateAttests::::new(), ); let raw_payload = SignedPayload::new(call, extra).map_err(|e| { @@ -736,30 +687,6 @@ parameter_types! { pub const MaxRetries: u32 = 3; } -impl registrar::Trait for Runtime { - type Event = Event; - type Origin = Origin; - type Currency = Balances; - type ParathreadDeposit = ParathreadDeposit; - type SwapAux = Slots; - type QueueSize = QueueSize; - type MaxRetries = MaxRetries; -} - -parameter_types! { - pub const LeasePeriod: BlockNumber = 100_000; - pub const EndingPeriod: BlockNumber = 1000; -} - -impl slots::Trait for Runtime { - type Event = Event; - type Currency = Balances; - type Parachains = Registrar; - type EndingPeriod = EndingPeriod; - type LeasePeriod = LeasePeriod; - type Randomness = RandomnessCollectiveFlip; -} - parameter_types! { pub Prefix: &'static [u8] = b"Pay DOTs to the Polkadot account:"; } @@ -816,6 +743,8 @@ parameter_types! { pub const MaxProxies: u16 = 32; } +impl dummy::Trait for Runtime { } + /// The type used to represent the kinds of proxying allowed. #[derive(Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Encode, Decode, RuntimeDebug)] pub enum ProxyType { @@ -885,10 +814,10 @@ impl InstanceFilter for ProxyType { Call::ElectionsPhragmen(..) | Call::TechnicalMembership(..) | Call::Treasury(..) | - Call::Parachains(..) | - Call::Attestations(..) | - Call::Slots(..) | - Call::Registrar(..) | + Call::DummyParachains(..) | + Call::DummyAttestations(..) | + Call::DummySlots(..) | + Call::DummyRegistrar(..) | Call::Claims(..) | Call::Vesting(pallet_vesting::Call::vest(..)) | Call::Vesting(pallet_vesting::Call::vest_other(..)) | @@ -1083,7 +1012,7 @@ impl purchase::Trait for Runtime { construct_runtime! { pub enum Runtime where Block = Block, - NodeBlock = primitives::v0::Block, + NodeBlock = primitives::v1::Block, UncheckedExtrinsic = UncheckedExtrinsic { // Basic stuff; balances is uncallable initially. @@ -1118,13 +1047,11 @@ construct_runtime! { TechnicalMembership: pallet_membership::::{Module, Call, Storage, Event, Config}, Treasury: pallet_treasury::{Module, Call, Storage, Event}, - // Parachains stuff; slots are disabled (no auctions initially). The rest are safe as they - // have no public dispatchables. Disabled `Call` on all of them, but this should be - // uncommented once we're ready to start parachains. - Parachains: parachains::{Module, Call, Storage, Config, Inherent, Origin}, - Attestations: attestations::{Module, Call, Storage}, - Slots: slots::{Module, Call, Storage, Event}, - Registrar: registrar::{Module, Call, Storage, Event, Config}, + // Old parachains stuff. All dummies to avoid messing up the transaction indices. + DummyParachains: dummy::::{Module, Call}, + DummyAttestations: dummy::::{Module, Call}, + DummySlots: dummy::::{Module, Call}, + DummyRegistrar: dummy::::{Module, Call}, // Claims. Usable initially. Claims: claims::{Module, Call, Storage, Event, Config, ValidateUnsigned}, @@ -1166,8 +1093,6 @@ pub type SignedExtra = ( frame_system::CheckNonce, frame_system::CheckWeight, pallet_transaction_payment::ChargeTransactionPayment, - registrar::LimitParathreadCommits, - parachains::ValidateDoubleVoteReports, claims::PrevalidateAttests, ); /// Unchecked extrinsic type as expected by this runtime. @@ -1247,46 +1172,55 @@ sp_api::impl_runtime_apis! { Executive::offchain_worker(header) } } - - impl parachain::ParachainHost for Runtime { - fn validators() -> Vec { - Parachains::authorities() + // Dummy implementation to continue supporting old parachains runtime temporarily. + impl p_v0::ParachainHost for Runtime { + fn validators() -> Vec { + // this is a compile-time check of size equality. note that we don't invoke + // the function and nothing here is unsafe. + let _ = core::mem::transmute::; + + // Yes, these aren't actually the parachain session keys. + // It doesn't matter, but we shouldn't return a zero-sized vector here. + // As there are no parachains + Session::validators() + .into_iter() + .map(|k| k.using_encoded(|s| Decode::decode(&mut &s[..])) + .expect("correct size and raw-bytes; qed")) + .collect() } - fn duty_roster() -> parachain::DutyRoster { - Parachains::calculate_duty_roster().0 + fn duty_roster() -> p_v0::DutyRoster { + let v = Session::validators(); + p_v0::DutyRoster { validator_duty: (0..v.len()).map(|_| p_v0::Chain::Relay).collect() } } - fn active_parachains() -> Vec<(parachain::Id, Option<(parachain::CollatorId, parachain::Retriable)>)> { - Registrar::active_paras() + fn active_parachains() -> Vec<(p_v0::Id, Option<(p_v0::CollatorId, p_v0::Retriable)>)> { + Vec::new() } - fn global_validation_data() -> parachain::GlobalValidationData { - Parachains::global_validation_data() + fn global_validation_data() -> p_v0::GlobalValidationData { + p_v0::GlobalValidationData { + max_code_size: 1, + max_head_data_size: 1, + block_number: System::block_number().saturating_sub(1), + } } - fn local_validation_data(id: parachain::Id) -> Option { - Parachains::current_local_validation_data(&id) + fn local_validation_data(_id: p_v0::Id) -> Option { + None } - fn parachain_code(id: parachain::Id) -> Option { - Parachains::parachain_code(&id) + fn parachain_code(_id: p_v0::Id) -> Option { + None } - fn get_heads(extrinsics: Vec<::Extrinsic>) - -> Option> + fn get_heads(_extrinsics: Vec<::Extrinsic>) + -> Option> { - extrinsics - .into_iter() - .find_map(|ex| match UncheckedExtrinsic::decode(&mut ex.encode().as_slice()) { - Ok(ex) => match ex.function { - Call::Parachains(ParachainsCall::set_heads(heads)) => { - Some(heads.into_iter().map(|c| c.candidate).collect()) - } - _ => None, - } - Err(_) => None, - }) + None } - fn signing_context() -> SigningContext { - Parachains::signing_context() + fn signing_context() -> p_v0::SigningContext { + p_v0::SigningContext { + parent_hash: System::parent_hash(), + session_index: Session::current_index(), + } } - fn downward_messages(id: parachain::Id) -> Vec { - Parachains::downward_messages(id) + fn downward_messages(_id: p_v0::Id) -> Vec { + Vec::new() } } diff --git a/runtime/rococo/Cargo.toml b/runtime/rococo/Cargo.toml deleted file mode 100644 index 804baa3dfb..0000000000 --- a/runtime/rococo/Cargo.toml +++ /dev/null @@ -1,176 +0,0 @@ -[package] -name = "rococo-runtime" -version = "0.8.22" -authors = ["Parity Technologies "] -edition = "2018" -build = "build.rs" - -[dependencies] -bitvec = { version = "0.17.4", default-features = false, features = ["alloc"] } -codec = { package = "parity-scale-codec", version = "1.3.4", default-features = false, features = ["derive"] } -log = { version = "0.3.9", optional = true } -rustc-hex = { version = "2.0.1", default-features = false } -serde = { version = "1.0.102", default-features = false } -serde_derive = { version = "1.0.102", optional = true } -static_assertions = "1.1.0" -smallvec = "1.4.1" - -authority-discovery-primitives = { package = "sp-authority-discovery", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -babe-primitives = { package = "sp-consensus-babe", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -sp-api = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -inherents = { package = "sp-inherents", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -offchain-primitives = { package = "sp-offchain", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -sp-std = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -sp-io = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -sp-core = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -sp-session = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -sp-version = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -tx-pool-api = { package = "sp-transaction-pool", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -block-builder-api = { package = "sp-block-builder", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } - -pallet-authority-discovery = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -pallet-authorship = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -pallet-babe = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -pallet-balances = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -pallet-transaction-payment = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -pallet-transaction-payment-rpc-runtime-api = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -pallet-collective = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -pallet-democracy = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -pallet-elections-phragmen = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -frame-executive = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -pallet-finality-tracker = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -pallet-grandpa = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -pallet-identity = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -pallet-im-online = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -pallet-indices = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -pallet-membership = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -pallet-multisig = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -pallet-nicks = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -pallet-offences = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -pallet-proxy = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -pallet-recovery = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -pallet-randomness-collective-flip = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -pallet-scheduler = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -pallet-session = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -frame-support = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -pallet-staking = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -pallet-staking-reward-curve = { git = "https://github.com/paritytech/substrate", branch = "master" } -pallet-sudo = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -frame-system = {git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -frame-system-rpc-runtime-api = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -pallet-timestamp = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -pallet-treasury = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -pallet-vesting = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -pallet-utility = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } - -frame-benchmarking = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false, optional = true } -frame-system-benchmarking = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false, optional = true } -pallet-offences-benchmarking = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false, optional = true } -pallet-session-benchmarking = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false, optional = true } -hex-literal = { version = "0.2.1" } - -runtime-common = { package = "polkadot-runtime-common", path = "../common", default-features = false } -primitives = { package = "polkadot-primitives", path = "../../primitives", default-features = false } -polkadot-parachain = { path = "../../parachain", default-features = false } - -[dev-dependencies] -hex-literal = "0.2.1" -libsecp256k1 = "0.3.2" -tiny-keccak = "1.5.0" -keyring = { package = "sp-keyring", git = "https://github.com/paritytech/substrate", branch = "master" } -sp-trie = { git = "https://github.com/paritytech/substrate", branch = "master" } -serde_json = "1.0.41" - -[build-dependencies] -wasm-builder-runner = { package = "substrate-wasm-builder-runner", version = "1.0.6" } - -[features] -default = ["std"] -no_std = [] -only-staking = [] -std = [ - "authority-discovery-primitives/std", - "pallet-authority-discovery/std", - "bitvec/std", - "primitives/std", - "rustc-hex/std", - "codec/std", - "inherents/std", - "sp-core/std", - "polkadot-parachain/std", - "sp-api/std", - "tx-pool-api/std", - "block-builder-api/std", - "offchain-primitives/std", - "sp-std/std", - "sp-io/std", - "frame-support/std", - "pallet-authorship/std", - "pallet-balances/std", - "pallet-transaction-payment/std", - "pallet-transaction-payment-rpc-runtime-api/std", - "pallet-collective/std", - "pallet-elections-phragmen/std", - "pallet-democracy/std", - "frame-executive/std", - "pallet-finality-tracker/std", - "pallet-grandpa/std", - "pallet-identity/std", - "pallet-im-online/std", - "pallet-indices/std", - "pallet-membership/std", - "pallet-multisig/std", - "pallet-nicks/std", - "pallet-offences/std", - "pallet-proxy/std", - "pallet-recovery/std", - "sp-runtime/std", - "pallet-scheduler/std", - "pallet-session/std", - "pallet-staking/std", - "pallet-sudo/std", - "frame-system/std", - "frame-system-rpc-runtime-api/std", - "pallet-timestamp/std", - "pallet-treasury/std", - "sp-version/std", - "serde_derive", - "serde/std", - "log", - "pallet-babe/std", - "babe-primitives/std", - "sp-session/std", - "pallet-randomness-collective-flip/std", - "runtime-common/std", - "pallet-vesting/std", - "pallet-utility/std", -] -runtime-benchmarks = [ - "runtime-common/runtime-benchmarks", - "frame-benchmarking", - "frame-support/runtime-benchmarks", - "frame-system-benchmarking", - "frame-system/runtime-benchmarks", - "sp-runtime/runtime-benchmarks", - "pallet-balances/runtime-benchmarks", - "pallet-collective/runtime-benchmarks", - "pallet-democracy/runtime-benchmarks", - "pallet-elections-phragmen/runtime-benchmarks", - "pallet-im-online/runtime-benchmarks", - "pallet-scheduler/runtime-benchmarks", - "pallet-staking/runtime-benchmarks", - "pallet-timestamp/runtime-benchmarks", - "pallet-treasury/runtime-benchmarks", - "pallet-vesting/runtime-benchmarks", - "pallet-offences-benchmarking", - "pallet-session-benchmarking", - # uncomment when it is made optional again - # "hex-literal", -] -# When enabled, the runtime api will not be build. -# -# This is required by Cumulus to access certain types of the -# runtime without clashing with the runtime api exported functions -# in WASM. -disable-runtime-api = [] diff --git a/runtime/rococo/build.rs b/runtime/rococo/build.rs deleted file mode 100644 index dff1419829..0000000000 --- a/runtime/rococo/build.rs +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright 2020 Parity Technologies (UK) Ltd. -// This file is part of Polkadot. - -// 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 . - -use wasm_builder_runner::WasmBuilder; - -fn main() { - WasmBuilder::new() - .with_current_project() - .with_wasm_builder_from_crates("2.0.0") - .import_memory() - .export_heap_base() - .build() -} diff --git a/runtime/rococo/src/constants.rs b/runtime/rococo/src/constants.rs deleted file mode 100644 index a565ca4dbc..0000000000 --- a/runtime/rococo/src/constants.rs +++ /dev/null @@ -1,113 +0,0 @@ -// Copyright 2020 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 . - -/// Money matters. -pub mod currency { - use primitives::v0::Balance; - - pub const DOTS: Balance = 1_000_000_000_000; - pub const DOLLARS: Balance = DOTS; - pub const CENTS: Balance = DOLLARS / 100; - pub const MILLICENTS: Balance = CENTS / 1_000; - - pub const fn deposit(items: u32, bytes: u32) -> Balance { - items as Balance * 1 * DOLLARS + (bytes as Balance) * 5 * MILLICENTS - } -} - -/// Time and blocks. -pub mod time { - use primitives::v0::{Moment, BlockNumber}; - pub const MILLISECS_PER_BLOCK: Moment = 6000; - pub const SLOT_DURATION: Moment = MILLISECS_PER_BLOCK; - pub const EPOCH_DURATION_IN_BLOCKS: BlockNumber = 1 * HOURS; - - // These time units are defined in number of blocks. - pub const MINUTES: BlockNumber = 60_000 / (MILLISECS_PER_BLOCK as BlockNumber); - pub const HOURS: BlockNumber = MINUTES * 60; - pub const DAYS: BlockNumber = HOURS * 24; - - // 1 in 4 blocks (on average, not counting collisions) will be primary babe blocks. - pub const PRIMARY_PROBABILITY: (u64, u64) = (1, 4); -} - -/// Fee-related. -pub mod fee { - pub use sp_runtime::Perbill; - use primitives::v0::Balance; - use runtime_common::ExtrinsicBaseWeight; - use frame_support::weights::{ - WeightToFeePolynomial, WeightToFeeCoefficient, WeightToFeeCoefficients, - }; - use smallvec::smallvec; - - /// The block saturation level. Fees will be updates based on this value. - pub const TARGET_BLOCK_FULLNESS: Perbill = Perbill::from_percent(25); - - /// Handles converting a weight scalar to a fee value, based on the scale and granularity of the - /// node's balance type. - /// - /// This should typically create a mapping between the following ranges: - /// - [0, frame_system::MaximumBlockWeight] - /// - [Balance::min, Balance::max] - /// - /// Yet, it can be used for any other sort of change to weight-fee. Some examples being: - /// - Setting it to `0` will essentially disable the weight fee. - /// - Setting it to `1` will cause the literal `#[weight = x]` values to be charged. - pub struct WeightToFee; - impl WeightToFeePolynomial for WeightToFee { - type Balance = Balance; - fn polynomial() -> WeightToFeeCoefficients { - // in Westend, extrinsic base weight (smallest non-zero weight) is mapped to 1/10 CENT: - let p = super::currency::CENTS; - let q = 10 * Balance::from(ExtrinsicBaseWeight::get()); - smallvec![WeightToFeeCoefficient { - degree: 1, - negative: false, - coeff_frac: Perbill::from_rational_approximation(p % q, q), - coeff_integer: p / q, - }] - } - } -} - -#[cfg(test)] -mod tests { - use frame_support::weights::WeightToFeePolynomial; - use runtime_common::{MaximumBlockWeight, ExtrinsicBaseWeight}; - use super::fee::WeightToFee; - use super::currency::{CENTS, DOLLARS, MILLICENTS}; - - #[test] - // This function tests that the fee for `MaximumBlockWeight` of weight is correct - fn full_block_fee_is_correct() { - // A full block should cost 16 DOLLARS - println!("Base: {}", ExtrinsicBaseWeight::get()); - let x = WeightToFee::calc(&MaximumBlockWeight::get()); - let y = 16 * DOLLARS; - assert!(x.max(y) - x.min(y) < MILLICENTS); - } - - #[test] - // This function tests that the fee for `ExtrinsicBaseWeight` of weight is correct - fn extrinsic_base_fee_is_correct() { - // `ExtrinsicBaseWeight` should cost 1/10 of a CENT - println!("Base: {}", ExtrinsicBaseWeight::get()); - let x = WeightToFee::calc(&ExtrinsicBaseWeight::get()); - let y = CENTS / 10; - assert!(x.max(y) - x.min(y) < MILLICENTS); - } -} diff --git a/runtime/rococo/src/lib.rs b/runtime/rococo/src/lib.rs deleted file mode 100644 index c8fa47230a..0000000000 --- a/runtime/rococo/src/lib.rs +++ /dev/null @@ -1,1024 +0,0 @@ -// Copyright 2020 Parity Technologies (UK) Ltd. -// This file is part of Polkadot. - -// Polkadot is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Polkadot is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Polkadot. If not, see . - -//! The Polkadot runtime. This can be compiled with `#[no_std]`, ready for Wasm. - -#![cfg_attr(not(feature = "std"), no_std)] -// `construct_runtime!` does a lot of recursion and requires us to increase the limit to 256. -#![recursion_limit="256"] - -use sp_std::prelude::*; -use codec::{Encode, Decode}; -use primitives::v0::{ - self as parachain, - AccountId, AccountIndex, Balance, BlockNumber, Hash, Nonce, Signature, Moment, - ActiveParas, AbridgedCandidateReceipt, SigningContext, -}; -use runtime_common::{ - attestations, parachains, registrar, SlowAdjustingFeeUpdate, - impls::ToAuthor, - BlockHashCount, MaximumBlockWeight, AvailableBlockRatio, MaximumBlockLength, - BlockExecutionWeight, ExtrinsicBaseWeight, RocksDbWeight, MaximumExtrinsicWeight, -}; -use sp_runtime::{ - create_runtime_str, generic, impl_opaque_keys, - ApplyExtrinsicResult, KeyTypeId, Perbill, curve::PiecewiseLinear, - transaction_validity::{TransactionValidity, TransactionSource, TransactionPriority}, - traits::{ - BlakeTwo256, Block as BlockT, OpaqueKeys, ConvertInto, IdentityLookup, - Extrinsic as ExtrinsicT, SaturatedConversion, Verify, - }, -}; -#[cfg(feature = "runtime-benchmarks")] -use sp_runtime::RuntimeString; -use sp_version::RuntimeVersion; -use pallet_grandpa::{AuthorityId as GrandpaId, fg_primitives}; -#[cfg(any(feature = "std", test))] -use sp_version::NativeVersion; -use sp_core::OpaqueMetadata; -use frame_support::{ - parameter_types, construct_runtime, debug, RuntimeDebug, - traits::{KeyOwnerProofSystem, Randomness, Filter, InstanceFilter}, - weights::Weight, -}; -use pallet_im_online::sr25519::AuthorityId as ImOnlineId; -use authority_discovery_primitives::AuthorityId as AuthorityDiscoveryId; -use pallet_transaction_payment_rpc_runtime_api::RuntimeDispatchInfo; -use pallet_session::historical as session_historical; -use frame_system::EnsureRoot; - -#[cfg(feature = "std")] -pub use pallet_staking::StakerStatus; -#[cfg(any(feature = "std", test))] -pub use sp_runtime::BuildStorage; -pub use pallet_timestamp::Call as TimestampCall; -pub use pallet_balances::Call as BalancesCall; -pub use attestations::{Call as AttestationsCall, MORE_ATTESTATIONS_IDENTIFIER}; -pub use parachains::Call as ParachainsCall; - -/// Constant values used within the runtime. -pub mod constants; -use constants::{time::*, currency::*, fee::*}; - -// Make the WASM binary available. -#[cfg(feature = "std")] -include!(concat!(env!("OUT_DIR"), "/wasm_binary.rs")); - -/// Runtime version (Kusama). -pub const VERSION: RuntimeVersion = RuntimeVersion { - spec_name: create_runtime_str!("rococo"), - impl_name: create_runtime_str!("parity-rococo"), - authoring_version: 2, - spec_version: 0, - impl_version: 0, - #[cfg(not(feature = "disable-runtime-api"))] - apis: RUNTIME_API_VERSIONS, - #[cfg(feature = "disable-runtime-api")] - apis: version::create_apis_vec![[]], - transaction_version: 0, -}; - -/// Native version. -#[cfg(any(feature = "std", test))] -pub fn native_version() -> NativeVersion { - NativeVersion { - runtime_version: VERSION, - can_author_with: Default::default(), - } -} - -/// Avoid processing transactions from slots and parachain registrar. -pub struct BaseFilter; -impl Filter for BaseFilter { - fn filter(call: &Call) -> bool { - !matches!(call, Call::Registrar(_)) - } -} - -parameter_types! { - pub const Version: RuntimeVersion = VERSION; -} - -impl frame_system::Trait for Runtime { - type BaseCallFilter = BaseFilter; - type Origin = Origin; - type Call = Call; - type Index = Nonce; - type BlockNumber = BlockNumber; - type Hash = Hash; - type Hashing = BlakeTwo256; - type AccountId = AccountId; - type Lookup = IdentityLookup; - type Header = generic::Header; - type Event = Event; - type BlockHashCount = BlockHashCount; - type MaximumBlockWeight = MaximumBlockWeight; - type DbWeight = RocksDbWeight; - type BlockExecutionWeight = BlockExecutionWeight; - type ExtrinsicBaseWeight = ExtrinsicBaseWeight; - type MaximumExtrinsicWeight = MaximumExtrinsicWeight; - type MaximumBlockLength = MaximumBlockLength; - type AvailableBlockRatio = AvailableBlockRatio; - type Version = Version; - type ModuleToIndex = ModuleToIndex; - type AccountData = pallet_balances::AccountData; - type OnNewAccount = (); - type OnKilledAccount = (); - type SystemWeightInfo = (); -} - -impl pallet_scheduler::Trait for Runtime { - type Event = Event; - type Origin = Origin; - type PalletsOrigin = OriginCaller; - type Call = Call; - type MaximumWeight = MaximumBlockWeight; - type ScheduleOrigin = EnsureRoot; - type WeightInfo = (); -} - -parameter_types! { - pub const EpochDuration: u64 = EPOCH_DURATION_IN_BLOCKS as u64; - pub const ExpectedBlockTime: Moment = MILLISECS_PER_BLOCK; -} - -impl pallet_babe::Trait for Runtime { - type EpochDuration = EpochDuration; - type ExpectedBlockTime = ExpectedBlockTime; - - // session module is the trigger - type EpochChangeTrigger = pallet_babe::ExternalTrigger; - - type KeyOwnerProofSystem = Historical; - - type KeyOwnerProof = >::Proof; - - type KeyOwnerIdentification = >::IdentificationTuple; - - type HandleEquivocation = - pallet_babe::EquivocationHandler; -} - -parameter_types! { - pub const IndexDeposit: Balance = 1 * DOLLARS; -} - -impl pallet_indices::Trait for Runtime { - type AccountIndex = AccountIndex; - type Currency = Balances; - type Deposit = IndexDeposit; - type Event = Event; - type WeightInfo = (); -} - -parameter_types! { - pub const ExistentialDeposit: Balance = 1 * CENTS; -} - -impl pallet_balances::Trait for Runtime { - type Balance = Balance; - type DustRemoval = (); - type Event = Event; - type ExistentialDeposit = ExistentialDeposit; - type AccountStore = System; - type WeightInfo = (); -} - -parameter_types! { - pub const TransactionByteFee: Balance = 10 * MILLICENTS; -} - -impl pallet_transaction_payment::Trait for Runtime { - type Currency = Balances; - type OnTransactionPayment = ToAuthor; - type TransactionByteFee = TransactionByteFee; - type WeightToFee = WeightToFee; - type FeeMultiplierUpdate = SlowAdjustingFeeUpdate; -} - -parameter_types! { - pub const MinimumPeriod: u64 = SLOT_DURATION / 2; -} -impl pallet_timestamp::Trait for Runtime { - type Moment = u64; - type OnTimestampSet = Babe; - type MinimumPeriod = MinimumPeriod; - type WeightInfo = (); -} - -parameter_types! { - pub const UncleGenerations: u32 = 0; -} - -// TODO: substrate#2986 implement this properly -impl pallet_authorship::Trait for Runtime { - type FindAuthor = pallet_session::FindAccountFromAuthorIndex; - type UncleGenerations = UncleGenerations; - type FilterUncle = (); - type EventHandler = ImOnline; -} - -parameter_types! { - pub const Period: BlockNumber = 10 * MINUTES; - pub const Offset: BlockNumber = 0; -} - -impl_opaque_keys! { - pub struct SessionKeys { - pub grandpa: Grandpa, - pub babe: Babe, - pub im_online: ImOnline, - pub parachain_validator: Parachains, - pub authority_discovery: AuthorityDiscovery, - } -} - -parameter_types! { - pub const DisabledValidatorsThreshold: Perbill = Perbill::from_percent(17); -} - -impl pallet_session::Trait for Runtime { - type Event = Event; - type ValidatorId = AccountId; - type ValidatorIdOf = (); - type ShouldEndSession = Babe; - type NextSessionRotation = Babe; - type SessionManager = (); - type SessionHandler = ::KeyTypeIdProviders; - type Keys = SessionKeys; - type DisabledValidatorsThreshold = DisabledValidatorsThreshold; - type WeightInfo = (); -} - -impl pallet_session::historical::Trait for Runtime { - type FullIdentification = (); - type FullIdentificationOf = (); -} - -pallet_staking_reward_curve::build! { - const REWARD_CURVE: PiecewiseLinear<'static> = curve!( - min_inflation: 0_025_000, - max_inflation: 0_100_000, - ideal_stake: 0_500_000, - falloff: 0_050_000, - max_piece_count: 40, - test_precision: 0_005_000, - ); -} - -parameter_types! { - // 28 eras for unbonding (7 days). - pub const BondingDuration: pallet_staking::EraIndex = 28; - // 28 eras in which slashes can be cancelled (7 days). - pub const SlashDeferDuration: pallet_staking::EraIndex = 27; - pub const RewardCurve: &'static PiecewiseLinear<'static> = &REWARD_CURVE; - pub const MaxNominatorRewardedPerValidator: u32 = 64; - // quarter of the last session will be for election. - pub const ElectionLookahead: BlockNumber = EPOCH_DURATION_IN_BLOCKS / 4; - pub const MaxIterations: u32 = 10; - pub MinSolutionScoreBump: Perbill = Perbill::from_rational_approximation(5u32, 10_000); -} - -parameter_types! { - pub const LaunchPeriod: BlockNumber = 7 * DAYS; - pub const VotingPeriod: BlockNumber = 7 * DAYS; - pub const FastTrackVotingPeriod: BlockNumber = 3 * HOURS; - pub const MinimumDeposit: Balance = 1 * DOLLARS; - pub const EnactmentPeriod: BlockNumber = 8 * DAYS; - pub const CooloffPeriod: BlockNumber = 7 * DAYS; - // One cent: $10,000 / MB - pub const PreimageByteDeposit: Balance = 10 * MILLICENTS; - pub const InstantAllowed: bool = true; -} - -parameter_types! { - pub OffencesWeightSoftLimit: Weight = Perbill::from_percent(60) * MaximumBlockWeight::get(); -} - -impl pallet_offences::Trait for Runtime { - type Event = Event; - type IdentificationTuple = pallet_session::historical::IdentificationTuple; - type OnOffenceHandler = (); - type WeightSoftLimit = OffencesWeightSoftLimit; - type WeightInfo = (); -} - -impl pallet_authority_discovery::Trait for Runtime {} - -parameter_types! { - pub const SessionDuration: BlockNumber = EPOCH_DURATION_IN_BLOCKS as _; -} - -parameter_types! { - pub const StakingUnsignedPriority: TransactionPriority = TransactionPriority::max_value() / 2; - pub const ImOnlineUnsignedPriority: TransactionPriority = TransactionPriority::max_value(); -} - -impl pallet_im_online::Trait for Runtime { - type AuthorityId = ImOnlineId; - type Event = Event; - type ReportUnresponsiveness = Offences; - type SessionDuration = SessionDuration; - type UnsignedPriority = StakingUnsignedPriority; - type WeightInfo = (); -} - -impl pallet_grandpa::Trait for Runtime { - type Event = Event; - type Call = Call; - - type KeyOwnerProofSystem = Historical; - - type KeyOwnerProof = - >::Proof; - - type KeyOwnerIdentification = >::IdentificationTuple; - - type HandleEquivocation = pallet_grandpa::EquivocationHandler; -} - -parameter_types! { - pub WindowSize: BlockNumber = pallet_finality_tracker::DEFAULT_WINDOW_SIZE.into(); - pub ReportLatency: BlockNumber = pallet_finality_tracker::DEFAULT_REPORT_LATENCY.into(); -} - -impl pallet_finality_tracker::Trait for Runtime { - type OnFinalizationStalled = (); - type WindowSize = WindowSize; - type ReportLatency = ReportLatency; -} - -parameter_types! { - pub const AttestationPeriod: BlockNumber = 50; -} - -impl attestations::Trait for Runtime { - type AttestationPeriod = AttestationPeriod; - type ValidatorIdentities = parachains::ValidatorIdentities; - type RewardAttestation = (); -} - -parameter_types! { - pub const MaxCodeSize: u32 = 10 * 1024 * 1024; // 10 MB - pub const MaxHeadDataSize: u32 = 20 * 1024; // 20 KB - pub const ValidationUpgradeFrequency: BlockNumber = 2 * DAYS; - pub const ValidationUpgradeDelay: BlockNumber = 8 * HOURS; - pub const SlashPeriod: BlockNumber = 7 * DAYS; -} - -impl parachains::Trait for Runtime { - type AuthorityId = primitives::v0::fisherman::FishermanAppCrypto; - type Origin = Origin; - type Call = Call; - type ParachainCurrency = Balances; - type BlockNumberConversion = sp_runtime::traits::Identity; - type Randomness = RandomnessCollectiveFlip; - type ActiveParachains = Registrar; - type Registrar = Registrar; - type MaxCodeSize = MaxCodeSize; - type MaxHeadDataSize = MaxHeadDataSize; - - type ValidationUpgradeFrequency = ValidationUpgradeFrequency; - type ValidationUpgradeDelay = ValidationUpgradeDelay; - type SlashPeriod = SlashPeriod; - - type Proof = sp_session::MembershipProof; - type KeyOwnerProofSystem = pallet_session::historical::Module; - type IdentificationTuple = )>>::IdentificationTuple; - type ReportOffence = Offences; - type BlockHashConversion = sp_runtime::traits::Identity; -} - -/// Submits a transaction with the node's public and signature type. Adheres to the signed extension -/// format of the chain. -impl frame_system::offchain::CreateSignedTransaction for Runtime where - Call: From, -{ - fn create_transaction>( - call: Call, - public: ::Signer, - account: AccountId, - nonce: ::Index, - ) -> Option<(Call, ::SignaturePayload)> { - // take the biggest period possible. - let period = BlockHashCount::get() - .checked_next_power_of_two() - .map(|c| c / 2) - .unwrap_or(2) as u64; - - let current_block = System::block_number() - .saturated_into::() - // The `System::block_number` is initialized with `n+1`, - // so the actual block number is `n`. - .saturating_sub(1); - let tip = 0; - let extra: SignedExtra = ( - frame_system::CheckSpecVersion::::new(), - frame_system::CheckTxVersion::::new(), - frame_system::CheckGenesis::::new(), - frame_system::CheckMortality::::from(generic::Era::mortal(period, current_block)), - frame_system::CheckNonce::::from(nonce), - frame_system::CheckWeight::::new(), - pallet_transaction_payment::ChargeTransactionPayment::::from(tip), - registrar::LimitParathreadCommits::::new(), - parachains::ValidateDoubleVoteReports::::new(), - ); - let raw_payload = SignedPayload::new(call, extra).map_err(|e| { - debug::warn!("Unable to create signed payload: {:?}", e); - }).ok()?; - let signature = raw_payload.using_encoded(|payload| { - C::sign(payload, public) - })?; - let (call, extra, _) = raw_payload.deconstruct(); - Some((call, (account, signature, extra))) - } -} - -impl frame_system::offchain::SigningTypes for Runtime { - type Public = ::Signer; - type Signature = Signature; -} - -impl frame_system::offchain::SendTransactionTypes for Runtime where - Call: From, -{ - type OverarchingCall = Call; - type Extrinsic = UncheckedExtrinsic; -} - -parameter_types! { - pub const ParathreadDeposit: Balance = 5 * DOLLARS; - pub const QueueSize: usize = 2; - pub const MaxRetries: u32 = 3; -} - -impl registrar::Trait for Runtime { - type Event = Event; - type Origin = Origin; - type Currency = Balances; - type ParathreadDeposit = ParathreadDeposit; - type SwapAux = (); - type QueueSize = QueueSize; - type MaxRetries = MaxRetries; -} - -parameter_types! { - // Minimum 100 bytes/KSM deposited (1 CENT/byte) - pub const BasicDeposit: Balance = 10 * DOLLARS; // 258 bytes on-chain - pub const FieldDeposit: Balance = 250 * CENTS; // 66 bytes on-chain - pub const SubAccountDeposit: Balance = 2 * DOLLARS; // 53 bytes on-chain - pub const MaxSubAccounts: u32 = 100; - pub const MaxAdditionalFields: u32 = 100; - pub const MaxRegistrars: u32 = 20; -} - -impl pallet_identity::Trait for Runtime { - type Event = Event; - type Currency = Balances; - type Slashed = (); - type BasicDeposit = BasicDeposit; - type FieldDeposit = FieldDeposit; - type SubAccountDeposit = SubAccountDeposit; - type MaxSubAccounts = MaxSubAccounts; - type MaxAdditionalFields = MaxAdditionalFields; - type MaxRegistrars = MaxRegistrars; - type RegistrarOrigin = frame_system::EnsureRoot; - type ForceOrigin = frame_system::EnsureRoot; - type WeightInfo = (); -} - -impl pallet_utility::Trait for Runtime { - type Event = Event; - type Call = Call; - type WeightInfo = (); -} - -parameter_types! { - // One storage item; key size is 32; value is size 4+4+16+32 bytes = 56 bytes. - pub const DepositBase: Balance = deposit(1, 88); - // Additional storage item size of 32 bytes. - pub const DepositFactor: Balance = deposit(0, 32); - pub const MaxSignatories: u16 = 100; -} - -impl pallet_multisig::Trait for Runtime { - type Event = Event; - type Call = Call; - type Currency = Balances; - type DepositBase = DepositBase; - type DepositFactor = DepositFactor; - type MaxSignatories = MaxSignatories; - type WeightInfo = (); -} - -parameter_types! { - pub const ConfigDepositBase: Balance = 5 * DOLLARS; - pub const FriendDepositFactor: Balance = 50 * CENTS; - pub const MaxFriends: u16 = 9; - pub const RecoveryDeposit: Balance = 5 * DOLLARS; -} - -impl pallet_recovery::Trait for Runtime { - type Event = Event; - type Call = Call; - type Currency = Balances; - type ConfigDepositBase = ConfigDepositBase; - type FriendDepositFactor = FriendDepositFactor; - type MaxFriends = MaxFriends; - type RecoveryDeposit = RecoveryDeposit; -} - -parameter_types! { - pub const MinVestedTransfer: Balance = 100 * DOLLARS; -} - -impl pallet_vesting::Trait for Runtime { - type Event = Event; - type Currency = Balances; - type BlockNumberToBalance = ConvertInto; - type MinVestedTransfer = MinVestedTransfer; - type WeightInfo = (); -} - -impl pallet_sudo::Trait for Runtime { - type Event = Event; - type Call = Call; -} - -parameter_types! { - // One storage item; key size 32, value size 8; . - pub const ProxyDepositBase: Balance = deposit(1, 8); - // Additional storage item size of 33 bytes. - pub const ProxyDepositFactor: Balance = deposit(0, 33); - pub const MaxProxies: u16 = 32; -} - -/// The type used to represent the kinds of proxying allowed. -#[derive(Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Encode, Decode, RuntimeDebug)] -pub enum ProxyType { - Any, - NonTransfer, - SudoBalances, - IdentityJudgement, -} -impl Default for ProxyType { fn default() -> Self { Self::Any } } -impl InstanceFilter for ProxyType { - fn filter(&self, c: &Call) -> bool { - match self { - ProxyType::Any => true, - ProxyType::NonTransfer => matches!(c, - Call::System(..) | - Call::Babe(..) | - Call::Timestamp(..) | - Call::Indices(pallet_indices::Call::claim(..)) | - Call::Indices(pallet_indices::Call::free(..)) | - Call::Indices(pallet_indices::Call::freeze(..)) | - // Specifically omitting Indices `transfer`, `force_transfer` - // Specifically omitting the entire Balances pallet - Call::Authorship(..) | - Call::Offences(..) | - Call::Session(..) | - Call::FinalityTracker(..) | - Call::Grandpa(..) | - Call::ImOnline(..) | - Call::AuthorityDiscovery(..) | - Call::Parachains(..) | - Call::Attestations(..) | - Call::Registrar(..) | - Call::Utility(..) | - Call::Identity(..) | - Call::Recovery(pallet_recovery::Call::as_recovered(..)) | - Call::Recovery(pallet_recovery::Call::vouch_recovery(..)) | - Call::Recovery(pallet_recovery::Call::claim_recovery(..)) | - Call::Recovery(pallet_recovery::Call::close_recovery(..)) | - Call::Recovery(pallet_recovery::Call::remove_recovery(..)) | - Call::Recovery(pallet_recovery::Call::cancel_recovered(..)) | - // Specifically omitting Recovery `create_recovery`, `initiate_recovery` - Call::Vesting(pallet_vesting::Call::vest(..)) | - Call::Vesting(pallet_vesting::Call::vest_other(..)) | - // Specifically omitting Vesting `vested_transfer`, and `force_vested_transfer` - Call::Scheduler(..) | - // Specifically omitting Sudo pallet - Call::Proxy(..) | - Call::Multisig(..) - ), - ProxyType::SudoBalances => match c { - Call::Sudo(pallet_sudo::Call::sudo(ref x)) => matches!(x.as_ref(), &Call::Balances(..)), - Call::Utility(..) => true, - _ => false, - }, - ProxyType::IdentityJudgement => matches!(c, - Call::Identity(pallet_identity::Call::provide_judgement(..)) - | Call::Utility(pallet_utility::Call::batch(..)) - ) - } - } - fn is_superset(&self, o: &Self) -> bool { - match (self, o) { - (x, y) if x == y => true, - (ProxyType::Any, _) => true, - (_, ProxyType::Any) => false, - (ProxyType::NonTransfer, _) => true, - _ => false, - } - } -} - -impl pallet_proxy::Trait for Runtime { - type Event = Event; - type Call = Call; - type Currency = Balances; - type ProxyType = ProxyType; - type ProxyDepositBase = ProxyDepositBase; - type ProxyDepositFactor = ProxyDepositFactor; - type MaxProxies = MaxProxies; - type WeightInfo = (); -} - -construct_runtime! { - pub enum Runtime where - Block = Block, - NodeBlock = primitives::v0::Block, - UncheckedExtrinsic = UncheckedExtrinsic - { - // Basic stuff; balances is uncallable initially. - System: frame_system::{Module, Call, Storage, Config, Event}, - RandomnessCollectiveFlip: pallet_randomness_collective_flip::{Module, Storage}, - - // Must be before session. - Babe: pallet_babe::{Module, Call, Storage, Config, Inherent, ValidateUnsigned}, - - Timestamp: pallet_timestamp::{Module, Call, Storage, Inherent}, - Indices: pallet_indices::{Module, Call, Storage, Config, Event}, - Balances: pallet_balances::{Module, Call, Storage, Config, Event}, - TransactionPayment: pallet_transaction_payment::{Module, Storage}, - - // Consensus support. - Authorship: pallet_authorship::{Module, Call, Storage}, - Offences: pallet_offences::{Module, Call, Storage, Event}, - Historical: session_historical::{Module}, - Session: pallet_session::{Module, Call, Storage, Event, Config}, - FinalityTracker: pallet_finality_tracker::{Module, Call, Storage, Inherent}, - Grandpa: pallet_grandpa::{Module, Call, Storage, Config, Event, ValidateUnsigned}, - ImOnline: pallet_im_online::{Module, Call, Storage, Event, ValidateUnsigned, Config}, - AuthorityDiscovery: pallet_authority_discovery::{Module, Call, Config}, - - // Parachains stuff; slots are disabled (no auctions initially). The rest are safe as they - // have no public dispatchables. - Parachains: parachains::{Module, Call, Storage, Config, Inherent, Origin}, - Attestations: attestations::{Module, Call, Storage}, - Registrar: registrar::{Module, Call, Storage, Event, Config}, - - // Utility module. - Utility: pallet_utility::{Module, Call, Event}, - - // Less simple identity module. - Identity: pallet_identity::{Module, Call, Storage, Event}, - - // Social recovery module. - Recovery: pallet_recovery::{Module, Call, Storage, Event}, - - // Vesting. Usable initially, but removed once all vesting is finished. - Vesting: pallet_vesting::{Module, Call, Storage, Event, Config}, - - // System scheduler. - Scheduler: pallet_scheduler::{Module, Call, Storage, Event}, - - // Sudo. - Sudo: pallet_sudo::{Module, Call, Storage, Event, Config}, - - // Proxy module. Late addition. - Proxy: pallet_proxy::{Module, Call, Storage, Event}, - - // Multisig module. Late addition. - Multisig: pallet_multisig::{Module, Call, Storage, Event}, - } -} - -/// The address format for describing accounts. -pub type Address = AccountId; -/// Block header type as expected by this runtime. -pub type Header = generic::Header; -/// Block type as expected by this runtime. -pub type Block = generic::Block; -/// A Block signed with a Justification -pub type SignedBlock = generic::SignedBlock; -/// BlockId type as expected by this runtime. -pub type BlockId = generic::BlockId; -/// The SignedExtension to the basic transaction logic. -pub type SignedExtra = ( - frame_system::CheckSpecVersion, - frame_system::CheckTxVersion, - frame_system::CheckGenesis, - frame_system::CheckMortality, - frame_system::CheckNonce, - frame_system::CheckWeight, - pallet_transaction_payment::ChargeTransactionPayment, - registrar::LimitParathreadCommits, - parachains::ValidateDoubleVoteReports, -); -/// Unchecked extrinsic type as expected by this runtime. -pub type UncheckedExtrinsic = generic::UncheckedExtrinsic; -/// Extrinsic type that has already been checked. -pub type CheckedExtrinsic = generic::CheckedExtrinsic; -/// Executive: handles dispatch to the various modules. -pub type Executive = frame_executive::Executive, Runtime, AllModules>; -/// The payload being signed in transactions. -pub type SignedPayload = generic::SignedPayload; - -#[cfg(not(feature = "disable-runtime-api"))] -sp_api::impl_runtime_apis! { - impl sp_api::Core for Runtime { - fn version() -> RuntimeVersion { - VERSION - } - - fn execute_block(block: Block) { - Executive::execute_block(block) - } - - fn initialize_block(header: &::Header) { - Executive::initialize_block(header) - } - } - - impl sp_api::Metadata for Runtime { - fn metadata() -> OpaqueMetadata { - Runtime::metadata().into() - } - } - - impl block_builder_api::BlockBuilder for Runtime { - fn apply_extrinsic(extrinsic: ::Extrinsic) -> ApplyExtrinsicResult { - Executive::apply_extrinsic(extrinsic) - } - - fn finalize_block() -> ::Header { - Executive::finalize_block() - } - - fn inherent_extrinsics(data: inherents::InherentData) -> Vec<::Extrinsic> { - data.create_extrinsics() - } - - fn check_inherents( - block: Block, - data: inherents::InherentData, - ) -> inherents::CheckInherentsResult { - data.check_extrinsics(&block) - } - - fn random_seed() -> ::Hash { - RandomnessCollectiveFlip::random_seed() - } - } - - impl tx_pool_api::runtime_api::TaggedTransactionQueue for Runtime { - fn validate_transaction( - source: TransactionSource, - tx: ::Extrinsic, - ) -> TransactionValidity { - Executive::validate_transaction(source, tx) - } - } - - impl offchain_primitives::OffchainWorkerApi for Runtime { - fn offchain_worker(header: &::Header) { - Executive::offchain_worker(header) - } - } - - impl parachain::ParachainHost for Runtime { - fn validators() -> Vec { - Parachains::authorities() - } - fn duty_roster() -> parachain::DutyRoster { - Parachains::calculate_duty_roster().0 - } - fn active_parachains() -> Vec<(parachain::Id, Option<(parachain::CollatorId, parachain::Retriable)>)> { - Registrar::active_paras() - } - fn global_validation_data() -> parachain::GlobalValidationData { - Parachains::global_validation_data() - } - fn local_validation_data(id: parachain::Id) -> Option { - Parachains::current_local_validation_data(&id) - } - fn parachain_code(id: parachain::Id) -> Option { - Parachains::parachain_code(&id) - } - fn get_heads(extrinsics: Vec<::Extrinsic>) - -> Option> - { - extrinsics - .into_iter() - .find_map(|ex| match UncheckedExtrinsic::decode(&mut ex.encode().as_slice()) { - Ok(ex) => match ex.function { - Call::Parachains(ParachainsCall::set_heads(heads)) => { - Some(heads.into_iter().map(|c| c.candidate).collect()) - } - _ => None, - } - Err(_) => None, - }) - } - fn signing_context() -> SigningContext { - Parachains::signing_context() - } - fn downward_messages(id: parachain::Id) -> Vec { - Parachains::downward_messages(id) - } - } - - impl fg_primitives::GrandpaApi for Runtime { - fn grandpa_authorities() -> Vec<(GrandpaId, u64)> { - Grandpa::grandpa_authorities() - } - - fn submit_report_equivocation_unsigned_extrinsic( - equivocation_proof: fg_primitives::EquivocationProof< - ::Hash, - sp_runtime::traits::NumberFor, - >, - key_owner_proof: fg_primitives::OpaqueKeyOwnershipProof, - ) -> Option<()> { - let key_owner_proof = key_owner_proof.decode()?; - - Grandpa::submit_unsigned_equivocation_report( - equivocation_proof, - key_owner_proof, - ) - } - - fn generate_key_ownership_proof( - _set_id: fg_primitives::SetId, - authority_id: fg_primitives::AuthorityId, - ) -> Option { - use codec::Encode; - - Historical::prove((fg_primitives::KEY_TYPE, authority_id)) - .map(|p| p.encode()) - .map(fg_primitives::OpaqueKeyOwnershipProof::new) - } - } - - impl babe_primitives::BabeApi for Runtime { - fn configuration() -> babe_primitives::BabeGenesisConfiguration { - // The choice of `c` parameter (where `1 - c` represents the - // probability of a slot being empty), is done in accordance to the - // slot duration and expected target block time, for safely - // resisting network delays of maximum two seconds. - // - babe_primitives::BabeGenesisConfiguration { - slot_duration: Babe::slot_duration(), - epoch_length: EpochDuration::get(), - c: PRIMARY_PROBABILITY, - genesis_authorities: Babe::authorities(), - randomness: Babe::randomness(), - allowed_slots: babe_primitives::AllowedSlots::PrimaryAndSecondaryPlainSlots, - } - } - - fn current_epoch_start() -> babe_primitives::SlotNumber { - Babe::current_epoch_start() - } - - fn generate_key_ownership_proof( - _slot_number: babe_primitives::SlotNumber, - authority_id: babe_primitives::AuthorityId, - ) -> Option { - use codec::Encode; - - Historical::prove((babe_primitives::KEY_TYPE, authority_id)) - .map(|p| p.encode()) - .map(babe_primitives::OpaqueKeyOwnershipProof::new) - } - - fn submit_report_equivocation_unsigned_extrinsic( - equivocation_proof: babe_primitives::EquivocationProof<::Header>, - key_owner_proof: babe_primitives::OpaqueKeyOwnershipProof, - ) -> Option<()> { - let key_owner_proof = key_owner_proof.decode()?; - - Babe::submit_unsigned_equivocation_report( - equivocation_proof, - key_owner_proof, - ) - } - } - - impl authority_discovery_primitives::AuthorityDiscoveryApi for Runtime { - fn authorities() -> Vec { - AuthorityDiscovery::authorities() - } - } - - impl sp_session::SessionKeys for Runtime { - fn generate_session_keys(seed: Option>) -> Vec { - SessionKeys::generate(seed) - } - - fn decode_session_keys( - encoded: Vec, - ) -> Option, sp_core::crypto::KeyTypeId)>> { - SessionKeys::decode_into_raw_public_keys(&encoded) - } - } - - impl frame_system_rpc_runtime_api::AccountNonceApi for Runtime { - fn account_nonce(account: AccountId) -> Nonce { - System::account_nonce(account) - } - } - - impl pallet_transaction_payment_rpc_runtime_api::TransactionPaymentApi< - Block, - Balance, - > for Runtime { - fn query_info(uxt: ::Extrinsic, len: u32) -> RuntimeDispatchInfo { - TransactionPayment::query_info(uxt, len) - } - } - - #[cfg(feature = "runtime-benchmarks")] - impl frame_benchmarking::Benchmark for Runtime { - fn dispatch_benchmark( - pallet: Vec, - benchmark: Vec, - lowest_range_values: Vec, - highest_range_values: Vec, - steps: Vec, - repeat: u32, - ) -> Result, RuntimeString> { - use frame_benchmarking::{Benchmarking, BenchmarkBatch, add_benchmark}; - // Trying to add benchmarks directly to the Session Pallet caused cyclic dependency issues. - // To get around that, we separated the Session benchmarks into its own crate, which is why - // we need these two lines below. - use pallet_session_benchmarking::Module as SessionBench; - use pallet_offences_benchmarking::Module as OffencesBench; - use frame_system_benchmarking::Module as SystemBench; - - impl pallet_session_benchmarking::Trait for Runtime {} - impl pallet_offences_benchmarking::Trait for Runtime {} - impl frame_system_benchmarking::Trait for Runtime {} - - let whitelist: Vec> = vec![ - // Block Number - // frame_system::Number::::hashed_key().to_vec(), - hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef702a5c1b19ab7a04f536c519aca4983ac").to_vec(), - // Total Issuance - hex_literal::hex!("c2261276cc9d1f8598ea4b6a74b15c2f57c875e4cff74148e4628f264b974c80").to_vec(), - // Execution Phase - hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef7ff553b5a9862a516939d82b3d3d8661a").to_vec(), - // Event Count - hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef70a98fdbe9ce6c55837576c60c7af3850").to_vec(), - // System Events - hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef780d41e5e16056765bc8461851072c9d7").to_vec(), - // Caller 0 Account - hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da946c154ffd9992e395af90b5b13cc6f295c77033fce8a9045824a6690bbf99c6db269502f0a8d1d2a008542d5690a0749").to_vec(), - // Treasury Account - hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da95ecffd7b6c0f78751baa9d281e0bfa3a6d6f646c70792f74727372790000000000000000000000000000000000000000").to_vec(), - ]; - - let mut batches = Vec::::new(); - let params = (&pallet, &benchmark, &lowest_range_values, &highest_range_values, &steps, repeat, &whitelist); - - add_benchmark!(params, batches, pallet_balances, Balances); - add_benchmark!(params, batches, pallet_identity, Identity); - add_benchmark!(params, batches, pallet_im_online, ImOnline); - add_benchmark!(params, batches, pallet_offences, OffencesBench::); - add_benchmark!(params, batches, pallet_scheduler, Scheduler); - add_benchmark!(params, batches, pallet_session, SessionBench::); - add_benchmark!(params, batches, pallet_staking, Staking); - add_benchmark!(params, batches, frame_system, SystemBench::); - add_benchmark!(params, batches, pallet_timestamp, Timestamp); - add_benchmark!(params, batches, pallet_utility, Utility); - add_benchmark!(params, batches, pallet_vesting, Vesting); - - if batches.is_empty() { return Err("Benchmark not found for this pallet.".into()) } - Ok(batches) - } - } -} diff --git a/runtime/test-runtime/client/src/lib.rs b/runtime/test-runtime/client/src/lib.rs index 704c8b498d..698de3d3cf 100644 --- a/runtime/test-runtime/client/src/lib.rs +++ b/runtime/test-runtime/client/src/lib.rs @@ -326,20 +326,13 @@ pub fn new_native_executor() -> sc_executor::NativeExecutor { /// The index of the block must be provided to calculate a valid timestamp for the block. The value starts at 0 and /// should be incremented by one for every block produced. pub fn needed_extrinsics( - heads: Vec, i: u64, ) -> Vec { - use polkadot_runtime_common::parachains; - let timestamp = std::time::SystemTime::now().duration_since(std::time::UNIX_EPOCH) .expect("now always later than unix epoch; qed") .as_millis() + (i * polkadot_test_runtime::constants::time::SLOT_DURATION / 2) as u128; vec![ - polkadot_test_runtime::UncheckedExtrinsic { - function: polkadot_test_runtime::Call::Parachains(parachains::Call::set_heads(heads)), - signature: None, - }, polkadot_test_runtime::UncheckedExtrinsic { function: polkadot_test_runtime::Call::Timestamp(pallet_timestamp::Call::set( u64::try_from(timestamp).expect("unexpected big timestamp"), diff --git a/runtime/test-runtime/src/lib.rs b/runtime/test-runtime/src/lib.rs index 18df03333c..ce20c720e1 100644 --- a/runtime/test-runtime/src/lib.rs +++ b/runtime/test-runtime/src/lib.rs @@ -22,27 +22,25 @@ use rstd::prelude::*; use codec::{Encode, Decode}; -use primitives::v0::{ - self as parachain, +use primitives::v0 as p_v0; +use primitives::v1::{ AccountId, AccountIndex, Balance, BlockNumber, Hash as HashT, Nonce, Signature, Moment, - ActiveParas, AbridgedCandidateReceipt, SigningContext, ValidityError, }; use runtime_common::{ - attestations, claims, parachains, registrar, slots, SlowAdjustingFeeUpdate, - impls::CurrencyToVoteHandler, + claims, SlowAdjustingFeeUpdate, impls::CurrencyToVoteHandler, BlockHashCount, MaximumBlockWeight, AvailableBlockRatio, - MaximumBlockLength, BlockExecutionWeight, ExtrinsicBaseWeight, + MaximumBlockLength, BlockExecutionWeight, ExtrinsicBaseWeight, ParachainSessionKeyPlaceholder, }; use sp_runtime::{ create_runtime_str, generic, impl_opaque_keys, - ApplyExtrinsicResult, Perbill, RuntimeDebug, KeyTypeId, + ApplyExtrinsicResult, Perbill, KeyTypeId, transaction_validity::{ - TransactionValidity, InvalidTransaction, TransactionValidityError, TransactionSource, TransactionPriority, + TransactionValidity, TransactionSource, TransactionPriority, }, curve::PiecewiseLinear, traits::{ - BlakeTwo256, Block as BlockT, StaticLookup, SignedExtension, OpaqueKeys, ConvertInto, - DispatchInfoOf, Extrinsic as ExtrinsicT, SaturatedConversion, Verify, + BlakeTwo256, Block as BlockT, StaticLookup, OpaqueKeys, ConvertInto, + Extrinsic as ExtrinsicT, SaturatedConversion, Verify, }, }; use sp_version::RuntimeVersion; @@ -66,8 +64,6 @@ pub use pallet_staking::StakerStatus; pub use sp_runtime::BuildStorage; pub use pallet_timestamp::Call as TimestampCall; pub use pallet_balances::Call as BalancesCall; -pub use attestations::{Call as AttestationsCall, MORE_ATTESTATIONS_IDENTIFIER}; -pub use parachains::Call as ParachainsCall; /// Constant values used within the runtime. pub mod constants; @@ -97,35 +93,6 @@ pub fn native_version() -> NativeVersion { } } -/// Avoid processing transactions from slots and parachain registrar. -#[derive(Default, Encode, Decode, Clone, Eq, PartialEq, RuntimeDebug)] -pub struct RestrictFunctionality; -impl SignedExtension for RestrictFunctionality { - const IDENTIFIER: &'static str = "RestrictFunctionality"; - type AccountId = AccountId; - type Call = Call; - type AdditionalSigned = (); - type Pre = (); - - fn additional_signed(&self) -> rstd::result::Result<(), TransactionValidityError> { Ok(()) } - - fn validate( - &self, - _: &Self::AccountId, - call: &Self::Call, - _: &DispatchInfoOf, - _: usize - ) - -> TransactionValidity - { - match call { - Call::Slots(_) | Call::Registrar(_) - => Err(InvalidTransaction::Custom(ValidityError::NoPermission.into()).into()), - _ => Ok(Default::default()), - } - } -} - parameter_types! { pub const Version: RuntimeVersion = VERSION; } @@ -261,7 +228,7 @@ impl_opaque_keys! { pub struct SessionKeys { pub grandpa: Grandpa, pub babe: Babe, - pub parachain_validator: Parachains, + pub parachain_validator: ParachainSessionKeyPlaceholder, } } @@ -356,50 +323,6 @@ impl pallet_grandpa::Trait for Runtime { type HandleEquivocation = (); } -parameter_types! { - pub const AttestationPeriod: BlockNumber = 50; -} - -impl attestations::Trait for Runtime { - type AttestationPeriod = AttestationPeriod; - type ValidatorIdentities = parachains::ValidatorIdentities; - type RewardAttestation = Staking; -} - -parameter_types! { - pub storage MaxCodeSize: u32 = 10 * 1024 * 1024; // 10 MB - pub storage MaxHeadDataSize: u32 = 20 * 1024; // 20 KB - - pub storage ValidationUpgradeFrequency: BlockNumber = 2; - pub storage ValidationUpgradeDelay: BlockNumber = 1; - pub storage SlashPeriod: BlockNumber = 1 * MINUTES; -} - -impl parachains::Trait for Runtime { - type AuthorityId = primitives::v0::fisherman::FishermanAppCrypto; - type Origin = Origin; - type Call = Call; - type ParachainCurrency = Balances; - type BlockNumberConversion = sp_runtime::traits::Identity; - type Randomness = RandomnessCollectiveFlip; - type ActiveParachains = Registrar; - type Registrar = Registrar; - type MaxCodeSize = MaxCodeSize; - type MaxHeadDataSize = MaxHeadDataSize; - - type ValidationUpgradeFrequency = ValidationUpgradeFrequency; - type ValidationUpgradeDelay = ValidationUpgradeDelay; - type SlashPeriod = SlashPeriod; - - type Proof = sp_session::MembershipProof; - type KeyOwnerProofSystem = pallet_session::historical::Module; - type IdentificationTuple = < - Self::KeyOwnerProofSystem as KeyOwnerProofSystem<(KeyTypeId, Vec)> - >::IdentificationTuple; - type ReportOffence = Offences; - type BlockHashConversion = sp_runtime::traits::Identity; -} - impl frame_system::offchain::CreateSignedTransaction for Runtime where Call: From, { @@ -419,7 +342,6 @@ impl frame_system::offchain::CreateSignedTransaction for R .saturating_sub(1); let tip = 0; let extra: SignedExtra = ( - RestrictFunctionality, frame_system::CheckSpecVersion::::new(), frame_system::CheckTxVersion::::new(), frame_system::CheckGenesis::::new(), @@ -427,8 +349,6 @@ impl frame_system::offchain::CreateSignedTransaction for R frame_system::CheckNonce::::from(nonce), frame_system::CheckWeight::::new(), pallet_transaction_payment::ChargeTransactionPayment::::from(tip), - registrar::LimitParathreadCommits::::new(), - parachains::ValidateDoubleVoteReports::::new(), ); let raw_payload = SignedPayload::new(call, extra).map_err(|e| { debug::warn!("Unable to create signed payload: {:?}", e); @@ -461,36 +381,11 @@ impl pallet_offences::Trait for Runtime { impl pallet_authority_discovery::Trait for Runtime {} -parameter_types! { - pub storage ParathreadDeposit: Balance = 5 * DOLLARS; - pub const QueueSize: usize = 2; - pub storage MaxRetries: u32 = 3; -} - -impl registrar::Trait for Runtime { - type Event = Event; - type Origin = Origin; - type Currency = Balances; - type ParathreadDeposit = ParathreadDeposit; - type SwapAux = Slots; - type QueueSize = QueueSize; - type MaxRetries = MaxRetries; -} - parameter_types! { pub storage LeasePeriod: BlockNumber = 100_000; pub storage EndingPeriod: BlockNumber = 1000; } -impl slots::Trait for Runtime { - type Event = Event; - type Currency = Balances; - type Parachains = Registrar; - type LeasePeriod = LeasePeriod; - type EndingPeriod = EndingPeriod; - type Randomness = RandomnessCollectiveFlip; -} - parameter_types! { pub Prefix: &'static [u8] = b"Pay KSMs to the Kusama account:"; } @@ -522,7 +417,7 @@ impl pallet_sudo::Trait for Runtime { construct_runtime! { pub enum Runtime where Block = Block, - NodeBlock = primitives::v0::Block, + NodeBlock = primitives::v1::Block, UncheckedExtrinsic = UncheckedExtrinsic { // Basic stuff; balances is uncallable initially. @@ -549,13 +444,6 @@ construct_runtime! { // Claims. Usable initially. Claims: claims::{Module, Call, Storage, Event, Config, ValidateUnsigned}, - // Parachains stuff; slots are disabled (no auctions initially). The rest are safe as they - // have no public dispatchables. - Parachains: parachains::{Module, Call, Storage, Config, Inherent, Origin}, - Attestations: attestations::{Module, Call, Storage}, - Slots: slots::{Module, Call, Storage, Event}, - Registrar: registrar::{Module, Call, Storage, Event, Config}, - // Vesting. Usable initially, but removed once all vesting is finished. Vesting: pallet_vesting::{Module, Call, Storage, Event, Config}, @@ -576,7 +464,6 @@ pub type SignedBlock = generic::SignedBlock; pub type BlockId = generic::BlockId; /// The SignedExtension to the basic transaction logic. pub type SignedExtra = ( - RestrictFunctionality, frame_system::CheckSpecVersion, frame_system::CheckTxVersion, frame_system::CheckGenesis, @@ -584,8 +471,6 @@ pub type SignedExtra = ( frame_system::CheckNonce, frame_system::CheckWeight, pallet_transaction_payment::ChargeTransactionPayment::, - registrar::LimitParathreadCommits, - parachains::ValidateDoubleVoteReports, ); /// Unchecked extrinsic type as expected by this runtime. pub type UncheckedExtrinsic = generic::UncheckedExtrinsic; @@ -666,45 +551,55 @@ sp_api::impl_runtime_apis! { } } - impl parachain::ParachainHost for Runtime { - fn validators() -> Vec { - Parachains::authorities() + // Dummy implementation to continue supporting old parachains runtime temporarily. + impl p_v0::ParachainHost for Runtime { + fn validators() -> Vec { + // this is a compile-time check of size equality. note that we don't invoke + // the function and nothing here is unsafe. + let _ = core::mem::transmute::; + + // Yes, these aren't actually the parachain session keys. + // It doesn't matter, but we shouldn't return a zero-sized vector here. + // As there are no parachains + Session::validators() + .into_iter() + .map(|k| k.using_encoded(|s| Decode::decode(&mut &s[..])) + .expect("correct size and raw-bytes; qed")) + .collect() } - fn duty_roster() -> parachain::DutyRoster { - Parachains::calculate_duty_roster().0 + fn duty_roster() -> p_v0::DutyRoster { + let v = Session::validators(); + p_v0::DutyRoster { validator_duty: (0..v.len()).map(|_| p_v0::Chain::Relay).collect() } } - fn active_parachains() -> Vec<(parachain::Id, Option<(parachain::CollatorId, parachain::Retriable)>)> { - Registrar::active_paras() + fn active_parachains() -> Vec<(p_v0::Id, Option<(p_v0::CollatorId, p_v0::Retriable)>)> { + Vec::new() } - fn global_validation_data() -> parachain::GlobalValidationData { - Parachains::global_validation_data() + fn global_validation_data() -> p_v0::GlobalValidationData { + p_v0::GlobalValidationData { + max_code_size: 1, + max_head_data_size: 1, + block_number: System::block_number().saturating_sub(1), + } } - fn local_validation_data(id: parachain::Id) -> Option { - Parachains::current_local_validation_data(&id) + fn local_validation_data(_id: p_v0::Id) -> Option { + None } - fn parachain_code(id: parachain::Id) -> Option { - Parachains::parachain_code(&id) + fn parachain_code(_id: p_v0::Id) -> Option { + None } - fn get_heads(extrinsics: Vec<::Extrinsic>) - -> Option> + fn get_heads(_extrinsics: Vec<::Extrinsic>) + -> Option> { - extrinsics - .into_iter() - .find_map(|ex| match UncheckedExtrinsic::decode(&mut ex.encode().as_slice()) { - Ok(ex) => match ex.function { - Call::Parachains(ParachainsCall::set_heads(heads)) => { - Some(heads.into_iter().map(|c| c.candidate).collect()) - } - _ => None, - } - Err(_) => None, - }) - } - fn signing_context() -> SigningContext { - Parachains::signing_context() - } - fn downward_messages(id: parachain::Id) -> Vec { - Parachains::downward_messages(id) + None + } + fn signing_context() -> p_v0::SigningContext { + p_v0::SigningContext { + parent_hash: System::parent_hash(), + session_index: Session::current_index(), + } + } + fn downward_messages(_id: p_v0::Id) -> Vec { + Vec::new() } } diff --git a/runtime/westend/src/lib.rs b/runtime/westend/src/lib.rs index 30a450d976..7c2b40f08c 100644 --- a/runtime/westend/src/lib.rs +++ b/runtime/westend/src/lib.rs @@ -22,16 +22,16 @@ use sp_std::prelude::*; use codec::{Encode, Decode}; -use primitives::v0::{ - self as parachain, +use primitives::v1::{ AccountId, AccountIndex, Balance, BlockNumber, Hash, Nonce, Signature, Moment, - ActiveParas, AbridgedCandidateReceipt, SigningContext, }; +use primitives::v0 as p_v0; use runtime_common::{ - attestations, parachains, registrar, purchase, SlowAdjustingFeeUpdate, + dummy, purchase, SlowAdjustingFeeUpdate, impls::{CurrencyToVoteHandler, ToAuthor}, BlockHashCount, MaximumBlockWeight, AvailableBlockRatio, MaximumBlockLength, BlockExecutionWeight, ExtrinsicBaseWeight, RocksDbWeight, MaximumExtrinsicWeight, + ParachainSessionKeyPlaceholder, }; use sp_runtime::{ create_runtime_str, generic, impl_opaque_keys, @@ -67,8 +67,6 @@ pub use pallet_staking::StakerStatus; pub use sp_runtime::BuildStorage; pub use pallet_timestamp::Call as TimestampCall; pub use pallet_balances::Call as BalancesCall; -pub use attestations::{Call as AttestationsCall, MORE_ATTESTATIONS_IDENTIFIER}; -pub use parachains::Call as ParachainsCall; /// Constant values used within the runtime. pub mod constants; @@ -86,7 +84,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("westend"), impl_name: create_runtime_str!("parity-westend"), authoring_version: 2, - spec_version: 42, + spec_version: 43, impl_version: 0, #[cfg(not(feature = "disable-runtime-api"))] apis: RUNTIME_API_VERSIONS, @@ -104,11 +102,11 @@ pub fn native_version() -> NativeVersion { } } -/// Avoid processing transactions from slots and parachain registrar. +/// Accept all transactions. pub struct BaseFilter; impl Filter for BaseFilter { - fn filter(call: &Call) -> bool { - !matches!(call, Call::Registrar(_)) + fn filter(_: &Call) -> bool { + true } } @@ -251,7 +249,7 @@ impl_opaque_keys! { pub grandpa: Grandpa, pub babe: Babe, pub im_online: ImOnline, - pub parachain_validator: Parachains, + pub parachain_validator: ParachainSessionKeyPlaceholder, pub authority_discovery: AuthorityDiscovery, } } @@ -401,47 +399,6 @@ impl pallet_finality_tracker::Trait for Runtime { type ReportLatency = ReportLatency; } -parameter_types! { - pub const AttestationPeriod: BlockNumber = 50; -} - -impl attestations::Trait for Runtime { - type AttestationPeriod = AttestationPeriod; - type ValidatorIdentities = parachains::ValidatorIdentities; - type RewardAttestation = Staking; -} - -parameter_types! { - pub const MaxCodeSize: u32 = 10 * 1024 * 1024; // 10 MB - pub const MaxHeadDataSize: u32 = 20 * 1024; // 20 KB - pub const ValidationUpgradeFrequency: BlockNumber = 2 * DAYS; - pub const ValidationUpgradeDelay: BlockNumber = 8 * HOURS; - pub const SlashPeriod: BlockNumber = 7 * DAYS; -} - -impl parachains::Trait for Runtime { - type AuthorityId = primitives::v0::fisherman::FishermanAppCrypto; - type Origin = Origin; - type Call = Call; - type ParachainCurrency = Balances; - type BlockNumberConversion = sp_runtime::traits::Identity; - type Randomness = RandomnessCollectiveFlip; - type ActiveParachains = Registrar; - type Registrar = Registrar; - type MaxCodeSize = MaxCodeSize; - type MaxHeadDataSize = MaxHeadDataSize; - - type ValidationUpgradeFrequency = ValidationUpgradeFrequency; - type ValidationUpgradeDelay = ValidationUpgradeDelay; - type SlashPeriod = SlashPeriod; - - type Proof = sp_session::MembershipProof; - type KeyOwnerProofSystem = pallet_session::historical::Module; - type IdentificationTuple = )>>::IdentificationTuple; - type ReportOffence = Offences; - type BlockHashConversion = sp_runtime::traits::Identity; -} - /// Submits a transaction with the node's public and signature type. Adheres to the signed extension /// format of the chain. impl frame_system::offchain::CreateSignedTransaction for Runtime where @@ -473,8 +430,6 @@ impl frame_system::offchain::CreateSignedTransaction for R frame_system::CheckNonce::::from(nonce), frame_system::CheckWeight::::new(), pallet_transaction_payment::ChargeTransactionPayment::::from(tip), - registrar::LimitParathreadCommits::::new(), - parachains::ValidateDoubleVoteReports::::new(), ); let raw_payload = SignedPayload::new(call, extra).map_err(|e| { debug::warn!("Unable to create signed payload: {:?}", e); @@ -499,22 +454,6 @@ impl frame_system::offchain::SendTransactionTypes for Runtime where type Extrinsic = UncheckedExtrinsic; } -parameter_types! { - pub const ParathreadDeposit: Balance = 5 * DOLLARS; - pub const QueueSize: usize = 2; - pub const MaxRetries: u32 = 3; -} - -impl registrar::Trait for Runtime { - type Event = Event; - type Origin = Origin; - type Currency = Balances; - type ParathreadDeposit = ParathreadDeposit; - type SwapAux = (); - type QueueSize = QueueSize; - type MaxRetries = MaxRetries; -} - parameter_types! { // Minimum 100 bytes/KSM deposited (1 CENT/byte) pub const BasicDeposit: Balance = 10 * DOLLARS; // 258 bytes on-chain @@ -637,9 +576,9 @@ impl InstanceFilter for ProxyType { Call::Grandpa(..) | Call::ImOnline(..) | Call::AuthorityDiscovery(..) | - Call::Parachains(..) | - Call::Attestations(..) | - Call::Registrar(..) | + Call::DummyParachains(..) | + Call::DummyAttestations(..) | + Call::DummyRegistrar(..) | Call::Utility(..) | Call::Identity(..) | Call::Recovery(pallet_recovery::Call::as_recovered(..)) | @@ -733,10 +672,12 @@ impl purchase::Trait for Runtime { type MaxUnlocked = MaxUnlocked; } +impl dummy::Trait for Runtime { } + construct_runtime! { pub enum Runtime where Block = Block, - NodeBlock = primitives::v0::Block, + NodeBlock = primitives::v1::Block, UncheckedExtrinsic = UncheckedExtrinsic { // Basic stuff; balances is uncallable initially. @@ -762,11 +703,10 @@ construct_runtime! { ImOnline: pallet_im_online::{Module, Call, Storage, Event, ValidateUnsigned, Config}, AuthorityDiscovery: pallet_authority_discovery::{Module, Call, Config}, - // Parachains stuff; slots are disabled (no auctions initially). The rest are safe as they - // have no public dispatchables. - Parachains: parachains::{Module, Call, Storage, Config, Inherent, Origin}, - Attestations: attestations::{Module, Call, Storage}, - Registrar: registrar::{Module, Call, Storage, Event, Config}, + // Old Parachains stuff. All dummies to avoid messing up the transaction indices. + DummyParachains: dummy::::{Module, Call}, + DummyAttestations: dummy::::{Module, Call}, + DummyRegistrar: dummy::::{Module, Call}, // Utility module. Utility: pallet_utility::{Module, Call, Event}, @@ -816,8 +756,6 @@ pub type SignedExtra = ( frame_system::CheckNonce, frame_system::CheckWeight, pallet_transaction_payment::ChargeTransactionPayment, - registrar::LimitParathreadCommits, - parachains::ValidateDoubleVoteReports, ); /// Unchecked extrinsic type as expected by this runtime. pub type UncheckedExtrinsic = generic::UncheckedExtrinsic; @@ -890,45 +828,55 @@ sp_api::impl_runtime_apis! { } } - impl parachain::ParachainHost for Runtime { - fn validators() -> Vec { - Parachains::authorities() + // Dummy implementation to continue supporting old parachains runtime temporarily. + impl p_v0::ParachainHost for Runtime { + fn validators() -> Vec { + // this is a compile-time check of size equality. note that we don't invoke + // the function and nothing here is unsafe. + let _ = core::mem::transmute::; + + // Yes, these aren't actually the parachain session keys. + // It doesn't matter, but we shouldn't return a zero-sized vector here. + // As there are no parachains + Session::validators() + .into_iter() + .map(|k| k.using_encoded(|s| Decode::decode(&mut &s[..])) + .expect("correct size and raw-bytes; qed")) + .collect() } - fn duty_roster() -> parachain::DutyRoster { - Parachains::calculate_duty_roster().0 + fn duty_roster() -> p_v0::DutyRoster { + let v = Session::validators(); + p_v0::DutyRoster { validator_duty: (0..v.len()).map(|_| p_v0::Chain::Relay).collect() } } - fn active_parachains() -> Vec<(parachain::Id, Option<(parachain::CollatorId, parachain::Retriable)>)> { - Registrar::active_paras() + fn active_parachains() -> Vec<(p_v0::Id, Option<(p_v0::CollatorId, p_v0::Retriable)>)> { + Vec::new() } - fn global_validation_data() -> parachain::GlobalValidationData { - Parachains::global_validation_data() + fn global_validation_data() -> p_v0::GlobalValidationData { + p_v0::GlobalValidationData { + max_code_size: 1, + max_head_data_size: 1, + block_number: System::block_number().saturating_sub(1), + } } - fn local_validation_data(id: parachain::Id) -> Option { - Parachains::current_local_validation_data(&id) + fn local_validation_data(_id: p_v0::Id) -> Option { + None } - fn parachain_code(id: parachain::Id) -> Option { - Parachains::parachain_code(&id) + fn parachain_code(_id: p_v0::Id) -> Option { + None } - fn get_heads(extrinsics: Vec<::Extrinsic>) - -> Option> + fn get_heads(_extrinsics: Vec<::Extrinsic>) + -> Option> { - extrinsics - .into_iter() - .find_map(|ex| match UncheckedExtrinsic::decode(&mut ex.encode().as_slice()) { - Ok(ex) => match ex.function { - Call::Parachains(ParachainsCall::set_heads(heads)) => { - Some(heads.into_iter().map(|c| c.candidate).collect()) - } - _ => None, - } - Err(_) => None, - }) + None } - fn signing_context() -> SigningContext { - Parachains::signing_context() + fn signing_context() -> p_v0::SigningContext { + p_v0::SigningContext { + parent_hash: System::parent_hash(), + session_index: Session::current_index(), + } } - fn downward_messages(id: parachain::Id) -> Vec { - Parachains::downward_messages(id) + fn downward_messages(_id: p_v0::Id) -> Vec { + Vec::new() } } diff --git a/service/Cargo.toml b/service/Cargo.toml index c5dd68e57f..bdc0920eb2 100644 --- a/service/Cargo.toml +++ b/service/Cargo.toml @@ -18,7 +18,6 @@ polkadot-primitives = { path = "../primitives" } polkadot-runtime = { path = "../runtime/polkadot" } kusama-runtime = { path = "../runtime/kusama" } westend-runtime = { path = "../runtime/westend" } -rococo-runtime = { path = "../runtime/rococo" } polkadot-network = { path = "../network", optional = true } polkadot-rpc = { path = "../rpc" } sp-io = { git = "https://github.com/paritytech/substrate", branch = "master" } diff --git a/service/res/rococo.json b/service/res/rococo.json deleted file mode 100644 index b936bcc1c3..0000000000 --- a/service/res/rococo.json +++ /dev/null @@ -1,116 +0,0 @@ -{ - "name": "Rococo", - "id": "rococo_v1", - "chainType": "Live", - "bootNodes": [ - "/ip4/34.91.29.196/tcp/30333/p2p/12D3KooWCZ1rNSGeN2dxSQJEipYriwX8g2rjkXJhsf81vqdYE3ZQ", - "/ip4/34.91.29.196/tcp/30334/ws/p2p/12D3KooWCZ1rNSGeN2dxSQJEipYriwX8g2rjkXJhsf81vqdYE3ZQ", - "/ip4/34.91.203.20/tcp/30333/p2p/12D3KooWBgKQTcgKSnyMwUZcv2tRG1qDP5MCGRM4ms4Qpx9o7pWs", - "/ip4/34.91.203.20/tcp/30334/ws/p2p/12D3KooWBgKQTcgKSnyMwUZcv2tRG1qDP5MCGRM4ms4Qpx9o7pWs", - "/ip4/34.91.169.182/tcp/30333/p2p/12D3KooWS9bxULD9v33nxgSbvUCRbN55YHTtBxR6HK1dGV7hLfKG", - "/ip4/34.91.169.182/tcp/30334/ws/p2p/12D3KooWS9bxULD9v33nxgSbvUCRbN55YHTtBxR6HK1dGV7hLfKG", - "/ip4/34.91.84.95/tcp/30333/p2p/12D3KooWDGjLd5tpg1wf4ALzy5P2GSxBWi2h8oa2n2zrGVLuR93Y", - "/ip4/34.91.84.95/tcp/30334/ws/p2p/12D3KooWDGjLd5tpg1wf4ALzy5P2GSxBWi2h8oa2n2zrGVLuR93Y", - "/ip4/34.91.46.116/tcp/30333/p2p/12D3KooWHs116csgZ981dyqqsvKcB6LkaEPVxdQ855KPTJFaVnFQ", - "/ip4/34.91.46.116/tcp/30334/ws/p2p/12D3KooWHs116csgZ981dyqqsvKcB6LkaEPVxdQ855KPTJFaVnFQ", - "/ip4/34.91.139.161/tcp/30333/p2p/12D3KooWDRH31a4HGMn5zkSTpgzCXb9EYsvy28CJ3WsWwg5TD1aH", - "/ip4/34.91.139.161/tcp/30334/ws/p2p/12D3KooWDRH31a4HGMn5zkSTpgzCXb9EYsvy28CJ3WsWwg5TD1aH", - "/ip4/35.204.145.76/tcp/30333/p2p/12D3KooWCQAtT4PK86onHDdZZbqokKVEwr8hbavfoPbXkG9vkN6j", - "/ip4/35.204.145.76/tcp/30334/ws/p2p/12D3KooWCQAtT4PK86onHDdZZbqokKVEwr8hbavfoPbXkG9vkN6j", - "/ip4/34.91.129.35/tcp/30333/p2p/12D3KooWJjwoqM3BbamMdSNevCQfy1LtDf6P58BTFwGo2H9MPHuK", - "/ip4/34.91.129.35/tcp/30334/ws/p2p/12D3KooWJjwoqM3BbamMdSNevCQfy1LtDf6P58BTFwGo2H9MPHuK" - ], - "telemetryEndpoints": [], - "protocolId": "roc", - "properties": { - "ss58Format": 42, - "tokenDecimals": 12, - "tokenSymbol": "ROC" - }, - "forkBlocks": null, - "badBlocks": null, - "consensusEngine": null, - "genesis": { - "raw": { - "top": { - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19507f532159f03d44eb6175646980f49eae66a0ac9f610316906ec8f1a0928e20d7059d76a5ca53cbcb5a9b50dd3c": "0x62475fe5406a7cb6a64c51d0af9d3ab5c2151bcae982fb812f7a76b706914d6a", - "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb319b9aeb2f5add22992ef83665b39d7a565e11bf8d18d41d45a8011601c339e57a8ea88c8ff7bba6f": "0xe1b68fbd84333e31486c08e6153d9a1415b2e7e71b413702b7d64e9b631184a1d2644c1ab2c63a3ad8d40ad70d4b260969e3abfe6d7e6665f50dc9f6365c9d2aee93e26259decb89afcf17ef2aa0fa2db2e1042fb8f56ecfb24d19eae86298786caf2fe2cf01fc3f07e113a2940a1d6c7bc1ab9d8974f152c2ee201d4f16f67a2c57f81fd311c1ab53813c6817fe67f8947f8d39258252663b3384ab4195494d", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19503c0791148c7780b8626162658038757d0de00a0c739e7d7984ef4bc01161bd61e198b7c01b618425c16bb5bd5f": "0x520b48452969f6ddf263b664de0adb0c729d0e0ad3b0e5f3cb636c541bc9022a", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950ef9482dba3e5b0d862616265807c94715e5dd8ab54221b1b6b2bfa5666f593f28a92a18e28052531de1bd80813": "0x02a2d8cfcf75dda85fafc04ace3bcb73160034ed1964c43098fb1fe831de1b16", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da995445d4efb6eae1971fb125f6190c49202a2d8cfcf75dda85fafc04ace3bcb73160034ed1964c43098fb1fe831de1b16": "0x000000000100407a10f35a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950ab7b30d24546522861756469804e262811acdfe94528bfc3c65036080426a0e1301b9ada8d687a70ffcae99c26": "0x8062e9c21f1d92926103119f7e8153cebdb1e5ab3e52d6f395be80bb193eab47", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9935ae9d4cb148940af99a366d100d5af02ea6bfa8b23b92fe4b5db1063a1f9475e3acd0ab61e6b4f454ed6ba00b5f864": "0x000000000100407a10f35a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da945315c068df2baa1c677b9b3e81f7439fa373e25a1c4fe19c7148acde13bc3db1811cf656dc086820f3dda736b9c4a00": "0x000000000100407a10f35a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19509556741f2a8e07d17061726180ac3ce74c09d1bb387d3f79dc8df88d661da689d5364eb8131c83fcc8ecb2fc5b": "0x520b48452969f6ddf263b664de0adb0c729d0e0ad3b0e5f3cb636c541bc9022a", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950f8df002813b43b80696d6f6e80560d90ca51e9c9481b8a9810060e04d0708d246714960439f804e5c6f40ca651": "0xfa373e25a1c4fe19c7148acde13bc3db1811cf656dc086820f3dda736b9c4a00", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950091b1bd4e8d4c12061756469802496f28d887d84705c6dae98aee8bf90fc5ad10bb5545eca1de6b68425b70f7c": "0x38f3c2f38f6d47f161e98c697bbe3ca0e47c033460afda0dda314ab4222a0404", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa195017808c1b0df57d2a7061726180f2d19482d1da872af925e84478787e0719f637bd1f88c0c99316bdf2658d5478": "0x38f3c2f38f6d47f161e98c697bbe3ca0e47c033460afda0dda314ab4222a0404", - "0x2371e21684d2fae99bcb4d579242f74a8a2d09463effcc78a22d75b9cb87dffc": "0x0000000000000000", - "0xcec5070d609dd3497f72bde07fc96ba088dcde934c658227ee1dfafcd6e16903": "0x2062475fe5406a7cb6a64c51d0af9d3ab5c2151bcae982fb812f7a76b706914d6a520b48452969f6ddf263b664de0adb0c729d0e0ad3b0e5f3cb636c541bc9022a92ef83665b39d7a565e11bf8d18d41d45a8011601c339e57a8ea88c8ff7bba6f38f3c2f38f6d47f161e98c697bbe3ca0e47c033460afda0dda314ab4222a040402a2d8cfcf75dda85fafc04ace3bcb73160034ed1964c43098fb1fe831de1b1602ea6bfa8b23b92fe4b5db1063a1f9475e3acd0ab61e6b4f454ed6ba00b5f864fa373e25a1c4fe19c7148acde13bc3db1811cf656dc086820f3dda736b9c4a008062e9c21f1d92926103119f7e8153cebdb1e5ab3e52d6f395be80bb193eab47", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19509df5f4072c4244956261626580764186bc30fd5a02477f19948dc723d6d57ab174debd4f80ed6038ec960bfe21": "0x38f3c2f38f6d47f161e98c697bbe3ca0e47c033460afda0dda314ab4222a0404", - "0x2099d7f109d6e535fb000bba623fd4409f99a2ce711f3a31b2fc05604c93f179": "0x20f49eae66a0ac9f610316906ec8f1a0928e20d7059d76a5ca53cbcb5a9b50dd3cf6f8fe475130d21165446a02fb1dbce3a7bf36412e5d98f4f0473aed9252f3492c57f81fd311c1ab53813c6817fe67f8947f8d39258252663b3384ab4195494d2496f28d887d84705c6dae98aee8bf90fc5ad10bb5545eca1de6b68425b70f7c306ac5c772fe858942f92b6e28bd82fb7dd8cdd25f9a4626c1b0eee075fcb531160ea09c5717270e958a3da42673fa011613a9539b2e4ebcad8626bc117ca04a64d59feddb3d00316a55906953fb3db8985797472bd2e6c7ea1ab730cc339d7f4e262811acdfe94528bfc3c65036080426a0e1301b9ada8d687a70ffcae99c26", - "0x2371e21684d2fae99bcb4d579242f74ad47cb8f5328af743ddfb361e7180e7fcbb1bdbcacd6ac9340000000000000000": "0x00000000", - "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb393c0875f4080dabc8062e9c21f1d92926103119f7e8153cebdb1e5ab3e52d6f395be80bb193eab47": "0x4ee66173993dd0db5d628c4c9cb61a27b76611ad3c3925947f0d0011ee2c5dccda6b2df18f0f9001a6dcf1d301b92534fe9b1f3ccfa10c49449fee93adaa834992156f54a114ee191415898f2da013d9db6a5362d6b36330d5fc23e27360ab666edd19e3c5230998e533e165a26438afe663368d0eab37fabff734a36119ce0e4e262811acdfe94528bfc3c65036080426a0e1301b9ada8d687a70ffcae99c26", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19501b1525326b5d47776772616e80fcd5f87a6fd5707a25122a01b4dac0a8482259df7d42a9a096606df1320df08d": "0x520b48452969f6ddf263b664de0adb0c729d0e0ad3b0e5f3cb636c541bc9022a", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950eed20ee87a5b7ad570617261806caf2fe2cf01fc3f07e113a2940a1d6c7bc1ab9d8974f152c2ee201d4f16f67a": "0x92ef83665b39d7a565e11bf8d18d41d45a8011601c339e57a8ea88c8ff7bba6f", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950feca8028a77ba7626772616e804ee66173993dd0db5d628c4c9cb61a27b76611ad3c3925947f0d0011ee2c5dcc": "0x8062e9c21f1d92926103119f7e8153cebdb1e5ab3e52d6f395be80bb193eab47", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19503eaa3e59477bc9506261626580720537e2c1c554654d73b3889c3ef4c3c2f95a65dd3f7c185ebe4afebed78372": "0xfa373e25a1c4fe19c7148acde13bc3db1811cf656dc086820f3dda736b9c4a00", - "0x26aa394eea5630e07c48ae0c9558cef7f9cce9c888469bb1a0dceaa129672ef8": "0x0018726f636f636f", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa195054b9b7ccd1690e40706172618006a7f34a2ae69cc0cca633c7a82b37cfba821707eb62ffe065b242e1230e4661": "0x62475fe5406a7cb6a64c51d0af9d3ab5c2151bcae982fb812f7a76b706914d6a", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19507d9c46786caf74af6261626580d2644c1ab2c63a3ad8d40ad70d4b260969e3abfe6d7e6665f50dc9f6365c9d2a": "0x92ef83665b39d7a565e11bf8d18d41d45a8011601c339e57a8ea88c8ff7bba6f", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19507bb98654d3bedee5706172618046d6245026e0e4f4a120cfdfbc9f36a37de202489c4c7ff05b6c54d1811aee2c": "0x02a2d8cfcf75dda85fafc04ace3bcb73160034ed1964c43098fb1fe831de1b16", - "0x5c0d1176a568c1f92944340dbfed9e9c530ebca703c85910e7164cb7d1c9e47b": "0x9ed7705e3c7da027ba0583a22a3212042f7e715d3c168ba14f1424e2bc111d00", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da942cd783ab1dc80a5347fe6c6f20ea02b9ed7705e3c7da027ba0583a22a3212042f7e715d3c168ba14f1424e2bc111d00": "0x0000000000000064a7b3b6e00d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb3df32aff68041374f02a2d8cfcf75dda85fafc04ace3bcb73160034ed1964c43098fb1fe831de1b16": "0x6c878e33b83c20324238d22240f735457b6fba544b383e70bb62a27b57380c817c94715e5dd8ab54221b1b6b2bfa5666f593f28a92a18e28052531de1bd80813d2f9d537ffa59919a4028afdb627c14c14c97a1547e13e8e82203d2049b15b1a46d6245026e0e4f4a120cfdfbc9f36a37de202489c4c7ff05b6c54d1811aee2c306ac5c772fe858942f92b6e28bd82fb7dd8cdd25f9a4626c1b0eee075fcb531", - "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb3dc18ebe8d771cfa002ea6bfa8b23b92fe4b5db1063a1f9475e3acd0ab61e6b4f454ed6ba00b5f864": "0xd9c056c98ca0e6b4eb7f5c58c007c1db7be0fe1f3776108f797dd4990d1ccc33bab3cccdcc34401e9b3971b96a662686cf755aa869a5c4b762199ce531b12c5bc4a980da30939d5bb9e4a734d12bf81259ae286aa21fa4b65405347fa40eff350062a5ab339962d84b6711b86fa67b457483fcd3d75dafb7bd15f182b7434227160ea09c5717270e958a3da42673fa011613a9539b2e4ebcad8626bc117ca04a", - "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb3328718e032416872520b48452969f6ddf263b664de0adb0c729d0e0ad3b0e5f3cb636c541bc9022a": "0xfcd5f87a6fd5707a25122a01b4dac0a8482259df7d42a9a096606df1320df08d38757d0de00a0c739e7d7984ef4bc01161bd61e198b7c01b618425c16bb5bd5f48a910c0af90898f11bd57d37ceaea53c78994f8e1833a7ade483c9a84bde055ac3ce74c09d1bb387d3f79dc8df88d661da689d5364eb8131c83fcc8ecb2fc5bf6f8fe475130d21165446a02fb1dbce3a7bf36412e5d98f4f0473aed9252f349", - "0x3a636f6465": "0x0061736d0100000001f1023260037f7f7f017f60027f7f017f60027f7f0060017f0060047f7f7f7f0060037f7f7f0060057f7f7f7f7f0060017f017e60017f017f60027f7e017f60037f7e7f017f6000017f60027f7f017e60037f7f7e017e60000060017e017f60017e0060017e017e60047f7e7e7e017f60027f7e017e60037f7e7e006000017e60027e7e0060037e7e7f017e60027e7f017f60057f7f7f7f7f017f60047f7f7f7f017f60077f7f7f7f7f7f7f017f60047f7f7f7e0060047f7e7f7f0060067f7f7f7f7f7f0060077f7e7e7e7e7e7e0060047f7f7e7e0060067f7f7f7e7e7f0060097f7f7f7f7f7f7f7f7e0060067f7f7f7f7e7e0060067f7f7e7f7f7f0060037e7f7f017f60067f7f7e7e7e7f0060077f7f7f7e7f7f7f0060077f7f7e7e7e7e7f0060097f7f7f7f7f7f7f7f7f00600a7f7f7f7f7f7f7f7f7f7f0060057f7f7f7e7e017f60077f7f7f7f7f7f7f0060027f7e0060067f7f7f7f7f7f017f60057f7e7e7e7e0060047f7e7e7f0060067f7e7e7e7e7f0002cc0b2503656e76066d656d6f727902001203656e761c6578745f616c6c6f6361746f725f667265655f76657273696f6e5f31000303656e761e6578745f616c6c6f6361746f725f6d616c6c6f635f76657273696f6e5f31000803656e76256578745f63727970746f5f656432353531395f67656e65726174655f76657273696f6e5f31000903656e76236578745f63727970746f5f656432353531395f7665726966795f76657273696f6e5f31000a03656e76286578745f63727970746f5f66696e6973685f62617463685f7665726966795f76657273696f6e5f31000b03656e76376578745f63727970746f5f736563703235366b315f65636473615f7265636f7665725f636f6d707265737365645f76657273696f6e5f31000c03656e76256578745f63727970746f5f737232353531395f67656e65726174655f76657273696f6e5f31000903656e76286578745f63727970746f5f737232353531395f7075626c69635f6b6579735f76657273696f6e5f31000703656e76216578745f63727970746f5f737232353531395f7369676e5f76657273696f6e5f31000d03656e76236578745f63727970746f5f737232353531395f7665726966795f76657273696f6e5f32000a03656e76276578745f63727970746f5f73746172745f62617463685f7665726966795f76657273696f6e5f31000e03656e762a6578745f747269655f626c616b65325f3235365f6f7264657265645f726f6f745f76657273696f6e5f31000f03656e761c6578745f6d6973635f7072696e745f6865785f76657273696f6e5f31001003656e761c6578745f6d6973635f7072696e745f6e756d5f76657273696f6e5f31001003656e761d6578745f6d6973635f7072696e745f757466385f76657273696f6e5f31001003656e76226578745f6d6973635f72756e74696d655f76657273696f6e5f76657273696f6e5f31001103656e76206578745f68617368696e675f626c616b65325f3132385f76657273696f6e5f31000f03656e76206578745f68617368696e675f626c616b65325f3235365f76657273696f6e5f31000f03656e761e6578745f68617368696e675f74776f785f3132385f76657273696f6e5f31000f03656e761d6578745f68617368696e675f74776f785f36345f76657273696f6e5f31000f03656e76236578745f6f6666636861696e5f69735f76616c696461746f725f76657273696f6e5f31000b03656e76346578745f6f6666636861696e5f6c6f63616c5f73746f726167655f636f6d706172655f616e645f7365745f76657273696f6e5f31001203656e76286578745f6f6666636861696e5f6c6f63616c5f73746f726167655f6765745f76657273696f6e5f31001303656e76286578745f6f6666636861696e5f6c6f63616c5f73746f726167655f7365745f76657273696f6e5f31001403656e76246578745f6f6666636861696e5f6e6574776f726b5f73746174655f76657273696f6e5f31001503656e76296578745f6f6666636861696e5f7375626d69745f7472616e73616374696f6e5f76657273696f6e5f31001103656e761c6578745f73746f726167655f617070656e645f76657273696f6e5f31001603656e76226578745f73746f726167655f6368616e6765735f726f6f745f76657273696f6e5f31001103656e761b6578745f73746f726167655f636c6561725f76657273696f6e5f31001003656e76226578745f73746f726167655f636c6561725f7072656669785f76657273696f6e5f31001003656e76196578745f73746f726167655f6765745f76657273696f6e5f31001103656e761e6578745f73746f726167655f6e6578745f6b65795f76657273696f6e5f31001103656e761a6578745f73746f726167655f726561645f76657273696f6e5f31001703656e761a6578745f73746f726167655f726f6f745f76657273696f6e5f31001503656e76196578745f73746f726167655f7365745f76657273696f6e5f31001603656e76196578745f6c6f6767696e675f6c6f675f76657273696f6e5f31001403b306b10608080303000008080e0e0e050202050e0e00060300010102010202020201180307191a05050006010101081b01010105010100040101000101000100030101010201080505020205020502020205020200010102010603010203050105061c0602020205050205020202020205020205020505021d02020202020402020202020202020202020202020202020100020405020502020202020202030302050202020502020205020502050205020502020203030302020202020205020502020202020205050202050202020505020202050502020303030502020202021e0501020203030405080202021f020202050e060202020205020201050202050205020505020202020303020202020301010802080202050205020503030205020202030302020202020202020202020305080302020205202005020505052120050202020202020202020203020202020201021a02020402030205050202040e1a1a05030303030101010102020202020202020203020305220505230502050203050403050204070e02030301020202050603050303050303020202030303020202020202050203030502080502050505050305032102050502070205020204020302050502020524252605020502021027051d0303030202030604030105021e03040503010204021a04020303020502020302030302020202020202020103030302020205052829022a0502020208020605020203030203020202020e030202020202021003020305050502022b020502030505050203022c02050305020502050505050202022d03020203030302030302020202020302030202020703030302020303020202030305050502042e0306010108060101012d02020602020202020303020203030202030300050505020202030204011e061e0502040b05030302020303020203020203030203020202050505030303000502050e020202020202020303030204040502050002020400030c0c02020e0b0c0c0c0c0c0c0c0c0c0b020c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c05050c020c0c010101010101030303030303030303030303030303030301010303030502080502010102010308022d01020102052f2f3031000000002f300407017001d901d9010619037f01418080c0000b7f0041d0c2c7000b7f0041d0c2c7000b07fd0823195f5f696e6469726563745f66756e6374696f6e5f7461626c6501000c436f72655f76657273696f6e00f40512436f72655f657865637574655f626c6f636b00f50515436f72655f696e697469616c697a655f626c6f636b00fa05114d657461646174615f6d6574616461746100fb051c426c6f636b4275696c6465725f6170706c795f65787472696e73696300fc051b426c6f636b4275696c6465725f66696e616c697a655f626c6f636b00fd0520426c6f636b4275696c6465725f696e686572656e745f65787472696e7369637300fe051c426c6f636b4275696c6465725f636865636b5f696e686572656e747300ff0518426c6f636b4275696c6465725f72616e646f6d5f736565640080062b5461676765645472616e73616374696f6e51756575655f76616c69646174655f7472616e73616374696f6e008106214f6666636861696e576f726b65724170695f6f6666636861696e5f776f726b65720082061850617261636861696e486f73745f76616c696461746f72730085061950617261636861696e486f73745f647574795f726f737465720086061f50617261636861696e486f73745f6163746976655f70617261636861696e730087062450617261636861696e486f73745f676c6f62616c5f76616c69646174696f6e5f646174610088062350617261636861696e486f73745f6c6f63616c5f76616c69646174696f6e5f646174610089061c50617261636861696e486f73745f70617261636861696e5f636f6465008a061750617261636861696e486f73745f6765745f6865616473008b061d50617261636861696e486f73745f7369676e696e675f636f6e74657874008c061f50617261636861696e486f73745f646f776e776172645f6d65737361676573008d061e4772616e6470614170695f6772616e6470615f617574686f726974696573008e06384772616e6470614170695f7375626d69745f7265706f72745f65717569766f636174696f6e5f756e7369676e65645f65787472696e736963008f06274772616e6470614170695f67656e65726174655f6b65795f6f776e6572736869705f70726f6f6600900615426162654170695f636f6e66696775726174696f6e0091061b426162654170695f63757272656e745f65706f63685f737461727400920624426162654170695f67656e65726174655f6b65795f6f776e6572736869705f70726f6f6600930635426162654170695f7375626d69745f7265706f72745f65717569766f636174696f6e5f756e7369676e65645f65787472696e73696300940621417574686f72697479446973636f766572794170695f617574686f7269746965730095062153657373696f6e4b6579735f67656e65726174655f73657373696f6e5f6b6579730096061f53657373696f6e4b6579735f6465636f64655f73657373696f6e5f6b6579730099061d4163636f756e744e6f6e63654170695f6163636f756e745f6e6f6e6365009b06205472616e73616374696f6e5061796d656e744170695f71756572795f696e666f009c060a5f5f646174615f656e6403010b5f5f686561705f626173650302099603010041010bd8013c41544bc1064c4d785e7f618c036283028a03b0018b0394059505990589039805a004553738393a63445658595a5b5c74b1027576777d7b7caf02bc03ef02ae02ad02bb04ac02b202c302c202c102bf02ca02c902c802c702c602f002ee02bf06bb03c103c303c203f903fe03f105f205e905ee05fc03ea05ed05ef05f00593049204900498049504c806be04bd04bc04c705c604c504c404c304c204c104a605f104f704f604f504f404fa04fd04fc048005c60687059a05a705c805cb05ca05ce05d205d105d005e805a006a1069d069e069f06b306b406b506ba04b804a306c004d404b002f801c605c505c905ef04ee04f00486038503a4068f048e04a5069404a304f904fb04860585058b05ed02a606ba03b903a706c903e605e505e705f305a505a405a806ac05a905a805a906ad05f304f204de04d705d605c105ab02aa02aa06f901eb04ab06be02bd02ac06c502d102bf03be03ad06c003ca03f703f603ae06f803a10497049604af06a20482058105b0068a05cd05cc05b106cf05d80588038703b2069603be0651520af2f73eb1060600200010250b0700200010c3060b0600200010270b0700200010c2060b0a0020002001200210290b2a01017f0240200210c3062203450d002003200020022001200120024b1b10cf061a200010c2060b20030b06002000102b0b1d01017f0240200010c3062201450d0020014100200010d1061a0b20010b0500102d000b1600410141d8adc700410741dfadc7004122107900000b110041c8bcc7004111418080c000102f000b4701017f230041206b22032400200341146a4100360200200341d4c0c700360210200342013702042003200136021c200320003602182003200341186a36020020032002103d000ba90101027f024002400240200041046a2802002202200028020822036b20014f0d00200320016a22012003490d01200241017422032001200320014b1b22014108200141084b1b22034100480d01024002402000280200410020021b22010d002003102421010c010b20022003460d00024020020d002003102421010c010b200120022003102821010b2001450d0220002001360200200041046a20033602000b0f0b102e000b102c000bdb0201067f230041206b2202240020012802002103024002402001280204220441037422050d00410021060c010b200341046a2107410021060340200728020020066a2106200741086a2107200541786a22050d000b0b024002400240200141146a2802000d00200621070c010b024020040d004100410041a880c0001032000b410021054101210402402006410f4b0d00200341046a280200450d020b200620066a22072006490d010b02402007417f4c0d00024020070d0041002105410121040c020b200721052007102422040d011033000b1034000b20004100360208200020043602002000200536020420022000360204200241086a41106a200141106a290200370300200241086a41086a200141086a290200370300200220012902003703080240200241046a41b880c000200241086a10350d00200241206a24000f0b41d080c0004133200241086a418481c000419481c0001036000b6c01017f230041306b2203240020032001360204200320003602002003411c6a41023602002003412c6a41013602002003420237020c200341d884c000360208200341013602242003200341206a360218200320033602282003200341046a360220200341086a2002103d000b0500102c000b0500102e000b9e0601097f230041306b22032400200341246a2001360200200341033a00282003428080808080043703082003200036022020034100360218200341003602100240024002400240024020022802082204450d0020022802002105200228020422062002410c6a2802002207200720064b1b2207450d01200241146a280200210820022802102109200020052802002005280204200128020c1100000d03200541086a21024100210a0240024003402003200441046a28020036020c20032004411c6a2d00003a00282003200441086a280200360208200441186a280200210041002101024002400240200441146a2802000e03010002010b200020084f0d032000410374210b410021012009200b6a220b2802044102470d01200b28020028020021000b410121010b2003200036021420032001360210200441106a2802002100410021010240024002402004410c6a2802000e03010002010b200020084f0d042000410374210b2009200b6a220b2802044102470d01200b28020028020021000b410121010b2003200036021c2003200136021802402004280200220020084f0d00200920004103746a2200280200200341086a20002802041101000d07200a41016a220a20074f0d06200441206a2104200241046a210020022802002101200241086a2102200328022020012000280200200328022428020c110000450d010c070b0b2000200841b089c0001032000b2000200841a089c0001032000b2000200841a089c0001032000b2002280200210520022802042206200241146a2802002204200420064b1b2207450d0020022802102104200020052802002005280204200128020c1100000d02200541086a21024100210003402004280200200341086a200441046a2802001101000d03200041016a220020074f0d02200441086a2104200241046a21012002280200210a200241086a21022003280220200a2001280200200328022428020c110000450d000c030b0b410021070b0240200620074d0d002003280220200520074103746a22042802002004280204200328022428020c1100000d010b410021040c010b410121040b200341306a240020040b7e01017f230041c0006b220524002005200136020c2005200036020820052003360214200520023602102005412c6a41023602002005413c6a41033602002005420237021c20054184aec700360218200541043602342005200541306a3602282005200541106a3602382005200541086a360230200541186a2004103d000b02000b3501017f20002802002200200210302000280200200041086a220028020022036a2001200210cf061a2000200320026a36020041000bce0201027f230041106b220224002000280200210002400240024002402001418001490d002002410036020c2001418010490d0102402001418080044f0d0020022001413f71418001723a000e20022001410c7641e001723a000c20022001410676413f71418001723a000d410321010c030b20022001413f71418001723a000f2002200141127641f001723a000c20022001410676413f71418001723a000e20022001410c76413f71418001723a000d410421010c020b024020002802082203200041046a280200470d00200041011030200028020821030b200028020020036a20013a00002000200028020841016a3602080c020b20022001413f71418001723a000d2002200141067641c001723a000c410221010b2000200110302000280200200041086a220028020022036a2002410c6a200110cf061a2000200320016a3602000b200241106a240041000b6301017f230041206b2202240020022000280200360204200241086a41106a200141106a290200370300200241086a41086a200141086a29020037030020022001290200370308200241046a41b880c000200241086a10352101200241206a240020010b6f01017f230041306b2202240020022001360204200220003602002002411c6a41023602002002412c6a41013602002002420337020c200241a882c000360208200241013602242002200241206a3602182002200241046a36022820022002360220200241086a41c082c000103d000b0b002000350200200110420b3401017f230041106b220224002002200136020c20022000360208200241e884c000360204200241d4c0c70036020020021043000b6f01017f230041306b2202240020022001360204200220003602002002411c6a41023602002002412c6a41013602002002420337020c200241fc82c000360208200241013602242002200241206a3602182002200241046a36022820022002360220200241086a419483c000103d000b6f01017f230041306b2202240020022001360204200220003602002002411c6a41023602002002412c6a41013602002002420337020c200241b883c000360208200241013602242002200241206a3602182002200241046a36022820022002360220200241086a41d083c000103d000b6f01017f230041306b2202240020022001360204200220003602002002411c6a41023602002002412c6a41013602002002420337020c2002419c84c000360208200241013602242002200241206a3602182002200241046a36022820022002360220200241086a41b484c000103d000b0d0020002802001a037f0c000b0bd20203027f017e037f230041306b22022400412721030240024020004290ce005a0d00200021040c010b412721030340200241096a20036a2205417c6a200020004290ce0080220442f0b17f7e7ca7220641ffff037141e4006e220741017441aa85c0006a2f00003b00002005417e6a2007419c7f6c20066a41ffff037141017441aa85c0006a2f00003b00002003417c6a2103200042ffc1d72f5621052004210020050d000b0b02402004a7220541e3004c0d00200241096a2003417e6a22036a2004a7220641ffff037141e4006e2205419c7f6c20066a41ffff037141017441aa85c0006a2f00003b00000b024002402005410a480d00200241096a2003417e6a22036a200541017441aa85c0006a2f00003b00000c010b200241096a2003417f6a22036a200541306a3a00000b200141d4c0c7004100200241096a20036a412720036b10452103200241306a240020030b6e01017f230041c0006b220124002001200036020c200141346a410136020020014201370224200141d0adc7003602202001410536023c2001200141386a36023020012001410c6a360238200141106a200141206a1031410141d8adc700410720012802102001280218107900000b0c0042c487a8b2bda1b4c8480be80501067f20002802002205410171220620046a21070240024020054104710d00410021010c010b4100210802402002450d00200221092001210a03402008200a2d000041c00171418001466a2108200a41016a210a2009417f6a22090d000b0b200720026a20086b21070b412b418080c40020061b21080240024020002802084101460d004101210a200020082001200210460d012000280218200320042000411c6a28020028020c110000210a0c010b02402000410c6a280200220920074b0d004101210a200020082001200210460d012000280218200320042000411c6a28020028020c1100000f0b0240024020054108710d004100210a200920076b22092105024002400240410120002d0020220720074103461b0e0402010001020b2009410176210a200941016a41017621050c010b410021052009210a0b200a41016a210a0340200a417f6a220a450d0220002802182000280204200028021c280210110100450d000b41010f0b200028020421052000413036020420002d002021064101210a200041013a0020200020082001200210460d014100210a200920076b22092102024002400240410120002d0020220820084103461b0e0402010001020b2009410176210a200941016a41017621020c010b410021022009210a0b200a41016a210a02400340200a417f6a220a450d0120002802182000280204200028021c280210110100450d000b41010f0b200028020421094101210a200028021820032004200028021c28020c1100000d01200241016a2108200028021c210220002802182101024003402008417f6a2208450d014101210a2001200920022802101101000d030c000b0b200020063a00202000200536020441000f0b200028020421094101210a200020082001200210460d00200028021820032004200028021c28020c1100000d00200541016a2108200028021c210220002802182100034002402008417f6a22080d0041000f0b4101210a200020092002280210110100450d000b0b200a0b5401017f024002402001418080c400460d0041012104200028021820012000411c6a2802002802101101000d010b024020020d0041000f0b2000280218200220032000411c6a28020028020c11000021040b20040b6c01017f230041306b2203240020032001360204200320003602002003411c6a41023602002003412c6a41013602002003420237020c200341f486c000360208200341013602242003200341206a3602182003200341046a36022820032003360220200341086a2002103d000b6c01017f230041306b2203240020032001360204200320003602002003411c6a41023602002003412c6a41013602002003420237020c200341ac87c000360208200341013602242003200341206a3602182003200341046a36022820032003360220200341086a2002103d000b8d07010c7f200028021021030240024002400240200028020822044101460d0020034101460d012000280218200120022000411c6a28020028020c11000021030c030b20034101470d010b0240024020020d00410021020c010b200120026a2105200041146a28020041016a21064100210720012103200121080340200341016a210902400240024020032c0000220a417f4a0d000240024020092005470d004100210b200521030c010b20032d0001413f71210b200341026a220921030b200a411f71210c0240200a41ff0171220a41df014b0d00200b200c41067472210a0c020b0240024020032005470d004100210d2005210e0c010b20032d0000413f71210d200341016a2209210e0b200d200b41067472210b0240200a41f0014f0d00200b200c410c7472210a0c020b02400240200e2005470d004100210a200921030c010b200e41016a2103200e2d0000413f71210a0b200b410674200c411274418080f0007172200a72220a418080c400470d020c040b200a41ff0171210a0b200921030b02402006417f6a2206450d00200720086b20036a21072003210820052003470d010c020b0b200a418080c400460d00024002402007450d0020072002460d0041002103200720024f0d01200120076a2c00004140480d010b200121030b2007200220031b21022003200120031b21010b20044101460d002000280218200120022000411c6a28020028020c1100000f0b4100210902402002450d002002210a200121030340200920032d000041c00171418001466a2109200341016a2103200a417f6a220a0d000b0b0240200220096b200028020c2206490d002000280218200120022000411c6a28020028020c1100000f0b410021074100210902402002450d00410021092002210a200121030340200920032d000041c00171418001466a2109200341016a2103200a417f6a220a0d000b0b200920026b20066a2209210a024002400240410020002d0020220320034103461b0e0402010001020b20094101762107200941016a410176210a0c010b4100210a200921070b200741016a2103024003402003417f6a2203450d0120002802182000280204200028021c280210110100450d000b41010f0b2000280204210941012103200028021820012002200028021c28020c1100000d00200a41016a2103200028021c210a20002802182100034002402003417f6a22030d0041000f0b20002009200a280210110100450d000b41010f0b20030bc80801067f230041f0006b220524002005200336020c20052002360208410121062001210702402001418102490d00410020016b2108418002210903400240200920014f0d0041002106200020096a2c000041bf7f4c0d00200921070c020b2009417f6a21074100210620094101460d01200820096a210a20072109200a4101470d000b0b200520073602142005200036021020054100410520061b36021c200541d4c0c70041f087c00020061b3602180240024002400240200220014b22060d00200320014b0d00200220034b0d01024002402002450d0020012002460d00200120024d0d01200020026a2c00004140480d010b200321020b200520023602202002450d0220022001460d02200141016a210903400240200220014f0d00200020026a2c000041404e0d040b2002417f6a210620024101460d0420092002462103200621022003450d000c040b0b20052002200320061b360228200541306a41146a4103360200200541c8006a41146a4104360200200541d4006a410436020020054203370234200541f887c0003602302005410136024c2005200541c8006a3602402005200541186a3602582005200541106a3602502005200541286a360248200541306a2004103d000b200541e4006a4104360200200541c8006a41146a4104360200200541d4006a4101360200200541306a41146a4104360200200542043702342005419088c0003602302005410136024c2005200541c8006a3602402005200541186a3602602005200541106a36025820052005410c6a3602502005200541086a360248200541306a2004103d000b200221060b024020062001460d00410121090240024002400240200020066a22032c00002202417f4a0d0041002109200020016a220121070240200341016a2001460d00200341026a210720032d0001413f7121090b2002411f712103200241ff017141df014b0d01200920034106747221020c020b2005200241ff0171360224200541286a21010c020b4100210020012108024020072001460d00200741016a210820072d0000413f7121000b200020094106747221090240200241ff017141f0014f0d0020092003410c747221020c010b41002102024020082001460d0020082d0000413f7121020b20094106742003411274418080f00071722002722202418080c400460d020b2005200236022441012109200541286a21012002418001490d00410221092002418010490d0041034104200241808004491b21090b200520063602282005200920066a36022c200541306a41146a4105360200200541ec006a4104360200200541e4006a4104360200200541c8006a41146a4106360200200541d4006a410736020020054205370234200541b088c000360230200520013602582005410136024c2005200541c8006a3602402005200541186a3602682005200541106a3602602005200541246a3602502005200541206a360248200541306a2004103d000b419d8ac600412b2004102f000b100020012000280200200028020410490b800101037f230041206b22022400024002402000280200200110500d002001411c6a2802002103200128021821042002411c6a4100360200200241d4c0c7003602182002420137020c2002419889c00036020820042003200241086a1035450d010b200241206a240041010f0b2000280204200110502101200241206a240020010bdd0502047f017e410121020240200128021841272001411c6a2802002802101101000d0041022103024002400240024002402000280200220041776a2204411e4d0d00200041dc00470d010c020b41f40021050240024020040e1f05010202000202020202020202020202020202020202020202030202020203050b41f20021050c040b41ee0021050c030b0240024002402000104e0d00024002400240200041808004490d00200041808008490d0120004190fc476a4190fc0b490d02200041b5d9736a41b5db2b490d02200041e28b746a41e20b490d022000419fa8746a419f18490d02200041dee2746a410e490d02200041feffff0071419ef00a460d02200041a2b2756a4122490d02200041cb91756a410a4b0d050c020b200041808ac000412941d28ac00041a20241f48cc00041b502104f450d010c040b200041a98fc000412641f58fc00041af0141a491c00041a303104f0d030b200041017267410276410773ad4280808080d0008421060c010b200041017267410276410773ad4280808080d0008421060b410321030c020b410121030c010b0b200021050b03402003210441dc002100410121024101210302400240024002400240024020040e0402010500020b02400240024002402006422088a741ff01710e06050302010006050b200642ffffffff8f608342808080803084210641f50021000c060b200642ffffffff8f608342808080802084210641fb0021000c050b20052006a72204410274411c7176410f712203413072200341d7006a2003410a491b210002402004450d002006427f7c42ffffffff0f832006428080808070838421060c050b200642ffffffff8f60834280808080108421060c040b200642ffffffff8f6083210641fd0021000c030b41002103200521000c030b20012802184127200128021c2802101101000f0b200642ffffffff8f60834280808080c0008421060b410321030b20012802182000200128021c280210110100450d000b0b20020b990301047f0240024002404100410f200041a49a04491b2201200141086a22012001410274418895c0006a280200410b742000410b7422014b1b2202200241046a22022002410274418895c0006a280200410b7420014b1b2202200241026a22022002410274418895c0006a280200410b7420014b1b2202200241016a22022002410274418895c0006a280200410b7420014b1b2202410274418895c0006a280200410b74220320014620032001496a20026a2201411e4b0d0041b105210302402001411e460d002001410274418c95c0006a28020041157621030b4100210202402001417f6a220420014b0d002004411f4f0d032004410274418895c0006a28020041ffffff007121020b024020032001410274418895c0006a280200411576220141016a460d00200020026b21022003417f6a2103410021000340200141b0054b0d0320002001419496c0006a2d00006a220020024b0d012003200141016a2201470d000b200321010b20014101710f0b2001411f41c89bc0001032000b200141b10541d89bc0001032000b2004411f418496c0001032000bea0201067f200120024101746a210720004180fe0371410876210841002109200041ff0171210a0240024002400340200141026a210b200920012d000122026a210c024020012d000022012008460d00200120084b0d03200c2109200b2101200b2007470d010c030b0240200c2009490d00200c20044b0d02200320096a2101024003402002450d012002417f6a210220012d00002109200141016a21012009200a470d000b410021020c050b200c2109200b2101200b2007470d010c030b0b2009200c41c894c0001048000b200c200441c894c0001047000b200041ffff03712109200520066a210c4101210202400340200541016a210a0240024020052d00002201411874411875220b4100480d00200a21050c010b200a200c460d02200b41ff007141087420052d0001722101200541026a21050b200920016b22094100480d02200241017321022005200c470d000c020b0b419d8ac600412b41d894c000102f000b20024101710ba50201037f23004180016b2202240002400240024002400240200128020022034110710d0020034120710d012000ad2001104221000c020b410021030340200220036a41ff006a2000410f712204413072200441d7006a2004410a491b3a00002003417f6a2103200041047622000d000b20034180016a22004181014f0d02200141e889c0004102200220036a4180016a410020036b104521000c010b410021030340200220036a41ff006a2000410f712204413072200441376a2004410a491b3a00002003417f6a2103200041047622000d000b20034180016a22004181014f0d02200141e889c0004102200220036a4180016a410020036b104521000b20024180016a240020000f0b200041800141d889c0001048000b200041800141d889c0001048000b1c00200128021841d99cc000410b2001411c6a28020028020c1100000b1c00200128021841e49cc000410e2001411c6a28020028020c1100000b5b01017f230041306b220324002003200136020c20032000360208200341246a410136020020034201370214200341d0adc7003602102003410436022c2003200341286a3602202003200341086a360228200341106a2002103d000b140020002802002001200028020428020c1101000b1500200120002802002200280200200028020410490bb10401077f230041306b220324000240024020020d00410021040c010b200341286a210502400240024002400340024020002802082d0000450d00200028020041ad9dc0004104200028020428020c1100000d050b2003410a3602282003428a808080103703202003200236021c200341003602182003200236021420032001360210200341086a410a200120021057024002400240024020032802084101470d00200328020c210403402003200420032802186a41016a2204360218024002402004200328022422064f0d00200328021421070c010b200328021422072004490d00200641054f0d072003280210200420066b22086a22092005460d0420092005200610d206450d040b200328021c22092004490d0220072009490d0220032006200341106a6a41176a2d0000200328021020046a200920046b10572003280204210420032802004101460d000b0b2003200328021c3602180b200028020841003a0000200221040c010b200028020841013a0000200841016a21040b2000280204210920002802002106024020044520022004467222070d00200220044d0d03200120046a2c000041bf7f4c0d030b200620012004200928020c1100000d04024020070d00200220044d0d04200120046a2c000041bf7f4c0d040b200120046a2101200220046b22020d000b410021040c040b2006410441b49dc0001047000b200120024100200441c49dc000104a000b200120022004200241e087c000104a000b410121040b200341306a240020040be20201057f41002104024002400240024020024103712205450d00410420056b2205450d0020032005200520034b1b2206450d0041002105200141ff017121040340200220056a2d00002004460d022006200541016a2205470d000b200621040b20034108490d012004200341786a22074b0d01200141ff017141818284086c210502400340200220046a220641046a2802002005732208417f73200841fffdfb776a7120062802002005732206417f73200641fffdfb776a7172418081828478710d01200441086a220420074d0d000b0b200420034d0d012004200341f09dc0001048000b410121060c010b4100210541002106024020042003460d00200220046a2102200320046b210841002105200141ff0171210602400340200220056a2d00002006460d012008200541016a2205470d000b41002106200820046a21050c020b41012106200521050b200520046a21050b20002005360204200020063602000b850201027f230041106b220224002002410036020c02400240024002402001418001490d002001418010490d012002410c6a21032001418080044f0d0220022001413f71418001723a000e20022001410c7641e001723a000c20022001410676413f71418001723a000d410321010c030b200220013a000c2002410c6a2103410121010c020b20022001413f71418001723a000d2002200141067641c001723a000c2002410c6a2103410221010c010b20022001413f71418001723a000f2002200141127641f001723a000c20022001410676413f71418001723a000e20022001410c76413f71418001723a000d410421010b20002003200110562101200241106a240020010b6001017f230041206b2202240020022000360204200241086a41106a200141106a290200370300200241086a41086a200141086a29020037030020022001290200370308200241046a41bc9ec000200241086a10352101200241206a240020010b0d0020002802002001200210560b8c0201027f230041106b22022400200028020021002002410036020c02400240024002402001418001490d002001418010490d012002410c6a21032001418080044f0d0220022001413f71418001723a000e20022001410c7641e001723a000c20022001410676413f71418001723a000d410321010c030b200220013a000c2002410c6a2103410121010c020b20022001413f71418001723a000d2002200141067641c001723a000c2002410c6a2103410221010c010b20022001413f71418001723a000f2002200141127641f001723a000c20022001410676413f71418001723a000e20022001410c76413f71418001723a000d410421010b20002003200110562101200241106a240020010b6301017f230041206b2202240020022000280200360204200241086a41106a200141106a290200370300200241086a41086a200141086a29020037030020022001290200370308200241046a41bc9ec000200241086a10352101200241206a240020010bd30202047f027e230041c0006b2203240041012104024020002d00080d00200028020421050240200028020022062d00004104710d00410121042006280218419b9ec00041d49ec00020051b4102410120051b2006411c6a28020028020c1100000d0120012000280200200228020c11010021040c010b024020050d0041012104200628021841d59ec00041022006411c6a28020028020c1100000d01200028020021060b41012104200341013a0017200341346a41a09ec000360200200320062902183703082003200341176a3602102006290208210720062902102108200320062d00203a00382003200837032820032007370320200320062902003703182003200341086a3602302001200341186a200228020c1101000d00200328023041b89ec0004102200328023428020c11000021040b200020043a00082000200028020441016a360204200341c0006a240020000b6401027f230041206b220224002001411c6a280200210320012802182101200241086a41106a200041106a290200370300200241086a41086a200041086a2902003703002002200029020037030820012003200241086a10352100200241206a240020000bd70a020c7f017e230041206b220324004101210402400240200228021841222002411c6a2802002802101101000d000240024020010d00410021050c010b200020016a21064100210520002107410021080240034020072109200741016a210a02400240024020072c0000220b417f4a0d0002400240200a2006470d004100210c200621070c010b20072d0001413f71210c200741026a220a21070b200b411f7121040240200b41ff0171220b41df014b0d00200c200441067472210c0c020b0240024020072006470d004100210d2006210e0c010b20072d0000413f71210d200741016a220a210e0b200d200c41067472210c0240200b41f0014f0d00200c2004410c7472210c0c020b02400240200e2006470d004100210b200a21070c010b200e41016a2107200e2d0000413f71210b0b200c4106742004411274418080f0007172200b72220c418080c400470d020c040b200b41ff0171210c0b200a21070b4102210a024002400240024002400240200c41776a220b411e4d0d00200c41dc00470d010c020b41f400210e02400240200b0e1f05010202000202020202020202020202020202020202020202030202020203050b41f200210e0c040b41ee00210e0c030b0240200c104e0d0002400240200c41808004490d00200c41808008490d01200c4190fc476a4190fc0b490d02200c41b5d9736a41b5db2b490d02200c41e28b746a41e20b490d02200c419fa8746a419f18490d02200c41dee2746a410e490d02200c41feffff0071419ef00a460d02200c41a2b2756a4122490d02200c41cb91756a410a4d0d020c060b200c41808ac000412941d28ac00041a20241f48cc00041b502104f450d010c050b200c41a98fc000412641f58fc00041af0141a491c00041a303104f0d040b200c41017267410276410773ad4280808080d00084210f4103210a0c010b0b200c210e0b2003200136020420032000360200200320053602082003200836020c0240024020082005490d0002402005450d0020052001460d00200520014f0d01200020056a2c000041bf7f4c0d010b02402008450d0020082001460d00200820014f0d01200020086a2c000041bf7f4c0d010b2002280218200020056a200820056b200228021c28020c110000450d01410121040c060b20032003410c6a3602182003200341086a36021420032003360210200341106a1060000b0340200a210b4101210441dc0021054101210a024002400240024002400240200b0e0402010500020b0240024002400240200f422088a741ff01710e06050302010006050b200f42ffffffff8f608342808080803084210f4103210a41f50021050c070b200f42ffffffff8f608342808080802084210f4103210a41fb0021050c060b200e200fa7220b410274411c7176410f71220a413072200a41d7006a200a410a491b21050240200b450d00200f427f7c42ffffffff0f83200f4280808080708384210f0c050b200f42ffffffff8f608342808080801084210f0c040b200f42ffffffff8f6083210f4103210a41fd0021050c040b4100210a200e21050c030b4101210a0240200c418001490d004102210a200c418010490d0041034104200c41808004491b210a0b200a20086a21050c040b200f42ffffffff8f60834280808080c00084210f0b4103210a0b20022802182005200228021c280210110100450d000c050b0b200820096b20076a210820062007470d000b0b2005450d0020052001460d00200520014f0d02200020056a2c000041bf7f4c0d020b410121042002280218200020056a200120056b200228021c28020c1100000d0020022802184122200228021c28021011010021040b200341206a240020040f0b200020012005200141e087c000104a000b2b01017f2000280200220128020020012802042000280204280200200028020828020041dc9ec000104a000b870101027f23004180016b2202240020002d00002103410021000340200220006a41ff006a20034101714130723a00002000417f6a2100200341017641ff007122030d000b024020004180016a2203418101490d00200341800141d889c0001048000b200141ec9ec0004102200220006a4180016a410020006b1045210020024180016a240020000b900101037f23004180016b2202240020002802002103410021000340200220006a41ff006a2003410f712204413072200441376a2004410a491b3a00002000417f6a2100200341047622030d000b024020004180016a2203418101490d00200341800141d889c0001048000b200141e889c0004102200220006a4180016a410020006b1045210020024180016a240020000b1c00200128021841abb0c00041052001411c6a28020028020c1100000bcf0401067e2000420037001720002001290320220242338842137e2001290300220342ffffffffffffff03837c220442137c4233882001290308220542ffffffffffffff038320034233887c22037c4233882001290310220642ffffffffffffff038320054233887c22057c4233882001290318220742ffffffffffffff038320064233887c22067c423388200242ffffffffffffff038320074233887c22077c42338842137e20047c22023c0000200020024228883c0005200020024220883c0004200020024218883c0003200020024210883c0002200020024208883c00012000200242338820037c22044225883c000b20002004421d883c000a200020044215883c000920002004420d883c0008200020044205883c00072000200442338820057c2203422a883c0012200020034222883c001120002003421a883c0010200020034212883c000f20002003420a883c000e200020034202883c000d2000200442ffffffffffffff038322044203862002423088420783843c00062000200342338820067c2202421f883c0017200020024227883c0018200020024217883c001620002002420f883c0015200020024207883c00142000200342ffffffffffffff038322054206862004422d88843c000c2000200242338820077c22034204883c001a20002003420c883c001b200020034214883c001c20002003421c883c001d200020034224883c001e2000200242ffffffffffffff038322024201862005423288843c00132000200342ffffffffffffff03832203422c883c001f200020034204862002422f88843c00190b7101027f230041c0006b22022400200220001064200241206a2001106441002101410121000340200241206a20016a2d0000200220016a2d0000732203410020036b72417f734180017141077610662000712100200141016a22014120470d000b200010662101200241c0006a240020010b1501017f230041106b220120003a000f20012d000f0bd00702017f147e230041f0016b2203240020012903202104200129031821052001290310210620012903082107200129030021080340200341f0006a200842002007420010cc06200341306a20064200200442137e2209420010cc06200341e0016a200542137e220a42002005420010cc06200341c0006a200a42002006420010cc0620034180016a200742002009420010cc06200341206a200842002006420010cc06200341d0016a200a42002004420010cc06200341106a200742002006420010cc06200341a0016a200842002005420010cc06200341c0016a200942002004420010cc06200341d0006a200742002005420010cc0620034190016a200842002004420010cc06200341b0016a200842002008420010cc06200341e0006a200742002007420010cc062003200642002006420010cc06200329039001220b20032903507c2206420186220c20032903007c220720032903a001220d20032903107c2208420186220e20032903c0017c22042003290320220f20032903d0017c2205420186221020032903607c22092003290370221120032903307c220a420186221220032903e0017c2213200329038001221420032903407c2215420186221620032903b0017c221742338820034180016a41086a290300200341c0006a41086a2903007c2015201454ad7c4201862015423f8884200341b0016a41086a2903007c2017201654ad7c420d86847c2215423388200341f0006a41086a290300200341306a41086a2903007c200a201154ad7c420186200a423f8884200341e0016a41086a2903007c2013201254ad7c2015201354ad7c420d86847c220a423388200341206a41086a290300200341d0016a41086a2903007c2005200f54ad7c4201862005423f8884200341e0006a41086a2903007c2009201054ad7c200a200954ad7c420d86847c2205423388200341a0016a41086a290300200341106a41086a2903007c2008200d54ad7c4201862008423f8884200341c0016a41086a2903007c2004200e54ad7c2005200454ad7c420d86847c220442338820034190016a41086a290300200341d0006a41086a2903007c2006200b54ad7c4201862006423f8884200341086a2903007c2007200c54ad7c2004200754ad7c420d868442137e201742ffffffffffffff03837c220642ffffffffffffff038321082006423388201542ffffffffffffff03837c2107200442ffffffffffffff03832104200542ffffffffffffff03832105200a42ffffffffffffff038321062002417f6a22020d000b2000200437032020002005370318200020063703102000200737030820002008370300200341f0016a24000bbbd40103017f2c7e037f230041d0c1006b22032400200341a8c1006a200241011067200341b0386a20032903a8412204420020022903082205420010cc06200341c0396a20032903c841220642002002290310220742137e2208420010cc06200341803a6a20032903c041220942002002290318220a42137e220b420010cc06200341c03a6a20032903b841220c42002002290320220d42137e220e420010cc06200341f0386a20032903b041220f420020022903002210420010cc06200341a0386a201042002004420010cc06200341b0396a20064200200542137e2211420010cc06200341f0396a200942002008420010cc06200341b03a6a200c4200200b420010cc06200341f03a6a200f4200200e420010cc06200341c0386a200442002007420010cc06200341d0396a20064200200b420010cc06200341903a6a20094200200e420010cc0620034180396a200c42002010420010cc06200341803b6a200f42002005420010cc06200341d0386a20044200200a420010cc06200341e0396a20064200200e420010cc0620034190396a200942002010420010cc06200341d03a6a200c42002005420010cc06200341903b6a200f42002007420010cc06200341e0386a20044200200d420010cc06200341a0396a200642002010420010cc06200341a03a6a200942002005420010cc06200341e03a6a200c42002007420010cc06200341a03b6a200f4200200a420010cc06200320032903d039221220032903c0387c220420032903903a7c22062003290380397c220920032903803b7c220c20032903c039221320032903b0387c220f20032903803a7c221420032903c03a7c221520032903f0387c221620032903b039221720032903a0387c221820032903f0397c221920032903b03a7c221a20032903f03a7c221b423388200341b0396a41086a290300200341a0386a41086a2903007c2018201754ad7c200341f0396a41086a2903007c2019201854ad7c200341b03a6a41086a2903007c201a201954ad7c200341f03a6a41086a2903007c201b201a54ad7c420d86847c2218423388200341c0396a41086a290300200341b0386a41086a2903007c200f201354ad7c200341803a6a41086a2903007c2014200f54ad7c200341c03a6a41086a2903007c2015201454ad7c200341f0386a41086a2903007c2016201554ad7c2018201654ad7c420d86847c220f42ffffffffffffff0383221c3703c03b200320032903e039221a20032903d0387c22142003290390397c221520032903d03a7c221620032903903b7c2219200f423388200341d0396a41086a290300200341c0386a41086a2903007c2004201254ad7c200341903a6a41086a2903007c2006200454ad7c20034180396a41086a2903007c2009200654ad7c200341803b6a41086a2903007c200c200954ad7c200f200c54ad7c420d86847c220442ffffffffffffff0383221d3703c83b200320032903a039221220032903e0387c220620032903a03a7c220920032903e03a7c220c20032903a03b7c220f2004423388200341e0396a41086a290300200341d0386a41086a2903007c2014201a54ad7c20034190396a41086a2903007c2015201454ad7c200341d03a6a41086a2903007c2016201554ad7c200341903b6a41086a2903007c2019201654ad7c2004201954ad7c420d86847c220442ffffffffffffff0383221e3703d03b20032004423388200341a0396a41086a290300200341e0386a41086a2903007c2006201254ad7c200341a03a6a41086a2903007c2009200654ad7c200341e03a6a41086a2903007c200c200954ad7c200341a03b6a41086a2903007c200f200c54ad7c2004200f54ad7c420d868442137e201b42ffffffffffffff03837c220442ffffffffffffff038322123703b03b20032004423388201842ffffffffffffff03837c22133703b83b200341a8c1006a200341b03b6a41011067200341a0356a20032903a841220442002005420010cc06200341f0356a20032903c841220642002008420010cc06200341c0366a20032903c04122094200200b420010cc0620034190376a20032903b841220c4200200e420010cc06200341e0376a20032903b041220f42002010420010cc0620034190356a200442002010420010cc06200341e0356a200642002011420010cc06200341b0366a200942002008420010cc0620034180376a200c4200200b420010cc06200341d0376a200f4200200e420010cc06200341b0356a200442002007420010cc0620034180366a20064200200b420010cc06200341d0366a20094200200e420010cc06200341a0376a200c42002010420010cc06200341f0376a200f42002005420010cc06200341c0356a20044200200a420010cc0620034190366a20064200200e420010cc06200341e0366a200942002010420010cc06200341b0376a200c42002005420010cc0620034180386a200f42002007420010cc06200341d0356a20044200200d420010cc06200341a0366a200642002010420010cc06200341f0366a200942002005420010cc06200341c0376a200c42002007420010cc0620034190386a200f4200200a420010cc06200341e0306a200329038036221a20032903b0357c220b20032903d0367c220420032903a0377c220620032903f0377c220920032903f035221920032903a0357c220e20032903c0367c220c2003290390377c220f20032903e0377c220820032903e035221b2003290390357c221420032903b0367c22152003290380377c221620032903d0377c2218423388200341e0356a41086a29030020034190356a41086a2903007c2014201b54ad7c200341b0366a41086a2903007c2015201454ad7c20034180376a41086a2903007c2016201554ad7c200341d0376a41086a2903007c2018201654ad7c420d86847c2215423388200341f0356a41086a290300200341a0356a41086a2903007c200e201954ad7c200341c0366a41086a2903007c200c200e54ad7c20034190376a41086a2903007c200f200c54ad7c200341e0376a41086a2903007c2008200f54ad7c2015200854ad7c420d86847c220c42ffffffffffffff0383220842137e221742002001290320220e420010cc0620034190316a200329039036221f20032903c0357c220f20032903e0367c221420032903b0377c22162003290380387c2219200c42338820034180366a41086a290300200341b0356a41086a2903007c200b201a54ad7c200341d0366a41086a2903007c2004200b54ad7c200341a0376a41086a2903007c2006200454ad7c200341f0376a41086a2903007c2009200654ad7c200c200954ad7c420d86847c220442ffffffffffffff0383221a42137e221b42002001290318220b420010cc06200341d0316a20032903a036222020032903d0357c220620032903f0367c220920032903c0377c220c2003290390387c2211200442338820034190366a41086a290300200341c0356a41086a2903007c200f201f54ad7c200341e0366a41086a2903007c2014200f54ad7c200341b0376a41086a2903007c2016201454ad7c20034180386a41086a2903007c2019201654ad7c2004201954ad7c420d86847c220f42ffffffffffffff0383221642137e2214420020012903102204420010cc06200341f02f6a200f423388200341a0366a41086a290300200341d0356a41086a2903007c2006202054ad7c200341f0366a41086a2903007c2009200654ad7c200341c0376a41086a2903007c200c200954ad7c20034190386a41086a2903007c2011200c54ad7c200f201154ad7c420d868442137e201842ffffffffffffff03837c220942ffffffffffffff0383220c420020012903082206420010cc06200341c0306a2009423388201542ffffffffffffff03837c220f420020012903002209420010cc06200341f0306a20174200200b420010cc06200341a0316a201b42002004420010cc06200341e0316a201442002006420010cc0620034180306a200c42002009420010cc06200341d0306a200f42137e4200200e420010cc06200341c0346a200842002009420010cc0620034180316a201b4200200e420010cc06200341c0316a20144200200b420010cc06200341e02f6a200c42002004420010cc06200341b0306a200f42002006420010cc0620034180326a200842002006420010cc06200341b0346a201a42002009420010cc06200341b0316a20144200200e420010cc06200341d02f6a200c4200200b420010cc06200341a0306a200f42002004420010cc06200341d0326a200842002004420010cc06200341f0316a201a42002006420010cc06200341a0346a201642002009420010cc06200341c02f6a200c4200200e420010cc0620034190306a200f4200200b420010cc062003200329038031221f20032903c0347c220f20032903c0317c220820032903e02f7c221420032903b0307c2215200329039031222020032903e0307c220c20032903d0317c221620032903f02f7c221820032903c0307c221920032903a031222120032903f0307c221a20032903e0317c221b2003290380307c221120032903d0307c2217423388200341a0316a41086a290300200341f0306a41086a2903007c201a202154ad7c200341e0316a41086a2903007c201b201a54ad7c20034180306a41086a2903007c2011201b54ad7c200341d0306a41086a2903007c2017201154ad7c420d86847c221a42338820034190316a41086a290300200341e0306a41086a2903007c200c202054ad7c200341d0316a41086a2903007c2016200c54ad7c200341f02f6a41086a2903007c2018201654ad7c200341c0306a41086a2903007c2019201854ad7c201a201954ad7c420d86847c221642ffffffffffffff0383220c3703e83b200320032903b03422202003290380327c221820032903b0317c221920032903d02f7c221b20032903a0307c2211201642338820034180316a41086a290300200341c0346a41086a2903007c200f201f54ad7c200341c0316a41086a2903007c2008200f54ad7c200341e02f6a41086a2903007c2014200854ad7c200341b0306a41086a2903007c2015201454ad7c2016201554ad7c420d86847c220842ffffffffffffff0383220f3703f03b200320032903f031222120032903d0327c221420032903a0347c221520032903c02f7c22162003290390307c221f2008423388200341b0346a41086a29030020034180326a41086a2903007c2018202054ad7c200341b0316a41086a2903007c2019201854ad7c200341d02f6a41086a2903007c201b201954ad7c200341a0306a41086a2903007c2011201b54ad7c2008201154ad7c420d86847c221842ffffffffffffff038322083703f83b20032018423388200341f0316a41086a290300200341d0326a41086a2903007c2014202154ad7c200341a0346a41086a2903007c2015201454ad7c200341c02f6a41086a2903007c2016201554ad7c20034190306a41086a2903007c201f201654ad7c2018201f54ad7c420d868442137e201742ffffffffffffff03837c221542ffffffffffffff038322143703d83b20032015423388201a42ffffffffffffff03837c22153703e03b200341803c6a200341d83b6a41011067200341a8c1006a200341803c6a41011067200341a83c6a200341a8c1006a41011067200341f02c6a2014420020032903b03c2216420010cc06200341802d6a2008420020032903b83c221942137e2217420010cc06200341e02d6a200f420020032903c03c221b42137e2211420010cc06200341c02e6a200c420020032903c83c221f42137e221a420010cc06200341a02f6a2015420020032903a83c2218420010cc06200341b02f6a201842002014420010cc06200341b02c6a20084200201642137e420010cc06200341902d6a200f42002017420010cc06200341f02d6a200c42002011420010cc06200341d02e6a20154200201a420010cc06200341c02d6a201442002019420010cc06200341d02d6a200842002011420010cc06200341b02e6a200f4200201a420010cc06200341902f6a200c42002018420010cc06200341e02c6a201542002016420010cc06200341902e6a20144200201b420010cc06200341a02e6a20084200201a420010cc06200341802f6a200f42002018420010cc06200341d02c6a200c42002016420010cc06200341b02d6a201542002019420010cc06200341e02e6a20144200201f420010cc06200341f02e6a200842002018420010cc06200341c02c6a200f42002016420010cc06200341a02d6a200c42002019420010cc06200341802e6a20154200201b420010cc06200341c02a6a20032903d02d222220032903c02d7c221620032903b02e7c221820032903902f7c221a20032903e02c7c221b20032903802d222320032903f02c7c221920032903e02d7c221120032903c02e7c221720032903a02f7c221f20032903b02c222420032903b02f7c222020032903902d7c222120032903f02d7c222520032903d02e7c2226423388200341b02c6a41086a290300200341b02f6a41086a2903007c2020202454ad7c200341902d6a41086a2903007c2021202054ad7c200341f02d6a41086a2903007c2025202154ad7c200341d02e6a41086a2903007c2026202554ad7c420d86847c2221423388200341802d6a41086a290300200341f02c6a41086a2903007c2019202354ad7c200341e02d6a41086a2903007c2011201954ad7c200341c02e6a41086a2903007c2017201154ad7c200341a02f6a41086a2903007c201f201754ad7c2021201f54ad7c420d86847c221742ffffffffffffff0383221942137e2227420020032903a03c2211420010cc06200341f02a6a20032903a02e222820032903902e7c221f20032903802f7c222020032903d02c7c222520032903b02d7c22232017423388200341d02d6a41086a290300200341c02d6a41086a2903007c2016202254ad7c200341b02e6a41086a2903007c2018201654ad7c200341902f6a41086a2903007c201a201854ad7c200341e02c6a41086a2903007c201b201a54ad7c2017201b54ad7c420d86847c221642ffffffffffffff0383221a42137e2222420020032903983c2217420010cc06200341b02b6a20032903f02e222920032903e02e7c221820032903c02c7c222420032903a02d7c222a20032903802e7c222b2016423388200341a02e6a41086a290300200341902e6a41086a2903007c201f202854ad7c200341802f6a41086a2903007c2020201f54ad7c200341d02c6a41086a2903007c2025202054ad7c200341b02d6a41086a2903007c2023202554ad7c2016202354ad7c420d86847c221642ffffffffffffff0383221b42137e2225420020032903903c221f420010cc06200341d0296a2016423388200341f02e6a41086a290300200341e02e6a41086a2903007c2018202954ad7c200341c02c6a41086a2903007c2024201854ad7c200341a02d6a41086a2903007c202a202454ad7c200341802e6a41086a2903007c202b202a54ad7c2016202b54ad7c420d868442137e202642ffffffffffffff03837c221842ffffffffffffff03832216420020032903883c2220420010cc06200341a02a6a2018423388202142ffffffffffffff03837c2218420020032903803c2221420010cc06200341d02a6a202742002017420010cc06200341802b6a20224200201f420010cc06200341c02b6a202542002020420010cc06200341e0296a201642002021420010cc06200341b02a6a201842137e42002011420010cc06200341d02b6a201942002021420010cc06200341e02a6a202242002011420010cc06200341a02b6a202542002017420010cc06200341c0296a20164200201f420010cc06200341902a6a201842002020420010cc06200341e02b6a201942002020420010cc06200341802c6a201a42002021420010cc06200341902b6a202542002011420010cc06200341b0296a201642002017420010cc06200341802a6a20184200201f420010cc06200341f02b6a20194200201f420010cc06200341902c6a201a42002020420010cc06200341a02c6a201b42002021420010cc06200341a0296a201642002011420010cc06200341f0296a201842002017420010cc06200320032903e02a222720032903d02b7c221120032903a02b7c221720032903c0297c221f20032903902a7c222020032903f02a222820032903c02a7c222120032903b02b7c222520032903d0297c222620032903a02a7c222320032903802b222920032903d02a7c222220032903c02b7c222420032903e0297c222a20032903b02a7c222b423388200341802b6a41086a290300200341d02a6a41086a2903007c2022202954ad7c200341c02b6a41086a2903007c2024202254ad7c200341e0296a41086a2903007c202a202454ad7c200341b02a6a41086a2903007c202b202a54ad7c420d86847c2222423388200341f02a6a41086a290300200341c02a6a41086a2903007c2021202854ad7c200341b02b6a41086a2903007c2025202154ad7c200341d0296a41086a2903007c2026202554ad7c200341a02a6a41086a2903007c2023202654ad7c2022202354ad7c420d86847c222142ffffffffffffff03833703e03c200320032903802c222a20032903e02b7c222520032903902b7c222620032903b0297c222320032903802a7c22242021423388200341e02a6a41086a290300200341d02b6a41086a2903007c2011202754ad7c200341a02b6a41086a2903007c2017201154ad7c200341c0296a41086a2903007c201f201754ad7c200341902a6a41086a2903007c2020201f54ad7c2021202054ad7c420d86847c221142ffffffffffffff03833703e83c200320032903902c222720032903f02b7c221720032903a02c7c221f20032903a0297c222020032903f0297c22212011423388200341802c6a41086a290300200341e02b6a41086a2903007c2025202a54ad7c200341902b6a41086a2903007c2026202554ad7c200341b0296a41086a2903007c2023202654ad7c200341802a6a41086a2903007c2024202354ad7c2011202454ad7c420d86847c221142ffffffffffffff03833703f03c20032011423388200341902c6a41086a290300200341f02b6a41086a2903007c2017202754ad7c200341a02c6a41086a2903007c201f201754ad7c200341a0296a41086a2903007c2020201f54ad7c200341f0296a41086a2903007c2021202054ad7c2011202154ad7c420d868442137e202b42ffffffffffffff03837c221142ffffffffffffff03833703d03c20032011423388202242ffffffffffffff03837c3703d83c200341f83c6a200341d03c6a41011067200341e0266a201b420020032903883d221f42137e2226420010cc06200341c0276a20032903903d222142137e22254200201a420010cc06200341a0286a20032903983d222342137e222042002019420010cc06200341d0266a2016420020032903803d2211420010cc0620034180296a2018420020032903f83c2217420010cc0620034190266a201b4200201142137e420010cc06200341f0266a20264200201a420010cc06200341d0276a202542002019420010cc0620034190296a201642002017420010cc06200341b0286a201842002020420010cc06200341b0276a20254200201b420010cc0620034190286a20204200201a420010cc06200341f0286a201742002019420010cc06200341a0276a20164200201f420010cc06200341c0266a201842002011420010cc06200341b0266a201142002019420010cc0620034180286a20204200201b420010cc06200341e0286a20174200201a420010cc06200341f0276a201642002021420010cc0620034190276a20184200201f420010cc06200341a0266a20114200201a420010cc0620034180276a201f42002019420010cc06200341d0286a20174200201b420010cc06200341c0286a201642002023420010cc06200341e0276a201842002021420010cc062003200329039028222220032903b0277c221620032903f0287c221820032903a0277c221a20032903c0267c221b20032903c027222320032903e0267c221920032903a0287c221120032903d0267c22172003290380297c221f20032903f02622242003290390267c222020032903d0277c22212003290390297c222520032903b0287c2226423388200341f0266a41086a29030020034190266a41086a2903007c2020202454ad7c200341d0276a41086a2903007c2021202054ad7c20034190296a41086a2903007c2025202154ad7c200341b0286a41086a2903007c2026202554ad7c420d86847c2221423388200341c0276a41086a290300200341e0266a41086a2903007c2019202354ad7c200341a0286a41086a2903007c2011201954ad7c200341d0266a41086a2903007c2017201154ad7c20034180296a41086a2903007c201f201754ad7c2021201f54ad7c420d86847c221142ffffffffffffff038322193703b03d2003200329038028222420032903b0267c221720032903e0287c221f20032903f0277c22252003290390277c2223201142338820034190286a41086a290300200341b0276a41086a2903007c2016202254ad7c200341f0286a41086a2903007c2018201654ad7c200341a0276a41086a2903007c201a201854ad7c200341c0266a41086a2903007c201b201a54ad7c2011201b54ad7c420d86847c221642ffffffffffffff038322203703b83d2003200329038027222220032903a0267c221820032903d0287c221a20032903c0287c221b20032903e0277c2211201642338820034180286a41086a290300200341b0266a41086a2903007c2017202454ad7c200341e0286a41086a2903007c201f201754ad7c200341f0276a41086a2903007c2025201f54ad7c20034190276a41086a2903007c2023202554ad7c2016202354ad7c420d86847c221642ffffffffffffff038322253703c03d2003201642338820034180276a41086a290300200341a0266a41086a2903007c2018202254ad7c200341d0286a41086a2903007c201a201854ad7c200341c0286a41086a2903007c201b201a54ad7c200341e0276a41086a2903007c2011201b54ad7c2016201154ad7c420d868442137e202642ffffffffffffff03837c221842ffffffffffffff038322163703a03d20032018423388202142ffffffffffffff03837c22183703a83d200341c83d6a200341a03d6a41051067200341b0246a201942137e2223420020032903e83d221a420010cc06200341f0246a202042137e2226420020032903e03d221b420010cc06200341b0256a202542137e2221420020032903d83d2211420010cc06200341b0236a2016420020032903d03d2217420010cc0620034180246a2018420020032903c83d221f420010cc0620034180256a20234200201b420010cc06200341c0256a202642002011420010cc0620034180266a202142002017420010cc06200341c0236a20164200201f420010cc06200341c0246a201842137e4200201a420010cc06200341f0236a20194200201f420010cc06200341a0246a20264200201a420010cc06200341e0246a20214200201b420010cc06200341a0236a201642002011420010cc06200341f0256a201842002017420010cc06200341e0256a201942002017420010cc06200341e0236a20204200201f420010cc0620034190246a20214200201a420010cc0620034190236a20164200201b420010cc06200341a0256a201842002011420010cc0620034190256a201942002011420010cc06200341d0256a202042002017420010cc06200341d0236a20254200201f420010cc0620034180236a20164200201a420010cc06200341d0246a20184200201b420010cc06200320032903a024222320032903f0237c221620032903e0247c221820032903a0237c221a20032903f0257c221b20032903f024222220032903b0247c221920032903b0257c221120032903b0237c22172003290380247c221f20032903c02522242003290380257c22202003290380267c222120032903c0237c222520032903c0247c2226423388200341c0256a41086a29030020034180256a41086a2903007c2020202454ad7c20034180266a41086a2903007c2021202054ad7c200341c0236a41086a2903007c2025202154ad7c200341c0246a41086a2903007c2026202554ad7c420d86847c2220423388200341f0246a41086a290300200341b0246a41086a2903007c2019202254ad7c200341b0256a41086a2903007c2011201954ad7c200341b0236a41086a2903007c2017201154ad7c20034180246a41086a2903007c201f201754ad7c2020201f54ad7c420d86847c221142ffffffffffffff038322193703803e200320032903e023222220032903e0257c22172003290390247c221f2003290390237c222120032903a0257c22252011423388200341a0246a41086a290300200341f0236a41086a2903007c2016202354ad7c200341e0246a41086a2903007c2018201654ad7c200341a0236a41086a2903007c201a201854ad7c200341f0256a41086a2903007c201b201a54ad7c2011201b54ad7c420d86847c221642ffffffffffffff0383221b3703883e200320032903d025222a2003290390257c221820032903d0237c221a2003290380237c221120032903d0247c22232016423388200341e0236a41086a290300200341e0256a41086a2903007c2017202254ad7c20034190246a41086a2903007c201f201754ad7c20034190236a41086a2903007c2021201f54ad7c200341a0256a41086a2903007c2025202154ad7c2016202554ad7c420d86847c221642ffffffffffffff038322243703903e20032016423388200341d0256a41086a29030020034190256a41086a2903007c2018202a54ad7c200341d0236a41086a2903007c201a201854ad7c20034180236a41086a2903007c2011201a54ad7c200341d0246a41086a2903007c2023201154ad7c2016202354ad7c420d868442137e202642ffffffffffffff03837c221842ffffffffffffff038322163703f03d20032018423388202042ffffffffffffff03837c22183703f83d200341983e6a200341f03d6a410a1067200341f0206a201942137e222a420020032903b83e2217420010cc06200341c0216a201b42137e2211420020032903b03e221f420010cc0620034190226a202442137e221a420020032903a83e2220420010cc06200341e0226a2016420020032903a03e2221420010cc06200341a0206a2018420020032903983e2225420010cc06200341d0216a202a4200201f420010cc06200341a0226a201142002020420010cc06200341f0226a201a42002021420010cc06200341b0206a201642002025420010cc0620034180216a201842137e222c42002017420010cc0620034190206a201942002025420010cc06200341e0206a201142002017420010cc06200341b0216a201a4200201f420010cc0620034180226a201642002020420010cc06200341d0226a201842002021420010cc06200341c0226a201942002021420010cc0620034180206a201b42002025420010cc06200341d0206a201a42002017420010cc06200341a0216a20164200201f420010cc06200341f0216a201842002020420010cc06200341e0216a201942002020420010cc06200341b0226a201b42002021420010cc06200341f01f6a202442002025420010cc06200341c0206a201642002017420010cc0620034190216a20184200201f420010cc06200320032903e020222d2003290390207c221720032903b0217c221f2003290380227c222120032903d0227c222520032903c021222e20032903f0207c22202003290390227c222620032903e0227c222320032903a0207c222220032903a022222f20032903d0217c222b20032903f0227c222720032903b0207c22282003290380217c2229423388200341a0226a41086a290300200341d0216a41086a2903007c202b202f54ad7c200341f0226a41086a2903007c2027202b54ad7c200341b0206a41086a2903007c2028202754ad7c20034180216a41086a2903007c2029202854ad7c420d86847c2227423388200341c0216a41086a290300200341f0206a41086a2903007c2020202e54ad7c20034190226a41086a2903007c2026202054ad7c200341e0226a41086a2903007c2023202654ad7c200341a0206a41086a2903007c2022202354ad7c2027202254ad7c420d86847c222642ffffffffffffff038322203703d03e2003200329038020222f20032903c0227c222320032903d0207c222220032903a0217c222820032903f0217c222e2026423388200341e0206a41086a29030020034190206a41086a2903007c2017202d54ad7c200341b0216a41086a2903007c201f201754ad7c20034180226a41086a2903007c2021201f54ad7c200341d0226a41086a2903007c2025202154ad7c2026202554ad7c420d86847c221742ffffffffffffff0383222b3703d83e200320032903b022222d20032903e0217c221f20032903f01f7c222120032903c0207c22252003290390217c2226201742338820034180206a41086a290300200341c0226a41086a2903007c2023202f54ad7c200341d0206a41086a2903007c2022202354ad7c200341a0216a41086a2903007c2028202254ad7c200341f0216a41086a2903007c202e202854ad7c2017202e54ad7c420d86847c221742ffffffffffffff038322283703e03e20032017423388200341b0226a41086a290300200341e0216a41086a2903007c201f202d54ad7c200341f01f6a41086a2903007c2021201f54ad7c200341c0206a41086a2903007c2025202154ad7c20034190216a41086a2903007c2026202554ad7c2017202654ad7c420d868442137e202942ffffffffffffff03837c221f42ffffffffffffff038322173703c03e2003201f423388202742ffffffffffffff03837c221f3703c83e200341e83e6a200341c03e6a41141067200341e01d6a202042137e222e420020032903883f2221420010cc06200341b01e6a202b42137e2229420020032903803f2225420010cc06200341801f6a202842137e2227420020032903f83e2226420010cc06200341d01f6a2017420020032903f03e2223420010cc06200341901d6a201f420020032903e83e2222420010cc06200341c01e6a202e42002025420010cc06200341901f6a202942002026420010cc06200341e01f6a202742002023420010cc06200341a01d6a201742002022420010cc06200341f01d6a201f42137e42002021420010cc06200341801d6a202042002022420010cc06200341d01d6a202942002021420010cc06200341a01e6a202742002025420010cc06200341f01e6a201742002026420010cc06200341c01f6a201f42002023420010cc06200341b01f6a202042002023420010cc06200341f01c6a202b42002022420010cc06200341c01d6a202742002021420010cc06200341901e6a201742002025420010cc06200341e01e6a201f42002026420010cc06200341d01e6a202042002026420010cc06200341a01f6a202b42002023420010cc06200341e01c6a202842002022420010cc06200341b01d6a201742002021420010cc06200341801e6a201f42002025420010cc06200320032903d01d222e20032903801d7c221720032903a01e7c221f20032903f01e7c222020032903c01f7c222120032903b01e222d20032903e01d7c222520032903801f7c222620032903d01f7c222320032903901d7c222220032903901f222f20032903c01e7c222b20032903e01f7c222720032903a01d7c222820032903f01d7c2229423388200341901f6a41086a290300200341c01e6a41086a2903007c202b202f54ad7c200341e01f6a41086a2903007c2027202b54ad7c200341a01d6a41086a2903007c2028202754ad7c200341f01d6a41086a2903007c2029202854ad7c420d86847c222b423388200341b01e6a41086a290300200341e01d6a41086a2903007c2025202d54ad7c200341801f6a41086a2903007c2026202554ad7c200341d01f6a41086a2903007c2023202654ad7c200341901d6a41086a2903007c2022202354ad7c202b202254ad7c420d86847c222542ffffffffffffff03833703a03f200320032903f01c222820032903b01f7c222620032903c01d7c222320032903901e7c222220032903e01e7c22272025423388200341d01d6a41086a290300200341801d6a41086a2903007c2017202e54ad7c200341a01e6a41086a2903007c201f201754ad7c200341f01e6a41086a2903007c2020201f54ad7c200341c01f6a41086a2903007c2021202054ad7c2025202154ad7c420d86847c221742ffffffffffffff03833703a83f200320032903a01f222e20032903d01e7c221f20032903e01c7c222020032903b01d7c222120032903801e7c22252017423388200341f01c6a41086a290300200341b01f6a41086a2903007c2026202854ad7c200341c01d6a41086a2903007c2023202654ad7c200341901e6a41086a2903007c2022202354ad7c200341e01e6a41086a2903007c2027202254ad7c2017202754ad7c420d86847c221742ffffffffffffff03833703b03f20032017423388200341a01f6a41086a290300200341d01e6a41086a2903007c201f202e54ad7c200341e01c6a41086a2903007c2020201f54ad7c200341b01d6a41086a2903007c2021202054ad7c200341801e6a41086a2903007c2025202154ad7c2017202554ad7c420d868442137e202942ffffffffffffff03837c221742ffffffffffffff03833703903f20032017423388202b42ffffffffffffff03837c3703983f200341b83f6a200341903f6a410a1067200341d01a6a20032903d83f22174200202a420010cc06200341801a6a2018420020032903b83f221f420010cc06200341a01b6a20032903d03f222042002011420010cc06200341f01b6a20032903c83f22214200201a420010cc06200341c01c6a20032903c03f222542002016420010cc06200341901a6a20164200201f420010cc06200341b01b6a20204200202a420010cc06200341e01a6a202c42002017420010cc06200341801c6a202142002011420010cc06200341d01c6a20254200201a420010cc06200341f0196a201f42002019420010cc06200341c01a6a201742002011420010cc06200341901b6a20204200201a420010cc06200341e01b6a202142002016420010cc06200341b01c6a202542002018420010cc06200341e0196a201f4200201b420010cc06200341b01a6a20174200201a420010cc06200341801b6a202042002016420010cc06200341d01b6a202142002018420010cc06200341a01c6a202542002019420010cc06200341d0196a201f42002024420010cc06200341a01a6a201742002016420010cc06200341f01a6a202042002018420010cc06200341c01b6a202142002019420010cc06200341901c6a20254200201b420010cc06200320032903c01a222320032903f0197c221620032903901b7c221820032903e01b7c221a20032903b01c7c221b20032903801a222220032903d01a7c221920032903a01b7c221120032903f01b7c221720032903c01c7c221f20032903b01b222420032903901a7c222020032903e01a7c222120032903801c7c222520032903d01c7c2226423388200341b01b6a41086a290300200341901a6a41086a2903007c2020202454ad7c200341e01a6a41086a2903007c2021202054ad7c200341801c6a41086a2903007c2025202154ad7c200341d01c6a41086a2903007c2026202554ad7c420d86847c2220423388200341801a6a41086a290300200341d01a6a41086a2903007c2019202254ad7c200341a01b6a41086a2903007c2011201954ad7c200341f01b6a41086a2903007c2017201154ad7c200341c01c6a41086a2903007c201f201754ad7c2020201f54ad7c420d86847c221142ffffffffffffff038322193703f03f200320032903b01a222220032903e0197c221720032903801b7c221f20032903d01b7c222120032903a01c7c22252011423388200341c01a6a41086a290300200341f0196a41086a2903007c2016202354ad7c200341901b6a41086a2903007c2018201654ad7c200341e01b6a41086a2903007c201a201854ad7c200341b01c6a41086a2903007c201b201a54ad7c2011201b54ad7c420d86847c221642ffffffffffffff0383221b3703f83f200320032903a01a222a20032903d0197c221820032903f01a7c221a20032903c01b7c221120032903901c7c22232016423388200341b01a6a41086a290300200341e0196a41086a2903007c2017202254ad7c200341801b6a41086a2903007c201f201754ad7c200341d01b6a41086a2903007c2021201f54ad7c200341a01c6a41086a2903007c2025202154ad7c2016202554ad7c420d86847c221642ffffffffffffff038322243703804020032016423388200341a01a6a41086a290300200341d0196a41086a2903007c2018202a54ad7c200341f01a6a41086a2903007c201a201854ad7c200341c01b6a41086a2903007c2011201a54ad7c200341901c6a41086a2903007c2023201154ad7c2016202354ad7c420d868442137e202642ffffffffffffff03837c221842ffffffffffffff038322163703e03f20032018423388202042ffffffffffffff03837c22183703e83f20034188c0006a200341e03f6a41321067200341c0176a201942137e222a420020032903a8402217420010cc0620034190186a201b42137e2211420020032903a040221f420010cc06200341e0186a202442137e221a42002003290398402220420010cc06200341b0196a201642002003290390402221420010cc06200341f0166a201842002003290388402225420010cc06200341a0186a202a4200201f420010cc06200341f0186a201142002020420010cc06200341c0196a201a42002021420010cc0620034180176a201642002025420010cc06200341d0176a201842137e222c42002017420010cc06200341e0166a201942002025420010cc06200341b0176a201142002017420010cc0620034180186a201a4200201f420010cc06200341d0186a201642002020420010cc06200341a0196a201842002021420010cc0620034190196a202142002019420010cc06200341d0166a201b42002025420010cc06200341a0176a201a42002017420010cc06200341f0176a20164200201f420010cc06200341c0186a201842002020420010cc06200341b0186a201942002020420010cc0620034180196a201b42002021420010cc06200341c0166a202442002025420010cc0620034190176a201642002017420010cc06200341e0176a20184200201f420010cc06200320032903b017222d20032903e0167c22172003290380187c221f20032903d0187c222120032903a0197c2225200329039018222e20032903c0177c222020032903e0187c222620032903b0197c222320032903f0167c222220032903f018222f20032903a0187c222b20032903c0197c22272003290380177c222820032903d0177c2229423388200341f0186a41086a290300200341a0186a41086a2903007c202b202f54ad7c200341c0196a41086a2903007c2027202b54ad7c20034180176a41086a2903007c2028202754ad7c200341d0176a41086a2903007c2029202854ad7c420d86847c222742338820034190186a41086a290300200341c0176a41086a2903007c2020202e54ad7c200341e0186a41086a2903007c2026202054ad7c200341b0196a41086a2903007c2023202654ad7c200341f0166a41086a2903007c2022202354ad7c2027202254ad7c420d86847c222642ffffffffffffff038322203703c040200320032903d016222f2003290390197c222320032903a0177c222220032903f0177c222820032903c0187c222e2026423388200341b0176a41086a290300200341e0166a41086a2903007c2017202d54ad7c20034180186a41086a2903007c201f201754ad7c200341d0186a41086a2903007c2021201f54ad7c200341a0196a41086a2903007c2025202154ad7c2026202554ad7c420d86847c221742ffffffffffffff0383222b3703c8402003200329038019222d20032903b0187c221f20032903c0167c22212003290390177c222520032903e0177c22262017423388200341d0166a41086a29030020034190196a41086a2903007c2023202f54ad7c200341a0176a41086a2903007c2022202354ad7c200341f0176a41086a2903007c2028202254ad7c200341c0186a41086a2903007c202e202854ad7c2017202e54ad7c420d86847c221742ffffffffffffff038322283703d0402003201742338820034180196a41086a290300200341b0186a41086a2903007c201f202d54ad7c200341c0166a41086a2903007c2021201f54ad7c20034190176a41086a2903007c2025202154ad7c200341e0176a41086a2903007c2026202554ad7c2017202654ad7c420d868442137e202942ffffffffffffff03837c221f42ffffffffffffff038322173703b0402003201f423388202742ffffffffffffff03837c221f3703b840200341d8c0006a200341b0c0006a41e4001067200341b0146a202042137e222e420020032903f8402221420010cc0620034180156a202b42137e2229420020032903f0402225420010cc06200341d0156a202842137e2227420020032903e8402226420010cc06200341a0166a2017420020032903e0402223420010cc06200341e0136a201f420020032903d8402222420010cc0620034190156a202e42002025420010cc06200341e0156a202942002026420010cc06200341b0166a202742002023420010cc06200341f0136a201742002022420010cc06200341c0146a201f42137e42002021420010cc06200341d0136a202042002022420010cc06200341a0146a202942002021420010cc06200341f0146a202742002025420010cc06200341c0156a201742002026420010cc0620034190166a201f42002023420010cc0620034180166a202042002023420010cc06200341c0136a202b42002022420010cc0620034190146a202742002021420010cc06200341e0146a201742002025420010cc06200341b0156a201f42002026420010cc06200341a0156a202042002026420010cc06200341f0156a202b42002023420010cc06200341b0136a202842002022420010cc0620034180146a201742002021420010cc06200341d0146a201f42002025420010cc06200320032903a014222e20032903d0137c221720032903f0147c221f20032903c0157c22202003290390167c2221200329038015222d20032903b0147c222520032903d0157c222620032903a0167c222320032903e0137c222220032903e015222f2003290390157c222b20032903b0167c222720032903f0137c222820032903c0147c2229423388200341e0156a41086a29030020034190156a41086a2903007c202b202f54ad7c200341b0166a41086a2903007c2027202b54ad7c200341f0136a41086a2903007c2028202754ad7c200341c0146a41086a2903007c2029202854ad7c420d86847c222b42338820034180156a41086a290300200341b0146a41086a2903007c2025202d54ad7c200341d0156a41086a2903007c2026202554ad7c200341a0166a41086a2903007c2023202654ad7c200341e0136a41086a2903007c2022202354ad7c202b202254ad7c420d86847c222542ffffffffffffff038337039041200320032903c01322282003290380167c22262003290390147c222320032903e0147c222220032903b0157c22272025423388200341a0146a41086a290300200341d0136a41086a2903007c2017202e54ad7c200341f0146a41086a2903007c201f201754ad7c200341c0156a41086a2903007c2020201f54ad7c20034190166a41086a2903007c2021202054ad7c2025202154ad7c420d86847c221742ffffffffffffff038337039841200320032903f015222e20032903a0157c221f20032903b0137c22202003290380147c222120032903d0147c22252017423388200341c0136a41086a29030020034180166a41086a2903007c2026202854ad7c20034190146a41086a2903007c2023202654ad7c200341e0146a41086a2903007c2022202354ad7c200341b0156a41086a2903007c2027202254ad7c2017202754ad7c420d86847c221742ffffffffffffff03833703a04120032017423388200341f0156a41086a290300200341a0156a41086a2903007c201f202e54ad7c200341b0136a41086a2903007c2020201f54ad7c20034180146a41086a2903007c2021202054ad7c200341d0146a41086a2903007c2025202154ad7c2017202554ad7c420d868442137e202942ffffffffffffff03837c221742ffffffffffffff03833703804120032017423388202b42ffffffffffffff03837c37038841200341a8c1006a20034180c1006a41321067200341b0106a20032903a841221742002018420010cc0620034180116a20032903c841221f4200202a420010cc06200341d0116a20032903c041222042002011420010cc06200341a0126a20032903b84122214200201a420010cc06200341f0126a20032903b041222542002016420010cc06200341a0106a201742002016420010cc06200341f0106a201f4200202c420010cc06200341c0116a20204200202a420010cc0620034190126a202142002011420010cc06200341e0126a20254200201a420010cc06200341c0106a201742002019420010cc0620034190116a201f42002011420010cc06200341e0116a20204200201a420010cc06200341b0126a202142002016420010cc0620034180136a202542002018420010cc06200341d0106a20174200201b420010cc06200341a0116a201f4200201a420010cc06200341f0116a202042002016420010cc06200341c0126a202142002018420010cc0620034190136a202542002019420010cc06200341e0106a201742002024420010cc06200341b0116a201f42002016420010cc0620034180126a202042002018420010cc06200341d0126a202142002019420010cc06200341a0136a20254200201b420010cc0620034180346a200e4200201c42137e2219420010cc06200341c0336a200b4200201d42137e2218420010cc0620034180336a20044200201e42137e2216420010cc06200341f00c6a200642002012420010cc0620034180356a201342002009420010cc06200341d0336a200b42002019420010cc0620034190336a200442002018420010cc06200341800d6a201242002009420010cc06200341c0326a200642002016420010cc0620034190346a201342137e4200200e420010cc06200341f0346a20094200201c420010cc06200341f0336a200e42002018420010cc06200341b0336a200b42002016420010cc06200341e00c6a201242002004420010cc06200341b0326a201342002006420010cc06200341e0346a20094200201d420010cc06200341e0336a20164200200e420010cc06200341800c6a20124200200b420010cc06200341a0326a20064200201c420010cc06200341f0326a201342002004420010cc06200341d0346a201e42002009420010cc06200341e0326a20044200201c420010cc06200341a00b6a20124200200e420010cc0620034190326a20064200201d420010cc06200341a0336a20134200200b420010cc062003200329039011222120032903c0107c221620032903e0117c221820032903b0127c22192003290380137c221a200329038011222520032903b0107c221b20032903d0117c221220032903a0127c221320032903f0127c221120032903f010222620032903a0107c221720032903c0117c221f2003290390127c221c20032903e0127c2220423388200341f0106a41086a290300200341a0106a41086a2903007c2017202654ad7c200341c0116a41086a2903007c201f201754ad7c20034190126a41086a2903007c201c201f54ad7c200341e0126a41086a2903007c2020201c54ad7c420d86847c221742338820034180116a41086a290300200341b0106a41086a2903007c201b202554ad7c200341d0116a41086a2903007c2012201b54ad7c200341a0126a41086a2903007c2013201254ad7c200341f0126a41086a2903007c2011201354ad7c2017201154ad7c420d86847c221b42ffffffffffffff038337039041200320032903a011221c20032903d0107c221220032903f0117c221320032903c0127c22112003290390137c221f201b42338820034190116a41086a290300200341c0106a41086a2903007c2016202154ad7c200341e0116a41086a2903007c2018201654ad7c200341b0126a41086a2903007c2019201854ad7c20034180136a41086a2903007c201a201954ad7c201b201a54ad7c420d86847c221642ffffffffffffff038337039841200320032903b011222120032903e0107c22182003290380127c221920032903d0127c221a20032903a0137c221b2016423388200341a0116a41086a290300200341d0106a41086a2903007c2012201c54ad7c200341f0116a41086a2903007c2013201254ad7c200341c0126a41086a2903007c2011201354ad7c20034190136a41086a2903007c201f201154ad7c2016201f54ad7c420d86847c221642ffffffffffffff03833703a04120032016423388200341b0116a41086a290300200341e0106a41086a2903007c2018202154ad7c20034180126a41086a2903007c2019201854ad7c200341d0126a41086a2903007c201a201954ad7c200341a0136a41086a2903007c201b201a54ad7c2016201b54ad7c420d868442137e202042ffffffffffffff03837c221642ffffffffffffff03833703804120032016423388201742ffffffffffffff03837c37038841200341a8c1006a20034180c1006a41021067200341900e6a200c420020032903c841221342137e2219420010cc06200341e00e6a200f420020032903c041221b42137e2212420010cc06200341b00f6a2008420020032903b841221a42137e2211420010cc0620034180106a2014420020032903b0412216420010cc06200341a00d6a2015420020032903a8412218420010cc06200341f00e6a200c42002012420010cc06200341c00f6a200f42002011420010cc0620034190106a20084200201642137e420010cc06200341900d6a201442002018420010cc06200341a00e6a201542002019420010cc06200341b00d6a200c42002018420010cc06200341800e6a200f42002019420010cc06200341d00e6a200842002012420010cc06200341a00f6a20144200201a420010cc06200341f00f6a201542002016420010cc06200341e00f6a200c42002016420010cc06200341c00d6a200f42002018420010cc06200341f00d6a200842002019420010cc06200341c00e6a20144200201b420010cc06200341900f6a20154200201a420010cc06200341800f6a200c4200201a420010cc06200341d00f6a200f42002016420010cc06200341d00d6a200842002018420010cc06200341e00d6a201442002013420010cc06200341b00e6a20154200201b420010cc06200341800b6a20032903e032222a20032903d0347c221520032903a00b7c22162003290390327c221820032903a0337c221b20032903e033222320032903e0347c220c20032903800c7c220f20032903a0327c220820032903f0327c221420032903f033222220032903f0347c221920032903b0337c221a20032903e00c7c221220032903b0327c221320032903c033221d2003290380347c22112003290380337c221720032903f00c7c221f2003290380357c221c200329039033222420032903d0337c222020032903800d7c222120032903c0327c22252003290390347c222642338820034190336a41086a290300200341d0336a41086a2903007c2020202454ad7c200341800d6a41086a2903007c2021202054ad7c200341c0326a41086a2903007c2025202154ad7c20034190346a41086a2903007c2026202554ad7c420d86847c2220423388200341c0336a41086a29030020034180346a41086a2903007c2011201d54ad7c20034180336a41086a2903007c2017201154ad7c200341f00c6a41086a2903007c201f201754ad7c20034180356a41086a2903007c201c201f54ad7c2020201c54ad7c420d86847c2211423388200341f0336a41086a290300200341f0346a41086a2903007c2019202254ad7c200341b0336a41086a2903007c201a201954ad7c200341e00c6a41086a2903007c2012201a54ad7c200341b0326a41086a2903007c2013201254ad7c2011201354ad7c420d86847c221a423388200341e0336a41086a290300200341e0346a41086a2903007c200c202354ad7c200341800c6a41086a2903007c200f200c54ad7c200341a0326a41086a2903007c2008200f54ad7c200341f0326a41086a2903007c2014200854ad7c201a201454ad7c420d86847c221242ffffffffffffff0383220c420020032903800e221d20032903b00d7c220820032903d00e7c221420032903a00f7c221320032903f00f7c221720032903e00e222420032903900e7c220f20032903b00f7c22192003290380107c221f20032903a00d7c221c20032903c00f222b20032903f00e7c22212003290390107c222520032903900d7c222320032903a00e7c2222423388200341c00f6a41086a290300200341f00e6a41086a2903007c2021202b54ad7c20034190106a41086a2903007c2025202154ad7c200341900d6a41086a2903007c2023202554ad7c200341a00e6a41086a2903007c2022202354ad7c420d86847c2221423388200341e00e6a41086a290300200341900e6a41086a2903007c200f202454ad7c200341b00f6a41086a2903007c2019200f54ad7c20034180106a41086a2903007c201f201954ad7c200341a00d6a41086a2903007c201c201f54ad7c2021201c54ad7c420d86847c221f42ffffffffffffff0383221942137e222b420010cc06200341e00b6a201a42ffffffffffffff0383220f420020032903c00d222720032903e00f7c221a20032903f00d7c221c20032903c00e7c222520032903900f7c2223201f423388200341800e6a41086a290300200341b00d6a41086a2903007c2008201d54ad7c200341d00e6a41086a2903007c2014200854ad7c200341a00f6a41086a2903007c2013201454ad7c200341f00f6a41086a2903007c2017201354ad7c201f201754ad7c420d86847c221442ffffffffffffff0383221342137e2217420010cc06200341c00c6a201142ffffffffffffff03832208420020032903d00f221e20032903800f7c221120032903d00d7c221f20032903e00d7c221d20032903b00e7c22242014423388200341c00d6a41086a290300200341e00f6a41086a2903007c201a202754ad7c200341f00d6a41086a2903007c201c201a54ad7c200341c00e6a41086a2903007c2025201c54ad7c200341900f6a41086a2903007c2023202554ad7c2014202354ad7c420d86847c221442ffffffffffffff0383221c42137e221a420010cc06200341b00a6a2014423388200341d00f6a41086a290300200341800f6a41086a2903007c2011201e54ad7c200341d00d6a41086a2903007c201f201154ad7c200341e00d6a41086a2903007c201d201f54ad7c200341b00e6a41086a2903007c2024201d54ad7c2014202454ad7c420d868442137e202242ffffffffffffff03837c221142ffffffffffffff0383221442002012423388200341e0326a41086a290300200341d0346a41086a2903007c2015202a54ad7c200341a00b6a41086a2903007c2016201554ad7c20034190326a41086a2903007c2018201654ad7c200341a0336a41086a2903007c201b201854ad7c2012201b54ad7c420d868442137e202642ffffffffffffff03837c2218423388202042ffffffffffffff03837c2215420010cc06200341e0096a2011423388202142ffffffffffffff03837c22164200201842ffffffffffffff03832218420010cc06200341f00b6a200f4200202b420010cc06200341d00c6a200842002017420010cc06200341c00a6a201a42002015420010cc06200341f0096a201442002018420010cc06200341900b6a200c4200201642137e420010cc06200341d0096a201942002018420010cc06200341f00a6a200c42002017420010cc06200341d00b6a200f4200201a420010cc06200341b00c6a200842002014420010cc06200341a00a6a201642002015420010cc06200341900a6a201942002015420010cc06200341c0096a201342002018420010cc06200341e00a6a200c4200201a420010cc06200341c00b6a200f42002014420010cc06200341a00c6a200842002016420010cc06200341900c6a200842002019420010cc06200341800a6a201342002015420010cc06200341b0096a201c42002018420010cc06200341d00a6a200c42002014420010cc06200341b00b6a200f42002016420010cc06200320032903f00a221120032903d0097c220c20032903d00b7c220f20032903b00c7c220820032903a00a7c221420032903e00b221720032903800b7c221520032903c00c7c221620032903b00a7c221820032903e0097c221920032903d00c221f20032903f00b7c221a20032903c00a7c221b20032903f0097c221220032903900b7c2213423388200341d00c6a41086a290300200341f00b6a41086a2903007c201a201f54ad7c200341c00a6a41086a2903007c201b201a54ad7c200341f0096a41086a2903007c2012201b54ad7c200341900b6a41086a2903007c2013201254ad7c221b420d86847c221a423388200341e00b6a41086a290300200341800b6a41086a2903007c2015201754ad7c200341c00c6a41086a2903007c2016201554ad7c200341b00a6a41086a2903007c2018201654ad7c200341e0096a41086a2903007c2019201854ad7c201b4233887c201a201954ad7c2212420d86847c221542ffffffffffffff03833703e840200320032903c009221720032903900a7c221620032903e00a7c221820032903c00b7c221920032903a00c7c221b2015423388200341f00a6a41086a290300200341d0096a41086a2903007c200c201154ad7c200341d00b6a41086a2903007c200f200c54ad7c200341b00c6a41086a2903007c2008200f54ad7c200341a00a6a41086a2903007c2014200854ad7c20124233887c2015201454ad7c2212420d86847c220c42ffffffffffffff03833703f040200320032903800a221120032903900c7c220f20032903b0097c220820032903d00a7c221420032903b00b7c2215200c423388200341c0096a41086a290300200341900a6a41086a2903007c2016201754ad7c200341e00a6a41086a2903007c2018201654ad7c200341c00b6a41086a2903007c2019201854ad7c200341a00c6a41086a2903007c201b201954ad7c20124233887c200c201b54ad7c2216420d86847c220c42ffffffffffffff03833703f8402003200c423388200341800a6a41086a290300200341900c6a41086a2903007c200f201154ad7c200341b0096a41086a2903007c2008200f54ad7c200341d00a6a41086a2903007c2014200854ad7c200341b00b6a41086a2903007c2015201454ad7c20164233887c200c201554ad7c420d868442137e201342ffffffffffffff03837c220c42ffffffffffffff03833703d8402003200c423388201a42ffffffffffffff03837c3703e040200341a8c1006a200341d8c0006a4101106720034190096a20032903b041220c42002010420010cc06200341c0086a20032903b841220842137e22184200200d420010cc06200341f0076a20032903c041221542137e22164200200a420010cc06200341a0076a20032903c841221942137e221442002007420010cc06200341b0066a20032903a841220f42002005420010cc06200341a0096a200c42137e4200200d420010cc06200341d0086a20184200200a420010cc0620034180086a201642002007420010cc06200341a0066a200f42002010420010cc06200341b0076a201442002005420010cc0620034180096a200c42002005420010cc06200341b0086a200842002010420010cc06200341e0076a20164200200d420010cc0620034190076a20144200200a420010cc06200341c0066a200f42002007420010cc06200341f0086a200c42002007420010cc06200341a0086a200842002005420010cc06200341d0076a201542002010420010cc0620034180076a20144200200d420010cc06200341d0066a200f4200200a420010cc06200341e0086a200c4200200a420010cc0620034190086a200842002007420010cc06200341c0076a201542002005420010cc06200341f0066a201942002010420010cc06200341e0066a200f4200200d420010cc06200320032903b008220d2003290380097c221020032903e0077c22052003290390077c220720032903c0067c220c20032903c008221a2003290390097c220f20032903f0077c220820032903a0077c221420032903b0067c221520032903d008221b20032903a0097c22162003290380087c220a20032903a0067c221820032903b0077c2219423388200341d0086a41086a290300200341a0096a41086a2903007c2016201b54ad7c20034180086a41086a2903007c200a201654ad7c200341a0066a41086a2903007c2018200a54ad7c200341b0076a41086a2903007c2019201854ad7c420d86847c2216423388200341c0086a41086a29030020034190096a41086a2903007c200f201a54ad7c200341f0076a41086a2903007c2008200f54ad7c200341a0076a41086a2903007c2014200854ad7c200341b0066a41086a2903007c2015201454ad7c2016201554ad7c420d86847c220f42ffffffffffffff038337039041200320032903a008221820032903f0087c220820032903d0077c22142003290380077c221520032903d0067c220a200f423388200341b0086a41086a29030020034180096a41086a2903007c2010200d54ad7c200341e0076a41086a2903007c2005201054ad7c20034190076a41086a2903007c2007200554ad7c200341c0066a41086a2903007c200c200754ad7c200f200c54ad7c420d86847c221042ffffffffffffff0383370398412003200329039008220d20032903e0087c220520032903c0077c220720032903f0067c220c20032903e0067c220f2010423388200341a0086a41086a290300200341f0086a41086a2903007c2008201854ad7c200341d0076a41086a2903007c2014200854ad7c20034180076a41086a2903007c2015201454ad7c200341d0066a41086a2903007c200a201554ad7c2010200a54ad7c420d86847c221042ffffffffffffff03833703a0412003201042338820034190086a41086a290300200341e0086a41086a2903007c2005200d54ad7c200341c0076a41086a2903007c2007200554ad7c200341f0066a41086a2903007c200c200754ad7c200341e0066a41086a2903007c200f200c54ad7c2010200f54ad7c420d868442137e201942ffffffffffffff03837c221042ffffffffffffff03833703804120032010423388201642ffffffffffffff03837c37038841200341b0c0006a20034180c1006a106420034188c0006a200110644100210241012130034020034188c0006a20026a2d0000200341b0c0006a20026a2d0000732231410020316b72417f734180017141077610662030712130200241016a22024120470d000b203010662132200341a8c1006a41086a42f0ffffffffffff3f200141086a2903007d221042ffffffffffffff038342d0fdffffffffff3f20012903007d22054233887c370300200341a8c1006a41106a42f0ffffffffffff3f200141106a2903007d220742ffffffffffffff038320104233887c370300200341a8c1006a41186a42f0ffffffffffff3f200141186a2903007d221042ffffffffffffff038320074233887c370300200341a8c1006a41206a42f0ffffffffffff3f200141206a2903007d220742ffffffffffffff038320104233887c3703002003200742338842137e200542ffffffffffffff03837c3703a841200341b0c0006a20034180c1006a106420034188c0006a200341a8c1006a10644100210241012130034020034188c0006a20026a2d0000200341b0c0006a20026a2d0000732231410020316b72417f734180017141077610662030712130200241016a22024120470d000b200341c0036a42f0ffffffffffff3f200b7d220742338842f0ffffffffffff3f200e7d220542ffffffffffffff03837c2210420042a0d69f90da80b1cb00420010cc0620034190046a200542338842137e42d0fdffffffffff3f20097d220b42ffffffffffffff03837c22054200429db1bce4dfb435420010cc06200341e0046a42f0ffffffffffff3f20047d220e423388200742ffffffffffffff03837c2207420042badf96dcb5c3bac700420010cc06200341b0056a42f0ffffffffffff3f20067d2204423388200e42ffffffffffffff03837c220e420042a7ecfac2b5f7ea19420010cc0620034180066a200442ffffffffffffff0383200b4233887c220b420042b0c1bad0f4e48603420010cc06200341d0036a2010420042a7a7fbf49beaf607420010cc06200341a0046a2005420042b0c1bad0f4e48603420010cc06200341f0046a2007420042a0d69f90da80b1cb00420010cc06200341c0056a200e420042badf96dcb5c3bac700420010cc0620034190066a200b420042a7ecfac2b5f7ea19420010cc06200341b0036a2010420042badf96dcb5c3bac700420010cc0620034180046a2005420042e098f4e5e9ebfb03420010cc06200341d0046a2007420042a7ecfac2b5f7ea19420010cc06200341a0056a200e420042b0c1bad0f4e48603420010cc06200341f0056a200b4200429db1bce4dfb435420010cc06200341a0036a2010420042a7ecfac2b5f7ea19420010cc06200341f0036a20054200429e9981b4dab2e103420010cc06200341c0046a2007420042b0c1bad0f4e48603420010cc0620034190056a200e4200429db1bce4dfb435420010cc06200341e0056a200b420042e098f4e5e9ebfb03420010cc0620034190036a2010420042b0c1bad0f4e48603420010cc06200341e0036a20054200429df893c0a486ae01420010cc06200341b0046a20074200429db1bce4dfb435420010cc0620034180056a200e420042e098f4e5e9ebfb03420010cc06200341d0056a200b4200429e9981b4dab2e103420010cc06200341c0036a41086a290300211820034190046a41086a290300211920032903c00321102003290390042109200341e0046a41086a290300210d20032903e004210c200341b0056a41086a290300211a20032903b005210f20034180066a41086a290300211b2003290380062108200341d0036a41086a2903002112200341a0046a41086a290300211320032903d003210520032903a0042114200341f0046a41086a290300211120032903f0042115200341c0056a41086a290300211720032903c005211620034190066a41086a290300211f200329039006210a20032903b0032107200329038004210e20032903d004210b20032903a005210420032903f0052106203010662101200320062004200b2007200e7c220e7c220b7c22047c22062008200f200c201020097c22097c220c7c220f7c2208200a20162015200520147c22147c22157c22167c220a423388201f20172011201220137c2014200554ad7c7c2015201454ad7c7c2016201554ad7c7c200a201654ad7c2214420d86847c2205423388201b201a200d201820197c2009201054ad7c7c200c200954ad7c7c200f200c54ad7c7c2008200f54ad7c20144233887c2005200854ad7c2214420d86847c221042ffffffffffffff03833703b841200320032903a003221520032903f0037c220920032903c0047c220c2003290390057c220f20032903e0057c22082010423388200341b0036a41086a29030020034180046a41086a2903007c200e200754ad7c200341d0046a41086a2903007c200b200e54ad7c200341a0056a41086a2903007c2004200b54ad7c200341f0056a41086a2903007c2006200454ad7c20144233887c2010200654ad7c2206420d86847c221042ffffffffffffff03833703c0412003200329039003221420032903e0037c220720032903b0047c220e2003290380057c220b20032903d0057c22042010423388200341a0036a41086a290300200341f0036a41086a2903007c2009201554ad7c200341c0046a41086a2903007c200c200954ad7c20034190056a41086a2903007c200f200c54ad7c200341e0056a41086a2903007c2008200f54ad7c20064233887c2010200854ad7c2206420d86847c221042ffffffffffffff03833703c8412003201042338820034190036a41086a290300200341e0036a41086a2903007c2007201454ad7c200341b0046a41086a2903007c200e200754ad7c20034180056a41086a2903007c200b200e54ad7c200341d0056a41086a2903007c2004200b54ad7c20064233887c2010200454ad7c420d868442137e200a42ffffffffffffff03837c221042ffffffffffffff03833703a84120032010423388200542ffffffffffffff03837c3703b041200341b0c0006a20034180c1006a106420034188c0006a200341a8c1006a10644100210241012130034020034188c0006a20026a2d0000200341b0c0006a20026a2d0000732231410020316b72417f734180017141077610662030712130200241016a22024120470d000b203010662102200341c0006a20032903e0402205420042b0c1bad0f4e48603420010cc06200341d0006a20032903e840220742137e22064200429df893c0a486ae01420010cc06200341b0016a20032903f040220b42137e22044200429e9981b4dab2e103420010cc0620034190026a20032903f840220942137e220e420042e098f4e5e9ebfb03420010cc06200341f0026a20032903d84022104200429db1bce4dfb435420010cc062003200542137e4200429df893c0a486ae01420010cc06200341e0006a20064200429e9981b4dab2e103420010cc06200341c0016a2004420042e098f4e5e9ebfb03420010cc0620034180036a2010420042b0c1bad0f4e48603420010cc06200341a0026a200e4200429db1bce4dfb435420010cc06200341306a20054200429db1bce4dfb435420010cc0620034190016a2007420042b0c1bad0f4e48603420010cc06200341a0016a20044200429df893c0a486ae01420010cc0620034180026a200e4200429e9981b4dab2e103420010cc06200341e0026a2010420042e098f4e5e9ebfb03420010cc06200341206a2005420042e098f4e5e9ebfb03420010cc0620034180016a20074200429db1bce4dfb435420010cc06200341e0016a200b420042b0c1bad0f4e48603420010cc06200341f0016a200e4200429df893c0a486ae01420010cc06200341d0026a20104200429e9981b4dab2e103420010cc06200341106a20054200429e9981b4dab2e103420010cc06200341f0006a2007420042e098f4e5e9ebfb03420010cc06200341d0016a200b4200429db1bce4dfb435420010cc06200341b0026a2009420042b0c1bad0f4e48603420010cc06200341c0026a20104200429df893c0a486ae01420010cc062003201020102003290370221320032903107c220520032903d0017c220720032903b0027c220e20032903c0027c220b200329038001221120032903207c220420032903e0017c220620032903f0017c220920032903d0027c220c200329039001221720032903307c220f20032903a0017c22082003290380027c221420032903e0027c22152003290350221f20032903407c221620032903b0017c220a2003290390027c221820032903f0027c22192003290360221c20032903007c220d20032903c0017c221a2003290380037c221b20032903a0027c2212423388200341e0006a41086a290300200341086a2903007c200d201c54ad7c200341c0016a41086a2903007c201a200d54ad7c20034180036a41086a2903007c201b201a54ad7c200341a0026a41086a2903007c2012201b54ad7c420d86847c220d423388200341d0006a41086a290300200341c0006a41086a2903007c2016201f54ad7c200341b0016a41086a2903007c200a201654ad7c20034190026a41086a2903007c2018200a54ad7c200341f0026a41086a2903007c2019201854ad7c200d201954ad7c420d86847c221642338820034190016a41086a290300200341306a41086a2903007c200f201754ad7c200341a0016a41086a2903007c2008200f54ad7c20034180026a41086a2903007c2014200854ad7c200341e0026a41086a2903007c2015201454ad7c2016201554ad7c420d86847c220f42338820034180016a41086a290300200341206a41086a2903007c2004201154ad7c200341e0016a41086a2903007c2006200454ad7c200341f0016a41086a2903007c2009200654ad7c200341d0026a41086a2903007c200c200954ad7c200f200c54ad7c420d86847c2204423388200341f0006a41086a290300200341106a41086a2903007c2005201354ad7c200341d0016a41086a2903007c2007200554ad7c200341b0026a41086a2903007c200e200754ad7c200341c0026a41086a2903007c200b200e54ad7c2004200b54ad7c420d868442137e201242ffffffffffffff03837c220e42ffffffffffffff038385420020022001721066ad42ff01837d2205838522073703d8402003200e423388200d42ffffffffffffff03837c20032903e040221085200583201085220e3703e0402003200442ffffffffffffff038320032903f840221085200583201085220b3703f8402003200f42ffffffffffffff038320032903f04022108520058320108522043703f0402003201642ffffffffffffff038320032903e84022108520058320108522053703e84020034188c0006a200341d8c0006a1064200342f0ffffffffffff3f200b7d220642ffffffffffffff038342f0ffffffffffff3f20047d22094233887c200b85420020032d0088404101711066ad42ff01837d221083200b853703f8402003200942ffffffffffffff038342f0ffffffffffff3f20057d220b4233887c2004852010832004853703f0402003200b42ffffffffffffff038342f0ffffffffffff3f200e7d220b4233887c2005852010832005853703e8402003200b42ffffffffffffff038342d0fdffffffffff3f20077d22054233887c200e85201083200e853703e0402003200642338842137e200542ffffffffffffff03837c2007852010832007853703d8402000200120327210663a0000200020032903d840370308200041106a20032903e040370300200041186a20032903e840370300200041206a20032903f040370300200041286a20032903f840370300200341d0c1006a24000b8d990104017f227e057f057e230041f02b6b22022400200242003703e028200242013703d828200242003703e828200242003703f028200242003703f828200241c82a6a200141011067200241b8286a20022903d02a2203420042b0c1bad0f4e48603420010cc06200241e8276a20022903d82a220442137e22054200429df893c0a486ae01420010cc0620024198276a20022903e02a220642137e22074200429e9981b4dab2e103420010cc06200241c8266a20022903e82a220842137e2209420042e098f4e5e9ebfb03420010cc06200241d8256a20022903c82a220a4200429db1bce4dfb435420010cc06200241c8256a200a420042b0c1bad0f4e48603420010cc06200241c8286a200342137e4200429df893c0a486ae01420010cc06200241f8276a20054200429e9981b4dab2e103420010cc06200241a8276a2007420042e098f4e5e9ebfb03420010cc06200241d8266a20094200429db1bce4dfb435420010cc06200241d8276a2004420042b0c1bad0f4e48603420010cc0620024188276a20074200429df893c0a486ae01420010cc06200241b8266a20094200429e9981b4dab2e103420010cc06200241e8256a200a420042e098f4e5e9ebfb03420010cc06200241a8286a20034200429db1bce4dfb435420010cc06200241f8266a2006420042b0c1bad0f4e48603420010cc06200241a8266a20094200429df893c0a486ae01420010cc06200241f8256a200a4200429e9981b4dab2e103420010cc0620024198286a2003420042e098f4e5e9ebfb03420010cc06200241c8276a20044200429db1bce4dfb435420010cc0620024198266a2008420042b0c1bad0f4e48603420010cc0620024188266a200a4200429df893c0a486ae01420010cc0620024188286a20034200429e9981b4dab2e103420010cc06200241b8276a2004420042e098f4e5e9ebfb03420010cc06200241e8266a20064200429db1bce4dfb435420010cc06200241d8236a200229038827220b20022903d8277c220320022903b8267c220a20022903e8257c220920022903a8287c220620022903e827220c20022903b8287c22042002290398277c220720022903c8267c220520022903d8257c220820022903c828220d20022903c8257c220e20022903f8277c220f20022903a8277c221020022903d8267c2211423388200241c8286a41086a290300200241c8256a41086a2903007c200e200d54ad7c200241f8276a41086a2903007c200f200e54ad7c200241a8276a41086a2903007c2010200f54ad7c200241d8266a41086a2903007c2011201054ad7c420d86847c220e423388200241e8276a41086a290300200241b8286a41086a2903007c2004200c54ad7c20024198276a41086a2903007c2007200454ad7c200241c8266a41086a2903007c2005200754ad7c200241d8256a41086a2903007c2008200554ad7c200e200854ad7c420d86847c220742ffffffffffffff0383220442137e220c420042ffed8af7ec86c802420010cc06200241e8226a20022903882622122002290398267c22052002290388287c220820022903b8277c220f20022903e8267c221020022903a826221320022903f8267c220d20022903f8257c22142002290398287c221520022903c8277c2216200742338820024188276a41086a290300200241d8276a41086a2903007c2003200b54ad7c200241b8266a41086a2903007c200a200354ad7c200241e8256a41086a2903007c2009200a54ad7c200241a8286a41086a2903007c2006200954ad7c2007200654ad7c420d86847c220a423388200241a8266a41086a290300200241f8266a41086a2903007c200d201354ad7c200241f8256a41086a2903007c2014200d54ad7c20024198286a41086a2903007c2015201454ad7c200241c8276a41086a2903007c2016201554ad7c200a201654ad7c420d86847c220642338820024188266a41086a29030020024198266a41086a2903007c2005201254ad7c20024188286a41086a2903007c2008200554ad7c200241b8276a41086a2903007c200f200854ad7c200241e8266a41086a2903007c2010200f54ad7c2006201054ad7c420d868442137e201142ffffffffffffff03837c2205423388200e42ffffffffffffff03837c2203420042a3f1e59aa1b9d301420010cc0620024188246a200a42ffffffffffffff0383220942137e2211420042bbf9809de6b8ce03420010cc06200241c8246a200642ffffffffffffff0383220642137e2207420042a9808780a6f4f902420010cc06200241c8216a200542ffffffffffffff0383220a420042bdddd5d88385ea00420010cc06200241d8216a200a420042a3f1e59aa1b9d301420010cc06200241f8226a200342137e2217420042ffed8af7ec86c802420010cc06200241e8236a200c420042bbf9809de6b8ce03420010cc0620024198246a2011420042a9808780a6f4f902420010cc06200241d8246a2007420042bdddd5d88385ea00420010cc06200241e8246a2004420042a3f1e59aa1b9d301420010cc06200241f8236a2011420042ffed8af7ec86c802420010cc06200241b8246a2007420042bbf9809de6b8ce03420010cc06200241b8216a200a420042a9808780a6f4f902420010cc06200241d8226a2003420042bdddd5d88385ea00420010cc0620024198256a2009420042a3f1e59aa1b9d301420010cc06200241a8246a2007420042ffed8af7ec86c802420010cc06200241a8216a200a420042bbf9809de6b8ce03420010cc06200241c8226a2003420042a9808780a6f4f902420010cc06200241f8246a2004420042bdddd5d88385ea00420010cc06200241b8256a2006420042a3f1e59aa1b9d301420010cc06200241d8206a200a420042ffed8af7ec86c802420010cc06200241b8226a2003420042bbf9809de6b8ce03420010cc0620024188256a2004420042a9808780a6f4f902420010cc06200241a8256a2009420042bdddd5d88385ea00420010cc06200241c81c6a200620022903f8287c2205420042ccf7d9e9fbcee010420010cc06200241c81d6a200a20022903d8287c2208420042cff887b5bcb5c603420010cc06200241f81c6a200920022903f0287c220e4200428df582a3b0868004420010cc0620024198236a200420022903e8287c220f4200429aebd0c282f1c201420010cc06200241f8216a200320022903e0287c2210420042f682ffa299b88202420010cc06200241d81c6a2005420042ddf396f0fbf7b9c300420010cc06200241b81d6a2008420042f682ffa299b88202420010cc06200241e81c6a200e420042ccf7d9e9fbcee010420010cc0620024188236a200f4200428df582a3b0868004420010cc06200241e8216a20104200429aebd0c282f1c201420010cc06200241b81c6a20054200428df582a3b0868004420010cc06200241d81d6a2008420042848dc885f9eff000420010cc06200241881d6a200e4200429aebd0c282f1c201420010cc06200241a8236a200f420042f682ffa299b88202420010cc0620024188226a2010420042cff887b5bcb5c603420010cc06200241a81c6a20054200429aebd0c282f1c201420010cc06200241e81d6a2008420042dfddd7d2ccf91a420010cc06200241981d6a200e420042f682ffa299b88202420010cc06200241b8236a200f420042cff887b5bcb5c603420010cc0620024198226a2010420042848dc885f9eff000420010cc06200241981c6a2005420042f682ffa299b88202420010cc06200241f81d6a2008420042bed6acd4f2a00a420010cc06200241a81d6a200e420042cff887b5bcb5c603420010cc06200241c8236a200f420042848dc885f9eff000420010cc06200241a8226a2010420042dfddd7d2ccf91a420010cc06200241f81e6a42efffffffffffffc30020022903d820221820022903b8257c220820022903b8227c220e2002290388257c220f20022903a8257c221020022903a82422192002290398257c220520022903a8217c220d20022903c8227c221420022903f8247c221520022903f823221a20022903e8247c221620022903b8247c220b20022903b8217c221220022903d8227c221320022903d823221b20022903e8227c221c2002290388247c221d20022903c8247c221e20022903c8217c221f20022903f822222020022903d8217c222120022903e8237c22222002290398247c222320022903d8247c2224423388200241f8226a41086a290300200241d8216a41086a2903007c2021202054ad7c200241e8236a41086a2903007c2022202154ad7c20024198246a41086a2903007c2023202254ad7c200241d8246a41086a2903007c2024202354ad7c420d86847c2221423388200241d8236a41086a290300200241e8226a41086a2903007c201c201b54ad7c20024188246a41086a2903007c201d201c54ad7c200241c8246a41086a2903007c201e201d54ad7c200241c8216a41086a2903007c201f201e54ad7c2021201f54ad7c420d86847c221c423388200241f8236a41086a290300200241e8246a41086a2903007c2016201a54ad7c200241b8246a41086a2903007c200b201654ad7c200241b8216a41086a2903007c2012200b54ad7c200241d8226a41086a2903007c2013201254ad7c201c201354ad7c420d86847c2216423388200241a8246a41086a29030020024198256a41086a2903007c2005201954ad7c200241a8216a41086a2903007c200d200554ad7c200241c8226a41086a2903007c2014200d54ad7c200241f8246a41086a2903007c2015201454ad7c2016201554ad7c420d86847c220d42ffffffffffffff03837d221442ffffffffffffff038342efffffffffffffc300201642ffffffffffffff03837d22154233887c22054200200c428b868581d2a18c387c2216420010cc06200241c81f6a201442338842137e42bcfdffffffffffc300200d423388200241d8206a41086a290300200241b8256a41086a2903007c2008201854ad7c200241b8226a41086a2903007c200e200854ad7c20024188256a41086a2903007c200f200e54ad7c200241a8256a41086a2903007c2010200f54ad7c200d201054ad7c420d868442137e202442ffffffffffffff03837c220f42ffffffffffffff03837d221042ffffffffffffff03837c22084200200342bdddd5d88385ea007c220c420010cc0620024188216a201542ffffffffffffff038342efffffffffffffc300201c42ffffffffffffff03837d22144233887c220e4200201142e18392a796b7d2c4007c220d420010cc06200241b8206a201442ffffffffffffff038342efffffffffffffc300200f423388202142ffffffffffffff03837c7d22144233887c220f4200200742eda9ced69582d9307c2211420010cc06200241981e6a201442ffffffffffffff038320104233887c22074200200a42a3f1e59aa1b9d3017c2210420010cc06200241881f6a2005420020174287f0dc94c6dfde0f7c420010cc06200241881e6a201042002008420010cc0620024198216a200e42002016420010cc06200241c8206a200f4200200d420010cc0620024188206a200742002011420010cc06200241e81e6a20054200200d420010cc06200241b81f6a20084200200442a9808780a6f4f9027c220d420010cc06200241f8206a200e42002011420010cc06200241a81e6a200f42002010420010cc06200241f81f6a20074200200c420010cc06200241d81e6a200542002011420010cc06200241a81f6a20084200200942bbf9809de6b8ce037c2211420010cc06200241b81e6a200e42002010420010cc06200241a8206a200f4200200c420010cc06200241e81f6a20074200200d420010cc06200241c81e6a200542002010420010cc06200241981f6a20084200200642ffed8af7ec86c8027c420010cc06200241e8206a200e4200200c420010cc0620024198206a200f4200200d420010cc06200241d81f6a200742002011420010cc06200220022903b81c220b20022903d81d7c220720022903881d7c220520022903a8237c22082002290388227c220e20022903c81c221220022903c81d7c220f20022903f81c7c22102002290398237c221120022903f8217c220c20022903d81c221320022903b81d7c220d20022903e81c7c22142002290388237c221520022903e8217c2216423388200241d81c6a41086a290300200241b81d6a41086a2903007c200d201354ad7c200241e81c6a41086a2903007c2014200d54ad7c20024188236a41086a2903007c2015201454ad7c200241e8216a41086a2903007c2016201554ad7c420d86847c220d423388200241c81c6a41086a290300200241c81d6a41086a2903007c200f201254ad7c200241f81c6a41086a2903007c2010200f54ad7c20024198236a41086a2903007c2011201054ad7c200241f8216a41086a2903007c200c201154ad7c200d200c54ad7c420d86847c220f42ffffffffffffff038337039029200220022903a81c221520022903e81d7c221020022903981d7c221120022903b8237c220c2002290398227c2214200f423388200241b81c6a41086a290300200241d81d6a41086a2903007c2007200b54ad7c200241881d6a41086a2903007c2005200754ad7c200241a8236a41086a2903007c2008200554ad7c20024188226a41086a2903007c200e200854ad7c200f200e54ad7c420d86847c220742ffffffffffffff038337039829200220022903981c220b20022903f81d7c220520022903a81d7c220820022903c8237c220e20022903a8227c220f2007423388200241a81c6a41086a290300200241e81d6a41086a2903007c2010201554ad7c200241981d6a41086a2903007c2011201054ad7c200241b8236a41086a2903007c200c201154ad7c20024198226a41086a2903007c2014200c54ad7c2007201454ad7c420d86847c220742ffffffffffffff03833703a02920022007423388200241981c6a41086a290300200241f81d6a41086a2903007c2005200b54ad7c200241a81d6a41086a2903007c2008200554ad7c200241c8236a41086a2903007c200e200854ad7c200241a8226a41086a2903007c200f200e54ad7c2007200f54ad7c420d868442137e201642ffffffffffffff03837c220742ffffffffffffff03833703802920022007423388200d42ffffffffffffff03837c37038829200220022903e81e220b20022903b81f7c220720022903f8207c220520022903a81e7c220820022903f81f7c220e20022903f81e221220022903c81f7c220f2002290388217c221020022903b8207c221120022903981e7c220c20022903881f221320022903881e7c220d2002290398217c221420022903c8207c22152002290388207c2216423388200241881f6a41086a290300200241881e6a41086a2903007c200d201354ad7c20024198216a41086a2903007c2014200d54ad7c200241c8206a41086a2903007c2015201454ad7c20024188206a41086a2903007c2016201554ad7c420d86847c220d423388200241f81e6a41086a290300200241c81f6a41086a2903007c200f201254ad7c20024188216a41086a2903007c2010200f54ad7c200241b8206a41086a2903007c2011201054ad7c200241981e6a41086a2903007c200c201154ad7c200d200c54ad7c420d86847c220f42ffffffffffffff03833703e029200220022903d81e221520022903a81f7c221020022903b81e7c221120022903a8207c220c20022903e81f7c2214200f423388200241e81e6a41086a290300200241b81f6a41086a2903007c2007200b54ad7c200241f8206a41086a2903007c2005200754ad7c200241a81e6a41086a2903007c2008200554ad7c200241f81f6a41086a2903007c200e200854ad7c200f200e54ad7c420d86847c220742ffffffffffffff03833703e829200220022903c81e220b20022903981f7c220520022903e8207c22082002290398207c220e20022903d81f7c220f2007423388200241d81e6a41086a290300200241a81f6a41086a2903007c2010201554ad7c200241b81e6a41086a2903007c2011201054ad7c200241a8206a41086a2903007c200c201154ad7c200241e81f6a41086a2903007c2014200c54ad7c2007201454ad7c420d86847c220742ffffffffffffff03833703f02920022007423388200241c81e6a41086a290300200241981f6a41086a2903007c2005200b54ad7c200241e8206a41086a2903007c2008200554ad7c20024198206a41086a2903007c200e200854ad7c200241d81f6a41086a2903007c200f200e54ad7c2007200f54ad7c420d868442137e201642ffffffffffffff03837c220742ffffffffffffff03833703d02920022007423388200d42ffffffffffffff03837c3703d829200241c82a6a20024180296a200241d0296a106820022d00c82a2125200241a02a6a41206a2226200241f02a6a2903002207370300200241a02a6a41186a2227200241c82a6a41206a2903002205370300200241a02a6a41106a2228200241c82a6a41186a2903002208370300200241a02a6a41086a2229200241c82a6a41106a290300220e370300200220022903d02a220f3703a02a200241f81b6a200f420020012903082210420010cc06200241a81b6a200742002001290310220c42137e2216420010cc06200241d81a6a200542002001290318221442137e2215420010cc06200241881a6a200842002001290320220b42137e220d420010cc0620024198196a200e420020012903002211420010cc0620024188196a20114200200f420010cc06200241881c6a20074200201042137e420010cc06200241b81b6a200542002016420010cc06200241e81a6a200842002015420010cc06200241981a6a200e4200200d420010cc06200241981b6a200f4200200c420010cc06200241c81a6a200742002015420010cc06200241f8196a20054200200d420010cc06200241a8196a200842002011420010cc06200241e81b6a200e42002010420010cc06200241b81a6a200f42002014420010cc06200241e8196a20074200200d420010cc06200241b8196a200542002011420010cc06200241d81b6a200842002010420010cc06200241881b6a200e4200200c420010cc06200241d8196a200f4200200b420010cc06200241c8196a200742002011420010cc06200241c81b6a200542002010420010cc06200241f81a6a20084200200c420010cc06200241a81a6a200e42002014420010cc06200220022903c819222220022903d8197c220720022903c81b7c220520022903f81a7c220820022903a81a7c220e20022903e819222320022903b81a7c220f20022903b8197c221020022903d81b7c221120022903881b7c220c20022903c81a222420022903981b7c220d20022903f8197c221420022903a8197c221520022903e81b7c221620022903a81b221720022903f81b7c220b20022903d81a7c221220022903881a7c22132002290398197c221c20022903881c22182002290388197c221d20022903b81b7c221e20022903e81a7c221f20022903981a7c2221423388200241881c6a41086a29030020024188196a41086a2903007c201d201854ad7c200241b81b6a41086a2903007c201e201d54ad7c200241e81a6a41086a2903007c201f201e54ad7c200241981a6a41086a2903007c2021201f54ad7c420d86847c221d423388200241a81b6a41086a290300200241f81b6a41086a2903007c200b201754ad7c200241d81a6a41086a2903007c2012200b54ad7c200241881a6a41086a2903007c2013201254ad7c20024198196a41086a2903007c201c201354ad7c201d201c54ad7c420d86847c220b423388200241c81a6a41086a290300200241981b6a41086a2903007c200d202454ad7c200241f8196a41086a2903007c2014200d54ad7c200241a8196a41086a2903007c2015201454ad7c200241e81b6a41086a2903007c2016201554ad7c200b201654ad7c420d86847c220d423388200241e8196a41086a290300200241b81a6a41086a2903007c200f202354ad7c200241b8196a41086a2903007c2010200f54ad7c200241d81b6a41086a2903007c2011201054ad7c200241881b6a41086a2903007c200c201154ad7c200d200c54ad7c420d86847c220f423388200241c8196a41086a290300200241d8196a41086a2903007c2007202254ad7c200241c81b6a41086a2903007c2005200754ad7c200241f81a6a41086a2903007c2008200554ad7c200241a81a6a41086a2903007c200e200854ad7c200f200e54ad7c420d868442137e202142ffffffffffffff03837c220742ffffffffffffff03833703f82a20022007423388201d42ffffffffffffff03837c22053703802b2002200f42ffffffffffffff038322083703982b2002200d42ffffffffffffff0383220e3703902b2002200b42ffffffffffffff0383220f3703882b200241c82a6a200241f82a6a106420022d00c82a4101711066417f73410171106621012002200542f0ffffffffffff3f20057d221142ffffffffffffff038342d0fdffffffffff3f20022903f82a22107d220c4233887c8542002001ad42ff01837d22078320058522053703802b2002200842f0ffffffffffff3f20087d220d42ffffffffffffff038342f0ffffffffffff3f200e7d22144233887c8520078320088522083703982b2002200f42f0ffffffffffff3f200f7d221542ffffffffffffff038320114233887c85200783200f85220f3703882b200220102010200d42338842137e200c42ffffffffffffff03837c852007838522103703f82a2002200e201442ffffffffffffff038320154233887c85200783200e85220e3703902b2025417f7341017122011066212520292029290300221120058542002025ad42ff01837d220783201185370300202820282903002205200f85200783200585370300202720272903002205200e85200783200585370300202620262903002205200885200783200585370300200220022903a02a22052010852007832005853703a02a200241b80f6a200a42ecffffffffffff0385420020011066ad42ff01837d22078342ecffffffffffff038522054200200320022903e0287d42f0ffffffffffff3f7c220e42ffffffffffffff0383200a20022903d8287d42d0fdffffffffff3f7c220c4233887c220a420010cc06200241f80c6a200642ffffffffffffff038520078342ffffffffffffff038522084200200420022903e8287d42f0ffffffffffff3f7c221042ffffffffffffff0383200e4233887c220f42137e220d420010cc06200241c80d6a200942ffffffffffffff038520078342ffffffffffffff0385220e4200200920022903f0287d42f0ffffffffffff3f7c220942ffffffffffffff038320104233887c221042137e2211420010cc06200241980e6a200442ffffffffffffff038520078342ffffffffffffff038522044200200620022903f8287d42f0ffffffffffff3f7c221442ffffffffffffff038320094233887c221542137e2206420010cc06200241e80e6a200342ffffffffffffff038520078342ffffffffffffff038522034200201442338842137e200c42ffffffffffffff03837c2209420010cc06200241c80f6a200942002005420010cc06200241880d6a20084200200a42137e420010cc06200241d80d6a200e4200200d420010cc06200241a80e6a200442002011420010cc06200241f80e6a200342002006420010cc06200241a80f6a20054200200f420010cc06200241e80c6a200842002011420010cc06200241b80d6a200e42002006420010cc06200241880e6a200442002009420010cc06200241d80e6a20034200200a420010cc06200241980f6a200542002010420010cc06200241880c6a200842002006420010cc06200241a80d6a200e42002009420010cc06200241f80d6a20044200200a420010cc06200241c80e6a20034200200f420010cc06200241880f6a200542002015420010cc06200241a80b6a200842002009420010cc06200241980d6a200e4200200a420010cc06200241e80d6a20044200200f420010cc06200241b80e6a200342002010420010cc06200241880b6a20022903a80b221c20022903880f7c220a20022903980d7c220420022903e80d7c220920022903b80e7c220620022903880c221d20022903980f7c220320022903a80d7c220720022903f80d7c220520022903c80e7c220820022903e80c221e20022903a80f7c220e20022903b80d7c220f20022903880e7c221020022903d80e7c221120022903f80c221f20022903b80f7c220c20022903c80d7c220d20022903980e7c221420022903e80e7c221520022903880d222120022903c80f7c221620022903d80d7c220b20022903a80e7c221220022903f80e7c2213423388200241880d6a41086a290300200241c80f6a41086a2903007c2016202154ad7c200241d80d6a41086a2903007c200b201654ad7c200241a80e6a41086a2903007c2012200b54ad7c200241f80e6a41086a2903007c2013201254ad7c420d86847c2216423388200241f80c6a41086a290300200241b80f6a41086a2903007c200c201f54ad7c200241c80d6a41086a2903007c200d200c54ad7c200241980e6a41086a2903007c2014200d54ad7c200241e80e6a41086a2903007c2015201454ad7c2016201554ad7c420d86847c220c423388200241e80c6a41086a290300200241a80f6a41086a2903007c200e201e54ad7c200241b80d6a41086a2903007c200f200e54ad7c200241880e6a41086a2903007c2010200f54ad7c200241d80e6a41086a2903007c2011201054ad7c200c201154ad7c420d86847c220e423388200241880c6a41086a290300200241980f6a41086a2903007c2003201d54ad7c200241a80d6a41086a2903007c2007200354ad7c200241f80d6a41086a2903007c2005200754ad7c200241c80e6a41086a2903007c2008200554ad7c200e200854ad7c420d86847c220742ffffffffffffff03832203420042f8fb9b94e0ed8617420010cc06200241e8096a2007423388200241a80b6a41086a290300200241880f6a41086a2903007c200a201c54ad7c200241980d6a41086a2903007c2004200a54ad7c200241e80d6a41086a2903007c2009200454ad7c200241b80e6a41086a2903007c2006200954ad7c2007200654ad7c420d868442137e201342ffffffffffffff03837c220642ffffffffffffff0383220a420042b5cccc99bcc0e502420010cc06200241e80b6a200e42ffffffffffffff038322044200428b83d98ea38bdb0a420010cc06200241c80c6a200c42ffffffffffffff03832209420042e6c09290d28a8b35420010cc06200241b80a6a2006423388201642ffffffffffffff03837c2206420042a09ab5a7a4d5d602420010cc06200241980b6a2003420042efabafe6f7c88835420010cc06200241f8096a200a420042a09ab5a7a4d5d602420010cc06200241f80b6a2004420042f8fb9b94e0ed8617420010cc06200241d80c6a20094200428b83d98ea38bdb0a420010cc06200241c80a6a2006420042e6c09290d28a8b35420010cc06200241f80a6a20034200428b83d98ea38bdb0a420010cc06200241d8096a200a420042a8f2a9fabaa79b01420010cc06200241d80b6a2004420042e6c09290d28a8b35420010cc06200241b80c6a2009420042a09ab5a7a4d5d602420010cc06200241a80a6a2006420042b5cccc99bcc0e502420010cc06200241e80a6a2003420042e6c09290d28a8b35420010cc06200241c8096a200a420042a9afa6f3e694c800420010cc06200241c80b6a2004420042a09ab5a7a4d5d602420010cc06200241a80c6a2009420042b5cccc99bcc0e502420010cc06200241980a6a2006420042a8f2a9fabaa79b01420010cc06200241d80a6a2003420042a09ab5a7a4d5d602420010cc06200241b8096a200a420042c2cdbdbdb3d1e502420010cc06200241b80b6a2004420042b5cccc99bcc0e502420010cc06200241980c6a2009420042a8f2a9fabaa79b01420010cc06200241880a6a2006420042a9afa6f3e694c800420010cc0620022903d029210320022903f029210620022903e829210920022903e029210420022903d829210a200241a02b6a200241a02a6a41011067200241d8176a20022903a02a220720077c220e4200200a420010cc06200241a8176a2026290300220720077c22114200200442137e2208420010cc06200241d8166a2027290300220720077c220c4200200942137e2205420010cc06200241a8166a2028290300220b200b7c22144200200642137e2207420010cc06200241c8186a2029290300220f200f7c221542002003420010cc06200241c8176a20034200200e420010cc06200241b8176a20114200200a42137e420010cc06200241c8166a200c42002008420010cc0620024188186a201442002005420010cc06200241b8166a201542002007420010cc06200241e8176a200e42002004420010cc0620024198176a201142002005420010cc0620024198166a200c42002007420010cc0620024198186a201442002003420010cc06200241d8186a20154200200a420010cc06200241f8176a200e42002009420010cc06200241e8146a201142002007420010cc06200241e8166a200c42002003420010cc06200241a8186a20144200200a420010cc06200241e8186a201542002004420010cc06200241b8136a200e42002006420010cc0620024188176a201142002003420010cc06200241f8166a200c4200200a420010cc06200241b8186a201442002004420010cc06200241f8186a201542002009420010cc06200241a8076a20022903d80a221a20022903b8097c220720022903b80b7c220520022903980c7c220820022903880a7c220f20022903e80a221b20022903c8097c221020022903c80b7c220d20022903a80c7c221620022903980a7c221220022903f80a222020022903d8097c221320022903d80b7c221c20022903b80c7c221d20022903a80a7c221e20022903880b222a20022903e8097c221f20022903e80b7c222120022903c80c7c222220022903b80a7c222320022903980b222b20022903f8097c222420022903f80b7c221720022903d80c7c221820022903c80a7c2219423388200241980b6a41086a290300200241f8096a41086a2903007c2024202b54ad7c200241f80b6a41086a2903007c2017202454ad7c200241d80c6a41086a2903007c2018201754ad7c200241c80a6a41086a2903007c2019201854ad7c420d86847c2224423388200241880b6a41086a290300200241e8096a41086a2903007c201f202a54ad7c200241e80b6a41086a2903007c2021201f54ad7c200241c80c6a41086a2903007c2022202154ad7c200241b80a6a41086a2903007c2023202254ad7c2024202354ad7c420d86847c221f423388200241f80a6a41086a290300200241d8096a41086a2903007c2013202054ad7c200241d80b6a41086a2903007c201c201354ad7c200241b80c6a41086a2903007c201d201c54ad7c200241a80a6a41086a2903007c201e201d54ad7c201f201e54ad7c420d86847c2213423388200241e80a6a41086a290300200241c8096a41086a2903007c2010201b54ad7c200241c80b6a41086a2903007c200d201054ad7c200241a80c6a41086a2903007c2016200d54ad7c200241980a6a41086a2903007c2012201654ad7c2013201254ad7c420d86847c221042ffffffffffffff038320067d42f0ffffffffffff3f7c220642ffffffffffffff0383201342ffffffffffffff038320097d42f0ffffffffffff3f7c220d4233887c2209420042a88c8b81f5cabeca00420010cc06200241d8066a200642338842137e2010423388200241d80a6a41086a290300200241b8096a41086a2903007c2007201a54ad7c200241b80b6a41086a2903007c2005200754ad7c200241980c6a41086a2903007c2008200554ad7c200241880a6a41086a2903007c200f200854ad7c2010200f54ad7c420d868442137e201942ffffffffffffff03837c220642ffffffffffffff038320037d42d0fdffffffffff3f7c220742ffffffffffffff03837c2203420042d2dfded4f0ede000420010cc0620024198096a200d42ffffffffffffff0383201f42ffffffffffffff038320047d42f0ffffffffffff3f7c22054233887c2204420042c8ee859b8cd29829420010cc06200241c8086a200542ffffffffffffff03832006423388202442ffffffffffffff03837c200a7d42f0ffffffffffff3f7c22064233887c220a420042dcd78e98b19df320420010cc06200241f8076a200642ffffffffffffff038320074233887c22064200429bdceccb84d4fd03420010cc06200241b8076a2009420042969988cadca7b00e420010cc06200241e8066a20034200429bdceccb84d4fd03420010cc06200241a8096a2004420042a88c8b81f5cabeca00420010cc06200241d8086a200a420042c8ee859b8cd29829420010cc0620024188086a2006420042dcd78e98b19df320420010cc0620024198076a2009420042c8ee859b8cd29829420010cc06200241c8066a2003420042b8ecf9b5ffe8f503420010cc0620024188096a2004420042dcd78e98b19df320420010cc06200241b8086a200a4200429bdceccb84d4fd03420010cc06200241e8076a2006420042d2dfded4f0ede000420010cc0620024188076a2009420042dcd78e98b19df320420010cc0620024198056a200342004298c9f9f3f9c09502420010cc06200241f8086a20044200429bdceccb84d4fd03420010cc06200241a8086a200a420042d2dfded4f0ede000420010cc06200241d8076a2006420042b8ecf9b5ffe8f503420010cc06200241f8066a20094200429bdceccb84d4fd03420010cc06200241e8036a2003420042b4f0cadfb1d2dd01420010cc06200241e8086a2004420042d2dfded4f0ede000420010cc0620024198086a200a420042b8ecf9b5ffe8f503420010cc06200241c8076a200642004298c9f9f3f9c09502420010cc06200241c8126a200229038817222320022903b8137c220320022903f8167c220420022903b8187c220920022903f8187c220620022903e814222420022903f8177c220a20022903e8167c220720022903a8187c220520022903e8187c2208200229039817221720022903e8177c220f2002290398167c22102002290398187c220d20022903d8187c221620022903a817221820022903d8177c221220022903d8167c221320022903a8167c221c20022903c8187c221d20022903b817221920022903c8177c221e20022903c8167c221f2002290388187c222120022903b8167c2222423388200241b8176a41086a290300200241c8176a41086a2903007c201e201954ad7c200241c8166a41086a2903007c201f201e54ad7c20024188186a41086a2903007c2021201f54ad7c200241b8166a41086a2903007c2022202154ad7c420d86847c221e423388200241a8176a41086a290300200241d8176a41086a2903007c2012201854ad7c200241d8166a41086a2903007c2013201254ad7c200241a8166a41086a2903007c201c201354ad7c200241c8186a41086a2903007c201d201c54ad7c201e201d54ad7c420d86847c221242338820024198176a41086a290300200241e8176a41086a2903007c200f201754ad7c20024198166a41086a2903007c2010200f54ad7c20024198186a41086a2903007c200d201054ad7c200241d8186a41086a2903007c2016200d54ad7c2012201654ad7c420d86847c2210423388200241e8146a41086a290300200241f8176a41086a2903007c200a202454ad7c200241e8166a41086a2903007c2007200a54ad7c200241a8186a41086a2903007c2005200754ad7c200241e8186a41086a2903007c2008200554ad7c2010200854ad7c420d86847c220742ffffffffffffff0383220a420042f0ffffffffffff3f20022903b02b7d220542ffffffffffffff038342f0ffffffffffff3f20022903a82b7d22084233887c220f42137e2213420010cc0620024188106a200742338820024188176a41086a290300200241b8136a41086a2903007c2003202354ad7c200241f8166a41086a2903007c2004200354ad7c200241b8186a41086a2903007c2009200454ad7c200241f8186a41086a2903007c2006200954ad7c2007200654ad7c420d868442137e202242ffffffffffffff03837c221c42ffffffffffffff038322044200200842ffffffffffffff038342d1fdffffffffff3f20022903a02b7d22084233887c2209420010cc06200241f8136a201042ffffffffffffff03832206420042f0ffffffffffff3f20022903b82b7d220d42ffffffffffffff038320054233887c221042137e2203420010cc06200241a8156a201242ffffffffffffff03832207420042f0ffffffffffff3f20022903c02b7d221242ffffffffffffff0383200d4233887c220d42137e2216420010cc06200241a8116a201c423388201e42ffffffffffffff03837c22054200201242338842137e200842ffffffffffffff03837c2208420010cc06200241d8126a200a4200200942137e420010cc0620024198106a200842002004420010cc0620024188146a200642002013420010cc06200241b8156a200742002003420010cc06200241b8116a200542002016420010cc06200241b8126a200a42002003420010cc06200241f80f6a20044200200f420010cc06200241e8136a200642002016420010cc0620024198156a200742002008420010cc0620024198116a200542002009420010cc06200241c82b6a41106a2201200b370300200241c82b6a41086a201537030020012014370300200241c82b6a41186a200c370300200241c82b6a41206a20113703002002200e3703c82b200242003703d02a200242013703c82a200242003703d82a200242003703e02a200242003703e82a200220022903a02b42017c22033703c82a200220022903a82b220e3703d02a20024198136a200a420020022903b02b221142137e220b420010cc06200241d8106a20044200200e420010cc06200220113703d82a200241c8146a2006420020022903b82b221442137e2215420010cc06200220143703e02a200241f8156a2007420020022903c02b221242137e220c420010cc06200241f8116a200542002003420010cc06200241a8136a200a4200200e42137e2220420010cc06200241e8106a200342002004420010cc06200241d8146a20064200200b420010cc0620024188166a200742002015420010cc0620024188126a20054200200c420010cc0620024188136a200a42002015420010cc06200241c8106a200442002011420010cc06200241b8146a20064200200c420010cc06200241e8156a200742002003420010cc06200241e8116a20054200200e420010cc06200241a8126a200a42002016420010cc06200241e80f6a200442002010420010cc06200241d8136a200642002008420010cc0620024188156a200742002009420010cc0620024188116a20054200200f420010cc06200241f8126a200a4200200c420010cc06200241b8106a200442002014420010cc06200241a8146a200642002003420010cc06200241d8156a20074200200e420010cc06200241d8116a200542002011420010cc0620024198126a200a42002008420010cc06200241d80f6a20044200200d420010cc06200241c8136a200642002009420010cc06200241f8146a20074200200f420010cc06200241f8106a200542002010420010cc06200241e8126a200a42002003420010cc06200241a8106a200442002012420010cc0620024198146a20064200200e420010cc06200241c8156a200742002011420010cc06200241c8116a200542002014420010cc06200241a8036a20022903f806222a20022903e8037c220a20022903e8087c22042002290398087c220620022903c8077c2207200229038807222b2002290398057c220520022903f8087c221620022903a8087c221320022903d8077c221c200229039807222c20022903c8067c221d2002290388097c221e20022903b8087c221f20022903e8077c222120022903a807222d20022903d8067c22222002290398097c222320022903c8087c222420022903f8077c221720022903b807222e20022903e8067c221820022903a8097c221920022903d8087c221a2002290388087c221b423388200241b8076a41086a290300200241e8066a41086a2903007c2018202e54ad7c200241a8096a41086a2903007c2019201854ad7c200241d8086a41086a2903007c201a201954ad7c20024188086a41086a2903007c201b201a54ad7c420d86847c2218423388200241a8076a41086a290300200241d8066a41086a2903007c2022202d54ad7c20024198096a41086a2903007c2023202254ad7c200241c8086a41086a2903007c2024202354ad7c200241f8076a41086a2903007c2017202454ad7c2018201754ad7c420d86847c222242338820024198076a41086a290300200241c8066a41086a2903007c201d202c54ad7c20024188096a41086a2903007c201e201d54ad7c200241b8086a41086a2903007c201f201e54ad7c200241e8076a41086a2903007c2021201f54ad7c2022202154ad7c420d86847c221d42338820024188076a41086a29030020024198056a41086a2903007c2005202b54ad7c200241f8086a41086a2903007c2016200554ad7c200241a8086a41086a2903007c2013201654ad7c200241d8076a41086a2903007c201c201354ad7c201d201c54ad7c420d86847c221642ffffffffffffff038322054200200b420010cc06200241f8006a2016423388200241f8066a41086a290300200241e8036a41086a2903007c200a202a54ad7c200241e8086a41086a2903007c2004200a54ad7c20024198086a41086a2903007c2006200454ad7c200241c8076a41086a2903007c2007200654ad7c2016200754ad7c420d868442137e201b42ffffffffffffff03837c220442ffffffffffffff0383220a4200200e420010cc06200241d8046a201d42ffffffffffffff0383220742002015420010cc0620024188066a202242ffffffffffffff038322064200200c420010cc0620024198026a2004423388201842ffffffffffffff03837c220442002003420010cc0620024198036a200542002020420010cc0620024188016a20034200200a420010cc06200241c8046a20074200200b420010cc06200241f8056a200642002015420010cc06200241a8026a20044200200c420010cc06200241b8036a200542002015420010cc06200241e8006a200a42002011420010cc06200241e8046a20074200200c420010cc0620024198066a200642002003420010cc0620024188026a20044200200e420010cc06200241a8056a200d4200200642137e220b420010cc06200241e8026a200842002004420010cc0620024188046a20104200200742137e2216420010cc06200241286a200f4200200542137e2215420010cc06200241c8016a20094200200a420010cc06200241d8016a200a42002008420010cc06200241f8026a200d4200200442137e420010cc06200241b8056a20104200200b420010cc0620024198046a200f42002016420010cc06200241386a200942002015420010cc06200241c8056a200842002006420010cc06200241f8036a200d42002016420010cc06200241186a201042002015420010cc06200241b8016a200f4200200a420010cc06200241d8026a200942002004420010cc06200241c8036a20054200200c420010cc06200241d8006a200a42002014420010cc06200241f8046a200742002003420010cc06200241a8066a20064200200e420010cc06200241f8016a200442002011420010cc06200241a8046a200842002007420010cc06200241086a200d42002015420010cc06200241a8016a20104200200a420010cc06200241c8026a200f42002004420010cc06200241d8056a200942002006420010cc06200241d8036a200542002003420010cc06200241c8006a200a42002012420010cc0620024188056a20074200200e420010cc06200241b8066a200642002011420010cc06200241e8016a200442002014420010cc0620024188036a200842002005420010cc0620024198016a200d4200200a420010cc06200241b8026a201042002004420010cc06200241e8056a200f42002006420010cc06200241b8046a200942002007420010cc0620004188016a20022903b812221320022903f80f7c220320022903e8137c220a2002290398157c22042002290398117c220920022903c812220c2002290388107c220620022903f8137c220720022903a8157c220520022903a8117c220820022903d812220d2002290398107c220e2002290388147c220f20022903b8157c221020022903b8117c2211423388200241d8126a41086a29030020024198106a41086a2903007c200e200d54ad7c20024188146a41086a2903007c200f200e54ad7c200241b8156a41086a2903007c2010200f54ad7c200241b8116a41086a2903007c2011201054ad7c420d86847c220e423388200241c8126a41086a29030020024188106a41086a2903007c2006200c54ad7c200241f8136a41086a2903007c2007200654ad7c200241a8156a41086a2903007c2005200754ad7c200241a8116a41086a2903007c2008200554ad7c200e200854ad7c420d86847c220642ffffffffffffff03833703002000200229038813221c20022903c8107c220720022903b8147c220520022903e8157c220820022903e8117c220f200229039813221d20022903d8107c221020022903c8147c220c20022903f8157c220d20022903f8117c221420022903a813221e20022903e8107c221520022903d8147c22162002290388167c220b2002290388127c2212423388200241a8136a41086a290300200241e8106a41086a2903007c2015201e54ad7c200241d8146a41086a2903007c2016201554ad7c20024188166a41086a2903007c200b201654ad7c20024188126a41086a2903007c2012200b54ad7c420d86847c221542338820024198136a41086a290300200241d8106a41086a2903007c2010201d54ad7c200241c8146a41086a2903007c200c201054ad7c200241f8156a41086a2903007c200d200c54ad7c200241f8116a41086a2903007c2014200d54ad7c2015201454ad7c420d86847c221042ffffffffffffff038337031020004190016a20022903a812220b20022903e80f7c220c20022903d8137c220d2002290388157c22142002290388117c22162006423388200241b8126a41086a290300200241f80f6a41086a2903007c2003201354ad7c200241e8136a41086a2903007c200a200354ad7c20024198156a41086a2903007c2004200a54ad7c20024198116a41086a2903007c2009200454ad7c2006200954ad7c420d86847c220342ffffffffffffff0383370300200020022903f812221320022903b8107c220a20022903a8147c220420022903d8157c220920022903d8117c2206201042338820024188136a41086a290300200241c8106a41086a2903007c2007201c54ad7c200241b8146a41086a2903007c2005200754ad7c200241e8156a41086a2903007c2008200554ad7c200241e8116a41086a2903007c200f200854ad7c2010200f54ad7c420d86847c220742ffffffffffffff038337031820004198016a200229039812221c20022903d80f7c220520022903c8137c220820022903f8147c220f20022903f8107c22102003423388200241a8126a41086a290300200241e80f6a41086a2903007c200c200b54ad7c200241d8136a41086a2903007c200d200c54ad7c20024188156a41086a2903007c2014200d54ad7c20024188116a41086a2903007c2016201454ad7c2003201654ad7c420d86847c220342ffffffffffffff0383370300200020022903e812220b20022903a8107c220c2002290398147c220d20022903c8157c221420022903c8117c22162007423388200241f8126a41086a290300200241b8106a41086a2903007c200a201354ad7c200241a8146a41086a2903007c2004200a54ad7c200241d8156a41086a2903007c2009200454ad7c200241d8116a41086a2903007c2006200954ad7c2007200654ad7c420d86847c220a42ffffffffffffff03833703202000200342338820024198126a41086a290300200241d80f6a41086a2903007c2005201c54ad7c200241c8136a41086a2903007c2008200554ad7c200241f8146a41086a2903007c200f200854ad7c200241f8106a41086a2903007c2010200f54ad7c2003201054ad7c420d868442137e201142ffffffffffffff03837c220342ffffffffffffff03833703782000200a423388200241e8126a41086a290300200241a8106a41086a2903007c200c200b54ad7c20024198146a41086a2903007c200d200c54ad7c200241c8156a41086a2903007c2014200d54ad7c200241c8116a41086a2903007c2016201454ad7c200a201654ad7c420d868442137e201242ffffffffffffff03837c220a42ffffffffffffff038337030020004180016a2003423388200e42ffffffffffffff03837c3703002000200a423388201542ffffffffffffff03837c370308200041e0006a20022903b803221320022903687c220320022903e8047c220a2002290398067c22042002290388027c220920022903a803220c20022903787c220620022903d8047c22072002290388067c22052002290398027c2208200229039803220d2002290388017c220e20022903c8047c220f20022903f8057c221020022903a8027c221142338820024198036a41086a29030020024188016a41086a2903007c200e200d54ad7c200241c8046a41086a2903007c200f200e54ad7c200241f8056a41086a2903007c2010200f54ad7c200241a8026a41086a2903007c2011201054ad7c420d86847c220e423388200241a8036a41086a290300200241f8006a41086a2903007c2006200c54ad7c200241d8046a41086a2903007c2007200654ad7c20024188066a41086a2903007c2005200754ad7c20024198026a41086a2903007c2008200554ad7c200e200854ad7c420d86847c220642ffffffffffffff0383370300200041386a20022903f803221c20022903c8057c220720022903187c220520022903b8017c220820022903d8027c220f20022903a805221d20022903e8027c22102002290388047c220c20022903287c220d20022903c8017c221420022903f802221e20022903d8017c221520022903b8057c22162002290398047c220b20022903387c2212423388200241f8026a41086a290300200241d8016a41086a2903007c2015201e54ad7c200241b8056a41086a2903007c2016201554ad7c20024198046a41086a2903007c200b201654ad7c200241386a41086a2903007c2012200b54ad7c420d86847c2215423388200241a8056a41086a290300200241e8026a41086a2903007c2010201d54ad7c20024188046a41086a2903007c200c201054ad7c200241286a41086a2903007c200d200c54ad7c200241c8016a41086a2903007c2014200d54ad7c2015201454ad7c420d86847c221042ffffffffffffff0383370300200041e8006a20022903c803220b20022903587c220c20022903f8047c220d20022903a8067c221420022903f8017c22162006423388200241b8036a41086a290300200241e8006a41086a2903007c2003201354ad7c200241e8046a41086a2903007c200a200354ad7c20024198066a41086a2903007c2004200a54ad7c20024188026a41086a2903007c2009200454ad7c2006200954ad7c420d86847c220342ffffffffffffff0383370300200041c0006a2002290308221320022903a8047c220a20022903a8017c220420022903c8027c220920022903d8057c22062010423388200241f8036a41086a290300200241c8056a41086a2903007c2007201c54ad7c200241186a41086a2903007c2005200754ad7c200241b8016a41086a2903007c2008200554ad7c200241d8026a41086a2903007c200f200854ad7c2010200f54ad7c420d86847c220742ffffffffffffff0383370300200041f0006a20022903d803221c20022903487c22052002290388057c220820022903b8067c220f20022903e8017c22102003423388200241c8036a41086a290300200241d8006a41086a2903007c200c200b54ad7c200241f8046a41086a2903007c200d200c54ad7c200241a8066a41086a2903007c2014200d54ad7c200241f8016a41086a2903007c2016201454ad7c2003201654ad7c420d86847c220342ffffffffffffff0383370300200041c8006a200229039801220b2002290388037c220c20022903b8027c220d20022903e8057c221420022903b8047c22162007423388200241086a41086a290300200241a8046a41086a2903007c200a201354ad7c200241a8016a41086a2903007c2004200a54ad7c200241c8026a41086a2903007c2009200454ad7c200241d8056a41086a2903007c2006200954ad7c2007200654ad7c420d86847c220a42ffffffffffffff038337030020002003423388200241d8036a41086a290300200241c8006a41086a2903007c2005201c54ad7c20024188056a41086a2903007c2008200554ad7c200241b8066a41086a2903007c200f200854ad7c200241e8016a41086a2903007c2010200f54ad7c2003201054ad7c420d868442137e201142ffffffffffffff03837c220342ffffffffffffff0383370350200041d8006a2003423388200e42ffffffffffffff03837c3703002000200a42338820024198016a41086a29030020024188036a41086a2903007c200c200b54ad7c200241b8026a41086a2903007c200d200c54ad7c200241e8056a41086a2903007c2014200d54ad7c200241b8046a41086a2903007c2016201454ad7c200a201654ad7c420d868442137e201242ffffffffffffff03837c220342ffffffffffffff0383370328200041306a2003423388201542ffffffffffffff03837c370300200241f02b6a24000bbf2004047f017e027f1c7e23004190066b220224000240024020012c001f4100480d0020024180056a41186a2203200141186a29000037030020024180056a41106a2204200141106a29000037030020024180056a41086a2205200141086a29000037030020022001290000220637038005200220022d009f0541ff00713a009f05200241c0056a41186a22074200370300200241c0056a41106a22084200370300200241c0056a41086a220142003703002002200231008205421086200231008105420886200642ff0183848422063703c005200220023100830542188620068422063703c005200220023100840542208620068422063703c005200220023100850542288620068422063703c005200220023100860542308620068422063703c00520022002310087054238862006843703c005200120012903002005310000842206370300200120023100890542088620068422063703002001200231008a0542108620068422063703002001200231008b0542188620068422063703002001200231008c0542208620068422063703002001200231008d0542288620068422063703002001200231008e0542308620068422063703002001200231008f0542388620068437030020082008290300200431000084220637030020082002310091054208862006842206370300200820023100920542108620068422063703002008200231009305421886200684220637030020082002310094054220862006842206370300200820023100950542288620068422063703002008200231009605423086200684220637030020082002310097054238862006842209370300200720072903002003310000842206370300200720023100990542088620068422063703002007200231009a0542108620068422063703002007200231009b0542188620068422063703002007200231009c0542208620068422063703002007200231009d0542288620068422063703002007200231009e0542308620068422063703002007200231009f05423886200684220a37030020024180036a20022903c005220b42ffffffffffffff07832206420042edcd87b9d697d207420010cc06200241f0026a200229038003220c429bfcd192b1b4c7027e42ffffffffffffff0783220d420042eda7d7e7a5e39801420010cc06200241c0026a2006420042dac89fe3dad6ee01420010cc0620024180026a2001290300220e420c864280e0ffffffffff0783200b42348884220b420042edcd87b9d697d207420010cc06200241e0026a200d42004281cbb5cef7c5fa06420010cc06200241f0016a200229038002220f20022903c0027c2210200c20022903f00222117c220c423488200241f0026a41086a29030020024180036a41086a2903007c200c201154ad7c2212420c86847c221120022903e0027c2213429bfcd192b1b4c7027e42ffffffffffffff0783220c420042eda7d7e7a5e39801420010cc06200241b0026a20064200429bcad7d9feffff07420010cc06200241c0016a200b420042dac89fe3dad6ee01420010cc06200241d0036a200942188642808080f8ffffff0783200e42288884220e420042edcd87b9d697d207420010cc06200241d0026a200d420042f9bdd300420010cc06200241e0016a200c42004281cbb5cef7c5fa06420010cc06200241b0016a20022903c001221420022903b0027c221520022903d0037c221620022903d0027c221720022903e0017c221820022903f001221920137c221a423488200241f0016a41086a29030020024180026a41086a290300200241c0026a41086a2903007c2010200f54ad7c20124234887c2011201054ad7c200241e0026a41086a2903007c2013201154ad7c7c201a201954ad7c221b420c86847c2211429bfcd192b1b4c7027e42ffffffffffffff07832210420042eda7d7e7a5e39801420010cc06200241a0026a2006420042ffffffffffffff07420010cc0620024180016a200b4200429bcad7d9feffff07420010cc06200241c0036a200e420042dac89fe3dad6ee01420010cc06200241a0046a200a422486428080808080feff07832009421c88842209420042edcd87b9d697d207420010cc06200241d0016a200c420042f9bdd300420010cc06200241a0016a201042004281cbb5cef7c5fa06420010cc06200241f0006a200229038001221c20022903a0027c221320022903c0037c220f20022903a0047c221220022903d0017c221920022903a0017c221a20022903b001221d20117c221e423488200241b0016a41086a290300200241c0016a41086a290300200241b0026a41086a2903007c2015201454ad7c200241d0036a41086a2903007c2016201554ad7c200241d0026a41086a2903007c2017201654ad7c200241e0016a41086a2903007c2018201754ad7c201b4234887c2011201854ad7c7c201e201d54ad7c221f420c86847c2215429bfcd192b1b4c7027e42ffffffffffffff07832211420042eda7d7e7a5e39801420010cc0620024190026a2006420042ffffffffffff03420010cc06200241c0006a200b420042ffffffffffffff07420010cc06200241b0036a200e4200429bcad7d9feffff07420010cc0620024190046a2009420042dac89fe3dad6ee01420010cc06200241f0046a200a4210882206420042edcd87b9d697d207420010cc0620024190016a2010420042f9bdd300420010cc06200241e0006a201142004281cbb5cef7c5fa06420010cc06200241306a200229034022202002290390027c221620022903b0037c22172002290390047c221820022903f0047c2214200d422c867c221b2002290390017c221d20022903607c221e2002290370220a20157c2221423488200241f0006a41086a29030020024180016a41086a290300200241a0026a41086a2903007c2013201c54ad7c200241c0036a41086a2903007c200f201354ad7c200241a0046a41086a2903007c2012200f54ad7c200241d0016a41086a2903007c2019201254ad7c200241a0016a41086a2903007c201a201954ad7c201f4234887c2015201a54ad7c7c2021200a54ad7c221f420c86847c2213429bfcd192b1b4c7027e42ffffffffffffff0783220a420042eda7d7e7a5e39801420010cc06200241a0036a200e420042ffffffffffffff07420010cc062002200b420042ffffffffffff03420010cc0620024180046a20094200429bcad7d9feffff07420010cc06200241e0046a2006420042dac89fe3dad6ee01420010cc06200241d0006a2011420042f9bdd300420010cc06200241206a200a42004281cbb5cef7c5fa06420010cc06200241f0036a2009420042ffffffffffffff07420010cc0620024190036a200e420042ffffffffffff03420010cc06200241d0046a20064200429bcad7d9feffff07420010cc06200241106a200a420042f9bdd300420010cc06200241c0046a2006420042ffffffffffffff07420010cc06200241e0036a2009420042ffffffffffff03420010cc06200241b0046a2006420042ffffffffffff03420010cc06200120022903f00322212002290390037c220620022903d0047c220b2010422c867c220e20022903107c220920022903a003222220022903007c22152002290380047c220f20022903e0047c2212200c422c867c221920022903507c221a20022903207c221c2002290330222320137c2224423488200241306a41086a290300200241c0006a41086a29030020024190026a41086a2903007c2016202054ad7c200241b0036a41086a2903007c2017201654ad7c20024190046a41086a2903007c2018201754ad7c200241f0046a41086a2903007c2014201854ad7c200d4214887c201b201454ad7c20024190016a41086a2903007c201d201b54ad7c200241e0006a41086a2903007c201e201d54ad7c201f4234887c2013201e54ad7c7c2024202354ad7c2213420c86847c220d423488200241a0036a41086a290300200241086a2903007c2015202254ad7c20024180046a41086a2903007c200f201554ad7c200241e0046a41086a2903007c2012200f54ad7c200c4214887c2019201254ad7c200241d0006a41086a2903007c201a201954ad7c200241206a41086a2903007c201c201a54ad7c20134234887c200d201c54ad7c2216420c86847c220c42ffffffffffffff0783200d42ffffffffffffff07834293d8a898da9ce77e7c220d423f877c42ffb4cab188ba85797c221742ffffffffffffff0783200d42ffffffffffffff0783200a422c86221820022903b0047c220d20022903c004220f20022903e0037c22132011422c867c2215200c423488200241f0036a41086a29030020024190036a41086a2903007c2006202154ad7c200241d0046a41086a2903007c200b200654ad7c20104214887c200e200b54ad7c200241106a41086a2903007c2009200e54ad7c20164234887c200c200954ad7c220b420c86847c2206423488200241c0046a41086a290300200241e0036a41086a2903007c2013200f54ad7c20114214887c2015201354ad7c200b4234887c2006201554ad7c220c420c86847c220b423488200a421488200241b0046a41086a2903007c200d201854ad7c200c4234887c200b200d54ad7c420c8684200b42ffffffffffffff0783200642ffffffffffffff07832017423f877c4287c2ac7f7c220b423f877c220c423f877c428080808080807c7c2210423f87220e42eda7d7e7a5e39801837c22064234887c200e4281cbb5cef7c5fa06837c220d42ffffffffffffff078322093703002008200b42ffffffffffffff0783200d4234887c200e42f9bdd300837c220b42ffffffffffffff078322113703002007200c42ffffffffffffff0783200b4234887c220c42ffffffffffffff0783220a370300200241c0056a41206a201042ffffffffffffff0783200c4234887c200e4280808080808004837c220e42ffffffffffffff07833703002002200642ffffffffffffff078322103703c0052002200e4228883c00bf052002200e4220883c00be052002200e4218883c00bd052002200e4210883c00bc052002200e4208883c00bb052002200e3c00ba052002200c422c883c00b9052002200c4224883c00b8052002200c421c883c00b7052002200c4214883c00b6052002200c420c883c00b5052002200c4204883c00b4052002200a4204862011423088843c00b3052002200b4228883c00b2052002200b4220883c00b1052002200b4218883c00b0052002200b4210883c00af052002200b4208883c00ae052002200b3c00ad052002200d422c883c00ac052002200d4224883c00ab052002200d421c883c00aa052002200d4214883c00a9052002200d420c883c00a8052002200d4204883c00a705200220094204862010423088843c00a605200220064228883c00a505200220064220883c00a405200220064218883c00a305200220064210883c00a205200220064208883c00a105200220063c00a00541002101410121070340200241a0056a20016a2d000020024180056a20016a2d0000732208410020086b72417f734180017141077610662007712107200141016a22014120470d000b4100210102402007106641ff01714101470d002000200229038005370001200041196a20024198056a290300370000200041116a20024190056a290300370000200041096a20024188056a290300370000410121010b200020013a00000c010b200041003a00000b20024190066a24000bb60601067f20012002106c02402001450d00200141d8006c2103410021040340200020046a220541046a2802002106200541086a28020022072002106c2002200241086a22012802002007106d2002280200200128020022086a2006200710cf061a2001200820076a2207360200200541d4006a2d00002106200220074101106d2002280200200128020022076a20064101463a00002001200741016a220636020002402005410c6a2d0000220741024b0d0002400240024020070e03000102000b200220064101106d2002280200200128020022076a41003a00002001200741016a360200200541146a2802002106200541186a28020022072002106c200220012802002007106d2002280200200128020022086a2006200710cf061a2001200820076a3602000c020b200220064101106d2002280200200128020022076a41013a00002001200741016a36020020022005410d6a2d0000106e200541146a2802002106200541186a28020022072002106c200220012802002007106d2002280200200128020022086a2006200710cf061a2001200820076a360200200541206a2802002106200541246a28020022072002106c200220012802002007106d2002280200200128020022086a2006200710cf061a2001200820076a22073602002005410e6a2d00002106200220074101106d2002280200200128020022076a20063a00002001200741016a3602000c010b200220064101106d2002280200200128020022076a41023a00002001200741016a36020020022005410d6a2d0000106e200541146a2802002106200541186a28020022072002106c200220012802002007106d2002280200200128020022086a2006200710cf061a2001200820076a360200200541206a2802002106200541246a28020022072002106c200220012802002007106d2002280200200128020022086a2006200710cf061a2001200820076a3602002005412c6a2802002106200541306a28020022072002106c200220012802002007106d2002280200200128020022086a2006200710cf061a2001200820076a36020020022005410e6a2d0000106e0b2002200541346a106f2002200541c4006a10702003200441d8006a2204470d000b0b0b910201027f024002400240200041c000490d00200041808001490d012000418080808004490d022001200141086a22022802004101106d2001280200200228020022036a41033a00002002200341016a2203360200200120034104106d2001280200200228020022016a20003600002002200141046a3602000f0b2001200141086a22022802004101106d2001280200200228020022016a20004102743a00002002200141016a3602000f0b2001200141086a22022802004102106d2001280200200228020022016a20004102744101723b00002002200141026a3602000f0b2001200141086a22022802004104106d2001280200200228020022016a20004102744102723600002002200141046a3602000b9a0101017f0240200041046a280200220320016b20024f0d000240024002400240200120026a22022001490d00200341017422012002200120024b1b22014108200141084b1b22014100480d002000280200410020031b2202450d0120032001460d032003450d0120022003200110282202450d020c030b102e000b2001102422020d010b102c000b20002002360200200041046a20013602000b0bed02000240200141ff0171220141064b0d00024002400240024002400240024020010e0700010203040506000b2000200041086a22012802004101106d2000280200200128020022006a41003a00002001200041016a3602000f0b2000200041086a22012802004101106d2000280200200128020022006a41013a00002001200041016a3602000f0b2000200041086a22012802004101106d2000280200200128020022006a41023a00002001200041016a3602000f0b2000200041086a22012802004101106d2000280200200128020022006a41033a00002001200041016a3602000f0b2000200041086a22012802004101106d2000280200200128020022006a41043a00002001200041016a3602000f0b2000200041086a22012802004101106d2000280200200128020022006a41053a00002001200041016a3602000f0b2000200041086a22012802004101106d2000280200200128020022006a41063a00002001200041016a3602000b0bcc0101037f230041106b220224000240024020012802004101470d00200128020421032001410c6a28020022012000106c2000200041086a22042802002001106d2000280200200428020022006a2003200110cf061a2004200020016a3602000c010b20022001280204200141086a28020028020c11020020022802002103200228020822012000106c2000200041086a22042802002001106d2000280200200428020022006a2003200110cf061a2004200020016a3602002002280204450d00200310260b200241106a24000b810201057f200128020421020240024020012802004101470d002001410c6a28020022012000106c20014103742201450d01200220016a2103034020022802002104200241046a28020022012000106c2000200041086a22052802002001106d2000280200200528020022066a2004200110cf061a2005200620016a360200200241086a22022003470d000c020b0b200141086a28020022012000106c20014103742201450d00200220016a2103034020022802002104200241046a28020022012000106c2000200041086a22052802002001106d2000280200200528020022066a2004200110cf061a2005200620016a360200200241086a22022003470d000b0b0bae1001097f230041c0006b2203240020012002106c02402001450d002000200141ec006c6a2104200241086a21010340200022052802042106200528020822072002106c200220012802002007106d2002280200200128020022086a2006200710cf061a2001200820076a2207360200200528020c2106200220074101106d2002280200200128020022076a21080240024020064102470d00200841003a00002001200741016a3602000c010b200841013a00002001200741016a3602000240200528020c4101470d0020052802142106200528021822072002106c200220012802002007106d2002280200200128020022086a2006200710cf061a2001200820076a360200200528022021070240200528021c4101470d00200720052802282002106b0c020b2007200541246a2802002002106b0c010b200341206a200528021011030020032802242106200328022822072002106c200220012802002007106d2002280200200128020022086a2006200710cf061a2001200820076a360200200328023021080240200328022c4101460d00200820032802342002106b0c010b200820032802382002106b024020032802382207450d00200741d8006c21094100210603400240200820066a220741346a280200450d002007413c6a280200450d00200741386a28020010260b0240200741c4006a280200450d00200741cc006a28020041ffffffff0171450d00200741c8006a28020010260b2009200641d8006a2206470d000b0b20032802342207450d00200741d8006c450d00200810260b200528022c2107200220012802004101106d2002280200200128020022066a21080240024020074102470d00200841003a00002001200641016a3602000c010b200841013a00002001200641016a3602000240200528022c4101470d0020052802302106200528023822072002106c2007450d012007412c6c21082006411c6a21070340200741686a28020021092007416c6a28020022062002106c200220012802002006106d20022802002001280200220a6a2009200610cf061a2001200a20066a3602002002200741706a10722002200710702007412c6a2107200841546a22080d000c020b0b200341186a200528023011030020032802182106200328021c22072002106c2007450d002007412c6c21082006411c6a21070340200741686a28020021092007416c6a28020022062002106c200220012802002006106d20022802002001280200220a6a2009200610cf061a2001200a20066a3602002002200741706a10722002200710702007412c6a2107200841546a22080d000b0b200528023c2107200220012802004101106d2002280200200128020022066a21080240024020074102470d00200841003a00002001200641016a3602000c010b200841013a00002001200641016a3602000240200528023c4101470d0020052802402106200528024822072002106c2007450d012007412c6c21082006411c6a21070340200741686a28020021092007416c6a28020022062002106c200220012802002006106d20022802002001280200220a6a2009200610cf061a2001200a20066a3602002002200741706a10702002200710702007412c6a2107200841546a22080d000c020b0b200341106a200528024011030020032802102106200328021422072002106c2007450d002007412c6c21082006411c6a21070340200741686a28020021092007416c6a28020022062002106c200220012802002006106d20022802002001280200220a6a2009200610cf061a2001200a20066a3602002002200741706a10702002200710702007412c6a2107200841546a22080d000b0b02400240200528024c4101470d0020052802502100200528025822072002106c2007450d01200741386c210b410021080340200020086a220741046a2802002109200741086a28020022062002106c200220012802002006106d20022802002001280200220a6a2009200610cf061a2001200a20066a360200200741106a2802002109200741146a28020022062002106c200220012802002006106d20022802002001280200220a6a2009200610cf061a2001200a20066a3602002002200741186a106f2002200741286a1070200b200841386a2208470d000c020b0b200341086a200528025011030020032802082100200328020c22072002106c2007450d00200741386c210b410021080340200020086a220741046a2802002109200741086a28020022062002106c200220012802002006106d20022802002001280200220a6a2009200610cf061a2001200a20066a360200200741106a2802002109200741146a28020022062002106c200220012802002006106d20022802002001280200220a6a2009200610cf061a2001200a20066a3602002002200741186a106f2002200741286a1070200b200841386a2208470d000b0b200541ec006a210002400240200528025c4101470d0020052802602106200528026822072002106c2007450d012007411c6c2108200641086a210703402007417c6a2802002109200728020022062002106c200220012802002006106d20022802002001280200220a6a2009200610cf061a2001200a20066a3602002002200741046a10702007411c6a2107200841646a22080d000c020b0b2003200528026011030020032802002106200328020422072002106c2007450d002007411c6c2108200641086a210703402007417c6a2802002109200728020022062002106c200220012802002006106d20022802002001280200220a6a2009200610cf061a2001200a20066a3602002002200741046a10702007411c6a2107200841646a22080d000b0b20002004470d000b0b200341c0006a24000b950301057f200128020421020240024020012802004101470d002001410c6a28020022012000106c2001450d01200141186c2103200241146a2101200041086a21020340200141706a2802002104200141746a28020022052000106c200020022802002005106d2000280200200228020022066a2004200510cf061a2002200620056a3602002001417c6a2802002104200128020022052000106c200020022802002005106d2000280200200228020022066a2004200510cf061a2002200620056a360200200141186a2101200341686a22030d000c020b0b200141086a28020022012000106c2001450d00200141186c2103200241146a2101200041086a21020340200141706a2802002104200141746a28020022052000106c200020022802002005106d2000280200200228020022066a2004200510cf061a2002200620056a3602002001417c6a2802002104200128020022052000106c200020022802002005106d2000280200200228020022066a2004200510cf061a2002200620056a360200200141186a2101200341686a22030d000b0b0ba504010a7f20004201370200200041086a41003602002001410c6a28020021022001280208210320012802042104024002400240200128020022050d00200220036b410020031b21010c010b200420056b2106024020030d00200621010c010b2006200220036b6a220120064f0d000240024020042005460d00200541016a21010c010b2003450d0220022003460d024100210120032105200341016a21030b200041086a2107200041046a2108410121094100210a41002106034020052d0000210b02402006200a470d000240024020010d00200220036b410020031b21050c010b200420016b21052003450d00417f2005200220036b6a220920092005491b21050b2000200a417f200541016a220920092005491b106d200028020021090b200920066a200b3a00002007200641016a2206360200024002400240024020010d002001210b0c010b20012004470d014100210b0b2003450d0420032002460d0420032105200341016a21030c010b200141016a210b200121050b2008280200210a200b21010c000b0b200041002001106d2000280200200041086a28020022066a210102402005450d0020042005460d002004200620056b6a21060340200120052d00003a0000200141016a21012004200541016a2205470d000b0b02402003450d0020022003460d00200620036b21050340200120032d00003a0000200141016a21012002200341016a2203470d000b200220056a21060b200041086a20063602000b0b3a01017f20002802002200200041086a22032802002002106d2000280200200328020022006a2001200210cf061a2003200020026a36020041000b6301017f230041206b2202240020022000280200360204200241086a41106a200141106a290200370300200241086a41086a200141086a29020037030020022001290200370308200241046a41949fc000200241086a10352101200241206a240020010b040041010be90101027f230041c0006b2202240020024100360210200242013703082002410836021c20022001410c6a3602202002200241206a3602182002200241086a3602242002413c6a41013602002002420137022c200241d0adc7003602282002200241186a360238200241246a41949fc000200241286a10351a41052103024002400240024002402001280200417f6a0e050001020304000b410121030c030b410221030c020b410321030c010b410421030b2003200141046a280200200141086a2802002002280208200228021010790240200228020c450d00200228020810260b200241c0006a24000b6901037f230041206b220224002001411c6a280200210320012802182104200241086a41106a2000280200220141106a290200370300200241086a41086a200141086a2902003703002002200129020037030820042003200241086a10352101200241206a240020010b5601017f4104210502400240024002400240200041ff0171417f6a0e050001020304000b410021050c030b410121050c020b410221050c010b410321050b20052002ad4220862001ad842004ad4220862003ad8410230ba90803197e017f147e20002903c0012101200029039801210220002903702103200029034821042000290320210520002903b8012106200029039001210720002903682108200029034021092000290318210a20002903b001210b200029038801210c2000290360210d2000290338210e2000290310210f20002903a8012110200029038001211120002903582112200029033021132000290308211420002903a00121152000290378211620002903502117200029032821182000290300211941c07e211a0340200b200c200d200e200f85858585221b4201892015201620172018201985858585221c85221d201385211e20012006200720082009200a85858585221f201c42018985221c85212020012002200320042005858585852221420189201b85221b2009854237892222201f4201892010201120122013201485858585220985221f200f85423e892223427f8583201d201085420289222485210120222021200942018985220f20168542298922212003201c854227892225427f8583852110201b2006854238892226201f200c85420f892227427f8583201d201285420a89222885210c2028200f2018854224892229427f85832005201c85421b89222a852116200f2015854212892215201f200e85420689222b201d201485420189222c427f85838521032002201c85420889222d201b200885421989222e427f8583202b8521122004201c85421489221c201b200a85421c89220a427f8583201f200b85423d89220e852104200a200e427f8583201d201185422d89221d852109200f2017854203892214200e201d427f858385210e201d2014427f8583201c852113200a2014201c427f8583852118201b200785421589221d200f201985221c2020420e89221b427f858385210a201b201d427f8583201f200d85422b89221f85210f201d201f427f8583201e422c89221d852114201a4198a1c0006a290300201c201f201d427f85838585211920262029202a427f858385221f2102201d201c427f8583201b85221d2105202120232024427f858385221c2106202a2026427f8583202785221b2107202c2015427f8583202d852226210820242021427f85832025852224210b202e2015202d427f8583852221210d202920272028427f8583852227211120252022427f858320238522222115202e202b427f8583202c8522232117201a41086a221a0d000b200020223703a00120002016370378200020233703502000201837032820002019370300200020103703a8012000202737038001200020123703582000201337033020002014370308200020243703b0012000200c37038801200020213703602000200e3703382000200f3703102000201c3703b8012000201b3703900120002026370368200020093703402000200a370318200020013703c0012000201f3703980120002003370370200020043703482000201d3703200b040041000b02000b02000bb80701027f230041f0006b22032400200320013a000b02400240024002400240024002400240024020020d002003200141087122023a000c20020d03200020013a00ca0120002d00c9012104200020002d00c801220241016a3a00c901200320013a0059200320043a0058200241c7014b0d02200020026a220120012d000020032d0058733a0000200020002d00c80141016a22023a00c801200241ff0171220141a601470d01200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a7012000107a41002102200041003b01c8010c050b20002d00ca01200141ff0171470d030c050b200141c801490d030b200241ff017141c80141dca1c0001032000b200341386a41146a4109360200200341c4006a410a360200200341206a41146a410336020020032003410c6a360254200341bd80c700360210200341d8006a41146a410036020020034203370224200341d4c0c7003602202003410a36023c200341d4c0c7003602682003420137025c200341a4a3c0003602582003200341386a3602302003200341d8006a3602482003200341106a3602402003200341d4006a360238200341206a41aca3c000103d000b200341386a41146a4109360200200341386a410c6a410a3602002003200041ca016a220036020c20032003410b6a360254200341d8006a41146a4102360200200341d8006a410c6a4102360200200341106a410c6a410b3602002003410a36023c200341d4a2c0003602602003410236025c200341c4a2c0003602582003410b360214200320003602102003200341d8006a3602482003200341d4006a36024020032003410c6a3602382003200341106a36026820032003410b6a360218200341206a41146a410336020020034203370224200341d4c0c7003602202003200341386a360230200341206a4194a3c000103d000b2000200241ff01716a220120012d000020032d0059733a0000200020002d00c80141016a22013a00c8010240200141ff017141a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a7012000107a41002101200041003b01c8010b20032d000b412471450d00200141ff01712201450d00200141c7014b0d01200020016a220120012d000020002d00c901733a000020002d00c80141016a41ff0171220141c8014f0d02200020016a220120012d00004104733a0000200020002d00a701418001733a00a7012000107a200041003b01c8010b200341f0006a24000f0b200141c80141bca3c0001032000b200141c80141cca3c0001032000bc40201037f23004180016b220224002000280200210002400240024002400240200128020022034110710d0020002d0000210420034120710d012004ad42ff01832001104221000c020b20002d00002104410021000340200220006a41ff006a2004410f712203413072200341d7006a2003410a491b3a00002000417f6a21002004410476410f7122040d000b20004180016a22044181014f0d02200141e889c0004102200220006a4180016a410020006b104521000c010b410021000340200220006a41ff006a2004410f712203413072200341376a2003410a491b3a00002000417f6a21002004410476410f7122040d000b20004180016a22044181014f0d02200141e889c0004102200220006a4180016a410020006b104521000b20024180016a240020000f0b200441800141d889c0001048000b200441800141d889c0001048000bc81901037f230041a0026b22032400200341086a41126a410041b60110d1061a200341166a41002800d6a140360100200341002f00cca1403b010c200341002800c8a140360208200341002900cea14037010e200341086a107a2000200341086a41c80110cf06220041003a00ca01200041003b01c801200041124100107e024020002d00c801220441c7014b0d00200020046a220420042d000041cd00733a0000200020002d00c80141016a22043a00c80102400240200441ff0171220441a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a7012000107a41002104200041003b01c8010c010b200441c8014f0d010b200020046a220420042d000041e500733a0000200020002d00c80141016a22043a00c80102400240200441ff0171220441a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a7012000107a41002104200041003b01c8010c010b200441c7014b0d010b200020046a220420042d000041f200733a0000200020002d00c80141016a22043a00c80102400240200441ff0171220441a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a7012000107a41002104200041003b01c8010c010b200441c7014b0d010b200020046a220420042d000041ec00733a0000200020002d00c80141016a22043a00c80102400240200441ff0171220441a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a7012000107a41002104200041003b01c8010c010b200441c7014b0d010b200020046a220420042d000041e900733a0000200020002d00c80141016a22043a00c80102400240200441ff0171220441a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a7012000107a41002104200041003b01c8010c010b200441c7014b0d010b200020046a220420042d000041ee00733a0000200020002d00c80141016a22043a00c80102400240200441ff0171220441a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a7012000107a41002104200041003b01c8010c010b200441c7014b0d010b200020046a220420042d00004120733a0000200020002d00c80141016a22043a00c80102400240200441ff0171220441a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a7012000107a41002104200041003b01c8010c010b200441c7014b0d010b200020046a220420042d000041f600733a0000200020002d00c80141016a22043a00c80102400240200441ff0171220441a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a7012000107a41002104200041003b01c8010c010b200441c7014b0d010b200020046a220420042d00004131733a0000200020002d00c80141016a22043a00c80102400240200441ff0171220441a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a7012000107a41002104200041003b01c8010c010b200441c7014b0d010b200020046a220420042d0000412e733a0000200020002d00c80141016a22043a00c80102400240200441ff0171220441a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a7012000107a41002104200041003b01c8010c010b200441c7014b0d010b200020046a220420042d00004130733a0000200020002d00c80141016a22043a00c8010240200441ff017141a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a7012000107a200041003b01c8010b20032002360204200041124100107e024020002d00c801220441c8014f0d00200020046a220420042d000041e400733a0000200020002d00c80141016a22043a00c80102400240200441ff0171220541a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a7012000107a41002104200041003b01c8010c010b200541c8014f0d010b2000200441ff01716a220420042d000041ef00733a0000200020002d00c80141016a22043a00c80102400240200441ff0171220541a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a7012000107a41002104200041003b01c8010c010b200541c7014b0d010b2000200441ff01716a220420042d000041ed00733a0000200020002d00c80141016a22043a00c80102400240200441ff0171220541a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a7012000107a41002104200041003b01c8010c010b200541c7014b0d010b2000200441ff01716a220420042d0000412d733a0000200020002d00c80141016a22043a00c80102400240200441ff0171220541a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a7012000107a41002104200041003b01c8010c010b200541c7014b0d010b2000200441ff01716a220420042d000041f300733a0000200020002d00c80141016a22043a00c80102400240200441ff0171220541a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a7012000107a41002104200041003b01c8010c010b200541c7014b0d010b2000200441ff01716a220420042d000041e500733a0000200020002d00c80141016a22043a00c80102400240200441ff0171220541a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a7012000107a41002104200041003b01c8010c010b200541c7014b0d010b200041ca016a21052000200441ff01716a220420042d000041f000733a0000200020002d00c80141016a22043a00c8010240200441ff017141a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a7012000107a41002104200041003b01c8010b200341123a00d701024020052d00004112460d00200341f0016a41146a4109360200200341f0016a410c6a410a36020020032005360288022003200341d7016a36028c02200341086a41146a4102360200200341086a410c6a410236020020034190026a410c6a410b3602002003410a3602f401200341d4a2c0003602102003410236020c200341c4a2c0003602082003410b3602940220032005360290022003200341086a3602800220032003418c026a3602f801200320034188026a3602f001200320034190026a3602182003200341d7016a36029802200341d8016a41146a4103360200200342033702dc01200341d4c0c7003602d8012003200341f0016a3602e801200341d8016a4194a3c000103d000b0240200441ff0171220541c7014b0d00200020056a220420042d000020032d0004733a0000200020002d00c80141016a22043a00c80102400240200441ff017141a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a7012000107a41002104200041003b01c8010c010b200441ff017141c8014f0d010b2000200441ff01716a220420042d000020032d0005733a0000200020002d00c80141016a22043a00c80102400240200441ff0171220541a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a7012000107a41002104200041003b01c8010c010b200541c7014b0d010b2000200441ff01716a220420042d000020032d0006733a0000200020002d00c80141016a22043a00c80102400240200441ff0171220541a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a7012000107a41002104200041003b01c8010c010b200541c7014b0d010b2000200441ff01716a220420042d000020032d0007733a0000200020002d00c80141016a22043a00c8010240200441ff017141a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a7012000107a200041003b01c8010b200041024100107e024002402002450d0020002d00c80121040340200441ff0171220441c7014b0d02200020046a220420042d000020012d0000733a0000200020002d00c80141016a22043a00c8010240200441ff017141a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a7012000107a41002104200041003b01c8010b200141016a21012002417f6a22020d000b0b200341a0026a24000f0b200441c80141dca1c0001032000b200441ff017141c80141dca1c0001032000b200441ff017141c80141dca1c0001032000b200441c80141dca1c0001032000b840901027f230041f0006b2205240020052004360208200041124100107e024002400240024002402002450d0020002d00c80121060340200641ff0171220641c7014b0d02200020066a220620062d000020012d0000733a0000200020002d00c80141016a22063a00c8010240200641ff017141a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a7012000107a41002106200041003b01c8010b200141016a21012002417f6a22020d000b0b200541123a000f20002d00ca014112470d0120002d00c801220641c7014b0d03200020066a220620062d000020052d0008733a0000200020002d00c80141016a22063a00c8010240200641ff0171220141a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a7012000107a41002106200041003b01c8010c030b200141c801490d020c030b200641c80141dca1c0001032000b200541286a41146a4109360200200541286a410c6a410a3602002005200041ca016a220036024020052005410f6a360244200541c8006a41146a4102360200200541c8006a410c6a4102360200200541e0006a410c6a410b3602002005410a36022c200541d4a2c0003602502005410236024c200541c4a2c0003602482005410b360264200520003602602005200541c8006a3602382005200541c4006a3602302005200541c0006a3602282005200541e0006a36025820052005410f6a360268200541106a41146a410336020020054203370214200541d4c0c7003602102005200541286a360220200541106a4194a3c000103d000b2000200641ff01716a220620062d000020052d0009733a0000200020002d00c80141016a22063a00c80102400240200641ff0171220141a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a7012000107a41002106200041003b01c8010c010b200141c7014b0d010b2000200641ff01716a220620062d000020052d000a733a0000200020002d00c80141016a22063a00c80102400240200641ff0171220141a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a7012000107a41002106200041003b01c8010c010b200141c7014b0d010b2000200641ff01716a220620062d000020052d000b733a0000200020002d00c80141016a22063a00c8010240200641ff017141a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a7012000107a200041003b01c8010b200041024100107e024002402004450d0020002d00c80121060340200641ff0171220641c7014b0d02200020066a220620062d000020032d0000733a0000200020002d00c80141016a22063a00c8010240200641ff017141a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a7012000107a41002106200041003b01c8010b200341016a21032004417f6a22040d000b0b200541f0006a24000f0b200641c80141dca1c0001032000b200641ff017141c80141dca1c0001032000bc50f01027f230041f0006b220424002004200337030020044108360208200041124100107e024002400240024002402002450d0020002d00c80121050340200541ff0171220541c7014b0d02200020056a220520052d000020012d0000733a0000200020002d00c80141016a22053a00c8010240200541ff017141a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a7012000107a41002105200041003b01c8010b200141016a21012002417f6a22020d000b0b200441123a000f20002d00ca014112470d0120002d00c801220541c7014b0d03200020056a220520052d000020042d0008733a0000200020002d00c80141016a22053a00c8010240200541ff0171220141a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a7012000107a41002105200041003b01c8010c030b200141c801490d020c030b200541c80141dca1c0001032000b200441286a41146a4109360200200441286a410c6a410a3602002004200041ca016a220036024020042004410f6a360244200441c8006a41146a4102360200200441c8006a410c6a4102360200200441e0006a410c6a410b3602002004410a36022c200441d4a2c0003602502004410236024c200441c4a2c0003602482004410b360264200420003602602004200441c8006a3602382004200441c4006a3602302004200441c0006a3602282004200441e0006a36025820042004410f6a360268200441106a41146a410336020020044203370214200441d4c0c7003602102004200441286a360220200441106a4194a3c000103d000b2000200541ff01716a220520052d000020042d0009733a0000200020002d00c80141016a22053a00c80102400240200541ff0171220141a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a7012000107a41002105200041003b01c8010c010b200141c7014b0d010b2000200541ff01716a220520052d000020042d000a733a0000200020002d00c80141016a22053a00c80102400240200541ff0171220141a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a7012000107a41002105200041003b01c8010c010b200141c7014b0d010b2000200541ff01716a220520052d000020042d000b733a0000200020002d00c80141016a22053a00c8010240200541ff017141a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a7012000107a200041003b01c8010b200041024100107e024020002d00c801220541c8014f0d00200020056a220520052d000020042d0000733a0000200020002d00c80141016a22053a00c80102400240200541ff0171220141a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a7012000107a41002105200041003b01c8010c010b200141c8014f0d010b2000200541ff01716a220520052d000020042d0001733a0000200020002d00c80141016a22053a00c80102400240200541ff0171220141a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a7012000107a41002105200041003b01c8010c010b200141c7014b0d010b2000200541ff01716a220520052d000020042d0002733a0000200020002d00c80141016a22053a00c80102400240200541ff0171220141a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a7012000107a41002105200041003b01c8010c010b200141c7014b0d010b2000200541ff01716a220520052d000020042d0003733a0000200020002d00c80141016a22053a00c80102400240200541ff0171220141a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a7012000107a41002105200041003b01c8010c010b200141c7014b0d010b2000200541ff01716a220520052d000020042d0004733a0000200020002d00c80141016a22053a00c80102400240200541ff0171220141a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a7012000107a41002105200041003b01c8010c010b200141c7014b0d010b2000200541ff01716a220520052d000020042d0005733a0000200020002d00c80141016a22053a00c80102400240200541ff0171220141a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a7012000107a41002105200041003b01c8010c010b200141c7014b0d010b2000200541ff01716a220520052d000020042d0006733a0000200020002d00c80141016a22053a00c80102400240200541ff0171220141a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a7012000107a41002105200041003b01c8010c010b200141c7014b0d010b2000200541ff01716a220520052d000020042d0007733a0000200020002d00c80141016a22053a00c8010240200541ff017141a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a7012000107a200041003b01c8010b200441f0006a24000f0b200541ff017141c80141dca1c0001032000b200541ff017141c80141dca1c0001032000ba60901027f230041f0006b2205240020052004360208200041124100107e024002400240024002402002450d0020002d00c80121060340200641ff0171220641c7014b0d02200020066a220620062d000020012d0000733a0000200020002d00c80141016a22063a00c8010240200641ff017141a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a7012000107a41002106200041003b01c8010b200141016a21012002417f6a22020d000b0b200541123a000f20002d00ca014112470d0120002d00c801220641c7014b0d03200020066a220620062d000020052d0008733a0000200020002d00c80141016a22063a00c8010240200641ff0171220141a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a7012000107a41002106200041003b01c8010c030b200141c801490d020c030b200641c80141dca1c0001032000b200541286a41146a4109360200200541286a410c6a410a3602002005200041ca016a220036024020052005410f6a360244200541c8006a41146a4102360200200541c8006a410c6a4102360200200541e0006a410c6a410b3602002005410a36022c200541d4a2c0003602502005410236024c200541c4a2c0003602482005410b360264200520003602602005200541c8006a3602382005200541c4006a3602302005200541c0006a3602282005200541e0006a36025820052005410f6a360268200541106a41146a410336020020054203370214200541d4c0c7003602102005200541286a360220200541106a4194a3c000103d000b2000200641ff01716a220620062d000020052d0009733a0000200020002d00c80141016a22063a00c80102400240200641ff0171220141a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a7012000107a41002106200041003b01c8010c010b200141c7014b0d010b2000200641ff01716a220620062d000020052d000a733a0000200020002d00c80141016a22063a00c80102400240200641ff0171220141a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a7012000107a41002106200041003b01c8010c010b200141c7014b0d010b2000200641ff01716a220620062d000020052d000b733a0000200020002d00c80141016a22063a00c8010240200641ff017141a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a7012000107a200041003b01c8010b200041074100107e02402004450d0020002d00c8012106024002400340200641ff0171220641c7014b0d012003200020066a2d00003a000020002d00c801220641c7014b0d02200020066a41003a0000200020002d00c80141016a22063a00c8010240200641ff017141a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a7012000107a41002106200041003b01c8010b200341016a21032004417f6a22040d000c030b0b200641c80141cca4c0001032000b200641c80141dca4c0001032000b200541f0006a24000f0b200641ff017141c80141dca1c0001032000bb00301097f20004201370200200041086a4100360200200141096a2d00002102200128020421032001280200210402400240024020012d000822054102470d00200320046b410020041b21010c010b20054101462106024020040d00200621010c010b2006200320046b6a220120064f0d00200041046a2107200041086a210841012109410021010340024002400240200541ff01714102470d00200221060c010b410021062005410171450d00410021050c010b2004450d0320042003460d0320042d0000210241022105200441016a21040b024020012007280200470d0020002001417f200320046b410020041b220941016a220a200a2009491b106d200028020021090b200920016a20023a00002008200141016a2201360200200621020c000b0b200041002001106d20002802002209200041086a28020022066a210102400240200541024b0d0020050e03010001010b200120023a00002009200641016a22066a21010b02402004450d0020032004460d00200421020340200120022d00003a0000200141016a21012003200241016a2202470d000b2003200620046b6a21060b200041086a20063602000b0bd10201057f230041106b22022400024002400240024002400240024002400240024020012d00000e06010203040500010b20024181ca003b01082002200141216a3602042002200141016a3602000c050b4101102a2201450d062000428180808010370204200020013602000c050b2001410c6a22032802002204412020044120491b220541016a220410242206450d0520062004200410d1062106200328020022032005490d06200641016a200141046a280200200510cf061a2000200436020820002004360204200020063602000c040b20024181c4003b01082002200141216a3602042002200141016a3602000c020b20024181c6003b01082002200141216a3602042002200141016a3602000c010b20024181c8003b01082002200141216a3602042002200141016a3602000b200020021084010b200241106a24000f0b1033000b2005200341c0a7c0001047000b820202057f017e0240024020012802002202450d00200128020421030340200241086a210420022f010621054100210102400240034020052001460d014191acc0002004410810d2062206450d02200141016a2101200441086a21042006417f4a0d000b2001417f6a21050b2003450d022003417f6a2103200220054102746a41e4016a28020021020c010b0b200241e0006a2001410c6c6a22012802084108490d0141000d002001280200290000210720004100360200200041086a20073703000f0b200042013703002000410c6a4128360200200041086a41c2acc0003602000f0b200042013703002000410c6a4229370200200041086a4199acc000ad3e02000b8a0301027f02400240200241046a2203417f4c0d000240024020030d0041012104410021030c010b200310242204450d020b20002004360200200041086a22044100360200200020033602040240024002400240200241c000490d00200241808001490d012002418080808004490d02200041004101106d2000280200200041086a220428020022036a41033a00002004200341016a2203360200200020034104106d2000280200200428020022036a20023600002004200341046a22033602000c030b200041004101106d2000280200200428020022036a20024102743a00002004200341016a22033602000c020b200041004102106d2000280200200041086a220428020022036a20024102744101723b00002004200341026a22033602000c010b200041004104106d2000280200200041086a220428020022036a20024102744102723600002004200341046a22033602000b200020032002106d2000280200200041086a220028020022036a2001200210cf061a2000200320026a3602000f0b1034000b1033000b860401057f230041106b2203240020004201370200200041086a22044100360200024020012d0000220541024b0d0002400240024020050e03000102000b200041004101106d2000280200200041086a220528020022066a41013a00002005200641016a3602002000200141016a1089010c020b200041004101106d2000280200200041086a220528020022066a41023a00002005200641016a3602002000200141016a1089010c010b200041004101106d2000280200200041086a220528020022066a41033a00002005200641016a3602002000200141016a1089010b200341003602082003420137030020022802002101200341004104106d2003280200200328020822056a20013600002003200541046a3602082003200241046a1089012003280200210602400240200041046a2802002205200428020022026b20032802082201490d00200028020021040c010b0240024002400240200220016a22042002490d00200541017422072004200720044b1b22044108200441084b1b22074100480d002000280200410020051b2204450d0120052007460d032005450d0120042005200710282204450d020c030b102e000b2007102422040d010b102c000b20002004360200200041046a20073602000b200420026a2006200110cf061a200041086a200220016a36020002402003280204450d00200328020010260b200341106a24000bcd0101047f230041106b220224000240412010242203450d002002422037020420022003360200200241004120106d20022802002204200228020822056a22032001290000370000200341086a200141086a290000370000200341106a200141106a290000370000200341186a200141186a2900003700002002200541206a22013602082000200041086a22032802002001106d2000280200200328020022006a2004200110cf061a2003200020016a36020002402002280204450d00200410260b200241106a24000f0b1033000bce04010b7f0240200241ffffffff01712002470d0020024103742203417f4c0d0041042104024002402003450d00200310242204450d010b20002004360200200041086a22054100360200200041046a20034103762206360200024002402002450d00200341786a410376210741002108410021090340024020012802004101470d000240024002400240200841014b0d00024020080e020200020b2001280204210a410021020c020b2001280204210a4100210220082103034020022003410176220b20026a220c2004200c4103746a280204200a4b1b21022003200b6b220341014b0d000c020b0b2001280204210a410021030c010b20082002200420024103746a280204200a496a22034f0d0020032008103b000b024020082006470d0020062006470d0002400240200641016a22022006490d002006410174220b2002200b20024b1b22024104200241044b1b220241ffffffff0171220c2002470d002002410374220b4100480d00200c20024641027421022006410374200d20061b210d0240024002402004410020061b22040d00200b0d01200221040c040b200d200b460d030240200d0d00200b0d01410421040c040b2004200d200b10282204450d010c030b200b102422040d020b20020d060b102e000b20002004360200200041046a200b41037622063602000b200420034103746a220241086a2002200820036b41037410d0061a2002200a360204200220093602002005200841016a22083602000b200141086a210120092007462102200941016a21092002450d000b0b0f0b102c000b1033000b1034000bde0201087f024002400240200041046a2802002202200041086a28020022036b2001410c6a2802002204200141086a28020022056b22064103752207490d00200028020021080c010b02400240200320076a22082003490d00200241017422032008200320084b1b22034104200341044b1b220341ffffffff017122082003470d00200341037422094100480d00200820034641027421030240024002402000280200410020021b22080d0020090d01200321080c040b200241037422022009460d03024020020d0020090d01410421080c040b20082002200910282208450d010c030b2009102422080d020b20030d030b102e000b20002008360200200041046a2009410376360200200041086a28020021030b200820034103746a2005200610cf061a200141086a2004360200200041086a2200200028020020076a3602000240200128020441ffffffff0171450d00200128020010260b0f0b102c000b910401067f230041106b22022400200241003a000c02400240200128020022032802042204450d00200328020022052d0000210620032004417f6a360204200241013a000c2003200541016a360200200220063a00080240200128020022032802042204450d00200328020022052d0000210620032004417f6a3602042003200541016a360200200241023a000c200220063a0009200128020022032802042204450d00200328020022052d0000210620032004417f6a3602042003200541016a360200200241033a000c200220063a000a200128020022032802042204450d00200328020022052d0000210620032004417f6a3602042003200541016a360200200220063a000b2002280208210420022001108d01024002400240024020022802000d0020012802002205280204220620022802042203490d002003417f4c0d020240024020030d0041002101410121070c010b2003102a2207450d04200128020022052802042106200321010b0240024020062003490d0020072005280200200310cf0621062005280204220720034f0d012003200741b8afc0001048000b2001450d01200710260c010b2005200720036b3602042005200528020020036a36020020060d010b200041003602040c050b20002003ad4220862001ad8437020820002006360204200020043602000c040b1034000b1033000b200241003a000c0b200041003602040b200241106a24000bfb0201057f02400240200128020022022802042203450d00200228020022042d0000210520022003417f6a360204410121032002200441016a3602000240200541037122024103460d0002400240024020020e03000102000b20054102762102410021030c040b200128020022022802042203450d02200228020022012d0000210420022003417f6a360204410121032002200141016a3602002004410874200572220141ffff0371418002490d03200141fcff03714102762102410021030c030b2001280200220228020422034103490d012002280200220141026a2d0000210420012f000021062002200141036a36020020022003417d6a3602042006200441107472410874200572220241808004492103200241027621020c020b0240200541034d0d000c020b2001280200220128020422054104490d0120012802002203280000210220012005417c6a3602042001200341046a36020020024180808080044921030c010b410121030b20002002360204200020033602000bd30604037f017e087f037e230041a0026b2202240020022001108f01024002402002280200450d00200041003602000c010b02400240024020022802042203200128020441286e2204200420034b1bad42287e2205422088a70d002005a72204417f4c0d000240024020040d00410821060c010b200410242206450d020b4100210720024100360210200220063602082002200441286e36020c02402003450d0041002108034041002104200241003a00d801200841016a210820012802042109417f210a02400240034020092004460d01200241b8016a20046a2001280200220b2d00003a000020012009200a6a3602042001200b41016a3602002002200441016a220b3a00d801200a417f6a210a200b2104200b4120470d000b200241e0016a41086a2204200241b8016a41086a290300370300200241e0016a41106a220a200241b8016a41106a290300370300200241e0016a41186a220c200241b8016a41186a290300370300200220022903b8013703e001200b41ff0171411f4b0d010c060b200441ff0171450d05200241003a00d8010c050b200241f8006a41086a220d2004290300370300200241f8006a41106a2204200a290300370300200241f8006a41186a220a200c290300370300200220022903e0013703782009200b6b220b4108490d042001280200220929000021052001200b41786a3602042001200941086a360200200241386a41086a200d290300220e370300200241386a41106a2004290300220f370300200241386a41186a200a2903002210370300200241186a41186a220a2010370300200241186a41106a220b200f370300200241186a41086a2209200e37030020022002290378220e3703382002200e37031802402007200228020c470d00200241086a2007410110900120022802082106200228021021070b2006200741286c6a220420022903183703002009290300210e200b290300210f200a290300211020042005370320200441186a2010370300200441106a200f370300200441086a200e3703002002200741016a220736021020082003470d000b0b20002002290308370200200041086a200241086a41086a2802003602000c030b1034000b1033000b20004100360200200228020c2204450d00200441286c450d00200610260b200241a0026a24000bcf0201067f0240024020012802042202450d00200128020022032d0000210420012002417f6a2205360204410121062001200341016a3602000240200441037122074103460d0002400240024020070e03000102000b20044102762107410021060c040b41012106024020050d000c040b20032d0001210520012002417e6a3602042001200341026a3602002005410874200472220141ffff0371418002490d03200141fcff03714102762107410021060c030b20054103490d01200341036a2d0000210620032f0001210720012002417c6a3602042001200341046a3602002007200641107472410874200472220141808004492106200141027621070c020b0240200441034d0d000c020b20054104490d012003280001210720012002417b6a3602042001200341056a36020020074180808080044921060c010b410121060b20002007360204200020063602000bdf0103017f017e017f02400240200041046a280200220320016b20024f0d0002400240200120026a22022001490d00200341017422012002200120024b1b22014104200141044b1bad42287e2204422088a722020d002004a722014100480d0020024541037421050240024002402000280200410020031b22020d0020010d01200521020c040b200341286c22032001460d03024020030d0020010d01410821020c040b20022003200110282202450d010c030b2001102422020d020b20050d030b102e000b20002002360200200041046a200141286e3602000b0f0b102c000bea0301067f230041106b22022400200241003a000c0240024020012802042203450d00200128020022042d0000210520012003417f6a2206360204200241013a000c2001200441016a360200200220053a000802402006450d00200128020022042d0000210520012003417e6a22063602042001200441016a360200200241023a000c200220053a00092006450d00200128020022042d0000210520012003417d6a22063602042001200441016a360200200241033a000c200220053a000a2006450d00200128020022042d0000210520012003417c6a3602042001200441016a360200200220053a000b2002280208210420022001108f01024002400240024020022802000d002001280204220520022802042203490d002003417f4c0d020240024020030d0041002106410121070c010b2003102a2207450d0420012802042105200321060b0240024020052003490d0020072001280200200310cf0621052001280204220720034f0d012003200741b8afc0001048000b2006450d01200710260c010b2001200720036b3602042001200128020020036a36020020050d010b200041003602040c050b20002003ad4220862006ad8437020820002005360204200020043602000c040b1034000b1033000b200241003a000c0b200041003602040b200241106a24000b880602097f037e23004180026b2202240020022001108f0102400240024002402002280200450d00200041003602000c010b2002280204220320012802044105762204200420034b1b22044105742205417f4c0d010240024020040d00410121060c010b200510242206450d030b41002107200241003602102002200436020c200220063602080240024002402003450d0041002108034041002105200241003a00b801200841016a21082001280204417f6a210403402004417f460d0320024198016a20056a200128020022092d00003a0000200120043602042001200941016a3602002002200541016a22093a00b8012004417f6a21042009210520094120470d000b200241c0016a41086a220420024198016a41086a290300370300200241c0016a41106a220520024198016a41106a290300370300200241c0016a41186a220a20024198016a41186a29030037030020022002290398013703c001200941ff0171411f4d0d03200241386a41086a2004290300220b370300200241386a41106a2005290300220c370300200241386a41186a200a290300220d370300200241186a41186a2205200d370300200241186a41106a2209200c370300200241186a41086a220a200b370300200220022903c001220b3703582002200b3703382002200b37031802402007200228020c470d00200241086a2007410110930120022802082106200228021021070b200620074105746a22042002290318370000200441186a2005290300370000200441106a2009290300370000200441086a200a2903003700002002200741016a220736021020082003470d000b0b20002002290308370200200041086a200241086a41086a2802003602000c020b200541ff0171450d00200241003a00b8010b200241386a41086a200241d8006a41086a290300370300200241386a41106a200241d8006a41106a290300370300200241386a41186a200241d8006a41186a2903003703002002200229035837033820004100360200200228020c41ffffff3f71450d00200610260b20024180026a24000f0b1034000b1033000bdd0101027f02400240200041046a280200220320016b20024f0d0002400240200120026a22022001490d00200341017422012002200120024b1b22014104200141044b1b220141ffffff3f7122042001470d00200141057422024100480d00200420014621040240024002402000280200410020031b22010d0020020d01200421010c040b200341057422032002460d03024020030d0020020d01410121010c040b20012003200210282201450d010c030b2002102422010d020b20040d030b102e000b20002001360200200041046a20024105763602000b0f0b102c000ba80201047f230041106b22022400024002402001280208220341146a2204417f4c0d000240024020040d0041012105410021040c010b200410242205450d020b200241003602082002200536020020022004360204200241004110106d2002280200200228020822046a2205200129000c370000200541086a200141146a2900003700002002200441106a360208200128020020032002109501200128021c2101200220022802084120106d20022802002203200228020822056a22042001290000370000200441086a200141086a290000370000200441106a200141106a290000370000200441186a200141186a2900003700002002200541206a220136020820002003200110960102402002280204450d00200310260b200241106a24000f0b1034000b1033000bcb0201027f0240024002400240200141c000490d00200141808001490d012001418080808004490d022002200241086a22032802004101106d2002280200200328020022046a41033a00002003200441016a2204360200200220044104106d2002280200200328020022046a20013600002003200441046a22043602000c030b2002200241086a22032802004101106d2002280200200328020022046a20014102743a00002003200441016a22043602000c020b2002200241086a22032802004102106d2002280200200328020022046a20014102744101723b00002003200441026a22043602000c010b2002200241086a22032802004104106d2002280200200328020022046a20014102744102723600002003200441046a22043602000b200220042001106d2002280200200241086a220228020022046a2000200110cf061a2002200420016a3602000b4c0020002002ad4220862001ad8410112201290000370000200041186a200141186a290000370000200041106a200141106a290000370000200041086a200141086a290000370000200110260ba901000240200141ff0171220141024b0d0002400240024020010e03000102000b2000200041086a22012802004101106d2000280200200128020022006a41003a00002001200041016a3602000f0b2000200041086a22012802004101106d2000280200200128020022006a41013a00002001200041016a3602000f0b2000200041086a22012802004101106d2000280200200128020022006a41023a00002001200041016a3602000b0b6501027f2000200041086a22042802004108106d2000280200200428020022056a20013700002004200541086a36020020002002109701200020042802004101106d2000280200200428020022006a200341ff01714101463a00002004200041016a3602000bbc0101047f200128020021022000200041086a22032802004101106d2000280200200328020022046a21050240024020024101460d00200541003a0000200441016a21030c010b200541013a00002003200441016a220236020020012802042104200020024104106d2000280200200328020022026a20043600002003200241046a2202360200200141086a2802002101200020024104106d2000280200200328020022036a2001360000200341046a21030b200041086a20033602000bdc0201037f2001280200210202400240024002402001280208220141c000490d00200141808001490d012001418080808004490d022000200041086a22032802004101106d2000280200200328020022046a41033a00002003200441016a2204360200200020044104106d2000280200200328020022046a20013600002003200441046a22043602000c030b2000200041086a22032802004101106d2000280200200328020022046a20014102743a00002003200441016a22043602000c020b2000200041086a22032802004102106d2000280200200328020022046a20014102744101723b00002003200441026a22043602000c010b2000200041086a22032802004104106d2000280200200328020022046a20014102744102723600002003200441046a22043602000b2000200420014102742201106d2000280200200041086a220028020022046a2002200110cf061a2000200420016a3602000b900301047f230041106b22022400200128025021032000200041086a22042802004104106d2000280200200428020022056a20033600002004200541046a36020020022000360208200141e0006a200241086a109c012001280254200141dc006a2802002000109501200020042802004120106d2000280200200428020022056a2203200129008001370000200341186a20014198016a290000370000200341106a20014190016a290000370000200341086a20014188016a2900003700002004200541206a22033602002000200341c000106d2000280200200428020022056a220320012900a001370000200341386a200141d8016a290000370000200341306a200141d0016a290000370000200341286a200141c8016a290000370000200341206a200141c0016a290000370000200341186a200141b8016a290000370000200341106a200141b0016a290000370000200341086a200141a8016a2900003700002004200541c0006a3602002002200036020c200141e0016a2002410c6a109c0120002001109d01200241106a24000bd20101047f230041106b220224000240412010242203450d002002422037020420022003360200200241004120106d20022802002204200228020822056a22032000290000370000200341086a200041086a290000370000200341106a200041106a290000370000200341186a200041186a2900003700002002200541206a220036020820012802002203200341086a22012802002000106d2003280200200128020022036a2004200010cf061a2001200320006a36020002402002280204450d00200410260b200241106a24000f0b1033000bfa0203017f027e037f230041106b22022400200141086a2903002103200129030021042000200041086a22052802004110106d2000280200200528020022066a22072003370008200720043700002005200641106a360200200128021021052000200141186a280200220610a10102402006450d0020064104742106034020002005410c6a2d000010a8012005280200200541086a2802002000109501200541106a2105200641706a22060d000b0b2002200036020c2001412c6a2002410c6a109c0102400240200128021c22060d002000200041086a22062802004101106d2000280200200628020022056a41003a00002006200541016a22053602000c010b2000200041086a22052802004101106d2000280200200528020022076a41013a00002005200741016a3602002006200141246a2802002000109501200528020021050b20012802282106200020054104106d2000280200200041086a220528020022006a20063600002005200041046a360200200241106a24000b9c0201017f0240024002400240200141ff01710e0400010203000b2000200041086a22012802004101106d2000280200200128020022006a41003a00002001200041016a3602000f0b2000200041086a22012802004101106d2000280200200128020022006a41013a00002001200041016a3602000f0b2000200041086a22012802004101106d2000280200200128020022006a41023a00002001200041016a3602000f0b2000200041086a22012802004101106d2000280200200128020022046a41033a00002001200441016a2204360200200020044101106d2000280200200128020022046a20023a00002001200441016a2202360200200020024101106d2000280200200128020022006a20033a00002001200041016a3602000b7801037f0240200128020022020d002000200041086a22012802004101106d2000280200200128020022006a41003a00002001200041016a3602000f0b2000200041086a22032802004101106d2000280200200328020022046a41013a00002003200441016a3602002002200141086a28020020001095010b9c0101067f230041106b220224002001280200210320002001280208220110a10102402001450d00200141246c2104200041086a210103402002200310a201200228020021052000200128020020022802082206106d2000280200200128020022076a2005200610cf061a2001200720066a36020002402002280204450d00200510260b200341246a21032004415c6a22040d000b0b200241106a24000b910201027f024002400240200141c000490d00200141808001490d012001418080808004490d022000200041086a22022802004101106d2000280200200228020022036a41033a00002002200341016a2203360200200020034104106d2000280200200228020022006a20013600002002200041046a3602000f0b2000200041086a22022802004101106d2000280200200228020022006a20014102743a00002002200041016a3602000f0b2000200041086a22022802004102106d2000280200200228020022006a20014102744101723b00002002200041026a3602000f0b2000200041086a22022802004104106d2000280200200228020022006a20014102744102723600002002200041046a3602000b9e0501037f230041106b22022400024002400240024002400240024020012d00000e06010402030500010b20004201370200200041086a22034100360200200041004101106d2000280200200328020022046a41003a00002003200441016a360200200141046a2802002001410c6a28020020001095010c050b20004201370200200041086a22034100360200200041004101106d2000280200200328020022046a41023a00002003200441016a3602002002200036020c200141016a2002410c6a109c010c040b20004201370200200041086a22034100360200200041004101106d2000280200200328020022046a41043a00002003200441016a2204360200200020044104106d2000280200200328020022046a20012800013600002003200441046a360200200141086a280200200141106a28020020001095010c030b20004201370200200041086a22034100360200200041004101106d2000280200200328020022046a41053a00002003200441016a2204360200200020044104106d2000280200200328020022046a20012800013600002003200441046a360200200141086a280200200141106a28020020001095010c020b20004201370200200041086a22034100360200200041004101106d2000280200200328020022046a41063a00002003200441016a2204360200200020044104106d2000280200200328020022046a20012800013600002003200441046a360200200141086a280200200141106a28020020001095010c010b20004201370200200041086a22034100360200200041004101106d2000280200200328020022046a41073a00002003200441016a2204360200200020044101106d2000280200200328020022046a41003a00002003200441016a3602002000200141046a10a4010b200241106a24000bf40301047f230041106b2202240020012802042103024002400240024020012802004101470d002001410c6a280200220141046a2204417f4c0d020240024020040d0041012105410021040c010b200410242205450d040b2002410036020820022005360200200220043602040240024002400240200141c000490d00200141808001490d012001418080808004490d02200241004101106d2002280200200228020822046a41033a00002002200441016a2204360208200220044104106d2002280200200228020822046a2001360000200441046a21040c030b200241004101106d2002280200200228020822046a20014102743a0000200441016a21040c020b200241004102106d2002280200200228020822046a20014102744101723b0000200441026a21040c010b200241004104106d2002280200200228020822046a2001410274410272360000200441046a21040b20022004360208200220042001106d20022802002204200228020822056a2003200110cf061a2002200520016a22013602080c010b20022003200141086a28020010870120022802002104200228020821010b2000200041086a22032802002001106d2000280200200328020022006a2004200110cf061a2003200020016a36020002402002280204450d00200410260b200241106a24000f0b1034000b1033000bbc0101047f200128020021022000200041086a22032802004101106d2000280200200328020022046a21050240024020024101460d00200541003a0000200441016a21030c010b200541013a00002003200441016a220236020020012802042104200020024104106d2000280200200328020022026a20043600002003200241046a2202360200200141086a2802002101200020024104106d2000280200200328020022036a2001360000200341046a21030b200041086a20033602000b8f0202057f017e2001280200210220002001280208220310a1010240024020030d00200041086a28020021040c010b2002200341286c6a2105200041086a220328020021040340200020044120106d2000280200200328020022066a22042002290000370000200441186a200241186a290000370000200441106a200241106a290000370000200441086a200241086a2900003700002003200641206a2204360200200241206a2903002107200020044108106d2000280200200328020022046a20073700002003200441086a22043602002005200241286a2202470d000b0b200128020c2102200020044104106d2000280200200041086a220028020022036a20023600002000200341046a3602000b8c0202027e037f200141086a2903002102200129030021032000200041086a22042802004110106d2000280200200428020022056a22062002370008200620033700002004200541106a2205360200200141186a290300210220012903102103200020054110106d2000280200200428020022056a22062002370008200620033700002004200541106a2205360200200141286a290300210220012903202103200020054110106d2000280200200428020022056a22062002370008200620033700002004200541106a2205360200200141386a290300210220012903302103200020054110106d2000280200200428020022006a22012002370008200120033700002004200041106a3602000b9d0201027f0240024002402001280200220241c000490d00200241808001490d012002418080808004490d022000200041086a22022802004101106d2000280200200228020022036a41033a00002002200341016a220336020020012802002101200020034104106d2000280200200228020022006a20013600002002200041046a3602000f0b2000200041086a22012802004101106d2000280200200128020022006a20024102743a00002001200041016a3602000f0b2000200041086a22012802004102106d2000280200200128020022006a20024102744101723b00002001200041026a3602000f0b2000200041086a22012802004104106d2000280200200128020022006a20024102744102723600002001200041046a3602000ba801000240200141037122014103460d0002400240024020010e03000102000b2000200041086a22012802004101106d2000280200200128020022006a41003a00002001200041016a3602000f0b2000200041086a22012802004101106d2000280200200128020022006a41013a00002001200041016a3602000f0b2000200041086a22012802004101106d2000280200200128020022006a41023a00002001200041016a3602000b0bd90701077f230041106b220224002001280200210320002001280208220410a10102402004450d002003200441c8006c6a2105200041086a2104034020022003108501200228020021062000200428020020022802082207106d2000280200200428020022086a2006200710cf061a2004200820076a36020002402002280204450d00200610260b2002200341246a2206108501200228020021072000200428020020022802082203106d2000280200200428020022086a2007200310cf061a2004200820036a36020002402002280204450d00200710260b200641246a22032005470d000b0b20022001410c6a108501200228020021072000200041086a220428020020022802082203106d2000280200200428020022066a2007200310cf061a2004200620036a36020002402002280204450d00200710260b2002200141306a108501200228020021072000200428020020022802082203106d2000280200200428020022066a2007200310cf061a2004200620036a36020002402002280204450d00200710260b2002200141d4006a108501200228020021072000200041086a220428020020022802082203106d2000280200200428020022066a2007200310cf061a2004200620036a36020002402002280204450d00200710260b2002200141f8006a108501200228020021072000200428020020022802082203106d2000280200200428020022066a2007200310cf061a2004200620036a36020002402002280204450d00200710260b20022001419c016a108501200228020021072000200041086a220428020020022802082203106d2000280200200428020022066a2007200310cf061a2004200620036a36020002402002280204450d00200710260b20012d0088022103200020042802004101106d2000280200200428020022046a21070240024020034101460d00200741003a0000200441016a21030c010b200741013a0000200041086a2203200441016a2204360200200020044114106d2000280200200328020022036a220420014189026a290000370000200441106a20014199026a280000360000200441086a20014191026a290000370000200341146a21030b200041086a220420033602002002200141c0016a108501200228020021072000200428020020022802082203106d2000280200200428020022066a2007200310cf061a2004200620036a36020002402002280204450d00200710260b2002200141e4016a108501200228020021072000200428020020022802082203106d2000280200200428020022006a2007200310cf061a2004200020036a36020002402002280204450d00200710260b200241106a24000be00a03017f017e037f230041106b22022400200129030021032000200041086a22042802004108106d2000280200200428020022056a20033700002004200541086a220536020020012903082103200020054101106d2000280200200428020022056a21060240024020034201510d00200641003a00002004200541016a220536020020012903102103200020054108106d2000280200200428020022056a20033700002004200541086a2205360200200020054120106d2000280200200428020022066a2205200141e0016a290000370000200541186a200141f8016a290000370000200541106a200141f0016a290000370000200541086a200141e8016a2900003700002004200641206a3602002002200036020c2001411c6a2002410c6a109c01200141186a2802002105200020042802004104106d2000280200200428020022066a20053600002004200641046a22053602002000200541c000106d2000280200200428020022066a22052001413c6a290000370000200541386a200141f4006a290000370000200541306a200141ec006a290000370000200541286a200141e4006a290000370000200541206a200141dc006a290000370000200541186a200141d4006a290000370000200541106a200141cc006a290000370000200541086a200141c4006a2900003700002004200641c0006a3602002002200036020c20014180016a2002410c6a109c01200128027c2105200020042802004104106d2000280200200428020022066a20053600002004200641046a22053602002000200541c000106d2000280200200428020022056a2204200141a0016a290000370000200441386a200141d8016a290000370000200441306a200141d0016a290000370000200441286a200141c8016a290000370000200441206a200141c0016a290000370000200441186a200141b8016a290000370000200441106a200141b0016a290000370000200441086a200141a8016a2900003700000c010b200641013a00002004200541016a220536020020012903102103200020054108106d2000280200200428020022056a20033700002004200541086a2205360200200020054120106d2000280200200428020022066a2205200141e0016a290000370000200541186a200141f8016a290000370000200541106a200141f0016a290000370000200541086a200141e8016a2900003700002004200641206a3602002002200036020c2001411c6a2002410c6a109c01200141186a2802002105200020042802004104106d2000280200200428020022066a20053600002004200641046a22053602002000200541c000106d2000280200200428020022066a22052001413c6a290000370000200541386a200141f4006a290000370000200541306a200141ec006a290000370000200541286a200141e4006a290000370000200541206a200141dc006a290000370000200541186a200141d4006a290000370000200541106a200141cc006a290000370000200541086a200141c4006a2900003700002004200641c0006a3602002002200036020c20014180016a2002410c6a109c01200128027c2105200020042802004104106d2000280200200428020022066a20053600002004200641046a22053602002000200541c000106d2000280200200428020022056a2204200141a0016a290000370000200441386a200141d8016a290000370000200441306a200141d0016a290000370000200441286a200141c8016a290000370000200441206a200141c0016a290000370000200441186a200141b8016a290000370000200441106a200141b0016a290000370000200441086a200141a8016a2900003700000b200041086a200541c0006a360200200241106a24000bf30201047f230041106b2202240020022000360204200141106a200241046a109c0102400240024002402001280200220341c000490d00200341808001490d012003418080808004490d022000200041086a22042802004101106d2000280200200428020022056a41033a00002004200541016a2205360200200020054104106d2000280200200428020022056a20033600002004200541046a3602000c030b2000200041086a22042802004101106d2000280200200428020022056a20034102743a00002004200541016a3602000c020b2000200041086a22042802004102106d2000280200200428020022056a20034102744101723b00002004200541026a3602000c010b2000200041086a22042802004104106d2000280200200428020022056a20034102744102723600002004200541046a3602000b20022000360208200141306a200241086a109c012002200036020c200141d0006a2002410c6a109c012000200141046a10a001200241106a24000bd10102047f017e2001280200210220002001280208220110a10102402001450d002002200141286c6a2103200041086a220128020021040340200020044120106d2000280200200128020022056a22042002290000370000200441186a200241186a290000370000200441106a200241106a290000370000200441086a200241086a2900003700002001200541206a2204360200200241206a2903002106200020044108106d2000280200200128020022046a20063700002001200441086a22043602002003200241286a2202470d000b0b0b9f0301037f230041106b22022400024020012d0000220341024b0d0002400240024020030e03000102000b2000200041086a22032802004101106d2000280200200328020022046a41013a00002003200441016a36020020022000360204200141016a200241046a109c010c020b2000200041086a22032802004101106d2000280200200328020022046a41023a00002003200441016a36020020022000360208200141016a200241086a109c010c010b2000200041086a22032802004101106d2000280200200328020022046a41033a00002003200441016a3602002002200036020c200141016a2002410c6a109c010b2000200041086a220328020041c000106d2000280200200328020022046a22002001290021370000200041386a200141d9006a290000370000200041306a200141d1006a290000370000200041286a200141c9006a290000370000200041206a200141c1006a290000370000200041186a200141396a290000370000200041106a200141316a290000370000200041086a200141296a2900003700002003200441c0006a360200200241106a24000bae0101037f200128020021022000200041086a22032802004104106d2000280200200328020022046a20023600002003200441046a3602002001280204210220002001410c6a280200220410a10102402004450d0020022004410c6c6a210403402002280200200241086a28020020001095012002410c6a22022004470d000b0b20012802102102200020032802004104106d2000280200200328020022006a20023600002003200041046a3602000b970101027f024020012802004101460d002000200041086a22012802004101106d2000280200200128020022006a41003a00002001200041016a3602000f0b2000200041086a22022802004101106d2000280200200228020022036a41013a00002002200341016a220336020020012802042101200020034104106d2000280200200228020022006a20013600002002200041046a3602000b980101047f230041106b220224002000280200220028020821032000280200210041012104200128021841db9ec00041012001411c6a28020028020c1100002105200241003a000d200220053a000c200220013602080240200241086a2000200020036a10b10122012d00040d002001280200220128021841da9ec00041012001411c6a28020028020c11000021040b200241106a240020040bf40201037f230041c0006b22032400024020012002460d0020002d00042104034020032001360204200141016a2101200441ff0171210541012104024020050d0020002d000521040240200028020022052d00004104710d000240200441ff0171450d00410121042005280218419b9ec00041022005411c6a28020028020c1100000d02200028020021050b200341046a2005107f21040c010b0240200441ff01710d0041012104200528021841d99ec00041012005411c6a28020028020c1100000d01200028020021050b200341013a001720032005290218370308200341a09ec000360234200320052d00203a0038200320052902103703282003200341176a36021020032005290208370320200320052902003703182003200341086a3602300240200341046a200341186a107f0d00200328023041b89ec0004102200328023428020c11000021040c010b410121040b200041013a0005200020043a000420022001470d000b0b200341c0006a240020000bfa0301057f230041106b2202240002400240200028020822034105744104722204417f4c0d0020002802002100200410242205450d01200241003602082002200436020420022005360200024002400240200341c000490d00024002400240200341808001490d002003418080808004490d01200241004101106d2002280200200228020822046a41033a00002002200441016a2204360208200220044104106d2002280200200228020822046a2003360000200441046a21040c020b200241004102106d2002280200200228020822046a20034102744101723b0000200441026a21040c010b200241004104106d2002280200200228020822046a2003410274410272360000200441046a21040b20022004360208200020034105746a21060c010b200241004101106d20022802002205200228020822046a20034102743a00002002200441016a22043602082003450d01200020034105746a21060b0340200220044120106d20022802002205200228020822036a22042000290000370000200441086a200041086a290000370000200441106a200041106a290000370000200441186a200041186a2900003700002002200341206a22043602082006200041206a2200470d000b0b200128020020012802042005200410b30102402002280204450d00200510260b200241106a24000f0b1034000b1033000b18002001ad4220862000ad842003ad4220862002ad8410220bcd0401077f024002402002411c6c41046a2203417f4c0d000240024020030d0041012104410021030c010b200310242204450d020b20002004360200200041086a22044100360200200020033602042000200210a10102402002450d0020012002411c6c6a210503402001280200210620002001280208220210a10102402002450d0020062002412c6c6a21070340200020042802004120106d2000280200200428020022036a2202200629000c370000200241186a200641246a290000370000200241106a2006411c6a290000370000200241086a200641146a2900003700002004200341206a3602002006280200210220002006280208220310a1012006412c6a210602402003450d0020034105742108200428020021030340200020034120106d2000280200200428020022096a22032002290000370000200341186a200241186a290000370000200341106a200241106a290000370000200341086a200241086a2900003700002004200941206a2203360200200241206a2102200841606a22080d000b0b20062007470d000b0b2001411c6a2106200128020c210220002001280214220310a1010240024020030d00200428020021030c010b2003410274210820042802002103034020022802002109200020034104106d2000280200200428020022036a20093600002004200341046a2203360200200241046a21022008417c6a22080d000b0b20012802182102200020034104106d2000280200200428020022036a20023600002004200341046a3602002006210120062005470d000b0b0f0b1034000b1033000be10102047f027e230041106b22022400024002402000280208220341216c41146a2204417f4c0d000240024020040d0041012105410021040c010b200410242205450d02200028020821030b20024100360208200220053602002002200436020420002802002003200210b601200041186a290300210620002903102107200220022802084110106d20022802002200200228020822046a22032006370008200320073700002002200441106a2204360208200128020020012802042000200410b30102402002280204450d00200010260b200241106a24000f0b1034000b1033000bc20201037f2002200110a10102402001450d002000200141216c6a2103200241086a220128020021040340200220044120106d2002280200200128020022056a22042000290000370000200441186a200041186a290000370000200441106a200041106a290000370000200441086a200041086a2900003700002001200541206a220436020002400240024002400240200041206a2d00000e0400010203000b200220044101106d2002280200200128020022046a41003a0000200441016a21040c030b200220044101106d2002280200200128020022046a41013a0000200441016a21040c020b200220044101106d2002280200200128020022046a41023a0000200441016a21040c010b200220044101106d2002280200200128020022046a41033a0000200441016a21040b20012004360200200041216a22002003470d000b0b0b960301037f024002402001280208220241046a2203417f4c0d00200128020021010240024020030d0041012104410021030c010b200310242204450d020b20002004360200200041086a22044100360200200020033602040240024002400240200241c000490d00200241808001490d012002418080808004490d02200041004101106d2000280200200041086a220428020022036a41033a00002004200341016a2203360200200020034104106d2000280200200428020022036a20023600002004200341046a22033602000c030b200041004101106d2000280200200428020022036a20024102743a00002004200341016a22033602000c020b200041004102106d2000280200200041086a220428020022036a20024102744101723b00002004200341026a22033602000c010b200041004104106d2000280200200041086a220428020022036a20024102744102723600002004200341046a22033602000b200020032002106d2000280200200041086a220028020022036a2001200210cf061a2000200320026a3602000f0b1034000b1033000bc00101047f024002402001280208220241027441046a2203417f4c0d00200128020021010240024020030d0041012104410021030c010b200310242204450d020b20002004360200200041086a22044100360200200020033602042000200210a10102402002450d002002410274210320042802002102034020012802002105200020024104106d2000280200200428020022026a20053600002004200241046a2202360200200141046a21012003417c6a22030d000b0b0f0b1034000b1033000bc30101047f0240024020012802082202412c6c41046a2203417f4c0d00200128020021010240024020030d0041012104410021030c010b200310242204450d020b20002004360200200041086a22044100360200200020033602042000200210a10102402002450d0020012002412c6c6a2105034020012802002103200020042802004104106d2000280200200428020022026a20033600002004200241046a360200200141046a200010ba012001412c6a22012005470d000b0b0f0b1034000b1033000bbe0201047f200028022021022001200141086a22032802004101106d2001280200200328020022046a2105024020024102470d00200541003a00002003200441016a3602000f0b200541013a00002003200441016a2204360200200120044120106d2001280200200328020022056a22042000290000370000200441186a200041186a290000370000200441106a200041106a290000370000200441086a200041086a2900003700002003200541206a2204360200024020024101460d00200120044101106d2001280200200141086a220128020022006a41003a00002001200041016a3602000f0b200120044101106d2001280200200141086a220328020022026a41013a00002003200241016a220236020020002802242100200120024104106d2001280200200328020022016a20003600002003200141046a3602000bec0102047f047e02400240200128020822024105744104722203417f4c0d0020012802002101200310242204450d012000200336020420002004360200200041086a220341003602002000200210a10102402002450d0020024105742104200328020021050340200020054120106d200141186a2900002106200141106a2900002107200141086a29000021082001290000210920032003280200220241206a2205360200200220002802006a22022009370000200241086a2008370000200241106a2007370000200241186a2006370000200141206a2101200441606a22040d000b0b0f0b1034000b1033000b980301047f0240024020012802082202410274220341046a2204417f4c0d00200128020021010240024020040d0041012105410021040c010b200410242205450d020b20002005360200200041086a22054100360200200020043602040240024002400240200241c000490d00200241808001490d012002418080808004490d02200041004101106d2000280200200041086a220528020022046a41033a00002005200441016a2204360200200020044104106d2000280200200528020022046a20023600002005200441046a22043602000c030b200041004101106d2000280200200528020022046a20024102743a00002005200441016a22043602000c020b200041004102106d2000280200200041086a220528020022046a20024102744101723b00002005200441026a22043602000c010b200041004104106d2000280200200041086a220228020022046a20034102723600002002200441046a22043602000b200020042003106d2000280200200041086a220028020022046a2001200310cf061a2000200420036a3602000f0b1034000b1033000bdd0101057f230041106b22022400024002402001280208220341246c41046a2204417f4c0d00200128020021010240024020040d0041012105410021040c010b200410242205450d020b20002005360200200041086a22054100360200200020043602042000200310a10102402003450d002001200341246c6a2106034020012802002104200020052802004104106d2000280200200528020022036a20043600002005200341046a3602002002200036020c200141046a2002410c6a109c01200141246a22012006470d000b0b200241106a24000f0b1034000b1033000be10101047f02400240200041046a28020020002802082201470d0002400240200141016a22022001490d00200141017422032002200320024b1b22024104200241044b1b220241ffffffff007122042002470d00200241047422034100480d00200420024641027421040240024002402000280200410020011b22020d0020030d01200421020c040b200141047422012003460d03024020010d0020030d01410421020c040b20022001200310282202450d010c030b2003102422020d020b20040d030b102e000b20002002360200200041046a20034104763602000b0f0b102c000be10101047f02400240200041046a28020020002802082201470d0002400240200141016a22022001490d00200141017422032002200320024b1b22024104200241044b1b220241ffffffff017122042002470d00200241037422034100480d00200420024641027421040240024002402000280200410020011b22020d0020030d01200421020c040b200141037422012003460d03024020010d0020030d01410421020c040b20022001200310282202450d010c030b2003102422020d020b20040d030b102e000b20002002360200200041046a20034103763602000b0f0b102c000bae0503027f017e0c7f230041f0006b220224000240024020012802082203ad42f0007e2204422088a70d002004a72205417f4c0d00200128020021014104210602402005450d00200510242206450d020b20002006360200200041086a22074100360200200041046a200541f0006e36020020004100200310c1012007280200210602402003450d00200341f0006c21052000280200200641f0006c6a21002006200341047441706a4104766a21080340200241c0006a41186a2203200141286a290000370300200241c0006a41106a2206200141206a290000370300200241c0006a41086a2209200141186a2900003703002002200141106a290000370340200241206a41086a220a200141386a290000370300200241206a41106a220b200141c0006a290000370300200241206a41186a220c200141c8006a2900003703002002200141306a290000370320200241086a220d200141d8006a290000370300200241106a220e200141e0006a290000370300200241186a220f200141e8006a2900003703002002200141d0006a29000037030020012802002110200241e0006a200141046a10c201200020103602002000410c6a200241e0006a41086a280200360200200041046a2002290360370200200041286a2003290300370200200041206a2006290300370200200041186a2009290300370200200041106a2002290340370200200041c8006a200c290300370200200041c0006a200b290300370200200041386a200a290300370200200041306a2002290320370200200041d0006a2002290300370200200041d8006a200d290300370200200041e0006a200e290300370200200041e8006a200f290300370200200041f0006a2100200141f0006a2101200541907f6a22050d000b200841016a21060b20072006360200200241f0006a24000f0b1034000b1033000be20103017f017e017f02400240200041046a280200220320016b20024f0d0002400240200120026a22022001490d00200341017422012002200120024b1b22014104200141044b1bad42f0007e2204422088a722020d002004a722014100480d0020024541027421050240024002402000280200410020031b22020d0020010d01200521020c040b200341f0006c22032001460d03024020030d0020010d01410421020c040b20022003200110282202450d010c030b2001102422020d020b20050d030b102e000b20002002360200200041046a200141f0006e3602000b0f0b102c000bbd0503027f017e087f230041206b220224000240024020012802082203ad42247e2204422088a70d002004a72205417f4c0d00200128020021064104210102402005450d00200510242201450d020b2000200136020041002101200041086a22074100360200200041046a200541246e36020020004100200310d1012007280200210502402003450d00200341246c21082000280200200541246c6a210903400240024002400240024002400240200620016a22002d00000e06010203040500010b2002200041046a10c80120022002280200360013200228020421032002280208210a4105210b0c050b4100210b2002410036001b200241003602182002200041046a28000036001b2002200041016a2800003602182002200041146a2900003703002002200041196a290000370005200220022802183602102002200228001b360013200041086a28000021032000410c6a280000210a200041106a280000210c0c040b4101210b200041016a28000021032002200041086a10c80120022003360210200228020021032002280204210a2002280208210c0c030b200041016a28000021032002200041086a10c80120022003360210200228020021032002280204210a2002280208210c4102210b0c020b200041016a28000021032002200041086a10c80120022003360210200228020021032002280204210a2002280208210c4103210b0c010b4104210b2002200041046a2802003600132000410c6a280200210a200041086a28020021030b200920016a2200200b3a0000200041016a2002280210360000200041046a2002280013360000200041106a200c3602002000410c6a200a360200200041086a2003360200200041146a20022903003702002000411c6a200241086a290300370200200541016a21052008200141246a2201470d000b0b20072005360200200241206a24000f0b1034000b1033000b880201047f024002402001280208220241ffffff3f712002470d0020024105742203417f4c0d00200128020021010240024020030d00410121040c010b200310242204450d020b20002004360200200041086a22044100360200200041046a20034105763602002000410020021093012004280200210302402002450d002002410574220241606a2105200028020020034105746a2100034020002001290000370000200041186a200141186a290000370000200041106a200141106a290000370000200041086a200141086a290000370000200041206a2100200141206a2101200241606a22020d000b200541057620036a41016a21030b200420033602000f0b1034000b1033000bed0103027f017e027f230041b0026b220224000240024020012802082203ad42b0027e2204422088a70d002004a72205417f4c0d00200128020021014108210602402005450d00200510242206450d020b20002006360200200041086a22064100360200200041046a200541b0026e36020020004100200310c5012006280200210502402003450d00200341b0026c21032000280200200541b0026c6a210603402002200110c601200541016a21052006200241b00210cf0641b0026a2106200141b0026a2101200341d07d6a22030d000b0b200041086a2005360200200241b0026a24000f0b1034000b1033000be20103017f017e017f02400240200041046a280200220320016b20024f0d0002400240200120026a22022001490d00200341017422012002200120024b1b22014104200141044b1bad42b0027e2204422088a722020d002004a722014100480d0020024541037421050240024002402000280200410020031b22020d0020010d01200521020c040b200341b0026c22032001460d03024020030d0020010d01410821020c040b20022003200110282202450d010c030b2001102422020d020b20050d030b102e000b20002002360200200041046a200141b0026e3602000b0f0b102c000b942205047f067e017f037e047f230041e0036b2202240002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012802000e170102030405060b0708090a0b0c0d0e0f10111213141500010b200241086a200141086a108d03200041086a200241086a41c80010cf061a200041163602000c150b200241086a200141086a108e0320004100360200200041186a200241086a41106a290300370300200041106a200241086a41086a290300370300200041086a20022903083703000c140b200241086a200141086a108f03200041086a200241086a41a00210cf061a200041013602000c130b20004102360200200041086a200141086a2903003703000c120b02400240024002400240024002400240024020012d0004417f6a220341044b0d00200141046a210420030e050102030405010b41bf80c700412841dcbcc700102f000b200141086a2802002103410121050c040b41022105200241b0026a41026a200441036a2d00003a0000200241086a41086a200141146a290200370300200241186a2001411c6a290200370300200241206a200141246a2d00003a0000200220042f00013b01b00220022001410c6a290200370308200141086a2802002103200141286a28020021010c040b200141086a2802002103410321050c020b200241b2026a200441036a2d00003a0000200241086a41086a200141146a290200370300200241186a2001411c6a290200370300200241206a200141246a2d00003a0000200220042f00013b01b00220022001410c6a29020037030820012d00254100472104200141086a2802002103200141286a2802002101410421050c030b200141086a2802002103410521050b0b0b200020053a0004200020022f01b0023b0005200020043a0025200020022f01d0033b0126200041086a20033602002000410c6a2002290308370200200041286a2001360200200041076a200241b2026a2d00003a0000200041146a200241086a41086a2903003702002000411c6a200241186a290300370200200041246a200241206a2d00003a0000200041033602000c110b02400240024002400240024002400240200141086a22032d0000417f6a220541034b0d0020050e0401020304010b41bf80c700412841dcbcc700102f000b200241106a200341096a290000370300200241186a200341116a290000370300200241206a200341196a29000037030020022003290001370308200141386a2903002106200141306a2903002107410121010c030b200241106a200341096a290000370300200241186a200341116a290000370300200241206a200341196a29000037030020022003290001370308200141c8006a2903002108200141c0006a2903002109200141386a2903002106200141306a2903002107410221010c030b200241106a200341096a290000370300200241186a200341116a290000370300200241206a200341196a290000370300200220032900013703082002200341216a2800003602b0022002200341246a2800003600b302200141c8006a3100002108200141c0006a2902002109200141386a2902002106200141306a2902002107200141d8006a290300210a200141d0006a290300210b410321010c030b200241106a200341096a290000370300200241186a200341116a290000370300200241206a200341196a29000037030020022003290001370308200141386a2903002106200141306a2903002107410421010b0b0b20002002290308370009200020022802b00236002920004104360200200041d8006a200a370300200041d0006a200b370300200041c8006a2008370300200041c0006a2009370300200041386a2006370300200041306a2007370300200041086a20013a00002000412c6a20022800b302360000200041116a200241086a41086a290300370000200041196a200241186a290300370000200041216a200241206a2903003700000c100b200241086a200141046a10c001200041053602002000410c6a200241106a280200360200200020022903083702040c0f0b024002402001280204450d00200241b0026a41186a200141286a290000370300200241b0026a41106a200141206a290000370300200241b8026a200141186a290000370300200241b0026a41286a200141386a290000370300200241b0026a41306a200141c0006a290000370300200241b0026a41386a200141c8006a290000370300200241b0026a41c8006a200141d8006a290000370300200241b0026a41d0006a200141e0006a290000370300200241b0026a41d8006a200141e8006a2900003703002002200141106a2900003703b0022002200141306a2900003703d0022002200141d0006a2900003703f002200241b0026a41f8006a20014188016a290000370300200241b0026a41f0006a20014180016a290000370300200241b0026a41e8006a200141f8006a290000370300200241b0026a4198016a200141a8016a290000370300200241b0026a4190016a200141a0016a290000370300200241b0026a4188016a20014198016a2900003703002002200141f0006a29000037039003200220014190016a2900003703b003200241086a200141046a10c801200241146a200241b0026a41a00110cf061a0c010b200241003602080b200041046a200241086a41ac0110cf061a200041073602000c0e0b20004108360200200020012802043602040c0d0b200241086a200141086a109003200041086a200241086a41980210cf061a200041093602000c0c0b20012802042103200241086a200141086a10c801200241d0036a200141146a10d001200241086a41146a200241d0036a41086a280200360200200220022903d003370214200241b0026a41106a200241086a41106a2903002206370300200241b0026a41086a200241086a41086a29030022073703002002200229030822083703b002200141206a2902002109200141286a280200210520002003360204200041086a2008370200200041106a2007370200200041186a2006370200200041286a2005360200200041206a20093702002000412c6a2001412c6a290200370200200041346a200141346a2902003702002000413c6a2001413c6a290200370200200041c4006a200141c4006a290200370200200041cc006a200141cc006a290200370200200041d4006a200141d4006a290200370200200041dc006a200141dc006a290200370200200041e4006a200141e4006a2902003702002000410a3602000c0b0b108103000b200241086a200141086a109103200041086a200241086a41a00210cf061a2000410c3602000c090b2000410d3602000c080b200241086a200141046a10b702200041046a200241086a41c80010cf061a2000410e3602000c070b024002400240024020012f0104417f6a220341014b0d0020030e020102010b41bf80c700412841dcbcc700102f000b200241086a200141086a10c401200229020c210620022802082103410121010c010b20012f0106210541b00210242203450d082003200141086a28020010c601410221010b200020013b01042000410f3602002000410c6a2006370200200041086a2003360200200041066a20053b01000c060b200241086a200141086a10d002200041086a200241086a41a80210cf061a200041103602000c050b200241086a200141046a109203200041046a200241086a41c40010cf061a200041113602000c040b02400240024002400240200141086a22032d0000417f6a220c41034b0d00420021064101210542002109200c0e0404010203040b41bf80c700412841dcbcc700102f000b200241206a200341196a290000370300200241186a200341116a290000370300200241106a200341096a290000370300200220032900013703084200210641022105420021090c020b200241106a200341096a290000370300200241186a200341116a290000370300200241206a200341196a29000037030020022003290001370308200141c8006a2903002108200141c0006a2903002107200141386a290300210d200141306a290300210e200141d0006a28020021044200210641032105420021090c010b200241106a200341096a290000370300200241186a200341116a290000370300200241206a200341196a290000370300200220032900013703082002200341216a2800003602b0022002200341246a2800003600b302200141d0006a290300220f428080808070832106200141d8006a2903002109200141c8006a3100002108200141c0006a2902002107200141386a290200210d200141306a290200210e200141e8006a290300210b200141e0006a290300210a200141f0006a2802002110200fa72104410421050b20002002290308370009200020022802b002360029200041e8006a200b370300200041e0006a200a370300200041d8006a2009370300200041c8006a2008370300200041c0006a2007370300200041386a200d370300200041306a200e370300200041086a20053a00002000412c6a20022800b302360000200041f0006a2010360200200041d0006a20062004ad84370300200041116a200241086a41086a290300370000200041196a200241186a290300370000200041216a200241206a290300370000200041123602000c030b200241086a200141046a10930320004113360200200041246a200241286a2802003602002000411c6a200241206a290300370200200041146a200241186a2903003702002000410c6a200241106a290300370200200020022903083702040c020b200241086a200141086a10940320004114360200200041286a200241086a41206a290300370300200041206a200241086a41186a290300370300200041186a200241086a41106a290300370300200041106a200241086a41086a290300370300200041086a20022903083703000c010b024002400240024002400240024020012d0004417f6a221141054b0d004104210520110e06010203060405010b41bf80c700412841dcbcc700102f000b200241086a41086a2205200141106a290000370300200241086a41106a2212200141186a290000370300200241086a41156a22132001411d6a2900003700002002200141086a29000037030820012f0006211020012d0005210420012d0025210c41b00210242203450d062003200141286a280200109503200241b0026a41156a2013290000370000200241b0026a41106a2012290300370300200241b0026a41086a2005290300370300200220022903083703b002410121050c040b200241b0026a41086a200141106a290200370300200241b0026a41106a200141186a290200370300200241c5026a2001411d6a2900003700002002200141086a2902003703b00220012f0006211020012d0005210420012d0025210c410221050c030b200241b0026a41086a200141106a290200370300200241b0026a41106a200141186a290200370300200241c5026a2001411d6a2900003700002002200141086a2902003703b00220012f0006211020012d0005210420012d0025210c410321050c020b20012f0106211020012d00052104410521050c010b200241b0026a41086a200141106a290200370300200241b0026a41106a200141186a290200370300200241c5026a2001411d6a2900003700002002200141086a2902003703b0022001412c6a2802002113200141286a280200210320012f0006211020012d0005210420012f0126211220012d0025210c410621050b200020043a0005200020053a00042000200c3a002520004115360200200041066a20103b0100200041086a20022903b0023702002000412c6a2013360200200041286a2003360200200041266a20123b0100200041106a200241b0026a41086a290300370200200041186a200241b0026a41106a2903003702002000411d6a200241b0026a41156a2900003700000b200241e0036a24000f0b102c000ba10204017f017e027f037e0240024020012802082202ad42287e2203422088a70d002003a72204417f4c0d00200128020021014108210502402004450d00200410242205450d020b20002005360200200041086a22054100360200200041046a200441286e3602002000410020021090012005280200210402402002450d00200241286c21052000280200200441286c6a21020340200141086a2903002103200141106a2903002106200141186a290300210720012903002108200241206a200141206a290300370300200241186a2007370300200241106a2006370300200241086a200337030020022008370300200241286a2102200441016a2104200141286a2101200541586a22050d000b0b200041086a20043602000f0b1034000b1033000b870101037f0240024020012802082202417f4c0d00200128020021030240024020020d0041012101410021040c010b200210242201450d02200221040b20002001360200200041086a220141003602002000200436020420004100200210c9012000280200200128020022006a2003200210cf061a2001200020026a3602000f0b1034000b1033000b9a0101017f0240200041046a280200220320016b20024f0d000240024002400240200120026a22022001490d00200341017422012002200120024b1b22014108200141084b1b22014100480d002000280200410020031b2202450d0120032001460d032003450d0120022003200110282202450d020c030b102e000b2001102422020d010b102c000b20002002360200200041046a20013602000b0b830203027f017e037f230041106b220224000240024020012802082203ad420c7e2204422088a70d002004a72205417f4c0d00200128020021014104210602402005450d00200510242206450d020b20002006360200200041086a22074100360200200041046a2005410c6e36020020004100200310cb012007280200210602402003450d002003410c6c210520002802002006410c6c6a210020062003410274417c6a4102766a210303402002200110c801200041086a200241086a280200360200200020022903003702002000410c6a21002001410c6a2101200541746a22050d000b200341016a21060b20072006360200200241106a24000f0b1034000b1033000bdf0103017f017e017f02400240200041046a280200220320016b20024f0d0002400240200120026a22022001490d00200341017422012002200120024b1b22014104200141044b1bad420c7e2204422088a722020d002004a722014100480d0020024541027421050240024002402000280200410020031b22020d0020010d01200521020c040b2003410c6c22032001460d03024020030d0020010d01410421020c040b20022003200110282202450d010c030b2001102422020d020b20050d030b102e000b20002002360200200041046a2001410c6e3602000b0f0b102c000b8c0405027f017e0a7f067e017f230041c0006b220224000240024020012802082203ad42c1007e2204422088a70d002004a72205417f4c0d00200128020021010240024020050d00410121060c010b200510242206450d020b20002006360200200041086a22074100360200200041046a200541c1006e36020020004100200310cd012007280200210802402003450d002001200341c1006c6a21092000280200200841c1006c6a2100200241386a2105200241306a2106200241286a210a200241206a210b200241186a210c200241106a210d200241086a210e0340200141016a2900002104200141096a290000210f200141116a2900002110200141196a2900002111200141216a2900002112200141296a2900002113200141316a290000211420012d000021152005200141396a29000037030020062014370300200a2013370300200b2012370300200c2011370300200d2010370300200e200f37030020022004370300200020153a0000200041016a2002290300370000200041096a200e290300370000200041116a200d290300370000200041196a200c290300370000200041216a200b290300370000200041296a200a290300370000200041316a2006290300370000200041396a2005290300370000200041c1006a2100200141c1006a22012009470d000b200820036a21080b20072008360200200241c0006a24000f0b1034000b1033000bdf0103017f017e017f02400240200041046a280200220320016b20024f0d0002400240200120026a22022001490d00200341017422012002200120024b1b22014104200141044b1bad42c1007e2204422088a722020d002004a722014100480d0020024521050240024002402000280200410020031b22020d0020010d01200521020c040b200341c1006c22032001460d03024020030d0020010d01410121020c040b20022003200110282202450d010c030b2001102422020d020b20050d030b102e000b20002002360200200041046a200141c1006e3602000b0f0b102c000ba70201057f230041106b22022400024002402001280208220341ffffffff00712003470d0020034104742204417f4c0d00200128020021014104210502402004450d00200410242205450d020b20002005360200200041086a22064100360200200041046a200441047636020020004100200310cf012006280200210502402003450d00200028020020054104746a210020052003410474220441706a4104766a41016a21050340410221030240024002402001410c6a2d00004103710e03000102000b410021030c010b410121030b2002200110c80120002002290300370200200220033a000c200041086a200241086a290300370200200041106a2100200141106a2101200441706a22040d000b0b20062005360200200241106a24000f0b1034000b1033000be10101027f02400240200041046a280200220320016b20024f0d0002400240200120026a22022001490d00200341017422012002200120024b1b22014104200141044b1b220141ffffffff007122042001470d00200141047422024100480d00200420014641027421040240024002402000280200410020031b22010d0020020d01200421010c040b200341047422032002460d03024020030d0020020d01410421010c040b20012003200210282201450d010c030b2002102422010d020b20040d030b102e000b20002001360200200041046a20024104763602000b0f0b102c000b830203027f017e037f230041106b220224000240024020012802082203ad420c7e2204422088a70d002004a72205417f4c0d00200128020021014104210602402005450d00200510242206450d020b20002006360200200041086a22074100360200200041046a2005410c6e36020020004100200310cb012007280200210602402003450d002003410c6c210520002802002006410c6c6a210020062003410274417c6a4102766a210303402002200110c801200041086a200241086a280200360200200020022903003702002000410c6a21002001410c6a2101200541746a22050d000b200341016a21060b20072006360200200241106a24000f0b1034000b1033000bdf0103017f017e017f02400240200041046a280200220320016b20024f0d0002400240200120026a22022001490d00200341017422012002200120024b1b22014104200141044b1bad42247e2204422088a722020d002004a722014100480d0020024541027421050240024002402000280200410020031b22020d0020010d01200521020c040b200341246c22032001460d03024020030d0020010d01410421020c040b20022003200110282202450d010c030b2001102422020d020b20050d030b102e000b20002002360200200041046a200141246e3602000b0f0b102c000bcd0403037f017e037f230041e00a6b2202240020022001108d01024002402002280200450d00200041003602000c010b0240024020022802042203200128020028020441c8036e2204200420034b1bad42c8037e2205422088a70d002005a72204417f4c0d000240024020040d00410821060c010b200410242206450d020b2001200128020441016a220736020420024100360210200220063602082002200441c8036e36020c024002400240200720012802084b0d0002402003450d0020024198076a41f0006a210841002104034020024198076a200110d301200241b0066a20024198076a41e80010cf061a2002290380082105200241d8036a200841d80210cf061a20054203510d03200241f0026a200241b0066a41e80010cf061a200241186a200241d8036a41d80210cf061a02402004200228020c470d00200241086a200410d40120022802102104200228020821060b2006200441c8036c6a200241f0026a41e80010cf0622072005370368200741f0006a200241186a41d80210cf061a2002200441016a22043602102003417f6a22030d000b200128020421070b2000200229030837020020012007417f6a360204200041086a200241086a41086a2802003602000c050b20004100360200200241086a21030c010b20004100360200200241086a21032004450d00200441c8036c210120022802084198016a21040340200410d501200441c8036a2104200141b87c6a22010d000b0b200341046a2802002204450d02200441c8036c450d02200328020010260c020b1034000b1033000b200241e00a6a24000bae1804057f017e047f067e230041e00a6b22022400200241206a2001108d01024002400240024002400240024002400240024020022802200d002002280224210320012001280204220441016a2205360204200520012802084b0d0002402003450d0041002105410020036b2103034020054101460d0620032005417f6a2205470d000b0b20012004360204200128020022052802042203450d01200528020022062d0000210420052003417f6a3602042005200641016a360200200441ff00714104470d024100210520044118744118754100480d03420221070c070b200042033703680c080b200042033703680c070b200042033703680c060b200241003a00c804024002400240024002400240024002400340200128020022032802042204450d01200241a8046a20056a200328020022062d00003a000020032004417f6a3602042003200641016a3602002002200541016a22053a00c80420054120470d000b200241f8016a41186a200241a8046a41186a2903002207370300200241e0066a41086a200241a8046a41086a290300370300200241e0066a41106a200241a8046a41106a290300370300200241e0066a41186a2007370300200220022903a8043703e006200128020022052802042204450d09200528020022062d0000210320052004417f6a3602042005200641016a360200200341024b0d0920030e03010203010b200541ff0171450d08200241003a00c8040c080b41002105200241003a00e80402400340200128020022032802042204450d01200241a8046a20056a200328020022062d00003a000020032004417f6a3602042003200641016a3602002002200541016a22053a00e804200541c000470d000b200241f8016a41086a2205200241a8046a41086a290300370300200241f8016a41106a2203200241a8046a41106a290300370300200241f8016a41186a2204200241a8046a41186a290300370300200241f8016a41206a2206200241a8046a41206a290300370300200241f8016a41286a2208200241a8046a41286a290300370300200241f8016a41306a2209200241a8046a41306a290300370300200241f8016a41386a220a200241a8046a41386a290300370300200220022903a8043703f801200241980a6a41386a220b200a290300370300200241980a6a41306a20092903002207370300200241980a6a41286a2008290300220c370300200241980a6a41206a2006290300220d370300200241980a6a41186a2004290300220e370300200241980a6a41106a2003290300220f370300200241980a6a41086a20052903002210370300200220022903f80122113703980a200241d0096a41306a22052007370300200241d0096a41286a2203200c370300200241d0096a41206a2204200d370300200241d0096a41186a2206200e370300200241d0096a41106a2208200f370300200241d0096a41086a22092010370300200241d0096a41386a220a200b290300370300200220113703d009200241c8076a41386a200a290300370300200241c8076a41306a2005290300370300200241c8076a41286a2003290300370300200241c8076a41206a2004290300370300200241c8076a41186a2006290300370300200241c8076a41106a2008290300370300200241c8076a41086a2009290300370300200220022903d0093703c807410021030c030b200541ff0171450d07200241003a00e804420221070c080b41002105200241003a00e80402400340200128020022032802042204450d01200241a8046a20056a200328020022062d00003a000020032004417f6a3602042003200641016a3602002002200541016a22053a00e804200541c000470d000b200241f8016a41086a2205200241a8046a41086a290300370300200241f8016a41106a2203200241a8046a41106a290300370300200241f8016a41186a2204200241a8046a41186a290300370300200241f8016a41206a2206200241a8046a41206a290300370300200241f8016a41286a2208200241a8046a41286a290300370300200241f8016a41306a2209200241a8046a41306a290300370300200241f8016a41386a220a200241a8046a41386a290300370300200220022903a8043703f801200241980a6a41386a220b200a290300370300200241980a6a41306a20092903002207370300200241980a6a41286a2008290300220c370300200241980a6a41206a2006290300220d370300200241980a6a41186a2004290300220e370300200241980a6a41106a2003290300220f370300200241980a6a41086a20052903002210370300200220022903f80122113703980a200241d0096a41306a22052007370300200241d0096a41286a2203200c370300200241d0096a41206a2204200d370300200241d0096a41186a2206200e370300200241d0096a41106a2208200f370300200241d0096a41086a22092010370300200241d0096a41386a220a200b290300370300200220113703d009200241c8076a41386a200a290300370300200241c8076a41306a2005290300370300200241c8076a41286a2003290300370300200241c8076a41206a2004290300370300200241c8076a41186a2006290300370300200241c8076a41106a2008290300370300200241c8076a41086a2009290300370300200220022903d0093703c807410121030c020b200541ff0171450d06200241003a00e804420221070c070b41002105200241003a00e9040340200128020022032802042204450d02200241a8046a20056a200328020022062d00003a000020032004417f6a3602042003200641016a3602002002200541016a22053a00e904200541c100470d000b200241f8016a200241a8046a41c10010cf061a200241980a6a200241f8016a41c10010cf061a200241d0096a200241980a6a41c10010cf061a200241c8076a200241d0096a41c10010cf061a410221030b20024187076a200241c8076a41c10010cf061a200128020022052802042204450d0420052802002206310000210d20052004417f6a3602042005200641016a360200200d50450d01420021070c020b200541ff0171450d03200241003a00e904420221070c040b200128020022052802042204450d0220052802002206310000210e20052004417f6a3602042005200641016a3602004202200d420f8386220c4204540d0242012107200e420886200d84420488200c420c88220d4201200d4201561b7e220d200c5a0d020b200241186a2001108d0120022802180d01200228021c21042002200110ec042002290300a70d01200241106a290300210f2002290308210e200241f8016a41186a200241e0066a41186a290300370300200241f8016a41106a200241e0066a41106a290300370300200241f8016a41086a200241e0066a41086a290300370300200220022903e0063703f801200241a8046a20024187076a41c10010cf061a200241980a6a41046a200241da066a41046a2f01003b0100200220022801da063602980a0c020b102e000b420221070b200241d8016a41186a2205200241f8016a41186a290300370300200241d8016a41106a2206200241f8016a41106a290300370300200241d8016a41086a2208200241f8016a41086a290300370300200220022903f8013703d80120024197016a200241a8046a41c10010cf061a20024190016a41046a2209200241980a6a41046a2f01003b0100200220022802980a3602900120074202510d01200241f0006a41186a2005290300370300200241f0006a41106a2006290300370300200241f0006a41086a2008290300370300200220022903d8013703702002412f6a20024197016a41c10010cf061a200241286a41046a20092f01003b010020022002280290013602280b200241a8046a200110b40220022802a8042105200241f8016a200241a8046a41047241ac0210cf061a024020054117460d0020002002290370370300200020033a0020200041186a200241f0006a41186a290300370300200041106a200241f0006a41106a290300370300200041086a200241f0006a41086a290300370300200041216a2002412f6a41c10010cf061a200041e6006a200241286a41046a2f01003b01002000200228022836016220004188016a200f37030020004180016a200e37030020004198016a200536020020004190016a2004360200200041f8006a200d3703002000200c370370200020073703682000419c016a200241f8016a41ac0210cf061a0c020b200042033703680c010b200042033703680b200241e00a6a24000bdd0103027f017e017f02400240200041046a2802002001470d0002400240200141016a22022001490d00200141017422032002200320024b1b22024104200241044b1bad42c8037e2204422088a722030d002004a722024100480d0020034541037421050240024002402000280200410020011b22030d0020020d01200521030c040b200141c8036c22012002460d03024020010d0020020d01410821030c040b20032001200210282203450d010c030b2002102422030d020b20050d030b102e000b20002003360200200041046a200241c8036e3602000b0f0b102c000b9a1a01047f024002402000280200220141154b0d000240024002400240024002400240024002400240024002400240024020010e1600010f0f0f020f030f04050f060f0708090a0f0b0c0d000b200041086a280200417e6a220141074b0d0e02400240024002400240024020010e080014010214030405000b200041106a280200450d132000410c6a28020010260f0b200041106a280200450d122000410c6a28020010260f0b200041106a280200450d112000410c6a28020010260f0b0240200041146a2802002202450d002000410c6a2802002101200241186c210203400240200141046a280200450d00200128020010260b0240200141106a280200450d002001410c6a28020010260b200141186a2101200241686a22020d000b0b200041106a2802002201450d10200141186c450d10200028020c10260f0b0240200041146a2802002202450d002000410c6a28020021012002410c6c210203400240200141046a280200450d00200128020010260b2001410c6a2101200241746a22020d000b0b200041106a2802002201450d0f2001410c6c450d0f200028020c10260f0b200041106a280200450d0e2000410c6a28020010260f0b0240200041086a280200220141014b0d00024020010e020f000f0b2000412c6a220210d6010240200041306a2802002201450d00200141246c450d00200228020010260b2000419c016a220210d6010240200041a0016a2802002201450d00200141246c450d00200228020010260b0240200041186a2802002202450d00200041106a28020021012002410c6c210203400240200141046a280200450d00200128020010260b2001410c6a2101200241746a22020d000b0b200041146a2802002201450d0e2001410c6c450d0e200028021010260f0b2000412c6a220210d6010240200041306a2802002201450d00200141246c450d00200228020010260b2000419c016a220210d6010240200041a0016a2802002201450d00200141246c450d00200228020010260b0240200041186a2802002202450d00200041106a28020021012002410c6c210203400240200141046a280200450d00200128020010260b2001410c6a2101200241746a22020d000b0b200041146a2802002201450d0d2001410c6c450d0d200028021010260f0b02402000410c6a2802002201450d00200141f0006c2102200028020441046a21010340200110d6010240200141046a2802002203450d00200341246c450d00200128020010260b200141f0006a2101200241907f6a22020d000b0b200041086a2802002201450d0c200141f0006c450d0c200028020410260f0b20002802042201450d0b200041086a280200450d0b200110260f0b200041086a280200417f6a220141014b0d0a0240024020010e020001000b0240200041186a2802002202450d00200041106a28020021012002410c6c210203400240200141046a280200450d00200128020010260b2001410c6a2101200241746a22020d000b0b200041146a2802002201450d0b2001410c6c450d0b200028021010260f0b0240200041186a2802002202450d00200041106a28020021012002410c6c210203400240200141046a280200450d00200128020010260b2001410c6a2101200241746a22020d000b0b200041146a2802002201450d0a2001410c6c450d0a200028021010260f0b02402000410c6a280200450d00200041086a28020010260b02402000411c6a2802002202450d00200041146a28020021012002410c6c210203400240200141046a280200450d00200128020010260b2001410c6a2101200241746a22020d000b0b200041186a2802002201450d092001410c6c450d09200028021410260f0b0240200041086a2d0000220141034b0d000240024020010e040b00010b0b0b0240200041146a2802002201450d002000410c6a280200220320014198026c6a210403400240200341d8006a280200450d00200328025410260b0240200341186a2802002202450d00200328021021012002410474210203400240200141046a280200450d00200128020010260b200141106a2101200241706a22020d000b0b0240200341146a28020041ffffffff0071450d00200328021010260b0240200328021c2201450d00200341206a280200450d00200110260b024020034184026a2802002201450d00200141c1006c450d0020032802800210260b20034198026a210120034190026a4100360200200328028c0221022003410136028c02024020034194026a280200450d00200210260b2001210320012004470d000b0b200041106a2802002201450d0a20014198026c450d0a200028020c10260f0b0240200041186a2802002202450d00200041106a28020021012002410c6c210203400240200141046a280200450d00200128020010260b2001410c6a2101200241746a22020d000b0b200041146a2802002201450d092001410c6c450d09200028021010260f0b200041146a280200450d08200041106a28020010260f0b20002d0004417f6a220141034b0d070240024020010e0400090901000b0240200041106a280200450d002000410c6a28020010260b2000411c6a280200450d08200041186a28020010260f0b02402000410c6a280200450d00200041086a28020010260b200041186a280200450d07200041146a28020010260f0b024020002f0104220141014b0d00024020010e020800080b0240200041106a2802002202450d00200041086a2802002101200241b0026c21020340200110d501200141b0026a2101200241d07d6a22020d000b0b2000410c6a2802002201450d07200141b0026c450d07200028020810260f0b200041086a220128020010d501200128020010260f0b200041086a2d0000417e6a2201410b4b0d05024002400240024020010e0c000109090909090909090203000b0240200041146a2802002202450d002000410c6a2802002201200241c8006c6a21020340024020012d00004101470d00200141086a280200450d00200141046a28020010260b0240200141246a2d00004101470d002001412c6a280200450d00200141286a28020010260b200141c8006a22012002470d000b0b0240200041106a2802002201450d00200141c8006c450d00200028020c10260b0240200041186a2d00004101470d00200041206a280200450d002000411c6a28020010260b02402000413c6a2d00004101470d00200041c4006a280200450d00200041c0006a28020010260b0240200041e0006a2d00004101470d00200041e8006a280200450d00200041e4006a28020010260b024020004184016a2d00004101470d002000418c016a280200450d0020004188016a28020010260b0240200041a8016a2d00004101470d00200041b0016a280200450d00200041ac016a28020010260b0240200041cc016a2d00004101470d00200041d4016a280200450d00200041d0016a28020010260b200041f0016a2d00004101470d08200041f8016a280200450d08200041f4016a28020010260f0b0240200041146a2802002201450d00200141c4006c21022000410c6a28020041286a210103400240200141786a2d00004101470d002001280200450d002001417c6a28020010260b200141c4006a2101200241bc7f6a22020d000b0b200041106a2802002201450d07200141c4006c450d07200028020c10260f0b2000412c6a2d00004101470d06200041346a280200450d06200041306a28020010260f0b2000412c6a2d00004101470d05200041346a280200450d05200041306a28020010260f0b20002d0004417f6a220141024b0d040240024020010e03000601000b200041286a220128020010d501200128020010260f0b2000410c6a28020041ffffff3f71450d04200041086a28020010260f0b024020002d0004220141054b0d00024002400240024020010e06080008010203080b200041186a220128020010d501200128020010260f0b02402000410c6a280200450d00200041086a28020010260b200041246a220128020010d501200128020010260f0b2000410c6a280200450d05200041086a28020010260c050b200041186a220128020010d501200128020010260f0b02402000410c6a280200450d00200041086a28020010260b200041246a220128020010d501200128020010260f0b0240200041086a2d0000220141034b0d000240024020010e0405000105050b2000410c6a220128020010d501200128020010260f0b2000410c6a220128020010d501200128020010260f0b2000412c6a220128020010d501200128020010260f0b20002d00044101470d01200041286a220128020010d501200128020010260f0b0240200041086a2d0000220141034b0d0002400240024020010e0404000102040b0240200041106a28020041ffffff3f71450d002000410c6a28020010260b200041186a220128020010d501200128020010260f0b0240200041106a28020041ffffff3f71450d002000410c6a28020010260b200041286a280200450d02200041246a28020010260f0b200041306a28020041ffffff3f71450d012000412c6a28020010260f0b200041306a28020041ffffff3f71450d002000412c6a28020010260f0b0bb10101027f024020002802082201450d0020002802002100200141246c210103400240024020002d0000220241044b0d0002400240024020020e050400010204040b2000410c6a280200450d03200041086a28020010260c030b2000410c6a280200450d02200041086a28020010260c020b2000410c6a280200450d01200041086a28020010260c010b200041086a280200450d00200041046a28020010260b200041246a21002001415c6a22010d000b0b0bd60101017f024002402000280200220141034b0d0002400240024020010e0404000102040b0240200041086a28020041244d0d00200041106a28020010260b200041386a280200450d03200041346a28020010260f0b200041086a28020041244d0d02200041106a28020010260f0b20002802041026200041086a2802002201450d012000410c6a280200450d01200110260c010b0240200041086a28020041244d0d00200041106a28020010260b200041346a2802001026200041386a2802002201450d002000413c6a280200450d00200110260f0b0b960101047f2000200041086a2202280200200128020420012802006b10c901200228020021030240200128020022042001280204460d00200028020021052001200441016a36020020042d0000210002400340200520036a20003a0000200128020022002001280204460d01200341016a21032001200041016a36020020002d000021000c000b0b200341016a21030b200220033602000b920503037f017e067f230041206b22022400200241086a2001108d01024002402002280208450d00200041003602000c010b0240024002400240024002400240200228020c22032001280200280204410c6e2204200420034b1bad420c7e2205422088a70d002005a72204417f4c0d000240024020040d00410421060c010b200410242206450d020b2001200128020441016a2207360204200241003602182002200636021020022004410c6e360214200720012802084b0d022003450d0441002108034020022001108d0120022802000d0620012802002207280204220920022802042204490d062004417f4c0d010240024020040d004100210a4101210b0c010b2004102a220b450d032001280200220728020421092004210a0b0240024020092004490d00200b2007280200200410cf0621092007280204220b20044f0d012004200b41b8afc0001048000b200a450d07200b10260c070b2007200b20046b3602042007200728020020046a3602002009450d062004ad422086200aad842105024020082002280214470d00200241106a2008410110cb0120022802182108200228021021060b20062008410c6c6a22042005370204200420093602002002200841016a22083602182003417f6a2203450d040c000b0b1034000b1033000b20004100360200200241106a21070c030b200128020421070b2000200229031037020020012007417f6a360204200041086a200241106a41086a2802003602000c020b20004100360200200241106a21072008450d00200228021021042008410c6c210103400240200441046a280200450d00200428020010260b2004410c6a2104200141746a22010d000b0b200741046a2802002204450d002004410c6c450d00200728020010260b200241206a24000bd30603097f017e017f23004180026b2202240020022001108d01024002402002280200450d00200041003602000c010b0240024002402002280204220320012802002802044105762204200420034b1b22044105742205417f4c0d004101210602402004450d00200510242206450d020b2001200128020441016a2205360204200241003602102002200436020c2002200636020802400240200520012802084b0d0002402003450d0041002107410021080340200241003a00b801200841016a2108410021040340200128020022052802042209450d0420024198016a20046a2005280200220a2d00003a000020052009417f6a3602042005200a41016a3602002002200441016a22043a00b80120044120470d000b200241f8006a41186a20024198016a41186a290300220b370300200241d8006a41086a220420024198016a41086a290300370300200241d8006a41106a220520024198016a41106a290300370300200241d8006a41186a2209200b3703002002200229039801370358200241386a41186a220a2009290300370300200241386a41106a22092005290300370300200241386a41086a2205200429030037030020022002290358370338200241186a41186a220c200a290300370300200241186a41106a220a2009290300370300200241186a41086a220920052903003703002002200229033837031802402007200228020c470d00200241086a2007410110930120022802102107200228020821060b200620074105746a22042002290318370000200441186a200c290300370000200441106a200a290300370000200441086a20092903003700002002200741016a220736021020082003470d000b200128020421050b2000200229030837020020012005417f6a360204200041086a200241086a41086a2802003602000c050b20004100360200200241086a21040c030b0240200441ff0171450d00200241003a00b8010b200241386a41086a200241d8006a41086a290300370300200241386a41106a200241d8006a41106a290300370300200241386a41186a200241d8006a41186a2903003703002002200229035837033820004100360200200241086a21040c020b1034000b1033000b200441046a28020041ffffff3f71450d00200428020010260b20024180026a24000be7380c037f017e127f027e177f027e047f047e1a7f067e107f027e230041e00a6b22022400200241206a2001108f01024002402002280220450d00200041003602000c010b024002402002280224220320012802044198026e2204200420034b1bad4298027e2205422088a70d002005a72204417f4c0d0002400240024020040d00410821060c010b200410242206450d010b2002410036023020022006360228200220044198026e36022c02402003450d00200241980a6a410172210741002108410021090340024002402001280204220a41044f0d00200c210b4100210a0c010b2001280200220d280000210e2001200a417c6a220f3602042001200d41046a36020041002104200241003a00b80a200a417b6a210a024002400340200f2004460d01200241980a6a20046a200d20046a220b41046a2d00003a00002001200a3602042001200b41056a3602002002200441016a220b3a00b80a200a417f6a210a200b2104200b4120460d020c000b0b0240200441ff0171450d00200241003a00b80a0b200c210b4100210a0c010b200241d8096a41086a2210200241980a6a41086a2211290300370300200241d8096a41106a2212200241980a6a41106a2213290300370300200241d8096a41186a220f200241980a6a41186a2214290300370300200220022903980a3703d8090240200b41ff0171411f4b0d00200c210b4100210a0c010b200241f8056a41086a22152010290300370300200241f8056a41106a22162012290300370300200241f8056a41186a2217200f290300370300200220022903d8093703f805200241186a2001108f014100210d024002400240024002400240024002400240024002400240024020022802180d004100210d02402001280204220a200228021c2204490d002004417f4c0d120240024020040d004100210b4101210d0c010b2004102a220d450d122001280204210a2004210b0b0240200a2004490d00200d2001280200200410cf061a2001280204220a2004490d032004ad422086200bad8421182001200a20046b3602042001200128020020046a3602000c010b0240200b450d00200d10260b4100210d0b20182019200d1b21190b2019a7201a200d1b211a2019422088a7201b200d1b211b024002400240200d450d004100210a200241003a00b80a2001280204417f6a210402400240024002400240024002400240024003402004417f460d01200241980a6a200a6a2001280200220b2d00003a0000200120043602042001200b41016a3602002002200a41016a220b3a00b80a2004417f6a2104200b210a200b4120470d000b2010201129030037030020122013290300370300200f2014290300370300200220022903980a3703d809200b41ff0171411f4d0d0120024198066a41086a221c201029030037030020024198066a41106a221d201229030037030020024198066a41186a221e200f290300370300200220022903d80922053703f8062002200537039806200241980a6a200110dc0120022d00980a4101460d04200241d8096a41386a221f200741386a2220290000370300200241d8096a41306a2221200741306a2222290000370300200241d8096a41286a2223200741286a2224290000370300200241d8096a41206a2225200741206a2226290000370300200f200741186a22272900003703002012200741106a22282900003703002010200741086a2229290000370300200220072900003703d80941002104200241003a00b80a2001280204212a417f210a0340202a2004460d03200241980a6a20046a2001280200220b2d00003a00002001202a200a6a3602042001200b41016a3602002002200441016a220b3a00b80a200a417f6a210a200b2104200b4120470d000b200241d8086a41086a222b2011290300370300200241d8086a41106a222c2013290300370300200241d8086a41186a222d2014290300370300200220022903980a3703d808200b41ff0171411f4d0d03200241b8066a41086a222e202b290300370300200241b8066a41106a222f202c290300370300200241b8066a41186a2230202d290300370300200220022903d8083703b806202a200b6b22044110490d072001280200220a41086a2900002131200a29000021322001200a41106a3602002001200441706a360204200241980a6a200110dd0120022802980a220a450d07200229029c0a21054100210b200241003a00b80a2001280204417f6a210403402004417f460d06200241980a6a200b6a2001280200222a2d00003a0000200120043602042001202a41016a3602002002200b41016a222a3a00b80a2004417f6a2104202a210b202a4120470d000b202b2011290300370300202c2013290300370300202d2014290300370300200220022903980a3703d808202a41ff0171411f4d0d06200241f8066a41086a2233202b290300370300200241f8066a41106a2234202c290300370300200241f8066a41186a2235202d290300370300200220022903d8083703f8062004417f470d080c130b200a41ff0171450d00200241003a00b80a0b0240201a450d00200d10260b200c210b4100210a0c160b200441ff0171450d00200241003a00b80a0b0240201a450d00200d10260b200c210b4100210a0c140b0240201a450d00200d10260b200c210b4100210a0c130b200b41ff0171450d00200241003a00b80a0b02402005422088a72204450d002004410474210b200a210403400240200441046a280200450d00200428020010260b200441106a2104200b41706a220b0d000b0b200542ffffffff008350450d070b200c210b0c0e0b2001280200220b2d0000212a200120043602042001200b41016a360200202a41014b0d0a4100210b02400240202a0e020100010b200241106a2001108f0120022802100d0b4100210402402001280204222a2002280214220b490d00200b417f4c0d1502400240200b0d0041002136410121040c010b200b102a2204450d152001280204212a200b21360b0240202a200b490d0020042001280200200b10cf061a2001280204222a200b490d07200bad4220862036ad8421372001202a200b6b36020420012001280200200b6a3602000c010b02402036450d00200410260b410021040b2037203820041b2238203920041b2239203a20041b213a2004200c20041b210b2004450d0c0b203aa7213b02400240200128020422044104490d002001280200220c280000213c20012004417c6a3602042001200c41046a360200200241d8056a41086a22042033290300370300200241d8056a41106a220c2034290300370300200241d8056a41186a22332035290300370300200241b8056a41186a22342017290300370300200241b8056a41106a22352016290300370300200241b8056a41086a22362015290300370300200220022903f8063703d805200220022903f8053703b80520024198056a41186a223d201e29030037030020024198056a41106a223e201d29030037030020024198056a41086a223f201c29030037030020022002290398063703980520024198096a41386a2217201f29030037030020024198096a41306a221c202129030037030020024198096a41286a221d202329030037030020024198096a41206a221e202529030037030020024198096a41186a222a200f29030037030020024198096a41106a2215201229030037030020024198096a41086a22162010290300370300200220022903d80937039809200241f8046a41186a22402030290300370300200241f8046a41106a2230202f290300370300200241f8046a41086a222f202e290300370300200220022903b8063703f804200241d8046a41186a22412033290300370300200241d8046a41106a2242200c290300370300200241d8046a41086a22432004290300370300200220022903d8053703d804200241b8046a41186a22442034290300370300200241b8046a41106a22452035290300370300200241b8046a41086a22462036290300370300200220022903b8053703b80420024198046a41186a2247203d29030037030020024198046a41106a2248203e29030037030020024198046a41086a2249203f290300370300200220022903980537039804200241d8036a41386a224a2017290300370300200241d8036a41306a224b201c290300370300200241d8036a41286a224c201d290300370300200241d8036a41206a224d201e290300370300200241d8036a41186a224e202a290300370300200241d8036a41106a224f2015290300370300200241d8036a41086a2250201629030037030020022002290398093703d803200241b8036a41186a22512040290300370300200241b8036a41106a22522030290300370300200241b8036a41086a2253202f290300370300200220022903f8043703b803200241086a2001108f012005422088a721402005a721542002280208450d010c0a0b0240200b450d00203b450d00200b10260b02402005422088a72204450d002004410474210f200a210403400240200441046a280200450d00200428020010260b200441106a2104200f41706a220f0d000b0b200542ffffffff0083500d0e0c0d0b200228020c222e200128020441c1006e22042004202e4b1bad42c1007e2205422088a70d132005a72204417f4c0d130240024020040d00410121330c010b200410242233450d130b4100210c2002410036028007200220333602f8062002200441c1006e22043602fc0602400240202e450d004100210c034020012802042204450d022001280200222f2d0000213020012004417f6a3602042001202f41016a3602002030417f6a220441014b0d0202400240024020040e020001000b200241980a6a200110dc0120022d00980a4101460d04201f20202900002205370300202120222900002255370300202320242900002256370300202520262900002257370300200f202729000022583703002016202929000037030020152028290000370300202a2058370300201e2057370300201d2056370300201c20553703002017200537030020022007290000370398094100212f0c010b200241980a6a200110dc0120022d00980a4101460d03201f20202900002205370300202120222900002255370300202320242900002256370300202520262900002257370300200f202729000022583703002016202929000037030020152028290000370300202a2058370300201e2057370300201d2056370300201c20553703002017200537030020022007290000370398094101212f0b200241d8086a41386a20172903002205370300200241d8086a41306a201c2903002255370300200241d8086a41286a201d2903002256370300200241d8086a41206a201e2903002257370300202d202a2903002258370300202c20152903002259370300202b2016290300225a37030020024198086a41086a2230205a37030020024198086a41106a2234205937030020024198086a41186a2235205837030020024198086a41206a2236205737030020024198086a41286a223d205637030020024198086a41306a223e205537030020024198086a41386a223f2005370300200220022903980922053703d80820022005370398080240200c20022802fc06470d00200241f8066a200c410110cd0120022802f8062133200228028007210c0b2033200c41c1006c6a2204202f3a00002004200229039808370001200441096a2030290300370000200441116a2034290300370000200441196a2035290300370000200441216a2036290300370000200441296a203d290300370000200441316a203e290300370000200441396a203f2903003700002002200c41016a220c36028007202e417f6a222e0d000b20022802fc0621040b2033450d0920022001108f0120022802000d082002280204221c41076a41037622170d024100211d4101211e0c030b20022802fc062204450d08200441c1006c450d08203310260c080b200c210b4100210a0c0e0b2017102a221e450d102017211d0b0240024020012802042017490d00201e2001280200201710cf06211e2001280204221f2017490d052001201f20176b3602042001200128020020176a360200200241980a6a201e41d4c0c70020171b201710de01200228029c0a410376201c4f0d0141c8f3c600412641dcbcc700102f000b201d450d05201e10260c050b200241980a6a201c10df0120022802a00a211c200228029c0a211f20022802980a21170240201d450d00201e10260b2017450d04203a422088a7215b200f204129030037030020122042290300370300201020432903003703002016204629030037030020152045290300370300202a2044290300370300202b2049290300370300202c2048290300370300202d2047290300370300200220022903d8043703d809200220022903b8043703980920022002290398043703d808200241980a6a41386a204a290300370300200241980a6a41306a204b290300370300200241980a6a41286a204c290300370300200241980a6a41206a204d2903003703002014204e2903003703002013204f2903003703002011205029030037030020024198086a41186a205129030037030020024198086a41106a205229030037030020024198086a41086a2053290300370300200220022903d8033703980a200220022903b803370398082033215c2004215d200c215e200e215f203c2160201b2161201a2162200d2163203b2164200b21652040216620542167201c2168201f21692017216a2032216b2031216c0c0c0b2004200a41b8afc0001048000b200b202a41b8afc0001048000b200a1026200c210b0c070b2017201f41b8afc0001048000b02402004450d00200441c1006c450d00203310260b0240201a450d00200d10260b02402040450d002040410474210d200a210403400240200441046a280200450d00200428020010260b200441106a2104200d41706a220d0d000b0b0240205441ffffffff0071450d00200a10260b200b450d06203b450d060c010b0240201a450d00200d10260b02402040450d002040410474210d200a210403400240200441046a280200450d00200428020010260b200441106a2104200d41706a220d0d000b0b0240205441ffffffff0071450d00200a10260b200b450d05203b450d050b200b10260c040b200c210b0b02402005422088a72204450d002004410474210f200a210403400240200441046a280200450d00200428020010260b200441106a2104200f41706a220f0d000b0b200542ffffffff0083500d010b200a10260b201a450d00200d10264100210a0c010b4100210a0b20024198036a41186a2204200241d8096a41186a29030037030020024198036a41106a220d200241d8096a41106a29030037030020024198036a41086a220f200241d8096a41086a290300370300200241f8026a41086a220c20024198096a41086a290300370300200241f8026a41106a220e20024198096a41106a290300370300200241f8026a41186a221020024198096a41186a290300370300200241d8026a41086a2212200241d8086a41086a290300370300200241d8026a41106a222a200241d8086a41106a290300370300200241d8026a41186a2211200241d8086a41186a290300370300200220022903d8093703980320022002290398093703f802200220022903d8083703d80220024198026a41386a2213200241980a6a41386a29030037030020024198026a41306a2214200241980a6a41306a29030037030020024198026a41286a2215200241980a6a41286a29030037030020024198026a41206a2216200241980a6a41206a29030037030020024198026a41186a2217200241980a6a41186a29030037030020024198026a41106a221c200241980a6a41106a29030037030020024198026a41086a221d200241980a6a41086a290300370300200241f8016a41086a221e20024198086a41086a290300370300200241f8016a41106a221f20024198086a41106a290300370300200241f8016a41186a222120024198086a41186a290300370300200220022903980a3703980220022002290398083703f801200a450d04200941016a2109200241d8016a41186a22232004290300370300200241d8016a41106a2225200d290300370300200241d8016a41086a220d200f290300370300200241b8016a41086a220f200c290300370300200241b8016a41106a220c200e290300370300200241b8016a41186a220e201029030037030020024198016a41086a2210201229030037030020024198016a41106a2212202a29030037030020024198016a41186a222a201129030037030020022002290398033703d801200220022903f8023703b801200220022903d80237039801200241d8006a41386a22112013290300370300200241d8006a41306a22132014290300370300200241d8006a41286a22142015290300370300200241d8006a41206a22152016290300370300200241d8006a41186a22162017290300370300200241d8006a41106a2217201c290300370300200241d8006a41086a221c201d290300370300200241386a41086a221d201e290300370300200241386a41106a221e201f290300370300200241386a41186a221f20212903003703002002200229039802370358200220022903f80137033802402008200228022c470d00200241286a2008410110e00120022802282106200228023021080b200620084198026c6a2204206c3703082004206b3703002004200a360210200441286a2060360200200441246a205b360200200441206a20643602002004411c6a2065360200200441186a2066360200200441146a2067360200200d2903002105202529030021312023290300213220022903d8012155200441dc006a2061360200200441d8006a2062360200200441d4006a2063360200200441d0006a205f360200200441c4006a20323702002004413c6a2031370200200441346a20053702002004412c6a2055370200200441f8006a200e290300370200200441f0006a200c290300370200200441e8006a200f290300370200200441e0006a20022903b80137020020044198016a202a29030037020020044190016a201229030037020020044188016a201029030037020020044180016a200229039801370200200441b8016a2016290300370200200441b0016a2017290300370200200441a8016a201c290300370200200441a0016a2002290358370200200441d0016a2013290300370200200441c8016a2014290300370200200441c0016a2015290300370200200441d8016a2011290300370200200441f8016a201f290300370200200441f0016a201e290300370200200441e8016a201d290300370200200441e0016a200229033837020020044194026a206836020020044190026a20693602002004418c026a206a36020020044188026a205e36020020044184026a205d36020020044180026a205c3602002002200841016a2208360230200b210c20092003470d000b0b20002002290328370200200041086a200241286a41086a2802003602000c030b1033000b1034000b2000410036020002402008450d00200620084198026c6a21012006210b03400240200b41d8006a280200450d00200b28025410260b0240200b41186a280200220a450d00200b2802102104200a410474210a03400240200441046a280200450d00200428020010260b200441106a2104200a41706a220a0d000b0b0240200b41146a28020041ffffffff0071450d00200b28021010260b0240200b28021c2204450d00200b41206a280200450d00200410260b0240200b4184026a2802002204450d00200441c1006c450d00200b2802800210260b200b4198026a2104200b4190026a4100360200200b28028c02210a200b410136028c020240200b4194026a280200450d00200a10260b2004210b20042001470d000b0b200228022c2204450d0020044198026c450d00200610260b200241e00a6a24000bd60301087f230041d0016b2202240041002103200241003a00482001280204417f6a210402400240024003402004417f460d01200241086a20036a200128020022052d00003a0000200120043602042001200541016a3602002002200341016a22053a00482004417f6a210420052103200541c000470d000b200241d0006a41086a2204200241086a41086a290300370300200241d0006a41106a2201200241086a41106a290300370300200241d0006a41186a2203200241086a41186a290300370300200241d0006a41206a2206200241086a41206a290300370300200241d0006a41286a2207200241086a41286a290300370300200241d0006a41306a2208200241086a41306a290300370300200241d0006a41386a2209200241086a41386a29030037030020022002290308370350200541ff017141c000490d0120002002290350370001200041003a0000200041396a2009290300370000200041316a2008290300370000200041296a2007290300370000200041216a2006290300370000200041196a2003290300370000200041116a2001290300370000200041096a20042903003700000c020b200041013a0000200341ff0171450d01200241003a00480c010b200041013a00000b200241d0016a24000be90502097f017e230041306b22022400200241086a2001108f01024002402002280208450d00200041003602000c010b41042103024002400240200228020c220420012802044104762205200520044b1b22054104742206417f4c0d0002402005450d00200610242203450d020b4100210620024100360218200220053602142002200336021002402004450d00034020012802042207450d04200128020022082d0000210520012007417f6a3602042001200841016a360200200541024b0d044100210802400240024020050e03020001020b410121080c010b410221080b20022001108f0120022802000d042001280204220720022802042205490d042005417f4c0d020240024020050d00410021094101210a0c010b2005102a220a450d0420012802042107200521090b0240024020072005490d00200a2001280200200510cf0621072001280204220a20054f0d012005200a41b8afc0001048000b2009450d05200a10260c050b2001200a20056b3602042001200128020020056a3602002007450d042005ad4220862009ad84200b20071b210b200241266a41026a2002412d6a41026a2d000022053a0000200241226a41026a220a20053a0000200220022f002d22053b0126200220053b0122024020062002280214470d00200241106a2006410110cf0120022802102103200228021821060b200320064104746a220520083a000c2005200b37020420052007360200200520022f01223b000d2005410f6a200a2d00003a00002002200641016a22063602182004417f6a22040d000b0b20002002290310370200200041086a200241106a41086a2802003602000c030b1034000b1033000b200241266a41026a2002412a6a41026a2d00003a0000200220022f012a3b01262000410036020002402006450d00200641047421052003210103400240200141046a280200450d00200128020010260b200141106a2101200541706a22050d000b0b200228021441ffffffff0071450d00200310260b200241306a24000bf10401037f230041e0006b22032400024002400240024002402002417f4c0d000240024020020d0041012104410021050c010b200210242204450d02200221050b20034100360210200320043602082003200536020c200341086a4100200210c90120032802082204200328021022056a2001200210cf061a2003200520026a220236021020032002360218200241818080204f0d0220032002410374220136021c20024180808020460d03024002400240200241014b0d004100210120020e020201020b200141786a41037641016a21010c010b410121010b200320013602202003200420016a220136022420012004490d042000200328020c36020820002002410674220236020420002004410120021b360200200341e0006a24000f0b1034000b1033000b200341346a4101360200200341d4006a410236020020034202370244200341e4f5c600360240200341e0f5c6003602302003410136022c2003200341286a3602502003200341186a360228200341c0006a41ecc0c700103d000b200341346a4101360200200341d4006a410236020020034202370244200341ac86c40036024020034198f4c6003602302003410136022c2003200341286a36025020032003411c6a360228200341c0006a41ecc0c700103d000b200341c0006a41146a410c360200200341c0006a410c6a410d360200200341286a41146a4103360200200341286a410c6a4103360200200341d486c4003602302003410336022c200341bc86c4003602282003410c3602442003200436025c2003200341c0006a3602382003200341246a3602502003200341206a3602482003200341dc006a360240200341286a41ecc0c700103d000ba20201027f230041306b220224002002200136020002400240200141ffffffff014b0d000240200041086a280200220341ffffffff01712003470d00200220034103742203360204200320014f0d022002412c6a41013602002002411c6a41023602002002420237020c200241acf4c600360208200241013602242002200241206a3602182002200241046a36022820022002360220200241086a41ecc0c700103d000b41eef3c60041184188f4c6001053000b2002412c6a41013602002002411c6a41023602002002420237020c2002419cf4c60036020820024198f4c600360228200241013602242002200241206a36021820022002360220200241086a41ecc0c700103d000b20002000280204410771200141037472360204200241306a24000be20103017f017e017f02400240200041046a280200220320016b20024f0d0002400240200120026a22022001490d00200341017422012002200120024b1b22014104200141044b1bad4298027e2204422088a722020d002004a722014100480d0020024541037421050240024002402000280200410020031b22020d0020010d01200521020c040b20034198026c22032001460d03024020030d0020010d01410821020c040b20022003200110282202450d010c030b2001102422020d020b20050d030b102e000b20002002360200200041046a20014198026e3602000b0f0b102c000bb20403037f017e057f230041206b22022400200241086a2001108f01024002402002280208450d00200041003602000c010b024002400240200228020c22032001280204410c6e2204200420034b1bad420c7e2205422088a70d002005a72204417f4c0d000240024020040d00410421060c010b200410242206450d020b41002107200241003602182002200636021020022004410c6e36021402402003450d00034020022001108f0120022802000d042001280204220820022802042204490d042004417f4c0d020240024020040d00410021094101210a0c010b2004102a220a450d0420012802042108200421090b0240024020082004490d00200a2001280200200410cf0621082001280204220a20044f0d012004200a41b8afc0001048000b2009450d05200a10260c050b2001200a20046b3602042001200128020020046a3602002008450d042004ad4220862009ad842105024020072002280214470d00200241106a2007410110cb0120022802102106200228021821070b20062007410c6c6a22042005370204200420083602002002200741016a22073602182003417f6a22030d000b0b20002002290310370200200041086a200241106a41086a2802003602000c030b1034000b1033000b2000410036020002402007450d002007410c6c21012006210403400240200441046a280200450d00200428020010260b2004410c6a2104200141746a22010d000b0b20022802142204450d002004410c6c450d00200610260b200241206a24000b850302067f017e230041106b22022400200241086a2001108f01024002402002280208450d00200041003602000c010b024020012802042203200228020c4102742204490d0002400240024002402004417f4c0d000240024020040d0041002105410121060c010b2004102a2206450d0220012802042103200421050b0240024020032004490d0020062001280200200410cf0621032001280204220720044f0d012004200741b8afc0001048000b2005450d05200610260c050b2001200720046b3602042001200128020020046a3602002003450d0402402004ad4220862005ad842208422088a722010d002008a721010c030b024020034103710d0020014103710d002008a722014103710d0020014102762204450d032008422288a721050c040b02402008a7450d00200310260b200041003602000c050b1034000b1033000b4100210502402001450d00200310260b41002104410421060b2000200436020420002006360200200041086a20053602000c010b200041003602000b200241106a24000b870604037f017e087f027e23004180026b2202240020022001108f01024002402002280200450d00200041003602000c010b0240024020022802042203200128020441246e2204200420034b1bad42247e2205422088a70d002005a72204417f4c0d0002400240024020040d00410421060c010b200410242206450d010b4100210720024100360210200220063602082002200441246e36020c02402003450d00410021080340200128020422094104490d04200841016a21082001280200220a280000210b20012009417c6a220c3602042001200a41046a36020041002104200241003a00b8012009417b6a2109024002400340200c2004460d0120024198016a20046a200a20046a220d41046a2d00003a0000200120093602042001200d41056a3602002002200441016a220d3a00b8012009417f6a2109200d2104200d4120460d020c000b0b200441ff0171450d05200241003a00b8010c050b200241c0016a41086a220420024198016a41086a290300370300200241c0016a41106a220920024198016a41106a290300370300200241c0016a41186a220a20024198016a41186a29030037030020022002290398013703c001200d41ff0171411f4d0d04200241386a41086a20042903002205370300200241386a41106a2009290300220e370300200241386a41186a200a290300220f370300200241186a41186a2209200f370300200241186a41106a220d200e370300200241186a41086a220a2005370300200220022903c0012205370358200220053703382002200537031802402007200228020c470d00200241086a200710e40120022802082106200228021021070b2006200741246c6a2204200b360200200420022903183702042004410c6a200a290300370200200441146a200d2903003702002004411c6a20092903003702002002200741016a220736021020082003470d000b0b20002002290308370200200041086a200241086a41086a2802003602000c030b1033000b1034000b20004100360200200228020c2204450d00200441246c450d00200610260b20024180026a24000bda0103027f017e017f02400240200041046a2802002001470d0002400240200141016a22022001490d00200141017422032002200320024b1b22024104200241044b1bad42247e2204422088a722030d002004a722024100480d0020034541027421050240024002402000280200410020011b22030d0020020d01200521030c040b200141246c22012002460d03024020010d0020020d01410421030c040b20032001200210282203450d010c030b2002102422030d020b20050d030b102e000b20002003360200200041046a200241246e3602000b0f0b102c000b880602097f037e23004180026b2202240020022001108f0102400240024002402002280200450d00200041003602000c010b2002280204220320012802044105762204200420034b1b22044105742205417f4c0d010240024020040d00410121060c010b200510242206450d030b41002107200241003602102002200436020c200220063602080240024002402003450d0041002108034041002105200241003a00b801200841016a21082001280204417f6a210403402004417f460d0320024198016a20056a200128020022092d00003a0000200120043602042001200941016a3602002002200541016a22093a00b8012004417f6a21042009210520094120470d000b200241c0016a41086a220420024198016a41086a290300370300200241c0016a41106a220520024198016a41106a290300370300200241c0016a41186a220a20024198016a41186a29030037030020022002290398013703c001200941ff0171411f4d0d03200241386a41086a2004290300220b370300200241386a41106a2005290300220c370300200241386a41186a200a290300220d370300200241186a41186a2205200d370300200241186a41106a2209200c370300200241186a41086a220a200b370300200220022903c001220b3703582002200b3703382002200b37031802402007200228020c470d00200241086a2007410110930120022802082106200228021021070b200620074105746a22042002290318370000200441186a2005290300370000200441106a2009290300370000200441086a200a2903003700002002200741016a220736021020082003470d000b0b20002002290308370200200041086a200241086a41086a2802003602000c020b200541ff0171450d00200241003a00b8010b200241386a41086a200241d8006a41086a290300370300200241386a41106a200241d8006a41106a290300370300200241386a41186a200241d8006a41186a2903003703002002200229035837033820004100360200200228020c41ffffff3f71450d00200610260b20024180026a24000f0b1034000b1033000bd30201077f230041206b22022400200241086a2001108f0102400240024002402002280208450d00200041003602000c010b200228020c220320012802044102762204200420034b1b22054102742204417f4c0d010240024020050d00410421060c010b200410242206450d030b4100210420024100360218200220053602142002200636021002402003450d00034002402001280204220541044f0d0020004100360200200228021441ffffffff0371450d03200610260c030b20012802002207280000210820012005417c6a3602042001200741046a360200024020042002280214470d00200241106a2004410110e70120022802102106200228021821040b200620044102746a20083602002002200441016a22043602182003417f6a22030d000b0b20002002290310370200200041086a200241106a41086a2802003602000b200241206a24000f0b1034000b1033000be10101027f02400240200041046a280200220320016b20024f0d0002400240200120026a22022001490d00200341017422012002200120024b1b22014104200141044b1b220141ffffffff037122042001470d00200141027422024100480d00200420014641027421040240024002402000280200410020031b22010d0020020d01200421010c040b200341027422032002460d03024020030d0020020d01410421010c040b20012003200210282201450d010c030b2002102422010d020b20040d030b102e000b20002001360200200041046a20024102763602000b0f0b102c000bdf0103017f017e017f02400240200041046a280200220320016b20024f0d0002400240200120026a22022001490d00200341017422012002200120024b1b22014104200141044b1bad422c7e2204422088a722020d002004a722014100480d0020024541027421050240024002402000280200410020031b22020d0020010d01200521020c040b2003412c6c22032001460d03024020030d0020010d01410421020c040b20022003200110282202450d010c030b2001102422020d020b20050d030b102e000b20002002360200200041046a2001412c6e3602000b0f0b102c000bda0103027f017e017f02400240200041046a2802002001470d0002400240200141016a22022001490d00200141017422032002200320024b1b22024104200241044b1bad42287e2204422088a722030d002004a722024100480d0020034541037421050240024002402000280200410020011b22030d0020020d01200521030c040b200141286c22012002460d03024020010d0020020d01410821030c040b20032001200210282203450d010c030b2002102422030d020b20050d030b102e000b20002003360200200041046a200241286e3602000b0f0b102c000bda0103027f017e017f02400240200041046a2802002001470d0002400240200141016a22022001490d00200141017422032002200320024b1b22024104200241044b1bad42307e2204422088a722030d002004a722024100480d0020034541037421050240024002402000280200410020011b22030d0020020d01200521030c040b200141306c22012002460d03024020010d0020020d01410821030c040b20032001200210282203450d010c030b2002102422030d020b20050d030b102e000b20002003360200200041046a200241306e3602000b0f0b102c000be20103017f017e017f02400240200041046a280200220320016b20024f0d0002400240200120026a22022001490d00200341017422012002200120024b1b22014104200141044b1bad42c4007e2204422088a722020d002004a722014100480d0020024541027421050240024002402000280200410020031b22020d0020010d01200521020c040b200341c4006c22032001460d03024020030d0020010d01410421020c040b20022003200110282202450d010c030b2001102422020d020b20050d030b102e000b20002002360200200041046a200141c4006e3602000b0f0b102c000bdc0101037f02400240200041046a2802002001470d0002400240200141016a22022001490d00200141017422032002200320024b1b22024104200241044b1b220241ffffffff017122042002470d00200241037422034100480d00200420024641027421040240024002402000280200410020011b22020d0020030d01200421020c040b200141037422012003460d03024020010d0020030d01410421020c040b20022001200310282202450d010c030b2003102422020d020b20040d030b102e000b20002002360200200041046a20034103763602000b0f0b102c000bdb0101037f02400240200041046a2802002001470d0002400240200141016a22022001490d00200141017422032002200320024b1b22024104200241044b1b220241ffffff3f7122042002470d00200241057422034100480d00200420024641037421040240024002402000280200410020011b22020d0020030d01200421020c040b200141057422012003460d03024020010d0020030d01410821020c040b20022001200310282202450d010c030b2003102422020d020b20040d030b102e000b20002002360200200041046a20034105763602000b0f0b102c000bda0103027f017e017f02400240200041046a2802002001470d0002400240200141016a22022001490d00200141017422032002200320024b1b22024104200241044b1bad422c7e2204422088a722030d002004a722024100480d0020034541027421050240024002402000280200410020011b22030d0020020d01200521030c040b2001412c6c22012002460d03024020010d0020020d01410421030c040b20032001200210282203450d010c030b2002102422030d020b20050d030b102e000b20002003360200200041046a2002412c6e3602000b0f0b102c000be20103017f017e017f02400240200041046a280200220320016b20024f0d0002400240200120026a22022001490d00200341017422012002200120024b1b22014104200141044b1bad42c8007e2204422088a722020d002004a722014100480d0020024541027421050240024002402000280200410020031b22020d0020010d01200521020c040b200341c8006c22032001460d03024020030d0020010d01410421020c040b20022003200110282202450d010c030b2001102422020d020b20050d030b102e000b20002002360200200041046a200141c8006e3602000b0f0b102c000bdf0103017f017e017f02400240200041046a280200220320016b20024f0d0002400240200120026a22022001490d00200341017422012002200120024b1b22014104200141044b1bad42187e2204422088a722020d002004a722014100480d0020024541027421050240024002402000280200410020031b22020d0020010d01200521020c040b200341186c22032001460d03024020030d0020010d01410421020c040b20022003200110282202450d010c030b2001102422020d020b20050d030b102e000b20002002360200200041046a200141186e3602000b0f0b102c000bdc0101037f02400240200041046a2802002001470d0002400240200141016a22022001490d00200141017422032002200320024b1b22024104200241044b1b220241ffffffff037122042002470d00200241027422034100480d00200420024641027421040240024002402000280200410020011b22020d0020030d01200421020c040b200141027422012003460d03024020010d0020030d01410421020c040b20022001200310282202450d010c030b2003102422020d020b20040d030b102e000b20002002360200200041046a20034102763602000b0f0b102c000bdb0101037f02400240200041046a2802002001470d0002400240200141016a22022001490d00200141017422032002200320024b1b22024104200241044b1b220241ffffff1f7122042002470d00200241067422034100480d00200420024641037421040240024002402000280200410020011b22020d0020030d01200421020c040b200141067422012003460d03024020010d0020030d01410821020c040b20022001200310282202450d010c030b2003102422020d020b20040d030b102e000b20002002360200200041046a20034106763602000b0f0b102c000bd70103027f017e017f02400240200041046a2802002001470d0002400240200141016a22022001490d00200141017422032002200320024b1b22024104200241044b1bad42217e2204422088a722030d002004a722024100480d0020034521050240024002402000280200410020011b22030d0020020d01200521030c040b200141216c22012002460d03024020010d0020020d01410121030c040b20032001200210282203450d010c030b2002102422030d020b20050d030b102e000b20002003360200200041046a200241216e3602000b0f0b102c000bdf0103017f017e017f02400240200041046a280200220320016b20024f0d0002400240200120026a22022001490d00200341017422012002200120024b1b22014104200141044b1bad42c0017e2204422088a722020d002004a722014100480d0020024521050240024002402000280200410020031b22020d0020010d01200521020c040b200341c0016c22032001460d03024020030d0020010d01410121020c040b20022003200110282202450d010c030b2001102422020d020b20050d030b102e000b20002002360200200041046a200141c0016e3602000b0f0b102c000bdf0103017f017e017f02400240200041046a280200220320016b20024f0d0002400240200120026a22022001490d00200341017422012002200120024b1b22014104200141044b1bad42187e2204422088a722020d002004a722014100480d0020024541037421050240024002402000280200410020031b22020d0020010d01200521020c040b200341186c22032001460d03024020030d0020010d01410821020c040b20022003200110282202450d010c030b2001102422020d020b20050d030b102e000b20002002360200200041046a200141186e3602000b0f0b102c000bd80101037f02400240200041046a2802002001470d0002400240200141016a22022001490d00200141017422032002200320024b1b22024104200241044b1b220241ffffff3f7122042002470d00200241057422034100480d00200420024621040240024002402000280200410020011b22020d0020030d01200421020c040b200141057422012003460d03024020010d0020030d01410121020c040b20022001200310282202450d010c030b2003102422020d020b20040d030b102e000b20002002360200200041046a20034105763602000b0f0b102c000bdd0103027f017e017f02400240200041046a2802002001470d0002400240200141016a22022001490d00200141017422032002200320024b1b22024104200241044b1bad42c4007e2204422088a722030d002004a722024100480d0020034541027421050240024002402000280200410020011b22030d0020020d01200521030c040b200141c4006c22012002460d03024020010d0020020d01410421030c040b20032001200210282203450d010c030b2002102422030d020b20050d030b102e000b20002003360200200041046a200241c4006e3602000b0f0b102c000b130020004100360204200041d4c0c7003602000b130020004105360204200041d4b3c0003602000bdd5808067f017e087f017e047f047e097f077e230041e0026b2201240020014198016a41186a2202420037030020014198016a41106a2203420037030020014198016a41086a220442003703002001420037039801200141e0016a41eb8cc700410a10fb012004200141e0016a41086a2205290000370300200120012900e00137039801200141e0016a41d4e6c600410910fb0120022005290000370300200320012900e001370300200141e0016a20014198016a10fc01024020012802e0012206450d000240024020012902e4012207422088a722040d0041002108200621090c010b200641046a21092006280200210a410121080b200141e0016a41186a220b4200370300200141e0016a41106a220c4200370300200141e0016a41086a220d4200370300200142003703e001200141b8016a41818dc700410910fb01200d200141b8016a41086a220e290000370300200120012900b8013703e001200141b8016a41acd6c000410610fb01200b200e290000370300200c20012900b801370300200141b8016a200141e0016a10fd0120012802b8012202410420021b210f024020012902bc01420020021b2210422088a72202450d00200620044102746a2111200f2002412c6c6a2112200f2102034020022802002113200b2002411c6a290200370300200c200241146a290200370300200d2002410c6a290200370300200120022902043703e001200241246a28020022044103460d01200241286a2802002114200141386a41186a200b2903002215370300200141386a41106a200c2903002216370300200141386a41086a200d2903002217370300200120012903e0012218370338200141f8006a41186a22192015370300200141f8006a41106a221a2016370300200141f8006a41086a221b20173703002001201837037802400240024002400240024020084101470d00200a2013460d010b20044101470d0320014198016a41186a2204201929030037030020014198016a41106a221c201a29030037030020014198016a41086a221a201b2903003703002001200129037837039801201441024b0d03200b4200370300200c4200370300200d4200370300200142003703e001200141b8016a41818dc700410910fb01200d200e290000370300200120012900b8013703e001200141b8016a4190d8c000410a10fb01200c41086a221d200e290000370000200c20012900b801370000200141b8016a200141e0016a10fe0120012802b801221e0d014100211920014100360260200142043703584104211e0c020b024020092011470d0041002108201121090c030b2009280200210a41012108200941046a21090c020b200120012902bc01221537025c2001201e3602582015422088a721190b200141b8016a41186a221f2004290300370300200141b8016a41106a2220201c290300370300200e201a29030037030020012001290398013703b8010240024020194103490d004103211c2001410336026020194103460d01201e41246a21042019410c6c415c6a211903400240200441046a280200221a450d00201a41246c450d00200428020010260b2004410c6a2104201941746a22190d000c020b0b200141d8006a2019410320196b222110cb012001280258221e2001280260221c410c6c6a21040240024020214102490d002019417e6a21190340200141003602e801200142043703e001200141e0016a4100410010d101200441086a20012802e801360200200420012903e0013702002004410c6a2104201941016a221a201949211b201a2119201b450d000b2021201c6a417f6a211c2021450d010b2004420437020020044100360208201c41016a211c0b2001201c3602600b201c20144d0d01200b201f290300370300200c2020290300370300200d200e290300370300200120012903b8013703e001201e2014410c6c6a220441086a211902402004280208221a200441046a280200470d002004201a410110d1012019280200211a0b2004280200201a41246c6a220420012903e001370204200420133602002004410c6a200d290300370200200441146a200c2903003702002004411c6a200b2903003702002019201928020041016a360200200141e8006a41086a200141d8006a41086a280200360200200120012903582215370368200b4200370300200c4200370300200d4200370300200142003703e001200141b8016a41818dc700410910fb01200d200e290000370300200120012900b8013703e001200141b8016a4190d8c000410a10fb01201d200e290000370000200c20012900b80137000002402015a7221b0d00200141e0016a412010ff010c010b200141e0016a200141e8006a108002024020012802702204450d002004410c6c2119201b210403400240200441046a280200221a450d00201a41246c450d00200428020010260b2004410c6a2104201941746a22190d000b0b200128026c2204450d002004410c6c450d00201b10260b2002412c6a22022012470d010c020b0b2014201c41c4b6c0001032000b02402010a72202450d002002412c6c450d00200f10260b200742ffffffff0383500d00200610260b200141e0016a41186a22024200370300200141e0016a41106a2204420037030020054200370300200142003703e001200141b8016a41f58cc700410c10fb012005200141b8016a41086a2219290000370300200120012900b8013703e001200141b8016a41d4e6c600410910fb0120022019290000370300200420012900b801370300200141e0016a412010ff01200242003703002004420037030020054200370300200142003703e001200141b8016a41eb8cc700410a10fb0120052019290000370300200120012900b8013703e001200141b8016a41d4e6c600410910fb0120022019290000370300200420012900b801370300200141306a200141e0016a412041d4c0c7004100410010810202400240024002400240024020012802304101470d00200141f8016a22024200370300200141f0016a220d4200370300200141e0016a41086a22044200370300200142003703e00120014198016a41aed3c500410f10fb01200420014198016a41086a221929000037030020012001290098013703e00120014198016a41bdd3c500410d10fb0120022019290000370300200d2001290098013703002001412036025c2001200141e0016a360258200141f8006a200141e0016a412010820202400240200128027822020d00410221040c010b200128027c211b2001200141f8006a41086a280200220436023c200120023602380240024020044104490d00200228000021192001200241046a36023820012004417c6a220c36023c200c4104490d002002280004210c2001200441786a36023c2001200241086a360238200141b8016a200141386a108e0120012802b801221a450d0020012902bc01211541002104200141003a00980102400240200128023c2213450d00200128023822092d0000210b20012013417f6a220836023c2001200941016a3602380240200b4101460d000c040b200841044f0d010b0c020b2009280001210b20012013417b6a36023c2001200941056a360238410121040c010b200141003602a00120014201370398012001410e36026c2001200141d8006a360268200120014198016a3602dc01200141cc016a4101360200200142013702bc012001418c8dc6003602b8012001200141e8006a3602c801200141dc016a41c4e1c000200141b8016a10351a20012802980120012802a0011084020240200128029c01450d0020012802980110260b410221040b201b450d00200210260b024020044102460d00200141d0016a200b360200200141c4016a2015370200200120043602cc012001201a3602c0012001200c3602bc01200120193602b801200141c0016a211a024020192000470d00024020044101460d00200141e0016a201a10c701200141a8016a200c36020020014198016a410c6a200141e0016a41086a22022802003602002001410036029801200120012903e00137029c01200141e0016a20014198016a10850220014183016a2002280200360000200120012903e00137007b200141e0016a410c6a200141ff006a290000370000200141c6a4b9da043600e101200141023a00e001200120012900783700e501200141e0016a10860220014198016a41086a2802002202450d01200241286c450d01200128029c0110260c010b200141e0016a201a10c701200141ac016a200c36020020014198016a41086a20012903e001370300200141a8016a200141e0016a41086a22022802003602002001200b36029c012001410136029801200141e0016a20014198016a10850220014183016a2002280200360000200120012903e00137007b200141e0016a410c6a200141ff006a290000370000200141c6a4b9da043600e101200141023a00e001200120012900783700e501200141e0016a10860220014198016a410c6a2802002202450d00200241286c450d0020012802a00110260b024020012802bc0120012802b8016a2000470d00200141c8016a28020041286c4105722202417f4c0d03200210242204450d04200141003602e801200120023602e401200120043602e001200141013a009801200141e0016a41004101106d20012802e00120012802e80122026a20012d0098013a00002001200241016a3602e80120012802c0012102200141e0016a20012802c801220410a1010240024020040d0020012802e001211920012802e80121040c010b2002200441286c6a210c20012802e80121040340200141e0016a20044120106d20012802e00120012802e80122196a22042002290000370000200441086a200241086a290000370000200441106a200241106a290000370000200441186a200241186a2900003700002001201941206a22043602e801200241206a2903002115200141e0016a20044108106d20012802e001221920012802e80122046a20153700002001200441086a22043602e801200c200241286a2202470d000b0b41cad3c50041142019200410b301024020012802e401450d00201910260b200141e0016a41086a2202201a290200370300200141f0016a2204201a41086a280200360200200141003602e401200141053a00e001200141e0016a108702200141f8016a42003703002004420037030020024200370300200142003703e00120014198016a41aed3c500410f10fb01200220014198016a41086a220429000037030020012001290098013703e00120014198016a41bdd3c500410d10fb01200d41086a2004290000370000200d200129009801370000200141e0016a412010ff010c010b20012802c4012202450d00200241286c450d0020012802c00110260b200141f8016a4200370300200141f0016a4200370300200141e0016a41086a22024200370300200142003703e00120014198016a41aed3c500410f10fb01200220014198016a41086a220429000037030020012001290098013703e00120014198016a41ded3c500410510fb01200d41086a2004290000370000200d2001290098013700002001412036023c2001200141e0016a360238200141f8006a200141e0016a412010820220012802782202450d05200141f8006a41086a2802002119200128027c210c41002104200141003a0098010240024002402019450d0020022d0000220b41034b0d00024002400240200b0e0405000102050b2019417f6a4108490d0220022900012115410121040c040b410221040c020b2019417f6a4108490d0020022900012115410321040c020b200141003602a00120014201370398012001410e36026c2001200141386a360268200120014198016a360258200141cc016a4101360200200142013702bc012001418c8dc6003602b8012001200141e8006a3602c801200141d8006a41c4e1c000200141b8016a10351a20012802980120012802a0011084020240200128029c01450d0020012802980110260b410421040b0b0240200c450d00200210260b2004417f6a220241024b0d0520020e03040503040b41bff4c400413141dcbcc700102f000b1034000b1033000b2015422088a7210202402015a722042000470d00200141043602b801200120023602bc01200141e0016a200141b8016a10850220014183016a200141e8016a280200360000200120012903e00137007b200141ec016a200141ff006a290000370000200141c6a4b9da043600e101200141023a00e001200120012900783700e501200141e0016a1086020b200220046a2000470d01200141f8016a4200370300200141f0016a4200370300200141e0016a41086a22024200370300200142003703e00120014198016a41aed3c500410f10fb01200220014198016a41086a220429000037030020012001290098013703e00120014198016a41ded3c500410510fb01200d41086a2004290000370000200d200129009801370000200141b8016a410020022002108802200141e0016a412020012802b801220220012802c00110b301024020012802bc01450d00200210260b200141023602e401200141053a00e001200141e0016a1087020c010b2015422088a7210202402015a722042000470d00200141033602b801200120023602bc01200141e0016a200141b8016a10850220014183016a200141e8016a280200360000200120012903e00137007b200141ec016a200141ff006a290000370000200141c6a4b9da043600e101200141023a00e001200120012900783700e501200141e0016a1086020b200220046a2000470d00200141f8016a4200370300200141f0016a4200370300200141e0016a41086a22024200370300200142003703e00120014198016a41aed3c500410f10fb01200220014198016a41086a220429000037030020012001290098013703e00120014198016a41ded3c500410510fb01200d41086a2004290000370000200d200129009801370000200141b8016a410220022002108802200141e0016a412020012802b801220220012802c00110b301024020012802bc01450d00200210260b200141013602e401200141053a00e001200141e0016a1087020b200141f8016a22024200370300200141f0016a22134200370300200141e0016a41086a22044200370300200142003703e001200141e0016a41bb8cc700410f10fb01200141b8016a41b1eec600410610fb012002200141b8016a41086a2219290000370300201320012900b801370300200141286a200141e0016a4120108902200128022c210802402001280228220c4101470d00200141e0016a412010ff010b200242003703002013420037030020044200370300200142003703e001200141e0016a41bb8cc700410f10fb01200141b8016a41e0fcc600410b10fb01201341086a2019290000370000201320012900b801370000024002400240200141e0016a108a02220241ff01714102460d0020024101710d010b410410242202450d0120024100360200200142818080801037029c012001200236029801200141f8016a22044200370300200141f0016a22194200370300200141e0016a41086a220d4200370300200142003703e001200141e0016a41bb8cc700410f10fb01200141b8016a41dfeec600410b10fb01201341086a220b200141b8016a41086a221a290000370000201320012900b801370000200141e0016a20014198016a108b0220021026410410242202450d0120024100360200200142818080801037029c0120012002360298012004420037030020194200370300200d4200370300200142003703e001200141e0016a41bb8cc700410f10fb01200141b8016a41eaeec600410c10fb01200b201a290000370000201320012900b801370000200141e0016a20014198016a108b02200210262004420037030020194200370300200d4200370300200142003703e001200141e0016a41bb8cc700410f10fb01200141b8016a41f6eec600410610fb01200b201a290000370000201320012900b801370000200141003602b801200141e0016a4120200141b8016a410410b3012004420037030020194200370300200d4200370300200142003703e001200141e0016a41bb8cc700410f10fb01200141b8016a41e0fcc600410b10fb01200b201a290000370000201320012900b801370000200141013a009801200141e0016a412020014198016a410110b3010b200141f8016a4200370300200141f0016a4200370300200141e0016a41086a4200370300200142003703e001200141e0016a41bb8cc700410f10fb01200141b8016a41dfeec600410b10fb01201341086a200141b8016a41086a290000370000201320012900b801370000200141b8016a200141e0016a108c020240024020012802b801220a0d004100210e20014100360240200142043703384104210a410021140c010b200120012902bc01221537023c2001200a3602382015422088a721142015a7210e0b200141f8016a4200370300200141f0016a4200370300200141e0016a41086a4200370300200142003703e001200141e0016a41bb8cc700410f10fb01200141b8016a41eaeec600410c10fb01201341086a200141b8016a41086a290000370000201320012900b801370000200141b8016a200141e0016a108c020240024020012802b801220d0d004100211a2001410036028001200142043703784104210d410021110c010b200120012902bc01221537027c2001200d3602782015422088a7211a2015a721110b02400240024002400240200c0d002014450d012014410274200a6a417c6a28020021080b201441002014419c7f6a22022002201441016a22054b1b2212490d0120014100360240200541e600490d03200a20124102746a2109200a211b0340201b280200210b02400240024002400240201a41014b0d0041002102201a0e020201020b41002102201a2104034020022004410176221920026a220c200b200d200c4102746a280200491b2102200420196b220441014b0d000b0b200b200d200241027422046a2802002219460d022002200b20194b6a21020c010b410021020b200120023602e00141b4efc600412e200141e0016a41e4efc60041f4efc6001036000b201a20024d0d03200d20046a2204200441046a201a2002417f736a41027410d0061a2001201a417f6a221a36028001201b41046a221b2009470d000c040b0b41fceec600412641a4efc6001053000b201220141040000b2002201a103e000b410021024100210b0240201420126b2204450d000240200541e600490d00200a200a20124102746a200441027410d0061a0b200120043602402004210b0b024002400240024002400240024002400240024002400240201a41014b0d00201a0e020201020b41002102201a2104034020022004410176221920026a220c2008200d200c4102746a280200491b2102200420196b220441014b0d000b0b201a20022008200d20024102746a2802004b6a2202490d010b0240201a2011470d00200141f8006a201110f1012001280278210d0b200d20024102746a220441046a2004201a20026b41027410d0061a200420083602002001201a41016a2202360280010240200b200e470d00200141386a200e10f1012001280240210b2001280238210a0b200a200b4102746a20083602002001200b41016a220b3602402002450d01200241017621042002410171450d02200220044d0d04200d20044102746a280200210d0c030b2002201a103b000b4184f0c60041c30041dcbcc700102f000b200220044d0d0220022004417f6a22194d0d03200d20194102746a280200200d20044102746a2802006a410176210d0b20014198016a41086a2202200141386a41086a2802003602002001200129033837039801200141f8016a22044200370300200141f0016a22194200370300200141e0016a41086a220c4200370300200142003703e001200141e0016a41bb8cc700410f10fb01200141b8016a41dfeec600410b10fb01201341086a221a200141b8016a41086a221b290000370000201320012900b801370000200141e0016a20014198016a108b020240200128029c0141ffffffff0371450d0020012802980110260b2002200141f8006a41086a28020036020020012001290378370398012004420037030020194200370300200c4200370300200142003703e001200141e0016a41bb8cc700410f10fb01200141b8016a41eaeec600410c10fb01201a201b290000370000201320012900b801370000200141e0016a20014198016a108b020240200128029c0141ffffffff0371450d0020012802980110260b200141e0016a41186a22194200370300200141e0016a41106a22024200370300200141e0016a41086a22044200370300200142003703e001200141e0016a41bb8cc700410f10fb01200141b8016a41f6eec600410610fb01201341086a200141b8016a41086a220c290000370000201320012900b8013700002001200d3602b801200141e0016a4120200141b8016a410410b3010240200b41e500470d0020014198016a41186a420037030020014198016a41106a420037030020014198016a41086a220d42003703002001420037039801200141e0016a41808cc700410610fb01200d2004290000370300200120012900e00137039801200141e0016a41ea93c400410610fb01200341086a2004290000370000200320012900e001370000200141206a20014198016a41201089020b201942003703002002420037030020044200370300200142003703e001200141b8016a41a28cc700410a10fb012004200c290000370300200120012900b8013703e001200141b8016a41dab8c500410610fb012019200c290000370300200220012900b801370300200141e0016a412010ff01201942003703002002420037030020044200370300200142003703e001200141b8016a41a28cc700410a10fb012004200c290000370300200120012900b8013703e001200141b8016a41b0cbc500410c10fb012019200c290000370300200220012900b801370300200141e0016a412010ff01201942003703002002420037030020044200370300200142003703e001200141b8016a41cca3c700411210fb012004200c290000370300200120012900b8013703e001200141b8016a41f4b1c500411110fb012019200c290000370300200220012900b801370300200141086a200141e0016a108d02200141086a41106a29030021222001290310212320012802082104200141e0016a4201420042808090bbbad6adf00d4200428094ebdc034200108e020240024020012802e0014101470d00427f2116427f21150c010b200141f0016a2903002115200141e8016a29030021160b200141b0016a420037030020014198016a41106a420037030020014198016a41086a220c42003703002001420037039801200141e0016a41808cc700410610fb01200c200141e0016a41086a2219290000370300200120012900e00137039801200141e0016a41b8bbc400410b10fb01200341086a2019290000370000200320012900e001370000200141e0016a20014198016a108f0220012903e801211720012903e0012118200141e0016a4203420042808090bbbad6adf00d420042a08d064200108e022017420020184201511b22104280b0def7d32b20104280b0def7d32b541b21070240024020012802e0014101470d00427f2117427f21180c010b200141e0016a41106a2903002118201929030021170b200141e0016a20074280ccf7fdf40a20074280ccf7fdf40a5622191b22244280ccf7fdf40a201020191b22107d42002024201054ad7d42808090bbbad6adf00d42004280b0def7d32b4200108e020240024020012802e0014101470d00427f2110427f21240c010b200141f0016a2903002124200141e8016a29030021100b200141e0016a201020242010202442808090bbbad6adf00d4200108e020240024020012802e0014101470d00427f2125427f21260c010b200141f0016a2903002126200141e8016a29030021250b200141e0016a201720182017201842808090bbbad6adf00d4200108e020240024020012802e0014101470d00427f2127427f21280c010b200141f0016a2903002128200141e8016a29030021270b200141e0016a2027202842808090bbbad6adf00d4200428080a0f6f4acdbe01b4200108e0220012802e0014101460d032016202342808090bbbad6adf00d20041b222754211920152022420020041b22225121042015202254210c200141f0016a220d2903002123200141e8016a220b2903002128200141e0016a201720182010202442808090bbbad6adf00d4200108e020240024020012802e0014101470d00427f2124427f21100c010b200d2903002110200b29030021240b2019200c20041b2104200141e0016a202820232025202642808090bbbad6adf00d4200108e020240024020012802e0014101470d00427f2123427f21250c010b200141f0016a2903002125200141e8016a29030021230b2022201520041b21172027201620041b211802400240200742ffcbf7fdf40a560d00200141e0016a4200202420237d22072007202456201020257d2024202354ad7d220720105620072010511b22041b4200200720041b2018201742808090bbbad6adf00d4200108e020240024020012802e0014101470d00427f2107427f21100c010b200141f0016a2903002110200141e8016a29030021070b4200201720107d2018200754ad7d2210201820077d2207201856201020175620102017511b22041b221720154200200720041b2218201656201720155620172015511b22041b21152018201620041b21160c010b427f2122200141e0016a427f202420237c220720072024542204201020257c2004ad7c220720105420072010511b22041b427f200720041b2018201742808090bbbad6adf00d4200108e020240024020012802e0014101470d00427f21070c010b200141f0016a2903002107200141e8016a29030021220b427f201720077c201820227c22072018542204ad7c22182004201820175420182017511b22041b22172015427f200720041b2218201656201720155620172015511b22041b21152018201620041b21160b200141f8016a220c4200370300200141e0016a41106a220d4200370300200141e0016a41086a22044200370300200142003703e001200141b8016a41cca3c700411210fb012004200141b8016a41086a2219290000370300200120012900b8013703e001200141b8016a41f4b1c500411110fb01200241086a2019290000370000200220012900b801370000200120153703c001200120163703b801200141e0016a4120200141b8016a411010b301200c4200370300200d420037030020044200370300200142003703e001200141b8016a418a8cc700410910fb0120042019290000370300200120012900b8013703e001200141b8016a41d4e6c600410910fb01200c2019290000370300200d20012900b801370300200141e0016a108a02220241ff01714102460d04200141e0016a412010ff012002410171450d04200141b8016a41186a22044200370300200141b8016a41106a22024200370300200141b8016a41086a22194200370300200142003703b801200141e0016a41868cc700410410fb012019200141e0016a41086a220c290000370300200120012900e0013703b801200141e0016a41e0fcc600410b10fb012004200c290000370300200220012900e001370300200141e0016a200141b8016a109002024020012d00e00122044102460d00200141b8016a412010ff01200141f8006a41086a200141e9016a290000370300200141f8006a41106a200141f1016a290000370300200141f8006a41186a200141f9016a290000370300200120012900e1013703780240200441037122044103460d0020040e03010001010b20014198016a41186a200141f8006a41186a29030037030020014198016a41106a200141f8006a41106a29030037030020014198016a41086a200141f8006a41086a2903003703002001200129037837039801200141b8016a41186a4200370300200141b8016a41106a4200370300200141b8016a41086a22044200370300200142003703b801200141e0016a41868cc700410410fb012004200141e0016a41086a2219290000370300200120012900e0013703b801200141e0016a41dca0c600410c10fb01200241086a2019290000370000200220012900e0013700002001200141b8016a412010890241002119200141e0016a2001280204410020012802001b220d109102200141b8016a20012802e001220b20012802e8011092020240024020012802b801220c0d0020014100360240200142013703384101210c410021040c010b200120012902bc01221537023c2001200c3602382015422088a721042015a721190b024020012802e401450d00200b10260b024002402004418002490d00412010242204450d082004200129039801370000200441186a20014198016a41186a290300370000200441106a20014198016a41106a290300370000200441086a20014198016a41086a29030037000020014281808080103702bc01200120043602b801200141e0016a200d41016a220b10910220012802e001210d200120012802e80136026c2001200d360268200141b8016a200141e8006a10b201024020012802e401450d00200d10260b20041026200141b8016a41186a4200370300200141b8016a41106a4200370300200141b8016a41086a22044200370300200142003703b801200141e0016a41868cc700410410fb012004200141e0016a41086a220d290000370300200120012900e0013703b801200141e0016a41dca0c600410c10fb01200241086a200d290000370000200220012900e0013700002001200b3602e001200141b8016a4120200141e0016a410410b3010c010b200141e0016a41186a220b20014198016a41186a290300370300200141e0016a41106a221a20014198016a41106a290300370300200141e0016a41086a221b20014198016a41086a29030037030020012001290398013703e001024020042019470d00200141386a200410f6012001280238210c200128024021040b200c20044105746a221920012903e001370000201941186a200b290300370000201941106a201a290300370000201941086a201b2903003700002001200441016a360240200141e0016a200d10910220012802e0012104200120012802e8013602bc01200120043602b801200141386a200141b8016a10b201024020012802e401450d00200410260b200128023c21190b201941ffffff3f71450d00200c10260b200141d0016a4200370300200141c8016a4200370300200141b8016a41086a22044200370300200142003703b801200141e0016a41868cc700410410fb012004200141e0016a41086a2219290000370300200120012900e0013703b801200141e0016a41838dc600410810fb01200241086a2019290000370000200220012900e001370000200141b8016a412010ff01200141e0026a24000f0b2004200241c8f0c6001032000b2004200241d8f0c6001032000b2019200241e8f0c6001032000b109302000b4194f4c400412b41dcbcc700102f000b102c000b2c0020002002ad4220862001ad8410122201290000370000200041086a200141086a290000370000200110260bb30201027f230041e0006b220224002002412036020c20022001360208200241106a2001412010820202400240200228021022010d00200041003602000c010b200228021421032002200241106a41086a28020036022420022001360220200241c8006a200241206a10e6010240024020022802480d0020024100360230200242013703282002410e36023c2002200241086a3602382002200241286a360244200241dc006a41013602002002420137024c2002418c8dc6003602482002200241386a360258200241c4006a41c4e1c000200241c8006a10351a200228022820022802301084020240200228022c450d00200228022810260b200041003602000c010b20002002290348370200200041086a200241c8006a41086a2802003602000b2003450d00200110260b200241e0006a24000bd60a04047f017e0e7f027e23004180036b220224002002412036020c20022001360208200241106a2001412010820202400240200228021022030d00200041003602000c010b200228021421042002200241186a280200360224200220033602202002200241206a108f010240024020022802000d00024002400240200228020422052002280224412c6e2201200120054b1bad422c7e2206422088a70d002006a72201417f4c0d000240024020010d00410421070c010b200110242207450d020b41002108200241003602302002200736022820022001412c6e36022c02402005450d004100210903402002280224220a4104490d042002280220220b280000210c2002200a417c6a220d3602242002200b41046a2201360220200d450d0420012d0000210d2002200a417b6a220e3602242002200141016a360220200d41014b0d044102210f02400240200d0e020100010b41002101200241003a00b802417a210f0240024002400340200e2001460d0120024198026a20016a200b20016a220d41056a2d00003a00002002200a200f6a3602242002200d41066a3602202002200141016a220d3a00b802200f417f6a210f200d2101200d4120470d000b200241e0026a41186a220120024198026a41186a290300370300200241e0026a41106a221020024198026a41106a290300370300200241e0026a41086a221120024198026a41086a29030037030020022002290398023703e002200d41ff01714120490d08200241f8016a41086a22122011290300370300200241f8016a41106a22112010290300370300200241f8016a41186a22132001290300370300200220022903e0023703f801200e200d460d08200b200d6a220b41056a2d000021012002200a200f6a220e3602242002200b41066a2214360220200141014b0d084100210f20010e020201020b200141ff0171450d07200241003a00b8020c070b200e4104490d06201428000021102002200a200d6b41766a3602242002200b410a6a3602204101210f0b200241b8016a41086a2012290300220637030020024198016a41186a201329030037030020024198016a41106a201129030037030020024198016a41086a2006370300200220022903f80122063703b80120022006370398010b200941016a2109200241d8006a41086a20024198016a41086a2903002206370300200241d8006a41106a20024198016a41106a2903002215370300200241d8006a41186a20024198016a41186a2903002216370300200241386a41086a220d2006370300200241386a41106a220a2015370300200241386a41186a220b2016370300200220022903980122063703582002200637033802402008200228022c470d00200241286a2008410110e80120022802282107200228023021080b20072008412c6c6a2201200c36020020012002290338370204200b2903002106200a2903002115200d2903002116200141286a2010360200200141246a200f3602002001410c6a2016370200200141146a20153702002001411c6a20063702002002200841016a220836023020092005470d000b0b2007450d032000200229022c370204200020073602000c040b1034000b1033000b200228022c2201450d002001412c6c450d00200710260b200241003602e802200242013703e0022002410e3602c4022002200241086a3602c0022002200241e0026a3602f801200241ac026a41013602002002420137029c022002418c8dc600360298022002200241c0026a3602a802200241f8016a41c4e1c00020024198026a10351a20022802e00220022802e802108402024020022802e402450d0020022802e00210260b200041003602000b2004450d00200310260b20024180036a24000bb30a04047f017e0c7f027e230041a0026b220224002002412036021c20022001360218200241206a2001412010820202400240200228022022030d00200041003602000c010b200228022421042002200241286a28020036023420022003360230200241106a200241306a108f010240024020022802100d000240024002400240200228021422052002280234410c6e2201200120054b1bad420c7e2206422088a70d002006a72201417f4c0d000240024020010d00410421070c010b200110242207450d020b200241003602402002200736023820022001410c6e36023c02400240024002402005450d0041002108410021090340200241086a200241306a108f0120022802080d08200228020c220a200228023441246e22012001200a4b1bad42247e2206422088a70d052006a72201417f4c0d050240024020010d004104210b0c010b20011024220b450d070b200241003602502002200b3602482002200141246e36024c0240200a450d004100210c4100210d03402002280234220e4104490d05200d41016a210d2002280230220f28000021102002200e417c6a22113602342002200f41046a36023041002101200241003a00d801200e417b6a210e034020112001460d05200241b8016a20016a200f20016a221241046a2d00003a00002002201241056a3602302002200141016a22123a00d8012002200e360234200e417f6a210e2012210120124120470d000b20024180026a41186a2201200241b8016a41186a29030037030020024180026a41106a220e200241b8016a41106a29030037030020024180026a41086a220f200241b8016a41086a290300370300200220022903b80137038002201241ff01714120490d05200241f8006a41086a200f2903002206370300200241f8006a41106a200e2903002213370300200241f8006a41186a20012903002214370300200241d8006a41186a220e2014370300200241d8006a41106a22122013370300200241d8006a41086a220f2006370300200220022903800222063703980120022006370378200220063703580240200c200228024c470d00200241c8006a200c410110d1012002280248210b2002280250210c0b200b200c41246c6a22012010360200200120022903583702042001410c6a200f290300370200200141146a20122903003702002001411c6a200e2903003702002002200c41016a220c360250200d200a470d000b0b200b450d08200941016a2109200229024c210602402008200228023c470d00200241386a2008410110cb0120022802382107200228024021080b20072008410c6c6a220120063702042001200b3602002002200841016a220836024020092005470d000b0b20070d020c070b200141ff0171450d00200241003a00d8010b200228024c2201450d04200141246c0d030c040b2000200229023c370204200020073602000c050b1034000b1033000b200b10260b02402008450d002008410c6c210e2007210103400240200141046a2802002212450d00201241246c450d00200128020010260b2001410c6a2101200e41746a220e0d000b0b200228023c2201450d002001410c6c450d00200710260b200241003602880220024201370380022002410e3602e4012002200241186a3602e001200220024180026a36029801200241cc016a4101360200200242013702bc012002418c8dc6003602b8012002200241e0016a3602c80120024198016a41c4e1c000200241b8016a10351a2002280280022002280288021084020240200228028402450d0020022802800210260b200041003602000b2004450d00200310260b200241a0026a24000b0e002001ad4220862000ad84101c0b800301067f230041106b220224000240024020012802082203410c6c41046a2204417f4c0d00200128020021050240024020040d0041012101410021040c010b200410242201450d020b2002410036020820022001360200200220043602042002200310a10102402003450d0020052003410c6c6a210603402005280200210420022005280208220310a1012005410c6a210502402003450d002004200341246c6a210720022802082103034020042802002101200220034104106d2002280200200228020822036a20013600002002200341046a2203360208200220034120106d2002280200200228020822016a2203200441046a290000370000200341086a2004410c6a290000370000200341106a200441146a290000370000200341186a2004411c6a2900003700002002200141206a2203360208200441246a22042007470d000b0b20052006470d000b0b2000412020022802002204200228020810b30102402002280204450d00200410260b200241106a24000f0b1034000b1033000b9d0102017f017e230041106b2206240002402002ad4220862001ad842004ad4220862003ad84200510202207422088a72204450d002007a722052d0000220341014b0d00410021010240024020030e020100010b2004417f6a4104490d0120052800012102410121010b200510262000200236020420002001360200200641106a24000f0b4196aec700412e200641086a41c4aec70041d4aec7001036000b130020002002ad4220862001ad84101e10c5060b930101047f230041106b22022400200028020421032000280200210041012104200128021841db9ec00041012001411c6a28020028020c1100002105200241003a000d200220053a000c200220013602080240200241086a2000200020036a10b10122012d00040d002001280200220128021841da9ec00041012001411c6a28020028020c11000021040b200241106a240020040b0e002001ad4220862000ad84100e0bdb0302037f017e20004201370200200041086a410036020002402001280200220241044b0d000240024002400240024020020e050001020304000b200041004101106d2000280200200041086a220228020022036a41013a00002002200341016a3602002000200141046a10a5010f0b200041004101106d2000280200200041086a220228020022036a41023a00002002200341016a220336020020012802042104200020034104106d2000280200200228020022036a20043600002002200341046a3602002000200141086a10a5010f0b200041004101106d2000280200200041086a220228020022036a41033a00002002200341016a2203360200200141086a2903002105200020034108106d2000280200200228020022006a20053700002002200041086a3602000f0b200041004101106d2000280200200041086a220228020022036a41043a00002002200341016a220336020020012802042101200020034104106d2000280200200228020022006a20013600002002200041046a3602000f0b200041004101106d2000280200200041086a220228020022036a41053a00002002200341016a220336020020012802042101200020034104106d2000280200200228020022006a20013600002002200041046a3602000b0b8e0301047f230041f0006b22012400200141086a41206a200041206a280200360200200141086a41186a200041186a290200370300200141086a41106a200041106a290200370300200141086a41086a2202200041086a29020037030020012000290200370308200141306a41186a22004200370300200141306a41106a22034200370300200141306a41086a420037030020014200370330200141306a41808cc700410610fb01200141e0006a41f093c400410610fb012000200141e0006a41086a220429000037030020032001290060370300200141d0006a200141086a10a2012004200141d0006a41086a28020036020020012001290350370360200141306a4120200141e0006a10e9030240024020012d0008220041044b0d0002400240024020000e050400010204040b200141146a280200450d03200141106a28020010260c030b200141146a280200450d02200141106a28020010260c020b200141146a280200450d01200141106a28020010260c010b2002280200450d00200128020c10260b200141f0006a24000bfc0a010d7f23004180026b22012400200141c0016a22024200370300200141b8016a22034200370300200141a8016a41086a22044200370300200142003703a801200141c8016a41808cc700410610fb012004200141c8016a41086a2205290000370300200120012900c8013703a801200141c8016a41ea93c400410610fb0120022005290000370300200320012900c801370300200141086a200141a8016a4120108902024002402001280208450d00200128020c450d00200141c0016a22064200370300200141b8016a22074200370300200141a8016a41086a22024200370300200142003703a801200141c8016a41808cc700410610fb012002200141c8016a41086a2204290000370300200120012900c8013703a801200141c8016a41fcbfc400410e10fb01200341086a22082004290000370000200320012900c801370000200141203602dc012001200141a8016a3602d801200141e0016a200141a8016a41201082020240024020012802e00122090d00410321050c010b20012802e401210a024002400240200141e0016a41086a280200220b450d0020092d0000220c41024b0d004101210502400240200c0e03000401000b200b417f6a4104490d012009280001210d410021050c030b410221050c010b200141003602d001200142013703c8012001410e3602f4012001200141d8016a3602f0012001200141c8016a3602fc01200141246a4101360200200142013702142001418c8dc6003602102001200141f0016a360220200141fc016a41c4e1c000200141106a10351a20012802c80120012802d001108402024020012802cc01450d0020012802c80110260b410321050b0b200a450d00200910260b200141003602b001200142013703a801200141a8016a4100410010930120014194016a200d36020020014102200520054103461b36029001200141106a200041800110cf061a200141a0016a220520012802b001360200200120012903a80137039801200642003703002007420037030020024200370300200142003703a801200141c8016a41808cc700410610fb0120022004290000370300200120012900c8013703a801200141c8016a418cbec400410a10fb0120082004290000370000200320012900c8013700002001200141a8016a412010890202402001280204410020012802001b220241016a22002002490d00200141c0016a220d4200370300200141b8016a22064200370300200141a8016a41086a22024200370300200142003703a801200141c8016a41808cc700410610fb012002200141c8016a41086a2204290000370300200120012900c8013703a801200141c8016a418cbec400410a10fb01200341086a22072004290000370000200320012900c801370000200120003602c801200141a8016a4120200141c8016a410410b301200d42003703002006420037030020024200370300200142003703a801200141c8016a41808cc700410610fb0120022004290000370300200120012900c8013703a801200141c8016a418e94c400410610fb0120072004290000370000200320012900c801370000200141003602e801200142013703e001200141106a4180016a200141e0016a10b504200141106a200141e0016a10b6042001280298012103200141e0016a2005280200220210a10102402002450d002002410574210203402001200141e0016a3602c8012003200141c8016a109c01200341206a2103200241606a22020d000b0b2004200141e0016a41086a280200360200200120012903e0013703c801200141a8016a4120200141c8016a10e903200141106a10b7042001419c016a28020041ffffff3f71450d0220012802980110260c020b200141106a10b7042001419c016a28020041ffffff3f71450d0120012802980110260c010b200010b7040b20014180026a24000bd70201017f20004201370200200041086a22044100360200024002400240024020010e0400010203000b200041004101106d2000280200200428020022006a41003a00002004200041016a3602000f0b200041004101106d2000280200200428020022016a41013a00002004200141016a2201360200200020014104106d2000280200200428020022016a20023600002004200141046a2201360200200020014104106d2000280200200428020022006a20033600002004200041046a3602000f0b200041004101106d2000280200200428020022006a41023a00002004200041016a3602000f0b200041004101106d2000280200200428020022016a41033a00002004200141016a2201360200200020014104106d2000280200200428020022016a20023600002004200141046a2201360200200020014104106d2000280200200428020022006a20033600002004200041046a3602000b840201037f230041d0006b220324002003200236020420032001360200200341086a2001200210820202400240200328020822040d00410021010c010b200328020c210502400240200341106a2802004104490d0020042800002102410121010c010b4100210120034100360220200342013703182003410e36022c200320033602282003200341186a360234200341cc006a41013602002003420137023c2003418c8dc6003602382003200341286a360248200341346a41c4e1c000200341386a10351a200328021820032802201084020240200328021c450d00200328021810260b0b2005450d00200410260b2000200236020420002001360200200341d0006a24000b890201047f230041d0006b220124002001412036020420012000360200200141086a2000412010820202400240200128020822020d00410221000c010b200128020c210302400240200141106a280200450d0020022d0000220441014b0d0041002100024020040e020200020b410121000c010b20014100360220200142013703182001410e36022c200120013602282001200141186a360234200141cc006a41013602002001420137023c2001418c8dc6003602382001200141286a360248200141346a41c4e1c000200141386a10351a200128021820012802201084020240200128021c450d00200128021810260b410221000b2003450d00200210260b200141d0006a240020000ba00301057f230041106b220224000240024020012802082203410274220441046a2205417f4c0d00200128020021010240024020050d0041012106410021050c010b200510242206450d020b2002410036020820022006360200200220053602040240024002400240200341c000490d00200341808001490d012003418080808004490d02200241004101106d2002280200200228020822056a41033a00002002200541016a2205360208200220054104106d2002280200200228020822056a2003360000200541046a21050c030b200241004101106d2002280200200228020822056a20034102743a0000200541016a21050c020b200241004102106d2002280200200228020822056a20034102744101723b0000200541026a21050c010b200241004104106d2002280200200228020822056a2004410272360000200541046a21050b20022005360208200220052004106d20022802002205200228020822036a2001200410cf061a2002200320046a2204360208200041202005200410b30102402002280204450d00200510260b200241106a24000f0b1034000b1033000bb30201027f230041e0006b220224002002412036020c20022001360208200241106a2001412010820202400240200228021022010d00200041003602000c010b200228021421032002200241106a41086a28020036022420022001360220200241c8006a200241206a10e2010240024020022802480d0020024100360230200242013703282002410e36023c2002200241086a3602382002200241286a360244200241dc006a41013602002002420137024c2002418c8dc6003602482002200241386a360258200241c4006a41c4e1c000200241c8006a10351a200228022820022802301084020240200228022c450d00200228022810260b200041003602000c010b20002002290348370200200041086a200241c8006a41086a2802003602000b2003450d00200110260b200241e0006a24000ba10204017f017e017f027e230041d0006b220224002002412036020420022001360200200241086a2001412010820202400240200228020822010d00420021030c010b200228020c210402400240200241086a41086a2802004110490d00200141086a290000210520012900002106420121030c010b20024100360220200242013703182002410e36022c200220023602282002200241186a360234200241cc006a41013602002002420137023c2002418c8dc6003602382002200241286a360248200241346a41c4e1c000200241386a10351a200228021820022802201084020240200228021c450d00200228021810260b420021030b2004450d00200110260b2000200637030820002003370300200041106a2005370300200241d0006a24000be32e05017f027e017f027e1c7f230041f0026b22072400024002400240024002402001200284500d002003200484500d004201210842002109200741f8006a200320012003200156200420025620042002511b220a1b220b20042002200a1b220c20054201200542015620064200522006501b220d1b220520064200200d1b220610cb0620022004200a1b210220012003200a1b21042007290378200741f8006a41086a29030084500d01200741e8006a200420022005200610cb062007290368200741e8006a41086a29030084500d0220052108200621090c030b20004100360200200041106a4200370300200041086a42003703000c030b200741c8006a200b200c2005200610d306200741c8006a41086a290300210c2007290348210b0c010b200741d8006a200420022005200610d306200741e0006a29030021024200210942012108200729035821040b200741186a200c42002004420010cc06200741286a20024200200b420010cc06200741386a200b42002004420010cc06024002400240024002400240024002400240024002400240200c420052200242005271200729032042005272200729033042005272200741386a41086a2903002201200729031820072903287c7c2203200154724101470d0041101024220a450d092007420437028c022007200a3602880220074188026a4100410410e70120074188016a41086a200728029002220a41046a360200200728028802200a4102746a220a200b3e020c200a200b4220883e0208200a200c3e0204200a200c4220883e020020072007290388023703880120074188016a10b80641101024220a450d092007420437028c022007200a3602880220074188026a4100410410e70120074198016a41086a200728029002220a41046a360200200728028802200a4102746a220a20043e020c200a20044220883e0208200a20023e0204200a20024220883e020020072007290388023703980120074198016a10b80641101024220a450d092007420437028c022007200a3602880220074188026a4100410410e701200741a8016a41086a200728029002220a41046a360200200728028802200a4102746a220a2008a7220e36020c200a20084220883e0208200a20093e0204200a20094220883e020020072007290388023703a801200741a8016a10b806200741f8016a41086a20074198016a41086a28020036020020072007290398013703f80120074188026a41086a20074188016a41086a280200360200200720072903880137038802200741b8016a20074188026a200741f8016a10b906024020072802fc0141ffffffff0371450d0020072802f80110260b200741b8016a10b80620072802c001210f20072802bc01211020072802b801211120072802b001220a41014b0d01200a0e020602060b200741086a200729033820032008200910d30620004100360200200041106a200741086a41086a290300370300200041086a20072903083703000c0b0b20072802a801220d2802000d010c040b200f4101200f41014b1b221241ffffffff03712012470d012012410274220a417f4c0d0102400240200a0d004104210d0c010b200a102a220d450d070b200720123602f0012007200d3602e8012007200a4102763602ec0102400240200f450d00200d2012410274200f4102746b6a210d4100200f6b210a200e4101200e41014b1bad2102420021042011210e03402012200a6a220f20124f0d02200d2004422086200e3502008422042002803e0200200e41046a210e200d41046a210d20042002822104200a41016a220f200a492113200f210a2013450d000b0b201041ffffffff0371450d06201110260c060b200f201241d8a7c7001032000b200f450d012011280200450d02200f200a4d0d022007200a3602c401200f200a6b221441016a22154101201541014b1b221641ffffffff03712016470d0020164102742217417f4c0d002017102a2218450d05200a4101200a41014b1b221941ffffffff03712019470d002019410274221a417f4c0d00201a102a221b450d054102210a4101210e200d280200220d67221c21130240200d41ffffffff034b0d004102210a201c210d4101210e0340200a4101200d4101711b200e6c210e200d41034b2112200a200a6c210a200d4101762213210d20120d000b0b2007200f36028002200720103602fc01200720113602f80141041024220d450d06200d200a410120134101461b200e6c220e360200200742818080801037028c022007200d36028802200741c8016a200741f8016a20074188026a10b906200d1026200741f8016a200741a8016a10ba0641041024220a450d06200a200e360200200742818080801037028c022007200a36028802200741d8016a200741f8016a20074188026a10b906200a10260240201520072802c4016a220a20072802d001220d4d0d002007410036028002200742043703f801200741f8016a4100200a200d6b220d10e701200728028002210a0240200d450d0020072802f801200a4102746a4100200d41027410d1061a200a200d6a210a0b2007200a3602800220072802c801210e200741f8016a200a20072802d001220d10e70120072802f801200728028002220a4102746a200e200d41027410cf061a2007200a200d6a220a3602800220074188026a41086a220d200a360200200720072903f80137038802024020072802cc0141ffffffff0371450d0020072802c80110260b200741c8016a41086a200d28020036020020072007290388023703c8010b2017410276211d201a410276211e200741d8016a10b8060240024002400240024002400240024002400240034020072014221f3602e401024020072802d001220a20072802c401220d201f6a220e417f736a2212200a490d002012200a41b0a6c7001032000b0240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200a200a200e6b220e4d0d0020072802e001220a200a200d6b220d4d0d0120072802d801200d4102746a35020022024200510d02201f417f6a4100201f1b211420072802c801220a20124102746a3502002104200a200e4102746a3502002101200741003602e8012007200120044220868422042002803703f0012007200420028237038002200741003602f8012007200741e4016a36029c022007200741c8016a360298022007200741c4016a360294022007200741d8016a360290022007200741f8016a36028c022007200741e8016a3602880220074188026a10bb061a034020072802f801220a41016a41004c0d042007200a3602f801024020072903800242ffffffff0f560d0020074188026a10bb060d010b0b20072903f00121024100210e200741003602a802200742043703a002024020072802c401221020072802e401220d6a220a2010490d00201041016a220e20104f0d00410421204100210e4100210f034020072802d0012212200a417f736a221320124f0d06200d200a4f2112200a200d200a496b210a20072802c80120134102746a28020021130240200f20072802a402470d00200741a0026a200f417f41004100417f200a200d6b221141016a221020102011491b20121b200a200d491b221141016a221020102011491b10e70120072802a00221200b2020200e6a20133602002007200f41016a220f3602a802200e41046a210e200a200d49201272450d000c0b0b0b200741a0026a4100200e10e70120072802a802210f20072802a0022120200a200d490d082020200f4102746a2112200a200d4d0d05200a417f73210e0340200e20072802d00122116a2213200e4f0d07201220072802c80120134102746a280200360200200e41016a210e201241046a2112200d200a417f6a220a490d000b2010200f6a210f0c070b200e200a41b0a6c7001032000b200d200a41b0a6c7001032000b4180a8c7004119419ca8c700102f000b41aca8c7004118200741e0026a41c4a8c70041d4a8c7001036000b2013201241b0a6c7001032000b2010450d010c020b2013201141b0a6c7001032000b20072802d001220a200d417f736a220d200a4f0d02201220072802c801200d4102746a280200360200200f41016a210f0b2007200f3602a8020b200741d0026a200741d8016a10ba0641081024220a450d23200a2002a72221360204200a20024220883e020020074282808080203702e4022007200a3602e002200741b0026a200741d0026a200741e0026a10b906200a1026200f20072802b8022222200f20224b1b22114101201141014b1b221341ffffffff03712013470d1d20134102742223417f4c0d1d20072802a40221240240024020230d00410421250c010b2023102a2225450d230b024002402011450d002013417f6a210d2022417f6a222620224b2115200f417f6a2227200f4b2117202520236a417c6a210e410021124200210420072802b002212803404100210a024020170d004100210a200f202720126b22104d0d004100210a201020274b0d00202020104102746a280200210a0b200aad21024100210a024020150d002022202620126b22104d0d00201020264b0d00202820104102746a280200210a0b024002402002200aad22037d22012002560d00200120047d22062001560d00200642ffffffff0f832102420021040c010b20024280808080108420047d20037d2102420121040b2013200d4d0d04200e20023e0200200e417c6a210e200d417f6a210d2011201241016a2212470d000b41012110200450450d010b410021100b0240202441ffffffff0371450d00202010260b20072802c401220e20072802e401220d6a2215200e490d06200d20154f0d02200d417f73210a034020132013200d6a200a6a22124d0d04200a20072802d001220f6a220d200a4f0d0520072802c801200d4102746a202520124102746a280200360200200a417f6a210a20072802e401210d200e417f6a220e0d000c060b0b200d200a41b0a6c7001032000b200d201341d8a7c7001032000b200e450d020c030b20114101201141014b1b200d6a200a6a201341b0a6c7001032000b200d200f41d8a7c7001032000b200d2015417f73220a6a220d20136a220e200d4f0d0120072802d001220d200a6a220a200d4f0d0220072802c801200a4102746a2025200e4102746a28020036020020072802e401210d0b2016200d417f736a220a20164f0d022018200a4102746a20213602002010450d0a201620072802e401417f736a220a20164f0d032018200a4102746a220a200a280200417f6a3602004100210e200741003602e802200742043703e002024020072802c401221120072802e401220d6a220a2011490d00201141016a220e20114f0d0041042111410021124100210e034020072802d001220f200a417f736a2213200f4f0d06200d200a4f210f200a200d200a496b210a20072802c80120134102746a28020021130240200e20072802e402470d00200741e0026a200e417f41004100417f200a200d6b221141016a221020102011491b200f1b200a200d491b221141016a221020102011491b10e70120072802e00221110b201120126a20133602002007200e41016a220e3602e802201241046a2112200a200d49200f72450d000c0b0b0b200741e0026a4100200e10e70120072802e8022110200a200d490d0820072802e00220104102746a2112200a200d4d0d05200a417f73210e0340200e20072802d00122136a220f200e4f0d07201220072802c801200f4102746a280200360200200e41016a210e201241046a2112200d200a417f6a220a490d000b201120106a21100c070b200e201341b0a6c7001032000b200a200d41d8a7c7001032000b200a201641d8a7c7001032000b200a201641b0a6c7001032000b2013200f41b0a6c7001032000b2011450d010c020b200f201341b0a6c7001032000b20072802d001220a200d417f736a220d200a4f0d04201220072802c801200d4102746a280200360200201041016a21100b200720103602e8020b200741c0026a41086a200741e0026a41086a280200360200200720072903e0023703c002200741e0026a200741d8016a10ba06200741d0026a200741e0026a200741c0026a10bc06024020072802c401220a20072802e40122136a220d200a490d00024002402013200d4f0d00200d417f73210a20072802d002211120072802d802210e201321120340200e200e20126a200a6a22124d0d07200a20072802d00122106a220f200a4f0d0820072802c801200f4102746a201120124102746a280200360200200a41016a210a20072802e40121122013200d417f6a220d490d000c020b0b200a0d0120072802d802210e201321120b200e20122013417f73220a6a6a220d200e4f0d0620072802d001220e200a6a220a200e4f0d0720072802c801200a4102746a20072802d002200d4102746a2802003602000b024020072802d40241ffffffff0371450d0020072802d00210260b20072802c40241ffffffff0371450d0020072802c00210260b02402023450d00202510260b024020072802b40241ffffffff0371450d0020072802b00210260b201f0d000b02400240201c0d004100210a20072802d001211920072802cc01211e20072802c801210e201a450d01201b10260c010b024020072802c401220a4101460d004100200a6b2113201c411f7121114100201c6b411f7121102019410274201b6a417c6a210d417f210a0340200a20072802d00122126a220e200a4f0d0a2012200e417f6a220f4d0d0b2019200a6a221220194f0d0c200d20072802c8012212200f4102746a2802002010742012200e4102746a28020020117672360200200d417c6a210d2013200a417f6a220a470d000b20072802c401210a0b20072802d001220d200d200a6b220e4d0d0620192019200a6b220a4d0d07201b200a4102746a20072802c801200e4102746a280200201c411f71763602004101210a201b210e0b024020072802dc0141ffffffff0371450d0020072802d80110260b200a450d0d20072802cc0141ffffffff0371450d0d20072802c80110260c0d0b200d200a41b0a6c7001032000b2012200e41b0a6c7001032000b200f201041d8a7c7001032000b200d200e41b0a6c7001032000b200a200e41d8a7c7001032000b200e200d41b0a6c7001032000b200a201941d8a7c7001032000b200e201241b0a6c7001032000b200e417f6a201241b0a6c7001032000b2012201941d8a7c7001032000b1034000b4100410041e8a7c7001032000b410021180240201041ffffffff03710d000c010b201110260b41041024220a450d02200a410036020041041024220d450d02200d41003602000240024020180d00410121194101211e410121164101211d0c010b200a1026200d1026200e210d2018210a0b200720163602e8022007201d3602e4022007200a3602e00220072019360280022007201e3602fc012007200d3602f80120074188026a200741f8016a10bd062007280288024101460d03024020074188026a41086a29030020084201882009423f86845620074188026a41106a2903002202200942018822045620022004511b450d00200741e8016a41086a200741e0026a41086a280200360200200720072903e0023703e80141101024220a450d022007420437028c022007200a3602880220074188026a4100410410e70120074180026a200728029002220a41046a360200200728028802200a4102746a220a428080808010370208200a420037020020072007290388023703f801200741f8016a10b806200741e0026a200741e8016a200741f8016a10bc0620072802fc0141ffffffff0371450d0020072802f80110260b200741e8016a41086a200741e0026a41086a280200360200200720072903e0023703e8010b200741e8016a10b806200741f8016a41086a200741e8016a41086a280200360200200720072903e8013703f80120074188026a200741f8016a10bd064101210a024002402007280288024101470d00200041b8a4c700360204200041086a41193602000c010b200041106a20074188026a41106a290300370300200041086a20074188026a41086a2903003703004100210a0b2000200a36020020072802ac0141ffffffff0371450d0320072802a80110260c030b1033000b102c000b2007200729028c023703f80141e8a3c700412f200741f8016a4198a4c70041a8a4c7001036000b200741f0026a24000ba40202037f017e230041d0006b220224002002412036020420022001360200200241086a2001412010820202400240200228020822010d00200042003703000c010b200228020c2103024002400240200241086a41086a28020022044108490d0020044178714108470d010b20024100360220200242013703182002410e36022c200220023602282002200241186a360234200241cc006a41013602002002420137023c2002418c8dc6003602382002200241286a360248200241346a41c4e1c000200241386a10351a200228021820022802201084020240200228021c450d00200228021810260b420021050c010b200041106a200129000837030020002001290000370308420121050b200020053703002003450d00200110260b200241d0006a24000ba00702077f047e230041e0016b220224002002412036020420022001360200200241086a2001412010820202400240200228020822030d00200041023a00000c010b200228020c210402400240200241106a2802002205450d0020032d0000220641014b0d004100210102400240024020060e020100010b41002101200241003a009801200341016a21072005417f6a2106034020062001460d02200241f8006a20016a200720016a2d00003a00002002200141016a22053a0098012005210120054120470d000b200241a0016a41086a2206200241f8006a41086a290300370300200241a0016a41106a2207200241f8006a41106a290300370300200241a0016a41186a2208200241f8006a41186a290300370300200220022903783703a001410121010240200541ff01714120490d00200241d8006a41186a2008290300370300200241d8006a41106a2007290300370300200241d8006a41086a2006290300370300200220022903a001370358410021010b200241386a41086a200241d8006a41086a290300370300200241386a41106a200241d8006a41106a290300370300200241386a41186a200241d8006a41186a2903003703002002200229035837033820010d02200241186a41186a200241386a41186a290300370300200241186a41106a200241386a41106a290300370300200241186a41086a200241386a41086a29030037030020022002290338370318410121010b200241f8006a41186a200241186a41186a2903002209370300200241f8006a41106a200241186a41106a290300220a370300200241f8006a41086a200241186a41086a290300220b37030020022002290318220c370378200041196a2009370000200041116a200a370000200041096a200b3700002000200c3700010c020b0240200141ff0171450d00200241003a0098010b200241386a41086a200241d8006a41086a290300370300200241386a41106a200241d8006a41106a290300370300200241386a41186a200241d8006a41186a290300370300200220022903583703380b200241003602a801200242013703a0012002410e36025c200220023602582002200241a0016a3602382002418c016a41013602002002420137027c2002418c8dc6003602782002200241d8006a36028801200241386a41c4e1c000200241f8006a10351a20022802a00120022802a801108402024020022802a401450d0020022802a00110260b410221010b200020013a00002004450d00200310260b200241e0016a24000b980301057f230041d0006b22022400200241086a41868cc700410410fb01200241186a41c4a1c600411110fb0120022001360234200241386a200241346a410410a202200241cc006a200241346a41046a3602002002200241c0006a3602442002200241346a3602482002200241386a360240200241286a200241c0006a1073024002402002280230220341206a2204417f4c0d000240024020040d0041012101410021040c010b200410242201450d020b20002001360200200041086a220141003602002000200436020420004100411010c9012000280200200128020022046a220520022900083700002001200441106a2204360200200541086a200241086a41086a29000037000020002004411010c9012000280200200128020022046a220520022900183700002001200441106a2206360200200541086a200241186a41086a2900003700002002280228210420002006200310c9012000280200200128020022006a2004200310cf061a2001200020036a3602000240200228022c450d00200410260b200241d0006a24000f0b1034000b1033000bc908010a7f23004180026b220324002003200236020c20032001360208200341106a2001200210820202400240200328021022040d00200041003602000c010b200328021421052003200341186a280200360224200320043602202003200341206a108f010240024020032802000d000240024002402003280204220620032802244105762201200120064b1b22014105742202417f4c0d000240024020010d00410121070c010b200210242207450d020b41002108200341003602302003200136022c200320073602280240024002402006450d0041002109034041002102200341003a00b8012003280224417f6a2101200941016a210903402001417f460d0320034198016a20026a2003280220220a2d00003a00002003200a41016a3602202003200241016a220a3a00b801200320013602242001417f6a2101200a2102200a4120470d000b200341c0016a41086a220220034198016a41086a290300370300200341c0016a41106a220b20034198016a41106a290300370300200341c0016a41186a220c20034198016a41186a29030037030020032003290398013703c001410121010240200a41ff01714120490d00200341f8006a41186a200c290300370300200341f8006a41106a200b290300370300200341f8006a41086a2002290300370300200320032903c001370378410021010b200341d8006a41086a2202200341f8006a41086a290300370300200341d8006a41106a220a200341f8006a41106a290300370300200341d8006a41186a220b200341f8006a41186a2903003703002003200329037837035820010d03200341386a41186a220c200b290300370300200341386a41106a220b200a290300370300200341386a41086a220a20022903003703002003200329035837033802402008200328022c470d00200341286a200810f60120032802282107200328023021080b200720084105746a22012003290338370000200141186a200c290300370000200141106a200b290300370000200141086a200a2903003700002003200841016a220836023020092006470d000b0b2007450d052000200329022c370204200020073602000c060b0240200241ff0171450d00200341003a00b8010b200341d8006a41086a200341f8006a41086a290300370300200341d8006a41106a200341f8006a41106a290300370300200341d8006a41186a200341f8006a41186a290300370300200320032903783703580b200328022c41ffffff3f710d020c030b1034000b1033000b200710260b200341003602c801200342013703c0012003410e36027c2003200341086a3602782003200341c0016a360258200341ac016a41013602002003420137029c012003418c8dc600360298012003200341f8006a3602a801200341d8006a41c4e1c00020034198016a10351a20032802c00120032802c801108402024020032802c401450d0020032802c00110260b200041003602000b2005450d00200410260b20034180026a24000b11004182abc700411f41a4abc700102f000b910d03077f017e017f230041e0006b22052400200541306a2001109502200541086a20052802302206200528023841d4c0c700410041001081022005280208210702402005280234450d00200610260b024002400240024002400240024020074101460d002002450d010c030b200041011096020c010b200541c8006a22074200370300200541c0006a22084200370300200541306a41086a2206420037030020054200370330200541d0006a41818dc700410910fb012006200541d0006a41086a220929000037030020052005290050370330200541d0006a41eb8cc700410a10fb012007200929000037030020082005290050370300200541206a200541306a10fc01024002400240024002402005280220220a0d00410021072005410036021820054204370310410021064100210b0c010b20052005290224220c3702142005200a36021041002107024002400240200c422088a7220b41014b0d00200b0e020201020b200b2106034020072006410176220920076a220d200a200d4102746a28020020014b1b2107200620096b220641014b0d000b0b41012106200a20074102746a28020022092001460d03200b200720092001496a2207490d040b200b200ca72206470d010b200541106a2006410110e7012005280210210a0b200a20074102746a220641046a2006200b20076b41027410d0061a200620013602002005200b41016a360218410621060b200541206a41086a200541106a41086a28020036020020052005290310220c37032002400240200ca722070d00200541c8006a4200370300200541c0006a4200370300200541306a41086a2207420037030020054200370330200541d0006a41818dc700410910fb012007200541d0006a41086a220929000037030020052005290050370330200541d0006a41eb8cc700410a10fb01200841086a200929000037000020082005290050370000200541306a412010ff010c010b200541c8006a4200370300200541c0006a4200370300200541306a41086a2209420037030020054200370330200541d0006a41818dc700410910fb012009200541d0006a41086a220d29000037030020052005290050370330200541d0006a41eb8cc700410a10fb01200841086a200d29000037000020082005290050370000200541306a200541206a109702200528022441ffffffff0371450d00200710260b20064106460d02200020061096020c010b2007200b103b000b0240200441046a280200450d00200428020010260b200341046a280200450d01200328020010260c010b200428020821072004280204210a20042802002109200541d0006a41086a200341086a28020036020020052003290200370350200541306a2001109802200528023022062005280238200541d0006a10990202402005280234450d00200610260b02402005280254450d00200528025010260b200541d0006a2001109a02200741046a2206417f4c0d01200528025821032005280250210d0240024020060d0041012104410021060c010b200610242204450d030b2005410036023820052004360230200520063602340240024002400240200741c000490d00200741808001490d012007418080808004490d02200541306a41004101106d2005280230200528023822066a41033a00002005200641016a2206360238200541306a20064104106d2005280230200528023822066a20073600002005200641046a2206360238200541306a21040c030b200541306a41004101106d2005280230200528023822066a20074102743a00002005200641016a2206360238200541306a21040c020b200541306a41004102106d2005280230200528023822066a20074102744101723b00002005200641026a2206360238200541306a21040c010b200541306a41004104106d2005280230200528023822066a20074102744102723600002005200641046a2206360238200541306a21040b200420062007106d20052802302206200528023822046a2009200710cf061a2005200420076a2207360238200d20032006200710b30102402005280234450d00200610260b02402005280254450d00200d10260b0240200a450d00200910260b200541d0006a200110950220052802582106200528025021072005410036023820054201370330200541306a41004101106d20052802302201200528023822096a20023a00002005200941016a2209360238200720062001200910b30102402005280234450d00200110260b02402005280254450d00200710260b200041043a00000b200541e0006a24000f0b1034000b1033000b980301057f230041d0006b22022400200241086a41818dc700410910fb01200241186a41f0d7c000410510fb0120022001360234200241386a200241346a410410a202200241cc006a200241346a41046a3602002002200241c0006a3602442002200241346a3602482002200241386a360240200241286a200241c0006a1073024002402002280230220341206a2204417f4c0d000240024020040d0041012101410021040c010b200410242201450d020b20002001360200200041086a220141003602002000200436020420004100411010c9012000280200200128020022046a220520022900083700002001200441106a2204360200200541086a200241086a41086a29000037000020002004411010c9012000280200200128020022046a220520022900183700002001200441106a2206360200200541086a200241186a41086a2900003700002002280228210420002006200310c9012000280200200128020022006a2004200310cf061a2001200020036a3602000240200228022c450d00200410260b200241d0006a24000f0b1034000b1033000bf10101047f230041c0006b2202240041a0ebc40021034110210441042105024002400240024002400240200141ff01710e06000102030405000b2002411c6a41013602002002420137020c200241dcedc6003602082002410436022420024190f6c6003602202002200241206a360218200241086a41ecc0c700103d000b41e0b4c000210341112104410021050c030b41fcb4c0002103410e2104410121050c020b4194b5c0002103410f2104410221050c010b41acb5c0002103410c2104410321050b20004183223b0100200041086a2004360200200041046a2003360200200041026a20053a0000200241c0006a24000bf90101057f230041106b22022400024002402001280208220341027441046a2204417f4c0d00200128020021010240024020040d0041012105410021040c010b200410242205450d020b2002410036020820022005360200200220043602042002200310a1010240024020030d0020022802002106200228020821040c010b2003410274210320022802082104034020012802002105200220044104106d20022802002206200228020822046a20053600002002200441046a2204360208200141046a21012003417c6a22030d000b0b200041202006200410b30102402002280204450d00200610260b200241106a24000f0b1034000b1033000b980301057f230041d0006b22022400200241086a41eb8cc700410a10fb01200241186a41dca2c500410410fb0120022001360234200241386a200241346a410410a202200241cc006a200241346a41046a3602002002200241c0006a3602442002200241346a3602482002200241386a360240200241286a200241c0006a1073024002402002280230220341206a2204417f4c0d000240024020040d0041012101410021040c010b200410242201450d020b20002001360200200041086a220141003602002000200436020420004100411010c9012000280200200128020022046a220520022900083700002001200441106a2204360200200541086a200241086a41086a29000037000020002004411010c9012000280200200128020022046a220520022900183700002001200441106a2206360200200541086a200241186a41086a2900003700002002280228210420002006200310c9012000280200200128020022006a2004200310cf061a2001200020036a3602000240200228022c450d00200410260b200241d0006a24000f0b1034000b1033000b9e0301047f230041106b22032400024002402002280208220441046a2205417f4c0d00200228020021020240024020050d0041012106410021050c010b200510242206450d020b2003410036020820032006360200200320053602040240024002400240200441c000490d00200441808001490d012004418080808004490d02200341004101106d2003280200200328020822056a41033a00002003200541016a2205360208200320054104106d2003280200200328020822056a2004360000200541046a21050c030b200341004101106d2003280200200328020822056a20044102743a0000200541016a21050c020b200341004102106d2003280200200328020822056a20044102744101723b0000200541026a21050c010b200341004104106d2003280200200328020822056a2004410274410272360000200541046a21050b20032005360208200320052004106d20032802002205200328020822066a2002200410cf061a2003200620046a2204360208200020012005200410b30102402003280204450d00200510260b200341106a24000f0b1034000b1033000b980301057f230041d0006b22022400200241086a41eb8cc700410a10fb01200241186a41eca4c500410510fb0120022001360234200241386a200241346a410410a202200241cc006a200241346a41046a3602002002200241c0006a3602442002200241346a3602482002200241386a360240200241286a200241c0006a1073024002402002280230220341206a2204417f4c0d000240024020040d0041012101410021040c010b200410242201450d020b20002001360200200041086a220141003602002000200436020420004100411010c9012000280200200128020022046a220520022900083700002001200441106a2204360200200541086a200241086a41086a29000037000020002004411010c9012000280200200128020022046a220520022900183700002001200441106a2206360200200541086a200241186a41086a2900003700002002280228210420002006200310c9012000280200200128020022006a2004200310cf061a2001200020036a3602000240200228022c450d00200410260b200241d0006a24000f0b1034000b1033000bce0803077f017e027f230041d0006b22022400200241206a200110950202402002280220220320022802282204109c0241ff017122054102460d002003200410ff010b02402002280224450d00200310260b41022005410171200541024622051b2103024002400240024002400240024020050d0020034101710d04200241386a22054200370300200241306a22064200370300200241206a41086a2203420037030020024200370320200241c0006a41818dc700410910fb012003200241c0006a41086a220429000037030020022002290040370320200241c0006a41eb8cc700410a10fb012005200429000037030020062002290040370300200241c0006a200241206a10fc014101210720022802402205410420051b21082002290244420020051b2209422088a7220a41014b0d0141002105200a0e020302030b200020031096020c050b41002105200a2103034020052003410176220420056a220b2008200b4102746a28020020014b1b2105200320046b220341014b0d000b0b200820054102746a2802002001470d002005200a4f0d02200820054102746a2203200341046a2005417f73200a6a41027410d0061a20094280808080707c2109410021070b2002200836021020022009370214200241386a4200370300200241306a4200370300200241206a41086a2205420037030020024200370320200241c0006a41818dc700410910fb012005200241c0006a41086a220329000037030020022002290040370320200241c0006a41eb8cc700410a10fb01200641086a200329000037000020062002290040370000200241206a200241106a1097020240200942ffffffff0383500d00200810260b2007450d00200041021096020c020b200241c0006a2001109802200241206a2002280240220320022802482204109d02024020022802202205450d002003200410ff010b2002290224210902402002280244450d00200310260b200241206a2001109a0220022802202203200228022810ff0102402002280224450d00200310260b200241206a2001109e02200241086a200228022022032002280228220b1089020240200228020822044101470d002003200b10ff010b02402002280224450d00200310260b024020044101470d00200241206a2001109f0220022802202203200228022810ff012002280224450d00200310260b02402005450d00200241386a22034200370300200241306a22044200370300200241206a41086a420037030020024200370320200241206a41808cc700410610fb01200241c0006a41ea93c400410610fb012003200241c0006a41086a290000370300200420022900403703002002200241206a41201089022002280204210320022802002104200220093702242002200536022020012003410020041b200241206a10a0020b200241206a200110950220022802202205200228022810ff0102402002280224450d00200510260b200041043a00000c010b2005200a103e000b200241d0006a24000b890201037f230041d0006b220224002002200136020420022000360200200241086a2000200110820202400240200228020822010d00410221000c010b200228020c210302400240200241106a280200450d0020012d0000220441014b0d0041002100024020040e020200020b410121000c010b20024100360220200242013703182002410e36022c200220023602282002200241186a360234200241cc006a41013602002002420137023c2002418c8dc6003602382002200241286a360248200241346a41c4e1c000200241386a10351a200228021820022802201084020240200228021c450d00200228021810260b410221000b2003450d00200110260b200241d0006a240020000bcd0301057f230041e0006b220324002003200236020c20032001360208200341106a200120021082020240024002400240200328021022010d00200041003602000c010b200328021421022003200341186a280200360224200320013602202003200341206a108f0102400240024020032802000d002003280224220420032802042205490d002005417f4c0d040240024020050d0041002106410121070c010b2005102a2207450d0620032802242104200521060b0240024020042005490d0020072003280220200510cf0621042003280224220720054f0d012005200741b8afc0001048000b2006450d01200710260c010b2003200720056b3602242003200328022020056a36022020040d010b20034100360230200342013703282003410e36023c2003200341086a3602382003200341286a360244200341dc006a41013602002003420137024c2003418c8dc6003602482003200341386a360258200341c4006a41c4e1c000200341c8006a10351a200328022820032802301084020240200328022c450d00200328022810260b200041003602000c010b20002005ad4220862006ad84370204200020043602000b2002450d00200110260b200341e0006a24000f0b1034000b1033000b980301057f230041d0006b22022400200241086a41eb8cc700410a10fb01200241186a41e4f6c400411210fb0120022001360234200241386a200241346a410410a202200241cc006a200241346a41046a3602002002200241c0006a3602442002200241346a3602482002200241386a360240200241286a200241c0006a1073024002402002280230220341206a2204417f4c0d000240024020040d0041012101410021040c010b200410242201450d020b20002001360200200041086a220141003602002000200436020420004100411010c9012000280200200128020022046a220520022900083700002001200441106a2204360200200541086a200241086a41086a29000037000020002004411010c9012000280200200128020022046a220520022900183700002001200441106a2206360200200541086a200241186a41086a2900003700002002280228210420002006200310c9012000280200200128020022006a2004200310cf061a2001200020036a3602000240200228022c450d00200410260b200241d0006a24000f0b1034000b1033000b980301057f230041d0006b22022400200241086a41eb8cc700410a10fb01200241186a41d0a4c500410a10fb0120022001360234200241386a200241346a410410a202200241cc006a200241346a41046a3602002002200241c0006a3602442002200241346a3602482002200241386a360240200241286a200241c0006a1073024002402002280230220341206a2204417f4c0d000240024020040d0041012101410021040c010b200410242201450d020b20002001360200200041086a220141003602002000200436020420004100411010c9012000280200200128020022046a220520022900083700002001200441106a2204360200200541086a200241086a41086a29000037000020002004411010c9012000280200200128020022046a220520022900183700002001200441106a2206360200200541086a200241186a41086a2900003700002002280228210420002006200310c9012000280200200128020022006a2004200310cf061a2001200020036a3602000240200228022c450d00200410260b200241d0006a24000f0b1034000b1033000bbb0802067f017e230041e0006b22032400200341206a200010e403200341306a200328022022042003280228220510e503200341d0006a41086a2206200341306a41086a2802003602002003200329033037035002400240200328023c22074102470d0041002108200341003602102003420437030841002106410021070c010b200341186a2003280240360200200341086a41086a2006280200220636020020032003290350370308200328020c21080b20032007360214024020062008470d00200341086a200810f1010b2003280208220741046a2007200641027410d0061a200720013602002003200641016a360210200341386a2003290310370300200341306a41106a200341086a41106a2802003602002003200329030837033002400240200328023c4102470d002004200510ff010c010b2003410036025820034201370350200341d0006a200341306a109a01200341d0006a2003413c6a10af012004200520032802502206200328025810b30102402003280254450d00200610260b200328023441ffffffff0371450d00200328023010260b02402003280224450d00200410260b200341086a41086a200241086a28020036020020032002290200370308200341306a2000200110e603200328023022062003280238200341086a10990202402003280234450d00200610260b0240200328020c450d00200328020810260b200341206a10e30320032802202108410021060240024002400240024002402003280228220541014b0d0020050e020201020b20052102034020062002410176220720066a2204200820044103746a41046a28020020014b1b2106200220076b220241014b0d000b0b20052006200820064103746a41046a2802002001496a2206490d010b024020052003280224470d00200341206a200510ec01200328022021080b200820064103746a220241086a2002200520066b41037410d0061a20022001360204200220003602002003200541016a2206360228200341d0006a41086a20063602002003200329032022093703502009a722060d01200341c8006a22064200370300200341c0006a22024200370300200341306a41086a2207420037030020034200370330200341086a41eb8cc700410a10fb012007200341086a41086a220429000037030020032003290008370330200341086a41bbf5c400410f10fb012006200429000037030020022003290008370300200341306a412010ff010c020b20062005103b000b200341c8006a22024200370300200341c0006a22074200370300200341306a41086a2204420037030020034200370330200341086a41eb8cc700410a10fb012004200341086a41086a220129000037030020032003290008370330200341086a41bbf5c400410f10fb012002200129000037030020072003290008370300200341306a200341d0006a10e703200328025441ffffffff0171450d00200610260b200341e0006a24000b980301057f230041d0006b22022400200241086a41818dc700410910fb01200241186a419ab7c000410710fb0120022001360234200241386a200241346a410410a202200241cc006a200241346a41046a3602002002200241c0006a3602442002200241346a3602482002200241386a360240200241286a200241c0006a1073024002402002280230220341206a2204417f4c0d000240024020040d0041012101410021040c010b200410242201450d020b20002001360200200041086a220141003602002000200436020420004100411010c9012000280200200128020022046a220520022900083700002001200441106a2204360200200541086a200241086a41086a29000037000020002004411010c9012000280200200128020022046a220520022900183700002001200441106a2206360200200541086a200241186a41086a2900003700002002280228210420002006200310c9012000280200200128020022006a2004200310cf061a2001200020036a3602000240200228022c450d00200410260b200241d0006a24000f0b1034000b1033000b25002002ad4220862001ad84101321012000420037000020002001290000370000200110260b980301057f230041d0006b22022400200241086a41818dc700410910fb01200241186a41ccd7c000410b10fb0120022001360234200241386a200241346a410410a202200241cc006a200241346a41046a3602002002200241c0006a3602442002200241346a3602482002200241386a360240200241286a200241c0006a1073024002402002280230220341206a2204417f4c0d000240024020040d0041012101410021040c010b200410242201450d020b20002001360200200041086a220141003602002000200436020420004100411010c9012000280200200128020022046a220520022900083700002001200441106a2204360200200541086a200241086a41086a29000037000020002004411010c9012000280200200128020022046a220520022900183700002001200441106a2206360200200541086a200241186a41086a2900003700002002280228210420002006200310c9012000280200200128020022006a2004200310cf061a2001200020036a3602000240200228022c450d00200410260b200241d0006a24000f0b1034000b1033000bb22605017f017e197f047e0c7f230041900e6b2203240042002104200341d00d6a41186a22054200370300200341e00d6a22064200370300200341d00d6a41086a22074200370300200342003703d00d200341106a41808cc700410610fb012007200341106a41086a2208290000370300200320032900103703d00d200341106a41ea93c400410610fb012005200829000037030020062003290010370300200341086a200341d00d6a412010890220032802082109200328020c210a200542003703002006420037030020074200370300200342003703d00d200341106a41b4a3c700411810fb0120072008290000370300200320032900103703d00d200341106a41a1b7c000410e10fb012005200829000037030020062003290010370300200341f00d6a200341d00d6a412010a502200a417f6a41d100702105024002400240024020032802f00d220b0d004101210b0c010b20032902f40d220442ffffffff0f560d010b20004200370000200041186a4200370000200041106a4200370000200041086a42003700000c010b2005413020091b2105200341106a410041e00c10d1061a200041186a220c4200370000200041106a220d4200370000200041086a220e420037000020004200370000200241056a210f200b41206a211020024102742211410172211220114102722113200b2004422088a722144105746a211541d1002116200241c0004921172002418080014921182002418080808004492119200b211a4100211b0340024002402005450d00200541016a2105034002400240201a2015460d00201a2106201a41206a211a0c010b2010211a200b21062014450d050b2005417f6a22050d000b20060d010c030b0240201a2015460d00201a2106201a41206a211a0c010b2010211a200b21062014450d020b024002400240200f417f4c0d0002400240200f0d0041002105410121070c010b200f10242207450d02200f21050b200341003602b80d200320073602b00d200320053602b40d200341b00d6a41004101106d20032802b00d20032802b80d22056a201b3a00002003200541016a22053602b80d024002400240024020170d0020180d0120190d02200341b00d6a20054101106d20032802b00d20032802b80d22056a41033a00002003200541016a22053602b80d200341b00d6a20054104106d20032802b00d20032802b80d22056a2002360000200541046a21050c030b200341b00d6a20054101106d20032802b00d20032802b80d22056a20113a0000200541016a21050c020b200341b00d6a20054102106d20032802b00d20032802b80d22056a20123b0000200541026a21050c010b200341b00d6a20054104106d20032802b00d20032802b80d22056a2013360000200541046a21050b200320053602b80d200341b00d6a20052002106d20032802b00d20032802b80d22056a2001200210cf061a2003200520026a3602b80d2003200341b00d6a3602d00d2006200341d00d6a109c01200341d00d6a20032802b00d20032802b80d109601200341f00d6a41186a220a200341d00d6a41186a2206290300370300200341f00d6a41106a2209200341d00d6a41106a2207290300370300200341f00d6a41086a221c200341d00d6a41086a2208290300370300200320032903d00d3703f00d024020032802b40d450d0020032802b00d10260b2016417f6a2116201b41016a211d200341f00c6a41086a201c290300221e370300200341f00c6a41106a2009290300221f370300200341f00c6a41186a200a2903002220370300200341106a201b4103704105746a220520032903f00d2221370000200541086a201e370000200541106a201f370000200541186a2020370000200320213703f00c410021220340201b4103704102470d03200341b00d6a41186a2223200341106a20226a220541186a2224290000370300200341b00d6a41106a2225200541106a2226290000370300200341b00d6a41086a2227200541086a222829000037030020032005290000221e3703b00d200a200541386a22292900003703002009200541306a222a290000370300201c200541286a222b2900003703002003200541206a222c290000221f3703f00d2003201e201f833c00b00d200320032d00b10d20032d00f10d713a00b10d200320032d00b20d20032d00f20d713a00b20d200320032d00b30d20032d00f30d713a00b30d200320032d00b40d20032d00f40d713a00b40d200320032d00b50d20032d00f50d713a00b50d200320032d00b60d20032d00f60d713a00b60d200320032d00b70d20032d00f70d713a00b70d202720272d0000201c2d0000713a0000200320032d00b90d20032d00f90d713a00b90d200320032d00ba0d20032d00fa0d713a00ba0d200320032d00bb0d20032d00fb0d713a00bb0d200320032d00bc0d20032d00fc0d713a00bc0d200320032d00bd0d20032d00fd0d713a00bd0d200320032d00be0d20032d00fe0d713a00be0d200320032d00bf0d20032d00ff0d713a00bf0d202520252d000020092d0000713a0000200320032d00c10d20032d00810e713a00c10d200320032d00c20d20032d00820e713a00c20d200320032d00c30d20032d00830e713a00c30d200320032d00c40d20032d00840e713a00c40d200320032d00c50d20032d00850e713a00c50d200320032d00c60d20032d00860e713a00c60d200320032d00c70d20032d00870e713a00c70d202320232d0000200a2d0000713a0000200320032d00c90d20032d00890e713a00c90d200320032d00ca0d20032d008a0e713a00ca0d200320032d00cb0d20032d008b0e713a00cb0d200320032d00cc0d20032d008c0e713a00cc0d200320032d00cd0d20032d008d0e713a00cd0d200320032d00ce0d20032d008e0e713a00ce0d200320032d00cf0d20032d008f0e713a00cf0d200620292900003703002007202a2900003703002008202b2900003703002003202c290000221e3703d00d200a200541d8006a222a2900003703002009200541d0006a222b290000370300201c200541c8006a222c2900003703002003200541c0006a222d290000221f3703f00d2003201e201f833c00d00d200320032d00d10d20032d00f10d713a00d10d200320032d00d20d20032d00f20d713a00d20d200320032d00d30d20032d00f30d713a00d30d200320032d00d40d20032d00f40d713a00d40d200320032d00d50d20032d00f50d713a00d50d200320032d00d60d20032d00f60d713a00d60d200320032d00d70d20032d00f70d713a00d70d200820082d0000201c2d0000713a0000200320032d00d90d20032d00f90d713a00d90d200320032d00da0d20032d00fa0d713a00da0d200320032d00db0d20032d00fb0d713a00db0d200320032d00dc0d20032d00fc0d713a00dc0d200320032d00dd0d20032d00fd0d713a00dd0d200320032d00de0d20032d00fe0d713a00de0d200320032d00df0d20032d00ff0d713a00df0d200720072d000020092d0000713a0000200320032d00e10d20032d00810e713a00e10d200320032d00e20d20032d00820e713a00e20d200320032d00e30d20032d00830e713a00e30d200320032d00e40d20032d00840e713a00e40d200320032d00e50d20032d00850e713a00e50d200320032d00e60d20032d00860e713a00e60d200320032d00e70d20032d00870e713a00e70d200620062d0000200a2d0000713a0000200320032d00e90d20032d00890e713a00e90d200320032d00ea0d20032d008a0e713a00ea0d200320032d00eb0d20032d008b0e713a00eb0d200320032d00ec0d20032d008c0e713a00ec0d200320032d00ed0d20032d008d0e713a00ed0d200320032d00ee0d20032d008e0e713a00ee0d200320032d00ef0d20032d008f0e713a00ef0d200341900d6a41186a22292023290300370300200341900d6a41106a22232025290300370300200341900d6a41086a22252027290300370300200320032903b00d3703900d200320032d00900d20032d00d00d723a00900d200320032d00910d20032d00d10d723a00910d200320032d00920d20032d00d20d723a00920d200320032d00930d20032d00d30d723a00930d200320032d00940d20032d00d40d723a00940d200320032d00950d20032d00d50d723a00950d200320032d00960d20032d00d60d723a00960d200320032d00970d20032d00d70d723a00970d202520252d000020082d0000723a0000200320032d00990d20032d00d90d723a00990d200320032d009a0d20032d00da0d723a009a0d200320032d009b0d20032d00db0d723a009b0d200320032d009c0d20032d00dc0d723a009c0d200320032d009d0d20032d00dd0d723a009d0d200320032d009e0d20032d00de0d723a009e0d200320032d009f0d20032d00df0d723a009f0d202320232d000020072d0000723a0000200320032d00a10d20032d00e10d723a00a10d200320032d00a20d20032d00e20d723a00a20d200320032d00a30d20032d00e30d723a00a30d200320032d00a40d20032d00e40d723a00a40d200320032d00a50d20032d00e50d723a00a50d200320032d00a60d20032d00e60d723a00a60d200320032d00a70d20032d00e70d723a00a70d202920292d000020062d0000723a0000200320032d00a90d20032d00e90d723a00a90d200320032d00aa0d20032d00ea0d723a00aa0d200320032d00ab0d20032d00eb0d723a00ab0d200320032d00ac0d20032d00ec0d723a00ac0d200320032d00ad0d20032d00ed0d723a00ad0d200320032d00ae0d20032d00ee0d723a00ae0d200320032d00af0d20032d00ef0d723a00af0d20062024290000370300200720262900003703002008202829000037030020032005290000221e3703d00d200a202a2900003703002009202b290000370300201c202c2900003703002003202d290000221f3703f00d2003201e201f833c00d00d200320032d00d10d20032d00f10d713a00d10d200320032d00d20d20032d00f20d713a00d20d200320032d00d30d20032d00f30d713a00d30d200320032d00d40d20032d00f40d713a00d40d200320032d00d50d20032d00f50d713a00d50d200320032d00d60d20032d00f60d713a00d60d200320032d00d70d20032d00f70d713a00d70d200820082d0000201c2d0000713a0000200320032d00d90d20032d00f90d713a00d90d200320032d00da0d20032d00fa0d713a00da0d200320032d00db0d20032d00fb0d713a00db0d200320032d00dc0d20032d00fc0d713a00dc0d200320032d00dd0d20032d00fd0d713a00dd0d200320032d00de0d20032d00fe0d713a00de0d200320032d00df0d20032d00ff0d713a00df0d200720072d000020092d0000713a0000200320032d00e10d20032d00810e713a00e10d200320032d00e20d20032d00820e713a00e20d200320032d00e30d20032d00830e713a00e30d200320032d00e40d20032d00840e713a00e40d200320032d00e50d20032d00850e713a00e50d200320032d00e60d20032d00860e713a00e60d200320032d00e70d20032d00870e713a00e70d200620062d0000200a2d0000713a0000200320032d00e90d20032d00890e713a00e90d200320032d00ea0d20032d008a0e713a00ea0d200320032d00eb0d20032d008b0e713a00eb0d200320032d00ec0d20032d008c0e713a00ec0d200320032d00ed0d20032d008d0e713a00ed0d200320032d00ee0d20032d008e0e713a00ee0d200320032d00ef0d20032d008f0e713a00ef0d200c2029290300370000200d2023290300370000200e2025290300370000200020032903900d221e3700002000201ea720032d00d00d723a0000200020002d000120032d00d10d723a0001200020002d000220032d00d20d723a0002200020002d000320032d00d30d723a0003200020002d000420032d00d40d723a0004200020002d000520032d00d50d723a0005200020002d000620032d00d60d723a0006200020002d000720032d00d70d723a0007200e200e2d000020082d0000723a0000200020002d000920032d00d90d723a0009200020002d000a20032d00da0d723a000a200020002d000b20032d00db0d723a000b200020002d000c20032d00dc0d723a000c200020002d000d20032d00dd0d723a000d200020002d000e20032d00de0d723a000e200020002d000f20032d00df0d723a000f200d200d2d000020072d0000723a0000200020002d001120032d00e10d723a0011200020002d001220032d00e20d723a0012200020002d001320032d00e30d723a0013200020002d001420032d00e40d723a0014200020002d001520032d00e50d723a0015200020002d001620032d00e60d723a0016200020002d001720032d00e70d723a0017200c200c2d000020062d0000723a0000200020002d001920032d00e90d723a0019200020002d001a20032d00ea0d723a001a200020002d001b20032d00eb0d723a001b200020002d001c20032d00ec0d723a001c200020002d001d20032d00ed0d723a001d200020002d001e20032d00ee0d723a001e200020002d001f20032d00ef0d723a001f201b41036e2123202241800c460d03200341106a20222023410574201b41096e41e0006c6b6a6a220541f8006a200c290000370000200541f0006a200d290000370000200541e8006a200e290000370000200541e0006a2000290000370000202241e0006a21222023211b0c000b0b1034000b1033000b41002105201d211b20160d000b0b0240200442ffffff3f83500d00200b10260b200341900e6a24000bb30201017f230041e0006b220324002003200236020c20032001360208200341106a2001200210820202400240200328021022010d00200041003602000c010b200328021421022003200341106a41086a28020036022420032001360220200341c8006a200341206a10e5010240024020032802480d0020034100360230200342013703282003410e36023c2003200341086a3602382003200341286a360244200341dc006a41013602002003420137024c2003418c8dc6003602482003200341386a360258200341c4006a41c4e1c000200341c8006a10351a200328022820032802301084020240200328022c450d00200328022810260b200041003602000c010b20002003290348370200200041086a200341c8006a41086a2802003602000b2002450d00200110260b200341e0006a24000bf60305017f027e027f017e017f230041106b220224000240024020002903004201520d00200041106a2903002103200029030821042001200141086a22052802004102106d2001280200200528020022066a20032004420c882207420120074201561b80a741047420047aa7417f6a22084101200841014b1b2208410f2008410f491b723b00002005200641026a22063602000c010b2001200141086a22052802004101106d2001280200200528020022066a41003a00002005200641016a22063602000b200041186a210802400240024002402000280228220541c000490d00200541808001490d012005418080808004490d02200120064101106d2001280200200141086a220528020022066a41033a00002005200641016a220636020020002802282100200120064104106d2001280200200528020022066a20003600002005200641046a3602000c030b200120064101106d2001280200200141086a220028020022066a20054102743a00002000200641016a3602000c020b200120064102106d2001280200200141086a220028020022066a20054102744101723b00002000200641026a3602000c010b200120064104106d2001280200200141086a220028020022066a20054102744102723600002000200641046a3602000b2002200836020c2002410c6a200110a702200241106a24000b9e0503017f027e047f230041e0006b220224000240024020002802002200290300220342c000544100200041086a29030022045022051b0d0002400240024020034280800154410020051b0d00200342808080800454410020051b0d01411020047920037942c0007c20044200521ba741037622066b4104490d022001200141086a22052802004101106d2001280200200528020022076a413320064102746b3a00002005200741016a2207360200200029030021032002200041086a290300220437030820022003370300200641706a21000340200120074101106d2001280200200528020022076a20033c00002005200741016a22073602002003420888200442388684210320044208882104200041016a22062000492108200621002008450d000b20022003370300200220043703082003200484500d04200241286a41146a4109360200200241346a410f360200200241106a41146a410336020020022002360240200241b887c600360244200241c8006a41146a410036020020024203370214200241d4c0c7003602102002410f36022c200241d4c0c7003602582002420137024c200241f086c6003602482002200241286a3602202002200241c8006a3602382002200241c4006a3602302002200241c0006a360228200241106a41ecc0c700103d000b2001200141086a22002802004102106d2001280200200028020022016a2003a74102744101723b00002000200141026a3602000c030b2001200141086a22002802004104106d2001280200200028020022016a2003a74102744102723600002000200141046a3602000c020b41ab86c600413641dcbcc700102f000b2001200141086a22002802004101106d2001280200200028020022016a2003a74102743a00002000200141016a3602000b200241e0006a24000bb51103077f017e0a7f230041f0006b2202240041042103024002400240024002400240024002400240024002402001280200410e460d00410021040c010b41002104200141046a22052d00004105470d00200241d0006a200141c8006a280200109502200228025022032002280258109c0241ff0171210402402002280254450d00200310260b0240024002400240024002400240024020044102460d002004410171450d00200241e8006a22044200370300200241e0006a22064200370300200241d0006a41086a2203420037030020024200370350200241c0006a41818dc700410910fb012003200241c0006a41086a220729000037030020022002290040370350200241c0006a41dcd5c000410f10fb012004200729000037030020062002290040370300200241206a200241d0006a10fe010240200228022022030d004100210820024100360218200242043703100c030b200220022902242209370214200220033602102009422088a72208450d012008417f6a210a0c040b200041800e3b0001200041013a0000200041036a41013a00000c100b2009a70d010b200241106a2008410110cb0120022802102103200228021821080b20032008410c6c6a22044100360208200442043702002002200841016a220436021820042008490d012008210a200421080b2003210b200241e8006a4200370300200241e0006a4200370300200241d0006a41086a2204420037030020024200370350200241c0006a41818dc700410910fb012004200241c0006a41086a220729000037030020022002290040370350200241c0006a41b8d5c000410b10fb01200641086a2007290000370000200620022900403700002002200241d0006a4120108902024002402003200a410c6c6a220c41086a220d28020022042002280204410020022802001b4f0d00200c280200210e0240200441014b0d00024020040e020300030b2001280248210f410021070c040b2001280248210f41002107034020072004410176221020076a2211200f200e201141246c6a280200491b2107200420106b220441014b0d000c040b0b200041800c3b0001200041013a0000200041036a41003a00000c0c0b2001280248210f410021040c020b2008200441c8b8c0001032000b200f200e200741246c6a2802002204460d032007200f20044b6a21040b200241d0006a200f10a9022002280250220e450d0320022802542112200241d0006a200e200241d0006a41086a2207280200109601200241206a41186a200241d0006a41186a2210290000370300200241206a41106a200241d0006a41106a2211290000370300200241206a41086a2007290000370300200220022900503703200240200241206a200541216a2213460d00200241206a2013412010d2060d020b2010200541196a2900003703002011200541116a2900003703002007200541096a29000037030020022005290001370350200d28020022072004490d0420012802482110024020072003200a410c6c6a41046a280200470d00200c2007410110d10120022802182108200228021021030b200c280200200441246c6a220141246a2001200720046b41246c10d0061a20012010360200200120022903503702042001410c6a200241d0006a41086a2204290300370200200141146a200241e0006a22112903003702002001411c6a200241e8006a220129030037020041012110200d200741016a3602002002280214210520014200370300201142003703002004420037030020024200370350200241c0006a41818dc700410910fb012004200241c0006a41086a220129000037030020022002290040370350200241c0006a41dcd5c000410f10fb01200641086a2001290000370000200620022900403700002008410c6c41046a2201417f4c0d054100210402402001450d00200110242210450d07200121040b200241003602482002201036024020022004360244200241c0006a200810a10102402008450d0020032008410c6c6a210f20032111034020112802002101200241c0006a2011280208220410a1012011410c6a211102402004450d002001200441246c6a211020022802482104034020012802002107200241c0006a20044104106d2002280240200228024822046a20073600002002200441046a2204360248200241c0006a20044120106d2002280240200228024822076a2204200141046a290000370000200441086a2001410c6a290000370000200441106a200141146a290000370000200441186a2001411c6a2900003700002002200741206a2204360248200141246a22012010470d000b0b2011200f470d000b0b200241d0006a412020022802402201200228024810b30102402002280244450d00200110260b02402008450d002008410c6c21042003210103400240200141046a2802002207450d00200741246c450d00200128020010260b2001410c6a2101200441746a22040d000b0b02402005450d002005410c6c450d00200310260b410c10242203450d0720024100360258200242013703502002200241d0006a3602402013200241c0006a109c01200341086a20022802583602002003200229035037020002402012450d00200e10260b410121040b200041003a0000200041306a41013a00002000412c6a2004360200200041286a2004360200200041246a2003360200200041206a4100360200200041186a4204370300200041106a427f370300200041086a4200370300200041316a2002280009360000200041346a2002410c6a2800003600000c080b20004180063b0001200041013a0000200041036a41003a00002012450d06200e10260c060b200041800e3b0001200041013a0000200041036a41003a00000c050b200041800e3b0001200041013a0000200041036a41013a00000c040b20042007103b000b1034000b1033000b102c000b2008410c6c210103400240200341046a2802002204450d00200441246c450d00200328020010260b2003410c6a2103200141746a22010d000b20022802142201450d002001410c6c450d00200b10260b200241f0006a24000bf00602077f017e23004180016b22022400200241206a41eb8cc700410a10fb01200241306a41eca4c500410510fb0120022001360258200241106a200241d8006a410410a202200241f4006a200241d8006a41046a3602002002200241186a36026c2002200241d8006a3602702002200241106a360268200241c0006a200241e8006a107302400240024002400240024002402002280248220141206a2203417f4c0d000240024020030d0041012104410021030c010b200310242204450d020b200241003602182002200436021020022003360214200241106a4100411010c9012002280210200228021822036a22042002290020370000200441086a200241206a41086a2900003700002002200341106a2203360218200241106a2003411010c9012002280210200228021822036a22042002290030370000200441086a200241306a41086a2900003700002002200341106a220336021820022802402104200241106a2003200110c90120022802102203200228021822056a2004200110cf061a2002200520016a220136021802402002280244450d00200410260b2002200136025420022003360250200241206a2003200110820220022802202201450d04200228022421042002200241286a28020036025c20022001360258200241086a200241d8006a108f0120022802080d02200228025c2206200228020c2205490d022005417f4c0d000240024020050d0041002107410121030c010b2005102a2203450d02200228025c2106200521070b0240024020062005490d0020032002280258200510cf062106200228025c220820054f0d012005200841b8afc0001048000b2007450d03200310260c030b2002200820056b36025c2002200228025820056a3602582006450d022005ad4220862007ad8421090c030b1034000b1033000b4100210320024100360238200242013703302002410e3602442002200241d0006a3602402002200241306a360264200241fc006a41013602002002420137026c2002418c8dc6003602682002200241c0006a360278200241e4006a41c4e1c000200241e8006a10351a2002280230200228023810840202402002280234450d00200228023010260b0b02402004450d00200110260b20030d010b200041003602000c010b20002009370204200020033602000b02402002280214450d00200228021010260b20024180016a24000b130020004107360204200041d8b8c0003602000b3400200041818dc70036020420004100360200200041146a4109360200200041106a4190cfc000360200200041086a42093702000bb00101067f230041206b22022400200241186a22034200370300200241106a22044200370300200241086a220542003703002002420037030002404120102422060d001033000b2000422037020420002006360200200041004120106d2000280200200041086a220628020022076a220020022903003700002006200741206a360200200041086a2005290300370000200041106a2004290300370000200041186a2003290300370000200241206a24000b4a01017f02404104102422020d001033000b2000420437020420002002360200200041004104106d2000280200200041086a220028020022026a41e8073600002000200241046a3602000b2901017f230041106b2202240020024100360208200242043703002000200210b901200241106a24000b2901017f230041106b2202240020024100360208200242043703002000200210b801200241106a24000b3400200041b4a3c70036020420004100360200200041146a4101360200200041106a41f4dec000360200200041086a42183702000b9f0201027f230041106b22022400200028020021002002410036020c02400240024002402001418001490d002001418010490d012001418080044f0d0220022001413f71418001723a000e20022001410c7641e001723a000c20022001410676413f71418001723a000d410321010c030b200220013a000c410121010c020b20022001413f71418001723a000d2002200141067641c001723a000c410221010c010b20022001413f71418001723a000f2002200141127641f001723a000c20022001410676413f71418001723a000e20022001410c76413f71418001723a000d410421010b2000200041086a22032802002001106d2000280200200328020022006a2002410c6a200110cf061a2003200020016a360200200241106a240041000b6301017f230041206b2202240020022000280200360204200241086a41106a200141106a290200370300200241086a41086a200141086a29020037030020022001290200370308200241046a41c4e1c000200241086a10352101200241206a240020010bb00101037f230041e0046b220124002000200028020441016a22023602044100210302400240200220002802084b0d00200141b0026a200010b40220012802b0022102200141046a200141b0026a41047241ac0210cf061a20024117460d00200141b0026a200141046a41ac0210cf061a41b00210242203450d0120032002360200200341046a200141b0026a41ac0210cf061a20002000280204417f6a3602040b200141e0046a240020030f0b102c000bfa9e0311067f027e057f097e047f047e057f017e0b7f077e0e7f027e017f0c7e087f037e1b7f23004180186b2202240002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200128020022032802042204450d00200328020022052d0000210620032004417f6a3602042003200541016a360200200641164b0d1020060e170102030405060708090a0b0c0d1a191817161514131211010b200041173602000c330b200128020022032802042204450d31200328020022052d0000210620032004417f6a3602042003200541016a360200200641094b0d31410a210502400240024002400240024002400240024002400240024020060e0a00010203040506070809000b2001280200220128020422064104490d3c20012802002204280000210320012006417c6a3602042001200441046a3602002003418194ebdc034f0d3c410121050c080b200241086a2001108d0120022802080d3b200128020022042802042205200228020c2206490d3b2006417f4c0d240240024020060d0041002101410121030c010b2006102a2203450d26200128020022042802042105200621010b0240024020052006490d0020032004280200200610cf0621052004280204220720064f0d012006200741b8afc0001048000b20010d0a0c3c0b2004200720066b3602042004200428020020066a3602002005450d3b2006ad4220862001ad842108410221050c070b2001280200220128020422034108490d3a2001280200220629000021082001200341786a3602042001200641086a360200410321050c060b200241106a2001108d0120022802100d3920012802002204280204220520022802142206490d392006417f4c0d220240024020060d0041002101410121030c010b2006102a2203450d24200128020022042802042105200621010b0240024020052006490d0020032004280200200610cf0621052004280204220720064f0d012006200741b8afc0001048000b20010d080c3a0b2004200720066b3602042004200428020020066a3602002005450d392006ad4220862001ad842108410421050c050b200241186a2001108d0120022802180d38200128020022042802042205200228021c2206490d382006417f4c0d210240024020060d0041002101410121030c010b2006102a2203450d23200128020022042802042105200621010b0240024020052006490d0020032004280200200610cf0621052004280204220720064f0d012006200741b8afc0001048000b20010d070c390b2004200720066b3602042004200428020020066a3602002005450d382006ad4220862001ad842108410521050c040b200128020022032802042204450d37200328020022052d0000210620032004417f6a3602042003200541016a360200200641014b0d374106210541002103024020060e020400040b2001280200220328020422064104490d3720032802002204350000210820032006417c6a3602042003200441046a3602002001280200220128020422034104490d3720012802002206350000210920012003417c6a3602042001200641046a36020020082009422086842108410121030c030b200241306a2001108d0120022802300d3620022802342207200128020028020441186e2203200320074b1bad42187e2208422088a70d1f2008a72206417f4c0d1f0240024020060d00410421030c010b200610242203450d210b2001200128020441016a2204360204200241003602a813200220033602a0132002200641186e3602a413200420012802084b0d1202402007450d00410021050340200241286a2001108d01200241a0136a210a20022802280d3620012802002204280204220b200228022c2206490d362006417f4c0d210240024020060d004100210c4101210d0c010b2006102a220d450d2320012802002204280204210b2006210c0b02400240200b2006490d00200d2004280200200610cf06210b2004280204220d20064f0d012006200d41b8afc0001048000b200c450d37200d10260c370b2004200d20066b3602042004200428020020066a360200200b450d362006ad422086200cad842108200241206a2001108d010240024020022802200d0020012802002204280204220d20022802242206490d002006417f4c0d230240024020060d004100210e4101210c0c010b2006102a220c450d2520012802002204280204210d2006210e0b02400240200d2006490d00200c2004280200200610cf06210d2004280204220c20064f0d012006200c41b8afc0001048000b200e450d01200c10260c010b2004200c20066b3602042004200428020020066a360200200d0d010b2008a7450d37200b10260c370b2006ad422086200ead8421090240200520022802a413470d00200241a0136a2005410110f00120022802a013210320022802a81321050b2003200541186c6a2206200d36020c200620083702042006200b360200200641106a20093702002002200541016a22053602a8132007417f6a22070d000b200128020421040b20012004417f6a3602042003450d3620022902a4132108410721050c020b200241a0136a200110d90120022802a0132203450d3520022902a4132108410821050c010b200241386a2001108d0120022802380d34200128020022042802042205200228023c2206490d342006417f4c0d1d0240024020060d0041002107410121030c010b2006102a2203450d1f200128020022042802042105200621070b0240024020052006490d0020032004280200200610cf0621052004280204220b20064f0d012006200b41b8afc0001048000b20070d030c350b2004200b20066b3602042004200428020020066a3602002005450d342006ad4220862007ad8421082001280200220128020422064104490d0120012802002205280000210420012006417c6a3602042001200541046a360200410921050b20004100360200200041186a2004360200200041106a20083702002000410c6a2003360200200041086a2005360200200041206a200241d0156a41900210cf061a0c340b2008a7450d320b200310260c310b0240200128020022032802042204450d00200328020022052d0000210620032004417f6a3602042003200541016a360200200641014b0d000240024002400240024020060e020001000b200241d0156a200110e305200241dc156a2802002204450d04200241a80d6a41086a2206200241d0156a41086a280200360200200220022903d0153703a80d200241e0156a220d2802002105200241e4156a280200210320024188106a200241e8156a41e40010cf061a200241d4166a280200210b200241d0156a4180016a2802002107200241cc166a280200210a200241a0136a200241d8166a41800110cf061a200241d0156a200110df05024020022802d415450d00200241a00b6a41086a2006280200360200200220022903a80d3703a00b200d2802002101200241dc156a280200210620022802d815210d20022903d0152108200241d8046a20024188106a41e40010cf061a200241f0106a200241a0136a41800110cf061a4101210c0c020b02402003450d00200341246c21032004210103400240024020012d0000220641044b0d0002400240024020060e050400010204040b2001410c6a280200450d03200141086a28020010260c030b2001410c6a280200450d02200141086a28020010260c020b2001410c6a280200450d01200141086a28020010260c010b200141086a280200450d00200141046a28020010260b200141246a21012003415c6a22030d000b0b02402005450d00200541246c450d00200410260b0240200b450d00200b41246c2103200a210103400240024020012d0000220641044b0d0002400240024020060e050400010204040b2001410c6a280200450d03200141086a28020010260c030b2001410c6a280200450d02200141086a28020010260c020b2001410c6a280200450d01200141086a28020010260c010b200141086a280200450d00200141046a28020010260b200141246a21012003415c6a22030d000b0b2007450d04200741246c0d030c040b200241d0156a200110e305200241dc156a2802002204450d03200241a80d6a41086a2206200241d0156a41086a280200360200200220022903d0153703a80d200241e0156a220d2802002105200241e4156a280200210320024188106a200241e8156a41e40010cf061a200241d4166a280200210b200241d0156a4180016a2802002107200241cc166a280200210a200241a0136a200241d8166a41800110cf061a200241d0156a200110df0520022802d415450d01200241a00b6a41086a2006280200360200200220022903a80d3703a00b200d2802002101200241dc156a280200210620022802d815210d20022903d0152108200241d8046a20024188106a41e40010cf061a200241f0106a200241a0136a41800110cf061a4102210c0b20024180066a41086a220e200241a00b6a41086a280200360200200220022903a00b37038006200241f0036a200241d8046a41e40010cf061a200241c0066a200241f0106a41800110cf061a2000411c6a2001360200200041186a2006360200200041146a200d3602002000410c6a2008370200200041086a200c36020020004101360200200041206a200229038006370200200041286a200e280200360200200041346a2003360200200041306a20053602002000412c6a2004360200200041386a200241f0036a41e40010cf061a200041a4016a200b360200200041a0016a20073602002000419c016a200a360200200041a8016a200241c0066a41800110cf061a0c340b02402003450d00200341246c21032004210103400240024020012d0000220641044b0d0002400240024020060e050400010204040b2001410c6a280200450d03200141086a28020010260c030b2001410c6a280200450d02200141086a28020010260c020b2001410c6a280200450d01200141086a28020010260c010b200141086a280200450d00200141046a28020010260b200141246a21012003415c6a22030d000b0b02402005450d00200541246c450d00200410260b0240200b450d00200b41246c2103200a210103400240024020012d0000220641044b0d0002400240024020060e050400010204040b2001410c6a280200450d03200141086a28020010260c030b2001410c6a280200450d02200141086a28020010260c020b2001410c6a280200450d01200141086a28020010260c010b200141086a280200450d00200141046a28020010260b200141246a21012003415c6a22030d000b0b2007450d01200741246c450d010b200a10260b200041173602000c310b200128020022032802042206450d2c200328020022042d0000210520032006417f6a3602042003200441016a36020020050d2c200128020022032802042204450d2c200328020022052d0000210620032004417f6a3602042003200541016a360200024002400240200641037122034103460d000240024020030e03030001030b200128020022012802042203450d30200128020022042d0000210520012003417f6a3602042001200441016a3602002005410874200672220141ffff0371418002490d30200141fcff0371410276ad21080c030b2001280200220128020422034103490d2f2001280200220441026a2d0000210520042f000021072001200441036a36020020012003417d6a3602042007200541107472410874200672220141808004490d2f2001410276ad21080c020b02402006410276220b41044b0d0002400240200b0e050002020201000b2001280200220128020422034104490d3020012802002204280000210620012003417c6a3602042001200441046a3602002006418080808004490d302006ad21080c030b2001280200220128020422034108490d2f2001280200220629000021082001200341786a3602042001200641086a360200200842ffffffffffffffff00560d020c2f0b200641134b0d2e200b41046a210741002106420021080340200128020022032802042204450d2f20032802002205310000210920032004417f6a3602042003200541016a36020020092006410374413871ad862008842108200641016a220641ff01712007490d000b2008427f4128200b4103746b413871ad88580d2e0c010b2006410276ad21080b20004102360200200041086a2008370300200041106a200241d0156a41a00210cf061a0c300b200128020022032802042204450d2a200328020022052d0000210620032004417f6a3602042003200541016a360200200641044b0d2a0240024002400240024020060e050001020304000b2001280200220128020422064104490d2e20012802002204280000210320012006417c6a3602042001200441046a36020020023502b80a200241bc0a6a330100200241be0a6a31000042108684422086842108200241b00a6a290300210920022903a80a210f20022802c40a210620022f01c20a210720022d00c10a210120022f00bf0a210b4101210a0c2d0b41002103200241003a00c01302400340200128020022062802042204450d01200241a0136a20036a200628020022052d00003a000020062004417f6a3602042006200541016a3602002002200341016a22033a00c01320034120470d000b2001280200220128020422074104490d2e20022900b7132208423888200241bf136a31000042088684a7210b200241af136a290000210920022900a713210f20022800a313210320022f00a113210420022d00a01321052001280200220a280000210620012007417c6a3602042001200a41046a3602004102210a0c2d0b200341ff0171450d2d200241003a00c0130c2d0b2001280200220128020422064104490d2c20012802002204280000210320012006417c6a3602042001200441046a36020020023502d80a200241dc0a6a330100200241de0a6a31000042108684422086842108200241d00a6a290300210920022903c80a210f4103210a0c2a0b41002103200241003a00c0130240024002400340200128020022062802042204450d01200241a0136a20036a200628020022052d00003a000020062004417f6a3602042006200541016a3602002002200341016a22033a00c01320034120470d000b20012802002207280204220b4104490d2e20022900b7132108200241bf136a3100002110200241af136a290000210920022900a713210f20022800a313210320022f00a113210420022d00a01321052007280200220a28000021062007200b417c6a3602042007200a41046a36020020012802002201280204220b450d2e2001280200220a2d000021072001200b417f6a3602042001200a41016a360200200741014b0d2e200842388820104208868421104100210120070e020201020b200341ff0171450d2d200241003a00c0130c2d0b410121010b2010a7210b4104210a0c2a0b2001280200220128020422064104490d2a20012802002204280000210320012006417c6a3602042001200441046a36020020023502900b200241940b6a330100200241960b6a31000042108684422086842108200241880b6a290300210920022903800b210f4105210a0c280b0240200128020022032802042204450d00200328020022052d0000210620032004417f6a3602042003200541016a360200200641034b0d0002400240024002400240024020060e0400010203000b41002103200241003a00c01302400340200128020022062802042204450d01200241a0136a20036a200628020022052d00003a000020062004417f6a3602042006200541016a3602002002200341016a22033a00c01320034120470d000b200241bf136a3100002108200241af136a290000210920022900b713211120022900a713210f20022800a313210720022f00a113210b20022d00a013210a200241c0006a200110ec042002290340a70d06200241d0006a29030021122002290348211320024188116a29030021142002290380112115410121010c040b200341ff0171450d05200241003a00c0130c050b41002103200241003a00c01302400340200128020022062802042204450d01200241a0136a20036a200628020022052d00003a000020062004417f6a3602042006200541016a3602002002200341016a22033a00c01320034120470d000b200241bf136a3100002108200241af136a290000210920022900a713210f20022800a313210720022f00a113210b20022d00a013210a20022900b7132110200241f0006a200110ec042002290370a70d05200241f0006a41106a290300211220022903782113200241d8006a200110ec042002290358a70d05200241d8006a41106a2903002116200229036021172010428080808080608320104280feffffff1f8384201042ff0183842111410221010c030b200341ff0171450d04200241003a00c0130c040b41002103200241003a00c013024002400340200128020022062802042204450d01200241a0136a20036a200628020022052d00003a000020062004417f6a3602042006200541016a3602002002200341016a22033a00c01320034120470d000b200241bf136a3100002108200241af136a290000210920022900b713211120022900a713210f20022800a313210720022f00a113210b20022d00a013210a41002103200241003a00c0130340200128020022062802042204450d02200241a0136a20036a200628020022052d00003a000020062004417f6a3602042006200541016a3602002002200341016a22033a00c01320034120470d000b200241c80a6a410f6a2203200241a0136a410f6a290000370000200220022900a7133700cf0a200220022800a3133600cb0a200220022f00a1133b00c90a200220022d00a0133a00c80a200241bf136a310000211220022900b713211720024188016a200110ec04200229038801a70d0520024198016a29030021142002290390012115200241a80a6a410f6a22012003290000370000200241a80a6a41086a200241c80a6a41086a290300370300200220022903c80a22103703a80a201242ff018321162001290000211220022900af0a2113410321010c030b200341ff0171450d04200241003a00c0130c040b200341ff0171450d03200241003a00c0130c030b41002103200241003a00c0130340200128020022062802042204450d02200241a0136a20036a200628020022052d00003a000020062004417f6a3602042006200541016a3602002002200341016a22033a00c01320034120470d000b200241800b6a410f6a200241a0136a410f6a2900002209370000200220022900a713220f3700870b200220022800a31322073600830b200220022f00a113220b3b00810b200220022d00a013220a3a00800b200241bf136a310000210820022900b7132111200241a0016a200110ec0420022903a001a70d02200241b0016a290300211220022903a8012113200241e80a6a2903002116200241f80a6a290300211420022903e00a211720022903f00a2115410421010b200020103e00292000200b3b000a2000200a3a0009200041043602002000412f6a20104230883c00002000412d6a20104220883d0000200041d8006a2014370200200041d0006a2015370200200041c8006a2016370200200041c0006a2017370200200041386a2012370200200041306a2013370200200041286a20083c0000200041206a2011370000200041186a2009370000200041106a200f3700002000410c6a2007360000200041086a20013a0000200041e0006a200241d0156a41d00110cf061a0c300b200341ff0171450d00200241003a00c0130b200041173602000c2e0b0240200128020022032802042206450d00200328020022042d0000210520032006417f6a3602042003200441016a36020020050d00200241b8016a2001108d0120022802b8010d0020022802bc012205200128020028020441f0006e2203200320054b1bad42f0007e2208422088a70d162008a72203417f4c0d160240024020030d004104210b0c010b20031024220b450d180b2001200128020441016a220636020420024100360290102002200b360288102002200341f0006e36028c10024002400240200620012802084b0d0002402005450d00200241a0136a41086a210a410021030340200241a0136a200110e50220022802a413210620022802a0132107200241f0106a200a41e80010cf061a2006450d03200241c0066a200241f0106a41e80010cf061a02402003200228028c10470d0020024188106a2003410110c101200228028810210b20022802901021030b200b200341f0006c6a2204200636020420042007360200200441086a200241c0066a41e80010cf061a2002200341016a2203360290102005417f6a22050d000b200128020421060b20012006417f6a360204200b450d03200229028c1021082000200b36020420004105360200200041086a2008370200200041106a200241d0156a41a00210cf061a0c310b20024188106a21040c010b20024188106a21042003450d00200341f0006c210320022802881041046a21010340200110d6010240200141046a2802002206450d00200641246c450d00200128020010260b200141f0006a2101200341907f6a22030d000b0b200441046a2802002201450d00200141f0006c450d00200428020010260b200041173602000c2d0b0240200128020022012802042203450d0020012003417f6a3602042001200128020041016a3602000b200041173602000c2c0b200128020022032802042204450d23200328020022052d0000210620032004417f6a3602042003200541016a360200200641014b0d23410021180240024020060e020001000b41002103200241003a00c01302400240024002400240024002400340200128020022062802042204450d01200241a0136a20036a200628020022052d00003a000020062004417f6a3602042006200541016a3602002002200341016a22033a00c01320034120470d000b200241bf136a3100002110200241af136a290000210920022900b713210f20022900a713210820022800a313210a20022f00a113210b20022d00a013210741002103200241003a00c0130340200128020022062802042204450d02200241a0136a20036a200628020022052d00003a000020062004417f6a3602042006200541016a3602002002200341016a22033a00c01320034120470d000b200241bf136a3100002113200241af136a290000211720022900b713211220022900a713211120022800a313210e20022f00a113210c20022d00a013210d41002103200241003a00c0130340200128020022062802042204450d03200241a0136a20036a200628020022052d00003a000020062004417f6a3602042006200541016a3602002002200341016a22033a00c01320034120470d000b200241800b6a410f6a200241a0136a410f6a2900002214370000200241c80a6a410f6a2014370000200220022900a7133700870b200241c80a6a41086a200241800b6a41086a290300370300200220022800a3133600830b200220022f00a1133b00810b200220022d00a0133a00800b200220022903800b3703c80a200241bf136a310000211520022900b713211441002103200241003a00c0130340200128020022062802042204450d04200241a0136a20036a200628020022052d00003a000020062004417f6a3602042006200541016a3602002002200341016a22033a00c01320034120470d000b200241e00a6a411f6a200241a0136a411f6a3100003c0000200241e00a6a410f6a200241a0136a410f6a290000370000200220022900b7133700f70a200220022900a7133700e70a200220022800a3133600e30a200220022f00a1133b00e10a200220022d00a0133a00e00a41002103200241003a00c0130340200128020022062802042204450d05200241a0136a20036a200628020022052d00003a000020062004417f6a3602042006200541016a3602002002200341016a22033a00c01320034120470d000b200241f0036a41086a2206200241c80a6a41086a290300370300200241f0036a410f6a2218200241c80a6a410f6a290000370000200241f0106a41086a2219200241e00a6a41086a290300370300200241f0106a41106a221a200241e00a6a41106a290300370300200241f0106a41186a221b200241e00a6a41186a290300370300200220022903c80a3703f003200220022903e00a3703f010200241bf136a310000211c200241a0136a410f6a290000211d20022900b713211e20022900a713211620022800a313210520022f00a113210420022d00a0132103200241a80d6a410f6a2018290000370000200241a80d6a41086a2006290300370300200220022903f0033703a80d200241c0066a41186a201b290300370300200241c0066a41106a201a290300370300200241c0066a41086a2019290300370300200220022903f0103703c006200241c0016a2001108d0120022802c0010d2b20012802002219280204221a20022802c4012206490d2b2006417f4c0d1b20060d0541002101410121180c060b200341ff0171450d2a200241003a00c0130c2a0b200341ff0171450d29200241003a00c0130c290b200341ff0171450d28200241003a00c0130c280b200341ff0171450d27200241003a00c0130c270b200341ff0171450d26200241003a00c0130c260b2006102a2218450d1620012802002219280204211a200621010b02400240201a2006490d0020182019280200200610cf06211a2019280204221b20064f0d012006201b41b8afc0001048000b2001450d25201810260c250b2019201b20066b3602042019201928020020066a360200201a450d242006ad4220862001ad84211f200241a00b6a410f6a200241a80d6a410f6a290000370000200241a00b6a41086a200241a80d6a41086a29030037030020024188106a41086a200241c0066a41086a29030037030020024188106a41106a200241c0066a41106a29030037030020024188106a41186a200241c0066a41186a290300370300200220022903a80d3703a00b200220022903c006370388100b20024180066a410f6a2201200241a00b6a410f6a29000037000020024180066a41086a2206200241a00b6a41086a290300370300200241d8046a41086a221920024188106a41086a290300370300200241d8046a41106a221a20024188106a41106a290300370300200241d8046a41186a221b20024188106a41186a290300370300200220022903a00b3703800620022002290388103703d804200041cf006a20133c0000200041c7006a20123700002000413f6a2017370000200041376a20113700002000412f6a20103c0000200041276a200f3700002000411f6a2009370000200041176a2008370000200041336a200e360000200041316a200c3b0000200041306a200d3a0000200041136a200a360000200041116a200b3b0000200041106a20073a0000200041086a201f3702002000201836020420004107360200200041ef006a20153c0000200041e7006a2014370000200041d0006a200229038006370200200041d8006a2006290300370200200041df006a200129000037000020004193016a2005360000200041af016a201c3c0000200041a7016a201e3700002000419f016a201d37000020004197016a201637000020004191016a20043b000020004190016a20033a0000200041f0006a20022903d804370200200041f8006a201929030037020020004180016a201a29030037020020004188016a201b290300370200200041b0016a200241d0156a41800110cf061a0c2b0b0240200128020022032802042206450d00200328020022042d0000210520032006417f6a3602042003200441016a36020020050d00200241c8016a2001108d0120022802c8010d0020022802cc0121012000410836020020002001360204200041086a200241d0156a41a80210cf061a0c2b0b200041173602000c2a0b0240200128020022032802042204450d00200328020022052d0000210620032004417f6a3602042003200541016a360200200641024b0d00024002400240024020060e03000102000b200241d0156a200110cf0420022903d8154202510d03200241a0136a200241d0156a41800210cf061a200241d0156a200110df0520022802d415450d03200241e0156a2802002101200241dc156a280200210320022802d815210420022903d0152108200241f0106a200241a0136a41800210cf061a2008422088a721052008a72106410121070c020b200241d0156a200110cf0420022903d8154202510d02200241a0136a200241d0156a41800210cf061a200241d0156a200110df0520022802d415450d02200241e0156a2802002101200241dc156a280200210320022802d815210420022903d0152108200241f0106a200241a0136a41800210cf061a2008422088a721052008a72106410221070c010b2001280200220328020422044104490d0120032802002205280000210620032004417c6a3602042003200541046a3602002001280200220128020422034104490d0120012802002204280000210520012003417c6a3602042001200441046a360200200241f0106a200241d0156a41800210cf061a410321070b200241c0066a200241f0106a41800210cf061a2000411c6a2001360200200041186a2003360200200041146a2004360200200041106a20053602002000410c6a2006360200200041086a200736020020004109360200200041206a200241c0066a41800210cf061a200041a8026a20024188106a41086a290300370300200041a0026a2002290388103703000c2a0b200041173602000c290b200128020022032802042206450d1f200328020022042d0000210520032006417f6a3602042003200441016a36020020050d1f2001280200220328020422064104490d1f20032802002204280000210520032006417c6a3602042003200441046a360200200241e0016a2001108d0120022802e0010d1f20012802002206280204220420022802e4012203490d1f2003417f4c0d100240024020030d00410021074101210b0c010b2003102a220b450d12200128020022062802042104200321070b0240024020042003490d00200b2006280200200310cf06210b2006280204220420034f0d012003200441b8afc0001048000b2007450d20200b10260c200b2006200420036b3602042006200628020020036a360200200b450d1f2003ad4220862007ad842109200241d8016a2001108d0120022802d8010d1e20022802dc01220a2001280200280204410c6e22032003200a4b1bad420c7e2208422088a70d102008a72203417f4c0d100240024020030d004104210d0c010b20031024220d450d120b2001200128020441016a220636020441002104200241003602a8132002200d3602a01320022003410c6e22073602a413200620012802084b0d020240200a450d00410021040340200241d0016a2001108d01200241a0136a211820022802d0010d1e20012802002206280204220720022802d4012203490d1e2003417f4c0d120240024020030d004100210e4101210c0c010b2003102a220c450d142001280200220628020421072003210e0b0240024020072003490d00200c2006280200200310cf0621072006280204220c20034f0d012003200c41b8afc0001048000b200e450d1f200c10260c1f0b2006200c20036b3602042006200628020020036a3602002007450d1e2003ad422086200ead84200820071b21080240200420022802a413470d00200241a0136a2004410110cb0120022802a013210d20022802a81321040b200d2004410c6c6a22032008370204200320073602002002200441016a22043602a813200a417f6a220a0d000b2001280204210620022802a41321070b20012006417f6a360204200d450d1e2009a7210e02400240024002402001280200220328020422064104490d002003280200220a280000211820032006417c6a3602042003200a41046a3602002001280200220328020422064104490d012003280200220a280000211920032006417c6a3602042003200a41046a36020020012802002203280204220641044f0d020240200e450d00200b10260b02402004450d002004410c6c2103200d210103400240200141046a280200450d00200128020010260b2001410c6a2101200341746a22030d000b0b2007450d232007410c6c0d030c230b0240200e450d00200b10260b02402004450d002004410c6c2103200d210103400240200141046a280200450d00200128020010260b2001410c6a2101200341746a22030d000b0b2007450d222007410c6c0d020c220b0240200e450d00200b10260b02402004450d002004410c6c2103200d210103400240200141046a280200450d00200128020010260b2001410c6a2101200341746a22030d000b0b2007450d212007410c6c0d010c210b2003280200220a280000211a20032006417c6a3602042003200a41046a360200200b450d202009422088a7211b41002103200241003a00e0130240034020012802002206280204220a450d01200241a0136a20036a2006280200220c2d00003a00002006200a417f6a3602042006200c41016a3602002002200341016a22033a00e013200341c000470d000b200b450d21200241bb136a2d0000210120022f00b9132103200241a0136a41346a3100002108200241a0136a41246a2902002109200241a0136a41186a310000210f200241a0136a41086a290300211020022902cc13211120022902bc13211720022903b013211220022903a013211320022802dc13210620022f01da13210a20022d00d813210c20022f01d613212020022d00d5132121200020022d00d9133a0065200020213a0061200020053602042000410a360200200041c7006a200320014110747222014110763a0000200041c5006a20013b0000200041e0006a20083c0000200041d8006a2011370200200041d0006a2009370200200041c8006a2017370200200041c4006a200f3c00002000413c6a2012370200200041346a20103702002000412c6a2013370200200041e8006a2006360200200041e6006a200a3b0100200041e4006a200c3a0000200041e2006a20203b0100200041286a201a360200200041246a2019360200200041206a20183602002000411c6a2004360200200041186a2007360200200041146a200d360200200041106a201b3602002000410c6a200e360200200041086a200b360200200041ec006a200241d0156a41c40110cf061a0c2a0b0240200341ff0171450d00200241003a00e0130b0240200e450d00200b10260b02402004450d002004410c6c2103200d210103400240200141046a280200450d00200128020010260b2001410c6a2101200341746a22030d000b0b2007450d202007410c6c450d200b200d10260c1f0b0240200128020022012802042203450d0020012003417f6a3602042001200128020041016a3602000b200041173602000c270b200128020022032802042204450d19200328020022052d0000210620032004417f6a3602042003200541016a360200200641034b0d19024020060e040012110e000b20024198026a2001108d012002280298020d19200228029c02222220012802002802044198026e2203200320224b1bad4298027e2208422088a70d0e2008a72203417f4c0d0e0240024020030d00410821200c010b200310242220450d100b2001200128020441016a2206360204200241003602800d200220203602f80c200220034198026e3602fc0c200620012802084b0d172022450d12200241d0156a411f6a2123200241eb156a2124410021070340024002402001280200220328020422064104490d0020032802002204280000211820032006417c6a3602042003200441046a36020041002103200241003a00f0150240024002400240024002400240024002400240024002400240024002400240024002400240024002400340200128020022062802042204450d01200241d0156a20036a200628020022052d00003a000020062004417f6a3602042006200541016a3602002002200341016a22033a00f01520034120470d000b200241a0136a410f6a2203200241d0156a410f6a221a290000370000200241a0136a41086a220d200241d0156a41086a221b290300370300200241f0106a410f6a22192003290000370000200241f0106a41086a220e200d290300370300200241c0066a41086a220c200e290300370300200241c0066a410f6a22032019290000370000200220022903d0153703c0062023310000211c20022900e715211f200241c80a6a410f6a22202003290000370000200241c80a6a41086a200c290300370300200220022903c0063703c80a20024190026a2001108d014100210a2002280290020d044100210a2001280200220628020422042002280294022203490d032003417f4c0d2620030d01410021054101210a0c020b200341ff0171450d14200241003a00f015200b2105410021040c150b2003102a220a450d25200128020022062802042104200321050b024020042003490d00200a2006280200200310cf061a200628020422042003490d032003ad4220862005ad8421252006200420036b3602042006200628020020036a3602000c010b02402005450d00200a10260b4100210a0b2025201e200a1b211e0b201ea72026200a1b2126201e422088a72027200a1b2127200a450d1041002103200241003a00f015024002400240024002400340200128020022062802042204450d01200241d0156a20036a200628020022052d00003a000020062004417f6a3602042006200541016a3602002002200341016a22033a00f01520034120470d000b200241e00a6a411f6a222120233100003c0000200241e00a6a410f6a2228201a290000370000200220022900e7153700f70a200220022900d7153700e70a200220022800d3153600e30a200220022f00d1153b00e10a200220022d00d0153a00e00a41002103200241003a0090160340200128020022062802042204450d02200241d0156a20036a200628020022052d00003a000020062004417f6a3602042006200541016a3602002002200341016a22033a009016200341c000470d000b200d201b290300370300200241a0136a41106a2229200241d0156a41106a222a290300370300200241a0136a41186a222b200241d0156a41186a222c290300370300200241a0136a41206a2203200241d0156a41206a222d290300370300200241a0136a41286a2206200241d0156a41286a222e290300370300200241a0136a41306a2204200241d0156a41306a222f290300370300200241a0136a41386a2205200241d0156a41386a2230290300370300200220022903d0153703a013200e200d2903002231370300200241f0106a41106a20292903002232370300200241f0106a41186a202b2903002233370300200241f0106a41206a20032903002234370300200241f0106a41286a20062903002235370300200241f0106a41306a20042903002236370300200241f0106a41386a22032005290300370300200220022903a01322373703f010200241c0066a41306a22382036370300200241c0066a41286a22392035370300200241c0066a41206a223a2034370300200241c0066a41186a223b2033370300200241c0066a41106a223c2032370300200c2031370300200241c0066a41386a223d2003290300370300200220373703c00641002103200241003a00f0150340200128020022062802042204450d03200241d0156a20036a200628020022052d00003a000020062004417f6a3602042006200541016a3602002002200341016a22033a00f01520034120470d000b2001280200220328020422064110490d13201a29000021312023310000213220022900d715213320022900e715213420022d00d015213e20022f00d115213f20022800d31521402003280200220441086a2900002135200429000021362003200441106a3602002003200641706a36020420024188026a2001108d012002280288020d13200228028c02224120012802002802044104762203200320414b1b22034104742206417f4c0d2620030d03410421040c040b0240200341ff0171450d00200241003a00f0150b20260d130c140b0240200341ff0171450d00200241003a0090160b20260d120c130b0240200341ff0171450d00200241003a00f0150b20260d110c120b200610242204450d230b2001200128020441016a2206360204200241003602d815200220033602d415200220043602d015200620012802084b0d0d02402041450d00410021420340200128020022032802042205450d0e200328020022432d0000210620032005417f6a3602042003204341016a360200200641024b0d0e4100214302400240024020060e03020001020b410121430c010b410221430b20024180026a2001108d012002280280020d0e2001280200220628020422052002280284022203490d0e2003417f4c0d230240024020030d0041002144410121450c010b2003102a2245450d25200128020022062802042105200321440b0240024020052003490d0020452006280200200310cf0621052006280204224520034f0d012003204541b8afc0001048000b2044450d0f204510260c0f0b2006204520036b3602042006200628020020036a3602002003ad4220862044ad84204620051b2246204720051b21472005204820051b21482005450d0e0240204220022802d415470d00200241d0156a2042410110cf0120022802d015210420022802d81521420b200420424104746a220320433a000c20032047370204200320483602002002204241016a22423602d8152041417f6a22410d000b200128020421060b20012006417f6a3602042004450d0e20022902d415213741002103200241003a00f015024002400340200128020022062802042205450d01200241d0156a20036a200628020022422d00003a000020062005417f6a3602042006204241016a3602002002200341016a22033a00f01520034120470d000b2001280200220328020422050d010c0a0b0240200341ff0171450d00200241003a00f0150b02402037422088a72203450d00200341047421062004210303400240200341046a280200450d00200328020010260b200341106a2103200641706a22060d000b0b203742ffffffff0083500d0f200410260c0f0b201a29000021492023310000214a20022900d715214b20022900e715214c20022d00d015214220022f00d115214120022800d31521432003280200221a2d0000210620032005417f6a3602042003201a41016a360200200641014b0d08410021050240024020060e020100010b200241f8016a2001108d0120022802f8010d0941002103024020012802002205280204221a20022802fc012206490d002006417f4c0d230240024020060d0041002144410121030c010b2006102a2203450d2520012802002205280204211a200621440b0240201a2006490d0020032005280200200610cf061a2005280204221a2006490d042006ad4220862044ad84214d2005201a20066b3602042005200528020020066a3602000c010b02402044450d00200310260b410021030b204d204e20031b224e204f20031b224f205020031b21502003200b20031b21052003450d0a0b2050a7210b024002402001280200220328020422064104490d002003280200221a280000214420032006417c6a3602042003201a41046a360200200241800b6a410f6a2049370000200241900f6a410f6a220320493700002002204b3700870b200241900f6a41086a2206200241800b6a41086a290300370300200220433600830b200220413b00810b200220423a00800b200220022903800b3703900f202029000021492028290000214b2021310000215120022900cf0a215220022900e70a215320022900f70a215420022d00c80a214220022f00c90a214120022800cb0a214320022d00e00a214520022f00e10a215520022800e30a215620024188106a41386a221a203d29030037030020024188106a41306a2220203829030037030020024188106a41286a2221203929030037030020024188106a41206a2228203a29030037030020024188106a41186a2238203b29030037030020024188106a41106a2239203c29030037030020024188106a41086a223a200c290300370300200220022903c00637038810200241a80a6a410f6a2031370000200220333700af0a200220403600ab0a2002203f3b00a90a2002203e3a00a80a200241a80a6a411f6a20323c0000200220343700bf0a200241f00e6a41186a220c200241a80a6a41186a290300370300200241f00e6a41106a223b200241a80a6a41106a290300370300200241f00e6a41086a223c200241a80a6a41086a290300370300200220022903a80a3703f00e200241d80e6a410f6a223d2003290000370000200241d80e6a41086a223e2006290300370300200220022903900f3703d80e200241d8046a41386a223f201a290300370300200241d8046a41306a22402020290300370300200241d8046a41286a22572021290300370300200241d8046a41206a22582028290300370300200241d8046a41186a22592038290300370300200241d8046a41106a225a2039290300370300200241d8046a41086a2239203a29030037030020022002290388103703d804200241b80e6a41186a223a200c290300370300200241b80e6a41106a225b203b290300370300200241b80e6a41086a223b203c290300370300200220022903f00e3703b80e200241f0016a2001108d012037422088a721202037a7212120022802f001450d010c070b02402005450d00200b450d00200510260b02402037422088a72203450d00200341047421062004210303400240200341046a280200450d00200328020010260b200341106a2103200641706a22060d000b0b203742ffffffff0083500d0c0c0b0b20022802f4012238200128020028020441c1006e2203200320384b1bad42c1007e2231422088a70d212031a72203417f4c0d210240024020030d00410121280c010b200310242228450d230b2001200128020441016a2206360204200241003602a813200220283602a0132002200341c1006e22033602a413200620012802084b0d044100213c0240024002400240024002402038450d004100215c0340200128020022032802042206450d042003280200220c2d0000211a20032006417f6a3602042003200c41016a360200201a417f6a220341014b0d0402400240024020030e020001000b41002103200241003a0090160240034020012802002206280204220c450d01200241d0156a20036a2006280200221a2d00003a00002006200c417f6a3602042006201a41016a3602002002200341016a22033a009016200341c000470d000b20022f00e91520242d0000411074722106201b2903002131202c3100002132200241d0156a41246a2902002133200241d0156a41346a310000213420022903d015213720022903e015215d20022902ec15215e20022902fc15215f20022d008516210c20022f018616211a20022d008816216020022d008916216120022f018a162162200228028c162163410021640c020b200341ff01710d050c060b41002103200241003a009016034020012802002206280204220c450d04200241d0156a20036a2006280200221a2d00003a00002006200c417f6a3602042006201a41016a3602002002200341016a22033a009016200341c000470d000b20022f00e91520242d0000411074722106201b2903002131202c3100002132200241d0156a41246a2902002133200241d0156a41346a310000213420022903d015213720022903e015215d20022902ec15215e20022902fc15215f20022d008516210c20022f018616211a20022d008816216020022d008916216120022f018a162162200228028c162163410121640b205c41016a215c0240203c20022802a413470d00200241a0136a203c410110cd0120022802a013212820022802a813213c0b2028203c41c1006c6a2203206336003d200320623b003b200320613a003a200320603a00392003201a3b00372003200c3a00362003205f37002d200320063b001a2003205d370011200320643a0000200341356a20343c00002003411c6a20064110763a0000200341196a20323c00002003205e37001d20032037370001200341256a2033370000200341096a20313700002002203c41016a223c3602a813205c2038470d000b2001280204210620022802a41321030b20012006417f6a3602042028450d0a200241e8016a2001108d0120022802e8010d0820022802ec01221a41076a41037622060d03410021384101215c0c040b200341ff0171450d010b200241003a0090160b20022802a41321030c060b2006102a225c450d23200621380b024002402001280200220c2802042006490d00205c200c280200200610cf06215c200c28020422602006490d04200c206020066b360204200c200c28020020066a360200200241d0156a205c41d4c0c70020061b200610de0120022802d415410376201a4f0d0141c8f3c600412641dcbcc700102f000b2038450d04205c10260c040b200241d0156a201a10df0120022802d815210c20022802d415211a20022802d015210602402038450d00205c10260b2006450d032050422088a721652019203d290000370000200e203e290300370300201b2039290300370300202a205a290300370300202c2059290300370300202d2058290300370300202e2057290300370300202f20402903003703002030203f290300370300200220022903d80e3703f010200220022903d8043703d015202b203a2903003703002029205b290300370300200d203b290300370300200220022903b80e3703a013203621082035210920062166201a2167200c2168202121692020216a2005216b200b216c200a216d2026216e2027216f2042217020412171204321722052210f20492110201f2111201c211720452173205521742056217520532112204b2113205421142051211520442176204c2116204a211d201821772028217820032179203c217a0c110b2003200441b8afc0001048000b2006201a41b8afc0001048000b2006206041b8afc0001048000b02402003450d00200341c1006c450d00202810260b02402026450d00200a10260b02402020450d00202041047421062004210303400240200341046a280200450d00200328020010260b200341106a2103200641706a22060d000b0b0240202141ffffffff0071450d00200410260b2005450d03200b450d030c020b2003450d00200341c1006c450d00202810260b02402026450d00200a10260b02402020450d00202041047421062004210303400240200341046a280200450d00200328020010260b200341106a2103200641706a22060d000b0b0240202141ffffffff0071450d00200410260b2005450d01200b450d010b200510260b410021040c090b200b21050b02402037422088a72203450d00200341047421062004210303400240200341046a280200450d00200328020010260b200341106a2103200641706a22060d000b0b203742ffffffff0083500d010b200410260b2005210b0c020b2042450d00204241047421062004210303400240200341046a280200450d00200328020010260b200341106a2103200641706a22060d000b0b20022802d41541ffffffff0071450d00200410260b2026450d010b200a10260b200b2105410021040b200241a00e6a410f6a2203200241f0106a410f6a290000370000200241a00e6a41086a2206200241f0106a41086a290300370300200241f0036a41086a220b200241d0156a41086a290300370300200241f0036a41106a220a200241d0156a41106a290300370300200241f0036a41186a220d200241d0156a41186a290300370300200241f0036a41206a220c200241d0156a41206a290300370300200241f0036a41286a220e200241d0156a41286a290300370300200241f0036a41306a2218200241d0156a41306a290300370300200241f0036a41386a2219200241d0156a41386a290300370300200220022903f0103703a00e200220022903d0153703f003200241800e6a41186a221a200241a0136a41186a290300370300200241800e6a41106a221b200241a0136a41106a290300370300200241800e6a41086a2220200241a0136a41086a290300370300200220022903a0133703800e2004450d17200741016a2107200241e80d6a410f6a22212003290000370000200241e80d6a41086a22282006290300370300200241a80d6a41086a2229200b290300370300200241a80d6a41106a220b200a290300370300200241a80d6a41186a220a200d290300370300200241a80d6a41206a220d200c290300370300200241a80d6a41286a220c200e290300370300200241a80d6a41306a220e2018290300370300200241a80d6a41386a22182019290300370300200220022903a00e3703e80d200220022903f0033703a80d200241880d6a41186a2219201a290300370300200241880d6a41106a221a201b290300370300200241880d6a41086a221b2020290300370300200220022903800e3703880d024020022802800d220620022802fc0c470d00200241f80c6a2006410110e00120022802800d21060b20022802f80c222020064198026c6a2203200937030820032008370300200320043602102003419f016a20153c000020034197016a20143700002003418f016a201337000020034187016a2012370000200341ff006a20173c0000200341f7006a2011370000200341ef006a2010370000200341e7006a200f370000200341cb006a201d3c0000200341c3006a2016370000200341286a2076360200200341246a2065360200200341206a206c3602002003411c6a206b360200200341186a206a360200200341146a20693602002003412c6a20022903e80d370200200341346a20282903003702002003413b6a202129000037000020034183016a207536000020034181016a20743b000020034180016a20733a0000200341e3006a2072360000200341e1006a20713b0000200341e0006a20703a0000200341dc006a206f360200200341d8006a206e360200200341d4006a206d360200200341d0006a2077360200200341d8016a2018290300370200200341d0016a200e290300370200200341c8016a200c290300370200200341c0016a200d290300370200200341b8016a200a290300370200200341b0016a200b290300370200200341a8016a2029290300370200200341a0016a20022903a80d370200200341e0016a20022903880d370200200341e8016a201b290300370200200341f0016a201a290300370200200341f8016a201929030037020020034194026a206836020020034190026a20673602002003418c026a206636020020034188026a207a36020020034184026a207936020020034180026a20783602002002200641016a3602800d2005210b20072022470d000b20012001280204417f6a3602040c130b200241a0136a21180c1a0b200241a0136a210a0c220b200041173602000c230b0240024002400240200128020022032802042204450d00200328020022052d0000210620032004417f6a3602042003200541016a36020002400240024002400240200641034b0d00024002400240024020060e0400010203000b200241d8046a200110da010240024020022802d8042203450d0020022902dc042108200110b3022201450d01200241f0106a41106a2001360200200241f0106a41086a200837030020024184116a2002290288103702002002418c116a20024188106a41086a29020037020020024194116a20024188106a41106a2902003702002002419c116a200241a0106a290200370200200241a4116a200241a8106a290200370200200241ac116a200241b0106a290200370200200241b4116a200241b8106a280200360200200220033602f410200241013a00f0100c0c0b200241053a00f0100c0c0b200241053a00f010200842ffffff3f83500d0b200310260c0b0b02400240024002400240024002402001280200220328020422064102490d00200328020022042f0000210520032006417e6a3602042003200441026a360200200241d8046a200110da0120022802d8042203450d01200241d8046a41086a2204280200210720022802dc042106200241d8046a2001109c0420022802d8044102460d04200241f0036a41086a2004280200360200200220022903d8043703f003200241e8036a2001108d0120022802e8030d062001280200220b280204220a20022802ec032204490d062004417f4c0d1c20040d024100210d4101210c0c030b200241053a00f0100c100b200241053a00f0100c0f0b2004102a220c450d1a2001280200220b280204210a2004210d0b0240200a2004490d00200c200b280200200410cf06210a200b280204220c20044f0d022004200c41b8afc0001048000b200d450d02200c10260c020b200241053a00f010200641ffffff3f71450d0c200310260c0c0b200b200c20046b360204200b200b28020020046a360200200a0d090b200241053a00f010200641ffffff3f71450d0a200310260c0a0b024002400240024002402001280200220328020422064102490d00200328020022042f0000210a20032006417e6a3602042003200441026a36020020024188106a200110da012002280288102207450d0120024188106a41086a2203280200210d200228028c10210b20024188106a2001109c042002280288104102460d03200241a00b6a41086a200328020036020020022002290388103703a00b41002103200241003a00a8100340200128020022062802042204450d0320024188106a20036a200628020022052d00003a000020062004417f6a3602042006200541016a3602002002200341016a22033a00a81020034120470d000b200241d8046a410f6a220320024188106a410f6a290000370000200241d8046a41086a220620024188106a41086a290300370300200241f0036a410f6a22042003290000370000200241f0036a41086a22032006290300370300200241a80d6a41086a22062003290300370300200241a80d6a410f6a2203200429000037000020022002290388103703a80d200241a7106a3100002108200229009f102109200241800b6a410f6a22042003290000370000200241800b6a41086a2006290300370300200220022903a80d3703800b2001280200220128020422034108490d0420012802002206290000210f2001200341786a3602042001200641086a36020020024180066a41086a2201200241a00b6a41086a28020036020020024190116a20083c000020024188116a20093703002002419c116a200d36020020024198116a200b36020020024194116a200736020020024192116a200a3b010020024180116a2004290000370300200241f0106a41086a20022900870b370300200220022903a00b37038006200241033a00f010200220022800830b3602f410200220022f00810b3b01f210200220022d00800b3a00f110200241a8116a2001280200360200200241a0116a200229038006370300200241b0116a200f3703000c0d0b200241053a00f0100c0d0b200241053a00f0100c0c0b0240200341ff0171450d00200241003a00a8100b200241053a00f010200b41ffffff3f71450d0b200710260c0b0b200241053a00f010200b41ffffff3f71450d0a200710260c0a0b200241053a00f010200b41ffffff3f71450d09200710260c090b2001280200220328020422064102490d01200328020022042f0000210a20032006417e6a3602042003200441026a36020020024188106a200110da012002280288102207450d02200228028c10210b2001280200220328020422064104490d0420024190106a280200210d20032802002204280000210c20032006417c6a3602042003200441046a3602002001280200220328020422064104490d0420032802002204280000210e20032006417c6a3602042003200441046a36020041002103200241003a00a8100340200128020022062802042204450d0420024188106a20036a200628020022052d00003a000020062004417f6a3602042006200541016a3602002002200341016a22033a00a81020034120470d000b2002419c116a200dad3e020020024188116a200229009f10370300200241f8106a200229008f10370300200241a4116a200e360200200241a0116a200c36020020024192116a200a3b010020024190116a200241a7106a3100003c000020024180116a20024197106a29000037030020024194116a200bad4220862007ad843702002002200228008b103602f410200220022f0089103b01f210200220022d0088103a00f110200241043a00f0100c070b200241053a00f0100c070b200241053a00f0100c060b200241053a00f0100c050b0240200341ff0171450d00200241003a00a8100b200241053a00f010200b41ffffff3f71450d04200710260c040b200241053a00f010200b41ffffff3f71450d03200710260c030b200241053a00f0100c020b2004ad422086200dad842208a7210b0240024020012802002204280204220c450d002004280200220e2d0000210d2004200c417f6a3602042004200e41016a360200200d41014b0d004100210402400240200d0e020100010b410121040b20012802002201280204220d4108490d012001280200220c29000021092001200d41786a3602042001200c41086a360200200241a80d6a41086a200241f0036a41086a2802002201360200200241fc106a2007360200200241f0106a41086a2006360200200241f0106a41106a20022903f003220f37030020024188116a200136020020024198116a200937030020024194116a2008422088a736020020024190116a200b3602002002418c116a200a3602002002200f3703a80d200220033602f410200220053b01f210200220043a00f110200241023a00f010200241b0116a20024188106a41106a290300370300200241a8116a20024188106a41086a290300370300200241a0116a2002290388103703000c020b200241053a00f0100240200b450d00200a10260b200641ffffff3f71450d02200310260c020b200241053a00f0100240200b450d00200a10260b200641ffffff3f71450d01200310260c010b200241c0066a200241f0106a41c80010cf061a200241a0136a41046a200241c0066a41c80010cf061a20004116360200200041046a200241a0136a41cc0010cf061a200041d0006a200241d0156a41e00110cf061a0c230b20004117360200200241f0106a10b7060c220b0240200128020022032802042204450d00200328020022052d0000210620032004417f6a3602042003200541016a360200200641054b0d004104210a024002400240024002400240024020060e06000102060304000b41002103200241003a00c0130240024002400340200128020022062802042204450d01200241a0136a20036a200628020022052d00003a000020062004417f6a3602042006200541016a3602002002200341016a22033a00c01320034120470d000b200241a80a6a411f6a200241a0136a411f6a3100003c0000200241a80a6a410f6a200241a0136a410f6a290000370000200220022900b7133700bf0a200220022900a7133700af0a200220022800a3133600ab0a200220022f00a1133b00a90a200220022d00a0133a00a80a200128020022032802042204450d09200328020022052d0000210620032004417f6a3602042003200541016a360200200641014b0d094104210320060e020201020b200341ff0171450d08200241003a00c0130c080b200128020022032802042204450d07200328020022052d0000210620032004417f6a3602042003200541016a360200200641034b0d074100210302400240024020060e0403020001030b410221030c020b410321030c010b410121030b200110b3022207450d06200241c70a6a3100002109200241b70a6a290000211020022900bf0a210820022900af0a210f20022800ab0a210d20022f00a90a210c20022d00a80a21044101210a0c050b41002103200241003a00c0130240024002400340200128020022062802042204450d01200241a0136a20036a200628020022052d00003a000020062004417f6a3602042006200541016a3602002002200341016a22033a00c01320034120470d000b200128020022012802042203450d08200241bf136a3100002109200241af136a290000211020022900b713210820022900a713210f20022800a313210d20022f00a113210c20022d00a0132104200128020022052d0000210620012003417f6a3602042001200541016a360200200641034b0d084102210a4100210320060e0407010602070b200341ff0171450d07200241003a00c0130c070b410121030c050b410321030c040b41002103200241003a00c013024002400240024002400340200128020022062802042204450d01200241a0136a20036a200628020022052d00003a000020062004417f6a3602042006200541016a3602002002200341016a22033a00c01320034120470d000b200241e00a6a411f6a200241a0136a411f6a3100003c0000200241e00a6a410f6a200241a0136a410f6a290000370000200220022900b7133700f70a200220022900a7133700e70a200220022800a3133600e30a200220022f00a1133b00e10a200220022d00a0133a00e00a200128020022012802042203450d09200128020022042d0000210620012003417f6a3602042001200441016a360200200641034b0d094100210320060e0404030102040b200341ff0171450d08200241003a00c0130c080b410221030c020b410321030c010b410121030b200241c80a6a410f6a2201200241e00a6a410f6a290000370000200241c80a6a41086a200241e00a6a41086a290300370300200220022903e00a22113703c80a200241ff0a6a310000210920022900f70a21082001290000211020022f00c90a210c20022800cb0a210d20022900cf0a210f2011a721044103210a0c030b200128020022032802042204450d03200328020022052d0000210620032004417f6a3602042003200541016a360200200641034b0d0341002104024002400240024020060e0403000102030b410121040c020b410221040c010b410321040b2001280200220128020422034102490d03200128020022062f0000210c20012003417e6a3602042001200641026a3602004105210a4100210d410021070c020b41002103200241003a00c013024002400240024002400340200128020022062802042204450d01200241a0136a20036a200628020022052d00003a000020062004417f6a3602042006200541016a3602002002200341016a22033a00c01320034120470d000b200241800b6a410f6a200241a0136a410f6a290000370000200220022900a7133700870b200220022800a3133600830b200220022f00a1133b00810b200220022d00a0133a00800b200128020022032802042204450d07200241bf136a310000210920022900b7132108200328020022052d0000210620032004417f6a3602042003200541016a360200200641034b0d074100210320060e0404030102040b200341ff0171450d06200241003a00c0130c060b410221030c020b410321030c010b410121030b2001280200220628020422044102490d02200628020022072f0000210520062004417e6a3602042006200741026a360200200241e0036a2001108d0120022802e0030d0220022802e4032107200241d8036a2001108d0120022802d8030d0220022802dc03210b2002418f0b6a290000211020022900870b210f20022800830b210d20022f00810b210c20022d00800b21044106210a0c010b410221034102210a0b200020033a0025200020043a00052000200a3a000420004115360200200041246a20093c00002000411c6a2008370200200041146a20103702002000410c6a200f3702002000412c6a200b360200200041286a2007360200200041266a20053b0100200041086a200d360200200041066a200c3b0100200041306a200241d0156a41800210cf061a0c220b200041173602000c210b200241f0106a2001108405024020022d00f0104105460d00200241c0066a41206a200241f0106a41206a2903002208370300200241c0066a41186a200241f0106a41186a2903002209370300200241a0136a410c6a200241f0106a41086a290300370200200241a0136a41146a200241f0106a41106a290300370200200241a0136a411c6a2009370200200241a0136a41246a2008370200200220022903f0103702a41320004114360200200020022902a0133702042000410c6a200241a0136a41086a290200370200200041146a200241a0136a41106a2902003702002000411c6a200241a0136a41186a290200370200200041246a200241a0136a41206a2902003702002000412c6a200241c8136a280200360200200041306a200241d0156a41800210cf061a0c210b200041173602000c200b200241a0136a2001109b04024020022d00a0134107460d00200241f0106a41206a200241a0136a41206a2802002201360200200241f0106a41186a200241a0136a41186a2903002208370300200241f0106a41106a200241a0136a41106a2903002209370300200241f0106a41086a200241a0136a41086a290300220f370300200220022903a01322103703f01020004113360200200020103702042000410c6a200f370200200041146a20093702002000411c6a2008370200200041246a2001360200200041286a200241d0156a41880210cf061a0c200b20004117360200200241a0136a10b6060c1f0b0240200128020022032802042204450d00200328020022052d0000210620032004417f6a360204410121042003200541016a360200200641034b0d0002400240024002400240024020060e0403000102030b41002103200241003a00c01302400340200128020022062802042204450d01200241a0136a20036a200628020022052d00003a000020062004417f6a3602042006200541016a3602002002200341016a22033a00c01320034120470d000b200241bf136a3100002110200241af136a290000211720022900b713210f20022900a713211120022800a313210720022f00a113210b20022d00a013210a42002109410221044200211e0c030b200341ff0171450d05200241003a00c0130c050b41002103200241003a00c01302400340200128020022062802042204450d01200241a0136a20036a200628020022052d00003a000020062004417f6a3602042006200541016a3602002002200341016a22033a00c01320034120470d000b2001280200220328020422064110490d05200241bf136a3100002110200241af136a290000211720022900b713210f20022900a713211120022800a313210720022f00a113210b20022d00a013210a2003280200220441086a2900002113200429000021122003200441106a3602002003200641706a3602042001280200220328020422064110490d052003280200220441086a2900002115200429000021142003200441106a3602002003200641706a3602042001280200220128020422064104490d0520012802002204280000210320012006417c6a3602042001200441046a36020020022903a80a2208422088211e20084220862109200241a80a6a41106a290300211d20022903b00a211620022802c40a210520022802c00a210d410321040c020b200341ff0171450d04200241003a00c0130c040b41002103200241003a00c0130340200128020022062802042204450d02200241a0136a20036a200628020022052d00003a000020062004417f6a3602042006200541016a3602002002200341016a22033a00c01320034120470d000b200241bf136a3100002110200241af136a290000211720022900b713210f20022900a713211120022800a313210720022f00a113210b20022d00a013210a41002103200241003a00c0130340200128020022062802042204450d03200241a0136a20036a200628020022052d00003a000020062004417f6a3602042006200541016a3602002002200341016a22033a00c01320034120470d000b200241800b6a410f6a200241a0136a410f6a290000370000200220022900a7133700870b200220022800a3133600830b200220022f00a1133b00810b200220022d00a0133a00800b2001280200220328020422064110490d03200241bf136a310000211320022900b71321142003280200220441086a29000021122004290000211c2003200441106a3602002003200641706a3602042001280200220328020422064110490d032003280200220441086a290000211d200429000021162003200441106a3602002003200641706a360204410421042001280200220128020422034104490d0320012802002206280000210d20012003417c6a3602042001200641046a360200200241c80a6a410f6a2201200241800b6a410f6a290000370000200241c80a6a41086a200241800b6a41086a290300370300200220022903800b22083703c80a201c42208820124220868421092012422088211e201342ff018321152001290000211320022900cf0a2112201ca721030b200020083e00292000200b3b000a2000200a3a0009200041123602002000412f6a20084230883c00002000412d6a20084220883d0000200041e8006a201d370200200041e0006a2016370200200041c8006a2015370200200041c0006a2014370200200041386a2013370200200041306a2012370200200041286a20103c0000200041206a200f370000200041186a2017370000200041106a2011370000200041f4006a2005360200200041f0006a200d3602002000410c6a2007360000200041086a20043a0000200041d0006a20094220862003ad84370200200041d8006a201e422086200942208884370200200041f8006a200241d0156a41b80110cf061a0c210b200341ff0171450d01200241003a00c0130c010b200341ff0171450d00200241003a00c0130b200041173602000c1e0b200241a0136a200110c503024020022d00a013410a460d00200241f0106a200241a0136a41c40010cf061a20004111360200200041046a200241f0106a41c40010cf061a200041c8006a200241d0156a41e80110cf061a0c1e0b200041173602000c1d0b0240200128020022032802042204450d00200328020022052d0000210620032004417f6a3602042003200541016a3602002006410e4b0d004104216d024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020060e0f00010211030405060708090a0b0c0d000b41002103200241003a00c01302400340200128020022062802042204450d01200241a0136a20036a200628020022052d00003a000020062004417f6a3602042006200541016a3602002002200341016a22033a00c01320034120470d000b200241900f6a41086a200241a00b6a41086a290000370300200241900f6a410f6a200241a00b6a410f6a290000370000200241a40a6a41026a200241c0056a41026a2d00003a0000200220022f0080063b01f80c200220022900a00b3703900f200220022f00c0053b01a40a200220024180066a41026a2d00003a00fa0c200241bf136a310000210f200241a0136a410f6a290000211120022900b713210920022900a713211020022800a313210320022f00a113210520022d00a0132107200241880a6a41106a200241c0066a41106a290000370300200241880a6a41086a200241c0066a41086a290000370300200220022900c0063703880a200241840a6a41026a200241f00e6a41026a2d00003a0000200220022f00f00e3b01840a200241e8096a41106a20024188106a41106a290000370300200241e8096a41086a20024188106a41086a29000037030020022002290088103703e809200241e4096a41026a200241b80e6a41026a2d00003a0000200220022f00b80e3b01e409200241c8096a41106a200241d8046a41106a290000370300200241c8096a41086a200241d8046a41086a290000370300200220022900d8043703c809200241f0036a41206a200241d0156a41206a280000360200200241f0036a41186a200241d0156a41186a290000370300200241f0036a41106a200241d0156a41106a290000370300200241f0036a41086a200241d0156a41086a290000370300200220022900d0153703f003200241c4096a41026a200241800e6a41026a2d00003a0000200220022f00800e3b01c4094101216d0c110b200341ff0171450d15200241003a00c0130c150b200241f0026a2001108d0120022802f0020d1420022802f402220b200128020028020441c8006e22032003200b4b1bad42c8007e2208422088a70d192008a72206417f4c0d190240024020060d00410421030c010b200610242203450d1b0b2001200128020441016a2204360204200241003602b00a200220033602a80a2002200641c8006e3602ac0a200420012802084b0d0d0240200b450d00200241a0136a410c6a2107200241a0136a410172210a410021040340200241a0136a200110ce02024020022d00a01322054106470d00200241c40b6a41026a200241e00b6a41026a2d00003a0000200241c0056a41086a20024180066a41086a290300370300200241c0056a41106a20024180066a41106a290300370300200241c0066a41086a200241f0106a41086a290300370300200241c0066a41106a200241f0106a41106a290300370300200241c0066a41186a200241f0106a41186a290300370300200241c0066a41206a200241f0106a41206a280200360200200220022f01e00b3b01c40b20022002290380063703c005200220022903f0103703c0060c150b200241fc0b6a41026a220c200a41026a2d00003a0000200241a00b6a41086a220e200741086a290200370300200241a00b6a41106a2218200741106a2902003703002002200a2f00003b01fc0b200220072902003703a00b20022802a413210d20022802a8132106200241d0156a200110ce020240024020022d00d0154106470d00024020054101470d002006450d00200d10260b410621050c010b200241e00b6a41026a200c2d00003a000020024180066a41086a200e29030037030020024180066a41106a2018290300370300200241f0106a41086a200241d0156a41086a290300370300200241f0106a41106a200241d0156a41106a290300370300200241f0106a41186a200241d0156a41186a290300370300200241f0106a41206a200241d0156a41206a280200360200200220022f01fc0b3b01e00b200220022903a00b37038006200220022903d0153703f01020062121200d21280b200241c40b6a41026a2206200241e00b6a41026a2d00003a0000200241c0056a41086a220d20024180066a41086a290300370300200241c0056a41106a220c20024180066a41106a290300370300200241c0066a41086a220e200241f0106a41086a290300370300200241c0066a41106a2218200241f0106a41106a290300370300200241c0066a41186a2219200241f0106a41186a290300370300200241c0066a41206a221a200241f0106a41206a280200360200200220022f01e00b3b01c40b20022002290380063703c005200220022903f0103703c00620054106460d14200241a00e6a41026a221b20062d00003a0000200241f00e6a41086a2220200d290300370300200241f00e6a41106a220d200c29030037030020024188106a41086a220c200e29030037030020024188106a41106a220e201829030037030020024188106a41186a2218201929030037030020024188106a41206a2219201a280200360200200220022f01c40b3b01a00e200220022903c0053703f00e200220022903c006370388100240200420022802ac0a470d00200241a80a6a2004410110ef0120022802a80a210320022802b00a21040b2003200441c8006c6a220620053a0000200641086a2021360000200641046a2028360000200641036a201b2d00003a0000200620022f01a00e3b0001200641146a20202903003700002006411c6a200d2903003700002006410c6a20022903f00e370000200641246a200229038810370000200641346a200e2903003700002006412c6a200c2903003700002006413c6a2018290300370000200641c4006a20192802003600002002200441016a22043602b00a200b417f6a220b0d000b200128020421040b20012004417f6a3602042003450d1420022902ac0a2110200241d0156a200110ce02024002400240024002400240024002400240024020022d00d0154106460d00200241e0156a310000210f200241f0156a280200216e200241e8156a2903002117200241e4156a220d2802002104200241e2156a2f0100210b200241e1156a2d0000210a200241d8156a220c290300210920022802d415210720022802d0152106200241d0156a200110ce022009a7210520022d00d0154106460d012002200d2f01003b01f00e2002200241e6156a2d00003a00f20e200241e7156a2900002114200241dc156a220e2902002115200c2802002170200241ef156a3500002108200241f3156a310000211120022802d415217120022802d015216f200241d0156a200110ce0220022d00d015220d4106460d0220024188106a41086a200241e5156a29000037030020024197106a200241ec156a22202900003700002002200241dd156a29000037038810200e2d00002119200241d0156a41086a2221280200210c20022802d415210e20022d00d315211b20022f00d115211a200241d0156a200110ce0220022d00d01522184106460d03200241c0056a41026a20022d00d3153a0000200241c0066a41086a200241e4156a2229290200370300200241c0066a41106a2020290200370300200220022f00d1153b01c0052002200241dc156a22222902003703c0062021280200212020022802d4152121200241d0156a200110ce0220022d00d01522284106460d0820024180066a41026a20022d00d3153a0000200241f0106a41086a2029290200370300200241f0106a41106a200241ec156a290200370300200220022f00d1153b018006200220222902003703f010200241d0156a41086a280200212920022802d4152122200128020022662802042267450d07206628020022682d0000216a20662067417f6a3602042066206841016a360200206a41014b0d0741002166206a0e020504050b02402010422088a72201450d002003200141c8006c6a2106200321010340024020012d00004101470d00200141086a280200450d00200141046a28020010260b0240200141246a2d00004101470d002001412c6a280200450d00200141286a28020010260b200141c8006a22012006470d000b0b2010a72201450d1d200141c8006c450d1d200310260c1d0b0240200641ff01714101470d002005450d00200710260b02402010422088a72201450d002003200141c8006c6a2106200321010340024020012d00004101470d00200141086a280200450d00200141046a28020010260b0240200141246a2d00004101470d002001412c6a280200450d00200141286a28020010260b200141c8006a22012006470d000b0b2010a72201450d1c200141c8006c450d1c200310260c1c0b0240206f41ff01714101470d002070450d00207110260b0240200641ff01714101470d002005450d00200710260b02402010422088a72201450d002003200141c8006c6a2106200321010340024020012d00004101470d00200141086a280200450d00200141046a28020010260b0240200141246a2d00004101470d002001412c6a280200450d00200141286a28020010260b200141c8006a22012006470d000b0b2010a72201450d1b200141c8006c450d1b200310260c1b0b0240200d4101470d00200c450d00200e10260b0240206f41ff01714101470d002070450d00207110260b0240200641ff01714101470d002005450d00200710260b02402010422088a72201450d002003200141c8006c6a2106200321010340024020012d00004101470d00200141086a280200450d00200141046a28020010260b0240200141246a2d00004101470d002001412c6a280200450d00200141286a28020010260b200141c8006a22012006470d000b0b2010a72201450d1a200141c8006c450d1a200310260c1a0b41002166200241003a00e4150340200128020022672802042268450d02200241d0156a20666a206728020022692d00003a000020672068417f6a3602042067206941016a3602002002206641016a22663a00e41520664114470d000b20022802e015216920022802dc15216820022802d815216720022903d0152116410121660b200241d0156a200110ce0220022d00d015226a4106460d034102216d200241a00b6a41026a227220022d00d3153a0000200241a0136a41086a2273200241e4156a290200370300200241a0136a41106a2274200241ec156a290200370300200220022f00d1153b01a00b2002200241dc156a2902003703a013200241d0156a41086a2275280200216b20022802d415216c200241d0156a200110ce0220022d00d0154106470d100240206a4101470d00206b450d00206c10260b024020284101470d002029450d00202210260b024020184101470d002020450d00202110260b0240200d4101470d00200c450d00200e10260b0240206f41ff01714101470d002070450d00207110260b0240200641ff01714101470d002005450d00200710260b02402010422088a72201450d002003200141c8006c6a2106200321010340024020012d00004101470d00200141086a280200450d00200141046a28020010260b0240200141246a2d00004101470d002001412c6a280200450d00200141286a28020010260b200141c8006a22012006470d000b0b2010a72201450d18200141c8006c450d18200310260c180b206641ff0171450d00200241003a00e4150b024020284101470d002029450d00202210260b024020184101470d002020450d00202110260b0240200d4101470d00200c450d00200e10260b0240206f41ff01714101470d002070450d00207110260b0240200641ff01714101470d002005450d00200710260b02402010422088a72201450d002003200141c8006c6a2106200321010340024020012d00004101470d00200141086a280200450d00200141046a28020010260b0240200141246a2d00004101470d002001412c6a280200450d00200141286a28020010260b200141c8006a22012006470d000b0b2010a72201450d16200141c8006c450d16200310260c160b024020184101470d002020450d00202110260b0240200d4101470d00200c450d00200e10260b0240206f41ff01714101470d002070450d00207110260b0240200641ff01714101470d002005450d00200710260b02402010422088a72201450d002003200141c8006c6a2106200321010340024020012d00004101470d00200141086a280200450d00200141046a28020010260b0240200141246a2d00004101470d002001412c6a280200450d00200141286a28020010260b200141c8006a22012006470d000b0b2010a72201450d15200141c8006c450d15200310260c150b024020284101470d002029450d00202210260b024020184101470d002020450d00202110260b0240200d4101470d00200c450d00200e10260b0240206f41ff01714101470d002070450d00207110260b0240200641ff01714101470d002005450d00200710260b02402010422088a72201450d002003200141c8006c6a2106200321010340024020012d00004101470d00200141086a280200450d00200141046a28020010260b0240200141246a2d00004101470d002001412c6a280200450d00200141286a28020010260b200141c8006a22012006470d000b0b2010a72201450d14200141c8006c450d14200310260c140b200241f8026a2001108d0120022802f8020d1320022802fc02220b200128020028020441c4006e22032003200b4b1bad42c4007e2208422088a70d182008a72206417f4c0d180240024020060d00410421030c010b200610242203450d1a0b2001200128020441016a2204360204200241003602f80e200220033602f00e2002200641c4006e3602f40e02400240200420012802084b0d000240200b450d00200241d0156a410172210c200241d0156a410f6a210e200241d0156a411f6a21184100210a4100210d0340200241003a00f015200d41016a210d410021060340200128020022042802042205450d04200241d0156a20066a200428020022072d00003a000020042005417f6a3602042004200741016a3602002002200641016a22063a00f01520064120470d000b200e29000021082018310000210920022900d715210f20022900e715211020022d00d015210620022f00d115210420022800d3152105200241d0156a200110ce0220022d00d01522074106460d13200241f0106a411f6a2219200c411f6a280000360000200241f0106a41186a221a200c41186a290000370300200241c0066a41086a221b200c41086a290000370300200241c0066a41106a2220200c41106a290000370300200241c0066a41186a2221201a290300370300200241c0066a411f6a221a20192800003600002002200c2900003703c006200241800b6a410f6a221920083700002002200f3700870b200220053600830b200220043b00810b200220063a00800b20024188106a411f6a2204201a28000036000020024188106a41186a2205202129030037030020024188106a41106a221a202029030037030020024188106a41086a2220201b290300370300200220022903c006370388100240200a20022802f40e470d00200241f00e6a200a410110eb0120022802f00e210320022802f80e210a0b200241800b6a41086a29030021082019290000210f20022903800b21112003200a41c4006c6a220620073a002020062010370017200620113702002006411f6a20093c00002006410f6a200f370000200641086a20083702002006200229038810370021200641296a2020290300370000200641316a201a290300370000200641396a2005290300370000200641c0006a20042800003600002002200a41016a220a3602f80e200d200b470d000b200128020421040b20012004417f6a3602042003450d1520022902f40e2110200241900f6a41086a200241c0056a41086a290000370300200241900f6a410f6a200241c0056a410f6a290000370000200241a40a6a41026a200241800e6a41026a2d00003a0000200241880a6a41086a200241d8046a41086a290200370300200241880a6a41106a200241d8046a41106a290200370300200220022d00ba0e3a00fa0c200220022f01b80e3b01f80c200220022900c0053703900f200220022f00800e3b01a40a200220022902d8043703880a200241840a6a41026a200241880d6a41026a2d00003a0000200241e8096a41086a200241a00b6a41086a290200370300200241e8096a41106a200241a00b6a41106a290200370300200241e4096a41026a200241e00a6a41026a2d00003a0000200241c8096a41086a20024180066a41086a290200370300200241c8096a41106a20024180066a41106a290200370300200220022f00880d3b01840a200220022902a00b3703e809200220022f00e00a3b01e40920022002290280063703c809200241f0036a41206a200241a0136a41206a280200360200200241f0036a41186a200241a0136a41186a290300370300200241f0036a41106a200241a0136a41106a290300370300200241f0036a41086a200241a0136a41086a290300370300200241c4096a41026a200241a80a6a41026a2d00003a0000200220022903a0133703f003200220022f00a80a3b01c4094103216d0c100b200241f00e6a21060c110b200641ff0171450d0f200241003a00f0150c0f0b20024198036a2001108d012002280298030d12200228029c03210320024180036a200110ec04200229038003a70d1220024180036a41106a29030021112002290388032110200241900f6a41086a20024188106a41086a290000370300200241900f6a410f6a20024188106a410f6a290000370000200241a40a6a41026a200241a00b6a41026a2d00003a0000200241880a6a41086a200241a0136a41086a290200370300200241880a6a41106a200241a0136a41106a290200370300200220022d00da043a00fa0c200220022f01d8043b01f80c20022002290088103703900f200220022f00a00b3b01a40a200220022902a0133703880a200241840a6a41026a20024180066a41026a2d00003a0000200241e8096a41086a200241f0106a41086a290200370300200241e8096a41106a200241f0106a41106a290200370300200241e4096a41026a200241c0056a41026a2d00003a0000200241c8096a41086a200241c0066a41086a290200370300200241c8096a41106a200241c0066a41106a290200370300200220022f0080063b01840a200220022902f0103703e809200220022f00c0053b01e409200220022902c0063703c809200241f0036a41206a200241d0156a41206a280200360200200241f0036a41186a200241d0156a41186a290300370300200241f0036a41106a200241d0156a41106a290300370300200241f0036a41086a200241d0156a41086a290300370300200241c4096a41026a200241f00e6a41026a2d00003a0000200220022903d0153703f003200220022f00f00e3b01c4094105216d0c0d0b2001280200220128020422064104490d1120012802002204280000210320012006417c6a3602042001200441046a360200200241900f6a41086a20024188106a41086a290000370300200241900f6a410f6a20024188106a410f6a290000370000200241a40a6a41026a200241a00b6a41026a2d00003a0000200220022f01d8043b01f80c200220022d00da043a00fa0c20022002290088103703900f200220022f00a00b3b01a40a200241880a6a41106a200241a0136a41106a290200370300200241880a6a41086a200241a0136a41086a290200370300200220022902a0133703880a200241840a6a41026a20024180066a41026a2d00003a0000200220022f0080063b01840a200241e8096a41106a200241f0106a41106a290200370300200241e8096a41086a200241f0106a41086a290200370300200220022902f0103703e809200241e4096a41026a200241c0056a41026a2d00003a0000200220022f00c0053b01e409200241c8096a41106a200241c0066a41106a290200370300200241c8096a41086a200241c0066a41086a290200370300200220022902c0063703c809200241f0036a41206a200241d0156a41206a280200360200200241f0036a41186a200241d0156a41186a290300370300200241f0036a41106a200241d0156a41106a290300370300200241f0036a41086a200241d0156a41086a290300370300200220022903d0153703f003200241c4096a41026a200241f00e6a41026a2d00003a0000200220022f00f00e3b01c4094106216d420021110c0c0b200241b8036a2001108d0120022802b8030d1020022802bc032103200241a0036a200110ec0420022903a003a70d10200241a0036a41106a290300211120022903a8032110200241900f6a41086a200241980c6a41086a290000370300200241900f6a410f6a200241980c6a410f6a290000370000200241a40a6a41026a200241950c6a41026a2d00003a0000200241880a6a41086a200241fc0b6a41086a290200370300200241880a6a41106a200241fc0b6a41106a290200370300200220022d00b20c3a00fa0c200220022f01b00c3b01f80c200220022900980c3703900f200220022f00950c3b01a40a200220022902fc0b3703880a200241840a6a41026a200241f90b6a41026a2d00003a0000200241e8096a41086a200241e00b6a41086a290200370300200241e8096a41106a200241e00b6a41106a290200370300200241e4096a41026a200241dd0b6a41026a2d00003a0000200241c8096a41086a200241c40b6a41086a290200370300200241c8096a41106a200241c40b6a41106a290200370300200220022f00f90b3b01840a200220022902e00b3703e809200220022f00dd0b3b01e409200220022902c40b3703c809200241f0036a41206a200241a00b6a41206a280200360200200241f0036a41186a200241a00b6a41186a290300370300200241f0036a41106a200241a00b6a41106a290300370300200241f0036a41086a200241a00b6a41086a290300370300200241c4096a41026a2002419d0b6a41026a2d00003a0000200220022903a00b3703f003200220022f009d0b3b01c4094107216d420021170c0b0b200241c0036a2001108d0120022802c0030d0f20022802c403210441002103200241003a00c01302400340200128020022062802042205450d01200241a0136a20036a200628020022072d00003a000020062005417f6a3602042006200741016a3602002002200341016a22033a00c01320034120470d000b4108216d200241900f6a41086a200241d8046a41086a290000370300200241900f6a410f6a200241d8046a410f6a290000370000200241a40a6a41026a20024180066a41026a2d00003a0000200220022f01a00b3b01f80c200220022d00a20b3a00fa0c200220022900d8043703900f200220022f0080063b01a40a200241bf136a310000210f200241a0136a410f6a290000211120022900b713210920022900a713211020022800a313210320022f00a113210520022d00a0132107200241880a6a41106a200241f0106a41106a290200370300200241880a6a41086a200241f0106a41086a290200370300200220022902f0103703880a200241840a6a41026a200241c0056a41026a2d00003a0000200220022f00c0053b01840a200241e8096a41106a200241c0066a41106a290200370300200241e8096a41086a200241c0066a41086a290200370300200220022902c0063703e809200241e4096a41026a200241f00e6a41026a2d00003a0000200220022f00f00e3b01e409200241c8096a41106a20024188106a41106a290200370300200241c8096a41086a20024188106a41086a29020037030020022002290288103703c809200241f0036a41206a200241d0156a41206a280200360200200241f0036a41186a200241d0156a41186a290300370300200241f0036a41106a200241d0156a41106a290300370300200241f0036a41086a200241d0156a41086a290300370300200220022903d0153703f003200241c4096a41026a200241b80e6a41026a2d00003a0000200220022f00b80e3b01c4090c0b0b200341ff0171450d0f200241003a00c0130c0f0b200241c8036a2001108d0120022802c8030d0e2001280200220128020422064108490d0e20022802cc0321032001280200220429000021082001200641786a3602042001200441086a36020020084280025a0d0e200241900f6a41086a20024188106a41086a290000370300200241900f6a410f6a20024188106a410f6a290000370000200241a40a6a41026a200241a00b6a41026a2d00003a0000200241880a6a41086a200241a0136a41086a290200370300200241880a6a41106a200241a0136a41106a290200370300200220022d00da043a00fa0c200220022f01d8043b01f80c20022002290088103703900f200220022f00a00b3b01a40a200220022902a0133703880a200241840a6a41026a20024180066a41026a2d00003a0000200241e8096a41086a200241f0106a41086a290200370300200241e8096a41106a200241f0106a41106a290200370300200241e4096a41026a200241c0056a41026a2d00003a0000200241c8096a41086a200241c0066a41086a290200370300200241c8096a41106a200241c0066a41106a290200370300200220022f0080063b01840a200220022902f0103703e809200220022f00c0053b01e409200220022902c0063703c809200241f0036a41206a200241d0156a41206a280200360200200241f0036a41186a200241d0156a41186a290300370300200241f0036a41106a200241d0156a41106a290300370300200241f0036a41086a200241d0156a41086a290300370300200241c4096a41026a200241f00e6a41026a2d00003a0000200220022903d0153703f003200220022f00f00e3b01c409200842ff018321104109216d0c090b200241d0036a2001108d0120022802d0030d0d20022802d403210441002103200241003a00c01302400240024002400240024002400340200128020022062802042205450d01200241a0136a20036a200628020022072d00003a000020062005417f6a3602042006200741016a3602002002200341016a22033a00c01320034120470d000b200241a0106a200241bf136a3100003c0000200220022900b71337039810200220022900a713370388102002200241af136a2900003703901020012802002206280204220a450d1420022800a313210320022f00a113210520022d00a01321072006280200220d2d0000210b2006200a417f6a3602042006200d41016a360200200b41064b0d1442002117200b0e070e0102030405060e0b200341ff0171450d13200241003a00c0130c130b2001280200220128020422064110490d122001280200220b41086a2900002113200b29000021122001200b41106a3602002001200641706a360204420121170c0c0b420221170c0b0b420321170c0a0b420421170c090b420521170c080b420621170c070b41002103200241003a00c01302400340200128020022062802042204450d01200241a0136a20036a200628020022052d00003a000020062004417f6a3602042006200541016a3602002002200341016a22033a00c01320034120470d000b200241900f6a41086a200241d8046a41086a290000370300200241900f6a410f6a200241d8046a410f6a290000370000200241a40a6a41026a20024180066a41026a2d00003a0000200220022f00a00b3b01f80c200220022900d8043703900f200220022f0080063b01a40a2002200241a00b6a41026a2d00003a00fa0c200241bf136a310000210f200241a0136a410f6a290000211120022900b713210920022900a713211020022800a313210320022f00a113210520022d00a0132107200241880a6a41106a200241f0106a41106a290000370300200241880a6a41086a200241f0106a41086a290000370300200220022900f0103703880a200241840a6a41026a200241c0056a41026a2d00003a0000200220022f00c0053b01840a200241e8096a41106a200241c0066a41106a290000370300200241e8096a41086a200241c0066a41086a290000370300200220022900c0063703e809200241e4096a41026a200241f00e6a41026a2d00003a0000200220022f00f00e3b01e409200241c8096a41106a20024188106a41106a290000370300200241c8096a41086a20024188106a41086a29000037030020022002290088103703c809200241f0036a41206a200241d0156a41206a280000360200200241f0036a41186a200241d0156a41186a290000370300200241f0036a41106a200241d0156a41106a290000370300200241f0036a41086a200241d0156a41086a290000370300200220022900d0153703f003200241c4096a41026a200241b80e6a41026a2d00003a0000200220022f00b80e3b01c409410b216d0c080b200341ff0171450d0c200241003a00c0130c0c0b41002103200241003a00f01502400340200128020022062802042204450d01200241d0156a20036a200628020022052d00003a000020062004417f6a3602042006200541016a3602002002200341016a22033a00f01520034120470d000b200241ef156a310000210f200241d0156a410f6a290000211120022900e715210920022900d715211020022800d315210320022f00d115210520022d00d0152107200241d0156a200110ce0220022d00d0154106460d0c200241900f6a41086a200241d8046a41086a290000370300200241900f6a410f6a200241d8046a410f6a290000370000200241a40a6a41026a20024180066a41026a2d00003a0000200220022f01a00b3b01f80c200220022d00a20b3a00fa0c200220022900d8043703900f200220022f0080063b01a40a200241e4156a2902002113410c216d200241d0156a410c6a2902002112200241ec156a290200211520022902d415211720022802d0152104200241880a6a41106a200241f0106a41106a290200370300200241880a6a41086a200241f0106a41086a290200370300200220022902f0103703880a200241840a6a41026a200241c0056a41026a2d00003a0000200220022f00c0053b01840a200241e8096a41106a200241c0066a41106a290200370300200241e8096a41086a200241c0066a41086a290200370300200220022902c0063703e809200241e4096a41026a200241f00e6a41026a2d00003a0000200220022f00f00e3b01e409200241c8096a41106a20024188106a41106a290200370300200241c8096a41086a20024188106a41086a29020037030020022002290288103703c809200241f0036a41206a200241a0136a41206a280200360200200241f0036a41186a200241a0136a41186a290300370300200241f0036a41106a200241a0136a41106a290300370300200241f0036a41086a200241a0136a41086a290300370300200220022903a0133703f003200241c4096a41026a200241b80e6a41026a2d00003a0000200220022f00b80e3b01c4090c070b200341ff0171450d0b200241003a00f0150c0b0b41002103200241003a00f01502400340200128020022062802042204450d01200241d0156a20036a200628020022052d00003a000020062004417f6a3602042006200541016a3602002002200341016a22033a00f01520034120470d000b200241c80a6a410f6a2203200241d0156a410f6a290000370000200220022900d7153700cf0a200220022800d3153600cb0a200220022f00d1153b00c90a200220022d00d0153a00c80a200241ef156a310000210f20022900e7152109200241d0156a200110ce0220022d00d0154106460d0b200241900f6a41086a200241d8046a41086a290000370300200241900f6a410f6a200241d8046a410f6a290000370000200220022f01a00b3b01f80c200220022d00a20b3a00fa0c200220022900d8043703900f200241e4156a2902002113200241dc156a2902002112200241ec156a290200211520022902d415211720022802d01521042003290000211120022900cf0a211020022d00c80a210720022f00c90a210520022800cb0a2103200241a40a6a41026a20024180066a41026a2d00003a0000200220022f0080063b01a40a200241880a6a41106a200241f0106a41106a290200370300200241880a6a41086a200241f0106a41086a290200370300200220022902f0103703880a200241840a6a41026a200241c0056a41026a2d00003a0000200220022f00c0053b01840a200241e8096a41106a200241c0066a41106a290200370300200241e8096a41086a200241c0066a41086a290200370300200220022902c0063703e809200241e4096a41026a200241f00e6a41026a2d00003a0000200220022f00f00e3b01e409200241c8096a41106a20024188106a41106a290200370300200241c8096a41086a20024188106a41086a29020037030020022002290288103703c809200241f0036a41206a200241a0136a41206a280200360200200241f0036a41186a200241a0136a41186a290300370300200241f0036a41106a200241a0136a41106a290300370300200241f0036a41086a200241a0136a41086a290300370300200220022903a0133703f003200241c4096a41026a200241b80e6a41026a2d00003a0000200220022f00b80e3b01c409410d216d0c060b200341ff0171450d0a200241003a00f0150c0a0b41002103200241003a00c01302400340200128020022062802042204450d01200241a0136a20036a200628020022052d00003a000020062004417f6a3602042006200541016a3602002002200341016a22033a00c01320034120470d000b200241900f6a41086a200241d8046a41086a290000370300200241900f6a410f6a200241d8046a410f6a290000370000200241a40a6a41026a20024180066a41026a2d00003a0000200220022f00a00b3b01f80c200220022900d8043703900f200220022f0080063b01a40a2002200241a00b6a41026a2d00003a00fa0c200241bf136a310000210f200241a0136a410f6a290000211120022900b713210920022900a713211020022800a313210320022f00a113210520022d00a0132107200241880a6a41106a200241f0106a41106a290000370300200241880a6a41086a200241f0106a41086a290000370300200220022900f0103703880a200241840a6a41026a200241c0056a41026a2d00003a0000200220022f00c0053b01840a200241e8096a41106a200241c0066a41106a290000370300200241e8096a41086a200241c0066a41086a290000370300200220022900c0063703e809200241e4096a41026a200241f00e6a41026a2d00003a0000200220022f00f00e3b01e409200241c8096a41106a20024188106a41106a290000370300200241c8096a41086a20024188106a41086a29000037030020022002290088103703c809200241f0036a41206a200241d0156a41206a280000360200200241f0036a41186a200241d0156a41186a290000370300200241f0036a41106a200241d0156a41106a290000370300200241f0036a41086a200241d0156a41086a290000370300200220022900d0153703f003200241c4096a41026a200241b80e6a41026a2d00003a0000200220022f00b80e3b01c409410e216d0c050b200341ff0171450d09200241003a00c0130c090b410f216d0c030b20082011422086842108200241d8046a41206a2201200241d0156a41206a280200360200200241d8046a41186a2205200241d0156a41186a290300370300200241d8046a41106a2265200241d0156a41106a290300370300200241d8046a41086a22762075290300370300200241e00a6a41086a227520024188106a41086a290300370300200241e00a6a410f6a227720024188106a410f6a290000370000200220022903d0153703d804200220022f01f00e3b01980c200220022d00f20e3a009a0c20022002290388103703e00a200241800b6a41026a2278200241c0056a41026a2d00003a0000200220022f01c0053b01800b200241b80e6a41106a2279200241c0066a41106a290300370300200241b80e6a41086a227a200241c0066a41086a290300370300200220022903c0063703b80e200241c80a6a41026a222620024180066a41026a2d00003a0000200220022f0180063b01c80a200241800e6a41106a2227200241f0106a41106a290300370300200241800e6a41086a2223200241f0106a41086a290300370300200220022903f0103703800e200241a8066a41026a224820722d00003a0000200220022f01a00b3b01a806200241880d6a41106a22722074290300370300200241880d6a41086a22742073290300370300200220022903a0133703880d200241e8056a41026a2273200241e80d6a41026a2d00003a0000200220022f00e80d3b01e805200220022d009a0c3a00fa0c200220022f01980c3b01f80c200241900f6a410f6a2077290000370000200241900f6a41086a2075290300370300200220022903e00a3703900f200241a40a6a41026a20782d00003a0000200220022f01800b3b01a40a200241880a6a41106a2079290300370300200241880a6a41086a207a290300370300200220022903b80e3703880a200241840a6a41026a20262d00003a0000200220022f01c80a3b01840a200241e8096a41106a2027290300370300200241e8096a41086a2023290300370300200220022903800e3703e809200241e4096a41026a20482d00003a0000200220022f01a8063b01e409200241c8096a41106a2072290300370300200241c8096a41086a2074290300370300200220022903880d3703c809200241f0036a41206a2001280200360200200241f0036a41186a2005290300370300200241f0036a41106a2065290300370300200241f0036a41086a2076290300370300200220022903d8043703f003200241c4096a41026a20732d00003a0000200220022f01e8053b01c4092070ad4220862071ad422086206fad8422124220888421132007ad4220862006ad8421112012422086206ead8421120c020b200241a80a6a21060c050b200241900f6a41086a200241b80e6a41086a290000370300200241900f6a410f6a200241b80e6a410f6a290000370000200241a40a6a41026a200241880d6a41026a2d00003a0000200220022f01800e3b01f80c200220022d00820e3a00fa0c200220022900b80e3703900f200220022f00880d3b01a40a20024188106a41186a310000210f20024188106a41086a290300211120022903981021092002290388102110200241880a6a41106a200241d8046a41106a290200370300200241880a6a41086a200241d8046a41086a290200370300200220022902d8043703880a200241840a6a41026a200241e00a6a41026a2d00003a0000200220022f00e00a3b01840a200241e8096a41106a200241a00b6a41106a290200370300200241e8096a41086a200241a00b6a41086a290200370300200220022902a00b3703e809200241e4096a41026a200241a80a6a41026a2d00003a0000200220022f00a80a3b01e409200241c8096a41106a200241f00e6a41106a290200370300200241c8096a41086a200241f00e6a41086a290200370300200220022902f00e3703c809200241f0036a41206a200241d0156a41206a280200360200200241f0036a41186a200241d0156a41186a290300370300200241f0036a41106a200241d0156a41106a290300370300200241f0036a41086a200241d0156a41086a290300370300200220022903d0153703f003200241c4096a41026a200241fc0b6a41026a2d00003a0000200220022f00fc0b3b01c409410a216d0b200241d80e6a41086a2201200241900f6a41086a290300370300200241d80e6a410f6a2206200241900f6a410f6a290000370000200241b8096a41026a226e200241a40a6a41026a2d00003a0000200241a0096a41086a226f200241880a6a41086a290300370300200241a0096a41106a2270200241880a6a41106a290300370300200220022d00fa0c3a00c209200220022f01f80c3b01c009200220022903900f3703d80e200220022f01a40a3b01b809200220022903880a3703a0092002419c096a41026a2271200241840a6a41026a2d00003a000020024180096a41086a2272200241e8096a41086a29030037030020024180096a41106a2273200241e8096a41106a290300370300200241fc086a41026a2274200241e4096a41026a2d00003a0000200241e0086a41086a2275200241c8096a41086a290300370300200241e0086a41106a2265200241c8096a41106a290300370300200220022f01840a3b019c09200220022903e80937038009200220022f01e4093b01fc08200220022903c8093703e008200241a80d6a41206a2276200241f0036a41206a280200360200200241a80d6a41186a2277200241f0036a41186a290300370300200241a80d6a41106a2278200241f0036a41106a290300370300200241a80d6a41086a2279200241f0036a41086a290300370300200241dc086a41026a227a200241c4096a41026a2d00003a0000200220022903f0033703a80d200220022f01c4093b01dc08200041c0006a2013370200200041386a2012370200200041286a200f3c0000200041206a2009370200200041186a2011370200200041106a2010370200200041c8006a2015370200200041306a20173702002000412c6a20043602002000200b3b002a2000200a3a00292000410c6a2003360200200020053b000a200020073a0009200041086a206d3a000020004110360200200041df006a20084220883c0000200041db006a20083e0000200041d3006a2014370000200041ec006a20193a0000200041e8006a200c360200200041e4006a200e3602002000201b3a00632000201a3b0061200041e0006a200d3a0000200041d0006a20022f01c0093b0100200041d2006a20022d00c2093a0000200041fc006a2006290000370000200041f5006a2001290300370000200020022903d80e37006d20004184016a20183a000020004187016a206e2d00003a0000200020022f01b8093b0085012000418c016a202036020020004188016a2021360200200041a0016a207029030037020020004198016a206f29030037020020004190016a20022903a009370200200041a8016a20283a0000200041ab016a20712d00003a0000200020022f019c093b00a901200041b0016a2029360200200041ac016a2022360200200041c4016a2073290300370200200041bc016a2072290300370200200041b4016a200229038009370200200041cc016a206a3a0000200041cf016a20742d00003a0000200020022f01fc083b00cd01200041d4016a206b360200200041d0016a206c360200200041e8016a2065290300370200200041e0016a2075290300370200200041d8016a20022903e00837020020004190026a207628020036020020004188026a207729030037020020004180026a2078290300370200200041f8016a2079290300370200200041f0016a20022903a80d370200200020693600a502200020683600a1022000206736009d02200020163700950220004194026a20663a0000200041ab026a207a2d00003a0000200020022f01dc083b00a9020c210b200241c0066a411f6a200241f0106a411f6a280000360000200241c0066a41186a200241f0106a41186a290300370300200241f00e6a2106200a450d00200a41c4006c210320022802f00e41286a210103400240200141786a2d00004101470d002001280200450d002001417c6a28020010260b200141c4006a2101200341bc7f6a22030d000b0b200641046a2802002201450d02200141c4006c450d02200628020010260c020b200241a80a6a21062004450d0020022802a80a2201200441c8006c6a21030340024020012d00004101470d00200141086a280200450d00200141046a28020010260b0240200141246a2d00004101470d002001412c6a280200450d00200141286a28020010260b200141c8006a22012003470d000b0b200641046a2802002201450d00200141c8006c450d00200628020010260b200041173602000c1c0b0240200128020022032802042204450d00200328020022052d0000210620032004417f6a3602042003200541016a360200200641014b0d00024002400240024020060e020001000b200241e8026a2001108d0120022802e8020d0320022802ec022204200128020028020441b0026e2203200320044b1bad42b0027e2208422088a70d072008a72203417f4c0d070240024020030d00410821050c010b200310242205450d090b2001200128020441016a2206360204200241003602901020022005360288102002200341b0026e36028c10024002400240200620012802084b0d0002402004450d00200241d0156a410472210b410021030340200241d0156a200110b40220022802d0152106200241f0106a200b41ac0210cf061a20064117460d03200241a0136a200241f0106a41ac0210cf061a02402003200228028c10470d0020024188106a2003410110c501200228028810210520022802901021030b2005200341b0026c6a22072006360200200741046a200241a0136a41ac0210cf061a2002200341016a2203360290102004417f6a22040d000b200128020421060b20012006417f6a3602042005450d06200229028c102108410121010c040b20024188106a21060c010b20024188106a21062003450d002002280288102101200341b0026c21030340200110d501200141b0026a2101200341d07d6a22030d000b0b200641046a2802002201450d03200141b0026c450d03200628020010260c030b2001280200220328020422064102490d02200328020022042f0000210720032006417e6a3602042003200441026a3602002001200128020441016a2203360204200320012802084b0d02200241d0156a200110b40220022802d0152103200241f0106a200241d0156a41047241ac0210cf061a20034117460d02200241d0156a200241f0106a41ac0210cf061a41b00210242205450d0120052003360200200541046a200241d0156a41ac0210cf061a20012001280204417f6a360204410221010b200020013b01042000410f3602002000410c6a2008370200200041086a2005360200200041066a20073b0100200041146a200241c0066a419c0210cf061a0c1d0b102c000b200041173602000c1b0b0240200128020022032802042204450d00200328020022052d0000210620032004417f6a3602042003200541016a36020041062104200641064b0d00024002400240024002400240024002400240024002400240024020060e0700010203040805000b200241b8026a2001108d0120022802b8020d0c200128020022032802042204450d0c20022802bc022105200328020022072d0000210620032004417f6a3602042003200741016a360200200641014b0d0c4100210b0240024020060e020100010b4101210b0b200241b0026a2001108d01410021030240024020022802b002450d000c010b20012802002204280204220720022802b4022206490d002006417f4c0d100240024020060d004100210a410121030c010b2006102a2203450d122001280200220428020421072006210a0b024020072006490d0020032004280200200610cf061a200428020422072006490d0a2006ad422086200aad8421082004200720066b3602042004200428020020066a3602000c010b0240200a450d00200310260b410021030b2003450d0c2008a72106200241a8026a2001108d01024020022802a8020d00024002402001280200220a280204220d20022802ac0222074f0d0041002104420021094200210f0c010b2007417f4c0d110240024020070d0041002101410121040c010b2007102a2204450d132001280200220a280204210d200721010b0240200d2007490d002004200a280200200710cf061a200a280204220d2007490d0c2007ad4220862001ad842109200a200d20076b360204200a200a28020020076a3602004200210f0c010b02402001450d00200410260b420021094200210f410021040b2004450d002009420020041b2109200f420020041b210f2008422088420020031b2004ad4220868421132006ad4220862003ad842108410121040c080b2006450d0c200310260c0c0b200241c0026a2001108d0120022802c0020d0b20022802c4022105410221040c040b2001280200220128020422034104490d0a20012802002206280000210520012003417c6a3602042001200641046a360200410321040c030b200241d0026a2001108d0120022802d0020d0920012802002206280204220420022802d4022203490d092003417f4c0d0c0240024020030d0041002107410121050c010b2003102a2205450d0e200128020022062802042104200321070b0240024020042003490d0020052006280200200310cf0621042006280204220b20034f0d012003200b41b8afc0001048000b20070d090c0a0b2006200b20036b3602042006200628020020036a3602002004450d092003ad4220862007ad842108200241c8026a2001108d0120022802c8020d0720012802002206280204220420022802cc022203490d072003417f4c0d0c0240024020030d0041002101410121070c010b2003102a2207450d0e200128020022062802042104200321010b0240024020042003490d0020072006280200200310cf0621042006280204220720034f0d012003200741b8afc0001048000b2001450d08200710260c080b2006200720036b3602042006200628020020036a3602002004450d072003ad4220862001ad84220f4220882109200f4220862004ad8421134200210f410421040c030b200241d8026a2001108d0120022802d8020d0820022802dc02210741002103200241003a00c013024002400340200128020022062802042204450d01200241a0136a20036a200628020022052d00003a000020062004417f6a3602042006200541016a3602002002200341016a22033a00c01320034120470d000b200241800b6a410f6a200241a0136a410f6a290000370000200220022900a7133700870b200220022800a3133600830b200220022f00a1133b00810b200220022d00a0133a00800b200241bf136a310000210f20022900b713210941002103200241003a00c0130340200128020022062802042204450d02200241a0136a20036a200628020022052d00003a000020062004417f6a3602042006200541016a3602002002200341016a22033a00c01320034120470d000b200241f0106a41186a200241a0136a41186a2903002208370300200241e00a6a41086a200241a0136a41086a290300370300200241e00a6a41106a200241a0136a41106a290300370300200241e00a6a41186a2008370300200220022903a0133703e00a2002418f0b6a290000211320022900870b210820022800830b210520022f00810b210e20022d00800b210b20022f01e00a20022d00e20a411074722103200241fb0a6a3100002111200241eb0a6a290000211220022900f30a211020022900e30a211720022d00ff0a210a20022f00fd0a210d20022d00fc0a210c410521040c050b200341ff0171450d09200241003a00c0130c090b200341ff0171450d08200241003a00c0130c080b200241e0026a2001108d0120022802e0020d0720022802e4022105410721040b0b0b200020033b00252000200d3b00422000200c3a00412000200e3b01062000200b3a0005200020043a00042000410e360200200041276a20034110763a0000200041c0006a20113c0000200041386a2010370000200041306a2012370000200041286a2017370000200041246a200f3c00002000411c6a2009370200200041146a20133702002000410c6a2008370200200041c8006a2007360200200041c4006a200a3a0000200041086a2005360200200041cc006a200241d0156a41e40110cf061a0c1f0b2006200741b8afc0001048000b2007200d41b8afc0001048000b2008a7450d010b200510260b200041173602000c1a0b0240200128020022012802042203450d00200128020022062d0000210420012003417f6a3602042001200641016a36020020040d002000410d360200200041046a200241d0156a41ac0210cf061a0c1a0b200041173602000c190b2001280200220328020422064104490d0b20032802002204280000212020032006417c6a3602042003200441046a360200200241a0026a2001108d0120022802a0020d0b20012802002206280204220420022802a4022203490d0b2003417f4c0d000240024020030d0041002101410121050c010b2003102a2205450d02200128020022062802042104200321010b0240024020042003490d0020052006280200200310cf0621042006280204220520034f0d012003200541b8afc0001048000b2001450d0c200510260c0c0b2006200520036b3602042006200628020020036a3602002004450d0b200241a8066a41086a20024188106a41086a290000370300200241a8066a410f6a20024188106a410f6a290000370000200241840a6a41026a200241f0036a41026a2d00003a0000200241880a6a41086a200241a0136a41086a290200370300200241880a6a41106a200241a0136a41106a290200370300200220022d00da043a00a60a200220022f01d8043b01a40a20022002290088103703a806200220022f00f0033b01840a200220022902a0133703880a200241e4096a41026a200241a80d6a41026a2d00003a0000200241e8096a41086a200241f0106a41086a290200370300200241e8096a41106a200241f0106a41106a290200370300200241c4096a41026a200241a00b6a41026a2d00003a0000200241c8096a41086a200241c0066a41086a290200370300200241c8096a41106a200241c0066a41106a290200370300200220022f00a80d3b01e409200220022902f0103703e809200220022f00a00b3b01c409200220022902c0063703c80920024180066a41206a200241d0156a41206a28020036020020024180066a41186a200241d0156a41186a29020037030020024180066a41106a200241d0156a41106a29020037030020024180066a41086a200241d0156a41086a290200370300200241c0096a41026a200241f00e6a41026a2d00003a0000200220022902d01537038006200220022f00f00e3b01c0092003ad4220862001ad842208422088211120084220862004ad84211342002114410421010c060b1034000b1033000b2001280200220328020422064104490d0820032802002204280000210b20032006417c6a3602042003200441046a3602002001280200220328020422064110490d082003280200220441086a290000210f200429000021102003200441106a3602002003200641706a36020441002103200241003a00c01302400340200128020022062802042204450d01200241a0136a20036a200628020022052d00003a000020062004417f6a3602042006200541016a3602002002200341016a22033a00c01320034120470d000b200241c0066a41086a2201200241a0136a410f6a290000370300200241c0066a41106a2203200241b7136a290000370300200241c0066a41186a2206200241bf136a2d00003a0000200220022900a71322083703f010200220083703c00620022d00a013217020022f00a113216f20022800a313212020024188106a41186a220420062d00003a000020024188106a41106a2206200329030037030020024188106a41086a22032001290300370300200220022903c00637038810200631000021142003290300211120042d00002104200228029c10210520022f019a10216d20022d009910216e2002290388102113200220022d00820e3a00a60a200220022f01800e3b01a40a200241a8066a410f6a200241b80e6a410f6a290000370000200241a8066a41086a200241b80e6a41086a290000370300200220022900b80e3703a806200241840a6a41026a200241880d6a41026a2d00003a0000200220022f00880d3b01840a200241880a6a41106a200241d8046a41106a290200370300200241880a6a41086a200241d8046a41086a290200370300200220022902d8043703880a200241e4096a41026a200241e00a6a41026a2d00003a0000200220022f00e00a3b01e409200241e8096a41106a200241a00b6a41106a290200370300200241e8096a41086a200241a00b6a41086a290200370300200220022902a00b3703e809200241c4096a41026a200241a80a6a41026a2d00003a0000200220022f00a80a3b01c409200241c8096a41106a200241f00e6a41106a290200370300200241c8096a41086a200241f00e6a41086a290200370300200220022902f00e3703c80920024180066a41206a200241d0156a41206a28020036020020024180066a41186a200241d0156a41186a29030037030020024180066a41106a200241d0156a41106a29030037030020024180066a41086a200241d0156a41086a290300370300200220022903d01537038006200241c0096a41026a200241fc0b6a41026a2d00003a0000200220022f00fc0b3b01c009410321010c050b200341ff0171450d08200241003a00c0130c080b41002103200241003a00f0150240024002400340200128020022062802042204450d01200241d0156a20036a200628020022052d00003a000020062004417f6a3602042006200541016a3602002002200341016a22033a00f01520034120470d000b200241d0156a410f6a2900002108200241ef156a310000211020022900d715210920022800d315216d20022f00d115216e20022d00d015216f20022900e715210f200241d0156a200110e00520022d00d01522074103460d0a200241b80e6a410f6a200241d0156a41106a290000370000200241b80e6a41086a200241d9156a290000370300200241fc0b6a41026a200241eb156a22032d00003a0000200241d8046a41086a200241fc156a290200370300200241d8046a41106a20024184166a290200370300200220022900d1153703b80e2002200241e9156a2f00003b01fc0b2002200241f4156a2902003703d804200241d0156a41186a2d0000211a200241ec156a2802002119200241d0156a41206a2802002118200241e00b6a41026a2002418f166a2d00003a0000200241f0036a41086a200241a0166a2206290300370300200241f0036a41106a200241a8166a220429030037030020022002418d166a2f00003b01e00b200220024198166a22052903003703f0032002418c166a2d0000210e20024190166a280200210c20024194166a280200210d200241b0166a2d0000210a200241d0156a200110e00520022d00d0154103460d0a200241e00a6a41026a20022d00d2153a000020024188106a41086a200241e3156a29000037030020024188106a41106a2003290000370300200241a0136a41086a200241fb156a290000370300200241a0136a41106a20024183166a290000370300200241a0136a41186a2002418b166a290000370300200241a0136a41206a20024193166a280000360200200220022f01d0153b01e00a2002200241db156a290000370388102002200241f3156a2900003703a01320022800d315212120022800d715211b200241a80a6a41026a200241ae166a2d00003a00002002200241ac166a2f01003b01a80a20042802002122200241a4166a2802002129200628020021282005290300211720024197166a2d00002166200241af166a2f00002167200241d0156a200110df0520022802d4152270450d0a200241dc156a290200211120022802d81521712001280200220328020422064104490d02200f422888201042188684a7216a200f420888a7216b2008423088a721682008422888a7216c200fa7216920022802d015212020032802002204280000217220032006417c6a3602042003200441046a36020041002103200241003a00f0150340200128020022062802042204450d02200241d0156a20036a200628020022052d00003a000020062004417f6a3602042006200541016a3602002002200341016a22033a00f01520034120470d000b200241c0066a410f6a200241d0156a410f6a290000370000200241c0066a411f6a200241d0156a411f6a3100003c0000200220022900e7153700d706200220022900d7153700c706200220022800d3153600c306200220022f00d1153b00c106200220022d00d0153a00c006200241d4066a290200210f20022802c806210b20022f01c606210320022d00c506210620022d00c406210420022802c006210520022902cc06211020022802dc0621732002206d36008f0d2002206e3b008d0d2002206f3a008c0d200241800e6a410f6a226f200241b80e6a410f6a290000370000200241800e6a41086a2274200241b80e6a41086a290300370300200220022903b80e3703800e41022101200241900f6a41026a2275200241fc0b6a41026a2d00003a0000200220022f01fc0b3b01900f200241a80d6a41106a2265200241d8046a41106a290300370300200241a80d6a41086a2276200241d8046a41086a290300370300200220022903d8043703a80d200241d80e6a41026a2277200241e00b6a41026a2d00003a0000200220022f01e00b3b01d80e200241a00b6a41106a2278200241f0036a41106a290300370300200241a00b6a41086a2279200241f0036a41086a290300370300200220022903f0033703a00b200241a00e6a41026a227a200241e00a6a41026a2d00003a0000200220022f01e00a3b01a00e200241f00e6a41106a222620024188106a41106a290300370300200241f00e6a41086a222720024188106a41086a29030037030020022002290388103703f00e200241f0106a41206a2223200241a0136a41206a280200360200200241f0106a41186a2248200241a0136a41186a290300370300200241f0106a41106a222b200241a0136a41106a290300370300200241f0106a41086a2224200241a0136a41086a290300370300200220022903a0133703f010200241e80d6a41026a2238200241a80a6a41026a2d00003a0000200220022f01a80a3b01e80d200220733602880d20022903880d21122002200241920d6a2d00003a00c60b200220022f01900d3b01c40b20074103460d0a2072411076216d2072410876216e2071ad4220862070ad8421132072ad2114200241a8066a41086a2074290300370300200241a8066a410f6a206f290000370000200241840a6a41026a20752d00003a0000200241880a6a41086a2076290300370300200241880a6a41106a2065290300370300200220022d00c60b3a00a60a200220022f01c40b3b01a40a200220022903800e3703a806200220022f01900f3b01840a200220022903a80d3703880a200241e4096a41026a20772d00003a0000200241e8096a41106a2078290300370300200241e8096a41086a2079290300370300200241c4096a41026a207a2d00003a0000200241c8096a41106a2026290300370300200241c8096a41086a2027290300370300200220022f01d80e3b01e409200220022903a00b3703e809200220022f01a00e3b01c409200220022903f00e3703c80920024180066a41206a202328020036020020024180066a41186a204829030037030020024180066a41106a202b29030037030020024180066a41086a2024290300370300200220022903f01037038006200241c0096a41026a20382d00003a0000200220022f01e80d3b01c0090c060b200341ff0171450d09200241003a00f0150c090b200341ff0171450d00200241003a00f0150b02402011a72201450d002001410c6c21032070210103400240200141046a280200450d00200128020010260b2001410c6a2101200341746a22030d000b0b2071450d072071410c6c450d07207010260c070b20012006417f6a3602042020450d060b20022902fc0c2113200241a8066a41086a200241980c6a41086a290000370300200241a8066a410f6a200241980c6a410f6a290000370000200241840a6a41026a200241950c6a41026a2d00003a0000200241880a6a41086a200241fc0b6a41086a290200370300200241880a6a41106a200241fc0b6a41106a290200370300200220022d00b20c3a00a60a200220022f01b00c3b01a40a200220022900980c3703a806200220022f00950c3b01840a200220022902fc0b3703880a200241e4096a41026a200241f90b6a41026a2d00003a0000200241e8096a41086a200241e00b6a41086a290200370300200241e8096a41106a200241e00b6a41106a290200370300200241c4096a41026a200241dd0b6a41026a2d00003a0000200241c8096a41086a200241c40b6a41086a290200370300200241c8096a41106a200241c40b6a41106a290200370300200220022f00f90b3b01e409200220022902e00b3703e809200220022f00dd0b3b01c409200220022902c40b3703c80920024180066a41206a200241a00b6a41206a28020036020020024180066a41186a200241a00b6a41186a29030037030020024180066a41106a200241a00b6a41106a29030037030020024180066a41086a200241a00b6a41086a290300370300200241c0096a41026a2002419d0b6a41026a2d00003a0000200220022903a00b37038006200220022f009d0b3b01c009410121010b0b200241e8056a41086a2271200241a8066a41086a290300370300200241e8056a410f6a2272200241a8066a410f6a2900003700002002419c096a41026a2273200241840a6a41026a2d00003a0000200241a0096a41086a2274200241880a6a41086a290300370300200241a0096a41106a2275200241880a6a41106a290300370300200220022d00a60a3a00ba09200220022f01a40a3b01b809200220022903a8063703e805200220022f01840a3b019c09200220022903880a3703a009200241fc086a41026a2265200241e4096a41026a2d00003a000020024180096a41086a2276200241e8096a41086a29030037030020024180096a41106a2277200241e8096a41106a290300370300200241dc086a41026a2278200241c4096a41026a2d00003a0000200241e0086a41086a2279200241c8096a41086a290300370300200241e0086a41106a227a200241c8096a41106a290300370300200220022f01e4093b01fc08200220022903e80937038009200220022f01c4093b01dc08200220022903c8093703e008200241c0056a41206a222620024180066a41206a280200360200200241c0056a41186a222720024180066a41186a290300370300200241c0056a41106a222320024180066a41106a290300370300200241c0056a41086a224820024180066a41086a290300370300200241bc056a41026a222b200241c0096a41026a2d00003a000020022002290380063703c005200220022f01c0093b01bc05200041386a200f370200200041306a2010370200200041206a20143c0000200041186a2011370200200041c0006a20123702002000412c6a200b3602002000412a6a20033b0100200020063a0029200041286a20043a0000200041246a20053602002000206d3b00222000206e3a0021200041106a20133702002000410c6a20203602002000206f3b000a200020703a0009200041086a20013a00002000410c360200200041d7006a20084220883c0000200041d3006a20083e0000200041dc006a206b360200200041e0006a206a360200200041cb006a2009370000200041e4006a20073a0000200020693a005b200020683b0059200041d8006a206c3a0000200041c8006a20022f01b8093b0100200041ca006a20022d00ba093a0000200020022903e805370065200041ed006a2071290300370000200041f4006a2072290000370000200041fc006a201a3a0000200041ff006a20732d00003a0000200020022f019c093b007d20004184016a201836020020004180016a201936020020004198016a207529030037020020004190016a207429030037020020004188016a20022903a009370200200041a0016a200e3a0000200041a3016a20652d00003a0000200020022f01fc083b00a101200041a8016a200d360200200041a4016a200c360200200041bc016a2077290300370200200041b4016a2076290300370200200041ac016a200229038009370200200041c4016a200a3a0000200041c7016a20782d00003a0000200020022f01dc083b00c501200041cc016a201b360200200041c8016a2021360200200041e0016a207a290300370200200041d8016a2079290300370200200041d0016a20022903e00837020020004188026a202628020036020020004180026a2027290300370200200041f8016a2023290300370200200041f0016a2048290300370200200041e8016a20022903c0053702002000202236009d02200020293600990220002028360095022000201737008d022000418c026a20663a0000200041a3026a202b2d00003a0000200020022f01bc053b00a102200041a4026a20673602000c100b200241f80c6a210520022802800d2201450d0120022802f80c220620014198026c6a210403400240200641d8006a280200450d00200628025410260b0240200641186a2802002203450d00200628021021012003410474210303400240200141046a280200450d00200128020010260b200141106a2101200341706a22030d000b0b0240200641146a28020041ffffffff0071450d00200628021010260b0240200628021c2201450d00200641206a280200450d00200110260b024020064184026a2802002201450d00200141c1006c450d0020062802800210260b20064198026a210120064190026a4100360200200628028c0221032006410136028c02024020064194026a280200450d00200310260b2001210620012004470d000c020b0b200241f80c6a21050b200541046a2802002201450d0020014198026c450d00200528020010260b200041173602000c0c0b2004450d00201828020021012004410c6c210303400240200141046a280200450d00200128020010260b2001410c6a2101200341746a22030d000b0b201841046a2802002201450d002001410c6c450d00201828020010260b2009a7450d00200b10260b200041173602000c080b200041173602000c070b4100210741002106410021010b200020073b0126200020013a0025200020043b0006200020053a00052000200a3a000420004103360200200041226a20084230883c0000200041206a20084220883d01002000411c6a20083e0200200041146a20093702002000410c6a200f370200200041286a2006360200200041236a200b3b0000200041086a20033602002000412c6a200241d0156a41840210cf061a0c050b200041173602000c040b200041173602000c030b2005450d00200a2802002101200541186c210303400240200141046a280200450d00200128020010260b0240200141106a280200450d002001410c6a28020010260b200141186a2101200341686a22030d000b0b200a41046a2802002201450d00200141186c450d00200a28020010260b200041173602000b20024180186a24000b900101027f230041e0046b22012400200141b0026a200010b60220012802b0022102200141046a200141b0026a41047241ac0210cf061a02400240024020024117460d00200141b0026a200141046a41ac0210cf061a41b00210242200450d0120002002360200200041046a200141b0026a41ac0210cf061a0c020b410021000c010b102c000b200141e0046a240020000b82da0207087f027e037f097e207f037e037f230041d0146b220224000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012802042203450d00200128020022042d0000210520012003417f6a22063602042001200441016a360200200541164b0d18200141046a210720050e170102030405060708090a0b0c0d0e0f1011121314151617010b200041173602000c450b2006450d4320042d0001210520012003417e6a22083602042001200441026a360200200541094b0d43410a21090240024002400240024002400240024002400240024020050e0a00010203040506070809000b20084104490d4d2004280002210620012003417a6a3602042001200441066a3602002006418194ebdc034f0d4d410121090c080b200241086a2001108f0120022802080d4c20072802002203200228020c2204490d4c2004417f4c0d230240024020040d0041002105410121060c010b2004102a2206450d2a20072802002103200421050b0240024020032004490d0020062001280200200410cf0621032001280204220720044f0d012004200741b8afc0001048000b20050d4c0c4d0b2001200720046b3602042001200128020020046a3602002003450d4c2004ad4220862005ad84210a410221090c070b20084108490d4b2004290002210a2001200341766a36020420012004410a6a360200410321090c060b200241106a2001108f0120022802100d4a2007280200220320022802142204490d4a2004417f4c0d210240024020040d0041002105410121060c010b2004102a2206450d2820072802002103200421050b0240024020032004490d0020062001280200200410cf0621032001280204220720044f0d012004200741b8afc0001048000b20050d4a0c4b0b2001200720046b3602042001200128020020046a3602002003450d4a2004ad4220862005ad84210a410421090c050b200241186a2001108f0120022802180d4920072802002203200228021c2204490d492004417f4c0d200240024020040d0041002105410121060c010b2004102a2206450d2720072802002103200421050b0240024020032004490d0020062001280200200410cf0621032001280204220720044f0d012004200741b8afc0001048000b20050d490c4a0b2001200720046b3602042001200128020020046a3602002003450d492004ad4220862005ad84210a410521090c040b2008450d4820042d0002210520012003417d6a22073602042001200441036a360200200541014b0d484106210941002106024020050e020400040b20074104490d482004350003210a2001200341796a22053602042001200441076a36020020054104490d482004350007210b2001200341756a36020420012004410b6a360200200a200b42208684210a410121060c030b200241306a2001108f0120022802300d4720022802342205200728020041186e2204200420054b1bad42187e220a422088a70d1e200aa72204417f4c0d1e0240024020040d00410421060c010b200410242206450d250b41002103200241003602f80f200220063602f00f2002200441186e3602f40f02402005450d000340200241286a2001108f0120022802280d472007280200220c200228022c2204490d472004417f4c0d200240024020040d0041002108410121090c010b2004102a2209450d272007280200210c200421080b02400240200c2004490d0020092001280200200410cf06210c2001280204220920044f0d012004200941b8afc0001048000b2008450d48200910260c480b2001200920046b3602042001200128020020046a360200200c450d472004ad4220862008ad84210a200241206a2001108f010240024020022802200d002007280200220920022802242204490d002004417f4c0d220240024020040d004100210d410121080c010b2004102a2208450d29200728020021092004210d0b0240024020092004490d0020082001280200200410cf0621092001280204220820044f0d012004200841b8afc0001048000b200d450d01200810260c010b2001200820046b3602042001200128020020046a36020020090d010b200aa7450d48200c10260c480b2004ad422086200dad84210b0240200320022802f40f470d00200241f00f6a2003410110f00120022802f00f210620022802f80f21030b2006200341186c6a2204200936020c2004200a3702042004200c360200200441106a200b3702002002200341016a22033602f80f2005417f6a22050d000b0b2006450d4720022902f40f210a410721090c020b200241f00f6a200110e10120022802f00f2206450d4620022902f40f210a410821090c010b200241386a2001108f0120022802380d4520072802002203200228023c2204490d452004417f4c0d1c0240024020040d0041002105410121060c010b2004102a2206450d2320072802002103200421050b0240024020032004490d0020062001280200200410cf0621032001280204220c20044f0d012004200c41b8afc0001048000b20050d450c460b2001200c20046b3602042001200128020020046a3602002003450d452004ad4220862005ad84210a200728020022044104490d0120012802002203280000210c20012004417c6a3602042001200341046a360200410921090b20004100360200200041186a200c360200200041106a200a3702002000410c6a2006360200200041086a2009360200200041206a200241a0126a41900210cf061a0c450b200aa7450d430c420b02402006450d0020042d0001210520012003417e6a3602042001200441026a360200200541014b0d000240024002400240024020050e020001000b200241a0126a200110e405200241ac126a2802002205450d04200241a8086a41086a2203200241a0126a41086a280200360200200220022903a0123703a808200241b0126a22082802002106200241b4126a280200210420024188056a200241b8126a41e40010cf061a200241a4136a280200210c200241a0126a4180016a28020021072002419c136a2802002109200241f00f6a200241a8136a41800110cf061a200241a0126a200110de05024020022802a412450d00200241a00d6a41086a2003280200360200200220022903a8083703a00d20082802002101200241ac126a280200210320022802a812210820022903a012210a200241a0046a20024188056a41e40010cf061a200241c00d6a200241f00f6a41800110cf061a4101210d0c020b02402004450d00200441246c21042005210103400240024020012d0000220341044b0d0002400240024020030e050400010204040b2001410c6a280200450d03200141086a28020010260c030b2001410c6a280200450d02200141086a28020010260c020b2001410c6a280200450d01200141086a28020010260c010b200141086a280200450d00200141046a28020010260b200141246a21012004415c6a22040d000b0b02402006450d00200641246c450d00200510260b0240200c450d00200c41246c21042009210103400240024020012d0000220341044b0d0002400240024020030e050400010204040b2001410c6a280200450d03200141086a28020010260c030b2001410c6a280200450d02200141086a28020010260c020b2001410c6a280200450d01200141086a28020010260c010b200141086a280200450d00200141046a28020010260b200141246a21012004415c6a22040d000b0b2007450d04200741246c0d030c040b200241a0126a200110e405200241ac126a2802002205450d03200241a8086a41086a2203200241a0126a41086a280200360200200220022903a0123703a808200241b0126a22082802002106200241b4126a280200210420024188056a200241b8126a41e40010cf061a200241a4136a280200210c200241a0126a4180016a28020021072002419c136a2802002109200241f00f6a200241a8136a41800110cf061a200241a0126a200110de0520022802a412450d01200241a00d6a41086a2003280200360200200220022903a8083703a00d20082802002101200241ac126a280200210320022802a812210820022903a012210a200241a0046a20024188056a41e40010cf061a200241c00d6a200241f00f6a41800110cf061a4102210d0b200241800d6a41086a220e200241a00d6a41086a280200360200200220022903a00d3703800d200241b8036a200241a0046a41e40010cf061a20024188066a200241c00d6a41800110cf061a2000411c6a2001360200200041186a2003360200200041146a20083602002000410c6a200a370200200041086a200d36020020004101360200200041206a20022903800d370200200041286a200e280200360200200041346a2004360200200041306a20063602002000412c6a2005360200200041386a200241b8036a41e40010cf061a200041a4016a200c360200200041a0016a20073602002000419c016a2009360200200041a8016a20024188066a41800110cf061a0c460b02402004450d00200441246c21042005210103400240024020012d0000220341044b0d0002400240024020030e050400010204040b2001410c6a280200450d03200141086a28020010260c030b2001410c6a280200450d02200141086a28020010260c020b2001410c6a280200450d01200141086a28020010260c010b200141086a280200450d00200141046a28020010260b200141246a21012004415c6a22040d000b0b02402006450d00200641246c450d00200510260b0240200c450d00200c41246c21042009210103400240024020012d0000220341044b0d0002400240024020030e050400010204040b2001410c6a280200450d03200141086a28020010260c030b2001410c6a280200450d02200141086a28020010260c020b2001410c6a280200450d01200141086a28020010260c010b200141086a280200450d00200141046a28020010260b200141246a21012004415c6a22040d000b0b2007450d01200741246c450d010b200910260b200041173602000c430b2006450d3e20042d0001210520012003417e6a22063602042001200441026a36020020050d3e2006450d3e20042d0002210520012003417d6a22073602042001200441036a360200024002400240200541037122064103460d000240024020060e03030001030b2007450d4220042d0003210620012003417c6a3602042001200441046a3602002006410874200572220141ffff0371418002490d42200141fcff0371410276ad210a0c030b20074103490d41200441056a2d0000210620042f0003210720012003417a6a3602042001200441066a3602002007200641107472410874200572220141808004490d412001410276ad210a0c020b02402005410276220c41044b0d0002400240200c0e050002020201000b20074104490d42200428000321052001200341796a3602042001200441076a3602002005418080808004490d422005ad210a0c030b20074108490d412004290003210a2001200341756a36020420012004410b6a360200200a42ffffffffffffffff00560d020c410b200541134b0d40200c41046a21062003417c6a2103200441046a2104410021054200210a03402003417f460d412004417f6a310000210b20012003360204200120043602002003417f6a2103200441016a2104200b2005410374413871ad86200a84210a200541016a220541ff01712006490d000b200a427f4128200c4103746b413871ad88580d400c010b2005410276ad210a0b20004102360200200041086a200a370300200041106a200241a0126a41a00210cf061a0c420b2006450d3c20042d0001210520012003417e6a22063602042001200441026a360200200541044b0d3c0240024002400240024020050e050001020304000b20064104490d402004280002210520012003417a6a3602042001200441066a36020020023502d00d200241d40d6a330100200241d60d6a3100004210868442208684210a20022f00d70d210320022d00d90d210120022f01da0d210620022802dc0d2104410121090c3f0b41002105200241003a0090102003417e6a210c417d210702400340200c2005460d01200241f00f6a20056a200420056a220641026a2d00003a00002001200320076a3602042001200641036a3602002002200541016a22063a0090102007417f6a21072006210520064120470d000b200641ff01714120490d40200320066b2208417e6a4104490d40200229008710220a4238882002418f106a31000042088684a72103200241ff0f6a290000210f20022900f70f210b20022800f30f210520022f00f10f210720022d00f00f210c41022109200420066a220641026a280000210420012008417a6a3602042001200641066a3602000c3f0b200541ff0171450d3f200241003a0090100c3f0b20064104490d3e2004280002210520012003417a6a3602042001200441066a36020020023502b00d200241b40d6a330100200241b60d6a3100004210868442208684210a41032109410021060c3c0b41002105200241003a0090102003417e6a210c417d21070240024002400340200c2005460d01200241f00f6a20056a200420056a220641026a2d00003a00002001200320076a3602042001200641036a3602002002200541016a22063a0090102007417f6a21072006210520064120470d000b200641ff01714120490d40200320066b2209417e6a4104490d40200229008710210a2002418f106a3100002110200241ff0f6a290000210f20022900f70f210b20022800f30f210520022f00f10f210720022d00f00f210c200420066a220841026a280000210420012009417a6a3602042001200841066a220d3602002003417a6a2006460d40200d2d000021032001200941796a3602042001200841076a360200200341014b0d40200a42388820104208868421104100210120030e020201020b200541ff0171450d3f200241003a0090100c3f0b410121010b2010a72103410421090c3c0b20064104490d3c2004280002210520012003417a6a3602042001200441066a36020020023502e80b200241ec0b6a330100200241ee0b6a3100004210868442208684210a4105210941002103410021060c3a0b02402006450d0020042d0001210520012003417e6a3602042001200441026a360200200541034b0d00024002400240024020050e0400010203000b41002105200241003a0090102003417e6a21072003417d6a21030240034020072005460d01200241f00f6a20056a200420056a220641026a2d00003a0000200120033602042001200641036a3602002002200541016a22063a0090102003417f6a21032006210520064120470d000b200641ff01714120490d042002418f106a310000210b200241ff0f6a290000210f200229008710211020022900f70f210a20022800f30f210920022f00f10f210820022d00f00f210d200241c0006a200110b3052002290340a70d04200241d0006a290300211120022903482112200241d80d6a290300211320022903d00d2114410121010c3d0b200541ff0171450d03200241003a0090100c030b41002105200241003a0090102003417e6a21072003417d6a21030240034020072005460d01200241f00f6a20056a200420056a220641026a2d00003a0000200120033602042001200641036a3602002002200541016a22063a0090102003417f6a21032006210520064120470d000b200641ff01714120490d032002418f106a310000210b200241ff0f6a290000210f200229008710211020022900f70f210a20022800f30f210920022f00f10f210820022d00f00f210d200241f0006a200110b3052002290370a70d03200241f0006a41106a290300211120022903782112200241d8006a200110b3052002290358a70d03200241d8006a41106a290300211520022903602116410221010c3c0b200541ff0171450d02200241003a0090100c020b41002105200241003a009010410220036b210c2003417d6a2106024002400340200c20056a450d01200241f00f6a20056a200420056a220741026a2d00003a0000200120063602042001200741036a3602002002200541016a22073a0090102006417f6a21062007210520074120470d000b200741ff01714120490d032002418f106a310000210b200241ff0f6a290000210f200229008710211020022900f70f210a20022800f30f210920022f00f10f210820022d00f00f210d41002105200241003a009010200420076a210c200720036b41026a21030340200320056a450d02200241f00f6a20056a200c20056a220441026a2d00003a0000200120063602042001200441036a3602002002200541016a22043a0090102006417f6a21062004210520044120470d000b200441ff01714120490d032002418f106a3100002111200229008710211620022900f70f211720022800f30f210420022f00f10f210320022d00f00f2105200241a00d6a410f6a200241f00f6a410f6a290000370000200220173700a70d200220043600a30d200220033b00a10d200220053a00a00d20024188016a200110b305200229038801a70d0320024198016a29030021132002290390012114200241c00d6a410f6a2201200241a00d6a410f6a290000370000200241c00d6a41086a200241a00d6a41086a290300370300200220022903a00d22173703c00d201142ff018321152001290000211120022900c70d2112410321010c3c0b200541ff0171450d02200241003a0090100c020b200541ff0171450d01200241003a0090100c010b41002105200241003a0090102003417e6a21072003417d6a21030240034020072005460d01200241f00f6a20056a200420056a220641026a2d00003a0000200120033602042001200641036a3602002002200541016a22063a0090102003417f6a21032006210520064120470d000b200641ff01714120490d0120022900871021102002418f106a310000210b20022900f70f210a20022800f30f210920022f00f10f210820022d00f00f210d200241d80b6a410f6a200241f00f6a410f6a290000220f3700002002200a3700df0b200220093600db0b200220083b00d90b2002200d3a00d80b200241a0016a200110b30520022903a001a70d01200241b0016a290300211120022903a80121122010428080808080608320104280feffffff1f8384201042ff0183842110200241a0056a29030021132002290398052114410421010c3a0b200541ff0171450d00200241003a0090100b200041173602000c400b2006450d3620042d0001210520012003417e6a3602042001200441026a36020020050d36200241b8016a2001108f0120022802b8010d3620022802bc012206200728020041f0006e2204200420064b1bad42f0007e220a422088a70d15200aa72203417f4c0d150240024020030d004104210c0c010b20031024220c450d1c0b4100210420024100360290052002200c360288052002200341f0006e36028c05024002402006450d00200241f00f6a41086a21090340200241f00f6a200110e30220022802f40f210320022802f00f2107200241c00d6a200941e80010cf061a2003450d0220024188066a200241c00d6a41e80010cf061a02402004200228028c05470d0020024188056a2004410110c101200228028805210c20022802900521040b200c200441f0006c6a2205200336020420052007360200200541086a20024188066a41e80010cf061a2002200441016a2204360290052006417f6a22060d000b0b200c450d37200229028c05210a2000200c36020420004105360200200041086a200a370200200041106a200241a0126a41a00210cf061a0c400b2004450d35200441f0006c2104200c41046a21010c340b02402006450d0020012003417e6a3602042001200441026a3602000b200041173602000c3e0b2006450d3120042d0001210520012003417e6a3602042001200441026a360200200541014b0d31410021040240024020050e020001000b200241a0126a200110b00320022d00a0124101460d32200241f00f6a200241a0126a41017241a00110cf061a200241c0016a2001108f0120022802c0010d322007280200220520022802c4012203490d322003417f4c0d140240024020030d0041002106410121040c010b2003102a2204450d1b20072802002105200321060b0240024020052003490d0020042001280200200310cf0621052001280204220720034f0d012003200741b8afc0001048000b2006450d33200410260c330b2001200720036b3602042001200128020020036a3602002005450d322003ad4220862006ad84210a200241c00d6a200241f00f6a41a00110cf061a0b20024188066a200241c00d6a41a00110cf061a200041086a200a3702002000200436020420004107360200200041106a20024188066a41a00110cf061a200041b0016a20024188056a41800110cf061a0c3d0b02402006450d0020042d0001210520012003417e6a3602042001200441026a36020020050d00200241c8016a2001108f0120022802c8010d0020022802cc0121012000410836020020002001360204200041086a200241a0126a41a80210cf061a0c3d0b200041173602000c3c0b02402006450d0020042d0001210520012003417e6a22063602042001200441026a360200200541024b0d00024002400240024020050e03000102000b200241a0126a200110ce0420022903a8124202510d03200241f00f6a200241a0126a41800210cf061a200241a0126a200110de0520022802a412450d03200241b0126a2802002101200241ac126a280200210420022802a812210320022903a012210a200241c00d6a200241f00f6a41800210cf061a200a422088a72107200aa72105410121060c020b200241a0126a200110ce0420022903a8124202510d02200241f00f6a200241a0126a41800210cf061a200241a0126a200110de0520022802a412450d02200241b0126a2802002101200241ac126a280200210420022802a812210320022903a012210a200241c00d6a200241f00f6a41800210cf061a200a422088a72107200aa72105410221060c010b20064104490d012004280002210520012003417a6a22073602042001200441066a36020041032106200741034d0d01200428000621072001200341766a36020420012004410a6a360200200241c00d6a200241a0126a41800210cf061a0b20024188066a200241c00d6a41800210cf061a2000411c6a2001360200200041186a2004360200200041146a2003360200200041106a20073602002000410c6a2005360200200041086a200636020020004109360200200041206a20024188066a41800210cf061a200041a8026a20024188056a41086a290300370300200041a0026a2002290388053703000c3c0b200041173602000c3b0b2006450d2d20042d0001210520012003417e6a22063602042001200441026a36020020050d2d20064104490d2d2004280002210520012003417a6a3602042001200441066a360200200241e0016a2001108f0120022802e0010d2d2007280200220320022802e4012204490d2d2004417f4c0d100240024020040d00410021064101210c0c010b2004102a220c450d1720072802002103200421060b0240024020032004490d00200c2001280200200410cf0621092001280204220320044f0d012004200341b8afc0001048000b2006450d2e200c10260c2e0b2001200320046b3602042001200128020020046a3602002009450d2d2004ad4220862006ad84210b200241d8016a2001108f0120022802d8010d2c20022802dc01220c2007280200410c6e22042004200c4b1bad420c7e220a422088a70d10200aa72204417f4c0d100240024020040d00410421080c010b200410242208450d170b41002103200241003602f80f200220083602f00f20022004410c6e22063602f40f0240200c450d00410021030340200241d0016a2001108f0120022802d0010d2d2007280200220620022802d4012204490d2d2004417f4c0d120240024020040d004100210e4101210d0c010b2004102a220d450d19200728020021062004210e0b0240024020062004490d00200d2001280200200410cf0621062001280204220d20044f0d012004200d41b8afc0001048000b200e450d2e200d10260c2e0b2001200d20046b3602042001200128020020046a3602002006450d2d2004ad422086200ead84200a20061b210a0240200320022802f40f470d00200241f00f6a2003410110cb0120022802f00f210820022802f80f21030b20082003410c6c6a2204200a370204200420063602002002200341016a22033602f80f200c417f6a220c0d000b20022802f40f21060b2008450d2c200ba721040240024002400240200728020022074104490d002001280200220c280000210e20012007417c6a220d3602042001200c41046a360200200d4104490d01200c28000421182001200741786a220d3602042001200c41086a360200200d41044f0d0202402004450d00200910260b02402003450d002003410c6c21042008210103400240200141046a280200450d00200128020010260b2001410c6a2101200441746a22040d000b0b2006450d312006410c6c0d030c310b02402004450d00200910260b02402003450d002003410c6c21042008210103400240200141046a280200450d00200128020010260b2001410c6a2101200441746a22040d000b0b2006450d302006410c6c0d020c300b02402004450d00200910260b02402003450d002003410c6c21042008210103400240200141046a280200450d00200128020010260b2001410c6a2101200441746a22040d000b0b2006450d2f2006410c6c0d010c2f0b200c280008210d2001200741746a3602042001200c410c6a3602002009450d2e200241f00f6a200110dc0120022d00f00f4101470d1202402004450d00200910260b02402003450d002003410c6c21042008210103400240200141046a280200450d00200128020010260b2001410c6a2101200441746a22040d000b0b2006450d2e2006410c6c450d2e0b200810260c2d0b02402006450d0020012003417e6a3602042001200441026a3602000b200041173602000c390b2006450d2820042d0001210520012003417e6a22063602042001200441026a360200200541034b0d280240024002400240024020050e0400010203000b200241b8036a200110db0120022802b8032205450d2c200241f80b6a41086a200241e00c6a41086a290300370300200241d0086a41086a200241800d6a41086a290000370300200241d0086a410f6a200241800d6a410f6a290000370000200220022903e00c3703f80b200220022f01b80d3b01ec08200220022900800d3703d00820022902bc032111200241f00f6a41106a310000211020022903f80f211720022d008110210120022f0182102119200228028410210c200241bc0b6a41026a200241c00c6a41026a2d00003a0000200241c00b6a41086a200241c00d6a41086a290200370300200241c00b6a41106a200241c00d6a41106a2902003703002002419c0b6a41026a200241d80b6a41026a2d00003a0000200241a00b6a41086a200241a0046a41086a290200370300200241a00b6a41106a200241a0046a41106a290200370300200220022f00c00c3b01bc0b200220022902c00d3703c00b200220022f00d80b3b019c0b200220022902a0043703a00b200241fc0a6a41026a200241880c6a41026a2d00003a0000200241800b6a41106a200241a00d6a41106a290200370300200241800b6a41086a200241a00d6a41086a29020037030020024188066a41206a200241a0126a41206a28020036020020024188066a41186a200241a0126a41186a29030037030020024188066a41106a200241a0126a41106a29030037030020024188066a41086a200241a0126a41086a290300370300200220022f00880c3b01fc0a200220022902a00d3703800b200220022903a01237038806200241c40a6a41026a200241bc0d6a41026a2d00003a0000200220022f00bc0d3b01c40a420021124101211a0c030b41002105200241003a00c0122003417e6a210c2003417d6a21030240024002400340200c2005460d01200241a0126a20056a200420056a220641026a2d00003a0000200120033602042001200641036a3602002002200541016a22063a00c0122003417f6a21032006210520064120470d000b200641ff01714120490d2e20022900b712210b200241bf126a310000211020022900a712210a20022800a312210420022f00a112210320022d00a0122105200241d80b6a410f6a200241a0126a410f6a2900003700002002200a3700df0b200220043600db0b200220033b00d90b200220053a00d80b200241a0126a200110e10520022d00a01222044103460d2e2002419f096a200241a0126a41106a29000037000020024190096a41086a200241a9126a290000370300200241bc0d6a41026a200241bb126a22052d00003a0000200241a8086a41086a200241cc126a290200370300200241a8086a41106a200241d4126a290200370300200220022900a112370390092002200241b9126a2f00003b01bc0d2002200241c4126a2902003703a808200241a0126a41186a2d00002118200241bc126a280200210e200241a0126a41206a280200210d200241b80d6a41026a200241df126a2d00003a0000200241a00d6a41086a200241f0126a220c290300370300200241a00d6a41106a200241f8126a221b2903003703002002200241dd126a2f00003b01b80d2002200241e8126a221c2903003703a00d200241dc126a2d00002108200241e0126a2802002109200241e4126a280200210620024180136a2d00002103200241a0126a200110e10520022d00a0124103460d2e200241d0096a41026a20022d00a2123a0000200241b8036a41086a200241b3126a290000370300200241b8036a41106a2005290000370300200241f00f6a41086a200241cb126a290000370300200241f00f6a41106a200241d3126a290000370300200241f00f6a41186a200241db126a290000370300200241f00f6a41206a200241e3126a280000360200200220022f01a0123b01d0092002200241ab126a2900003703b8032002200241c3126a2900003703f00f20022800a312211d20022800a712211e200241880c6a41026a200241fe126a2d00003a00002002200241fc126a2f01003b01880c201b280200211f200241f4126a2802002120200c280200211b201c290300210f200241e7126a2d00002121200241ff126a2f0000211c200241a0126a200110de0520022802a4122222450d2e200241ac126a280200212320022802a8122124200728020022194104490d02200b422888201042188684a72107200b420888a72125200ba72126200241b0126a280200212720022802a012210520012802002228280000212920012019417c6a222a3602042001202841046a3602004100210c200241003a00c0042019417b6a21190340202a200c460d02200241a0046a200c6a2028200c6a221a41046a2d00003a0000200120193602042001201a41056a3602002002200c41016a221a3a00c0042019417f6a2119201a210c201a4120470d000b201a41ff01714120490d02200241bf046a310000210a20022900b704210b20022900a704211020022800a304210120022f00a104210c20022d00a0042119200241b3126a200241a0046a410f6a290000370000200241c3126a200a3c0000200241b0096a41086a222a200241e40b6a290200370300200220013600a7122002200b3700bb12200220103700ab122002200c3b00a512200220193a00a412200220293602a012200220022902dc0b3703b009200241a0126a41086a3100002110200241a0126a41186a290300210b20022802ac12210c20022f01aa12211920022903a012211720022d00a912210120022903b012210a20023502c012211620023502d80b211320022d00ec0b2128200220022f00ed0b3b018c09200241f0086a410f6a20024190096a410f6a290000370000200241f0086a41086a222920024190096a41086a29030037030020022002290390093703f0084102211a2002419c0d6a41026a222b200241bc0d6a41026a2d00003a0000200220022f01bc0d3b019c0d200241800d6a41106a222c200241a8086a41106a290300370300200241800d6a41086a222d200241a8086a41086a290300370300200220022903a8083703800d200241fc0c6a41026a222e200241b80d6a41026a2d00003a0000200220022f01b80d3b01fc0c200241e00c6a41106a222f200241a00d6a41106a290300370300200241e00c6a41086a2230200241a00d6a41086a290300370300200220022903a00d3703e00c200241dc0c6a41026a2231200241d0096a41026a2d00003a0000200220022f01d0093b01dc0c200241c00c6a41106a2232200241b8036a41106a290300370300200241c00c6a41086a2233200241b8036a41086a290300370300200220022903b8033703c00c200241c00d6a41206a200241f00f6a41206a280200360200200241c00d6a41186a2234200241f00f6a41186a290300370300200241c00d6a41106a2235200241f00f6a41106a290300370300200241c00d6a41086a2236200241f00f6a41086a290300370300200220022903f00f3703c00d200241bc0c6a41026a2237200241880c6a41026a2d00003a0000200220022f01880c3b01bc0c20044103460d2e2027ad4220862023ad8421122024ad4220862022ad84211120134220862016842116200241f80b6a41086a202a290300370300200241d0086a41086a2029290300370300200241d0086a410f6a200241f0086a410f6a290000370000200241bc0b6a41026a202b2d00003a0000200241c00b6a41106a202c290300370300200241c00b6a41086a202d290300370300200220022903b0093703f80b200220022f018c093b01ec08200220022903f0083703d008200220022f019c0d3b01bc0b200220022903800d3703c00b2002419c0b6a41026a202e2d00003a0000200241a00b6a41086a2030290300370300200241a00b6a41106a202f290300370300200241fc0a6a41026a20312d00003a0000200241800b6a41086a2033290300370300200241800b6a41106a2032290300370300200220022f01fc0c3b019c0b200220022903e00c3703a00b200220022f01dc0c3b01fc0a200220022903c00c3703800b20024188066a41206a200241c00d6a41206a28020036020020024188066a41186a203429030037030020024188066a41106a203529030037030020024188066a41086a2036290300370300200241c40a6a41026a20372d00003a0000200220022903c00d37038806200220022f01bc0c3b01c40a0c050b200541ff0171450d2d200241003a00c0120c2d0b200c41ff0171450d00200241003a00c0040b02402023450d002023410c6c21042022210103400240200141046a280200450d00200128020010260b2001410c6a2101200441746a22040d000b0b2024450d2b2024410c6c450d2b202210260c2b0b20064104490d2a2004280002210c20012003417a6a22053602042001200441066a36020020054110490d2a2004410e6a290000210b2004290006210a20012003416a6a22073602042001200441166a36020041002105200241003a009010200341696a21030240034020072005460d01200241f00f6a20056a200420056a220641166a2d00003a0000200120033602042001200641176a3602002002200541016a22063a0090102003417f6a21032006210520064120470d000b200641ff01714120490d2b2002418f106a3100002110200241f00f6a410f6a2900002112200229008710211720022900f70f211120022800f30f210520022f00f10f212a20022d00f00f2122200241f80b6a41086a200241e00c6a41086a290300370300200241d0086a41086a200241800d6a41086a290000370300200241d0086a410f6a200241800d6a410f6a290000370000200241bc0b6a41026a200241c00c6a41026a2d00003a0000200241c00b6a41106a200241c00d6a41106a290200370300200241c00b6a41086a200241c00d6a41086a290200370300200220022903e00c3703f80b200220022f01b80d3b01ec08200220022900800d3703d008200220022f00c00c3b01bc0b200220022902c00d3703c00b2002419c0b6a41026a200241d80b6a41026a2d00003a0000200241a00b6a41086a200241a0046a41086a290200370300200241a00b6a41106a200241a0046a41106a290200370300200241fc0a6a41026a200241880c6a41026a2d00003a0000200241800b6a41086a200241a00d6a41086a290200370300200241800b6a41106a200241a00d6a41106a290200370300200220022f00d80b3b019c0b200220022902a0043703a00b200220022f00880c3b01fc0a200220022902a00d3703800b20024188066a41206a200241a0126a41206a28020036020020024188066a41186a200241a0126a41186a29030037030020024188066a41106a200241a0126a41106a29030037030020024188066a41086a200241a0126a41086a290300370300200241c40a6a41026a200241bc0d6a41026a2d00003a0000200220022903a01237038806200220022f00bc0d3b01c40a4103211a0c020b200541ff0171450d2a200241003a0090100c2a0b20064104490d292004280002210520012003417a6a3602042001200441066a360200200241e8016a2001108f0120022802e8010d290240024002402007280200220620022802ec0122034f0d00410021044200210a0c010b2003417f4c0d110240024020030d0041002107410121040c010b2003102a2204450d1820072802002106200321070b024020062003490d0020042001280200200310cf061a200128020422062003490d142001200620036b3602042001200128020020036a3602002003ad4220862007ad84220a422088210b200a422086210a0c020b02402007450d00200410260b4200210a410021040b4200210b0b2004450d29200241f80b6a41086a200241a8086a41086a290200370300200241d0086a41086a200241b8036a41086a290000370300200241d0086a410f6a200241b8036a410f6a290000370000200241bc0b6a41026a200241a00d6a41026a2d00003a0000200241c00b6a41106a200241f00f6a41106a290200370300200241c00b6a41086a200241f00f6a41086a290200370300200220022902a8083703f80b200220022f0190093b01ec08200220022900b8033703d008200220022f00a00d3b01bc0b200220022902f00f3703c00b2002419c0b6a41026a200241800d6a41026a2d00003a0000200241a00b6a41086a200241c00d6a41086a290200370300200241a00b6a41106a200241c00d6a41106a290200370300200241fc0a6a41026a200241e00c6a41026a2d00003a0000200241800b6a41086a200241a0046a41086a290200370300200241800b6a41106a200241a0046a41106a290200370300200220022f00800d3b019c0b200220022902c00d3703a00b200220022f00e00c3b01fc0a200220022902a0043703800b20024188066a41206a200241a0126a41206a28020036020020024188066a41186a200241a0126a41186a29020037030020024188066a41106a200241a0126a41106a29020037030020024188066a41086a200241a0126a41086a290200370300200241c40a6a41026a200241c00c6a41026a2d00003a0000200220022902a01237038806200220022f00c00c3b01c40a200b420020041b42ffffffff0f832112200a420020041b2004ad8421114104211a0b200241e80a6a41086a2224200241f80b6a41086a290300370300200241c80a6a41086a2223200241d0086a41086a290300370300200241c80a6a410f6a2229200241d0086a410f6a290000370000200241a40a6a41026a2227200241bc0b6a41026a2d00003a0000200241a80a6a41106a222b200241c00b6a41106a290300370300200241a80a6a41086a222c200241c00b6a41086a290300370300200220022903f80b3703e80a200220022f01ec083b01a408200220022903d0083703c80a200220022f01bc0b3b01a40a200220022903c00b3703a80a200241840a6a41026a222d2002419c0b6a41026a2d00003a0000200241880a6a41086a222e200241a00b6a41086a290300370300200241880a6a41106a222f200241a00b6a41106a290300370300200241e4096a41026a2230200241fc0a6a41026a2d00003a0000200241e8096a41086a2231200241800b6a41086a290300370300200241e8096a41106a2232200241800b6a41106a290300370300200220022f019c0b3b01840a200220022903a00b3703880a200220022f01fc0a3b01e409200220022903800b3703e80920024188056a41206a223320024188066a41206a28020036020020024188056a41186a223420024188066a41186a29030037030020024188056a41106a223520024188066a41106a29030037030020024188056a41086a223620024188066a41086a290300370300200241ac096a41026a2237200241c40a6a41026a2d00003a0000200220022903880637038805200220022f01c40a3b01ac09200041386a200b370200200041306a200a370200200041286a20103c0000200041206a2017370200200041186a2012370200200041106a2011370200200041c0006a20163702002000412c6a200c360200200020193b002a200020013a00292000410c6a20053602002000202a3b000a200020223a0009200041086a201a3a00002000410c360200200041d8006a20283a0000200041c8006a20022903e80a370200200041d0006a2024290300370200200041e4006a20043a0000200041e0006a2007360200200041dc006a2025360200200020263a005b200020022f01a4083b0059200041f4006a2029290000370000200041ed006a2023290300370000200020022903c80a370065200041fc006a20183a0000200041ff006a20272d00003a0000200020022f01a40a3b007d20004184016a200d36020020004180016a200e36020020004198016a202b29030037020020004190016a202c29030037020020004188016a20022903a80a370200200041a0016a20083a0000200041a3016a202d2d00003a0000200020022f01840a3b00a101200041a8016a2006360200200041a4016a2009360200200041bc016a202f290300370200200041b4016a202e290300370200200041ac016a20022903880a370200200041c4016a20033a0000200041c7016a20302d00003a0000200020022f01e4093b00c501200041cc016a201e360200200041c8016a201d360200200041e0016a2032290300370200200041d8016a2031290300370200200041d0016a20022903e80937020020004188026a203328020036020020004180026a2034290300370200200041f8016a2035290300370200200041f0016a2036290300370200200041e8016a2002290388053702002000201f36009d0220002020360099022000201b360095022000200f37008d022000418c026a20213a0000200041a3026a20372d00003a0000200020022f01ac093b00a102200041a4026a201c3602000c380b02402006450d0020042d0001210520012003417e6a3602042001200441026a36020020050d002000410d360200200041046a200241a0126a41ac0210cf061a0c380b200041173602000c370b2006450d2520042d0001210520012003417e6a221b3602042001200441026a3602004106210c200541064b0d2502400240024002400240024002400240024020050e0700010203040805000b20024180026a2001108f012002280280020d2d20072802002203450d2d2002280284022109200128020022052d0000210420012003417f6a3602042001200541016a360200200441014b0d2d410021080240024020040e020100010b410121080b200241f8016a2001108f01410021040240024020022802f8010d002007280200220520022802fc012203490d012003417f4c0d160240024020030d0041002106410121040c010b2003102a2204450d1d20072802002105200321060b024020052003490d0020042001280200200310cf061a200128020422052003490d1a2003ad4220862006ad84210a2001200520036b3602042001200128020020036a3602000c020b02402006450d00200410260b410021040b0b2004450d2d200aa72103200241f0016a2001108f01024020022802f0010d00024002402007280200220c20022802f40122064f0d00410021054200210b0c010b2006417f4c0d160240024020060d0041002107410121050c010b2006102a2205450d1d2007280200210c200621070b0240200c2006490d0020052001280200200610cf061a2001280204220c2006490d1b2006ad4220862007ad84210b2001200c20066b3602042001200128020020066a3602000c010b02402007450d00200510260b4200210b410021050b2005450d00200b420020051b21164200420020051b210f200a422088420020041b2005ad42208684210b2003ad4220862004ad84210a4101210c0c080b2003450d2d200410260c2d0b20024188026a2001108f012002280288020d2c200228028c0221094102210c0c040b201b4104490d2b2004280002210920012003417a6a3602042001200441066a3602004103210c0c030b20024198026a2001108f012002280298020d2a20072802002203200228029c022204490d2a2004417f4c0d110240024020040d0041002105410121090c010b2004102a2209450d1820072802002103200421050b0240024020032004490d0020092001280200200410cf0621032001280204220620044f0d012004200641b8afc0001048000b20050d2a0c2b0b2001200620046b3602042001200128020020046a3602002003450d2a2004ad4220862005ad84210a20024190026a2001108f012002280290020d28200728020022032002280294022204490d282004417f4c0d110240024020040d0041002105410121060c010b2004102a2206450d1820072802002103200421050b0240024020032004490d0020062001280200200410cf0621032001280204220620044f0d012004200641b8afc0001048000b2005450d29200610260c290b2001200620046b3602042001200128020020046a3602002003450d282004ad4220862005ad84220b4220882116200b4220862003ad84210b4200210f4104210c0c030b200241a0026a2001108f0120022802a0020d2920022802a402210d41002103200241003a0090102007280200417f6a21040240024003402004417f460d01200241f00f6a20036a200128020022052d00003a0000200120043602042001200541016a3602002002200341016a22053a0090102004417f6a21042005210320054120470d000b200541ff01714120490d2b200229008710220a42ff01832110200a4280feffffff1f832117200a428080808080608321112002418f106a310000210f20022900f70f210a20022800f30f210920022f00f10f210e20022d00f00f2108200241d80b6a410f6a200241f00f6a410f6a290000220b3700002002200a3700df0b200220093600db0b2002200e3b00d90b200220083a00d80b41002103200241003a00901003402004417f460d02200241f00f6a20036a200128020022052d00003a0000200120043602042001200541016a3602002002200341016a22053a0090102004417f6a21042005210320054120470d000b200241c00d6a41086a2201200241f00f6a41086a290300370300200241c00d6a41106a2204200241f00f6a41106a290300370300200241c00d6a41186a2203200241f00f6a41186a290300370300200220022903f00f3703c00d200541ff0171411f4d0d2b20024188056a41086a200129030037030020024188056a41106a200429030037030020024188056a41186a2003290300370300200220022903c00d370388052011201784201084211620022f01880520022d008a05411074722106200241a3056a310000211220024193056a290000211720022d00a705211d20022f00a505211e20022d00a4052118200229009b052111200229008b0521104105210c0c050b200341ff0171450d2a200241003a0090100c2a0b200341ff0171450d29200241003a0090100c290b200241a8026a2001108f0120022802a8020d2820022802ac0221094107210c0b0b0b200020063b00252000201e3b0042200020183a00412000200e3b0106200020083a00052000200c3a00042000410e360200200041276a20064110763a0000200041c0006a20123c0000200041386a2011370000200041306a2017370000200041286a2010370000200041246a200f3c00002000411c6a2016370200200041146a200b3702002000410c6a200a370200200041c8006a200d360200200041c4006a201d3a0000200041086a2009360200200041cc006a200241a0126a41e40110cf061a0c360b2006450d2120042d0001210520012003417e6a22063602042001200441026a360200200541014b0d2102400240024020050e020001000b200241b0026a2001108f0120022802b0020d2320022802b4022205200728020041b0026e2204200420054b1bad42b0027e220a422088a70d0d200aa72203417f4c0d0d0240024020030d00410821060c010b200310242206450d140b41002104200241003602900520022006360288052002200341b0026e36028c05024002402005450d00200241a0126a410472210c0340200241a0126a200110b60220022802a0122103200241c00d6a200c41ac0210cf061a20034117460d02200241f00f6a200241c00d6a41ac0210cf061a02402004200228028c05470d0020024188056a2004410110c501200228028805210620022802900521040b2006200441b0026c6a22072003360200200741046a200241f00f6a41ac0210cf061a2002200441016a2204360290052005417f6a22050d000b0b2006450d24200229028c05210a410121010c020b2004450d22200441b0026c2104200621010c210b20064102490d2220042f0002210520012003417c6a3602042001200441046a360200200241a0126a200110b60220022802a0122101200241c00d6a200241a0126a41047241ac0210cf061a20014117460d22200241a0126a200241c00d6a41ac0210cf061a41b00210242206450d1320062001360200200641046a200241a0126a41ac0210cf061a410221010b200020013b01042000410f3602002000410c6a200a370200200041086a2006360200200041066a20053b0100200041146a20024188066a419c0210cf061a0c350b2006450d1d20042d0001210520012003417e6a222b3602042001200441026a3602002005410e4b0d1d410421270240024002400240024002400240024002400240024002400240024020050e0f00010225030405060708090a0b0c0d000b41002105200241003a0090102003417e6a21072003417d6a21030240034020072005460d01200241f00f6a20056a200420056a220641026a2d00003a0000200120033602042001200641036a3602002002200541016a22063a0090102003417f6a21032006210520064120470d000b200641ff01714120490d2b2002418f106a310000210f200241f00f6a410f6a2900002110200229008710210b20022900f70f210a20022800f30f210620022f00f10f210820022d00f00f2109200241e80a6a41086a200241800d6a41086a290000370300200241c80a6a41086a200241a00d6a41086a290000370300200241c80a6a410f6a200241a00d6a410f6a290000370000200241c40a6a41026a200241e00c6a41026a2d00003a0000200241a80a6a41106a20024188066a41106a290000370300200241a80a6a41086a20024188066a41086a290000370300200220022900800d3703e80a200220022f01800b3b01e60a200220022900a00d3703c80a200220022f00e00c3b01c40a20022002290088063703a80a200241a40a6a41026a200241c00c6a41026a2d00003a0000200241880a6a41086a20024188056a41086a290000370300200241880a6a41106a20024188056a41106a290000370300200241840a6a41026a200241c00b6a41026a2d00003a0000200241e8096a41086a200241a0046a41086a290000370300200241e8096a41106a200241a0046a41106a290000370300200220022f00c00c3b01a40a20022002290088053703880a200220022f00c00b3b01840a200220022900a0043703e809200241b8036a41206a200241a0126a41206a280000360200200241b8036a41186a200241a0126a41186a290000370300200241b8036a41106a200241a0126a41106a290000370300200241b8036a41086a200241a0126a41086a290000370300200241e4096a41026a200241a00b6a41026a2d00003a0000200220022900a0123703b803200220022f00a00b3b01e409410121270c250b200541ff0171450d2a200241003a0090100c2a0b200241b8026a2001108f0120022802b8020d2920022802bc022209200728020041c8006e2204200420094b1bad42c8007e220a422088a70d16200aa72204417f4c0d160240024020040d00410421060c010b200410242206450d1d0b41002103200241003602900c200220063602880c2002200441c8006e36028c0c02402009450d00200241f00f6a410c6a210c200241f00f6a41017221080340200241f00f6a200110cf02024020022d00f00f22054106470d002002419c0d6a41026a200241b80d6a41026a2d00003a0000200241e00c6a41086a200241800d6a41086a290300370300200241e00c6a41106a200241800d6a41106a29030037030020024188066a41086a200241c00d6a41086a29030037030020024188066a41106a200241c00d6a41106a29030037030020024188066a41186a200241c00d6a41186a29030037030020024188066a41206a200241c00d6a41206a280200360200200220022f01b80d3b019c0d200220022903800d3703e00c200220022903c00d370388060c2b0b200241bc0d6a41026a220e200841026a2d00003a0000200241a00d6a41086a2218200c41086a290200370300200241a00d6a41106a221e200c41106a290200370300200220082f00003b01bc0d2002200c2902003703a00d20022802f40f210d20022802f80f2104200241a0126a200110cf020240024020022d00a0124106470d00024020054101470d002004450d00200d10260b410621050c010b200241b80d6a41026a200e2d00003a0000200241800d6a41086a2018290300370300200241800d6a41106a201e290300370300200241c00d6a41086a200241a0126a41086a290300370300200241c00d6a41106a200241a0126a41106a290300370300200241c00d6a41186a200241a0126a41186a290300370300200241c00d6a41206a200241a0126a41206a280200360200200220022f01bc0d3b01b80d200220022903a00d3703800d200220022903a0123703c00d2004211c200d21210b2002419c0d6a41026a2204200241b80d6a41026a2d00003a0000200241e00c6a41086a220d200241800d6a41086a290300370300200241e00c6a41106a220e200241800d6a41106a29030037030020024188066a41086a2218200241c00d6a41086a29030037030020024188066a41106a221e200241c00d6a41106a29030037030020024188066a41186a221d200241c00d6a41186a29030037030020024188066a41206a221b200241c00d6a41206a280200360200200220022f01b80d3b019c0d200220022903800d3703e00c200220022903c00d3703880620054106460d2a200241fc0c6a41026a222020042d00003a0000200241c00c6a41086a221f200d290300370300200241c00c6a41106a220d200e29030037030020024188056a41086a220e201829030037030020024188056a41106a2218201e29030037030020024188056a41186a221e201d29030037030020024188056a41206a221d201b280200360200200220022f019c0d3b01fc0c200220022903e00c3703c00c20022002290388063703880502402003200228028c0c470d00200241880c6a2003410110ef0120022802880c210620022802900c21030b2006200341c8006c6a220420053a0000200441086a201c360000200441046a2021360000200441036a20202d00003a0000200420022f01fc0c3b0001200441146a201f2903003700002004411c6a200d2903003700002004410c6a20022903c00c370000200441246a200229038805370000200441346a20182903003700002004412c6a200e2903003700002004413c6a201e290300370000200441c4006a201d2802003600002002200341016a22033602900c2009417f6a22090d000b0b2006450d29200229028c0c210a200241a0126a200110cf0202400240024002400240024020022d00a0124106460d00200241b0126a310000210f200241c0126a280200212b200241b8126a2903002117200241b4126a2209280200210c200241b2126a2f0100210d200241b1126a2d0000210e200241a0126a41086a2208290300210b20022802a412210520022802a0122104200241a0126a200110cf02200ba7210320022d00a0124106460d01200241a00d6a41086a200241bc126a221e290200370300200220092902003703a00d200241ac126a221d29020021162008280200210820022802a412212c20022802a0122109200241a0126a200110cf0220022d00a01222184106460d0220024188056a41086a200241b5126a29000037030020024197056a201e290000370000200220022f00a1123b01880c2002200241ad126a29000037038805200241a0126a41086a221c280200211e201d2d0000212020022d00a312211f20022802a412211d200241a0126a200110cf0220022d00a012221b4106460d03200241c00c6a41026a20022d00a3123a000020024188066a41086a200241b4126a222629020037030020024188066a41106a200241bc126a2219290200370300200220022f00a1123b01c00c2002200241ac126a221a29020037038806201c280200211c20022802a4122121200241a0126a200110cf0220022d00a01222254106460d05200241e00c6a41026a20022d00a3123a0000200241c00d6a41086a2026290200370300200241c00d6a41106a2019290200370300200220022f00a1123b01e00c2002201a2902003703c00d200241a0126a41086a280200212620022802a412211920072802002207450d2d200128020022242d0000212320012007417f6a22293602042001202441016a360200202341014b0d2d4100212220230e021b041b0b0240200a422088a72201450d002006200141c8006c6a2104200621010340024020012d00004101470d00200141086a280200450d00200141046a28020010260b0240200141246a2d00004101470d002001412c6a280200450d00200141286a28020010260b200141c8006a22012004470d000b0b200aa72201450d2e200141c8006c450d2e200610260c2e0b0240200441ff01714101470d002003450d00200510260b0240200a422088a72201450d002006200141c8006c6a2104200621010340024020012d00004101470d00200141086a280200450d00200141046a28020010260b0240200141246a2d00004101470d002001412c6a280200450d00200141286a28020010260b200141c8006a22012004470d000b0b200aa72201450d2d200141c8006c450d2d200610260c2d0b0240200941ff01714101470d002008450d00202c10260b0240200441ff01714101470d002003450d00200510260b0240200a422088a72201450d002006200141c8006c6a2104200621010340024020012d00004101470d00200141086a280200450d00200141046a28020010260b0240200141246a2d00004101470d002001412c6a280200450d00200141286a28020010260b200141c8006a22012004470d000b0b200aa72201450d2c200141c8006c450d2c200610260c2c0b024020184101470d00201e450d00201d10260b0240200941ff01714101470d002008450d00202c10260b0240200441ff01714101470d002003450d00200510260b0240200a422088a72201450d002006200141c8006c6a2104200621010340024020012d00004101470d00200141086a280200450d00200141046a28020010260b0240200141246a2d00004101470d002001412c6a280200450d00200141286a28020010260b200141c8006a22012004470d000b0b200aa72201450d2b200141c8006c450d2b200610260c2b0b200241003a00b4122029450d2820242d0001211a20012007417e6a22283602042001202441026a360200200241013a00b4122002201a3a00a01220280d150c270b0240201b4101470d00201c450d00202110260b024020184101470d00201e450d00201d10260b0240200941ff01714101470d002008450d00202c10260b0240200441ff01714101470d002003450d00200510260b0240200a422088a72201450d002006200141c8006c6a2104200621010340024020012d00004101470d00200141086a280200450d00200141046a28020010260b0240200141246a2d00004101470d002001412c6a280200450d00200141286a28020010260b200141c8006a22012004470d000b0b200aa72201450d29200141c8006c450d29200610260c290b200241c0026a2001108f0120022802c0020d2820022802c4022209200728020041c4006e2204200420094b1bad42c4007e220a422088a70d15200aa72204417f4c0d150240024020040d00410421060c010b200410242206450d1c0b4100210c200241003602c80b200220063602c00b2002200441c4006e3602c40b02402009450d00200241a0126a410172210d200241a0126a410f6a210e41002108034041002103200241003a00c012200841016a21082007280200417f6a21040240024003402004417f460d01200241a0126a20036a200128020022052d00003a0000200120043602042001200541016a3602002002200341016a22053a00c0122004417f6a21042005210320054120470d000b200541ff0171411f4b0d010c270b200341ff0171450d26200241003a00c0120c260b200241a0126a411f6a310000210b20022900b712210a200e290000210f20022900a712211020022d00a012210420022f00a112210520022800a3122118200241a0126a200110cf0220022d00a012221e4106460d25200a422888200b42188684a72103200a420888a7211d200aa7211b200241c00d6a411f6a2220200d411f6a280000360000200241c00d6a41186a221f200d41186a29000037030020024188066a41086a221c200d41086a29000037030020024188066a41106a2221200d41106a29000037030020024188066a41186a2225201f29030037030020024188066a411f6a221f20202800003600002002200d29000037038806200241d80b6a410f6a2220200f370000200220103700df0b200220183600db0b200220053b00d90b200220043a00d80b20024188056a411f6a2205201f28000036000020024188056a41186a2218202529030037030020024188056a41106a221f202129030037030020024188056a41086a2221201c2903003703002002200229038806370388050240200c20022802c40b470d00200241c00b6a200c410110eb0120022802c00b210620022802c80b210c0b200241d80b6a41086a290300210a2020290000210b20022903d80b210f2006200c41c4006c6a2204201e3a00202004200f3702002004411f6a2003411876ad3c00002004410f6a200b370000200441086a200a37020020042003ad422886201dad42088684201bad42ff0183843700172004200229038805370021200441296a2021290300370000200441316a201f290300370000200441396a2018290300370000200441c0006a20052800003600002002200c41016a220c3602c80b20082009470d000b0b2006450d2820022902c40b210a200241e80a6a41086a200241c00c6a41086a290300370300200241c80a6a41086a200241e00c6a41086a290000370300200241c80a6a410f6a200241e00c6a410f6a290000370000200241c40a6a41026a200241a00b6a41026a2d00003a0000200241a80a6a41106a200241a0046a41106a290200370300200241a80a6a41086a200241a0046a41086a290200370300200220022903c00c3703e80a200220022f01bc0d3b01e60a200220022900e00c3703c80a200220022f00a00b3b01c40a200220022902a0043703a80a200241a40a6a41026a200241800b6a41026a2d00003a0000200241880a6a41086a200241a00d6a41086a290200370300200241880a6a41106a200241a00d6a41106a290200370300200241840a6a41026a200241f80b6a41026a2d00003a0000200241e8096a41086a200241800d6a41086a290200370300200241e8096a41106a200241800d6a41106a290200370300200220022f00800b3b01a40a200220022902a00d3703880a200220022f00f80b3b01840a200220022902800d3703e809200241b8036a41206a200241f00f6a41206a280200360200200241b8036a41186a200241f00f6a41186a290300370300200241b8036a41106a200241f00f6a41106a290300370300200241b8036a41086a200241f00f6a41086a290300370300200241e4096a41026a200241880c6a41026a2d00003a0000200220022903f00f3703b803200220022f00880c3b01e409410321270c220b200241e0026a2001108f0120022802e0020d2720022802e4022106200241c8026a200110b30520022903c802a70d27200241c8026a41106a290300211020022903d002210a200241e80a6a41086a200241a0046a41086a290300370300200241c80a6a41086a20024188056a41086a290000370300200241c80a6a410f6a20024188056a410f6a290000370000200241c40a6a41026a200241a00d6a41026a2d00003a0000200241a80a6a41106a200241f00f6a41106a290200370300200241a80a6a41086a200241f00f6a41086a290200370300200220022903a0043703e80a200220022f01c00b3b01e60a20022002290088053703c80a200220022f00a00d3b01c40a200220022902f00f3703a80a200241a40a6a41026a200241800d6a41026a2d00003a0000200241880a6a41086a200241c00d6a41086a290200370300200241880a6a41106a200241c00d6a41106a290200370300200241840a6a41026a200241e00c6a41026a2d00003a0000200241e8096a41086a20024188066a41086a290200370300200241e8096a41106a20024188066a41106a290200370300200220022f00800d3b01a40a200220022902c00d3703880a200220022f00e00c3b01840a20022002290288063703e809200241b8036a41206a200241a0126a41206a280200360200200241b8036a41186a200241a0126a41186a290300370300200241b8036a41106a200241a0126a41106a290300370300200241b8036a41086a200241a0126a41086a290300370300200241e4096a41026a200241c00c6a41026a2d00003a0000200220022903a0123703b803200220022f00c00c3b01e409410521270c210b202b4104490d262004280002210620012003417a6a360204410621272001200441066a360200200241e80a6a41086a200241a0046a41086a290300370300200241c80a6a41086a20024188056a41086a290000370300200241c80a6a410f6a20024188056a410f6a290000370000200241c40a6a41026a200241a00d6a41026a2d00003a0000200220022903a0043703e80a200220022f01c00b3b01e60a20022002290088053703c80a200220022f00a00d3b01c40a200241a80a6a41106a200241f00f6a41106a290200370300200241a80a6a41086a200241f00f6a41086a290200370300200241a40a6a41026a200241800d6a41026a2d00003a0000200241880a6a41086a200241c00d6a41086a290200370300200241880a6a41106a200241c00d6a41106a290200370300200241840a6a41026a200241e00c6a41026a2d00003a0000200220022902f00f3703a80a200220022f00800d3b01a40a200220022902c00d3703880a200220022f00e00c3b01840a200241e8096a41106a20024188066a41106a290200370300200241e8096a41086a20024188066a41086a290200370300200241b8036a41206a200241a0126a41206a280200360200200241b8036a41186a200241a0126a41186a290300370300200241b8036a41106a200241a0126a41106a290300370300200241b8036a41086a200241a0126a41086a290300370300200241e4096a41026a200241c00c6a41026a2d00003a000020022002290288063703e809200220022903a0123703b803200220022f00c00c3b01e409420021100c200b20024180036a2001108f012002280280030d252002280284032106200241e8026a200110b30520022903e802a70d25200241e8026a41106a290300211020022903f002210a200241e80a6a41086a200241e00c6a41086a290300370300200241c80a6a41086a200241800d6a41086a290000370300200241c80a6a410f6a200241800d6a410f6a290000370000200241c40a6a41026a200241c00c6a41026a2d00003a0000200220022903e00c3703e80a200220022f01b80d3b01e60a200220022900800d3703c80a200220022f00c00c3b01c40a200229038010211720022802fc0f210c20022f01fa0f210d20022d00f90f210e200241a80a6a41106a200241c00d6a41106a290200370300200241a80a6a41086a200241c00d6a41086a290200370300200241a40a6a41026a200241d80b6a41026a2d00003a0000200241880a6a41086a200241a0046a41086a290200370300200241880a6a41106a200241a0046a41106a290200370300200241840a6a41026a200241880c6a41026a2d00003a0000200220022902c00d3703a80a200220022f00d80b3b01a40a200220022902a0043703880a200220022f00880c3b01840a200241e8096a41106a200241a00d6a41106a290200370300200241e8096a41086a200241a00d6a41086a290200370300200241b8036a41206a200241a0126a41206a280200360200200241b8036a41186a200241a0126a41186a290300370300200241b8036a41106a200241a0126a41106a290300370300200241b8036a41086a200241a0126a41086a290300370300200241e4096a41026a200241bc0d6a41026a2d00003a0000200220022902a00d3703e809200220022903a0123703b803200220022f00bc0d3b01e409410721270c1f0b20024188036a2001108f012002280288030d24200228028c03210c41002103200241003a0090102007280200417f6a2104024003402004417f460d01200241f00f6a20036a200128020022052d00003a0000200120043602042001200541016a3602002002200341016a22053a0090102004417f6a21042005210320054120470d000b200541ff0171411f4d0d25200241f00f6a411f6a310000210f200241f00f6a410f6a2900002110200229008710210b20022900f70f210a20022800f30f210620022f00f10f210820022d00f00f210941082127200241e80a6a41086a200241a00d6a41086a290300370300200241c80a6a41086a200241a0046a41086a290000370300200241c80a6a410f6a200241a0046a410f6a290000370000200241c40a6a41026a200241800d6a41026a2d00003a0000200241a80a6a41106a200241c00d6a41106a290200370300200241a80a6a41086a200241c00d6a41086a290200370300200220022903a00d3703e80a200220022f01a00b3b01e60a200220022900a0043703c80a200220022f00800d3b01c40a200220022902c00d3703a80a200241a40a6a41026a200241e00c6a41026a2d00003a0000200241880a6a41086a20024188066a41086a290200370300200241880a6a41106a20024188066a41106a290200370300200241840a6a41026a200241c00c6a41026a2d00003a0000200241e8096a41086a20024188056a41086a290200370300200241e8096a41106a20024188056a41106a290200370300200220022f00e00c3b01a40a20022002290288063703880a200220022f00c00c3b01840a20022002290288053703e809200241b8036a41206a200241a0126a41206a280200360200200241b8036a41186a200241a0126a41186a290300370300200241b8036a41106a200241a0126a41106a290300370300200241b8036a41086a200241a0126a41086a290300370300200241e4096a41026a200241c00b6a41026a2d00003a0000200220022903a0123703b803200220022f00c00b3b01e4090c1f0b200341ff0171450d24200241003a0090100c240b20024190036a2001108f012002280290030d23200728020022044108490d23200228029403210620012802002203290000210a2001200441786a3602042001200341086a360200200a4280025a0d23200241e80a6a41086a200241a0046a41086a290300370300200241c80a6a41086a20024188056a41086a290000370300200241c80a6a410f6a20024188056a410f6a290000370000200241c40a6a41026a200241a00d6a41026a2d00003a0000200241a80a6a41106a200241f00f6a41106a290200370300200241a80a6a41086a200241f00f6a41086a290200370300200220022903a0043703e80a200220022f01c00b3b01e60a20022002290088053703c80a200220022f00a00d3b01c40a200220022902f00f3703a80a200241a40a6a41026a200241800d6a41026a2d00003a0000200241880a6a41086a200241c00d6a41086a290200370300200241880a6a41106a200241c00d6a41106a290200370300200241840a6a41026a200241e00c6a41026a2d00003a0000200241e8096a41086a20024188066a41086a290200370300200241e8096a41106a20024188066a41106a290200370300200220022f00800d3b01a40a200220022902c00d3703880a200220022f00e00c3b01840a20022002290288063703e809200241b8036a41206a200241a0126a41206a280200360200200241b8036a41186a200241a0126a41186a290300370300200241b8036a41106a200241a0126a41106a290300370300200241b8036a41086a200241a0126a41086a290300370300200241e4096a41026a200241c00c6a41026a2d00003a0000200220022903a0123703b803200220022f00c00c3b01e409200a42ff0183210a410921270c1d0b20024198036a2001108f012002280298030d22200228029c03210c41002104200241003a00901020072802002107417f2103024002400240024002400240024002400240034020072004460d01200241f00f6a20046a200128020022052d00003a00002001200720036a3602042001200541016a3602002002200441016a22053a0090102003417f6a21032005210420054120470d000b200541ff01714120490d2b20072005460d2b2002418f106a310000210f200241ff0f6a2900002110200229008710210b20022900f70f210a20022800f30f210620022f00f10f210820022d00f00f21092001280200220d2d000021042001200720036a22033602042001200d41016a360200200441064b0d2b4200211720040e0708010203040506080b200441ff0171450d2a200241003a0090100c2a0b20034110490d29200d41096a2900002112200d29000121112001200720056b416f6a3602042001200d41116a360200420121170c060b420221170c040b420321170c030b420421170c020b420521170c010b420621170b0b200241e80a6a41086a200241e00c6a41086a290300370300200241c80a6a41086a200241800d6a41086a290000370300200241c80a6a410f6a200241800d6a410f6a290000370000200241c40a6a41026a200241c00c6a41026a2d00003a0000200241a80a6a41106a200241c00d6a41106a290200370300200241a80a6a41086a200241c00d6a41086a290200370300200220022903e00c3703e80a200220022f01b80d3b01e60a200220022900800d3703c80a200220022f00c00c3b01c40a200220022902c00d3703a80a200241a40a6a41026a200241d80b6a41026a2d00003a0000200241880a6a41086a200241a0046a41086a290200370300200241880a6a41106a200241a0046a41106a290200370300200241840a6a41026a200241880c6a41026a2d00003a0000200241e8096a41086a200241a00d6a41086a290200370300200241e8096a41106a200241a00d6a41106a290200370300200220022f00d80b3b01a40a200220022902a0043703880a200220022f00880c3b01840a200220022902a00d3703e809200241b8036a41206a200241a0126a41206a280200360200200241b8036a41186a200241a0126a41186a290300370300200241b8036a41106a200241a0126a41106a290300370300200241b8036a41086a200241a0126a41086a290300370300200241e4096a41026a200241bc0d6a41026a2d00003a0000200220022903a0123703b803200220022f00bc0d3b01e409410a21270c1c0b41002105200241003a0090102003417e6a21072003417d6a21030240034020072005460d01200241f00f6a20056a200420056a220641026a2d00003a0000200120033602042001200641036a3602002002200541016a22063a0090102003417f6a21032006210520064120470d000b200641ff01714120490d222002418f106a310000210f200241f00f6a410f6a2900002110200229008710210b20022900f70f210a20022800f30f210620022f00f10f210820022d00f00f2109200241e80a6a41086a200241a00d6a41086a290000370300200241c80a6a41086a200241a0046a41086a290000370300200241c80a6a410f6a200241a0046a410f6a290000370000200241c40a6a41026a200241800d6a41026a2d00003a0000200241a80a6a41106a200241c00d6a41106a290000370300200241a80a6a41086a200241c00d6a41086a290000370300200220022900a00d3703e80a200220022f01a00b3b01e60a200220022900a0043703c80a200220022f00800d3b01c40a200220022900c00d3703a80a200241a40a6a41026a200241e00c6a41026a2d00003a0000200241880a6a41086a20024188066a41086a290000370300200241880a6a41106a20024188066a41106a290000370300200241840a6a41026a200241c00c6a41026a2d00003a0000200241e8096a41086a20024188056a41086a290000370300200241e8096a41106a20024188056a41106a290000370300200220022f00e00c3b01a40a20022002290088063703880a200220022f00c00c3b01840a20022002290088053703e809200241b8036a41206a200241a0126a41206a280000360200200241b8036a41186a200241a0126a41186a290000370300200241b8036a41106a200241a0126a41106a290000370300200241b8036a41086a200241a0126a41086a290000370300200241e4096a41026a200241c00b6a41026a2d00003a0000200220022900a0123703b803200220022f00c00b3b01e409410b21270c1c0b200541ff0171450d21200241003a0090100c210b41002105200241003a00c0122003417e6a21072003417d6a21030240034020072005460d01200241a0126a20056a200420056a220641026a2d00003a0000200120033602042001200641036a3602002002200541016a22063a00c0122003417f6a21032006210520064120470d000b200641ff01714120490d21200241bf126a310000210f200241af126a290000211020022900b712210b20022900a712210a20022800a312210620022f00a112210820022d00a0122109200241a0126a200110cf0220022d00a0124106460d21200241e80a6a41086a200241800d6a41086a290300370300200241c80a6a41086a200241a00d6a41086a290000370300200241c80a6a410f6a200241a00d6a410f6a290000370000200220022903800d3703e80a200220022f01800b3b01e60a200220022900a00d3703c80a200241b4126a2902002112410c2127200241a0126a410c6a2902002111200241bc126a290200211620022902a412211720022802a012210c200241c40a6a41026a200241e00c6a41026a2d00003a0000200220022f00e00c3b01c40a200241a80a6a41106a20024188066a41106a290200370300200241a80a6a41086a20024188066a41086a29020037030020022002290288063703a80a200241a40a6a41026a200241c00c6a41026a2d00003a0000200220022f00c00c3b01a40a200241880a6a41106a20024188056a41106a290200370300200241880a6a41086a20024188056a41086a29020037030020022002290288053703880a200241840a6a41026a200241c00b6a41026a2d00003a0000200220022f00c00b3b01840a200241e8096a41106a200241a0046a41106a290200370300200241e8096a41086a200241a0046a41086a290200370300200220022902a0043703e809200241b8036a41206a200241f00f6a41206a280200360200200241b8036a41186a200241f00f6a41186a290300370300200241b8036a41106a200241f00f6a41106a290300370300200241b8036a41086a200241f00f6a41086a290300370300200220022903f00f3703b803200241e4096a41026a200241a00b6a41026a2d00003a0000200220022f00a00b3b01e4090c1b0b200541ff0171450d20200241003a00c0120c200b41002105200241003a00c0122003417e6a21072003417d6a21030240034020072005460d01200241a0126a20056a200420056a220641026a2d00003a0000200120033602042001200641036a3602002002200541016a22063a00c0122003417f6a21032006210520064120470d000b200641ff01714120490d20200241bf126a310000210f20022900b712210b20022900a712210a20022800a312210420022f00a112210320022d00a0122109200241a00d6a410f6a200241a0126a410f6a2900003700002002200a3700a70d200220043600a30d200220033b00a10d200220093a00a00d200241a0126a200110cf0220022d00a0124106460d20200241e80a6a41086a200241800d6a41086a290300370300200241c80a6a41086a200241a0046a41086a290000370300200241c80a6a410f6a200241a0046a410f6a290000370000200220022903800d3703e80a200220022f01800b3b01e60a200220022900a0043703c80a200241b4126a2902002112200241ac126a2902002111200241bc126a290200211620022902a412211720022802a012210c200241a00d6a410f6a290000211020022900a70d210a20022f00a10d210820022800a30d2106200241c40a6a41026a200241e00c6a41026a2d00003a0000200220022f00e00c3b01c40a200241a80a6a41106a200241c00d6a41106a290200370300200241a80a6a41086a200241c00d6a41086a290200370300200220022902c00d3703a80a200241a40a6a41026a200241c00c6a41026a2d00003a0000200220022f00c00c3b01a40a200241880a6a41106a20024188066a41106a290200370300200241880a6a41086a20024188066a41086a29020037030020022002290288063703880a200241840a6a41026a200241c00b6a41026a2d00003a0000200220022f00c00b3b01840a200241e8096a41106a20024188056a41106a290200370300200241e8096a41086a20024188056a41086a29020037030020022002290288053703e809200241b8036a41206a200241f00f6a41206a280200360200200241b8036a41186a200241f00f6a41186a290300370300200241b8036a41106a200241f00f6a41106a290300370300200241b8036a41086a200241f00f6a41086a290300370300200220022903f00f3703b803200241e4096a41026a200241a00b6a41026a2d00003a0000200220022f00a00b3b01e409410d21270c1a0b200541ff0171450d1f200241003a00c0120c1f0b41002105200241003a0090102003417e6a21072003417d6a21030240034020072005460d01200241f00f6a20056a200420056a220641026a2d00003a0000200120033602042001200641036a3602002002200541016a22063a0090102003417f6a21032006210520064120470d000b200641ff01714120490d1f2002418f106a310000210f200241f00f6a410f6a2900002110200229008710210b20022900f70f210a20022800f30f210620022f00f10f210820022d00f00f2109200241e80a6a41086a200241800d6a41086a290000370300200241c80a6a41086a200241a00d6a41086a290000370300200241c80a6a410f6a200241a00d6a410f6a290000370000200241c40a6a41026a200241e00c6a41026a2d00003a0000200241a80a6a41106a200241c00d6a41106a290000370300200241a80a6a41086a200241c00d6a41086a290000370300200220022900800d3703e80a200220022f01800b3b01e60a200220022900a00d3703c80a200220022f00e00c3b01c40a200220022900c00d3703a80a200241a40a6a41026a200241c00c6a41026a2d00003a0000200241880a6a41086a20024188066a41086a290000370300200241880a6a41106a20024188066a41106a290000370300200241840a6a41026a200241c00b6a41026a2d00003a0000200241e8096a41086a200241a0046a41086a290000370300200241e8096a41106a200241a0046a41106a290000370300200220022f00c00c3b01a40a20022002290088063703880a200220022f00c00b3b01840a200220022900a0043703e809200241b8036a41206a200241a0126a41206a280000360200200241b8036a41186a200241a0126a41186a290000370300200241b8036a41106a200241a0126a41106a290000370300200241b8036a41086a200241a0126a41086a290000370300200241e4096a41026a200241a00b6a41026a2d00003a0000200220022900a0123703b803200220022f00a00b3b01e409410e21270c190b200541ff0171450d1e200241003a0090100c1e0b410f21270c170b200241f00f6a200110c403024020022d00f00f410a460d00200241c00d6a200241f00f6a41c40010cf061a20004111360200200041046a200241c00d6a41c40010cf061a200041c8006a200241a0126a41e80110cf061a0c340b200041173602000c330b02402006450d0020042d0001210520012003417e6a3602042001200441026a360200200541034b0d004101210602400240024002400240024020050e0403000102030b41002105200241003a0090102003417e6a21072003417d6a21030240034020072005460d01200241f00f6a20056a200420056a220641026a2d00003a0000200120033602042001200641036a3602002002200541016a22063a0090102003417f6a21032006210520064120470d000b200641ff01714120490d062002418f106a3100002110200241ff0f6a2900002111200229008710210f20022900f70f211720022800f30f210c20022f00f10f210920022d00f00f21084200210b41022106420021380c030b200541ff0171450d05200241003a0090100c050b41002105200241003a0090102003417e6a210c417d210702400340200c2005460d01200241f00f6a20056a200420056a220641026a2d00003a00002001200320076a3602042001200641036a3602002002200541016a22063a0090102007417f6a21072006210520064120470d000b200641ff01714120490d05200320066b2203417e6a4110490d052002418f106a3100002110200241ff0f6a2900002111200229008710210f20022900f70f211720022800f30f210c20022f00f10f210920022d00f00f2108200420066a2204410a6a2900002116200441026a290000211220012003416e6a22053602042001200441126a220636020020054110490d052004411a6a29000021142006290000211320012003415e6a22053602042001200441226a220736020041032106200541034d0d052007280000210720012003415a6a3602042001200441266a360200200241d00d6a290300213920022903c80d211520022802d80d210e20022802dc0d210d4200210b420021380c020b200541ff0171450d04200241003a0090100c040b41002105200241003a0090102003417e6a210c200321060340200c2005460d02200241f00f6a20056a200420056a220741026a2d00003a000020012006417d6a3602042001200741036a3602002002200541016a22073a0090102006417f6a21062007210520074120470d000b200741ff01714120490d03200320076b417e6a210d2002418f106a3100002110200241ff0f6a2900002111200229008710210f20022900f70f211720022800f30f210c20022f00f10f210920022d00f00f210841002105200241003a009010200420076a210e2006417d6a21040340200d2005460d03200241f00f6a20056a200e20056a220741026a2d00003a0000200120043602042001200741036a3602002002200541016a22073a0090102004417f6a21042003417f6a21032007210520074120470d000b200741ff01714120490d0320022900871021122002418f106a310000211620022900f70f210a20022800f30f210420022f00f10f210320022d00f00f2105200241d80b6a410f6a200241f00f6a410f6a2900003700002002200a3700df0b200220043600db0b200220033b00d90b200220053a00d80b200620076b2203417e6a4110490d03200e20076a2204410a6a2900002113200441026a290000213a20012003416e6a22053602042001200441126a220636020020054110490d032004411a6a29000021392006290000211520012003415e6a22053602042001200441226a22073602004104210620054104490d032007280000210e20012003415a6a3602042001200441266a360200200241a00d6a410f6a2201200241d80b6a410f6a290000370000200241a00d6a41086a200241d80b6a41086a290300370300200220022903d80b220a3703a00d203a422088201342208684210b20134220882138201642ff018321142012428080808080608320124280feffffff1f8384201242ff01838421132001290000211620022900a70d2112203aa721070b2000200a3e0029200020093b000a200020083a0009200041123602002000412f6a200a4230883c00002000412d6a200a4220883d0000200041e8006a2039370200200041e0006a2015370200200041c8006a2014370200200041c0006a2013370200200041386a2016370200200041306a2012370200200041286a20103c0000200041206a200f370000200041186a2011370000200041106a2017370000200041f4006a200d360200200041f0006a200e3602002000410c6a200c360000200041086a20063a0000200041d0006a200b4220862007ad84370200200041d8006a2038422086200b42208884370200200041f8006a200241a0126a41b80110cf061a0c350b200541ff0171450d01200241003a0090100c010b200541ff0171450d00200241003a0090100b200041173602000c320b200241f00f6a2001109a04024020022d00f00f4107460d00200241c00d6a41206a200241f00f6a41206a2802002201360200200241c00d6a41186a200241f00f6a41186a290300220a370300200241c00d6a41106a200241f00f6a41106a290300220b370300200241c00d6a41086a200241f00f6a41086a290300220f370300200220022903f00f22103703c00d20004113360200200020103702042000410c6a200f370200200041146a200b3702002000411c6a200a370200200041246a2001360200200041286a200241a0126a41880210cf061a0c320b20004117360200200241f00f6a10b6060c310b200241c00d6a2001108305024020022d00c00d4105460d0020024188066a41206a200241c00d6a41206a290300220a37030020024188066a41186a200241c00d6a41186a290300220b370300200241f00f6a410c6a200241c00d6a41086a290300370200200241f00f6a41146a200241c00d6a41106a290300370200200241f00f6a411c6a200b370200200241f00f6a41246a200a370200200220022903c00d3702f40f20004114360200200020022902f00f3702042000410c6a200241f00f6a41086a290200370200200041146a200241f00f6a41106a2902003702002000411c6a200241f00f6a41186a290200370200200041246a200241f00f6a41206a2902003702002000412c6a20024198106a280200360200200041306a200241a0126a41800210cf061a0c310b200041173602000c300b2006450d1120042d0001210520012003417e6a221e3602042001200441026a360200200541054b0d1141042118024002400240024002400240024020050e06000102060304000b41002105200241003a0090102003417e6a210c417d21060240024002400340200c2005460d01200241f00f6a20056a200420056a220741026a2d00003a00002001200320066a3602042001200741036a3602002002200541016a22073a0090102006417f6a21062007210520074120470d000b200741ff01714120490d1a200241f00f6a410f6a290000210f200229008710210b20022900f70f210a20022800f30f210920022f00f10f210820022d00f00f210c200241c00d6a411f6a200241f00f6a411f6a31000022103c0000200241c00d6a410f6a200f3700002002200b3700d70d2002200a3700c70d200220093600c30d200220083b00c10d2002200c3a00c00d2003417e6a2007460d1a200420076a220541026a2d000021042001200320066a3602042001200541036a360200200441014b0d1a4104210620040e020201020b200541ff0171450d19200241003a0090100c190b2003417d6a2007460d18200541036a2d000021042001200320076b417c6a3602042001200541046a360200200441034b0d184100210602400240024020040e0403020001030b410221060c020b410321060c010b410121060b200110b5022207450d17410121180c050b41002105200241003a0090102003417e6a210c417d21060240024002400340200c2005460d01200241f00f6a20056a200420056a220741026a2d00003a00002001200320066a3602042001200741036a3602002002200541016a22073a0090102006417f6a21062007210520074120470d000b200741ff01714120490d192003417e6a2007460d192002418f106a3100002110200241ff0f6a290000210f200229008710210b20022900f70f210a20022800f30f210920022f00f10f210820022d00f00f210c41022118200420076a220541026a2d000021042001200320066a3602042001200541036a360200200441034b0d194100210620040e0407010602070b200541ff0171450d18200241003a0090100c180b410121060c050b410321060c040b41002105200241003a0090102003417e6a210c417d2106024002400240024002400340200c2005460d01200241f00f6a20056a200420056a220741026a2d00003a00002001200320066a3602042001200741036a3602002002200541016a22073a0090102006417f6a21062007210520074120470d000b200741ff01714120490d1a200241f00f6a410f6a290000210a200229008710210b20022900f70f210f20022800f30f210520022f00f10f210c20022d00f00f210920024188056a411f6a200241f00f6a411f6a31000022103c000020024188056a410f6a200a3700002002200b37009f052002200f37008f052002200536008b052002200c3b008905200220093a0088052003417e6a2007460d1a200420076a220541026a2d000021042001200320066a3602042001200541036a360200200441034b0d1a4100210620040e0404030102040b200541ff0171450d19200241003a0090100c190b410221060c020b410321060c010b410121060b200241a00d6a410f6a220120024188056a410f6a290000370000200241a00d6a41086a20024188056a41086a290300370300200220022903880522173703a00d2001290000210f20022f00a10d210820022800a30d210920022900a70d210a2017a7210c410321180c030b201e450d1420042d0002210520012003417d6a22063602042001200441036a360200200541034b0d144100210c024002400240024020050e0403000102030b4101210c0c020b4102210c0c010b4103210c0b20064102490d1420042f0003210820012003417b6a360204410521182001200441056a36020041002109410021070c020b41002105200241003a0090102003417e6a210c417d2106024002400240024002400340200c2005460d01200241f00f6a20056a200420056a220741026a2d00003a00002001200320066a3602042001200741036a3602002002200541016a22073a0090102006417f6a21062007210520074120470d000b200741ff01714120490d18200229008710210b2002418f106a310000211020022900f70f210a20022800f30f210920022f00f10f210820022d00f00f210c200241d80b6a410f6a200241f00f6a410f6a290000220f3700002002200a3700df0b200220093600db0b200220083b00d90b2002200c3a00d80b2003417e6a2007460d18200420076a220541026a2d000021042001200320066a220d3602042001200541036a360200200441034b0d184100210620040e0404030102040b200541ff0171450d17200241003a0090100c170b410221060c020b410321060c010b410121060b200d4102490d13200541036a2f0000210d2001200320076b417b6a3602042001200541056a360200200241a8036a2001108f0120022802a8030d1320022802ac032107200241a0036a2001108f0120022802a0030d1320022802a403210e200b4280808080806083200b4280feffffff1f8384200b42ff018384210b410621180c010b41022106410221180b200020063a00252000200c3a0005200020183a000420004115360200200041246a20103c00002000411c6a200b370200200041146a200f3702002000410c6a200a3702002000412c6a200e360200200041286a2007360200200041266a200d3b0100200041086a2009360200200041066a20083b0100200041306a200241a0126a41800210cf061a0c2f0b2006450d0120042d0001210520012003417e6a22063602042001200441026a360200024002400240024002400240200541034b0d00024002400240024020050e0400010203000b200241a0046a20011092010240024020022802a0042204450d0020022902a404210a200110b5022201450d01200241c00d6a41106a2001360200200241c00d6a41086a200a370300200241d40d6a200229028805370200200241dc0d6a20024188056a41086a290200370200200241e40d6a20024188056a41106a290200370200200241ec0d6a200241a0056a290200370200200241f40d6a200241a8056a290200370200200241fc0d6a200241b0056a290200370200200241840e6a200241b8056a280200360200200220043602c40d200241013a00c00d0c190b200241053a00c00d0c190b200241053a00c00d200a42ffffff3f83500d18200410260c180b024002400240024002400240024020064102490d0020042f0002210520012003417c6a3602042001200441046a360200200241a0046a200110920120022802a0042204450d01200241a0046a41086a2206280200210c20022802a4042103200241a0046a200110ab0520022802a0044102460d04200241b8036a41086a2006280200360200200220022903a0043703b803200241b0036a2001108f0120022802b0030d062007280200220920022802b4032206490d062006417f4c0d1320060d02410021084101210d0c030b200241053a00c00d0c1d0b200241053a00c00d0c1c0b2006102a220d450d1620072802002109200621080b024020092006490d00200d2001280200200610cf0621092001280204220d20064f0d022006200d41b8afc0001048000b2008450d02200d10260c020b200241053a00c00d200341ffffff3f71450d19200410260c190b2001200d20066b3602042001200128020020066a36020020090d160b200241053a00c00d200341ffffff3f71450d17200410260c170b0240024002400240024020064102490d0020042f0002210820012003417c6a3602042001200441046a36020020024188056a2001109201200228028805220c450d0120024188056a41086a2204280200210d200228028c05210920024188056a200110ab052002280288054102460d03200241a00d6a41086a200428020036020020022002290388053703a00d41002104200241003a00a80520072802002106417f2103034020062004460d0320024188056a20046a200128020022052d00003a00002001200620036a3602042001200541016a3602002002200441016a22053a00a8052003417f6a21032005210420054120470d000b200241a0046a410f6a220420024188056a410f6a290000370000200241a0046a41086a220320024188056a41086a290300370300200241b8036a41086a22072003290300370300200241b8036a410f6a2203200429000037000020022002290388053703b803200241a7056a310000210b200229009f05210a410121040240200541ff01714120490d00200241a8086a410f6a2003290000370000200241a8086a41086a2007290300370300200220022903b8033703a808410021040b2004450d040c180b200241053a00c00d0c1a0b200241053a00c00d0c190b200441ff0171450d15200241003a00a8050c150b200241053a00c00d200941ffffff3f71450d17200c10260c170b200241d80b6a410f6a2204200241a8086a410f6a290000370000200241d80b6a41086a200241a8086a41086a290300370300200220022903a8083703d80b0240200620056b22034108490d0020012802002205290000210f2001200341786a3602042001200541086a360200200241800d6a41086a2201200241a00d6a41086a280200360200200241e00d6a200b42ff01833c0000200241d80d6a200a4280808080806083200a4280feffffff1f8384200a42ff018384370300200241d00d6a2004290000370300200241c00d6a41086a20022900df0b370300200241ec0d6a200d360200200241e80d6a2009360200200241e40d6a200c360200200241e20d6a20083b0100200220022903a00d3703800d200220022800db0b3602c40d200220022f00d90b3b01c20d200220022d00d80b3a00c10d200241033a00c00d200241f80d6a2001280200360200200241f00d6a20022903800d370300200241800e6a200f3703000c160b200241053a00c00d200941ffffff3f71450d16200c10260c160b20064102490d0120042f0002210820012003417c6a3602042001200441046a36020020024188056a2001109201200228028805220c450d02200228028c052109200728020022034104490d0520024190056a280200210d20012802002206280000210e20012003417c6a22043602042001200641046a36020020044104490d05200628000421182001200341786a22073602042001200641086a36020041002104200241003a00a805200341776a2103034020072004460d0420024188056a20046a200620046a220541086a2d00003a0000200120033602042001200541096a3602002002200441016a22053a00a8052003417f6a21032005210420054120470d000b200541ff01714120490d04200241a7056a310000210a20024197056a290000210b200229009f05210f200229008f052110200228008b05210120022f008905210420022d0088052103200241ec0d6a200dad3e0200200241c00d6a41206a200a3c0000200241d80d6a200f370300200241d00d6a200b370300200241c80d6a2010370300200241f40d6a2018360200200241f00d6a200e360200200241e20d6a20083b0100200241e40d6a2009ad422086200cad84370200200220013602c40d200220043b01c20d200220033a00c10d200241043a00c00d0c140b200241053a00c00d0c140b200241053a00c00d0c130b200241053a00c00d0c120b200441ff0171450d00200241003a00a8050b200241053a00c00d200941ffffff3f71450d10200c10260c100b200241053a00c00d200941ffffff3f71450d0f200c10260c0f0b200041173602000c2d0b200241053a00c00d0c0d0b20242d0002211a20012007417d6a22283602042001202441036a360200200241023a00b4122002201a3a00a1122028450d1120242d0003211a20012007417c6a22283602042001202441046a360200200241033a00b4122002201a3a00a2122028450d1120242d0004211a20012007417b6a22283602042001202441056a360200200241043a00b4122002201a3a00a3122028450d1120242d0005211a20012007417a6a22283602042001202441066a360200200241053a00b4122002201a3a00a4122028450d1120242d0006211a2001200741796a22283602042001202441076a360200200241063a00b4122002201a3a00a5122028450d1120242d0007211a2001200741786a22283602042001202441086a360200200241073a00b4122002201a3a00a6122028450d1120242d0008211a2001200741776a22283602042001202441096a360200200241083a00b4122002201a3a00a7122028450d1120242d0009211a2001200741766a222836020420012024410a6a360200200241093a00b4122002201a3a00a8122028450d1120242d000a211a2001200741756a222836020420012024410b6a3602002002410a3a00b4122002201a3a00a9122028450d1120242d000b211a2001200741746a222836020420012024410c6a3602002002410b3a00b4122002201a3a00aa122028450d1120242d000c211a2001200741736a222836020420012024410d6a3602002002410c3a00b4122002201a3a00ab122028450d1120242d000d211a2001200741726a222836020420012024410e6a3602002002410d3a00b4122002201a3a00ac122028450d1120242d000e211a2001200741716a222836020420012024410f6a3602002002410e3a00b4122002201a3a00ad122028450d1120242d000f211a2001200741706a22283602042001202441106a3602002002410f3a00b4122002201a3a00ae122028450d1120242d0010211a20012007416f6a22283602042001202441116a360200200241103a00b4122002201a3a00af122028450d1120242d0011211a20012007416e6a22283602042001202441126a360200200241113a00b4122002201a3a00b0122028450d1120242d0012211a20012007416d6a22283602042001202441136a360200200241123a00b4122002201a3a00b1122028450d1120242d0013211a20012007416c6a22283602042001202441146a360200200241133a00b4122002201a3a00b2122028450d1120242d0014211a20012007416b6a3602042001202441156a3602002002201a3a00b31220022903a012211320022802a812211a20022802ac12212820022802b012212a410121220b200241a0126a200110cf0220022d00a01222244106460d0f41022127200241800d6a41026a220720022d00a3123a0000200241f00f6a41086a222d200241b4126a290200370300200241f00f6a41106a222e200241bc126a290200370300200220022f00a1123b01800d2002200241ac126a2902003703f00f200241a0126a41086a222f280200212320022802a4122129200241a0126a200110cf0220022d00a0124106470d05024020244101470d002023450d00202910260b024020254101470d002026450d00201910260b0240201b4101470d00201c450d00202110260b024020184101470d00201e450d00201d10260b0240200941ff01714101470d002008450d00202c10260b0240200441ff01714101470d002003450d00200510260b0240200a422088a72201450d002006200141c8006c6a2104200621010340024020012d00004101470d00200141086a280200450d00200141046a28020010260b0240200141246a2d00004101470d002001412c6a280200450d00200141286a28020010260b200141c8006a22012004470d000b0b200aa72201450d13200141c8006c450d13200610260c130b1034000b200241a5106a2f00002101200241a7106a2800002107200241ab106a2f0000210c200241ad106a280000211e200241f90f6a290000210a20024181106a290000210f20024189106a31000021102002418d106a290000211720024195106a29000021112002419d106a29000021122002418a106a2f0100211d20022900f10f2116200041c7006a200241f00f6a411c6a2d00003a0000200041c5006a201d3b0000200041d8006a2012370200200041d0006a2011370200200041c8006a2017370200200041c4006a20103c00002000413c6a200f370200200041346a200a3702002000412c6a2016370200200041e8006a201e360200200041e6006a200c3b0100200041e2006a2007360100200041e0006a20013b0100200041286a200d360200200041246a2018360200200041206a200e3602002000411c6a2003360200200041186a2006360200200041146a2008360200200041106a200b422088a73602002000410c6a2004360200200041086a2009360200200020053602042000410a360200200041ec006a200241a0126a41c40110cf061a0c280b2003200641b8afc0001048000b2003200541b8afc0001048000b2006200c41b8afc0001048000b200241a0046a41206a2201200241a0126a41206a280200360200200241a0046a41186a2203200241a0126a41186a290300370300200241a0046a41106a2230200241a0126a41106a290300370300200241a0046a41086a2231202f290300370300200241f80b6a41086a222f200241a00d6a41086a290300370300200220022903a0123703a004200220022903a00d3703f80b200220022f01880c3b01f60b200241d80b6a410f6a223220024188056a410f6a290000370000200241d80b6a41086a223320024188056a41086a29030037030020022002290388053703d80b200241bc0c6a41026a2234200241c00c6a41026a2d00003a0000200220022f01c00c3b01bc0c200241c00b6a41106a223520024188066a41106a290300370300200241c00b6a41086a223620024188066a41086a29030037030020022002290388063703c00b200241bc0b6a41026a2237200241e00c6a41026a2d00003a0000200220022f01e00c3b01bc0b200241a00b6a41106a223b200241c00d6a41106a290300370300200241a00b6a41086a223c200241c00d6a41086a290300370300200220022903c00d3703a00b2002419c0b6a41026a223d20072d00003a0000200220022f01800d3b019c0b200241800b6a41106a2207202e290300370300200241800b6a41086a222e202d290300370300200220022903f00f3703800b200241fc0a6a41026a222d200241dc0c6a41026a2d00003a0000200220022f00dc0c3b01fc0a200241e80a6a41086a202f290300370300200220022903f80b3703e80a200220022f01f60b3b01e60a200241c80a6a410f6a2032290000370000200241c80a6a41086a2033290300370300200220022903d80b3703c80a200241c40a6a41026a20342d00003a0000200220022f01bc0c3b01c40a200241a80a6a41106a2035290300370300200241a80a6a41086a2036290300370300200220022903c00b3703a80a200241a40a6a41026a20372d00003a0000200220022f01bc0b3b01a40a200241880a6a41106a203b290300370300200241880a6a41086a203c290300370300200220022903a00b3703880a200241840a6a41026a203d2d00003a0000200220022f019c0b3b01840a200241e8096a41106a2007290300370300200241e8096a41086a202e290300370300200220022903800b3703e809200241b8036a41206a2001280200360200200241b8036a41186a2003290300370300200241b8036a41106a2030290300370300200241b8036a41086a2031290300370300200220022903a0043703b803200241e4096a41026a202d2d00003a0000200220022f01fc0a3b01e4092008ad422086202cad4220862009ad8422114220888421122005ad4220862004ad8421102011422086202bad8421110c070b1033000b102c000b200241053a00c00d200941ffffff3f71450d02200c10260c020b2006ad4220862008ad84220aa721060240024020072802002207450d00200128020022082d0000210d20012007417f6a220e3602042001200841016a360200200d41014b0d004100211802400240200d0e020100010b410121180b200e4108490d012008290001210b2001200741776a3602042001200841096a360200200241a8086a41086a200241b8036a41086a2802002201360200200241cc0d6a200c360200200241c00d6a41086a2003360200200241c00d6a41106a20022903b803220f370300200241e80d6a200b370300200241e40d6a200a422088a7360200200241e00d6a2006360200200241dc0d6a2009360200200241d80d6a20013602002002200f3703a808200241023a00c00d200220043602c40d200220053b01c20d200220183a00c10d200241800e6a20024188056a41106a290300370300200241f80d6a20024188056a41086a290300370300200241f00d6a2002290388053703000c020b200241053a00c00d02402006450d00200910260b200341ffffff3f71450d02200410260c020b200241053a00c00d02402006450d00200910260b200341ffffff3f71450d01200410260c010b20024188066a200241c00d6a41c80010cf061a200241f00f6a41046a20024188066a41c80010cf061a20004116360200200041046a200241f00f6a41cc0010cf061a200041d0006a200241a0126a41e00110cf061a0c1f0b20004117360200200241c00d6a10b7060c1e0b200041173602000c1d0b200241d0096a41086a2201200241e80a6a41086a290300370300200241b0096a41086a2204200241c80a6a41086a290300370300200241b0096a410f6a2203200241c80a6a410f6a290000370000200241ac096a41026a2205200241c40a6a41026a2d00003a000020024190096a41106a2207200241a80a6a41106a29030037030020024190096a41086a222b200241a80a6a41086a290300370300200220022903e80a3703d009200220022f01e60a3b01ce09200220022903c80a3703b009200220022f01c40a3b01ac09200220022903a80a370390092002418c096a41026a222c200241a40a6a41026a2d00003a0000200241f0086a41086a222d200241880a6a41086a290300370300200241f0086a41106a222e200241880a6a41106a290300370300200241ec086a41026a222f200241840a6a41026a2d00003a0000200241d0086a41086a2230200241e8096a41086a290300370300200241d0086a41106a2231200241e8096a41106a290300370300200220022f01a40a3b018c09200220022903880a3703f008200220022f01840a3b01ec08200220022903e8093703d008200241a8086a41206a2232200241b8036a41206a280200360200200241a8086a41186a2233200241b8036a41186a290300370300200241a8086a41106a2234200241b8036a41106a290300370300200241a8086a41086a2235200241b8036a41086a290300370300200241a4086a41026a2236200241e4096a41026a2d00003a0000200220022903b8033703a808200220022f01e4093b01a408200041c0006a2012370200200041386a2011370200200041286a200f3c0000200041206a200b370200200041186a2010370200200041106a200a370200200041c8006a2016370200200041306a20173702002000412c6a200c3602002000200d3b002a2000200e3a00292000410c6a2006360200200020083b000a200020093a0009200041086a20273a000020004110360200200041e0006a20183a0000200041d0006a20022903d009370200200041d8006a200129030037020020022f01ce092101200041ec006a20203a0000200041e8006a201e360200200041e4006a201d3602002000201f3a0063200020013b0061200041fc006a2003290000370000200041f5006a2004290300370000200020022903b00937006d20004184016a201b3a000020004187016a20052d00003a0000200020022f01ac093b0085012000418c016a201c36020020004188016a2021360200200041a0016a200729030037020020004198016a202b29030037020020004190016a200229039009370200200041a8016a20253a0000200041ab016a202c2d00003a0000200020022f018c093b00a901200041b0016a2026360200200041ac016a2019360200200041c4016a202e290300370200200041bc016a202d290300370200200041b4016a20022903f008370200200041cc016a20243a0000200041cf016a202f2d00003a0000200020022f01ec083b00cd01200041d4016a2023360200200041d0016a2029360200200041e8016a2031290300370200200041e0016a2030290300370200200041d8016a20022903d00837020020004190026a203228020036020020004188026a203329030037020020004180026a2034290300370200200041f8016a2035290300370200200041f0016a20022903a8083702002000202a3600a502200020283600a1022000201a36009d02200020133700950220004194026a20223a0000200041ab026a20362d00003a0000200020022f01a4083b00a9020c1c0b20024188066a411f6a200241c00d6a411f6a28000036000020024188066a41186a200241c00d6a41186a2903003703000240200c450d00200c41c4006c2104200641286a210103400240200141786a2d00004101470d002001280200450d002001417c6a28020010260b200141c4006a2101200441bc7f6a22040d000b0b20022802c40b2201450d04200141c4006c450d04200610260c040b024020254101470d002026450d00201910260b0240201b4101470d00201c450d00202110260b024020184101470d00201e450d00201d10260b0240200941ff01714101470d002008450d00202c10260b0240200441ff01714101470d002003450d00200510260b0240200a422088a72201450d002006200141c8006c6a2104200621010340024020012d00004101470d00200141086a280200450d00200141046a28020010260b0240200141246a2d00004101470d002001412c6a280200450d00200141286a28020010260b200141c8006a22012004470d000b0b200aa72201450d03200141c8006c450d03200610260c030b200241003a00b4120b024020254101470d002026450d00201910260b0240201b4101470d00201c450d00202110260b024020184101470d00201e450d00201d10260b0240200941ff01714101470d002008450d00202c10260b0240200441ff01714101470d002003450d00200510260b0240200a422088a72201450d002006200141c8006c6a2104200621010340024020012d00004101470d00200141086a280200450d00200141046a28020010260b0240200141246a2d00004101470d002001412c6a280200450d00200141286a28020010260b200141c8006a22012004470d000b0b200aa72201450d01200141c8006c450d01200610260c010b02402003450d002006200341c8006c6a2104200621010340024020012d00004101470d00200141086a280200450d00200141046a28020010260b0240200141246a2d00004101470d002001412c6a280200450d00200141286a28020010260b200141c8006a22012004470d000b0b200228028c0c2201450d00200141c8006c450d00200610260b200041173602000c160b0340200110d501200141b0026a2101200441d07d6a22040d000b0b200228028c052201450d00200141b0026c450d00200610260b200041173602000c130b200aa7450d010b200910260b200041173602000c100b200041173602000c0f0b02402003450d002003410c6c21042008210103400240200141046a280200450d00200128020010260b2001410c6a2101200441746a22040d000b0b20022802f40f2201450d002001410c6c450d00200810260b200ba7450d00200910260b200041173602000c0c0b200041173602000c0b0b0340200110d6010240200141046a2802002203450d00200341246c450d00200128020010260b200141f0006a2101200441907f6a22040d000b0b200228028c052201450d00200141f0006c450d00200c10260b200041173602000c080b200020173e0029200020083b000a2000200d3a0009200041043602002000412f6a20174230883c00002000412d6a20174220883d0000200041d8006a2013370200200041d0006a2014370200200041c8006a2015370200200041c0006a2016370200200041386a2011370200200041306a2012370200200041286a200b3c0000200041206a2010370000200041186a200f370000200041106a200a3700002000410c6a2009360000200041086a20013a0000200041e0006a200241a0126a41d00110cf061a0c070b41002104410021010b200020063b0126200020013a0025200020073b00062000200c3a0005200020093a000420004103360200200041226a200a4230883c0000200041206a200a4220883d01002000411c6a200a3e0200200041146a200f3702002000410c6a200b370200200041286a2004360200200041236a20033b0000200041086a20053602002000412c6a200241a0126a41840210cf061a0c050b200041173602000c040b200041173602000c030b02402003450d00200341186c21042006210103400240200141046a280200450d00200128020010260b0240200141106a280200450d002001410c6a28020010260b200141186a2101200441686a22040d000b0b20022802f40f2201450d01200141186c450d010b200610260b200041173602000b200241d0146a24000b9f0401037f230041206b2202240002400240024002400240024002400240024020012d0000417f6a220341064b0d0020030e0701020304050607010b41bf80c700412841dcbcc700102f000b200141046a280200210320012d000121042002200141086a10c801200241106a200141146a10c801200020044101463a0001200041046a2003360200200041013a0000200041086a2002290300370200200041106a200241086a280200360200200041146a20022903103702002000411c6a200241106a41086a2802003602000c060b200041023a0000200041046a200141046a2802003602000c050b200041033a0000200041046a200141046a2802003602000c040b2002200141046a10c801200241106a200141106a10c801200041043a00002000410c6a200241086a280200360200200041046a2002290300370200200041106a2002290310370200200041186a200241106a41086a2802003602000c030b20002001290001370001200041c4006a200141c4006a280200360200200041096a200141096a290000370000200041116a200141116a290000370000200041196a200141196a290000370000200041216a200141216a290000370000200041296a200141296a290000370000200041316a200141316a290000370000200041396a200141396a290000370000200041053a00000c020b200041063a00000c010b200041073a0000200041046a200141046a2802003602000b200241206a24000bf20e06087f017e067f017e017f027e230041c0006b2203240002400240200128020c220441016a22052004490d00024002400240200520012802002206200641016a220741037641076c20064108491b22064101764d0d00024002402005200641016a2206200520064b1b22050d0041d09fc0002108410021094100210a0c010b0240024020054108490d000240200541ffffffff01712005470d00417f2005410374220541076e417f6a677641016a41012005410d4b1b21050c020b41ece1c000411c41dcbcc700102f000b4104410820054104491b21050b2005ad42d0007e220b422088a70d03200ba72206200541046a220c6a22082006490d03200810242208450d02200820066a220841ff01200c10d1061a2005417f6a2209200541037641076c20094108491b210a0b200141046a280200220d41046a210e200d20076a210f200d280200417f7341808182847871210c2002280200221041086a2111034002400240200c0d0002400340200e200f4f0d01200d41c07d6a210d200e2802002105200e41046a2206210e2005418081828478712205418081828478460d000b200541808182847873220c417f6a200c7121022006210e0c020b2001200436020c200041003602002001200a20046b3602082001280200210520012009360200200141046a2206280200210c200620083602002005450d07200c200541016aad42d0007ea76b10260c070b200c417f6a200c7121020b2011290300210b2010290300211241002105200341003602382003200b37033020032012370328200d4100200c684103766b41d0006c6a41b07f6a2213200341286a10b9022003290328220b200b200329033022128520128920032802384101461b220ba721060340200541046a22052006200971220c6a21062008200c6a280000418081828478712207450d000b02402008200768410376200c6a20097122056a2c00004100480d002008280200418081828478716841037621050b200820056a200ba741197622063a00002005417c6a20097120086a41046a20063a00002008410020056b41d0006c6a41b07f6a201341d00010cf061a2002210c0c000b0b4100210c200141046a2108410021060340024002400240200c410171450d00200641036a220520074f0d0120052006490d010c020b2006210520062007490d010b200141046a280200210502400240200128020041016a22064104490d00200520066a20052800003600000c010b200541046a2005200610d0061a0b4100210502402001280200220a417f460d00200141046a210d2002280200221041086a21114100210503400240200d2802002206200522136a2d0000418001470d00410020136b2104024003402011290300210b2010290300211241002105200341003602382003200b370330200320123703282006200441d0006c6a220f41b07f6a220e200341286a10b902200d2802002109200128020021082003290328220b200b200329033022128520128920032802384101461b220ba7220221060340200541046a22052006200871220c6a21062009200c6a280000418081828478712207450d000b02402009200768410376200c6a20087122056a2c00004100480d002009280200418081828478716841037621050b2005200820027122066b201320066b732008714104490d01200920056a22062d0000210c2006200ba741197622073a00002005417c6a20087120096a41046a20073a00000240200c41ff01460d00200d280200410020056b41d0006c6a220c41b07f6a2205290200210b2005200e290200370200200541186a220629020021122006200e41186a2208290200370200200541106a220629020021142006200e41106a2209290200370200200541086a220529020021152005200e41086a2206290200370200200e200b370200200620153702002009201437020020082012370200200c41506a220541186a2208290200210b2008200f41506a220641186a2209290200370200200541106a220829020021122008200641106a2207290200370200200541086a220829020021142008200641086a220e2902003702002005290200211520052006290200370200200620153702002009200b37020020072012370200200e2014370200200c41706a220541086a220c290000210b200c200f41706a220641086a22082900003700002005290000211220052006290000370000200620123700002008200b370000200d28020021060c010b0b200d280200220620136a41ff013a0000200620012802002013417c6a716a41046a41ff013a0000200d280200410020056b41d0006c6a41b07f6a200e41d00010cf061a0c010b200920136a200ba741197622053a000020082013417c6a7120096a41046a20053a00000b201341016a21052013200a470d000b20012802002205200541016a41037641076c20054108491b21050b2000410036020020012005200128020c6b3602080c050b200828020020056a220620062802002206410776417f73418182840871200641fffefdfb07726a3602004101210c200541016a21060c000b0b102c000b41ece1c000411c41dcbcc700102f000b41ece1c000411c41dcbcc700102f000b200341c0006a24000bea0804017f027e037f017e230041b0016b22022400200241a0016a200129030042adfed5e4d485fda8d8007e220342a0cbbf9599b5a19f0a7c2204200029021885200029020020048542adfed5e4d485fda8d8007e42178942adfed5e4d485fda8d8007e852000290208200342efcdddd088a580a21e7c8542adfed5e4d485fda8d8007e42178942adfed5e4d485fda8d8007e852000290210200342bed0fb8bf894dfa4327c8542adfed5e4d485fda8d8007e42178942adfed5e4d485fda8d8007e85420042adfed5e4d485fda8d800420010cc0620012001280210220541026a3602102001200241a8016a29030020022903a0017c2203370300024002402000280220220641244b0d00200041256a21070c010b2000412c6a2802002106200041286a28020021070b20024190016a20032006ad220485420042adfed5e4d485fda8d800420010cc062001200541036a360210200120022903900120047c20024190016a41086a2903007c42adfed5e4d485fda8d8007e2204370300024002400240200641084b0d00200641014b0d014200210302402006450d00200731000021030b20024180016a2003200485420042adfed5e4d485fda8d800420010cc062001200541046a220736021020024188016a2903002002290380017c21030c020b0240200641104b0d00200241d0006a2007290000200485420042adfed5e4d485fda8d800420010cc06200241c0006a200241d0006a41086a29030020022903507c200620076a41786a29000085420042adfed5e4d485fda8d800420010cc062001200541056a2207360210200241c0006a41086a29030020022903407c21030c020b200620076a41786a2900002108200421030340200729000020038542adfed5e4d485fda8d8007e42178942adfed5e4d485fda8d8007e2004852104200741086a2107200342cf829ebbefefde82147c2103200641786a220641084b0d000b200241306a2004200885420042adfed5e4d485fda8d800420010cc062001200541056a2207360210200241386a29030020022903307c21030c010b024020064104490d00200241e0006a200620076a417c6a350000422086200735000084200485420042adfed5e4d485fda8d800420010cc062001200541046a2207360210200241e8006a29030020022903607c21030c010b200241f0006a200620076a417f6a310000422086200733000084200485420042adfed5e4d485fda8d800420010cc062001200541046a2207360210200241f8006a29030020022903707c21030b2001200337030002400240200041cc006a31000022044200520d0020022003420042adfed5e4d485fda8d800420010cc062001200741016a360210200241086a29030020022903007c21030c010b200241206a2003200485420042adfed5e4d485fda8d800420010cc06200241106a200241206a41086a29030020022903207c200041cd006a31000085420042adfed5e4d485fda8d800420010cc062001200741026a360210200241106a41086a29030020022903107c21030b20012003370300200241b0016a24000b8e1104077f017e087f037e230041c0006b22032400024002400240200128020c220441016a22052004490d00200520012802002206200641016a220741037641076c20064108491b22064101764d0d0102400240024002402005200641016a2206200520064b1b22050d0041d09fc000210841002109410021050c010b0240024020054108490d000240200541ffffffff01712005470d00417f2005410374220541076e417f6a677641016a41012005410d4b1b21050c020b41ece1c000411c41dcbcc700102f000b4104410820054104491b21050b2005ad42307e220a422088a70d02200aa72206200541046a220b6a22082006490d02200810242208450d01200820066a220841ff01200b10d1061a2005417f6a2209200541037641076c20094108491b21050b200841506a210c200520046b210d200141046a280200220e41046a210f200e20076a2110200e280200417f7341808182847871211120022802002112034002400240024020110d000340200f20104f0d02200e41c07e6a210e200f2802002105200f41046a2206210f2005418081828478712205418081828478460d000b200541808182847873220b417f6a200b7121112006210f0c020b200e450d002011210b2011417f6a20117121110c010b2001200436020c2001200d360208200041003602002001280200210520012009360200200141046a2206280200210b200620083602002005450d06200b200541016aad42307ea76b10260c060b410021052003201229030042adfed5e4d485fda8d8007e220a42a0cbbf9599b5a19f0a7c2213200e4100200b684103766b41306c6a41506a220229001885200229000020138542adfed5e4d485fda8d8007e42178942adfed5e4d485fda8d8007e852002290008200a42efcdddd088a580a21e7c8542adfed5e4d485fda8d8007e42178942adfed5e4d485fda8d8007e852002290010200a42bed0fb8bf894dfa4327c8542adfed5e4d485fda8d8007e42178942adfed5e4d485fda8d8007e85420042adfed5e4d485fda8d800420010cc06201241086a290300220a200341086a29030020032903007c85200a89220aa721060340200541046a22052006200971220b6a21062008200b6a280000418081828478712207450d000b02402008200768410376200b6a20097122056a2c00004100480d002008280200418081828478716841037621050b200820056a200aa741197622063a00002005417c6a20097120086a41046a20063a0000200c410020056b41306c6a220541286a200241286a290200370200200541206a200241206a290200370200200541186a200241186a290200370200200541106a200241106a290200370200200541086a200241086a290200370200200520022902003702000c000b0b102c000b41ece1c000411c41dcbcc700102f000b41ece1c000411c41dcbcc700102f000b4100210b200141046a2108410021060340024002400240200b410171450d00200641036a220520074f0d0120052006490d010c020b2006210520062007490d010b200141046a280200210502400240200128020041016a22064104490d00200520066a20052800003600000c010b200541046a2005200610d0061a0b41002105024020012802002204417f460d0020022802002102200141046a210e4100210503400240200e2802002208200522116a2d0000418001470d00410020116b211202400340200341106a200229030042adfed5e4d485fda8d8007e220a42a0cbbf9599b5a19f0a7c22132008201241306c6a41506a220f29001885200f29000020138542adfed5e4d485fda8d8007e42178942adfed5e4d485fda8d8007e85200f290008200a42efcdddd088a580a21e7c8542adfed5e4d485fda8d8007e42178942adfed5e4d485fda8d8007e85200f290010200a42bed0fb8bf894dfa4327c8542adfed5e4d485fda8d8007e42178942adfed5e4d485fda8d8007e85420042adfed5e4d485fda8d800420010cc062001280200210941002105200241086a290300220a200341106a41086a29030020032903107c85200a89220aa7221021060340200541046a22052006200971220b6a21062008200b6a280000418081828478712207450d000b02402008200768410376200b6a20097122056a2c00004100480d002008280200418081828478716841037621050b2005200920107122066b201120066b732009714104490d01200820056a22062d0000210b2006200aa741197622073a00002005417c6a20097120086a41046a20073a00000240200b41ff01460d00200e280200410020056b41306c6a41506a2205290200210a2005200f290200370200200541186a220629020021132006200f41186a220b290200370200200541106a220629020021142006200f41106a2208290200370200200541086a220629020021152006200f41086a22092902003702002009201537020020082014370200200b2013370200200f200a370200200541286a2206290200210a2006200f41286a220b290200370200200529022021132005200f290220370220200f2013370220200b200a370200200e28020021080c010b0b200e280200220620116a41ff013a0000200620012802002011417c6a716a41046a41ff013a0000200e280200410020056b41306c6a41506a2205200f290200370200200541086a200f41086a290200370200200541106a200f41106a290200370200200541186a200f41186a290200370200200541206a200f41206a290200370200200541286a200f41286a2902003702000c010b200820116a200aa741197622053a000020092011417c6a7120086a41046a20053a00000b201141016a210520112004470d000b20012802002205200541016a41037641076c20054108491b21050b2000410036020020012005200128020c6b3602080c020b200828020020056a220620062802002206410776417f73418182840871200641fffefdfb07726a3602004101210b200541016a21060c000b0b200341c0006a24000b8d0401057f230041e0006b22022400200241918dc700410810fb01200241106a4188e2c000410710fb0102400240412010242203450d002002422037023420022003360230200241306a41004120106d20022802302203200228023822046a22052001290000370000200541086a200141086a290000370000200541106a200141106a290000370000200541186a200141186a2900003700002002200441206a2201360238200241c0006a2003200110bc02200241dc006a200320016a360200200220033602582002200241c0006a41106a3602542002200241c0006a360250200241206a200241d0006a107302402002280234450d00200310260b2002280228220341206a2205417f4c0d010240024020050d0041012101410021050c010b200510242201450d010b20002001360200200041086a220141003602002000200536020420004100411010c9012000280200200128020022056a220420022900003700002001200541106a2205360200200441086a200241086a29000037000020002005411010c9012000280200200128020022056a220420022900103700002001200541106a2206360200200441086a200241106a41086a2900003700002002280220210520002006200310c9012000280200200128020022006a2005200310cf061a2001200020036a36020002402002280224450d00200510260b200241e0006a24000f0b1033000b1034000b2c0020002002ad4220862001ad8410102201290000370000200041086a200141086a290000370000200110260b13002000410f360204200041c8e3c0003602000b3400200041918dc70036020420004100360200200041146a4104360200200041106a41e4a2c100360200200041086a42083702000b0b0020004108410010c0020ba10302037f027e0240024020024106744104722203417f4c0d00200310242204450d012000200336020420002004360200200041086a220341003602002000200210a10102402002450d002002410674210203400240024020012903004201510d00200020032802004101106d2000280200200328020022046a41003a0000200441016a21040c010b200020032802004101106d2000280200200328020022046a41013a00002003200441016a2204360200200020044120106d2000280200200328020022056a2204200141206a290000370000200441086a200141286a290000370000200441106a200141306a290000370000200441186a200141386a2900003700002003200541206a2204360200200141086a2903002106200141106a2903002107200020044110106d2000280200200328020022046a22052007370008200520063700002003200441106a2204360200200141186a2903002106200020044108106d2000280200200328020022046a2006370000200441086a21040b200141c0006a210120032004360200200241406a22020d000b0b0f0b1034000b1033000b5901037f02404114102422020d001033000b2000421437020420002002360200200041004110106d2000280200200041086a220228020022036a22044200370008200442003700002002200341106a3602002000410010a1010b860101027f230041d0006b22022400200241063a00280240410110242203450d002000420137020420002003360200200041004101106d2000280200200041086a220028020022036a41003a00002000200341016a360200024020022d00284101470d00200241306a280200450d002002412c6a28020010260b200241d0006a24000f0b1033000b990101027f230041c0026b22022400200241a4026a41023a00000240410110242203450d002000420137020420002003360200200041004101106d2000280200200041086a220028020022036a41003a00002000200341016a360200024020022d00a4024102460d000240200241146a28020041ffffff3f71450d00200228021010260b2002411c6a10c4020b200241c0026a24000f0b1033000b930301027f024020002802082201450d0020002802002202200141c8006c6a21010340024020022d00004101470d00200241086a280200450d00200241046a28020010260b0240200241246a2d00004101470d002002412c6a280200450d00200241286a28020010260b200241c8006a22022001470d000b0b0240200041046a2802002202450d00200241c8006c450d00200028020010260b024020002d000c4101470d00200041146a280200450d00200041106a28020010260b024020002d00304101470d00200041386a280200450d00200041346a28020010260b024020002d00544101470d00200041dc006a280200450d00200041d8006a28020010260b024020002d00784101470d0020004180016a280200450d00200041fc006a28020010260b024020002d009c014101470d00200041a4016a280200450d00200041a0016a28020010260b024020002d00c0014101470d00200041c8016a280200450d00200041c4016a28020010260b024020002d00e4014101470d00200041ec016a280200450d00200041e8016a28020010260b0b130020004106360204200041f4acc1003602000b4901017f02404104102422020d001033000b2000420437020420002002360200200041004104106d2000280200200041086a220028020022026a41143600002000200241046a3602000b4a01017f02404104102422020d001033000b2000420437020420002002360200200041004104106d2000280200200041086a220028020022026a41e4003600002000200241046a3602000b5701027f02404110102422020d001033000b2000421037020420002002360200200041004110106d2000280200200041086a220028020022026a2203420037000820034280c0a8ca9a3a3700002000200241106a3602000b5801027f02404110102422020d001033000b2000421037020420002002360200200041004110106d2000280200200041086a220028020022026a2203420037000820034280d0f29ce1c8003700002000200241106a3602000b5801027f02404110102422020d001033000b2000421037020420002002360200200041004110106d2000280200200041086a220028020022026a2203420037000820034280c0caf384a3023700002000200241106a3602000bb00302027f027e02402000280200220241064b0d00024002400240024002400240024020020e0700010203040506000b2001200141086a22002802004101106d2001280200200028020022016a41003a00002000200141016a3602000f0b2001200141086a22022802004101106d2001280200200228020022036a41013a00002002200341016a2203360200200041106a290300210420002903082105200120034110106d2001280200200228020022016a22002004370008200020053700002002200141106a3602000f0b2001200141086a22002802004101106d2001280200200028020022016a41023a00002000200141016a3602000f0b2001200141086a22002802004101106d2001280200200028020022016a41033a00002000200141016a3602000f0b2001200141086a22002802004101106d2001280200200028020022016a41043a00002000200141016a3602000f0b2001200141086a22002802004101106d2001280200200028020022016a41053a00002000200141016a3602000f0b2001200141086a22002802004101106d2001280200200028020022016a41063a00002000200141016a3602000b0bb00b010b7f230041e0006b22022400200241003a00380240024002400240024002400240024002400240024020012802002203280204220420044100472205490d00200241386a20032802002206200510cf061a2003200420056b3602042003200620056a360200024020040d0041002107200241056a2103200241086a21042002411c6a21050c070b200241056a2103200241086a21042002411c6a210520022d0038220841254b0d014100210720080e260601010101010101010101010101010101010101010101010101010101010101010102030405060b200041063a00000c090b02402008417f6a220641ff01714121490d00200041063a00000c090b0240024020060d00410021094101210a0c010b2006102a220a450d06200621090b200a200128020022012802002001280204220b2006200b2006491b220810cf06210c200128020422072008490d062001200720086b3602042001200128020020086a36020041012107200b20064f0d04200c20086a22014100200c20066a20016b10d1061a0c040b200241386a200110cd0241022107200241346a41026a220120022d003b3a0000200241206a41086a2208200241d0006a290300370300200241206a41106a220b200241d8006a2d00003a0000200220022f00393b01342002200241386a41106a290300370320024020022d00384101460d00200241386a41086a2802002109200241c4006a2802002106200228023c210a2002411c6a41026a20012d00003a0000200241086a41086a2008290300370300200241086a41106a200b2d00003a0000200220022f01343b011c200220022903203703080c040b200041063a00000c070b200241386a200110cd02200241346a41026a220120022d003b3a0000200241206a41086a2207200241d0006a290300370300200241206a41106a2208200241d8006a2d00003a0000200220022f00393b01342002200241386a41106a290300370320024020022d00384101460d00200241386a41086a2802002109200241c4006a2802002106200228023c210a2002411c6a41026a20012d00003a0000200241086a41086a2007290300370300200241086a41106a20082d00003a0000200220022f01343b011c20022002290320370308410321070c030b200041063a00000c060b200241386a200110cd02200241346a41026a220120022d003b3a0000200241206a41086a2207200241d0006a290300370300200241206a41106a2208200241d8006a2d00003a0000200220022f00393b01342002200241386a41106a290300370320024020022d00384101460d00200241386a41086a2802002109200241c4006a2802002106200228023c210a2002411c6a41026a20012d00003a0000200241086a41086a2007290300370300200241086a41106a20082d00003a0000200220022f01343b011c20022002290320370308410421070c020b200041063a00000c050b200241386a200110cd02200241346a41026a220120022d003b3a0000200241206a41086a2207200241d0006a290300370300200241206a41106a2208200241d8006a2d00003a0000200220022f00393b01342002200241386a41106a29030037032020022d00384101460d03200241386a41086a2802002109200241c4006a2802002106200228023c210a2002411c6a41026a20012d00003a0000200241086a41086a2007290300370300200241086a41106a20082d00003a0000200220022f01343b011c20022002290320370308410521070b200020073a0000200020052f00003b00012000410c6a2006360000200041086a2009360000200041046a200a360000200041106a2004290000370000200041216a20032f00003b0000200041036a200541026a2d00003a0000200041186a200441086a290000370000200041206a200441106a2d00003a0000200041236a200341026a2d00003a00000c030b1033000b2008200741b8afc0001048000b200041063a00000b200241e0006a24000bb90202067f047e230041f0006b22022400200241003a002841002103024002400340200241003a003020012802002204280204220520054100472206490d01200241306a20042802002207200610cf061a2004200520066b3602042004200720066a360200024020050d00200241003a00300b200241086a20036a20022d00303a00002002200341016a22033a002820034120470d000b200241306a41086a200241086a41086a2903002208370300200241306a41106a200241086a41106a2903002209370300200241306a41186a200241086a41186a290300220a37030020022002290308220b370330200041196a200a370000200041116a2009370000200041096a20083700002000200b370001200041003a00000c010b200041013a0000200341ff0171450d00200241003a00280b200241f0006a24000bd61405067f017e027f017e017f23004190016b2202240002400240024002400240024002400240024002400240200128020022032802042204450d00200328020022052d0000210620032004417f6a3602042003200541016a360200200641254b0d014100210720060e260601010101010101010101010101010101010101010101010101010101010101010102030405060b200041063a00000c090b02402006417f6a41ff01714121490d00200041063a00000c090b024002402006417f6a22030d0041002105410121040c010b2003102a2204450d06200321050b0240200128020022012802042003490d0020042001280200200310cf061a200128020422062003490d072001200620036b3602042001200128020020036a360200410121070c050b200041063a00002005450d08200410260c080b41002103200241003a0058024002400340200128020022062802042204450d01200241386a20036a200628020022052d00003a000020062004417f6a3602042006200541016a3602002002200341016a22033a005820034120470d000b200241f4006a41026a220120022d003a22033a00002002418c016a41026a220620033a0000200241f8006a41086a2207200241cf006a2900002208370300200241f8006a41106a2209200241d7006a2d0000220a3a0000200220022f013822033b0174200220033b018c0120022002290047220b370378200228003b2104200228003f210520022800432103200241e0006a41106a220c200a3a0000200241e0006a41086a220a20083703002002200b370360200620012d00003a0000200220022f01743b018c012009200c2d00003a00002007200a29030037030020022002290360370378410021010c010b0240200341ff0171450d00200241003a00580b410121010b41022107200241346a41026a22062002418c016a41026a2d00003a0000200241206a41086a2209200241f8006a41086a290300370300200241206a41106a220a200241f8006a41106a2d00003a0000200220022f018c013b013420022002290378370320024020010d002002411c6a41026a20062d00003a0000200241086a41086a2009290300370300200241086a41106a200a2d00003a0000200220022f01343b011c200220022903203703080c040b200041063a00000c070b41002103200241003a0058024002400340200128020022062802042204450d01200241386a20036a200628020022052d00003a000020062004417f6a3602042006200541016a3602002002200341016a22033a005820034120470d000b200241f4006a41026a220120022d003a22033a00002002418c016a41026a220620033a0000200241f8006a41086a2207200241cf006a2900002208370300200241f8006a41106a2209200241d7006a2d0000220a3a0000200220022f013822033b0174200220033b018c0120022002290047220b370378200228003b2104200228003f210520022800432103200241e0006a41106a220c200a3a0000200241e0006a41086a220a20083703002002200b370360200620012d00003a0000200220022f01743b018c012009200c2d00003a00002007200a29030037030020022002290360370378410021010c010b0240200341ff0171450d00200241003a00580b410121010b200241346a41026a22062002418c016a41026a2d00003a0000200241206a41086a2207200241f8006a41086a290300370300200241206a41106a2209200241f8006a41106a2d00003a0000200220022f018c013b013420022002290378370320024020010d002002411c6a41026a20062d00003a0000200241086a41086a2007290300370300200241086a41106a20092d00003a0000200220022f01343b011c20022002290320370308410321070c030b200041063a00000c060b41002103200241003a0058024002400340200128020022062802042204450d01200241386a20036a200628020022052d00003a000020062004417f6a3602042006200541016a3602002002200341016a22033a005820034120470d000b200241f4006a41026a220120022d003a22033a00002002418c016a41026a220620033a0000200241f8006a41086a2207200241cf006a2900002208370300200241f8006a41106a2209200241d7006a2d0000220a3a0000200220022f013822033b0174200220033b018c0120022002290047220b370378200228003b2104200228003f210520022800432103200241e0006a41106a220c200a3a0000200241e0006a41086a220a20083703002002200b370360200620012d00003a0000200220022f01743b018c012009200c2d00003a00002007200a29030037030020022002290360370378410021010c010b0240200341ff0171450d00200241003a00580b410121010b200241346a41026a22062002418c016a41026a2d00003a0000200241206a41086a2207200241f8006a41086a290300370300200241206a41106a2209200241f8006a41106a2d00003a0000200220022f018c013b013420022002290378370320024020010d002002411c6a41026a20062d00003a0000200241086a41086a2007290300370300200241086a41106a20092d00003a0000200220022f01343b011c20022002290320370308410421070c020b200041063a00000c050b41002103200241003a0058024002400340200128020022062802042204450d01200241386a20036a200628020022052d00003a000020062004417f6a3602042006200541016a3602002002200341016a22033a005820034120470d000b200241f4006a41026a220120022d003a22033a00002002418c016a41026a220620033a0000200241f8006a41086a2207200241cf006a2900002208370300200241f8006a41106a2209200241d7006a2d0000220a3a0000200220022f013822033b0174200220033b018c0120022002290047220b370378200228003b2104200228003f210520022800432103200241e0006a41106a220c200a3a0000200241e0006a41086a220a20083703002002200b370360200620012d00003a0000200220022f01743b018c012009200c2d00003a00002007200a29030037030020022002290360370378410021010c010b0240200341ff0171450d00200241003a00580b410121010b200241346a41026a22062002418c016a41026a2d00003a0000200241206a41086a2207200241f8006a41086a290300370300200241206a41106a2209200241f8006a41106a2d00003a0000200220022f018c013b01342002200229037837032020010d032002411c6a41026a20062d00003a0000200241086a41086a2007290300370300200241086a41106a20092d00003a0000200220022f01343b011c20022002290320370308410521070b200020073a0000200020022f011c3b00012000410c6a2003360000200041086a2005360000200041046a2004360000200041106a2002290308370000200041216a20022f00053b0000200041036a2002411c6a41026a2d00003a0000200041186a200241086a41086a290300370000200041206a200241086a41106a2d00003a0000200041236a200241056a41026a2d00003a00000c030b1033000b2003200641b8afc0001048000b200041063a00000b20024190016a24000bd21505097f017e017f017e017f23004190016b220224000240024002400240024002400240024002400240024020012802042203450d00200128020022042d0000210520012003417f6a22063602042001200441016a360200200541254b0d014100210720050e260601010101010101010101010101010101010101010101010101010101010101010102030405060b200041063a00000c090b02402005417f6a41ff01714121490d00200041063a00000c090b024002402005417f6a22080d00410021094101210a0c010b2008102a220a450d0620012802042106200821090b024020062008490d00200a2001280200200810cf061a200128020422052008490d072001200520086b3602042001200128020020086a360200410121070c050b200041063a00002009450d08200a10260c080b41002105200241003a00582003417f6a21082003417e6a210302400240034020082005460d01200241386a20056a200420056a220741016a2d00003a0000200120033602042001200741026a3602002002200541016a22073a00582003417f6a21032007210520074120470d000b200241f4006a41026a220420022d003a22013a00002002418c016a41026a220320013a0000200241f8006a41086a2206200241cf006a290000220b370300200241f8006a41106a220c200241d7006a2d000022013a0000200220022f013822053b0174200220053b018c0120022002290047220d370378200228003b210a200228003f210920022800432108200241e0006a41106a220520013a0000200241e0006a41086a220e200b3703002002200d37036041012101200741ff01714120490d01200320042d00003a00002006200e290300370300200c20052d00003a0000200220022f01743b018c0120022002290360370378410021010c010b0240200541ff0171450d00200241003a00580b410121010b41022107200241346a41026a22052002418c016a41026a2d00003a0000200241206a41086a2204200241f8006a41086a290300370300200241206a41106a2203200241f8006a41106a2d00003a0000200220022f018c013b013420022002290378370320024020010d002002411c6a41026a20052d00003a0000200241086a41086a2004290300370300200241086a41106a20032d00003a0000200220022f01343b011c200220022903203703080c040b200041063a00000c070b41002105200241003a00582003417f6a21082003417e6a210302400240034020082005460d01200241386a20056a200420056a220741016a2d00003a0000200120033602042001200741026a3602002002200541016a22073a00582003417f6a21032007210520074120470d000b200241f4006a41026a220420022d003a22013a00002002418c016a41026a220320013a0000200241f8006a41086a2206200241cf006a290000220b370300200241f8006a41106a220c200241d7006a2d000022013a0000200220022f013822053b0174200220053b018c0120022002290047220d370378200228003b210a200228003f210920022800432108200241e0006a41106a220520013a0000200241e0006a41086a220e200b3703002002200d37036041012101200741ff01714120490d01200320042d00003a00002006200e290300370300200c20052d00003a0000200220022f01743b018c0120022002290360370378410021010c010b0240200541ff0171450d00200241003a00580b410121010b200241346a41026a22052002418c016a41026a2d00003a0000200241206a41086a2204200241f8006a41086a290300370300200241206a41106a2203200241f8006a41106a2d00003a0000200220022f018c013b013420022002290378370320024020010d002002411c6a41026a20052d00003a0000200241086a41086a2004290300370300200241086a41106a20032d00003a0000200220022f01343b011c20022002290320370308410321070c030b200041063a00000c060b41002105200241003a00582003417f6a21082003417e6a210302400240034020082005460d01200241386a20056a200420056a220741016a2d00003a0000200120033602042001200741026a3602002002200541016a22073a00582003417f6a21032007210520074120470d000b200241f4006a41026a220420022d003a22013a00002002418c016a41026a220320013a0000200241f8006a41086a2206200241cf006a290000220b370300200241f8006a41106a220c200241d7006a2d000022013a0000200220022f013822053b0174200220053b018c0120022002290047220d370378200228003b210a200228003f210920022800432108200241e0006a41106a220520013a0000200241e0006a41086a220e200b3703002002200d37036041012101200741ff01714120490d01200320042d00003a00002006200e290300370300200c20052d00003a0000200220022f01743b018c0120022002290360370378410021010c010b0240200541ff0171450d00200241003a00580b410121010b200241346a41026a22052002418c016a41026a2d00003a0000200241206a41086a2204200241f8006a41086a290300370300200241206a41106a2203200241f8006a41106a2d00003a0000200220022f018c013b013420022002290378370320024020010d002002411c6a41026a20052d00003a0000200241086a41086a2004290300370300200241086a41106a20032d00003a0000200220022f01343b011c20022002290320370308410421070c020b200041063a00000c050b41002105200241003a00582003417f6a21082003417e6a210302400240034020082005460d01200241386a20056a200420056a220741016a2d00003a0000200120033602042001200741026a3602002002200541016a22073a00582003417f6a21032007210520074120470d000b200241f4006a41026a220420022d003a22013a00002002418c016a41026a220320013a0000200241f8006a41086a2206200241cf006a290000220b370300200241f8006a41106a220c200241d7006a2d000022013a0000200220022f013822053b0174200220053b018c0120022002290047220d370378200228003b210a200228003f210920022800432108200241e0006a41106a220520013a0000200241e0006a41086a220e200b3703002002200d37036041012101200741ff01714120490d01200320042d00003a00002006200e290300370300200c20052d00003a0000200220022f01743b018c0120022002290360370378410021010c010b0240200541ff0171450d00200241003a00580b410121010b200241346a41026a22052002418c016a41026a2d00003a0000200241206a41086a2204200241f8006a41086a290300370300200241206a41106a2203200241f8006a41106a2d00003a0000200220022f018c013b01342002200229037837032020010d032002411c6a41026a20052d00003a0000200241086a41086a2004290300370300200241086a41106a20032d00003a0000200220022f01343b011c20022002290320370308410521070b200020073a0000200020022f011c3b00012000410c6a2008360000200041086a2009360000200041046a200a360000200041106a2002290308370000200041216a20022f00053b0000200041036a2002411c6a41026a2d00003a0000200041186a200241086a41086a290300370000200041206a200241086a41106a2d00003a0000200041236a200241056a41026a2d00003a00000c030b1033000b2008200541b8afc0001048000b200041063a00000b20024190016a24000be94504037f017e247f027e230041f0046b22022400024002400240024002400240024002400240024002400240024002400240024002400240024020012d0000417f6a2203410e4b0d0020030e0f0102030405060708090a0b0c0d0e0f010b41bf80c700412841dcbcc700102f000b200041013a000020002001290001370001200041196a200141196a290000370000200041116a200141116a290000370000200041096a200141096a2900003700000c0e0b2001410c6a2802002204ad42c8007e2205422088a70d0e2005a72203417f4c0d0e200141046a28020021060240024020030d00410421070c010b200310242207450d100b41002108200241003602c802200220073602c0022002200341c8006e3602c402200241c0026a4100200410ef0120022802c802210902402004450d002006200441c8006c6a210a20022802c002200941c8006c6a21032009200441037441786a4103766a41016a2109200241b0046a410372210b200241d0046a410372210c0340410021044100210702400240024002400240024020062d00000e06050102030400050b200241d0046a41186a200641196a290000370300200241d0046a41106a200641116a290000370300200241d0046a41086a200641096a2900003703002002200641016a2900003703d004410521070c040b200241f0036a200641046a10c801200c41086a200241f0036a41086a280200360000200c20022903f003370000410121070c030b200241d0046a41186a200641196a290000370300200241d0046a41106a200641116a290000370300200241d0046a41086a200641096a2900003703002002200641016a2900003703d004410221070c020b200241d0046a41186a200641196a290000370300200241d0046a41106a200641116a290000370300200241d0046a41086a200641096a2900003703002002200641016a2900003703d004410321070c010b200241d0046a41186a200641196a290000370300200241d0046a41106a200641116a290000370300200241d0046a41086a200641096a2900003703002002200641016a2900003703d004410421070b024002400240024002400240200641246a2d00000e06050102030400050b200241b0046a41186a2006413d6a290000370300200241b0046a41106a200641356a290000370300200241b0046a41086a2006412d6a2900003703002002200641256a2900003703b004410521040c040b200241f0036a200641286a10c801200b41086a200241f0036a41086a280200360000200b20022903f003370000410121040c030b200241b0046a41186a2006413d6a290000370300200241b0046a41106a200641356a290000370300200241b0046a41086a2006412d6a2900003703002002200641256a2900003703b004410221040c020b200241b0046a41186a2006413d6a290000370300200241b0046a41106a200641356a290000370300200241b0046a41086a2006412d6a2900003703002002200641256a2900003703b004410321040c010b200241b0046a41186a2006413d6a290000370300200241b0046a41106a200641356a290000370300200241b0046a41086a2006412d6a2900003703002002200641256a2900003703b004410421040b200320073a0000200341016a20022903d004370000200341096a200241d0046a41086a290300370000200341116a200241d0046a41106a290300370000200341196a200241d0046a41186a290300370000200241a0036a41026a2d0000210720022f00a003210d200341246a20043a0000200341216a200d3b0000200341236a20073a0000200341256a20022903b0043700002003412d6a200241b0046a41086a290300370000200341356a200241b0046a41106a2903003700002003413d6a200241b0046a41186a290300370000200341c5006a20022f00f0033b0000200341c7006a200241f0036a41026a2d00003a0000200341c8006a2103200641c8006a2206200a470d000b0b200220093602c802024002400240024002400240200141106a2d00000e06050102030400050b200241e8026a200141296a290000370300200241d0026a41106a200141216a290000370300200241d8026a200141196a2900003703002002200141116a2900003703d002410521080c040b200241d0046a200141146a10c801200241db026a200241d8046a280200360000200220022903d0043700d302410121080c030b200241e8026a200141296a290000370300200241d0026a41106a200141216a290000370300200241d8026a200141196a2900003703002002200141116a2900003703d002410221080c020b200241e8026a200141296a290000370300200241d0026a41106a200141216a290000370300200241d8026a200141196a2900003703002002200141116a2900003703d002410321080c010b200241e8026a200141296a290000370300200241d0026a41106a200141216a290000370300200241d8026a200141196a2900003703002002200141116a2900003703d002410421080b4100210341002106024002400240024002400240200141346a2d00000e06050102030400050b20024190036a200141cd006a29000037030020024188036a200141c5006a29000037030020024180036a2001413d6a2900003703002002200141356a2900003703f802410521060c040b200241d0046a200141386a10c80120024183036a200241d8046a280200360000200220022903d0043700fb02410121060c030b20024190036a200141cd006a29000037030020024188036a200141c5006a29000037030020024180036a2001413d6a2900003703002002200141356a2900003703f802410221060c020b20024190036a200141cd006a29000037030020024188036a200141c5006a29000037030020024180036a2001413d6a2900003703002002200141356a2900003703f802410321060c010b20024190036a200141cd006a29000037030020024188036a200141c5006a29000037030020024180036a2001413d6a2900003703002002200141356a2900003703f802410421060b024002400240024002400240200141d8006a2d00000e06050102030400050b200241b8036a200141f1006a290000370300200241b0036a200141e9006a290000370300200241a8036a200141e1006a2900003703002002200141d9006a2900003703a003410521030c040b200241d0046a200141dc006a10c801200241ab036a200241d8046a280200360000200220022903d0043700a303410121030c030b200241b8036a200141f1006a290000370300200241b0036a200141e9006a290000370300200241a8036a200141e1006a2900003703002002200141d9006a2900003703a003410221030c020b200241b8036a200141f1006a290000370300200241b0036a200141e9006a290000370300200241a8036a200141e1006a2900003703002002200141d9006a2900003703a003410321030c010b200241b8036a200141f1006a290000370300200241b0036a200141e9006a290000370300200241a8036a200141e1006a2900003703002002200141d9006a2900003703a003410421030b4100210441002107024002400240024002400240200141fc006a2d00000e06050102030400050b200241e0036a20014195016a290000370300200241d8036a2001418d016a290000370300200241d0036a20014185016a2900003703002002200141fd006a2900003703c803410521070c040b200241d0046a20014180016a10c801200241d3036a200241d8046a280200360000200220022903d0043700cb03410121070c030b200241e0036a20014195016a290000370300200241d8036a2001418d016a290000370300200241d0036a20014185016a2900003703002002200141fd006a2900003703c803410221070c020b200241e0036a20014195016a290000370300200241d8036a2001418d016a290000370300200241d0036a20014185016a2900003703002002200141fd006a2900003703c803410321070c010b200241e0036a20014195016a290000370300200241d8036a2001418d016a290000370300200241d0036a20014185016a2900003703002002200141fd006a2900003703c803410421070b024002400240024002400240200141a0016a2d00000e06050102030400050b20024188046a200141b9016a29000037030020024180046a200141b1016a290000370300200241f8036a200141a9016a2900003703002002200141a1016a2900003703f003410521040c040b200241d0046a200141a4016a10c801200241fb036a200241d8046a280200360000200220022903d0043700f303410121040c030b20024188046a200141b9016a29000037030020024180046a200141b1016a290000370300200241f8036a200141a9016a2900003703002002200141a1016a2900003703f003410221040c020b20024188046a200141b9016a29000037030020024180046a200141b1016a290000370300200241f8036a200141a9016a2900003703002002200141a1016a2900003703f003410321040c010b20024188046a200141b9016a29000037030020024180046a200141b1016a290000370300200241f8036a200141a9016a2900003703002002200141a1016a2900003703f003410421040b4100210d4100210b02402001418c026a2d00004101470d00200241a0046a2001419d026a28000036020020024198046a20014195026a29000037030020022001418d026a290000370390044101210b0b024002400240024002400240200141c4016a2d00000e06050102030400050b200241c8046a200141dd016a290000370300200241c0046a200141d5016a290000370300200241b8046a200141cd016a2900003703002002200141c5016a2900003703b0044105210d0c040b200241d0046a200141c8016a10c801200241bb046a200241d8046a280200360000200220022903d0043700b3044101210d0c030b200241c8046a200141dd016a290000370300200241c0046a200141d5016a290000370300200241b8046a200141cd016a2900003703002002200141c5016a2900003703b0044102210d0c020b200241c8046a200141dd016a290000370300200241c0046a200141d5016a290000370300200241b8046a200141cd016a2900003703002002200141c5016a2900003703b0044103210d0c010b200241c8046a200141dd016a290000370300200241c0046a200141d5016a290000370300200241b8046a200141cd016a2900003703002002200141c5016a2900003703b0044104210d0b4100210a024002400240024002400240200141e8016a2d00000e06050102030400050b200241e8046a20014181026a290000370300200241e0046a200141f9016a290000370300200241d8046a200141f1016a2900003703002002200141e9016a2900003703d0044105210a0c040b20024190026a200141ec016a10c801200241db046a20024198026a28020036000020022002290390023700d3044101210a0c030b200241e8046a20014181026a290000370300200241e0046a200141f9016a290000370300200241d8046a200141f1016a2900003703002002200141e9016a2900003703d0044102210a0c020b200241e8046a20014181026a290000370300200241e0046a200141f9016a290000370300200241d8046a200141f1016a2900003703002002200141e9016a2900003703d0044103210a0c010b200241e8046a20014181026a290000370300200241e0046a200141f9016a290000370300200241d8046a200141f1016a2900003703002002200141e9016a2900003703d0044104210a0b200241b0026a41086a2201200241c0026a41086a28020036020020024190026a41086a220c200241d0026a41086a29030037030020024190026a41106a2209200241d0026a41106a29030037030020024190026a41186a220e200241d0026a41186a2903003703002002418c026a41026a220f200241cd026a41026a2d00003a0000200241e8016a41186a2210200241f8026a41186a290300370300200241e8016a41106a2211200241f8026a41106a290300370300200241e8016a41086a2212200241f8026a41086a290300370300200220022903c0023703b002200220022903d00237039002200220022f00cd023b018c02200220022903f8023703e801200241e4016a41026a2213200241f5026a41026a2d00003a0000200241c0016a41086a2214200241a0036a41086a290300370300200241c0016a41106a2215200241a0036a41106a290300370300200241c0016a41186a2216200241a0036a41186a290300370300200241bc016a41026a22172002419d036a41026a2d00003a000020024198016a41086a2218200241c8036a41086a29030037030020024198016a41106a2219200241c8036a41106a29030037030020024198016a41186a221a200241c8036a41186a290300370300200220022f00f5023b01e401200220022903a0033703c001200220022f009d033b01bc01200220022903c8033703980120024194016a41026a221b200241c5036a41026a2d00003a0000200241f0006a41186a221c200241f0036a41186a290300370300200241f0006a41106a221d200241f0036a41106a290300370300200241f0006a41086a221e200241f0036a41086a290300370300200241ec006a41026a221f200241ed036a41026a2d00003a0000200241086a41106a222020024190046a41106a280200360200200241086a41086a222120024190046a41086a290300370300200220022f00c5033b019401200220022903f003370370200220022f00ed033b016c2002200229039004370308200241c8006a41186a2222200241b0046a41186a290300370300200241c8006a41106a2223200241b0046a41106a290300370300200241c8006a41086a2224200241b0046a41086a290300370300200220022903b004370348200241c4006a41026a2225200241aa046a41026a2d00003a0000200220022f00aa043b0144200241206a41186a2226200241d0046a41186a290300370300200241206a41106a2227200241d0046a41106a290300370300200241206a41086a2228200241d0046a41086a290300370300200220022903d0043703202002411c6a41026a2229200241ad046a41026a2d00003a0000200220022f00ad043b011c200041106a20083a00002000410c6a2001280200360200200041046a20022903b002370200200041116a200229039002370000200041196a200c290300370000200041216a2009290300370000200041296a200e290300370000200041316a20022f018c023b0000200041336a200f2d00003a0000200041346a20063a0000200041cd006a2010290300370000200041c5006a20112903003700002000413d6a2012290300370000200041356a20022903e801370000200041d7006a20132d00003a0000200041d5006a20022f01e4013b0000200041d8006a20033a0000200041f1006a2016290300370000200041e9006a2015290300370000200041e1006a2014290300370000200041d9006a20022903c001370000200041fb006a20172d00003a0000200041f9006a20022f01bc013b0000200041fc006a20073a000020004195016a201a2903003700002000418d016a201929030037000020004185016a2018290300370000200041fd006a2002290398013700002000419f016a201b2d00003a00002000419d016a20022f0194013b0000200041a0016a20043a0000200041b9016a201c290300370000200041b1016a201d290300370000200041a9016a201e290300370000200041a1016a2002290370370000200041c3016a201f2d00003a0000200041c1016a20022f016c3b0000200041c4016a200d3a0000200041dd016a2022290300370000200041d5016a2023290300370000200041cd016a2024290300370000200041c5016a2002290348370000200041e7016a20252d00003a0000200041e5016a20022f01443b0000200041e8016a200a3a000020004181026a2026290300370000200041f9016a2027290300370000200041f1016a2028290300370000200041e9016a20022903203700002000418b026a20292d00003a000020004189026a20022f011c3b00002000418c026a200b3a00002000419d026a202028020036000020004195026a20212903003700002000418d026a2002290308370000200041a3026a200241d0046a41026a2d00003a0000200041a1026a20022f00d0043b0000200041023a00000c0d0b2001410c6a2802002203ad42c4007e2205422088a70d0d2005a72204417f4c0d0d200141046a28020021060240024020040d00410421010c010b200410242201450d0f0b200241003602d003200220013602c8032002200441c4006e3602cc03200241c8036a4100200310eb0120022802d003210402402003450d002006200341c4006c6a210b20022802c803200441c4006c6a2103200241b3046a2109200241a2036a210c0340200241d0046a41186a2207200641186a290200370300200241d0046a41106a220d200641106a290200370300200241d0046a41086a220a200641086a290200370300200220062902003703d00441002101024002400240024002400240200641206a2d00000e06050102030400050b200241b0046a41186a200641396a290000370300200241b0046a41106a200641316a290000370300200241b0046a41086a200641296a2900003703002002200641216a2900003703b004410521010c040b200241f0036a200641246a10c801200941086a200241f0036a41086a280200360000200920022903f003370000410121010c030b200241b0046a41186a200641396a290000370300200241b0046a41106a200641316a290000370300200241b0046a41086a200641296a2900003703002002200641216a2900003703b004410221010c020b200241b0046a41186a200641396a290000370300200241b0046a41106a200641316a290000370300200241b0046a41086a200641296a2900003703002002200641216a2900003703b004410321010c010b200241b0046a41186a200641396a290000370300200241b0046a41106a200641316a290000370300200241b0046a41086a200641296a2900003703002002200641216a2900003703b004410421010b200320022903d004370200200341186a2007290300370200200341106a200d290300370200200341086a200a290300370200200341206a20013a0000200341216a20022903b004370000200341296a200241b0046a41086a290300370000200341316a200241b0046a41106a290300370000200341396a200241b0046a41186a290300370000200341c1006a20022f00a0033b0000200341c3006a200c2d00003a0000200341c4006a2103200441016a2104200641c4006a2206200b470d000b0b200041033a0000200041046a20022903c8033702002000410c6a20043602000c0c0b200041043a00000c0b0b200041053a0000200041106a200141106a290300370300200041086a200141086a290300370300200041046a200141046a2802003602000c0a0b200041063a0000200041046a200141046a2802003602000c090b200041073a0000200041106a200141106a290300370300200041086a200141086a290300370300200041046a200141046a2802003602000c080b200041083a000020002001290001370001200041246a200141246a280200360200200041096a200141096a290000370000200041116a200141116a290000370000200041196a200141196a2900003700000c070b200041093a0000200041086a200141086a290300370300200041046a200141046a2802003602000c060b200141246a2802002103200241e8046a2206200141196a290000370300200241e0046a2204200141116a290000370300200241d8046a2207200141096a290000370300200220012900013703d004200141386a290300212a200141306a290300212b420621050240024002400240024002400240200141286a2802000e0700010203040506000b420021050c050b420121050c040b420221050c030b420321050c020b420421050c010b420521050b200020022903d0043700012000410a3a0000200041386a202a370300200041306a202b370300200041246a2003360200200041286a2005370300200041096a2007290300370000200041116a2004290300370000200041196a20062903003700000c050b2000410b3a000020002001290001370001200041196a200141196a290000370000200041116a200141116a290000370000200041096a200141096a2900003700000c040b200241b0046a41186a2206200141196a290000370300200241b0046a41106a2204200141116a290000370300200241b0046a41086a2207200141096a290000370300200220012900013703b00441002103024002400240024002400240200141246a2d00000e06050102030400050b200241d0046a41186a2001413d6a290000370300200241d0046a41106a200141356a290000370300200241d0046a41086a2001412d6a2900003703002002200141256a2900003703d004410521030c040b200241f0036a200141286a10c801200241db046a200241f0036a41086a280200360000200220022903f0033700d304410121030c030b200241d0046a41186a2001413d6a290000370300200241d0046a41106a200141356a290000370300200241d0046a41086a2001412d6a2900003703002002200141256a2900003703d004410221030c020b200241d0046a41186a2001413d6a290000370300200241d0046a41106a200141356a290000370300200241d0046a41086a2001412d6a2900003703002002200141256a2900003703d004410321030c010b200241d0046a41186a2001413d6a290000370300200241d0046a41106a200141356a290000370300200241d0046a41086a2001412d6a2900003703002002200141256a2900003703d004410421030b200020022903b004370001200041246a20033a0000200041256a20022903d004370000200041196a2006290300370000200041116a2004290300370000200041096a20072903003700002000412d6a200241d0046a41086a290300370000200041356a200241d0046a41106a2903003700002000413d6a200241d0046a41186a2903003700002000410c3a0000200041c7006a200241f2036a2d00003a0000200041c5006a20022f00f0033b00000c030b200241b0046a41186a2206200141196a290000370300200241b0046a41106a2204200141116a290000370300200241b0046a41086a2207200141096a290000370300200220012900013703b00441002103024002400240024002400240200141246a2d00000e06050102030400050b200241d0046a41186a2001413d6a290000370300200241d0046a41106a200141356a290000370300200241d0046a41086a2001412d6a2900003703002002200141256a2900003703d004410521030c040b200241f0036a200141286a10c801200241db046a200241f0036a41086a280200360000200220022903f0033700d304410121030c030b200241d0046a41186a2001413d6a290000370300200241d0046a41106a200141356a290000370300200241d0046a41086a2001412d6a2900003703002002200141256a2900003703d004410221030c020b200241d0046a41186a2001413d6a290000370300200241d0046a41106a200141356a290000370300200241d0046a41086a2001412d6a2900003703002002200141256a2900003703d004410321030c010b200241d0046a41186a2001413d6a290000370300200241d0046a41106a200141356a290000370300200241d0046a41086a2001412d6a2900003703002002200141256a2900003703d004410421030b200020022903b004370001200041246a20033a0000200041256a20022903d004370000200041196a2006290300370000200041116a2004290300370000200041096a20072903003700002000412d6a200241d0046a41086a290300370000200041356a200241d0046a41106a2903003700002000413d6a200241d0046a41186a2903003700002000410d3a0000200041c7006a200241f2036a2d00003a0000200041c5006a20022f00f0033b00000c020b2000410e3a000020002001290001370001200041196a200141196a290000370000200041116a200141116a290000370000200041096a200141096a2900003700000c010b2000410f3a00000b200241f0046a24000f0b1034000b1033000b130020004110360204200041ccc2c1003602000bfbe1010a077f037e047f017e017f017e017f027e0c7f037e230041a0126b220324000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012d00000e10000102030405060708090a0b0c0d0e0f000b200341b40f6a4101360200200342013702a40f200341dcedc6003602a00f200341043602e40c200341d4edc6003602e00c2003200341e00c6a3602b00f200341a00f6a41ecc0c700103d000b200341e00c6a41186a2204200141196a290000370300200341e00c6a41106a2205200141116a290000370300200341e00c6a41086a2206200141096a290000370300200320012900013703e00c200341a00f6a41206a200241206a290200370300200341a00f6a41186a200241186a290200370300200341a00f6a41106a200241106a290200370300200341a00f6a41086a200241086a290200370300200320022902003703a00f02400240200341a00f6a10d302450d00410221010c010b200341b00a6a10d402200341c8076a41186a2004290300370300200341c8076a41106a2005290300370300200341c8076a41086a2006290300370300200320032903e00c3703c807024020032802b80a220241134b0d00200341a00f6a41186a2207200341c8076a41186a290300370300200341a00f6a41106a2208200341c8076a41106a290300370300200341a00f6a41086a2204200341c8076a41086a290300370300200320032903c8073703a00f0240200220032802b40a2206470d00200341b00a6a200210f20120032802b40a210620032802b80a21020b20032802b00a220520024106746a2201420037030820014201370300200141106a4200370300200141186a4200370300200141206a20032903a00f370300200141286a2004290300370300200141306a2008290300370300200141386a20072903003703002003200241016a22013602b80a200341b8026a41186a22074200370300200341b8026a41106a22084200370300200341b8026a41086a22094200370300200342003703b802200341a00f6a41918dc700410810fb0120092004290000370300200320032900a00f3703b802200341a00f6a41a4a7c100410a10fb0120072004290000370300200820032900a00f370300200341a00f6a2005200110c002200341b8026a412020032802a00f220420032802a80f10b301024020032802a40f450d00200410260b0240200641ffffff1f71450d00200510260b200341ac0f6a2002360200200341a80f6a41063a0000200341093a00a00f200341a00f6a10870220032003280080083602a005200320034183086a2800003600a305200041186a41003a0000200041106a2001ad42e098177e42809ac9c6007c37030020004201370308200020032802a0053600192000411c6a20032800a305360000200042003703000c3d0b200341a00f6a410d10d502200341a80f6a280200210220032802a40f210420032802a00f210120032802b40a41ffffff1f71450d0020032802b00a10260b20032003280080083602a005200320034183086a2800003600a305200041186a41003a000020004200370308200020032802a0053600192000411c6a20032800a305360000200041286a2002360200200041246a2004360200200041206a2001360200200042013703000c3b0b200341b00a6a200141046a41a00210cf061a200341a00f6a41206a200241206a290200370300200341a00f6a41186a200241186a290200370300200341a00f6a41106a200241106a290200370300200341a00f6a41086a200241086a290200370300200320022902003703a00f200341e00c6a200341a00f6a10d602200341b8026a41086a2201200341e90c6a290000370300200341b8026a41106a2202200341f10c6a290000370300200341b8026a41186a2204200341f90c6a290000370300200320032900e10c3703b80202400240024020032d00e00c4101460d0020034180126a41186a200429030037030020034180126a41106a200229030037030020034180126a41086a2001290300370300200320032903b8023703801202400240024020032802b80a220141e4004b0d00200341106a2001ad220a42004280d0f29ce1c800420010cc0620034180086a20034180126a10d702200341a00f6a200328028008220120032802880810d802200341a0056a200341a00f6a41a40210cf061a200341b8026a41086a2202200341cd116a290000370300200341b8026a41106a2204200341d5116a290000370300200341b8026a41176a2205200341dc116a280000360000200320032900c5113703b802200341106a41086a290300210b2003290310210c20032d00c41122064102460d01200341f8026a200341a0056a41a40210cf061a200341d8026a41176a2005280000360000200341d8026a41106a2004290300370300200341d8026a41086a2002290300370300200320032903b8023703d8020240200328028408450d00200110260b200341a00f6a200341f8026a41a40210cf061a200341a00f6a41a4026a20063a0000200341c5116a20032903d802370000200341cd116a200341d8026a41086a290300370000200341d5116a200341d8026a41106a290300370000200341dc116a200341ef026a2800003600000240200341a00f6a41186a2802002207450d0020032802b00f210141002102410021040340024002400240200141086a2206280200417f6a220541054b0d00024020050e06000101010100000b20020d01410021020c020b200241016a21020c010b200420026b220520074f0d1620034180086a41186a2208200120024105746b220541186a220929030037030020034180086a41106a220d200541106a220e29030037030020034180086a41086a220f200541086a2210290300370300200320052903003703800820062903002111200141106a22122903002113200141186a221429030021152005200129030037030020092015370300200e201337030020102011370300201420082903003703002012200d2903003703002006200f29030037030020012003290380083703000b200141206a21012007200441016a2204470d000b2002417f6a20074f0d002003200720026b3602b80f0b200341bc0f6a220110c4022001200341b00a6a41a00210cf061a200341e00c6a200341a00f6a41c00210cf061a200341e00c6a41086a290300211320032903e00c21160c020b200341a00f6a410c10d50220032f00a10f20032d00a30f41107472210120032902a40f211120032d00a00f21020c030b0240200328028408450d00200110260b200341f80c6a410036020042002116200342003703e80c200342003703e00c200342083703f00c200341fc0c6a200341b00a6a41a00210cf061a420021130b2003200c4280c0caf384a3027c22113703e00c2003200b2011200c54ad7c22153703e80c024020112016582015201358201520135122011b0d00200341a00f6a20034180126a201120167d201520137d2011201654ad7d10d90220032d00a00f22024104460d0020032d00a30f411074210120032f00a10f210420032902a40f21110240200341f40c6a28020041ffffff3f71450d0020032802f00c10260b20042001722101200341fc0c6a10c4020c030b02402016201158201320155820011b0d00200320034180126a201620117d201320157d2016201154ad7d10da020b200341f80c6a3502002111200341a00f6a200341e00c6a41c00210cf061a20034180086a20034180126a10d7022003280280082201200328028808200341a00f6a10db020240200328028408450d00200110260b0240200341b40f6a28020041ffffff3f71450d0020032802b00f10260b200341a00f6a411c6a10c402200341a00f6a41086a41003a0000200341b10f6a20034180126a41086a290300370000200341b90f6a20034180126a41106a290300370000200341c10f6a20034180126a41186a290300370000200341093a00a00f200341a00f6a41096a200329038012370000200341a00f6a108702200320032800e0113602c8072003200341e3116a2800003600cb07200041186a41003a0000200041106a201142e0b60d7e200a42e0c6db007e7c428098f6d3007c37030020004201370308200020032802c8073600192000411c6a20032800cb07360000200042003703000c3d0b410221020b200341b00a6a10c4020b200320032800e0113602c8072003200341e3116a2800003600cb07200041236a20014110763a0000200020013b0021200041186a41003a000020004200370308200020032802c8073600192000411c6a20032800cb0736000020002011370024200041206a20023a0000200042013703000c3a0b2001410c6a2802002107200141086a2802002108200141046a2802002117200341a00f6a41206a200241206a290200370300200341a00f6a41186a200241186a290200370300200341a00f6a41106a200241106a290200370300200341a00f6a41086a200241086a290200370300200320022902003703a00f200341e00c6a200341a00f6a10d602200341c8076a41086a2201200341e90c6a290000370300200341c8076a41106a2202200341f10c6a290000370300200341c8076a41186a2204200341f90c6a290000370300200320032900e10c3703c807024020032d00e00c4101460d0020034180086a41186a200429030037030020034180086a41106a200229030037030020034180086a41086a2001290300370300200320032903c80737038008200341a00f6a20034180086a10d702200341c0006a20032802a00f220220032802a80f41d4c0c7004100410010810220032802402101024020032802a40f450d00200210260b20014101470d36200741e4004b0d0e200341e00c6a20034180086a10dc02200341a00f6a20032802e00c220120032802e80c10dd02200341a00f6a41086a290300211520032802b00f211820032903a00f210c20032902b40f2111024020032802e40c450d00200110260b2011420020181b21162018410120181b2119200341306a2007ad42004280c0a8ca9a3a420010cc06200341306a41086a2903002111200329033021130240200741c4006c2205450d00200341cc0f6a2101200341c10f6a2104201721020340200341e00c6a200210bb02200341a00f6a20032802e00c220920032802e80c10de02200341b8026a41086a220d200341a00f6a41086a220e290300370300200341b8026a41106a220f200341a00f6a41106a2210290300370300200341b8026a41186a2212200341a00f6a41186a221429030037030020034180026a41026a221a200441026a221b2d00003a0000200341d8026a41086a221c200141086a221d290000370300200341d8026a41106a221e200141106a221f290000370300200320032903a00f3703b802200320042f00003b018002200320012900003703d8020240024020032d00c00f22064106460d0020032802c80f212020032802c40f2121200341c8076a41186a22222012290300370300200341c8076a41106a2212200f290300370300200341c8076a41086a220f200d290300370300200341f8016a41026a220d201a2d00003a0000200341e8076a41086a221a201c290300370300200341e8076a41106a221c201e290300370300200320032903b8023703c807200320032f0180023b01f801200320032903d8023703e807024020032802e40c450d00200910260b200420032f01f8013b0000200120032903e8073700002014202229030037030020102012290300370300200e200f290300370300201b200d2d00003a0000201d201a290300370000201f201c290300370000200320032903c8073703a00f200320203602c80f200320213602c40f200320063a00c00f200341a00f6a20034180086a412010d2062109024020064101470d002020450d00202110260b2009450d01200341a00f6a410e10d50220032f00a10f20032d00a30f41107472210420032902a40f211120032d00a00f21050c3c0b20032802e40c450d00200910260b200241c4006a2102200541bc7f6a22050d000b0b0240200c420020181b220c20135422022015420020181b2215201154201520115122011b450d00200341a00f6a20034180086a2013200c7d201120157d2013200c54ad7d10d90220032d00a00f22054104460d0020032f00a10f20032d00a30f41107472210420032902a40f21110c390b0240200c201358201520115820011b0d00200341206a20034180086a200c20137d201520117d2002ad7d10da020b024020164220882215a72201450d0020014105742102201921010340200341a00f6a200110bb0220032802a00f220420032802a80f10ff01024020032802a40f450d00200410260b200141206a2101200241606a22020d000b0b2003410036028812200342013703801220034180126a4100200741c4006c220141c4006d22021093012003280288122106200328028012211b0240024020010d00201721040c010b201720016a211a201b20064105746a210220062007410274417c6a4102766a41016a211c200341a00f6a41216a2104200341e00c6a411f6a21072017210102400340200341a0056a41186a2209200141186a290200370300200341a0056a41106a220d200141106a290200370300200341a0056a41086a220e200141086a290200370300200320012902003703a005200141206a2d00002105200341e00c6a41086a220f200141296a290000370300200341e00c6a41106a2210200141316a290000370300200341e00c6a41186a2212200141396a2900003703002007200141c0006a2800003600002003200141216a2900003703e00c024020054106470d00200141c4006a21040c020b200341b00a6a41186a22142009290300370300200341b00a6a41106a2209200d290300370300200341b00a6a41086a220d200e290300370300200320032903a0053703b00a200341a00f6a41186a20034180086a41186a290300370300200341a00f6a41106a20034180086a41106a290300370300200341a00f6a41086a20034180086a41086a29030037030020032003290380083703a00f200320053a00c00f200420032903e00c370000200441086a200f290300370000200441106a2010290300370000200441186a20122903003700002004411f6a2007280000360000200341f8026a200341b00a6a10bb0220032802f8022205200328028003200341a00f6a10df02024020032802fc02450d00200510260b024020032d00c00f4101470d0020032802c80f450d0020032802c40f10260b200220032903b00a370000200241186a2014290300370000200241106a2009290300370000200241086a200d290300370000200641016a2106200241206a2102200141c4006a2201201a470d000b201a2104201c21060b201a20046b220141c4006d21020b200320063602881202402001450d00200241c4006c2102200441286a210103400240200141786a2d00004101470d002001280200450d002001417c6a28020010260b200141c4006a2101200241bc7f6a22020d000b0b02402008450d00200841c4006c450d00201710260b2006ad210c02402006450d002003280284122108200341e00c6a20034180086a10dc0220064105744114722201417f4c0d1020032802e80c210920032802e00c2107200110242202450d11200341003602a80f200320013602a40f200320023602a00f200341a00f6a41004110106d20032802a00f20032802a80f22016a22022011370008200220133700002003200141106a3602a80f200341a00f6a200610a1012006410574210420032802a80f2102201b21010340200341a00f6a20024120106d20032802a00f220620032802a80f22056a22022001290000370000200241086a200141086a290000370000200241106a200141106a290000370000200241186a200141186a2900003700002003200541206a22023602a80f200141206a2101200441606a22040d000b200720092006200210b301024020032802a40f450d00200610260b024020032802e40c450d00200710260b0240200841ffffff3f71450d00201b10260b2015200c7c4280c2d72f7e201542a0cb98017e7c200c42a0eae1017e7c42c0c995d9007c21110c360b200341a00f6a20034180086a10dc0220032802a00f220120032802a80f10ff01024020032802a40f450d00200110260b2015200c7c4280c2d72f7e201542a0cb98017e7c200c42a0eae1017e7c42c0c995d9007c211120032802841241ffffff3f71450d35201b10260c350b410221050c380b200341a00f6a41206a200241206a290200370300200341a00f6a41186a200241186a290200370300200341a00f6a41106a200241106a290200370300200341a00f6a41086a200241086a290200370300200320022902003703a00f200341e00c6a200341a00f6a10d602200341b8026a41086a2201200341e90c6a290000370300200341b8026a41106a2202200341f10c6a290000370300200341b8026a41186a2204200341f90c6a290000370300200320032900e10c3703b8020240024020032d00e00c4101460d0020034180126a41186a200429030037030020034180126a41106a200229030037030020034180126a41086a2001290300370300200320032903b80237038012200341e00c6a20034180126a10dc02200341a00f6a20032802e00c220220032802e80c220410dd02024020032802b00f2201450d002002200410ff010b20032903a00f211320032902b40f2111200341a80f6a2903002116024020032802e40c450d00200210260b200341e0116a20034180126a10d702200341a00f6a20032802e011220220032802e811220510d802024020032d00c411220641024622040d002002200510ff010b2011420020011b21152001410120011b2105200341a0056a200341a00f6a41a40210cf061a200341b8026a41176a2207200341dc116a280000360000200341b8026a41106a2208200341d5116a290000370300200341b8026a41086a2209200341cd116a290000370300200320032900c5113703b802024020040d00200341f8026a200341a0056a41a40210cf061a200341d8026a41176a2007280000360000200341d8026a41106a2008290300370300200341d8026a41086a2009290300370300200320032903b8023703d802024020032802e411450d00200210260b2013420020011b210c2016420020011b210b200341b00a6a41066a200341f8026a41a40210cf061a20034180086a200341b00a6a41aa0210cf061a200341c8076a41176a2201200341d8026a41176a280000360000200341c8076a41106a2202200341d8026a41106a290300370300200341c8076a41086a2204200341d8026a41086a290300370300200320032903d8023703c807200341e00c6a20034180086a41066a41a40210cf061a200341e00c6a41a4026a20063a0000200341850f6a20032903c8073700002003418d0f6a2004290300370000200341950f6a20022903003700002003419c0f6a2001280000360000200341e00c6a41086a290300210a20032903e00c211620032802f00c210602400240200341f80c6a280200220741057422020d0042002111420021130c010b200641106a210142002111420021130340200141086a2903004200200141786a29030042015122041b20137c2001290300420020041b221320117c2211201354ad7c2113200141206a2101200241606a22020d000b0b200a200b7c2016200c7c220c201654ad7c20137c200c20117c2211200c54ad7c2113024020154220882216a72201450d0020014105742102200521010340200341a00f6a200110bb0220032802a00f220420032802a80f10ff01024020032802a40f450d00200410260b200141206a2101200241606a22020d000b0b200341c8006a20034180126a2011201310da02200341d80f6a2013370300200341d00f6a2011370300200341a00f6a41086a41013a0000200341b10f6a20034180126a41086a290300370000200341b90f6a20034190126a290300370000200341c10f6a20034198126a290300370000200341093a00a00f200341a00f6a41096a200329038012370000200341a00f6a1087022007ad42a08d067e201642c0d89e017e7c200341840d6a35020042a0f7367e7c20164280c2d72f7e7c2111200341fc0c6a21010240200341f40c6a28020041ffffff3f71450d00200610260b20114280ab988c017c2111200110c4020240201542ffffff3f83500d00200510260b20032003280088023602e80120032003418b026a2800003600eb01200041186a41003a0000200041106a201137030020004201370308200020032802e8013600192000411c6a20032800eb01360000200042003703000c3b0b024020032802e411450d00200210260b200341a00f6a410310d502200320032900a10f370398022003200341a80f6a28000036009f0220032d00a00f2101201542ffffff3f83500d01200510260c010b410221010b20032003280088023602e80120032003290398023703e8072003200328009f023600ef0720032003418b026a2800003600eb01200041186a41003a000020004200370308200020032802e8013600192000411c6a20032800eb01360000200041206a20013a0000200020032903e807370021200041286a20032800ef07360000200042013703000c380b200141106a2903002111200141086a2903002113200141046a2802002101200341a00f6a41206a200241206a290200370300200341a00f6a41186a200241186a290200370300200341a00f6a41106a200241106a290200370300200341a00f6a41086a200241086a290200370300200320022902003703a00f200341e00c6a200341a00f6a10d602200341b8026a41086a2202200341e90c6a290000370300200341b8026a41106a2204200341f10c6a290000370300200341b8026a41186a2205200341f90c6a290000370300200320032900e10c3703b8020240024020032d00e00c4101460d0020034180126a41186a200529030037030020034180126a41106a200429030037030020034180126a41086a2002290300370300200320032903b8023703801220034198026a10d40220032802980221040240024020032802a00220014d0d00200420014106746a22022903004201520d002002290308201356200241106a290300221320115620132011511b450d01200341a00f6a410510d50220032f00a10f20032d00a30f4110747221010c330b200341a00f6a410410d50220032f00a10f20032d00a30f4110747221010c320b200341e0116a20034180126a10d702200341a00f6a20032802e011220520032802e81110d802200341a0056a200341a00f6a41a40210cf061a200341b8026a41086a200341cd116a290000370300200341b8026a41106a200341d5116a290000370300200341b8026a41176a2206200341dc116a280000360000200320032900c5113703b80202400240024002400240024020032d00c41122074102460d00200241086a210d200341f8026a200341a0056a41a40210cf061a200341d8026a41176a2006280000360000200341d8026a41106a2202200341b8026a41106a290300370300200341d8026a41086a2206200341b8026a41086a290300370300200320032903b8023703d802024020032802e411450d00200510260b200341b00a6a41066a200341f8026a41a40210cf061a20034180086a200341b00a6a41aa0210cf061a200341c8076a41176a2205200341d8026a41176a280000360000200341c8076a41106a22082002290300370300200341c8076a41086a22022006290300370300200320032903d8023703c807200341e00c6a20034180086a41066a41a40210cf061a200341e00c6a41a4026a20073a0000200341850f6a20032903c8073700002003418d0f6a2002290300370000200341950f6a20082903003700002003419c0f6a2005280000360000200d41086a2903002111200d290300211320032802f00c210841002102200341f80c6a280200220941014b0d0120090e020302030b024020032802e411450d00200510260b200341a00f6a410610d50220032f00a10f20032d00a30f4110747221010c360b20092105034020022005410176220620026a2207200820074105746a28020020014b1b2102200520066b220541014b0d000b0b200820024105746a220628020022052001460d012009200220052001496a2202490d130b02402009200341f40c6a280200470d00200341e00c6a41106a200910ed0120032802f00c21080b200820024105746a220541206a2005200920026b41057410d0061a200541186a2011370300200541106a201337030020054201370308200520013602002003200941016a22093602f80c0c010b200920024d0d120240200820024105746a2202280208417f6a220541054b0d00024020050e06000101010100000b200341a00f6a410710d50220032f00a10f20032d00a30f41107472210120032902a40f211120032d00a00f21020c320b200241086a420137030020062001360200200241186a2011370300200241106a20133703000b200341a00f6a20034180126a200d290300200d41086a29030010d90220032d00a00f22024104460d0120032f00a10f20032d00a30f41107472210120032902a40f21110c300b410221020c320b200341840d6a3502002111200341a00f6a200341e00c6a41c00210cf061a200341b00a6a20034180126a10d70220032802b00a220220032802b80a200341a00f6a10db02024020032802b40a450d00200210260b2009ad21130240200341b40f6a28020041ffffff3f71450d0020032802b00f10260b200341a00f6a411c6a10c402200341a00f6a41086a41033a0000200341b10f6a20034180126a41086a290300370000200341b90f6a20034180126a41106a290300370000200341c10f6a20034180126a41186a290300370000200341cc0f6a2001360200200341093a00a00f200341a00f6a41096a20032903801237000020134280b5187e201142e0fbf3007e7c42808da9e0007c2111200341a00f6a1087020240200328029c0241ffffff1f71450d00200410260b200320032800e807360288022003200341e8076a41036a28000036008b02200041186a41003a0000200041106a20113703002000420137030820002003280288023600192000411c6a200328008b02360000200042003703000c370b200141046a2802002106200341a00f6a41206a200241206a290200370300200341a00f6a41186a200241186a290200370300200341a00f6a41106a200241106a290200370300200341a00f6a41086a200241086a290200370300200320022902003703a00f200341e00c6a200341a00f6a10d602200341b8026a41086a2201200341e90c6a290000370300200341b8026a41106a2202200341f10c6a290000370300200341b8026a41186a2204200341f90c6a290000370300200320032900e10c3703b80202400240024020032d00e00c4101460d0020034180126a41186a200429030037030020034180126a41106a200229030037030020034180126a41086a2001290300370300200320032903b80237038012200341e0116a20034180126a10d702200341a00f6a20032802e011220420032802e81110d802200341a0056a200341a00f6a41a40210cf061a2001200341cd116a2900003703002002200341d5116a290000370300200341b8026a41176a2201200341dc116a280000360000200320032900c5113703b8020240024002400240024020032d00c41122024102460d00200341f8026a200341a0056a41a40210cf061a200341d8026a41176a2001280000360000200341d8026a41106a2201200341b8026a41106a290300370300200341d8026a41086a2205200341b8026a41086a290300370300200320032903b8023703d802024020032802e411450d00200410260b200341b00a6a41066a200341f8026a41a40210cf061a20034180086a200341b00a6a41aa0210cf061a200341c8076a41176a2204200341d8026a41176a280000360000200341c8076a41106a22072001290300370300200341c8076a41086a22012005290300370300200320032903d8023703c807200341e00c6a20034180086a41066a41a40210cf061a200341e00c6a41a4026a20023a0000200341850f6a20032903c8073700002003418d0f6a2001290300370000200341950f6a20072903003700002003419c0f6a200428000036000020032802f00c210741002101200341f80c6a280200220841014b0d0120080e020302030b024020032802e411450d00200410260b200341a00f6a410610d502200320032900a10f370398022003200341a80f6a28000036009f0220032d00a00f21010c050b20082102034020012002410176220420016a2205200720054105746a28020020064b1b2101200220046b220241014b0d000b0b200720014105746a2802002006470d00200820014d0d14200720014105746a220241186a2903002113200241106a2903002115200229030821112002200241206a20082001417f736a41057410d0061a20032008417f6a22013602f80c20114201510d04200341a00f6a410810d502200320032900a10f370398022003200341a00f6a41086a28000036009f020c010b200341a00f6a410210d502200320032900a10f370398022003200341a80f6a28000036009f020b20032d00a00f21010240200341f40c6a28020041ffffff3f71450d00200710260b200341fc0c6a10c4020c010b410221010b20032003280088023602e80120032003290398023703e8072003200328009f023600ef0720032003418b026a2800003600eb01200041186a41003a000020004200370308200020032802e8013600192000411c6a20032800eb01360000200041206a20013a0000200020032903e807370021200041286a20032800ef07360000200042013703000c370b200341d8006a20034180126a2015201310da02200341840d6a3502002111200341a00f6a200341e00c6a41c00210cf061a200341b00a6a20034180126a10d70220032802b00a220220032802b80a200341a00f6a10db02024020032802b40a450d00200210260b2001ad21130240200341b40f6a28020041ffffff3f71450d0020032802b00f10260b200341a00f6a411c6a10c402200341a00f6a41086a41043a0000200341b10f6a20034180126a41086a290300370000200341b90f6a20034180126a41106a290300370000200341c10f6a20034180126a41186a290300370000200341cc0f6a2006360200200341093a00a00f200341a00f6a41096a200329038012370000200341a00f6a10870220032003280088023602e80120032003418b026a2800003600eb01200041186a41003a0000200041106a20134280b5187e201142e0fbf3007e7c42808da9e0007c37030020004201370308200020032802e8013600192000411c6a20032800eb01360000200042003703000c360b200141106a2903002111200141086a2903002113200141046a2802002101200341a00f6a41206a200241206a290200370300200341a00f6a41186a200241186a290200370300200341a00f6a41106a200241106a290200370300200341a00f6a41086a200241086a290200370300200320022902003703a00f200341e00c6a200341a00f6a10d602200341c8076a41086a2202200341e90c6a290000370300200341c8076a41106a2204200341f10c6a290000370300200341c8076a41186a2205200341f90c6a290000370300200320032900e10c3703c80720032d00e00c4101460d0f200341b00a6a41186a2005290300370300200341b00a6a41106a2004290300370300200341b00a6a41086a2002290300370300200320032903c8073703b00a200341e00c6a10d40220032802e00c2102024002400240024020032802e80c220420014d0d00200220014106746a22012903004201520d000240200341b00a6a200141206a2205460d002005200341b00a6a412010d2060d010b200141086a22012013370300200120113703080c010b200341a00f6a410a10d50220032d00a00f22014104470d010b41002105200421010c010b20032902a40f211120032f00a10f20032d00a30f411074724108742001722101410121050b20032802e40c2106200341d0026a22074200370300200341c8026a22084200370300200341b8026a41086a22094200370300200342003703b802200341a00f6a41918dc700410810fb012009200341a00f6a41086a220d290000370300200320032900a00f3703b802200341a00f6a41a4a7c100410a10fb012007200d290000370300200820032900a00f370300200341a00f6a2002200410c002200341b8026a412020032802a00f220420032802a80f10b301024020032802a40f450d00200410260b0240200641ffffff1f71450d00200210260b20050d2b20032003280080083602a005200320034183086a2800003600a305200041186a41003a0000200041106a2001ad429092147e428087913f7c37030020004201370308200020032802a0053600192000411c6a20032800a305360000200042003703000c350b200141246a280200210520034180086a41186a2206200141196a29000037030020034180086a41106a2207200141116a29000037030020034180086a41086a2208200141096a2900003703002003200129000137038008200341a00f6a41206a200241206a290200370300200341a00f6a41186a200241186a290200370300200341a00f6a41106a200241106a290200370300200341a00f6a41086a200241086a290200370300200320022902003703a00f200341e00c6a200341a00f6a10d602200341c8076a41086a2201200341e00c6a41096a290000370300200341c8076a41106a2202200341e00c6a41116a290000370300200341c8076a41186a2204200341e00c6a41196a290000370300200320032900e10c3703c80720032d00e00c4101460d0f200341b00a6a41186a2004290300370300200341b00a6a41106a2002290300370300200341b00a6a41086a2001290300370300200320032903c8073703b00a200341e00c6a10d40220042006290300370300200220072903003703002001200829030037030020032003290380083703c80720032802e00c2102024002400240024020032802e80c220420054d0d00200220054106746a22012903004201520d00200341b8026a41186a2205200341c8076a41186a290300370300200341b8026a41106a2206200341c8076a41106a290300370300200341b8026a41086a2207200341c8076a41086a290300370300200320032903c8073703b8020240200341b00a6a200141206a2201460d002001200341b00a6a412010d2060d010b200120032903b802370200200141186a2005290300370200200141106a2006290300370200200141086a20072903003702000c010b200341a00f6a410a10d50220032d00a00f22014104470d010b41002105200421010c010b20032902a40f211120032f00a10f20032d00a30f411074724108742001722101410121050b20032802e40c2106200341d0026a22074200370300200341c8026a22084200370300200341b8026a41086a22094200370300200342003703b802200341a00f6a41918dc700410810fb012009200341a00f6a41086a220d290000370300200320032900a00f3703b802200341a00f6a41a4a7c100410a10fb012007200d290000370300200820032900a00f370300200341a00f6a2002200410c002200341b8026a412020032802a00f220420032802a80f10b301024020032802a40f450d00200410260b0240200641ffffff1f71450d00200210260b20050d29200320032800a0053602f8022003200341a3056a2800003600fb02200041186a41003a0000200041106a2001ad4280c4137e42e0cdec3f7c37030020004201370308200020032802f8023600192000411c6a20032800fb02360000200042003703000c340b200141086a2903002111200141046a2802002101200341a00f6a41206a200241206a290200370300200341a00f6a41186a200241186a290200370300200341a00f6a41106a200241106a290200370300200341a00f6a41086a200241086a290200370300200320022902003703a00f200341e00c6a200341a00f6a10d602200341c8076a41086a2202200341e90c6a290000370300200341c8076a41106a2204200341f10c6a290000370300200341c8076a41186a2205200341f90c6a290000370300200320032900e10c3703c80720032d00e00c4101460d0f200341b00a6a41186a2005290300370300200341b00a6a41106a2004290300370300200341b00a6a41086a2002290300370300200320032903c8073703b00a200341e00c6a10d40220032802e00c2102024002400240024020032802e80c220420014d0d00200220014106746a22052903004201520d000240200341b00a6a200541206a2205460d002005200341b00a6a412010d2060d010b200220014106746a20113703180c010b200341a00f6a410a10d50220032d00a00f22014104470d010b41002105200421010c010b20032902a40f211120032f00a10f20032d00a30f411074724108742001722101410121050b20032802e40c2106200341d0026a22074200370300200341c8026a22084200370300200341b8026a41086a22094200370300200342003703b802200341a00f6a41918dc700410810fb012009200341a00f6a41086a220d290000370300200320032900a00f3703b802200341a00f6a41a4a7c100410a10fb012007200d290000370300200820032900a00f370300200341a00f6a2002200410c002200341b8026a412020032802a00f220420032802a80f10b301024020032802a40f450d00200410260b0240200641ffffff1f71450d00200210260b20050d2720032003280080083602a005200320034183086a2800003600a305200041186a41003a0000200041106a2001ad429092147e42a094973f7c37030020004201370308200020032802a0053600192000411c6a20032800a305360000200042003703000c330b200141386a2903002113200141306a2903002115200141286a2903002111200141246a280200210420034198026a41186a2205200141196a29000037030020034198026a41106a2206200141116a29000037030020034198026a41086a2207200141096a2900003703002003200129000137039802200341a00f6a41206a200241206a290200370300200341a00f6a41186a200241186a290200370300200341a00f6a41106a200241106a290200370300200341a00f6a41086a200241086a290200370300200320022902003703a00f200341e00c6a200341a00f6a10d602200341c8076a41086a2201200341e00c6a41096a290000370300200341c8076a41106a2202200341e00c6a41116a290000370300200341c8076a41186a2208200341e00c6a41196a290000370300200320032900e10c3703c8070240024020032d00e00c4101470d00410221010c010b200341e0116a41186a2008290300370300200341e0116a41106a2002290300370300200341e0116a41086a2001290300370300200320032903c8073703e01120034180126a41086a200729030037030020034180126a41106a200629030037030020034180126a41186a20052903003703002003200329039802370380120240024020114201510d00200341e00c6a10d40220032802e00c21020240024002400240024020032802e80c20044d0d00200220044106746a22012903004201520d000240200341e0116a200141206a2201460d002001200341e0116a412010d2060d010b024020032802e40c41ffffff1f71450d00200210260b200341e8076a20034180126a10d702200341a00f6a20032802e807220120032802f00710d802200341a0056a200341a00f6a41a40210cf061a200341b8026a41086a2202200341cd116a290000370300200341b8026a41106a2205200341d5116a290000370300200341b8026a41176a2206200341dc116a280000360000200320032900c5113703b802024020032d00c41122074102460d00200341f8026a200341a0056a41a40210cf061a200341d8026a41176a2006280000360000200341d8026a41106a2005290300370300200341d8026a41086a2002290300370300200320032903b8023703d802024020032802ec07450d00200110260b200341b00a6a41066a200341f8026a41a40210cf061a20034180086a200341b00a6a41aa0210cf061a200341c8076a41176a2201200341d8026a41176a280000360000200341c8076a41106a2202200341d8026a41106a290300370300200341c8076a41086a2205200341d8026a41086a290300370300200320032903d8023703c807200341e00c6a20034180086a41066a41a40210cf061a200341e00c6a41a4026a20073a0000200341850f6a20032903c8073700002003418d0f6a2005290300370000200341950f6a20022903003700002003419c0f6a200128000036000020032802f00c210741002101200341f80c6a280200220841014b0d0220080e020403040b024020032802ec07450d00200110260b200341a00f6a410b10d502200320032900a10f370388022003200341a80f6a28000036008f020c060b200341a00f6a410a10d502200320032900a10f370388022003200341a80f6a28000036008f0220032d00a00f210120032802e40c41ffffff1f71450d06200210260c060b20082102034020012002410176220520016a2206200720064105746a28020020044b1b2101200220056b220241014b0d000b0b200720014105746a220228020022052004460d012008200120052004496a2201490d140b02402008200341f40c6a280200470d00200341e00c6a41106a200810ed0120032802f00c21070b200720014105746a220241206a2002200820016b41057410d0061a200241186a2013370300200241106a201537030020022011370308200220043602002003200841016a22083602f80c0c290b200820014d0d13200720014105746a220141086a2105024020012903084201520d00200341a00f6a20034180126a200341e0116a200141106a290300200141186a290300410010e0020b2005201137030020022004360200200141186a2013370300200141106a20153703000c280b200341a00f6a410910d502200320032900a10f370388022003200341a80f6a28000036008f020b20032d00a00f21010b20032003280080023602f80120032003290388023703e8012003200328008f023600ef01200320034183026a2800003600fb01200041186a41003a000020004200370308200020032802f8013600192000411c6a20032800fb01360000200041206a20013a0000200020032903e801370021200041286a20032800ef01360000200042013703000c320b200341e0116a41186a2204200141196a290000370300200341e0116a41106a2205200141116a290000370300200341e0116a41086a2206200141096a290000370300200320012900013703e011200341a00f6a41206a200241206a290200370300200341a00f6a41186a200241186a290200370300200341a00f6a41106a200241106a290200370300200341a00f6a41086a200241086a290200370300200320022902003703a00f41022101024002400240200341a00f6a10d3020d0020034180126a41086a200629030037030020034180126a41106a200529030037030020034180126a41186a2004290300370300200320032903e01137038012200341e00c6a20034180126a10dc02200341a00f6a20032802e00c220220032802e80c220410dd02024020032802b00f2201450d002002200410ff010b20032903a00f211320032902b40f2111200341a80f6a2903002116024020032802e40c450d00200210260b20034198026a20034180126a10d702200341a00f6a200328029802220220032802a002220510d802024020032d00c411220641024622040d002002200510ff010b2011420020011b21152001410120011b2105200341a0056a200341a00f6a41a40210cf061a200341b8026a41176a2207200341dc116a280000360000200341b8026a41106a2208200341d5116a290000370300200341b8026a41086a2209200341cd116a290000370300200320032900c5113703b802024020040d00200341f8026a200341a0056a41a40210cf061a200341d8026a41176a2007280000360000200341d8026a41106a2008290300370300200341d8026a41086a2009290300370300200320032903b8023703d8020240200328029c02450d00200210260b2013420020011b210c2016420020011b210b200341b00a6a41066a200341f8026a41a40210cf061a20034180086a200341b00a6a41aa0210cf061a200341c8076a41176a2201200341d8026a41176a280000360000200341c8076a41106a2202200341d8026a41106a290300370300200341c8076a41086a2204200341d8026a41086a290300370300200320032903d8023703c807200341e00c6a20034180086a41066a41a40210cf061a200341e00c6a41a4026a20063a0000200341850f6a20032903c8073700002003418d0f6a2004290300370000200341950f6a20022903003700002003419c0f6a2001280000360000200341e00c6a41086a290300210a20032903e00c211620032802f00c210702400240200341f80c6a280200220841057422020d0042002111420021130c010b200741106a210142002111420021130340200141086a2903004200200141786a29030042015122041b20137c2001290300420020041b221320117c2211201354ad7c2113200141206a2101200241606a22020d000b0b200a200b7c2016200c7c220c201654ad7c20137c200c20117c2211200c54ad7c2113024020154220882216a72201450d0020014105742102200521010340200341a00f6a200110bb0220032802a00f220420032802a80f10ff01024020032802a40f450d00200410260b200141206a2101200241606a22020d000b0b20034198016a20034180126a2011201310e102200329039801220c20034198016a41086a290300220a844200520d02200341b80f6a22014200370300200341a00f6a41106a22024200370300200341a00f6a41086a22044200370300200342003703a00f200341b00a6a419a8cc700410810fb012004200341b00a6a41086a2206290000370300200320032900b00a3703a00f200341b00a6a41b8a1c300410d10fb0120012006290000370300200220032900b00a370300200341e8006a200341a00f6a108d02200341e8006a41106a290300210c2003290370210b20032802682109200142003703002002420037030020044200370300200342003703a00f200341b00a6a419a8cc700410810fb0120042006290000370300200320032900b00a3703a00f200341b00a6a41b8a1c300410d10fb0120012006290000370300200220032900b00a3703002003200c420020091b3703b80a2003200b420020091b3703b00a200341a00f6a4120200341b00a6a411010b3010c030b0240200328029c02450d00200210260b200341a00f6a410310d502200320032900a10f3703e8072003200341a80f6a2800003600ef0720032d00a00f2101201542ffffff3f83500d00200510260b200320032800e80136028002200320032903e80737038802200320032800ef0736008f022003200341eb016a28000036008302200041186a41003a00002000420037030820002003280280023600192000411c6a200328008302360000200041206a20013a00002000200329038802370021200041286a200328008f02360000200042013703000c330b200341b8056a22014200370300200341a0056a41106a22024200370300200341a0056a41086a22044200370300200342003703a005200341a00f6a419a8cc700410810fb012004200341a00f6a41086a2206290000370300200320032900a00f3703a005200341a00f6a41b8a1c300410d10fb0120012006290000370300200220032900a00f37030020034180016a200341a0056a108d0220034180016a41106a290300210b20032903880121232003280280012109200142003703002002420037030020044200370300200342003703a005200341a00f6a419a8cc700410810fb0120042006290000370300200320032900a00f3703a005200341a00f6a41b8a1c300410d10fb0120012006290000370300200220032900a00f37030020034200200b420020091b220b200a7d2023420020091b220a200c54ad7d2223200a200c7d220c200a562023200b562023200b511b22011b3703a80f20034200200c20011b3703a00f200341a0056a4120200341a00f6a411010b3010b200341d80f6a2013370300200341d00f6a2011370300200341a00f6a41086a41023a0000200341093a00a00f200341a00f6a41096a200329038012370000200341b10f6a20034180126a41086a290300370000200341b90f6a20034190126a290300370000200341c10f6a20034198126a290300370000200341a00f6a1087022008ad42d0f7077e201642c0d89e017e7c200341840d6a35020042a0f7367e7c20164280c2d72f7e7c2111200341fc0c6a21010240200341f40c6a28020041ffffff3f71450d00200710260b201142c091efda017c2111200110c4020240201542ffffff3f83500d00200510260b200320032800e801360280022003200341eb016a28000036008302200041186a41003a0000200041106a20113703002000420137030820002003280280023600192000411c6a200328008302360000200042003703000c310b200341f8026a41186a2208200141196a290000370300200341f8026a41106a2209200141116a290000370300200341f8026a41086a220d200141096a290000370300200320012900013703f80220034180026a41026a200141276a2d00003a0000200341e0116a41086a200141386a290200370300200341e0116a41106a200141c0006a2902003703002003200141256a2f00003b0180022003200141306a2902003703e011200141246a2d00002104200141286a28020021072001412c6a2802002106200341a00f6a41206a200241206a290200370300200341a00f6a41186a200241186a290200370300200341a00f6a41106a200241106a290200370300200341a00f6a41086a200241086a290200370300200320022902003703a00f200341e00c6a200341a00f6a10d60220034180086a41086a2201200341e00c6a41096a29000037030020034180086a41106a2202200341e00c6a41116a29000037030020034180086a41186a2205200341e00c6a41196a290000370300200320032900e10c37038008024020032d00e00c4101470d00200341023a00e8070240200441ff01714101460d000c230b2006450d21200710260c210b200341a0056a41186a2005290300370300200341a0056a41106a2002290300370300200341a0056a41086a200129030037030020032003290380083703a0052001200d2903003703002002200929030037030020052008290300370300200320032903f80237038008200341a00f6a200341a0056a10d702200341c0016a20032802a00f220220032802a80f41d4c0c7004100410010810220032802c0012101024020032802a40f450d00200210260b02400240024020014101470d00200341a00f6a20034180086a10bb02200341b8016a20032802a00f220220032802a80f41d4c0c7004100410010810220032802b8012101024020032802a40f450d00200210260b20014101470d02200341e8076a410e10d5020c010b200341e8076a410610d5020b200441ff01714101470d212006450d21200710260c210b200341c8076a41186a20034180086a41186a290300370300200341c8076a41106a20034180086a41106a290300370300200341c8076a41086a20034180086a41086a290300370300200341e8016a41026a20034180026a41026a2d00003a000020034180126a41086a200341e0116a41086a29030037030020034180126a41106a200341e0116a41106a290300370300200320032f0180023b01e801200320032903e0113703801220032003290380083703c807200341d8026a200341a0056a10dc02200341a00f6a20032802d802220520032802e002220810dd020240024020032802b00f22020d0041002101200341b00a6a41186a4100360200200342003703b80a200342003703b00a200342013703c00a41012102410021090c010b200341c40a6a20032902b40f2211370200200320032903a00f3703b00a200320023602c00a2003200341a00f6a41086a2903003703b80a2003200341bc0f6a2802003602cc0a2011422088a721012011a721090b200341ec0c6a2006360200200341e00c6a41086a2007360200200341e00c6a41106a200329038012370300200341e00c6a41186a20034180126a41086a290300370300200341800d6a20034180126a41106a290300370300200341900d6a200341c8076a41086a290300370300200341980d6a200341c8076a41106a290300370300200341a00d6a200341c8076a41186a290300370300200320043a00e40c200320032f01e8013b00e50c2003200341ea016a2d00003a00e70c200320032903c8073703880d2003200341a0056a3602e00c0240200141e3004b0d00200341a00f6a200341a0056a4280c0a8ca9a3a420010d90220032d00a00f220d4104470d10200341a00f6a41186a200341a0056a41186a290300370300200341a00f6a41106a200341a0056a41106a290300370300200341a00f6a41086a200341a0056a41086a290300370300200341a00f6a41286a200341e00c6a410472220441086a290200370300200341d00f6a200441106a290200370300200341d80f6a200441186a290200370300200341e00f6a200441206a280200360200200320032903a0053703a00f200320042902003703c00f200341b8026a200341e00c6a41286a10bb0220032802b802220420032802c002200341a00f6a10df02024020032802bc02450d00200410260b200341880d6a2104024020032d00c00f4101470d00200341c80f6a280200450d00200341c40f6a28020010260b200341b8026a41186a2206200441186a2207290200370300200341b8026a41106a220d200441106a220e290200370300200341b8026a41086a220f200441086a2210290200370300200320042902003703b802024020012009470d00200341b00a6a41106a2001410110930120032802c80a210120032802c00a21020b200220014105746a220220032903b802370000200241186a2006290300370000200241106a200d290300370000200241086a200f290300370000200341b00a6a41086a2202427f2002290300221520032903b00a22114280c0a8ca9a3a7c22132011542202ad7c221620022016201554201320115a1b22021b3703002003200141016a3602c80a2003427f201320021b3703b00a200341a00f6a41086a41073a0000200341b10f6a2010290000370000200341b90f6a200e290000370000200341c10f6a200729000037000020042900002111200341093a00a00f200341a00f6a41096a2011370000200341c90f6a20032903a005370000200341d10f6a200341a0056a41086a290300370000200341d90f6a200341a0056a41106a290300370000200341e10f6a200341a0056a41186a290300370000200341f80f6a4200370300200341f00f6a4280c0a8ca9a3a370300200341a00f6a108702200341043a0098020c1e0b20034198026a410110d5020c1c0b200341a0056a41186a2205200141196a290000370300200341a0056a41106a2206200141116a290000370300200341a0056a41086a2207200141096a290000370300200320012900013703a00520034198026a41026a200141276a2d00003a0000200341f8026a41086a200141386a290200370300200341f8026a41106a200141c0006a2902003703002003200141256a2f00003b0198022003200141306a2902003703f802200141246a2d00002104200141286a280200210d2001412c6a2802002101200341a00f6a41206a200241206a290200370300200341a00f6a41186a200241186a290200370300200341a00f6a41106a200241106a290200370300200341a00f6a41086a200241086a290200370300200320022902003703a00f200341e00c6a200341a00f6a10d60220034180086a41086a2202200341e00c6a41096a29000037030020034180086a41106a2208200341e00c6a41116a29000037030020034180086a41186a2209200341e00c6a41196a290000370300200320032900e10c37038008024020032d00e00c4101470d00200341023a0080120240200441ff01714101460d000c1c0b20010d180c190b200341b00a6a41186a2009290300370300200341b00a6a41106a2008290300370300200341b00a6a41086a200229030037030020032003290380083703b00a200341e00c6a41086a2007290300370300200341e00c6a41106a2006290300370300200341e00c6a41186a2005290300370300200320032903a0053703e00c200341a00f6a200341b00a6a10d702200341c8016a20032802a00f220520032802a80f41d4c0c7004100410010810220032802c8012102024020032802a40f450d00200510260b024020024101460d0020034180126a410610d5020c170b20034180086a200341e00c6a10bb02200341a00f6a200328028008220520032802880810de02200341b8026a41086a2206200341a00f6a41086a290300370300200341b8026a41106a2207200341a00f6a41106a290300370300200341b8026a41186a2208200341a00f6a41186a29030037030020034180026a41026a2209200341c30f6a2d00003a0000200341d8026a41086a220e200341d40f6a290200370300200341d8026a41106a220f200341dc0f6a290200370300200320032903a00f3703b802200320032f00c10f3b0180022003200341cc0f6a2902003703d8020240024020032d00c00f22024106460d00200341c80f6a2802002110200341c40f6a2802002112200341c8076a41186a2008290300370300200341c8076a41106a2007290300370300200341c8076a41086a2006290300370300200341f8016a41026a20092d00003a0000200341e8076a41086a200e290300370300200341e8076a41106a200f290300370300200320032903b8023703c807200320032f0180023b01f801200320032903d8023703e8070240200328028408450d00200510260b200341c10f6a20032f01f8013b0000200341c80f6a2010360200200341c40f6a2012360200200341cc0f6a20032903e807370200200341a00f6a41186a200341c8076a41186a290300370300200341a00f6a41106a200341c8076a41106a290300370300200341a00f6a41086a200341c8076a41086a290300370300200341c30f6a200341fa016a2d00003a0000200341d40f6a200341e8076a41086a290300370200200341dc0f6a200341e8076a41106a290300370200200320032903c8073703a00f200320023a00c00f200341a00f6a200341b00a6a412010d2062105024020024101470d002010450d00201210260b20050d01200341c10f6a20032f0198023b0000200341c80f6a2001360200200341c40f6a200d360200200341cc0f6a20032903f802370200200341a00f6a41186a200341b00a6a41186a290300370300200341a00f6a41106a200341b00a6a41106a290300370300200341a00f6a41086a200341b00a6a41086a290300370300200341c30f6a2003419a026a2d00003a0000200341d40f6a200341f8026a41086a290300370200200341dc0f6a200341f8026a41106a290300370200200320032903b00a3703a00f200320043a00c00f20034180086a200341e00c6a10bb022003280280082201200328028808200341a00f6a10df020240200328028408450d00200110260b024020032d00c00f4101470d0020032802c80f450d0020032802c40f10260b200341043a0080120c1b0b200328028408450d00200510260b20034180126a411010d5020c160b20034198026a41186a200141196a29000037030020034198026a41106a200141116a29000037030020034198026a41086a200141096a2900003703002003200129000137039802200341a00f6a41206a200241206a290200370300200341a00f6a41186a200241186a290200370300200341a00f6a41106a200241106a290200370300200341a00f6a41086a200241086a290200370300200320022902003703a00f200341e00c6a200341a00f6a10d60220034180086a41086a2201200341e00c6a41096a29000037030020034180086a41106a2202200341e00c6a41116a29000037030020034180086a41186a2204200341e00c6a41196a290000370300200320032900e10c3703800820032d00e00c4101460d0e200341e0116a41186a2004290300370300200341e0116a41106a2002290300370300200341e0116a41086a200129030037030020032003290380083703e011200341a00f6a200341e0116a10d702200341e0016a20032802a00f220220032802a80f41d4c0c7004100410010810220032802e0012101024020032802a40f450d00200210260b0240024020014101460d0020034188026a410610d5020c010b20034180126a41086a20034198026a41086a29030037030020034180126a41106a20034198026a41106a29030037030020034180126a41186a20034198026a41186a29030037030020032003290398023703801220034180086a20034180126a10bb02200341a00f6a200328028008220120032802880810de02200341b8026a41086a2202200341a00f6a41086a290300370300200341b8026a41106a2204200341a00f6a41106a290300370300200341b8026a41186a2205200341a00f6a41186a29030037030020034180026a41026a2206200341c30f6a2d00003a0000200341d8026a41086a2207200341d40f6a290200370300200341d8026a41106a2208200341dc0f6a290200370300200320032903a00f3703b802200320032f00c10f3b0180022003200341cc0f6a2902003703d802024002400240024020032d00c00f22094106460d00200341c80f6a280200210d200341c40f6a280200210e200341c8076a41186a2005290300370300200341c8076a41106a2004290300370300200341c8076a41086a2002290300370300200341f8016a41026a20062d00003a0000200341e8076a41086a2007290300370300200341e8076a41106a2008290300370300200320032903b8023703c807200320032f0180023b01f801200320032903d8023703e8070240200328028408450d00200110260b200341e00c6a410a6a200341c8076a41086a290300370100200341e00c6a41126a200341c8076a41106a290300370100200341e00c6a411a6a200341c8076a41186a290300370100200320032903c8073701e20c200341b00a6a41086a200341e00c6a41086a290100370300200341b00a6a41106a200341e00c6a41106a290100370300200341b00a6a41186a200341e00c6a41186a290100370300200341b00a6a41206a200341e00c6a41206a2f01003b0100200320032901e00c3703b00a200341f8026a41186a200341b00a6a411a6a290100370300200341f8026a41106a200341b00a6a41126a290100370300200341f8026a41086a200341b00a6a410a6a290100370300200320032901b20a3703f802024020094101470d00200d450d00200e10260b200341f8026a200341e0116a412010d2060d03200341a00f6a20034180126a10bb0220032802a00f220120032802a80f10ff01024020032802a40f450d00200110260b20034180086a41186a20034180126a41186a290300221137030020034180086a41106a20034180126a41106a290300221337030020034180086a41086a20034180126a41086a290300221537030020034180086a41286a200341e0116a41086a290300221637030020034180086a41306a200341e0116a41106a290300220c37030020034180086a41386a200341e0116a41186a290300220b3703002003200329038012220a37038008200320032903e01122233703a008200341b00a6a41386a2201200b370300200341b00a6a41306a2202200c370300200341b00a6a41286a22042016370300200341b00a6a41206a22062023370300200341b00a6a41186a22072011370300200341b00a6a41106a22082013370300200341b00a6a41086a220920153703002003200a3703b00a200341c8076a200341f8026a10dc02200341a00f6a20032802c807221b20032802d007221c10dd024200211520032802b00f221a0d01410021054101211a4200210b420021164200210c0c020b0240200328028408450d00200110260b20034188026a410f10d5020c030b20032902b40f221142ffffffff0f83210b2011422088a72105200341a00f6a41086a290300210c200341bc0f6a280200211d20032903a00f21160b200341e00c6a41386a2001290300370300200341e00c6a41306a2002290300370300200341e00c6a41286a2004290300370300200341e00c6a41206a2006290300370300200341e00c6a41186a2007290300370300200341e00c6a41106a2008290300370300200341e00c6a41086a2009290300370300200320032903b00a3703e00c02402005450d0041002102201a2101410021040340024002400240200341e00c6a2001460d002001200341e00c6a412010d206450d0020020d01410021020c020b200241016a21020c010b200420026b220620054f0d14200341a0056a41186a2207200120024105746b220641186a2208290000370300200341a0056a41106a2209200641106a220d290000370300200341a0056a41086a220e200641086a220f290000370300200320062900003703a005200141086a22102900002111200141106a22122900002113200141186a221429000021152006200129000037000020082015370000200d2013370000200f201137000020142007290300370000201220092903003700002010200e290300370000200120032903a0053700000b200141206a21012005200441016a2204470d000b2005200241002002417f6a2005491b6bad42208621150b200341d0016a200341800d6a20164280c0a8ca9a3a20164280c0a8ca9a3a544100200c501b22011b2211200c420020011b221310da02200341f80f6a2013370300200341f00f6a2011370300200341a00f6a41086a41083a0000200341b10f6a200341e00c6a41086a290300370000200341b90f6a200341f00c6a290300370000200341c10f6a200341f80c6a290300370000200341c90f6a20032903800d370000200341d10f6a200341880d6a290300370000200341d90f6a200341900d6a290300370000200341e10f6a200341980d6a290300370000200341093a00a00f200341a00f6a41096a20032903e00c370000200341a00f6a108702200341b40f6a2015200b843702002003200c20137d2016201154ad7d3703a80f2003201620117d3703a00f2003201d3602bc0f2003201a3602b00f201b201c200341a00f6a10e2020240200b42ffffff3f83500d00201a10260b024020032802cc07450d00201b10260b200341043a0088020c160b20034188026a411010d5020b20032d0088024104460d14200329028c0221110c130b200341a00f6a41206a200241206a290200370300200341a00f6a41186a200241186a290200370300200341a00f6a41106a200241106a290200370300200341a00f6a41086a200241086a290200370300200320022902003703a00f200341e00c6a200341a00f6a10d60220034180086a41086a2201200341e90c6a29000037030020034180086a41106a2202200341f10c6a29000037030020034180086a41186a2204200341f90c6a290000370300200320032900e10c37038008024002400240024020032d00e00c4101460d00200341f8026a41186a2004290300370300200341f8026a41106a2002290300370300200341f8026a41086a200129030037030020032003290380083703f80220034180086a200341f8026a10bb02200341a00f6a2003280280082201200328028808220410de02024020032d00c00f220541064622020d002001200410ff010b200341b8026a41086a2204200341a00f6a41086a290300370300200341b8026a41106a2206200341a00f6a41106a290300370300200341b8026a41186a2207200341a00f6a41186a29030037030020034180026a41026a2208200341c30f6a2d00003a0000200341d8026a41086a2209200341d40f6a290200370300200341d8026a41106a220d200341dc0f6a290200370300200320032903a00f3703b802200320032f00c10f3b0180022003200341cc0f6a2902003703d802024020020d00200341c80f6a280200210e200341c40f6a280200210f200341c8076a41186a2007290300370300200341c8076a41106a2006290300370300200341c8076a41086a2004290300370300200341f8016a41026a20082d00003a0000200341e8076a41086a2009290300370300200341e8076a41106a200d290300370300200320032903b8023703c807200320032f0180023b01f801200320032903d8023703e8070240200328028408450d00200110260b200341e00c6a410a6a200341c8076a41086a2201290300370100200341e00c6a41126a200341c8076a41106a2202290300370100200341e00c6a411a6a200341c8076a41186a2204290300370100200320032903c8073701e20c200341b00a6a41086a200341e00c6a41086a290100370300200341b00a6a41106a200341e00c6a41106a290100370300200341b00a6a41186a200341e00c6a41186a290100370300200341b00a6a41206a200341e00c6a41206a2f01003b0100200320032901e00c3703b00a20034180086a41186a200341b00a6a411a6a29010037030020034180086a41106a200341b00a6a41126a29010037030020034180086a41086a200341b00a6a410a6a290100370300200320032901b20a370380084101211b024020054101470d00200e450d00200f10260b2004200341f8026a41186a2903003703002002200341f8026a41106a2903003703002001200341f8026a41086a290300370300200320032903f8023703c80720034180126a20034180086a10dc02200341a00f6a20032802801220032802881210dd024200211520032802b00f22010d02410021064200210b420021164200210c0c030b0240200328028408450d00200110260b200341e0116a410f10d50220032d00e0114104460d0320032902e41121110c140b200341023a00e0110c130b20032902b40f221142ffffffff0f83210b2011422088a72106200341a80f6a290300210c200341bc0f6a280200211c20032903a00f21162001211b0b200341ec0c6a200341c8076a41086a290300370200200341e00c6a41146a200341c8076a41106a290300370200200341fc0c6a200341c8076a41186a290300370200200320032903c8073702e40c200320034180086a3602e00c200341e00c6a410472210502402006450d0041002102201b210141002104034002400240024020052001460d0020012005412010d206450d0020020d01410021020c020b200241016a21020c010b200420026b220720064f0d13200341a0056a41186a2208200120024105746b220741186a2209290000370300200341a0056a41106a220d200741106a220e290000370300200341a0056a41086a220f200741086a2210290000370300200320072900003703a005200141086a22122900002111200141106a22142900002113200141186a221a29000021152007200129000037000020092015370000200e201337000020102011370000201a20082903003700002014200d2903003700002012200f290300370000200120032903a0053700000b200141206a21012006200441016a2204470d000b2006200241002002417f6a2006491b6bad42208621150b200341a00f6a20032802e00c200520164280c0a8ca9a3a20164280c0a8ca9a3a544100200c501b22011b2211200c420020011b2213410010e00220032802e00c2101200341b00a6a41186a200541186a290000220a370300200341b00a6a41106a200541106a2900002223370300200341b00a6a41086a200541086a29000022243703002003200529000022253703b00a200341f80f6a2013370300200341f00f6a2011370300200341a00f6a41086a41093a0000200341a00f6a41096a2025370000200341b10f6a2024370000200341b90f6a2023370000200341c10f6a200a370000200341c90f6a2001290000370000200341d10f6a200141086a290000370000200341d90f6a200141106a290000370000200341e10f6a200141186a290000370000200341093a00a00f200341a00f6a108702200341a00f6a41146a2015200b843702002003200c20137d2016201154ad7d3703a80f2003201620117d3703a00f2003201c3602bc0f2003201b3602b00f2003280280122201200328028812200341a00f6a10e2020240200b42ffffff3f83500d00201b10260b0240200328028412450d00200110260b200341043a00e0110b4200211120004200370308200020032800a00f360019200041186a41003a00002000411c6a200341a30f6a2800003600000c110b200520074198e2c4001032000b200341a00f6a410110d50220032f00a10f20032d00a30f4110747221040c280b1034000b1033000b20022009103b000b200220094198cac1001032000b20012008103e000b410221010c1b0b410221010c190b410221010c170b20012008103b000b2001200841a8cac1001032000b20032d00a30f210120032f00a10f210e200320032902a40f37029c022003200d3a0098022003200e20014110747222013b009902200320014110763a009b020c0c0b200341023a0088020c040b200620054198e2c4001032000b200720064198e2c4001032000b20032802e011210120002011370024200041206a2001360000200041186a41003a000020004200370308420121110b200020113703000c1b0b200328028802210120002011370024200041206a2001360000200041186a41003a000020004200370308200042013703000c1a0b20004200370308200020032800e801360019200041186a41003a00002000411c6a200341eb016a280000360000200042003703000c190b200441ff01714101470d012001450d010b200d10260b20032d0080124104460d0020032902841221110c010b20004200370308200020032800e011360019200041186a41003a00002000411c6a200341e3116a280000360000200042003703000c150b200328028012210120002011370024200041206a2001360000200041186a41003a000020004200370308200042013703000c140b0240200441ff01714101470d002006450d00200710260b20032d0098024104470d010b200341a00f6a41186a200341b00a6a41186a290300370300200341a00f6a41106a200341b00a6a41106a2903002211370300200341a00f6a41086a200341b00a6a41086a290300370300200320032903b00a3703a00f024002402011a722010d002005200810ff010c010b20052008200341a00f6a10e202200341b40f6a28020041ffffff3f71450d00200110260b200341e8076a41086a20034198026a41086a28020036020020032003290398023703e8070c010b200341e8076a41086a20034198026a41086a28020036020020032003290398023703e807200941ffffff3f71450d00200210260b20032802dc02450d00200510260b20032d00e8074104460d0120032902ec0721110b20032802e807210120002011370024200041206a2001360000200041186a41003a000020004200370308200042013703000c0e0b200042003703082000200328008802360019200041186a41003a00002000411c6a2003418b026a280000360000200042003703000c0d0b200341840d6a3502002111200341a00f6a200341e00c6a41c00210cf061a200341b00a6a20034180126a10d70220032802b00a220120032802b80a200341a00f6a10db02024020032802b40a450d00200110260b2008ad21130240200341b40f6a28020041ffffff3f71450d0020032802b00f10260b200341a00f6a411c6a10c402200341a00f6a41086a41053a0000200341b10f6a20034180126a41086a290300370000200341b90f6a20034180126a41106a290300370000200341c10f6a20034180126a41186a290300370000200341cc0f6a2004360200200341093a00a00f200341a00f6a41096a200329038012370000200341a00f6a10870220032003280080023602f801200320034183026a2800003600fb01200041186a41003a0000200041106a201342e0a7127e201142a0e1e7007e7c42c0db89db007c37030020004201370308200020032802f8013600192000411c6a20032800fb01360000200042003703000c0c0b20032003280080083602a005200320034183086a2800003600a305200041186a41003a000020004200370308200020032802a0053600192000411c6a20032800a305360000200041246a2011370200200041206a2001360200200042013703000c0b0b200320032800a0053602f8022003200341a3056a2800003600fb02200041186a41003a000020004200370308200020032802f8023600192000411c6a20032800fb02360000200041246a2011370200200041206a2001360200200042013703000c0a0b20032003280080083602a005200320034183086a2800003600a305200041186a41003a000020004200370308200020032802a0053600192000411c6a20032800a305360000200041246a2011370200200041206a2001360200200042013703000c090b0240200341f40c6a28020041ffffff3f71450d00200810260b200341fc0c6a10c4020c010b20032902a40f211120032d00a00f21020b200328029c0241ffffff1f71450d00200410260b200320032800e807360288022003200341eb076a28000036008b02200041236a20014110763a0000200020013b0021200041186a41003a00002000420037030820002003280288023600192000411c6a200328008b0236000020002011370024200041206a20023a0000200042013703000c050b0240201642ffffff3f83500d00201910260b200320032800e011360298022003200341e3116a28000036009b02200041186a41003a0000200041106a20113703002000420137030820002003280298023600192000411c6a200328009b02360000200042003703000c040b200341a00f6a410210d50220032f00a10f20032d00a30f4110747221040b20032902a40f211120032d00a00f21050c010b201642ffffff3f83500d00201910260b02402007450d00200741c4006c2102201741286a210103400240200141786a2d00004101470d002001280200450d002001417c6a28020010260b200141c4006a2101200241bc7f6a22020d000b0b02402008450d00200841c4006c450d00201710260b200320032800e011360298022003200341e3116a28000036009b02200041236a20044110763a0000200020043b0021200041186a41003a00002000420037030820002003280298023600192000411c6a200328009b0236000020002011370024200041206a20053a0000200042013703000b200341a0126a24000b860301027f20002802242101024002400240024020002d000022020d0020002d0001210020012001280200417f6a2202360200024020020d002001280208200128020c2802001103000240200128020c280204450d00200128020810260b20012001280204417f6a220236020420020d00200110260b0240200041ff01710d0041000f0b411010242200450d03200041b889c70036020c200041013602082000428180808010370200411010242201450d03200141d089c70036020c20014101360208200142818080801037020020002000280200417f6a220236020020020d012000280208200028020c2802001103000240200028020c280204450d00200028020810260b20002000280204417f6a220236020420020d01200010260c010b4100210020024102460d010b20012001280200417f6a22023602004101210020020d002001280208200128020c2802001103000240200128020c280204450d00200128020810260b20012001280204417f6a220236020420020d00200110260b20000f0b102c000bb40b040c7f017e027f067e23004180036b22012400200141206a22024200370300200141186a22034200370300200141086a41086a420037030020014200370308200141086a41918dc700410810fb0120014198026a41a4a7c100410a10fb01200220014198026a41086a29000037030020032001290098023703002001412036022c2001200141086a360228200141306a200141086a412010820202400240200128023022040d00410021050c010b200128023421062001200141306a41086a280200360244200120043602402001200141c0006a108f010240024020012802000d0002400240024002402001280204220720012802444106762202200220074b1b22024106742203417f4c0d000240024020020d00410821050c010b200310242205450d020b41002108200141003602502001200236024c200120053602480240024002402007450d004100210903402001280244220a450d032001280240220b2d000021022001200a417f6a220c3602442001200b41016a360240200241014b0d034200210d0240024020020e020100010b41002102200141003a00b802417e210e0340200c2002460d0420014198026a20026a200b20026a220341016a2d00003a00002001200a200e6a3602442001200341026a3602402001200241016a22033a00b802200e417f6a210e2003210220034120470d000b200141e0026a41186a220220014198026a41186a290300370300200141e0026a41106a220e20014198026a41106a290300370300200141e0026a41086a220c20014198026a41086a29030037030020012001290398023703e002200341ff01714120490d04200141f8016a41086a220f200c290300370300200141f8016a41106a220c200e290300370300200141f8016a41186a220e2002290300370300200120012903e0023703f8012003417f73200a6a4110490d042001200b20036a220241116a220b3602402001200a20036b220a416f6a220336024420034108490d04200241096a2900002110200241016a2900002111200b290000210d2001200a41676a3602442001200241196a360240200d4280025a0d04200141b8016a41086a200f290300221237030020014198016a41186a200e29030037030020014198016a41106a200c29030037030020014198016a41086a2012370300200120012903f80122123703b8012001201237039801200d42ff018321134201210d0b200941016a2109200141f8006a41186a20014198016a41186a2903002212370300200141f8006a41106a20014198016a41106a2903002214370300200141f8006a41086a20014198016a41086a2903002215370300200141d8006a41086a22032015370300200141d8006a41106a220e2014370300200141d8006a41186a220a2012370300200120012903980122123703782001201237035802402008200128024c470d00200141c8006a200810f20120012802482105200128025021080b200520084106746a220220113703082002200d370300200241106a2010370300200241186a2013370300200241206a2001290358370300200241286a2003290300370300200241306a200e290300370300200241386a200a2903003703002001200841016a220836025020092007470d000b0b200129024c210d2005450d060c070b200241ff0171450d00200141003a00b8020b200128024c41ffffff1f710d020c030b1034000b1033000b200510260b0b41002105200141003602e802200142013703e0022001410e3602c4022001200141286a3602c0022001200141e0026a3602f801200141ac026a41013602002001420137029c022001418c8dc600360298022001200141c0026a3602a802200141f8016a41c4e1c00020014198026a10351a20012802e00220012802e80210840220012802e402450d0020012802e00210260b2006450d00200410260b0240024020050d0020004100360208200042083702000c010b2000200d370204200020053602000b20014180036a24000bd80301047f230041c0006b2202240041bfe3c0002103410f21044108210502400240024002400240024002400240024002400240024002400240024002400240200141ff01710e11000102030405060708090a0b0c0d0e0f10000b2002411c6a41013602002002420137020c200241dcedc6003602082002410436022420024190f6c6003602202002200241206a360218200241086a41ecc0c700103d000b41ade3c000210341122105410021040c0e0b41dab3c600210341012104410821050c0d0b41a5e3c000210341022104410821050c0c0b419be3c0002103410a2105410321040c0b0b4191e3c0002103410a2105410421040c0a0b4187e3c0002103410a2105410521040c090b41f8e2c0002103410f2105410621040c080b41eae2c0002103410e2105410721040c070b41dae2c000210341102105410821040c060b41cee2c0002103410c2105410921040c050b41c1e2c0002103410d2105410a21040c040b41b4e2c0002103410d2105410b21040c030b41a3e2c000210341112105410c21040c020b4195e2c0002103410e2105410d21040c010b418fe2c000210341062105410e21040b20004183263b0100200041086a2005360200200041046a2003360200200041026a20043a0000200241c0006a24000bb406030d7f017e037f230041306b220224002002200141026a2f01003b012e2002200141066a2f01003b012c20022001410a6a2f01003b012a200141046a2d00002103200141056a2d00002104200141086a2d00002105200141096a2d000021062001410c6a2d000021072001410d6a2d0000210820012d0001210920012d0000210a20022001410e6a2f01003b0128200141116a2d0000210b200141106a2d0000210c2002200141126a2f01003b0126200141156a2d0000210d200141146a2d0000210e2002200141166a2f01003b01242001411a6a290100210f200141196a2d00002110200141186a2d000021112001280224210120022f012e211202400240200a0d0020012001280200417f6a220a360200200220123b0122200220022f012c3b0120200220022f012a3b011e200220022f01283b011c200220022f01263b011a200220022f01243b01182002200f3703080240200a0d002001280208200128020c2802001103000240200128020c280204450d00200128020810260b20012001280204417f6a220a360204200a0d00200110260b0240200941ff01714101460d00200041013a00000c020b200020022f01223b0001200041046a20043a0000200041036a20033a0000200041086a20063a0000200041076a20053a0000200041056a20022f01203b00002000410c6a20083a00002000410b6a20073a0000200041096a20022f011e3b0000200041106a200b3a00002000410f6a200c3a00002000410d6a20022f011c3b0000200041146a200d3a0000200041136a200e3a0000200041116a20022f011a3b0000200041186a20103a0000200041176a20113a0000200041003a0000200041156a20022f01183b0000200041196a20022903083700000c010b200220123b0120200220022f012c3b011e200220022f012a3b011c200220022f01283b011a200220022f01263b01182002200f37020c200220103a000b200220113a000a200220022f01243b0108200041013a000020012001280200417f6a220036020020000d002001280208200128020c2802001103000240200128020c280204450d00200128020810260b20012001280204417f6a220036020420000d00200110260b200241306a24000b930401057f230041e0006b22022400200241086a41918dc700410810fb01200241186a41c4a5c100410a10fb0102400240412010242203450d002002422037023c20022003360238200241386a41004120106d20022802382203200228024022046a22052001290000370000200541086a200141086a290000370000200541106a200141106a290000370000200541186a200141186a2900003700002002200441206a2201360240200241c8006a2003200110a202200241dc006a200320016a360200200220033602582002200241c8006a41086a3602542002200241c8006a360250200241286a200241d0006a10730240200228023c450d00200310260b2002280230220341206a2205417f4c0d010240024020050d0041012101410021050c010b200510242201450d010b20002001360200200041086a220141003602002000200536020420004100411010c9012000280200200128020022056a220420022900083700002001200541106a2205360200200441086a200241086a41086a29000037000020002005411010c9012000280200200128020022056a220420022900183700002001200541106a2206360200200441086a200241186a41086a2900003700002002280228210520002006200310c9012000280200200128020022006a2005200310cf061a2001200020036a3602000240200228022c450d00200510260b200241e0006a24000f0b1033000b1034000bf341050b7f027e017f027e257f230041f0086b220324002003200236021c20032001360218200341206a2001200210820202400240200328022022040d00200041023a00a4020c010b200328022421052003200341206a41086a2802003602bc02200320043602b8022003200341b8026a3602e805200341106a200341e8056a10b2050240024020032802100d00410821060240024002400240024002400240200328021422074180012007418001491b2201450d00200141057410242206450d010b200341003602f807200320013602f407200320063602f00702402007450d0020034198086a41106a210820034198086a41046a2109200341a0086a210a410021020340200341003602980820034198086a20032802b802220b20032802bc022201410420014104491b220c10cf061a20032001200c6b22013602bc022003200b200c6a220b3602b802024020034198086a200c6a220d2009460d00200d41004104200c6b10d1061a0b200335029808210e200341003a00c80520012001410047220c490d07200341c8056a200b200c10cf061a20032001200c6b220d3602bc022003200b200c6a220c3602b80202400240024020010d004200210f0c010b20032d00c805220141064b0d094200210f02400240024002400240024020010e0707000102030405070b20034198086a200d4110200d4110491b22016a41004100411020016b22102001410f4b1b10d106210b20034198086a200c200110cf061a2003200d20016b3602bc022003200c20016a3602b8020240200b2008460d00200b4100201010d1061a0b200a290300211120032903980821124201210f0c060b4202210f0c040b4203210f0c030b4204210f0c020b4205210f0c010b4206210f0b0b0240200220032802f407470d00200341f0076a200210ed0120032802f007210620032802f80721020b200620024105746a2201200f3703082001200e370300200141186a2011370300200141106a20123703002003200241016a22023602f8072007417f6a22070d000b0b2006450d0620032902f407210f200341a0086a220c4200370300200342003703980820034198086a20032802b802220b20032802bc022202411020024110491b220110cf061a2003200220016b3602bc022003200b20016a3602b802024020014110460d0020034198086a20016a4100411020016b10d1061a0b200c29030021112003290398082112200341086a200341e8056a10b20520032802080d0402400240200328020c2209413820094138491b220d0d004104210c0c010b200d41c8006c1024220c450d010b41002102200341003602d0052003200d3602cc052003200c3602c80502402009450d00200341f0076a410c6a2107200341f0076a410172210d410021020340200341f0076a200341e8056a10cc02024020032d00f007220b4106470d00200341e8046a41026a20034188056a41026a2d00003a000020034180076a41086a200341c0076a41086a29030037030020034180076a41106a200341c0076a41106a290300370300200341d8066a41086a20034198076a41086a290300370300200341d8066a41106a20034198076a41106a290300370300200341d8066a41186a20034198076a41186a290300370300200341d8066a41206a20034198076a41206a280200360200200320032f0188053b01e804200320032903c0073703800720032003290398073703d8060c050b200341a8056a41026a220a200d41026a2d00003a0000200341d8076a41086a2210200741086a290200370300200341d8076a41106a2213200741106a2902003703002003200d2f00003b01a805200320072902003703d80720032802f407210820032802f807210120034198086a200341e8056a10cc020240024020032d0098084106470d000240200b4101470d002001450d00200810260b4106210b0c010b20034188056a41026a200a2d00003a0000200341c0076a41086a2010290300370300200341c0076a41106a201329030037030020034198076a41086a20034198086a41086a29030037030020034198076a41106a20034198086a41106a29030037030020034198076a41186a20034198086a41186a29030037030020034198076a41206a20034198086a41206a280200360200200320032f01a8053b018805200320032903d8073703c00720032003290398083703980720082114200121150b200341e8046a41026a220120034188056a41026a2d00003a000020034180076a41086a2208200341c0076a41086a29030037030020034180076a41106a220a200341c0076a41106a290300370300200341d8066a41086a221020034198076a41086a290300370300200341d8066a41106a221320034198076a41106a290300370300200341d8066a41186a221620034198076a41186a290300370300200341d8066a41206a221720034198076a41206a280200360200200320032f0188053b01e804200320032903c0073703800720032003290398073703d806200b4106460d04200341c8046a41026a221820012d00003a0000200341c0066a41086a22192008290300370300200341c0066a41106a2208200a29030037030020034198066a41086a220a201029030037030020034198066a41106a2210201329030037030020034198066a41186a2213201629030037030020034198066a41206a22162017280200360200200320032f01e8043b01c80420032003290380073703c006200320032903d806370398060240200220032802cc05470d00200341c8056a2002410110ef0120032802c805210c20032802d00521020b200c200241c8006c6a2201200b3a0000200141086a2015360000200141046a2014360000200141036a20182d00003a0000200120032f01c8043b0001200141146a20192903003700002001411c6a20082903003700002001410c6a20032903c006370000200141246a200329039806370000200141346a20102903003700002001412c6a200a2903003700002001413c6a2013290300370000200141c4006a20162802003600002003200241016a22023602d0052009417f6a22090d000b20032802cc05210d0b200c450d0420034198086a200341e8056a10cc020240024002400240024020032d00980822094106460d00200341ec056a41026a20032d009b083a000020034180076a41086a200341ac086a220129020037030020034180076a41106a200341b4086a220b290200370300200320032f0099083b01ec052003200341a4086a22072902003703800720034198086a41086a22132802002108200328029c08210a20034198086a200341e8056a10cc0220032d00980822104106460d01200341f0056a41026a20032d009b083a0000200341c0076a41086a2001290200370300200341c0076a41106a200b290200370300200320032f0099083b01f005200320072902003703c00720132802002113200328029c08211620034198086a200341e8056a10cc0220032d00980822174106460d02200341f4056a41026a20032d009b083a0000200341d8076a41086a200341ac086a2201290200370300200341d8076a41106a200341b4086a220b290200370300200320032f0099083b01f4052003200341a4086a22072902003703d80720034198086a41086a22152802002118200328029c08211920034198086a200341e8056a10cc0220032d00980822144106460d03200341f8056a41026a20032d009b083a000020034198066a41086a200129020037030020034198066a41106a200b290200370300200320032f0099083b01f805200320072902003703980620152802002115200328029c08211a20034198086a200341e8056a10cc0220032d009808221b4106470d04024020144101470d002015450d00201a10260b024020174101470d002018450d00201910260b024020104101470d002013450d00201610260b024020094101470d002008450d00200a10260b02402002450d00200c200241c8006c6a2102200c21010340024020012d00004101470d00200141086a280200450d00200141046a28020010260b0240200141246a2d00004101470d002001412c6a280200450d00200141286a28020010260b200141c8006a22012002470d000b0b200d450d09200d41c8006c0d080c090b02402002450d00200c200241c8006c6a2102200c21010340024020012d00004101470d00200141086a280200450d00200141046a28020010260b0240200141246a2d00004101470d002001412c6a280200450d00200141286a28020010260b200141c8006a22012002470d000b0b200d450d08200d41c8006c0d070c080b024020094101470d002008450d00200a10260b02402002450d00200c200241c8006c6a2102200c21010340024020012d00004101470d00200141086a280200450d00200141046a28020010260b0240200141246a2d00004101470d002001412c6a280200450d00200141286a28020010260b200141c8006a22012002470d000b0b200d450d07200d41c8006c0d060c070b024020104101470d002013450d00201610260b024020094101470d002008450d00200a10260b02402002450d00200c200241c8006c6a2102200c21010340024020012d00004101470d00200141086a280200450d00200141046a28020010260b0240200141246a2d00004101470d002001412c6a280200450d00200141286a28020010260b200141c8006a22012002470d000b0b200d450d06200d41c8006c0d050c060b024020174101470d002018450d00201910260b024020104101470d002013450d00201610260b024020094101470d002008450d00200a10260b02402002450d00200c200241c8006c6a2102200c21010340024020012d00004101470d00200141086a280200450d00200141046a28020010260b0240200141246a2d00004101470d002001412c6a280200450d00200141286a28020010260b200141c8006a22012002470d000b0b200d450d05200d41c8006c0d040c050b200341fe056a20032d009b083a0000200341d8066a41086a200341ac086a290200370300200341e8066a200341b4086a290200370300200320032f0099083b01fc052003200341a4086a2902003703d80620034198086a41086a280200211c200328029c08211d200341003a00c805024020032802bc02220120014100472207490d00200341c8056a20032802b802221e200710cf061a2003200120076b220b3602bc022003201e20076a221e3602b802024020010d00410021010c030b20032d00c805220741014b0d0041002101024020070e020300030b200341003a00ac084100210102400340200341003a00c805200b200b4100472207490d01200341c8056a201e200710cf061a2003200b20076b221f3602bc022003201e20076a221e3602b8020240200b0d00200341003a00c8050b20034198086a20016a20032d00c8053a00002003200141016a22013a00ac08201f210b20014114470d000b20034198076a41106a220120034198086a41106a28020036020020034198076a41086a220b20034198086a41086a2903003703002003200329039808220e3703f0072003200e37039807200341c0066a41106a2001280200360200200341c0066a41086a200b29030037030020032003290398073703c006410121010c030b0240200141ff0171450d00200341003a00ac080b20034198076a41086a200341f0076a41086a2903003703000b0240201b4101470d00201c450d00201d10260b024020144101470d002015450d00201a10260b024020174101470d002018450d00201910260b024020104101470d002013450d00201610260b024020094101470d002008450d00200a10260b02402002450d00200c200241c8006c6a2102200c21010340024020012d00004101470d00200141086a280200450d00200141046a28020010260b0240200141246a2d00004101470d002001412c6a280200450d00200141286a28020010260b200141c8006a22012002470d000b0b200d450d04200d41c8006c0d030c040b1033000b20034180066a41106a200341c0066a41106a28020036020020034180066a41086a200341c0066a41086a290300370300200320032903c0063703800620034198086a200341e8056a10cc020240024020032d009808221e4106460d0020034194066a41026a220b20032d009b083a000020034198076a41086a200341ac086a29020037030020034198076a41106a200341b4086a290200370300200320032f0099083b0194062003200341a4086a2902003703980720034198086a41086a280200211f200328029c08212020034198086a200341e8056a10cc0220032d0098084106470d010240201e4101470d00201f450d00202010260b0240201b4101470d00201c450d00201d10260b024020144101470d002015450d00201a10260b024020174101470d002018450d00201910260b024020104101470d002013450d00201610260b024020094101470d002008450d00200a10260b02402002450d00200c200241c8006c6a2102200c21010340024020012d00004101470d00200141086a280200450d00200141046a28020010260b0240200141246a2d00004101470d002001412c6a280200450d00200141286a28020010260b200141c8006a22012002470d000b0b200d450d04200d41c8006c0d030c040b0240201b4101470d00201c450d00201d10260b024020144101470d002015450d00201a10260b024020174101470d002018450d00201910260b024020104101470d002013450d00201610260b024020094101470d002008450d00200a10260b02402002450d00200c200241c8006c6a2102200c21010340024020012d00004101470d00200141086a280200450d00200141046a28020010260b0240200141246a2d00004101470d002001412c6a280200450d00200141286a28020010260b200141c8006a22012002470d000b0b200d450d03200d41c8006c450d030c020b200341f0076a41206a20034198086a41206a280200360200200341f0076a41186a20034198086a41186a290300370300200341f0076a41106a20034198086a41106a2207290300370300200341f0076a41086a20034198086a41086a2221290300370300200341e4056a41026a200341ec056a41026a2d00003a0000200341c0066a41086a20034180076a41086a290300370300200341c0066a41106a20034180076a41106a29030037030020032003290398083703f007200320032f01ec053b01e40520032003290380073703c006200341e0056a41026a200341f0056a41026a2d00003a0000200320032f01f0053b01e005200341c8056a41106a200341c0076a41106a290300370300200341c8056a41086a200341c0076a41086a290300370300200320032903c0073703c805200341c4056a41026a200341f4056a41026a2d00003a0000200320032f01f4053b01c405200341a8056a41106a200341d8076a41106a290300370300200341a8056a41086a200341d8076a41086a290300370300200320032903d8073703a805200341a4056a41026a200341f8056a41026a2d00003a0000200320032f01f8053b01a40520034188056a41106a20034198066a41106a29030037030020034188056a41086a20034198066a41086a29030037030020032003290398063703880520034184056a41026a200341fc056a41026a2d00003a0000200320032f01fc053b018405200341e8046a41106a200341d8066a41106a290300370300200341e8046a41086a200341d8066a41086a290300370300200320032903d8063703e804200720034180066a41106a280200360200202120034180066a41086a290300370300200320032903800637039808200341e4046a41026a200b2d00003a0000200320032f0194063b01e404200341c8046a41106a20034198076a41106a290300370300200341c8046a41086a20034198076a41086a29030037030020032003290398073703c8040c050b02402002450d00200c200241c8006c6a2102200c21010340024020012d00004101470d00200141086a280200450d00200141046a28020010260b0240200141246a2d00004101470d002001412c6a280200450d00200141286a28020010260b200141c8006a22012002470d000b0b20032802cc052201450d01200141c8006c450d010b200c10260b200f42ffffff3f83500d0120061026410221010c020b20032802f40741ffffff3f71450d0020061026410221010c010b410221010b200341c4046a41026a200341e4056a41026a2d00003a0000200341a8046a41086a200341c0066a41086a290300370300200341a8046a41106a2221200341c0066a41106a290300370300200341a4046a41026a200341e0056a41026a2d00003a000020034188046a41086a200341c8056a41086a29030037030020034188046a41106a2222200341c8056a41106a290300370300200320032f01e4053b01c404200320032903c0063703a804200320032f01e0053b01a404200320032903c8053703880420034184046a41026a200341c4056a41026a2d00003a0000200341e8036a41086a200341a8056a41086a290300370300200341e8036a41106a2223200341a8056a41106a290300370300200341e4036a41026a200341a4056a41026a2d00003a0000200341c8036a41086a20034188056a41086a290300370300200341c8036a41106a222420034188056a41106a290300370300200320032f01c4053b018404200320032903a8053703e803200320032f01a4053b01e40320032003290388053703c803200341c4036a41026a20034184056a41026a2d00003a0000200341a8036a41106a2225200341e8046a41106a290300370300200341a8036a41086a200341e8046a41086a290300370300200341a4036a41026a200341e4046a41026a2d00003a000020034188036a41106a2226200341c8046a41106a29030037030020034188036a41086a200341c8046a41086a290300370300200320032f0184053b01c403200320032903e8043703a803200320032f01e4043b01a403200320032903c80437038803200341e0026a41206a2227200341f0076a41206a280200360200200341e0026a41186a2228200341f0076a41186a290300370300200341e0026a41106a2229200341f0076a41106a290300370300200341e0026a41086a200341f0076a41086a290300370300200320032903f0073703e002200341c0026a41176a20034198086a41176a220b280000360000200341c0026a41106a20034198086a41106a2207290300370300200341c0026a41086a20034198086a41086a29030037030020032003290398083703c0020240024020014102470d00200341003602f807200342013703f0072003410e36029c072003200341186a360298072003200341f0076a3602d806200341ac086a41013602002003420137029c082003418c8dc60036029808200320034198076a3602a808200341d8066a41c4e1c00020034198086a10351a20032802f00720032802f80710840220032802f407450d0120032802f00710260c010b200341b4026a41026a222a200341c4046a41026a2d00003a000020034198026a41086a222b200341a8046a41086a29030037030020034198026a41106a222c202129030037030020034194026a41026a2221200341a4046a41026a2d00003a0000200341f8016a41086a222d20034188046a41086a290300370300200341f8016a41106a222e2022290300370300200320032f01c4043b01b402200320032903a80437039802200320032f01a4043b01940220032003290388043703f801200341f4016a41026a222220034184046a41026a2d00003a0000200341d8016a41086a222f200341e8036a41086a290300370300200341d8016a41106a22302023290300370300200341d4016a41026a2223200341e4036a41026a2d00003a0000200341b8016a41086a2231200341c8036a41086a290300370300200341b8016a41106a22322024290300370300200320032f0184043b01f401200320032903e8033703d801200320032f01e4033b01d401200320032903c8033703b801200341b4016a41026a2224200341c4036a41026a2d00003a000020034198016a41106a2233202529030037030020034198016a41086a2225200341a8036a41086a29030037030020034194016a41026a2234200341a4036a41026a2d00003a0000200341f8006a41106a22352026290300370300200341f8006a41086a222620034188036a41086a290300370300200320032f01c4033b01b401200320032903a80337039801200320032f01a4033b0194012003200329038803370378200341d0006a41206a22362027280200360200200341d0006a41186a22272028290300370300200341d0006a41106a22282029290300370300200341d0006a41086a2229200341e0026a41086a290300370300200320032903e002370350200341306a410f6a200341c0026a410f6a290000370000200341306a41086a2237200341c0026a41086a290300370300200320032903c0023703302000201137030820002012370300200020093a0028200020023602242000200d3602202000200c36021c2000200f37021420002006360210200020083602302000200a36022c200020032f01b4023b00292000412b6a202a2d00003a000020002003290398023702342000413c6a202b290300370200200041c4006a202c290300370200200020103a004c200041cf006a20212d00003a0000200020032f0194023b004d2000201336025420002016360250200041e8006a202e290300370200200041e0006a202d290300370200200020032903f801370258200020173a0070200041f3006a20222d00003a0000200020032f01f4013b007120002018360278200020193602742000418c016a203029030037020020004184016a202f290300370200200020032903d80137027c200020143a00940120004197016a20232d00003a0000200020032f01d4013b0095012000201536029c012000201a36029801200041b0016a2032290300370200200041a8016a2031290300370200200020032903b8013702a0012000201b3a00b801200041bb016a20242d00003a0000200020032f01b4013b00b9012000201c3602c0012000201d3602bc01200041d4016a2033290300370200200041cc016a202529030037020020002003290398013702c4012000201e3a00dc01200041df016a20342d00003a0000200020032f0194013b00dd012000201f3602e401200020203602e001200041f8016a2035290300370200200041f0016a2026290300370200200020032903783702e801200041a0026a203628020036020020004198026a202729030037020020004190026a202829030037020020004188026a20292903003702002000200329035037028002200b200341306a41176a2800003600002007200341306a41106a29030037030020034198086a41086a220220372903003703002003200329033037039808200041bc026a200b280000360000200041b5026a2007290300370000200041ad026a200229030037000020002003290398083700a5020b200020013a00a4022005450d00200410260b200341f0086a24000ba11007037f027e037f097e037f027e027f230041d0026b2204240002400240024002400240024002402002200384500d00200441186a200110d803200441286a200428021822052004280220220610d903200429032821074200210820044200370328200441f0006a280200210920042d0074210a024002402007420152220b450d004200210c4200210d4200210e4200210f4200211042002111420021120c010b200441e0006a290300210d200441d8006a290300210c200441d0006a2903002108200441c8006a2903002110200441c0006a290300210f2004290338211220042903302111200441e8006a290300210e0b201120027d2213201156201220037d2011200254ad7d221420125620142012511b0d0102400240200f20027c2212200f542215201020037c2015ad7c221120105420112010511b0d0020044188016a200110d803200441d0016a200428028801221620042802900110d90320044180026a290300420020042903d00142015122151b2110200441f8016a290300420020151b210f0240200428028c01450d00201610260b0240200f201356201020145620102014511b0d00200441043a00780c060b200441f8006a410210eb022012210f201121100c010b200441f8006a410310eb020b20132111201421120c020b200041043a00000c050b200441f8006a410410eb020b20042d00784104470d01201121132012211420102111200f21120b200441b0016a2216200c370300200441a0016a2011370300200441b8016a2217200d370300200420083703a80120042012370398012004201337038801200420143703900102400240427f201320127c221020102013542215201420117c2015ad7c221020145420102014511b22151b220f4280c8afa025544100427f201020151b2210501b0d0020044198016a2903002111201729030021122016290300210f200441a8016a2903002108200429039001210c200429038801210d4201211820042903a00121190c010b02400240201320128420142011848450450d00420021180c010b42002118200441d0016a41186a22164200370300200441d0016a41106a22174200370300200441d0016a41086a22154200370300200442003703d001200441c0016a419a8cc700410810fb012015200441c0016a41086a221a290000370300200420042900c0013703d001200441c0016a41b8a1c300410d10fb012016201a290000370300201720042900c0013703002004200441d0016a108d02200441106a2903002111200429030821122004280200211b201642003703002017420037030020154200370300200442003703d001200441c0016a419a8cc700410810fb012015201a290000370300200420042900c0013703d001200441c0016a41b8a1c300410d10fb012016201a290000370300201720042900c0013703002004420020114200201b1b221120107d20124200201b1b2212200f54ad7d22082012200f7d220c201256200820115620082011511b22161b3703c80120044200200c20161b3703c001200441d0016a4120200441c0016a411010b30120044188026a201037030020044180026a200f370300201541013a0000200441d9016a2001290000370000200441e1016a200141086a290000370000200441e9016a200141106a290000370000200441f1016a200141186a290000370000200441023a00d001200441d0016a1087020b0b20074201512115200bad2110200441d0006a2008370300200441e8006a200e370300200441d8006a200f370300200441386a200c370300200441e0006a2012370300200441c0006a2011370300200420193703482004200d3703304100210b2004200a4100200742015122161b3a007420042009410020161b360270200420184201512209ad3703280240024020090d002005200610ff01420021072013211120142112410021090c010b20052006200441306a10da03420021074101210920132111201421120b0c010b200429027c22144280807c8321072014420888a72109200428027821062014a721154101210b0b0240200428021c450d00200510260b0240024002400240200b0d000240200941ff01712206450d00201541ff0171450d020b20060d02201541ff0171450d02200441d0016a41086a41043a0000200441d9016a2001290000370000200441e1016a200141086a290000370000200441e9016a200141106a290000370000200441f1016a200141186a290000370000200441003a00d001200441d0016a1087020c020b200641ff01714104460d02200020063a0000200041036a20064118763a0000200020064108763b0001200041046a2009ad42ff01834208862015ad42ff0183842007843700000c030b200441d0016a41086a41033a0000200441d9016a2001290000370000200441e1016a200141086a290000370000200441e9016a200141106a290000370000200441f1016a200141186a290000370000200441003a00d001200441d0016a1087020b20104201520d0020044188026a201237030020044180026a2011370300200441d0016a41086a41003a0000200441d9016a2001290000370000200441e1016a200141086a290000370000200441e9016a200141106a290000370000200441f1016a200141186a290000370000200441023a00d001200441d0016a1087020b20044188026a200337030020044180026a2002370300200441d0016a41086a41053a0000200441d9016a2001290000370000200441e1016a200141086a290000370000200441e9016a200141106a290000370000200441f1016a200141186a290000370000200441023a00d001200441d0016a108702200041043a00000b200441d0026a24000bf70d07037f027e027f097e017f037e047f230041c0026b2204240002400240200220038450450d0042002102420021030c010b200441186a200110d803200441286a200428021822052004280220220610d903200429032821074200210820044200370328200441f0006a280200210920042d0074210a0240024020074201510d004200210b4200210c4200210d4200210e4200210f420021104200211142002112420021130c010b200441e0006a290300210c200441286a41306a290300210b200441286a41286a2903002108200441c8006a2903002111200441286a41186a290300210e2004290338211320042903302112200441e8006a290300210d4200210f420021100b200441f8006a41286a200b370300200441f8006a41306a200c370300200441f8006a41186a2011200f84220b2003200b2010200e84220c200256200b200356200b2003511b22141b220e7d200c2002200c20141b220b54ad7d220f37030020042008370398012004200c200b7d2208370388012004427f2013200e7c2012200b7c22102012542214ad7c220c2014200c201354200c2013511b22141b2213370380012004427f201020141b220c37037802400240427f200c20087c22122012200c5422142013200f7c2014ad7c221220135420122013511b22141b22104280c8afa025544100427f201220141b2211501b0d0020044188016a2903002108200441a8016a290300210f200441a0016a290300211020044198016a29030021112004290380012115200429037821164201211220042903900121170c010b02400240200c2008842013200f848450450d00420021120c010b42002112200441c0016a41186a22184200370300200441c0016a41106a22194200370300200441c0016a41086a22144200370300200442003703c001200441b0016a419a8cc700410810fb012014200441b0016a41086a221a290000370300200420042900b0013703c001200441b0016a41b8a1c300410d10fb012018201a290000370300201920042900b0013703002004200441c0016a108d02200441106a29030021082004290308210f2004280200211b201842003703002019420037030020144200370300200442003703c001200441b0016a419a8cc700410810fb012014201a290000370300200420042900b0013703c001200441b0016a41b8a1c300410d10fb012018201a290000370300201920042900b0013703002004420020084200201b1b220820117d200f4200201b1b220f201054ad7d2215200f20107d2216200f56201520085620152008511b22181b3703b80120044200201620181b3703b001200441c0016a4120200441b0016a411010b301200441f8016a2011370300200441f0016a2010370300201441013a0000200441c9016a2001290000370000200441d1016a200141086a290000370000200441d9016a200141106a290000370000200441e1016a200141186a290000370000200441023a00c001200441c0016a1087020b0b200441d0006a2011370300200441e8006a200d370300200441d8006a2010370300200441386a2015370300200441e0006a200f370300200441c0006a200837030020042017370348200420163703302004200a4100200742015122141b3a007420042009410020141b360270200420124201512209ad3703280240024020090d002005200610ff010c010b20052006200441306a10da030b0240200428021c450d00200510260b20124201522105024002400240200742015122060d002005450d010b2006200571450d01200441c0016a41086a41043a0000200441c9016a2001290000370000200441d1016a200141086a290000370000200441d9016a200141106a290000370000200441e1016a200141186a290000370000200441003a00c001200441c0016a1087020c010b200441c0016a41086a41033a0000200441c9016a2001290000370000200441d1016a200141086a290000370000200441d9016a200141106a290000370000200441e1016a200141186a290000370000200441003a00c001200441c0016a1087020b024020074201510d00200441f8016a2013370300200441f0016a200c370300200441c0016a41086a41003a0000200441c9016a2001290000370000200441d1016a200141086a290000370000200441d9016a200141106a290000370000200441e1016a200141186a290000370000200441023a00c001200441c0016a1087020b200441f8016a200e370300200441f0016a200b370300200441c0016a41086a41063a0000200441c9016a2001290000370000200441d1016a200141086a290000370000200441d9016a200141106a290000370000200441e1016a200141186a290000370000200441023a00c0012003200e7d2002200b54ad7d21032002200b7d2102200441c0016a1087020b2000200237030020002003370308200441c0026a24000b800202057f027e230041106b220324002003410036020820034201370300200228021021042003200241186a280200220510a10102402005450d00200420054105746a2106034020042802002105200320032802084104106d2003280200200328020822076a20053600002003200741046a360208200441086a200310cb022006200441206a2204470d000b0b200241086a290300210820022903002109200320032802084110106d2003280200200328020822046a22052008370008200520093700002003200441106a36020820032002411c6a10a9012000200120032802002204200328020810b30102402003280204450d00200410260b200341106a24000b930401057f230041e0006b22022400200241086a41918dc700410810fb01200241186a41c4a6c100410610fb0102400240412010242203450d002002422037023c20022003360238200241386a41004120106d20022802382203200228024022046a22052001290000370000200541086a200141086a290000370000200541106a200141106a290000370000200541186a200141186a2900003700002002200441206a2201360240200241c8006a2003200110a202200241dc006a200320016a360200200220033602582002200241c8006a41086a3602542002200241c8006a360250200241286a200241d0006a10730240200228023c450d00200310260b2002280230220341206a2205417f4c0d010240024020050d0041012101410021050c010b200510242201450d010b20002001360200200041086a220141003602002000200536020420004100411010c9012000280200200128020022056a220420022900083700002001200541106a2205360200200441086a200241086a41086a29000037000020002005411010c9012000280200200128020022056a220420022900183700002001200541106a2206360200200441086a200241186a41086a2900003700002002280228210520002006200310c9012000280200200128020022006a2005200310cf061a2001200020036a3602000240200228022c450d00200510260b200241e0006a24000f0b1033000b1034000beb0202027f037e230041e0006b220324002003200236020c20032001360208200341106a2001200210820202400240200328021022010d00200041003602100c010b200328021421042003200341106a41086a2802002202360224200320013602200240024020024110490d002003200241706a3602242003200141106a360220200141086a290000210520012900002106200341c8006a200341206a10920120032802482202450d00200329024c2107200020053703082000200637030020002007370214200020023602100c010b20034100360230200342013703282003410e36023c2003200341086a3602382003200341286a360244200341dc006a41013602002003420137024c2003418c8dc6003602482003200341386a360258200341c4006a41c4e1c000200341c8006a10351a200328022820032802301084020240200328022c450d00200328022810260b200041003602100b2004450d00200110260b200341e0006a24000bbd07010a7f23004180026b220324002003200236020c20032001360208200341106a2001200210820202400240200328021022040d00200041063a00200c010b200328021421052003200341186a280200220636029401200320043602900141002101200341003a00d801024002400240034020062001460d01200341b8016a20016a200420016a22022d00003a00002003200241016a360290012003200141016a22023a00d8012002210120024120470d000b2003200620026b36029401200341206a41186a2201200341b8016a41186a290300370300200341206a41106a2206200341b8016a41106a290300370300200341206a41086a2207200341b8016a41086a290300370300200320032903b801370320200241ff01714120490d0120034198016a41086a200729030037030020034198016a41106a200629030037030020034198016a41186a20012903003703002003200329032037039801200341b8016a20034190016a10cf0220032d00b80122014106460d01200341f0006a41186a220220034198016a41186a290300370300200341f0006a41106a220620034198016a41106a290300370300200341f0006a41086a220720034198016a41086a290300370300200341c8006a41086a2208200341c1016a290000370300200341c8006a41106a2209200341c9016a290000370300200341c8006a41186a220a200341d1016a290000370300200341c8006a411f6a220b200341d8016a2800003600002003200329039801370370200320032900b901370348200341206a411f6a220c200b280000360000200341206a41186a220b200a290300370300200341206a41106a220a2009290300370300200341206a41086a22092008290300370300200041186a2002290300370200200041106a2006290300370200200041086a20072903003702002000200329037037020020032003290348370320200041c0006a200c280000360000200041396a200b290300370000200041316a200a290300370000200041296a2009290300370000200020032903203700210c020b2003410036029401200141ff0171450d00200341003a00d8010b20034100360250200342013703482003410e3602242003200341086a3602202003200341c8006a3602e001200341cc016a4101360200200342013702bc012003418c8dc6003602b8012003200341206a3602c801200341e0016a41c4e1c000200341b8016a10351a200328024820032802501084020240200328024c450d00200328024810260b410621010b200020013a00202005450d00200410260b20034180026a24000bea0101047f230041206b220324002003410036020820034201370300200341004120106d2003280200200328020822046a22052002290000370000200541086a200241086a290000370000200541106a200241106a290000370000200541186a200241186a2900003700002003200441206a2204360208200341106a200241206a108501200328021021052003200420032802182202106d20032802002204200328020822066a2005200210cf061a2003200620026a220236020802402003280214450d00200510260b200020012004200210b30102402003280204450d00200410260b200341206a24000bb5230d037f027e037f077e057f037e017f027e017f017e017f017e027f230041b0046b2206240002400240024002400240024002400240024002402003200484500d0020012002460d0520012002412010d206450d05200641c8006a200210d803200641d8006a200628024822072006280250220810d903200629035821094200210a20064200370358200641d8006a41c8006a280200210b20062d00a401210c2009420152220d0d03200641d8006a41386a290300210e200641d8006a41306a290300210f200641d8006a41206a2903002110200641d8006a41186a290300211120064198016a29030021122006290368211320062903602114200641a8016a41206a200641d8006a41286a290300370300200641a8016a41286a200f370300200641a8016a41306a200e370300200641b8016a2011370300200620103703c001200620123703e001200620143703a801200620133703b0012006200641a8016a3602840220064188026a200110d80320064198026a2006280288022215200628029002221610d9032006290398022110200642003703980220064198026a41c8006a280200211720062d00e402211820104201522219450d014200210e42002111420021144200211a4200211b4200211c420021134200210f0c020b20004100360200200041106a4200370300200041086a42003703000c080b20064198026a41386a290300211c20064198026a41306a290300211b20064198026a41286a290300211a20064198026a41206a290300210e20064198026a41186a290300211120062903a802210f20062903a0022113200641d8026a29030021144200210a0b2004200a200e84220e2011200a842211200356200e200456200e2004511b221d1b211220032011201d1b210a024002400240024002400240024002402005450d0020062903b801221e200a7c221f201e54221d200641c0016a2220290300221e20127c201dad7c2221201e542021201e511b0d03202020213703002006201f3703b8010c010b20062903a801221e200a7c221f201e54221d200641b0016a290300221e20127c201dad7c2221201e542021201e511b0d012006201f3703a801200620213703b0010b20064190036a2220201b37030020064198036a2222201c37030020064180036a200e20127d2011200a54ad7d221b3703002006201a3703880320062011200a7d22113703f802200620133703e8022006200f3703f002427f201320117c220e200e201354221d200f201b7c201dad7c220e200f54200e200f511b221d1b221a4280c8afa025544100427f200e201d1b220e501b0d03200641f8026a29030021112022290300211a2020290300211b20064188036a290300211c20062903f002211e20062903e80221214201211f20062903800321230c040b200641b0036a410310eb020c010b200641b0036a410310eb020b20062802b003211720062902b403220e4280807c832110200e420888a72116200ea7211d410121190c020b024002402013201184200f201b848450450d004200211f0c010b4200211f200641b0036a41186a22204200370300200641b0036a41106a22224200370300200641b0036a41086a221d4200370300200642003703b003200641a0036a419a8cc700410810fb01201d200641a0036a41086a2224290000370300200620062900a0033703b003200641a0036a41b8a1c300410d10fb0120202024290000370300202220062900a003370300200641306a200641b0036a108d02200641306a41106a29030021112006290338211b200628023021252020420037030020224200370300201d4200370300200642003703b003200641a0036a419a8cc700410810fb01201d2024290000370300200620062900a0033703b003200641a0036a41b8a1c300410d10fb0120202024290000370300202220062900a003370300200642002011420020251b2211200e7d201b420020251b221b201a54ad7d221c201b201a7d221e201b56201c201156201c2011511b22201b3703a80320064200201e20201b3703a003200641b0036a4120200641a0036a411010b301200641e8036a200e370300200641e0036a201a370300201d41013a0000200641b9036a2001290000370000200641c1036a200141086a290000370000200641c9036a200141106a290000370000200641d1036a200141186a290000370000200641023a00b003200641b0036a1087020b0b2010420151211d2019ad210e200641c0026a201c370300200641d8026a2014370300200641c8026a201b370300200641a8026a201e370300200641d0026a201a370300200641b0026a2011370300200620233703b802200620213703a00241002119200620184100201042015122201b3a00e40220062017410020201b3602e0022006201f4201512217ad370398020240024020170d002015201610ff0142002110410021160c010b20152016200641a0026a10da0342002110410121160b0b0240200628028c02450d00201510260b02400240024020190d000240201641ff01712215450d00201d41ff0171450d020b20150d02201d41ff0171450d02200641b0036a41086a41043a0000200641b9036a2001290000370000200641c1036a200141086a290000370000200641c9036a200141106a290000370000200641d1036a200141186a290000370000200641003a00b003200641b0036a1087020c020b200641f0016a2016ad42ff0183420886201dad42ff018384201084370300200620173602ec0141012115200641013602e8010c030b200641b0036a41086a41033a0000200641b9036a2001290000370000200641c1036a200141086a290000370000200641c9036a200141106a290000370000200641d1036a200141186a290000370000200641003a00b003200641b0036a1087020b0240200e4201520d00200641e8036a200f370300200641e0036a2013370300200641b0036a41086a41003a0000200641b9036a2001290000370000200641c1036a200141086a290000370000200641c9036a200141106a290000370000200641d1036a200141186a290000370000200641023a00b003200641b0036a1087020b200641f8016a2012370300200641f0016a200a37030041002115200641003602e8010c010b200641a8016a41386a4200370300200641a8016a41306a4200370300200641a8016a41286a4200370300200641c8016a4200370300200641a8016a41186a4200370300200641b8016a4200370300200641a8016a41086a4200370300200642003703a8012006200641a8016a36028402200641b0036a410810eb02200641f4016a200641b0036a41086a28020036020041012115200641013602e801200620062903b0033702ec010b200641e8026a41086a221d200641a8016a41186a290300370300200641e8026a41106a2219200641a8016a41206a290300370300200641e8026a41186a2216200641a8016a41286a290300370300200641e8026a41206a2217200641a8016a41306a290300370300200620062903b8013703e802200641a8016a41086a290300210a20062903a801210e024002402015450d00200641e8016a41086a29030022094280807c8321122009420888a7210b20062802ec01210c2009a721154101210d0c010b200641e0016a2903002114200641e8016a41106a2903002110200641e8016a41086a290300210f20064198026a41186a201d290300221237030020064198026a41206a201929030037030020064198026a41286a201629030037030020064198026a41306a2017290300370300200620062903e80222133703a8022006200e370398022006200a3703a00202400240427f200e20137c22112011200e542215200a20127c2015ad7c2211200a542011200a511b22151b221a4280c8afa025544100427f201120151b2211501b0d00200641a8026a2903002112200641c8026a2903002113200641c0026a290300211a200641b8026a290300211b20062903a002211c200629039802211e4201211f20062903b00221210c010b02400240200e201384200a2012848450450d004200211f0c010b4200211f200641b0036a41186a221d4200370300200641b0036a41106a22194200370300200641b0036a41086a22154200370300200642003703b003200641a0036a419a8cc700410810fb012015200641a0036a41086a2216290000370300200620062900a0033703b003200641a0036a41b8a1c300410d10fb01201d2016290000370300201920062900a003370300200641186a200641b0036a108d02200641186a41106a29030021122006290320211320062802182117201d42003703002019420037030020154200370300200642003703b003200641a0036a419a8cc700410810fb0120152016290000370300200620062900a0033703b003200641a0036a41b8a1c300410d10fb01201d2016290000370300201920062900a003370300200642002012420020171b221220117d2013420020171b2213201a54ad7d221b2013201a7d221c201356201b201256201b2012511b221d1b3703a80320064200201c201d1b3703a003200641b0036a4120200641a0036a411010b301200641e8036a2011370300200641e0036a201a370300201541013a0000200641b9036a2002290000370000200641c1036a200241086a290000370000200641c9036a200241106a290000370000200641d1036a200241186a290000370000200641023a00b003200641b0036a1087020b0b20094201512115200dad211120064180016a201b37030020064188016a201a370300200641e8006a201c37030020064190016a2013370300200641f0006a20123703002006202137037820062014370398012006201e3703604100210d2006200c41002009420151221d1b3a00a4012006200b4100201d1b3602a0012006201f420151220bad37035802400240200b0d002007200810ff01420021124100210b0c010b20072008200641e0006a10da03420021124101210b0b0b0240200628024c450d00200710260b200d0d010240200b41ff01712207450d00201541ff0171450d030b20070d03201541ff0171450d03200641b0036a41086a41043a0000200641b9036a2002290000370000200641c1036a200241086a290000370000200641c9036a200241106a290000370000200641d1036a200241186a290000370000200641003a00b003200641b0036a1087020c030b02402005450d0020064198026a200110d803200641b0036a200628029802220120062802a00210d903200641d0036a290300420020062903b00342015122021b2109200641c8036a290300420020021b210a0240200628029c02450d00200110260b20004100360200200041106a4200200420097d2003200a54ad7d22092003200a7d220a200356200920045620092004511b22021b370300200041086a4200200a20021b3703000c040b200641086a20012003200410da0220062903082103200041106a200641086a41086a290300370300200041086a2003370300200041003602000c030b2000200c36020420004101360200200041086a200bad42ff01834208862015ad42ff0183842012843702000c020b200641b0036a41086a41033a0000200641b9036a2002290000370000200641c1036a200241086a290000370000200641c9036a200241106a290000370000200641d1036a200241186a290000370000200641003a00b003200641b0036a1087020b024020114201520d00200641e8036a200a370300200641e0036a200e370300200641b0036a41086a41003a0000200641b9036a2002290000370000200641c1036a200241086a290000370000200641c9036a200241106a290000370000200641d1036a200241186a290000370000200641023a00b003200641b0036a1087020b20064188046a201037030020064180046a200f370300200641b0036a41086a41073a0000200641b9036a2001290000370000200641d9036a2002290000370000200641f9036a20053a0000200641c1036a200141086a290000370000200641c9036a200141106a290000370000200641d1036a200141186a290000370000200641e1036a200241086a290000370000200641e9036a200241106a290000370000200641f1036a200241186a290000370000200641023a00b003200641b0036a108702200041106a200420107d2003200f54ad7d370300200041086a2003200f7d370300200041003602000b200641b0046a24000bf90c09017f027e027f027e027f077e017f037e047f230041c0026b2204240002400240200220038450450d00420021024200210342002105420021060c010b200441186a200110d803200441286a200428021822072004280220220810d903200429032821094200210a20044200370328200441f0006a280200210b20042d0074210c0240024020094201510d0042002105420021064200210d4200210e4200210f420021104200211142002112420021130c010b200441e0006a2903002106200441286a41306a2903002105200441286a41286a290300210a200441c8006a2903002111200441286a41186a290300210e2004290338211320042903302112200441e8006a290300210d4200210f420021100b200441f8006a41286a2005370300200441f8006a41306a2006370300200441f8006a41186a2011200f842205200320052010200e84220e200256200520035620052003511b22141b22067d200e2002200e20141b220554ad7d220f3703002004200a370398012004200e20057d220a3703880120042012370378200420133703800102400240427f2012200a7c220e200e20125422142013200f7c2014ad7c220e201354200e2013511b22141b22104280c8afa025544100427f200e20141b2211501b0d0020044188016a290300210a200441a8016a290300210f200441a0016a290300211020044198016a29030021112004290380012115200429037821164201210e20042903900121170c010b024002402012200a842013200f848450450d004200210e0c010b4200210e200441c0016a41186a22184200370300200441c0016a41106a22194200370300200441c0016a41086a22144200370300200442003703c001200441b0016a419a8cc700410810fb012014200441b0016a41086a221a290000370300200420042900b0013703c001200441b0016a41b8a1c300410d10fb012018201a290000370300201920042900b0013703002004200441c0016a108d02200441106a290300210a2004290308210f2004280200211b201842003703002019420037030020144200370300200442003703c001200441b0016a419a8cc700410810fb012014201a290000370300200420042900b0013703c001200441b0016a41b8a1c300410d10fb012018201a290000370300201920042900b00137030020044200200a4200201b1b220a20117d200f4200201b1b220f201054ad7d2215200f20107d2216200f562015200a562015200a511b22181b3703b80120044200201620181b3703b001200441c0016a4120200441b0016a411010b301200441f8016a2011370300200441f0016a2010370300201441013a0000200441c9016a2001290000370000200441d1016a200141086a290000370000200441d9016a200141106a290000370000200441e1016a200141186a290000370000200441023a00c001200441c0016a1087020b0b200441d0006a2011370300200441e8006a200d370300200441d8006a2010370300200441386a2015370300200441e0006a200f370300200441c0006a200a37030020042017370348200420163703302004200c4100200942015122141b3a00742004200b410020141b3602702004200e420151220bad37032802400240200b0d002007200810ff010c010b20072008200441306a10da030b200220055421080240200428021c450d00200710260b200320067d21032008ad210a200e4201522107024002400240200942015122080d002007450d010b2008200771450d01200441c0016a41086a41043a0000200441c9016a2001290000370000200441d1016a200141086a290000370000200441d9016a200141106a290000370000200441e1016a200141186a290000370000200441003a00c001200441c0016a1087020c010b200441c0016a41086a41033a0000200441c9016a2001290000370000200441d1016a200141086a290000370000200441d9016a200141106a290000370000200441e1016a200141186a290000370000200441003a00c001200441c0016a1087020b2003200a7d2103200220057d210220094201510d00200441f8016a2013370300200441f0016a2012370300200441c0016a41086a41003a0000200441c9016a2001290000370000200441d1016a200141086a290000370000200441d9016a200141106a290000370000200441e1016a200141186a290000370000200441023a00c001200441c0016a1087020b2000200237031020002005370300200041186a200337030020002006370308200441c0026a24000bdb0203037f027e027f230041106b2203240002400240200241186a2802004105744114722204417f4c0d00200410242205450d01200341003602082003200436020420032005360200200241086a290300210620022903002107200341004110106d2003280200200328020822046a22052006370008200520073700002003200441106a3602082002280210210420032002280218220210a1010240024020020d0020032802002108200328020821020c010b20024105742105200328020821020340200320024120106d20032802002208200328020822096a22022004290000370000200241086a200441086a290000370000200241106a200441106a290000370000200241186a200441186a2900003700002003200941206a2202360208200441206a2104200541606a22050d000b0b200020012008200210b30102402003280204450d00200810260b200341106a24000f0b1034000b1033000b960b03077f017e047f23004190036b2202240041002103200241003a00c8022001280204417f6a210402400240024002400240024002400240024003402004417f460d01200241a8026a20036a200128020022052d00003a0000200120043602042001200541016a3602002002200341016a22053a00c8022004417f6a21042005210320054120470d000b200241d0026a41086a2204200241a8026a41086a290300370300200241d0026a41106a2203200241a8026a41106a290300370300200241d0026a41186a2206200241a8026a41186a290300370300200220022903a8023703d002200541ff0171411f4d0d01200241e8006a41086a2004290300370300200241e8006a41106a2003290300370300200241e8006a41186a2006290300370300200220022903d00237036820022001108f0120022802000d062002280204210641002103200241003a00c8022001280204417f6a210403402004417f460d03200241a8026a20036a200128020022052d00003a0000200120043602042001200541016a3602002002200341016a22053a00c8022004417f6a21042005210320054120470d000b200241d0026a41086a2203200241a8026a41086a290300370300200241d0026a41106a2207200241a8026a41106a290300370300200241d0026a41186a2208200241a8026a41186a290300370300200220022903a8023703d002200541ff0171411f4d0d0320024188016a41086a200329030037030020024188016a41106a200729030037030020024188016a41186a2008290300370300200220022903d0023703880141002103200241003a00c80203402004417f460d05200241a8026a20036a200128020022052d00003a0000200120043602042001200541016a3602002002200341016a22053a00c8022004417f6a21042005210320054120470d000b200241d0026a41086a2204200241a8026a41086a290300370300200241d0026a41106a2203200241a8026a41106a290300370300200241d0026a41186a2207200241a8026a41186a290300370300200220022903a8023703d002200541ff0171411f4d0d05200241a8016a41086a2004290300370300200241a8016a41106a2003290300370300200241a8016a41186a2007290300370300200220022903d0023703a801200241a8026a200110e40220022802a8022204450d0720022902ac022109200241c8006a41186a2201200241e8006a41186a290300370300200241c8006a41106a2203200241e8006a41106a290300370300200241c8006a41086a2205200241e8006a41086a290300370300200241286a41086a220720024188016a41086a290300370300200241286a41106a220820024188016a41106a290300370300200241286a41186a220a20024188016a41186a290300370300200241086a41086a220b200241a8016a41086a290300370300200241086a41106a220c200241a8016a41106a290300370300200241086a41186a220d200241a8016a41186a290300370300200220022903683703482002200229038801370328200220022903a801370308200020093702082000200436020420002006360200200041106a2002290348370200200041186a2005290300370200200041206a2003290300370200200041286a2001290300370200200041306a2002290328370200200041386a2007290300370200200041c0006a2008290300370200200041c8006a200a290300370200200041e8006a200d290300370200200041e0006a200c290300370200200041d8006a200b290300370200200041d0006a20022903083702000c080b200341ff0171450d00200241003a00c8020b200041003602040c060b200341ff0171450d00200241003a00c8020b200041003602040c040b200341ff0171450d00200241003a00c8020b200041003602040c020b200041003602040c010b200041003602040b20024190036a24000bad1004037f017e127f027e230041a0026b22022400200241106a2001108f010240024020022802100d00024002400240024020022802142203200128020441246e2204200420034b1bad42247e2205422088a70d002005a72204417f4c0d000240024020040d00410421060c010b200410242206450d020b20024100360220200220063602182002200441246e36021c02402003450d00200241b8016a41046a2107200241f5006a2108200241b8016a4107722109200241cb016a220a41056a210b4100210c4100210d034002400240024002402001280204220e450d002001280200220f2d000021042001200e417f6a22103602042001200f41016a360200200441074b0d00024002400240024002400240024020040e080007010703040205000b200241086a2001108f0120022802080d0620012802042211200228020c220e490d06200e417f4c0d0c02400240200e0d004100210f410121040c010b200e102a2204450d0e20012802042111200e210f0b02402011200e490d0020042001280200200e10cf06211120012802042210200e4f0d06200e201041b8afc0001048000b200f450d06200410260c060b41002104200241003a00d801200e417e6a210e02400240034020102004460d01200241b8016a20046a200f20046a221141016a2d00003a00002001200e3602042001201141026a3602002002200441016a22113a00d801200e417f6a210e2011210420114120470d000b200241f0016a41086a220f200941086a2800003602002002200a290000370380022002200b29000037008502200220092900003703f00120022002290085023700e50120022002290380023703e001410121044101210e0240201141ff01714120490d0020022f01b80120022d00ba0141107472211220022800bb012113200241a8016a41086a200f280200360200200220022903f0013703a801200220022903e00137038002200220022900e501370085024100210e0b200e0d01200241e0016a41086a200241a8016a41086a280200360200200220022903a8013703e00120022002290380023703b80120022002290085023700bd014100210420132114201221150c010b0240200441ff0171450d00200241003a00d8010b410121040b20024198016a41086a220e200241e0016a41086a280200360200200220022903e00137039801200220022903b80137038801200220022900bd0137008d0120040d05200820022f0085013b0000200241f8006a41086a200e280200360200200841026a20024185016a41026a2d00003a0000200220022903980137037820022002290388013703682002200229008d0137006d2014410876211641002111201421042015210e0c080b200241b8016a200110910120022802bc012211450d0420022f01b80120022d00ba0141107472210e20022d00bb012104200220022903c00137027c20022011360278410121110c070b200241b8016a200110910120022802bc012211450d0320022f01b80120022d00ba0141107472210e20022d00bb012104200220022903c00137027c20022011360278410221110c060b200241b8016a200110910120022802bc012211450d0220022f01b80120022d00ba0141107472210e20022d00bb012104200220022903c00137027c20022011360278410321110c050b2010450d01200f2d000121042001200e417e6a22113602042001200f41026a36020020040d012011450d01200f2d000221112001200e417d6a22163602042001200f41036a360200201141014b0d01410021040240024020110e020100010b20164104490d02200f28000321102001200e41796a22043602042001200f41076a36020020044104490d02200f28000721172001200e41756a3602042001200f410b6a360200410121040b200241e8006a41086a200741086a290200370300200220022802b801360280012002200729020037036820022017ad4220862010ad8437037841042111410021160c030b20012010200e6b36020420012001280200200e6a36020020110d010b200c450d08200c41246c2104200621010c070b200241e8006a41086a200741086a290200370300200220022802b80136028001200220072902003703682002200ead422086200fad84201820111b22183e0278200220184220883e027c20114108762116410521110b0b200d41016a210d200241d8006a41086a200241f8006a41086a280200220f360200200241c8006a41086a200241e8006a41086a2903002205370300200241386a41086a2210200f360200200241286a41086a220f200537030020022002290378220537035820022002290368221937034820022005370338200220193703282016410874200441ff01717221170240200c200228021c470d00200241186a200c410110d101200228021821062002280220210c0b2006200c41246c6a220420173600042004200e3b0001200420113a0000200441036a200e4110763a0000200441106a201028020036000020042002290338370008200420022903283700142004411c6a200f2903003700002002200c41016a220c360220200d2003470d000b0b2006450d042000200229021c370204200020063602000c050b1034000b1033000b03400240024020012d0000220e41044b0d00024002400240200e0e050400010204040b2001410c6a280200450d03200141086a28020010260c030b2001410c6a280200450d02200141086a28020010260c020b2001410c6a280200450d01200141086a28020010260c010b200141086a280200450d00200141046a28020010260b200141246a21012004415c6a22040d000b0b200228021c2201450d00200141246c450d00200610260b200041003602000b200241a0026a24000b991a04057f017e0f7f027e230041b0056b2202240041002103200241003a00e804024002400240024002400240024002400340200128020022042802042205450d01200241c8046a20036a200428020022062d00003a000020042005417f6a3602042004200641016a3602002002200341016a22033a00e80420034120470d000b200241d8016a41186a200241c8046a41186a2903002207370300200241f8006a41086a200241c8046a41086a290300370300200241f8006a41106a200241c8046a41106a290300370300200241f8006a41186a2007370300200220022903c804370378200241106a2001108d0120022802100d032002280214210841002103200241003a00e8040340200128020022042802042205450d02200241c8046a20036a200428020022062d00003a000020042005417f6a3602042004200641016a3602002002200341016a22033a00e80420034120470d000b200241d8016a41186a200241c8046a41186a290300220737030020024198016a41086a200241c8046a41086a29030037030020024198016a41106a200241c8046a41106a29030037030020024198016a41186a2007370300200220022903c8043703980141002103200241003a00e8040340200128020022042802042205450d03200241c8046a20036a200428020022062d00003a000020042005417f6a3602042004200641016a3602002002200341016a22033a00e80420034120470d000b200241d8016a41186a200241c8046a41186a2903002207370300200241b8016a41086a200241c8046a41086a290300370300200241b8016a41106a200241c8046a41106a290300370300200241b8016a41186a2007370300200220022903c8043703b801200241086a2001108d0120022802080d05200228020c2209200128020028020441246e2203200320094b1bad42247e2207422088a7450d040c070b0240200341ff0171450d00200241003a00e8040b200041003602040c050b0240200341ff0171450d00200241003a00e8040b200041003602040c040b0240200341ff0171450d00200241003a00e8040b200041003602040c030b200041003602040c020b2007a72204417f4c0d0202400240024002400240024020040d00410421030c010b200410242203450d010b2001200128020441016a2205360204200241003602c003200220033602b8032002200441246e3602bc03200520012802084b0d0202402009450d00200241c8046a41046a210a200241e5016a210b200241c8046a410772210c200241db046a220d41056a210e4100210f410021100340200128020022042802042206450d03200428020022112d0000210520042006417f6a3602042004201141016a360200200541074b0d0302400240024002400240024002400240024020050e08000c010c03040205000b20022001108d0120022802000d0b20012802002206280204221120022802042205490d0b2005417f4c0d100240024020050d0041002112410121040c010b2005102a2204450d0b200128020022062802042111200521120b024020112005490d0020042006280200200510cf0621112006280204221320054f0d062005201341b8afc0001048000b2012450d0b200410260c0b0b41002104200241003a00e804024002400340200128020022052802042206450d01200241c8046a20046a200528020022112d00003a000020052006417f6a3602042005201141016a3602002002200441016a22043a00e80420044120470d000b20024180056a41086a2204200c41086a2800003602002002200d290000370390052002200e290000370095052002200c2900003703800520022002290095053700f50420022002290390053703f00420022800cb04211420022f01c804210520022d00ca042106200241b8046a41086a2211200428020036020020022002290380053703b804200220022900f50437009505200220022903f00437039005200241f0046a41086a2011280200360200200220022903b8043703f00420022002290095053700cd0420022002290390053703c80420052006411074722115410021040c010b0240200441ff0171450d00200241003a00e8040b410121040b200241a8046a41086a2205200241f0046a41086a280200360200200220022903f0043703a804200220022903c80437039804200220022900cd0437009d0420040d0a200b20022f0095043b000020024188046a41086a2005280200360200200b41026a20024195046a41026a2d00003a0000200220022903a8043703880420022002290398043703d8012002200229009d043700dd01201441087621164100210620142104201521050c060b200241c8046a2001108c0120022802cc042206450d0920022f01c80420022d00ca0441107472210520022d00cb042104200220022903d00437028c042002200636028804410121060c050b200241c8046a2001108c0120022802cc042206450d0820022f01c80420022d00ca0441107472210520022d00cb042104200220022903d00437028c042002200636028804410221060c040b200241c8046a2001108c0120022802cc042206450d0720022f01c80420022d00ca0441107472210520022d00cb042104200220022903d00437028c042002200636028804410321060c030b200128020022042802042205450d06200428020022062d0000211120042005417f6a3602042004200641016a36020020110d06200128020022042802042206450d06200428020022112d0000210520042006417f6a3602042004201141016a360200200541014b0d06410021040240024020050e020100010b2001280200220428020422054104490d0720042802002211280000210620042005417c6a3602042004201141046a3602002001280200220428020422054104490d0720042802002212280000211120042005417c6a3602042004201241046a360200410121040b200241d8016a41086a200a41086a290200370300200220022802c804360290042002200a2902003703d80120022011ad4220862006ad843703880441042106410021160c010b2006201320056b3602042006200628020020056a3602002011450d05200241d8016a41086a200a41086a290200370300200220022802c804360290042002200a2902003703d80120022005ad4220862012ad84201720111b22173e028804200220174220883e028c0420114108762116410521060b0b201041016a2110200241f8036a41086a20024188046a41086a2802002211360200200241e8036a41086a200241d8016a41086a2903002207370300200241d8036a41086a22122011360200200241c8036a41086a22112007370300200220022903880422073703f803200220022903d80122183703e803200220073703d803200220183703c8032016410874200441ff01717221130240200f20022802bc03470d00200241b8036a200f410110d10120022802b803210320022802c003210f0b2003200f41246c6a22042013360004200420053b0001200420063a0000200441036a20054110763a0000200441106a2012280200360000200420022903d803370008200420022903c8033700142004411c6a20112903003700002002200f41016a220f3602c00320102009470d000b200128020421050b20012005417f6a3602042003450d0420022902bc032107200241d8006a41186a2204200241f8006a41186a290300370300200241d8006a41106a2205200241f8006a41106a290300370300200241d8006a41086a2206200241f8006a41086a290300370300200241386a41086a220120024198016a41086a290300370300200241386a41106a221120024198016a41106a290300370300200241386a41186a220f20024198016a41186a290300370300200241186a41086a2210200241b8016a41086a290300370300200241186a41106a2209200241b8016a41106a290300370300200241186a41186a2212200241b8016a41186a290300370300200220022903783703582002200229039801370338200220022903b801370318200020073702082000200336020420002008360200200041106a2002290358370200200041186a2006290300370200200041206a2005290300370200200041286a2004290300370200200041306a2002290338370200200041386a2001290300370200200041c0006a2011290300370200200041c8006a200f290300370200200041e8006a2012290300370200200041e0006a2009290300370200200041d8006a2010290300370200200041d0006a20022903183702000c050b1033000b200241b8036a2106200f450d01200f41246c210403400240024020032d0000220541044b0d0002400240024020050e050400010204040b2003410c6a280200450d03200341086a28020010260c030b2003410c6a280200450d02200341086a28020010260c020b2003410c6a280200450d01200341086a28020010260c010b200341086a280200450d00200341046a28020010260b200341246a21032004415c6a22040d000c020b0b200241b8036a21060b200641046a2802002203450d00200341246c450d00200628020010260b200041003602040b200241b0056a24000f0b1034000bec0101047f230041c0006b2202240041cb93c4002103410f210441042105024002400240024002400240200141ff01710e06000102030405000b2002411c6a41013602002002420137020c200241dcedc6003602082002410436022420024190f6c6003602202002200241206a360218200241086a41ecc0c700103d000b41bc93c4002103410021050c030b41a293c4002103411a2104410121050c020b418593c4002103411d2104410221050c010b41f292c400210341132104410321050b200041033b0100200041086a2004360200200041046a2003360200200041026a20053a0000200241c0006a24000b860201047f230041c0006b2202240041e9b3c6002103410c2104410521050240024002400240024002400240200141ff01710e0700010203040506000b2002411c6a41013602002002420137020c200241dcedc6003602082002410436022420024190f6c6003602202002200241206a360218200241086a41ecc0c700103d000b41e2b3c600210341072104410021050c040b41dab3c600210341082104410121050c030b41d2b3c600210341082104410221050c020b41c7b3c6002103410b2104410321050c010b41beb3c600210341092104410421050b20004183303b0100200041086a2004360200200041046a2003360200200041026a20053a0000200241c0006a24000b9b0201047f230041c0006b2202240041bc8fc6002103411621044106210502400240024002400240024002400240200141ff01710e080001020304050607000b2002411c6a41013602002002420137020c200241dcedc6003602082002410436022420024190f6c6003602202002200241206a360218200241086a41ecc0c700103d000b418fdac5002103410b2104410021050c050b4183dac5002103410c2104410121050c040b41f6d9c5002103410d2104410221050c030b41efd9c500210341072104410321050c020b418c8fc600210341182104410421050c010b41a48fc600210341182104410521050b20004183183b0100200041086a2004360200200041046a2003360200200041026a20053a0000200241c0006a24000bf10101047f230041c0006b2202240041d0d5c10021034109210441042105024002400240024002400240200141ff01710e06000102030405000b2002411c6a41013602002002420137020c200241dcedc6003602082002410436022420024190f6c6003602202002200241206a360218200241086a41ecc0c700103d000b41c5d5c1002103410b2104410021050c030b41bdd5c100210341082104410121050c020b41b8d5c100210341052104410221050c010b41add5c1002103410b2104410321050b20004183083b0100200041086a2004360200200041046a2003360200200041026a20053a0000200241c0006a24000bc70101047f230041c0006b2202240041e6a1c300210341092104410221050240024002400240200141ff01710e0400010203000b2002411c6a41013602002002420137020c200241dcedc6003602082002410436022420024190f6c6003602202002200241206a360218200241086a41ecc0c700103d000b41dca1c3002103410a2104410021050c010b41c5a1c300210341172104410121050b200041832a3b0100200041086a2004360200200041046a2003360200200041026a20053a0000200241c0006a24000bb00201047f230041c0006b220224004193c0c3002103410b210441072105024002400240024002400240024002400240200141ff01710e09000102030405060708000b2002411c6a41013602002002420137020c200241dcedc6003602082002410436022420024190f6c6003602202002200241206a360218200241086a41ecc0c700103d000b4185c0c3002103410e2104410021050c060b41f0bfc300210341152104410121050c050b41e8bfc300210341082104410221050c040b41d5bfc300210341132104410321050c030b41c3bfc300210341122104410421050c020b41babfc300210341092104410521050c010b41c5a1c300210341172104410621050b200041830a3b0100200041086a2004360200200041046a2003360200200041026a20053a0000200241c0006a24000bae0301047f230041c0006b2202240041a2f4c1002103410d2104410d2105024002400240024002400240024002400240024002400240024002400240200141ff01710e0f000102030405060708090a0b0c0d0e000b2002411c6a41013602002002420137020c200241dcedc6003602082002410436022420024190f6c6003602202002200241206a360218200241086a41ecc0c700103d000b4192f4c100210341102105410021040c0c0b4183f4c1002103410f2105410121040c0b0b41f2f3c100210341112105410221040c0a0b41e1f3c100210341112105410321040c090b41cff3c100210341122105410421040c080b41baf3c100210341152105410521040c070b41a7f3c100210341132105410621040c060b41dab3c600210341082105410721040c050b41bdd5c100210341082104410821050c040b419cf3c1002103410b2105410921040c030b418ef3c1002103410e2105410a21040c020b41fbf2c100210341132105410b21040c010b41eff2c1002103410c2104410c21050b20004183323b0100200041086a2005360200200041046a2003360200200041026a20043a0000200241c0006a24000b3400200041ac8cc70036020420004100360200200041146a4104360200200041106a41b4cbc100360200200041086a42083702000b2901017f230041106b2202240020024100360208200242013703002000200210b701200241106a24000b2701017f02404104102422020d001033000b20004204370204200020023602002000410010a1010b0b0020004104410010b4010bd80301047f230041c0006b2202240041e9c8c2002103410c2104410f210502400240024002400240024002400240024002400240024002400240024002400240200141ff01710e11000102030405060708090a0b0c0d0e0f10000b2002411c6a41013602002002420137020c200241dcedc6003602082002410436022420024190f6c6003602202002200241206a360218200241086a41ecc0c700103d000b41dfc8c2002103410a2104410021050c0e0b41d2c8c2002103410d2104410121050c0d0b41c2c8c200210341102104410221050c0c0b41b8c8c2002103410a2104410321050c0b0b41afc8c200210341092104410421050c0a0b41a1c8c2002103410e2104410521050c090b418fc8c200210341122104410621050c080b4181c8c2002103410e2104410721050c070b41f7c7c2002103410a2104410821050c060b41eec7c200210341092105410921040c050b41e3c7c2002103410b2104410a21050c040b41d5c7c2002103410e2104410b21050c030b41ccc7c200210341092104410c21050c020b41c1c7c2002103410b2104410d21050c010b41e8bfc300210341082104410e21050b20004183283b0100200041086a2004360200200041046a2003360200200041026a20053a0000200241c0006a24000b9b0201047f230041c0006b2202240041a6c7c5002103410621044108210502400240024002400240024002400240200141ff01710e080001020304050607000b2002411c6a41013602002002420137020c200241dcedc6003602082002410436022420024190f6c6003602202002200241206a360218200241086a41ecc0c700103d000b4194c7c500210341122105410021040c050b4184c7c500210341102105410121040c040b41f7c6c5002103410d2105410221040c030b41ebc6c5002103410c2105410321040c020b41dfc6c5002103410c2105410421040c010b41cbc6c500210341142105410521040b200041830e3b0100200041086a2005360200200041046a2003360200200041026a20043a0000200241c0006a24000bd30a03057f037e057f230041c0026b22022400200041046a21030240024002402000410c6a220428020022050d00200241f8016a411f6a200241d0016a411f6a280000360000200241f8016a41186a200241d0016a41186a290300370300200241f8016a41106a200241d0016a41106a290300370300200241f8016a41086a200241d0016a41086a290300370300200220022903d0013703f8010c010b20042005417f6a2205360200200241d0016a411f6a22062000280204200541246c6a220441206a280000360000200241d0016a41186a2205200441196a290000370300200241d0016a41086a200441096a2900002207370300200241d0016a41106a200441116a29000022083703002002200429000122093703d00120042d00002104200241f8016a411f6a220a2006280000360000200241f8016a41186a22062005290300370300200241f8016a41106a22052008370300200241f8016a41086a220b2007370300200220093703f80120044106460d00200241a8016a411f6a220c200a280000360000200241a8016a41186a220a2006290300370300200241a8016a41106a20052903002207370300200241a8016a41086a200b290300220837030020024180016a41096a200837000020024180016a41116a200737000020024180016a41196a200a29030037000020024180016a41206a200c280000360000200220022903f80122073703a8012002200737008101200220043a00800102400240024020044103470d0020024180016a41017228000041c28289aa04470d0120024180016a41086a2802002104200220024180016a41106a2802003602d401200220043602d001200241f8016a200241d0016a10dc01410121040240024020022d00f8014101470d00410021040c010b200241f8006a200241b1026a290000370300200241f0006a200241a9026a290000370300200241e8006a200241a1026a290000370300200241e0006a20024199026a290000370300200241d8006a20024191026a290000370300200241c0006a41106a20024189026a290000370300200241c0006a41086a20024181026a290000370300200220022900f9013703400b200241f8016a41386a2205200241c0006a41386a290300370300200241f8016a41306a2206200241c0006a41306a290300370300200241f8016a41286a220a200241c0006a41286a290300370300200241f8016a41206a220b200241c0006a41206a290300370300200241f8016a41186a220c200241c0006a41186a290300370300200241f8016a41106a220d200241c0006a41106a290300370300200241f8016a41086a220e200241c0006a41086a290300370300200220022903403703f8012004450d01200241386a2005290300370300200241306a2006290300370300200241286a200a290300370300200241206a200b290300370300200241186a200c290300370300200241106a200d290300370300200241086a200e290300370300200220022903f80137030002402002418c016a280200450d0020024188016a28020010260b200241f8016a200010f4022002200241f8016a4120200110f502450d03200310d60141012104200041086a2802002200450d04200041246c450d04200328020010260c040b200441044b0d010240024020040e050400010304040b2002418c016a280200450d0320024188016a28020010260c030b2002418c016a280200450d0220024188016a28020010260c020b2002418c016a280200450d0120024188016a28020010260c010b20024188016a280200450d0020022802840110260b200310d60141002104200041086a2802002200450d00200041246c450d00200328020010260b200241c0026a240020040b8e0301037f230041106b2202240020024100360208200242013703002002200236020c200141106a2002410c6a109c0102400240024002402001280200220341c000490d00200341808001490d012003418080808004490d02200220022802084101106d2002280200200228020822046a41033a00002002200441016a2204360208200220044104106d2002280200200228020822046a20033600002002200441046a3602080c030b200220022802084101106d2002280200200228020822046a20034102743a00002002200441016a3602080c020b200220022802084102106d2002280200200228020822046a20034102744101723b00002002200441026a3602080c010b200220022802084104106d2002280200200228020822046a20034102744102723600002002200441046a3602080b2002200236020c200141306a2002410c6a109c012002200236020c200141d0006a2002410c6a109c012002200141046a10a00120002002280200200228020810960102402002280204450d00200228020010260b200241106a24000b150020002002ad4220862001ad84200310094101460ba60401047f230041106b220224000240411a10242203450d002002421a3702042002200336020020012802002103200241004110106d2002280200200228020822046a22052003290000370000200541086a200341086a2900003700002002200441106a220436020820012802042103200220044120106d2002280200200228020822056a22042003290000370000200441086a200341086a290000370000200441106a200341106a290000370000200441186a200341186a2900003700002002200541206a220336020820012802082104200220034104106d2002280200200228020822036a20043600002002200341046a2203360208200128020c2104200220034104106d2002280200200228020822036a20043600002002200341046a22033602080240024002400240024020012802102d00000e0400010203000b200220034101106d2002280200200228020822036a41003a0000200341016a21030c030b200220034101106d2002280200200228020822036a41013a0000200341016a21030c020b200220034101106d2002280200200228020822036a41023a0000200341016a21030c010b200220034101106d2002280200200228020822036a41033a0000200341016a21030b2002200336020820012f01142104200220034102106d20022802002201200228020822036a20043b00002002200341026a220336020820002001200310960102402002280204450d00200110260b200241106a24000f0b1033000bfa0201057f230041106b2202240002400240200141086a28020022034105744116722204417f4c0d00200410242205450d0120024100360208200220043602042002200536020020012802002104200241004110106d2002280200200228020822056a22062004290000370000200641086a200441086a2900003700002002200541106a360208200128020421042002200310a1010240024020030d00200228020821030c010b20034105742105200228020821030340200220034120106d2002280200200228020822066a22032004290000370000200341086a200441086a290000370000200341106a200441106a290000370000200341186a200441186a2900003700002002200641206a2203360208200441206a2104200541606a22050d000b0b20012f010c2105200220034102106d20022802002204200228020822036a20053b00002002200341026a220336020820002004200310960102402002280204450d00200410260b200241106a24000f0b1034000b1033000be00201037f2003200341086a22042802004101106d2003280200200428020022056a21060240200041ff017122004104460d00200641013a00002004200541016a2205360200024002400240024020000e0400010203000b200320054101106d2003280200200341086a220328020022046a41003a00002003200441016a3602000f0b200320054101106d2003280200200341086a220328020022046a41013a00002003200441016a3602000f0b200320054101106d2003280200200341086a220328020022046a41023a00002003200441016a3602000f0b200320054101106d2003280200200341086a220428020022006a41033a00002004200041016a2200360200200320004101106d2003280200200428020022006a20013a00002004200041016a2200360200200320004101106d2003280200200428020022036a20023a00002004200341016a3602000f0b200641003a00002004200541016a3602000bdd0302027f017e20004201370200200041086a410036020002402001280200220241024b0d0002400240024020020e03000102000b200041004101106d2000280200200041086a220228020022036a41013a00002002200341016a3602002000200141046a10ac01200020022802004120106d2000280200200228020022036a2200200141106a2900003700002002200341206a360200200041086a200141186a290000370000200041106a200141206a290000370000200041186a200141286a2900003700000f0b200041004101106d2000280200200041086a220228020022036a41023a00002002200341016a220336020020012802042101200020034104106d2000280200200228020022006a20013600002002200041046a3602000f0b200041004101106d2000280200200041086a220228020022036a41033a00002002200341016a2203360200200020034101106d2000280200200228020022036a41013a00002002200341016a2203360200200141086a2903002104200020034108106d2000280200200228020022036a20043700002002200341086a2203360200200141106a2903002104200020034108106d2000280200200228020022036a20043700002002200341086a3602002000200141186a2d00001097010b0b7101047f230041106b220124002001410036020820014201370300200110fa02200128020021022000200041086a220328020020012802082204106d2000280200200328020022006a2002200410cf061a2003200020046a36020002402001280204450d00200210260b200141106a24000bf30301057f230041e0006b22022400200241086a41ac8cc700410810fb01200241186a4184d0c100411210fb0102400240411010242203450d002002421037023c20022003360238200241386a41004110106d20022802382203200228024022046a22052001290000370000200541086a200141086a2900003700002002200441106a2201360240200241c8006a2003200110a202200241dc006a200320016a360200200220033602582002200241c8006a41086a3602542002200241c8006a360250200241286a200241d0006a10730240200228023c450d00200310260b2002280230220141206a2204417f4c0d010240024020040d0041012103410021040c010b200410242203450d010b20002003360200200041086a220341003602002000200436020420004100411010c9012000280200200328020022046a220520022900083700002003200441106a2204360200200541086a200241086a41086a29000037000020002004411010c9012000280200200328020022046a220520022900183700002003200441106a2206360200200541086a200241186a41086a2900003700002002280228210420002006200110c9012000280200200328020022006a2004200110cf061a2003200020016a3602000240200228022c450d00200410260b200241e0006a24000f0b1033000b1034000bce0401057f230041e0006b22032400200341086a41ac8cc700410810fb01200341186a41b0cfc100411610fb0102400240411010242204450d002003421037023c20032004360238200341386a41004110106d20032802382204200328024022056a22062001290000370000200641086a200141086a2900003700002003200541106a2201360240200341c8006a2004200110a202200341dc006a200420016a360200200320043602582003200341c8006a41086a3602542003200341c8006a360250200341286a200341d0006a10730240200328023c450d00200410260b200341d0006a2002280200200228020810fd0220032802302201200328025822026a41206a2205417f4c0d010240024020050d0041012104410021050c010b200510242204450d010b20002004360200200041086a220441003602002000200536020420004100411010c9012000280200200428020022056a220620032900083700002004200541106a2205360200200641086a200341086a41086a29000037000020002005411010c9012000280200200428020022056a220620032900183700002004200541106a2207360200200641086a200341186a41086a2900003700002003280228210520002007200110c9012000280200200428020022066a2005200110cf061a2004200620016a22063602002003280250210120002006200210c9012000280200200428020022006a2001200210cf061a2004200020026a36020002402003280254450d00200110260b0240200328022c450d00200510260b200341e0006a24000f0b1033000b1034000bfc0301037f230041306b2203240002400240200241046a2204417f4c0d000240024020040d0041012105410021040c010b200410242205450d020b20034100360210200320053602082003200436020c0240024002400240200241c000490d00200241808001490d012002418080808004490d02200341086a41004101106d2003280208200328021022046a41033a00002003200441016a2204360210200341086a20044104106d2003280208200328021022046a20023600002003200441046a2204360210200341086a21050c030b200341086a41004101106d2003280208200328021022046a20024102743a00002003200441016a2204360210200341086a21050c020b200341086a41004102106d2003280208200328021022046a20024102744101723b00002003200441026a2204360210200341086a21050c010b200341086a41004104106d2003280208200328021022046a20024102744102723600002003200441046a2204360210200341086a21050b200520042002106d20032802082204200328021022056a2001200210cf061a2003200520026a2202360210200341186a2004200210a2022003412c6a200420026a360200200320043602282003200341206a3602242003200341186a3602202000200341206a10730240200328020c450d00200410260b200341306a24000f0b1034000b1033000b930401057f230041e0006b22022400200241086a41ac8cc700410810fb01200241186a4194cec100410710fb0102400240412010242203450d002002422037023c20022003360238200241386a41004120106d20022802382203200228024022046a22052001290000370000200541086a200141086a290000370000200541106a200141106a290000370000200541186a200141186a2900003700002002200441206a2201360240200241c8006a2003200110a202200241dc006a200320016a360200200220033602582002200241c8006a41086a3602542002200241c8006a360250200241286a200241d0006a10730240200228023c450d00200310260b2002280230220341206a2205417f4c0d010240024020050d0041012101410021050c010b200510242201450d010b20002001360200200041086a220141003602002000200536020420004100411010c9012000280200200128020022056a220420022900083700002001200541106a2205360200200441086a200241086a41086a29000037000020002005411010c9012000280200200128020022056a220420022900183700002001200541106a2206360200200441086a200241186a41086a2900003700002002280228210520002006200310c9012000280200200128020022006a2005200310cf061a2001200020036a3602000240200228022c450d00200510260b200241e0006a24000f0b1033000b1034000bac0401047f230041c0006b2202240041b0ecc40021034118210441132105024002400240024002400240024002400240024002400240024002400240024002400240024002400240200141ff01710e15000102030405060708090a0b0c0d0e0f1011121314000b2002411c6a41013602002002420137020c200241dcedc6003602082002410436022420024190f6c6003602202002200241206a360218200241086a41ecc0c700103d000b41ace8c400210341122104410021050c120b41c8e8c400210341152104410121050c110b41e8e8c4002103410f2104410221050c100b4180e9c400210341102104410321050c0f0b4198e9c4002103410f2104410421050c0e0b41b0e9c400210341092104410521050c0d0b41c4e9c400210341142104410621050c0c0b41e0e9c400210341102104410721050c0b0b41f8e9c400210341162104410821050c0a0b4198eac400210341172104410921050c090b41b8eac400210341172104410a21050c080b41d8eac400210341102104410b21050c070b41f0eac4002103410d2104410c21050c060b4188ebc4002103410e2104410d21050c050b41a0ebc400210341102104410e21050c040b41b8ebc400210341162104410f21050c030b41d8ebc400210341152104411021050c020b41f8ebc4002103410d2104411121050c010b4190ecc400210341152104411221050b200041831e3b0100200041086a2004360200200041046a2003360200200041026a20053a0000200241c0006a24000b900201077f41012104024002400240200241014b0d004100210520020e020201020b20032d002041ff017121064100210503400240024020012002410176220720056a220841216c6a22092003412010d206220a450d00417f4101200a4100481b210a0c010b4100417f20092d0020220a200647200a2006491b200a2006461b210a0b20052008200a4101461b2105200220076b220241014b0d000b0b024002402001200541216c6a22072003412010d2062202450d00417f410120024100481b21020c010b024020072d0020220220032d00202207470d00410021040c020b417f200220074720022007491b22020d00410021040c010b20052002417f466a21050b20002005360204200020043602000b110041bf80c700412841dcbcc700102f000b8d0301017f23004190016b22042400024002400240024020002d00000e03000102000b200441206a41186a200341186a290000370300200441206a41106a200341106a290000370300200441206a41086a200341086a29000037030020042003290000370320200041016a20012002200441206a10830321000c020b200441206a41186a200341186a290000370300200441206a41106a200341106a290000370300200441206a41086a200341086a29000037030020042003290000370320200041016a20012002200441206a10f50221000c010b20042001200210960141012101200441206a200041016a20041084034100210020042d00200d00200441c8006a41206a200441206a41216a2d00003a0000200441e0006a200441396a290000370300200441d8006a200441316a290000370300200441d0006a200441296a29000037030020042004290021370348200441f0006a200441c8006a412110960102402003200441f0006a460d00200441f0006a2003412010d2064521010b200121000b20044190016a240020000b150020002002ad4220862001ad84200310034101460bd00603017f017e057f230041d0016b2203240002402001200210052204422088a72201450d002004a722052d0000220241014b0d002001417f6a210602400240024020020e020001000b41002101200341003a008901200541016a21070240034020062001460d01200341e8006a20016a200720016a2d00003a00002003200141016a22023a0089012002210120024121470d000b20034190016a41086a2207200341f1006a29000037030020034190016a41106a2208200341f9006a29000037030020034190016a41186a220920034181016a290000370300200320032900693703900120032d00682106410121010240200241ff01714121490d00200341c8006a41186a2009290300370300200341c8006a41106a2008290300370300200341c8006a41086a20072903003703002003200329039001370348410021010b200341286a41086a200341c8006a41086a290300370300200341286a41106a200341c8006a41106a290300370300200341286a41186a200341c8006a41186a2903003703002003200329034837032820010d03200341086a41186a200341286a41186a290300370300200341086a41106a200341286a41106a290300370300200341086a41086a200341286a41086a2903003703002003200329032837030841002102200341086a21010c020b0240200141ff0171450d00200341003a0089010b200341286a41086a200341c8006a41086a290300370300200341286a41106a200341c8006a41106a290300370300200341286a41186a200341c8006a41186a290300370300200320032903483703280c020b2006450d0120052d0001220141024b0d014100210602400240024020010e03020100020b410221060c010b410121060b200341086a41186a200341e8006a41186a290000370300200341086a41106a200341e8006a41106a290000370300200341086a41086a200341e8006a41086a2900003703002003200329006837030841012102200341086a21010b200020063a0001200020023a0000200041026a20012900003700002000410a6a200141086a290000370000200041126a200141106a2900003700002000411a6a200141186a29000037000020051026200341d0016a24000f0b4196aec700412e200341e8006a41c4aec70041d4aec7001036000b130020004105360204200041dcd5c1003602000b3400200041938cc70036020420004100360200200041146a4101360200200041106a418ceec100360200200041086a42073702000b130020004104360204200041b0f4c1003602000b3400200041f88bc70036020420004100360200200041146a4102360200200041106a41a49ec200360200200041086a42083702000bba0201037f23004180016b220224002000280200210002400240024002400240200128020022034110710d002000280200210420034120710d012004ad2001104221000c020b20002802002104410021000340200220006a41ff006a2004410f712203413072200341d7006a2003410a491b3a00002000417f6a2100200441047622040d000b20004180016a22044181014f0d02200141e889c0004102200220006a4180016a410020006b104521000c010b410021000340200220006a41ff006a2004410f712203413072200341376a2003410a491b3a00002000417f6a2100200441047622040d000b20004180016a22044181014f0d02200141e889c0004102200220006a4180016a410020006b104521000b20024180016a240020000f0b200441800141d889c0001048000b200441800141d889c0001048000b950605027f027e017f027e027f230041a0016b220224002000280200210002400240024002400240024002400240200128020022034110710d00200041086a29030021042000290300210520034120710d0220054290ce005441002004501b450d012005a72103412721000c060b200041086a290300210520002903002104418001210002400340024020000d00410021000c020b200241206a20006a417f6a2004a7410f712203413072200341d7006a2003410a491b3a00002000417f6a210020044204882005423c8684220420054204882205844200520d000b20004181014f0d030b200141e889c0004102200241206a20006a41800120006b104521000c060b41272100200241186a21060340200241106a200520044290ce00420010d3062002200229031022072006290300220842f0b17f427f10cc06200241206a20006a2203417c6a200520022903007ca7220941ffff037141e4006e220a41017441aa85c0006a2f00003b00002003417e6a200a419c7f6c20096a41ffff037141017441aa85c0006a2f00003b0000200542ffc1d72f56210320044200522109200450210a2000417c6a2100200721052008210420032009200a1b0d000c040b0b418001210002400340024020000d00410021000c020b200241206a20006a417f6a2005a7410f712203413072200341376a2003410a491b3a00002000417f6a210020054204882004423c8684220520044204882204844200520d000b20004181014f0d020b200141e889c0004102200241206a20006a41800120006b104521000c040b200041800141d889c0001048000b200041800141d889c0001048000b2007a721030b02400240200341e3004a0d00200321090c010b200241206a2000417e6a22006a2003200341ffff037141e4006e2209419c7f6c6a41ffff037141017441aa85c0006a2f00003b00000b024002402009410a480d00200241206a2000417e6a22006a200941017441aa85c0006a2f00003b00000c010b200241206a2000417f6a22006a200941306a3a00000b200141d4c0c7004100200241206a20006a412720006b104521000b200241a0016a240020000bd10202027f017e23004180016b220224002000280200210002400240024002400240200128020022034110710d002000290300210420034120710d0120042001104221000c020b20002903002104418001210002400340024020000d00410021000c020b200220006a417f6a2004a7410f712203413072200341d7006a2003410a491b3a00002000417f6a2100200442048822044200520d000b20004181014f0d030b200141e889c0004102200220006a41800120006b104521000c010b418001210002400340024020000d00410021000c020b200220006a417f6a2004a7410f712203413072200341376a2003410a491b3a00002000417f6a2100200442048822044200520d000b20004181014f0d030b200141e889c0004102200220006a41800120006b104521000b20024180016a240020000f0b200041800141d889c0001048000b200041800141d889c0001048000bf10101067f23004180016b220224002001410c6a28020021032001280208210420012802002205210602402005410471450d0020012005410872220636020020040d0020014281808080a0013702080b2001200641047236020020002802002100410021060340200220066a41ff006a2000410f712207413072200741d7006a2007410a491b3a00002006417f6a2106200041047622000d000b024020064180016a2200418101490d00200041800141d889c0001048000b200141e889c0004102200220066a4180016a410020066b104521062001200336020c200120043602082001200536020020024180016a240020060bb52704057f067e087f037e230041f0036b22022400024002400240024002400240024020012d0000417f6a220341034b0d0020030e0401020304010b41bf80c700412841dcbcc700102f000b200241086a200141046a10c30141b00210242203450d0402400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200141106a28020022012802000e170102030405060b0708090a0b0c0d0e0f10111213141500010b200241186a200141086a108d03200341086a200241186a41c80010cf061a200341163602000c150b200241186a200141086a108e0320034100360200200341186a200241186a41106a290300370300200341106a200241186a41086a290300370300200320022903183703080c140b200241186a200141086a108f03200341086a200241186a41a00210cf061a200341013602000c130b200341023602002003200141086a2903003703080c120b02400240024002400240024002400240024020012d0004417f6a220441044b0d00200141046a210520040e050102030405010b41bf80c700412841dcbcc700102f000b200141086a2802002104410121060c040b41022106200241d0026a41026a200541036a2d00003a0000200241186a41086a200141146a290200370300200241286a2001411c6a290200370300200241306a200141246a2d00003a0000200220052f00013b01d00220022001410c6a290200370318200141086a2802002104200141286a28020021010c040b200141086a2802002104410321060c020b200241d2026a200541036a2d00003a0000200241186a41086a200141146a290200370300200241286a2001411c6a290200370300200241306a200141246a2d00003a0000200220052f00013b01d00220022001410c6a29020037031820012d00254100472105200141086a2802002104200141286a2802002101410421060c030b200141086a2802002104410521060b0b0b200320063a0004200320022f01d0023b0005200320043602082003200229031837020c20032001360228200320053a002520034103360200200341076a200241d2026a2d00003a0000200341146a200241206a2903003702002003411c6a200241286a290300370200200341246a200241306a2d00003a00000c110b02400240024002400240024002400240200141086a22042d0000417f6a220641034b0d0020060e0401020304010b41bf80c700412841dcbcc700102f000b200241206a200441096a290000370300200241286a200441116a290000370300200241306a200441196a29000037030020022004290001370318200141386a2903002107200141306a2903002108410121010c030b200241206a200441096a290000370300200241286a200441116a290000370300200241306a200441196a29000037030020022004290001370318200141c8006a2903002109200141c0006a290300210a200141386a2903002107200141306a2903002108410221010c030b200241206a200441096a290000370300200241286a200441116a290000370300200241306a200441196a290000370300200220042900013703182002200441216a2800003602d0022002200441246a2800003600d302200141c8006a3100002109200141c0006a290000210a200141386a2900002107200141306a2900002108200141d8006a290300210b200141d0006a290300210c410321010c030b200241206a200441096a290000370300200241286a200441116a290000370300200241306a200441196a29000037030020022004290001370318200141386a2903002107200141306a2903002108410421010b0b0b2003200c3703502003200a37034020032008370330200320013a000820032002290318370009200320022802d00236002920034104360200200341d8006a200b370300200341c8006a2009370300200341386a20073703002003412c6a20022800d302360000200341116a200241206a290300370000200341196a200241286a290300370000200341216a200241306a2903003700000c100b200241186a200141046a10c001200341053602002003410c6a200241206a280200360200200320022903183702040c0f0b024002402001280204450d00200241d0026a41186a200141286a290000370300200241d0026a41106a200141206a290000370300200241d8026a200141186a290000370300200241d0026a41286a200141386a290000370300200241d0026a41306a200141c0006a290000370300200241d0026a41386a200141c8006a290000370300200241d0026a41c8006a200141d8006a290000370300200241d0026a41d0006a200141e0006a290000370300200241d0026a41d8006a200141e8006a2900003703002002200141106a2900003703d0022002200141306a2900003703f0022002200141d0006a29000037039003200241d0026a41f8006a20014188016a290000370300200241d0026a41f0006a20014180016a290000370300200241d0026a41e8006a200141f8006a290000370300200241d0026a4198016a200141a8016a290000370300200241d0026a4190016a200141a0016a290000370300200241d0026a4188016a20014198016a2900003703002002200141f0006a2900003703b003200220014190016a2900003703d003200241186a200141046a10c801200241246a200241d0026a41a00110cf061a0c010b200241003602180b200341046a200241186a41ac0110cf061a200341073602000c0e0b20034108360200200320012802043602040c0d0b200241186a200141086a109003200341086a200241186a41980210cf061a200341093602000c0c0b20012802042105200241186a200141086a10c801200241c0026a200141146a10d001200241186a41146a200241c0026a41086a280200360200200220022903c002370224200241d0026a41086a220d200241186a41086a2204290300370300200241d0026a41106a220e200241186a41106a2206290300370300200220022903183703d002200141206a2902002107200141286a280200210f2004200141346a29000037030020062001413c6a290000370300200241186a41186a2210200141c4006a290000370300200241186a41206a2211200141cc006a290000370300200241186a41286a2212200141d4006a290000370300200241c8006a2213200141dc006a290000370300200241d0006a2214200141e4006a2900003703002001412c6a2900002108200320053602042003200f3602282003200737022020022008370318200320022903d002370208200341106a200d290300370200200341186a200e290300370200200341e4006a2014290300370200200341dc006a2013290300370200200341d4006a2012290300370200200341cc006a2011290300370200200341c4006a20102903003702002003413c6a2006290300370200200341346a20042903003702002003200229031837022c2003410a3602000c0b0b108103000b200241186a200141086a109103200341086a200241186a41a00210cf061a2003410c3602000c090b2003410d3602000c080b200241186a200141046a10b702200341046a200241186a41c80010cf061a2003410e3602000c070b024002400240024020012f0104417f6a220441014b0d0020040e020102010b41bf80c700412841dcbcc700102f000b200241186a200141086a10c401200229021c210720022802182104410121010c010b20012f0106210641b00210242204450d0c2004200141086a28020010c601410221010b2003200737020c20032004360208200320063b0106200320013b01042003410f3602000c060b200241186a200141086a10d002200341086a200241186a41a80210cf061a200341103602000c050b200241186a200141046a109203200341046a200241186a41c40010cf061a200341113602000c040b02400240024002400240200141086a22042d0000417f6a220e41034b0d0042002107410121064200210a200e0e0404010203040b41bf80c700412841dcbcc700102f000b200241306a200441196a290000370300200241286a200441116a290000370300200241206a200441096a2900003703002002200429000137031842002107410221064200210a0c020b200241206a200441096a290000370300200241286a200441116a290000370300200241306a200441196a29000037030020022004290001370318200141c8006a2903002109200141c0006a2903002108200141386a2903002115200141306a2903002116200141d0006a280200210542002107410321064200210a0c010b200241206a200441096a290000370300200241286a200441116a290000370300200241306a200441196a290000370300200220042900013703182002200441216a2800003602d0022002200441246a2800003600d302200141d0006a2903002217428080808070832107200141d8006a290300210a200141c8006a3100002109200141c0006a2900002108200141386a2900002115200141306a2900002116200141e8006a290300210c200141e0006a290300210b200141f0006a280200210d2017a72105410421060b2003200b3703602003200837034020032016370330200320063a000820032002290318370009200320022802d0023600292003200d360270200341e8006a200c370300200341d8006a200a370300200341c8006a2009370300200341386a20153703002003412c6a20022800d302360000200320072005ad84370350200341116a200241206a290300370000200341196a200241286a290300370000200341216a200241306a290300370000200341123602000c030b200241186a200141046a10930320034113360200200341246a200241386a2802003602002003411c6a200241306a290300370200200341146a200241186a41106a2903003702002003410c6a200241206a290300370200200320022903183702040c020b200241186a200141086a10940320034114360200200341286a200241186a41206a290300370300200341206a200241186a41186a290300370300200341186a200241186a41106a290300370300200341106a200241186a41086a290300370300200320022903183703080c010b024002400240024002400240024020012d0004417f6a221141054b0d004104210620110e06010203060405010b41bf80c700412841dcbcc700102f000b200241186a41086a2206200141106a290000370300200241186a41106a220f200141186a290000370300200241186a41156a22102001411d6a2900003700002002200141086a29000037031820012f0006210d20012d0005210520012d0025210e41b00210242204450d0a2004200141286a280200109503200241d0026a41156a2010290000370000200241d0026a41106a200f290300370300200241d0026a41086a2006290300370300200220022903183703d002410121060c040b200241d0026a41086a200141106a290000370300200241d0026a41106a200141186a290000370300200241e5026a2001411d6a2900003700002002200141086a2900003703d00220012f0006210d20012d0005210520012d0025210e410221060c030b200241d0026a41086a200141106a290000370300200241d0026a41106a200141186a290000370300200241e5026a2001411d6a2900003700002002200141086a2900003703d00220012f0006210d20012d0005210520012d0025210e410321060c020b20012f0106210d20012d00052105410521060c010b200241d0026a41086a200141106a290000370300200241d0026a41106a200141186a290000370300200241e5026a2001411d6a2900003700002002200141086a2900003703d0022001412c6a2802002110200141286a280200210420012f0006210d20012d0005210520012f0126210f20012d0025210e410621060b2003200d3b0106200320053a0005200320063a0004200320022903d0023702082003201036022c200320043602282003200f3b01262003200e3a002520034115360200200341106a200241d8026a290300370200200341186a200241d0026a41106a2903003702002003411d6a200241d0026a41156a2900003700000b200041013a0000200041046a2002290308370200200041106a20033602002000410c6a200241106a2802003602000c030b200141026a2f01002103200241d0026a200141046a10c301200141106a2902002107200141186a2802002104200241186a2001411c6a10c801200041026a20033b0100200041186a2004360200200041106a2007370300200041023a0000200041046a20022903d0023702002000410c6a200241d0026a41086a2802003602002000411c6a2002290318370200200041246a200241186a41086a280200360200200041286a200141286a290300370300200020012d00014100473a00010c020b200141226a2f01002103200241186a200141246a10c301200041226a20033b0100200041246a20022903183702002000412c6a200241206a280200360200200041386a200141386a280200360200200041306a200141306a29020037030020002001290001370001200041096a200141096a290000370000200041116a200141116a290000370000200041196a200141196a290000370000200141c0006a2903002107200041033a0000200041c0006a20073703000c010b200141226a2f01002103200241186a200141246a10c301200041226a20033b0100200041043a0000200041246a20022903183702002000412c6a200241206a280200360200200041306a200141306a29020037030020002001290001370001200041096a200141096a290000370000200041116a200141116a290000370000200041196a200141196a2900003700000b200241f0036a24000f0b102c000bf10503037f017e027f230041306b22022400024002400240024002400240024002400240024002400240024002402001280200417f6a220341094b0d0020030e0a0102030405060708090a010b41bf80c700412841dcbcc700102f000b20004101360200200020012802043602040c090b200241186a200141046a10c801200041023602002000410c6a200241206a280200360200200020022903183702040c080b20004103360200200041086a200141086a2903003703000c070b200241186a200141046a10c801200041043602002000410c6a200241206a280200360200200020022903183702040c060b200241186a200141046a10c801200041053602002000410c6a200241206a280200360200200020022903183702040c050b20004106360200200020012902043702042000410c6a2001410c6a2802003602000c040b2001410c6a2802002204ad42187e2205422088a70d042005a72206417f4c0d04200128020421030240024020060d00410421010c010b200610242201450d060b20024100360210200220013602082002200641186e36020c200241086a4100200410f0012002280210210702402004450d002003200441186c6a21062002280208200741186c6a21012007200441037441786a4103766a2107200241186a410c6a21040340200241186a200310c80120042003410c6a10c801200141106a200241186a41106a290300370200200141086a200241186a41086a29030037020020012002290318370200200141186a2101200341186a22032006470d000b200741016a21070b20002002290308370204200041073602002000410c6a20073602000c030b200241186a200141046a10ca01200041083602002000410c6a200241186a41086a280200360200200020022903183702040c020b200241186a200141046a10c80120004109360200200020022903183702042000410c6a200241206a280200360200200041106a200141106a2802003602000c010b2000410a3602000b200241306a24000f0b1034000b1033000bf91a03057f017e157f230041e0036b2202240002400240024002402001280200417f6a220341014b0d0020030e020102010b41bf80c700412841dcbcc700102f000b20024180026a41186a220420014198026a29000037030020024180026a41106a220520014190026a29000037030020024180026a41086a220620014188026a290000370300200220014180026a29000037038002200141186a2903002107200241e0026a41086a2208200141386a290200370300200241e0026a41106a2209200141c0006a290200370300200241e0026a41186a220a200141c8006a290200370300200241c0026a41086a220b200141d8006a290200370300200241c0026a41106a220c200141e0006a290200370300200241c0026a41186a220d200141e8006a290200370300200241a0026a41086a220e200141f8006a290200370300200241a0026a41106a220f20014180016a290200370300200241a0026a41186a221020014188016a2902003703002002200141306a2902003703e0022002200141d0006a2902003703c0022002200141f0006a2902003703a002200141206a2802002111200241f0016a200141246a10c201200241c0036a41086a2203200141a8016a290200370300200241c0036a41106a2212200141b0016a290200370300200241c0036a41186a2213200141b8016a290200370300200241a0036a41086a2214200141c8016a290200370300200241a0036a41106a2215200141d0016a290200370300200241a0036a41186a2216200141d8016a29020037030020024180036a41086a2217200141e8016a29020037030020024180036a41106a2218200141f0016a29020037030020024180036a41186a2219200141f8016a2902003703002002200141a0016a2902003703c0032002200141c0016a2902003703a0032002200141e0016a2902003703800320014190016a280200211a20024180016a20014194016a10c201200241186a221b2004290300370300200241106a22042005290300370300200241086a22052006290300370300200241d0016a41086a22062008290300370300200241d0016a41106a22082009290300370300200241d0016a41186a2209200a290300370300200241b0016a41086a220a200b290300370300200241b0016a41106a220b200c290300370300200241b0016a41186a220c200d2903003703002002200229038002370300200220022903e0023703d001200220022903c0023703b00120024190016a41186a220d201029030037030020024190016a41106a2210200f29030037030020024190016a41086a220f200e290300370300200241e0006a41186a220e2013290300370300200241e0006a41106a22132012290300370300200241e0006a41086a22122003290300370300200241c0006a41186a221c2016290300370300200241c0006a41106a22162015290300370300200241c0006a41086a22152014290300370300200220022903a00237039001200220022903c003370360200220022903a003370340200241206a41186a22142019290300370300200241206a41106a22192018290300370300200241206a41086a22182017290300370300200220022903800337032020012802042117200241c0036a200141086a10ca01200041206a2011360200200041186a2007370300200041246a20022903f0013702002000412c6a200241f0016a41086a280200360200200041306a20022903d001370300200041386a2006290300370300200041c0006a2008290300370300200041c8006a2009290300370300200041d0006a20022903b001370300200041d8006a200a290300370300200041e0006a200b290300370300200041e8006a200c290300370300200141146a280200210120004190016a201a36020020004188016a200d29030037030020004180016a2010290300370300200041f8006a200f290300370300200041f0006a2002290390013703002000419c016a20024180016a41086a28020036020020004194016a200229038001370200200041a0016a2002290360370300200041a8016a2012290300370300200041b0016a2013290300370300200041b8016a200e290300370300200041d8016a201c290300370300200041d0016a2016290300370300200041c8016a2015290300370300200041c0016a2002290340370300200041f8016a2014290300370300200041f0016a2019290300370300200041e8016a2018290300370300200041e0016a200229032037030020004198026a201b29030037030020004190026a200429030037030020004188026a200529030037030020004180026a200229030037030020002017360204200041106a2003280200360200200041086a20022903c003370200200041146a2001360200200041013602000c010b20024180026a41186a220420014198026a29000037030020024180026a41106a220520014190026a29000037030020024180026a41086a220620014188026a290000370300200220014180026a29000037038002200141186a2903002107200241e0026a41086a2208200141386a290200370300200241e0026a41106a2209200141c0006a290200370300200241e0026a41186a220a200141c8006a290200370300200241c0026a41086a220b200141d8006a290200370300200241c0026a41106a220c200141e0006a290200370300200241c0026a41186a220d200141e8006a290200370300200241a0026a41086a220e200141f8006a290200370300200241a0026a41106a220f20014180016a290200370300200241a0026a41186a221020014188016a2902003703002002200141306a2902003703e0022002200141d0006a2902003703c0022002200141f0006a2902003703a002200141206a2802002111200241f0016a200141246a10c201200241c0036a41086a2203200141a8016a290200370300200241c0036a41106a2212200141b0016a290200370300200241c0036a41186a2213200141b8016a290200370300200241a0036a41086a2214200141c8016a290200370300200241a0036a41106a2215200141d0016a290200370300200241a0036a41186a2216200141d8016a29020037030020024180036a41086a2217200141e8016a29020037030020024180036a41106a2218200141f0016a29020037030020024180036a41186a2219200141f8016a2902003703002002200141a0016a2902003703c0032002200141c0016a2902003703a0032002200141e0016a2902003703800320014190016a280200211a20024180016a20014194016a10c201200241186a221b2004290300370300200241106a22042005290300370300200241086a22052006290300370300200241d0016a41086a22062008290300370300200241d0016a41106a22082009290300370300200241d0016a41186a2209200a290300370300200241b0016a41086a220a200b290300370300200241b0016a41106a220b200c290300370300200241b0016a41186a220c200d2903003703002002200229038002370300200220022903e0023703d001200220022903c0023703b00120024190016a41186a220d201029030037030020024190016a41106a2210200f29030037030020024190016a41086a220f200e290300370300200241e0006a41186a220e2013290300370300200241e0006a41106a22132012290300370300200241e0006a41086a22122003290300370300200241c0006a41186a221c2016290300370300200241c0006a41106a22162015290300370300200241c0006a41086a22152014290300370300200220022903a00237039001200220022903c003370360200220022903a003370340200241206a41186a22142019290300370300200241206a41106a22192018290300370300200241206a41086a22182017290300370300200220022903800337032020012802042117200241c0036a200141086a10ca01200041206a2011360200200041186a2007370300200041246a20022903f0013702002000412c6a200241f0016a41086a280200360200200041306a20022903d001370300200041386a2006290300370300200041c0006a2008290300370300200041c8006a2009290300370300200041d0006a20022903b001370300200041d8006a200a290300370300200041e0006a200b290300370300200041e8006a200c290300370300200141146a280200210120004190016a201a36020020004188016a200d29030037030020004180016a2010290300370300200041f8006a200f290300370300200041f0006a2002290390013703002000419c016a20024180016a41086a28020036020020004194016a200229038001370200200041a0016a2002290360370300200041a8016a2012290300370300200041b0016a2013290300370300200041b8016a200e290300370300200041d8016a201c290300370300200041d0016a2016290300370300200041c8016a2015290300370300200041c0016a2002290340370300200041f8016a2014290300370300200041f0016a2019290300370300200041e8016a2018290300370300200041e0016a200229032037030020004198026a201b29030037030020004190026a200429030037030020004188026a200529030037030020004180026a200229030037030020002017360204200041106a2003280200360200200041086a20022903c003370200200041146a2001360200200041023602000b200241e0036a24000bc20201027f23004190026b22022400024002400240024002402001280200417f6a220341024b0d0020030e03010203010b41bf80c700412841dcbcc700102f000b2002200141186a10aa052001280204210320024180026a200141086a10ca01200141146a2802002101200041186a200241800210cf061a20002003360204200041146a200136020020004101360200200041086a200229038002370200200041106a20024180026a41086a2802003602000c020b2002200141186a10aa052001280204210320024180026a200141086a10ca01200141146a2802002101200041186a200241800210cf061a20002003360204200041146a200136020020004102360200200041086a200229038002370200200041106a20024180026a41086a2802003602000c010b20004103360200200020012902043702040b20024190026a24000beb2005027f017e157f017e137f230041e0036b220224000240024002400240024002400240024020012d0000417f6a220341034b0d0020030e0401020304010b41bf80c700412841dcbcc700102f000b2001410c6a2802002203ad4298027e2204422088a70d042004a72205417f4c0d04200141046a28020021060240024020050d00410821010c010b200510242201450d060b2002410036020820022001360200200220054198026e36020420024100200310e0012002280208210102402003450d0020034198026c2107200228020020014198026c6a21082001200341037441786a4103766a210920024190036a41386a210a20024190036a41306a210b20024190036a41286a210c20024190036a41206a210d410021030340200620036a220141d0006a280200210e200241c0026a41186a220f200141f8006a290000370300200241c0026a41106a2210200141f0006a290000370300200241c0026a41086a2205200141e8006a2900003703002002200141e0006a2900003703c002200241e0026a200141d4006a10c801200241f0026a41186a221120014198016a290000370300200241f0026a41106a221220014190016a290000370300200241f0026a41086a221320014188016a290000370300200220014180016a2900003703f002200a200141d8016a290000370300200b200141d0016a290000370300200c200141c8016a290000370300200d200141c0016a29000037030020024190036a41186a2214200141b8016a29000037030020024190036a41106a2215200141b0016a29000037030020024190036a41086a2216200141a8016a2900003703002002200141a0016a29000037039003200241106a41186a2217200141f8016a290000370300200241106a41106a2218200141f0016a290000370300200241106a41086a2219200141e8016a2900003703002002200141e0016a290000370310200141086a29030021042001290300211a200241d0036a200141106a10ce01200241f0006a41186a221b200141c4006a290000370300200241f0006a41106a221c2001413c6a290000370300200241f0006a41086a221d200141346a29000037030020022001412c6a2900003703702001418c026a211e20014180026a211f024002402001411c6a22202802000d00200241003602500c010b200241d0006a202010c8010b200241b0026a41086a2221200241d0036a41086a28020036020020024180026a41086a2222201d29030037030020024180026a41106a2223201c29030037030020024180026a41186a2224201b290300370300200241a0026a41086a2225200241d0006a41086a2220280200360200200220022903d0033703b0022002200229037037038002200220022903503703a002200141286a2802002126200241d0016a41086a22272005290300370300200241d0016a41106a22282010290300370300200241d0016a41186a2210200f290300370300200241f0016a41086a220f200241e0026a41086a280200360200200241b0016a41086a22292013290300370300200241b0016a41106a222a2012290300370300200241b0016a41186a22122011290300370300200220022903c0023703d001200220022903e0023703f001200220022903f0023703b001200241f0006a41386a2211200a290300370300200241f0006a41306a222b200b290300370300200241f0006a41286a222c200c290300370300200241f0006a41206a222d200d290300370300201b2014290300370300201c2015290300370300201d2016290300370300200241d0006a41186a22142017290300370300200241d0006a41106a2215201829030037030020202019290300370300200220022903900337037020022002290310370350200241106a201f10cc0120024190036a201e10fe042013201928020036020020052016280200360200200220022903103703f00220022002290390033703c002200820036a220120043703082001201a370300200141106a20022903b002370300200141186a20212802003602002001411c6a20022903a002370200200141246a2025280200360200200141286a20263602002001412c6a200229038002370200200141346a20222903003702002001413c6a2023290300370200200141c4006a2024290300370200200141d0006a200e360200200141dc006a200f280200360200200141d4006a20022903f001370200200141f8006a2010290300370300200141f0006a2028290300370300200141e8006a2027290300370300200141e0006a20022903d00137030020014198016a201229030037030020014190016a202a29030037030020014188016a202929030037030020014180016a20022903b001370300200141d8016a2011290300370300200141d0016a202b290300370300200141c8016a202c290300370300200141c0016a202d290300370300200141b8016a201b290300370300200141b0016a201c290300370300200141a8016a201d290300370300200141a0016a2002290370370300200141f8016a2014290300370300200141f0016a2015290300370300200141e8016a2020290300370300200141e0016a200229035037030020014188026a201328020036020020014180026a20022903f00237030020014194026a20052802003602002001418c026a20022903c002370200200720034198026a2203470d000b200941016a21010b200041013a0000200041046a20022903003702002000410c6a20013602000c030b20024180026a41186a200141d4006a29000037030020024180026a41106a200141cc006a29000037030020024180026a41086a200141c4006a29000037030020022001413c6a290000370380020240024002400240200141dc006a2d00000e03010200010b200241c0026a41186a200141f5006a290000370300200241c0026a41106a200141ed006a290000370300200241c0026a41086a200141e5006a2900003703002002200141dd006a2900003703c002410221030c020b200241c0026a41186a200141f5006a290000370300200241c0026a41106a200141ed006a290000370300200241c0026a41086a200141e5006a2900003703002002200141dd006a2900003703c002410021030c010b200241c0026a41186a200141f5006a290000370300200241c0026a41106a200141ed006a290000370300200241c0026a41086a200141e5006a2900003703002002200141dd006a2900003703c002410121030b200241c8036a200141b5016a290000370300200241c0036a200141ad016a290000370300200241b8036a200141a5016a290000370300200241b0036a2001419d016a29000037030020024190036a41186a20014195016a29000037030020024190036a41106a2001418d016a29000037030020024190036a41086a20014185016a2900003703002002200141fd006a290000370390030240024002400240200141bd016a2d00000e03010200010b200241f0026a41186a200141d6016a290000370300200241f0026a41106a200141ce016a290000370300200241f0026a41086a200141c6016a2900003703002002200141be016a2900003703f002410221050c020b200241f0026a41186a200141d6016a290000370300200241f0026a41106a200141ce016a290000370300200241f0026a41086a200141c6016a2900003703002002200141be016a2900003703f002410021050c010b200241f0026a41186a200141d6016a290000370300200241f0026a41106a200141ce016a290000370300200241f0026a41086a200141c6016a2900003703002002200141be016a2900003703f002410121050b200241106a41386a221320014196026a290000370300200241106a41306a221b2001418e026a290000370300200241106a41286a221c20014186026a290000370300200241106a41206a221d200141fe016a290000370300200241106a41186a2216200141f6016a290000370300200241106a41106a2219200141ee016a290000370300200241106a41086a2220200141e6016a2900003703002002200141de016a2900003703102001280204210a200241d0036a200141086a10ca01200241d0016a41086a220b20024180026a41086a290300370300200241d0016a41106a220c20024180026a41106a290300370300200241d0016a41186a220d20024180026a41186a290300370300200241b0016a41086a220e200241c0026a41086a290300370300200241b0016a41106a220f200241c0026a41106a290300370300200241b0016a41186a2210200241c0026a41186a290300370300200241f0006a41386a221120024190036a41386a290300370300200241f0006a41306a221220024190036a41306a290300370300200241f0006a41286a221420024190036a41286a290300370300200241f0006a41206a221520024190036a41206a290300370300200241f0006a41186a221720024190036a41186a290300370300200241f0006a41106a221820024190036a41106a290300370300200241f0006a41086a221e20024190036a41086a29030037030020022002290380023703d001200220022903c0023703b0012002200229039003370370200141146a2902002104200241d0006a41186a221f200241f0026a41186a290300370300200241d0006a41106a2221200241f0026a41106a290300370300200241d0006a41086a2222200241f0026a41086a290300370300200220022903f002370350200041046a200a360200200041086a20022903d003370200200041106a200241d0036a41086a280200360200200041146a20043702002000411c6a2001411c6a290000370000200041246a200141246a2900003700002000412c6a2001412c6a290000370000200041346a200141346a2900003700002000413c6a20022903d001370200200041c4006a200b290300370200200041cc006a200c290300370200200041d4006a200d290300370200200041dc006a20033a0000200041f5006a2010290300370000200041ed006a200f290300370000200041e5006a200e290300370000200041dd006a20022903b001370000200041b5016a2011290300370000200041ad016a2012290300370000200041a5016a20142903003700002000419d016a201529030037000020004195016a20172903003700002000418d016a201829030037000020004185016a201e290300370000200041fd006a2002290370370000200041bd016a20053a0000200041d6016a201f290300370000200041ce016a2021290300370000200041c6016a2022290300370000200041be016a200229035037000020004196026a20132903003700002000418e026a201b29030037000020004186026a201c290300370000200041fe016a201d290300370000200041f6016a2016290300370000200041ee016a2019290300370000200041e6016a2020290300370000200041de016a2002290310370000200041023a00000c020b200041033a000020002001290001370001200041306a200141306a290300370300200041286a200141286a290300370300200041246a200141246a280200360200200041096a200141096a290000370000200041116a200141116a290000370000200041196a200141196a2900003700000c010b200141046a280200210320024190036a200141086a10c801200041046a2003360200200041043a0000200041086a200229039003370200200041106a20024190036a41086a2802003602000b200241e0036a24000f0b1034000b1033000b902904057f067e087f037e23004180046b2202240002400240024002400240024002400240024002400240024020012d0000417f6a220341084b0d0020030e09010203040506070809010b41bf80c700412841dcbcc700102f000b200241206a200141196a290000370300200241186a200141116a290000370300200241106a200141096a2900003703002002200129000137030841b00210242203450d0902400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200141246a28020022012802000e170102030405060b0708090a0b0c0d0e0f10111213141500010b200241286a200141086a108d03200341086a200241286a41c80010cf061a200341163602000c150b200241286a200141086a108e0320034100360200200341186a200241286a41106a290300370300200341106a200241286a41086a290300370300200320022903283703080c140b200241286a200141086a108f03200341086a200241286a41a00210cf061a200341013602000c130b200341023602002003200141086a2903003703080c120b02400240024002400240024002400240024020012d0004417f6a220441044b0d00200141046a210520040e050102030405010b41bf80c700412841dcbcc700102f000b200141086a2802002104410121060c040b41022106200241d0026a41026a200541036a2d00003a0000200241286a41086a200141146a290000370300200241386a2001411c6a290000370300200241c0006a200141246a2d00003a0000200220052f00013b01d00220022001410c6a290000370328200141086a2800002104200141286a28020021010c040b200141086a2802002104410321060c020b200241d2026a200541036a2d00003a0000200241286a41086a200141146a290000370300200241386a2001411c6a290000370300200241c0006a200141246a2d00003a0000200220052f00013b01d00220022001410c6a29000037032820012d00254100472105200141086a2800002104200141286a2802002101410421060c030b200141086a2802002104410521060b0b0b200320063a0004200320022f01d0023b0005200320043602082003200229032837020c200320053a002520032001360228200320022f01f0033b0126200341076a200241d2026a2d00003a0000200341146a200241306a2903003702002003411c6a200241386a290300370200200341246a200241c0006a2d00003a0000200341033602000c110b02400240024002400240024002400240200141086a22042d0000417f6a220641034b0d0020060e0401020304010b41bf80c700412841dcbcc700102f000b200241306a200441096a290000370300200241386a200441116a290000370300200241c0006a200441196a29000037030020022004290001370328200141386a2903002107200141306a2903002108410121010c030b200241306a200441096a290000370300200241386a200441116a290000370300200241c0006a200441196a29000037030020022004290001370328200141c8006a2903002109200141c0006a290300210a200141386a2903002107200141306a2903002108410221010c030b200241306a200441096a290000370300200241386a200441116a290000370300200241c0006a200441196a290000370300200220042900013703282002200441216a2800003602d0022002200441246a2800003600d302200141c8006a3100002109200141c0006a290000210a200141386a2900002107200141306a2900002108200141d8006a290300210b200141d0006a290300210c410321010c030b200241306a200441096a290000370300200241386a200441116a290000370300200241c0006a200441196a29000037030020022004290001370328200141386a2903002107200141306a2903002108410421010b0b0b2003200c3703502003200a37034020032008370330200320013a000820032002290328370009200320022802d00236002920034104360200200341d8006a200b370300200341c8006a2009370300200341386a20073703002003412c6a20022800d302360000200341116a200241306a290300370000200341196a200241386a290300370000200341216a200241c0006a2903003700000c100b200241286a200141046a10c001200341053602002003410c6a200241306a280200360200200320022903283702040c0f0b024002402001280204450d00200241d0026a41186a200141286a290000370300200241d0026a41106a200141206a290000370300200241d8026a200141186a290000370300200241d0026a41286a200141386a290000370300200241d0026a41306a200141c0006a290000370300200241d0026a41386a200141c8006a290000370300200241d0026a41c8006a200141d8006a290000370300200241d0026a41d0006a200141e0006a290000370300200241d0026a41d8006a200141e8006a2900003703002002200141106a2900003703d0022002200141306a2900003703f0022002200141d0006a29000037039003200241d0026a41f8006a20014188016a290000370300200241d0026a41f0006a20014180016a290000370300200241d0026a41e8006a200141f8006a290000370300200241d0026a4198016a200141a8016a290000370300200241d0026a4190016a200141a0016a290000370300200241d0026a4188016a20014198016a2900003703002002200141f0006a2900003703b003200220014190016a2900003703d003200241286a200141046a10c801200241346a200241d0026a41a00110cf061a0c010b200241003602280b200341046a200241286a41ac0110cf061a200341073602000c0e0b20034108360200200320012802043602040c0d0b200241286a200141086a109003200341086a200241286a41980210cf061a200341093602000c0c0b20012802042105200241286a200141086a10c801200241f0036a200141146a10d001200241286a41146a200241f0036a41086a280200360200200220022903f003370234200241d0026a41086a220d200241286a41086a2204290300370300200241d0026a41106a220e200241286a41106a2206290300370300200220022903283703d002200141206a2902002107200141286a280200210f2004200141346a29000037030020062001413c6a290000370300200241286a41186a2210200141c4006a290000370300200241286a41206a2211200141cc006a290000370300200241286a41286a2212200141d4006a290000370300200241d8006a2213200141dc006a290000370300200241e0006a2214200141e4006a2900003703002001412c6a2900002108200320053602042003200f3602282003200737022020022008370328200320022903d002370208200341106a200d290300370200200341186a200e290300370200200341e4006a2014290300370200200341dc006a2013290300370200200341d4006a2012290300370200200341cc006a2011290300370200200341c4006a20102903003702002003413c6a2006290300370200200341346a20042903003702002003200229032837022c2003410a3602000c0b0b108103000b200241286a200141086a109103200341086a200241286a41a00210cf061a2003410c3602000c090b2003410d3602000c080b200241286a200141046a10b702200341046a200241286a41c80010cf061a2003410e3602000c070b024002400240024020012f0104417f6a220441014b0d0020040e020102010b41bf80c700412841dcbcc700102f000b200241286a200141086a10c401200229022c210720022802282104410121010c010b20012f0106210641b00210242204450d112004200141086a28020010c601410221010b2003200737020c20032004360208200320063b0106200320013b01042003410f3602000c060b200241286a200141086a10d002200341086a200241286a41a80210cf061a200341103602000c050b200241286a200141046a109203200341046a200241286a41c40010cf061a200341113602000c040b02400240024002400240200141086a22042d0000417f6a220e41034b0d0042002109410121054200210c200e0e0404010203040b41bf80c700412841dcbcc700102f000b200241c0006a200441196a290000370300200241386a200441116a290000370300200241306a200441096a2900003703002002200429000137032842002109410221054200210c0c020b200241306a200441096a290000370300200241386a200441116a290000370300200241c0006a200441196a29000037030020022004290001370328200141c8006a290300210b200141c0006a290300210a200141386a2903002115200141306a2903002116200141d0006a280200210d42002109410321054200210c0c010b200241306a200441096a290000370300200241386a200441116a290000370300200241c0006a200441196a290000370300200220042900013703282002200441216a2800003602d0022002200441246a2800003600d302200141d0006a2903002217428080808070832109200141d8006a290300210c200141c8006a310000210b200141c0006a290000210a200141386a2900002115200141306a2900002116200141e8006a2903002108200141e0006a2903002107200141f0006a28020021062017a7210d410421050b200320073703602003200a37034020032016370330200320053a000820032002290328370009200320022802d00236002920032006360270200341e8006a2008370300200341d8006a200c370300200341c8006a200b370300200341386a20153703002003412c6a20022800d30236000020032009200dad84370350200341116a200241306a290300370000200341196a200241386a290300370000200341216a200241c0006a290300370000200341123602000c030b200241286a200141046a10930320034113360200200341246a200241c8006a2802003602002003411c6a200241c0006a290300370200200341146a200241386a2903003702002003410c6a200241306a290300370200200320022903283702040c020b200241286a200141086a10940320034114360200200341286a200241286a41206a290300370300200341206a200241286a41186a290300370300200341186a200241286a41106a290300370300200341106a200241286a41086a290300370300200320022903283703080c010b024002400240024002400240024020012d0004417f6a221141054b0d004104210d20110e06010203060405010b41bf80c700412841dcbcc700102f000b200241286a41086a2206200141106a290000370300200241286a41106a2205200141186a290000370300200241286a41156a220d2001411d6a2900003700002002200141086a29000037032820012f0006210f20012d0005210e20012d0025211041b00210242204450d0f2004200141286a280200109503200241d0026a41156a200d290000370000200241d0026a41106a2005290300370300200241d0026a41086a2006290300370300200220022903283703d0024101210d0c040b200241d0026a41086a200141106a290000370300200241d0026a41106a200141186a290000370300200241e5026a2001411d6a2900003700002002200141086a2900003703d00220012f0006210f20012d0005210e20012d002521104102210d0c030b200241d0026a41086a200141106a290000370300200241d0026a41106a200141186a290000370300200241e5026a2001411d6a2900003700002002200141086a2900003703d00220012f0006210f20012d0005210e20012d002521104103210d0c020b20012f0106210f20012d0005210e4105210d0c010b200241d0026a41086a200141106a290000370300200241d0026a41106a200141186a290000370300200241e5026a2001411d6a2900003700002002200141086a2900003703d0022001412c6a2802002105200141286a280200210420012f0006210f20012d0005210e20012f0126210620012d002521104106210d0b2003200f3b01062003200e3a00052003200d3a0004200320022903d0023702082003200536022c20032004360228200320063b0126200320103a002520034115360200200341106a200241d8026a290300370200200341186a200241d0026a41106a2903003702002003411d6a200241d0026a41156a2900003700000b20002002290308370001200041013a0000200041246a2003360200200041196a200241206a290300370000200041116a200241186a290300370000200041096a200241106a2903003700000c080b200041023a000020002001290001370001200041196a200141196a290000370000200041116a200141116a290000370000200041096a200141096a290000370000200041216a200141216a290000370000200041296a200141296a290000370000200041316a200141316a290000370000200041396a200141396a2900003700000c070b200241286a200141046a10c301200041033a0000200041046a20022903283702002000410c6a200241306a280200360200200041106a200141106a280200360200200041026a200141026a2f01003b01000c060b200041043a000020002001290001370001200041196a200141196a290000370000200041116a200141116a290000370000200041096a200141096a2900003700000c050b200041053a000020002001290001370001200041196a200141196a290000370000200041116a200141116a290000370000200041096a200141096a290000370000200041216a200141216a290000370000200041296a200141296a290000370000200041316a200141316a290000370000200041396a200141396a2900003700000c040b200041063a000020002001290001370001200041196a200141196a290000370000200041116a200141116a290000370000200041096a200141096a2900003700000c030b200041073a000020002001290001370001200041196a200141196a290000370000200041116a200141116a290000370000200041096a200141096a2900003700000c020b200041083a00000c010b200041093a000020002001290001370001200041196a200141196a290000370000200041116a200141116a290000370000200041096a200141096a2900003700000b20024180046a24000f0b102c000b910601077f230041106b2202240002400240024002400240024002400240024020012d0000417f6a220341054b0d0020030e06010203040506010b41bf80c700412841dcbcc700102f000b200141106a28020021042001410c6a2802002105200141086a2802002106200141046a280200210720012d0001210841b00210242203450d062003200141146a28020010df03200041106a20043602002000410c6a2005360200200041086a2006360200200041046a2007360200200041146a2003360200200020083a0001200041013a00000c050b200041023a0000200041046a200141046a2902003702000c040b2002200141046a10c8012001411c6a2802002104200141186a2802002105200141146a2802002106200141106a280200210720012d0001210841b00210242203450d042003200141206a28020010df032000411c6a2004360200200041186a2005360200200041146a2006360200200041106a2007360200200041206a2003360200200020083a0001200041033a00002000410c6a200241086a280200360200200041046a20022903003702000c030b2002200141046a10c801200041043a00002000410c6a200241086a280200360200200041046a20022903003702000c020b200141106a28020021042001410c6a2802002105200141086a2802002106200141046a280200210720012d0001210841b00210242203450d022003200141146a28020010df03200041106a20043602002000410c6a2005360200200041086a2006360200200041046a2007360200200041146a2003360200200020083a0001200041053a00000c010b2002200141046a10c8012001411c6a2802002104200141186a2802002105200141146a2802002106200141106a280200210720012d0001210841b00210242203450d012003200141206a28020010df032000411c6a2004360200200041186a2005360200200041146a2006360200200041106a2007360200200041206a2003360200200020083a0001200041063a00002000410c6a200241086a280200360200200041046a20022903003702000b200241106a24000f0b102c000b940301057f230041206b22022400024002400240024002400240024020012d0000417f6a220341034b0d0020030e0401020304010b41bf80c700412841dcbcc700102f000b41b00210242203450d042003200141046a280200108905200041013a0000200041046a20033602000c030b41b00210242203450d032003200141046a280200108905200041046a2003360200200041023a0000200041086a200141086a2903003703000c020b200041033a000020002001290001370001200041196a200141196a290000370000200041116a200141116a290000370000200041096a200141096a2900003700000c010b200241186a2204200141196a290000370300200241106a2205200141116a290000370300200241086a2206200141096a2900003703002002200129000137030041b00210242203450d012003200141246a280200108905200041246a2003360200200041043a0000200041196a2004290300370000200041116a2005290300370000200041096a2006290300370000200020022903003700010b200241206a24000f0b102c000b942205047f067e017f037e047f230041e0036b2202240002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012802000e170102030405060b0708090a0b0c0d0e0f10111213141500010b200241086a200141086a108d03200041086a200241086a41c80010cf061a200041163602000c150b200241086a200141086a108e0320004100360200200041186a200241086a41106a290300370300200041106a200241086a41086a290300370300200041086a20022903083703000c140b200241086a200141086a108f03200041086a200241086a41a00210cf061a200041013602000c130b20004102360200200041086a200141086a2903003703000c120b02400240024002400240024002400240024020012d0004417f6a220341044b0d00200141046a210420030e050102030405010b41bf80c700412841dcbcc700102f000b200141086a2802002103410121050c040b41022105200241b0026a41026a200441036a2d00003a0000200241086a41086a200141146a290200370300200241186a2001411c6a290200370300200241206a200141246a2d00003a0000200220042f00013b01b00220022001410c6a290200370308200141086a2802002103200141286a28020021010c040b200141086a2802002103410321050c020b200241b2026a200441036a2d00003a0000200241086a41086a200141146a290200370300200241186a2001411c6a290200370300200241206a200141246a2d00003a0000200220042f00013b01b00220022001410c6a29020037030820012d00254100472104200141086a2802002103200141286a2802002101410421050c030b200141086a2802002103410521050b0b0b200020053a0004200020022f01b0023b0005200020043a0025200020022f01d0033b0126200041086a20033602002000410c6a2002290308370200200041286a2001360200200041076a200241b2026a2d00003a0000200041146a200241086a41086a2903003702002000411c6a200241186a290300370200200041246a200241206a2d00003a0000200041033602000c110b02400240024002400240024002400240200141086a22032d0000417f6a220541034b0d0020050e0401020304010b41bf80c700412841dcbcc700102f000b200241106a200341096a290000370300200241186a200341116a290000370300200241206a200341196a29000037030020022003290001370308200141386a2903002106200141306a2903002107410121010c030b200241106a200341096a290000370300200241186a200341116a290000370300200241206a200341196a29000037030020022003290001370308200141c8006a2903002108200141c0006a2903002109200141386a2903002106200141306a2903002107410221010c030b200241106a200341096a290000370300200241186a200341116a290000370300200241206a200341196a290000370300200220032900013703082002200341216a2800003602b0022002200341246a2800003600b302200141c8006a3100002108200141c0006a2902002109200141386a2902002106200141306a2902002107200141d8006a290300210a200141d0006a290300210b410321010c030b200241106a200341096a290000370300200241186a200341116a290000370300200241206a200341196a29000037030020022003290001370308200141386a2903002106200141306a2903002107410421010b0b0b20002002290308370009200020022802b00236002920004104360200200041d8006a200a370300200041d0006a200b370300200041c8006a2008370300200041c0006a2009370300200041386a2006370300200041306a2007370300200041086a20013a00002000412c6a20022800b302360000200041116a200241086a41086a290300370000200041196a200241186a290300370000200041216a200241206a2903003700000c100b200241086a200141046a10c001200041053602002000410c6a200241106a280200360200200020022903083702040c0f0b024002402001280204450d00200241b0026a41186a200141286a290000370300200241b0026a41106a200141206a290000370300200241b8026a200141186a290000370300200241b0026a41286a200141386a290000370300200241b0026a41306a200141c0006a290000370300200241b0026a41386a200141c8006a290000370300200241b0026a41c8006a200141d8006a290000370300200241b0026a41d0006a200141e0006a290000370300200241b0026a41d8006a200141e8006a2900003703002002200141106a2900003703b0022002200141306a2900003703d0022002200141d0006a2900003703f002200241b0026a41f8006a20014188016a290000370300200241b0026a41f0006a20014180016a290000370300200241b0026a41e8006a200141f8006a290000370300200241b0026a4198016a200141a8016a290000370300200241b0026a4190016a200141a0016a290000370300200241b0026a4188016a20014198016a2900003703002002200141f0006a29000037039003200220014190016a2900003703b003200241086a200141046a10c801200241146a200241b0026a41a00110cf061a0c010b200241003602080b200041046a200241086a41ac0110cf061a200041073602000c0e0b20004108360200200020012802043602040c0d0b200241086a200141086a109003200041086a200241086a41980210cf061a200041093602000c0c0b20012802042103200241086a200141086a10c801200241d0036a200141146a10d001200241086a41146a200241d0036a41086a280200360200200220022903d003370214200241b0026a41106a200241086a41106a2903002206370300200241b0026a41086a200241086a41086a29030022073703002002200229030822083703b002200141206a2902002109200141286a280200210520002003360204200041086a2008370200200041106a2007370200200041186a2006370200200041286a2005360200200041206a20093702002000412c6a2001412c6a290200370200200041346a200141346a2902003702002000413c6a2001413c6a290200370200200041c4006a200141c4006a290200370200200041cc006a200141cc006a290200370200200041d4006a200141d4006a290200370200200041dc006a200141dc006a290200370200200041e4006a200141e4006a2902003702002000410a3602000c0b0b108103000b200241086a200141086a109103200041086a200241086a41a00210cf061a2000410c3602000c090b2000410d3602000c080b200241086a200141046a10b702200041046a200241086a41c80010cf061a2000410e3602000c070b024002400240024020012f0104417f6a220341014b0d0020030e020102010b41bf80c700412841dcbcc700102f000b200241086a200141086a10c401200229020c210620022802082103410121010c010b20012f0106210541b00210242203450d082003200141086a28020010c601410221010b200020013b01042000410f3602002000410c6a2006370200200041086a2003360200200041066a20053b01000c060b200241086a200141086a10d002200041086a200241086a41a80210cf061a200041103602000c050b200241086a200141046a109203200041046a200241086a41c40010cf061a200041113602000c040b02400240024002400240200141086a22032d0000417f6a220c41034b0d00420021064101210542002109200c0e0404010203040b41bf80c700412841dcbcc700102f000b200241206a200341196a290000370300200241186a200341116a290000370300200241106a200341096a290000370300200220032900013703084200210641022105420021090c020b200241106a200341096a290000370300200241186a200341116a290000370300200241206a200341196a29000037030020022003290001370308200141c8006a2903002108200141c0006a2903002107200141386a290300210d200141306a290300210e200141d0006a28020021044200210641032105420021090c010b200241106a200341096a290000370300200241186a200341116a290000370300200241206a200341196a290000370300200220032900013703082002200341216a2800003602b0022002200341246a2800003600b302200141d0006a290300220f428080808070832106200141d8006a2903002109200141c8006a3100002108200141c0006a2902002107200141386a290200210d200141306a290200210e200141e8006a290300210b200141e0006a290300210a200141f0006a2802002110200fa72104410421050b20002002290308370009200020022802b002360029200041e8006a200b370300200041e0006a200a370300200041d8006a2009370300200041c8006a2008370300200041c0006a2007370300200041386a200d370300200041306a200e370300200041086a20053a00002000412c6a20022800b302360000200041f0006a2010360200200041d0006a20062004ad84370300200041116a200241086a41086a290300370000200041196a200241186a290300370000200041216a200241206a290300370000200041123602000c030b200241086a200141046a10930320004113360200200041246a200241286a2802003602002000411c6a200241206a290300370200200041146a200241186a2903003702002000410c6a200241106a290300370200200020022903083702040c020b200241086a200141086a10940320004114360200200041286a200241086a41206a290300370300200041206a200241086a41186a290300370300200041186a200241086a41106a290300370300200041106a200241086a41086a290300370300200041086a20022903083703000c010b024002400240024002400240024020012d0004417f6a221141054b0d004104210520110e06010203060405010b41bf80c700412841dcbcc700102f000b200241086a41086a2205200141106a290000370300200241086a41106a2212200141186a290000370300200241086a41156a22132001411d6a2900003700002002200141086a29000037030820012f0006211020012d0005210420012d0025210c41b00210242203450d062003200141286a280200109503200241b0026a41156a2013290000370000200241b0026a41106a2012290300370300200241b0026a41086a2005290300370300200220022903083703b002410121050c040b200241b0026a41086a200141106a290200370300200241b0026a41106a200141186a290200370300200241c5026a2001411d6a2900003700002002200141086a2902003703b00220012f0006211020012d0005210420012d0025210c410221050c030b200241b0026a41086a200141106a290200370300200241b0026a41106a200141186a290200370300200241c5026a2001411d6a2900003700002002200141086a2902003703b00220012f0006211020012d0005210420012d0025210c410321050c020b20012f0106211020012d00052104410521050c010b200241b0026a41086a200141106a290200370300200241b0026a41106a200141186a290200370300200241c5026a2001411d6a2900003700002002200141086a2902003703b0022001412c6a2802002113200141286a280200210320012f0006211020012d0005210420012f0126211220012d0025210c410621050b200020043a0005200020053a00042000200c3a002520004115360200200041066a20103b0100200041086a20022903b0023702002000412c6a2013360200200041286a2003360200200041266a20123b0100200041106a200241b0026a41086a290300370200200041186a200241b0026a41106a2903003702002000411d6a200241b0026a41156a2900003700000b200241e0036a24000f0b102c000b13002000410e360204200041f0a6c2003602000b920301057f230041d0006b22022400200241938cc700410710fb01200241106a41e4eec100410810fb012002200136022c200241306a2002412c6a410410bc02200241cc006a2002412c6a41046a3602002002200241c0006a36024420022002412c6a3602482002200241306a360240200241206a200241c0006a1073024002402002280228220341206a2204417f4c0d000240024020040d0041012101410021040c010b200410242201450d020b20002001360200200041086a220141003602002000200436020420004100411010c9012000280200200128020022046a220520022900003700002001200441106a2204360200200541086a200241086a29000037000020002004411010c9012000280200200128020022046a220520022900103700002001200441106a2206360200200541086a200241106a41086a2900003700002002280220210420002006200310c9012000280200200128020022006a2004200310cf061a2001200020036a36020002402002280224450d00200410260b200241d0006a24000f0b1034000b1033000b9a1a01047f024002402000280200220141154b0d000240024002400240024002400240024002400240024002400240024020010e1600010f0f0f020f030f04050f060f0708090a0f0b0c0d000b200041086a280200417e6a220141074b0d0e02400240024002400240024020010e080014010214030405000b200041106a280200450d132000410c6a28020010260f0b200041106a280200450d122000410c6a28020010260f0b200041106a280200450d112000410c6a28020010260f0b0240200041146a2802002202450d002000410c6a2802002101200241186c210203400240200141046a280200450d00200128020010260b0240200141106a280200450d002001410c6a28020010260b200141186a2101200241686a22020d000b0b200041106a2802002201450d10200141186c450d10200028020c10260f0b0240200041146a2802002202450d002000410c6a28020021012002410c6c210203400240200141046a280200450d00200128020010260b2001410c6a2101200241746a22020d000b0b200041106a2802002201450d0f2001410c6c450d0f200028020c10260f0b200041106a280200450d0e2000410c6a28020010260f0b0240200041086a280200220141014b0d00024020010e020f000f0b2000412c6a220210d6010240200041306a2802002201450d00200141246c450d00200228020010260b2000419c016a220210d6010240200041a0016a2802002201450d00200141246c450d00200228020010260b0240200041186a2802002202450d00200041106a28020021012002410c6c210203400240200141046a280200450d00200128020010260b2001410c6a2101200241746a22020d000b0b200041146a2802002201450d0e2001410c6c450d0e200028021010260f0b2000412c6a220210d6010240200041306a2802002201450d00200141246c450d00200228020010260b2000419c016a220210d6010240200041a0016a2802002201450d00200141246c450d00200228020010260b0240200041186a2802002202450d00200041106a28020021012002410c6c210203400240200141046a280200450d00200128020010260b2001410c6a2101200241746a22020d000b0b200041146a2802002201450d0d2001410c6c450d0d200028021010260f0b02402000410c6a2802002201450d00200141f0006c2102200028020441046a21010340200110d6010240200141046a2802002203450d00200341246c450d00200128020010260b200141f0006a2101200241907f6a22020d000b0b200041086a2802002201450d0c200141f0006c450d0c200028020410260f0b20002802042201450d0b200041086a280200450d0b200110260f0b200041086a280200417f6a220141014b0d0a0240024020010e020001000b0240200041186a2802002202450d00200041106a28020021012002410c6c210203400240200141046a280200450d00200128020010260b2001410c6a2101200241746a22020d000b0b200041146a2802002201450d0b2001410c6c450d0b200028021010260f0b0240200041186a2802002202450d00200041106a28020021012002410c6c210203400240200141046a280200450d00200128020010260b2001410c6a2101200241746a22020d000b0b200041146a2802002201450d0a2001410c6c450d0a200028021010260f0b02402000410c6a280200450d00200041086a28020010260b02402000411c6a2802002202450d00200041146a28020021012002410c6c210203400240200141046a280200450d00200128020010260b2001410c6a2101200241746a22020d000b0b200041186a2802002201450d092001410c6c450d09200028021410260f0b0240200041086a2d0000220141034b0d000240024020010e040b00010b0b0b0240200041146a2802002201450d002000410c6a280200220320014198026c6a210403400240200341d8006a280200450d00200328025410260b0240200341186a2802002202450d00200328021021012002410474210203400240200141046a280200450d00200128020010260b200141106a2101200241706a22020d000b0b0240200341146a28020041ffffffff0071450d00200328021010260b0240200328021c2201450d00200341206a280200450d00200110260b024020034184026a2802002201450d00200141c1006c450d0020032802800210260b20034198026a210120034190026a4100360200200328028c0221022003410136028c02024020034194026a280200450d00200210260b2001210320012004470d000b0b200041106a2802002201450d0a20014198026c450d0a200028020c10260f0b0240200041186a2802002202450d00200041106a28020021012002410c6c210203400240200141046a280200450d00200128020010260b2001410c6a2101200241746a22020d000b0b200041146a2802002201450d092001410c6c450d09200028021010260f0b200041146a280200450d08200041106a28020010260f0b20002d0004417f6a220141034b0d070240024020010e0400090901000b0240200041106a280200450d002000410c6a28020010260b2000411c6a280200450d08200041186a28020010260f0b02402000410c6a280200450d00200041086a28020010260b200041186a280200450d07200041146a28020010260f0b024020002f0104220141014b0d00024020010e020800080b0240200041106a2802002202450d00200041086a2802002101200241b0026c21020340200110d501200141b0026a2101200241d07d6a22020d000b0b2000410c6a2802002201450d07200141b0026c450d07200028020810260f0b200041086a2201280200109803200128020010260f0b200041086a2d0000417e6a2201410b4b0d05024002400240024020010e0c000109090909090909090203000b0240200041146a2802002202450d002000410c6a2802002201200241c8006c6a21020340024020012d00004101470d00200141086a280200450d00200141046a28020010260b0240200141246a2d00004101470d002001412c6a280200450d00200141286a28020010260b200141c8006a22012002470d000b0b0240200041106a2802002201450d00200141c8006c450d00200028020c10260b0240200041186a2d00004101470d00200041206a280200450d002000411c6a28020010260b02402000413c6a2d00004101470d00200041c4006a280200450d00200041c0006a28020010260b0240200041e0006a2d00004101470d00200041e8006a280200450d00200041e4006a28020010260b024020004184016a2d00004101470d002000418c016a280200450d0020004188016a28020010260b0240200041a8016a2d00004101470d00200041b0016a280200450d00200041ac016a28020010260b0240200041cc016a2d00004101470d00200041d4016a280200450d00200041d0016a28020010260b200041f0016a2d00004101470d08200041f8016a280200450d08200041f4016a28020010260f0b0240200041146a2802002201450d00200141c4006c21022000410c6a28020041286a210103400240200141786a2d00004101470d002001280200450d002001417c6a28020010260b200141c4006a2101200241bc7f6a22020d000b0b200041106a2802002201450d07200141c4006c450d07200028020c10260f0b2000412c6a2d00004101470d06200041346a280200450d06200041306a28020010260f0b2000412c6a2d00004101470d05200041346a280200450d05200041306a28020010260f0b20002d0004417f6a220141024b0d040240024020010e03000601000b200041286a2201280200109803200128020010260f0b2000410c6a28020041ffffff3f71450d04200041086a28020010260f0b024020002d0004220141054b0d00024002400240024020010e06080008010203080b200041186a2201280200109803200128020010260f0b02402000410c6a280200450d00200041086a28020010260b200041246a2201280200109803200128020010260f0b2000410c6a280200450d05200041086a28020010260c050b200041186a2201280200109803200128020010260f0b02402000410c6a280200450d00200041086a28020010260b200041246a2201280200109803200128020010260f0b0240200041086a2d0000220141034b0d000240024020010e0405000105050b2000410c6a2201280200109803200128020010260f0b2000410c6a2201280200109803200128020010260f0b2000412c6a2201280200109803200128020010260f0b20002d00044101470d01200041286a2201280200109803200128020010260f0b0240200041086a2d0000220141034b0d0002400240024020010e0404000102040b0240200041106a28020041ffffff3f71450d002000410c6a28020010260b200041186a2201280200109803200128020010260f0b0240200041106a28020041ffffff3f71450d002000410c6a28020010260b200041286a280200450d02200041246a28020010260f0b200041306a28020041ffffff3f71450d012000412c6a28020010260f0b200041306a28020041ffffff3f71450d002000412c6a28020010260f0b0ba00403027f017e047f230041306b22032400200341086a200141086a28020022043602002003200129020022053703002005a72106024002400240024020040d00410021070c010b200441057421084100210941002107200621010240034002402009450d0020092001412010d2064100480d00200341106a410610ec02200041013602002000410c6a200341186a280200360200200020032903103702040c020b0240024020012002412010d206220941004a0d0020022001460d012009450d01200741016a21070b20012109200141206a2101200841606a2208450d030c010b0b200341106a410710ec02200041013602002000410c6a200341186a280200360200200020032903103702040b200328020441ffffff3f71450d01200610260c010b200341106a41186a200241186a290000370300200341106a41106a200241106a290000370300200341106a41086a200241086a2900003703002003200229000037031020042007490d01024020042003280204470d00200320044101109301200328020021060b200620074105746a220141206a2001200420076b41057410d0061a200141186a200341106a41186a290300370000200141106a200341106a41106a290300370000200141086a200341106a41086a290300370000200120032903103700002003200441016a22013602082000410c6a200136020020002003290300370204200041003602000b200341306a24000f0b20072004103b000be03f07077f037e017f017e027f027e077f230041c00d6b2209240002400240024002400240024002400240024002400240024002400240024002400240024002400240200241ffff03714102490d0002400240024002400240200341086a280200220a450d00200a41e4004f0d01200941b0046a41086a220b200341086a280200360200200920032902003703b004200941c80a6a41186a200141186a290000370300200941c80a6a41106a200141106a290000370300200941c80a6a41086a220c200141086a290000370300200920012900003703c80a20094190076a200941b0046a200941c80a6a1099034101210d2009280290074101460d0220094190076a41086a220d280200210e200928029407210f200c20094190076a410c6a280200360200200920023b01d40a2009200f3602cc0a200941ccb7c5003602c80a200941e0066a200941c80a6a10f702200941083a00e80a2009410b3a00e80a2009410c3a00e80a200920092f00e0063b01c80a200920092800e2063601ca0a200920092d00e6063a00ce0a200920092800e7063600cf0a200920092d00eb063a00d30a2009410d3a00e80a200920092d00ec063a00d40a2009410e3a00e80a200920092d00ed063a00d50a2009410f3a00e80a200920092d00ee063a00d60a200920092d00ef063a00d70a200941103a00e80a200941113a00e80a200920092d00f0063a00d80a200941123a00e80a200920092d00f1063a00d90a200941133a00e80a200920092d00f2063a00da0a200941143a00e80a200920092d00f3063a00db0a200941153a00e80a200920092d00f4063a00dc0a200941163a00e80a200920092d00f5063a00dd0a200941173a00e80a200920092d00f6063a00de0a200920092d00f7063a00df0a200941183a00e80a200941193a00e80a200920092d00f8063a00e00a2009411a3a00e80a200920092d00f9063a00e10a2009411b3a00e80a200920092d00fa063a00e20a2009411c3a00e80a200920092d00fb063a00e30a2009411d3a00e80a200920092d00fc063a00e40a2009411e3a00e80a200920092d00fd063a00e50a2009411f3a00e80a200920092d00fe063a00e60a200941203a00e80a200920092d00ff063a00e70a20094190076a41186a220c20092903e00a370300200d20092903d00a221037030020094190076a41106a20092903d80a2211370300200920092903c80a221237039007200941b0046a41106a220d2011370300200b2010370300200941b0046a41186a2213200c290300370300200920123703b004200941386a41186a2013290300370300200941386a41106a200d290300370300200941386a41086a200b290300370300200920092903b00437033820072d00004101470d03200941e00a6a200741196a290000370300200941d80a6a200741116a290000370300200941d00a6a200741096a290000370300200920072900013703c80a42002114410021154101210d410021160c040b20094190076a410410ec02200941d70a6a20094190076a41086a280200220236000020092009290390073700cf0a200041186a41003a000020004200370308200020092900c80a370019200041216a200941c80a6a41086a290000370000200041286a2002360000200042013703004101210d0c050b20094190076a410510ec02200941d70a6a20094190076a41086a280200220236000020092009290390073700cf0a200041186a41003a000020004200370308200020092900c80a370019200041216a200941c80a6a41086a290000370000200041286a2002360000200042013703004101210d0c040b200941d70a6a2009419c076a2802002201360000200042003703082000420137030041002102200041186a41003a000020092009290294073700cf0a200020092900c80a370019200041286a2001360000200041216a200c2900003700000c150b20072d0001210b200941c80a6a200741046a2802002215200741086a29020022174220882210a71096014100210d200b4100472116201042b8177e21140b200941d8006a41186a200941c80a6a41186a2903002210370300200941d8006a41106a200941c80a6a41106a220b2903002211370300200941d8006a41086a200941c80a6a41086a220c2903002212370300200920092903c80a2218370358200941e0066a41186a2010370300200941e0066a41106a2011370300200941e0066a41086a2012370300200920183703e00620094180026a200941386a200941e0066a109b03200941c80a6a2009280280022213200928028802109c03200941b0046a41086a2219200c290300370300200941b0046a41106a220c200b29030037030020094190076a41086a221a200941f00a6a29030037030020094190076a41106a221b200941f80a6a29030037030020094190076a41186a221c200941800b6a29030037030020094190076a41206a221d200941880b6a290300370300200920092903c80a3703b0042009200941c80a6a41206a2903003703900720092802e40a211e024020092802e00a220b450d00200941a0016a41106a200c290300370300200941a0016a41086a2019290300370300200941f8006a41086a201a290300370300200941f8006a41106a201b290300370300200941f8006a41186a201c290300370300200941f8006a41206a201d290300370300200920092903b0043703a00120092009290390073703780b0240200928028402450d00201310260b02400240200b0d004101210520044101460d04200941186a2002ad42ffff038342004280a0f8fa05420010cc06200941186a41086a290300200929031822104280f89ed79d1d7c2208201054ad7c211002402015450d002017a7210220160d022002450d00201510260b200941c80a6a20012008201010d902200920092900c90a370390072009200941c80a6a41086a2800003600970720092d00c80a22024104460d0520004200370308200020092903900737002120004201370300200041206a20023a0000200041186a41003a0000200041286a2009280097073600000c130b200941d4016a201e360200200941b8016a41206a2009290378370300200941b8016a41106a200941a0016a41106a290300370300200941b8016a41086a200941a0016a41086a290300370300200941b8016a41286a200941f8006a41086a290300370300200941e8016a200941f8006a41106a290300370300200941f0016a200941f8006a41186a290300370300200941f8016a200941f8006a41206a290300370300200920092903a0013703b8012009200b3602d00102400240024020044101470d0020092802c8012005470d02200941cc016a2802002006470d024101211b20092802d801221a41014b0d0141002104201a0e020a090a0b20094190076a410a10ec02200941d70a6a20094190076a41086a280200220236000020092009290390073700cf0a41002105200041186a41003a000020004200370308200020092900c80a370019200041216a200941c80a6a41086a290000370000200041286a200236000020004201370300201e41ffffff3f71450d0a200b10260c0a0b41002104201a210c0340200c410176221320046a22192004200b20194105746a2001412010d2064101481b2104200c20136b220c41014b0d000c080b0b20094190076a410b10ec02200941d70a6a20094190076a41086a280200220236000020092009290390073700cf0a41002105200041186a41003a000020004200370308200020092900c80a370019200041216a200941c80a6a41086a290000370000200041286a200236000020004201370300201e41ffffff3f71450d08200b10260c080b200941c80a6a41186a200141186a290000370300200941c80a6a41106a200141106a290000370300200941c80a6a41086a200141086a290000370300200920012900003703c80a200920174220883e02980720092002360294072009201536029007200941b0046a200941c80a6a200941d8006a20094190076a20082010109d03200920092900b104370380022009200941b0046a41086a2800003600870220092d00b00422024104470d104280c2d72f21110c040b4101210d20094190076a410110ec02200941d70a6a20094190076a41086a280200220236000020092009290390073700cf0a200041186a41003a000020004200370308200020092900c80a370019200041216a200941c80a6a41086a290000370000200041286a2002360000200042013703000b410121020c110b20094190076a410c10ec02200941d70a6a20094190076a41086a280200220236000020092009290390073700cf0a200041186a41003a000020004200370308200020092900c80a370019200041216a200941c80a6a41086a290000370000200041286a2002360000200042013703000c040b420021110b20094180026a41186a2204200941d8006a41186a29030037030020094180026a41106a2205200941d8006a41106a29030037030020094180026a41086a2206200941d8006a41086a2903003703002009200929035837038002200941b0046a41186a22024200370300200941b0046a41106a220c4200370300200941b0046a41086a4200370300200942003703b004200941b0046a41808cc700410610fb01200941c80a6a41ea93c400410610fb012002200941c80a6a41086a290000370300200c20092900c80a370300200941106a200941b0046a41201089022009280214210c20092802102113200941086a41da93c4004110108902200928020c21192009280208211520094190076a41186a221a200141186a221b29000037030020094190076a41106a221c200141106a221d29000037030020094190076a41086a2216200141086a221f2900003703002009200129000037039007412010242202450d0520022001290000370000200241186a201b290000370000200241106a201d290000370000200241086a201f290000370000200941dc0a6a2019410020151b360200200941f40a6a2016290300370200200941fc0a6a201c290300370200200941840b6a201a290300370200200920083703c80a20092009290390073702ec0a200920103703d00a2009200c410020131b3602d80a200941e40a6a428180808010370200200920023602e00a200941e0066a41186a2004290300370300200941e0066a41106a2005290300370300200941e0066a41086a200629030037030020092009290380023703e00620094190076a200941386a200941e0066a109b032009280290072204200928029807200941c80a6a109e030240200928029407450d00200410260b20021026200941ed0a6a2009290338370000200941f50a6a200941386a41086a290300370000200941fd0a6a200941386a41106a290300370000200941850b6a200941386a41186a290300370000200941d50a6a200141086a290000370000200941dd0a6a200141106a290000370000200941e50a6a200141186a290000370000200941003a00cc0a2009410f3a00c80a200920012900003700cd0a200941a50b6a200941d8006a41186a2903003700002009419d0b6a200941d8006a41106a290300370000200941950b6a200941d8006a41086a2903003700002009418d0b6a2009290358370000200941c80a6a108702200041186a41003a0000200041106a2014200aad4290a10f7e7c20117c42c09ae0e1007c37030020004201370308200042003703000c0c0b0240200b20044105746a2001412010d206220c0d004100211b0c010b2004200c411f766a21040b02400240201a41ffff0371200241ffff0371220249201b71220c201a6a41ffff037120024f0d0020094117360280020c010b024020150d0020094190076a200941d8006a109f03200941c80a6a200928029007221320092802980710a00302400240024020092802c80a2202450d0020092902cc0a21100240200928029407450d00201310260b200920104220883e0294072009200236029007200941c80a6a20094190076a10b60220092802c80a4117470d0120094117360280020c020b0240200928029407450d00201310260b20094117360280020c030b20094180026a200941c80a6a41b00210cf061a0b2010a7450d01200210260c010b200920174220883e0294072009201536029007200941c80a6a20094190076a10b602024020092802c80a4117470d0020094117360280020c010b20094180026a200941c80a6a41b00210cf061a0b024002402009280280024117470d00410021022015450d0620160d012017a7450d06201510260c060b200941b0046a20094180026a41b00210cf061a200941c80a6a200941b0046a10a103024020092903c80a2008560d00200941e0066a41186a200941d8006a41186a290300370300200941e0066a41106a200941d8006a41106a290300370300200941e0066a41086a200941d8006a41086a290300370300200920092903583703e006200941c80a6a200941386a200941e0066a109b0320092802c80a220720092802d00a10ff01024020092802cc0a450d00200710260b200941d8006a10a203200941286a200941dc016a20092903b801200941b8016a41086a29030010da0220094190076a200941b0046a41b00210cf061a200941c0096a41186a200941386a41186a290300370300200941c0096a41106a200941386a41106a290300370300200941c0096a41086a200941386a41086a290300370300200920092903383703c009411010242203450d05200341b889c70036020c200341013602082003428180808010370200411010242207450d05200741d089c70036020c20074101360208200742818080801037020020032003280200417f6a2202360200024020020d002003280208200328020c2802001103000240200328020c280204450d00200328020810260b20032003280204417f6a220236020420020d00200310260b02400240200728020820094190076a200728020c28020c110100450d00200941c80a6a20094190076a41b00210cf061a200941820d6a200941c8096a2903003701002009418a0d6a200941d0096a290300370100200941920d6a200941d8096a2903003701002009419a0d6a200941c0096a41206a2f01003b010020094180023b01f80c200920092903c0093701fa0c2009200736029c0d200941e0066a200941c80a6a200941f80c6a10a30320092903e0064201512107200941e0066a41206a2d0000210320092903e80621080c010b4102210320094180076a41023a0000200941f8066a41003a000020072007280200417f6a220236020042002108200942003703e806200942013703e006024020020d002007280208200728020c2802001103000240200728020c280204450d00200728020810260b20072007280204417f6a220236020420020d00200710260b20094190076a109803410121070b200941f80c6a41186a200141186a290000370300200941f80c6a41106a200141106a290000370300200941f80c6a41086a200141086a290000370300200920012900003703f80c20094190076a41186a200941386a41186a29030037030020094190076a41106a200941386a41106a29030037030020094190076a41086a200941386a41086a2903003703002009200929033837039007200941c80a6a41186a200941d8006a41186a290300370300200941c80a6a41106a200941d8006a41106a290300370300200941c80a6a41086a200941d8006a41086a290300370300200920092903583703c80a200920094188076a2800003600c70920092009290081073703c0090240024020070d00410421070c010b200920092800c7093600bf0a200920092903c0093703b80a4104210720084202510d00200920092800bf0a3600af0a200920092903b80a3703a80a200321070b200941c0096a41086a2203200941f80c6a41086a290300370300200941c0096a41106a2202200941f80c6a41106a290300370300200941c0096a41186a2201200941f80c6a41186a290300370300200941880a6a41086a220d20094190076a41086a290300370300200941880a6a41106a220420094190076a41106a290300370300200941880a6a41186a220b20094190076a41186a290300370300200941e8096a41186a220c200941c80a6a41186a290300370300200941e8096a41106a2213200941c80a6a41106a290300370300200941e8096a41086a2219200941c80a6a41086a290300370300200920092903f80c3703c00920092009290390073703880a200920092903c80a3703e809200920092800af0a3600bf0a200920092903a80a3703b80a200941d50a6a2003290300370000200941dd0a6a2002290300370000200941e50a6a20012903003700002009410f3a00c80a200920092903c0093700cd0a200941023a00cc0a200941ed0a6a20092903880a370000200941f50a6a200d290300370000200941fd0a6a2004290300370000200941850b6a200b290300370000200941a50b6a200c2903003700002009419d0b6a2013290300370000200941950b6a20192903003700002009418d0b6a20092903e809370000200941af0b6a20094190076a41026a2d00003a0000200941ad0b6a20092f0090073b0000200941b80b6a20073a0000200941b40b6a2006360200200941b00b6a2005360200200941c00b6a20092800bf0a360000200941b90b6a20092903b80a370000200941c80a6a1087020240024020092802e8060d00420021080c010b427f427f427f427f200941e0066a41106a290300220842c0f79c1a7c221020102008541b2208200aad4290a10f7e7c221020102008541b220820147c221020102008541b220842c097e8b2017c221020102008541b2110420121080b20002008370308200020092800c80a36001920004200370300200041186a41003a0000200041106a20103703002000411c6a200941cb0a6a280000360000024020092802d40141ffffff3f71450d0020092802d00110260b2015450d0a2017a70d040c0a0b20094190076a410d10ec02200941d70a6a20094190076a41086a280200220236000020092009290390073700cf0a41002105200041186a41003a000020004200370308200020092900c80a370019200041216a200941c80a6a41086a290000370000200041286a200236000020004201370300200941b0046a109803201e41ffffff3f71450d01200b10260c010b200941c80a6a41186a200141186a290000370300200941c80a6a41106a200141106a290000370300200941c80a6a41086a200141086a290000370300200920012900003703c80a20092017370294072009201536029007200941b0046a200941c80a6a200941d8006a20094190076a42004200109d03200920092900b1043703e0062009200941b0046a41086a2800003600e70620092d00b00422024104470d01410121020c040b2015450d0a2017a7450d0a201510260c0a0b20004200370308200020092903e00637002120004201370300200041206a20023a0000200041186a41003a0000200041286a20092800e7063600000c030b201510260c050b102c000b02400240024002400240200c0d002002450d02410121070c010b200941c80a6a41186a200141186a290000370300200941c80a6a41106a200141106a290000370300200941c80a6a41086a200141086a290000370300200920012900003703c80a201a2004490d050240201a201e470d00200941b8016a41186a201e410110930120092802d001210b0b200b20044105746a220741206a2007201a20046b41057410d0061a200741186a200941c80a6a41186a290300370000200741106a200941c80a6a41106a290300370000200741086a200941c80a6a41086a290300370000200720092903c80a3700002009201a41016a3602d801200941c80a6a200941b8016a41c80010cf061a200941e0066a41186a200941d8006a41186a290300370300200941e0066a41106a200941d8006a41106a290300370300200941e0066a41086a200941d8006a41086a290300370300200920092903583703e00620094190076a200941386a200941e0066a109b032009280290072207200928029807200941c80a6a109e030240200928029407450d00200710260b0240200941e40a6a28020041ffffff3f71450d0020092802e00a10260b200941ed0a6a2009290338370000200941d50a6a200141086a290000370000200941dd0a6a200141106a290000370000200941e50a6a200141186a290000370000200941f50a6a200941386a41086a290300370000200941fd0a6a200941386a41106a290300370000200941850b6a200941386a41186a290300370000200941013a00cc0a2009410f3a00c80a200920012900003700cd0a200941b00b6a2005360200200941b40b6a2006360200200941a50b6a200941d8006a41186a2903003700002009419d0b6a200941d8006a41106a290300370000200941950b6a200941d8006a41086a2903003700002009418d0b6a2009290358370000200941c80a6a108702410021070b2000420137030820004200370300200041186a41003a0000200041106a2014200aad4290a10f7e7c4280c2d72f420020021b7c42c09ae0e1007c3703002009280280024117470d012007450d060c020b20094190076a410210ec02200941d70a6a20094190076a41086a280200220236000020092009290390073700cf0a200041186a41003a000020004200370308200020092900c80a370019200041216a200941c80a6a41086a290000370000200041286a2002360000200042013703000c020b20094180026a1098032007450d040b20092802d40141ffffff3f71450d03200b10260c030b2009280280024117460d0120094180026a1098030c010b2004201a103b000b0240201e41ffffff3f71450d00200b10260b410021050c030b0240200e41ffffff3f71450d00200f10260b200941c00d6a24000f0b20004200370308200020092903800237002120004201370300200041206a20023a0000200041186a41003a0000200041286a2009280087023600000b410121050b0240200e41ffffff3f71450d00200f10260b02400240200b450d0020054101730d00201e41ffffff3f710d010b410021020c010b200b1026410021020b024020072d00000d00200d450d00200741086a280200450d00200741046a28020010260b02402002450d00200341046a28020041ffffff3f71450d00200328020010260b200941c00d6a24000ba50601057f230041f0006b22032400200341f88bc700410810fb01200341106a41d49fc200410910fb0102400240412010242204450d002003422037025420032004360250200341d0006a41004120106d20032802502204200328025822056a22062001290000370000200641086a200141086a290000370000200641106a200141106a290000370000200641186a200141186a2900003700002003200541206a2201360258200341c0006a2004200110a202200341ec006a200420016a360200200320043602682003200341c0006a41086a3602642003200341c0006a360260200341206a200341e0006a107302402003280254450d00200410260b412010242201450d002003422037024420032001360240200341c0006a41004120106d20032802402201200328024822066a22042002290000370000200441086a200241086a290000370000200441106a200241106a290000370000200441186a200241186a2900003700002003200641206a2202360248200341d0006a2001200210bc02200341ec006a200120026a360200200320013602682003200341d0006a41106a3602642003200341d0006a360260200341306a200341e0006a107302402003280244450d00200110260b20032802282202200328023822046a41206a2206417f4c0d010240024020060d0041012101410021060c010b200610242201450d010b20002001360200200041086a220141003602002000200636020420004100411010c9012000280200200128020022066a220520032900003700002001200641106a2206360200200541086a200341086a29000037000020002006411010c9012000280200200128020022066a220520032900103700002001200641106a2207360200200541086a200341106a41086a2900003700002003280220210620002007200210c9012000280200200128020022056a2006200210cf061a2001200520026a22053602002003280230210220002005200410c9012000280200200128020022006a2002200410cf061a2001200020046a36020002402003280234450d00200210260b02402003280224450d00200610260b200341f0006a24000f0b1033000b1034000bea0604067f027e017f057e230041d0016b220324002003200236020c20032001360208200341106a2001200210820202400240200328021022020d00200041003602180c010b200328021421042003200341186a2802002205360244200320023602400240024020054104490d00200228000021062003200241046a36024020032005417c6a220136024420014104490d002003200241086a360240200228000421072003200541786a220136024420014110490d002003200541686a22083602442003200241186a360240200241106a29000021092002290008210a41002101200341003a008801200541676a21050240034020082001460d01200341e8006a20016a200220016a220b41186a2d00003a00002003200b41196a3602402003200141016a220b3a008801200320053602442005417f6a2105200b2101200b4120470d000b200341b0016a41186a2201200341e8006a41186a290300370300200341b0016a41106a2205200341e8006a41106a290300370300200341b0016a41086a2208200341e8006a41086a290300370300200320032903683703b001200b41ff01714120490d01200341c8006a41086a2008290300370300200341c8006a41106a2005290300370300200341c8006a41186a2001290300370300200320032903b001370348200341e8006a200341c0006a10920120032802682201450d01200341206a41086a200341c8006a41086a290300220c370300200341206a41106a200341c8006a41106a290300220d370300200341206a41186a200341c8006a41186a290300220e37030020032003290348220f370320200329026c2110200020093703082000200a3703002000201037021c200020013602182000200736021420002006360210200041246a200f3702002000412c6a200c370200200041346a200d3702002000413c6a200e3702000c020b200141ff0171450d00200341003a0088010b200341003602b801200342013703b0012003410e360294012003200341086a360290012003200341b0016a360248200341fc006a41013602002003420137026c2003418c8dc600360268200320034190016a360278200341c8006a41c4e1c000200341e8006a10351a20032802b00120032802b801108402024020032802b401450d0020032802b00110260b200041003602180b2004450d00200210260b200341d0016a24000bc90903037f027e037f23004180016b22062400200641206a2002109f03200641186a20062802202207200628022841d4c0c700410041001081022006280218210802402006280224450d00200710260b024002400240024002400240024020084101460d00200641086a200341086a2802002208411f6a410576ad42004280a0f8fa05420010cc06200641206a2001200420062903087c22094280f89ed79d1d7c220a2005200641086a41086a2903007c2009200454ad7c200a200954ad7c220410d902200620062900213703502006200641206a41086a220728000036005720062d0020220b4104470d022007200141086a290000370300200641206a41106a200141106a290000370300200641206a41186a200141186a290000370300200620012900003703202003280204210c20032802002101200641c0006a41f88bc700410810fb01200641d0006a41aca0c200410510fb014120102422030d010c060b2000410e10ec020c030b200642203702742006200336027041002107200641f0006a41004120106d2006280270220b2006280278220d6a22032002290000370000200341086a200241086a290000370000200341106a200241106a290000370000200341186a200241186a2900003700002006200d41206a22033602782003417f4c0d010240024020030d00410121020c010b200310242202450d05200321070b200641003602682006200236026020062007360264200641e0006a41002003106d20062802602207200628026822026a200b200310cf061a2006200220036a220336026802402006280274450d00200b10260b200341206a2202417f4c0d010240024020020d004101210b410021020c010b20021024220b450d050b200641003602782006200b36027020062002360274200641f0006a4100411010c9012006280270200628027822026a220b2006290040370000200b41086a200641c0006a41086a2900003700002006200241106a2202360278200641f0006a2002411010c9012006280270200628027822026a220b2006290050370000200b41086a200641d0006a41086a2900003700002006200241106a2202360278200641f0006a2002200310c901200628027022022006280278220b6a2007200310cf061a2006200b20036a220b36027802402006280264450d00200710260b200841146a2203417f4c0d010240024020030d0041012107410021030c010b200310242207450d050b20064100360258200620073602502006200336025420012008200641d0006a109501200641d0006a20062802584120106d2006280250200628025822086a22032006290320370000200341086a200641206a41086a290300370000200341106a200641206a41106a290300370000200341186a200641206a41186a2903003700002006200841206a2203360258200641d0006a20034110106d20062802502203200628025822086a220720043700082007200a3700002006200841106a22083602582002200b2003200810b30102402006280254450d00200310260b02402006280274450d00200210260b0240200c450d00200110260b200041043a00000c030b2000200b3a000020002006290350370001200041086a20062800573600000c010b1034000b200341046a280200450d00200328020010260b20064180016a24000f0b1033000be40303037f027e027f230041106b22032400200341003602082003420137030020022802102104200341004104106d2003280200200328020822056a20043600002003200541046a2204360208200241146a2802002105200320044104106d2003280200200328020822046a20053600002003200441046a2204360208200241086a290300210620022903002107200320044110106d2003280200200328020822046a22052006370008200520073700002003200441106a2204360208200320044120106d2003280200200328020822056a22042002290024370000200441086a2002412c6a290000370000200441106a200241346a290000370000200441186a2002413c6a2900003700002003200541206a360208200228021821042003200241206a280200220210a1010240024020020d0020032802002108200328020821020c010b20024105742105200328020821020340200320024120106d20032802002208200328020822096a22022004290000370000200241086a200441086a290000370000200241106a200441106a290000370000200241186a200441186a2900003700002003200941206a2202360208200441206a2104200541606a22050d000b0b200020012008200210b30102402003280204450d00200810260b200341106a24000ba40401057f230041c0006b22022400200241f88bc700410810fb01200241106a41aca0c200410510fb0102400240412010242203450d00200242203702342002200336023041002104200241306a41004120106d20022802302205200228023822066a22032001290000370000200341086a200141086a290000370000200341106a200141106a290000370000200341186a200141186a2900003700002002200641206a22013602382001417f4c0d010240024020010d00410121030c010b200110242203450d01200121040b200241003602282002200336022020022004360224200241206a41002001106d20022802202206200228022822036a2005200110cf061a2002200320016a220336022802402002280234450d00200510260b200341206a2204417f4c0d010240024020040d0041012101410021040c010b200410242201450d010b20002001360200200041086a220141003602002000200436020420004100411010c9012000280200200128020022046a220520022900003700002001200441106a2204360200200541086a200241086a29000037000020002004411010c9012000280200200128020022046a220520022900103700002001200441106a2204360200200541086a200241106a41086a29000037000020002004200310c9012000280200200128020022006a2006200310cf061a2001200020036a36020002402002280224450d00200610260b200241c0006a24000f0b1033000b1034000bd40704087f017e027f057e230041d0016b220324002003200236020c20032001360208200341106a2001200210820202400240200328021022020d00200041003602000c010b200328021421042003200341186a280200360244200320023602402003200341c0006a108f010240024002400240024020032802000d002003280244220520032802042201490d002001417f4c0d010240024020010d0041002106410121070c010b2001102a2207450d0320032802442105200121060b02400240024020052001490d0020072003280240200110cf0621082003280244220520014f0d012001200541b8afc0001048000b20060d010c020b2003200520016b22093602442003200328024020016a220a3602402008450d012001ad4220862006ad84210b41002101200341003a008801417f210502400240034020092001460d01200341e8006a20016a200a20016a220c2d00003a00002003200920056a3602442003200c41016a3602402003200141016a220c3a0088012005417f6a2105200c2101200c4120470d000b200341b0016a41186a2201200341e8006a41186a290300370300200341b0016a41106a2205200341e8006a41106a290300370300200341b0016a41086a220d200341e8006a41086a290300370300200320032903683703b001200c41ff01714120490d01200341c8006a41086a200d290300370300200341c8006a41106a2005290300370300200341c8006a41186a2001290300370300200320032903b0013703482009200c6b2201410f4b0d0620060d020c030b200141ff0171450d00200341003a0088010b2006450d010b200710260b200341003602b801200342013703b0012003410e360294012003200341086a360290012003200341b0016a360248200341fc006a41013602002003420137026c2003418c8dc600360268200320034190016a360278200341c8006a41c4e1c000200341e8006a10351a20032802b00120032802b801108402024020032802b401450d0020032802b00110260b200041003602000c030b1034000b1033000b200341206a41086a200341c8006a41086a290300220e370300200341206a41106a200341c8006a41106a290300220f370300200341206a41186a200341c8006a41186a29030022103703002003200329034822113703202003200141706a3602442003200a200c6a220141106a36024020012900002112200041386a200141086a290000370300200041306a20123703002000200b370204200020083602002000410c6a2011370200200041146a200e3702002000411c6a200f370200200041246a20103702000b2004450d00200210260b200341d0016a24000b8e2203027f027e027f230041306b220224000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012802000e170102030405060b0708090a0b0c0d0e0f10111213141500010b02400240024002400240200141086a2d00000e050001020304000b2002412c6a41013602002002420137021c200241dcedc6003602182002410436020c200241d4edc6003602082002200241086a360228200241186a41ecc0c700103d000b200141186a280200210320024100360220200242013703182003200241186a109904200235022021040240200228021c450d00200228021810260b200241086a2001280218220110a10320022903082105200241186a200110a10320022d00202101200041003a0009200020013a00082000427f2005200442d00f7e4280999b107c22047c220520052004541b3703000c180b200041003b01082000427f427f427f427f200141306a290300220442c0f79c1a7c220520052004541b2204200141146a3502004290a10f7e7c220520052004541b22042001412c6a35020042b8177e7c220520052004541b220442c097e8b2017c220520052004541b3703000c170b200041003b01082000427f427f427f200141c8006a290300220442c0f79c1a7c220520052004541b2204200141346a3502004290a10f7e7c220520052004541b220442c097e8b2017c220520052004541b3703000c160b200041003b01082000200141346a35020042a08d067e42c0b9fdc3017c3703000c150b02400240024002400240024002400240024002400240200141086a2802000e0b000102030405060708090a000b2002412c6a41013602002002420137021c200241dcedc6003602182002410436020c200241d4edc6003602082002200241086a360228200241186a41ecc0c700103d000b200041003b010820002001410c6a35020042d00f7e3703000c1d0b200041003b0108200042e0dc2a3703000c1c0b200041013b0108200042e088b3303703000c1b0b200041013b010820004280c0a8ca9a3a3703000c1a0b200041013b010820004280c0a8ca9a3a3703000c190b200041013b010820004280b191e4003703000c180b200041013b01082000200141146a35020042c091fc2f7e3703000c170b200041013b01082000200141146a3502004280f7ef2f7e3703000c160b200041013b01082000200141186a35020042d0b28b307e42d0b28b307c3703000c150b200041013b010820004280ade2043703000c140b024002400240200141086a2802000e03000102000b2002412c6a41013602002002420137021c200241dcedc6003602182002410436020c200241d4edc6003602082002200241086a360228200241186a41ecc0c700103d000b200041003b010820004280c5dbeb9d023703000c140b200041003b010820004280c5dbeb9d023703000c130b200041023b010820004280c7abcb003703000c120b02400240024002400240024020012d00040e06000102030405000b2002412c6a41013602002002420137021c200241dcedc6003602182002410436020c200241d4edc6003602082002200241086a360228200241186a41ecc0c700103d000b200041003b0108200042c0b9f4c9003703000c150b200041003b0108200042c082f387013703000c140b200041003b010820004280a3c3c7003703000c130b200041003b0108200042c0d59083013703000c120b200041003b0108200042c0b9f4c9003703000c110b02400240024002400240200141086a2d00000e050001020304000b2002412c6a41013602002002420137021c200241dcedc6003602182002410436020c200241d4edc6003602082002200241086a360228200241186a41ecc0c700103d000b200041003b01082000428094ebdc033703000c130b200041003b01082000428094ebdc033703000c120b200041003b01082000428094ebdc033703000c110b200041003b01082000428094ebdc033703000c100b200041023b0108200042003703000c0f0b200041003b0108200042c0a3f5d00342808995ef0220012802041b3703000c0e0b200041023b0108200042003703000c0d0b0240024002400240200141086a2802000e0400010203000b2002412c6a41013602002002420137021c200241dcedc6003602182002410436020c200241d4edc6003602082002200241086a360228200241186a41ecc0c700103d000b200041003b010820002001411c6a280200220141e400200141e400491b4198d70a6cad42c0c6cbccb0027c3703000c0e0b200041003b010820002001411c6a280200220141e400200141e400491b4198d70a6cad42c0c6cbccb0027c3703000c0d0b200041003b0108200042c0cf8e313703000c0c0b200041003b01082000200141286a35020042b0e32d7e2001411c6a35020042809fc9007e7c4280f797f3017c3703000c0b0b10dd05000b02400240024002400240200141086a2d00000e050001020304000b2002412c6a41013602002002420137021c200241dcedc6003602182002410436020c200241d4edc6003602082002200241086a360228200241186a41ecc0c700103d000b200041023b01082000428094ebdc033703000c0c0b200041003b0108200042003703000c0b0b200041003b0108200042a08d063703000c0a0b200041003b0108200042a08d063703000c090b200041023b0108200042003703000c080b0240024002400240024002400240024020012d00040e080001020304050607000b2002412c6a41013602002002420137021c200241dcedc6003602182002410436020c200241d4edc6003602082002200241086a360228200241186a41ecc0c700103d000b200041013b010820004280e497d0123703000c0d0b200041013b010820004280ade2043703000c0c0b200041003b0108200042003703000c0b0b200041003b0108200042003703000c0a0b200041003b0108200042003703000c090b200041003b0108200042003703000c080b200041003b0108200042003703000c070b02400240024020012f01040e03000102000b2002412c6a41013602002002420137021c200241dcedc6003602182002410436020c200241d4edc6003602082002200241086a360228200241186a41ecc0c700103d000b200141086a280200210342c0c3930721040240200141106a280200220641b0026c2207450d00200321010340200241186a200110a103427f427f200420022903187c220520052004541b220442c0843d7c220520052004541b2104200141b0026a2101200741d07d6a22070d000b0b200641b0026c210141012107024003402001450d01200141d07d6a2101200241186a200310a103200341b0026a210320022d00204101460d000b410021070b200041003a0009200020073a0008200020043703000c070b200241086a200141086a280200220110a10320022903082104200241186a200110a10320022d00202101200041003a0009200020013a00082000427f200442c08db7017c220520052004541b3703000c060b0240024002400240024002400240024002400240024002400240024002400240200141086a2d00000e10000102030405060708090a0b0c0d0e0f000b2002412c6a41013602002002420137021c200241dcedc6003602182002410436020c200241d4edc6003602082002200241086a360228200241186a41ecc0c700103d000b200041003b0108200042808999ca003703000c130b200041003b01082000428082c69d013703000c120b200041003b01082000200141146a35020022044280c2d72f7e200442a0eae1017e7c42c0f6dff0267c3703000c110b200041003b010820004280a3b4d4273703000c100b200041003b01082000428088debe013703000c0f0b200041003b010820004280838aa3013703000c0e0b200041003b0108200042c0f1a3c2003703000c0d0b200041003b0108200042e09df3c2003703000c0c0b200041003b0108200042e0fea9c2003703000c0b0b200041003b0108200042c0f3ffae013703000c0a0b200041003b010820004280d9afa3283703000c090b200041003b010820004280c9a681023703000c080b200041003b010820004280aaead5003703000c070b200041003b0108200042c0a190ea013703000c060b200041003b0108200042c0d891ac013703000c050b024002400240024002400240024002400240024020012d00040e0a00010203040506070809000b2002412c6a41013602002002420137021c200241dcedc6003602182002410436020c200241d4edc6003602082002200241086a360228200241186a41ecc0c700103d000b200241086a200141286a280200220110a10320022903082104200241186a200110a10320022d00202101200041003a0009200020013a0008200020044290ce007c3703000c0c0b200041003b0108200042003703000c0b0b200041003b010820004280c2d72f3703000c0a0b200041003b010820004280c2d72f3703000c090b200041003b010820004280c2d72f3703000c080b200041003b010820004280c2d72f3703000c070b200041003b01082000428087a70e3703000c060b200041003b01082000428087a70e3703000c050b200041003b0108200042003703000c040b02400240024002400240200141086a2d00000e050001020304000b2002412c6a41013602002002420137021c200241dcedc6003602182002410436020c200241d4edc6003602082002200241086a360228200241186a41ecc0c700103d000b200041003b010820004280c6868f013703000c060b200041003b0108200042c0f8d3ca013703000c050b200041003b0108200042c0d9bfe2013703000c040b200041003b0108200042808c8d9e023703000c030b024002400240024002400240024020012d00040e0700010203040506000b2002412c6a41013602002002420137021c200241dcedc6003602182002410436020c200241d4edc6003602082002200241086a360228200241186a41ecc0c700103d000b200041003b010820004280a3c3c7003703000c070b200041003b0108200042c0b6fc9a013703000c060b200041003b0108200042c082f387013703000c050b200041003b010820004280a7f2a6013703000c040b200041003b010820004280a3c3c7003703000c030b200041003b0108200042c082f387013703000c020b02400240024002400240200141086a2d00000e050001020304000b2002412c6a41013602002002420137021c200241dcedc6003602182002410436020c200241d4edc6003602082002200241086a360228200241186a41ecc0c700103d000b200241086a2001410c6a280200220110a10320022903082104200241186a200110a10320022d00202101200041003a0009200020013a0008200020044290ce007c3703000c040b200141106a2903002104200241186a2001410c6a28020010a10320022d00202101200041003a0009200020013a0008200020043703000c030b200041003b0108200042003703000c020b200241086a2001412c6a280200220110a10320022903082104200241186a200110a10320022d00202101200041003a0009200020013a0008200020044290ce007c3703000c010b024002400240024002400240024020012d00040e0700010203040506000b2002412c6a41013602002002420137021c200241dcedc6003602182002410436020c200241d4edc6003602082002200241086a360228200241186a41ecc0c700103d000b200241186a200141286a28020010a1032002290318210420022d00202101200041003a0009200020013a00082000427f200442c082cc177c220520052004541b3703000c050b200041003b0108200042c0d39ec7003703000c040b200041003b0108200042c0b1dcc4003703000c030b200041003b0108200042c0e5a1c4003703000c020b200041003b0108200042c0e4b0cd003703000c010b200041003b010820004280aef2c4003703000b200241306a24000baa0303067f027e017f230041b0016b22012400200141386a2000109f03200141c8006a200128023822022001280240220310a003024020012802482200450d002002200310ff010b20014188016a41086a2203200141c8006a41106a29030037030020014188016a41106a2204200141c8006a41186a29030037030020014188016a41186a2205200141c8006a41206a29030037030020014188016a41206a2206200141f0006a2802003602002001200141c8006a41086a290300370388010240024020000d00200128023c450d01200210260c010b20014180016a2903002107200141f8006a2903002108200128024c2109200141106a41206a2006280200360200200141106a41186a2005290300370300200141106a41106a2004290300370300200141106a41086a200329030037030020012001290388013703100240200128023c450d00200210260b200141e0006a2001412c6a290200370300200141d8006a200141246a290200370300200141d0006a2001411c6a290200370300200120012902143703482001200141c8006a2008200710da022009450d00200010260b200141b0016a24000bb681040c027f047e027f017e047f017e087f047e027f077e0d7f1d7e230022032104200341a0126b416071220324000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012802000e170203040506070108090a0b010c0d0e0f10111213141500020b200141286a3100002105200141206a2902002106200141c8006a2903002107200141c0006a29030021082001413c6a2802002109200141386a280200210a200141306a290300210b2001412c6a280200210c2001412a6a2f0100210d2001411c6a280200210e200141186a280200210f200141106a29020021102001410c6a28020021112001410a6a2f01002112200141086a2d0000211320012d0029211420012d00092115200341b0036a41206a2201200241206a290200370300200341b0036a41186a2216200241186a290200370300200341b0036a41106a2217200241106a290200370300200341b0036a41086a2218200241086a290200370300200320022902003703b0030240024002400240024020130e050001020304000b200341f4046a4101360200200342013702e404200341dcedc6003602e004200341043602dc09200341d4edc6003602d8092003200341d8096a3602f004200341e0046a41ecc0c700103d000b200341e0046a41206a2001290300370300200341e0046a41186a2016290300370300200341e0046a41106a2017290300370300200341e0046a41086a2018290300370300200320032903b0033703e004200341e00e6a200341e0046a10d60220034180086a41086a200341e90e6a29000037030020034180086a41106a200341f10e6a29000037030020034180086a41186a200341f90e6a290000370300200320032900e10e3703800802400240024020032d00e00e4101460d000240024002402010428080808010540d002010422088a741e4004f0d012003419f086a3100002106200329009708210b2003280093082101200328008f0821022003290087082105200328008308211320032f008108211620032d0080082117200320103702b40c200320113602b00c200341e0046a411f6a20063c00002003200b3700f704200320013600f304200320023600ef04200320053700e704200320133600e304200320163b00e104200320173a00e004200341e00e6a200341b00c6a200341e0046a10990320032802e00e4101470d02200320032900e50e3703e0072003200341ec0e6a2800003600e70720032d00e40e2101200f109803200f1026420021064200210b0c8a010b200341e0046a410410ec02200320032900e1043703e0072003200341e8046a2800003600e7070c87010b200341e0046a410510ec02200320032900e1043703e0072003200341e8046a2800003600e7070c86010b200341e00e6a41086a2201280200211620032802e40e2113200341e0046a41086a200341e00e6a410c6a280200360200200341013b01ec04200320133602e404200341ccb7c5003602e004200341a0086a200341e0046a10f702200341083a0080052003410b3a0080052003410c3a008005200320032f01a0083b01e004200320032801a2083601e204200320032d00a6083a00e604200320032800a7083600e704200320032d00ab083a00eb042003410d3a008005200320032d00ac083a00ec042003410e3a008005200320032d00ad083a00ed042003410f3a008005200320032d00ae083a00ee04200320032d00af083a00ef04200341103a008005200341113a008005200320032d00b0083a00f004200341123a008005200320032d00b1083a00f104200341133a008005200320032d00b2083a00f204200341143a008005200320032d00b3083a00f304200341153a008005200320032d00b4083a00f404200341163a008005200320032d00b5083a00f504200341173a008005200320032d00b6083a00f604200320032d00b7083a00f704200341183a008005200341193a008005200320032d00b8083a00f8042003411a3a008005200320032d00b9083a00f9042003411b3a008005200320032d00ba083a00fa042003411c3a008005200320032d00bb083a00fb042003411d3a008005200320032d00bc083a00fc042003411e3a008005200320032d00bd083a00fd042003411f3a008005200320032d00be083a00fe04200341203a008005200320032d00bf083a00ff04200341e00e6a41186a220220032903f804370300200120032903e8042210370300200341e00e6a41106a20032903f0042206370300200320032903e004220b3703e00e200341c0046a41106a22012006370300200341c0046a41086a22172010370300200341c0046a41186a221820022903003703002003200b3703c004200341d8096a41186a22022018290300370300200341d8096a41106a22182001290300370300200341d8096a41086a22012017290300370300200320032903c0043703d809200341003602e804200342013703e004200f200341e0046a10990420032802e8042111024020032802e404450d0020032802e00410260b200341e00e6a200f41b00210cf061a200341d8116a41186a2002290300370300200341d8116a41106a2018290300370300200341d8116a41086a2001290300370300200320032903d8093703d811411010242201450d1b200141b889c70036020c200141013602082001428180808010370200411010242202450d1b200241d089c70036020c20024101360208200242818080801037020020012001280200417f6a2217360200024020170d002001280208200128020c2802001103000240200128020c280204450d00200128020810260b20012001280204417f6a221736020420170d00200110260b024002402002280208200341e00e6a200228020c28020c110100450d00200341e0046a200341e00e6a41b00210cf061a2003418a0a6a200341e0116a290300370100200341920a6a200341e8116a2903003701002003419a0a6a200341f0116a290300370100200341a20a6a200341d8116a41206a2f01003b010020034180023b01800a200320032903d8113701820a200320023602a40a200341b00c6a200341e0046a200341800a6a10a30320032903b00c4201512117200341b00c6a41206a2d0000210120032903b80c21060c010b41022101200341d00c6a41023a0000200341c80c6a41003a000020022002280200417f6a221736020042002106200342003703b80c200342013703b00c024020170d002002280208200228020c2802001103000240200228020c280204450d00200228020810260b20022002280204417f6a221736020420170d00200210260b200341e00e6a109803410121170b200320032900d10c3703e0042003200341d80c6a2800003600e704200341c00c6a290300211020032802dc0c21022017450d01200341c80c6a290300210b200320032800e7043600870a200320032903e0043703800a200320032800870a3600e704200320032903800a3703e0040240024020064201510d00200320032800e7043600e70e200320032903e0043703e00e0c010b200320032800e7043600e70e200320032903e0043703e00e427f2011ad42d00f7e4280999b107c220620107c221020102006541b21104200210b420121060b200320032903e00e3703e007200320032800e70e3600e707410121170c020b200f109803200f1026410221010c85010b427f2011ad42d00f7e4280999b107c220b20107c22102010200b541b2110410021172006a7410047ad21064200210b0b0240201641ffffff3f71450d00201310260b200f102620170d840120002006370308200041186a200b370300200041106a201037030020004200370300200424000f0b200320053c00dc092003200d3b01de09200320143a00dd092003200642208822053e02d809200341e00e6a41206a2001290300370300200341e00e6a41186a2016290300370300200341e00e6a41106a2017290300370300200341e00e6a41086a2018290300370300200320032903b0033703e00e200341800a6a200341e00e6a10d602200341a0086a41086a200341890a6a290000370300200341a0086a41106a200341910a6a290000370300200341a0086a41186a200341990a6a290000370300200320032900810a3703a0082005a7210102400240024020032d00800a4101470d0020034180056a41023a0000200341f8046a41003a0000200342003703e804200342013703e004024020032802dc09450d00200110260b0240201042ffffff3f83500d00201110260b200341e8046a21010c010b20034180086a41186a200341a0086a41186a290300220537030020034180086a41106a200341a0086a41106a290300220737030020034180086a41086a200341a0086a41086a2903002208370300200320032903a008221937038008200341800a6a41186a2005370300200341800a6a41106a2007370300200341800a6a41086a2008370300200320193703800a200320103702dc11200320113602d811200341ec0e6a200c360200200341e00e6a41086a20032802dc09360200200320013602e40e200320153a00e10e200341003a00e00e200341e0046a200341800a6a2012200341d8116a200f200e2006a7200341e00e6a200b109a03200341e0046a41086a210120032903e0044201520d010b200341b00c6a41206a200141206a2903002210370300200341b00c6a41186a200141186a2903002206370300200341b00c6a41106a200141106a290300220b370300200341b00c6a41086a200141086a29030022053703002003200129030022073703b00c200041286a2010370300200041206a2006370300200041186a200b370300200041106a20053703002000200737030820004201370300200424000f0b200341b00c6a41106a200141106a2903002210370300200341b00c6a41086a200141086a290300220637030020032001290300220b3703b00c200041186a2010370300200041106a20063703002000200b37030820004200370300200424000f0b200341e00e6a41206a2001290300370300200341e00e6a41186a2016290300370300200341e00e6a41106a2017290300370300200341e00e6a41086a2018290300370300200320032903b0033703e00e200341800a6a200341e00e6a10d602200341a0086a41086a200341890a6a290000370300200341a0086a41106a200341910a6a290000370300200341a0086a41186a200341990a6a290000370300200320032900810a3703a00802400240024020032d00800a4101470d0020034180056a41023a0000200341f8046a41003a0000200342003703e804200342013703e0040240200b42ffffff3f83500d00200c10260b200341e8046a21010c010b20034180086a41186a200341a0086a41186a290300221937030020034180086a41106a200341a0086a41106a290300221a37030020034180086a41086a200341a0086a41086a290300221b370300200320032903a008221c37038008200341800a6a41186a2019370300200341800a6a41106a201a370300200341800a6a41086a201b3703002003201c3703800a2003200b3702dc112003200c3602d811200341800f6a20053c0000200341e00e6a41186a2006370300200341f40e6a200e360200200341e00e6a41106a200f360200200341e00e6a41086a2010370300200320113602e40e200320123b01e20e200320153a00e10e200341013a00e00e200341e0046a200341800a6a200d200341d8116a200a20092008a7200341e00e6a2007109a03200341e0046a41086a210120032903e0044201520d010b200341b00c6a41206a200141206a2903002210370300200341b00c6a41186a200141186a2903002206370300200341b00c6a41106a200141106a290300220b370300200341b00c6a41086a200141086a29030022053703002003200129030022073703b00c200041286a2010370300200041206a2006370300200041186a200b370300200041106a20053703002000200737030820004201370300200424000f0b200341b00c6a41106a200141106a2903002210370300200341b00c6a41086a200141086a290300220637030020032001290300220b3703b00c200041186a2010370300200041106a20063703002000200b37030820004200370300200424000f0b200341ff076a20053c0000200320063700f7072003200e3600f3072003200f3600ef07200320103700e707200320113600e307200320123b00e107200320153a00e007200341e0046a41206a2001290300370300200341e0046a41186a2016290300370300200341e0046a41106a2017290300370300200341e0046a41086a2018290300370300200320032903b0033703e004200341e00e6a200341e0046a10d60220034180086a41086a200341e90e6a29000037030020034180086a41106a200341f10e6a29000037030020034180086a41186a200341f90e6a290000370300200320032900e10e370380080240024020032d00e00e4101460d00200341d8096a41186a20034180086a41186a290300370300200341d8096a41106a20034180086a41106a290300370300200341d8096a41086a20034180086a41086a29030037030020032003290380083703d8090240024002400240200d41ffff03714102490d00200b428080808010540d01200b422088a741e4004f0d022003200b3702b40c2003200c3602b00c200341e0046a41186a200341d8096a41186a290300370300200341e0046a41106a2202200341d8096a41106a290300370300200341e0046a41086a2201200341d8096a41086a290300370300200320032903d8093703e004200341e00e6a200341b00c6a200341e0046a10990320032802e00e4101470d0320034188096a41086a200341ec0e6a280200360200200320032902e40e370388090c83010b20034188096a410110ec020c040b20034188096a410410ec020c030b20034188096a410510ec020c020b200341e00e6a41086a2213280200211620032802e40e210f2001200341e00e6a410c6a2802003602002003200d3b01ec042003200f3602e404200341ccb7c5003602e004200341a0086a200341e0046a10f702200341083a0080052003410b3a0080052003410c3a008005200320032f01a0083b01e004200320032801a2083601e204200320032d00a6083a00e604200320032800a7083600e704200320032d00ab083a00eb042003410d3a008005200320032d00ac083a00ec042003410e3a008005200320032d00ad083a00ed042003410f3a008005200320032d00ae083a00ee04200320032d00af083a00ef04200341103a008005200341113a008005200320032d00b0083a00f004200341123a008005200320032d00b1083a00f104200341133a008005200320032d00b2083a00f204200341143a008005200320032d00b3083a00f304200341153a008005200320032d00b4083a00f404200341163a008005200320032d00b5083a00f504200341173a008005200320032d00b6083a00f604200320032d00b7083a00f704200341183a008005200341193a008005200320032d00b8083a00f8042003411a3a008005200320032d00b9083a00f9042003411b3a008005200320032d00ba083a00fa042003411c3a008005200320032d00bb083a00fb042003411d3a008005200320032d00bc083a00fc042003411e3a008005200320032d00bd083a00fd042003411f3a008005200320032d00be083a00fe04200320032d00bf083a00ff04200341203a008005200341e00e6a41186a221720032903f804370300201320032903e8042210370300200341e00e6a41106a20032903f0042206370300200320032903e004220b3703e00e200341c0046a41106a22132006370300200341c0046a41086a22182010370300200341c0046a41186a221120172903003703002003200b3703c004200341d8116a41186a2011290300370300200341d8116a41106a2013290300370300200341d8116a41086a2018290300370300200320032903c0043703d8112003200341e0076a41186a2900003703b8082003200341e0076a41106a2900003703b0082003200341e0076a41086a2900003703a808200320032900e0073703a008200341a8096a200341d8116a200341a0086a109b03200341e0046a20032802a809221320032802b009109c03200341a0086a41086a2001290300370300200341a0086a41106a2002290300370300200341b00c6a41086a20034184056a290200370300200341b00c6a41106a2003418c056a290200370300200341b00c6a41186a20034194056a290200370300200341b00c6a41206a22022003419c056a290200370300200341b00c6a41286a2217200341a4056a280200360200200320032903e0043703a008200320032902fc043703b00c024002400240024020032802f8042201450d0020034198046a41106a2218200341a0086a41106a29030037030020034198046a41086a2211200341a0086a41086a290300370300200341800a6a41086a220d200341b00c6a41086a290300370300200341800a6a41106a220e200341b00c6a41106a290300370300200341800a6a41186a2212200341b00c6a41186a290300370300200341800a6a41206a2002290300370300200341800a6a41286a2017280200360200200320032903a00837039804200320032903b00c3703800a024020032802ac09450d00201310260b20034180086a41166a2018290300221037010020034180086a410e6a2011290300370100200341c0046a41166a22022010370100200341c0046a41106a20034180086a41106a290100370300200320032903980437018608200341c0046a41086a20034180086a41086a29010037030020032003290180083703c004200341e00e6a41106a22132002290100370300200341e00e6a41086a200341c0046a410e6a290100370300200320032901c6043703e00e200320013602f80e200341a40f6a200341a80a6a2802003602002003419c0f6a200341a00a6a290300370200200341940f6a20122903003702002003418c0f6a200e290300370200200341840f6a200d290300370200200341fc0e6a20032903800a3702002013280200200a470d01200341f40e6a2802002009470d01200341840f6a2202200341d8096a412010d2060d03200341a0036a200220032903e00e200341e00e6a41086a29030010da0220034180086a41f88bc700410810fb01200341a8096a41d49fc200410910fb014120102422020d020c84010b024020032802ac09450d00201310260b20034188096a410810ec020c81010b20034188096a410b10ec020c7f0b200342203702b40c200320023602b00c200341b00c6a41004120106d20032802b00c220220032802b80c22176a221320032903d811370000201341086a200341d8116a41086a290300370000201341106a200341d8116a41106a290300370000201341186a200341d8116a41186a2903003700002003201741206a22133602b80c200341800a6a2002201310a202200341ec046a200220136a360200200320023602e8042003200341800a6a41086a3602e4042003200341800a6a3602e004200341c0046a200341e0046a1073024020032802b40c450d00200210260b412010242202450d8101200342203702840a200320023602800a200341800a6a41004120106d20032802800a220220032802880a22176a221320032900e007370000201341086a200341e0076a41086a290000370000201341106a200341e0076a41106a290000370000201341186a200341e0076a41186a2900003700002003201741206a22133602880a200341b00c6a2002201310bc02200341ec046a200220136a360200200320023602e8042003200341b00c6a41106a3602e4042003200341b00c6a3602e004200341a0086a200341e0046a1073024020032802840a450d00200210260b20032802c804220220032802a80822136a41206a2217417f4c0d190240024020170d0041012118410021170c010b201710242218450d82010b200341003602e804200320183602e004200320173602e404200341e0046a4100411010c90120032802e00420032802e80422176a2218200329008008370000201841086a20034180086a41086a2900003700002003201741106a22173602e804200341e0046a2017411010c90120032802e00420032802e80422176a221820032903a809370000201841086a200341a8096a41086a2903003700002003201741106a22183602e80420032802c0042117200341e0046a2018200210c90120032802e00420032802e80422186a2017200210cf061a2003201820026a22183602e80420032802a0082102200341e0046a2018201310c90120032802e004221820032802e80422116a2002201310cf061a2003201120136a22133602e804024020032802a408450d00200210260b024020032802c404450d00201710260b2018201310ff01024020032802e404450d00201810260b200341e0076a10a203200341ed046a200341d8096a41086a290300370000200341f5046a200341d8096a41106a290300370000200341fd046a200341d8096a41186a29030037000020034185056a20032903d8113700002003418d056a200341d8116a41086a29030037000020034195056a200341d8116a41106a2903003700002003419d056a200341d8116a41186a290300370000200341033a00e4042003410f3a00e004200320032903d8093700e504200341c8056a200a360200200341cc056a2009360200200341bd056a200341e0076a41186a290000370000200341b5056a200341e0076a41106a290000370000200341ad056a200341e0076a41086a290000370000200341a5056a20032900e007370000200341e0046a108702200341043a008809024020032802fc0e41ffffff3f71450d00200110260b201641ffffff3f71450d8001200f10260c80010b20034188096a410910ec020c7d0b200341023a0088090b200b42ffffff3f83500d7d200c10260c7d0b000b200341e00e6a41106a200141186a290300370300200341e00e6a41086a200141106a2903003703002003200141086a2903003703e00e200341e0046a41206a200241206a290200370300200341e0046a41186a200241186a290200370300200341e0046a41106a200241106a290200370300200341e0046a41086a200241086a290200370300200320022902003703e0042000200341e00e6a200341e0046a10d604200424000f0b20034198046a41086a2215200141286a2802003602002003200141206a290300370398042001411c6a280200211d200141186a2802002117200141146a280200210f200141106a280200210d2001410c6a280200211e200141086a280200210c2001412c6a280200210e200141306a2802002113200141346a2802002118200341b0036a200141386a41e40010cf061a200141a4016a2802002111200141a0016a28020021162001419c016a2802002112200341b00c6a200141a8016a41800110cf061a200341d8116a41206a2201200241206a290200370300200341d8116a41186a2214200241186a290200370300200341d8116a41106a220a200241106a290200370300200341d8116a41086a2209200241086a290200370300200320022902003703d811024002400240200c0e03000102000b200341e0046a41146a4101360200200342013702e404200341dcedc6003602e004200341043602840a200341d4edc6003602800a2003200341800a6a3602f004200341e0046a41ecc0c700103d000b200341e0076a41086a201528020036020020032003290398043703e007200341800a6a200341b0036a41e40010cf061a200341e00e6a200341b00c6a41800110cf061a200341e0046a41206a2001290300370300200341e0046a41186a2014290300370300200341e0046a41106a200a290300370300200341e0046a41086a2009290300370300200320032903d8113703e004200341d8096a200341e0046a10d602200341c0046a41086a200341e1096a2201290000370300200341c0046a41106a200341e9096a2202290000370300200341c0046a41186a200341f1096a2215290000370300200320032900d9093703c004024002400240024002400240024020032d00d8094101460d00200341a0086a41186a200341c0046a41186a2903002210370300200341a0086a41106a200341c0046a41106a2903002206370300200341a0086a41086a200341c0046a41086a290300220b370300200320032903c00422053703a00820152010370000200220063700002001200b370000200320053700d909200341013a00d809200341e0046a41086a200341e0076a41086a280200360200200341f4046a2018360200200341e0046a41106a2013360200200341e0046a410c6a200e360200200320032903e0073703e004200341e0046a41186a200341800a6a41e40010cf061a200341e4056a2011360200200341e0046a4180016a2016360200200341dc056a2012360200200341e8056a200341e00e6a41800110cf061a20034180086a410c6a201736020020034180086a41086a200f3602002003201d360290082003200d360284082003201e36028008200341d8096a200341e0046a20034180086a10d90541ff017122024104460d0641bc8fc600210f4280808080e00221104102210120020e0401020304010b02402017450d002017410c6c2101200d210303400240200341046a280200450d00200328020010260b2003410c6a2103200141746a22010d000b0b0240200f450d00200f410c6c450d00200d10260b02402018450d00201841246c2101200e210303400240024020032d0000220241044b0d0002400240024020020e050400010204040b2003410c6a280200450d03200341086a28020010260c030b2003410c6a280200450d02200341086a28020010260c020b2003410c6a280200450d01200341086a28020010260c010b200341086a280200450d00200341046a28020010260b200341246a21032001415c6a22010d000b0b02402013450d00201341246c450d00200e10260b02402011450d00201141246c21012012210303400240024020032d0000220241044b0d0002400240024020020e050400010204040b2003410c6a280200450d03200341086a28020010260c030b2003410c6a280200450d02200341086a28020010260c020b2003410c6a280200450d01200341086a28020010260c010b200341086a280200450d00200341046a28020010260b200341246a21032001415c6a22010d000b0b02402016450d00201641246c450d00201210260b4200210641022103420021100c040b200341f4046a4101360200200342013702e404200341dcedc6003602e004200341043602dc0920034190f6c6003602d8092003200341d8096a3602f004200341e0046a41ecc0c700103d000b41a48fc600210f428080808080032110410021010c010b418c8fc600210f428080808080032110410121010b200fad2106410321030b200020013a0022200041023a00212000420037030820002010200684370024200041206a20033a0000200041186a41003a000020004201370300200424000f0b200041186a41003a000020004200370308200020032800c8093600192000411c6a200341cb096a28000036000020004200370300200424000f0b20034180086a41086a2015280200360200200320032903980437038008200341800a6a200341b0036a41e40010cf061a200341e00e6a200341b00c6a41800110cf061a200341e0046a41206a2001290300370300200341e0046a41186a2014290300370300200341e0046a41106a200a290300370300200341e0046a41086a2009290300370300200320032903d8113703e0040240024002400240024002400240200341e0046a10b1040d00200341e0046a10b603200341f1096a200341e0046a41186a2201290300370000200341e9096a200341f0046a2202290300370000200341e1096a200341e0046a41086a2215290300370000200341013a00d809200320032903e0043700d909201520034180086a41086a280200360200200341f4046a201836020020022013360200200341e0046a410c6a200e36020020032003290380083703e0042001200341800a6a41e40010cf061a200341e4056a2011360200200341e0046a4180016a2016360200200341dc056a2012360200200341e8056a200341e00e6a41800110cf061a200341a0086a410c6a2017360200200341a0086a41086a200f3602002003201d3602b0082003200d3602a4082003201e3602a008200341d8096a200341e0046a200341a0086a10d90541ff017122024104460d0641bc8fc600210f4280808080e00221104102210120020e0401020304010b02402017450d002017410c6c2101200d210303400240200341046a280200450d00200328020010260b2003410c6a2103200141746a22010d000b0b0240200f450d00200f410c6c450d00200d10260b02402018450d00201841246c2101200e210303400240024020032d0000220241044b0d0002400240024020020e050400010204040b2003410c6a280200450d03200341086a28020010260c030b2003410c6a280200450d02200341086a28020010260c020b2003410c6a280200450d01200341086a28020010260c010b200341086a280200450d00200341046a28020010260b200341246a21032001415c6a22010d000b0b02402013450d00201341246c450d00200e10260b02402011450d00201141246c21012012210303400240024020032d0000220241044b0d0002400240024020020e050400010204040b2003410c6a280200450d03200341086a28020010260c030b2003410c6a280200450d02200341086a28020010260c020b2003410c6a280200450d01200341086a28020010260c010b200341086a280200450d00200341046a28020010260b200341246a21032001415c6a22010d000b0b02402016450d00201641246c450d00201210260b4200210641022103420021100c040b200341f4046a4101360200200342013702e404200341dcedc6003602e004200341043602dc0920034190f6c6003602d8092003200341d8096a3602f004200341e0046a41ecc0c700103d000b41a48fc600210f428080808080032110410021010c010b418c8fc600210f428080808080032110410121010b200fad2106410321030b200020013a0022200041023a00212000420037030820002010200684370024200041206a20033a0000200041186a41003a000020004201370300200424000f0b200041186a41003a000020004200370308200020032800c8093600192000411c6a200341cb096a28000036000020004200370300200424000f0b200141086a2903002110200341e0046a41206a200241206a290200370300200341e0046a41186a200241186a290200370300200341e0046a41106a200241106a290200370300200341e0046a41086a200241086a290200370300200320022902003703e00402400240200341e0046a10b1040d00200341c0046a41186a22024200370300200341c0046a41106a22014200370300200341c0046a41086a220f4200370300200342003703c00420034180086a418a8cc700410910fb01200f20034180086a41086a29000037030020032003290080083703c004200341a8096a41d4e6c600410910fb012002200341a8096a41086a290300370300200120032903a809370300200341206a200341c0046a412041d4c0c7004100410010810220032802204101460d15200341c0046a41186a220f4200370300200341d0046a22134200370300200341c0046a41086a22024200370300200342003703c00420034180086a418a8cc700410910fb01200220034180086a41086a221629000037030020032003290080083703c004200341a8096a41808ec500410310fb01200141086a2217200341a8096a41086a2218290300370100200120032903a809370100200341106a200341c0046a10ab032003280210450d0120032903182206500d01200642b8177c2010580d01418cb8c50041ce0041dcbcc700102f000b2000420037002420004200370308200041206a41023a0000200041186a41003a000020004201370300200424000f0b200f42003703002013420037030020024200370300200342003703c00420034180086a418a8cc700410910fb012002201629000037030020032003290080083703c004200341a8096a41808ec500410310fb0120172018290300370100200120032903a809370100200320103703e004200341c0046a4120200341e0046a410810b301200f42003703002013420037030020024200370300200342003703c00420034180086a418a8cc700410910fb012002201629000037030020032003290080083703c004200341a8096a41d4e6c600410910fb0120172018290300370100200120032903a809370100200341013a00b003200341c0046a4120200341b0036a410110b301200041186a41003a000020004200370308200020032800c8093600192000411c6a200341c8096a41036a28000036000020004200370300200424000f0b20034198046a41086a22182001411d6a29000037030020032001290015370398042001410d6a2900002106200141286a2802002111200141056a290000211020012d0004210f20012d0025210d200341e00e6a41206a2201200241206a290200370300200341e00e6a41186a2213200241186a290200370300200341e00e6a41106a2216200241106a290200370300200341e00e6a41086a2217200241086a290200370300200320022902003703e00e2010421888a72102024002400240024002400240200f0e06000102030405000b200341f4046a4101360200200342013702e404200341dcedc6003602e004200341043602dc09200341d4edc6003602d8092003200341d8096a3602f004200341e0046a41ecc0c700103d000b200341e0046a41206a2001290300370300200341e0046a41186a2013290300370300200341e0046a41106a2016290300370300200341e0046a41086a2017290300370300200320032903e00e3703e004200341b00c6a200341e0046a10d60220032d00b00c4101460d17200341b00c6a41186a2903002110200341b00c6a41086a2903002106200341b00c6a41106a2802002101200341c40c6a280200210f20032d00b10c211320032f01b20c211620032802b40c21172003419f0a6a200341b00c6a41206a3100003c0000200320103700970a2003200f3600930a2003200136008f0a200320063700870a200320173600830a200320163b00810a200320133a00800a200341b0036a2002109703200341e0046a20032802b003221120032802b803221310d305200341a0086a41086a2201200341e0046a41186a290300370300200341a0086a41106a221620034180056a290300370300200341a0086a41186a221720034188056a290300370300200320032903f0043703a00820032003280091053602e007200320034194056a2800003600e307200341e0046a41086a290300211020032903e0042106024020032d009005220f4102460d0020034180086a41186a201729030037030020034180086a41106a201629030037030020034180086a41086a2001290300370300200320032903a00837038008200320032802e00736028809200320032800e30736008b090b02400240200f4102470d0020034180086a41186a200341800a6a41186a29030037030020034180086a41106a200341800a6a41106a29030037030020034180086a41086a200341800a6a41086a290300370300200320032903800a37038008420021104280a094a58d1d2106200341b00c6a200341800a6a4280a094a58d1d420010d9024100210f0c010b200341b00c6a410310e9020b0240024020032d00b00c22014104470d0020034194056a200328008b09360000200341e0046a41186a20034180086a41086a29030037030020034180056a20034190086a29030037030020034188056a20034180086a41186a290300370300200320063703e00420032003290380083703f0042003200f3a009005200320032802880936009105200320103703e80420112013200341e0046a10d405200341b00c6a41086a280200210f20032d00b10c211320032d00b20c211620032d00b30c211720032802b40c21180c010b200341b80c6a280200210f20032802b40c211820032d00b30c211720032d00b20c211620032d00b10c21130b024020032802b403450d00201110260b20014104470d7920034188056a2002360200200341ed046a200341880a6a290300370000200341f5046a200341900a6a290300370000200341fd046a200341800a6a41186a290300370000200341003a00e404200341013a00e004200320032903800a3700e504200341e0046a108702200041186a41003a000020004200370308200020032800d8093600192000411c6a200341db096a28000036000020004200370300200424000f0b200341b0036a41186a2018290300370300200320063703b803200320103703b00320032003290398043703c003200341e0046a41206a2001290300370300200341e0046a41186a2013290300370300200341e0046a41106a2016290300370300200341e0046a41086a2017290300370300200320032903e00e3703e004200341b00c6a200341e0046a10d602200341a0086a41086a200341b90c6a290000370300200341a0086a41106a200341c10c6a290000370300200341a0086a41186a200341c90c6a290000370300200320032900b10c3703a00820032d00b00c4101460d17200341800a6a41186a200341a0086a41186a290300370300200341800a6a41106a200341a0086a41106a290300370300200341800a6a41086a200341a0086a41086a290300370300200320032903a0083703800a0240200341800a6a200341b0036a412010d206450d00200341a0086a2011109703200341e0046a20032802a008220220032802a808221310d305200341d8116a41086a20034188056a29030037030020032003290380053703d81120032003280091053602e007200320034194056a2800003600e307200341e0046a41186a290300211020032903f004210620032903e804210b20032903e0042105024020032d009005220f41024622010d00200341d8096a41086a200341d8116a41086a290300370300200320032903d8113703d809200320032802e00736028809200320032800e30736008b090b200341e0076a41086a2216200341d8096a41086a290300370300200320032903d8093703e00720010d1920034180086a41086a20162903002207370300200320032903e007220837038008200341f8046a2007370300200320103703e804200320063703e004200320083703f004200f4101710d1a200341e0046a200341800a6a412010d2060d1b200341b00c6a200341800a6a200341b0036a2005200b410110e002200341b00c6a41086a2903002107024020032802b00c4101460d00200341c00c6a2903002110200341d8096a41086a200341c8036a290300370300200320032903c0033703d809200341043a00d8114200200b20107d2005200754ad7d2210200520077d22062005562010200b562010200b511b22011b210b4200200620011b210520032903b803211020032903b00321064100210f0c740b20032802b40c2101200320073702dc11200320013602d8110c720b200341c0046a410410e90220032d00c00422014104460d750c770b200341e0046a41206a2001290300370300200341e0046a41186a2013290300370300200341e0046a41106a2016290300370300200341e0046a41086a2017290300370300200320032903e00e3703e004200341b00c6a200341e0046a10d602200341a0086a41086a200341b90c6a290000370300200341a0086a41106a200341c10c6a290000370300200341a0086a41186a200341c90c6a290000370300200320032900b10c3703a00820032d00b00c4101460d1c200341800a6a41186a200341a0086a41186a290300370300200341800a6a41106a200341a0086a41106a290300370300200341800a6a41086a200341a0086a41086a290300370300200320032903a0083703800a200341b0036a2002109703200341e0046a20032802b003221120032802b803220f10d305200341d8116a41086a221320034188056a29030037030020032003290380053703d811200341e0046a41186a290300211020032903f004210620032903e804210b20032903e0042105024020032d009005221641024622010d00200341d8096a41086a2013290300370300200320032903d8113703d8090b200341e0076a41086a200341d8096a41086a290300370300200320032903d8093703e00720010d1a20034180086a41086a200341e0076a41086a2903002207370300200320032903e007220837038008200341f8046a2007370300200320103703e804200320063703e004200320083703f00420164101710d1b0240200341e0046a200341800a6a412010d2060d00200341286a200341800a6a2005200b10da02200341043a00b00c0c6c0b200341b00c6a410210e9020c6a0b200341b00c6a41086a201829030037030020032003290398043703b00c200341e0046a41206a2001290300370300200341e0046a41186a2013290300370300200341e0046a41106a2016290300370300200341e0046a41086a2017290300370300200320032903e00e3703e004200341e0046a10cd030d1c200341800a6a2011109703200341e0046a20032802800a220120032802880a220210d30520034180086a41086a221320034188056a29030037030020032003290380053703800820032003280091053602e007200320034194056a2800003600e307200341f8046a290300210b20032903f004210520032903e804210720032903e0042108024020032d009005410246220f0d00200341d8116a41086a201329030037030020032003290380083703d811200320032802e00736028809200320032800e30736008b090b200341e0076a41086a200341d8116a41086a290300370300200320032903d8113703e0070240200f0d00200341f8046a200341e8076a290300370300200320032903e0073703f004200320053703e0042003200b3703e804200341386a200341e0046a2008200710da020b200341e0046a41186a200637030020034180056a20032903b00c37030020034194056a200328008b0936000020034188056a220f200341b80c6a2213290300370300200320103703f004200342003703e804200342003703e0042003200d3a00900520032003280288093600910520012002200341e0046a10d405024020032802840a450d00200110260b200341ed046a2006370000200341f5046a20032903b00c370000200f2011360200200341fd046a2013290300370000200320103700e504200341003a00e404200341013a00e004200341e0046a108702200041186a41003a000020004200370308200020032800c8093600192000411c6a200341cb096a28000036000020004200370300200424000f0b200341e0046a41206a2001290300370300200341e0046a41186a2013290300370300200341e0046a41106a2016290300370300200341e0046a41086a2017290300370300200320032903e00e3703e004200341b00c6a200341e0046a10d602200341a0086a41086a200341b90c6a290000370300200341a0086a41106a200341c10c6a290000370300200341a0086a41186a200341c90c6a290000370300200320032900b10c3703a00820032d00b00c4101460d1e200341800a6a41186a200341a0086a41186a290300370300200341800a6a41106a200341a0086a41106a290300370300200341800a6a41086a200341a0086a41086a290300370300200320032903a0083703800a200341a0086a2002109703200341e0046a20032802a008221820032802a808221310d305200341d8116a41086a220f20034188056a29030037030020032003290380053703d81120032003280091053602e007200320034194056a2800003600e307200341e0046a41186a290300211020032903f004210620032903e804210b20032903e0042105024020032d009005221641024622010d00200341d8096a41086a200f290300370300200320032903d8113703d809200320032802e00736028809200320032800e30736008b090b200341e0076a41086a200341d8096a41086a290300370300200320032903d8093703e00720010d1c20034180086a41086a200341e0076a41086a2903002207370300200320032903e007220837038008200341f8046a2007370300200320103703e804200320063703e004200320083703f00420164101710d1d0240200341e0046a200341800a6a412010d2060d00200341e0006a200341800a6a2005200b10e102200341e0006a41086a29030021082003290360210b42002105200341d8046a22014200370300200341c0046a41106a220f4200370300200341c0046a41086a22164200370300200342003703c00420034180086a419a8cc700410810fb01201620034180086a41086a221129000037030020032003290080083703c004200341a8096a41b8a1c300410d10fb012001200341a8096a41086a220d290300370300200f20032903a809370300200341c8006a200341c0046a108d02200341c8006a41106a2903002107200329035021192003280248211720014200370300200f420037030020164200370300200342003703c00420034180086a419a8cc700410810fb012016201129000037030020032003290080083703c004200341a8096a41b8a1c300410d10fb012001200d290300370300200f20032903a809370300200342002007420020171b220720087d2019420020171b2208200b54ad7d22192008200b7d220b200856201920075620192007511b22011b3703b80c20034200200b20011b3703b00c200341c0046a4120200341b00c6a411010b301200341d8096a41086a200341f0046a220141086a290300370300200341043a00b003200320012903003703d8094101210f4200210b0c640b200341b0036a410210e9020c620b200141d8006a290300211a200141d0006a290300211b200141c8006a2903002119200141c0006a290300210b200141386a2903002110200141306a2903002106200141286a3100002105200141206a29000021072001412c6a28000021152001411c6a2800002118200141186a2800002111200141106a29000021082001410c6a280000210d200141086a2d0000210f20012f002a210c20012d0029211420012f000a210e20012d00092112200341800a6a41206a2201200241206a290200370300200341800a6a41186a2213200241186a290200370300200341800a6a41106a2216200241106a290200370300200341800a6a41086a2217200241086a290200370300200320022902003703800a02400240024002400240200f0e050001020304000b200341f4046a4101360200200342013702e404200341dcedc6003602e004200341043602dc09200341d4edc6003602d8092003200341d8096a3602f004200341e0046a41ecc0c700103d000b200341e0046a41206a2001290300370300200341e0046a41186a2013290300370300200341e0046a41106a2016290300370300200341e0046a41086a2017290300370300200320032903800a3703e004200341e00e6a200341e0046a10d602200341e0076a41086a200341e90e6a290000370300200341e0076a41106a200341f10e6a290000370300200341e0076a41186a200341f90e6a290000370300200320032900e10e3703e00702400240024020032d00e00e4101470d004200211041022101420021060c010b200341b00c6a41186a200341e0076a41186a290300370300200341b00c6a41106a200341e0076a41106a290300370300200341b00c6a41086a200341e0076a41086a290300370300200320032903e0073703b00c200341ff046a20053c0000200320073700f704200320183600f304200320113600ef04200320083700e7042003200d3600e3042003200e3b00e104200320123a00e004200341e00e6a200341b00c6a200341e0046a20062010410110d70320032d00e00e22014104460d0120033502e40e211020032d00e30e211320032d00e20e210f20032d00e10e2102200341e00e6a41086a35020042208621060b200020133a00232000200f3a0022200020023a00212000420037030820002006201084370024200041206a20013a0000200041186a41003a000020004201370300200424000f0b20004200370308200020032800c809360019200041186a41003a00002000411c6a200341cb096a28000036000020004200370300200424000f0b200341e0046a41206a2001290300370300200341e0046a41186a2013290300370300200341e0046a41106a2016290300370300200341e0046a41086a2017290300370300200320032903800a3703e004200341e0046a10cd030d21200341cf036a20053c0000200320073700c703200320183600c303200320113600bf03200320083700b7032003200d3600b3032003200e3b00b103200320123a00b003200341a0086a200341b0036a10d803200341e00e6a20032802a008220220032802a808220f10d90320032903e00e2107200342003703e00e42002010200b20067c22054280c8afa025544100201920107c2005200b54ad7c501b22011b21104200200620011b2106200341a80f6a280200211320032d00ac0f21160240024020074201510d004200211b4200211c4200211f42002120420021214200212242002123420021244200211a420021080c010b200341980f6a290300211f200341900f6a290300211c200341880f6a290300211b200341800f6a2903002124200341f80e6a290300212120032903f00e210820032903e80e211a200341a00f6a290300212042002122420021230b4200201920011b21054200200b20011b210b2006201a562010200856201020085122011b0d202006201a54201020085420011b450d6220034198086a2201420037030020034180086a41106a2217420037030020034180086a41086a221842003703002003420037038008200341d8096a419a8cc700410810fb012018200341d8096a41086a220d290300370300200320032903d80937038008200341d8116a41b8a1c300410d10fb012001200341d8116a41086a220e290300370300201720032903d811370300200341e0016a20034180086a108d02200341e0016a41106a290300211920032903e801212520032802e00121112001420037030020174200370300201842003703002003420037038008200341d8096a419a8cc700410810fb012018200d290300370300200320032903d80937038008200341d8116a41b8a1c300410d10fb012001200e290300370300201720032903d811370300200342002019420020111b2219201a200654ad201020087d7c7c2025420020111b2208201a20067d222554ad7d221a200820257d2225200856201a201956201a2019511b22011b3703e80420034200202520011b3703e00420034180086a4120200341e0046a411010b3010c620b200341e0046a41206a2001290300370300200341e0046a41186a2013290300370300200341e0046a41106a2016290300370300200341e0046a41086a2017290300370300200320032903800a3703e004024002400240200341e0046a10cd03450d004102210142002110420021060c010b200341e0076a411f6a20053c0000200320113600ef07200320083700e707200341e00e6a41086a200341e0076a41086a290300370300200320073700f707200320183600f307200341e00e6a41106a200341e0076a41106a290300370300200341e00e6a41186a200341e0076a41186a2903003703002003200d3600e3072003200e3b00e107200320123a00e007200320032903e0073703e00e200341e0046a411f6a20193c00002003200b3700f704200320063700e704200320153600e3042003200c3b00e104200320143a00e004200320103e00ef04200320104220883e00f304200341b00c6a200341e00e6a200341e0046a201b201a410110d70320032d00b00c22014104460d0120033502b40c211020032d00b30c211320032d00b20c210f20032d00b10c2102200341b00c6a41086a35020042208621060b200020133a00232000200f3a0022200020023a00212000420037030820002006201084370024200041206a20013a0000200041186a41003a000020004201370300200424000f0b20004200370308200020032800c809360019200041186a41003a00002000411c6a200341cb096a28000036000020004200370300200424000f0b200341e0046a41206a2001290300370300200341e0046a41186a2013290300370300200341e0046a41106a2016290300370300200341e0046a41086a2017290300370300200320032903800a3703e004200341e00e6a200341e0046a10d602200341e0076a41086a200341e90e6a290000370300200341e0076a41106a200341f10e6a290000370300200341e0076a41186a200341f90e6a290000370300200320032900e10e3703e00702400240024020032d00e00e4101470d004200211041022101420021060c010b200341b00c6a41186a200341e0076a41186a290300370300200341b00c6a41106a200341e0076a41106a290300370300200341b00c6a41086a200341e0076a41086a290300370300200320032903e0073703b00c200341ff046a20053c0000200320073700f704200320183600f304200320113600ef04200320083700e7042003200d3600e3042003200e3b00e104200320123a00e004200341e00e6a200341b00c6a200341e0046a20062010410010d70320032d00e00e22014104460d0120033502e40e211020032d00e30e211320032d00e20e210f20032d00e10e2102200341e00e6a41086a35020042208621060b200020133a00232000200f3a0022200020023a00212000420037030820002006201084370024200041206a20013a0000200041186a41003a000020004201370300200424000f0b20004200370308200020032800c809360019200041186a41003a00002000411c6a200341cb096a28000036000020004200370300200424000f0b2001410c6a2802002117200141086a28020021112001280204210d200341e0046a41206a200241206a290200370300200341e0046a41186a200241186a290200370300200341e0046a41106a200241106a290200370300200341e0046a41086a200241086a290200370300200320022902003703e004024002400240200341e0046a10b1040d002017410a4b0d01200341a0086a41186a22024200370300200341a0086a41106a22094200370300200341a0086a41086a22014200370300200342003703a00820034180086a41a28cc700410a10fb01200120034180086a41086a220f29030037030020032003290380083703a008200341e0076a41b0cbc500410c10fb012002200341e0076a41086a2216290300370300200920032903e007370300200341a0086a108a02221341ff01714102460d022013410171450d0220034188096a410210f2020c600b200341023a0088090c5f0b20034188096a410310f2020c5e0b200242003703002009420037030020014200370300200342003703a00820034180086a41a28cc700410a10fb012001200f29030037030020032003290380083703a008200341e0076a41b0cbc500410c10fb01200941086a2016290300370300200920032903e007370300200341013a00b003200341a0086a4120200341b0036a410110b301200341c0046a41186a22014200370300200341c0046a41106a221d4200370300200341c0046a41086a22024200370300200342003703c00420034180086a41808cc700410610fb012002200f29000037030020032003290080083703c004200341a8096a41ea93c400410610fb012001200341a8096a41086a290300370300201d20032903a80937030020034180026a200341c0046a412010890220032802840241002003280280021b210f20034198046a10b403024020032802a0042202200328029c04470d0020034198046a200210f70120032802a00421020b2003280298042215200241c4006c6a220141003a0000200120032f01c4083b00012001200f360204200120032902e004370208200141036a20032d00c6083a0000200141106a200341e0046a41086a2226290200370200200141186a200341e0046a41106a2227290200370200200141206a200341e0046a41186a290200370200200141286a200341e0046a41206a290200370200200141306a200341e0046a41286a290200370200200141386a200341e0046a41306a290200370200200141c0006a200341e0046a41386a2802003602002003200241016a22123602a004200d201741f0006c22016a2128024020170d00200d21130c5b0b200341ee076a2114200d41f4006a2116200141907f6a2118200341c0046a41186a2129200341ff076a212a200d211303402013280204210c2013280200210f200341e0046a201341086a41e80010cf061a201341f0006a2113200c450d5b200341e00e6a200341e0046a41e80010cf061a2003200c3602e4042003200f3602e0042026200341e00e6a41e80010cf061a20294200370300200341c0046a41106a4200370300200341c0046a41086a22014200370300200342003703c00420034180086a41808cc700410610fb01200120034180086a41086a220a29000037030020032003290080083703c004200341a8096a41ea93c400410610fb01201d41086a200341a8096a41086a290300370100201d20032903a809370100200341f8016a200341c0046a412010890220032802f801210120032802fc012102200341800a6a200341e0046a10f4020240200f450d00200f2002410020011b22014b0d21200341b00c6a200f417f6a10b204200341b00c6a2027412010d2060d22200f2001490d230240024020152015201241c4006c22026a460d00201541016a2101034002402001417f6a2d00004101470d004101210e200341800a6a2001460d032001200341800a6a412010d206450d030b200141c4006a2101200241bc7f6a22020d000b0b4100210e0b200341b00c6a200f10b204200341b00c6a200341800a6a412010d2062101200e0d242001450d24200341d8116a41086a2201200341b0036a41086a290200370300200341d8116a41106a2202200341b0036a41106a2f01003b0100200320032901d8093703a008200320032902b0033703d8112003200341d8096a41066a2901003701a608200320032901a6083701e607200320032903a00822103703e007201441106a20022f01003b0000201441086a2001290300370000201420032903d811370000202a310000210620032f00e107210220032800e307210f20032900f707210b20032800f307210e20032800ef07211e20032900e7072105200341800a6a200341e0046a10f402200341b00c6a41186a4200370300200341b00c6a41106a4200370300200341b00c6a41086a4200370300200342003703b00c200341b00c6a10b70320034180086a41186a222b200341800a6a41186a29030037030020034180086a41106a222c200341800a6a41106a290300370300200a200341800a6a41086a290300370300200320032903800a370380082010a7212d02402012200328029c04470d0020034198046a201210f701200328029804211520032802a00421120b2015201241c4006c6a220141013a0000200a2903002110202c2903002107202b29030021082003290380082119200141c1006a20063c00002001200b3700392001200e3600352001201e360031200120053700292001200f360025200120023b00232001202d3a0022200141003a002120012019370001200141196a2008370000200141116a2007370000200141096a20103700002003201241016a22123602a004024020032802ec042201450d00200141246c2102200c210103400240024020012d0000220f41044b0d00024002400240200f0e050400010204040b2001410c6a280200450d03200141086a28020010260c030b2001410c6a280200450d02200141086a28020010260c020b2001410c6a280200450d01200141086a28020010260c010b200141086a280200450d00200141046a28020010260b200141246a21012002415c6a22020d000b0b024020032802e8042201450d00200141246c450d00200c10260b201841907f6a2118201641f0006a211620132028470d010c5d0b0b200341b00c6a410410f202200341e2096a200341b00c6a41086a280200360100200341d8116a41086a200341b0036a41086a290200370300200341d8116a41106a200341b0036a41106a2f01003b0100200320032903b00c3701da09200320032902b0033703d811200320032901d8093703a0082003200341de096a2901003701a6080c590b200141086a280200211820012802042101200341e00e6a41206a220f200241206a290200370300200341e00e6a41186a2213200241186a290200370300200341e00e6a41106a2216200241106a290200370300200341e00e6a41086a2217200241086a290200370300200320022902003703e00e02402001450d00200341e0046a41206a200f290300370300200341e0046a41186a2013290300370300200341e0046a41106a2016290300370300200341e0046a41086a2017290300370300200320032903e00e3703e004200341b00c6a200341e0046a10d60220034180086a41086a200341b90c6a29000037030002400240024020032d00b00c4101470d004102210320180d010c020b410321032018450d010b200110260b2000418a023b00212000420037030820004201370300200041206a20033a0000200041186a41003a0000200041e9b2c200ad4280808080f00284370024200424000f0b200341e0046a41206a200f290300370300200341e0046a41186a2013290300370300200341e0046a41106a2016290300370300200341e0046a41086a2017290300370300200320032903e00e3703e004200341b00c6a200341e0046a10d602200341c0046a41086a200341b90c6a290000370300200041e9b2c200ad221020104280808080f0028420032d00b00c41014622031b3700242000418a023b0021200041206a4102410320031b3a0000200041186a41003a00002000420037030820004201370300200424000f0b2001280204210f200341e0046a41206a200241206a290200370300200341e0046a41186a200241186a290200370300200341e0046a41106a200241106a290200370300200341e0046a41086a200241086a290200370300200320022902003703e004024002400240200341e0046a10b104450d0041022102420021100c010b200341a0086a41186a22014200370300200341a0086a41106a22134200370300200341a0086a41086a4200370300200342003703a008200341a0086a41bb8cc700410f10fb01200341e0076a41b1eec600410610fb012001200341e0076a41086a290300370300201320032903e0073703004100210120034190026a200341a0086a412041d4c0c700410041001081024103210202402003280290024101470d004280808080e001211041bbf6c60021030c010b200341c0046a41186a22014200370300200341c0046a41106a22164200370300200341c0046a41086a22174200370300200342003703c00420034180086a41808cc700410610fb01201720034180086a41086a29000037030020032003290080083703c004200341a8096a41ea93c400410610fb012001200341a8096a41086a290300370300201620032903a80937030020034188026a200341c0046a4120108902200328028c0241002003280288021b200f4f0d014280808080f000211041c9f6c6002103410121010b200020013a00222000410b3a002120004200370308200041206a20023a0000200041186a41003a0000200020102003ad8437002420004201370300200424000f0b200341a0086a41186a4200370300200341a0086a41106a4200370300200341a0086a41086a4200370300200342003703a008200341a0086a41bb8cc700410f10fb01200341e0076a41b1eec600410610fb01201341086a200341e0076a41086a290300370300201320032903e0073703002003200f3602e004200341a0086a4120200341e0046a410410b301200041186a41003a000020004200370308200020032800c8093600192000411c6a200341cb096a28000036000020004200370300200424000f0b2001411c6a2802002112200141186a2802002111200141146a2802002118200141106a280200210d2001410c6a280200210e200141086a280200210f200341b00c6a200141206a41800210cf061a200341800a6a41206a2201200241206a290200370300200341800a6a41186a2213200241186a290200370300200341800a6a41106a2216200241106a290200370300200341800a6a41086a2217200241086a290200370300200320022902003703800a0240024002400240200f0e0400010203000b200341e0046a41146a4101360200200342013702e404200341dcedc6003602e004200341043602dc09200341d4edc6003602d8092003200341d8096a3602f004200341e0046a41ecc0c700103d000b200341e00e6a200341b00c6a41800210cf061a200341e0046a41206a2001290300370300200341e0046a41186a2013290300370300200341e0046a41106a2016290300370300200341e0046a41086a2017290300370300200320032903800a3703e004200341b0036a200341e0046a10d602200341c0046a41086a200341b9036a2201290000370300200341c0046a41106a200341c1036a2202290000370300200341c0046a41186a200341c9036a220f290000370300200320032900b1033703c00402400240024020032d00b0034101460d00200341a0086a41186a200341c0046a41186a2903002210370300200341a0086a41106a200341c0046a41106a2903002206370300200341a0086a41086a200341c0046a41086a290300220b370300200320032903c00422053703a008200f2010370000200220063700002001200b370000200320053700b103200341013a00b003200341e0046a200341e00e6a41800210cf061a200341e4116a2011360200200341d8116a41086a2018360200200320123602e8112003200d3602dc112003200e3602d811200341b0036a200341e0046a200341d8116a10ae05220141ff01714108470d01200341043a00d8090c5a0b200341023a00d80902402011450d002011410c6c2102200d210103400240200141046a280200450d00200128020010260b2001410c6a2101200241746a22020d000b0b02402018450d002018410c6c450d00200d10260b410221010c010b200341d8096a200110e80220032d00d80922014104460d580b20032f00d909210220032d00db09210f200020032902dc093700242000200f3a0023200020023b0021200041206a20013a0000200041186a41003a00002000420037030820004201370300200424000f0b200341e00e6a200341b00c6a41800210cf061a200341e0046a41206a2001290300370300200341e0046a41186a2013290300370300200341e0046a41106a2016290300370300200341e0046a41086a2017290300370300200320032903800a3703e004024002400240200341e0046a10b1040d00200341e0046a10b603200341c9036a200341f8046a290300370000200341c1036a200341f0046a290300370000200341b9036a200341e0046a41086a290300370000200341013a00b003200320032903e0043700b103200341e0046a200341e00e6a41800210cf061a200341e4116a2011360200200341d8116a41086a2018360200200320123602e8112003200d3602dc112003200e3602d811200341b0036a200341e0046a200341d8116a10ae05220141ff01714108470d01200341043a00d8090c580b200341023a00d80902402011450d002011410c6c2102200d210103400240200141046a280200450d00200128020010260b2001410c6a2101200241746a22020d000b0b02402018450d002018410c6c450d00200d10260b410221010c010b200341d8096a200110e80220032d00d80922014104460d560b20032f00d909210220032d00db09210f200020032902dc093700242000200f3a0023200020023b0021200041206a20013a0000200041186a41003a00002000420037030820004201370300200424000f0b200341e0046a41206a2001290300370300200341e0046a41186a2013290300370300200341e0046a41106a2016290300370300200341e0046a41086a2017290300370300200320032903800a3703e0040240200341e0046a10cd03450d002000420037002420004200370308200041206a41023a0000200041186a41003a000020004201370300200424000f0b200341c0046a41186a22014200370300200341d0046a22024200370300200341c0046a41086a220f4200370300200342003703c00420034180086a41aed3c500410f10fb01200f20034180086a41086a29000037030020032003290080083703c004200341a8096a41c5d8c500410710fb012001200341a8096a41086a290300370300200220032903a809370300200341c0046a4120200e200d10e103200041186a41003a000020004200370308200020032800c8093600192000411c6a200341cb096a28000036000020004200370300200424000f0b200141246a28020021162001411c6a280200210f200141186a2802002113200141146a2802002117200141106a280200210d2001410c6a2802002118200141086a2802002111200341e0046a41206a200241206a290200370300200341e0046a41186a200241186a290200370300200341e0046a41106a200241106a290200370300200341e0046a41086a200241086a290200370300200320022902003703e004024002400240200341e0046a10b104450d004200211041022116420021060c010b200341c0046a41186a22014200370300200341c0046a41106a22024200370300200341c0046a41086a220e4200370300200342003703c00420034180086a41b48cc700410710fb01200e20034180086a41086a29000037030020032003290080083703c004200341a8096a4184c1c200410c10fb012001200341a8096a41086a290300370300200220032903a809370300200341a0026a200341c0046a4120108902200341e0046a20032802a402410020032802a0021b22152016108e0520034198026a20032802e004220120032802e80441d4c0c70041004100108102200328029802210e024020032802e404450d00200110260b200341800a6a10ac0320032802800a21120240200e41014622020d00201220164105746a410020032802880a20164b1b22010d020b024020032802840a41ffffff3f71450d00201210260b4280808080b0024280808080a00120021b210641b8edc500ad41aeedc500ad200e4101461b2110410321160b02402018450d00201110260b0240200f450d00200f410c6c21012017210303400240200341046a280200450d00200328020010260b2003410c6a2103200141746a22010d000b0b02402013450d002013410c6c450d00201710260b200020023a00222000410d3a00212000420037030820002006201084370024200041206a20163a0000200041186a41003a000020004201370300200424000f0b200141086a2900002110200141106a29000021062001290000210b200341a0086a41186a200141186a2900002205370300200341a0086a41106a2006370300200341a0086a41086a20103703002003200b3703a008200341ed046a2010370000200341f5046a2006370000200341fd046a2005370000200341003a00e404200341063a00e0042003200b3700e504200341e0046a108702200341003602b80c200342013703b00c2011200d200341b00c6a109501200341b00c6a200f10a1010240200f450d002017200f410c6c6a21022017210103402001280200200141086a280200200341b00c6a1095012001410c6a22012002470d000b0b200341e00e6a20152016108e0520032802b80c220141046a2202417f4c0d0b20032802b00c211620032802e80e210e20032802e00e210d0240024020020d0041012115410021020c010b200210242215450d740b200341003602e804200320153602e004200320023602e4040240024002400240200141c000490d00200141808001490d012001418080808004490d02200341033a00b003200341e0046a41004101106d20032802e00420032802e80422026a20032d00b0033a00002003200241016a22023602e804200341e0046a20024104106d20032802e00420032802e80422026a20013600002003200241046a22023602e804200341e0046a21150c030b200341e0046a41004101106d20032802e00420032802e80422026a20014102743a00002003200241016a22023602e804200341e0046a21150c020b200341e0046a41004102106d20032802e00420032802e80422026a20014102744101723b00002003200241026a22023602e804200341e0046a21150c010b200341e0046a41004104106d20032802e00420032802e80422026a20014102744102723600002003200241046a22023602e804200341e0046a21150b201520022001106d20032802e004220220032802e80422156a2016200110cf061a2003201520016a22013602e804200d200e2002200110b301024020032802e404450d00200210260b024020032802e40e450d00200d10260b024020032802b40c450d00201610260b024020032802840a41ffffff3f71450d00201210260b02402018450d00201110260b0240200f450d00200f410c6c21022017210103400240200141046a280200450d00200128020010260b2001410c6a2101200241746a22020d000b0b02402013450d002013410c6c450d00201710260b20004200370308200020032800c809360019200041186a41003a00002000411c6a200341cb096a28000036000020004200370300200424000f0b200141386a290300210b200141306a2903002105200141286a3100002107200141206a29020021082001412c6a28020021152001411c6a280200210c2001410c6a280200210f200141086a2d00002113200141106a2903002110200141186a350200210620012f000a211420012d0009210a200341e00e6a200141c0006a41e80110cf061a20034198046a41086a2216200241106a29020037030020034198046a41106a2217200241186a29020037030020034198046a41186a2218200241206a2802003602002003200241086a290200370398042006a7210e2010a721122010422088a7210d200241046a280200211120022802242101200228020021020240024002400240024020130e050001020304000b200341f4046a4101360200200342013702e404200341dcedc6003602e004200341043602dc09200341d4edc6003602d8092003200341d8096a3602f004200341e0046a41ecc0c700103d000b200341e0046a41086a200329039804370300200341e0046a41106a2016290300370300200341e0046a41186a2017290300370300200341e0046a41206a2018280200360200200320113602e404200320023602e0042003200136028405200320103702b40c2003200f3602b00c200341800a6a200341e0046a200341b00c6a10df04024020032d00800a22014104460d0020032f00810a210220032d00830a210f200020032902840a3700242000200f3a0023200020023b0021200041206a20013a0000200041186a41003a00002000420037030820004201370300200424000f0b20004200370308200020032800c809360019200041186a41003a00002000411c6a200341cb096a28000036000020004200370300200424000f0b200341e0046a200341e00e6a41e80110cf061a200341b00c6a41086a200329039804370300200341b00c6a41106a2016290300370300200341b00c6a41186a2017290300370300200341b00c6a41206a2018280200360200200320113602b40c200320023602b00c200320013602d40c200341800a6a200341b00c6a10d602200341e0076a41086a200341890a6a290000370300200341e0076a41106a200341910a6a290000370300200341e0076a41186a200341990a6a290000370300200320032900810a3703e0070240024020032d00800a4101460d00200341ff076a310000210620032900f707210b20032800f307211720032800ef07211820032900e707210520032800e307211120032f00e107211520032d00e0072114200341f8086a10ad03200341d8116a41186a200341fc046a290200370300200341d8116a41106a200341f4046a290200370300200341d8116a41086a200341e0046a410c6a290200370300200320032902e4043703d811200341c0046a41186a22014200370300200341c0046a41106a22024200370300200341c0046a41086a22134200370300200342003703c00420034180086a41b48cc700410710fb01201320034180086a41086a29000037030020032003290080083703c004200341a8096a4184c1c200410c10fb012001200341a8096a41086a290300370300200220032903a809370300200341b0026a200341c0046a4120108902410021160240024002400240200f20032802b402410020032802b0021b460d00200341b00c6a200f10fa03024020032802b00c4101470d00200341d40c6a280200200c460d020b200341003a00800a0240200e450d00200e410c6c21022012210103400240200141046a280200450d00200128020010260b2001410c6a2101200241746a22020d000b0b200d450d03200d410c6c0d020c030b200341b00c6a41086a4120360200200341f0c2c98b063602b00c2003200341d8116a3602b40c200341800a6a200341b00c6a10bd03200341b00c6a20032802800a220c20032802880a10b8032013200341b90c6a2900003703002002200341c10c6a2900003703002001200341c90c6a290000370300200320032900b10c3703c004024020032d00b00c4101470d00200341b0036a41186a200341c0046a41186a290300370300200341b0036a41106a200341c0046a41106a290300370300200341b0036a41086a200341c0046a41086a290300370300200320032903c0043703b003410121160b024020032802840a450d00200c10260b024020160d00200341003a00800a0240200e450d00200e410c6c21022012210103400240200141046a280200450d00200128020010260b2001410c6a2101200241746a22020d000b0b200d450d03200d410c6c0d020c030b200341a0086a41186a200341b0036a41186a290300370300200341a0086a41106a200341b0036a41106a290300370300200341a0086a41086a200341b0036a41086a290300370300200320032903b0033703a008200341003a00800a0240200e450d00200e410c6c21022012210103400240200141046a280200450d00200128020010260b2001410c6a2101200241746a22020d000b0b200d450d02200d410c6c0d010c020b200341cb0c6a2900002110200341c70c6a2800002101200341c30c6a2800002102200341bb0c6a290000210720032800b70c211320032f00b50c211620032d00b40c210c2003419f086a200341d30c6a3100003c0000200320103700970820032001360093082003200236008f0820032007370087082003201336008308200320163b0081082003200c3a008008200341800a6a10fb030240200e450d002012200e410c6c6a210241002802cc9f40211341002902c49f402110201221010340200341b0036a41086a2013360200200320103703b003200341b00c6a200341800a6a200341b0036a2001280200200141086a28020010fc032001410c6a22012002470d000b0b200341b00c6a200341800a6a41d00010cf061a200341980d6a20034198086a290300370300200341900d6a20034190086a290300370300200341880d6a20034188086a29030037030020032003290380083703800d200341800a6a200341b00c6a41f0c2c98b06200341d8116a10fd03200341b00c6a10fe030240200e450d00200e410c6c21022012210103400240200141046a280200450d00200128020010260b2001410c6a2101200241746a22020d000b0b200d450d01200d410c6c450d010b201210260b410121130240024020032d00800a4101460d004125210141def5c40021020c010b200341b2036a20032d00830a3a0000200341b00c6a41086a200341940a6a290200370300200341bd0c6a200341990a6a290000370000200320032f00810a3b01b00320032003418c0a6a2902003703b00c200341800a6a41086a28020021014100211320032802840a21020b200341e0076a41026a2216200341b0036a41026a2d00003a0000200341d8096a41086a220d200341b00c6a41086a290300370300200341d8096a41106a200341b00c6a41106a290300370300200320032f01b0033b01e007200320032903b00c3703d8092013450d0120032802fc0841ffffff3f71450d5320032802f8081026410021030c550b0240200e450d00200e410c6c21012012210303400240200341046a280200450d00200328020010260b2003410c6a2103200141746a22010d000b0b41022103200d450d53200d410c6c450d53201210260c530b200341a4096a41026a20162d000022133a000020034188096a410d6a2216200341d8096a410d6a29000037000020034188096a41086a220e200d290300370300200320032f01e007220d3b01a409200320032903d809221037038809200341a8096a41086a200e290300370300200341a8096a410d6a220e20162900003700002003200d3b01c408200320133a00c608200320103703a809412010242216450d0b2016200b370017201620173600132016201836000f2016200537000720162011360003201620153b0001201620143a00002016411f6a20063c0000200341e0076a41086a2217200341a8096a41086a290300370300200341e0076a410d6a200e290000370000200320032f01c4083b01c409200320032d00c6083a00c609200320032903a8093703e007412010242213450d0b201320032f01c4093b00002013200136000720132002360003201320032903e00737000b201341026a20032d00c6093a0000201341136a2017290300370000201341186a200341ed076a29000037000020034281808080103702cc09200320163602c809410410242201450d74200342043702b403200320013602b003200341b0036a41004104106d20032802b00320032802b80322016a200f3600002003200141046a3602b803200341b00c6a418dd5c10010fb02200341800a6a20032802b00c220220032802b80c109d0220032902840a420020032802800a22011b21102001410120011b2117024020032802b40c450d00200210260b200320104220883e02840a200320173602800a200341b00c6a200341800a6a10e301200341b00c6a41086a280200210220032802b40c211820032802b00c2101200341b00c6a418dd5c100200341b0036a10fc02200341800a6a20032802b00c220d20032802b80c10a5022002410020011b21112018410020011b211820032902840a420020032802800a22021b21062001410420011b21012002410120021b210c024020032802b40c450d00200d10260b200341f8096a2011360200200341f4096a2018360200200341d8096a41106a2006370300200341d8096a41086a200341b0036a41086a280200360200200320032903b0033703d809200320013602f0092003200c3602e40902402010a7450d00201710260b201341086a2900002110201341106a290000210b20132900002105200341b0036a41186a201341186a290000370300200341b0036a41106a200b370300200341b0036a41086a2010370300200320053703b003410410242201450d74200342043702b40c200320013602b00c200341b00c6a41004104106d20032802b00c220220032802b80c22016a200f360000200341c40c6a4100290095d5413702002003200141046a3602b80c2003410029008dd5413702bc0c2003200341b0036a3602cc0c200341800a6a200341b00c6a109401024020032802b40c450d00200210260b20064220882110200341b00c6a200341800a6a10fe02200341a8026a20032802b00c220220032802b80c41d4c0c7004100410010810220032802a8022101024020032802b40c450d00200210260b2010a72115024020014101470d00410021010c510b20034180086a41186a2202200341b0036a41186a29030037030020034180086a41106a2217200341b0036a41106a29030037030020034180086a41086a2218200341b0036a41086a290300370300200320032903b00337038008200341b00c6a200341c8096a10c301200341b00c6a410c6a220141186a2002290300370200200141106a2017290300370200200141086a20182903003702002001200329038008370200200341d8116a200341800a6a10fe0220032802d811220120032802e011200341b00c6a10af05024020032802dc11450d00200110260b024020032802b40c41ffffff3f71450d0020032802b00c10260b200341a0086a41186a200341800a6a41186a290300370300200341a0086a41106a200341800a6a41106a290300370300200341a0086a41086a200341800a6a41086a290300370300200320032903800a3703a00820032802f0092111410021010240024020032802f809220d41014b0d00200d0e020150010b200d2102034020012002410176221720016a22182011201841246c6a280200200f4b1b2101200220176b220241014b0d000c500b0b200341b00c6a41186a200341a0086a41186a290300370300200341b00c6a41106a200341a0086a41106a290300370300200341b00c6a41086a200341a0086a41086a290300370300200320032903a0083703b00c410021020c4f0b200341e0046a41086a200329039804370300200341e0046a41106a2016290300370300200341e0046a41186a2017290300370300200341e0046a41206a2018280200360200200320113602e404200320023602e0042003200136028405200341b00c6a200341e0046a10d602200341e0076a41086a200341b90c6a290000370300200341e0076a41106a200341c10c6a290000370300200341e0076a41186a200341c90c6a290000370300200320032900b10c3703e00720032d00b00c4101460d1f200341800a6a41186a200341e0076a41186a290300370300200341800a6a41106a200341e0076a41106a290300370300200341800a6a41086a200341e0076a41086a290300370300200320032903e0073703800a200341e0046a201510e20420032802e804211320032802e004210141002102200341dc116a41003a0000200341003602d811200341c0026a20012013200341d8116a410541001081020240024020032802c002450d00200320032802c4022202410520024105491b3602b40c2003200341d8116a3602b00c200341b8026a200341b00c6a108f0120032802bc02211320032802b8024521020c010b0b024020032802e404450d00200110260b024002402013410a490d0020020d010b200320153602d811200341e0046a200341d8116a10db03200341b00c6a200341800a6a200341e0046a2005200b410110d703024020032d00b00c22014104470d00200341b0056a200b370300200341a0056a20073c000020034198056a200837030020034190056a200cad422086200642ffffffff0f838437030020034188056a201037030020034184056a200f36020020034182056a20143b0100200341f9046a200341980a6a290300370000200341f1046a200341900a6a290300370000200341e9046a200341800a6a41086a290300370000200320053703a805200320032903800a3700e1042003200a3a008105200341003a00e0042015200341e0046a10e904200341043a00b0030c4e0b20032d00b10c210220032d00b20c210f20032d00b30c211320032802b40c2116200341b0036a41086a200341b00c6a41086a280200360200200320163602b403200320133a00b3032003200f3a00b203200320023a00b103200320013a00b0030c4c0b200341b0036a411410ff0220032d00b00322014104460d4c0c4b0b20012001280200417f6a22133602000240024002400240200241ff0171450d00024020130d002001280208200128020c2802001103000240200128020c280204450d00200128020810260b20012001280204417f6a220236020420020d00200110260b200341e0046a200f10e20420032802e804211320032802e004210141002102200341dc116a41003a0000200341003602d811200341d0026a20012013200341d8116a4105410010810220032802d002450d01200320032802d4022202410520024105491b3602840a2003200341d8116a3602800a200341c8026a200341800a6a108f0120032802cc02211320032802c8024521020c020b024020130d002001280208200128020c2802001103000240200128020c280204450d00200128020810260b20012001280204417f6a220236020420020d00200110260b200341023a00b00c0c020b0b024020032802e404450d00200110260b024002402013410a490d0020020d010b200341ec046a200e360200200341e8046a200d360200200320123602e404200341023a00e004200f200341e0046a10e904200341043a00b00c0c4b0b200341b00c6a411410ff020b0240200d450d00201210260b20032d00b00c22014104460d4920032f00b10c210220032d00b30c210f200020032902b40c3700242000200f3a0023200020023b0021200041206a20013a0000200041186a41003a00002000420037030820004201370300200424000f0b200341e0046a41206a200241206a290200370300200341e0046a41186a200241186a290200370300200341e0046a41106a200241106a290200370300200341e0046a41086a200241086a290200370300200320022902003703e0044102210102400240200341e0046a10b1040d00200341c0046a41186a22014200370300200341c0046a41106a22024200370300200341c0046a41086a220f4200370300200342003703c00420034180086a41f58cc700410c10fb01200f20034180086a41086a29000037030020032003290080083703c004200341a8096a41d4e6c600410910fb012001200341a8096a41086a290300370300200220032903a809370300200341d8026a200341c0046a412041d4c0c700410041001081024103210120032802d8024101470d010b200041103b002120004200370308200041206a20013a0000200041186a41003a0000200041cc8dc600ad4280808080b0028437002420004201370300200424000f0b200341c0046a41186a4200370300200341d0046a4200370300200341c0046a41086a22014200370300200342003703c00420034180086a41f58cc700410c10fb01200120034180086a41086a29000037030020032003290080083703c004200341a8096a41d4e6c600410910fb01200241086a200341a8096a41086a290300370100200220032903a809370100200341013a00b003200341c0046a4120200341b0036a410110b301200041186a41003a000020004200370308200020032800c8093600192000411c6a200341cb096a28000036000020004200370300200424000f0b200141206a280200210c2001411c6a2802002115200141186a2802002111200141146a2802002112200141106a280200210e2001410c6a280200210d200141086a280200211820012d0005211420012d00042117200341e00e6a41206a2201200241206a290200370300200341e00e6a41186a220f200241186a290200370300200341e00e6a41106a2213200241106a290200370300200341e00e6a41086a2216200241086a290200370300200320022902003703e00e0240024002400240024002400240024020170e080001020304050607000b200341e0046a41146a4101360200200342013702e404200341dcedc6003602e004200341043602dc09200341d4edc6003602d8092003200341d8096a3602f004200341e0046a41ecc0c700103d000b200341e0046a41206a2001290300370300200341e0046a41186a200f290300370300200341e0046a41106a2013290300370300200341e0046a41086a2016290300370300200320032903e00e3703e004024002400240200341e0046a10cd030d00201241808080054b0d01200c4180a0014b0d02200320123602b80c2003200e3602b40c2003200d3602b00c2003200c3602e804200320153602e404200320113602e004200341800a6a2018201441ff0171410047200341b00c6a200341e0046a1094020c4f0b200341023a00800a0c4d0b200341800a6a41041096020c4c0b200341800a6a41051096020c4b0b200341e0046a41206a2001290300370300200341e0046a41186a200f290300370300200341e0046a41106a2013290300370300200341e0046a41086a2016290300370300200320032903e00e3703e004024002400240200341e0046a10cd03450d0041022101200341023a00b00c0c010b200341b00c6a2018109b0220032d00b00c22014104460d010b20032f00b10c210220032d00b30c210f200020032902b40c3700242000200f3a0023200020023b0021200041206a20013a0000200041186a41003a00002000420037030820004201370300200424000f0b20004200370308200020032800800a360019200041186a41003a00002000411c6a200341830a6a28000036000020004200370300200424000f0b200341e0046a41206a2001290300370300200341e0046a41186a200f290300370300200341e0046a41106a2013290300370300200341e0046a41086a2016290300370300200320032903e00e3703e0040240200341e0046a10cd03450d0020004200370308200041206a41023a0000200041186a41003a000020004201370300200424000f0b200341a0086a41186a22014200370300200341b0086a22024200370300200341a0086a41086a220f4200370300200342003703a00820034180086a41818dc700410910fb01200f20034180086a41086a29000037030020032003290080083703a008200341a8096a41b8d5c000410b10fb012001200341a8096a41086a290300370300200220032903a809370300200320183602e004200341a0086a4120200341e0046a410410b301200041186a41003a000020004200370308200020032800d8093600192000411c6a200341db096a28000036000020004200370300200424000f0b200341e0046a41206a2001290300370300200341e0046a41186a200f290300370300200341e0046a41106a2013290300370300200341e0046a41086a2016290300370300200320032903e00e3703e004200341b00c6a200341e0046a10d602200341c0046a41086a200341b90c6a290000370300200341c0046a41106a200341c10c6a290000370300200341c0046a41186a200341c90c6a290000370300200320032900b10c3703c004024002400240024020032d00b00c4101460d00200341800a6a41186a200341c0046a41186a290300370300200341800a6a41106a200341c0046a41106a290300370300200341800a6a41086a200341c0046a41086a290300370300200320032903c0043703800a200341e0046a200341800a6a4280a0e5b9c29101420010d90220032d00e00422014104470d01200e41808080054b0d0220154180a0014b0d03200341a0086a41186a22014200370300200341a0086a41106a22024200370300200341a0086a41086a220f4200370300200342003703a00820034180086a41818dc700410910fb01200f20034180086a41086a221329000037030020032003290080083703a008200341a8096a41a0d7c000410a10fb012001200341a8096a41086a2216290300370300200220032903a809370300200341e0026a200341a0086a412010890220032802e402211720032802e002210c2001420037030020024200370300200f4200370300200342003703a00820034180086a41818dc700410910fb01200f201329000037030020032003290080083703a008200341a8096a41a0d7c000410a10fb0120012016290300370300200220032903a8093703002003201741e807200c1b220141016a3602e004200341a0086a4120200341e0046a410410b3012003200e3602b80c2003200d3602b40c200320183602b00c200320153602e804200320113602e404200320123602e004200341b0036a20014101200341b00c6a200341e0046a109402200341e0046a41186a200341800a6a41186a290300370300200341e0046a41106a200341800a6a41106a290300370300200341e0046a41086a2202200341800a6a41086a290300370300200320032903800a3703e004200341b00c6a200110a10220032802b00c220f20032802b80c200341e0046a108d05024020032802b40c450d00200f10260b20022001360200200341003602e404200341073a00e004200341e0046a108702200341043a00d8110c4b0b200341023a00d8110c490b20032802e404210220032d00e304210f20032d00e204211320032d00e1042116200341d8116a41086a200341e0046a41086a280200360200200320023602dc112003200f3a00db11200320133a00da11200320163a00d911200320013a00d8110c480b200341d8116a41041096020c470b200341d8116a41051096020c460b200341e0046a41206a2001290300370300200341e0046a41186a200f290300370300200341e0046a41106a2013290300370300200341e0046a41086a2016290300370300200320032903e00e3703e004200341b00c6a200341e0046a10d602024020032d00b00c4101470d0020004200370308200041206a41023a0000200041186a41003a000020004201370300200424000f0b20004200370308200020032800b904360019200041186a41003a00002000411c6a200341bc046a28000036000020004200370300200424000f0b200341e0046a41206a2001290300370300200341e0046a41186a200f290300370300200341e0046a41106a2013290300370300200341e0046a41086a2016290300370300200320032903e00e3703e004200341f8026a200341e0046a10f80420032802f8020d1e200341e0046a20032802fc02221310950220032802e004220220032802e804109c0241ff01712101024020032802e404450d00200210260b41022001410171200141024622011b210220010d1f024020024101710d00200341b0036a41031096020c420b200341e0046a2013109b02024020032d00e00422014104470d00200341a0086a41186a222a4200370300200341a0086a41106a22264200370300200341a0086a41086a22014200370300200342003703a00820034180086a41818dc700410910fb01200120034180086a41086a29000037030020032003290080083703a008200341a8096a4190d8c000410a10fb01202a200341a8096a41086a290300370300202620032903a809370300200341e0046a200341a0086a10fe0120032802e0042201410420011b2127024020032902e404420020011b2205422088a72229450d0020272029410c6c6a21282027212c03400240202c41086a222d2802002217450d00202c2802002101410021024100210f034002400240024020132001280200460d0020020d01410021020c020b200241016a21020c010b200f20026b221620174f0d26200341e0046a41206a221820012002415c6c6a221641206a2211280200360200200341e0046a41186a220d201641186a220e290200370300200341e0046a41106a2212201641106a2215290200370300200341e0046a41086a220c201641086a2214290200370300200320162902003703e004200141206a220a2802002109200141186a221d2902002110200141106a221e2902002106200141086a222b290200210b201620012902003702002014200b37020020152006370200200e201037020020112009360200200a2018280200360200201d200d290300370200201e2012290300370200202b200c290300370200200120032903e0043702000b200141246a21012017200f41016a220f470d000b2002450d00202d280200201720026b2201490d00202d20013602000b202c410c6a222c2028470d000b0b200320273602e004200320053702e404202a420037030020264200370300200341a0086a41086a22014200370300200342003703a00820034180086a41818dc700410910fb01200120034180086a41086a29000037030020032003290080083703a008200341a8096a4190d8c000410a10fb01202641086a200341a8096a41086a290300370300202620032903a809370300200341a0086a200341e0046a1080022005a7211602402029450d002029410c6c21022027210103400240200141046a280200220f450d00200f41246c450d00200128020010260b2001410c6a2101200241746a22020d000b0b02402016450d002016410c6c450d00202710260b200341a0086a41186a222e4200370300200341a0086a41106a222f4200370300200341a0086a41086a22294200370300200342003703a00820034180086a41818dc700410910fb01202920034180086a41086a223029000037030020032003290080083703a008200341a8096a41dcd5c000410f10fb01202641086a2231200341a8096a41086a2232290300370300202620032903a809370300200341e0046a200341a0086a10fe0120032802e0042201410420011b2127024020032902e404420020011b2205422088a7222a450d002027202a410c6c6a21282027212c03400240202c41086a222d2802002217450d00202c2802002101410021024100210f034002400240024020132001280200460d0020020d01410021020c020b200241016a21020c010b200f20026b221620174f0d27200341e0046a41206a221820012002415c6c6a221641206a2211280200360200200341e0046a41186a220d201641186a220e290200370300200341e0046a41106a2212201641106a2215290200370300200341e0046a41086a220c201641086a2214290200370300200320162902003703e004200141206a220a2802002109200141186a221d2902002110200141106a221e2902002106200141086a222b290200210b201620012902003702002014200b37020020152006370200200e201037020020112009360200200a2018280200360200201d200d290300370200201e2012290300370200202b200c290300370200200120032903e0043702000b200141246a21012017200f41016a220f470d000b2002450d00202d280200201720026b2201490d00202d20013602000b202c410c6a222c2028470d000b0b200320273602e004200320053702e404202e4200370300202f420037030020294200370300200342003703a00820034180086a41818dc700410910fb012029203029000037030020032003290080083703a008200341a8096a41dcd5c000410f10fb0120312032290300370300202620032903a809370300200341a0086a200341e0046a1080022005a721160240202a450d00202a410c6c21022027210103400240200141046a280200220f450d00200f41246c450d00200128020010260b2001410c6a2101200241746a22020d000b0b02402016450d002016410c6c450d00202710260b200341b8086a220d4200370300200341b0086a220e4200370300200341a0086a41086a22174200370300200342003703a00820034180086a41818dc700410910fb01201720034180086a41086a221229000037030020032003290080083703a008200341a8096a41acd6c000410610fb01202641086a2215200341a8096a41086a220c290300370300202620032903a809370300200341e0046a200341a0086a10fd0120032902e404420020032802e00422011b2210422088a72216412c6c21112001410420011b211802402016450d0020112102201821010340024020012802002013470d00200141246a220f2802004102460d00200f41003602000b2001412c6a2101200241546a22020d000b0b200d4200370300200e420037030020174200370300200342003703a00820034180086a41818dc700410910fb012017201229000037030020032003290080083703a008200341a8096a41acd6c000410610fb012015200c290300370300202620032903a8093703002016412c6c41046a2201417f4c0d0a0240024020010d0041012102410021010c010b200110242202450d730b200341003602e804200320023602e004200320013602e404200341e0046a201610a10102402016450d00201820116a211620182101034020012802002102200341e0046a20032802e8044104106d20032802e00420032802e804220f6a20023600002003200f41046a3602e804200141046a200341e0046a10ba012001412c6a22012016470d000b0b200341a0086a412020032802e004220120032802e80410b301024020032802e404450d00200110260b02402010a72201450d002001412c6c450d00201810260b200341800a6a201310a102200341e0046a20032802800a220120032802880a220210b803024002400240024020032d00e004220f0d00200341b8086a200341f9046a290000370300200341b0086a200341f1046a290000370300200341a8086a200341e9046a290000370300200320032900e1043703a0080c010b2001200210ff01200341a0086a41186a2202200341f9046a290000370300200341a0086a41106a2216200341f1046a290000370300200341a0086a41086a2217200341e9046a290000370300200320032900e1043703a008200f4101460d010b200341c80c6a4200370300200341c00c6a4200370300200341b80c6a4200370300200342003703b00c0c010b200341b00c6a41186a2002290300370300200341b00c6a41106a2016290300370300200341b00c6a41086a2017290300370300200320032903a0083703b00c0b024020032802840a450d00200110260b200341e8026a200341b00c6a4280a0e5b9c29101420010da02200341e8046a2013360200200341003602e404200341073a00e004200341e0046a108702200341043a00b0030c440b20032802e404210220032d00e304210f20032d00e204211320032d00e1042116200341b0036a41086a200341e0046a41086a280200360200200320023602b4032003200f3a00b303200320133a00b203200320163a00b103200320013a00b0030c410b200341e0046a41206a2001290300370300200341e0046a41186a200f290300370300200341e0046a41106a2013290300370300200341e0046a41086a2016290300370300200320032903e00e3703e00420034188036a200341e0046a10f804410221012003280288030d21200328028c032102200341e0046a201810a30220034180036a20032802e004221320032802e804108902200328028403210f2003280280032101024020032802e404450d00201310260b024020014101470d0041002101200f2002460d220b200341e0046a200210a30220032802e804210220032802e0042101200320183602b00c20012002200341b00c6a410410b301024020032802e404450d00200110260b20004200370308200020032800c809360019200041186a41003a00002000411c6a200341cb096a28000036000020004200370300200424000f0b41012113200241206a3301002110200241186a2902002106200241106a290200210b200241086a2902002105200241046a2802002111200241026a2f0100210d200141086a28020021152002280224210f20022d0001211420022d00002116024020012f01044101470d002001410c6a2902002107410121020240201641ff01714101460d0041002102410221010240024020140e03000102000b41002101410021020c010b410121010b200f280200221341016a41014d0d22200341e0046a41106a200b370300200341e8046a2005370300200f201341016a360200200341e0046a41186a2006370300200341e0046a41206a20103d01002003200f36028405200320113602e4042003200d3b01e204200320013a00e104200320023a00e00420152007422088a7221341b0026c22176a2102200341e0046a10cd03210e2007a7211d20152101024002402013450d00201741d07d6a2113200341e00e6a410472210a200341e0046a4104722109201641ff01712112200341d8116a41186a211e200341d8116a41106a212b200341d8116a41206a212c4100211820152101034020012802002116200341e00e6a200141046a221741ac0210cf061a200341e0046a201741ac0210cf061a024020164117470d00200141b0026a21010c410b200341800a6a200341e0046a41ac0210cf061a200341b00c6a200341800a6a41ac0210cf061a02400240200e450d00200320163602e00e200a200341b00c6a41ac0210cf061a41012117024020124101460d0041002117410221160240024020140e03000102000b41002116410021170c010b410121160b200f28020041016a220c41014d0d27200f200c3602000240200f280208200341e00e6a200f28020c28020c110100450d00200341e0046a200341e00e6a41b00210cf061a201e2006370300202b200b370300202c20103d0100200320053703e0112003200f3602fc11200320113602dc112003200d3b01da11200320163a00d911200320173a00d811200341b0036a200341e0046a200341d8116a10a3030c020b200f200f280200417f6a2216360200200341023a00d003200341003a00c803200342003703b803200342013703b003024020160d00200f280208200f28020c2802001103000240200f28020c280204450d00200f28020810260b200f200f280204417f6a221636020420160d00200f10260b200341e00e6a1098030c010b200320163602e0042009200341b00c6a41ac0210cf061a41012117024020124101460d0041002117410221160240024020140e03000102000b41002116410021170c010b410121160b200f28020041016a220c41014d0d26200341e00e6a41106a200b370300200f200c360200200341e00e6a41186a2006370300200341e00e6a41206a20103d0100200320053703e80e2003200f3602840f200320113602e40e2003200d3b01e20e200320163a00e10e200320173a00e00e200341b0036a200341e0046a200341e00e6a10a3030b20032903b0034201510d02201841016a2118201341d07d6a2113200141b0026a22012002470d000b200221010b200341e0046a200341e00e6a41ac0210cf061a0c3e0b200341e00e6a41206a200341d8036a2903002210370300200341e00e6a41186a200341b0036a41206a2903002206370300200341e00e6a41106a200341b0036a41186a290300370300200341e00e6a41086a200341b0036a41106a290300370300200320032903b8033703e00e200341e0046a41086a2006370300200341e0046a41106a20103e0200200320183602e404200341083a00e004200341e0046a10870202402013450d00200141b0026a21010340200110d501200141b0026a2101201341d07d6a22130d000b0b0240201d450d00201d41b0026c450d00201510260b200f200f280200417f6a220136020020010d3f200f280208200f28020c2802001103000240200f28020c280204450d00200f28020810260b200f200f280204417f6a220136020420010d3f0c3e0b200141066a2f010021170240201641ff01714101460d0041002113410221010240024020140e03000102000b41002101410021130c010b410121010b200f28020041016a220241014d0d21200341e0046a41106a2216200b370300200341e0046a41086a22182005370300200f2002360200200341e0046a41186a22022006370300200341e0046a41206a20103d01002003200f36028405200320113602e4042003200d3b01e204200320013a00e104200320133a00e004200341e00e6a200341e0046a10d602024020032d00e00e4101460d00200341e00e6a41186a2903002110200341e00e6a41086a2903002106200341e00e6a41106a2802002101200341f40e6a280200211320032d00e10e211120032f01e20e210d20032802e40e210e200341ff076a200341e00e6a41206a3100003c0000200320063700e7072003200e3600e3072003200d3b00e107200320113a00e007200320103700f707200320013600ef07200320133600f3072002200341e0076a41186a2900003703002016200341e0076a41106a2900003703002018200341e0076a41086a290000370300200320032900e0073703e004411210242201450d70200342123702e40e200320013602e00e200341e00e6a41004110106d20032802e00e20032802e80e22016a220241002900ccb745370000200241086a41002900d4b7453700002003200141106a22013602e80e200341e00e6a20014120106d20032802e00e20032802e80e22026a220120032903e004370000200141086a200341e0046a41086a290300370000200141106a200341e0046a41106a290300370000200141186a200341e0046a41186a2903003700002003200241206a22013602e80e200341e00e6a20014102106d20032802e00e220120032802e80e22026a20173b00002003200241026a22023602e80e20034180086a20012002109601024020032802e40e450d00200110260b200320032d0080083a00e00420032003290081083700e10420032003290089083700e90420032003290091083700f10420032003280099083600f904200320032f009d083b00fd04200320032d009f083a00ff04200341203a008005200341e00e6a41086a20032903e8042210370300200341e00e6a41106a20032903f0042206370300200341e00e6a41186a220120032903f804370300200320032903e004220b3703e00e200341c0046a41106a2006370300200341c0046a41086a2010370300200341c0046a41186a20012903003703002003200b3703c004200341de046a3301002110200341d6046a2901002106200341ce046a290100210b20032901c604210520032801c204211620032f01c0042117411010242201450d07200141b889c70036020c200141013602082001428180808010370200411010242202450d07200241d089c70036020c20024101360208200242818080801037020020012001280200417f6a2213360200024020130d002001280208200128020c2802001103000240200128020c280204450d00200128020810260b20012001280204417f6a221336020420130d00200110260b20022002280200417f6a2201360200024020010d002002280208200228020c2802001103000240200228020c280204450d00200228020810260b20022002280204417f6a220136020420010d00200210260b200341e00e6a201541b00210cf061a02400240200f280208200341e00e6a200f28020c28020c110100450d00200341e0046a200341e00e6a41b00210cf061a200341980a6a2006370300200341900a6a200b370300200341880a6a2005370300200341a00a6a20103d01002003200f3602a40a200320163602840a200320173b01820a20034180023b01800a200341b00c6a200341e0046a200341800a6a10a30320032903b00c4201510d010c3c0b200341d00c6a41023a0000200341c80c6a41003a0000200f200f280200417f6a2201360200200342003703b80c200342013703b00c024020010d00200f280208200f28020c2802001103000240200f28020c280204450d00200f28020810260b200f200f280204417f6a220136020420010d00200f10260b200341e00e6a1098030b200341e8046a200341b00c6a41186a290300370300200341e0046a41106a2201200341d00c6a290300370300200341e0046a41186a2202200341d80c6a2903003703002003200341b00c6a41106a2903003703e00420032903b80c4202510d3a200341a0086a41106a20012903002206370300200341a0086a41186a200229030037030020032d00b108210220032d00b208210f20032d00b308211320032902b40821102006a721010c3b0b200f200f280200417f6a2203360200024020030d00200f280208200f28020c2802001103000240200f28020c280204450d00200f28020810260b200f200f280204417f6a220336020420030d00200f10260b201510980320151026410221010c3b0b200341e0046a200141086a41a80210cf061a200341e00e6a41206a200241206a290200370300200341e00e6a41186a200241186a290200370300200341e00e6a41106a200241106a290200370300200341e00e6a41086a200241086a290200370300200320022902003703e00e2000200341e0046a200341e00e6a10d202200424000f0b200341e0046a200141046a41c40010cf061a200341e00e6a41206a200241206a290200370300200341e00e6a41186a200241186a290200370300200341e00e6a41106a200241106a290200370300200341e00e6a41086a200241086a290200370300200320022902003703e00e2000200341e0046a200341e00e6a10cb03200424000f0b200320012800293602d81120032001412c6a2800003600db11200141286a3100002110200141206a2900002106200141386a2903002105200141306a2903002107200141c8006a2903002108200141c0006a2903002119200141d8006a290300211b200141e8006a290300211c200141e0006a290300211f2001411c6a2800002118200141186a2800002111200141106a290000210b2001410c6a280000210d200141086a2d0000210f200141f0006a2802002115200141d0006a290300211a20012f000a210e20012d00092112200341e00e6a41206a2201200241206a290200370300200341e00e6a41186a2213200241186a290200370300200341e00e6a41106a2216200241106a290200370300200341e00e6a41086a2217200241086a290200370300200320022902003703e00e02400240024002400240200f0e050001020304000b200341f4046a4101360200200342013702e404200341dcedc6003602e004200341043602840a200341d4edc6003602800a2003200341800a6a3602f004200341e0046a41ecc0c700103d000b200341e0046a41206a2001290300370300200341e0046a41186a2013290300370300200341e0046a41106a2016290300370300200341e0046a41086a2017290300370300200320032903e00e3703e004200341b00c6a200341e0046a10d602200341c0046a41086a200341b90c6a290000370300200341c0046a41106a200341c10c6a290000370300200341c0046a41186a200341c90c6a290000370300200320032900b10c3703c00402400240024020032d00b00c4101470d0041022101200341023a00800a0c010b200341a0086a41186a200341c0046a41186a2903002210370300200341a0086a41106a200341c0046a41106a2903002206370300200341a0086a41086a200341c0046a41086a290300220b370300200320032903c00422053703a008200341e0046a41186a2010370300200341e0046a41106a2006370300200341e0046a41086a200b370300200320053703e004200341800a6a200341e0046a10a40420032d00800a22014104460d010b20032f00810a210220032d00830a210f200020032902840a3700242000200f3a0023200020023b0021200041206a20013a0000200041186a41003a00002000420037030820004201370300200424000f0b20004200370308200020032800c809360019200041186a41003a00002000411c6a200341cb096a28000036000020004200370300200424000f0b200341e0046a41206a2001290300370300200341e0046a41186a2013290300370300200341e0046a41106a2016290300370300200341e0046a41086a2017290300370300200320032903e00e3703e004200341b00c6a200341e0046a10d60202400240024020032d00b00c4101470d0041022101200341023a00800a0c010b200341df046a20103c0000200320113600cf042003200b3700c704200341e0046a41086a200341c0046a41086a290300370300200320063700d704200320183600d304200341e0046a41106a200341c0046a41106a290300370300200341e0046a41186a200341c0046a41186a2903003703002003200d3600c3042003200e3b00c104200320123a00c004200320032903c0043703e004200341800a6a200341e0046a10a40420032d00800a22014104460d010b20032f00810a210220032d00830a210f200020032902840a3700242000200f3a0023200020023b0021200041206a20013a0000200041186a41003a00002000420037030820004201370300200424000f0b20004200370308200020032800b904360019200041186a41003a00002000411c6a200341bc046a28000036000020004200370300200424000f0b200341ff076a20103c0000200320063700f707200320183600f307200320113600ef072003200b3700e7072003200d3600e3072003200e3b00e107200320123a00e007200341e0046a41206a2001290300370300200341e0046a41186a2013290300370300200341e0046a41106a2016290300370300200341e0046a41086a2017290300370300200320032903e00e3703e004200341b00c6a200341e0046a10d602200341a0086a41086a200341b90c6a290000370300200341a0086a41106a200341c10c6a290000370300200341a0086a41186a200341c90c6a290000370300200320032900b10c3703a0080240024002400240024020032d00b00c4101460d00200341800a6a41186a200341a0086a41186a290300370300200341800a6a41106a200341a0086a41106a290300370300200341800a6a41086a200341a0086a41086a290300370300200320032903a0083703800a02402007428080e983b1de165441002005501b450d00410321020c020b200341e0046a41086a200341e0076a41086a290000370300200341e0046a41106a200341e0076a41106a290000370300200341e0046a41186a200341e0076a41186a290000370300200320032900e0073703e004200341b00c6a200341e0046a10a50420034190036a20032802b00c220120032802b80c41d4c0c700410041001081022003280290032102024020032802b40c450d00200110260b41012101024020024101470d004117210f41c5a1c300211341152103410321020c030b200341b00c6a200341800a6a200341e0046a20072005410110d703024020032d00b00c22024104460d00200341b80c6a280200210f20032802b40c211320032d00b30c211620032d00b20c210120032d00b10c21030c040b200341b0036a200341e0046a2007200520192008201aa710a90420032d00b0034104460d04200341b00c6a41086a200341b0036a41086a280200360200200320032903b0033703b00c41f990c4004137200341b00c6a41b091c40041c091c4001036000b410221020b4109210f41e6a1c300211341022101411521030b0b200020163a0023200020013a0022200020033a002120004200370308200041206a20023a0000200041186a41003a00002000200fad4220862013ad8437002420004201370300200424000f0b200041186a41003a000020004200370308200020032800c8093600192000411c6a200341cb096a28000036000020004200370300200424000f0b2003419f086a20083c00002003418f086a200537000020032019370097082003200737008708200320032800db1136008308200320032802d81136028008200341e0046a41206a2001290300370300200341e0046a41186a2013290300370300200341e0046a41106a2016290300370300200341e0046a41086a2017290300370300200320032903e00e3703e00441022102410221010240024002400240200341e0046a10cd030d0041032101201a428080e983b1de16544100201b501b0d00200341b00c6a41086a20034180086a41086a290300370300200341b00c6a41106a20034180086a41106a290300370300200341b00c6a41186a20034180086a41186a29030037030020032003290380083703b00c200341df046a20103c0000200320113600cf042003200b3700c704200341e0046a41086a200341c0046a41086a290300370300200320063700d704200320183600d304200341e0046a41106a200341c0046a41106a290300370300200341e0046a41186a200341c0046a41186a2903003703002003200d3600c3042003200e3b00c104200320123a00c004200320032903c0043703e004200341800a6a200341b00c6a10a50420034198036a20032802800a220220032802880a41d4c0c700410041001081022003280298032101024020032802840a450d00200210260b41012102024020014101470d004117210f41c5a1c300211341152103410321010c020b200341800a6a200341e0046a200341b00c6a201a201b410110d703024020032d00800a22014104460d00200341880a6a280200210f20032802840a211320032d00830a211620032d00820a210220032d00810a21030c030b200341b0036a200341b00c6a201a201b201f201c201510a90420032d00b0034104460d03200341800a6a41086a200341b0036a41086a280200360200200320032903b0033703800a41f990c4004137200341800a6a41b091c40041d091c4001036000b4109210f41e6a1c3002113411521030b0b200020163a0023200020023a0022200020033a002120004200370308200041206a20013a0000200041186a41003a00002000200fad4220862013ad8437002420004201370300200424000f0b200041186a41003a000020004200370308200020032800c8093600192000411c6a200341cb096a28000036000020004200370300200424000f0b200241206a3301002110200241186a2902002106200241106a290200210b200241086a2902002105200241046a2802002113200241026a2f01002116200141246a280200210e2001411c6a2902002107200141186a2802002117200141146a2802002115200141106a28020021122001410c6a2802002118200141086a280200210d2002280224210f20022d0001211120022d0000210220012d0005210c024002400240024002400240024020012d00040e0700010203040506000b200341e0046a41146a4101360200200342013702e404200341dcedc6003602e004200341043602840a200341d4edc6003602800a2003200341800a6a3602f004200341e0046a41ecc0c700103d000b4101210e0240200241ff01714101460d004100210e410221010240024020110e03000102000b410021014100210e0c010b410121010b200f280200221441016a41014d0d22200341f0046a200b370300200341e8046a2005370300200f201441016a360200200341f8046a200637030020034180056a20103d01002003200f36028405200320133602e404200320163b01e204200320013a00e1042003200e3a00e0040240200341e0046a10d302450d00201710980320171026200f200f280200417f6a22033602004102210120030d39200f280208200f28020c2802001103000240200f28020c280204450d00200f28020810260b200f200f280204417f6a220336020420030d39200f10260c3a0b02400240200241ff01714101460d004102210102400240024020110e03000102000b410021010c010b200341ce046a200b370100200341d6046a2006370100200341de046a20103d0100200320053701c604200320133601c204200320163b01c004410121010b200341ea0e6a200341c8046a290300370100200341f20e6a200341d0046a290300370100200341fa0e6a200341d8046a290300370100200320013a00e10e200320032903c0043701e20e200341003a00e00e0c010b200341013a00e00e200320133602e40e0b200341e0046a201741b00210cf061a200341b00c6a4100200d201820122015200c200341e00e6a200341e0046a10aa04200341b80c6a290300211020032d00b40c210120032d00b50c211620032d00b60c211320032d00b70c210220032802b00c2118200f200f280200417f6a2211360200024020184101460d00024020110d00200f280208200f28020c2802001103000240200f28020c280204450d00200f28020810260b200f200f280204417f6a220136020420010d00200f10260b201710260c380b024020110d00200f280208200f28020c2802001103000240200f28020c280204450d00200f28020810260b200f200f280204417f6a221836020420180d00200f10260b20171026200141ff01714104460d370c390b410121170240200241ff01714101460d0041002117410221010240024020110e03000102000b41002101410021170c010b410121010b200f280200220e41016a41014d0d21200341f0046a200b370300200341e8046a200537030041012112200f200e41016a360200200341f8046a200637030020034180056a20103d01002003200f36028405200320133602e404200320163b01e204200320013a00e104200320173a00e0040240200341e0046a10d302450d00200f200f280200417f6a22033602004102211620030d35200f280208200f28020c2802001103000240200f28020c280204450d00200f28020810260b200f200f280204417f6a220336020420030d35200f10260c360b0240200241ff01714101460d00410021124102210e0240024020110e03000102000b4100210e410021120c010b4101210e0b200341d8116a200d10dd03200341e0046a20032802d811221120032802e011221510de0320032902e404210720032802e0042101200341a4076a4102360200200341003602e0042001410820011b2117024020182007420020011b2207422088a72202490d00200341b00c6a41086a200341d0076a2903003703002003200341c8076a2903003703b00c200341a0076a2903002206422088a72112200341c0076a2903002105200341b8076a2903002108200341b0076a2903002119200341a8076a290300211a20034198076a290300210b20034190076a290300211b20034188076a290300211c20034180076a290300211f200341f8066a2903002120200341f0066a2903002121200341e8066a2903002122200341e0066a2903002123200341d8066a2903002124200341d0066a2903002125200341c8066a2903002133200341c0066a2903002134200341b8066a2903002135200341b0066a2903002136200341a8066a2903002137200341a0066a290300213820034198066a290300213920034190066a290300213a20034188066a290300213b20034180066a290300213c200341f8056a290300213d200341f0056a290300213e200341e8056a290300213f200341e0056a2903002140200341d8056a2903002141200341d0056a2903002142200341c8056a2903002143200341c0056a2903002144200341b8056a2903002145200341b0056a2903002146200341a8056a2903002147200341a0056a290300214820034198056a290300214920034190056a290300214a20034188056a290300214b20034180056a290300214c200341f8046a290300214d200341f0046a290300214e20032903e804211020032802e40421160c330b200341f00e6a200b370300200341e00e6a41086a2005370300200341820f6a41003b0100200341e00e6a41186a2006370300200341800f6a20103d0100200320133602e40e200320163b01e20e2003200e3a00e10e200320123a00e00e20032017201841f0026c6a22013602840f20012802bc024102460d3102402012200141c8026a22162d0000470d00024020120d00200e41ff0171221320162d0001470d0120134101470d33200341e00e6a4102722213201641026a2216460d3320132016412010d2060d010c330b20132017201841f0026c6a41cc026a280200460d320b200341800a6a41086a200341b00c6a41086a290300370300200320032903b00c3703800a200241f0026c21022017210103400240200141bc026a2802004102460d000240200141b0026a2802002213450d00200141b4026a280200450d00201310260b200110d5010b200141f0026a2101200241907d6a22020d000b41012101410221164100211202402007a72202450d00200241f0026c450d00201710260b0c330b410121140240200241ff01714101460d0041002114410221010240024020110e03000102000b41002101410021140c010b410121010b200f280200220a41016a41014d0d20200341f0046a200b370300200341e8046a2005370300200f200a41016a360200200341f8046a200637030020034180056a20103d01002003200f36028405200320133602e404200320163b01e204200320013a00e104200320143a00e0040240200341e0046a10d302450d00200e109803200e102602402018450d00200d10260b200f200f280200417f6a22033602004102210120030d2f200f280208200f28020c2802001103000240200f28020c280204450d00200f28020810260b200f200f280204417f6a220336020420030d2f200f10260c300b200320123602880a200320183602840a2003200d3602800a02400240200241ff01714101460d004102210102400240024020110e03000102000b410021010c010b200341ce046a200b370100200341d6046a2006370100200341de046a20103d0100200320053701c604200320133601c204200320163b01c004410121010b200341ea0e6a200341c8046a290300370100200341f20e6a200341d0046a290300370100200341fa0e6a200341d8046a290300370100200320013a00e10e200320032903c0043701e20e200341003a00e00e0c010b200341013a00e00e200320133602e40e0b200341e0046a200e41b00210cf061a200341b00c6a200341800a6a4100201520172007a72007422088a7200c200341e00e6a200341e0046a10ac04200341b80c6a290300211020032d00b40c210120032d00b50c211620032d00b60c211320032d00b70c210220032802b00c2117200f200f280200417f6a2218360200024020174101460d00024020180d00200f280208200f28020c2802001103000240200f28020c280204450d00200f28020810260b200f200f280204417f6a220136020420010d00200f10260b200e10260c2e0b024020180d00200f280208200f28020c2802001103000240200f28020c280204450d00200f28020810260b200f200f280204417f6a221736020420170d00200f10260b200e1026200141ff01714104460d2d0c2f0b410121170240200241ff01714101460d0041002117410221010240024020110e03000102000b41002101410021170c010b410121010b200f280200220e41016a41014d0d1f200341f0046a200b370300200341e8046a200537030041012115200f200e41016a360200200341f8046a200637030020034180056a20103d01002003200f36028405200320133602e404200320163b01e204200320013a00e104200320173a00e0040240200341e0046a10d302450d0002402018450d00200d10260b200f200f280200417f6a22033602004102210120030d2b200f280208200f28020c2802001103000240200f28020c280204450d00200f28020810260b200f200f280204417f6a220336020420030d2b200f10260c2b0b0240200241ff01714101460d00410021154102210e0240024020110e03000102000b4100210e410021150c010b4101210e0b200320123602e804200320183602e4042003200d3602e004200341b0036a200341e0046a10ab04200341800a6a20032802b00320032802b80310e10420032802800a210241002117200341003602800a4103210120024101470d29200341b00c6a20032902840a2208a7221210dd03200341e0046a20032802b00c221120032802b80c220210de0320032802e0042201410820011b211820032902e404420020011b2207422088a722012008422088a7220d4d0d27200341f0046a200b370300200341e0046a41086a200537030020034182056a41003b0100200341f8046a200637030020034180056a20103d0100200320133602e404200320163b01e2042003200e3a00e104200320153a00e00420032018200d41f0026c6a22023602840520022802bc024102460d2602402015200241c8026a22162d0000470d00024020150d00200e41ff0171221320162d0001470d0120134101470d28200341e0046a4102722213201641026a2216460d2820132016412010d2060d010c280b20132018200d41f0026c6a41cc026a280200460d270b200141f0026c21022018210103400240200141bc026a2802004102460d000240200141b0026a2802002213450d00200141b4026a280200450d00201310260b200110d5010b200141f0026a2101200241907d6a22020d000b410221012007a72202450d28200241f0026c450d28201810260c280b4101210e0240200241ff01714101460d004100210e410221010240024020110e03000102000b410021014100210e0c010b410121010b200f280200221441016a41014d0d1e200341f0046a200b370300200341e8046a2005370300200f201441016a360200200341f8046a200637030020034180056a20103d01002003200f36028405200320133602e404200320163b01e204200320013a00e1042003200e3a00e0040240200341e0046a10d302450d00201710980320171026200f200f280200417f6a22033602004102210120030d24200f280208200f28020c2802001103000240200f28020c280204450d00200f28020810260b200f200f280204417f6a220336020420030d24200f10260c250b02400240200241ff01714101460d004102210102400240024020110e03000102000b410021010c010b200341ce046a200b370100200341d6046a2006370100200341de046a20103d0100200320053701c604200320133601c204200320163b01c004410121010b200341ea0e6a200341c8046a290300370100200341f20e6a200341d0046a290300370100200341fa0e6a200341d8046a290300370100200320013a00e10e200320032903c0043701e20e200341003a00e00e0c010b200341013a00e00e200320133602e40e0b200341e0046a201741b00210cf061a200341b00c6a4101200d201820122015200c200341e00e6a200341e0046a10aa04200341b80c6a290300211020032d00b40c210120032d00b50c211620032d00b60c211320032d00b70c210220032802b00c2118200f200f280200417f6a2211360200024020184101460d00024020110d00200f280208200f28020c2802001103000240200f28020c280204450d00200f28020810260b200f200f280204417f6a220136020420010d00200f10260b201710260c230b024020110d00200f280208200f28020c2802001103000240200f28020c280204450d00200f28020810260b200f200f280204417f6a221836020420180d00200f10260b20171026200141ff01714104460d220c240b410121140240200241ff01714101460d0041002114410221010240024020110e03000102000b41002101410021140c010b410121010b200f280200220a41016a41014d0d1d200341f0046a200b370300200341e8046a2005370300200f200a41016a360200200341f8046a200637030020034180056a20103d01002003200f36028405200320133602e404200320163b01e204200320013a00e104200320143a00e0040240200341e0046a10d302450d00200e109803200e102602402018450d00200d10260b200f200f280200417f6a22033602004102210120030d20200f280208200f28020c2802001103000240200f28020c280204450d00200f28020810260b200f200f280204417f6a220336020420030d20200f10260c210b200320123602880a200320183602840a2003200d3602800a02400240200241ff01714101460d004102210102400240024020110e03000102000b410021010c010b200341ce046a200b370100200341d6046a2006370100200341de046a20103d0100200320053701c604200320133601c204200320163b01c004410121010b200341ea0e6a200341c8046a290300370100200341f20e6a200341d0046a290300370100200341fa0e6a200341d8046a290300370100200320013a00e10e200320032903c0043701e20e200341003a00e00e0c010b200341013a00e00e200320133602e40e0b200341e0046a200e41b00210cf061a200341b00c6a200341800a6a4101201520172007a72007422088a7200c200341e00e6a200341e0046a10ac04200341b80c6a290300211020032d00b40c210120032d00b50c211620032d00b60c211320032d00b70c210220032802b00c2117200f200f280200417f6a2218360200024020174101460d00024020180d00200f280208200f28020c2802001103000240200f28020c280204450d00200f28020810260b200f200f280204417f6a220136020420010d00200f10260b200e10260c1f0b024020180d00200f280208200f28020c2802001103000240200f28020c280204450d00200f28020810260b200f200f280204417f6a221736020420170d00200f10260b200e1026200141ff01714104460d1e0c200b200341e00e6a41206a200141286a290300370300200341e00e6a41186a200141206a290300370300200341e00e6a41106a200141186a290300370300200341e00e6a41086a200141106a2903003703002003200141086a2903003703e00e200341e0046a41206a200241206a290200370300200341e0046a41186a200241186a290200370300200341e0046a41106a200241106a290200370300200341e0046a41086a200241086a290200370300200320022902003703e0042000200341e00e6a200341e0046a108c05200424000f0b20034188056a2001412c6a280200360200200341e0046a41206a200141246a290200370300200341e0046a41186a2001411c6a290200370300200341e0046a41106a200141146a290200370300200341e0046a41086a2001410c6a290200370300200320012902043703e004200341e00e6a41206a200241206a290200370300200341e00e6a41186a200241186a290200370300200341e00e6a41106a200241106a290200370300200341e00e6a41086a200241086a290200370300200320022902003703e00e2000200341e0046a200341e00e6a10da05200424000f0b102c000b1034000b41dcb7c500413041dcbcc700102f000b410221010c610b41022101200341023a00c0040c5f0b200341d8116a410110e9020c580b200341d8116a410510e9020c570b200341d8116a410210e9020c560b200341b00c6a410110e9020c4f0b200341b00c6a410510e9020c4e0b410221010c510b2000420037002420004200370308200041206a41023a0000200041186a41003a000020004201370300200424000f0b200341b0036a410110e9020c450b200341b0036a410510e9020c440b42002110410221010c470b20034198086a2201420037030020034180086a41106a2217420037030020034180086a41086a221842003703002003420037038008200341d8096a419a8cc700410810fb012018200341d8096a41086a220d290300370300200320032903d80937038008200341d8116a41b8a1c300410d10fb012001200341d8116a41086a220e290300370300201720032903d811370300200341c8016a20034180086a108d02200341c8016a41106a290300211920032903d001212520032802c80121112001420037030020174200370300201842003703002003420037038008200341d8096a419a8cc700410810fb012018200d290300370300200320032903d80937038008200341d8116a41b8a1c300410d10fb012001200e290300370300201720032903d8113703002003427f2019420020111b2219201020087d2006201a54ad7d7c2025420020111b22082006201a7d7c221a2008542201ad7c22082001200820195420082019511b22011b3703e8042003427f201a20011b3703e00420034180086a4120200341e0046a411010b3010c410b20004200370308200041206a41023a0000200041186a41003a000020004201370300200424000f0b200341b00c6a410510f202200341e2096a200341b00c6a41086a280200360100200341d8116a41086a200341b0036a41086a290200370300200341d8116a41106a200341b0036a41106a2f01003b0100200320032903b00c3701da09200320032902b0033703d811200320032901d8093703a0082003200341de096a2901003701a6080c390b20034180086a410110f202200341e2096a20034180086a41086a280200360100200341d8116a41086a200341b0036a41086a290200370300200341d8116a41106a200341b0036a41106a2f01003b010020032003290380083701da09200320032902b0033703d811200320032901d8093703a0082003200341de096a2901003701a6080c380b200341b00c6a410710f202200341e2096a200341b00c6a41086a280200360100200341d8116a41086a200341b0036a41086a290200370300200341d8116a41106a200341b0036a41106a2f01003b0100200320032903b00c3701da09200320032902b0033703d811200320032901d8093703a0082003200341de096a2901003701a6080c370b200341b00c6a410610f202200341e2096a200341b00c6a41086a280200360100200341d8116a41086a200341b0036a41086a290200370300200341d8116a41106a200341b0036a41106a2f01003b0100200320032903b00c3701da09200320032902b0033703d811200320032901d8093703a0082003200341d8096a41066a2901003701a6080c360b41022101200341023a00b0030c2b0b41022101200341023a00b0030c230b200341b0036a20021096020c210b201620174198e2c4001032000b201620174198e2c4001032000b20004200370308200041206a20013a0000200041186a41003a0000200041b0b0c000ad428080808090028437002420004201370300200424000f0b00000b20004200370308200020032800c809360019200041186a41003a00002000411c6a200341cb096a28000036000020004200370300200424000f0b0b20002010370024200020023a0023200020133a0022200020163a002120004200370308200041206a20013a0000200041186a41003a000020004201370300200424000f0b20004200370308200020032800c809360019200041186a41003a00002000411c6a200341cb096a28000036000020004200370300200424000f0b0b20002010370024200020023a0023200020133a0022200020163a002120004200370308200041206a20013a0000200041186a41003a000020004201370300200424000f0b0240200241bc026a22132802004102460d0002402018200d41f0026c6a22162802b0022211450d00201641b4026a280200450d00201110260b20021098030b2002200341e0046a41bc0210cf061a201341023602002018200d41f0026c6a220241e8026a200341880f6a290300370300200241e0026a200341800f6a290300370300200241d8026a200341f80e6a290300370300200241d0026a200341f00e6a290300370300200241c8026a200341e80e6a290300370300200220032903e00e3703c00220032802b00c211120032802b80c21020b200320183602e004200320073702e40420112002200341e0046a10d5052007a7211602402001450d00200141f0026c21022018210103400240200141bc026a2802004102460d000240200141b0026a2802002213450d00200141b4026a280200450d00201310260b200110d5010b200141f0026a2101200241907d6a22020d000b0b02402016450d00201641f0026c450d00201810260b410421010b024020032802b40c450d00201110260b20014104470d00200341e8046a20123602002003410c3a00e004200341e0046a410c6a200d36020041012117200341013602e404200341e0046a10870220032802b803210120032802b00321020240024020032802800a4101460d002002200110ff010c010b20022001200341800a6a41047210ad040b410421010b024020032802b403450d0020032802b00310260b200f200f280200417f6a220236020002402017450d0020020d02200f280208200f28020c2802001103000240200f28020c280204450d00200f28020810260b200f200f280204417f6a220136020420010d02200f10260c020b024020020d00200f280208200f28020c2802001103000240200f28020c280204450d00200f28020810260b200f200f280204417f6a220236020420020d00200f10260b20014104460d010b200041f5ecc30036002420004196023b002120004200370308200041286a410e360000200041206a20013a0000200041186a41003a000020004201370300200424000f0b20004200370308200020032800b904360019200041186a41003a00002000411c6a200341bc046a28000036000020004200370300200424000f0b20004200370308200020032800c809360019200041186a41003a00002000411c6a200341cb096a28000036000020004200370300200424000f0b0b20002010370024200020023a0023200020133a0022200020163a002120004200370308200041206a20013a0000200041186a41003a000020004201370300200424000f0b41022116200341023602fc0e20012903a002211c200141186a290300214c2001290310214d2001290308214e2001290300211020032903f00e210520032903e80e210b20032903f80e2108200120032903e00e3703a002200141b8026a2213290300210620132008370300200141a8026a2213290300211b2013200b370300200141b0026a2213290300210b20132005370300200129038002212220012903e001213320012903c001213720012903a001213b200129038001213f20012903602143200129034021472001290320214b20012903c002211a20014198026a290300211f20014190026a290300212020014188026a2903002121200141f8016a2903002123200141f0016a2903002124200141e8016a2903002125200141d8016a2903002134200141d0016a2903002135200141c8016a2903002136200141b8016a2903002138200141b0016a2903002139200141a8016a290300213a20014198016a290300213c20014190016a290300213d20014188016a290300213e200141f8006a2903002140200141f0006a2903002141200141e8006a2903002142200141d8006a2903002144200141d0006a2903002145200141c8006a2903002146200141386a2903002148200141306a2903002149200141286a290300214a200141d8026a2903002105200141d0026a2903002108200141c8026a2903002119200341b80c6a200141e8026a2903003703002003200141e0026a2903003703b00c2006422088214f024020032802e0040d0020032802a4074102460d00200341e0046a41086a2101024020034198076a2802002213450d002003419c076a280200450d00201310260b20011098030b204fa721120b200320173602e004200320073702e40420112015200341e0046a10d5052007a7210e02402002450d00200241f0026c21022017210103400240200141bc026a2802004102460d000240200141b0026a2802002213450d00200141b4026a280200450d00201310260b200110d5010b200141f0026a2101200241907d6a22020d000b0b0240200e450d00200e41f0026c450d00201710260b200341800a6a41086a200341b00c6a41086a290300370300200320032903b00c3703800a410021010b024020032802dc11450d00201110260b200341b0036a41086a2202200341800a6a41086a290300370300200320032903800a3703b003024002400240024020010d00200341a8096a41086a2002290300370300200320032903b0033703a80920124102460d01200341a8076a2019370300200341a0076a201a37030020034188076a201b37030020034180076a201c370300200341e8066a2021370300200341e0066a2022370300200341c8066a2025370300200341c0066a2033370300200341a8066a2036370300200341a0066a203737030020034188066a203a37030020034180066a203b370300200341e8056a203e370300200341e0056a203f370300200341c8056a2042370300200341c0056a2043370300200341a8056a2046370300200341a0056a204737030020034188056a204a37030020034180056a204b370300200341c0076a20032903a809370300200341b0076a200837030020034190076a200b370300200341f0066a2020370300200341d0066a2024370300200341b0066a203537030020034190066a2039370300200341f0056a203d370300200341d0056a2041370300200341b0056a204537030020034190056a2049370300200341c8076a200341a8096a41086a290300370300200341b8076a200537030020034198076a220120063e0200200341f8066a201f370300200341d8066a2023370300200341b8066a203437030020034198066a2038370300200341f8056a203c370300200341d8056a2040370300200341b8056a204437030020034198056a2048370300200341f8046a204c370300200320103703e0042003201236029c072003204e3703e8042003204d3703f0040240200b42ffffffff0f83500d00200341e00e6a41086a200128020036020020032003290390073703e00e200341b00c6a200341e00e6a10ab0420032802b00c220120032802b80c10ff0120032802b40c450d00200110260b200341e00e6a41086a200d3602002003410c3a00e00e200341e00e6a410c6a2018360200200341013602e40e200341e00e6a108702200341e0046a1098030c030b201641ff01714104460d022016411876210220164110762113201641087621172010422088a721032010a721010c010b41032116411621174101211341f5ecc3002101410e21030b200f200f280200417f6a221836020020180d02200f280208200f28020c2802001103000240200f28020c280204450d00200f28020810260b200f200f280204417f6a221836020420180d02200f10260c020b200f200f280200417f6a2201360200024020010d00200f280208200f28020c2802001103000240200f28020c280204450d00200f28020810260b200f200f280204417f6a220136020420010d00200f10260b20004200370308200020032800d809360019200041186a41003a00002000411c6a200341db096a28000036000020004200370300200424000f0b0b20002001360024200020023a0023200020133a0022200020173a002120004200370308200041286a2003360000200041206a20163a0000200041186a41003a000020004201370300200424000f0b20004200370308200020032800800a360019200041186a41003a00002000411c6a200341830a6a28000036000020004200370300200424000f0b0b20002010370024200020023a0023200020133a0022200020163a002120004200370308200041206a20013a0000200041186a41003a000020004201370300200424000f0b410421010b20151026200141ff01714104470d0020004200370308200020032800c809360019200041186a41003a00002000411c6a200341cb096a28000036000020004200370300200424000f0b20002010370024200020133a00232000200f3a0022200020023a002120004200370308200041206a20013a0000200041186a41003a000020004201370300200424000f0b024020022001460d000340200110d5012002200141b0026a2201470d000b0b0240201d450d00201d41b0026c450d00201510260b200341083a00e004200341e0046a41086a41043a0000200341e0046a108702200f200f280200417f6a220136020020010d01200f280208200f28020c2802001103000240200f28020c280204450d00200f28020810260b200f200f280204417f6a220136020420010d010b200f10260b20004200370308200020032800e00436001920004200370300200041186a41003a00002000411c6a200341e3046a280000360000200424000f0b20032d00b00322014104460d010b20032f00b103210220032d00b303210f200020032902b4033700242000200f3a0023200020023b0021200041206a20013a0000200041186a41003a00002000420037030820004201370300200424000f0b20004200370308200020032800c809360019200041186a41003a00002000411c6a200341cb096a28000036000020004200370300200424000f0b02402011450d00201210260b0240200d450d00201810260b20032d00d81122014104460d0020032f00d911210220032d00db11210f200020032902dc113700242000200f3a0023200020023b0021200041206a20013a0000200041186a41003a00002000420037030820004201370300200424000f0b20004200370308200020032800c809360019200041186a41003a00002000411c6a200341cb096a28000036000020004200370300200424000f0b02402015450d00201110260b200e450d00200d10260b024020032d00800a4104460d0020032802800a2101200020032902840a370024200041206a2001360000200041186a41003a00002000420037030820004201370300200424000f0b20004200370308200020032800b003360019200041186a41003a00002000411c6a200341b3036a28000036000020004200370300200424000f0b20004200370308200020032800c809360019200041186a41003a00002000411c6a200341cb096a28000036000020004200370300200424000f0b20032f00b103210220032d00b303210f200020032902b4033700242000200f3a0023200020023b0021200041206a20013a0000200041186a41003a00002000420037030820004201370300200424000f0b20004200370308200020032800c809360019200041186a41003a00002000411c6a200341cb096a28000036000020004200370300200424000f0b2011200141246c6a2802002102200341b00c6a41186a200341a0086a41186a290300370300200341b00c6a41106a200341a0086a41106a290300370300200341b00c6a41086a200341a0086a41086a290300370300200320032903a0083703b00c200d200120012002200f496a2002200f461b22024f0d002002200d103b000b0240200d20032802f409470d00200341d8096a41186a200d10e40120032802ec09211520032802f00921110b2011200241246c6a220141246a2001200d20026b41246c10d0061a2001200f360200200120032903b00c3702042001410c6a200341b00c6a41086a290300370200200141146a200341b00c6a41106a2903003702002001411c6a200341b00c6a41186a290300370200410121012003200d41016a3602f809200341c0046a41186a2217200341a0086a41186a290300370300200341c0046a41106a2218200341a0086a41106a290300370300200341c0046a41086a2211200341a0086a41086a290300370300200320032903a0083703c0040240201520032802e809470d00200341d8096a410c6a2015410110930120032802ec0921150b20032802e409220c20154105746a220220032903c004370000200241186a2017290300370000200241106a2018290300370000200241086a20112903003700002003201541016a22153602ec090b201310260240024020010d00024020032802dc09450d0020032802d80910260b024020032802e80941ffffff3f71450d00200c10260b024020032802f4092201450d00200141246c450d0020032802f00910260b201610260c010b0240024002402015450d0020154105742117200341b00c6a4104722101200c21020340200341a0086a200210fe02200341b00c6a20032802a008221820032802a80810b005200341800a6a41086a2211200141086a290200370300200341800a6a41106a220d200141106a290200370300200341800a6a41186a220e200141186a290200370300200341800a6a41206a2212200141206a290200370300200320012902003703800a0240024020032802b00c22130d00410021130c010b200341b0036a41206a2012290300370300200341b0036a41186a200e290300370300200341b0036a41106a200d290300370300200341b0036a41086a2011290300370300200320032903800a3703b0030b024020032802a408450d00201810260b20130d02200241206a2102201741606a22170d000b0b4100211741042114410021150c010b200341d8116a41206a2201200341b0036a41206a290300370300200341d8116a41186a2218200341b0036a41186a290300370300200341d8116a41106a2211200341b0036a41106a290300370300200341d8116a41086a220d200341b0036a41086a290300370300200320032903b0033703d811412c10242214450d2520142013360200201420032903d8113702042014410c6a200d290300370200201441146a20112903003702002014411c6a2018290300370200201441246a200129030037020020034281808080103702840820032014360280080240024020174120470d00410121150c010b200241206a2118200c20154105746a221241606a210c200341b00c6a4104722101410121150340201821020340200341a0086a200210fe02200341b00c6a20032802a008221720032802a80810b005200341800a6a41086a2218200141086a290200370300200341800a6a41106a2211200141106a290200370300200341800a6a41186a220d200141186a290200370300200341800a6a41206a220e200141206a290200370300200320012902003703800a0240024020032802b00c22130d00410021130c010b200341b0036a41206a200e290300370300200341b0036a41186a200d290300370300200341b0036a41106a2011290300370300200341b0036a41086a2018290300370300200320032903800a3703b0030b024020032802a408450d00201710260b024020130d002012200241206a2202470d010c030b0b200341d8116a41206a200341b0036a41206a2903002210370300200341d8116a41186a200341b0036a41186a2903002206370300200341d8116a41106a200341b0036a41106a290300220b370300200341d8116a41086a200341b0036a41086a2903002205370300200320032903b00322073703d811200341b00c6a41206a22112010370300200341b00c6a41186a220d2006370300200341b00c6a41106a220e200b370300200341b00c6a41086a220a2005370300200320073703b00c02402015200328028408470d0020034180086a201510ee0120032802800821140b200241206a211820142015412c6c6a22172013360200201720032903b00c3702042017410c6a200a290300370200201741146a200e2903003702002017411c6a200d290300370200201741246a20112903003702002003201541016a221536028808200c2002470d000b0b20032802840821170b200341b00c6a41206a200341d8096a41206a280200360200200341b00c6a41186a2201200341d8096a41186a290300370300200341b00c6a41106a200341d8096a41106a290300370300200341b00c6a41086a200341d8096a41086a290300370300200320032903d8093703b00c200341b0036a200110bd01200341800a6a418dd5c10010fb0220032802800a220120032802880a200341b0036a109902024020032802840a450d00200110260b024020032802b403450d0020032802b00310260b200341800a6a418dd5c100200341b00c6a10fc0220032802800a220120032802880a200341bc0c6a10b105024020032802840a450d00200110260b024020032802b40c450d0020032802b00c10260b0240200341c00c6a28020041ffffff3f71450d0020032802bc0c10260b0240200341cc0c6a2802002201450d00200141246c450d0020032802c80c10260b201610262014450d00200341003602e011200342043703d811200341d8116a4100201510e70120032802e011211302402015450d0020032802d81120134102746a21012015210203402001418094ebdc03360200200141046a21012002417f6a22020d000b201520136a21130b200320133602e011410410242201450d24200342043702b403200320013602b003200341b0036a41004104106d20032802b00320032802b80322016a200f360000200341c4036a4100290095d5413702002003200141046a3602b8032003410029008dd5413702bc032003419b0a6a200341b0036a41186a280200360000200341930a6a200341b0036a41106a2903003700002003418b0a6a20032903b803370000200320032903b0033700830a200341b90c6a200341880a6a290000370000200341c10c6a200341800a6a41106a290000370000200341b00c6a41186a200341970a6a290000370000200341d00c6a41013a0000200341033a00b00c200320032900800a3700b10c200341b00c6a108702024020032802dc1141ffffffff0371450d0020032802d81110260b02402015450d002015412c6c21022014210103400240200141046a28020041ffffff3f71450d00200128020010260b2001412c6a2101200241546a22020d000b0b02402017450d002017412c6c450d00201410260b024020032802fc0841ffffff3f71450d0020032802f80810260b200041186a41003a000020004200370308200020032800b9043600192000411c6a200341bc046a28000036000020004200370300200424000f0b024020032802fc0841ffffff3f71450d0020032802f80810260b411821014183f6c40021020b410021030c010b0b2000200236002420004200370308200041286a2001360000200041206a20033a0000200041186a41003a000020004201370300200424000f0b20004200370308200020032800c809360019200041186a41003a00002000411c6a200341cb096a28000036000020004200370300200424000f0b20004200370308200020032800b904360019200041186a41003a00002000411c6a200341bc046a28000036000020004200370300200424000f0b20034188096a41086a200341aa086a280100360200200320032901a20837038809024020032802ec042201450d00200141246c2102200c210103400240024020012d0000220f41044b0d00024002400240200f0e050400010204040b2001410c6a280200450d03200141086a28020010260c030b2001410c6a280200450d02200141086a28020010260c020b2001410c6a280200450d01200141086a28020010260c010b200141086a280200450d00200141046a28020010260b200141246a21012002415c6a22020d000b0b024020032802e8042201450d00200141246c450d00200c10260b024020282013460d000340201610d6010240201641046a2802002201450d00200141246c450d00201628020010260b201641f0006a2116201841907f6a22180d000b0b02402011450d00201141f0006c450d00200d10260b200328029c042201450d04200141c4006c450d040c020b20282013460d00200d201741f0006c6a210f03402013220141046a220210d601200141f0006a21130240200141086a2802002201450d00200141246c450d00200228020010260b200f2013470d000b0b02402011450d00201141f0006c450d00200d10260b200341b8086a4200370300200341b0086a4200370300200341a0086a41086a22014200370300200342003703a00820034180086a41a28cc700410a10fb01200120034180086a41086a29030037030020032003290380083703a008200341e0076a41e0b8c500410610fb01200941086a200341e0076a41086a290300370300200920032903e007370300200341e0046a2015201210b503200341a0086a412020032802e004220120032802e80410b301024020032802e404450d00200110260b200341043a008809200328029c042201450d02200141c4006c450d020b201510260c010b02402017450d00201741f0006c2102200d41046a21010340200110d6010240200141046a280200220f450d00200f41246c450d00200128020010260b200141f0006a2101200241907f6a22020d000b0b2011450d00201141f0006c450d00200d10260b024020032d00880922014104460d0020032f008909210220032d008b09210f2000200329028c093700242000200f3a0023200020023b0021200041206a20013a0000200041186a41003a00002000420037030820004201370300200424000f0b20004200370308200020032800c809360019200041186a41003a00002000411c6a200341cb096a28000036000020004200370300200424000f0b02400240200b202320218422195620052024202284220856200520085122011b0d00200b201954200520085420011b450d0120034198086a2201420037030020034180086a41106a2217420037030020034180086a41086a221842003703002003420037038008200341d8096a419a8cc700410810fb012018200341d8096a41086a220d290300370300200320032903d80937038008200341d8116a41b8a1c300410d10fb012001200341d8116a41086a220e290300370300201720032903d811370300200341b0016a20034180086a108d02200341b0016a41106a290300211a20032903b801212120032802b00121112001420037030020174200370300201842003703002003420037038008200341d8096a419a8cc700410810fb012018200d290300370300200320032903d80937038008200341d8116a41b8a1c300410d10fb012001200e290300370300201720032903d81137030020034200201a420020111b221a2019200b54ad200520087d7c7c2021420020111b22082019200b7d222154ad7d2219200820217d22212008562019201a562019201a511b22011b3703e80420034200202120011b3703e00420034180086a4120200341e0046a411010b3010c010b20034198086a2201420037030020034180086a41106a2217420037030020034180086a41086a221842003703002003420037038008200341d8096a419a8cc700410810fb012018200341d8096a41086a220d290300370300200320032903d80937038008200341d8116a41b8a1c300410d10fb012001200341d8116a41086a220e290300370300201720032903d81137030020034198016a20034180086a108d0220034198016a41106a290300211a20032903a001212120032802980121112001420037030020174200370300201842003703002003420037038008200341d8096a419a8cc700410810fb012018200d290300370300200320032903d80937038008200341d8116a41b8a1c300410d10fb012001200e290300370300201720032903d8113703002003427f201a420020111b221a200520087d200b201954ad7d7c2021420020111b2208200b20197d7c22192008542201ad7c220820012008201a542008201a511b22011b3703e8042003427f201920011b3703e00420034180086a4120200341e0046a411010b3010b200341d80c6a2217201c370300200341e00c6a2218201f3703002003201b3703d00c200320053703c80c2003200b3703c00c200320063703b00c200320103703b80c02400240427f2006200b7c220820082006542201201020057c2001ad7c220820105420082010511b22011b22194280c8afa025544100427f200820011b221a501b0d00200341c00c6a29030021192018290300211a2017290300211b200341d00c6a290300211c20032903b80c211f20032903b00c21214201210820032903c80c21220c010b024002402006200b8420102005848450450d00420021080c010b42002108200341c0046a41186a22014200370300200341c0046a41106a22174200370300200341c0046a41086a22184200370300200342003703c00420034180086a419a8cc700410810fb01201820034180086a41086a220d29000037030020032003290080083703c004200341a8096a41b8a1c300410d10fb012001200341a8096a41086a220e290300370300201720032903a80937030020034180016a200341c0046a108d0220034180016a41106a290300211b200329038801211c2003280280012111200142003703002017420037030020184200370300200342003703c00420034180086a419a8cc700410810fb012018200d29000037030020032003290080083703c004200341a8096a41b8a1c300410d10fb012001200e290300370300201720032903a80937030020034200201b420020111b221b201a7d201c420020111b221c201954ad7d221f201c20197d2221201c56201f201b56201f201b511b22011b3703e80420034200202120011b3703e004200341c0046a4120200341e0046a411010b30120034198056a201a37030020034190056a2019370300200341e0046a41086a41013a0000200341e9046a20032903b003370000200341f1046a200341b0036a41086a290300370000200341f9046a200341b0036a41106a29030037000020034181056a200341b0036a41186a290300370000200341023a00e004200341e0046a1087020b0b200341880f6a201c370300200341a00f6a2020370300200341900f6a201b370300200341f00e6a201f370300200341980f6a201a370300200341f80e6a2019370300200320223703800f200320213703e80e200320164100200742015122011b3a00ac0f20032013410020011b3602a80f200320084201512201ad3703e00e0240024020010d002002200f10ff010c010b2002200f200341e80e6a10da030b024020032802a408450d00200210260b20084201522101024002400240200742015122020d002001450d010b2002200171450d01200341e0046a41086a41043a0000200341e9046a20032903b003370000200341f1046a200341b0036a41086a290300370000200341f9046a200341c0036a29030037000020034181056a200341c8036a290300370000200341003a00e004200341e0046a1087020c010b200341e0046a41086a41033a0000200341e9046a20032903b003370000200341f1046a200341b0036a41086a290300370000200341f9046a200341c0036a29030037000020034181056a200341c8036a290300370000200341003a00e004200341e0046a1087020b024020074201510d0020034198056a201037030020034190056a2006370300200341e0046a41086a41003a0000200341e9046a20032903b003370000200341f1046a200341b0036a41086a290300370000200341f9046a200341c0036a29030037000020034181056a200341c8036a290300370000200341023a00e004200341e0046a1087020b200341a8056a2005370300200341a0056a200b37030020034198056a201037030020034190056a2006370300200341e0046a41086a41033a0000200341e9046a20032903b003370000200341f1046a200341b0036a41086a290300370000200341f9046a200341c0036a29030037000020034181056a200341b0036a41186a290300370000200341023a00e004200341e0046a108702200041186a41003a000020004200370308200020032800b9043600192000411c6a200341b9046a41036a28000036000020004200370300200424000f0b4102210f20032d00b00322014104470d010b20034180056a20032903d80937030020034194056a200328008b0936000020034188056a200341e0096a290300370300200341f8046a2010370300200320053703e0042003200328028809360091052003200b3703e804200320063703f0042003200f3a00900502400240200f4102470d002018201310ff010c010b20182013200341e0046a10d4050b200341b8036a280200210f20032d00b103211320032d00b203211620032d00b303211720032802b4032111410421010c010b200341b8036a280200210f20032802b403211120032d00b303211720032d00b203211620032d00b10321130b024020032802a408450d00201810260b20014104460d012011ad21100b200020173a0023200020163a0022200020133a002120004200370308200041206a20013a0000200041186a41003a00002000200fad42208620108437002420004201370300200424000f0b20034188056a2002360200200341ed046a200341880a6a290300370000200341f5046a200341900a6a290300370000200341fd046a200341800a6a41186a290300370000200341023a00e404200341013a00e004200320032903800a3700e504200341e0046a108702200041186a41003a000020004200370308200020032800c8093600192000411c6a200341cb096a28000036000020004200370300200424000f0b20032d00b00c22014104470d010b2011200f10ff01200341b80c6a280200210f20032802b40c211320032d00b30c211620032d00b20c211720032d00b10c2118410421010c010b200341b80c6a280200210f20032802b40c211320032d00b30c211620032d00b20c211720032d00b10c21180b024020032802b403450d00201110260b20014104460d010b20002013360024200020163a0023200020173a0022200020183a002120004200370308200041286a200f360000200041206a20013a0000200041186a41003a000020004201370300200424000f0b200341e8046a2002360200200341013a00e404200341013a00e004200341e0046a108702200041186a41003a000020004200370308200020032800b9043600192000411c6a200341bc046a28000036000020004200370300200424000f0b4102210f20032d00d81122014104470d010b20034180056a20032903d80937030020034194056a200328008b0936000020034188056a200341e0096a290300370300200341f8046a2010370300200320053703e0042003200328028809360091052003200b3703e804200320063703f0042003200f3a00900502400240200f4102470d002002201310ff010c010b20022013200341e0046a10d4050b200341e0116a280200210f20032d00d911211320032d00da11211620032d00db11211720032802dc112118410421010c010b200341e0116a280200210f20032802dc11211820032d00db11211720032d00da11211620032d00d91121130b024020032802a408450d00200210260b20014104470d01200341ed046a20032903b80337000020034188056a2011360200200341f5046a200341c0036a290300370000200341fd046a200341c8036a290300370000200341003a00e404200341013a00e004200320032903b0033700e504200341e0046a108702200341043a00c0040b20004200370308200020032800c809360019200041186a41003a00002000411c6a200341cb096a28000036000020004200370300200424000f0b200341c8046a200f360200200320183602c404200320173a00c304200320163a00c204200320133a00c104200320013a00c0040b20032f00c104210220032d00c304210f200020032902c4043700242000200f3a0023200020023b0021200041206a20013a0000200041186a41003a00002000420037030820004201370300200424000f0b20002018360024200020173a0023200020163a0022200020133a002120004200370308200041286a200f360000200041206a20013a0000200041186a41003a000020004201370300200424000f0b20032802fc0e41ffffff3f71450d00200110260b201641ffffff3f71450d00200f10260b024020032d00880922014104460d0020032f008909210220032d008b09210f2000200329028c093700242000200f3a0023200020023b0021200041206a20013a0000200041186a41003a00002000420037030820004201370300200424000f0b20004200370308200020032800c809360019200041186a41003a00002000411c6a200341cb096a28000036000020004200370300200424000f0b1033000b20032d00e0042101200f109803200f10260b420021060240201042ffffff3f8350450d004200210b0c010b201110264200210b0b200320032800e70736009f04200320032903e00737039804200041206a20013a0000200041186a200b370300200041106a2010370300200020063703082000200329039804370021200041286a200328009f043600002000412c6a200236020020004201370300200424000bdb0202017f037e23004190026b220424000240024020012d000d450d0041e9b1c2002101413121020c010b200110a5032001410036020820014100360200200420022900002205370318200441306a410272410041de0110d1061a024041e40110242202450d0020024100360200200241046a200441306a41e00110cf061a2001410036020420012002360200200420013602282004200236022420044100360220200441306a200441206a200441186a10a603024020042802304101460d0041bcb1c2002101412d21020c020b200441086a41086a2004413c6a2902002206370300200420042902342207370308200441306a41086a200637030020042007370330200420053702442004200141086a360240200441206a20032802002003280204108701200441306a200441206a10a70320014180023b010c410021010c010b102c000b200020023602042000200136020020044190026a24000b840305057f017e017f017e017f024020002802002201450d002000280208210220002802042103024003402003450d012003417f6a210320012802e40121010c000b0b02402002450d0041002104024003402001450d0102400240200420012f01064f0d00200121000c010b034002400240200128020022000d0041002100200521030c010b20013301044220862106200341016a220321050b20011026200021012006422088a7220420002f01064f0d000b200321050b200441016a210720002004410c6c6a220141e4006a2902002108200141e0006a28020021090240024020030d0020002101200721040c010b200020074102746a41e4016a2802002101410021042003417f6a2200450d00034020012802e40121012000417f6a22000d000b0b2009450d022002417f6a210202402008a7450d00200910260b4100210320020d000c020b0b419d8ac600412b41c88ac600102f000b2001450d0020012802002100200110262000450d00034020002802002101200010262001210020010d000b0b0bed0101077f20012802082103200128020421042001280200210502400340200441086a210620042f010621074100210802400240034020072008460d0120022006410810d2062209450d02200841016a2108200641086a21062009417f4a0d000b2008417f6a21070b2005450d022001200336020820012005417f6a22053602002001200420074102746a41e4016a28020022043602040c010b0b2000200536020420004100360200200041106a20083602002000410c6a2003360200200041086a20043602000f0b20004201370200200041106a20073602002000410c6a2003360200200041086a20043602000bfa1406027f017e047f017e0f7f017e230041b0046b2202240020002802102203200328020041016a36020020002902142104200028020c2103200028020821052000280200210620002802042100200241c0006a41086a2207200141086a28020036020020022001290200370340024002400240024002400240024020002f01062201410b490d00200241d0026a410272410041de0110d1061a41e40110242208450d0420084100360200200841046a200241d0026a41e00110cf061a200241d0026a41086a2207200041b0016a280200360200200220002902a8013703d00220002900382109200841086a200041c0006a20002f010641796a220141037410cf06210a200841e0006a200041b4016a2001410c6c10cf06210b200041063b0106200820013b0106200241f0006a41086a2007280200360200200220022903d0023703700240024020034107490d002003410374200a6a41506a200a200341796a22074103746a220a200141ffff037120076b41037410d0061a200a20043700002003410c6c200b6a220341b87f6a200341ac7f6a220320082f010620076b410c6c10d0061a200341086a200241c0006a41086a28020036020020032002290340370200200820082f010641016a3b01060c010b200041086a20034103746a220141086a200120002f010620036b41037410d0061a20012004370000200041e0006a2003410c6c6a2201410c6a200120002f010620036b410c6c10d0061a200141086a200241c0006a41086a28020036020020012002290340370200200020002f010641016a3b01060b200241306a41086a220c200241f0006a41086a220d2802002203360200200241086a41086a220e2003360200200220022903702204370330200220043703082000280200220a0d014100210f200241c0006a21030c020b200020034103746a220641106a200641086a2206200120036b41037410d0061a2006200437000020002003410c6c6a220141ec006a200141e0006a220620002f010620036b410c6c10d0061a200141e8006a200728020036020020062002290340370200200020002f010641016a3b01060c020b200641016a210f20002f01042106200241d0026a4102722110200241e8006a2111200241e0006a2112200241d8006a2113200241d0006a211441002100024003402002200a36022c2002200f360228200c200e28020036020020022002290308370330200f417f6a2000470d01024002400240200a2f01062200410b490d002010410041de0110d1061a200241f0006a200241d0026a41e00110cf061a20114200370300201242003703002013420037030020144200370300200241c0006a41086a220042003703002002420037034041940210242201450d0720014100360200200141046a200241f0006a41e00110cf061a2001418c026a201129030037020020014184026a2012290300370200200141fc016a2013290300370200200141f4016a2014290300370200200141ec016a2000290300370200200120022903403702e401200a2900382104200241d0026a41086a2215200a41b0016a2802003602002002200a2902a8013703d002200141086a200a41c0006a200a2f0106220341796a220041037410cf062116200141e0006a200a41b4016a2000410c6c10cf062117200141e4016a200a4180026a2003417a6a220b41027410cf062118200a41063b0106200120003b01060240200b450d00410021002018210303402003280200220720003b010420072001360200200341046a2103200b200041016a2200470d000b0b200d20152802002200360200200220022903d002221937037020152000360200200220193703d00220064107490d0120162006417a6a22034103746a2016200641796a22004103746a220720012f010620006b41037410d0061a200720093700002006410c6c20176a220741b87f6a200741ac7f6a220720012f010620006b410c6c10d0061a200741086a200c28020036020020072002290330370200200120012f010641016a22073b01062006410274220b20186a416c6a201820034102746a2206200741ffff037120036b41027410d0061a20062008360200200320012f010622064b0d022001200b6a41cc016a2103034020032802002207200041016a22003b010420072001360200200341046a210320062000470d000c030b0b200a41086a2201200641016a22034103746a200120064103746a2201200020066b41037410d0061a20012009370000200a2006410c6c6a220041ec006a200041e0006a2201200a2f010620066b410c6c10d0061a200041e8006a200241306a41086a28020036020020012002290330370200200a200a2f010641016a22003b010620064102742207200a41e4016a22016a41086a200120034102746a2201200041ffff037120036b41027410d0061a200120083602002003200a2f010622014b0d05200a20076a41e8016a2100034020002802002203200641016a22063b01042003200a360200200041046a210020012006470d000c060b0b200a41086a2200200641016a22034103746a200020064103746a2200200a2f010620066b41037410d0061a20002009370000200a41e0006a2006410c6c6a2200410c6a2000200a2f010620066b410c6c10d0061a200041086a200c28020036020020002002290330370200200a200a2f010641016a22003b01062006410274220b200a41e4016a22076a41086a200720034102746a2207200041ffff037120036b41027410d0061a200720083602002006200a2f010622074f0d00200a200b6a41e8016a2100034020002802002203200641016a22063b01042003200a360200200041046a210020072006470d000b0b200241186a41086a20152802002200360200200e2000360200200220022903d0022209370318200220093703080240200a28020022000d00200241c0006a210320012108200421090c030b200a2f010421062000210a2004210920012108200f2100200f41016a210f0c000b0b41e0e8c600413541dcbcc700102f000b200241d0026a410272410041de0110d1061a200241f0006a200241d0026a41e00110cf061a200341286a22014200370200200341206a22074200370200200341186a22064200370200200341106a220a4200370200200341086a220b42003702002003420037020041940210242200450d0120004100360200200041046a200241f0006a41e00110cf061a2000418c026a200129020037020020004184026a2007290200370200200041fc016a2006290200370200200041f4016a200a290200370200200041ec016a200b290200370200200020032902003702e4012000200528020022033602e4012005200036020020052005280204220141016a360204200341003b010420032000360200200241d0026a41086a200241086a41086a280200360200200220022903083703d0022001200f470d0220002f01062203410a4b0d0320002003410c6c6a220141e0006a20022903d002370200200020034103746a41086a2009370000200141e8006a200241d0026a41086a2802003602002000200341016a22034102746a41e4016a2008360200200020002f010641016a3b0106200820033b0104200820003602000b200241b0046a24000f0b102c000b4189e8c600413041dcbcc700102f000b41b9e8c600412741dcbcc700102f000bdf0403037f017e027f23004190026b220424000240024020012d000d450d0041e9b1c2002105413121010c010b02400240024002400240200328020022064101470d00200110a5032001410036020820014100360200200420022900002207370318200441186a2108200441086a21020c010b2001280200210520042002290000220737031820050d01200441186a2108200441086a21020b41002109200441306a410272410041de0110d1061a41e40110242205450d0120054100360200200541046a200441306a41e00110cf061a20014100360204200120053602000c020b20012802042109200441186a2108200441086a21020c010b102c000b200420013602282004200536022420042009360220200441306a200441206a200810a60302400240024020042802304101470d0020022004290234370200200241086a22052004413c6a290200370200200441306a41086a200529020037030020042002290200370330200420073702442004200141086a360240200441003602282004420137032020060d01200441206a41004101106d2004280220200428022822056a41003a00002004200541016a2205360228200341086a2903002107200441206a20054108106d2004280220200428022822056a20073700002004200541086a3602280c020b41bcb1c2002105412d21010c020b200441206a41004101106d2004280220200428022822056a41013a00002004200541016a360228200441206a200341046a10a3010b200441306a200441206a10a703200120063a000d41002105200141003a000c0b200020013602042000200536020020044190026a24000b996408017f017e037f017e037f017e167f027e230041f0096b2201240010aa0342c096b102210202400240024020004101460d00200141f0006a41186a22034200370300200141f0006a41106a22044200370300200141f0006a41086a2205420037030020014200370370200141d0016a41868cc700410410fb012005200141d0016a41086a290000370300200120012900d00137037020014190036a41d49ec600410b10fb01200320014190036a41086a2900003703002004200129009003370300200141e0006a200141f0006a10ab03200129036821062001280260210720014190016a41186a2204420037030020014190016a41106a2205420037030020014190016a41086a22084200370300200142003703900120014180086a41868cc700410410fb01200820014180086a41086a220329000037030020012001290080083703900120014180086a41b49dc600410a10fb01200420032900003703002005200129008008370300200141d0006a20014190016a10ab03200128025021092001290358210a200442003703002005420037030020084200370300200142003703900120014180086a41868cc700410410fb012008200329000037030020012001290080083703900120014180086a41a89ec600410b10fb01200420032900003703002005200129008008370300200141c0006a20014190016a10ab0342002006420020071b22062001290348420020012802401b200a42d8047e420020091b7c7d220a200a2006561b42d804540d00200141b0016a41186a22044200370300200141b0016a41106a220b4200370300200141b0016a41086a22054200370300200142003703b00120014180086a41b48cc700410710fb012005200329000037030020012001290080083703b00120014180086a4184c1c200410c10fb0120042003290000370300200b200129008008370300200141386a200141b0016a4120108902200128023c210c2001280238210d20044200370300200b420037030020054200370300200142003703b00120014180086a41b48cc700410710fb012005200329000037030020012001290080083703b00120014180086a41a8c1c200410d10fb0120042003290000370300200b200129008008370300200141b0016a108a02210e200141d0046a41186a22044200370300200141d0046a41106a220f4200370300200141d0046a41086a22054200370300200142003703d00420014180086a41b48cc700410710fb012005200329000037030020012001290080083703d00420014180086a4184c1c200410c10fb0120042003290000370300200f200129008008370300200141306a200141d0046a4120108902200141e0076a10ac0320014190066a10ad032001280294062110200128029006211102402001280298062203450d00200341057441606a210820014180086a410472210441002105201121030340200141d0046a41186a200341186a2207290000370300200141d0046a41106a200341106a2209290000370300200141d0046a41086a200341086a2212290000370300200120032900003703d00420032900002106200441186a200729000037000020042006370000200441086a2012290000370000200441106a200929000037000020012005360280082005200410ae031a2008450d01200341206a2103200841606a2108200541016a21050c000b0b0240201041ffffff3f71450d00201110260b200141e8046a4200370300200141e0046a4200370300200141d0046a41086a22034200370300200142003703d00420014180086a41b48cc700410710fb01200320014180086a41086a220429000037030020012001290080083703d00420014180086a4184c1c200410c10fb01200f41086a2004290000370000200f200129008008370000200141286a200141d0046a4120108902200128022c210320012802282104200141d0016a41d18cc700410810fb0120014190036a41e4f5c500411210fb014100210520012003410020041b3602b001200141b8076a200141b0016a410410a20220014180086a410c6a200141b0016a41046a3602002001200141b8076a41086a2208360284082001200141b0016a360288082001200141b8076a36028008200141d0046a20014180086a107320012802d804220341206a2204417f4c0d010240024020040d00410121070c010b200410242207450d03200421050b20014100360288082001200736028008200120053602840820014180086a4100411010c90120012802800820012802880822046a220520012900d001370000200541086a200141d0016a41086a2900003700002001200441106a22043602880820014180086a2004411010c90120012802800820012802880822046a2205200129009003370000200541086a20014190036a41086a2900003700002001200441106a22053602880820012802d004210420014180086a2005200310c901200128028008220520012802880822076a2004200310cf061a2001200720036a220336028808024020012802d404450d00200410260b2005200310af030240200128028408450d00200510260b200141e8046a4200370300200141e0046a4200370300200141d0046a41086a22034200370300200142003703d00420014180086a41b48cc700410710fb01200320014180086a41086a220429000037030020012001290080083703d00420014180086a4184c1c200410c10fb01200f41086a2004290000370000200f200129008008370000200141206a200141d0046a41201089022001280224210320012802202104200141d0016a41d18cc700410810fb0120014190036a41c0d2c500410e10fb014100210520012003410020041b3602b001200141b8076a200141b0016a410410a20220014180086a410c6a200141b0016a41046a36020020012008360284082001200141b0016a360288082001200141b8076a36028008200141d0046a20014180086a107320012802d804220341206a2204417f4c0d010240024020040d00410121080c010b200410242208450d03200421050b20014100360288082001200836028008200120053602840820014180086a4100411010c90120012802800820012802880822046a220520012900d001370000200541086a200141d0016a41086a2900003700002001200441106a22043602880820014180086a2004411010c90120012802800820012802880822046a2205200129009003370000200541086a20014190036a41086a2900003700002001200441106a22053602880820012802d004210420014180086a2005200310c901200128028008220520012802880822086a2004200310cf061a2001200820036a220336028808024020012802d404450d00200410260b2005200310af030240200128028408450d00200510260b200141013a008408200141063a00800820014180086a108702024020012802e40741ffffff3f71450d0020012802e00710260b200141c8016a4200370300200141c0016a4200370300200141b0016a41086a22034200370300200142003703b00120014180086a41b48cc700410710fb01200320014180086a41086a220429000037030020012001290080083703b00120014180086a419ab2c200410a10fb01200b41086a2004290000370000200b200129008008370000200141203602dc092001200141b0016a3602d809200141e0096a200141b0016a41201082020240024020012802e00922070d00410021080c010b20012802e40921092001200141e0096a41086a2802003602cc09200120073602c809200141186a200141c8096a108f010240024020012802180d00200128021c221220012802cc0941c0016e2203200320124b1bad42c0017e2206422088a70d042006a72203417f4c0d040240024020030d00410121080c010b200310242208450d060b20014100360278200120083602702001200341c0016e3602740240024002402012450d0020014180086a41206a211020014190066a4101722113410021114100210f034041002104200141003a00b00620012802cc09417f6a2103200f41016a210f0340200141003a00df072003417f460d0320014190066a20046a20012802c80922052d00003a00002001200541016a3602c8092001200441016a22053a00b006200120033602cc092003417f6a21032005210420054120470d000b200141e0076a41186a220320014190066a41186a290300370300200141e0076a41106a220420014190066a41106a290300370300200141e0076a41086a221420014190066a41086a29030037030020012001290390063703e007200541ff01714120490d0320014190016a41086a2205201429030037030020014190016a41106a2214200429030037030020014190016a41186a22042003290300370300200120012903e0073703900120014190066a200141c8096a10b00320012d0090064101460d0320014180086a41186a200429030037030020014180086a41106a201429030037030020014180086a41086a20052903003703002001200129039001370380082010201341a00110cf061a200141d0046a20014180086a41c00110cf061a20014190036a200141d0046a41c00110cf061a200141d0016a20014190036a41c00110cf061a024020112001280274470d00200141f0006a2011410110f40120012802702108200128027821110b2008201141c0016c6a200141d0016a41c00110cf061a2001201141016a2211360278200f2012470d000b0b200129027421062008450d020c030b200441ff0171450d00200141003a00b0060b024020012802742203450d00200341c0016c450d00200810260b0b41002108200141003602d804200142013703d0042001410e360294032001200141d8096a360290032001200141d0046a3602d00120014194086a410136020020014201370284082001418c8dc60036028008200120014190036a36029008200141d0016a41c4e1c00020014180086a10351a20012802d00420012802d80410840220012802d404450d0020012802d00410260b2009450d00200710260b2001410036029801200142013703900120014190016a41002006420020081b2206422088a72215109301201541c0016c21092008410120081b21162001280298012105200128029001211702402015450d00201720054105746a21032009210820162104034020032004290000370000200341186a200441186a290000370000200341106a200441106a290000370000200341086a200441086a290000370000200541016a2105200341206a2103200441c0016a2104200841c07e6a22080d000b0b2001200536029801200141c8016a4200370300200141c0016a4200370300200141b0016a41086a22034200370300200142003703b00120014180086a41b48cc700410710fb01200320014180086a41086a220429000037030020012001290080083703b00120014180086a41a4b2c200410a10fb01200b41086a2004290000370000200b20012900800837000020054105744104722203417f4c0d01200310242204450d02200e41ff0171410247211220014100360288082001200336028408200120043602800820014180086a200510a1010240024020050d00200128028008210720012802880821040c010b20054105742105200128028808210420172103034020014180086a20044120106d200128028008220720012802880822086a22042003290000370000200441086a200341086a290000370000200441106a200341106a290000370000200441186a200341186a2900003700002001200841206a220436028808200341206a2103200541606a22050d000b0b200e2012712118200141b0016a41202007200410b3010240200128028408450d00200710260b02402018450d00200141c8016a4200370300200141c0016a4200370300200141b0016a41086a22034200370300200142003703b00120014180086a41b48cc700410710fb01200320014180086a41086a220429000037030020012001290080083703b00120014180086a4198c2c200411210fb01200b41086a2004290000370000200b20012900800837000020014180086a200141b0016a108c022001280280082203450d00200141b0016a412010ff0120012902840842ffffffff0383500d00200310260b200141b0016a41186a4200370300200141b0016a41106a4200370300200141b0016a41086a22034200370300200142003703b00120014180086a41b48cc700410710fb01200320014180086a41086a221029000037030020012001290080083703b00120014180086a4184c1c200410c10fb01200b41086a2010290000370000200b2001290080083700002001200c41016a4101200d1b221936028008200141b0016a412020014180086a410410b30120014180086a10ad03200128028408211a200128028008211b200128028808210341002111200141003602b801200142013703b001200141b0016a4100200310f40120012802b801210c02402003450d00201620096a211c20012802b001200c41c0016c6a2108200c2003410574220741606a4105766a211d20014190066a41206a2114200141d0046a410172210d20014180086a41206a211320014190066a4180016a211e20014190066a41e0006a211f20014190066a41c0006a21204100211120162105201b2103034020052104200141e0076a41186a2209200341186a290000370300200141e0076a41106a2212200341106a290000370300200141e0076a41086a220f200341086a290000370300200120032900003703e007200141b8076a200141e0076a10b103200141d0046a20012802b807220c20012802c00710b20320012d00d004210e20014190036a200d41a00110cf061a410021050240200e4101470d00200141d0016a20014190036a41a00110cf061a410121050b024020012802bc07450d00200c10260b0240024020050d0020014190066a41186a420037030020014190066a41106a420037030020014190066a41086a420037030020014200370390062014410041800110d1061a0c010b20014190066a200141d0016a41a00110cf061a0b02400240201141ff0171450d00200421050c010b4100211102402004201c470d00200421050c010b200441c0016a21050240024020014190066a200441206a220e460d00200e20014190066a412010d2060d010b02402014200441c0006a220e460d00200e2014412010d2060d010b02402020200441e0006a220e460d00200e2020412010d2060d010b0240201f20044180016a220e460d00200e201f412010d2060d010b201e200441a0016a2204460d012004201e412010d206450d010b410121110b200341206a210320014180086a41186a200929030037030020014180086a41106a20122903003703002010200f290300370300200120012903e00737038008201320014190066a41a00110cf061a200820014180086a41c00110cf0641c0016a2108200741606a22070d000b201d41016a210c0b2001200c3602b8010240201a41ffffff3f71450d00201b10260b200cad42c0017e2202422088a70d012002a72203417f4c0d0120012802b401210d20012802b00121100240024020030d00410121040c010b200310242204450d030b200141003602d804200120043602d0042001200341c0016e3602d404200141d0046a4100200c10f40120012802d804211202400240200c41c0016c22030d0020012802d00421130c010b201020036a210e20012802d0042213201241c0016c6a210f20014180086a41a0016a210420014180086a4180016a210520014180086a41e0006a210820014180086a41c0006a210720014180086a41206a210920102103034020014180086a41186a200341186a29000037030020014180086a41106a200341106a29000037030020014180086a41086a200341086a2900003703002001200329000037038008200941186a200341386a290000370000200941106a200341306a290000370000200941086a200341286a2900003700002009200341206a2900003700002007200341c0006a290000370000200741086a200341c8006a290000370000200741106a200341d0006a290000370000200741186a200341d8006a2900003700002008200341e0006a290000370000200841086a200341e8006a290000370000200841106a200341f0006a290000370000200841186a200341f8006a290000370000200520034180016a290000370000200541086a20034188016a290000370000200541106a20034190016a290000370000200541186a20034198016a2900003700002004200341a0016a290000370000200441086a200341a8016a290000370000200441186a200341b8016a290000370000200441106a200341b0016a290000370000201241016a2112200f20014180086a41c00110cf0641c0016a210f200341c0016a2203200e470d000b0b200120123602d804200141c8016a4200370300200141c0016a4200370300200141b0016a41086a22034200370300200142003703b00120014180086a41b48cc700410710fb01200320014180086a41086a220429000037030020012001290080083703b00120014180086a419ab2c200410a10fb01200b41086a2004290000370000200b200129008008370000201241c0016c4104722203417f4c0d01200310242204450d0220014100360288082001200336028408200120043602800820014180086a201210a1010240024020120d00200128028008210820012802880821040c010b2013201241c0016c6a2107200128028808210420132103034020014180086a20044120106d20012802800820012802880822056a22042003290000370000200441086a200341086a290000370000200441106a200341106a290000370000200441186a200341186a2900003700002001200541206a22043602880820014180086a20044120106d20012802800820012802880822056a2204200341206a290000370000200441086a200341286a290000370000200441106a200341306a290000370000200441186a200341386a2900003700002001200541206a22043602880820014180086a20044120106d20012802800820012802880822056a2204200341c0006a290000370000200441086a200341c8006a290000370000200441106a200341d0006a290000370000200441186a200341d8006a2900003700002001200541206a22043602880820014180086a20044120106d20012802800820012802880822056a2204200341e0006a290000370000200441086a200341e8006a290000370000200441106a200341f0006a290000370000200441186a200341f8006a2900003700002001200541206a22043602880820014180086a20044120106d20012802800820012802880822056a220420034180016a290000370000200441086a20034188016a290000370000200441106a20034190016a290000370000200441186a20034198016a2900003700002001200541206a22043602880820014180086a20044120106d200128028008220820012802880822056a2204200341a0016a290000370000200441086a200341a8016a290000370000200441106a200341b0016a290000370000200441186a200341b8016a2900003700002001200541206a220436028808200341c0016a22032007470d000b0b200141b0016a41202008200410b3010240200128028408450d00200810260b024020012802d4042203450d00200341c0016c450d00201310260b200141c8016a4200370300200141c0016a4200370300200141b0016a41086a22034200370300200142003703b00120014180086a41b48cc700410710fb01200320014180086a41086a220429000037030020012001290080083703b00120014180086a41a8c1c200410d10fb01200b41086a2004290000370000200b200129008008370000200120113a00df07200141b0016a4120200141df076a410110b3012001201936028408200141043a00800820014180086a1087022018201620152010200c10b3030240200d450d00200d41c0016c450d00201010260b024020012802940141ffffff3f71450d00201710260b42c0d6d9cc9a3a21022006a72203450d00200341c0016c450d00201610260b200141c8016a22034200370300200141b0016a41106a22044200370300200141b0016a41086a22054200370300200142003703b00120014180086a41ac8cc700410810fb01200520014180086a41086a220829000037030020012001290080083703b00120014180086a41a1cbc100411010fb01200320082900003703002004200129008008370300200141203602c4092001200141b0016a3602c009200141c8096a200141b0016a41201082020240024020012802c80922090d00410021080c010b20012802cc0921122001200141c8096a41086a2802003602dc09200120093602d809200141106a200141d8096a108f010240024020012802100d002001280214220c20012802dc09411c6e22032003200c4b1bad421c7e2206422088a70d032006a72203417f4c0d030240024020030d00410421080c010b200310242208450d050b2003411c6ead21060240024002400240200c450d00410021100340200141086a200141d8096a108f0120012802080d04200128020c220f20012802dc09412c6e22032003200f4b1bad422c7e220a422088a70d08200aa72203417f4c0d080240024020030d00410421110c010b200310242211450d0a0b200141003602e809200120113602e00920012003412c6e3602e409024002400240024002400240024002400240200f450d00410021074100210e0340200141003a00a00820012802dc09417f6a2103200e41016a210e410021040340200141003a00df072003417f460d0320014180086a20046a20012802d80922052d00003a00002001200541016a3602d8092001200441016a22053a00a008200120033602dc092003417f6a21032005210420054120470d000b200141d0046a41186a220320014180086a41186a290300370300200141d0046a41106a220420014180086a41106a290300370300200141d0046a41086a221320014180086a41086a29030037030020012001290380083703d004200541ff01714120490d03200141f0006a41086a2013290300220a370300200141b8076a41186a22052003290300370300200141b8076a41106a22032004290300370300200141b8076a41086a2204200a370300200120012903d004220a3703702001200a3703b80720014180086a200141d8096a1092012001280280082213450d0320014190066a41086a2004290300220a37030020014190066a41106a2003290300222137030020014190066a41186a20052903002222370300200141e0076a41086a2204200a370300200141e0076a41106a22052021370300200141e0076a41186a22142022370300200120012903b807220a370390062001200a3703e007200129028408210a0240200720012802e409470d00200141e0096a200710ee0120012802e009211120012802e80921070b20112007412c6c6a2203200a370204200320133602002003410c6a20012903e007370200200341146a20042903003702002003411c6a2005290300370200200341246a20142903003702002001200741016a22073602e809200e200f470d000b0b2011450d0c20012902e409210a2001200141d8096a108f0120012802000d042001280204220520012802dc094102762203200320054b1b22034102742204417f4c0d1020030d024104210e0c030b200441ff0171450d00200141003a00a0080b20014190066a41186a200141d0016a41186a2903003703002007450d092007412c6c2104201121030c080b20041024220e450d0e0b200141003602880820012003360284082001200e36028008024002402005450d0041002103034020012802dc0922074104490d0220012802d809220f280000210420012007417c6a3602dc092001200f41046a3602d8092004418094ebdc034b0d0202402003200128028408470d0020014180086a2003410110e701200128028008210e20012802880821030b200e20034102746a20043602002001200341016a2203360288082005417f6a22050d000b0b200e450d01200129028408212120012802dc0922034104490d0220012802d8092204280000210520012003417c6a3602dc092001200441046a3602d8092006422088a722032006a7470d040240200341016a22042003490d0020034101742207200420042007491b22044104200441044b1bad421c7e2222422088a722070d002022a7220441004e0d040b102e000b20012802840841ffffffff0371450d00200e10260b0240200a422088a72203450d002003412c6c21042011210303400240200341046a28020041ffffff3f71450d00200328020010260b2003412c6a2103200441546a22040d000b0b200aa72203450d072003412c6c450d07201110260c070b0240202142ffffffff0383500d00200e10260b0240200a422088a72203450d002003412c6c21042011210303400240200341046a28020041ffffff3f71450d00200328020010260b2003412c6a2103200441546a22040d000b0b200aa72203450d062003412c6c450d06201110260c060b2003411c6c200d20031b210d02400240024002402008410020031b22080d0020040d014100410420074100471b21080c030b200d2004460d020240200d0d0020040d01410421080c030b2008200d200410282208450d010c020b2004102422080d010b102c000b2006428080808070832004411c6ead8421060b20082006422088a7411c6c6a220320053602182003200a37020420032011360200200341106a20213702002003410c6a200e36020020064280808080107c2106201041016a2210200c470d000b0b20080d040c030b03400240200341046a28020041ffffff3f71450d00200328020010260b2003412c6a2103200441546a22040d000b0b20012802e4092203450d002003412c6c450d00201110260b02402006422088a72203450d0020082003411c6c6a2107200821050340024020052802082204450d00200528020021032004412c6c210403400240200341046a28020041ffffff3f71450d00200328020010260b2003412c6a2103200441546a22040d000b0b0240200541046a2802002203450d002003412c6c450d00200528020010260b2005411c6a21030240200541106a28020041ffffffff0371450d00200528020c10260b2003210520032007470d000b0b2006a721032003450d002003411c6c450d00200810260b41002108200141003602d804200142013703d0042001410e360294032001200141c0096a360290032001200141d0046a3602d00120014194086a410136020020014201370284082001418c8dc60036028008200120014190036a36029008200141d0016a41c4e1c00020014180086a10351a20012802d00420012802d80410840220012802d404450d0020012802d00410260b2012450d00200910260b2008410420081b210702402006420020081b2206422088a72208450d00200841646c21044100210303402004411c6a21042008200341016a2203470d000b2003417f6a20084f0d00200642ffffffff0f83200820036bad422086842106200720046b210520072008411c6c6a21080340024020052802082204450d00200528020021032004412c6c210403400240200341046a28020041ffffff3f71450d00200328020010260b2003412c6a2103200441546a22040d000b0b0240200541046a2802002203450d002003412c6c450d00200528020010260b2005411c6a21030240200541106a28020041ffffffff0371450d00200528020c10260b2003210520032008470d000b0b20014198086a2203420037030020014180086a41106a2204420037030020014180086a41086a220542003703002001420037038008200141d0046a41ac8cc700410810fb012005200141d0046a41086a2208290000370300200120012900d00437038008200141d0046a41a1cbc100411010fb0120032008290000370300200420012900d004370300200141d0046a20072006422088a7220310b40120014180086a412020012802d004220420012802d80410b301024020012802d404450d00200410260b02402003450d0020072003411c6c6a2108200721050340024020052802082204450d00200528020021032004412c6c210403400240200341046a28020041ffffff3f71450d00200328020010260b2003412c6a2103200441546a22040d000b0b0240200541046a2802002203450d002003412c6c450d00200528020010260b2005411c6a21030240200541106a28020041ffffffff0371450d00200528020c10260b2003210520032008470d000b0b02402006a72203450d002003411c6c450d00200710260b20014190036a10b40341002104200128029003210741002105024002400240024002402001280298032209450d00200941c4006c21082009410274417c6a41027641016a2112410021052007210302400340024020032d00004101460d00200341046a28020020004f0d020b200341c4006a2103200541016a2105200841bc7f6a22080d000b201221050b20092005490d010b2001410036029803200920056b210f2007200541c4006c22096a21030240034020092004460d01200720046a2108200441c4006a2212210420082d00004102470d000b200720126a21030b2007200541c4006c6a21080240034020082003460d0120032d00002104200341c4006a210320044102470d000b0b02400240200f0d004100210f0c010b02402005450d0020072007200541c4006c6a200f41c4006c10d0061a0b2001200f360298030b2001280294032103200141e8046a22054200370300200141e0046a22044200370300200141d0046a41086a22084200370300200142003703d00420014180086a41a28cc700410a10fb01200820014180086a41086a220929000037030020012001290080083703d00420014180086a41e0b8c500410610fb0120052009290000370300200420012900800837030020014180086a2007200f10b503200141d0046a4120200128028008220520012802880810b3010240200128028408450d00200510260b02402003450d00200341c4006c450d00200710260b200141d0046a41186a22084200370300200141d0046a41106a22074200370300200141d0046a41086a22054200370300200142003703d00420014180086a41a28cc700410a10fb01200520014180086a41086a220329000037030020012001290080083703d00420014180086a41b0cbc500410c10fb01200441086a20032900003700002004200129008008370000200141003a00df07200141d0046a4120200141df076a410110b301200141d0046a10b60320014180086a41186a200829030037030020014180086a41106a200729030037030020032005290300370300200120012903d0043703800820014180086a10b70310aa03200141f0006a41186a22044200370300200141f0006a41106a22094200370300200141f0006a41086a221242003703002001420037037020014180086a41808cc700410610fb0120122003290000370300200120012900800837037020014180086a41f693c400410a10fb0120042003290000370300200920012900800837030020014180086a200141f0006a412010b80320012d008008210320014190016a41186a220420014199086a29000037030020014190016a41106a220920014191086a29000037030020014190016a41086a221220014189086a2900003703002001200129008108370390010240024020034101460d00200842003703002007420037030020054200370300200142003703d0040c010b20082004290300370300200720092903003703002005201229030037030020012001290390013703d0040b20014190016a41186a2203420037030020014190016a41106a2204420037030020014190016a41086a22054200370300200142003703900120014180086a41b4a3c700411810fb01200520014180086a41086a220829000037030020012001290080083703900120014180086a41a1b7c000410e10fb0120032008290000370300200420012900800837030020014190036a20014190016a412010a50202400240024020012802900322040d004100210520014100360298062001420137039006200141b0016a41186a200141d0046a41186a290300370300200141b0016a41106a200141d0046a41106a290300370300200141b0016a41086a200141d0046a41086a290300370300200120012903d0043703b0010c010b200120012902940322063702940620012004360290062006a7210702402006422088a7220541d100490d00200141b8076a41186a2208200141d0046a41186a290300370300200141b8076a41106a2209200141d0046a41106a290300370300200141b8076a41086a2212200141d0046a41086a290300370300200120012903d0043703b80720052000417f6a41d1007022034d0d04200420034105746a220320012903b807370000200341186a2008290300370000200341106a2009290300370000200341086a2012290300370000200842003703002009420037030020124200370300200142003703b807200141b8076a21030c050b200141b0016a41186a200141d0046a41186a290300370300200141b0016a41106a200141d0046a41106a290300370300200141b0016a41086a200141d0046a41086a290300370300200120012903d0043703b00120052007470d010b20014190066a200541011093012001280294062107200128029006210420012802980621050b200420054105746a220320012903b001370000200341186a200141b0016a41186a290300370000200341106a200141b0016a41106a290300370000200341086a200141b0016a41086a2903003700002001200541016a220536029806200141b8076a41186a22084200370300200141b8076a41106a4200370300200141b8076a41086a22094200370300200142003703b807200141b8076a210320040d02200141d0016a41b4a3c700411810fb012009200141d0016a41086a290000370300200120012900d0013703b80720014190036a41a1b7c000410e10fb01200820014190036a41086a29000037030020012001290090033703c807200141b8076a412010ff010c030b200520091040000b2003200541dce1c0001032000b200141d0016a41b4a3c700411810fb01200341086a200141d0016a41086a290000370000200320012900d00137000020014190036a41a1b7c000410e10fb01200141b8076a41186a20014190036a41086a29000037030020012001290090033703c80720054105744104722208417f4c0d01200810242209450d024100210320014100360288082001200836028408200120093602800820014180086a200510a10102402005450d00200541057421050340200120014180086a36029003200420036a20014190036a109c012005200341206a2203470d000b0b200141b8076a412020012802800820012802880810b3010240200128028408450d0020012802800810260b200741ffffff3f71450d00200410260b200141f0096a240020020f0b1034000b1033000bb13508077f017e017f017e017f017e017f0c7e230041b00f6b22002400200041e00d6a41186a22014200370300200041e00d6a41106a22024200370300200041e00d6a41086a22034200370300200042003703e00d200041a0026a41868cc700410410fb012003200041a0026a41086a2204290000370300200020002900a0023703e00d200041a0026a41e0fcc600410b10fb0120012004290000370300200220002900a002370300200041b0086a200041e00d6a1090020240024020002d00b0084102470d00200041b00b6a41186a22014200370300200041b00b6a41106a22034200370300200041b00b6a41086a22044200370300200042003703b00b200041b0086a41808cc700410610fb012004200041b0086a41086a2205290000370300200020002900b0083703b00b200041b0086a41f093c400410610fb0120012005290000370300200320002900b008370300200041b0086a200041b00b6a10c90420002802b0082201410420011b21060240024020002902b408420020011b2207422088a7220841246c2201450d00200620016a21032006210102400340024020012d00004101470d00200141016a2800002104200141086a28020021052000200141106a2802003602e40d200020053602e00d200441c28289aa04470d00200041b0086a200041e00d6a109d0420002903b00822094203520d020b2003200141246a2201460d020c000b0b200041386a200041cc086a290200370300200041306a41106a200041d4086a290200370300200041c8006a200041dc086a290200370300200020002902c408370330200041b0086a41106a280200210a20002903b808210b0c010b420321090b02402008450d00200841246c21032006210103400240024020012d0000220441044b0d0002400240024020040e050400010204040b2001410c6a280200450d03200141086a28020010260c030b2001410c6a280200450d02200141086a28020010260c020b2001410c6a280200450d01200141086a28020010260c010b200141086a280200450d00200141046a28020010260b200141246a21012003415c6a22030d000b0b02402007a72201450d00200141246c450d00200610260b200041d0006a41186a2201200041306a41186a290300370300200041d0006a41106a2204200041306a41106a290300370300200041d0006a41086a2205200041306a41086a2903003703002000200029033037035041002103024020094203510d00200041f0006a41186a2001290300370300200041f0006a41106a2004290300370300200041f0006a41086a200529030037030020002000290350370370200041b00b6a41186a22034200370300200041b00b6a41106a22014200370300200041b00b6a41086a22044200370300200042003703b00b200041a0026a41868cc700410410fb012004200041a0026a41086a2205290000370300200020002900a0023703b00b200041a0026a41a89ec600410b10fb0120032005290000370300200120002900a002370300200041206a200041b00b6a10ab03024002402000280220450d0020002903284200520d010b200041b00b6a41186a22054200370300200041b00b6a41106a22064200370300200041b00b6a41086a22034200370300200042003703b00b200041a0026a41868cc700410410fb012003200041a0026a41086a2204290000370300200020002900a0023703b00b200041a0026a41a89ec600410b10fb01200141086a22082004290000370000200120002900a0023700002000200b3703b008200041b00b6a4120200041b0086a410810b301200041e00d6a10c205200542003703002006420037030020034200370300200042003703b00b200041a0026a41868cc700410410fb0120032004290000370300200020002900a0023703b00b200041a0026a41f89ec600410a10fb0120082004290000370000200120002900a002370000200041b0086a200041b00b6a10a00520002d00b00821042005200041c9086a2900003703002006200041c1086a2900003703002003200041b9086a290000370300200020002900b1083703b00b0240024020044101460d00200041e0066a41186a4200370300200041e0066a41106a4200370300200041e0066a41086a4200370300200042003703e0060c010b200041e0066a41186a2005290300370300200041e0066a41106a2006290300370300200041e0066a41086a2003290300370300200020002903b00b3703e0060b200041e00d6a41246a200041e0066a41186a290300370200200041e00d6a411c6a200041e0066a41106a290300370200200041e00d6a41146a200041e0066a41086a2203290300370200200020002903e0063702ec0d200041dc086a200041e00d6a41286a280200360200200041b0086a41246a200041800e6a290300370200200041b0086a411c6a200041e00d6a41186a290300370200200041b0086a41146a200041e00d6a41106a290300370200200041b0086a410c6a200041e00d6a41086a290300370200200020002903e00d3702b408200041003602b008200041e0066a200041b0086a10f902200041bb0b6a2003280200360000200020002903e0063700b30b200041e0066a410c6a200041b70b6a290000370000200041c28289aa043600e106200041023a00e006200020002900b00b3700e506200041e0066a108602200041b0086a41086a2802002203450d00200341286c450d0020002802b40810260b200041b00b6a41186a22054200370300200041b00b6a41106a22064200370300200041b00b6a41086a22034200370300200042003703b00b200041a0026a41868cc700410410fb012003200041a0026a41086a2204290000370300200020002900a0023703b00b200041a0026a41d49ec600410b10fb01200141086a22082004290000370000200120002900a002370000200041106a200041b00b6a10ab032000280210210c20002903182107200542003703002006420037030020034200370300200042003703b00b200041a0026a41868cc700410410fb0120032004290000370300200020002900a0023703b00b200041a0026a41838dc600410810fb0120082004290000370000200120002900a00237000020004200200b200742017c4201200c1b7d22072007200b561b3e02b008200041b00b6a4120200041b0086a410410b301200542003703002006420037030020034200370300200042003703b00b200041a0026a41868cc700410410fb0120032004290000370300200020002900a0023703b00b200041a0026a41d49ec600410b10fb0120082004290000370000200120002900a0023700002000200b3703b008200041b00b6a4120200041b0086a410810b3014100210320094200520d0020004190016a41186a200041f0006a41186a29030037030020004190016a41106a200041f0006a41106a29030037030020004190016a41086a200041f0006a41086a290300370300200020002903703703900120004190056a10c20502400240200028029805200a4d0d00200041b00b6a41186a2205200028029005200a41286c6a220341186a290000370300200041b00b6a41106a2206200341106a290000370300200041b00b6a41086a2204200341086a290000370300200020032900003703b00b200041b0086a200041b00b6a10c30520002802b0082103200041e00d6a200041b0086a41047241c40110cf061a20034101460d00200041d0036a200041e0066a41046a200041e00d6a41046a41c00110cf0641c00110cf061a200041a0056a200041d0036a41c00110cf061a200542003703002006420037030020044200370300200042003703b00b200041a0026a41868cc700410410fb012004200041a0026a41086a2203290000370300200020002900a0023703b00b200041a0026a41f89ec600410a10fb01200141086a2003290000370000200120002900a002370000200041b0086a200041b00b6a10a00520002d00b00821032005200041c9086a2900003703002006200041c1086a2900003703002004200041b9086a290000370300200020002900b1083703b00b0240024020034101460d00200041f80d6a4200370300200041f00d6a4200370300200041e80d6a4200370300200042003703e00d0c010b200041e00d6a41186a200041b00b6a41186a290300370300200041e00d6a41106a200041b00b6a41106a290300370300200041e00d6a41086a200041b00b6a41086a290300370300200020002903b00b3703e00d0b200041b00b6a41186a4200370300200041b00b6a41106a4200370300200041b00b6a41086a22044200370300200042003703b00b200041a0026a41868cc700410410fb012004200041a0026a41086a2203290000370300200020002900a0023703b00b200041a0026a41b49dc600410a10fb01200141086a2003290000370000200120002900a0023700002000200041b00b6a10ab032000290308210920002802002101200041e0066a4194acc7004104108001200041e0066a4198acc700410b200b108201200041e0066a41a3acc700410d2009420020011b108201200041e0066a41b0acc7004110200041e00d6a4120108101200041b0086a200041e0066a41d00110cf061a200041b0086a41bcf3c4004109200041c0066a4120108101200041e00d6a200041b0086a41d00110cf061a200041b00b6a200041e00d6a10c405200041a0026a41186a220420004190016a41186a290300370300200041a0026a41106a220520004190016a41106a290300370300200320004190016a41086a29030037030020002000290390013703a002200041b0086a200041a0026a10c305200041b0086a41086a2903002109200041b0086a41106a2903002107200041b0086a41186a290300210d200041b0086a41206a290300210e200041d8086a290300210f200041e0086a290300210b200041e8086a2903002110200041f0086a2903002111200041f8086a290300211220004180096a290300211320002802b0082101200041e00d6a20004188096a41f00010cf061a20014101460d00200041f00c6a200041e00d6a41f00010cf061a20002009423388221420077c22154233882015201454ad420d86842216200d7c221442ffffffffffffff03833703c001200020144233882014201654ad420d86842216200e7c221442ffffffffffffff03833703c801200020144233882014201654ad420d86842216200f7c221442ffffffffffffff03833703d001200020144233882014201654ad420d868442137e200942ffffffffffffff03837c221442ffffffffffffff03833703b00120002014423388201542ffffffffffffff03837c3703b801200041a0026a41206a4200370300200442003703002005420037030020034200370300200042003703a002200041e00d6a41206a4200370300200041e00d6a41186a4200370300200041e00d6a41106a4200370300200041e00d6a41086a4200370300200042003703e00d2000200b423388221420107c22154233882015201454ad420d8684221620117c22144233882014201654ad420d8684221720127c22164233882016201754ad420d8684221820137c221742ffffffffffffff03833703d0082000201642ffffffffffffff03833703c8082000201442ffffffffffffff03833703c008200020174233882017201854ad420d868442137e200b42ffffffffffffff03837c2214423388201542ffffffffffffff03837c3703b8082000201442ffffffffffffff03833703b008200041b0016a200041a0026a1065200041e00d6a200041b0086a106572106641ff01714101460d0020002903b00b211520002903b80b211420002802c00b2101200041a0026a200041b00b6a41146a41ac0110cf061a200041b0016a200041f00c6a41f00010cf061a200020013602c008200020143703b808200020153703b008200041b0086a41146a200041a0026a41ac0110cf061a200041b80a6a2013370300200041b00a6a2012370300200041a80a6a2011370300200041a00a6a2010370300200041980a6a200b370300200041900a6a200f370300200041880a6a200e370300200041800a6a200d370300200041f8096a2007370300200020093703f009200041c00a6a200041b0016a41f00010cf061a200041e00d6a41beeec6004109108001200041e00d6a41d4c0c70041004181acc7004113108101200041e00d6a41c7eec6004106200041d0096a4120108101200041e00d6a41cdeec6004107200041900b6a4120108101200041b00b6a41186a22014200370300200041b00b6a41106a22034200370300200041b00b6a41086a22044200370300200042003703b00b200041e00d6a41d4c0c7004100200041b00b6a4120108301200041003a00e00d200041003a00e10d200041003a00e20d200041003a00e30d200041003a00e40d200041003a00e50d200041003a00e60d200041003a00e70d200041003a00e80d200041003a00e90d200041003a00ea0d200041003a00eb0d200041003a00ec0d200041003a00ed0d200041003a00ee0d200041003a00ef0d200041003a00f00d200041003a00f10d200041003a00f20d200041003a00f30d200041003a00f40d200041003a00f50d200041003a00f60d200041003a00f70d200041003a00f80d200041003a00f90d200041003a00fa0d200041003a00fb0d200041003a00fc0d200041003a00fd0d200041003a00fe0d200041003a00ff0d200041003a00800e200041003a00810e200041003a00820e200041003a00830e200041003a00840e200041003a00850e200041003a00860e200041003a00870e200041003a00880e200041003a00890e200041003a008a0e200041003a008b0e200041003a008c0e200041003a008d0e200041003a008e0e200041003a008f0e200041003a00900e200041003a00910e200041003a00920e200041003a00930e200041003a00940e200041003a00950e200041003a00960e200041003a00970e200041003a00980e200041003a00990e200041003a009a0e200041003a009b0e200041003a009c0e200041003a009d0e200041003a009e0e200041003a009f0e200041003a00a00e200041003a00a10e200041003a00a20e200041003a00a30e200041003a00a40e200041003a00a50e200041003a00a60e200041003a00a70e200041003a00a80e200041003a00a90e200041003a00aa0e200041003a00ab0e200041003a00ac0e200041003a00ad0e200041003a00ae0e200041003a00af0e200041003a00b00e200041003a00b10e200041003a00b20e200041003a00b30e200041003a00b40e200041003a00b50e200041003a00b60e200041003a00b70e200041003a00b80e200041003a00b90e200041003a00ba0e200041003a00bb0e200041003a00bc0e200041003a00bd0e200041003a00be0e200041003a00bf0e200041003a00c00e200041003a00c10e200041003a00c20e200041003a00c30e200041003a00c40e200041003a00c50e200041003a00c60e200041003a00c70e200041003a00c80e200041003a00c90e200041003a00ca0e200041003a00cb0e200041003a00cc0e200041003a00cd0e200041003a00ce0e200041003a00cf0e200041003a00d00e200041003a00d10e200041003a00d20e200041003a00d30e200041003a00d40e200041003a00d50e200041003a00d60e200041003a00d70e200041003a00d80e200041003a00d90e200041003a00da0e200041003a00db0e200041003a00dc0e200041003a00dd0e200041003a00de0e200041003a00df0e200041003a00e00e200041003a00e10e200041003a00e20e200041003a00e30e200041003a00e40e200041003a00e50e200041003a00e60e200041003a00e70e200041003a00e80e200041003a00e90e200041003a00ea0e200041003a00eb0e200041003a00ec0e200041003a00ed0e200041003a00ee0e200041003a00ef0e200041003a00f00e200041003a00f10e200041003a00f20e200041003a00f30e200041003a00f40e200041003a00f50e200041003a00f60e200041003a00f70e200041003a00f80e200041003a00f90e200041003a00fa0e200041003a00fb0e200041003a00fc0e200041003a00fd0e200041003a00fe0e200041003a00ff0e200041003a00800f200041003a00810f200041003a00820f200041003a00830f200041003a00840f200041003a00850f200041003a00860f200041003a00870f200041003a00880f200041003a00890f200041003a008a0f200041003a008b0f200041003a008c0f200041003a008d0f200041003a008e0f200041003a008f0f200041003a00900f200041003a00910f200041003a00920f200041003a00930f200041003a00940f200041003a00950f200041003a00960f200041003a00970f200041003a00980f200041003a00990f200041003a009a0f200041003a009b0f200041003a009c0f200041003a009d0f200041003a009e0f200041003a009f0f200041003a00a00f200041003a00a10f200041003a00a20f200041003a00a30f200041003a00a40f200041003a00a50f200041003a00a60f200041003a00a70f200041e0066a41186a2001290300370300200041e0066a41106a2003290300370300200041e0066a41086a2004290300370300200020002903b00b3703e006410121030c010b410021030b2000280294052201450d00200141286c450d0020002802900510260b200041b0086a41186a200041e0066a41186a290300370300200041b0086a41106a200041e0066a41106a290300370300200041b0086a41086a200041e0066a41086a290300370300200020002903e0063703b008200041e00d6a41186a4200370300200041e00d6a41106a4200370300200041e00d6a41086a22014200370300200042003703e00d200041a0026a41868cc700410410fb012001200041a0026a41086a2204290000370300200020002900a0023703e00d200041a0026a41e0fcc600410b10fb01200241086a2004290000370000200220002900a0023700004121410120031b220110242204450d01200041003602b80b200020013602b40b200020043602b00b200041b00b6a41004101106d20002802b00b220120002802b80b22046a21050240024020030d00200541003a0000200441016a21030c010b200541013a00002000200441016a22013602b80b200041b00b6a20014120106d20002802b00b220120002802b80b22046a220320002903b008370000200341086a200041b0086a41086a290300370000200341106a200041b0086a41106a290300370000200341186a200041b0086a41186a290300370000200441206a21030b200020033602b80b200041e00d6a41202001200310b30120002802b40b450d00200110260b200041b00f6a24000f0b1033000b8d0204017f017e017f017e230041d0006b220224002002412036020420022001360200200241086a2001412010820202400240200228020822010d00420021030c010b200228020c210402400240200241086a41086a2802004108490d0020012900002105420121030c010b20024100360220200242013703182002410e36022c200220023602282002200241186a360234200241cc006a41013602002002420137023c2002418c8dc6003602382002200241286a360248200241346a41c4e1c000200241386a10351a200228021820022802201084020240200228021c450d00200228021810260b420021030b2004450d00200110260b2000200537030820002003370300200241d0006a24000bbd08020b7f037e230041a0026b22012400200141206a22024200370300200141186a22034200370300200141086a41086a420037030020014200370308200141086a41d18cc700410810fb01200141b8016a41bcd2c500410410fb012002200141b8016a41086a290000370300200320012900b8013703002001412036022c2001200141086a360228200141306a200141086a412010820202400240200128023022040d00410021050c010b200128023421062001200141306a41086a280200360244200120043602402001200141c0006a108f010240024020012802000d0002400240024002402001280204220720012802444105762202200220074b1b22024105742203417f4c0d000240024020020d00410121050c010b200310242205450d020b41002108200141003602502001200236024c200120053602480240024002402007450d0041002109034041002103200141003a00d8012001280244417f6a2102200941016a210903402002417f460d03200141b8016a20036a2001280240220a2d00003a00002001200a41016a3602402001200341016a220a3a00d801200120023602442002417f6a2102200a2103200a4120470d000b20014180026a41186a2202200141b8016a41186a29030037030020014180026a41106a2203200141b8016a41106a29030037030020014180026a41086a220b200141b8016a41086a290300370300200120012903b80137038002200a41ff01714120490d03200141f8006a41086a200b290300220c370300200141f8006a41106a2003290300220d370300200141f8006a41186a2002290300220e370300200141d8006a41186a2203200e370300200141d8006a41106a220a200d370300200141d8006a41086a220b200c3703002001200129038002220c370398012001200c3703782001200c37035802402008200128024c470d00200141c8006a2008410110930120012802482105200128025021080b200520084105746a22022001290358370000200241186a2003290300370000200241106a200a290300370000200241086a200b2903003700002001200841016a220836025020092007470d000b0b200129024c210c2005450d060c070b200341ff0171450d00200141003a00d8010b200141f8006a41186a20014198016a41186a290300370300200128024c41ffffff3f710d020c030b1034000b1033000b200510260b0b41002105200141003602880220014201370380022001410e3602e4012001200141286a3602e001200120014180026a36029801200141cc016a4101360200200142013702bc012001418c8dc6003602b8012001200141e0016a3602c80120014198016a41c4e1c000200141b8016a10351a200128028002200128028802108402200128028402450d0020012802800210260b2006450d00200410260b0240024020050d0020004100360208200042013702000c010b2000200c370204200020053602000b200141a0026a24000bb10302047f017e23004180016b22012400200141206a22024200370300200141186a22034200370300200141086a41086a420037030020014200370308200141086a41b48cc700410710fb01200141e8006a41a4b2c200410a10fb012002200141e8006a41086a290000370300200320012900683703002001412036022c2001200141086a360228200141306a200141086a412010820202400240200128023022030d00410021020c010b200128023421042001200141306a41086a28020036024420012003360240200141e8006a200141c0006a10920102400240200128026822020d004100210220014100360250200142013703482001410e36025c2001200141286a3602582001200141c8006a360264200141fc006a41013602002001420137026c2001418c8dc6003602682001200141d8006a360278200141e4006a41c4e1c000200141e8006a10351a200128024820012802501084020240200128024c450d00200128024810260b0c010b200129026c21050b2004450d00200310260b0240024020020d0020004100360208200042013702000c010b20002005370204200020023602000b20014180016a24000bcf0701047f23004190016b22022400200241e0006a22034200370300200241d8006a22044200370300200241c8006a41086a420037030020024200370348200241c8006a41b48cc700410710fb01200241e8006a4184c1c200410c10fb012003200241e8006a41086a29000037030020042002290068370300200241106a200241c8006a4120108902200241c8006a2002280214410020022802101b22042000108e05200241086a20022802482200200228025041d4c0c70041004100108102200228020821030240200228024c450d00200010260b4101210002400240024020034101460d00200241186a41d18cc700410810fb01200241e8006a41c0d2c500410e10fb0120022004360238200241f8006a200241386a410410a202200241d4006a2204200241386a41046a3602002002200241f8006a41086a36024c2002200241386a3602502002200241f8006a360248200241286a200241c8006a1073412010242200450d012002422037027c20022000360278200241f8006a41004120106d2002280278220020022802800122056a22032001290000370000200341086a200141086a290000370000200341106a200141106a290000370000200341186a200141186a2900003700002002200541206a22013602800120024188016a2000200110a2022004200020016a36020020022000360250200220024188016a41086a36024c200220024188016a360248200241386a200241c8006a10730240200228027c450d00200010260b20022802302201200228024022006a41206a2203417f4c0d020240024020030d0041012104410021030c010b200310242204450d020b20024100360250200220043602482002200336024c200241c8006a4100411010c9012002280248200228025022036a22042002290018370000200441086a200241186a41086a2900003700002002200341106a2203360250200241c8006a2003411010c9012002280248200228025022036a22042002290068370000200441086a200241e8006a41086a2900003700002002200341106a220436025020022802282103200241c8006a2004200110c9012002280248200228025022046a2003200110cf061a2002200420016a220436025020022802382101200241c8006a2004200010c90120022802482204200228025022056a2001200010cf061a2002200520006a22003602500240200228023c450d00200110260b0240200228022c450d00200310260b20022004200010890220022802042101200228020021000240200228024c450d00200410260b200141004720004100477121000b20024190016a240020000f0b1033000b1034000b0e002001ad4220862000ad84101d0bb70f02067f017e23004190056b2202240041002103200241003a00c8042001280204417f6a21040240024002400240024002400240024002400240024003402004417f460d01200241a8046a20036a200128020022052d00003a0000200120043602042001200541016a3602002002200341016a22053a00c8042004417f6a21042005210320054120470d000b200241d0046a41086a2203200241a8046a41086a290300370300200241d0046a41106a2206200241a8046a41106a290300370300200241d0046a41186a2207200241a8046a41186a290300370300200220022903a8043703d004200541ff0171411f4d0d01200241c8026a41086a20032903002208370300200241a8016a41186a2007290300370300200241a8016a41106a2006290300370300200241a8016a41086a2008370300200220022903d00422083703c802200220083703a80141002103200241003a00c80403402004417f460d03200241a8046a20036a200128020022052d00003a0000200120043602042001200541016a3602002002200341016a22053a00c8042004417f6a21042005210320054120470d000b200241d0046a41086a2203200241a8046a41086a290300370300200241d0046a41106a2206200241a8046a41106a290300370300200241d0046a41186a2207200241a8046a41186a290300370300200220022903a8043703d004200541ff0171411f4d0d03200241c8026a41086a20032903002208370300200241c8016a41186a2007290300370300200241c8016a41106a2006290300370300200241c8016a41086a2008370300200220022903d00422083703c802200220083703c80141002103200241003a00c80403402004417f460d05200241a8046a20036a200128020022052d00003a0000200120043602042001200541016a3602002002200341016a22053a00c8042004417f6a21042005210320054120470d000b200241d0046a41086a2203200241a8046a41086a290300370300200241d0046a41106a2206200241a8046a41106a290300370300200241d0046a41186a2207200241a8046a41186a290300370300200220022903a8043703d004200541ff0171411f4d0d05200241c8026a41086a20032903002208370300200241e8016a41186a2007290300370300200241e8016a41106a2006290300370300200241e8016a41086a2008370300200220022903d00422083703c802200220083703e80141002103200241003a00c80403402004417f460d07200241a8046a20036a200128020022052d00003a0000200120043602042001200541016a3602002002200341016a22053a00c8042004417f6a21042005210320054120470d000b200241d0046a41086a2203200241a8046a41086a290300370300200241d0046a41106a2206200241a8046a41106a290300370300200241d0046a41186a2207200241a8046a41186a290300370300200220022903a8043703d004200541ff0171411f4d0d0720024188026a41086a200329030037030020024188026a41106a200629030037030020024188026a41186a2007290300370300200220022903d00422083703e802200220083703880241002103200241003a00c80403402004417f460d09200241a8046a20036a200128020022052d00003a0000200120043602042001200541016a3602002002200341016a22053a00c8042004417f6a21042005210320054120470d000b200241d0046a41086a2204200241a8046a41086a290300370300200241d0046a41106a2201200241a8046a41106a290300370300200241d0046a41186a2203200241a8046a41186a290300370300200220022903a8043703d004200541ff0171411f4d0d09200241c8026a41086a20042903002208370300200241a8026a41186a22042003290300370300200241a8026a41106a22032001290300370300200241a8026a41086a22012008370300200220022903d00422083703c802200220083703a802200241086a41186a200241a8016a41186a290300370300200241086a41106a200241a8016a41106a290300370300200241086a41086a200241a8016a41086a290300370300200220022903a801370308200241c0006a200241c8016a41186a290300370300200241386a200241c8016a41106a290300370300200241306a200241c8016a41086a290300370300200220022903c801370328200241e0006a200241e8016a41186a290300370300200241d8006a200241e8016a41106a290300370300200241d0006a200241e8016a41086a290300370300200220022903e80137034820024180016a20024188026a41186a290300370300200241f8006a20024188026a41106a290300370300200241f0006a20024188026a41086a2903003703002002200229038802370368200241a0016a200429030037030020024198016a200329030037030020024190016a2001290300370300200220022903a80237038801200041016a200241086a41a00110cf061a200041003a00000c0a0b200341ff0171450d00200241003a00c8040b200041013a00000c080b200341ff0171450d00200241003a00c8040b200041013a00000c060b200341ff0171450d00200241003a00c8040b200041013a00000c040b200341ff0171450d00200241003a00c8040b200041013a00000c020b200341ff0171450d00200241003a00c8040b200041013a00000b20024190056a24000b930401057f230041e0006b22022400200241086a41b48cc700410710fb01200241186a41dcc2c200410810fb0102400240412010242203450d002002422037023c20022003360238200241386a41004120106d20022802382203200228024022046a22052001290000370000200541086a200141086a290000370000200541106a200141106a290000370000200541186a200141186a2900003700002002200441206a2201360240200241c8006a2003200110a202200241dc006a200320016a360200200220033602582002200241c8006a41086a3602542002200241c8006a360250200241286a200241d0006a10730240200228023c450d00200310260b2002280230220341206a2205417f4c0d010240024020050d0041012101410021050c010b200510242201450d010b20002001360200200041086a220141003602002000200536020420004100411010c9012000280200200128020022056a220420022900083700002001200541106a2205360200200441086a200241086a41086a29000037000020002005411010c9012000280200200128020022056a220420022900183700002001200541106a2206360200200441086a200241186a41086a2900003700002002280228210520002006200310c9012000280200200128020022006a2005200310cf061a2001200020036a3602000240200228022c450d00200510260b200241e0006a24000f0b1033000b1034000bcb0201027f23004180036b220324002003200236020c20032001360208200341106a2001200210820202400240200328021022010d00200041003a00000c010b200328021421042003200341186a2802003602ec02200320013602e802200341c0016a200341e8026a10b003410121020240024020032d00c0014101470d004100210220034100360228200342013703202003410e3602f4022003200341086a3602f0022003200341206a3602fc02200341d4016a4101360200200342013702c4012003418c8dc6003602c0012003200341f0026a3602d001200341fc026a41c4e1c000200341c0016a10351a200328022020032802281084022003280224450d01200328022010260c010b200341206a200341c0016a41017241a00110cf061a200041016a200341206a41a00110cf061a0b200020023a00002004450d00200110260b20034180036a24000bc76305087f017e087f027e027f230041e0026b2205240002400240024002400240410810242206450d0020062001200241c0016c6a220736020420062001360200410810242208450d0020082003200441c0016c6a2209360204200820033602000240024002402000450d00200541e8016a210a0c010b200541e8016a41186a220b4200370300200541e8016a41106a22024200370300200541e8016a41086a220c4200370300200542003703e801200541b8026a41aed3c500410f10fb01200c200541b8026a41086a2204290000370300200520052900b8023703e801200541b8026a41c5d8c500410710fb01200b2004290000370300200220052900b802370300200541d0006a200541e8016a412041d4c0c70041004100108102200541e8016a210a20052802504101460d00200b420037030020024200370300200c4200370300200542003703e801200541b8026a41aed3c500410f10fb01200c2004290000370300200520052900b8023703e801200541b8026a41e4e8c500410c10fb01200241086a2004290000370000200220052900b802370000200541c0006a200541e8016a10ab032005290348210d20052802402102200541b8026a41186a220b4200370300200541b8026a41106a220e420037030020044200370300200542003703b80220054198016a41b48cc700410710fb01200420054198016a41086a29030037030020052005290398013703b802200541e8016a4184c1c200410c10fb01200b200c290300370300200e20052903e801370300200541386a200541b8026a4120108902200528023c210c2005280238210b200541e8016a200d420020021b109b0520052802f001210220052802e80121042005200c4100200b1b3602b80220042002200541b8026a410410b301024020052802ec01450d00200410260b20081026200610260c010b200541b8026a2006109c050240024020052802b802450d00200541e8016a41106a200541b8026a41106a290300370300200541e8016a41086a200541b8026a41086a290300370300200541e8016a41186a200541b8026a41186a290300370300200541e8016a41206a200541b8026a41206a280200360200200541c8016a41086a200541f4016a290200370300200541c8016a41106a200541fc016a290200370300200541c8016a41186a20054184026a290200370300200520052903b8023703e801200520052902ec013703c801200541e8016a2006109d05417f20052802e801220441016a220220022004491bad42287e220d422088a70d04200da72204417f4c0d0420041024220f450d05200f20052903c801370300200f4201370320200f41186a200541c8016a41186a2210290300370300200f41106a200541c8016a41106a2211290300370300200f41086a200541c8016a41086a22122903003703004101210c200541013602b0012005200f3602a8012005200441286e22043602ac01200541b8026a2006109c05024020052802b802450d00200541e8016a41047221024128210b4101210c0340200541e8016a41206a200541b8026a41206a280200360200200541e8016a41186a220e200541b8026a41186a290300370300200541e8016a41106a2213200541b8026a41106a290300370300200541e8016a41086a2214200541b8026a41086a290300370300200520052903b8023703e8012012200241086a2902003703002011200241106a2902003703002010200241186a290200370300200520022902003703c801200e20102903003703002013201129030037030020142012290300370300200520052903c8013703e8010240200c2004470d00200541b8026a2006109d05200541a8016a2004417f20052802b802220f41016a22152015200f491b10900120052802a801210f0b200f200b6a220420052903e8013703002014290300210d20132903002116200e2903002117200441206a4201370300200441186a2017370300200441106a2016370300200441086a200d3703002005200c41016a220c3602b001200541b8026a2006109c05200b41286a210b20052802ac01210420052802b8020d000b0b200610260c010b200610264108210f4100210c410021040b20054180026a220b4200370300200541f8016a22024200370300200541e8016a41086a4200370300200542003703e801200541b8026a41aed3c500410f10fb01200a41086a200541b8026a41086a220e290000370000200a20052900b802370000200541b8026a41c5d8c500410710fb01200b200e290000370300200220052900b802370300200541b8026a200a412010e1040240024020052802b8024101460d002005200c3602f001200520043602ec012005200f3602e801200541c8016a200541e8016a410041002005109e050c010b200a412010ff0120052902bc02210d2005200c3602f001200520043602ec012005200f3602e801200541c8016a200541e8016a200da74101200d422088a7109e050b20052d00c801210b200541e8016a41186a220e4200370300200541e8016a41106a22134200370300200541e8016a41086a220c4200370300200542003703e801200541b8026a41aed3c500410f10fb01200a41086a2214200541b8026a41086a2204290000370000200a20052900b802370000200541b8026a41e4e8c500410c10fb01200241086a22062004290000370000200220052900b802370000200541286a200a10ab032005290330420020052802281b210d0240200b4104470d00200e420037030020134200370300200c4200370300200542003703e801200541b8026a41aed3c500410f10fb0120142004290000370000200a20052900b802370000200541b8026a41e4e8c500410c10fb0120062004290000370000200220052900b8023700002005200d42017c220d3703b802200a4120200541b8026a410810b3010b200541b8026a41186a22024200370300200541b8026a41106a220b420037030020044200370300200542003703b80220054198016a41b48cc700410710fb01200420054198016a41086a29030037030020052005290398013703b802200541e8016a4184c1c200410c10fb012002200c290300370300200b20052903e801370300200541206a200541b8026a4120108902200528022421022005280220210c200541e8016a200d109b0520052802f001210b20052802e8012104200520024100200c1b3602b8022004200b200541b8026a410410b301024020052802ec01450d00200410260b200810260b41081024220f450d00200f2007360204200f2001360200410810242208450d002008200936020420082003360200200541b8026a200f109f050240024020052802b802450d00200541e8016a41106a200541b8026a41106a290300370300200541e8016a41086a200541b8026a41086a290300370300200541e8016a41186a200541b8026a41186a290300370300200541e8016a41206a200541b8026a41206a280200360200200541c8016a41086a200541f4016a290200370300200541c8016a41106a200541fc016a290200370300200541c8016a41186a20054184026a290200370300200520052903b8023703e801200520052902ec013703c801200541e8016a200f109d05417f20052802e801220441016a220220022004491bad42287e220d422088a70d03200da72204417f4c0d0320041024220a450d04200a20052903c801370300200a4201370320200a41186a200541c8016a41186a2206290300370300200a41106a200541c8016a41106a2210290300370300200a41086a200541c8016a41086a22122903003703004101210c200541013602b0012005200a3602a8012005200441286e22113602ac01200541b8026a200f109f05024020052802b802450d00200541e8016a41047221024128210b4101210c0340200541e8016a41206a200541b8026a41206a280200360200200541e8016a41186a220e200541b8026a41186a290300370300200541e8016a41106a2213200541b8026a41106a290300370300200541e8016a41086a2214200541b8026a41086a290300370300200520052903b8023703e8012012200241086a2902003703002010200241106a2902003703002006200241186a290200370300200520022902003703c801200e20062903003703002013201029030037030020142012290300370300200520052903c8013703e8010240200c2011470d00200541b8026a200f109d05200541a8016a2011417f20052802b802220441016a221520152004491b10900120052802a801210a0b200a200b6a220420052903e8013703002014290300210d20132903002116200e2903002117200441206a4201370300200441186a2017370300200441106a2016370300200441086a200d3703002005200c41016a220c3602b001200541b8026a200f109f05200b41286a210b20052802ac01211120052802b8020d000b0b200f10260c010b200f1026410021114108210a4100210c0b200541b8026a2008109f050240024020052802b802450d00200541e8016a41106a200541b8026a41106a290300370300200541e8016a41086a200541b8026a41086a290300370300200541e8016a41186a200541b8026a41186a290300370300200541e8016a41206a200541b8026a41206a280200360200200541c8016a41086a200541f4016a290200370300200541c8016a41106a200541fc016a290200370300200541c8016a41186a20054184026a290200370300200520052903b8023703e801200520052902ec013703c801200541e8016a2008109d05417f20052802e801220441016a220220022004491bad42287e220d422088a70d03200da72204417f4c0d03200410242218450d04201820052903c80137030020184201370320201841186a200541c8016a41186a2212290300370300201841106a200541c8016a41106a220f290300370300201841086a200541c8016a41086a221529030037030041012113200541013602b001200520183602a8012005200441286e22103602ac01200541b8026a2008109f05024020052802b802450d00200541e8016a41047221024128210b410121130340200541e8016a41206a200541b8026a41206a280200360200200541e8016a41186a220e200541b8026a41186a290300370300200541e8016a41106a2214200541b8026a41106a290300370300200541e8016a41086a2206200541b8026a41086a290300370300200520052903b8023703e8012015200241086a290200370300200f200241106a2902003703002012200241186a290200370300200520022902003703c801200e20122903003703002014200f29030037030020062015290300370300200520052903c8013703e801024020132010470d00200541b8026a2008109d05200541a8016a2010417f20052802b802220441016a221820182004491b10900120052802a80121180b2018200b6a220420052903e8013703002006290300210d20142903002116200e2903002117200441206a4201370300200441186a2017370300200441106a2016370300200441086a200d3703002005201341016a22133602b001200541b8026a2008109f05200b41286a210b20052802ac01211020052802b8020d000b0b200810260c010b200810264100211041082118410021130b200541d0026a220b4200370300200541c8026a22064200370300200541b8026a41086a22044200370300200542003703b802200541d8006a41868cc700410410fb012004200541d8006a41086a2202290000370300200520052900583703b802200541d8006a41b49dc600410a10fb01200b200229000037030020062005290058370300200541106a200541b8026a10ab032005290318420020052802101b220d42017c2216200d540d03200b42003703002006420037030020044200370300200542003703b802200541d8006a41868cc700410410fb0120042002290000370300200520052900583703b802200541d8006a41b49dc600410a10fb01200641086a220e200229000037000020062005290058370000200520163703e801200541b8026a4120200541e8016a410810b301200b42003703002006420037030020044200370300200542003703b802200541d8006a41868cc700410410fb0120042002290000370300200520052900583703b802200541d8006a41dc9dc600410b10fb01200e200229000037000020062005290058370000200c41286c4104722204417f4c0d01200410242202450d02200541003602f001200520043602ec01200520023602e801200541e8016a200c10a10102400240200c0d0020052802e801210c20052802f00121020c010b200a200c41286c6a210b20052802f0012102200a21040340200541e8016a20024120106d20052802e80120052802f001220c6a22022004290000370000200241086a200441086a290000370000200241106a200441106a290000370000200241186a200441186a2900003700002005200c41206a22023602f001200441206a290300210d200541e8016a20024108106d20052802e801220c20052802f00122026a200d3700002005200241086a22023602f001200b200441286a2204470d000b0b200541b8026a4120200c200210b301024020052802ec01450d00200c10260b02402011450d00201141286c450d00200a10260b201642017c220d2016540d04200541f8006a41186a22044200370300200541f8006a41106a22114200370300200541f8006a41086a2202420037030020054200370378200541d8006a41868cc700410410fb012002200541d8006a41086a220c29000037030020052005290058370378200541d8006a41b4a0c600410e10fb012004200c29000037030020112005290058370300200541e8016a200541f8006a10a00520052d00e8012104200541b8026a41186a220220054181026a290000370300200541b8026a41106a220c200541f9016a290000370300200541b8026a41086a220b200541f1016a290000370300200520052900e9013703b8020240024020044101460d00200541a8016a41186a4200370300200541a8016a41106a4200370300200541a8016a41086a4200370300200542003703a8010c010b200541a8016a41186a2002290300370300200541a8016a41106a200c290300370300200541a8016a41086a200b290300370300200520052903b8023703a8010b200541f8006a41186a220c4200370300200541f8006a41106a220b4200370300200541f8006a41086a2202420037030020054200370378200541d8006a41868cc700410410fb012002200541d8006a41086a220429000037030020052005290058370378200541d8006a41dca0c600410c10fb01201141086a220e200429000037000020112005290058370000200541086a200541f8006a4120108902200528020c211420052802082112200c4200370300200b42003703002002420037030020054200370378200541d8006a41868cc700410410fb012002200429000037030020052005290058370378200541d8006a41dca0c600410c10fb01200e200429000037000020112005290058370000200541003602e801200541f8006a4120200541e8016a410410b301200541d8006a41186a200541a8016a41186a290300370300200541d8006a41106a200541a8016a41106a2903003703002004200541a8016a41086a290300370300200520052903a801370358417f2014410020121b221441016a220420042014491b410d744128722204417f4c0d0120041024220c450d0241002102200541003602a0012005200436029c012005200c3602980120054198016a4100412010c90120052802980120052802a001220c6a22042005290358370000200441086a200541d8006a41086a290300370000200441106a200541d8006a41106a290300370000200441186a200541d8006a41186a2903003700002005200c41206a22043602a00120054198016a2004410810c901200528029801220f20052802a00122046a200d3700002005200441086a22123602a0014100210402400340024002402004450d00200c200b470d01200e41ffffff3f71450d00200410260b200220144f0d02200541f8006a2002109102200541e8016a2005280278220c200528028001220b1092020240024020052802e80122040d004200210d410121040c010b200c200b10ff0120052902ec01210d0b0240200528027c450d00200c10260b200241016a21022004200d422088a74105746a210b200da7210e2004210c0c010b200541b8026a41186a200c41186a220f290000370300200541b8026a41106a200c41106a2215290000370300200541b8026a41086a200c41086a220a2900003703002005200c2900003703b802200a290000210d20152900002116200c2900002117200541c8016a41186a2215200f290000370300200541c8016a41106a220f2016370300200541c8016a41086a220a200d370300200520173703c801200541f8006a41186a22082015290300370300200541f8006a41106a2215200f290300370300200541f8006a41086a2219200a290300370300200520052903c80137037820054198016a2012412010c901200528029801220f20052802a001220a6a22122005290378370000201241086a2019290300370000201241106a2015290300370000201241186a20082903003700002005200a41206a22123602a001200c41206a210c0c000b0b200541e8016a200f20121096010240200528029c01450d00200f10260b200541f8006a41186a4200370300200541f8006a41106a4200370300200541f8006a41086a2204420037030020054200370378200541d8006a41868cc700410410fb012004200541d8006a41086a220229000037030020052005290058370378200541d8006a41b4a0c600410e10fb01201141086a200229000037000020112005290058370000412010242204450d02200542203702bc02200520043602b802200541b8026a41004120106d20052802b802220220052802c002220c6a220420052900e801370000200441086a200541e8016a41086a290000370000200441106a200541e8016a41106a290000370000200441186a200541e8016a41186a2900003700002005200c41206a22043602c002200541f8006a41202002200410b301024020052802bc02450d00200210260b200541e8016a41186a220c200541a8016a41186a290300370300200541e8016a41106a220b200541a8016a41106a290300370300200541e8016a41086a220e200541a8016a41086a290300370300200520052903a8013703e801200541b8026a41186a4200370300200541b8026a41106a4200370300200541b8026a41086a22044200370300200542003703b802200541d8006a41868cc700410410fb012004200541d8006a41086a2202290000370300200520052900583703b802200541d8006a41f89ec600410a10fb01200641086a200229000037000020062005290058370000412010242204450d02200542203702cc01200520043602c801200541c8016a41004120106d20052802c801220220052802d00122146a220420052903e801370000200441086a200e290300370000200441106a200b290300370000200441186a200c2903003700002005201441206a22043602d001200541b8026a41202002200410b301024020052802cc01450d00200210260b200541b8026a41186a22024200370300200541b8026a41106a220c4200370300200541b8026a41086a22044200370300200542003703b802200541d8006a41868cc700410410fb012004200541d8006a41086a220b290000370300200520052900583703b802200541d8006a41b4a0c600410e10fb01200641086a200b29000037000020062005290058370000200541e8016a200541b8026a10a00520052d00e801210b200220054181026a290000370300200c200541f9016a2900003703002004200541f1016a290000370300200520052900e9013703b80202400240200b4101460d00200541c8016a41186a4200370300200541c8016a41106a4200370300200541c8016a41086a4200370300200542003703c8010c010b200541c8016a41186a2002290300370300200541c8016a41106a200c290300370300200541c8016a41086a2004290300370300200520052903b8023703c8010b200541e8016a410c6a2013360200200541e8016a41086a2010360200200541e8016a41106a20052903c801370300200541e8016a41186a200541c8016a41086a290300370300200541e8016a41206a200541c8016a41106a290300370300200541e8016a41286a200541c8016a41186a290300370300200520183602ec01200541003602e801200541b8026a200541e8016a10f902200541e3006a200541b8026a41086a2204280200360000200520052903b80237005b200541b8026a410c6a200541df006a290000370000200541c28289aa043600b902200541023a00b802200520052900583700bd02200541b8026a10860202402010450d00201041286c450d00201810260b200541b8026a41186a4200370300200541b8026a41106a420037030020044200370300200542003703b802200541d8006a41868cc700410410fb012004200541d8006a41086a2202290000370300200520052900583703b802200541d8006a41f89fc600410f10fb01200641086a200229000037000020062005290058370000200541203602a4022005200541b8026a3602a002200541d8006a200541b8026a412010820202400240200528025822040d00410321040c010b200528025c21020240024002400240200541e0006a280200220c450d0020042d00004101470d00200c417f6a4108490d00200c41776a4108490d00200c4111460d0020042d0011220c41024b0d002004290001210d200429000921164100210b0240200c0e03030200030b4102210b0c020b2005410036028001200542013703782005410e3602ac022005200541a0026a3602a8022005200541f8006a3602b4024101210c200541fc016a4101360200200542013702ec012005418c8dc6003602e8012005200541a8026a3602f801200541b4026a41c4e1c000200541e8016a10351a20052802782005280280011084020240200528027c450d00200528027810260b4103210b0c020b4101210b0b200520052800a802360298022005200541ab026a28000036009b02200520163703a0012005200d370398014100210c0b02402002450d00200410260b41032104200c0d00200541b8026a412010ff01200b21040b200541e8016a41086a220220054198016a41086a29030037030020052005290398013703e80120052005280298023602a8022005200528009b023600ab02024020044103460d00200541f8006a41086a2002290300220d370300200520052903e8012216370378200520052802a8023602a002200520052800ab023600a302200541f8016a200d3703002002201637030020054180026a20043a000020054184026a20052800a302360000200520052802a00236008102200541023602e801200541b8026a200541e8016a10f902200541db006a220441086a200541b8026a41086a280200360000200420052903b802370000200541c4026a200541df006a290000370000200541c28289aa043600b902200541023a00b802200520052900583700bd02200541b8026a1086020b410810242210450d00201020073602042010200136020041081024220a450d00200a2009360204200a2003360200200541b8026a41186a220c4200370300200541b8026a41106a220b4200370300200541b8026a41086a22044200370300200542003703b80220054198016a41808cc700410610fb01200420054198016a41086a29030037030020052005290398013703b802200541e8016a41ea93c400410610fb01200c200541e8016a41086a2202290300370300200b20052903e8013703002005200541b8026a41201089022005280200211320052802042114200541e8016a41186a220e4200370300200541e8016a41106a2215420037030020024200370300200542003703e801200541b8026a41d18cc700410810fb0120022004290000370300200520052900b8023703e801200541b8026a41e3d3c500410e10fb01200e2004290000370300201520052900b8023703002005201441ac026a41ac0220131b3602b802200541e8016a4120200541b8026a410410b301200541b8026a201010a1050240024020052802b802450d002015200b29030037030020022004290300370300200e200c290300370300200541e8016a41206a200541b8026a41206a280200360200200541f8006a41086a200541f4016a290200370300200541f8006a41106a200541fc016a290200370300200541f8006a41186a20054184026a290200370300200520052903b8023703e801200520052902ec01370378200541e8016a2010109d05417f20052802e801220441016a220220022004491b220441ffffff3f712004470d0320044105742204417f4c0d0320041024220f450d04200f2005290378370000200f41186a200541f8006a41186a290300370000200f41106a200541f8006a41106a290300370000200f41086a200541f8006a41086a2903003700004101210c200541013602b0012005200f3602a8012005200441057622063602ac01200541b8026a201010a105024020052802b802450d00200541e8016a41047221044120210b4101210c0340200541e8016a41206a200541b8026a41206a280200360200200541e8016a41186a200541b8026a41186a220e290300370300200541e8016a41106a200541b8026a41106a2213290300370300200541e8016a41086a200541b8026a41086a2214290300370300200520052903b8023703e801200541c8016a41086a2202200441086a290000370300200541c8016a41106a2211200441106a290000370300200541c8016a41186a2212200441186a290000370300200520042900003703c801200e20122903003703002013201129030037030020142002290300370300200520052903c8013703b8020240200c2006470d00200541e8016a2010109d05200541a8016a2006417f20052802e801220241016a221120112002491b10930120052802a801210f0b200f200b6a220220052903b802370000200241186a200e290300370000200241106a2013290300370000200241086a20142903003700002005200c41016a220c3602b001200541b8026a201010a105200b41206a210b20052802ac01210620052802b8020d000b0b201010260c010b201010264101210f4100210c410021060b20054180026a4200370300200541f8016a4200370300200541e8016a41086a22044200370300200542003703e801200541b8026a41d18cc700410810fb012004200541b8026a41086a2202290000370300200520052900b8023703e801200541b8026a41bcd2c500410410fb01201541086a2002290000370000201520052900b802370000200c4105744104722204417f4c0d01200410242202450d02200541003602c002200520043602bc02200520023602b802200541b8026a200c10a10102400240200c0d0020052802b802210e20052802c00221020c010b200c410574210c20052802c0022102200f21040340200541b8026a20024120106d20052802b802220e20052802c002220b6a22022004290000370000200241086a200441086a290000370000200241106a200441106a290000370000200241186a200441186a2900003700002005200b41206a22023602c002200441206a2104200c41606a220c0d000b0b200541e8016a4120200e200210b301024020052802bc02450d00200e10260b0240200641ffffff3f71450d00200f10260b200a1026410810242210450d002010200736020420102001360200410810242215450d002015200936020420152003360200024002402000450d00200541b8026a201010a2050240024020052802b802450d00200541e8016a41106a200541b8026a41106a290300370300200541e8016a41086a200541b8026a41086a290300370300200541e8016a41186a200541b8026a41186a290300370300200541e8016a41206a200541b8026a41206a280200360200200541f8006a41086a200541f4016a290200370300200541f8006a41106a200541fc016a290200370300200541f8006a41186a20054184026a290200370300200520052903b8023703e801200520052902ec01370378200541e8016a2010109d05417f20052802e801220441016a220220022004491b220441ffffff3f712004470d0520044105742204417f4c0d0520041024220f450d06200f2005290378370000200f41186a200541f8006a41186a290300370000200f41106a200541f8006a41106a290300370000200f41086a200541f8006a41086a2903003700004101210c200541013602b0012005200f3602a8012005200441057622063602ac01200541b8026a201010a205024020052802b802450d00200541e8016a41047221044120210b4101210c0340200541e8016a41206a200541b8026a41206a280200360200200541e8016a41186a200541b8026a41186a220e290300370300200541e8016a41106a200541b8026a41106a2213290300370300200541e8016a41086a200541b8026a41086a2214290300370300200520052903b8023703e801200541c8016a41086a2202200441086a290000370300200541c8016a41106a2211200441106a290000370300200541c8016a41186a2212200441186a290000370300200520042900003703c801200e20122903003703002013201129030037030020142002290300370300200520052903c8013703b8020240200c2006470d00200541e8016a2010109d05200541a8016a2006417f20052802e801220241016a221120112002491b10930120052802a801210f0b200f200b6a220220052903b802370000200241186a200e290300370000200241106a2013290300370000200241086a20142903003700002005200c41016a220c3602b001200541b8026a201010a205200b41206a210b20052802ac01210620052802b8020d000b0b201010260c010b20101026410021064101210f4100210c0b200541f0006a22044200370300200541e8006a22024200370300200541d8006a41086a220b42003703002005420037035820054198016a41eb8cc700410a10fb01200b20054198016a41086a2903003703002005200529039801370358200541e8016a41dc9dc600410b10fb012004200541e8016a41086a290300370300200220052903e801370300200c4105744104722204417f4c0d03200410242202450d04200541003602f001200520043602ec01200520023602e801200541e8016a200c10a10102400240200c0d0020052802e801210e20052802f00121020c010b200c410574210c20052802f0012102200f21040340200541e8016a20024120106d20052802e801220e20052802f001220b6a22022004290000370000200241086a200441086a290000370000200241106a200441106a290000370000200241186a200441186a2900003700002005200b41206a22023602f001200441206a2104200c41606a220c0d000b0b200541d8006a4120200e200210b301024020052802ec01450d00200e10260b0240200641ffffff3f71450d00200f10260b201510260c010b20151026201010260b410810242210450d002010200736020420102001360200410810242215450d002015200936020420152003360200024002402000450d00200541b8026a201010a3050240024020052802b802450d00200541e8016a41106a200541b8026a41106a290300370300200541e8016a41086a200541b8026a41086a290300370300200541e8016a41186a200541b8026a41186a290300370300200541e8016a41206a200541b8026a41206a280200360200200541f8006a41086a200541f4016a290200370300200541f8006a41106a200541fc016a290200370300200541f8006a41186a20054184026a290200370300200520052903b8023703e801200520052902ec01370378200541e8016a2010109d05417f20052802e801220441016a220220022004491b220441ffffff3f712004470d0520044105742204417f4c0d0520041024220f450d06200f2005290378370000200f41186a200541f8006a41186a290300370000200f41106a200541f8006a41106a290300370000200f41086a200541f8006a41086a2903003700004101210c200541013602b0012005200f3602a8012005200441057622063602ac01200541b8026a201010a305024020052802b802450d00200541e8016a41047221044120210b4101210c0340200541e8016a41206a200541b8026a41206a280200360200200541e8016a41186a200541b8026a41186a220e290300370300200541e8016a41106a200541b8026a41106a2213290300370300200541e8016a41086a200541b8026a41086a2214290300370300200520052903b8023703e801200541c8016a41086a2202200441086a290000370300200541c8016a41106a2211200441106a290000370300200541c8016a41186a2212200441186a290000370300200520042900003703c801200e20122903003703002013201129030037030020142002290300370300200520052903c8013703b8020240200c2006470d00200541e8016a2010109d05200541a8016a2006417f20052802e801220241016a221120112002491b10930120052802a801210f0b200f200b6a220220052903b802370000200241186a200e290300370000200241106a2013290300370000200241086a20142903003700002005200c41016a220c3602b001200541b8026a201010a305200b41206a210b20052802ac01210620052802b8020d000b0b201010260c010b201010264101210f4100210c410021060b200541f0006a22044200370300200541e8006a22024200370300200541d8006a41086a420037030020054200370358200541d8006a41d98cc700411210fb01200541e8016a41bcd2c500410410fb012004200541e8016a41086a290300370300200220052903e801370300200c4105744104722204417f4c0d03200410242202450d04200541003602f001200520043602ec01200520023602e801200541e8016a200c10a10102400240200c0d0020052802e801210e20052802f00121020c010b200c410574210c20052802f0012102200f21040340200541e8016a20024120106d20052802e801220e20052802f001220b6a22022004290000370000200241086a200441086a290000370000200241106a200441106a290000370000200241186a200441186a2900003700002005200b41206a22023602f001200441206a2104200c41606a220c0d000b0b200541d8006a4120200e200210b301024020052802ec01450d00200e10260b0240200641ffffff3f71450d00200f10260b201510260c010b20151026201010260b200541e0026a24000f0b102c000b1034000b1033000b41d4e0c60041c90041a0e1c6001053000b41d4e0c60041c90041b0e1c6001053000b9a1707077f017e0c7f017e027f017e067f23004190046b22012400200141286a22024200370300200141206a22034200370300200141106a41086a420037030020014200370310200141106a41a28cc700410a10fb01200141a8036a41e0b8c500410610fb012002200141a8036a41086a290000370300200320012900a803370300200141203602342001200141106a360230200141386a200141106a412010820202400240200128023822040d00410021050c010b200128023c21062001200141386a41086a28020036024c20012004360248200141086a200141c8006a108f010240024020012802080d00024002400240200128020c2207200128024c41c4006e2202200220074b1bad42c4007e2208422088a70d002008a72202417f4c0d0002400240024020020d00410421050c010b200210242205450d010b20014100360258200120053602502001200241c4006e360254024002402007450d00200141a8036a41077221094100210a4100210b03400240024002400240200128024c220c450d002001280248220d2d000021022001200c417f6a220e36024c2001200d41016a360248200241014b0d000240024020020e020001000b200e4104490d012001419c026a41026a200141d0036a41026a2d00003a000020014180026a41086a200141f0036a41086a29020037030020014180026a41106a200141f0036a41106a29020037030020014180026a41186a200141f0036a41186a2d00003a0000200141e0016a41086a200141a8036a41086a290100370300200141e0016a41106a200141a8036a41106a290100370300200141e0016a41186a200141a8036a41186a290100370300200120012f00d0033b019c02200120012902f00337038002200120012901a8033703e001200d280001210f2001200c417b6a36024c2001200d41056a360248410021030c040b41002103200141003a00c803200c417e6a211002400340200e20032202460d01200141a8036a20026a200d20026a220341016a2d00003a00002001200341026a3602482001200241016a22033a00c8032001201036024c2010417f6a211020034120460d030c000b0b200241ff0171450d02200141003a00c8030c020b200141dc016a41026a2001419c026a41026a2d00003a0000200141c0016a41086a20014180026a41086a290300370300200141c0016a41106a20014180026a41106a290300370300200141c0016a41186a20014180026a41186a2d00003a0000200141a0016a41086a200141e0016a41086a290300370300200141a0016a41106a200141e0016a41106a290300370300200141a0016a41186a200141e0016a41186a290300370300200120012f019c023b01dc0120012001290380023703c001200120012903e0013703a0010c050b200141c0026a41026a221120012d00aa0322123a0000200141e8026a41026a20123a0000200141f0036a41086a2213200941086a2900002208370300200141f0036a41106a2214200941106a2900002215370300200141f0036a41186a2216200941186a2d000022123a0000200120012f01a80322173b01c002200120173b01e8022001200929000022183703f00320012800ab032119200141d0036a41186a221720123a0000200141d0036a41106a22122015370300200141d0036a41086a221a2008370300200120183703d003200341ff0171411f4d0d00200141e4026a41026a20112d000022113a000020014188036a41086a221b201a290300220837030020014188036a41106a221c2012290300221537030020014188036a41186a221d20172d000022123a0000200141bc026a41026a221a20113a0000200120012f01c00222173b01e402200120012903d003221837038803200120173b01bc02200141a0026a41186a221720123a0000200141a0026a41106a22122015370300200141a0026a41086a22112008370300200120183703a002200e2003460d00200d20036a220d41016a2d0000210e2001201036024c2001200d41026a360248200e41014b0d00410021100240024002400240200e0e020100010b41002110200141003a00c8032003200c6b41026a210e200c20026b417c6a21020340200e20106a450d02200141a8036a20106a200d20106a220341026a2d00003a00002001200341036a3602482001201041016a22033a00c8032001200236024c2002417f6a21022003211020034120470d000b2016200141a8036a41186a2903003703002014200141a8036a41106a2903003703002013200141a8036a41086a290300370300200120012903a8033703f003200341ff01714120490d02201b20132903002208370300200141e8026a41186a22022016290300370300200141e8026a41106a22032014290300370300200141e8026a41086a22102008370300200120012903f003220837038803200120083703e802200141c0026a41186a2002290300370300200141c0026a41106a2003290300370300200141c0026a41086a2010290300370300200120012903e8023703c002410121100b200141e0016a41186a200141c0026a41186a290300370300200141e0016a41106a200141c0026a41106a290300370300200141e0016a41086a200141c0026a41086a2903003703002001419c026a41026a201a2d00003a000020014180026a41086a201129030037030020014180026a41106a201229030037030020014180026a41186a20172d00003a0000200120012903c0023703e001200120012f01bc023b019c02200120012903a00237038002410121032010211e2019210f0c030b201041ff0171450d00200141003a00c8030b200141e8026a41186a201d290300370300200141e8026a41106a201c2903003703000b410221030b200141dc016a41026a22022001419c026a41026a2d00003a0000200141c0016a41086a221020014180026a41086a290300370300200141c0016a41106a220d20014180026a41106a290300370300200141c0016a41186a220e20014180026a41186a2d00003a0000200141a0016a41086a220c200141e0016a41086a290300370300200141a0016a41106a2212200141e0016a41106a290300370300200141a0016a41186a2217200141e0016a41186a290300370300200120012f019c023b01dc0120012001290380023703c001200120012903e0013703a00120034102460d02200b41016a210b2001419c016a41026a221120022d00003a000020014180016a41086a221a201029030037030020014180016a41106a2210200d29030037030020014180016a41186a220d200e2d00003a0000200141e0006a41086a220e200c290300370300200141e0006a41106a220c2012290300370300200141e0006a41186a22122017290300370300200120012f01dc013b019c01200120012903c00137038001200120012903a0013703600240200a2001280254470d00200141d0006a200a10f701200128025021052001280258210a0b2005200a41c4006c6a220220033a00002002200f360004200241036a20112d00003a0000200220012f019c013b0001200d2d0000210320102903002108201a290300211520012903800121182002201e3a002120022018370008200241106a2015370000200241186a2008370000200241206a20033a0000200220012903603700222002413a6a2012290300370000200241326a200c2903003700002002412a6a200e2903003700002001200a41016a220a360258200b2007470d000b0b200129025421082005450d050c060b20012802542202450d03200241c4006c0d020c030b1033000b1034000b200510260b0b41002105200141003602f803200142013703f0032001410e3602d4032001200141306a3602d0032001200141f0036a36028803200141bc036a4101360200200142013702ac032001418c8dc6003602a8032001200141d0036a3602b80320014188036a41c4e1c000200141a8036a10351a20012802f00320012802f80310840220012802f403450d0020012802f00310260b2006450d00200410260b0240024020050d0020004100360208200042043702000c010b20002008370204200020053602000b20014190046a24000bf80501047f230041106b2203240002400240200241c4006c41046a2204417f4c0d000240024020040d0041012105410021040c010b200410242205450d020b20002005360200200041086a2205410036020020002004360204024002400240200241c000490d0002400240200241808001490d002002418080808004490d01200041004101106d2000280200200041086a220528020022046a41033a00002005200441016a2204360200200020044104106d2000280200200528020022046a20023600002005200441046a22043602000c030b200041004102106d2000280200200041086a220528020022046a20024102744101723b00002005200441026a22043602000c020b200041004104106d2000280200200041086a220528020022046a20024102744102723600002005200441046a22043602000c010b200041004101106d2000280200200528020022046a20024102743a00002005200441016a22043602002002450d010b200241c4006c2105200041086a210203400240024020012d00004101460d00200020044101106d2000280200200228020022046a41003a00002002200441016a2204360200200141046a2802002106200020044104106d2000280200200228020022046a2006360000200441046a21040c010b200020044101106d2000280200200228020022046a41013a00002002200441016a3602002003200036020c200141016a2003410c6a109c010240200141216a2d00004101460d00200020022802004101106d2000280200200228020022046a41003a0000200441016a21040c010b200020022802004101106d2000280200200228020022046a41013a00002002200441016a2204360200200020044120106d2000280200200228020022066a2204200141226a290000370000200441186a2001413a6a290000370000200441106a200141326a290000370000200441086a2001412a6a290000370000200641206a21040b20022004360200200141c4006a2101200541bc7f6a22050d000b0b200341106a24000f0b1034000b1033000bfb0903057f017e057f230041d0016b22012400200141306a41186a22024200370300200141306a41106a22034200370300200141306a41086a2204420037030020014200370330200141206a41a28cc700410a10fb012004200141206a41086a220529000037030020012001290020370330200141206a41dab8c500410610fb012002200529000037030020032001290020370300200141d8006a200141306a412010b80320012d005821052002200141f1006a2900003703002003200141e9006a2900003703002004200141e1006a290000370300200120012900593703300240024020054101470d0020002001290330370000200041186a2002290300370000200041106a2003290300370000200041086a20042903003700000c010b200141d8006a41186a22024200370300200141d8006a41106a22034200370300200141d8006a41086a2205420037030020014200370358200141306a41808cc700410610fb012005200429000037030020012001290030370358200141306a41f093c400410610fb012002200429000037030020032001290030370300200141306a200141d8006a10c90420012802302204410420041b21030240024002402001290234420020041b2206422088a7220541246c2204450d00200320046a2202415c6a2107200321040340024020042d00004101460d002002200441246a2204470d010c020b200441016a2800002108200441086a28020021092001200441106a280200360234200120093602300240200841c28289aa04460d0020072004462108200441246a21042008450d010c020b0b200141d8006a200141306a109d0420012903584203510d00200141d8006a41106a2802002104200141d8006a10ad03410021020240200128026020044d0d00200141086a200128025820044105746a220441086a290000370300200141106a200441106a290000370300200141186a200441186a29000037030020012004290000370300410121020b0240200128025c41ffffff3f71450d00200128025810260b20020d010b20004200370000200041186a4200370000200041106a4200370000200041086a42003700000c010b200141d8006a41186a2204200141186a290300370300200141d8006a41106a2202200141106a290300370300200141d8006a41086a2208200141086a290300370300200120012903003703582001200141d8006a360254200141306a41186a22094200370300200141306a41106a22074200370300200141306a41086a220a420037030020014200370330200141206a41a28cc700410a10fb01200a200141206a41086a220b29000037030020012001290020370330200141206a41dab8c500410610fb012009200b29000037030020072001290020370300200141306a4120200141d4006a10ce03200041186a2004290300370000200041106a2002290300370000200041086a2008290300370000200020012903583700000b02402005450d00200541246c21022003210403400240024020042d0000220041044b0d0002400240024020000e050400010204040b2004410c6a280200450d03200441086a28020010260c030b2004410c6a280200450d02200441086a28020010260c020b2004410c6a280200450d01200441086a28020010260c010b200441086a280200450d00200441046a28020010260b200441246a21042002415c6a22020d000b0b2006a72204450d00200441246c450d00200310260b200141d0016a24000bdd0701087f230041a0016b22012400200141d8006a41186a22024200370300200141d8006a41106a22034200370300200141d8006a41086a2204420037030020014200370358200141d8006a41b48cc700410710fb0120014190016a4184c1c200410c10fb01200220014190016a41086a2900003703002003200129009001370300200141106a200141d8006a412010890220012802142105200128021021062002200041186a2900003703002003200041106a2900003703002004200041086a29000037030020012000290000370358200141186a41d18cc700410810fb01200141286a41c0d2c500410e10fb0120012005410020061b36028001200141f8006a20014180016a410410a20220014190016a410c6a220620014180016a41046a3602002001200141f8006a41086a220736029401200120014180016a360298012001200141f8006a36029001200141386a20014190016a107302400240412010242200450d002001422037028401200120003602800120014180016a41004120106d200128028001220020012802880122086a22052001290358370000200541086a2004290300370000200541106a2003290300370000200541186a20022903003700002001200841206a220236028801200141f8006a2000200210a2022006200020026a360200200120003602980120012007360294012001200141f8006a36029001200141c8006a20014190016a10730240200128028401450d00200010260b20012802402200200128025022026a41206a2203417f4c0d010240024020030d0041012105410021030c010b200310242205450d010b20014100360298012001200536029001200120033602940120014190016a4100411010c90120012802900120012802980122036a22052001290018370000200541086a200141186a41086a2900003700002001200341106a22033602980120014190016a2003411010c90120012802900120012802980122036a22052001290028370000200541086a200141286a41086a2900003700002001200341106a2205360298012001280238210320014190016a2005200010c90120012802900120012802980122056a2003200010cf061a2001200520006a2200360298012001280248210520014190016a2000200210c901200128029001220020012802980122046a2005200210cf061a2001200420026a2202360298010240200128024c450d00200510260b0240200128023c450d00200310260b200141086a200020021089022001200128020c41016a410120012802081b36025820002002200141d8006a410410b3010240200128029401450d00200010260b200141a0016a24000f0b1033000b1034000bae0402057f047e230041a0016b220324002003200236020420032001360200200341086a2001200210820202400240200328020822040d00200041003a00000c010b200341106a2802002105200328020c210641002101200341003a005820042102024002400240034020052001460d01200341386a20016a20022d00003a00002003200141016a22073a0058200241016a21022007210120074120470d000b20034180016a41186a2201200341386a41186a29030037030020034180016a41106a2202200341386a41106a29030037030020034180016a41086a2205200341386a41086a2903003703002003200329033837038001200741ff01714120490d01200341e0006a41186a20012903002208370300200341186a41086a20052903002209370300200341186a41106a2002290300220a370300200341186a41186a20083703002003200329038001220b370318200041196a2008370000200041116a200a370000200041096a20093700002000200b370001410121010c020b200141ff0171450d00200341003a00580b41002101200341003602880120034201370380012003410e36026420032003360260200320034180016a360218200341cc006a41013602002003420137023c2003418c8dc6003602382003200341e0006a360248200341186a41c4e1c000200341386a10351a200328028001200328028801108402200328028401450d0020032802800110260b200020013a00002006450d00200410260b200341a0016a24000b13002000410236020420004194b3c2003602000b3400200041b48cc70036020420004100360200200041146a4107360200200041106a41f0bbc200360200200041086a42073702000b2901017f230041106b2202240020024100360208200242043703002000200210bc01200241106a24000b4901017f02404104102422020d001033000b2000420437020420002002360200200041004104106d2000280200200041086a220028020022026a41003600002000200241046a3602000bbd0601057f230041e0006b22022400200241086a41b48cc700410710fb01200241186a41fcc2c200410810fb0102400240200141086a280200220341046a2204417f4c0d000240024020040d0041012105410021040c010b200410242205450d020b20024100360240200220053602382002200436023c200241386a41004104106d2002280238200228024022046a20012800003600002002200441046a2204360240200128020421050240024002400240200341c000490d00200341808001490d012003418080808004490d02200241386a20044101106d2002280238200228024022016a41033a00002002200141016a2201360240200241386a20014104106d2002280238200228024022016a2003360000200141046a21010c030b200241386a20044101106d2002280238200228024022016a20034102743a0000200141016a21010c020b200241386a20044102106d2002280238200228024022016a20034102744101723b0000200141026a21010c010b200241386a20044104106d2002280238200228024022016a2003410274410272360000200141046a21010b20022001360240200241386a20012003106d20022802382201200228024022046a2005200310cf061a2002200420036a2203360240200241c8006a2001200310a202200241dc006a200120036a360200200220013602582002200241d0006a3602542002200241c8006a360250200241286a200241d0006a10730240200228023c450d00200110260b2002280230220141206a2204417f4c0d000240024020040d0041012103410021040c010b200410242203450d020b20002003360200200041086a220341003602002000200436020420004100411010c9012000280200200328020022046a220520022900083700002003200441106a2204360200200541086a200241086a41086a29000037000020002004411010c9012000280200200328020022046a220520022900183700002003200441106a2206360200200541086a200241186a41086a2900003700002002280228210420002006200110c9012000280200200328020022006a2004200110cf061a2003200020016a3602000240200228022c450d00200410260b200241e0006a24000f0b1034000b1033000b130020004109360204200041f8c8c2003602000b3400200041998dc70036020420004100360200200041146a4103360200200041106a41d081c300360200200041086a42083702000b1300200041043602042000418c88c3003602000b5801027f02404110102422020d001033000b2000421037020420002002360200200041004110106d2000280200200041086a220028020022026a2203420037000820034280a0e5b9c291013700002000200241106a3602000b4901017f02404102102422020d001033000b2000420237020420002002360200200041004102106d2000280200200041086a220028020022026a41093b00002000200241026a3602000b5701027f02404110102422020d001033000b2000421037020420002002360200200041004110106d2000280200200041086a220028020022026a220342003700082003428090cad2c60e3700002000200241106a3602000ba92502087f047e230041b0086b22022400024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012802042203450d00200128020022042d0000210520012003417f6a3602042001200441016a360200200541084b0d0a20050e09010203040506070809010b2000410a3a00000c1d0b41002105200241003a00e0032003417f6a21062003417e6a21070240034020062005460d01200241c0036a20056a200420056a220841016a2d00003a0000200120073602042001200841026a3602002002200541016a22083a00e0032007417f6a21072008210520084120460d1b0c000b0b200541ff0171450d1a200241003a00e0030c1a0b41002105200241003a00e003410120036b21062003417e6a210702400340200620056a450d01200241c0036a20056a200420056a220841016a2d00003a0000200120073602042001200841026a3602002002200541016a22083a00e0032007417f6a21072008210520084120460d160c000b0b200541ff0171450d15200241003a00e0030c150b20024190016a20011092010240024002402002280290012204450d002002280294012105200128020422074102490d0120024198016a2802002106200128020022082f0000210920012007417e6a22033602042001200841026a36020020034104490d022008280002210320012007417a6a3602042001200841066a360200200041106a20033602002000410c6a2006360200200041086a2005360200200041046a2004360200200041026a20093b0100200041033a0000200041146a20022902c0033702002000411c6a200241c0036a41086a290200370200200041246a200241c0036a41106a2902003702002000412c6a200241d8036a290200370200200041346a200241e0036a2902003702002000413c6a200241e8036a2902003702000c1d0b2000410a3a00000c1c0b2000410a3a0000200541ffffff3f71450d1b200410260c1b0b2000410a3a0000200541ffffff3f71450d1a200410260c1a0b41002105200241003a00b0012003417f6a21062003417e6a21070240034020062005460d0120024190016a20056a200420056a220841016a2d00003a0000200120073602042001200841026a3602002002200541016a22083a00b0012007417f6a21072008210520084120460d120c000b0b200541ff0171450d11200241003a00b0010c110b41002105200241003a00e003410120036b21062003417e6a210702400340200620056a450d01200241c0036a20056a200420056a220841016a2d00003a0000200120073602042001200841026a3602002002200541016a22083a00e0032007417f6a21072008210520084120460d0d0c000b0b200541ff0171450d0c200241003a00e0030c0c0b41002105200241003a00b0012003417f6a21062003417e6a21070240034020062005460d0120024190016a20056a200420056a220841016a2d00003a0000200120073602042001200841026a3602002002200541016a22083a00b0012007417f6a21072008210520084120460d0a0c000b0b200541ff0171450d09200241003a00b0010c090b41002105200241003a00b0012003417f6a21062003417e6a21070240034020062005460d0120024190016a20056a200420056a220841016a2d00003a0000200120073602042001200841026a3602002002200541016a22083a00b0012007417f6a21072008210520084120460d070c000b0b200541ff0171450d06200241003a00b0010c060b200041083a00000c150b41002105200241003a00b0012003417f6a21062003417e6a21070240034020062005460d0120024190016a20056a200420056a220841016a2d00003a0000200120073602042001200841026a3602002002200541016a22083a00b0012007417f6a21072008210520084120460d030c000b0b200541ff0171450d02200241003a00b0010c020b2000410a3a00000c130b200241f0076a41086a220120024190016a41086a290300370300200241f0076a41106a220420024190016a41106a290300370300200241f0076a41186a220520024190016a41186a29030037030020022002290390013703f007200841ff0171411f4d0d00200241306a41086a2001290300220a370300200241306a41106a2004290300220b370300200241306a41186a2005290300220c370300200220022903f007220d3703502002200d370330200041093a00002000200d370001200041096a200a370000200041116a200b370000200041196a200c370000200041216a20022900c003370000200041296a200241c0036a41086a290000370000200041316a200241c0036a41106a290000370000200041396a200241c0036a41186a290000370000200041c0006a200241c0036a411f6a2800003600000c120b2000410a3a00000c110b200241f0076a41086a220120024190016a41086a290300370300200241f0076a41106a220420024190016a41106a290300370300200241f0076a41186a220520024190016a41186a29030037030020022002290390013703f007200841ff0171411f4d0d00200241306a41086a2001290300220a370300200241306a41106a2004290300220b370300200241306a41186a2005290300220c370300200220022903f007220d3703502002200d370330200041073a00002000200d370001200041096a200a370000200041116a200b370000200041196a200c370000200041216a20022900c003370000200041296a200241c0036a41086a290000370000200041316a200241c0036a41106a290000370000200041396a200241c0036a41186a290000370000200041c0006a200241c0036a411f6a2800003600000c100b2000410a3a00000c0f0b200241f0076a41086a220120024190016a41086a290300370300200241f0076a41106a220420024190016a41106a290300370300200241f0076a41186a220520024190016a41186a29030037030020022002290390013703f007200841ff0171411f4d0d00200241306a41086a2001290300220a370300200241306a41106a2004290300220b370300200241306a41186a2005290300220c370300200220022903f007220d3703502002200d370330200041063a00002000200d370001200041096a200a370000200041116a200b370000200041196a200c370000200041216a20022900c003370000200041296a200241c0036a41086a290000370000200041316a200241c0036a41106a290000370000200041396a200241c0036a41186a290000370000200041c0006a200241c0036a411f6a2800003600000c0e0b2000410a3a00000c0d0b20024190016a41086a2205200241c0036a41086a29030037030020024190016a41106a2206200241c0036a41106a29030037030020024190016a41186a2209200241c0036a41186a290300370300200220022903c00337039001200841ff0171411f4d0d00200241f0006a41086a2005290300370300200241f0006a41106a2006290300370300200241f0006a41186a20092903003703002002200229039001220d3703502002200d37037041002105200241003a00e003200420086a2106200820036b41016a21080340200820056a450d02200241c0036a20056a200620056a220441016a2d00003a0000200120073602042001200441026a3602002002200541016a22043a00e0032007417f6a21072004210520044120470d000b20024190016a41086a2201200241c0036a41086a29030037030020024190016a41106a2205200241c0036a41106a29030037030020024190016a41186a2207200241c0036a41186a290300370300200220022903c00337039001200441ff0171411f4d0d02200241106a41086a22042001290300370300200241106a41106a22012005290300370300200241106a41186a22052007290300370300200241306a41186a2207200241f0006a41186a290300370300200241306a41106a2208200241f0006a41106a290300370300200241306a41086a2203200241f0006a41086a2903003703002002200229039001220d3703502002200d37031020022002290370370330200041053a000020002002290330370001200041096a2003290300370000200041116a2008290300370000200041196a2007290300370000200041216a2002290310370000200041296a2004290300370000200041316a2001290300370000200041396a2005290300370000200041c1006a20022f000d3b0000200041c3006a2002410f6a2d00003a00000c0c0b2000410a3a00000c0b0b200541ff0171450d00200241003a00e0030b2000410a3a00000c090b200241f0076a41086a220120024190016a41086a290300370300200241f0076a41106a220420024190016a41106a290300370300200241f0076a41186a220520024190016a41186a29030037030020022002290390013703f007200841ff0171411f4d0d00200241306a41086a2001290300220a370300200241306a41106a2004290300220b370300200241306a41186a2005290300220c370300200220022903f007220d3703502002200d370330200041043a00002000200d370001200041096a200a370000200041116a200b370000200041196a200c370000200041216a20022900c003370000200041296a200241c0036a41086a290000370000200041316a200241c0036a41106a290000370000200041396a200241c0036a41186a290000370000200041c0006a200241c0036a411f6a2800003600000c080b2000410a3a00000c070b20024190016a41086a2205200241c0036a41086a29030037030020024190016a41106a2206200241c0036a41106a29030037030020024190016a41186a2209200241c0036a41186a290300370300200220022903c00337039001200841ff0171411f4d0d00200241f0006a41086a2005290300370300200241f0006a41106a2006290300370300200241f0006a41186a20092903003703002002200229039001220d3703502002200d37037041002105200241003a00e003200420086a2106200820036b41016a21080340200820056a450d02200241c0036a20056a200620056a220441016a2d00003a0000200120073602042001200441026a3602002002200541016a22043a00e0032007417f6a21072004210520044120470d000b20024190016a41086a2201200241c0036a41086a29030037030020024190016a41106a2205200241c0036a41106a29030037030020024190016a41186a2207200241c0036a41186a290300370300200220022903c00337039001200441ff0171411f4d0d02200241106a41086a22042001290300370300200241106a41106a22012005290300370300200241106a41186a22052007290300370300200241306a41186a2207200241f0006a41186a290300370300200241306a41106a2208200241f0006a41106a290300370300200241306a41086a2203200241f0006a41086a2903003703002002200229039001220d3703502002200d37031020022002290370370330200041023a000020002002290330370001200041096a2003290300370000200041116a2008290300370000200041196a2007290300370000200041216a2002290310370000200041296a2004290300370000200041316a2001290300370000200041396a2005290300370000200041c1006a20022f000d3b0000200041c3006a2002410d6a41026a2d00003a00000c060b2000410a3a00000c050b200541ff0171450d00200241003a00e0030b2000410a3a00000c030b20024190016a41086a2204200241c0036a41086a29030037030020024190016a41106a2205200241c0036a41106a29030037030020024190016a41186a2207200241c0036a41186a290300370300200220022903c00337039001200841ff0171411f4b0d010b2000410a3a00000c010b200241f0006a41086a2004290300370300200241f0006a41106a2005290300370300200241f0006a41186a20072903003703002002200229039001220d3703502002200d370370200241c0036a200110b60220022802c003210120024190016a200241c0036a41047241ac0210cf061a0240024020014117460d00200241c0036a20024190016a41ac0210cf061a41b002102422040d01102c000b2000410a3a00000c010b20042001360200200441046a200241c0036a41ac0210cf061a200241306a41186a200241f0006a41186a290300220d370300200241306a41106a200241f0006a41106a290300220a370300200241306a41086a200241f0006a41086a290300220b37030020022002290370220c370330200041013a00002000200c370001200041096a200b370000200041116a200a370000200041196a200d370000200041216a20022f000d3b0000200041236a2002410f6a2d00003a0000200041246a2004360200200041286a2002290210370200200041306a200241106a41086a290200370200200041386a200241106a41106a290200370200200041c0006a200241106a41186a2802003602000b200241b0086a24000b852403057f047e037f230041b00a6b2202240002400240024002400240024002400240024002400240024002400240200128020022032802042204450d00200328020022052d0000210620032004417f6a3602042003200541016a360200200641084b0d0a20060e09010203040506070809010b2000410a3a00000c0c0b41002103200241003a00e003024002400340200128020022062802042204450d01200241c0036a20036a200628020022052d00003a000020062004417f6a3602042006200541016a3602002002200341016a22033a00e00320034120470d000b20024190016a41186a200241c0036a41186a2903002207370300200241d0006a41086a2203200241c0036a41086a290300370300200241d0006a41106a2206200241c0036a41106a290300370300200241d0006a41186a22042007370300200220022903c003370350200241f0006a41186a2004290300370300200241f0006a41106a2006290300370300200241f0006a41086a2003290300370300200220022903503703702001200128020441016a2203360204200320012802084d0d010c0c0b0240200341ff0171450d00200241003a00e0030b2000410a3a00000c0c0b200241c0036a200110b40220022802c003210320024190016a200241c0036a41047241ac0210cf061a20034117460d0a200241c0036a20024190016a41ac0210cf061a41b00210242206450d0920062003360200200641046a200241c0036a41ac0210cf061a200241306a41186a200241f0006a41186a2903002207370300200241306a41106a200241f0006a41106a2903002208370300200241306a41086a200241f0006a41086a290300220937030020012001280204417f6a36020420022002290370220a370330200041013a00002000200a370001200041096a2009370000200041116a2008370000200041196a2007370000200041246a2006360200200041216a20022f000d3b0000200041236a2002410f6a2d00003a0000200041286a2002290210370200200041306a200241106a41086a290200370200200041386a200241106a41106a290200370200200041c0006a200241106a41186a2802003602000c0b0b41002103200241003a00e003024002400340200128020022062802042204450d01200241c0036a20036a200628020022052d00003a000020062004417f6a3602042006200541016a3602002002200341016a22033a00e00320034120470d000b20024190016a41186a200241c0036a41186a2903002207370300200241d0006a41086a2203200241c0036a41086a290300370300200241d0006a41106a2206200241c0036a41106a290300370300200241d0006a41186a22042007370300200220022903c003370350200241f0006a41186a2004290300370300200241f0006a41106a2006290300370300200241f0006a41086a20032903003703002002200229035037037041002103200241003a00e0030340200128020022062802042204450d02200241c0036a20036a200628020022052d00003a000020062004417f6a3602042006200541016a3602002002200341016a22033a00e00320034120470d000b20024190016a41186a200241c0036a41186a2903002207370300200241d0006a41086a2201200241c0036a41086a290300370300200241d0006a41106a2203200241c0036a41106a290300370300200241d0006a41186a22062007370300200220022903c003370350200241106a41186a22042006290300370300200241106a41106a22062003290300370300200241106a41086a2203200129030037030020022002290350370310200241306a41186a2201200241f0006a41186a290300370300200241306a41106a2205200241f0006a41106a290300370300200241306a41086a220b200241f0006a41086a29030037030020022002290370370330200041023a000020002002290330370001200041096a200b290300370000200041116a2005290300370000200041196a2001290300370000200041216a2002290310370000200041296a2003290300370000200041316a2006290300370000200041396a2004290300370000200041c1006a20022f000d3b0000200041c3006a2002410d6a41026a2d00003a00000c0c0b0240200341ff0171450d00200241003a00e0030b2000410a3a00000c0b0b0240200341ff0171450d00200241003a00e0030b2000410a3a00000c0a0b20024190016a200110da010240024002402002280290012206450d0020022802940121042001280200220328020422054102490d0120024198016a280200210c2003280200220b2f0000210d20032005417e6a3602042003200b41026a3602002001280200220128020422034104490d0220012802002205280000210b20012003417c6a3602042001200541046a360200200041106a200b3602002000410c6a200c360200200041086a2004360200200041046a2006360200200041026a200d3b0100200041033a0000200041146a20022902c0033702002000411c6a200241c0036a41086a290200370200200041246a200241c0036a41106a2902003702002000412c6a200241d8036a290200370200200041346a200241e0036a2902003702002000413c6a200241e8036a2902003702000c0c0b2000410a3a00000c0b0b2000410a3a0000200441ffffff3f71450d0a200610260c0a0b2000410a3a0000200441ffffff3f71450d09200610260c090b41002103200241003a00b00102400340200128020022062802042204450d0120024190016a20036a200628020022052d00003a000020062004417f6a3602042006200541016a3602002002200341016a22033a00b00120034120470d000b200241f0006a41186a20024190016a41186a2903002207370300200241d0006a41086a220120024190016a41086a290300370300200241d0006a41106a220320024190016a41106a290300370300200241d0006a41186a220620073703002002200229039001370350200241306a41186a22042006290300370300200241306a41106a22062003290300370300200241306a41086a2203200129030037030020022002290350370330200041043a000020002002290330370001200041096a2003290300370000200041116a2006290300370000200041196a2004290300370000200041216a20022900c003370000200041296a200241c0036a41086a290000370000200041316a200241c0036a41106a290000370000200041396a200241c0036a41186a290000370000200041c0006a200241df036a2800003600000c090b0240200341ff0171450d00200241003a00b0010b2000410a3a00000c080b41002103200241003a00e003024002400340200128020022062802042204450d01200241c0036a20036a200628020022052d00003a000020062004417f6a3602042006200541016a3602002002200341016a22033a00e00320034120470d000b20024190016a41186a200241c0036a41186a2903002207370300200241d0006a41086a2203200241c0036a41086a290300370300200241d0006a41106a2206200241c0036a41106a290300370300200241d0006a41186a22042007370300200220022903c003370350200241f0006a41186a2004290300370300200241f0006a41106a2006290300370300200241f0006a41086a20032903003703002002200229035037037041002103200241003a00e0030340200128020022062802042204450d02200241c0036a20036a200628020022052d00003a000020062004417f6a3602042006200541016a3602002002200341016a22033a00e00320034120470d000b20024190016a41186a200241c0036a41186a2903002207370300200241d0006a41086a2201200241c0036a41086a290300370300200241d0006a41106a2203200241c0036a41106a290300370300200241d0006a41186a22062007370300200220022903c003370350200241106a41186a22042006290300370300200241106a41106a22062003290300370300200241106a41086a2203200129030037030020022002290350370310200241306a41186a2201200241f0006a41186a290300370300200241306a41106a2205200241f0006a41106a290300370300200241306a41086a220b200241f0006a41086a29030037030020022002290370370330200041053a000020002002290330370001200041096a200b290300370000200041116a2005290300370000200041196a2001290300370000200041216a2002290310370000200041296a2003290300370000200041316a2006290300370000200041396a2004290300370000200041c1006a20022f000d3b0000200041c3006a2002410f6a2d00003a00000c090b0240200341ff0171450d00200241003a00e0030b2000410a3a00000c080b0240200341ff0171450d00200241003a00e0030b2000410a3a00000c070b41002103200241003a00b00102400340200128020022062802042204450d0120024190016a20036a200628020022052d00003a000020062004417f6a3602042006200541016a3602002002200341016a22033a00b00120034120470d000b200241f0006a41186a20024190016a41186a2903002207370300200241d0006a41086a220120024190016a41086a290300370300200241d0006a41106a220320024190016a41106a290300370300200241d0006a41186a220620073703002002200229039001370350200241306a41186a22042006290300370300200241306a41106a22062003290300370300200241306a41086a2203200129030037030020022002290350370330200041063a000020002002290330370001200041096a2003290300370000200041116a2006290300370000200041196a2004290300370000200041216a20022900c003370000200041296a200241c0036a41086a290000370000200041316a200241c0036a41106a290000370000200041396a200241c0036a41186a290000370000200041c0006a200241df036a2800003600000c070b0240200341ff0171450d00200241003a00b0010b2000410a3a00000c060b41002103200241003a00b00102400340200128020022062802042204450d0120024190016a20036a200628020022052d00003a000020062004417f6a3602042006200541016a3602002002200341016a22033a00b00120034120470d000b200241f0006a41186a20024190016a41186a2903002207370300200241d0006a41086a220120024190016a41086a290300370300200241d0006a41106a220320024190016a41106a290300370300200241d0006a41186a220620073703002002200229039001370350200241306a41186a22042006290300370300200241306a41106a22062003290300370300200241306a41086a2203200129030037030020022002290350370330200041073a000020002002290330370001200041096a2003290300370000200041116a2006290300370000200041196a2004290300370000200041216a20022900c003370000200041296a200241c0036a41086a290000370000200041316a200241c0036a41106a290000370000200041396a200241c0036a41186a290000370000200041c0006a200241df036a2800003600000c060b0240200341ff0171450d00200241003a00b0010b2000410a3a00000c050b200041083a00000c040b41002103200241003a00b00102400340200128020022062802042204450d0120024190016a20036a200628020022052d00003a000020062004417f6a3602042006200541016a3602002002200341016a22033a00b00120034120470d000b200241f0006a41186a20024190016a41186a2903002207370300200241d0006a41086a220120024190016a41086a290300370300200241d0006a41106a220320024190016a41106a290300370300200241d0006a41186a220620073703002002200229039001370350200241306a41186a22042006290300370300200241306a41106a22062003290300370300200241306a41086a2203200129030037030020022002290350370330200041093a000020002002290330370001200041096a2003290300370000200041116a2006290300370000200041196a2004290300370000200041216a20022900c003370000200041296a200241c0036a41086a290000370000200041316a200241c0036a41106a290000370000200041396a200241c0036a41186a290000370000200041c0006a200241df036a2800003600000c040b0240200341ff0171450d00200241003a00b0010b2000410a3a00000c030b2000410a3a00000c020b102c000b2000410a3a00000b200241b00a6a24000bdd0302057f037e230041d0016b220224002002200141206a41e9dabdf30610c703200228020421032002280200210441002105200241003a008801024002400240034020032005460d01200241e8006a20056a200420056a2d00003a00002002200541016a22063a0088012006210520064120470d000b20024190016a41086a2205200241e8006a41086a29030037030020024190016a41106a2203200241e8006a41106a29030037030020024190016a41186a2204200241e8006a41186a2903003703002002200229036837039001200641ff0171411f4d0d01200241c8006a41186a20042903002207370300200241286a41086a20052903002208370300200241286a41106a20032903002209370300200241286a41186a2007370300200241086a41186a2007370300200241086a41106a2009370300200241086a41086a200837030020022002290390012207370328200220073703080c020b200541ff0171450d00200241003a0088010b200241106a4200370300200241186a4200370300200241206a4200370300200242003703080b20002001360200200020022903083700042000410c6a200241106a290300370000200041146a200241186a2903003700002000411c6a200241206a290300370000200241d0016a24000ba80101027f4100210341d4c0c700210402400240024002400240200241e0ea91cb064a0d00200241f0c2c98b06460d01200241e2c289ab06470d0441202103200141206a21040c040b200241e1ea91cb06460d010240200241e9dabdf306460d00200241e7e485f306470d0441202103200121040c040b200141c0006a21040c020b200141e0006a21040c010b20014180016a21040b412021030b20002003360204200020043602000bdd0302057f037e230041d0016b220224002002200141206a41e7e485f30610c703200228020421032002280200210441002105200241003a008801024002400240034020032005460d01200241e8006a20056a200420056a2d00003a00002002200541016a22063a0088012006210520064120470d000b20024190016a41086a2205200241e8006a41086a29030037030020024190016a41106a2203200241e8006a41106a29030037030020024190016a41186a2204200241e8006a41186a2903003703002002200229036837039001200641ff0171411f4d0d01200241c8006a41186a20042903002207370300200241286a41086a20052903002208370300200241286a41106a20032903002209370300200241286a41186a2007370300200241086a41186a2007370300200241086a41106a2009370300200241086a41086a200837030020022002290390012207370328200220073703080c020b200541ff0171450d00200241003a0088010b200241106a4200370300200241186a4200370300200241206a4200370300200242003703080b20002001360200200020022903083700042000410c6a200241106a290300370000200041146a200241186a2903003700002000411c6a200241206a290300370000200241d0016a24000b130020004104360204200041e494c3003602000b130020004110360204200041fc96c3003602000bc15f04087f027e017f017e230041c0076b220324000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012d00000e0a00010203040506070809000b200341fc046a4101360200200342013702ec04200341dcedc6003602e8042003410436028402200341d4edc60036028002200320034180026a3602f804200341e8046a41ecc0c700103d000b200141246a2802002104200341d8006a41186a200141196a290000370300200341d8006a41106a200141116a290000370300200341d8006a41086a200141096a29000037030020032001290001370358200341e8046a41206a200241206a290200370300200341e8046a41186a200241186a290200370300200341e8046a41106a200241106a290200370300200341e8046a41086a200241086a290200370300200320022902003703e80420034180026a200341e8046a10d60220034198076a41086a220120034180026a41096a29000037030020034198076a41106a220220034180026a41116a29000037030020034198076a41186a220520034180026a41196a29000037030020032003290081023703980702400240024020032d0080024101460d0020034190016a41186a200529030037030020034190016a41106a200229030037030020034190016a41086a200129030037030020032003290398073703900120034198076a20034190016a10cc03200341e8046a200328029807220120032802a00710b80320034180026a41086a200341f2046a29010037030020034180026a41106a200341fa046a29010037030020034180026a41176a2202200341e8046a41196a290000370000200320032901ea043703800220032d00e8044101470d0120032d00e9042105200341d0016a41176a2002290000370000200341d0016a41106a220220034180026a41106a290300370300200341d0016a41086a220620034180026a41086a29030037030020032003290380023703d0010240200328029c07450d00200110260b200341b9016a2006290300370000200341c1016a2002290300370000200341b0016a41186a200341e7016a290000370000200320053a00b001200320032903d0013700b101200341b0016a200341d8006a412010d2060d0b20034180026a200441b00210cf061a200341b0046a41186a200341d8006a41186a290300370300200341b0046a41106a200341d8006a41106a290300370300200341b0046a41086a200341d8006a41086a290300370300200320032903583703b0044110102422020d020c350b200341023a00d80420041098030c320b0240200328029c07450d00200110260b200341d8046a410110f10220041098030c310b200241b889c70036020c200241013602082002428180808010370200411010242201450d32200141d089c70036020c20014101360208200142818080801037020020022002280200417f6a2205360200024020050d002002280208200228020c2802001103000240200228020c280204450d00200228020810260b20022002280204417f6a220536020420050d00200210260b02400240200128020820034180026a200128020c28020c110100450d00200341e8046a20034180026a41b00210cf061a200341a2076a200341b8046a290300370100200341aa076a200341c0046a290300370100200341b2076a200341c8046a290300370100200341ba076a200341d0046a2f01003b010020034180023b019807200320032903b00437019a07200320013602bc07200341d0016a200341e8046a20034198076a10a30320032903d0014201510d010c310b200341f0016a41023a0000200341e8016a41003a000020012001280200417f6a2202360200200342003703d801200342013703d001024020020d002001280208200128020c2802001103000240200128020c280204450d00200128020810260b20012001280204417f6a220236020420020d00200110260b20034180026a1098030b200341e8046a41086a200341d0016a41186a290300370300200341e8046a41106a2201200341f0016a290300370300200341e8046a41186a2202200341f8016a2903003703002003200341d0016a41106a2903003703e80420032903d8014202510d2f200341d8046a41086a20022903003e0200200320012903003703d8040c300b200341d0016a41186a200141196a290000370300200341d0016a41106a200141116a290000370300200341d0016a41086a200141096a290000370300200320012900013703d00120034180026a41186a200141396a29000037030020034180026a41106a200141316a29000037030020034180026a41086a200141296a2900003703002003200141216a29000037038002200341e8046a41206a200241206a290200370300200341e8046a41186a200241186a290200370300200341e8046a41106a200241106a290200370300200341e8046a41086a200241086a290200370300200320022902003703e804200341e8046a10cd030d082003200341d0016a3602b004200341e8046a20034180026a10cc0320032802e804220120032802f004200341b0046a10ce03024020032802ec04450d00200110260b200341f2046a200341d0016a41086a290300370100200341fa046a200341d0016a41106a29030037010020034182056a200341d0016a41186a2903003701002003418a056a20032903800237010020034192056a20034180026a41086a2903003701002003419a056a20034180026a41106a290300370100200341a2056a20034180026a41186a2903003701002003418a083b01e804200320032903d0013701ea04200341e8046a108702200041186a41003a00002000420037030820002003280098073600192000411c6a2003419b076a280000360000200042003703000c300b200141106a2802002107200141026a2f010021082001410c6a2802002109200141086a2802002104200141046a2802002101200341e8046a41206a200241206a290200370300200341e8046a41186a200241186a290200370300200341e8046a41106a200241106a290200370300200341e8046a41086a200241086a290200370300200320022902003703e80420034180026a200341e8046a10d60220034198076a41086a220220034189026a29000037030020034198076a41106a220520034191026a29000037030020034198076a41186a220620034199026a29000037030020032003290081023703980720032d0080024101460d08200341d0016a41186a2006290300370300200341d0016a41106a2005290300370300200341d0016a41086a200229030037030020032003290398073703d001200341e8046a200341d0016a10cf03200341186a20032802e804220520032802f00441d4c0c7004100410010810220032802182102024020032802ec04450d00200510260b20024101460d092008450d0a2009450d0b20092008490d0c200941094b0d0d200941016a210520012102024003402005417f6a22054102490d012002200241206a2206412010d206210a20062102200a4100480d000b200341b0046a410510f1020c2c0b200341086a2009ad4200428090cad2c60e420010cc06200341e8046a200341d0016a2003290308220b4280a0e5b9c291017c220c200341086a41086a290300200c200b54ad7c220b10d902200320032900e904370380022003200341e8046a41086a28000036008702024020032d00e80422024104470d0020034180026a200341d0016a10cf03200328028802210d200328028002210a41002106200341003602f004200342013703e804200341e8046a41004104106d20032802e80420032802f00422026a20073600002003200241046a22023602f004200341e8046a20024110106d20032802e80420032802f00422026a2205200b3700082005200c3700002003200241106a3602f004200341e8046a200910a1012009410574210720032802f00421020340200341e8046a20024120106d20032802e80420032802f00422096a2202200120066a2205290000370000200241086a200541086a290000370000200241106a200541106a290000370000200241186a200541186a2900003700002003200941206a22023602f0042007200641206a2206470d000b200341e8046a20024102106d20032802e804220220032802f00422056a20083b00002003200541026a22053602f004200a200d2002200510b301024020032802ec04450d00200210260b0240200328028402450d00200a10260b0240200441ffffff3f71450d00200110260b200341d8016a290300210c2003410a3b01e804200341e8046a410a6a200c370100200341fa046a200341e0016a29030037010020034182056a200341e8016a290300370100200320032903d0013701ea04200341e8046a108702200341043a00b0040c2d0b200341b0046a41086a200328008702360000200320023a00b00420032003290380023700b1040c2b0b200341b0046a41186a200141196a290000370300200341b0046a41106a200141116a290000370300200341b0046a41086a200141096a290000370300200320012900013703b004200341e8046a41206a200241206a290200370300200341e8046a41186a200241186a290200370300200341e8046a41106a200241106a290200370300200341e8046a41086a200241086a290200370300200320022902003703e80420034180026a200341e8046a10d60220034198076a41086a220120034180026a41096a29000037030020034198076a41106a220220034180026a41116a29000037030020034198076a41186a220420034180026a41196a29000037030020032003290081023703980720032d0080024101460d0d200341d0016a41186a2004290300370300200341d0016a41106a2002290300370300200341d0016a41086a200129030037030020032003290398073703d001200341e8046a200341b0046a10cf03200341306a20032802e804220220032802f00441d4c0c7004100410010810220032802302101024020032802ec04450d00200210260b024020014101470d00200341e8046a200341b0046a200341d0016a10d003200341286a20032802e804220220032802f00441d4c0c7004100410010810220032802282101024020032802ec04450d00200210260b20014101460d0f200341e8046a200341d0016a4280a0e5b9c29101420010d902200320032900e904370380022003200341e8046a41086a220128000036008702024020032d00e80422024104470d00200341e8046a41186a22024200370300200341e8046a41106a2204420037030020014200370300200342003703e80420034180026a41808cc700410610fb01200120034180026a41086a220529000037030020032003290080023703e80420034180026a41ea93c400410610fb01200220052900003703002004200329008002370300200341206a200341e8046a4120108902200328022421012003280220210220034184056a4100360200200342003703f00420034280a0e5b9c291013703e804200342013702fc0420032001410020021b3602f80420034180026a200341b0046a200341d0016a10d0032003280280022201200328028802200341e8046a10d1030240200328028402450d00200110260b200341f2046a200341b0046a41086a290300370100200341fa046a200341b0046a41106a29030037010020034182056a200341b0046a41186a2903003701002003418a056a20032903d00137010020034192056a200341d0016a41086a2903003701002003419a056a200341d0016a41106a290300370100200341a2056a200341d0016a41186a2903003701002003418a023b01e804200320032903b0043701ea04200341e8046a108702200341043a00b0010c2b0b200341b0016a41086a200328008702360000200320023a00b00120032003290380023700b1010c280b200341b0016a410610f1020c260b200341b0016a41186a200141196a290000370300200341b0016a41106a200141116a290000370300200341b0016a41086a200141096a290000370300200320012900013703b001200341b0046a41186a200141396a290000370300200341b0046a41106a200141316a290000370300200341b0046a41086a200141296a2900003703002003200141216a2900003703b004200341e8046a41206a200241206a290200370300200341e8046a41186a200241186a290200370300200341e8046a41106a200241106a290200370300200341e8046a41086a200241086a290200370300200320022902003703e80420034180026a200341e8046a10d60220034198076a41086a220120034180026a41096a29000037030020034198076a41106a220220034180026a41116a29000037030020034198076a41186a220420034180026a41196a29000037030020032003290081023703980702400240024002400240024002400240024020032d0080024101460d00200341d0016a41186a2004290300370300200341d0016a41106a2002290300370300200341d0016a41086a200129030037030020032003290398073703d00120034180026a200341b0016a10cf03200341e8046a200328028002220120032802880210d203200341d8006a41086a2003418c056a280200360200200320034184056a290200370358024020032802fc042206450d002003280280052109200341d8046a41086a200341d8006a41086a280200360200200320032903583703d8040240200328028402450d00200110260b20032802d804210120034198076a200341b0016a200341b0046a10d003200341e8046a200328029807220220032802a00710d303200341e8046a41086a290300210b20032903e804210e200329038005210c20032802fc04210820032802f80421040240200328029c07450d00200210260b2008450d0420034198026a200c3703002003200e37038002200320083602940220032004360290022003200b37038802200ca7210741002102200141014b0d0220010e020803080b0240200328028402450d00200110260b20034180016a410610f1020c2b0b200341023a0080010c2b0b03402001410176220420026a22052002200620054105746a200341d0016a412010d2064101481b2102200120046b220141014b0d000b0b200620024105746a200341d0016a412010d2060d04200c422088a7220a41014b0d0241002101200a0e020103010b20034180016a410910f1020c260b200341e8046a41186a200341d0016a41186a290300370300200341e8046a41106a200341d0016a41106a290300370300200341e8046a41086a200341d0016a41086a290300370300200320032903d0013703e80441002104200341e8046a21020c240b41002101200a210203402002410176220420016a22052001200820054105746a200341d0016a412010d2064101481b2101200220046b220241014b0d000b0b200820014105746a200341d0016a412010d2062204450d01200341e8046a41186a200341d0016a41186a290300370300200341e8046a41106a200341d0016a41106a290300370300200341e8046a41086a200341d0016a41086a290300370300200320032903d0013703e804200341e8046a210220012004411f766a2204200a4d0d222004200a103b000b20034180016a410a10f1020c200b20034180016a410c10f1020c1f0b200341b0046a41186a200141196a290000370300200341b0046a41106a200141116a290000370300200341b0046a41086a200141096a290000370300200320012900013703b004200341e8046a41206a200241206a290200370300200341e8046a41186a200241186a290200370300200341e8046a41106a200241106a290200370300200341e8046a41086a200241086a290200370300200320022902003703e80420034180026a200341e8046a10d60220034198076a41086a220120034180026a41096a29000037030020034198076a41106a220220034180026a41116a29000037030020034198076a41186a220420034180026a41196a29000037030020032003290081023703980702400240024002400240024020032d0080024101460d00200341d0016a41186a2004290300370300200341d0016a41106a2002290300370300200341d0016a41086a200129030037030020032003290398073703d00120034180026a200341b0046a10cf03200341e8046a200328028002220120032802880210d203200341d8006a41086a2003418c056a280200360200200320034184056a290200370358024020032802fc042202450d00200328028005210420032802f8042108200341d8046a41086a200341d8006a41086a280200360200200320032903583703d8040240200328028402450d00200110260b200320032903d8043702940120032f019801210920034180026a200341b0046a200341d0016a10d003200341e8046a200328028002220520032802880210d303200329038005210c20032802fc04210120032802f80421060240200328028402450d00200510260b2001450d02200341e8046a200341d0016a10cc03200341c0006a20032802e804220720032802f00441d4c0c7004100410010810220032802402105024020032802ec04450d00200710260b20054101460d0320034180056a22054200370300200341f8046a22074200370300200341e8046a41086a220a4200370300200342003703e80420034180026a41808cc700410610fb01200a20034180026a41086a220d29000037030020032003290080023703e80420034180026a41ea93c400410610fb012005200d2900003703002007200329008002370300200341386a200341e8046a4120108902200620086a22052006490d042005200328023c410020032802381b4b0d05200c422088a72009490d062003200341b0046a36028002200341e8046a200341d0016a10cc0320032802e804220520032802f00420034180026a10ce03024020032802ec04450d00200510260b200341d0016a10d403200341f2046a200341b0046a41086a290300370100200341fa046a200341b0046a41106a29030037010020034182056a200341b0046a41186a2903003701002003418a056a20032903d00137010020034192056a200341d0016a41086a2903003701002003419a056a200341d0016a41106a290300370100200341a2056a200341d0016a41186a2903003701002003418a083b01e804200320032903b0043701ea04200341e8046a1087020240200c42ffffff3f83500d00200110260b0240200441ffffff3f71450d00200210260b200341043a00b0010c240b0240200328028402450d00200110260b200341b0016a410610f1020c210b200341023a00b0010c210b200341b0016a410910f1020c1e0b200341b0016a411010f1020c1c0b200341b0016a410f10f1020c1b0b200341b0016a410b10f1020c1a0b200341b0016a410d10f1020c190b200341b0046a41186a200141196a290000370300200341b0046a41106a200141116a290000370300200341b0046a41086a200141096a290000370300200320012900013703b004200341e8046a41206a200241206a290200370300200341e8046a41186a200241186a290200370300200341e8046a41106a200241106a290200370300200341e8046a41086a200241086a290200370300200320022902003703e80420034180026a200341e8046a10d60220034198076a41086a220120034180026a41096a29000037030020034198076a41106a220220034180026a41116a29000037030020034198076a41186a220420034180026a41196a29000037030020032003290081023703980720032d0080024101460d0c200341d0016a41186a2004290300370300200341d0016a41106a2002290300370300200341d0016a41086a200129030037030020032003290398073703d00120034180026a200341d0016a200341b0046a10d003200341e8046a2003280280022202200328028802220410d303024020032802fc042201450d002002200410ff010b200328028402210402402001450d00200341f0046a290300210c20032903e804210b200329038005210e02402004450d00200210260b200341e8046a200341b0046a200341d0016a200b200c410010e002200341f2046a200341d0016a41086a290300370100200341fa046a200341d0016a41106a29030037010020034182056a200341d0016a41186a2903003701002003418a056a20032903b00437010020034192056a200341b0046a41086a2903003701002003419a056a200341b0046a41106a290300370100200341a2056a200341b0046a41186a2903003701002003418a063b01e804200320032903d0013701ea04200341e8046a1087020240200e42ffffff3f83500d00200110260b200341043a00b0010c180b02402004450d00200210260b200341b0016a410910f10220032d00b0014104460d1720032902b401210c0c160b200341e8046a41206a200241206a290200370300200341e8046a41186a200241186a290200370300200341e8046a41106a200241106a290200370300200341e8046a41086a200241086a290200370300200320022902003703e80420034180026a200341e8046a10d60220034198076a41086a220120034189026a29000037030020034198076a41106a220220034191026a29000037030020034198076a41186a220420034199026a29000037030020032003290081023703980720032d0080024101460d0e200341d0016a41186a2004290300370300200341d0016a41106a2002290300370300200341d0016a41086a200129030037030020032003290398073703d00120034180026a41998dc700410810fb0120034190016a41b884c300411010fb01412010242201450d0c200342203702b404200320013602b004200341b0046a41004120106d20032802b004220120032802b80422046a220220032903d001370000200241086a200341d0016a41086a290300370000200241106a200341d0016a41106a290300370000200241186a200341d0016a41186a2903003700002003200441206a22023602b804200341d8006a2001200210a202200341f4046a200120026a360200200320013602f0042003200341d8006a41086a3602ec042003200341d8006a3602e804200341b0016a200341e8046a1073024020032802b404450d00200110260b20032802b801220141206a2202417f4c0d0d0240024020020d0041012104410021020c010b200210242204450d0d0b200341003602f004200320043602e804200320023602ec04200341e8046a4100411010c90120032802e80420032802f00422026a2204200329008002370000200441086a20034180026a41086a2900003700002003200241106a22023602f004200341e8046a2002411010c90120032802e80420032802f00422026a2204200329029001370000200441086a20034190016a41086a2902003700002003200241106a22043602f00420032802b0012102200341e8046a2004200110c90120032802e804220420032802f00422056a2002200110cf061a2003200520016a22013602f004024020032802b401450d00200210260b2001417f4c0d0d0240024020010d0041012102410021050c010b200110242202450d0d200121050b200341003602a00720032002360298072003200536029c0720034198076a4100200110c90120032802980720032802a00722026a2004200110cf061a200341ac076a200341f0046a220528020022043602002003200220016a3602a007200320032903e804220c3702a407200341e8046a200ca7200410d50302400240024020032802e8042201450d0020032802ec042102024002402005280200220420032802a0072205490d0020032802980722062001460d0120062001200510d206450d010b2002450d01200110260c010b200341a4076a2105200320043602980120032002360294012003200136029001200341e8046a2001200410d303024020032802fc0422010d00200341003602b801200342013703b001200341bc046a4110360200200320053602e404200341103602b4042003200341d8046a3602b8042003200341e4046a3602b004200320034190016a3602d8042003200341b0016a36025820034194026a41023602002003420237028402200341f0f4c400360280022003200341b0046a36029002200341d8006a41c4e1c00020034180026a10351a20032802b00120032802b80110840220032802b401450d0020032802b00110260b20034180026a41086a220220034190016a41086a2802003602002003200329039001370380020240200341a8076a280200450d0020032802a40710260b2005200329038002370200200541086a200228020036020020010d010b20034180026a200341d0016a10cf03200341e8046a2003280280022202200328028802220410d203024020032802fc042201450d002002200410ff010b200341d8006a41086a22042003418c056a280200360200200320034184056a29020037035802402001450d00200341e8046a41086a290300210c20032903e804210b2003280280052105200341d8046a41086a2004280200360200200320032903583703d8040240200328028402450d00200210260b200341c8006a200341d0016a200b200c10da02200341f2046a200341d8016a290300370100200341fa046a200341e0016a29030037010020034182056a200341e8016a2903003701002003418a0a3b01e804200320032903d0013701ea04200341e8046a1087020240200541ffffff3f71450d00200110260b0240200328029c07450d0020032802980710260b0240200341a8076a280200450d0020032802a40710260b200341043a0080010c170b0240200328028402450d00200210260b20034180016a410610f1020c010b024020032802800541ffffff3f71450d00200110260b20034180016a410e10f1020b0240200328029c07450d0020032802980710260b0240200341a8076a280200450d0020032802a40710260b20032d0080014104460d14200329028401210c0c130b200341b0046a41186a200141196a290000370300200341b0046a41106a200141116a290000370300200341b0046a41086a200141096a290000370300200320012900013703b004200341e8046a41206a200241206a290200370300200341e8046a41186a200241186a290200370300200341e8046a41106a200241106a290200370300200341e8046a41086a200241086a290200370300200320022902003703e80420034180026a200341e8046a10d60220034198076a41086a220120034180026a41096a29000037030020034198076a41106a220220034180026a41116a29000037030020034198076a41186a220420034180026a41196a29000037030020032003290081023703980720032d0080024101460d0e200341d0016a41186a2004290300370300200341d0016a41106a2002290300370300200341d0016a41086a200129030037030020032003290398073703d001200341b0016a200341d0016a10cc03200341e8046a20032802b001220520032802b80110b8032001200341e8046a41096a2900003703002002200341e8046a41116a2900003703002004200341e8046a41196a290000370300200320032900e904370398070240024020032d00e8044101460d0041002101200341003a0080020c010b20034189026a200341a0076a29030037000020034191026a200341a8076a29030037000020034199026a200341b0076a29030037000041012101200341013a0080022003200329039807370081020b024020032802b401450d00200510260b20034181056a200341c8046a290300370000200341f9046a200341c0046a290300370000200341f1046a200341b8046a290300370000200320032903b0043700e904200341013a00e80402402001450d0020034180026a410172200341e8046a410172412010d2060d00200341e8046a200341d0016a10cc0320032802e804220120032802f00410ff01024020032802ec04450d00200110260b200341d0016a10d603200341043a0090010c110b20034190016a410110f10220032d0090014104460d10200329029401210c0c0f0b200341d8046a410110f10220041098030c270b20034190016a41026a200341b0016a41026a2d000022013a0000200320032f00b00122023b019001200041206a41023a0000200041186a41003a000020004200370308200020023b0021200041236a20013a0000200042013703000c270b200341023a00b0040c220b200341b0046a410710f1020c210b200341b0046a410210f1020c200b200341b0046a410310f1020c1f0b200341b0046a410310f1020c1e0b200341b0046a410410f1020c1d0b200341023a00b0010c1a0b200341b0016a410810f1020c170b200341023a00b0010c090b1033000b1034000b200341023a0080010c040b200341023a0090010b20032802900121012000200c370024200041206a2001360000200041186a41003a0000200042003703084201210c0c010b4200210c20004200370308200020032800e804360019200041186a41003a00002000411c6a200341eb046a2800003600000b2000200c3703000c170b20032802800121012000200c370024200041206a2001360000200041186a41003a000020004200370308200042013703000c160b2000420037030820002003280079360019200041186a41003a00002000411c6a200341fc006a280000360000200042003703000c150b20032802b00121012000200c370024200041206a2001360000200041186a41003a000020004200370308200042013703000c140b200042003703082000200328009001360019200041186a41003a00002000411c6a20034193016a280000360000200042003703000c130b200c42ffffff3f83500d00200110260b200441ffffff3f71450d00200210260b20032d00b0014104460d0120032902b401210c0b20032802b00121012000200c370024200041206a2001360000200041186a41003a000020004200370308200042013703000c0f0b200042003703082000200328008001360019200041186a41003a00002000411c6a20034183016a280000360000200042003703000c0e0b200741ffffff3f71450d01200810260c010b0240200a2007470d0020034194026a200a410110930120032802940221080b200820044105746a220141206a2001200a20046b41057410d0061a200141186a200241186a290000370000200141106a200241106a290000370000200141086a200241086a290000370000200120022900003700002003200a41016a36029c02200341e8046a41186a220120034180026a41186a290300370300200341e8046a41106a20034180026a41106a290300370300200341e8046a41086a20034180026a41086a29030037030020032003290380023703e80420034198076a200341b0016a200341b0046a10d003200328029807220220032802a007200341e8046a10d1030240200328029c07450d00200210260b0240200128020041ffffff3f71450d0020032802fc0410260b2003418a056a20032903b004370100200341f2046a200341b0016a41086a290300370100200341fa046a200341b0016a41106a29030037010020034182056a200341b0016a41186a29030037010020034192056a200341b0046a41086a2903003701002003419a056a200341b0046a41106a290300370100200341a2056a200341b0046a41186a2903003701002003418a043b01e804200320032903b0013701ea04200341c2056a200341d0016a41186a290300370100200341ba056a200341d0016a41106a290300370100200341b2056a200341d0016a41086a290300370100200341aa056a20032903d001370100200341e8046a1087020240200941ffffff3f71450d00200610260b200341043a0080010c030b200941ffffff3f71450d00200610260b20032d0080014104460d01200329028401210c0b20032802800121012000200c370024200041206a2001360000200041186a41003a000020004200370308200042013703000c090b2000420037030820002003280079360019200041186a41003a00002000411c6a200341fc006a280000360000200042003703000c080b20032d00b0014104460d020b20032902b401210c0b20032802b00121012000200c370024200041206a2001360000200041186a41003a000020004200370308200042013703000c050b200042003703082000200328009001360019200041186a41003a00002000411c6a20034193016a280000360000200042003703000c040b0240200441ffffff3f71450d00200110260b20032d00b0044104460d0020032802b0042101200020032902b404370024200041206a2001360000200041186a41003a000020004200370308200042013703000c030b20004200370308200020032800b001360019200041186a41003a00002000411c6a200341b3016a280000360000200042003703000c020b200341043a00d8040b20041026024020032d00d8044104460d0020032802d8042101200020032902dc04370024200041206a2001360000200041186a41003a000020004200370308200042013703000c010b200042003703082000200328008001360019200041186a41003a00002000411c6a20034183016a280000360000200042003703000b200341c0076a24000f0b102c000b8d0401057f230041e0006b22022400200241998dc700410810fb01200241106a41b58dc700410510fb0102400240412010242203450d002002422037023420022003360230200241306a41004120106d20022802302203200228023822046a22052001290000370000200541086a200141086a290000370000200541106a200141106a290000370000200541186a200141186a2900003700002002200441206a2201360238200241c0006a2003200110bc02200241dc006a200320016a360200200220033602582002200241c0006a41106a3602542002200241c0006a360250200241206a200241d0006a107302402002280234450d00200310260b2002280228220341206a2205417f4c0d010240024020050d0041012101410021050c010b200510242201450d010b20002001360200200041086a220141003602002000200536020420004100411010c9012000280200200128020022056a220420022900003700002001200541106a2205360200200441086a200241086a29000037000020002005411010c9012000280200200128020022056a220420022900103700002001200541106a2206360200200441086a200241106a41086a2900003700002002280220210520002006200310c9012000280200200128020022006a2005200310cf061a2001200020036a36020002402002280224450d00200510260b200241e0006a24000f0b1033000b1034000bcc0101027f20002802242101024020002d00000d0020002d0001210020012001280200417f6a2202360200024020020d002001280208200128020c2802001103000240200128020c280204450d00200128020810260b20012001280204417f6a220236020420020d00200110260b200041ff01714100470f0b20012001280200417f6a2200360200024020000d002001280208200128020c2802001103000240200128020c280204450d00200128020810260b20012001280204417f6a220036020420000d00200110260b41010bb00101047f230041106b22032400200228020021020240412010242204450d002003422037020420032004360200200341004120106d20032802002205200328020822066a22042002290000370000200441086a200241086a290000370000200441106a200241106a290000370000200441186a200241186a2900003700002003200641206a2202360208200020012005200210b30102402003280204450d00200510260b200341106a24000f0b1033000b930401057f230041e0006b22022400200241086a41998dc700410810fb01200241186a41d883c300410b10fb0102400240412010242203450d002002422037023c20022003360238200241386a41004120106d20022802382203200228024022046a22052001290000370000200541086a200141086a290000370000200541106a200141106a290000370000200541186a200141186a2900003700002002200441206a2201360240200241c8006a2003200110a202200241dc006a200320016a360200200220033602582002200241c8006a41086a3602542002200241c8006a360250200241286a200241d0006a10730240200228023c450d00200310260b2002280230220341206a2205417f4c0d010240024020050d0041012101410021050c010b200510242201450d010b20002001360200200041086a220141003602002000200536020420004100411010c9012000280200200128020022056a220420022900083700002001200541106a2205360200200441086a200241086a41086a29000037000020002005411010c9012000280200200128020022056a220420022900183700002001200541106a2206360200200441086a200241186a41086a2900003700002002280228210520002006200310c9012000280200200128020022006a2005200310cf061a2001200020036a3602000240200228022c450d00200510260b200241e0006a24000f0b1033000b1034000ba80601057f230041f0006b22032400200341086a41998dc700410810fb01200341186a41b884c300411010fb0102400240412010242204450d002003422037024c20032004360248200341c8006a41004120106d20032802482204200328025022056a22062001290000370000200641086a200141086a290000370000200641106a200141106a290000370000200641186a200141186a2900003700002003200541206a2201360250200341386a2004200110a202200341ec006a200420016a360200200320043602682003200341386a41086a3602642003200341386a360260200341286a200341e0006a10730240200328024c450d00200410260b412010242201450d002003422037024c20032001360248200341c8006a41004120106d20032802482201200328025022066a22042002290000370000200441086a200241086a290000370000200441106a200241106a290000370000200441186a200241186a2900003700002003200641206a2202360250200341d8006a2001200210a202200341ec006a200120026a360200200320013602682003200341d8006a41086a3602642003200341d8006a360260200341386a200341e0006a10730240200328024c450d00200110260b20032802302202200328024022046a41206a2206417f4c0d010240024020060d0041012101410021060c010b200610242201450d010b20002001360200200041086a220141003602002000200636020420004100411010c9012000280200200128020022066a220520032900083700002001200641106a2206360200200541086a200341086a41086a29000037000020002006411010c9012000280200200128020022066a220520032900183700002001200641106a2207360200200541086a200341186a41086a2900003700002003280228210620002007200210c9012000280200200128020022056a2006200210cf061a2001200520026a22053602002003280238210220002005200410c9012000280200200128020022006a2002200410cf061a2001200020046a3602000240200328023c450d00200210260b0240200328022c450d00200610260b200341f0006a24000f0b1033000b1034000bd90203037f027e027f230041106b22032400200341003602082003420137030020022802102104200341004104106d2003280200200328020822056a20043600002003200541046a2204360208200241086a290300210620022903002107200320044110106d2003280200200328020822046a22052006370008200520073700002003200441106a3602082002280214210420032002411c6a280200220210a1010240024020020d0020032802002108200328020821020c010b20024105742105200328020821020340200320024120106d20032802002208200328020822096a22022004290000370000200241086a200441086a290000370000200241106a200441106a290000370000200241186a200441186a2900003700002003200941206a2202360208200441206a2104200541606a22050d000b0b200020012008200210b30102402003280204450d00200810260b200341106a24000b920403047f037e047f230041e0006b220324002003200236020c20032001360208200341106a2001200210820202400240200328021022010d00200041003602140c010b200328021421042003200341186a28020022023602242003200136022002400240024020024104490d00200128000021052003200141046a36022020032002417c6a220636022420064110490d0020032002416c6a3602242003200141146a3602202001410c6a290000210720012900042108200341c8006a200341206a10920120032802482202450d00200329024c21092003280224220641024f0d01200942ffffff3f83500d00200210260b20034100360230200342013703282003410e36023c2003200341086a3602382003200341286a360244200341dc006a41013602002003420137024c2003418c8dc6003602482003200341386a360258200341c4006a41c4e1c000200341c8006a10351a200328022820032802301084020240200328022c450d00200328022810260b200041003602140c010b200341386a41046a200341286a41046a2f0100220a3b010020032003280128220b3602382003280220220c2f0000210d20032006417e6a3602242003200c41026a3602202000200737030820002008370300200041206a200d3b01002000200937031820002002360214200020053602102000200b360122200041266a200a3b01000b2004450d00200110260b200341e0006a24000b930302047f037e230041e0006b220324002003200236020c20032001360208200341106a2001200210820202400240200328021022010d00200041003602140c010b200328021421042003200341186a2802002202360224200320013602200240024020024104490d00200128000021052003200141046a36022020032002417c6a220636022420064110490d0020032002416c6a3602242003200141146a3602202001410c6a290000210720012900042108200341c8006a200341206a10920120032802482202450d00200329024c210920002007370308200020083703002000200937031820002002360214200020053602100c010b20034100360230200342013703282003410e36023c2003200341086a3602382003200341286a360244200341dc006a41013602002003420137024c2003418c8dc6003602482003200341386a360258200341c4006a41c4e1c000200341c8006a10351a200328022820032802301084020240200328022c450d00200328022810260b200041003602140b2004450d00200110260b200341e0006a24000bb70203027f017e027f23004180026b22012400200141086a200010d803200141e0006a200128020822002001280210220210d90320012903602103200141b8016a200141e8006a41c40010cf061a200141b4016a41026a2204200141af016a2d00003a0000200120012f00ad013b01b4010240024020034201510d0041002105200141186a410041c40010d1061a0c010b20012d00ac012105200141186a200141b8016a41c40010cf061a200141146a41026a20042d00003a0000200120012f01b4013b01140b200141e8006a200141186a41c40010cf062104200141af016a200141166a2d00003a00002001200541ff017141016a220541ff01200541ff01491b3a00ac0120014201370360200120012f01143b00ad0120002002200410da030240200128020c450d00200010260b20014180026a24000b130020002002ad4220862001ad84101f10c5060bb50203027f017e027f23004180026b22012400200141086a200010d803200141e0006a200128020822002001280210220210d90320012903602103200141b8016a200141e8006a41c40010cf061a200141b4016a41026a2204200141af016a2d00003a0000200120012f00ad013b01b4010240024020034201510d0041002105200141186a410041c40010d1061a0c010b20012d00ac012105200141186a200141b8016a41c40010cf061a200141146a41026a20042d00003a0000200120012f01b4013b01140b200141e8006a200141186a41c40010cf062104200141af016a200141166a2d00003a00002001200541ff017122054101200541014b1b417f6a3a00ac0120014201370360200120012f01143b00ad0120002002200410da030240200128020c450d00200010260b20014180026a24000ba7220a037f027e037f067e027f027e037f077e047f027e23004190046b220624000240024002400240024002400240024002402003200484500d0020012002460d0020012002412010d206450d00200641306a200210d803200641c0006a200628023022072006280238220810d903200629034021094200210a2006420037034020064188016a280200210b20062d008c01210c024002402009420151220d0d0020064190016a41306a420037030020064190016a41286a4200370300200641b0016a420037030020064190016a41186a4200370300200641a0016a420037030020064198016a420037030020064200370390014200210e4200210f0c010b200641f8006a2903002110200641c0006a41306a2903002111200641c0006a41206a2903002112200641c0006a41186a290300211320064180016a290300210f2006290350210e2006290348210a200641b0016a200641c0006a41286a29030037030020064190016a41286a201137030020064190016a41306a2010370300200641a0016a2013370300200620123703a8012006200a370390012006200e370398010b200641c8016a200110d803200641d8016a20062802c801221420062802d001221510d90320062903d801211642002117200642003703d801200641a0026a280200211820062d00a4022119024002402016420152221a450d004200211b4200211c4200211d4200211e4200211f42002112420021130c010b200641f0016a290300211f20062903e801211320062903e001211220064190026a290300211d20064188026a290300211c20064180026a290300211b200641f8016a290300211720064198026a290300211e0b0240201220037d2220201256201320047d2012200354ad7d221020135620102013511b0d00200a20037c2221200a542222200e20047c2022ad7c2211200e542011200e511b0d0220062021370390012006201137039801024002400240427f202120062903a0017c2212201220215422222011200641a8016a2903007c2022ad7c221220115420122011511b22221b4280c8afa025544100427f201220221b501b0d00200641b8026a200110d80320064190036a20062802b802222320062802c00210d903200641c0036a290300420020062903900342015122221b2112200641b8036a290300420020221b2113024020062802bc02450d00202310260b2013202056201220105620122010511b0d0120062006290081033703f002200620064188036a2800003600f7020c020b200641a8026a410510eb020c060b20064180036a410210eb0220062006290081033703f002200620064180036a41086a2800003600f70220062d00800322224104470d040b0240024020050d0020204280c8afa0255441002010501b0d010c080b200641b8026a200110d80320064190036a20062802b802220520062802c00210d90320062d00dc0321222006290390032112024020062802bc02450d00200510260b202042ffc7afa0255620104200522010501b0d0720124201520d07202241ff0171450d070b200641a8026a410610eb020c040b200641a8026a410410eb02200a2121200e211120122120201321100c030b200041043a00000c070b200641a8026a410310eb02200a2121200e21110c010b200641a8026a41086a20062800f702360000200620223a00a802200620062903f0023700a9020c010b20062d00a8024104460d020b20062902ac0222104280807c8321122010420888a7211520062802a80221052010a721224101211a0c020b200641043a00a8020b200641d8026a201b370300200641e0026a201c370300200641e8026a201d370300200620173703d0022006201f3703c802200620203703b802200620103703c00202400240427f2020201f7c221220122020542205201020177c2005ad7c221220105420122010511b22051b22134280c8afa025544100427f201220051b2212501b0d00200641c8026a290300211220062903c002210a20062903b802210e4201211f0c010b024002402020201f8420102017848450450d004200211f0c010b4200211f20064190036a41186a2222420037030020064190036a41106a2223420037030020064190036a41086a22054200370300200642003703900320064180036a419a8cc700410810fb01200520064180036a41086a222429000037030020062006290080033703900320064180036a41b8a1c300410d10fb01202220242900003703002023200629008003370300200641186a20064190036a108d02200641186a41106a290300210a2006290320210e20062802182125202242003703002023420037030020054200370300200642003703900320064180036a419a8cc700410810fb012005202429000037030020062006290080033703900320064180036a41b8a1c300410d10fb0120222024290000370300202320062900800337030020064200200a420020251b220a20127d200e420020251b220e201354ad7d2226200e20137d2227200e562026200a562026200a511b22221b3703880320064200202720221b3703800320064190036a412020064180036a411010b301200641c8036a2012370300200641c0036a2013370300200541013a000020064199036a2001290000370000200641a1036a200141086a290000370000200641a9036a200141106a290000370000200641b1036a200141186a290000370000200641023a00900320064190036a1087020b0b20164201512122201aad211320064180026a201b370300200641f8016a201737030020064198026a201e37030020064188026a201c370300200641e8016a200a37030020064190026a201d370300200641f0016a20123703002006200e3703e0014100211a200620194100201642015122051b3a00a40220062018410020051b3602a0022006201f4201512205ad3703d8010240024020050d002014201510ff0142002112410021150c010b20142015200641e0016a10da0342002112410121150b0b024020062802cc01450d00201410260b0240024002400240201a0d000240201541ff01712205450d00202241ff0171450d020b20050d02202241ff0171450d0220064190036a41086a41043a000020064199036a2001290000370000200641a1036a200141086a290000370000200641a9036a200141106a290000370000200641b1036a200141186a290000370000200641003a00900320064190036a1087020c020b2015ad42ff01834208862022ad42ff0183842012842112200541807e7121140c020b20064190036a41086a41033a000020064199036a2001290000370000200641a1036a200141086a290000370000200641a9036a200141106a290000370000200641b1036a200141186a290000370000200641003a00900320064190036a1087020b420121124100211441042105024020134201510d00201321120c010b200641c8036a2010370300200641c0036a20203703004100211420064190036a41086a41003a000020064199036a2001290000370000200641a1036a200141086a290000370000200641a9036a200141106a290000370000200641b1036a200141186a290000370000200641023a00900320064190036a1087020b200641b8026a41206a222220064190016a41306a290300370300200641b8026a41186a221a20064190016a41286a290300370300200641c8026a221520064190016a41206a290300370300200641c0026a221820064190016a41186a290300370300200620062903a0013703b80202400240200541ff017122054104460d0020124280807c832113201420057221052012420888a721222012a7210d410121140c010b20094201522105200641d8016a41186a20182903002212370300200641d8016a41206a2015290300370300200641d8016a41286a201a290300370300200641d8016a41306a2022290300370300200620062903b80222133703e801200620213703d801200620113703e00102400240427f202120137c221020102021542214201120127c2014ad7c221020115420102011511b22141b22204280c8afa025544100427f201020141b2210501b0d00200641e8016a290300211220064188026a290300211320064180026a2903002120200641f8016a290300210a20062903e001210e20062903d80121174201211f20062903f00121160c010b02400240202120138420112012848450450d004200211f0c010b4200211f20064190036a41186a2222420037030020064190036a41106a221a420037030020064190036a41086a22144200370300200642003703900320064180036a419a8cc700410810fb01201420064180036a41086a221529000037030020062006290080033703900320064180036a41b8a1c300410d10fb0120222015290000370300201a200629008003370300200620064190036a108d02200641106a2903002112200629030821132006280200211820224200370300201a420037030020144200370300200642003703900320064180036a419a8cc700410810fb012014201529000037030020062006290080033703900320064180036a41b8a1c300410d10fb0120222015290000370300201a200629008003370300200642002012420020181b221220107d2013420020181b2213202054ad7d220a201320207d220e201356200a201256200a2012511b22221b3703880320064200200e20221b3703800320064190036a412020064180036a411010b301200641c8036a2010370300200641c0036a2020370300201441013a000020064199036a2002290000370000200641a1036a200241086a290000370000200641a9036a200241106a290000370000200641b1036a200241186a290000370000200641023a00900320064190036a1087020b0b2005ad2110200641e8006a200a370300200641f0006a2020370300200641d0006a200e370300200641f8006a2013370300200641d8006a2012370300200620163703602006200f3703800120062017370348410021142006200c4100200942015122051b3a008c012006200b410020051b360288012006201f4201512205ad3703400240024020050d002007200810ff0142002113410021220c010b20072008200641c8006a10da0342002113410121220b0b02402006280234450d00200710260b024002400240024020140d000240202241ff01712205450d00200d41ff0171450d020b20050d02200d41ff0171450d0220064190036a41086a41043a000020064199036a2002290000370000200641a1036a200241086a290000370000200641a9036a200241106a290000370000200641b1036a200241186a290000370000200641003a00900320064190036a1087020c020b200541ff01714104460d02200020053a0000200041036a20054118763a0000200020054108763b0001200041046a2022ad42ff0183420886200dad42ff0183842013843700000c030b20064190036a41086a41033a000020064199036a2002290000370000200641a1036a200241086a290000370000200641a9036a200241106a290000370000200641b1036a200241186a290000370000200641003a00900320064190036a1087020b20104201520d00200641c8036a2011370300200641c0036a202137030020064190036a41086a41003a000020064199036a2002290000370000200641a1036a200241086a290000370000200641a9036a200241106a290000370000200641b1036a200241186a290000370000200641023a00900320064190036a1087020b200641e8036a2004370300200641e0036a200337030020064190036a41086a41023a000020064199036a2001290000370000200641b9036a2002290000370000200641a1036a200141086a290000370000200641a9036a200141106a290000370000200641b1036a200141186a290000370000200641c1036a200241086a290000370000200641c9036a200241106a290000370000200641d1036a200241186a290000370000200641023a00900320064190036a108702200041043a00000b20064190046a24000b8d0401057f230041e0006b22022400200241808cc700410610fb01200241106a41e292c400410710fb0102400240412010242203450d002002422037023420022003360230200241306a41004120106d20022802302203200228023822046a22052001290000370000200541086a200141086a290000370000200541106a200141106a290000370000200541186a200141186a2900003700002002200441206a2201360238200241c0006a2003200110bc02200241dc006a200320016a360200200220033602582002200241c0006a41106a3602542002200241c0006a360250200241206a200241d0006a107302402002280234450d00200310260b2002280228220341206a2205417f4c0d010240024020050d0041012101410021050c010b200510242201450d010b20002001360200200041086a220141003602002000200536020420004100411010c9012000280200200128020022056a220420022900003700002001200541106a2205360200200441086a200241086a29000037000020002005411010c9012000280200200128020022056a220420022900103700002001200541106a2206360200200441086a200241106a41086a2900003700002002280220210520002006200310c9012000280200200128020022006a2005200310cf061a2001200020036a36020002402002280224450d00200510260b200241e0006a24000f0b1033000b1034000b9b0406027f017e017f017e027f057e230041d0006b220324002003200236020420032001360200200341086a2001200210820202400240200328020822010d00200042003703000c010b200328020c2102024002400240200341106a28020022044104490d0020044104460d002004417b6a4110490d002004416b6a4110490d002004415b6a4110490d002004414b6a410f4b0d010b20034100360220200342013703182003410e36022c200320033602282003200341186a360234200341cc006a41013602002003420137023c2003418c8dc6003602382003200341286a360248200341346a41c4e1c000200341386a10351a200328021820032802201084020240200328021c450d00200328021810260b420021050c010b2001280000210420012d000421062001410d6a290000210520012900052107200341186a41026a200341386a41026a2d000022083a0000200320032f003822093b01182001411d6a290000210a2001412d6a290000210b2001290015210c2001290025210d2001290035210e200041c0006a2001413d6a290000370300200041386a200e370300200041306a200b370300200041286a200d370300200041206a200a370300200041186a200c370300200041106a200537030020002007370308200020063a004c200041c8006a2004360200200020093b004d200041cf006a20083a0000420121050b200020053703002002450d00200110260b200341d0006a24000ba30101037f230041106b22032400200341003602082003420137030020022802402104200341004104106d2003280200200328020822056a20043600002003200541046a220436020820022d00442105200320044101106d2003280200200328020822046a20053a00002003200441016a3602082003200210a6012000200120032802002202200328020810b30102402003280204450d00200210260b200341106a24000bba0302057f017e230041c0016b2202240002400240410410242203450d002002420437022c20022003360228200241286a41004104106d2002280228200228023022036a41f0c2c98b063600002002200341046a220336023020012802002101200241286a20034104106d20022802282204200228023022036a20013600002002200341046a2201360230200241003a007820042105410021030340200241003a0038200241386a20052001410047220610cf061a024020010d00200241003a00380b20012006490d02200241d8006a20036a20022d00383a00002002200341016a22033a0078200120066b2101200520066a210520034120470d000b200241386a41186a200241d8006a41186a2903002207370300200241086a41086a2201200241d8006a41086a290300370300200241086a41106a2203200241d8006a41106a290300370300200241086a41186a22062007370300200220022903583703080240200228022c450d00200410260b20002002290308370000200041186a2006290300370000200041106a2003290300370000200041086a2001290300370000200241c0016a24000f0b1033000b2006200141f0b1c7001048000b96810108057f017e167f017e087f017e027f067e230022012102200141a0176b41607122032400200341206a200010dd03200341a0146a200328022022012003280228220410de030240024020032802a01422050d0041082105420021060c010b2001200410ff0120032902a41421060b02402003280224450d00200110260b20052006422088a7220741f0026c6a21082006a721090240024002400240024002400240024020070d00200521010c010b200341a0146a41046a210a200341206a41046a210b20034180096a41046a210c4100210d200341a0036a41286a210e200341a0036a41206a210f200341a0036a41186a2110200341a0036a41106a2111200341a0036a41086a211241002113024002400340200341d0036a2005200d6a220141bc0210cf061a200141bc026a2802002104200e200141e8026a290300370300200f200141e0026a2903003703002010200141d8026a2903003703002011200141d0026a2903003703002012200141c8026a2903003703002003200141c0026a2903003703a00320044103460d02200c200341d0036a41bc0210cf062114200341206a20034180096a41c00210cf061a200341e0116a200b41bc0210cf061a200341b0116a41286a200e290300370300200341b0116a41206a200f290300370300200341b0116a41186a2010290300370300200341b0116a41106a2011290300370300200341b0116a41086a2012290300370300200320032903a0033703b01120044102470d01200d41f0026a210d201341016a2113200141f0026a2008470d000b200821010c020b200a200341e0116a41bc0210cf062115200341e00e6a200341a0146a41c00210cf061a200341b00e6a41286a220e200341b0116a41286a290300370300200341b00e6a41206a220f200341b0116a41206a290300370300200341b00e6a41186a2210200341b0116a41186a290300370300200341b00e6a41106a2211200341b0116a41106a290300370300200341b00e6a41086a2212200341b0116a41086a290300370300200320032903b0113703b00e200341c0066a200341e00e6a41c00210cf061a20034190066a41286a220c200e29030037030020034190066a41206a220e200f29030037030020034190066a41186a220f201029030037030020034190066a41106a2210201129030037030020034190066a41086a22112012290300370300200320032903b00e37039006200341f00b6a200341c0066a41c00210cf061a200341c00b6a41286a2212200c290300370300200341c00b6a41206a220c200e290300370300200341c00b6a41186a220e200f290300370300200341c00b6a41106a220f2010290300370300200341c00b6a41086a2210201129030037030020032003290390063703c00b200341a0146a200341f00b6a41c00210cf061a200341206a41286a22112012290300370300200341206a41206a2212200c290300370300200341206a41186a220c200e290300370300200341206a41106a220e200f290300370300200341206a41086a220f2010290300370300200320032903c00b37032041f8021024220a450d03200a2013360200200a41046a200341a0146a41c00210cf061a200a20043602c402200a20032903203703c802200a41d0026a200f290300370300200a41d8026a200e290300370300200a41e0026a200c290300370300200a41e8026a2012290300370300200a41f0026a201129030037030041012116024002400240200741f0026c41907d6a200d470d00410121170c010b200341d0036a200141f0026a41bc0210cf061a200141ac056a2802002104200341a0036a41286a220d200141d8056a290300370300200341a0036a41206a220e200141d0056a290300370300200341a0036a41186a220f200141c8056a290300370300200341a0036a41106a2210200141c0056a290300370300200341a0036a41086a2211200141b8056a2903003703002003200141b0056a2903003703a003200141e0056a2112024020044103470d0041012117201221010c020b41012116410121170340201341016a211320122101024003402014200341d0036a41bc0210cf061a200341206a20034180096a41c00210cf061a200341e0116a200b41bc0210cf061a200341b0116a41286a2212200d290300370300200341b0116a41206a220c200e290300370300200341b0116a41186a2207200f290300370300200341b0116a41106a22182010290300370300200341b0116a41086a22192011290300370300200320032903a0033703b01120044102470d0120082001460d03200341d0036a200141bc0210cf061a200141bc026a2802002104200d200141e8026a290300370300200e200141e0026a290300370300200f200141d8026a2903003703002010200141d0026a2903003703002011200141c8026a2903003703002003200141c0026a2903003703a003201341016a2113200141f0026a210120044103460d040c000b0b2015200341e0116a41bc0210cf061a200341e00e6a200341a0146a41c00210cf061a200341b00e6a41286a221a2012290300370300200341b00e6a41206a2212200c290300370300200341b00e6a41186a220c2007290300370300200341b00e6a41106a22072018290300370300200341b00e6a41086a22182019290300370300200320032903b0113703b00e200341c0066a200341e00e6a41c00210cf061a20034190066a41286a2219201a29030037030020034190066a41206a221a201229030037030020034190066a41186a2212200c29030037030020034190066a41106a220c200729030037030020034190066a41086a22072018290300370300200320032903b00e37039006200341f00b6a200341c0066a41c00210cf061a200341c00b6a41286a22182019290300370300200341c00b6a41206a2219201a290300370300200341c00b6a41186a221a2012290300370300200341c00b6a41106a2212200c290300370300200341c00b6a41086a220c200729030037030020032003290390063703c00b200341a0146a200341f00b6a41c00210cf061a200341206a41286a22072018290300370300200341206a41206a22182019290300370300200341206a41186a2219201a290300370300200341206a41106a221a2012290300370300200341206a41086a221b200c290300370300200320032903c00b370320024020172016470d00024002400240201641016a22122016490d002016410174220c2012200c20124b1b22124104201241044b1bad42f8027e2206422088a7220c0d002006a722124100480d00201641f8026c201c20161b211c0240200a410020161b220a0d0020120d0241004108200c4100471b210a0c030b201c2012460d020240201c0d0020120d024108210a0c030b200a201c20121028220a450d0e0c020b102e000b20121024220a450d0c0b201241f8026e21160b200a201741f8026c6a22122013360200201241046a200341a0146a41c00210cf061a201241c4026a2004360200201241c8026a2003290320370300201241d0026a201b290300370300201241d8026a201a290300370300201241e0026a2019290300370300201241e8026a2018290300370300201241f0026a2007290300370300201741016a211720082001460d01200341d0036a200141bc0210cf061a200141bc026a2802002104200d200141e8026a290300370300200e200141e0026a290300370300200f200141d8026a2903003703002010200141d0026a2903003703002011200141c8026a2903003703002003200141c0026a2903003703a003200141f0026a211220044103470d000b200141f0026a21010c010b200821010b024020082001460d000340200141f0026a21040240200141bc026a2802004102460d000240200141b0026a280200220d450d00200141b4026a280200450d00200d10260b200110d5010b2004210120082004470d000b0b02402009450d00200941f0026c450d00200510260b024020174115490d002017410176ad42f8027e2206422088a70d052006a7221b417f4c0d05201b10242215450d04410021112003410036022820034204370320200a41887d6a211c200a418c7a6a211a410421122017210c0340200c210f4100210c4101210e0240200f417f6a220b450d00024002400240024002400240200a200b41f8026c6a41f4026a2d0000200f41f8026c2210200a6a41847d6a2d00002201490d00200f417e6a2113201a20106a21084100210c410021040340024020132004470d00200f210e0c080b200441016a2104200141ff0171210d20082d00002101200841887d6a2108200d20014f0d000b200441016a210e2004417f73200f6a21040c010b201a20106a2108200b210402400340024020044101470d00410021040c020b2004417f6a2104200141ff0171210d20082d00002101200841887d6a2108200d2001490d000b0b200f2004490d02200f20174b0d01200f20046b220e410176220d450d00200a200441f8026c6a2101201c20106a21080340200341a0146a200141f80210cf061a2001200841f80210d00641f8026a21012008200341a0146a41f80210cf0641887d6a2108200d417f6a220d0d000b0b024020040d002004210c0c050b0240200e41094d0d002004210c0c050b200f20174b0d02200a200441f8026c6a21100340200f2004417f6a220c490d040240200f200c6b220e4102490d00200a200441f8026c6a220141f4026a2d0000200a200c41f8026c6a220841f4026a2d000022134f0d00200341a0146a200841f40210cf061a200341e00e6a41026a2205200841f7026a2d00003a00002003200841f5026a2f00003b01e00e2008200141f80210cf061a0240200e4103490d00200b2108201021010340200141ec056a2d000020134f0d012001200141f8026a220d41f80210cf061a200d210120042008417f6a2208470d000b200d21010b2001200341a0146a41f40210cf06220141f4026a20133a0000200141f5026a20032f01e00e3b0000200141f7026a20052d00003a00000b200c450d05201041887d6a2110200c2104200e410a4f0d050c000b0b200f201741c4ccc5001047000b2004200f41c4ccc5001048000b200f2004417f6a220c490d00200f201741d4ccc5001047000b200c200f41d4ccc5001048000b024020112003280224470d00200341206a10bf0120032802202112200328022821110b201220114103746a2201200e3602042001200c3602002003201141016a220b36022802400240200b41024f0d00200b2111200c450d010c020b0240034002400240024002402012200b2211417f6a220b4103746a2201280200450d00201141037420126a221341746a280200220d200128020422044d0d00201141024d0d0520122011417d6a22014103746a28020422082004200d6a4d0d01201141034d0d05201341646a2802002008200d6a4d0d010c050b20114103490d012001280204210420122011417d6a22014103746a28020421080b20082004490d010b2011417e6a21010b02400240024002400240024002402011200141016a22094d0d00201120014d0d012012200141037422076a2201280204221820012802006a22012012200941037422196a22042802002214490d02200120174b0d03200a201441f8026c6a22102004280204220541f8026c22046a210d200141f8026c210e200120146b221320056b220120054f0d042015200d200141f8026c220410cf06221320046a210820054101480d0520014101480d05201c200e6a210e200d21040340200e200441887d6a220d200841887d6a220f2008417c6a2d00002004417c6a2d00004922011b41f80210cf06210e2008200f20011b210802402010200d200420011b2204490d00201321010c080b200e41887d6a210e2013210120132008490d000c070b0b2009201141e4ccc5001032000b2001201141f4ccc5001032000b201420014184cdc5001048000b200120174184cdc5001047000b20152010200410cf06220120046a2108024020054101480d00201320054c0d00200a200e6a210f20012101201021040340200d2001200d41f4026a2d0000200141f4026a2d00004922131b210e2001200141f8026a20131b21012004200e41f80210cf0641f8026a2104200d41f8026a200d20131b220d200f4f0d03200820014b0d000c030b0b20102104200121010c010b200d2104201321010b20042001200820016b2208200841f802706b10cf061a201220076a2201201820056a36020420012014360200201220196a2201200141086a20112009417f736a41037410d0061a2003200b36022841012111200b41014b0d000b0b200c0d010b0b0240200328022441ffffffff0171450d00201210260b201b41f802702101201b41f802490d03201b2001460d03201510260c030b20174102490d02200a2017417f6a220441f8026c6a210e4100210f0340024002400240201720042201417f6a2204490d00201720046b220d4102490d02200a200141f8026c6a220141f4026a2d0000200a200441f8026c6a220841f4026a2d000022134f0d02200341a0146a200841f40210cf061a200341e00e6a41026a2210200841f7026a2d00003a00002003200841f5026a2f00003b01e00e2008200141f80210cf061a200d4103490d01200f2108200e21010340200141ec056a2d000020134f0d022001200141f8026a220d41f80210cf061a200d21012008417f6a22080d000b200d21010c010b2004201741a4ccc5001048000b2001200341a0146a41f40210cf06220141f4026a20133a0000200141f5026a20032f01e00e3b0000200141f7026a20102d00003a00000b200f41016a210f200e41887d6a210e20040d000c030b0b200141f0026a21010b024020082001460d000340200141f0026a21040240200141bc026a2802004102460d000240200141b0026a280200220d450d00200141b4026a280200450d00200d10260b200110d5010b2004210120082004470d000b0b410021164108210a02402009450d00200941f0026c450d00200510260b410021170b200a201741f8026c6a210e0240024020170d004200211d200a21040c010b200341206a41b0026a211e200341a0146a41c0026a2104200341206a41c0026a2108200041016a211f200341bd146a2120200341a0146a41106a2110200341b0116a41086a210f200341206a41d0026a2121200341206a41046a212242c0a187f0002106200341d0036a41286a2105200341d0036a41206a210b200341d0036a41186a2114200341e1066a222341076a2124410021114200211d200a21010240034020012802002125200341e00e6a200141046a41c00210cf061a200141c4026a280200210d2005200141f0026a290300370300200b200141e8026a2903003703002014200141e0026a290300370300200341d0036a41106a220c200141d8026a290300370300200341d0036a41086a2212200141d0026a2903003703002003200141c8026a2903003703d0030240200d4102470d00200141f8026a21040c030b200341206a200341e00e6a41c00210cf061a200341a0146a202241bc0210cf061a200420032903d003370300200441086a22132012290300370300200441106a2212200c290300370300200441186a220c2014290300370300200441206a2209200b290300370300200441286a220720052903003703002003200d3602dc16200341f00b6a200341a0146a10a10320032903f00b212620032802dc16210d20032802d016211820034180096a200341a0146a41bc0210cf061a200341e0116a41286a22192007290300370300200341e0116a41206a22172009290300370300200341e0116a41186a2215200c290300370300200341e0116a41106a221c2012290300370300200341e0116a41086a221a2013290300370300200320042903003703e011200d4102460d01427f427f427f200620267c222620262006541b220642c0b2cd3b7c222620262006541b427f200642c0f0f50b7c222620262006541b20181b220642c0b2cd3b7c222620262006541b2006200d4101461b2106200341206a20034180096a41bc0210cf061a200841286a22182019290300370300200820032903e011370300200841086a2219201a290300370300200841106a221a201c290300370300200841186a221c2015290300370300200841206a221520172903003703002003200d3602dc0202400240024020032d008c0341c000490d002011450d0020064280c0a8ca9a3a560d010b200341f00b6a200341206a10df030240024020032d00e8024101460d004102211b02400240024020032d00e9020e03000102000b4100211b0c010b200f202141086a290000370300200341b0116a41106a202141106a290000370300200341b0116a41186a202141186a2f00003b0100200320212900003703b0114101211b20032802ec02212720032f01ea0221280b200341a0146a41186a200341b0116a41186a2f01003b01002010200341b0116a41106a290300370300200341a0146a41086a200f290300370300200320032903b0113703a0144100210c202721090c010b4101210c20032802ec0221090b200341b00e6a41186a2207200341a0146a41186a280200360200200341b00e6a41106a22182010290300370300200341b00e6a41086a2219200341a0146a41086a2212290300370300200320032903a0143703b00e411010242213450d09201341b889c70036020c20134101360208201342818080801037020002400240200c201b7241ff01710d002013210d0c010b41101024220d450d0a200d41d089c70036020c200d4101360208200d42818080801037020020132013280200417f6a221736020020170d002013280208201328020c2802001103000240201328020c280204450d00201328020810260b20132013280204417f6a221736020420170d00201310260b02400240200d280208200341f00b6a200d28020c28020c110100450d00200341a0146a200341f00b6a41b00210cf061a200f20032903b00e370100200f41086a2019290300370100200f41106a2018290300370100200f41186a2007280200360100200320093602b411200320283b01b2112003201b3a00b1112003200c3a00b0112003200d3602d411200341c0066a200341a0146a200341b0116a10a3030c010b200d200d280200417f6a2213360200200341023a00e006200341003a00d806200342003703c806200342013703c006024020130d00200d280208200d28020c2802001103000240200d28020c280204450d00200d28020810260b200d200d280204417f6a221336020420130d00200d10260b200341f00b6a1098030b0240024020032802d00222130d00200341003602b0110c010b20032802d802220d417f4c0d0702400240200d0d004100210c410121090c010b200d10242209450d07200d210c0b200341003602b811200320093602b0112003200c3602b411200341b0116a4100200d10c90120032802b01120032802b811220c6a2013200d10cf061a2003200c200d6a3602b8110b0240024020032802dc024101460d004101211320032802d002450d01200341a0146a201e10e00320032802a014220d20032802a81410ff0120032802a414450d01200d10260c010b20032802e002210d0240024020032802e402221341014b0d00200341003602dc020c010b200341013602dc0220032013417f6a3602e4020b200d20006a210d024020032802d002450d00200341a0146a200d10dd0320032802a814210c20032802a0142113200341b00e6a41046a41003a0000200341003602b00e200341186a2013200c200341b00e6a41054100108102024002402003280218450d002003200328021c220c4105200c4105491b3602f40b2003200341b00e6a3602f00b200341106a200341f00b6a108f012003280214210c20032802104521090c010b410021090b024020032802a414450d00201310260b200341a0146a201e10e00320032802a014221320032802a814200d200c410020091b10e10320032802a414450d00201310260b200341a0146a200341206a41f00210cf061a200d200341a0146a10e203410021130b2012200f280200360200200320032903b0113703a014200320232900003703f00b200320242800003600f70b0240024020032903c0064201510d004104210d0c010b20032d00e006210c20032903c8062126200320032800f70b3600b70e200320032903f00b3703b00e4104210d20264202510d00200320032800b70e3600c70b200320032903b00e3703c00b200c210d0b200341f00b6a41086a20122802002212360200200320032903a01422263703f00b200320032903c00b37039006200320032800c70b3600970620102026370200201041086a2012360200200320253602ac14200320003602a814200341023602a4142003410c3a00a0142003200d3a00bc142020200329039006370000202041076a200328009706360000200341a0146a10870202402013450d00024020032802d002220d450d0020032802d402450d00200d10260b200341206a1098030b2006211d0c010b200341f00b6a200341206a41bc0210cf061a200341c0066a41286a22172018290300370300200341c0066a41206a22182015290300370300200341c0066a41186a2215201c290300370300200341c0066a41106a221c201a290300370300200341c0066a41086a221a2019290300370300200320082903003703c006200d4103460d00200341a0146a200341f00b6a41bc0210cf061a200420032903c0063703002013201a2903003703002012201c290300370300200c201529030037030020092018290300370300200720172903003703002003200d3602dc16201f200341a0146a10e2030b2011417f6a2111200141f8026a2201200e470d000b200e21040c010b200141f8026a21040b0240200e2004460d0003402004220141f8026a21040240200141b8026a2802002208450d00200141bc026a280200450d00200810260b200141086a10d501200e2004470d000b0b02402016450d00201641f8026c450d00200a10260b200341b8146a22014200370300200341b0146a22214200370300200341a0146a41086a22044200370300200342003703a014200341e00e6a41818dc700410910fb012004200341e00e6a41086a2208290000370300200320032900e00e3703a014200341e00e6a41dcd5c000410f10fb0120012008290000370300202120032900e00e370300200341206a200341a0146a10fe01024002400240200328022022080d0041002104200341003602f80b200342043703f00b4104210841002101410421154100211a410021110c010b2003200329022422063702f40b200320083602f00b2006a7210402402006422088a7220141024f0d004100211a41042115410021110c010b200828020821112008280204211a2008280200211520082008410c6a2001410c6c41746a10d0061a20032001417f6a22013602f80b200141014b0d010b0340024020012004470d00200341f00b6a2001410110cb0120032802f80b210120032802f00b21080b20082001410c6c6a22044100360208200442043702002003200141016a22013602f80b200141014b0d0120032802f40b21040c000b0b200341206a41086a2201200341f00b6a41086a280200360200200320032903f00b2206370320024002402006a7220d0d00200341b8146a4200370300200341b0146a4200370300200341a0146a41086a22014200370300200342003703a014200341e00e6a41818dc700410910fb012001200341e00e6a41086a2204290000370300200320032900e00e3703a014200341e00e6a41dcd5c000410f10fb01202141086a2004290000370000202120032900e00e370000200341a0146a412010ff010c010b200341b8146a4200370300200341b0146a4200370300200341a0146a41086a22044200370300200342003703a014200341e00e6a41818dc700410910fb012004200341e00e6a41086a2208290000370300200320032900e00e3703a014200341e00e6a41dcd5c000410f10fb01202141086a2008290000370000202120032900e00e370000200341a0146a200341206a108002024020012802002201450d002001410c6c2104200d210103400240200141046a2802002208450d00200841246c450d00200128020010260b2001410c6a2101200441746a22040d000b0b20032802242201450d002001410c6c450d00200d10260b200341b8146a4200370300200341b0146a4200370300200341a0146a41086a22014200370300200342003703a014200341e00e6a41818dc700410910fb012001200341e00e6a41086a2204290000370300200320032900e00e3703a014200341e00e6a4190d8c000410a10fb01202141086a2004290000370000202120032900e00e370000200341206a200341a0146a10fe0120032902244200200328022022041b2206422088a7220e410c6c2101200e41ffffffff0371211c2004410420041b220f41746a2104417f210802400340024020010d00410021130c020b200141746a2101200841016a2108200441146a210d2004410c6a22132104200d280200220d450d000b200341a0146a41086a20132802002201410c6a290200370300200341b0146a200141146a290200370300200320012902043703a0142001411c6a2902002129200128020021102001200141246a200d41246c415c6a10d0061a201341086a200d417f6a360200410121132008211c0b200341206a41106a200341a0146a41106a2204290300370300200341206a41086a200341a0146a41086a2201290300370300200320032903a0143703202003200f3602f00b200320063702f40b200341b8146a42003703002004420037030020014200370300200342003703a014200341e00e6a41818dc700410910fb012001200341e00e6a41086a2204290000370300200320032900e00e3703a014200341e00e6a4190d8c000410a10fb01202141086a2004290000370000202120032900e00e370000200341a0146a200341f00b6a1080022006a7210d0240200e450d00200e410c6c2104200f210103400240200141046a2802002208450d00200841246c450d00200128020010260b2001410c6a2101200441746a22040d000b0b0240200d450d00200d410c6c450d00200f10260b200341c0066a41086a220d200341206a41086a290300370300200341c0066a41106a220e200341206a41106a290300370300200320032903203703c0064100210802402013450d00201141246c2101201521040340024020010d00410121080c020b2001415c6a210120042802002108200441246a210420082010470d000b410021080b200341b8146a4200370300200341a0146a41106a4200370300200341a0146a41086a22014200370300200342003703a014200341e00e6a41818dc700410910fb012001200341e00e6a41086a2204290000370300200320032900e00e3703a014200341e00e6a41eb8cc700410a10fb01202141086a2004290000370000202120032900e00e370000200341206a200341a0146a10fc01200341003602e811200342043703e011200328022021012003290224210620034180096a41106a200e29030037030020034180096a41086a200d290300370300200320032903c006370380092001410420011b21072006420020011b2206a721182015201141246c22016a21190240024002402006422088a72213410274220d4102752204200141246d6a22012004490d00200120086a220420014f0d010b2007200d6a210c200320103602e40e200320083602e00e20032003290380093703e80e200320034180096a41086a2903003702f00e200320034180096a41106a2903003703f80e201c41016a2117201a41246c21202029422088a7211b200341206a41087221052029a721254100210441042109410421144100210a4101210b200721122015211103400240024002400240200b4101470d00201821012012210e200c210f02402007450d002012200c470d020240201841ffffffff0371450d00200710260b20252101201b210e201c210f0b024020192011460d00201141146a29020021062011280200210d20112902042126200341206a41086a2011410c6a290200370300200341206a41106a2006370300200320263703202011411c6a2902002106410121134100210720012118200e2112200f210c201141246a21110c030b0240200b450d00201a450d002020450d00201510260b4100210b0b20084102460d05200341003602a014200320032903f80e370338200320032903f00e370330200320032903e80e370328200320032903e00e2206370320200320032903b8143703f80e200320032903b0143703f00e200320032903a8143703e80e200320032903a01422263703e00e2006a74101470d052026a72108200341f00b6a41106a200541106a290200370300200341f00b6a41086a200541086a290200370300200320052902003703f00b2006422088a7210d410121132017210e202921060c020b2012280200210d200341206a41106a200341a0146a41106a290200370300200341206a41086a200341a0146a41086a290200370300200320032902a014370320201241046a2112410221130b200341f00b6a41106a200341206a41106a290300370300200341f00b6a41086a200341206a41086a290300370300200320032903203703f00b4100210e0b200341a0146a41106a220f200341f00b6a41106a290300370300200341a0146a41086a2210200341f00b6a41086a290300370300200320032903f00b3703a0140240200a20032802e411470d0002400240200b4101460d004100210120084102460d01200841014621010c010b024020084102460d00024020070d00417f201920116b41246d220120084101466a221420142001491b21010c020b417f417f200c20126b4102752201201920116b41246d6a221420142001491b220120084101466a221420142001491b21010c010b02402007450d00417f200c20126b4102752201201920116b41246d6a221420142001491b21010c010b201920116b41246d21010b200341e0116a200a417f200141016a221420142001491b10e80120032802e011220921140b201420046a2201200d360200200141046a20032903a014370200200f29030021262010290300212a200141286a200e360200200141246a20133602002001411c6a20063702002001410c6a202a370200200141146a20263702002003200a41016a220a3602e8112004412c6a21040c000b0b200341e0116a4100200410e80120032802e011210920032802e811210a200341e00e6a41106a20034180096a41106a290300370300200341e00e6a41086a20034180096a41086a29030037030020032003290380093703e00e2009200a412c6c6a210102402013450d00200a2013410274220d417c6a4102766a210e20072104034020042802002113200141246a4102360200200120133602002001412c6a2101200441046a2104200d417c6a220d0d000b200e41016a210a0b0240201841ffffffff0371450d00200710260b024020192015460d00200341b8146a210d200341b0146a2113200341a8146a210e2015210403402004280200210f200d2004411c6a2902003703002013200441146a290200370300200e2004410c6a2902003703002003200441046a2902003703a0142001200f360200200141046a20032903a0143702002001410c6a200e290300370200200141146a20132903003702002001411c6a200d290300370200200141246a42013702002001412c6a2101200a41016a210a200441246a22042019470d000b0b0240201a450d00201a41246c450d00201510260b2003201036022420032008360220200320032903e00e22263703282003200341e80e6a290300222a3702302003200341f00e6a290300222b37033820032903202106200341003602a01402402006a74101470d002006422088a7210420032903b814212c20032903b014212d20032903a814212e20032903a0142106201c41016a210d034020012004360200200141046a2026370200200141286a200d360200200141246a41013602002001411c6a20293702002001410c6a202a370200200141146a202b370200200341003602a0142001412c6a2101200a41016a210a2006a721082006422088a7210420032903a0142106202e2126202d212a202c212b20032903a814212e20032903b014212d20032903b814212c20084101460d000b0b2003200a3602e8110b02400240200a4115490d00200a410176ad422c7e2206422088a70d032006a72227417f4c0d03202710242222450d02410021042003410036022820034204370320200941546a2123200941fc7e6a212841042108200a210c024002400340200c21124100210c4101211102402012417f6a2213450d0002400240024002400240024020092013412c6c6a2802002012412c6c222420096a41a87f6a2802002201490d002012417e6a2110202820246a21134100210c4100210d034002402010200d470d00201221110c080b200d41016a210d20012013280200220e4f210f201341546a2113200e2101200f0d000b200d41016a2111200d417f7320126a21130c010b202820246a210d02400340024020134101470d00410021130c020b2013417f6a21132001200d280200220e49210f200d41546a210d200e2101200f0d000b0b20122013490d022012200a4b0d01201220136b2211410176220e450d0020092013412c6c6a2101202320246a210d0340200341a0146a41286a220f200141286a2210280200360200200341a0146a41206a2205200141206a220b290200370300200341a0146a41186a2214200141186a220c290200370300200341a0146a41106a2207200141106a2218290200370300200341a0146a41086a2219200141086a2217290200370300200320012902003703a014200d41086a22152902002106200d41106a221c2902002126200d41186a221a290200212a200d41206a221b2902002129200d41286a222528020021202001200d29020037020020102020360200200b2029370200200c202a37020020182026370200201720063702002025200f280200360200201b2005290300370200201a2014290300370200201c200729030037020020152019290300370200200d20032903a0143702002001412c6a2101200d41546a210d200e417f6a220e0d000b0b024020130d002013210c0c050b0240201141094d0d002013210c0c050b2012200a4b0d02201220136b210e20092013412c6c6a2105202320246a2119034020122013417f6a220c490d0402402012200c6b22114102490d0020092013412c6c6a22012802002009200c412c6c6a220f28020022104f0d00200341a0146a41206a220b200f41246a290200370300200341a0146a41186a2214200f411c6a290200370300200341a0146a41106a2207200f41146a290200370300200341a0146a41086a2218200f410c6a290200370300200f2902042106200f41286a200141286a280200360200200320063703a014200f41206a200141206a290200370200200f41186a200141186a290200370200200f41106a200141106a290200370200200f41086a200141086a290200370200200f200129020037020041012113024020114103490d00410121132005210103402001412c6a220d28020020104f0d01200141286a200141d4006a280200360200200141206a200141cc006a290200370200200141186a200141c4006a290200370200200141106a2001413c6a290200370200200141086a200141346a2902003702002001200d290200370200200d2101200e201341016a2213470d000b201921010b20012010360200200f2013412c6c6a220120032903a014370204200141246a200b2903003702002001411c6a2014290300370200200141146a20072903003702002001410c6a20182903003702000b200c450d05200e41016a210e200541546a2105200c21132011410a4f0d050c000b0b2012200a41c4ccc5001047000b2013201241c4ccc5001048000b20122013417f6a220c490d002012200a41d4ccc5001047000b200c201241d4ccc5001048000b024020042003280224470d00200341206a10bf0120032802202108200328022821040b200820044103746a220120113602042001200c3602002003200441016a22043602280240024020044102490d0003400240024002400240024020082004417f6a4103746a2201280200450d00200441037420086a220e41746a28020022132001280204220d4b0d010b20044103490d022001280204210d20082004417d6a22054103746a28020421010c010b200441024d0d0420082004417d6a22054103746a2802042201200d20136a4d0d00200441034d0d04200e41646a280200200120136a4b0d040b2001200d490d010b2004417e6a21050b02400240024002400240024002402004200541016a220b4d0d00200420054d0d012008200541037422076a2201280204221820012802006a22012008200b41037422196a22042802002214490d022001200a4b0d0320092014412c6c6a221120042802042212412c6c22046a210d2001412c6c2108200120146b220e20126b220120124f0d042022200d2001412c6c220410cf06221020046a211320124101480d0520014101480d05202320086a2104200d210103402004200141546a220d201341546a220e200e280200200d28020049220f1b2208290200370200200441286a200841286a280200360200200441206a200841206a290200370200200441186a200841186a290200370200200441106a200841106a290200370200200441086a200841086a2902003702002013200e200f1b211302402011200d2001200f1b2201490d00201021080c080b200441546a21042010210820102013490d000c070b0b200b200441e4ccc5001032000b2005200441f4ccc5001032000b201420014184cdc5001048000b2001200a4184cdc5001047000b20222011200410cf06221020046a2113024020124101480d00200e20124c0d00200920086a210f201021082011210103402001200d2008200d280200200828020049220e1b2204290200370200200141286a200441286a280200360200200141206a200441206a290200370200200141186a200441186a290200370200200141106a200441106a290200370200200141086a200441086a29020037020020082008412c6a200e1b21082001412c6a2101200d412c6a200d200e1b220d200f4f0d03201320084b0d000c030b0b20112101201021080c010b200d2101201021080b20012008201320086b22042004412c706b10cf061a2003280228220120054d0d022003280220220820076a2204201820126a360204200420143602002001200b4d0d04200820196a2204200441086a2001200b417f736a41037410d0061a20032001417f6a2204360228200441014b0d000b0b200c450d030c010b0b200520014194cdc5001032000b200b2001103e000b0240200328022441ffffffff0171450d00200810260b2027412c7021012027412c490d0120272001460d01202210260c010b200a4102490d00410021132009200a417f6a2208412c6c6a221421100340024002400240200a20082201417f6a2208490d00200a20086b22044102490d0220092001412c6c6a220128020020092008412c6c6a220e280200220f4f0d02200341a0146a41206a2211200e41246a290200370300200341a0146a41186a2212200e411c6a290200370300200341a0146a41106a2205200e41146a290200370300200341a0146a41086a220b200e410c6a290200370300200e2902042106200e41286a200141286a280200360200200320063703a014200e41206a200141206a290200370200200e41186a200141186a290200370200200e41106a200141106a290200370200200e41086a200141086a290200370200200e20012902003702004101210d20044103490d014100210d20102101034002402001412c6a2204280200200f490d00200d41016a210d0c030b200141286a200141d4006a280200360200200141206a200141cc006a290200370200200141186a200141c4006a290200370200200141106a2001413c6a290200370200200141086a200141346a29020037020020012004290200370200200421012013200d41016a220d470d000b200d41016a210d201421010c010b2008200a41a4ccc5001048000b2001200f360200200e200d412c6c6a220120032903a014370204200141246a20112903003702002001411c6a2012290300370200200141146a20052903003702002001410c6a200b2903003702000b201341016a2113201041546a211020080d000b0b20032802e411211320032802e011210e20032802e8112101200341b8146a4200370300200341b0146a4200370300200341a0146a41086a22044200370300200342003703a014200341e00e6a41818dc700410910fb012004200341e00e6a41086a2208290000370300200320032900e00e3703a014200341e00e6a41acd6c000410610fb01202141086a2008290000370000202120032900e00e3700002001412c6c41046a2204417f4c0d010240024020040d0041012108410021040c010b200410242208450d010b200341003602282003200836022020032004360224200341206a200110a10102402001450d00200e2001412c6c6a210d200e2101034020012802002104200341206a20032802284104106d2003280220200328022822086a20043600002003200841046a360228200141046a200341206a10ba012001412c6a2201200d470d000b0b200341a0146a412020032802202201200328022810b30102402003280224450d00200110260b02402013450d002013412c6c450d00200e10260b200341b8146a22014200370300200341b0146a22184200370300200341a0146a41086a22044200370300200342003703a014200341206a41eb8cc700410a10fb012004200341206a41086a2208290000370300200320032900203703a014200341206a41d4e6c600410910fb012001200829000037030020182003290020370300200341a0146a412010ff010240200041c19306490d00200041bfec796a2113200341f00b6a10e3030240024020032802f80b22190d004100210920032802f00b21170c010b20032802f00b221741046a2101201941037441786a41037641016a21044100210902400340200128020020134b0d01200141086a21012004200941016a2209470d000b200421090b20192009490d040b200341003602f80b024020094103742201450d00201720016a210a200341ac146a2107201721110340200341e00e6a2011280200220e10e403200341a0146a20032802e00e220520032802e80e221410e50302400240024020032802ac1422104102470d004104210d4100210b41002108410021100c010b20032802b014210c20032802a414210b20032802a014210d024020032802a81422120d00201221080c010b201241027421044100210141002108024002400340200d20016a220f28020020134d0d01200841016a21082004200141046a2201470d000b201221080c010b20122008490d09200f280200210c4101211020042001460d00200d417c6a21120340200341a0146a200e201220046a28020010e60320032802a014220f20032802a81410ff01024020032802a414450d00200f10260b20012004417c6a2204470d000b0b4100210120080d010b200341a0146a200e10a902024020032802a01422010d00410121010c010b024020032802a414450d00200110260b410021010b2003200c3602b014200320083602a8142003200b3602a4142003200d3602a014200320103602ac140240024020104102470d002005201410ff010c010b2003410036022820034201370320200341206a200341a0146a109a01200341206a200710af012005201420032802202204200328022810b30102402003280224450d00200410260b20104102460d00200b41ffffffff0371450d00200d10260b024020032802e40e450d00200510260b201141086a211102402001450d00200341a0146a200e10e40320032802a014220120032802a81410ff0120032802a414450d00200110260b2011200a470d000b0b0240201920096b2201450d0002402009450d002017201720094103746a200141037410d0061a0b200320013602f80b0b200341e00e6a41086a200341f00b6a41086a280200360200200320032903f00b22063703e00e02402006a722010d00200341b8146a4200370300200341b0146a4200370300200341a0146a41086a22014200370300200342003703a014200341206a41eb8cc700410a10fb012001200341206a41086a2204290000370300200320032900203703a014200341206a41bbf5c400410f10fb01201841086a200429000037000020182003290020370000200341a0146a412010ff010c010b200341b8146a4200370300200341b0146a4200370300200341a0146a41086a22044200370300200342003703a014200341206a41eb8cc700410a10fb012004200341206a41086a2208290000370300200320032900203703a014200341206a41bbf5c400410f10fb01201841086a200829000037000020182003290020370000200341a0146a200341e00e6a10e70320032802e40e41ffffffff0171450d00200110260b200010a903210620022400427f201d20067c22062006201d541b0f0b1033000b1034000b200920191040000b20082012103f000b102c000b980301057f230041d0006b22022400200241086a41a88dc700410910fb01200241186a41b2a1c300410610fb0120022001360234200241386a200241346a410410a202200241cc006a200241346a41046a3602002002200241c0006a3602442002200241346a3602482002200241386a360240200241286a200241c0006a1073024002402002280230220341206a2204417f4c0d000240024020040d0041012101410021040c010b200410242201450d020b20002001360200200041086a220141003602002000200436020420004100411010c9012000280200200128020022046a220520022900083700002001200441106a2204360200200541086a200241086a41086a29000037000020002004411010c9012000280200200128020022046a220520022900183700002001200441106a2206360200200541086a200241186a41086a2900003700002002280228210420002006200310c9012000280200200128020022006a2004200310cf061a2001200020036a3602000240200228022c450d00200410260b200241d0006a24000f0b1034000b1033000bcb180c047f017e077f017e037f037e067f017e057f017e087f017e230041c00e6b220324002003200236021c20032001360218200341206a2001200210820202400240200328022022040d00200041003602000c010b200328022421052003200341286a28020036023420032004360230200341106a200341306a108f010240024020032802100d0002400240024020032802142206200328023441f0026e2201200120064b1bad42f0027e2207422088a70d002007a72201417f4c0d0002400240024020010d00410821080c010b200110242208450d010b200141f0026ead210702402006450d00200341900b6a41067221094100210a03400240024020032802342201450d002003280230220b2d0000210220032001417f6a220c3602342003200b41016a360230200241014b0d000240024020020e020001000b410221020c020b02400240200c450d00200b2d0001210220032001417e6a22013602342003200b41026a220b360230200241014b0d004100210c02400240024020020e020100010b200341086a200341306a108f0120032802080d0220032802342201200328020c2202490d022002417f4c0d090240024020020d004100210d4101210c0c010b2002102a220c450d09200328023421012002210d0b0240024020012002490d00200c2003280230200210cf06210e2003280234220120024f0d012002200141b8afc0001048000b200d450d030c020b2003200120026b22013602342003200328023020026a220b360230200e450d022002ad422086200dad84210f0b200fa7210d0240024002400240024002400240024002400240024002402001450d00200b2d0000210e20032001417f6a3602342003200b41016a360230200341900b6a200341306a10b60220032802900b4117460d03200341e0086a200341900b6a41b00210cf061a20032802342201450d07200328023022102d0000210b20032001417f6a22113602342003201041016a2212360230200b41014b0d0741002102200b0e020201020b200c450d0c200d0d0b0c0c0b20114104490d05201035000121132003201041056a36023020032001417b6a220236023420024104490d05201035000521142003200141776a22113602342003201041096a221236023020144220862013842115410121020b2011450d0820122d0000210120032011417f6a220b3602342003201241016a360230200141024b0d0820010e03010203010b200c450d09200d0d080c090b200b450d0620122d0001210120032011417e6a22163602342003201241026a360230200141024b0d064100210b0240024020010e03060001060b41002101200341003a00b00b2011417d6a210b0240034020162001460d01200341900b6a20016a201220016a221041026a2d00003a00002003201041036a3602302003200141016a22103a00b00b2003200b360234200b417f6a210b2010210120104120460d060c000b0b200141ff0171450d07200341003a00b00b0c070b4102210b0c040b200b450d0520122d0001210120032011417e6a220b3602342003201241026a36023020010d05200b41034d0d05200341c00d6a41086a200341900b6a41086a290200370300200341c00d6a41106a200341900b6a41106a290200370300200341c00d6a41186a200341900b6a41186a280200360200200320032902900b3703c00d2012280002211720032011417a6a3602342003201241066a360230410121180c040b200b450d0420032011417e6a3602342003201241026a3602300c040b200341e0086a109803200c450d05200d0d040c050b200341c0086a41086a2201200941086a290000370300200341c0086a41106a220b200941106a290000370300200341c0086a41186a2211200941186a2f00003b0100200320092900003703c008201041ff0171411f4d0d0220032f01900b211920032801920b211a200341800e6a41186a20112f010022103b0100200341e00d6a41086a2001290300370300200341e00d6a41106a200b290300370300200341e00d6a41186a20103b0100200320032903c0083703e00d4101210b0b200341c00d6a41186a200341e00d6a41186a2f01003b0100200341c00d6a41106a200341e00d6a41106a290300370300200341c00d6a41086a200341e00d6a41086a290300370300200320032903e00d3703c00d41002118201a21170b200f422088a7211b200341c0086a41186a200341c00d6a41186a280200360200200341c0086a41106a200341c00d6a41106a290300370300200341c0086a41086a200341c00d6a41086a290300370300200320032903c00d3703c008200341900b6a200341e0086a41b00210cf061a200341c00d6a41026a200341dd086a41026a2d00003a0000200320032f00dd083b01c00d2015211c200d211d200c211e200e211f200b21200c030b200341e0086a109803200c450d01200d450d010b200c10260b410221020b20034190066a200341900b6a41b00210cf061a200341f0056a41186a2201200341c0086a41186a280200360200200341f0056a41106a220b200341c0086a41106a290300370300200341f0056a41086a220c200341c0086a41086a290300370300200341ec056a41026a220d200341c00d6a41026a220e2d00003a0000200320032903c0083703f005200320032f01c00d3b01ec0520024102460d00200341900b6a20034190066a41b00210cf061a200341e0086a41186a2001280200360200200341e0086a41106a200b290300370300200341e0086a41086a200c290300370300200e200d2d00003a0000200320032903f0053703e008200320032f01ec053b01c00d20192121201c21222018212320172124201b2125201d2126201e2127201f2128202021290c010b410321020b200341b8036a200341900b6a41b00210cf061a20034198036a41186a2201200341e0086a41186a28020036020020034198036a41106a220b200341e0086a41106a29030037030020034198036a41086a220c200341e0086a41086a29030037030020034194036a41026a220d200341c00d6a41026a2d00003a0000200320032903e00837039803200320032f01c00d3b0194030240024002400240024020024103460d00200341e0006a200341b8036a41b00210cf061a200341c0006a41186a220e2001280200360200200341c0006a41106a2210200b290300370300200341c0006a41086a220b200c2903003703002003413c6a41026a220c200d2d00003a00002003200329039803370340200320032f0194033b013c2007422088a722012007a7470d040240200141016a220d2001490d0020014101742211200d200d2011491b220d4104200d41044b1bad42f0027e2213422088a722110d002013a7220d4100480d00200141f0026c202a20011b212a02402008410020011b22080d00200d0d034100410820114100471b21080c050b202a200d460d040240202a0d00200d0d03410821080c050b2008202a200d10282208450d030c040b102e000b2007422088a72201450d09200141f0026c2102200821010c080b200d102422080d010b102c000b200742808080807083200d41f0026ead8421070b20082007422088a741f0026c6a200341e0006a41b00210cf06220141cc026a2024360200200141ca026a20213b0000200141c9026a20293a0000200141c8026a20233a0000200120223703c002200120023602bc02200120253602b802200120263602b402200120273602b002200e280200210220102903002113200b29030021142003290340212b200141ec026a20283a0000200141d0026a202b370300200141d8026a2014370300200141e0026a2013370300200141e8026a2002360200200141ed026a20032f013c3b0000200141ef026a200c2d00003a000020074280808080107c2107200a41016a220a2006470d000b0b2008450d0420002007370204200020083602000c050b1033000b1034000b03400240200141bc026a2802004102460d000240200141b0026a280200220a450d00200141b4026a280200450d00200a10260b200110d5010b200141f0026a2101200241907d6a22020d000b0b2007a72201450d00200141f0026c450d00200810260b200341003602e808200342013703e0082003410e360294062003200341186a360290062003200341e0086a3602b803200341a40b6a4101360200200342013702940b2003418c8dc6003602900b200320034190066a3602a00b200341b8036a41c4e1c000200341900b6a10351a20032802e00820032802e808108402024020032802e408450d0020032802e00810260b200041003602000b2005450d00200410260b200341c00e6a24000b942205047f067e017f037e047f230041e0036b2202240002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012802000e170102030405060b0708090a0b0c0d0e0f10111213141500010b200241086a200141086a108d03200041086a200241086a41c80010cf061a200041163602000c150b200241086a200141086a108e0320004100360200200041186a200241086a41106a290300370300200041106a200241086a41086a290300370300200041086a20022903083703000c140b200241086a200141086a108f03200041086a200241086a41a00210cf061a200041013602000c130b20004102360200200041086a200141086a2903003703000c120b02400240024002400240024002400240024020012d0004417f6a220341044b0d00200141046a210420030e050102030405010b41bf80c700412841dcbcc700102f000b200141086a2802002103410121050c040b41022105200241c0026a41026a200441036a2d00003a0000200241086a41086a200141146a290200370300200241186a2001411c6a290200370300200241206a200141246a2d00003a0000200220042f00013b01c00220022001410c6a290200370308200141086a2802002103200141286a28020021010c040b200141086a2802002103410321050c020b200241c2026a200441036a2d00003a0000200241086a41086a200141146a290200370300200241186a2001411c6a290200370300200241206a200141246a2d00003a0000200220042f00013b01c00220022001410c6a29020037030820012d00254100472104200141086a2802002103200141286a2802002101410421050c030b200141086a2802002103410521050b0b0b200020053a0004200020022f01c0023b0005200020043a0025200020022f01b0023b0126200041086a20033602002000410c6a2002290308370200200041286a2001360200200041076a200241c2026a2d00003a0000200041146a200241086a41086a2903003702002000411c6a200241186a290300370200200041246a200241206a2d00003a0000200041033602000c110b02400240024002400240024002400240200141086a22032d0000417f6a220541034b0d0020050e0401020304010b41bf80c700412841dcbcc700102f000b200241106a200341096a290000370300200241186a200341116a290000370300200241206a200341196a29000037030020022003290001370308200141386a2903002106200141306a2903002107410121010c030b200241106a200341096a290000370300200241186a200341116a290000370300200241206a200341196a29000037030020022003290001370308200141c8006a2903002108200141c0006a2903002109200141386a2903002106200141306a2903002107410221010c030b200241106a200341096a290000370300200241186a200341116a290000370300200241206a200341196a290000370300200220032900013703082002200341216a2800003602c0022002200341246a2800003600c302200141c8006a3100002108200141c0006a2902002109200141386a2902002106200141306a2902002107200141d8006a290300210a200141d0006a290300210b410321010c030b200241106a200341096a290000370300200241186a200341116a290000370300200241206a200341196a29000037030020022003290001370308200141386a2903002106200141306a2903002107410421010b0b0b20002002290308370009200020022802c00236002920004104360200200041d8006a200a370300200041d0006a200b370300200041c8006a2008370300200041c0006a2009370300200041386a2006370300200041306a2007370300200041086a20013a00002000412c6a20022800c302360000200041116a200241086a41086a290300370000200041196a200241186a290300370000200041216a200241206a2903003700000c100b200241086a200141046a10c001200041053602002000410c6a200241106a280200360200200020022903083702040c0f0b024002402001280204450d00200241c0026a41186a200141286a290000370300200241c0026a41106a200141206a290000370300200241c8026a200141186a290000370300200241c0026a41286a200141386a290000370300200241c0026a41306a200141c0006a290000370300200241c0026a41386a200141c8006a290000370300200241c0026a41c8006a200141d8006a290000370300200241c0026a41d0006a200141e0006a290000370300200241c0026a41d8006a200141e8006a2900003703002002200141106a2900003703c0022002200141306a2900003703e0022002200141d0006a29000037038003200241c0026a41f8006a20014188016a290000370300200241c0026a41f0006a20014180016a290000370300200241c0026a41e8006a200141f8006a290000370300200241c0026a4198016a200141a8016a290000370300200241c0026a4190016a200141a0016a290000370300200241c0026a4188016a20014198016a2900003703002002200141f0006a2900003703a003200220014190016a2900003703c003200241086a200141046a10c801200241146a200241c0026a41a00110cf061a0c010b200241003602080b200041046a200241086a41ac0110cf061a200041073602000c0e0b20004108360200200020012802043602040c0d0b200241086a200141086a109003200041086a200241086a41980210cf061a200041093602000c0c0b20012802042103200241086a200141086a10c801200241b0026a200141146a10d001200241086a41146a200241b0026a41086a280200360200200220022903b002370214200241c0026a41106a200241086a41106a2903002206370300200241c0026a41086a200241086a41086a29030022073703002002200229030822083703c002200141206a2902002109200141286a280200210520002003360204200041086a2008370200200041106a2007370200200041186a2006370200200041286a2005360200200041206a20093702002000412c6a2001412c6a290200370200200041346a200141346a2902003702002000413c6a2001413c6a290200370200200041c4006a200141c4006a290200370200200041cc006a200141cc006a290200370200200041d4006a200141d4006a290200370200200041dc006a200141dc006a290200370200200041e4006a200141e4006a2902003702002000410a3602000c0b0b108103000b200241086a200141086a109103200041086a200241086a41a00210cf061a2000410c3602000c090b2000410d3602000c080b200241086a200141046a10b702200041046a200241086a41c80010cf061a2000410e3602000c070b024002400240024020012f0104417f6a220341014b0d0020030e020102010b41bf80c700412841dcbcc700102f000b200241086a200141086a10c401200229020c210620022802082103410121010c010b20012f0106210541b00210242203450d082003200141086a28020010c601410221010b200020013b01042000410f3602002000410c6a2006370200200041086a2003360200200041066a20053b01000c060b200241086a200141086a10d002200041086a200241086a41a80210cf061a200041103602000c050b200241086a200141046a109203200041046a200241086a41c40010cf061a200041113602000c040b02400240024002400240200141086a22032d0000417f6a220c41034b0d00420021064101210542002107200c0e0404010203040b41bf80c700412841dcbcc700102f000b200241206a200341196a290000370300200241186a200341116a290000370300200241106a200341096a290000370300200220032900013703084200210641022105420021070c020b200241106a200341096a290000370300200241186a200341116a290000370300200241206a200341196a29000037030020022003290001370308200141c8006a2903002109200141c0006a2903002108200141386a290300210d200141306a290300210e200141d0006a28020021044200210641032105420021070c010b200241106a200341096a290000370300200241186a200341116a290000370300200241206a200341196a290000370300200220032900013703082002200341216a2800003602c0022002200341246a2800003600c302200141d0006a290300220f428080808070832106200141d8006a2903002107200141c8006a3100002109200141c0006a2902002108200141386a290200210d200141306a290200210e200141e8006a290300210b200141e0006a290300210a200141f0006a2802002110200fa72104410421050b20002002290308370009200020022802c002360029200041e8006a200b370300200041e0006a200a370300200041d8006a2007370300200041c8006a2009370300200041c0006a2008370300200041386a200d370300200041306a200e370300200041086a20053a00002000412c6a20022800c302360000200041f0006a2010360200200041d0006a20062004ad84370300200041116a200241086a41086a290300370000200041196a200241186a290300370000200041216a200241206a290300370000200041123602000c030b200241086a200141046a10930320004113360200200041246a200241286a2802003602002000411c6a200241206a290300370200200041146a200241186a2903003702002000410c6a200241106a290300370200200020022903083702040c020b200241086a200141086a10940320004114360200200041286a200241086a41206a290300370300200041206a200241086a41186a290300370300200041186a200241086a41106a290300370300200041106a200241086a41086a290300370300200041086a20022903083703000c010b024002400240024002400240024020012d0004417f6a221141054b0d004104210520110e06010203060405010b41bf80c700412841dcbcc700102f000b200241086a41086a2205200141106a290000370300200241086a41106a2212200141186a290000370300200241086a41156a22132001411d6a2900003700002002200141086a29000037030820012f0006210420012d0005211020012d0025210c41b00210242203450d062003200141286a280200109503200241c0026a41156a2013290000370000200241c0026a41106a2012290300370300200241c0026a41086a2005290300370300200220022903083703c002410121050c040b200241c0026a41086a200141106a290200370300200241c0026a41106a200141186a290200370300200241d5026a2001411d6a2900003700002002200141086a2902003703c00220012f0006210420012d0005211020012d0025210c410221050c030b200241c0026a41086a200141106a290200370300200241c0026a41106a200141186a290200370300200241d5026a2001411d6a2900003700002002200141086a2902003703c00220012f0006210420012d0005211020012d0025210c410321050c020b20012f0106210420012d00052110410521050c010b200241c0026a41086a200141106a290200370300200241c0026a41106a200141186a290200370300200241d5026a2001411d6a2900003700002002200141086a2902003703c0022001412c6a2802002113200141286a280200210320012f0006210420012d0005211020012f0126211220012d0025210c410621050b200020103a0005200020053a00042000200c3a002520004115360200200041066a20043b0100200041086a20022903c0023702002000412c6a2013360200200041286a2003360200200041266a20123b0100200041106a200241c0026a41086a290300370200200041186a200241c0026a41106a2903003702002000411d6a200241c0026a41156a2900003700000b200241e0036a24000f0b102c000bcf0201057f230041306b22022400200241a88dc700410910fb01200241106a41aca1c300410610fb01200241206a2001280200200128020810fd02024002402002280228220341206a2204417f4c0d000240024020040d0041012101410021040c010b200410242201450d020b20002001360200200041086a220141003602002000200436020420004100411010c9012000280200200128020022046a220520022900003700002001200441106a2204360200200541086a200241086a29000037000020002004411010c9012000280200200128020022046a220520022900103700002001200441106a2206360200200541086a200241106a41086a2900003700002002280220210420002006200310c9012000280200200128020022006a2004200310cf061a2001200020036a36020002402002280224450d00200410260b200241306a24000f0b1034000b1033000b9a0101027f230041106b220424000240410810242205450d002004420837020420042005360200200441004104106d2004280200200428020822056a20023600002004200541046a2202360208200420024104106d20042802002202200428020822056a20033600002004200541046a2203360208200020012002200310b30102402004280204450d00200210260b200441106a24000f0b1033000b9e0201037f230041306b220224002002200010dd0320022802082103200228020021000240410110242204450d0020024201370214200220043602100240024020012802bc024102470d00200241106a41004101106d2002280210200228021822046a41003a00002002200441016a3602180c010b200241106a41004101106d2002280210200228021822046a41013a00002002200441016a3602182001200241106a10e8030b200241206a41086a200241106a41086a2802003602002002200229031037032020002003200241206a10e90302402002280204450d00200010260b024020012802bc024102460d00024020012802b0022200450d00200141b4026a280200450d00200010260b20011098030b200241306a24000f0b1033000bd405020a7f017e23004180016b22012400200141206a22024200370300200141186a22034200370300200141086a41086a420037030020014200370308200141086a41eb8cc700410a10fb01200141e8006a41bbf5c400410f10fb012002200141e8006a41086a290000370300200320012900683703002001412036022c2001200141086a360228200141306a200141086a41201082020240024002400240200128023022040d00410021050c010b200128023421062001200141306a41086a280200360244200120043602402001200141c0006a108f010240024020012802000d002001280204220720012802444103762202200220074b1b22034103742202417f4c0d030240024020030d00410421050c010b200210242205450d050b41002102200141003602702001200336026c20012005360268024002402007450d000340200128024422084104490d022001280240220328000021092001200341046a36024020012008417c6a220a360244200a4104490d022003280004210a2001200841786a3602442001200341086a36024002402002200128026c470d00200141e8006a200210ec0120012802682105200128027021020b200520024103746a2203200a360204200320093602002001200241016a22023602702007417f6a22070d000b0b200129026c210b2005450d010c020b0240200128026c41ffffffff0171450d00200510260b0b4100210520014100360250200142013703482001410e36025c2001200141286a3602582001200141c8006a360264200141fc006a41013602002001420137026c2001418c8dc6003602682001200141d8006a360278200141e4006a41c4e1c000200141e8006a10351a20012802482001280250108402200128024c450d00200128024810260b2006450d00200410260b0240024020050d0020004100360208200042043702000c010b2000200b370204200020053602000b20014180016a24000f0b1034000b1033000b9b0301057f230041d0006b22022400200241086a41eb8cc700410a10fb01200241186a41d2f5c400410c10fb0120022001360234200241386a200241346a410410a202200241c0006a410c6a200241346a41046a3602002002200241c0006a3602442002200241346a3602482002200241386a360240200241286a200241c0006a1073024002402002280230220341206a2204417f4c0d000240024020040d0041012101410021040c010b200410242201450d020b20002001360200200041086a220141003602002000200436020420004100411010c9012000280200200128020022046a220520022900083700002001200441106a2204360200200541086a200241086a41086a29000037000020002004411010c9012000280200200128020022046a220520022900183700002001200441106a2206360200200541086a200241186a41086a2900003700002002280228210420002006200310c9012000280200200128020022006a2004200310cf061a2001200020036a3602000240200228022c450d00200410260b200241d0006a24000f0b1034000b1033000bca03010a7f230041e0006b220324002003200236020c20032001360208200341106a2001200210820202400240200328021022010d002000410236020c0c010b200328021421042003200341106a41086a28020036022420032001360220200341c8006a200341206a10e2010240024020032802482205450d00200328024c2106024020032802242207450d00200341c8006a41086a2802002108200328022022092d0000210a20032007417f6a220b3602242003200941016a360220200a41014b0d004100210202400240200a0e020100010b200b4104490d012009280001210c20032007417b6a3602242003200941056a360220410121020b2000200c3602102000200836020820002006360204200020053602000c020b200641ffffffff0371450d00200510260b20034100360230200342013703282003410e36023c2003200341086a3602382003200341286a360244200341dc006a41013602002003420137024c2003418c8dc6003602482003200341386a360258200341c4006a41c4e1c000200341c8006a10351a200328022820032802301084020240200328022c450d00200328022810260b410221020b2000200236020c2004450d00200110260b200341e0006a24000b870401047f230041e0006b22032400200341086a41eb8cc700410a10fb01200341186a41caf5c400410810fb0102400240410410242204450d002003420437023c20032004360238200341386a41004104106d2003280238200328024022046a20013600002003200441046a2201360240200341386a20014104106d20032802382201200328024022046a20023600002003200441046a2202360240200341c8006a2001200210a202200341dc006a200120026a360200200320013602582003200341c8006a41086a3602542003200341c8006a360250200341286a200341d0006a10730240200328023c450d00200110260b2003280230220241206a2204417f4c0d010240024020040d0041012101410021040c010b200410242201450d010b20002001360200200041086a220141003602002000200436020420004100411010c9012000280200200128020022046a220520032900083700002001200441106a2204360200200541086a200341086a41086a29000037000020002004411010c9012000280200200128020022046a220520032900183700002001200441106a2206360200200541086a200341186a41086a2900003700002003280228210420002006200210c9012000280200200128020022006a2004200210cf061a2001200020026a3602000240200328022c450d00200410260b200341e0006a24000f0b1033000b1034000b940201057f230041106b2202240002400240200128020822034103744104722204417f4c0d0020012802002101200410242205450d012002410036020820022004360204200220053602002002200310a1010240024020030d0020022802002105200228020821030c010b200120034103746a210620022802082103034020012802002104200220034104106d2002280200200228020822036a20043600002002200341046a2203360208200141046a2802002104200220034104106d20022802002205200228020822036a20043600002002200341046a2203360208200141086a22012006470d000b0b200041202005200310b30102402002280204450d00200510260b200241106a24000f0b1034000b1033000b8e0401037f2001200041b0026a109f0120002d00ec0221022001200141086a22032802004101106d2001280200200328020022046a20023a00002003200441016a360200200020011099042001200041bc026a1099010240024020002d00c8024101460d00200120032802004101106d2001280200200328020022026a41003a00002003200241016a2202360200200041c9026a2d0000220341024b0d0102400240024020030e03000102000b200120024101106d2001280200200141086a220128020022036a41003a00002001200341016a3602000f0b200120024101106d2001280200200141086a220328020022026a41013a00002003200241016a2202360200200120024120106d2001280200200328020022026a2201200041ca026a290000370000200141186a200041e2026a290000370000200141106a200041da026a290000370000200141086a200041d2026a2900003700002003200241206a3602000f0b200120024101106d2001280200200141086a220128020022036a41023a00002001200341016a3602000f0b200120032802004101106d2001280200200328020022026a41013a00002003200241016a2202360200200120024101106d2001280200200328020022026a41003a00002003200241016a2202360200200041cc026a2802002100200120024104106d2001280200200328020022016a20003600002003200141046a3602000b0b31002001ad4220862000ad84200235020842208620022802002200ad84101a0240200241046a280200450d00200010260b0b97640a017f017e017f017e037f027e037f047e037f097e230041d0096b2206240002400240024002400240024002400240024002400240024002400240024002400240200129032022074202520d0020022003200510eb03220841ff01714102470d0b42002109200641d8026a41086a220a4200370300200641d8026a41106a220b4200370300200641d8026a41186a220c4200370300200642003703d8022001280250417f6a220841094b0d0620080e0a01060606060606060203010b200641d8026a41186a200141186a290000370300200641d8026a41106a200141106a290000370300200641d8026a41086a200141086a290000370300200620012900003703d802200141c0006a290300210d200141386a2903002109200141c8006a28020021082001290328210e200641c0066a41186a220f4200370300200641c0066a41106a22104200370300200641c0066a41086a220a4200370300200642003703c00620064188036a41808cc700410610fb01200a20064188036a41086a221129000037030020062006290088033703c00620064188036a41ea93c400410610fb01200f2011290000370300201020062900880337030020064190026a200641c0066a4120108902024020074201520d00200e4200510d090b200641f0086a200641d8026a10d803200641c0066a20062802f008220a20062802f80810d9032011201029030037030020064188036a41106a200f29030037030020064188036a41186a200641c0066a41206a29030037030020064188036a41206a200641c0066a41286a29030037030020064188036a41286a220f200641c0066a41306a29030037030020064188036a41306a2211200641c0066a41386a29030037030020064188036a41386a200641c0066a41c0006a290300370300200620062903c806370388030240024020062903c0064201510d00200641b8066a420037030020064180066a41306a420037030020064180066a41286a4200370300200641a0066a420037030020064198066a420037030020064190066a420037030020064188066a420037030020064200370380064100210f410021110c010b20064180066a41086a20064188036a41086a29030037030020064180066a41106a20064188036a41106a29030037030020064180066a41186a20064188036a41186a29030037030020064180066a41206a20064188036a41206a29030037030020064180066a41286a200f29030037030020064180066a41306a201129030037030020064180066a41386a20064188036a41386a29030037030020062006290388033703800620064188076a280200210f200628028c0721110b024020062802f408450d00200a10260b0240200f2008470d00200641c0066a41386a20064180066a41386a290300370300200641c0066a41306a20064180066a41306a290300370300200641c0066a41286a20064180066a41286a290300370300200641c0066a41206a20064180066a41206a290300370300200641c0066a41186a20064180066a41186a290300370300200641c0066a41106a20064180066a41106a290300370300200641c0066a41086a20064180066a41086a29030037030020062006290380063703c00620062011360284072006200841016a220f36028007200641f0086a200641d8026a10d80320062802f808210a20062802f00821082006410036029003200642013703880320064188036a41004104106d200628028803200628029003220b6a200f3600002006200b41046a220f3602900320064188036a200f4101106d200628028803200628029003220f6a20113a00002006200f41016a3602900320064188036a200641c0066a10a6012008200a200628028803220f20062802900310b3010240200628028c03450d00200f10260b024020062802f408450d00200810260b4180122108200341ff01714102460d0e20022003200510eb03220841ff01714102470d0e20064180026a200520022009200d200441ff017141004710ec0302400240024002400240024002400240200629038002221220064180026a41086a29030022138450450d00420021140c010b200641003a009802200620133703f808200620123703f008410121082006410141112009200d84501b3a00c0092006200641d8026a3602b8022006200641d8026a3602e0052006200641e0056a3602d0062006200641c0096a3602cc062006200641b8026a3602c806200620064198026a3602c4062006200641f0086a3602c00620064188036a200641d8026a200641c0066a10ed03024002402006280288034101470d004200210e20062903900321070c010b200641b0036a290300210e200641a8036a2903002107410021082006290390034201520d0020064188036a41106a290300211520062802e005210f200641f8066a20064188036a41186a290300370300200641f0066a201537030041002108200641c0066a41086a41003a0000200641c9066a200f290000370000200641d1066a200f41086a290000370000200641d9066a200f41106a290000370000200641e1066a200f41186a290000370000200641023a00c006200641c0066a1087020b4201211420080d010b20064180066a41186a200641d8026a41186a29030037030020064180066a41106a200641d8026a41106a29030037030020064180066a41086a200641d8026a41086a290300370300200620062903d80237038006200641c0066a200141d0006a221110a80220062d00c0064101460d01200641ec066a280200210c200641e8066a280200210a200641e4066a2802002116200641dc066a280200210b200641c0066a41186a28020021170240200641e0066a2802002208450d002008410c6c210f2017210803400240200841046a280200450d00200828020010260b2008410c6a2108200f41746a220f0d000b0b0240200b450d00200b410c6c450d00201710260b0240200c450d00200c410c6c210f2016210803400240200841046a280200450d00200828020010260b2008410c6a2108200f41746a220f0d000b0b200a450d02200a410c6c450d02201610260c020b41800221080c130b20062d00c10622084102470d010b200641c0066a201110ee0320062d00c0064101460d01200641ec066a280200210a200641e8066a280200210f200641e4066a280200210b200641dc066a2802002111200641d8066a280200210c0240200641e0066a2802002208450d002008410c6c2110200c210803400240200841046a280200450d00200828020010260b2008410c6a2108201041746a22100d000b0b02402011450d002011410c6c450d00200c10260b0240200a450d00200a410c6c2110200b210803400240200841046a280200450d00200828020010260b2008410c6a2108201041746a22100d000b0b200f450d02200f410c6c450d02200b10260c020b20062f01c206410874210f02402014500d00200641d8066a22044200370300200641c0066a41106a220a4200370300200641c0066a41086a22034200370300200642003703c00620064188036a419a8cc700410810fb01200320064188036a41086a220529000037030020062006290088033703c00620064188036a41b8a1c300410d10fb01201041086a220b20052900003700002010200629008803370000200641e8016a200641c0066a108d02200641e8016a41106a290300210220062903f001210920062802e801211120044200370300200a420037030020034200370300200642003703c00620064188036a419a8cc700410810fb012003200529000037030020062006290088033703c00620064188036a41b8a1c300410d10fb01200b20052900003700002010200629008803370000200642002002420020111b2202200e7d2009420020111b2209200754ad7d220d200920077d2207200956200d200256200d2002511b22031b3703900320064200200720031b37038803200641c0066a412020064188036a411010b3010b200f20087221080c100b20062d00c10622084102470d0e0b20064190096a41186a20064180066a41186a29030037030020064190096a41106a20064180066a41106a29030037030020064190096a41086a20064180066a41086a290300370300200641b8056a41086a200641d8026a41086a290300370300200641b8056a41106a200641d8026a41106a290300370300200641b8056a41186a200641d8026a41186a290300370300200620062903800637039009200620062903d8023703b8054101210c0c0c0b418006418004200f20084b1b21080c0d0b4100211041002108200141d8006a2802004102470d06200641c0066a410c6a2210200141e0026a290200370200200641d4066a200141e8026a290200370200200641dc066a200141f0026a290200370200200641e2c289ab063602c0062006200141d8026a2902003702c406200141dc006a280200210820064198026a200141e0006a10ca01200641b8026a410c6a20064198026a41086a280200360200200620083602b80220062006290398023702bc022006200141ec006a2802003602c80220064188036a200641c0066a200641b8026a10ef0320062d0088034101470d0520064180066a41166a2208200641a1036a29000037010020064180066a41106a220f2006419b036a290000370300200641f0086a41086a221120064193036a290000370300200641f0086a41106a2216200f290300370300200641f0086a41166a220f20082901003701002006200629008b033703f00820062f0089032108200641e0056a41166a2217200f290100370100200641e0056a41106a220f2016290300370300200641e0056a41086a22162011290300370300200620062903f0083703e005200620083b0180062006418a066a201629030037010020064192066a200f29030037010020064198066a2017290100370000200620062903e0053701820641002108034020084120460d0341081024220f450d09200642083702c4062006200f3602c00620012903702107200641c0066a41004108106d20062802c006221120062802c806220f6a20073700002010410029009dd541370000201041086a41002900a5d541370000200620064180066a20086a3602dc062006200f41086a3602c80620064188036a200641c0066a109401024020062802c406450d00201110260b200641c0066a20064188036a10fe02200641c0016a20062802c006221120062802c80641d4c0c7004100410010810220062802c001210f024020062802c406450d00201110260b200841206a2108200f4101460d000b410221100c030b4100211041002108200141d8006a2802004102470d05200641c0066a410c6a2210200141d8026a290000370200200641d4066a200141e0026a290000370200200641dc066a200141e8026a290000370200200641e7e485f3063602c0062006200141d0026a2900003702c406200141dc006a280200210820064198026a200141e0006a10ca01200641b8026a410c6a20064198026a41086a280200360200200620083602b80220062006290398023702bc022006200141ec006a2802003602c80220064188036a200641c0066a200641b8026a10ef0320062d0088034101470d0420064180066a41166a2208200641a1036a29000037010020064180066a41106a220f2006419b036a290000370300200641f0086a41086a221120064193036a290000370300200641f0086a41106a2216200f290300370300200641f0086a41166a220f20082901003701002006200629008b033703f00820062f0089032108200641e0056a41166a2217200f290100370100200641e0056a41106a220f2016290300370300200641e0056a41086a22162011290300370300200620062903f0083703e00520014180016a2903002107200141f0006a290300210d200620083b0180062006418a066a201629030037010020064192066a200f29030037010020064198066a2017290100370000200620062903e0053701820641002108034020084120460d02200641003602c806200642013703c006200641c0066a41004108106d20062802c00620062802c806220f6a200d3700002006200f41086a220f3602c806200641c0066a200f4108106d20062802c006221120062802c806220f6a2007370000201041002900fdd441370000201041086a4100290085d541370000200620064180066a20086a3602dc062006200f41086a3602c80620064188036a200641c0066a109401024020062802c406450d00201110260b200641c0066a20064188036a10fe02200641c8016a20062802c006221120062802c80641d4c0c7004100410010810220062802c801210f024020062802c406450d00201110260b200841206a2108200f4101460d000b410221100c020b200641c0066a200141d4006a10f003024020062d00c0064101460d00200641ec066a2802002116200641e8066a280200210f200641e4066a2802002117200641dc066a2802002111200641d8066a28020021180240200641e0066a2802002208450d002008410c6c21102018210803400240200841046a280200450d00200828020010260b2008410c6a2108201041746a22100d000b0b02402011450d002011410c6c450d00201810260b02402016450d002016410c6c21102017210803400240200841046a280200450d00200828020010260b2008410c6a2108201041746a22100d000b0b200f450d03200f410c6c450d03201710260c030b20062d00c10622104102460d0220062f01c20621080c040b410021100b4103210820104102470d020b20064190096a41186a200c29030037030020064190096a41106a200b29030037030020064190096a41086a200a290300370300200620062903d802370390094100210c4200210d4200211442002112420021130c050b41042108410021100b200041013a0000200041036a20084108763a0000200020084108742010723b00010c060b41f0afc7004119418cb0c700102f000b1033000b200020083b0001200041013a0000200041036a20084110763a00000c030b20064198026a41186a2208200641b8056a41186a221029030037030020064198026a41106a220f200641b8056a41106a221129030037030020064198026a41086a220a200641b8056a41086a220b290300370300200620062903b80537039802200641b8026a41186a20064190096a41186a290300370300200641b8026a41106a20064190096a41106a290300370300200641b8026a41086a20064190096a41086a29030037030020062006290390093703b80220064188036a200141d0006a41b00210cf061a200641c0066a41186a22012008290300370300200641c0066a41106a2208200f290300370300200641c0066a41086a2216200a29030037030020062006290398023703c0064102210f0240200c450d0020064180066a41186a200129030037030020064180066a41106a200829030037030020064180066a41086a2016290300370300200620062903c006370380064101210f0b200b20064180066a41086a290300370300201120064180066a41106a290300370300201020064180066a41186a29030037030020062006290380063703b8050240411010242208450d00200841b889c70036020c200841013602082008428180808010370200411010242201450d00200141d089c70036020c20014101360208200142818080801037020020082008280200417f6a2210360200024020100d002008280208200828020c2802001103000240200828020c280204450d00200828020810260b20082008280204417f6a221036020420100d00200810260b02400240200128020820064188036a200128020c28020c110100450d00200641c0066a20064188036a41b00210cf061a2006418a066a200641c0056a29030037010020064192066a200641c8056a2903003701002006419a066a200641d0056a290300370100200641a2066a200641d8056a2f01003b01002006200f3a008106200641003a008006200620062903b80537018206200620013602a406200641d8026a200641c0066a20064180066a10a30320062903d80221190c010b200641f8026a41023a0000200641f0026a41003a000020012001280200417f6a2208360200200642003703e00242012119200642013703d802024020080d002001280208200128020c2802001103000240200128020c280204450d00200128020810260b20012001280204417f6a220836020420080d00200110260b20064188036a1098030b200641d8026a41106a2903002115200641d8026a41186a2d0000210120062903e002211a200641e0056a41186a200641b8026a41186a290300370300200641e0056a41106a200641b8026a41106a290300370300200641e0056a41086a200641b8026a41086a290300370300200620062903b8023703e0050240024002400240024002400240024002400240024002400240024002402019500d00201a4202510d01200341ff01714102470d00200641f8026a2d000022084104460d0020064180036a2802002103200641fc026a280200210120063100fa02210220063100f902210941dff1c600410e1084024198b2c700410d10840202400240024020080e0400010205000b200120031084020c0f0b418ab2c700410e1084020c0e0b4180b2c700410a1084020c0d0b201520025a0d00201a4201520d00200641d8066a22084200370300200641c0066a41106a22104200370300200641c0066a41086a220f4200370300200642003703c006200641b8056a41808cc700410610fb01200f200641b8056a41086a2211290000370300200620062900b8053703c006200641b8056a41b8bbc400410b10fb0120082011290000370300201020062900b80537030020064188036a200641c0066a108f0220062006290390034200200629038803420151220a1b37038006200620064188036a41106a220b2903004200200a1b3703900920064190096a20064180066a200341ff01714101461b22034200200329030022194200200220157d221b201b2002561b7d221b201b2019561b370300200b20062903900937030020062006290380063703900320064201370388032008420037030020104200370300200f4200370300200642003703c006200641b8056a41808cc700410610fb01200f2011290000370300200620062900b8053703c006200641b8056a41b8bbc400410b10fb0120082011290000370300201020062900b805370300200641c0066a20064188036a41086a10f1030b200641f0086a41186a200641e0056a41186a290300370300200641f0086a41106a200641e0056a41106a290300370300200641f0086a41086a200641e0056a41086a290300370300200620062903e0053703f0082014500d0920064198016a20052002201520152002561b2002201a4201511b2009200d200441ff0171410146200141ff01714101467210ec034200210202402012200629039801221a58201320064198016a41086a29030022155820132015511b450d00420021130c050b4200201320157d2012201a54ad7d22022012201a7d2215201256200220135620022013511b22011b21134200201520011b210220064190096a200641f0086a10d80320064188036a2006280290092208200628029809220110d9032006290388032115200642003703880320154201520d010240200629039003221220027c22142012542203200629039803221a20137c2003ad7c2212201a542012201a511b450d00200641c0066a410310eb020c030b200641c0036a290300211b200641b8036a290300211c200641a8036a290300211a200641a0036a2903002119200641a0066a200641b0036a290300370300200641a8066a201c370300200641b0066a201b3703002006201a3703980620062014370380062006201237038806200620193703900602400240427f201420197c221b201b20145422032012201a7c2003ad7c221b201254201b2012511b22031b221c4280c8afa025544100427f201b20031b221b501b0d0020064190066a2903002112200629038806211a2006290380062114420121190c010b0240024020142019842012201a848450450d00420021190c010b42002119200641c0066a41186a22054200370300200641c0066a41106a22104200370300200641c0066a41086a22034200370300200642003703c006200641b8056a419a8cc700410810fb012003200641b8056a41086a220f290000370300200620062900b8053703c006200641b8056a41b8a1c300410d10fb012005200f290000370300201020062900b80537030020064180016a200641c0066a108d0220064180016a41106a2903002112200629038801211a2006280280012111200542003703002010420037030020034200370300200642003703c006200641b8056a419a8cc700410810fb012003200f290000370300200620062900b8053703c006200641b8056a41b8a1c300410d10fb012005200f290000370300201020062900b805370300200642002012420020111b2212201b7d201a420020111b221a201c54ad7d2214201a201c7d221d201a56201420125620142012511b22051b3703c00520064200201d20051b3703b805200641c0066a4120200641b8056a411010b301200641f8066a201b370300200641f0066a201c370300200341013a0000200641c9066a20062903f008370000200641d1066a200641f0086a41086a290300370000200641d9066a200641f0086a41106a290300370000200641e1066a200641f0086a41186a290300370000200641023a00c006200641c0066a1087020b0b2015420151210520064198036a201a370300200641a0036a20123703002006201437039003200620194201512203ad37038803024020030d002008200110ff0141002103410021010c040b2008200120064190036a10da0341002101410121030c030b200910f203200210f20320010d090c0a0b200641c0066a410810eb020b20062902c4062215420888a721032015a72105410121010b0240200628029409450d00200810260b20010d0102400240200541ff017122010d00200341ff01710d010b2001450d01200341ff01710d01200641c0066a41086a41043a0000200641c9066a20062903f008370000200641d1066a200641f0086a41086a290300370000200641d9066a20064180096a290300370000200641e1066a20064188096a290300370000200641003a00c006200641c0066a1087020c010b200641c0066a41086a41033a0000200641c9066a20062903f008370000200641d1066a200641f0086a41086a290300370000200641d9066a20064180096a290300370000200641e1066a20064188096a290300370000200641003a00c006200641c0066a1087020b200e20137d20072002542201ad7d2013200e7d2002200754ad7d200720025a200e20135a200e20135122081b22031b2115200720027d200220077d20031b21072001200e20135420081b0d012015210e0b02402007200920072007200956200e200d56200e200d511b22011b22027d2213200284200e200d200e20011b22097d2007200254ad7d2202200984844200520d00200641d8066a22014200370300200641c0066a41106a22084200370300200641c0066a41086a22034200370300200642003703c006200641b8056a419a8cc700410810fb012003200641b8056a41086a2205290000370300200620062900b8053703c006200641b8056a41b8a1c300410d10fb0120012005290000370300200820062900b805370300200641086a200641c0066a108d02200641086a41106a29030021022006290310210720062802082110200142003703002008420037030020034200370300200642003703c006200641b8056a419a8cc700410810fb0120032005290000370300200620062900b8053703c006200641b8056a41b8a1c300410d10fb0120012005290000370300200820062900b80537030020062002420020101b3703900320062007420020101b37038803200641c0066a412020064188036a411010b3010c040b427f200220097c20072013542201ad7c22092001200920025420092002511b22011b2102427f200720011b210720064190096a10b603200641b8056a10b603200641b0096a200641b8056a10d80320064188036a20062802b009220320062802b809221010d903200629038803210e2006420037038803200641d0036a280200210f20062d00d40321110240200e4201520d00200641a0036a290300211420062903980321132006290390032109200641c0036a2903002119200641b8036a290300211b200641b0036a290300211c20062903a803211220062903c803211d0c020b4100210142002109024020074280c8afa0255441002002501b0d0042002113420021144200211d420021124200211c4200211b420021190c020b410121054200211a410021080c020b200641d8066a22014200370300200641c0066a41106a22084200370300200641c0066a41086a22034200370300200642003703c006200641b8056a419a8cc700410810fb012003200641b8056a41086a2205290000370300200620062900b8053703c006200641b8056a41b8a1c300410d10fb0120012005290000370300200820062900b805370300200641e8006a200641c0066a108d02200641e8006a41106a29030021022006290370210920062802682110200142003703002008420037030020034200370300200642003703c006200641b8056a419a8cc700410810fb0120032005290000370300200620062900b8053703c006200641b8056a41b8a1c300410d10fb0120012005290000370300200820062900b8053703002006427f2002420020101b220220157c2009420020101b220920077c220d2009542201ad7c22072001200720025420072002511b22011b370390032006427f200d20011b37038803200641c0066a412020064188036a411010b30141800221010c050b4200211a0240200920077c22152009542201201320027c2001ad7c220d201354200d2013511b450d00410121054100210142002109410021080c010b200641a0066a201c370300200641a8066a201b370300200641b0066a20193703002006201237039806200620153703800620062014370390062006200d3703880602400240427f201520147c220920092015542201200d20127c2001ad7c2209200d542009200d511b22011b22134280c8afa025544100427f200920011b2209501b0d0020064190066a2903002109200629038806211320062903800621144201211e0c010b024002402015201484200d2012848450450d004200211e0c010b4200211e200641c0066a41186a22084200370300200641c0066a41106a22054200370300200641c0066a41086a22014200370300200642003703c006200641c0096a419a8cc700410810fb012001200641c0096a41086a2204290000370300200620062900c0093703c006200641c0096a41b8a1c300410d10fb0120082004290000370300200520062900c009370300200641d0006a200641c0066a108d02200641d0006a41106a29030021142006290358211f2006280250210a200842003703002005420037030020014200370300200642003703c006200641c0096a419a8cc700410810fb0120012004290000370300200620062900c0093703c006200641c0096a41b8a1c300410d10fb0120082004290000370300200520062900c0093703002006420020144200200a1b221420097d201f4200200a1b221f201354ad7d2220201f20137d2221201f56202020145620202014511b22081b3703c80920064200202120081b3703c009200641c0066a4120200641c0096a411010b301200641f8066a2009370300200641f0066a2013370300200141013a0000200641c9066a20062903b805370000200641d1066a200641b8056a41086a290300370000200641d9066a200641b8056a41106a290300370000200641e1066a200641b8056a41186a290300370000200641023a00c006200641c0066a1087020b0b200e4201512108200641b0036a201c370300200641b8036a201b37030020064198036a2013370300200641c0036a2019370300200641a0036a2009370300200620123703a8032006201d3703c803200620143703900341002105200620114100200e42015122011b3a00d4032006200f410020011b3602d0032006201e4201512201ad37038803200e420152ad4230862109024020010d002003201010ff01410021010c010b2003201020064190036a10da03410121010b024020062802b409450d00200310260b0240024002400240024020050d0002402001450d002008450d020b20010d022008450d02200641c0066a41086a41043a0000200641c9066a20062903b805370000200641d1066a200641b8056a41086a290300370000200641d9066a200641c8056a290300370000200641e1066a200641d0056a290300370000200641003a00c006200641c0066a1087020c020b20072001ad4208862009421086842008ad84220d7d200d20077d2007200d5a2002201a42108620094230888442ffffffffffff3f8322095a200220095122011b22081b210e200220097d2007200d542203ad7d200920027d200d200754ad7d20081b21132003200220095420011b450d02200641d8066a22014200370300200641c0066a41106a22084200370300200641c0066a41086a22034200370300200642003703c006200641c0096a419a8cc700410810fb012003200641c0096a41086a2205290000370300200620062900c0093703c006200641c0096a41b8a1c300410d10fb0120012005290000370300200820062900c009370300200641386a200641c0066a108d02200641386a41106a29030021092006290340210d20062802382110200142003703002008420037030020034200370300200642003703c006200641c0096a419a8cc700410810fb0120032005290000370300200620062900c0093703c006200641c0096a41b8a1c300410d10fb0120012005290000370300200820062900c0093703002006427f2009420020101b220920137c200d420020101b220d200e7c220e200d542201ad7c220d2001200d200954200d2009511b22011b370390032006427f200e20011b37038803200641c0066a412020064188036a411010b3010c030b200641c0066a41086a41033a0000200641c9066a20062903b805370000200641d1066a200641b8056a41086a290300370000200641d9066a200641c8056a290300370000200641e1066a200641d0056a290300370000200641003a00c006200641c0066a1087020b4200210e42002113200942808080808080c00085201a42ffffffffffff3f83844200520d00200641f8066a200d370300200641f0066a2015370300200641c0066a41086a41003a0000200641c9066a20062903b805370000200641d1066a200641b8056a41086a290300370000200641d9066a200641c8056a290300370000200641e1066a200641d0056a290300370000200641023a00c006200641c0066a1087024200210e420021130b200641d8066a22014200370300200641c0066a41106a22084200370300200641c0066a41086a22034200370300200642003703c006200641c0096a419a8cc700410810fb012003200641c0096a41086a2205290000370300200620062900c0093703c006200641c0096a41b8a1c300410d10fb0120012005290000370300200820062900c009370300200641206a200641c0066a108d02200641206a41106a29030021092006290328210d20062802202110200142003703002008420037030020034200370300200642003703c006200641c0096a419a8cc700410810fb0120032005290000370300200620062900c0093703c006200641c0096a41b8a1c300410d10fb0120012005290000370300200820062900c009370300200642002009420020101b220920137d200d420020101b220d200e54ad7d2213200d200e7d220e200d56201320095620132009511b22011b3703900320064200200e20011b37038803200641c0066a412020064188036a411010b3010b200641f8066a2002370300200641f0066a2007370300200641c0066a41086a41043a0000200641c9066a200629039009370000200641d1066a20064190096a41086a290300370000200641d9066a200641a0096a290300370000200641e1066a200641a8096a290300370000200641023a00c006200641c0066a1087020b200041086a20062903d802370300200041003a0000200041306a200641d8026a41286a290300370300200041286a200641d8026a41206a290300370300200041206a200641d8026a41186a290300370300200041186a200641d8026a41106a290300370300200041106a200641d8026a41086a290300370300200641d0096a24000f0b200120031084020b41801021012014500d00200641d8066a22084200370300200641c0066a41106a22034200370300200641c0066a41086a22054200370300200642003703c006200641b8056a419a8cc700410810fb012005200641b8056a41086a2210290000370300200620062900b8053703c006200641b8056a41b8a1c300410d10fb0120082010290000370300200320062900b805370300200641a8016a200641c0066a108d02200641a8016a41106a290300210220062903b001210920062802a801210f200842003703002003420037030020054200370300200642003703c006200641b8056a419a8cc700410810fb0120052010290000370300200620062900b8053703c006200641b8056a41b8a1c300410d10fb0120082010290000370300200320062900b8053703002006420020024200200f1b2202200e7d20094200200f1b2209200754ad7d220d200920077d2207200956200d200256200d2002511b22081b3703900320064200200720081b37038803200641c0066a412020064188036a411010b3010b200020013b0001200041013a0000200041036a41003a00000c040b102c000b20062f01c206410874210f02402014500d00200641d8066a22044200370300200641c0066a41106a220a4200370300200641c0066a41086a22034200370300200642003703c00620064188036a419a8cc700410810fb01200320064188036a41086a220529000037030020062006290088033703c00620064188036a41b8a1c300410d10fb01201041086a220b20052900003700002010200629008803370000200641d0016a200641c0066a108d02200641d0016a41106a290300210220062903d801210920062802d001211120044200370300200a420037030020034200370300200642003703c00620064188036a419a8cc700410810fb012003200529000037030020062006290088033703c00620064188036a41b8a1c300410d10fb01200b20052900003700002010200629008803370000200642002002420020111b2202200e7d2009420020111b2209200754ad7d220d200920077d2207200956200d200256200d2002511b22031b3703900320064200200720031b37038803200641c0066a412020064188036a411010b3010b200f20087221080b200020083b0001200041013a0000200041036a20084110763a00000b200141d0006a1098030b200641d0096a24000bda0702077f037e230041c0006b22032400200341206a22044200370300200341086a41106a22054200370300200341086a41086a2206420037030020034200370308200341286a41808cc700410610fb012006200341286a41086a220729000037030020032003290028370308200341286a41f4bbc400411010fb0120042007290000370300200520032900283703002003200341086a412010890241800c21080240417f2003280204410020032802001b220920026a220220022009491b2202418080c002418080f001200141ff017122011b4b0d0020044200370300200542003703002006420037030020034200370308200341286a41808cc700410610fb012006200729000037030020032003290028370308200341286a41b8bbc400410b10fb01200541086a200729000037000020052003290028370000200341286a200341086a108f0220032903304200200329032842015122061b210a200341286a41106a290300420020061b210b024002400240024020010e03010002010b200042c0b2cd3b7c220c2000540d03200b200c7c220c200b540d03427f200a200c7c220b200b200a541b4280c0a8ca9a3a56200c428090cad2c60e56710d03200c210b200a210c427f200042c0b2cd3b7c220a200a2000541b4281dc90fa873a5a0d030c020b200042c0b2cd3b7c220c2000540d02200a200c7c220c200a540d02200c4280b0def7d32b560d02427f200042c0b2cd3b7c220a200a2000541b428090a7f0ea25580d010c020b427f200a427f200042c0b2cd3b7c220c200c2000541b7c22002000200a541b210c0b200341206a22044200370300200341086a41106a22084200370300200341086a41086a2206420037030020034200370308200341286a41808cc700410610fb012006200341286a41086a220729000037030020032003290028370308200341286a41f4bbc400411010fb01200541086a220120072900003700002005200329002837000020032002360228200341086a4120200341286a410410b30120044200370300200842003703002006420037030020034200370308200341286a41808cc700410610fb012006200729000037030020032003290028370308200341286a41b8bbc400410b10fb0120012007290000370000200520032900283700002003410036023020034201370328200341286a41004108106d2003280228200328023022056a200c3700002003200541086a2205360230200341286a20054108106d20032802282205200328023022066a200b3700002003200641086a2206360230200341086a41202005200610b3010240200328022c450d00200510260b41820c21080b200341c0006a240020080b860404017f017e027f037e23004180016b22062400024020050d00200641c0006a200210ea04200641c0006a41086a290300210220062903402107200641e8006a22084200370300200641d0006a41106a22054200370300200641d0006a41086a2209420037030020064200370350200641d0006a41cca3c700411210fb01200641f0006a41f4b1c500411110fb012008200641f0006a41086a29000037030020052006290070370300200641286a200641d0006a108d02200641d0006a200629033042808090bbbad6adf00d200628022822081b200641286a41106a290300420020081b2007200242808090bbbad6adf00d4200108e02200641186a2001ad42004280c2d72f420010cc06200641186a41086a29030021072006290318210a0240024020062802504101470d00427f210b427f210c0c010b2005290300210c2009290300210b0b200641086a42c0b2cd3b10ea04427f427f427f200641106a290300220220077c20062903082207200a7c220a2007542205ad7c22072005200720025420072002511b22051b2202200c7c427f200a20051b2207200b7c220a2007542205ad7c22072005200720025420072002511b22051b220220047c427f200a20051b220420037c22072004542205ad7c22032005200320025420032002511b22051b2104427f200720051b21030b200020033703002000200437030820064180016a24000ba01006077f027e037f0d7e017f027e230041c0026b2203240020022802102104200228020c2105200228020821062002280204210720022802002102200341186a200110d803200341286a200328021822082003280220220910d9032003290328210a4200210b20034200370328200341f0006a280200210c20032d0074210d02400240200a420152220e450d004200210f420021104200211142002112420021134200211442002115420021160c010b200341e0006a2903002114200341d8006a2903002113200341d0006a2903002112200341c8006a290300210f200341c0006a29030021102003290338211620032903302115200341e8006a29030021114200210b0b0240024002400240024002400240024002402015200229030022177d22182015562016200241086a29030022197d2015201754ad7d221a201656201a2016511b0d00024020182010200b8422107c221b42ffc7afa02556201a200b200f84220f7c201b201854221cad7c220b420052200b501b0d00201520107c221d4280c8afa0255441002016200f7c201d201554ad7c501b0d0020072d00004101470d060b2017201984500d0420052d00002105200341f8006a200628020010d803200341b0016a2003280278220620032802800110d90320032903b0014201512107200341e0016a2903002115200341d8016a2903002116200341f0016a2903002119200341e8016a290300211d0240200328027c450d00200610260b2015420020071b21172016420020071b211e2019420020071b2115201d420020071b211641004102410120054101711b200541ff01714101461b0e03030201030b200341b0016a410410eb020c050b20172015201e201656201720155620172015511b22071b2115201e201620071b21160c010b201e2116201721150b20162018562015201a562015201a511b450d00200341b0026a410210eb0220032d00b00222074104460d0020032902b402211520032f00b10220032d00b30241107472410874200772210d0c030b200241086a29030021162002290300211520042802002102200341a8016a22072014370300200341a0016a22052013370300200320103703880120034190016a200f3703002003201237039801200320183703782003201a3703800102400240427f201b201c200b201a54200b201a511b22041b22174280c8afa025544100427f200b20041b220b501b0d0020034188016a29030021172007290300210f2005290300211020034198016a290300211920032903800121122003290378211342012114200329039001211b0c010b024002402018201084201a200f848450450d00420021140c010b42002114200341b0016a41186a22074200370300200341b0016a41106a22054200370300200341b0016a41086a22044200370300200342003703b001200341b0026a419a8cc700410810fb012004200341b0026a41086a2206290000370300200320032900b0023703b001200341b0026a41b8a1c300410d10fb0120072006290000370300200520032900b0023703002003200341b0016a108d02200341106a290300210f200329030821102003280200211c200742003703002005420037030020044200370300200342003703b001200341b0026a419a8cc700410810fb0120042006290000370300200320032900b0023703b001200341b0026a41b8a1c300410d10fb0120072006290000370300200520032900b00237030020034200200f4200201c1b220f200b7d20104200201c1b2210201754ad7d2219201020177d22122010562019200f562019200f511b22071b3703b80220034200201220071b3703b002200341b0016a4120200341b0026a411010b301200341e8016a200b370300200341e0016a2017370300200441013a0000200341b9016a2002290000370000200341c1016a200241086a290000370000200341c9016a200241106a290000370000200341d1016a200241186a290000370000200341023a00b001200341b0016a1087020b0b200a4201512102200ead210b200341d0006a2019370300200341e8006a2011370300200341d8006a2010370300200341386a2012370300200341e0006a200f370300200341c0006a20173703002003201b37034820032013370330410021042003200d4100200a420151220e1b3a00742003200c4100200e1b36027020032014420151220cad37032802400240200c0d002008200910ff014200210a4100210c0c010b20082009200341306a10da034200210a4101210c0b0c030b200341b0016a410610eb020b20032902b401211520032802b001210d0b20154280807c83210a2015420888a7210c2015a72102410121040b0240200328021c450d00200810260b024002402004450d002000200d36020420004101360200200041086a200cad42ff01834208862002ad42ff018384200a843702000c010b024002400240200c41ff01712204450d00200241ff0171450d010b20040d01200241ff0171450d01200341b0016a41086a41043a0000200341b9016a2001290000370000200341c1016a200141086a290000370000200341c9016a200141106a290000370000200341d1016a200141186a290000370000200341003a00b001200341b0016a1087020c010b200341b0016a41086a41033a0000200341b9016a2001290000370000200341c1016a200141086a290000370000200341c9016a200141106a290000370000200341d1016a200141186a290000370000200341003a00b001200341b0016a1087020b20004100360200200041286a2016370300200041206a2015370300200041186a201a370300200041106a2018370300200041086a200b3703000b200341c0026a24000bb80403047f017e017f230041d0006b22022400024002400240024002402001280200410c470d00200141086a2d00004102470d00200241106a10ad03024002402001410c6a280200200141206a280200470d00200241386a22034200370300200241306a22044200370300200241206a41086a420037030020024200370320200241206a41eb8cc700410a10fb01200241c0006a41dc9dc600410b10fb012003200241c0006a41086a29000037030020042002290040370300200241c0006a200241206a10da0420022802402203410120031b210502402002290244420020031b2206422088a72204450d00200141c4006a2103200441057441606a41057641016a21074100210420052101034020032001460d0320012003412010d206450d03200141206a21012007200441016a2204470d000b0b200041800e3b0001200041013a0000200041036a41003a00000c040b20004180083b0001200041013a0000200041036a41003a00000c040b2002280218220120044d0d01200041800e3b0001200041013a0000200041036a41013a00000c020b200041003a0000200041306a41013a0000200041286a4200370300200041206a4280808080c000370300200041186a4204370300200041106a427f370300200041086a4200370300200041316a2002280009360000200041346a2002410c6a2800003600000c030b200420014184f4c4001032000b200642ffffff3f83500d00200510260b200228021441ffffff3f71450d00200228021010260b200241d0006a24000b9c0a03067f047e027f230041c0026b2203240020012800002104200341106a41186a2001411c6a290000370300200341106a41106a200141146a290000370300200341106a41086a2001410c6a2900003703002003200129000437031020022802002101200341e0016a41186a22054200370300200341e0016a41106a22064200370300200341e0016a41086a22074200370300200342003703e001200341e0016a41b48cc700410710fb01200341d0006a4184c1c200410c10fb012005200341d0006a41086a220829000037030020062003290050370300200341086a200341e0016a4120108902024002400240024002402001200328020c410020032802081b460d00200341d0006a200110fa032007200341d0006a410c6a2902003703002006200341d0006a41146a2902003703002005200341d0006a411c6a290200370300200320032902543703e00120032802504101470d01200341c0016a41086a2205200341e0016a41086a2903002209370300200341c0016a41106a2206200341e0016a41106a290300220a370300200341c0016a41186a2207200341e0016a41186a290300220b370300200320032903e001220c3703c001200341f4006a2802002101200341306a41186a2208200b370300200341306a41106a220d200a370300200341306a41086a220e20093703002003200c37033020012002280210470d02200720082903003703002006200d2903003703002005200e290300370300200320032903303703c0012002410c6a280200210720022802042108200341e0016a10fb0302402007450d0020082007410c6c6a210541002802cc9f40210641002902c49f402109200821010340200341b0026a41086a2006360200200320093703b002200341d0006a200341e0016a200341b0026a2001280200200141086a28020010fc032001410c6a22012005470d000b0b200341d0006a200341e0016a41d00010cf061a200341b8016a200341d8016a290300370300200341b0016a200341d0016a290300370300200341a8016a200341c0016a41086a290300370300200320032903c0013703a0012000200341d0006a2004200341106a10fd03200341d0006a10fe0302402007450d002007410c6c21052008210103400240200141046a280200450d00200128020010260b2001410c6a2101200541746a22050d000b0b200241086a2802002201450d042001410c6c450d04200810260c040b20084120360200200320043602502003200341106a360254200341c0016a200341d0006a10bd03200341d0006a20032802c001220120032802c80110b80320032d00502105024020032802c401450d00200110260b200041003a00002002410c6a2802002101200241086a28020021062002280204210202400240200541ff01714101460d0002402001450d002001410c6c21052002210103400240200141046a280200450d00200128020010260b2001410c6a2101200541746a22050d000b0b2006450d052006410c6c0d010c050b02402001450d002001410c6c21052002210103400240200141046a280200450d00200128020010260b2001410c6a2101200541746a22050d000b0b2006450d042006410c6c450d040b200210260c030b200041003a00000c010b200041003a00000b2002280204210602402002410c6a2802002201450d002001410c6c21052006210103400240200141046a280200450d00200128020010260b2001410c6a2101200541746a22050d000b0b200241086a2802002201450d002001410c6c450d00200610260b200341c0026a24000bbd0e02087f017e23004190016b2202240020012802202103200241d8006a10ad0302400240024002400240024002400240200228026020034b0d00200228025c41ffffff3f71450d01200228025810260c010b20032002280258220420034105746a10ae0321030240200228025c41ffffff3f71450d00200410260b20030d010b200241f0006a22034200370300200241e8006a22044200370300200241d8006a41086a2205420037030020024200370358200241c0006a41b48cc700410710fb012005200241c0006a41086a220629000037030020022002290040370358200241c0006a4184c1c200410c10fb012003200629000037030020042002290040370300200241086a200241d8006a4120108902200128021c200228020c410020022802081b2205470d01200241106a10ac03200228021822032001280224470d022003200128022022044b0d0320004180083b0001200041013a0000200041036a410a3a00000c040b20004180063b0001200041013a0000200041036a410a3a00000c040b20004180063b0001200041013a0000200041036a410a3a00000c030b200041800e3b0001200041013a0000200041036a410a3a00000c010b200141286a21072002280210220820044105746a2106200241003602602002420137035820012802002103200241d8006a41004104106d2002280258200228026022046a20033600002002200441046a36026020012802042001410c6a280200200241d8006a109501200141106a2802002103200241d8006a200141186a280200220410a10102402004450d0020032004410c6c6a210403402003280200200341086a280200200241d8006a1095012003410c6a22032004470d000b0b200128021c2103200241d8006a20022802604104106d2002280258200228026022046a20033600002002200441046a220336026020012802202104200241d8006a20034104106d2002280258200228026022036a20043600002002200341046a220336026020012802242101200241d8006a20034104106d20022802582203200228026022046a20013600002002200441046a2201360260200720032001200610f50221010240200228025c450d00200310260b024002402001450d002002418c016a4108360200200241f8006a4200370300200241f0006a4280808080c000370300200241d18cc70036028801200241013a008001200242043703682002427f370360200242ffffffffffffffffff00370358411010242203450d01200242103702342002200336023020022802880121070240024002400240200228028c01220341c000490d00200341808001490d012003418080808004490d02200241306a41004101106d2002280230200228023822016a41033a00002002200141016a2201360238200241306a20014104106d2002280230200228023822016a20033600002002200141046a2209360238200241306a21010c030b200241306a41004101106d2002280230200228023822016a20034102743a00002002200141016a2209360238200241306a21010c020b200241306a41004102106d2002280230200228023822016a20034102744101723b00002002200141026a2209360238200241306a21010c010b200241306a41004104106d2002280230200228023822016a20034102744102723600002002200141046a2209360238200241306a21010b20024181016a2104200120092003106d2002280230200228023822096a2007200310cf061a2002200920036a2203360238200120034104106d2002280230200228023822036a20053600002002200341046a2203360238200120034120106d2002280230200228023822016a22032006290000370000200341186a200641186a290000370000200341106a200641106a290000370000200341086a200641086a2900003700002002200141206a3602380240200228027c22032002280278470d00200241f4006a2003410110cb01200228027c21030b20022802742003410c6c6a22032002290330370200200341086a200241306a41086a280200360200200241c0006a41086a2203200241d8006a41186a2903003703002002200228027c41016a36027c200241c0006a41106a2201200241d8006a41206a29030037030020022002290368370340200220042900003703302002200441076a2900003700372002290358210a200241d8006a41106a22042001290300370300200241d8006a41086a22012003290300370300200220022903403703582002200229003737002720022002290330370320200041106a42ac02370300200041086a200a370300200041306a41013a0000200041186a2002290358370300200041206a2001290300370300200041286a2004290300370300200041003a0000200041316a2002280220360000200041346a2002280023360000200228021441ffffff3f71450d03200810260c030b20004180083b0001200041013a0000200041036a410a3a00000c010b1033000b200228021441ffffff3f71450d00200228021010260b20024190016a24000b9c0103017f017e017f230041106b22022400200241003602082002420137030020012903002103200241004108106d2002280200200228020822046a20033700002002200441086a220436020820012903082103200220044108106d20022802002201200228020822046a20033700002002200441086a2204360208200041202001200410b30102402002280204450d00200110260b200241106a24000b06002000100d0b9c52040a7f057e017f017e23004180066b22072400024002400240024002400240024020012903204202520d00200741c0006a41206a22084200370300200741c0006a41186a22094280808080c000370300200741013a0068200742043703502007427f3703482007420037034020074180056a41206a220a420037030020074180056a41186a220b4280808080c000370300200741013a00a80520074204370390052007427f370388052007420037038005200741a8016a200741c0006a20074180056a10f403200741c0006a41286a220c200741a8016a41286a2903003703002008200741a8016a41206a2903003703002009200741a8016a41186a290300370300200741c0006a41106a220d200741a8016a41106a290300370300200741c0006a41086a220e200741a8016a41086a290300370300200720072903a801370340200a4200370300200b4280808080c000370300200741013a00a80520074204370390052007427f370388052007420037038005200741d8016a200741c0006a20074180056a10f403200c200741d8016a41286a2903003703002008200741d8016a41206a2903003703002009200741d8016a41186a290300370300200d200741d8016a41106a290300370300200e200741d8016a41086a290300370300200720072903d801370340200a4200370300200b4280808080c000370300200741013a00a80520074204370390052007427f37038805200742003703800520074188026a200741c0006a20074180056a10f403200c20074188026a41286a290300370300200820074188026a41206a290300370300200920074188026a41186a290300370300200d20074188026a41106a290300370300200e20074188026a41086a2903003703002007200729038802370340200a4200370300200b4280808080c000370300200741013a00a80520074204370390052007427f370388052007420037038005200741b8026a200741c0006a20074180056a10f403200c200741b8026a41286a2903003703002008200741b8026a41206a2903003703002009200741b8026a41186a290300370300200d200741b8026a41106a290300370300200e200741b8026a41086a290300370300200720072903b802370340200a4200370300200b4280808080c000370300200741013a00a80520074204370390052007427f370388052007420037038005200741e8026a200741c0006a20074180056a10f403200741a8046a41286a200741e8026a41286a290300370300200741a8046a41206a220f200741e8026a41206a290300370300200741a8046a41186a2205200741e8026a41186a290300370300200741a8046a41106a200741e8026a41106a290300370300200741a8046a41086a2210200741e8026a41086a290300370300200720072903e8023703a80420074180056a20032004200610f50320072d0080054101470d0120072d008305210a20072f008105210b20072802b8042109024020052802002201450d002001410c6c21082009210103400240200141046a280200450d00200128020010260b2001410c6a2101200841746a22080d000b0b0240200741bc046a2802002201450d002001410c6c450d00200910260b200a411074210a20072802c40421090240200741cc046a2802002201450d002001410c6c21082009210103400240200141046a280200450d00200128020010260b2001410c6a2101200841746a22080d000b0b200b200a7221010240200741c8046a2802002208450d002008410c6c450d00200910260b200041036a20014110763a0000200020013b0001200041013a00000c060b200741c0006a41206a22084200370300200741c0006a41186a22094280808080c000370300200741013a006820074204370350427f21112007427f3703482007420037034020074180056a41206a220a420037030020074180056a41186a220b4280808080c000370300200741013a00a80520074204370390052007427f370388052007420037038005200741f8006a200741c0006a20074180056a10f403200741c0006a41286a220c200741f8006a41286a2903003703002008200741f8006a41206a2903003703002009200741f8006a41186a290300370300200741c0006a41106a220d200741f8006a41106a290300370300200741c0006a41086a220e200741f8006a41086a29030037030020072007290378370340200a4200370300200b4280808080c000370300200741013a00a80520074204370390052007427f370388052007420037038005200741a8016a200741c0006a20074180056a10f403200c200741a8016a41286a2903003703002008200741a8016a41206a2903003703002009200741a8016a41186a290300370300200d200741a8016a41106a290300370300200e200741a8016a41086a290300370300200720072903a801370340200a4200370300200b4280808080c000370300200741013a00a80520074204370390052007427f370388052007420037038005200741d8016a200741c0006a20074180056a10f403200c200741d8016a41286a2903003703002008200741d8016a41206a2903003703002009200741d8016a41186a290300370300200d200741d8016a41106a290300370300200e200741d8016a41086a290300370300200720072903d801370340200741d8046a41186a22084200370300200741d8046a41106a220c4200370300200741d8046a41086a22094200370300200742003703d80420074180056a41808cc700410610fb01200920074180056a41086a220d29000037030020072007290080053703d80420074180056a41ea93c400410610fb012008200d290000370300200c200729008005370300200741286a200741d8046a4120108902200728022c410020072802281bad2112024020012903204201520d00200129032822114200510d02200141306a290300221320117c4200201220137d221320132012561b22137c20132011827d21110b200a4200370300200b4280808080c000370300200741ac056a200741ab046a280000360000200741013a00a80520074204370390052007420037038005200720072800a8043600a90520074200201120127d221220122011561b3703880520074188026a200741c0006a20074180056a10f403200741a8046a41286a20074188026a41286a290300370300200741a8046a41206a20074188026a41206a290300370300200741a8046a41186a20074188026a41186a290300370300200741a8046a41106a20074188026a41106a290300370300200741a8046a41086a20074188026a41086a29030037030020072007290388023703a804200741f8036a200110d80320074180056a20072802f803220920072802800410d903200741c8056a28020041002007290380054201511b2108024020072802fc03450d00200910260b02400240200128024822092008490d00410c1024220a450d044104210d41041024220b450d0520074204370284052007200b360280054100210e20074180056a41004120106d20072802800520072802880522026a220b2001290000370000200b41086a200141086a290000370000200b41106a200141106a290000370000200b41186a200141186a2900003700002007200241206a220b3602880520074180056a200b4104106d200728028005200728028805220b6a2009360000200a200729038005370200200a41086a200b41046a3602000240200820094f0d00410c1024220d450d05410410242208450d062007420437028405200720083602800520074180056a41004120106d200728028005200728028805220b6a22082001290000370000200841086a200141086a290000370000200841106a200141106a290000370000200841186a200141186a2900003700002007200b41206a22083602880520074180056a20084104106d20072802800520072802880522086a2009417f6a360000200d200729038005370200200d41086a200841046a3602004101210e0b200741c0006a41206a428180808010370300200741c0006a41186a200e360200200741d4006a200e360200200741ec006a200741cb036a280000360000200741013a00682007200a36025c2007200d3602502007427f37034820072003370340200720072800c803360069200741b8026a200741a8046a200741c0006a10f403200741a8046a41286a200741b8026a41286a290300370300200741a8046a41206a200741b8026a41206a290300370300200741a8046a41186a200741b8026a41186a290300370300200741a8046a41106a200741b8026a41106a290300370300200741a8046a41086a200741b8026a41086a290300370300200720072903b8023703a80402400240200441ff01714102470d00200741003a008305418012210120074180123b008105200741013a0080050c010b20074180056a20032004200610f50320072d0080054101470d0220072f00810520072d0083054110747221010b200020013b0001200041013a0000200041036a20014110763a000020072802b80421000240200741c0046a2802002201450d002001410c6c21082000210103400240200141046a280200450d00200128020010260b2001410c6a2101200841746a22080d000b0b0240200741bc046a2802002201450d002001410c6c450d00200010260b20072802c40421000240200741cc046a2802002201450d002001410c6c21082000210103400240200141046a280200450d00200128020010260b2001410c6a2101200841746a22080d000b0b200741c8046a2802002201450d072001410c6c450d07200010260c070b20004180063b0001200041013a0000200041036a410a3a000020072802b80421000240200741c0046a2802002201450d002001410c6c21082000210103400240200141046a280200450d00200128020010260b2001410c6a2101200841746a22080d000b0b0240200741bc046a2802002201450d002001410c6c450d00200010260b20072802c40421000240200741cc046a2802002201450d002001410c6c21082000210103400240200141046a280200450d00200128020010260b2001410c6a2101200841746a22080d000b0b200741c8046a2802002201450d062001410c6c450d06200010260c060b200741c0006a41286a200741b0056a290300370300200741c0006a41206a20074180056a41286a290300370300200741c0006a41186a20074180056a41206a290300370300200741c0006a41106a20074180056a41186a290300370300200741c0006a41086a20074180056a41106a2903003703002007200729038805370340200741e8026a200741a8046a200741c0006a10f403200741f8036a41286a200741e8026a41286a290300370300200741f8036a41206a200741e8026a41206a290300370300200741f8036a41186a200741e8026a41186a290300370300200741f8036a41106a200741e8026a41106a290300370300200741f8036a41086a200741e8026a41086a290300370300200720072903e8023703f803200741186a2006200320012903382212200141c0006a2903002213200541ff017141004710ec03024002400240024020072903182203200741186a41086a290300221184500d00200741003a00ff04200720113703d003200720033703c803200720013602f804410121082007410141112012201384501b3a00fe04200720013602d8042007200741d8046a360290052007200741fe046a36028c052007200741f8046a360288052007200741ff046a360284052007200741c8036a36028005200741c0006a200120074180056a10ed030240024020072802404101470d0042002113200729034821120c010b200741e8006a2903002113200741e0006a29030021124100210820072903484201520d00200741c0006a41106a290300211420072802d8042109200741b8056a200741c0006a41186a290300370300200741b0056a20143703004100210820074180056a41086a41003a000020074189056a200929000037000020074191056a200941086a29000037000020074199056a200941106a290000370000200741a1056a200941186a290000370000200741023a00800520074180056a1087020b20080d01200741f0046a220b4200370300200741d8046a41106a220d4200370300200741d8046a41086a22084200370300200742003703d80420074180056a419a8cc700410810fb01200820074180056a41086a220929000037030020072007290080053703d80420074180056a41b8a1c300410d10fb01200c41086a220e2009290000370000200c2007290080053700002007200741d8046a108d02200741106a2903002114200729030821152007280200210a200b4200370300200d420037030020084200370300200742003703d80420074180056a419a8cc700410810fb012008200929000037030020072007290080053703d80420074180056a41b8a1c300410d10fb01200e2009290000370000200c2007290080053700002007420020144200200a1b221420137d20154200200a1b2213201254ad7d2215201320127d2212201356201520145620152014511b22081b3703880520074200201220081b37038005200741d8046a412020074180056a411010b3010b200741a8046a41206a22084200370300200741a8046a41186a22094280808080c000370300200741d4046a200741306a41036a280000360000200742043703b804200720072800303600d1042007427f3703b00420072003427f2011501b3703a804200741013a00d00420074198036a200741f8036a200741a8046a10f403200741a8046a41286a20074198036a41286a290300370300200820074198036a41206a290300370300200920074198036a41186a290300370300200741a8046a41106a20074198036a41106a290300370300200741a8046a41086a20074198036a41086a29030037030020072007290398033703a80420074180056a200141d0006a220110a80220072d0080054101460d01200741c0006a41286a220820074180056a41306a2209290300370300200741c0006a41206a220a20074180056a41286a220b290300370300200741c0006a41186a220c20074180056a41206a220d290300370300200741c0006a41106a220e20074180056a41186a2204290300370300200741c0006a41086a220620074180056a41106a22022903003703002007200729038805370340200741c8036a200741a8046a200741c0006a10f403200741a8046a41286a200741c8036a41286a290300370300200741a8046a41206a200741c8036a41206a290300370300200741a8046a41186a2205200741c8036a41186a290300370300200741a8046a41106a200741c8036a41106a290300370300200741a8046a41086a200741c8036a41086a290300370300200720072903c8033703a80420074180056a200110ee0320072d0080054101460d0220082009290300370300200a200b290300370300200c200d290300370300200e2004290300370300200620022903003703002007200729038805370340200741f8036a200741a8046a200741c0006a10f403200041306a200741f8036a41286a290300370300200041286a200741f8036a41206a290300370300200041206a200741f8036a41186a290300370300200041186a200741f8036a41106a290300370300200041106a200741f8036a41086a290300370300200041086a20072903f803370300200041003a00000c080b20004180023b0001200041013a0000200041036a41003a00002007280288042100024020074190046a2802002201450d002001410c6c21082000210103400240200141046a280200450d00200128020010260b2001410c6a2101200841746a22080d000b0b02402007418c046a2802002201450d002001410c6c450d00200010260b200728029404210002402007419c046a2802002201450d002001410c6c21082000210103400240200141046a280200450d00200128020010260b2001410c6a2101200841746a22080d000b0b20074198046a2802002201450d072001410c6c450d07200010260c070b200020072f0081053b0001200041013a0000200041036a20072d0083053a000020072802b80421000240200741c0046a2802002201450d002001410c6c21082000210103400240200141046a280200450d00200128020010260b2001410c6a2101200841746a22080d000b0b0240200741bc046a2802002201450d002001410c6c450d00200010260b20072802c40421000240200741cc046a2802002201450d002001410c6c21082000210103400240200141046a280200450d00200128020010260b2001410c6a2101200841746a22080d000b0b200741c8046a2802002201450d062001410c6c450d06200010260c060b200020072f0081053b0001200041013a0000200041036a20072d0083053a000020072802b8042100024020052802002201450d002001410c6c21082000210103400240200141046a280200450d00200128020010260b2001410c6a2101200841746a22080d000b0b0240200741bc046a2802002201450d002001410c6c450d00200010260b20072802c40421000240200741cc046a2802002201450d002001410c6c21082000210103400240200141046a280200450d00200128020010260b2001410c6a2101200841746a22080d000b0b200741c8046a2802002201450d052001410c6c450d05200010260c050b200c200741b0056a290300370300200820074180056a41286a2903003703002009200a290300370300200d200b290300370300200e20074180056a41106a290300370300200720072903880537034020074198036a200741a8046a200741c0006a10f403200c20074198036a41286a290300370300200820074198036a41206a290300370300200920074198036a41186a290300370300200d20074198036a41106a290300370300200e20074198036a41086a2903003703002007200729039803370340200a4200370300200b4280808080c000370300200741013a00a80520074204370390052007427f370388052007420037038005200741c8036a200741c0006a20074180056a10f403200c200741c8036a41286a2903003703002008200741c8036a41206a2903003703002009200741c8036a41186a290300370300200d200741c8036a41106a290300370300200e200741c8036a41086a290300370300200720072903c803370340200a4200370300200b4280808080c000370300200741013a00a80520074204370390052007427f370388052007420037038005200741f8036a200741c0006a20074180056a10f403200c200741f8036a41286a2903003703002008200741f8036a41206a2903003703002009200741f8036a41186a290300370300200d200741f8036a41106a290300370300200e200741f8036a41086a290300370300200720072903f803370340200a4200370300200b4280808080c000370300200741013a00a80520074204370390052007427f370388052007420037038005200741a8046a200741c0006a20074180056a10f40320074184016a220e2010290300370200200720072903a80437027c200741bc046a280200210920052802002108200f280200210a200741cc046a280200210b20072802b804210c20072802c404210d20072903d0042103200741306a41086a200e2902003703002007200729027c370330024002402001280250417f6a220e41094b0d00024002400240200e0e0a00030303030303030102000b0240200141d8006a2802004102460d002007410a3a0043200741003b0041200741013a00404180802821010c040b0240200241ff017141014b0d0020074180056a41086a427f370300200741b4056a411036020020074180056a41206a420037030020074180056a41186a4280808080c0003703002007427f370380052007419d8ec6003602b005200741013a00a8052007420437039005200741c8036a41186a200141f0026a2902002211370300200741c8036a41106a200141e8026a2902002212370300200741c8036a41086a200141e0026a29020022133703002007200141d8026a29020022143703c803200141f0006a2903002115200741a8046a411c6a2011370200200741bc046a2012370200200741b4046a2013370200200720143702ac04411c10242201450d07200741a9056a21042007421c37029c03200720013602980320074198036a41004101106d20072802980320072802a00322016a41c0003a00002007200141016a22013602a00320074198036a20014110106d20072802980320072802a00322016a220e410029009d8e46370000200e41086a41002900a58e463700002007200141106a22013602a00320074198036a20014120106d20072802980320072802a00322066a2201200741ac046a220e290000370000200141086a200e41086a290000370000200141106a200e41106a290000370000200141186a200e41186a2900003700002007200641206a22013602a00320074198036a20014108106d20072802980320072802a00322016a20153700002007200141086a3602a003024020072802a405220120072802a005470d0020074180056a411c6a2001410110cb0120072802a40521010b200728029c052001410c6c6a2201200729039803370200200141086a20074198036a41086a280200360200200741a8046a41086a220520074180056a41086a2201290300370300200741a8046a41106a220f20074180056a41106a220e290300370300200741a8046a41186a221020074180056a41186a2206290300370300200720072802a40541016a3602a405200741a8046a41206a221620074180056a41206a220229030037030020072007290380053703a8042007200441076a29000037009f0320072004290000370398032002201629030037030020062010290300370300200e200f29030037030020012005290300370300200720072903a804370380052007200729009f033700cf0320072007290398033703c803200741e8006a2002290300370300200741c0006a41206a2006290300370300200741c0006a41186a200e290300370300200741c0006a41106a20012903003703002007200729038005370348200741f0006a41003a0000200741f4006a20072800cb03360000200741f1006a20072802c803360000200741003a00400c080b024041002802c8c2474102490d0041002802c4c247210141002802c0c247210e41002802ccc2472104200741c0056a41af01360200200741b8056a42e480808010370300200741b4056a4199f2c600360200200741ac056a4219370200200741a8056a4180f2c600360200200741a0056a42003703002007419c056a41d4c0c70036020020074190056a420137030020074188056a4104360200200741b08ec60036028c05200741b289c700360284052007410236028005200e41c8a1c000200441024622041b20074180056a200141b0a1c00020041b2802101102000b2007410a3a0043200741003b0041200741013a00404180802821010c030b0240200141d8006a2802004102460d002007410a3a0043200741003b0041200741013a00404180802821010c030b0240200241ff017141014b0d0020074180056a41086a427f370300200741b4056a411336020020074180056a41206a420037030020074180056a41186a4280808080c0003703002007427f37038005200741d6d8c5003602b005200741013a00a8052007420437039005200741c8036a41086a200141d8026a2902002211370300200741c8036a41106a200141e0026a2902002212370300200741c8036a41186a200141e8026a29020022133703002007200141d0026a29020022143703c80320014180016a2903002115200141f0006a2903002117200741a8046a41186a22042013370300200741a8046a41106a22062012370300200741a8046a41086a22022011370300200720143703a804412710242201450d06200741a9056a210e2007422737029c03200720013602980320074198036a41004101106d20072802980320072802a00322016a41cc003a00002007200141016a22013602a00320074198036a20014113106d20072802980320072802a00322056a220141002900d6d845370000200141086a41002900ded8453700002001410f6a41002800e5d8453600002007200541136a22013602a00320074198036a20014120106d20072802980320072802a00322056a220120072903a804370000200141086a2002290300370000200141106a2006290300370000200141186a20042903003700002007200541206a22013602a00320074198036a20014108106d20072802980320072802a00322016a20173700002007200141086a22013602a00320074198036a20014108106d20072802980320072802a00322016a20153700002007200141086a3602a003024020072802a405220120072802a005470d002007419c056a2001410110cb0120072802a40521010b200728029c052001410c6c6a2201200729039803370200200141086a20074198036a41086a280200360200200741a8046a41086a220520074180056a41086a2201290300370300200741a8046a41106a220f20074180056a41106a2204290300370300200741a8046a41186a221020074180056a41186a2206290300370300200720072802a40541016a3602a405200741a8046a41206a221620074180056a41206a220229030037030020072007290380053703a8042007200e41076a29000037009f032007200e2900003703980320022016290300370300200620102903003703002004200f29030037030020012005290300370300200720072903a804370380052007200729009f033700cf0320072007290398033703c803200741e8006a2002290300370300200741c0006a41206a2006290300370300200741c0006a41186a2004290300370300200741c0006a41106a20012903003703002007200729038005370348200741f0006a41003a0000200741f4006a20072800cb03360000200741f1006a20072802c803360000200741003a00400c070b024041002802c8c2474102490d0041002802c4c247210141002802c0c247210e41002802ccc2472104200741c0056a41c601360200200741b8056a42e780808010370300200741b4056a4188d9c500360200200741ac056a421c370200200741a8056a41ecd8c500360200200741a0056a42003703002007419c056a41d4c0c70036020020074190056a420137030020074188056a4103360200200741b08ec60036028c05200741e9d8c500360284052007410236028005200e41c8a1c000200441024622041b20074180056a200141b0a1c00020041b2802101102000b2007410a3a0043200741003b0041200741013a00404180802821010c020b200741c0006a200141d4006a10f00320072d00404101470d0520072f004120072d00434110747221010c010b200741003a0043418102210120074181023b0041200741013a00400b200020013b0001200041013a0000200041036a20014110763a000002402008450d002008410c6c2108200c210103400240200141046a280200450d00200128020010260b2001410c6a2101200841746a22080d000b0b02402009450d002009410c6c450d00200c10260b0240200b450d00200b410c6c2108200d210103400240200141046a280200450d00200128020010260b2001410c6a2101200841746a22080d000b0b200a450d04200a410c6c450d04200d10260c040b41f0afc7004119418cb0c700102f000b102c000b1033000b200741f8036a41286a2201200741c0006a41306a290300370300200741f8036a41206a220e200741c0006a41286a290300370300200741f8036a41186a2204200741c0006a41206a2206290300370300200741f8036a41106a2202200741c0006a41186a2205290300370300200741f8036a41086a220f200741c0006a41106a290300370300200720072903483703f803200741c0006a41086a200741306a41086a290300370300200741e4006a200b3602002006200a36020020052008360200200741d4006a200936020020072007290330370340200720033703682007200d36025c2007200c36025020074180056a41286a200129030037030020074180056a41206a200e29030037030020074180056a41186a200429030037030020074180056a41106a200229030037030020074180056a41086a200f290300370300200720072903f80337038005200741a8046a200741c0006a20074180056a10f403200041306a200741a8046a41286a290300370300200041286a200741a8046a41206a290300370300200041206a200741a8046a41186a290300370300200041186a200741a8046a41106a290300370300200041106a200741a8046a41086a290300370300200041086a20072903a804370300200041003a00000b20074180066a24000bb70304017f027e067f017e230041206b22032400200229030021042001290300210520022802102106200141106a200241186a2207280200220810c7062001280210200141186a2209280200220a410c6c6a20062008410c6c10cf061a200741003602002009200a20086a2208360200200341086a200836020020032001290210370300200228021c21072001411c6a200241246a2209280200220810c706200128021c200141246a220a280200220b410c6c6a20072008410c6c10cf061a20094100360200200a200b20086a2208360200200341106a41086a20083602002003200129021c370310427f200520047c220420042005541b2105200229030822042001290308220c200c2004561b21040240024020012d0028450d004101210120022d00280d010b410021010b20002005370300200020032903003702102000200329031037021c200020013a002820002004370308200041186a200341086a280200360200200041246a200341106a41086a2802003602000240200241146a2802002201450d002001410c6c450d00200610260b0240200241206a2802002201450d002001410c6c450d00200710260b200341206a24000bdd0302037f017e230041c0006b22042400200441286a22054200370300200441106a41106a22064200370300200441106a41086a420037030020044200370310200441106a41808cc700410610fb01200441306a41f4bbc400411010fb012005200441306a41086a29000037030020062004290030370300200441086a200441106a412010890202400240024002400240024002400240417f200428020c410020042802081b220520036a220320032005491b418080c002418080f001200241ff017122021b4b0d0020020e03020301020b200041800c3b0001200041013a0000200041036a41003a00000c060b42002101200441106a21020c040b427f200142c0b2cd3b7c220720072001541b428090a7f0ea25560d01200441106a21020c030b427f200142c0b2cd3b7c220720072001541b4280dc90fa873a580d010b200041800c3b0001200041013a0000200041036a41003a00000c020b42ffffffffffffffffff002101200441106a21020b200041003a0000200041306a41013a0000200041286a4200370200200041206a4280808080c000370300200041186a4204370300200041106a427f370300200041086a2001370300200041316a2002280000360000200041346a200241036a2800003600000b200441c0006a24000b130020004104360204200041f0a1c3003602000b3400200041a18dc70036020420004100360200200041146a4101360200200041106a41dcb8c300360200200041086a42073702000b13002000410136020420004184bac3003602000b5801027f02404110102422020d001033000b2000421037020420002002360200200041004110106d2000280200200041086a220028020022026a220342003700082003428080e983b1de163700002000200241106a3602000b8c0901097f230041b0016b22022400200241f0006a41b48cc700410710fb0120024190016a41e4bec300411210fb0120022001360200200241186a2002410410a202200241d4006a200241046a3602002002200241206a36024c200220023602502002200241186a360248200241286a200241c8006a1073024002402002280230220141206a2203417f4c0d000240024020030d0041012104410021030c010b200310242204450d020b20024100360208200220043602002002200336020420024100411010c9012002280200200228020822036a22042002290070370000200441086a200241f0006a41086a2900003700002002200341106a220336020820022003411010c9012002280200200228020822036a2204200229009001370000200441086a20024190016a41086a2900003700002002200341106a22043602082002280228210320022004200110c90120022802002205200228020822046a2003200110cf061a2002200420016a22013602080240200228022c450d00200310260b2002200136021420022005360210200241186a2005200110820202400240200228021822060d00410021010c010b200241206a2802002107200228021c210841002101200241003a006820062103024002400240034020072001460d01200241c8006a20016a20032d00003a00002002200141016a22043a0068200341016a21032004210120044120470d000b20024190016a41186a2201200241c8006a41186a29030037030020024190016a41106a2209200241c8006a41106a29030037030020024190016a41086a220a200241c8006a41086a2903003703002002200229034837039001200441ff01714120490d01200241286a41086a200a290300370300200241286a41106a2009290300370300200241286a41186a20012903003703002002200229039001370328200720046b41034d0d012003280000210320024190016a41186a200241286a41186a29030037030020024190016a41106a200241286a41106a29030037030020024190016a41086a200241286a41086a2903003703002002200229032837039001410121010c020b200141ff0171450d00200241003a00680b41002101200241003602980120024201370390012002410e3602742002200241106a360270200220024190016a360228200241dc006a41013602002002420137024c2002418c8dc6003602482002200241f0006a360258200241286a41c4e1c000200241c8006a10351a2002280290012002280298011084020240200228029401450d0020022802900110260b0b2008450d00200610260b200241c8006a41186a220420024190016a41186a290300370300200241c8006a41106a220720024190016a41106a290300370300200241c8006a41086a220620024190016a41086a29030037030020022002290390013703480240024020010d00200041003602000c010b2000410136020020002002290348370204200041246a20033602002000410c6a2006290300370200200041146a20072903003702002000411c6a20042903003702000b02402002280204450d00200510260b200241b0016a24000f0b1034000b1033000bad0202027f027e230041306b2201240002404101102422020d001033000b200142013702042001200236020020014100410110c9012001280200200128020822026a41003a0000410041003502bcc247200141106aad7c42adfed5e4d485fda8d8007e42218922033e02bcc2472001200241016a360208200141106a41bd80c7004101109601200041186a4200370300200041146a41d09fc000360200200041003602102000200341bcc2c700ad22047c37030820002003200485220320044218898520034210868520034225897c3703002000200129001037002c200041346a200141186a2900003700002000413c6a200141206a290000370000200041c4006a200141106a41186a29000037000020002001290300370220200041286a2001280208360200200141306a24000bc50401057f230041e0006b22052400024002402004417f4c0d000240024020040d0041012106410021070c010b200410242206450d02200421070b200541003602282005200636022020052007360224200541206a4100200410c90120052802202206200528022822076a2003200410cf061a2005200720046a2207360228024002400240024002402007200141286a280200470d00200128022022082006460d0220062008200710d206210702402005280224450d00200610260b20070d010c030b2005280224450d00200610260b200520032004109601200541206a41186a200541186a2206290000370300200541206a41106a200541106a2207290000370300200541206a41086a200541086a220829000037030020052005290000370320200541c0006a41086a200241086a280200360200200520022902003703400240024020040d0041012102410021090c010b200410242202450d05200421090b200541003602582005200236025020052009360254200541d0006a4100200410c9012005280250200528025822026a2003200410cf061a2005200220046a3602582001200541206a200541c0006a200541d0006a10ea05200041186a2006290000370000200041106a2007290000370000200041086a2008290000370000200020052900003700000c020b2005280224450d00200610260b2000200129002c370000200041186a200141c4006a290000370000200041106a2001413c6a290000370000200041086a200141346a2900003700000b200541e0006a24000f0b1034000b1033000bca0c02047f027e230041d0016b2204240002400240024002400240024002400240200141d0006a22052001412c6a412010d206450d00200441c8006a41186a200541186a290000370300200441c8006a41106a200541106a290000370300200441c8006a41086a200541086a2900003703002004200529000037034802402001200441c8006a10ff032206450d00200628020c41004a0d010b200441286a41086a2201200541086a290000370300200441286a41106a2203200541106a290000370300200441286a41186a2202200541186a29000037030020042005290000370328413010242205450d01200541003a00002005200429032837000120052004290048370021200541096a2001290300370000200541116a2003290300370000200541196a2002290300370000200541286a2203200441cf006a2900003700000240024020052d0000220141034b0d00024020010e0402020002020b200541086a280200450d01200541046a28020010260c010b2003280200450d00200541246a28020010260b20051026200041003a00000c070b412410242206450d012004422437022c20042006360228200441286a41004104106d2004280228200428023022066a20023600002004200641046a2202360230200441286a20024101106d2004280228200428023022026a4180013a00002004200241016a2202360230200441286a20024120106d20042802282206200428023022076a22022003290000370000200241086a200341086a290000370000200241106a200341106a290000370000200241186a200341186a2900003700002004200741206a2203360230200441c8006a41106a200541086a290000370300200441c8006a41186a200541106a290000370300200441c8006a41206a200541186a290000370300200441d0bec30036024c200420013602482004200529000037035020044100360278200420033602742004200636027020044190016a200441c8006a200441f0006a1080040240200428022c450d00200610260b02402004280290014101470d00024020042802940122052d0000220141034b0d00024020010e0408080008080b200541086a280200450d07200541046a28020010260c070b200541286a280200450d06200541246a28020010260c060b024002402004280294012203450d000240024020044198016a2903002208422088a741044f0d00410021020c010b20032800002106410121020b02402008a7450d00200310260b2002450d0020042006360228200441c8006a41106a200541086a290000370300200441c8006a41186a200541106a290000370300200441e8006a200541186a290000370300200441d0bec30036024c2004200136024820042005290000370350200442043702742004200441286a36027020044190016a200441c8006a200441f0006a1080042004280290014101470d01024020042802940122052d0000220141034b0d00024020010e0408080008080b200541086a280200450d07200541046a28020010260c070b200541286a280200450d06200541246a28020010260c060b200041003a00000c070b024020042802940122060d00200041003a00000c070b20044190016a41086a290300210841002105200441003a00682008422088a72102200621010240034020022005460d01200441c8006a20056a20012d00003a00002004200541016a22033a0068200141016a21012003210520034120460d040c000b0b0240200541ff0171450d00200441003a00680b410021050c030b102c000b1033000b20044190016a41086a2205200441c8006a41086a29030037030020044190016a41106a2201200441c8006a41106a29030037030020044190016a41186a2202200441c8006a41186a29030037030020042004290348370390010240200341ff0171411f4b0d00410021050c010b200441286a41086a20052903002209370300200441086a41186a22052002290300370300200441086a41106a22032001290300370300200441086a41086a220120093703002004200429039001220937032820042009370308200041196a2005290300370000200041116a2003290300370000200041096a200129030037000020002004290308370001410121050b200020053a00002008a7450d02200610260c020b20051026200041003a00000c010b20051026200041003a00000b200441d0016a24000b880201067f024020002802102201450d00200041146a280200220241046a2103200120026a41016a21042002280200417f73418081828478712101024003400240024020010d000340200320044f0d04200241c07e6a210220032802002101200341046a220521032001418081828478712201418081828478460d000b2001418081828478732201417f6a2001712106200521030c010b2002450d022001417f6a20017121060b2001682105200621012002410020054103766b41306c6a220541746a280200450d00200541706a2802001026200621010c000b0b200041146a280200200028021041016aad42307ea76b10260b0240200041246a280200450d00200028022010260b0bb70303017f027e097f230041106b220224002002200029030042adfed5e4d485fda8d8007e220342a0cbbf9599b5a19f0a7c2204200129001885200129000020048542adfed5e4d485fda8d8007e42178942adfed5e4d485fda8d8007e852001290008200342efcdddd088a580a21e7c8542adfed5e4d485fda8d8007e42178942adfed5e4d485fda8d8007e852001290010200342bed0fb8bf894dfa4327c8542adfed5e4d485fda8d8007e42178942adfed5e4d485fda8d8007e85420042adfed5e4d485fda8d800420010cc0620002802102205200041086a2903002203200241086a29030020022903007c85200389a72206712107200641197641818284086c2108200041146a28020021094100210a0340200920076a280000220b2008732200417f73200041fffdfb776a71418081828478712100200a41046a220a20076a200571210c02400340024020000d00200c2107200b200b4101747141808182847871450d034100210d0c020b2009410020006841037620076a2005716b41306c6a220d41506a22062001460d012000417f6a200071210020012006412010d2060d000b0b0b200241106a2400200d41706a4100200d1b0bdc19021f7f027e23004180046b22032400200228020821042002280200210520022802042106200341186a2207200141206a290000370300200341106a2208200141186a290000370300200341086a2209200141106a290000370300200320012900083703002006410174210a2003410772210b200341d3036a210c200341c8016a41186a210d200341c8016a410c6a210e200341c8016a41206a210f200128020421102001280200211120042102410021124100211302400240024002400240024002400240024002400240024002400240024002400240024002400340200420136a22144101762101024002402014410171450d0020062001490d03200120064f0d05200341013a00d001200320053602c801200320013602cc012003200520016a2d000041f001713a00d1010c010b20062001490d03200341003a00d001200320013602cc01200320053602c8010b200341a8036a20112003200341c8016a201028020c11040002400240024020032802a80322150d00200341c8016a41086a2202200341086a290300370300200341c8016a41106a2206200341106a290300370300200341c8016a41186a2214200341186a290300370300200320032903003703c8014130102422010d010c160b20032802ac032116200341c8016a201520032802b00310d20420032d00c8014101460d12201241016a21120c010b200120032903c80137000120012003290020370021200120124100473a0000200141096a2002290300370000200141116a2006290300370000200141196a2014290300370000200141286a200341276a29000037000020004101360200200020013602040c130b034020032802e401211720032802e001211820032802dc01211920032802d801211a20032802d401211420032802d001211b20032802cc012101200341206a200f41a80110cf061a200328029403211c200328029003211d024002400240024020010e05140e000102140b4100210102402014410174201a6b221e200a20026b221c201c201e4b1b221f450d000340200220016a221c410176221d20064f0d0a201a20016a2220410176222120144f0d0b2005201d6a2d0000221d410f71201d41f00171410476201c4101711b201b20216a2d0000221c410f71201c41047620204101711b470d01200141016a2201201f490d000b201f21010b02402001201e460d00200042003702002016450d170c160b201e21010c020b200320173602dc01200320183602d801200320193602d4012003201a3602d001200320143602cc012003201b3602c801200d200341206a41a80110cf061a02400240200a2002460d00200241017622012006490d012001200641d8bbc7001032000b02400240201d0d00200341003602a8030c010b201c417f4c0d1202400240201c0d0041012102410021060c010b201c10242202450d14201c21060b200341b0036a22014100360200200320023602a803200320063602ac03200341a8036a4100201c10c90120032802a803200128020022026a201d201c10cf061a20012002201c6a3602000b200020032903a803370204200041003602002000410c6a200341b0036a2802003602000c0e0b0240200341c8016a200520016a2d00002201410f71200141047620024101711b410c6c6a220128020022194102470d00200042003702000c0e0b20012802042118200141086a28020021174101211e410121010c010b20032802a003211f200328029c03211e2003280298032101200320173602d001200320183602cc01200320193602c801200e200341206a41a80110cf061a20032001360284032003201c360280032003201d3602fc024100210102402014410174201a6b2217200a20026b2219201920174b1b2218450d000340200220016a221c410176221d20064f0d0a201a20016a2220410176222120144f0d0b2005201d6a2d0000221d410f71201d41f00171410476201c4101711b201b20216a2d0000221c410f71201c41047620204101711b470d01200141016a22012018490d000b201821010b20012017470d0a0240024020192017460d00200220176a220141017622142006490d012014200641d8bbc7001032000b02400240201e0d00200341003602a8030c010b201f417f4c0d1102400240201f0d0041012102410021060c010b201f10242202450d13201f21060b200341b0036a22014100360200200320023602a803200320063602ac03200341a8036a4100201f10c90120032802a803200128020022026a201e201f10cf061a20012002201f6a3602000b200020032903a803370204200041003602002000410c6a200341b0036a2802003602000c0d0b0240200341c8016a200520146a2d00002214410f71201441047620014101711b410c6c6a221428020022194102470d00200042003702000c0d0b201741016a211e201741016a210120142802042118201441086a28020021170b200120136a21132002201e6a210202402019450d00200341c8016a2018201710d20420032d00c8014101460d120c010b0b0240024020174120460d00200341c8016a41086a22142009290300370300200341c8016a41106a221a2008290300370300200d2007290300370300200320032903003703c8012017417f4c0d0f0240024020170d00410021014101211b0c010b20171024221b450d11201721010b200341003602f8032003201b3602f003200320013602f403200341f0036a4100201710c90120032802f00320032802f80322016a2018201710cf061a200c41086a200120176a360000200c20032903f003370000413010242201450d15200141043a0000200120032903c801370001200120032900d003370021200141096a2014290300370000200141116a201a290300370000200141196a200d290300370000200141286a200341d0036a41076a290000370000410121140c010b41002114200341c8016a41026a41003a0000200341003b01c80120182f0000211a200341f0036a41026a201841026a2d00003a00002018411f6a2d0000211b201841176a29000021222018280003210120182900072123200341d0036a41086a221c2018410f6a290000370300200341d0036a41106a221d2022370300200341d0036a41186a2220201b3a00002003201a3b01f003200320233703d003200d20202d00003a0000200341c8016a41106a201d290300370300200341c8016a41086a201c290300370300200320032903d0033703c8010b200341cc036a41026a221a200341f0036a41026a2d00003a0000200341a8036a41086a221b200341c8016a41086a290300370300200341a8036a41106a221c200341c8016a41106a290300370300200341a8036a41186a221d200d280200360200200320032f01f0033b01cc03200320032903c8013703a803024020140d00200b20032903a803370000200b41086a201b290300370000200b41106a201c290300370000200b41186a201d2d00003a0000200320032f01cc033b0100200320013600032003201a2d00003a00022016450d01201510260c010b0b200041013602002000200136020420160d100c110b200120064198bcc7001047000b2001200641a8bcc7001047000b2001200641b8bcc7001032000b201d200641d8bbc7001032000b2021201441d8bbc7001032000b201d200641d8bbc7001032000b2021201441d8bbc7001032000b200042003702000c010b4100211f02402014410174201a6b200a20026b2217470d004100211f41002101024002402017450d00410021010340201a20016a221c410176221d20144f0d05200220016a2220410176222120064f0d06201b201d6a2d0000221d410f71201d41f00171410476201c4101711b200520216a2d0000221c410f71201c41047620204101711b470d012017200141016a2201470d000c020b0b20012017470d010b2018417f4c0d040240024020180d0041012101410021020c010b201810242201450d06201821020b200341003602d001200320013602c801200320023602cc01200341c8016a4100201810c90120032802c801221f20032802d00122016a2019201810cf061a2003200120186a3602d00120032902cc0121220b2000201f36020420004100360200200041086a20223702000b02402016450d00201510260b20034180046a24000f0b201d201441d8bbc7001032000b2021200641d8bbc7001032000b1034000b1033000b2000420037020020160d010c020b20032d00c9012102200341a8036a41086a2206200341086a290300370300200341a8036a41106a2214200341106a290300370300200341a8036a41186a221a200341186a290300370300200320032903003703a803413010242201450d02200141033a0000200120032903a803370001200120023a0021200120032901d003370122200141096a2006290300370000200141116a2014290300370000200141196a201a290300370000200141286a200341d6036a29010037010020004101360200200020013602042016450d010b201510260b20034180046a24000f0b102c000bbb1103087f027e0a7f230041a0076b22022400200241086a10fb03200241d8006a41186a22034200370300200241d8006a41106a22044200370300200241d8006a41086a2205420037030020024200370358200241c8046a41bd80c70041011096012003200241c8046a41186a22062900003703002004200241c8046a41106a22032900003703002005200241c8046a41086a2204290000370300200220022900c804370358200241c8046a41bd80c700410110960120024180066a41186a2205200629000037030020024180066a41106a2207200329000037030020024180066a41086a22082004290000370300200220022900c804370380060240412010242209450d00200420082903003703002003200729030037030020062005290300370300410041003502bcc247200241a8036aad7c42adfed5e4d485fda8d8007e422189220a3e02bcc2472002419c016a4200370200200241a4016a420037020020022002290380063703c8042002410436029801200241f8006a41c0006a41f8bec300360200200241b0016a4108360200200241ac016a2009360200200241013a00c0012002200241d8006a3602bc012002200241086a3602b401200241d9016a2006290300370000200241d1016a2003290300370000200241c9016a2004290300370000200241c1016a20022903c804370000200241e3016a200241a8036a41026a2d00003a0000200241e1016a20022f00a8033b0000200241f8006a41186a42003703002002418c016a41d09fc000360200200241003602e40120024100360288012002200a41bcc2c700ad220b7c370380012002200a200b85220a200b42188985200a42108685200a4225897c3703782001280200210c2001280204210d0240024020012802082201450d00200c20014105746a220e41606a210f200241c8046a410172210741002110200c2111034020102103201121010340200241e8016a41186a2208200141186a290000370300200241e8016a41106a2209200141106a290000370300200241e8016a41086a2212200141086a290000370300200220012900003703e801200241f0056a200241e8016a10b103200241c8046a20022802f005220520022802f80510b20320022d00c804210420024180066a200741a00110cf061a41002106024020044101470d00200241a8036a20024180066a41a00110cf061a410121060b024020022802f405450d00200510260b02402006450d0020024188026a200241a8036a41a00110cf061a200241c8046a41186a22132008290300370300200241c8046a41106a22142009290300370300200241c8046a41086a22152012290300370300200220022903e8013703c804200141206a2111200341016a2110416c210502400240024002400340200220024188026a200541e08bc7006a280000220810c7032002280204220641046a2204417f4c0d01200228020021090240024020040d0041002104410121120c010b200410242212450d0b0b200241003602b003200220123602a803200220043602ac03200241a8036a41004104106d20022802a80320022802b00322046a20083600002002200441046a22043602b0030240024002400240200641c000490d00200641808001490d012006418080808004490d02200241a8036a20044101106d20022802a80320022802b00322046a41033a00002002200441016a22043602b003200241a8036a20044104106d20022802a80320022802b00322046a2006360000200441046a21040c030b200241a8036a20044101106d20022802a80320022802b00322046a20064102743a0000200441016a21040c020b200241a8036a20044102106d20022802a80320022802b00322046a20064102744101723b0000200441026a21040c010b200241a8036a20044104106d20022802a80320022802b00322046a2006410274410272360000200441046a21040b200220043602b003200241a8036a20042006106d20022802a803220420022802b00322086a2009200610cf061a2002200820066a22063602b003200220033602f00520024180066a200241f8006a20042006200241f0056a4104108204024020022802ac03450d00200410260b200228028406210602402002280280064101470d00024020062d0000220141034b0d00024020010e0405050005050b200641086a280200450d04200641046a28020010260c040b200641286a280200450d03200641246a28020010260c030b02402006450d00200228028806450d00200610260b200541046a2205450d030c000b0b1034000b20061026200041086a411a360200200041a0bfc300360204200041013602000c010b200220033602f005200241003602b003200242013703a803200241a8036a41004120106d20022802a803220320022802b00322046a220620022903c804370000200641086a2015290300370000200641106a2014290300370000200641186a20132903003700002002200441206a22063602b00320024180066a200241f8006a200241f0056a410420032006108204024020022802ac03450d00200310260b024002402002280280064101470d00024020022802840622012d0000220641034b0d00024020060e0403030003030b200141086a280200450d02200141046a28020010260c020b200141286a280200450d01200141246a28020010260c010b02402002280284062206450d00200228028806450d00200610260b200f2001470d040c050b20011026200041086a411a360200200041a0bfc300360204200041013602000b0240200d41ffffff3f71450d00200c10260b200241f8006a108304200241086a10fe030c040b200341016a2103200e200141206a2201470d000b0b0b0240200d41ffffff3f71450d00200c10260b200241f8006a108304200241c8046a200241086a41d00010cf061a200241b0056a200241f0006a290300370300200241a8056a200241e8006a290300370300200241a0056a200241d8006a41086a2903003703002002200229035837039805200041086a200241c8046a41f00010cf061a200041003602000b200241a0076a24000f0b1033000bc40401037f23004190016b2206240041002107200641003602080240024020012d00484101460d00200141cc006a28020021080c010b200641366a200141cb006a2d00003a0000200641206a200141d8006a290000370300200641286a200141e0006a290000370300200641306a200141e8006a2d00003a00002006200141c9006a2f00003b01342006200141d0006a290000370318200141cc006a2800002108410121070b200641c8006a41086a2006290318370300200641c8006a41106a200641186a41086a290300370300200641c8006a41186a200641186a41106a290300370300200641e8006a200641186a41186a280200360200200620073a0048200620062f01343b00492006200836024c2006200641366a2d00003a004b410021072006410036027820062003360274200620023602700240024002402005417f4c0d004101210202402005450d00200510242202450d02200521070b20064100360288012006200236028001200620073602840120064180016a4100200510c90120062802800120062802880122076a2004200510cf061a2006200720056a36028801200641386a2001200641c8006a200641f0006a20064180016a200641086a10b905200628023c2105024020062802384101460d00200141003a00482000200629030837020420004100360200200141cc006a20053602002000410c6a200641106a2802003602000c030b200041013602002000200536020420062802082201450d02200628020c450d02200110260c020b1034000b1033000b20064190016a24000b912d02197f0c7e23002201210220014180056b41607122032400200041146a220128020022042802002105200141d09fc0003602002000280210210620004100360210200041186a42003703002003200036021c2004200641016a22076a2108200441046a21012005417f73418081828478712109200341a0026a410572210a200341a0026a41276a210b200341a0026a41206a210c200421050240024002400240024002400240024002400240024002400240024002400240024003400240024002400240024020090d000340024020012008490d004100210d0c040b200541c07d6a210520012802002109200141046a220e21012009418081828478712209418081828478460d000b2009418081828478732209417f6a200971210d200e21010c010b2009417f6a200971210d20050d00410021050c010b20034180046a41186a220f200541002009684103766b41d0006c6a221041b07f6a220941186a29020037030020034180046a41106a2211200941106a29020037030020034180046a41086a2212200941086a2902003703002003200929020037038004201041506a280200210e201041546a2d00002110200b200941cc006a280000360000200c200941c5006a290000370300200341a0026a41186a22132009413d6a290000370300200341a0026a41106a2214200941356a290000370300200341a0026a41086a22152009412d6a290000370300200320092900253703a00220104102460d00200341b8036a41186a2209200f290300370300200341b8036a41106a22162011290300370300200341b8036a41086a22172012290300370300200341a8016a41086a22182015290300370300200341a8016a41106a22152014290300370300200341a8016a41186a22142013290300370300200341a8016a41206a2213200c290300370300200341a8016a41276a2219200b28000036000020032003290380043703b803200320032903a0023703a801200f20092903003703002011201629030037030020122017290300370300200320032903b80337038004200a20032903a801370000200a41086a2018290300370000200a41106a2015290300370000200a41186a2014290300370000200a41206a2013290300370000200a41276a2019280000360000200320103a00a4022003200e3602a002200328021c220941c0006a2802002110200928023c2109200e41244b0d01200a210f0c020b0240034002400240200d0d000340200120084f0d04200541c07d6a210520012802002109200141046a220e21012009418081828478712209418081828478460d000b200941808182847873220d417f6a200d712109200e21010c010b2005450d02200d417f6a200d7121090b200d68210e2009210d20054100200e4103766b41d0006c6a220e41506a28020041244d0d00200e41586a28020010262009210d0c000b0b024002402006450d00200441ff01200641056a10d1061a200641074d0d00200741037641076c21010c010b200621010b200020063602102000411c6a4100360200200041186a2001360200200041146a2004360200200328021c22052d00484101460d10200541cc006a28020021010240200541386a220e28020022092009417f6a2208200541306a220d28020022092005412c6a220a2802006b716b4101470d00200a108604200e280200417f6a2108200d28020021090b200d2008200941016a71360200200541346a28020020094102746a2001360200200541286a280200220920014d0d042005280220200141fc006c6a2201290210211a200120032903b0023702102001290208211b200120032903a802370208200341003a00a002200341003602a4022001290200211c200120032903a002370200200141186a2209290200211d200920032903b802370200200341206a41086a2209200141e8006a290200370300200341206a41106a2208200141f0006a290200370300200341206a41186a220d200141f8006a2802003602002003201a370390012003201b370388012003201c37038001200320012902603703202003201d370398012001290240211e200141c8006a290200211f200141d0006a2902002120200141d8006a290200212120012902202122200141286a2902002123200141306a29020021242003200141386a290200222537037820032024370370200320233703682003202237036020032021370358200320203703502003201f3703482003201e370340201ca741ff01714101470d03200341a8016a41176a220e200329009801221c370000200341a8016a41106a220a200329009101221b370300200341a8016a41086a2210200329008901221a37030020052802442201200329008101221d37000020012022a7220f3a001f200141086a201a370000200141106a201b370000200141176a201c3700002003201d3703a801200341a0026a41d8006a2021370300200341a0026a41d0006a2020370300200341a0026a41c8006a201f370300200341e0026a201e370300200341dc026a200328027c360200200341d4026a2003290274370200200341cc026a200329026c370200200320032902643702c40220034180036a2003290320370300200341a0026a41e8006a2009290300370300200341a0026a41f0006a2008290300370300200341a0026a41f8006a200d280200360200200341a9026a2010290300370000200341b1026a200a290300370000200341a0026a41186a200e290000370000200320032903a8013700a102200341c0026a200f3a0000200341013a00a002200541206a200341a0026a1087042101200328021c220341003a0048200341cc006a20013602000c100b20032802ac02210e20032802a802210f0b200320032f01cc023b01c8042003200e3602c4042003200f3602c004200920034180046a200341c0046a201028021c110500024020032802a00241244d0d0020032802a80210260b200d21090c000b0b201ba72105201b422088a72101200341003602d401200341003a00ac01200341003602a801200341e8016a41106a2003280258360200200341e8016a41086a2003290350370300200320032903483703e80102400240024002400240201c422088a70e050102030400010b200341c0026a2023370300200341b8026a2022370300200341b0026a201d370300200341a8026a201a370300200341c8026a2024370300200320053602a002200320013602a40202400240200141244b0d00200341a9026a210e0c010b201a422088a7210e201da721010b2005410176210d0240024020054101710d002001200d490d07410021094100210a0c010b2001200d4d0d074101210a200e200d6a2d0000410f712109200d41016a210d0b200141017420056b220541ffff03200541ffff03491b220541017641036a22101024220f450d072001200d6b2108200e200d6a210d200341003602e001200320103602dc012003200f3602d80102402025422088a72218410020181b220e0d002003200536028404200341013b01800420034180046a200341d8016a10880441002105200a0d0b410021010c0e0b200320053602840420034181023b01800420034180046a200341d8016a10880441002105200a0d0b410021010c0c0b410110242201450d06200342013702dc01200320013602d801200341d8016a4100410110c90120032802d80120032802e00122016a41003a00002003200141016a3602e0010c0e0b200341c0026a2023370300200341b8026a2022370300200341b0026a201d370300200341a8026a201a370300200341c8026a2024370300200320053602a002200320013602a40202400240200141244b0d00200341a9026a21080c010b201a422088a72108201da721010b2005410176210902400240200541017122050d0020012009490d0820034188046a200120096b360200200341003b0180042003200820096a360284040c010b200120094d0d0820034188046a2001200941016a220d6b360200200320053a00800420032008200d6a360284042003200820096a2d0000410f713a0081040b200341d8016a20034180046a2025a72201201ea710890402402025422088a7450d00200110260b20032802a40241244d0d0d200341ac026a28020010260c0d0b200341c0026a2023370300200341b8026a2022370300200341b0026a201d370300200341a8026a201a370300200341c8026a2024370300200320053602a002200320013602a40202400240200141244b0d00200341a9026a21090c010b201a422088a72109201da721010b200320053602e803200320013602e403200320093602e003200341c0046a200341e0036a108a04200341a8016a200341e0036a41002001108b042101200328021c2105200341b8036a41086a201e370300200341b8036a41106a20032903e801370300200341d0036a200341e8016a41086a290300370300200341d8036a200341e8016a41106a280200360200200320253703b80320034180046a2005200341b8036a200341a8016a108c04200341a8016a2001108d040b108103000b2001200941b089c6001032000b200d200141d0bac7001048000b200d200141e0bac7001032000b1033000b2009200141d0bac7001048000b2009200141e0bac7001032000b410121010c020b410121010b03400240024020010e020001010b200520084f0d03200d20056a2d00002109200541016a2105410121010c010b024020032802e001220120032802dc01470d00200341d8016a2001410110c9010b20032802d80120016a20093a00002003200141016a3602e001410021010c000b0b03400240024020010e020001010b200520084f0d02200d20056a2d00002109200541016a2105410121010c010b024020032802e001220120032802dc01470d00200341d8016a2001410110c9010b20032802d80120016a20093a00002003200141016a3602e001410021010c000b0b20032802e001221621010240201620032802dc01470d00200341d8016a2016410110c90120032802e00121010b2025a7211720032802d80120016a41003a0000200320032802e00141016a22013602e0010240200120032802dc01470d00200341d8016a2001410110c90120032802e00121010b201741c0046a211420032802d80120016a41003a0000200320032802e00141016a3602e0010240200e450d00200e201e422088a7200341d8016a1095010b024002400240024020142017470d0041002110410021010c010b20034180046a4101722109200341a9026a2119200341c0046a41017221054100210a20172101410021104101210e024002400340200341023a0080042001290200211c200329039804211b2003290390042122200329038804211a20012003290380043702002001290208211d2001201a3702082001290210211a20012022370210200141186a220829020021222008201b370200200320223703d8042003201a3703d0042003201d3703c8042003201c3703c004200141206a280200210b20034180046a41176a220f200541176a29000037000020034180046a41106a2208200541106a29000037030020034180046a41086a220d200541086a29000037030020032005290000370380040240201ca7220c41ff017122114103470d0020104180fe037141087621010c050b200341e0036a41176a2212200f290000370000200341e0036a41106a220f2008290300370300200341e0036a41086a200d290300221c3703002003200329038004221b3703e003200341c0046a41176a22132012290000370000200341c0046a41106a2212200f290300370300200341c0046a41086a220f201c3703002003201b3703c00402400240024020114102470d00200341023a00b8030c010b0240024020032802a402221141244b0d00201921150c010b20032802b002211120032802ac0221150b200320032802a0023602f804200320113602f404200320153602f004200341a8016a200341f0046a4101200a108b042111200328021c2115200920032903c004370000200941086a200f290300370000200941106a2012290300370000200941176a20132900003700002003200c3a0080042003200b3602a004200341b8036a201520034180046a200341a8016a108c04200341a8016a2011108d0420032d00b8034103460d010b20034180046a41206a200341b8036a41206a29030037030020034180046a41186a200341b8036a41186a2903003703002008200341b8036a41106a290300370300200d200341b8036a41086a290300370300200320032903b803221c370380040240024002400240201ca741ff0171417f6a220d41014b0d0041002108200d0e020103010b20094120200341d8016a1095010c010b200341c0046a41186a200941186a2900003703002012200941106a290000370300200f200941086a290000370300200320092900003703c00420032802a404220841214f0d04200341c0046a2008200341d8016a1095010b200e21080b200a41016a210a200e410174210e20082010722110200141246a22012014460d030c010b0b20104180fe037141087621010c040b200841204190dfc4001047000b20104180fe037141087621010b200341033a00c00420034197046a20032900d80437000020034190046a20032900d10437030020034188046a20032900c904370300200320032900c104370380040b200341033a00b8030b201641026a21052016417d4b0d0220032802e00122092005490d0320032802d80120166a2001410874201041ff0171723b000002402018450d00201ea7450d00201810260b2017102620032802a40241244d0d00200341ac026a28020010260b200328021c220141c0006a2802002105200128023c210120034180046a41086a41002802cc9f40360200200341002902c49f4037038004200341a0026a200120034180046a20032802d80120032802e0012005280214110600200328021c2201280244220520032903a002370000200541086a200341a0026a41086a290300370000200541106a200341a0026a41106a290300370000200541186a200341a0026a41186a2903003700002001200128026c41016a36026c2001280244220541186a290000211c200541106a290000211b200541086a290000211e200141c9006a2005290000370000200141013a0048200141d1006a201e370000200141d9006a201b370000200141e1006a201c370000024020032802dc01450d0020032802d80110260b20032802a80141244d0d00200341b0016a28020010260b0240200041286a2802002203450d0020002802202101200341fc006c210303400240024020012d00000d00200141046a10d7010c010b200141246a10d7010b200141fc006a2101200341847f6a22030d000b0b0240200041246a2802002201450d00200141fc006c450d00200028022010260b200041386a280200210102400240200041306a28020022032000412c6a28020022054f0d00200120054f0d0141d4ddc400411c41dcbcc700102f000b20012003490d030b0240200141ffffffff0371450d00200041346a28020010260b024020002802102205450d00200041146a280200220341046a2101200520036a41016a21092003280200417f73418081828478712105024003400240024020050d000340200120094f0d04200341c07d6a210320012802002105200141046a220821012005418081828478712205418081828478460d000b2005418081828478732205417f6a200571210d200821010c010b2003450d022005417f6a200571210d0b2005682108200d21052003410020084103766b41d0006c6a220841506a28020041244d0d00200841586a2802001026200d21050c000b0b200041146a280200200028021041016aad42d0007ea76b10260b200224000f0b2016200541a0dfc4001048000b2005200941a0dfc4001047000b2003200141f0ddc4001047000b9d1003057f027e027f230041d0016b2204240002400240024002400240024002400240200141d0006a22052001412c6a412010d206450d00200441c0006a41186a200541186a290000370300200441c0006a41106a200541106a290000370300200441c0006a41086a200541086a2900003703002004200529000037034002402001200441c0006a10ff032206450d00200628020c41004a0d010b200441186a41086a2201200541086a290000370300200441186a41106a2203200541106a290000370300200441186a41186a2202200541186a29000037030020042005290000370318413010242205450d01200541003a00002005200429031837000120052004290040370021200541096a2001290300370000200541116a2003290300370000200541196a2002290300370000200541286a2203200441c7006a290000370000024020052d0000220141034b0d00024020010e0408080008080b200541086a280200450d07200541046a28020010260c070b2003280200450d06200541246a28020010260c060b2004420037031020044204370308412410242206450d012004422437021c2004200636021841002107200441186a41004104106d2004280218200428022022066a20023600002004200641046a2202360220200441186a20024101106d2004280218200428022022026a4180013a00002004200241016a2202360220200441186a20024120106d20042802182206200428022022086a22022003290000370000200241086a200341086a290000370000200241106a200341106a290000370000200241186a200341186a2900003700002004200841206a2203360220200441d4006a200541086a290200370200200441dc006a200541106a290200370200200441c0006a41246a200541186a290200370200200441d0bec300360244200420013602402004200529020037024c2004200441086a36024820044100360278200420033602742004200636027020044190016a200441c0006a200441f0006a10850402402004280290014101470d00024020042802940122032d0000220241034b0d00024020020e0405050005050b200341086a280200450d04200341046a28020010260c040b200341286a280200450d03200341246a28020010260c030b2004280294012202450d030240024020044190016a41086a2903002209422088a741044f0d00410021070c010b20022800002103410121070b2009a7450d04200210260c040b102c000b1033000b200310260b0b0240200428021c450d00200610260b0240024002400240024002402007450d002004200336023c200441d4006a200541086a290200370200200441dc006a200541106a290200370200200441e4006a200541186a290200370200200441d0bec300360244200420013602402004200529020037024c2004200441086a3602482004420437027420042004413c6a36027020044190016a200441c0006a200441f0006a10850402402004280290014101470d00024020042802940122052d0000220141034b0d00024020010e0406060006060b200541086a280200450d05200541046a28020010260c050b200541286a280200450d04200541246a28020010260c040b2004280294012206450d0420044190016a41086a290300210941002105200441003a00602009422088a7210220062101024002400240034020022005460d01200441c0006a20056a20012d00003a00002004200541016a22033a0060200141016a21012003210520034120470d000b20044190016a41086a2205200441c0006a41086a29030037030020044190016a41106a2201200441c0006a41106a29030037030020044190016a41186a2202200441c0006a41186a2903003703002004200429034037039001200341ff0171411f4b0d01410021050c020b0240200541ff0171450d00200441003a00600b410021050c010b200441f0006a41186a2002290300370300200441f0006a41106a2001290300220a370300200441186a41086a2005290300370300200441186a41106a200a370300410121050b02402009a7450d00200610260b2005450d0420004204370200200041086a220841003602002004280210210620044100360210200428020c210b200428020821072004420437030820004100200641306c220141306d220210cb012008280200210320060d01200721050c020b200041003602000c040b200720016a210c200641306c2102200741306a210520002802002003410c6c6a21012003200641047441706a4104766a41016a210602400340200541546a2802002200450d01200141046a200541586a290200370200200120003602002001410c6a2101200541306a2105200341016a2103200241506a22020d000b200c2105200621030b200c20056b220141306d21020b2008200336020002402001450d00200241306c2101200541086a2105034002402005280200450d002005417c6a28020010260b200541306a2105200141506a22010d000b0b0240200b450d00200b41306c450d00200710260b024020042802102205450d00200541306c2101200428020841086a2105034002402005280200450d002005417c6a28020010260b200541306a2105200141506a22010d000b0b200428020c2205450d04200541306c450d04200428020810260c040b200510260b200041003602000b024020042802102205450d00200541306c2101200428020841086a2105034002402005280200450d002005417c6a28020010260b200541306a2105200141506a22010d000b0b200428020c2205450d01200541306c450d01200428020810260c010b20051026200041003602000b200441d0016a24000be71d041c7f017e057f017e23004180046b22032400200228020821042002280200210520022802042106200341186a2207200141246a290000370300200341106a22082001411c6a290000370300200341086a2209200141146a2900003703002003200129000c3703002006410174210a2003410772210b200341d3036a210c200341c8016a41186a210d200341c8016a410c6a210e200341c8016a41206a210f200128020421102001280200211120042112410021134100211402400240024002400240024002400240024002400240024002400240024002400340200420146a22154101762102024002400240024002400240024002400240024002402015410171450d0020062002490d02200220064f0d04200341013a00d001200320053602c801200320023602cc012003200520026a2d000041f001713a00d1010c010b20062002490d02200341003a00d001200320023602cc01200320053602c8010b200341a8036a20112003200341c8016a201028020c110400024020032802a80322160d00200341c8016a41086a2212200341086a290300370300200341c8016a41106a2206200341106a290300370300200341c8016a41186a2215200341186a290300370300200320032903003703c801413010242202450d1a200220032903c80137000120022003290020370021200220134100473a0000200241096a2012290300370000200241116a2006290300370000200241196a2015290300370000200241286a200341276a29000037000020004101360200200020023602040c190b20032802b003210220032802ac0321172001280208221528020c20134b0d082002417f4c0d110240024020020d0041002118410121190c010b200210242219450d15200221180b200341003602282003201936022020032018360224200341206a4100200210c9012003280220200328022822186a2016200210cf061a200341c8016a41086a221a2009290300370300200341c8016a41106a221b2008290300370300200d20072903003703002003201820026a360228200320032903003703c80120152802082218201541046a221c280200470d07201841016a22192018490d054100211d2018410174221e2019201e20194b1b22194104201941044b1bad42307e221f422088a7221e4100472120201fa7211902402018450d00201841306c21212015280200211d0b20202019410048720d05201e4541027421180240201d0d0020190d042018211d0c070b20212019460d06024020210d0020190d044104211d0c070b201d202120191028221d450d040c060b200220064198bcc7001047000b2002200641a8bcc7001047000b2002200641b8bcc7001032000b20191024221d0d020b20180d140b102e000b2015201d360200201c201941306e360200201528020821180b2015280200201841306c6a2218200329032037020420182013360200201820032903c8013702102018410c6a200341206a41086a280200360200201841186a201a290300370200201841206a201b290300370200201841286a200d2903003702002015201528020841016a3602080b200341c8016a2016200210d20420032d00c8014101460d0d201341016a2113034020032802e401212220032802e001211e20032802dc01212020032802d801211820032802d401211520032802d001211920032802cc012102200341206a200f41a80110cf061a200328029403211d200328029003211a024002400240024020020e05110b000102110b410021020240201541017420186b2223200a20126b221d201d20234b1b2224450d000340201220026a221d410176221a20064f0d07201820026a221b410176221c20154f0d082005201a6a2d0000221a410f71201a41f00171410476201d4101711b2019201c6a2d0000221d410f71201d410476201b4101711b470d01200241016a22022024490d000b202421020b024020022023460d00200042003702002017450d140c130b202321020c020b200320223602dc012003201e3602d801200320203602d401200320183602d001200320153602cc01200320193602c801200d200341206a41a80110cf061a02400240200a2012460d00201241017622022006490d012002200641d8bbc7001032000b02400240201a0d00200341003602a8030c010b201d417f4c0d0d02400240201d0d0041012112410021060c010b201d10242212450d11201d21060b200341b0036a22024100360200200320123602a803200320063602ac03200341a8036a4100201d10c90120032802a803200228020022126a201a201d10cf061a20022012201d6a3602000b200020032903a803370204200041003602002000410c6a200341b0036a2802003602000c0b0b0240200341c8016a200520026a2d00002202410f71200241047620124101711b410c6c6a220228020022204102470d00200042003702000c0b0b2002280204211e200241086a280200212241012123410121020c010b20032802a0032124200328029c0321232003280298032102200320223602d0012003201e3602cc01200320203602c801200e200341206a41a80110cf061a20032002360284032003201d360280032003201a3602fc02410021020240201541017420186b2222200a20126b2220202020224b1b221e450d000340201220026a221d410176221a20064f0d07201820026a221b410176221c20154f0d082005201a6a2d0000221a410f71201a41f00171410476201d4101711b2019201c6a2d0000221d410f71201d410476201b4101711b470d01200241016a2202201e490d000b201e21020b20022022470d070240024020202022460d00201220226a220241017622152006490d012015200641d8bbc7001032000b0240024020230d00200341003602a8030c010b2024417f4c0d0c0240024020240d0041012112410021060c010b202410242212450d10202421060b200341b0036a22024100360200200320123602a803200320063602ac03200341a8036a4100202410c90120032802a803200228020022126a2023202410cf061a2002201220246a3602000b200020032903a803370204200041003602002000410c6a200341b0036a2802003602000c0a0b0240200341c8016a200520156a2d00002215410f71201541047620024101711b410c6c6a221528020022204102470d00200042003702000c0a0b202241016a2123202241016a21022015280204211e201541086a28020021220b200220146a2114201220236a211202402020450d00200341c8016a201e202210d20420032d00c8014101460d0f0c010b0b0240024020224120460d00200341c8016a41086a22152009290300370300200341c8016a41106a22182008290300370300200d2007290300370300200320032903003703c8012022417f4c0d0a0240024020220d0041002102410121190c010b202210242219450d0e202221020b200341003602f803200320193602f003200320023602f403200341f0036a4100202210c90120032802f00320032802f80322026a201e202210cf061a200c41086a200220226a360000200c20032903f003370000413010242202450d12200241043a0000200220032903c801370001200220032900d003370021200241096a2015290300370000200241116a2018290300370000200241196a200d290300370000200241286a200341d0036a41076a290000370000410121150c010b41002115200341c8016a41026a41003a0000200341003b01c801201e2f00002118200341f0036a41026a201e41026a2d00003a0000201e411f6a2d00002119201e41176a290000211f201e2800032102201e2900072125200341d0036a41086a221d201e410f6a290000370300200341d0036a41106a221a201f370300200341d0036a41186a221b20193a0000200320183b01f003200320253703d003200d201b2d00003a0000200341c8016a41106a201a290300370300200341c8016a41086a201d290300370300200320032903d0033703c8010b200341cc036a41026a2218200341f0036a41026a2d00003a0000200341a8036a41086a2219200341c8016a41086a290300370300200341a8036a41106a221d200341c8016a41106a290300370300200341a8036a41186a221a200d280200360200200320032f01f0033b01cc03200320032903c8013703a803024020150d00200b20032903a803370000200b41086a2019290300370000200b41106a201d290300370000200b41186a201a2d00003a0000200320032f01cc033b010020032002360003200320182d00003a00022017450d01201610260c010b0b200041013602002000200236020420170d0d0c0e0b201a200641d8bbc7001032000b201c201541d8bbc7001032000b201a200641d8bbc7001032000b201c201541d8bbc7001032000b200042003702000c010b410021220240201541017420186b200a20126b2201470d004100212241002102024002402001450d00410021020340201820026a221d410176221a20154f0d06201220026a221b410176221c20064f0d072019201a6a2d0000221a410f71201a41f00171410476201d4101711b2005201c6a2d0000221d410f71201d410476201b4101711b470d012001200241016a2202470d000c020b0b20022001470d010b201e417f4c0d0202400240201e0d0041012102410021120c010b201e10242202450d06201e21120b200341003602d001200320023602c801200320123602cc01200341c8016a4100201e10c90120032802c801222220032802d00122026a2020201e10cf061a20032002201e6a3602d00120032902cc01211f0b2000202236020420004100360200200041086a201f3702000b02402017450d00201610260b20034180046a24000f0b1034000b201a201541d8bbc7001032000b201c200641d8bbc7001032000b1033000b2000420037020020170d010c020b20032d00c9012112200341a8036a41086a2206200341086a290300370300200341a8036a41106a2215200341106a290300370300200341a8036a41186a2218200341186a290300370300200320032903003703a803413010242202450d02200241033a0000200220032903a803370001200220123a0021200220032901d003370122200241096a2006290300370000200241116a2015290300370000200241196a2018290300370000200241286a200341d6036a29010037010020004101360200200020023602042017450d010b201610260b20034180046a24000f0b102c000bf70201057f024002402000410c6a28020022012001417f6a200041046a28020020002802006b716b4101470d002001210202402001450d0002400240200120016a22022001490d00200241ffffffff037122032002470d00200241027422044100480d0020032002464102742103024002400240200028020822020d0020040d01200321020c040b200141027422052004460d03024020050d0020040d01410421020c040b20022005200410282202450d010c030b2004102422020d020b20030d040b102e000b200020023602082000410c6a200441027622023602000b0240024020022001410174470d0020002802002204200041046a28020022034d0d022003200120046b2205490d0120002802082201200220056b22024102746a200120044102746a200541027410cf061a200020023602000f0b41ead7c400412b41dcbcc700102f000b2000280208220220014102746a2002200341027410cf061a200041046a2200200028020020016a3602000b0f0b102c000be00303047f017e017f23004180016b2202240002400240024002400240024002400240200028020c2203200041106a280200470d002002200141fc0010cf06210120002802082203200041046a280200470d05200341016a22042003490d03200341017422052004200520044b1b22044104200441044b1bad42fc007e2206422088a722050d032006a722044100480d03200545410274210702402000280200410020031b22050d0020040d02200721050c050b200341fc006c22032004460d04024020030d0020040d02410421050c050b20052003200410282205450d020c040b2000410c6a200041186a280200417f6a200341016a71360200200041146a28020020034102746a28020021032002200141fc0010cf06210102402000280208220420034d0d000240024020002802002200200341fc006c6a22042d00000d002000200341fc006c6a41046a10d7010c010b2000200341fc006c6a41246a10d7010b2004200141fc0010cf061a0c060b2003200441908cc6001032000b2004102422050d020b20070d040b102e000b20002005360200200041046a200441fc006e360200200028020821030b2000280200200341fc006c6a200141fc0010cf061a20002000280208220341016a3602080b20024180016a240020030f0b102c000ba60501057f024002400240024020002d00000e03010200010b200041046a280200220041ffff03200041ffff03491b220241c0006a41ff0020022000413e2002413e491b2203461b2100200220036b2103200141086a2102410121040340024002400240200441ff01714102470d00200021050c010b410021052004410171450d00410021040c010b2003450d0402402003418002490d00200341817e6a210341ff012100410221040c010b2003417f6a210041022104410021030b200120022802004101106d2001280200200228020022066a20003a00002002200641016a360200200521000c000b0b2001200141086a22002802004101106d2001280200200028020022016a41003a00002000200141016a3602000c010b200041046a2802002202413e200241ffff03200241ffff03491b2202413e491b2103024020002d00010d00200241807f7341bf7f20022003461b2100200220036b2103200141086a2102410121040340024002400240200441ff01714102470d00200021050c010b410021052004410171450d00410021040c010b2003450d0302402003418002490d00200341817e6a210341ff012100410221040c010b2003417f6a210041022104410021030b200120022802004101106d2001280200200228020022066a20003a00002002200641016a360200200521000c000b0b200241406a417f20022003461b2100200220036b2103200141086a2102410121040340024002400240200441ff01714102470d00200021050c010b410021052004410171450d00410021040c010b2003450d0202402003418002490d00200341817e6a210341ff012100410221040c010b2003417f6a210041022104410021030b200120022802004101106d2001280200200228020022066a20003a00002002200641016a360200200521000c000b0b0ba30201077f02400240200141086a280200220441036a2205417f4c0d0020012d000021062001280204210720012d00012108410121014100210902402005450d00200510242201450d02200521090b20002001360200200041086a22014100360200200041046a220a2009360200200441017420066a220541ffff03200541ffff03491b41c000200010d5040240024020060d00200128020021050c010b2008410f712106024020012802002201200a280200470d00200020014101106d200041086a28020021010b200041086a200141016a2205360200200028020020016a20063a00000b200020052004106d2000280200200041086a220128020022056a2007200410cf061a2001200520046a3602002002200320001095010f0b1034000b1033000bb70101057f20012802082202410176210320012802042104024002400240024020024101710d0020042003490d02200128020020036a210141002102410021050c010b200420034d0d024101210520012802002202200341016a22066a2101200220036a2d0000410f712102200621030b200020053a000c20002001360204200041003602002000410d6a20023a0000200041086a200420036b3602000f0b2003200441d0bac7001048000b2003200441e0bac7001032000bcd09010c7f230041106b2204240002400240024002400240024020010d00410021010c010b200141086a28020022054101762106200141046a2802002107024002400240024020054101710d00200720064f0d012006200741d0bac7001048000b200720064b0d012006200741e0bac7001032000b200720066b2108200128020020066a21090c010b20002001280200220120066a2d0000410f7110c9062007200641016a22066b2108200120066a21090b2000280200220121060240200141244d0d002000410c6a28020021060b02400240024002402006410174200028022c460d00200121060240200141244d0d002000410c6a28020021060b2008450d032006417f6a2106200141244b0d01200041056a210a2001210b0c020b0240200141244d0d002000410c6a28020021010b20042000200810cd04024020042802004101470d00200441086a2802000d0541c8bcc700411141dcbcc700102f000b2000280200220a21060240200a41244d0d002000410c6a28020021060b024020062001490d0002400240200a41244b0d00200041056a210a0c010b200041086a280200210a0b200a20016a220a20086a200a200620016b10d0061a200a2009200810cf061a200620086a21010240200028020041244b0d00200020013602000c040b2000410c6a20013602000c030b418cbdc700411e41dcbcc700102f000b2000410c6a280200210b200041086a280200210a0b200b20064d0d03200a20066a2d0000210a02400240200141244b0d00200041056a210b0c010b2000410c6a2802002101200041086a280200210b0b200120064d0d04200b20066a200a4170713a000020092d0000210a024002402000280200220141244b0d00200041056a210b0c010b2000410c6a2802002101200041086a280200210b0b200120064d0d05200b20066a220120012d0000200a410476723a000002402008417f6a220c450d00200041056a210d2000410c6a210e41002101034002400240024020082001460d00200920016a22062d0000210b200641016a2d0000210f024002402000280200220a41244b0d004124210a200021060c010b200e21060b024020062802002206200a470d0020042000410110cd0420042802004101470d00200441086a2802000d0841c8bcc700411141dcbcc700102f000b200141016a2101200f410476200b41047472210a200028020041244b0d01200d210b2000210f0c020b2008200841c0bac7001032000b2000280208210b200e210f0b200f200641016a360200200b20066a200a3a0000200c2001470d000b0b2009200c6a2d0000210a41242106024002402000280200220b41244b0d00200021010c010b2000410c6a2101200b21060b0240200128020022012006470d0020042000410110cd0420042802004101470d00200441086a2802000d0341c8bcc700411141dcbcc700102f000b200a410474210602400240200028020041244b0d00200041056a210a2000210b0c010b2000410c6a210b200041086a280200210a0b200b200141016a360200200a20016a20063a00000b2000200028022c20084101746a36022c200741017420056b21010b02402002450d002000200310c906200141016a21010b200441106a240020010f0b102c000b2006200b4190bac7001032000b2006200141a0bac7001032000b2006200141b0bac7001032000b9b2203067f067e0d7f230022042105200441e0036b416071220424002004200336021420042001360210024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020022d00004101460d00200241046a28020021020240200141386a220628020022032003417f6a2207200141306a220828020022032001412c6a22092802006b716b4101470d0020091086042006280200417f6a2107200828020021030b20082007200341016a71360200200141346a28020020034102746a2002360200200141286a280200220320024d0d022001280220200241fc006c6a2201290210210a200120042903f0013702102001290208210b200120042903e801370208200441d8006a2001290240220c370300200441386a22032001290220370300200441f8006a2001290260370300200141186a2202290200210d200220042903f801370200200441003a00e001200441003602e4012001290200210e200120042903e001370200200441186a41d8006a2207200141d8006a290200370300200441186a41d0006a2208200141d0006a290200370300200441186a41c8006a2206200141c8006a290200370300200441186a41386a200141386a290200220f370300200441186a41306a2209200141306a290200370300200441186a41286a200141286a290200370300200441186a41186a2210200d370300200441186a41e8006a200141e8006a290200370300200441186a41f0006a200141f0006a290200370300200441186a41f8006a200141f8006a2802003602002004200a3703282004200b3703202004200e370318200ea741ff01714101460d01200ba72102200b422088a72101200c422088a72111200fa72112200441c0016a41086a22132003290300370300200441c0016a41106a2203200441186a41286a290300370300200441c0016a41186a2009290300370300200441a8016a41086a2008290300370300200441a8016a41106a2007280200360200200420102903003703c001200420062903003703a801200441d4006a290200220fa7211402400240024002400240200e422088a70e050102030400010b200441e0016a41086a200a370300200441e0016a41106a20042903c001370300200441e0016a41186a201329030037030020044180026a2003290300370300200441e0016a41286a200441c0016a41186a290300370300200420023602e001200420013602e40102400240200141244b0d00200441e9016a21060c010b200a422088a7210620042802f00121010b200241017621080240024020024101710d0020012008490d0941002103410021090c010b200120084d0d0941012109200620086a2d0000410f712103200841016a21080b200141017420026b220241ffff03200241ffff03491b220241017641036a221010242213450d09200120086b2107200620086a2108200441003602a0012004201036029c01200420133602980102402014410020141b22060d00200420023602e402200441013b01e002200441e0026a20044198016a1088044100210220090d0e410021010c0f0b200420023602e40220044181023b01e002200441e0026a20044198016a1088044100210220090d0c410021010c0f0b410110242201450d082004420137029c01200420013602980120044198016a4100410110c90120042802980120042802a00122016a41003a00002004200141016a3602a0010c100b200441e0016a41086a200a370300200441e0016a41106a20042903c001370300200441e0016a41186a201329030037030020044180026a2003290300370300200441e0016a41286a200441c0016a41186a290300370300200420023602e001200420013602e40102400240200141244b0d00200441e9016a21070c010b200a422088a7210720042802f00121010b2002410176210302400240200241017122020d0020012003490d0a200441e8026a200120036b360200200441003b01e0022004200720036a3602e4020c010b200120034d0d0a200441e8026a2001200341016a22086b360200200420023a00e0022004200720086a3602e4022004200720036a2d0000410f713a00e1020b20044198016a200441e0026a2012200f422088a710890402402014450d00201210260b20042802e40141244d0d0f200441ec016a28020010260c0f0b200441e0016a41086a200a370300200441e0016a41106a20042903c001370300200441e0016a41186a201329030037030020044180026a2003290300370300200441e0016a41286a200441c0016a41186a290300370300200420023602e001200420013602e40102400240200141244b0d00200441e9016a21000c010b200a422088a7210020042802f00121010b200420023602c802200420013602c402200420003602c002200441a0036a200441c0026a108a042004280214200441c0026a41002004108b04210120042802102102200441a4026a201136020020044198026a41106a20042903a801370300200441b0026a200441b0016a290300370300200441b8026a200441a8016a41106a2802003602002004200f37029c022004201236029802200441e0026a200220044198026a20042802142204108c0420042001108d040b108103000b200041003a000020002002290001370001200041196a200241196a290000370000200041116a200241116a290000370000200041096a200241096a2900003700000c130b20002004290019370001200041003a0000200041196a200441186a41196a290000370000200041116a200441186a41116a290000370000200041096a200441186a41096a2900003700000c130b2002200341b089c6001032000b2008200141d0bac7001048000b2008200141e0bac7001032000b1033000b2003200141d0bac7001048000b2003200141e0bac7001032000b410121010c020b410121010b03400240024020010e020001010b200220074f0d03200820026a2d00002103200241016a2102410121010c010b024020042802a0012201200428029c01470d0020044198016a2001410110c9010b20042802980120016a20033a00002004200141016a3602a001410021010c000b0b03400240024020010e020001010b200220074f0d02200820026a2d00002103200241016a2102410121010c010b024020042802a0012201200428029c01470d0020044198016a2001410110c9010b20042802980120016a20033a00002004200141016a3602a001410021010c000b0b20042802a0012215210102402015200428029c01470d0020044198016a2015410110c90120042802a00121010b20042802980120016a41003a0000200420042802a00141016a22013602a00102402001200428029c01470d0020044198016a2001410110c90120042802a00121010b201241c0046a211620042802980120016a41003a0000200420042802a00141016a3602a00102402006450d002006201120044198016a1095010b024002400240024020162012470d0041002110410021010c010b200441e0026a4101722103200441e9016a2117200441a0036a410172210241002109201221014100211041012106024002400340200441023a00e0022001290200210e20042903f802210b20042903f002210a20042903e802210d200120042903e0023702002001290208210c2001200d3702082001290210210d2001200a370210200141186a2207290200210a2007200b3702002004200a3703b8032004200d3703b0032004200c3703a8032004200e3703a003200141206a2802002118200441e0026a41176a2213200241176a290000370000200441e0026a41106a2207200241106a290000370300200441e0026a41086a2208200241086a290000370300200420022900003703e0020240200ea7221941ff017122114103470d0020104180fe037141087621010c050b200441c0026a41176a221a2013290000370000200441c0026a41106a22132007290300370300200441c0026a41086a2008290300220e370300200420042903e002220b3703c002200441a0036a41176a221b201a290000370000200441a0036a41106a221a2013290300370300200441a0036a41086a2213200e3703002004200b3703a00302400240024020114102470d00200441023a0098020c010b0240024020042802e401221141244b0d002017211c0c010b20042802f001211120042802ec01211c0b200420042802e0013602d803200420113602d4032004201c3602d0032004280214200441d0036a41012009108b0421112004280210211c200320042903a003370000200341086a2013290300370000200341106a201a290300370000200341176a201b290000370000200420193a00e002200420183602800320044198026a201c200441e0026a20042802142218108c0420182011108d0420042d0098024103460d010b200441e0026a41206a20044198026a41206a290300370300200441e0026a41186a20044198026a41186a290300370300200720044198026a41106a290300370300200820044198026a41086a2903003703002004200429039802220e3703e0020240024002400240200ea741ff0171417f6a220841014b0d004100210720080e020103010b2003412020044198016a1095010c010b200441a0036a41186a200341186a290000370300201a200341106a2900003703002013200341086a290000370300200420032900003703a003200428028403220741214f0d04200441a0036a200720044198016a1095010b200621070b200941016a21092006410174210620072010722110200141246a22012016460d030c010b0b20104180fe037141087621010c040b200741204190dfc4001047000b20104180fe037141087621010b200441033a00a003200441f7026a20042900b803370000200441f0026a20042900b103370300200441e8026a20042900a903370300200420042900a1033703e0020b200441033a0098020b201541026a21022015417d4b0d0120042802a00122032002490d0220042802980120156a2001410874201041ff0171723b000002402014450d00200f428080808010540d00201410260b2012102620042802e40141244d0d00200441ec016a28020010260b024020042802a0012201411f4b0d00200441f8016a22024200370300200441f0016a22034200370300200441e8016a22074200370300200442003703e001200441e0016a200428029801200110cf061a200041246a2001360200200041013a0000200041196a2002290300370000200041116a2003290300370000200041096a2007290300370000200020042903e0013700010c060b2004280210220241c0006a2802002108200228023c21062004280214220228022c2209410176210720022802002103024002402009410171450d0002400240200341244b0d00200241056a2109200321100c010b2002410c6a2802002110200241086a28020021090b20102007490d0402400240200341244b0d00200241056a21020c010b2002410c6a2802002103200241086a28020021020b200320074d0d05200441e9026a200220076a2d000041f001713a0000200420093602e002410121020c010b02400240200341244b0d00200241056a21020c010b2002410c6a2802002103200241086a28020021020b20032007490d05200420023602e002410021020b200420023a00e802200420073602e402200441e0016a2006200441e0026a20042802980120012008280214110600200020042903e001370001200041096a200441e8016a290300370000200041116a200441f0016a290300370000200041196a200441f8016a290300370000200041003a000020042802102201200128026c41016a36026c0c050b2015200241a0dfc4001048000b2002200341a0dfc4001047000b2007201041e0b9c7001047000b2007200341f0b9c7001032000b200720034180bac7001047000b0240200428029c01450d0020042802980110260b20042d00180d010b200524000f0b2004413c6a10d701200524000ba20301057f02402001450d0002400240200028022c220220014d0d00200220016b2203410176200341017122046a21052000280200220221010240200241244d0d002000410c6a28020021010b200520014f0d012000410c6a2106200520016b41016a2101034002400240200241244b0d00200021020c010b200621020b024020022802002205450d0020022005417f6a3602000b2001450d02200141016a2101200028020021020c000b0b024002402000280200220141244b0d00200021020c010b2000410c6a220228020021010b02402001450d00200241003602000b2000410036022c0c010b2000200336022c2004450d00024002402000280200220241244b0d00200041056a21052002417f6a2101200221060c010b2000410c6a2802002206417f6a2101200041086a28020021050b02400240200620014d0d00200520016a2d0000210502400240200241244b0d00200041056a21000c010b2000410c6a2802002102200041086a28020021000b200220014d0d01200020016a20054170713a00000f0b2001200641c0b9c7001032000b2001200241d0b9c7001032000b0b130020004104360204200041a0c0c3003602000b34002000419a8cc70036020420004100360200200041146a4104360200200041106a41e4dac300360200200041086a42083702000b0b002000410841001091040bf70203027f027e017f0240024020024105744104722203417f4c0d00200310242204450d012000200336020420002004360200200041086a220341003602002000200210a10102402002450d0020024105742104200328020021020340200020024108106d2000280200200328020022026a200141106a2900003700002003200241086a2202360200200141086a290300210520012903002106200020024110106d2000280200200328020022026a22072005370008200720063700002003200241106a22023602000240200141186a2d0000220741024b0d00024002400240024020070e03000102000b200020024101106d2000280200200328020022026a41003a0000200241016a21020c020b200020024101106d2000280200200328020022026a41013a0000200241016a21020c010b200020024101106d2000280200200328020022026a41023a0000200241016a21020b200320023602000b200141206a2101200441606a22040d000b0b0f0b1034000b1033000bd10101037f20004201370200200041086a22024100360200200041004110106d2000280200200228020022036a22044200370008200442003700002002200341106a2203360200200020034110106d2000280200200228020022036a22044200370008200442003700002002200341106a2203360200200020034110106d2000280200200228020022036a22044200370008200442003700002002200341106a2203360200200020034110106d2000280200200228020022006a22034200370008200342003700002002200041106a3602000b5201027f02404110102422020d001033000b2000421037020420002002360200200041004110106d2000280200200041086a220028020022026a22034200370008200342003700002000200241106a3602000b130020004101360204200041e4e1c3003602000b5601027f02404110102422020d001033000b2000421037020420002002360200200041004110106d2000280200200041086a220028020022026a2203420037000820034280c8afa0253700002000200241106a3602000b130020004106360204200041acedc3003602000b3400200041a88dc70036020420004100360200200041146a4103360200200041106a41e4fdc300360200200041086a42093702000b3b01017f20004201370200200041086a22024100360200200041004101106d2000280200200228020022006a41003a00002002200041016a3602000bb49e0104037f017e067f017e230041e0006b2202240002402000280200220341164b0d000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020030e17000102030405060708090a0b0c161514131211100f0e0d000b2001200141086a22032802004101106d2001280200200328020022046a41003a00002003200441016a2204360200200041086a280200417f6a220341094b0d19024002400240024002400240024002400240024020030e0a00010203040506070809000b200120044101106d2001280200200141086a220328020022046a41003a00002003200441016a22043602002000410c6a2802002100200120044104106d2001280200200328020022016a20003600002003200141046a3602000c220b200120044101106d2001280200200141086a220328020022046a41013a00002003200441016a3602002000410c6a280200200041146a28020020011095010c210b200120044101106d2001280200200141086a220328020022046a41023a00002003200441016a2204360200200041106a2903002105200120044108106d2001280200200328020022016a20053700002003200141086a3602000c200b200120044101106d2001280200200141086a220328020022046a41033a00002003200441016a3602002000410c6a280200200041146a28020020011095010c1f0b200120044101106d2001280200200141086a220328020022046a41043a00002003200441016a3602002000410c6a280200200041146a28020020011095010c1e0b200120044101106d2001280200200141086a220328020022046a41053a00002003200441016a36020020012000410c6a10a4010c1d0b200120044101106d2001280200200141086a220328020022046a41063a00002003200441016a3602002000410c6a28020021032001200041146a280200220010a1012000450d1c2003200041186c6a210003402003280200200341086a28020020011095012003410c6a280200200341146a2802002001109501200341186a22032000470d000c1d0b0b200120044101106d2001280200200141086a220328020022046a41073a00002003200441016a3602002000410c6a28020021032001200041146a280200220010a1012000450d1b20032000410c6c6a210003402003280200200341086a28020020011095012003410c6a22032000470d000c1c0b0b200120044101106d2001280200200141086a220328020022046a41083a00002003200441016a3602002000410c6a280200200041146a2802002001109501200041186a2802002100200120032802004104106d2001280200200328020022016a20003600002003200141046a3602000c1a0b200120044101106d2001280200200141086a220128020022006a41093a00002001200041016a3602000c190b2001200141086a22032802004101106d2001280200200328020022046a41013a00002003200441016a2204360200200041086a280200417f6a220341014b0d180240024020030e020001000b200120044101106d2001280200200141086a220328020022046a41003a00002003200441016a2204360200200120044120106d2001280200200328020022066a220420004188026a290000370000200441186a200041a0026a290000370000200441106a20004198026a290000370000200441086a20004190026a2900003700002003200641206a2204360200200041206a2903002105200120044108106d2001280200200328020022046a20053700002003200441086a3602002001200041286a10ab01200120004198016a10ab0120012000410c6a10ae010c190b200120044101106d2001280200200141086a220328020022046a41013a00002003200441016a2204360200200120044120106d2001280200200328020022066a220420004188026a290000370000200441186a200041a0026a290000370000200441106a20004198026a290000370000200441086a20004190026a2900003700002003200641206a2204360200200041206a2903002105200120044108106d2001280200200328020022046a20053700002003200441086a3602002001200041286a10ab01200120004198016a10ab0120012000410c6a10ae010c180b2001200141086a22032802004101106d2001280200200328020022046a41023a00002003200441016a2204360200200120044101106d2001280200200328020022046a41003a00002003200441016a22043602000240024002400240200041086a290300220542c000540d00200542808001540d012005428080808004540d024108200579a741037622066b4104490d03200120044101106d2001280200200141086a220328020022046a411320064102746b3a00002003200441016a2204360200200220002903082205370308200641786a21000340200120044101106d2001280200200328020022046a20053c00002003200441016a220436020020054208882105200041016a22062000492107200621002007450d000b200220053703082005500d1b200241286a41146a4109360200200241346a4111360200200241106a41146a41033602002002200241086a360240200241e886c600360244200241c8006a41146a410036020020024203370214200241d4c0c7003602102002411136022c200241d4c0c7003602582002420137024c200241f086c6003602482002200241286a3602202002200241c8006a3602382002200241c4006a3602302002200241c0006a360228200241106a41ecc0c700103d000b200120044101106d2001280200200328020022016a2005a74102743a00002003200141016a3602000c1a0b200120044102106d2001280200200141086a220128020022006a2005a74102744101723b00002001200041026a3602000c190b200120044104106d2001280200200141086a220128020022006a2005a74102744102723600002001200041046a3602000c180b41ab86c600413641dcbcc700102f000b2001200141086a22032802004101106d2001280200200328020022046a41033a00002003200441016a220436020020002d0004417f6a220641044b0d16200041046a21030240024002400240024020060e050001020304000b200120044101106d2001280200200141086a220328020022046a41003a00002003200441016a2204360200200041086a2802002100200120044104106d2001280200200328020022016a20003600002003200141046a3602000c1a0b200120044101106d2001280200200141086a220428020022066a41013a00002004200641016a2206360200200120064120106d2001280200200428020022076a22062003290001370000200641186a200341196a290000370000200641106a200341116a290000370000200641086a200341096a2900003700002004200741206a2203360200200041286a2802002100200120034104106d2001280200200428020022016a20003600002004200141046a3602000c190b200120044101106d2001280200200141086a220328020022046a41023a00002003200441016a2204360200200041086a2802002100200120044104106d2001280200200328020022016a20003600002003200141046a3602000c180b200120044101106d2001280200200141086a220428020022066a41033a00002004200641016a2206360200200120064120106d2001280200200428020022076a22062003290001370000200641186a200341196a290000370000200641106a200341116a290000370000200641086a200341096a2900003700002004200741206a2203360200200041286a2802002106200120034104106d2001280200200428020022036a20063600002004200341046a220336020020002d00252100200120034101106d2001280200200428020022016a20003a00002004200141016a3602000c170b200120044101106d2001280200200141086a220328020022046a41043a00002003200441016a2204360200200041086a2802002100200120044104106d2001280200200328020022016a20003600002003200141046a3602000c160b2001200141086a22032802004101106d2001280200200328020022046a41043a00002003200441016a2204360200200041086a22032d0000417f6a220641034b0d15024002400240024020060e0400010203000b200120044101106d2001280200200141086a220428020022066a41003a00002004200641016a2206360200200120064120106d2001280200200428020022076a22062003290001370000200641186a200341196a290000370000200641106a200341116a290000370000200641086a200341096a2900003700002004200741206a3602002002200041306a360248200241c8006a200110a7020c180b200120044101106d2001280200200141086a220428020022066a41013a00002004200641016a2206360200200120064120106d2001280200200428020022076a22062003290001370000200641186a200341196a290000370000200641106a200341116a290000370000200641086a200341096a2900003700002004200741206a3602002002200041306a360248200241c8006a200110a7022002200041c0006a360248200241c8006a200110a7020c170b200120044101106d2001280200200141086a220428020022066a41023a00002004200641016a2206360200200120064120106d2001280200200428020022076a22062003290001370000200641186a200341196a290000370000200641106a200341116a290000370000200641086a200341096a2900003700002004200741206a2206360200200120064120106d2001280200200428020022076a2206200341216a290000370000200641186a200341396a290000370000200641106a200341316a290000370000200641086a200341296a2900003700002004200741206a3602002002200041d0006a360248200241c8006a200110a7020c160b200120044101106d2001280200200141086a220428020022066a41033a00002004200641016a2206360200200120064120106d2001280200200428020022076a22062003290001370000200641186a200341196a290000370000200641106a200341116a290000370000200641086a200341096a2900003700002004200741206a3602002002200041306a360248200241c8006a200110a7020c150b2001200141086a22032802004101106d2001280200200328020022046a41053a00002003200441016a2204360200200120044101106d2001280200200328020022046a41003a00002003200441016a3602002000280204210420012000410c6a280200220010a1012000450d14200041f0006c21060340200220013602482004220041106a200241c8006a109c0102400240024002402000280200220441c000490d00200441808001490d012004418080808004490d02200120032802004101106d2001280200200328020022046a41033a00002003200441016a220436020020002802002107200120044104106d2001280200200328020022046a20073600002003200441046a3602000c030b200120032802004101106d2001280200200328020022076a20044102743a00002003200741016a3602000c020b200120032802004102106d2001280200200328020022076a20044102744101723b00002003200741026a3602000c010b200120032802004104106d2001280200200328020022076a20044102744102723600002003200741046a3602000b200041f0006a210420022001360248200041306a200241c8006a109c0120022001360248200041d0006a200241c8006a109c012001200041046a10a001200641907f6a22060d000c150b0b2001200141086a22002802004101106d2001280200200028020022036a41063a00002000200341016a360200200110fa020c130b2001200141086a22032802004101106d2001280200200328020022046a41073a00002003200441016a220436020002402000280204450d00200120044101106d2001280200200328020022046a41003a00002003200441016a2204360200200120044120106d2001280200200328020022066a2204200041106a290000370000200441186a200041286a290000370000200441106a200041206a290000370000200441086a200041186a2900003700002003200641206a2204360200200120044120106d2001280200200328020022066a2204200041306a290000370000200441186a200041c8006a290000370000200441106a200041c0006a290000370000200441086a200041386a2900003700002003200641206a2204360200200120044120106d2001280200200328020022066a2204200041d0006a290000370000200441186a200041e8006a290000370000200441106a200041e0006a290000370000200441086a200041d8006a2900003700002003200641206a2204360200200120044120106d2001280200200328020022066a2204200041f0006a290000370000200441186a20004188016a290000370000200441106a20004180016a290000370000200441086a200041f8006a2900003700002003200641206a2204360200200120044120106d2001280200200328020022066a220420004190016a290000370000200441186a200041a8016a290000370000200441106a200041a0016a290000370000200441086a20004198016a2900003700002003200641206a36020020002802042000410c6a28020020011095010c130b200120044101106d2001280200200328020022016a41013a00002003200141016a3602000c120b2001200141086a22032802004101106d2001280200200328020022046a41083a00002003200441016a2204360200200120044101106d2001280200200328020022046a41003a00002003200441016a22063602000240024002402000280204220441c000490d00200441808001490d012004418080808004490d02200120064101106d2001280200200141086a220328020022046a41033a00002003200441016a220436020020002802042100200120044104106d2001280200200328020022016a20003600002003200141046a3602000c140b200120064101106d2001280200200328020022016a20044102743a00002003200141016a3602000c130b200120064102106d2001280200200141086a220128020022006a20044102744101723b00002001200041026a3602000c120b200120064104106d2001280200200141086a220128020022006a20044102744102723600002001200041046a3602000c110b2001200141086a22032802004101106d2001280200200328020022046a41093a00002003200441016a2204360200200041086a280200417f6a220341024b0d1002400240024020030e03000102000b200120044101106d2001280200200141086a220328020022046a41003a00002003200441016a3602002001200041206a10aa0120012000410c6a10ae010c120b200120044101106d2001280200200141086a220328020022046a41013a00002003200441016a3602002001200041206a10aa0120012000410c6a10ae010c110b200120044101106d2001280200200141086a220328020022046a41023a00002003200441016a22043602002000410c6a2802002106200120044104106d2001280200200328020022046a20063600002003200441046a2204360200200041106a2802002100200120044104106d2001280200200328020022016a20003600002003200141046a3602000c100b2001200141086a22062802004101106d2001280200200628020022036a410a3a00002006200341016a2203360200200120034101106d2001280200200628020022036a41003a00002006200341016a220336020020002802042104200120034104106d2001280200200628020022036a20043600002006200341046a360200200041086a280200200041106a2802002001109501200041146a280200210320012000411c6a280200220410a1012000412c6a210702402004450d0020032004410c6c6a210403402003280200200341086a28020020011095012003410c6a22032004470d000b0b200041206a2802002103200120062802004104106d2001280200200628020022046a20033600002006200441046a2203360200200041246a2802002104200120034104106d2001280200200628020022036a20043600002006200341046a2203360200200041286a2802002100200120034104106d2001280200200628020022036a20003600002006200341046a22003602002001200041c000106d2001280200200628020022006a22012007290000370000200141386a200741386a290000370000200141306a200741306a290000370000200141286a200741286a290000370000200141206a200741206a290000370000200141186a200741186a290000370000200141106a200741106a290000370000200141086a200741086a2900003700002006200041c0006a3602000c0f0b2001200141086a22002802004101106d2001280200200028020022036a410b3a00002000200341016a360200200110fa020c0e0b2001200141086a22032802004101106d2001280200200328020022046a410c3a00002003200441016a2204360200200041086a22032d0000417f6a220641034b0d0d024020060e04000d0c0b000b200120044101106d2001280200200141086a220328020022046a41003a00002003200441016a3602002000410c6a28020021082001200041146a280200220010a1012000450d0d200820004198026c6a2109034020012008109b0120082802800221042001200828028802220010a10102402000450d00200041c1006c2107034020042d00002106200120032802004101106d200441016a210020012802002003280200220a6a210b0240024020064101460d00200b41013a00002003200a41016a22063602002001200641c000106d20012802002003280200220a6a22062000290000370000200641386a200041386a290000370000200641306a200041306a290000370000200641286a200041286a290000370000200641206a200041206a290000370000200641186a200041186a290000370000200641106a200041106a290000370000200641086a200041086a2900003700000c010b200b41023a00002003200a41016a22063602002001200641c000106d20012802002003280200220a6a22062000290000370000200641386a200041386a290000370000200641306a200041306a290000370000200641286a200041286a290000370000200641206a200041206a290000370000200641186a200041186a290000370000200641106a200041106a290000370000200641086a200041086a2900003700000b200441c1006a21042003200a41c0006a360200200741bf7f6a22070d000b0b20084190026a220628020022004103762104200828028c022107024002402000418004490d002004410274210402402000418080084f0d00200120032802004102106d2001280200200328020022006a20044101723b0000200041026a21040c020b200120032802004104106d2001280200200328020022006a2004410272360000200041046a21040c010b200120032802004101106d2001280200200328020022006a20044102743a0000200041016a21040b2003200436020020084198026a2108024002402006280200220a41037622060d00410021000c010b4101210020064108200a4107716b220a4d0d00410241012006200a6b22004107711b20004103766a21000b200120042000106d2001280200200328020022046a2007200010cf061a2003200420006a36020020082009470d000c0e0b0b2001200141086a22032802004101106d2001280200200328020022046a41163a00002003200441016a2204360200200041086a220b2d0000417f6a220341034b0d0c024002400240024020030e0400010203000b200120044101106d2001280200200141086a220628020022036a41003a00002006200341016a3602002000410c6a28020021032001200041146a280200220410a10102402004450d0020044105742107200628020021040340200120044120106d20012802002006280200220a6a22042003290000370000200441186a200341186a290000370000200441106a200341106a290000370000200441086a200341086a2900003700002006200a41206a2204360200200341206a2103200741606a22070d000b0b200028021820011099040c0f0b200120044101106d2001280200200141086a220628020022036a41013a00002006200341016a220336020020002f010a2104200120034102106d2001280200200628020022036a20043b00002006200341026a3602002000410c6a28020021032001200041146a280200220410a101200041186a210b02402004450d0020044105742107200628020021040340200120044120106d20012802002006280200220a6a22042003290000370000200441186a200341186a290000370000200441106a200341106a290000370000200441086a200341086a2900003700002006200a41206a2204360200200341206a2103200741606a22070d000b0b2001200b10a40120002802242000412c6a280200200110950120002d00092103200120062802004101106d2001280200200628020022046a20033a00002006200441016a220336020020002903302105200120034108106d2001280200200628020022016a20053700002006200141086a3602000c0e0b200120044101106d2001280200200141086a220628020022036a41023a00002006200341016a220336020020002f012a2104200120034102106d2001280200200628020022036a20043b00002006200341026a3602002000412c6a28020021032001200041346a280200220410a101200041386a210802402004450d0020044105742107200628020021040340200120044120106d20012802002006280200220a6a22042003290000370000200441186a200341186a290000370000200441106a200341106a290000370000200441086a200341086a2900003700002006200a41206a2204360200200341206a2103200741606a22070d000b0b2001200810a401200120062802004120106d2001280200200628020022046a2203200b290001370000200341186a200b41196a290000370000200341106a200b41116a290000370000200341086a200b41096a2900003700002006200441206a220336020020002903482105200120034108106d2001280200200628020022016a20053700002006200141086a3602000c0d0b200120044101106d2001280200200141086a220628020022036a41033a00002006200341016a220336020020002f012a2104200120034102106d2001280200200628020022036a20043b00002006200341026a3602002000412c6a28020021032001200041346a280200220410a1010240024020040d00200628020021040c010b20044105742107200628020021040340200120044120106d20012802002006280200220a6a22042003290000370000200441186a200341186a290000370000200441106a200341106a290000370000200441086a200341086a2900003700002006200a41206a2204360200200341206a2103200741606a22070d000b0b20002802382106200120044104106d2001280200200141086a220328020022046a20063600002003200441046a22043602002000413c6a2802002100200120044104106d2001280200200328020022046a20003600002003200441046a2200360200200120004120106d2001280200200328020022006a2201200b290001370000200141186a200b41196a290000370000200141106a200b41116a290000370000200141086a200b41096a2900003700002003200041206a3602000c0c0b2001200141086a22032802004101106d2001280200200328020022046a41153a00002003200441016a220436020020002d0004417f6a220641054b0d0b200041046a210302400240024002400240024020060e06000102030405000b200120044101106d2001280200200141086a220428020022066a41003a00002004200641016a2206360200200120064120106d2001280200200428020022076a22062003290001370000200641186a200341196a290000370000200641106a200341116a290000370000200641086a200341096a2900003700002004200741206a220636020020002d00252107200120064101106d2001280200200428020022066a210a0240024020074104470d00200a41003a00002004200641016a3602000c010b200a41013a00002004200641016a2206360200024002400240024020032d00210e0400010203000b200120064101106d2001280200200141086a220328020022046a41003a00002003200441016a3602000c030b200120064101106d2001280200200141086a220328020022046a41013a00002003200441016a3602000c020b200120064101106d2001280200200141086a220328020022046a41023a00002003200441016a3602000c010b200120064101106d2001280200200141086a220328020022046a41033a00002003200441016a3602000b200028022820011099040c100b200120044101106d2001280200200141086a220028020022046a41013a00002000200441016a2204360200200120044120106d2001280200200028020022066a22042003290001370000200441186a200341196a290000370000200441106a200341116a290000370000200441086a200341096a2900003700002000200641206a22043602000240024002400240200341216a2d00000e0400010203000b200120044101106d2001280200200028020022016a41003a00002000200141016a3602000c120b200120044101106d2001280200200028020022016a41013a00002000200141016a3602000c110b200120044101106d2001280200200028020022016a41023a00002000200141016a3602000c100b200120044101106d2001280200200028020022016a41033a00002000200141016a3602000c0f0b200120044101106d2001280200200141086a220028020022046a41023a00002000200441016a2204360200200120044120106d2001280200200028020022066a22042003290001370000200441186a200341196a290000370000200441106a200341116a290000370000200441086a200341096a2900003700002000200641206a22043602000240024002400240200341216a2d00000e0400010203000b200120044101106d2001280200200028020022016a41003a00002000200141016a3602000c110b200120044101106d2001280200200028020022016a41013a00002000200141016a3602000c100b200120044101106d2001280200200028020022016a41023a00002000200141016a3602000c0f0b200120044101106d2001280200200028020022016a41033a00002000200141016a3602000c0e0b200120044101106d2001280200200141086a220128020022006a41033a00002001200041016a3602000c0d0b200120044101106d2001280200200141086a220028020022046a41043a00002000200441016a22043602000240024002400240024020032d00010e0400010203000b200120044101106d2001280200200028020022046a41003a0000200441016a21040c030b200120044101106d2001280200200028020022046a41013a0000200441016a21040c020b200120044101106d2001280200200028020022046a41023a0000200441016a21040c010b200120044101106d2001280200200028020022046a41033a0000200441016a21040b2000200436020020032f01022100200120044102106d2001280200200141086a220128020022036a20003b00002001200341026a3602000c0c0b200120044101106d2001280200200141086a220428020022066a41053a00002004200641016a2206360200200120064120106d2001280200200428020022076a22062003290001370000200641186a200341196a290000370000200641106a200341116a290000370000200641086a200341096a2900003700002004200741206a22033602000240024002400240024020002d00250e0400010203000b200120034101106d2001280200200428020022036a41003a0000200341016a21030c030b200120034101106d2001280200200428020022036a41013a0000200341016a21030c020b200120034101106d2001280200200428020022036a41023a0000200341016a21030c010b200120034101106d2001280200200428020022036a41033a0000200341016a21030b2004200336020020002f01262104200120034102106d2001280200200141086a220328020022066a20043b00002003200641026a220636020002400240024002402000280228220441c000490d00200441808001490d012004418080808004490d02200120064101106d2001280200200141086a220328020022046a41033a00002003200441016a220436020020002802282106200120044104106d2001280200200328020022046a20063600002003200441046a22043602000c030b200120064101106d2001280200200328020022066a20044102743a00002003200641016a22043602000c020b200120064102106d2001280200200141086a220328020022066a20044102744101723b00002003200641026a22043602000c010b200120064104106d2001280200200141086a220328020022066a20044102744102723600002003200641046a22043602000b024002400240200028022c220341c000490d00200341808001490d012003418080808004490d02200120044101106d2001280200200141086a220328020022046a41033a00002003200441016a2204360200200028022c2100200120044104106d2001280200200328020022016a20003600002003200141046a3602000c0e0b200120044101106d2001280200200141086a220128020022006a20034102743a00002001200041016a3602000c0d0b200120044102106d2001280200200141086a220128020022006a20034102744101723b00002001200041026a3602000c0c0b200120044104106d2001280200200141086a220128020022006a20034102744102723600002001200041046a3602000c0b0b2001200141086a22032802004101106d2001280200200328020022046a41143a00002003200441016a2204360200200041086a22032d0000417f6a220641034b0d0a024002400240024020060e0400010203000b200120044101106d2001280200200141086a220328020022046a41003a00002003200441016a3602002000410c6a28020020011099040c0d0b200120044101106d2001280200200141086a220328020022046a41013a00002003200441016a3602002000410c6a2802002001109904200041106a2903002105200120032802004108106d2001280200200328020022016a20053700002003200141086a3602000c0c0b200120044101106d2001280200200141086a220028020022046a41023a00002000200441016a2204360200200120044120106d2001280200200028020022046a22012003290001370000200141186a200341196a290000370000200141106a200341116a290000370000200141086a200341096a2900003700002000200441206a3602000c0b0b200120044101106d2001280200200141086a220428020022066a41033a00002004200641016a2206360200200120064120106d2001280200200428020022076a22062003290001370000200641186a200341196a290000370000200641106a200341116a290000370000200641086a200341096a2900003700002004200741206a3602002000412c6a28020020011099040c0a0b2001200141086a22032802004101106d2001280200200328020022046a41133a00002003200441016a220436020020002d0004417f6a220341054b0d0902400240024002400240024020030e06000102030405000b200120044101106d2001280200200141086a220328020022046a41003a00002003200441016a2204360200200041086a2802002106200120044104106d2001280200200328020022046a20063600002003200441046a36020020012000410c6a10990120002d00052104200120032802004101106d2001280200200328020022066a20043a00002003200641016a360200200041186a28020020011099040c0e0b200120044101106d2001280200200141086a220328020022046a41013a00002003200441016a2204360200200041086a2802002106200120044104106d2001280200200328020022046a20063600002003200441046a22043602002000410c6a2802002100200120044104106d2001280200200328020022016a20003600002003200141046a3602000c0d0b200120044101106d2001280200200141086a220328020022046a41023a00002003200441016a360200200041086a280200200041106a2802002001109501200041146a2802002104200120032802004104106d2001280200200328020022066a20043600002003200641046a3602002001200041186a10990120002d00052104200120032802004101106d2001280200200328020022066a20043a00002003200641016a360200200041246a28020020011099040c0c0b200120044101106d2001280200200141086a220328020022046a41033a00002003200441016a360200200041086a280200200041106a28020020011095010c0b0b200120044101106d2001280200200141086a220328020022046a41043a00002003200441016a2204360200200041086a2802002106200120044104106d2001280200200328020022046a20063600002003200441046a36020020012000410c6a10990120002d00052104200120032802004101106d2001280200200328020022066a20043a00002003200641016a360200200041186a28020020011099040c0a0b200120044101106d2001280200200141086a220328020022046a41053a00002003200441016a360200200041086a280200200041106a2802002001109501200041146a2802002104200120032802004104106d2001280200200328020022066a20043600002003200641046a3602002001200041186a10990120002d00052104200120032802004101106d2001280200200328020022066a20043a00002003200641016a360200200041246a28020020011099040c090b2001200141086a22032802004101106d2001280200200328020022046a41123a00002003200441016a2204360200200041086a22032d0000417f6a220641034b0d08024002400240024020060e0400010203000b200120044101106d2001280200200141086a220128020022006a41003a00002001200041016a3602000c0b0b200120044101106d2001280200200141086a220028020022046a41013a00002000200441016a2204360200200120044120106d2001280200200028020022046a22012003290001370000200141186a200341196a290000370000200141106a200341116a290000370000200141086a200341096a2900003700002000200441206a3602000c0a0b200120044101106d2001280200200141086a220428020022066a41023a00002004200641016a2206360200200120064120106d2001280200200428020022076a22062003290001370000200641186a200341196a290000370000200641106a200341116a290000370000200641086a200341096a2900003700002004200741206a2203360200200041306a2903002105200041386a290300210c200120034110106d2001280200200428020022036a2206200c370008200620053700002004200341106a2203360200200041c0006a2903002105200041c8006a290300210c200120034110106d2001280200200428020022036a2206200c370008200620053700002004200341106a2203360200200041d0006a2802002100200120034104106d2001280200200428020022016a20003600002004200141046a3602000c090b200120044101106d2001280200200141086a220428020022066a41033a00002004200641016a2206360200200120064120106d2001280200200428020022076a22062003290001370000200641186a200341196a290000370000200641106a200341116a290000370000200641086a200341096a2900003700002004200741206a2206360200200120064120106d2001280200200428020022076a2206200341216a290000370000200641186a200341396a290000370000200641106a200341316a290000370000200641086a200341296a2900003700002004200741206a2203360200200041d0006a2903002105200041d8006a290300210c200120034110106d2001280200200428020022036a2206200c370008200620053700002004200341106a2203360200200041e0006a2903002105200041e8006a290300210c200120034110106d2001280200200428020022036a2206200c370008200620053700002004200341106a2203360200200041f0006a2802002100200120034104106d2001280200200428020022016a20003600002004200141046a3602000c080b2001200141086a22032802004101106d2001280200200328020022046a41113a00002003200441016a220436020020002d0004417f6a220641084b0d07200041046a210302400240024002400240024002400240024020060e09000102030405060708000b200120044101106d2001280200200141086a220428020022066a41003a00002004200641016a2206360200200120064120106d2001280200200428020022076a22062003290001370000200641186a200341196a290000370000200641106a200341116a290000370000200641086a200341096a2900003700002004200741206a360200200041286a28020020011099040c0f0b200120044101106d2001280200200141086a220028020022046a41013a00002000200441016a2204360200200120044120106d2001280200200028020022066a22042003290001370000200441186a200341196a290000370000200441106a200341116a290000370000200441086a200341096a2900003700002000200641206a2204360200200120044120106d2001280200200028020022046a2201200341216a290000370000200141186a200341396a290000370000200141106a200341316a290000370000200141086a200341296a2900003700002000200441206a3602000c0e0b200120044101106d2001280200200141086a220628020022036a41023a00002006200341016a360200200041086a28020021032001200041106a280200220410a1010240024020040d00200628020021040c010b20044105742107200628020021040340200120044120106d20012802002006280200220a6a22042003290000370000200441186a200341186a290000370000200441106a200341106a290000370000200441086a200341086a2900003700002006200a41206a2204360200200341206a2103200741606a22070d000b0b20002f01062106200120044102106d2001280200200141086a220328020022046a20063b00002003200441026a220436020020002802142100200120044104106d2001280200200328020022016a20003600002003200141046a3602000c0d0b200120044101106d2001280200200141086a220028020022046a41033a00002000200441016a2204360200200120044120106d2001280200200028020022046a22012003290001370000200141186a200341196a290000370000200141106a200341116a290000370000200141086a200341096a2900003700002000200441206a3602000c0c0b200120044101106d2001280200200141086a220028020022046a41043a00002000200441016a2204360200200120044120106d2001280200200028020022066a22042003290001370000200441186a200341196a290000370000200441106a200341116a290000370000200441086a200341096a2900003700002000200641206a2204360200200120044120106d2001280200200028020022046a2201200341216a290000370000200141186a200341396a290000370000200141106a200341316a290000370000200141086a200341296a2900003700002000200441206a3602000c0b0b200120044101106d2001280200200141086a220028020022046a41053a00002000200441016a2204360200200120044120106d2001280200200028020022046a22012003290001370000200141186a200341196a290000370000200141106a200341116a290000370000200141086a200341096a2900003700002000200441206a3602000c0a0b200120044101106d2001280200200141086a220028020022046a41063a00002000200441016a2204360200200120044120106d2001280200200028020022046a22012003290001370000200141186a200341196a290000370000200141106a200341116a290000370000200141086a200341096a2900003700002000200441206a3602000c090b200120044101106d2001280200200141086a220128020022006a41073a00002001200041016a3602000c080b200120044101106d2001280200200141086a220028020022046a41083a00002000200441016a2204360200200120044120106d2001280200200028020022046a22012003290001370000200141186a200341196a290000370000200141106a200341116a290000370000200141086a200341096a2900003700002000200441206a3602000c070b2001200141086a22032802004101106d2001280200200328020022046a41103a00002003200441016a2206360200200041086a22032d0000417f6a2204410e4b0d0602400240024002400240024002400240024002400240024002400240024020040e0f000102030405060708090a0b0c0d0e000b200120064101106d2001280200200141086a220028020022046a41003a00002000200441016a2204360200200120044120106d2001280200200028020022046a22012003290001370000200141186a200341196a290000370000200141106a200341116a290000370000200141086a200341096a2900003700002000200441206a3602000c140b200120064101106d2001280200200141086a220328020022046a41013a00002003200441016a36020020012000410c6a10a9010c130b200120064101106d2001280200200141086a220328020022046a41023a00002003200441016a3602002000410c6a28020021042001200041146a280200220010a1012000450d122004200041c4006c6a210a0340200120032802004120106d2001280200200328020022066a22002004290000370000200041186a200441186a290000370000200041106a200441106a290000370000200041086a200441086a2900003700002003200641206a360200200241c8006a200441206a2206108501200228024821042001200328020020022802502200106d2001280200200328020022076a2004200010cf061a2003200720006a3602000240200228024c450d00200410260b200a200641246a2204470d000c130b0b200120064101106d2001280200200141086a220128020022006a41033a00002001200041016a3602000c110b200120064101106d2001280200200141086a220328020022046a41043a00002003200441016a2206360200200041106a210702400240024002402000410c6a280200220441c000490d00200441808001490d012004418080808004490d02200120064101106d2001280200200141086a220328020022046a41033a00002003200441016a2204360200200028020c2100200120044104106d2001280200200328020022046a20003600002003200441046a3602000c030b200120064101106d2001280200200328020022006a20044102743a00002003200041016a3602000c020b200120064102106d2001280200200141086a220028020022036a20044102744101723b00002000200341026a3602000c010b200120064104106d2001280200200141086a220028020022036a20044102744102723600002000200341046a3602000b20022007360248200241c8006a200110a7020c100b200120064101106d2001280200200141086a220328020022046a41053a00002003200441016a22043602002000410c6a2802002100200120044104106d2001280200200328020022016a20003600002003200141046a3602000c0f0b200120064101106d2001280200200141086a220328020022046a41063a00002003200441016a2206360200200041106a210702400240024002402000410c6a280200220441c000490d00200441808001490d012004418080808004490d02200120064101106d2001280200200141086a220328020022046a41033a00002003200441016a2204360200200028020c2100200120044104106d2001280200200328020022046a20003600002003200441046a3602000c030b200120064101106d2001280200200328020022006a20044102743a00002003200041016a3602000c020b200120064102106d2001280200200141086a220028020022036a20044102744101723b00002000200341026a3602000c010b200120064104106d2001280200200141086a220028020022036a20044102744102723600002000200341046a3602000b20022007360248200241c8006a200110a7020c0e0b200120064101106d2001280200200141086a220428020022066a41073a00002004200641016a220736020002400240024002402000412c6a280200220641c000490d00200641808001490d012006418080808004490d02200120074101106d2001280200200141086a220428020022066a41033a00002004200641016a2206360200200028022c2100200120064104106d2001280200200428020022066a20003600002004200641046a22003602000c030b200120074101106d2001280200200428020022006a20064102743a00002004200041016a22003602000c020b200120074102106d2001280200200141086a220428020022006a20064102744101723b00002004200041026a22003602000c010b200120074104106d2001280200200141086a220428020022006a20064102744102723600002004200041046a22003602000b200120004120106d2001280200200141086a220028020022046a22012003290001370000200141186a200341196a290000370000200141106a200341116a290000370000200141086a200341096a2900003700002000200441206a3602000c0d0b200120064101106d2001280200200141086a220328020022046a41083a00002003200441016a220636020002400240024002402000410c6a280200220441c000490d00200441808001490d012004418080808004490d02200120064101106d2001280200200141086a220328020022046a41033a00002003200441016a2204360200200028020c2106200120044104106d2001280200200328020022046a20063600002003200441046a22043602000c030b200120064101106d2001280200200328020022066a20044102743a00002003200641016a22043602000c020b200120064102106d2001280200200141086a220328020022066a20044102744101723b00002003200641026a22043602000c010b200120064104106d2001280200200141086a220328020022066a20044102744102723600002003200641046a22043602000b20002903102105200120044108106d2001280200200141086a220128020022006a20053700002001200041086a3602000c0c0b200120064101106d2001280200200141086a220428020022066a41093a00002004200641016a2207360200200041306a210a02400240024002402000412c6a280200220641c000490d00200641808001490d012006418080808004490d02200120074101106d2001280200200141086a220428020022066a41033a00002004200641016a2206360200200028022c2100200120064104106d2001280200200428020022066a20003600002004200641046a22003602000c030b200120074101106d2001280200200428020022006a20064102743a00002004200041016a22003602000c020b200120074102106d2001280200200141086a220428020022006a20064102744101723b00002004200041026a22003602000c010b200120074104106d2001280200200141086a220428020022006a20064102744102723600002004200041046a22003602000b200120004120106d2001280200200141086a220428020022066a22002003290001370000200041186a200341196a290000370000200041106a200341116a290000370000200041086a200341096a2900003700002004200641206a360200200a200110cb020c0b0b200120064101106d2001280200200141086a220028020022046a410a3a00002000200441016a2204360200200120044120106d2001280200200028020022046a22012003290001370000200141186a200341196a290000370000200141106a200341116a290000370000200141086a200341096a2900003700002000200441206a3602000c0a0b200120064101106d2001280200200141086a220428020022066a410b3a00002004200641016a2206360200200120064120106d2001280200200428020022076a22062003290001370000200641186a200341196a290000370000200641106a200341116a290000370000200641086a200341096a2900003700002004200741206a360200200241c8006a2000412c6a108501200228024821032001200428020020022802502200106d2001280200200428020022016a2003200010cf061a2004200120006a360200200228024c450d09200310260c090b200120064101106d2001280200200141086a220428020022066a410c3a00002004200641016a2206360200200120064120106d2001280200200428020022076a22062003290001370000200641186a200341196a290000370000200641106a200341116a290000370000200641086a200341096a2900003700002004200741206a360200200241c8006a2000412c6a108501200228024821032001200428020020022802502200106d2001280200200428020022016a2003200010cf061a2004200120006a360200200228024c450d08200310260c080b200120064101106d2001280200200141086a220028020022046a410d3a00002000200441016a2204360200200120044120106d2001280200200028020022046a22012003290001370000200141186a200341196a290000370000200141106a200341116a290000370000200141086a200341096a2900003700002000200441206a3602000c070b200120064101106d2001280200200141086a220128020022006a410e3a00002001200041016a3602000c060b2001200141086a22032802004101106d2001280200200328020022046a410f3a00002003200441016a220436020020002f0104417f6a220341014b0d050240024020030e020001000b200120044101106d2001280200200141086a220328020022046a41003a00002003200441016a360200200041086a28020021032001200041106a280200220010a1012000450d06200041b0026c2100034020032001109904200341b0026a2103200041d07d6a22000d000c070b0b200120044101106d2001280200200141086a220328020022046a41013a00002003200441016a220436020020002f01062106200120044102106d2001280200200328020022046a20063b00002003200441026a360200200041086a28020020011099040c050b2001200141086a22032802004101106d2001280200200328020022046a410e3a00002003200441016a220436020020002d0004417f6a220341064b0d04024002400240024002400240024020030e0700010203040506000b200120044101106d2001280200200141086a220328020022046a41003a00002003200441016a3602002001200041086a10a70120002d00052104200120032802004101106d2001280200200328020022066a20044101463a00002003200641016a3602002000410c6a280200200041146a2802002001109501200041186a280200200041206a28020020011095010c0a0b200120044101106d2001280200200141086a220328020022046a41013a00002003200441016a3602002001200041086a10a7010c090b200120044101106d2001280200200141086a220328020022046a41023a00002003200441016a2204360200200041086a2802002100200120044104106d2001280200200328020022016a20003600002003200141046a3602000c080b200120044101106d2001280200200141086a220328020022046a41033a00002003200441016a360200200041086a280200200041106a2802002001109501200041146a2802002000411c6a28020020011095010c070b200120044101106d2001280200200141086a220328020022046a41043a00002003200441016a3602002001200041c8006a10a701200120032802004120106d2001280200200328020022066a2204200041046a2200290001370000200441186a200041196a290000370000200441106a200041116a290000370000200441086a200041096a2900003700002003200641206a36020020022001360248200041216a200241c8006a109c010c060b200120044101106d2001280200200141086a220128020022006a41053a00002001200041016a3602000c050b200120044101106d2001280200200141086a220328020022046a41063a00002003200441016a3602002001200041086a10a7010c040b2001200141086a22002802004101106d2001280200200028020022036a410d3a00002000200341016a2203360200200120034101106d2001280200200028020022016a41003a00002000200141016a3602000c030b200120044101106d2001280200200141086a220328020022046a41033a00002003200441016a22043602002000410c6a2802002106200120044104106d2001280200200328020022046a20063600002003200441046a360200200041106a280200200041186a28020020011095010c020b200120044101106d2001280200200141086a220428020022066a41023a00002004200641016a22063602002000412c6a2802002107200120064104106d2001280200200428020022066a20073600002004200641046a2206360200200041306a2903002105200041386a290300210c200120064110106d2001280200200428020022006a2206200c370008200620053700002004200041106a2200360200200120004120106d2001280200200428020022006a22012003290001370000200141186a200341196a290000370000200141106a200341116a290000370000200141086a200341096a2900003700002004200041206a3602000c010b200120044101106d2001280200200141086a220328020022046a41013a00002003200441016a2204360200200120044120106d2001280200200328020022066a2204200041c4006a290000370000200441186a200041dc006a290000370000200441106a200041d4006a290000370000200441086a200041cc006a2900003700002003200641206a3602002001200041e4006a10ad012001200041c5016a10ad0120012000410c6a10ae01200041206a2802002104200120032802004104106d2001280200200328020022066a20043600002003200641046a36020020022001360248200041246a200241c8006a109c010b200241e0006a24000ba917030a7f017e027f23004180056b220224000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012802042203450d00200128020022042d0000210520012003417f6a22063602042001200441016a360200200541054b0d0720050e06010203040506010b200041073a00000c150b20064104490d082004280001210720012003417b6a22053602042001200441056a3602002005450d0920042d0005210520012003417a6a22063602042001200441066a2208360200200541014b0d09410021090240024020050e020100010b20064104490d0a2004280006210a2001200341766a220536020420012004410a6a36020020054104490d0a200428000a210b2001200341726a220636020420012004410e6a2208360200410121090b02402006450d0020082d0000210520012006417f6a3602042001200841016a360200200241d0026a200110b60220022802d0022101200241246a200241d0026a41047241ac0210cf061a0240024020014117460d00200241d0026a200241246a41ac0210cf061a41b002102422030d010c160b200041073a00000c160b20032001360200200341046a200241d0026a41ac0210cf061a200041146a2003360200200041106a200b3602002000410c6a200a360200200041086a2009360200200041046a2007360200200020053a0001200041013a0000200041186a2002290218370200200041206a200241186a41086a2802003602000c150b200041073a00000c140b20064104490d092004280001210620012003417b6a22053602042001200441056a360200024020054104490d00200428000521052001200341776a3602042001200441096a360200200041023a0000200020022f00243b0001200041086a2005360200200041046a20063602002000410c6a20022902d002370200200041036a200241246a41026a2d00003a0000200041146a200241d0026a41086a2902003702002000411c6a200241e0026a2902003702000c140b200041073a00000c130b20022001108f0120022802000d102001280204220520022802042203490d102003417f4c0d090240024020030d0041002104410121060c010b2003102a2206450d0e20012802042105200321040b0240024020052003490d0020062001280200200310cf0621052001280204220620034f0d012003200641b8afc0001048000b2004450d11200610260c110b2001200620036b3602042001200128020020036a3602002005450d102003ad4220862004ad84220ca7210302400240024002400240200128020422044104490d0020012802002206280000210a20012004417c6a22073602042001200641046a22063602002007450d0120062d0000210720012004417b6a22083602042001200641016a2209360200200741014b0d014100210d0240024020070e020100010b20084104490d022006280001210b2001200441776a22073602042001200641056a36020020074104490d022006280005210e2001200441736a22083602042001200641096a22093602004101210d0b2008450d0320092d0000210620012008417f6a3602042001200941016a360200200241d0026a200110b60220022802d0022101200241246a200241d0026a41047241ac0210cf061a20014117470d02200041073a00002003450d170c040b200041073a00002003450d16200510260c160b200041073a00002003450d15200510260c150b200241d0026a200241246a41ac0210cf061a41b00210242204450d1320042001360200200441046a200241d0026a41ac0210cf061a200020063a0001200041033a0000200041206a20043602002000411c6a200e360200200041186a200b360200200041146a200d360200200041106a200a3602002000410c6a200c422088a7360100200041086a2003360100200041046a2005360100200041026a20022f01183b01000c140b200041073a00002003450d130b200510260c120b200241086a2001108f0120022802080d0e20012802042205200228020c2203490d0e2003417f4c0d080240024020030d0041002104410121060c010b2003102a2206450d0d20012802042105200321040b0240024020052003490d0020062001280200200310cf0621052001280204220620034f0d012003200641b8afc0001048000b2004450d0f200610260c0f0b2001200620036b3602042001200128020020036a3602002005450d0e200041043a0000200020022f00243b0001200041086a2003ad4220862004ad84370000200041046a2005360000200041106a20022902d002370200200041036a200241266a2d00003a0000200041186a200241d0026a41086a290200370200200041206a200241d0026a41106a2802003602000c110b20064104490d082004280001210720012003417b6a22053602042001200441056a3602002005450d0920042d0005210520012003417a6a22063602042001200441066a2208360200200541014b0d09410021090240024020050e020100010b20064104490d0a2004280006210a2001200341766a220536020420012004410a6a36020020054104490d0a200428000a210b2001200341726a220636020420012004410e6a2208360200410121090b02402006450d0020082d0000210520012006417f6a3602042001200841016a360200200241d0026a200110b60220022802d0022101200241246a200241d0026a41047241ac0210cf061a20014117460d0b200241d0026a200241246a41ac0210cf061a41b00210242203450d1020032001360200200341046a200241d0026a41ac0210cf061a200041146a2003360200200041106a200b3602002000410c6a200a360200200041086a2009360200200041046a2007360200200020053a0001200041053a0000200041186a2002290218370200200041206a200241186a41086a2802003602000c110b200041073a00000c100b200241106a2001108f0120022802100d022001280204220520022802142203490d022003417f4c0d060240024020030d0041002104410121060c010b2003102a2206450d0b20012802042105200321040b024020052003490d0020062001280200200310cf0621052001280204220620034f0d022003200641b8afc0001048000b2004450d02200610260c020b200041073a00000c0e0b2001200620036b3602042001200128020020036a36020020050d090b200041073a00000c0c0b200041073a00000c0b0b200041073a00000c0a0b200041073a00000c090b1034000b200041073a00000c070b200041073a00000c060b200041073a00000c050b1033000b2003ad4220862004ad84220ca7210302400240024002400240200128020422044104490d0020012802002206280000210a20012004417c6a22073602042001200641046a22063602002007450d0120062d0000210720012004417b6a22083602042001200641016a2209360200200741014b0d014100210d0240024020070e020100010b20084104490d022006280001210b2001200441776a22073602042001200641056a36020020074104490d022006280005210e2001200441736a22083602042001200641096a22093602004101210d0b2008450d0320092d0000210620012008417f6a3602042001200941016a360200200241d0026a200110b60220022802d0022101200241246a200241d0026a41047241ac0210cf061a20014117470d02200041073a00002003450d080c040b200041073a00002003450d07200510260c070b200041073a00002003450d06200510260c060b200241d0026a200241246a41ac0210cf061a41b00210242204450d0420042001360200200441046a200241d0026a41ac0210cf061a200020063a0001200041063a0000200041206a20043602002000411c6a200e360200200041186a200b360200200041146a200d360200200041106a200a3602002000410c6a200c422088a7360100200041086a2003360100200041046a2005360100200041026a20022f01183b01000c050b200041073a00002003450d040b200510260c030b200041073a00000c020b200041073a00000c010b102c000b20024180056a24000bfe1704067f017e027f017e230041a0056b22022400024002400240024002400240024002400240024002400240024002400240024002400240024002400240200128020022032802042204450d00200328020022052d0000210620032004417f6a3602042003200541016a360200200641054b0d0720060e06010203040506010b200041073a00000c130b2001280200220328020422064104490d0820032802002204280000210520032006417c6a3602042003200441046a360200200241f0026a2001109c0420022802f0024102460d09200241386a41086a200241f0026a41086a280200360200200220022903f00237033802400240200128020022032802042206450d00200328020022042d0000210720032006417f6a3602042003200441016a3602002001200128020441016a2203360204200320012802084b0d01200241f0026a200110b40220022802f0022103200241c4006a200241f0026a41047241ac0210cf061a20034117460d01200241f0026a200241c4006a41ac0210cf061a41b00210242206450d1120062003360200200641046a200241f0026a41ac0210cf061a200241286a41086a200241386a41086a280200220336020020012001280204417f6a360204200220022903382208370328200041046a2005360200200020073a0001200041013a0000200041086a2008370200200041106a2003360200200041146a2006360200200041186a200229021c370200200041206a2002411c6a41086a2802003602000c140b200041073a00000c130b200041073a00000c120b024002402001280200220328020422064104490d0020032802002204280000210520032006417c6a3602042003200441046a3602002001280200220128020422034104490d0120012802002206280000210420012003417c6a3602042001200641046a360200200041023a0000200020022f00443b0001200041036a200241c4006a41026a2d00003a0000200041086a2004360200200041046a20053602002000410c6a20022902f002370200200041146a200241f0026a41086a2902003702002000411c6a20024180036a2902003702000c130b200041073a00000c120b200041073a00000c110b20022001108d0120022802000d0f20012802002206280204220420022802042203490d0f2003417f4c0d080240024020030d0041002105410121070c010b2003102a2207450d0c200128020022062802042104200321050b0240024020042003490d0020072006280200200310cf0621042006280204220720034f0d012003200741b8afc0001048000b2005450d10200710260c100b2006200720036b3602042006200628020020036a3602002004450d0f2003ad4220862005ad842208a72106024002402001280200220328020422054104490d0020032802002207280000210920032005417c6a3602042003200741046a360200200241f0026a2001109c0420022802f0024102470d01200041073a00002006450d12200410260c120b200041073a00002006450d11200410260c110b200241386a41086a200241f0026a41086a280200360200200220022903f00237033802400240200128020022032802042205450d00200328020022072d0000210a20032005417f6a3602042003200741016a3602002001200128020441016a2203360204200320012802084b0d01200241f0026a200110b40220022802f0022103200241c4006a200241f0026a41047241ac0210cf061a20034117460d01200241f0026a200241c4006a41ac0210cf061a41b00210242205450d0f20052003360200200541046a200241f0026a41ac0210cf061a200241286a41086a200241386a41086a280200220336020020012001280204417f6a36020420022002290338220b3703282000200a3a0001200041033a0000200041106a20093602002000410c6a2008422088a7360100200041086a2006360100200041046a2004360100200041026a20022f011c3b0100200041146a200b3702002000411c6a2003360200200041206a20053602000c120b200041073a00002006450d11200410260c110b200041073a00002006450d10200410260c100b200241086a2001108d0120022802080d0d200128020022062802042204200228020c2203490d0d2003417f4c0d070240024020030d0041002101410121050c010b2003102a2205450d0b200128020022062802042104200321010b0240024020042003490d0020052006280200200310cf0621042006280204220520034f0d012003200541b8afc0001048000b2001450d0e200510260c0e0b2006200520036b3602042006200628020020036a3602002004450d0d200041043a0000200020022f00443b0001200041086a2003ad4220862001ad84370000200041046a2004360000200041106a20022902f002370200200041036a200241c6006a2d00003a0000200041186a200241f0026a41086a290200370200200041206a200241f0026a41106a2802003602000c0f0b2001280200220328020422064104490d0720032802002204280000210520032006417c6a3602042003200441046a360200200241f0026a2001109c0420022802f0024102460d08200241386a41086a200241f0026a41086a280200360200200220022903f00237033802400240200128020022032802042206450d00200328020022042d0000210720032006417f6a3602042003200441016a3602002001200128020441016a2203360204200320012802084b0d01200241f0026a200110b40220022802f0022103200241c4006a200241f0026a41047241ac0210cf061a20034117460d01200241f0026a200241c4006a41ac0210cf061a41b00210242206450d0d20062003360200200641046a200241f0026a41ac0210cf061a200241286a41086a200241386a41086a280200220336020020012001280204417f6a360204200220022903382208370328200041046a2005360200200020073a0001200041053a0000200041086a2008370200200041106a2003360200200041146a2006360200200041186a200229021c370200200041206a2002411c6a41086a2802003602000c100b200041073a00000c0f0b200041073a00000c0e0b200241106a2001108d0120022802100d0220012802002206280204220420022802142203490d022003417f4c0d050240024020030d0041002105410121070c010b2003102a2207450d09200128020022062802042104200321050b024020042003490d0020072006280200200310cf0621042006280204220720034f0d022003200741b8afc0001048000b2005450d02200710260c020b200041073a00000c0c0b2006200720036b3602042006200628020020036a36020020040d070b200041073a00000c0a0b200041073a00000c090b200041073a00000c080b1034000b200041073a00000c060b200041073a00000c050b1033000b2003ad4220862005ad842208a72106024002402001280200220328020422054104490d0020032802002207280000210920032005417c6a3602042003200741046a360200200241f0026a2001109c0420022802f0024102470d01200041073a00002006450d05200410260c050b200041073a00002006450d04200410260c040b200241386a41086a200241f0026a41086a280200360200200220022903f00237033802400240200128020022032802042205450d00200328020022072d0000210a20032005417f6a3602042003200741016a3602002001200128020441016a2203360204200320012802084b0d01200241f0026a200110b40220022802f0022103200241c4006a200241f0026a41047241ac0210cf061a20034117460d01200241f0026a200241c4006a41ac0210cf061a41b00210242205450d0220052003360200200541046a200241f0026a41ac0210cf061a200241286a41086a200241386a41086a280200220336020020012001280204417f6a36020420022002290338220b3703282000200a3a0001200041063a0000200041106a20093602002000410c6a2008422088a7360100200041086a2006360100200041046a2004360100200041026a20022f011c3b0100200041146a200b3702002000411c6a2003360200200041206a20053602000c050b200041073a00002006450d04200410260c040b200041073a00002006450d03200410260c030b102c000b200041073a00000c010b200041073a00000b200241a0056a24000bea0101047f0240024002400240200128020022022802042203450d00200228020022042d0000210520022003417f6a3602042002200441016a360200200541014b0d0120050e020203020b200041023602000f0b200041023602000f0b200041003602000f0b02402001280200220228020422054104490d0020022802002203280000210420022005417c6a3602042002200341046a3602002001280200220228020422014104490d00200020043602042000410136020020022802002205280000210320022001417c6a3602042002200541046a360200200041086a20033602000f0b200041023602000bd11303067f017e067f230041d0036b2202240002400240024002400240024020012802042203450d00200128020022042d0000210520012003417f6a22063602042001200441016a3602002005417f6a220541024b0d0420050e03010203010b200042033703000c040b024020064104490d002004280001210720012003417b6a22053602042001200441056a36020020054108490d00200429000521082001200341736a220936020420012004410d6a36020041002105200241003a0028200341726a21030240034020092005460d01200241086a20056a200420056a2206410d6a2d00003a00002001200336020420012006410e6a3602002002200541016a22063a00282003417f6a21032006210520064120470d000b20024190036a41086a2205200241086a41086a29030037030020024190036a41106a2203200241086a41106a29030037030020024190036a41186a2209200241086a41186a2903003703002002200229030837039003410121040240200641ff01714120490d00200241f0026a41186a2009290300370300200241f0026a41106a2003290300370300200241f0026a41086a200529030037030020022002290390033703f002410021040b200241b0026a41086a200241f0026a41086a290300370300200241b0026a41106a200241f0026a41106a290300370300200241b0026a41186a200241f0026a41186a290300370300200220022903f0023703b00220040d01200241f0016a41086a2204200241b0026a41086a290300370300200241f0016a41106a2205200241b0026a41106a290300370300200241f0016a41186a2203200241b0026a41186a290300370300200220022903b0023703f001200241086a2001109e0420022d00084101460d01200241a8016a2201200241c1006a290000370300200241a0016a2206200241396a29000037030020024198016a2209200241316a29000037030020024190016a220a200241296a290000370300200241f0006a41186a220b200241216a290000370300200241f0006a41106a220c200241196a290000370300200241f0006a41086a220d200241116a290000370300200241d0016a41086a220e2004290300370300200241d0016a41106a22042005290300370300200241d0016a41186a2205200329030037030020022002290009370370200220022903f0013703d001200241b0016a41186a22032005290300370300200241b0016a41106a22052004290300370300200241b0016a41086a2204200e290300370300200220022903d0013703b001200041106a20073602002000200837030820004200370300200020022903b0013702142000411c6a2004290300370200200041246a20052903003702002000412c6a2003290300370200200020022903703702342000413c6a200d290300370200200041c4006a200c290300370200200041cc006a200b290300370200200041d4006a200a290300370200200041dc006a2009290300370200200041e4006a2006290300370200200041ec006a20012903003702000c050b0240200541ff0171450d00200241003a00280b200241b0026a41086a200241f0026a41086a290300370300200241b0026a41106a200241f0026a41106a290300370300200241b0026a41186a200241f0026a41186a290300370300200220022903f0023703b0020b200042033703000c030b024020064104490d002004280001210620012003417b6a22053602042001200441056a36020020054108490d0020004201370300200429000521082001200341736a36020420012004410d6a360200200041106a200636020020002008370308200041146a200241086a41e40010cf061a0c030b200042033703000c020b024020064104490d002004280001210720012003417b6a22053602042001200441056a36020020054108490d00200429000521082001200341736a220936020420012004410d6a36020041002105200241003a0028200341726a21030240034020092005460d01200241086a20056a200420056a2206410d6a2d00003a00002001200336020420012006410e6a3602002002200541016a22063a00282003417f6a21032006210520064120470d000b20024190036a41086a2205200241086a41086a29030037030020024190036a41106a2203200241086a41106a29030037030020024190036a41186a2209200241086a41186a2903003703002002200229030837039003410121040240200641ff01714120490d00200241f0026a41186a2009290300370300200241f0026a41106a2003290300370300200241f0026a41086a200529030037030020022002290390033703f002410021040b200241b0026a41086a200241f0026a41086a290300370300200241b0026a41106a200241f0026a41106a290300370300200241b0026a41186a200241f0026a41186a290300370300200220022903f0023703b00220040d01200241f0016a41086a2204200241b0026a41086a290300370300200241f0016a41106a2205200241b0026a41106a290300370300200241f0016a41186a2203200241b0026a41186a290300370300200220022903b0023703f001200241086a2001109e0420022d00084101460d01200241a8016a2201200241c1006a290000370300200241a0016a2206200241396a29000037030020024198016a2209200241316a29000037030020024190016a220a200241296a290000370300200241f0006a41186a220b200241216a290000370300200241f0006a41106a220c200241196a290000370300200241f0006a41086a220d200241116a290000370300200241d0016a41086a220e2004290300370300200241d0016a41106a22042005290300370300200241d0016a41186a2205200329030037030020022002290009370370200220022903f0013703d001200241b0016a41186a22032005290300370300200241b0016a41106a22052004290300370300200241b0016a41086a2204200e290300370300200220022903d0013703b001200041106a20073602002000200837030820004202370300200020022903b0013702142000411c6a2004290300370200200041246a20052903003702002000412c6a2003290300370200200020022903703702342000413c6a200d290300370200200041c4006a200c290300370200200041cc006a200b290300370200200041d4006a200a290300370200200041dc006a2009290300370200200041e4006a2006290300370200200041ec006a20012903003702000c030b0240200541ff0171450d00200241003a00280b200241b0026a41086a200241f0026a41086a290300370300200241b0026a41106a200241f0026a41106a290300370300200241b0026a41186a200241f0026a41186a290300370300200220022903f0023703b0020b200042033703000c010b200042033703000b200241d0036a24000bd211010b7f230041b0036b2202240020024180016a200110dc01200241c0006a41086a220120024189016a290000370300200241c0006a41106a220320024191016a290000370300200241c0006a41186a220420024199016a290000370300200241c0006a41206a2205200241a1016a290000370300200241c0006a41286a2206200241a9016a290000370300200241c0006a41306a2207200241b1016a290000370300200241c0006a41386a2208200241b9016a2900003703002002200229008101370340024002400240024020022d0080014101460d00200241386a22092008290300370300200241306a22082007290300370300200241286a22072006290300370300200241206a22062005290300370300200241186a22052004290300370300200241106a220a2003290300370300200241086a220b20012903003703002002200229034037030020024198026a41186a200929030037030020024198026a41106a200829030037030020024198026a41086a20072903003703002002200629030037039802200420052903003703002003200a2903003703002001200b2903003703002002200229030037034020024180016a200241c0006a106a0240024020022d0080014101460d0020024190036a410f6a200241c0006a410f6a29000037000020024190036a41086a200241c0006a41086a290000370300200220022900403703900341012101410221050c010b200241ae036a20022d0083013a000020024198036a2002418d016a2900003703002002419f036a20024194016a2900003700002002418c036a200241a0016a2d00003a0000200220022f0081013b01ac0320022002290085013703900320022002419c016a280200360288034100210120022d00840121050b20024184036a41026a2206200241ac036a41026a2d00003a0000200241e8026a41086a220320024190036a41086a290300370300200241e8026a410f6a220420024190036a410f6a290000370000200241e0026a41046a220720024188036a41046a2d00003a0000200220022f01ac033b01840320022002290390033703e80220022002280288033602e00220010d01200241dc026a41026a20062d00003a0000200241c0026a41086a2003290300370300200241c0026a410f6a2004290000370000200241b8026a41046a20072d00003a0000200220022f0184033b01dc02200220022903e8023703c002200220022802e0023602b802200241c0006a41186a20024198026a41186a290300370300200241c0006a41106a20024198026a41106a290300370300200241c0006a41086a20024198026a41086a290300370300200220022903980237034020024180016a200241c0006a106a410121010240024020022d0080014101460d0020024190036a410f6a200241c0006a410f6a29000037000020024190036a41086a200241c0006a41086a2900003703002002200229004037039003410221030c010b200241ae036a20022d0083013a000020024198036a2002418d016a2900003703002002419f036a20024194016a2900003700002002418c036a200241a0016a2d00003a0000200220022f0081013b01ac0320022002290085013703900320022002419c016a280200360288034100210120022d00840121030b20024184036a41026a2207200241ac036a41026a22082d00003a0000200241e8026a41086a220420024190036a41086a2209290300370300200241e8026a410f6a220620024190036a410f6a220a290000370000200241e0026a41046a220b20024188036a41046a220c2d00003a0000200220022f01ac033b01840320022002290390033703e80220022002280288033602e00202402001450d0020024180016a410f6a200629000037000020024180016a41086a2004290300370300200220022903e8023703800141012101200321050c030b20024194026a41026a20072d00003a000020092004290300370300200a2006290000370000200c200b2d00003a00002008200241dc026a41026a2d00003a0000200220022f0184033b019402200220022903e80237039003200220022802e00236028803200220022f01dc023b01ac0320024180016a410f6a2201200241c0026a410f6a29000037000020024180016a41086a2204200241c0026a41086a290300370300200220022903c00237038001200241e8026a41046a200241b8026a41046a2d00003a0000200220022802b8023602e802200241c0006a410f6a2001290000370000200241c0006a41086a20042903003703002002200229038001370340410021010c020b200041013a00000c020b20024180016a410f6a200429000037000020024180016a41086a2003290300370300200220022903e80237038001410121010b20024190026a41026a2204200241ac036a41026a2d00003a0000200241f8016a41086a2206200241c0006a41086a290300370300200241f8016a410f6a2207200241c0006a410f6a290000370000200241f0016a41046a2208200241e8026a41046a2d00003a0000200241ec016a41026a220920024194026a41026a2d00003a0000200220022f01ac033b019002200220022903403703f801200220022802e8023602f001200220022f0194023b01ec01200241d0016a410f6a220a20024190036a410f6a290000370000200241d0016a41086a220b20024190036a41086a290300370300200241c8016a41046a220c20024188036a41046a2d00003a000020022002290390033703d00120022002280288033602c801024020010d00200020022f0190023b0001200041046a20053a0000200041056a20022903f8013700002000411c6a20022802f001360000200041216a20022f01ec013b0000200041036a20042d00003a00002000410d6a2006290300370000200041146a2007290000370000200041206a20082d00003a0000200041236a20092d00003a0000200041246a20033a0000200041003a0000200041256a20022903d0013700002000412d6a200b290300370000200041346a200a2900003700002000413c6a20022802c801360000200041c0006a200c2d00003a00000c010b200041013a00000b200241b0036a24000bd40302037f027e024020002d0000220241024b0d0002400240024020020e03000102000b2001200141086a22022802004101106d2001280200200228020022036a41003a00002002200341016a2203360200200120034120106d2001280200200228020022046a22032000290001370000200341186a200041196a290000370000200341106a200041116a290000370000200341086a200041096a2900003700002002200441206a2203360200200041c8006a2903002105200041d0006a2903002106200120034110106d2001280200200228020022036a22042006370008200420053700002002200341106a2203360200200120034120106d2001280200200228020022036a2201200041216a290000370000200141186a200041396a290000370000200141106a200041316a290000370000200141086a200041296a2900003700002002200341206a3602000f0b2001200141086a22022802004101106d2001280200200228020022036a41013a00002002200341016a360200200041046a2802002000410c6a28020020011095010f0b2001200141086a22022802004101106d2001280200200228020022036a41023a00002002200341016a360200200041046a2802002000410c6a28020020011095010b0b0d00200141a3f3c600410210490b1300200041033602042000419488c4003602000b130020004103360204200041bc8ac4003602000b130020004108360204200041908cc4003602000bee1907047f017e027f047e0a7f017e027f23002202210320024180036b41607122022400200241c0006a200110a50420022802402104200220022802482205360294012002200436029001200241c0016a200420051082020240024020022802c00122050d00420021060c010b20022802c4012107024002400240200241c8016a28020022084110490d0020084170714110460d002008417c714120470d010b200241003602e801200242013703e0012002410e3602ac01200220024190016a3602a8012002200241e0016a36026820024194026a410136020020024201370284022002418c8dc600360280022002200241a8016a36029002200241e8006a41c4e1c00020024180026a10351a20022802e00120022802e801108402024020022802e401450d0020022802e00110260b420021060c010b200541186a2900002109200541086a290000210a2005290010210b2005290000210c20052800202108420121060b2007450d00200510260b02402002280244450d00200410260b02402006500d0020024198026a2204420037030020024190026a2205420037030020024180026a41086a220742003703002002420037038002200241e0016a41808cc700410610fb012007200241e0016a41086a220d290000370300200220022900e00137038002200241e0016a41ea93c400410610fb012004200d290000370300200520022900e001370300200241286a20024180026a4120108902200241086a200942004100200228022c410020022802281b220420086b2205200520044b1bad2206420010cc06200241186a20064200200b420010cc060240024002400240024002402002290310420052200241186a41086a290300220b20022903087c2206200b54720d00200c2002290318220b56200a200656200a2006511b450d00200242f6cacda397cddbb32037033820024200200a20067d200c200b54ad7d2206200c200b7d220b200c562006200a562006200a511b22041b220937034820024200200b20041b220b3703404101210e200241013a0058200242f6cacda397cddbb32037035020024180026a200110a604200241e0016a200228028002220520022802880210a70420022902e401420020022802e00122041b21060240200228028402450d00200510260b2004410820041b210f2006a721100240024002402006422088a72211450d00200f201141057422046a2112200441606a2107200241e0016a4119722108200241c0016a41197221134101210e2002290338210a200f21040340200241a8016a41106a220d200441106a290300370300200241a8016a41086a2214200441086a290300370300200220042903003703a801200441186a2d000021052002200441196a28000036027820022004411c6a28000036007b20054103460d0120082002280278360000200841036a200228007b3600002002200d29030022063703f001200220142903003703e801200220022903a8013703e001200220053a00f801024002402006200a510d00200220022903f80122063703d801200220022903f0013703d001200220022903e8013703c801200220022903e0013703c0012006a721050c010b200241033a0098022002200229035822063703d801200220022903503703d001200220022903483703c801200220022903403703c0012002200229039002370350200220022903880237034820022002290380023703402002200229039802220c3703582006a72105200ca7210e0b200541ff01714103470d02200741606a2107200441206a22042012470d000b0b20024100360288022002420837038002201041ffffff3f71450d01200f10260c010b20024190016a41106a220820022903d00137030020024190016a41086a220d20022903c80137030020022013280000360280012002201341036a28000036008301200220022903c00137039001200220022802800136028801200220022800830136008b01412010242214450d022014200229039001370300201420053a001820142002280288013600192014411c6a200228008b01360000201441106a2008290300370300201441086a200d290300370300200242818080801037026c2002201436026802402007450d00200441206a21072011410574200f6a41606a2115200241e0016a4119722108200241c0016a4119722113410121110340200721040340200241a8016a41106a2207200441106a290300370300200241a8016a41086a220d200441086a290300370300200220042903003703a801200441186a2d000021052002200441196a28000036027820022004411c6a28000036007b20054103460d0220082002280278360000200841036a200228007b3600002002200729030022063703f0012002200d2903003703e801200220022903a8013703e001200220053a00f8010240024020062002290338510d00200220022903f80122063703d801200220022903f0013703d001200220022903e8013703c801200220022903e0013703c0012006a721050c010b200241033a0098022002200229035822063703d801200220022903503703d001200220022903483703c801200220022903403703c0012002200229039002370350200220022903880237034820022002290380023703402002200229039802220a3703582006a72105200aa7210e0b0240200541ff01714103470d00200441206a22042012470d010c030b0b20024190016a41106a220720022903d00137030020024190016a41086a220d20022903c80137030020022013280000360280012002201341036a28000036008301200220022903c00137039001200220022802800136028801200220022800830136008b0120024180026a41086a2216200d29030037030020024180026a41106a220d200729030037030020022002290390013703800220022002280288013602e0012002200228008b013600e30102402011200228026c470d00200241e8006a201110ed01200228026821140b200441206a210720162903002106200d290300210a200229038002210c201420114105746a220d20053a0018200d200c370300200d20022802e001360019200d411c6a20022800e301360000200d41106a200a370300200d41086a20063703002002201141016a221136027020152004470d000b0b0240201041ffffff3f71450d00200f10260b20024180026a41086a200241e8006a41086a28020036020020022002290368370380020b02400240200e41ff01714103470d00200228028002210420022802880221050c010b200229035821062002290350210a2002290348210c2002290340211702402002280288022205200228028402470d0020024180026a200510ed0120022802880221050b200228028002220420054105746a2208200a3703102008200c37030820082017370300200841186a20063703002002200541016a2205360288020b20012004200510a804024020022802840241ffffff3f71450d00200410260b200241b8026a2009370300200241b0026a200b37030020024180026a41086a41003a000020024189026a200129000037000020024191026a200141086a29000037000020024199026a200141106a290000370000200241a1026a200141186a2900003700002002410b3a00800220024180026a1087020c050b200242f6cacda397cddbb32037033020024180026a200110a604200241e0016a200228028002220520022802880210a70420022902e401420020022802e00122041b210b0240200228028402450d00200510260b2004410820041b2118200b422088a72207450d03200241206a2112410021052018210441002108034002400240024020122004460d00200441106a22142900002002290330510d0020050d01410021050c020b200541016a21050c010b200820056b220d20074f0d0320024180026a41186a220e200420054105746b220d41186a220f29030037030020024180026a41106a2210200d41106a221129030037030020024180026a41086a2213200d41086a22152903003703002002200d29030037038002200441086a221629030021062014290300210a200441186a2219290300210c200d2004290300370300200f200c3703002011200a370300201520063703002019200e290300370300201420102903003703002016201329030037030020042002290380023703000b200441206a21042007200841016a2208460d030c000b0b1033000b200d20074198e2c4001032000b2005417f6a20074f0d00200b42ffffffff0f83210b200720056b21070b20012018200710a8040240200b42ffffff3f83500d00201810260b20024180026a200110a504200228028002220420022802880210ff010240200228028402450d00200410260b20024180026a41086a41013a000020024189026a200129000037000020024191026a200141086a29000037000020024199026a200141106a290000370000200241a1026a200141186a2900003700002002410b3a00800220024180026a1087020b200041043a0000200324000f0b2000410110ea02200324000b8d0401057f230041e0006b22022400200241a18dc700410710fb01200241106a41a18dc700410710fb0102400240412010242203450d002002422037023420022003360230200241306a41004120106d20022802302203200228023822046a22052001290000370000200541086a200141086a290000370000200541106a200141106a290000370000200541186a200141186a2900003700002002200441206a2201360238200241c0006a2003200110bc02200241dc006a200320016a360200200220033602582002200241c0006a41106a3602542002200241c0006a360250200241206a200241d0006a107302402002280234450d00200310260b2002280228220341206a2205417f4c0d010240024020050d0041012101410021050c010b200510242201450d010b20002001360200200041086a220141003602002000200536020420004100411010c9012000280200200128020022056a220420022900003700002001200541106a2205360200200441086a200241086a29000037000020002005411010c9012000280200200128020022056a220420022900103700002001200541106a2206360200200441086a200241106a41086a2900003700002002280220210520002006200310c9012000280200200128020022006a2005200310cf061a2001200020036a36020002402002280224450d00200510260b200241e0006a24000f0b1033000b1034000b8d0401057f230041e0006b220224002002419a8cc700410810fb01200241106a41a8dec300410510fb0102400240412010242203450d002002422037023420022003360230200241306a41004120106d20022802302203200228023822046a22052001290000370000200541086a200141086a290000370000200541106a200141106a290000370000200541186a200141186a2900003700002002200441206a2201360238200241c0006a2003200110bc02200241dc006a200320016a360200200220033602582002200241c0006a41106a3602542002200241c0006a360250200241206a200241d0006a107302402002280234450d00200310260b2002280228220341206a2205417f4c0d010240024020050d0041012101410021050c010b200510242201450d010b20002001360200200041086a220141003602002000200536020420004100411010c9012000280200200128020022056a220420022900003700002001200541106a2205360200200441086a200241086a29000037000020002005411010c9012000280200200128020022056a220420022900103700002001200541106a2206360200200441086a200241106a41086a2900003700002002280220210520002006200310c9012000280200200128020022006a2005200310cf061a2001200020036a36020002402002280224450d00200510260b200241e0006a24000f0b1033000b1034000b800604067f017e037f027e230041f0006b220324002003200236020c20032001360208200341106a2001200210820202400240200328021022040d00200041003602000c010b200328021421052003200341186a280200360224200320043602202003200341206a108f010240024020032802000d000240024002402003280204220620032802244105762201200120064b1b22014105742202417f4c0d000240024020010d00410821070c010b200210242207450d020b41002102200341003602602003200136025c2003200736025802402006450d002003413b6a21080340200341286a200341206a10d80420032d00284101460d04200328022422014110490d04200329002921092003200141706a220a36022420032003280220220b41106a220c360220200a450d04200b41086a290000210d200b290000210e20032001416f6a3602242003200c41016a360220200c2d0000220141024b0d044100210b02400240024020010e03020001020b4101210b0c010b4102210b0b20032003280038360250200320082800003600532003200328005336004b20032003280250360248200320032802483602402003200328004b36004302402002200328025c470d00200341d8006a200210ed0120032802582107200328026021020b200720024105746a2201200b3a001820012009370310200120032802403600192001411c6a20032800433600002001200d3703082001200e3703002003200241016a22023602602006417f6a22060d000b0b2007450d032000200329025c370204200020073602000c040b1034000b1033000b200328025c41ffffff3f71450d00200710260b20034100360230200342013703282003410e36023c2003200341086a3602382003200341286a360250200341ec006a41013602002003420137025c2003418c8dc6003602582003200341386a360268200341d0006a41c4e1c000200341d8006a10351a200328022820032802301084020240200328022c450d00200328022810260b200041003602000b2005450d00200410260b200341f0006a24000bdd0e0b037f027e017f047e027f037e027f027e017f017e017f230041d0026b22032400200341206a200010d803200341306a200328022022042003280228220510d903200329033021064200210720034200370330200341306a41186a2903004200200642015122081b21092003290340420020081b210a2003290338420020081b210b200341306a41206a290300420020081b210c200341f8006a280200210d20032d007c210e0240024020020d004200210f42002110420021110c010b20024105742112420021074200210f4200211042002111200121080340024002400240200841186a2d00002213417f6a41ff017141014b0d002011200841086a290300221420102008290300221556201120145620112014511b22161b21112010201520161b2110201341ff01714102460d010c020b201341ff01710d01200841086a2903002114200829030021150b200f20142007201556200f201456200f2014511b22131b210f2007201520131b21070b200841206a2108201241606a22120d000b0b200341b8016a200f370300200341a8016a221220113703002003200b37038001200320073703b001200320103703a0012003200c370398012003200a37038801200320093703900102400240427f200b20097c22142014200b542208200a200c7c2008ad7c2214200a542014200a511b22081b22114280c8afa025544100427f201420081b2215501b0d0020034190016a2903002111200341b0016a290300211520122903002110200341a0016a29030021072003290388012109200329038001210c4201211420032903980121170c010b024002402009200b84200c200a848450450d00420021140c010b42002114200341d0016a41186a22124200370300200341d0016a41106a22134200370300200341d0016a41086a22084200370300200342003703d001200341c0016a419a8cc700410810fb012008200341c0016a41086a2216290000370300200320032900c0013703d001200341c0016a41b8a1c300410d10fb0120122016290000370300201320032900c001370300200341086a200341d0016a108d02200341086a41106a29030021102003290310210720032802082118201242003703002013420037030020084200370300200342003703d001200341c0016a419a8cc700410810fb0120082016290000370300200320032900c0013703d001200341c0016a41b8a1c300410d10fb0120122016290000370300201320032900c001370300200342002010420020181b221020157d2007420020181b2207201154ad7d2209200720117d220c200756200920105620092010511b22121b3703c80120034200200c20121b3703c001200341d0016a4120200341c0016a411010b30120034188026a201537030020034180026a2011370300200841013a0000200341d9016a2000290000370000200341e1016a200041086a290000370000200341e9016a200041106a290000370000200341f1016a200041186a290000370000200341023a00d001200341d0016a1087020b0b200341d8006a2007370300200341f0006a200f370300200341e0006a2010370300200341c0006a2009370300200341e8006a2015370300200341c8006a2011370300200320173703502003200c3703382003200e4100200642015122081b3a007c2003200d410020081b360278200320144201512208ad3703300240024020080d002004200510ff010c010b20042005200341386a10da030b02402003280224450d00200410260b20144201522108024002400240200642015122120d002008450d010b2012200871450d01200341d0016a41086a41043a0000200341d9016a2000290000370000200341e1016a200041086a290000370000200341e9016a200041106a290000370000200341f1016a200041186a290000370000200341003a00d001200341d0016a1087020c010b200341d0016a41086a41033a0000200341d9016a2000290000370000200341e1016a200041086a290000370000200341e9016a200041106a290000370000200341f1016a200041186a290000370000200341003a00d001200341d0016a1087020b024020064201510d0020034188026a200a37030020034180026a200b370300200341d0016a41086a41003a0000200341d9016a2000290000370000200341e1016a200041086a290000370000200341e9016a200041106a290000370000200341f1016a200041186a290000370000200341023a00d001200341d0016a1087020b200341d0016a200010a604200320032802d001221220032802d80141d4c0c7004100410010810220032802002108024020032802d401450d00201210260b024002402002450d00200341306a200010a6042003280238211320032802302112200341d0016a200120021091042012201320032802d001221620032802d80110b301024020032802d401450d00201610260b02402003280234450d00201210260b20084101460d01200010d4030c010b200341d0016a200010a60420032802d001221220032802d80110ff01024020032802d401450d00201210260b20084101470d00200010d6030b200341d0026a24000bb20301057f230041c0006b220724000240024002402002200384500d00200741106a200110a504200741086a20072802102208200728021841d4c0c700410041001081022007280208210902402007280214450d00200810260b20094101470d012000410210ea020c020b200041043a00000c010b200741306a200110a5042007280238210a200728023021092007410036021820074201370310200741106a41004110106d2007280210200728021822086a220b2003370008200b20023700002007200841106a2208360218200741106a20084110106d2007280210200728021822086a220b2005370008200b20043700002007200841106a2208360218200741106a20084104106d200728021022082007280218220b6a20063600002007200b41046a22063602182009200a2008200610b30102402007280214450d00200810260b02402007280234450d00200910260b200741106a41186a200141186a290000370300200741106a41106a200141106a290000370300200741106a41086a200141086a29000037030020072001290000370310200741306a200741106a10a404200041043a00000b200741c0006a24000b990501047f230041a0036b22092400200941306a220a4200370300200941286a220b4200370300200941186a41086a420037030020094200370318200941186a41808cc700410610fb0120094188036a41ea93c400410610fb01200a20094188036a41086a290000370300200b200929008803370300200941106a200941186a41201089024100210c02400240417f2009280214410020092802101b220a20026a220b200b200a491b200220011b2202200a4d0d00024020034101470d002004410047200541014b71210c2005417f6a210a0b200941186a200841b00210cf061a200941dc026a200a36020020094184036a20063a0000200941e0026a2007290200370300200941e8026a200741086a290200370300200941f0026a200741106a290200370300200941f8026a200741186a29020037030020094180036a200741206a280200360200200920043602d8022009200c3602d40241002107200941003602c8022002200941186a10e203200941186a200210dd03200928022021082009280218210a2009419c036a41003a00002009410036029803200941086a200a200820094198036a41054100108102024002402009280208450d002009200928020c2207410520074105491b36028c03200920094198036a36028803200920094188036a108f012009280204417f6a210820092802004521070c010b0b0240200928021c450d00200a10260b200941186a41086a20023602002009410c3a0018200941186a410c6a2008410020071b22073602002009410036021c200941186a108702200041086a200736020020002002360204200041003602000c010b200041023a0006200041832c3b0104200041013602002000410c6a4117360200200041086a4193edc30036020020081098030b200941a0036a24000be30201077f230041306b22022400200241a88dc700410910fb01200241106a41aca1c300410610fb01200241206a20012802002203200128020810fd02024002402002280228220441206a2205417f4c0d000240024020050d0041012106410021050c010b200510242206450d020b20002006360200200041086a220641003602002000200536020420004100411010c9012000280200200628020022056a220720022900003700002006200541106a2205360200200741086a200241086a29000037000020002005411010c9012000280200200628020022056a220720022900103700002006200541106a2208360200200741086a200241106a41086a2900003700002002280220210520002008200410c9012000280200200628020022006a2005200410cf061a2006200020046a36020002402002280224450d00200510260b0240200141046a280200450d00200310260b200241306a24000f0b1034000b1033000bbc0701047f230041e0056b220a2400200a41e0026a200110e003200a41186a200a2802e002220b200a2802e80241d4c0c70041004100108102200a280218210c0240200a2802e402450d00200b10260b024002400240024002400240200c4101460d00200a41f8026a220c4200370300200a41f0026a220b4200370300200a41e0026a41086a4200370300200a42003703e002200a41e0026a41808cc700410610fb01200a41206a41ea93c400410610fb01200c200a41206a41086a290000370300200b200a290020370300200a41106a200a41e0026a41201089024100210d417f200a2802144100200a2802101b220b20036a220c200c200b491b200320021b220c200b4d0d03024020044101470d002005410047200641014b71210d2006417f6a21030b200a41e0026a200110c801200a41206a200941b00210cf061a200a41d8026a200a41e0026a41086a280200360200200a200a2903e0023703d002200a41e0026a200a41206a41bc0210cf061a200a41a4056a2003360200200a41a0056a2005360200200a41b0056a200841086a290200370300200a41b8056a200841106a290200370300200a41c0056a200841186a290200370300200a41c8056a200841206a280200360200200a200d36029c05200a20073a00cc05200a20082902003703a805200c200a41e0026a10e203200a41e0026a200c10dd03200a2802e8022103200a2802e002210841002109200a41d4056a41003a0000200a41003602d005200a41086a20082003200a41d0056a41054100108102200a280208450d01200a200a28020c2209410520094105491b3602dc05200a200a41d0056a3602d805200a200a41d8056a108f01200a280204417f6a2103200a2802004521090c020b200041003a0006200041832c3b0104200041013602002000410c6a4110360200200041086a4183edc3003602000c030b0b0240200a2802e402450d00200810260b200a2003410020091b22083602dc05200a200c3602d805200a41e0026a200110e003200a2802e0022209200a2802e802200a41d8056a10ad040240200a2802e402450d00200910260b200a41e0026a41086a200c360200200a410c3a00e002200a41e0026a410c6a2008360200200a41003602e402200a41e0026a108702200041086a20083602002000200c36020420004100360200200141046a280200450d02200128020010260c020b200041023a0006200041832c3b0104200041013602002000410c6a4117360200200041086a4193edc3003602000b2009109803200141046a280200450d00200128020010260b200a41e0056a24000ba80101037f230041106b220324000240410810242204450d00200342083702042003200436020020022802002104200341004104106d2003280200200328020822056a20043600002003200541046a220436020820022802042105200320044104106d20032802002202200328020822046a20053600002003200441046a2204360208200020012002200410b30102402003280204450d00200210260b200341106a24000f0b1033000bb40601047f20002d000021022001200141086a22032802004101106d2001280200200328020022046a21050240024020024101460d00200541003a00002003200441016a220236020020002d0001220341094b0d01024002400240024002400240024002400240024020030e0a00010203040506070809000b200120024101106d2001280200200141086a220128020022006a41003a00002001200041016a3602000f0b200120024101106d2001280200200141086a220128020022006a41013a00002001200041016a3602000f0b200120024101106d2001280200200141086a220128020022006a41023a00002001200041016a3602000f0b200120024101106d2001280200200141086a220128020022006a41033a00002001200041016a3602000f0b200120024101106d2001280200200141086a220128020022006a41043a00002001200041016a3602000f0b200120024101106d2001280200200141086a220128020022006a41053a00002001200041016a3602000f0b200120024101106d2001280200200141086a220128020022006a41063a00002001200041016a3602000f0b200120024101106d2001280200200141086a220328020022026a41073a00002003200241016a2202360200200041026a2d00002100200120024101106d2001280200200328020022016a20003a00002003200141016a3602000f0b200120024101106d2001280200200141086a220128020022006a41083a00002001200041016a3602000f0b200120024101106d2001280200200141086a220128020022006a41093a00002001200041016a3602000f0b200541013a00002003200441016a220236020020002d0001220341024b0d0002400240024020030e03000102000b200120024101106d2001280200200141086a220128020022006a41003a00002001200041016a3602000f0b200120024101106d2001280200200141086a220128020022006a41013a00002001200041016a3602000f0b200120024101106d2001280200200141086a220328020022026a41023a00002003200241016a2202360200200041026a2d00002100200120024101106d2001280200200328020022016a20003a00002003200141016a3602000b0bae0f01077f230041c0006b220224000240024041ca0310242203450d0020002003360200200041046a220442ca0337020020004100410210c9012000280200200041086a220528020022036a41003b00002005200341026a220336020002400240200128020022012903684202520d00024020032004280200470d0020002003410110c901200041086a28020021030b200028020020036a41043a0000200041086a2203200328020041016a3602000c010b024020032004280200470d0020002003410110c901200041086a28020021030b200141e8006a2105200028020020036a4184013a0000200041086a2203200328020041016a2204360200200020044120106d2000280200200328020022066a22042001290000370000200441186a200141186a290000370000200441106a200141106a290000370000200441086a200141086a2900003700002003200641206a2204360200024020012d0020220341024b0d0002400240024020030e03000102000b200020044101106d2000280200200041086a220428020022036a41003a00002004200341016a22033602002000200341c000106d2000280200200428020022066a2203200141216a290000370000200341386a200141d9006a290000370000200341306a200141d1006a290000370000200341286a200141c9006a290000370000200341206a200141c1006a290000370000200341186a200141396a290000370000200341106a200141316a290000370000200341086a200141296a2900003700002004200641c0006a3602000c020b200020044101106d2000280200200041086a220428020022036a41013a00002004200341016a22033602002000200341c000106d2000280200200428020022066a2203200141216a290000370000200341386a200141d9006a290000370000200341306a200141d1006a290000370000200341286a200141c9006a290000370000200341206a200141c1006a290000370000200341186a200141396a290000370000200341106a200141316a290000370000200341086a200141296a2900003700002004200641c0006a3602000c010b200020044101106d2000280200200041086a220328020022046a41023a00002003200441016a22043602002000200441c100106d2000280200200328020022046a200141216a41c10010cf061a2003200441c1006a3602000b2005200010a6020b20014198016a2000109904200041086a2802002101410410242203450d002002420437020420022003360200024002400240024041012001417e6a220120014101461b410020011b220341c000490d00200341808001490d012003418080808004490d02200241004101106d2002280200200228020822016a41033a00002002200141016a2201360208200220014104106d20022802002201200228020822046a2003360000200441046a21030c030b200241004101106d20022802002201200228020822046a20034102743a0000200441016a21030c020b200241004102106d20022802002201200228020822046a20034102744101723b0000200441026a21030c010b200241004104106d20022802002201200228020822046a2003410274410272360000200441046a21030b20022003360208200041086a2205280200220641014d0d01200241286a200120036a2204360200200220003602204100210320054100360200200241023602102002411c6a2000280200220541026a22073602002002200136022420022006417e6a220636021420022007360218200241246a21070240024002402006450d00034020012004460d032002200141016a360224200520036a20012d00003a00002000200028020841016a36020820034101460d02200341016a210320022802242101200228022821040c000b0b2000200710d8010c010b024020022802282205200228022422016b2203450d002002280220220420022802142206200228021022006a200310c90120042802002208200020036a22036a200820006a200610d0061a20022003360210200320042802082206460d00200620016a417f73200520006a6a2103200428020020066a2100034020012005460d022002200141016a360224200020012d00003a00002004200428020841016a3602082003450d01200041016a21002003417f6a210320022802242101200228022821050c000b0b2002410036023820024201370330200241306a200710d8012002280234210620022802302107024020022802382201450d0020022802202203200228021420022802106a200110c901200328020022042002280210220020016a22036a200420006a200228021410d0061a200220033602102003200228022022042802082208460d00200820006b2105200428020020086a21032007210003402001450d01200320002d00003a00002004200428020841016a360208200041016a2100200341016a210320052001417f6a2201470d000b0b2006450d00200710260b02402002280218200228021c2201460d00200220013602180b024020022802142201450d000240200228021022042002280220220541086a22002802002203460d002005280200220520036a200520046a200110d0061a200228021421010b2000200120036a3602000b02402002280204450d00200228020010260b200241c0006a24000f0b1033000b410220061040000b980301057f230041d0006b22022400200241086a41808cc700410610fb01200241186a41e992c400410910fb0120022001360234200241386a200241346a410410a202200241cc006a200241346a41046a3602002002200241c0006a3602442002200241346a3602482002200241386a360240200241286a200241c0006a1073024002402002280230220341206a2204417f4c0d000240024020040d0041012101410021040c010b200410242201450d020b20002001360200200041086a220141003602002000200436020420004100411010c9012000280200200128020022046a220520022900083700002001200441106a2204360200200541086a200241086a41086a29000037000020002004411010c9012000280200200128020022046a220520022900183700002001200441106a2206360200200541086a200241186a41086a2900003700002002280228210420002006200310c9012000280200200128020022006a2004200310cf061a2001200020036a3602000240200228022c450d00200410260b200241d0006a24000f0b1034000b1033000bcc0101027f20002802242101024020002d00000d0020002d0001210020012001280200417f6a2202360200024020020d002001280208200128020c2802001103000240200128020c280204450d00200128020810260b20012001280204417f6a220236020420020d00200110260b200041ff01714102470f0b20012001280200417f6a2200360200024020000d002001280208200128020c2802001103000240200128020c280204450d00200128020810260b20012001280204417f6a220036020420000d00200110260b41010bf10401057f23004180016b22022400200241386a41808cc700410610fb01200241d8006a41e992c400410910fb012002200136027c200241286a200241fc006a410410a2022002410c6a200241fc006a41046a3602002002200241306a3602042002200241fc006a3602082002200241286a360200200241c8006a20021073024002402002280250220141206a2203417f4c0d000240024020030d0041012104410021030c010b200310242204450d020b20024100360230200220043602282002200336022c200241286a4100411010c9012002280228200228023022036a22042002290038370000200441086a200241386a41086a2900003700002002200341106a2203360230200241286a2003411010c9012002280228200228023022036a22042002290058370000200441086a200241d8006a41086a22052900003700002002200341106a220436023020022802482103200241286a2004200110c90120022802282204200228023022066a2003200110cf061a2002200620016a22013602300240200228024c450d00200310260b20022004200110b8032005200241096a290000370300200241d8006a41106a200241116a290000370300200241d8006a41186a2201200241196a290000370300200220022900013703580240024020022d00004101460d0020004200370000200041186a4200370000200041106a4200370000200041086a42003700000c010b20002002290358370000200041186a2001290300370000200041106a200241d8006a41106a290300370000200041086a200241d8006a41086a2903003700000b0240200228022c450d00200410260b20024180016a24000f0b1034000b1033000b980b01077f230041c0006b22052400200541186a22064200370300200541106a22074200370300200541086a2208420037030020054200370300200541206a41808cc700410610fb012008200541206a41086a220929000037030020052005290020370300200541206a41fcbfc400410e10fb01200620092900003703002007200529002037030020054102200510b4044100210a2005410036020041da93c40041102005410410b30120064200370300200742003703002008420037030020054200370300200541206a41808cc700410610fb012008200929000037030020052005290020370300200541206a41ea93c400410610fb0120062009290000370300200720052900203703002005200036022020054120200541206a410410b30120064200370300200742003703002008420037030020054200370300200541206a41808cc700410610fb012008200929000037030020052005290020370300200541206a41f093c400410610fb012006200929000037030020072005290020370300024002402003280208220841246c41046a2209417f4c0d00200328020021060240024020090d00410121030c010b200910242203450d022009210a0b20054100360238200520033602302005200a360234200541306a200810a1010240024020080d002005280230210b200528023821030c010b200841246c210a200528023821030340200541206a200610a20120052802202109200541306a200320052802282208106d2005280230220b200528023822036a2009200810cf061a2005200320086a220336023802402005280224450d00200910260b200641246a2106200a415c6a220a0d000b0b20054120200b200310b30102402005280234450d00200b10260b20052001360230200541186a22094200370300200541106a22034200370300200541086a2206420037030020054200370300200541206a41808cc700410610fb012006200541206a41086a220829000037030020052005290020370300200541206a41f693c400410a10fb01200741086a220a20082900003700002007200529002037000020054120200541306a10ce032005200136022020052000417f6a10b0042005280200220b2005280208200541206a10ce0302402005280204450d00200b10260b2005200236023020094200370300200342003703002006420037030020054200370300200541206a41808cc700410610fb012006200829000037030020052005290020370300200541206a418094c400410e10fb01200a20082900003700002007200529002037000020054120200541306a10ce0320094200370300200342003703002006420037030020054200370300200541206a41808cc700410610fb012006200829000037030020052005290020370300200541206a41b8bbc400410b10fb01200a2008290000370000200720052900203700002005412010ff0102402004450d00200541186a22094200370300200541106a22034200370300200541086a2206420037030020054200370300200541206a41808cc700410610fb012006200541206a41086a220829000037030020052005290020370300200541206a418e94c400410610fb01200741086a220a2008290000370000200720052900203700002005412010ff0120094200370300200342003703002006420037030020054200370300200541206a41808cc700410610fb012006200829000037030020052005290020370300200541206a418cbec400410a10fb01200a2008290000370000200720052900203700002005412010ff0120094200370300200342003703002006420037030020054200370300200541206a41808cc700410610fb012006200829000037030020052005290020370300200541206a419494c400410b10fb01200a2008290000370000200720052900203700002005412010af030b200541c0006a24000f0b1034000b1033000b850201027f230041106b220324002003410036020820034201370300024002400240024002400240200141024b0d0020010e03010203010b200041204101410010b3010c040b200341004101106d2003280200200328020822016a41003a00002003200141016a2201360208200320014104106d20032802002204200328020822016a2002360000200141046a21010c020b200341004101106d20032802002204200328020822016a41013a0000200141016a21010c010b200341004101106d20032802002204200328020822016a41023a0000200141016a21010b2003200136020820032802042102200041202004200110b3012002450d00200410260b200341106a24000bd70101027f02402000280200220241024b0d0002400240024020020e03000102000b2001200141086a22022802004101106d2001280200200228020022036a41003a00002002200341016a220336020020002802042100200120034104106d2001280200200228020022016a20003600002002200141046a3602000f0b2001200141086a22002802004101106d2001280200200028020022016a41013a00002000200141016a3602000f0b2001200141086a22002802004101106d2001280200200028020022016a41023a00002000200141016a3602000b0b955e03037f027e017f0240024002400240024002400240024002400240024002400240024002400240024020002d00000e10000102030405060708090a0b0c0d0e0f000b2001200141086a22022802004101106d2001280200200228020022036a41003a00002002200341016a2203360200200041086a2d0000220241044b0d0f0240024002400240024020020e050001020304000b200120034101106d2001280200200141086a220228020022036a41003a00002002200341016a3602002001200041106a290300200041186a2d0000200041196a2d00001098010f0b200120034101106d2001280200200141086a220228020022036a41013a00002002200341016a36020020012000410c6a2d00002000410d6a2d00002000410e6a2d0000109e012001200041186a290300200041206a2d0000200041216a2d00001098010f0b200120034101106d2001280200200141086a220128020022006a41023a00002001200041016a3602000f0b200120034101106d2001280200200141086a220228020022036a41033a00002002200341016a2203360200200120034120106d2001280200200228020022036a2201200041096a290000370000200141186a200041216a290000370000200141106a200041196a290000370000200141086a200041116a2900003700002002200341206a3602000f0b200120034101106d2001280200200141086a220228020022036a41043a00002002200341016a2203360200200120034120106d2001280200200228020022036a2201200041096a290000370000200141186a200041216a290000370000200141106a200041196a290000370000200141086a200041116a2900003700002002200341206a3602000f0b2001200141086a22022802004101106d2001280200200228020022036a41013a00002002200341016a2203360200200041046a2d0000220241024b0d0e02400240024020020e03000102000b200120034101106d2001280200200141086a220228020022036a41003a00002002200341016a2203360200200120034120106d2001280200200228020022046a2203200041056a290000370000200341186a2000411d6a290000370000200341106a200041156a290000370000200341086a2000410d6a2900003700002002200441206a2203360200200041286a2802002100200120034104106d2001280200200228020022016a20003600002002200141046a3602000f0b200120034101106d2001280200200141086a220228020022036a41013a00002002200341016a2203360200200041086a2802002100200120034104106d2001280200200228020022016a20003600002002200141046a3602000f0b200120034101106d2001280200200141086a220228020022036a41023a00002002200341016a2203360200200041286a2802002104200120034104106d2001280200200228020022036a20043600002002200341046a2203360200200120034120106d2001280200200228020022036a2201200041056a290000370000200141186a2000411d6a290000370000200141106a200041156a290000370000200141086a2000410d6a2900003700002002200341206a3602000f0b2001200141086a22022802004101106d2001280200200228020022036a41023a00002002200341016a2203360200200041086a2d0000220241074b0d0d0240024002400240024002400240024020020e080001020304050607000b200120034101106d2001280200200141086a220228020022036a41003a00002002200341016a2203360200200120034120106d2001280200200228020022046a2203200041096a290000370000200341186a200041216a290000370000200341106a200041196a290000370000200341086a200041116a2900003700002002200441206a2203360200200041306a2903002105200041386a2903002106200120034110106d2001280200200228020022016a22002006370008200020053700002002200141106a3602000f0b200120034101106d2001280200200141086a220228020022036a41013a00002002200341016a2203360200200120034120106d2001280200200228020022046a2203200041096a290000370000200341186a200041216a290000370000200341106a200041196a290000370000200341086a200041116a2900003700002002200441206a2203360200200041306a2903002105200041386a2903002106200120034110106d2001280200200228020022016a22002006370008200020053700002002200141106a3602000f0b200120034101106d2001280200200141086a220228020022036a41023a00002002200341016a2203360200200120034120106d2001280200200228020022046a2203200041096a290000370000200341186a200041216a290000370000200341106a200041196a290000370000200341086a200041116a2900003700002002200441206a2203360200200120034120106d2001280200200228020022046a2203200041296a290000370000200341186a200041c1006a290000370000200341106a200041396a290000370000200341086a200041316a2900003700002002200441206a2203360200200041d0006a2903002105200041d8006a2903002106200120034110106d2001280200200228020022016a22002006370008200020053700002002200141106a3602000f0b200120034101106d2001280200200141086a220228020022036a41033a00002002200341016a2203360200200120034120106d2001280200200228020022046a2203200041096a290000370000200341186a200041216a290000370000200341106a200041196a290000370000200341086a200041116a2900003700002002200441206a2203360200200041306a2903002105200041386a2903002106200120034110106d2001280200200228020022036a22042006370008200420053700002002200341106a2203360200200041c0006a2903002105200041c8006a2903002106200120034110106d2001280200200228020022016a22002006370008200020053700002002200141106a3602000f0b200120034101106d2001280200200141086a220228020022036a41043a00002002200341016a2203360200200120034120106d2001280200200228020022046a2203200041096a290000370000200341186a200041216a290000370000200341106a200041196a290000370000200341086a200041116a2900003700002002200441206a2203360200200041306a2903002105200041386a2903002106200120034110106d2001280200200228020022016a22002006370008200020053700002002200141106a3602000f0b200120034101106d2001280200200141086a220228020022036a41053a00002002200341016a2203360200200120034120106d2001280200200228020022046a2203200041096a290000370000200341186a200041216a290000370000200341106a200041196a290000370000200341086a200041116a2900003700002002200441206a2203360200200041306a2903002105200041386a2903002106200120034110106d2001280200200228020022016a22002006370008200020053700002002200141106a3602000f0b200120034101106d2001280200200141086a220228020022036a41063a00002002200341016a2203360200200120034120106d2001280200200228020022046a2203200041096a290000370000200341186a200041216a290000370000200341106a200041196a290000370000200341086a200041116a2900003700002002200441206a2203360200200041306a2903002105200041386a2903002106200120034110106d2001280200200228020022016a22002006370008200020053700002002200141106a3602000f0b200120034101106d2001280200200141086a220228020022036a41073a00002002200341016a2203360200200120034120106d2001280200200228020022046a2203200041096a290000370000200341186a200041216a290000370000200341106a200041196a290000370000200341086a200041116a2900003700002002200441206a2203360200200120034120106d2001280200200228020022046a2203200041296a290000370000200341186a200041c1006a290000370000200341106a200041396a290000370000200341086a200041316a2900003700002002200441206a2203360200200041d0006a2903002105200041d8006a2903002106200120034110106d2001280200200228020022036a22042006370008200420053700002002200341106a2203360200200041c9006a2d00002100200120034101106d2001280200200228020022016a2103024020004101460d00200341003a00002002200141016a3602000f0b200341013a00002002200141016a3602000f0b2001200141086a22022802004101106d2001280200200228020022036a41033a00002002200341016a2203360200200120034101106d2001280200200228020022036a41003a00002002200341016a2203360200200120034110106d2001280200200228020022036a2204200041106a290000370000200441086a200041186a2900003700002002200341106a360200200041046a2802002000410c6a2802002001109501200041206a2d00002100200120022802004101106d2001280200200228020022016a20003a00002002200141016a3602000f0b2001200141086a22022802004101106d2001280200200228020022036a41043a00002002200341016a2203360200200120034101106d2001280200200228020022036a41003a00002002200341016a2203360200200041046a2802002100200120034104106d2001280200200228020022016a20003600002002200141046a3602000f0b2001200141086a22022802004101106d2001280200200228020022036a41053a00002002200341016a2203360200200041046a280200220241024b0d0a02400240024020020e03000102000b200120034101106d2001280200200141086a220328020022026a41003a00002003200241016a360200200041086a28020021022001200041106a280200220010a1012000450d0c2002200041286c6a2107200328020021000340200120004120106d2001280200200328020022046a22002002290000370000200041186a200241186a290000370000200041106a200241106a290000370000200041086a200241086a2900003700002003200441206a2200360200200241206a2903002105200120004108106d2001280200200328020022006a20053700002003200041086a22003602002007200241286a2202470d000c0d0b0b200120034101106d2001280200200141086a220128020022006a41013a00002001200041016a3602000f0b200120034101106d2001280200200141086a220128020022006a41023a00002001200041016a3602000f0b2001200141086a22022802004101106d2001280200200228020022036a41063a00002002200341016a2203360200200041046a2d0000220241024b0d0902400240024020020e03000102000b200120034101106d2001280200200141086a220228020022036a41003a00002002200341016a2203360200200120034120106d2001280200200228020022036a2201200041056a290000370000200141186a2000411d6a290000370000200141106a200041156a290000370000200141086a2000410d6a2900003700002002200341206a3602000f0b200120034101106d2001280200200141086a220128020022006a41013a00002001200041016a3602000f0b200120034101106d2001280200200141086a220328020022026a41023a00002003200241016a360200200041086a28020021022001200041106a280200220010a1012000450d0920004105742104200328020021000340200120004120106d2001280200200328020022076a22002002290000370000200041186a200241186a290000370000200041106a200241106a290000370000200041086a200241086a2900003700002003200741206a2200360200200241206a2102200441606a22040d000c0a0b0b2001200141086a22022802004101106d2001280200200228020022036a41073a00002002200341016a2203360200200041046a2802002104200120034101106d2001280200200228020022036a2107024020044101460d00200741003a00002002200341016a220336020020002802082100200120034104106d2001280200200228020022016a20003600002002200141046a3602000f0b200741013a00002002200341016a220336020020002802082100200120034104106d2001280200200228020022016a20003600002002200141046a3602000f0b2001200141086a22022802004101106d2001280200200228020022036a41083a00002002200341016a22033602000240200041086a2d00004104460d00200120034101106d2001280200200228020022036a41003a00002002200341016a2203360200200041046a2802002104200120034104106d2001280200200228020022036a20043600002002200341046a360200200120002d0008200041096a2d00002000410a6a2d0000109e010f0b200120034101106d2001280200200228020022016a41013a00002002200141016a3602000f0b2001200141086a22022802004101106d2001280200200228020022036a41093a00002002200341016a2203360200200041086a2d0000220241094b0d06024002400240024002400240024002400240024020020e0a00010203040506070809000b200120034101106d2001280200200141086a220228020022036a41003a00002002200341016a2203360200200120034120106d2001280200200228020022036a2201200041096a290000370000200141186a200041216a290000370000200141106a200041196a290000370000200141086a200041116a2900003700002002200341206a3602000f0b200120034101106d2001280200200141086a220228020022036a41013a00002002200341016a2203360200200120034120106d2001280200200228020022046a2203200041096a290000370000200341186a200041216a290000370000200341106a200041196a290000370000200341086a200041116a2900003700002002200441206a2203360200200041306a2903002105200041386a2903002106200120034110106d2001280200200228020022016a22002006370008200020053700002002200141106a3602000f0b200120034101106d2001280200200141086a220228020022036a41023a00002002200341016a2203360200200120034120106d2001280200200228020022046a2203200041096a290000370000200341186a200041216a290000370000200341106a200041196a290000370000200341086a200041116a2900003700002002200441206a2203360200200041306a2903002105200041386a2903002106200120034110106d2001280200200228020022016a22002006370008200020053700002002200141106a3602000f0b200120034101106d2001280200200141086a220228020022036a41033a00002002200341016a2203360200200120034120106d2001280200200228020022046a2203200041096a290000370000200341186a200041216a290000370000200341106a200041196a290000370000200341086a200041116a2900003700002002200441206a22033602002000412c6a2802002100200120034104106d2001280200200228020022016a20003600002002200141046a3602000f0b200120034101106d2001280200200141086a220228020022036a41043a00002002200341016a2203360200200120034120106d2001280200200228020022046a2203200041096a290000370000200341186a200041216a290000370000200341106a200041196a290000370000200341086a200041116a2900003700002002200441206a22033602002000412c6a2802002100200120034104106d2001280200200228020022016a20003600002002200141046a3602000f0b200120034101106d2001280200200141086a220228020022036a41053a00002002200341016a2203360200200120034120106d2001280200200228020022046a2203200041096a290000370000200341186a200041216a290000370000200341106a200041196a290000370000200341086a200041116a2900003700002002200441206a22033602002000412c6a2802002100200120034104106d2001280200200228020022016a20003600002002200141046a3602000f0b200120034101106d2001280200200141086a220228020022036a41063a00002002200341016a22033602002000410c6a2802002100200120034104106d2001280200200228020022016a20003600002002200141046a3602000f0b200120034101106d2001280200200141086a220228020022036a41073a00002002200341016a2203360200200120034120106d2001280200200228020022046a2203200041096a290000370000200341186a200041216a290000370000200341106a200041196a290000370000200341086a200041116a2900003700002002200441206a2203360200200120034120106d2001280200200228020022046a2203200041296a290000370000200341186a200041c1006a290000370000200341106a200041396a290000370000200341086a200041316a2900003700002002200441206a2203360200200041d0006a2903002105200041d8006a2903002106200120034110106d2001280200200228020022016a22002006370008200020053700002002200141106a3602000f0b200120034101106d2001280200200141086a220228020022036a41083a00002002200341016a2203360200200120034120106d2001280200200228020022046a2203200041096a290000370000200341186a200041216a290000370000200341106a200041196a290000370000200341086a200041116a2900003700002002200441206a2203360200200120034120106d2001280200200228020022046a2203200041296a290000370000200341186a200041c1006a290000370000200341106a200041396a290000370000200341086a200041316a2900003700002002200441206a2203360200200041d0006a2903002105200041d8006a2903002106200120034110106d2001280200200228020022016a22002006370008200020053700002002200141106a3602000f0b200120034101106d2001280200200141086a220228020022036a41093a00002002200341016a2203360200200120034120106d2001280200200228020022046a2203200041096a290000370000200341186a200041216a290000370000200341106a200041196a290000370000200341086a200041116a2900003700002002200441206a2203360200200120034120106d2001280200200228020022046a2203200041296a290000370000200341186a200041c1006a290000370000200341106a200041396a290000370000200341086a200041316a2900003700002002200441206a2203360200200041d0006a2903002105200041d8006a2903002106200120034110106d2001280200200228020022016a22002006370008200020053700002002200141106a3602000f0b2001200141086a22022802004101106d2001280200200228020022036a410a3a00002002200341016a220336020020002d0001220241054b0d0502400240024002400240024020020e06000102030405000b200120034101106d2001280200200141086a220228020022036a41003a00002002200341016a2203360200200120034120106d2001280200200228020022036a2201200041026a290000370000200141186a2000411a6a290000370000200141106a200041126a290000370000200141086a2000410a6a2900003700002002200341206a3602000f0b200120034101106d2001280200200141086a220228020022036a41013a00002002200341016a2203360200200120034120106d2001280200200228020022046a2203200041026a290000370000200341186a2000411a6a290000370000200341106a200041126a290000370000200341086a2000410a6a2900003700002002200441206a2203360200200120034120106d2001280200200228020022036a2201200041226a290000370000200141186a2000413a6a290000370000200141106a200041326a290000370000200141086a2000412a6a2900003700002002200341206a3602000f0b200120034101106d2001280200200141086a220228020022036a41023a00002002200341016a2203360200200120034120106d2001280200200228020022046a2203200041026a290000370000200341186a2000411a6a290000370000200341106a200041126a290000370000200341086a2000410a6a2900003700002002200441206a2203360200200120034120106d2001280200200228020022046a2203200041226a290000370000200341186a2000413a6a290000370000200341106a200041326a290000370000200341086a2000412a6a2900003700002002200441206a2203360200200120034120106d2001280200200228020022036a2201200041c2006a290000370000200141186a200041da006a290000370000200141106a200041d2006a290000370000200141086a200041ca006a2900003700002002200341206a3602000f0b200120034101106d2001280200200141086a220228020022036a41033a00002002200341016a2203360200200120034120106d2001280200200228020022046a2203200041026a290000370000200341186a2000411a6a290000370000200341106a200041126a290000370000200341086a2000410a6a2900003700002002200441206a2203360200200120034120106d2001280200200228020022036a2201200041226a290000370000200141186a2000413a6a290000370000200141106a200041326a290000370000200141086a2000412a6a2900003700002002200341206a3602000f0b200120034101106d2001280200200141086a220228020022036a41043a00002002200341016a2203360200200120034120106d2001280200200228020022046a2203200041026a290000370000200341186a2000411a6a290000370000200341106a200041126a290000370000200341086a2000410a6a2900003700002002200441206a2203360200200120034120106d2001280200200228020022036a2201200041226a290000370000200141186a2000413a6a290000370000200141106a200041326a290000370000200141086a2000412a6a2900003700002002200341206a3602000f0b200120034101106d2001280200200141086a220228020022036a41053a00002002200341016a2203360200200120034120106d2001280200200228020022036a2201200041026a290000370000200141186a2000411a6a290000370000200141106a200041126a290000370000200141086a2000410a6a2900003700002002200341206a3602000f0b2001200141086a22022802004101106d2001280200200228020022036a410b3a00002002200341016a2204360200200041096a21030240200041086a2d00004101460d00200120044101106d2001280200200228020022046a41003a00002002200441016a2204360200200120044120106d2001280200200228020022076a22042003290000370000200441186a200341186a290000370000200441106a200341106a290000370000200441086a200341086a2900003700002002200741206a2203360200200041306a2903002105200041386a2903002106200120034110106d2001280200200228020022016a22002006370008200020053700002002200141106a3602000f0b200120044101106d2001280200200228020022006a41013a00002002200041016a2200360200200120004120106d2001280200200228020022006a22012003290000370000200141186a200341186a290000370000200141106a200341106a290000370000200141086a200341086a2900003700002002200041206a3602000f0b2001200141086a22022802004101106d2001280200200228020022036a410c3a00002002200341016a2203360200200041046a280200220241024b0d0302400240024020020e03000102000b200120034101106d2001280200200141086a220228020022036a41003a00002002200341016a2203360200200041086a2802002104200120034104106d2001280200200228020022036a20043600002002200341046a22033602002000410c6a2802002100200120034104106d2001280200200228020022016a20003600002002200141046a3602000f0b200120034101106d2001280200200141086a220228020022036a41013a00002002200341016a2203360200200041086a2802002104200120034104106d2001280200200228020022036a20043600002002200341046a22033602002000410c6a2802002100200120034104106d2001280200200228020022016a20003600002002200141046a3602000f0b200120034101106d2001280200200141086a220228020022036a41023a00002002200341016a2203360200200041086a2802002104200120034104106d2001280200200228020022036a20043600002002200341046a22033602002000410c6a2802002104200120034104106d2001280200200228020022036a20043600002002200341046a3602002001200041106a109f012000411c6a2d00002000411d6a2d00002000411e6a2d0000200110f8020f0b2001200141086a22022802004101106d2001280200200228020022036a410d3a00002002200341016a2203360200200041046a2d0000220241024b0d0202400240024020020e03000102000b200120034101106d2001280200200141086a220228020022036a41003a00002002200341016a360200200041086a2d0000200041096a2d00002000410a6a2d0000200110f8020f0b200120034101106d2001280200200141086a220228020022036a41013a00002002200341016a2203360200200120034120106d2001280200200228020022036a2201200041056a290000370000200141186a2000411d6a290000370000200141106a200041156a290000370000200141086a2000410d6a2900003700002002200341206a3602000f0b200120034101106d2001280200200141086a220228020022036a41023a00002002200341016a2203360200200041056a2d00002100200120034101106d2001280200200228020022016a20003a00002002200141016a3602000f0b2001200141086a22022802004101106d2001280200200228020022036a410e3a00002002200341016a22033602000240200041046a2d00004101460d00200120034101106d2001280200200228020022036a41003a00002002200341016a360200200041086a2d0000200041096a2d00002000410a6a2d0000200110f8020f0b200120034101106d2001280200200228020022036a41013a00002002200341016a2203360200200120034120106d2001280200200228020022046a2203200041056a290000370000200341186a2000411d6a290000370000200341106a200041156a290000370000200341086a2000410d6a2900003700002002200441206a2203360200200120034120106d2001280200200228020022046a2203200041256a290000370000200341186a2000413d6a290000370000200341106a200041356a290000370000200341086a2000412d6a2900003700002002200441206a220336020002400240024002400240200041c5006a2d00000e0400010203000b200120034101106d2001280200200141086a220328020022026a41003a00002003200241016a22023602000c030b200120034101106d2001280200200141086a220328020022026a41013a00002003200241016a22023602000c020b200120034101106d2001280200200141086a220328020022026a41023a00002003200241016a22023602000c010b200120034101106d2001280200200141086a220328020022026a41033a00002003200241016a22023602000b20002f01462100200120024102106d2001280200200141086a220128020022026a20003b00002001200241026a3602000f0b2001200141086a22022802004101106d2001280200200228020022036a410f3a00002002200341016a22033602000240024002400240200041046a2d00000e0400010203000b200120034101106d2001280200200228020022036a41003a00002002200341016a2203360200200120034120106d2001280200200228020022046a2203200041056a290000370000200341186a2000411d6a290000370000200341106a200041156a290000370000200341086a2000410d6a2900003700002002200441206a2203360200200120034120106d2001280200200228020022046a2203200041256a290000370000200341186a2000413d6a290000370000200341106a200041356a290000370000200341086a2000412d6a2900003700002002200441206a2203360200200120034120106d2001280200200228020022036a2201200041c5006a290000370000200141186a200041dd006a290000370000200141106a200041d5006a290000370000200141086a200041cd006a2900003700002002200341206a3602000f0b200120034101106d2001280200200228020022036a41013a00002002200341016a2203360200200120034120106d2001280200200228020022046a2203200041056a290000370000200341186a2000411d6a290000370000200341106a200041156a290000370000200341086a2000410d6a2900003700002002200441206a2203360200200041e8006a2802002104200120034104106d2001280200200228020022036a20043600002002200341046a2203360200200041ec006a2802002104200120034104106d2001280200200228020022036a20043600002002200341046a2203360200200120034120106d2001280200200228020022046a2203200041256a290000370000200341186a2000413d6a290000370000200341106a200041356a290000370000200341086a2000412d6a2900003700002002200441206a2203360200200120034120106d2001280200200228020022036a2201200041c5006a290000370000200141186a200041dd006a290000370000200141106a200041d5006a290000370000200141086a200041cd006a2900003700002002200341206a3602000f0b200120034101106d2001280200200228020022036a41023a00002002200341016a2203360200200120034120106d2001280200200228020022046a2203200041056a290000370000200341186a2000411d6a290000370000200341106a200041156a290000370000200341086a2000410d6a2900003700002002200441206a2203360200200041e8006a2802002104200120034104106d2001280200200228020022036a20043600002002200341046a2203360200200041ec006a2802002104200120034104106d2001280200200228020022036a20043600002002200341046a2203360200200120034120106d2001280200200228020022046a2203200041256a290000370000200341186a2000413d6a290000370000200341106a200041356a290000370000200341086a2000412d6a2900003700002002200441206a2203360200200120034120106d2001280200200228020022046a2203200041c5006a290000370000200341186a200041dd006a290000370000200341106a200041d5006a290000370000200341086a200041cd006a2900003700002002200441206a360200200041f0006a2d0000200041f1006a2d0000200041f2006a2d0000200110f8020f0b200120034101106d2001280200200228020022036a41033a00002002200341016a2203360200200120034120106d2001280200200228020022046a2203200041056a290000370000200341186a2000411d6a290000370000200341106a200041156a290000370000200341086a2000410d6a2900003700002002200441206a2203360200200041e8006a2802002104200120034104106d2001280200200228020022036a20043600002002200341046a2203360200200041ec006a2802002104200120034104106d2001280200200228020022036a20043600002002200341046a2203360200200120034120106d2001280200200228020022046a2203200041256a290000370000200341186a2000413d6a290000370000200341106a200041356a290000370000200341086a2000412d6a2900003700002002200441206a2203360200200120034120106d2001280200200228020022036a2201200041c5006a290000370000200141186a200041dd006a290000370000200141106a200041d5006a290000370000200141086a200041cd006a2900003700002002200341206a3602000b0bc50101017f024020002d0000417d6a220141094b0d00024002400240024020010e0a00040102040404040403000b200041086a280200450d03200041046a28020010260c030b200041046a2802000d022000410c6a2802002201450d02200141286c450d02200041086a28020010260f0b200041046a2d00004102490d012000410c6a28020041ffffff3f71450d01200041086a28020010260f0b200041046a2802004102490d00200041106a2802002201450d00200041146a280200450d00200110260f0b0b13002000410a360204200041a094c4003602000b980301057f230041d0006b22022400200241086a41808cc700410610fb01200241186a41bcbcc400410d10fb0120022001360234200241386a200241346a410410a202200241cc006a200241346a41046a3602002002200241c0006a3602442002200241346a3602482002200241386a360240200241286a200241c0006a1073024002402002280230220341206a2204417f4c0d000240024020040d0041012101410021040c010b200410242201450d020b20002001360200200041086a220141003602002000200436020420004100411010c9012000280200200128020022046a220520022900083700002001200441106a2204360200200541086a200241086a41086a29000037000020002004411010c9012000280200200128020022046a220520022900183700002001200441106a2206360200200541086a200241186a41086a2900003700002002280228210420002006200310c9012000280200200128020022006a2004200310cf061a2001200020036a3602000240200228022c450d00200410260b200241d0006a24000f0b1034000b1033000b3400200041808cc70036020420004100360200200041146a410f360200200041106a41a8b0c400360200200041086a42063702000b4901017f02404101102422020d001033000b2000420137020420002002360200200041004101106d2000280200200041086a220028020022026a41003a00002000200241016a3602000b5b01017f230041306b220224002000410036020820004201370200200241206a4200370300200241186a4200370300200241106a4200370300200242003703082002200036022c200241086a2002412c6a109c01200241306a24000b6101027f20004201370200200041086a22024100360200200041004108106d2000280200200228020022036a42003700002002200341086a2203360200200020034108106d2000280200200228020022006a42003700002002200041086a3602000b8b0101037f230041d0006b22022400200241086a410041c50010d1061a200041086a2203410036020020004201370200200041004104106d2000280200200328020022046a41003600002003200441046a2204360200200020044101106d2000280200200328020022046a41003a00002003200441016a3602002000200241086a10a601200241d0006a24000bcf0201077f230041c0006b22002400200041086a41da93c4004110108902200028020c21010240200028020822024101470d0041da93c400411010ff010b200041286a22034200370300200041106a41106a22044200370300200041106a41086a2205420037030020004200370310200041306a41808cc700410610fb012005200041306a41086a220629000037030020002000290030370310200041306a4190bbc400410e10fb01200320062900003703002004200029003037030020002001410020021b360230200041106a4120200041306a410410b30120034200370300200442003703002005420037030020004200370310200041306a41808cc700410610fb012005200629000037030020002000290030370310200041306a41fcbfc400410e10fb012003200629000037030020042000290030370300200041106a4101200010b404200041c0006a24000b130020004106360204200041d8cac4003602000b4c01017f02404104102422020d001033000b2000420437020420002002360200200041004104106d2000280200200041086a220028020022026a418080c0023600002000200241046a3602000b4c01017f02404108102422020d001033000b2000420837020420002002360200200041004108106d2000280200200041086a220028020022026a42c0b2cd3b3700002000200241086a3602000b4d01017f02404108102422020d001033000b2000420837020420002002360200200041004108106d2000280200200041086a220028020022026a4280e497d0123700002000200241086a3602000b6701027f20004201370200200041086a22024100360200200041004108106d2000280200200228020022036a42c0f0f50b3700002002200341086a2203360200200020034108106d2000280200200228020022006a4280c2d72f3700002002200041086a3602000b4e01017f02404108102422020d001033000b2000420837020420002002360200200041004108106d2000280200200041086a220028020022026a4280c0a8ca9a3a3700002000200241086a3602000b4a01017f02404104102422020d001033000b2000420437020420002002360200200041004104106d2000280200200041086a220028020022026a41e0123600002000200241046a3602000bed0203067f037e017f230041d0006b22012400200141386a22024200370300200141206a41106a22034200370300200141206a41086a2204420037030020014200370320200141c0006a41808cc700410610fb012004200141c0006a41086a220529000037030020012001290040370320200141c0006a41b8bbc400410b10fb012002200529000037030020032001290040370300200141086a200141206a108f02200141086a41106a220629030021072001290310210820012903082109200142013703082006200742002009420151220a1b3703002001427f20084200200a1b220720007c220020002007541b37031020024200370300200342003703002004420037030020014200370320200141c0006a41808cc700410610fb012004200529000037030020012001290040370320200141c0006a41b8bbc400410b10fb012002200529000037030020032001290040370300200141206a200141086a41086a10f103200141d0006a24000bb317040a7f017e047f037e23004190026b22012400200141d0016a41186a22024200370300200141d0016a41106a22034200370300200141d0016a41086a22044200370300200142003703d001200141a8016a41808cc700410610fb012004200141a8016a41086a2205290000370300200120012900a8013703d001200141a8016a41fcbfc400410e10fb0120022005290000370300200320012900a801370300200141d0016a412010ff01200242003703002003420037030020044200370300200142003703d001200141a8016a41808cc700410610fb0120042005290000370300200120012900a8013703d001200141a8016a4190bbc400410e10fb0120022005290000370300200320012900a801370300200141d0016a412010ff01200242003703002003420037030020044200370300200142003703d001200141a8016a41808cc700410610fb0120042005290000370300200120012900a8013703d001200141a8016a41f4bbc400411010fb0120022005290000370300200320012900a801370300200141d0016a412010ff01200242003703002003420037030020044200370300200142003703d001200141a8016a41808cc700410610fb0120042005290000370300200120012900a8013703d001200141a8016a41ea93c400410610fb0120022005290000370300200320012900a8013703002001200141d0016a4120108902200128020421040240200128020022064101470d00200141d0016a412010ff010b200141f0016a41186a22074200370300200141f0016a41106a22024200370300200141f0016a41086a22084200370300200142003703f001200141a8016a41808cc700410610fb0120082005290000370300200120012900a8013703f001200141a8016a41f693c400410a10fb0120072005290000370300200220012900a801370300200141a8016a200141f0016a412010b803024002400240024020012d00a80122050d00200141e8016a200141c1016a290000370300200141e0016a200141b9016a290000370300200141d8016a200141b1016a290000370300200120012900a9013703d0010c010b200141f0016a412010ff01200141d0016a41186a2207200141c1016a290000370300200141d0016a41106a2208200141b9016a290000370300200141d0016a41086a2209200141b1016a290000370300200120012900a9013703d00120054101460d010b200141206a4200370300200141186a4200370300200141106a4200370300200142003703080c010b200141086a41186a2007290300370300200141086a41106a2008290300370300200141086a41086a2009290300370300200120012903d0013703080b200141e8016a4200370300200141e0016a4200370300200141d0016a41086a22054200370300200142003703d001200141a8016a41808cc700410610fb012005200141a8016a41086a2207290000370300200120012900a8013703d001200141a8016a41f093c400410610fb01200341086a2007290000370000200320012900a801370000200141a8016a200141d0016a10c9040240024020012802a80122080d00410021072001410036023020014204370328410421084100210a0c010b200141d0016a412010ff0120012008360228200120012902ac01220b37022c200b422088a72107200ba7210a0b2004410020061b2106200141f0016a41186a4200370300200141f0016a41106a4200370300200141f0016a41086a22034200370300200142003703f001200141a8016a41808cc700410610fb012003200141a8016a41086a2205290000370300200120012900a8013703f001200141a8016a418094c400410e10fb01200241086a2005290000370000200220012900a801370000200141a8016a200141f0016a412010b803024002400240024020012d00a80122030d00200141d0016a41186a200141c1016a290000370300200141d0016a41106a200141b9016a290000370300200141d0016a41086a200141b1016a290000370300200120012900a9013703d0010c010b200141f0016a412010ff01200141d0016a41186a200141c1016a290000370300200141d0016a41106a200141b9016a290000370300200141d0016a41086a200141b1016a290000370300200120012900a9013703d00120034101460d010b200141d0006a4200370300200141c8006a4200370300200141c0006a4200370300200142003703380c010b200141386a41186a200141d0016a41186a290300370300200141386a41106a200141d0016a41106a290300370300200141386a41086a200141d0016a41086a290300370300200120012903d0013703380b0240200641e112490d002006419f6d6a2203450d00200141a8016a200310b00420012802a801220320012802b00110ff0120012802ac01450d00200310260b20014188016a10ca042001280290012104200128028801210941002103200141003a00c801200921050240024002400240034020042003460d01200141a8016a20036a20052d00003a00002001200341016a22023a00c801200541016a21052002210320024120470d000b200141f0016a41186a2203200141a8016a41186a290300370300200141f0016a41106a2205200141a8016a41106a290300370300200141f0016a41086a2204200141a8016a41086a290300370300200120012903a8013703f001200241ff01714120490d01200141d8006a41086a2004290300370300200141d8006a41106a2005290300370300200141d8006a41186a2003290300370300200120012903f0013703580240200128028c01450d00200910260b200141003602b001200142013703a8012001200141a8016a3602f001200141086a200141f0016a109c01200141f8006a20012802a80120012802b00110cb04024020012802ac01450d0020012802a80110260b024020012802782209450d0020014180016a2802002104200128027c210c41002103200141003a00c80120092105034020042003460d04200141a8016a20036a20052d00003a00002001200341016a22023a00c801200541016a21052002210320024120470d000b200141f0016a41186a2203200141a8016a41186a2205290300370300200141f0016a41106a2204200141a8016a41106a220d290300370300200141f0016a41086a220e200141a8016a41086a220f290300370300200120012903a8013703f001200241ff01714120490d0420014188016a41086a200e290300220b37030020014188016a41106a2004290300221037030020014188016a41186a20032903002211370300200120012903f001221237038801200f200b370300200d201037030020052011370300200120123703a801200141f0016a41026a2205200141d0016a41026a2d00003a0000200120012f00d0013b01f00102402007200a470d00200141286a2007410110d10120012802302107200128022821080b2008200741246c6a220341003a0000200320012903a801370001200141c0016a290300210b200141b8016a2903002110200141b0016a2903002111200320012f01f0013b0021200341236a20052d00003a0000200341096a2011370000200341116a2010370000200341196a200b3700002001200741016a360230200c450d00200910260b200020012903083700102000200636020020002001290358370030200041286a200141086a41186a290300370000200041206a200141086a41106a290300370000200041186a200141086a41086a290300370000200041386a200141d8006a41086a290300370000200041c0006a200141d8006a41106a290300370000200041c8006a200141d8006a41186a290300370000200041e8006a200141386a41186a290300370000200041e0006a200141386a41106a290300370000200041d8006a200141386a41086a290300370000200020012903383700502000410c6a200141286a41086a2802003602002000200129032837020420014190026a24000f0b200341ff0171450d00200141003a00c8010b41a3d2c400412c200141a8016a41d0d2c40041e0d2c4001036000b200341ff0171450d00200141003a00c8010b41a3d2c400412c200141a8016a41d0d2c40041f0d2c4001036000bb30201027f230041e0006b220224002002412036020c20022001360208200241106a2001412010820202400240200228021022010d00200041003602000c010b200228021421032002200241106a41086a28020036022420022001360220200241c8006a200241206a10e4020240024020022802480d0020024100360230200242013703282002410e36023c2002200241086a3602382002200241286a360244200241dc006a41013602002002420137024c2002418c8dc6003602482002200241386a360258200241c4006a41c4e1c000200241c8006a10351a200228022820022802301084020240200228022c450d00200228022810260b200041003602000c010b20002002290348370200200041086a200241c8006a41086a2802003602000b2003450d00200110260b200241e0006a24000b3c02017e017f0240024010212201422088a72202450d0020002001a73602000c010b20004101360200410021020b20002002360208200020023602040b130020002002ad4220862001ad84101b10c5060baf0301077f230041106b2203240020032000200220016b10cd04024002400240024020032802004101470d00200341086a2802000d0141c8bcc700411141dcbcc700102f000b41242104024002402000280200220541244b0d00200041056a210620052107200021080c010b2000410c6a22082802002107200041086a2802002106200521040b0240200720044f0d00034020022001460d03200620076a20012d00003a0000200141016a2101200741016a22072004490d000b0b2008200736020020012002460d02200141016a2107200041056a21092000410c6a210820012d000021060340024002402000280200220441244b0d0041242105200421010c010b20082802002101200421050b024020012005470d0020032000410110cd04024020032802004101470d00200341086a2802000d0341c8bcc700411141dcbcc700102f000b200028020021040b02400240200441244b0d0020092104200021050c010b20002802082104200821050b2005200141016a360200200420016a20063a000020022007460d0320072d00002106200741016a21070c000b0b102c000b200820073602000b200341106a24000bb20301047f41242103024002402001280200220441244b0d00200421050c010b2001410c6a2802002105200421030b02400240200320056b20024f0d000240200520026a22022005490d004100417f2002417f6a677620024102491b220541016a220320054f0d020b2000200336020420004101360200200041086a41003602000f0b200041003602000f0b4124210202400240200441244b0d00200141056a2106200421050c010b2001410c6a2802002105200141086a2802002106200421020b024002400240200520034b0d000240024020034125490d0020022003470d010c040b024020044125490d00200141003a0004200141056a2006200510cf061a20012005360200200610260c040b200041003602000f0b0240200441244b0d000240200310242202450d0020022006200510cf061a0c030b2000200336020420004101360200200041086a41013602000f0b200620022003102822020d012000200336020420004101360200200041086a41013602000f0b41ecbcc700412041dcbcc700102f000b200141013a0004200120033602002001410c6a2005360200200141086a20023602000b200041003602000be23a09037f017e037f017e037f047e037f017e0d7f230041900a6b22022400024002400240200128020422034108490d002001280200220429000021052001200341786a22063602042001200441086a22073602002006450d0120072d000021062001200341776a22083602042001200741016a360200200641014b0d0102400240024002400240024020060e020001000b20084108490d062007290001210920012003416f6a220a3602042001200741096a36020041002107200241003a00e809200321060240024002400340200a2007460d01200241c8096a20076a200420076a220841116a2d00003a000020012006416e6a3602042001200841126a3602002002200741016a22083a00e8092006417f6a21062008210720084120470d000b20024188086a41086a2207200241c8096a41086a29030037030020024188086a41106a220b200241c8096a41106a29030037030020024188086a41186a220c200241c8096a41186a290300370300200220022903c80937038808200841ff0171411f4d0d09200320086b416f6a210a200241e8066a41086a2007290300220d370300200241a8056a41186a200c290300370300200241a8056a41106a200b290300370300200241a8056a41086a200d3703002002200229038808220d3703e8062002200d3703a80541002107200241003a00e809200420086a210b2006416e6a21040340200a2007460d02200241c8096a20076a200b20076a220841116a2d00003a0000200120043602042001200841126a3602002002200741016a22083a00e8092004417f6a21042003417f6a21032008210720084120470d000b20024188086a41086a2207200241c8096a41086a29030037030020024188086a41106a2203200241c8096a41106a29030037030020024188086a41186a2204200241c8096a41186a290300370300200220022903c80937038808200841ff0171411f4d0d09200241e8066a41086a2007290300370300200241e8066a41106a2003290300370300200241e8066a41186a200429030037030020022002290388083703e806200620086b2207416f6a4104490d09200b20086a220341116a280000210820012007416b6a360204200241c8066a41086a2207200241e8066a41086a290300370300200241c8066a41106a2204200241e8066a41106a290300370300200241c8066a41186a2206200241e8066a41186a2903003703002001200341156a360200200220022903e8063703c806200241c8096a200110dc0120022d00c8094101460d0920024188086a41386a200241810a6a290000220d37030020024188086a41306a200241f9096a290000220e37030020024188086a41286a200241f1096a290000220f37030020024188086a41206a200241e9096a2900002210370300200241c8076a41086a2203200241d1096a290000370300200241c8076a41106a220a200241c8096a41116a290000370300200241c8076a41186a220b200241e1096a290000370300200241c8076a41206a220c2010370300200241c8076a41286a2211200f370300200241c8076a41306a2212200e370300200241c8076a41386a2213200d370300200220022900c9093703c807200241c8056a41386a2013290300370300200241c8056a41306a2012290300370300200241c8056a41286a2011290300370300200241c8056a41206a200c290300370300200241c8056a41186a200b290300370300200241c8056a41106a200a290300370300200241c8056a41086a2003290300370300200220022903c8073703c805200241a8066a41186a22032006290300370300200241a8066a41106a22062004290300370300200241a8066a41086a22042007290300370300200220022903c8063703a80620024188066a41186a200329030037030020024188066a41106a200629030037030020024188066a41086a2004290300370300200220022903a8063703880641002107200241003a00e80920012802042106417f2103034020062007460d03200241c8096a20076a200128020022042d00003a00002001200620036a3602042001200441016a3602002002200741016a22043a00e8092003417f6a21032004210720044120470d000b20024188086a41086a2207200241c8096a41086a29030037030020024188086a41106a2203200241c8096a41106a29030037030020024188086a41186a220a200241c8096a41186a290300370300200220022903c80937038808200441ff0171411f4d0d09200241e8066a41086a2007290300370300200241e8066a41106a2003290300370300200241e8066a41186a200a29030037030020022002290388083703e806200620046b22074104490d0920012802002204280000210320012007417c6a3602042001200441046a360200200241c8066a41086a2207200241e8066a41086a290300370300200241c8066a41106a2204200241e8066a41106a290300370300200241c8066a41186a2206200241e8066a41186a290300370300200220022903e8063703c806200241c8096a200110dc0120022d00c8094101460d0920024188086a41386a200241810a6a290000220d37030020024188086a41306a200241f9096a290000220e37030020024188086a41286a200241f1096a290000220f37030020024188086a41206a200241e9096a290000221037030020024188086a41186a200241e1096a2900002214370300200241c8076a41086a2201200241d1096a290000370300200241c8076a41106a220a200241d9096a290000370300200241c8076a41186a220b2014370300200241c8076a41206a220c2010370300200241c8076a41286a2211200f370300200241c8076a41306a2212200e370300200241c8076a41386a2213200d370300200220022900c9093703c807200241e8036a41386a22152013290300370300200241e8036a41306a22132012290300370300200241e8036a41286a22122011290300370300200241e8036a41206a2211200c290300370300200241e8036a41186a220c200b290300370300200241e8036a41106a220b200a290300370300200241e8036a41086a220a2001290300370300200220022903c8073703e803200241a8066a41186a22012006290300370300200241a8066a41106a22062004290300370300200241a8066a41086a22042007290300370300200220022903c8063703a806200241a8046a41186a22072001290300370300200241a8046a41106a22012006290300370300200241a8046a41086a22062004290300370300200220022903a8063703a804200241c8036a41186a2204200241a8056a41186a290300370300200241c8036a41106a2216200241a8056a41106a290300370300200241c8036a41086a2217200241a8056a41086a290300370300200220022903a8053703c80320024188056a41186a221820024188066a41186a29030037030020024188056a41106a221920024188066a41106a29030037030020024188056a41086a221a20024188066a41086a290300370300200220022903880637038805200241c8046a41386a221b200241c8056a41386a290300370300200241c8046a41306a221c200241c8056a41306a290300370300200241c8046a41286a221d200241c8056a41286a290300370300200241c8046a41206a221e200241c8056a41206a290300370300200241c8046a41186a221f200241c8056a41186a290300370300200241c8046a41106a2220200241c8056a41106a290300370300200241c8046a41086a2221200241c8056a41086a290300370300200220022903c8053703c804200241a8036a41186a2018290300370300200241a8036a41106a2019290300370300200241a8036a41086a201a29030037030020022002290388053703a803200241e8026a41386a201b290300370300200241e8026a41306a201c290300370300200241e8026a41286a201d290300370300200241e8026a41206a201e290300370300200241e8026a41186a201f290300370300200241e8026a41106a2020290300370300200241e8026a41086a2021290300370300200220022903c8043703e802200241c8026a41186a2007290300370300200241c8026a41106a2001290300370300200241c8026a41086a2006290300370300200220022903a8043703c80220024188026a41386a201529030037030020024188026a41306a201329030037030020024188026a41286a201229030037030020024188026a41206a201129030037030020024188026a41186a200c29030037030020024188026a41106a200b29030037030020024188026a41086a200a290300370300200220022903e80337038802200241e8016a41186a2004290300370300200241e8016a41106a2016290300370300200241e8016a41086a2017290300370300200220022903c8033703e8014200210d0c040b200741ff0171450d08200241003a00e8090c080b200741ff0171450d07200241003a00e8090c070b200741ff0171450d06200241003a00e8090c060b20084108490d052007290001210920012003416f6a220a3602042001200741096a36020041002107200241003a00e809200321060340200a2007460d02200241c8096a20076a200420076a220841116a2d00003a000020012006416e6a3602042001200841126a3602002002200741016a22083a00e8092006417f6a21062008210720084120470d000b20024188086a41086a2207200241c8096a41086a29030037030020024188086a41106a220b200241c8096a41106a29030037030020024188086a41186a220c200241c8096a41186a290300370300200220022903c80937038808200841ff0171411f4d0d05200320086b416f6a210a200241e8066a41086a2007290300220d370300200241a8056a41186a200c290300370300200241a8056a41106a200b290300370300200241a8056a41086a200d3703002002200229038808220d3703e8062002200d3703a80541002107200241003a00e809200420086a210b2006416e6a21040340200a2007460d03200241c8096a20076a200b20076a220841116a2d00003a0000200120043602042001200841126a3602002002200741016a22083a00e8092004417f6a21042003417f6a21032008210720084120470d000b20024188086a41086a2207200241c8096a41086a29030037030020024188086a41106a2203200241c8096a41106a29030037030020024188086a41186a2204200241c8096a41186a290300370300200220022903c80937038808200841ff0171411f4d0d05200241e8066a41086a2007290300370300200241e8066a41106a2003290300370300200241e8066a41186a200429030037030020022002290388083703e806200620086b2207416f6a4104490d05200b20086a220341116a280000210820012007416b6a360204200241c8066a41086a2207200241e8066a41086a290300370300200241c8066a41106a2204200241e8066a41106a290300370300200241c8066a41186a2206200241e8066a41186a2903003703002001200341156a360200200220022903e8063703c806200241c8096a200110dc0120022d00c8094101460d0520024188086a41386a200241810a6a290000220d37030020024188086a41306a200241f9096a290000220e37030020024188086a41286a200241f1096a290000220f37030020024188086a41206a200241e9096a2900002210370300200241c8076a41086a2203200241d1096a290000370300200241c8076a41106a220a200241c8096a41116a290000370300200241c8076a41186a220b200241e1096a290000370300200241c8076a41206a220c2010370300200241c8076a41286a2211200f370300200241c8076a41306a2212200e370300200241c8076a41386a2213200d370300200220022900c9093703c807200241c8056a41386a2013290300370300200241c8056a41306a2012290300370300200241c8056a41286a2011290300370300200241c8056a41206a200c290300370300200241c8056a41186a200b290300370300200241c8056a41106a200a290300370300200241c8056a41086a2003290300370300200220022903c8073703c805200241a8066a41186a22032006290300370300200241a8066a41106a22062004290300370300200241a8066a41086a22042007290300370300200220022903c8063703a80620024188066a41186a200329030037030020024188066a41106a200629030037030020024188066a41086a2004290300370300200220022903a8063703880641002107200241003a00e80920012802042106417f2103034020062007460d04200241c8096a20076a200128020022042d00003a00002001200620036a3602042001200441016a3602002002200741016a22043a00e8092003417f6a21032004210720044120470d000b20024188086a41086a2207200241c8096a41086a29030037030020024188086a41106a2203200241c8096a41106a29030037030020024188086a41186a220a200241c8096a41186a290300370300200220022903c80937038808200441ff0171411f4d0d05200241e8066a41086a2007290300370300200241e8066a41106a2003290300370300200241e8066a41186a200a29030037030020022002290388083703e806200620046b22074104490d0520012802002204280000210320012007417c6a3602042001200441046a360200200241c8066a41086a2207200241e8066a41086a290300370300200241c8066a41106a2204200241e8066a41106a290300370300200241c8066a41186a2206200241e8066a41186a290300370300200220022903e8063703c806200241c8096a200110dc0120022d00c8094101460d0520024188086a41386a200241810a6a290000220d37030020024188086a41306a200241f9096a290000220e37030020024188086a41286a200241f1096a290000220f37030020024188086a41206a200241e9096a290000221037030020024188086a41186a200241e1096a2900002214370300200241c8076a41086a2201200241d1096a290000370300200241c8076a41106a220a200241d9096a290000370300200241c8076a41186a220b2014370300200241c8076a41206a220c2010370300200241c8076a41286a2211200f370300200241c8076a41306a2212200e370300200241c8076a41386a2213200d370300200220022900c9093703c807200241e8036a41386a22152013290300370300200241e8036a41306a22132012290300370300200241e8036a41286a22122011290300370300200241e8036a41206a2211200c290300370300200241e8036a41186a220c200b290300370300200241e8036a41106a220b200a290300370300200241e8036a41086a220a2001290300370300200220022903c8073703e803200241a8066a41186a22012006290300370300200241a8066a41106a22062004290300370300200241a8066a41086a22042007290300370300200220022903c8063703a806200241a8046a41186a22072001290300370300200241a8046a41106a22012006290300370300200241a8046a41086a22062004290300370300200220022903a8063703a804200241c8036a41186a2204200241a8056a41186a290300370300200241c8036a41106a2216200241a8056a41106a290300370300200241c8036a41086a2217200241a8056a41086a290300370300200220022903a8053703c80320024188056a41186a221820024188066a41186a29030037030020024188056a41106a221920024188066a41106a29030037030020024188056a41086a221a20024188066a41086a290300370300200220022903880637038805200241c8046a41386a221b200241c8056a41386a290300370300200241c8046a41306a221c200241c8056a41306a290300370300200241c8046a41286a221d200241c8056a41286a290300370300200241c8046a41206a221e200241c8056a41206a290300370300200241c8046a41186a221f200241c8056a41186a290300370300200241c8046a41106a2220200241c8056a41106a290300370300200241c8046a41086a2221200241c8056a41086a290300370300200220022903c8053703c804200241a8036a41186a2018290300370300200241a8036a41106a2019290300370300200241a8036a41086a201a29030037030020022002290388053703a803200241e8026a41386a201b290300370300200241e8026a41306a201c290300370300200241e8026a41286a201d290300370300200241e8026a41206a201e290300370300200241e8026a41186a201f290300370300200241e8026a41106a2020290300370300200241e8026a41086a2021290300370300200220022903c8043703e802200241c8026a41186a2007290300370300200241c8026a41106a2001290300370300200241c8026a41086a2006290300370300200220022903a8043703c80220024188026a41386a201529030037030020024188026a41306a201329030037030020024188026a41286a201229030037030020024188026a41206a201129030037030020024188026a41186a200c29030037030020024188026a41106a200b29030037030020024188026a41086a200a290300370300200220022903e80337038802200241e8016a41186a2004290300370300200241e8016a41106a2016290300370300200241e8016a41086a2017290300370300200220022903c8033703e8014201210d0b200241c8016a41186a2201200241a8036a41186a290300370300200241c8016a41106a2207200241a8036a41106a290300370300200241c8016a41086a2204200241a8036a41086a29030037030020024188016a41086a2206200241e8026a41086a29030037030020024188016a41106a220a200241e8026a41106a29030037030020024188016a41186a220b200241e8026a41186a29030037030020024188016a41206a220c200241e8026a41206a29030037030020024188016a41286a2211200241e8026a41286a29030037030020024188016a41306a2212200241e8026a41306a29030037030020024188016a41386a2213200241e8026a41386a290300370300200220022903a8033703c801200220022903e80237038801200241e8006a41186a2215200241c8026a41186a290300370300200241e8006a41106a2216200241c8026a41106a290300370300200241e8006a41086a2217200241c8026a41086a290300370300200241286a41386a221820024188026a41386a290300370300200241286a41306a221920024188026a41306a290300370300200241286a41286a221a20024188026a41286a290300370300200241286a41206a221b20024188026a41206a290300370300200241286a41186a221c20024188026a41186a290300370300200241286a41106a221d20024188026a41106a290300370300200241286a41086a221e20024188026a41086a290300370300200220022903c8023703682002200229038802370328200241086a41186a221f200241e8016a41186a290300370300200241086a41106a2220200241e8016a41106a290300370300200241086a41086a2221200241e8016a41086a290300370300200220022903e801370308200041186a2008360200200020093703102000200d37030820002005370300200020022903c80137021c200041246a20042903003702002000412c6a2007290300370200200041346a2001290300370200200020022903880137023c200041c4006a2006290300370200200041cc006a200a290300370200200041d4006a200b290300370200200041dc006a200c290300370200200041e4006a2011290300370200200041ec006a2012290300370200200041f4006a2013290300370200200041fc006a200336020020004198016a201529030037030020004190016a201629030037030020004188016a201729030037030020004180016a2002290368370300200041d8016a2018290300370300200041d0016a2019290300370300200041c8016a201a290300370300200041c0016a201b290300370300200041b8016a201c290300370300200041b0016a201d290300370300200041a8016a201e290300370300200041a0016a2002290328370300200041f8016a201f290300370300200041f0016a2020290300370300200041e8016a2021290300370300200041e0016a20022903083703000c050b200741ff0171450d03200241003a00e8090c030b200741ff0171450d02200241003a00e8090c020b200741ff0171450d01200241003a00e8090c010b200042023703080c010b200042023703080b200241900a6a24000ba24607047f017e017f027e047f077e107f230041b00e6b220224000240024002402001280200220328020422044108490d002003280200220529000021062003200441786a3602042003200541086a360200200128020022032802042205450d01200328020022072d0000210420032005417f6a3602042003200741016a360200200441014b0d010240024002400240024002400240024020040e020001000b2001280200220328020422044108490d082003280200220529000021082003200441786a3602042003200541086a36020041002103200241003a00880d024002400240024002400340200128020022042802042205450d01200241e80c6a20036a200428020022072d00003a000020042005417f6a3602042004200741016a3602002002200341016a22033a00880d20034120470d000b200241b00d6a41186a200241e80c6a41186a2903002209370300200241a80c6a41086a2203200241e80c6a41086a290300370300200241a80c6a41106a2204200241e80c6a41106a290300370300200241a80c6a41186a22052009370300200220022903e80c3703a80c200241a8086a41186a22072005290300370300200241a8086a41106a22052004290300370300200241a8086a41086a22042003290300370300200220022903a80c3703a808200241a8056a41186a2007290300370300200241a8056a41106a2005290300370300200241a8056a41086a2004290300370300200220022903a8083703a80541002103200241003a00880d0340200128020022042802042205450d02200241e80c6a20036a200428020022072d00003a000020042005417f6a3602042004200741016a3602002002200341016a22033a00880d20034120470d000b200241b00d6a41186a200241e80c6a41186a2903002209370300200241a80c6a41086a2204200241e80c6a41086a290300370300200241a80c6a41106a2205200241e80c6a41106a290300370300200241a80c6a41186a22072009370300200220022903e80c3703a80c20012802002203280204220a4104490d0d2003280200220b280000210c2003200a417c6a3602042003200b41046a360200200241c8066a41086a2004290300370300200241c8066a41106a2005290300370300200241c8066a41186a2007290300370300200220022903a80c3703c80641002103200241003a00a80d0340200128020022042802042205450d03200241e80c6a20036a200428020022072d00003a000020042005417f6a3602042004200741016a3602002002200341016a22033a00a80d200341c000470d000b200241b00d6a41086a2203200241e80c6a41086a290300370300200241b00d6a41106a2204200241e80c6a41106a290300370300200241b00d6a41186a2205200241e80c6a41186a290300370300200241b00d6a41206a2207200241e80c6a41206a290300370300200241b00d6a41286a220a200241e80c6a41286a290300370300200241b00d6a41306a220b200241e80c6a41306a290300370300200241b00d6a41386a220d200241e80c6a41386a290300370300200220022903e80c3703b00d200241a80c6a41086a2003290300220e370300200241a80c6a41106a20042903002209370300200241a80c6a41186a2005290300220f370300200241a80c6a41206a20072903002210370300200241a80c6a41286a200a2903002211370300200241a80c6a41306a200b2903002212370300200241a80c6a41386a2203200d290300370300200220022903b00d22133703a80c200241a8086a41306a2012370300200241a8086a41286a2011370300200241a8086a41206a2010370300200241a8086a41186a200f370300200241a8086a41106a2009370300200241a8086a41386a20032903002214370300200241e8076a41306a22032012370300200241e8076a41286a22042011370300200241e8076a41206a22052010370300200241e8076a41186a2207200f370300200241e8076a41106a220a2009370300200241e8076a41086a220b200e370300200241e8076a41386a220d2014370300200220133703e807200241c8056a41386a200d290300370300200241c8056a41306a2003290300370300200241c8056a41286a2004290300370300200241c8056a41206a2005290300370300200241c8056a41186a2007290300370300200241c8056a41106a200a290300370300200241c8056a41086a200b290300370300200220022903e8073703c805200241a8066a41186a2203200241c8066a41186a290300370300200241a8066a41106a2204200241c8066a41106a290300370300200241a8066a41086a2205200241c8066a41086a290300370300200220022903c8063703a80620024188066a41186a200329030037030020024188066a41106a200429030037030020024188066a41086a2005290300370300200220022903a8063703880641002103200241003a00880d0340200128020022042802042205450d04200241e80c6a20036a200428020022072d00003a000020042005417f6a3602042004200741016a3602002002200341016a22033a00880d20034120470d000b200241b00d6a41186a200241e80c6a41186a2903002209370300200241a80c6a41086a2204200241e80c6a41086a290300370300200241a80c6a41106a2205200241e80c6a41106a290300370300200241a80c6a41186a22072009370300200220022903e80c3703a80c20012802002203280204220a4104490d0d2003280200220d280000210b2003200a417c6a3602042003200d41046a360200200241c8066a41086a2004290300370300200241c8066a41106a2005290300370300200241c8066a41186a2007290300370300200220022903a80c3703c80641002103200241003a00a80d0340200128020022042802042205450d05200241e80c6a20036a200428020022072d00003a000020042005417f6a3602042004200741016a3602002002200341016a22033a00a80d200341c000470d000b200241b00d6a41086a2201200241e80c6a41086a290300370300200241b00d6a41106a2203200241e80c6a41106a290300370300200241b00d6a41186a2204200241e80c6a41186a290300370300200241b00d6a41206a2205200241e80c6a41206a290300370300200241b00d6a41286a2207200241e80c6a41286a290300370300200241b00d6a41306a220a200241e80c6a41306a290300370300200241b00d6a41386a220d200241e80c6a41386a290300370300200220022903e80c3703b00d200241a80c6a41386a2215200d290300370300200241a80c6a41306a200a2903002209370300200241a80c6a41286a2007290300220f370300200241a80c6a41206a20052903002210370300200241a80c6a41186a20042903002211370300200241a80c6a41106a20032903002212370300200241a80c6a41086a2001290300220e370300200220022903b00d22133703a80c200241a8086a41306a22012009370300200241a8086a41286a2203200f370300200241a8086a41206a22042010370300200241a8086a41186a22052011370300200241a8086a41106a22072012370300200241a8086a41086a220a200e370300200241a8086a41386a220d2015290300370300200220133703a808200241e8076a41386a2215200d290300370300200241e8076a41306a220d2001290300370300200241e8076a41286a22012003290300370300200241e8076a41206a22032004290300370300200241e8076a41186a22042005290300370300200241e8076a41106a22052007290300370300200241e8076a41086a2207200a290300370300200220022903a8083703e807200241e8036a41386a220a2015290300370300200241e8036a41306a2215200d290300370300200241e8036a41286a220d2001290300370300200241e8036a41206a22012003290300370300200241e8036a41186a22032004290300370300200241e8036a41106a22042005290300370300200241e8036a41086a22052007290300370300200220022903e8073703e803200241a8066a41186a2207200241c8066a41186a290300370300200241a8066a41106a2216200241c8066a41106a290300370300200241a8066a41086a2217200241c8066a41086a290300370300200220022903c8063703a806200241a8046a41186a22182007290300370300200241a8046a41106a22072016290300370300200241a8046a41086a22162017290300370300200220022903a8063703a804200241c8036a41186a2217200241a8056a41186a290300370300200241c8036a41106a2219200241a8056a41106a290300370300200241c8036a41086a221a200241a8056a41086a290300370300200220022903a8053703c80320024188056a41186a221b20024188066a41186a29030037030020024188056a41106a221c20024188066a41106a29030037030020024188056a41086a221d20024188066a41086a290300370300200220022903880637038805200241c8046a41386a221e200241c8056a41386a290300370300200241c8046a41306a221f200241c8056a41306a290300370300200241c8046a41286a2220200241c8056a41286a290300370300200241c8046a41206a2221200241c8056a41206a290300370300200241c8046a41186a2222200241c8056a41186a290300370300200241c8046a41106a2223200241c8056a41106a290300370300200241c8046a41086a2224200241c8056a41086a290300370300200220022903c8053703c804200241a8036a41186a201b290300370300200241a8036a41106a201c290300370300200241a8036a41086a201d29030037030020022002290388053703a803200241e8026a41386a201e290300370300200241e8026a41306a201f290300370300200241e8026a41286a2020290300370300200241e8026a41206a2021290300370300200241e8026a41186a2022290300370300200241e8026a41106a2023290300370300200241e8026a41086a2024290300370300200220022903c8043703e802200241c8026a41186a2018290300370300200241c8026a41106a2007290300370300200241c8026a41086a2016290300370300200220022903a8043703c80220024188026a41386a200a29030037030020024188026a41306a201529030037030020024188026a41286a200d29030037030020024188026a41206a200129030037030020024188026a41186a200329030037030020024188026a41106a200429030037030020024188026a41086a2005290300370300200220022903e80337038802200241e8016a41186a2017290300370300200241e8016a41106a2019290300370300200241e8016a41086a201a290300370300200220022903c8033703e801420021090c060b200341ff0171450d0c200241003a00880d0c0c0b200341ff0171450d0b200241003a00880d0c0b0b200341ff0171450d0a200241003a00a80d0c0a0b200341ff0171450d09200241003a00880d0c090b200341ff0171450d08200241003a00a80d0c080b2001280200220328020422044108490d072003280200220529000021082003200441786a3602042003200541086a36020041002103200241003a00880d0340200128020022042802042205450d02200241e80c6a20036a200428020022072d00003a000020042005417f6a3602042004200741016a3602002002200341016a22033a00880d20034120470d000b200241b00d6a41186a200241e80c6a41186a2903002209370300200241a80c6a41086a2203200241e80c6a41086a290300370300200241a80c6a41106a2204200241e80c6a41106a290300370300200241a80c6a41186a22052009370300200220022903e80c3703a80c200241a8086a41186a22072005290300370300200241a8086a41106a22052004290300370300200241a8086a41086a22042003290300370300200220022903a80c3703a808200241a8056a41186a2007290300370300200241a8056a41106a2005290300370300200241a8056a41086a2004290300370300200220022903a8083703a80541002103200241003a00880d0340200128020022042802042205450d03200241e80c6a20036a200428020022072d00003a000020042005417f6a3602042004200741016a3602002002200341016a22033a00880d20034120470d000b200241b00d6a41186a200241e80c6a41186a2903002209370300200241a80c6a41086a2204200241e80c6a41086a290300370300200241a80c6a41106a2205200241e80c6a41106a290300370300200241a80c6a41186a22072009370300200220022903e80c3703a80c20012802002203280204220a4104490d072003280200220b280000210c2003200a417c6a3602042003200b41046a360200200241c8066a41086a2004290300370300200241c8066a41106a2005290300370300200241c8066a41186a2007290300370300200220022903a80c3703c80641002103200241003a00a80d0340200128020022042802042205450d04200241e80c6a20036a200428020022072d00003a000020042005417f6a3602042004200741016a3602002002200341016a22033a00a80d200341c000470d000b200241b00d6a41086a2203200241e80c6a41086a290300370300200241b00d6a41106a2204200241e80c6a41106a290300370300200241b00d6a41186a2205200241e80c6a41186a290300370300200241b00d6a41206a2207200241e80c6a41206a290300370300200241b00d6a41286a220a200241e80c6a41286a290300370300200241b00d6a41306a220b200241e80c6a41306a290300370300200241b00d6a41386a220d200241e80c6a41386a290300370300200220022903e80c3703b00d200241a80c6a41086a2003290300220e370300200241a80c6a41106a20042903002209370300200241a80c6a41186a2005290300220f370300200241a80c6a41206a20072903002210370300200241a80c6a41286a200a2903002211370300200241a80c6a41306a200b2903002212370300200241a80c6a41386a2203200d290300370300200220022903b00d22133703a80c200241a8086a41306a2012370300200241a8086a41286a2011370300200241a8086a41206a2010370300200241a8086a41186a200f370300200241a8086a41106a2009370300200241a8086a41386a20032903002214370300200241e8076a41306a22032012370300200241e8076a41286a22042011370300200241e8076a41206a22052010370300200241e8076a41186a2207200f370300200241e8076a41106a220a2009370300200241e8076a41086a220b200e370300200241e8076a41386a220d2014370300200220133703e807200241c8056a41386a200d290300370300200241c8056a41306a2003290300370300200241c8056a41286a2004290300370300200241c8056a41206a2005290300370300200241c8056a41186a2007290300370300200241c8056a41106a200a290300370300200241c8056a41086a200b290300370300200220022903e8073703c805200241a8066a41186a2203200241c8066a41186a290300370300200241a8066a41106a2204200241c8066a41106a290300370300200241a8066a41086a2205200241c8066a41086a290300370300200220022903c8063703a80620024188066a41186a200329030037030020024188066a41106a200429030037030020024188066a41086a2005290300370300200220022903a8063703880641002103200241003a00880d0340200128020022042802042205450d05200241e80c6a20036a200428020022072d00003a000020042005417f6a3602042004200741016a3602002002200341016a22033a00880d20034120470d000b200241b00d6a41186a200241e80c6a41186a2903002209370300200241a80c6a41086a2204200241e80c6a41086a290300370300200241a80c6a41106a2205200241e80c6a41106a290300370300200241a80c6a41186a22072009370300200220022903e80c3703a80c20012802002203280204220a4104490d072003280200220d280000210b2003200a417c6a3602042003200d41046a360200200241c8066a41086a2004290300370300200241c8066a41106a2005290300370300200241c8066a41186a2007290300370300200220022903a80c3703c80641002103200241003a00a80d0340200128020022042802042205450d06200241e80c6a20036a200428020022072d00003a000020042005417f6a3602042004200741016a3602002002200341016a22033a00a80d200341c000470d000b200241b00d6a41086a2201200241e80c6a41086a290300370300200241b00d6a41106a2203200241e80c6a41106a290300370300200241b00d6a41186a2204200241e80c6a41186a290300370300200241b00d6a41206a2205200241e80c6a41206a290300370300200241b00d6a41286a2207200241e80c6a41286a290300370300200241b00d6a41306a220a200241e80c6a41306a290300370300200241b00d6a41386a220d200241e80c6a41386a290300370300200220022903e80c3703b00d200241a80c6a41386a2215200d290300370300200241a80c6a41306a200a2903002209370300200241a80c6a41286a2007290300220f370300200241a80c6a41206a20052903002210370300200241a80c6a41186a20042903002211370300200241a80c6a41106a20032903002212370300200241a80c6a41086a2001290300220e370300200220022903b00d22133703a80c200241a8086a41306a22012009370300200241a8086a41286a2203200f370300200241a8086a41206a22042010370300200241a8086a41186a22052011370300200241a8086a41106a22072012370300200241a8086a41086a220a200e370300200241a8086a41386a220d2015290300370300200220133703a808200241e8076a41386a2215200d290300370300200241e8076a41306a220d2001290300370300200241e8076a41286a22012003290300370300200241e8076a41206a22032004290300370300200241e8076a41186a22042005290300370300200241e8076a41106a22052007290300370300200241e8076a41086a2207200a290300370300200220022903a8083703e807200241e8036a41386a220a2015290300370300200241e8036a41306a2215200d290300370300200241e8036a41286a220d2001290300370300200241e8036a41206a22012003290300370300200241e8036a41186a22032004290300370300200241e8036a41106a22042005290300370300200241e8036a41086a22052007290300370300200220022903e8073703e803200241a8066a41186a2207200241c8066a41186a290300370300200241a8066a41106a2216200241c8066a41106a290300370300200241a8066a41086a2217200241c8066a41086a290300370300200220022903c8063703a806200241a8046a41186a22182007290300370300200241a8046a41106a22072016290300370300200241a8046a41086a22162017290300370300200220022903a8063703a804200241c8036a41186a2217200241a8056a41186a290300370300200241c8036a41106a2219200241a8056a41106a290300370300200241c8036a41086a221a200241a8056a41086a290300370300200220022903a8053703c80320024188056a41186a221b20024188066a41186a29030037030020024188056a41106a221c20024188066a41106a29030037030020024188056a41086a221d20024188066a41086a290300370300200220022903880637038805200241c8046a41386a221e200241c8056a41386a290300370300200241c8046a41306a221f200241c8056a41306a290300370300200241c8046a41286a2220200241c8056a41286a290300370300200241c8046a41206a2221200241c8056a41206a290300370300200241c8046a41186a2222200241c8056a41186a290300370300200241c8046a41106a2223200241c8056a41106a290300370300200241c8046a41086a2224200241c8056a41086a290300370300200220022903c8053703c804200241a8036a41186a201b290300370300200241a8036a41106a201c290300370300200241a8036a41086a201d29030037030020022002290388053703a803200241e8026a41386a201e290300370300200241e8026a41306a201f290300370300200241e8026a41286a2020290300370300200241e8026a41206a2021290300370300200241e8026a41186a2022290300370300200241e8026a41106a2023290300370300200241e8026a41086a2024290300370300200220022903c8043703e802200241c8026a41186a2018290300370300200241c8026a41106a2007290300370300200241c8026a41086a2016290300370300200220022903a8043703c80220024188026a41386a200a29030037030020024188026a41306a201529030037030020024188026a41286a200d29030037030020024188026a41206a200129030037030020024188026a41186a200329030037030020024188026a41106a200429030037030020024188026a41086a2005290300370300200220022903e80337038802200241e8016a41186a2017290300370300200241e8016a41106a2019290300370300200241e8016a41086a201a290300370300200220022903c8033703e801420121090b200241c8016a41186a2201200241a8036a41186a290300370300200241c8016a41106a2203200241a8036a41106a290300370300200241c8016a41086a2204200241a8036a41086a29030037030020024188016a41086a2205200241e8026a41086a29030037030020024188016a41106a2207200241e8026a41106a29030037030020024188016a41186a220a200241e8026a41186a29030037030020024188016a41206a220d200241e8026a41206a29030037030020024188016a41286a2215200241e8026a41286a29030037030020024188016a41306a2216200241e8026a41306a29030037030020024188016a41386a2217200241e8026a41386a290300370300200220022903a8033703c801200220022903e80237038801200241e8006a41186a2218200241c8026a41186a290300370300200241e8006a41106a2219200241c8026a41106a290300370300200241e8006a41086a221a200241c8026a41086a290300370300200241286a41386a221b20024188026a41386a290300370300200241286a41306a221c20024188026a41306a290300370300200241286a41286a221d20024188026a41286a290300370300200241286a41206a221e20024188026a41206a290300370300200241286a41186a221f20024188026a41186a290300370300200241286a41106a222020024188026a41106a290300370300200241286a41086a222120024188026a41086a290300370300200220022903c8023703682002200229038802370328200241086a41186a2222200241e8016a41186a290300370300200241086a41106a2223200241e8016a41106a290300370300200241086a41086a2224200241e8016a41086a290300370300200220022903e801370308200041186a200c360200200020083703102000200937030820002006370300200020022903c80137021c200041246a20042903003702002000412c6a2003290300370200200041346a2001290300370200200020022903880137023c200041c4006a2005290300370200200041cc006a2007290300370200200041d4006a200a290300370200200041dc006a200d290300370200200041e4006a2015290300370200200041ec006a2016290300370200200041f4006a2017290300370200200041fc006a200b36020020004198016a201829030037030020004190016a201929030037030020004188016a201a29030037030020004180016a2002290368370300200041d8016a201b290300370300200041d0016a201c290300370300200041c8016a201d290300370300200041c0016a201e290300370300200041b8016a201f290300370300200041b0016a2020290300370300200041a8016a2021290300370300200041a0016a2002290328370300200041f8016a2022290300370300200041f0016a2023290300370300200041e8016a2024290300370300200041e0016a20022903083703000c070b200341ff0171450d05200241003a00880d0c050b200341ff0171450d04200241003a00880d0c040b200341ff0171450d03200241003a00a80d0c030b200341ff0171450d02200241003a00880d0c020b200341ff0171450d01200241003a00a80d0c010b200042023703080c010b200042023703080b200241b00e6a24000bef0301037f230041106b2205240041002106200541003602082005420137030002402000280200220741024b0d00024002400240024020070e03000102000b200541004101106d2005280200200528020822066a41003a00002005200641016a3602082005200536020c200041086a2005410c6a109c0120002802042106200520052802084104106d2005280200200528020822006a2006360000200041046a21060c020b200541004101106d2005280200200528020822066a41013a00002005200641016a3602082005200536020c200041086a2005410c6a109c0120002802042106200520052802084104106d2005280200200528020822006a2006360000200041046a21060c010b200541004101106d2005280200200528020822066a41023a00002005200641016a3602082005200536020c200041086a2005410c6a109c0120002802042106200520052802084104106d2005280200200528020822006a2006360000200041046a21060b200520063602080b2005220020064108106d2005280200200528020822066a20033700002005200641086a2206360208200020064108106d2005280200200528020822066a20043700002005200641086a22063602082002200528020020062001108303210602402005280204450d00200528020010260b200541106a240020060b8f0201027f20014180feff07714108762102024002402001410171450d00411f210341e9b6c700210102400240200241ff01710e03000103000b41c100210341a8b6c70021010c020b41c100210341e7b5c70021010c010b411f210341c8b5c7002101024002400240024002400240024002400240200241ff01710e0a00060102030405090708000b4120210341a8b5c70021010c080b4127210341c8b4c70021010c070b4117210341b1b4c70021010c060b4192b4c70021010c050b4126210341ecb3c70021010c040b412b210341c1b3c70021010c030b4139210341efb4c70021010c020b413b21034186b3c70021010c010b41d200210341b4b2c70021010b20002003360204200020013602000bbc1103077f017e0e7f230041b0096b2203240041002104200341003602a806200320023602a406200320013602a0064101210541012106024002400240024002400240024002400240024002400240024002400240024002400240024002402002450d0041012107200341013602a806024020012d000022080d000c020b024002400240024002400240024002400240024002400240200841c00171220741c001460d0002402007418001460d0041012106200741c000470d0d410121072008413f712204413f470d034102210741412106034002402007417f6a2002490d00410121060c0f0b200320073602a806200120076a417f6a2d0000220441ff01470d03200641817e6a210641012109200741016a2207418302470d000b418202210741ffff0321040c0b0b4200210a410121072008413f712204413f470d0441022107414121044101210603402007417f6a20024f0d0d200320073602a806200120076a417f6a2d0000220841ff01470d04200441817e6a2104200741016a2207418302470d000b4200210a0c050b428002210a410121072008413f712204413f470d03410221074141210441012106024003402007417f6a20024f0d0d200320073602a806200120076a417f6a2d0000220841ff01470d01200441817e6a2104200741016a2207418302470d000b428002210a0c050b200820046b21040c030b200420066b21040b200441017122090d070c080b200820046b21040b200a502108200441017122090d010c020b200a502108418202210741ffff032104410121090b200720024f0d0141002106200120076a2d000041104f0d050b410121062007200441016a4101766a220b20024b0d042003200b3602a806200b41026a220420024b0d04200320043602a806200b417e4f0d012001200b6a2f0000210c410021044100210d024020080d00200341106a200341a0066a10d30420032802100d0520032802a806220e20032802146a220f20032802a4064b0d052003200f3602a8064101210d0b200341023602a40920034102360298092003410236028c092003410236028009200341023602f408200341023602e808200341023602dc08200341023602d008200341023602c408200341023602b808200341023602ac08200341023602a00820034102360294082003410236028808200341023602fc07200341023602f007200341f0076a2106200c41ffff037121100340024020102004410f7176410171450d00200341086a200341a0066a10d3040240024020032802080d0020032802a806220c200328020c22116a220820032802a4064d0d010b410121060c070b200320083602a806200641086a2008360200200641046a200c360200200620114120473602000b2006410c6a2106200441016a22044110470d000b200341e0046a200341f0076a41c00110cf061a410421040c050b2007200241b8d8c40010320c060b200b20044198d8c4001048000b200720024f0d0341002106200120076a2d000041104f0d010b410121062007200441016a4101766a220b20024b0d002003200b3602a8062003200341a0066a10d30420032802000d0020032802a806220d20032802046a220e20032802a4064b0d002003200e3602a806200341e0046a200341f0076a41c00110cf061a410121040c010b200341a0036a200341e0046a41c00110cf061a200020063a00010c0e0b200341a0036a200341e0046a41c00110cf061a200341c0016a41186a200f360200200341c0016a41146a200e360200200341c0016a41106a200d360200200341c0016a410c6a2009360200200341c0016a41086a200b360200200320073602c401200320043602c001200341c0016a411c6a200341a0036a41c00110cf062112410021054100211320040e050c020101030c0b2007200241a8d8c4001032000b000b200b2007490d01200b20024b0d02200e200d490d03200e20024b0d04200b20076b2108200120076a21062001200d6a2114200e200d6b2115410121130c090b200341023602a40920034102360298092003410236028c092003410236028009200341023602f408200341023602e808200341023602dc08200341023602d008200341023602c408200341023602b808200341023602ac08200341023602a00820034102360294082003410236028808200341023602fc07200341023602f007410021060340410221080240201220066a220428020041024622100d004100200420101b220841086a2802002104200841046a280200210c0240024020082802004101470d002004200c490d0841012108200420024d0d012004200241dcbdc7001047000b2004200c490d0841002108200420024b0d090b2004200c6b21112001200c6a210c0b200341f0076a20066a22042008360200200441086a2011360200200441046a200c3602002006410c6a220641c001460d080c000b0b2007200b41d4bec7001048000b200b200241d4bec7001047000b200d200e41e4bec7001048000b200e200241e4bec7001047000b200c200441dcbdc7001048000b200c200441ecbdc7001048000b2004200241ecbdc7001047000b02400240200d4101460d00410021110c010b200f200e490d03200f20024b0d04200f200e6b210c2001200e6a21110b200b2007490d04200b20024b0d05200341f8076a280200211620032802f407211520032802f0072114200341186a200341fc076a41a80110cf061a200b20076b2108200120076a2106200341ac096a2802002110200341a8096a280200211720032802a4092118410421130b2000411c6a2016360200200041186a2015360200200041146a2014360200200041106a20093602002000410c6a2008360200200041086a2006360200200041046a2013360200200041206a200341186a41a80110cf061a200041d8016a200c360200200041d4016a2011360200200041d0016a2010360200200041cc016a2017360200200041c8016a20183602000b200020053a0000200341b0096a24000f0b200e200f41f4bec7001048000b200f200241f4bec7001047000b2007200b41d4bec7001048000b200b200241d4bec7001047000b890301077f41012102024002402001280208220341016a2204200128020422054d0d000c010b0240024002400240200320054f0d002001280200220620036a2d00002107200120043602080240200741037122084103460d0002400240024020080e03000102000b20074102762108410021020c070b0240200341026a220320054d0d000c070b200120033602082004417f460d03200620046a2d0000410874200772220141ffff0371418002490d06200141fcff03714102762108410021020c060b200341046a220320054b0d05200120033602082004417d4f0d03200620046a22012f0000200141026a2d000041107472410874200772220141808004492102200141027621080c050b0240200741034d0d000c050b200341056a220320054b0d04200120033602082004417c4f0d03200620046a28000022084180808080044921020c040b200320054180b8c7001032000b417f20034188b7c7001048000b200420034188b7c7001048000b200420034188b7c7001048000b20002008360204200020023602000b130020004105360204200041c8d8c4003602000bcf0101047f200041ffff03200041ffff03491b22032000413e2003413e491b22006b21042003413f20032000461b20016a2100200241086a2103410121010340024002400240200141ff01714102470d00200021050c010b410021052001410171450d00410021010c010b024002402004450d002004418002490d01200441817e6a210441ff012100410221010c020b0f0b2004417f6a210041022101410021040b200220032802004101106d2002280200200328020022066a20003a00002003200641016a360200200521000c000b0bc03708057f017e0a7f017e037f017e037f057e230041f0016b220324000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402001280200417f6a0e0a00010203090807060504000b20022d0001210420022d00002101200228022422022002280200417f6a22053602000240024020010d00024020050d002002280208200228020c2802001103000240200228020c280204450d00200228020810260b20022002280204417f6a220136020420010d00200210260b200441ff01710d012000420037030820002003280070360019200041186a41003a00002000411c6a200341f3006a280000360000200042003703000c170b20050d002002280208200228020c2802001103000240200228020c280204450d00200228020810260b20022002280204417f6a220136020420010d00200210260b200341e0006a41026a200341c0006a41026a2d000022023a0000200320032f004022013b0160200041206a41023a0000200041186a41003a000020004200370308200020013b0021200041236a20023a0000200042013703000c150b200141086a280200210520022d0001210620022d0000210420012802042107200228022422022002280200417f6a22013602000240024020040d00024020010d002002280208200228020c2802001103000240200228020c280204450d00200228020810260b20022002280204417f6a220136020420010d00200210260b200641ff01714101470d0102402005450d00200710260b2000420037030820002003280070360019200041186a41003a00002000411c6a200341f3006a280000360000200042003703000c160b20010d002002280208200228020c2802001103000240200228020c280204450d00200228020810260b20022002280204417f6a220136020420010d00200210260b02402005450d00200710260b200341e0006a41026a200341c0006a41026a2d000022023a0000200320032f004022013b0160200041206a41023a0000200041186a41003a000020004200370308200020013b0021200041236a20023a0000200042013703000c140b200141086a290300210820022d0001210420022d00002101200228022422022002280200417f6a220536020002400240024020010d00024020050d002002280208200228020c2802001103000240200228020c280204450d00200228020810260b20022002280204417f6a220136020420010d00200210260b200441ff01710d014108102422020d020c170b20050d002002280208200228020c2802001103000240200228020c280204450d00200228020810260b20022002280204417f6a220136020420010d00200210260b200341306a41026a200341e0006a41026a2d000022023a0000200320032f006022013b0130200041206a41023a0000200041186a41003a000020004200370308200020013b0021200041236a20023a0000200042013703000c140b2003420837027420032002360270200341f0006a41004108106d20032802702202200328027822016a20083700002003200141086a220136027841b0dfc400410a2002200110b30102402003280274450d00200210260b200041186a41003a000020004200370308200020032800403600192000411c6a200341c3006a280000360000200042003703000c130b2001410c6a2802002109200141086a28020021052001280204210720022d0001210620022d00002101200228022422022002280200417f6a220436020002400240024020010d00024020040d002002280208200228020c2802001103000240200228020c280204450d00200228020810260b20022002280204417f6a220136020420010d00200210260b200641ff01710d01200341f0006a2007200910d70420032802702202450d10200328027421062003200341f8006a28020036023420032002360230200341106a200341306a108f01410221044100210a2003280210450d020c0e0b20040d002002280208200228020c2802001103000240200228020c280204450d00200228020810260b20022002280204417f6a220136020420010d00200210260b410221022003413c6a41026a20032d00433a0000200320032f00413b013c0c120b2003280234220b20032802142201490d0b02402001417f4c0d000240024020010d004100210c4101210d0c010b2001102a220d450d152003280234210b2001210c0b02400240200b2001490d00200d2003280230200110cf06210a2003280234220b20014f0d012001200b41b8afc0001048000b4100210a200c450d0d200d10260c0e0b2003200b20016b3602342003200328023020016a3602300240200a0d004100210a0c0e0b200341086a200341306a108f0120032802080d092003280234220e200328020c220b490d09200b417f4c0d0002400240200b0d004100210d4101210f0c010b200b102a220f450d152003280234210e200b210d0b02400240200e200b490d00200f2003280230200b10cf0621102003280234220e200b4f0d01200b200e41b8afc0001048000b200d450d0a200f10260c0a0b2003200e200b6b220e36023420032003280230200b6a220b3602302010450d09024002400240200e4104490d002003200b41046a3602302003200e417c6a221136023420114104490d01200b28000421112003200b41086a3602302003200e41786a221236023420124104490d0a2003200e41746a3602342003200b410c6a3602302003200341306a108f012003280200450d020c0b0b0240200d450d00201010260b200c450d0c0c0d0b0240200d450d00201010260b200c450d0b0c0c0b200328020422122003280234410c6e220b200b20124b1bad420c7e2208422088a70d002008a7220b417f4c0d0002400240200b0d004104210e0c010b200b1024220e450d150b200b410c6ead210802402012450d000340200341e0006a200341306a10d8040240024002400240024020032d00604101460d002003280234220b4104490d00200329006121132003280230221428000021152003200b417c6a3602342003201441046a3602302008422088a7220b2008a7470d040240200b41016a2214200b490d00200b4101742216201420142016491b22144104201441044b1bad420c7e2217422088a722160d002017a722144100480d00200b410c6c2018200b1b21180240200e4100200b1b220e0d0020140d034100410420164100471b210e0c050b20182014460d04024020180d0020140d034104210e0c050b200e201820141028220e450d030c040b102e000b2008a72201450d0e2001410c6c450d0e200e10260c0e0b20141024220e0d010b102c000b2008428080808070832014410c6ead8421080b200e2008422088a7410c6c6a220b2015360208200b201337020020084280808080107c21082012417f6a22120d000b0b200e450d082008a7210b02402003280234221241044f0d000240200b450d00200b410c6c450d00200e10260b0240200d450d00201010260b200c450d0b0c0c0b20032012417c6a3602342003200328023041046a36023041012104200a210a0c0d0b1034000b2002411a6a2901002108200241196a2d00002107200241186a2d00002106200241166a2f01002109200241156a2d0000210a200241146a2d0000210b200241126a2f0100210c200241116a2d0000210d200241106a2d0000210f2002410e6a2f0100210e2002410d6a2d000021112002410c6a2d000021102002410a6a2f01002112200241096a2d00002114200241086a2d00002115200241066a2f01002118200241056a2d00002116200241046a2d00002119200241026a2f0100211a20022d0001210420022d00002101200228022422022002280200417f6a22053602000240024002400240024002400240024020010d00024020050d002002280208200228020c2802001103000240200228020c280204450d00200228020810260b20022002280204417f6a220136020420010d00200210260b41012102200441ff01714101470d0120032008370358200320073a0057200320063a0056200320093b01542003200a3a00532003200b3a00522003200c3b01502003200d3a004f2003200f3a004e2003200e3b014c200320113a004b200320103a004a200320123b0148200320143a0047200320153a0046200320183b0144200320163a0043200320193a00422003201a3b0140200341e0006a200341c0006a10d803200341f0006a20032802602201200328026810d9034200210842002113420021174200211b4200211c4200211d4200211e4200211f024020032903704201520d0020032d00bc0145210220034180016a290300211f20034190016a290300211320034188016a2903002108200341a0016a290300211b20034198016a2903002117200341b0016a290300211d200341a8016a290300211c2003290378211e0b02402003280264450d00200110260b2002450d032017200884201c84201e84201b201384201d84201f848450450d02200341f0006a200341c0006a10d803200341186a20032802702201200328027841d4c0c700410041001081022003280218210202402003280274450d00200110260b024020024101470d00200341e0006a200341c0006a10d803200341f0006a200328026022022003280268220510d9030240200329037042015222010d002002200510ff010b200120032d00bc014572210102402003280264450d00200210260b20010d0041002802c8c2474104490d0041002802c4c247210241002802c0c247210141002802ccc2472105200341b0016a41ca09360200200341a8016a42dd80808010370300200341a4016a4180d3c4003602002003419c016a420c37020020034198016a41dadfc40036020020034190016a42003703002003418c016a41d4c0c70036020020034180016a4201370300200341f8006a4106360200200341ccdfc40036027c200341d4dfc40036027420034104360270200141c8a1c000200541024622051b200341f0006a200241b0a1c00020051b2802101102000b200341f0006a41086a41043a0000200341f9006a200329034037000020034181016a200341c0006a41086a29030037000020034189016a200341d0006a29030037000020034191016a200341d8006a290300370000200341003a0070200341f0006a108702200341043a00300c060b20050d002002280208200228020c2802001103000240200228020c280204450d00200228020810260b20022002280204417f6a220136020420010d00200210260b200341023a00300c030b200341306a410410e6020c010b200341306a410510e6020b20032d00304104460d01200329023421080b2003280230210220002008370024200041206a2002360000200041186a41003a000020004200370308420121080c010b420021082000420037030820002003280070360019200041186a41003a00002000411c6a200341f3006a2800003600000b200020083703000c110b2001410c6a2802002109200141086a280200210520022d0001210620022d0000210420012802042107200228022422022002280200417f6a22013602000240024020040d00024020010d002002280208200228020c2802001103000240200228020c280204450d00200228020810260b20022002280204417f6a220136020420010d00200210260b200641ff01710d012007200910af0302402005450d00200710260b2000420037030820002003280070360019200041186a41003a00002000411c6a200341f3006a280000360000200042003703000c120b20010d002002280208200228020c2802001103000240200228020c280204450d00200228020810260b20022002280204417f6a220136020420010d00200210260b02402005450d00200710260b200341e0006a41026a200341c0006a41026a2d000022023a0000200320032f004022013b0160200041206a41023a0000200041186a41003a000020004200370308200020013b0021200041236a20023a0000200042013703000c100b2001410c6a2802002104200141086a280200210520022d0001210920022d0000210620012802042107200228022422022002280200417f6a22013602000240024020060d00024020010d002002280208200228020c2802001103000240200228020c280204450d00200228020810260b20022002280204417f6a220136020420010d00200210260b200941ff01710d0102402004450d0020072004410c6c6a21012007210203402002280200200241086a28020010ff012002410c6a22022001470d000b2004410c6c21012007210203400240200241046a280200450d00200228020010260b2002410c6a2102200141746a22010d000b0b02402005450d002005410c6c450d00200710260b2000420037030820002003280070360019200041186a41003a00002000411c6a200341f3006a280000360000200042003703000c110b20010d002002280208200228020c2802001103000240200228020c280204450d00200228020810260b20022002280204417f6a220136020420010d00200210260b02402004450d002004410c6c21012007210203400240200241046a280200450d00200228020010260b2002410c6a2102200141746a22010d000b0b02402005450d002005410c6c450d00200710260b200341e0006a41026a200341c0006a41026a2d000022023a0000200320032f004022013b0160200041206a41023a0000200041186a41003a000020004200370308200020013b0021200041236a20023a0000200042013703000c0f0b2001410c6a2802002104200141086a280200210520022d0001210920022d0000210620012802042107200228022422022002280200417f6a22013602000240024020060d00024020010d002002280208200228020c2802001103000240200228020c280204450d00200228020810260b20022002280204417f6a220136020420010d00200210260b200941ff01710d0102402004450d002007200441186c6a21012007210203402002280200200241086a2802002002410c6a280200200241146a28020010b301200241186a22022001470d000b200441186c21012007210203400240200241046a280200450d00200228020010260b0240200241106a280200450d002002410c6a28020010260b200241186a2102200141686a22010d000b0b02402005450d00200541186c450d00200710260b2000420037030820002003280070360019200041186a41003a00002000411c6a200341f3006a280000360000200042003703000c100b20010d002002280208200228020c2802001103000240200228020c280204450d00200228020810260b20022002280204417f6a220136020420010d00200210260b02402004450d00200441186c21012007210203400240200241046a280200450d00200228020010260b0240200241106a280200450d002002410c6a28020010260b200241186a2102200141686a22010d000b0b02402005450d00200541186c450d00200710260b200341e0006a41026a200341c0006a41026a2d000022023a0000200320032f004022013b0160200041206a41023a0000200041186a41003a000020004200370308200020013b0021200041236a20023a0000200042013703000c0e0b2001410c6a2802002106200141086a28020021092001280204210720022d0001210420022d00002101200228022422022002280200417f6a2205360200024002400240024020010d00024020050d002002280208200228020c2802001103000240200228020c280204450d00200228020810260b20022002280204417f6a220136020420010d00200210260b200441ff01710d0120074101460d0241bfdfc400410d10ff010c030b20050d002002280208200228020c2802001103000240200228020c280204450d00200228020810260b20022002280204417f6a220136020420010d00200210260b200341306a41026a200341e0006a41026a2d000022023a0000200320032f006022013b0130200041206a41023a0000200041186a41003a000020004200370308200020013b0021200041236a20023a0000200042013703000c0f0b2003410036027820034201370370200341f0006a41004104106d2003280270200328027822026a20093600002003200241046a2202360278200341f0006a20024104106d20032802702202200328027822016a20063600002003200141046a220136027841bfdfc400410d2002200110b3012003280274450d00200210260b200341fc006a2006360200200341f8006a200936020020032007360274200341043a0070200341f0006a108602200041186a41003a000020004200370308200020032800403600192000411c6a200341c3006a280000360000200042003703000c0d0b2001410c6a2802002109200141086a280200210520022d0001210620022d0000210420012802042107200228022422022002280200417f6a22013602000240024020040d00024020010d002002280208200228020c2802001103000240200228020c280204450d00200228020810260b20022002280204417f6a220136020420010d00200210260b200641ff01710d0141badfc40041052007200910b301200341f8006a41023a0000200341003a0070200341f0006a10870202402005450d00200710260b2000420037030820002003280040360019200041186a41003a00002000411c6a200341c3006a280000360000200042003703000c0e0b20010d002002280208200228020c2802001103000240200228020c280204450d00200228020810260b20022002280204417f6a220136020420010d00200210260b02402005450d00200710260b200341306a41026a200341e0006a41026a2d000022023a0000200320032f006022013b0130200041206a41023a0000200041186a41003a000020004200370308200020013b0021200041236a20023a0000200042013703000c0c0b0240200d450d00201010260b200c450d020c030b0240200d450d00201010260b200c450d010c020b200c0d010b200a210a0c020b200a1026200a210a0c010b0b02402006450d00200210260b20044102460d000240024020014106470d00200a41a88ac700460d01200a41a88ac700410610d206450d010b200341c0006a410110e6020c020b024020110d00200341c0006a410210e6020c020b200341043a00400240200c450d00200a10260b0240200d450d00200f10260b200b450d03200b410c6c450d030c020b200341c0006a410310e6020c020b0240200c450d00200a10260b0240200d450d00200f10260b200b450d01200b410c6c450d010b200e10260b2003413c6a41026a20032d00433a0000200320032f00413b013c024020032d004022024104460d00200329024421080c010b41badfc40041052007200910b301200341f8006a41023a0000200341003a0070200341f0006a10870202402005450d00200710260b2000420037030820002003280021360019200041186a41003a00002000411c6a200341246a280000360000200042003703000c010b2003412c6a41026a22012003413c6a41026a2d00003a0000200320032f013c3b012c02402005450d00200710260b200341286a41026a20012d000022013a0000200320032f012c22053b0128200041206a20023a0000200041186a41003a000020004200370308200020053b0021200041236a20013a000020002008370024200042013703000b200341f0016a24000f0b1033000b130020002002ad4220862001ad84100f10c5060be60301057f230041106b220241003a000802400240024020012802042203450d00200128020022042d0000210520012003417f6a2206360204200241013a00082001200441016a360200200220053a000020060d010c020b200041013a00000f0b200128020022042d0000210520012003417e6a22063602042001200441016a360200200241023a0008200220053a00012006450d00200128020022042d0000210520012003417d6a22063602042001200441016a360200200241033a0008200220053a00022006450d00200128020022042d0000210520012003417c6a22063602042001200441016a360200200241043a0008200220053a00032006450d00200128020022042d0000210520012003417b6a22063602042001200441016a360200200241053a0008200220053a00042006450d00200128020022042d0000210520012003417a6a22063602042001200441016a360200200241063a0008200220053a00052006450d00200128020022042d000021052001200341796a22063602042001200441016a360200200241073a0008200220053a00062006450d00200041003a0000200128020022042d000021052001200341786a3602042001200441016a360200200220053a0007200020022903003700010f0b200041013a0000200241003a00080bf10809017f017e057f017e017f017e0a7f027e037f230041e0006b2201240042002102200141d8006a22034200370300200141d0006a22044200370300200141c0006a41086a2205420037030020014200370340200141c0006a41818dc700410910fb01200141206a41acd6c000410610fb012003200141206a41086a220629000037030020042001290020370300200141206a200141c0006a10fd01200128022021072001290224210820034200370300200442003703002005420037030020014200370340200141206a41eb8cc700410a10fb012005200629000037030020012001290020370340200141206a41dc9dc600410b10fb0120032006290000370300200420012900203703002008420020071b2208422088a721092001200141c0006a10da0402400240200128020022040d00410021030c010b2001290204220a4220882202a72103200a42ffffff3f83500d00200410260b4100210b4100210c02402009450d002003417f6a20096e210c0b2007410420071b210d0240024002400240024002400240024020030d004104210e410021050c010b20034104200341044b1b220441ffffffff01712004470d01200441037422044100480d0120041024220e450d02200c20096c210f2004410376210b41002107200e21040340410021050240200f20074d0d00200c450d062007200c6e220520094f0d05200d2005412c6c6a2802002106410121050b20042005360200200441046a2006360200200441086a21042003200741016a2207470d000b200321050b200141206a4183e2c400411410a40241002104200141c0006a200141206a410041202002a74102746b2207200741204b1b22076a412020076b109601200141186a2209200141c0006a41186a22102903002202370300200141106a2211200141c0006a41106a2212290300220a370300200141086a2213200141c0006a41086a22142903002215370300200120012903402216370300200141206a41186a22172002370300200141206a41106a2218200a370300200141206a41086a2219201537030020012016370320024020034102490d0041002003417f6a2207200720034b1b2106034020012004411c71220c6a2800002003410120031b220f7021070240200c411c470d00200141c0006a20014120109601200920102903003703002011201229030037030020132014290300370300200120012903403703000b200f417f6a220c20054f0d06200720054f0d07200e200c4103746a220c2902002102200c200e20074103746a220729020037020020072002370200200441046a21042003417f6a21032006417f6a22060d000b0b200020053602082000200b3602042000200e3602002000200129032037000c200041146a20192903003700002000411c6a2018290300370000200041246a201729030037000002402008a72203450d002003412c6c450d00200d10260b200141e0006a24000f0b102e000b102c000b2005200941b8b5c5001032000b41d0b5c500411941ecb5c500102f000b200c20054198e2c4001032000b2007200541a8e2c4001032000bae07020a7f037e23004180026b220224002002412036020c20022001360208200241106a2001412010820202400240200228021022030d00200041003602000c010b200228021421042002200241186a280200360224200220033602202002200241206a108f010240024020022802000d000240024002402002280204220520022802244105762201200120054b1b22014105742206417f4c0d000240024020010d00410121070c010b200610242207450d020b41002108200241003602302002200136022c200220073602280240024002402005450d0041002109034041002106200241003a00b8012002280224417f6a2101200941016a210903402001417f460d0320024198016a20066a2002280220220a2d00003a00002002200a41016a3602202002200641016a220a3a00b801200220013602242001417f6a2101200a2106200a4120470d000b200241e0016a41186a220120024198016a41186a290300370300200241e0016a41106a220620024198016a41106a290300370300200241e0016a41086a220b20024198016a41086a29030037030020022002290398013703e001200a41ff01714120490d03200241d8006a41086a200b290300220c370300200241d8006a41106a2006290300220d370300200241d8006a41186a2001290300220e370300200241386a41186a2206200e370300200241386a41106a220a200d370300200241386a41086a220b200c370300200220022903e001220c3703782002200c3703582002200c37033802402008200228022c470d00200241286a2008410110930120022802282107200228023021080b200720084105746a22012002290338370000200141186a2006290300370000200141106a200a290300370000200141086a200b2903003700002002200841016a220836023020092005470d000b0b2007450d052000200229022c370204200020073602000c060b200641ff0171450d00200241003a00b8010b200241d8006a41186a200241f8006a41186a290300370300200228022c41ffffff3f710d020c030b1034000b1033000b200710260b200241003602e801200242013703e0012002410e3602c4012002200241086a3602c0012002200241e0016a360278200241ac016a41013602002002420137029c012002418c8dc600360298012002200241c0016a3602a801200241f8006a41c4e1c00020024198016a10351a20022802e00120022802e801108402024020022802e401450d0020022802e00110260b200041003602000b2004450d00200310260b20024180026a24000b9f06020f7f017e23004180016b22072400200741003602082007410036021820054103742108200241606a2109200741286a200110dc0420014188026a280200210a20014190026a2802002102200741d8006a410172210b200128028002210c200128028c02210d4100210e4100210f41002110410021110240024002400240024002400240024003402010417f6a2101200920104105746a2105034020024108490d02200741d8006a200d200210dd04200728026421022007280260210d200541206a2105200141016a210120072802584101200728025c22121b2d0000201241077176410171450d000b02402011200a470d002000410910ff020c070b200141016a2110201141016a2113200c201141c1006c6a2114200821122004211103402012450d04201241786a211220112802002115201141086a211120152001470d000b0240024020142d00004101470d00200741186a2112200f0d01200b2007290328370000200b41186a200741286a41186a290300370000200b41106a200741286a41106a290300370000200b41086a200741286a41086a290300370000200741013a0058200741c8006a200741d8006a2006108801200741186a41086a200741c8006a41086a2802003602002007200729034822163703182016a7210f0c010b200741086a2112200e0d00200b2007290328370000200b41186a200741286a41186a290300370000200b41106a200741286a41106a290300370000200b41086a200741286a41086a290300370000200741003a0058200741c8006a200741d8006a2006108801200741086a41086a200741c8006a41086a2802003602002007200729034822163703082016a7210e0b200120034f0d0220132111201441016a20122802002012280208200510f5020d000b2000410c10ff020c050b200a2011470d02200041043a00000c030b2001200341ace1c4001032000b2000410b10ff020c020b2000410d10ff020b0240200f450d00200728021c450d00200f10260b200e450d02200728020c0d010c020b0240200f450d00200728021c450d00200f10260b200e450d01200728020c450d010b200e10260b20074180016a24000bb70301037f230041106b22022400200241003602082002420137030020012802502103200241004104106d2002280200200228020822046a20033600002002200441046a3602082002200236020c200141e0006a2002410c6a109c012001280254200141dc006a2802002002109501200220022802084120106d2002280200200228020822046a2203200129008001370000200341086a20014188016a290000370000200341106a20014190016a290000370000200341186a20014198016a2900003700002002200441206a22033602082002200341c000106d2002280200200228020822046a220320012900a001370000200341086a200141a8016a290000370000200341106a200141b0016a290000370000200341186a200141b8016a290000370000200341206a200141c0016a290000370000200341286a200141c8016a290000370000200341306a200141d0016a290000370000200341386a200141d8016a2900003700002002200441c0006a3602082002200236020c200141e0016a2002410c6a109c0120022001109d0120002002280200200228020810960102402002280204450d00200228020010260b200241106a24000b840201037f230041306b220324002003410136020020032002410376220436020402402004450d000240024020024178714108470d002000420137020820002002360204200020013602000c010b20002001410120021b22043602002000200241077122014108723602042000410c6a200141016a2205410771200241786a417871723602002000410020054103762202200141074622011b20042002410020011b6a723602080b200341306a24000f0b2003412c6a41013602002003411c6a41023602002003420237020c200341e88bc600360208200341013602242003200341206a3602182003200341046a36022820032003360220200341086a41ecc0c700103d000b130020004114360204200041fce3c4003602000bd3a10106077f017e137f037e337f027e230041b00f6b22032400200341e0046a41206a200141206a290200370300200341e0046a41186a2204200141186a290200370300200341e0046a41106a2205200141106a290200370300200341e0046a41086a2206200141086a290200370300200320012902003703e00402400240024002400240024002400240200341e0046a10b1040d00200442003703002005420037030020064200370300200342003703e004200341e80b6a41eb8cc700410a10fb012006200341e80b6a41086a290000370300200320032900e80b3703e004200341a8026a41d4e6c600410910fb012004200341a8026a41086a290000370300200520032900a802370300200341c8006a200341e0046a412041d4c0c7004100410010810220032802484101460d01200341b00e6a22014200370300200341a80e6a22074200370300200341980e6a41086a22044200370300200342003703980e200341e8076a41818dc700410910fb012004200341e8076a41086a290000370300200320032900e8073703980e200341e80b6a41acd6c000410610fb012001200341e80b6a41086a290000370300200720032900e80b370300200341e0046a200341980e6a10fd0120032802e0042201410420011b2108200241086a280200220920032902e404420020011b220a422088a7220b4b0d03200941ffffffff03712009460d020c070b200041023a00000c040b2000410110ff020c030b20094102742201417f4c0d0402400240024020010d004104210c0c010b20011024220c450d010b2003200c3602502003200141027636025420034100360258200341980e6a41186a4200370300200341980e6a41106a4200370300200341980e6a41086a22014200370300200342003703980e200341e8076a41808cc700410610fb012001200341e8076a41086a290000370300200320032900e8073703980e200341e80b6a41ea93c400410610fb01200741086a200341e80b6a41086a220d290000370000200720032900e80b370000200341c0006a200341980e6a41201089020240200a428080808010540d002003280240210e2003280244210f200228020021100240024002402009450d00201020094198026c6a21112008200b412c6c6a2112200341e80b6a410172221341076a211441002115410121012008211620102117034020174198026a211820172802502106024002400240024002402001410171450d00201621010c010b20162101200420064f0d010b034020122001460d02200128020021042001412c6a2216210120042006470d000b201641786a2802004102460d02201741a8016a2016460d02201641586a20174180016a412010d206450d022000410510ff02200341d0006a21010c050b2000410310ff02200341d0006a21010c040b2000410410ff02200341d0006a21010c030b0240024002400240024020172802182219450d002017280210211a200341e0046a200610e004200341a8026a20032802e004220420032802e80410e10420032802ac02410020032802a802410146221b1b210120032802b002211c024020032802e404450d00200410260b0240200120196a22014101460d00200141e5004f0d02201c4100201b1b21042019410474211b201a41086a21010340200128020020046a2104200141106a2101201b41706a221b0d000b200441a09c014b0d020b200641e807490d002019410474210103402001450d01200141706a2101201a2d000c2104201a41106a211a20044102470d000b200341e80b6a410710ff020c020b200320132900003703b809200320142800003600bf090c020b200341e80b6a410610ff020b200320132900003703b809200320142800003600bf0920032d00e80b22014104470d010b2017280228211a200341a8026a200610e204200341e0046a20032802a802221c20032802b002221d10e30420032902e404221e420020032802e00422011b211f2001410820011b211902400240201e422088a7410020011b2201201a490d002001201a6bad221e42d8007e2220422088a70d0d2020a72201417f4c0d0d0240024020010d004108211b0c010b20011024221b450d090b201b2019201a41d8006c22046a200110cf061a201e422086211e200141d8006ead21200240201a450d002019210103400240024020012d0000220641014b0d00024020060e020200020b200141086a280200450d01200141046a28020010260c010b200141086a280200450d00200141046a28020010260b200141d8006a2101200441a87f6a22040d000b0b201e202084211e201fa72201450d01200141d8006c450d01201910260c010b201f42ffffffff0f83211e0240201f422088a72201450d00200141d8006c21042019210103400240024020012d0000220641014b0d00024020060e020200020b200141086a280200450d01200141046a28020010260c010b200141086a280200450d00200141046a28020010260b200141d8006a2101200441a87f6a22040d000b0b2019211b0b02400240201b0d00201c201d10ff010c010b201e422088a7221a41d8006c22044104722201417f4c0d0c200110242206450d07200341003602e804200320013602e404200320063602e004200341e0046a201a10a1010240201a450d00201b20046a2106201b210103402001200341e0046a109f042006200141d8006a2201470d000b0b201c201d20032802e004220120032802e80410b301024020032802e404450d00200110260b0240201a450d00201b210103400240024020012d0000220641014b0d00024020060e020200020b200141086a280200450d01200141046a28020010260c010b200141086a280200450d00200141046a28020010260b200141d8006a2101200441a87f6a22040d000b0b201ea72201450d00200141d8006c450d00201b10260b024020032802ac02450d00201c10260b20172802502104024020152003280254470d00200341d0006a2015410110e701200328025821152003280250210c0b200c20154102746a20043602002003201541016a2215360258410021012018211720182011470d010c020b0b200020013a0000200020032903b809370001200041086a20032800bf09360000200341d0006a21010c010b200341e0046a41186a4200370300200341e0046a41106a4200370300200341e0046a41086a22014200370300200342003703e004200341e80b6a41eb8cc700410a10fb012001200341e80b6a41086a2216290000370300200320032900e80b3703e004200341a8026a41dc9dc600410b10fb01200541086a200341a8026a41086a290000370000200520032900a802370000200341a8026a200341e0046a10da0420032802a802210120032902ac02211f200341e0046a10d90420032802e404212120032802e804210420032802e0042113200341a0016a41186a20034184056a290200370300200341a0016a41106a200341fc046a290200370300200341a0016a41086a200341f4046a290200370300200320032902ec043703a001200341c0016a20132004108a01200341980e6a41186a22124200370300200341980e6a41106a22174200370300200341980e6a41086a22064200370300200342003703980e200341e8076a41808cc700410610fb012006200341e8076a41086a221b290000370300200320032900e8073703980e200341e80b6a41ea93c400410610fb01200741086a2016290000370000200720032900e80b370000200341386a200341980e6a4120108902200328023c212220032802382123200341b80e6a41186a221a4200370300200341b80e6a41106a22044200370300200341b80e6a41086a220c4200370300200342003703b80e200341e8076a41808cc700410610fb01200c201b290000370300200320032900e8073703b80e200341e80b6a41f693c400410a10fb01201a2016290000370300200420032900e80b370300200341e0046a200341b80e6a412010b80320032d00e00421162012200341f9046a2900003703002017200341f1046a2900003703002006200341e9046a290000370300200320032900e1043703980e0240024020164101460d00200341d0016a41186a4200370300200341d0016a41106a4200370300200341d0016a41086a4200370300200342003703d0010c010b200341d0016a41186a2012290300370300200341d0016a41106a2017290300370300200341d0016a41086a2006290300370300200320032903980e3703d0010b200341980e6a41186a22164200370300200341980e6a41106a22124200370300200341980e6a41086a22064200370300200342003703980e200341e8076a41b48cc700410710fb012006200341e8076a41086a2217290000370300200320032900e8073703980e200341e80b6a4184c1c200410c10fb01200741086a200341e80b6a41086a221b290000370000200720032900e80b370000200341306a200341980e6a41201089022003280234211a2003280230210c200341b80e6a41186a4200370300200341b80e6a41106a4200370300200341b80e6a41086a22154200370300200342003703b80e200341e8076a41808cc700410610fb0120152017290000370300200320032900e8073703b80e200341e80b6a41f693c400410a10fb01200441086a201b290000370000200420032900e80b370000200341e0046a200341b80e6a412010b80320032d00e00421042016200341f9046a2900003703002012200341f1046a2900003703002006200341e9046a290000370300200320032900e1043703980e201a4100200c1b21170240024020044101460d00200341a8026a41186a4200370300200341a8026a41106a4200370300200341a8026a41086a4200370300200342003703a8020c010b200341a8026a41186a2016290300370300200341a8026a41106a2012290300370300200341a8026a41086a2006290300370300200320032903980e3703a8020b201f420020011b211f2001410120011b2124200341f0016a410c6a200341a8026a41086a222529030037020020034184026a200341a8026a41106a290300370200200341f0016a411c6a200341a8026a41186a290300370200200320173602f001200320032903a8023702f40120032802c001211720032802c8012106200341003602a002200342013703980202400240024020090d0041012126410021270c010b200f4100200e1b2201417f6a410020011b2128201020094198026c6a21292017410c6a210c201f422088a7212a200341e9046a212b200341e0046a410c6a212c200341e0046a4198026a2111200341e0046a41d8016a2115200341e0046a41b8016a211d200341e0046a4198016a212d200341e0056a212e200341b8056a212f200341a8056a2130200341e0046a413c6a2131200341e0046a41046a2118200341a8026a41c4006a2132200341e8076a41066a2119200341b8096a41066a211c200341980e6a41186a210f200341980e6a41106a2114200341b8096a41386a2133200341b8096a41306a2134200341b8096a41286a21354100210402400240024002400240024003402010211b02400240024002400240024020042006460d00201b4198026a2110201b280250210920042112034002400240201220064f0d002017201241037422016a221a28020421162006201241016a22044d0d01200c20016a2101034020012802002016470d02200141086a21012006200441016a2204470d000b200621040c010b2012200641d4b0c0001032000b20042012490d080240200620044f0d002004200641c4b0c0001047000b024020162009460d002004211220042006460d020c010b0b0240200341d0016a201b41e0006a220e460d00200e200341d0016a412010d2060d020b200f420037030020144200370300200341980e6a41086a22164200370300200342003703980e200341e8076a41808cc700410610fb012016200341e8076a41086a2201290000370300200320032900e8073703980e200341e80b6a41ea93c400410610fb01200741086a2227200341e80b6a41086a2236290000370000200720032900e80b370000200341286a200341980e6a4120108902201b4188026a2802002237200420126b223841017620384101716a490d022037202a4b0d03201b41dc006a2802004180a0014b0d04200341880f6a201b280250200328022c417f6a417f20032802281b223910e40420032802a40f4102470d05200341e0046a410e10ff02200320032802e804222c3602b80920032802e004213a20032802e40421290c0c0b200341e0046a410810ff02200341e0046a41086a280200212c0c0a0b200341e0046a411310ff02200341e8046a280200212c0c090b200341e0046a410910ff02200341e8046a280200212c0c080b200341e0046a410a10ff02200341e8046a280200212c0c070b200341e0046a410f10ff02200341e8046a280200212c0c060b201c20032903880f370100201c41206a200341880f6a41206a290300370100201c41186a200341880f6a41186a223b290300370100201c41106a200341880f6a41106a223c290300370100201c41086a200341880f6a41086a223d2903003701002001200341b8096a41086a223e290100370300200341e8076a41106a2212200341b8096a41106a223f290100370300200341e8076a41186a2237200341b8096a41186a2240290100370300200341e8076a41206a223a200341b8096a41206a2226290100370300200341e8076a41266a200341b8096a41266a290100370100200320032901b8093703e807200341a0076a41206a2241201941206a290100370300200341a0076a41186a2242201941186a290100370300200341a0076a41106a2243201941106a290100370300200341a0076a41086a2244201941086a290100370300200320192901003703a007201b2802502145200341e80e6a41186a2246200e41186a290000370300200341e80e6a41106a2247200e41106a290000370300200341e80e6a41086a2248200e41086a2900003703002003200e2900003703e80e200341d80e6a201b41d4006a10c801200341b80e6a41186a2249201b4198016a290200370300200341b80e6a41106a224a201b4190016a290200370300200341b80e6a41086a224b201b4188016a2902003703002003201b290280013703b80e2033201b41d8016a2900003703002034201b41d0016a2900003703002035201b41c8016a2900003703002026201b41c0016a2900003703002040201b41b8016a290000370300203f201b41b0016a290000370300203e201b41a8016a2900003703002003201b2900a0013703b809203b201b41f8016a290000370300203c201b41f0016a290000370300203d201b41e8016a2900003703002003201b2900e0013703880f201b41086a290300211e201b2903002120200341c8076a201b41106a10ce012037201b41c4006a2900003703002012201b413c6a2900003703002001201b41346a2900003703002003201b29002c3703e80702400240201b28021c0d00200341003602f8080c010b200341f8086a201b411c6a10c8010b200341a8096a41086a224c200341c8076a41086a220e2802003602002016200129030037030020142012290300370300200f203729030037030020034198096a41086a224d200341f8086a41086a224e280200360200200320032903c8073703a809200320032903e8073703980e200320032903f80837039809201b280228214f200341c8086a41086a22502048290300370300200341c8086a41106a22482047290300370300200341c8086a41186a22472046290300370300200341e8086a41086a2246200341d80e6a41086a280200360200200341a8086a41086a2251204b290300370300200341a8086a41106a224b204a290300370300200341a8086a41186a224a2049290300370300200320032903e80e3703c808200320032903d80e3703e808200320032903b80e3703a808200341e8076a41386a22492033290300370300200341e8076a41306a22522034290300370300200341e8076a41286a22532035290300370300203a2026290300370300203720402903003703002012203f2903003703002001203e290300370300200341c8076a41186a223e203b290300370300200341c8076a41106a223b203c290300370300200e203d290300370300200320032903b8093703e807200320032903880f3703c807200341f8086a41186a223c200f290300370300200341f8086a41106a223d2014290300370300204e2016290300370300200320032903980e3703f808201841206a2041290300370200201841186a2042290300370200201841106a2043290300370200201841086a2044290300370200201820032903a007370200200341e0046a41346a201e3702002003202037028c05203120032903a809370200203141086a204c2802003602002030200329039809370200203041086a204d2802003602002003204f3602b405202f41186a203c290300370200202f41106a203d290300370200202f41086a204e290300370200202f20032903f808370200200320453602dc05202e41086a2046280200360200202e20032903e808370200200320283602f405200342808080858080143702ec05202d41186a2047290300370200202d41106a2048290300370200202d41086a2050290300370200202d20032903c808370200201d41186a204a290300370200201d41106a204b290300370200201d41086a2051290300370200201d20032903a808370200201541386a2049290300370200201541306a2052290300370200201541286a2053290300370200201541206a203a290300370200201541186a2037290300370200201541106a2012290300370200201541086a2001290300370200201520032903e807370200201141186a203e290300370200201141106a203b290300370200201141086a200e290300370200201120032903c80737020020032902e404211e200341e80b6a202c41b00210cf061a2003201e3703a8022025200341e80b6a41b00210cf06210e200341e0046a2009109e02200341206a20032802e004223b20032802e8041089022003280224213720032802202112024020032802e404450d00203b10260b024020124101470d00203720394b0d00200341e80b6a2009109f02200341e0046a20032802e80b221220032802f00b2237109d020240024020032802e004223b450d002012203710ff012003203b3602b809200320032902e4043702bc090c010b200341003602c009200342013703b8090b024020032802ec0b450d00201210260b200341e0046a2009109e0220032802e004221220032802e80410ff01024020032802e404450d00201210260b20092039200341b8096a10e50420032802bc09450d0020032802b80910260b024020032802ec02450d000240024020032802c4024101470d0020032802f40241808080054d0d01200341e0046a411010ff02200341e8046a280200212c0c060b200341e0046a411110ff02200341e8046a280200212c0c050b200341e0046a2009109e0220032802e804213720032802e00421122003203941c0256a3602e80b20122037200341e80b6a410410b301024020032802e404450d00201210260b200320323602e80b200341e0046a2009109f0220032802e004221220032802e804200341e80b6a10e60420032802e404450d00201210260b02400240024020032903a80220032903d002222054200e2903002254200341a8026a41306a290300221e542054201e511b0d00200320093602e80e200341b8096a200341e80e6a10db0341002112200341003a00b80e200341083a00980e200320203703e8072003201e3703f0072003200341b8096a3602a0070240024002402020201e8450450d004200211e420021200c010b2003200341b8096a3602880f2003200341880f6a3602f0042003200341980e6a3602ec042003200341a0076a3602e8042003200341b80e6a3602e4042003200341e8076a3602e004200341e80b6a200341b8096a200341e0046a10ed03024020032802e80b4101470d004200212020032903f00b211e4101211220032802ec0b213a0c020b200341e80b6a41286a290300212020032903880c211e4100211220032903f00b4201520d0020032903f80b215420032802880f2112200341e0046a41386a200341e80b6a41186a290300370300202b2012290000370000202b41086a201241086a290000370000202b41106a201241106a290000370000202b41186a201241186a290000370000200320543703900541002112200341003a00e804200341023a00e004200341e0046a1087020b0b20120d01200f42003703002014420037030020164200370300200342003703980e200341e8076a419a8cc700410810fb0120162001290000370300200320032900e8073703980e200341e80b6a41b8a1c300410d10fb0120272036290000370000200720032900e80b370000200341086a200341980e6a108d02200341086a41106a29030021542003290310215520032802082112200f42003703002014420037030020164200370300200342003703980e200341e8076a419a8cc700410810fb0120162001290000370300200320032900e8073703980e200341e80b6a41b8a1c300410d10fb0120272036290000370000200720032900e80b370000200342002054420020121b225420207d2055420020121b2220201e54ad7d22552020201e7d221e202056205520545620552054511b22011b3703e80420034200201e20011b3703e004200341980e6a4120200341e0046a411010b3010c020b200341e0046a411210ff02200341e8046a280200212c0c050b203a41ff01714104470d030b200341e0046a201b2024202a201a2038200341f0016a10db04024020032d00e00422014104470d00200341e0046a201b10dc04024020032802a0022201200328029c02470d0020034198026a2001410110930120032802a00221010b200328029802222620014105746a221620032903e004370000201641186a200341e0046a41186a290300370000201641106a200341e0046a41106a290300370000201641086a200341e0046a41086a2903003700002003200141016a22273602a002024020032802a803450d0020032802a40310260b024020032802bc02450d0020032802b80210260b024020032802e8022216450d0020032802e00221012016410474211603400240200141046a280200450d00200128020010260b200141106a2101201641706a22160d000b0b024020032802e40241ffffffff0071450d0020032802e00210260b024020032802ec022201450d0020032802f002450d00200110260b20102029460d080c010b0b20032d00e304210420032f00e104210620032802e4042129200320032802e804222c3602b8092006200441107472410874200172213a0c030b2012200441c4b0c0001048000b2003201e422088a7222c3602b809201ea721290c010b2003202c3602b80920032802e404212920032802e004213a0b024020032802a803450d0020032802a40310260b024020032802bc02450d0020032802b80210260b024020032802e8022204450d0020032802e00221012004410474210403400240200141046a280200450d00200128020010260b200141106a2101200441706a22040d000b0b024020032802e40241ffffffff0071450d0020032802e00210260b20032802ec022201450d0120032802f002450d01200110260c010b2003202c3602b80920032802e404212920032802e004213a0b0240200328029c0241ffffff3f71450d0020032802980210260b024020032802c40141ffffffff0171450d0020032802c00110260b0240202141ffffffff0171450d00201310260b410121010240201f42ffffff3f8350450d000c020b202410260c010b200341980e6a41186a4200370300200341980e6a41106a4200370300200341980e6a41086a22014200370300200342003703980e200341e8076a41b48cc700410710fb012001200341e8076a41086a290000370300200320032900e8073703980e200341e80b6a4184c1c200410c10fb01200741086a200341e80b6a41086a290000370000200720032900e80b3700002003200341980e6a4120108902200341003602c009200342043703b8092003280204211220032802002107200341b8096a4100200b10e70120032802c009210620032802b809212c0240200b450d00200b412c6c2116202c20064102746a210120082104034020012004280200360200200641016a2106200141046a21012004412c6a2104201641546a22160d000b20032802a00221270b200341e0046a41086a200341a0016a41086a290300370300200341e0046a41106a200341a0016a41106a290300370300200341e0046a41186a200341a0016a41186a290300370300200320063602c009200320032903a0013703e004200328029c022132024020032802c40141ffffffff0171450d0020032802c00110260b0240202141ffffffff0171450d00201310260b2022410020231b213a2012410020071b212941002101201f42ffffff3f83500d00202410260b20034180016a41086a2204200341e0046a41086a29030037030020034180016a41106a2206200341e0046a41106a29030037030020034180016a41186a2216200341e0046a41186a290300370300200320032903e004370380012001450d012000203a360200200041086a202c360200200041046a2029360200200341d0006a21010b200141046a28020041ffffffff0371450d04200128020010260c040b20032902bc092120200341e0006a41186a2016290300221f370300200341e0006a41106a2006290300221e370300200341e0006a41086a2004290300225437030020032003290380012255370360200241086a28020021072002280200214e200341f8086a41186a201f370300200341f8086a41106a201e370300200341f8086a41086a2054370300200320553703f808200341e8076a203a413270222b10e70420032802e8072112200320032802f00722173602f401200320123602f001200341b8096a201220171082020240024020032802b80922160d0041012104410021160c010b20032802bc09211a2003200341c0096a280200220436028c0f200320163602880f02400240024020044104490d002016280000211b2003201641046a3602880f20032004417c6a220136028c0f20014104490d002003200441786a220936028c0f2003201641086a3602880f41002101200341003a008005200441776a21040240034020092001460d01200341e0046a20016a201620016a220641086a2d00003a00002003200641096a3602880f2003200141016a22063a0080052003200436028c0f2004417f6a21042006210120064120470d000b200341a8026a41186a2201200341e0046a41186a290300370300200341a8026a41106a2204200341e0046a41106a290300370300200341a8026a41086a2209200341e0046a41086a290300370300200320032903e0043703a802200641ff01714120490d01200341b80e6a41086a2009290300370300200341b80e6a41106a2004290300370300200341b80e6a41186a2001290300370300200320032903a8023703b80e200341e0046a200341880f6a10e60120032802e0042201450d0120032902e404211f200341e0046a200341880f6a10e50120032802e00422090d02201f42ffffffff0383500d01200110260c010b200141ff0171450d00200341003a0080050b41002101200341003602b002200342013703a8022003410e3602a4072003200341f0016a3602a0072003200341a8026a3602e80b41012104200341f4046a4101360200200342013702e4042003418c8dc6003602e0042003200341a0076a3602f004200341e80b6a41c4e1c000200341e0046a10351a20032802a80220032802b002108402024020032802ac02450d0020032802a80210260b0c010b20032802e4042106410021040b0240201a450d00201610260b024020040d002012201710ff010b4100417f20011b21042001410020011b21160b024020032802ec07450d00201210260b024020044101710d00200341e8076a41f58cc700410c10fb01200341e80b6a419be2c600411510fb012003201b3602b809200341a0076a200341b8096a410410a202200341e0046a410c6a200341b8096a41046a3602002003200341a8076a3602e4042003200341b8096a3602e8042003200341a0076a3602e004200341a8026a200341e0046a107320032802b002220141206a2204417f4c0d070240024020040d0041012112410021040c010b200410242212450d030b200341003602e804200320123602e004200320043602e404200341e0046a4100411010c90120032802e00420032802e80422046a221220032900e807370000201241086a200341e8076a41086a2900003700002003200441106a22043602e804200341e0046a2004411010c90120032802e00420032802e80422046a221220032900e80b370000201241086a200341e80b6a41086a2900003700002003200441106a22123602e80420032802a8022104200341e0046a2012200110c90120032802e004221220032802e80422176a2004200110cf061a2003201720016a22013602e804024020032802ac02450d00200410260b2012200110af03024020032802e404450d00201210260b0240201f42ffffffff0383500d00201610260b200641ffffff3f71450d00200910260b20034180016a10ad03024020272007200720274b1b2239450d0020032802800141606a2117200341b8096a41046a2128200341a0076a41086a2118200341e0066a2111200341c0066a211920034180066a2115200341e0056a211c200341c0056a210e200341e0046a41d4006a211d2003418c056a210f200341e0046a411c6a212d200341e0046a41106a212f200328028801211b200341a8026a41386a2137200341a8026a41306a2124200341a8026a41206a2121410021130340200341003602a801200342013703a0012013221441016a2113204e20144198026c6a220928028c02211620094190026a28020021014101211041002107410021060340201720064105746a2104024003400240200141084f0d00410021120c020b200341e0046a2016200110dd0420032802ec04210120032802e8042116200441206a2104200641016a210641be80c70041bd80c70020032802e004410120032802e40422121b2d00002012410771764101711b22122d0000450d000b201b2006417f6a4d0d00200341b80e6a41186a221a200441186a290000370300200341b80e6a41106a220b200441106a290000370300200341b80e6a41086a220c200441086a290000370300200320042900003703b80e0240200720032802a401470d00200341a0016a2007410110930120032802a801210720032802a00121100b201020074105746a220420032903b80e370000200441186a201a290300370000200441106a200b290300370000200441086a200c2903003700002003200741016a22073602a8010b20120d000b20092802502107200341e8076a41186a221a200941f8006a290000370300200341e8076a41106a220b200941f0006a290000370300200341e8076a41086a2212200941e8006a290000370300200320092900603703e807200341c8086a200941d4006a10c801200341980e6a41186a220c20094198016a290200370300200341980e6a41106a221020094190016a290200370300200341980e6a41086a222a20094188016a29020037030020032009290280013703980e2037200941d8016a2900003703002024200941d0016a290000370300200341a8026a41286a222e200941c8016a2900003703002021200941c0016a290000370300200341a8026a41186a2230200941b8016a290000370300200341a8026a41106a2231200941b0016a290000370300200341a8026a41086a2233200941a8016a290000370300200320092900a0013703a802200341b8096a41186a2234200941f8016a290000370300200341b8096a41106a2235200941f0016a290000370300200341b8096a41086a2225200941e8016a290000370300200320092900e0013703b809200941086a290300211f2009290300211e200341a0076a200941106a10ce01200341e80b6a41186a2201200941c4006a290000370300200341e80b6a41106a22062009413c6a290000370300200341e80b6a41086a2204200941346a2900003703002003200929002c3703e80b200941286a211602400240200928021c0d00200341003602880f0c010b200341880f6a2009411c6a10c8010b200341a8086a41086a2209201828020036020020162802002122200341b80e6a41086a22232004290300370300200341b80e6a41106a22382006290300370300200341b80e6a41186a223b2001290300370300200341c8076a41086a223c200341880f6a41086a2216280200360200200320032903a0073703a808200320032903880f3703c807200320032903e80b3703b80e200341a0076a41186a223d201a290300370300200341a0076a41106a221a200b29030037030020182012290300370300200320032903e8073703a007200341d0016a41086a220b200341c8086a41086a280200360200200320032903c8083703d001200341f0016a41186a223e200c290300370300200341f0016a41106a220c2010290300370300200341f0016a41086a2210202a290300370300200320032903980e3703f001200341e80b6a41386a222a2037290300370300200341e80b6a41306a223f2024290300370300200341e80b6a41286a2240202e290300370300200341e80b6a41206a222e2021290300370300200120302903003703002006203129030037030020042033290300370300200320032903a8023703e80b200341e80e6a41186a22302034290300370300200341e80e6a41106a22312035290300370300200341e80e6a41086a22332025290300370300200320032903b8093703e80e200341880f6a41186a2234203b290300370300200341880f6a41106a2235203829030037030020162023290300370300200320032903b80e3703880f2003201f3703e8042003201e3703e004202f20032903a808370300202f41086a2009280200360200202d20032903c807370200202d41086a203c2802003602002003202236028805200f20032903880f370200200f41086a2016290300370200200f41106a2035290300370200200f41186a2034290300370200200320073602b005201d41086a200b280200360200201d20032903d001370200200e41186a203d290300370300200e41106a201a290300370300200e41086a2018290300370300200e20032903a007370300201c41186a203e290300370300201c41106a200c290300370300201c41086a2010290300370300201c20032903f001370300201541386a202a290300370300201541306a203f290300370300201541286a2040290300370300201541206a202e290300370300201541186a2001290300370300201541106a2006290300370300201541086a2004290300370300201520032903e80b370300201941186a2030290300370300201941106a2031290300370300201941086a2033290300370300201920032903e80e370300201141086a200341a0016a41086a280200360200201120032903a001370200200341003602f406200342013702ec06200341e8076a41f58cc700410c10fb01200341e80b6a419be2c600411510fb012003203a3602b809200341a0076a200341b8096a410410a202200320283602b402200320183602ac022003200341b8096a3602b0022003200341a0076a3602a802200341880f6a200341a8026a1073412010242201450d03200342203702ac02200320013602a802200341a8026a41004120106d20032802a802221620032802b00222076a2201202620144105746a2206290000370000200141086a200641086a290000370000200141106a200641106a290000370000200141186a200641186a2900003700002003200741206a22013602b0022001417f4c0d080240024020010d0041002106410121070c010b200110242207450d04200121060b200341003602c009200320073602b809200320063602bc09200341b8096a41002001106d20032802b809220720032802c00922066a2016200110cf061a2003200620016a22013602c009024020032802ac02450d00201610260b20032802900f220620016a41206a2216417f4c0d080240024020160d0041002116410121090c010b201610242209450d040b200341003602a807200320093602a007200320163602a407200341a0076a4100411010c90120032802a00720032802a80722166a220920032900e807370000200941086a20122900003700002003201641106a22163602a807200341a0076a2016411010c90120032802a00720032802a80722166a221220032900e80b370000201241086a20042900003700002003201641106a22163602a80720032802880f2104200341a0076a2016200610c90120032802a00720032802a80722166a2004200610cf061a2003201620066a22063602a807200341a0076a2006200110c90120032802a007220920032802a80722066a2007200110cf061a2003200620016a221a3602a807024020032802bc09450d00200710260b0240200328028c0f450d00200410260b200341003602b002200342013703a802200341a8026a200341e0046a109b0120032802e0062101200341a8026a20032802e806220410a10102402004450d002004410574210620032802b00221040340200341a8026a20044120106d20032802a80220032802b00222166a22042001290000370000200441086a200141086a290000370000200441106a200141106a290000370000200441186a200141186a2900003700002003201641206a22043602b002200141206a2101200641606a22060d000b0b20032802ec062101200341a8026a20032802f406220410a1010240024020040d0020032802b002210420032802a80221120c010b2004410574210620032802b00221040340200341a8026a20044120106d20032802a802221220032802b00222166a22042001290000370000200441086a200141086a290000370000200441106a200141106a290000370000200441186a200141186a2900003700002003201641206a22043602b002200141206a2101200641606a22060d000b0b2009201a2012200410b301024020032802ac02450d0020032802a80210260b024020032802a407450d00200910260b024020032802b805450d0020032802b40510260b024020032802f8042204450d0020032802f00421012004410474210403400240200141046a280200450d00200128020010260b200141106a2101200441706a22040d000b0b024020032802f40441ffffffff0071450d0020032802f00410260b024020032802fc042201450d00200328028005450d00200110260b024020032802e40641ffffff3f71450d0020032802e00610260b024020032802f00641ffffff3f71450d0020032802ec0610260b20132039490d000b0b200341a8026a202b10e70420032802b002210720032802a8022112200341003602e804200342013703e004200341e0046a41004104106d20032802e00420032802e80422016a203a3600002003200141046a22013602e804200341e0046a20014104106d20032802e00420032802e80422016a20293600002003200141046a22013602e804200341e0046a20014120106d20032802e00420032802e80422046a220120032903f808370000200141086a200341f8086a41086a290300370000200141106a200341f8086a41106a290300370000200141186a200341f8086a41186a2903003700002003200441206a3602e804200341e0046a2020422088a7220110a10102402001450d002001410274210420032802e8042106202c2101034020012802002116200341e0046a20064104106d20032802e00420032802e80422066a20163600002003200641046a22063602e804200141046a21012004417c6a22040d000b0b200341e0046a202710a10102402027450d00202741057421042026210103402003200341e0046a3602e80b2001200341e80b6a109c01200141206a2101200441606a22040d000b0b2012200720032802e00420032802e80410b301024020032802e404450d0020032802e00410260b024020032802ac02450d00201210260b024020032802840141ffffff3f71450d0020032802800110260b0240202042ffffffff0383500d00202c10260b0240203241ffffff3f71450d00202610260b200241086a28020021012002280200210b200341f8046a4200370300200341f0046a4200370300200341e0046a41086a22044200370300200342003703e004200341e80b6a41eb8cc700410a10fb012004200341e80b6a41086a290000370300200320032900e80b3703e004200341a8026a41a0a6c500410d10fb01200541086a200341a8026a41086a290000370000200520032900a802370000200341a8026a200341e0046a10fc010240024020032802a802221a0d004100210c200341003602900f200342043703880f4104211a0c010b200320032902ac02221f37028c0f2003201a3602880f201f422088a7210c0b02400240024002402001450d00200b20014198026c6a210e200341e8076a41046a2117200341a0076a41086a211b200341e0046a410472210f0340200341a8026a200b2802502209109a02200b41dc006a280200220141046a2204417f4c0d0b200b280254211620032802b002211220032802a802210602400240024002400240024020040d00200341003602e804200342013703e0040c010b200410242207450d0b200341003602e804200320043602e404200320073602e004200141c000490d01200141808001490d022001418080808004490d030b200341e0046a41004101106d20032802e00420032802e80422046a41033a00002003200441016a22043602e804200341e0046a20044104106d20032802e00420032802e80422046a2001360000200441046a21040c030b200341e0046a41004101106d20032802e00420032802e80422046a20014102743a0000200441016a21040c020b200341e0046a41004102106d20032802e00420032802e80422046a20014102744101723b0000200441026a21040c010b200341e0046a41004104106d20032802e00420032802e80422046a2001410274410272360000200441046a21040b200320043602e804200341e0046a20042001106d20032802e004220420032802e80422076a2016200110cf061a2003200720016a22013602e804200620122004200110b301024020032802e404450d00200410260b024020032802ac02450d00200610260b0240200b2802182207450d00200b2802102101200341a8026a200910e004200341e0046a20032802a802221020032802b002221510e1044100210620032802e804410020032802e00441014622181b2119200141086a210420032802e404211c2007410474221221160340200428020020066a2106200441106a2104201641706a22160d000b2003200620196a3602e804200341013602e0042003201c410020181b20076a3602e40420102015200f10ad04024020032802ac02450d00201010260b0340200341e80b6a41eb8cc700410a10fb01200341a8026a4194a5c500411210fb01200320093602e807200341a0076a200341e8076a410410a202200320173602ec042003201b3602e4042003200341e8076a3602e8042003200341a0076a3602e004200341b8096a200341e0046a107320032802c009220441206a2206417f4c0d0d0240024020060d0041002106410121160c010b200610242216450d090b200341003602f007200320163602e807200320063602ec07200341e8076a4100411010c90120032802e80720032802f00722066a221620032900e80b370000201641086a200341e80b6a41086a2900003700002003200641106a22063602f007200341e8076a2006411010c90120032802e80720032802f00722066a221620032900a802370000201641086a200341a8026a41086a2900003700002003200641106a22163602f00720032802b8092106200341e8076a2016200410c90120032802e807221620032802f00722076a2006200410cf061a2003200720046a22043602f007024020032802bc09450d00200610260b200341003602b002200342013703a802200341a8026a2001410c6a2d000010a8012001280200200141086a280200200341a8026a109501200341e0046a41086a20032802b002360200200320032903a8023703e00420162004200341e0046a10e903024020032802ec07450d00201610260b200141106a2101201241706a22120d000b41002101024002400240200c41014b0d00200c0e020201020b200c2104034020012004410176220620016a22162009201a20164102746a280200491b2101200420066b220441014b0d000b0b02402009201a20014102746a2802002204470d0041aff6c40041241084020c020b200c2001200920044b6a2201490d040b0240200c200328028c0f470d00200341880f6a200c410110e70120032802880f211a0b201a20014102746a220441046a2004200c20016b41027410d0061a200420093602002003200c41016a220c3602900f0b200b4198026a220b200e470d000b0b200341b8096a41086a200341880f6a41086a280200360200200320032903880f3703b809200341f8046a22044200370300200341f0046a22064200370300200341e0046a41086a22014200370300200342003703e004200341e80b6a41eb8cc700410a10fb012001200341e80b6a41086a2216290000370300200320032900e80b3703e004200341a8026a41a0a6c500410d10fb01200541086a2212200341a8026a41086a2207290000370000200520032900a802370000200341e0046a200341b8096a10e804024020032802bc0941ffffffff0371450d0020032802b80910260b200442003703002006420037030020014200370300200342003703e004200341e80b6a41eb8cc700410a10fb0120012016290000370300200320032900e80b3703e004200341a8026a41a0a6c500410d10fb0120122007290000370000200520032900a802370000200341a8026a200341e0046a10fc0120032802a8022201410420011b2137024020032902ac02420020011b2255422088221fa7222f0d004100212f4100210e0c030b2037202f4102746a211d201fa7410274417c6a41027641016a2124200341880f6a41086a211b200341e0046a4106722110200341e8076a41046a212d200341a0076a41086a211a4100210e4100211c41002111203721070340200341e0046a200728020010e004200341a8026a20032802e004221620032802e80410e10420032802a802410146210120032802ac02210420032802b0022106024020032802e404450d00201610260b2004410020011b21152006410020011b211302400240201c0d00410121010c010b2015201c6a41e50049201320116a41a19c01497121010b200e41016a210e02402015450d002001450d00200341e0046a200728020010e00420032802e004220120032802e80410ff01024020032802e404450d00200110260b200341e80b6a41eb8cc700410a10fb01200341a8026a4194a5c500411210fb01200320072802003602e807200341a0076a200341e8076a410410a2022003202d3602ec042003201a3602e4042003200341e8076a3602e8042003200341a0076a3602e004200341b8096a200341e0046a107320032802c009220141206a2204417f4c0d0b0240024020040d0041002104410121060c010b200410242206450d070b200341003602f007200320063602e807200320043602ec07200341e8076a4100411010c90120032802e80720032802f00722046a220620032900e80b370000200641086a200341e80b6a41086a2900003700002003200441106a22043602f007200341e8076a2004411010c90120032802e80720032802f00722046a220620032900a802370000200641086a200341a8026a41086a220f2900003700002003200441106a22043602f00720032802b8092106200341e8076a2004200110c90120032802e807220420032802f00722166a2006200110cf061a2003201620016a22013602f007024020032802bc09450d00200610260b2003200136028c0f200320043602880f200341e80b6a200420011082020240024020032802e80b22160d0042002120410421140c010b20032802ec0b2109200320032802f00b3602bc09200320163602b809200341e0046a200341b8096a10dd010240024020032802e00422060d00200341003602b002200342013703a8022003410e3602a4072003200341880f6a3602a0072003200341a8026a3602f001200341013602f404200342013702e4042003418c8dc6003602e0042003200341a0076a3602f004200341f0016a41c4e1c000200341e0046a10351a20032802a80220032802b002108402024020032802ac02450d0020032802a80210260b41012112410021060c010b20032902e4042154410021120b02402009450d00201610260b024020120d002004200110ff010b2054420020061b21202006410420061b21140b024020032802ec07450d00200410260b20142020422088a722014104746a211602400240024020010d00201421010c010b20142101034002402001410c6a2d000022174103470d00200141106a21010c020b200141046a280200211220012802002106200141086a28020021042003200728020022093602b80e200320043602ec0e200320063602e80e200341b8096a200341e80e6a10b6020240024020032802b8094117460d00200341e80b6a200341b8096a41b00210cf061a024002400240024020174103710e03010200010b411010242204450d04200441b889c70036020c200441013602082004428180808010370200200341f0016a41086a200341e0046a41086a290200370300200341f0016a41106a200341e0046a41106a290200370300200341f0016a41186a200341e0046a41186a280200360200200320032902e0043703f0014100210b410021190c020b200341e0046a200341b80e6a10db03200341e8076a41186a201041186a2f000022043b0100200341e8076a41106a201041106a290000221f370300200341e8076a41086a201041086a290000221e370300200f201e370300200341a8026a41106a220b201f370300200341a8026a41186a220c20043b010020032010290000221f3703e8072003201f3703a80220032801e204210920032f01e0042118411010242217450d03201741b889c70036020c201741013602082017428180808010370200411010242204450d03200441d089c70036020c20044101360208200442818080801037020020172017280200417f6a2219360200024020190d002017280208201728020c2802001103000240201728020c280204450d00201728020810260b20172017280204417f6a221936020420190d00201710260b200341f0016a41086a200f290300370300200341f0016a41106a200b290300370300200341f0016a41186a200c280200360200200320032903a8023703f001410121194100210b0c010b411010242217450d02201741b889c70036020c201741013602082017428180808010370200411010242204450d02200441d089c70036020c4101210b20044101360208200442818080801037020020172017280200417f6a220c360200200c0d002017280208201728020c2802001103000240201728020c280204450d00201728020810260b20172017280204417f6a220c360204200c0d00201710260b200341a8026a200341e80b6a41b00210cf061a200341a0076a41186a2217200341f0016a41186a280200360200200341a0076a41106a220c200341f0016a41106a290300370300201a200341f0016a41086a290300370300200320032903f0013703a00702402004280208200341a8026a200428020c28020c110100450d00200341e0046a200341a8026a41b00210cf061a201b20032903a007370200201b41086a201a290300370200201b41106a200c290300370200201b41186a20172802003602002003200936028c0f200320183b018a0f200320193a00890f2003200b3a00880f200320043602ac0f200341e8076a200341e0046a200341880f6a10a3030c010b20042004280200417f6a2209360200200341023a008808200341003a008008200342003703f007200342013703e807024020090d002004280208200428020c2802001103000240200428020c280204450d00200428020810260b20042004280204417f6a220936020420090d00200410260b200341a8026a1098030b02402012450d00200610260b200141106a22012016470d010c030b0b102c000b20162001460d000340200141106a21040240200141046a280200450d00200128020010260b2004210120162004470d000b0b0240202042ffffffff0083500d00201410260b2015201c6a221c41e3004b0d03201320116a2211419f9c014b0d030b200741046a2207201d470d000b2024210e0c010b2001200c103b000b200e202f4d0d00200e202f41d4f6c4001048000b200341f8046a4200370300200341f0046a4200370300200341e0046a41086a22014200370300200342003703e004200341e80b6a41eb8cc700410a10fb012001200341e80b6a41086a290000370300200320032900e80b3703e004200341a8026a41a0a6c500410d10fb01200541086a200341a8026a41086a290000370000200520032900a802370000202f200e6b220441027441046a2201417f4c0d060240024020010d0041012106410021010c010b200110242206450d020b200341003602b002200320063602a802200320013602ac02200341a8026a200410a1010240024020040d0020032802a802211220032802b00221040c010b2037200e4102746a2101202f410274200e4102746b210620032802b0022104034020012802002116200341a8026a20044104106d20032802a802221220032802b00222046a20163600002003200441046a22043602b002200141046a21012006417c6a22060d000b0b200341e0046a41202012200410b301024020032802ac02450d00201210260b205542ffffffff0383500d00203710260b200341b8096a41086a200341d0006a41086a280200360200200320032903503703b809200341e0046a41186a4200370300200341e0046a41106a4200370300200341e0046a41086a22014200370300200342003703e004200341e80b6a41eb8cc700410a10fb012001200d290000370300200320032900e80b3703e004200341a8026a41d4e6c600410910fb01200541086a200341a8026a41086a290000370000200520032900a802370000200341e0046a200341b8096a10e804024020032802bc0941ffffffff0371450d0020032802b80910260b200041043a00000240200aa72201450d002001412c6c450d00200810260b0240200241086a2802002201450d002002280200220620014198026c6a211603400240200641d8006a280200450d00200628025410260b0240200641186a2802002204450d00200628021021012004410474210403400240200141046a280200450d00200128020010260b200141106a2101200441706a22040d000b0b0240200641146a28020041ffffffff0071450d00200628021010260b0240200628021c2201450d00200641206a280200450d00200110260b024020064184026a2802002201450d00200141c1006c450d0020062802800210260b20064198026a210120064190026a4100360200200628028c0221042006410136028c02024020064194026a280200450d00200410260b2001210620012016470d000b0b200241046a2802002201450d0420014198026c450d04200228020010260c040b1033000b2000410210ff020b200aa72201450d002001412c6c450d00200810260b024020022802082201450d002002280200220620014198026c6a211603400240200641d8006a280200450d00200628025410260b0240200641186a2802002204450d00200628021021012004410474210403400240200141046a280200450d00200128020010260b200141106a2101200441706a22040d000b0b0240200641146a28020041ffffffff0071450d00200628021010260b0240200628021c2201450d00200641206a280200450d00200110260b024020064184026a2802002201450d00200141c1006c450d0020062802800210260b20064198026a210120064190026a4100360200200628028c0221042006410136028c02024020064194026a280200450d00200410260b2001210620012016470d000b0b200241046a2802002201450d0020014198026c450d00200228020010260b200341b00f6a24000f0b1034000b980301057f230041d0006b22022400200241086a41eb8cc700410a10fb01200241186a41d8a5c500411610fb0120022001360234200241386a200241346a410410a202200241cc006a200241346a41046a3602002002200241c0006a3602442002200241346a3602482002200241386a360240200241286a200241c0006a1073024002402002280230220341206a2204417f4c0d000240024020040d0041012101410021040c010b200410242201450d020b20002001360200200041086a220141003602002000200436020420004100411010c9012000280200200128020022046a220520022900083700002001200441106a2204360200200541086a200241086a41086a29000037000020002004411010c9012000280200200128020022046a220520022900183700002001200441106a2206360200200541086a200241186a41086a2900003700002002280228210420002006200310c9012000280200200128020022006a2004200310cf061a2001200020036a3602000240200228022c450d00200410260b200241d0006a24000f0b1034000b1033000b8f0201027f230041d0006b220324002003200236020420032001360200200341086a2001200210820202400240200328020822010d00200041003602000c010b200328020c2102024002400240200341106a28020022044104490d002004417c714104470d010b4100210420034100360220200342013703182003410e36022c200320033602282003200341186a360234200341cc006a41013602002003420137023c2003418c8dc6003602382003200341286a360248200341346a41c4e1c000200341386a10351a20032802182003280220108402200328021c450d01200328021810260c010b20002001290000370204410121040b200020043602002002450d00200110260b200341d0006a24000b980301057f230041d0006b22022400200241086a41eb8cc700410a10fb01200241186a419bf6c400411410fb0120022001360234200241386a200241346a410410a202200241cc006a200241346a41046a3602002002200241c0006a3602442002200241346a3602482002200241386a360240200241286a200241c0006a1073024002402002280230220341206a2204417f4c0d000240024020040d0041012101410021040c010b200410242201450d020b20002001360200200041086a220141003602002000200436020420004100411010c9012000280200200128020022046a220520022900083700002001200441106a2204360200200541086a200241086a41086a29000037000020002004411010c9012000280200200128020022046a220520022900183700002001200441106a2206360200200541086a200241186a41086a2900003700002002280228210420002006200310c9012000280200200128020022006a2004200310cf061a2001200020036a3602000240200228022c450d00200410260b200241d0006a24000f0b1034000b1033000b831a0c047f017e0a7f017e017f017e017f017e027f047e027f037e230041d0036b220324002003200236021c20032001360218200341206a2001200210820202400240200328022022040d00200041003602000c010b200328022421052003200341286a28020036023420032004360230200341106a200341306a108f010240024020032802100d0002400240024020032802142206200328023441d8006e2201200120064b1bad42d8007e2207422088a70d002007a72201417f4c0d0002400240024020010d00410821080c010b200110242208450d010b200141d8006ead210702402006450d00200341e9016a2109200341b8016a41116a210a200341c7026a210b4100210c034002400240024002400240024002400240024002400240024002402003280234220d450d002003280230220e2d000021012003200d417f6a220f3602342003200e41016a360230200141024b0d00024002400240024020010e03000102000b41002102200341003a00d802417e211002400340200f20022201460d01200341b8026a20016a200e20016a220241016a2d00003a00002003200d20106a3602342003200241026a3602302003200141016a22023a00d8022010417f6a211020024120460d060c000b0b200141ff0171450d060c050b2003200341306a108f0120032802000d022003280234220220032802042201490d022001417f4c0d120240024020010d0041002110410121110c010b2001102a2211450d1220032802342102200121100b0240024020022001490d0020112003280230200110cf0621022003280234220d20014f0d012001200d41b8afc0001048000b2010450d030c020b2003200d20016b3602342003200328023020016a3602302002450d022001ad4220862010ad842112200341f6016a41026a200341b0036a41026a2d00003a0000200341b8016a41086a200341b8026a41086a290300370300200341b8016a41106a200341b8026a41106a290300370300200341b8016a41186a200341b8026a41186a290300370300200341b8016a41206a200341b8026a41206a290300370300200341b8016a41286a200341b8026a41286a290300370300200341b8016a41306a200341b8026a41306a290300370300200320032f00b0033b01f601200320032903b8023703b801410121020c060b200341086a200341306a108f0120032802080d0120032802342202200328020c2201490d012001417f4c0d110240024020010d0041002110410121110c010b2001102a2211450d1120032802342102200121100b0240024020022001490d0020112003280230200110cf0621022003280234220d20014f0d012001200d41b8afc0001048000b20100d010c020b2003200d20016b3602342003200328023020016a3602302002450d012001ad4220862010ad84211241022102200341f6016a41026a200341b0036a41026a2d00003a0000200341b8016a41086a200341b8026a41086a290300370300200341b8016a41106a200341b8026a41106a290300370300200341b8016a41186a200341b8026a41186a290300370300200341b8016a41206a200341b8026a41206a290300370300200341b8016a41286a200341b8026a41286a290300370300200341b8016a41306a200341b8026a41306a290300370300200320032f00b0033b01f601200320032903b8023703b8010c050b201110260b200341b4016a41026a200341f6016a41026a2d00003a0000200341f8006a41086a200341b8016a41086a290300370300200341f8006a41106a200341b8016a41106a290300370300200341f8006a41186a200341b8016a41186a290300370300200341f8006a41206a200341b8016a41206a290300370300200341f8006a41286a200341b8016a41286a290300370300200341f8006a41306a200341b8016a41306a290300370300200320032f01f6013b01b401200320032903b8013703780c040b20034188036a41026a221020032d00ba023a000020034190036a41106a220f200b41106a2d00003a000020034190036a41086a2213200b41086a290000370300200320032f01b8023b0188032003200b29000022143703b0032003201437039003200241ff0171411f4d0d0120032800bb02211520032900bf022116200341b4026a41026a221720102d00003a0000200341a0026a41086a22182013290300370300200341a0026a41106a2213200f2d00003a0000200320032903900322143703f002200320032f0188033b01b402200320143703a0022002417f73200d6a4110490d012003200d20026b416f6a3602342003200e20026a220e41116a360230200e41096a2900002114200e41016a290000211941002110200341003a00d8022002200d6b41116a210f200d20016b416d6a210102400340200f20106a450d01200341b8026a20106a200e20106a220241116a2d00003a00002003200241126a3602302003201041016a22023a00d802200320013602342001417f6a21012002211020024120470d000b200341b0036a41186a2201200341b8026a41186a290300370300200341b0036a41106a2210200341b8026a41106a290300370300200341b0036a41086a220d200341b8026a41086a290300370300200320032903b8023703b003200241ff01714120490d0220034190036a41186a2001290300221a37030020034180026a41086a2201200d29030037030020034180026a41106a2202201029030037030020034180026a41186a2210201a370300200341f6016a41026a20172d00003a0000200320032903b00337038002200320032f01b4023b01f601200341b8016a41106a20132d00003a0000200341b8016a41086a2018290300370300200320032903a0023703b801200a41186a2010290300370000200a41106a2002290300370000200a41086a2001290300370000200a200329038002370000200920032800f901360000200941036a200341f9016a41036a2800003600004100210220162112201521112019211b2014211c0c030b201041ff0171450d010b200341003a00d8020b410321020b200341b4016a41026a2201200341f6016a41026a2d00003a0000200341f8006a41086a2210200341b8016a41086a290300370300200341f8006a41106a220d200341b8016a41106a290300370300200341f8006a41186a220e200341b8016a41186a290300370300200341f8006a41206a220f200341b8016a41206a290300370300200341f8006a41286a2213200341b8016a41286a290300370300200341f8006a41306a2215200341b8016a41306a290300370300200320032f01f6013b01b401200320032903b80137037820024103460d00200341f4006a41026a221720012d00003a0000200341386a41086a22182010290300370300200341386a41106a2210200d290300370300200341386a41186a220d200e290300370300200341386a41206a220e200f290300370300200341386a41286a220f2013290300370300200341386a41306a22132015290300370300200320032f01b4013b0174200320032903783703382007422088a722012007a7470d07200141016a22152001490d032001410174221d20152015201d491b22154104201541044b1bad42d8007e2214422088a7221d0d032014a722154100480d03200141d8006c201e20011b211e2008410020011b22080d022015450d010c040b2007422088a72201450d0c200141d8006c2102200821010c0b0b41004108201d4100471b21080c040b201e2015460d030240201e0d0020150d02410821080c040b2008201e201510282208450d020c030b102e000b2015102422080d010b102c000b200742808080807083201541d8006ead8421070b20082007422088a741d8006c6a220120023a00002001201237000820012011360004200120032f01743b0001200141036a20172d00003a000020132903002114200f2903002116200e2903002119200d290300211a2010290300211f2018290300212020032903382121200141d0006a201c3700002001201b37004820012021370010200141186a2020370000200141206a201f370000200141286a201a370000200141306a2019370000200141386a2016370000200141c0006a201437000020074280808080107c2107200c41016a220c2006470d000b0b2008450d0420002007370204200020083602000c050b1033000b1034000b03400240024020012d0000221041014b0d00024020100e020200020b200141086a280200450d01200141046a28020010260c010b200141086a280200450d00200141046a28020010260b200141d8006a2101200241a87f6a22020d000b0b2007a72201450d00200141d8006c450d00200810260b200341003602c001200342013703b8012003410e36027c2003200341186a3602782003200341b8016a360238200341cc026a4101360200200342013702bc022003418c8dc6003602b8022003200341f8006a3602c802200341386a41c4e1c000200341b8026a10351a20032802b80120032802c001108402024020032802bc01450d0020032802b80110260b200041003602000b2005450d00200410260b200341d0036a24000bc30802077f027e230041b0016b22032400200341f8006a22044200370300200341f0006a22054200370300200341e0006a41086a2206420037030020034200370360200341186a41808cc700410610fb012006200341186a41086a29000037030020032003290018370360200341c0006a41ea93c400410610fb012004200341c0006a41086a29000037030020052003290040370300200341106a200341e0006a41201089020240024002400240200241016a2003280214410020032802101b470d00200341186a41818dc700410910fb01200341c0006a41f0d7c000410510fb0120032001360234200341386a200341346a410410a202200341ec006a200341346a41046a3602002003200341386a41086a3602642003200341346a3602682003200341386a360260200341286a200341e0006a10732003280230220441206a2205417f4c0d020240024020050d0041012106410021050c010b200510242206450d040b200341003602682003200636026020032005360264200341e0006a4100411010c9012003280260200328026822056a22062003290018370000200641086a200341186a41086a2900003700002003200541106a2205360268200341e0006a2005411010c9012003280260200328026822056a22062003290040370000200641086a200341c0006a41086a2900003700002003200541106a220636026820032802282105200341e0006a2006200410c90120032802602206200328026822076a2005200410cf061a2003200720046a22043602680240200328022c450d00200510260b20062004109c0241ff0171210402402003280264450d00200610260b41002105024002402004450d000c010b200341e0006a2001109e02200341086a200328026022072003280268108902200328020c21062003280208210402402003280264450d00200710260b02402004450d00200620024b0d010b200341c0006a200110e403200341e0006a20032802402207200328024810e503200328026c2206410246210420032802602105200328026421082003280268210902402003280244450d00200710260b4104200520041b210741012105024002402004450d000c010b2009450d0020072802004180e1016a2104410021050b20052004200249722105024020064102460d00200841ffffffff0371450d00200710260b200241c0256a21040b200341286a200110a902024020032802280d002000410236021c0c020b20032001360238200341c0006a200341386a10db03200341186a200341c0006a10d803200341e0006a20032802182202200328022010d903200341f0006a2903004200200329036042015122011b210a2003290368420020011b210b0240200328021c450d00200210260b2000200a3703082000200b37030020002003290328370210200041186a200341306a280200360200200020043602202000200536021c0c010b2000410236021c0b200341b0016a24000f0b1034000b1033000bc20103027f017e027f230041206b22032400200341106a20001098022003200328021022042003280218109d02200329020421052003280200210602402003280214450d00200410260b20032002360200200341106a2000109802200328021022072003280218200310e6042005a7410020061b21022005422088a7410020061b21042006410120061b210602402003280214450d00200710260b20032004360218200320023602142003200636021020002001200341106a10a002200341206a24000ba30301047f230041106b220324000240024020022802002204280208220241046a2205417f4c0d00200428020021040240024020050d0041012106410021050c010b200510242206450d020b2003410036020820032006360200200320053602040240024002400240200241c000490d00200241808001490d012002418080808004490d02200341004101106d2003280200200328020822056a41033a00002003200541016a2205360208200320054104106d2003280200200328020822056a2002360000200541046a21050c030b200341004101106d2003280200200328020822056a20024102743a0000200541016a21050c020b200341004102106d2003280200200328020822056a20024102744101723b0000200541026a21050c010b200341004104106d2003280200200328020822056a2002410274410272360000200541046a21050b20032005360208200320052002106d20032802002205200328020822066a2004200210cf061a2003200620026a2202360208200020012005200210b30102402003280204450d00200510260b200341106a24000f0b1034000b1033000b9b0301057f230041d0006b22022400200241086a41f58cc700410c10fb01200241186a41b0e2c600411010fb0120022001360234200241386a200241346a410410a202200241c0006a410c6a200241346a41046a3602002002200241c0006a3602442002200241346a3602482002200241386a360240200241286a200241c0006a1073024002402002280230220341206a2204417f4c0d000240024020040d0041012101410021040c010b200410242201450d020b20002001360200200041086a220141003602002000200436020420004100411010c9012000280200200128020022046a220520022900083700002001200441106a2204360200200541086a200241086a41086a29000037000020002004411010c9012000280200200128020022046a220520022900183700002001200441106a2206360200200541086a200241186a41086a2900003700002002280228210420002006200310c9012000280200200128020022006a2004200310cf061a2001200020036a3602000240200228022c450d00200410260b200241d0006a24000f0b1034000b1033000bf90101057f230041106b22022400024002402001280208220341027441046a2204417f4c0d00200128020021010240024020040d0041012105410021040c010b200410242205450d020b2002410036020820022005360200200220043602042002200310a1010240024020030d0020022802002106200228020821040c010b2003410274210320022802082104034020012802002105200220044104106d20022802002206200228020822046a20053600002002200441046a2204360208200141046a21012003417c6a22030d000b0b200041202006200410b30102402002280204450d00200610260b200241106a24000f0b1034000b1033000bbb0101027f230041306b220224002002200010e204200228020821032002280200210020024100360218200242013703102001200241106a109f04200241286a20022802183602002002200229031037032020002003200241206a10e90302402002280204450d00200010260b0240024020012d0000220041014b0d00024020000e020200020b200141086a280200450d01200141046a28020010260c010b200141086a280200450d00200141046a28020010260b200241306a24000bdf0706017f017e047f037e037f067e230041c0026b2202240042002103200241e0016a22044200370300200241d0016a41086a4208370300200241ec016a22054180023b0100200241e8016a2206410036020041012107200241013602b802200241003602d001024002404100450d0042012108420021090c010b20014280c0a8ca9a3a20014280c0a8ca9a3a541b21010240024002404101450d004200210a0c010b200241c8016a210b4101210c420021080340200241b0016a200842002001420010cc06200241c0016a200142002001420010cc06200820022903b801220184200184420052200b290300220120022903b001220a200a7c7c220a200154720d0220022903c0012101200c410271210d200c4101762207210c200a2108200d450d000b0b0240200741024f0d0020012108200a21090c020b200241a0016a41086a210d20012108200a2109034020024190016a200a42002001420010cc06200241a0016a200142002001420010cc06200a200229039801220184200184420052200d2903002201200229039001220a200a7c7c220a200154720d0120022903a001210102402007410271450d00200241e0006a200942002001420010cc06200241f0006a200a42002008420010cc0620024180016a200842002001420010cc062009420052200a4200527120022903684200527220022903784200527220024180016a41086a2903002208200229036020022903707c7c2209200854720d0220022903800121080b200741034b210c20074101762107200a210a200c0d000c020b0b427f2108427f21090b200241d0006a20082009428094ebdc03420010cb06200241306a2004290300220a42002008420010cc06200241206a2009420020022903d8012201420010cc06200241c0006a200142002008420010cc060240024020052d0000450d00420021010c010b2002290338210e2002290328210f2002290320211020022903302111200241c0006a41086a2903002101200628020021072002290350210320022903402112200241106a20082009428094ebdc03420010d30620022002290310200241106a41086a2903002007ad2208420010cc06427f200241086a29030020022903002213200320087e2208428094ebdc0380a7417f2008428080808080c0b2cd3b541b2008428094ebdc03824280cab5ee01566aad7c2208201354ad7c2203427f2001201120107c7c2210200a420052200942005271200e42005272200f4200527220102001547222071b7c2008427f201220071b7c220a2008542207ad7c22012007200120035420012003511b22071b2101427f200a20071b21030b2000200337030020002001370308200241c0026a24000b130020004102360204200041f8f6c4003602000ba00606057f017e027f017e027f017e230041206b2202240002400240200128020022032802042204450d00200328020022052d0000210620032004417f6a3602042003200541016a36020002400240200641037122034103460d00024002400240024020030e03000102000b2006410276ad21070c020b200128020022012802042203450d04200128020022042d0000210520012003417f6a360204410121032001200441016a3602002005410874200672220141ffff0371418002490d03200141fcff0371410276ad21070c010b410121032001280200220128020422044103490d022001280200220541026a2d0000210820052f000021092001200541036a36020020012004417d6a3602042009200841107472410874200672220141808004490d022001410276ad21070b4200210a410021030c030b02402006410276220b410c4b0d00024002400240200b0e0d00030303010303030303030302000b2001280200220328020422014104490d0420032802002206350000210720032001417c6a3602042003200641046a36020020074280808080045421034200210a0c050b2001280200220328020422014108490d032003280200220629000021072003200141786a3602042003200641086a3602002007428080808080808080015421034200210a0c040b2001280200220328020422014110490d022003280200220641086a290000210a200629000021072003200641106a3602002003200141706a360204200a428080808080808080015421030c030b200641334b0d01200b41046a21094100210441012103200241186a210c420021074200210a0340200128020022062802042205450d01200241106a200628020022083100004200200441037441f8007110cd0620062005417f6a3602042006200841016a360200200c290300200a84210a20022903102007842107200441016a220441ff01712009490d000b2002427f427f41e800200b4103746b41f8007110d4062007200229030058200a200241086a290300220d58200a200d511b21030c020b0c010b410121030b20002007370308200041106a200a37030020002003ad370300200241206a24000bcb1a05017f037e057f027e087f230041e0116b22022400420221030240024002400240024002400240200129036822044202520d00200241186a20014198016a41b00210cf061a0c010b20024196036a200141206a41c20010cf061a200141f8006a290300210320012903702105200241d8036a41186a200141186a290000370300200241d8036a41106a200141106a290000370300200241d8036a41086a200141086a290000370300200220012900003703d803200241e80c6a20014198016a41b00210cf061a200241980f6a41106a20014190016a290300370300200241980f6a41086a20014188016a290300370300200220014180016a2903003703980f200241f0106a410010b004200241b00a6a20022802f010220120022802f81010b80320024190116a41086a2206200241b90a6a29000037030020024190116a41106a2207200241c10a6a29000037030020024190116a41186a2208200241c90a6a290000370300200220022900b10a370390110240024020022d00b00a4101460d00200241c0116a41186a4200370300200241c0116a41106a4200370300200241c0116a41086a4200370300200242003703c0110c010b200241c0116a41186a2008290300370300200241c0116a41106a2007290300370300200241c0116a41086a200629030037030020022002290390113703c0110b024020022802f410450d00200110260b200241b0106a41086a200241cb116a290000370300200241b0106a41106a200241d3116a290000370300200241c5106a200241c0116a41186a290000370000200220022900c3113703b01020022f01c011210920022d00c211210a20024190116a41186a2201420037030020024190116a41106a2206420037030020024190116a41086a220742003703002002420037039011200241b00a6a41808cc700410610fb012007200241b00a6a41086a2208290000370300200220022900b00a37039011200241b00a6a41ea93c400410610fb0120012008290000370300200620022900b00a370300200241106a20024190116a412010890241002101024020044201520d0020054200510d022002280214410020022802101b2106417f210142002006ad220b20037d220c200c200b561b220b20037c200b2005827d220b42ffffffff0f560d00200ba721010b200241b00a6a200110b004200241086a20022802b00a220620022802b80a41d4c0c7004100410010810220022802082107024020022802b40a450d00200610260b410121060240024020074101470d00200241b0116a200110b004200241b00a6a20022802b011220620022802b81110b80320024190116a41086a200241b90a6a29000037030020024190116a41106a200241c10a6a290000370300200241a8116a2201200241c90a6a290000370300200220022900b10a370390110240024020022d00b00a4101460d00200241d5116a4200370000200241c0116a41106a4200370300200241c0116a41086a4200370300200242003703c011410021010c010b200241c0116a41086a2002419b116a290000370300200241c0116a41106a200241a3116a290000370300200241d5116a200129000037000020022002290093113703c01120022f01901120022d0092114110747221010b024020022802b411450d00200610260b200241f0106a41156a2207200241c0116a41156a2208290000370000200241f0106a41106a2206200241c0116a41106a220d290300370300200241d0106a41086a220e200241c0116a41086a220f290300370300200241d0106a41106a22102006290300370300200241d0106a41156a22112007290000370000200220022903c0113703d010200241f00f6a41156a22072011290000370000200241f00f6a41106a22112010290300370300200241f00f6a41086a2210200e290300370300200220022903d0103703f00f20024190106a41156a220e200241b0106a41156a29000037000020024190106a41106a2212200241b0106a41106a29030037030020024190106a41086a2213200241b0106a41086a290300370300200220022903b01037039010200241d00f6a41156a2214200e290000370000200241d00f6a41106a220e2012290300370300200241d00f6a41086a2212201329030037030020022002290390103703d00f200241b00f6a41156a22132007290000370000200241b00f6a41106a22072011290300370300200241b00f6a41086a22112010290300370300200220022903f00f3703b00f20082014290000370000200d200e290300370300200f2012290300370300200220022903d00f3703c01120024190116a41156a201329000037000020024190116a41106a200729030037030020024190116a41086a2011290300370300200220022903b00f370390112006200241980f6a41106a290300370300200241f0106a41086a200241980f6a41086a290300370300200220022903980f3703f010200241b40a6a200241e80c6a41b00210cf061a410021060c010b200241d0106a41156a200241f0106a41156a290000370000200241d0106a41106a200241f0106a41106a290000370300200241d00f6a41086a20024190106a41086a290000370300200241d00f6a41106a20024190106a41106a290000370300200241d00f6a41156a20024190106a41156a29000037000020022002290090103703d00f200241b00f6a41156a200241f00f6a41156a290000370000200241b00f6a41106a200241f00f6a41106a290000370300200241e80c6a10980341800a21010b200241fc076a200241b00a6a41b40210cf061a200241e0076a41106a2207200241f0106a41106a290300370300200241e0076a41086a2208200241f0106a41086a290300370300200241c0076a41086a220d200241c0116a41086a290300370300200241c0076a41106a220e200241c0116a41106a290300370300200241c0076a41156a220f200241c0116a41156a290000370000200241a0076a41086a221020024190116a41086a290300370300200241a0076a41106a221120024190116a41106a290300370300200241a0076a41156a221220024190116a41156a290000370000200220022903f0103703e007200220022903c0113703c00720022002290390113703a00720060d03200241f8036a200241fc076a41046a41b00210cf061a200241e2066a2009200a4110747222064110763a0000200241e0066a220920063b0100200241b8066a2003370300200241b0066a2005370300200241c0066a20022903e007370300200241c8066a2008290300370300200241d0066a2007290300370300200241e3066a20022903c007370000200241eb066a200d290300370000200241f3066a200e290300370000200241f8066a200f290000370000200220043703a806200242003703d80620024182076a20014110763a000020024180076a220620013b010020024183076a20022903a0073700002002418b076a201029030037000020024193076a201129030037000020024198076a2012290000370000410810242201450d02200242083702b40a200220013602b00a200241f8036a200241b00a6a109904200241f8036a41b0026a200241b00a6a10a60220022802d8062101200241b00a6a20022802b80a4104106d20022802b00a20022802b80a22076a20013600002002200741046a22013602b80a20022802dc062107200241b00a6a20014104106d20022802b00a20022802b80a22016a20073600002002200141046a3602b80a2002200241b00a6a3602fc072009200241fc076a109c012002200241b00a6a3602fc072006200241fc076a109c0120022802b00a21010240024020022802b80a22064180024b0d0020024196036a20012006200241d8036a10820321010c010b200241c0116a2001200610960120024196036a200241c0116a4120200241d8036a10820321010b024020022802b40a450d0020022802b00a10260b2001450d04200241f0026a41086a200241d8036a41086a290300370300200241f0026a41106a200241d8036a41106a290300370300200241f0026a41186a200241d8036a41186a290300370300200241c8026a41086a200241b8066a290300370300200241c8026a41106a200241c0066a290300370300200241c8026a41186a200241c8066a290300370300200241e8026a200241d0066a290300370300200220022903d8033703f0022002200241b0066a2903003703c80220022903a8062103200241186a200241f8036a41b00210cf061a0b200041086a20022903f002370300200041286a2003370300200041306a20022903c802370300200041206a200241f0026a41186a290300370300200041186a200241f0026a41106a290300370300200041106a200241f0026a41086a290300370300200041386a200241c8026a41086a290300370300200041c0006a200241c8026a41106a290300370300200041c8006a200241c8026a41186a290300370300200041d0006a200241c8026a41206a290300370300200041d8006a200241186a41b00210cf061a200041003a00000c040b41f0afc7004119418cb0c700102f000b1033000b200020013b0001200041013a0000200041036a20014110763a00000c010b20004180083b0001200041013a0000200041036a41003a0000200241f8036a1098030b200241e0116a24000b1300200041013602042000419c85c5003602000b34002000418a8cc70036020420004100360200200041146a4102360200200041106a41d08cc500360200200041086a42093702000b130020004101360204200041888fc5003602000b4a01017f02404108102422020d001033000b2000420837020420002002360200200041004108106d2000280200200041086a220028020022026a42b8173700002000200241086a3602000b130020004104360204200041ac92c5003602000b3400200041eb8cc70036020420004100360200200041146a410d360200200041106a41bc99c500360200200041086a420a3702000b6f01027f02404108102422020d001033000b2000420837020420002002360200200041004104106d2000280200200041086a220228020022036a41003600002002200341046a2203360200200020034104106d2000280200200228020022006a41003600002002200041046a3602000b5301027f02404104102422020d001033000b2000420437020420002002360200200041004101106d2000280200200041086a220228020022036a41003a00002002200341016a2203360200200020034100106d0b4401017f230041206b22022400200041003602082000420137020020024200370310200242043703082000200241086a109a012000200241146a10af01200241206a24000b2901017f230041106b2202240020024100360208200242013703002000200210bb01200241106a24000be70101037f200128022421020240024002402001280200220341ff0171450d00200141046a280200210120022002280200417f6a22043602004100210320040d022002280208200228020c2802001103000240200228020c280204450d00200228020810260b20022002280204417f6a22043602042004450d010c020b20022002280200417f6a2204360200200341807e7121014101210320040d012002280208200228020c2802001103000240200228020c280204450d00200228020810260b20022002280204417f6a220436020420040d010b200210260b20002001360204200020033602000b3400200041cca3c70036020420004100360200200041146a4102360200200041106a41c4b0c500360200200041086a42123702000b5a01027f02404110102422020d001033000b2000421037020420002002360200200041004110106d2000280200200041086a220028020022026a22034200370008200342808090bbbad6adf00d3700002000200241106a3602000b130020004102360204200041c8b2c5003602000bc40402077f027e23004180016b22022400200241206a22034200370300200241186a42083703002002412c6a22044180023b0100200241106a41186a22054100360200200241013602782002410036021002400240411810242206450d00200242013702042002200636020020024100410110f501200228020022072002280208220841186c6a2206200329030037030820062002290318370300200620022d002d3a0015200620042d00004100473a0014200620052802003602102002200841016a220336020802402002280278220641044d0d00200641186c450d00200228021410260b200341186c4104722206417f4c0d01200610242204450d002000200636020420002004360200200041086a220641003602002000200310a10102402003450d002007200341186c6a210820062802002104200721030340200341086a29030021092003290300210a200020044110106d2000280200200628020022046a220520093700082005200a3700002006200441106a2204360200200341106a2802002105200020044104106d2000280200200628020022046a20053600002006200441046a2204360200200341146a2d00002105200020044101106d2000280200200628020022046a20053a00002006200441016a2204360200200341156a2d00002105200020044101106d2000280200200628020022046a20053a00002006200441016a2204360200200341186a22032008470d000b0b024020022802042200450d00200041186c450d00200710260b20024180016a24000f0b1033000b1034000b5501027f02404110102422020d001033000b2000421037020420002002360200200041004110106d2000280200200041086a220028020022026a2203420037000820034280c2d72f3700002000200241106a3602000bcc0101057f230041106b2202240020012802002103024002400240200141046a280200220441037622050d004101210541002101410021060c010b4101210102402005410820044107716b22064d0d0041024101200520066b22014107711b20014103766a21010b200110242205450d01200121060b20024100360208200220053602002002200636020420024100200110c9012002280200220520022802086a2003200110cf061a200020043602042000200536020020002002280204360208200241106a24000f0b1033000b6001037f230041106b2201240002404101102422020d001033000b2001420137020420012002360200200141004101106d20012802002202200128020822036a200041ff01714101463a0000200141106a2400200341016aad4220862002ad840b1f0002402000280200450d00200041086a280200450d00200028020410260b0b130020004104360204200041f4b8c5003602000b3400200041b18dc70036020420004100360200200041146a4101360200200041106a4190c3c500360200200041086a42043702000bff0c04057f017e017f037e230041b0066b220224000240024002400240024002400240024002400240024002400240024020012802042203450d00200128020022042d0000210520012003417f6a3602042001200441016a360200200541034b0d0520050e0401020304010b200041053a00000c0c0b200241c0036a200110b60220022802c003210120024190016a200241c0036a41047241ac0210cf061a0240024020014117460d00200241c0036a20024190016a41ac0210cf061a41b002102422050d010c0c0b200041053a00000c0c0b20052001360200200541046a200241c0036a41ac0210cf061a200041013a0000200020022f00503b0001200041036a200241d2006a2d00003a0000200041046a2005360200200041086a2002290370370300200041106a200241f0006a41086a290300370300200041186a200241f0006a41106a290300370300200041206a200241f0006a41186a2903003703000c0b0b200241c0036a200110b60220022802c003210520024190016a200241c0036a41047241ac0210cf061a20054117460d03200241c0036a20024190016a41ac0210cf061a41b00210242203450d0920032005360200200341046a200241c0036a41ac0210cf061a0240200128020422054108490d002001280200220629000021072001200541786a3602042001200641086a360200200041023a0000200020022f00503b0001200041036a200241d0006a41026a2d00003a0000200041086a2007370300200041046a2003360200200041106a2002290370370300200041186a200241f0006a41086a290300370300200041206a200241f0006a41106a2903003703000c0b0b200041053a00002003109803200310260c0a0b41002105200241003a00e0032003417f6a21082003417e6a21030240034020082005460d01200241c0036a20056a200420056a220641016a2d00003a0000200120033602042001200641026a3602002002200541016a22063a00e0032003417f6a21032006210520064120460d080c000b0b200541ff0171450d07200241003a00e0030c070b41002105200241003a00e0032003417f6a21082003417e6a21030240034020082005460d01200241c0036a20056a200420056a220641016a2d00003a0000200120033602042001200641026a3602002002200541016a22063a00e0032003417f6a21032006210520064120460d040c000b0b200541ff0171450d03200241003a00e0030c030b200041053a00000c070b200041053a00000c060b20024190016a41086a2205200241c0036a41086a29030037030020024190016a41106a2203200241c0036a41106a29030037030020024190016a41186a2204200241c0036a41186a290300370300200220022903c00337039001200641ff0171411f4b0d010b200041053a00000c040b200241306a41086a2005290300370300200241306a41106a2003290300370300200241306a41186a20042903003703002002200229039001220737035020022007370330200241c0036a200110b60220022802c003210120024190016a200241c0036a41047241ac0210cf061a024020014117460d00200241c0036a20024190016a41ac0210cf061a41b00210242205450d0320052001360200200541046a200241c0036a41ac0210cf061a200241106a41186a200241306a41186a2903002207370300200241106a41106a200241306a41106a2903002209370300200241106a41086a200241306a41086a290300220a37030020022002290330220b370310200041043a00002000200b370001200041096a200a370000200041116a2009370000200041196a2007370000200041216a20022f000d3b0000200041236a2002410f6a2d00003a0000200041246a20053602000c040b200041053a00000c030b20024190016a41086a2201200241c0036a41086a29030037030020024190016a41106a2205200241c0036a41106a29030037030020024190016a41186a2203200241c0036a41186a290300370300200220022903c00337039001200641ff0171411f4d0d00200241306a41086a20012903002209370300200241306a41106a2005290300220a370300200241306a41186a2003290300220b3703002002200229039001220737035020022007370330200041033a000020002007370001200041096a2009370000200041116a200a370000200041196a200b370000200041216a2002280010360000200041246a200241106a41036a2800003600000c020b200041053a00000c010b102c000b200241b0066a24000bc10d02057f047e230041d0066b220224000240024002400240024002400240024002400240200128020022032802042204450d00200328020022052d0000210620032004417f6a3602042003200541016a360200200641034b0d0520060e0401020304010b200041053a00000c080b2001200128020441016a22033602040240200320012802084b0d00200241a0036a200110b40220022802a0032103200241f0006a200241a0036a41047241ac0210cf061a20034117460d00200241a0036a200241f0006a41ac0210cf061a41b00210242206450d0620062003360200200641046a200241a0036a41ac0210cf061a200041013a0000200020022f00303b0001200041036a200241326a2d00003a0000200041046a2006360200200041086a2002290350370300200041106a200241d0006a41086a290300370300200041186a200241d0006a41106a290300370300200041206a200241d0006a41186a29030037030020012001280204417f6a3602040c080b200041053a00000c070b2001200128020441016a22033602040240200320012802084b0d00200241a0036a200110b40220022802a0032103200241f0006a200241a0036a41047241ac0210cf061a20034117460d00200241a0036a200241f0006a41ac0210cf061a41b00210242206450d0520062003360200200641046a200241a0036a41ac0210cf061a20012001280204417f6a36020402402001280200220328020422014108490d002003280200220429000021072003200141786a3602042003200441086a360200200041023a0000200020022f00303b0001200041036a200241306a41026a2d00003a0000200041086a2007370300200041046a2006360200200041106a2002290350370300200041186a200241d0006a41086a290300370300200041206a200241d0006a41106a2903003703000c080b200041053a00002006109803200610260c070b200041053a00000c060b41002103200241003a00c00302400340200128020022062802042204450d01200241a0036a20036a200628020022052d00003a000020062004417f6a3602042006200541016a3602002002200341016a22033a00c00320034120470d000b200241f0006a41186a200241a0036a41186a2903002207370300200241d0006a41086a2203200241a0036a41086a290300370300200241d0006a41106a2206200241a0036a41106a290300370300200241d0006a41186a22012007370300200220022903a003370350200241306a41186a22042001290300370300200241306a41106a22012006290300370300200241306a41086a2206200329030037030020022002290350370330200041033a000020002002290330370001200041096a2006290300370000200041116a2001290300370000200041196a2004290300370000200041216a2002280010360000200041246a200241106a41036a2800003600000c060b0240200341ff0171450d00200241003a00c0030b200041053a00000c050b41002103200241003a00c00302400340200128020022062802042204450d01200241a0036a20036a200628020022052d00003a000020062004417f6a3602042006200541016a3602002002200341016a22033a00c00320034120470d000b200241f0006a41186a200241a0036a41186a2903002207370300200241d0006a41086a2203200241a0036a41086a290300370300200241d0006a41106a2206200241a0036a41106a290300370300200241d0006a41186a22042007370300200220022903a003370350200241306a41186a2004290300370300200241306a41106a2006290300370300200241306a41086a2003290300370300200220022903503703302001200128020441016a2203360204200320012802084d0d020c040b0240200341ff0171450d00200241003a00c0030b200041053a00000c040b200041053a00000c030b200241a0036a200110b40220022802a0032103200241f0006a200241a0036a41047241ac0210cf061a20034117460d01200241a0036a200241f0006a41ac0210cf061a41b00210242206450d0020062003360200200641046a200241a0036a41ac0210cf061a200241106a41186a200241306a41186a2903002207370300200241106a41106a200241306a41106a2903002208370300200241106a41086a200241306a41086a290300220937030020012001280204417f6a36020420022002290330220a370310200041043a00002000200a370001200041096a2009370000200041116a2008370000200041196a2007370000200041246a2006360200200041216a20022f000d3b0000200041236a2002410f6a2d00003a00000c020b102c000b200041053a00000b200241d0066a24000b130020004101360204200041b0c7c5003602000b3400200041a28cc70036020420004100360200200041146a4103360200200041106a41bcc8c500360200200041086a420a3702000b0b0020004104410010b5030b8f0303027f017e067f230041206b22022400024020014102490d00200041206a22032000412010d206417f4a0d002000290000210420002003290000370000200241186a2205200041186a2206290000370300200241106a2207200041106a2208290000370300200241086a2209200041086a220a290000370300200a200341086a2900003700002008200341106a2900003700002006200341186a2900003700002002200437030041012103024020014103490d00200041c0006a21034102210802400340024020012008470d002001200141b4ccc5001032000b20032002412010d206417f4a0d01200341606a22062003290000370000200641186a200341186a290000370000200641106a200341106a290000370000200641086a200341086a290000370000200341206a21032001200841016a2208470d000b2008417f6a21030c010b2008417f6a21030b200020034105746a22032002290300370000200341186a2005290300370000200341106a2007290300370000200341086a20092903003700000b200241206a24000b942205047f067e017f037e047f230041e0036b2202240002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012802000e170102030405060b0708090a0b0c0d0e0f10111213141500010b200241086a200141086a108d03200041086a200241086a41c80010cf061a200041163602000c150b200241086a200141086a108e0320004100360200200041186a200241086a41106a290300370300200041106a200241086a41086a290300370300200041086a20022903083703000c140b200241086a200141086a108f03200041086a200241086a41a00210cf061a200041013602000c130b20004102360200200041086a200141086a2903003703000c120b02400240024002400240024002400240024020012d0004417f6a220341044b0d00200141046a210420030e050102030405010b41bf80c700412841dcbcc700102f000b200141086a2802002103410121050c040b41022105200241b0026a41026a200441036a2d00003a0000200241086a41086a200141146a290200370300200241186a2001411c6a290200370300200241206a200141246a2d00003a0000200220042f00013b01b00220022001410c6a290200370308200141086a2802002103200141286a28020021010c040b200141086a2802002103410321050c020b200241b2026a200441036a2d00003a0000200241086a41086a200141146a290200370300200241186a2001411c6a290200370300200241206a200141246a2d00003a0000200220042f00013b01b00220022001410c6a29020037030820012d00254100472104200141086a2802002103200141286a2802002101410421050c030b200141086a2802002103410521050b0b0b200020053a0004200020022f01b0023b0005200020043a0025200020022f01d0033b0126200041086a20033602002000410c6a2002290308370200200041286a2001360200200041076a200241b2026a2d00003a0000200041146a200241086a41086a2903003702002000411c6a200241186a290300370200200041246a200241206a2d00003a0000200041033602000c110b02400240024002400240024002400240200141086a22032d0000417f6a220541034b0d0020050e0401020304010b41bf80c700412841dcbcc700102f000b200241106a200341096a290000370300200241186a200341116a290000370300200241206a200341196a29000037030020022003290001370308200141386a2903002106200141306a2903002107410121010c030b200241106a200341096a290000370300200241186a200341116a290000370300200241206a200341196a29000037030020022003290001370308200141c8006a2903002108200141c0006a2903002109200141386a2903002106200141306a2903002107410221010c030b200241106a200341096a290000370300200241186a200341116a290000370300200241206a200341196a290000370300200220032900013703082002200341216a2800003602b0022002200341246a2800003600b302200141c8006a3100002108200141c0006a2902002109200141386a2902002106200141306a2902002107200141d8006a290300210a200141d0006a290300210b410321010c030b200241106a200341096a290000370300200241186a200341116a290000370300200241206a200341196a29000037030020022003290001370308200141386a2903002106200141306a2903002107410421010b0b0b20002002290308370009200020022802b00236002920004104360200200041d8006a200a370300200041d0006a200b370300200041c8006a2008370300200041c0006a2009370300200041386a2006370300200041306a2007370300200041086a20013a00002000412c6a20022800b302360000200041116a200241086a41086a290300370000200041196a200241186a290300370000200041216a200241206a2903003700000c100b200241086a200141046a10c001200041053602002000410c6a200241106a280200360200200020022903083702040c0f0b024002402001280204450d00200241b0026a41186a200141286a290000370300200241b0026a41106a200141206a290000370300200241b8026a200141186a290000370300200241b0026a41286a200141386a290000370300200241b0026a41306a200141c0006a290000370300200241b0026a41386a200141c8006a290000370300200241b0026a41c8006a200141d8006a290000370300200241b0026a41d0006a200141e0006a290000370300200241b0026a41d8006a200141e8006a2900003703002002200141106a2900003703b0022002200141306a2900003703d0022002200141d0006a2900003703f002200241b0026a41f8006a20014188016a290000370300200241b0026a41f0006a20014180016a290000370300200241b0026a41e8006a200141f8006a290000370300200241b0026a4198016a200141a8016a290000370300200241b0026a4190016a200141a0016a290000370300200241b0026a4188016a20014198016a2900003703002002200141f0006a29000037039003200220014190016a2900003703b003200241086a200141046a10c801200241146a200241b0026a41a00110cf061a0c010b200241003602080b200041046a200241086a41ac0110cf061a200041073602000c0e0b20004108360200200020012802043602040c0d0b200241086a200141086a109003200041086a200241086a41980210cf061a200041093602000c0c0b20012802042103200241086a200141086a10c801200241d0036a200141146a10d001200241086a41146a200241d0036a41086a280200360200200220022903d003370214200241b0026a41106a200241086a41106a2903002206370300200241b0026a41086a200241086a41086a29030022073703002002200229030822083703b002200141206a2902002109200141286a280200210520002003360204200041086a2008370200200041106a2007370200200041186a2006370200200041286a2005360200200041206a20093702002000412c6a2001412c6a290200370200200041346a200141346a2902003702002000413c6a2001413c6a290200370200200041c4006a200141c4006a290200370200200041cc006a200141cc006a290200370200200041d4006a200141d4006a290200370200200041dc006a200141dc006a290200370200200041e4006a200141e4006a2902003702002000410a3602000c0b0b108103000b200241086a200141086a109103200041086a200241086a41a00210cf061a2000410c3602000c090b2000410d3602000c080b200241086a200141046a10b702200041046a200241086a41c80010cf061a2000410e3602000c070b024002400240024020012f0104417f6a220341014b0d0020030e020102010b41bf80c700412841dcbcc700102f000b200241086a200141086a10c401200229020c210620022802082103410121010c010b20012f0106210541b00210242203450d082003200141086a28020010c601410221010b200020013b01042000410f3602002000410c6a2006370200200041086a2003360200200041066a20053b01000c060b200241086a200141086a10d002200041086a200241086a41a80210cf061a200041103602000c050b200241086a200141046a109203200041046a200241086a41c40010cf061a200041113602000c040b02400240024002400240200141086a22032d0000417f6a220c41034b0d00420021064101210542002109200c0e0404010203040b41bf80c700412841dcbcc700102f000b200241206a200341196a290000370300200241186a200341116a290000370300200241106a200341096a290000370300200220032900013703084200210641022105420021090c020b200241106a200341096a290000370300200241186a200341116a290000370300200241206a200341196a29000037030020022003290001370308200141c8006a2903002108200141c0006a2903002107200141386a290300210d200141306a290300210e200141d0006a28020021044200210641032105420021090c010b200241106a200341096a290000370300200241186a200341116a290000370300200241206a200341196a290000370300200220032900013703082002200341216a2800003602b0022002200341246a2800003600b302200141d0006a290300220f428080808070832106200141d8006a2903002109200141c8006a3100002108200141c0006a2902002107200141386a290200210d200141306a290200210e200141e8006a290300210b200141e0006a290300210a200141f0006a2802002110200fa72104410421050b20002002290308370009200020022802b002360029200041e8006a200b370300200041e0006a200a370300200041d8006a2009370300200041c8006a2008370300200041c0006a2007370300200041386a200d370300200041306a200e370300200041086a20053a00002000412c6a20022800b302360000200041f0006a2010360200200041d0006a20062004ad84370300200041116a200241086a41086a290300370000200041196a200241186a290300370000200041216a200241206a290300370000200041123602000c030b200241086a200141046a10930320004113360200200041246a200241286a2802003602002000411c6a200241206a290300370200200041146a200241186a2903003702002000410c6a200241106a290300370200200020022903083702040c020b200241086a200141086a10940320004114360200200041286a200241086a41206a290300370300200041206a200241086a41186a290300370300200041186a200241086a41106a290300370300200041106a200241086a41086a290300370300200041086a20022903083703000c010b024002400240024002400240024020012d0004417f6a221141054b0d004104210520110e06010203060405010b41bf80c700412841dcbcc700102f000b200241086a41086a2205200141106a290000370300200241086a41106a2212200141186a290000370300200241086a41156a22132001411d6a2900003700002002200141086a29000037030820012f0006211020012d0005210420012d0025210c41b00210242203450d062003200141286a280200109503200241b0026a41156a2013290000370000200241b0026a41106a2012290300370300200241b0026a41086a2005290300370300200220022903083703b002410121050c040b200241b0026a41086a200141106a290200370300200241b0026a41106a200141186a290200370300200241c5026a2001411d6a2900003700002002200141086a2902003703b00220012f0006211020012d0005210420012d0025210c410221050c030b200241b0026a41086a200141106a290200370300200241b0026a41106a200141186a290200370300200241c5026a2001411d6a2900003700002002200141086a2902003703b00220012f0006211020012d0005210420012d0025210c410321050c020b20012f0106211020012d00052104410521050c010b200241b0026a41086a200141106a290200370300200241b0026a41106a200141186a290200370300200241c5026a2001411d6a2900003700002002200141086a2902003703b0022001412c6a2802002113200141286a280200210320012f0006211020012d0005210420012f0126211220012d0025210c410621050b200020043a0005200020053a00042000200c3a002520004115360200200041066a20103b0100200041086a20022903b0023702002000412c6a2013360200200041286a2003360200200041266a20123b0100200041106a200241b0026a41086a290300370200200041186a200241b0026a41106a2903003702002000411d6a200241b0026a41156a2900003700000b200241e0036a24000f0b102c000b130020004101360204200041a4cec5003602000b130020004107360204200041e8cec5003602000bc62e02047f047e230041a0046b2203240002400240024002400240024002400240024002400240024002400240024020012d00000e050001020304000b200341dc016a4101360200200342013702cc01200341dcedc6003602c8012003410436029c01200341d4edc60036029801200320034198016a3602d801200341c8016a41ecc0c700103d000b200141046a2802002101200341c8016a41206a200241206a290200370300200341c8016a41186a200241186a290200370300200341c8016a41106a200241106a290200370300200341c8016a41086a2204200241086a290200370300200320022902003703c80120034198016a200341c8016a10d602200341f8036a41086a220220034198016a41096a290000370300200341f8036a41106a220520034198016a41116a290000370300200341f8036a41186a220620034198016a41196a29000037030020032003290099013703f80320032d0098014101460d03200341f8006a41186a2006290300370300200341f8006a41106a2005290300370300200341f8006a41086a2002290300370300200320032903f80337037820034198016a41186a2202420037030020034198016a41106a2205420037030020034198016a41086a220642003703002003420037039801200341c8016a41b18dc700410410fb0120062004290000370300200320032900c80137039801200341c8016a41e8c3c500410310fb0120022004290000370300200520032900c801370300200341c8016a20034198016a412010b80320032d00c80121042002200341c8016a41196a2900003703002005200341c8016a41116a2900003703002006200341c8016a41096a290000370300200320032900c901370398010240024020044101460d0020034190046a420037030020034188046a420037030020034180046a4200370300200342003703f8030c010b200341f8036a41186a20034198016a41186a290300370300200341f8036a41106a20034198016a41106a290300370300200341f8036a41086a20034198016a41086a29030037030020032003290398013703f8030b0240200341f8006a200341f8036a412010d2060d00200341c8016a200141b00210cf061a200341003b01f803411010242202450d05200241b889c70036020c2002410136020820024281808080103702002003200236029c0420034198016a200341c8016a200341f8036a10a303200320032900b9013703c8012003200341c0016a2800003600cf0102402003290398014201510d00410421020c0d0b200341b8016a2d0000210420032903a0012107200320032800cf0136005f200320032903c8013703584104210220074202510d0c2003200328005f36003f20032003290358370338200421020c0c0b410321020c0a0b200141046a2802002101200341c8016a41206a200241206a290200370300200341c8016a41186a200241186a290200370300200341c8016a41106a200241106a290200370300200341c8016a41086a2204200241086a290200370300200320022902003703c80120034198016a200341c8016a10d602200341f8036a41086a220220034198016a41096a290000370300200341f8036a41106a220520034198016a41116a290000370300200341f8036a41186a220620034198016a41196a29000037030020032003290099013703f80320032d0098014101460d04200341f8006a41186a2006290300370300200341f8006a41106a2005290300370300200341f8006a41086a2002290300370300200320032903f80337037820034198016a41186a2202420037030020034198016a41106a2205420037030020034198016a41086a220642003703002003420037039801200341c8016a41b18dc700410410fb0120062004290000370300200320032900c80137039801200341c8016a41e8c3c500410310fb0120022004290000370300200520032900c801370300200341c8016a20034198016a412010b80320032d00c80121042002200341c8016a41196a2900003703002005200341c8016a41116a2900003703002006200341c8016a41096a290000370300200320032900c901370398010240024020044101460d0020034190046a420037030020034188046a420037030020034180046a4200370300200342003703f8030c010b200341f8036a41186a20034198016a41186a290300370300200341f8036a41106a20034198016a41106a290300370300200341f8036a41086a20034198016a41086a29030037030020032003290398013703f8030b0240200341f8006a200341f8036a412010d2060d00200341c8016a200141b00210cf061a200341003b01f803411010242202450d04200241b889c70036020c2002410136020820024281808080103702002003200236029c0420034198016a200341c8016a200341f8036a10a303200320032900b9013703c8012003200341c0016a2800003600cf0102402003290398014201510d00410421020c0a0b200341b8016a2d0000210420032903a0012107200320032800cf0136005f200320032903c8013703584104210220074202510d092003200328005f36003f20032003290358370338200421020c090b410321020c070b200341106a41186a200141196a290000370300200341106a41106a200141116a290000370300200341106a41086a200141096a29000037030020032001290001370310200341c8016a41206a200241206a290200370300200341c8016a41186a200241186a290200370300200341c8016a41106a200241106a290200370300200341c8016a41086a2201200241086a290200370300200320022902003703c80120034198016a200341c8016a10d602200341f8036a41086a220220034198016a41096a290000370300200341f8036a41106a220420034198016a41116a290000370300200341f8036a41186a220520034198016a41196a29000037030020032003290099013703f80320032d0098014101460d04200341386a41186a2005290300370300200341386a41106a2004290300370300200341386a41086a2002290300370300200320032903f80337033820034198016a41186a2204420037030020034198016a41106a2202420037030020034198016a41086a220542003703002003420037039801200341c8016a41b18dc700410410fb0120052001290000370300200320032900c80137039801200341c8016a41e8c3c500410310fb0120042001290000370300200220032900c801370300200341c8016a20034198016a412010b80320032d00c80121012004200341c8016a41196a2900003703002002200341c8016a41116a2900003703002005200341c8016a41096a290000370300200320032900c901370398010240024020014101460d0020034190046a420037030020034188046a420037030020034180046a4200370300200342003703f8030c010b200341f8036a41186a20034198016a41186a290300370300200341f8036a41106a20034198016a41106a290300370300200341f8036a41086a20034198016a41086a29030037030020032003290398013703f8030b0240200341386a200341f8036a412010d206450d00410321020c060b200341f8006a41086a200341106a41086a290300370300200341f8006a41106a200341106a41106a290300370300200341f8006a41186a200341106a41186a2903003703002003200329031037037820034198016a41186a2204420037030020034198016a41106a2205420037030020034198016a41086a220142003703002003420037039801200341c8016a41b18dc700410410fb012001200341c8016a41086a2206290000370300200320032900c80137039801200341c8016a41e8c3c500410310fb01200241086a2006290000370000200220032900c801370000200341c8016a20034198016a412010b80320032d00c80121022004200341e1016a2900003703002005200341d9016a2900003703002001200341d1016a290000370300200320032900c901370398010240024020024101460d00200341d8006a41186a4200370300200341d8006a41106a4200370300200341d8006a41086a4200370300200342003703580c010b200341d8006a41186a2004290300370300200341d8006a41106a2005290300370300200341d8006a41086a200129030037030020032003290398013703580b200341dd016a200341d8006a41106a290300370000200341e5016a200341d8006a41186a290300370000200341d8006a41086a29030021072003410d3a00c801200341c8016a410d6a2007370000200341013a00cc01200320032903583700cd01200341c8016a108702200341c8016a41186a200341f8006a41186a290300370300200341c8016a41106a200341f8006a41106a290300370300200341c8016a41086a200341f8006a41086a290300370300200320032903783703c801200341f8036a41186a22024200370300200341f8036a41106a22014200370300200341f8036a41086a4200370300200342003703f803200341f8036a41b18dc700410410fb0120034198016a41e8c3c500410310fb01200220034198016a41086a2900003703002001200329009801370300200341f8036a4120200341c8016a108d05200320032800093602002003200341096a41036a280000360003200041186a41013a000020004200370308200020032802003600192000411c6a2003280003360000200042003703000c0a0b200141246a2802002104200341386a41186a200141196a290000370300200341386a41106a200141116a290000370300200341386a41086a200141096a29000037030020032001290001370338200341c8016a41206a200241206a290200370300200341c8016a41186a200241186a290200370300200341c8016a41106a200241106a290200370300200341c8016a41086a2201200241086a290200370300200320022902003703c80120034198016a200341c8016a10d602200341f8036a41086a220220034198016a41096a290000370300200341f8036a41106a220520034198016a41116a290000370300200341f8036a41186a220620034198016a41196a29000037030020032003290099013703f80302400240024002400240024020032d0098014101460d00200341f8006a41186a2006290300370300200341f8006a41106a2005290300370300200341f8006a41086a2002290300370300200320032903f80337037820034198016a41186a2202420037030020034198016a41106a2205420037030020034198016a41086a220642003703002003420037039801200341c8016a41b18dc700410410fb0120062001290000370300200320032900c80137039801200341c8016a41e8c3c500410310fb0120022001290000370300200520032900c801370300200341c8016a20034198016a412010b80320032d00c80121012002200341c8016a41196a2900003703002005200341c8016a41116a2900003703002006200341c8016a41096a290000370300200320032900c901370398010240024020014101460d0020034190046a420037030020034188046a420037030020034180046a4200370300200342003703f8030c010b200341f8036a41186a20034198016a41186a290300370300200341f8036a41106a20034198016a41106a290300370300200341f8036a41086a20034198016a41086a29030037030020032003290398013703f8030b0240200341f8006a200341f8036a412010d206450d00200410980320041026410321020c020b200341d8006a41086a200341386a41086a2202290300370300200341d8006a41106a200341386a41106a2201290300370300200341d8006a41186a200341386a41186a220529030037030020032003290338370358200341c8016a200441b00210cf061a20034182046a20022903003701002003418a046a200129030037010020034192046a200529030037010020034180023b01f803200320032903383701fa03411010242202450d07200241b889c70036020c2002410136020820024281808080103702002003200236029c04411010242201450d07200141d089c70036020c20014101360208200142818080801037020020022002280200417f6a2205360200024020050d002002280208200228020c2802001103000240200228020c280204450d00200228020810260b20022002280204417f6a220536020420050d00200210260b2003200136029c0420034198016a200341c8016a200341f8036a10a303410121022003290398014201520d04200341c0016a2802002106200341bc016a2802002105200341b8016a2d00002102200341b0016a2d00002101200341a8016a290300210820033100ba01210920033100b901210a20032903a00121074198b2c700410d1084020240024002400240024020020e0403000102030b418ab2c700410e1084020c030b4180b2c700410a1084020c020b200a10f203200910f2032005450d010b200520061084020b4197cbc100410a10840241869fc000410e1084020240024020074201510d0041fc9ec000410a1084020c010b200810f2030b41f39ec0004109108402200141ff01714101470d0241f19ec00041021084020c030b200410980320041026410221020b200320032800103602c8012003200341136a2800003600cb01200041186a41003a000020004200370308200020032802c8013600192000411c6a20032800cb01360000200041286a410b360000200041e6b8c500360024200041173b0021200041206a20023a0000420121070c030b41ee9ec00041031084020b410021020b200320023a00cd01200341023a00cc012003410d3a00c801200341c8016a10870220041026200320032800103602c8012003200341136a2800003600cb01200041186a41013a00004200210720004200370308200020032802c8013600192000411c6a20032800cb013600000b200020073703000c090b410221020c060b102c000b410221020c020b410221020b2003200328000936020020032003410c6a280000360003200041186a41003a000020004200370308200020032802003600192000411c6a2003280003360000200041286a410b360000200041e6b8c500360024200041173b0021200041206a20023a0000200042013703000c040b20011098032001102620032003410c6a28000036000320032003280009360200200041186a41003a000020004200370308200020032802003600192000411c6a2003280003360000200041286a410b360000200041e6b8c500360024200041173b0021200041206a20023a0000200042013703000c030b200320032903383703102003200328003f360017200341c8016a41086a20023a0000200341d1016a2003290310370000200341c8016a41106a2003280017360000200341003a00cc012003410d3a00c801200320032f00353b00cd012003200341376a2d00003a00cf01200341dc016a20032902f803370200200341c8016a411c6a200341f8036a41086a290200370200200341ec016a200341f8036a41106a280200360200200341c8016a1087022001102620032003410c6a28000036000320032003280009360200200041186a41013a000020004200370308200020032802003600192000411c6a2003280003360000200042003703000c020b20011098032001102620032003410c6a28000036000320032003280009360200200041186a41003a000020004200370308200020032802003600192000411c6a2003280003360000200041286a410b360000200041e6b8c500360024200041173b0021200041206a20023a0000200042013703000c010b200320032903383703102003200328003f360017200341c8016a41086a20023a0000200341d1016a2003290310370000200341c8016a41106a2003280017360000200341003a00cc012003410d3a00c801200320032f00353b00cd012003200341376a2d00003a00cf01200341dc016a20032902f803370200200341c8016a411c6a200341f8036a41086a290200370200200341ec016a200341f8036a41106a280200360200200341c8016a1087022001102620032003410c6a28000036000320032003280009360200200041186a41013a000020004200370308200020032802003600192000411c6a2003280003360000200042003703000b200341a0046a24000ba90101047f230041106b220324000240412010242204450d002003422037020420032004360200200341004120106d20032802002205200328020822066a22042002290000370000200441086a200241086a290000370000200441106a200241106a290000370000200441186a200241186a2900003700002003200641206a2202360208200020012005200210b30102402003280204450d00200510260b200341106a24000f0b1033000bb90401057f230041e0006b22032400200341086a41d18cc700410810fb01200341186a41e4f5c500411210fb0120032001360238200341c4006a200341386a410410a202200341dc006a2201200341386a41046a3602002003200341c4006a41086a22043602542003200341386a3602582003200341c4006a360250200341286a200341d0006a10732003200236024c200341c4006a200341cc006a410410a2022001200341cc006a41046a360200200320043602542003200341cc006a3602582003200341c4006a360250200341386a200341d0006a10730240024020032802302201200328024022046a41206a2205417f4c0d000240024020050d0041012102410021050c010b200510242202450d020b20002002360200200041086a220241003602002000200536020420004100411010c9012000280200200228020022056a220620032900083700002002200541106a2205360200200641086a200341086a41086a29000037000020002005411010c9012000280200200228020022056a220620032900183700002002200541106a2207360200200641086a200341186a41086a2900003700002003280228210520002007200110c9012000280200200228020022066a2005200110cf061a2002200620016a22063602002003280238210120002006200410c9012000280200200228020022006a2001200410cf061a2002200020046a3602000240200328023c450d00200110260b0240200328022c450d00200510260b200341e0006a24000f0b1034000b1033000b941c030a7f047e0d7f230041d0066b220224000240024020012802082203200128020c2204460d002001200341206a22053602082001280210210620024188036a41186a200341186a29000037030020024188036a41106a200341106a29000037030020024188036a41086a200341086a2900003703002002200329000037038803200128021421074100210302400240024002402001411c6a280200220841014b0d0020080e020201020b2008210903402009410176220a20036a220b20032007200b4105746a20024188036a412010d2064101481b21032009200a6b220941014b0d000b0b200720034105746a20024188036a412010d206450d010b03402001200641016a220636021020052004460d022001200541206a220b36020820024188036a41186a200541186a29000037030020024188036a41106a200541106a29000037030020024188036a41086a200541086a29000037030020022005290000370388034100210302400240200841014b0d00200b210520080e020201020b2008210503402005410176220920036a220a20032007200a4105746a20024188036a412010d2064101481b2103200520096b220541014b0d000b0b200b2105200720034105746a20024188036a412010d2060d000b0b02400240200820034d0d00200241186a200720034105746a220341186a290000220c370300200241106a200341106a290000220d370300200241086a200341086a290000220e37030020022003290000220f3703002001200641016a360210200141286a2802002104200141206a2802002107200141246a2802002109200241206a41186a200c370300200241206a41106a200d370300200241206a41086a200e3703002002200f3703202002200936024c200220073602482002200636024420024188036a10ad03024020022802900320064b0d00200228028c0341ffffff3f71450d0220022802880310260c020b2006200228028803220320064105746a10ae0321050240200228028c0341ffffff3f71450d00200310260b410221032005450d01200621050c030b200320084180d7c5001032000b0240411b10242203450d002002421b37025420022003360250200241d0006a4100411b10c9012002280250200228025822056a22034100290090d745370000200341086a4100290098d745370000200341106a41002900a0d745370000200341176a41002800a7d74536000020022005411b6a220a360258410410242203450d002002420437028c03200220033602880320024188036a41004104106d200228028803220520022802900322036a20063600002002200341046a220336029003200228028c032108200241d0006a200a200310c901200228025022012002280258220a6a2005200310cf061a2002200a20036a220b36025802402008450d00200510260b20022802542108200241b8026a41012001200b109005024002400240024020022802b8022203450d00200241c0026a28020022054104490d002005417c714104460d0020032800002007470d002003280004220541036a20094b0d010b200241003602582002420137035041042103200241d0006a41004104106d2002280250200228025822056a20073600002002200541046a2205360258200241d0006a20054104106d200228025022052002280258220a6a20093600002002200a41046a220a36025820024188036a41086a200241b8026a41086a280200360200200220022903b8023703880341012001200b20024188036a2005200a109105210a02402002280254450d00200510260b200a0d012009210520080d020c050b024020022802bc02450d00200310260b4101210320080d010c040b20024188036a1092050240024002402002280288032205450d0020024198036a280200211020024188036a410c6a28020021112002419c036a280200211220024188036a41086a2802002113200228028c0321142002410036028003200242013703f802200241f8026a41004104106d20022802f80220022802800322036a20093600002002200341046a3602800320052013200241f8026a109501200241f8026a201210a10102402012450d0020112012410c6c6a210a2011210303402003280200200341086a280200200241f8026a1095012003410c6a2203200a470d000b0b200241f8026a2002280280034104106d20022802f80220022802800322036a20073600002002200341046a220336028003200241f8026a20034104106d20022802f80220022802800322036a20063600002002200341046a220336028003200241f8026a20034104106d20022802f8022203200228028003220a6a20043600002002200a41046a220a3602800320024188036a41e9dabdf306200241206a2003200a109305410121150240024020022d0088034101460d004103210a0c010b200241f6026a20022d008b033a0000200241b8026a41086a2002419c036a290200370300200241c8026a200241a4036a290200370300200241d0026a200241ac036a290200370300200241d8026a200241b4036a290200370300200241e0026a200241bc036a290200370300200241e5026a200241c1036a290000370000200220022f0089033b01f402200220024194036a2902003703b80220024188036a41086a2802002116200228028c03210a410021150b200241b4026a41026a2217200241f4026a41026a2d00003a0000200241f8016a41086a2218200241b8026a41086a290300370300200241f8016a41106a2219200241b8026a41106a290300370300200241f8016a41186a221a200241b8026a41186a290300370300200241f8016a41206a221b200241b8026a41206a290300370300200241f8016a41286a221c200241b8026a41286a290300370300200241f8016a41306a200241b8026a41306a290300370300200220022f01f4023b01b402200220022903b8023703f801024020150d00200241f4016a41026a20172d00003a000020024188036a41086a201829030037030020024188036a41106a201929030037030020024188036a41186a201a29030037030020024188036a41206a201b29030037030020024188036a41286a201c29030037030020024188036a412d6a200241f8016a412d6a290000370000200220022f01b4023b01f401200220022903f80137038803024020022802fc02450d00200310260b200220022f01f4013b01b8022002200241f6016a2d00003a00ba02410021030c030b024020022802fc02450d00200310260b02402014450d00200510260b02402012450d002012410c6c21052011210303400240200341046a280200450d00200328020010260b2003410c6a2103200541746a22050d000b0b4101210302402010450d002010410c6c450d00201110260b200a2109201621050c010b41012103410521090b0b200241b8016a41086a221520024188036a41086a290300370300200241b8016a41106a221720024188036a41106a290300370300200241b8016a41186a221820024188036a41186a290300370300200241b8016a41206a221920024188036a41206a290300370300200241b8016a41286a221a20024188036a41286a290300370300200241b8016a412d6a221b20024188036a412d6a290000370000200220022d00ba023a00f201200220022f01b8023b01f00120022002290388033703b80102400240024020030d00200241d0006a41186a2012360200200241d0006a41146a2010360200200241d0006a41106a2011360200200241d0006a410c6a2013360200200241d0006a41086a2014360200200241fa006a20022d00f2013a0000200241ff006a2016360000200241fb006a200a36000020024183016a20022903b8013700002002418b016a201529030037000020024193016a20172903003700002002419b016a2018290300370000200241a3016a2019290300370000200241ab016a201a290300370000200241b0016a201b29000037000020022004360274200220063602702002200736026c2002200536025420022009360250200220022f01f0013b0178024041002802c8c2474103490d00200241b8026a411c6a4112360200200241b8026a41146a4113360200200241b8026a410c6a4113360200200241133602bc022002200241d0006a3602d0022002200241c8006a3602c8022002200241cc006a3602c0022002200241c4006a3602b80241002802c4c247210341002802c0c247210941002802ccc247210a200241c8036a419104360200200241c0036a42e080808010370300200241bc036a41ced2c500360200200241b4036a4210370200200241b0036a419cd4c500360200200241a8036a420437030020024198036a420437030020024188036a41086a410836020020024188036a411c6a200241b8026a360200200241acd7c5003602940320024194d4c50036028c032002410336028803200941c8a1c000200a410246220a1b20024188036a200341b0a1c000200a1b2802101102000b2002410a3602a004200242023703f003200241a4046a200241d0006a41e80010cf061a200220024188036a3602b802200241f8016a200241b8026a10af04200241b8026a41086a200241f8016a41086a280200360200200220022903f8013703b802200241b8026a109605210a200241a0046a1098034107210341062109200a0d010c020b4107210320094107460d010b2002410036029003200242013703880320024188036a41004104106d20022802880320022802900322036a20073600002002200341046a22033602900320024188036a20034104106d2002280288032203200228029003220a6a41003600002002200a41046a220a3602900341012001200b2003200a1097050240200228028c03450d00200310260b200921030b2008450d030b200110260c020b1033000b410821030b2000200536020420002003360200200241d0066a24000b1800200020014101472003ad4220862002ad84101610c5060b8d0101017f230041206b22062400200641086a200310c40620004101472002ad4220862001ad84200641186a200641106a2200200628020822014101461b2903002005ad4220862004ad841015210202402001450d002000280200450d00200628020c10260b024020032802002201450d00200341046a280200450d00200110260b200641206a240020024101460b960607017f017e097f017e027f017e017f230041206b220124000240024010182202422088a722030d004101210441002103410021050c010b2002a72104410121050b2001200336020c200120043602080240024002400240024002402003450d0020042d0000210620012003417f6a36020c2001200441016a360208200641014b0d00024020060e020005000b200141106a200141086a10c00620012802102207450d00200141186a2802002108200128021421092001200141086a108f010240024020012802000d002001280204220a200128020c410c6e22032003200a4b1bad420c7e2202422088a70d052002a72203417f4c0d050240024020030d00410421060c010b200310242206450d050b2003410c6ead21020240200a450d000340200141106a200141086a10c00602402001280210220b0d0002402002422088a72203450d002003410c6c210a2006210303400240200341046a280200450d00200328020010260b2003410c6a2103200a41746a220a0d000b0b2002a72203450d032003410c6c450d03200610260c030b2001290214210c02402002422088a722032002a7470d0002400240200341016a220d2003490d002003410174220e200d200d200e491b220d4104200d41044b1bad420c7e220f422088a7220e0d00200fa7220d4100480d00200e45410274210e2003410c6c201020031b21100240024002402006410020031b22060d00200d0d01200e21060c040b2010200d460d03024020100d00200d0d01410421060c040b20062010200d10282206450d010c030b200d102422060d020b200e0d080b102e000b200242808080807083200d410c6ead8421020b20062002422088a7410c6c6a2203200c3702042003200b36020020024280808080107c2102200a417f6a220a0d000b0b20060d010b2009450d01200710260c010b20070d050b4196aec700412e200141106a41c4aec70041d4aec7001036000b102c000b1033000b1034000b410021070b2000200936020420002007360200200041106a20023702002000410c6a2006360200200041086a200836020002402005450d00200410260b200141206a24000bf30904017f017e067f067e230041d0036b22052400200520013602040240200541046a20022004ad4220862003ad8410082206422088a72204450d002006a722072d0000220341014b0d0041002102200541086a210802400240024020030e020100010b41002102200541003a00c8022004417f6a2104200741016a210102400240034020042002460d0120054188026a20026a200120026a2d00003a00002005200241016a22033a00c80220032102200341c000460d020c000b0b200241ff0171450d02200541003a00c8020c020b200541d0026a41086a220220054188026a41086a290300370300200541d0026a41106a220420054188026a41106a290300370300200541d0026a41186a220120054188026a41186a290300370300200541d0026a41206a220920054188026a41206a290300370300200541d0026a41286a220a20054188026a41286a290300370300200541d0026a41306a220b20054188026a41306a290300370300200541d0026a41386a220c20054188026a41386a29030037030020052005290388023703d002200341ff0171413f4d0d01200541c8016a41386a2203200c290300370300200541c8016a41306a200b2903002206370300200541c8016a41286a200a290300220d370300200541c8016a41206a2009290300220e370300200541c8016a41186a2001290300220f370300200541c8016a41106a20042903002210370300200541c8016a41086a20022903002211370300200520052903d00222123703c80120054188016a41306a2202200637030020054188016a41286a2204200d37030020054188016a41206a2201200e37030020054188016a41186a2209200f37030020054188016a41106a220a201037030020054188016a41086a220b201137030020054188016a41386a220c20032903003703002005201237038801200541c8006a41386a2203200c290300370300200541c8006a41306a220c2002290300370300200541c8006a41286a22022004290300370300200541c8006a41206a22042001290300370300200541c8006a41186a22012009290300370300200541c8006a41106a2209200a290300370300200541c8006a41086a220a200b2903003703002005200529038801370348200541086a41386a2003290300370300200541086a41306a200c290300370300200541086a41286a2002290300370300200541086a41206a2004290300370300200541086a41186a2001290300370300200541086a41106a2009290300370300200541086a41086a200a29030037030020052005290348370308410121020b200020023a000020002008290000370001200041096a200841086a290000370000200041116a200841106a290000370000200041196a200841186a290000370000200041216a200841206a290000370000200041296a200841286a290000370000200041316a200841306a290000370000200041396a200841386a29000037000020071026200541d0036a24000f0b200541c8006a41086a20054188016a41086a290300370300200541c8006a41106a20054188016a41106a290300370300200541c8006a41186a20054188016a41186a290300370300200541c8006a41206a20054188016a41206a290300370300200541c8006a41286a20054188016a41286a290300370300200541c8006a41306a20054188016a41306a2903003703000b4196aec700412e20054188026a41c4aec70041d4aec7001036000bee0402037f027e230041b0016b220224002000280200210320024198016a200041046a10c80120024188016a200041106a10d00120024198016a41146a220420024188016a41086a28020036020020022002290388013702a401200241f0006a41106a20024198016a41106a2903002205370300200241f0006a41086a20024198016a41086a2903002206370300200241086a410c6a2006370200200241086a41146a200537020020022002290398012205370370200220033602082002200537020c200029021c21052002200028022436022c20022005370224200241086a41e0006a200041e0006a290200370300200241086a41d8006a200041d8006a290200370300200241086a41d0006a200041d0006a290200370300200241086a41c8006a200041c8006a290200370300200241086a41c0006a200041c0006a290200370300200241086a41386a200041386a290200370300200241086a41306a200041306a29020037030020022000290228370330200241f0006a410c6a41143602002002410436027420024184d8c5003602702001411c6a28020021002002200241086a36027820012802182101200441023602002002420237029c012002418cd8c500360298012002200241f0006a3602a8012001200020024198016a103521030240200241086a41086a280200450d00200228020c10260b0240200241206a2802002201450d00200241086a41106a28020021002001410c6c210103400240200041046a280200450d00200028020010260b2000410c6a2100200141746a22010d000b0b02402002411c6a2802002200450d002000410c6c450d00200228021810260b200241b0016a240020030bb30201037f23004180016b2202240002400240024002400240200128020022034110710d002000280200210420034120710d012004ad2001104221000c020b20002802002104410021000340200220006a41ff006a2004410f712203413072200341d7006a2003410a491b3a00002000417f6a2100200441047622040d000b20004180016a22044181014f0d02200141e889c0004102200220006a4180016a410020006b104521000c010b410021000340200220006a41ff006a2004410f712203413072200341376a2003410a491b3a00002000417f6a2100200441047622040d000b20004180016a22044181014f0d02200141e889c0004102200220006a4180016a410020006b104521000b20024180016a240020000f0b200441800141d889c0001048000b200441800141d889c0001048000b8e0103027f017e037f230041106b22012400024002400240200035020842208620002802002202ad8410192203428080808010540d002003a722042d0000220541014b0d004100210620050e020201020b4196aec700412e200141086a41c4aec70041d4aec7001036000b410121060b200410260240200041046a280200450d00200210260b200141106a240020060b1d0020004101472002ad4220862001ad842004ad4220862003ad8410170bef0401017f230041306b220224000240024002400240024002400240024020002802000e0701020304050600010b2001411c6a2802002100200128021821012002412c6a4100360200200241d4c0c7003602282002420137021c200241d4d4c50036021820012000200241186a103521010c060b2002200041046a36020c200241153602142001411c6a280200210020022002410c6a360210200128021821012002412c6a41013602002002420137021c200241dcd4c5003602182002200241106a36022820012000200241186a103521010c050b2002200041046a36020c200241153602142001411c6a280200210020022002410c6a360210200128021821012002412c6a41013602002002420237021c200241e4d4c5003602182002200241106a36022820012000200241186a103521010c040b2002200028020436020c200241013602142001411c6a280200210020022002410c6a360210200128021821012002412c6a41013602002002420237021c200241f4d4c5003602182002200241106a36022820012000200241186a103521010c030b2001411c6a2802002100200128021821012002412c6a4100360200200241d4c0c7003602282002420137021c20024184d5c50036021820012000200241186a103521010c020b2001411c6a2802002100200128021821012002412c6a4100360200200241d4c0c7003602282002420137021c2002418cd5c50036021820012000200241186a103521010c010b2001411c6a2802002100200128021821012002412c6a4100360200200241d4c0c7003602282002420137021c20024194d5c50036021820012000200241186a103521010b200241306a240020010b980201027f230041206b220224002002200128021841d4c0c70041002001411c6a28020028020c1100003a00102002200136020841012101200241013a00112002410036020c200220003602182002200041286a36021c200241086a200241186a419cd8c500105d2002411c6a41acd8c500105d1a20022d0010210002400240200228020c22030d00200021010c010b0240200041ff01710d00024020034101470d0020022d001141ff0171450d00200228020822002d00004104710d0041012101200028021841d79ec00041012000411c6a28020028020c1100000d010b2002280208220128021841d89ec00041012001411c6a28020028020c11000021010b200220013a00100b200241206a2400200141ff01714100470b1c00200128021841a5b2c700410f2001411c6a28020028020c1100000b970301067f230041d0006b22022400200241aed3c500410f10fb01200241106a4198e9c500410c10fb0120022001370330200241386a200241306a410810a202200241c0006a410c6a200241306a41086a3602002002200241386a41086a3602442002200241306a3602482002200241386a360240200241206a200241c0006a1073024002402002280228220341206a2204417f4c0d000240024020040d0041012105410021040c010b200410242205450d020b20002005360200200041086a220541003602002000200436020420004100411010c9012000280200200528020022046a220620022900003700002005200441106a2204360200200641086a200241086a29000037000020002004411010c9012000280200200528020022046a220620022900103700002005200441106a2207360200200641086a200241106a41086a2900003700002002280220210420002007200310c9012000280200200528020022006a2004200310cf061a2005200020036a36020002402002280224450d00200410260b200241d0006a24000f0b1034000b1033000b3001017f0240200128020022022001280204470d00200041003602000f0b2001200241c0016a3602002000200210c8030b290020004101360204200041086a200128020420012802006b41c0016e2201360200200020013602000bf60902087f017e230041f0006b22052400200541e8006a22064200370300200541e0006a22074200370300200541d0006a41086a2208420037030020054200370350200541c0006a41aed3c500410f10fb012008200541c0006a41086a220929000037030020052005290040370350200541c0006a41bdd3c500410d10fb012006200929000037030020072005290040370300200541186a200541d0006a412041d4c0c7004100410010810202400240024020052802184101460d0020064200370300200742003703002008420037030020054200370350200541d0006a41808cc700410610fb01200541206a41ea93c400410610fb012006200541206a41086a29000037030020072005290020370300200541106a200541d0006a41201089022005280214410020052802101b2106024020034101470d00200541e8006a220a4200370300200541e0006a220b4200370300200541d0006a41086a2208420037030020054200370350200541c0006a41aed3c500410f10fb012008200541c0006a41086a220929000037030020052005290040370350200541c0006a41ccd8c500410a10fb01200741086a220c200929000037000020072005290040370000200541086a200541d0006a412010890202402005280208450d00200528020c20064d0d002000410410e8020c030b200a4200370300200b42003703002008420037030020054200370350200541c0006a41aed3c500410f10fb012008200929000037030020052005290040370350200541c0006a41ccd8c500410a10fb01200c2009290000370000200720052900403700002005200241017420066a360220200541d0006a4120200541206a410410b3010b200541206a41186a2004360200200541206a41106a2208200141086a28020036020020052002360224200520063602202005200336023420052001290200370328200541d0006a41186a4200370300200541d0006a41106a4200370300200541d0006a41086a2201420037030020054200370350200541c0006a41aed3c500410f10fb012001200541c0006a41086a220929000037030020052005290040370350200541c0006a41bdd3c500410d10fb01200741086a2009290000370000200720052900403700002005410036024820054201370340200541c0006a41004104106d2005280240200528024822076a20063600002005200741046a2207360248200541c0006a20074104106d2005280240200528024822076a20023600002005200741046a36024820052802282109200541c0006a2008280200220710a10102402007450d002009200741286c6a210820052802482106200921070340200541c0006a20064120106d2005280240200528024822016a22062007290000370000200641086a200741086a290000370000200641106a200741106a290000370000200641186a200741186a2900003700002005200141206a2206360248200741206a290300210d200541c0006a20064108106d2005280240200528024822066a200d3700002005200641086a22063602482008200741286a2207470d000b0b200541c0006a200541346a10af01200541d0006a412020052802402207200528024810b30102402005280244450d00200710260b02402005412c6a2802002207450d00200741286c450d00200910260b200041043a00000c020b2000410310e8020b200141046a2802002207450d00200741286c450d00200128020010260b200541f0006a24000b8d0402057f037e230041d0016b2202240002400240200128020022032001280204470d00200041003602000c010b2001200341c0016a3602002002200341206a41e2c289ab0610c703200228020421042002280200210541002101200241003a0088010240024002400240034020042001460d01200241e8006a20016a200520016a2d00003a00002002200141016a22063a0088012006210120064120460d020c000b0b200141ff0171450d01200241003a0088010c010b20024190016a41086a2201200241e8006a41086a29030037030020024190016a41106a2204200241e8006a41106a29030037030020024190016a41186a2205200241e8006a41186a2903003703002002200229036837039001200641ff0171411f4d0d00200241c8006a41186a20052903002207370300200241286a41086a20012903002208370300200241286a41106a20042903002209370300200241286a41186a2007370300200241086a41186a2007370300200241086a41106a2009370300200241086a41086a200837030020022002290390012207370328200220073703080c010b200241106a4200370300200241186a4200370300200241206a4200370300200242003703080b20002003360200200020022903083700042000410c6a200241106a290300370000200041146a200241186a2903003700002000411c6a200241206a2903003700000b200241d0016a24000bae0402067f047e230041a0016b220224002002412036020420022001360200200241086a2001412010820202400240200228020822030d00200041003a00000c010b200241106a2802002104200228020c210541002101200241003a005820032106024002400240034020042001460d01200241386a20016a20062d00003a00002002200141016a22073a0058200641016a21062007210120074120470d000b20024180016a41186a2201200241386a41186a29030037030020024180016a41106a2206200241386a41106a29030037030020024180016a41086a2204200241386a41086a2903003703002002200229033837038001200741ff01714120490d01200241e0006a41186a20012903002208370300200241186a41086a20042903002209370300200241186a41106a2006290300220a370300200241186a41186a20083703002002200229038001220b370318200041196a2008370000200041116a200a370000200041096a20093700002000200b370001410121010c020b200141ff0171450d00200241003a00580b41002101200241003602880120024201370380012002410e36026420022002360260200220024180016a360218200241cc006a41013602002002420137023c2002418c8dc6003602382002200241e0006a360248200241186a41c4e1c000200241386a10351a200228028001200228028801108402200228028401450d0020022802800110260b200020013a00002005450d00200310260b200241a0016a24000b3001017f0240200128020022022001280204470d00200041003602000f0b2001200241c0016a3602002000200210c6030b8d0402057f037e230041d0016b2202240002400240200128020022032001280204470d00200041003602000c010b2001200341c0016a3602002002200341206a41f0c2c98b0610c703200228020421042002280200210541002101200241003a0088010240024002400240034020042001460d01200241e8006a20016a200520016a2d00003a00002002200141016a22063a0088012006210120064120460d020c000b0b200141ff0171450d01200241003a0088010c010b20024190016a41086a2201200241e8006a41086a29030037030020024190016a41106a2204200241e8006a41106a29030037030020024190016a41186a2205200241e8006a41186a2903003703002002200229036837039001200641ff0171411f4d0d00200241c8006a41186a20052903002207370300200241286a41086a20012903002208370300200241286a41106a20042903002209370300200241286a41186a2007370300200241086a41186a2007370300200241086a41106a2009370300200241086a41086a200837030020022002290390012207370328200220073703080c010b200241106a4200370300200241186a4200370300200241206a4200370300200242003703080b20002003360200200020022903083700042000410c6a200241106a290300370000200041146a200241186a2903003700002000411c6a200241206a2903003700000b200241d0016a24000b8d0402057f037e230041d0016b2202240002400240200128020022032001280204470d00200041003602000c010b2001200341c0016a3602002002200341206a41e1ea91cb0610c703200228020421042002280200210541002101200241003a0088010240024002400240034020042001460d01200241e8006a20016a200520016a2d00003a00002002200141016a22063a0088012006210120064120460d020c000b0b200141ff0171450d01200241003a0088010c010b20024190016a41086a2201200241e8006a41086a29030037030020024190016a41106a2204200241e8006a41106a29030037030020024190016a41186a2205200241e8006a41186a2903003703002002200229036837039001200641ff0171411f4d0d00200241c8006a41186a20052903002207370300200241286a41086a20012903002208370300200241286a41106a20042903002209370300200241286a41186a2007370300200241086a41186a2007370300200241086a41106a2009370300200241086a41086a200837030020022002290390012207370328200220073703080c010b200241106a4200370300200241186a4200370300200241206a4200370300200242003703080b20002003360200200020022903083700042000410c6a200241106a290300370000200041146a200241186a2903003700002000411c6a200241206a2903003700000b200241d0016a24000b1300200041033602042000419cdac5003602000b3400200041aed3c50036020420004100360200200041146a4106360200200041106a4194e3c500360200200041086a420f3702000b4901017f02404108102422020d001033000b2000420837020420002002360200200041004108106d2000280200200041086a220028020022026a42003700002000200241086a3602000b0d0020004100200020001088020b130020004101360204200041ccedc5003602000b3400200041d18cc70036020420004100360200200041146a4104360200200041106a4198f2c500360200200041086a42083702000bb80807017f017e0a7f017e017f017e0e7f230041e0016b2202240020012903002103200241c0016a41086a2204200141246a290200370300200241c0016a41106a22052001412c6a290200370300200241c0016a41186a2206200141346a29020037030020024180016a41086a2207200141c4006a29020037030020024180016a41106a2208200141cc006a29020037030020024180016a41186a2209200141d4006a29020037030020024180016a41206a220a200141dc006a29020037030020024180016a41286a220b200141e4006a29020037030020024180016a41306a220c200141ec006a29020037030020024180016a41386a220d200141f4006a29020037030020022001411c6a2902003703c00120022001413c6a29020037038001200141106a290300210e200141186a280200210f20012903082110200241e0006a41186a221120014198016a290200370300200241e0006a41106a221220014190016a290200370300200241e0006a41086a221320014188016a290200370300200241206a41386a2214200141d8016a290200370300200241206a41306a2215200141d0016a290200370300200241206a41286a2216200141c8016a290200370300200241206a41206a2217200141c0016a290200370300200241206a41186a2218200141b8016a290200370300200241206a41106a2219200141b0016a290200370300200241206a41086a221a200141a8016a290200370300200220014180016a2902003703602002200141a0016a290200370320200141fc006a280200211b200241186a221c200141f8016a290300370300200241106a221d200141f0016a290300370300200241086a221e200141e8016a2903003703002002200141e0016a290300370300200041186a200f360200200041106a200e3703002000201037030820002003370300200041346a20062903003702002000412c6a2005290300370200200041246a2004290300370200200020022903c00137021c200041f4006a200d290300370200200041ec006a200c290300370200200041e4006a200b290300370200200041dc006a200a290300370200200041d4006a2009290300370200200041cc006a2008290300370200200041c4006a2007290300370200200020022903800137023c2000201b36027c20004198016a201129030037020020004190016a201229030037020020004188016a201329030037020020004180016a2002290360370200200041d8016a2014290300370200200041d0016a2015290300370200200041c8016a2016290300370200200041c0016a2017290300370200200041b8016a2018290300370200200041b0016a2019290300370200200041a8016a201a290300370200200041a0016a2002290320370200200041f8016a201c290300370300200041f0016a201d290300370300200041e8016a201e290300370300200041e0016a2002290300370300200241e0016a24000bcb0101047f024002400240024020012802042202450d00200128020022032d0000210420012002417f6a22053602042001200341016a360200200441014b0d0120040e020203020b200041023602000f0b200041023602000f0b200041003602000f0b024020054104490d002003280001210520012002417b6a22043602042001200341056a36020020044104490d002000200536020420004101360200200328000521042001200241776a3602042001200341096a360200200041086a20043602000f0b200041023602000b130020004107360204200041ecfec5003602000b130020004102360204200041a085c6003602000bcf380b037f017e027f017e017f017e047f037e017f027e027f230022032104200341e0066b41607122032400200141106a22052903002106200228021021072002280200210820012903002109200341cc046a200141e8016a290000370200200341d4046a200141f0016a290000370200200341dc046a200141f8016a290000370200200341e7e485f3063602c0042003200141e0016a2900003702c404200341b8066a41106a2002280210360200200341b8066a41086a200241086a290200370300200320022902003703b806200341c8006a200341c0046a200341b8066a10ef030240024002400240024020032d00484101470d00200341286a41086a200341d2006a290100370300200341286a41106a200341da006a2901003703002003413f6a200341e1006a2900003700002003200329014a37032820032d0049210a2001290308210b200341c8006a200541f00110cf061a02400240200b4201520d00200341c0046a200341c8006a41f00110cf061a0240200341c0046a410c6a200341b0056a412010d2060d0020032802c80420032802ac05460d070b200341dc066a2202200341c0046a41086a220141206a280200360200200341d4066a2205200141186a290200370200200341cc066a220c200141106a290200370200200341b8066a410c6a220d200141086a290200370200200341013602b806200320012902003702bc06200341b8066a20034190066a220e200341ec046a20032903c004200910d004210f2002200341ac056a220141206a2802003602002005200141186a290200370200200c200141106a290200370200200d200141086a290200370200200341013602b806200320012902003702bc06200341b8066a200e200341d0056a20032903c004200910d0042101200f450d0620010d010c060b200341c0046a200341c8006a41f00110cf061a0240200341c0046a410c6a200341b0056a412010d2060d0020032802c80420032802ac05460d060b200341dc066a2202200341c0046a41086a220141206a280200360200200341d4066a2205200141186a290200370200200341cc066a220c200141106a290200370200200341b8066a410c6a220d200141086a290200370200200341003602b806200320012902003702bc06200341b8066a20034190066a220e200341ec046a20032903c004200910d004210f2002200341ac056a220141206a2802003602002005200141186a290200370200200c200141106a290200370200200d200141086a290200370200200341003602b806200320012902003702bc06200341b8066a200e200341d0056a20032903c004200910d0042101200f450d052001450d050b2009500d01200341c0046a2009427f7c109b05200341206a20032802c004220520032802c8041089022003280224210220032802202101024020032802c404450d00200510260b20014101470d04200341c0046a2009109b05200341186a20032802c004220c20032802c804108902200328021c210520032802182101024020032802c404450d00200c10260b4101210c0c020b410521030c020b200341c0046a4200109b05200341106a20032802c004220220032802c8041089022003280214210520032802102101024020032802c404450d00200210260b4100210c0b20014101470d01200820054b0d010240200820024d4102200c1b22014102460d0020014101710d020b200341003602c002200342013703b802200041206a2d00002108200041186a290000210b2000290008211020002900102111200341b8026a410020002900002212a741ff0171220141014610930120032802c002210520032802b80221022003200b3703d804200320113703d004200320103703c804200320123703c00402402001450d00200220054105746a2101200341c0046a4101722102034020012002290000370000200141176a200241176a290000370000200141106a200241106a290000370000200141086a200241086a2900003700002001411f6a20083a0000200341003a00c004200320033a00c104200320033a00c204200320033a00c304200320033a00c404200320033a00c504200320033a00c604200320033a00c704200320033a00c804200320033a00c904200320033a00ca04200320033a00cb04200320033a00cc04200320033a00cd04200320033a00ce04200320033a00cf04200320033a00d004200320033a00d104200320033a00d204200320033a00d304200320033a00d404200320033a00d504200320033a00d604200320033a00d704200320033a00d804200320033a00d904200320033a00da04200320033a00db04200320033a00dc04200320033a00dd04200320033a00de04200320033a00df04200141206a2101200541016a2105410041ff01710d000b0b200320053602c002200341c8026a41086a22012005360200200320032903b8023703c802200341d8026a41176a2202200341286a41176a290000370000200341d8026a41106a2205200341286a41106a290300370300200341d8026a41086a2208200341286a41086a290300370300200320032903283703d8020240024002400240024002400240412010242200450d002000200a3a0000200020032903d802370001200041096a2008290300370000200041116a2005290300370000200041186a2002290000370000200341f8026a41086a2001280200360200200320032903c8023703f80241002102200341003602b803200342013703b003200341b0036a41004108106d20032802b00320032802b80322016a20093700002003200141086a22013602b803200341b0036a20014108106d20032802b00320032802b80322016a20063700002003200141086a3602b803200341c0046a41fdd4c10010fb02200341c8006a20032802c004220520032802c804109d02200329024c4200200328024822011b210b2001410120011b210c024020032802c404450d00200510260b2003200b4220883e02c4032003200c3602c003200341086a200341c0036a108f01410821054100210820032802080d03200328020c220f20032802c40341306e22012001200f4b1bad42307e2210422088a70d042010a72201417f4c0d040240024020010d004108210d0c010b20011024220d450d060b200341003602d0032003200d3602c8032003200141306e22013602cc034100210e024002400240200f450d0041002113034020032802c40322024108490d0320032802c003220829000021102003200841086a3602c0032003200241786a22013602c40320014108490d03201341016a21132003200241706a220a3602c4032003200841106a3602c0032008290008211141002101200341003a00e0042002416f6a21020340200a2001460d03200341c0046a20016a200820016a220541106a2d00003a00002003200541116a3602c0032003200141016a22053a00e004200320023602c4032002417f6a21022005210120054120470d000b200341c8006a41186a2201200341c0046a41186a290300370300200341c8006a41106a2202200341c0046a41106a290300370300200341c8006a41086a2208200341c0046a41086a290300370300200320032903c004370348200541ff01714120490d03200341f8036a41086a20082903002212370300200341f8036a41106a20022903002214370300200341f8036a41186a20012903002215370300200341d8036a41186a22022015370300200341d8036a41106a22052014370300200341d8036a41086a2208201237030020032003290348221237039804200320123703f803200320123703d8030240200e20032802cc03470d00200341c8036a200e10ea0120032802c803210d20032802d003210e0b200d200e41306c6a2201201137030820012010370300200120032903d803370310200141186a2008290300370300200141206a2005290300370300200141286a20022903003703002003200e41016a220e3602d0032013200f470d000b20032802cc0321010b200e4100200d1b210820014100200d1b2102200d4108200d1b21050c050b200141ff0171450d00200341003a00e0040b20032802cc032201450d02200141306c0d010c020b102c000b200d10260b4100210241082105410021080b200341c0046a41fdd4c100200341b0036a10fc02200341c8006a20032802c004220a20032802c80410a502200329024c4200200328024822011b21102001410120011b2113024020032802c404450d00200a10260b200341a8036a2008360200200341a4036a200236020020034188036a41106a201037030020034188036a41086a200341b0036a41086a280200360200200320032903b00337038803200320053602a00320032013360294030240200ba7450d00200c10260b200041086a290000210b200041106a29000021112000290000211220034198046a41186a200041186a29000037030020034198046a41106a201137030020034198046a41086a200b3703002003201237039804200341003602c804200342013703c004200341c0046a41004108106d20032802c00420032802c80422016a20093700002003200141086a22013602c804200341c0046a20014108106d20032802c004220220032802c80422016a2006370000200341d4046a4100290085d5413702002003200141086a3602c804200341002900fdd4413702cc04200320034198046a3602dc04200341b8066a200341c0046a109401024020032802c404450d00200210260b2010422088210b200341c0046a200341b8066a10fe02200320032802c004220220032802c80441d4c0c7004100410010810220032802002101024020032802c404450d00200210260b200ba7210f0240024020014101470d00410021010c010b200341c8006a41186a220220034198046a41186a290300370300200341c8006a41106a220520034198046a41106a290300370300200341c8006a41086a220820034198046a41086a2903003703002003200329039804370348200341c0046a200341f8026a10c301200341c0046a410c6a220141186a2002290300370000200141106a2005290300370000200141086a200829030037000020012003290348370000200341c8006a200341b8066a10fe02200328024822012003280250200341c0046a10af050240200328024c450d00200110260b024020032802c40441ffffff3f71450d0020032802c00410260b200341c8006a41186a200341b8066a41186a290300370300200341c8006a41106a200341b8066a41106a290300370300200341c8006a41086a200341b8066a41086a290300370300200320032903b80637034820032802a003210d4100210102400240024020032802a803220e41014b0d000240200e0e020002000b200341c0046a41186a200341c8006a41186a290300370300200341c0046a41106a200341c8006a41106a290300370300200341c0046a41086a200341c8006a41086a290300370300200320032903483703c004410021010c020b200e210203400240417f200d2002410176220820016a220a41306c6a220c290300220b200952200b2009541b22050d00417f200c290308220b200652200b2006541b21050b2001200a20054101461b2101200220086b220241014b0d000b0b024002400240417f200d200141306c6a2205290300220b200952200b2009541b22020d0041ff0121022005290308220b2006540d01200b20065221020b2002450d010b2001200241ff017141ff01466a21010b200341c0046a41186a200341c8006a41186a290300370300200341c0046a41106a200341c8006a41106a290300370300200341c0046a41086a200341c8006a41086a290300370300200320032903483703c004200e20014f0d002001200e103b000b0240200e20032802a403470d0020034188036a41186a200e10ea01200328029c03210f20032802a003210d0b200d200141306c6a220241306a2002200e20016b41306c10d0061a2002200637030820022009370300200220032903c004370310200241186a200341c0046a41086a2205290300370300200241206a200341c0046a41106a2208290300370300200241286a200341c0046a41186a220a290300370300410121012003200e41016a3602a803200a200341c8006a41186a2903003703002008200341c8006a41106a2903003703002005200341c8006a41086a290300370300200320032903483703c0040240200f200328029803470d0020034188036a410c6a200f4101109301200328029c03210f0b2003280294032213200f4105746a220220032903c004370000200241186a200a290300370000200241106a2008290300370000200241086a20052903003700002003200f41016a220f36029c030b20001026024020010d000240200328028c03450d0020032802880310260b024020032802980341ffffff3f71450d00201310260b024020032802a4032201450d00200141306c450d0020032802a00310260b024020032802fc0241ffffff3f71450d0020032802f80210260b2004240041070f0b024002400240200f450d00200f4105742100200341c0046a4104722101201321020340200341f8036a200210fe02200341c0046a20032802f803220820032802800410b005200341c8006a41086a220a200141086a290200370300200341c8006a41106a220c200141106a290200370300200341c8006a41186a220d200141186a290200370300200341c8006a41206a220e200141206a290200370300200320012902003703480240024020032802c00422050d00410021050c010b200341b8066a41206a200e290300370300200341b8066a41186a200d290300370300200341b8066a41106a200c290300370300200341b8066a41086a200a290300370300200320032903483703b8060b024020032802fc03450d00200810260b20050d02200241206a2102200041606a22000d000b0b410421164100210f410021080c010b20034198046a41206a2201200341b8066a41206a29030037030020034198046a41186a2208200341b8066a41186a29030037030020034198046a41106a220a200341b8066a41106a29030037030020034198046a41086a220c200341b8066a41086a290300370300200320032903b80637039804412c10242216450d022016200536020020162003290398043702042016410c6a200c290300370200201641146a200a2903003702002016411c6a2008290300370200201641246a200129030037020020034281808080103702dc03200320163602d8030240024020004120470d004101210f0c010b200241206a21082013200f4105746a220e41606a2113200341c0046a41047221014101210f0340200821020340200341f8036a200210fe02200341c0046a20032802f803220020032802800410b005200341c8006a41086a2208200141086a290200370300200341c8006a41106a220a200141106a290200370300200341c8006a41186a220c200141186a290200370300200341c8006a41206a220d200141206a290200370300200320012902003703480240024020032802c00422050d00410021050c010b200341b8066a41206a200d290300370300200341b8066a41186a200c290300370300200341b8066a41106a200a290300370300200341b8066a41086a2008290300370300200320032903483703b8060b024020032802fc03450d00200010260b024020050d00200e200241206a2202470d010c030b0b20034198046a41206a200341b8066a41206a290300220b37030020034198046a41186a200341b8066a41186a290300221037030020034198046a41106a200341b8066a41106a290300221137030020034198046a41086a200341b8066a41086a2903002212370300200320032903b806221437039804200341c0046a41206a220a200b370300200341c0046a41186a220c2010370300200341c0046a41106a220d2011370300200341c0046a41086a22172012370300200320143703c0040240200f20032802dc03470d00200341d8036a200f10ee0120032802d80321160b200241206a21082016200f412c6c6a22002005360200200020032903c0043702042000410c6a2017290300370200200041146a200d2903003702002000411c6a200c290300370200200041246a200a2903003702002003200f41016a220f3602e00320132002470d000b0b20032802dc0321080b200341c0046a41206a20034188036a41206a2802002201360200200341c0046a41186a20034188036a41186a290300220b370300200341c0046a41106a20034188036a41106a290300370300200341c0046a41086a20034188036a41086a29030037030020032003290388033703c004200141306c4104722202417f4c0d00200210242205450d01200ba72100200341003602c006200320023602bc06200320053602b806200341b8066a200110a10102402001450d002000200141306c6a21052000210103402001290300210b200341b8066a20032802c0064108106d20032802b80620032802c00622026a200b3700002003200241086a22023602c006200141086a290300210b200341b8066a20024108106d20032802b80620032802c00622026a200b3700002003200241086a3602c0062003200341b8066a360248200141106a200341c8006a109c01200141306a22012005470d000b0b200341c8006a41fdd4c10010fb02200328024822012003280250200341b8066a1099020240200328024c450d00200110260b024020032802bc06450d0020032802b80610260b200341c8006a41fdd4c100200341c0046a10fc02200328024822012003280250200341cc046a10b1050240200328024c450d00200110260b024020032802c404450d0020032802c00410260b0240200341d0046a28020041ffffff3f71450d0020032802cc0410260b0240200341dc046a2802002201450d00200141306c450d00200010260b024020032802fc0241ffffff3f71450d0020032802f80210260b024020160d002004240041070f0b20074101200741014b1b2201418094ebdc036e2001418094ebdc03704100476a22024101200241014b1b220220014b0d02200341003602a004200342043703980420034198046a4100200f10e7012001200f41036c220520012005491b20026ead428094ebdc037e200120026ead8042ffffffff0f83220b200b7e220b42808090bbbad6adf00d200b42808090bbbad6adf00d541b428094ebdc0380210b20032802a00421000240200f450d00200ba7210520032802980420004102746a2101200f2102034020012005360200200141046a21012002417f6a22020d000b200f20006a21000b200320003602a004200341003602c006200342013703b806200341b8066a41004108106d20032802b80620032802c00622016a20093700002003200141086a22013602c006200341b8066a20014108106d20032802b80620032802c00622016a2006370000200341cc066a4100290085d5413702002003200141086a3602c006200341002900fdd4413702c406200341e3006a200341b8066a41186a280200360000200341db006a200341b8066a41106a290300370000200341d3006a20032903c006370000200320032903b80637004b200341c9046a200341c8006a41086a290000370000200341d1046a200341c8006a41106a290000370000200341c0046a41186a200341df006a290000370000200341e0046a41013a0000200341033a00c004200320032900483700c104200341c0046a1087020240200328029c0441ffffffff0371450d0020032802980410260b0240200f450d00200f412c6c21012016210303400240200341046a28020041ffffff3f71450d00200328020010260b2003412c6a2103200141546a22010d000b0b410821032008450d032008412c6c450d03201610262004240041080f0b1034000b1033000b41b0b2c200411941ccb2c200102f000b2004240020030f0b2004240041060bc00201057f230041106b220324002003410036020820034201370300200341004120106d2003280200200328020822046a2205200229000c370000200541086a200241146a290000370000200541106a2002411c6a290000370000200541186a200241246a2900003700002003200441206a3602082002280200210520032002280208220210a1010240024020020d0020032802002106200328020821020c010b20024105742104200328020821020340200320024120106d20032802002206200328020822076a22022005290000370000200241086a200541086a290000370000200241106a200541106a290000370000200241186a200541186a2900003700002003200741206a2202360208200541206a2105200441606a22040d000b0b200020012006200210b30102402003280204450d00200610260b200341106a24000bcd0502057f047e230041d0016b220324002003200236020c20032001360208200341106a2001200210820202400240200328021022040d00200041003602000c010b200328021421052003200341186a28020022063602442003200436024041002101200341003a0088012006417f6a2102024002400240034020062001460d01200341e8006a20016a200420016a22072d00003a00002003200741016a3602402003200141016a22073a008801200320023602442002417f6a21022007210120074120470d000b200341b0016a41186a2201200341e8006a41186a290300370300200341b0016a41106a2202200341e8006a41106a290300370300200341b0016a41086a2206200341e8006a41086a290300370300200320032903683703b001200741ff01714120490d01200341c8006a41086a2006290300370300200341c8006a41106a2002290300370300200341c8006a41186a2001290300370300200320032903b001370348200341e8006a200341c0006a10920120032802682201450d01200341206a41086a200341c8006a41086a2903002208370300200341206a41106a200341c8006a41106a2903002209370300200341206a41186a200341c8006a41186a290300220a37030020032003290348220b3703202000200329026c370204200020013602002000410c6a200b370200200041146a20083702002000411c6a2009370200200041246a200a3702000c020b200141ff0171450d00200341003a0088010b200341003602b801200342013703b0012003410e360294012003200341086a360290012003200341b0016a360248200341fc006a41013602002003420137026c2003418c8dc600360268200320034190016a360278200341c8006a41c4e1c000200341e8006a10351a20032802b00120032802b801108402024020032802b401450d0020032802b00110260b200041003602000b2005450d00200410260b200341d0016a24000bb70101047f230041106b2203240002400240200228020822044105744104722205417f4c0d0020022802002102200510242206450d012003410036020820032005360204200320063602002003200410a10102402004450d002004410574210403402003200336020c20022003410c6a109c01200241206a2102200441606a22040d000b0b200020012003280200200328020810b30102402003280204450d00200328020010260b200341106a24000f0b1034000b1033000bda0401057f230041106b22022400200241003a0005024002400240024020012802002203280204220420044100472205490d00200241056a20032802002206200510cf061a2003200420056b3602042003200620056a360200024020040d00410021040c030b02400240024020022d0005220441037122034103460d000240024020030e03070001070b200241003b0106200220043a00064101210420012802002201280204220320034100472205490d05200241066a41017220012802002204200510cf0621062001200320056b3602042001200420056a360200024020030d00200620056a41003a00000b20022f0106220441ff014d0d0420044102762103410021040c070b20024100360208200220043a0008200241086a4101722001280200220428020020042802042203410320034103491b220310cf062101200428020422052003490d012004200520036b3602042004200428020020036a360200024020034103732204450d00200120036a4100200410d1061a0b2002280208220341808004492104200341027621030c060b200441034b0d022002410036020c2002410c6a2001280200220328020020032802042204410420044104491b220410cf061a200328020422052004490d012003200520046b3602042003200328020020046a360200024020044104460d002002410c6a20046a4100410420046b10d1061a0b200228020c22034180808080044921040c050b2003200541b8afc0001048000b2004200541b8afc0001048000b410121040b0c010b20044102762103410021040b2000200336020420002004360200200241106a24000bdc0504067f017e027f027e230041206b220224000240024020012802042203450d00200128020022042d0000210520012003417f6a22063602042001200441016a360200024002400240200541037122074103460d0002400240024020070e03000102000b2005410276ad21080c040b410121072006450d0220042d0001210620012003417e6a3602042001200441026a3602002006410874200572220141ffff0371418002490d02200141fcff0371410276ad21080c030b4101210720064103490d01200441036a2d0000210620042f0001210920012003417c6a3602042001200441046a3602002009200641107472410874200572220141808004490d012001410276ad21080c020b02402005410276220a410c4b0d00024002400240200a0e0d00030303010303030303030302000b20064104490d052004350001210820012003417b6a3602042001200441056a36020020084280808080045421074200210b0c060b20064108490d04200429000121082001200341776a3602042001200441096a3602002008428080808080808080015421074200210b0c050b20064110490d03200441096a290000210b2004290001210820012003416f6a3602042001200441116a360200200b428080808080808080015421070c040b200541334b0d02200a41046a21062003417e6a2103200441026a21044100210541012107200241186a2109420021084200210b03402003417f460d01200241106a2004417f6a3100004200200541037441f8007110cd0620012003360204200120043602002003417f6a2103200441016a21042009290300200b84210b20022903102008842108200541016a220541ff01712006490d000b2002427f427f41e800200a4103746b41f8007110d4062008200229030058200b200241086a290300220c58200b200c511b21070c030b0c020b4200210b410021070c010b410121070b20002008370308200041106a200b37030020002007ad370300200241206a24000b860b04087f017e017f037e230041a0026b22022400200241086a2001108d01024002402002280208450d00200041013602000c010b200228020c21032001200128020441016a22043602042002200136021002400240024002400240200420012802084b0d00200241003a00172002410036022020024100360218200241186a41086a21050240024002400240024020030d00200241c0006a41086a200528020036020020022002290318370340200241c0006a21010c010b2003417f6a2106200241c0006a41027221070340200241003a0048200128020022042802042203450d07200428020022082d0000210920042003417f6a3602042004200841016a360200200241013a0048200220093a0040200128020022042802042203450d06200428020022082d0000210920042003417f6a3602042004200841016a360200200241023a0048200220093a0041200128020022042802042203450d06200428020022082d0000210920042003417f6a3602042004200841016a360200200241033a0048200220093a0042200128020022042802042203450d06200428020022082d0000210920042003417f6a3602042004200841016a360200200241043a0048200220093a0043200128020022042802042203450d06200428020022082d0000210920042003417f6a3602042004200841016a360200200241053a0048200220093a0044200128020022042802042203450d06200428020022082d0000210920042003417f6a3602042004200841016a360200200241063a0048200220093a0045200128020022042802042203450d06200428020022082d0000210920042003417f6a3602042004200841016a360200200241073a0048200220093a0046200128020022042802042203450d06200428020022082d0000210920042003417f6a3602042004200841016a360200200220093a00472002290340210a20022001108d0120022802000d0720012802002203280204220820022802042204490d072004417f4c0d020240024020040d004100210b410121090c010b2004102a2209450d042001280200220328020421082004210b0b0240024020082004490d0020092003280200200410cf0621082003280204220120044f0d012004200141b8afc0001048000b200b450d08200910260c080b2003200120046b3602042003200328020020046a3602002008450d072002200a3703280240024020022802182201450d00200228021c21030c010b2007410041de0110d1061a41e40110242201450d054100210320014100360200200141046a200241c0006a41e00110cf061a2002410036021c200220013602180b2004ad422086200bad84210c20022001360234200220033602302002200241186a360238200241c0006a200241306a200241286a10a6030240024020022802404101470d002002290244210d200229024c210e2002200a370254200220053602502002200e3703482002200d3703402002200c37023420022008360230200241c0006a200241306a10a7030c010b20022802482002280250410c6c6a220141e4006a220428020021032004200c370200200141e0006a22042802002101200420083602002001450d002003450d00200110260b02402006450d002006417f6a2106200228021021010c010b0b20022d00172101200241c0006a41086a200241186a41086a2802003602002002200229031837034020010d07200241c0006a21010b200020012902003702042000410c6a200141086a280200360200410021010c070b1034000b1033000b102c000b200041013602000c040b200241003a00480b200241013a0017200241c0006a41086a200241186a41086a280200360200200220022903183703400b200241c0006a10a503410121010b20002001360200200228021022012001280204417f6a3602040b200241a0026a24000bea0a02097f027e230041a0016b22012400200141186a200010b605200141c0006a22024200370300200141286a41106a22034200370300200141286a41086a2204420037030020014200370328200141c8006a41808cc700410610fb012004200141c8006a41086a220529000037030020012001290048370328200141c8006a41bcbfc400411210fb0120022005290000370300200320012900483703002001412036025c2001200141286a360258200141e0006a200141286a41201082020240024002400240200128026022020d00410221040c010b200128026421052001200141e0006a41086a28020036027420012002360270200141106a200141f0006a108f0102400240024020012802100d00200141086a200141f0006a108f0120012802080d0020012802742204200128020c2206490d002006417f4c0d040240024020060d0041002107410121080c010b2006102a2208450d0620012802742104200621070b0240024020042006490d0020082001280270200610cf0621042001280274220920064f0d012006200941b8afc0001048000b2007450d01200810260c010b2001200920066b3602742001200128027020066a36027020040d010b20014100360250200142013703482001410e36027c2001200141d8006a3602782001200141c8006a360284012001419c016a41013602002001420137028c012001418c8dc600360288012001200141f8006a3602980120014184016a41c4e1c00020014188016a10351a200128024820012802501084020240200128024c450d00200128024810260b410221040c010b410121040b2005450d00200210260b200041d0006a2102200041106a21050240024020044102460d0041012104024020064106470d000240200841a88ac700470d00410021040c010b41a88ac7002008410610d20641004721040b02402007450d00200810260b2004450d010b20014194016a41002902f089473702002001410036028801200141002902e8894737028c01200141c0006a4200370300200141386a4200370300200141286a41086a2204420037030020014200370328200141c8006a41808cc700410610fb012004200141c8006a41086a220629000037030020012001290048370328200141c8006a41bcbfc400411210fb01200341086a2006290000370000200320012900483700002001410036025020014201370348200141c8006a41004101106d2001280248200128025022046a41003a00002001200441016a360250200141c8006a20014188016a41047210a301200141286a412020012802482204200128025010b3010240200128024c450d00200410260b420010c7040b200028020020052002200141186a410110b304427f200028020010dc03220a4280e497d0127c220b200b200a541b10c704200141c0006a4200370300200141386a4200370300200141286a41086a2200420037030020014200370328200141c8006a41808cc700410610fb012000200141c8006a41086a220229000037030020012001290048370328200141c8006a41fcbfc400410e10fb01200341086a200229000037000020032001290048370000200141286a4100410010b40420012802182104024020012802202200450d00200041246c21032004210003400240024020002d0000220241044b0d0002400240024020020e050400010204040b2000410c6a280200450d03200041086a28020010260c030b2000410c6a280200450d02200041086a28020010260c020b2000410c6a280200450d01200041086a28020010260c010b200041086a280200450d00200041046a28020010260b200041246a21002003415c6a22030d000b0b0240200128021c2200450d00200041246c450d00200410260b200141a0016a24000f0b1034000b1033000bfa02010b7f230041c0006b2202240041002103200041003602082000420437020002402001410c6a28020041246c2204450d0020012802042101410421050340024020012d00004101470d00200141016a2800002106200241206a200141086a10c80120022006360218200220022802283602042002280220210720022802242108200241206a41086a2209200241046a41086a290200370300200241206a41106a220a200241046a41106a280200360200200220063602382002200228001b36003b2002200229020437032002402003200041046a280200470d0020002003410110d10120002802082103200028020021050b2005200341246c6a220641013a00002002280238210b200228003b210c2006200836020c20062007360208200641046a200c3600002006200b36000120062002290320370210200641186a2009290300370200200641206a200a2802003602002000200341016a22033602080b200141246a21012004415c6a22040d000b0b200241c0006a24000be50905047f017e047f047e047f230041f0096b2204240020044198066a200141c80310cf061a20044190036a20044198066a10ed04410121050240024002400240024020042d0090034101460d00200441106a20044190036a41086a220641800310cf061a024020032802002201450d00200441086a41da93c4004110108902200428020c2105200428020821072006200341086a280200360200200420032902003703900320044198066a2005410020071b10b904200428029806220520042802a00620044190036a1099020240200428029c06450d00200510260b0240200428029403450d0020042802900310260b410021050b200441e0096a200441e0006a10a10320044198066a200441106a41800310cf061a20044190036a20044198066a20042903e009220820042d00e80920042d00e909200210ea03024020042d0090034101460d00200441ba036a2d00002107200441b9036a2d00002109200441b8036a2d00002102200441bb036a2d0000210a200441bc036a280200210b200441c0036a280200210c2008200441a8036a290300220d200d2008561b200820044190036a41106a290300220e4201511b210820042903e809210f0240200629030022104201520d00200441b0036a2d000021114198b2c700410d1084020240024002400240024020020e0403000102030b418ab2c700410e1084020c030b4180b2c700410a1084020c020b2009ad42ff018310f2032007ad42ff018310f203200b450d010b200b200c1084020b4197cbc100410a10840241869fc000410e10840202400240200e4201510d0041fc9ec000410a1084020c010b200d10f2030b41f39ec0004109108402410121060240201141ff01714101470d0041f19ec00041021084020c050b41ee9ec00041031084020c040b2008422088a721122008a7211341002106200f21080c040b200020042f00910320042d0093034110747222023b0001200041013a0000200041036a20024110763a000020054521000c010b200020042f0091033b0001200041013a0000200041036a20042d0093033a000020032802002101410021000b20000d022001450d02200341046a280200450d02200110260c020b200b2113200c21120b20044198066a41086a221420063a0000200441a1066a20042f0090033b0000200441b8066a200f370300200441b0066a22062008370300200441a7066a200a3a000020044198066a410e6a20073a0000200441a5066a20093a000020044198066a410c6a20023a0000200441a3066a20044192036a2d00003a000020044198066a41106a22112012ad4220862013ad84370300200441003a00980620044198066a108702200441da93c40041101089022004200428020441016a410120042802001b22133602980641da93c400411020044198066a410410b301200642003703002011420037030020144200370300200442003703980620044198066a41808cc700410610fb0120044190036a41fcbfc400410e10fb01200620044190036a41086a290000370300201120042900900337030020044198066a4100201310b4042000410c6a200c360000200041086a200b360000200041076a200a3a0000200041066a20073a0000200041056a20093a0000200041046a41042002410420104201511b200e4202511b3a0000200041003a00002005450d002001450d00200341046a280200450d00200110260b200441f0096a24000b990101057f0240200028020022020d0041000f0b200028020421030340200241086a210420022f010621054100210002400240034020052000460d0120012004410810d2062206450d02200041016a2100200441086a21042006417f4a0d000b2000417f6a21050b024020030d0041000f0b2003417f6a2103200220054102746a41e4016a28020021020c010b0b20022000410c6c6a41e0006a0bb83205077f017e017f0b7e0b7f230022062107200641e0086b41607122062400024002400240024020022d00004101470d00200641b8036a200241196a290000370300200641b0036a200241116a290000370300200641a8036a200241096a290000370300200620022900013703a003200328020822084101762102200328020421092003280200210a024002402008410171450d0020092002490d03200220094f0d01200a20026a2d00004170712109410121080c040b024020092002490d00410021080c040b2002200941a8bcc7001047000b2002200941b8bcc7001032000b200241046a28020021020c020b200220094198bcc7001047000b200141c0006a280200210b200128023c210c200641e9046a20093a0000200620083a00e804200620023602e4042006200a3602e004200620062f01c8073b01ea0420064188086a200c200641a0036a200641e0046a200b28020c11040002400240024020062802880822090d00200641f0056a2201200641ab036a290000370300200641e8056a41106a2203200641b3036a290000370300200641fd056a2209200641b8036a290000370000200620062900a3033703e80520062d00a203210520062f01a003210a4130102422020d01102c000b200629028c08210d200641c0046a41186a200641a0036a41186a2208290300370300200641c0046a41106a200641a0036a41106a220b290300370300200641c0046a41086a200641a0036a41086a220c290300370300200620062903a0033703c004200641e0046a200641c0046a2009200d422088a7200141206a220e10ba0520062802e404210220062802e004210a20064188086a200641e0046a41086a41d40010cf061a0240200a4101470d00200da7450d02200910260c020b200641e0036a20064188086a41d40010cf061a200620023602840520064188056a200641e0036a41d40010cf061a200641f9046a2008290300370000200641f1046a200b290300370000200641e9046a200c290300370000200641013a00e004200620062903a0033700e104200e200641e0046a1087042102200da7450d02200910260c020b2002200a20054110747222053b0001200241013a0000200220062903e805370004200220062900e004370021200241036a20054110763a00002002410c6a2001290300370000200241146a2003290300370000200241196a2009290000370000200241286a200641e7046a2900003700000b20004101360200200020023602040240200441046a280200450d00200428020010260b200724000f0b0240200141386a220b28020022092009417f6a2208200141306a220a28020022092001412c6a220c2802006b716b4101470d00200c108604200b280200417f6a2108200a28020021090b200a2008200941016a71360200200141346a28020020094102746a20023602000240024002400240024002400240200141286a280200220920024d0d00200141206a220a280200200241fc006c6a2202290210210f200220062903f00437021020022902082110200220062903e804370208200241186a22092902002111200920062903f804370200200641003a00e004200641003602e4042002290200210d200220062903e00437020020022902402112200241c8006a2902002113200241d0006a2902002114200241d8006a290200211520022902202116200241286a2902002117200241306a2902002118200241386a290200211920064180036a41086a2209200241e8006a29020037030020064180036a41106a2208200241f0006a29020037030020064180036a41186a220b200241f8006a280200360200200620113703f8032006200f3703f003200620103703e8032006200d3703e003200620193703d804200620183703d004200620173703c804200620163703c004200620153703b803200620143703b003200620133703a803200620123703a0032006200229026037038003200641d0036a41086a2202200441086a280200360200200620042902003703d0030240024002400240024002400240200da7220c41ff01714101470d002003280200210e2003280204211a2003280208210420064188076a41186a20062802fc0336020020064188076a41106a20062902f40337030020064188076a41086a20062902ec03370300200620062902e40337038807200641bc086a2015370200200641b4086a201437020020064188086a41246a2013370200200641a4086a201237020020064188086a41186a20062802dc0436020020064188086a41106a20062902d40437030020064188086a41086a20062902cc04370300200620062902c4043703880820064188086a413c6a20062903800337020020064188086a41c4006a2009290300370200200641d4086a2008290300370200200641dc086a200b280200360200200641e8056a41086a2002280200360200200620062903d0033703e805200641e0046a200120064188086a2003200641e8056a200510bb0520062802e404210220062802e0044101460d06200d420888a721052016a72108200641e8076a41186a220b20064180056a280200360200200641e8076a41106a221b200641e0046a41186a290300370300200641e8076a41086a221c200641e0046a41106a221d290300370300200641c8076a41086a221e2006418d056a290000370300200641c8076a41106a221f20064195056a290000370300200641c8076a41176a2220200641e0046a413c6a29000037000020062006290085053703c8072006200641e0046a41086a22212903003703e807200641e0046a41246a2d00002103200641a8076a41086a2222200641ad056a290000370300200641a8076a41106a2223200641b5056a290000370300200641a8076a41176a2224200641bc056a280000360000200620062900a5053703a807200641e0046a41c4006a2d0000210920020e03030201030b200641bc086a2019370200200641b4086a201837020020064188086a41246a2017370200200641a4086a201637020020064188086a41186a20062802fc0336020020064188086a41106a20062902f40337030020064188086a41086a20062902ec0337030020064188086a413c6a20062903a00337020020064188086a41c4006a20062903a803370200200641d4086a20062903b003370200200641dc086a20062802b803360200200620062902e4033703880820064188076a41086a2002280200360200200620062903d00337038807200641e0046a200120064188086a200320064188076a200510bb0520062802e404210220062802e0044101460d05200641e8056a41186a220920064180056a280200360200200641e8056a41106a2208200641e0046a41186a290300370300200641e8056a41086a220b200641e0046a41106a290300370300200641c8076a41086a220e2006418d056a290000370300200641c8076a41106a221a20064195056a290000370300200641c8076a41176a221b200641e0046a413c6a29000037000020062006290085053703c8072006200641e0046a41086a2903003703e805200641e0046a41246a2d00002103200641e8076a41086a221c200641ad056a290000370300200641e8076a41106a221d200641b5056a290000370300200641e8076a41176a221e200641bc056a280000360000200620062900a5053703e807200641e0046a41c4006a2d0000210541022101024020020e03000405000b200641e8066a41186a2009280200360200200641e8066a41106a2008290300370300200641e8066a41086a200b290300370300200641c8066a41086a200e290300370300200641c8066a41106a201a290300370300200641c8066a41176a201b290000370000200641a8066a41086a201c290300370300200641a8066a41106a201d290300370300200641a8066a41176a201e280000360000200620062903e8053703e806200620062903c8073703c806200620062903e8073703a80641002101410121040c040b20044101762102024002402004410171450d00201a2002490d082002201a4f0d01200e20026a2d00004170712103410121040c0b0b0240201a2002490d00410021040c0b0b2002201a41a8bcc7001047000b2002201a41b8bcc7001032000b200641e8066a41086a20064188076a41086a290300370300200641e8066a41106a20064188076a41106a290300370300200641e8066a41186a20064188076a41186a280200360200200641eb046a201c290300370000200641f3046a201b290300370000200641fb046a200b280200360000200641a8066a41176a2020290000370000200641a8066a41106a201f290300370300200641a8066a41086a201e29030037030020062006290388073703e806200620062903e8073700e304200620062903c8073703a80620064188066a41176a202428000036000020064188066a41106a202329030037030020064188066a41086a2022290300370300200641c8066a41176a200641e0046a41176a290000370000200641c8066a41106a201d290000370300200641c8066a41086a2021290000370300200620062903a80737038806200620062900e0043703c806410121014100210420032105200821030c090b20044101762102024002402004410171450d00201a2002490d072002201a4f0d01200e20026a2d000041707121044101210b0c080b0240201a2002490d004100210b0c080b2002201a41a8bcc7001047000b2002201a41b8bcc7001032000b200641e8066a41186a2009280200360200200641e8066a41106a2008290300370300200641e8066a41086a200b290300370300200641c8066a41086a200e290300370300200641c8066a41106a201a290300370300200641c8066a41176a201b290000370000200641a8066a41086a201c290300370300200641a8066a41106a201d290300370300200641a8066a41176a201e280000360000200620062903e8053703e806200620062903c8073703c806200620062903e8073703a80641002104410021010b0c060b410121010c060b2002200941b089c6001032000b2002201a4198bcc7001047000b2002201a4198bcc7001047000b20064188086a200e200210bc05200641b5086a20043a0000200641eb046a20064188076a41086a290300370000200641f3046a20064188076a41106a290300370000200641fb046a20064188076a41186a280200360000200641e0046a41286a20064188086a41086a29030037030020064190056a20064188086a41106a29030037030020064198056a20064188086a41186a290300370300200641a0056a200641a8086a2903003703002006200b3a00b408200641a8056a20064188086a41286a290300370300200620083a00ff0420062006290388073700e304200620062903880837038005200620053b01e004200620054110763a00e2042001200641e0046a10bd05200641e8066a41086a200641e8076a41086a290300370300200641e8066a41106a200641e8076a41106a290300370300200641e8066a41186a200641e8076a41186a280200360200200641c8066a41086a200641c8076a41086a290300370300200641c8066a41106a200641c8076a41106a290300370300200641c8066a41176a200641c8076a41176a290000370000200641a8066a41086a200641a8076a41086a290300370300200641a8066a41106a200641a8076a41106a290300370300200641a8066a41176a200641a8076a41176a280000360000200620062903e8073703e806200620062903c8073703c806200620062903a8073703a8064100210141012104200921050c010b20064188086a200e200210bc05200641b5086a20033a0000200641eb046a20064188076a41086a290300370000200641f3046a20064188076a41106a290300370000200641fb046a20064188076a41186a280200360000200641e0046a41286a20064188086a41086a29030037030020064190056a20064188086a41106a29030037030020064198056a20064188086a41186a290300370300200641a0056a200641a8086a290300370300200620043a00b408200641a8056a20064188086a41286a290300370300200620083a00ff0420062006290388073700e304200620062903880837038005200620053b01e004200620054110763a00e2042001200641e0046a10bd05410221010b200641c8076a41186a200641e8066a41186a280200360200200641c8076a41106a200641e8066a41106a290300370300200641c8076a41086a200641e8066a41086a290300370300200641e0046a41086a200641c8066a41086a290300370300200641e0046a41106a200641c8066a41106a290300370300200641e0046a41176a200641c8066a41176a29000037000020064188086a41086a200641a8066a41086a29030037030020064188086a41106a200641a8066a41106a29030037030020064188086a41176a200641a8066a41176a290000370000200620062903e8063703c807200620062903c8063703e004200620062903a80637038808200641e8056a41176a20064188066a41176a280000360000200641e8056a41106a20064188066a41106a290300370300200641e8056a41086a20064188066a41086a29030037030020062006290388063703e8052001200c41807e71722102410021010b200641e0026a41086a2208200641c8076a41086a290300370300200641e0026a41106a220b200641c8076a41106a290300370300200641e0026a41186a220c200641c8076a41186a280200360200200641c0026a41086a220e200641e0046a41086a290300370300200641c0026a41106a221a200641e0046a41106a290300370300200641c0026a41176a221b200641e0046a41176a290000370000200620062903c8073703e002200620062903e0043703c002200641a0026a41176a221c20064188086a41176a290000370000200641a0026a41106a221d20064188086a41106a290300370300200641a0026a41086a221e20064188086a41086a29030037030020064180026a41086a221f200641e8056a41086a29030037030020064180026a41106a2220200641e8056a41106a29030037030020064180026a41176a2221200641e8056a41176a28000036000020062006290388083703a002200620062903e805370380020240024020010d00200641e0016a41186a200c280200360200200641e0016a41106a200b290300370300200641e0016a41086a2008290300370300200641c0016a41086a200e290300370300200641c0016a41106a201a290300370300200641c0016a41176a201b290000370000200641a0016a41086a201e290300370300200641a0016a41106a201d290300370300200641a0016a41176a201c290000370000200620062903e0023703e001200620062903c0023703c001200620062903a0023703a00120064180016a41176a202128000036000020064180016a41106a202029030037030020064180016a41086a201f290300370300200620062903800237038001200241ff01714102460d01200641e0006a41186a2201200641e0016a41186a280200360200200641e0006a41106a2208200641e0016a41106a290300370300200641e0006a41086a220b200641e0016a41086a290300370300200641c0006a41086a220c200641c0016a41086a290300370300200641c0006a41106a220e200641c0016a41106a290300370300200641c0006a41176a221a200641c0016a41176a290000370000200641206a41086a221b200641a0016a41086a290300370300200641206a41106a221c200641a0016a41106a290300370300200641206a41176a221d200641a0016a41176a290000370000200620062903e001370360200620062903c001370340200620062903a001370320200641176a221e20064180016a41176a280000360000200641106a221f20064180016a41106a290300370300200641086a222020064180016a41086a2903003703002006200629038001370300200641c0046a41086a2221200b290300370300200641c0046a41106a220b2008290300370300200641c0046a41186a22082001280200360200200620062903603703c00420064188086a41086a2201200c29030037030020064188086a41106a220c200e29030037030020064188086a41176a220e201a2900003700002006200629034037038808200641e0036a41086a221a201b290300370300200641e0036a41106a221b201c290300370300200641e0036a41176a221c201d290000370000200620062903203703e003200641a0036a41176a221d201e280000360000200641a0036a41106a221e201f290300370300200641a0036a41086a221f2020290300370300200620062903003703a00320064180056a20033a0000200620023a00e004200620024118763a00e304200620024108763b00e104200641ec046a2021290300370200200641f4046a200b290300370200200641fc046a2008280200360200200620062903c0043702e40420064181056a20062903880837000020064189056a200129030037000020064191056a200c29030037000020064198056a200e290000370000200641a0056a20053a0000200641b8056a201c290000370000200641b1056a201b290300370000200641a9056a201a290300370000200641a1056a20062903e003370000200641c0056a20093a0000200641d8056a201d280000360000200641d1056a201e290300370000200641c9056a201f290300370000200641c1056a20062903a003370000200a200641e0046a1087042106200041086a20043a00002000200636020420004100360200200724000f0b2000410136020020002002360204200724000f0b41a08cc600411841b88cc6001053000be4a40120047f017e017f017e017f017e017f017e017f017e017f017e017f017e017f017e017f017e017f017e017f017e017f017e017f017e027f017e087f017e087f017e230041b00e6b22052400200541086a2002200310d2040240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020052d00084101470d0020052d00092102200541900e6a41086a2203200141086a290000370300200541900e6a41106a2204200141106a290000370300200541900e6a41186a2206200141186a290000370300200520012900003703900e4130102422010d010c2b0b200541d4016a2802002107200541d0016a2802002108200541c8016a2903002109200541c4016a280200210a200541bc016a290200210b200541b8016a280200210c200541b0016a290300210d200541ac016a280200210e200541a4016a290200210f200541a0016a280200211020054198016a290300211120054194016a28020021122005418c016a290200211320054188016a280200211420054180016a2903002115200541fc006a2802002116200541f4006a2902002117200541f0006a2802002118200541e8006a2903002119200541e4006a280200211a200541dc006a290200211b200541086a41d0006a280200211c200541086a41c8006a290300211d200541086a41c4006a280200211e200541086a413c6a290200211f200541086a41386a2802002120200541386a2903002121200541086a412c6a2802002122200541086a41246a22232902002124200541286a22252802002126200541086a411c6a22272802002128200541086a41186a222928020021022005411c6a222a280200212b200541086a410c6a222c290200212d200541086a41086a222e280200212f41002130200528020c0e051502030401150b200141033a0000200120052903900e370001200120023a0021200120052901e00d370122200141096a2003290300370000200141116a2004290300370000200141196a2006290300370000200141286a200541e60d6a29010037010020004101360200200020013602040c280b200541e0016a2802002131200541dc016a2802002130200541d8016a28020021324102210302400240202b4102470d0041002102410021060c010b200541900e6a41186a2206200141186a290000370300200541900e6a41106a2233200141106a290000370300200541900e6a41086a2234200141086a290000370300200520012900003703900e200541e00d6a41086a2028360200200520023602e40d2005202b3602e00d200541086a200541900e6a200541e00d6a200410be05200528020c210341012102024020052802084101460d002006200541286a2903003703002033200541086a41186a2903003703002034200541086a41106a2903003703002005200541086a41086a2903003703900e410021020b200341807e7121060b200541c0066a41186a2233200541900e6a41186a290300370300200541c0066a41106a222b200541900e6a41106a290300370300200541c0066a41086a2234200541900e6a41086a290300370300200520052903900e3703c0062006200341ff017172210620020d03200541a0066a41186a2033290300370300200541a0066a41106a202b290300370300200541a0066a41086a2034290300370300200520052903c0063703a006410221024100210341002133024020264102460d00200541900e6a41186a2233200141186a290000370300200541900e6a41106a222b200141106a290000370300200541900e6a41086a2234200141086a290000370300200520012900003703900e200520243702e40d200520263602e00d200541086a200541900e6a200541e00d6a200410be05200528020c210241012103024020052802084101460d002033200541286a290300370300202b200541086a41186a2903003703002034200541086a41106a2903003703002005200541086a41086a2903003703900e410021030b200241807e7121330b20054180076a41186a222b200541900e6a41186a29030037030020054180076a41106a2234200541900e6a41106a29030037030020054180076a41086a2235200541900e6a41086a290300370300200520052903900e370380072033200241ff017172210220030d04200541e0066a41186a202b290300370300200541e0066a41106a2034290300370300200541e0066a41086a203529030037030020052005290380073703e00641022103410021334100212b024020224102460d00200541900e6a41186a222b200141186a290000370300200541900e6a41106a2234200141106a290000370300200541900e6a41086a2235200141086a290000370300200520012900003703900e200520213702e40d200520223602e00d200541086a200541900e6a200541e00d6a200410be05200528020c210341012133024020052802084101460d00202b200541286a2903003703002034200541086a41186a2903003703002035200541086a41106a2903003703002005200541086a41086a2903003703900e410021330b200341807e71212b0b200541c0076a41186a2234200541900e6a41186a290300370300200541c0076a41106a2235200541900e6a41106a290300370300200541c0076a41086a2225200541900e6a41086a290300370300200520052903900e3703c007202b200341ff017172212b20330d05200541a0076a41186a2034290300370300200541a0076a41106a2035290300370300200541a0076a41086a2025290300370300200520052903c0073703a007410221034100213341002134024020204102460d00200541900e6a41186a2234200141186a290000370300200541900e6a41106a2235200141106a290000370300200541900e6a41086a2225200141086a290000370300200520012900003703900e2005201f3702e40d200520203602e00d200541086a200541900e6a200541e00d6a200410be05200528020c210341012133024020052802084101460d002034200541286a2903003703002035200541086a41186a2903003703002025200541086a41106a2903003703002005200541086a41086a2903003703900e410021330b200341807e7121340b20054180086a41186a2235200541900e6a41186a29030037030020054180086a41106a2225200541900e6a41106a29030037030020054180086a41086a2229200541900e6a41086a290300370300200520052903900e370380082034200341ff017172213420330d06200541e0076a41186a2035290300370300200541e0076a41106a2025290300370300200541e0076a41086a202929030037030020052005290380083703e0074102210341002133410021350240201e4102460d00200541900e6a41186a2235200141186a290000370300200541900e6a41106a2225200141106a290000370300200541900e6a41086a2229200141086a290000370300200520012900003703900e2005201d3702e40d2005201e3602e00d200541086a200541900e6a200541e00d6a200410be05200528020c210341012133024020052802084101460d002035200541286a2903003703002025200541086a41186a2903003703002029200541086a41106a2903003703002005200541086a41086a2903003703900e410021330b200341807e7121350b200541c0086a41186a2225200541900e6a41186a290300370300200541c0086a41106a2229200541900e6a41106a290300370300200541c0086a41086a222c200541900e6a41086a290300370300200520052903900e3703c0082035200341ff017172213520330d07200541a0086a41186a2025290300370300200541a0086a41106a2029290300370300200541a0086a41086a202c290300370300200520052903c0083703a0084102210341002133410021250240201c4102460d00200541900e6a41186a2225200141186a290000370300200541900e6a41106a2229200141106a290000370300200541900e6a41086a222c200141086a290000370300200520012900003703900e2005201b3702e40d2005201c3602e00d200541086a200541900e6a200541e00d6a200410be05200528020c210341012133024020052802084101460d002025200541286a2903003703002029200541086a41186a290300370300202c200541086a41106a2903003703002005200541086a41086a2903003703900e410021330b200341807e7121250b20054180096a41186a2229200541900e6a41186a29030037030020054180096a41106a222c200541900e6a41106a29030037030020054180096a41086a2228200541900e6a41086a290300370300200520052903900e370380092025200341ff017172212520330d08200541e0086a41186a2029290300370300200541e0086a41106a202c290300370300200541e0086a41086a202829030037030020052005290380093703e0084102210341002133410021290240201a4102460d00200541900e6a41186a2229200141186a290000370300200541900e6a41106a222c200141106a290000370300200541900e6a41086a2228200141086a290000370300200520012900003703900e200520193702e40d2005201a3602e00d200541086a200541900e6a200541e00d6a200410be05200528020c210341012133024020052802084101460d002029200541286a290300370300202c200541086a41186a2903003703002028200541086a41106a2903003703002005200541086a41086a2903003703900e410021330b200341807e7121290b200541c0096a41186a222c200541900e6a41186a290300370300200541c0096a41106a2228200541900e6a41106a290300370300200541c0096a41086a2226200541900e6a41086a290300370300200520052903900e3703c0092029200341ff017172212920330d09200541a0096a41186a202c290300370300200541a0096a41106a2028290300370300200541a0096a41086a2026290300370300200520052903c0093703a00941022103410021334100212c024020184102460d00200541900e6a41186a222c200141186a290000370300200541900e6a41106a2228200141106a290000370300200541900e6a41086a2226200141086a290000370300200520012900003703900e200520173702e40d200520183602e00d200541086a200541900e6a200541e00d6a200410be05200528020c210341012133024020052802084101460d00202c200541286a2903003703002028200541086a41186a2903003703002026200541086a41106a2903003703002005200541086a41086a2903003703900e410021330b200341807e71212c0b200541800a6a41186a2228200541900e6a41186a290300370300200541800a6a41106a2226200541900e6a41106a290300370300200541800a6a41086a2223200541900e6a41086a290300370300200520052903900e3703800a202c200341ff017172212c20330d0a200541e0096a41186a2028290300370300200541e0096a41106a2026290300370300200541e0096a41086a2023290300370300200520052903800a3703e009410221034100213341002128024020164102460d00200541900e6a41186a2228200141186a290000370300200541900e6a41106a2226200141106a290000370300200541900e6a41086a2223200141086a290000370300200520012900003703900e200520153702e40d200520163602e00d200541086a200541900e6a200541e00d6a200410be05200528020c210341012133024020052802084101460d002028200541286a2903003703002026200541086a41186a2903003703002023200541086a41106a2903003703002005200541086a41086a2903003703900e410021330b200341807e7121280b200541c00a6a41186a2226200541900e6a41186a290300370300200541c00a6a41106a2223200541900e6a41106a290300370300200541c00a6a41086a2227200541900e6a41086a290300370300200520052903900e3703c00a2028200341ff017172212820330d0b200541a00a6a41186a2026290300370300200541a00a6a41106a2023290300370300200541a00a6a41086a2027290300370300200520052903c00a3703a00a410221034100213341002126024020144102460d00200541900e6a41186a2226200141186a290000370300200541900e6a41106a2223200141106a290000370300200541900e6a41086a2227200141086a290000370300200520012900003703900e200520133702e40d200520143602e00d200541086a200541900e6a200541e00d6a200410be05200528020c210341012133024020052802084101460d002026200541286a2903003703002023200541086a41186a2903003703002027200541086a41106a2903003703002005200541086a41086a2903003703900e410021330b200341807e7121260b200541800b6a41186a2223200541900e6a41186a290300370300200541800b6a41106a2227200541900e6a41106a290300370300200541800b6a41086a222a200541900e6a41086a290300370300200520052903900e3703800b2026200341ff017172212620330d0c200541e00a6a41186a2023290300370300200541e00a6a41106a2027290300370300200541e00a6a41086a202a290300370300200520052903800b3703e00a410221034100213341002123024020124102460d00200541900e6a41186a2223200141186a290000370300200541900e6a41106a2227200141106a290000370300200541900e6a41086a222a200141086a290000370300200520012900003703900e200520113702e40d200520123602e00d200541086a200541900e6a200541e00d6a200410be05200528020c210341012133024020052802084101460d002023200541286a2903003703002027200541086a41186a290300370300202a200541086a41106a2903003703002005200541086a41086a2903003703900e410021330b200341807e7121230b200541c00b6a41186a2227200541900e6a41186a290300370300200541c00b6a41106a222a200541900e6a41106a290300370300200541c00b6a41086a2222200541900e6a41086a290300370300200520052903900e3703c00b2023200341ff017172212320330d0d200541a00b6a41186a2027290300370300200541a00b6a41106a202a290300370300200541a00b6a41086a2022290300370300200520052903c00b3703a00b410221034100213341002127024020104102460d00200541900e6a41186a2227200141186a290000370300200541900e6a41106a222a200141106a290000370300200541900e6a41086a2222200141086a290000370300200520012900003703900e2005200f3702e40d200520103602e00d200541086a200541900e6a200541e00d6a200410be05200528020c210341012133024020052802084101460d002027200541286a290300370300202a200541086a41186a2903003703002022200541086a41106a2903003703002005200541086a41086a2903003703900e410021330b200341807e7121270b200541800c6a41186a222a200541900e6a41186a290300370300200541800c6a41106a2222200541900e6a41106a290300370300200541800c6a41086a222e200541900e6a41086a290300370300200520052903900e3703800c2027200341ff017172212720330d0e200541e00b6a41186a202a290300370300200541e00b6a41106a2022290300370300200541e00b6a41086a202e290300370300200520052903800c3703e00b41022133410021034100212a0240200e4102460d00200541900e6a41186a222a200141186a290000370300200541900e6a41106a2222200141106a290000370300200541900e6a41086a222e200141086a290000370300200520012900003703900e2005200d3702e40d2005200e3602e00d200541086a200541900e6a200541e00d6a200410be05200528020c213341012103024020052802084101460d00202a200541286a2903003703002022200541086a41186a290300370300202e200541086a41106a2903003703002005200541086a41086a2903003703900e410021030b203341807e71212a203341ff017121330b200541c00c6a41186a2222200541900e6a41186a290300370300200541c00c6a41106a222e200541900e6a41106a290300370300200541c00c6a41086a2220200541900e6a41086a290300370300200520052903900e3703c00c202a203372213320030d0f200541a00c6a41186a2022290300370300200541a00c6a41106a202e290300370300200541a00c6a41086a2020290300370300200520052903c00c3703a00c4102212a41002103410021220240200c4102460d00200541900e6a41186a2222200141186a290000370300200541900e6a41106a222e200141106a290000370300200541900e6a41086a2220200141086a290000370300200520012900003703900e2005200b3702e40d2005200c3602e00d200541086a200541900e6a200541e00d6a200410be05200528020c212a41012103024020052802084101460d002022200541286a290300370300202e200541086a41186a2903003703002020200541086a41106a2903003703002005200541086a41086a2903003703900e410021030b202a41807e712122202a41ff0171212a0b200541800d6a41186a222e200541900e6a41186a290300370300200541800d6a41106a2220200541900e6a41106a290300370300200541800d6a41086a221e200541900e6a41086a290300370300200520052903900e3703800d2022202a72212a20030d10200541e00c6a41186a202e290300370300200541e00c6a41106a2020290300370300200541e00c6a41086a201e290300370300200520052903800d3703e00c41022122410021034100212e0240200a4102460d00200541900e6a41186a222e200141186a290000370300200541900e6a41106a2220200141106a290000370300200541900e6a41086a221e200141086a290000370300200520012900003703900e200520093702e40d2005200a3602e00d200541086a200541900e6a200541e00d6a200410be05200528020c212241012103024020052802084101460d00202e200541286a2903003703002020200541086a41186a290300370300201e200541086a41106a2903003703002005200541086a41086a2903003703900e410021030b202241807e71212e202241ff017121220b200541c00d6a41186a2220200541900e6a41186a290300370300200541c00d6a41106a221e200541900e6a41106a290300370300200541c00d6a41086a221c200541900e6a41086a290300370300200520052903900e3703c00d202e202272212220030d24200541a00d6a41186a2020290300370300200541a00d6a41106a201e290300370300200541a00d6a41086a201c290300370300200520052903c00d3703a00d4102210320084102470d1141002101410021040c120b200541086a202f202da710bc05200541900e6a41086a2029290300370300200541900e6a41106a2025290300370300200541900e6a41186a200541306a2802003602002005200541086a41106a2903003703900e2002417f4c0d13202c2802002133200529020c21362005280208210641012130410121014100210302402002450d00200210242201450d25200221030b202d422088a7213420054100360210200520013602082005200336020c200541086a4100200210c90120052802082203200528021022016a202b200210cf061a20054180026a41086a200541900e6a41086a29030037030020054180026a41106a200541900e6a41106a29030037030020054180026a41186a200541900e6a41186a2802003602002005200120026a360210200520052903900e37038002200529020c222d422088a72131202da721320c120b200541086a202f202da710bc05200541e00d6a41086a2029290300370300200541e00d6a41106a22342025290300370300200541e00d6a41186a200541306a2802003602002005200541086a41106a22322903003703e00d202c280200213320052802082106200529020c2136200541900e6a41186a200141186a290000370300200541900e6a41106a200141106a290000370300200541900e6a41086a200141086a290000370300200520012900003703900e200541a00d6a41086a2028360200200520023602a40d2005202b3602a00d200541086a200541900e6a200541a00d6a200410be05200541c00d6a41086a2027290200370300200541c00d6a41106a220120232802003602002005202a2902003703c00d200528020c2103024020052802084101460d00202e290300212420322802002135200541e8016a41106a2001280200360200200541e8016a41086a200541c00d6a41086a29030037030020054180026a41086a200541e00d6a41086a29030037030020054180026a41106a203429030037030020054180026a41186a200541e00d6a41186a280200360200200520052903c00d3703e801200520052903e00d370380022024422088a72131202d422088a721342024a72132410221300c120b2000410136020020002003360204200641244d0d252036422088a710260c250b4102210341002133410021060240202f4102460d00200541900e6a41186a2233200141186a290000370300200541900e6a41106a2234200141106a290000370300200541900e6a41086a2232200141086a290000370300200520012900003703900e2005202d3702e40d2005202f3602e00d200541086a200541900e6a200541e00d6a200410be05200528020c210341012106024020052802084101460d002033200541286a2903003703002034200541086a41186a2903003703002032200541086a41106a2903003703002005200541086a41086a2903003703900e410021060b200341807e7121330b200541c0066a41186a2234200541900e6a41186a290300370300200541c0066a41106a2232200541900e6a41106a290300370300200541c0066a41086a2231200541900e6a41086a290300370300200520052903900e3703c006200341ff0171203372213320060d12200541a0066a41186a2034290300370300200541a0066a41106a2032290300370300200541a0066a41086a2031290300370300200520052903c0063703a0064102210302400240202b4102470d0041002106410021020c010b200541900e6a41186a2206200141186a290000370300200541900e6a41106a2234200141106a290000370300200541900e6a41086a2232200141086a290000370300200520012900003703900e200541e00d6a41086a2028360200200520023602e40d2005202b3602e00d200541086a200541900e6a200541e00d6a200410be05200528020c210341012102024020052802084101460d002006200541286a2903003703002034200541086a41186a2903003703002032200541086a41106a2903003703002005200541086a41086a2903003703900e410021020b200341807e7121060b20054180076a41186a222b200541900e6a41186a29030037030020054180076a41106a2234200541900e6a41106a29030037030020054180076a41086a2232200541900e6a41086a290300370300200520052903900e37038007200341ff0171200672210320020d13200541e0066a41186a202b290300370300200541e0066a41106a2034290300370300200541e0066a41086a203229030037030020052005290380073703e006410221024100212b41002106024020264102460d00200541900e6a41186a222b200141186a290000370300200541900e6a41106a2234200141106a290000370300200541900e6a41086a2232200141086a290000370300200520012900003703900e200520243702e40d200520263602e00d200541086a200541900e6a200541e00d6a200410be05200528020c210241012106024020052802084101460d00202b200541286a2903003703002034200541086a41186a2903003703002032200541086a41106a2903003703002005200541086a41086a2903003703900e410021060b200241807e71212b0b200541c0076a41186a2234200541900e6a41186a290300370300200541c0076a41106a2232200541900e6a41106a290300370300200541c0076a41086a2231200541900e6a41086a290300370300200520052903900e3703c007200241ff0171202b72210220060d14200541a0076a41186a2034290300370300200541a0076a41106a2032290300370300200541a0076a41086a2031290300370300200520052903c0073703a00741022106410021344100212b024020224102460d00200541900e6a41186a2234200141186a290000370300200541900e6a41106a2232200141106a290000370300200541900e6a41086a2231200141086a290000370300200520012900003703900e200520213702e40d200520223602e00d200541086a200541900e6a200541e00d6a200410be05200528020c21064101212b024020052802084101460d002034200541286a2903003703002032200541086a41186a2903003703002031200541086a41106a2903003703002005200541086a41086a2903003703900e4100212b0b200641807e7121340b20054180086a41186a2232200541900e6a41186a29030037030020054180086a41106a2231200541900e6a41106a29030037030020054180086a41086a2230200541900e6a41086a290300370300200520052903900e37038008200641ff01712034722106202b0d15200541e0076a41186a2032290300370300200541e0076a41106a2031290300370300200541e0076a41086a203029030037030020052005290380083703e0074102212b4100213241002134024020204102460d00200541900e6a41186a2232200141186a290000370300200541900e6a41106a2231200141106a290000370300200541900e6a41086a2230200141086a290000370300200520012900003703900e2005201f3702e40d200520203602e00d200541086a200541900e6a200541e00d6a200410be05200528020c212b41012134024020052802084101460d002032200541286a2903003703002031200541086a41186a2903003703002030200541086a41106a2903003703002005200541086a41086a2903003703900e410021340b202b41807e7121320b200541c0086a41186a2231200541900e6a41186a290300370300200541c0086a41106a2230200541900e6a41106a290300370300200541c0086a41086a2235200541900e6a41086a290300370300200520052903900e3703c008202b41ff0171203272212b20340d16200541a0086a41186a2031290300370300200541a0086a41106a2030290300370300200541a0086a41086a2035290300370300200520052903c0083703a0084102213441002131410021320240201e4102460d00200541900e6a41186a2231200141186a290000370300200541900e6a41106a2230200141106a290000370300200541900e6a41086a2235200141086a290000370300200520012900003703900e2005201d3702e40d2005201e3602e00d200541086a200541900e6a200541e00d6a200410be05200528020c213441012132024020052802084101460d002031200541286a2903003703002030200541086a41186a2903003703002035200541086a41106a2903003703002005200541086a41086a2903003703900e410021320b203441807e7121310b20054180096a41186a2230200541900e6a41186a29030037030020054180096a41106a2235200541900e6a41106a29030037030020054180096a41086a222f200541900e6a41086a290300370300200520052903900e37038009203441ff0171203172213120320d17200541e0086a41186a2030290300370300200541e0086a41106a2035290300370300200541e0086a41086a202f29030037030020052005290380093703e0084102213441002130410021320240201c4102460d00200541900e6a41186a2230200141186a290000370300200541900e6a41106a2235200141106a290000370300200541900e6a41086a222f200141086a290000370300200520012900003703900e2005201b3702e40d2005201c3602e00d200541086a200541900e6a200541e00d6a200410be05200528020c213441012132024020052802084101460d002030200541286a2903003703002035200541086a41186a290300370300202f200541086a41106a2903003703002005200541086a41086a2903003703900e410021320b203441807e7121300b200541c0096a41186a2235200541900e6a41186a290300370300200541c0096a41106a222f200541900e6a41106a290300370300200541c0096a41086a2225200541900e6a41086a290300370300200520052903900e3703c009203441ff0171203072213020320d18200541a0096a41186a2035290300370300200541a0096a41106a202f290300370300200541a0096a41086a2025290300370300200520052903c0093703a0094102213441002135410021320240201a4102460d00200541900e6a41186a2235200141186a290000370300200541900e6a41106a222f200141106a290000370300200541900e6a41086a2225200141086a290000370300200520012900003703900e200520193702e40d2005201a3602e00d200541086a200541900e6a200541e00d6a200410be05200528020c213441012132024020052802084101460d002035200541286a290300370300202f200541086a41186a2903003703002025200541086a41106a2903003703002005200541086a41086a2903003703900e410021320b203441807e7121350b200541800a6a41186a222f200541900e6a41186a290300370300200541800a6a41106a2225200541900e6a41106a290300370300200541800a6a41086a2229200541900e6a41086a290300370300200520052903900e3703800a203441ff0171203572213520320d19200541e0096a41186a202f290300370300200541e0096a41106a2025290300370300200541e0096a41086a2029290300370300200520052903800a3703e009410221344100212f41002132024020184102460d00200541900e6a41186a222f200141186a290000370300200541900e6a41106a2225200141106a290000370300200541900e6a41086a2229200141086a290000370300200520012900003703900e200520173702e40d200520183602e00d200541086a200541900e6a200541e00d6a200410be05200528020c213441012132024020052802084101460d00202f200541286a2903003703002025200541086a41186a2903003703002029200541086a41106a2903003703002005200541086a41086a2903003703900e410021320b203441807e71212f0b200541c00a6a41186a2225200541900e6a41186a290300370300200541c00a6a41106a2229200541900e6a41106a290300370300200541c00a6a41086a222c200541900e6a41086a290300370300200520052903900e3703c00a203441ff0171202f72212f20320d1a200541a00a6a41186a2025290300370300200541a00a6a41106a2029290300370300200541a00a6a41086a202c290300370300200520052903c00a3703a00a410221344100212541002132024020164102460d00200541900e6a41186a2225200141186a290000370300200541900e6a41106a2229200141106a290000370300200541900e6a41086a222c200141086a290000370300200520012900003703900e200520153702e40d200520163602e00d200541086a200541900e6a200541e00d6a200410be05200528020c213441012132024020052802084101460d002025200541286a2903003703002029200541086a41186a290300370300202c200541086a41106a2903003703002005200541086a41086a2903003703900e410021320b203441807e7121250b200541800b6a41186a2229200541900e6a41186a290300370300200541800b6a41106a222c200541900e6a41106a290300370300200541800b6a41086a2228200541900e6a41086a290300370300200520052903900e3703800b203441ff0171202572212520320d1b200541e00a6a41186a2029290300370300200541e00a6a41106a202c290300370300200541e00a6a41086a2028290300370300200520052903800b3703e00a410221344100213241002129024020144102460d00200541900e6a41186a2229200141186a290000370300200541900e6a41106a222c200141106a290000370300200541900e6a41086a2228200141086a290000370300200520012900003703900e200520133702e40d200520143602e00d200541086a200541900e6a200541e00d6a200410be05200528020c213441012132024020052802084101460d002029200541286a290300370300202c200541086a41186a2903003703002028200541086a41106a2903003703002005200541086a41086a2903003703900e410021320b203441807e7121290b200541c00b6a41186a222c200541900e6a41186a290300370300200541c00b6a41106a2228200541900e6a41106a290300370300200541c00b6a41086a2226200541900e6a41086a290300370300200520052903900e3703c00b2029203441ff017172212920320d1c200541a00b6a41186a202c290300370300200541a00b6a41106a2028290300370300200541a00b6a41086a2026290300370300200520052903c00b3703a00b41022134410021324100212c024020124102460d00200541900e6a41186a222c200141186a290000370300200541900e6a41106a2228200141106a290000370300200541900e6a41086a2226200141086a290000370300200520012900003703900e200520113702e40d200520123602e00d200541086a200541900e6a200541e00d6a200410be05200528020c213441012132024020052802084101460d00202c200541286a2903003703002028200541086a41186a2903003703002026200541086a41106a2903003703002005200541086a41086a2903003703900e410021320b203441807e71212c0b200541800c6a41186a2228200541900e6a41186a290300370300200541800c6a41106a2226200541900e6a41106a290300370300200541800c6a41086a2223200541900e6a41086a290300370300200520052903900e3703800c202c203441ff017172212c20320d1d200541e00b6a41186a2028290300370300200541e00b6a41106a2026290300370300200541e00b6a41086a2023290300370300200520052903800c3703e00b410221324100213441002128024020104102460d00200541900e6a41186a2228200141186a290000370300200541900e6a41106a2226200141106a290000370300200541900e6a41086a2223200141086a290000370300200520012900003703900e2005200f3702e40d200520103602e00d200541086a200541900e6a200541e00d6a200410be05200528020c213241012134024020052802084101460d002028200541286a2903003703002026200541086a41186a2903003703002023200541086a41106a2903003703002005200541086a41086a2903003703900e410021340b203241807e712128203241ff017121320b200541c00c6a41186a2226200541900e6a41186a290300370300200541c00c6a41106a2223200541900e6a41106a290300370300200541c00c6a41086a2227200541900e6a41086a290300370300200520052903900e3703c00c2028203272213220340d1e200541a00c6a41186a2026290300370300200541a00c6a41106a2023290300370300200541a00c6a41086a2027290300370300200520052903c00c3703a00c4102212841002134410021260240200e4102460d00200541900e6a41186a2226200141186a290000370300200541900e6a41106a2223200141106a290000370300200541900e6a41086a2227200141086a290000370300200520012900003703900e2005200d3702e40d2005200e3602e00d200541086a200541900e6a200541e00d6a200410be05200528020c212841012134024020052802084101460d002026200541286a2903003703002023200541086a41186a2903003703002027200541086a41106a2903003703002005200541086a41086a2903003703900e410021340b202841807e712126202841ff017121280b200541800d6a41186a2223200541900e6a41186a290300370300200541800d6a41106a2227200541900e6a41106a290300370300200541800d6a41086a222a200541900e6a41086a290300370300200520052903900e3703800d2026202872212820340d1f200541e00c6a41186a2023290300370300200541e00c6a41106a2027290300370300200541e00c6a41086a202a290300370300200520052903800d3703e00c4102212641002134410021230240200c4102460d00200541900e6a41186a2223200141186a290000370300200541900e6a41106a2227200141106a290000370300200541900e6a41086a222a200141086a290000370300200520012900003703900e2005200b3702e40d2005200c3602e00d200541086a200541900e6a200541e00d6a200410be05200528020c212641012134024020052802084101460d002023200541286a2903003703002027200541086a41186a290300370300202a200541086a41106a2903003703002005200541086a41086a2903003703900e410021340b202641807e712123202641ff017121260b200541c00d6a41186a2227200541900e6a41186a290300370300200541c00d6a41106a222a200541900e6a41106a290300370300200541c00d6a41086a2222200541900e6a41086a290300370300200520052903900e3703c00d2023202672212620340d20200541a00d6a41186a2027290300370300200541a00d6a41106a202a290300370300200541a00d6a41086a2022290300370300200520052903c00d3703a00d4102212341002134410021270240200a4102460d00200541900e6a41186a2223200141186a290000370300200541900e6a41106a2227200141106a290000370300200541900e6a41086a222a200141086a290000370300200520012900003703900e200520093702840e2005200a3602800e200541086a200541900e6a200541800e6a200410be05200528020c210141012134024020052802084101460d002023200541286a2903003703002027200541086a41186a290300370300202a200541086a41106a2903003703002005200541086a41086a2903003703900e410021340b200141807e712127200141ff017121230b200541e00d6a41186a2204200541900e6a41186a290300370300200541e00d6a41106a222a200541900e6a41106a290300370300200541e00d6a41086a2222200541900e6a41086a290300370300200520052903900e3703e00d20272023722101024020340d00200541a0026a41186a2004290300370300200541a0026a41106a202a290300370300200541a0026a41086a202229030037030020054180066a41086a200541a0066a41086a29030037030020054180066a41106a200541a0066a41106a29030037030020054180066a41186a200541a0066a41186a290300370300200541e0056a41086a200541e0066a41086a290300370300200541e0056a41106a200541e0066a41106a290300370300200541e0056a41186a200541e0066a41186a290300370300200520052903e00d3703a002200520052903a00637038006200520052903e0063703e005200541c0056a41186a200541a0076a41186a290300370300200541c0056a41106a200541a0076a41106a290300370300200541c0056a41086a200541a0076a41086a290300370300200541a0056a41086a200541e0076a41086a290300370300200541a0056a41106a200541e0076a41106a290300370300200541a0056a41186a200541e0076a41186a29030037030020054180056a41086a200541a0086a41086a29030037030020054180056a41106a200541a0086a41106a29030037030020054180056a41186a200541a0086a41186a290300370300200520052903a0073703c005200520052903e0073703a005200520052903a00837038005200541e0046a41186a200541e0086a41186a290300370300200541e0046a41106a200541e0086a41106a290300370300200541e0046a41086a200541e0086a41086a290300370300200541c0046a41186a200541a0096a41186a290300370300200541c0046a41106a200541a0096a41106a290300370300200541c0046a41086a200541a0096a41086a290300370300200541a0046a41186a200541e0096a41186a290300370300200541a0046a41106a200541e0096a41106a290300370300200541a0046a41086a200541e0096a41086a290300370300200520052903e0083703e004200520052903a0093703c004200520052903e0093703a00420054180046a41186a200541a00a6a41186a29030037030020054180046a41106a200541a00a6a41106a29030037030020054180046a41086a200541a00a6a41086a290300370300200520052903a00a37038004200541e0036a41186a200541e00a6a41186a290300370300200541e0036a41106a200541e00a6a41106a290300370300200541e0036a41086a200541e00a6a41086a290300370300200520052903e00a3703e003200541c0036a41186a200541a00b6a41186a290300370300200541c0036a41106a200541a00b6a41106a290300370300200541c0036a41086a200541a00b6a41086a290300370300200520052903a00b3703c003200541a0036a41186a200541e00b6a41186a290300370300200541a0036a41106a200541e00b6a41106a290300370300200541a0036a41086a200541e00b6a41086a290300370300200520052903e00b3703a00320054180036a41186a200541a00c6a41186a29030037030020054180036a41106a200541a00c6a41106a29030037030020054180036a41086a200541a00c6a41086a290300370300200520052903a00c37038003200541e0026a41186a200541e00c6a41186a290300370300200541e0026a41106a200541e00c6a41106a290300370300200541e0026a41086a200541e00c6a41086a290300370300200520052903e00c3703e002200541c0026a41186a200541a00d6a41186a290300370300200541c0026a41106a200541a00d6a41106a290300370300200541c0026a41086a200541a00d6a41086a290300370300200520052903a00d3703c00241c00410242234450d2620342033360200203420052903800637020420342003360224203420052903e0053702282034410c6a20054180066a41086a290300370200203441146a20054180066a41106a2903003702002034411c6a20054180066a41186a290300370200203441306a200541e0056a41086a290300370200203441386a200541e0056a41106a290300370200203441c0006a200541e0056a41186a290300370200203420023602482034200636026c203420052903c00537024c203441d4006a200541c0056a41086a290300370200203441dc006a200541c0056a41106a290300370200203441e4006a200541c0056a41186a290300370200203420052903a005370270203441f8006a200541a0056a41086a29030037020020344180016a200541a0056a41106a29030037020020344188016a200541a0056a41186a2903003702002034202b36029001203420313602b401203441ac016a20054180056a41186a290300370200203441a4016a20054180056a41106a2903003702002034419c016a20054180056a41086a290300370200203420052903800537029401203441d0016a200541e0046a41186a290300370200203441c8016a200541e0046a41106a290300370200203441c0016a200541e0046a41086a290300370200203420052903e0043702b801203420303602d801203441f4016a200541c0046a41186a290300370200203441ec016a200541c0046a41106a290300370200203441e4016a200541c0046a41086a290300370200203420052903c0043702dc01203420353602fc0120344198026a200541a0046a41186a29030037020020344190026a200541a0046a41106a29030037020020344188026a200541a0046a41086a290300370200203420052903a004370280022034202f3602a002203441bc026a20054180046a41186a290300370200203441b4026a20054180046a41106a290300370200203441ac026a20054180046a41086a29030037020020342005290380043702a402203420253602c402203441e0026a200541e0036a41186a290300370200203441d8026a200541e0036a41106a290300370200203441d0026a200541e0036a41086a290300370200203420052903e0033702c802203420293602e80220344184036a200541c0036a41186a290300370200203441fc026a200541c0036a41106a290300370200203441f4026a200541c0036a41086a290300370200203420052903c0033702ec022034202c36028c03203441a8036a200541a0036a41186a290300370200203441a0036a200541a0036a41106a29030037020020344198036a200541a0036a41086a290300370200203420052903a00337029003203420323602b003203441cc036a20054180036a41186a290300370200203441c4036a20054180036a41106a290300370200203441bc036a20054180036a41086a29030037020020342005290380033702b403203420283602d403203441f0036a200541e0026a41186a290300370200203441e8036a200541e0026a41106a290300370200203441e0036a200541e0026a41086a290300370200203420052903e0023702d803203420263602f80320344194046a200541c0026a41186a2903003702002034418c046a200541c0026a41106a29030037020020344184046a200541c0026a41086a290300370200203420052903c0023702fc032034200136029c04203441b8046a200541a0026a41186a290300370200203441b0046a200541a0026a41106a290300370200203441a8046a200541a0026a41086a290300370200203420052903a0023702a00441032130024020080d00410021060c120b2007417f4c0d120240024020070d0041012101410021020c010b200710242201450d24200721020b20054100360210200520013602082005200236020c200541086a4100200710c90120052802082206200528021022016a2008200710cf061a2005200120076a360210200529020c21360c110b20004101360200200020013602040c240b20004101360200200020063602040c230b20004101360200200020023602040c220b200041013602002000202b3602040c210b20004101360200200020343602040c200b20004101360200200020353602040c1f0b20004101360200200020253602040c1e0b20004101360200200020293602040c1d0b200041013602002000202c3602040c1c0b20004101360200200020283602040c1b0b20004101360200200020263602040c1a0b20004101360200200020233602040c190b20004101360200200020273602040c180b20004101360200200020333602040c170b200041013602002000202a3602040c160b200541900e6a41186a222e200141186a290000370300200541900e6a41106a2220200141106a290000370300200541900e6a41086a221e200141086a290000370300200520012900003703900e200541800e6a41086a2032360200200520073602840e200520083602800e200541086a200541900e6a200541800e6a200410be05200528020c210341012101024020052802084101460d00202e200541286a2903003703002020200541086a41186a290300370300201e200541086a41106a2903003703002005200541086a41086a2903003703900e410021010b200341807e712104200341ff017121030b200541e00d6a41186a2232200541900e6a41186a290300370300200541e00d6a41106a222e200541900e6a41106a290300370300200541e00d6a41086a2220200541900e6a41086a290300370300200520052903900e3703e00d2004200372210420010d13200541a0026a41186a2032290300370300200541a0026a41106a202e290300370300200541a0026a41086a202029030037030020054180066a41086a200541a0066a41086a29030037030020054180066a41106a200541a0066a41106a29030037030020054180066a41186a200541a0066a41186a290300370300200541e0056a41086a200541e0066a41086a290300370300200541e0056a41106a200541e0066a41106a290300370300200541e0056a41186a200541e0066a41186a290300370300200520052903e00d3703a002200520052903a00637038006200520052903e0063703e005200541c0056a41186a200541a0076a41186a290300370300200541c0056a41106a200541a0076a41106a290300370300200541c0056a41086a200541a0076a41086a290300370300200541a0056a41086a200541e0076a41086a290300370300200541a0056a41106a200541e0076a41106a290300370300200541a0056a41186a200541e0076a41186a29030037030020054180056a41086a200541a0086a41086a29030037030020054180056a41106a200541a0086a41106a29030037030020054180056a41186a200541a0086a41186a290300370300200520052903a0073703c005200520052903e0073703a005200520052903a00837038005200541e0046a41186a200541e0086a41186a290300370300200541e0046a41106a200541e0086a41106a290300370300200541e0046a41086a200541e0086a41086a290300370300200541c0046a41186a200541a0096a41186a290300370300200541c0046a41106a200541a0096a41106a290300370300200541c0046a41086a200541a0096a41086a290300370300200541a0046a41186a200541e0096a41186a290300370300200541a0046a41106a200541e0096a41106a290300370300200541a0046a41086a200541e0096a41086a290300370300200520052903e0083703e004200520052903a0093703c004200520052903e0093703a00420054180046a41186a200541a00a6a41186a29030037030020054180046a41106a200541a00a6a41106a29030037030020054180046a41086a200541a00a6a41086a290300370300200520052903a00a37038004200541e0036a41186a200541e00a6a41186a290300370300200541e0036a41106a200541e00a6a41106a290300370300200541e0036a41086a200541e00a6a41086a290300370300200520052903e00a3703e003200541c0036a41186a200541a00b6a41186a290300370300200541c0036a41106a200541a00b6a41106a290300370300200541c0036a41086a200541a00b6a41086a290300370300200520052903a00b3703c003200541a0036a41186a200541e00b6a41186a290300370300200541a0036a41106a200541e00b6a41106a290300370300200541a0036a41086a200541e00b6a41086a290300370300200520052903e00b3703a00320054180036a41186a200541a00c6a41186a29030037030020054180036a41106a200541a00c6a41106a29030037030020054180036a41086a200541a00c6a41086a290300370300200520052903a00c37038003200541e0026a41186a200541e00c6a41186a290300370300200541e0026a41106a200541e00c6a41106a290300370300200541e0026a41086a200541e00c6a41086a290300370300200520052903e00c3703e002200541c0026a41186a200541a00d6a41186a290300370300200541c0026a41106a200541a00d6a41106a290300370300200541c0026a41086a200541a00d6a41086a290300370300200520052903a00d3703c00241c00410242203450d1520032006360200200320052903800637020420032002360224200320052903e0053702282003410c6a20054180066a41086a290300370200200341146a20054180066a41106a2903003702002003411c6a20054180066a41186a290300370200200341306a200541e0056a41086a290300370200200341386a200541e0056a41106a290300370200200341c0006a200541e0056a41186a2903003702002003202b3602482003203436026c200320052903c00537024c200341d4006a200541c0056a41086a290300370200200341dc006a200541c0056a41106a290300370200200341e4006a200541c0056a41186a290300370200200320052903a005370270200341f8006a200541a0056a41086a29030037020020034180016a200541a0056a41106a29030037020020034188016a200541a0056a41186a2903003702002003203536029001200320253602b401200341ac016a20054180056a41186a290300370200200341a4016a20054180056a41106a2903003702002003419c016a20054180056a41086a290300370200200320052903800537029401200341d0016a200541e0046a41186a290300370200200341c8016a200541e0046a41106a290300370200200341c0016a200541e0046a41086a290300370200200320052903e0043702b801200320293602d801200341f4016a200541c0046a41186a290300370200200341ec016a200541c0046a41106a290300370200200341e4016a200541c0046a41086a290300370200200320052903c0043702dc012003202c3602fc0120034198026a200541a0046a41186a29030037020020034190026a200541a0046a41106a29030037020020034188026a200541a0046a41086a290300370200200320052903a00437028002200320283602a002200341bc026a20054180046a41186a290300370200200341b4026a20054180046a41106a290300370200200341ac026a20054180046a41086a29030037020020032005290380043702a402200320263602c402200341e0026a200541e0036a41186a290300370200200341d8026a200541e0036a41106a290300370200200341d0026a200541e0036a41086a290300370200200320052903e0033702c802200320233602e80220034184036a200541c0036a41186a290300370200200341fc026a200541c0036a41106a290300370200200341f4026a200541c0036a41086a290300370200200320052903c0033702ec022003202736028c03200341a8036a200541a0036a41186a290300370200200341a0036a200541a0036a41106a29030037020020034198036a200541a0036a41086a290300370200200320052903a00337029003200320333602b003200341cc036a20054180036a41186a290300370200200341c4036a20054180036a41106a290300370200200341bc036a20054180036a41086a29030037020020032005290380033702b4032003202a3602d403200341f0036a200541e0026a41186a290300370200200341e8036a200541e0026a41106a290300370200200341e0036a200541e0026a41086a290300370200200320052903e0023702d803200320223602f80320034194046a200541c0026a41186a2903003702002003418c046a200541c0026a41106a29030037020020034184046a200541c0026a41086a290300370200200320052903c0023702fc032003200436029c04200341b8046a200541a0026a41186a290300370200200341b0046a200541a0026a41106a290300370200200341a8046a200541a0026a41086a290300370200200320052903a0023702a004200541086a202f202da710bc05200541900e6a41086a2201200541086a41186a290300370300200541900e6a41106a2202200541286a290300370300200541900e6a41186a2204200541306a2802003602002005200541086a41106a2903003703900e200541086a410c6a2802002133200529020c2136200528020821060240024020300d00410021320c010b2031417f4c0d020240024020310d004101212b410021340c010b20311024222b450d14203121340b200541003602102005202b3602082005203436020c200541086a4100203110c901200528020822322005280210222b6a2030203110cf061a202b20316a2135200528020c21310b202d422088a7213420054180026a41186a200428020036020020054180026a41106a200229030037030020054180026a41086a2001290300370300200520052903900e37038002410421300b20002030360204200041186a2033360200200041106a20363702002000410c6a2006360200200041086a20343602002000411c6a200529038002370200200041c4006a2035360200200041386a2003360200200041c8006a20052903e801370200200041246a20054180026a41086a2903003702002000412c6a20054180026a41106a290300370200200041346a20054180026a41186a280200360200200041d0006a200541e8016a41086a290300370200200041d8006a200541e8016a41106a2802003602002000413c6a2031ad4220862032ad84370200200041003602000c130b1034000b20004101360200200020333602040c110b20004101360200200020033602040c100b20004101360200200020023602040c0f0b20004101360200200020063602040c0e0b200041013602002000202b3602040c0d0b20004101360200200020313602040c0c0b20004101360200200020303602040c0b0b20004101360200200020353602040c0a0b200041013602002000202f3602040c090b20004101360200200020253602040c080b20004101360200200020293602040c070b200041013602002000202c3602040c060b20004101360200200020323602040c050b20004101360200200020283602040c040b20004101360200200020263602040c030b20004101360200200020223602040c020b1033000b20004101360200200020043602040b200541b00e6a24000f0b102c000bf55303117f047e037f23002206210720064180056b41607122062400200641106a41086a200341086a28020036020020062003290200370310024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020022802000e050104000203010b20064180016a2002412c6a290200370300200641f8006a200241246a290200370300200641d8006a41186a2002411c6a290200370300200641d8006a41106a2208200241146a290200370300200641d8006a41086a2002410c6a29020037030020062002290204370358200641a6016a200241376a2d00003a000020064188016a41086a200241c4006a29020037030020064188016a41106a200241cc006a29020037030020064188016a41186a200241d4006a280200360200200620022f00353b01a40120062002413c6a29020037038801200241346a2d00002109200241386a280200210a02400240200628025c220b41244b0d00200641e1006a210c0c010b2008280200210b200641d8006a410c6a280200210c0b20062006280258220d3602b0012006200c3602a8012006280214210e2006280218210f2006200b3602ac01200b4101742210200d6b2211200e410174200f6b2202200220114b1b2212450d0541002102200628021021130340200f20026a22084101762214200e4f0d07200d20026a22154101762216200b4f0d08201320146a2d00002214410f71201441f0017141047620084101711b200c20166a2d00002208410f71200841047620154101711b470d05200241016a22022012490d000b201221020c1f0b4101211520062802142203200628021822084101762202490d0720064180046a200628021020026a200320026b10bc05200641386a41086a20064194046a290200370300200641c8006a2006419c046a290200370300200641d0006a200641a4046a29020037030020062006418c046a2902003703382008410171210220064180046a41086a2802002114200628028404210b20062802800421032004290204211720042802002111410021080c220b200241106a280200210d2002410c6a280200210c200241086a280200211620022802042102024002402006280214221441017420062802182208460d00200841017622152014490d012015201441d8bbc7001032000b0240024020160d002004280208211420042802002103410021080c010b2004280200210341002108200d20042802082214470d000240024020032016470d00410121080c010b20162003200d10d2064521080b200d21140b2004280204210b024020052802002215450d00200541046a280200450d00201510260b2005200c36020420052016360200200541086a200d360200200641386a41086a20064180046a41086a290200370300200641386a41106a20064180046a41106a290200370300200641386a41186a20064180046a41186a290200370300200641206a41086a20064198036a41086a290200370300200641206a41106a20064198036a41106a28020036020020062006290280043703382006200629029803370320410321150c220b200628021020156a2d000021142003200328020841016a36020820022014410f71201441047620084101711b221541246c6a22142902102118201420062903900437021020142902082119201420062903880437020820142902002117200641023a0080042014200629038004370200201441186a2208290200211a200820062903980437020002400240024002402017a741ff01714102470d002003280204220b200328020822054101762208490d0b20064198036a200328020020086a200b20086b10bc052006418c046a20062902980337020020064194046a20064198036a41086a2902003702002006419c046a200641a8036a29020037020020064180046a41246a200641b0036a290200370200200641ac046a20064198036a41206a290200370200200641b4046a200641c0036a280200360200200641b8046a2004290200370300200641c0046a200441086a280200360200200641013602840420064180046a41086a200541017136020041002108200641003a0080042002201541246c6a41046a200141206a20064180046a108704360200201441003a00000c010b200641a0046a201428022036020020064180046a41186a201a37030020062019370388042006201737038004200620183703900420064198036a41086a200441086a2802003602002006200429020037039803200641c0026a200120064180046a200320064198036a200510b90520062802c402210320062802c0024101460d01200641c0026a41086a2d0000210441002108201441003a00002002201541246c6a41046a2003360200200441ff0171450d020b4103211520162103200c210b200d21140c230b200041013602002000200336020402402016450d00200c450d00201610260b200210260c200b2000428080808010370200200041186a200d360200200041146a200c360200200041106a20163602002000410c6a2002360200200041086a4103360200200724000f0b200641c0036a2002412c6a290200370300200641b8036a200241246a290200370300200641b0036a2002411c6a290200370300200641a8036a2208200241146a29020037030020064198036a41086a2002410c6a2902003703002006200229020437039803200241346a2802002111200241386a280200210a2002413c6a280200211b200241c0006a280200211c02400240200628029c03220b41244b0d00200641a1036a210c0c010b2008280200210b20064198036a410c6a280200210c0b2006200628029803220d360290012006200c360288012006280214210e2006280218210f2006200b36028c01410021020240200b410174200d6b2209200e410174200f6b2210201020094b1b2212450d00200628021021130340200f20026a22084101762214200e4f0d09200d20026a22154101762216200b4f0d0a201320146a2d00002214410f71201441f0017141047620084101711b200c20166a2d00002208410f71200841047620154101711b470d01200241016a22022012490d000b201221020b024002400240024020022009470d0020092010460d010b20022009490d01200f20026a22144101762208200e490d022008200e41d8bbc7001032000b410021080240200a450d00201c2004280208470d00024020042802002202200a470d00410121080c010b200a2002201c10d2064521080b200b200d4101762202490d0b20064180046a200c20026a200b20026b10bc05200641c0026a41086a221520064194046a290200370300200641c0026a41106a220c2006419c046a290200370300200641c0026a41186a220e200641a4046a29020037030020062006418c046a2902003703c002200d410171210220064180046a41086a220d2802002114200628028404210b20062802800421032004280208211620042902002117024020052802002204450d00200541046a280200450d00200410260b2005201b3602042005200a360200200541086a201c360200200641386a41086a2015290300370300200641386a41106a200c290300370300200641386a41186a200e290300370300200641206a41086a200d290200370300200641206a41106a20064180046a41106a280200360200200620062903c00237033820062006290280043703200c1c0b200b200d200241016a22126a22084101762203490d0b200641d8006a200c20036a200b20036b10bc05200641e8016a41086a2214200641d8006a41086a290300370300200641e8016a41106a2216200641d8006a41106a290300370300200641e8016a41186a2205200641d8006a41186a290300370300200641e8016a41206a220e200641d8006a41206a290300370300200641e8016a41286a220f200641d8006a41286a280200360200200620062903583703e801200d20026a220d4101762203200b4f0d0c200c20036a2d0000210310bf05211520064180046a41086a20084101713602002006418c046a220b20062903e80137020020064194046a20142903003702002006419c046a201629030037020020064180046a41246a2005290300370200200641ac046a200e290300370200200641b4046a200f280200360200200641c4046a201c360200200641c0046a201b360200200641bc046a200a360200200641b8046a20113602002006410436028404200641c8046a20062902b801370300200641d0046a200641b8016a41086a290200370300200641d8046a200641b8016a41106a28020036020041002108200641003a00800420152003410f712003410476200d4101711b41246c6a2203200141206a221620064180046a108704360204200341003a00000240024020062802142203410174200628021822146b2002460d00201420026a220b410176220d2003490d01200d200341d8bbc7001032000b20064180046a20064188016a200210c005200641386a41086a20064180046a41186a290300370300200641386a41106a200641a0046a290300370300200641386a41186a200641a8046a290300370300200620064180046a41106a290300370338200b280200211420064180046a41086a280200210b200428020821162004290200211720062802840421032006280280042102201521110c1c0b2003201420126a22054101762208490d0d2006280210220c200d6a2d00002114200641c0026a200c20086a200320086b10bc052006418c046a220320062902c00237020020064194046a200641c0026a41086a2902003702002006419c046a200641c0026a41106a29020037020020064180046a41246a200641c0026a41186a290200370200200641ac046a200641c0026a41206a290200370200200641b4046a200641c0026a41286a280200360200200641b8046a2004290200370300200641c0046a200441086a280200360200200641013602840420064180046a41086a2204200541017136020041002108200641003a00800420152014410f71201441f00171410476200b4101711b41246c6a2214201620064180046a108704360204201441003a000020064180046a20064188016a200210c005200641386a41086a20064180046a41186a290300370300200641386a41106a20064180046a41206a290300370300200641386a41186a20064180046a41286a290300370300200620064180046a41106a290300370338200328020021142004280200210b2006280284042103200628028004210242002117201521110c1b0b200628021020086a2d000021082003200220032802086a41016a36020820112008410f71200841047620144101711b221441246c6a22022902102118200220062903900437021020022902082119200220062903880437020820022902002117200641023a0080042002200629038004370200200241186a2208290200211a200820062903980437020002402017a741ff01714102470d0020032802042215200328020822164101762208490d0e200641c0026a200328020020086a201520086b10bc052006418c046a20062902c00237020020064194046a200641c0026a41086a2902003702002006419c046a200641d0026a29020037020020064180046a41246a200641d8026a290200370200200641ac046a200641c0026a41206a290200370200200641b4046a200641e8026a280200360200200641b8046a2004290200370300200641c0046a200441086a280200360200200641013602840420064180046a41086a2016410171360200200641003a0080042011201441246c6a41046a200141206a20064180046a108704360200200241003a00000c1a0b200641a0046a200228022036020020064180046a41186a201a370300200620193703880420062017370380042006201837039004200641c0026a41086a200441086a280200360200200620042902003703c002200641e8016a200120064180046a2003200641c0026a200510b90520062802ec0121030240024020062802e8014101460d00200641e8016a41086a2d00002108200241003a00002011201441246c6a41046a2003360200200841ff01710d1b200b200d4101762202490d1020064180046a200c20026a200b20026b10bc052000410c6a200d41017136020020004281808080c000370204200041c8006a201c360200200041c4006a201b360200200041c0006a200a3602002000413c6a2011360200200041106a200629028004370200200041186a20064188046a290200370200200041206a20064180046a41106a290200370200200041286a20064180046a41186a290200370200200041306a20064180046a41206a290200370200200041386a20064180046a41286a280200360200200041003602000c010b20004101360200200020033602040240200a450d00201b450d00200a10260b201110260b200628029c0341244d0d1e200641a4036a2802001026200724000f0b200641e8026a2002412c6a290200370300200641e0026a200241246a290200370300200641d8026a2002411c6a290200370300200641d0026a2208200241146a290200370300200641c0026a41086a2002410c6a290200370300200620022902043703c0022002413c6a280200210a200241386a280200211c200241346a28020021100240024020062802c402220b41244b0d00200641c9026a210d0c010b2008280200210b200641c0026a410c6a280200210d0b410021020240200b41017420062802c002220c6b22112006280214220e4101742006280218220f6b2209200920114b1b2212450d00200628021021130340200f20026a22084101762214200e4f0d10200c20026a22154101762216200b4f0d11201320146a2d00002214410f71201441f0017141047620084101711b200d20166a2d00002208410f71200841047620154101711b470d01200241016a22022012490d000b201221020b0240024002400240024020022011470d0020112009460d010b200220114f0d0210bf052114200c20026a22154101762216200b4f0d14200b201541016a220c4101762208490d15200d20166a2d0000211620064198036a200d20086a200b20086b10bc052006418c046a220b20062902980337020020064180046a41146a220d20064198036a41086a220e29020037020020064180046a411c6a220f20064198036a41106a221229020037020020064180046a41246a221320064198036a41186a29020037020020064180046a412c6a221120064198036a41206a29020037020020064180046a41346a220920064198036a41286a280200360200200641c0046a221b200a360200200641bc046a220a201c36020020064180046a41386a2010360200200641013602840420064180046a41086a2210200c41017136020041002108200641003a00800420142016410f71201641047620154101711b41246c6a2215200141206a20064180046a108704360204201541003a000020064180046a200641106a200210c005200641a8016a41086a2202200b280200360200200641d8006a41086a221520064180046a41186a2216290300370300200641d8006a41106a220c20064180046a41206a290300370300200641d8006a41186a221c20064180046a41286a29030037030020062006290284043703a801200620064180046a41106a221d290300370358200620062802800436029c032006410436029803200e20062903a8013703002012200228020036020020064198036a41386a410036020020064198036a41346a201436020020064198036a41146a200629035837020020064198036a411c6a201529030037020020064198036a41246a200c29030037020020064198036a412c6a201c290300370200200641dc036a20062902880137020020064198036a41cc006a20064188016a41086a29020037020020064198036a41d4006a20064188016a41106a280200360200200641f0036a41086a200441086a280200360200200620042902003703f00320064180046a200120064198036a2003200641f0036a200510bb05200641e8016a41086a22052013290200370300200641e8016a41106a220c2011290200370300200641e8016a41186a220e20092902003703002006200f2902003703e80120102802002115200b2802002102201d2802002103200d280200210b20162802002114200a2802002111201b2903002117200641c8046a2802002116200628028404210d2006280280042104200641b8016a41106a220f200641dc046a280200360200200641b8016a41086a221220064180046a41d4006a290200370300200620064180046a41cc006a2902003703b80120044101460d01200641386a41186a200e290300370300200641386a41106a200c290300370300200641386a41086a2005290300370300200641206a41086a2012290300370300200641206a41106a200f280200360200200620062903e801370338200620062903b8013703200c030b410021020240200a2004280208470d000240201020042802002202470d00410121020c010b20102002200a10d2064521020b024020052802002203450d00200541046a280200450d00200310260b2005201c36020420052010360200200541086a200a360200024020020d00200620062802c0023602800420064180046a41047221140240024020062802c402220341244b0d00200641c9026a21020c010b200641d0026a2802002103200641cc026a28020021020b4100210820064180046a41086a221541003a0000200641003602840420142002200220036a10cc04200641386a41086a20064180046a41186a290300370300200641386a41106a200641a0046a290300370300200641386a41186a200641a8046a290300370300200641206a41086a20064198036a41086a290200370300200641206a41106a20064198036a41106a280200360200200620064180046a41106a29030037033820062006290298033703202006418c046a28020021142015280200210b200429020421172004280200211120062802840421032006280280042102410121150c030b200620062802c0023602800420064180046a41047221080240024020062802c402220341244b0d00200641c9026a21020c010b200641d0026a2802002103200641cc026a28020021020b20064180046a41086a221541003a0000200641003602840420082002200220036a10cc04200641386a41086a20064180046a41186a290300370300200641386a41106a200641a0046a290300370300200641386a41186a200641a8046a290300370300200641206a41086a20064198036a41086a290200370300200641206a41106a20064198036a41106a280200360200200620064180046a41106a29030037033820062006290298033703202006418c046a28020021142015280200210b20042902042117200428020021112006280284042103200628028004210241012115410121080c020b200041013602002000200d3602040c190b200b200c4101762202490d13200641e8016a200d20026a200b20026b10bc0510bf05210220064198036a41086a20062902e80137030020064198036a41106a200641e8016a41086a29020037030020064198036a41186a200641e8016a41106a29020037030020064198036a41206a200641e8016a41186a29020037030020064198036a41286a200641e8016a41206a290200370300200641c8036a200641e8016a41286a28020036020020064198036a41c0006a200a36020020064198036a413c6a201c360200200641d0036a201036020020064198036a41346a20023602002006200c41017136029c03200641043602980320064188016a41086a200441086a280200360200200620042902003703880120064180046a200120064198036a200320064188016a200510bb05200641d8006a41086a2204200641a4046a290200370300200641d8006a41106a220d200641ac046a290200370300200641d8006a41186a220520064180046a41346a29020037030020062006419c046a29020037035820064180046a41086a28020021152006418c046a280200210220064180046a41106a280200210320064194046a280200210b20064180046a41186a280200211420064180046a413c6a280200211120064180046a41c0006a2903002117200641c8046a2802002116200628028404210c2006280280042108200641b8016a41106a220e200641dc046a280200360200200641b8016a41086a220f200641d4046a2902003703002006200641cc046a2902003703b80120084101460d14200641386a41186a2005290300370300200641386a41106a200d290300370300200641386a41086a2004290300370300200641206a41086a200f290300370300200641206a41106a200e28020036020020062006290358370338200620062903b801370320410021080b20062802c40241244d0d1f200641cc026a28020010260c1f0b20020d1a0b2010200d460d13200d4101762202200b4f0d12200c20026a2d0000210210bf0521140240024020114101460d00200b200d41016a22154101762208490d1620064198036a200c20086a200b20086b10bc0520064180046a41086a20154101713602002006418c046a20062902980337020020064194046a20064198036a41086a2902003702002006419c046a20064198036a41106a290200370200200641a4046a20064198036a41186a290200370200200641ac046a20064198036a41206a290200370200200641b4046a200641c0036a280200360200200641b8046a20093a0000200641b9046a20062f01a4013b00002006410236028404200641bb046a200641a4016a41026a2d00003a0000200641bc046a200a360200200641c0046a200629038801370300200641c8046a20064188016a41086a290300370300200641d0046a20064188016a41106a290300370300200641d8046a20064188016a41186a28020036020041002109200641003a008004200141206a20064180046a108704210a0c010b20064198036a41026a200641a4016a41026a2d00003a000020064180046a41086a20064188016a41086a29030037030020064180046a41106a20064188016a41106a29030037030020064180046a41186a20064188016a41186a280200360200200620062f01a4013b0198032006200629038801370380040b20142002410f712002410476200d4101711b41246c6a220220093a0000200220062f0198033b00012002200a3602042002200629038004370208200241036a2006419a036a2d00003a0000200241106a20064180046a41086a2215290300370200200241186a20064180046a41106a2216290300370200200241206a20064180046a41186a220d2802003602004100210820064198036a41086a41003602002006201436029c032006410336029803200641b8016a41086a200441086a280200360200200620042902003703b80120064180046a200120064198036a2003200641b8016a200510bb05200641c0026a41086a220520064180046a41246a290200370300200641c0026a41106a220c200641ac046a290200370300200641c0026a41186a220e200641b4046a29020037030020062006419c046a2902003703c002201528020021152006418c046a28020021022016280200210320064194046a280200210b200d2802002114200641bc046a2802002111200641c0046a2903002117200641c8046a2802002116200628028404210d2006280280042104200641e8016a41106a220f200641dc046a280200360200200641e8016a41086a2212200641d4046a2902003703002006200641cc046a2902003703e801024020044101460d00200641386a41186a200e290300370300200641386a41106a200c290300370300200641386a41086a2005290300370300200641206a41086a2012290300370300200641206a41106a200f280200360200200620062903c002370338200620062903e8013703200c1d0b200041013602002000200d3602040c1a0b2014200e41d8bbc7001032000b2016200b41d8bbc7001032000b2002200341e8bbc7001048000b2008200b41e8bbc7001048000b2014200e41d8bbc7001032000b2016200b41d8bbc7001032000b2002200b41e8bbc7001048000b2003200b41e8bbc7001048000b2003200b41d8bbc7001032000b2008200341e8bbc7001048000b2008201541e8bbc7001048000b2002200b41e8bbc7001048000b2014200e41d8bbc7001032000b2016200b41d8bbc7001032000b2016200b41d8bbc7001032000b2008200b41e8bbc7001048000b2002200b41e8bbc7001048000b200041013602002000200c3602040c030b2002200b41d8bbc7001032000b41c88cc600412a41dcbcc700102f000b2008200b41e8bbc7001048000b20062802c40241244d0d05200641cc026a2802001026200724000f0b200b200d4101762202490d0120064180046a200c20026a200b20026b10bc05200641386a41086a20064194046a290200370300200641c8006a2006419c046a290200370300200641d0006a200641a4046a29020037030020062006418c046a290200370338200d4101712102201bad422086200aad84211720064180046a41086a2802002114200628028404210b200628028004210341002108201c21160b0240200628029c0341244d0d00200641a4036a28020010260b410421150c050b2002200b41e8bbc7001048000b024002400240024020022011460d00200b200d20026a22144101762208490d02200641b8016a200c20086a200b20086b10bc052003200328020820026a36020820064198036a41086a220820062902b80137030020064198036a41106a2216200641b8016a41086a29020037030020064198036a41186a220b200641b8016a41106a29020037030020064198036a41206a220d200641b8016a41186a29020037030020064198036a41286a220c200641b8016a41206a290200370300200641c8036a200641b8016a41286a280200360200200641cc036a20093a00002006201441017136029c03410221152006410236029803200641cf036a200641a4016a41026a2d00003a0000200620062f01a4013b00cd03200641d0036a200a360200200641ec036a20064188016a41186a280200360200200641e4036a20064188016a41106a290300370200200641dc036a20064188016a41086a290300370200200641d4036a200629038801370200200641f0036a41086a200441086a280200360200200620042902003703f00320064180046a200120064198036a2003200641f0036a200510bb0520062802840421142006280280042103200641c0026a20064180046a41086a41d80010cf061a20034101460d01200641e8016a200641c0026a41d80010cf061a20064198036a200641a8016a200210c00520064180046a410472200641e8016a41d80010cf061a41002111200641003a008004200141206a20064180046a1087042102200641386a41086a200b290300370300200641386a41106a200d290300370300200641386a41186a200c290300370300200620162903003703382002ad21172008280200210b200641a4036a28020021142006280298032102200628029c032103410021080c060b2003200328020820116a36020820064180046a41086a20062903880137030020064180046a41106a20064188016a41086a29030037030020064180046a41186a20064188016a41106a290300370300200641a0046a20064188016a41186a280200360200200620093a008004200620062f01a4013b0081042006200641a6016a2d00003a0083042006200a3602840420064198036a41086a200441086a2802003602002006200429020037039803200641c0026a200120064180046a200320064198036a200510b90520062802c4022115024020062802c0024101460d00200b200d4101762202490d03200641c0026a41086a2d0000210320064180046a200c20026a200b20026b10bc05200641386a41086a20064194046a290200370300200641386a41106a2006419c046a290200370300200641d0006a200641a4046a290200370300200641206a41086a20064198036a41086a290200370300200641206a41106a20064198036a41106a28020036020020062006418c046a2902003703382006200629029803370320200d4101712102200341ff017145210820064180046a41086a2802002114200628028404210b20062802800421032015ad211741022115410021110c060b20004101360200200020153602040c030b20004101360200200020143602040c020b2008200b41e8bbc7001048000b2002200b41e8bbc7001048000b200628025c41244d0d00200641e4006a2802001026200724000f0b200724000f0b200628025c41244d0d00200641e4006a28020010260b20002008360204200041186a2014360200200041146a200b360200200041106a20033602002000410c6a2002360200200041086a20153602002000411c6a2006290338370200200041c8006a2016360200200041c0006a20173702002000413c6a2011360200200041cc006a2006290320370200200041246a200641386a41086a2903003702002000412c6a200641386a41106a290300370200200041346a200641386a41186a290300370200200041d4006a200641206a41086a290300370200200041dc006a200641206a41106a28020036020020004100360200200724000bda0301077f230041106b22032400200041003a00042000410036020020032000200210cd040240024020032802004101470d00200341086a2802000d0141c8bcc700411141dcbcc700102f000b41242104024002402000280200220541244b0d00200041056a210620052107200021080c010b2000410c6a22082802002107200041086a2802002106200521040b02400240024020072004490d00200121090c010b2002210520012109024003402005450d01200620076a20092d00003a00002005417f6a2105200941016a2109200741016a220720044f0d020c000b0b200820073602000c010b20082007360200200120026a22022009460d00200941016a2105200041056a21082000410c6a210120092d000021040340024002402000280200220941244b0d0041242106200921070c010b20012802002107200921060b024020072006470d0020032000410110cd04024020032802004101470d00200341086a2802000d0441c8bcc700411141dcbcc700102f000b200028020021090b02400240200941244b0d0020082109200021060c010b20002802082109200121060b2006200741016a360200200920076a20043a000020022005460d0120052d00002104200541016a21050c000b0b200341106a24000f0b102c000bba0703017f027e177f230041c0016b22022400200241086a200141d00010cf061a200041086a290300210320002903002104200241003602702002200337036820022004370360200241086a200241e0006a10b902200229036022032003200229036822048520048920022802704101461b2203421988a7220541ff007141818284086c2106200041106a2107200041146a28020021082002412d6a2109200241346a280200210a200241306a280200210b2002280228220c41244b210d200241d4006a2d000041ff0171210e200241086a41cd006a2d000041ff0171210f200028021022102003a72211712212211341002114024003400240200820136a28000022152006732201417f73200141fffdfb776a71418081828478712201450d000240034002400240200241086a2008410020016841037620136a2010716b41d0006c6a221641b07f6a2217460d00200241086a2017412010d2060d010b201641506a211802400240200d0d0020092119200c211a0c010b200b2119200a211a0b024002402018280200221b41244b0d00201841056a21180c010b2016415c6a280200211b201641586a28020021180b201a201b470d00024020192018460d0020192018201a10d2060d010b200e2016417c6a2d0000470d00200e450d02200f201741cd006a2d000041ff0171460d020b2001417f6a2001712201450d020c000b0b200c41244d0d02200b10260c020b201441046a221420136a2010712113201520154101747141808182847871450d000b2002200036025c200241e0006a200241086a41d00010cf061a4104210103402012221620016a2010712112200141046a2101200820166a280000418081828478712217450d000b0240200820176841037620166a20107122016a2c000022164100480d0020082008280200418081828478716841037622016a2d000021160b200041186a2802002117024020164101712218450d0020170d00200241b0016a2007200241dc006a10b802200028021022102011712116200041146a28020021084104210103402016221720016a2010712116200141046a2101200820176a28000041808182847871221b450d000b02402008201b6841037620176a20107122016a2c00004100480d002008280200418081828478716841037621010b200028021821170b2000201720186b360218200820016a200541ff007122163a000020102001417c6a7120086a41046a20163a00002008410020016b41d0006c6a41b07f6a200241e0006a41d00010cf061a2000411c6a2201200128020041016a3602000b200241c0016a24000bb80801047f230041f0026b220424000240024002400240024002400240024020022802004101470d00200241086a280200210520022802042102200441d0016a41186a200141186a290000370300200441d0016a41106a200141106a290000370300200441d0016a41086a200141086a290000370300200420012900003703d001200441f0016a200441d0016a20022005200310ba0520042802f401210120042802f0012102200441f8006a200441f0016a41086a220541d40010cf061a20024101460d03200441246a200441f8006a41d40010cf061a200420013602f4012005200441246a41d40010cf061a41002102200441003a00f0012003200441f0016a10870421010c010b2002280204210302400240200241086a28020022024120460d00200441f0016a41086a200141086a290000370300200441f0016a41106a200141106a290000370300200441f0016a41186a200141186a290000370300200420012900003703f0012002417f4c0d050240024020020d0041012101410021050c010b200210242201450d07200221050b200441003602d801200420013602d001200420053602d401200441d0016a4100200210c90120042802d00120042802d80122016a2003200210cf061a2004412f6a200120026a360000200420042903d001370027413010242201450d07200141043a0000200120042903f00137000120012004290024370021200141096a200441f8016a290300370000200141116a20044180026a290300370000200141196a20044188026a290300370000200141286a2004412b6a290000370000410121020c010b200441246a41026a200341026a2d00003a0000200441f0016a41086a2003410f6a29000037030020044180026a200341176a29000037030020044188026a2003411f6a2d00003a0000200420032f00003b0124200420032900073703f00120032800032101410021020b200441206a41026a2203200441246a41026a2d00003a0000200441f8006a41086a2205200441f0016a41086a290300370300200441f8006a41106a2206200441f0016a41106a290300370300200441f8006a41186a2207200441f0016a41186a2d00003a0000200420042f01243b0120200420042903f00137037820020d012004411c6a41026a20032d00003a0000200441086a2005290300370300200441106a2006290300370300200441186a20072d00003a0000200420042f01203b011c20042004290378370300410121020b200020023a000420004100360200200041056a20042f011c3b0000200041086a20013602002000410c6a2004290300370200200041076a2004411e6a2d00003a0000200041146a200441086a2903003702002000411c6a200441106a290300370200200041246a200441186a2802003602000c050b20004101360200200020013602040c040b20004101360200200020013602040c030b1034000b1033000b102c000b200441f0026a24000b800d01027f230041b0046b22002400024041c004102422010d00102c000b200141023a00002001200029008d04370001200141023a0024200120002900ea03370025200141096a2000418d046a41086a290000370000200141116a2000418d046a41106a290000370000200141196a2000418d046a41186a290000370000200141206a2000418d046a411f6a2800003600002001412d6a200041ea036a41086a290000370000200141356a200041ea036a41106a2900003700002001413d6a200041ea036a41186a290000370000200141c4006a200041ea036a411f6a280000360000200141023a0048200141023a006c200120002900c703370049200141d1006a200041c7036a41086a290000370000200141d9006a200041c7036a41106a290000370000200141e1006a200041c7036a41186a290000370000200141e8006a200041c7036a411f6a280000360000200120002900a40337006d200141f5006a200041a4036a41086a290000370000200141fd006a200041a4036a41106a29000037000020014185016a200041a4036a41186a2900003700002001418c016a200041a4036a411f6a280000360000200141023a009001200141023a00b40120012000290081033700910120014199016a20004181036a41086a290000370000200141a1016a20004181036a41106a290000370000200141a9016a20004181036a41186a290000370000200141b0016a20004181036a411f6a280000360000200120002900de023700b501200141bd016a200041de026a41086a290000370000200141c5016a200041de026a41106a290000370000200141cd016a200041de026a41186a290000370000200141d4016a200041de026a411f6a280000360000200141023a00d801200141f8016a200041bb026a411f6a280000360000200141f1016a200041bb026a41186a290000370000200141e9016a200041bb026a41106a290000370000200141e1016a200041bb026a41086a290000370000200120002900bb023700d901200141023a00fc012001419c026a20004198026a411f6a28000036000020014195026a20004198026a41186a2900003700002001418d026a20004198026a41106a29000037000020014185026a20004198026a41086a29000037000020012000290098023700fd01200141023a00a002200141c0026a200041f5016a411f6a280000360000200141b9026a200041f5016a41186a290000370000200141b1026a200041f5016a41106a290000370000200141a9026a200041f5016a41086a290000370000200120002900f5013700a102200141023a00c402200141e4026a200041d2016a411f6a280000360000200141dd026a200041d2016a41186a290000370000200141d5026a200041d2016a41106a290000370000200141cd026a200041d2016a41086a290000370000200120002900d2013700c502200141023a00e80220014188036a200041af016a411f6a28000036000020014181036a200041af016a41186a290000370000200141f9026a200041af016a41106a290000370000200141f1026a200041af016a41086a290000370000200120002900af013700e902200141023a008c03200141ac036a2000418c016a411f6a280000360000200141a5036a2000418c016a41186a2900003700002001419d036a2000418c016a41106a29000037000020014195036a2000418c016a41086a2900003700002001200029008c0137008d03200141023a00b003200141d0036a200041e9006a411f6a280000360000200141c9036a200041e9006a41186a290000370000200141c1036a200041e9006a41106a290000370000200141b9036a200041e9006a41086a290000370000200120002900693700b103200141023a00d403200141f4036a200041c6006a411f6a280000360000200141ed036a200041c6006a41186a290000370000200141e5036a200041c6006a41106a290000370000200141dd036a200041c6006a41086a290000370000200120002900463700d503200141023a00f80320014198046a200041236a411f6a28000036000020014191046a200041236a41186a29000037000020014189046a200041236a41106a29000037000020014181046a200041236a41086a290000370000200120002900233700f903200141023a009c04200141bc046a2000411f6a280000360000200141b5046a200041186a290000370000200141ad046a200041106a290000370000200141a5046a200041086a2900003700002001200029000037009d04200041b0046a240020010bbd0f010a7f230041f0006b2203240002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200141046a2802002204410174200141086a28020022056b20024d0d0020054101762106200520026a220741017621082007410171450d04200841016a22072006490d06200820044f0d072003200128020020066a200720066b10ca06200341dc006a200341286a280200360200200341306a41246a200341206a290300370200200341cc006a200341186a290300370200200341c4006a200341106a2903003702002003413c6a200341086a29030037020020032003290300370234200320024101712201360230200341306a41047221092005410171220520014b0d01200520014f0d17412421052003280234220241244b0d02200921010c030b200420054101762202490d04200341306a200128020020026a200420026b10bc0520002005410171360200200020032903303702042000410c6a200341386a290300370200200041146a200341c0006a2903003702002000411c6a200341c8006a290300370200200041246a200341d0006a2903003702002000412c6a200341d8006a2802003602000c180b2003280234220521010240200541244d0d00200341c0006a28020021010b2001417f6a220a450d132001417e6a210b200341396a210c41002101034002400240200541244b22020d00200c2106200521040c010b20032802402104200328023c21060b200420014d0d07200141016a2104200620016a2d000021060240024020020d00200c2108200521070c010b20032802402107200328023c21080b200720044d0d08200820016a41016a2d000021080240024020020d00200c21020c010b20032802402105200328023c21020b200520014d0d09200220016a20084104762006410474723a0000200328023421050240200b2001460d00200421010c010b0b02400240200541244b0d00200c2101200521020c010b20032802402102200328023c21010b2002200a4d0d092001200a6a2d000021010240200541244d0d0020032802402105200328023c210c0b2005200a4d0d0a200c200a6a21020c140b200341c0006a2101200221050b0240200128020022012005470d00200341e0006a2009410110cd0420032802604101470d00200341e8006a2802000d0a41c8bcc700411141dcbcc700102f000b02400240200328023441244b0d00200341396a2105200921020c010b200341c0006a21022003413c6a28020021050b2002200141016a360200200520016a41003a00002003280234220521010240200541244d0d00200341c0006a28020021010b024020014102490d002001417f6a2101200341396a210c03402001417f6a210202400240200541244b22040d00200c2106200521080c010b20032802402108200328023c21060b200820024d0d0c200620016a417f6a2d000021060240024020040d00200c2108200521070c010b20032802402107200328023c21080b200720014d0d0d200820016a2d000021080240024020040d00200c21040c010b20032802402105200328023c21040b200520014d0d0e200420016a20084104762006410474723a0000200141014b2104200328023421052002210120040d000b0b02400240200541244b0d00200341396a2101200521020c010b200341c0006a28020021022003413c6a28020021010b2002450d0d20012d0000210102400240200541244b0d00200341396a21020c010b200341c0006a28020021052003413c6a28020021020b2005450d0e2002200141f001714104763a00000c130b20082006490d0e20042008490d0f200341306a200128020020066a200820066b10ca0620002005410171360200200020032903303702042000410c6a200341386a290300370200200041146a200341c0006a2903003702002000411c6a200341c8006a290300370200200041246a200341d0006a2903003702002000412c6a200341d8006a2802003602000c140b2002200441e8bbc7001048000b2006200741f8bbc7001048000b2007200441f8bbc7001047000b2001200441e4bfc7001032000b200141016a200741f4bfc7001032000b200120054184c0c7001032000b200a20024194c0c7001032000b200a200541a4c0c7001032000b102c000b2001417f6a200841acbdc7001032000b2001200741bcbdc7001032000b2001200541ccbdc7001032000b4100410041b4c0c7001032000b4100410041c4c0c7001032000b200620084188bcc7001048000b200820044188bcc7001047000b02400240200541244b0d00200341396a2101200521020c010b200341c0006a28020021022003413c6a28020021010b2002450d0220012d0000210102400240200541244b0d00200341396a21020c010b200341c0006a28020021052003413c6a28020021020b20050d004100410041a4c0c7001032000b200220014104743a00000b0240200328023441244d0d00200341c0006a21090b024020092802002201450d0020092001417f6a3602000b20002003290330370200200041286a200341306a41286a290300370200200041206a200341306a41206a290300370200200041186a200341306a41186a290300370200200041106a200341306a41106a290300370200200041086a200341306a41086a2903003702000c010b410041004194c0c7001032000b200341f0006a24000b130020004101360204200041b08dc6003602000bb50904077f017e077f037e230041c0026b22012400200141206a22024200370300200141186a22034200370300200141086a41086a420037030020014200370308200141086a41868cc700410410fb01200141d8016a41dc9dc600410b10fb012002200141d8016a41086a290000370300200320012900d8013703002001412036022c2001200141086a360228200141306a200141086a412010820202400240200128023022040d00410021050c010b200128023421062001200141306a41086a280200360244200120043602402001200141c0006a108f010240024020012802000d00024002400240024020012802042207200128024441286e2202200220074b1bad42287e2208422088a70d002008a72202417f4c0d000240024020020d00410821050c010b200210242205450d020b4100210920014100360250200120053602482001200241286e36024c0240024002402007450d004100210a034041002102200141003a00f801200a41016a210a2001280244210b417f21030340200b2002460d03200141d8016a20026a2001280240220c2d00003a00002001200b20036a3602442001200c41016a3602402001200241016a220d3a00f8012003417f6a2103200d2102200d4120470d000b200141a0026a41186a2202200141d8016a41186a290300370300200141a0026a41106a2203200141d8016a41106a290300370300200141a0026a41086a220e200141d8016a41086a290300370300200120012903d8013703a002200d41ff01714120490d03200141b8016a41086a220f200e290300370300200141b8016a41106a220e2003290300370300200141b8016a41186a22032002290300370300200120012903a0023703b801200b200d6b22024108490d03200141f8006a41086a200f2903002208370300200141f8006a41106a200e2903002210370300200141f8006a41186a20032903002211370300200141d8006a41086a22032008370300200141d8006a41106a220d2010370300200141d8006a41186a220b2011370300200c29000121082001200c41096a3602402001200241786a360244200120012903b80122103703782001201037035802402009200128024c470d00200141c8006a2009410110900120012802482105200128025021090b2005200941286c6a2202200129035837030020032903002110200d2903002111200b290300211220022008370320200241186a2012370300200241106a2011370300200241086a20103703002001200941016a2209360250200a2007470d000b0b200129024c21082005450d060c070b200241ff0171450d00200141003a00f8010b200128024c2202450d03200241286c0d020c030b1034000b1033000b200510260b0b41002105200141003602a802200142013703a0022001410e360284022001200141286a360280022001200141a0026a3602b801200141ec016a4101360200200142013702dc012001418c8dc6003602d801200120014180026a3602e801200141b8016a41c4e1c000200141d8016a10351a20012802a00220012802a80210840220012802a402450d0020012802a00210260b2006450d00200410260b0240024020050d0020004100360208200042083702000c010b20002008370204200020053602000b200141c0026a24000bcc6a05017f1a7e037f097e067f230041d01f6b22022400200131001221032001310011210420013100102105200131000f2106200131000d2107200131000e2108200131001f2109200131001e210a200131001d210b200131001c210c200131001b210d200131001a210e200131000c210f200131000b2110200131000a211120013100092112200131000721132001310008211420013100192115200131001821162001310017211720013100162118200131001321192001310014211a2001310015211b200220013500002001310004422086842001310005422886842001310006221c4230868442ffffffffffffff03833703801c20022019201a42088684201b4210868420184218868420174220868420164228868420154230868442018842ffffffffffffff03833703981c2002201c201342088684201442108684201242188684201142208684201042288684200f4230868442038842ffffffffffffff03833703881c20022016201542088684200e42108684200d42188684200c42208684200b42288684200a42308684200942388684420c8842ffffffffffffff03833703a01c2002200f20074208868420084210868420064218868420054220868420044228868420034230868420194238868442068842ffffffffffffff03833703901c200241a81c6a200241801c6a10644100211d4101211e03402001201d6a2d0000200241a81c6a201d6a2d000073221f4100201f6b72417f73418001714107761066201e71211e201d41016a221d4120470d000b201e1066211d200241881f6a200241801c6a106420022d00881f4101711066211e024002400240201d41ff0171450d00201e41ff01714101460d00200241c81c6a200241801c6a41011067200242f0ffffffffffff3f20022903e81c7d220f42ffffffffffffff038342f0ffffffffffff3f20022903e01c7d22154233887c3703901d2002201542ffffffffffffff038342f0ffffffffffff3f20022903d81c22157d22164233887c3703881d2002201642ffffffffffffff038342f0ffffffffffff3f20022903d01c22167d22194233887c3703801d2002201942ffffffffffffff038342d1fdffffffffff3f20022903c81c22197d22034233887c3703f81c2002200f42338842137e200342ffffffffffffff03837c3703f01c200242003703b01d200242003703b81d2002201942017c3703981d200220163703a01d200220153703a81d200220022903e01c3703b01d200220022903b81d20022903e81c7c3703b81d200241c01d6a200241981d6a41011067200241b81e6a200241f01c6a41011067200241e8186a20022903c01e220f420042ca8e9ae5dec6ac02420010cc0620024198186a20022903c81e221642137e22054200428092f58893f9b701420010cc06200241c8176a20022903d01e220342137e2204420042c486ffe299c731420010cc06200241f8166a20022903d81e220642137e2219420042d6fff8ffd98b8601420010cc0620024188166a20022903b81e2215420042c2a2aaa7fcfa9503420010cc06200241f8156a2015420042ca8e9ae5dec6ac02420010cc06200241f8186a200f42137e4200428092f58893f9b701420010cc06200241a8186a2005420042c486ffe299c731420010cc06200241d8176a2004420042d6fff8ffd98b8601420010cc0620024188176a2019420042c2a2aaa7fcfa9503420010cc0620024188186a2016420042ca8e9ae5dec6ac02420010cc06200241b8176a20044200428092f58893f9b701420010cc06200241e8166a2019420042c486ffe299c731420010cc0620024198166a2015420042d6fff8ffd98b8601420010cc06200241d8186a200f420042c2a2aaa7fcfa9503420010cc06200241a8176a2003420042ca8e9ae5dec6ac02420010cc06200241d8166a20194200428092f58893f9b701420010cc06200241a8166a2015420042c486ffe299c731420010cc06200241c8186a200f420042d6fff8ffd98b8601420010cc06200241f8176a2016420042c2a2aaa7fcfa9503420010cc06200241c8166a2006420042ca8e9ae5dec6ac02420010cc06200241b8166a20154200428092f58893f9b701420010cc06200241b8186a200f420042c486ffe299c731420010cc06200241e8176a2016420042d6fff8ffd98b8601420010cc0620024198176a2003420042c2a2aaa7fcfa9503420010cc06200241d8156a20022903b816221420022903c8167c220f20022903b8187c221520022903e8177c22162002290398177c221920022903d816221720022903a8177c220320022903a8167c220420022903c8187c220520022903f8177c220620022903b81722182002290388187c220720022903e8167c22082002290398167c220920022903d8187c220a200229039818221a20022903e8187c220b20022903c8177c220c20022903f8167c220d2002290388167c220e20022903f818221b20022903f8157c221020022903a8187c221120022903d8177c22122002290388177c2213423388200241f8186a41086a290300200241f8156a41086a2903007c2010201b54ad7c200241a8186a41086a2903007c2011201054ad7c200241d8176a41086a2903007c2012201154ad7c20024188176a41086a2903007c2013201254ad7c420d86847c221042338820024198186a41086a290300200241e8186a41086a2903007c200b201a54ad7c200241c8176a41086a2903007c200c200b54ad7c200241f8166a41086a2903007c200d200c54ad7c20024188166a41086a2903007c200e200d54ad7c2010200e54ad7c420d86847c220b423388200241b8176a41086a29030020024188186a41086a2903007c2007201854ad7c200241e8166a41086a2903007c2008200754ad7c20024198166a41086a2903007c2009200854ad7c200241d8186a41086a2903007c200a200954ad7c200b200a54ad7c420d86847c2207423388200241d8166a41086a290300200241a8176a41086a2903007c2003201754ad7c200241a8166a41086a2903007c2004200354ad7c200241c8186a41086a2903007c2005200454ad7c200241f8176a41086a2903007c2006200554ad7c2007200654ad7c420d86847c220542ffffffffffffff038320022903e01d22067d42f0ffffffffffff3f7c220842ffffffffffffff0383200742ffffffffffffff038320022903d81d22047d42f0ffffffffffff3f7c22074233887c220c420020022903d01d220342137e2209420010cc06200241e8136a200842338842137e2005423388200241b8166a41086a290300200241c8166a41086a2903007c200f201454ad7c200241b8186a41086a2903007c2015200f54ad7c200241e8176a41086a2903007c2016201554ad7c20024198176a41086a2903007c2019201654ad7c2005201954ad7c420d868442137e201342feffffffffffff03837c221542ffffffffffffff038320022903c01d22167d42d0fdffffffffff3f7c220d42ffffffffffffff03837c220f420020022903c81d2219420010cc0620024188156a200742ffffffffffffff0383200b42ffffffffffffff038320037d42f0ffffffffffff3f7c22054233887c220a4200200442137e2207420010cc06200241b8146a200542ffffffffffffff03832015423388201042ffffffffffffff03837c20197d42f0ffffffffffff3f7c22154233887c22084200200642137e2205420010cc0620024198136a201542ffffffffffffff0383200d4233887c221542002016420010cc06200241e8156a200c4200201942137e420010cc06200241f8136a20164200200f420010cc0620024198156a200a42002009420010cc06200241c8146a200842002007420010cc06200241a8136a201542002005420010cc06200241c8156a200c42002007420010cc06200241d8136a200f42002003420010cc06200241f8146a200a42002005420010cc06200241a8146a200842002016420010cc0620024188136a201542002019420010cc06200241b8156a200c42002005420010cc06200241c8136a200f42002004420010cc06200241e8146a200a42002016420010cc0620024198146a200842002019420010cc06200241f8126a201542002003420010cc06200241a8156a200c42002016420010cc06200241b8136a200f42002006420010cc06200241d8146a200a42002019420010cc0620024188146a200842002003420010cc06200241e8126a201542002004420010cc06200220022903c815221120022903d8137c221620022903f8147c221920022903a8147c22032002290388137c220420022903d815221220022903e8137c22052002290388157c220620022903b8147c22072002290398137c220920022903e815221320022903f8137c220b2002290398157c220d20022903c8147c220e20022903a8137c2210423388200241e8156a41086a290300200241f8136a41086a2903007c200b201354ad7c20024198156a41086a2903007c200d200b54ad7c200241c8146a41086a2903007c200e200d54ad7c200241a8136a41086a2903007c2010200e54ad7c420d86847c220b423388200241d8156a41086a290300200241e8136a41086a2903007c2005201254ad7c20024188156a41086a2903007c2006200554ad7c200241b8146a41086a2903007c2007200654ad7c20024198136a41086a2903007c2009200754ad7c200b200954ad7c420d86847c220542ffffffffffffff03833703a01e200220022903b815220e20022903c8137c220620022903e8147c22072002290398147c220920022903f8127c220d2005423388200241c8156a41086a290300200241d8136a41086a2903007c2016201154ad7c200241f8146a41086a2903007c2019201654ad7c200241a8146a41086a2903007c2003201954ad7c20024188136a41086a2903007c2004200354ad7c2005200454ad7c420d86847c221642ffffffffffffff03833703a81e200220022903a815221120022903b8137c221920022903d8147c22032002290388147c220420022903e8127c22052016423388200241b8156a41086a290300200241c8136a41086a2903007c2006200e54ad7c200241e8146a41086a2903007c2007200654ad7c20024198146a41086a2903007c2009200754ad7c200241f8126a41086a2903007c200d200954ad7c2016200d54ad7c420d86847c221642ffffffffffffff03833703b01e20022016423388200241a8156a41086a290300200241b8136a41086a2903007c2019201154ad7c200241d8146a41086a2903007c2003201954ad7c20024188146a41086a2903007c2004200354ad7c200241e8126a41086a2903007c2005200454ad7c2016200554ad7c420d868442137e201042ffffffffffffff03837c221642ffffffffffffff03833703901e20022016423388200b42ffffffffffffff03837c3703981e200241a81f6a41106a4200370300200241a81f6a41186a4200370300200241a81f6a41206a4200370300200242003703b01f200242013703a81f200241b81e6a200241a81f6a200241901e6a106820024198106a20022903c01e2216420020022903a01d2206420010cc06200241a8106a200241e01e6a2903002219420020022903a81d220942137e2210420010cc0620024188116a200241b81e6a41206a221d2903002203420020022903b01d220d42137e220e420010cc06200241e8116a200241b81e6a41186a221e2903002204420020022903b81d221142137e220b420010cc06200241d8126a200241b81e6a41106a221f2903002205420020022903981d2207420010cc0620024198126a200742002016420010cc06200241d80f6a20194200200642137e420010cc06200241b8106a200342002010420010cc0620024198116a20044200200e420010cc06200241f8116a20054200200b420010cc06200241e8106a201642002009420010cc06200241f8106a20194200200e420010cc06200241d8116a20034200200b420010cc06200241c8126a200442002007420010cc0620024188106a200542002006420010cc06200241b8116a20164200200d420010cc06200241c8116a20194200200b420010cc06200241b8126a200342002007420010cc06200241f80f6a200442002006420010cc06200241d8106a200542002009420010cc0620024188126a201642002011420010cc06200241a8126a201942002007420010cc06200241e80f6a200342002006420010cc06200241c8106a200442002009420010cc06200241a8116a20054200200d420010cc06200241980f6a20022903a81222202002290388127c220620022903e80f7c220720022903c8107c220920022903a8117c220b20022903c811222120022903b8117c220d20022903b8127c220e20022903f80f7c221020022903d8107c221120022903f810222220022903e8107c221220022903d8117c221320022903c8127c22142002290388107c221720022903a81022232002290398107c22182002290388117c221a20022903e8117c221b20022903d8127c221c20022903d80f22242002290398127c222520022903b8107c22262002290398117c222720022903f8117c2228423388200241d80f6a41086a29030020024198126a41086a2903007c2025202454ad7c200241b8106a41086a2903007c2026202554ad7c20024198116a41086a2903007c2027202654ad7c200241f8116a41086a2903007c2028202754ad7c420d86847c2225423388200241a8106a41086a29030020024198106a41086a2903007c2018202354ad7c20024188116a41086a2903007c201a201854ad7c200241e8116a41086a2903007c201b201a54ad7c200241d8126a41086a2903007c201c201b54ad7c2025201c54ad7c420d86847c2218423388200241f8106a41086a290300200241e8106a41086a2903007c2012202254ad7c200241d8116a41086a2903007c2013201254ad7c200241c8126a41086a2903007c2014201354ad7c20024188106a41086a2903007c2017201454ad7c2018201754ad7c420d86847c2212423388200241c8116a41086a290300200241b8116a41086a2903007c200d202154ad7c200241b8126a41086a2903007c200e200d54ad7c200241f80f6a41086a2903007c2010200e54ad7c200241d8106a41086a2903007c2011201054ad7c2012201154ad7c420d86847c220e42ffffffffffffff0383220d4200200842137e2211420010cc06200241880d6a200e423388200241a8126a41086a29030020024188126a41086a2903007c2006202054ad7c200241e80f6a41086a2903007c2007200654ad7c200241c8106a41086a2903007c2009200754ad7c200241a8116a41086a2903007c200b200954ad7c200e200b54ad7c420d868442137e202842ffffffffffffff03837c220742ffffffffffffff0383220642002015420010cc06200241d80e6a201242ffffffffffffff0383220b4200200a42137e2210420010cc06200241880e6a201842ffffffffffffff038322094200200c42137e220e420010cc06200241d80d6a2007423388202542ffffffffffffff03837c22074200200f420010cc06200241b8096a200d4200201542137e420010cc06200241980d6a200f42002006420010cc06200241c80e6a200b42002011420010cc06200241f80d6a200942002010420010cc06200241e80d6a20074200200e420010cc06200241a80f6a200d42002010420010cc06200241f80c6a200642002008420010cc06200241e80e6a200b4200200e420010cc06200241980e6a20094200200f420010cc06200241c80d6a200742002015420010cc06200241b80f6a200d4200200e420010cc06200241e80c6a20064200200a420010cc06200241f80e6a200b4200200f420010cc06200241a80e6a200942002015420010cc06200241b80d6a200742002008420010cc06200241c80f6a200d4200200f420010cc06200241d80c6a20064200200c420010cc06200241880f6a200b42002015420010cc06200241b80e6a200942002008420010cc06200241a80d6a20074200200a420010cc0620022d00b81e2129201d200241801c6a41206a222a290300370300201e200241801c6a41186a222b290300370300201f200241801c6a41106a222c2903002208370300200241b81e6a41086a222d200241801c6a41086a222e2903002215370300200220022903801c220f3703b81e2002200f20022903801c7c220f3703b81e202d2015202e2903007c2215370300201f2008202c2903007c2208370300201e201e290300202b2903007c220a370300200241f8096a201d290300202a2903007c220c4200200942137e2211420010cc06200241980c6a200f42002007420010cc06200241a80a6a200a4200200b42137e2210420010cc06200241f80a6a20084200200d42137e220e420010cc06200241c80b6a201542002006420010cc06200241880c6a20064200200f420010cc06200241880a6a200c4200200742137e420010cc06200241980a6a200a42002011420010cc06200241e80a6a200842002010420010cc06200241b80b6a20154200200e420010cc06200241a80c6a200f42002009420010cc06200241e8096a200c42002010420010cc06200241b80a6a200a4200200e420010cc06200241880b6a200842002006420010cc06200241d80b6a201542002007420010cc06200241b80c6a200f4200200b420010cc06200241d8096a200c4200200e420010cc06200241c80a6a200a42002006420010cc06200241980b6a200842002007420010cc06200241e80b6a201542002009420010cc06200241c80c6a200f4200200d420010cc06200241c8096a200c42002006420010cc06200241d80a6a200a42002007420010cc06200241a80b6a200842002009420010cc06200241f80b6a20154200200b420010cc06200241c8076a2019420020022903a80f221820022903f80c7c220f20022903e80e7c221520022903980e7c220720022903c80d7c220820022903980f221220022903880d7c220620022903d80e7c220920022903880e7c220a20022903d80d7c220b20022903b809221320022903980d7c220d20022903c80e7c220e20022903f80d7c221020022903e80d7c2211423388200241b8096a41086a290300200241980d6a41086a2903007c200d201354ad7c200241c80e6a41086a2903007c200e200d54ad7c200241f80d6a41086a2903007c2010200e54ad7c200241e80d6a41086a2903007c2011201054ad7c420d86847c220d423388200241980f6a41086a290300200241880d6a41086a2903007c2006201254ad7c200241d80e6a41086a2903007c2009200654ad7c200241880e6a41086a2903007c200a200954ad7c200241d80d6a41086a2903007c200b200a54ad7c200d200b54ad7c420d86847c220942ffffffffffffff0383220642137e221a420010cc06200241a8076a2016420020022903c80f221b20022903d80c7c220a20022903880f7c220b20022903b80e7c220e20022903a80d7c221020022903b80f221c20022903e80c7c221220022903f80e7c221320022903a80e7c221420022903b80d7c22172009423388200241a80f6a41086a290300200241f80c6a41086a2903007c200f201854ad7c200241e80e6a41086a2903007c2015200f54ad7c200241980e6a41086a2903007c2007201554ad7c200241c80d6a41086a2903007c2008200754ad7c2009200854ad7c420d86847c2215423388200241b80f6a41086a290300200241e80c6a41086a2903007c2012201c54ad7c200241f80e6a41086a2903007c2013201254ad7c200241a80e6a41086a2903007c2014201354ad7c200241b80d6a41086a2903007c2017201454ad7c2015201754ad7c420d86847c2207423388200241c80f6a41086a290300200241d80c6a41086a2903007c200a201b54ad7c200241880f6a41086a2903007c200b200a54ad7c200241b80e6a41086a2903007c200e200b54ad7c200241a80d6a41086a2903007c2010200e54ad7c2007201054ad7c420d868442137e201142ffffffffffffff03837c220a423388200d42ffffffffffffff03837c220f420010cc06200241f8076a20034200201542ffffffffffffff0383220842137e2209420010cc06200241b8086a20044200200742ffffffffffffff0383220b42137e2207420010cc06200241d8066a20054200200a42ffffffffffffff03832215420010cc06200241e8066a201542002016420010cc06200241b8076a20194200200f42137e420010cc06200241d8076a20034200201a420010cc0620024188086a200442002009420010cc06200241c8086a200542002007420010cc06200241d8086a201642002006420010cc06200241e8076a201942002009420010cc06200241a8086a200342002007420010cc06200241c8066a200442002015420010cc0620024198076a20054200200f420010cc0620024188096a201642002008420010cc0620024198086a201942002007420010cc06200241e8056a200342002015420010cc0620024188076a20044200200f420010cc06200241e8086a200542002006420010cc06200241a8096a20164200200b420010cc0620024188056a201942002015420010cc06200241f8066a20034200200f420010cc06200241f8086a200442002006420010cc0620024198096a200542002008420010cc06201d200c370300200220022903c809221420022903c80c7c220f20022903d80a7c221520022903a80b7c221620022903f80b7c221920022903d809221720022903b80c7c220320022903c80a7c220420022903980b7c220520022903e80b7c220620022903e809221820022903a80c7c220720022903b80a7c220820022903880b7c220920022903d80b7c220a20022903f809221a20022903980c7c220b20022903a80a7c220c20022903f80a7c220d20022903c80b7c220e20022903880a221b20022903880c7c221020022903980a7c221120022903e80a7c221220022903b80b7c2213423388200241880a6a41086a290300200241880c6a41086a2903007c2010201b54ad7c200241980a6a41086a2903007c2011201054ad7c200241e80a6a41086a2903007c2012201154ad7c200241b80b6a41086a2903007c2013201254ad7c420d86847c2210423388200241f8096a41086a290300200241980c6a41086a2903007c200b201a54ad7c200241a80a6a41086a2903007c200c200b54ad7c200241f80a6a41086a2903007c200d200c54ad7c200241c80b6a41086a2903007c200e200d54ad7c2010200e54ad7c420d86847c220b423388200241e8096a41086a290300200241a80c6a41086a2903007c2007201854ad7c200241b80a6a41086a2903007c2008200754ad7c200241880b6a41086a2903007c2009200854ad7c200241d80b6a41086a2903007c200a200954ad7c200b200a54ad7c420d86847c2207423388200241d8096a41086a290300200241b80c6a41086a2903007c2003201754ad7c200241c80a6a41086a2903007c2004200354ad7c200241980b6a41086a2903007c2005200454ad7c200241e80b6a41086a2903007c2006200554ad7c2007200654ad7c420d86847c2203423388200241c8096a41086a290300200241c80c6a41086a2903007c200f201454ad7c200241d80a6a41086a2903007c2015200f54ad7c200241a80b6a41086a2903007c2016201554ad7c200241f80b6a41086a2903007c2019201654ad7c2003201954ad7c420d868442137e201342ffffffffffffff03837c220f42ffffffffffffff03833703e81d2002200f423388201042ffffffffffffff03837c3703f01d2002200342ffffffffffffff038322063703881e2002200742ffffffffffffff038322073703801e2002200b42ffffffffffffff038322083703f81d200241c8076a41086a2903002113200241a8076a41086a290300211420022903c807211520022903a8072109200241f8076a41086a290300211720022903f807210b200241b8086a41086a290300211820022903b808210c200241d8066a41086a290300211a20022903d806210d200241e8066a41086a290300211b200241b8076a41086a290300211c20022903e806210e20022903b8072116200241d8076a41086a290300212520022903d807211020024188086a41086a29030021262002290388082111200241c8086a41086a290300212720022903c808211220022903d808210320022903e807211920022903a808210420022903c8062105200229039807210a200241881f6a200241e81d6a106420022d00881f4101711066211d200241f8056a20022903901d220f4200200a20052004201920037c22037c22047c22057c220a200d200c200b201520097c22097c220b7c220c7c220d2012201120102016200e7c220e7c22107c22117c2212423388202720262025201c201b7c200e201654ad7c7c2010200e54ad7c7c2011201054ad7c7c2012201154ad7c420d86847c2216423388201a20182017201320147c2009201554ad7c7c200b200954ad7c7c200c200b54ad7c7c200d200c54ad7c2016200d54ad7c420d86847c220b42ffffffffffffff0383220942137e2218420010cc06200241d8046a20022903f01c22154200200229038805221a20022903a8097c220c20022903f8067c220d20022903f8087c220e2002290398097c2210200229039808221b2002290388097c221120022903e8057c22132002290388077c221420022903e8087c2217200b423388200241e8076a41086a290300200241d8086a41086a2903007c2003201954ad7c200241a8086a41086a2903007c2004200354ad7c200241c8066a41086a2903007c2005200454ad7c20024198076a41086a2903007c200a200554ad7c200b200a54ad7c420d86847c220342338820024198086a41086a29030020024188096a41086a2903007c2011201b54ad7c200241e8056a41086a2903007c2013201154ad7c20024188076a41086a2903007c2014201354ad7c200241e8086a41086a2903007c2017201454ad7c2003201754ad7c420d86847c220442338820024188056a41086a290300200241a8096a41086a2903007c200c201a54ad7c200241f8066a41086a2903007c200d200c54ad7c200241f8086a41086a2903007c200e200d54ad7c20024198096a41086a2903007c2010200e54ad7c2004201054ad7c420d868442137e201242ffffffffffffff03837c2205423388201642ffffffffffffff03837c2216420010cc06200241a8056a20022903881d22194200200342ffffffffffffff0383220b42137e220c420010cc06200241b8036a20022903801d22034200200442ffffffffffffff0383220d42137e220a420010cc0620024188046a20022903f81c22044200200542ffffffffffffff03832205420010cc0620024198046a200542002015420010cc06200241e8046a200f4200201642137e420010cc0620024188066a201942002018420010cc06200241b8056a20034200200c420010cc06200241c8036a20044200200a420010cc0620024198066a201542002009420010cc0620024198056a200f4200200c420010cc06200241a8036a20194200200a420010cc06200241f8036a200342002005420010cc06200241c8046a200442002016420010cc06200241c8056a20154200200b420010cc06200241c8026a200f4200200a420010cc06200241e8036a201942002005420010cc06200241b8046a200342002016420010cc06200241a8066a200442002009420010cc06200241f8046a20154200200d420010cc06200241d8036a200f42002005420010cc06200241a8046a201942002016420010cc06200241b8066a200342002009420010cc06200241d8056a20044200200b420010cc06200241d8026a200642f0ffffffffffff3f20067d221042ffffffffffffff038342f0ffffffffffff3f20077d22174233887c854200201dad42ff01837d220483200685220f420020022903980522182002290398067c221620022903a8037c221920022903f8037c220320022903c8047c220520022903f805221120022903d8047c221520022903a8057c220620022903b8037c22092002290388047c220a20022903e80422122002290398047c220b2002290388067c220c20022903b8057c220d20022903c8037c220e423388200241e8046a41086a29030020024198046a41086a2903007c200b201254ad7c20024188066a41086a2903007c200c200b54ad7c200241b8056a41086a2903007c200d200c54ad7c200241c8036a41086a2903007c200e200d54ad7c420d86847c220b423388200241f8056a41086a290300200241d8046a41086a2903007c2015201154ad7c200241a8056a41086a2903007c2006201554ad7c200241b8036a41086a2903007c2009200654ad7c20024188046a41086a2903007c200a200954ad7c200b200a54ad7c420d86847c220942ffffffffffffff0383220642137e221a420010cc06200241c8016a20022903e81d2215201042338842137e42d0fdffffffffff3f20157d221b42ffffffffffffff03837c852004832015852215420020022903d803221c20022903f8047c220a20022903a8047c220c20022903b8067c220d20022903d8057c221020022903c802222520022903c8057c221120022903e8037c221220022903b8047c221320022903a8067c2214200942338820024198056a41086a29030020024198066a41086a2903007c2016201854ad7c200241a8036a41086a2903007c2019201654ad7c200241f8036a41086a2903007c2003201954ad7c200241c8046a41086a2903007c2005200354ad7c2009200554ad7c420d86847c2203423388200241c8026a41086a290300200241c8056a41086a2903007c2011202554ad7c200241e8036a41086a2903007c2012201154ad7c200241b8046a41086a2903007c2013201254ad7c200241a8066a41086a2903007c2014201354ad7c2003201454ad7c420d86847c2205423388200241d8036a41086a290300200241f8046a41086a2903007c200a201c54ad7c200241a8046a41086a2903007c200c200a54ad7c200241b8066a41086a2903007c200d200c54ad7c200241d8056a41086a2903007c2010200d54ad7c2005201054ad7c420d868442137e200e42ffffffffffffff03837c220c423388200b42ffffffffffffff03837c2216420010cc06200241f8016a2007201742ffffffffffffff038342f0ffffffffffff3f20087d220a4233887c8520048320078522194200200342ffffffffffffff0383220742137e2209420010cc06200241286a2008200a42ffffffffffffff038342f0ffffffffffff3f20022903f01d220a7d220d4233887c8520048320088522034200200542ffffffffffffff0383220b42137e2208420010cc06200241f8006a200a200a200d42ffffffffffffff0383201b4233887c852004838522044200200c42ffffffffffffff03832205420010cc0620024188016a200542002015420010cc06200241d8016a200f4200201642137e420010cc06200241e8026a20194200201a420010cc0620024188026a200342002009420010cc06200241386a200442002008420010cc06200241f8026a201542002006420010cc06200241e8016a200f42002009420010cc06200241186a201942002008420010cc06200241e8006a200342002005420010cc06200241b8016a200442002016420010cc0620024198026a201542002007420010cc06200241086a200f42002008420010cc06200241d8006a201942002005420010cc06200241a8016a200342002016420010cc0620024188036a200442002006420010cc06200241b8026a20154200200b420010cc06200241c8006a200f42002005420010cc0620024198016a201942002016420010cc0620024198036a200342002006420010cc06200241a8026a200442002007420010cc062002200f3703881e200220193703801e200220153703e81d200220043703f01d200220033703f81d200220063703a01e200220073703a81e2002200b3703b01e200220053703901e200220163703981e200220022903e801220b20022903f8027c220f20022903187c221520022903687c221620022903b8017c221920022903d802220c20022903c8017c220320022903f8017c220420022903287c220520022903787c220620022903d801220d2002290388017c220720022903e8027c22082002290388027c220920022903387c220a423388200241d8016a41086a29030020024188016a41086a2903007c2007200d54ad7c200241e8026a41086a2903007c2008200754ad7c20024188026a41086a2903007c2009200854ad7c200241386a41086a2903007c200a200954ad7c420d86847c2207423388200241d8026a41086a290300200241c8016a41086a2903007c2003200c54ad7c200241f8016a41086a2903007c2004200354ad7c200241286a41086a2903007c2005200454ad7c200241f8006a41086a2903007c2006200554ad7c2007200654ad7c420d86847c220342ffffffffffffff03833703b81f2002200229030822092002290398027c220420022903587c220520022903a8017c22062002290388037c22082003423388200241e8016a41086a290300200241f8026a41086a2903007c200f200b54ad7c200241186a41086a2903007c2015200f54ad7c200241e8006a41086a2903007c2016201554ad7c200241b8016a41086a2903007c2019201654ad7c2003201954ad7c420d86847c220f42ffffffffffffff03833703c01f20022002290348220b20022903b8027c22152002290398017c22162002290398037c221920022903a8027c2203200f423388200241086a41086a29030020024198026a41086a2903007c2004200954ad7c200241d8006a41086a2903007c2005200454ad7c200241a8016a41086a2903007c2006200554ad7c20024188036a41086a2903007c2008200654ad7c200f200854ad7c420d86847c220f42ffffffffffffff03833703c81f2002200f423388200241c8006a41086a290300200241b8026a41086a2903007c2015200b54ad7c20024198016a41086a2903007c2016201554ad7c20024198036a41086a2903007c2019201654ad7c200241a8026a41086a2903007c2003201954ad7c200f200354ad7c420d868442137e200a42ffffffffffffff03837c220f42ffffffffffffff03833703a81f2002200f423388200742ffffffffffffff03837c3703b01f4200210f02402029450d00200241881f6a200241a81f6a10644200210f20022d00881f410171106641ff01714101460d00200241d01e6a4200370300200241c81e6a4200370300200241c01e6a4200370300200242003703b81e200241881f6a200241901e6a10644100211d4101211e0340200241b81e6a201d6a2d0000200241881f6a201d6a2d000073221f4100201f6b72417f73418001714107761066201e71211e201d41016a221d4120470d000b4200210f201e106641ff01714101460d00200241b81e6a41206a200241e81d6a41206a290300370300200241b81e6a41186a200241e81d6a41186a290300370300200241b81e6a41106a200241e81d6a41106a290300370300200241b81e6a41086a200241e81d6a41086a290300370300200241e81e6a200241901e6a41086a290300370300200241f01e6a200241901e6a41106a290300370300200241f81e6a200241901e6a41186a290300370300200241801f6a200241901e6a41206a290300370300200220022903e81d3703b81e200220022903901e3703e01e200241881b6a41206a200241a81f6a41206a290300370300200241881b6a41186a200241a81f6a41186a290300370300200241881b6a41106a200241a81f6a41106a290300370300200241881b6a41086a200241a81f6a41086a290300370300200220022903a81f3703881b200241b01b6a200241b81e6a41d00010cf061a4201210f0b200241b81e6a211d200f4200510d01200241b01a6a41036a200241b01b6a41d00010cf061a200241881a6a41206a221d200241881b6a41206a290300370300200241881a6a41186a221e200241881b6a41186a290300370300200241881a6a41106a221f200241881b6a41106a290300370300200241881a6a41086a2229200241881b6a41086a290300370300200220022903881b3703881a200241b5196a200241b01a6a41d30010cf061a20024188196a41206a222a201d29030037030020024188196a41186a221d201e29030037030020024188196a41106a221e201f29030037030020024188196a41086a221f2029290300370300200220022903881a37038819200041086a200241b5196a41036a41d00010cf061a200041e0006a4200370300200041d8006a4201370300200041e8006a4200370300200041f0006a4200370300200041f8006a420037030020004180016a20022903881937000020004188016a201f29030037000020004190016a201e29030037000020004198016a201d290300370000200041a0016a202a290300370000200041a8016a2001290000370000200041b0016a200141086a290000370000200041b8016a200141106a290000370000200041c0016a200141186a2900003700004100211d0c020b200241b81e6a211d0b200241b01a6a410f6a201d410f6a290000370000200241b01a6a41086a201d41086a2900003703002002201d2900003703b01a200241b5196a200241b01a6a41d30010cf061a4101211d200041013a0004200020022900b5193700052000410d6a200241b5196a41086a290000370000200041146a200241b5196a410f6a2900003700000b2000201d360200200241d01f6a24000bc19b0204087f1a7e157f447e230041b0cc006b22022400200241e0c4006a41386a22034200370300200241e0c4006a41306a22044200370300200241e0c4006a41286a22054200370300200241e0c4006a41206a22064200370300200241e0c4006a41186a22074200370300200241e0c4006a41106a22084200370300200241e0c4006a41086a22094200370300200242003703e044200141b7eec6004107200241e0c4006a41c0001083012008310000210a2009310000210b2007310000210c20023100f244210d20023100f144210e20023100ef44210f20023100ed44211020023100ee44211120023100ff44211220023100fe44211320023100fd44211420023100fc44211520023100fb44211620023100fa44211720023100ec44211820023100eb44211920023100ea44211a20023100e944211b20023100e744211c20023100f944211d20023100f744211e20023100f644211f20023100f344212020023100f444212120023100f5442122200220023502e04420023100e4444220868420023100e5444228868420023100e64422234230868442ffffffffffffff03833703a04520022020202142088684202242108684201f42188684201e42208684200c42288684201d4230868442018842ffffffffffffff03833703b84520022023201c42088684200b42108684201b42188684201a4220868420194228868420184230868442038842ffffffffffffff03833703a8452002200c201d42088684201742108684201642188684201542208684201442288684201342308684201242388684420c8842ffffffffffffff03833703c04520022018201042088684201142108684200f42188684200a42208684200e42288684200d4230868420204238868442068842ffffffffffffff03833703b045200241c8c5006a200241a0c5006a1069200241e8c6006a41186a20032903002220370300200241e8c6006a41106a2004290300220a370300200241e8c6006a41086a2005290300220b37030020022006290300220d3703e84620023100fa46210e20023100f946210f20023100f746211020023100f546211120023100f646211220023100874721132002310086472114200231008547211520023100844721162002310083472117200231008247211920023100f446210c20023100f346211a20023100f246211b20023100f146211c20023100ef46211e200231008147211820023100ff46211f20023100fe46212120023100fb46211d20023100fc46212220023100fd4621232002200d42ffffffff0f8320023100ec464220868420023100ed464228868420023100ee46220d4230868442ffffffffffffff0383370388472002201d202242088684202342108684202142188684201f42208684202042ff018322204228868420184230868442018842ffffffffffffff03833703a0472002200d201e42088684200b42ff018342108684201c42188684201b42208684201a42288684200c4230868442038842ffffffffffffff03833703904720022018420886202084201942108684201742188684201642208684201542288684201442308684201342388684420c8842ffffffffffffff03833703a8472002200c201142088684201242108684201042188684200a42ff018342208684200f42288684200e42308684201d4238868442068842ffffffffffffff038337039847200241b0c7006a20024188c7006a1069200241d0c8006a41106a2204200241b0c7006a41386a290300220b370300200241d0c8006a41086a2224200241b0c7006a41306a290300220d20022903b847220e7c3703002004200b20022903c047220f7c370300200241d0c8006a41186a2208200241b0c7006a41c0006a290300221020022903c84722117c370300200241d0c8006a41206a2209200241b0c7006a41c8006a290300221220022903d04722137c370300200220022903d847221420022903b04722157c3703d04820024188cc006a41206a2203200241b0c7006a41f0006a29030037030020024188cc006a41186a2205200241b0c7006a41e8006a29030037030020024188cc006a41106a2206200241b0c7006a41e0006a29030037030020024188cc006a41086a2207200241b0c7006a41d8006a29030037030020022002290380483703884c200241e0c1006a20022903a848220c420042fabaabb1878ad401420010cc06200241b0c2006a200241b0c7006a4198016a2903002218420042968c8a82a4c39824420010cc0620024180c3006a200241b0c7006a4190016a290300221d420042d587a4ceaceea43d420010cc06200241d0c3006a200241b0c7006a4188016a2903002220420042edd39cadab84b215420010cc06200241a0c4006a200241b0c7006a4180016a290300220a420042d9e2cbb5c2f2a603420010cc06200241d0c1006a200c420042d9e2cbb5c2f2a603420010cc06200241a0c2006a20184200428ee0b9a98cbfbd1f420010cc06200241f0c2006a201d420042968c8a82a4c39824420010cc06200241c0c3006a2020420042d587a4ceaceea43d420010cc0620024190c4006a200a420042edd39cadab84b215420010cc06200241f0c1006a200c420042d2808e80cce8f301420010cc06200241c0c2006a2018420042d587a4ceaceea43d420010cc0620024190c3006a201d420042edd39cadab84b215420010cc06200241e0c3006a2020420042d9e2cbb5c2f2a603420010cc06200241b0c4006a200a420042fabaabb1878ad401420010cc0620024180c2006a200c420042f7f281baccf19c03420010cc06200241d0c2006a2018420042edd39cadab84b215420010cc06200241a0c3006a201d420042d9e2cbb5c2f2a603420010cc06200241f0c3006a2020420042fabaabb1878ad401420010cc06200241c0c4006a200a420042d2808e80cce8f301420010cc0620024190c2006a200c420042ffdb95eed98d9001420010cc06200241e0c2006a2018420042d9e2cbb5c2f2a603420010cc06200241b0c3006a201d420042fabaabb1878ad401420010cc0620024180c4006a2020420042d2808e80cce8f301420010cc06200241d0c4006a200a420042f7f281baccf19c03420010cc06200241d0c8006a41c8006a2225201220137d42f0ffffffffffff3f7c220c42ffffffffffffff0383201020117d42f0ffffffffffff3f7c22184233887c370300200241d0c8006a41c0006a2226201842ffffffffffffff0383200b200f7d42f0ffffffffffff3f7c22184233887c370300200241d0c8006a41386a2227201842ffffffffffffff0383200d200e7d42f0ffffffffffff3f7c22184233887c370300200241d0c8006a41306a2228201842ffffffffffffff0383201420157d42d0fdffffffffff3f7c22184233887c3703002002200c42338842137e201842ffffffffffffff03837c3703f848200241d0c8006a41f0006a22292003290300370300200241d0c8006a41e8006a222a2005290300370300200241d0c8006a41e0006a222b2006290300370300200241d0c8006a41d8006a222c2007290300370300200220022903884c3703a049200241d0c8006a4188016a222d20022903c042221320022903f0417c220c2002290390437c221820022903e0437c221d20022903b0447c222020022903b042221420022903e0417c220a2002290380437c220b20022903d0437c220d20022903a0447c220e20022903a042221520022903d0417c220f20022903f0427c221020022903c0437c22112002290390447c2212423388200241a0c2006a41086a290300200241d0c1006a41086a2903007c200f201554ad7c200241f0c2006a41086a2903007c2010200f54ad7c200241c0c3006a41086a2903007c2011201054ad7c20024190c4006a41086a2903007c2012201154ad7c420d86847c220f423388200241b0c2006a41086a290300200241e0c1006a41086a2903007c200a201454ad7c20024180c3006a41086a2903007c200b200a54ad7c200241d0c3006a41086a2903007c200d200b54ad7c200241a0c4006a41086a2903007c200e200d54ad7c200f200e54ad7c420d86847c220a42ffffffffffffff0383370300200241d0c8006a4190016a222e20022903d04222112002290380427c220b20022903a0437c220d20022903f0437c220e20022903c0447c2210200a423388200241c0c2006a41086a290300200241f0c1006a41086a2903007c200c201354ad7c20024190c3006a41086a2903007c2018200c54ad7c200241e0c3006a41086a2903007c201d201854ad7c200241b0c4006a41086a2903007c2020201d54ad7c200a202054ad7c420d86847c220c42ffffffffffffff0383370300200241d0c8006a4198016a222f20022903e04222132002290390427c221820022903b0437c221d2002290380447c222020022903d0447c220a200c423388200241d0c2006a41086a29030020024180c2006a41086a2903007c200b201154ad7c200241a0c3006a41086a2903007c200d200b54ad7c200241f0c3006a41086a2903007c200e200d54ad7c200241c0c4006a41086a2903007c2010200e54ad7c200c201054ad7c420d86847c220c42ffffffffffffff0383370300200241d0c8006a4180016a2230200c423388200241e0c2006a41086a29030020024190c2006a41086a2903007c2018201354ad7c200241b0c3006a41086a2903007c201d201854ad7c20024180c4006a41086a2903007c2020201d54ad7c200241d0c4006a41086a2903007c200a202054ad7c200c200a54ad7c420d868442137e201242ffffffffffffff03837c220c423388200f42ffffffffffffff03837c3703002002200c42ffffffffffffff03833703c849200241f0c9006a41206a2231200241c8c5006a41c8006a2232290300370300200241f0c9006a41186a2233200241c8c5006a41c0006a22342903002220370300200241f0c9006a41106a2235200241c8c5006a41386a2236290300221d370300200241f0c9006a41086a2237200241c8c5006a41306a22382903002218370300200220022903f045220c3703f0492002200c20022903c8457c220c3703f0492037201820022903d0457c22183703002035201d20022903d8457c221d3703002033202020022903e0457c22203703002031203129030020022903e8457c220a3703002009290300211a200829030021162004290300210e2024290300210b203829030021132036290300211220022903d048210d20022903d045211420022903d845211520022903c845211020022903f0452111200241a03d6a203229030020022903e8457d42f0ffffffffffff3f7c221942ffffffffffffff0383203429030020022903e0457d42f0ffffffffffff3f7c221b4233887c220f42002027290300221742137e221e420010cc06200241b03e6a201942338842137e201120107d42d0fdffffffffff3f7c221f42ffffffffffffff03837c2210420020282903002211420010cc06200241e03c6a201b42ffffffffffffff0383201220157d42f0ffffffffffff3f7c22154233887c221242002026290300221b42137e221c420010cc06200241a03c6a201542ffffffffffffff0383201320147d42f0ffffffffffff3f7c22144233887c221342002025290300222142137e2219420010cc06200241e03b6a201442ffffffffffffff0383201f4233887c2214420020022903f8482215420010cc06200241f03d6a200f4200201142137e420010cc06200241f03b6a201542002010420010cc06200241b03d6a20124200201e420010cc06200241f03c6a20134200201c420010cc06200241b03c6a201442002019420010cc06200241d03c6a200f4200201c420010cc06200241e03d6a201042002017420010cc06200241903c6a201242002019420010cc06200241d03b6a201342002015420010cc06200241a03e6a201442002011420010cc06200241803c6a200f42002019420010cc06200241903d6a20104200201b420010cc06200241c03b6a201242002015420010cc06200241903e6a201342002011420010cc06200241d03d6a201442002017420010cc06200241b03b6a200f42002015420010cc06200241c03c6a201042002021420010cc06200241803e6a201242002011420010cc06200241c03d6a201342002017420010cc06200241803d6a20144200201b420010cc06200241a03b6a20022903c046220f420020302903002210420010cc06200241c03a6a200241c8c5006a4198016a29030022114200202d290300221742137e221e420010cc06200241f0396a200241c8c5006a4190016a29030022124200202e290300221b42137e221c420010cc06200241a0396a200241c8c5006a4188016a29030022134200202f290300221f42137e2219420010cc06200241d0386a200241c8c5006a4180016a2903002214420020022903c8492215420010cc06200241e03a6a20154200200f420010cc06200241d03a6a20114200201042137e420010cc06200241803a6a20124200201e420010cc06200241b0396a20134200201c420010cc06200241e0386a201442002019420010cc06200241903b6a200f42002017420010cc06200241b03a6a20114200201c420010cc06200241e0396a201242002019420010cc0620024190396a201342002015420010cc06200241c0386a201442002010420010cc06200241803b6a200f4200201b420010cc06200241a03a6a201142002019420010cc06200241d0396a201242002015420010cc0620024180396a201342002010420010cc06200241b0386a201442002017420010cc06200241f03a6a200f4200201f420010cc06200241903a6a201142002015420010cc06200241c0396a201242002010420010cc06200241f0386a201342002017420010cc06200241a0386a20144200201b420010cc06200220022903d03c221f20022903e03d7c220f20022903903c7c221020022903d03b7c221120022903a03e7c221220022903a03d222120022903b03e7c221320022903e03c7c221420022903a03c7c221520022903e03b7c221720022903f03d222220022903f03b7c221920022903b03d7c221b20022903f03c7c221c20022903b03c7c221e423388200241f03d6a41086a290300200241f03b6a41086a2903007c2019202254ad7c200241b03d6a41086a2903007c201b201954ad7c200241f03c6a41086a2903007c201c201b54ad7c200241b03c6a41086a2903007c201e201c54ad7c420d86847c2219423388200241a03d6a41086a290300200241b03e6a41086a2903007c2013202154ad7c200241e03c6a41086a2903007c2014201354ad7c200241a03c6a41086a2903007c2015201454ad7c200241e03b6a41086a2903007c2017201554ad7c2019201754ad7c420d86847c221342ffffffffffffff03833703a84a200220022903803c221c20022903903d7c221420022903c03b7c221520022903903e7c221720022903d03d7c221b2013423388200241d03c6a41086a290300200241e03d6a41086a2903007c200f201f54ad7c200241903c6a41086a2903007c2010200f54ad7c200241d03b6a41086a2903007c2011201054ad7c200241a03e6a41086a2903007c2012201154ad7c2013201254ad7c420d86847c220f42ffffffffffffff03833703b04a200220022903b03b221f20022903c03c7c221020022903803e7c221120022903c03d7c221220022903803d7c2213200f423388200241803c6a41086a290300200241903d6a41086a2903007c2014201c54ad7c200241c03b6a41086a2903007c2015201454ad7c200241903e6a41086a2903007c2017201554ad7c200241d03d6a41086a2903007c201b201754ad7c200f201b54ad7c420d86847c220f42ffffffffffffff03833703b84a2002200f423388200241b03b6a41086a290300200241c03c6a41086a2903007c2010201f54ad7c200241803e6a41086a2903007c2011201054ad7c200241c03d6a41086a2903007c2012201154ad7c200241803d6a41086a2903007c2013201254ad7c200f201354ad7c420d868442137e201e42ffffffffffffff03837c220f42ffffffffffffff03833703984a2002200f423388201942ffffffffffffff03837c3703a04a200220022903903a223920022903f03a7c220f20022903c0397c221020022903f0387c221120022903a0387c221220022903a03a223a20022903803b7c221320022903d0397c22142002290380397c221520022903b0387c221720022903b03a223b20022903903b7c221920022903e0397c221b2002290390397c221c20022903c0387c221e20022903c03a223c20022903a03b7c221f20022903f0397c222120022903a0397c222220022903d0387c222320022903d03a223d20022903e03a7c223e20022903803a7c223f20022903b0397c224020022903e0387c2241423388200241d03a6a41086a290300200241e03a6a41086a2903007c203e203d54ad7c200241803a6a41086a2903007c203f203e54ad7c200241b0396a41086a2903007c2040203f54ad7c200241e0386a41086a2903007c2041204054ad7c420d86847c223e423388200241c03a6a41086a290300200241a03b6a41086a2903007c201f203c54ad7c200241f0396a41086a2903007c2021201f54ad7c200241a0396a41086a2903007c2022202154ad7c200241d0386a41086a2903007c2023202254ad7c203e202354ad7c420d86847c221f423388200241b03a6a41086a290300200241903b6a41086a2903007c2019203b54ad7c200241e0396a41086a2903007c201b201954ad7c20024190396a41086a2903007c201c201b54ad7c200241c0386a41086a2903007c201e201c54ad7c201f201e54ad7c420d86847c2219423388200241a03a6a41086a290300200241803b6a41086a2903007c2013203a54ad7c200241d0396a41086a2903007c2014201354ad7c20024180396a41086a2903007c2015201454ad7c200241b0386a41086a2903007c2017201554ad7c2019201754ad7c420d86847c221342ffffffffffffff03833703e04a2002201942ffffffffffffff03833703d84a2002201f42ffffffffffffff03833703d04a20022013423388200241903a6a41086a290300200241f03a6a41086a2903007c200f203954ad7c200241c0396a41086a2903007c2010200f54ad7c200241f0386a41086a2903007c2011201054ad7c200241a0386a41086a2903007c2012201154ad7c2013201254ad7c420d868442137e204142ffffffffffffff03837c220f423388203e42ffffffffffffff03837c3703c84a2002200f42ffffffffffffff03833703c04a200241a0356a200229039846220f4200202c2903002210420010cc06200241b0366a200241c8c5006a41f0006a29030022114200202b290300221742137e221e420010cc06200241f0366a200241c8c5006a41e8006a29030022124200202a290300221b42137e221c420010cc06200241b0376a200241c8c5006a41e0006a290300221342002029290300221f42137e2219420010cc06200241e0356a200241c8c5006a41d8006a2903002214420020022903a0492215420010cc0620024190356a20154200200f420010cc06200241a0366a20114200201042137e420010cc06200241e0366a20124200201e420010cc06200241a0376a20134200201c420010cc06200241e0376a201442002019420010cc06200241b0356a200f42002017420010cc06200241c0366a20114200201c420010cc0620024180376a201242002019420010cc06200241f0356a201342002015420010cc06200241f0376a201442002010420010cc06200241c0356a200f4200201b420010cc06200241d0366a201142002019420010cc0620024180366a201242002015420010cc06200241c0376a201342002010420010cc0620024180386a201442002017420010cc06200241d0356a200f4200201f420010cc0620024190366a201142002015420010cc0620024190376a201242002010420010cc06200241d0376a201342002017420010cc0620024190386a20144200201b420010cc06200241b0c1006a200c4200200b420010cc06200241e0c0006a200a4200200e42137e2211420010cc0620024190c0006a20204200201642137e2210420010cc06200241c03f6a201d4200201a42137e220f420010cc06200241d03e6a20184200200d420010cc06200241c03e6a200d4200200c420010cc06200241c0c1006a200a4200200b42137e420010cc06200241f0c0006a202042002011420010cc06200241a0c0006a201d42002010420010cc06200241d03f6a20184200200f420010cc06200241d0c0006a200c4200200e420010cc0620024180c0006a200a42002010420010cc06200241b03f6a20204200200f420010cc06200241e03e6a201d4200200d420010cc06200241a0c1006a20184200200b420010cc06200241f03f6a200c42002016420010cc06200241a03f6a200a4200200f420010cc06200241f03e6a20204200200d420010cc0620024190c1006a201d4200200b420010cc06200241c0c0006a20184200200e420010cc06200241903f6a200c4200201a420010cc06200241803f6a200a4200200d420010cc0620024180c1006a20204200200b420010cc06200241b0c0006a201d4200200e420010cc06200241e03f6a201842002016420010cc062002200229039036221c20022903d0357c220c2002290390377c221820022903d0377c221d2002290390387c222020022903d036221e20022903c0357c220a2002290380367c220b20022903c0377c220d2002290380387c220e20022903c036221f20022903b0357c220f2002290380377c221020022903f0357c221120022903f0377c221220022903b036222120022903a0357c221320022903f0367c221420022903b0377c221520022903e0357c221620022903a03622222002290390357c221720022903e0367c221920022903a0377c221a20022903e0377c221b423388200241a0366a41086a29030020024190356a41086a2903007c2017202254ad7c200241e0366a41086a2903007c2019201754ad7c200241a0376a41086a2903007c201a201954ad7c200241e0376a41086a2903007c201b201a54ad7c420d86847c2217423388200241b0366a41086a290300200241a0356a41086a2903007c2013202154ad7c200241f0366a41086a2903007c2014201354ad7c200241b0376a41086a2903007c2015201454ad7c200241e0356a41086a2903007c2016201554ad7c2017201654ad7c420d86847c2213423388200241c0366a41086a290300200241b0356a41086a2903007c200f201f54ad7c20024180376a41086a2903007c2010200f54ad7c200241f0356a41086a2903007c2011201054ad7c200241f0376a41086a2903007c2012201154ad7c2013201254ad7c420d86847c220f423388200241d0366a41086a290300200241c0356a41086a2903007c200a201e54ad7c20024180366a41086a2903007c200b200a54ad7c200241c0376a41086a2903007c200d200b54ad7c20024180386a41086a2903007c200e200d54ad7c200f200e54ad7c420d86847c220a42338820024190366a41086a290300200241d0356a41086a2903007c200c201c54ad7c20024190376a41086a2903007c2018200c54ad7c200241d0376a41086a2903007c201d201854ad7c20024190386a41086a2903007c2020201d54ad7c200a202054ad7c420d868442137e201b42ffffffffffffff03837c221842ffffffffffffff0383220c3703e84a20022018423388201742ffffffffffffff03837c22183703f04a2002200a42ffffffffffffff0383221d3703884b2002200f42ffffffffffffff038322203703804b2002201342ffffffffffffff0383220a3703f84a20024190cb006a41086a2231201820187c37030020024190cb006a41106a2224200a200a7c37030020024190cb006a41186a2225202020207c37030020024190cb006a41206a2226201d201d7c3703002002200c200c7c3703904b20022903a04a211c20022903a84a211e20022903b04a211f20022903b84a212120022903984a2122200220022903803f222320022903903f7c220c2002290380417c221820022903b0407c221d20022903e03f7c222020022903a03f223e20022903f03f7c220a20022903f03e7c220b2002290390417c220d20022903c0407c220e200229038040223f20022903d0407c220f20022903b03f7c221020022903e03e7c221120022903a0417c221220022903e040224020022903b0417c22132002290390407c221420022903c03f7c221520022903d03e7c221620022903c041224120022903c03e7c221720022903f0407c221920022903a0407c221a20022903d03f7c221b423388200241c0c1006a41086a290300200241c03e6a41086a2903007c2017204154ad7c200241f0c0006a41086a2903007c2019201754ad7c200241a0c0006a41086a2903007c201a201954ad7c200241d03f6a41086a2903007c201b201a54ad7c420d86847c2217423388200241e0c0006a41086a290300200241b0c1006a41086a2903007c2013204054ad7c20024190c0006a41086a2903007c2014201354ad7c200241c03f6a41086a2903007c2015201454ad7c200241d03e6a41086a2903007c2016201554ad7c2017201654ad7c420d86847c221342338820024180c0006a41086a290300200241d0c0006a41086a2903007c200f203f54ad7c200241b03f6a41086a2903007c2010200f54ad7c200241e03e6a41086a2903007c2011201054ad7c200241a0c1006a41086a2903007c2012201154ad7c2013201254ad7c420d86847c220f423388200241a03f6a41086a290300200241f03f6a41086a2903007c200a203e54ad7c200241f03e6a41086a2903007c200b200a54ad7c20024190c1006a41086a2903007c200d200b54ad7c200241c0c0006a41086a2903007c200e200d54ad7c200f200e54ad7c420d86847c220a423388200241803f6a41086a290300200241903f6a41086a2903007c200c202354ad7c20024180c1006a41086a2903007c2018200c54ad7c200241b0c0006a41086a2903007c201d201854ad7c200241e03f6a41086a2903007c2020201d54ad7c200a202054ad7c420d868442137e201b42ffffffffffffff03837c220c423388201742ffffffffffffff03837c22203703e84b2002200c42ffffffffffffff0383220b3703e04b2002200a42ffffffffffffff0383220d3703804c2002200f42ffffffffffffff0383220e3703f84b2002201342ffffffffffffff0383220f3703f04b2002200b20022903984a7c3703e04b2002202020022903a04a7c3703e84b2002200f20022903a84a7c3703f04b2002200e20022903b04a7c3703f84b2002200d20022903b84a7c3703804c2003202629030037030020052025290300220a37030020062024290300221d370300200720312903002218370300200220022903904b220c3703884c2002200c20022903c04a7c220c3703884c2007201820022903c84a7c22183703002006201d20022903d04a7c221d3703002005200a20022903d84a7c220a3703002003200329030020022903e04a7c2214370300200241e0276a200d20217d42f0ffffffffffff3f7c221042338842137e200b20227d42d0fdffffffffff3f7c221142ffffffffffffff03837c220d4200203129030020022903c84a7d42f0ffffffffffff3f7c221242ffffffffffffff038320022903904b20022903c04a7d42d0fdffffffffff3f7c22134233887c220b420010cc06200241f0336a201042ffffffffffffff0383200e201f7d42f0ffffffffffff3f7c22104233887c220e4200202429030020022903d04a7d42f0ffffffffffff3f7c221542ffffffffffffff038320124233887c221642137e221a420010cc06200241f0326a201042ffffffffffffff0383200f201e7d42f0ffffffffffff3f7c22104233887c220f4200202529030020022903d84a7d42f0ffffffffffff3f7c221242ffffffffffffff038320154233887c221942137e2217420010cc0620024180326a201042ffffffffffffff03832020201c7d42f0ffffffffffff3f7c22204233887c22104200202629030020022903e04a7d42f0ffffffffffff3f7c221b42ffffffffffffff038320124233887c221e42137e2215420010cc06200241c0266a202042ffffffffffffff038320114233887c22114200201b42338842137e201342ffffffffffffff03837c2220420010cc06200241f0276a20204200200d420010cc0620024180356a200e4200200b42137e2222420010cc0620024180346a200f4200201a420010cc0620024180336a201042002017420010cc06200241d0266a201142002015420010cc06200241d0276a200d42002016420010cc06200241e0326a200e42002017420010cc06200241f0316a200f42002015420010cc0620024180316a201042002020420010cc06200241b0266a20114200200b420010cc06200241c0276a200d42002019420010cc06200241e0316a200e42002015420010cc06200241f0306a200f42002020420010cc06200241e0346a20104200200b420010cc0620024180256a201142002016420010cc06200241b0276a200d4200201e420010cc06200241e0306a200e42002020420010cc06200241d0346a200f4200200b420010cc06200241c0336a201042002016420010cc06200241d0236a201142002019420010cc06200241a02b6a20022903e04b221242002018420010cc06200241f02c6a20022903804c223e4200201d42137e2223420010cc06200241f02d6a20022903f84b22214200200a42137e221f420010cc06200241f02e6a20022903f04b221b4200201442137e221c420010cc06200241f02f6a20022903e84b22134200200c420010cc06200241902b6a200c42002012420010cc06200241802d6a203e4200201842137e420010cc06200241802e6a202142002023420010cc06200241802f6a201b4200201f420010cc0620024180306a20134200201c420010cc06200241b02b6a20124200201d420010cc06200241e02c6a203e4200201f420010cc06200241e02d6a20214200201c420010cc06200241e02e6a201b4200200c420010cc06200241e02f6a201342002018420010cc06200241c02b6a20124200200a420010cc06200241d02c6a203e4200201c420010cc06200241d02d6a20214200200c420010cc06200241d02e6a201b42002018420010cc06200241d02f6a20134200201d420010cc06200241d02b6a201242002014420010cc06200241c02c6a203e4200200c420010cc06200241c02d6a202142002018420010cc06200241c02e6a201b4200201d420010cc06200241c02f6a20134200200a420010cc06200241c0346a200c4200200b420010cc06200241d0336a20144200201a420010cc06200241c0326a200a42002017420010cc06200241c0316a201d42002015420010cc06200241c0306a201842002020420010cc06200241d0306a20204200200c420010cc06200241f0346a201442002022420010cc06200241e0336a200a4200201a420010cc06200241d0326a201d42002017420010cc06200241d0316a201842002015420010cc06200241b0336a200c42002016420010cc06200241b0326a201442002017420010cc06200241b0316a200a42002015420010cc06200241b0306a201d42002020420010cc06200241b0346a20184200200b420010cc06200241a0326a200c42002019420010cc06200241a0316a201442002015420010cc06200241a0306a200a42002020420010cc06200241a0346a201d4200200b420010cc06200241a0336a201842002016420010cc0620024190316a200c4200201e420010cc0620024190306a201442002020420010cc0620024190346a200a4200200b420010cc0620024190336a201d42002016420010cc0620024190326a201842002019420010cc06200241c0226a20022903e030223b20022903b0277c220c20022903d0347c221d20022903c0337c222020022903d0237c220a20022903e031223920022903c0277c221820022903f0307c220b20022903e0347c22142002290380257c221520022903e032223a20022903d0277c221620022903f0317c22172002290380317c221920022903b0267c221a20022903f033223c20022903e0277c221c20022903f0327c221e2002290380327c221f20022903c0267c2222200229038035223d20022903f0277c22232002290380347c223f2002290380337c224020022903d0267c224142338820024180356a41086a290300200241f0276a41086a2903007c2023203d54ad7c20024180346a41086a2903007c203f202354ad7c20024180336a41086a2903007c2040203f54ad7c200241d0266a41086a2903007c2041204054ad7c420d86847c2223423388200241f0336a41086a290300200241e0276a41086a2903007c201c203c54ad7c200241f0326a41086a2903007c201e201c54ad7c20024180326a41086a2903007c201f201e54ad7c200241c0266a41086a2903007c2022201f54ad7c2023202254ad7c420d86847c221e423388200241e0326a41086a290300200241d0276a41086a2903007c2016203a54ad7c200241f0316a41086a2903007c2017201654ad7c20024180316a41086a2903007c2019201754ad7c200241b0266a41086a2903007c201a201954ad7c201e201a54ad7c420d86847c2216423388200241e0316a41086a290300200241c0276a41086a2903007c2018203954ad7c200241f0306a41086a2903007c200b201854ad7c200241e0346a41086a2903007c2014200b54ad7c20024180256a41086a2903007c2015201454ad7c2016201554ad7c420d86847c220b42ffffffffffffff03832218420020022903e02c223c20022903b02b7c221420022903e02d7c221520022903e02e7c221720022903e02f7c221920022903f02c223d20022903a02b7c221a20022903f02d7c221c20022903f02e7c221f20022903f02f7c222220022903802d224220022903902b7c223f20022903802e7c224020022903802f7c22392002290380307c223a423388200241802d6a41086a290300200241902b6a41086a2903007c203f204254ad7c200241802e6a41086a2903007c2040203f54ad7c200241802f6a41086a2903007c2039204054ad7c20024180306a41086a2903007c203a203954ad7c420d86847c223f423388200241f02c6a41086a290300200241a02b6a41086a2903007c201a203d54ad7c200241f02d6a41086a2903007c201c201a54ad7c200241f02e6a41086a2903007c201f201c54ad7c200241f02f6a41086a2903007c2022201f54ad7c203f202254ad7c420d86847c221a42ffffffffffffff0383222242137e2239420010cc06200241f0206a200b423388200241e0306a41086a290300200241b0276a41086a2903007c200c203b54ad7c200241d0346a41086a2903007c201d200c54ad7c200241c0336a41086a2903007c2020201d54ad7c200241d0236a41086a2903007c200a202054ad7c200b200a54ad7c420d868442137e204142ffffffffffffff03837c223b42ffffffffffffff0383221d420020022903c02c223d20022903d02b7c220c20022903c02d7c222020022903c02e7c220a20022903c02f7c220b20022903d02c224220022903c02b7c221c20022903d02d7c221f20022903d02e7c224020022903d02f7c2241201a423388200241e02c6a41086a290300200241b02b6a41086a2903007c2014203c54ad7c200241e02d6a41086a2903007c2015201454ad7c200241e02e6a41086a2903007c2017201554ad7c200241e02f6a41086a2903007c2019201754ad7c201a201954ad7c420d86847c2214423388200241d02c6a41086a290300200241c02b6a41086a2903007c201c204254ad7c200241d02d6a41086a2903007c201f201c54ad7c200241d02e6a41086a2903007c2040201f54ad7c200241d02f6a41086a2903007c2041204054ad7c2014204154ad7c420d86847c2215423388200241c02c6a41086a290300200241d02b6a41086a2903007c200c203d54ad7c200241c02d6a41086a2903007c2020200c54ad7c200241c02e6a41086a2903007c200a202054ad7c200241c02f6a41086a2903007c200b200a54ad7c2015200b54ad7c420d868442137e203a42ffffffffffffff03837c2217423388203f42ffffffffffffff03837c221c420010cc06200241f0236a201642ffffffffffffff038322204200201442ffffffffffffff0383223f42137e2214420010cc06200241a0256a201e42ffffffffffffff0383220a4200201542ffffffffffffff0383224142137e220c420010cc0620024190226a203b423388202342ffffffffffffff03837c220b4200201742ffffffffffffff0383221e420010cc06200241b0226a20184200201c42137e420010cc0620024180216a201e4200201d420010cc06200241e0236a202042002039420010cc0620024190256a200a42002014420010cc06200241a0226a200b4200200c420010cc06200241d0226a201842002014420010cc06200241e0206a201d42002022420010cc0620024180246a20204200200c420010cc06200241b0256a200a4200201e420010cc0620024180226a200b4200201c420010cc06200241e0226a20184200200c420010cc06200241d0206a201d4200203f420010cc0620024190246a20204200201e420010cc06200241c0256a200a4200201c420010cc06200241f0216a200b42002022420010cc06200241f0226a20184200201e420010cc06200241c0206a201d42002041420010cc06200241a0246a20204200201c420010cc06200241d0256a200a42002022420010cc06200241e0216a200b4200203f420010cc0620024190286a20022903903022432002290390317c220c2002290390347c22142002290390337c22152002290390327c221620022903a031224420022903a0327c221720022903a0307c221920022903a0347c221a20022903a0337c221f20022903b032224520022903b0337c222320022903b0317c224020022903b0307c223920022903b0347c223a20022903d033224620022903c0347c223b20022903c0327c223c20022903c0317c223d20022903c0307c224220022903f034224720022903d0307c224820022903e0337c224920022903d0327c224a20022903d0317c224b423388200241f0346a41086a290300200241d0306a41086a2903007c2048204754ad7c200241e0336a41086a2903007c2049204854ad7c200241d0326a41086a2903007c204a204954ad7c200241d0316a41086a2903007c204b204a54ad7c420d86847c2248423388200241d0336a41086a290300200241c0346a41086a2903007c203b204654ad7c200241c0326a41086a2903007c203c203b54ad7c200241c0316a41086a2903007c203d203c54ad7c200241c0306a41086a2903007c2042203d54ad7c2048204254ad7c420d86847c223b423388200241b0326a41086a290300200241b0336a41086a2903007c2023204554ad7c200241b0316a41086a2903007c2040202354ad7c200241b0306a41086a2903007c2039204054ad7c200241b0346a41086a2903007c203a203954ad7c203b203a54ad7c420d86847c2223423388200241a0316a41086a290300200241a0326a41086a2903007c2017204454ad7c200241a0306a41086a2903007c2019201754ad7c200241a0346a41086a2903007c201a201954ad7c200241a0336a41086a2903007c201f201a54ad7c2023201f54ad7c420d86847c221742338820024190306a41086a29030020024190316a41086a2903007c200c204354ad7c20024190346a41086a2903007c2014200c54ad7c20024190336a41086a2903007c2015201454ad7c20024190326a41086a2903007c2016201554ad7c2017201654ad7c420d868442137e204b42ffffffffffffff03837c221442ffffffffffffff0383224a201e7c220c42002014423388204842ffffffffffffff03837c224b42f0ffffffffffff3f7c224c201c7d221642ffffffffffffff0383204a42d0fdffffffffff3f7c224d201e7d221a4233887c2214420010cc06200241902a6a201742ffffffffffffff0383224320417c22154200203b42ffffffffffffff0383224442f0ffffffffffff3f7c224e20227d221742ffffffffffffff038320164233887c221f42137e223a420010cc06200241e02a6a202342ffffffffffffff03832245203f7c22164200204542f0ffffffffffff3f7c224f203f7d221942ffffffffffffff038320174233887c224042137e2239420010cc06200241c02a6a204420227c22174200204342f0ffffffffffff3f7c225020417d223b42ffffffffffffff038320194233887c223c42137e2223420010cc0620024180296a204b201c7c22194200203b42338842137e201a42ffffffffffffff03837c221a420010cc0620024180286a201a4200200c420010cc06200241c0296a20154200201442137e420010cc06200241a02a6a20164200203a420010cc06200241b02a6a201742002039420010cc06200241d0296a201942002023420010cc06200241d02a6a201542002039420010cc06200241a0286a200c4200201f420010cc06200241f02a6a201642002023420010cc06200241f0286a20174200201a420010cc06200241b0296a201942002014420010cc06200241802b6a201542002023420010cc06200241b0286a200c42002040420010cc06200241e0286a20164200201a420010cc06200241a0296a201742002014420010cc06200241e0296a20194200201f420010cc06200241c0286a200c4200203c420010cc06200241d0286a20154200201a420010cc0620024190296a201642002014420010cc06200241802a6a20174200201f420010cc06200241f0296a201942002040420010cc06200220223703a04b2002203f3703a84b200220413703b04b2002201e3703904b2002201c3703984b200220022903d022223b20022903e0207c220c2002290380247c221420022903b0257c22152002290380227c221620022903c022223c20022903f0207c221720022903f0237c221920022903a0257c221a2002290390227c221f20022903b022223d2002290380217c222320022903e0237c22402002290390257c223920022903a0227c223a423388200241b0226a41086a29030020024180216a41086a2903007c2023203d54ad7c200241e0236a41086a2903007c2040202354ad7c20024190256a41086a2903007c2039204054ad7c200241a0226a41086a2903007c203a203954ad7c420d86847c2223423388200241c0226a41086a290300200241f0206a41086a2903007c2017203c54ad7c200241f0236a41086a2903007c2019201754ad7c200241a0256a41086a2903007c201a201954ad7c20024190226a41086a2903007c201f201a54ad7c2023201f54ad7c420d86847c221742ffffffffffffff03833703f04b200220022903e022223920022903d0207c22192002290390247c221a20022903c0257c221f20022903f0217c22402017423388200241d0226a41086a290300200241e0206a41086a2903007c200c203b54ad7c20024180246a41086a2903007c2014200c54ad7c200241b0256a41086a2903007c2015201454ad7c20024180226a41086a2903007c2016201554ad7c2017201654ad7c420d86847c220c42ffffffffffffff03833703f84b200220022903f022223b20022903c0207c221420022903a0247c221520022903d0257c221620022903e0217c2217200c423388200241e0226a41086a290300200241d0206a41086a2903007c2019203954ad7c20024190246a41086a2903007c201a201954ad7c200241c0256a41086a2903007c201f201a54ad7c200241f0216a41086a2903007c2040201f54ad7c200c204054ad7c420d86847c220c42ffffffffffffff03833703804c2002200c423388200241f0226a41086a290300200241c0206a41086a2903007c2014203b54ad7c200241a0246a41086a2903007c2015201454ad7c200241d0256a41086a2903007c2016201554ad7c200241e0216a41086a2903007c2017201654ad7c200c201754ad7c420d868442137e203a42ffffffffffffff03837c220c42ffffffffffffff03833703e04b2002200c423388202342ffffffffffffff03837c3703e84b20024190286a41086a2903002151200241902a6a41086a2903002152200229039028214920022903902a210c200241e02a6a41086a290300215320022903e02a2146200241c02a6a41086a290300215420022903c02a214720024180296a41086a2903002155200229038029215620024180286a41086a2903002157200241c0296a41086a2903002158200229038028215920022903c0292114200241a02a6a41086a290300215a20022903a02a215b200241b02a6a41086a290300215c20022903b02a215d200241d0296a41086a290300215e20022903d029215f20022903d02a211520022903a028213c20022903f02a213d20022903f028214220022903b0292148200241d02a6a41086a2903002160200241a0286a41086a2903002161200241f02a6a41086a2903002162200241f0286a41086a2903002163200241b0296a41086a290300216420022903802b211620022903b028214020022903e028213920022903a029213a20022903e029213b200241802b6a41086a2903002165200241b0286a41086a2903002166200241e0286a41086a2903002167200241a0296a41086a2903002168200241e0296a41086a290300216920022903c028211920022903d0282117200229039029211a20022903802a211f20022903f0292123200241c0286a41086a290300216a200241d0286a41086a290300216b20024190296a41086a290300216c200241802a6a41086a290300216d200241f0296a41086a290300216e200241c8c5006a200241e0cb006a41011067200241d01f6a2023201f201a201720197c22197c221a7c221f7c2223203b203a2039201620407c22407c22397c223a7c223b20482042203d2015203c7c223c7c223d7c22427c2248205620472046200c20497c22497c22467c22477c2256205f205d205b201420597c22597c225b7c225d7c225f423388205e205c205a205820577c2059201454ad7c7c205b205954ad7c7c205d205b54ad7c7c205f205d54ad7c420d86847c2214423388205520542053205220517c2049200c54ad7c7c2046204954ad7c7c2047204654ad7c7c2056204754ad7c2014205654ad7c420d86847c2249423388206420632062206020617c203c201554ad7c7c203d203c54ad7c7c2042203d54ad7c7c2048204254ad7c2049204854ad7c420d86847c223c423388206920682067206520667c2040201654ad7c7c2039204054ad7c7c203a203954ad7c7c203b203a54ad7c203c203b54ad7c420d86847c2216423388206e206d206c206b206a7c2019201754ad7c7c201a201954ad7c7c201f201a54ad7c7c2023201f54ad7c2016202354ad7c420d868442137e205f42ffffffffffffff03837c223a42ffffffffffffff0383220c420020022903d0452215420010cc06200241801f6a201642ffffffffffffff03832240420020022903d845221742137e223b420010cc06200241b01e6a203c42ffffffffffffff03832223420020022903e045221a42137e2239420010cc06200241e01d6a204942ffffffffffffff0383221f420020022903e845223c42137e2219420010cc06200241f01c6a203a423388201442ffffffffffffff03837c2214420020022903c8452216420010cc06200241e01c6a20164200200c420010cc06200241e01f6a20404200201542137e420010cc06200241901f6a20234200203b420010cc06200241c01e6a201f42002039420010cc06200241f01d6a201442002019420010cc06200241f01e6a200c42002017420010cc06200241a01e6a204042002039420010cc06200241d01d6a202342002019420010cc06200241801d6a201f42002016420010cc06200241c01f6a201442002015420010cc06200241901e6a200c4200201a420010cc06200241c01d6a204042002019420010cc06200241901d6a202342002016420010cc06200241b01f6a201f42002015420010cc06200241e01e6a201442002017420010cc06200241b01d6a200c4200203c420010cc06200241a01d6a204042002016420010cc06200241a01f6a202342002015420010cc06200241d01e6a201f42002017420010cc06200241801e6a20144200201a420010cc06200220022903a01e224920022903f01e7c221520022903d01d7c221620022903801d7c221720022903c01f7c221920022903801f224620022903d01f7c221a20022903b01e7c223920022903e01d7c223a20022903f01c7c223b20022903e01f224720022903e01c7c223c20022903901f7c223d20022903c01e7c224220022903f01d7c2248423388200241e01f6a41086a290300200241e01c6a41086a2903007c203c204754ad7c200241901f6a41086a2903007c203d203c54ad7c200241c01e6a41086a2903007c2042203d54ad7c200241f01d6a41086a2903007c2048204254ad7c420d86847c223c423388200241801f6a41086a290300200241d01f6a41086a2903007c201a204654ad7c200241b01e6a41086a2903007c2039201a54ad7c200241e01d6a41086a2903007c203a203954ad7c200241f01c6a41086a2903007c203b203a54ad7c203c203b54ad7c420d86847c221a42ffffffffffffff03833703984c200220022903c01d224220022903901e7c223920022903901d7c223a20022903b01f7c223b20022903e01e7c223d201a423388200241a01e6a41086a290300200241f01e6a41086a2903007c2015204954ad7c200241d01d6a41086a2903007c2016201554ad7c200241801d6a41086a2903007c2017201654ad7c200241c01f6a41086a2903007c2019201754ad7c201a201954ad7c420d86847c221542ffffffffffffff03833703a04c200220022903a01d224920022903b01d7c221620022903a01f7c221720022903d01e7c221920022903801e7c221a2015423388200241c01d6a41086a290300200241901e6a41086a2903007c2039204254ad7c200241901d6a41086a2903007c203a203954ad7c200241b01f6a41086a2903007c203b203a54ad7c200241e01e6a41086a2903007c203d203b54ad7c2015203d54ad7c420d86847c221542ffffffffffffff03833703a84c20022015423388200241a01d6a41086a290300200241b01d6a41086a2903007c2016204954ad7c200241a01f6a41086a2903007c2017201654ad7c200241d01e6a41086a2903007c2019201754ad7c200241801e6a41086a2903007c201a201954ad7c2015201a54ad7c420d868442137e204842ffffffffffffff03837c221542ffffffffffffff03833703884c20022015423388203c42ffffffffffffff03837c3703904c200241b0c7006a41106a22034200370300200241b0c7006a41186a22054200370300200241b0c7006a41206a4200370300200242003703b847200242013703b047200241d0c8006a200241b0c7006a20024188cc006a1068200241f0116a20022903d8482215420020022903e84b2239420010cc0620024180156a200241d0c8006a41286a2903002216420020022903f04b223b42137e2248420010cc06200241a0166a20092903002217420020022903f84b223d42137e2242420010cc06200241c0176a20082903002219420020022903804c224942137e223c420010cc06200241e0186a2004290300221a420020022903e04b223a420010cc0620024180126a203a42002015420010cc0620024190156a20164200203942137e420010cc06200241b0166a201742002048420010cc06200241d0176a201942002042420010cc06200241f0186a201a4200203c420010cc06200241e0116a20154200203b420010cc06200241f0146a201642002042420010cc0620024190166a20174200203c420010cc06200241b0176a20194200203a420010cc06200241d0186a201a42002039420010cc06200241d0116a20154200203d420010cc06200241e0146a20164200203c420010cc0620024180166a20174200203a420010cc06200241a0176a201942002039420010cc06200241c0186a201a4200203b420010cc06200241c0116a201542002049420010cc06200241d0146a20164200203a420010cc06200241f0156a201742002039420010cc0620024190176a20194200203b420010cc06200241b0186a201a4200203d420010cc0620024190276a200d42002013420010cc06200241902e6a200e4200201b42137e223b420010cc06200241a02d6a200f4200202142137e223a420010cc06200241b02c6a20104200203e42137e2239420010cc0620024180106a201142002012420010cc06200241a0276a20124200200d420010cc06200241902f6a200e4200201342137e420010cc06200241a02e6a200f4200203b420010cc06200241b02d6a20104200203a420010cc0620024190106a201142002039420010cc0620024180276a200d4200201b420010cc06200241902d6a200e4200203a420010cc06200241a02c6a200f42002039420010cc06200241e02b6a201042002012420010cc06200241f00f6a201142002013420010cc06200241f0266a200d42002021420010cc06200241902c6a200e42002039420010cc06200241f02b6a200f42002012420010cc06200241b02f6a201042002013420010cc06200241900f6a20114200201b420010cc06200241e0266a200d4200203e420010cc06200241802c6a200e42002012420010cc06200241a02f6a200f42002013420010cc06200241b02e6a20104200201b420010cc06200241b00e6a201142002021420010cc06200241b0146a201542002014420010cc06200241d0156a20164200201f42137e220f420010cc06200241f0166a20174200202342137e220e420010cc0620024190186a20194200204042137e220d420010cc06200241b0196a201a4200200c420010cc06200241c0146a200c42002015420010cc06200241e0156a20164200201442137e420010cc0620024180176a20174200200f420010cc06200241a0186a20194200200e420010cc06200241c0196a201a4200200d420010cc06200241a0146a20154200201f420010cc06200241c0156a20164200200e420010cc06200241e0166a20174200200d420010cc0620024180186a20194200200c420010cc06200241a0196a201a42002014420010cc06200241c0136a201542002023420010cc06200241b0156a20164200200d420010cc06200241d0166a20174200200c420010cc06200241f0176a201942002014420010cc0620024190196a201a4200201f420010cc06200241e0126a201542002040420010cc06200241a0156a20164200200c420010cc06200241c0166a201742002014420010cc06200241e0176a20194200201f420010cc0620024180196a201a42002023420010cc06200241a00f6a20022903d014223b20022903c0117c220c20022903f0157c220d2002290390177c220e20022903b0187c221020022903e014223920022903d0117c220f2002290380167c221120022903a0177c221220022903c0187c221320022903f014223a20022903e0117c22142002290390167c221520022903b0177c221620022903d0187c2217200229038015223c20022903f0117c221920022903a0167c221a20022903c0177c221b20022903e0187c221f200229039015223d2002290380127c222120022903b0167c222320022903d0177c223e20022903f0187c224042338820024190156a41086a29030020024180126a41086a2903007c2021203d54ad7c200241b0166a41086a2903007c2023202154ad7c200241d0176a41086a2903007c203e202354ad7c200241f0186a41086a2903007c2040203e54ad7c420d86847c223e42338820024180156a41086a290300200241f0116a41086a2903007c2019203c54ad7c200241a0166a41086a2903007c201a201954ad7c200241c0176a41086a2903007c201b201a54ad7c200241e0186a41086a2903007c201f201b54ad7c203e201f54ad7c420d86847c2219423388200241f0146a41086a290300200241e0116a41086a2903007c2014203a54ad7c20024190166a41086a2903007c2015201454ad7c200241b0176a41086a2903007c2016201554ad7c200241d0186a41086a2903007c2017201654ad7c2019201754ad7c420d86847c2214423388200241e0146a41086a290300200241d0116a41086a2903007c200f203954ad7c20024180166a41086a2903007c2011200f54ad7c200241a0176a41086a2903007c2012201154ad7c200241c0186a41086a2903007c2013201254ad7c2014201354ad7c420d86847c221142ffffffffffffff0383221b420020022903902d223c2002290380277c221220022903a02c7c221320022903e02b7c221520022903f00f7c221620022903902e223d2002290390277c220f20022903a02d7c221720022903b02c7c221a2002290380107c221f20022903902f224220022903a0277c222120022903a02e7c222320022903b02d7c22392002290390107c223a423388200241902f6a41086a290300200241a0276a41086a2903007c2021204254ad7c200241a02e6a41086a2903007c2023202154ad7c200241b02d6a41086a2903007c2039202354ad7c20024190106a41086a2903007c203a203954ad7c420d86847c2221423388200241902e6a41086a29030020024190276a41086a2903007c200f203d54ad7c200241a02d6a41086a2903007c2017200f54ad7c200241b02c6a41086a2903007c201a201754ad7c20024180106a41086a2903007c201f201a54ad7c2021201f54ad7c420d86847c221742ffffffffffffff0383220f42137e2239420010cc06200241800e6a2011423388200241d0146a41086a290300200241c0116a41086a2903007c200c203b54ad7c200241f0156a41086a2903007c200d200c54ad7c20024190176a41086a2903007c200e200d54ad7c200241b0186a41086a2903007c2010200e54ad7c2011201054ad7c420d868442137e204042ffffffffffffff03837c223b42ffffffffffffff0383221f420020022903802c223d20022903e0267c220c20022903a02f7c220d20022903b02e7c220e20022903b00e7c221020022903902c224220022903f0267c221120022903f02b7c221a20022903b02f7c222320022903900f7c22402017423388200241902d6a41086a29030020024180276a41086a2903007c2012203c54ad7c200241a02c6a41086a2903007c2013201254ad7c200241e02b6a41086a2903007c2015201354ad7c200241f00f6a41086a2903007c2016201554ad7c2017201654ad7c420d86847c2212423388200241902c6a41086a290300200241f0266a41086a2903007c2011204254ad7c200241f02b6a41086a2903007c201a201154ad7c200241b02f6a41086a2903007c2023201a54ad7c200241900f6a41086a2903007c2040202354ad7c2012204054ad7c420d86847c2211423388200241802c6a41086a290300200241e0266a41086a2903007c200c203d54ad7c200241a02f6a41086a2903007c200d200c54ad7c200241b02e6a41086a2903007c200e200d54ad7c200241b00e6a41086a2903007c2010200e54ad7c2011201054ad7c420d868442137e203a42ffffffffffffff03837c220e423388202142ffffffffffffff03837c220d420010cc06200241d00e6a201442ffffffffffffff038322214200201242ffffffffffffff0383221642137e2210420010cc06200241e00c6a201942ffffffffffffff038322234200201142ffffffffffffff0383221942137e220c420010cc06200241b00d6a203b423388203e42ffffffffffffff03837c223e4200200e42ffffffffffffff0383220e420010cc06200241900e6a201b4200200d42137e420010cc06200241c00d6a200e4200201f420010cc06200241b00f6a202142002039420010cc06200241e00e6a202342002010420010cc06200241f00c6a203e4200200c420010cc06200241c00e6a201b42002010420010cc06200241c00f6a201f4200200f420010cc06200241d00c6a20214200200c420010cc06200241a00d6a20234200200e420010cc06200241f00d6a203e4200200d420010cc06200241f00b6a201b4200200c420010cc06200241f00e6a201f42002016420010cc06200241900d6a20214200200e420010cc06200241e00d6a20234200200d420010cc06200241d00f6a203e4200200f420010cc06200241800d6a201b4200200e420010cc06200241a00e6a201f42002019420010cc06200241d00d6a20214200200d420010cc06200241e00f6a20234200200f420010cc06200241800f6a203e42002016420010cc06200241800c6a20022903a015225b20022903e0127c220c20022903c0167c221120022903e0177c22122002290380197c221320022903b015225620022903c0137c221020022903d0167c221420022903f0177c22152002290390197c221720022903c015225920022903a0147c221a20022903e0167c22402002290380187c223920022903a0197c223a20022903d015225d20022903b0147c223b20022903f0167c223c2002290390187c223d20022903b0197c224220022903e015225f20022903c0147c22482002290380177c224920022903a0187c224620022903c0197c2247423388200241e0156a41086a290300200241c0146a41086a2903007c2048205f54ad7c20024180176a41086a2903007c2049204854ad7c200241a0186a41086a2903007c2046204954ad7c200241c0196a41086a2903007c2047204654ad7c420d86847c2248423388200241d0156a41086a290300200241b0146a41086a2903007c203b205d54ad7c200241f0166a41086a2903007c203c203b54ad7c20024190186a41086a2903007c203d203c54ad7c200241b0196a41086a2903007c2042203d54ad7c2048204254ad7c420d86847c223b423388200241c0156a41086a290300200241a0146a41086a2903007c201a205954ad7c200241e0166a41086a2903007c2040201a54ad7c20024180186a41086a2903007c2039204054ad7c200241a0196a41086a2903007c203a203954ad7c203b203a54ad7c420d86847c221a423388200241b0156a41086a290300200241c0136a41086a2903007c2010205654ad7c200241d0166a41086a2903007c2014201054ad7c200241f0176a41086a2903007c2015201454ad7c20024190196a41086a2903007c2017201554ad7c201a201754ad7c420d86847c221442ffffffffffffff03832210420020022903c00e225d20022903c00f7c221520022903d00c7c224020022903a00d7c223920022903f00d7c223a20022903a00f225f20022903800e7c221720022903d00e7c223c20022903e00c7c223d20022903b00d7c224220022903900e225120022903c00d7c224920022903b00f7c224620022903e00e7c225620022903f00c7c2259423388200241900e6a41086a290300200241c00d6a41086a2903007c2049205154ad7c200241b00f6a41086a2903007c2046204954ad7c200241e00e6a41086a2903007c2056204654ad7c200241f00c6a41086a2903007c2059205654ad7c420d86847c2249423388200241a00f6a41086a290300200241800e6a41086a2903007c2017205f54ad7c200241d00e6a41086a2903007c203c201754ad7c200241e00c6a41086a2903007c203d203c54ad7c200241b00d6a41086a2903007c2042203d54ad7c2049204254ad7c420d86847c223c42ffffffffffffff0383221742137e2256420010cc06200241f00a6a2014423388200241a0156a41086a290300200241e0126a41086a2903007c200c205b54ad7c200241c0166a41086a2903007c2011200c54ad7c200241e0176a41086a2903007c2012201154ad7c20024180196a41086a2903007c2013201254ad7c2014201354ad7c420d868442137e204742ffffffffffffff03837c225b42ffffffffffffff03832211420020022903800d225f20022903a00e7c220c20022903d00d7c221220022903e00f7c221320022903800f7c221420022903f00b225120022903f00e7c223d20022903900d7c224220022903e00d7c224620022903d00f7c2247203c423388200241c00e6a41086a290300200241c00f6a41086a2903007c2015205d54ad7c200241d00c6a41086a2903007c2040201554ad7c200241a00d6a41086a2903007c2039204054ad7c200241f00d6a41086a2903007c203a203954ad7c203c203a54ad7c420d86847c2215423388200241f00b6a41086a290300200241f00e6a41086a2903007c203d205154ad7c200241900d6a41086a2903007c2042203d54ad7c200241e00d6a41086a2903007c2046204254ad7c200241d00f6a41086a2903007c2047204654ad7c2015204754ad7c420d86847c2240423388200241800d6a41086a290300200241a00e6a41086a2903007c200c205f54ad7c200241d00d6a41086a2903007c2012200c54ad7c200241e00f6a41086a2903007c2013201254ad7c200241800f6a41086a2903007c2014201354ad7c2040201454ad7c420d868442137e205942ffffffffffffff03837c223c423388204942ffffffffffffff03837c220c420010cc06200241a00b6a201a42ffffffffffffff038322124200201542ffffffffffffff0383223942137e223a420010cc06200241d0096a203b42ffffffffffffff038322134200204042ffffffffffffff0383224042137e221a420010cc06200241a00a6a205b423388204842ffffffffffffff03837c22144200203c42ffffffffffffff03832215420010cc06200241b00a6a201542002011420010cc06200241800b6a20104200200c42137e420010cc06200241900c6a201242002056420010cc06200241b00b6a20134200203a420010cc06200241e0096a20144200201a420010cc06200241a00c6a201142002017420010cc06200241900b6a20104200203a420010cc06200241c0096a20124200201a420010cc06200241900a6a201342002015420010cc06200241e00a6a20144200200c420010cc06200241c00b6a201142002039420010cc06200241e0086a20104200201a420010cc06200241800a6a201242002015420010cc06200241d00a6a20134200200c420010cc06200241b00c6a201442002017420010cc06200241e00b6a201142002040420010cc06200241f0096a201042002015420010cc06200241c00a6a20124200200c420010cc06200241c00c6a201342002017420010cc06200241d00b6a201442002039420010cc06200241f0086a2019420020022903900b225b20022903a00c7c220c20022903c0097c221520022903900a7c221720022903e00a7c221a20022903800c224920022903f00a7c224020022903a00b7c223920022903d0097c223a20022903a00a7c223b20022903800b224620022903b00a7c223c20022903900c7c223d20022903b00b7c224220022903e0097c2248423388200241800b6a41086a290300200241b00a6a41086a2903007c203c204654ad7c200241900c6a41086a2903007c203d203c54ad7c200241b00b6a41086a2903007c2042203d54ad7c200241e0096a41086a2903007c2048204254ad7c420d86847c223c423388200241800c6a41086a290300200241f00a6a41086a2903007c2040204954ad7c200241a00b6a41086a2903007c2039204054ad7c200241d0096a41086a2903007c203a203954ad7c200241a00a6a41086a2903007c203b203a54ad7c203c203b54ad7c420d86847c223942ffffffffffffff0383224042137e2249420010cc06200241e0076a200e420020022903f009225d20022903e00b7c223a20022903c00a7c223b20022903c00c7c223d20022903d00b7c224220022903e008225f20022903c00b7c224620022903800a7c224720022903d00a7c225620022903b00c7c22592039423388200241900b6a41086a290300200241a00c6a41086a2903007c200c205b54ad7c200241c0096a41086a2903007c2015200c54ad7c200241900a6a41086a2903007c2017201554ad7c200241e00a6a41086a2903007c201a201754ad7c2039201a54ad7c420d86847c220c423388200241e0086a41086a290300200241c00b6a41086a2903007c2046205f54ad7c200241800a6a41086a2903007c2047204654ad7c200241d00a6a41086a2903007c2056204754ad7c200241b00c6a41086a2903007c2059205654ad7c200c205954ad7c420d86847c2215423388200241f0096a41086a290300200241e00b6a41086a2903007c203a205d54ad7c200241c00a6a41086a2903007c203b203a54ad7c200241c00c6a41086a2903007c203d203b54ad7c200241d00b6a41086a2903007c2042203d54ad7c2015204254ad7c420d868442137e204842ffffffffffffff03837c223b423388203c42ffffffffffffff03837c2217420010cc0620024190086a20164200200c42ffffffffffffff0383223a42137e2239420010cc06200241c0066a200f4200201542ffffffffffffff0383224642137e221a420010cc0620024190076a200d4200203b42ffffffffffffff03832215420010cc06200241a0076a20154200200e420010cc06200241f0076a20194200201742137e2263420010cc0620024180096a201642002049420010cc06200241a0086a200f42002039420010cc06200241d0066a200d4200201a420010cc0620024190096a200e42002040420010cc0620024180086a201942002039420010cc06200241b0066a20164200201a420010cc0620024180076a200f42002015420010cc06200241d0076a200d42002017420010cc06200241b0086a200e4200203a420010cc06200241a0066a20194200201a420010cc06200241f0066a201642002015420010cc06200241c0076a200f42002017420010cc06200241a0096a200d42002040420010cc06200241d0086a200e42002046420010cc06200241e0066a201942002015420010cc06200241b0076a201642002017420010cc06200241b0096a200f42002040420010cc06200241c0086a200d4200203a420010cc06200241801a6a20022903904b220c4200429db1bce4dfb435420010cc06200241d01a6a20022903b04b223b420042a0d69f90da80b1cb00420010cc06200241a01b6a20022903a84b223c420042badf96dcb5c3bac700420010cc06200241f01b6a20022903a04b223d420042a7ecfac2b5f7ea19420010cc06200241c01c6a20022903984b2242420042b0c1bad0f4e48603420010cc06200241901a6a200c420042b0c1bad0f4e48603420010cc06200241e01a6a203b420042a7a7fbf49beaf607420010cc06200241b01b6a203c420042a0d69f90da80b1cb00420010cc06200241801c6a203d420042badf96dcb5c3bac700420010cc06200241d01c6a2042420042a7ecfac2b5f7ea19420010cc06200241f0196a200c420042e098f4e5e9ebfb03420010cc06200241c01a6a203b420042badf96dcb5c3bac700420010cc06200241901b6a203c420042a7ecfac2b5f7ea19420010cc06200241e01b6a203d420042b0c1bad0f4e48603420010cc06200241b01c6a20424200429db1bce4dfb435420010cc06200241e0196a200c4200429e9981b4dab2e103420010cc06200241b01a6a203b420042a7ecfac2b5f7ea19420010cc06200241801b6a203c420042b0c1bad0f4e48603420010cc06200241d01b6a203d4200429db1bce4dfb435420010cc06200241a01c6a2042420042e098f4e5e9ebfb03420010cc06200241d0196a200c4200429df893c0a486ae01420010cc06200241a01a6a203b420042b0c1bad0f4e48603420010cc06200241f01a6a203c4200429db1bce4dfb435420010cc06200241c01b6a203d420042e098f4e5e9ebfb03420010cc06200241901c6a20424200429e9981b4dab2e103420010cc0620024190236a2018420042a0d69f90da80b1cb00420010cc06200241a0206a201d4200429db1bce4dfb435420010cc06200241c0246a2020420042badf96dcb5c3bac700420010cc06200241f0256a200a420042a7ecfac2b5f7ea19420010cc06200241c0216a200b420042b0c1bad0f4e48603420010cc0620024180236a2018420042a7a7fbf49beaf607420010cc06200241b0206a201d420042b0c1bad0f4e48603420010cc06200241b0246a2020420042a0d69f90da80b1cb00420010cc06200241e0256a200a420042badf96dcb5c3bac700420010cc06200241d0216a200b420042a7ecfac2b5f7ea19420010cc06200241a0236a2018420042badf96dcb5c3bac700420010cc0620024190206a201d420042e098f4e5e9ebfb03420010cc06200241d0246a2020420042a7ecfac2b5f7ea19420010cc0620024180266a200a420042b0c1bad0f4e48603420010cc06200241b0216a200b4200429db1bce4dfb435420010cc06200241b0236a2018420042a7ecfac2b5f7ea19420010cc0620024180206a201d4200429e9981b4dab2e103420010cc06200241e0246a2020420042b0c1bad0f4e48603420010cc0620024190266a200a4200429db1bce4dfb435420010cc06200241a0216a200b420042e098f4e5e9ebfb03420010cc06200241c0236a2018420042b0c1bad0f4e48603420010cc06200241f01f6a201d4200429df893c0a486ae01420010cc06200241f0246a20204200429db1bce4dfb435420010cc06200241a0266a200a420042e098f4e5e9ebfb03420010cc0620024190216a200b4200429e9981b4dab2e103420010cc06200220022903800822512002290390097c220c20022903b0067c223b2002290380077c223c20022903d0077c223d20022903f008225220022903e0077c22422002290390087c224820022903c0067c22472002290390077c225620022903f007225320022903a0077c22592002290380097c225b20022903a0087c225d20022903d0067c225f423388200241f0076a41086a290300200241a0076a41086a2903007c2059205354ad7c20024180096a41086a2903007c205b205954ad7c200241a0086a41086a2903007c205d205b54ad7c200241d0066a41086a2903007c205f205d54ad7c420d86847c2259423388200241f0086a41086a290300200241e0076a41086a2903007c2042205254ad7c20024190086a41086a2903007c2048204254ad7c200241c0066a41086a2903007c2047204854ad7c20024190076a41086a2903007c2056204754ad7c2059205654ad7c420d86847c224242ffffffffffffff03833703e048200220022903a006225d20022903b0087c224820022903f0067c224720022903c0077c225620022903a0097c225b204242338820024180086a41086a29030020024190096a41086a2903007c200c205154ad7c200241b0066a41086a2903007c203b200c54ad7c20024180076a41086a2903007c203c203b54ad7c200241d0076a41086a2903007c203d203c54ad7c2042203d54ad7c420d86847c220c42ffffffffffffff03833703e848200220022903e006225120022903d0087c223b20022903b0077c223c20022903b0097c223d20022903c0087c2242200c423388200241a0066a41086a290300200241b0086a41086a2903007c2048205d54ad7c200241f0066a41086a2903007c2047204854ad7c200241c0076a41086a2903007c2056204754ad7c200241a0096a41086a2903007c205b205654ad7c200c205b54ad7c420d86847c220c42ffffffffffffff03833703f0482002200c423388200241e0066a41086a290300200241d0086a41086a2903007c203b205154ad7c200241b0076a41086a2903007c203c203b54ad7c200241b0096a41086a2903007c203d203c54ad7c200241c0086a41086a2903007c2042203d54ad7c200c204254ad7c420d868442137e205f42ffffffffffffff03837c220c42ffffffffffffff03833703d0482002200c423388205942ffffffffffffff03837c3703d848200241801a6a41086a2903002164200241d01a6a41086a290300216520022903801a215720022903d01a210c200241a01b6a41086a290300216620022903a01b2158200241f01b6a41086a290300216720022903f01b215a200241c01c6a41086a290300216820022903c01c215c200241901a6a41086a2903002169200241e01a6a41086a290300216a20022903901a215e20022903e01a213b200241b01b6a41086a290300216b20022903b01b2160200241801c6a41086a290300216c20022903801c2161200241d01c6a41086a290300216d20022903d01c216220022903f019215220022903c01a213c20022903901b215320022903e01b215420022903b01c2155200241f0196a41086a290300216e200241c01a6a41086a290300216f200241901b6a41086a2903002170200241e01b6a41086a2903002171200241b01c6a41086a290300217220022903e019215b20022903b01a213d20022903801b215d20022903d01b215f20022903a01c2151200241e0196a41086a2903002173200241b01a6a41086a2903002174200241801b6a41086a2903002175200241d01b6a41086a2903002176200241a01c6a41086a290300217720022903d019214820022903a01a214220022903f01a214720022903c01b215620022903901c2159200241d0196a41086a2903002178200241a01a6a41086a2903002179200241f01a6a41086a290300217a200241c01b6a41086a290300217b200241901c6a41086a290300217c200241e8c6006a200241d0c8006a106420024180066a201d205920562047204220487c22487c22477c22567c22592051205f205d203d205b7c225b7c225d7c225f7c2251205520542053203c20527c22527c22537c22547c2255205c205a2058200c20577c22577c22587c225a7c225c206220612060203b205e7c225e7c22607c22617c2262423388206d206c206b206a20697c205e203b54ad7c7c2060205e54ad7c7c2061206054ad7c7c2062206154ad7c420d86847c225e423388206820672066206520647c2057200c54ad7c7c2058205754ad7c7c205a205854ad7c7c205c205a54ad7c205e205c54ad7c420d86847c2257423388207220712070206f206e7c2052203c54ad7c7c2053205254ad7c7c2054205354ad7c7c2055205454ad7c2057205554ad7c420d86847c2252423388207720762075207420737c205b203d54ad7c7c205d205b54ad7c7c205f205d54ad7c7c2051205f54ad7c2052205154ad7c420d86847c223c423388207c207b207a207920787c2048204254ad7c7c2047204854ad7c7c2056204754ad7c7c2059205654ad7c203c205954ad7c420d868442137e206242ffffffffffffff03837c224842ffffffffffffff038385420020022d00e8464101711066ad42ff01837d220c83201d85223b42002017420010cc06200241c0036a2018203c42ffffffffffffff038385200c83201885223c42002049420010cc0620024190046a2020205242ffffffffffffff038385200c83202085223d42002039420010cc06200241e0046a200a205742ffffffffffffff038385200c83200a8522424200201a420010cc06200241b0056a200b2048423388205e42ffffffffffffff03837c85200c83200b85224842002015420010cc0620024190066a20154200203b420010cc06200241d0036a203c42002063420010cc06200241a0046a203d42002049420010cc06200241f0046a204242002039420010cc06200241c0056a20484200201a420010cc06200241f0056a203b42002040420010cc06200241b0036a203c42002039420010cc0620024180046a203d4200201a420010cc06200241d0046a204242002015420010cc06200241a0056a204842002017420010cc06200241e0056a203b4200203a420010cc06200241a0036a203c4200201a420010cc06200241f0036a203d42002015420010cc06200241c0046a204242002017420010cc0620024190056a204842002040420010cc06200241d0056a203b42002046420010cc0620024190036a203c42002015420010cc06200241e0036a203d42002017420010cc06200241b0046a204242002040420010cc0620024180056a20484200203a420010cc06200241c0126a201042004288f5a7f5b28623420010cc06200241d0106a2011420042b9a6dff282e9ba01420010cc06200241a0136a2012420042edd5d7bc83fb803c420010cc0620024180146a2013420042edc19ab7ab9cc0c700420010cc06200241a0116a2014420042ea81f582a8b53f420010cc06200241d0126a2010420042bbda9284b7cbdd1b420010cc06200241e0106a2011420042ea81f582a8b53f420010cc06200241b0136a201242004288f5a7f5b28623420010cc0620024190146a2013420042edd5d7bc83fb803c420010cc06200241b0116a2014420042edc19ab7ab9cc0c700420010cc06200241b0126a2010420042edd5d7bc83fb803c420010cc06200241c0106a2011420042d8f8d29390ec01420010cc0620024190136a2012420042edc19ab7ab9cc0c700420010cc06200241f0136a2013420042ea81f582a8b53f420010cc0620024190116a2014420042b9a6dff282e9ba01420010cc06200241a0126a2010420042edc19ab7ab9cc0c700420010cc06200241b0106a2011420042ff91f789b6a19403420010cc0620024180136a2012420042ea81f582a8b53f420010cc06200241e0136a2013420042b9a6dff282e9ba01420010cc0620024180116a2014420042d8f8d29390ec01420010cc0620024190126a2010420042ea81f582a8b53f420010cc06200241a0106a2011420042fff5f38289d9e103420010cc06200241f0126a2012420042b9a6dff282e9ba01420010cc06200241d0136a2013420042d8f8d29390ec01420010cc06200241f0106a2014420042ff91f789b6a19403420010cc06200220022903904b225920022903c023225b20022903f01f7c221020022903f0247c221120022903a0267c22122002290390217c221320022903b023225d2002290380207c221420022903e0247c22152002290390267c221720022903a0217c221a20022903a023225f2002290390207c224020022903d0247c22392002290380267c223a20022903b0217c223b200229039023225120022903a0207c223c20022903c0247c223d20022903f0257c224220022903c0217c2248200229038023225220022903b0207c224920022903b0247c224620022903e0257c224720022903d0217c225642338820024180236a41086a290300200241b0206a41086a2903007c2049205254ad7c200241b0246a41086a2903007c2046204954ad7c200241e0256a41086a2903007c2047204654ad7c200241d0216a41086a2903007c2056204754ad7c420d86847c224942338820024190236a41086a290300200241a0206a41086a2903007c203c205154ad7c200241c0246a41086a2903007c203d203c54ad7c200241f0256a41086a2903007c2042203d54ad7c200241c0216a41086a2903007c2048204254ad7c2049204854ad7c420d86847c223c423388200241a0236a41086a29030020024190206a41086a2903007c2040205f54ad7c200241d0246a41086a2903007c2039204054ad7c20024180266a41086a2903007c203a203954ad7c200241b0216a41086a2903007c203b203a54ad7c203c203b54ad7c420d86847c2240423388200241b0236a41086a29030020024180206a41086a2903007c2014205d54ad7c200241e0246a41086a2903007c2015201454ad7c20024190266a41086a2903007c2017201554ad7c200241a0216a41086a2903007c201a201754ad7c2040201a54ad7c420d86847c2214423388200241c0236a41086a290300200241f01f6a41086a2903007c2010205b54ad7c200241f0246a41086a2903007c2011201054ad7c200241a0266a41086a2903007c2012201154ad7c20024190216a41086a2903007c2013201254ad7c2014201354ad7c420d868442137e205642ffffffffffffff03837c221042ffffffffffffff038385200c832059853703904b200220022903984b22112010423388204942ffffffffffffff03837c85200c832011853703984b200220022903a04b2210203c42ffffffffffffff038385200c832010853703a04b200220022903a84b2210204042ffffffffffffff038385200c832010853703a84b200220022903b04b2210201442ffffffffffffff038385200c832010853703b04b200220022903b003223c20022903f0057c22102002290380047c221120022903d0047c221220022903a0057c221320022903c003223d2002290380067c22142002290390047c221520022903e0047c221720022903b0057c221a20022903d00322422002290390067c224020022903a0047c223920022903f0047c223a20022903c0057c223b423388200241d0036a41086a29030020024190066a41086a2903007c2040204254ad7c200241a0046a41086a2903007c2039204054ad7c200241f0046a41086a2903007c203a203954ad7c200241c0056a41086a2903007c203b203a54ad7c420d86847c2240423388200241c0036a41086a29030020024180066a41086a2903007c2014203d54ad7c20024190046a41086a2903007c2015201454ad7c200241e0046a41086a2903007c2017201554ad7c200241b0056a41086a2903007c201a201754ad7c2040201a54ad7c420d86847c221442ffffffffffffff03833703e048200220022903a003223a20022903e0057c221520022903f0037c221720022903c0047c221a2002290390057c22392014423388200241b0036a41086a290300200241f0056a41086a2903007c2010203c54ad7c20024180046a41086a2903007c2011201054ad7c200241d0046a41086a2903007c2012201154ad7c200241a0056a41086a2903007c2013201254ad7c2014201354ad7c420d86847c221042ffffffffffffff03833703e8482002200229039003223c20022903d0057c221120022903e0037c221220022903b0047c22132002290380057c22142010423388200241a0036a41086a290300200241e0056a41086a2903007c2015203a54ad7c200241f0036a41086a2903007c2017201554ad7c200241c0046a41086a2903007c201a201754ad7c20024190056a41086a2903007c2039201a54ad7c2010203954ad7c420d86847c221042ffffffffffffff03833703f0482002201042338820024190036a41086a290300200241d0056a41086a2903007c2011203c54ad7c200241e0036a41086a2903007c2012201154ad7c200241b0046a41086a2903007c2013201254ad7c20024180056a41086a2903007c2014201354ad7c2010201454ad7c420d868442137e203b42ffffffffffffff03837c221042ffffffffffffff03833703d04820022010423388204042ffffffffffffff03837c3703d848200241c0126a41086a2903002154200241d0106a41086a290300215520022903c012211120022903d0102156200241a0136a41086a290300215720022903a013215920024180146a41086a2903002158200229038014215b200241a0116a41086a290300215a20022903a011215d200241d0126a41086a290300215c200241e0106a41086a290300215e20022903d012211220022903e010215f200241b0136a41086a290300216020022903b013215120024190146a41086a29030021612002290390142152200241b0116a41086a290300216220022903b011215320022903b012211320022903c0102148200229039013214920022903f01321462002290390112147200241b0126a41086a2903002163200241c0106a41086a290300216420024190136a41086a2903002165200241f0136a41086a290300216620024190116a41086a290300216720022903a012211420022903b010213b200229038013213c20022903e013213d2002290380112142200241a0126a41086a2903002168200241b0106a41086a290300216920024180136a41086a290300216a200241e0136a41086a290300216b20024180116a41086a290300216c200229039012211520022903a010213920022903f012213a20022903d013216d20022903f010216e20024190126a41086a290300216f200241a0106a41086a2903002170200241f0126a41086a2903002171200241d0136a41086a2903002172200241f0106a41086a2903002173200241e8c6006a200241d0c8006a106420022d00e84641017110662104200220022903984b221742f0ffffffffffff3f20177d227442ffffffffffffff038342d0fdffffffffff3f20022903904b221a7d22754233887c8542002004ad42ff01837d22108320178522763703984b2002201a201a42f0ffffffffffff3f20022903b04b22407d227742338842137e207542ffffffffffffff03837c852010838522753703904b200241f0026a201f206e206d203a201520397c22177c221a7c22397c223a2042203d203c2014203b7c223b7c223c7c223d7c2242204720462049201320487c22487c22497c22467c2247205d205b2059201120567c22567c22597c225b7c225d2053205220512012205f7c225f7c22517c22527c2253423388206220612060205c205e7c205f201254ad7c7c2051205f54ad7c7c2052205154ad7c7c2053205254ad7c420d86847c225f423388205a20582057205420557c2056201154ad7c7c2059205654ad7c7c205b205954ad7c7c205d205b54ad7c205f205d54ad7c420d86847c2256423388206720662065206320647c2048201354ad7c7c2049204854ad7c7c2046204954ad7c7c2047204654ad7c2056204754ad7c420d86847c2248423388206c206b206a206820697c203b201454ad7c7c203c203b54ad7c7c203d203c54ad7c7c2042203d54ad7c2048204254ad7c420d86847c2213423388207320722071206f20707c2017201554ad7c7c201a201754ad7c7c2039201a54ad7c7c203a203954ad7c2013203a54ad7c420d868442137e205342ffffffffffffff03837c221542ffffffffffffff038385200c83201f8522114200204c20767d221742ffffffffffffff0383204d20757d22394233887c2212420010cc06200220022903a04b221442f0ffffffffffff3f20147d221a42ffffffffffffff038320744233887c8520108320148522143703a04b200241306a201b201342ffffffffffffff038385200c83201b8522134200204e20147d221b42ffffffffffffff038320174233887c221742137e223a420010cc06200220022903a84b221442f0ffffffffffff3f20147d223b42ffffffffffffff0383201a4233887c85201083201485221a3703a84b20024180016a2021204842ffffffffffffff038385200c8320218522144200204f201a7d221a42ffffffffffffff0383201b4233887c221b42137e221f420010cc06200220402040207742ffffffffffffff0383203b4233887c852010838522213703b04b200241d0016a2023205642ffffffffffffff038385200c8320238522104200205020217d222142ffffffffffffff0383201a4233887c222342137e221a420010cc06200241a0026a203e2015423388205f42ffffffffffffff03837c85200c83203e85220c4200202142338842137e203942ffffffffffffff03837c2215420010cc0620024180036a201542002011420010cc06200241c0006a20134200201242137e420010cc0620024190016a20144200203a420010cc06200241e0016a20104200201f420010cc06200241b0026a200c4200201a420010cc06200241e0026a201142002017420010cc06200241206a20134200201f420010cc06200241f0006a20144200201a420010cc06200241c0016a201042002015420010cc0620024190026a200c42002012420010cc06200241d0026a20114200201b420010cc06200241106a20134200201a420010cc06200241e0006a201442002015420010cc06200241b0016a201042002012420010cc0620024180026a200c42002017420010cc06200241c0026a201142002023420010cc062002201342002015420010cc06200241d0006a201442002012420010cc06200241a0016a201042002017420010cc06200241f0016a200c4200201b420010cc0620022002290300224220022903c0027c220c20022903507c221020022903a0017c221120022903f0017c22122002290310224820022903d0027c221320022903607c221420022903b0017c22152002290380027c22172002290320224920022903e0027c221a20022903707c221b20022903c0017c221f2002290390027c22212002290330224620022903f0027c22232002290380017c223e20022903d0017c224020022903a0027c2239200229034022472002290380037c223a2002290390017c223b20022903e0017c223c20022903b0027c223d423388200241c0006a41086a29030020024180036a41086a2903007c203a204754ad7c20024190016a41086a2903007c203b203a54ad7c200241e0016a41086a2903007c203c203b54ad7c200241b0026a41086a2903007c203d203c54ad7c420d86847c223a423388200241306a41086a290300200241f0026a41086a2903007c2023204654ad7c20024180016a41086a2903007c203e202354ad7c200241d0016a41086a2903007c2040203e54ad7c200241a0026a41086a2903007c2039204054ad7c203a203954ad7c420d86847c2223423388200241206a41086a290300200241e0026a41086a2903007c201a204954ad7c200241f0006a41086a2903007c201b201a54ad7c200241c0016a41086a2903007c201f201b54ad7c20024190026a41086a2903007c2021201f54ad7c2023202154ad7c420d86847c221a423388200241106a41086a290300200241d0026a41086a2903007c2013204854ad7c200241e0006a41086a2903007c2014201354ad7c200241b0016a41086a2903007c2015201454ad7c20024180026a41086a2903007c2017201554ad7c201a201754ad7c420d86847c2213423388200241086a290300200241c0026a41086a2903007c200c204254ad7c200241d0006a41086a2903007c2010200c54ad7c200241a0016a41086a2903007c2011201054ad7c200241f0016a41086a2903007c2012201154ad7c2013201254ad7c420d868442137e203d42ffffffffffffff03837c220c42ffffffffffffff038322103703d0482002200c423388203a42ffffffffffffff03837c22113703d8482002201342ffffffffffffff038322123703f0482002201a42ffffffffffffff038322133703e8482002202342ffffffffffffff038322143703e048200241e8c6006a200241d0c8006a10642002201242f0ffffffffffff3f20127d221542ffffffffffffff038342f0ffffffffffff3f20137d22174233887c85420020022d00e8464101711066ad42ff01837d220c832012853703f04820022013201742ffffffffffffff038342f0ffffffffffff3f20147d22124233887c85200c832013853703e84820022014201242ffffffffffffff038342f0ffffffffffff3f20117d22124233887c85200c832014853703e04820022011201242ffffffffffffff038342d0fdffffffffff3f20107d22124233887c85200c832011853703d84820022010201542338842137e201242ffffffffffffff03837c85200c832010853703d048200241b0c7006a200241d0c8006a106420004198016a201937030020004190016a201637030020004188016a200f37030020004180016a200d3703002000200e370378200041f0006a2043370300200041e8006a2045370300200041e0006a2044370300200041d8006a204b3703002000204a370350200041c8006a2041370300200041c0006a203f370300200041386a2022370300200041306a201c3703002000201e37032820002018370320200020203703182000200a3703102000200b3703082000201d370300200041b8016a2005290300370000200041b0016a2003290300370000200041a8016a200241b0c7006a41086a290300370000200020022903b0473700a001200141003a0000200141003a0001200141003a0002200141003a0003200141003a0004200141003a0005200141003a0006200141003a0007200141003a0008200141003a0009200141003a000a200141003a000b200141003a000c200141003a000d200141003a000e200141003a000f200141003a0010200141003a0011200141003a0012200141003a0013200141003a0014200141003a0015200141003a0016200141003a0017200141003a0018200141003a0019200141003a001a200141003a001b200141003a001c200141003a001d200141003a001e200141003a001f200141003a0020200141003a0021200141003a0022200141003a0023200141003a0024200141003a0025200141003a0026200141003a0027200141003a0028200141003a0029200141003a002a200141003a002b200141003a002c200141003a002d200141003a002e200141003a002f200141003a0030200141003a0031200141003a0032200141003a0033200141003a0034200141003a0035200141003a0036200141003a0037200141003a0038200141003a0039200141003a003a200141003a003b200141003a003c200141003a003d200141003a003e200141003a003f200141003a0040200141003a0041200141003a0042200141003a0043200141003a0044200141003a0045200141003a0046200141003a0047200141003a0048200141003a0049200141003a004a200141003a004b200141003a004c200141003a004d200141003a004e200141003a004f200141003a0050200141003a0051200141003a0052200141003a0053200141003a0054200141003a0055200141003a0056200141003a0057200141003a0058200141003a0059200141003a005a200141003a005b200141003a005c200141003a005d200141003a005e200141003a005f200141003a0060200141003a0061200141003a0062200141003a0063200141003a0064200141003a0065200141003a0066200141003a0067200141003a0068200141003a0069200141003a006a200141003a006b200141003a006c200141003a006d200141003a006e200141003a006f200141003a0070200141003a0071200141003a0072200141003a0073200141003a0074200141003a0075200141003a0076200141003a0077200141003a0078200141003a0079200141003a007a200141003a007b200141003a007c200141003a007d200141003a007e200141003a007f200141003a008001200141003a008101200141003a008201200141003a008301200141003a008401200141003a008501200141003a008601200141003a008701200141003a008801200141003a008901200141003a008a01200141003a008b01200141003a008c01200141003a008d01200141003a008e01200141003a008f01200141003a009001200141003a009101200141003a009201200141003a009301200141003a009401200141003a009501200141003a009601200141003a009701200141003a009801200141003a009901200141003a009a01200141003a009b01200141003a009c01200141003a009d01200141003a009e01200141003a009f01200141003a00a001200141003a00a101200141003a00a201200141003a00a301200141003a00a401200141003a00a501200141003a00a601200141003a00a701200141003a00a801200141003a00a901200141003a00aa01200141003a00ab01200141003a00ac01200141003a00ad01200141003a00ae01200141003a00af01200141003a00b001200141003a00b101200141003a00b201200141003a00b301200141003a00b401200141003a00b501200141003a00b601200141003a00b701200141003a00b801200141003a00b901200141003a00ba01200141003a00bb01200141003a00bc01200141003a00bd01200141003a00be01200141003a00bf01200141003a00c001200141003a00c101200141003a00c201200141003a00c301200141003a00c401200141003a00c501200141003a00c601200141003a00c701200241b0cc006a24000b130020004102360204200041d48fc6003602000b3400200041868cc70036020420004100360200200041146a410b360200200041106a41ec95c600360200200041086a42043702000b4901017f02404104102422020d001033000b2000420437020420002002360200200041004101106d2000280200200041086a220028020022026a41003a00002000200241016a3602000bb00101067f230041206b22022400200241186a22034200370300200241106a22044200370300200241086a220542003703002002420037030002404120102422060d001033000b2000422037020420002006360200200041004120106d2000280200200041086a220628020022076a220020022903003700002006200741206a360200200041086a2005290300370000200041106a2004290300370000200041186a2003290300370000200241206a24000b13002000410236020420004198aec6003602000b4a01017f02404108102422020d001033000b2000420837020420002002360200200041004108106d2000280200200041086a220028020022026a42f02e3700002000200241086a3602000b4a01017f02404108102422020d001033000b2000420837020420002002360200200041004108106d2000280200200041086a220028020022026a42d8043700002000200241086a3602000b130020004106360204200041f8b3c6003602000b3400200041b58dc70036020420004100360200200041146a4101360200200041106a4188d7c600360200200041086a42053702000b5e01027f02404114102422020d001033000b200042143702042000200236020041014100200010b6012000200041086a22022802004110106d2000280200200228020022006a22034200370008200342003700002002200041106a3602000b130020004103360204200041d4d9c6003602000b4901017f02404102102422020d001033000b2000420237020420002002360200200041004102106d2000280200200041086a220028020022026a41203b00002000200241026a3602000b5601027f02404110102422020d001033000b2000421037020420002002360200200041004110106d2000280200200041086a220028020022026a220342003700082003428081e492063700002000200241106a3602000b5701027f02404110102422020d001033000b2000421037020420002002360200200041004110106d2000280200200041086a220028020022026a2203420037000820034280a8f2e38e1d3700002000200241106a3602000b860602087f067e230041d0016b220324002003200236020c20032001360208200341106a2001200210820202400240200328021022040d00200041023a00300c010b200341186a28020021052003280214210641002101200341003a008801200421070240024002400240024003402007210820052001460d01200341e8006a20016a20082d00003a00002003200141016a22023a008801200841016a21072002210120024120470d000b200341b0016a41186a2201200341e8006a41186a290300370300200341b0016a41106a2209200341e8006a41106a290300370300200341b0016a41086a220a200341e8006a41086a290300370300200320032903683703b001200241ff01714120490d01200341c8006a41086a200a290300370300200341c8006a41106a2009290300370300200341c8006a41186a2001290300370300200320032903b001370348200520026b410f4d0d01200541706a2002460d0120082d0011220241014b0d01200741086a290000210b2007290000210c4100210120020e020302030b200141ff0171450d00200341003a0088010b200341003602b801200342013703b0012003410e360294012003200341086a360290012003200341b0016a360248200341fc006a41013602002003420137026c2003418c8dc600360268200320034190016a360278200341c8006a41c4e1c000200341e8006a10351a20032802b00120032802b801108402024020032802b401450d0020032802b00110260b410221010c020b410121010b200341206a41186a200341c8006a41186a290300220d370300200341206a41106a200341c8006a41106a290300220e370300200341206a41086a200341c8006a41086a290300220f370300200320032903482210370320200320032800413602682003200341c4006a28000036006b2000200b3703082000200c37030020002010370310200041186a200f370300200041206a200e370300200041286a200d370300200041346a200328006b360000200020032802683600310b200020013a00302006450d00200410260b200341d0016a24000b980202037f027e230041106b220324000240411110242204450d002003421137020420032004360200200341004120106d2003280200200328020822056a22042002290010370000200441086a200241186a290000370000200441106a200241206a290000370000200441186a200241286a2900003700002003200541206a2204360208200241086a290300210620022903002107200320044110106d2003280200200328020822046a22052006370008200520073700002003200441106a220436020820022d00302105200320044101106d20032802002202200328020822046a20053a00002003200441016a2204360208200020012002200410b30102402003280204450d00200210260b200341106a24000f0b1033000b950201047f230041106b22032400024002402002280208220441f0026c4104722205417f4c0d0020022802002102200510242206450d012003410036020820032005360204200320063602002003200410a10102402004450d00200441f0026c2104034002400240200241bc026a2802004102470d00200320032802084101106d2003280200200328020822056a41003a00002003200541016a3602080c010b200320032802084101106d2003280200200328020822056a41013a00002003200541016a3602082002200310e8030b200241f0026a2102200441907d6a22040d000b0b200020012003280200200328020810b30102402003280204450d00200328020010260b200341106a24000f0b1034000b1033000b130020004101360204200041c0e2c6003602000b3400200041f58cc70036020420004100360200200041146a4103360200200041106a41e8e3c600360200200041086a420c3702000b130020004106360204200041c8e9c6003602000bf63609017f017e057f017e027f017e047f037e027f230041a0066b22032400200341c0006a20014180026a290000370300200341386a200141f8016a290000370300200341286a41086a200141f0016a290000370300200320012900e8013703282001290300210420034188016a200141880210cf061a2003200341d0056a360294032003200341d0056a36029003200341f8056a20034188016a41086a220510f40220034198036a20034180026a220610f40202400240024002400240200341f8056a20034198036a412010d206450d002003419c016a2802002207450d0020034194016a2802002101200741246c21070340024020012d00004101470d0002404193acc7002001460d00200141016a28000041c28289aa04470d010b200141086a28020021082003200141106a2802003602fc05200320083602f80520034198036a200341f8056a109d042003290398034203510d002003418c026a2802002207450d0220032802a803210920032903a003210a20034184026a2802002101200741246c21070240024002400240024002400240024002400340024020012d00004101470d0002404193acc7002001460d00200141016a28000041c28289aa04470d010b200141086a28020021082003200141106a2802003602fc05200320083602f80520034198036a200341f8056a109d042003290398034203510d00200329038801200a520d0d200a20032903a003520d0d200920032802a803470d0d20034198036a200541f00010cf061a2003200341f0026a22013602880420034198036a200110f302450d0e20034198036a200641f00010cf061a200320013602880420034198036a200110f302450d0f2002280210210b2002280200210120034188016a41186a2207420037030020034188016a41106a2208420037030020034188016a41086a22054200370300200342003703880120034198036a41868cc700410410fb01200520034198036a41086a220629000037030020032003290098033703880120034198036a41a89ec600410b10fb01200720062900003703002008200329009803370300200341186a20034188016a10ab03410221052001420020042003290320420020032802181b7d220a200a2004561b220a42d80480a7417f200a428080808080cb00541b470d1020034194016a200341286a41086a2903003702002003419c016a200341286a41106a290300370200200341a4016a200341286a41186a290300370200200341e2c289ab06360288012003200329032837028c01200341f8056a41106a200241106a280200360200200341f8056a41086a200241086a290200370300200320022902003703f80520034198036a20034188016a200341f8056a10ef034101210c20032d0098034101470d02200341c8006a41176a220120034198036a41196a290000370000200341c8006a41106a2207200341aa036a290100370300200341c8006a41086a200341a2036a290100220a3703002003200329019a03220d37034820032d0099032108200341e8006a41176a22022001290000370000200341e8006a41106a22012007290300370300200341e8006a41086a2207200a3703002003200d3703684100210e024020002d00004101470d0020034188016a41186a2205200041196a29000037030020034188016a41106a200041116a29000037030020034188016a41086a200041096a290000370300200320002900013703880141201024220c450d04200c200329038801370000200c41186a2005290300370000200c41106a20034188016a41106a290300370000200c41086a20034188016a41086a2903003700004101210e0b20034190046a41176a200229000037000020034190046a41106a200129030037030020034190046a41086a20072903003703002003200329036837039004412010242202450d03200220083a00002002200329039004370001200241096a20034190046a41086a290300370000200241116a200341a0046a290300370000200241186a200341a7046a2900003700002003200e3602b8042003200e3602b4042003200c3602b004410810242201450d07200342083702ec04200320013602e80441002107200341e8046a41004108106d20032802e80420032802f00422016a20043700002003200141086a3602f00420034188016a419dd5c10010fb0220034198036a2003280288012208200328029001109d02200329029c03420020032802980322011b210a2001410120011b21000240200328028c01450d00200810260b2003200a4220883e02fc04200320003602f804200341106a200341f8046a108f01410821084100210520032802100d062003280214220f20032802fc0441286e22012001200f4b1bad42287e220d422088a70d08200da72201417f4c0d080240024020010d00410821090c010b200110242209450d080b200341003602880520032009360280052003200141286e22013602840541002110024002400240200f450d0041002111034020032802fc0422074108490d03201141016a211120032802f8042205290000210d2003200741786a22063602fc042003200541086a3602f80441002101200341003a00a801200741776a2107034020062001460d0320034188016a20016a200520016a220841086a2d00003a00002003200841096a3602f8042003200141016a22083a00a801200320073602fc042007417f6a21072008210120084120470d000b20034198036a41186a220120034188016a41186a29030037030020034198036a41106a220720034188016a41106a29030037030020034198036a41086a220520034188016a41086a290300370300200320032903880137039803200841ff01714120490d03200341b0056a41086a20052903002212370300200341b0056a41106a20072903002213370300200341b0056a41186a2001290300221437030020034190056a41186a2207201437030020034190056a41106a2208201337030020034190056a41086a22052012370300200320032903980322123703d005200320123703b005200320123703900502402010200328028405470d0020034180056a201010e901200328028005210920032802880521100b2009201041286c6a2201200d3703002001200329039005370308200141106a2005290300370300200141186a2008290300370300200141206a20072903003703002003201041016a2210360288052011200f470d000b20032802840521010b2010410020091b21052001410020091b21072009410820091b21080c080b200141ff0171450d00200341003a00a8010b2003280284052201450d05200141286c0d040c050b200141246a21012007415c6a22070d000c0c0b0b410221050c0e0b102c000b200910260b4100210741082108410021050b20034188016a419dd5c100200341e8046a10fc0220034198036a200328028801220620032802900110a502200329029c03420020032802980322011b210d2001410120011b21110240200328028c01450d00200610260b200341e0046a2005360200200341dc046a2007360200200341c0046a41106a200d370300200341c0046a41086a200341e8046a41086a280200360200200320032903e8043703c004200320083602d804200320113602cc040240200aa7450d00200010260b200241086a290000210a200241106a290000211220022900002113200341d0056a41186a200241186a290000370300200341d0056a41106a2012370300200341d0056a41086a200a370300200320133703d005410810242201450d002003420837028c01200320013602880120034188016a41004108106d200328028801220720032802900122016a20043700002003419c016a41002900a5d5413702002003200141086a360290012003410029009dd541370294012003200341d0056a3602a401200341f8056a20034188016a1094010240200328028c01450d00200710260b200d422088210a20034188016a200341f8056a10fe02200341086a200328028801220720032802900141d4c0c70041004100108102200328020821010240200328028c01450d00200710260b200aa7210f0240024020014101470d00410021010c010b20034198036a41186a2207200341d0056a41186a29030037030020034198036a41106a2208200341d0056a41106a29030037030020034198036a41086a2205200341d0056a41086a290300370300200320032903d0053703980320034188016a200341b0046a10c30120034188016a410c6a220141186a2007290300370000200141106a2008290300370000200141086a2005290300370000200120032903980337000020034198036a200341f8056a10fe02200328029803220120032802a00320034188016a10af050240200328029c03450d00200110260b0240200328028c0141ffffff3f71450d0020032802880110260b20034198036a41186a200341f8056a41186a29030037030020034198036a41106a200341f8056a41106a29030037030020034198036a41086a200341f8056a41086a290300370300200320032903f8053703980320032802d804210641002101024002400240024020032802e004220041014b0d0020000e020102010b20002107034020012007410176220820016a22052006200541286c6a2903002004561b2101200720086b220741014b0d000c020b0b20034188016a41186a20034198036a41186a29030037030020034188016a41106a20034198036a41106a29030037030020034188016a41086a20034198036a41086a290300370300200320032903980337038801410021070c010b2006200141286c6a290300210a20034188016a41186a20034198036a41186a29030037030020034188016a41106a20034198036a41106a29030037030020034188016a41086a20034198036a41086a290300370300200320032903980337038801200020012001200a2004546a200a2004511b22074f0d0020072000103b000b0240200020032802dc04470d00200341c0046a41186a200010e90120032802d404210f20032802d80421060b2006200741286c6a220141286a2001200020076b41286c10d0061a200120043703002001200329038801370308200141106a20034188016a41086a2208290300370300200141186a20034188016a41106a2205290300370300200141206a20034188016a41186a2206290300370300410121012003200041016a3602e004200620034198036a41186a290300370300200520034198036a41106a290300370300200820034198036a41086a2903003703002003200329039803370388010240200f20032802d004470d00200341c0046a410c6a200f410110930120032802d404210f0b20032802cc042211200f4105746a2207200329038801370000200741186a2006290300370000200741106a2005290300370000200741086a20082903003700002003200f41016a220f3602d4040b20021026024020010d00024020032802c404450d0020032802c00410260b024020032802d00441ffffff3f71450d00201110260b024020032802dc042201450d00200141286c450d0020032802d80410260b200e450d04200c10260c040b024002400240200f450d00200f410574210220034188016a4104722101201121070340200341b0056a200710fe0220034188016a20032802b005220520032802b80510b00520034198036a41086a2206200141086a29020037030020034198036a41106a2200200141106a29020037030020034198036a41186a2209200141186a29020037030020034198036a41206a2210200141206a29020037030020032001290200370398030240024020032802880122080d00410021080c010b200341f8056a41206a2010290300370300200341f8056a41186a2009290300370300200341f8056a41106a2000290300370300200341f8056a41086a200629030037030020032003290398033703f8050b024020032802b405450d00200510260b20080d02200741206a2107200241606a22020d000b0b41002105410421154100210f0c010b200341d0056a41206a2201200341f8056a41206a290300370300200341d0056a41186a2205200341f8056a41186a290300370300200341d0056a41106a2206200341f8056a41106a290300370300200341d0056a41086a2200200341f8056a41086a290300370300200320032903f8053703d005412c10242215450d0120152008360200201520032903d0053702042015410c6a2000290300370200201541146a20062903003702002015411c6a2005290300370200201541246a200129030037020020034281808080103702940520032015360290050240024020024120470d004101210f0c010b200741206a21052011200f4105746a221041606a211120034188016a41047221014101210f0340200521070340200341b0056a200710fe0220034188016a20032802b005220220032802b80510b00520034198036a41086a2205200141086a29020037030020034198036a41106a2206200141106a29020037030020034198036a41186a2200200141186a29020037030020034198036a41206a2209200141206a29020037030020032001290200370398030240024020032802880122080d00410021080c010b200341f8056a41206a2009290300370300200341f8056a41186a2000290300370300200341f8056a41106a2006290300370300200341f8056a41086a200529030037030020032003290398033703f8050b024020032802b405450d00200210260b024020080d002010200741206a2207470d010c030b0b200341d0056a41206a200341f8056a41206a290300220a370300200341d0056a41186a200341f8056a41186a290300220d370300200341d0056a41106a200341f8056a41106a2903002212370300200341d0056a41086a200341f8056a41086a2903002213370300200320032903f80522143703d00520034188016a41206a2206200a37030020034188016a41186a2200200d37030020034188016a41106a2209201237030020034188016a41086a2216201337030020032014370388010240200f200328029405470d0020034190056a200f10ee0120032802900521150b200741206a21052015200f412c6c6a2202200836020020022003290388013702042002410c6a2016290300370200200241146a20092903003702002002411c6a2000290300370200200241246a20062903003702002003200f41016a220f3602980520112007470d000b0b20032802940521050b20034188016a41206a200341c0046a41206a280200220136020020034188016a41186a200341c0046a41186a290300220a37030020034188016a41106a200341c0046a41106a29030037030020034188016a41086a200341c0046a41086a290300370300200320032903c00437038801200141286c4104722207417f4c0d01200710242208450d00200aa721022003410036028006200320073602fc05200320083602f805200341f8056a200110a10102402001450d002002200141286c6a21082002210103402001290300210a200341f8056a2003280280064108106d20032802f80520032802800622076a200a3700002003200741086a360280062003200341f8056a36029803200141086a20034198036a109c01200141286a22012008470d000b0b20034198036a419dd5c10010fb02200328029803220120032802a003200341f8056a1099020240200328029c03450d00200110260b024020032802fc05450d0020032802f80510260b20034198036a419dd5c10020034188016a10fc02200328029803220120032802a00320034194016a10b1050240200328029c03450d00200110260b0240200328028c01450d0020032802880110260b024020034198016a28020041ffffff3f71450d0020032802940110260b0240200341a4016a2802002201450d00200141286c450d00200210260b0240200e450d00200c10260b2015450d03200b4101200b41014b1b2201418094ebdc036e2001418094ebdc03704100476a22074101200741014b1b220720014b0d02200341003602d805200342043703d005200341d0056a4100200f10e7012001200f41036c220820012008491b20076ead428094ebdc037e200120076ead8042ffffffff0f83220a200a7e220a42808090bbbad6adf00d200a42808090bbbad6adf00d541b428094ebdc0380210a20032802d80521020240200f450d00200aa7210820032802d00520024102746a2101200f2107034020012008360200200141046a21012007417f6a22070d000b200f20026a21020b200320023602d805410810242201450d00200342083702fc05200320013602f805200341f8056a41004108106d20032802f80520032802800622016a20043700002003418c066a41002900a5d5413702002003200141086a360280062003410029009dd54137028406200341b3036a200341f8056a41186a280200360000200341ab036a200341f8056a41106a290300370000200341a3036a200329038006370000200320032903f80537009b0320034191016a20034198036a41086a29000037000020034199016a20034198036a41106a29000037000020034188016a41186a200341af036a290000370000200341a8016a41013a0000200341033a00880120032003290098033700890120034188016a108702024020032802d40541ffffffff0371450d0020032802d00510260b0240200f450d00200f412c6c21072015210103400240200141046a28020041ffffff3f71450d00200128020010260b2001412c6a2101200741546a22070d000b0b02402005450d002005412c6c450d00201510260b200341a0066a240041040f0b1033000b1034000b41b0b2c200411941ccb2c200102f000b410321050c060b200141246a21012007415c6a22070d000b0b02402003419c016a2802002207450d0020034188016a410c6a2802002101200741246c210703400240024020012d0000220841044b0d0002400240024020080e050400010204040b2001410c6a280200450d03200141086a28020010260c030b2001410c6a280200450d02200141086a28020010260c020b2001410c6a280200450d01200141086a28020010260c010b200141086a280200450d00200141046a28020010260b200141246a21012007415c6a22070d000b0b20034198016a2802002201450d00200141246c450d0020032802940110260b02402003418c026a2802002207450d0020034184026a2802002101200741246c210703400240024020012d0000220841044b0d0002400240024020080e050400010204040b2001410c6a280200450d03200141086a28020010260c030b2001410c6a280200450d02200141086a28020010260c020b2001410c6a280200450d01200141086a28020010260c010b200141086a280200450d00200141046a28020010260b200141246a21012007415c6a22070d000b0b20034188026a2802002201450d00200141246c450d0020032802840210260b410121050b2002280204210802402002410c6a2802002201450d002001410c6c21072008210103400240200141046a280200450d00200128020010260b2001410c6a2101200741746a22070d000b0b200241086a2802002201450d002001410c6c450d00200810260b200341a0066a240020050b8d52020b7f047e23002203210420034180096b416071220324000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012d00000e0700010203040506000b200341f4056a4101360200200342013702e405200341dcedc6003602e005200341043602c402200341d4edc6003602c0022003200341c0026a3602f005200341e0056a41ecc0c700103d000b200141246a2802002105200141216a2d00002106200341a0016a41186a200141196a290000370300200341a0016a41106a200141116a290000370300200341a0016a41086a200141096a290000370300200320012900013703a001200341e0056a41206a200241206a290200370300200341e0056a41186a200241186a290200370300200341e0056a41106a200241106a290200370300200341e0056a41086a2201200241086a290200370300200320022902003703e005200341c0026a200341e0056a10d60220034190026a41086a2202200341c0026a41096a29000037030020034190026a41106a2207200341c0026a41116a29000037030020034190026a41186a2208200341c0026a41196a290000370300200320032900c1023703900220032d00c0024101460d06200341c8016a41186a2008290300370300200341c8016a41106a2007290300370300200341c8016a41086a200229030037030020032003290390023703c801200341c0026a200341a0016a10db05200341e0056a20032802c002220820032802c80210dc0520032802e40521072001280200410020032802e00522011b2102024020032802c402450d00200810260b2007410020011b21092001410120011b210a2002450d27200a200241216c6a21070240200641ff0171220b4104460d00200a2101034020034190026a41186a2208200141186a29000037030020034190026a41106a220c200141106a29000037030020034190026a41086a220d200141086a2900003703002003200129000037039002200141206a2d000022024104460d29200341e0056a41186a2008290300370300200341e0056a41106a200c290300370300200341e0056a41086a200d29030037030020032003290390023703e005200320023a0080060240200341e0056a200341c8016a412010d2060d002002200b460d080b200141216a22012007470d000c290b0b200a2101034020034190026a41186a2202200141186a29000037030020034190026a41106a2208200141106a29000037030020034190026a41086a220c200141086a2900003703002003200129000037039002200141206a2d000022064104460d28200341e0056a41186a2002290300370300200341e0056a41106a2008290300370300200341e0056a41086a200c29030037030020032003290390023703e005200320063a0080060240200341e0056a200341c8016a412010d206450d00200141216a22012007460d290c010b0b200341e8016a41186a200341e0056a41186a290300370300200341e8016a41106a200341e0056a41106a290300370300200341e8016a41086a200341e0056a41086a290300370300200320032903e0053703e8010c240b200141216a2d0000210d20034188056a41186a2206200141196a29000037030020034188056a41106a2207200141116a29000037030020034188056a41086a2208200141096a2900003703002003200129000137038805200341e0056a41206a200241206a290200370300200341e0056a41186a200241186a290200370300200341e0056a41106a200241106a290200370300200341e0056a41086a200241086a290200370300200320022902003703e005200341c0026a200341e0056a10d60220034190026a41086a2201200341c0026a41096a29000037030020034190026a41106a2202200341c0026a41116a29000037030020034190026a41186a220c200341c0026a41196a290000370300200320032900c1023703900220032d00c0024101460d0820034198086a41186a200c29030037030020034198086a41106a200229030037030020034198086a41086a2001290300370300200320032903900237039808200341c0056a41186a2006290300370300200341c0056a41106a2007290300370300200341c0056a41086a200829030037030020032003290388053703c005200341a0016a20034198086a10db05200341e0056a20032802a001220720032802a801220810dc050240024020032802e00522020d004101210220034101360290024200210e41002106410021014200210f0c010b20032002360290022003200341ec056a28020036029c02200341f8056a290300210f200341f0056a290300210e200341e8056a280200210120032802e40521060b20034190026a41186a200f3703002003200e3703a00220032006360294022003200136029802200341e8016a41186a220c200341c0056a41186a290300370300200341e8016a41106a2205200341c0056a41106a290300370300200341e8016a41086a2209200341c0056a41086a290300370300200320032903c0053703e80102402001411f4b0d00200341c0026a41186a200c290300370300200341c0026a41106a2005290300370300200341c0026a41086a2009290300370300200320032903e8013703c0022003200d3a00e002200341206a20022001200341c0026a1080032003280220450d082003280224210c200341e0056a41206a200341c0026a41206a2d00003a0000200341e0056a41186a200341c0026a41186a290300370300200341e0056a41106a200341c0026a41106a290300370300200341e0056a41086a200341c0026a41086a290300370300200320032903c0023703e0052001200c490d07024020012006470d0020034190026a200610f301200341a8026a290300210f20032903a002210e20032802900221020b2002200c41216c6a220641216a20062001200c6b41216c10d0061a200641186a200341e0056a41186a290300370000200641106a200341e0056a41106a290300370000200641086a200341e0056a41086a220c290300370000200620032903e0053700002003200141016a220136029802200341106a2001ad4200428081e49206420010cc06200641206a200341e0056a41206a2d00003a00000240200329031022104280a8f2e38e1d7c2211200e56200341106a41086a2903002011201054ad7c2210200f562010200f5122011b0d002011200e542010200f5420011b450d20200320034198086a200e20117d200f20107d200e201154ad7d10da020c200b200341e0056a20034198086a2011200e7d2010200f7d2011200e54ad7d10d902200320032900e1053703b0052003200c2800003600b70520032d00e00522014104460d1f200341d0016a20032800b705360000200320013a00c801200320032903b0053700c9010c1e0b200341c8016a410110e7020c1d0b200141216a2d0000210d20034198086a41186a2206200141196a29000037030020034198086a41106a2207200141116a29000037030020034198086a41086a2208200141096a2900003703002003200129000137039808200341e0056a41206a200241206a290200370300200341e0056a41186a200241186a290200370300200341e0056a41106a200241106a290200370300200341e0056a41086a200241086a290200370300200320022902003703e005200341c0026a200341e0056a10d602200341c0056a41086a2201200341c0026a41096a290000370300200341c0056a41106a2202200341c0026a41116a290000370300200341c0056a41186a220c200341c0026a41196a290000370300200320032900c1023703c00520032d00c0024101460d0920034190026a41186a200c29030037030020034190026a41106a200229030037030020034190026a41086a2001290300370300200320032903c00537039002200341c0056a20034190026a10db05200341c0026a20032802c00520032802c80510dc05200341e8016a41186a2006290300370300200341e8016a41106a2007290300370300200341e8016a41086a200829030037030020032003290398083703e801200341003602e00520032903d802210e200320032903f8053703d80220032903d0022110200320032903f0053703d00220032903c8022111200320032903e8053703c80220032903c002210f200320032903e0053703c0020240200fa72201450d00200341e0056a41186a200341e8016a41186a290300370300200341e0056a41106a200341e8016a41106a290300370300200341e0056a41086a200341e8016a41086a290300370300200320032903e8013703e0052003200d3a008006200341c8006a20012011a72206200341e0056a108003200f422088a721020240024002400240024020032802480d00200328024c220720064f0d0e2001200741216c6a2208200841216a20062007417f736a41216c10d0061a2006417f6a22060d01420021114200210f0c020b200341c8016a410210e7020c1b0b200341386a2006ad4200428081e49206420010cc062003290338220f4280a8f2e38e1d7c2211201056200341386a41086a2903002011200f54ad7c220f200e56200f200e511b0d010b02402010201156200e200f56200e200f511b450d00200341286a20034190026a201020117d200e200f7d2010201154ad7d10da020b2006450d010c180b20034188056a20034190026a201120107d200f200e7d2011201054ad7d10d90220032003290089053703b005200320034188056a41086a2800003600b70520032d00880522074104460d17200341d0016a20032800b705360000200320073a00c801200320032903b0053700c9010c180b200341043a00c8012002450d19200241216c450d18200110260c180b200341c8016a410210e7020c170b200341e0056a41206a200241206a290200370300200341e0056a41186a200241186a290200370300200341e0056a41106a200241106a290200370300200341e0056a41086a200241086a290200370300200320022902003703e005200341c0026a200341e0056a10d602200341e8016a41086a2201200341c9026a290000370300200341e8016a41106a2202200341d1026a290000370300200341e8016a41186a2206200341d9026a290000370300200320032900c1023703e80120032d00c0024101460d0920034190026a41186a200629030037030020034190026a41106a200229030037030020034190026a41086a2001290300370300200320032903e8013703900220034198086a20034190026a10db05200341e0056a200328029808220220032802a008220110dc050240024020032802e00522060d00200341d8026a200341fc056a280200360200200341d0026a200341f4056a290200370300200341c8026a200341ec056a290200370300200320032902e4053703c0024200210f41002101410121064200210e0c010b2002200110ff01200341d8026a200341fc056a280200360200200341d0026a200341e0056a41146a290200370300200341c8026a200341ec056a290200370300200320032902e405220f3703c002200fa72101200341c0026a41146a290200210e20032902cc02210f0b0240200328029c08450d00200210260b02402001450d00200141216c450d00200610260b200341d0006a20034190026a200f200e10da02200041186a41003a00002000420037030820002003280088053600192000411c6a2003418b056a28000036000020004200370300200424000f0b200141026a2f01002108200320012d00013a009001200341e0056a41206a200241206a290200370300200341e0056a41186a200241186a290200370300200341e0056a41106a200241106a290200370300200341e0056a41086a2201200241086a290200370300200320022902003703e005200341c0026a200341e0056a10d602200341c0056a41086a2202200341c9026a290000370300200341c0056a41106a2206200341c0026a41116a290000370300200341c0056a41186a2207200341c0026a41196a290000370300200320032900c1023703c00520032d00c0024101460d0920034188056a41186a200729030037030020034188056a41106a200629030037030020034188056a41086a2002290300370300200320032903c0053703880520034190026a41186a2202420037030020034190026a41106a2206420037030020034190026a41086a220742003703002003420037039002200341e0056a41808cc700410610fb0120072001290000370300200320032900e00537039002200341e0056a41ea93c400410610fb0120022001290000370300200620032900e005370300200341f0006a20034190026a4120108902200328027421012003280270210c200341e8006a41da93c4004110108902200328026c210d20032802682105200320083b01f4052003200d410020051b3602ec05200320014100200c1b3602e805200341c4edc6003602e005200320034190016a3602f005200320034188056a3602e405200341e8016a200341e0056a10f602200341083a0080062003410b3a0080062003410c3a008006200320032f01e8013b01e005200320032801ea013601e205200320032d00ee013a00e605200320032800ef013600e705200320032d00f3013a00eb052003410d3a008006200320032d00f4013a00ec052003410e3a008006200320032d00f5013a00ed052003410f3a008006200320032d00f6013a00ee05200341103a008006200320032d00f7013a00ef05200341113a008006200320032d00f8013a00f005200341123a008006200320032d00f9013a00f105200341133a008006200320032d00fa013a00f205200341143a008006200320032d00fb013a00f305200341153a008006200320032d00fc013a00f405200341163a008006200320032d00fd013a00f505200341173a008006200320032d00fe013a00f605200341183a008006200320032d00ff013a00f705200341193a008006200320032d0080023a00f8052003411a3a008006200320032d0081023a00f9052003411b3a008006200320032d0082023a00fa052003411c3a008006200320032d0083023a00fb052003411d3a008006200320032d0084023a00fc052003411e3a008006200320032d0085023a00fd052003411f3a008006200320032d0086023a00fe05200341203a008006200320032d0087023a00ff05200341c0026a41186a220120032903f805370300200341c0026a41086a20032903e805220f370300200341c0026a41106a20032903f005220e370300200320032903e00522113703c0022006200e3703002007200f37030020022001290300370300200320113703900220034198086a41186a200229030037030020034198086a41106a200629030037030020034198086a41086a2007290300370300200320032903900237039808200341e0056a20034198086a10db05200341e0006a20032802e005220220032802e80541d4c0c7004100410010810220032802602101024020032802e405450d00200210260b20014101460d0a200341e0056a20034188056a4280a9d6f6941d420010d902200320032900e1053703b0052003200341e0056a41086a2800003600b705024020032d00e00522014104470d00412110242201450d222001200329038805370000200120032d0090013a0020200141086a20034188056a41086a290300370000200141106a20034188056a41106a290300370000200141186a20034188056a41186a290300370000200341c0026a20034198086a10db0520032802c802210720032802c0022102413510242206450d0c200342353702e405200320063602e00520014101200341e0056a10b601200341e0056a20032802e8054110106d20032802e005220620032802e805220c6a220d4200370008200d4280a9d6f6941d3700002003200c41106a220c3602e805200220072006200c10b301024020032802e405450d00200610260b024020032802c402450d00200210260b2001102620032d0090012101200341ed056a20034198086a41086a290300370000200341f5056a20034198086a41106a290300370000200341fd056a20034198086a41186a29030037000020034185066a2003290388053700002003418d066a20034188056a41086a29030037000020034195066a20034188056a41106a2903003700002003419d066a20034188056a41186a290300370000200341a6066a20083b0100200341a5066a20013a0000200341013a00e4052003410e3a00e00520032003290398083700e505200341e0056a108702200341043a00c8010c130b200341c8016a41086a20032800b705360000200320013a00c801200320032903b0053700c9010c100b200141286a2802002107200141246a2802002108200141226a2f0100210c200141216a2d00002106200341c8016a41186a200141196a290000370300200341c8016a41106a200141116a290000370300200341c8016a41086a200141096a290000370300200320012900013703c801200320063a009001200341e0056a41206a200241206a290200370300200341e0056a41186a200241186a290200370300200341e0056a41106a200241106a290200370300200341e0056a41086a200241086a290200370300200320022902003703e005200341c0026a200341e0056a10d602200341c0056a41086a2201200341c0026a41096a290000370300200341c0056a41106a2202200341c0026a41116a290000370300200341c0056a41186a2206200341c0026a41196a290000370300200320032900c1023703c00520032d00c0024101460d0b20034188056a41186a200629030037030020034188056a41106a200229030037030020034188056a41086a2001290300370300200320032903c005370388052003200c3b01f405200320073602ec05200320083602e805200341c4edc6003602e005200320034190016a3602f0052003200341c8016a3602e405200341e8016a200341e0056a10f602200341083a0080062003410b3a0080062003410c3a008006200320032f01e8013b01e005200320032801ea013601e205200320032d00ee013a00e605200320032800ef013600e705200320032d00f3013a00eb052003410d3a008006200320032d00f4013a00ec052003410e3a008006200320032d00f5013a00ed052003410f3a008006200320032d00f6013a00ee05200341103a008006200320032d00f7013a00ef05200341113a008006200320032d00f8013a00f005200341123a008006200320032d00f9013a00f105200341133a008006200320032d00fa013a00f205200341143a008006200320032d00fb013a00f305200341153a008006200320032d00fc013a00f405200341163a008006200320032d00fd013a00f505200341173a008006200320032d00fe013a00f605200341183a008006200320032d00ff013a00f705200341193a008006200320032d0080023a00f8052003411a3a008006200320032d0081023a00f9052003411b3a008006200320032d0082023a00fa052003411c3a008006200320032d0083023a00fb052003411d3a008006200320032d0084023a00fc052003411e3a008006200320032d0085023a00fd052003411f3a008006200320032d0086023a00fe05200320032d0087023a00ff05200341203a008006200341c0026a41186a220120032903f805370300200341c0026a41086a20032903e805220f370300200341c0026a41106a20032903f005220e370300200320032903e00522113703c00220034190026a41106a2202200e37030020034190026a41086a2206200f37030020034190026a41186a22072001290300370300200320113703900220034198086a41186a200729030037030020034198086a41106a200229030037030020034198086a41086a2006290300370300200320032903900237039808024020034198086a20034188056a412010d2060d0020034190026a20034188056a10db05200341e0056a2003280290022202200328029802220110dc050240024020032802e00522060d00200341d8026a200341fc056a280200360200200341d0026a200341f4056a290200370300200341c8026a200341ec056a290200370300200320032902e4053703c0024200210f41002101410121064200210e0c010b2002200110ff01200341d8026a200341fc056a280200360200200341d0026a200341e0056a41146a290200370300200341c8026a200341ec056a290200370300200320032902e405220f3703c002200fa72101200341c0026a41146a290200210e20032902cc02210f0b0240200328029402450d00200210260b02402001450d00200141216c450d00200610260b200341f8006a200341c8016a200f200e10da02200341043a00a0010c0e0b200341a0016a410610e70220032d00a0014104460d0d20032902a401210f0c0c0b200341e8016a41186a200341e0056a41186a290300370300200341e8016a41106a200341e0056a41106a290300370300200341e8016a41086a200341e0056a41086a290300370300200320032903e0053703e8010c1e0b200341023a0090012005109803200510260c210b200c2001103b000b200341c8016a410510e7020c150b410221010c180b20072006103e000b200341023a00c8010c100b200341c8016a41026a200341c0056a41026a2d000022013a0000200320032f00c00522023b01c801200041206a41023a0000200041186a41003a000020004200370308200020023b0021200041236a20013a000020004201370300200424000f0b200341023a00c8010c070b200341c8016a410510e70220032d00c80121010c050b1033000b200341023a00a0010b20032802a00121032000200f370024200041206a2003360000200041186a41003a0000200042003703084201210f0c010b4200210f20004200370308200020032800e005360019200041186a41003a00002000411c6a200341e3056a2800003600000b2000200f370300200424000f0b200141ff01714104460d0120032902cc01210f0b20032802c80121032000200f370024200041206a2003360000200041186a41003a00002000420037030820004201370300200424000f0b20004200370308200020032800a001360019200041186a41003a00002000411c6a200341a3016a28000036000020004200370300200424000f0b024020032802c0022207450d0020032802c4022208450d00200841216c450d00200710260b200320113703d002200320063602c802200320023602c402200320013602c002200341043a00c8012003200f3703d8020c020b2002450d00200241216c450d00200110260b20032d00c80122014104470d010b0240024020032802c0020d0020032802c00520032802c80510ff010c010b20032802c0052101200320032802c8053602e405200320013602e005200341c0026a200341e0056a10b5010b410421010b024020032802c0022202450d0020032802c4022206450d00200641216c450d00200210260b024020032802c405450d0020032802c00510260b20014104460d0120032902cc01210f0b20032802c80121032000200f370024200041206a2003360000200041186a41003a00002000420037030820004201370300200424000f0b20004200370308200020032800a001360019200041186a41003a00002000411c6a200341a3016a28000036000020004200370300200424000f0b20032d00c80122014104460d012003418a016a20032d00cb013a0000200320032f00c9013b01880120032902cc01210f2003280294022206450d02200641216c450d02200210260c020b200341a8026a2010370300200320113703a002200341043a00c8010b200341e0056a41186a20034190026a41186a290300370300200341e0056a41106a20034190026a41106a290300370300200341e0056a41086a20034190026a41086a2903003703002003200329039002220f3703e00502400240200fa722010d002007200810ff010c010b200320083602c402200320073602c002200341e0056a200341c0026a10b50120032802e4052202450d00200241216c450d00200110260b2003418a016a20032d00cb013a0000200320032f00c9013b01880120032902cc01210f410421010b024020032802a401450d00200710260b20014104460d010b200341c4016a41026a20034188016a41026a2d000022023a0000200320032f01880122063b01c401200041206a20013a0000200041186a41003a000020004200370308200020063b0021200041236a20023a00002000200f37002420004201370300200424000f0b200042003703082000200328009001360019200041186a41003a00002000411c6a20034193016a28000036000020004200370300200424000f0b200641ff01714104460d0202402009450d00200941216c450d00200a10260b200341e8016a41186a200341a0016a41186a290300370300200341e8016a41106a200341a0016a41106a290300370300200341e8016a41086a200341a0016a41086a290300370300200320032903a0013703e801411010242202450d00200241b889c70036020c200241013602082002428180808010370200411010242201450d00200141d089c70036020c20014101360208200142818080801037020020022002280200417f6a2207360200024020070d002002280208200228020c2802001103000240200228020c280204450d00200228020810260b20022002280204417f6a220736020420070d00200210260b200128020041016a220241014d0d0120012002360200410810242207450d00200720063a000420072001360200411010242202450d00200241e08bc70036020c20022007360208200242818080801037020020012001280200417f6a2206360200024020060d002001280208200128020c2802001103000240200128020c280204450d00200128020810260b20012001280204417f6a220636020420060d00200110260b200341c0026a200541b00210cf061a20034188056a41206a2201200341e8016a41206a2f01003b010020034188056a41186a2206200341e8016a41186a29030037030020034188056a41106a2207200341e8016a41106a29030037030020034188056a41086a2208200341e8016a41086a290300370300200320032903e80137038805024002402002280208200341c0026a200228020c28020c110100450d00200341e0056a200341c0026a41b00210cf061a200341a2086a2008290300370100200341aa086a2007290300370100200341b2086a2006290300370100200341ba086a20012f01003b010020034180023b019808200320032903880537019a08200320023602bc0820034190026a200341e0056a20034198086a10a303200329039002420151210120034190026a41206a2d00002106200329039802210f0c010b4102210620034190026a41206a41023a000020034190026a41186a41003a000020022002280200417f6a22013602004200210f20034200370398022003420137039002024020010d002002280208200228020c2802001103000240200228020c280204450d00200228020810260b20022002280204417f6a220136020420010d00200210260b200341c0026a109803410121010b2003200341b8026a2800003600b705200320032900b1023703b0050240024020010d00410421010c010b200320032800b7053600e705200320032903b0053703e00541042101200f4202510d00200320032800e7053600c702200320032903e0053703c002200621010b200320032903c00237039808200320032800c70236009f08200341e0056a41086a20013a0000200341e9056a200329039808370000200341e0056a41106a200328009f08360000200341003a00e4052003410e3a00e005200320032f0088053b00e50520032003418a056a2d00003a00e705200341f4056a20032902c002370200200341fc056a200341c0026a41086a29020037020020034184066a200341c0026a41106a2902003702002003418c066a200341d8026a29020037020020034194066a200341e0026a2902003702002003419c066a200341e8026a290200370200200341a4066a200341f0026a280200360200200341e0056a108702200341043a009001200510260c040b102c000b00000b20034190016a410310e70202402009450d00200941216c450d00200a10260b20032d009001210120051098032005102620014104460d010b20032802900121012000200329029401370024200041206a2001360000200041186a41003a00002000420037030820004201370300200424000f0b200042003703082000200328008801360019200041186a41003a00002000411c6a2003418b016a28000036000020004200370300200424000b930401057f230041e0006b22022400200241086a41b58dc700410510fb01200241186a41e0d7c600410710fb0102400240412010242203450d002002422037023c20022003360238200241386a41004120106d20022802382203200228024022046a22052001290000370000200541086a200141086a290000370000200541106a200141106a290000370000200541186a200141186a2900003700002002200441206a2201360240200241c8006a2003200110a202200241dc006a200320016a360200200220033602582002200241c8006a41086a3602542002200241c8006a360250200241286a200241d0006a10730240200228023c450d00200310260b2002280230220341206a2205417f4c0d010240024020050d0041012101410021050c010b200510242201450d010b20002001360200200041086a220141003602002000200536020420004100411010c9012000280200200128020022056a220420022900083700002001200541106a2205360200200441086a200241086a41086a29000037000020002005411010c9012000280200200128020022056a220420022900183700002001200541106a2206360200200441086a200241186a41086a2900003700002002280228210520002006200310c9012000280200200128020022006a2005200310cf061a2001200020036a3602000240200228022c450d00200510260b200241e0006a24000f0b1033000b1034000ba40904047f017e087f027e230041a0026b220324002003200236020c20032001360208200341106a200120021082020240024002400240200328021022040d00200041003602000c010b200328021421052003200341186a280200360224200320043602202003200341206a108f0102400240024020032802000d0020032802042206200328022441216e2201200120064b1bad42217e2207422088a70d042007a72201417f4c0d040240024020010d00410121080c010b200110242208450d060b4100210920034100360230200320083602282003200141216e36022c024002402006450d004100210a034041002102200341003a00d8012003280224417f6a2101200a41016a210a02400240024002400240024003402001417f460d01200341b8016a20026a2003280220220b2d00003a00002003200b41016a3602202003200241016a220c3a00d801200320013602242001417f6a2101200c2102200c4120470d000b20034180026a41186a2202200341b8016a41186a29030037030020034180026a41106a220d200341b8016a41106a29030037030020034180026a41086a220e200341b8016a41086a290300370300200320032903b80137038002200c41ff01714120490d0120034198016a41086a220f200e29030037030020034198016a41106a220e200d29030037030020034198016a41186a220d20022903003703002003200329038002370398012001417f460d01200b2d00012102200320013602242003200b41026a360220200241034b0d014100210c20020e0405040203050b200241ff0171450d00200341003a00d8010b200328022c2201450d07200141216c0d060c070b4102210c0c020b4103210c0c010b4101210c0b200341d8006a41086a200f2903002207370300200341d8006a41106a200e2903002210370300200341d8006a41186a200d2903002211370300200341386a41086a22022007370300200341386a41106a220b2010370300200341386a41186a220d2011370300200320032903980122073703582003200737033802402009200328022c470d00200341286a200910f30120032802282108200328023021090b2008200941216c6a2201200329033837000020022903002107200b2903002110200d29030021112001200c3a0020200141186a2011370000200141106a2010370000200141086a20073700002003200941016a2209360230200a2006470d000b0b2008450d01200329022c210720032802242201410f4b0d022007a72201450d01200141216c450d010b200810260b200341003602880220034201370380022003410e3602e4012003200341086a3602e001200320034180026a36029801200341cc016a4101360200200342013702bc012003418c8dc6003602b8012003200341e0016a3602c80120034198016a41c4e1c000200341b8016a10351a2003280280022003280288021084020240200328028402450d0020032802800210260b200041003602000c010b2000200737020420002008360200200041106a20032802202202290000370300200041186a200241086a2900003703002003200141706a3602242003200241106a3602200b2005450d00200410260b200341a0026a24000f0b1034000b1033000b4d01017f230041206b22002400200041146a410136020020004201370204200041dcedc6003602002000410436021c200041d4edc6003602182000200041186a360210200041ecc0c700103d000ba90201067f230041106b22022400024002400240200128020422034104490d0020012802002204280000210520012003417c6a3602042001200441046a3602002002200110e101200228020022030d01200041003602040c020b200041003602040c010b200241086a2802002106200228020421040240200128020422074104490d002000200436020820002003360204200020053602002000410c6a200636020020012802002203280000210420012007417c6a3602042001200341046a360200200041106a20043602000c010b2000410036020402402006450d002006410c6c21002003210103400240200141046a280200450d00200128020010260b2001410c6a2101200041746a22000d000b0b2004450d002004410c6c450d00200310260b200241106a24000bb30201067f230041106b220224000240024002402001280200220328020422044104490d0020032802002205280000210620032004417c6a3602042003200541046a3602002002200110d901200228020022030d01200041003602040c020b200041003602040c010b200241086a28020021052002280204210402402001280200220128020422074104490d002000200436020820002003360204200020063602002000410c6a200536020020012802002203280000210420012007417c6a3602042001200341046a360200200041106a20043602000c010b2000410036020402402005450d002005410c6c21002003210103400240200141046a280200450d00200128020010260b2001410c6a2101200041746a22000d000b0b2004450d002004410c6c450d00200310260b200241106a24000b800e05057f037e047f047e027f23004190046b22022400024002400240200128020022032802042204450d00200328020022052d0000210620032004417f6a3602042003200541016a3602002006417f6a220341024b0d000240024002400240024020030e03000102000b41002103200241003a00e80202400340200128020022042802042205450d01200241c8026a20036a200428020022062d00003a000020042005417f6a3602042004200641016a3602002002200341016a22033a00e80220034120470d000b20024190036a41086a200241c8026a41086a2903002207370300200241a8016a41186a200241c8026a41186a2903002208370300200241a8016a41106a200241c8026a41106a290300220937030020024188016a41186a200837030020024188016a41106a200937030020024188016a41086a2007370300200220022903c802370388014100210a0c030b200341ff0171450d04200241003a00e8020c040b41002103200241003a00e80202400340200128020022042802042205450d01200241c8026a20036a200428020022062d00003a000020042005417f6a3602042004200641016a3602002002200341016a22033a00e80220034120470d000b20024190036a41086a200241c8026a41086a2903002207370300200241a8016a41186a200241c8026a41186a2903002208370300200241a8016a41106a200241c8026a41106a290300220937030020024188016a41186a200837030020024188016a41106a200937030020024188016a41086a2007370300200220022903c802370388014101210a0c020b200341ff0171450d03200241003a00e8020c030b41002103200241003a00e8020340200128020022042802042205450d02200241c8026a20036a200428020022062d00003a000020042005417f6a3602042004200641016a3602002002200341016a22033a00e80220034120470d000b20024190036a41086a200241c8026a41086a2903002207370300200241a8016a41186a200241c8026a41186a2903002208370300200241a8016a41106a200241c8026a41106a290300220937030020024188016a41186a200837030020024188016a41106a200937030020024188016a41086a2007370300200220022903c802370388014102210a0b200241e8006a41186a20024188016a41186a290300370300200241e8006a41106a20024188016a41106a290300370300200241e8006a41086a20024188016a41086a290300370300200220022903880137036841002103200241003a0088030340200128020022042802042205450d03200241c8026a20036a200428020022062d00003a000020042005417f6a3602042004200641016a3602002002200341016a22033a008803200341c000470d000b20024190036a41086a2203200241c8026a41086a29030037030020024190036a41106a2204200241c8026a41106a29030037030020024190036a41186a2201200241c8026a41186a29030037030020024190036a41206a2205200241c8026a41206a29030037030020024190036a41286a2206200241c8026a41286a29030037030020024190036a41306a220b200241c8026a41306a29030037030020024190036a41386a220c200241c8026a41386a290300370300200220022903c80237039003200241a8016a41386a220d200c290300370300200241a8016a41306a200b2903002207370300200241a8016a41286a20062903002208370300200241a8016a41206a20052903002209370300200241a8016a41186a2001290300220e370300200241a8016a41106a2004290300220f370300200241a8016a41086a20032903002210370300200220022903900322113703a801200241086a41306a22032007370300200241086a41286a22042008370300200241086a41206a22012009370300200241086a41186a2205200e370300200241086a41106a2206200f370300200241086a41086a220b2010370300200241086a41386a220c200d29030037030020022011370308200241c8006a41186a220d200241e8006a41186a290300370300200241c8006a41106a2212200241e8006a41106a290300370300200241c8006a41086a2213200241e8006a41086a290300370300200220022903683703482000200a3a000020002002290348370001200041096a2013290300370000200041116a2012290300370000200041196a200d290300370000200041216a2002290308370000200041296a200b290300370000200041316a2006290300370000200041396a2005290300370000200041c1006a2001290300370000200041c9006a2004290300370000200041d1006a2003290300370000200041d9006a200c2903003700000c030b200341ff0171450d00200241003a00e8020b200041033a00000c010b0240200341ff0171450d00200241003a0088030b200041033a00000b20024190046a24000bc80c03067f017e067f23004190036b2202240002400240024020012802042203450d00200128020022042d0000210520012003417f6a3602042001200441016a3602002005417f6a220541024b0d0002400240024002400240024020050e03000102000b41002105200241003a00c8012003417f6a21062003417e6a21030240034020062005460d01200241a8016a20056a200420056a220741016a2d00003a0000200120033602042001200741026a3602002002200541016a22073a00c8012003417f6a21032007210520074120460d050c000b0b200541ff0171450d05200241003a00c8010c050b41002105200241003a00c8012003417f6a21062003417e6a21030240034020062005460d01200241a8016a20056a200420056a220741016a2d00003a0000200120033602042001200741026a3602002002200541016a22073a00c8012003417f6a21032007210520074120460d030c000b0b200541ff0171450d04200241003a00c8010c040b41002105200241003a00c8012003417f6a21062003417e6a210302400240034020062005460d01200241a8016a20056a200420056a220741016a2d00003a0000200120033602042001200741026a3602002002200541016a22073a00c8012003417f6a21032007210520074120460d020c000b0b200541ff0171450d04200241003a00c8010c040b200241d0026a41086a2205200241a8016a41086a290300370300200241d0026a41106a2204200241a8016a41106a290300370300200241d0026a41186a2203200241a8016a41186a290300370300200220022903a8013703d002200741ff0171411f4d0d03200241b0026a41186a2003290300220837030020024188016a41086a200529030037030020024188016a41106a200429030037030020024188016a41186a2008370300200220022903d00237038801410221050c020b200241d0026a41086a2205200241a8016a41086a290300370300200241d0026a41106a2204200241a8016a41106a290300370300200241d0026a41186a2203200241a8016a41186a290300370300200220022903a8013703d002200741ff0171411f4d0d02200241b0026a41186a2003290300220837030020024188016a41086a200529030037030020024188016a41106a200429030037030020024188016a41186a2008370300200220022903d00237038801410121050c010b200241d0026a41086a2205200241a8016a41086a290300370300200241d0026a41106a2204200241a8016a41106a290300370300200241d0026a41186a2203200241a8016a41186a290300370300200220022903a8013703d002200741ff0171411f4d0d01200241b0026a41186a2003290300220837030020024188016a41086a200529030037030020024188016a41106a200429030037030020024188016a41186a2008370300200220022903d00237038801410021050b200241e8006a41186a220420024188016a41186a290300370300200241e8006a41106a220320024188016a41106a290300370300200241e8006a41086a220720024188016a41086a2903003703002002200229038801370368200241a8016a200110dc0120022d00a8014101470d01200041033a00000c020b200041033a00000c010b200241c0006a2201200241a8016a41396a290000370300200241386a2206200241a8016a41316a290000370300200241306a2209200241a8016a41296a290000370300200241286a220a200241a8016a41216a290000370300200241086a41186a220b200241a8016a41196a290000370300200241086a41106a220c200241a8016a41116a290000370300200241086a41086a220d200241a8016a41096a290000370300200241c8006a41086a220e2007290300370300200241c8006a41106a22072003290300370300200241c8006a41186a22032004290300370300200220022900a90137030820022002290368370348200020053a000020002002290348370001200041096a200e290300370000200041116a2007290300370000200041196a2003290300370000200041216a2002290308370000200041296a200d290300370000200041316a200c290300370000200041396a200b290300370000200041c1006a200a290300370000200041c9006a2009290300370000200041d1006a2006290300370000200041d9006a20012903003700000b20024190036a24000bb90101037f20004201370200200041086a2202410036020020012802002103200041004104106d2000280200200228020022046a20033600002002200441046a3602002001280204210320002001410c6a280200220410a10102402004450d0020032004410c6c6a210403402003280200200341086a28020020001095012003410c6a22032004470d000b0b20012802102103200020022802004104106d2000280200200228020022006a20033600002002200041046a3602000bd70603057f017e027f230041a0046b2202240041002103200241003a009003024002400240024002400340200128020022042802042205450d01200241f0026a20036a200428020022062d00003a000020042005417f6a3602042004200641016a3602002002200341016a22033a00900320034120470d000b20024190026a41186a200241f0026a41186a2903002207370300200241f0016a41086a200241f0026a41086a290300370300200241f0016a41106a200241f0026a41106a290300370300200241f0016a41186a2007370300200220022903f0023703f0012001280200220328020422044108490d022003280200220529000021072003200441786a3602042003200541086a360200200241f0026a200110e50220022802f4022206450d03200241fc026a280200210320022802f802210820022802f002210420024190026a200241f0026a41106a41e00010cf061a200241f0026a200110e50220022802f402450d01200241206a200241f0026a41f00010cf061a200241086a2205200241f0016a41086a290300370300200241106a2201200241f0016a41106a290300370300200241186a2209200241f0016a41186a290300370300200220022903f00137030020024190016a20024190026a41e00010cf061a200041146a2003360200200020083602102000200636020c2000200436020820002007370300200041186a20024190016a41e00010cf061a200041f8006a200241206a41f00010cf061a20004180026a2009290300370300200041f8016a2001290300370300200041f0016a2005290300370300200041e8016a20022903003703000c040b0240200341ff0171450d00200241003a0090030b2000410036020c0c030b2000410036020c02402003450d00200341246c21042006210303400240024020032d0000220541044b0d0002400240024020050e050400010204040b2003410c6a280200450d03200341086a28020010260c030b2003410c6a280200450d02200341086a28020010260c020b2003410c6a280200450d01200341086a28020010260c010b200341086a280200450d00200341046a28020010260b200341246a21032004415c6a22040d000b0b2008450d02200841246c450d02200610260c020b2000410036020c0c010b2000410036020c0b200241a0046a24000ba70703067f017e017f230041a0046b2202240041002103200241003a00900320012802042104417f21050240024002400240034020042003460d01200241f0026a20036a200128020022062d00003a00002001200420056a3602042001200641016a3602002002200341016a22063a0090032005417f6a21052006210320064120470d000b20024190026a41086a2203200241f0026a41086a29030037030020024190026a41106a2205200241f0026a41106a29030037030020024190026a41186a2207200241f0026a41186a290300370300200220022903f00237039002200641ff0171411f4b0d010c020b200341ff0171450d01200241003a0090030c010b200241f0016a41086a2003290300370300200241f0016a41106a2005290300370300200241f0016a41186a200729030037030020022002290390023703f00102400240200420066b22034108490d002001280200220529000021082001200341786a3602042001200541086a360200200241f0026a200110e30220022802f4022206450d01200241fc026a280200210320022802f802210420022802f002210520024190026a200241f0026a41106a41e00010cf061a200241f0026a200110e302024020022802f402450d00200241206a200241f0026a41f00010cf061a200241086a2201200241f0016a41086a290300370300200241106a2207200241f0016a41106a290300370300200241186a2209200241f0016a41186a290300370300200220022903f00137030020024190016a20024190026a41e00010cf061a200041146a2003360200200020043602102000200636020c2000200536020820002008370300200041186a20024190016a41e00010cf061a200041f8006a200241206a41f00010cf061a20004180026a2009290300370300200041f8016a2007290300370300200041f0016a2001290300370300200041e8016a20022903003703000c040b2000410036020c02402003450d00200341246c21012006210303400240024020032d0000220541044b0d0002400240024020050e050400010204040b2003410c6a280200450d03200341086a28020010260c030b2003410c6a280200450d02200341086a28020010260c020b2003410c6a280200450d01200341086a28020010260c010b200341086a280200450d00200341046a28020010260b200341246a21032001415c6a22010d000b0b2004450d03200441246c450d03200610260c030b2000410036020c0c020b2000410036020c0c010b2000410036020c0b200241a0046a24000b130020004101360204200041d0f6c6003602000b3400200041bb8cc70036020420004100360200200041146a4105360200200041106a41a4f8c600360200200041086a420f3702000b130020004102360204200041f4fdc6003602000b4a01017f02404104102422020d001033000b2000420437020420002002360200200041004104106d2000280200200041086a220028020022026a41e5003600002000200241046a3602000ba50101027f230041206b2204240002400240024002402001412c6a22052002460d0020022005412010d206450d00200441186a200241186a290000370300200441106a200241106a290000370300200441086a200241086a290000370300200420022900003703002001200410ff0322020d010c020b2000200141206a10c8010c020b200228020c4101480d002000200210c8010c010b200041003602000b200441206a24000bfc0301057f23004180016b22042400200328020021050240024002400240024020032802082206200041286a280200470d00200520002802202207460d0120052007200610d206450d010b200441c0006a41186a2206200141186a290000370300200441c0006a41106a2207200141106a290000370300200441c0006a41086a2208200141086a29000037030020042001290000370340200441086a2000200441c0006a10eb0520042802084101470d01200441c0006a41286a200441386a290300370300200441c0006a41206a200441086a41286a2903003703002006200441086a41206a2903003703002007200441086a41186a2903003703002008200441086a41106a29030037030020042004290310370340200441f0006a41086a200341086a2802003602002004410136027c20042003290200370370200441c0006a200441f0006a10ec050c030b200341046a280200450d020c010b0240200428020c2206417c6a2201280200220041004a0d00200641706a2105200441c0006a41086a2207200341086a280200360200200420032902003703400240200641746a280200450d0020052802001026200128020021000b20052004290340370200200541086a20072802003602002001200041016a3602000c020b2001200041016a360200200341046a280200450d010b200510260b20044180016a24000be50403017f027e0a7f230041106b220324002003200129030042adfed5e4d485fda8d8007e220442a0cbbf9599b5a19f0a7c2205200229001885200229000020058542adfed5e4d485fda8d8007e42178942adfed5e4d485fda8d8007e852002290008200442efcdddd088a580a21e7c8542adfed5e4d485fda8d8007e42178942adfed5e4d485fda8d8007e852002290010200442bed0fb8bf894dfa4327c8542adfed5e4d485fda8d8007e42178942adfed5e4d485fda8d8007e85420042adfed5e4d485fda8d800420010cc0620012802102206200141086a2903002204200341086a29030020032903007c852004892204a72207712108200741197641818284086c2109200141146a280200210a4100210b02400340200a20086a280000220c2009732207417f73200741fffdfb776a71418081828478712107200b41046a220b20086a200671210d0340024020070d00200d2108200c200c4101747141808182847871450d0220004101360200200041106a2001360200200041086a2004370300200041146a20022900003700002000411c6a200241086a290000370000200041246a200241106a2900003700002000412c6a200241186a2900003700000c030b0240200a410020076841037620086a2006716b41306c6a220e41506a220f2002460d002007417f6a2007712107200f2002412010d2060d010b0b0b2000200e360204200041003602002000410c6a41013a0000200041086a20013602002000410d6a2002290000370000200041156a200241086a2900003700002000411d6a200241106a290000370000200041256a200241186a2900003700000b200341106a24000be60403027f017e067f230041d0006b2202240020022000280208220336020c20002903002104200241386a200141086a290200370300200241286a200041246a290200370300200241106a41106a2000411c6a290200370300200241106a41086a200041146a290200370300200220012902003703302002200029020c370310200341106a2105200328021022062004a72207712101200341146a28020021084104210003402001220920006a2006712101200041046a2100200820096a28000041808182847871220a450d000b02402008200a6841037620096a20067122006a2c000022014100480d0020082008280200418081828478716841037622006a2d000021010b200341186a280200210902402001410171220a450d0020090d00200241c0006a20052002410c6a10ba02200328021022062007712101200341146a28020021084104210003402001220920006a2006712101200041046a2100200820096a280000418081828478712205450d000b0240200820056841037620096a20067122006a2c00004100480d002008280200418081828478716841037621000b200328021821090b20032009200a6b360218200820006a200741197622013a000020062000417c6a7120086a41046a20013a00002008410020006b41306c6a41506a220041286a200241106a41286a290300370200200041206a200241106a41206a290300370200200041186a200241106a41186a290300370200200041106a200241106a41106a290300370200200041086a200241106a41086a290300370200200020022903103702002003411c6a2200200028020041016a360200200241d0006a24000bb70201047f23004180016b2203240002402000412c6a22042001460d0020012004412010d206450d00200341c0006a41186a2204200141186a290000370300200341c0006a41106a2205200141106a290000370300200341c0006a41086a2206200141086a29000037030020032001290000370340200341086a2000200341c0006a10eb05024020032802084101470d00200341c0006a41286a200341386a290300370300200341c0006a41206a200341086a41286a2903003703002004200341086a41206a2903003703002005200341086a41186a2903003703002006200341086a41106a29030037030020032003290310370340200342808080807037037820034201370370200341c0006a200341f0006a10ec050c010b200328020c417c6a22012001280200417f6a3602000b20034180016a24000b8d0101037f230041206b220324004101210402402000412c6a22052001460d0020012005412010d206450d00200341186a200141186a290000370300200341106a200141106a290000370300200341086a200141086a2900003703002003200129000037030002402000200310ff0322010d00410021040c010b200128020c41004a21040b200341206a240020040b1300200041e880c700360204200020013602000b1300200041e880c700360204200020013602000ba10101027f230041206b220424000240024002402001412c6a22052002460d0020022005412010d206450d00200441186a200241186a290000370300200441106a200241106a290000370300200441086a200241086a290000370300200420022900003703002001200410ff032202450d01200228020c4101480d012000200210c8010c020b2000200141206a10c8010c010b200041003602000b200441206a24000b8d0101037f230041206b220324004101210402402000412c6a22052001460d0020012005412010d206450d00200341186a200141186a290000370300200341106a200141106a290000370300200341086a200141086a2900003703002003200129000037030002402000200310ff0322010d00410021040c010b200128020c41004a21040b200341206a240020040b1300200041023602042000419081c7003602000bfa0c01037f230041e0006b2202240002402001450d00200241d4006a41043602002002411c6a41023602002002420237020c200241b882c7003602082002410436024c200241b082c7003602482002410036025c200241d4c0c7003602582002200241c8006a3602182002200241d8006a360250200241086a41c882c700103d000b200241c0006a41002902a08a47370300200241086a41306a220141002902988a47370300200241306a41002902908a47370300200241286a41002902888a47370300200241206a41002902808a47370300200241186a220341002902f88947370300200241086a41086a41002902f08947370300200241002902e889473703082002410036025020024201370348200241c8006a200241086a10a301200241c8006a200310a301200241c8006a20022802504104106d2002280248200228025022036a41023600002002200341046a2203360250200241c8006a20034104106d2002280248200228025022036a41003600002002200341046a2203360250200241c8006a20034104106d2002280248200228025022036a41003600002002200341046a220336025020012802002101200241c8006a20034101106d2002280248200228025022036a41303a00002002200341016a2203360250200241c8006a20034108106d2002280248200228025022036a20012900003700002002200341086a220336025020012802082104200241c8006a20034104106d2002280248200228025022036a20043600002002200341046a2203360250200241c8006a20034108106d2002280248200228025022036a200129000c3700002002200341086a220336025020012802142104200241c8006a20034104106d2002280248200228025022036a20043600002002200341046a2203360250200241c8006a20034108106d2002280248200228025022036a20012900183700002002200341086a220336025020012802202104200241c8006a20034104106d2002280248200228025022036a20043600002002200341046a2203360250200241c8006a20034108106d2002280248200228025022036a20012900243700002002200341086a2203360250200128022c2104200241c8006a20034104106d2002280248200228025022036a20043600002002200341046a2203360250200241c8006a20034108106d2002280248200228025022036a20012900303700002002200341086a220336025020012802382104200241c8006a20034104106d2002280248200228025022036a20043600002002200341046a2203360250200241c8006a20034108106d2002280248200228025022036a200129003c3700002002200341086a220336025020012802442104200241c8006a20034104106d2002280248200228025022036a20043600002002200341046a2203360250200241c8006a20034108106d2002280248200228025022036a20012900483700002002200341086a220336025020012802502104200241c8006a20034104106d2002280248200228025022036a20043600002002200341046a2203360250200241c8006a20034108106d2002280248200228025022036a20012900543700002002200341086a2203360250200128025c2104200241c8006a20034104106d2002280248200228025022036a20043600002002200341046a2203360250200241c8006a20034108106d2002280248200228025022036a20012900603700002002200341086a220336025020012802682104200241c8006a20034104106d2002280248200228025022036a20043600002002200341046a2203360250200241c8006a20034108106d2002280248200228025022036a200129006c3700002002200341086a220336025020012802742104200241c8006a20034104106d2002280248200228025022036a20043600002002200341046a2203360250200241c8006a20034108106d2002280248200228025022036a20012900783700002002200341086a22033602502001280280012104200241c8006a20034104106d2002280248200228025022036a20043600002002200341046a2203360250200241c8006a20034108106d2002280248200228025022036a2001290084013700002002200341086a2203360250200128028c012101200241c8006a20034104106d2002280248200228025022036a20013600002002200341046a2201360250200241c8006a20014104106d20022802482201200228025022036a4100360000200241e0006a2400200341046aad4220862001ad840bdc1e02097f017e230041d00d6b220224002002428080808080203702b4052002200136020c2002200041d4c0c70020011b3602082002200241086a3602b005200241f0096a200241b0056a10e50202400240024020022802f4092203450d00200241fc096a280200210420022802f809210520022802f009210620024198066a200241800a6a41e00010cf061a200241f0096a200241b0056a10d20120022802f00922070d0102402004450d00200441246c21002003210103400240024020012d0000220841044b0d0002400240024020080e050400010204040b2001410c6a280200450d03200141086a28020010260c030b2001410c6a280200450d02200141086a28020010260c020b2001410c6a280200450d01200141086a28020010260c010b200141086a280200450d00200141046a28020010260b200141246a21012000415c6a22000d000b0b2005450d00200541246c450d00200310260b200241e8006a200241d8026a41e00010cf061a0c010b200241f8096a280200210920022802f409210a200241d8026a20024198066a41e00010cf061a200241e8006a200241d8026a41e00010cf061a200241e8016a200241e8006a41e00010cf061a0240024020022802b005280204450d0002402004450d00200441246c21002003210103400240024020012d0000220841044b0d0002400240024020080e050400010204040b2001410c6a280200450d03200141086a28020010260c030b2001410c6a280200450d02200141086a28020010260c020b2001410c6a280200450d01200141086a28020010260c010b200141086a280200450d00200141046a28020010260b200141246a21012000415c6a22000d000b0b02402005450d00200541246c450d00200310260b02402009450d00200941c8036c210020074198016a21010340200110d501200141c8036a2101200041b87c6a22000d000b0b41002103200a450d01200a41c8036c450d01200710260c010b200241f0096a200241e8016a41e00010cf061a0b2003450d00200241086a200241f0096a41e00010cf061a200241f4006a2004360200200241e8006a41086a20053602002002200336026c20022006360268200241e8006a41106a200241086a41e00010cf062101200241e0016a2009360200200241dc016a200a360200200220073602d801200241e8006a10b50502400240024020022802682200450d00200241e8016a2000417f6a10b004200241f0096a20022802e801220020022802f00110b80320024198066a41086a200241f9096a29000037030020024198066a41106a200241810a6a29000037030020024198066a41186a2208200241890a6a290000370300200220022900f109370398060240024020022d00f0094101460d00200241d8026a41186a4200370300200241e8026a4200370300200241e0026a4200370300200242003703d8020c010b200241d8026a41186a2008290300370300200241d8026a41106a20024198066a41106a290300370300200241d8026a41086a20024198066a41086a29030037030020022002290398063703d8020b024020022802ec01450d00200010260b200241d8026a2001412010d2060d0020022802d801210020022802e0012105200241003602e002200242043703d802200241d8026a4100200510cb0120022802e002210302402005450d00200541c8036c210820022802d8022003410c6c6a21012003200541037441786a4103766a210303402002200036029806200241f0096a20024198066a10af04200141086a200241f0096a41086a280200360200200120022903f0093702002001410c6a2101200041c8036a2100200841b87c6a22080d000b200341016a21030b200220033602e002200241a0066a2003360200200220022903d80237039806200241f0096a20024198066a10f6050240200241b8016a2201200241f0096a412010d206450d0041d5afc700410e1084022001412010f705200241f0096a412010f7050b02402001200241f0096a412010d2060d0010f80520022802dc01210a20022802d801210520022802e0012108200241e8016a200241e8006a41f00010cf061a2005200841c8036c6a210020022802e8012104200521010240024002402008450d0020024198066a41f0006a21032005210102400340200241b0056a200141e80010cf061a200141e8006a290300210b200241d8026a200141f0006a41d80210cf061a200b4203510d0120024198066a200241b0056a41e80010cf061a2002200b370380072003200241d8026a41d80210cf061a200220024198066a3602e009200241f0096a200241e0096a10af0420022802f8092108024020022802f409450d0020022802f00910260b200241f0096a20024198066a41c80310cf061a200241003602b80d200241e0096a200241f0096a2008200241b80d6a10b70520022d00e0094101460d04200141c8036a22012000470d000c030b0b200141c8036a21010b20002001460d00034020014198016a10d5012000200141c8036a2201470d000b0b0240200a450d00200a41c8036c450d00200510260b10bf04200410fa01024010f905450d00200241f0096a10c8042002200241e8016a410c6a28020022033602c80d2002200241f0096a410c6a28020022013602cc0d20032001470d052003450d0420022802f409210520022802ec01210a410021080340024002400240024002400240024002400240200a20086a22012d00002204200520086a22002d0000470d0002400240024002400240024020040e06000102030405000b200a2005460d0d200141016a200041016a412010d2060d050c060b0240200a2005460d00200141016a280000200041016a280000470d050b200141106a2802002204200041106a280200470d04200141086a2802002209200041086a2802002207460d0a20092007200410d2060d040c0a0b0240200a2005460d00200141016a280000200041016a280000470d040b200141106a2802002204200041106a280200470d03200141086a2802002209200041086a2802002207460d0820092007200410d2060d030c080b0240200a2005460d00200141016a280000200041016a280000470d030b200141106a2802002204200041106a280200470d02200141086a2802002209200041086a2802002207460d0620092007200410d2060d020c060b200141046a2802002204200041046a280200470d012004450d04200141086a280200200041086a280200470d012001410c6a2802002000410c6a280200470d010c040b2001410c6a28020022042000410c6a280200470d00200141046a2802002209200041046a2802002207460d0220092007200410d206450d020b419786c600411410840220024198066a200110a201200228029806220420022802a00610f7050240200228029c06450d00200410260b20024198066a200010a201200228029806220420022802a00610f7050240200228029c06450d00200410260b20012d000020002d00002204470d06024020040e06000605040302000b200a2005460d070b200141016a200041016a412010d2060d050c060b2001410c6a28020022042000410c6a280200470d04200141046a2802002201200041046a2802002200460d0520012000200410d2060d040c050b200141046a2802002204200041046a280200470d032004450d04200141086a280200200041086a280200470d032001410c6a2802002000410c6a280200460d040c030b0240200a2005460d00200141016a280000200041016a280000470d030b200141106a2802002204200041106a280200470d02200141086a2802002201200041086a2802002200460d0320012000200410d2060d020c030b0240200a2005460d00200141016a280000200041016a280000470d020b200141106a2802002204200041106a280200470d01200141086a2802002201200041086a2802002200460d0220012000200410d2060d010c020b0240200a2005460d00200141016a280000200041016a280000470d010b200141106a2802002204200041106a280200470d00200141086a2802002201200041086a2802002200460d0120012000200410d206450d010b419088c600412741dcbcc700102f000b200841246a21082003417f6a22030d000c050b0b41df88c600411e41dcbcc700102f000b200220022f00e10920022d00e3094110747210d1042002280200200228020441dcbcc700102f000b41e487c600412441dcbcc700102f000b41c887c600411c41dcbcc700102f000b0240200241e8016a41306a2201200241f0096a41306a2200412010d206450d0041d5afc700410e1084022001412010f7052000412010f7050b024020012000412010d206450d0041b788c600412841dcbcc700102f000b024020022802fc092200450d0020022802f4092101200041246c210003400240024020012d0000220841044b0d0002400240024020080e050400010204040b2001410c6a280200450d03200141086a28020010260c030b2001410c6a280200450d02200141086a28020010260c020b2001410c6a280200450d01200141086a28020010260c010b200141086a280200450d00200141046a28020010260b200141246a21012000415c6a22000d000b0b0240200241f8096a2802002201450d00200141246c450d0020022802f40910260b024020022802f4012200450d0020022802ec012101200041246c210003400240024020012d0000220841044b0d0002400240024020080e050400010204040b2001410c6a280200450d03200141086a28020010260c030b2001410c6a280200450d02200141086a28020010260c020b2001410c6a280200450d01200141086a28020010260c010b200141086a280200450d00200141046a28020010260b200141246a21012000415c6a22000d000b0b0240200241f0016a2802002201450d00200141246c450d0020022802ec0110260b200241d00d6a240042010f0b200241d8026a41146a4109360200200241d8026a410c6a4115360200200241b0056a41146a41033602002002200241c80d6a3602b80d2002200241cc0d6a3602e00920024198066a41146a4100360200200242033702b405200241d4c0c7003602b005200241153602dc02200241d4c0c7003602a8062002420137029c062002418888c600360298062002200241d8026a3602c005200220024198066a3602e8022002200241e0096a3602e0022002200241b80d6a3602d802200241b0056a41ecc0c700103d000b200241e4026a4104360200200241ac066a41023602002002420237029c06200241b882c70036029806200241043602dc02200241bc83c7003602d8022002410036026c200241d4c0c7003602682002200241d8026a3602a8062002200241e8006a3602e00220024198066a41c882c700103d000bd90301097f230041206b220224000240024020012802082203410c6c41046a2204417f4c0d00200128020021050240024020040d0041012106410021040c010b200410242206450d020b20024100360208200220063602002002200436020420032002106c0240024020030d0020022802002107200228020821060c010b20052003410c6c6a210820052104034020042802002109200441086a28020022062002106c200220022802082006106d200228020022072002280208220a6a2009200610cf061a2002200a20066a22063602082004410c6a22042008470d000b0b20022802042109200241186a220a2006ad4220862007ad84100b220441186a290000370300200241106a2206200441106a290000370300200241086a2208200441086a2900003703002002200429000037030020041026200041186a200a290300370000200041106a2006290300370000200041086a20082903003700002000200229030037000002402009450d00200710260b02402003450d002003410c6c21062005210403400240200441046a280200450d00200428020010260b2004410c6a2104200641746a22060d000b0b0240200141046a2802002204450d002004410c6c450d00200510260b200241206a24000f0b1034000b1033000b0e002001ad4220862000ad84100c0b0400100a0b070010044101460b8e0601067f230041d0026b2202240020024280808080802037020c2002200136021c2002200041d4c0c70020011b3602182002200241186a360208200241e0016a200241086a10e502200241ec016a280200210320022802e801210420022802e401210520022802e001210620024180016a200241f0016a41e00010cf061a02402005450d00200241206a20024180016a41e00010cf061a024002402002280208280204450d0002402003450d00200341246c21002005210103400240024020012d0000220741044b0d0002400240024020070e050400010204040b2001410c6a280200450d03200141086a28020010260c030b2001410c6a280200450d02200141086a28020010260c020b2001410c6a280200450d01200141086a28020010260c010b200141086a280200450d00200141046a28020010260b200141246a21012000415c6a22000d000b0b410021012004450d01200441246c450d01200510260c010b20024180016a200241206a41e00010cf061a200521010b2001450d00200241e0016a410c6a22002003360200200241e0016a41086a2004360200200220013602e401200220063602e001200241f0016a20024180016a41e00010cf061a200241e0016a10b505024020002802002200450d0020022802e4012101200041246c210003400240024020012d0000220741044b0d0002400240024020070e050400010204040b2001410c6a280200450d03200141086a28020010260c030b2001410c6a280200450d02200141086a28020010260c020b2001410c6a280200450d01200141086a28020010260c010b200141086a280200450d00200141046a28020010260b200141246a21012000415c6a22000d000b0b024020022802e8012201450d00200141246c450d0020022802e40110260b200241d0026a240042010f0b2002412c6a4104360200200241f4016a4102360200200242023702e401200241b882c7003602e00120024104360224200241d483c7003602202002410036020c200241d4c0c7003602082002200241206a3602f0012002200241086a360228200241e0016a41c882c700103d000b980d03067f017e047f230041306b22022400024002400240024020010d0020024100360220200242043703180240024002400240410810242201450d0020014110360204200141a0b8c0003602002002200141086a36020c200220013602082002410136020420022001360200200241186a2002108b01410810242201450d002001410e360204200141ca92c4003602002002200141086a36020c200220013602082002410136020420022001360200200241186a2002108b01410810242201450d002001410c360204200141be92c4003602002002200141086a36020c200220013602082002410136020420022001360200200241186a2002108b01410810242201450d002001410e360204200141c5f3c4003602002002200141086a36020c200220013602082002410136020420022001360200200241186a2002108b01410810242201450d002001410a360204200141d892c4003602002002200141086a36020c200220013602082002410136020420022001360200200241186a2002108b01410810242201450d002001410b360204200141d4eec6003602002002200141086a36020c200220013602082002410136020420022001360200200241186a2002108b01410810242201450d0020014118360204200141d3f3c4003602002002200141086a36020c200220013602082002410136020420022001360200200241186a2002108b01410810242201450d0020014116360204200141b0b8c0003602002002200141086a36020c200220013602082002410136020420022001360200200241186a2002108b01410810242201450d0020014119360204200141ebf3c4003602002002200141086a36020c200220013602082002410136020420022001360200200241186a2002108b0120022802182103200228021c21040240200228022022010d004100210541042106410021070c040b20014104200141044b1bad420c7e2208422088a722070d052008a722094100480d0520074541027421072009450d012009102422060d022007450d050b102c000b200721060b200320014103746a210a2009410c6e2105200141037441786a41037641016a210b41002107200621012003210903402009280200220c450d01200141086a200941046a280200360200200141046a200c360200200141003602002001410c6a2101200741016a2107200941086a2209200a470d000b200b21070b0240200441ffffffff0171450d00200310260b2002410036020820024201370300200241004104106d2002280200200228020822016a41edcad18b063600002002200141046a2201360208200220014101106d2002280200200228020822016a410b3a00002002200141016a36020841bc8dc700411a20021071200220022802084101106d2002280200200228020822016a41043a00002002200141016a36020820072002106c0240024020070d0020022802082109200228020021030c010b2007410c6c2107200641086a210103402001417c6a280200210c200128020022092002106c200220022802082009106d200228020022032002280208220a6a200c200910cf061a2002200a20096a22093602082001410c6a2101200741746a22070d000b0b2002280204210702402005450d002005410c6c450d00200610260b200941046a2201417f4c0d020240024020010d004101210c410021010c010b20011024220c450d040b200241003602082002200c360200200220013602040240024002400240200941c000490d00200941808001490d012009418080808004490d02200241004101106d2002280200200228020822016a41033a00002002200141016a2201360208200220014104106d2002280200200228020822016a2009360000200141046a21010c030b200241004101106d2002280200200228020822016a20094102743a0000200141016a21010c020b200241004102106d2002280200200228020822016a20094102744101723b0000200141026a21010c010b200241004104106d2002280200200228020822016a2009410274410272360000200141046a21010b20022001360208200220012009106d200228020022012002280208220c6a2003200910cf061a200c20096aad4220862001ad84210802402007450d00200310260b200241306a240020080f0b200241246a4104360200200241146a410236020020024202370204200241b882c7003602002002410436021c200241ec83c7003602182002410036022c200241d4c0c7003602282002200241186a3602102002200241286a360220200241c882c700103d000b102e000b1034000b1033000b9c0604017f017e017f017e230041e00b6b2202240020024280808080802037020c200220013602d40b2002200041d4c0c70020011b3602d00b2002200241d00b6a36020820024188086a200241086a10d301200241c8036a20024188086a41e80010cf061a20022903f0082103200241f0006a20024188086a41f0006a41d80210cf061a0240024020034203510d00200241b0046a200241c8036a41e80010cf061a2002200337039805200241b0046a41f0006a200241f0006a41d80210cf062101024002402002280208280204450d00200241c8056a109803420321030c010b200241c8036a200241b0046a41e80010cf061a20024188086a200141d80210cf061a0b20034203510d00200241086a200241c8036a41e80010cf061a200241f0006a20024188086a41d80210cf061a200241b0046a200241086a41e80010cf061a2002200337039805200241a0056a200241f0006a41d80210cf061a2002200241b0046a36028808200241f8076a20024188086a10af04200228028008210120024188086a200241b0046a41c80310cf061a200241d80b6a200228028008360200200220022903f8073703d00b200241c8036a20024188086a2001200241d00b6a10b7054101410220022d00c80322014101461b220010242204450d0120024100360290082002200036028c0820022004360288080240024020014101470d0020024188086a41004101106d20022802880820022802900822016a41013a00002002200141016a36029008200241c8036a41017220024188086a10ae040c010b20024188086a41004101106d20022802880820022802900822016a41003a00002002200141016a3602900820022d00cc0320022d00cd0320022d00ce0320024188086a10f8020b20023502900821032002350288082105200241e00b6a240020052003422086840f0b200241fc006a4104360200200241c4046a4102360200200242023702b404200241b882c7003602b00420024104360274200241fc83c7003602702002410036020c200241d4c0c7003602082002200241f0006a3602c0042002200241086a360278200241b0046a41c882c700103d000b1033000bac0d020b7f027e230041e0016b220224000240024020010d0010bf0420024180016a41186a2203420037030020024180016a41106a2204420037030020024180016a41086a220542003703002002420037038001200241a0016a41808cc700410610fb012005200241a0016a41086a2206290000370300200220022900a00137038001200241a0016a41ea93c400410610fb0120032006290000370300200420022900a001370300200241086a20024180016a412010890241002101200228020c410020022802081b10fa012003420037030020044200370300200542003703002002420037038001200241a0016a41808cc700410610fb0120052006290000370300200220022900a00137038001200241a0016a4190bbc400410e10fb0120032006290000370300200420022900a001370300200220024180016a4120108902200241003602b801200242043703b001200241b0016a41002002280204410020022802001b220710cb0120022802b801210802402007450d0020022802b0012008410c6c6a21090340200241c0016a200110b904200241106a20022802c001220a20022802c801220b109d02024002402002280210220c0d004200210d4101210c0c010b200a200b10ff012002290214210d0b200141016a2101024020022802c401450d00200a10260b2009200c360200200941046a200d3702002009410c6a210920072001470d000b200820076a21080b200220083602b801200241106a41086a22012008360200200220022903b001370310200241c0016a200241106a10f605200241106a41186a200241c0016a41186a290300370300200241106a41106a200241c0016a41106a2903003703002001200241c0016a41086a290300370300200220022903c0013703102003420037030020044200370300200542003703002002420037038001200241a0016a41808cc700410610fb0120052006290000370300200220022900a00137038001200241a0016a418094c400410e10fb01200441086a2006290000370000200420022900a001370000412010242201450d01200242203702a401200220013602a001200241a0016a41004120106d20022802a001220920022802a801220c6a22012002290310370000200141086a200241106a41086a290300370000200141106a200241106a41106a220a290300370000200141186a200241106a41186a2903003700002002200c41206a22013602a80120024180016a41202009200110b301024020022802a401450d00200910260b200241106a10c804200241003602c801200242013703c0012002200241c0016a36028001200a20024180016a109c0102400240024002402002280210220141c000490d00200141808001490d012001418080808004490d02200241c0016a20022802c8014101106d20022802c00120022802c80122096a41033a00002002200941016a22093602c801200241c0016a20094104106d20022802c00120022802c80122096a20013600002002200941046a3602c8010c030b200241c0016a20022802c8014101106d20022802c00120022802c80122096a20014102743a00002002200941016a3602c8010c020b200241c0016a20022802c8014102106d20022802c00120022802c80122096a20014102744101723b00002002200941026a3602c8010c010b200241c0016a20022802c8014104106d20022802c00120022802c80122096a20014102744102723600002002200941046a3602c8010b2002200241c0016a36028001200241c0006a20024180016a109c012002200241c0016a36028001200241e0006a20024180016a109c01200241c0016a200241106a41047210a00120023502c801422086210d20023502c001210e2002280214210a0240200241106a410c6a2802002201450d00200141246c2109200a210103400240024020012d0000220c41044b0d00024002400240200c0e050400010204040b2001410c6a280200450d03200141086a28020010260c030b2001410c6a280200450d02200141086a28020010260c020b2001410c6a280200450d01200141086a28020010260c010b200141086a280200450d00200141046a28020010260b200141246a21012009415c6a22090d000b0b200d200e84210d0240200241186a2802002201450d00200141246c450d00200a10260b200241e0016a2400200d0f0b200241cc016a4104360200200241246a410236020020024202370214200241b882c700360210200241043602c4012002419484c7003602c0012002410036028401200241d4c0c700360280012002200241c0016a360220200220024180016a3602c801200241106a41c882c700103d000b1033000bc81b05017f017e027f017e107f230041a0066b220224002002428080808080203702ac0520022001360284052002200041d4c0c70020011b36028005200220024180056a3602a805200241f0026a200241a8056a10b4050240024020022802f0024101460d00200241e0006a41086a2201200241fc026a280200360200200220022902f40237036020022802a805280204450d01200241e0006a10a5030b200241ec006a410436020020024184036a4102360200200242023702f402200241b882c7003602f00220024104360264200241ac84c700360260200241003602ac05200241d4c0c7003602a8052002200241e0006a360280032002200241a8056a360268200241f0026a41c882c700103d000b200241306a41086a20012802002201360200200220022903602203370330200241d0006a41086a2001360200200242083703202002410036022820022003370350200241f0026a200241d0006a108601024020022802f0024101460d00200241f0026a41086a22012903002103200241f0026a41186a22004200370300200241f0026a41106a2204420037030020014200370300200242003703f002200241e0006a418a8cc700410910fb012001200241e0006a41086a2205290000370300200220022900603703f002200241e0006a41808ec500410310fb012000200529000037030020042002290060370300200241106a200241f0026a10ab032002280210210020022903182106200241206a410010d401200228022022072002280228220541c8036c6a200241e0006a41e80010cf0622014202370368200141a0016a2003200642b8177c42b81720001b220620032006561b3703002001410236029801200120022903a805370370200141f8006a200241a8056a41086a29030037030020014180016a200241a8056a41106a29030037030020014188016a200241a8056a41186a29030037030020014190016a200241c8056a290300370300200141b0016a200241f0026a41900210cf061a2002200541016a22083602280240200241d0006a41efb0c20010b8052201450d0020012802084104490d002001280200280000210520024188036a420037030020024180036a4200370300200241f0026a41086a4200370300200242003703f002200241f0026a41bb8cc700410f10fb01200241e0006a41dfeec600410b10fb01200441086a200241e0006a41086a29000037000020042002290060370000200241e0006a200241f0026a108c0220022802602201410420011b2100024002402002290264420020011b2203422088a722010d00410021010c010b200141027420006a417c6a28020020054721010b0240200342ffffffff0383500d00200010260b2001450d00024020082002280224470d00200241206a200810d40120022802202107200228022821080b2007200841c8036c6a200241e0006a41e80010cf06220142023703682001419c016a20053602002001410836029801200120022903a805370370200141f8006a200241a8056a41086a29030037030020014180016a200241b8056a29030037030020014188016a200241c0056a29030037030020014190016a200241c8056a290300370300200141b0016a200241f0026a41900210cf061a2002200841016a22083602280b02400240200241d0006a41a2e0c40010b8052201450d002002200128020836026420022001280200360260200241f0026a200241e0006a10db0120022802f0022209450d01200241f0026a41086a2200280200210a20022802f402210b200241f0026a41186a220c4200370300200241f0026a41106a220d420037030020004200370300200242003703f002200241e0006a41eb8cc700410a10fb012000200241e0006a41086a2201290000370300200220022900603703f002200241e0006a41dc9dc600410b10fb01200c2001290000370300200d2002290060370300200241e0006a200241f0026a10da042002280260210520022902642103200241f0026a10d90420022802f402210e20024190066a20022802f002220f20022802f802108a01200241a8056a41186a22104200370300200241a8056a41106a22114200370300200241a8056a41086a22124200370300200242003703a805200241e0006a41b48cc700410710fb0120122001290000370300200220022900603703a805200241e0006a4184c1c200410c10fb012010200129000037030020112002290060370300200241086a200241a8056a4120108902200228020c211320022802082114200c4200370300200d420037030020004200370300200242003703f002200241e0006a41808cc700410610fb0120002001290000370300200220022900603703f002200241e0006a41f693c400410a10fb01200441086a200129000037000020042002290060370000200241e0006a200241f0026a412010b80320022d006021012010200241f9006a2900003703002011200241f1006a2900003703002012200241e9006a290000370300200220022900613703a8052013410020141b21000240024020014101460d0020024180056a41186a420037030020024180056a41106a420037030020024180056a41086a420037030020024200370380050c010b20024180056a41186a201029030037030020024180056a41106a201129030037030020024180056a41086a2012290300370300200220022903a805370380050b2003420020051b21032005410120051b2115200241f0026a410c6a20024180056a41086a29030037020020024184036a20024190056a2903003702002002418c036a20024198056a290300370200200220003602f00220022002290380053702f402200228029006210c02400240024002400240200a450d002009200a4198026c6a21142002280298062104200c410c6a210d2003422088a7211641002110200921130340200421000240024020102004460d0020132802502111034002400240201020044f0d00200c201041037422016a221228020421052004201041016a22004d0d01200d20016a2101034020012802002005470d02200141086a21012004200041016a2200470d000b200421000c010b2010200441d4b0c0001032000b20002010490d060240200420004f0d002000200441c4b0c0001047000b024020052011460d002000211020002004460d020c010b0b200241e0006a2013201520162012200020106b200241f0026a10db040c010b200241e0006a410810ff020b024020022d00604104460d00410021010c030b2000211020134198026a22132014470d000b0b410121010b024020022802940641ffffffff0171450d00200c10260b0240200e41ffffffff0171450d00200f10260b0240200342ffffff3f83500d00201510260b0240024020010d000240200a450d002009200a4198026c6a21052009210403400240200441d8006a280200450d00200428025410260b0240200441186a2802002200450d00200428021021012000410474210003400240200141046a280200450d00200128020010260b200141106a2101200041706a22000d000b0b0240200441146a28020041ffffffff0071450d00200428021010260b0240200428021c2201450d00200441206a280200450d00200110260b024020044184026a2802002201450d00200141c1006c450d0020042802800210260b20044198026a210120044190026a4100360200200428028c0221002004410136028c02024020044194026a280200450d00200010260b2001210420012005470d000b0b4281808080800121034100210a0240200b0d004100210b0c020b0240200b4198026c0d004100210b0c020b200910264100210b0c010b2009ad42208642018421030b200241f0026a200241e0006a41900210cf061a024020082002280224470d00200241206a200810d40120022802202107200228022821080b2007200841c8036c22006a200241a8056a41e80010cf06220142023703682001200229038005370370200141f8006a20024188056a29030037030020014180016a20024190056a29030037030020014188016a20024198056a29030037030020014190016a200241a0056a290300370300200141ac016a200a360200200141a8016a200b360200200141a0016a20033703002001410c36029801200141b0016a200241f0026a41900210cf061a2002200841016a2212360228200241d0006a10a503200041cc036a2201417f4c0d01200110242200450d02200241003602682002200136026420022000360260200241e0006a201210a1010240024020120d0020022802682105200228026021110c010b200841c8036c41c8036a211020022802682105200721010340200220013602a805200241f0026a200241a8056a10af0420022802f0022104200241e0006a200520022802f8022200106d20022802602211200228026822056a2004200010cf061a2002200520006a2205360268024020022802f402450d00200410260b200141c8036a2101201041b87c6a22100d000b0b2005ad42208621032011ad210602402012450d0020074198016a2101200841c8036c41c8036a21000340200110d501200141c8036a2101200041b87c6a22000d000b0b20032006842103024020022802242201450d00200141c8036c450d00200710260b200241a0066a240020030f0b2010200041c4b0c0001048000b1034000b1033000b41f0e0c400412a419ce1c4001053000b200241293602f402200241bcabc7003602f00241aae0c4004125200241f0026a41d0e0c40041e0e0c4001036000b200241e8006a200241fc026a290200370300200220022902f40237036041a1b6c5004128200241e0006a41ccb6c50041dcb6c5001036000bf71c06097f017e0e7f017e017f027e230041c0056b22022400200242808080808020370224200220013602342002200041d4c0c70020011b3602302002200241306a360220200241d0046a200241206a10e502024020022802d4042203450d00200241dc046a280200210420022802d804210520022802d0042101200241f0036a200241e0046a41e00010cf061a200241d0046a200241206a10d201024020022802d00422060d0002402004450d00200441246c21002003210103400240024020012d0000220741044b0d0002400240024020070e050400010204040b2001410c6a280200450d03200141086a28020010260c030b2001410c6a280200450d02200141086a28020010260c020b2001410c6a280200450d01200141086a28020010260c010b200141086a280200450d00200141046a28020010260b200141246a21012000415c6a22000d000b0b2005450d01200541246c450d01200310260c010b200241d0046a41086a280200210820022802d404210920024190036a200241f0036a41e00010cf061a200241b0026a20024190036a41e00010cf061a200241d0046a200241206a10b405024020022802d0044101470d0002402004450d00200441246c21002003210103400240024020012d0000220741044b0d0002400240024020070e050400010204040b2001410c6a280200450d03200141086a28020010260c030b2001410c6a280200450d02200141086a28020010260c020b2001410c6a280200450d01200141086a28020010260c010b200141086a280200450d00200141046a28020010260b200141246a21012000415c6a22000d000b0b02402005450d00200541246c450d00200310260b02402008450d00200841c8036c210020064198016a21010340200110d501200141c8036a2101200041b87c6a22000d000b0b2009450d01200941c8036c450d01200610260c010b200241c0016a41086a2200200241d0046a410c6a280200360200200220022902d4043703c001200241d0016a200241b0026a41e00010cf061a200241386a410c6a2004360200200241386a41086a20053602002002200336023c20022001360238200241c8006a200241d0016a41e00010cf061a200241b0016a2008360200200241ac016a2009360200200241bc016a2000280200360200200220063602a801200220022903c0013702b401200241b4016a2107024002402002280220280204450d0002402004450d00200441246c210103400240024020032d0000220041044b0d0002400240024020000e050400010204040b2003410c6a280200450d03200341086a28020010260c030b2003410c6a280200450d02200341086a28020010260c020b2003410c6a280200450d01200341086a28020010260c010b200341086a280200450d00200341046a28020010260b200341246a21032001415c6a22010d000b0b02402005450d00200541246c450d00200228023c10260b02402008450d00200841c8036c210020064198016a21010340200110d501200141c8036a2101200041b87c6a22000d000b0b02402009450d00200941c8036c450d00200610260b200710a503410021030c010b200241f0036a41086a200741086a280200360200200220072902003703f0030b2003450d00200241b0026a41086a200241f0036a41086a220a2802002201360200200220022903f003220b3703b00220024190036a41086a20013602002002200b37039003200241013b01fc03200241003602f803200241003602f00302400240024002402008450d002006200841c8036c6a210c200241c8006a210d200228029403210e200228029003210f200241d0006a2110200621110340201141e8006a2903004202520d01024020112802980141024722120d00411c211341e5abc700211402400240024002400240200f450d0020112903a001210b200e2115200f21160340201641e0006a2107201641086a210020162f010622174103742101410021180240024003402001450d0141b4abc7002000410810d2062219450d02200141786a21012007410c6a2107201841016a2118200041086a21002019417f4a0d000b2018417f6a21170b2015450d022015417f6a2115201620174102746a41e4016a28020021160c010b0b0240200741086a28020041084f0d004129211341bcabc70021140c010b200b42f02e802007280200290000510d014195e9c6002114413121130b2002201336022420022014360220200242e2c289abb68edbb7f4003703c0012002200241f0036a200241c0016a200241206a10a403200228020022010d01200241d0046a41086a200241f0036a41086a290300370300200220022903f0033703d0040c070b20120d0320112903a001211a200241386a20024190036a108601024020022802384101460d002002290340210b20104200370300200d4200370300200241386a41086a2201420037030020024200370338200241d0046a418a8cc700410910fb012001200241d0046a41086a2200290000370300200220022900d004370338200241d0046a41808ec500410310fb01200d41086a2000290000370000200d20022900d004370000200241106a200241386a10ab03201a200b42b0ea017c560d02201a200229031842b8177c42b81720022802101b220b5a0d04200b42808080807083211a410021010c030b2002290340220b42808080807083211a200228023c211b41012101201c42808080807083200235024884221c211d0c020b20022802042100200220013602382002200036023c4188b1c2004122200241386a41acb1c20041f8b0c2001036000b201d428080808070832018ad84211d41fcb5c500ad210b4280808080d004211a4100211b410121010b2002201d3703482002201b36023c20022001360238200242f4d2b59bc7ae98b8303703d0012002201a200b42ffffffff0f8384370340200241086a200241f0036a200241d0016a200241386a10a803200228020822000d042001450d00200241d0046a41086a200241f0036a41086a290300370300200220022903f0033703d004201b450d03201a422088a7450d03200ba710260c030b201141c8036a2211200c470d000b0b200241d0046a41086a200a290300370300200220022903f0033703d0040b20024190036a10a50302402004450d00200441246c21002003210103400240024020012d0000220741044b0d0002400240024020070e050400010204040b2001410c6a280200450d03200141086a28020010260c030b2001410c6a280200450d02200141086a28020010260c020b2001410c6a280200450d01200141086a28020010260c010b200141086a280200450d00200141046a28020010260b200141246a21012000415c6a22000d000b0b02402005450d00200541246c450d00200310260b02402008450d00200841c8036c210020064198016a21010340200110d501200141c8036a2101200041b87c6a22000d000b0b02402009450d00200941c8036c450d00200610260b200241003602f803200242013703f00320022d00dc042101200241f0036a41004101106d20022802f00320022802f80322006a20013a00002002200041016a22013602f80320022d00dd042100200241f0036a20014101106d20022802f00320022802f80322016a20003a00002002200141016a3602f803200241f0036a20022802d804221910a101024020022802d00422070d004100211941002101410021070c020b4200210b20022802d4042100200721010340200b42ffffffff0f8320012f01062218ad42208684210b2000450d022000417f6a2100200120184102746a41e4016a280200210120072802e40121070c000b0b200228020c2101200220003602d004200220013602d4044188b1c2004122200241d0046a41acb1c20041f8b0c2001036000b200241d0006a200b370300200241cc006a20013602002002201936025820024100360248200242003703402002200736023c2002410036023802402019450d0020022019417f6a360258200241386a410020071b22192802002107201928020821030240024002400240201928020c2218201928020422002f01064f0d00200021010c010b034020002802002201450d02200741016a210720002f0104211820012100201820012f01064f0d000b0b2018ad4220862003ad84210b0c010b2003ad210b410021010b200b422088a7220341016a2118200ba721160240024020070d00200121000c010b200120184102746a41e4016a2802002100410021182007417f6a2207450d00034020002802e40121002007417f6a22070d000b0b2019201836020c20192016360208201920003602042019410036020020012003410c6c6a41e0006a2100200120034103746a41086a21010340200241f0036a20022802f8034108106d20022802f00320022802f80322076a20012900003700002002200741086a3602f80320002802002000280208200241f0036a10950120022802582201450d0120022001417f6a360258200241386a4100200228023c1b2219280200210720192802082103024002400240201928020c2218201928020422002f01064f0d00200021010c010b0240034020002802002201450d01200741016a210720002f0104211820012100201820012f0106490d020c000b0b2003ad210b410021010c010b2018ad4220862003ad84210b0b200b422088a7220341016a2118200ba721160240024020070d00200121000c010b200120184102746a41e4016a2802002100410021182007417f6a2207450d00034020002802e40121002007417f6a22070d000b0b2019201836020c20192016360208201920003602042019410036020020012003410c6c6a41e0006a2100200120034103746a41086a21010c000b0b20023502f803210b20023502f003211d200241d0046a10a503200241c0056a2400201d200b422086840f0b200241dc046a4104360200200241cc006a41023602002002420237023c200241b882c700360238200241043602d404200241c884c7003602d0042002410036029403200241d4c0c700360290032002200241d0046a360248200220024190036a3602d804200241386a41c882c700103d000bd20102017f027e230041c0006b2202240002402001450d00200241346a41043602002002411c6a41023602002002420237020c200241b882c7003602082002410436022c200241e084c7003602282002410036023c200241d4c0c7003602382002200241286a3602182002200241386a360230200241086a41c882c700103d000b200241086a41d4c0c700410010a40220024100360230200242013703282002200241286a360238200241086a200241386a109c012002350230210320023502282104200241c0006a240020042003422086840bd90c03017f027e027f230041f0116b220224002002428080808080203702dc02200220013602ec022002200041d4c0c70020011b22003602e8022002200241e8026a3602d80202400240024002402001450d0020022001417f6a3602ec022002200041016a3602e80220002d0000220041024b0d0041002101024020000e03030200030b410221010c020b420321030c020b410121010b200241a0086a200241d8026a10d30142032103024020022903880922044203520d000c010b200241076a200241a0086a41e80010cf061a200241e80e6a20024190096a41d80210cf061a200241b0076a200241ef0010cf061a200421030b200241c1066a200241b0076a41ef0010cf061a200241e80b6a200241e80e6a41d80210cf061a0240024020034203510d00200220013a00f002200241f0026a410172200241c1066a41ef0010cf062100200241e0036a2003370300200241e8036a200241e80b6a41d80210cf0621050240024020022802d802280204450d0020024190046a109803420321030c010b200241e80e6a200041ef0010cf061a200241a0086a200541d80210cf061a0b20034203510d00200241f0026a200241e80e6a41ef0010cf061a200241b0076a200241f7026a41e80010cf061a2002200241a0086a41d80210cf06220241a0086a200241b0076a41e80010cf061a200220033703880920024190096a200241d80210cf061a2002200241a0086a3602e80e200241f0026a200241e80e6a10af0420022802f8022100024020022802f402450d0020022802f00210260b200241f0026a200241a0086a41c80310cf061a200241e80e6a200241f0026a10ed04410121050240024020022d00e80e4101460d00200241e80b6a200241f00e6a41800310cf061a200241e80e6a200241b80c6a220510a103200241f0026a200241e80b6a200120022903e80e20022d00f00e20022d00f10e200010f303200510980320022d00f00221050c010b200220022d00eb0e3a00f302200220022f00e90e3b00f102200241013a00f0020b410110242201450d01200242013702a408200220013602a00802400240200541ff01714101470d00200241a0086a41004101106d20022802a00820022802a80822016a41013a00002002200141016a3602a808200241f0026a410172200241a0086a10ae0420022802a808210120022802a00821000c010b200241a0086a41004101106d20022802a00820022802a80822016a41003a00002002200141016a22013602a808200241f0026a41086a2903002103200241a0086a20014108106d20022802a00820022802a80822016a20033700002002200141086a3602a80820024188036a2802002101200241a0086a20024190036a280200220010a10102402000450d0020012000410c6c6a210003402001280200200141086a280200200241a0086a1095012001410c6a22012000470d000b0b20024194036a2802002101200241a0086a2002419c036a280200220010a10102402000450d0020012000410c6c6a210003402001280200200141086a280200200241a0086a1095012001410c6a22012000470d000b0b20024180036a2903002103200241a0086a20022802a8084108106d20022802a00820022802a80822016a20033700002002200141086a22013602a808200241a0036a2d00002106200241a0086a20014101106d20022802a008220020022802a80822016a20063a00002002200141016a22013602a8080b2001ad4220862000ad8421030240200541ff01710d0020024188036a2802002105024020024190036a2802002201450d002001410c6c21002005210103400240200141046a280200450d00200128020010260b2001410c6a2101200041746a22000d000b0b02402002418c036a2802002201450d002001410c6c450d00200510260b20024194036a280200210502402002419c036a2802002201450d002001410c6c21002005210103400240200141046a280200450d00200128020010260b2001410c6a2101200041746a22000d000b0b20024198036a2802002201450d002001410c6c450d00200510260b200241f0116a240020030f0b200241f40b6a410436020020024184036a4102360200200242023702f402200241b882c7003602f002200241043602ec0b200241f484c7003602e80b20024100360204200241d4c0c7003602002002200241e80b6a36028003200220023602f00b200241f0026a41c882c700103d000b1033000bc52c040f7f037e0d7f017e230022022103200241c0046b416071220224002002428080808080203702c4022002200136029c022002200041d4c0c70020011b36029802200220024198026a3602c00220024190036a200241c0026a10e5022002419c036a2802002104200228029803210520022802940321062002280290032107200241306a200241a0036a41e00010cf061a0240024002400240024002400240024002402006450d00200241a0016a200241306a41e00010cf061a0240024020022802c002280204450d0002402004450d00200441246c21002006210103400240024020012d0000220841044b0d0002400240024020080e050400010204040b2001410c6a280200450d03200141086a28020010260c030b2001410c6a280200450d02200141086a28020010260c020b2001410c6a280200450d01200141086a28020010260c010b200141086a280200450d00200141046a28020010260b200141246a21012000415c6a22000d000b0b410021012005450d01200541246c450d01200610260c010b20024190036a200241a0016a41e00010cf061a200621010b2001450d002002413c6a2004360200200241386a20053602002002200136023420022007360230200241c0006a20024190036a41e00010cf06210120024188026a200241306a10b6052002280230200120024180016a20024188026a410010b304410041002802ccc2472201410120011b3602ccc2470240200141014b0d000240024020010e020001000b410041ac9fc0003602c4c247410041d4c0c7003602c0c247410041023602ccc2470c010b034041002802ccc2474101460d000b0b2002410020022802302201417f6a2200200020014b1b220936029402108306450d01200241a8036a22014200370300200241a0036a2200420037030020024190036a41086a220542003703002002420037039003200241a0016a41d18cc700410810fb012005200241a0016a41086a2206290000370300200220022900a00137039003200241a0016a41e3d3c500410e10fb0120012006290000370300200020022900a001370300200241286a20024190036a4120108902410021080240200228022c410020022802281b220a20094d0d00200241a0016a210020024198026a21010c070b2001420037030020004200370300200542003703002002420037039003200241a0016a41b48cc700410710fb0120052006290000370300200220022900a00137039003200241a0016a4184c1c200410c10fb0120012006290000370300200020022900a001370300200241206a20024190036a41201089022002280220210b2002280224210c20024190036a10ad03200228029803210d024020022802940341ffffff3f71450d0020022802900310260b200241c0026a10ac0320024190036a41e9dabdf30610840620022802900321052002280294032106024002400240024020022802980322010d004100210e4101210f410021100c010b20014104200141044b1b220041ffffff3f712000470d02200041057422044100480d0220041024220f450d0120014105742108200520014105746a20056b41606a2107200f2101200521000340200041086a2900002111200041106a290000211220002900002113200141186a200041186a290000370000200141106a2012370000200141086a201137000020012013370000200141206a2101200041206a2100200841606a22080d000b2004410576210e200741057641016a21100b0240200641ffffff3f71450d00200510260b20104115490d0602404101450d0020104104744160712214417f4c0d000240201410242215450d00200241003602a801200242043703a001200f41606a2116200f41a07f6a2117410021012010211803400240024020182219417f6a22180d0041002118410121050c010b024002400240024002400240200f20184105746a20194105742204200f6a41406a412010d2064100480d002019417e6a2106201720046a210041002118410021080340024020062008470d00201921050c080b200841016a2108200041206a2000412010d2062105200041606a21002005417f4a0d000b200841016a21052008417f7320196a21180c010b201720046a210002400340024020184101470d00410021180c020b2018417f6a2118200041206a2000412010d2062108200041606a210020084100480d000b0b20192018490d01201920104b0d02201920186b22054101762206450d00201620046a2100200f20184105746a2108034020024190036a41186a2204200841186a220729000037030020024190036a41106a221a200841106a221b29000037030020024190036a41086a221c200841086a221d2900003703002002200829000037039003200041086a221e2900002111200041106a220a2900002112200041186a221f29000021132008200029000037000020072013370000201b2012370000201d2011370000201f2004290300370000200a201a290300370000201e201c2903003700002000200229039003370000200041606a2100200841206a21082006417f6a22060d000b0b2018450d04200541094b0d04201920104b0d02201920186b21052018417f6a2101201620184105746a2100034020192001490d0d2000200541016a22051088052001417f6a220820014f0d04200041606a2100200821012005410a490d000c040b0b2018201941c4ccc5001048000b2019201041c4ccc5001047000b20192018417f6a2201490d092019201041d4ccc5001047000b200841016a211820022802a80121010b0240200120022802a401470d00200241a0016a10bf0120022802a80121010b20022802a001220020014103746a22082005360204200820183602002002200141016a22013602a801024020014102490d0002400340024002400240024020002001417f6a4103746a2208280200450d00200141037420006a220441746a2802002206200828020422054d0d00200141024d0d0620002001417d6a221d4103746a2802042208200520066a4d0d01200141034d0d06200441646a280200200820066a4b0d060c010b20014103490d012008280204210520002001417d6a221d4103746a28020421080b20082005490d010b2001417e6a211d0b0240024002400240024002402001201d41016a221e4d0d002001201d4d0d012000201d410374221f6a2201280204221920012802006a22012000201e41037422206a2200280200220a490d02200120104b0d03200f200a4105746a221b2000280204221c41057422006a2105200141057421082001200a6b2204201c6b2201201c4f0d04201520052001410574220010cf06221a20006a210602400240201c4101480d00200141014e0d010b20052101201a21000c060b201620086a21082005210103402008200141606a2205200641606a220420042005412010d20641004822071b2200290000370000200841186a200041186a290000370000200841106a200041106a290000370000200841086a200041086a2900003700002006200420071b21060240201b2005200120071b2201490d00201a21000c070b200841606a2108201a2100201a2006490d000c060b0b201e200141e4ccc5001032000b201d200141f4ccc5001032000b200a20014184cdc5001048000b200120104184cdc5001047000b2015201b200010cf06221a20006a210602400240201c4101480d002004201c4a0d010b201b2101201a21000c010b200f20086a2107201a2100201b2101034020012005200020052000412010d20641004822041b2208290000370000200141186a200841186a290000370000200141106a200841106a290000370000200141086a200841086a2900003700002000200041206a20041b2100200141206a2101200541206a200520041b220520074f0d01200620004b0d000b0b20012000200620006b41607110cf061a024020022802a8012201201d4d0d0020022802a0012200201f6a22082019201c6a3602042008200a3602002001201e4d0d02200020206a2208200841086a2001201e417f736a41037410d0061a20022001417f6a22013602a801200141014d0d030c010b0b201d20014194cdc5001032000b201e2001103e000b2018450d080c000b0b1033000b1034000b102c000b102e000b200241ac016a4104360200200241c4006a410236020020024202370234200241b882c700360230200241043602a4012002419085c7003602a001200241003602c402200241d4c0c7003602c0022002200241a0016a3602402002200241c0026a3602a801200241306a41c882c700103d000b41002802c8c2474105490d05200241133602a401200220024194026a3602a00141002802c4c247210141002802c0c247210041002802ccc2472108200241d0036a419003360200200241c8036a42e080808010370300200241c4036a41ced2c500360200200241bc036a4210370200200241b8036a419cd4c500360200200241b0036a4201370300200241a0036a420237030020024190036a41086a4108360200200241ac036a200241a0016a36020020024184d4c50036029c0320024194d4c500360294032002410536029003200041c8a1c000200841024622081b20024190036a200141b0a1c00020081b2802101102000c050b2001201941d4ccc5001048000b024020022802a40141ffffffff0171450d00200010260b2014450d01201510260c010b4102210120104102490d00200f2010417e6a22004105746a2108034020102000490d0420082001108805200841606a2108200141016a21012000417f6a2200417f470d000b0b200c4100200b1b210120022802c402210a20022802c002210820022802c80221002002200d3602b802200220093602b402200220013602b002200220103602ac022002200e3602a8022002200f3602a402200241003602a0022002200820004105746a220036029c0220022008360298022002200d3602c001200220093602bc01200220013602b801200220103602b4012002200e3602b0012002200f3602ac01200241003602a801200220003602a401200220083602a001200241a0016a210020024198026a21010b200241a0016a41106a2205200141106a2902002211370300200241a0016a41186a2206200141186a2902002212370300200241e8026a41086a2204200141086a290200370300200241e8026a41106a22072011370300200241e8026a41186a221a2012370300200241e8026a41206a221b200141206a280200360200200241c0026a41206a221c20024190036a41206a290200370300200241c0026a41186a221d20024190036a41186a290200370300200241c0026a41106a221e20024190036a41106a290200370300200241c0026a41086a221820024190036a41086a221f290200370300200220012902003703e80220022002290290033703c00220024198026a41206a2201200241a0016a41206a29020037030020024198026a41186a2219200629020037030020024198026a41106a2220200529020037030020024198026a41086a220f200241a0016a41086a290200370300200220022902a00137039802201f200a360200200220083602940320024101360290032002419c036a220520022903e802370200200241a4036a22062004290300370200200241ac036a22042007290300370200200241b4036a2207201a290300370200200241bc036a201b280200360200200241003602c003200241c4036a20022903c002370200200241cc036a2018290300370200200241d4036a201e290300370200200241dc036a201d290300370200200241e4036a201c290300370200200241003602ec0320024190046a200129030037030020024188046a201929030037030020024180046a2020290300370300200241f8036a200f290300370300200241f0036a200229039802370300200241e0036a211b200241c8036a2101200241ec036a211f200241c0036a211e200241d0036a211c200241d8036a211d410021080340024002402008450d00200241186a201e108f050240200228021822084108460d00200228021c21180c020b024020022802c0032208450d00024020022802c40341ffffff3f71450d00200810260b20022802d80341ffffff3f71450d0020022802d40310260b20012000290200370200200141086a200041086a290200370200200141106a200041106a290200370200200141186a200041186a290200370200200141206a200041206a2802003602002002200a3602c403200241003602c0030b20042902002112200420022903b80137020020062902002113200620022903b00137020020052902002121200520022903a801370200200241a0046a41086a221a200741086a280200360200200241003602a001200220072902003703a0042002290294032111200220022903a0013702940302402011a72208450d00201b20022903a004370200200220113703c00320012021370300201b41086a201a280200360200201c2013370300201d20123703000c020b024020022802ec030d00410821080c010b200241106a201f108f0520022802142118200228021021080b02400240200841796a221a41014b0d000240201a0e020200020b0240200228029003450d002002280294032201450d00024020022802980341ffffff3f71450d00200110260b200241ac036a28020041ffffff3f71450d00200241a8036a28020010260b024020022802c0032201450d00024020022802c40341ffffff3f71450d00200110260b20022802d80341ffffff3f71450d0020022802d40310260b20022802ec032201450d030240200241f0036a28020041ffffff3f71450d00200110260b20024184046a28020041ffffff3f71450d0320024180046a28020010260c030b2002201836029c04200220083602980441002802c8c2474104490d00200241163602ac04200241133602a404200220024198046a3602a804200220024194026a3602a00441002802c4c247210841002802c0c247211a41002802ccc247211820024187033602e001200242e0808080103703d801200241ced2c5003602d401200242103702cc012002419cd4c5003602c801200242023703c001200242023703b001200241f4d3c5003602ac01200241083602a80120024194d4c5003602a401200241043602a001200841b0a1c000201841024622181b28021021082002200241a0046a3602bc01201a41c8a1c00020181b200241a0016a20081102000b20022802c00321080c000b0b200228028802210502402002280290022201450d00200141246c21002005210103400240024020012d0000220841044b0d0002400240024020080e050400010204040b2001410c6a280200450d03200141086a28020010260c030b2001410c6a280200450d02200141086a28020010260c020b2001410c6a280200450d01200141086a28020010260c010b200141086a280200450d00200141046a28020010260b200141246a21012000415c6a22000d000b0b0240200228028c022201450d00200141246c450d00200510260b0240200228023c2200450d0020022802342101200041246c210003400240024020012d0000220841044b0d0002400240024020080e050400010204040b2001410c6a280200450d03200141086a28020010260c030b2001410c6a280200450d02200141086a28020010260c020b2001410c6a280200450d01200141086a28020010260c010b200141086a280200450d00200141046a28020010260b200141246a21012000415c6a22000d000b0b024020022802382201450d00200141246c450d00200228023410260b2003240042010f0b2000201041a4ccc5001048000b070010144101460bb70705017f017e077f037e047f23004180026b220224002002200136020c02400240024002402002410c6a10072203422088a72201450d002002200136021420022003a722043602102002200241106a108f0120022802000d0202402002280204220520022802144105762201200120054b1b22014105742206417f4c0d0002400240024020010d00410121070c010b200610242207450d010b2001ad210302402005450d00410021080340200241003a00b8012002280214417f6a2101200841016a210841002106024002400240024003402001417f460d0120024198016a20066a200228021022092d00003a00002002200941016a3602102002200641016a22093a00b801200220013602142001417f6a21012009210620094120470d000b200241c0016a41086a220120024198016a41086a290300370300200241c0016a41106a220620024198016a41106a290300370300200241c0016a41186a220a20024198016a41186a29030037030020022002290398013703c001200941ff0171411f4d0d01200241386a41086a2001290300220b370300200241386a41106a2006290300220c370300200241386a41186a200a290300220d370300200241186a41186a2206200d370300200241186a41106a2209200c370300200241186a41086a220a200b370300200220022903c001220b3703582002200b3703382002200b3703182003422088a722012003a7470d03200141016a220e2001490d0b2001410174220f200e200e200f491b220e4104200e41044b1b220e41ffffff3f712210200e470d0b200e410574220f41004e0d020c0b0b200641ff0171450d00200241003a00b8010b200241386a41086a200241d8006a41086a290300370300200342ffffff3f83500d08200710260c080b2010200e46210e2001410574201120011b211102400240024002402007410020011b22070d00200f0d01200e21070c030b2011200f460d02024020110d00200f0d01410121070c030b20072011200f10282207450d010c020b200f102422070d010b200e450d09102c000b200342808080807083200f410576ad8421030b20072003422088a74105746a22012002290318370000200141186a2006290300370000200141106a2009290300370000200141086a200a29030037000020034280808080107c210320082005470d000b0b2007450d042000200337020420002007360200200410260c030b1033000b1034000b20004100360208200042013702000b20024180026a24000f0b4196aec700412e20024198016a41c0acc70041d0acc7001036000b102e000be20202027f017e230041c0006b22022400024020010d00200241286a22014200370300200241206a22034200370300200241106a41086a420037030020024200370310200241106a41eb8cc700410a10fb01200241306a41dc9dc600410b10fb012001200241306a41086a29000037030020032002290030370300200241306a200241106a10da0402400240200228023022010d00200241003602082002420137030041012101410121030c010b20022002290234220437020420022001360200200442ffffff3f835021030b200241106a200210bb0120023502184220862002350210842104024020030d00200110260b200241c0006a240020040f0b2002413c6a4104360200200241246a410236020020024202370214200241b882c70036021020024104360234200241a885c70036023020024100360204200241d4c0c7003602002002200241306a36022020022002360238200241106a41c882c700103d000bda0502087f017e230041d0006b2202240002400240024020010d00200241206a10d904200228022822014103744104722203417f4c0d012002280224210420022802202105200310242206450d02200241003602282002200336022420022006360220024002400240200141c000490d0002400240200141808001490d002001418080808004490d01200241206a41004101106d2002280220200228022822036a41033a00002002200341016a2203360228200241206a20034104106d2002280220200228022822036a20013600002002200341046a2203360228200241206a21070c030b200241206a41004102106d2002280220200228022822036a20014102744101723b00002002200341026a2203360228200241206a21070c020b200241206a41004104106d2002280220200228022822036a20014102744102723600002002200341046a2203360228200241206a21070c010b200241206a41004101106d20022802202208200228022822036a20014102743a00002002200341016a2203360228200241206a21072001450d010b200141037421062005210103400240024020012802004101460d00200720034101106d20022802202208200228022822036a41003a0000200341016a21030c010b200720034101106d2002280220200228022822036a41013a00002002200341016a2203360228200141046a2802002109200720034104106d20022802202208200228022822036a2009360000200341046a21030b200141086a210120022003360228200641786a22060d000b0b2003ad4220862008ad84210a0240200441ffffffff0171450d00200510260b200241d0006a2400200a0f0b200241146a4104360200200241346a410236020020024202370224200241b882c7003602202002410436020c200241bc85c7003602082002410036021c200241d4c0c7003602182002200241086a3602302002200241186a360210200241206a41c882c700103d000b1034000b1033000be50202027f017e230041c0006b22022400024020010d00200241286a22014200370300200241206a22034200370300200241106a41086a420037030020024200370310200241106a41818dc700410910fb01200241306a41acd6c000410610fb012001200241306a41086a29000037030020032002290030370300200241306a200241106a10fd0102400240200228023022030d00410021012002410036020820024204370300410421030c010b200220022902342204370204200220033602002004a721010b200241106a200210b9012002350218422086200235021084210402402001450d002001412c6c450d00200310260b200241c0006a240020040f0b2002413c6a4104360200200241246a410236020020024202370214200241b882c70036021020024104360234200241d085c70036023020024100360204200241d4c0c7003602002002200241306a36022020022002360238200241106a41c882c700103d000ba40301047f230041c0006b2202240002402001450d002002413c6a4104360200200241246a410236020020024202370214200241b882c70036021020024104360234200241ec85c7003602302002410036020c200241d4c0c7003602082002200241306a3602202002200241086a360238200241106a41c882c700103d000b200241286a22014200370300200241206a22034200370300200241106a41086a420037030020024200370310200241106a41808cc700410610fb01200241306a41ea93c400410610fb012001200241306a41086a290000370300200320022900303703002002200241106a412010890220022802042101200228020021032002410036021820024201370310200241106a41004104106d2002280210200228021822046a41808080053600002002200441046a2204360218200241106a20044104106d2002280210200228021822046a4180a0013600002002200441046a2204360218200241106a20044104106d20022802102204200228021822056a2001410020031b2201417f6a410020011b360000200241c0006a2400200541046aad4220862004ad840bce0402037f027e230041d0006b220224000240024020014104490d0020014104470d00200041d4c0c70020011b2800002103200241286a22014200370300200241206a22004200370300200241106a41086a420037030020024200370310200241106a41808cc700410610fb01200241c0006a41ea93c400410610fb012001200241c0006a41086a29000037030020002002290040370300200241086a200241106a41201089020240024002402002280208450d00200228020c22010d010b2002410236022c0c010b200241106a20032001417f6a10e4040b410110242201450d012002420137024420022001360240200228022c2101200241c0006a41004101106d20022802402204200228024822006a21030240024020014102470d00200341003a0000200041016aad4220862004ad8421050c010b200341013a00002002200041016a3602482002280220200241286a280200200241c0006a109501200241186a290300210520022903102106200241c0006a20022802484110106d2002280240200228024822016a22002005370008200020063700002002200141106a360248200241c0006a2002412c6a10af0120023502484220862002350240842105200241246a280200450d00200228022010260b200241d0006a240020050f0b200241cc006a4104360200200241246a410236020020024202370214200241b882c700360210200241043602442002418c86c7003602402002410036023c200241d4c0c7003602382002200241c0006a3602202002200241386a360248200241106a41c882c700103d000b1033000bee0204017f017e027f017e230041306b220224000240024020014104470d002002200041d4c0c70020011b280000109802200241186a200228020022002002280208109d02200229021c21032002280218210102402002280204450d00200010260b410110242200450d012002420137020420022000360200200241004101106d20022802002200200228020822046a21050240024020010d00200541003a00002002200441016a22043602080c010b200541013a00002002200441016a36020820012003422088a7200210950120022802082104200228020021000b2004ad4220862000ad84210602402001450d002003a7450d00200110260b200241306a240020060f0b200241246a4104360200200241146a410236020020024202370204200241b882c7003602002002410436021c200241ac86c7003602182002410036022c200241d4c0c7003602282002200241186a3602102002200241286a360220200241c882c700103d000b1033000b8e2c0e027f017e0c7f017e0b7f0a7e027f027e017f027e017f027e027f017e230041c0166b220224002002428080808080203702f403200220013602342002200041d4c0c70020011b3602302002200241306a3602f003200241e80a6a200241f0036a10d2010240024020022802e80a2203450d0020022902ec0a210420022802f003280204450d0102402004422088a72201450d00200141c8036c210020034198016a21010340200110d501200141c8036a2101200041b87c6a22000d000b0b2004a72201450d00200141c8036c450d00200310260b200241fc036a4104360200200241fc0a6a4102360200200242023702ec0a200241b882c7003602e80a200241043602f403200241c486c7003602f00320024100360234200241d4c0c7003602302002200241f0036a3602f80a2002200241306a3602f803200241e80a6a41c882c700103d000b20032004422088a7220541c8036c6a210602400240024020050d00200321070c010b200241f0036a4198016a2108200241e80a6a4198016a2109200241840c6a210a200241ca0b6a210b200241890b6a210c200241e80a6a410472210d200241e80a6a410172210e200241f0036a41f0006a210f200241f00b6a21102003210702400240034020024188036a200741e80010cf061a20072903682111200241306a200741f0006a41d80210cf061a200741c8036a210720114203510d03200241f0036a20024188036a41e80010cf061a200220113703d804200f200241306a41d80210cf061a2002200241f0036a3602e80a200241d80a6a200241e80a6a10af04200220022802e00a3602d40a200220022802d80a22123602d00a200241286a200241d00a6a108f0102400240024020022802280d000240200228022c2200450d0041002101410020006b2100034020014101460d0720002001417f6a2201470d000b0b20022802d40a2213450d0020022802d00a22142d0000210120022013417f6a22153602d40a2002201441016a3602d00a200141ff00714104470d004202211102402001411874411875417f4a0d0041002100200241003a00880b417e21160240024002400340201520002201460d01200241e80a6a20016a201420016a220041016a2d00003a00002002201320166a3602d40a2002200041026a3602d00a2002200141016a22003a00880b2016417f6a211620004120470d000b20024180106a41086a2217200241e80a6a41086a29030037030020024180106a41106a2218200241e80a6a41106a29030037030020024180106a41186a2219200241e80a6a41186a290300370300200220022903e80a37038010200041ff0171411f4b0d01420221110c020b0240200141ff0171450d00200241003a00880b0b420221110c010b200241b8126a41086a221a2017290300370300200241b8126a41106a221b2018290300370300200241b8126a41186a221c201929030037030020022002290380103703b8120240024002400240024020152000460d00201420006a221441016a2d000021152002201320166a3602d40a2002201441026a3602d00a201541024b0d00024002400240024020150e03000102000b200241e80a6a200241d00a6a10dc0120022d00e80a4101460d0320024180106a41386a200e41386a290000221137030020024180106a41306a200e41306a290000221d37030020024180106a41286a200e41286a290000221e37030020024180106a41206a200e41206a290000221f3703002019200e41186a2900002220370300200241a0136a41086a200e41086a290000370300200241a0136a41106a200e41106a290000370300200241a0136a41186a2020370300200241a0136a41206a201f370300200241a0136a41286a201e370300200241a0136a41306a201d370300200241a0136a41386a20113703002002200e2900003703a013410021160c020b200241e80a6a200241d00a6a10dc0120022d00e80a4101460d0220024180106a41386a200e41386a290000221137030020024180106a41306a200e41306a290000221d37030020024180106a41286a200e41286a290000221e37030020024180106a41206a200e41206a290000221f3703002019200e41186a2900002220370300200241a0136a41086a200e41086a290000370300200241a0136a41106a200e41106a290000370300200241a0136a41186a2020370300200241a0136a41206a201f370300200241a0136a41286a201e370300200241a0136a41306a201d370300200241a0136a41386a20113703002002200e2900003703a013410121160c010b41002116200241003a00a90b200020136b41026a2115201320016b417c6a2101024002400340201520166a450d01200241e80a6a20166a201420166a220041026a2d00003a00002002200041036a3602d00a2002201641016a22003a00a90b200220013602d40a2001417f6a210120002116200041c100460d020c000b0b201641ff0171450d02200241003a00a90b0c020b20024180106a200241e80a6a41c10010cf061a200241d0146a20024180106a41c10010cf061a200041ff017141c0004d0d012002418f146a200241d0146a41c10010cf061a200241a0136a2002418f146a41c10010cf061a410221160b200241df126a200241a0136a41c10010cf061a20022802d40a2201450d0320022802d00a2200310000211d20022001417f6a22133602d40a2002200041016a3602d00a201d50450d01420021110c020b420221110c040b2013450d012000310001211e20022001417e6a3602d40a2002200041026a3602d00a42012111201e420886201d844204884202201d420f8386221d420c88221e4201201e4201561b7e221e2021201d420356201e201d547122011b2121201d202220011b212220014101470d010b20232021201142025122011b21232024202220011b2124200241206a200241d00a6a108f0120022802200d0020022802242101200241086a200241d00a6a10b3052002290308a7450d010b420221110c010b200241086a41106a2903002125200229031021262019201c2903003703002018201b2903003703002017201a290300370300200220022903b81237038010200241e80a6a200241df126a41c10010cf061a200241d0146a41046a200241b2126a41046a2f01003b0100200220022801b2123602d0142001212720162128202421292023212a0b200241e00f6a41186a220120024180106a41186a290300370300200241e00f6a41106a220020024180106a41106a290300370300200241e00f6a41086a221620024180106a41086a29030037030020022002290380103703e00f2002419f0f6a200241e80a6a41c10010cf061a200241980f6a41046a2213200241d0146a41046a2f01003b0100200220022802d0143602980f20114202510d01200241f80e6a41186a2001290300370300200241f80e6a41106a2000290300370300200241f80e6a41086a2016290300370300200220022903e00f3703f80e200241b70e6a2002419f0f6a41c10010cf061a200241b00e6a41046a20132f01003b0100200220022802980f3602b00e2028212b2026212c2025212d2027212e2029212f202a21300b200241e80a6a200241d00a6a10b60220022802e80a210120024180106a200d41ac0210cf061a20014117470d010b024020022802dc0a450d00201210260b20081098030c010b200241b00a6a41186a2200200241f80e6a41186a290300370300200241b00a6a41106a2216200241f80e6a41106a290300370300200241b00a6a41086a2213200241f80e6a41086a290300370300200220022903f80e3703b00a200241ef096a200241b70e6a41c10010cf061a200241e8096a41046a2214200241b00e6a41046a2f01003b0100200220022802b00e3602e809200241bc076a20024180106a41ac0210cf061a200241e80a6a41186a2000290300370300200241e80a6a41106a2016290300370300200241e80a6a41086a2013290300370300200220022903b00a3703e80a2002202b3a00880b200c200241ef096a41c10010cf061a2010202d370300200b41046a20142f01003b0100200b20022802e8093601002002202c3703e80b2002202e3602f80b200220303703e00b2002202f3703d80b200220113703d00b200220013602800c200a200241bc076a41ac0210cf061a410121004100211302402001410c470d0020022d00880c41ff01714101470d0020022802940c22014198026c2100200228028c0c211a20022802900c211c0240024020010d00410021194200211d41082113201a21160c010b20014104200141044b1b221641ffffff077122132016470d05201641087422144100480d0520132016464103742116024002402014450d002014102422130d012016450d07102c000b201621130b201a20006a213120014198026c211b200141037441786a41037641016a21322014410876ad211d41002116201321004100211902400340201a20166a22012903002111200141086a2903002133200141106a2802002114200241d0146a200141146a41ec0110cf061a024020140d0020014198026a21160c020b20014194026a28020021172001418c026a280200211820014184026a280200211520014180026a280200210120024180106a200241d0146a41ec0110cf061a02402015450d00201541c1006c450d00200110260b02402017450d00201810260b2000201137030020002033370308200041106a2014360200200041146a20024180106a41ec0110cf061a20004180026a2100201941016a2119201b20164198026a2216470d000b20312116203221190b203120166b22004198026d21010b2019ad211102402000450d00201620014198026c6a211403400240201641d8006a280200450d00201628025410260b0240201641186a2802002200450d00201628021021012000410474210003400240200141046a280200450d00200128020010260b200141106a2101200041706a22000d000b0b0240201641146a28020041ffffffff0071450d00201628021010260b0240201628021c2201450d00201641206a280200450d00200110260b024020164184026a2802002201450d00200141c1006c450d0020162802800210260b20164198026a210120164190026a4100360200201628028c0221002016410136028c02024020164194026a280200450d00200010260b2001211620012014470d000b0b201142208621110240201c450d00201c4198026c450d00201a10260b201d20118421334100210020022802800c21010b024002402001410c470d00024020022d00880c22014101470d002000450d02024020022802940c2201450d00200228028c0c221620014198026c6a211403400240201641d8006a280200450d00201628025410260b0240201641186a2802002200450d00201628021021012000410474210003400240200141046a280200450d00200128020010260b200141106a2101200041706a22000d000b0b0240201641146a28020041ffffffff0071450d00201628021010260b0240201628021c2201450d00201641206a280200450d00200110260b024020164184026a2802002201450d00200141c1006c450d0020162802800210260b20164198026a210120164190026a4100360200201628028c0221002016410136028c02024020164194026a280200450d00200010260b2001211620012014470d000b0b20022802900c2201450d0220014198026c450d02200228028c0c10260c020b0240200141034b0d000240024020010e0404000104040b024020022802940c2201450d00200228028c0c221620014198026c6a211403400240201641d8006a280200450d00201628025410260b0240201641186a2802002200450d00201628021021012000410474210003400240200141046a280200450d00200128020010260b200141106a2101200041706a22000d000b0b0240201641146a28020041ffffffff0071450d00201628021010260b0240201628021c2201450d00201641206a280200450d00200110260b024020164184026a2802002201450d00200141c1006c450d0020162802800210260b20164198026a210120164190026a4100360200201628028c0221002016410136028c02024020164194026a280200450d00200010260b2001211620012014470d000b0b20022802900c2201450d0320014198026c450d03200228028c0c10260c030b024020022802980c2200450d0020022802900c21012000410c6c210003400240200141046a280200450d00200128020010260b2001410c6a2101200041746a22000d000b0b20022802940c2201450d022001410c6c450d0220022802900c10260c020b20022802940c450d0120022802900c10260c010b20091098030b024020022802dc0a450d00201210260b200810980320130d020b20072006470d000b200621070c020b2033a741ffffff077121082033422088a721140c020b102e000b41002108410021130b2004a72100024020062007460d002003200541c8036c6a2101034020074198016a10d5012001200741c8036a2207470d000b0b02402000450d00200041c8036c450d00200310260b024002400240024020130d00410121010c010b20144108744105722201417f4c0d010b200110242200450d01200241003602f00a200220013602ec0a200220003602e80a200241e80a6a41004101106d20022802e80a20022802f00a22016a21000240024020130d00200041003a00002002200141016a3602f00a0c010b200041013a00002002200141016a3602f00a200241e80a6a201410a1012014450d0020144108742112410021070340201320076a220141d0006a2802002100200241e80a6a20022802f00a4104106d20022802e80a20022802f00a22166a20003600002002201641046a3602f00a2002200241e80a6a3602f003200141e0006a200241f0036a109c01200141d4006a280200200141dc006a280200200241e80a6a109501200241e80a6a20022802f00a4120106d20022802e80a20022802f00a22166a220020014180016a290000370000200041086a20014188016a290000370000200041106a20014190016a290000370000200041186a20014198016a2900003700002002201641206a22003602f00a200241e80a6a200041c000106d20022802e80a20022802f00a22166a2200200141a0016a290000370000200041086a200141a8016a290000370000200041106a200141b0016a290000370000200041186a200141b8016a290000370000200041206a200141c0016a290000370000200041286a200141c8016a290000370000200041306a200141d0016a290000370000200041386a200141d8016a2900003700002002201641c0006a3602f00a2002200241e80a6a3602f003200141e0016a200241f0036a109c01200241e80a6a2001109d01201220074180026a2207470d000b0b20023502f00a42208620023502e80a84211102402013450d0002402014450d00201320144108746a211620132101034002402001220741d8006a280200450d00200728025410260b0240200741186a2802002200450d00200728021021012000410474210003400240200141046a280200450d00200128020010260b200141106a2101200041706a22000d000b0b0240200741146a28020041ffffffff0071450d00200728021010260b20074180026a21010240200728021c2200450d00200741206a280200450d00200010260b20012016470d000b0b2008450d00201310260b200241c0166a240020110f0b1034000b1033000ba90602097f027e230041a0016b22022400024020010d00200241d8006a41186a22034200370300200241d8006a41106a22044200370300200241d8006a41086a2205420037030020024200370358200241f8006a41b48cc700410710fb012005200241f8006a41086a220129000037030020022002290078370358200241f8006a4184c1c200410c10fb012003200129000037030020042002290078370300200241086a200241d8006a4120108902200228020c210620022802082107200241106a41186a22084200370300200241106a41106a22094200370300200241106a41086a220a420037030020024200370310200241f8006a41808cc700410610fb01200a200129000037030020022002290078370310200241f8006a41f693c400410a10fb012008200129000037030020092002290078370300200241f8006a200241106a412010b80320022d00782108200320024191016a290000370300200420024189016a290000370300200520024181016a290000370300200220022900793703582006410020071b21010240024020084101460d00200241386a41186a4200370300200241386a41106a4200370300200241386a41086a4200370300200242003703380c010b200241386a41186a2003290300370300200241386a41106a2004290300370300200241386a41086a2005290300370300200220022903583703380b2002411c6a200241c0006a290300370200200241246a200241c8006a2903003702002002412c6a200241d0006a2903003702002002200136021020022002290338370214200241003602800120024201370378200241f8006a41004104106d200228027820022802800122036a20013600002002200341046a360280012002200241f8006a360258200241106a410472200241d8006a109c01200235028001210b2002350278210c200241a0016a2400200c200b422086840f0b20024184016a4104360200200241246a410236020020024202370214200241b882c7003602102002410436027c200241d886c7003602782002410036025c200241d4c0c7003602582002200241f8006a3602202002200241d8006a36028001200241106a41c882c700103d000bf10304017f017e037f027e230041306b2202240002400240024020014104470d002002200041d4c0c70020011b28000010e204200241186a20022802002200200228020810e304200229021c4200200228021822011b210302402002280204450d00200010260b2003422088a7220441d8006c4104722200417f4c0d01200010242205450d022001410820011b21062002410036020820022000360204200220053602002002200410a10102402004450d002006200441d8006c6a210020062101034020012002109f042000200141d8006a2201470d000b0b200235020842208621072002350200210802402004450d00200441d8006c21002006210103400240024020012d0000220441014b0d00024020040e020200020b200141086a280200450d01200141046a28020010260c010b200141086a280200450d00200141046a28020010260b200141d8006a2101200041a87f6a22000d000b0b2007200884210702402003a72201450d00200141d8006c450d00200610260b200241306a240020070f0b200241246a4104360200200241146a410236020020024202370204200241b882c7003602002002410436021c200241f086c7003602182002410036022c200241d4c0c7003602282002200241186a3602102002200241286a360220200241c882c700103d000b1034000b1033000be80804057f017e027f037e230041e0006b2202240002400240024002400240024020010d002002411436021c200241cad3c500360218200241206a41cad3c500411410820220022802202201450d01200228022421032002200241286a2802002204360234200220013602300240024002402004450d0020012d0000210520022004417f6a3602342002200141016a360230200241c8006a200241306a108e0120022802482206450d00200229024c2107200541ff01714101460d012007a72204450d00200441286c450d00200610260b20024100360210200242013703082002410e36023c2002200241186a3602382002200241086a36024441012108200241dc006a41013602002002420137024c2002418c8dc6003602482002200241386a360258200241c4006a41c4e1c000200241c8006a10351a200228020820022802101084020240200228020c450d00200228020810260b410221090c010b2007422088a721052007a7210441012109410021080b02402003450d00200110260b20080d0120094101460d0220062802082204ad42287e2207422088a70d042007a72205417f4c0d04200628020021010240024020050d00410821030c010b200510242203450d060b20024100360210200220033602082002200541286e36020c200241086a41002004109001200228021021052002280208210602402004450d00200441286c21032006200541286c6a21040340200141086a2903002107200141106a290300210a200141186a290300210b2001290300210c200441206a200141206a290300370300200441186a200b370300200441106a200a370300200441086a20073703002004200c370300200441286a2104200541016a2105200141286a2101200341586a22030d000b0b200220053602100c030b200241146a4104360200200241dc006a41023602002002420237024c200241b882c7003602482002410436020c2002418c87c70036020820024100360224200241d4c0c7003602202002200241086a3602582002200241206a360210200241c8006a41c882c700103d000b4108210641002105410021040b200220053602102002200436020c200220063602080b200541286c4104722201417f4c0d00200110242204450d01200241003602502002200136024c20022004360248200241c8006a200510a1010240024020050d0020022802502104200228024821050c010b2006200541286c6a210320022802502104200621010340200241c8006a20044120106d2002280248200228025022056a22042001290000370000200441086a200141086a290000370000200441106a200141106a290000370000200441186a200141186a2900003700002002200541206a2204360250200141206a2903002107200241c8006a20044108106d20022802482205200228025022046a20073700002002200441086a22043602502003200141286a2201470d000b0b2004ad4220862005ad8421070240200228020c2201450d00200141286c450d00200610260b200241e0006a240020070f0b1034000b1033000b8f0b04017f027e027f017e230041e0076b220224002002428080808080203702d407200220013602c4072002200041d4c0c70020011b3602c0072002200241c0076a3602d007200241f8036a200241d0076a10cf04024020022903800422034202510d0020022903f8032104200241f8016a20024188046a41f00110cf061a2002200241d0076a108d0120022802000d0020022802c407220020022802042201490d00024002402001417f4c0d000240024020010d0041002105410121060c010b2001102a2206450d0220022802c4072100200121050b0240024020002001490d00200620022802c007200110cf06210020022802c407220620014f0d012001200641b8afc0001048000b2005450d03200610260c030b2002200620016b3602c407200220022802c00720016a3602c0072000450d02200241086a200241f8016a41f00110cf061a0240024020022802d007280204450d00420221032005450d01200010260c010b200241f8036a200241086a41f00110cf061a0b20034202510d02200241086a200241f8036a41f00110cf061a200241f8016a200241086a41f00110cf061a200220013602c407200220003602c007200241f8036a200241c0076a10de050240024020022802fc0322010d00410021010c010b200241d8076a20024188046a28020036020020022002290380043703d00720022802f80321060b02402005450d00200010260b200241f8036a41086a2200200241d0076a41086a2205280200360200200220022903d0073703f803024002402001450d00200241e8036a41086a20002802002200360200200220022903f80322073703e803200241a0056a20013602002002419c056a200636020020024198056a4102360200200241a4056a2007370200200241ac056a2000360200200241b8056a2003370300200241b0056a20043703002002410936029005200242023703e004200241c0056a200241f8016a41f00110cf061a2002200241f8036a3602d007200241c0076a200241d0076a10af042005200241c0076a41086a280200360200200220022903c0073703d007200241d0076a109605210120024190056a10980341002802c8c24721000240024020010d0020004103490d0141002802c4c247210141002802c0c247210041002802ccc2472105200241b8046a41a501360200200241b0046a42e780808010370300200241ac046a4188d9c500360200200241a4046a421c370200200241a0046a41ecd8c50036020020024198046a4200370300200241f8036a411c6a41d4c0c70036020020024188046a420137030020024180046a411c360200200241fc85c40036028404200241ecd8c5003602fc03200241033602f803200041c8a1c000200541024622051b200241f8036a200141b0a1c00020051b280210110200410121010c030b2000450d00200241173602d4072002200241c0076a3602d00741002802c4c247210141002802c0c247210041002802ccc2472105200241b8046a41a601360200200241b0046a42e780808010370300200241ac046a4188d9c500360200200241a4046a421c370200200241a0046a41ecd8c50036020020024198046a420137030020024188046a420137030020024180046a411c360200200241f8036a411c6a200241d0076a360200200241f8f1c60036028404200241ecd8c5003602fc03200241013602f803200041c8a1c000200541024622051b200241f8036a200141b0a1c00020051b2802101102000b410121010c010b410021010b200110ff042103200241e0076a240020030f0b1034000b1033000b200241146a41043602002002418c026a4102360200200242023702fc01200241b882c7003602f8012002410436020c200241a887c700360208200241003602d407200241d4c0c7003602d0072002200241086a360288022002200241d0076a360210200241f8016a41c882c700103d000b890d03047f047e017f23004190046b22022400024020014108490d0041002103200241003a00a003200041d4c0c70020011b41086a2100200141786a210102400240034020012003460d0120024180036a20036a200020036a2d00003a00002002200341016a22033a00a00320034120470d000b200241c8006a41186a220020024180036a41186a290300370300200241c8006a41106a220420024180036a41106a290300370300200241c8006a41086a220520024180036a41086a2903003703002002200229038003370348200341ff017141204f0d010c020b200341ff0171450d01200241003a00a0030c010b200241b8016a41086a2005290300370300200241b8016a41106a2004290300370300200241b8016a41186a2000290300370300200220022903483703b80120012003470d0020024180036a41186a2203200241b8016a41186a290300220637030020024180036a41106a2201200241b8016a41106a290300220737030020024180036a41086a2200200241b8016a41086a2903002208370300200220022903b801220937038003200241086a41186a2006370300200241086a41106a2007370300200241086a41086a200837030020022009370308200241286a41186a2006370300200241286a41106a2007370300200241286a41086a2008370300200220093703282003420037030020014200370300200042003703002002420037038003200241c8006a41b48cc700410710fb012000200241c8006a41086a22042900003703002002200229004837038003200241c8006a4184c1c200410c10fb012003200429000037030020012002290048370300200220024180036a4120108902200228020021042002280204210520024180036a10ad032002280284032101200228028003210002402002280288032203450d00200341057421030340200341606a22030d000b0b0240200141ffffff3f71450d00200010260b410021032002410036028004200242013703f80320024180036a200241f8036a10810402402002280280034101460d00200241e8026a41106a20024198036a280200360200200241e8026a41086a20024180036a41106a290300370300200220024180036a41086a2903003703e8022002419c036a280200210320024190026a200241a0036a41d80010cf061a0b200241f8036a41086a2201200241e8026a41086a290300370300200241f8036a41106a2200200241e8026a41106a280200360200200220022903e8023703f80320024180036a20024190026a41d80010cf061a0240024002402003450d00200241c8006a41106a2000280200360200200241c8006a41086a2001290300370300200220022903f803370348200241b8016a20024180036a41d80010cf061a200241dc006a2003360200200241c8006a41186a200241b8016a41d80010cf061a20024180036a41186a200241286a41186a29030037030020024180036a41106a200241286a41106a29030037030020024180036a41086a200241286a41086a290300370300200220022903283703800320024190026a200241c8006a41e7e485f30620024180036a10840420022902940221062002280290022100200241c8006a10fe0320000d010b41002103200241003602480c010b20024188036a20063703002002410036029003200220003602840320022005410020041b36028003200241c8006a20024180036a10e2052006a7210402402006422088a72203450d002003410c6c21012000210303400240200341046a280200450d00200328020010260b2003410c6a2103200141746a22010d000b0b02402004450d002004410c6c450d00200010260b0240200228024822030d00410021030c010b200241d0006a280200210a200228024c21050b0240410110242201450d002002420137028403200220013602800320024180036a41004101106d200228028003220120022802880322006a21040240024020030d00200441003a00002002200041016a2200360288030c010b200441013a00002002200041016a360288032003200a20024180036a109501200228028803210020022802800321010b2000ad4220862001ad84210602402003450d002005450d00200310260b20024190046a240020060f0b1033000b200241d4006a410436020020024194036a41023602002002420237028403200241b882c700360280032002410436024c200241e087c7003602482002410036029402200241d4c0c700360290022002200241c8006a36029003200220024190026a36025020024180036a41c882c700103d000bf30702057f017e230041d0016b22022400024020010d00200241d8006a10c205200241086a41186a22014200370300200241086a41106a22034200370300200241086a41086a420037030020024200370308200241086a41868cc700410410fb0120024188016a41f89ec600410a10fb01200120024188016a41086a290000370300200320022900880137030020024188016a200241086a10a00520022d0088012101200241b0016a41186a2203200241a1016a290000370300200241b0016a41106a220420024199016a290000370300200241b0016a41086a220520024191016a29000037030020022002290089013703b0010240024020014101460d00200241e8006a41186a4200370300200241e8006a41106a4200370300200241e8006a41086a4200370300200242003703680c010b200241e8006a41186a2003290300370300200241e8006a41106a2004290300370300200241e8006a41086a2005290300370300200220022903b0013703680b200241086a41186a4204370300200241086a41286a200241d8006a41086a2802003602002002413c6a2203200241e8006a41086a290300370200200241c4006a2204200241e8006a41106a290300370200200241cc006a2205200241e8006a41186a29030037020020024201370318200242d804370310200242f02e3703082002200229035837032820022002290368370234200241013a00542002410036029001200242013703880120024188016a41004108106d20022802880120022802900122016a42f02e3700002002200141086a22013602900120024188016a20014108106d20022802880120022802900122016a42d8043700002002200141086a22013602900120024188016a20014108106d20022802880120022802900122016a42013700002002200141086a22013602900120024188016a20014108106d20022802880120022802900122016a42043700002002200141086a3602900120024188016a200241086a41206a10ac0120024188016a2002280290014120106d20022802880120022802900122066a22012002290234370000200141086a2003290200370000200141106a2004290200370000200141186a20052902003700002002200641206a3602900120024188016a410110970120023502900142208620023502880184210702402002412c6a2802002201450d00200141286c450d00200228022810260b200241d0016a240020070f0b20024194016a41043602002002411c6a41023602002002420237020c200241b882c7003602082002410436028c012002418488c70036028801200241003602b401200241d4c0c7003602b001200220024188016a3602182002200241b0016a36029001200241086a41c882c700103d000b820402047f047e230041e0006b220224000240024020010d00200241c8006a22014200370300200241c0006a22034200370300200241306a41086a2204420037030020024200370330200241d0006a41868cc700410410fb012004200241d0006a41086a220529000037030020022002290050370330200241d0006a41b49dc600410a10fb012001200529000037030020032002290050370300200241186a200241306a10ab03200229032021062002290318210720014200370300200342003703002004420037030020024200370330200241d0006a41868cc700410410fb012004200529000037030020022002290050370330200241d0006a41a89ec600410b10fb012001200529000037030020032002290050370300200241086a200241306a10ab032002290310210820022903082109410810242201450d012002420837023420022001360230200241306a41004108106d20022802302201200228023822036a200842002009a71b200642d8047e42002007a71b7c370000200241e0006a2400200341086aad4220862001ad840f0b200241dc006a4104360200200241c4006a410236020020024202370234200241b882c700360230200241043602542002419c88c7003602502002410036022c200241d4c0c7003602282002200241d0006a3602402002200241286a360258200241306a41c882c700103d000b1033000b890d03047f047e017f23004190046b22022400024020014108490d0041002103200241003a00a003200041d4c0c70020011b41086a2100200141786a210102400240034020012003460d0120024180036a20036a200020036a2d00003a00002002200341016a22033a00a00320034120470d000b200241c8006a41186a220020024180036a41186a290300370300200241c8006a41106a220420024180036a41106a290300370300200241c8006a41086a220520024180036a41086a2903003703002002200229038003370348200341ff017141204f0d010c020b200341ff0171450d01200241003a00a0030c010b200241b8016a41086a2005290300370300200241b8016a41106a2004290300370300200241b8016a41186a2000290300370300200220022903483703b80120012003470d0020024180036a41186a2203200241b8016a41186a290300220637030020024180036a41106a2201200241b8016a41106a290300220737030020024180036a41086a2200200241b8016a41086a2903002208370300200220022903b801220937038003200241086a41186a2006370300200241086a41106a2007370300200241086a41086a200837030020022009370308200241286a41186a2006370300200241286a41106a2007370300200241286a41086a2008370300200220093703282003420037030020014200370300200042003703002002420037038003200241c8006a41b48cc700410710fb012000200241c8006a41086a22042900003703002002200229004837038003200241c8006a4184c1c200410c10fb012003200429000037030020012002290048370300200220024180036a4120108902200228020021042002280204210520024180036a10ad032002280284032101200228028003210002402002280288032203450d00200341057421030340200341606a22030d000b0b0240200141ffffff3f71450d00200010260b410021032002410036028004200242013703f80320024180036a200241f8036a10810402402002280280034101460d00200241e8026a41106a20024198036a280200360200200241e8026a41086a20024180036a41106a290300370300200220024180036a41086a2903003703e8022002419c036a280200210320024190026a200241a0036a41d80010cf061a0b200241f8036a41086a2201200241e8026a41086a290300370300200241f8036a41106a2200200241e8026a41106a280200360200200220022903e8023703f80320024180036a20024190026a41d80010cf061a0240024002402003450d00200241c8006a41106a2000280200360200200241c8006a41086a2001290300370300200220022903f803370348200241b8016a20024180036a41d80010cf061a200241dc006a2003360200200241c8006a41186a200241b8016a41d80010cf061a20024180036a41186a200241286a41186a29030037030020024180036a41106a200241286a41106a29030037030020024180036a41086a200241286a41086a290300370300200220022903283703800320024190026a200241c8006a41e2c289ab0620024180036a10840420022902940221062002280290022100200241c8006a10fe0320000d010b41002103200241003602480c010b20024188036a20063703002002410036029003200220003602840320022005410020041b36028003200241c8006a20024180036a10e2052006a7210402402006422088a72203450d002003410c6c21012000210303400240200341046a280200450d00200328020010260b2003410c6a2103200141746a22010d000b0b02402004450d002004410c6c450d00200010260b0240200228024822030d00410021030c010b200241d0006a280200210a200228024c21050b0240410110242201450d002002420137028403200220013602800320024180036a41004101106d200228028003220120022802880322006a21040240024020030d00200441003a00002002200041016a2200360288030c010b200441013a00002002200041016a360288032003200a20024180036a109501200228028803210020022802800321010b2000ad4220862001ad84210602402003450d002005450d00200310260b20024190046a240020060f0b1033000b200241d4006a410436020020024194036a41023602002002420237028403200241b882c700360280032002410436024c200241e087c7003602482002410036029402200241d4c0c700360290022002200241c8006a36029003200220024190026a36025020024180036a41c882c700103d000ba118020b7f017e230041d00b6b22022400200242808080808020370214200220013602242002200041d4c0c70020011b3602202002200241206a36021020024188086a200241106a10e3050240024020024194086a2802002203450d00200241f8076a41086a20024188086a41086a28020036020020022002290388083703f80720024198086a28020021042002419c086a280200210520024190076a200241a0086a41e40010cf061a2002418c096a280200210620024188086a4180016a280200210720024184096a280200210820024190066a20024190096a41800110cf061a200241086a200241106a108d01024002400240024020022802080d00200228021022012802042200200228020c2209490d002009417f4c0d020240024020090d004100210a4101210b0c010b2009102a220b450d042002280210220128020421002009210a0b0240024020002009490d00200b2001280200200910cf0621002001280204220c20094f0d012009200c41b8afc0001048000b200a450d01200b10260c010b2001200c20096b3602042001200128020020096a36020020000d010b02402005450d00200541246c21002003210103400240024020012d0000220c41044b0d00024002400240200c0e050400010204040b2001410c6a280200450d03200141086a28020010260c030b2001410c6a280200450d02200141086a28020010260c020b2001410c6a280200450d01200141086a28020010260c010b200141086a280200450d00200141046a28020010260b200141246a21012000415c6a22000d000b0b02402004450d00200441246c450d00200310260b02402006450d00200641246c21002008210103400240024020012d0000220c41044b0d00024002400240200c0e050400010204040b2001410c6a280200450d03200141086a28020010260c030b2001410c6a280200450d02200141086a28020010260c020b2001410c6a280200450d01200141086a28020010260c010b200141086a280200450d00200141046a28020010260b200141246a21012000415c6a22000d000b0b2007450d03200741246c450d0320081026410021030c040b20024180066a41086a200241f8076a41086a280200360200200220022903f8073703800620024198056a20024190076a41e40010cf061a20024198046a20024190066a41800110cf061a0c030b1034000b1033000b410021030b20024188046a41086a220120024180066a41086a280200360200200220022903800637038804200241a0036a20024198056a41e40010cf061a200241a0026a20024198046a41800110cf061a02402003450d0020024190026a41086a2001280200360200200220022903880437039002200241a8016a200241a0036a41e40010cf061a200241286a200241a0026a41800110cf061a024002402002280210280204450d0002402005450d00200541246c21002003210103400240024020012d0000220c41044b0d00024002400240200c0e050400010204040b2001410c6a280200450d03200141086a28020010260c030b2001410c6a280200450d02200141086a28020010260c020b2001410c6a280200450d01200141086a28020010260c010b200141086a280200450d00200141046a28020010260b200141246a21012000415c6a22000d000b0b02402004450d00200441246c450d00200310260b02402006450d00200641246c21002008210103400240024020012d0000220c41044b0d00024002400240200c0e050400010204040b2001410c6a280200450d03200141086a28020010260c030b2001410c6a280200450d02200141086a28020010260c020b2001410c6a280200450d01200141086a28020010260c010b200141086a280200450d00200141046a28020010260b200141246a21012000415c6a22000d000b0b02402007450d00200741246c450d00200810260b41002103200a450d01200b10260c010b20024190076a41086a20024190026a41086a28020036020020022002290390023703900720024190066a200241a8016a41e40010cf061a20024188086a200241286a41800110cf061a0b2003450d00200241f8076a41086a220120024190076a41086a220028020036020020022002290390073703f807200241286a20024190066a41e40010cf061a20024198046a20024188086a41800110cf061a200241a8016a41086a2001280200360200200220022903f8073703a801200241a0026a200241286a41e40010cf061a20024190066a20024198046a41800110cf061a2002200936029c052002200b3602980520024188086a20024198056a10de0502400240200228028c0822010d00410021010c010b200020024198086a28020036020020022002290390083703900720022802880821000b0240200a450d00200b10260b20024188086a41086a220c20024190076a41086a220b280200360200200220022903900737038808024002402001450d00200241a0036a41086a200c280200220c3602002002200229038808220d3703a003200241b0096a2001360200200241ac096a2000360200200241a8096a4102360200200241b4096a200d370200200241bc096a200c360200200241c0096a20022903a801370300200241c8096a200241a8016a41086a280200360200200241d4096a2005360200200241d0096a2004360200200241cc096a2003360200200241013602a009200242023703f008200241d8096a200241a0026a41e40010cf061a200241c40a6a2006360200200241c00a6a2007360200200241bc0a6a2008360200200241c80a6a20024190066a41800110cf061a200220024188086a3602900720024198056a20024190076a10af04200b20024198056a41086a28020036020020022002290398053703900720024190076a1096052101200241a0096a10980341002802c8c24721000240024020010d0020004103490d0141002802c4c247210141002802c0c247210041002802ccc247210c200241c8086a419801360200200241c0086a42e480808010370300200241bc086a4199f2c600360200200241b4086a4219370200200241b0086a4180f2c600360200200241a8086a4200370300200241a4086a41d4c0c70036020020024198086a420137030020024190086a4119360200200241f0f1c6003602940820024180f2c60036028c082002410336028808200041c8a1c000200c410246220c1b20024188086a200141b0a1c000200c1b280210110200410121010c030b2000450d002002411736029407200220024198056a3602900741002802c4c247210141002802c0c247210041002802ccc247210c200241c8086a419901360200200241c0086a42e480808010370300200241bc086a4199f2c600360200200241b4086a4219370200200241b0086a4180f2c600360200200241a8086a420137030020024198086a420137030020024190086a4119360200200241a4086a20024190076a360200200241f8f1c6003602940820024180f2c60036028c082002410136028808200041c8a1c000200c410246220c1b20024188086a200141b0a1c000200c1b2802101102000b410121010c010b02402005450d00200541246c21002003210103400240024020012d0000220c41044b0d00024002400240200c0e050400010204040b2001410c6a280200450d03200141086a28020010260c030b2001410c6a280200450d02200141086a28020010260c020b2001410c6a280200450d01200141086a28020010260c010b200141086a280200450d00200141046a28020010260b200141246a21012000415c6a22000d000b0b02402004450d00200441246c450d00200310260b02402006450d00200641246c21002008210103400240024020012d0000220c41044b0d00024002400240200c0e050400010204040b2001410c6a280200450d03200141086a28020010260c030b2001410c6a280200450d02200141086a28020010260c020b2001410c6a280200450d01200141086a28020010260c010b200141086a280200450d00200141046a28020010260b200141246a21012000415c6a22000d000b0b410021012007450d00200741246c450d00200810260b200110ff04210d200241d00b6a2400200d0f0b200241ac026a4104360200200241ac046a41023602002002420237029c04200241b882c70036029804200241043602a402200241a887c7003602a0022002410036022c200241d4c0c7003602282002200241a0026a3602a8042002200241286a3602a80220024198046a41c882c700103d000ba90b020a7f037e230041a0026b220224000240024002400240024002400240024020010d00200241206a22014200370300200241186a22034200370300200241086a41086a420037030020024200370308200241086a41d98cc700411210fb01200241b8016a41bcd2c500410410fb012001200241b8016a41086a290000370300200320022900b8013703002002412036022c2002200241086a360228200241306a200241086a41201082020240200228023022040d00410021050c060b200228023421062002200241306a41086a280200360244200220043602402002200241c0006a108f0120022802000d032002280204220720022802444105762201200120074b1b22014105742203417f4c0d060240024020010d00410121050c010b200310242205450d080b41002108200241003602502002200136024c200220053602480240024002402007450d0041002109034041002103200241003a00d8012002280244417f6a2101200941016a210903402001417f460d03200241b8016a20036a2002280240220a2d00003a00002002200a41016a3602402002200341016a220a3a00d801200220013602442001417f6a2101200a2103200a4120470d000b20024180026a41186a2201200241b8016a41186a29030037030020024180026a41106a2203200241b8016a41106a29030037030020024180026a41086a220b200241b8016a41086a290300370300200220022903b80137038002200a41ff01714120490d03200241f8006a41086a200b290300220c370300200241f8006a41106a2003290300220d370300200241f8006a41186a2001290300220e370300200241d8006a41186a2203200e370300200241d8006a41106a220a200d370300200241d8006a41086a220b200c3703002002200229038002220c370398012002200c3703782002200c37035802402008200228024c470d00200241c8006a2008410110930120022802482105200228025021080b200520084105746a22012002290358370000200141186a2003290300370000200141106a200a290300370000200141086a200b2903003700002002200841016a220836025020092007470d000b0b200229024c210c2005450d050c060b200341ff0171450d00200241003a00d8010b200241f8006a41186a20024198016a41186a290300370300200228024c41ffffff3f710d010c020b2002418c026a4104360200200241cc016a4102360200200242023702bc01200241b882c7003602b8012002410436028402200241b888c70036028002200241003602e401200241d4c0c7003602e001200220024180026a3602c8012002200241e0016a36028802200241b8016a41c882c700103d000b200510260b0b41002105200241003602880220024201370380022002410e3602e4012002200241286a3602e001200220024180026a36029801200241cc016a4101360200200242013702bc012002418c8dc6003602b8012002200241e0016a3602c80120024198016a41c4e1c000200241b8016a10351a200228028002200228028802108402200228028402450d0020022802800210260b2006450d00200410260b200c420020051b220c422088a722014105744104722203417f4c0d0020031024220a450d012005410120051b2106200241003602c001200220033602bc012002200a3602b801200241b8016a200110a1010240024020010d0020022802c001210320022802b80121040c010b2001410574210a20022802c0012103200621010340200241b8016a20034120106d20022802b801220420022802c00122056a22032001290000370000200341086a200141086a290000370000200341106a200141106a290000370000200341186a200141186a2900003700002002200541206a22033602c001200141206a2101200a41606a220a0d000b0b2003ad4220862004ad84210d0240200c42ffffff3f83500d00200610260b200241a0026a2400200d0f0b1034000b1033000bd81203047f017e0d7f230041f0026b22022400200242808080808020370214200220013602b4022002200041d4c0c70020011b22003602b0022002200241b0026a36021002400240024002402001450d0020022001417f6a22033602b4022002200041016a3602b00220002d0000220041014b0d004100210102400240024020000e020100010b200241086a200241106a108d0120022802080d0220022802b4022203200228020c2200490d022000417f4c0d040240024020000d0041002104410121010c010b2000102a2201450d0620022802b4022103200021040b0240024020032000490d00200120022802b002200010cf06210320022802b402220520004f0d012000200541b8afc0001048000b20040d020c030b2002200520006b3602b402200220022802b00220006a3602b0022003450d022000ad4220862004ad842106200228021028020421030b2003450d022001450d012006a7450d010b200110260b200241bc026a4104360200200241246a410236020020024202370214200241b882c700360210200241043602b402200241cc88c7003602b0022002410036029402200241d4c0c700360290022002200241b0026a360220200220024190026a3602b802200241106a41c882c700103d000b0240024020010d00200241003602b0020c010b2006422088a72200417f4c0d010240024020000d0041012104410021050c010b200010242204450d03200021050b200241b8026a22034100360200200220043602b002200220053602b402200241b0026a4100200010c90120022802b002200328020022046a2001200010cf061a2003200420006a3602000b200241106a41086a200241b0026a41086a280200360200200220022903b002370310200241b0016a41e7e485f306200241106a1097060240024020010d00200241003602b0020c010b2006422088a72200417f4c0d010240024020000d0041012104410021050c010b200010242204450d03200021050b200241b8026a22034100360200200220043602b002200220053602b402200241b0026a4100200010c90120022802b002200328020022046a2001200010cf061a2003200420006a3602000b200241106a41086a200241b0026a41086a280200360200200220022903b002370310200241d0016a41e2c289ab06200241106a1098060240024020010d00200241003602b0020c010b2006422088a72200417f4c0d010240024020000d0041012104410021050c010b200010242204450d03200021050b200241b8026a22034100360200200220043602b002200220053602b402200241b0026a4100200010c90120022802b002200328020022046a2001200010cf061a2003200420006a3602000b200241106a41086a200241b0026a41086a280200360200200220022903b002370310200241f0016a41e9dabdf306200241106a1098060240024020010d00200241003602b0020c010b2006422088a72200417f4c0d010240024020000d0041012104410021050c010b200010242204450d03200021050b200241b8026a22034100360200200220043602b002200220053602b402200241b0026a4100200010c90120022802b002200328020022046a2001200010cf061a2003200420006a3602000b200241106a41086a200241b0026a41086a280200360200200220022903b00237031020024190026a41f0c2c98b06200241106a1098060240024020010d00200241003602d0020c010b2006422088a72200417f4c0d010240024020000d0041012104410021050c010b200010242204450d03200021050b200241d8026a22034100360200200220043602d002200220053602d402200241d0026a4100200010c90120022802d002200328020022046a2001200010cf061a2003200420006a3602000b200241e0026a41086a200241d0026a41086a280200360200200220022903d0023703e002200241b0026a41e1ea91cb06200241e0026a109806200241106a41086a2203200241b0016a41086a290300370300200241106a41106a2204200241b0016a41106a290300370300200241106a41186a2205200241b0016a41186a290300370300200241386a2207200241d0016a41086a290300370300200241c0006a2208200241d0016a41106a290300370300200241c8006a2209200241d0016a41186a290300370300200241e8006a220a200241f0016a41186a290300370300200241e0006a220b200241f0016a41106a290300370300200241d8006a220c200241f0016a41086a290300370300200220022903b001370310200220022903d001370330200220022903f00137035020024188016a220d20024190026a41186a29030037030020024180016a220e20024190026a41106a290300370300200241f8006a220f20024190026a41086a29030037030020024198016a2210200241b0026a41086a290300370300200241a0016a2211200241b0026a41106a290300370300200241a8016a2212200241b0026a41186a2903003703002002200229039002370370200220022903b00237039001200241003602b802200242013703b002200241b0026a41004120106d20022802b00220022802b80222136a22002002290310370000200041086a2003290300370000200041106a2004290300370000200041186a20052903003700002002201341206a22003602b802200241b0026a20004120106d20022802b00220022802b80222036a22002002290330370000200041086a2007290300370000200041106a2008290300370000200041186a20092903003700002002200341206a22003602b802200241b0026a20004120106d20022802b00220022802b80222036a22002002290350370000200041086a200c290300370000200041106a200b290300370000200041186a200a2903003700002002200341206a22003602b802200241b0026a20004120106d20022802b00220022802b80222036a22002002290370370000200041086a200f290300370000200041106a200e290300370000200041186a200d2903003700002002200341206a22003602b802200241b0026a20004120106d20022802b002220420022802b80222036a2200200229039001370000200041086a2010290300370000200041106a2011290300370000200041186a20122903003700002002200341206a3602b80202402001450d002006a7450d00200110260b200241106a200241b0026a10b70120023502184220862002350210842106024020022802b402450d00200410260b200241f0026a240020060f0b1034000b1033000bff0101067f230041c0006b2203240020032001360204200341086a200210c406200341206a41186a2204200341046a200341086a41106a200341086a41086a2205200328020822064101461b2903001002220141186a290000370300200341206a41106a2207200141106a290000370300200341206a41086a2208200141086a2900003703002003200129000037032020011026200041186a2004290300370000200041106a2007290300370000200041086a20082903003700002000200329032037000002402006450d002005280200450d00200328020c10260b024020022802002200450d00200241046a280200450d00200010260b200341c0006a24000bff0101067f230041c0006b2203240020032001360204200341086a200210c406200341206a41186a2204200341046a200341086a41106a200341086a41086a2205200328020822064101461b2903001006220141186a290000370300200341206a41106a2207200141106a290000370300200341206a41086a2208200141086a2900003703002003200129000037032020011026200041186a2004290300370000200041106a2007290300370000200041086a20082903003700002000200329032037000002402006450d002005280200450d00200328020c10260b024020022802002200450d00200241046a280200450d00200010260b200341c0006a24000b820d02047f017e23004180036b220224002002428080808080203702c401200220013602242002200041d4c0c70020011b3602202002200241206a3602c001200241086a200241c0016a108d01024002400240024020022802080d0020022802242200200228020c2201490d002001417f4c0d020240024020010d0041002103410121040c010b2001102a2204450d0420022802242100200121030b02400240024020002001490d0020042002280220200110cf0621002002280224220520014f0d012001200541b8afc0001048000b20030d010c020b2002200520016b3602242002200228022020016a3602202000450d012001ad4220862003ad84210620022802c001280204450d022006a7450d010b200410260b2002412c6a4104360200200241d4016a4102360200200242023702c401200241b882c7003602c00120024104360224200241ec88c700360220200241003602f402200241d4c0c7003602f0022002200241206a3602d0012002200241f0026a360228200241c0016a41c882c700103d000b200220064220883e02ec02200220003602e802200241c0016a200241e8026a10b0030240024020022d00c0014101470d00200241003602100c010b200241206a200241c0016a41017241a00110cf061a200241c0016a200241206a41a00110cf061a200241186a410036020020024204370310412010242201450d02200242203702f402200220013602f002200241f0026a200241c0016a109a060240200228021822012002280214470d00200241106a10be01200228021821010b200228021020014104746a220120022903f002370200200141e7e485f30636020c200141086a200241f0026a41086a2802003602002002200228021841016a360218412010242201450d02200242203702f402200220013602f002200241f0026a200241c0016a41206a109a060240200228021822012002280214470d00200241106a10be01200228021821010b200228021020014104746a220120022903f002370200200141e2c289ab0636020c200141086a200241f0026a41086a2802003602002002200228021841016a360218412010242201450d02200242203702f402200220013602f002200241f0026a20024180026a109a060240200228021822012002280214470d00200241106a10be01200228021821010b200228021020014104746a220120022903f002370200200141e9dabdf30636020c200141086a200241f0026a41086a2802003602002002200228021841016a360218412010242201450d02200242203702f402200220013602f002200241f0026a200241a0026a109a060240200228021822012002280214470d00200241106a10be01200228021821010b200228021020014104746a220120022903f002370200200141f0c2c98b0636020c200141086a200241f0026a41086a2802003602002002200228021841016a360218412010242201450d02200242203702f402200220013602f002200241f0026a200241c0026a109a060240200228021822012002280214470d00200241106a10be01200228021821010b200228021020014104746a220120022903f002370200200141e1ea91cb0636020c200141086a200241f0026a41086a2802003602002002200228021841016a3602180b02402006a7450d00200010260b0240024020022802100d00410121010c010b200241186a2802004104744105722201417f4c0d010b200110242200450d01200241003602c801200220013602c401200220003602c00120022802102101200241c0016a41004101106d20022802c001220320022802c80122006a21040240024020010d00200441003a00002002200041016a22003602c8010c010b200441013a00002002200041016a3602c80120022802102101200241c0016a200241106a41086a280200220010a101024020000d0020022802c801210020022802c00121030c010b200120004104746a210403402001280200200141086a280200200241c0016a109501200241c0016a20022802c8014104106d20022802c001220320022802c80122006a2001410c6a2800003600002002200041046a22003602c801200141106a22012004470d000b0b2000ad4220862003ad842106024020022802102201450d000240200241186a2802002200450d002000410474210003400240200141046a280200450d00200128020010260b200141106a2101200041706a22000d000b0b200228021441ffffffff0071450d00200228021010260b20024180036a240020060f0b1034000b1033000b840201037f02400240200041046a2802002202200041086a28020022036b4120490d00200028020021040c010b0240024002400240200341206a22042003490d00200241017422032004200320044b1b22034108200341084b1b22034100480d002000280200410020021b2204450d0120022003460d032002450d0120042002200310282204450d020c030b102e000b2003102422040d010b102c000b20002004360200200041046a2003360200200041086a28020021030b200420036a22042001290000370000200441186a200141186a290000370000200441106a200141106a290000370000200441086a200141086a290000370000200041086a200341206a3602000b880903047f047e027f230041f0016b2202240041002103200241003a008001200041d4c0c70020011b2100024002400240034020012003460d01200241e0006a20036a200020036a2d00003a00002002200341016a22033a00800120034120470d000b200241c0006a41186a2200200241e0006a41186a290300370300200241c0006a41106a2204200241e0006a41106a290300370300200241c0006a41086a2205200241e0006a41086a29030037030020022002290360370340200341ff017141204f0d010c020b200341ff0171450d01200241003a0080010c010b200241086a2005290300370300200241106a2004290300370300200241186a20002903003703002002200229034037030020012003470d00200241c0006a41186a200241186a2903002206370300200241c0006a41106a200241106a22002903002207370300200241c0006a41086a200241086a2903002208370300200220022903002209370340200241e0006a41186a22042006370300200241e0006a41106a22052007370300200241e0006a41086a220a200837030020022009370360200241b0016a41808cc700410610fb01200241c0016a41e292c400410710fb01024002400240412010242203450d00200242203702e401200220033602e001200241e0016a41004120106d20022802e001220320022802e801220b6a22012002290360370000200141086a200a290300370000200141106a2005290300370000200141186a20042903003700002002200b41206a22013602e80120022003200110bc022002412c6a200320016a360200200220033602282002200036022420022002360220200241d0016a200241206a1073024020022802e401450d00200310260b20022802d801220341206a2201417f4c0d010240024020010d0041012100410021010c010b200110242200450d010b200241003602282002200036022020022001360224200241206a4100411010c9012002280220200228022822016a220020022900b001370000200041086a200241b0016a41086a2900003700002002200141106a2201360228200241206a2001411010c9012002280220200228022822016a220020022900c001370000200041086a200241c0016a41086a2900003700002002200141106a220036022820022802d0012101200241206a2000200310c90120022802202200200228022822046a2001200310cf061a2002200420036a2203360228024020022802d401450d00200110260b200241e0006a2000200310d90320022903602106200241a8016a280200210302402002280224450d00200010260b4104102422010d020b1033000b1034000b2002420437026420022001360260200241e0006a41004104106d20022802602201200228026822006a2003410020064201511b360000200241f0016a2400200041046aad4220862001ad840f0b200241cc006a4104360200200241f4006a410236020020024202370264200241b882c700360260200241043602442002418889c70036024020024100360224200241d4c0c7003602202002200241c0006a3602702002200241206a360248200241e0006a41c882c700103d000bac0604017f017e027f027e23004190126b2202240020024280808080802037021c2002200136022c2002200041d4c0c70020011b3602282002200241286a360218200241c80e6a200241186a10d301420321030240024020022903b00f4203510d00200241800b6a200241c80e6a41c80310cf061a02402002280218220028020422044104490d0020002802002205280000210120002004417c6a3602042000200541046a360200200241980a6a200241800b6a41e80010cf061a20022903e80b2103200241c0076a200241f00b6a41d80210cf061a0c020b200241980c6a109803420321030b0b200241d8066a200241980a6a41e80010cf061a20024180046a200241c0076a41d80210cf061a0240024020034203510d00200241306a200241d8066a41e80010cf061a2002200337039801200241a0016a20024180046a41d80210cf062100200220013602f803024002402002280218280204450d00200241c8016a109803420321030c010b200241c0076a200241306a41e80010cf061a200241c80e6a200041d80210cf061a0b20034203520d010b2002418c0b6a4104360200200241c4006a410236020020024202370234200241b882c700360230200241043602840b200241a089c7003602800b2002410036028404200241d4c0c700360280042002200241800b6a360240200220024180046a3602880b200241306a41c882c700103d000b20024180046a200241c0076a41e80010cf061a200241800b6a200241c80e6a41d80210cf061a200241306a20024180046a41e80010cf061a2002200337039801200241a0016a200241800b6a41d80210cf061a200241c80e6a200241c8016a220010a103200241086a200120022903c80e22034200420020022d00d10e41004710ec03200241086a41086a29030021062002290308210720022d00d00e210120001098032002410036023820024201370330200241306a41004108106d2002280230200228023822006a20033700002002200041086a360238200241306a2001109701200241306a20022802384110106d20022802302201200228023822006a220420063700082004200737000020024190126a2400200041106aad4220862001ad840b0a002001280200410e470b0a002001280200410e470b0a002001280200410e470b040041010b040041010b970201017f410121020240024002400240024002400240200041ff01710e0406010200060b41002102200128020041716a220041014b0d0520000e020203020b410021022001280200220041164b0d0402400240024020000e170606060007060606060606060606060606010206070606060b20012d0004220141054b0d064101200174412a710d050c060b20012d00042201417b6a4105490d0420014101460d040c050b200141086a2d0000417f6a41014d0d030c040b41002102200128020041716a220041054b0d03024020000e06030404040400030b200141086a2d00004101470d032001410c6a2802002802004104460f0b20012f01044101460d010c020b200141086a2d0000410a470d010b410121020b20020b130020004105360204200041e0d3c4003602000b130020004103360204200041ccefc1003602000b130020004108360204200041ece2c3003602000b130020004101360204200041d0a7c0003602000b130020004101360204200041c8aac0003602000b130020004103360204200041eca4c0003602000b130020004103360204200041b4fbc5003602000b130020004102360204200041e4b0c0003602000b130020004102360204200041ecacc0003602000b13002000410a3602042000419cb7c1003602000b130020004106360204200041c08dc3003602000b130020004102360204200041b0bbc3003602000b130020004103360204200041f882c4003602000b130020004103360204200041a8c4c5003602000b130020004102360204200041b0ddc6003602000b13002000410436020420004194a1c2003602000b6c01017f200028020022012001280200417f6a3602000240200028020022012802000d002001280208200128020c2802001103000240200128020c280204450d00200128020810260b200028020022012001280204417f6a360204200028020022002802040d00200010260b0bcd0101027f0240200028020022022802082001200228020c28020c110100450d00024020012802004115470d0020012d0004417e6a220241044b0d00024002400240024020020e050001020403000b20002d00042202450d03200220012d0025220341ff0171460d0320024101470d04200341ff0171450d040c030b20002d00042202450d02200220012d0025220341ff0171460d0220024101470d03200341ff0171450d030c020b20002d00040d020c010b20002d00040d010b20002d0004200110a206450d0041010f0b41000bb60201037f20002d0004210202400240200028020022002802082001200028020c28020c110100450d00024020012802004115470d0020012d0004417e6a220341044b0d00024002400240024020030e050001020403000b200241ff01712203450d0320012d0025220441ff01712003460d03200241ff01714101470d04200441ff0171450d040c030b200241ff01712203450d0220012d0025220441ff01712003460d02200241ff01714101470d03200441ff0171450d030c020b200241ff01710d020c010b200241ff01710d010b410121032002200110a2060d010b410021030b20002000280200417f6a2201360200024020010d002000280208200028020c2802001103000240200028020c280204450d00200028020810260b20002000280204417f6a220136020420010d00200010260b20030bcd0101017f024020002d000022014107460d000240200141054b0d00024002400240024020010e06050005010203050b200041146a2200280200109803200028020010260f0b0240200041086a280200450d00200041046a28020010260b200041206a2200280200109803200028020010260f0b200041086a280200450d02200041046a28020010260f0b200041146a2200280200109803200028020010260f0b0240200041086a280200450d00200041046a28020010260b200041206a2200280200109803200028020010260b0bcd0101017f024020002d000022014105460d000240200141034b0d0002400240024020010e0404000102040b0240200041086a28020041ffffff3f71450d00200041046a28020010260b200041106a2200280200109803200028020010260f0b0240200041086a28020041ffffff3f71450d00200041046a28020010260b200041206a280200450d022000411c6a28020010260f0b200041286a28020041ffffff3f71450d01200041246a28020010260f0b200041286a28020041ffffff3f71450d00200041246a28020010260b0bcf0201077f230041106b220124000240024002400240200041086a2802002202450d0020002802002203200241027422046a210541002106200321070240034020072802000d01200741046a2107200641016a21062004417c6a22040d000b2002417f6a21060b2006450d0020022006490d01200220066b220741ffffffff03712007470d0220074102742207417f4c0d024104210402402007450d00200710242204450d040b200141003602082001200436020020012007410276360204200141002005200320064102746a22076b2206410276220410e7012001280200200128020822024102746a2007200610cf061a2001200220046a3602080240200041046a28020041ffffffff0371450d00200028020010260b20002001290300370200200041086a200141086a2802003602000b200141106a24000f0b2006200241c8a7c7001048000b1034000b1033000be503030b7f017e017f02400240200241086a2802002203200141086a28020022046a22054101200541014b1b220641ffffffff03712006470d0020064102742205417f4c0d0002402005102a2207450d0020002007360200200041086a2006360200200020054102763602042004450d022006417f6a2108200520076a417c6a2109200341027420022802006a417c6a210a2001280200210b4100210c024003400240024002400240024002402004200c417f736a220020044f0d00200b20004102746a220d280200450d05024020030d00410021050c050b4200210e41002100200a21022009210503402003200320006a220f417f6a4d0d022006200820006a220f4d0d0320052002350200200d3502007e200e7c20053502007c220e3e02002002417c6a21022005417c6a2105200e422088210e20032000417f6a22006a450d040c000b0b2000200441b0a6c7001032000b200f417f6a200341b0a6c7001032000b200f200641b0a6c7001032000b200ea721050b2006200c20036a417f736a220020064f0d02200720004102746a20053602000b2009417c6a21092008417f6a2108200c41016a220c2004470d000c040b0b2000200641d8a7c7001032000b1033000b1034000b0240200141046a28020041ffffffff0371450d00200128020010260b0b9b0101037f024002402001280208220241ffffffff03712002470d0020024102742203417f4c0d00200128020021040240024020030d00410421010c010b200310242201450d020b20002001360200200041086a220141003602002000200341027636020420004100200210e7012000280200200128020022004102746a2004200241027410cf061a2001200020026a3602000f0b1034000b1033000be30303047f017e057f230041106b22012400024002400240024002400240024020002802002202280200220341016a41004c0d002002200336020020002802042203280200220441016a41004c0d0120022903082105200320043602002000280208220441086a2802002206200028020c220728020022086b41016a220920064f0d024101200028021428020020086a6b22062000280210220841086a28020022006a220a20064f0d0302400240200542ffffffff0f560d00410021002005200428020020094102746a3502007e20032903084220862008280200200a4102746a35020084580d010b20022802000d052002410036020020022002290308427f7c370308200441086a2802002200200020072802006b22024d0d0620032802000d07200428020020024102746a3502002105200341003602002003200520032903087c370308410121000b200141106a240020000f0b41aca8c7004118200141086a41c4a8c70041d4a8c7001036000b41aca8c7004118200141086a41c4a8c70041d4a8c7001036000b2009200641b0a6c7001032000b200a200041b0a6c7001032000b41e1a9c7004110200141086a41f4a9c7004184aac7001036000b2002200041b0a6c7001032000b41e1a9c7004110200141086a41f4a9c7004184aac7001036000bc103030b7f017e027f02400240024002400240200141086a2802002203200241086a2802002204200320044b1b220541016a22064101200641014b1b220741ffffffff03712007470d0020074102742208417f4c0d002008102a2209450d0120002009360200200041086a200736020020002008410276360204024020050d00410021000c050b2007417f6a2106200820096a417c6a21082004417f6a220a20044b210b2002280200210c2001280200210d410021024200210e03404100210002402003417f6a220f20034b0d00410021002003200f20026b22104d0d00410021002010200f4b0d00200d20104102746a28020021000b4100210f0240200b0d002004200a20026b22104d0d002010200a4b0d00200c20104102746a280200210f0b200720064d0d032008200e2000ad7c200fad7c220e3e02002008417c6a21082006417f6a2106200e422088210e2005200241016a2202460d040c000b0b1034000b1033000b2006200741d8a7c7001032000b200ea721000b024020072005417f736a220620074f0d00200920064102746a20003602000240200141046a28020041ffffffff0371450d00200128020010260b0f0b2006200741d8a7c7001032000bba0203027f027e037f230041206b22022400200241106a41086a2203200141086a28020036020020022001290200370310200241106a10b806024002400240200328020022014105744180014b0d00024020010d0042002104420021050c020b2002280210220341786a21062003200141027422016a417c6a280200210741002103200241086a21084200210442002105034020022007ad4200200341e0007110cd06200829030020057c2002290300220520047c2204200554ad7c210520014104460d02200341206a2103200620016a28020021072001417c6a21010c000b0b200041aaa7c70036020420004101360200200041086a411d3602000c010b20004100360200200041106a2005370300200041086a20043703000b0240200228021441ffffffff0371450d00200228021010260b200241206a24000b1000200028020020002802042001105f0b1c00200128021841a5b2c700410f2001411c6a28020028020c1100000bfd0101057f230041106b22022400200241086a2001108f01024002402002280208450d00200041003602000c010b024020012802042203200228020c2204490d00024002402004417f4c0d000240024020040d0041002105410121060c010b2004102a2206450d0220012802042103200421050b0240024020032004490d0020062001280200200410cf0621032001280204220620044f0d012004200641b8afc0001048000b2005450d03200610260c030b2001200620046b3602042001200128020020046a3602002003450d0220002004ad4220862005ad84370204200020033602000c030b1034000b1033000b200041003602000b200241106a24000bb10301047f230041c0006b2202240020002802002103410121000240200128021841f29cc000410c2001411c6a28020028020c1100000d0002400240200328020822000d0020032802002200200328020428020c11070042f4f99ee6eea3aaf9fe00520d012002200036020c2002411836021420022002410c6a36021020012802182104200128021c2105410121002002413c6a41013602002002420237022c200241809dc0003602282002200241106a36023820042005200241286a10350d020c010b2002200036020c2002410836021420022002410c6a36021020012802182104200128021c2105410121002002413c6a41013602002002420237022c200241809dc0003602282002200241106a36023820042005200241286a10350d010b200328020c2100200241106a41146a4101360200200241106a410c6a410136020020022000410c6a3602202002200041086a360218200241043602142002200036021020012802182100200128021c2101200241286a41146a41033602002002420337022c200241909dc0003602282002200241106a36023820002001200241286a103521000b200241c0006a240020000b0600200010000b0600200010010b9a0201057f230041106b22022400024002400240200128020022030d00410121040c010b0240200141086a28020041056a2204417f4c0d0020040d0141002104410121050c020b1034000b2004102422050d001033000b200241003602082002200536020020022004360204200241004101106d20022802002205200228020822046a21060240024020030d00200641003a0000200441016a21040c010b200641013a00002002200441016a360208200141086a28020022042002106c200220022802082004106d20022802002205200228020822016a2003200410cf061a200120046a21040b20002002290300370204200041013602002000410c6a2004360200200041106a2004ad4220862005ad84370300200241106a24000bda0101057f230041206b22022400024002402001422088a722030d004101210441002103410021050c010b2001a72104410121050b2002200336020c200220043602080240024002402003450d0020042d0000210620022003417f6a36020c2002200441016a360208200641014b0d00024020060e020200020b200241106a200241086a10c00620022802102203450d00200229021421010c020b4196aec700412e200241106a41c4aec70041d4aec7001036000b410021030b200020013702042000200336020002402005450d00200410260b200241206a24000b1c00200128021841a5b2c700410f2001411c6a28020028020c1100000be40103027f017e017f02400240200041046a2802002202200028020822036b20014f0d0002400240200320016a22012003490d00200241017422032001200320014b1b22014104200141044b1bad420c7e2204422088a722030d002004a722014100480d0020034541027421050240024002402000280200410020021b22030d0020010d01200521030c040b2002410c6c22022001460d03024020020d0020010d01410421030c040b20032002200110282203450d010c030b2001102422030d020b20050d030b102e000b20002003360200200041046a2001410c6e3602000b0f0b102c000b1c00200128021841a5b2c700410f2001411c6a28020028020c1100000bca0201047f230041106b22022400024002400240024020002d002c410171450d0002400240200028020041244b0d00200041056a2103200021040c010b2000410c6a2104200041086a28020021030b2003450d0220042802002204450d02200420036a417f6a220320032d00002001723a00000c010b41242104024002402000280200220541244b0d00200021030c010b2000410c6a2103200521040b0240200328020022032004470d0020022000410110cd0420022802004101470d00200241086a2802000d0341c8bcc700411141dcbcc700102f000b2001410474210102400240200028020041244b0d00200041056a2104200021050c010b2000410c6a2105200041086a28020021040b2005200341016a360200200420036a20013a00000b2000200028022c41016a36022c200241106a24000f0b4190b8c700413a41ccb8c7001053000b102c000bcf0101027f230041306b22032400024002400240024020024125490d002002417f4c0d02200210242204450d0320042001200210cf0621012000410c6a2002360200200041086a2001360200410121010c010b2003410c6a2001200210cf061a200041256a2003412c6a2800003600002000411d6a200341246a290000370000200041156a2003411c6a2900003700002000410d6a200341146a290000370000200041056a200329000c370000410021010b200020013a000420002002360200200341306a24000f0b1034000b1033000b4c01017f230041206b22052400200542003703182005420037031020052001200220032004200541106a10ce06200529031021012000200529031837030820002001370300200541206a24000b7501027e200020034220882205200142208822067e200320027e7c200420017e7c200342ffffffff0f832203200142ffffffff0f8322017e2204422088200320067e7c22034220887c200342ffffffff0f83200520017e7c22034220887c37030820002003422086200442ffffffff0f83843703000b5701017e02400240200341c000710d002003450d012001410020036b413f71ad8820022003413f71ad220486842102200120048621010c010b20012003413f71ad862102420021010b20002001370300200020023703080bdf0502037f067e230041306b2206240002400240024002400240024002400240024002402002500d002003500d012004500d02200479a7200279a76b2207413f4b0d0341ff0020076b2108200741016a21070c080b02402004500d0020050d040c060b024002402005450d0020034200510d0620054200370308200520012003823703000c010b20034200510d050b200120038021010c060b2004500d030240024002402001500d0020047b4201510d01200479a7200279a76b2207413e4b0d0241ff0020076b2108200741016a21070c090b02402005450d0020054200370300200520022004823703080b200220048021010c070b02402005450d002005200137030020052004427f7c2002833703080b200220047a8821010c060b2005450d040c020b024020037b4201510d0041bf7f200379a7200279a76b22076b2108200741c1006a21070c060b02402005450d002005420037030820052003427f7c2001833703000b20034201510d06200641206a2001200220037aa710d406200641286a2903002102200629032021010c060b2005450d020b2005200137030020052002370308420021010c020b00000b420021010b420021020c010b200620012002200841ff007110cd06200641106a20012002200741ff007110d406200641086a2903002102200641106a41086a2903002109200629030021012006290310210a0240024020070d004200210b4200210c0c010b4200210c4200210d03402009420186200a423f8884220b200b427f8520047c2002423f88200a42018684220a427f85220b20037c200b54ad7c423f87220b2004837d200a200b200383220e54ad7d2109200a200e7d210a20024201862001423f888442008421022001420186200d842101200b420183220b210d2007417f6a22070d000b0b02402005450d002005200a370300200520093703080b200c20024201862001423f8884842102200b20014201868421010b2000200137030020002002370308200641306a24000b3601017f02402002450d00200021030340200320012d00003a0000200141016a2101200341016a21032002417f6a22020d000b0b20000b7101017f0240024020012000490d002002450d01200021030340200320012d00003a0000200141016a2101200341016a21032002417f6a22020d000c020b0b2002450d002001417f6a21012000417f6a21030340200320026a200120026a2d00003a00002002417f6a22020d000b0b20000b2c01017f02402002450d00200021030340200320013a0000200341016a21032002417f6a22020d000b0b20000b4a01037f4100210302402002450d000240034020002d0000220420012d00002205470d01200041016a2100200141016a21012002417f6a2202450d020c000b0b200420056b21030b20030b3e01017f230041106b2205240020052001200220032004410010ce06200529030021012000200541086a29030037030820002001370300200541106a24000b5701017e02400240200341c000710d002003450d0120012003413f71ad2204882002410020036b413f71ad86842101200220048821020c010b20022003413f71ad882101420021020b20002001370300200020023703080b0beac2070300418080c0000bbbc20710001000170000000c020000050000007372632f6c6962616c6c6f632f7261775f7665632e727300b70010004600000068010000130000001900000004000000040000001a0000001b0000001c0000006120666f726d617474696e6720747261697420696d706c656d656e746174696f6e2072657475726e656420616e206572726f72001900000000000000010000001d000000a4001000130000004a0200001c0000007372632f6c6962616c6c6f632f666d742e72732f72757374632f313639353762643464336135333737323633663736656437346335373261616438653462376535392f7372632f6c6962636f72652f666d742f6d6f642e72737372632f6c6962616c6c6f632f7665632e7273292073686f756c64206265203c206c656e2028697320000050011000140000006401100017000000580f100001000000fd00100013000000f60300000d000000696e73657274696f6e20696e6465782028697320292073686f756c64206265203c3d206c656e202869732000a4011000120000001001100016000000580f100001000000fd00100013000000260400000d00000072656d6f76616c20696e64657820286973200000e001100016000000f601100023000000580f100001000000fd00100013000000320500000d000000737461727420647261696e20696e6465782028697320292073686f756c64206265203c3d20656e6420647261696e20696e646578202869732000000044021000140000006401100017000000580f100001000000fd00100013000000380500000d000000656e6420647261696e20696e6465782028697320780210002000000098021000120000001900000000000000010000001e000000696e646578206f7574206f6620626f756e64733a20746865206c656e20697320206275742074686520696e646578206973203030303130323033303430353036303730383039313031313132313331343135313631373138313932303231323232333234323532363237323832393330333133323333333433353336333733383339343034313432343334343435343634373438343935303531353235333534353535363537353835393630363136323633363436353636363736383639373037313732373337343735373637373738373938303831383238333834383538363837383838393930393139323933393439353936393739383939000084031000060000008a03100022000000696e64657820206f7574206f662072616e676520666f7220736c696365206f66206c656e67746820bc03100016000000d20310000d000000736c69636520696e64657820737461727473206174202062757420656e64732061742000430e100016000000040800002f0000005b2e2e2e5d000000580410000b0000002d0e10001600000097041000010000000b0e10000e000000190e1000040000001d0e1000100000009704100001000000580410000b00000063041000260000008904100008000000910410000600000097041000010000006279746520696e64657820206973206e6f742061206368617220626f756e646172793b20697420697320696e7369646520202862797465732029206f66206060d604100002000000c0041000160000005d04000024000000c00410001600000053040000110000007372632f6c6962636f72652f666d742f6d6f642e72732e2eea04100016000000540000001400000030787372632f6c6962636f72652f666d742f6e756d2e727300010305050606030706080809110a1c0b190c140d100e0d0f0410031212130916011705180219031a071c021d011f1620032b032c022d0b2e01300331023201a702a902aa04ab08fa02fb05fd04fe03ff09ad78798b8da23057588b8c901c1ddd0e0f4b4cfbfc2e2f3f5c5d5fb5e2848d8e9192a9b1babbc5c6c9cadee4e5ff00041112293134373a3b3d494a5d848e92a9b1b4babbc6cacecfe4e500040d0e11122931343a3b4546494a5e646584919b9dc9cecf0d112945495764658d91a9b4babbc5c9dfe4e5f00d11454964658084b2bcbebfd5d7f0f183858ba4a6bebfc5c7cecfdadb4898bdcdc6cecf494e4f57595e5f898e8fb1b6b7bfc1c6c7d71116175b5cf6f7feff800d6d71dedf0e0f1f6e6f1c1d5f7d7eaeafbbbcfa16171e1f46474e4f585a5c5e7e7fb5c5d4d5dcf0f1f572738f7475962f5f262e2fa7afb7bfc7cfd7df9a409798308f1fc0c1ceff4e4f5a5b07080f10272feeef6e6f373d3f42459091feff536775c8c9d0d1d8d9e7feff00205f2282df048244081b04061181ac0e80ab35280b80e003190801042f043404070301070607110a500f1207550703041c0a090308030703020303030c0405030b06010e15053a0311070605100757070207150d500443032d03010411060f0c3a041d255f206d046a2580c80582b0031a0682fd035907150b1709140c140c6a060a061a0659072b05460a2c040c040103310b2c041a060b0380ac060a06213f4c042d0374083c030f033c0738082b0582ff1118082f112d032010210f808c048297190b158894052f053b07020e180980b32d740c80d61a0c0580ff0580df0cee0d03848d033709815c1480b80880cb2a38030a06380846080c06740b1e035a0459098083181c0a16094c04808a06aba40c170431a10481da26070c050580a511816d1078282a064c04808d0480be031b030f0d0006010103010402080809020a050b020e041001110212051311140115021702190d1c051d0824016a036b02bc02d102d40cd509d602d702da01e005e102e802ee20f004f802f902fa02fb010c273b3e4e4f8f9e9e9f060709363d3e56f3d0d1041418363756577faaaeafbd35e01287898e9e040d0e11122931343a4546494a4e4f64655cb6b71b1c07080a0b141736393aa8a9d8d909379091a8070a3b3e66698f926f5feeef5a629a9b2728559da0a1a3a4a7a8adbabcc4060b0c151d3a3f4551a6a7cccda007191a22253e3fc5c604202325262833383a484a4c50535556585a5c5e606365666b73787d7f8aa4aaafb0c0d0aeaf79cc6e6f935e227b0503042d036603012f2e80821d03310f1c0424091e052b0544040e2a80aa06240424042808340b018090813709160a088098390363080930160521031b05014038044b052f040a070907402027040c0936033a051a07040c07504937330d33072e080a8126524e28082a561c1417094e041e0f430e19070a0648082709750b3f412a063b050a0651060105100305808b621e48080a80a65e22450b0a060d1339070a362c041080c03c64530c48090a46451b4808531d398107460a1d03474937030e080a0639070a81361980b7010f320d839b66750b80c48abc842f8fd18247a1b98239072a040260260a460a28051382b05b654b0439071140050b020e97f80884d62a09a2f7811f3103110408818c89046b050d03090710936080f60a73086e1746809a140c570919808781470385420f1585502b80d52d031a040281703a0501850080d7294c040a04028311444c3d80c23c06010455051b3402810e2c04640c560a80ae381d0d2c040907020e06809a83d8080d030d03740c59070c140c0438080a062808224e81540c15030305070919070709030d072980cb250a840600680a1000200000000a0000001c000000680a1000200000001a000000360000007372632f6c6962636f72652f756e69636f64652f7072696e7461626c652e72730003000083042000910560005d13a0001217a01e0c20e01eef2c202b2a30a02b6fa6602c02a8e02c1efbe02d00fea0359effe035fd016136010aa136240d6137ab0ee1382f182139301c6146f31ea14af06a614e4f6fa14e9dbc214f65d1e14f00da215000e0e15130e16153ece2a154d0e8e15420002e55f001bf55e80d100023000000520000003e00000000700007002d0101010201020101480b30151001650702060202010423011e1b5b0b3a09090118040109010301052b03770f0120370101010408040103070a021d013a0101010204080109010a021a010202390104020402020303011e0203010b0239010405010204011402160601013a0101020104080107030a021e013b0101010c0109012801030139030503010407020b021d013a01020102010301050207020b021c02390201010204080109010a021d0148010401020301010801510102070c08620102090b064a021b0101010101370e01050102050b0124090166040106010202021902040310040d01020206010f01000300031d031d021e02400201070801020b09012d03770222017603040209010603db0202013a010107010101010208060a020130113f0430070101050128090c0220040202010338010102030101033a0802029803010d0107040106010302c63a01050001c32100038d016020000669020004010a200250020001030104011902050197021a120d012608190b2e0330010204020227014306020202020c0108012f01330101030202050201012a020801ee010201040100010010101000020001e201950500030102050428030401a50200040002990bb001360f3803310402024503240501083e010c0234090a0402015f03020101020601a0010308150239020101010116010e070305c308020301011701510102060101020101020102eb010204060201021b025508020101026a0101010206010165030204010500090102f5010a0201010401900402020401200a280602040801090602032e0d010200070106010152160207010201027a060301010201070101480203010101000200053b0700013f0451010002000101030405080802071e0494030037043208010e011605010f000701110207010201050007000400076d07006080f000000000e80d1000230000004b00000028000000e80d10002300000057000000160000007372632f6c6962636f72652f756e69636f64652f756e69636f64655f646174612e7273626567696e203c3d20656e642028203c3d2029207768656e20736c6963696e672060206973206f7574206f6620626f756e6473206f6620607372632f6c6962636f72652f7374722f6d6f642e7273426f72726f774572726f72426f72726f774d75744572726f7270616e69636b6564206174200000a90e100001000000aa0e10000300000054e0110000000000a80e100001000000a80e1000010000003a27272c2020202020000000d40e10001a000000b001000026000000430e100016000000c30700002f0000007372632f6c6962636f72652f7374722f7061747465726e2e72730000000f10001b00000052000000050000007372632f6c6962636f72652f736c6963652f6d656d6368722e72732c20000000190000000c000000040000001f00000020000000210000002c0a000019000000040000000400000022000000230000002400000028280a2c290a5d5b430e100016000000800700002f00000030625965734e6f706179735f6665653d6d61782d77656967687461637475616c5f7765696768743d19000000040000000400000025000000260000002700000019000000000000000100000028000000290000002a00000054e011000000000000000000ffffffff00000000010000000000000082800000000000008a8000000000008000800080000000808b800000000000000100008000000000818000800000008009800000000000808a00000000000000880000000000000009800080000000000a000080000000008b800080000000008b0000000000008089800000000000800380000000000080028000000000008080000000000000800a800000000000000a0000800000008081800080000000808080000000000080010000800000000008800080000000801900000000000000010000002b0000002c0000002a0000001900000000000000010000002b0000002c0000002a00000001a8010001605354524f424576312e302e320000ec10100058000000680000000d0000002f686f6d652f6261737469616e2f2e636172676f2f72656769737472792f7372632f6769746875622e636f6d2d316563633632393964623965633832332f6d65726c696e2d322e302e302f7372632f7374726f62652e72731a12100019000000331210001600000000000000200000000400000002000000000000000200000000000000030000000100000020000000040000000200000000000000020000000000000003000000ec10100058000000880000000d000000dc1110003e000000ec101000580000009100000009000000ec101000580000005e00000009000000ec101000580000005f00000009000000596f75207573656420746865205420666c61672c207768696368207468697320696d706c656d656e746174696f6e20646f65736e277420737570706f7274596f7520747269656420746f20636f6e74696e7565206f702020627574206368616e67656420666c61677320746f20000000ec101000580000007c00000015000000ec101000580000007d0000000d00000000000000f01210000e00000000000000001310000100000000000000000000000813100001000000000000000000000010131000060000000000000054e011000000000000000000000000001813100001000000000000000000000020131000070000000000000054e011000000000000000000000000002813100001000000000000004e6577417574686f7269746965730000b31310000d0000007f1310003400000050617573656400005813100027000000526573756d65640030131000280000002043757272656e7420617574686f726974792073657420686173206265656e20726573756d65642e2043757272656e7420617574686f726974792073657420686173206265656e207061757365642e204e657720617574686f726974792073657420686173206265656e206170706c6965642e205b617574686f726974795f7365745d417574686f726974794c697374386510005f000000de0000002e00000000000000fc1310000700000000000000041410000300000000000000000000001c14100004000000000000004f6666656e636500c667100004000000ca6710000e0000006bbe1100040000003c141000550000009114100053000000e4141000470000002b1510001b00000020546865726520697320616e206f6666656e6365207265706f72746564206f662074686520676976656e20606b696e64602068617070656e656420617420746865206073657373696f6e5f696e6465786020616e6420286b696e642d7370656369666963292074696d6520736c6f742e2054686973206576656e74206973206e6f74206465706f736974656420666f72206475706c696361746520736c61736865732e206c61737420656c656d656e7420696e64696361746573206f6620746865206f6666656e636520776173206170706c69656420287472756529206f7220717565756564202866616c73652920205b6b696e642c2074696d65736c6f742c206170706c6965645d2e000000000000741510000a00000000000000801510000100000000000000000000008815100002000000000000004e657753657373696f6e0000a47411000c0000009815100057000000ef15100022000000204e65772073657373696f6e206861732068617070656e65642e204e6f746520746861742074686520617267756d656e7420697320746865205b73657373696f6e5f696e6465785d2c206e6f742074686520626c6f636b206e756d626572206173207468652074797065206d6967687420737567676573742e74696d7374617030496e76616c69642074696d657374616d7020696e686572656e74206461746120656e636f64696e672e54696d657374616d7020696e686572656e742064617461206973206e6f742070726f76696465642e000000000000c41610001000000000000000d4161000020000000000000000000000e4161000020000000000000000000000f41610000e0000000000000054e011000000000000000000000000000417100001000000000000004261746368496e746572727570746564689011000300000018d911000d0000003f1710005600000095171000220000004261746368436f6d706c6574656400000c17100033000000204261746368206f66206469737061746368657320636f6d706c657465642066756c6c792077697468206e6f206572726f722e204261746368206f66206469737061746368657320646964206e6f7420636f6d706c6574652066756c6c792e20496e646578206f66206669727374206661696c696e6720646973706174636820676976656e2c2061732077656c6c20617320746865206572726f722e205b696e6465782c206572726f725d00c81710006300000094000000120000002f686f6d652f6261737469616e2f2e636172676f2f72656769737472792f7372632f6769746875622e636f6d2d316563633632393964623965633832332f7061726974792d7363616c652d636f6465632d312e332e342f7372632f636f6465632e72734572726f725377617070696e672064697361626c6564000000bc301100470000001b0300001a000000bc30110047000000150300001800000000000000bc1810001400000000000000d0181000010000000000000000000000d8181000010000000000000000000000e01810001600000000000000d0181000010000000000000000000000f818100001000000000000005061726174687265616452656769737465726564184b11000600000035191000350000005061726174687265616444657265676973746572656400000019100035000000205468652070617261746872656164206f662074686520737570706c696564204944207761732064652d726567697374657265642e204120706172617468726561642077617320726567697374657265643b20697473206e657720494420697320737570706c6965642e73776170646572656769737465725f7061726174687265616473656c6563745f7061726174687265616472656769737465725f706172617468726561647365745f7468726561645f636f756e74646572656769737465725f7061726172656769737465725f706172610000000000601a10001100000000000000741a10000100000000000000000000007c1a10000e000000000000008c1a1000010000000000000000000000941a10000f00000000000000a41a1000010000000000000000000000ac1a10000c00000000000000b81a1000010000000000000000000000a03511001000000000000000c01a1000010000000000000050617261416c72656164794578697374730000002a1b10001a000000496e76616c6964436861696e49640000141b100016000000496e76616c6964546872656164496400fd1a100017000000436f6465546f6f4c61726765e51a100018000000c81a10001d00000020496e76616c69642070617261206865616420646174612073697a652e20496e76616c6964207061726120636f64652073697a652e20496e76616c696420706172617468726561642049442e20496e76616c69642070617261636861696e2049442e2050617261636861696e20616c7265616479206578697374732e541b10004600000009020000110000002f686f6d652f6261737469616e2f70726f6a656374732f7061726974792f706f6c6b61646f742f72756e74696d652f636f6d6d6f6e2f7372632f7265676973747261722e7273446562746f727352616e646f6d4d6174657269616c2f686f6d652f6261737469616e2f2e636172676f2f6769742f636865636b6f7574732f7375627374726174652d376530383433336434633337306132312f383730363363332f6672616d652f72616e646f6d6e6573732d636f6c6c6563746976652d666c69702f7372632f6c69622e7273436865636b5370656356657273696f6e4c696d697450617261746872656164436f6d6d6974730000541b100046000000730200002d00000000000000c61910000d000000000000008c1d1000040000000000000000000000ec1d1000050000000000000000000000b71910000f00000000000000141e10000100000000000000000000002c1e1000010000000000000000000000a71910001000000000000000341e10000100000000000000000000004c1e1000050000000000000000000000941910001300000000000000741e1000020000000000000000000000a41e1000080000000000000000000000831910001100000000000000e41e10000300000000000000000000002c1f10000500000000000000000000006e191000150000000000000054e01100000000000000000000000000541f10000700000000000000000000006a19100004000000000000008c1f1000010000000000000000000000a41f1000080000000000000000000000c5fb10000200000000000000162210000f00000000000000335010000400000000000000882710000800000000000000dc1611000400000000000000605111000e00000000000000e525100011000000000000007152110008000000b72610003e000000f52610002300000054e0110000000000182710003d000000552710003300000000000000c5fb10000200000000000000162210000f0000009226100025000000000000008d26100005000000000000006890110003000000f62510005000000054e0110000000000462610002600000054e01100000000006c2610002100000000000000dc1611000400000000000000605111000e00000000000000e5251000110000000000000071521100080000007d2410002900000054e0110000000000a624100053000000f92410004e00000054e0110000000000472510004c000000932510004a000000dd25100008000000000000005d2410000300000000000000162210000f00000000000000602410000900000000000000692410000a00000000000000732410000a000000000000001c1e110007000000602310004100000054e0110000000000a123100050000000f1231000570000004824100015000000252210003200000054e0110000000000572210004800000054e01100000000009f22100056000000f522100051000000462310001a00000000000000112210000500000000000000162210000f000000e41f1000590000003d20100059000000962010005700000054e0110000000000ed2010005800000045211000500000009521100056000000eb21100026000000205377617020612070617261636861696e207769746820616e6f746865722070617261636861696e206f7220706172617468726561642e20546865206f726967696e206d7573742062652061206050617261636861696e602e2054686520737761702077696c6c2068617070656e206f6e6c7920696620746865726520697320616c726561647920616e206f70706f7369746520737761702070656e64696e672e204966207468657265206973206e6f742c2074686520737761702077696c6c2062652073746f72656420696e207468652070656e64696e67207377617073206d61702c20726561647920666f722061206c6174657220636f6e6669726d61746f727920737761702e20546865206050617261496460732072656d61696e206d617070656420746f207468652073616d652068656164206461746120616e6420636f646520736f2065787465726e616c20636f64652063616e2072656c79206f6e20605061726149646020746f2062652061206c6f6e672d7465726d206964656e746966696572206f662061206e6f74696f6e616c202270617261636861696e222e20486f77657665722c207468656972207363686564756c696e6720696e666f2028692e652e2077686574686572207468657927726520612070617261746872656164206f722070617261636861696e292c2061756374696f6e20696e666f726d6174696f6e20616e64207468652061756374696f6e206465706f736974206172652073776974636865642e6f74686572436f6d706163743c5061726149643e20446572656769737465722061207061726174687265616420616e6420726574726965766520746865206465706f7369742e204d7573742062652073656e742066726f6d2061206050617261636861696e60206f726967696e2077686963682069732063757272656e746c79206120706172617468726561642e20456e737572652074686174206265666f72652063616c6c696e672074686973207468617420616e792066756e647320796f752077616e7420656d70746965642066726f6d2074686520706172617468726561642773206163636f756e74206973206d6f766564206f75743b20616674657220746869732069742077696c6c20626520696d706f737369626c6520746f207265747269657665207468656d2028776974686f757420676f7665726e616e636520696e74657276656e74696f6e292e20506c61636520612062696420666f722061207061726174687265616420746f2062652070726f6772657373656420696e20746865206e65787420626c6f636b2e20546869732069732061206b696e64206f66207370656369616c207472616e73616374696f6e20746861742073686f756c642062652068656176696c79207072696f726974697a656420696e20746865207472616e73616374696f6e20706f6f6c206163636f7264696e6720746f20746865206076616c7565603b206f6e6c792060546872656164436f756e7460206f66207468656d206d61792062652070726573656e74656420696e20616e792073696e676c6520626c6f636b2e5f69645f636f6c6c61746f72436f6c6c61746f7249645f686561645f686173682052656769737465722061207061726174687265616420666f7220696d6d656469617465207573652e204d7573742062652073656e742066726f6d2061205369676e6564206f726967696e20746861742069732061626c6520746f206861766520506172617468726561644465706f7369742072657365727665642e2060636f64656020616e642060696e697469616c5f686561645f646174616020617265207573656420746f20696e697469616c697a6520746865207061726174687265616427732073746174652e20556e6c696b65206072656769737465725f70617261602c20746869732066756e6374696f6e20646f657320636865636b207468617420746865206d6178696d756d20636f64652073697a6520616e64206865616420646174612073697a6520617265207265737065637465642c206173207061726174687265616420726567697374726174696f6e20697320616e2061746f6d696320616374696f6e2e696e697469616c5f686561645f6461746120526573657420746865206e756d626572206f6620706172617468726561647320746861742063616e2070617920746f206265207363686564756c656420696e20612073696e676c6520626c6f636b2e202d2060636f756e74603a20546865206e756d626572206f662070617261746872656164732e204d7573742062652063616c6c65642066726f6d20526f6f74206f726967696e2e636f756e74204465726567697374657220612070617261636861696e207769746820676976656e20696420526567697374657220612070617261636861696e207769746820676976656e20636f64652e204d7573742062652063616c6c656420627920726f6f742e204661696c7320696620676976656e20494420697320616c726561647920757365642e20556e6c696b65207468652060526567697374726172602074726169742066756e6374696f6e206f66207468652073616d65206e616d652c207468697320636865636b732074686520636f646520616e642068656164206461746120616761696e73742073697a65206c696d6974732e50617261496e666f000000006bc611000a00000000000000000000002d5311000b0000000000000000000000000000000000000000000000000000000000000054e01100a82a1000000000000000000054e0110000000000000000000100000000000000b82a10000b000000000000000000000068901100030000000000000000000000000000000000000000000000000000000000000054e01100c42a10000000000000000000d42a100001000000000000000100000000000000dc2a10000f0000000000000000000000eb2a10001e0000000000000000000000000000000000000000000000000000000000000054e011000c2b100000000000000000001c2b1000020000000000000001000000000000002c2b1000060000000000000000000000322b10002e0000000000000000000000000000000000000000000000000000000000000054e01100602b10000000000000000000702b100006000000000000000100000000000000a02b10000a0000000000000000000000184b1100060000000000000000000000000000000000000000000000000000000000000054e01100ac2b10000000000000000000bc2b100002000000000000000100000000000000cc2b10000b0000000105000000000000184b11000600000000000000184b1100060000000000000000000000000000000000000054e01100d82b10000000000000000000e82b100001000000000000000000000000000000f02b1000050000000105000000000000184b1100060000000000000088271000080000000000000000000000000000000000000054e01100f82b10000000000000000000082c100001000000000000000000000000000000102c10000a0000000000000000000000eb2a10001e0000000000000000000000000000000000000000000000000000000000000054e011001c2c100000000000000000002c2c1000010000000000000001000000000000009a1b1000070000000105000000000000184b110006000000000000003aa311000c0000000000000000000000000000000000000054e01100342c10000000000000000000442c10000100000000000000010000001900000000000000010000002d000000546872656164436f756e74001900000000000000010000002e000000442f10002d00000053656c6563746564546872656164735665633c5665633c285061726149642c20436f6c6c61746f724964293e3e0000001900000000000000010000002f000000a42e100054000000f82e10004c0000004163746976655665633c285061726149642c204f7074696f6e3c28436f6c6c61746f7249642c20526574726961626c65293e293e19000000000000000100000030000000582d100057000000af2d100058000000072e1000560000005d2e10003400000054e0110000000000912e1000130000004e657874467265654964000019000000000000000100000031000000f42c10004f000000432d10001500000050656e64696e67537761700019000000000000000100000032000000db2c100019000000506172617300000019000000000000000100000032000000b12c10002a0000005265747279517565756500001900000000000000010000002f000000772c10003a000000190000000000000001000000330000004c2c10002b0000002055736572732077686f20686176652070616964206120706172617468726561642773206465706f736974205468652063757272656e7420717565756520666f7220706172617468726561647320746861742073686f756c6420626520726574726965642e204d6170206f6620616c6c20726567697374657265642070617261746872656164732f636861696e732e2050656e64696e672073776170206f7065726174696f6e732e20546865206e65787420756e75736564205061726149642076616c75652e2053746172742074686973206869676820696e206f7264657220746f206b656570206c6f77206e756d6265727320666f722073797374656d2d6c6576656c20636861696e732e2050617261746872656164732f636861696e73207363686564756c656420666f7220657865637574696f6e207468697320626c6f636b2e2049662074686520636f6c6c61746f72204944206973207365742c207468656e206120706172746963756c617220636f6c6c61746f722068617320616c7265616479206265656e2063686f73656e20666f7220746865206e65787420626c6f636b2c20616e64206e6f206f7468657220636f6c6c61746f72206d61792070726f766964652074686520626c6f636b2e20496e2074686973206361736520776520616c6c6f772074686520706f73736962696c697479206f662074686520636f6d62696e6174696f6e206265696e67207265747269656420696e2061206c6174657220626c6f636b2c206578707265737365642062792060526574726961626c65602e204f726465726564206279205061726149642e20416e206172726179206f6620746865207175657565206f6620736574206f662074687265616473207363686564756c656420666f722074686520636f6d696e6720626c6f636b733b206f72646572656420627920617363656e64696e6720706172612049442e2054686572652063616e206265206e6f206475706c696361746573206f66207061726120494420696e2065616368206c697374206974656d2e20546865206e756d626572206f66207468726561647320746f207363686564756c652070657220626c6f636b2e00000000000000a11b10000e0000000000000000000000cc2f10000c0000000000000000000000000000000000000000000000000000000000000054e01100d82f10000000000000000000e82f10000300000000000000010000005665633c543a3a486173683e1900000000000000010000002f00000000301000580000005830100058000000b03010001100000020536572696573206f6620626c6f636b20686561646572732066726f6d20746865206c61737420383120626c6f636b73207468617420616374732061732072616e646f6d2073656564206d6174657269616c2e205468697320697320617272616e67656420617320612072696e672062756666657220776974682060626c6f636b5f6e756d626572202520383160206265696e672074686520696e64657820696e746f20746865206056656360206f6620746865206f6c6465737420686173682e000000190000000400000004000000250000002600000034000000af1b100071000000550000001100000048617368207461626c65206361706163697479206f766572666c6f7753757065724f664e6f74537562416c7265616479436c61696d6564546f6f4d616e7952656769737472617273546f6f4d616e794669656c6473496e76616c6964546172676574496e76616c6964496e646578496e76616c69644a756467656d656e744a756467656d656e74476976656e537469636b794a756467656d656e744e6f4964656e746974794665654368616e676564456d707479496e6465784e6f744e616d6564546f6f4d616e795375624163636f756e74734e6f744f776e656400000000005c3410000d0000000000000094a810000100000000000000000000006c3410000d0000000000000000000000d43410000c00000000000000e0341000010000000000000000000000f834100013000000000000000000000090351000080000000000000098351000010000000000000000000000b0351000150000000000000000000000583610000e0000000000000054e0110000000000000000000000000068361000120000000000000000000000f836100011000000000000000c3710000200000000000000000000003c371000170000000000000000000000f43710000e00000000000000043810000100000000000000000000001c381000110000000000000000000000a43810000700000000000000ac381000020000000000000000000000dc3810000d0000000000000000000000443910000e0000000000000054391000020000000000000000000000843910000d0000000000000000000000ec3910000a00000000000000f8391000020000000000000000000000283a10000d0000000000000000000000903a10001100000000000000a43a1000030000000000000000000000ec3a1000130000000000000000000000843b10000d0000000000000038d21000010000000000000000000000943b10001300000000000000000000002c3c10000700000000000000343c1000020000000000000000000000643c10000700000000000000000000009c3c10000a00000000000000343c1000020000000000000000000000a83c1000040000000000000000000000c83c10000a00000000000000d43c1000010000000000000000000000ec3c1000070000000000000000000000243d1000080000000000000054e011000000000000000000000000002c3d10000a000000000000006164645f726567697374726172000000435010001f00000054e0110000000000625010004000000054e0110000000000a25010002b00000054e0110000000000cd5010002600000054e0110000000000a9a211000b000000f35010004a0000003d51100027000000e8b010000d00000027a311000c0000007365745f6964656e7469747900000000335010000400000000000000375010000c000000394e10004b00000054e0110000000000844e100056000000da4e10001500000054e0110000000000b8a611003400000054e0110000000000ef4e10002400000054e0110000000000134f10002300000054e0110000000000a9a211000b000000364f100012000000484f100048000000904f100039000000c94f100021000000ea4f100049000000e8b010000d00000027a311000c0000007365745f73756273000000001c4e10000400000000000000204e100019000000ec4b10002400000054e0110000000000104c100056000000664c10004c00000054e0110000000000263e100059000000a14a10000a00000054e0110000000000b24c10002d00000054e0110000000000a9a211000b000000df4c10000d000000ec4c10003a000000174b100036000000264d100022000000484d1000060000004e4d100038000000864d100030000000b64d100031000000e74d10003500000027a311000c000000636c6561725f6964656e746974790000164a10004f00000054e0110000000000654a10003c00000054e0110000000000263e100059000000a14a10000a00000054e0110000000000ab4a10002700000054e0110000000000a9a211000b000000d24a100011000000e34a100034000000174b1000360000004d4b100049000000964b100023000000b94b100033000000e8b010000d00000027a311000c000000726571756573745f6a756467656d656e74000000000000002744100009000000000000003044100017000000000000000f4a10000700000000000000d446100015000000554810002600000054e01100000000007b48100056000000d14810000700000054e0110000000000434710004e000000914710001500000054e0110000000000d848100048000000204910005600000054e0110000000000764910000d000000834910002f000000b24910000400000054e0110000000000b64910002a00000054e0110000000000a9a211000b000000a24310000e000000f041100021000000e04910002f000000e8b010000d00000027a311000c00000063616e63656c5f72657175657374000000000000274410000900000000000000474810000e000000e94610001b00000054e0110000000000044710003f00000054e0110000000000434710004e000000914710001500000054e0110000000000a64710005200000054e0110000000000f84710002c00000054e0110000000000a9a211000b000000a24310000e000000f0411000210000002448100023000000a4bf10000c00000027a311000c0000007365745f66656500000000005ca311000500000000000000304410001700000000000000d14610000300000000000000d4461000150000003a4610004700000054e01100000000005d42100056000000924410002900000054e0110000000000bb4410003e000000814610001600000054e0110000000000a9a211000b0000003d4510000a000000474510001f000000974610003a00000027a311000c0000007365745f6163636f756e745f69640000000000005ca3110005000000000000003044100017000000000000008460110003000000000000003aa311000c000000b44510003000000054e01100000000005d42100056000000924410002900000054e0110000000000bb4410003e000000e44510001d00000054e0110000000000a9a211000b0000003d4510000a000000474510001f000000014610003900000027a311000c0000007365745f6669656c64730000000000005ca311000500000000000000304410001700000000000000a04510000600000000000000a64510000e000000674410002b00000054e01100000000005d42100056000000924410002900000054e0110000000000bb4410003e000000f94410004400000054e0110000000000a9a211000b0000003d4510000a000000474510001f000000664510003a00000027a311000c00000070726f766964655f6a756467656d656e74000000000000002744100009000000000000003044100017000000000000007dd710000600000000000000f35f1100230000000000000047441000090000000000000050441000170000002e4210002f00000054e01100000000005d42100056000000b34210002d00000054e0110000000000e04210004900000044411000560000009a4110001e000000294310005300000054e01100000000007c4310002600000054e0110000000000a9a211000b000000a24310000e000000b043100022000000d243100026000000f84310002f000000e8b010000d00000027a311000c0000006b696c6c5f6964656e74697479000000e83f10005100000054e011000000000039401000590000009240100052000000e44010002100000054e0110000000000054110003f00000054e011000000000044411000560000009a4110001e00000054e0110000000000b84110002600000054e0110000000000a9a211000b000000de41100012000000f041100021000000114210001d000000e8b010000d00000027a311000c0000006164645f73756200000000007d3f10000300000000000000f35f11002300000000000000e03f10000400000000000000e43f100004000000b43f10002c00000054e0110000000000a03d100058000000573f10000f00000054e0110000000000263e100059000000663f10001700000072656e616d655f7375620000803f10003400000054e0110000000000263e100059000000663f10001700000072656d6f76655f7375620000000000007d3f10000300000000000000f35f110023000000263f10003100000054e0110000000000a03d100058000000573f10000f00000054e0110000000000263e100059000000663f100017000000717569745f7375627c3d10002400000054e0110000000000a03d100058000000f83d10002e00000054e0110000000000263e1000590000007f3e10001000000054e01100000000008f3e100052000000e13e1000450000002052656d6f7665207468652073656e6465722061732061207375622d6163636f756e742e205061796d656e743a2042616c616e636520726573657276656420627920612070726576696f757320607365745f73756273602063616c6c20666f72206f6e65207375622077696c6c20626520726570617472696174656420746f207468652073656e64657220282a6e6f742a20746865206f726967696e616c206465706f7369746f72292e20546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d7573742068617665206120726567697374657265642073757065722d6964656e746974792e204e4f54453a20546869732073686f756c64206e6f74206e6f726d616c6c7920626520757365642c206275742069732070726f766964656420696e207468652063617365207468617420746865206e6f6e2d20636f6e74726f6c6c6572206f6620616e206163636f756e74206973206d616c6963696f75736c7920726567697374657265642061732061207375622d6163636f756e742e2052656d6f76652074686520676976656e206163636f756e742066726f6d207468652073656e646572277320737562732e20746f207468652073656e6465722e20737562206964656e74697479206f662060737562602e73756220416c74657220746865206173736f636961746564206e616d65206f662074686520676976656e207375622d6163636f756e742e204164642074686520676976656e206163636f756e7420746f207468652073656e646572277320737562732e64617461446174612052656d6f766520616e206163636f756e742773206964656e7469747920616e64207375622d6163636f756e7420696e666f726d6174696f6e20616e6420736c61736820746865206465706f736974732e205061796d656e743a2052657365727665642062616c616e6365732066726f6d20607365745f737562736020616e6420607365745f6964656e74697479602061726520736c617368656420616e642068616e646c65642062792060536c617368602e20566572696669636174696f6e2072657175657374206465706f7369747320617265206e6f742072657475726e65643b20746865792073686f756c642062652063616e63656c6c6564206d616e75616c6c79207573696e67206063616e63656c5f72657175657374602e20546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206d617463682060543a3a466f7263654f726967696e602e202d2060746172676574603a20746865206163636f756e742077686f7365206964656e7469747920746865206a756467656d656e742069732075706f6e2e2054686973206d75737420626520616e206163636f756e742020207769746820612072656769737465726564206964656e746974792e20456d69747320604964656e746974794b696c6c656460206966207375636365737366756c2e202d20604f2852202b2053202b205829602e202d204f6e652062616c616e63652d72657365727665206f7065726174696f6e2e202d206053202b2032602073746f72616765206d75746174696f6e732e2050726f766964652061206a756467656d656e7420666f7220616e206163636f756e742773206964656e746974792e20546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d75737420626520746865206163636f756e74206f6620746865207265676973747261722077686f736520696e64657820697320607265675f696e646578602e202d20607265675f696e646578603a2074686520696e646578206f6620746865207265676973747261722077686f7365206a756467656d656e74206973206265696e67206d6164652e202d20606a756467656d656e74603a20746865206a756467656d656e74206f662074686520726567697374726172206f6620696e64657820607265675f696e646578602061626f75742060746172676574602e20456d69747320604a756467656d656e74476976656e60206966207375636365737366756c2e202d20604f2852202b205829602e202d204f6e652062616c616e63652d7472616e73666572206f7065726174696f6e2e202d20557020746f206f6e65206163636f756e742d6c6f6f6b7570206f7065726174696f6e2e202d2053746f726167653a2031207265616420604f285229602c2031206d757461746520604f2852202b205829602e7265675f696e646578436f6d706163743c526567697374726172496e6465783e6a756467656d656e744a756467656d656e743c42616c616e63654f663c543e3e2053657420746865206669656c6420696e666f726d6174696f6e20666f722061207265676973747261722e206f6620746865207265676973747261722077686f736520696e6465782069732060696e646578602e202d2060696e646578603a2074686520696e646578206f6620746865207265676973747261722077686f73652066656520697320746f206265207365742e202d20606669656c6473603a20746865206669656c64732074686174207468652072656769737472617220636f6e6365726e73207468656d73656c76657320776974682e202d20604f285229602e202d204f6e652073746f72616765206d75746174696f6e20604f285229602e202d2042656e63686d61726b3a20372e343634202b2052202a20302e33323520c2b57320286d696e207371756172657320616e616c79736973296669656c64734964656e746974794669656c6473204368616e676520746865206163636f756e74206173736f63696174656420776974682061207265676973747261722e202d20606e6577603a20746865206e6577206163636f756e742049442e202d2042656e63686d61726b3a20382e383233202b2052202a20302e333220c2b57320286d696e207371756172657320616e616c797369732920536574207468652066656520726571756972656420666f722061206a756467656d656e7420746f206265207265717565737465642066726f6d2061207265676973747261722e202d2060666565603a20746865206e6577206665652e202d2042656e63686d61726b3a20372e333135202b2052202a20302e33323920c2b57320286d696e207371756172657320616e616c7973697329666565436f6d706163743c42616c616e63654f663c543e3e2043616e63656c20612070726576696f757320726571756573742e205061796d656e743a20412070726576696f75736c79207265736572766564206465706f7369742069732072657475726e6564206f6e20737563636573732e20546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d757374206861766520612072656769737465726564206964656e746974792e202d20607265675f696e646578603a2054686520696e646578206f6620746865207265676973747261722077686f7365206a756467656d656e74206973206e6f206c6f6e676572207265717565737465642e20456d69747320604a756467656d656e74556e72657175657374656460206966207375636365737366756c2e202d204f6e652073746f72616765206d75746174696f6e20604f2852202b205829602e526567697374726172496e64657820526571756573742061206a756467656d656e742066726f6d2061207265676973747261722e205061796d656e743a204174206d6f737420606d61785f666565602077696c6c20626520726573657276656420666f72207061796d656e7420746f2074686520726567697374726172206966206a756467656d656e7420676976656e2e202d20607265675f696e646578603a2054686520696e646578206f6620746865207265676973747261722077686f7365206a756467656d656e74206973207265717565737465642e202d20606d61785f666565603a20546865206d6178696d756d206665652074686174206d617920626520706169642e20546869732073686f756c64206a757374206265206175746f2d706f70756c617465642061733a206060606e6f636f6d70696c652053656c663a3a7265676973747261727328292e676574287265675f696e646578292e756e7772617028292e6665652060606020456d69747320604a756467656d656e7452657175657374656460206966207375636365737366756c2e202d2053746f726167653a2031207265616420604f285229602c2031206d757461746520604f2858202b205229602e6d61785f66656520436c65617220616e206163636f756e742773206964656e7469747920696e666f20616e6420616c6c207375622d6163636f756e747320616e642072657475726e20616c6c206465706f736974732e205061796d656e743a20416c6c2072657365727665642062616c616e636573206f6e20746865206163636f756e74206172652072657475726e65642e206964656e746974792e20456d69747320604964656e74697479436c656172656460206966207375636365737366756c2e202d20604f2852202b2053202b205829602020202d20776865726520605260207265676973747261722d636f756e742028676f7665726e616e63652d626f756e646564292e2020202d2077686572652060536020737562732d636f756e742028686172642d20616e64206465706f7369742d626f756e646564292e2020202d20776865726520605860206164646974696f6e616c2d6669656c642d636f756e7420286465706f7369742d626f756e64656420616e6420636f64652d626f756e646564292e202d204f6e652062616c616e63652d756e72657365727665206f7065726174696f6e2e202d206032602073746f7261676520726561647320616e64206053202b2032602073746f726167652064656c6574696f6e732e2053657420746865207375622d6163636f756e7473206f66207468652073656e6465722e205061796d656e743a20416e79206167677265676174652062616c616e63652072657365727665642062792070726576696f757320607365745f73756273602063616c6c732077696c6c2062652072657475726e656420616e6420616e20616d6f756e7420605375624163636f756e744465706f736974602077696c6c20626520726573657276656420666f722065616368206974656d20696e206073756273602e202d206073756273603a20546865206964656e74697479277320286e657729207375622d6163636f756e74732e202d20604f2850202b205329602020202d20776865726520605060206f6c642d737562732d636f756e742028686172642d20616e64206465706f7369742d626f756e646564292e202d204174206d6f7374206f6e652062616c616e6365206f7065726174696f6e732e202d2044423a2020202d206050202b2053602073746f72616765206d75746174696f6e732028636f64656320636f6d706c657869747920604f28312960292020202d204f6e652073746f7261676520726561642028636f64656320636f6d706c657869747920604f28502960292e2020202d204f6e652073746f726167652077726974652028636f64656320636f6d706c657869747920604f28532960292e2020202d204f6e652073746f726167652d6578697374732028604964656e746974794f663a3a636f6e7461696e735f6b657960292e737562735665633c28543a3a4163636f756e7449642c2044617461293e2053657420616e206163636f756e742773206964656e7469747920696e666f726d6174696f6e20616e6420726573657276652074686520617070726f707269617465206465706f7369742e20496620746865206163636f756e7420616c726561647920686173206964656e7469747920696e666f726d6174696f6e2c20746865206465706f7369742069732074616b656e2061732070617274207061796d656e7420666f7220746865206e6577206465706f7369742e202d2060696e666f603a20546865206964656e7469747920696e666f726d6174696f6e2e20456d69747320604964656e7469747953657460206966207375636365737366756c2e202d20604f2858202b205827202b205229602020202d20776865726520605860206164646974696f6e616c2d6669656c642d636f756e7420286465706f7369742d626f756e64656420616e6420636f64652d626f756e646564292020202d20776865726520605260206a756467656d656e74732d636f756e7420287265676973747261722d636f756e742d626f756e64656429202d204f6e652062616c616e63652072657365727665206f7065726174696f6e2e202d204f6e652073746f72616765206d75746174696f6e2028636f6465632d7265616420604f285827202b205229602c20636f6465632d777269746520604f2858202b20522960292e696e666f4964656e74697479496e666f2041646420612072656769737472617220746f207468652073797374656d2e20546865206469737061746368206f726967696e20666f7220746869732063616c6c206d7573742062652060543a3a5265676973747261724f726967696e602e202d20606163636f756e74603a20746865206163636f756e74206f6620746865207265676973747261722e20456d6974732060526567697374726172416464656460206966207375636365737366756c2e202d20604f2852296020776865726520605260207265676973747261722d636f756e742028676f7665726e616e63652d626f756e64656420616e6420636f64652d626f756e646564292e202d204f6e652073746f72616765206d75746174696f6e2028636f64656320604f28522960292e00000000c45210000a00000001050000000000003aa311000c00000000000000ce5210001a0000000000000000000000000000000000000054e01100e85210000000000000000000f852100003000000000000000000000000000000083110000700000001020000000000003aa311000c0000000000000010531000140000000000000000000000000000000000000054e011002453100000000000000000003453100002000000000000000000000000000000445310000600000001050000000000003aa311000c000000000000004a531000210000000000000000000000000000000000000054e011006c53100000000000000000007c53100005000000000000000100000000000000a45310000a0000000000000000000000ae531000360000000000000000000000000000000000000000000000000000000000000054e01100e45310000000000000000000f45310000400000000000000010000004964656e746974794f66526567697374726174696f6e3c42616c616e63654f663c543e3e190000000000000001000000350000002c5610004800000054e0110000000000505510003000000028543a3a4163636f756e7449642c204461746129190000000000000001000000360000008055100058000000d855100054000000537562734f662842616c616e63654f663c543e2c205665633c543a3a4163636f756e7449643e290019000000000000000100000037000000db5410002e00000054e0110000000000095510004700000054e01100000000005055100030000000526567697374726172735665633c4f7074696f6e3c526567697374726172496e666f3c42616c616e63654f663c543e2c20543a3a4163636f756e7449643e3e3e190000000000000001000000380000001454100053000000675410002a00000054e0110000000000915410004a0000002054686520736574206f6620726567697374726172732e204e6f7420657870656374656420746f206765742076657279206269672061732063616e206f6e6c79206265206164646564207468726f7567682061207370656369616c206f726967696e20286c696b656c79206120636f756e63696c206d6f74696f6e292e2054686520696e64657820696e746f20746869732063616e206265206361737420746f2060526567697374726172496e6465786020746f2067657420612076616c69642076616c75652e20416c7465726e6174697665202273756222206964656e746974696573206f662074686973206163636f756e742e20546865206669727374206974656d20697320746865206465706f7369742c20746865207365636f6e64206973206120766563746f72206f6620746865206163636f756e74732e2054574f582d4e4f54453a204f4b20e2809520604163636f756e7449646020697320612073656375726520686173682e205468652073757065722d6964656e74697479206f6620616e20616c7465726e6174697665202273756222206964656e7469747920746f676574686572207769746820697473206e616d652c2077697468696e207468617420636f6e746578742e20496620746865206163636f756e74206973206e6f7420736f6d65206f74686572206163636f756e742773207375622d6964656e746974792c207468656e206a75737420604e6f6e65602e20496e666f726d6174696f6e20746861742069732070657274696e656e7420746f206964656e746966792074686520656e7469747920626568696e6420616e206163636f756e742e00000000c45710000c000000000000008cad11000c0000000000000054e01100d05710000000000000000000e0571000010000000000000000000000e85710000c000000000000008cad11000c0000000000000054e01100f45710000000000000000000045810000100000000000000000000000c58100011000000000000008cad11000c0000000000000054e0110020581000000000000000000030581000030000000000000000000000485810000e0000000000000068901100030000000000000054e011005858100000000000000000006858100001000000000000000000000070581000130000000000000068901100030000000000000054e0110084581000000000000000000094581000020000000000000000000000a45810000d0000000000000068901100030000000000000054e01100b45810000000000000000000c4581000020000000000000042617369634465706f73697419000000000000000100000039000000655b1000360000004669656c644465706f7369741900000000000000010000003a0000001a5b10004b0000005375624163636f756e744465706f7369740000001900000000000000010000003b0000001b5a100059000000745a10005c000000d05a10004a0000004d61785375624163636f756e747300001900000000000000010000003c000000d8591000430000004d61784164646974696f6e616c4669656c6473001900000000000000010000003c0000004759100059000000a0591000380000004d6178526567697374726172730000001900000000000000010000003d000000d458100054000000285910001f000000204d61786d696d756d206e756d626572206f66207265676973747261727320616c6c6f77656420696e207468652073797374656d2e204e656564656420746f20626f756e642074686520636f6d706c6578697479206f662c20652e672e2c207570646174696e67206a756467656d656e74732e204d6178696d756d206e756d626572206f66206164646974696f6e616c206669656c64732074686174206d61792062652073746f72656420696e20616e2049442e204e656564656420746f20626f756e642074686520492f4f20726571756972656420746f2061636365737320616e206964656e746974792c206275742063616e2062652070726574747920686967682e20546865206d6178696d756d206e756d626572206f66207375622d6163636f756e747320616c6c6f77656420706572206964656e746966696564206163636f756e742e2054686520616d6f756e742068656c64206f6e206465706f73697420666f7220612072656769737465726564207375626163636f756e742e20546869732073686f756c64206163636f756e7420666f722074686520666163742074686174206f6e652073746f72616765206974656d27732076616c75652077696c6c20696e637265617365206279207468652073697a65206f6620616e206163636f756e742049442c20616e642074686572652077696c6c20626520616e6f746865722074726965206974656d2077686f73652076616c7565206973207468652073697a65206f6620616e206163636f756e7420494420706c75732033322062797465732e2054686520616d6f756e742068656c64206f6e206465706f73697420706572206164646974696f6e616c206669656c6420666f7220612072656769737465726564206964656e746974792e2054686520616d6f756e742068656c64206f6e206465706f73697420666f7220612072656769737465726564206964656e746974792e0000000000545d10000b00000000000000c8621100010000000000000000000000605d1000010000000000000000000000685d10000f0000000000000018de1000020000000000000000000000785d1000010000000000000000000000805d10000e0000000000000018de1000020000000000000000000000905d1000010000000000000000000000985d10001200000000000000ac5d1000020000000000000000000000bc5d1000010000000000000000000000c45d10001400000000000000ac5d1000020000000000000000000000d85d10000100000000000000000000006a3110000e00000000000000ac5d1000020000000000000000000000e05d1000010000000000000000000000e85d10000e00000000000000f85d1000010000000000000000000000005e1000010000000000000000000000085e10001000000000000000fcf21000030000000000000000000000185e1000010000000000000000000000205e10001200000000000000fcf21000030000000000000000000000345e1000020000000000000000000000445e10001200000000000000fcf21000030000000000000000000000585e100002000000000000004964656e746974795365740008611000420000004964656e74697479436c656172656400c5601000430000004964656e746974794b696c6c6564000084601000410000004a756467656d656e745265717565737465640000fbaf110009000000474810000e000000456010003f0000004a756467656d656e74556e7265717565737465640b6010003a000000cb5f10004000000052656769737472617241646465640000474810000e000000a25f1000290000005375624964656e7469747941646465644f5f1000530000005375624964656e7469747952656d6f7665640000f75e1000430000003a5f1000150000005375624964656e746974795265766f6b65640000685e100047000000af5e1000480000002041207375622d6964656e746974792077617320636c65617265642c20616e642074686520676976656e206465706f7369742072657061747269617465642066726f6d20746865206d61696e206964656e74697479206163636f756e7420746f20746865207375622d6964656e74697479206163636f756e742e205b7375622c206d61696e2c206465706f7369745d2041207375622d6964656e74697479207761732072656d6f7665642066726f6d20616e206964656e7469747920616e6420746865206465706f7369742066726565642e205b7375622c206d61696e2c206465706f7369745d2041207375622d6964656e746974792077617320616464656420746f20616e206964656e7469747920616e6420746865206465706f73697420706169642e205b7375622c206d61696e2c206465706f7369745d204120726567697374726172207761732061646465642e205b7265676973747261725f696e6465785d2041206a756467656d656e742077617320676976656e2062792061207265676973747261722e205b7461726765742c207265676973747261725f696e6465785d2041206a756467656d656e74207265717565737420776173207265747261637465642e205b77686f2c207265676973747261725f696e6465785d2041206a756467656d656e74207761732061736b65642066726f6d2061207265676973747261722e205b77686f2c207265676973747261725f696e6465785d2041206e616d65207761732072656d6f76656420616e642074686520676976656e2062616c616e636520736c61736865642e205b77686f2c206465706f7369745d2041206e616d652077617320636c65617265642c20616e642074686520676976656e2062616c616e63652072657475726e65642e205b77686f2c206465706f7369745d2041206e616d652077617320736574206f72207265736574202877686963682077696c6c2072656d6f766520616c6c206a756467656d656e7473292e205b77686f5d000000000000ad31100012000000000000000c631000010000000000000000000000da991100080000000000000014631000010000000000000000000000a531100008000000000000001c6310000100000000000000000000009b3110000a0000000000000024631000010000000000000000000000913110000a000000000000002c631000010000000000000000000000873110000a0000000000000034631000010000000000000000000000783110000f000000000000003c6310000100000000000000000000006a3110000e00000000000000446310000100000000000000000000005a31100010000000000000004c6310000100000000000000000000004e3110000c0000000000000054631000010000000000000000000000413110000d000000000000005c631000010000000000000000000000343110000d00000000000000646310000100000000000000000000002331100011000000000000006c631000010000000000000000000000153110000e00000000000000746310000100000000000000000000000f31100006000000000000007c631000010000000000000000000000bf3110000800000000000000846310000100000000000000fd64100018000000e864100015000000d364100015000000c66410000d000000b664100010000000a364100013000000916410001200000080641000110000006d6410001300000057641000160000004064100017000000246410001c000000e96310003b000000cc6310001d000000af6310001d0000008c63100023000000205375622d6163636f756e742069736e2774206f776e65642062792073656e6465722e2053656e646572206973206e6f742061207375622d6163636f756e742e204163636f756e7420494420697320616c7265616479206e616d65642e204d6178696d756d20616d6f756e74206f66207265676973747261727320726561636865642e2043616e6e6f742061646420616e79206d6f72652e20546f6f206d616e79206164646974696f6e616c206669656c64732e205468652074617267657420697320696e76616c69642e2054686520696e64657820697320696e76616c69642e20496e76616c6964206a756467656d656e742e204a756467656d656e7420676976656e2e20537469636b79206a756467656d656e742e204e6f206964656e7469747920666f756e642e20466565206973206368616e6765642e20456d70747920696e6465782e204163636f756e742069736e2774206e616d65642e204163636f756e742069736e277420666f756e642e20546f6f206d616e7920737562732d6163636f756e74732e000000386510005f000000b70300001d000000386510005f00000087040000360000002f686f6d652f6261737469616e2f2e636172676f2f6769742f636865636b6f7574732f7375627374726174652d376530383433336434633337306132312f383730363363332f6672616d652f6964656e746974792f7372632f6c69622e7273506f7374496e666f3a2044656665727265644f6666656e63657300000000000000146710000700000001050000000000001b6710000d0000000000000028671000340000000000000000000000000000000000000054e011005c67100000000000000000006c67100001000000000000000000000000000000a165100010000000000000000000000074671000190000000000000000000000000000000000000000000000000000000000000054e01100906710000000000000000000a067100002000000000000000100000000000000b0671000160000000205050000000000c66710000400000000000000ca6710000e00000000000000d8671000120000000000000054e01100ec6710000000000000000000fc6710000100000000000000010000000000000004681000120000000105000000000000c66710000400000000000000ff7a1100070000000000000000000000000000000000000054e01100186810000000000000000000286810000600000000000000010000005265706f7274735265706f727449644f663c543e4f6666656e636544657461696c733c543a3a4163636f756e7449642c20543a3a4964656e74696669636174696f6e5475706c653e190000000000000001000000320000002b6a1000520000005665633c44656665727265644f6666656e63654f663c543e3e0000001900000000000000010000003e000000c1691000590000001a6a100011000000436f6e63757272656e745265706f727473496e6465784b696e644f706171756554696d65536c6f745665633c5265706f727449644f663c543e3e00001900000000000000010000002f000000776910004a0000005265706f72747342794b696e64496e64657800001900000000000000010000003f000000586810004400000054e01100000000009c6810002f00000054e0110000000000cb681000520000001d6910005a00000020456e756d65726174657320616c6c207265706f727473206f662061206b696e6420616c6f6e672077697468207468652074696d6520746865792068617070656e65642e20416c6c207265706f7274732061726520736f72746564206279207468652074696d65206f66206f6666656e63652e204e6f74652074686174207468652061637475616c2074797065206f662074686973206d617070696e6720697320605665633c75383e602c207468697320697320626563617573652076616c756573206f6620646966666572656e7420747970657320617265206e6f7420737570706f7274656420617420746865206d6f6d656e7420736f2077652061726520646f696e6720746865206d616e75616c2073657269616c697a6174696f6e2e204120766563746f72206f66207265706f727473206f66207468652073616d65206b696e6420746861742068617070656e6564206174207468652073616d652074696d6520736c6f742e204465666572726564207265706f72747320746861742068617665206265656e2072656a656374656420627920746865206f6666656e63652068616e646c657220616e64206e65656420746f206265207375626d69747465642061742061206c617465722074696d652e20546865207072696d61727920737472756374757265207468617420686f6c647320616c6c206f6666656e6365207265636f726473206b65796564206279207265706f7274206964656e746966696572732e6772616e6470613a65717569766f6361706172613a646f75626c652d766f7465626162653a65717569766f636174696f4e6f745472616e73666572496e5573654e6f744f776e65724e6f7441737369676e65645065726d616e656e7400000000000000b86b10000500000000000000c06b1000010000000000000000000000d86b1000130000000000000000000000d0e010000800000000000000706c1000020000000000000000000000a06c1000150000000000000000000000486d10000400000000000000c06b10000100000000000000000000004c6d1000130000000000000000000000c4e210000e00000000000000e46d10000300000000000000000000002c6e1000160000000000000000000000dc6e10000600000000000000c06b1000010000000000000000000000e46e10001200000000000000636c61696d000000000000005ca311000500000000000000647310000f000000567610002700000054e01100000000007d7610003800000054e0110000000000b8a611003400000054e0110000000000b57610003d00000054e01100000000008a7210002500000054e0110000000000a9a211000b00000010d610000a0000009070100027000000ad74100019000000e8b010000d000000d470100014000000f276100019000000017110002500000027a311000c000000000000008460110003000000000000003aa311000c000000000000005ca311000500000000000000647310000f000000df74100058000000377510002f00000054e0110000000000b8a611003400000054e0110000000000667510004a000000e17110005800000054e01100000000008a7210002500000054e0110000000000a9a211000b00000010d610000a0000009070100027000000b07510001a000000e8b010000d000000d470100014000000ca75100019000000351411000d000000e3751000390000001c7610003a00000027a311000c00000066726565737310002600000054e0110000000000997310005800000054e0110000000000f17310005600000054e0110000000000477410004400000054e01100000000008b7410002200000054e0110000000000a9a211000b00000010d610000a0000009070100027000000ad74100019000000e8b010000d000000d470100014000000c674100019000000017110002500000027a311000c000000000000008460110003000000000000003aa311000c000000000000005ca311000500000000000000647310000f00000000000000dc6e100006000000000000006bbe11000400000026711000560000007c7110003b00000054e0110000000000c9d410003200000054e0110000000000b77110002a000000e171100058000000397210005100000054e01100000000008a7210002500000054e0110000000000a9a211000b00000010d610000a0000009070100027000000af7210001f000000e8b010000d000000d470100014000000ce72100019000000351411000d000000e77210003e000000257310003f00000027a311000c000000667265657a650000746f10005a00000054e0110000000000ce6f100057000000257010001c00000054e0110000000000417010002c00000054e01100000000006d7010002300000054e0110000000000a9a211000b00000010d610000a0000009070100027000000b77010001d000000e8b010000d000000d470100014000000e870100019000000017110002500000027a311000c00000020467265657a6520616e20696e64657820736f2069742077696c6c20616c7761797320706f696e7420746f207468652073656e646572206163636f756e742e205468697320636f6e73756d657320746865206465706f7369742e20546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e6420746865207369676e696e67206163636f756e74206d75737420686176652061206e6f6e2d66726f7a656e206163636f756e742060696e646578602e202d2060696e646578603a2074686520696e64657820746f2062652066726f7a656e20696e20706c6163652e20456d6974732060496e64657846726f7a656e60206966207375636365737366756c2e202d204f6e652073746f72616765206d75746174696f6e2028636f64656320604f28312960292e202d20557020746f206f6e6520736c617368206f7065726174696f6e2e202d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d202d2042617365205765696768743a2033302e383620c2b573202d204442205765696768743a203120526561642f577269746520284163636f756e74732920466f72636520616e20696e64657820746f20616e206163636f756e742e205468697320646f65736e277420726571756972652061206465706f7369742e2049662074686520696e64657820697320616c72656164792068656c642c207468656e20616e79206465706f736974206973207265696d62757273656420746f206974732063757272656e74206f776e65722e202d2060696e646578603a2074686520696e64657820746f206265202872652d2961737369676e65642e202d20606e6577603a20746865206e6577206f776e6572206f662074686520696e6465782e20546869732066756e6374696f6e2069732061206e6f2d6f7020696620697420697320657175616c20746f2073656e6465722e202d2060667265657a65603a2069662073657420746f206074727565602c2077696c6c20667265657a652074686520696e64657820736f2069742063616e6e6f74206265207472616e736665727265642e20456d6974732060496e64657841737369676e656460206966207375636365737366756c2e202d20557020746f206f6e652072657365727665206f7065726174696f6e2e202d2042617365205765696768743a2032362e383320c2b573202020202d2052656164733a20496e6469636573204163636f756e74732c2053797374656d204163636f756e7420286f726967696e616c206f776e657229202020202d205772697465733a20496e6469636573204163636f756e74732c2053797374656d204163636f756e7420286f726967696e616c206f776e657229543a3a4163636f756e74496e646578204672656520757020616e20696e646578206f776e6564206279207468652073656e6465722e205061796d656e743a20416e792070726576696f7573206465706f73697420706c6163656420666f722074686520696e64657820697320756e726573657276656420696e207468652073656e646572206163636f756e742e20546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d757374206f776e2074686520696e6465782e202d2060696e646578603a2074686520696e64657820746f2062652066726565642e2054686973206d757374206265206f776e6564206279207468652073656e6465722e20456d6974732060496e646578467265656460206966207375636365737366756c2e202d204f6e652072657365727665206f7065726174696f6e2e202d2042617365205765696768743a2032352e353320c2b5732041737369676e20616e20696e64657820616c7265616479206f776e6564206279207468652073656e64657220746f20616e6f74686572206163636f756e742e205468652062616c616e6365207265736572766174696f6e206973206566666563746976656c79207472616e7366657272656420746f20746865206e6577206163636f756e742e202d2060696e646578603a2074686520696e64657820746f2062652072652d61737369676e65642e2054686973206d757374206265206f776e6564206279207468652073656e6465722e202d204f6e65207472616e73666572206f7065726174696f6e2e202d2042617365205765696768743a2033332e373420c2b573202020202d2052656164733a20496e6469636573204163636f756e74732c2053797374656d204163636f756e742028726563697069656e7429202020202d205772697465733a20496e6469636573204163636f756e74732c2053797374656d204163636f756e742028726563697069656e74292041737369676e20616e2070726576696f75736c7920756e61737369676e656420696e6465782e205061796d656e743a20604465706f736974602069732072657365727665642066726f6d207468652073656e646572206163636f756e742e202d2060696e646578603a2074686520696e64657820746f20626520636c61696d65642e2054686973206d757374206e6f7420626520696e207573652e202d2042617365205765696768743a2032382e363920c2b573000000000064771000080000000102000000000000647310000f000000000000006c771000220000000000000000000000000000000000000054e01100907710000000000000000000a07710000100000000000000000000004163636f756e747328543a3a4163636f756e7449642c2042616c616e63654f663c543e2c20626f6f6c29000019000000000000000100000032000000a87710002200000020546865206c6f6f6b75702066726f6d20696e64657820746f206163636f756e742e000000000000507810000d000000000000006078100002000000000000000000000070781000010000000000000000000000787810000a00000000000000847810000100000000000000000000008c781000010000000000000000000000947810000b00000000000000a0781000020000000000000000000000b07810000100000000000000496e64657841737369676e6564000000fbaf110009000000007910000c000000447910002b000000496e64657846726565640000007910000c0000000c79100038000000496e64657846726f7a656e00007910000c000000fbaf110009000000b8781000480000002041206163636f756e7420696e64657820686173206265656e2066726f7a656e20746f206974732063757272656e74206163636f756e742049442e205b77686f2c20696e6465785d4163636f756e74496e6465782041206163636f756e7420696e64657820686173206265656e2066726565642075702028756e61737369676e6564292e205b696e6465785d2041206163636f756e7420696e646578207761732061737369676e65642e205b77686f2c20696e6465785d576569676874546f6f4c6f77556e657870656374656454696d65706f696e7457726f6e6754696d65706f696e744e6f54696d65706f696e7453656e646572496e5369676e61746f726965735369676e61746f726965734f75744f664f72646572546f6f4d616e795369676e61746f72696573546f6f4665775369676e61746f726965734e6f417070726f76616c734e6565646564416c7265616479417070726f7665644d696e696d756d5468726573686f6c64416c726561647953746f7265640000000000e07a10001400000000000000f47a1000020000000000000000000000247b1000110000000000000000000000ac7b10000800000000000000b47b1000060000000000000000000000447c1000330000000000000000000000dc7d10001000000000000000ec7d1000050000000000000000000000647e10002700000000000000000000009c7f10000f00000000000000ac7f10000400000000000000000000000c8010001b0000000000000061735f6d756c74695f7468726573686f6c645f3100000000fa84100011000000000000005abe100011000000000000006aab110004000000000000006eab110017000000918d10005500000054e0110000000000b8a611003400000054e0110000000000e68d100050000000368e100041000000c68910002300000054e0110000000000778e10002f00000054e0110000000000a9a211000b000000a68e100047000000d78b100020000000ed8e100025000000128f1000120000006a8d10001300000027a311000c00000061735f6d756c7469000000006bbe1000090000000000000061a311000300000000000000fa84100011000000000000005abe100011000000000000005f8910000f000000000000006e89100021000000000000006aab110004000000000000007d8d10000a00000000000000878d10000a000000000000006bbe110004000000000000008f8910000a0000000000000089611100060000003e85100056000000948510003f00000054e0110000000000998910002d00000054e0110000000000d38510004c0000001f861000500000006f8610000e00000054e0110000000000b8a611003400000054e01100000000006c81100056000000c281100051000000138210001c0000007d86100057000000d4861000550000002987100036000000c68910002300000054e0110000000000e989100048000000318a10004700000054e0110000000000788a100057000000cf8a100056000000258b10003800000054e0110000000000a9a211000b0000005d8b100015000000e48210003400000018831000500000006883100052000000728b100049000000ba83100030000000ad87100036000000e38710003f000000e8b010000d000000bb8b10001c000000228810004c0000006e88100024000000928810002d000000d78b100020000000d8e710000f000000f78b1000380000002f8c100038000000678c1000380000009f8c100038000000351411000d000000d78c100049000000208d10004a0000006a8d10001300000027a311000c000000617070726f76655f61735f6d756c7469000000006bbe1000090000000000000061a311000300000000000000fa84100011000000000000005abe100011000000000000005f8910000f000000000000006e89100021000000000000002d85100009000000000000003685100008000000000000008f8910000a0000000000000089611100060000003e85100056000000948510003f00000054e0110000000000d38510004c0000001f861000500000006f8610000e00000054e0110000000000b8a611003400000054e01100000000006c81100056000000c281100051000000138210001c0000007d86100057000000d4861000550000002987100036000000a68210003400000054e01100000000005f8710004e00000054e0110000000000a9a211000b000000da8210000a000000e48210003400000018831000500000006883100052000000ba83100030000000ad87100036000000e38710003f000000e8b010000d000000228810004c0000006e88100024000000928810002d0000002984100023000000d8e710000f000000bf88100020000000df88100021000000351411000d000000008910002f0000002f8910003000000027a311000c00000063616e63656c5f61735f6d756c746900000000006bbe1000090000000000000061a311000300000000000000fa84100011000000000000005abe100011000000000000000b85100009000000000000001485100019000000000000002d85100009000000000000003685100008000000e4801000560000003a8110003200000054e0110000000000b8a611003400000054e01100000000006c81100056000000c281100051000000138210001c0000002f82100058000000878210001f000000a68210003400000054e0110000000000a9a211000b000000da8210000a000000e48210003400000018831000500000006883100052000000ba83100030000000e8b010000d000000ea831000220000000c8410001d00000029841000230000004c84100021000000351411000d0000006d84100046000000b38410004700000027a311000c0000002043616e63656c2061207072652d6578697374696e672c206f6e2d676f696e67206d756c7469736967207472616e73616374696f6e2e20416e79206465706f7369742072657365727665642070726576696f75736c7920666f722074686973206f7065726174696f6e2077696c6c20626520756e7265736572766564206f6e20737563636573732e202d20607468726573686f6c64603a2054686520746f74616c206e756d626572206f6620617070726f76616c7320666f722074686973206469737061746368206265666f72652069742069732065786563757465642e202d20606f746865725f7369676e61746f72696573603a20546865206163636f756e747320286f74686572207468616e207468652073656e646572292077686f2063616e20617070726f766520746869732064697370617463682e204d6179206e6f7420626520656d7074792e202d206074696d65706f696e74603a205468652074696d65706f696e742028626c6f636b206e756d62657220616e64207472616e73616374696f6e20696e64657829206f662074686520666972737420617070726f76616c207472616e73616374696f6e20666f7220746869732064697370617463682e202d206063616c6c5f68617368603a205468652068617368206f66207468652063616c6c20746f2062652065786563757465642e202d20604f285329602e202d20557020746f206f6e652062616c616e63652d72657365727665206f7220756e72657365727665206f7065726174696f6e2e202d204f6e6520706173737468726f756768206f7065726174696f6e2c206f6e6520696e736572742c20626f746820604f285329602077686572652060536020697320746865206e756d626572206f662020207369676e61746f726965732e206053602069732063617070656420627920604d61785369676e61746f72696573602c207769746820776569676874206265696e672070726f706f7274696f6e616c2e202d204f6e6520656e636f6465202620686173682c20626f7468206f6620636f6d706c657869747920604f285329602e202d20492f4f3a2031207265616420604f285329602c206f6e652072656d6f76652e202d2053746f726167653a2072656d6f766573206f6e65206974656d2e202d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d202d2042617365205765696768743a2033362e3037202b20302e313234202a205320202020202d20526561643a204d756c74697369672053746f726167652c205b43616c6c6572204163636f756e745d2c20526566756e64204163636f756e742c2043616c6c7320202020202d2057726974653a204d756c74697369672053746f726167652c205b43616c6c6572204163636f756e745d2c20526566756e64204163636f756e742c2043616c6c736f746865725f7369676e61746f7269657374696d65706f696e7454696d65706f696e743c543a3a426c6f636b4e756d6265723e63616c6c5f686173685b75383b2033325d20526567697374657220617070726f76616c20666f72206120646973706174636820746f206265206d6164652066726f6d20612064657465726d696e697374696320636f6d706f73697465206163636f756e7420696620617070726f766564206279206120746f74616c206f6620607468726573686f6c64202d203160206f6620606f746865725f7369676e61746f72696573602e205061796d656e743a20604465706f73697442617365602077696c6c20626520726573657276656420696620746869732069732074686520666972737420617070726f76616c2c20706c757320607468726573686f6c64602074696d657320604465706f736974466163746f72602e2049742069732072657475726e6564206f6e636520746869732064697370617463682068617070656e73206f722069732063616e63656c6c65642e202d20606d617962655f74696d65706f696e74603a20496620746869732069732074686520666972737420617070726f76616c2c207468656e2074686973206d75737420626520604e6f6e65602e204966206974206973206e6f742074686520666972737420617070726f76616c2c207468656e206974206d7573742062652060536f6d65602c2077697468207468652074696d65706f696e742028626c6f636b206e756d62657220616e64207472616e73616374696f6e20696e64657829206f662074686520666972737420617070726f76616c207472616e73616374696f6e2e204e4f54453a2049662074686973206973207468652066696e616c20617070726f76616c2c20796f752077696c6c2077616e7420746f20757365206061735f6d756c74696020696e73746561642e202d20557020746f206f6e652062696e6172792073656172636820616e6420696e736572742028604f286c6f6753202b20532960292e202d20492f4f3a2031207265616420604f285329602c20757020746f2031206d757461746520604f285329602e20557020746f206f6e652072656d6f76652e202d2053746f726167653a20696e7365727473206f6e65206974656d2c2076616c75652073697a6520626f756e64656420627920604d61785369676e61746f72696573602c207769746820612020206465706f7369742074616b656e20666f7220697473206c69666574696d65206f66202020604465706f73697442617365202b207468726573686f6c64202a204465706f736974466163746f72602e20202020202d204372656174653a2034342e3731202b20302e303838202a205320202020202d20417070726f76653a2033312e3438202b20302e313136202a205320202020202d20526561643a204d756c74697369672053746f726167652c205b43616c6c6572204163636f756e745d20202020202d2057726974653a204d756c74697369672053746f726167652c205b43616c6c6572204163636f756e745d6d617962655f74696d65706f696e744f7074696f6e3c54696d65706f696e743c543a3a426c6f636b4e756d6265723e3e6d61785f7765696768742049662074686572652061726520656e6f7567682c207468656e206469737061746368207468652063616c6c2e202d206063616c6c603a205468652063616c6c20746f2062652065786563757465642e204e4f54453a20556e6c6573732074686973206973207468652066696e616c20617070726f76616c2c20796f752077696c6c2067656e6572616c6c792077616e7420746f207573652060617070726f76655f61735f6d756c74696020696e73746561642c2073696e6365206974206f6e6c7920726571756972657320612068617368206f66207468652063616c6c2e20526573756c74206973206571756976616c656e7420746f20746865206469737061746368656420726573756c7420696620607468726573686f6c64602069732065786163746c79206031602e204f7468657277697365206f6e20737563636573732c20726573756c7420697320604f6b6020616e642074686520726573756c742066726f6d2074686520696e746572696f722063616c6c2c206966206974207761732065786563757465642c206d617920626520666f756e6420696e20746865206465706f736974656420604d756c7469736967457865637574656460206576656e742e202d20604f2853202b205a202b2043616c6c29602e202d204f6e652063616c6c20656e636f6465202620686173682c20626f7468206f6620636f6d706c657869747920604f285a296020776865726520605a602069732074782d6c656e2e202d2054686520776569676874206f6620746865206063616c6c602e202d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d20202020202d204372656174653a2020202020202020202034312e3839202b20302e313138202a2053202b202e303032202a205a20c2b57320202020202d2043726561746520772f2053746f72653a2035332e3537202b20302e313139202a2053202b202e303033202a205a20c2b57320202020202d20417070726f76653a20202020202020202033312e3339202b20302e313336202a2053202b202e303032202a205a20c2b57320202020202d20436f6d706c6574653a202020202020202033392e3934202b20302e323620202a2053202b202e303032202a205a20c2b57320202020202d2052656164733a204d756c74697369672053746f726167652c205b43616c6c6572204163636f756e745d2c2043616c6c7320286966206073746f72655f63616c6c602920202020202d205772697465733a204d756c74697369672053746f726167652c205b43616c6c6572204163636f756e745d2c2043616c6c7320286966206073746f72655f63616c6c6029202d20506c75732043616c6c205765696768744f706171756543616c6c73746f72655f63616c6c20496d6d6564696174656c792064697370617463682061206d756c74692d7369676e61747572652063616c6c207573696e6720612073696e676c6520617070726f76616c2066726f6d207468652063616c6c65722e202d20606f746865725f7369676e61746f72696573603a20546865206163636f756e747320286f74686572207468616e207468652073656e646572292077686f206172652070617274206f6620746865206d756c74692d7369676e61747572652c2062757420646f206e6f7420706172746963697061746520696e2074686520617070726f76616c2070726f636573732e20526573756c74206973206571756976616c656e7420746f20746865206469737061746368656420726573756c742e204f285a202b204329207768657265205a20697320746865206c656e677468206f66207468652063616c6c20616e6420432069747320657865637574696f6e207765696768742e202d2042617365205765696768743a2033332e3732202b20302e303032202a205a20c2b573202d204442205765696768743a204e6f6e6500000000d48f10000900000002050200000000003aa311000c00000000000000368510000800000000000000dd8f1000340000000000000054e0110014901000000000000000000024901000010000000000000000000000000000002c90100005000000010600000000000036851000080000000000000031901000280000000000000000000000000000000000000054e011005c901000000000000000000054e011000000000000000000000000004d756c7469736967734d756c74697369673c543a3a426c6f636b4e756d6265722c2042616c616e63654f663c543e2c20543a3a4163636f756e7449643e000000190000000000000001000000320000006c9010002500000043616c6c73284f706171756543616c6c2c20543a3a4163636f756e7449642c2042616c616e63654f663c543e29000000190000000000000001000000320000002054686520736574206f66206f70656e206d756c7469736967206f7065726174696f6e732e00000000000000449110000b00000000000000509110000300000000000000000000006891100001000000000000000000000070911000100000000000000080911000040000000000000000000000a0911000010000000000000000000000a89110001000000000000000b8911000050000000000000000000000e0911000010000000000000000000000e8911000110000000000000080911000040000000000000000000000fc91100001000000000000004e65774d756c746973696700fbaf110009000000fbaf110009000000c4921000080000002b931000450000004d756c7469736967417070726f76616cfbaf110009000000ae92100016000000fbaf110009000000c492100008000000cc9210005f0000004d756c74697369674578656375746564fbaf110009000000ae92100016000000fbaf110009000000c49210000800000046b011000e0000005a921000540000004d756c746973696743616e63656c6c656400000004921000560000002041206d756c7469736967206f7065726174696f6e20686173206265656e2063616e63656c6c65642e205b63616e63656c6c696e672c2074696d65706f696e742c206d756c74697369672c2063616c6c5f686173685d2041206d756c7469736967206f7065726174696f6e20686173206265656e2065786563757465642e205b617070726f76696e672c2074696d65706f696e742c206d756c74697369672c2063616c6c5f686173685d54696d65706f696e743c426c6f636b4e756d6265723e43616c6c486173682041206d756c7469736967206f7065726174696f6e20686173206265656e20617070726f76656420627920736f6d656f6e652e205b617070726f76696e672c2074696d65706f696e742c206d756c74697369672c2063616c6c5f686173685d2041206e6577206d756c7469736967206f7065726174696f6e2068617320626567756e2e205b617070726f76696e672c206d756c74697369672c2063616c6c5f686173685d00000000127a10001000000000000000f8941000010000000000000000000000037a10000f0000000000000000951000010000000000000000000000f2791000110000000000000008951000010000000000000000000000e1791000110000000000000010951000010000000000000000000000cf791000120000000000000018951000010000000000000000000000ba791000150000000000000020951000010000000000000000000000a7791000130000000000000028951000010000000000000000000000da991100080000000000000030951000010000000000000000000000bd6a10000800000000000000389510000100000000000000000000009c7910000b00000000000000409510000100000000000000000000008e7910000e00000000000000489510000100000000000000000000007b7910001300000000000000509510000100000000000000000000006f7910000c0000000000000058951000010000000000000000000000227a10000d000000000000006095100001000000000000004f98100020000000239810002c000000fb97100028000000d09710002b000000a49710002c00000060971000440000001c97100044000000e496100038000000989610004c0000005096100048000000049610004c000000c69510003e0000009195100035000000689510002900000020546865206461746120746f2062652073746f72656420697320616c72656164792073746f7265642e20546865206d6178696d756d2077656967687420696e666f726d6174696f6e2070726f76696465642077617320746f6f206c6f772e20412074696d65706f696e742077617320676976656e2c20796574206e6f206d756c7469736967206f7065726174696f6e20697320756e6465727761792e204120646966666572656e742074696d65706f696e742077617320676976656e20746f20746865206d756c7469736967206f7065726174696f6e207468617420697320756e6465727761792e204e6f2074696d65706f696e742077617320676976656e2c2079657420746865206d756c7469736967206f7065726174696f6e20697320616c726561647920756e6465727761792e204f6e6c7920746865206163636f756e742074686174206f726967696e616c6c79206372656174656420746865206d756c74697369672069732061626c6520746f2063616e63656c2069742e204d756c7469736967206f7065726174696f6e206e6f7420666f756e64207768656e20617474656d7074696e6720746f2063616e63656c2e205468652073656e6465722077617320636f6e7461696e656420696e20746865206f74686572207369676e61746f726965733b2069742073686f756c646e27742062652e20546865207369676e61746f7269657320776572652070726f7669646564206f7574206f66206f726465723b20746865792073686f756c64206265206f7264657265642e2054686572652061726520746f6f206d616e79207369676e61746f7269657320696e20746865206c6973742e2054686572652061726520746f6f20666577207369676e61746f7269657320696e20746865206c6973742e2043616c6c20646f65736e2774206e65656420616e7920286d6f72652920617070726f76616c732e2043616c6c20697320616c726561647920617070726f7665642062792074686973207369676e61746f72792e205468726573686f6c64206d7573742062652032206f7220677265617465722e66696e616c6e756d0058c111004000000094020000010000005468657265206973206f6e6c79206f6e6520666174616c206572726f723b20716564000019000000080000000400000040000000496e686572656e7420776974682073616d65206964656e74696669657220616c726561647920657869737473214e6f206f74686572206572726f72732061726520616363657074656420616674657220616e2068617264206572726f72215175657565644b65797356616c696461746f72730000617474656d707420746f20646976696465206279207a65726f000000c2d211006d00000082010000210000004475706c6963617465644b65794e6f4173736f63696174656456616c696461746f724964496e76616c696450726f6f664e6f4b657973000000000000ec9910000800000000000000f4991000020000000000000000000000249a10000e0000000000000000000000949a10000a0000000000000054e01100000000000000000000000000a09a10000c000000000000007365745f6b65797300000000f81211000400000000000000e39d10000700000000000000ea9d10000500000000000000ff7a110007000000a49c10003a000000de9c100048000000339b10003100000054e0110000000000649b10003500000054e0110000000000a9a211000b000000269d100015000000c69b1000560000003b9d10003c000000779d100029000000a09d100021000000c19d10002200000027a311000c00000070757267655f6b6579730000009b100033000000339b10003100000054e0110000000000649b10003500000054e0110000000000a9a211000b000000999b10002d000000c69b1000560000001c9c10003c000000589c100029000000819c10002300000027a311000c0000002052656d6f76657320616e792073657373696f6e206b6579287329206f66207468652066756e6374696f6e2063616c6c65722e205468697320646f65736e27742074616b652065666665637420756e74696c20746865206e6578742073657373696f6e2e20546865206469737061746368206f726967696e206f6620746869732066756e6374696f6e206d757374206265207369676e65642e202d20436f6d706c65786974793a20604f2831296020696e206e756d626572206f66206b65792074797065732e20202041637475616c20636f737420646570656e6473206f6e20746865206e756d626572206f66206c656e677468206f662060543a3a4b6579733a3a6b65795f6964732829602077686963682069732066697865642e202d20446252656164733a2060543a3a56616c696461746f7249644f66602c20604e6578744b657973602c20606f726967696e206163636f756e7460202d2044625772697465733a20604e6578744b657973602c20606f726967696e206163636f756e7460202d20446257726974657320706572206b65792069643a20604b65794f776e646572602053657473207468652073657373696f6e206b6579287329206f66207468652066756e6374696f6e2063616c6c657220746f20606b657973602e20416c6c6f777320616e206163636f756e7420746f20736574206974732073657373696f6e206b6579207072696f7220746f206265636f6d696e6720612076616c696461746f722e202d20436f6d706c65786974793a20604f28312960202d20446252656164733a20606f726967696e206163636f756e74602c2060543a3a56616c696461746f7249644f66602c20604e6578744b65797360202d2044625772697465733a20606f726967696e206163636f756e74602c20604e6578744b65797360202d204462526561647320706572206b65792069643a20604b65794f776e657260202d20446257726974657320706572206b65792069643a20604b65794f776e657260543a3a4b65797370726f6f660000000000249910000a000000000000000000000058a01000130000000000000000000000000000000000000000000000000000000000000054e011006ca0100000000000000000007ca010000100000000000000010000000000000084a010000c0000000000000000000000a47411000c0000000000000000000000000000000000000000000000000000000000000054e0110090a010000000000000000000a0a0100001000000000000000100000000000000a8a010000d00000000000000000000006bbe1100040000000000000000000000000000000000000000000000000000000000000054e01100b8a010000000000000000000c8a01000020000000000000001000000000000001a9910000a0000000000000000000000d8a010001e0000000000000000000000000000000000000000000000000000000000000054e01100f8a01000000000000000000008a110000200000000000000010000000000000018a110001200000000000000000000002aa11000080000000000000000000000000000000000000000000000000000000000000054e0110034a11000000000000000000044a11000030000000000000001000000000000005ca11000080000000105000000000000287b11000e00000000000000e39d1000070000000000000000000000000000000000000054e0110064a11000000000000000000074a11000010000000000000000000000000000007ca1100008000000010500000000000084a110001400000000000000287b11000e0000000000000000000000000000000000000054e0110098a110000000000000000000a8a110000100000000000000000000005665633c543a3a56616c696461746f7249643e001900000000000000010000002f000000a2a310001f00000043757272656e74496e6465781900000000000000010000002e00000084a310001e0000005175657565644368616e676564000000190000000000000001000000320000000da310004e0000005ba31000290000005665633c28543a3a56616c696461746f7249642c20543a3a4b657973293e00001900000000000000010000002f00000086a210004f000000d5a210003800000044697361626c656456616c696461746f72735665633c7533323e00001900000000000000010000004100000019a210002000000054e011000000000039a210004d0000004e6578744b65797319000000000000000100000032000000f2a11000270000004b65794f776e6572284b65795479706549642c205665633c75383e2919000000000000000100000032000000b0a110004200000020546865206f776e6572206f662061206b65792e20546865206b65792069732074686520604b657954797065496460202b2074686520656e636f646564206b65792e20546865206e6578742073657373696f6e206b65797320666f7220612076616c696461746f722e20496e6469636573206f662064697361626c65642076616c696461746f72732e205468652073657420697320636c6561726564207768656e20606f6e5f73657373696f6e5f656e64696e67602072657475726e732061206e657720736574206f66206964656e7469746965732e2054686520717565756564206b65797320666f7220746865206e6578742073657373696f6e2e205768656e20746865206e6578742073657373696f6e20626567696e732c207468657365206b6579732077696c6c206265207573656420746f2064657465726d696e65207468652076616c696461746f7227732073657373696f6e206b6579732e20547275652069662074686520756e6465726c79696e672065636f6e6f6d6963206964656e746974696573206f7220776569676874696e6720626568696e64207468652076616c696461746f727320686173206368616e67656420696e20746865207175657565642076616c696461746f72207365742e2043757272656e7420696e646578206f66207468652073657373696f6e2e205468652063757272656e7420736574206f662076616c696461746f72732e5374696c6c4163746976655468726573686f6c64416c7265616479566f756368656444656c6179506572696f644e6f74467269656e644e6f7453746172746564416c726561647953746172746564416c72656164795265636f76657261626c654e6f745265636f76657261626c654e6f74536f727465644d6178467269656e64734e6f74456e6f756768467269656e64735a65726f5468726573686f6c644e6f74416c6c6f776564416c726561647950726f78790000000000000004a610000c0000000000000010a6100002000000000000000000000040a610000d0000000000000000000000a8a610000d00000000000000b8a61000020000000000000000000000e8a610000d000000000000000000000050a710000f0000000000000060a71000030000000000000000000000a8a710001b000000000000000000000080a81000110000000000000094a81000010000000000000000000000aca810001600000000000000000000005ca910000e00000000000000b8a610000200000000000000000000006ca9100019000000000000000000000034aa10000e0000000000000094a8100001000000000000000000000044aa1000140000000000000000000000e4aa10000e00000000000000f4aa10000100000000000000000000000cab1000140000000000000000000000acab10000f0000000000000054e01100000000000000000000000000bcab100015000000000000000000000064ac1000100000000000000094a8100001000000000000000000000074ac10000b0000000000000061735f7265636f766572656400000000a2ba100007000000000000003aa311000c000000000000006aab110004000000000000006eab110017000000b4bf10002900000054e011000000000004ad10004500000049ad10003a00000054e0110000000000e8a711000c000000ddbf10004900000026c010004000000054e0110000000000a9a211000b00000066c01000250000008bc010004200000027a311000c0000007365745f7265636f766572656400000000000000b0bf100004000000000000003aa311000c0000000000000030b3100007000000000000003aa311000c00000080be100047000000c7be10001d00000054e0110000000000e4be10003200000054e0110000000000e8a711000c00000016bf10002e00000044bf10004700000054e0110000000000a9a211000b0000008bbf100019000000a4bf10000c00000027a311000c0000006372656174655f7265636f76657279000000000053be100007000000000000005abe100011000000000000006bbe1000090000000000000061a31100030000000000000074be10000c0000000000000020be11000e000000a9ba10005700000054e011000000000000bb10004c0000004cbb1000520000009ebb10002f00000054e0110000000000b8a611003400000054e0110000000000e8a711000c000000cdbb10004900000016bc1000350000004bbc10004c00000097bc100047000000debc10002500000003bd10004f00000052bd10003a00000054e0110000000000a9a211000b0000008cbd10001a000000a6bd10004b000000f1bd10003b00000060ba1000270000002cbe100027000000e8b010000d00000054e0110000000000f5b010001b00000027a311000c000000696e6974696174655f7265636f7665727900000000000000a2ba100007000000000000003aa311000c00000050b810003b00000054e01100000000008bb8100047000000d2b81000490000001bb910002e00000054e0110000000000b8a611003400000054e0110000000000e8a711000c00000049b91000450000008eb910004000000054e0110000000000a9a211000b000000ceb910003e0000000cba10005400000060ba1000270000007fb510003900000087ba10001b000000e8b010000d00000054e0110000000000f5b010001b00000027a311000c000000766f7563685f7265636f766572790000fab510004a00000044b610001a00000054e01100000000005eb610004a000000a8b610001d00000054e0110000000000e8a711000c000000c5b6100035000000fab61000440000003eb710001500000054e011000000000053b71000490000009cb710000900000054e0110000000000a9a211000b000000b1b410003f000000f0b410004700000037b5100048000000a5b710003b000000e0b7100047000000b8b5100027000000e8b010000d00000054e011000000000027b810002900000027a311000c000000636c61696d5f7265636f76657279000037b310003d00000054e011000000000074b310004b000000bfb310004700000006b410004c00000054e0110000000000e8a711000c00000052b410004b0000009db410001400000054e0110000000000a9a211000b000000b1b410003f000000f0b410004700000037b51000480000007fb5100039000000b8b5100027000000e8b010000d00000054e0110000000000dfb510001b00000027a311000c000000636c6f73655f7265636f7665727900000000000030b3100007000000000000003aa311000c00000010b110004500000055b110001a00000054e01100000000006fb1100048000000b7b110003e00000054e011000000000097af100041000000f5b110003c00000054e0110000000000e8a711000c00000031b210004400000054e0110000000000a9a211000b00000075b210002100000096b210004f000000e5b2100030000000e8b010000d00000054e011000000000015b310001b00000027a311000c00000072656d6f76655f7265636f76657279000dae10005700000054e011000000000064ae100045000000a9ae10004200000054e0110000000000ebae10004900000034af1000260000005aaf10003d00000054e011000000000097af100041000000d8af10003900000054e0110000000000a9a211000b00000011b010001800000029b010004a00000073b010004e000000c1b0100027000000e8b010000d00000054e0110000000000f5b010001b00000027a311000c00000063616e63656c5f7265636f7665726564ccac10003800000054e011000000000004ad10004500000049ad10003a00000054e0110000000000e8a711000c00000083ad10004600000054e0110000000000a9a211000b000000c9ad10004400000027a311000c0000002043616e63656c20746865206162696c69747920746f20757365206061735f7265636f76657265646020666f7220606163636f756e74602e20546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207265676973746572656420746f2062652061626c6520746f206d616b652063616c6c73206f6e20626568616c66206f6620746865207265636f7665726564206163636f756e742e202d20606163636f756e74603a20546865207265636f7665726564206163636f756e7420796f75206172652061626c6520746f2063616c6c206f6e2d626568616c662d6f662e202d204f6e652073746f72616765206d75746174696f6e20746f20636865636b206163636f756e74206973207265636f7665726564206279206077686f602e204f2831292052656d6f766520746865207265636f766572792070726f6365737320666f7220796f7572206163636f756e742e205265636f7665726564206163636f756e747320617265207374696c6c2061636365737369626c652e204e4f54453a205468652075736572206d757374206d616b65207375726520746f2063616c6c2060636c6f73655f7265636f7665727960206f6e20616c6c20616374697665207265636f7665727920617474656d707473206265666f72652063616c6c696e6720746869732066756e6374696f6e20656c73652069742077696c6c206661696c2e205061796d656e743a2042792063616c6c696e6720746869732066756e6374696f6e20746865207265636f76657261626c65206163636f756e742077696c6c20756e72657365727665207468656972207265636f7665727920636f6e66696775726174696f6e206465706f7369742e202860436f6e6669674465706f7369744261736560202b2060467269656e644465706f736974466163746f7260202a20235f6f665f667269656e64732920546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64206d7573742062652061207265636f76657261626c65206163636f756e742028692e652e206861732061207265636f7665727920636f6e66696775726174696f6e292e204b65793a204620286c656e206f6620667269656e647329202d204f6e652073746f72616765207265616420746f206765742074686520707265666978206974657261746f7220666f7220616374697665207265636f7665726965732e204f283129202d204f6e652073746f7261676520726561642f72656d6f766520746f2067657420746865207265636f7665727920636f6e66696775726174696f6e2e204f2831292c20436f646563204f284629202d204f6e652062616c616e63652063616c6c20746f20756e72657365727665642e204f285829202d204f6e65206576656e742e20546f74616c20436f6d706c65786974793a204f2846202b2058292041732074686520636f6e74726f6c6c6572206f662061207265636f76657261626c65206163636f756e742c20636c6f736520616e20616374697665207265636f766572792070726f6365737320666f7220796f7572206163636f756e742e205061796d656e743a2042792063616c6c696e6720746869732066756e6374696f6e2c20746865207265636f76657261626c65206163636f756e742077696c6c207265636569766520746865207265636f76657279206465706f73697420605265636f766572794465706f7369746020706c616365642062792074686520726573637565722e207265636f76657261626c65206163636f756e74207769746820616e20616374697665207265636f766572792070726f6365737320666f722069742e202d206072657363756572603a20546865206163636f756e7420747279696e6720746f207265736375652074686973207265636f76657261626c65206163636f756e742e204b65793a205620286c656e206f6620766f756368696e6720667269656e647329202d204f6e652073746f7261676520726561642f72656d6f766520746f206765742074686520616374697665207265636f766572792070726f636573732e204f2831292c20436f646563204f285629202d204f6e652062616c616e63652063616c6c20746f20726570617472696174652072657365727665642e204f28582920546f74616c20436f6d706c65786974793a204f2856202b2058297265736375657220416c6c6f772061207375636365737366756c207265736375657220746f20636c61696d207468656972207265636f7665726564206163636f756e742e20546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64206d7573742062652061202272657363756572222077686f20686173207375636365737366756c6c7920636f6d706c6574656420746865206163636f756e74207265636f766572792070726f636573733a20636f6c6c656374656420607468726573686f6c6460206f72206d6f726520766f75636865732c20776169746564206064656c61795f706572696f646020626c6f636b732073696e636520696e6974696174696f6e2e202d20606163636f756e74603a20546865206c6f7374206163636f756e74207468617420796f752077616e7420746f20636c61696d20686173206265656e207375636365737366756c6c792020207265636f766572656420627920796f752e204b65793a204620286c656e206f6620667269656e647320696e20636f6e666967292c205620286c656e206f6620766f756368696e6720667269656e647329202d204f6e652073746f72616765207265616420746f2067657420746865207265636f7665727920636f6e66696775726174696f6e2e204f2831292c20436f646563204f284629202d204f6e652073746f72616765207265616420746f206765742074686520616374697665207265636f766572792070726f636573732e204f2831292c20436f646563204f285629202d204f6e652073746f72616765207265616420746f20676574207468652063757272656e7420626c6f636b206e756d6265722e204f283129202d204f6e652073746f726167652077726974652e204f2831292c20436f646563204f2856292e20546f74616c20436f6d706c65786974793a204f2846202b20562920416c6c6f7720612022667269656e6422206f662061207265636f76657261626c65206163636f756e7420746f20766f75636820666f7220616e20616374697665207265636f766572792070726f6365737320666f722074686174206163636f756e742e20546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64206d75737420626520612022667269656e642220666f7220746865207265636f76657261626c65206163636f756e742e202d20606c6f7374603a20546865206c6f7374206163636f756e74207468617420796f752077616e7420746f207265636f7665722e202d206072657363756572603a20546865206163636f756e7420747279696e6720746f2072657363756520746865206c6f7374206163636f756e74207468617420796f7520202077616e7420746f20766f75636820666f722e2054686520636f6d62696e6174696f6e206f662074686573652074776f20706172616d6574657273206d75737420706f696e7420746f20616e20616374697665207265636f766572792070726f636573732e202d204f6e652062696e6172792073656172636820746f20636f6e6669726d2063616c6c6572206973206120667269656e642e204f286c6f674629202d204f6e652062696e6172792073656172636820746f20636f6e6669726d2063616c6c657220686173206e6f7420616c726561647920766f75636865642e204f286c6f67562920546f74616c20436f6d706c65786974793a204f2846202b206c6f6746202b2056202b206c6f67562920496e697469617465207468652070726f6365737320666f72207265636f766572696e672061207265636f76657261626c65206163636f756e742e205061796d656e743a20605265636f766572794465706f736974602062616c616e63652077696c6c20626520726573657276656420666f7220696e6974696174696e6720746865207265636f766572792070726f636573732e2054686973206465706f7369742077696c6c20616c7761797320626520726570617472696174656420746f20746865206163636f756e7420747279696e6720746f206265207265636f76657265642e205365652060636c6f73655f7265636f76657279602e202d20606163636f756e74603a20546865206c6f7374206163636f756e74207468617420796f752077616e7420746f207265636f7665722e2054686973206163636f756e742020206e6565647320746f206265207265636f76657261626c652028692e652e20686176652061207265636f7665727920636f6e66696775726174696f6e292e202d204f6e652073746f72616765207265616420746f20636865636b2074686174206163636f756e74206973207265636f76657261626c652e204f284629202d204f6e652073746f72616765207265616420746f20636865636b20746861742074686973207265636f766572792070726f63657373206861736e277420616c726561647920737461727465642e204f283129202d204f6e652063757272656e63792072657365727665206f7065726174696f6e2e204f285829202d204f6e652073746f726167652077726974652e204f2831292e6163636f756e74204372656174652061207265636f7665727920636f6e66696775726174696f6e20666f7220796f7572206163636f756e742e2054686973206d616b657320796f7572206163636f756e74207265636f76657261626c652e205061796d656e743a2060436f6e6669674465706f7369744261736560202b2060467269656e644465706f736974466163746f7260202a20235f6f665f667269656e64732062616c616e63652077696c6c20626520726573657276656420666f722073746f72696e6720746865207265636f7665727920636f6e66696775726174696f6e2e2054686973206465706f7369742069732072657475726e656420696e2066756c6c207768656e2074686520757365722063616c6c73206072656d6f76655f7265636f76657279602e202d2060667269656e6473603a2041206c697374206f6620667269656e647320796f7520747275737420746f20766f75636820666f72207265636f7665727920617474656d7074732e20202053686f756c64206265206f72646572656420616e6420636f6e7461696e206e6f206475706c69636174652076616c7565732e202d20607468726573686f6c64603a20546865206e756d626572206f6620667269656e64732074686174206d75737420766f75636820666f722061207265636f7665727920617474656d70742020206265666f726520746865206163636f756e742063616e206265207265636f76657265642e2053686f756c64206265206c657373207468616e206f7220657175616c20746f202020746865206c656e677468206f6620746865206c697374206f6620667269656e64732e202d206064656c61795f706572696f64603a20546865206e756d626572206f6620626c6f636b732061667465722061207265636f7665727920617474656d707420697320696e697469616c697a656420202074686174206e6565647320746f2070617373206265666f726520746865206163636f756e742063616e206265207265636f76657265642e202d204b65793a204620286c656e206f6620667269656e647329202d204f6e652073746f72616765207265616420746f20636865636b2074686174206163636f756e74206973206e6f7420616c7265616479207265636f76657261626c652e204f2831292e202d204120636865636b20746861742074686520667269656e6473206c69737420697320736f7274656420616e6420756e697175652e204f284629202d204f6e652073746f726167652077726974652e204f2831292e20436f646563204f2846292e667269656e64735665633c543a3a4163636f756e7449643e7468726573686f6c6464656c61795f706572696f6420416c6c6f7720524f4f5420746f2062797061737320746865207265636f766572792070726f6365737320616e642073657420616e20612072657363756572206163636f756e7420666f722061206c6f7374206163636f756e74206469726563746c792e20546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f524f4f545f2e202d20606c6f7374603a2054686520226c6f7374206163636f756e742220746f206265207265636f76657265642e202d206072657363756572603a20546865202272657363756572206163636f756e74222077686963682063616e2063616c6c20617320746865206c6f7374206163636f756e742e202d204f6e652073746f72616765207772697465204f283129202d204f6e65206576656e746c6f73742053656e6420612063616c6c207468726f7567682061207265636f7665726564206163636f756e742e202d20606163636f756e74603a20546865207265636f7665726564206163636f756e7420796f752077616e7420746f206d616b6520612063616c6c206f6e2d626568616c662d6f662e202d206063616c6c603a205468652063616c6c20796f752077616e7420746f206d616b65207769746820746865207265636f7665726564206163636f756e742e202d2054686520776569676874206f6620746865206063616c6c60202b2031302c3030302e202d204f6e652073746f72616765206c6f6f6b757020746f20636865636b206163636f756e74206973207265636f7665726564206279206077686f602e204f28312900000000000000d8c110000b00000001050000000000003aa311000c00000000000000e3c110003a0000000000000000000000000000000000000054e0110020c21000000000000000000030c210000100000000000000000000000000000038c210001000000002050500000000003aa311000c000000000000003aa311000c0000000000000048c210003a0000000000000054e0110084c21000000000000000000094c2100004000000000000000000000000000000b5c611000500000001020000000000003aa311000c000000000000003aa311000c0000000000000000000000000000000000000054e01100b4c210000000000000000000c4c210000300000000000000000000005265636f76657261626c655265636f76657279436f6e6669673c543a3a426c6f636b4e756d6265722c2042616c616e63654f663c543e2c20543a3a4163636f756e7449643e00000019000000000000000100000032000000c8c31000420000004163746976655265636f7665726965734163746976655265636f766572793c543a3a426c6f636b4e756d6265722c2042616c616e63654f663c543e2c20543a3a4163636f756e7449643e0000190000000000000001000000320000003ec310001a00000054e011000000000058c31000450000009dc310002b00000019000000000000000100000032000000dcc210002400000054e011000000000000c310003e00000020546865206c697374206f6620616c6c6f7765642070726f7879206163636f756e74732e204d61702066726f6d2074686520757365722077686f2063616e2061636365737320697420746f20746865207265636f7665726564206163636f756e742e20416374697665207265636f7665727920617474656d7074732e204669727374206163636f756e7420697320746865206163636f756e7420746f206265207265636f76657265642c20616e6420746865207365636f6e64206163636f756e7420697320746865207573657220747279696e6720746f207265636f76657220746865206163636f756e742e2054686520736574206f66207265636f76657261626c65206163636f756e747320616e64207468656972207265636f7665727920636f6e66696775726174696f6e2e000000000000ecc4100011000000000000008cad11000c0000000000000054e0110000c51000000000000000000010c5100001000000000000000000000018c5100013000000000000008cad11000c0000000000000054e011002cc5100000000000000000003cc5100001000000000000000000000038a410000a0000000000000061a31100030000000000000054e0110044c51000000000000000000054c510000100000000000000000000005cc510000f000000000000008cad11000c0000000000000054e011006cc5100000000000000000007cc510000100000000000000436f6e6669674465706f736974426173650000001900000000000000010000004200000068c6100055000000467269656e644465706f736974466163746f7200190000000000000001000000430000000ec610005a00000019000000000000000100000044000000cbc51000430000005265636f766572794465706f736974001900000000000000010000004200000084c510004700000020546865206261736520616d6f756e74206f662063757272656e6379206e656564656420746f207265736572766520666f72207374617274696e672061207265636f766572792e20546865206d6178696d756d20616d6f756e74206f6620667269656e647320616c6c6f77656420696e2061207265636f7665727920636f6e66696775726174696f6e2e2054686520616d6f756e74206f662063757272656e6379206e656564656420706572206164646974696f6e616c2075736572207768656e206372656174696e672061207265636f7665727920636f6e66696775726174696f6e2e20546865206261736520616d6f756e74206f662063757272656e6379206e656564656420746f207265736572766520666f72206372656174696e672061207265636f7665727920636f6e66696775726174696f6e2e00000000000000c8c710000f00000000000000c8621100010000000000000000000000d8c71000010000000000000000000000e0c710001100000000000000f4c7100002000000000000000000000004c8100002000000000000000000000014c810000f0000000000000024c810000300000000000000000000003cc810000200000000000000000000004cc810000e00000000000000f4c710000200000000000000000000005cc810000200000000000000000000006cc810001000000000000000f4c710000200000000000000000000007cc810000200000000000000000000008cc810000f00000000000000c86211000100000000000000000000009cc8100001000000000000005265636f7665727943726561746564002dca1000350000005265636f76657279496e69746961746564000000fbaf110009000000fbaf110009000000e2c910004b0000001bc91000100000005265636f76657279566f756368656400fbaf110009000000fbaf110009000000fbaf11000900000073c9100057000000cac91000180000005265636f76657279436c6f73656400002bc91000480000001bc91000100000004163636f756e745265636f7665726564dac81000410000001bc91000100000005265636f7665727952656d6f76656400a4c81000360000002041207265636f766572792070726f6365737320686173206265656e2072656d6f76656420666f7220616e205b6163636f756e745d2e204c6f7374206163636f756e7420686173206265656e207375636365737366756c6c79207265636f76657265642062792072657363756572206163636f756e742e205b6c6f73742c20726573637565725d2041207265636f766572792070726f6365737320666f72206c6f7374206163636f756e742062792072657363756572206163636f756e7420686173206265656e20636c6f7365642e2041207265636f766572792070726f6365737320666f72206c6f7374206163636f756e742062792072657363756572206163636f756e7420686173206265656e20766f756368656420666f722062792073656e6465722e205b6c6f73742c20726573637565722c2073656e6465725d2041207265636f766572792070726f6365737320686173206265656e20696e6974696174656420666f72206c6f7374206163636f756e742062792072657363756572206163636f756e742e2041207265636f766572792070726f6365737320686173206265656e2073657420757020666f7220616e205b6163636f756e745d2e000000000000809910000c00000000000000d4ca1000010000000000000000000000699910001700000000000000dcca10000100000000000000000000005c9910000d00000000000000e4ca10000100000000000000000000008c9910000600000000000000ecca1000010000000000000060cb10001900000038cb1000280000001ecb10001a000000f4ca10002a000000204e6f206b65797320617265206173736f63696174656420776974682074686973206163636f756e742e2052656769737465726564206475706c6963617465206b65792e204e6f206173736f6369617465642076616c696461746f7220494420666f72206163636f756e742e20496e76616c6964206f776e6572736869702070726f6f662e000000000000005fa410000a000000000000003ccd100001000000000000000000000052a410000d0000000000000044cd100001000000000000000000000042a4100010000000000000004ccd100001000000000000000000000038a410000a0000000000000054cd10000100000000000000000000002fa4100009000000000000005ccd100001000000000000000000000021a410000e0000000000000064cd10000100000000000000000000000fa4100012000000000000006ccd100001000000000000000000000001a410000e0000000000000074cd1000010000000000000000000000f7a310000a000000000000007ccd1000010000000000000000000000eea31000090000000000000084cd1000010000000000000000000000e3a310000b000000000000008ccd1000010000000000000000000000d5a310000e0000000000000094cd1000010000000000000000000000cca3100009000000000000009ccd1000010000000000000000000000c1a310000b00000000000000a4cd1000010000000000000000000000e8df10000800000000000000accd100001000000000000000000000069a410000c000000000000006ccd100001000000000000006fd010003d0000004bd010002400000016d0100035000000ebcf10002b000000b8cf10003300000090cf10002800000064cf10002c0000002ccf100038000000f8ce100034000000cdce10002b00000086ce10004700000056ce1000300000001bce10003b000000dbcd100040000000b4cd1000270000002054686572652077617320616e206f766572666c6f7720696e20612063616c63756c6174696f6e20546865726520617265207374696c6c20616374697665207265636f7665727920617474656d7074732074686174206e65656420746f20626520636c6f73656420546865207468726573686f6c6420666f72207265636f766572696e672074686973206163636f756e7420686173206e6f74206265656e206d6574205468697320757365722068617320616c726561647920766f756368656420666f722074686973207265636f766572792054686520667269656e64206d757374207761697420756e74696c207468652064656c617920706572696f6420746f20766f75636820666f722074686973207265636f766572792054686973206163636f756e74206973206e6f74206120667269656e642077686f2063616e20766f7563682041207265636f766572792070726f6365737320686173206e6f74207374617274656420666f72207468697320726573637565722041207265636f766572792070726f636573732068617320616c7265616479207374617274656420666f722074686973206163636f756e742054686973206163636f756e7420697320616c72656164792073657420757020666f72207265636f766572792054686973206163636f756e74206973206e6f742073657420757020666f72207265636f7665727920467269656e6473206c697374206d75737420626520736f7274656420616e642066726565206f66206475706c69636174657320467269656e6473206c697374206d757374206265206c657373207468616e206d617820667269656e647320467269656e6473206c697374206d7573742062652067726561746572207468616e207a65726f20616e64207468726573686f6c64205468726573686f6c64206d7573742062652067726561746572207468616e207a65726f2055736572206973206e6f7420616c6c6f77656420746f206d616b6520612063616c6c206f6e20626568616c66206f662074686973206163636f756e744c6f6f6b75704167656e6461546f74616c49737375616e63654578697374696e6756657374696e675363686564756c654e6f7456657374696e67416d6f756e744c6f770000000000a0d11000040000000000000054e01100000000000000000000000000a4d110001100000000000000000000002cd210000a0000000000000038d2100001000000000000000000000050d21000130000000000000000000000e8d210000f00000000000000f8d2100002000000000000000000000028d31000120000000000000000000000b8d310001500000000000000d0d3100003000000000000000000000018d41000130000000000000076657374c4da10002f00000054e0110000000000f3da1000580000000fd910001a00000054e011000000000029d910003500000054e0110000000000a9a211000b00000010d610000a0000004bdb10001e00000069db10003f000000a8db100040000000d9d910000d000000e8db10003b00000023dc10003900000059da10006b00000027a311000c000000766573745f6f746865720000000000007dd710000600000000000000f35f1100230000008bd810002f00000054e0110000000000b8a611003400000054e0110000000000bad81000550000000fd910001a00000054e011000000000029d910003500000054e0110000000000a9a211000b00000010d610000a000000ced710001e0000005ed910003d0000009bd910003e000000d9d910000d000000e6d910003a00000020da10003900000059da10006b00000027a311000c0000007665737465645f7472616e7366657200000000007dd710000600000000000000f35f1100230000000000000083d7100008000000000000008bd7100029000000b4d710001a00000054e0110000000000b8a611003400000054e011000000000036d51000450000007bd5100040000000bbd510003d00000054e0110000000000f8d510001800000054e0110000000000a9a211000b00000010d610000a000000ced710001e000000ecd710004f0000003bd8100050000000d3d61000380000000bd710006c00000027a311000c000000666f7263655f7665737465645f7472616e736665720000000000000077d710000600000000000000f35f110023000000000000007dd710000600000000000000f35f1100230000000000000083d7100008000000000000008bd7100029000000b0d410001900000054e0110000000000c9d410003200000054e0110000000000fbd410003b00000036d51000450000007bd5100040000000bbd510003d00000054e0110000000000f8d510001800000054e0110000000000a9a211000b00000010d610000a0000001ad610001e00000038d610004d00000085d610004e000000d3d61000380000000bd710006c00000027a311000c00000020466f726365206120766573746564207472616e736665722e20546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f526f6f745f2e202d2060736f75726365603a20546865206163636f756e742077686f73652066756e64732073686f756c64206265207472616e736665727265642e202d2060746172676574603a20546865206163636f756e7420746861742073686f756c64206265207472616e7366657272656420746865207665737465642066756e64732e202d2060616d6f756e74603a2054686520616d6f756e74206f662066756e647320746f207472616e7366657220616e642077696c6c206265207665737465642e202d20607363686564756c65603a205468652076657374696e67207363686564756c6520617474616368656420746f20746865207472616e736665722e20456d697473206056657374696e6743726561746564602e202d20604f283129602e202d2044625765696768743a20342052656164732c20342057726974657320202020202d2052656164733a2056657374696e672053746f726167652c2042616c616e636573204c6f636b732c20546172676574204163636f756e742c20536f75726365204163636f756e7420202020202d205772697465733a2056657374696e672053746f726167652c2042616c616e636573204c6f636b732c20546172676574204163636f756e742c20536f75726365204163636f756e74202d2042656e63686d61726b3a203130302e33202b202e333635202a206c20c2b57320286d696e2073717561726520616e616c7973697329202d205573696e672031303020c2b5732066697865642e20417373756d696e67206c657373207468616e203530206c6f636b73206f6e20616e7920757365722c20656c7365207765206d61792077616e7420666163746f7220696e206e756d626572206f66206c6f636b732e736f757263657461726765747363686564756c6556657374696e67496e666f3c42616c616e63654f663c543e2c20543a3a426c6f636b4e756d6265723e20437265617465206120766573746564207472616e736665722e202d2044625765696768743a20332052656164732c20332057726974657320202020202d2052656164733a2056657374696e672053746f726167652c2042616c616e636573204c6f636b732c20546172676574204163636f756e742c205b53656e646572204163636f756e745d20202020202d205772697465733a2056657374696e672053746f726167652c2042616c616e636573204c6f636b732c20546172676574204163636f756e742c205b53656e646572204163636f756e745d20556e6c6f636b20616e79207665737465642066756e6473206f662061206074617267657460206163636f756e742e202d2060746172676574603a20546865206163636f756e742077686f7365207665737465642066756e64732073686f756c6420626520756e6c6f636b65642e204d75737420686176652066756e6473207374696c6c206c6f636b656420756e6465722074686973206d6f64756c652e20456d69747320656974686572206056657374696e67436f6d706c6574656460206f72206056657374696e6755706461746564602e20202020202d2052656164733a2056657374696e672053746f726167652c2042616c616e636573204c6f636b732c20546172676574204163636f756e7420202020202d205772697465733a2056657374696e672053746f726167652c2042616c616e636573204c6f636b732c20546172676574204163636f756e74202d2042656e63686d61726b3a20202020202d20556e6c6f636b65643a2034342e33202b202e323934202a206c20c2b57320286d696e2073717561726520616e616c797369732920202020202d204c6f636b65643a2034382e3136202b202e313033202a206c20c2b57320286d696e2073717561726520616e616c7973697329202d205573696e6720353020c2b5732066697865642e20417373756d696e67206c657373207468616e203530206c6f636b73206f6e20616e7920757365722c20656c7365207765206d61792077616e7420666163746f7220696e206e756d626572206f66206c6f636b732e20556e6c6f636b20616e79207665737465642066756e6473206f66207468652073656e646572206163636f756e742e20546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d75737420686176652066756e6473207374696c6c202d2044625765696768743a20322052656164732c20322057726974657320202020202d2052656164733a2056657374696e672053746f726167652c2042616c616e636573204c6f636b732c205b53656e646572204163636f756e745d20202020202d205772697465733a2056657374696e672053746f726167652c2042616c616e636573204c6f636b732c205b53656e646572204163636f756e745d20202020202d20556e6c6f636b65643a2034382e3736202b202e303438202a206c20c2b57320286d696e2073717561726520616e616c797369732920202020202d204c6f636b65643a2034342e3433202b202e323834202a206c20c2b57320286d696e2073717561726520616e616c797369732900000000a1c611000700000001020000000000003aa311000c000000000000008bd71000290000000000000000000000000000000000000054e01100b4dc10000000000000000000c4dc100001000000000000000000000019000000000000000100000032000000ccdc10003600000020496e666f726d6174696f6e20726567617264696e67207468652076657374696e67206f66206120676976656e206163636f756e742e0000000000003cdd100011000000000000008cad11000c0000000000000054e0110050dd1000000000000000000060dd100001000000000000004d696e5665737465645472616e736665720000001900000000000000010000004500000068dd10004700000020546865206d696e696d756d20616d6f756e7420746f206265207472616e7366657272656420746f206372656174652061206e65772076657374696e67207363686564756c652e000000000008de10000e0000000000000018de100002000000000000000000000028de100003000000000000000000000040de10001000000000000000c862110001000000000000000000000050de1000010000000000000056657374696e67557064617465640000fbaf1100090000007f4b1100070000009dde100056000000f3de1000470000003adf10001400000056657374696e67436f6d706c6574656458de10004500000020416e205b6163636f756e745d20686173206265636f6d652066756c6c79207665737465642e204e6f20667572746865722076657374696e672063616e2068617070656e2e2054686520616d6f756e742076657374656420686173206265656e20757064617465642e205468697320636f756c6420696e646963617465206d6f72652066756e64732061726520617661696c61626c652e205468652062616c616e636520676976656e2069732074686520616d6f756e74207768696368206973206c65667420756e7665737465642028616e642074687573206c6f636b6564292e20205b6163636f756e742c20756e7665737465645d00004600000050000000080000004700000048000000486973746f726963616c53657373696f6e730000460000005000000008000000490000004a0000004b0000004c0000004d0000004e0000004f0000006661696c656420746f20696e7365727420696e746f20747269654b656570416c6976654578697374656e7469616c4465706f736974496e73756666696369656e7442616c616e63654f766572666c6f774c69717569646974795265737472696374696f6e7356657374696e6742616c616e6365446561644163636f756e74000000000000d0e010000800000000000000d8e0100002000000000000000000000008e110001b0000000000000000000000e0e110000b00000000000000ece1100003000000000000000000000034e21000120000000000000000000000c4e210000e00000000000000d4e210000300000000000000000000001ce310000600000000000000000000004ce310001300000000000000d8e0100002000000000000000000000060e310000b000000000000007472616e7366657200000000f3e510000400000000000000f35f11002300000000000000f7e510000500000000000000fce510001300000054e810003600000054e01100000000008ae8100042000000cce810004800000014e910004500000059e910002d00000054e011000000000086e910004600000054e0110000000000a9a211000b000000cce910004c00000018ea1000330000004bea10005a00000054e0110000000000a5ea10001300000054e0110000000000b8ea1000540000000ceb10004b00000057eb1000350000008ceb100058000000e4eb10005200000036ec10003e00000074ec10002200000096ec100051000000e7ec1000370000001eed10004500000027a311000c0000007365745f62616c616e63650000000000f05f11000300000000000000f35f1100230000000000000040e810000800000000000000fce51000130000000000000048e810000c00000000000000fce51000130000000fe610002500000054e011000000000034e61000480000007ce6100042000000bee610004600000004e710004000000054e011000000000044e710002d00000054e0110000000000a9a211000b00000071e710002000000091e7100031000000c2e7100016000000d8e710000f000000e7e710001a00000001e81000190000001ae810002600000027a311000c000000666f7263655f7472616e7366657200000000000077d710000600000000000000f35f11002300000000000000f3e510000400000000000000f35f11002300000000000000f7e510000500000000000000fce510001300000020e510005400000074e510000b000000a9a211000b0000007fe5100050000000cfe510002400000027a311000c0000007472616e736665725f6b6565705f616c69766500b8e31000540000000ce410001000000054e01100000000001ce410002f00000054e01100000000004be4100031000000a9a211000b0000007ce410003a000000b6e4100018000000cee410004700000015e510000b0000002053616d6520617320746865205b607472616e73666572605d2063616c6c2c206275742077697468206120636865636b207468617420746865207472616e736665722077696c6c206e6f74206b696c6c20746865206f726967696e206163636f756e742e20393925206f66207468652074696d6520796f752077616e74205b607472616e73666572605d20696e73746561642e205b607472616e73666572605d3a207374727563742e4d6f64756c652e68746d6c236d6574686f642e7472616e73666572202d2043686561706572207468616e207472616e736665722062656361757365206163636f756e742063616e6e6f74206265206b696c6c65642e202d2042617365205765696768743a2035312e3420c2b573202d204442205765696768743a2031205265616420616e64203120577269746520746f2064657374202873656e64657220697320696e206f7665726c617920616c72656164792920233c2f7765696768743e2045786163746c7920617320607472616e73666572602c2065786365707420746865206f726967696e206d75737420626520726f6f7420616e642074686520736f75726365206163636f756e74206d6179206265207370656369666965642e202d2053616d65206173207472616e736665722c20627574206164646974696f6e616c207265616420616e6420777269746520626563617573652074686520736f75726365206163636f756e742069732020206e6f7420617373756d656420746f20626520696e20746865206f7665726c61792e6465737476616c7565436f6d706163743c543a3a42616c616e63653e20536574207468652062616c616e636573206f66206120676976656e206163636f756e742e20546869732077696c6c20616c74657220604672656542616c616e63656020616e642060526573657276656442616c616e63656020696e2073746f726167652e2069742077696c6c20616c736f2064656372656173652074686520746f74616c2069737375616e6365206f66207468652073797374656d202860546f74616c49737375616e636560292e20496620746865206e65772066726565206f722072657365727665642062616c616e63652069732062656c6f7720746865206578697374656e7469616c206465706f7369742c2069742077696c6c20726573657420746865206163636f756e74206e6f6e63652028606672616d655f73797374656d3a3a4163636f756e744e6f6e636560292e20546865206469737061746368206f726967696e20666f7220746869732063616c6c2069732060726f6f74602e202d20496e646570656e64656e74206f662074686520617267756d656e74732e202d20436f6e7461696e732061206c696d69746564206e756d626572206f6620726561647320616e64207772697465732e202d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d202d2042617365205765696768743a20202020202d204372656174696e673a2032372e353620c2b57320202020202d204b696c6c696e673a2033352e313120c2b573202d204442205765696768743a203120526561642c203120577269746520746f206077686f606e65775f667265656e65775f7265736572766564205472616e7366657220736f6d65206c697175696420667265652062616c616e636520746f20616e6f74686572206163636f756e742e20607472616e73666572602077696c6c207365742074686520604672656542616c616e636560206f66207468652073656e64657220616e642072656365697665722e2049742077696c6c2064656372656173652074686520746f74616c2069737375616e6365206f66207468652073797374656d2062792074686520605472616e73666572466565602e204966207468652073656e6465722773206163636f756e742069732062656c6f7720746865206578697374656e7469616c206465706f736974206173206120726573756c74206f6620746865207472616e736665722c20746865206163636f756e742077696c6c206265207265617065642e20546865206469737061746368206f726967696e20666f7220746869732063616c6c206d75737420626520605369676e65646020627920746865207472616e736163746f722e202d20446570656e64656e74206f6e20617267756d656e747320627574206e6f7420637269746963616c2c20676976656e2070726f70657220696d706c656d656e746174696f6e7320666f72202020696e70757420636f6e6669672074797065732e205365652072656c617465642066756e6374696f6e732062656c6f772e202d20497420636f6e7461696e732061206c696d69746564206e756d626572206f6620726561647320616e642077726974657320696e7465726e616c6c7920616e64206e6f20636f6d706c657820636f6d7075746174696f6e2e2052656c617465642066756e6374696f6e733a2020202d2060656e737572655f63616e5f77697468647261776020697320616c776179732063616c6c656420696e7465726e616c6c792062757420686173206120626f756e64656420636f6d706c65786974792e2020202d205472616e7366657272696e672062616c616e63657320746f206163636f756e7473207468617420646964206e6f74206578697374206265666f72652077696c6c20636175736520202020202060543a3a4f6e4e65774163636f756e743a3a6f6e5f6e65775f6163636f756e746020746f2062652063616c6c65642e2020202d2052656d6f76696e6720656e6f7567682066756e64732066726f6d20616e206163636f756e742077696c6c20747269676765722060543a3a4475737452656d6f76616c3a3a6f6e5f756e62616c616e636564602e2020202d20607472616e736665725f6b6565705f616c6976656020776f726b73207468652073616d652077617920617320607472616e73666572602c206275742068617320616e206164646974696f6e616c2020202020636865636b207468617420746865207472616e736665722077696c6c206e6f74206b696c6c20746865206f726967696e206163636f756e742e202d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d202d2042617365205765696768743a2037332e363420c2b5732c20776f7273742063617365207363656e6172696f20286163636f756e7420637265617465642c206163636f756e742072656d6f76656429202d204442205765696768743a2031205265616420616e64203120577269746520746f2064657374696e6174696f6e206163636f756e74202d204f726967696e206163636f756e7420697320616c726561647920696e206d656d6f72792c20736f206e6f204442206f7065726174696f6e7320666f72207468656d2e0000000000b8d010000d0000000000000000000000c4ee10000a0000000000000000000000000000000000000000000000000000000000000054e01100d0ee10000000000000000000e0ee100001000000000000000100000000000000620911000700000001020000000000003aa311000c00000000000000e8ee1000170000000000000000000000000000000000000054e0110000ef1000000000000000000010ef10000300000000000000010000000000000028ef10000500000001020000000000003aa311000c000000000000002def10001c0000000000000000000000000000000000000054e011004cef100000000000000000005cef100002000000000000000100000000000000205911000e00000000000000000000002e591100080000000000000000000000000000000000000000000000000000000000000054e011006cef100000000000000000007cef1000030000000000000001000000543a3a42616c616e6365000019000000000000000100000050000000bdf01000260000004163636f756e74446174613c543a3a42616c616e63653e001900000000000000010000005100000052f010001b00000054e01100000000006df01000500000004c6f636b735665633c42616c616e63654c6f636b3c543a3a42616c616e63653e3e00000019000000000000000100000052000000dbef10002e00000009f01000490000001900000000000000010000005300000094ef10001f00000054e0110000000000b3ef1000280000002053746f726167652076657273696f6e206f66207468652070616c6c65742e20546869732069732073657420746f2076322e302e3020666f72206e6577206e6574776f726b732e20416e79206c6971756964697479206c6f636b73206f6e20736f6d65206163636f756e742062616c616e6365732e204e4f54453a2053686f756c64206f6e6c79206265206163636573736564207768656e2073657474696e672c206368616e67696e6720616e642066726565696e672061206c6f636b2e205468652062616c616e6365206f6620616e206163636f756e742e204e4f54453a2054686973206973206f6e6c79207573656420696e20746865206361736520746861742074686973206d6f64756c65206973207573656420746f2073746f72652062616c616e6365732e2054686520746f74616c20756e6974732069737375656420696e207468652073797374656d2e0000000000c3df10001200000000000000c4ee10000a0000000000000054e011001cf1100000000000000000002cf1100001000000000000001900000000000000010000005400000034f110003500000020546865206d696e696d756d20616d6f756e7420726571756972656420746f206b65657020616e206163636f756e74206f70656e2e00000000000000ccf21000070000000000000018de1000020000000000000000000000d4f21000010000000000000000000000dcf21000080000000000000018de1000020000000000000000000000e4f21000020000000000000000000000f4f210000800000000000000fcf2100003000000000000000000000014f310000100000000000000000000001cf310000a0000000000000028f3100003000000000000000000000040f3100001000000000000000000000048f31000070000000000000018de100002000000000000000000000050f3100001000000000000000000000058f31000080000000000000018de100002000000000000000000000060f3100001000000000000000000000068f310000a0000000000000018de100002000000000000000000000074f310000100000000000000000000007cf31000120000000000000090f31000040000000000000000000000b0f310000300000000000000456e646f776564002ef6100047000000447573744c6f7374acf5100050000000fcf51000320000005472616e73666572fbaf110009000000fbaf1100090000007f4b11000700000086f510002600000042616c616e63655365740000fbaf1100090000007f4b1100070000007f4b11000700000055f51000310000004465706f736974000ff51000460000005265736572766564c9f4100046000000556e7265736572766564000081f41000480000005265736572766552657061747269617465640000fbaf110009000000fbaf1100090000007f4b1100070000007bf4100006000000c8f31000540000001cf410003700000053f410002800000020536f6d652062616c616e636520776173206d6f7665642066726f6d207468652072657365727665206f6620746865206669727374206163636f756e7420746f20746865207365636f6e64206163636f756e742e2046696e616c20617267756d656e7420696e64696361746573207468652064657374696e6174696f6e2062616c616e636520747970652e205b66726f6d2c20746f2c2062616c616e63652c2064657374696e6174696f6e5f7374617475735d53746174757320536f6d652062616c616e63652077617320756e726573657276656420286d6f7665642066726f6d20726573657276656420746f2066726565292e205b77686f2c2076616c75655d20536f6d652062616c616e63652077617320726573657276656420286d6f7665642066726f6d206672656520746f207265736572766564292e205b77686f2c2076616c75655d20536f6d6520616d6f756e7420776173206465706f73697465642028652e672e20666f72207472616e73616374696f6e2066656573292e205b77686f2c206465706f7369745d20412062616c616e6365207761732073657420627920726f6f742e205b77686f2c20667265652c2072657365727665645d205472616e73666572207375636365656465642e205b66726f6d2c20746f2c2076616c75655d20416e206163636f756e74207761732072656d6f7665642077686f73652062616c616e636520776173206e6f6e2d7a65726f206275742062656c6f77204578697374656e7469616c4465706f7369742c20726573756c74696e6720696e20616e206f75747269676874206c6f73732e205b6163636f756e742c2062616c616e63655d20416e206163636f756e74207761732063726561746564207769746820736f6d6520667265652062616c616e63652e205b6163636f756e742c20667265655f62616c616e63655d4661696c6564546f43616e63656c4661696c6564546f5363686564756c65546172676574426c6f636b4e756d626572496e5061737400000000000083d710000800000000000000b4f7100004000000000000000000000014f810000a000000000000000000000064f8100006000000000000006cf810000200000000000000000000009cf810000a0000000000000000000000ecf810000e00000000000000fcf8100005000000000000000000000074f910000a0000000000000000000000c4f910000c00000000000000d0f91000010000000000000000000000e8f910000a000000000000000000000038fa10000e0000000000000048fa1000040000000000000000000000a8fa1000050000000000000000000000d0fa10001400000000000000e4fa10000500000000000000000000005cfb1000050000000000000000000000ddfd1000040000000000000020be11000e00000000000000ccfb10000e00000000000000dafb1000280000000000000002fc100008000000000000000afc100012000000000000006aab110004000000000000006eab1100170000003ffe10001d00000054e0110000000000a9a211000b0000007cfc1000280000005cfe100024000000351411000d0000002cfe10001300000080fe10001400000094fe10004f00000027a311000c00000063616e63656c000000000000ddfd1000040000000000000020be11000e000000000000005ca3110005000000000000006890110003000000e1fd10002600000054e0110000000000a9a211000b0000007cfc10002800000007fe100025000000351411000d0000002cfe100013000000e4fc10001c00000000fd10005000000027a311000c0000007363686564756c655f6e616d6564000000000000c5fb10000200000000000000ff7a11000700000000000000ddfd1000040000000000000020be11000e00000000000000ccfb10000e00000000000000dafb1000280000000000000002fc100008000000000000000afc100012000000000000006aab110004000000000000006eab11001700000050fd10001700000054e0110000000000a9a211000b0000007cfc10002800000067fd100023000000351411000d000000c9fc10001b000000e4fc10001c0000008afd10005300000027a311000c00000063616e63656c5f6e616d656400000000c5fb10000200000000000000ff7a1100070000005dfc10001f00000054e0110000000000a9a211000b0000007cfc100028000000a4fc100025000000351411000d000000c9fc10001b000000e4fc10001c00000000fd10005000000027a311000c0000007363686564756c655f6166746572000000000000c7fb1000050000000000000020be11000e00000000000000ccfb10000e00000000000000dafb1000280000000000000002fc100008000000000000000afc100012000000000000006aab110004000000000000006eab1100170000001cfc10002b00000054e0110000000000a9a211000b00000047fc10001600000027a311000c0000007363686564756c655f6e616d65645f616674657200000000c5fb10000200000000000000ff7a11000700000000000000c7fb1000050000000000000020be11000e00000000000000ccfb10000e00000000000000dafb1000280000000000000002fc100008000000000000000afc100012000000000000006aab110004000000000000006eab11001700000084fb10002500000054e0110000000000a9a211000b000000a9fb10001c00000027a311000c000000205363686564756c652061206e616d6564207461736b20616674657220612064656c61792e2053616d65206173205b607363686564756c655f6e616d6564605d2e696461667465726d617962655f706572696f6469634f7074696f6e3c7363686564756c653a3a506572696f643c543a3a426c6f636b4e756d6265723e3e7072696f726974797363686564756c653a3a5072696f7269747920416e6f6e796d6f75736c79207363686564756c652061207461736b20616674657220612064656c61792e2053616d65206173205b607363686564756c65605d2e2043616e63656c2061206e616d6564207363686564756c6564207461736b2e202d2053203d204e756d626572206f6620616c7265616479207363686564756c65642063616c6c73202d2042617365205765696768743a2032342e3931202b20322e393037202a205320c2b57320202020202d20526561643a204167656e64612c204c6f6f6b757020202020202d2057726974653a204167656e64612c204c6f6f6b7570202d2057696c6c20757365206261736520776569676874206f66203130302077686963682073686f756c6420626520676f6f6420666f7220757020746f203330207363686564756c65642063616c6c73205363686564756c652061206e616d6564207461736b2e202d2042617365205765696768743a2032392e36202b202e313539202a205320c2b573202d2057696c6c20757365206261736520776569676874206f662033352077686963682073686f756c6420626520676f6f6420666f72206d6f7265207468616e203330207363686564756c65642063616c6c737768656e2043616e63656c20616e20616e6f6e796d6f75736c79207363686564756c6564207461736b2e202d2042617365205765696768743a2032322e3135202b20322e383639202a205320c2b57320202020202d20526561643a204167656e646120416e6f6e796d6f75736c79207363686564756c652061207461736b2e202d2042617365205765696768743a2032322e3239202b202e313236202a205320c2b57320202020202d2057726974653a204167656e6461202d2057696c6c20757365206261736520776569676874206f662032352077686963682073686f756c6420626520676f6f6420666f7220757020746f203330207363686564756c65642063616c6c730000000000b2d0100006000000010500000000000020be11000e00000000000000ecff10005b0000000000000000000000000000000000000054e011004800110000000000000000005800110001000000000000000100000000000000acd01000060000000105000000000000ff7a11000700000000000000600011001b0000000000000000000000000000000000000054e011007c00110000000000000000008c00110001000000000000000000000000000000205911000e00000000000000000000002e591100080000000000000000000000000000000000000000000000000000000000000054e01100940011000000000000000000a40011000300000000000000010000005665633c4f7074696f6e3c5363686564756c65643c3c542061732054726169743e3a3a43616c6c2c20543a3a426c6f636b4e756d6265722c20543a3a0a50616c6c6574734f726967696e2c20543a3a4163636f756e7449643e3e3e001900000000000000010000002f00000022011100530000005461736b416464726573733c543a3a426c6f636b4e756d6265723e0019000000000000000100000032000000e2001100400000001900000000000000010000005300000094ef10001f00000054e0110000000000bc00110026000000204e6577206e6574776f726b732073746172742077697468206c6173742076657273696f6e2e204c6f6f6b75702066726f6d206964656e7469747920746f2074686520626c6f636b206e756d62657220616e6420696e646578206f6620746865207461736b2e204974656d7320746f2062652065786563757465642c20696e64657865642062792074686520626c6f636b206e756d626572207468617420746865792073686f756c64206265206578656375746564206f6e2e00000000000000fc011100090000000000000008021100020000000000000000000000180211000100000000000000000000002002110008000000000000000802110002000000000000000000000028021100010000000000000000000000300211000a000000000000003c0211000300000000000000000000005402110001000000000000005363686564756c6564000000f10211000b0000006890110003000000ce0211002300000043616e63656c6564ac0211002200000044697370617463686564000085021100180000009d0211000f00000046b011000e0000005c02110029000000204469737061746368656420736f6d65207461736b2e205b7461736b2c2069642c20726573756c745d5461736b416464726573733c426c6f636b4e756d6265723e4f7074696f6e3c5665633c75383e3e2043616e63656c656420736f6d65207461736b2e205b7768656e2c20696e6465785d205363686564756c656420736f6d65207461736b2e205b7768656e2c20696e6465785d426c6f636b4e756d62657204031100260000005375626d6974746564204752414e4450412065717569766f636174696f6e207265706f72742e0000e703110016000000fd03110016000000b40311002d000000e103110003000000e40311000300000000000000200000000000000002000000000000000200000000000000030000000100000020000000080000000200000000000000000000000200000003000000020000002000000000000000020000000000000002000000000000000300000042697450747220726567696f6e2063616e6e6f7420777261702074686520616464726573732073706163653a20202b20203d204269745074722063616e6e6f7420616464726573732020626974733b20746865206d6178696d756d206973200000000000dcd010000a0000000000000068041100010000000000000000000000c5d01000170000000000000070041100010000000000000000000000e6d0100009000000000000007804110001000000000000001905110022000000c204110057000000800411004200000020416d6f756e74206265696e67207472616e7366657272656420697320746f6f206c6f7720746f2063726561746520612076657374696e67207363686564756c652e20416e206578697374696e672076657374696e67207363686564756c6520616c72656164792065786973747320666f722074686973206163636f756e7420746861742063616e6e6f7420626520636c6f6262657265642e20546865206163636f756e7420676976656e206973206e6f742076657374696e672e000000000083f6100010000000000000009005110001000000000000000000000075f610000e000000000000009805110001000000000000000000000093f610001700000000000000a00511000100000000000000f40511001a000000d205110022000000a80511002a00000020476976656e2074617267657420626c6f636b206e756d62657220697320696e2074686520706173742e204661696c656420746f2063616e63656c2061207363686564756c65642063616c6c204661696c656420746f207363686564756c6520612063616c6c00000000000005e010000e00000000000000f0061100010000000000000000000000f0df10001500000000000000f8061100010000000000000000000000e8df1000080000000000000000071100010000000000000000000000d5df1000130000000000000008071100010000000000000000000000c3df1000120000000000000010071100010000000000000000000000badf1000090000000000000018071100010000000000000000000000c5d0100017000000000000002007110001000000000000000000000013e010000b0000000000000028071100010000000000000052081100270000002008110032000000030811001d000000e50711001e000000aa0711003b0000008607110024000000530711003300000030071100230000002042656e6566696369617279206163636f756e74206d757374207072652d657869737420412076657374696e67207363686564756c6520616c72656164792065786973747320666f722074686973206163636f756e74205472616e736665722f7061796d656e7420776f756c64206b696c6c206163636f756e742056616c756520746f6f206c6f7720746f20637265617465206163636f756e742064756520746f206578697374656e7469616c206465706f7369742042616c616e636520746f6f206c6f7720746f2073656e642076616c756520476f7420616e206f766572666c6f7720616674657220616464696e67204163636f756e74206c6971756964697479207265737472696374696f6e732070726576656e74207769746864726177616c2056657374696e672062616c616e636520746f6f206869676820746f2073656e642076616c75657573657220646f6573206e6f74206861766520616e206578697374696e672076657374696e67207363686564756c653b20712e652e642e190000000c0000000400000055000000e00811005e0000001d01000012000000e00811005e00000046010000120000002f686f6d652f6261737469616e2f2e636172676f2f6769742f636865636b6f7574732f7375627374726174652d376530383433336434633337306132312f383730363363332f6672616d652f76657374696e672f7372632f6c69622e7273436865636b47656e65736973436865636b547856657273696f6e436865636b4e6f6e63654163636f756e74426c6f636b486173684e6f6e44656661756c74436f6d706f736974654661696c6564546f4578747261637452756e74696d6556657273696f6e5370656356657273696f6e4e65656473546f496e637265617365496e76616c6964537065634e616d654e6f6e5a65726f526566436f756e743a65787472696e7369635f696e6465784e756d626572446967657374506172656e744861736845787472696e73696373526f6f744576656e74734576656e74546f706963730000000000d80b11000a00000000000000e40b1100010000000000000000000000fc0b1100010000000000000000000000864b11000600000000000000040c11000100000000000000000000001c0c1100070000000000000000000000540c11000e00000000000000640c11000100000000000000000000007c0c1100080000000000000000000000bc0c11000800000000000000c40c1100010000000000000000000000dc0c11000a00000000000000000000002c0d11001700000000000000c40c1100010000000000000000000000440d1100080000000000000000000000840d110017000000000000009c0d1100010000000000000000000000b40d11000a0000000000000000000000040e11000b00000000000000100e1100010000000000000000000000280e1100080000000000000000000000680e11000c00000000000000740e11000100000000000000000000008c0e1100080000000000000000000000cc0e11000b00000000000000d80e1100020000000000000000000000080f11000b0000000000000000000000600f1100070000000000000054e01100000000000000000000000000680f11000a0000000000000066696c6c5f626c6f636b0000000000001818110006000000000000001e18110007000000d61711004200000000000000cf1711000700000000000000ff7a110007000000681711001b00000054e0110000000000a9a211000b00000035101100090000008317110038000000bb1711001400000027a311000c0000007365745f686561705f7061676573000000000000631711000500000000000000be8e110003000000e01611003f00000054e0110000000000a9a211000b00000035101100090000001f1711001300000032171100190000004b1711001800000027a311000c0000007365745f636f646500000000dc1611000400000000000000ff7a110007000000941511001a00000054e0110000000000a9a211000b000000ae1511004d0000000a15110022000000fb1511005e0000002c1511000b000000591611005f000000b81611002400000027a311000c0000007365745f636f64655f776974686f75745f636865636b73009f1411004700000054e0110000000000a9a211000b000000e6141100240000000a151100220000002c1511000b000000371511005d00000027a311000c0000007365745f6368616e6765735f747269655f636f6e66696700000000006c14110013000000000000007f14110020000000921311002800000054e0110000000000a9a211000b0000003510110009000000ba1311002c000000e6131100360000001c14110019000000351411000d000000421411002a00000027a311000c0000007365745f73746f726167650000000000801311000500000000000000851311000d000000041311001b00000054e0110000000000a9a211000b0000001f13110025000000441311001f000000631311001d000000de1211001a00000027a311000c0000006b696c6c5f73746f7261676500000000f81211000400000000000000fc121100080000004c1211001e00000054e0110000000000a9a211000b0000006a1211003f000000a912110019000000c21211001c000000de1211001a00000027a311000c0000006b696c6c5f70726566697800000000003e1211000600000000000000e861110003000000000000004412110008000000000000006890110003000000cd1011004500000054e0110000000000121111004f000000611111005000000054e0110000000000a9a211000b000000b111110037000000e811110019000000011211001d0000001e1211002000000027a311000c0000007375696369646500b80f110059000000111011002400000054e0110000000000a9a211000b00000035101100090000003e1011001f0000005d101100150000007210110017000000891011004400000027a311000c000000204b696c6c207468652073656e64696e67206163636f756e742c20617373756d696e6720746865726520617265206e6f207265666572656e636573206f75747374616e64696e6720616e642074686520636f6d706f73697465206461746120697320657175616c20746f206974732064656661756c742076616c75652e202d20604f28312960202d20312073746f72616765207265616420616e642064656c6574696f6e2e202d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2042617365205765696768743a20382e36323620c2b573204e6f2044422052656164206f72205772697465206f7065726174696f6e7320626563617573652063616c6c657220697320616c726561647920696e206f7665726c6179204b696c6c20616c6c2073746f72616765206974656d7320776974682061206b657920746861742073746172747320776974682074686520676976656e207072656669782e202a2a4e4f54453a2a2a2057652072656c79206f6e2074686520526f6f74206f726967696e20746f2070726f7669646520757320746865206e756d626572206f66207375626b65797320756e6465722074686520707265666978207765206172652072656d6f76696e6720746f2061636375726174656c792063616c63756c6174652074686520776569676874206f6620746869732066756e6374696f6e2e202d20604f285029602077686572652060506020616d6f756e74206f66206b657973207769746820707265666978206070726566697860202d206050602073746f726167652064656c6574696f6e732e202d2042617365205765696768743a20302e383334202a205020c2b573202d205772697465733a204e756d626572206f66207375626b657973202b20317072656669785f7375626b657973204b696c6c20736f6d65206974656d732066726f6d2073746f726167652e202d20604f28494b296020776865726520604960206c656e677468206f6620606b6579736020616e6420604b60206c656e677468206f66206f6e65206b6579202d206049602073746f726167652064656c6574696f6e732e202d2042617365205765696768743a202e333738202a206920c2b573202d205772697465733a204e756d626572206f66206974656d736b6579735665633c4b65793e2053657420736f6d65206974656d73206f662073746f726167652e202d20604f2849296020776865726520604960206c656e677468206f6620606974656d7360202d206049602073746f72616765207772697465732028604f28312960292e202d2042617365205765696768743a20302e353638202a206920c2b5736974656d735665633c4b657956616c75653e2053657420746865206e6577206368616e676573207472696520636f6e66696775726174696f6e2e202d20312073746f72616765207772697465206f722064656c6574652028636f64656320604f28312960292e202d20312063616c6c20746f20606465706f7369745f6c6f67603a20557365732060617070656e6460204150492c20736f204f283129202d2042617365205765696768743a20372e32313820c2b573202d204442205765696768743a20202020202d205772697465733a204368616e67657320547269652c2053797374656d204469676573746368616e6765735f747269655f636f6e6669674f7074696f6e3c4368616e67657354726965436f6e66696775726174696f6e3e2053657420746865206e65772072756e74696d6520636f646520776974686f757420646f696e6720616e7920636865636b73206f662074686520676976656e2060636f6465602e202d20604f2843296020776865726520604360206c656e677468206f662060636f646560202d20312073746f726167652077726974652028636f64656320604f28432960292e202d2031206576656e742e2054686520776569676874206f6620746869732066756e6374696f6e20697320646570656e64656e74206f6e207468652072756e74696d652e2057652077696c6c207472656174207468697320617320612066756c6c20626c6f636b2e2053657420746865206e65772072756e74696d6520636f64652e202d20604f2843202b2053296020776865726520604360206c656e677468206f662060636f64656020616e642060536020636f6d706c6578697479206f66206063616e5f7365745f636f646560202d20312063616c6c20746f206063616e5f7365745f636f6465603a20604f28532960202863616c6c73206073705f696f3a3a6d6973633a3a72756e74696d655f76657273696f6e6020776869636820697320657870656e73697665292e2054686520776569676874206f6620746869732066756e6374696f6e20697320646570656e64656e74206f6e207468652072756e74696d652c206275742067656e6572616c6c792074686973206973207665727920657870656e736976652e2057652077696c6c207472656174207468697320617320612066756c6c20626c6f636b2e636f64652053657420746865206e756d626572206f6620706167657320696e2074686520576562417373656d626c7920656e7669726f6e6d656e74277320686561702e202d20312073746f726167652077726974652e202d2042617365205765696768743a20312e34303520c2b573202d203120777269746520746f20484541505f50414745537061676573204d616b6520736f6d65206f6e2d636861696e2072656d61726b2e202d2042617365205765696768743a20302e36363520c2b5732c20696e646570656e64656e74206f662072656d61726b206c656e6774682e202d204e6f204442206f7065726174696f6e732e5f72656d61726b204120646973706174636820746861742077696c6c2066696c6c2074686520626c6f636b2077656967687420757020746f2074686520676976656e20726174696f2e5f726174696f50657262696c6c00000000000000620911000700000001020000000000003aa311000c00000000000000501d1100250000000000000000000000000000000000000054e01100781d11000000000000000000881d110001000000000000000100000000000000901d11000e000000000000000000000068901100030000000000000000000000000000000000000000000000000000000000000054e01100a01d11000000000000000000b01d110001000000000000000000000000000000b81d11000b0000000000000000000000c31d1100190000000000000000000000000000000000000000000000000000000000000054e01100dc1d11000000000000000000ec1d110001000000000000000100000000000000f41d110010000000000000000000000068901100030000000000000000000000000000000000000000000000000000000000000054e01100041e11000000000000000000141e1100010000000000000000000000000000006909110009000000010500000000000020be11000e000000000000001c1e1100070000000000000000000000000000000000000054e01100241e11000000000000000000341e1100010000000000000001000000000000003c1e11000d0000000105000000000000689011000300000000000000ff7a1100070000000000000000000000000000000000000054e011004c1e110000000000000000005c1e110001000000000000000100000000000000ea09110006000000000000000000000020be11000e0000000000000000000000000000000000000000000000000000000000000054e01100641e11000000000000000000741e110001000000000000000100000000000000f60911000a00000000000000000000001c1e1100070000000000000000000000000000000000000000000000000000000000000054e011007c1e110000000000000000008c1e110001000000000000000100000000000000000a11000e00000000000000000000001c1e1100070000000000000000000000000000000000000000000000000000000000000054e01100941e11000000000000000000a41e110001000000000000000100000000000000f0091100060000000000000000000000ac1e11000b0000000000000000000000000000000000000000000000000000000000000054e01100b81e11000000000000000000c81e1100010000000000000001000000000000000e0a1100060000000000000000000000d01e1100230000000000000000000000000000000000000000000000000000000000000054e01100f41e11000000000000000000041f1100010000000000000001000000000000000c1f11000a0000000000000000000000161f11000a0000000000000000000000000000000000000000000000000000000000000054e01100201f11000000000000000000301f110001000000000000000100000000000000140a11000b00000001020000000000001c1e11000700000000000000381f1100210000000000000000000000000000000000000054e011005c1f110000000000000000006c1f11000a000000000000000100000000000000bc1f1100120000000000000000000000ce1f1100160000000000000000000000000000000000000000000000000000000000000054e01100e41f11000000000000000000f41f110001000000000000000000000000000000fc1f11000e00000000000000000000000a201100050000000000000000000000000000000000000000000000000000000000000054e01100102011000000000000000000202011000100000000000000000000004163636f756e74496e666f3c543a3a496e6465782c20543a3a4163636f756e74446174613e000000190000000000000001000000560000001b2511003a00000045787472696e736963436f756e74000019000000000000000100000032000000ed2411002e000000426c6f636b576569676874776569676874733a3a45787472696e7369637357656967687419000000000000000100000057000000cb24110022000000416c6c45787472696e736963734c656e190000000000000001000000320000007b24110050000000543a3a486173680019000000000000000100000058000000552411002600000045787472696e736963446174610000001900000000000000010000003f000000062411004f0000001900000000000000010000002e000000c42311004200000019000000000000000100000058000000a82311001c0000001900000000000000010000005800000063231100450000004469676573744f663c543e001900000000000000010000002f000000272311003c0000005665633c4576656e745265636f72643c543a3a4576656e742c20543a3a486173683e3e001900000000000000010000002f000000ff221100280000004576656e74436f756e744576656e74496e6465781900000000000000010000002e000000d12211002e0000005665633c28543a3a426c6f636b4e756d6265722c204576656e74496e646578293e000000190000000000000001000000590000009f20110049000000e82011002500000054e01100000000000d211100540000006121110051000000b22111003900000054e0110000000000eb211100530000003e2211005300000091221100400000004c61737452756e74696d65557067726164654c61737452756e74696d6555706772616465496e666f190000000000000001000000320000004a20110055000000457865637574696f6e50686173655068617365001900000000000000010000003200000028201100220000002054686520657865637574696f6e207068617365206f662074686520626c6f636b2e2053746f726573207468652060737065635f76657273696f6e6020616e642060737065635f6e616d6560206f66207768656e20746865206c6173742072756e74696d6520757067726164652068617070656e65642e204d617070696e67206265747765656e206120746f7069632028726570726573656e74656420627920543a3a486173682920616e64206120766563746f72206f6620696e6465786573206f66206576656e747320696e2074686520603c4576656e74733c543e3e60206c6973742e20416c6c20746f70696320766563746f727320686176652064657465726d696e69737469632073746f72616765206c6f636174696f6e7320646570656e64696e67206f6e2074686520746f7069632e205468697320616c6c6f7773206c696768742d636c69656e747320746f206c6576657261676520746865206368616e67657320747269652073746f7261676520747261636b696e67206d656368616e69736d20616e6420696e2063617365206f66206368616e67657320666574636820746865206c697374206f66206576656e7473206f6620696e7465726573742e205468652076616c756520686173207468652074797065206028543a3a426c6f636b4e756d6265722c204576656e74496e646578296020626563617573652069662077652075736564206f6e6c79206a7573742074686520604576656e74496e64657860207468656e20696e20636173652069662074686520746f70696320686173207468652073616d6520636f6e74656e7473206f6e20746865206e65787420626c6f636b206e6f206e6f74696669636174696f6e2077696c6c20626520747269676765726564207468757320746865206576656e74206d69676874206265206c6f73742e20546865206e756d626572206f66206576656e747320696e2074686520604576656e74733c543e60206c6973742e204576656e7473206465706f736974656420666f72207468652063757272656e7420626c6f636b2e20446967657374206f66207468652063757272656e7420626c6f636b2c20616c736f2070617274206f662074686520626c6f636b206865616465722e2045787472696e7369637320726f6f74206f66207468652063757272656e7420626c6f636b2c20616c736f2070617274206f662074686520626c6f636b206865616465722e2048617368206f66207468652070726576696f757320626c6f636b2e205468652063757272656e7420626c6f636b206e756d626572206265696e672070726f6365737365642e205365742062792060657865637574655f626c6f636b602e2045787472696e73696373206461746120666f72207468652063757272656e7420626c6f636b20286d61707320616e2065787472696e736963277320696e64657820746f206974732064617461292e204d6170206f6620626c6f636b206e756d6265727320746f20626c6f636b206861736865732e20546f74616c206c656e6774682028696e2062797465732920666f7220616c6c2065787472696e736963732070757420746f6765746865722c20666f72207468652063757272656e7420626c6f636b2e205468652063757272656e742077656967687420666f722074686520626c6f636b2e20546f74616c2065787472696e7369637320636f756e7420666f72207468652063757272656e7420626c6f636b2e205468652066756c6c206163636f756e7420696e666f726d6174696f6e20666f72206120706172746963756c6172206163636f756e742049442e00000000000000a82611000e0000000000000020be11000e0000000000000054e01100b82611000000000000000000c8261100010000000000000000000000d0261100120000000000000089611100060000000000000054e01100e42611000000000000000000f4261100010000000000000000000000fc2611000800000000000000042711000f0000000000000054e01100142711000000000000000000242711000100000000000000000000002c271100140000000000000089611100060000000000000054e011004027110000000000000000005027110001000000000000000000000058271100130000000000000089611100060000000000000054e011006c27110000000000000000007c27110001000000000000000000000084271100120000000000000068901100030000000000000054e01100982711000000000000000000a82711000100000000000000426c6f636b48617368436f756e7400001900000000000000010000005a000000ed281100360000004d6178696d756d426c6f636b57656967687400001900000000000000010000005b000000ce2811001f000000446257656967687452756e74696d654462576569676874001900000000000000010000005c0000008c28110042000000426c6f636b457865637574696f6e5765696768741900000000000000010000005d000000382811005400000045787472696e73696342617365576569676874001900000000000000010000005e000000da2711005e0000004d6178696d756d426c6f636b4c656e67746800001900000000000000010000005f000000b02711002a00000020546865206d6178696d756d206c656e677468206f66206120626c6f636b2028696e206279746573292e20546865206261736520776569676874206f6620616e2045787472696e73696320696e2074686520626c6f636b2c20696e646570656e64656e74206f6620746865206f662065787472696e736963206265696e672065786563757465642e20546865206261736520776569676874206f6620657865637574696e67206120626c6f636b2c20696e646570656e64656e74206f6620746865207472616e73616374696f6e7320696e2074686520626c6f636b2e2054686520776569676874206f662072756e74696d65206461746162617365206f7065726174696f6e73207468652072756e74696d652063616e20696e766f6b652e20546865206d6178696d756d20776569676874206f66206120626c6f636b2e20546865206d6178696d756d206e756d626572206f6620626c6f636b7320746f20616c6c6f7720696e206d6f7274616c20657261732e4e6f646520697320636f6e6669677572656420746f20757365207468652073616d6520686173683b20716564001900000000000000010000001d000000802911005d0000001f0400000e000000802911005d00000027040000160000002f686f6d652f6261737469616e2f2e636172676f2f6769742f636865636b6f7574732f7375627374726174652d376530383433336434633337306132312f383730363363332f6672616d652f73797374656d2f7372632f6c69622e727300000000000000bc2a11001000000000000000cc2a1100010000000000000000000000d42a1100010000000000000000000000dc2a11000f00000000000000ec2a1100020000000000000000000000fc2a1100010000000000000000000000042b11000b0000000000000054e01100000000000000000000000000102b1100010000000000000000000000182b11000a00000000000000c8621100010000000000000000000000242b11000100000000000000000000002c2b11000d00000000000000c86211000100000000000000000000003c2b1100010000000000000045787472696e73696353756363657373b22b11000c000000be2b11002c00000045787472696e7369634661696c65640018d911000d000000b22b11000c0000008f2b110023000000436f646555706461746564007a2b1100150000004e65774163636f756e7400005d2b11001d0000004b696c6c65644163636f756e74000000442b11001900000020416e205b6163636f756e745d20776173207265617065642e2041206e6577205b6163636f756e745d2077617320637265617465642e20603a636f6465602077617320757064617465642e20416e2065787472696e736963206661696c65642e205b6572726f722c20696e666f5d4469737061746368496e666f20416e2065787472696e73696320636f6d706c65746564207375636365737366756c6c792e205b696e666f5d617373657274696f6e206661696c65643a2073656c662e6361702829203d3d206f6c645f636170202a203200000098db110067000000700000002e00000098db1100670000008f0000003400000098db110067000000680000003400000000000000bc0911000f00000000000000d42c1100020000000000000000000000a20911001a00000000000000e42c1100020000000000000000000000850911001d00000000000000f42c11000300000000000000000000007209110013000000000000000c2d1100010000000000000000000000cb0911000f00000000000000142d110001000000000000008f2e1100450000007a2e110015000000292e1100510000007a2e110015000000aa2d11003c00000054e0110000000000e62d1100430000006a2d1100400000001c2d11004e0000002054686572652069732061206e6f6e2d7a65726f207265666572656e636520636f756e742070726576656e74696e6720746865206163636f756e742066726f6d206265696e67207075726765642e20537569636964652063616c6c6564207768656e20746865206163636f756e7420686173206e6f6e2d64656661756c7420636f6d706f7369746520646174612e204661696c656420746f2065787472616374207468652072756e74696d652076657273696f6e2066726f6d20746865206e65772072756e74696d652e204569746865722063616c6c696e672060436f72655f76657273696f6e60206f72206465636f64696e67206052756e74696d6556657273696f6e60206661696c65642e205468652073706563696669636174696f6e2076657273696f6e206973206e6f7420616c6c6f77656420746f206465637265617365206265747765656e207468652063757272656e742072756e74696d6520616e6420746865206e65772072756e74696d652e20546865206e616d65206f662073706563696669636174696f6e20646f6573206e6f74206d61746368206265747765656e207468652063757272656e742072756e74696d65617373657274696f6e206661696c65643a206d6964203c3d206c656e002f11008f000000680900000e0000002f6e69782f73746f72652f39357734373162393862373934323470796c393364347a37686a6735693931372d727573742d312e34362e302d6e696768746c792d323032302d30362d33302d3136393537626434642f6c69622f727573746c69622f7372632f727573742f7372632f6c6962616c6c6f632f636f6c6c656374696f6e732f7665635f64657175652e72730098db110067000000d30000001100000098db110067000000d8000000090000003a6865617070616765733a636f64653a6368616e6765735f74726965e62f11003c00000073797374656d6672616d655f73797374656d5741524e494e473a205265666572656e636564206163636f756e742064656c657465642e20546869732069732070726f6261626c792061206275672e6e6577686561647350617261636861696e20686561647320636f756c64206e6f74206265206465636f6465642e0019000000080000000400000040000000bc30110047000000020600000e0000004e6f2070617261636861696e20686561647320666f756e6420696e20696e686572656e7420646174612e0000bc30110047000000030600000e000000bc301100470000001e0500002b0000002f686f6d652f6261737469616e2f70726f6a656374732f7061726974792f706f6c6b61646f742f72756e74696d652f636f6d6d6f6e2f7372632f70617261636861696e732e727376616c696461746f725f726f6c655f7061697273003831110082000000ff01000023000000383111008200000000020000230000002f6e69782f73746f72652f39357734373162393862373934323470796c393364347a37686a6735693931372d727573742d312e34362e302d6e696768746c792d323032302d30362d33302d3136393537626434642f6c69622f727573746c69622f7372632f727573742f7372632f6c6962636f72652f736c6963652f6d6f642e727373656e645f78636d705f6d6573736167657472616e736665725f746f5f70617261636861696e7265706f72745f646f75626c655f766f74657365745f686561647300000000002c34110012000000000000004034110001000000000000000000000048341100150000000000000060341100010000000000000000000000683411000f000000000000007834110001000000000000000000000080341100100000000000000090341100010000000000000000000000983411000f00000000000000a8341100010000000000000000000000b03411000900000000000000bc341100010000000000000000000000c43411001400000000000000d8341100010000000000000000000000e03411001000000000000000f0341100010000000000000000000000f8341100160000000000000010351100010000000000000000000000183511001700000000000000303511000100000000000000000000003835110017000000000000005035110001000000000000000000000058351100100000000000000068351100010000000000000000000000703511000d0000000000000080351100010000000000000000000000883511000e0000000000000098351100010000000000000000000000a03511001000000000000000b0351100010000000000000000000000b83511001600000000000000d0351100010000000000000000000000d83511001500000000000000f0351100010000000000000000000000f83511000d000000000000000836110001000000000000000000000010361100150000000000000028361100010000000000000000000000303611001800000000000000483611000100000000000000546f6f4d616e79486561645570646174657300008439110038000000546f6f4d616e795061726143616e64696461746573000000653911001f00000048656164734f75744f664f72646572001b3911004a000000556e7265676973746572656450617261ef3811002c000000496e76616c6964436f6c6c61746f7200dd38110012000000517565756546756c6c0000009638110047000000496e76616c69644d6573736167654f726967696e773811001f0000004e6f56616c696461746f7247726f757055381100220000004e6f74456e6f75676856616c6964697479566f74657300002c38110029000000566f74657345786365656473417574686f72697469657300ee3711003e00000057726f6e6756616c696461746f72417474657374696e6700b537110039000000496e76616c69645369676e61747572659437110021000000556e746167676564566f7465730000006037110034000000506172656e744d69736d61746368000037371100290000004865616444617461546f6f4c617267651e3711001900000056616c69646174696f6e436f6465546f6f4c617267650000fb36110023000000446973616c6c6f776564436f646555706772616465000000e23611001900000043616e6e6f7450617946656573000000b33611002f000000556e657870656374656452656c6179506172656e740000008236110031000000446f776e776172644d657373616765517565756546756c6c503611003200000020446f776e77617264206d6573736167652071756575652069732066756c6c20666f72207468652050617261636861696e2e20556e65787065637465642072656c61792d706172656e7420666f7220612063616e64696461746520726563656970742e205061726120646f6573206e6f74206861766520656e6f7567682062616c616e636520746f2070617920666565732e20446973616c6c6f77656420636f646520757067726164652e204e65772076616c69646174696f6e20636f64652077617320746f6f206c617267652e204865616420646174612077617320746f6f206c617267652e2057726f6e6720706172656e74206865616420666f722070617261636861696e20726563656970742e20457874726120756e7461676765642076616c696469747920766f74657320616c6f6e6720776974682063616e6469646174652e20496e76616c6964207369676e61747572652066726f6d2061747465737465722e20417474657374696e672076616c696461746f72206e6f74206f6e207468697320636861696e27732076616c69646174696f6e20647574792e20546865206e756d626572206f66206174746573746174696f6e73206578636565647320746865206e756d626572206f6620617574686f7269746965732e204e6f7420656e6f7567682076616c696469747920766f74657320666f722063616e6469646174652e204e6f2076616c696461746f722067726f757020666f722070617261636861696e2e20546865206d657373616765206f726967696e20697320696e76616c69642e20546865206d6573736167652071756575652069732066756c6c2e204d657373616765732077696c6c206265206164646564207768656e2074686572652069732073706163652e20496e76616c696420636f6c6c61746f722e2043616e64696461746520697320666f7220616e20756e726567697374657265642070617261636861696e2e2050726f706f736564206865616473206d75737420626520617363656e64696e67206f726465722062792070617261636861696e20494420776974686f7574206475706c69636174652e20546f6f206d616e792070617261636861696e2063616e646964617465732e2050617261636861696e206865616473206d7573742062652075706461746564206f6e6c79206f6e636520696e2074686520626c6f636b2e7672662d6e6d2d706b436865636b4d6f7274616c6974794368617267655472616e73616374696f6e5061796d656e7456616c6964617465446f75626c65566f74655265706f727473bc301100470000006f0600003500000054696d657374616d70206d7573742062652075706461746564206f6e636520696e2074686520626c6f636b50617261636861696e206865616473206d7573742062652075706461746564206f6e636520696e2074686520626c6f636b803a11002e000000ae3a11000d0000004552524f523a2072657475726e6564206e6578745f6b657920686173206e6f2076616c75653a0a6b6579206973200a6e6578745f6b65792069732050617374436f64655072756e696e6750617374436f646550617374436f64654d657461496e76616c69642f6f75746461746564206b6579206f776e6572736869702070726f6f662e4661696c656420746f207265706f7274206f6666656e6365446f776e776172644d65737361676551756575656f7264657265645f6e656564735f646973706174636820636f6e7461696e732069643f2100bc301100470000004c0400001d000000467574757265436f64655570677261646573000000000000d03b11000500000000000000d83b1100010000000000000000000000f03b1100140000000000000000000000903c11000d00000000000000a03c1100020000000000000000000000d03c110012000000000000006261746368000000000000007e42110005000000000000008342110017000000953f11002000000054e0110000000000b53f11001f00000054e0110000000000d43f11003c00000054e01100000000001040110058000000684011003200000054e0110000000000a9a211000b0000009a40110024000000be4011002e000000ec4011003100000027a311000c00000054e01100000000001d41110056000000734111004d000000c04111005600000016421100540000006a4211001400000061735f64657269766174697665000000000000005ca31100050000000000000061a3110003000000000000006aab110004000000000000006eab110017000000603d11003800000054e0110000000000983d110056000000ee3d11003000000054e01100000000001e3e110052000000703e110059000000c93e1100550000001e3f11002000000054e01100000000003e3f11003e00000054e0110000000000b8a611003400000054e0110000000000a9a211000b0000007c3f11001900000022ab11002000000027a311000c0000002053656e6420612063616c6c207468726f75676820616e20696e64657865642070736575646f6e796d206f66207468652073656e6465722e2046696c7465722066726f6d206f726967696e206172652070617373656420616c6f6e672e205468652063616c6c2077696c6c2062652064697370617463686564207769746820616e206f726967696e20776869636820757365207468652073616d652066696c74657220617320746865206f726967696e206f6620746869732063616c6c2e204e4f54453a20496620796f75206e65656420746f20656e73757265207468617420616e79206163636f756e742d62617365642066696c746572696e67206973206e6f7420686f6e6f7265642028692e652e206265636175736520796f7520657870656374206070726f78796020746f2068617665206265656e2075736564207072696f7220696e207468652063616c6c20737461636b20616e6420796f7520646f206e6f742077616e74207468652063616c6c207265737472696374696f6e7320746f206170706c7920746f20616e79207375622d6163636f756e7473292c207468656e20757365206061735f6d756c74695f7468726573686f6c645f316020696e20746865204d756c74697369672070616c6c657420696e73746561642e204e4f54453a205072696f7220746f2076657273696f6e202a31322c2074686973207761732063616c6c6564206061735f6c696d697465645f737562602e202d2042617365207765696768743a20322e38363120c2b5732053656e642061206261746368206f662064697370617463682063616c6c732e204d61792062652063616c6c65642066726f6d20616e79206f726967696e2e202d206063616c6c73603a205468652063616c6c7320746f20626520646973706174636865642066726f6d207468652073616d65206f726967696e2e204966206f726967696e20697320726f6f74207468656e2063616c6c2061726520646973706174636820776974686f757420636865636b696e67206f726967696e2066696c7465722e20285468697320696e636c7564657320627970617373696e6720606672616d655f73797374656d3a3a54726169743a3a4261736543616c6c46696c74657260292e202d2042617365207765696768743a2031342e3339202b202e393837202a206320c2b573202d20506c7573207468652073756d206f66207468652077656967687473206f6620746865206063616c6c73602e202d20506c7573206f6e65206164646974696f6e616c206576656e742e202872657065617420726561642f77726974652920546869732077696c6c2072657475726e20604f6b6020696e20616c6c2063697263756d7374616e6365732e20546f2064657465726d696e65207468652073756363657373206f66207468652062617463682c20616e206576656e74206973206465706f73697465642e20496620612063616c6c206661696c656420616e64207468652062617463682077617320696e7465727275707465642c207468656e2074686520604261746368496e74657272757074656460206576656e74206973206465706f73697465642c20616c6f6e67207769746820746865206e756d626572206f66207375636365737366756c2063616c6c73206d61646520616e6420746865206572726f72206f6620746865206661696c65642063616c6c2e20496620616c6c2077657265207375636365737366756c2c207468656e2074686520604261746368436f6d706c6574656460206576656e74206973206465706f73697465642e63616c6c735665633c3c542061732054726169743e3a3a43616c6c3e000000000000c84211000300000000000000cc421100010000000000000000000000e4421100120000000000000073657400000000003a46110003000000000000003d46110012000000744311001600000054e01100000000008a43110056000000e04311003600000054e01100000000001644110051000000674411001100000054e0110000000000784411003600000054e0110000000000a9a211000b000000ae44110034000000e2441100680000004a4511002d000000774511002a000000a145110060000000014611003900000027a311000c00000020536574207468652063757272656e742074696d652e20546869732063616c6c2073686f756c6420626520696e766f6b65642065786163746c79206f6e63652070657220626c6f636b2e2049742077696c6c2070616e6963206174207468652066696e616c697a6174696f6e2070686173652c20696620746869732063616c6c206861736e2774206265656e20696e766f6b656420627920746861742074696d652e205468652074696d657374616d702073686f756c642062652067726561746572207468616e207468652070726576696f7573206f6e652062792074686520616d6f756e742073706563696669656420627920604d696e696d756d506572696f64602e20546865206469737061746368206f726967696e20666f7220746869732063616c6c206d7573742062652060496e686572656e74602e202d20604f285429602077686572652060546020636f6d706c6578697479206f6620606f6e5f74696d657374616d705f73657460202d20312073746f72616765207265616420616e6420312073746f72616765206d75746174696f6e2028636f64656320604f28312960292e202862656361757365206f6620604469645570646174653a3a74616b656020696e20606f6e5f66696e616c697a656029202d2031206576656e742068616e646c657220606f6e5f74696d657374616d705f7365746020604f285429602e202d2042656e63686d61726b3a20372e36373820286d696e207371756172657320616e616c79736973292020202d204e4f54453a20546869732062656e63686d61726b2077617320646f6e6520666f7220612072756e74696d65207769746820696e7369676e69666963616e7420606f6e5f74696d657374616d705f736574602068616e646c6572732e20202020204e65772062656e63686d61726b696e67206973206e6565646564207768656e20616464696e67206e65772068616e646c6572732e6e6f77436f6d706163743c543a3a4d6f6d656e743e000000000000471100030000000000000000000000c9971100090000000000000000000000000000000000000000000000000000000000000054e01100044711000000000000000000144711000100000000000000010000000000000054b311000900000000000000000000006bbe1100040000000000000000000000000000000000000000000000000000000000000054e011001c47110000000000000000002c4711000100000000000000010000004e6f770019000000000000000100000060000000614711002400000019000000000000000100000032000000344711002d00000020446964207468652074696d657374616d7020676574207570646174656420696e207468697320626c6f636b3f2043757272656e742074696d6520666f72207468652063757272656e7420626c6f636b2e00000000000000c04711000d00000000000000c9971100090000000000000054e01100d04711000000000000000000e047110004000000000000004d696e696d756d506572696f6400000019000000000000000100000061000000004811005a0000005a4811005a000000b4481100590000000d4911001c00000020546865206d696e696d756d20706572696f64206265747765656e20626c6f636b732e204265776172652074686174207468697320697320646966666572656e7420746f20746865202a65787065637465642a20706572696f6420746861742074686520626c6f636b2070726f64756374696f6e206170706172617475732070726f76696465732e20596f75722063686f73656e20636f6e73656e7375732073797374656d2077696c6c2067656e6572616c6c7920776f726b2077697468207468697320746f2064657465726d696e6520612073656e7369626c6520626c6f636b2074696d652e20652e672e20466f7220417572612c2069742077696c6c20626520646f75626c65207468697320706572696f64206f6e2064656661756c742073657474696e67732e00000000000000f23111000900000000000000dc49110001000000000000000000000084b11100010000000000000000000000e03111001200000000000000f44911000100000000000000000000000c4a1100040000000000000000000000cb31110015000000000000002c4a1100030000000000000000000000744a1100010000000000000000000000ba31110011000000000000007c4a1100020000000000000000000000ac4a1100030000000000000000000000a14c11000500000000000000a64c11001600000000000000284c110006000000000000002e4c110073000000924b11004000000054e0110000000000d24b110046000000184c11001000000000000000164b11000200000000000000184b11000600000000000000794b110006000000000000007f4b11000700000000000000864b110006000000000000008c4b110006000000214b11005800000000000000164b11000200000000000000184b110006000000000000001e4b11000300000000000000ff7a110007000000c44a11002c00000054e0110000000000f04a1100260000002053656e6420612058434d50206d65737361676520746f2074686520676976656e2070617261636861696e2e20546865206f726967696e206d75737420626520616e6f746865722070617261636861696e2e746f5061726149646d7367205472616e7366657220736f6d6520746f6b656e7320696e746f20612070617261636861696e20616e64206c656176652061206d65737361676520696e2074686520646f776e7761726420717565756520666f722069742e616d6f756e7442616c616e636572656d61726b52656d61726b2050726f7669646520612070726f6f66207468617420736f6d652076616c696461746f722068617320636f6d6d69746564206120646f75626c652d766f74652e205468652077656967687420697320303b20696e206f7264657220746f2061766f696420446f53206120605369676e6564457874656e73696f6e602076616c69646174696f6e20697320696d706c656d656e7465642e7265706f7274446f75626c65566f74655265706f72743c3c543a3a4b65794f776e657250726f6f6653797374656d2061730a20202020202020202020202020202020204b65794f776e657250726f6f6653797374656d3c284b65795479706549642c2056616c696461746f724964293e3e3a3a50726f6f663e68656164735665633c417474657374656443616e6469646174653e00000000dc8e11000b000000000000000000000034511100100000000000000000000000000000000000000000000000000000000000000054e0110044511100000000000000000054511100010000000000000001000000000000005c511100040000000105000000000000184b11000600000000000000605111000e0000000000000000000000000000000000000054e011007051110000000000000000008051110001000000000000000000000000000000d23a11000c0000000105000000000000184b1100060000000000000088511100200000000000000000000000000000000000000054e01100a85111000000000000000000b851110003000000000000000100000000000000ca3a1100080000000105000000000000d05111001800000000000000605111000e0000000000000000000000000000000000000054e01100e85111000000000000000000f851110002000000000000000000000000000000bb3a11000f0000000000000000000000085211001d0000000000000000000000000000000000000000000000000000000000000054e011002852110000000000000000003852110001000000000000000100000000000000643b1100120000000105000000000000184b1100060000000000000020be11000e0000000000000000000000000000000000000054e0110040521100000000000000000054e0110000000000000000000000000000000000505211000a0000000105000000000000184b11000600000000000000605111000e0000000000000000000000000000000000000054e011005c521100000000000000000054e01100000000000000000001000000000000006c521100050000000105000000000000184b1100060000000000000071521100080000000000000000000000000000000000000054e011007c52110000000000000000008c5211000100000000000000000000000000000094521100120000000105000000000000184b11000600000000000000a6521100120000000000000000000000000000000000000054e01100b85211000000000000000000c852110002000000000000000100000000000000d8521100160000000105000000000000184b11000600000000000000ee5211000a0000000000000000000000000000000000000054e01100f852110000000000000000000853110003000000000000000100000000000000205311000d00000000000000000000002d5311000b0000000000000000000000000000000000000000000000000000000000000054e01100385311000000000000000000485311000100000000000000010000000000000054b311000900000000000000000000002d5311000b0000000000000000000000000000000000000000000000000000000000000054e0110050531100000000000000000060531100040000000000000000000000000000001b3b1100140000000105000000000000184b1100060000000000000080531100220000000000000000000000000000000000000054e01100a45311000000000000000000b45311000100000000000000010000005665633c56616c696461746f7249643e190000000000000001000000620000001d58110025000000436f646556616c69646174696f6e436f6465000019000000000000000100000032000000e8571100350000005061726150617374436f64654d6574613c543a3a426c6f636b4e756d6265723e1900000000000000010000006300000027571100520000007957110052000000cb5711001d000000285061726149642c20543a3a426c6f636b4e756d6265722919000000000000000100000032000000c85611004e00000016571100110000005665633c285061726149642c20543a3a426c6f636b4e756d626572293e0000001900000000000000010000002f0000009f5611002900000019000000000000000100000032000000467574757265436f646500001900000000000000010000006400000048656164734865616444617461000000190000000000000001000000320000006c5611003300000052656c6179446973706174636851756575655665633c5570776172644d6573736167653e1900000000000000010000002f000000f3551100470000003a5611003200000052656c61794469737061746368517565756553697a65287533322c2075333229190000000000000001000000650000000d551100510000005e55110056000000b45511003f0000004e6565647344697370617463685665633c5061726149643e1900000000000000010000002d000000c9541100440000001900000000000000010000003200000006541100560000005c5411005200000054e0110000000000ae5411001b0000005665633c446f776e776172644d6573736167653c543a3a4163636f756e7449643e3e00001900000000000000010000002f000000bc5311004a000000204d657373616765732077616974696e6720746f2062652064656c6976657265642066726f6d207468652052656c617920636861696e20696e746f207468652070617261636861696e2e2060536f6d6560206966207468652070617261636861696e20686561647320676574207570646174656420696e207468697320626c6f636b2c20616c6f6e672077697468207468652070617261636861696e20494473207468617420646964207570646174652e204f72646572656420696e207468652073616d652077617920617320607265676973747261723a3a416374697665602028692e652e20627920506172614964292e20604e6f6e6560206966206e6f742079657420757064617465642e20546865206f726465726564206c697374206f662050617261496473207468617420686176652061206052656c6179446973706174636851756575656020656e7472792e2053697a65206f6620746865206469737061746368207175657565732e205365706172617465642066726f6d2061637475616c206461746120696e206f7264657220746f2061766f696420636f73746c79206465636f64696e67207768656e20636865636b696e6720726563656970742076616c69646974792e204669727374206974656d20696e207475706c652069732074686520636f756e74206f66206d65737361676573207365636f6e642069662074686520746f74616c206c656e6774682028696e20627974657329206f6620746865206d657373616765207061796c6f6164732e204d6573736167657320726561647920746f2062652064697370617463686564206f6e746f207468652072656c617920636861696e2e204974206973207375626a65637420746f20604d41585f4d4553534147455f434f554e546020616e64206057415445524d41524b5f4d4553534147455f53495a45602e20546865206865616473206f66207468652070617261636861696e7320726567697374657265642061742070726573656e742e205061737420636f6465207072756e696e672c20696e206f72646572206f66207072696f726974792e2041637475616c207061737420636f64652c20696e64696361746564206279207468652070617261636861696e20616e642074686520626c6f636b206e756d62657220617420776869636820697420626563616d65206f757464617465642e205061737420636f6465206f662070617261636861696e732e205468652070617261636861696e73207468656d73656c766573206d6179206e6f74206265207265676973746572656420616e796d6f72652c2062757420776520616c736f206b65657020746865697220636f6465206f6e2d636861696e20666f72207468652073616d6520616d6f756e74206f662074696d65206173206f7574646174656420636f646520746f20617373697374207769746820617661696c6162696c6974792e205468652061637469766520636f6465206f6620612063757272656e746c792d726567697374657265642070617261636861696e2e20416c6c20617574686f72697469657327206b65797320617420746865206d6f6d656e742e000000000000f4581100110000000000000000000000055911000a0000000000000000000000000000000000000000000000000000000000000054e0110010591100000000000000000054e0110000000000000000000100000000000000205911000e00000000000000000000002e591100080000000000000000000000000000000000000000000000000000000000000054e0110038591100000000000000000054e011000000000000000000010000004e6578744665654d756c7469706c6965724d756c7469706c696572001900000000000000010000006600000053746f7261676556657273696f6e52656c656173657300001900000000000000010000005300000000000000b859110012000000000000008cad11000c0000000000000054e01100cc5911000000000000000000dc591100010000000000000000000000e45911000b00000000000000ef591100290000000000000054e01100185a11000000000000000000285a110001000000000000005472616e73616374696f6e42797465466565000019000000000000000100000067000000735a110043000000576569676874546f4665655665633c576569676874546f466565436f656666696369656e743c42616c616e63654f663c543e3e3e19000000000000000100000068000000305a1100430000002054686520706f6c796e6f6d69616c2074686174206973206170706c69656420696e206f7264657220746f20646572697665206665652066726f6d207765696768742e205468652066656520746f206265207061696420666f72206d616b696e672061207472616e73616374696f6e3b20746865207065722d6279746520706f7274696f6e2e0000bc3011004700000061040000220000000000000000000000617474656d707420746f20646976696465206279207a65726f000000bc30110047000000600400001b00000054696d657374616d7020746f6f2066617220696e2066757475726520746f206163636570744765747320616e64206465636f6465732074696d657374616d7020696e686572656e7420646174610000006900000010000000040000006a0000006c5b110060000000f70000000e0000002f686f6d652f6261737469616e2f2e636172676f2f6769742f636865636b6f7574732f7375627374726174652d376530383433336434633337306132312f383730363363332f6672616d652f74696d657374616d702f7372632f6c69622e72736d6f646c70792f7574696c697375626154696d657374616d70206d7573742062652075706461746564206f6e6c79206f6e636520696e2074686520626c6f636b54696d657374616d70206d75737420696e6372656d656e74206279206174206c65617374203c4d696e696d756d506572696f643e206265747765656e2073657175656e7469616c20626c6f636b73417574686f72556e636c6573526571756972655375646f00000000000000245d11000400000000000000285d1100010000000000000000000000405d11000a0000000000000000000000905d11001500000000000000a85d1100020000000000000000000000d85d11000a0000000000000000000000285e11000700000000000000305e1100010000000000000000000000485e1100090000000000000000000000905e11000700000000000000985e1100020000000000000000000000c85e11000b000000000000007375646f000000006aab110004000000000000006eab110017000000876011004e00000054e0110000000000b8a611003400000054e0110000000000a9a211000b000000855f1100080000008d5f110019000000a65f110018000000be5f11003200000027a311000c0000007375646f5f756e636865636b65645f776569676874000000000000006aab110004000000000000006eab110017000000000000008261110007000000000000008961110006000000876011004e000000d56011004c000000216111002d00000054e0110000000000b8a611003400000054e0110000000000a9a211000b000000855f1100080000004e6111003400000027a311000c0000007365745f6b65790000000000846011000300000000000000f35f110023000000166011005d00000054e0110000000000b8a611003400000054e0110000000000a9a211000b000000855f1100080000008d5f110019000000736011001100000027a311000c0000007375646f5f61730000000000f05f11000300000000000000f35f110023000000000000006aab110004000000000000006eab110017000000205f110054000000745f11001100000054e0110000000000b8a611003400000054e0110000000000a9a211000b000000855f1100080000008d5f110019000000a65f110018000000be5f11003200000027a311000c0000002041757468656e7469636174657320746865207375646f206b657920616e64206469737061746368657320612066756e6374696f6e2063616c6c207769746820605369676e656460206f726967696e2066726f6d206120676976656e206163636f756e742e202d204f2831292e202d204c696d697465642073746f726167652072656164732e202d204f6e6520444220777269746520286576656e74292e202d20576569676874206f662064657269766174697665206063616c6c6020657865637574696f6e202b2031302c3030302e77686f3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263652041757468656e74696361746573207468652063757272656e74207375646f206b657920616e6420736574732074686520676976656e204163636f756e7449642028606e6577602920617320746865206e6577207375646f206b65792e202d204f6e65204442206368616e67652e6e65772041757468656e7469636174657320746865207375646f206b657920616e64206469737061746368657320612066756e6374696f6e2063616c6c20776974682060526f6f7460206f726967696e2e20546869732066756e6374696f6e20646f6573206e6f7420636865636b2074686520776569676874206f66207468652063616c6c2c20616e6420696e737465616420616c6c6f777320746865205375646f207573657220746f20737065636966792074686520776569676874206f66207468652063616c6c2e202d2054686520776569676874206f6620746869732063616c6c20697320646566696e6564206279207468652063616c6c65722e5f7765696768745765696768740000000000e86111000300000000000000000000003aa311000c0000000000000000000000000000000000000000000000000000000000000054e01100ec6111000000000000000000fc6111000100000000000000010000004b6579001900000000000000010000003300000004621100210000002054686520604163636f756e74496460206f6620746865207375646f206b65792e00000000000000ac621100050000000000000018af1100010000000000000000000000b4621100010000000000000000000000bc6211000a00000000000000c8621100010000000000000000000000d0621100010000000000000000000000d86211000a00000000000000e4621100010000000000000000000000b4621100010000000000000053756469640000002a631100210000004b65794368616e6765640000fbaf110009000000ec6211003e0000005375646f4173446f6e6500006bbe11000400000020546865205b7375646f65725d206a757374207377697463686564206964656e746974793b20746865206f6c64206b657920697320737570706c6965642e2041207375646f206a75737420746f6f6b20706c6163652e205b726573756c745d556e636c65416c7265616479496e636c75646564546f6f48696768556e636c6547656e65736973556e636c65546f6f4d616e79556e636c6573556e636c6573416c7265616479536574496e76616c6964556e636c65506172656e744f6c64556e636c65000000000000dc6311000a00000000000000e86311000100000000000000000000000064110001000000000000007365745f756e636c6573000000000000216411000a000000000000002b6411000e00000008641100190000002050726f76696465206120736574206f6620756e636c65732e6e65775f756e636c65735665633c543a3a4865616465723e00000000000000605c1100060000000000000000000000446511003a0000000000000000000000000000000000000000000000000000000000000054e0110080651100000000000000000090651100010000000000000001000000000000005a5c11000600000000000000000000003aa311000c0000000000000000000000000000000000000000000000000000000000000054e01100986511000000000000000000a865110001000000000000000000000000000000b06511000c00000000000000000000006bbe1100040000000000000000000000000000000000000000000000000000000000000054e01100bc6511000000000000000000cc6511000100000000000000010000005665633c556e636c65456e7472794974656d3c543a3a426c6f636b4e756d6265722c20543a3a486173682c20543a3a4163636f756e7449643e3e00001900000000000000010000006b0000001c66110007000000190000000000000001000000320000000366110019000000446964536574556e636c657319000000000000000100000032000000d46511002f000000205768657468657220756e636c6573207765726520616c72656164792073657420696e207468697320626c6f636b2e20417574686f72206f662063757272656e7420626c6f636b2e20556e636c657300a46611007f000000c803000022000000a46611007f0000001c0300001e000000a46611007f000000e403000015000000a46611007f000000f20300001e000000a46611007f000000fb03000018000000a46611007f000000fc03000019000000a46611007f000000ff0300001a000000a46611007f000000050400000d0000002f6e69782f73746f72652f39357734373162393862373934323470796c393364347a37686a6735693931372d727573742d312e34362e302d6e696768746c792d323032302d30362d33302d3136393537626434642f6c69622f727573746c69622f7372632f727573742f7372632f6c6962616c6c6f632f736c6963652e72730000000000665c11000b0000000000000040671100010000000000000048671100200000002053656e646572206d75737420626520746865205375646f206163636f756e74000000009463110012000000000000002c68110001000000000000000000000084631100100000000000000034681100010000000000000000000000776311000d000000000000003c6811000100000000000000000000006b6311000c00000000000000446811000100000000000000000000005f6311000c000000000000004c6811000100000000000000000000004b631100140000000000000054681100010000000000000000000000a663110008000000000000005c68110001000000000000001969110023000000f868110021000000e768110011000000d168110016000000b168110020000000926811001f000000646811002e0000002054686520756e636c652069736e277420726563656e7420656e6f75676820746f20626520696e636c756465642e2054686520756e636c6520697320616c726561647920696e636c756465642e2054686520756e636c6520697320746f6f206869676820696e20636861696e2e2054686520756e636c652069732067656e657369732e20546f6f206d616e7920756e636c65732e20556e636c657320616c72656164792073657420696e2074686520626c6f636b2e2054686520756e636c6520706172656e74206e6f7420696e2074686520636861696e2e4b657973417574686f726564426c6f636b732f686f6d652f6261737469616e2f2e636172676f2f6769742f636865636b6f7574732f7375627374726174652d376530383433336434633337306132312f383730363363332f6672616d652f696d2d6f6e6c696e652f7372632f6c69622e72734772616e64706146696e616c69747950656e64696e674368616e67653a6772616e6470615f617574686f726974696573537461746548656172746265617441667465720000002c6a11001600000014d71100020000002c6a110016000000426a110012000000696d6f6e6c696e6570616c6c65745f696d5f6f6e6c696e65536b697070696e6720686561727462656174206174202e204e6f7420612076616c696461746f722e636b11001c000000356b11002e000000036b11001a0000001d6b110018000000e76a11000a000000f16a110012000000cf6a110018000000b96a1100160000009c6a11001d0000004661696c656420746f206665746368206e6574776f726b2073746174654661696c656420746f2061637175697265206c6f636b4661696c656420746f207369676e20686561727462656174417574686f726974792020697320616c7265616479206f6e6c696e6548656172746265617420616c72656164792073656e74206174202e2057616974696e6720666f7220696e636c7573696f6e2e546f6f206561726c7920746f2073656e64206865617274626561742c206e657874206578706563746564206174204661696c656420746f207375626d6974207472616e73616374696f6e004e6911006000000036020000340000007061726974792f696d2d6f6e6c696e652d6865617274626561742f00cc6b110008000000d46b110020000000f46b11000b000000ff6b1100030000005b696e6465783a205d205265706f7274696e6720696d2d6f6e6c696e6520617420626c6f636b3a20202873657373696f6e3a20293a2000003c6c11000900000054e011000000000054e01100000000001900000004000000040000006c0000001900000004000000040000006c0000006865617274626561745374616c6c65644e657874466f726365644772616e64706145717569766f636174696f6e61666770616c6c65745f6772616e6470613a3a65717569766f636174696f6e2f686f6d652f6261737469616e2f2e636172676f2f6769742f636865636b6f7574732f7375627374726174652d376530383433336434633337306132312f383730363363332f6672616d652f6772616e6470612f7372632f65717569766f636174696f6e2e7273546f6f536f6f6e4368616e676550656e64696e67526573756d654661696c656450617573654661696c65640000000000002c8811001300000000000000a06d1100020000000000000000000000d06d1100040000000000000000000000908811001c00000000000000a06d1100020000000000000000000000f06d1100090000000000000000000000386e11000c00000000000000446e1100020000000000000000000000746e11000700000000000000000000009c8a11001200000000000000677111002a00000000000000ca8a11000f00000000000000d98a1100100000009570110043000000d87011003e000000167111003f00000055711100120000009570110043000000d87011003e000000167111003f000000557111001200000054e0110000000000c289110044000000068a1100460000004c8a110046000000928a11000a0000006e6f74655f7374616c6c65640000000075701100050000000000000020be11000e000000000000007a7011001b0000000000000020be11000e000000ac6e110047000000f36e11004a0000003d6f110048000000856f110045000000ca6f11004a000000147011004a0000005e70110017000000204e6f74652074686174207468652063757272656e7420617574686f7269747920736574206f6620746865204752414e4450412066696e616c6974792067616467657420686173207374616c6c65642e20546869732077696c6c2074726967676572206120666f7263656420617574686f7269747920736574206368616e67652061742074686520626567696e6e696e67206f6620746865206e6578742073657373696f6e2c20746f20626520656e6163746564206064656c61796020626c6f636b7320616674657220746861742e205468652064656c61792073686f756c64206265206869676820656e6f75676820746f20736166656c7920617373756d6520746861742074686520626c6f636b207369676e616c6c696e672074686520666f72636564206368616e67652077696c6c206e6f742062652072652d6f726765642028652e672e203130303020626c6f636b73292e20546865204752414e44504120766f746572732077696c6c20737461727420746865206e657720617574686f7269747920736574207573696e672074686520676976656e2066696e616c697a656420626c6f636b20617320626173652e204f6e6c792063616c6c61626c6520627920726f6f742e64656c6179626573745f66696e616c697a65645f626c6f636b5f6e756d626572205265706f727420766f7465722065717569766f636174696f6e2f6d69736265686176696f722e2054686973206d6574686f642077696c6c20766572696679207468652065717569766f636174696f6e2070726f6f6620616e642076616c69646174652074686520676976656e206b6579206f776e6572736869702070726f6f6620616761696e73742074686520657874726163746564206f6666656e6465722e20496620626f7468206172652076616c69642c20746865206f6666656e63652077696c6c206265207265706f727465642e45717569766f636174696f6e50726f6f663c543a3a486173682c20543a3a426c6f636b4e756d6265723e00000000000000de691100050000000000000000000000a47311001b0000000000000000000000000000000000000000000000000000000000000054e01100c07311000000000000000000d073110001000000000000000100000000000000bd6911000d0000000000000000000000d8731100230000000000000000000000000000000000000000000000000000000000000054e01100fc73110000000000000000000c741100010000000000000000000000000000004c6c11000a000000000000000000000020be11000e0000000000000000000000000000000000000000000000000000000000000054e011001474110000000000000000002474110001000000000000000000000000000000456c11000700000000000000000000002c741100200000000000000000000000000000000000000000000000000000000000000054e011004c74110000000000000000005c74110001000000000000000000000000000000647411000c000000000000000000000070741100050000000000000000000000000000000000000000000000000000000000000054e011007874110000000000000000008874110002000000000000000100000000000000987411000c0000000105000000000000707411000500000000000000a47411000c0000000000000000000000000000000000000054e01100b07411000000000000000000c074110004000000000000000000000053746f72656453746174653c543a3a426c6f636b4e756d6265723e001900000000000000010000006d0000008a7611002400000053746f72656450656e64696e674368616e67653c543a3a426c6f636b4e756d6265723e00190000000000000001000000320000005976110031000000190000000000000001000000320000002a7611002f00000028543a3a426c6f636b4e756d6265722c20543a3a426c6f636b4e756d6265722919000000000000000100000032000000067611002400000043757272656e7453657449645365744964000000190000000000000001000000600000007e75110057000000d575110031000000536574496453657373696f6e53657373696f6e496e64657819000000000000000100000032000000e074110056000000367511001a00000054e0110000000000507511002e0000002041206d617070696e672066726f6d206772616e6470612073657420494420746f2074686520696e646578206f6620746865202a6d6f737420726563656e742a2073657373696f6e20666f7220776869636820697473206d656d62657273207765726520726573706f6e7369626c652e2054574f582d4e4f54453a2060536574496460206973206e6f7420756e646572207573657220636f6e74726f6c2e20546865206e756d626572206f66206368616e6765732028626f746820696e207465726d73206f66206b65797320616e6420756e6465726c79696e672065636f6e6f6d696320726573706f6e736962696c69746965732920696e20746865202273657422206f66204772616e6470612076616c696461746f72732066726f6d2067656e657369732e20607472756560206966207765206172652063757272656e746c79207374616c6c65642e206e65787420626c6f636b206e756d6265722077686572652077652063616e20666f7263652061206368616e67652e2050656e64696e67206368616e67653a20287369676e616c65642061742c207363686564756c6564206368616e6765292e205374617465206f66207468652063757272656e7420617574686f72697479207365742e496e76616c69644b65794475706c69636174656448656172746265617400000000003c6c11000900000000000000f8761100020000000000000000000000287711000a00000000000000000000003c6c11000900000000000000c37811001900000000000000dc7811000a00000000000000e67811002f000000a9a211000b0000007877110048000000c07711002d00000054e0110000000000ed77110023000000107811002c0000003c7811004f0000008b78110017000000a27811002100000027a311000c000000202d20436f6d706c65786974793a20604f284b202b20452960207768657265204b206973206c656e677468206f6620604b6579736020616e642045206973206c656e677468206f66202020604865617274626561742e6e6574776f726b5f73746174652e65787465726e616c5f61646472657373602020202d20604f284b29603a206465636f64696e67206f66206c656e67746820604b602020202d20604f284529603a206465636f64696e672f656e636f64696e67206f66206c656e67746820604560202d20446252656164733a2070616c6c65745f73657373696f6e206056616c696461746f7273602c2070616c6c65745f73657373696f6e206043757272656e74496e646578602c20604b657973602c2020206052656365697665644865617274626561747360202d2044625772697465733a2060526563656976656448656172746265617473604865617274626561743c543a3a426c6f636b4e756d6265723e5f7369676e61747572653c543a3a417574686f7269747949642061732052756e74696d654170705075626c69633e3a3a5369676e617475726500000000000000e36911000e000000000000000000000020be11000e0000000000000000000000000000000000000000000000000000000000000054e01100787a11000000000000000000887a1100060000000000000001000000000000003c691100040000000000000000000000b87a1100130000000000000000000000000000000000000000000000000000000000000054e01100cc7a11000000000000000000dc7a110001000000000000000100000000000000e47a1100120000000205050000000000a47411000c00000000000000f67a11000900000000000000ff7a1100070000000000000054e01100087b11000000000000000000187b110002000000000000000000000000000000406911000e0000000205050000000000a47411000c00000000000000287b11000e0000000000000068901100030000000000000054e01100387b11000000000000000000487b11000200000000000000010000001900000000000000010000002e0000005f7c11004c00000054e0110000000000ab7c110044000000ef7c110034000000237d110040000000637d11004e0000005665633c543a3a417574686f7269747949643e001900000000000000010000002f0000002b7c11003400000052656365697665644865617274626561747341757468496e6465785665633c75383e000019000000000000000100000032000000cf7b11003c0000000b7c110020000000543a3a56616c696461746f72496400001900000000000000010000002e000000587b1100450000009d7b11003200000020466f7220656163682073657373696f6e20696e6465782c207765206b6565702061206d617070696e67206f662060543a3a56616c696461746f7249646020746f20746865206e756d626572206f6620626c6f636b7320617574686f7265642062792074686520676976656e20617574686f726974792e20466f7220656163682073657373696f6e20696e6465782c207765206b6565702061206d617070696e67206f66206041757468496e6465786020746f20606f6666636861696e3a3a4f70617175654e6574776f726b5374617465602e205468652063757272656e7420736574206f66206b6579732074686174206d61792069737375652061206865617274626561742e2054686520626c6f636b206e756d6265722061667465722077686963682069742773206f6b20746f2073656e64206865617274626561747320696e2063757272656e742073657373696f6e2e2041742074686520626567696e6e696e67206f6620656163682073657373696f6e20776520736574207468697320746f20612076616c756520746861742073686f756c642066616c6c20726f7567686c7920696e20746865206d6964646c65206f66207468652073657373696f6e206475726174696f6e2e20546865206964656120697320746f206669727374207761697420666f72207468652076616c696461746f727320746f2070726f64756365206120626c6f636b20696e207468652063757272656e742073657373696f6e2c20736f20746861742074686520686561727462656174206c61746572206f6e2077696c6c206e6f74206265206e65636573736172792e00000000000000387e110011000000000000004c7e1100010000000000000000000000547e11000100000000000000000000005c7e1100070000000000000054e01100000000000000000000000000647e11000100000000000000000000006c7e11000b00000000000000787e1100010000000000000000000000807e110001000000000000004865617274626561745265636569766564000000617f11000b000000227f11003f000000416c6c476f6f6400ed7e110035000000536f6d654f66666c696e6500d57e110018000000887e11004d0000002041742074686520656e64206f66207468652073657373696f6e2c206174206c65617374206f6e652076616c696461746f722077617320666f756e6420746f206265205b6f66666c696e655d2e5665633c4964656e74696669636174696f6e5475706c653e2041742074686520656e64206f66207468652073657373696f6e2c206e6f206f6666656e63652077617320636f6d6d69747465642e2041206e657720686561727462656174207761732072656365697665642066726f6d2060417574686f72697479496460205b617574686f726974795f69645d417574686f726974794964000000000f6d11000b0000000000000030801100020000000000000000000000036d11000c0000000000000040801100020000000000000000000000f66c11000d0000000000000050801100010000000000000000000000ef6c11000700000000000000588011000100000000000000000000008c871100180000000000000060801100010000000000000000000000a4871100180000000000000068801100010000000000000000000000bc87110016000000000000007080110001000000000000003182110042000000738211002a000000c3811100450000000882110029000000888111003b00000058811100300000000b8111004d000000be8011004d0000007880110046000000204120676976656e2065717569766f636174696f6e207265706f72742069732076616c69642062757420616c72656164792070726576696f75736c79207265706f727465642e20416e2065717569766f636174696f6e2070726f6f662070726f76696465642061732070617274206f6620616e2065717569766f636174696f6e207265706f727420697320696e76616c69642e2041206b6579206f776e6572736869702070726f6f662070726f76696465642061732070617274206f6620616e2065717569766f636174696f6e207265706f727420697320696e76616c69642e2043616e6e6f74207369676e616c20666f72636564206368616e676520736f20736f6f6e206166746572206c6173742e20417474656d707420746f207369676e616c204752414e445041206368616e67652077697468206f6e6520616c72656164792070656e64696e672e20417474656d707420746f207369676e616c204752414e44504120726573756d65207768656e2074686520617574686f72697479207365742069736e2774207061757365642028656974686572206c697665206f7220616c72656164792070656e64696e6720726573756d65292e20417474656d707420746f207369676e616c204752414e445041207061757365207768656e2074686520617574686f72697479207365742069736e2774206c697665202865697468657220706175736564206f7220616c72656164792070656e64696e67207061757365292e00000000000000ae7611000a00000000000000d8821100010000000000000000000000b87611001300000000000000e08211000100000000000000fe82110019000000e882110016000000204475706c696361746564206865617274626561742e204e6f6e206578697374656e74207075626c6963206b65792e4469676573744974656d206e6f7420657175616c50726576696f7573206d617463682061726d206d61746368657320616e7974696e67206c657373207468616e20325e33303b20716564000000000000000000000000000000788311003d000000736869667465642073756666696369656e74206269747320726967687420746f206c656164206f6e6c79206c656164696e67207a65726f733b2071656400000000000000000000000000000000000000506172656e7420686173682073686f756c642062652076616c69642e5472616e73616374696f6e207472696520726f6f74206d7573742062652076616c69642e7d84110032000000446967657374206974656d206d757374206d6174636820746861742063616c63756c617465642e53746f7261676520726f6f74206d757374206d6174636820746861742063616c63756c617465642e5369676e617475726520766572696669636174696f6e206661696c65642e4e756d626572206f6620646967657374206974656d73206d757374206d6174636820746861742063616c63756c617465642e00c08411005d000000740100001b0000002f686f6d652f6261737469616e2f2e636172676f2f72656769737472792f7372632f6769746875622e636f6d2d316563633632393964623965633832332f747269652d64622d302e32322e302f7372632f7472696564626d75742e727363616c6c656420604f7074696f6e3a3a756e77726170282960206f6e206120604e6f6e65602076616c7565588511008f000000200600002f0000002f6e69782f73746f72652f39357734373162393862373934323470796c393364347a37686a6735693931372d727573742d312e34362e302d6e696768746c792d323032302d30362d33302d3136393537626434642f6c69622f727573746c69622f7372632f727573742f7372632f6c6962616c6c6f632f636f6c6c656374696f6e732f62747265652f6d61702e727300f885110006000000fe85110010000000496e64657820206f7574206f6620626f756e64733a200000c08411005d000000670100000d000000496e73657274696f6e206e657665722064656c657465732ec08411005d000000640200000d000000617373657274696f6e206661696c65643a20216578697374696e675f6b65792e69735f656d70747928296d6f72655f6174746573746174696f6e734c6174656e65737300948611001a0000004552524f523a20436f7272757074656420737461746520617420000000000000cc8611001300000000000000e08611000100000000000000546f6f4d616e794174746573746174696f6e7300e886110035000000204d6f7265206174746573746174696f6e732063616e206265206164646564206f6e6c79206f6e636520696e206120626c6f636b2e4261626545717569766f636174696f6e000000388711005400000072656a656374696e6720756e7369676e6564207265706f72742065717569766f636174696f6e207472616e73616374696f6e2062656361757365206974206973206e6f74206c6f63616c2f696e2d626c6f636b2e496e76616c69644b65794f776e65727368697050726f6f66496e76616c696445717569766f636174696f6e50726f6f664475706c69636174654f6666656e63655265706f72740000000000002c88110013000000000000004088110002000000000000000000000070881100040000000000000000000000908811001c0000000000000040881100020000000000000000000000ac88110008000000000000007265706f72745f65717569766f636174696f6e00000000009c8a11001200000000000000ae8a11001c00000000000000ca8a11000f00000000000000d98a110010000000ec881100430000002f891100420000007189110044000000b58911000d0000007265706f72745f65717569766f636174696f6e5f756e7369676e6564ec881100430000002f891100420000007189110044000000b58911000d000000c289110044000000068a1100460000004c8a110046000000928a11000a000000205265706f727420617574686f726974792065717569766f636174696f6e2f6d69736265686176696f722e2054686973206d6574686f642077696c6c20766572696679207468652065717569766f636174696f6e2070726f6f6620616e642076616c69646174652074686520676976656e206b6579206f776e6572736869702070726f6f6620616761696e73742074686520657874726163746564206f6666656e6465722e20496620626f7468206172652076616c69642c20746865206f6666656e63652077696c6c206265207265706f727465642e20546869732065787472696e736963206d7573742062652063616c6c656420756e7369676e656420616e642069742069732065787065637465642074686174206f6e6c7920626c6f636b20617574686f72732077696c6c2063616c6c206974202876616c69646174656420696e206056616c6964617465556e7369676e656460292c20617320737563682069662074686520626c6f636b20617574686f7220697320646566696e65642069742077696c6c20626520646566696e6564206173207468652065717569766f636174696f6e207265706f727465722e65717569766f636174696f6e5f70726f6f6645717569766f636174696f6e50726f6f663c543a3a4865616465723e6b65795f6f776e65725f70726f6f66543a3a4b65794f776e657250726f6f6600000000000000b48e11000a0000000000000000000000be8e1100030000000000000000000000000000000000000000000000000000000000000054e01100c48e11000000000000000000d48e110001000000000000000100000000000000dc8e11000b0000000000000000000000e78e1100270000000000000000000000000000000000000000000000000000000000000054e01100108f11000000000000000000208f110001000000000000000100000000000000288f11000b0000000000000000000000be8e1100030000000000000000000000000000000000000000000000000000000000000054e01100348f11000000000000000000448f110002000000000000000100000000000000548f11000b0000000000000000000000be8e1100030000000000000000000000000000000000000000000000000000000000000054e01100608f11000000000000000000708f110001000000000000000100000000000000788f11000a0000000000000000000000828f1100160000000000000000000000000000000000000000000000000000000000000054e01100988f11000000000000000000a88f11000a000000000000000100000000000000f88f11000f000000000000000000000007901100140000000000000000000000000000000000000000000000000000000000000054e011001c90110000000000000000002c90110001000000000000000000000000000000349011000e0000000000000000000000828f1100160000000000000000000000000000000000000000000000000000000000000054e0110044901100000000000000000054901100010000000000000001000000000000005c9011000c000000000000000000000068901100030000000000000000000000000000000000000000000000000000000000000054e011006c90110000000000000000007c90110009000000000000000100000000000000c4901100110000000105000000000000689011000300000000000000d59011001b0000000000000000000000000000000000000054e01100f09011000000000000000000009111000100000000000000010000000000000060be11000b0000000000000000000000089111000f0000000000000000000000000000000000000000000000000000000000000054e0110018911100000000000000000028911100020000000000000000000000000000008386110008000000000000000000000020be11000e0000000000000000000000000000000000000000000000000000000000000054e011003891110000000000000000004891110005000000000000000100000045706f6368496e646578753634000000190000000000000001000000600000000197110015000000417574686f7269746965735665633c28417574686f7269747949642c2042616265417574686f72697479576569676874293e00001900000000000000010000002f000000e69611001b00000047656e65736973536c6f740019000000000000000100000060000000849611003e000000c29611002400000043757272656e74536c6f7400190000000000000001000000600000006f9611001500000052616e646f6d6e6573737363686e6f72726b656c3a3a52616e646f6d6e6573731900000000000000010000006e000000a99411002e00000054e0110000000000d79411000b00000054e0110000000000e294110041000000239511003e0000006195110045000000a695110045000000eb951100410000002c961100430000004e65787445706f6368436f6e6669674e657874436f6e66696744657363726970746f72001900000000000000010000003200000083941100260000004e65787452616e646f6d6e65737300001900000000000000010000006e0000006c941100170000005365676d656e74496e646578753332001900000000000000010000002e000000279311001f00000054e0110000000000469311003d0000008393110040000000c39311002500000054e0110000000000e89311003b00000023941100420000006594110007000000556e646572436f6e737472756374696f6e5665633c7363686e6f72726b656c3a3a52616e646f6d6e6573733e19000000000000000100000059000000e2921100450000004d6179626552616e646f6d6e65737300190000000000000001000000320000005b921100400000009b921100470000001900000000000000010000002e000000709111003600000054e0110000000000a691110045000000eb911100440000002f9211002c00000020486f77206c617465207468652063757272656e7420626c6f636b20697320636f6d706172656420746f2069747320706172656e742e205468697320656e74727920697320706f70756c617465642061732070617274206f6620626c6f636b20657865637574696f6e20616e6420697320636c65616e6564207570206f6e20626c6f636b2066696e616c697a6174696f6e2e205175657279696e6720746869732073746f7261676520656e747279206f757473696465206f6620626c6f636b20657865637574696f6e20636f6e746578742073686f756c6420616c77617973207969656c64207a65726f2e2054656d706f726172792076616c75652028636c656172656420617420626c6f636b2066696e616c697a6174696f6e292077686963682069732060536f6d6560206966207065722d626c6f636b20696e697469616c697a6174696f6e2068617320616c7265616479206265656e2063616c6c656420666f722063757272656e7420626c6f636b2e2054574f582d4e4f54453a20605365676d656e74496e6465786020697320616e20696e6372656173696e6720696e74656765722c20736f2074686973206973206f6b61792e2052616e646f6d6e65737320756e64657220636f6e737472756374696f6e2e205765206d616b6520612074726164656f6666206265747765656e2073746f7261676520616363657373657320616e64206c697374206c656e6774682e2057652073746f72652074686520756e6465722d636f6e737472756374696f6e2072616e646f6d6e65737320696e207365676d656e7473206f6620757020746f2060554e4445525f434f4e535452554354494f4e5f5345474d454e545f4c454e475448602e204f6e63652061207365676d656e7420726561636865732074686973206c656e6774682c20776520626567696e20746865206e657874206f6e652e20576520726573657420616c6c207365676d656e747320616e642072657475726e20746f206030602061742074686520626567696e6e696e67206f662065766572792065706f63682e204e6578742065706f63682072616e646f6d6e6573732e204e6578742065706f636820636f6e66696775726174696f6e2c206966206368616e6765642e205468652065706f63682072616e646f6d6e65737320666f7220746865202a63757272656e742a2065706f63682e20232053656375726974792054686973204d555354204e4f54206265207573656420666f722067616d626c696e672c2061732069742063616e20626520696e666c75656e6365642062792061206d616c6963696f75732076616c696461746f7220696e207468652073686f7274207465726d2e204974204d4159206265207573656420696e206d616e792063727970746f677261706869632070726f746f636f6c732c20686f77657665722c20736f206c6f6e67206173206f6e652072656d656d626572732074686174207468697320286c696b652065766572797468696e6720656c7365206f6e2d636861696e29206974206973207075626c69632e20466f72206578616d706c652c2069742063616e20626520757365642077686572652061206e756d626572206973206e656564656420746861742063616e6e6f742068617665206265656e2063686f73656e20627920616e206164766572736172792c20666f7220707572706f7365732073756368206173207075626c69632d636f696e207a65726f2d6b6e6f776c656467652070726f6f66732e2043757272656e7420736c6f74206e756d6265722e2054686520736c6f74206174207768696368207468652066697273742065706f63682061637475616c6c7920737461727465642e2054686973206973203020756e74696c2074686520666972737420626c6f636b206f662074686520636861696e2e2043757272656e742065706f636820617574686f7269746965732e2043757272656e742065706f636820696e6465782e000000000000889711000d00000000000000be8e1100030000000000000054e01100989711000000000000000000a8971100020000000000000000000000b89711001100000000000000c9971100090000000000000054e01100d49711000000000000000000e4971100050000000000000045706f63684475726174696f6e0000001900000000000000010000006f0000003c991100430000007f9911003f0000004578706563746564426c6f636b54696d65543a3a4d6f6d656e740000190000000000000001000000700000000c981100410000004d981100440000009198110041000000d298110042000000149911002800000020546865206578706563746564206176657261676520626c6f636b2074696d6520617420776869636820424142452073686f756c64206265206372656174696e6720626c6f636b732e2053696e636520424142452069732070726f626162696c6973746963206974206973206e6f74207472697669616c20746f20666967757265206f7574207768617420746865206578706563746564206176657261676520626c6f636b2074696d652073686f756c64206265206261736564206f6e2074686520736c6f74206475726174696f6e20616e642074686520736563757269747920706172616d657465722060636020287768657265206031202d20636020726570726573656e7473207468652070726f626162696c697479206f66206120736c6f74206265696e6720656d707479292e20546865206e756d626572206f66202a2a736c6f74732a2a207468617420616e2065706f63682074616b65732e20576520636f75706c652073657373696f6e7320746f2065706f6368732c20692e652e2077652073746172742061206e65772073657373696f6e206f6e636520746865206e65772065706f636820626567696e732e4475706c6963617465556e70726f787961626c654e6f7450726f78794e6f74466f756e64546f6f4d616e794e6f5065726d697373696f6e00000000000000009b11000500000000000000089b1100030000000000000000000000509b1100100000000000000000000000d09b11000900000000000000dc9b11000200000000000000000000000c9c11000d0000000000000000000000749c11000c00000000000000dc9b1100020000000000000000000000809c11000d0000000000000000000000e89c11000e0000000000000054e01100000000000000000000000000f89c11000c0000000000000000000000589d11000900000000000000649d1100020000000000000000000000949d1100160000000000000000000000449e11000e00000000000000549e1100050000000000000000000000cc9e1100160000000000000070726f78790000000000000042ab110004000000000000003aa311000c0000000000000046ab1100100000000000000056ab110014000000000000006aab110004000000000000006eab110017000000aea911005400000002aa11000d00000054e0110000000000b8a611003400000054e0110000000000e8a711000c0000000faa11004400000053aa110059000000acaa11003500000054e0110000000000a9a211000b000000b4a2110028000000e1aa11002400000005ab11001d00000022ab11002000000027a311000c0000006164645f70726f787900000000000000009b110005000000000000003aa311000c0000000000000046a311000a0000000000000050a311000c000000b3a811005200000054e0110000000000b8a611003400000054e0110000000000e8a711000c00000005a91100450000004aa911004000000054e0110000000000a9a211000b000000b4a21100280000008aa911002400000000a311002700000027a311000c00000072656d6f76655f70726f7879bda711002b00000054e0110000000000b8a611003400000054e0110000000000e8a711000c000000f4a711004a0000003ea811005100000054e0110000000000a9a211000b000000b4a21100280000008fa811002400000000a311002700000027a311000c00000072656d6f76655f70726f7869657300008aa611002e00000054e0110000000000b8a611003400000054e0110000000000eca611005600000042a711005700000054e0110000000000a9a211000b000000b4a211002800000099a711002400000000a311002700000027a311000c000000616e6f6e796d6f75730000000000000046a311000a0000000000000050a311000c000000000000005ca31100050000000000000061a31100030000007fa311004f000000cea311004000000054e01100000000000ea411001c00000054e01100000000002aa41100550000007fa4110054000000d3a411001f000000f2a411005500000047a51100580000009fa511001100000054e0110000000000b0a511005500000005a611002700000054e01100000000002ca611003a00000054e0110000000000a9a211000b000000b4a211002800000066a611002400000000a311002700000027a311000c0000006b696c6c5f616e6f6e796d6f757300000000000033a3110007000000000000003aa311000c0000000000000046a311000a0000000000000050a311000c000000000000005ca31100050000000000000061a31100030000000000000064a3110006000000000000000cbc110017000000000000006aa31100090000000000000073a311000c0000007c9f11002e00000054e0110000000000aa9f110053000000fd9f11000e00000054e01100000000000ba011005700000062a011002b00000054e01100000000008da0110054000000e1a011005400000035a111004100000076a1110050000000c6a111005300000054e011000000000019a21100530000006ca211003d00000054e0110000000000a9a211000b000000b4a2110028000000dca211002400000000a311002700000027a311000c0000002052656d6f76657320612070726576696f75736c7920737061776e656420616e6f6e796d6f75732070726f78792e205741524e494e473a202a2a416c6c2061636365737320746f2074686973206163636f756e742077696c6c206265206c6f73742e2a2a20416e792066756e64732068656c6420696e2069742077696c6c20626520696e61636365737369626c652e205265717569726573206120605369676e656460206f726967696e2c20616e64207468652073656e646572206163636f756e74206d7573742068617665206265656e206372656174656420627920612063616c6c20746f2060616e6f6e796d6f757360207769746820636f72726573706f6e64696e6720706172616d65746572732e202d2060737061776e6572603a20546865206163636f756e742074686174206f726967696e616c6c792063616c6c65642060616e6f6e796d6f75736020746f206372656174652074686973206163636f756e742e202d2060696e646578603a2054686520646973616d626967756174696f6e20696e646578206f726967696e616c6c792070617373656420746f2060616e6f6e796d6f7573602e2050726f6261626c79206030602e202d206070726f78795f74797065603a205468652070726f78792074797065206f726967696e616c6c792070617373656420746f2060616e6f6e796d6f7573602e202d2060686569676874603a2054686520686569676874206f662074686520636861696e207768656e207468652063616c6c20746f2060616e6f6e796d6f757360207761732070726f6365737365642e202d20606578745f696e646578603a205468652065787472696e73696320696e64657820696e207768696368207468652063616c6c20746f2060616e6f6e796d6f757360207761732070726f6365737365642e204661696c73207769746820604e6f5065726d697373696f6e6020696e2063617365207468652063616c6c6572206973206e6f7420612070726576696f75736c79206372656174656420616e6f6e796d6f7573206163636f756e742077686f73652060616e6f6e796d6f7573602063616c6c2068617320636f72726573706f6e64696e6720706172616d65746572732e2023203c7765696768743e205020697320746865206e756d626572206f662070726f7869657320746865207573657220686173202d2042617365207765696768743a2031352e3635202b202e313337202a205020c2b573202d204442207765696768743a20312073746f72616765207265616420616e642077726974652e2023203c2f7765696768743e737061776e6572543a3a4163636f756e74496470726f78795f74797065543a3a50726f787954797065696e6465787531366865696768746578745f696e646578436f6d706163743c7533323e20537061776e2061206672657368206e6577206163636f756e7420746861742069732067756172616e7465656420746f206265206f746865727769736520696e61636365737369626c652c20616e6420696e697469616c697a65206974207769746820612070726f7879206f66206070726f78795f747970656020666f7220606f726967696e602073656e6465722e205265717569726573206120605369676e656460206f726967696e2e202d206070726f78795f74797065603a205468652074797065206f66207468652070726f78792074686174207468652073656e6465722077696c6c2062652072656769737465726564206173206f76657220746865206e6577206163636f756e742e20546869732077696c6c20616c6d6f737420616c7761797320626520746865206d6f7374207065726d697373697665206050726f7879547970656020706f737369626c6520746f20616c6c6f7720666f72206d6178696d756d20666c65786962696c6974792e202d2060696e646578603a204120646973616d626967756174696f6e20696e6465782c20696e206361736520746869732069732063616c6c6564206d756c7469706c652074696d657320696e207468652073616d65207472616e73616374696f6e2028652e672e207769746820607574696c6974793a3a626174636860292e20556e6c65737320796f75277265207573696e67206062617463686020796f752070726f6261626c79206a7573742077616e7420746f20757365206030602e204661696c73207769746820604475706c69636174656020696620746869732068617320616c7265616479206265656e2063616c6c656420696e2074686973207472616e73616374696f6e2c2066726f6d207468652073616d652073656e6465722c2077697468207468652073616d6520706172616d65746572732e204661696c732069662074686572652061726520696e73756666696369656e742066756e647320746f2070617920666f72206465706f7369742e202d2042617365207765696768743a2033362e3438202b202e303339202a205020c2b57320556e726567697374657220616c6c2070726f7879206163636f756e747320666f72207468652073656e6465722e20546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e205741524e494e473a2054686973206d61792062652063616c6c6564206f6e206163636f756e747320637265617465642062792060616e6f6e796d6f7573602c20686f776576657220696620646f6e652c207468656e2074686520756e726573657276656420666565732077696c6c20626520696e61636365737369626c652e202a2a416c6c2061636365737320746f2074686973206163636f756e742077696c6c206265206c6f73742e2a2a202d2042617365207765696768743a2031332e3733202b202e313239202a205020c2b57320556e726567697374657220612070726f7879206163636f756e7420666f72207468652073656e6465722e20506172616d65746572733a202d206070726f7879603a20546865206163636f756e74207468617420746865206063616c6c65726020776f756c64206c696b6520746f2072656d6f766520617320612070726f78792e202d206070726f78795f74797065603a20546865207065726d697373696f6e732063757272656e746c7920656e61626c656420666f72207468652072656d6f7665642070726f7879206163636f756e742e202d2042617365207765696768743a2031342e3337202b202e313634202a205020c2b57320526567697374657220612070726f7879206163636f756e7420666f72207468652073656e64657220746861742069732061626c6520746f206d616b652063616c6c73206f6e2069747320626568616c662e202d206070726f7879603a20546865206163636f756e74207468617420746865206063616c6c65726020776f756c64206c696b6520746f206d616b6520612070726f78792e202d206070726f78795f74797065603a20546865207065726d697373696f6e7320616c6c6f77656420666f7220746869732070726f7879206163636f756e742e202d2042617365207765696768743a2031372e3438202b202e313736202a205020c2b5732044697370617463682074686520676976656e206063616c6c602066726f6d20616e206163636f756e742074686174207468652073656e64657220697320617574686f726973656420666f72207468726f75676820606164645f70726f7879602e202d20607265616c603a20546865206163636f756e742074686174207468652070726f78792077696c6c206d616b6520612063616c6c206f6e20626568616c66206f662e202d2060666f7263655f70726f78795f74797065603a2053706563696679207468652065786163742070726f7879207479706520746f206265207573656420616e6420636865636b656420666f7220746869732063616c6c2e202d206063616c6c603a205468652063616c6c20746f206265206d6164652062792074686520607265616c60206163636f756e742e202d2042617365207765696768743a2031392e3837202b202e313431202a205020c2b573202d204442207765696768743a20312073746f7261676520726561642e202d20506c75732074686520776569676874206f6620746865206063616c6c607265616c666f7263655f70726f78795f747970654f7074696f6e3c543a3a50726f7879547970653e63616c6c426f783c3c542061732054726169743e3a3a43616c6c3e00000000000000e0ab11000700000001050000000000003aa311000c00000000000000e7ab1100310000000000000000000000000000000000000054e0110018ac1100000000000000000028ac110002000000000000000100000050726f78696573285665633c28543a3a4163636f756e7449642c20543a3a50726f787954797065293e2c2042616c616e63654f663c543e291900000000000000010000007100000038ac11005100000089ac1100480000002054686520736574206f66206163636f756e742070726f786965732e204d61707320746865206163636f756e74207768696368206861732064656c65676174656420746f20746865206163636f756e747320776869636820617265206265696e672064656c65676174656420746f2c20746f67657468657220776974682074686520616d6f756e742068656c64206f6e206465706f7369742e000000000000007cad110010000000000000008cad11000c0000000000000054e0110098ad11000000000000000000a8ad1100010000000000000000000000b0ad110012000000000000008cad11000c0000000000000054e01100c4ad11000000000000000000d4ad1100010000000000000000000000dcad11000a0000000000000061a31100030000000000000054e01100e8ad11000000000000000000f8ad1100010000000000000050726f78794465706f7369744261736542616c616e63654f663c543e190000000000000001000000720000006bae11004400000050726f78794465706f736974466163746f720000190000000000000001000000730000003cae11002f0000004d617850726f7869657300001900000000000000010000007400000000ae11003c00000020546865206d6178696d756d20616d6f756e74206f662070726f7869657320616c6c6f77656420666f7220612073696e676c65206163636f756e742e2054686520616d6f756e74206f662063757272656e6379206e6565646564207065722070726f78792061646465642e20546865206261736520616d6f756e74206f662063757272656e6379206e656564656420746f207265736572766520666f72206372656174696e6720612070726f78792e000000000008af11000d0000000000000018af110001000000000000000000000020af110001000000000000000000000028af1100100000000000000038af110004000000000000000000000058af1100020000000000000050726f7879457865637574656400000046b011000e0000000db0110039000000416e6f6e796d6f757343726561746564fbaf110009000000fbaf11000900000004b011000900000061a311000300000068af11003b000000a3af11005800000020416e6f6e796d6f7573206163636f756e7420686173206265656e2063726561746564206279206e65772070726f7879207769746820676976656e20646973616d626967756174696f6e20696e64657820616e642070726f787920747970652e205b616e6f6e796d6f75732c2077686f2c2070726f78795f747970652c20646973616d626967756174696f6e5f696e6465785d4163636f756e74496450726f78795479706520412070726f78792077617320657865637574656420636f72726563746c792c20776974682074686520676976656e205b726573756c745d2e4469737061746368526573756c7465706f636820696e64696365732077696c6c206e6576657220726561636820325e3634206265666f726520746865206465617468206f662074686520756e6976657273653b20716564000000c0b011005b000000c90100000e000000c0b011005b000000d10100000e0000002f686f6d652f6261737469616e2f2e636172676f2f6769742f636865636b6f7574732f7375627374726174652d376530383433336434633337306132312f383730363363332f6672616d652f626162652f7372632f6c69622e727350617261426c6f636b4174746573746174696f6e73526563656e7450617261426c6f636b73000000007286110011000000000000006cb1110001000000000000000000000084b11100010000000000000000000000d1b111000500000000000000d6b11100100000008cb11100450000002050726f766964652063616e64696461746520726563656970747320666f722070617261636861696e732c20696e20617363656e64696e67206f726465722062792069642e5f6d6f72654d6f72654174746573746174696f6e7300000000000030b1110010000000010500000000000020be11000e00000000000000f0b21100110000000000000000000000000000000000000054e0110004b31100000000000000000014b31100020000000000000000000000000000001bb1110015000000020506000000000020be11000e0000000000000024b31100040000000000000028b31100140000000000000054e011003cb3110000000000000000004cb311000100000000000000000000000000000054b311000900000000000000000000006bbe1100040000000000000000000000000000000000000000000000000000000000000054e0110060b31100000000000000000054e01100000000000000000001000000496e636c75646564426c6f636b733c543e000000190000000000000001000000320000009ab311003c000000d6b311003300000048617368426c6f636b4174746573746174696f6e733c543e1900000000000000010000003200000070b311002a00000044696455706461746500000019000000000000000100000032000000204174746573746174696f6e73206f6e206120726563656e742070617261636861696e20626c6f636b2e2041206d617070696e672066726f6d206d6f64756c617220626c6f636b206e756d62657220286e2025204174746573746174696f6e506572696f642920746f2073657373696f6e20696e64657820616e6420746865206c697374206f662063616e646964617465206861736865732e617373657274696f6e206661696c65643a20656467652e686569676874203d3d2073656c662e686569676874202d2031617373657274696f6e206661696c65643a2073656c662e6c656e2829203c204341504143495459617373657274696f6e206661696c65643a20656467652e686569676874203d3d2073656c662e6e6f64652e686569676874202d203174696d657374616d702073657420696e20626c6f636b20646f65736e2774206d6174636820736c6f7420696e207365616c000000000000e2991100070000000000000070b51100010000000000000000000000da991100080000000000000078b51100010000000000000000000000d2991100080000000000000080b51100010000000000000000000000c79911000b0000000000000088b51100010000000000000000000000be991100090000000000000090b51100010000000000000000000000e99911000c0000000000000098b5110001000000000000009db61100270000007fb611001e0000004bb611003400000002b6110049000000e6b511001c000000a0b51100460000002043616c6c206d6179206e6f74206265206d6164652062792070726f78792062656361757365206974206d617920657363616c617465206974732070726976696c656765732e204163636f756e7420697320616c726561647920612070726f78792e20412063616c6c20776869636820697320696e636f6d70617469626c652077697468207468652070726f7879207479706527732066696c7465722077617320617474656d707465642e2053656e646572206973206e6f7420612070726f7879206f6620746865206163636f756e7420746f2062652070726f786965642e2050726f787920726567697374726174696f6e206e6f7420666f756e642e2054686572652061726520746f6f206d616e792070726f7869657320726567697374657265642e6d6f646c70792f70726f78795f5f5f5f0eb7110023000000e4b611002a000000696e7465726e616c206572726f723a20656e746572656420756e726561636861626c6520636f64653a205f5f5068616e746f6d4974656d2073686f756c64206e6576657220626520757365642e55706461746556524648617368565246526573756c747672662d696e7672662d6f7574436865636b576569676874526563656e7448696e74734f72646572656448696e74734d656469616e616c77617973206174206c65617374206f6e6520726563656e742073616d706c653b20716564000078b8110067000000710000000e000000726563656e7420616e64206f72646572656420636f6e7461696e207468652073616d65206974656d733b2071656400001900000004000000040000001300000078b81100670000007c000000160000007072756e696e672064696374617465642062792077696e646f775f73697a6520776869636820697320616c776179732073617475726174656420617420313b207165640078b8110067000000960000001100000078b8110067000000900000001900000078b811006700000091000000190000002f686f6d652f6261737469616e2f2e636172676f2f6769742f636865636b6f7574732f7375627374726174652d376530383433336434633337306132312f383730363363332f6672616d652f66696e616c6974792d747261636b65722f7372632f6c69622e7273426164206d616e64616e746f7279000000a5b91100230000007db911002600000070616c6c65745f626162653a3a65717569766f636174696f6e2f686f6d652f6261737469616e2f2e636172676f2f6769742f636865636b6f7574732f7375627374726174652d376530383433336434633337306132312f383730363363332f6672616d652f626162652f7372632f65717569766f636174696f6e2e72734572726f72207375626d697474696e672065717569766f636174696f6e207265706f72743a2028295375626d697474656420424142452065717569766f636174696f6e207265706f72742e617373657274696f6e206661696c65643a2062697473203c3d20726573756c742e6c656e2829566563746f72206361706163697479206f766572666c6f77000084ba11005a0000004d0000000e000000ffffff1f3cba1100130000006aba11001a0000003cba1100130000004fba11001b0000004361706163697479206f766572666c6f773a20206f766572666c6f777320616c6c6f636174696f6e2073697a6520206f766572666c6f7773206d6178696d756d206c656e677468202f686f6d652f6261737469616e2f2e636172676f2f72656769737472792f7372632f6769746875622e636f6d2d316563633632393964623965633832332f6269747665632d302e31372e342f7372632f7665632f6170692e7273000000000004f4ba11000e00000002bb11000b000000566563746f72206c656e67746820206f766572666c6f77732000000018bb110023000000605f5f49676e6f7265602063616e206e6576657220626520636f6e7374727563746564416c72656164795570646174656442616448696e74000000007cbb11000a0000000000000088bb1100010000000000000000000000a0bb1100020000000000000066696e616c5f68696e7400000000000008bc110004000000000000000cbc110017000000b0bb11003d000000edbb11001b0000002048696e7420746861742074686520617574686f72206f66207468697320626c6f636b207468696e6b732074686520626573742066696e616c697a656420626c6f636b2069732074686520676976656e206e756d6265722e68696e74436f6d706163743c543a3a426c6f636b4e756d6265723e00000000005fb711000b0000000000000000000000dcbd1100130000000000000000000000000000000000000000000000000000000000000054e01100f0bd1100000000000000000000be1100010000000000000001000000000000006ab711000c0000000000000000000000dcbd1100130000000000000000000000000000000000000000000000000000000000000054e0110008be1100000000000000000018be11000100000000000000010000000000000076b7110006000000000000000000000020be11000e0000000000000000000000000000000000000000000000000000000000000054e0110030be1100000000000000000040be11000100000000000000010000000000000031b7110006000000000000000000000020be11000e0000000000000000000000000000000000000000000000000000000000000054e0110048be1100000000000000000058be11000100000000000000000000000000000060be11000b00000000000000000000006bbe1100040000000000000000000000000000000000000000000000000000000000000054e0110070be1100000000000000000054e011000000000000000000010000005665633c543a3a426c6f636b4e756d6265723e0019000000000000000100000041000000e3be11000e00000019000000000000000100000041000000cdbe110016000000543a3a426c6f636b4e756d62657200001900000000000000010000002e000000c1be11000c0000001900000000000000010000003200000080be110041000000496e697469616c697a6564626f6f6c00190000000000000001000000320000002046696e616c2068696e7420746f206170706c7920696e2074686520626c6f636b2e20604e6f6e6560206d65616e73202273616d6520617320706172656e74222e20546865206d656469616e2e204f72646572656420726563656e742068696e74732e20526563656e742068696e74732e0000000000000064bf11000a0000000000000020be11000e0000000000000054e0110070bf1100000000000000000080bf110001000000000000000000000088bf11000d0000000000000020be11000e0000000000000054e0110098bf11000000000000000000a8bf1100010000000000000057696e646f7753697a65000019000000000000000100000075000000f7bf1100460000005265706f72744c6174656e637900000019000000000000000100000031000000b0bf110047000000205468652064656c617920616674657220776869636820706f696e74207468696e6773206265636f6d6520737573706963696f75732e2044656661756c7420697320313030302e20546865206e756d626572206f6620726563656e742073616d706c657320746f206b6565702066726f6d207468697320636861696e2e2044656661756c74206973203130312e0001696e7465726e616c206572726f723a20656e746572656420756e726561636861626c6520636f646500460000005000000008000000490000004a0000004b0000004c0000004d0000004e0000004f000000000000003bbb11000e00000000000000c8c0110001000000000000000000000049bb11000700000000000000d0c011000100000000000000fcc0110032000000d8c01100240000002046696e616c697a6564206865696768742061626f766520626c6f636b206e756d6265722046696e616c2068696e74206d7573742062652075706461746564206f6e6c79206f6e636520696e2074686520626c6f636b0000b3c111000700000098c111001b00000014d711000200000058c1110040000000f0020000010000002f686f6d652f6261737469616e2f70726f6a656374732f7061726974792f706f6c6b61646f742f72756e74696d652f726f636f636f2f7372632f6c69622e727342616420696e70757420646174612070726f766964656420746f2076657273696f6e0000c4c111000d000000657865637574655f626c6f636b000000dcc1110010000000696e697469616c697a655f626c6f636bf4c11100080000006d6574616461746104c211000f0000006170706c795f65787472696e736963001cc211000e00000066696e616c697a655f626c6f636b000034c2110013000000696e686572656e745f65787472696e736963730050c211000f000000636865636b5f696e686572656e74730068c211000b00000072616e646f6d5f73656564007cc211001400000076616c69646174655f7472616e73616374696f6e98c211000f0000006f6666636861696e5f776f726b657200b0c211000a00000076616c696461746f72730000c4c211000b000000647574795f726f7374657200d8c21100110000006163746976655f70617261636861696e73000000f4c2110016000000676c6f62616c5f76616c69646174696f6e5f64617461000014c31100150000006c6f63616c5f76616c69646174696f6e5f6461746100000034c311000e00000070617261636861696e5f636f646500004cc31100090000006765745f686561647300000060c311000f0000007369676e696e675f636f6e746578740078c3110011000000646f776e776172645f6d6573736167657300000094c31100130000006772616e6470615f617574686f72697469657300b0c311002d0000007375626d69745f7265706f72745f65717569766f636174696f6e5f756e7369676e65645f65787472696e736963000000e8c311001c00000067656e65726174655f6b65795f6f776e6572736869705f70726f6f660cc411000d000000636f6e66696775726174696f6e00000024c411001300000063757272656e745f65706f63685f73746172740040c411000b000000617574686f7269746965730054c411001500000067656e65726174655f73657373696f6e5f6b65797300000074c41100130000006465636f64655f73657373696f6e5f6b6579730090c411000d0000006163636f756e745f6e6f6e6365000000a8c411000a00000071756572795f696e666f62616265000019000000000000000100000076000000760000007700000019000000000000000100000078000000790000007a0000000000000028c511000600000000000000000000002ec511000d00000000000000020000000000000000000000000000003cc511000c0000000000000000000000726f636f636f7061726974792d726f636f636f00df6acb689907609b0300000037e397fc7c91f5e40100000040fe3ad401f8959a04000000d2bc9897eed08f1502000000f78b278be53f454c02000000af2c0297a23e6d3d03000000ed99c5acb25eedf502000000cbca25e39f14238702000000687ad44ad37f03c201000000ab3c0572291feb8b01000000bc9d89904f5b923f0100000037c8bb1350a9a2a8010000006772616e62616265696d6f6e70617261617564697b00000008000000040000007c0000007c0000007d0000004d756c746973696753797374656d4261626554696d657374616d70496e646963657342616c616e636573417574686f72736869704f6666656e63657353657373696f6e46696e616c697479547261636b65724772616e647061496d4f6e6c696e65417574686f72697479446973636f7665727950617261636861696e734174746573746174696f6e735265676973747261725574696c6974794964656e746974795265636f7665727956657374696e675363686564756c65725375646f50726f787900000000000000c6110006000000000000007e000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000800000000000000000000000000000008100000000000000000000000000000082000000000000000000000000000000b4d11100180000000000000083000000000000000000000000000000000000000000000000000000020000000000000000000000000000000200000000000000000000000000000000000000840000000000000000000000000000008400000000000000000000000000000006c6110004000000000000008500000000000000000000000000000000000000000000000000000000000000860000000000000000000000020000000000000000000000000000000000000087000000000000000000000000000000840000000000000000000000000000000ac611000900000000000000880000000000000000000000000000000000000000000000000000000000000089000000000000000000000002000000000000000000000000000000000000008a0000000000000000000000000000008400000000000000000000000000000013c6110007000000000000008b000000000000000000000000000000000000000000000000000000000000008c0000000000000000000000000000008d00000000000000000000000000000084000000000000000000000000000000840000000000000000000000000000001ac6110008000000000000008e000000000000000000000000000000000000000000000000000000000000008f000000000000000000000000000000900000000000000000000000000000009100000000000000000000000000000092000000000000000000000000000000ccd11100120000000000000093000000000000000000000000000000000000000000000000000000020000000000000000000000000000000200000000000000000000000000000000000000940000000000000000000000000000008400000000000000000000000000000022c611000a000000000000009500000000000000000000000000000000000000000000000000000000000000960000000000000000000000020000000000000000000000000000000000000084000000000000000000000000000000970000000000000000000000000000002cc611000800000000000000980000000000000000000000000000000000000000000000000000000000000084000000000000000000000000000000990000000000000000000000000000008400000000000000000000000000000084000000000000000000000000000000ded111000a0000000200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000200000000000000000000000000000000000000840000000000000000000000000000008400000000000000000000000000000034c6110007000000000000009a000000000000000000000000000000000000000000000000000000000000009b0000000000000000000000000000009c000000000000000000000000000000840000000000000000000000000000009d0000000000000000000000000000003bc611000f000000000000009e000000000000000000000000000000000000000000000000000000000000009f00000000000000000000000200000000000000000000000000000000000000a0000000000000000000000000000000a10000000000000000000000000000004ac611000700000000000000a200000000000000000000000000000000000000000000000000000000000000a3000000000000000000000000000000a400000000000000000000000000000084000000000000000000000000000000a500000000000000000000000000000051c611000800000000000000a600000000000000000000000000000000000000000000000000000000000000a7000000000000000000000000000000a800000000000000000000000000000084000000000000000000000000000000a900000000000000000000000000000059c6110012000000020000000000000000000000000000000000000000000000000000000000000000000000840000000000000000000000020000000000000000000000000000000000000084000000000000000000000000000000840000000000000000000000000000006bc611000a00000000000000aa00000000000000000000000000000000000000000000000000000000000000ab0000000000000000000000020000000000000000000000000000000000000084000000000000000000000000000000ac00000000000000000000000000000075c611000c00000000000000ad00000000000000000000000000000000000000000000000000000000000000ae0000000000000000000000020000000000000000000000000000000000000084000000000000000000000000000000af00000000000000000000000000000081c611000900000000000000b000000000000000000000000000000000000000000000000000000000000000b1000000000000000000000000000000b200000000000000000000000000000084000000000000000000000000000000b30000000000000000000000000000008ac6110007000000020000000000000000000000000000000000000000000000000000000000000000000000b4000000000000000000000000000000b5000000000000000000000000000000840000000000000000000000000000008400000000000000000000000000000091c611000800000000000000b600000000000000000000000000000000000000000000000000000000000000b7000000000000000000000000000000b8000000000000000000000000000000b9000000000000000000000000000000ba00000000000000000000000000000099c611000800000000000000bb00000000000000000000000000000000000000000000000000000000000000bc000000000000000000000000000000bd000000000000000000000000000000be000000000000000000000000000000bf000000000000000000000000000000a1c611000700000000000000c000000000000000000000000000000000000000000000000000000000000000c1000000000000000000000000000000c2000000000000000000000000000000c3000000000000000000000000000000c4000000000000000000000000000000a8c611000900000000000000c500000000000000000000000000000000000000000000000000000000000000c6000000000000000000000000000000c700000000000000000000000000000084000000000000000000000000000000c8000000000000000000000000000000b1c611000400000000000000c900000000000000000000000000000000000000000000000000000000000000ca000000000000000000000000000000cb00000000000000000000000000000084000000000000000000000000000000cc000000000000000000000000000000b5c611000500000000000000cd00000000000000000000000000000000000000000000000000000000000000ce000000000000000000000000000000cf000000000000000000000000000000d0000000000000000000000000000000d1000000000000000000000000000000f8c511000800000000000000d200000000000000000000000000000000000000000000000000000000000000d3000000000000000000000000000000d400000000000000000000000000000084000000000000000000000000000000d5000000000000000000000052616e646f6d6e657373436f6c6c656374697665466c69705472616e73616374696f6e5061796d656e74486973746f726963616c72656d696e646572206f6620646976206279206320697320616c77617973206c657373207468616e20633b2071656400190000000800000004000000d600000051d21100710000006a00000012000000726573756c742063616e6e6f742066697420696e20753132382f686f6d652f6261737469616e2f2e636172676f2f6769742f636865636b6f7574732f7375627374726174652d376530383433336434633337306132312f383730363363332f7072696d6974697665732f61726974686d657469632f7372632f68656c706572735f3132386269742e72732f686f6d652f6261737469616e2f2e636172676f2f6769742f636865636b6f7574732f7375627374726174652d376530383433336434633337306132312f383730363363332f7072696d6974697665732f61726974686d657469632f7372632f7065725f7468696e67732e72730040d311006a0000006e000000090000002f686f6d652f6261737469616e2f2e636172676f2f6769742f636865636b6f7574732f7375627374726174652d376530383433336434633337306132312f383730363363332f7072696d6974697665732f61726974686d657469632f7372632f62696775696e742e727363616e6e6f74206669742061206e756d62657220696e746f20753132380040d311006a0000009d0000001b00000040d311006a0000007f0000000900000040d311006a00000091000000090000000000000000000000617474656d707420746f20646976696465206279207a65726f00000040d311006a000000450000000d000000616c7265616479206d757461626c7920626f72726f776564190000000000000001000000d700000064d411007d000000180300001b0000002f6e69782f73746f72652f39357734373162393862373934323470796c393364347a37686a6735693931372d727573742d312e34362e302d6e696768746c792d323032302d30362d33302d3136393537626434642f6c69622f727573746c69622f7372632f727573742f7372632f6c6962636f72652f63656c6c2e7273616c726561647920626f72726f776564000000190000000000000001000000d800000064d411007d000000630300001f0000002f686f6d652f6261737469616e2f2e636172676f2f6769742f636865636b6f7574732f7375627374726174652d376530383433336434633337306132312f383730363363332f7072696d6974697665732f61726974686d657469632f7372632f66697865645f706f696e742e7273617474656d707420746f206469766964652077697468206f766572666c6f7700000014d511006e0000004e0600000100000062616265736c6f74436f756c64206e6f74206465636f64652072657175657374656420696e686572656e742074797065214241424520696e686572656e742064617461206e6f7420666f756e6442616265565246496e4f7574436f6e7465787442414245736c6f74206e756d62657263757272656e742065706f6368636861696e2072616e646f6d6e6573731900000000000000010000001d00000060d611006f000000ce0000002a0000002f686f6d652f6261737469616e2f2e636172676f2f6769742f636865636b6f7574732f7375627374726174652d376530383433336434633337306132312f383730363363332f7072696d6974697665732f72756e74696d652d696e746572666163652f7372632f696d706c732e72730054e011000000000072756e74696d6552756e74696d65206d656d6f7279206578686175737465642e2041626f7274696e6700000054e011000000000014d71100020000003a20486f737420746f207761736d2076616c7565732061726520656e636f64656420636f72726563746c793b207165641900000000000000010000001d00000064d711007100000009010000260000002f686f6d652f6261737469616e2f2e636172676f2f6769742f636865636b6f7574732f7375627374726174652d376530383433336434633337306132312f383730363363332f7072696d6974697665732f72756e74696d652d696e746572666163652f7372632f706173735f62792e727348617368206e6f7420657175616c00000000000000000000000000617474656d707420746f20646976696465206279207a65726f0000001cd811006b000000600000002b0000002f686f6d652f6261737469616e2f2e636172676f2f6769742f636865636b6f7574732f7375627374726174652d376530383433336434633337306132312f383730363363332f7072696d6974697665732f72756e74696d652f7372632f67656e657269632f6572612e72732f686f6d652f6261737469616e2f2e636172676f2f6769742f636865636b6f7574732f7375627374726174652d376530383433336434633337306132312f383730363363332f7072696d6974697665732f72756e74696d652f7372632f7472616974732e727300000087d81100660000002004000013000000426164206f726967696e43616e206e6f74206c6f6f6b757044697370617463684572726f723c7761736d3a73747269707065643e5472616e73616374696f6e206469737061746368206973206d616e6461746f72793b207472616e73616374696f6e73206d6179206e6f742068617665206d616e6461746f727920646973706174636865732e412063616c6c20776173206c6162656c6c6564206173206d616e6461746f72792c2062757420726573756c74656420696e20616e204572726f722e5472616e73616374696f6e20776f756c642065786861757374732074686520626c6f636b206c696d6974735472616e73616374696f6e2068617320616e20616e6369656e7420626972746820626c6f636b5472616e73616374696f6e20686173206120626164207369676e61747572655472616e73616374696f6e206973206f757464617465645472616e73616374696f6e2077696c6c2062652076616c696420696e2074686520667574757265496e6162696c69747920746f2070617920736f6d6520666565732028652e672e206163636f756e742062616c616e636520746f6f206c6f77295472616e73616374696f6e2063616c6c206973206e6f74206578706563746564496e76616c69645472616e73616374696f6e20637573746f6d206572726f72436f756c64206e6f742066696e6420616e20756e7369676e65642076616c696461746f7220666f722074686520756e7369676e6564207472616e73616374696f6e436f756c64206e6f74206c6f6f6b757020696e666f726d6174696f6e20726571756972656420746f2076616c696461746520746865207472616e73616374696f6e556e6b6e6f776e5472616e73616374696f6e20637573746f6d206572726f7298db110067000000460000001f0000002f686f6d652f6261737469616e2f2e636172676f2f6769742f636865636b6f7574732f7375627374726174652d376530383433336434633337306132312f383730363363332f7072696d6974697665732f747269652f7372632f6e6f64655f636f6465632e72730098db1100670000004f000000140000006c656e20213d20302073696e6365206c656e2025203220213d20303b20696e6e6572206861732061206c61737420656c656d656e743b2071656400005cdc1100640000003d000000120000002f686f6d652f6261737469616e2f2e636172676f2f72656769737472792f7372632f6769746875622e636f6d2d316563633632393964623965633832332f747269652d64622d302e32322e302f7372632f6e6962626c652f6e6962626c657665632e72735cdc11006400000060000000330000005cdc110064000000600000000d0000005cdc1100640000006b0000000f0000005cdc1100640000006b0000003e0000005cdc110064000000690000000f0000005cdc11006400000091000000390000005cdc11006400000091000000110000005cdc11006400000093000000110000005cdc110064000000940000004000000070dd110066000000980000001700000070dd11006600000096000000290000002f686f6d652f6261737469616e2f2e636172676f2f72656769737472792f7372632f6769746875622e636f6d2d316563633632393964623965633832332f747269652d64622d302e32322e302f7372632f6e6962626c652f6e6962626c65736c6963652e7273000084df11005e0000004d0000001c00000070dd110066000000400000001200000070dd110066000000550000003200000070dd1100660000004f0000002d00000070dd110066000000e10000000f00000070dd110066000000df0000000f00000070dd110066000000e10000003d0000006361706163697479206f766572666c6f770000007ce01100830000000a00000009000000617373657274696f6e206661696c65643a206e65775f636170203e3d206c656e617373657274696f6e206661696c65643a20696e646578203c3d206c656e000084df11005e0000008d0000003c00000084df11005e0000008d0000005100000084df11005e0000008d00000031000000fcde1100580000004b00000042000000fcde1100580000004a0000003e0000002f686f6d652f6261737469616e2f2e636172676f2f72656769737472792f7372632f6769746875622e636f6d2d316563633632393964623965633832332f747269652d64622d302e32322e302f7372632f6e6f64652e7273fcde1100580000006b00000022000000fcde1100580000009a00000032000000fcde110058000000aa0000003e0000002f686f6d652f6261737469616e2f2e636172676f2f72656769737472792f7372632f6769746875622e636f6d2d316563633632393964623965633832332f747269652d64622d302e32322e302f7372632f6e6962626c652f6d6f642e7273000084df11005e000000860000003100000084df11005e000000860000004200000084df11005e000000860000002600000084df11005e000000870000001d00000084df11005e000000870000000d00000084df11005e0000008e0000001800000084df11005e0000008e0000000d000000ffe011002d0000002ce111000c00000038e11100030000007ce011008300000010000000090000002f6e69782f73746f72652f39357734373162393862373934323470796c393364347a37686a6735693931372d727573742d312e34362e302d6e696768746c792d323032302d30362d33302d3136393537626434642f6c69622f727573746c69622f7372632f727573742f7372632f6c6962636f72652f6d6163726f732f6d6f642e7273617373657274696f6e206661696c65643a2060286c656674203d3d20726967687429600a20206c6566743a2060602c0a2072696768743a2060603a200041bcc2c7000b0c4f8167f754e01100981010000041c8c2c7000b08000000000000000000ef8b04046e616d6501e68b04d506001c6578745f616c6c6f6361746f725f667265655f76657273696f6e5f31011e6578745f616c6c6f6361746f725f6d616c6c6f635f76657273696f6e5f3102256578745f63727970746f5f656432353531395f67656e65726174655f76657273696f6e5f3103236578745f63727970746f5f656432353531395f7665726966795f76657273696f6e5f3104286578745f63727970746f5f66696e6973685f62617463685f7665726966795f76657273696f6e5f3105376578745f63727970746f5f736563703235366b315f65636473615f7265636f7665725f636f6d707265737365645f76657273696f6e5f3106256578745f63727970746f5f737232353531395f67656e65726174655f76657273696f6e5f3107286578745f63727970746f5f737232353531395f7075626c69635f6b6579735f76657273696f6e5f3108216578745f63727970746f5f737232353531395f7369676e5f76657273696f6e5f3109236578745f63727970746f5f737232353531395f7665726966795f76657273696f6e5f320a276578745f63727970746f5f73746172745f62617463685f7665726966795f76657273696f6e5f310b2a6578745f747269655f626c616b65325f3235365f6f7264657265645f726f6f745f76657273696f6e5f310c1c6578745f6d6973635f7072696e745f6865785f76657273696f6e5f310d1c6578745f6d6973635f7072696e745f6e756d5f76657273696f6e5f310e1d6578745f6d6973635f7072696e745f757466385f76657273696f6e5f310f226578745f6d6973635f72756e74696d655f76657273696f6e5f76657273696f6e5f3110206578745f68617368696e675f626c616b65325f3132385f76657273696f6e5f3111206578745f68617368696e675f626c616b65325f3235365f76657273696f6e5f31121e6578745f68617368696e675f74776f785f3132385f76657273696f6e5f31131d6578745f68617368696e675f74776f785f36345f76657273696f6e5f3114236578745f6f6666636861696e5f69735f76616c696461746f725f76657273696f6e5f3115346578745f6f6666636861696e5f6c6f63616c5f73746f726167655f636f6d706172655f616e645f7365745f76657273696f6e5f3116286578745f6f6666636861696e5f6c6f63616c5f73746f726167655f6765745f76657273696f6e5f3117286578745f6f6666636861696e5f6c6f63616c5f73746f726167655f7365745f76657273696f6e5f3118246578745f6f6666636861696e5f6e6574776f726b5f73746174655f76657273696f6e5f3119296578745f6f6666636861696e5f7375626d69745f7472616e73616374696f6e5f76657273696f6e5f311a1c6578745f73746f726167655f617070656e645f76657273696f6e5f311b226578745f73746f726167655f6368616e6765735f726f6f745f76657273696f6e5f311c1b6578745f73746f726167655f636c6561725f76657273696f6e5f311d226578745f73746f726167655f636c6561725f7072656669785f76657273696f6e5f311e196578745f73746f726167655f6765745f76657273696f6e5f311f1e6578745f73746f726167655f6e6578745f6b65795f76657273696f6e5f31201a6578745f73746f726167655f726561645f76657273696f6e5f31211a6578745f73746f726167655f726f6f745f76657273696f6e5f3122196578745f73746f726167655f7365745f76657273696f6e5f3123196578745f6c6f6767696e675f6c6f675f76657273696f6e5f31240c5f5f727573745f616c6c6f63250a5f5f72675f616c6c6f63260e5f5f727573745f6465616c6c6f63270c5f5f72675f6465616c6c6f63280e5f5f727573745f7265616c6c6f63290c5f5f72675f7265616c6c6f632a135f5f727573745f616c6c6f635f7a65726f65642b115f5f72675f616c6c6f635f7a65726f65642c33616c6c6f633a3a616c6c6f633a3a68616e646c655f616c6c6f635f6572726f723a3a68653632313735653032626233666365652d08727573745f6f6f6d2e34616c6c6f633a3a7261775f7665633a3a63617061636974795f6f766572666c6f773a3a68613336393737366230373631383065652f29636f72653a3a70616e69636b696e673a3a70616e69633a3a6839346334623863356132363962363731302e616c6c6f633a3a7665633a3a5665633c543e3a3a726573657276653a3a68326664393833333333373438666634363125616c6c6f633a3a666d743a3a666f726d61743a3a68643637636237326439366365616537343236636f72653a3a70616e69636b696e673a3a70616e69635f626f756e64735f636865636b3a3a68613434306634316430653465636135663348616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a616c6c6f636174655f696e3a3a7b7b636c6f737572657d7d3a3a68303133303137326566613837613461653448616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a616c6c6f636174655f696e3a3a7b7b636c6f737572657d7d3a3a68303034366462373935323539353336313523636f72653a3a666d743a3a77726974653a3a68386239393664386166303134373563393633636f72653a3a6f7074696f6e3a3a6578706563745f6e6f6e655f6661696c65643a3a6838303738353131373231323537393064372b636f72653a3a7074723a3a64726f705f696e5f706c6163653a3a6830313861303038323436343338333764383a3c266d7574205720617320636f72653a3a666d743a3a57726974653e3a3a77726974655f7374723a3a6837616334366139636662626237663461393b3c266d7574205720617320636f72653a3a666d743a3a57726974653e3a3a77726974655f636861723a3a68653539656531663161303234396433323a3a3c266d7574205720617320636f72653a3a666d743a3a57726974653e3a3a77726974655f666d743a3a68633030396438636138326136323866333b3c616c6c6f633a3a7665633a3a5665633c543e3a3a696e736572743a3a6173736572745f6661696c65643a3a68326566373438333464333633663232323c4e636f72653a3a666d743a3a6e756d3a3a696d703a3a3c696d706c20636f72653a3a666d743a3a446973706c617920666f72207533323e3a3a666d743a3a68643732333966663762346432373961393d2d636f72653a3a70616e69636b696e673a3a70616e69635f666d743a3a68363266376536303563646636356438333e3c616c6c6f633a3a7665633a3a5665633c543e3a3a72656d6f76653a3a6173736572745f6661696c65643a3a68643539363966396362383933383437313f41616c6c6f633a3a7665633a3a5665633c543e3a3a647261696e3a3a73746172745f6173736572745f6661696c65643a3a6864646434393434383437313434653633403f616c6c6f633a3a7665633a3a5665633c543e3a3a647261696e3a3a656e645f6173736572745f6661696c65643a3a68326530323239653865373632663830304139636f72653a3a6f70733a3a66756e6374696f6e3a3a466e4f6e63653a3a63616c6c5f6f6e63653a3a6862623166383165373465613561666362422f636f72653a3a666d743a3a6e756d3a3a696d703a3a666d745f7536343a3a68353038316364363232323036356666324311727573745f626567696e5f756e77696e6444313c5420617320636f72653a3a616e793a3a416e793e3a3a747970655f69643a3a68343666323535323531313665396437634535636f72653a3a666d743a3a466f726d61747465723a3a7061645f696e74656772616c3a3a68666436353332623361343165653538344643636f72653a3a666d743a3a466f726d61747465723a3a7061645f696e74656772616c3a3a77726974655f7072656669783a3a68363264373865303166366665343461394734636f72653a3a736c6963653a3a736c6963655f696e6465785f6c656e5f6661696c3a3a68366534666663353665383436303233384836636f72653a3a736c6963653a3a736c6963655f696e6465785f6f726465725f6661696c3a3a6830303962373431346231373064363864492c636f72653a3a666d743a3a466f726d61747465723a3a7061643a3a68363731633633656232653631393637634a2e636f72653a3a7374723a3a736c6963655f6572726f725f6661696c3a3a68626664643838393335666463613565614b323c265420617320636f72653a3a666d743a3a446973706c61793e3a3a666d743a3a68356434336134343437613230356536654c4a3c636f72653a3a6f70733a3a72616e67653a3a52616e67653c4964783e20617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a68386338613937623836363031303139364d323c6368617220617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a68353161356131613465363632666638304e47636f72653a3a756e69636f64653a3a756e69636f64655f646174613a3a6772617068656d655f657874656e643a3a6c6f6f6b75703a3a68316666386161666230623631653664624f32636f72653a3a756e69636f64653a3a7072696e7461626c653a3a636865636b3a3a68386637326663363333633535303737665049636f72653a3a666d743a3a6e756d3a3a3c696d706c20636f72653a3a666d743a3a446562756720666f72207573697a653e3a3a666d743a3a686439636361643930306463343933373351453c636f72653a3a63656c6c3a3a426f72726f774572726f7220617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a683264666531646132313831643233636252483c636f72653a3a63656c6c3a3a426f72726f774d75744572726f7220617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6864363263656565646535323462383636532e636f72653a3a6f7074696f6e3a3a6578706563745f6661696c65643a3a683136653931616233356565313062343654303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a683465336439326132303130393332393655323c265420617320636f72653a3a666d743a3a446973706c61793e3a3a666d743a3a683533316164306131613231323765346156533c636f72653a3a666d743a3a6275696c646572733a3a5061644164617074657220617320636f72653a3a666d743a3a57726974653e3a3a77726974655f7374723a3a6836333666376138303163336364366463572e636f72653a3a736c6963653a3a6d656d6368723a3a6d656d6368723a3a6863373431653832636430303036316535582f636f72653a3a666d743a3a57726974653a3a77726974655f636861723a3a6863343962306130636531313234303565592e636f72653a3a666d743a3a57726974653a3a77726974655f666d743a3a68666665616534626662336532373830665a3a3c266d7574205720617320636f72653a3a666d743a3a57726974653e3a3a77726974655f7374723a3a68303239336431643562663030386430365b3b3c266d7574205720617320636f72653a3a666d743a3a57726974653e3a3a77726974655f636861723a3a68636362323039373264393463383036615c3a3c266d7574205720617320636f72653a3a666d743a3a57726974653e3a3a77726974655f666d743a3a68363162353730316535353330333966375d39636f72653a3a666d743a3a6275696c646572733a3a44656275675475706c653a3a6669656c643a3a68633230333562333664386530643261645e443c636f72653a3a666d743a3a417267756d656e747320617320636f72653a3a666d743a3a446973706c61793e3a3a666d743a3a68633031626238373335313438633732365f313c73747220617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6862326439653463323663616330393935608001636f72653a3a7374723a3a7472616974733a3a3c696d706c20636f72653a3a736c6963653a3a536c696365496e6465783c7374723e20666f7220636f72653a3a6f70733a3a72616e67653a3a52616e67653c7573697a653e3e3a3a696e6465783a3a7b7b636c6f737572657d7d3a3a68623965386634643732643637653933356147636f72653a3a666d743a3a6e756d3a3a3c696d706c20636f72653a3a666d743a3a42696e61727920666f722069383e3a3a666d743a3a6833353561643532653161646137623134624a636f72653a3a666d743a3a6e756d3a3a3c696d706c20636f72653a3a666d743a3a557070657248657820666f72206933323e3a3a666d743a3a6834643733343930623063636562373936633e3c636f72653a3a666d743a3a4572726f7220617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6835333665363830323363633462616533645a637572766532353531395f64616c656b3a3a6261636b656e643a3a73657269616c3a3a7536343a3a6669656c643a3a4669656c64456c656d656e7435313a3a746f5f62797465733a3a6830393531643738613764653633313737659201637572766532353531395f64616c656b3a3a6669656c643a3a3c696d706c20737562746c653a3a436f6e7374616e7454696d65457120666f7220637572766532353531395f64616c656b3a3a6261636b656e643a3a73657269616c3a3a7536343a3a6669656c643a3a4669656c64456c656d656e7435313e3a3a63745f65713a3a68623133373865663162356631323032656624737562746c653a3a626c61636b5f626f783a3a68376230666664303465623963363730666757637572766532353531395f64616c656b3a3a6261636b656e643a3a73657269616c3a3a7536343a3a6669656c643a3a4669656c64456c656d656e7435313a3a706f77326b3a3a6864383232323234376135656461396438687e637572766532353531395f64616c656b3a3a6669656c643a3a3c696d706c20637572766532353531395f64616c656b3a3a6261636b656e643a3a73657269616c3a3a7536343a3a6669656c643a3a4669656c64456c656d656e7435313e3a3a737172745f726174696f5f693a3a6831376163643437383936303734346165695a637572766532353531395f64616c656b3a3a72697374726574746f3a3a52697374726574746f506f696e743a3a656c6c696761746f725f72697374726574746f5f666c61766f723a3a68386364616166376531356262376533336a49637572766532353531395f64616c656b3a3a7363616c61723a3a5363616c61723a3a66726f6d5f63616e6f6e6963616c5f62797465733a3a68306161323833623732643632303939366b483c5b545d206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a68356535663538306162366364613632336c6c3c7061726974795f7363616c655f636f6465633a3a636f6d706163743a3a436f6d706163743c543e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a68336530336338353063663732313832366d37616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a726573657276653a3a68323433663138363235666239323735376e3a7061726974795f7363616c655f636f6465633a3a636f6465633a3a4f75747075743a3a707573683a3a68336534623230356261623737333830316f3a7061726974795f7363616c655f636f6465633a3a636f6465633a3a4f75747075743a3a707573683a3a6864323662363561303561326634393036703a7061726974795f7363616c655f636f6465633a3a636f6465633a3a4f75747075743a3a707573683a3a683139653839376633303761633532306171483c5b545d206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a6866623836363664613163616230346339723a7061726974795f7363616c655f636f6465633a3a636f6465633a3a4f75747075743a3a707573683a3a683462383864663565333738353961646473513c616c6c6f633a3a7665633a3a5665633c543e20617320616c6c6f633a3a7665633a3a53706563457874656e643c542c493e3e3a3a66726f6d5f697465723a3a6836326163663332643830626132643833743a3c266d7574205720617320636f72653a3a666d743a3a57726974653e3a3a77726974655f7374723a3a6830626165366431323835323461623531753a3c266d7574205720617320636f72653a3a666d743a3a57726974653e3a3a77726974655f666d743a3a6866393963623535633662383161343831764d3c6672616d655f737570706f72743a3a64656275673a3a52756e74696d654c6f67676572206173206c6f673a3a4c6f673e3a3a656e61626c65643a3a683630343139346337636439353431666377493c6672616d655f737570706f72743a3a64656275673a3a52756e74696d654c6f67676572206173206c6f673a3a4c6f673e3a3a6c6f673a3a683864346464633634643437336335623278323c265420617320636f72653a3a666d743a3a446973706c61793e3a3a666d743a3a6837343232323361653065303339373233794273705f696f3a3a6c6f6767696e673a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a6c6f673a3a68636138393936396338313134386631317a206b656363616b3a3a66313630303a3a68623764386665303334666634363062337b383c6c6f673a3a4e6f704c6f67676572206173206c6f673a3a4c6f673e3a3a656e61626c65643a3a68613335383238356434366663616432387c343c6c6f673a3a4e6f704c6f67676572206173206c6f673a3a4c6f673e3a3a6c6f673a3a68316637326539323462333563613064647d363c6c6f673a3a4e6f704c6f67676572206173206c6f673a3a4c6f673e3a3a666c7573683a3a68383234326330616232623665633035657e366d65726c696e3a3a7374726f62653a3a5374726f62653132383a3a626567696e5f6f703a3a68353636363836323334636166333933317f303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a68313033313635656563353434323933398001366d65726c696e3a3a7472616e7363726970743a3a5472616e7363726970743a3a6e65773a3a68393637623031386331316636633038388101416d65726c696e3a3a7472616e7363726970743a3a5472616e7363726970743a3a617070656e645f6d6573736167653a3a683965356639326362623666316335353682013d6d65726c696e3a3a7472616e7363726970743a3a5472616e7363726970743a3a617070656e645f7536343a3a68333434333833373265373065386234398301426d65726c696e3a3a7472616e7363726970743a3a5472616e7363726970743a3a6368616c6c656e67655f62797465733a3a68326633313338663230613830663562338401513c616c6c6f633a3a7665633a3a5665633c543e20617320616c6c6f633a3a7665633a3a53706563457874656e643c542c493e3e3a3a66726f6d5f697465723a3a68343966613337346633366565376437628501573c70616c6c65745f6964656e746974793a3a44617461206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64653a3a683039313132666330333437633462326286013a70616c6c65745f74696d657374616d703a3a657874726163745f696e686572656e745f646174613a3a68326562643639356236663064386466308701453c737472206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64653a3a6863366436366233663533653265616162880149706f6c6b61646f745f72756e74696d655f636f6d6d6f6e3a3a70617261636861696e733a3a6c6f63616c697a65645f7061796c6f61643a3a683335353839653363356332323261636589013a7061726974795f7363616c655f636f6465633a3a636f6465633a3a4f75747075743a3a707573683a3a68623664623936333730353164613761378a014a706f6c6b61646f745f72756e74696d655f636f6d6d6f6e3a3a70617261636861696e733a3a6d616b655f736f727465645f6475746965733a3a68313464333963346134333764646337378b01693c616c6c6f633a3a7665633a3a5665633c543e20617320616c6c6f633a3a7665633a3a53706563457874656e643c542c616c6c6f633a3a7665633a3a496e746f497465723c543e3e3e3a3a737065635f657874656e643a3a68386432333031373230313832323832358c017c7061726974795f7363616c655f636f6465633a3a636f6465633a3a696e6e65725f7475706c655f696d706c3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f646520666f72202851302c5230293e3a3a6465636f64653a3a68316161666337346164383264303762368d016b3c7061726974795f7363616c655f636f6465633a3a636f6d706163743a3a436f6d706163743c7533323e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a68633262633663623164623230326135308e01543c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a68313938323934633264303661393564668f016b3c7061726974795f7363616c655f636f6465633a3a636f6d706163743a3a436f6d706163743c7533323e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6863656237373237303139626431326262900137616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a726573657276653a3a683162363066643435336639356362393791017c7061726974795f7363616c655f636f6465633a3a636f6465633a3a696e6e65725f7475706c655f696d706c3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f646520666f72202851302c5230293e3a3a6465636f64653a3a68363238333566663339623665666261669201543c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6834633033376662663932623061623062930137616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a726573657276653a3a68343739356138613937323762646436349401437061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a68356565646365323138343536363366389501483c5b545d206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a683832643165356431316662643465616496014973705f696f3a3a68617368696e673a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a626c616b65325f3235363a3a686233393332623632633561316366393497013a7061726974795f7363616c655f636f6465633a3a636f6465633a3a4f75747075743a3a707573683a3a683131663238333238353234383934303298013a7061726974795f7363616c655f636f6465633a3a636f6465633a3a4f75747075743a3a707573683a3a683164376561633664303631653132313099013a7061726974795f7363616c655f636f6465633a3a636f6465633a3a4f75747075743a3a707573683a3a68323738353236343639666665643737339a013a7061726974795f7363616c655f636f6465633a3a636f6465633a3a4f75747075743a3a707573683a3a68353266353732316266333737636230329b013a7061726974795f7363616c655f636f6465633a3a636f6465633a3a4f75747075743a3a707573683a3a68353530623533366231386634663138349c01437061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a68656330653863396264393962636533399d013a7061726974795f7363616c655f636f6465633a3a636f6465633a3a4f75747075743a3a707573683a3a68613765663065613533663734386135639e013a7061726974795f7363616c655f636f6465633a3a636f6465633a3a4f75747075743a3a707573683a3a68366337333065636639613761656337669f013a7061726974795f7363616c655f636f6465633a3a636f6465633a3a4f75747075743a3a707573683a3a6837376438666365383431623061333235a0013a7061726974795f7363616c655f636f6465633a3a636f6465633a3a4f75747075743a3a707573683a3a6838343039383033353639623438663338a101437061726974795f7363616c655f636f6465633a3a636f6465633a3a636f6d706163745f656e636f64655f6c656e5f746f3a3a6832323362363236383030666464306461a2016f3c73705f72756e74696d653a3a67656e657269633a3a6469676573743a3a4469676573744974656d3c486173683e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64653a3a6864326234346461376362643631623834a3013a7061726974795f7363616c655f636f6465633a3a636f6465633a3a4f75747075743a3a707573683a3a6838376630396436643732343461373366a4013a7061726974795f7363616c655f636f6465633a3a636f6465633a3a4f75747075743a3a707573683a3a6838636564326635316566613131656539a5013a7061726974795f7363616c655f636f6465633a3a636f6465633a3a4f75747075743a3a707573683a3a6838663832663066313333333365643864a6013a7061726974795f7363616c655f636f6465633a3a636f6465633a3a4f75747075743a3a707573683a3a6839363966363839363831663831303236a7013a7061726974795f7363616c655f636f6465633a3a636f6465633a3a4f75747075743a3a707573683a3a6861326531393631323663363661323239a8013a7061726974795f7363616c655f636f6465633a3a636f6465633a3a4f75747075743a3a707573683a3a6863633135653937663964616439396138a9013a7061726974795f7363616c655f636f6465633a3a636f6465633a3a4f75747075743a3a707573683a3a6861386362646336643334383538613234aa013a7061726974795f7363616c655f636f6465633a3a636f6465633a3a4f75747075743a3a707573683a3a6861643762363332303734343133646235ab013a7061726974795f7363616c655f636f6465633a3a636f6465633a3a4f75747075743a3a707573683a3a6863383237333234343737343732336163ac013a7061726974795f7363616c655f636f6465633a3a636f6465633a3a4f75747075743a3a707573683a3a6864363362386138363334653537303665ad013a7061726974795f7363616c655f636f6465633a3a636f6465633a3a4f75747075743a3a707573683a3a6864383936383737626662663137613464ae013a7061726974795f7363616c655f636f6465633a3a636f6465633a3a4f75747075743a3a707573683a3a6864386432353237656162323838303031af013a7061726974795f7363616c655f636f6465633a3a636f6465633a3a4f75747075743a3a707573683a3a6866306637643531383535346533643663b001303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6864363136633836623336663566643832b1013a636f72653a3a666d743a3a6275696c646572733a3a44656275674c6973743a3a656e74726965733a3a6864386561666435323162313666323733b2014a3c58206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653e3a3a7573696e675f656e636f6465643a3a6834363837336466363637323065383334b3014273705f696f3a3a73746f726167653a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a7365743a3a6862313039316161313265383232613936b4013c7061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653a3a656e636f64653a3a6832316432653433353738346636363532b5014a3c58206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653e3a3a7573696e675f656e636f6465643a3a6865333838383236643634626566393132b601483c5b545d206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a6830393962326231343762356630663835b701433c58206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64653a3a6830663565313766613832366662303732b801433c58206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64653a3a6838636166616332656562336539366534b901433c58206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64653a3a6839396466343635313163646334336366ba015c3c636f72653a3a6f7074696f6e3a3a4f7074696f6e3c543e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a6864653336316432656131303061316539bb01433c58206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64653a3a6862666439623263333761646538323438bc01433c58206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64653a3a6864346365326536616636616634303337bd01433c58206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64653a3a6864663436333135356561663639663562be012e616c6c6f633a3a7665633a3a5665633c543e3a3a726573657276653a3a6830363632303162343563313962623462bf012e616c6c6f633a3a7665633a3a5665633c543e3a3a726573657276653a3a6861663436653265636636666136663231c001443c616c6c6f633a3a7665633a3a5665633c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a6834653330373539346336643032383634c10137616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a726573657276653a3a6834336166313439663831313635326132c201443c616c6c6f633a3a7665633a3a5665633c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a6866323664366334346663626366376332c301443c616c6c6f633a3a7665633a3a5665633c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a6835313462356135343037353162633363c401443c616c6c6f633a3a7665633a3a5665633c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a6835633837336238633534643237643633c50137616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a726573657276653a3a6862313934326538656235623835386230c6014b3c726f636f636f5f72756e74696d653a3a43616c6c20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a68666235613862353665626234353231352e32393537c701443c616c6c6f633a3a7665633a3a5665633c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a6835663464666632653864393437653865c801443c616c6c6f633a3a7665633a3a5665633c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a6836333832653735656663326635653730c90137616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a726573657276653a3a6832613731346666656530356239333331ca01443c616c6c6f633a3a7665633a3a5665633c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a6836663064373830653037346663613931cb0137616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a726573657276653a3a6831396462373236623662313533366435cc01443c616c6c6f633a3a7665633a3a5665633c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a6862633931623132616636653664313265cd0137616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a726573657276653a3a6839303664666136393230393866316163ce01443c616c6c6f633a3a7665633a3a5665633c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a6863636362363733626664616564663038cf0137616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a726573657276653a3a6833306639656161383637613737666665d001443c616c6c6f633a3a7665633a3a5665633c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a6865396664306233323230366435336532d10137616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a726573657276653a3a6834633266373462306135356433393864d201543c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6836636135336131613438356537396261d3019c013c73705f72756e74696d653a3a67656e657269633a3a756e636865636b65645f65787472696e7369633a3a556e636865636b656445787472696e7369633c416464726573732c43616c6c2c5369676e61747572652c45787472613e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6862316531303764663636336338386632d40137616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a726573657276653a3a6834323532376564643262316162613766d5012b636f72653a3a7074723a3a64726f705f696e5f706c6163653a3a6865333737343231393432626563363130d601463c616c6c6f633a3a7665633a3a5665633c543e20617320636f72653a3a6f70733a3a64726f703a3a44726f703e3a3a64726f703a3a6833373434623330643739653564613465d7012b636f72653a3a7074723a3a64726f705f696e5f706c6163653a3a6834656632316565653039316564313738d801533c616c6c6f633a3a7665633a3a5665633c543e20617320616c6c6f633a3a7665633a3a53706563457874656e643c542c493e3e3a3a737065635f657874656e643a3a6865366439376132653733343437346562d901543c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6831376661663162323463393265323962da01543c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6831616164663366396332616365643063db01543c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6831633830363131373965626261303138dc01493c5b543b2036345d206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6838313363623034316461376265636361dd01543c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6837653231376334626664333538353862de01376269747665633a3a7665633a3a4269745665633c4f2c543e3a3a66726f6d5f736c6963653a3a6831666563303962663732383537343364df014d6269747665633a3a7665633a3a6170693a3a3c696d706c206269747665633a3a7665633a3a4269745665633c4f2c543e3e3a3a7365745f6c656e3a3a6865313439653561613330366563663332e00137616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a726573657276653a3a6862376663633432613637333664646237e101543c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6834346561396132316666323236326134e201543c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6835336666303035613762303561616133e301543c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6861343563396136366531643661656138e40137616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a726573657276653a3a6862663862333536386462306336306435e501543c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6862303732393730303231393336663633e601543c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6866616663383835626637666437663563e70137616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a726573657276653a3a6838626435636563373132646534363436e80137616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a726573657276653a3a6831333638383532323562613532363337e90137616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a726573657276653a3a6831373032633963633964336237626166ea0137616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a726573657276653a3a6832643264356664386432633036323862eb0137616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a726573657276653a3a6833626665383962366132376232326233ec0137616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a726573657276653a3a6834616131313863353937626566363264ed0137616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a726573657276653a3a6837353234636165333666616363353732ee0137616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a726573657276653a3a6839303532396666653735303066613063ef0137616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a726573657276653a3a6839313631643535643933343236663362f00137616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a726573657276653a3a6839336239623135393062646532626533f10137616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a726573657276653a3a6839616463333934373263656466386431f20137616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a726573657276653a3a6862636536616530303539356138316639f30137616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a726573657276653a3a6863346634666531363161356261333936f40137616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a726573657276653a3a6863373963663562363037666132386235f50137616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a726573657276653a3a6864326437346463333364353131333334f60137616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a726573657276653a3a6865396164633035373766646165393139f70137616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a726573657276653a3a6866616133663438386266626138376434f801723c70616c6c65745f72616e646f6d6e6573735f636f6c6c6563746976655f666c69703a3a4d6f64756c653c543e206173206672616d655f6d657461646174613a3a4d6f64756c654572726f724d657461646174613e3a3a6d657461646174613a3a6866396330346239613337356234326532f901733c706f6c6b61646f745f72756e74696d655f636f6d6d6f6e3a3a7265676973747261723a3a4d6f64756c653c543e206173206672616d655f6d657461646174613a3a4d6f64756c654572726f724d657461646174613e3a3a6d657461646174613a3a6865353266623730653163626338333034fa01713c285475706c65456c656d656e74302c5475706c65456c656d656e743129206173206672616d655f737570706f72743a3a7472616974733a3a4f6e46696e616c697a653c426c6f636b4e756d6265723e3e3a3a6f6e5f66696e616c697a653a3a6839363833396661636637613238306238fb014773705f696f3a3a68617368696e673a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a74776f785f3132383a3a6831336463633238336331666666313461fc01386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6839613664306266626232346363623861fd01386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6839636166643634333633616432306531fe01386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6862393631643433343161323764303830ff014473705f696f3a3a73746f726167653a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a636c6561723a3a68373735656265393264633030333633328002386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a7075743a3a686131623232333563353561396633643481024373705f696f3a3a73746f726167653a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a726561643a3a683935613735333637353361383134343082024273705f696f3a3a73746f726167653a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a6765743a3a68666464336662333534356530313933398302303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a683438313535346633336636356534383684024673705f696f3a3a6d6973633a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a7072696e745f757466383a3a683331313862613231653931356264393485023c7061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653a3a656e636f64653a3a68623539366165646236366138363661388602376672616d655f73797374656d3a3a4d6f64756c653c543e3a3a6465706f7369745f6c6f673a3a68363333343738636366646265393830308702416672616d655f73797374656d3a3a4d6f64756c653c543e3a3a6465706f7369745f6576656e745f696e64657865643a3a686337613361363164396666333630323388023c7061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653a3a656e636f64653a3a68373334353432353863373066323736378902386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a68643461393333376235656462373431648a02386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a68333163306361333838373031376239648b02386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a7075743a3a68653765393034383631636466356234618c02386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a68623435343063616132366432306138348d02386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a68363930613066643330653936383464368e024673705f61726974686d657469633a3a68656c706572735f3132386269743a3a6d756c7469706c795f62795f726174696f6e616c3a3a68346236323532323033383839306265318f02386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a68303761373966303665623535633461399002386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a683434376362396561626130643530326291025c6672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6d61703a3a53746f726167654d61703a3a73746f726167655f6d61705f66696e616c5f6b65793a3a68303164336332316165323261386431309202386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a68366436323738633738666464363261659302653c73705f61726974686d657469633a3a66697865645f706f696e743a3a46697865645531323820617320636f72653a3a6f70733a3a61726974683a3a4469763e3a3a6469763a3a7b7b636c6f737572657d7d3a3a68613536383834643037366331376436649402a9013c706f6c6b61646f745f72756e74696d655f636f6d6d6f6e3a3a7265676973747261723a3a4d6f64756c653c543e20617320706f6c6b61646f745f72756e74696d655f636f6d6d6f6e3a3a7265676973747261723a3a5265676973747261723c3c54206173206672616d655f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a72656769737465725f706172613a3a686264353237353037303863663130616195025c6672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6d61703a3a53746f726167654d61703a3a73746f726167655f6d61705f66696e616c5f6b65793a3a68643465326365353731366130333562649602a301706f6c6b61646f745f72756e74696d655f636f6d6d6f6e3a3a7265676973747261723a3a3c696d706c20636f72653a3a636f6e766572743a3a46726f6d3c706f6c6b61646f745f72756e74696d655f636f6d6d6f6e3a3a7265676973747261723a3a4572726f723c543e3e20666f722073705f72756e74696d653a3a44697370617463684572726f723e3a3a66726f6d3a3a68366535326438303138326438336265669702386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a7075743a3a686336346563626236386234326265323998025c6672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6d61703a3a53746f726167654d61703a3a73746f726167655f6d61705f66696e616c5f6b65793a3a68306363643230313737613938623334399902386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a7075743a3a68353066353830343664333863396466359a025c6672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6d61703a3a53746f726167654d61703a3a73746f726167655f6d61705f66696e616c5f6b65793a3a68653764313339313934343138396136659b02ab013c706f6c6b61646f745f72756e74696d655f636f6d6d6f6e3a3a7265676973747261723a3a4d6f64756c653c543e20617320706f6c6b61646f745f72756e74696d655f636f6d6d6f6e3a3a7265676973747261723a3a5265676973747261723c3c54206173206672616d655f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a646572656769737465725f706172613a3a68623031663336303266613430663736659c02386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a68333638333835343066336264663733619d02386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a68313863313336323861326532326336349e025c6672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6d61703a3a53746f726167654d61703a3a73746f726167655f6d61705f66696e616c5f6b65793a3a68366232393466636236623336326231629f025c6672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6d61703a3a53746f726167654d61703a3a73746f726167655f6d61705f66696e616c5f6b65793a3a6834383935666437303864363831623161a00251706f6c6b61646f745f72756e74696d655f636f6d6d6f6e3a3a70617261636861696e733a3a4d6f64756c653c543e3a3a6e6f74655f706173745f636f64653a3a6837303063613466353631386539383961a1025c6672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6d61703a3a53746f726167654d61703a3a73746f726167655f6d61705f66696e616c5f6b65793a3a6837616365386463323733623830316665a2024673705f696f3a3a68617368696e673a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a74776f785f36343a3a6830663430643236643330653334333632a3025c6672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6d61703a3a53746f726167654d61703a3a73746f726167655f6d61705f66696e616c5f6b65793a3a6831336662383439666163396134393063a40290013c70616c6c65745f72616e646f6d6e6573735f636f6c6c6563746976655f666c69703a3a4d6f64756c653c543e206173206672616d655f737570706f72743a3a7472616974733a3a52616e646f6d6e6573733c3c54206173206672616d655f73797374656d3a3a54726169743e3a3a486173683e3e3a3a72616e646f6d3a3a6832386366386437356437326438346364a502386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6836306666356261626630373733363266a60294017061726974795f7363616c655f636f6465633a3a636f6465633a3a696e6e65725f7475706c655f696d706c3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f646520666f7220284a302c4b302c4c302c4d302c4e302c4f302c50302c51302c5230293e3a3a656e636f64655f746f3a3a6834346362343530306632636633393864a702723c7061726974795f7363616c655f636f6465633a3a636f6d706163743a3a436f6d706163745265663c753132383e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a6834626330653932396363313930336561a80283013c706f6c6b61646f745f72756e74696d655f636f6d6d6f6e3a3a7265676973747261723a3a4c696d697450617261746872656164436f6d6d6974733c543e2061732073705f72756e74696d653a3a7472616974733a3a5369676e6564457874656e73696f6e3e3a3a76616c69646174653a3a6866383661626261643137376462653639a90251706f6c6b61646f745f72756e74696d655f636f6d6d6f6e3a3a70617261636861696e733a3a4d6f64756c653c543e3a3a70617261636861696e5f686561643a3a6863643736333230626230386564353337aa0250706f6c6b61646f745f72756e74696d655f636f6d6d6f6e3a3a7265676973747261723a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6830383139373631613936326232336533ab0252706f6c6b61646f745f72756e74696d655f636f6d6d6f6e3a3a7265676973747261723a3a4d6f64756c653c543e3a3a73746f726167655f6d657461646174613a3a6862323836383834653963663030636364ac027f3c706f6c6b61646f745f72756e74696d655f636f6d6d6f6e3a3a7265676973747261723a3a5f5f47657442797465537472756374446562746f72733c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6838663362373561656635613633643631ad0282013c706f6c6b61646f745f72756e74696d655f636f6d6d6f6e3a3a7265676973747261723a3a5f5f476574427974655374727563744e6578744672656549643c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6835343762376661323336623463363736ae027e3c706f6c6b61646f745f72756e74696d655f636f6d6d6f6e3a3a7265676973747261723a3a5f5f476574427974655374727563744163746976653c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6837346363373237306635656230316164af0282013c706f6c6b61646f745f72756e74696d655f636f6d6d6f6e3a3a7265676973747261723a3a5f5f4765744279746553747275637450617261636861696e733c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6836383632383633366336333837366530b0025170616c6c65745f72616e646f6d6e6573735f636f6c6c6563746976655f666c69703a3a4d6f64756c653c543e3a3a73746f726167655f6d657461646174613a3a6830666532306230366536663262666538b1023b3c266d7574205720617320636f72653a3a666d743a3a57726974653e3a3a77726974655f636861723a3a6836363133373831353738396631643237b2023a3c266d7574205720617320636f72653a3a666d743a3a57726974653e3a3a77726974655f666d743a3a6864666565323532356365363034343361b302433c58206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6862346265393835333961323332363834b4026f726f636f636f5f72756e74696d653a3a5f3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f646520666f7220726f636f636f5f72756e74696d653a3a43616c6c3e3a3a6465636f64653a3a6838363363316338353038363139653765b502433c58206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6865666635653764623137663465326562b6026f726f636f636f5f72756e74696d653a3a5f3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f646520666f7220726f636f636f5f72756e74696d653a3a43616c6c3e3a3a6465636f64653a3a6836646165323537343931633530343364b7025d3c706f6c6b61646f745f72756e74696d655f636f6d6d6f6e3a3a7265676973747261723a3a43616c6c3c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a6864353730353335353530653838373765b8023e6861736862726f776e3a3a7261773a3a5261775461626c653c543e3a3a726573657276655f7265686173683a3a6833626335383834343564306563373462b9024d636f72653a3a686173683a3a696d706c733a3a3c696d706c20636f72653a3a686173683a3a4861736820666f722028412c42293e3a3a686173683a3a6836663764363732343566336664623663ba023e6861736862726f776e3a3a7261773a3a5261775461626c653c543e3a3a726573657276655f7265686173683a3a6861356435383264306636653537323131bb025c6672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6d61703a3a53746f726167654d61703a3a73746f726167655f6d61705f66696e616c5f6b65793a3a6862306238366566303335626366616639bc024973705f696f3a3a68617368696e673a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a626c616b65325f3132383a3a6830623030323362343066626663643733bd023d70616c6c65745f6964656e746974793a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6834346362396262663533303363323932be023f70616c6c65745f6964656e746974793a3a4d6f64756c653c543e3a3a73746f726167655f6d657461646174613a3a6839643736346264303935346536636236bf026f3c70616c6c65745f6964656e746974793a3a5f5f47657442797465537472756374526567697374726172733c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6862366430646137333032303635383464c0023c7061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653a3a656e636f64653a3a6835656665303232633630333637326132c1026b3c70616c6c65745f6964656e746974793a3a5f5f47657442797465537472756374537562734f663c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6839666565346461383065393638363033c2026c3c70616c6c65745f6964656e746974793a3a5f5f4765744279746553747275637453757065724f663c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6865323930386431316334383139363834c3026f3c70616c6c65745f6964656e746974793a3a5f5f476574427974655374727563744964656e746974794f663c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6861626437646331353939623639653339c4022b636f72653a3a7074723a3a64726f705f696e5f706c6163653a3a6863383365396662646565633631626166c5024870616c6c65745f6964656e746974793a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a6835363833616466306534316536376164c6029a013c70616c6c65745f6964656e746974793a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a4d61785265676973747261727344656661756c74427974654765747465723c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6832303664633831393235663632346536c7029b013c70616c6c65745f6964656e746974793a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a4d61785375624163636f756e747344656661756c74427974654765747465723c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6833373535306336353530353362323939c8029e013c70616c6c65745f6964656e746974793a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a5375624163636f756e744465706f73697444656661756c74427974654765747465723c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6839616662353130643166393332373763c90299013c70616c6c65745f6964656e746974793a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a4669656c644465706f73697444656661756c74427974654765747465723c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6834643235613831383166373936336439ca0299013c70616c6c65745f6964656e746974793a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a42617369634465706f73697444656661756c74427974654765747465723c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6861633530376566366261666537353437cb02820170616c6c65745f6964656e746974793a3a5f3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f646520666f722070616c6c65745f6964656e746974793a3a4a756467656d656e743c42616c616e63653e3e3a3a656e636f64655f746f3a3a6862333734313137616534316561323032cc02573c70616c6c65745f6964656e746974793a3a44617461206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6865323761353335636164353036633962cd02493c5b543b2033325d206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6865366334333231373162363039323536ce02573c70616c6c65745f6964656e746974793a3a44617461206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6861303136356533383530306436306535cf02573c70616c6c65745f6964656e746974793a3a44617461206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6837343636393433353533626334383435d0024a3c70616c6c65745f6964656e746974793a3a43616c6c3c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a6834343631613765343432326264653661d102603c70616c6c65745f6964656e746974793a3a4d6f64756c653c543e206173206672616d655f6d657461646174613a3a4d6f64756c654572726f724d657461646174613e3a3a6d657461646174613a3a6861333632636165363730386334343663d202763c70616c6c65745f6964656e746974793a3a43616c6c3c543e206173206672616d655f737570706f72743a3a7472616974733a3a556e66696c7465726564446973706174636861626c653e3a3a64697370617463685f6279706173735f66696c7465723a3a6861626264386636623432656535356266d302456672616d655f737570706f72743a3a7472616974733a3a456e737572654f726967696e3a3a656e737572655f6f726967696e3a3a6861393330333633346531323838353265d402766672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a76616c75653a3a3c696d706c206672616d655f737570706f72743a3a73746f726167653a3a53746f7261676556616c75653c543e20666f7220473e3a3a6765743a3a6865646134613838376532356264616465d5027d70616c6c65745f6964656e746974793a3a3c696d706c20636f72653a3a636f6e766572743a3a46726f6d3c70616c6c65745f6964656e746974793a3a4572726f723c543e3e20666f722073705f72756e74696d653a3a44697370617463684572726f723e3a3a66726f6d3a3a6862636233316363353637323033363937d6022e6672616d655f73797374656d3a3a656e737572655f7369676e65643a3a6862333464626234633130326565663338d7025c6672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6d61703a3a53746f726167654d61703a3a73746f726167655f6d61705f66696e616c5f6b65793a3a6833616331623530636266636565343463d802386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6831323236613930353833323566646362d9028e013c70616c6c65745f62616c616e6365733a3a4d6f64756c653c542c493e206173206672616d655f737570706f72743a3a7472616974733a3a52657365727661626c6543757272656e63793c3c54206173206672616d655f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a726573657276653a3a6836616436643161383532613865373361da0290013c70616c6c65745f62616c616e6365733a3a4d6f64756c653c542c493e206173206672616d655f737570706f72743a3a7472616974733a3a52657365727661626c6543757272656e63793c3c54206173206672616d655f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a756e726573657276653a3a6865633262376366356263323232366439db02386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a7075743a3a6831636131383165366537366463316366dc025c6672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6d61703a3a53746f726167654d61703a3a73746f726167655f6d61705f66696e616c5f6b65793a3a6835633330623137333865373466623163dd02386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6834303564356532646465306135626262de02386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6833326365636134313661306332636639df02386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a7075743a3a6839643535386539313266333866386130e0029a013c70616c6c65745f62616c616e6365733a3a4d6f64756c653c542c493e206173206672616d655f737570706f72743a3a7472616974733a3a52657365727661626c6543757272656e63793c3c54206173206672616d655f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a726570617472696174655f72657365727665643a3a6838653137323138656232323761633133e10295013c70616c6c65745f62616c616e6365733a3a4d6f64756c653c542c493e206173206672616d655f737570706f72743a3a7472616974733a3a52657365727661626c6543757272656e63793c3c54206173206672616d655f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a736c6173685f72657365727665643a3a6830303961376235306563346236623138e202386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a7075743a3a6838656137623739316136363036366236e302723c73705f72756e74696d653a3a67656e657269633a3a6865616465723a3a4865616465723c4e756d6265722c486173683e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6832396139343663643432386463646532e402910173705f72756e74696d653a3a67656e657269633a3a6469676573743a3a5f3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f646520666f722073705f72756e74696d653a3a67656e657269633a3a6469676573743a3a4469676573743c486173683e3e3a3a6465636f64653a3a6862396338303133353366663333326139e502723c73705f72756e74696d653a3a67656e657269633a3a6865616465723a3a4865616465723c4e756d6265722c486173683e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6865343532316138366439613662616562e602776672616d655f73797374656d3a3a3c696d706c20636f72653a3a636f6e766572743a3a46726f6d3c6672616d655f73797374656d3a3a4572726f723c543e3e20666f722073705f72756e74696d653a3a44697370617463684572726f723e3a3a66726f6d3a3a6831643262343466613034373362633261e7027770616c6c65745f70726f78793a3a3c696d706c20636f72653a3a636f6e766572743a3a46726f6d3c70616c6c65745f70726f78793a3a4572726f723c543e3e20666f722073705f72756e74696d653a3a44697370617463684572726f723e3a3a66726f6d3a3a6838666632373230353961646537643532e8027b70616c6c65745f6772616e6470613a3a3c696d706c20636f72653a3a636f6e766572743a3a46726f6d3c70616c6c65745f6772616e6470613a3a4572726f723c543e3e20666f722073705f72756e74696d653a3a44697370617463684572726f723e3a3a66726f6d3a3a6861633463303766303363333132333932e9027b70616c6c65745f696e64696365733a3a3c696d706c20636f72653a3a636f6e766572743a3a46726f6d3c70616c6c65745f696e64696365733a3a4572726f723c543e3e20666f722073705f72756e74696d653a3a44697370617463684572726f723e3a3a66726f6d3a3a6864633139626135616633333035623262ea027b70616c6c65745f76657374696e673a3a3c696d706c20636f72653a3a636f6e766572743a3a46726f6d3c70616c6c65745f76657374696e673a3a4572726f723c543e3e20666f722073705f72756e74696d653a3a44697370617463684572726f723e3a3a66726f6d3a3a6835326435643661333936636532356163eb027f70616c6c65745f62616c616e6365733a3a3c696d706c20636f72653a3a636f6e766572743a3a46726f6d3c70616c6c65745f62616c616e6365733a3a4572726f723c542c493e3e20666f722073705f72756e74696d653a3a44697370617463684572726f723e3a3a66726f6d3a3a6866303062666633383966663762383830ec027d70616c6c65745f6d756c74697369673a3a3c696d706c20636f72653a3a636f6e766572743a3a46726f6d3c70616c6c65745f6d756c74697369673a3a4572726f723c543e3e20666f722073705f72756e74696d653a3a44697370617463684572726f723e3a3a66726f6d3a3a6833363565396230663835356263656637ed023f70616c6c65745f6f6666656e6365733a3a4d6f64756c653c543e3a3a73746f726167655f6d657461646174613a3a6833336633353831636337393030393037ee02773c70616c6c65745f6f6666656e6365733a3a5f5f476574427974655374727563745265706f72747342794b696e64496e6465783c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6834363633643963376637373236663866ef027b3c70616c6c65745f6f6666656e6365733a3a5f5f47657442797465537472756374436f6e63757272656e745265706f727473496e6465783c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6831313239326232326636626261643032f002753c70616c6c65745f6f6666656e6365733a3a5f5f4765744279746553747275637444656665727265644f6666656e6365733c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6862333565636139663031363663646633f1027d70616c6c65745f7265636f766572793a3a3c696d706c20636f72653a3a636f6e766572743a3a46726f6d3c70616c6c65745f7265636f766572793a3a4572726f723c543e3e20666f722073705f72756e74696d653a3a44697370617463684572726f723e3a3a66726f6d3a3a6839366231646132643161333037373037f202810170616c6c65745f617574686f72736869703a3a3c696d706c20636f72653a3a636f6e766572743a3a46726f6d3c70616c6c65745f617574686f72736869703a3a4572726f723c543e3e20666f722073705f72756e74696d653a3a44697370617463684572726f723e3a3a66726f6d3a3a6864356265626563353561383662343138f3024b73705f636f6e73656e7375735f626162653a3a636865636b5f65717569766f636174696f6e5f70726f6f663a3a7b7b636c6f737572657d7d3a3a6837333731333231373765653632376361f4023473705f72756e74696d653a3a7472616974733a3a486173683a3a686173685f6f663a3a6864623864653065316630353163396136f5024c73705f696f3a3a63727970746f3a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a737232353531395f7665726966793a3a6832653038303662653931326230666334f602437061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a6839376463653833396230383431356562f702437061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a6863656139643835303338303838656537f8025e3c636f72653a3a726573756c743a3a526573756c743c542c453e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a6838626339626466326238376130353334f9023c7061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653a3a656e636f64653a3a6865396235666363383064303566303736fa023f7061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653a3a656e636f64655f746f3a3a6831343766363837386139393535366434fb025c6672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6d61703a3a53746f726167654d61703a3a73746f726167655f6d61705f66696e616c5f6b65793a3a6861303535646537653362396537666439fc02706672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a646f75626c655f6d61703a3a53746f72616765446f75626c654d61703a3a73746f726167655f646f75626c655f6d61705f66696e616c5f6b65793a3a6835303733663931353531323532393539fd02437061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a6833396166313932646266643366636566fe025c6672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6d61703a3a53746f726167654d61703a3a73746f726167655f6d61705f66696e616c5f6b65793a3a6834386363393231326138313133393534ff02a501706f6c6b61646f745f72756e74696d655f636f6d6d6f6e3a3a70617261636861696e733a3a3c696d706c20636f72653a3a636f6e766572743a3a46726f6d3c706f6c6b61646f745f72756e74696d655f636f6d6d6f6e3a3a70617261636861696e733a3a4572726f723c543e3e20666f722073705f72756e74696d653a3a44697370617463684572726f723e3a3a66726f6d3a3a6865663330656539353532323032643665800339636f72653a3a736c6963653a3a3c696d706c205b545d3e3a3a62696e6172795f7365617263683a3a683731373032643337396662393732373381034a3c70616c6c65745f6f6666656e6365733a3a43616c6c3c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a68626339393161663866613064303163348203553c73705f72756e74696d653a3a4d756c74695369676e61747572652061732073705f72756e74696d653a3a7472616974733a3a5665726966793e3a3a7665726966793a3a683862623233323765303364656365653083034c73705f696f3a3a63727970746f3a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a656432353531395f7665726966793a3a683362373531323063396639333436633184036073705f696f3a3a63727970746f3a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a736563703235366b315f65636473615f7265636f7665725f636f6d707265737365643a3a686664386464613766643139643462303285033c70616c6c65745f696e64696365733a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a686532393731396335393834626338316486033e70616c6c65745f696e64696365733a3a4d6f64756c653c543e3a3a73746f726167655f6d657461646174613a3a683035613062616233663364663534383387033d70616c6c65745f6d756c74697369673a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a683461666334623439663236373838363688033f70616c6c65745f6d756c74697369673a3a4d6f64756c653c543e3a3a73746f726167655f6d657461646174613a3a68613662356236656265323336363734388903303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a68306266613739353439616465356264338a03303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a68346461313966376161396563383965328b03303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a68663263323065643531356137623131648c03383c2a636f6e7374205420617320636f72653a3a666d743a3a506f696e7465723e3a3a666d743a3a68656164323032343166653239393439308d034a3c70616c6c65745f6d756c74697369673a3a43616c6c3c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a68393465313638373732313338626365628e03473c6672616d655f73797374656d3a3a43616c6c3c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a68343734306330383931366233336436398f03463c70616c6c65745f626162653a3a43616c6c3c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a68376638633430386664643762646536629003493c70616c6c65745f6772616e6470613a3a43616c6c3c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a683264613166656236343832363565623791035e3c706f6c6b61646f745f72756e74696d655f636f6d6d6f6e3a3a70617261636861696e733a3a43616c6c3c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a683335363232396232323138333935323292034a3c70616c6c65745f7265636f766572793a3a43616c6c3c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a683034656633616237386363376437613193034b3c70616c6c65745f7363686564756c65723a3a43616c6c3c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a68653633653334623337333564376332619403463c70616c6c65745f7375646f3a3a43616c6c3c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a686537616163313630343239653164313795034b3c726f636f636f5f72756e74696d653a3a43616c6c20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a68666235613862353665626234353231352e343238369603603c70616c6c65745f6d756c74697369673a3a4d6f64756c653c543e206173206672616d655f6d657461646174613a3a4d6f64756c654572726f724d657461646174613e3a3a6d657461646174613a3a683262366530333962333462386234323197035c6672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6d61703a3a53746f726167654d61703a3a73746f726167655f6d61705f66696e616c5f6b65793a3a6866313038633762633762383861376533980330636f72653a3a7074723a3a64726f705f696e5f706c6163653a3a68653337373432313934326265633631302e3137373399034770616c6c65745f6d756c74697369673a3a4d6f64756c653c543e3a3a656e737572655f736f727465645f616e645f696e736572743a3a68383862613961353062663335643038319a033670616c6c65745f6d756c74697369673a3a4d6f64756c653c543e3a3a6f7065726174653a3a68616464353063333935323135626233379b03706672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a646f75626c655f6d61703a3a53746f72616765446f75626c654d61703a3a73746f726167655f646f75626c655f6d61705f66696e616c5f6b65793a3a68653838353830346237383133363737669c03386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a68376263613535353766636165363133379d034570616c6c65745f6d756c74697369673a3a4d6f64756c653c543e3a3a73746f72655f63616c6c5f616e645f726573657276653a3a68326531313461653430623433653939339e03386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a7075743a3a68646234643864333635353735333165359f035c6672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6d61703a3a53746f726167654d61703a3a73746f726167655f6d61705f66696e616c5f6b65793a3a6835373565373332313538356562616565a003386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6839333735323065643561386261623465a103673c726f636f636f5f72756e74696d653a3a43616c6c206173206672616d655f737570706f72743a3a776569676874733a3a4765744469737061746368496e666f3e3a3a6765745f64697370617463685f696e666f3a3a6831333337336430616565316630626361a2033970616c6c65745f6d756c74697369673a3a4d6f64756c653c543e3a3a636c6561725f63616c6c3a3a6830626637353635643363346636316237a303723c726f636f636f5f72756e74696d653a3a43616c6c206173206672616d655f737570706f72743a3a7472616974733a3a556e66696c7465726564446973706174636861626c653e3a3a64697370617463685f6279706173735f66696c7465723a3a6861353434326336313864626432343761a4034073705f696e686572656e74733a3a436865636b496e686572656e7473526573756c743a3a7075745f6572726f723a3a6834656462313434336266333930626166a503613c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a42547265654d61703c4b2c563e20617320636f72653a3a6f70733a3a64726f703a3a44726f703e3a3a64726f703a3a6837643766653638636234363663313066a60341616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a7365617263683a3a7365617263685f747265653a3a6838376438663061373130656630373231a7034b616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a566163616e74456e7472793c4b2c563e3a3a696e736572743a3a6832653839343963643966623030386434a8034073705f696e686572656e74733a3a436865636b496e686572656e7473526573756c743a3a7075745f6572726f723a3a6837623061336265616663383931623865a903753c285475706c65456c656d656e74302c5475706c65456c656d656e743129206173206672616d655f737570706f72743a3a7472616974733a3a4f6e496e697469616c697a653c426c6f636b4e756d6265723e3e3a3a6f6e5f696e697469616c697a653a3a6833643932393235636437323937393437aa033870616c6c65745f626162653a3a4d6f64756c653c543e3a3a646f5f696e697469616c697a653a3a6864336637386661316162393739663030ab03386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6831646666336235656634396135303663ac03766672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a76616c75653a3a3c696d706c206672616d655f737570706f72743a3a73746f726167653a3a53746f7261676556616c75653c543e20666f7220473e3a3a6765743a3a6839323131383335656665633839623035ad03766672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a76616c75653a3a3c696d706c206672616d655f737570706f72743a3a73746f726167653a3a53746f7261676556616c75653c543e20666f7220473e3a3a6765743a3a6833643434646136383137303238346266ae033d70616c6c65745f696d5f6f6e6c696e653a3a4d6f64756c653c543e3a3a69735f6f6e6c696e655f6175783a3a6862613231636636383864333164633966af034b73705f696f3a3a73746f726167653a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a636c6561725f7072656669783a3a6831663039323935353735663430373365b00376726f636f636f5f72756e74696d653a3a5f3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f646520666f7220726f636f636f5f72756e74696d653a3a53657373696f6e4b6579733e3a3a6465636f64653a3a6839313864363166656636353862373739b1035c6672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6d61703a3a53746f726167654d61703a3a73746f726167655f6d61705f66696e616c5f6b65793a3a6866633762623431333761623330373239b203386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6866623434396465373163333266623937b30393013c285475706c65456c656d656e74302c5475706c65456c656d656e74312c5475706c65456c656d656e74322c5475706c65456c656d656e74332c5475706c65456c656d656e7434292061732070616c6c65745f73657373696f6e3a3a53657373696f6e48616e646c65723c4149643e3e3a3a6f6e5f6e65775f73657373696f6e3a3a6865643233656161373862363066653231b403766672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a76616c75653a3a3c696d706c206672616d655f737570706f72743a3a73746f726167653a3a53746f7261676556616c75653c543e20666f7220473e3a3a6765743a3a6835373233336438396363313162646564b5033c7061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653a3a656e636f64653a3a6839393532666633356232326661353066b6033770616c6c65745f617574686f72736869703a3a4d6f64756c653c543e3a3a617574686f723a3a6837313562326464396166303736383732b7033f70616c6c65745f696d5f6f6e6c696e653a3a4d6f64756c653c543e3a3a6e6f74655f617574686f72736869703a3a6835386130326562366366653463343032b803386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6835376266333034653634633738353331b9033c70616c6c65745f73657373696f6e3a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6833353561613362396639323636353766ba033e70616c6c65745f73657373696f6e3a3a4d6f64756c653c543e3a3a73746f726167655f6d657461646174613a3a6865343565363630346464633863636333bb03763c70616c6c65745f73657373696f6e3a3a5f5f4765744279746553747275637444697361626c656456616c696461746f72733c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6862636566666566323163626164643165bc03703c70616c6c65745f73657373696f6e3a3a5f5f4765744279746553747275637443757272656e74496e6465783c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6835376664343661353964616336323138bd035c6672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6d61703a3a53746f726167654d61703a3a73746f726167655f6d61705f66696e616c5f6b65793a3a6866313630376439666663336261373863be033d70616c6c65745f7265636f766572793a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6831353333646131313536363063363633bf033f70616c6c65745f7265636f766572793a3a4d6f64756c653c543e3a3a73746f726167655f6d657461646174613a3a6837356532343862383861356566663865c0034870616c6c65745f7265636f766572793a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a6863663166626537323338633637636664c1039c013c70616c6c65745f7265636f766572793a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a5265636f766572794465706f73697444656661756c74427974654765747465723c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6865373561396435643239623339656639c20397013c70616c6c65745f7265636f766572793a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a4d6178467269656e647344656661756c74427974654765747465723c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6866323832633739376566393638363434c303a0013c70616c6c65745f7265636f766572793a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a467269656e644465706f736974466163746f7244656661756c74427974654765747465723c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6862353666636634306666623365666663c4037470616c6c65745f7265636f766572793a3a5f3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f646520666f722070616c6c65745f7265636f766572793a3a43616c6c3c543e3e3a3a6465636f64653a3a6834386433626566316431316662396439c5037470616c6c65745f7265636f766572793a3a5f3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f646520666f722070616c6c65745f7265636f766572793a3a43616c6c3c543e3e3a3a6465636f64653a3a6865633437363931313839346561613836c6036a636f72653a3a6f70733a3a66756e6374696f6e3a3a696d706c733a3a3c696d706c20636f72653a3a6f70733a3a66756e6374696f6e3a3a466e4f6e63653c413e20666f7220266d757420463e3a3a63616c6c5f6f6e63653a3a6862396435376135313563663632623761c7035b3c726f636f636f5f72756e74696d653a3a53657373696f6e4b6579732061732073705f72756e74696d653a3a7472616974733a3a4f70617175654b6579733e3a3a6765745f7261773a3a6862663332373138353231333631653062c8036a636f72653a3a6f70733a3a66756e6374696f6e3a3a696d706c733a3a3c696d706c20636f72653a3a6f70733a3a66756e6374696f6e3a3a466e4f6e63653c413e20666f7220266d757420463e3a3a63616c6c5f6f6e63653a3a6865613466653463353031383334333539c9035f3c70616c6c65745f73657373696f6e3a3a4d6f64756c653c543e206173206672616d655f6d657461646174613a3a4d6f64756c654572726f724d657461646174613e3a3a6d657461646174613a3a6834306134303661333064643034626166ca03603c70616c6c65745f7265636f766572793a3a4d6f64756c653c543e206173206672616d655f6d657461646174613a3a4d6f64756c654572726f724d657461646174613e3a3a6d657461646174613a3a6838363335333165363466656266653632cb03763c70616c6c65745f7265636f766572793a3a43616c6c3c543e206173206672616d655f737570706f72743a3a7472616974733a3a556e66696c7465726564446973706174636861626c653e3a3a64697370617463685f6279706173735f66696c7465723a3a6838343164656537633832346665313936cc035c6672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6d61703a3a53746f726167654d61703a3a73746f726167655f6d61705f66696e616c5f6b65793a3a6865393166633039636261376465613965cd032c6672616d655f73797374656d3a3a656e737572655f726f6f743a3a6831636133396365613262393966356536ce03386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a7075743a3a6830356131343630393764616363303737cf035c6672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6d61703a3a53746f726167654d61703a3a73746f726167655f6d61705f66696e616c5f6b65793a3a6866353930393362336566373564396230d003706672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a646f75626c655f6d61703a3a53746f72616765446f75626c654d61703a3a73746f726167655f646f75626c655f6d61705f66696e616c5f6b65793a3a6830303665616163646263616235646431d103386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a7075743a3a6861383830383033376461333031393061d203386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6864653766306332653434336436663765d303386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6837646339616338626234363561386531d403336672616d655f73797374656d3a3a4d6f64756c653c543e3a3a696e635f7265663a3a6831616639623465633834646665663133d5034773705f696f3a3a73746f726167653a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a6e6578745f6b65793a3a6834366239666134663764306132656437d603336672616d655f73797374656d3a3a4d6f64756c653c543e3a3a6465635f7265663a3a6861626433633135356634663533656538d70385013c70616c6c65745f62616c616e6365733a3a4d6f64756c653c542c493e206173206672616d655f737570706f72743a3a7472616974733a3a43757272656e63793c3c54206173206672616d655f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a7472616e736665723a3a6861343537666136313736636131653264d8035c6672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6d61703a3a53746f726167654d61703a3a73746f726167655f6d61705f66696e616c5f6b65793a3a6865653439343834356465353562633931d903386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6837643163653162636634383063333430da03386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a7075743a3a6866373661623562666539353764323966db034873705f72756e74696d653a3a7472616974733a3a4163636f756e744964436f6e76657273696f6e3a3a696e746f5f6163636f756e743a3a6865393431626533633231393264363037dc03753c285475706c65456c656d656e74302c5475706c65456c656d656e743129206173206672616d655f737570706f72743a3a7472616974733a3a4f6e496e697469616c697a653c426c6f636b4e756d6265723e3e3a3a6f6e5f696e697469616c697a653a3a6836316538316233303732303233363362dd035c6672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6d61703a3a53746f726167654d61703a3a73746f726167655f6d61705f66696e616c5f6b65793a3a6866356664613930643431613635643664de03386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6862323332616435633736666634326664df034b3c726f636f636f5f72756e74696d653a3a43616c6c20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a68666235613862353665626234353231352e31393533e0035c6672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6d61703a3a53746f726167654d61703a3a73746f726167655f6d61705f66696e616c5f6b65793a3a6865376438376634633132656666623963e103386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a7075743a3a6835653861616563313539393937653532e203776672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6d61703a3a3c696d706c206672616d655f737570706f72743a3a73746f726167653a3a53746f726167654d61703c4b2c563e20666f7220473e3a3a617070656e643a3a6831643032323836386131376161643665e303766672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a76616c75653a3a3c696d706c206672616d655f737570706f72743a3a73746f726167653a3a53746f7261676556616c75653c543e20666f7220473e3a3a6765743a3a6837663431636365666134323438313261e4035c6672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6d61703a3a53746f726167654d61703a3a73746f726167655f6d61705f66696e616c5f6b65793a3a6862303037656263366465306436653164e503386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6831383239373034306436656262393664e6035c6672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6d61703a3a53746f726167654d61703a3a73746f726167655f6d61705f66696e616c5f6b65793a3a6832376263396164666662386633383961e703386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a7075743a3a6835386132363731623135366162363162e803a70170616c6c65745f7363686564756c65723a3a5f3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f646520666f722070616c6c65745f7363686564756c65723a3a5363686564756c656456323c43616c6c2c426c6f636b4e756d6265722c50616c6c6574734f726967696e2c4163636f756e7449643e3e3a3a656e636f64655f746f3a3a6837623538653531336165653038323363e9034573705f696f3a3a73746f726167653a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a617070656e643a3a6837383932316438383933663531666363ea038b013c73705f72756e74696d653a3a67656e657269633a3a636865636b65645f65787472696e7369633a3a436865636b656445787472696e7369633c4163636f756e7449642c43616c6c2c45787472613e2061732073705f72756e74696d653a3a7472616974733a3a4170706c7961626c653e3a3a6170706c793a3a6836346666373837366464333739333233eb035a6672616d655f73797374656d3a3a657874656e73696f6e733a3a636865636b5f7765696768743a3a436865636b5765696768743c543e3a3a646f5f7072655f64697370617463683a3a6834633938303433316138613833306165ec034970616c6c65745f7472616e73616374696f6e5f7061796d656e743a3a4d6f64756c653c543e3a3a636f6d707574655f6665655f7261773a3a6866666432353439383531376232323765ed03b2013c6672616d655f73797374656d3a3a4d6f64756c653c543e206173206672616d655f737570706f72743a3a7472616974733a3a53746f7265644d61703c3c54206173206672616d655f73797374656d3a3a54726169743e3a3a4163636f756e7449642c3c54206173206672616d655f73797374656d3a3a54726169743e3a3a4163636f756e74446174613e3e3a3a7472795f6d75746174655f6578697374733a3a6865373039363364316532333963663437ee0387013c706f6c6b61646f745f72756e74696d655f636f6d6d6f6e3a3a70617261636861696e733a3a56616c6964617465446f75626c65566f74655265706f7274733c543e2061732073705f72756e74696d653a3a7472616974733a3a5369676e6564457874656e73696f6e3e3a3a76616c69646174653a3a6864613631346532656635356338353432ef0395013c70616c6c65745f73657373696f6e3a3a686973746f726963616c3a3a4d6f64756c653c543e206173206672616d655f737570706f72743a3a7472616974733a3a4b65794f776e657250726f6f6653797374656d3c2873705f636f72653a3a63727970746f3a3a4b65795479706549642c44293e3e3a3a636865636b5f70726f6f663a3a6834393938346137636339383332326636f0036b3c70616c6c65745f696d5f6f6e6c696e653a3a4d6f64756c653c543e2061732073705f72756e74696d653a3a7472616974733a3a56616c6964617465556e7369676e65643e3a3a76616c69646174655f756e7369676e65643a3a6830643335336363656664306230346664f103386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a7075743a3a6834306331303064366637343733373533f2034573705f696f3a3a6d6973633a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a7072696e745f6e756d3a3a6831346633623939376166663436663361f3038e013c73705f72756e74696d653a3a67656e657269633a3a636865636b65645f65787472696e7369633a3a436865636b656445787472696e7369633c4163636f756e7449642c43616c6c2c45787472613e2061732073705f72756e74696d653a3a7472616974733a3a4170706c7961626c653e3a3a76616c69646174653a3a6834356232623765393037323461366266f4035373705f72756e74696d653a3a7472616e73616374696f6e5f76616c69646974793a3a56616c69645472616e73616374696f6e3a3a636f6d62696e655f776974683a3a6863343731303137356632366539343865f503566672616d655f73797374656d3a3a657874656e73696f6e733a3a636865636b5f7765696768743a3a436865636b5765696768743c543e3a3a646f5f76616c69646174653a3a6831373363353862333030343965373038f6033c70616c6c65745f76657374696e673a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6831383834613564326561393961653265f7033e70616c6c65745f76657374696e673a3a4d6f64756c653c543e3a3a73746f726167655f6d657461646174613a3a6838373566306234653835666463306238f8034770616c6c65745f76657374696e673a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a6864643138393964623034623736643933f9039d013c70616c6c65745f76657374696e673a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a4d696e5665737465645472616e7366657244656661756c74427974654765747465723c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6862653761333133363233663962653563fa03746672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6d61703a3a3c696d706c206672616d655f737570706f72743a3a73746f726167653a3a53746f726167654d61703c4b2c563e20666f7220473e3a3a6765743a3a6834343934356266343730613834316137fb03553c6d656d6f72795f64623a3a4d656d6f727944423c482c4b462c542c4d3e20617320636f72653a3a64656661756c743a3a44656661756c743e3a3a64656661756c743a3a6865383134633733343163663562393065fc03523c6d656d6f72795f64623a3a4d656d6f727944423c482c4b462c542c4d3e20617320686173685f64623a3a4861736844423c482c543e3e3a3a696e736572743a3a6839313231366535636130356638303961fd034470616c6c65745f73657373696f6e3a3a686973746f726963616c3a3a50726f76696e67547269653c543e3a3a71756572793a3a6832656231316532386362633634663564fe032b636f72653a3a7074723a3a64726f705f696e5f706c6163653a3a6864613531373863663664376232656536ff03366861736862726f776e3a3a6d61703a3a486173684d61703c4b2c562c533e3a3a6765743a3a6834333734643233393730643062333563800438747269655f64623a3a6c6f6f6b75703a3a4c6f6f6b75703c4c2c513e3a3a6c6f6f6b5f75703a3a683335303866353430386466316463396281044b70616c6c65745f73657373696f6e3a3a686973746f726963616c3a3a50726f76696e67547269653c543e3a3a67656e65726174655f666f723a3a68363530656531613763346162363339378204543c747269655f64623a3a7472696564626d75743a3a5472696544424d75743c4c3e20617320747269655f64623a3a547269654d75743c4c3e3e3a3a696e736572743a3a686435633933306464653962396465373883042b636f72653a3a7074723a3a64726f705f696e5f706c6163653a3a686265663038633330333132626333623284044470616c6c65745f73657373696f6e3a3a686973746f726963616c3a3a50726f76696e67547269653c543e3a3a70726f76653a3a6865623934633432306363626138343739850438747269655f64623a3a6c6f6f6b75703a3a4c6f6f6b75703c4c2c513e3a3a6c6f6f6b5f75703a3a6830653935656231353638373464383962860443616c6c6f633a3a636f6c6c656374696f6e733a3a7665635f64657175653a3a56656344657175653c543e3a3a67726f773a3a683262323432316232383665396661346287043c747269655f64623a3a7472696564626d75743a3a4e6f646553746f726167653c483e3a3a616c6c6f633a3a68663332386162653934643738313436648804653c73705f747269653a3a6e6f64655f6865616465723a3a4e6f6465486561646572206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a68333564386565356662613366653061328904633c73705f747269653a3a6e6f64655f636f6465633a3a4e6f6465436f6465633c483e20617320747269655f64623a3a6e6f64655f636f6465633a3a4e6f6465436f6465633e3a3a6c6561665f6e6f64653a3a68623334333838666565386265636562398a0460747269655f64623a3a6e6962626c653a3a6e6962626c65736c6963653a3a3c696d706c20747269655f64623a3a6e6962626c653a3a4e6962626c65536c6963653e3a3a72696768745f697465723a3a68373530333865346361386134633864368b0472747269655f64623a3a6e6962626c653a3a6e6962626c657665633a3a3c696d706c20747269655f64623a3a6e6962626c653a3a4e6962626c655665633e3a3a617070656e645f6f7074696f6e616c5f736c6963655f616e645f6e6962626c653a3a68656166363331313731623937303430318c0441747269655f64623a3a7472696564626d75743a3a5472696544424d75743c4c3e3a3a636f6d6d69745f6368696c643a3a68636235396231323236663032333362638d045c747269655f64623a3a6e6962626c653a3a6e6962626c657665633a3a3c696d706c20747269655f64623a3a6e6962626c653a3a4e6962626c655665633e3a3a64726f705f6c617374733a3a68636266613539343437393035626162618e043f70616c6c65745f62616c616e6365733a3a4d6f64756c653c542c493e3a3a63616c6c5f66756e6374696f6e733a3a68623537363736313365623361326662368f044170616c6c65745f62616c616e6365733a3a4d6f64756c653c542c493e3a3a73746f726167655f6d657461646174613a3a686533656437636631366639646435643890046c3c70616c6c65745f62616c616e6365733a3a5f5f476574427974655374727563744c6f636b733c542c493e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a683930396562633335343837613633346691043c7061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653a3a656e636f64653a3a683166386537386162653266633938393192046e3c70616c6c65745f62616c616e6365733a3a5f5f476574427974655374727563744163636f756e743c542c493e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a68633362656137393530366164353463619304743c70616c6c65745f62616c616e6365733a3a5f5f47657442797465537472756374546f74616c49737375616e63653c542c493e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a686631666261336361336364633736616494044a70616c6c65745f62616c616e6365733a3a4d6f64756c653c542c493e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a68656663333836326336663831643962649504a3013c70616c6c65745f62616c616e6365733a3a4d6f64756c653c542c493e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a4578697374656e7469616c4465706f73697444656661756c74427974654765747465723c542c493e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a683230396464623032376633393564356496043e70616c6c65745f7363686564756c65723a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a683436336439393831616664653666383697044070616c6c65745f7363686564756c65723a3a4d6f64756c653c543e3a3a73746f726167655f6d657461646174613a3a68653962636162333062373131356262639804743c70616c6c65745f7363686564756c65723a3a5f5f4765744279746553747275637453746f7261676556657273696f6e3c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6862643231356234346330663733656537990472726f636f636f5f72756e74696d653a3a5f3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f646520666f7220726f636f636f5f72756e74696d653a3a43616c6c3e3a3a656e636f64655f746f3a3a68666332376439646436653163333536329a047670616c6c65745f7363686564756c65723a3a5f3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f646520666f722070616c6c65745f7363686564756c65723a3a43616c6c3c543e3e3a3a6465636f64653a3a68383532643235646137363135616265309b047670616c6c65745f7363686564756c65723a3a5f3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f646520666f722070616c6c65745f7363686564756c65723a3a43616c6c3c543e3e3a3a6465636f64653a3a68393762396661326536393733633539389c04593c636f72653a3a6f7074696f6e3a3a4f7074696f6e3c543e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a68303663643732323530323935636466659d048c0173705f636f6e73656e7375735f626162653a3a646967657374733a3a5f3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f646520666f722073705f636f6e73656e7375735f626162653a3a646967657374733a3a5072654469676573743e3a3a6465636f64653a3a68376366663364643765616636613131359e04683c73705f636f6e73656e7375735f7672663a3a7363686e6f72726b656c3a3a56524650726f6f66206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a68633937386661613233303361343065619f049c01706f6c6b61646f745f636f72655f7072696d6974697665733a3a5f3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f646520666f7220706f6c6b61646f745f636f72655f7072696d6974697665733a3a446f776e776172644d6573736167653c4163636f756e7449643e3e3a3a656e636f64655f746f3a3a6862373032613765366163396363373834a004303c282920617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6864613766326361643164616135323539a1045f3c70616c6c65745f76657374696e673a3a4d6f64756c653c543e206173206672616d655f6d657461646174613a3a4d6f64756c654572726f724d657461646174613e3a3a6d657461646174613a3a6861386138393133663264613130353162a204613c70616c6c65745f7363686564756c65723a3a4d6f64756c653c543e206173206672616d655f6d657461646174613a3a4d6f64756c654572726f724d657461646174613e3a3a6d657461646174613a3a6837636633356135306634343461356236a304623c70616c6c65745f62616c616e6365733a3a4d6f64756c653c542c493e206173206672616d655f6d657461646174613a3a4d6f64756c654572726f724d657461646174613e3a3a6d657461646174613a3a6836663831633661396666366534636461a4043970616c6c65745f76657374696e673a3a4d6f64756c653c543e3a3a7570646174655f6c6f636b3a3a6834333834643361316462343436383466a5045c6672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6d61703a3a53746f726167654d61703a3a73746f726167655f6d61705f66696e616c5f6b65793a3a6838343066363163666465643936373637a6045c6672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6d61703a3a53746f726167654d61703a3a73746f726167655f6d61705f66696e616c5f6b65793a3a6837643838623564336338656164653764a704386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6835666134376636373866313333373166a8043d70616c6c65745f62616c616e6365733a3a4d6f64756c653c542c493e3a3a7570646174655f6c6f636b733a3a6837663765636365323232356331613764a90495013c70616c6c65745f76657374696e673a3a4d6f64756c653c543e206173206672616d655f737570706f72743a3a7472616974733a3a56657374696e675363686564756c653c3c54206173206672616d655f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a6164645f76657374696e675f7363686564756c653a3a6834343465666232303434303032663065aa043b70616c6c65745f7363686564756c65723a3a4d6f64756c653c543e3a3a646f5f7363686564756c653a3a6839616666386538323830373638653334ab045c6672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6d61703a3a53746f726167654d61703a3a73746f726167655f6d61705f66696e616c5f6b65793a3a6830636332333930393262346630316433ac044170616c6c65745f7363686564756c65723a3a4d6f64756c653c543e3a3a646f5f7363686564756c655f6e616d65643a3a6836613734343762333139646262633862ad04386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a7075743a3a6837386132633165643561653932343564ae04aa0173705f72756e74696d653a3a7472616e73616374696f6e5f76616c69646974793a3a5f3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f646520666f722073705f72756e74696d653a3a7472616e73616374696f6e5f76616c69646974793a3a5472616e73616374696f6e56616c69646974794572726f723e3a3a656e636f64655f746f3a3a6864356631376434613761653838386561af043e73705f72756e74696d653a3a67656e657269633a3a656e636f64655f776974685f7665635f7072656669783a3a6862383834356633333833313730643666b0045c6672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6d61703a3a53746f726167654d61703a3a73746f726167655f6d61705f66696e616c5f6b65793a3a6835653361383430303664363334646165b1042c6672616d655f73797374656d3a3a656e737572655f6e6f6e653a3a6861646439626132653539333637326233b204366672616d655f73797374656d3a3a4d6f64756c653c543e3a3a626c6f636b5f686173683a3a6862653062656261663364393663386431b304366672616d655f73797374656d3a3a4d6f64756c653c543e3a3a696e697469616c697a653a3a6862613466643565386535333636376431b404386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a7075743a3a6862313431333862386164636631316465b5046f6672616d655f73797374656d3a3a5f3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f646520666f72206672616d655f73797374656d3a3a50686173653e3a3a656e636f64655f746f3a3a6865386332393830633466623234353234b60473726f636f636f5f72756e74696d653a3a5f3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f646520666f7220726f636f636f5f72756e74696d653a3a4576656e743e3a3a656e636f64655f746f3a3a6834663761366563306166626331323361b7042b636f72653a3a7074723a3a64726f705f696e5f706c6163653a3a6830666638356636373036356331646261b8043a6672616d655f73797374656d3a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6862353230663632376638306362356563b9045c6672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6d61703a3a53746f726167654d61703a3a73746f726167655f6d61705f66696e616c5f6b65793a3a6831623336373131333633356164343961ba043c6672616d655f73797374656d3a3a4d6f64756c653c543e3a3a73746f726167655f6d657461646174613a3a6861336439353164373866643064306534bb04703c6672616d655f73797374656d3a3a5f5f47657442797465537472756374457865637574696f6e50686173653c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6862333538343731633736613136616634bc04703c6672616d655f73797374656d3a3a5f5f4765744279746553747275637445787472696e73696373526f6f743c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6864376233643033633861376262656537bd046d3c6672616d655f73797374656d3a3a5f5f47657442797465537472756374426c6f636b5765696768743c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6835303663663737633931356434313136be04693c6672616d655f73797374656d3a3a5f5f476574427974655374727563744163636f756e743c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6863666665346538333763653365306139bf04446672616d655f73797374656d3a3a4d6f64756c653c543e3a3a6e6f74655f66696e69736865645f65787472696e736963733a3a6837643962376532383365343836393266c004456672616d655f73797374656d3a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a6831313965376233383930366232646462c1049c013c6672616d655f73797374656d3a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a4d6178696d756d426c6f636b4c656e67746844656661756c74427974654765747465723c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6866643537643634626131636465383331c2049d013c6672616d655f73797374656d3a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a45787472696e7369634261736557656967687444656661756c74427974654765747465723c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6862333837616138613136323739353532c3049e013c6672616d655f73797374656d3a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a426c6f636b457865637574696f6e57656967687444656661756c74427974654765747465723c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6837363739373535343830383233313761c40492013c6672616d655f73797374656d3a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a446257656967687444656661756c74427974654765747465723c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6833623065373561393736323538323965c5049c013c6672616d655f73797374656d3a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a4d6178696d756d426c6f636b57656967687444656661756c74427974654765747465723c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6833353962646339383763326431393233c60498013c6672616d655f73797374656d3a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a426c6f636b48617368436f756e7444656661756c74427974654765747465723c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6837366234663630313362353237613931c7044b6672616d655f73797374656d3a3a4d6f64756c653c543e3a3a72656769737465725f65787472615f7765696768745f756e636865636b65643a3a6866623565336366643363303634333635c804346672616d655f73797374656d3a3a4d6f64756c653c543e3a3a66696e616c697a653a3a6833303765613037396161663366376633c904386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6832626130323131326465393966386538ca044373705f696f3a3a73746f726167653a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a726f6f743a3a6839643938616566666130333639396537cb044b73705f696f3a3a73746f726167653a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a6368616e6765735f726f6f743a3a6832646130313464663236393663653962cc04773c736d616c6c7665633a3a536d616c6c5665633c413e20617320636f72653a3a697465723a3a7472616974733a3a636f6c6c6563743a3a457874656e643c3c4120617320736d616c6c7665633a3a41727261793e3a3a4974656d3e3e3a3a657874656e643a3a6863636163316131626333376637306366cd0435736d616c6c7665633a3a536d616c6c5665633c413e3a3a7472795f726573657276653a3a6831656336623838643234336232386666ce048b0173705f66696e616c6974795f6772616e6470613a3a5f3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f646520666f722073705f66696e616c6974795f6772616e6470613a3a45717569766f636174696f6e50726f6f663c482c4e3e3e3a3a6465636f64653a3a6837343633343033396532313830313561cf048b0173705f66696e616c6974795f6772616e6470613a3a5f3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f646520666f722073705f66696e616c6974795f6772616e6470613a3a45717569766f636174696f6e50726f6f663c482c4e3e3e3a3a6465636f64653a3a6865373337663338366561613930323465d0043f73705f66696e616c6974795f6772616e6470613a3a636865636b5f6d6573736167655f7369676e61747572653a3a6834626665346334386538326561386436d104363c5420617320636f72653a3a636f6e766572743a3a496e746f3c553e3e3a3a696e746f3a3a6831663064363265326165623239346530d20439747269655f64623a3a6e6f64655f636f6465633a3a4e6f6465436f6465633a3a6465636f64653a3a6830366261306438373939383631303431d3046b3c7061726974795f7363616c655f636f6465633a3a636f6d706163743a3a436f6d706163743c7533323e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6864653464643564383737333764316431d4045d3c6672616d655f73797374656d3a3a4d6f64756c653c543e206173206672616d655f6d657461646174613a3a4d6f64756c654572726f724d657461646174613e3a3a6d657461646174613a3a6832373134636565616333346631633030d5043f73705f747269653a3a6e6f64655f6865616465723a3a656e636f64655f73697a655f616e645f7072656669783a3a6861383836616138303664353861613463d604733c6672616d655f73797374656d3a3a43616c6c3c543e206173206672616d655f737570706f72743a3a7472616974733a3a556e66696c7465726564446973706174636861626c653e3a3a64697370617463685f6279706173735f66696c7465723a3a6834303934386237653136363461333664d7044b73705f696f3a3a6d6973633a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a72756e74696d655f76657273696f6e3a3a6838356135633630633063313266666132d804483c5b543b20385d206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6861373466386331613064666631383739d90458706f6c6b61646f745f72756e74696d655f636f6d6d6f6e3a3a70617261636861696e733a3a4d6f64756c653c543e3a3a63616c63756c6174655f647574795f726f737465723a3a6836313863363135346231633263393966da04386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6837326363633430626130316336353164db045e706f6c6b61646f745f72756e74696d655f636f6d6d6f6e3a3a70617261636861696e733a3a4d6f64756c653c543e3a3a7665726966795f63616e6469646174655f7369676e6174757265733a3a6834303231663433633161373735353461dc044d706f6c6b61646f745f7072696d6974697665733a3a76303a3a416272696467656443616e646964617465526563656970743c483e3a3a686173683a3a6864663064353261616462303335626230dd04546269747665633a3a736c6963653a3a6170693a3a3c696d706c206269747665633a3a736c6963653a3a426974536c6963653c4f2c543e3e3a3a73706c69745f61743a3a6863636330616465343366663132626264de04743c706f6c6b61646f745f72756e74696d655f636f6d6d6f6e3a3a70617261636861696e733a3a4d6f64756c653c543e206173206672616d655f6d657461646174613a3a4d6f64756c654572726f724d657461646174613e3a3a6d657461646174613a3a6831616634653764326434393834323535df044c706f6c6b61646f745f72756e74696d655f636f6d6d6f6e3a3a70617261636861696e733a3a4d6f64756c653c543e3a3a7365745f68656164733a3a6863376637323262633366643932313732e0045c6672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6d61703a3a53746f726167654d61703a3a73746f726167655f6d61705f66696e616c5f6b65793a3a6830633563333635343030353565663732e104386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6835383435666564313163323937396238e2045c6672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6d61703a3a53746f726167654d61703a3a73746f726167655f6d61705f66696e616c5f6b65793a3a6831333666636331626439386138306338e304386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6861633261646462323437643333623563e40458706f6c6b61646f745f72756e74696d655f636f6d6d6f6e3a3a70617261636861696e733a3a4d6f64756c653c543e3a3a6c6f63616c5f76616c69646174696f6e5f646174613a3a6834373666613933313936343537303230e50452706f6c6b61646f745f72756e74696d655f636f6d6d6f6e3a3a70617261636861696e733a3a4d6f64756c653c543e3a3a646f5f636f64655f757067726164653a3a6865306435656262326336373336396563e604386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a7075743a3a6832363537613965343237343866306462e7045c6672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6d61703a3a53746f726167654d61703a3a73746f726167655f6d61705f66696e616c5f6b65793a3a6834313533346666343166373366386432e804386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a7075743a3a6833646331336437333763313530353237e904776672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6d61703a3a3c696d706c206672616d655f737570706f72743a3a73746f726167653a3a53746f726167654d61703c4b2c563e20666f7220473e3a3a617070656e643a3a6835373962353135393263306133653431ea044770616c6c65745f7472616e73616374696f6e5f7061796d656e743a3a4d6f64756c653c543e3a3a7765696768745f746f5f6665653a3a6838666433613139636636353830626563eb043c70616c6c65745f7574696c6974793a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6830666338383836373237373566353164ec046c3c7061726974795f7363616c655f636f6465633a3a636f6d706163743a3a436f6d706163743c753132383e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6864643365643238343165313163326231ed049f013c73705f72756e74696d653a3a67656e657269633a3a756e636865636b65645f65787472696e7369633a3a556e636865636b656445787472696e7369633c416464726573732c43616c6c2c5369676e61747572652c45787472613e2061732073705f72756e74696d653a3a7472616974733a3a436865636b61626c653c4c6f6f6b75703e3e3a3a636865636b3a3a6863346239383866323038613538343136ee043e70616c6c65745f74696d657374616d703a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6835373062326333323363323139346331ef044070616c6c65745f74696d657374616d703a3a4d6f64756c653c543e3a3a73746f726167655f6d657461646174613a3a6837623733326131353765643566393734f0044970616c6c65745f74696d657374616d703a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a6862326633373330613537666566386133f1049b013c70616c6c65745f74696d657374616d703a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a4d696e696d756d506572696f6444656661756c74427974654765747465723c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6865306438643231326266373332666639f20451706f6c6b61646f745f72756e74696d655f636f6d6d6f6e3a3a70617261636861696e733a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6865376564633161393936323761366564f30453706f6c6b61646f745f72756e74696d655f636f6d6d6f6e3a3a70617261636861696e733a3a4d6f64756c653c543e3a3a73746f726167655f6d657461646174613a3a6836313131306234396230306139386365f4048f013c706f6c6b61646f745f72756e74696d655f636f6d6d6f6e3a3a70617261636861696e733a3a5f5f4765744279746553747275637452656c61794469737061746368517565756553697a653c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6864353764303263653433623465636635f50483013c706f6c6b61646f745f72756e74696d655f636f6d6d6f6e3a3a70617261636861696e733a3a5f5f47657442797465537472756374467574757265436f64653c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6832383733343066343934353865333266f60485013c706f6c6b61646f745f72756e74696d655f636f6d6d6f6e3a3a70617261636861696e733a3a5f5f4765744279746553747275637450617374436f64654d6574613c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6864303066323363343639646162303665f70484013c706f6c6b61646f745f72756e74696d655f636f6d6d6f6e3a3a70617261636861696e733a3a5f5f47657442797465537472756374417574686f7269746965733c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6865376164326335343165633763373739f80448706f6c6b61646f745f72756e74696d655f636f6d6d6f6e3a3a70617261636861696e733a3a656e737572655f70617261636861696e3a3a6837393263383262646234663631663961f9044a70616c6c65745f7472616e73616374696f6e5f7061796d656e743a3a4d6f64756c653c543e3a3a73746f726167655f6d657461646174613a3a6833333865343164643866653664623162fa0481013c70616c6c65745f7472616e73616374696f6e5f7061796d656e743a3a5f5f476574427974655374727563744e6578744665654d756c7469706c6965723c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6865663864343761633232613039646334fb045370616c6c65745f7472616e73616374696f6e5f7061796d656e743a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a6861363932613633343238633664316330fc04a3013c70616c6c65745f7472616e73616374696f6e5f7061796d656e743a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a576569676874546f46656544656661756c74427974654765747465723c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6831343862323532323532623464393138fd04aa013c70616c6c65745f7472616e73616374696f6e5f7061796d656e743a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a5472616e73616374696f6e4279746546656544656661756c74427974654765747465723c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6837333465663536633334346565303733fe04656269747665633a3a7665633a3a7472616974733a3a3c696d706c20636f72653a3a636c6f6e653a3a436c6f6e6520666f72206269747665633a3a7665633a3a4269745665633c4f2c543e3e3a3a636c6f6e653a3a6863326639616437663831336538613430ff043d73705f636f72653a3a746f5f7375627374726174655f7761736d5f666e5f72657475726e5f76616c75653a3a683230373964643861336238313736653480052b636f72653a3a7074723a3a64726f705f696e5f706c6163653a3a686266663362316234306238303139393281053970616c6c65745f7375646f3a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a686162393735656263343262643662303282053b70616c6c65745f7375646f3a3a4d6f64756c653c543e3a3a73746f726167655f6d657461646174613a3a683166666635623562336637653037333683056c70616c6c65745f7375646f3a3a5f3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f646520666f722070616c6c65745f7375646f3a3a43616c6c3c543e3e3a3a6465636f64653a3a683234653661316234326462313961633584056c70616c6c65745f7375646f3a3a5f3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f646520666f722070616c6c65745f7375646f3a3a43616c6c3c543e3e3a3a6465636f64653a3a683331383333626266366436333039303485053f70616c6c65745f617574686f72736869703a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a686462306137366236633436373063656686054170616c6c65745f617574686f72736869703a3a4d6f64756c653c543e3a3a73746f726167655f6d657461646174613a3a686561653235356238386266653535633587056d3c70616c6c65745f617574686f72736869703a3a5f5f47657442797465537472756374556e636c65733c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a683065333934363261323738353436366688052c616c6c6f633a3a736c6963653a3a696e736572745f686561643a3a686463653939316139313766653130343789054b3c726f636f636f5f72756e74696d653a3a43616c6c20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a68666235613862353665626234353231352e333335398a055c3c70616c6c65745f7375646f3a3a4d6f64756c653c543e206173206672616d655f6d657461646174613a3a4d6f64756c654572726f724d657461646174613e3a3a6d657461646174613a3a68636464623531333437353736383462368b05623c70616c6c65745f617574686f72736869703a3a4d6f64756c653c543e206173206672616d655f6d657461646174613a3a4d6f64756c654572726f724d657461646174613e3a3a6d657461646174613a3a68396335386139646236376461346330318c05723c70616c6c65745f7375646f3a3a43616c6c3c543e206173206672616d655f737570706f72743a3a7472616974733a3a556e66696c7465726564446973706174636861626c653e3a3a64697370617463685f6279706173735f66696c7465723a3a68653431306433393263363266303730338d05386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a7075743a3a68666465333734353962653830633136628e05706672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a646f75626c655f6d61703a3a53746f72616765446f75626c654d61703a3a73746f726167655f646f75626c655f6d61705f66696e616c5f6b65793a3a68303931623463386566623530353362638f05633c636f72653a3a697465723a3a61646170746572733a3a4d61703c492c463e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a6e6578743a3a683931663831346233333934663535333490055173705f696f3a3a6f6666636861696e3a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a6c6f63616c5f73746f726167655f6765743a3a686531616339323032373432346630656491055d73705f696f3a3a6f6666636861696e3a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a6c6f63616c5f73746f726167655f636f6d706172655f616e645f7365743a3a683764363564656361373961303130646692054d73705f696f3a3a6f6666636861696e3a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a6e6574776f726b5f73746174653a3a683666393335366361363139623638616493054a73705f696f3a3a63727970746f3a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a737232353531395f7369676e3a3a68633636363835323862646234373235359405473c70616c6c65745f696d5f6f6e6c696e653a3a43616c6c3c543e20617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6835623935663763636531336338353833950547636f72653a3a666d743a3a6e756d3a3a3c696d706c20636f72653a3a666d743a3a446562756720666f72207533323e3a3a666d743a3a683764653264323566613033643265383396055273705f696f3a3a6f6666636861696e3a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a7375626d69745f7472616e73616374696f6e3a3a683838646637656163633839373364306497055173705f696f3a3a6f6666636861696e3a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a6c6f63616c5f73746f726167655f7365743a3a68383162326134303061366431623463379805583c70616c6c65745f696d5f6f6e6c696e653a3a4f6666636861696e4572723c426c6f636b4e756d6265723e20617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a68663133326532323262663430653261639905373c285431302c5431312920617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a68653661303432346137313435353935349a05303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a68363561376635613966613534353831629b055c6672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6d61703a3a53746f726167654d61703a3a73746f726167655f6d61705f66696e616c5f6b65793a3a68346130303731306266346235623533399c05633c636f72653a3a697465723a3a61646170746572733a3a4d61703c492c463e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a6e6578743a3a68623661336431323364663963633436309d05683c636f72653a3a697465723a3a61646170746572733a3a4d61703c492c463e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a73697a655f68696e743a3a68323365663462363630656336366437639e053d70616c6c65745f6772616e6470613a3a4d6f64756c653c543e3a3a7363686564756c655f6368616e67653a3a68393433393863313638393535353236309f05633c636f72653a3a697465723a3a61646170746572733a3a4d61703c492c463e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a6e6578743a3a6832306264656634303638636363313637a005386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6865313565363564343161613531646437a105633c636f72653a3a697465723a3a61646170746572733a3a4d61703c492c463e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a6e6578743a3a6862353864663535383431353134373763a205633c636f72653a3a697465723a3a61646170746572733a3a4d61703c492c463e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a6e6578743a3a6834383864636339646665646136363630a305633c636f72653a3a697465723a3a61646170746572733a3a4d61703c492c463e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a6e6578743a3a6864313635393339616364313530663830a4053c70616c6c65745f6772616e6470613a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6835663430333232376563656564373763a5053e70616c6c65745f6772616e6470613a3a4d6f64756c653c543e3a3a73746f726167655f6d657461646174613a3a6864333165386136343861393633306661a605703c70616c6c65745f6772616e6470613a3a5f5f4765744279746553747275637443757272656e7453657449643c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6862633333376431623633633338373030a705693c70616c6c65745f6772616e6470613a3a5f5f4765744279746553747275637453746174653c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6835633134373362356335373539353665a8053e70616c6c65745f696d5f6f6e6c696e653a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6861363563343137346462386530643631a9054070616c6c65745f696d5f6f6e6c696e653a3a4d6f64756c653c543e3a3a73746f726167655f6d657461646174613a3a6865353165383035623861633161633865aa055d3c73705f66696e616c6974795f6772616e6470613a3a45717569766f636174696f6e50726f6f663c482c4e3e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a6831303663366631353237653032623230ab05593c636f72653a3a6f7074696f6e3a3a4f7074696f6e3c543e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6861626331653631323330663664383063ac055f3c70616c6c65745f6772616e6470613a3a4d6f64756c653c543e206173206672616d655f6d657461646174613a3a4d6f64756c654572726f724d657461646174613e3a3a6d657461646174613a3a6865373433393537303133663165363036ad05613c70616c6c65745f696d5f6f6e6c696e653a3a4d6f64756c653c543e206173206672616d655f6d657461646174613a3a4d6f64756c654572726f724d657461646174613e3a3a6d657461646174613a3a6836356338613331373034303261373033ae054470616c6c65745f6772616e6470613a3a4d6f64756c653c543e3a3a646f5f7265706f72745f65717569766f636174696f6e3a3a6831633662373666363561396339663661af05386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a7075743a3a6839306336653139653664623562303837b005386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6838343031343932616238626333363836b105386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a7075743a3a6837396161346264373962643037616536b2056b3c7061726974795f7363616c655f636f6465633a3a636f6d706163743a3a436f6d706163743c7533323e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6830306465303632666632653138376664b3056c3c7061726974795f7363616c655f636f6465633a3a636f6d706163743a3a436f6d706163743c753132383e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6839346438666666623666623836323334b4056f3c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a42547265654d61703c4b2c563e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6864366162613562633232343437333536b50584016672616d655f6578656375746976653a3a4578656375746976653c53797374656d2c426c6f636b2c436f6e746578742c556e7369676e656456616c696461746f722c416c6c4d6f64756c65732c434f6e52756e74696d65557067726164653e3a3a696e697469616c697a655f626c6f636b3a3a6864323836386661373332333733343937b60586016672616d655f6578656375746976653a3a4578656375746976653c53797374656d2c426c6f636b2c436f6e746578742c556e7369676e656456616c696461746f722c416c6c4d6f64756c65732c434f6e52756e74696d65557067726164653e3a3a657874726163745f7072655f6469676573743a3a6831353431316563353761663064393635b7058c016672616d655f6578656375746976653a3a4578656375746976653c53797374656d2c426c6f636b2c436f6e746578742c556e7369676e656456616c696461746f722c416c6c4d6f64756c65732c434f6e52756e74696d65557067726164653e3a3a6170706c795f65787472696e7369635f776974685f6c656e3a3a6838393064383636383132363139366461b80545616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a42547265654d61703c4b2c563e3a3a6765743a3a6830626138646236393739663335656434b9053e747269655f64623a3a7472696564626d75743a3a5472696544424d75743c4c3e3a3a696e736572745f61743a3a6865323836646536303162343933383234ba053c747269655f64623a3a7472696564626d75743a3a4e6f64653c4f3e3a3a66726f6d5f656e636f6465643a3a6838346461333331363534326634346162bb0545747269655f64623a3a7472696564626d75743a3a5472696544424d75743c4c3e3a3a696e736572745f696e73706563746f723a3a6863313165643336663430386463623532bc05363c5420617320636f72653a3a636f6e766572743a3a496e746f3c553e3e3a3a696e746f3a3a6864643439366363656165333165366330bd05376861736862726f776e3a3a7365743a3a486173685365743c542c533e3a3a696e736572743a3a6863636635613161623930623637363532be053e747269655f64623a3a7472696564626d75743a3a4e6f64653c4f3e3a3a696e6c696e655f6f725f686173683a3a6866636664636638663432393161326538bf0535747269655f64623a3a7472696564626d75743a3a656d7074795f6368696c6472656e3a3a6832366562343131326433366139346235c00565747269655f64623a3a6e6962626c653a3a6e6962626c65736c6963653a3a3c696d706c20747269655f64623a3a6e6962626c653a3a4e6962626c65536c6963653e3a3a746f5f73746f7265645f72616e67653a3a6835306131326136343339633539383535c105763c706f6c6b61646f745f72756e74696d655f636f6d6d6f6e3a3a6174746573746174696f6e733a3a4d6f64756c653c543e206173206672616d655f6d657461646174613a3a4d6f64756c654572726f724d657461646174613e3a3a6d657461646174613a3a6866616433346233326166636630646165c205766672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a76616c75653a3a3c696d706c206672616d655f737570706f72743a3a73746f726167653a3a53746f7261676556616c75653c543e20666f7220473e3a3a6765743a3a6839353565376234313565666332393066c305457363686e6f72726b656c3a3a706f696e74733a3a52697374726574746f426f74683a3a66726f6d5f636f6d707265737365643a3a6862363438363662393331373064653061c405367363686e6f72726b656c3a3a7672663a3a7672665f6d616c6c6561626c655f686173683a3a6863363136313438323662396439636136c5053970616c6c65745f626162653a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6864373035346332663330363365643030c6053b70616c6c65745f626162653a3a4d6f64756c653c543e3a3a73746f726167655f6d657461646174613a3a6836393137313735323231653237366337c705723c70616c6c65745f626162653a3a5f5f47657442797465537472756374556e646572436f6e737472756374696f6e3c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6835336639366162663435656363323834c8056b3c70616c6c65745f626162653a3a5f5f4765744279746553747275637452616e646f6d6e6573733c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6863313939303337363366623630316433c9054470616c6c65745f626162653a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a6833396538333265613938646636643761ca059a013c70616c6c65745f626162653a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a4578706563746564426c6f636b54696d6544656661756c74427974654765747465723c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6864353563626537316361613965613134cb0596013c70616c6c65745f626162653a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a45706f63684475726174696f6e44656661756c74427974654765747465723c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6838643465343337306261333434343934cc053a70616c6c65745f70726f78793a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6833653039336463393866663536383335cd053c70616c6c65745f70726f78793a3a4d6f64756c653c543e3a3a73746f726167655f6d657461646174613a3a6862356565343237363165313330663737ce05693c70616c6c65745f70726f78793a3a5f5f4765744279746553747275637450726f786965733c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6861643066333331343636656534373230cf054570616c6c65745f70726f78793a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a6861643831333633393639333838333938d00594013c70616c6c65745f70726f78793a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a4d617850726f7869657344656661756c74427974654765747465723c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6862653134623462363735303766333666d1059c013c70616c6c65745f70726f78793a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a50726f78794465706f736974466163746f7244656661756c74427974654765747465723c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6830653538366434386261666536643334d2059a013c70616c6c65745f70726f78793a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a50726f78794465706f7369744261736544656661756c74427974654765747465723c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6833626532643664656462653537613132d305386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6864613831323330353437363533323831d405386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a7075743a3a6830396238656638623834633363323436d505386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a7075743a3a6863333730646435336136663065636366d60553706f6c6b61646f745f72756e74696d655f636f6d6d6f6e3a3a6174746573746174696f6e733a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6835303639356263333936316630373861d70555706f6c6b61646f745f72756e74696d655f636f6d6d6f6e3a3a6174746573746174696f6e733a3a4d6f64756c653c543e3a3a73746f726167655f6d657461646174613a3a6830313138623162336634303538613961d8055d3c70616c6c65745f70726f78793a3a4d6f64756c653c543e206173206672616d655f6d657461646174613a3a4d6f64756c654572726f724d657461646174613e3a3a6d657461646174613a3a6832343933356634343163646161626235d9054170616c6c65745f626162653a3a4d6f64756c653c543e3a3a646f5f7265706f72745f65717569766f636174696f6e3a3a6863373264386234613138313263313136da05733c70616c6c65745f70726f78793a3a43616c6c3c543e206173206672616d655f737570706f72743a3a7472616974733a3a556e66696c7465726564446973706174636861626c653e3a3a64697370617463685f6279706173735f66696c7465723a3a6830356536653361303735643461616261db055c6672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6d61703a3a53746f726167654d61703a3a73746f726167655f6d61705f66696e616c5f6b65793a3a6866363938343463343530353264636433dc05386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6864343366633030343564313335393230dd05763c70616c6c65745f617574686f726974795f646973636f766572793a3a43616c6c3c543e206173206672616d655f737570706f72743a3a776569676874733a3a4765744469737061746368496e666f3e3a3a6765745f64697370617463685f696e666f3a3a6831626661316661633461666362386438de057273705f73657373696f6e3a3a5f3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f646520666f722073705f73657373696f6e3a3a4d656d6265727368697050726f6f663e3a3a6465636f64653a3a6835316132623934346438313438653538df057273705f73657373696f6e3a3a5f3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f646520666f722073705f73657373696f6e3a3a4d656d6265727368697050726f6f663e3a3a6465636f64653a3a6864643863303431623439643939613332e0057c7061726974795f7363616c655f636f6465633a3a636f6465633a3a696e6e65725f7475706c655f696d706c3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f646520666f72202851302c5230293e3a3a6465636f64653a3a6839336230366665326163396337323834e1057c7061726974795f7363616c655f636f6465633a3a636f6465633a3a696e6e65725f7475706c655f696d706c3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f646520666f72202851302c5230293e3a3a6465636f64653a3a6864326330333566643136396666363364e2053c7061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653a3a656e636f64653a3a6838323861663762383466313436336438e3058f0173705f636f6e73656e7375735f736c6f74733a3a5f3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f646520666f722073705f636f6e73656e7375735f736c6f74733a3a45717569766f636174696f6e50726f6f663c4865616465722c49643e3e3a3a6465636f64653a3a6834316238383335303431653635666237e4058f0173705f636f6e73656e7375735f736c6f74733a3a5f3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f646520666f722073705f636f6e73656e7375735f736c6f74733a3a45717569766f636174696f6e50726f6f663c4865616465722c49643e3e3a3a6465636f64653a3a6864326434666539663235323865363230e5054570616c6c65745f66696e616c6974795f747261636b65723a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6830343833663332353162383465353765e6054770616c6c65745f66696e616c6974795f747261636b65723a3a4d6f64756c653c543e3a3a73746f726167655f6d657461646174613a3a6833306665336130663964316164393236e7055070616c6c65745f66696e616c6974795f747261636b65723a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a6863383131613236393033363434366264e8059f013c70616c6c65745f66696e616c6974795f747261636b65723a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a57696e646f7753697a6544656661756c74427974654765747465723c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6834646636376635663363366366313863e9054f3c6d656d6f72795f64623a3a4d656d6f727944423c482c4b462c542c4d3e20617320686173685f64623a3a4861736844423c482c543e3e3a3a6765743a3a6838313565353138313635383036303639ea05533c6d656d6f72795f64623a3a4d656d6f727944423c482c4b462c542c4d3e20617320686173685f64623a3a4861736844423c482c543e3e3a3a656d706c6163653a3a6839353537373630323164623836663064eb05386861736862726f776e3a3a6d61703a3a486173684d61703c4b2c562c533e3a3a656e7472793a3a6835333436376631623863356566383032ec053d6861736862726f776e3a3a6d61703a3a566163616e74456e7472793c4b2c562c533e3a3a696e736572743a3a6836396264623133626332396431306236ed05523c6d656d6f72795f64623a3a4d656d6f727944423c482c4b462c542c4d3e20617320686173685f64623a3a4861736844423c482c543e3e3a3a72656d6f76653a3a6834396331616638613039323335396236ee05543c6d656d6f72795f64623a3a4d656d6f727944423c482c4b462c542c4d3e20617320686173685f64623a3a4861736844423c482c543e3e3a3a636f6e7461696e733a3a6864656264616562366266376435363534ef05583c6d656d6f72795f64623a3a4d656d6f727944423c482c4b462c542c4d3e20617320686173685f64623a3a41734861736844423c482c543e3e3a3a61735f686173685f64623a3a6833333332343964333930373962356265f0055c3c6d656d6f72795f64623a3a4d656d6f727944423c482c4b462c542c4d3e20617320686173685f64623a3a41734861736844423c482c543e3e3a3a61735f686173685f64625f6d75743a3a6865346131633864613739316664663337f105523c6d656d6f72795f64623a3a4d656d6f727944423c482c4b462c542c4d3e20617320686173685f64623a3a4861736844425265663c482c543e3e3a3a6765743a3a6837366133303563356138376239393838f205573c6d656d6f72795f64623a3a4d656d6f727944423c482c4b462c542c4d3e20617320686173685f64623a3a4861736844425265663c482c543e3e3a3a636f6e7461696e733a3a6839313863353637343562366166616361f305683c70616c6c65745f66696e616c6974795f747261636b65723a3a4d6f64756c653c543e206173206672616d655f6d657461646174613a3a4d6f64756c654572726f724d657461646174613e3a3a6d657461646174613a3a6839616333616136356334653766333861f4050c436f72655f76657273696f6ef50512436f72655f657865637574655f626c6f636bf6055373705f696f3a3a747269653a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a626c616b65325f3235365f6f7264657265645f726f6f743a3a6866623330343735613235373462383663f7054573705f696f3a3a6d6973633a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a7072696e745f6865783a3a6861316639643430303039396539613633f8055073705f696f3a3a63727970746f3a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a73746172745f62617463685f7665726966793a3a6837323032643663666162336562616531f9055173705f696f3a3a63727970746f3a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a66696e6973685f62617463685f7665726966793a3a6861313731616133666361346631656137fa0515436f72655f696e697469616c697a655f626c6f636bfb05114d657461646174615f6d65746164617461fc051c426c6f636b4275696c6465725f6170706c795f65787472696e736963fd051b426c6f636b4275696c6465725f66696e616c697a655f626c6f636bfe0520426c6f636b4275696c6465725f696e686572656e745f65787472696e73696373ff051c426c6f636b4275696c6465725f636865636b5f696e686572656e7473800618426c6f636b4275696c6465725f72616e646f6d5f7365656481062b5461676765645472616e73616374696f6e51756575655f76616c69646174655f7472616e73616374696f6e8206214f6666636861696e576f726b65724170695f6f6666636861696e5f776f726b657283064c73705f696f3a3a6f6666636861696e3a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a69735f76616c696461746f723a3a686136663531373133336335323462366684065173705f696f3a3a63727970746f3a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a737232353531395f7075626c69635f6b6579733a3a683462326365353339363831353032616485061850617261636861696e486f73745f76616c696461746f727386061950617261636861696e486f73745f647574795f726f7374657287061f50617261636861696e486f73745f6163746976655f70617261636861696e7388062450617261636861696e486f73745f676c6f62616c5f76616c69646174696f6e5f6461746189062350617261636861696e486f73745f6c6f63616c5f76616c69646174696f6e5f646174618a061c50617261636861696e486f73745f70617261636861696e5f636f64658b061750617261636861696e486f73745f6765745f68656164738c061d50617261636861696e486f73745f7369676e696e675f636f6e746578748d061f50617261636861696e486f73745f646f776e776172645f6d657373616765738e061e4772616e6470614170695f6772616e6470615f617574686f7269746965738f06384772616e6470614170695f7375626d69745f7265706f72745f65717569766f636174696f6e5f756e7369676e65645f65787472696e7369639006274772616e6470614170695f67656e65726174655f6b65795f6f776e6572736869705f70726f6f66910615426162654170695f636f6e66696775726174696f6e92061b426162654170695f63757272656e745f65706f63685f7374617274930624426162654170695f67656e65726174655f6b65795f6f776e6572736869705f70726f6f66940635426162654170695f7375626d69745f7265706f72745f65717569766f636174696f6e5f756e7369676e65645f65787472696e736963950621417574686f72697479446973636f766572794170695f617574686f72697469657396062153657373696f6e4b6579735f67656e65726174655f73657373696f6e5f6b65797397064e73705f696f3a3a63727970746f3a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a656432353531395f67656e65726174653a3a686232396465326238306332333266393598064e73705f696f3a3a63727970746f3a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a737232353531395f67656e65726174653a3a686434373634326163663035613736393199061f53657373696f6e4b6579735f6465636f64655f73657373696f6e5f6b6579739a0638616c6c6f633a3a7665633a3a5665633c543e3a3a657874656e645f66726f6d5f736c6963653a3a68393135326230383466613061636238339b061d4163636f756e744e6f6e63654170695f6163636f756e745f6e6f6e63659c06205472616e73616374696f6e5061796d656e744170695f71756572795f696e666f9d0630636f72653a3a6f70733a3a66756e6374696f6e3a3a466e3a3a63616c6c3a3a68313635656634323061633631326637319e0637636f72653a3a6f70733a3a66756e6374696f6e3a3a466e4d75743a3a63616c6c5f6d75743a3a68363430623537663864353133316631319f0648636f72653a3a6f70733a3a66756e6374696f6e3a3a466e4f6e63653a3a63616c6c5f6f6e63657b7b767461626c652e7368696d7d7d3a3a6837336634623564623431653963643932a006733c726f636f636f5f72756e74696d653a3a4f726967696e20617320636f72653a3a636f6e766572743a3a46726f6d3c726f636f636f5f72756e74696d653a3a4f726967696e43616c6c65723e3e3a3a66726f6d3a3a7b7b636c6f737572657d7d3a3a6831613538653365656361636466643366a10648636f72653a3a6f70733a3a66756e6374696f6e3a3a466e4f6e63653a3a63616c6c5f6f6e63657b7b767461626c652e7368696d7d7d3a3a6863396538373238653536636162663935a206753c726f636f636f5f72756e74696d653a3a50726f787954797065206173206672616d655f737570706f72743a3a7472616974733a3a496e7374616e636546696c7465723c726f636f636f5f72756e74696d653a3a43616c6c3e3e3a3a66696c7465723a3a6866313735356538643765666266353264a30642726f636f636f5f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f73797374656d3a3a6831653538643334623063333238353537a40643726f636f636f5f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f696e64696365733a3a6866643830323965633837626263653862a50644726f636f636f5f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f62616c616e6365733a3a6864336363643062323233663733303763a60644726f636f636f5f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f6f6666656e6365733a3a6833643764373964636538353963373766a70643726f636f636f5f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f73657373696f6e3a3a6861306161613762303065666236376138a80643726f636f636f5f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f6772616e6470613a3a6830393961613537636464303831306533a90645726f636f636f5f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f696d5f6f6e6c696e653a3a6864653337316439393362383539313332aa0645726f636f636f5f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f7265676973747261723a3a6865393932356365656339396530633766ab0643726f636f636f5f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f7574696c6974793a3a6833633363356461356163373831636563ac0644726f636f636f5f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f6964656e746974793a3a6862386561353865346637343331376638ad0644726f636f636f5f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f7265636f766572793a3a6863666339333134343438393334323464ae0643726f636f636f5f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f76657374696e673a3a6831383330343461373839626462613334af0645726f636f636f5f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f7363686564756c65723a3a6837646130363466396632616363393938b00640726f636f636f5f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f7375646f3a3a6837373634373536373566623636323561b10641726f636f636f5f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f70726f78793a3a6862333266373133616330313938316565b20644726f636f636f5f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f6d756c74697369673a3a6861333430396564343537663165373636b3062b636f72653a3a7074723a3a64726f705f696e5f706c6163653a3a6833363838613234616338636465656361b4066a3c726f636f636f5f72756e74696d653a3a4f726967696e206173206672616d655f737570706f72743a3a7472616974733a3a4f726967696e54726169743e3a3a6164645f66696c7465723a3a7b7b636c6f737572657d7d3a3a6862316431376263343565323734373639b50648636f72653a3a6f70733a3a66756e6374696f6e3a3a466e4f6e63653a3a63616c6c5f6f6e63657b7b767461626c652e7368696d7d7d3a3a6834626464356363646137336366366666b6062b636f72653a3a7074723a3a64726f705f696e5f706c6163653a3a6832343233666530373236666163346233b7062b636f72653a3a7074723a3a64726f705f696e5f706c6163653a3a6861636630306366306165636636373661b8063a73705f61726974686d657469633a3a62696775696e743a3a42696755696e743a3a6c73747269703a3a6835393539303133353339313864303830b9063773705f61726974686d657469633a3a62696775696e743a3a42696755696e743a3a6d756c3a3a6861333732333935373531313631383134ba06443c616c6c6f633a3a7665633a3a5665633c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a6865613935616563663562326134363430bb064473705f61726974686d657469633a3a62696775696e743a3a42696755696e743a3a6469763a3a7b7b636c6f737572657d7d3a3a6865373966343662363133666162616636bc063773705f61726974686d657469633a3a62696775696e743a3a42696755696e743a3a6164643a3a6838646463616135646437613362333863bd063d3c5420617320636f72653a3a636f6e766572743a3a547279496e746f3c553e3e3a3a7472795f696e746f3a3a6835636664643635653231646537623865be06303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6839653165323032643638333262383633bf06413c73705f696e686572656e74733a3a4572726f7220617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6831386131643738356235326462396339c006543c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6865326236623337333565616333636431c106323c265420617320636f72653a3a666d743a3a446973706c61793e3a3a666d743a3a6838613933333264653834633763623137c2064573705f696f3a3a616c6c6f6361746f723a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a667265653a3a6831616165643832336233643730336661c3064773705f696f3a3a616c6c6f6361746f723a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a6d616c6c6f633a3a6839346463613132306433643433323736c4067773705f72756e74696d655f696e746572666163653a3a706173735f62793a3a3c696d706c2073705f72756e74696d655f696e746572666163653a3a7761736d3a3a496e746f46464956616c756520666f7220543e3a3a696e746f5f6666695f76616c75653a3a6837366166306464323866336132303062c5067773705f72756e74696d655f696e746572666163653a3a706173735f62793a3a3c696d706c2073705f72756e74696d655f696e746572666163653a3a7761736d3a3a46726f6d46464956616c756520666f7220543e3a3a66726f6d5f6666695f76616c75653a3a6834653365363235663264636464383737c606573c73705f72756e74696d653a3a72756e74696d655f737472696e673a3a52756e74696d65537472696e6720617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6839633331373336363132653833643264c7062e616c6c6f633a3a7665633a3a5665633c543e3a3a726573657276653a3a6864643464613030373539303263323065c806473c73705f72756e74696d653a3a44697370617463684572726f7220617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6863633731656132363336666663613763c90656747269655f64623a3a6e6962626c653a3a6e6962626c657665633a3a3c696d706c20747269655f64623a3a6e6962626c653a3a4e6962626c655665633e3a3a707573683a3a6830613835333665303433633337636633ca0634736d616c6c7665633a3a536d616c6c5665633c413e3a3a66726f6d5f736c6963653a3a6865613836363432393362316462653231cb06095f5f756d6f64746933cc06085f5f6d756c746933cd06095f5f6173686c746933ce063d636f6d70696c65725f6275696c74696e733a3a696e743a3a756469763a3a5f5f756469766d6f647469343a3a6863323931636637303831626632373330cf06066d656d637079d006076d656d6d6f7665d106066d656d736574d2060462636d70d306095f5f75646976746933d406095f5f6c73687274693300550970726f64756365727302086c616e6775616765010452757374000c70726f6365737365642d62790105727573746325312e34362e302d6e696768746c79202831363935376264346420323032302d30362d333029", - "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb3d560e0b6940e074462475fe5406a7cb6a64c51d0af9d3ab5c2151bcae982fb812f7a76b706914d6a": "0x0e6d7d1afbcc6547b92995a394ba0daed07a2420be08220a5a1336c6731f0bfaa076ef1280d768051f21d060623da3ab5b56944d681d303ed2d4bf658c5bed3586975a37211f8704e947a365b720f7a3e2757988eaa7d0f197e83dba355ef74306a7f34a2ae69cc0cca633c7a82b37cfba821707eb62ffe065b242e1230e4661f49eae66a0ac9f610316906ec8f1a0928e20d7059d76a5ca53cbcb5a9b50dd3c", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19500d1064d79ff558056772616e800e6d7d1afbcc6547b92995a394ba0daed07a2420be08220a5a1336c6731f0bfa": "0x62475fe5406a7cb6a64c51d0af9d3ab5c2151bcae982fb812f7a76b706914d6a", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950438ac98f6d864839696d6f6e80d2f9d537ffa59919a4028afdb627c14c14c97a1547e13e8e82203d2049b15b1a": "0x02a2d8cfcf75dda85fafc04ace3bcb73160034ed1964c43098fb1fe831de1b16", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa195068dec3fce5ade0966261626580da6b2df18f0f9001a6dcf1d301b92534fe9b1f3ccfa10c49449fee93adaa8349": "0x8062e9c21f1d92926103119f7e8153cebdb1e5ab3e52d6f395be80bb193eab47", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950a00d3cb0425699a66772616e804bea0b37e0cce9bddd80835fa2bfd5606f5dcfb8388bbb10b10c483f0856cf14": "0xfa373e25a1c4fe19c7148acde13bc3db1811cf656dc086820f3dda736b9c4a00", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa195043d506aedab0d2ce696d6f6e8048a910c0af90898f11bd57d37ceaea53c78994f8e1833a7ade483c9a84bde055": "0x520b48452969f6ddf263b664de0adb0c729d0e0ad3b0e5f3cb636c541bc9022a", - "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb33bb8d7990ae3975438f3c2f38f6d47f161e98c697bbe3ca0e47c033460afda0dda314ab4222a0404": "0x36be9069cdb4a8a07ecd51f257875150f0a8a1be44a10d9d98dabf10a030aef4764186bc30fd5a02477f19948dc723d6d57ab174debd4f80ed6038ec960bfe218e95b9b5b4dc69790b67b566567ca8bf8cdef3a3a8bb65393c0d1d1c87cd2d2cf2d19482d1da872af925e84478787e0719f637bd1f88c0c99316bdf2658d54782496f28d887d84705c6dae98aee8bf90fc5ad10bb5545eca1de6b68425b70f7c", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950520b06fa3d6f6aa67061726180a809aaaaebc04051536c99166c99f0cba19c7b5950cd8a37882dd56220f2e84f": "0xfa373e25a1c4fe19c7148acde13bc3db1811cf656dc086820f3dda736b9c4a00", - "0x3a6772616e6470615f617574686f726974696573": "0x01200e6d7d1afbcc6547b92995a394ba0daed07a2420be08220a5a1336c6731f0bfa0100000000000000fcd5f87a6fd5707a25122a01b4dac0a8482259df7d42a9a096606df1320df08d0100000000000000e1b68fbd84333e31486c08e6153d9a1415b2e7e71b413702b7d64e9b631184a1010000000000000036be9069cdb4a8a07ecd51f257875150f0a8a1be44a10d9d98dabf10a030aef401000000000000006c878e33b83c20324238d22240f735457b6fba544b383e70bb62a27b57380c810100000000000000d9c056c98ca0e6b4eb7f5c58c007c1db7be0fe1f3776108f797dd4990d1ccc3301000000000000004bea0b37e0cce9bddd80835fa2bfd5606f5dcfb8388bbb10b10c483f0856cf1401000000000000004ee66173993dd0db5d628c4c9cb61a27b76611ad3c3925947f0d0011ee2c5dcc0100000000000000", - "0x3fba98689ebed1138735e0e7a5a790ab0b76934f4cc08dee01012d059e1b83ee": "0x00", - "0x2b06af9719ac64d755623cda8ddd9b949f99a2ce711f3a31b2fc05604c93f179": "0x2086975a37211f8704e947a365b720f7a3e2757988eaa7d0f197e83dba355ef74348a910c0af90898f11bd57d37ceaea53c78994f8e1833a7ade483c9a84bde055ee93e26259decb89afcf17ef2aa0fa2db2e1042fb8f56ecfb24d19eae86298788e95b9b5b4dc69790b67b566567ca8bf8cdef3a3a8bb65393c0d1d1c87cd2d2cd2f9d537ffa59919a4028afdb627c14c14c97a1547e13e8e82203d2049b15b1ac4a980da30939d5bb9e4a734d12bf81259ae286aa21fa4b65405347fa40eff35560d90ca51e9c9481b8a9810060e04d0708d246714960439f804e5c6f40ca65192156f54a114ee191415898f2da013d9db6a5362d6b36330d5fc23e27360ab66", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19503d7dc9205a149f6a6175646980306ac5c772fe858942f92b6e28bd82fb7dd8cdd25f9a4626c1b0eee075fcb531": "0x02a2d8cfcf75dda85fafc04ace3bcb73160034ed1964c43098fb1fe831de1b16", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950585cf1f6f8e46326696d6f6e8086975a37211f8704e947a365b720f7a3e2757988eaa7d0f197e83dba355ef743": "0x62475fe5406a7cb6a64c51d0af9d3ab5c2151bcae982fb812f7a76b706914d6a", - "0x0b76934f4cc08dee01012d059e1b83ee5e0621c4869aa60c02be9adcc98a0d1d": "0x2006a7f34a2ae69cc0cca633c7a82b37cfba821707eb62ffe065b242e1230e4661ac3ce74c09d1bb387d3f79dc8df88d661da689d5364eb8131c83fcc8ecb2fc5b6caf2fe2cf01fc3f07e113a2940a1d6c7bc1ab9d8974f152c2ee201d4f16f67af2d19482d1da872af925e84478787e0719f637bd1f88c0c99316bdf2658d547846d6245026e0e4f4a120cfdfbc9f36a37de202489c4c7ff05b6c54d1811aee2c0062a5ab339962d84b6711b86fa67b457483fcd3d75dafb7bd15f182b7434227a809aaaaebc04051536c99166c99f0cba19c7b5950cd8a37882dd56220f2e84f6edd19e3c5230998e533e165a26438afe663368d0eab37fabff734a36119ce0e", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9b483908290ae9b936c519917440306ea62475fe5406a7cb6a64c51d0af9d3ab5c2151bcae982fb812f7a76b706914d6a": "0x000000000100407a10f35a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb3c25dd840975e8979fa373e25a1c4fe19c7148acde13bc3db1811cf656dc086820f3dda736b9c4a00": "0x4bea0b37e0cce9bddd80835fa2bfd5606f5dcfb8388bbb10b10c483f0856cf14720537e2c1c554654d73b3889c3ef4c3c2f95a65dd3f7c185ebe4afebed78372560d90ca51e9c9481b8a9810060e04d0708d246714960439f804e5c6f40ca651a809aaaaebc04051536c99166c99f0cba19c7b5950cd8a37882dd56220f2e84f64d59feddb3d00316a55906953fb3db8985797472bd2e6c7ea1ab730cc339d7f", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa195012b62e212b6a7a9c696d6f6e808e95b9b5b4dc69790b67b566567ca8bf8cdef3a3a8bb65393c0d1d1c87cd2d2c": "0x38f3c2f38f6d47f161e98c697bbe3ca0e47c033460afda0dda314ab4222a0404", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950ee41af0530f856db6772616e8036be9069cdb4a8a07ecd51f257875150f0a8a1be44a10d9d98dabf10a030aef4": "0x38f3c2f38f6d47f161e98c697bbe3ca0e47c033460afda0dda314ab4222a0404", - "0xc2261276cc9d1f8598ea4b6a74b15c2f308ce9615de0775a82f8a94dc3d285a1": "0x01", - "0x1cb6f36e027abb2091cfb5110ab5087f5e0621c4869aa60c02be9adcc98a0d1d": "0x20a076ef1280d768051f21d060623da3ab5b56944d681d303ed2d4bf658c5bed35010000000000000038757d0de00a0c739e7d7984ef4bc01161bd61e198b7c01b618425c16bb5bd5f0100000000000000d2644c1ab2c63a3ad8d40ad70d4b260969e3abfe6d7e6665f50dc9f6365c9d2a0100000000000000764186bc30fd5a02477f19948dc723d6d57ab174debd4f80ed6038ec960bfe2101000000000000007c94715e5dd8ab54221b1b6b2bfa5666f593f28a92a18e28052531de1bd808130100000000000000bab3cccdcc34401e9b3971b96a662686cf755aa869a5c4b762199ce531b12c5b0100000000000000720537e2c1c554654d73b3889c3ef4c3c2f95a65dd3f7c185ebe4afebed783720100000000000000da6b2df18f0f9001a6dcf1d301b92534fe9b1f3ccfa10c49449fee93adaa83490100000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da90d10cc4959af6a68eba3bc06d5c7bc28520b48452969f6ddf263b664de0adb0c729d0e0ad3b0e5f3cb636c541bc9022a": "0x000000000100407a10f35a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19501e69501baac264d4696d6f6e80ee93e26259decb89afcf17ef2aa0fa2db2e1042fb8f56ecfb24d19eae8629878": "0x92ef83665b39d7a565e11bf8d18d41d45a8011601c339e57a8ea88c8ff7bba6f", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19503c75eb9438a505fc6261626580a076ef1280d768051f21d060623da3ab5b56944d681d303ed2d4bf658c5bed35": "0x62475fe5406a7cb6a64c51d0af9d3ab5c2151bcae982fb812f7a76b706914d6a", - "0x26aa394eea5630e07c48ae0c9558cef78a42f33323cb5ced3b44dd825fda9fcc": "0x4545454545454545454545454545454545454545454545454545454545454545", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9a606acaa4558183a2102457959a213a192ef83665b39d7a565e11bf8d18d41d45a8011601c339e57a8ea88c8ff7bba6f": "0x000000000100407a10f35a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950776743a4ae520892617564698064d59feddb3d00316a55906953fb3db8985797472bd2e6c7ea1ab730cc339d7f": "0xfa373e25a1c4fe19c7148acde13bc3db1811cf656dc086820f3dda736b9c4a00", - "0xcec5070d609dd3497f72bde07fc96ba0e0cdd062e6eaf24295ad4ccfc41d4609": "0x2062475fe5406a7cb6a64c51d0af9d3ab5c2151bcae982fb812f7a76b706914d6a0e6d7d1afbcc6547b92995a394ba0daed07a2420be08220a5a1336c6731f0bfaa076ef1280d768051f21d060623da3ab5b56944d681d303ed2d4bf658c5bed3586975a37211f8704e947a365b720f7a3e2757988eaa7d0f197e83dba355ef74306a7f34a2ae69cc0cca633c7a82b37cfba821707eb62ffe065b242e1230e4661f49eae66a0ac9f610316906ec8f1a0928e20d7059d76a5ca53cbcb5a9b50dd3c520b48452969f6ddf263b664de0adb0c729d0e0ad3b0e5f3cb636c541bc9022afcd5f87a6fd5707a25122a01b4dac0a8482259df7d42a9a096606df1320df08d38757d0de00a0c739e7d7984ef4bc01161bd61e198b7c01b618425c16bb5bd5f48a910c0af90898f11bd57d37ceaea53c78994f8e1833a7ade483c9a84bde055ac3ce74c09d1bb387d3f79dc8df88d661da689d5364eb8131c83fcc8ecb2fc5bf6f8fe475130d21165446a02fb1dbce3a7bf36412e5d98f4f0473aed9252f34992ef83665b39d7a565e11bf8d18d41d45a8011601c339e57a8ea88c8ff7bba6fe1b68fbd84333e31486c08e6153d9a1415b2e7e71b413702b7d64e9b631184a1d2644c1ab2c63a3ad8d40ad70d4b260969e3abfe6d7e6665f50dc9f6365c9d2aee93e26259decb89afcf17ef2aa0fa2db2e1042fb8f56ecfb24d19eae86298786caf2fe2cf01fc3f07e113a2940a1d6c7bc1ab9d8974f152c2ee201d4f16f67a2c57f81fd311c1ab53813c6817fe67f8947f8d39258252663b3384ab4195494d38f3c2f38f6d47f161e98c697bbe3ca0e47c033460afda0dda314ab4222a040436be9069cdb4a8a07ecd51f257875150f0a8a1be44a10d9d98dabf10a030aef4764186bc30fd5a02477f19948dc723d6d57ab174debd4f80ed6038ec960bfe218e95b9b5b4dc69790b67b566567ca8bf8cdef3a3a8bb65393c0d1d1c87cd2d2cf2d19482d1da872af925e84478787e0719f637bd1f88c0c99316bdf2658d54782496f28d887d84705c6dae98aee8bf90fc5ad10bb5545eca1de6b68425b70f7c02a2d8cfcf75dda85fafc04ace3bcb73160034ed1964c43098fb1fe831de1b166c878e33b83c20324238d22240f735457b6fba544b383e70bb62a27b57380c817c94715e5dd8ab54221b1b6b2bfa5666f593f28a92a18e28052531de1bd80813d2f9d537ffa59919a4028afdb627c14c14c97a1547e13e8e82203d2049b15b1a46d6245026e0e4f4a120cfdfbc9f36a37de202489c4c7ff05b6c54d1811aee2c306ac5c772fe858942f92b6e28bd82fb7dd8cdd25f9a4626c1b0eee075fcb53102ea6bfa8b23b92fe4b5db1063a1f9475e3acd0ab61e6b4f454ed6ba00b5f864d9c056c98ca0e6b4eb7f5c58c007c1db7be0fe1f3776108f797dd4990d1ccc33bab3cccdcc34401e9b3971b96a662686cf755aa869a5c4b762199ce531b12c5bc4a980da30939d5bb9e4a734d12bf81259ae286aa21fa4b65405347fa40eff350062a5ab339962d84b6711b86fa67b457483fcd3d75dafb7bd15f182b7434227160ea09c5717270e958a3da42673fa011613a9539b2e4ebcad8626bc117ca04afa373e25a1c4fe19c7148acde13bc3db1811cf656dc086820f3dda736b9c4a004bea0b37e0cce9bddd80835fa2bfd5606f5dcfb8388bbb10b10c483f0856cf14720537e2c1c554654d73b3889c3ef4c3c2f95a65dd3f7c185ebe4afebed78372560d90ca51e9c9481b8a9810060e04d0708d246714960439f804e5c6f40ca651a809aaaaebc04051536c99166c99f0cba19c7b5950cd8a37882dd56220f2e84f64d59feddb3d00316a55906953fb3db8985797472bd2e6c7ea1ab730cc339d7f8062e9c21f1d92926103119f7e8153cebdb1e5ab3e52d6f395be80bb193eab474ee66173993dd0db5d628c4c9cb61a27b76611ad3c3925947f0d0011ee2c5dccda6b2df18f0f9001a6dcf1d301b92534fe9b1f3ccfa10c49449fee93adaa834992156f54a114ee191415898f2da013d9db6a5362d6b36330d5fc23e27360ab666edd19e3c5230998e533e165a26438afe663368d0eab37fabff734a36119ce0e4e262811acdfe94528bfc3c65036080426a0e1301b9ada8d687a70ffcae99c26", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950d7ce35a3ce71c3d76175646980160ea09c5717270e958a3da42673fa011613a9539b2e4ebcad8626bc117ca04a": "0x02ea6bfa8b23b92fe4b5db1063a1f9475e3acd0ab61e6b4f454ed6ba00b5f864", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950eaa747c43246bd0170617261806edd19e3c5230998e533e165a26438afe663368d0eab37fabff734a36119ce0e": "0x8062e9c21f1d92926103119f7e8153cebdb1e5ab3e52d6f395be80bb193eab47", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950f7aec8a47707294b61756469802c57f81fd311c1ab53813c6817fe67f8947f8d39258252663b3384ab4195494d": "0x92ef83665b39d7a565e11bf8d18d41d45a8011601c339e57a8ea88c8ff7bba6f", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950f6584bfaf470c1b26175646980f6f8fe475130d21165446a02fb1dbce3a7bf36412e5d98f4f0473aed9252f349": "0x520b48452969f6ddf263b664de0adb0c729d0e0ad3b0e5f3cb636c541bc9022a", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da914076ec446ba6876ba5cb99bdb7129be8062e9c21f1d92926103119f7e8153cebdb1e5ab3e52d6f395be80bb193eab47": "0x000000000100407a10f35a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950bad35ce880ec90d4696d6f6e80c4a980da30939d5bb9e4a734d12bf81259ae286aa21fa4b65405347fa40eff35": "0x02ea6bfa8b23b92fe4b5db1063a1f9475e3acd0ab61e6b4f454ed6ba00b5f864", - "0x3a65787472696e7369635f696e646578": "0x00000000", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950a31727416d0095b96772616e80e1b68fbd84333e31486c08e6153d9a1415b2e7e71b413702b7d64e9b631184a1": "0x92ef83665b39d7a565e11bf8d18d41d45a8011601c339e57a8ea88c8ff7bba6f", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950636f684eb09a15046772616e80d9c056c98ca0e6b4eb7f5c58c007c1db7be0fe1f3776108f797dd4990d1ccc33": "0x02ea6bfa8b23b92fe4b5db1063a1f9475e3acd0ab61e6b4f454ed6ba00b5f864", - "0x1cb6f36e027abb2091cfb5110ab5087f66e8f035c8adbe7f1547b43c51e6f8a4": "0x00000000", - "0xc2261276cc9d1f8598ea4b6a74b15c2f57c875e4cff74148e4628f264b974c80": "0x0000362b4c8ee30d0000000000000000", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950380896fa42b08eb470617261800062a5ab339962d84b6711b86fa67b457483fcd3d75dafb7bd15f182b7434227": "0x02ea6bfa8b23b92fe4b5db1063a1f9475e3acd0ab61e6b4f454ed6ba00b5f864", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950e7240ce913e160eb6261626580bab3cccdcc34401e9b3971b96a662686cf755aa869a5c4b762199ce531b12c5b": "0x02ea6bfa8b23b92fe4b5db1063a1f9475e3acd0ab61e6b4f454ed6ba00b5f864", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa195021e85cbadb3ce9a26772616e806c878e33b83c20324238d22240f735457b6fba544b383e70bb62a27b57380c81": "0x02a2d8cfcf75dda85fafc04ace3bcb73160034ed1964c43098fb1fe831de1b16", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da99677d775b618280f5c76d192b43ea38c38f3c2f38f6d47f161e98c697bbe3ca0e47c033460afda0dda314ab4222a0404": "0x000000000100407a10f35a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7a44704b568d21667356a5a050c118746b4def25cfda6ef3a00000000": "0x4545454545454545454545454545454545454545454545454545454545454545", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa195043f25e7a03a30387696d6f6e8092156f54a114ee191415898f2da013d9db6a5362d6b36330d5fc23e27360ab66": "0x8062e9c21f1d92926103119f7e8153cebdb1e5ab3e52d6f395be80bb193eab47" - }, - "childrenDefault": {} - } - } -} diff --git a/service/src/chain_spec.rs b/service/src/chain_spec.rs index 580d00b946..900742c3a2 100644 --- a/service/src/chain_spec.rs +++ b/service/src/chain_spec.rs @@ -21,11 +21,9 @@ use polkadot_primitives::v0::{AccountId, AccountPublic, ValidatorId}; use polkadot_runtime as polkadot; use kusama_runtime as kusama; use westend_runtime as westend; -use rococo_runtime as rococo; use polkadot::constants::currency::DOTS; use kusama::constants::currency::DOTS as KSM; use westend::constants::currency::DOTS as WND; -use rococo_runtime::constants::currency::DOTS as ROC; use sc_chain_spec::{ChainSpecExtension, ChainType}; use sp_runtime::{traits::IdentifyAccount, Perbill}; use serde::{Serialize, Deserialize}; @@ -73,12 +71,6 @@ pub type WestendChainSpec = service::GenericChainSpec< Extensions, >; -/// The `ChainSpec parametrised for rococo runtime`. -pub type RococoChainSpec = service::GenericChainSpec< - rococo_runtime::GenesisConfig, - Extensions, ->; - pub fn polkadot_config() -> Result { PolkadotChainSpec::from_json_bytes(&include_bytes!("../res/polkadot.json")[..]) } @@ -91,10 +83,6 @@ pub fn westend_config() -> Result { WestendChainSpec::from_json_bytes(&include_bytes!("../res/westend.json")[..]) } -pub fn rococo_config() -> Result { - RococoChainSpec::from_json_bytes(&include_bytes!("../res/rococo.json")[..]) -} - fn polkadot_session_keys( babe: BabeId, grandpa: GrandpaId, @@ -125,16 +113,6 @@ fn westend_session_keys( westend::SessionKeys { babe, grandpa, im_online, parachain_validator, authority_discovery } } -fn rococo_session_keys( - babe: BabeId, - grandpa: GrandpaId, - im_online: ImOnlineId, - parachain_validator: ValidatorId, - authority_discovery: AuthorityDiscoveryId -) -> rococo_runtime::SessionKeys { - rococo_runtime::SessionKeys { babe, grandpa, im_online, parachain_validator, authority_discovery } -} - fn polkadot_staging_testnet_config_genesis(wasm_binary: &[u8]) -> polkadot::GenesisConfig { // subkey inspect "$SECRET" let endowed_accounts = vec![]; @@ -202,13 +180,6 @@ fn polkadot_staging_testnet_config_genesis(wasm_binary: &[u8]) -> polkadot::Gene pallet_authority_discovery: Some(polkadot::AuthorityDiscoveryConfig { keys: vec![], }), - parachains: Some(polkadot::ParachainsConfig { - authorities: vec![], - }), - registrar: Some(polkadot::RegistrarConfig { - parachains: vec![], - _phdata: Default::default(), - }), claims: Some(polkadot::ClaimsConfig { claims: vec![], vesting: vec![], @@ -343,13 +314,6 @@ fn westend_staging_testnet_config_genesis(wasm_binary: &[u8]) -> westend::Genesi pallet_authority_discovery: Some(westend::AuthorityDiscoveryConfig { keys: vec![], }), - parachains: Some(westend::ParachainsConfig { - authorities: vec![], - }), - registrar: Some(westend::RegistrarConfig { - parachains: vec![], - _phdata: Default::default(), - }), pallet_vesting: Some(westend::VestingConfig { vesting: vec![], }), @@ -359,197 +323,6 @@ fn westend_staging_testnet_config_genesis(wasm_binary: &[u8]) -> westend::Genesi } } -fn rococo_staging_testnet_config_genesis(wasm_binary: &[u8]) -> rococo_runtime::GenesisConfig { - // subkey inspect "$SECRET" - let endowed_accounts = vec![ - // 5FeyRQmjtdHoPH56ASFW76AJEP1yaQC1K9aEMvJTF9nzt9S9 - hex!["9ed7705e3c7da027ba0583a22a3212042f7e715d3c168ba14f1424e2bc111d00"].into(), - ]; - - // ./scripts/prepare-test-net.sh 8 - let initial_authorities: Vec<( - AccountId, - AccountId, - BabeId, - GrandpaId, - ImOnlineId, - ValidatorId, - AuthorityDiscoveryId - )> = vec![( - //5EHZkbp22djdbuMFH9qt1DVzSCvqi3zWpj6DAYfANa828oei - hex!["62475fe5406a7cb6a64c51d0af9d3ab5c2151bcae982fb812f7a76b706914d6a"].into(), - //5FeSEpi9UYYaWwXXb3tV88qtZkmSdB3mvgj3pXkxKyYLGhcd - hex!["9e6e781a76810fe93187af44c79272c290c2b9e2b8b92ee11466cd79d8023f50"].into(), - //5Fh6rDpMDhM363o1Z3Y9twtaCPfizGQWCi55BSykTQjGbP7H - hex!["a076ef1280d768051f21d060623da3ab5b56944d681d303ed2d4bf658c5bed35"].unchecked_into(), - //5CPd3zoV9Aaah4xWucuDivMHJ2nEEmpdi864nPTiyRZp4t87 - hex!["0e6d7d1afbcc6547b92995a394ba0daed07a2420be08220a5a1336c6731f0bfa"].unchecked_into(), - //5F7BEa1LGFksUihyatf3dCDYneB8pWzVyavnByCsm5nBgezi - hex!["86975a37211f8704e947a365b720f7a3e2757988eaa7d0f197e83dba355ef743"].unchecked_into(), - //5CDS33qmzmrBHWxVx5Vcz2Wim5b4aVS5C9yh3HpxqwmkrFwt - hex!["06a7f34a2ae69cc0cca633c7a82b37cfba821707eb62ffe065b242e1230e4661"].unchecked_into(), - //5HbSgM72xVuscsopsdeG3sCSCYdAeM1Tay9p79N6ky6vwDGq - hex!["f49eae66a0ac9f610316906ec8f1a0928e20d7059d76a5ca53cbcb5a9b50dd3c"].unchecked_into(), - ), - ( - //5DvH8oEjQPYhzCoQVo7WDU91qmQfLZvxe9wJcrojmJKebCmG - hex!["520b48452969f6ddf263b664de0adb0c729d0e0ad3b0e5f3cb636c541bc9022a"].into(), - //5ENZvCRzyXJJYup8bM6yEzb2kQHEb1NDpY2ZEyVGBkCfRdj3 - hex!["6618289af7ae8621981ffab34591e7a6486e12745dfa3fd3b0f7e6a3994c7b5b"].into(), - //5DLjSUfqZVNAADbwYLgRvHvdzXypiV1DAEaDMjcESKTcqMoM - hex!["38757d0de00a0c739e7d7984ef4bc01161bd61e198b7c01b618425c16bb5bd5f"].unchecked_into(), - //5HnDVBN9mD6mXyx8oryhDbJtezwNSj1VRXgLoYCBA6uEkiao - hex!["fcd5f87a6fd5707a25122a01b4dac0a8482259df7d42a9a096606df1320df08d"].unchecked_into(), - //5DhyXZiuB1LvqYKFgT5tRpgGsN3is2cM9QxgW7FikvakbAZP - hex!["48a910c0af90898f11bd57d37ceaea53c78994f8e1833a7ade483c9a84bde055"].unchecked_into(), - //5FxYBi73N4C9HQphtjCRDthxT2XLhd8e6BuYnxERQ7UJtAx6 - hex!["ac3ce74c09d1bb387d3f79dc8df88d661da689d5364eb8131c83fcc8ecb2fc5b"].unchecked_into(), - //5HeXbwb5PxtcRoopPZTp5CQun38atn2UudQ8p2AxR5BzoaXw - hex!["f6f8fe475130d21165446a02fb1dbce3a7bf36412e5d98f4f0473aed9252f349"].unchecked_into(), - ), - ( - //5FPMzsezo1PRxYbVpJMWK7HNbR2kUxidsAAxH4BosHa4wd6S - hex!["92ef83665b39d7a565e11bf8d18d41d45a8011601c339e57a8ea88c8ff7bba6f"].into(), - //5G6NQidFG7YiXsvV7hQTLGArir9tsYqD4JDxByhgxKvSKwRx - hex!["b235f57244230589523271c27b8a490922ffd7dccc83b044feaf22273c1dc735"].into(), - //5GpZhzAVg7SAtzLvaAC777pjquPEcNy1FbNUAG2nZvhmd6eY - hex!["d2644c1ab2c63a3ad8d40ad70d4b260969e3abfe6d7e6665f50dc9f6365c9d2a"].unchecked_into(), - //5HAes2RQYPbYKbLBfKb88f4zoXv6pPA6Ke8CjN7dob3GpmSP - hex!["e1b68fbd84333e31486c08e6153d9a1415b2e7e71b413702b7d64e9b631184a1"].unchecked_into(), - //5HTXBf36LXmkFWJLokNUK6fPxVpkr2ToUnB1pvaagdGu4c1T - hex!["ee93e26259decb89afcf17ef2aa0fa2db2e1042fb8f56ecfb24d19eae8629878"].unchecked_into(), - //5EXD52Bdz24J1N6i8hss7a5pfAARYmURgESatGXgjsV274Rk - hex!["6caf2fe2cf01fc3f07e113a2940a1d6c7bc1ab9d8974f152c2ee201d4f16f67a"].unchecked_into(), - //5D4r6YaB6F7A7nvMRHNFNF6zrR9g39bqDJFenrcaFmTCRwfa - hex!["2c57f81fd311c1ab53813c6817fe67f8947f8d39258252663b3384ab4195494d"].unchecked_into(), - ), - ( - //5DMNx7RoX6d7JQ38NEM7DWRcW2THu92LBYZEWvBRhJeqcWgR - hex!["38f3c2f38f6d47f161e98c697bbe3ca0e47c033460afda0dda314ab4222a0404"].into(), - //5GGdKNDr9P47dpVnmtq3m8Tvowwf1ot1abw6tPsTYYFoKm2v - hex!["ba0898c1964196474c0be08d364cdf4e9e1d47088287f5235f70b0590dfe1704"].into(), - //5EjkyPCzR2SjhDZq8f7ufsw6TfkvgNRepjCRQFc4TcdXdaB1 - hex!["764186bc30fd5a02477f19948dc723d6d57ab174debd4f80ed6038ec960bfe21"].unchecked_into(), - //5DJV3zCBTJBLGNDCcdWrYxWDacSz84goGTa4pFeKVvehEBte - hex!["36be9069cdb4a8a07ecd51f257875150f0a8a1be44a10d9d98dabf10a030aef4"].unchecked_into(), - //5FHf8kpK4fPjEJeYcYon2gAPwEBubRvtwpzkUbhMWSweKPUY - hex!["8e95b9b5b4dc69790b67b566567ca8bf8cdef3a3a8bb65393c0d1d1c87cd2d2c"].unchecked_into(), - //5HZ5hm2WTQEXaYAeH24h5kh2Q2rCbnJeiXNm9nhkxNXwwn8M - hex!["f2d19482d1da872af925e84478787e0719f637bd1f88c0c99316bdf2658d5478"].unchecked_into(), - //5CtgRR74VypK4h154s369abs78hDUxZSJqcbWsfXvsjcHJNA - hex!["2496f28d887d84705c6dae98aee8bf90fc5ad10bb5545eca1de6b68425b70f7c"].unchecked_into(), - ), - ( - //5C8AL1Zb4bVazgT3EgDxFgcow1L4SJjVu44XcLC9CrYqFN4N - hex!["02a2d8cfcf75dda85fafc04ace3bcb73160034ed1964c43098fb1fe831de1b16"].into(), - //5FLYy3YKsAnooqE4hCudttAsoGKbVG3hYYBtVzwMjJQrevPa - hex!["90cab33f0bb501727faa8319f0845faef7d31008f178b65054b6629fe531b772"].into(), - //5Et3tfbVf1ByFThNAuUq5pBssdaPPskip5yob5GNyUFojXC7 - hex!["7c94715e5dd8ab54221b1b6b2bfa5666f593f28a92a18e28052531de1bd80813"].unchecked_into(), - //5EX1JBghGbQqWohTPU6msR9qZ2nYPhK9r3RTQ2oD1K8TCxaG - hex!["6c878e33b83c20324238d22240f735457b6fba544b383e70bb62a27b57380c81"].unchecked_into(), - //5GqL8RbVAuNXpDhjQi1KrS1MyNuKhvus2AbmQwRGjpuGZmFu - hex!["d2f9d537ffa59919a4028afdb627c14c14c97a1547e13e8e82203d2049b15b1a"].unchecked_into(), - //5DfapfASpVBDsVxgM2FctoQXRX6oa9AbXY5uH7VxWu9esQFy - hex!["46d6245026e0e4f4a120cfdfbc9f36a37de202489c4c7ff05b6c54d1811aee2c"].unchecked_into(), - //5DABsdQCDUGuhzVGWe5xXzYQ9rtrVxRygW7RXf9Tsjsw1aGJ - hex!["306ac5c772fe858942f92b6e28bd82fb7dd8cdd25f9a4626c1b0eee075fcb531"].unchecked_into(), - ), - ( - //5C8XbDXdMNKJrZSrQURwVCxdNdk8AzG6xgLggbzuA399bBBF - hex!["02ea6bfa8b23b92fe4b5db1063a1f9475e3acd0ab61e6b4f454ed6ba00b5f864"].into(), - //5GsyzFP8qtF8tXPSsjhjxAeU1v7D1PZofuQKN9TdCc7Dp1JM - hex!["d4ffc4c05b47d1115ad200f7f86e307b20b46c50e1b72a912ec4f6f7db46b616"].into(), - //5GHWB8ZDzegLcMW7Gdd1BS6WHVwDdStfkkE4G7KjPjZNJBtD - hex!["bab3cccdcc34401e9b3971b96a662686cf755aa869a5c4b762199ce531b12c5b"].unchecked_into(), - //5GzDPGbUM9uH52ZEwydasTj8edokGUJ7vEpoFWp9FE1YNuFB - hex!["d9c056c98ca0e6b4eb7f5c58c007c1db7be0fe1f3776108f797dd4990d1ccc33"].unchecked_into(), - //5GWZbVkJEfWZ7fRca39YAQeqri2Z7pkeHyd7rUctUHyQifLp - hex!["c4a980da30939d5bb9e4a734d12bf81259ae286aa21fa4b65405347fa40eff35"].unchecked_into(), - //5C5DAKUwKcxU2eT9fZU23HPEJcJLPQRt7YX5sAyifKKsnBNd - hex!["0062a5ab339962d84b6711b86fa67b457483fcd3d75dafb7bd15f182b7434227"].unchecked_into(), - //5CZdFnyzZvKetZTeUwj5APAYskVJe4QFiTezo5dQNsrnehGd - hex!["160ea09c5717270e958a3da42673fa011613a9539b2e4ebcad8626bc117ca04a"].unchecked_into(), - ), - ( - //5HinEonzr8MywkqedcpsmwpxKje2jqr9miEwuzyFXEBCvVXM - hex!["fa373e25a1c4fe19c7148acde13bc3db1811cf656dc086820f3dda736b9c4a00"].into(), - //5EHJbj6Td6ks5HDnyfN4ttTSi57osxcQsQexm7XpazdeqtV7 - hex!["62145d721967bd88622d08625f0f5681463c0f1b8bcd97eb3c2c53f7660fd513"].into(), - //5EeCsC58XgJ1DFaoYA1WktEpP27jvwGpKdxPMFjicpLeYu96 - hex!["720537e2c1c554654d73b3889c3ef4c3c2f95a65dd3f7c185ebe4afebed78372"].unchecked_into(), - //5DnEySxbnppWEyN8cCLqvGjAorGdLRg2VmkY96dbJ1LHFK8N - hex!["4bea0b37e0cce9bddd80835fa2bfd5606f5dcfb8388bbb10b10c483f0856cf14"].unchecked_into(), - //5E1Y1FJ7dVP7qtE3wm241pTm72rTMcDT5Jd8Czv7Pwp7N3AH - hex!["560d90ca51e9c9481b8a9810060e04d0708d246714960439f804e5c6f40ca651"].unchecked_into(), - //5Fs2mowfPb93ByRTKtzTE5evCh2SfVLJfpBBM5SmpYGdG6yK - hex!["a809aaaaebc04051536c99166c99f0cba19c7b5950cd8a37882dd56220f2e84f"].unchecked_into(), - //5ELv74v7QcsS6FdzvG4vL2NnYDGWmRnJUSMKYwdyJD7Xcdi7 - hex!["64d59feddb3d00316a55906953fb3db8985797472bd2e6c7ea1ab730cc339d7f"].unchecked_into(), - ), - ( - //5Ey3NQ3dfabaDc16NUv7wRLsFCMDFJSqZFzKVycAsWuUC6Di - hex!["8062e9c21f1d92926103119f7e8153cebdb1e5ab3e52d6f395be80bb193eab47"].into(), - //5HiWsuSBqt8nS9pnggexXuHageUifVPKPHDE2arTKqhTp1dV - hex!["fa0388fa88f3f0cb43d583e2571fbc0edad57dff3a6fd89775451dd2c2b8ea00"].into(), - //5H168nKX2Yrfo3bxj7rkcg25326Uv3CCCnKUGK6uHdKMdPt8 - hex!["da6b2df18f0f9001a6dcf1d301b92534fe9b1f3ccfa10c49449fee93adaa8349"].unchecked_into(), - //5DrA2fZdzmNqT5j6DXNwVxPBjDV9jhkAqvjt6Us3bQHKy3cF - hex!["4ee66173993dd0db5d628c4c9cb61a27b76611ad3c3925947f0d0011ee2c5dcc"].unchecked_into(), - //5FNFDUGNLUtqg5LgrwYLNmBiGoP8KRxsvQpBkc7GQP6qaBUG - hex!["92156f54a114ee191415898f2da013d9db6a5362d6b36330d5fc23e27360ab66"].unchecked_into(), - //5Ea4of4L3i5Nc8QcPE648cN8CL8iuo9v4xc2LpKAtr6oShFU - hex!["6edd19e3c5230998e533e165a26438afe663368d0eab37fabff734a36119ce0e"].unchecked_into(), - //5DqAvikdpfRdk5rR35ZobZhqaC5bJXZcEuvzGtexAZP1hU3T - hex!["4e262811acdfe94528bfc3c65036080426a0e1301b9ada8d687a70ffcae99c26"].unchecked_into(), - )]; - - const ENDOWMENT: u128 = 1_000_000 * ROC; - const STASH: u128 = 100 * ROC; - - rococo_runtime::GenesisConfig { - frame_system: Some(rococo_runtime::SystemConfig { - code: wasm_binary.to_vec(), - changes_trie_config: Default::default(), - }), - pallet_balances: Some(rococo_runtime::BalancesConfig { - balances: endowed_accounts.iter() - .map(|k: &AccountId| (k.clone(), ENDOWMENT)) - .chain(initial_authorities.iter().map(|x| (x.0.clone(), STASH))) - .collect(), - }), - pallet_indices: Some(rococo_runtime::IndicesConfig { - indices: vec![], - }), - pallet_session: Some(rococo_runtime::SessionConfig { - keys: initial_authorities.iter().map(|x| ( - x.0.clone(), - x.0.clone(), - rococo_session_keys(x.2.clone(), x.3.clone(), x.4.clone(), x.5.clone(), x.6.clone()), - )).collect::>(), - }), - pallet_babe: Some(Default::default()), - pallet_grandpa: Some(Default::default()), - pallet_im_online: Some(Default::default()), - pallet_authority_discovery: Some(rococo_runtime::AuthorityDiscoveryConfig { - keys: vec![], - }), - parachains: Some(rococo_runtime::ParachainsConfig { - authorities: vec![], - }), - registrar: Some(rococo_runtime::RegistrarConfig { - parachains: vec![], - _phdata: Default::default(), - }), - pallet_vesting: Some(rococo_runtime::VestingConfig { - vesting: vec![], - }), - pallet_sudo: Some(rococo_runtime::SudoConfig { - key: endowed_accounts[0].clone(), - }), - } -} - fn kusama_staging_testnet_config_genesis(wasm_binary: &[u8]) -> kusama::GenesisConfig { // subkey inspect "$SECRET" let endowed_accounts = vec![ @@ -685,13 +458,6 @@ fn kusama_staging_testnet_config_genesis(wasm_binary: &[u8]) -> kusama::GenesisC pallet_authority_discovery: Some(kusama::AuthorityDiscoveryConfig { keys: vec![], }), - parachains: Some(kusama::ParachainsConfig { - authorities: vec![], - }), - registrar: Some(kusama::RegistrarConfig { - parachains: vec![], - _phdata: Default::default(), - }), claims: Some(kusama::ClaimsConfig { claims: vec![], vesting: vec![], @@ -759,25 +525,6 @@ pub fn westend_staging_testnet_config() -> Result { )) } -/// Rococo staging testnet config. -pub fn rococo_staging_testnet_config() -> Result { - let wasm_binary = rococo::WASM_BINARY.ok_or("Rococo development wasm not available")?; - let boot_nodes = vec![]; - - Ok(RococoChainSpec::from_genesis( - "Rococo Staging Testnet", - "rococo_staging_testnet", - ChainType::Live, - move || rococo_staging_testnet_config_genesis(wasm_binary), - boot_nodes, - Some(TelemetryEndpoints::new(vec![(WESTEND_STAGING_TELEMETRY_URL.to_string(), 0)]) - .expect("Rococo Staging telemetry url is valid; qed")), - Some(DEFAULT_PROTOCOL_ID), - None, - Default::default(), - )) -} - /// Helper function to generate a crypto pair from seed pub fn get_from_seed(seed: &str) -> ::Public { TPublic::Pair::from_string(&format!("//{}", seed), None) @@ -889,13 +636,6 @@ pub fn polkadot_testnet_genesis( pallet_authority_discovery: Some(polkadot::AuthorityDiscoveryConfig { keys: vec![], }), - parachains: Some(polkadot::ParachainsConfig { - authorities: vec![], - }), - registrar: Some(polkadot::RegistrarConfig{ - parachains: vec![], - _phdata: Default::default(), - }), claims: Some(polkadot::ClaimsConfig { claims: vec![], vesting: vec![], @@ -964,13 +704,6 @@ pub fn kusama_testnet_genesis( pallet_authority_discovery: Some(kusama::AuthorityDiscoveryConfig { keys: vec![], }), - parachains: Some(kusama::ParachainsConfig { - authorities: vec![], - }), - registrar: Some(kusama::RegistrarConfig{ - parachains: vec![], - _phdata: Default::default(), - }), claims: Some(kusama::ClaimsConfig { claims: vec![], vesting: vec![], @@ -1028,13 +761,6 @@ pub fn westend_testnet_genesis( pallet_authority_discovery: Some(westend::AuthorityDiscoveryConfig { keys: vec![], }), - parachains: Some(westend::ParachainsConfig { - authorities: vec![], - }), - registrar: Some(westend::RegistrarConfig{ - parachains: vec![], - _phdata: Default::default(), - }), pallet_vesting: Some(westend::VestingConfig { vesting: vec![], }), @@ -1044,57 +770,6 @@ pub fn westend_testnet_genesis( } } -/// Helper function to create rococo GenesisConfig for testing -pub fn rococo_testnet_genesis( - wasm_binary: &[u8], - initial_authorities: Vec<(AccountId, AccountId, BabeId, GrandpaId, ImOnlineId, ValidatorId, AuthorityDiscoveryId)>, - root_key: AccountId, - endowed_accounts: Option>, -) -> rococo_runtime::GenesisConfig { - let endowed_accounts: Vec = endowed_accounts.unwrap_or_else(testnet_accounts); - - const ENDOWMENT: u128 = 1_000_000 * DOTS; - - rococo_runtime::GenesisConfig { - frame_system: Some(rococo_runtime::SystemConfig { - code: wasm_binary.to_vec(), - changes_trie_config: Default::default(), - }), - pallet_indices: Some(rococo_runtime::IndicesConfig { - indices: vec![], - }), - pallet_balances: Some(rococo_runtime::BalancesConfig { - balances: endowed_accounts.iter().map(|k| (k.clone(), ENDOWMENT)).collect(), - }), - pallet_session: Some(rococo_runtime::SessionConfig { - keys: initial_authorities.iter().map(|x| ( - x.0.clone(), - x.0.clone(), - rococo_session_keys(x.2.clone(), x.3.clone(), x.4.clone(), x.5.clone(), x.6.clone()), - )).collect::>(), - }), - pallet_babe: Some(Default::default()), - pallet_grandpa: Some(Default::default()), - pallet_im_online: Some(Default::default()), - pallet_authority_discovery: Some(rococo_runtime::AuthorityDiscoveryConfig { - keys: vec![], - }), - parachains: Some(rococo_runtime::ParachainsConfig { - authorities: vec![], - }), - registrar: Some(rococo_runtime::RegistrarConfig{ - parachains: vec![], - _phdata: Default::default(), - }), - pallet_vesting: Some(rococo_runtime::VestingConfig { - vesting: vec![], - }), - pallet_sudo: Some(rococo_runtime::SudoConfig { - key: root_key, - }), - } -} - fn polkadot_development_config_genesis(wasm_binary: &[u8]) -> polkadot::GenesisConfig { polkadot_testnet_genesis( wasm_binary, @@ -1249,18 +924,6 @@ fn westend_local_testnet_genesis(wasm_binary: &[u8]) -> westend::GenesisConfig { ) } -fn rococo_local_testnet_genesis(wasm_binary: &[u8]) -> rococo_runtime::GenesisConfig { - rococo_testnet_genesis( - wasm_binary, - vec![ - get_authority_keys_from_seed("Alice"), - get_authority_keys_from_seed("Bob"), - ], - get_account_id_from_seed::("Alice"), - None, - ) -} - /// Westend local testnet config (multivalidator Alice + Bob) pub fn westend_local_testnet_config() -> Result { let wasm_binary = westend::WASM_BINARY.ok_or("Westend development wasm not available")?; @@ -1277,20 +940,3 @@ pub fn westend_local_testnet_config() -> Result { Default::default(), )) } - -/// Rococo local testnet config (multivalidator Alice + Bob) -pub fn rococo_local_testnet_config() -> Result { - let wasm_binary = rococo::WASM_BINARY.ok_or("Rococo development wasm not available")?; - - Ok(RococoChainSpec::from_genesis( - "Rococo Local Testnet", - "rococo_local_testnet", - ChainType::Local, - move || rococo_local_testnet_genesis(wasm_binary), - vec![], - None, - Some(DEFAULT_PROTOCOL_ID), - None, - Default::default(), - )) -} diff --git a/service/src/client.rs b/service/src/client.rs index dad038cf96..563a049cbd 100644 --- a/service/src/client.rs +++ b/service/src/client.rs @@ -139,7 +139,6 @@ pub enum Client { Polkadot(Arc>), Westend(Arc>), Kusama(Arc>), - Rococo(Arc>), } impl ClientHandle for Client { @@ -154,9 +153,6 @@ impl ClientHandle for Client { Self::Kusama(client) => { T::execute_with_client::<_, _, crate::FullBackend>(t, client.clone()) }, - Self::Rococo(client) => { - T::execute_with_client::<_, _, crate::FullBackend>(t, client.clone()) - } } } } diff --git a/service/src/grandpa_support.rs b/service/src/grandpa_support.rs index 89a0691b36..41179a19c4 100644 --- a/service/src/grandpa_support.rs +++ b/service/src/grandpa_support.rs @@ -256,7 +256,7 @@ mod tests { for i in 0..n { let mut builder = client.new_block(Default::default()).unwrap(); - for extrinsic in polkadot_test_runtime_client::needed_extrinsics(vec![], base + i) { + for extrinsic in polkadot_test_runtime_client::needed_extrinsics(base + i) { builder.push(extrinsic).unwrap() } diff --git a/service/src/lib.rs b/service/src/lib.rs index 6bb78a18ce..9c75c20ce6 100644 --- a/service/src/lib.rs +++ b/service/src/lib.rs @@ -45,14 +45,13 @@ pub use sp_runtime::traits::{HashFor, NumberFor}; pub use consensus_common::{SelectChain, BlockImport, block_validation::Chain}; pub use polkadot_primitives::v0::{Block, CollatorId, ParachainHost}; pub use sp_runtime::traits::{Block as BlockT, self as runtime_traits, BlakeTwo256}; -pub use chain_spec::{PolkadotChainSpec, KusamaChainSpec, WestendChainSpec, RococoChainSpec}; +pub use chain_spec::{PolkadotChainSpec, KusamaChainSpec, WestendChainSpec}; #[cfg(feature = "full-node")] pub use consensus::run_validation_worker; pub use codec::Codec; pub use polkadot_runtime; pub use kusama_runtime; pub use westend_runtime; -pub use rococo_runtime; pub use self::client::*; native_executor_instance!( @@ -76,13 +75,6 @@ native_executor_instance!( frame_benchmarking::benchmarking::HostFunctions, ); -native_executor_instance!( - pub RococoExecutor, - rococo_runtime::api::dispatch, - rococo_runtime::native_version, - frame_benchmarking::benchmarking::HostFunctions, -); - /// Can be called for a `Configuration` to check if it is a configuration for the `Kusama` network. pub trait IdentifyVariant { /// Returns if this is a configuration for the `Kusama` network. @@ -90,9 +82,6 @@ pub trait IdentifyVariant { /// Returns if this is a configuration for the `Westend` network. fn is_westend(&self) -> bool; - - /// Returns if this is a configuration for the `Rococo` network. - fn is_rococo(&self) -> bool; } impl IdentifyVariant for Box { @@ -103,10 +92,6 @@ impl IdentifyVariant for Box { fn is_westend(&self) -> bool { self.id().starts_with("westend") || self.id().starts_with("wnd") } - - fn is_rococo(&self) -> bool { - self.id().starts_with("rococo") || self.id().starts_with("roc") - } } /// Polkadot's full backend. @@ -787,35 +772,6 @@ pub fn westend_new_full( Ok((service, client, handles)) } -/// Create a new Rococo service for a full node. -#[cfg(feature = "full-node")] -pub fn rococo_new_full( - config: Configuration, - collating_for: Option<(CollatorId, parachain::Id)>, - max_block_data_size: Option, - authority_discovery_enabled: bool, - slot_duration: u64, - grandpa_pause: Option<(u32, u32)>, -) - -> Result<( - TaskManager, - Arc>>, - FullNodeHandles, - ), ServiceError> -{ - let (service, client, handles, _, _) = new_full::( - config, - collating_for, - max_block_data_size, - authority_discovery_enabled, - slot_duration, - grandpa_pause, - false, - )?; - - Ok((service, client, handles)) -} - /// Handles to other sub-services that full nodes instantiate, which consumers /// of the node may use. #[cfg(feature = "full-node")] @@ -833,8 +789,6 @@ pub fn build_light(config: Configuration) -> Result<(TaskManager, Arc(config) } else if config.chain_spec.is_westend() { new_light::(config) - } else if config.chain_spec.is_rococo() { - new_light::(config) } else { new_light::(config) } @@ -870,16 +824,6 @@ pub fn build_full( grandpa_pause, false, ).map(|(task_manager, client, handles, _, _)| (task_manager, Client::Westend(client), handles)) - } else if config.chain_spec.is_rococo() { - new_full::( - config, - collating_for, - max_block_data_size, - authority_discovery_enabled, - slot_duration, - grandpa_pause, - false, - ).map(|(task_manager, client, handles, _, _)| (task_manager, Client::Rococo(client), handles)) } else { new_full::( config, -- GitLab From ae69d7a0dfe7c34b600df23fbfe3f5e0104d84ba Mon Sep 17 00:00:00 2001 From: Robert Habermeier Date: Thu, 13 Aug 2020 16:22:13 +0200 Subject: [PATCH 173/192] guide: validation data refactoring (#1576) * guide: validation data refactoring * address grumbles from review * Update roadmap/implementers-guide/src/types/candidate.md Co-authored-by: Bernhard Schuster * last comments from review Co-authored-by: Sergei Shulepov Co-authored-by: Bernhard Schuster --- roadmap/implementers-guide/src/SUMMARY.md | 4 +- .../node/collators/collation-generation.md | 2 +- .../src/node/utility/candidate-validation.md | 3 +- .../src/node/utility/provisioner.md | 2 +- .../src/runtime-api/README.md | 16 +++ .../src/runtime-api/full-validation-data.md | 7 ++ .../src/runtime-api/global-validation-data.md | 7 -- .../src/runtime-api/local-validation-data.md | 23 ---- .../runtime-api/persisted-validation-data.md | 11 ++ .../src/runtime/configuration.md | 3 - .../src/runtime/inclusion.md | 4 +- .../implementers-guide/src/runtime/paras.md | 2 +- .../src/types/availability.md | 21 +--- .../implementers-guide/src/types/candidate.md | 100 +++++++++--------- .../src/types/overseer-protocol.md | 15 ++- 15 files changed, 106 insertions(+), 114 deletions(-) create mode 100644 roadmap/implementers-guide/src/runtime-api/full-validation-data.md delete mode 100644 roadmap/implementers-guide/src/runtime-api/global-validation-data.md delete mode 100644 roadmap/implementers-guide/src/runtime-api/local-validation-data.md create mode 100644 roadmap/implementers-guide/src/runtime-api/persisted-validation-data.md diff --git a/roadmap/implementers-guide/src/SUMMARY.md b/roadmap/implementers-guide/src/SUMMARY.md index 5569f4c361..76a2224238 100644 --- a/roadmap/implementers-guide/src/SUMMARY.md +++ b/roadmap/implementers-guide/src/SUMMARY.md @@ -19,8 +19,8 @@ - [Validators](runtime-api/validators.md) - [Validator Groups](runtime-api/validator-groups.md) - [Availability Cores](runtime-api/availability-cores.md) - - [Global Validation Data](runtime-api/global-validation-data.md) - - [Local Validation Data](runtime-api/local-validation-data.md) + - [Persisted Validation Data](runtime-api/persisted-validation-data.md) + - [Full Validation Data](runtime-api/full-validation-data.md) - [Session Index](runtime-api/session-index.md) - [Validation Code](runtime-api/validation-code.md) - [Candidate Pending Availability](runtime-api/candidate-pending-availability.md) diff --git a/roadmap/implementers-guide/src/node/collators/collation-generation.md b/roadmap/implementers-guide/src/node/collators/collation-generation.md index a182fbadd3..d27ba74085 100644 --- a/roadmap/implementers-guide/src/node/collators/collation-generation.md +++ b/roadmap/implementers-guide/src/node/collators/collation-generation.md @@ -26,7 +26,7 @@ On `ActiveLeavesUpdate`: * Otherwise, for each `activated` head in the update: * Determine if the para is scheduled or is next up on any occupied core by fetching the `availability_cores` Runtime API. * Determine an occupied core assumption to make about the para. The simplest thing to do is to always assume that if the para occupies a core, that the candidate will become available. Further on, this might be determined based on bitfields seen or validator requests. - * Use the Runtime API subsystem to fetch the global validation data and local validation data. + * Use the Runtime API subsystem to fetch the full validation data. * Construct validation function params based on validation data. * Invoke the `collation_producer`. * Construct a `CommittedCandidateReceipt` using the outputs of the `collation_producer` and signing with the `key`. diff --git a/roadmap/implementers-guide/src/node/utility/candidate-validation.md b/roadmap/implementers-guide/src/node/utility/candidate-validation.md index 36c89b7d2a..cd4a040fbf 100644 --- a/roadmap/implementers-guide/src/node/utility/candidate-validation.md +++ b/roadmap/implementers-guide/src/node/utility/candidate-validation.md @@ -19,8 +19,7 @@ Parachain candidates are validated against their validation function: A piece of Upon receiving a validation request, the first thing the candidate validation subsystem should do is make sure it has all the necessary parameters to the validation function. These are: * The Validation Function itself. * The [`CandidateDescriptor`](../../types/candidate.md#candidatedescriptor). - * The [`LocalValidationData`](../../types/candidate.md#localvalidationdata). - * The [`GlobalValidationSchedule](../../types/candidate.md#globalvalidationschedule). + * The [`ValidationData`](../../types/candidate.md#validationdata). * The [`PoV`](../../types/availability.md#proofofvalidity). ### Determining Parameters diff --git a/roadmap/implementers-guide/src/node/utility/provisioner.md b/roadmap/implementers-guide/src/node/utility/provisioner.md index 8e6afc9d31..ec417e5daa 100644 --- a/roadmap/implementers-guide/src/node/utility/provisioner.md +++ b/roadmap/implementers-guide/src/node/utility/provisioner.md @@ -64,7 +64,7 @@ To determine availability: - If the bitfields indicate availability and there is a scheduled `next_up_on_available`, then we can make an `OccupiedCoreAssumption::Included`. - If the bitfields do not indicate availability, and there is a scheduled `next_up_on_time_out`, and `occupied_core.time_out_at == block_number_under_production`, then we can make an `OccupiedCoreAssumption::TimedOut`. - If we did not make an `OccupiedCoreAssumption`, then continue on to the next core. - - Now compute the core's `validation_data_hash`: get the `LocalValidationData` from the runtime, given the known `ParaId` and `OccupiedCoreAssumption`; this can be combined with a cached `GlobalValidationData` to compute the hash. + - Now compute the core's `validation_data_hash`: get the `PersistedValidationData` from the runtime, given the known `ParaId` and `OccupiedCoreAssumption`; - Find an appropriate candidate for the core. - There are two constraints: `backed_candidate.candidate.descriptor.para_id == scheduled_core.para_id && candidate.candidate.descriptor.validation_data_hash == computed_validation_data_hash`. - In the event that more than one candidate meets the constraints, selection between the candidates is arbitrary. However, not more than one candidate can be selected per core. diff --git a/roadmap/implementers-guide/src/runtime-api/README.md b/roadmap/implementers-guide/src/runtime-api/README.md index ce1d3948f0..a40290a2d0 100644 --- a/roadmap/implementers-guide/src/runtime-api/README.md +++ b/roadmap/implementers-guide/src/runtime-api/README.md @@ -37,3 +37,19 @@ The next sections will contain information on specific runtime APIs. The format /// best for the implementation to return an error indicating the failure mode. fn some_runtime_api(at: Block, arg1: Type1, arg2: Type2, ...) -> ReturnValue; ``` + +Certain runtime APIs concerning the state of a para require the caller to provide an `OccupiedCoreAssumption`. This indicates how the result of the runtime API should be computed if there is a candidate from the para occupying an availability core in the [Inclusion Module](../runtime/inclusion.md). + +The choices of assumption are whether the candidate occupying that core should be assumed to have been made available and included or timed out and discarded, along with a third option to assert that the core was not occupied. This choice affects everything from the parent head-data, the validation code, and the state of message-queues. Typically, users will take the assumption that either the core was free or that the occupying candidate was included, as timeouts are expected only in adversarial circumstances and even so, only in a small minority of blocks directly following validator set rotations. + +```rust +/// An assumption being made about the state of an occupied core. +enum OccupiedCoreAssumption { + /// The candidate occupying the core was made available and included to free the core. + Included, + /// The candidate occupying the core timed out and freed the core without advancing the para. + TimedOut, + /// The core was not occupied to begin with. + Free, +} +``` \ No newline at end of file diff --git a/roadmap/implementers-guide/src/runtime-api/full-validation-data.md b/roadmap/implementers-guide/src/runtime-api/full-validation-data.md new file mode 100644 index 0000000000..884fad076e --- /dev/null +++ b/roadmap/implementers-guide/src/runtime-api/full-validation-data.md @@ -0,0 +1,7 @@ +# Full Validation Data + +Yields the full [`ValidationData`](../types/candidate.md#validationdata) at the state of a given block. + +```rust +fn full_validation_data(at: Block, ParaId, OccupiedCoreAssumption) -> Option; +``` diff --git a/roadmap/implementers-guide/src/runtime-api/global-validation-data.md b/roadmap/implementers-guide/src/runtime-api/global-validation-data.md deleted file mode 100644 index 249f9b9a06..0000000000 --- a/roadmap/implementers-guide/src/runtime-api/global-validation-data.md +++ /dev/null @@ -1,7 +0,0 @@ -# Global Validation Data - -Yields the [`GlobalValidationData`](../types/candidate.md#globalvalidationschedule) at the state of a given block. This applies to all para candidates with the relay-parent equal to that block. - -```rust -fn global_validation_data(at: Block) -> GlobalValidationData; -``` diff --git a/roadmap/implementers-guide/src/runtime-api/local-validation-data.md b/roadmap/implementers-guide/src/runtime-api/local-validation-data.md deleted file mode 100644 index 10f5d78ede..0000000000 --- a/roadmap/implementers-guide/src/runtime-api/local-validation-data.md +++ /dev/null @@ -1,23 +0,0 @@ -# Local Validation Data - -Yields the [`LocalValidationData`](../types/candidate.md#localvalidationdata) for the given [`ParaId`](../types/candidate.md#paraid) along with an assumption that should be used if the para currently occupies a core: whether the candidate occupying that core should be assumed to have been made available and included or timed out and discarded, along with a third option to assert that the core was not occupied. This choice affects everything from the parent head-data, the validation code, and the state of message-queues. Typically, users will take the assumption that either the core was free or that the occupying candidate was included, as timeouts are expected only in adversarial circumstances and even so, only in a small minority of blocks directly following validator set rotations. - -The documentation of [`LocalValidationData`](../types/candidate.md#localvalidationdata) has more information on this dichotomy. - -```rust -/// An assumption being made about the state of an occupied core. -enum OccupiedCoreAssumption { - /// The candidate occupying the core was made available and included to free the core. - Included, - /// The candidate occupying the core timed out and freed the core without advancing the para. - TimedOut, - /// The core was not occupied to begin with. - Free, -} - -/// Returns the local validation data for the given para and occupied core assumption. -/// -/// Returns `None` if either the para is not registered or the assumption is `Freed` -/// and the para already occupies a core. -fn local_validation_data(at: Block, ParaId, OccupiedCoreAssumption) -> Option; -``` diff --git a/roadmap/implementers-guide/src/runtime-api/persisted-validation-data.md b/roadmap/implementers-guide/src/runtime-api/persisted-validation-data.md new file mode 100644 index 0000000000..2fd3e55c87 --- /dev/null +++ b/roadmap/implementers-guide/src/runtime-api/persisted-validation-data.md @@ -0,0 +1,11 @@ +# Persisted Validation Data + +Yields the [`PersistedValidationData`](../types/candidate.md#persistedvalidationdata) for the given [`ParaId`](../types/candidate.md#paraid) along with an assumption that should be used if the para currently occupies a core: + +```rust +/// Returns the persisted validation data for the given para and occupied core assumption. +/// +/// Returns `None` if either the para is not registered or the assumption is `Freed` +/// and the para already occupies a core. +fn persisted_validation_data(at: Block, ParaId, OccupiedCoreAssumption) -> Option; +``` \ No newline at end of file diff --git a/roadmap/implementers-guide/src/runtime/configuration.md b/roadmap/implementers-guide/src/runtime/configuration.md index f1ed5eb508..37e5202429 100644 --- a/roadmap/implementers-guide/src/runtime/configuration.md +++ b/roadmap/implementers-guide/src/runtime/configuration.md @@ -35,9 +35,6 @@ fn update_configuration(f: impl FnOnce(&mut HostConfiguration)) { *pending = Some(x); }) } - -/// Get the GlobalValidationData, assuming the context is the parent block. -fn global_validation_data() -> GlobalValidationData; ``` ## Entry-points diff --git a/roadmap/implementers-guide/src/runtime/inclusion.md b/roadmap/implementers-guide/src/runtime/inclusion.md index 76eec45910..196b97e05b 100644 --- a/roadmap/implementers-guide/src/runtime/inclusion.md +++ b/roadmap/implementers-guide/src/runtime/inclusion.md @@ -62,8 +62,8 @@ All failed checks should lead to an unrecoverable error making the block invalid 1. check that each candidate corresponds to a scheduled core and that they are ordered in the same order the cores appear in assignments in `scheduled`. 1. check that `scheduled` is sorted ascending by `CoreIndex`, without duplicates. 1. check that there is no candidate pending availability for any scheduled `ParaId`. - 1. check that each candidate's `validation_data_hash` corresponds to a `(LocalValidationData, GlobalValidationData)` computed from the current state. - > NOTE: With contextual execution in place, local and global validation data will be obtained as of the state of the context block. However, only the state of the current block can be used for such a query. + 1. check that each candidate's `validation_data_hash` corresponds to a `PersistedValidationData` computed from the current state. + > NOTE: With contextual execution in place, validation data will be obtained as of the state of the context block. However, only the state of the current block can be used for such a query. 1. If the core assignment includes a specific collator, ensure the backed candidate is issued by that collator. 1. Ensure that any code upgrade scheduled by the candidate does not happen within `config.validation_upgrade_frequency` of `Paras::last_code_upgrade(para_id, true)`, if any, comparing against the value of `Paras::FutureCodeUpgrades` for the given para ID. 1. Check the collator's signature on the candidate data. diff --git a/roadmap/implementers-guide/src/runtime/paras.md b/roadmap/implementers-guide/src/runtime/paras.md index d29d760f57..dbb169af17 100644 --- a/roadmap/implementers-guide/src/runtime/paras.md +++ b/roadmap/implementers-guide/src/runtime/paras.md @@ -113,7 +113,7 @@ OutgoingParas: Vec; * `is_parathread(ParaId) -> bool`: Returns true if the para ID references any live parathread. * `last_code_upgrade(id: ParaId, include_future: bool) -> Option`: The block number of the last scheduled upgrade of the requested para. Includes future upgrades if the flag is set. This is the `expected_at` number, not the `activated_at` number. -* `local_validation_data(id: ParaId) -> Option`: Get the LocalValidationData of the given para, assuming the context is the parent block. Returns `None` if the para is not known. +* `persisted_validation_data(id: ParaId) -> Option`: Get the PersistedValidationData of the given para, assuming the context is the parent block. Returns `None` if the para is not known. ## Finalization diff --git a/roadmap/implementers-guide/src/types/availability.md b/roadmap/implementers-guide/src/types/availability.md index 241314067a..0117b174e6 100644 --- a/roadmap/implementers-guide/src/types/availability.md +++ b/roadmap/implementers-guide/src/types/availability.md @@ -32,32 +32,17 @@ Often referred to as PoV, this is a type-safe wrapper around bytes (`Vec`) w struct PoV(Vec); ``` -## Omitted Validation Data - -Validation data that is often omitted from types describing candidates as it can be derived from the relay-parent of the candidate. However, with the expectation of state pruning, these are best kept available elsewhere as well. - -This contains the [`GlobalValidationData`](candidate.md#globalvalidationschedule) and [`LocalValidationData`](candidate.md#localvalidationdata) - -```rust -struct OmittedValidationData { - /// The global validation schedule. - global_validation: GlobalValidationData, - /// The local validation data. - local_validation: LocalValidationData, -} -``` - ## Available Data -This is the data we want to keep available for each [candidate](candidate.md) included in the relay chain. +This is the data we want to keep available for each [candidate](candidate.md) included in the relay chain. This is the PoV of the block, as well as the [`PersistedValidationData`](candidate.md#persistedvalidationdata) ```rust struct AvailableData { /// The Proof-of-Validation of the candidate. pov: PoV, - /// The omitted validation data. - omitted_validation: OmittedValidationData, + /// The persisted validation data used to check the candidate. + validation_data: PersistedValidationData, } ``` diff --git a/roadmap/implementers-guide/src/types/candidate.md b/roadmap/implementers-guide/src/types/candidate.md index 85416450d7..02ece10806 100644 --- a/roadmap/implementers-guide/src/types/candidate.md +++ b/roadmap/implementers-guide/src/types/candidate.md @@ -33,7 +33,7 @@ struct CandidateReceipt { ## Full Candidate Receipt -This is the full receipt type. The `GlobalValidationData` and the `LocalValidationData` are technically redundant with the `inner.relay_parent`, which uniquely describes the a block in the blockchain from whose state these values are derived. The [`CandidateReceipt`](#candidate-receipt) variant is often used instead for this reason. +This is the full receipt type. The `ValidationData` are technically redundant with the `inner.relay_parent`, which uniquely describes the block in the blockchain from whose state these values are derived. The [`CandidateReceipt`](#candidate-receipt) variant is often used instead for this reason. However, the Full Candidate Receipt type is useful as a means of avoiding the implicit dependency on availability of old blockchain state. In situations such as availability and approval, having the full description of the candidate within a self-contained struct is convenient. @@ -41,10 +41,7 @@ However, the Full Candidate Receipt type is useful as a means of avoiding the im /// All data pertaining to the execution of a para candidate. struct FullCandidateReceipt { inner: CandidateReceipt, - /// The global validation schedule. - global_validation: GlobalValidationData, - /// The local validation data. - local_validation: LocalValidationData, + validation_data: ValidationData, } ``` @@ -77,8 +74,9 @@ struct CandidateDescriptor { relay_parent: Hash, /// The collator's sr25519 public key. collator: CollatorId, - /// The blake2-256 hash of the local and global validation data. These are extra parameters - /// derived from relay-chain state that influence the validity of the block. + /// The blake2-256 hash of the persisted validation data. These are extra parameters + /// derived from relay-chain state that influence the validity of the block which + /// must also be kept available for secondary checkers. validation_data_hash: Hash, /// The blake2-256 hash of the pov-block. pov_hash: Hash, @@ -88,57 +86,39 @@ struct CandidateDescriptor { } ``` +## ValidationData -## GlobalValidationData +The validation data provide information about how to validate both the inputs and outputs of a candidate. There are two types of validation data: [persisted](#persistedvalidationdata) and [transient](#transientvalidationdata). Their respective sections of the guide elaborate on their functionality in more detail. -The global validation schedule comprises of information describing the global environment for para execution, as derived from a particular relay-parent. These are parameters that will apply to all parablocks executed in the context of this relay-parent. +This information is derived from the chain state and will vary from para to para, although some of the fields may be the same for every para. -```rust -/// Extra data that is needed along with the other fields in a `CandidateReceipt` -/// to fully validate the candidate. -/// -/// These are global parameters that apply to all candidates in a block. -struct GlobalValidationData { - /// The maximum code size permitted, in bytes. - max_code_size: u32, - /// The maximum head-data size permitted, in bytes. - max_head_data_size: u32, - /// The relay-chain block number this is in the context of. - block_number: BlockNumber, -} -``` - -## LocalValidationData - -This is validation data needed for execution of candidate pertaining to a specific para and relay-chain block. +Persisted validation data are generally derived from some relay-chain state to form inputs to the validation function, and as such need to be persisted by the availability system to avoid dependence on availability of the relay-chain state. The backing phase of the inclusion pipeline ensures that everything that is included in a valid fork of the relay-chain already adheres to the transient constraints. -Unlike the [`GlobalValidationData`](#globalvalidationdata), which only depends on a relay-parent, this is parameterized both by a relay-parent and a choice of one of two options: - 1. Assume that the candidate pending availability on this para at the onset of the relay-parent is included. - 1. Assume that the candidate pending availability on this para at the onset of the relay-parent is timed-out. +The validation data also serve the purpose of giving collators a means of ensuring that their produced candidate and the commitments submitted to the relay-chain alongside it will pass the checks done by the relay-chain when backing, and give validators the same understanding when determining whether to second or attest to a candidate. -This choice can also be expressed as a choice of which parent head of the para will be built on - either optimistically on the candidate pending availability or pessimistically on the one that is surely included. - -Para validation happens optimistically before the block is authored, so it is not possible to predict with 100% accuracy what will happen in the earlier phase of the [`InclusionInherent`](../runtime/inclusioninherent.md) module where new availability bitfields and availability timeouts are processed. This is what will eventually define whether a candidate can be backed within a specific relay-chain block. +Since the commitments of the validation function are checked by the relay-chain, secondary checkers can rely on the invariant that the relay-chain only includes para-blocks for which these checks have already been done. As such, there is no need for the validation data used to inform validators and collators about the checks the relay-chain will perform to be persisted by the availability system. Nevertheless, we expose it so the backing validators can validate the outputs of a candidate before voting to submit it to the relay-chain and so collators can collate candidates that satisfy the criteria implied these transient validation data. Design-wise we should maintain two properties about this data structure: -1. The `LocalValidationData` should be relatively lightweight primarly because it is constructed during inclusion for each candidate. -1. To make contextual execution possible, `LocalValidationData` should be constructable only having access to the latest relay-chain state for the past `k` blocks. That implies +1. The `ValidationData` should be relatively lightweight primarly because it is constructed during inclusion for each candidate. +1. To make contextual execution possible, `ValidationData` should be constructable only having access to the latest relay-chain state for the past `k` blocks. That implies either that the relay-chain should maintain all the required data accessible or somehow provided indirectly with a header-chain proof and a state proof from there. -> TODO: determine if balance/fees are even needed here. -> TODO: message queue watermarks (first downward messages, then XCMP channels) +```rust +struct ValidationData { + persisted: PersistedValidationData, + transient: TransientValidationData, +} +``` + +## PersistedValidationData + +Validation data that needs to be persisted for secondary checkers. See the section on [`ValidationData`](#validationdata) for more details. ```rust -/// Extra data that is needed along with the other fields in a `CandidateReceipt` -/// to fully validate the candidate. These fields are parachain-specific. -struct LocalValidationData { +struct PersistedValidationData { /// The parent head-data. parent_head: HeadData, - /// The balance of the parachain at the moment of validation. - balance: Balance, - /// The blake2-256 hash of the validation code used to execute the candidate. - validation_code_hash: Hash, /// Whether the parachain is allowed to upgrade its validation code. /// /// This is `Some` if so, and contains the number of the minimum relay-chain @@ -150,10 +130,34 @@ struct LocalValidationData { /// height. This may be equal to the current perceived relay-chain block height, in /// which case the code upgrade should be applied at the end of the signaling /// block. + /// + /// This informs a relay-chain backing check and the parachain logic. code_upgrade_allowed: Option, + + /// The relay-chain block number this is in the context of. This informs the collator. + block_number: BlockNumber, +} +``` + +## TransientValidationData + +These validation data are derived from some relay-chain state to check outputs of the validation function. + +```rust +struct TransientValidationData { + /// The maximum code size permitted, in bytes, of a produced validation code upgrade. + /// + /// This informs a relay-chain backing check and the parachain logic. + max_code_size: u32, + /// The maximum head-data size permitted, in bytes. + /// + /// This informs a relay-chain backing check and the parachain collator. + max_head_data_size: u32, + /// The balance of the parachain at the moment of validation. + balance: Balance, /// The list of MQC heads for the inbound channels paired with the sender para ids. This /// vector is sorted ascending by the para id and doesn't contain multiple entries with the same - /// sender. + /// sender. This informs the collator. hrmp_mqc_heads: Vec<(ParaId, Hash)>, } ``` @@ -215,10 +219,8 @@ This struct encapsulates the outputs of candidate validation. struct ValidationOutputs { /// The head-data produced by validation. head_data: HeadData, - /// The global validation schedule. - global_validation_data: GlobalValidationData, - /// The local validation data. - local_validation_data: LocalValidationData, + /// The validation data, persisted and transient. + validation_data: ValidationData, /// Messages directed to other paras routed via the relay chain. horizontal_messages: Vec, /// Upwards messages to the relay chain. diff --git a/roadmap/implementers-guide/src/types/overseer-protocol.md b/roadmap/implementers-guide/src/types/overseer-protocol.md index 355af62f07..e054b82f07 100644 --- a/roadmap/implementers-guide/src/types/overseer-protocol.md +++ b/roadmap/implementers-guide/src/types/overseer-protocol.md @@ -316,13 +316,18 @@ enum RuntimeApiRequest { SessionIndex(ResponseChannel), /// Get the validation code for a specific para, using the given occupied core assumption. ValidationCode(ParaId, OccupiedCoreAssumption, ResponseChannel>), - /// Get the global validation schedule at the state of a given block. - GlobalValidationData(ResponseChannel), - /// Get the local validation data for a specific para, with the given occupied core assumption. - LocalValidationData( + /// Get the persisted validation data at the state of a given block for a specific para, + /// with the given occupied core assumption. + PersistedValidationData( ParaId, OccupiedCoreAssumption, - ResponseChannel>, + ResponseChannel>, + ), + /// Get the full validation data for a specific para, with the given occupied core assumption. + FullValidationData( + ParaId, + OccupiedCoreAssumption, + ResponseChannel>, ), /// Get information about all availability cores. AvailabilityCores(ResponseChannel>), -- GitLab From ae445efc70ee7f9b27807e763ee0155cec8551e6 Mon Sep 17 00:00:00 2001 From: Cecile Tonglet Date: Thu, 13 Aug 2020 19:01:37 +0200 Subject: [PATCH 174/192] Use async test helper to simplify node testing (#1578) --- Cargo.lock | 21 +++++++ node/test-service/Cargo.toml | 1 + node/test-service/tests/build-blocks.rs | 55 +++++------------- node/test-service/tests/call-function.rs | 73 +++++++----------------- 4 files changed, 59 insertions(+), 91 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index b4af1a108b..227fd89680 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5438,6 +5438,7 @@ dependencies = [ "sp-runtime", "sp-state-machine", "substrate-test-client", + "substrate-test-utils", "tempfile", "tokio 0.2.21", ] @@ -8511,6 +8512,26 @@ dependencies = [ "substrate-test-runtime", ] +[[package]] +name = "substrate-test-utils" +version = "2.0.0-rc5" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +dependencies = [ + "futures 0.3.5", + "substrate-test-utils-derive", + "tokio 0.2.21", +] + +[[package]] +name = "substrate-test-utils-derive" +version = "0.8.0-rc5" +source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +dependencies = [ + "proc-macro-crate", + "quote 1.0.7", + "syn 1.0.33", +] + [[package]] name = "substrate-wasm-builder-runner" version = "1.0.6" diff --git a/node/test-service/Cargo.toml b/node/test-service/Cargo.toml index db6328a9aa..46d54197a7 100644 --- a/node/test-service/Cargo.toml +++ b/node/test-service/Cargo.toml @@ -53,4 +53,5 @@ substrate-test-client = { git = "https://github.com/paritytech/substrate", branc [dev-dependencies] pallet-balances = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } serde_json = "1.0" +substrate-test-utils = { git = "https://github.com/paritytech/substrate", branch = "master" } tokio = { version = "0.2", features = ["macros"] } diff --git a/node/test-service/tests/build-blocks.rs b/node/test-service/tests/build-blocks.rs index 612efc8f76..b809f188aa 100644 --- a/node/test-service/tests/build-blocks.rs +++ b/node/test-service/tests/build-blocks.rs @@ -14,21 +14,13 @@ // You should have received a copy of the GNU General Public License // along with Polkadot. If not, see . -use tokio::{time::delay_for as sleep, task::spawn}; -use futures::{future, pin_mut, select, FutureExt as _}; +use futures::{future, pin_mut, select}; use polkadot_test_service::*; use service::TaskExecutor; use sp_keyring::Sr25519Keyring; -use std::time::Duration; -static INTEGRATION_TEST_ALLOWED_TIME: Option<&str> = option_env!("INTEGRATION_TEST_ALLOWED_TIME"); - -#[tokio::test] -async fn ensure_test_service_build_blocks() { - let task_executor: TaskExecutor = (move |fut, _| { - spawn(fut).map(|_| ()) - }) - .into(); +#[substrate_test_utils::test] +async fn ensure_test_service_build_blocks(task_executor: TaskExecutor) { let mut alice = run_test_node( task_executor.clone(), Sr25519Keyring::Alice, @@ -41,38 +33,21 @@ async fn ensure_test_service_build_blocks() { || {}, vec![alice.addr.clone()], ); - let t1 = sleep(Duration::from_secs( - INTEGRATION_TEST_ALLOWED_TIME - .and_then(|x| x.parse().ok()) - .unwrap_or(600), - )) - .fuse(); - let t2 = async { - { - let t1 = future::join(alice.wait_for_blocks(3), bob.wait_for_blocks(3)).fuse(); - let t2 = alice.task_manager.future().fuse(); - let t3 = bob.task_manager.future().fuse(); - pin_mut!(t1, t2, t3); + { + let t1 = future::join(alice.wait_for_blocks(3), bob.wait_for_blocks(3)).fuse(); + let t2 = alice.task_manager.future().fuse(); + let t3 = bob.task_manager.future().fuse(); - select! { - _ = t1 => {}, - _ = t2 => panic!("service Alice failed"), - _ = t3 => panic!("service Bob failed"), - } - } + pin_mut!(t1, t2, t3); - alice.task_manager.terminate(); - bob.task_manager.terminate(); + select! { + _ = t1 => {}, + _ = t2 => panic!("service Alice failed"), + _ = t3 => panic!("service Bob failed"), + } } - .fuse(); - pin_mut!(t1, t2); - - select! { - _ = t1 => { - panic!("the test took too long, maybe no blocks have been produced"); - }, - _ = t2 => {}, - } + alice.task_manager.clean_shutdown().await; + bob.task_manager.clean_shutdown().await; } diff --git a/node/test-service/tests/call-function.rs b/node/test-service/tests/call-function.rs index 8a4db067ae..af62bcf5db 100644 --- a/node/test-service/tests/call-function.rs +++ b/node/test-service/tests/call-function.rs @@ -14,60 +14,31 @@ // You should have received a copy of the GNU General Public License // along with Polkadot. If not, see . -use tokio::{time::delay_for as sleep, task::spawn}; -use futures::{pin_mut, select, FutureExt as _}; use polkadot_test_service::*; +use service::TaskExecutor; use sp_keyring::Sr25519Keyring::{Alice, Bob}; -use std::time::Duration; -static INTEGRATION_TEST_ALLOWED_TIME: Option<&str> = option_env!("INTEGRATION_TEST_ALLOWED_TIME"); - -#[tokio::test] -async fn call_function_actually_work() { - let mut alice = run_test_node( - (move |fut, _| { - spawn(fut).map(|_| ()) - }) - .into(), - Alice, - || {}, - Vec::new(), +#[substrate_test_utils::test] +async fn call_function_actually_work(task_executor: TaskExecutor) { + let alice = run_test_node(task_executor, Alice, || {}, Vec::new()); + + let function = polkadot_test_runtime::Call::Balances(pallet_balances::Call::transfer( + Default::default(), + 1, + )); + let output = alice.call_function(function, Bob).await.unwrap(); + + let res = output.result.expect("return value expected"); + let json = serde_json::from_str::(res.as_str()).expect("valid JSON"); + let object = json.as_object().expect("JSON is an object"); + assert!(object.contains_key("jsonrpc"), "key jsonrpc exists"); + let result = object.get("result"); + let result = result.expect("key result exists"); + assert_eq!( + result.as_str().map(|x| x.starts_with("0x")), + Some(true), + "result starts with 0x" ); - let t1 = sleep(Duration::from_secs( - INTEGRATION_TEST_ALLOWED_TIME - .and_then(|x| x.parse().ok()) - .unwrap_or(600), - )) - .fuse(); - let t2 = async { - let function = polkadot_test_runtime::Call::Balances(pallet_balances::Call::transfer( - Default::default(), - 1, - )); - let output = alice.call_function(function, Bob).await.unwrap(); - - let res = output.result.expect("return value expected"); - let json = serde_json::from_str::(res.as_str()).expect("valid JSON"); - let object = json.as_object().expect("JSON is an object"); - assert!(object.contains_key("jsonrpc"), "key jsonrpc exists"); - let result = object.get("result"); - let result = result.expect("key result exists"); - assert_eq!( - result.as_str().map(|x| x.starts_with("0x")), - Some(true), - "result starts with 0x" - ); - - alice.task_manager.terminate(); - } - .fuse(); - - pin_mut!(t1, t2); - select! { - _ = t1 => { - panic!("the test took too long, maybe no blocks have been produced"); - }, - _ = t2 => {}, - } + alice.task_manager.clean_shutdown().await; } -- GitLab From 700f86a2171a165ff5bd8fc2e044903bdb0c430e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Fri, 14 Aug 2020 00:03:50 +0200 Subject: [PATCH 175/192] Make parachain validation wasm executor functional (#1574) * Make parachain validation wasm executor functional - Increase the size of the validation result in the shared memory. The validation result holds the new runtime when a runtime upgrade is scheduled. So, we need to give it enough memory to send the data between the validator and the wasm execution host. - Add the `CallInWasmExt`. This is required when doing a runtime upgrade to check that we upgrade to something meaningful. * Update parachain/src/wasm_executor/mod.rs * Update parachain/src/wasm_executor/mod.rs Co-authored-by: Nikolay Volf Co-authored-by: Nikolay Volf --- parachain/src/wasm_executor/mod.rs | 13 +++++++----- .../src/wasm_executor/validation_host.rs | 21 +++++++++++++------ 2 files changed, 23 insertions(+), 11 deletions(-) diff --git a/parachain/src/wasm_executor/mod.rs b/parachain/src/wasm_executor/mod.rs index 7f53e7829c..a19d6150d0 100644 --- a/parachain/src/wasm_executor/mod.rs +++ b/parachain/src/wasm_executor/mod.rs @@ -35,6 +35,7 @@ mod validation_host; // maximum memory in bytes const MAX_RUNTIME_MEM: usize = 1024 * 1024 * 1024; // 1 GiB const MAX_CODE_MEM: usize = 16 * 1024 * 1024; // 16 MiB +const MAX_VALIDATION_RESULT_HEADER_MEM: usize = MAX_CODE_MEM + 1024; // 16.001 MiB /// A stub validation-pool defined when compiling for Android or WASM. #[cfg(any(target_os = "android", target_os = "unknown"))] @@ -176,11 +177,6 @@ pub fn validate_candidate_internal( encoded_call_data: &[u8], spawner: impl SpawnNamed + 'static, ) -> Result { - let mut extensions = Extensions::new(); - extensions.register(sp_core::traits::TaskExecutorExt::new(spawner)); - - let mut ext = ValidationExternalities(extensions); - let executor = sc_executor::WasmExecutor::new( sc_executor::WasmExecutionMethod::Interpreted, // TODO: Make sure we don't use more than 1GB: https://github.com/paritytech/polkadot/issues/699 @@ -188,6 +184,13 @@ pub fn validate_candidate_internal( HostFunctions::host_functions(), 8 ); + + let mut extensions = Extensions::new(); + extensions.register(sp_core::traits::TaskExecutorExt::new(spawner)); + extensions.register(sp_core::traits::CallInWasmExt::new(executor.clone())); + + let mut ext = ValidationExternalities(extensions); + let res = executor.call_in_wasm( validation_code, None, diff --git a/parachain/src/wasm_executor/validation_host.rs b/parachain/src/wasm_executor/validation_host.rs index ad79949d21..238ed65c7a 100644 --- a/parachain/src/wasm_executor/validation_host.rs +++ b/parachain/src/wasm_executor/validation_host.rs @@ -19,8 +19,10 @@ use std::{process, env, sync::Arc, sync::atomic}; use codec::{Decode, Encode}; use crate::primitives::{ValidationParams, ValidationResult}; -use super::{validate_candidate_internal, ValidationError, InvalidCandidate, InternalError, - MAX_CODE_MEM, MAX_RUNTIME_MEM}; +use super::{ + validate_candidate_internal, ValidationError, InvalidCandidate, InternalError, + MAX_CODE_MEM, MAX_RUNTIME_MEM, MAX_VALIDATION_RESULT_HEADER_MEM, +}; use shared_memory::{SharedMem, SharedMemConf, EventState, WriteLockable, EventWait, EventSet}; use parking_lot::Mutex; use log::{debug, trace}; @@ -113,7 +115,7 @@ pub fn run_worker(mem_id: &str) -> Result<(), String> { }; let exit = Arc::new(atomic::AtomicBool::new(false)); - let task_executor = TaskExecutor::new()?; + let task_executor = TaskExecutor::new()?; // spawn parent monitor thread let watch_exit = exit.clone(); std::thread::spawn(move || { @@ -220,7 +222,7 @@ impl Drop for ValidationHost { impl ValidationHost { fn create_memory() -> Result { - let mem_size = MAX_RUNTIME_MEM + MAX_CODE_MEM + 1024; + let mem_size = MAX_RUNTIME_MEM + MAX_CODE_MEM + MAX_VALIDATION_RESULT_HEADER_MEM; let mem_config = SharedMemConf::default() .set_size(mem_size) .add_lock(shared_memory::LockType::Mutex, 0, mem_size)? @@ -318,9 +320,16 @@ impl ValidationHost { debug!("{} Reading results", self.id); let data: &[u8] = &**memory.wlock_as_slice(0) .map_err(|e| ValidationError::Internal(e.into()))?; - let (header_buf, _) = data.split_at(1024); + let (header_buf, _) = data.split_at(MAX_VALIDATION_RESULT_HEADER_MEM); let mut header_buf: &[u8] = header_buf; - let header = ValidationResultHeader::decode(&mut header_buf).unwrap(); + let header = ValidationResultHeader::decode(&mut header_buf) + .map_err(|e| + InternalError::System( + Box::::from( + format!("Failed to decode `ValidationResultHeader`: {:?}", e) + ) as Box<_> + ) + )?; match header { ValidationResultHeader::Ok(result) => Ok(result), ValidationResultHeader::Error(WorkerValidationError::InternalError(e)) => { -- GitLab From 73de27e05b6fc310e0380c7f636e91df15f6fe73 Mon Sep 17 00:00:00 2001 From: Sergei Shulepov Date: Fri, 14 Aug 2020 16:03:30 +0200 Subject: [PATCH 176/192] Implementer's Guide: Flesh out more details for upward messages (#1556) * Take 2 at the upward messages * Trying to restore stuff from unsuccesful rebase * Fix whitespace * Clean up * Change rustdoc to comment * Pivot to a less stricter, w.r.t. to acceptance, model * Rename `max_upward_message_num_per_candidate` * Update docs for DownwardMessage * Apply suggestions from code review Co-authored-by: Robert Habermeier * Rephrase "Dispatchable objects ready to ..." * Finish the sentence * Add a note about imprecision of the current weight formula * Elaborate on potential use-cases for the upward message kinds. * s/later/below Co-authored-by: Robert Habermeier --- roadmap/implementers-guide/src/messaging.md | 27 +++++----- .../src/runtime/inclusion.md | 4 +- .../src/runtime/inclusioninherent.md | 1 + .../implementers-guide/src/runtime/router.md | 50 +++++++++++++++---- .../implementers-guide/src/types/messages.md | 41 ++++++++++++--- .../implementers-guide/src/types/runtime.md | 18 ++++++- 6 files changed, 108 insertions(+), 33 deletions(-) diff --git a/roadmap/implementers-guide/src/messaging.md b/roadmap/implementers-guide/src/messaging.md index e9e228f30f..6755637589 100644 --- a/roadmap/implementers-guide/src/messaging.md +++ b/roadmap/implementers-guide/src/messaging.md @@ -17,9 +17,7 @@ digraph { } ``` -Downward Message Passing (DMP) is a mechanism for delivering messages to parachains from the relay chain. Downward -messages may originate not from the relay chain, but rather from another parachain via a mechanism -called HRMP (Will be described later). +Downward Message Passing (DMP) is a mechanism for delivering messages to parachains from the relay chain. Each parachain has its own queue that stores all pending inbound downward messages. A parachain doesn't have to process all messages at once, however, there are rules as to how the downward message queue @@ -28,16 +26,19 @@ The downward message queue doesn't have a cap on its size and it is up to the re that prevent spamming in place. Upward Message Passing (UMP) is a mechanism responsible for delivering messages in the opposite direction: -from a parachain up to the relay chain. Upward messages are dispatched to Runtime entrypoints and -typically used for invoking some actions on the relay chain on behalf of the parachain. - -> NOTE: It is conceivable that upward messages will be divided to more fine-grained kinds with a dispatchable upward message -being only one kind of multiple. That would make upward messages inspectable and therefore would allow imposing additional -validity criteria for the candidates that contain these messages. - -Semantically, there is a queue of upward messages queue where messages from each parachain are stored. Each parachain -can have a limited number of messages and the total sum of pending messages is also limited. Each parachain can dispatch -multiple upward messages per candidate. +from a parachain up to the relay chain. Upward messages can serve different purposes and can be of different + kinds. + +One kind of message is `Dispatchable`. They could be thought of similarly to extrinsics sent to a relay chain: they also +invoke exposed runtime entrypoints, they consume weight and require fees. The difference is that they originate from +a parachain. Each parachain has a queue of dispatchables to be executed. There can be only so many dispatchables at a time. +The weight that processing of the dispatchables can consume is limited by a preconfigured value. Therefore, it is possible +that some dispatchables will be left for later blocks. To make the dispatching more fair, the queues are processed turn-by-turn +in a round robin fashion. + +Other kinds of upward messages can be introduced in the future as well. Potential candidates are channel management for +horizontal message passing (XCMP and HRMP, both are to be described below), new validation code signalling, or other +requests to the relay chain. ## Horizontal Message Passing diff --git a/roadmap/implementers-guide/src/runtime/inclusion.md b/roadmap/implementers-guide/src/runtime/inclusion.md index 196b97e05b..17dbdc94cc 100644 --- a/roadmap/implementers-guide/src/runtime/inclusion.md +++ b/roadmap/implementers-guide/src/runtime/inclusion.md @@ -68,7 +68,7 @@ All failed checks should lead to an unrecoverable error making the block invalid 1. Ensure that any code upgrade scheduled by the candidate does not happen within `config.validation_upgrade_frequency` of `Paras::last_code_upgrade(para_id, true)`, if any, comparing against the value of `Paras::FutureCodeUpgrades` for the given para ID. 1. Check the collator's signature on the candidate data. 1. check the backing of the candidate using the signatures and the bitfields, comparing against the validators assigned to the groups, fetched with the `group_validators` lookup. - 1. check that the upward messages, when combined with the existing queue size, are not exceeding `config.max_upward_queue_count` and `config.watermark_upward_queue_size` parameters. + 1. call `Router::check_upward_messages(para, commitments.upward_messages)` to check that the upward messages are valid. 1. call `Router::check_processed_downward_messages(para, commitments.processed_downward_messages)` to check that the DMQ is properly drained. 1. call `Router::check_hrmp_watermark(para, commitments.hrmp_watermark)` for each candidate to check rules of processing the HRMP watermark. 1. check that in the commitments of each candidate the horizontal messages are sorted by ascending recipient ParaId and there is no two horizontal messages have the same recipient. @@ -79,7 +79,7 @@ All failed checks should lead to an unrecoverable error making the block invalid * `enact_candidate(relay_parent_number: BlockNumber, CommittedCandidateReceipt)`: 1. If the receipt contains a code upgrade, Call `Paras::schedule_code_upgrade(para_id, code, relay_parent_number + config.validationl_upgrade_delay)`. > TODO: Note that this is safe as long as we never enact candidates where the relay parent is across a session boundary. In that case, which we should be careful to avoid with contextual execution, the configuration might have changed and the para may de-sync from the host's understanding of it. - 1. call `Router::queue_upward_messages` for each backed candidate, using the [`UpwardMessage`s](../types/messages.md#upward-message) from the [`CandidateCommitments`](../types/candidate.md#candidate-commitments). + 1. call `Router::enact_upward_messages` for each backed candidate, using the [`UpwardMessage`s](../types/messages.md#upward-message) from the [`CandidateCommitments`](../types/candidate.md#candidate-commitments). 1. call `Router::queue_outbound_hrmp` with the para id of the candidate and the list of horizontal messages taken from the commitment, 1. call `Router::prune_hrmp` with the para id of the candiate and the candidate's `hrmp_watermark`. 1. call `Router::prune_dmq` with the para id of the candidate and the candidate's `processed_downward_messages`. diff --git a/roadmap/implementers-guide/src/runtime/inclusioninherent.md b/roadmap/implementers-guide/src/runtime/inclusioninherent.md index c9f1b2105f..d026cf180a 100644 --- a/roadmap/implementers-guide/src/runtime/inclusioninherent.md +++ b/roadmap/implementers-guide/src/runtime/inclusioninherent.md @@ -22,4 +22,5 @@ Included: Option<()>, 1. Invoke `Scheduler::schedule(freed)` 1. Invoke the `Inclusion::process_candidates` routine with the parameters `(backed_candidates, Scheduler::scheduled(), Scheduler::group_validators)`. 1. Call `Scheduler::occupied` using the return value of the `Inclusion::process_candidates` call above, first sorting the list of assigned core indices. + 1. Call the `Router::process_upward_dispatchables` routine to execute all messages in upward dispatch queues. 1. If all of the above succeeds, set `Included` to `Some(())`. diff --git a/roadmap/implementers-guide/src/runtime/router.md b/roadmap/implementers-guide/src/runtime/router.md index 752d15019b..55013fa03b 100644 --- a/roadmap/implementers-guide/src/runtime/router.md +++ b/roadmap/implementers-guide/src/runtime/router.md @@ -10,16 +10,19 @@ Storage layout: /// Paras that are to be cleaned up at the end of the session. /// The entries are sorted ascending by the para id. OutgoingParas: Vec; -/// Messages ready to be dispatched onto the relay chain. +/// Dispatchable objects ready to be dispatched onto the relay chain. The messages are processed in FIFO order. /// This is subject to `max_upward_queue_count` and /// `watermark_queue_size` from `HostConfiguration`. -RelayDispatchQueues: map ParaId => Vec; +RelayDispatchQueues: map ParaId => Vec; /// Size of the dispatch queues. Caches sizes of the queues in `RelayDispatchQueue`. /// First item in the tuple is the count of messages and second /// is the total length (in bytes) of the message payloads. RelayDispatchQueueSize: map ParaId => (u32, u32); /// The ordered list of `ParaId`s that have a `RelayDispatchQueue` entry. NeedsDispatch: Vec; +/// This is the para that gets will get dispatched first during the next upward dispatchable queue +/// execution round. +NextDispatchRoundStartWith: Option; /// The downward messages addressed for a certain para. DownwardMessageQueues: map ParaId => Vec; ``` @@ -158,6 +161,12 @@ The following routines are intended to be invoked by paras' upward messages. Candidate Acceptance Function: +* `check_upward_messages(P: ParaId, Vec`: + 1. Checks that there are at most `config.max_upward_message_num_per_candidate` messages. + 1. Checks each upward message individually depending on its kind: + 1. If the message kind is `Dispatchable`: + 1. Verify that `RelayDispatchQueueSize` for `P` has enough capacity for the message (NOTE that should include all processed + upward messages of the `Dispatchable` kind up to this point!) * `check_processed_downward_messages(P: ParaId, processed_downward_messages)`: 1. Checks that `DownwardMessageQueues` for `P` is at least `processed_downward_messages` long. 1. Checks that `processed_downward_messages` is at least 1 if `DownwardMessageQueues` for `P` is not empty. @@ -190,15 +199,39 @@ Candidate Enactment: 1. Set `HrmpWatermarks` for `P` to be equal to `new_hrmp_watermark` * `prune_dmq(P: ParaId, processed_downward_messages)`: 1. Remove the first `processed_downward_messages` from the `DownwardMessageQueues` of `P`. - -* `queue_upward_messages(ParaId, Vec)`: - 1. Updates `NeedsDispatch`, and enqueues upward messages into `RelayDispatchQueue` and modifies the respective entry in `RelayDispatchQueueSize`. +* `enact_upward_messages(P: ParaId, Vec)`: + 1. Process all upward messages in order depending on their kinds: + 1. If the message kind is `Dispatchable`: + 1. Append the message to `RelayDispatchQueues` for `P` + 1. Increment the size and the count in `RelayDispatchQueueSize` for `P`. + 1. Ensure that `P` is present in `NeedsDispatch`. The following routine is intended to be called in the same time when `Paras::schedule_para_cleanup` is called. `schedule_para_cleanup(ParaId)`: 1. Add the para into the `OutgoingParas` vector maintaining the sorted order. +The following routine is meant to execute pending entries in upward dispatchable queues. This function doesn't fail, even if +any of dispatchables return an error. + +`process_upward_dispatchables()`: + 1. Initialize a cumulative weight counter `T` to 0 + 1. Initialize a local in memory dictionary `R` that maps `ParaId` to a vector of `DispatchResult`. + 1. Iterate over items in `NeedsDispatch` cyclically, starting with `NextDispatchRoundStartWith`. If the item specified is `None` start from the beginning. For each `P` encountered: + 1. Dequeue `D` the first dispatchable `D` from `RelayDispatchQueues` for `P` + 1. Decrement the size of the message from `RelayDispatchQueueSize` for `P` + 1. Decode `D` into a dispatchable. If failed append `DispatchResult::DecodeFailed` into `R` for `P`. Otherwise, if succeeded: + 1. If `weight_of(D) > config.dispatchable_upward_message_critical_weight` then append `DispatchResult::CriticalWeightExceeded` into `R` for `P`. Otherwise: + 1. Execute `D` and add the actual amount of weight consumed to `T`. Add the `DispatchResult` into `R` for `P`. + 1. If `weight_of(D) + T > config.preferred_dispatchable_upward_messages_step_weight`, set `NextDispatchRoundStartWith` to `P` and finish processing. + > NOTE that in practice we would need to approach the weight calculation more thoroughly, i.e. incorporate all operations + > that could take place on the course of handling these dispatchables. + 1. If `RelayDispatchQueues` for `P` became empty, remove `P` from `NeedsDispatch`. + 1. If `NeedsDispatch` became empty then finish processing and set `NextDispatchRoundStartWith` to `None`. + 1. Then, for each `P` and the vector of `DispatchResult` in `R`: + 1. Obtain a message by wrapping the vector into `DownwardMessage::DispatchResult` + 1. Append the resulting message to `DownwardMessageQueues` for `P`. + ## Session Change 1. Drain `OutgoingParas`. For each `P` happened to be in the list: @@ -207,8 +240,9 @@ The following routine is intended to be called in the same time when `Paras::sch 1. Remove all `DownwardMessageQueues` of `P`. 1. Remove `RelayDispatchQueueSize` of `P`. 1. Remove `RelayDispatchQueues` of `P`. + 1. Remove `P` if it exists in `NeedsDispatch`. + 1. If `P` is in `NextDispatchRoundStartWith`, then reset it to `None` - Note that we don't remove the open/close requests since they are gon die out naturally. -TODO: What happens with the deposits in channels or open requests? 1. For each request `R` in `HrmpOpenChannelRequests`: 1. if `R.confirmed = false`: 1. increment `R.age` by 1. @@ -234,7 +268,3 @@ To remove a channel `C` identified with a tuple `(sender, recipient)`: 1. Remove `C` from `HrmpChannelContents`. 1. Remove `recipient` from the set `HrmpEgressChannelsIndex` for `sender`. 1. Remove `sender` from the set `HrmpIngressChannelsIndex` for `recipient`. - -## Finalization - - 1. Dispatch queued upward messages from `RelayDispatchQueues` in a FIFO order applying the `config.watermark_upward_queue_size` and `config.max_upward_queue_count` limits. diff --git a/roadmap/implementers-guide/src/types/messages.md b/roadmap/implementers-guide/src/types/messages.md index 8def95ee04..af44166707 100644 --- a/roadmap/implementers-guide/src/types/messages.md +++ b/roadmap/implementers-guide/src/types/messages.md @@ -22,11 +22,24 @@ enum ParachainDispatchOrigin { Root, } -struct UpwardMessage { - /// The origin for the message to be sent from. - pub origin: ParachainDispatchOrigin, - /// The message data. - pub data: Vec, +/// An opaque byte buffer that encodes an entrypoint and the arguments that should be +/// provided to it upon the dispatch. +/// +/// NOTE In order to be executable the byte buffer should be decoded which potentially can fail if +/// the encoding was changed. +type RawDispatchable = Vec; + +enum UpwardMessage { + /// This upward message is meant to schedule execution of a provided dispatchable. + Dispatchable { + /// The origin with which the dispatchable should be executed. + origin: ParachainDispatchOrigin, + /// The dispatchable to be executed in its raw form. + dispatchable: RawDispatchable, + }, + // Examples: + // HrmpOpenChannel { .. }, + // HrmpCloseChannel { .. }, } ``` @@ -53,11 +66,25 @@ struct InboundHrmpMessage { ## Downward Message -A message that go down from the relay chain to a parachain. Such a message could be initiated either -as a result of an operation took place on the relay chain. +`DownwardMessage`- is a message that goes down from the relay chain to a parachain. Such a message +could be seen as a notification, however, it is conceivable that they might be used by the relay +chain to send a request to the parachain (likely, through the `ParachainSpecific` variant). ```rust,ignore +enum DispatchResult { + Executed { + success: bool, + }, + /// Decoding `RawDispatchable` into an executable runtime representation has failed. + DecodeFailed, + /// A dispatchable in question exceeded the maximum amount of weight allowed. + CriticalWeightExceeded, +} + enum DownwardMessage { + /// The parachain receives a dispatch result for each sent dispatchable upward message in order + /// they were sent. + DispatchResult(Vec), /// Some funds were transferred into the parachain's account. The hash is the identifier that /// was given with the transfer. TransferInto(AccountId, Balance, Remark), diff --git a/roadmap/implementers-guide/src/types/runtime.md b/roadmap/implementers-guide/src/types/runtime.md index 03494ed902..a018d2eae6 100644 --- a/roadmap/implementers-guide/src/types/runtime.md +++ b/roadmap/implementers-guide/src/types/runtime.md @@ -39,7 +39,23 @@ struct HostConfiguration { /// Total size of messages allowed in the parachain -> relay-chain message queue before which /// no further messages may be added to it. If it exceeds this then the queue may contain only /// a single message. - pub watermark_upward_queue_size: u32, + pub max_upward_queue_size: u32, + /// The amount of weight we wish to devote to the processing the dispatchable upward messages + /// stage. + /// + /// NOTE that this is a soft limit and could be exceeded. + pub preferred_dispatchable_upward_messages_step_weight: u32, + /// Any dispatchable upward message that requests more than the critical amount is rejected + /// with `DispatchResult::CriticalWeightExceeded`. + /// + /// The parameter value is picked up so that no dispatchable can make the block weight exceed + /// the total budget. I.e. that the sum of `preferred_dispatchable_upward_messages_step_weight` + /// and `dispatchable_upward_message_critical_weight` doesn't exceed the amount of weight left + /// under a typical worst case (e.g. no upgrades, etc) weight consumed by the required phases of + /// block execution (i.e. initialization, finalization and inherents). + pub dispatchable_upward_message_critical_weight: u32, + /// The maximum number of messages that a candidate can contain. + pub max_upward_message_num_per_candidate: u32, /// Number of sessions after which an HRMP open channel request expires. pub hrmp_open_request_ttl: u32, /// The deposit that the sender should provide for opening an HRMP channel. -- GitLab From 8a50b23cd742f77575330258c0f608e267ce006f Mon Sep 17 00:00:00 2001 From: Andronik Ordian Date: Fri, 14 Aug 2020 21:35:00 +0200 Subject: [PATCH 177/192] overseer: add a test to ensure all subsystem receive msgs (#1590) * overseer: add a test to ensure all subsystem receive msgs * lol --- Cargo.lock | 1 + node/overseer/Cargo.toml | 1 + node/overseer/src/lib.rs | 219 ++++++++++++++++++++++++++++++++++++++- 3 files changed, 219 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 227fd89680..092806bab3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4895,6 +4895,7 @@ dependencies = [ "futures-timer 3.0.2", "kv-log-macro", "log 0.4.11", + "polkadot-node-network-protocol", "polkadot-node-primitives", "polkadot-node-subsystem", "polkadot-primitives", diff --git a/node/overseer/Cargo.toml b/node/overseer/Cargo.toml index da19a26e0a..e21cb93631 100644 --- a/node/overseer/Cargo.toml +++ b/node/overseer/Cargo.toml @@ -17,6 +17,7 @@ async-trait = "0.1" [dev-dependencies] sp-core = { git = "https://github.com/paritytech/substrate", branch = "master" } +polkadot-node-network-protocol = { path = "../network/protocol" } futures = { version = "0.3.5", features = ["thread-pool"] } futures-timer = "3.0.2" femme = "2.0.1" diff --git a/node/overseer/src/lib.rs b/node/overseer/src/lib.rs index d4931baa33..185a0f5614 100644 --- a/node/overseer/src/lib.rs +++ b/node/overseer/src/lib.rs @@ -717,6 +717,10 @@ where let _ = s.tx.send(FromOverseer::Signal(OverseerSignal::Conclude)).await; } + if let Some(ref mut s) = self.bitfield_signing_subsystem.instance { + let _ = s.tx.send(FromOverseer::Signal(OverseerSignal::Conclude)).await; + } + if let Some(ref mut s) = self.bitfield_distribution_subsystem.instance { let _ = s.tx.send(FromOverseer::Signal(OverseerSignal::Conclude)).await; } @@ -733,7 +737,7 @@ where let _ = s.tx.send(FromOverseer::Signal(OverseerSignal::Conclude)).await; } - if let Some(ref mut s) = self.availability_distribution_subsystem.instance { + if let Some(ref mut s) = self.availability_store_subsystem.instance { let _ = s.tx.send(FromOverseer::Signal(OverseerSignal::Conclude)).await; } @@ -817,7 +821,7 @@ where async fn block_imported(&mut self, block: BlockInfo) -> SubsystemResult<()> { let mut update = ActiveLeavesUpdate::default(); - if let Some(parent) = self.active_leaves.take(&(block.parent_hash, block.number - 1)) { + if let Some(parent) = block.number.checked_sub(1).and_then(|number| self.active_leaves.take(&(block.parent_hash, number))) { update.deactivated.push(parent.0); } @@ -879,6 +883,10 @@ where s.tx.send(FromOverseer::Signal(signal.clone())).await?; } + if let Some(ref mut s) = self.bitfield_signing_subsystem.instance { + s.tx.send(FromOverseer::Signal(signal.clone())).await?; + } + if let Some(ref mut s) = self.provisioner_subsystem.instance { s.tx.send(FromOverseer::Signal(signal.clone())).await?; } @@ -1021,10 +1029,15 @@ fn spawn( #[cfg(test)] mod tests { + use std::sync::atomic; use futures::{executor, pin_mut, select, channel::mpsc, FutureExt}; use polkadot_primitives::v1::{BlockData, PoV}; use polkadot_subsystem::DummySubsystem; + use polkadot_subsystem::messages::RuntimeApiRequest; + + use polkadot_node_network_protocol::{PeerId, ReputationChange, NetworkBridgeEvent}; + use super::*; @@ -1492,4 +1505,206 @@ mod tests { } }); } + + #[derive(Clone)] + struct CounterSubsystem { + stop_signals_received: Arc, + signals_received: Arc, + msgs_received: Arc, + } + + impl CounterSubsystem { + fn new( + stop_signals_received: Arc, + signals_received: Arc, + msgs_received: Arc, + ) -> Self { + Self { + stop_signals_received, + signals_received, + msgs_received, + } + } + } + + impl Subsystem for CounterSubsystem + where + C: SubsystemContext, + M: Send, + { + fn start(self, mut ctx: C) -> SpawnedSubsystem { + SpawnedSubsystem { + name: "counter-subsystem", + future: Box::pin(async move { + loop { + match ctx.try_recv().await { + Ok(Some(FromOverseer::Signal(OverseerSignal::Conclude))) => { + self.stop_signals_received.fetch_add(1, atomic::Ordering::SeqCst); + break; + }, + Ok(Some(FromOverseer::Signal(_))) => { + self.signals_received.fetch_add(1, atomic::Ordering::SeqCst); + continue; + }, + Ok(Some(FromOverseer::Communication { .. })) => { + self.msgs_received.fetch_add(1, atomic::Ordering::SeqCst); + continue; + }, + Err(_) => (), + _ => (), + } + pending!(); + } + }), + } + } + } + + fn test_candidate_validation_msg() -> CandidateValidationMessage { + let (sender, _) = oneshot::channel(); + let pov = Arc::new(PoV { block_data: BlockData(Vec::new()) }); + CandidateValidationMessage::ValidateFromChainState(Default::default(), pov, sender) + } + + fn test_candidate_backing_msg() -> CandidateBackingMessage { + let (sender, _) = oneshot::channel(); + CandidateBackingMessage::GetBackedCandidates(Default::default(), sender) + } + + fn test_candidate_selection_msg() -> CandidateSelectionMessage { + CandidateSelectionMessage::default() + } + + fn test_chain_api_msg() -> ChainApiMessage { + let (sender, _) = oneshot::channel(); + ChainApiMessage::FinalizedBlockNumber(sender) + } + + fn test_collator_protocol_msg() -> CollatorProtocolMessage { + CollatorProtocolMessage::CollateOn(Default::default()) + } + + fn test_network_bridge_event() -> NetworkBridgeEvent { + NetworkBridgeEvent::PeerDisconnected(PeerId::random()) + } + + fn test_statement_distribution_msg() -> StatementDistributionMessage { + StatementDistributionMessage::NetworkBridgeUpdateV1(test_network_bridge_event()) + } + + fn test_availability_distribution_msg() -> AvailabilityDistributionMessage { + AvailabilityDistributionMessage::NetworkBridgeUpdateV1(test_network_bridge_event()) + } + + fn test_bitfield_distribution_msg() -> BitfieldDistributionMessage { + BitfieldDistributionMessage::NetworkBridgeUpdateV1(test_network_bridge_event()) + } + + fn test_provisioner_msg() -> ProvisionerMessage { + let (sender, _) = oneshot::channel(); + ProvisionerMessage::RequestInherentData(Default::default(), sender) + } + + fn test_pov_distribution_msg() -> PoVDistributionMessage { + PoVDistributionMessage::NetworkBridgeUpdateV1(test_network_bridge_event()) + } + + fn test_runtime_api_msg() -> RuntimeApiMessage { + let (sender, _) = oneshot::channel(); + RuntimeApiMessage::Request(Default::default(), RuntimeApiRequest::Validators(sender)) + } + + fn test_availability_store_msg() -> AvailabilityStoreMessage { + let (sender, _) = oneshot::channel(); + AvailabilityStoreMessage::QueryAvailableData(Default::default(), sender) + } + + fn test_network_bridge_msg() -> NetworkBridgeMessage { + NetworkBridgeMessage::ReportPeer(PeerId::random(), ReputationChange::new(42, "")) + } + + // Checks that `stop`, `broadcast_signal` and `broadcast_message` are implemented correctly. + #[test] + fn overseer_all_subsystems_receive_signals_and_messages() { + let spawner = sp_core::testing::TaskExecutor::new(); + + executor::block_on(async move { + let stop_signals_received = Arc::new(atomic::AtomicUsize::new(0)); + let signals_received = Arc::new(atomic::AtomicUsize::new(0)); + let msgs_received = Arc::new(atomic::AtomicUsize::new(0)); + + let subsystem = CounterSubsystem::new( + stop_signals_received.clone(), + signals_received.clone(), + msgs_received.clone(), + ); + + let all_subsystems = AllSubsystems { + candidate_validation: subsystem.clone(), + candidate_backing: subsystem.clone(), + candidate_selection: subsystem.clone(), + collator_protocol: subsystem.clone(), + statement_distribution: subsystem.clone(), + availability_distribution: subsystem.clone(), + bitfield_signing: subsystem.clone(), + bitfield_distribution: subsystem.clone(), + provisioner: subsystem.clone(), + pov_distribution: subsystem.clone(), + runtime_api: subsystem.clone(), + availability_store: subsystem.clone(), + network_bridge: subsystem.clone(), + chain_api: subsystem.clone(), + }; + let (overseer, mut handler) = Overseer::new( + vec![], + all_subsystems, + spawner, + ).unwrap(); + let overseer_fut = overseer.run().fuse(); + + pin_mut!(overseer_fut); + + // send a signal to each subsystem + handler.block_imported(BlockInfo { + hash: Default::default(), + parent_hash: Default::default(), + number: Default::default(), + }).await.unwrap(); + + // send a msg to each subsystem + // except for BitfieldSigning as the message is not instantiable + handler.send_msg(AllMessages::CandidateValidation(test_candidate_validation_msg())).await.unwrap(); + handler.send_msg(AllMessages::CandidateBacking(test_candidate_backing_msg())).await.unwrap(); + handler.send_msg(AllMessages::CandidateSelection(test_candidate_selection_msg())).await.unwrap(); + handler.send_msg(AllMessages::CollatorProtocol(test_collator_protocol_msg())).await.unwrap(); + handler.send_msg(AllMessages::StatementDistribution(test_statement_distribution_msg())).await.unwrap(); + handler.send_msg(AllMessages::AvailabilityDistribution(test_availability_distribution_msg())).await.unwrap(); + // handler.send_msg(AllMessages::BitfieldSigning(test_bitfield_signing_msg())).await.unwrap(); + handler.send_msg(AllMessages::BitfieldDistribution(test_bitfield_distribution_msg())).await.unwrap(); + handler.send_msg(AllMessages::Provisioner(test_provisioner_msg())).await.unwrap(); + handler.send_msg(AllMessages::PoVDistribution(test_pov_distribution_msg())).await.unwrap(); + handler.send_msg(AllMessages::RuntimeApi(test_runtime_api_msg())).await.unwrap(); + handler.send_msg(AllMessages::AvailabilityStore(test_availability_store_msg())).await.unwrap(); + handler.send_msg(AllMessages::NetworkBridge(test_network_bridge_msg())).await.unwrap(); + handler.send_msg(AllMessages::ChainApi(test_chain_api_msg())).await.unwrap(); + + // send a stop signal to each subsystems + handler.stop().await.unwrap(); + + select! { + res = overseer_fut => { + const NUM_SUBSYSTEMS: usize = 14; + + assert_eq!(stop_signals_received.load(atomic::Ordering::SeqCst), NUM_SUBSYSTEMS); + // x2 because of broadcast_signal on startup + assert_eq!(signals_received.load(atomic::Ordering::SeqCst), 2 * NUM_SUBSYSTEMS); + // -1 for BitfieldSigning + assert_eq!(msgs_received.load(atomic::Ordering::SeqCst), NUM_SUBSYSTEMS - 1); + + assert!(res.is_ok()); + }, + complete => (), + } + }); + } } -- GitLab From d81c98b77c4aa740ec889b0a72f6791ef9fd73f3 Mon Sep 17 00:00:00 2001 From: Seun Lanlege Date: Sat, 15 Aug 2020 10:31:51 +0100 Subject: [PATCH 178/192] Companion PR for #6846 (#1568) * remove Arc * "Update Substrate" Co-authored-by: parity-processbot <> --- Cargo.lock | 294 ++++++++++++++++++----------------- node/test-service/src/lib.rs | 4 +- service/src/lib.rs | 6 +- 3 files changed, 156 insertions(+), 148 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 092806bab3..105b143acf 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -309,6 +309,12 @@ dependencies = [ "syn 1.0.33", ] +[[package]] +name = "atomic" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64f46ca51dca4837f1520754d1c8c36636356b81553d928dc9c177025369a06e" + [[package]] name = "atomic-waker" version = "1.0.0" @@ -1395,7 +1401,7 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "fork-tree" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" dependencies = [ "parity-scale-codec", ] @@ -1403,7 +1409,7 @@ dependencies = [ [[package]] name = "frame-benchmarking" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" dependencies = [ "frame-support", "frame-system", @@ -1420,7 +1426,7 @@ dependencies = [ [[package]] name = "frame-benchmarking-cli" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" dependencies = [ "frame-benchmarking", "parity-scale-codec", @@ -1438,7 +1444,7 @@ dependencies = [ [[package]] name = "frame-executive" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" dependencies = [ "frame-support", "frame-system", @@ -1453,7 +1459,7 @@ dependencies = [ [[package]] name = "frame-metadata" version = "11.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" dependencies = [ "parity-scale-codec", "serde", @@ -1464,7 +1470,7 @@ dependencies = [ [[package]] name = "frame-support" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" dependencies = [ "bitmask", "frame-metadata", @@ -1489,7 +1495,7 @@ dependencies = [ [[package]] name = "frame-support-procedural" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" dependencies = [ "frame-support-procedural-tools", "proc-macro2 1.0.18", @@ -1500,7 +1506,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" dependencies = [ "frame-support-procedural-tools-derive", "proc-macro-crate", @@ -1512,7 +1518,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools-derive" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" dependencies = [ "proc-macro2 1.0.18", "quote 1.0.7", @@ -1522,7 +1528,7 @@ dependencies = [ [[package]] name = "frame-system" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" dependencies = [ "frame-support", "impl-trait-for-tuples", @@ -1538,7 +1544,7 @@ dependencies = [ [[package]] name = "frame-system-benchmarking" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" dependencies = [ "frame-benchmarking", "frame-support", @@ -1552,7 +1558,7 @@ dependencies = [ [[package]] name = "frame-system-rpc-runtime-api" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" dependencies = [ "parity-scale-codec", "sp-api", @@ -2690,10 +2696,11 @@ checksum = "c7d73b3f436185384286bd8098d17ec07c9a7d2388a6599f824d8502b529702a" [[package]] name = "libp2p" -version = "0.22.0" +version = "0.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0306a49ee6a89468f96089906f36b0eef82c988dcfc8acf3e2dcd6ad1c859f85" +checksum = "b1ebb6c031584a5af181fe3a1e4b074af5d0b1a3b31663200f0251f4bcff6b5c" dependencies = [ + "atomic", "bytes 0.5.5", "futures 0.3.5", "lazy_static", @@ -2857,9 +2864,9 @@ dependencies = [ [[package]] name = "libp2p-noise" -version = "0.21.0" +version = "0.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f353f8966bbaaf7456535fffd3f366f153148773a0cf04b2ec3860955cb720e" +checksum = "1e594f2de0c23c2b7ad14802c991a2e68e95315c6a6c7715e53801506f20135d" dependencies = [ "bytes 0.5.5", "curve25519-dalek", @@ -3551,7 +3558,7 @@ dependencies = [ [[package]] name = "pallet-authority-discovery" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" dependencies = [ "frame-support", "frame-system", @@ -3567,7 +3574,7 @@ dependencies = [ [[package]] name = "pallet-authorship" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" dependencies = [ "frame-support", "frame-system", @@ -3582,7 +3589,7 @@ dependencies = [ [[package]] name = "pallet-babe" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" dependencies = [ "frame-benchmarking", "frame-support", @@ -3607,7 +3614,7 @@ dependencies = [ [[package]] name = "pallet-balances" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" dependencies = [ "frame-benchmarking", "frame-support", @@ -3621,7 +3628,7 @@ dependencies = [ [[package]] name = "pallet-collective" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" dependencies = [ "frame-benchmarking", "frame-support", @@ -3637,7 +3644,7 @@ dependencies = [ [[package]] name = "pallet-democracy" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" dependencies = [ "frame-benchmarking", "frame-support", @@ -3652,7 +3659,7 @@ dependencies = [ [[package]] name = "pallet-elections-phragmen" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" dependencies = [ "frame-benchmarking", "frame-support", @@ -3667,7 +3674,7 @@ dependencies = [ [[package]] name = "pallet-finality-tracker" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" dependencies = [ "frame-support", "frame-system", @@ -3683,7 +3690,7 @@ dependencies = [ [[package]] name = "pallet-grandpa" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" dependencies = [ "frame-benchmarking", "frame-support", @@ -3705,7 +3712,7 @@ dependencies = [ [[package]] name = "pallet-identity" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" dependencies = [ "enumflags2", "frame-benchmarking", @@ -3721,7 +3728,7 @@ dependencies = [ [[package]] name = "pallet-im-online" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" dependencies = [ "frame-benchmarking", "frame-support", @@ -3741,7 +3748,7 @@ dependencies = [ [[package]] name = "pallet-indices" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" dependencies = [ "frame-support", "frame-system", @@ -3757,7 +3764,7 @@ dependencies = [ [[package]] name = "pallet-membership" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" dependencies = [ "frame-support", "frame-system", @@ -3771,7 +3778,7 @@ dependencies = [ [[package]] name = "pallet-multisig" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" dependencies = [ "frame-support", "frame-system", @@ -3786,7 +3793,7 @@ dependencies = [ [[package]] name = "pallet-nicks" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" dependencies = [ "frame-support", "frame-system", @@ -3800,7 +3807,7 @@ dependencies = [ [[package]] name = "pallet-offences" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" dependencies = [ "frame-support", "frame-system", @@ -3815,7 +3822,7 @@ dependencies = [ [[package]] name = "pallet-offences-benchmarking" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" dependencies = [ "frame-benchmarking", "frame-support", @@ -3836,7 +3843,7 @@ dependencies = [ [[package]] name = "pallet-proxy" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" dependencies = [ "frame-support", "frame-system", @@ -3851,7 +3858,7 @@ dependencies = [ [[package]] name = "pallet-randomness-collective-flip" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" dependencies = [ "frame-support", "frame-system", @@ -3864,7 +3871,7 @@ dependencies = [ [[package]] name = "pallet-recovery" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" dependencies = [ "enumflags2", "frame-support", @@ -3879,7 +3886,7 @@ dependencies = [ [[package]] name = "pallet-scheduler" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" dependencies = [ "frame-benchmarking", "frame-support", @@ -3894,7 +3901,7 @@ dependencies = [ [[package]] name = "pallet-session" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" dependencies = [ "frame-support", "frame-system", @@ -3914,7 +3921,7 @@ dependencies = [ [[package]] name = "pallet-session-benchmarking" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" dependencies = [ "frame-benchmarking", "frame-support", @@ -3930,7 +3937,7 @@ dependencies = [ [[package]] name = "pallet-society" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" dependencies = [ "frame-support", "frame-system", @@ -3944,7 +3951,7 @@ dependencies = [ [[package]] name = "pallet-staking" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" dependencies = [ "frame-benchmarking", "frame-support", @@ -3966,7 +3973,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-curve" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -3977,7 +3984,7 @@ dependencies = [ [[package]] name = "pallet-sudo" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" dependencies = [ "frame-support", "frame-system", @@ -3991,7 +3998,7 @@ dependencies = [ [[package]] name = "pallet-timestamp" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" dependencies = [ "frame-benchmarking", "frame-support", @@ -4009,7 +4016,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" dependencies = [ "frame-support", "frame-system", @@ -4026,7 +4033,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" dependencies = [ "jsonrpc-core", "jsonrpc-core-client", @@ -4044,7 +4051,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc-runtime-api" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" dependencies = [ "frame-support", "parity-scale-codec", @@ -4057,7 +4064,7 @@ dependencies = [ [[package]] name = "pallet-treasury" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" dependencies = [ "frame-benchmarking", "frame-support", @@ -4072,7 +4079,7 @@ dependencies = [ [[package]] name = "pallet-utility" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" dependencies = [ "frame-benchmarking", "frame-support", @@ -4088,7 +4095,7 @@ dependencies = [ [[package]] name = "pallet-vesting" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" dependencies = [ "enumflags2", "frame-benchmarking", @@ -6295,7 +6302,7 @@ dependencies = [ [[package]] name = "sc-authority-discovery" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" dependencies = [ "bytes 0.5.5", "derive_more 0.99.9", @@ -6322,7 +6329,7 @@ dependencies = [ [[package]] name = "sc-basic-authorship" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6346,7 +6353,7 @@ dependencies = [ [[package]] name = "sc-block-builder" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" dependencies = [ "parity-scale-codec", "sc-client-api", @@ -6363,7 +6370,7 @@ dependencies = [ [[package]] name = "sc-chain-spec" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" dependencies = [ "impl-trait-for-tuples", "sc-chain-spec-derive", @@ -6379,7 +6386,7 @@ dependencies = [ [[package]] name = "sc-chain-spec-derive" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -6390,7 +6397,7 @@ dependencies = [ [[package]] name = "sc-cli" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" dependencies = [ "ansi_term 0.12.1", "atty", @@ -6431,7 +6438,7 @@ dependencies = [ [[package]] name = "sc-client-api" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" dependencies = [ "derive_more 0.99.9", "fnv", @@ -6467,7 +6474,7 @@ dependencies = [ [[package]] name = "sc-client-db" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" dependencies = [ "blake2-rfc", "hash-db", @@ -6497,7 +6504,7 @@ dependencies = [ [[package]] name = "sc-consensus" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" dependencies = [ "sc-client-api", "sp-blockchain", @@ -6508,7 +6515,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" dependencies = [ "derive_more 0.99.9", "fork-tree", @@ -6552,7 +6559,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe-rpc" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -6576,7 +6583,7 @@ dependencies = [ [[package]] name = "sc-consensus-epochs" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" dependencies = [ "fork-tree", "parity-scale-codec", @@ -6589,7 +6596,7 @@ dependencies = [ [[package]] name = "sc-consensus-slots" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6612,7 +6619,7 @@ dependencies = [ [[package]] name = "sc-consensus-uncles" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" dependencies = [ "log 0.4.11", "sc-client-api", @@ -6626,7 +6633,7 @@ dependencies = [ [[package]] name = "sc-executor" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" dependencies = [ "derive_more 0.99.9", "lazy_static", @@ -6654,7 +6661,7 @@ dependencies = [ [[package]] name = "sc-executor-common" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" dependencies = [ "derive_more 0.99.9", "log 0.4.11", @@ -6671,7 +6678,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmi" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" dependencies = [ "log 0.4.11", "parity-scale-codec", @@ -6686,7 +6693,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmtime" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" dependencies = [ "log 0.4.11", "parity-scale-codec", @@ -6704,7 +6711,7 @@ dependencies = [ [[package]] name = "sc-finality-grandpa" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" dependencies = [ "derive_more 0.99.9", "finality-grandpa", @@ -6741,7 +6748,7 @@ dependencies = [ [[package]] name = "sc-finality-grandpa-rpc" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" dependencies = [ "derive_more 0.99.9", "finality-grandpa", @@ -6762,7 +6769,7 @@ dependencies = [ [[package]] name = "sc-informant" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" dependencies = [ "ansi_term 0.12.1", "futures 0.3.5", @@ -6780,7 +6787,7 @@ dependencies = [ [[package]] name = "sc-keystore" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" dependencies = [ "derive_more 0.99.9", "hex", @@ -6796,7 +6803,7 @@ dependencies = [ [[package]] name = "sc-light" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" dependencies = [ "hash-db", "lazy_static", @@ -6815,7 +6822,7 @@ dependencies = [ [[package]] name = "sc-network" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" dependencies = [ "bitflags", "bs58", @@ -6867,7 +6874,7 @@ dependencies = [ [[package]] name = "sc-network-gossip" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6882,7 +6889,7 @@ dependencies = [ [[package]] name = "sc-network-test" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" dependencies = [ "env_logger", "futures 0.3.5", @@ -6909,7 +6916,7 @@ dependencies = [ [[package]] name = "sc-offchain" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" dependencies = [ "bytes 0.5.5", "fnv", @@ -6936,7 +6943,7 @@ dependencies = [ [[package]] name = "sc-peerset" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" dependencies = [ "futures 0.3.5", "libp2p", @@ -6949,7 +6956,7 @@ dependencies = [ [[package]] name = "sc-proposer-metrics" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" dependencies = [ "log 0.4.11", "substrate-prometheus-endpoint", @@ -6958,7 +6965,7 @@ dependencies = [ [[package]] name = "sc-rpc" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" dependencies = [ "futures 0.3.5", "hash-db", @@ -6990,7 +6997,7 @@ dependencies = [ [[package]] name = "sc-rpc-api" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -7014,7 +7021,7 @@ dependencies = [ [[package]] name = "sc-rpc-server" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" dependencies = [ "jsonrpc-core", "jsonrpc-http-server", @@ -7030,7 +7037,7 @@ dependencies = [ [[package]] name = "sc-service" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" dependencies = [ "derive_more 0.99.9", "directories", @@ -7039,6 +7046,7 @@ dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", "hash-db", + "jsonrpc-core", "jsonrpc-pubsub", "lazy_static", "log 0.4.11", @@ -7090,7 +7098,7 @@ dependencies = [ [[package]] name = "sc-state-db" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" dependencies = [ "log 0.4.11", "parity-scale-codec", @@ -7104,7 +7112,7 @@ dependencies = [ [[package]] name = "sc-telemetry" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -7125,7 +7133,7 @@ dependencies = [ [[package]] name = "sc-tracing" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" dependencies = [ "erased-serde", "log 0.4.11", @@ -7143,7 +7151,7 @@ dependencies = [ [[package]] name = "sc-transaction-graph" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -7164,7 +7172,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -7631,7 +7639,7 @@ dependencies = [ [[package]] name = "sp-allocator" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" dependencies = [ "derive_more 0.99.9", "log 0.4.11", @@ -7643,7 +7651,7 @@ dependencies = [ [[package]] name = "sp-api" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" dependencies = [ "hash-db", "parity-scale-codec", @@ -7658,7 +7666,7 @@ dependencies = [ [[package]] name = "sp-api-proc-macro" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" dependencies = [ "blake2-rfc", "proc-macro-crate", @@ -7670,7 +7678,7 @@ dependencies = [ [[package]] name = "sp-application-crypto" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" dependencies = [ "parity-scale-codec", "serde", @@ -7682,7 +7690,7 @@ dependencies = [ [[package]] name = "sp-arithmetic" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" dependencies = [ "integer-sqrt", "num-traits 0.2.12", @@ -7695,7 +7703,7 @@ dependencies = [ [[package]] name = "sp-authority-discovery" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" dependencies = [ "parity-scale-codec", "sp-api", @@ -7707,7 +7715,7 @@ dependencies = [ [[package]] name = "sp-authorship" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" dependencies = [ "parity-scale-codec", "sp-inherents", @@ -7718,7 +7726,7 @@ dependencies = [ [[package]] name = "sp-block-builder" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" dependencies = [ "parity-scale-codec", "sp-api", @@ -7730,7 +7738,7 @@ dependencies = [ [[package]] name = "sp-blockchain" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" dependencies = [ "derive_more 0.99.9", "log 0.4.11", @@ -7747,7 +7755,7 @@ dependencies = [ [[package]] name = "sp-chain-spec" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" dependencies = [ "serde", "serde_json", @@ -7756,7 +7764,7 @@ dependencies = [ [[package]] name = "sp-consensus" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -7782,7 +7790,7 @@ dependencies = [ [[package]] name = "sp-consensus-aura" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" dependencies = [ "parity-scale-codec", "sp-api", @@ -7796,7 +7804,7 @@ dependencies = [ [[package]] name = "sp-consensus-babe" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" dependencies = [ "merlin", "parity-scale-codec", @@ -7815,7 +7823,7 @@ dependencies = [ [[package]] name = "sp-consensus-slots" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" dependencies = [ "parity-scale-codec", "sp-runtime", @@ -7824,7 +7832,7 @@ dependencies = [ [[package]] name = "sp-consensus-vrf" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" dependencies = [ "parity-scale-codec", "schnorrkel", @@ -7836,7 +7844,7 @@ dependencies = [ [[package]] name = "sp-core" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" dependencies = [ "base58", "blake2-rfc", @@ -7880,7 +7888,7 @@ dependencies = [ [[package]] name = "sp-database" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" dependencies = [ "kvdb", "parking_lot 0.10.2", @@ -7889,7 +7897,7 @@ dependencies = [ [[package]] name = "sp-debug-derive" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" dependencies = [ "proc-macro2 1.0.18", "quote 1.0.7", @@ -7899,7 +7907,7 @@ dependencies = [ [[package]] name = "sp-externalities" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" dependencies = [ "environmental", "parity-scale-codec", @@ -7910,7 +7918,7 @@ dependencies = [ [[package]] name = "sp-finality-grandpa" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" dependencies = [ "finality-grandpa", "log 0.4.11", @@ -7926,7 +7934,7 @@ dependencies = [ [[package]] name = "sp-finality-tracker" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" dependencies = [ "parity-scale-codec", "sp-inherents", @@ -7936,7 +7944,7 @@ dependencies = [ [[package]] name = "sp-inherents" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" dependencies = [ "derive_more 0.99.9", "parity-scale-codec", @@ -7948,7 +7956,7 @@ dependencies = [ [[package]] name = "sp-io" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" dependencies = [ "futures 0.3.5", "hash-db", @@ -7969,7 +7977,7 @@ dependencies = [ [[package]] name = "sp-keyring" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" dependencies = [ "lazy_static", "sp-core", @@ -7980,7 +7988,7 @@ dependencies = [ [[package]] name = "sp-npos-elections" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" dependencies = [ "parity-scale-codec", "serde", @@ -7992,7 +8000,7 @@ dependencies = [ [[package]] name = "sp-npos-elections-compact" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -8003,7 +8011,7 @@ dependencies = [ [[package]] name = "sp-offchain" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" dependencies = [ "sp-api", "sp-core", @@ -8013,7 +8021,7 @@ dependencies = [ [[package]] name = "sp-panic-handler" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" dependencies = [ "backtrace", "log 0.4.11", @@ -8022,7 +8030,7 @@ dependencies = [ [[package]] name = "sp-rpc" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" dependencies = [ "serde", "sp-core", @@ -8031,7 +8039,7 @@ dependencies = [ [[package]] name = "sp-runtime" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" dependencies = [ "either", "hash256-std-hasher", @@ -8053,7 +8061,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" dependencies = [ "parity-scale-codec", "primitive-types", @@ -8068,7 +8076,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" dependencies = [ "Inflector", "proc-macro-crate", @@ -8080,7 +8088,7 @@ dependencies = [ [[package]] name = "sp-serializer" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" dependencies = [ "serde", "serde_json", @@ -8089,7 +8097,7 @@ dependencies = [ [[package]] name = "sp-session" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" dependencies = [ "parity-scale-codec", "sp-api", @@ -8102,7 +8110,7 @@ dependencies = [ [[package]] name = "sp-staking" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" dependencies = [ "parity-scale-codec", "sp-runtime", @@ -8112,7 +8120,7 @@ dependencies = [ [[package]] name = "sp-state-machine" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" dependencies = [ "hash-db", "itertools 0.9.0", @@ -8133,12 +8141,12 @@ dependencies = [ [[package]] name = "sp-std" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" [[package]] name = "sp-storage" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" dependencies = [ "impl-serde 0.2.3", "ref-cast", @@ -8150,7 +8158,7 @@ dependencies = [ [[package]] name = "sp-timestamp" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -8164,7 +8172,7 @@ dependencies = [ [[package]] name = "sp-tracing" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" dependencies = [ "log 0.4.11", "rental", @@ -8174,7 +8182,7 @@ dependencies = [ [[package]] name = "sp-transaction-pool" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -8189,7 +8197,7 @@ dependencies = [ [[package]] name = "sp-trie" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" dependencies = [ "hash-db", "memory-db", @@ -8203,7 +8211,7 @@ dependencies = [ [[package]] name = "sp-utils" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" dependencies = [ "futures 0.3.5", "futures-core", @@ -8215,7 +8223,7 @@ dependencies = [ [[package]] name = "sp-version" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" dependencies = [ "impl-serde 0.2.3", "parity-scale-codec", @@ -8227,7 +8235,7 @@ dependencies = [ [[package]] name = "sp-wasm-interface" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -8358,7 +8366,7 @@ dependencies = [ [[package]] name = "substrate-browser-utils" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" dependencies = [ "chrono", "console_error_panic_hook", @@ -8384,7 +8392,7 @@ dependencies = [ [[package]] name = "substrate-build-script-utils" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" dependencies = [ "platforms", ] @@ -8392,7 +8400,7 @@ dependencies = [ [[package]] name = "substrate-frame-rpc-system" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" dependencies = [ "frame-system-rpc-runtime-api", "futures 0.3.5", @@ -8415,7 +8423,7 @@ dependencies = [ [[package]] name = "substrate-prometheus-endpoint" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" dependencies = [ "async-std", "derive_more 0.99.9", @@ -8429,7 +8437,7 @@ dependencies = [ [[package]] name = "substrate-test-client" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" dependencies = [ "futures 0.1.29", "futures 0.3.5", @@ -8455,7 +8463,7 @@ dependencies = [ [[package]] name = "substrate-test-runtime" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" dependencies = [ "cfg-if", "frame-executive", @@ -8495,7 +8503,7 @@ dependencies = [ [[package]] name = "substrate-test-runtime-client" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" dependencies = [ "futures 0.3.5", "parity-scale-codec", @@ -8516,7 +8524,7 @@ dependencies = [ [[package]] name = "substrate-test-utils" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" dependencies = [ "futures 0.3.5", "substrate-test-utils-derive", @@ -8526,7 +8534,7 @@ dependencies = [ [[package]] name = "substrate-test-utils-derive" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" dependencies = [ "proc-macro-crate", "quote 1.0.7", @@ -8536,7 +8544,7 @@ dependencies = [ [[package]] name = "substrate-wasm-builder-runner" version = "1.0.6" -source = "git+https://github.com/paritytech/substrate#473a23f462c60fb5a063ea8dff9261e27ac0ea48" +source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" [[package]] name = "substrate-wasm-builder-runner" diff --git a/node/test-service/src/lib.rs b/node/test-service/src/lib.rs index 6b9fbbf4ec..44b45d8192 100644 --- a/node/test-service/src/lib.rs +++ b/node/test-service/src/lib.rs @@ -72,7 +72,7 @@ pub fn polkadot_test_new_full( Arc>, FullNodeHandles, Arc>, - Arc, + RpcHandlers, ), ServiceError, > { @@ -237,7 +237,7 @@ pub struct PolkadotTestNode { /// The `MultiaddrWithPeerId` to this node. This is useful if you want to pass it as "boot node" to other nodes. pub addr: MultiaddrWithPeerId, /// RPCHandlers to make RPC queries. - pub rpc_handlers: Arc, + pub rpc_handlers: RpcHandlers, } impl PolkadotTestNode diff --git a/service/src/lib.rs b/service/src/lib.rs index 9c75c20ce6..86cba02ea9 100644 --- a/service/src/lib.rs +++ b/service/src/lib.rs @@ -257,7 +257,7 @@ pub fn new_full( Arc>, FullNodeHandles, Arc::Hash>>, - Arc, + RpcHandlers, ), Error> where RuntimeApi: ConstructRuntimeApi> + Send + Sync + 'static, @@ -560,7 +560,7 @@ pub fn new_full( } /// Builds a new service for a light client. -fn new_light(mut config: Configuration) -> Result<(TaskManager, Arc), Error> +fn new_light(mut config: Configuration) -> Result<(TaskManager, RpcHandlers), Error> where Runtime: 'static + Send + Sync + ConstructRuntimeApi>, >>::RuntimeApi: @@ -784,7 +784,7 @@ pub struct FullNodeHandles { } /// Build a new light node. -pub fn build_light(config: Configuration) -> Result<(TaskManager, Arc), ServiceError> { +pub fn build_light(config: Configuration) -> Result<(TaskManager, RpcHandlers), ServiceError> { if config.chain_spec.is_kusama() { new_light::(config) } else if config.chain_spec.is_westend() { -- GitLab From 474b72a585a321f6cc244c33880774bd411602e8 Mon Sep 17 00:00:00 2001 From: Andronik Ordian Date: Mon, 17 Aug 2020 14:26:32 +0200 Subject: [PATCH 179/192] Add spawn_blocking to SubsystemContext (#1570) * subsystem: add spawn_blocking to SubsystemContext * candidate-validation: use spawn_blocking for exhaustive tasks --- node/core/candidate-validation/src/lib.rs | 2 +- node/overseer/src/lib.rs | 28 ++++++++++++++++++++++- node/subsystem-test-helpers/src/lib.rs | 7 ++++++ node/subsystem/src/lib.rs | 7 ++++++ 4 files changed, 42 insertions(+), 2 deletions(-) diff --git a/node/core/candidate-validation/src/lib.rs b/node/core/candidate-validation/src/lib.rs index f12f6b1b9d..179f9be309 100644 --- a/node/core/candidate-validation/src/lib.rs +++ b/node/core/candidate-validation/src/lib.rs @@ -318,7 +318,7 @@ async fn spawn_validate_exhaustive( let _ = tx.send(res); }; - ctx.spawn("blocking-candidate-validation-task", fut.boxed()).await?; + ctx.spawn_blocking("blocking-candidate-validation-task", fut.boxed()).await?; rx.await.map_err(Into::into) } diff --git a/node/overseer/src/lib.rs b/node/overseer/src/lib.rs index 185a0f5614..4db8209b8b 100644 --- a/node/overseer/src/lib.rs +++ b/node/overseer/src/lib.rs @@ -112,6 +112,13 @@ enum ToOverseer { name: &'static str, s: BoxFuture<'static, ()>, }, + + /// Same as `SpawnJob` but for blocking tasks to be executed on a + /// dedicated thread pool. + SpawnBlockingJob { + name: &'static str, + s: BoxFuture<'static, ()>, + }, } /// An event telling the `Overseer` on the particular block @@ -238,7 +245,8 @@ impl Debug for ToOverseer { ToOverseer::SubsystemMessage(msg) => { write!(f, "OverseerMessage::SubsystemMessage({:?})", msg) } - ToOverseer::SpawnJob { .. } => write!(f, "OverseerMessage::Spawn(..)") + ToOverseer::SpawnJob { .. } => write!(f, "OverseerMessage::Spawn(..)"), + ToOverseer::SpawnBlockingJob { .. } => write!(f, "OverseerMessage::SpawnBlocking(..)") } } } @@ -290,6 +298,17 @@ impl SubsystemContext for OverseerSubsystemContext { Ok(()) } + async fn spawn_blocking(&mut self, name: &'static str, s: Pin + Send>>) + -> SubsystemResult<()> + { + self.tx.send(ToOverseer::SpawnBlockingJob { + name, + s, + }).await?; + + Ok(()) + } + async fn send_message(&mut self, msg: AllMessages) -> SubsystemResult<()> { self.tx.send(ToOverseer::SubsystemMessage(msg)).await?; @@ -803,6 +822,9 @@ where ToOverseer::SpawnJob { name, s } => { self.spawn_job(name, s); } + ToOverseer::SpawnBlockingJob { name, s } => { + self.spawn_blocking_job(name, s); + } } } @@ -992,6 +1014,10 @@ where fn spawn_job(&mut self, name: &'static str, j: BoxFuture<'static, ()>) { self.s.spawn(name, j); } + + fn spawn_blocking_job(&mut self, name: &'static str, j: BoxFuture<'static, ()>) { + self.s.spawn_blocking(name, j); + } } fn spawn( diff --git a/node/subsystem-test-helpers/src/lib.rs b/node/subsystem-test-helpers/src/lib.rs index 4d9b70d4f8..26c55354fb 100644 --- a/node/subsystem-test-helpers/src/lib.rs +++ b/node/subsystem-test-helpers/src/lib.rs @@ -177,6 +177,13 @@ impl SubsystemContext for Tes Ok(()) } + async fn spawn_blocking(&mut self, name: &'static str, s: Pin + Send>>) + -> SubsystemResult<()> + { + self.spawn.spawn_blocking(name, s); + Ok(()) + } + async fn send_message(&mut self, msg: AllMessages) -> SubsystemResult<()> { self.tx.send(msg).await.expect("test overseer no longer live"); Ok(()) diff --git a/node/subsystem/src/lib.rs b/node/subsystem/src/lib.rs index 91d485739b..97d09f88cd 100644 --- a/node/subsystem/src/lib.rs +++ b/node/subsystem/src/lib.rs @@ -178,6 +178,13 @@ pub trait SubsystemContext: Send + 'static { /// Spawn a child task on the executor. async fn spawn(&mut self, name: &'static str, s: Pin + Send>>) -> SubsystemResult<()>; + /// Spawn a blocking child task on the executor's dedicated thread pool. + async fn spawn_blocking( + &mut self, + name: &'static str, + s: Pin + Send>>, + ) -> SubsystemResult<()>; + /// Send a direct message to some other `Subsystem`, routed based on message type. async fn send_message(&mut self, msg: AllMessages) -> SubsystemResult<()>; -- GitLab From e750a82526fdb219866faa56579bef6050e75f2c Mon Sep 17 00:00:00 2001 From: Peter Goodspeed-Niklaus Date: Mon, 17 Aug 2020 14:27:37 +0200 Subject: [PATCH 180/192] implement collation generation subsystem (#1557) * start sketching out a collation generation subsystem * invent a basic strategy for double initialization * clean up warnings * impl util requests from runtime assuming a context instead of a FromJob sender * implement collation generation algorithm from guide * update AllMessages in tests * fix trivial review comments * remove another redundant declaration from merge * filter availability cores by para_id * handle new activations each in their own async task * update guide according to the actual current implementation * add initialization to guide * add general-purpose subsystem_test_harness helper * write first handle_new_activations test * add test that handle_new_activations filters local_validation_data requests * add (failing) test of collation distribution message sending * rustfmt * broken: work on fixing sender test Unfortunately, for reasons that are not yet clear, despite the public key and checked data being identical, the signer is not producing an identical signature. This commit produces this output (among more): signing with Public(c4733ab0bbe3ba4c096685d1737a7f498cdbdd167a767d04a21dc7df12b8c858 (5GWHUNm5...)) checking with Public(c4733ab0bbe3ba4c096685d1737a7f498cdbdd167a767d04a21dc7df12b8c858 (5GWHUNm5...)) signed payload: [4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 10, 0, 0, 0, c7, e5, c0, 64, 7a, db, fe, 44, 81, e5, 51, 11, 79, 9f, a5, 63, 93, 94, 3c, c4, 36, c6, 30, 36, c2, c5, 44, a2, 1b, db, b7, 82, 3, 17, a, 2e, 75, 97, b7, b7, e3, d8, 4c, 5, 39, 1d, 13, 9a, 62, b1, 57, e7, 87, 86, d8, c0, 82, f2, 9d, cf, 4c, 11, 13, 14] checked payload: [4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 10, 0, 0, 0, c7, e5, c0, 64, 7a, db, fe, 44, 81, e5, 51, 11, 79, 9f, a5, 63, 93, 94, 3c, c4, 36, c6, 30, 36, c2, c5, 44, a2, 1b, db, b7, 82, 3, 17, a, 2e, 75, 97, b7, b7, e3, d8, 4c, 5, 39, 1d, 13, 9a, 62, b1, 57, e7, 87, 86, d8, c0, 82, f2, 9d, cf, 4c, 11, 13, 14] * fix broken test * collation function returns commitments hash It doesn't look like we use the actual commitments data anywhere, and it's not obvious if there are any fields of `CandidateCommitments` not available to the collator, so this commit just assigns them the entire responsibility of generating the hash. * add missing overseer impls * calculating erasure coding is polkadot's responsibility, not cumulus * concurrentize per-relay_parent requests --- Cargo.lock | 17 + Cargo.toml | 1 + node/collation-generation/Cargo.toml | 19 + node/collation-generation/src/lib.rs | 652 ++++++++++++++++++ node/overseer/examples/minimal-example.rs | 3 +- node/overseer/src/lib.rs | 111 +-- node/primitives/Cargo.toml | 1 + node/primitives/src/lib.rs | 39 +- node/service/src/lib.rs | 3 +- node/subsystem-test-helpers/src/lib.rs | 129 ++-- node/subsystem-util/src/lib.rs | 83 +++ node/subsystem/src/messages.rs | 38 +- .../node/collators/collation-generation.md | 41 +- 13 files changed, 1030 insertions(+), 107 deletions(-) create mode 100644 node/collation-generation/Cargo.toml create mode 100644 node/collation-generation/src/lib.rs diff --git a/Cargo.lock b/Cargo.lock index 105b143acf..e0ddadbe1e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4653,6 +4653,22 @@ dependencies = [ "sp-runtime", ] +[[package]] +name = "polkadot-node-collation-generation" +version = "0.1.0" +dependencies = [ + "derive_more 0.99.9", + "futures 0.3.5", + "log 0.4.11", + "polkadot-erasure-coding", + "polkadot-node-primitives", + "polkadot-node-subsystem", + "polkadot-node-subsystem-test-helpers", + "polkadot-node-subsystem-util", + "polkadot-primitives", + "sp-core", +] + [[package]] name = "polkadot-node-core-av-store" version = "0.1.0" @@ -4816,6 +4832,7 @@ dependencies = [ name = "polkadot-node-primitives" version = "0.1.0" dependencies = [ + "futures 0.3.5", "parity-scale-codec", "polkadot-primitives", "polkadot-statement-table", diff --git a/Cargo.toml b/Cargo.toml index c36511f813..1c98ca8d0b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -44,6 +44,7 @@ members = [ "service", "validation", + "node/collation-generation", "node/core/av-store", "node/core/backing", "node/core/bitfield-signing", diff --git a/node/collation-generation/Cargo.toml b/node/collation-generation/Cargo.toml new file mode 100644 index 0000000000..f7d5e7f162 --- /dev/null +++ b/node/collation-generation/Cargo.toml @@ -0,0 +1,19 @@ +[package] +name = "polkadot-node-collation-generation" +version = "0.1.0" +authors = ["Parity Technologies "] +edition = "2018" + +[dependencies] +derive_more = "0.99.9" +futures = "0.3.5" +log = "0.4.8" +polkadot-erasure-coding = { path = "../../erasure-coding" } +polkadot-node-primitives = { path = "../primitives" } +polkadot-node-subsystem = { path = "../subsystem" } +polkadot-node-subsystem-util = { path = "../subsystem-util" } +polkadot-primitives = { path = "../../primitives" } +sp-core = { git = "https://github.com/paritytech/substrate", branch = "master" } + +[dev-dependencies] +polkadot-node-subsystem-test-helpers = { path = "../subsystem-test-helpers" } diff --git a/node/collation-generation/src/lib.rs b/node/collation-generation/src/lib.rs new file mode 100644 index 0000000000..3ad76ff7f7 --- /dev/null +++ b/node/collation-generation/src/lib.rs @@ -0,0 +1,652 @@ +// Copyright 2020 Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Polkadot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . + +//! The collation generation subsystem is the interface between polkadot and the collators. + +#![deny(missing_docs)] + +use futures::{ + channel::{mpsc, oneshot}, + future::FutureExt, + join, + select, + sink::SinkExt, + stream::StreamExt, +}; +use polkadot_node_primitives::CollationGenerationConfig; +use polkadot_node_subsystem::{ + errors::RuntimeApiError, + messages::{AllMessages, CollationGenerationMessage, CollatorProtocolMessage}, + FromOverseer, SpawnedSubsystem, Subsystem, SubsystemContext, SubsystemError, SubsystemResult, +}; +use polkadot_node_subsystem_util::{ + self as util, request_availability_cores_ctx, request_global_validation_data_ctx, + request_local_validation_data_ctx, request_validators_ctx, +}; +use polkadot_primitives::v1::{ + collator_signature_payload, validation_data_hash, AvailableData, CandidateCommitments, + CandidateDescriptor, CandidateReceipt, CoreState, GlobalValidationData, Hash, + LocalValidationData, OccupiedCoreAssumption, PoV, +}; +use sp_core::crypto::Pair; +use std::sync::Arc; + +/// Collation Generation Subsystem +pub struct CollationGenerationSubsystem { + config: Option>, +} + +impl CollationGenerationSubsystem { + /// Run this subsystem + /// + /// Conceptually, this is very simple: it just loops forever. + /// + /// - On incoming overseer messages, it starts or stops jobs as appropriate. + /// - On other incoming messages, if they can be converted into Job::ToJob and + /// include a hash, then they're forwarded to the appropriate individual job. + /// - On outgoing messages from the jobs, it forwards them to the overseer. + /// + /// If `err_tx` is not `None`, errors are forwarded onto that channel as they occur. + /// Otherwise, most are logged and then discarded. + async fn run(mut self, mut ctx: Context) + where + Context: SubsystemContext, + { + // when we activate new leaves, we spawn a bunch of sub-tasks, each of which is + // expected to generate precisely one message. We don't want to block the main loop + // at any point waiting for them all, so instead, we create a channel on which they can + // send those messages. We can then just monitor the channel and forward messages on it + // to the overseer here, via the context. + let (sender, mut receiver) = mpsc::channel(0); + + loop { + select! { + incoming = ctx.recv().fuse() => { + if self.handle_incoming::(incoming, &mut ctx, &sender).await { + break; + } + }, + msg = receiver.next().fuse() => { + if let Some(msg) = msg { + if let Err(err) = ctx.send_message(msg).await { + log::warn!(target: "collation_generation", "failed to forward message to overseer: {:?}", err); + break; + } + } + }, + } + } + } + + // handle an incoming message. return true if we should break afterwards. + // note: this doesn't strictly need to be a separate function; it's more an administrative function + // so that we don't clutter the run loop. It could in principle be inlined directly into there. + // it should hopefully therefore be ok that it's an async function mutably borrowing self. + async fn handle_incoming( + &mut self, + incoming: SubsystemResult>, + ctx: &mut Context, + sender: &mpsc::Sender, + ) -> bool + where + Context: SubsystemContext, + { + use polkadot_node_subsystem::ActiveLeavesUpdate; + use polkadot_node_subsystem::FromOverseer::{Communication, Signal}; + use polkadot_node_subsystem::OverseerSignal::{ActiveLeaves, BlockFinalized, Conclude}; + + match incoming { + Ok(Signal(ActiveLeaves(ActiveLeavesUpdate { activated, .. }))) => { + // follow the procedure from the guide + if let Some(config) = &self.config { + if let Err(err) = + handle_new_activations(config.clone(), &activated, ctx, sender).await + { + log::warn!(target: "collation_generation", "failed to handle new activations: {:?}", err); + return true; + }; + } + false + } + Ok(Signal(Conclude)) => true, + Ok(Communication { + msg: CollationGenerationMessage::Initialize(config), + }) => { + if self.config.is_some() { + log::warn!(target: "collation_generation", "double initialization"); + true + } else { + self.config = Some(Arc::new(config)); + false + } + } + Ok(Signal(BlockFinalized(_))) => false, + Err(err) => { + log::error!(target: "collation_generation", "error receiving message from subsystem context: {:?}", err); + true + } + } + } +} + +impl Subsystem for CollationGenerationSubsystem +where + Context: SubsystemContext, +{ + fn start(self, ctx: Context) -> SpawnedSubsystem { + let subsystem = CollationGenerationSubsystem { config: None }; + + let future = Box::pin(subsystem.run(ctx)); + + SpawnedSubsystem { + name: "CollationGenerationSubsystem", + future, + } + } +} + +#[derive(Debug, derive_more::From)] +enum Error { + #[from] + Subsystem(SubsystemError), + #[from] + OneshotRecv(oneshot::Canceled), + #[from] + Runtime(RuntimeApiError), + #[from] + Util(util::Error), + #[from] + Erasure(polkadot_erasure_coding::Error), +} + +type Result = std::result::Result; + +async fn handle_new_activations( + config: Arc, + activated: &[Hash], + ctx: &mut Context, + sender: &mpsc::Sender, +) -> Result<()> { + // follow the procedure from the guide: + // https://w3f.github.io/parachain-implementers-guide/node/collators/collation-generation.html + + for relay_parent in activated.iter().copied() { + // double-future magic happens here: the first layer of requests takes a mutable borrow of the context, and + // returns a receiver. The second layer of requests actually polls those receivers to completion. + let (global_validation_data, availability_cores, validators) = join!( + request_global_validation_data_ctx(relay_parent, ctx).await?, + request_availability_cores_ctx(relay_parent, ctx).await?, + request_validators_ctx(relay_parent, ctx).await?, + ); + + let global_validation_data = global_validation_data??; + let availability_cores = availability_cores??; + let n_validators = validators??.len(); + + for core in availability_cores { + let (scheduled_core, assumption) = match core { + CoreState::Scheduled(scheduled_core) => { + (scheduled_core, OccupiedCoreAssumption::Free) + } + CoreState::Occupied(_occupied_core) => { + // TODO: https://github.com/paritytech/polkadot/issues/1573 + continue; + } + _ => continue, + }; + + if scheduled_core.para_id != config.para_id { + continue; + } + + // we get local validation data synchronously for each core instead of within the subtask loop, + // because we have only a single mutable handle to the context, so the work can't really be distributed + let local_validation_data = match request_local_validation_data_ctx( + relay_parent, + scheduled_core.para_id, + assumption, + ctx, + ) + .await? + .await?? + { + Some(local_validation_data) => local_validation_data, + None => continue, + }; + + let task_global_validation_data = global_validation_data.clone(); + let task_config = config.clone(); + let mut task_sender = sender.clone(); + ctx.spawn("collation generation collation builder", Box::pin(async move { + let validation_data_hash = + validation_data_hash(&task_global_validation_data, &local_validation_data); + + let collation = (task_config.collator)(&task_global_validation_data, &local_validation_data).await; + + let pov_hash = collation.proof_of_validity.hash(); + + let signature_payload = collator_signature_payload( + &relay_parent, + &scheduled_core.para_id, + &validation_data_hash, + &pov_hash, + ); + + let erasure_root = match erasure_root(n_validators, local_validation_data, task_global_validation_data, collation.proof_of_validity.clone()) { + Ok(erasure_root) => erasure_root, + Err(err) => { + log::error!(target: "collation_generation", "failed to calculate erasure root for para_id {}: {:?}", scheduled_core.para_id, err); + return + } + }; + + let commitments = CandidateCommitments { + fees: collation.fees, + upward_messages: collation.upward_messages, + new_validation_code: collation.new_validation_code, + head_data: collation.head_data, + erasure_root, + }; + + let ccr = CandidateReceipt { + commitments_hash: commitments.hash(), + descriptor: CandidateDescriptor { + signature: task_config.key.sign(&signature_payload), + para_id: scheduled_core.para_id, + relay_parent, + collator: task_config.key.public(), + validation_data_hash, + pov_hash, + }, + }; + + if let Err(err) = task_sender.send(AllMessages::CollatorProtocol( + CollatorProtocolMessage::DistributeCollation(ccr, collation.proof_of_validity) + )).await { + log::warn!(target: "collation_generation", "failed to send collation result for para_id {}: {:?}", scheduled_core.para_id, err); + } + })).await?; + } + } + + Ok(()) +} + +fn erasure_root( + n_validators: usize, + local_validation_data: LocalValidationData, + global_validation_data: GlobalValidationData, + pov: PoV, +) -> Result { + let omitted_validation = polkadot_primitives::v1::OmittedValidationData { + global_validation: global_validation_data, + local_validation: local_validation_data, + }; + + let available_data = AvailableData { + omitted_validation, + pov, + }; + + let chunks = polkadot_erasure_coding::obtain_chunks_v1(n_validators, &available_data)?; + Ok(polkadot_erasure_coding::branches(&chunks).root()) +} + +#[cfg(test)] +mod tests { + mod handle_new_activations { + use super::super::*; + use futures::{ + lock::Mutex, + task::{Context as FuturesContext, Poll}, + Future, + }; + use polkadot_node_primitives::Collation; + use polkadot_node_subsystem::messages::{ + AllMessages, RuntimeApiMessage, RuntimeApiRequest, + }; + use polkadot_node_subsystem_test_helpers::{ + subsystem_test_harness, TestSubsystemContextHandle, + }; + use polkadot_primitives::v1::{ + BlockData, BlockNumber, CollatorPair, GlobalValidationData, Id as ParaId, + LocalValidationData, PoV, ScheduledCore, + }; + use std::pin::Pin; + + fn test_collation() -> Collation { + Collation { + fees: Default::default(), + upward_messages: Default::default(), + new_validation_code: Default::default(), + head_data: Default::default(), + proof_of_validity: PoV { + block_data: BlockData(Vec::new()), + }, + } + } + + // Box + Unpin + Send + struct TestCollator; + + impl Future for TestCollator { + type Output = Collation; + + fn poll(self: Pin<&mut Self>, _cx: &mut FuturesContext) -> Poll { + Poll::Ready(test_collation()) + } + } + + impl Unpin for TestCollator {} + + fn test_config>(para_id: Id) -> Arc { + Arc::new(CollationGenerationConfig { + key: CollatorPair::generate().0, + collator: Box::new(|_gvd: &GlobalValidationData, _lvd: &LocalValidationData| { + Box::new(TestCollator) + }), + para_id: para_id.into(), + }) + } + + fn scheduled_core_for>(para_id: Id) -> ScheduledCore { + ScheduledCore { + para_id: para_id.into(), + collator: None, + } + } + + #[test] + fn requests_validation_and_availability_per_relay_parent() { + let activated_hashes: Vec = vec![ + [1; 32].into(), + [4; 32].into(), + [9; 32].into(), + [16; 32].into(), + ]; + + let requested_validation_data = Arc::new(Mutex::new(Vec::new())); + let requested_availability_cores = Arc::new(Mutex::new(Vec::new())); + + let overseer_requested_validation_data = requested_validation_data.clone(); + let overseer_requested_availability_cores = requested_availability_cores.clone(); + let overseer = |mut handle: TestSubsystemContextHandle| async move { + loop { + match handle.try_recv().await { + None => break, + Some(AllMessages::RuntimeApi(RuntimeApiMessage::Request(hash, RuntimeApiRequest::GlobalValidationData(tx)))) => { + overseer_requested_validation_data.lock().await.push(hash); + tx.send(Ok(Default::default())).unwrap(); + } + Some(AllMessages::RuntimeApi(RuntimeApiMessage::Request(hash, RuntimeApiRequest::AvailabilityCores(tx)))) => { + overseer_requested_availability_cores.lock().await.push(hash); + tx.send(Ok(vec![])).unwrap(); + } + Some(AllMessages::RuntimeApi(RuntimeApiMessage::Request(_hash, RuntimeApiRequest::Validators(tx)))) => { + tx.send(Ok(vec![Default::default(); 3])).unwrap(); + } + Some(msg) => panic!("didn't expect any other overseer requests given no availability cores; got {:?}", msg), + } + } + }; + + let (tx, _rx) = mpsc::channel(0); + + let subsystem_activated_hashes = activated_hashes.clone(); + subsystem_test_harness(overseer, |mut ctx| async move { + handle_new_activations( + test_config(123), + &subsystem_activated_hashes, + &mut ctx, + &tx, + ) + .await + .unwrap(); + }); + + let mut requested_validation_data = Arc::try_unwrap(requested_validation_data) + .expect("overseer should have shut down by now") + .into_inner(); + requested_validation_data.sort(); + let mut requested_availability_cores = Arc::try_unwrap(requested_availability_cores) + .expect("overseer should have shut down by now") + .into_inner(); + requested_availability_cores.sort(); + + assert_eq!(requested_validation_data, activated_hashes); + assert_eq!(requested_availability_cores, activated_hashes); + } + + #[test] + fn requests_local_validation_for_scheduled_matches() { + let activated_hashes: Vec = vec![ + Hash::repeat_byte(1), + Hash::repeat_byte(4), + Hash::repeat_byte(9), + Hash::repeat_byte(16), + ]; + + let requested_local_validation_data = Arc::new(Mutex::new(Vec::new())); + + let overseer_requested_local_validation_data = requested_local_validation_data.clone(); + let overseer = |mut handle: TestSubsystemContextHandle| async move { + loop { + match handle.try_recv().await { + None => break, + Some(AllMessages::RuntimeApi(RuntimeApiMessage::Request( + _hash, + RuntimeApiRequest::GlobalValidationData(tx), + ))) => { + tx.send(Ok(Default::default())).unwrap(); + } + Some(AllMessages::RuntimeApi(RuntimeApiMessage::Request( + hash, + RuntimeApiRequest::AvailabilityCores(tx), + ))) => { + tx.send(Ok(vec![ + CoreState::Free, + // this is weird, see explanation below + CoreState::Scheduled(scheduled_core_for( + (hash.as_fixed_bytes()[0] * 4) as u32, + )), + CoreState::Scheduled(scheduled_core_for( + (hash.as_fixed_bytes()[0] * 5) as u32, + )), + ])) + .unwrap(); + } + Some(AllMessages::RuntimeApi(RuntimeApiMessage::Request( + hash, + RuntimeApiRequest::LocalValidationData( + _para_id, + _occupied_core_assumption, + tx, + ), + ))) => { + overseer_requested_local_validation_data + .lock() + .await + .push(hash); + tx.send(Ok(Default::default())).unwrap(); + } + Some(AllMessages::RuntimeApi(RuntimeApiMessage::Request( + _hash, + RuntimeApiRequest::Validators(tx), + ))) => { + tx.send(Ok(vec![Default::default(); 3])).unwrap(); + } + Some(msg) => { + panic!("didn't expect any other overseer requests; got {:?}", msg) + } + } + } + }; + + let (tx, _rx) = mpsc::channel(0); + + subsystem_test_harness(overseer, |mut ctx| async move { + handle_new_activations(test_config(16), &activated_hashes, &mut ctx, &tx) + .await + .unwrap(); + }); + + let requested_local_validation_data = Arc::try_unwrap(requested_local_validation_data) + .expect("overseer should have shut down by now") + .into_inner(); + + // the only activated hash should be from the 4 hash: + // each activated hash generates two scheduled cores: one with its value * 4, one with its value * 5 + // given that the test configuration has a para_id of 16, there's only one way to get that value: with the 4 + // hash. + assert_eq!(requested_local_validation_data, vec![[4; 32].into()]); + } + + #[test] + fn sends_distribute_collation_message() { + let activated_hashes: Vec = vec![ + Hash::repeat_byte(1), + Hash::repeat_byte(4), + Hash::repeat_byte(9), + Hash::repeat_byte(16), + ]; + + let overseer = |mut handle: TestSubsystemContextHandle| async move { + loop { + match handle.try_recv().await { + None => break, + Some(AllMessages::RuntimeApi(RuntimeApiMessage::Request( + _hash, + RuntimeApiRequest::GlobalValidationData(tx), + ))) => { + tx.send(Ok(Default::default())).unwrap(); + } + Some(AllMessages::RuntimeApi(RuntimeApiMessage::Request( + hash, + RuntimeApiRequest::AvailabilityCores(tx), + ))) => { + tx.send(Ok(vec![ + CoreState::Free, + // this is weird, see explanation below + CoreState::Scheduled(scheduled_core_for( + (hash.as_fixed_bytes()[0] * 4) as u32, + )), + CoreState::Scheduled(scheduled_core_for( + (hash.as_fixed_bytes()[0] * 5) as u32, + )), + ])) + .unwrap(); + } + Some(AllMessages::RuntimeApi(RuntimeApiMessage::Request( + _hash, + RuntimeApiRequest::LocalValidationData( + _para_id, + _occupied_core_assumption, + tx, + ), + ))) => { + tx.send(Ok(Some(Default::default()))).unwrap(); + } + Some(AllMessages::RuntimeApi(RuntimeApiMessage::Request( + _hash, + RuntimeApiRequest::Validators(tx), + ))) => { + tx.send(Ok(vec![Default::default(); 3])).unwrap(); + } + Some(msg) => { + panic!("didn't expect any other overseer requests; got {:?}", msg) + } + } + } + }; + + let config = test_config(16); + let subsystem_config = config.clone(); + + let (tx, rx) = mpsc::channel(0); + + // empty vec doesn't allocate on the heap, so it's ok we throw it away + let sent_messages = Arc::new(Mutex::new(Vec::new())); + let subsystem_sent_messages = sent_messages.clone(); + subsystem_test_harness(overseer, |mut ctx| async move { + handle_new_activations(subsystem_config, &activated_hashes, &mut ctx, &tx) + .await + .unwrap(); + + std::mem::drop(tx); + + // collect all sent messages + *subsystem_sent_messages.lock().await = rx.collect().await; + }); + + let sent_messages = Arc::try_unwrap(sent_messages) + .expect("subsystem should have shut down by now") + .into_inner(); + + // we expect a single message to be sent, containing a candidate receipt. + // we don't care too much about the commitments_hash right now, but let's ensure that we've calculated the + // correct descriptor + let expect_pov_hash = test_collation().proof_of_validity.hash(); + let expect_validation_data_hash = + validation_data_hash::(&Default::default(), &Default::default()); + let expect_relay_parent = Hash::repeat_byte(4); + let expect_payload = collator_signature_payload( + &expect_relay_parent, + &config.para_id, + &expect_validation_data_hash, + &expect_pov_hash, + ); + let expect_descriptor = CandidateDescriptor { + signature: config.key.sign(&expect_payload), + para_id: config.para_id, + relay_parent: expect_relay_parent, + collator: config.key.public(), + validation_data_hash: expect_validation_data_hash, + pov_hash: expect_pov_hash, + }; + + assert_eq!(sent_messages.len(), 1); + match &sent_messages[0] { + AllMessages::CollatorProtocol(CollatorProtocolMessage::DistributeCollation( + CandidateReceipt { descriptor, .. }, + _pov, + )) => { + // signature generation is non-deterministic, so we can't just assert that the + // expected descriptor is correct. What we can do is validate that the produced + // descriptor has a valid signature, then just copy in the generated signature + // and check the rest of the fields for equality. + assert!(CollatorPair::verify( + &descriptor.signature, + &collator_signature_payload( + &descriptor.relay_parent, + &descriptor.para_id, + &descriptor.validation_data_hash, + &descriptor.pov_hash, + ) + .as_ref(), + &descriptor.collator, + )); + let expect_descriptor = { + let mut expect_descriptor = expect_descriptor; + expect_descriptor.signature = descriptor.signature.clone(); + expect_descriptor + }; + assert_eq!(descriptor, &expect_descriptor); + } + _ => panic!("received wrong message type"), + } + } + } +} diff --git a/node/overseer/examples/minimal-example.rs b/node/overseer/examples/minimal-example.rs index 3b12da323b..3ebcb34825 100644 --- a/node/overseer/examples/minimal-example.rs +++ b/node/overseer/examples/minimal-example.rs @@ -145,7 +145,6 @@ fn main() { candidate_validation: Subsystem2, candidate_backing: Subsystem1, candidate_selection: DummySubsystem, - collator_protocol: DummySubsystem, statement_distribution: DummySubsystem, availability_distribution: DummySubsystem, bitfield_signing: DummySubsystem, @@ -156,6 +155,8 @@ fn main() { availability_store: DummySubsystem, network_bridge: DummySubsystem, chain_api: DummySubsystem, + collation_generation: DummySubsystem, + collator_protocol: DummySubsystem, }; let (overseer, _handler) = Overseer::new( vec![], diff --git a/node/overseer/src/lib.rs b/node/overseer/src/lib.rs index 4db8209b8b..f37a398df4 100644 --- a/node/overseer/src/lib.rs +++ b/node/overseer/src/lib.rs @@ -78,8 +78,8 @@ use polkadot_subsystem::messages::{ CandidateValidationMessage, CandidateBackingMessage, CandidateSelectionMessage, ChainApiMessage, StatementDistributionMessage, AvailabilityDistributionMessage, BitfieldSigningMessage, BitfieldDistributionMessage, - ProvisionerMessage, PoVDistributionMessage, RuntimeApiMessage, CollatorProtocolMessage, - AvailabilityStoreMessage, NetworkBridgeMessage, AllMessages, + ProvisionerMessage, PoVDistributionMessage, RuntimeApiMessage, + AvailabilityStoreMessage, NetworkBridgeMessage, AllMessages, CollationGenerationMessage, CollatorProtocolMessage, }; pub use polkadot_subsystem::{ Subsystem, SubsystemContext, OverseerSignal, FromOverseer, SubsystemError, SubsystemResult, @@ -352,9 +352,6 @@ pub struct Overseer { /// A candidate selection subsystem. candidate_selection_subsystem: OverseenSubsystem, - /// A collator protocol subsystem - collator_protocol_subsystem: OverseenSubsystem, - /// A statement distribution subsystem. statement_distribution_subsystem: OverseenSubsystem, @@ -382,9 +379,15 @@ pub struct Overseer { /// A network bridge subsystem. network_bridge_subsystem: OverseenSubsystem, - /// A Chain API subsystem + /// A Chain API subsystem. chain_api_subsystem: OverseenSubsystem, + /// A Collation Generation subsystem. + collation_generation_subsystem: OverseenSubsystem, + + /// A Collator Protocol subsystem. + collator_protocol_subsystem: OverseenSubsystem, + /// Spawner to spawn tasks to. s: S, @@ -417,15 +420,13 @@ pub struct Overseer { /// /// [`Subsystem`]: trait.Subsystem.html /// [`DummySubsystem`]: struct.DummySubsystem.html -pub struct AllSubsystems { +pub struct AllSubsystems { /// A candidate validation subsystem. pub candidate_validation: CV, /// A candidate backing subsystem. pub candidate_backing: CB, /// A candidate selection subsystem. pub candidate_selection: CS, - /// A collator protocol subsystem. - pub collator_protocol: CP, /// A statement distribution subsystem. pub statement_distribution: SD, /// An availability distribution subsystem. @@ -446,6 +447,10 @@ pub struct AllSubsystems Overseer @@ -518,7 +523,6 @@ where /// candidate_validation: ValidationSubsystem, /// candidate_backing: DummySubsystem, /// candidate_selection: DummySubsystem, - /// collator_protocol: DummySubsystem, /// statement_distribution: DummySubsystem, /// availability_distribution: DummySubsystem, /// bitfield_signing: DummySubsystem, @@ -529,6 +533,8 @@ where /// availability_store: DummySubsystem, /// network_bridge: DummySubsystem, /// chain_api: DummySubsystem, + /// collation_generation: DummySubsystem, + /// collator_protocol: DummySubsystem, /// }; /// let (overseer, _handler) = Overseer::new( /// vec![], @@ -549,16 +555,15 @@ where /// # /// # }); } /// ``` - pub fn new( + pub fn new( leaves: impl IntoIterator, - all_subsystems: AllSubsystems, + all_subsystems: AllSubsystems, mut s: S, ) -> SubsystemResult<(Self, OverseerHandler)> where CV: Subsystem> + Send, CB: Subsystem> + Send, CS: Subsystem> + Send, - CP: Subsystem> + Send, SD: Subsystem> + Send, AD: Subsystem> + Send, BS: Subsystem> + Send, @@ -569,6 +574,8 @@ where AS: Subsystem> + Send, NB: Subsystem> + Send, CA: Subsystem> + Send, + CG: Subsystem> + Send, + CP: Subsystem> + Send, { let (events_tx, events_rx) = mpsc::channel(CHANNEL_CAPACITY); @@ -600,13 +607,6 @@ where all_subsystems.candidate_selection, )?; - let collator_protocol_subsystem = spawn( - &mut s, - &mut running_subsystems, - &mut running_subsystems_rx, - all_subsystems.collator_protocol, - )?; - let statement_distribution_subsystem = spawn( &mut s, &mut running_subsystems, @@ -677,6 +677,21 @@ where all_subsystems.chain_api, )?; + let collation_generation_subsystem = spawn( + &mut s, + &mut running_subsystems, + &mut running_subsystems_rx, + all_subsystems.collation_generation, + )?; + + + let collator_protocol_subsystem = spawn( + &mut s, + &mut running_subsystems, + &mut running_subsystems_rx, + all_subsystems.collator_protocol, + )?; + let active_leaves = HashSet::new(); let leaves = leaves @@ -688,7 +703,6 @@ where candidate_validation_subsystem, candidate_backing_subsystem, candidate_selection_subsystem, - collator_protocol_subsystem, statement_distribution_subsystem, availability_distribution_subsystem, bitfield_signing_subsystem, @@ -699,6 +713,8 @@ where availability_store_subsystem, network_bridge_subsystem, chain_api_subsystem, + collation_generation_subsystem, + collator_protocol_subsystem, s, running_subsystems, running_subsystems_rx, @@ -724,10 +740,6 @@ where let _ = s.tx.send(FromOverseer::Signal(OverseerSignal::Conclude)).await; } - if let Some(ref mut s) = self.collator_protocol_subsystem.instance { - let _ = s.tx.send(FromOverseer::Signal(OverseerSignal::Conclude)).await; - } - if let Some(ref mut s) = self.statement_distribution_subsystem.instance { let _ = s.tx.send(FromOverseer::Signal(OverseerSignal::Conclude)).await; } @@ -768,6 +780,14 @@ where let _ = s.tx.send(FromOverseer::Signal(OverseerSignal::Conclude)).await; } + if let Some(ref mut s) = self.collator_protocol_subsystem.instance { + let _ = s.tx.send(FromOverseer::Signal(OverseerSignal::Conclude)).await; + } + + if let Some(ref mut s) = self.collation_generation_subsystem.instance { + let _ = s.tx.send(FromOverseer::Signal(OverseerSignal::Conclude)).await; + } + let mut stop_delay = Delay::new(Duration::from_secs(STOP_DELAY)).fuse(); loop { @@ -889,10 +909,6 @@ where s.tx.send(FromOverseer::Signal(signal.clone())).await?; } - if let Some(ref mut s) = self.collator_protocol_subsystem.instance { - s.tx.send(FromOverseer::Signal(signal.clone())).await?; - } - if let Some(ref mut s) = self.statement_distribution_subsystem.instance { s.tx.send(FromOverseer::Signal(signal.clone())).await?; } @@ -930,7 +946,15 @@ where } if let Some(ref mut s) = self.chain_api_subsystem.instance { - s.tx.send(FromOverseer::Signal(signal)).await?; + s.tx.send(FromOverseer::Signal(signal.clone())).await?; + } + + if let Some(ref mut s) = self.collator_protocol_subsystem.instance { + s.tx.send(FromOverseer::Signal(signal.clone())).await?; + } + + if let Some(ref mut s) = self.collation_generation_subsystem.instance { + s.tx.send(FromOverseer::Signal(signal.clone())).await?; } Ok(()) @@ -953,11 +977,6 @@ where let _ = s.tx.send(FromOverseer::Communication { msg }).await; } } - AllMessages::CollatorProtocol(msg) => { - if let Some(ref mut s) = self.collator_protocol_subsystem.instance { - let _ = s.tx.send(FromOverseer::Communication { msg }).await; - } - } AllMessages::StatementDistribution(msg) => { if let Some(ref mut s) = self.statement_distribution_subsystem.instance { let _ = s.tx.send(FromOverseer::Communication { msg }).await; @@ -1008,6 +1027,16 @@ where let _ = s.tx.send(FromOverseer::Communication { msg }).await; } } + AllMessages::CollationGeneration(msg) => { + if let Some(ref mut s) = self.collation_generation_subsystem.instance { + let _ = s.tx.send(FromOverseer::Communication { msg }).await; + } + } + AllMessages::CollatorProtocol(msg) => { + if let Some(ref mut s) = self.collator_protocol_subsystem.instance { + let _ = s.tx.send(FromOverseer::Communication { msg }).await; + } + } } } @@ -1169,7 +1198,6 @@ mod tests { candidate_validation: TestSubsystem1(s1_tx), candidate_backing: TestSubsystem2(s2_tx), candidate_selection: DummySubsystem, - collator_protocol: DummySubsystem, statement_distribution: DummySubsystem, availability_distribution: DummySubsystem, bitfield_signing: DummySubsystem, @@ -1180,6 +1208,8 @@ mod tests { availability_store: DummySubsystem, network_bridge: DummySubsystem, chain_api: DummySubsystem, + collation_generation: DummySubsystem, + collator_protocol: DummySubsystem, }; let (overseer, mut handler) = Overseer::new( vec![], @@ -1234,7 +1264,6 @@ mod tests { candidate_validation: TestSubsystem1(s1_tx), candidate_backing: TestSubsystem4, candidate_selection: DummySubsystem, - collator_protocol: DummySubsystem, statement_distribution: DummySubsystem, availability_distribution: DummySubsystem, bitfield_signing: DummySubsystem, @@ -1245,6 +1274,8 @@ mod tests { availability_store: DummySubsystem, network_bridge: DummySubsystem, chain_api: DummySubsystem, + collation_generation: DummySubsystem, + collator_protocol: DummySubsystem, }; let (overseer, _handle) = Overseer::new( vec![], @@ -1352,7 +1383,6 @@ mod tests { candidate_validation: TestSubsystem5(tx_5), candidate_backing: TestSubsystem6(tx_6), candidate_selection: DummySubsystem, - collator_protocol: DummySubsystem, statement_distribution: DummySubsystem, availability_distribution: DummySubsystem, bitfield_signing: DummySubsystem, @@ -1363,6 +1393,8 @@ mod tests { availability_store: DummySubsystem, network_bridge: DummySubsystem, chain_api: DummySubsystem, + collation_generation: DummySubsystem, + collator_protocol: DummySubsystem, }; let (overseer, mut handler) = Overseer::new( vec![first_block], @@ -1455,7 +1487,6 @@ mod tests { candidate_validation: TestSubsystem5(tx_5), candidate_backing: TestSubsystem6(tx_6), candidate_selection: DummySubsystem, - collator_protocol: DummySubsystem, statement_distribution: DummySubsystem, availability_distribution: DummySubsystem, bitfield_signing: DummySubsystem, @@ -1466,6 +1497,8 @@ mod tests { availability_store: DummySubsystem, network_bridge: DummySubsystem, chain_api: DummySubsystem, + collation_generation: DummySubsystem, + collator_protocol: DummySubsystem, }; // start with two forks of different height. let (overseer, mut handler) = Overseer::new( diff --git a/node/primitives/Cargo.toml b/node/primitives/Cargo.toml index b38e7e542e..81e2467b37 100644 --- a/node/primitives/Cargo.toml +++ b/node/primitives/Cargo.toml @@ -6,6 +6,7 @@ edition = "2018" description = "Primitives types for the Node-side" [dependencies] +futures = "0.3.5" polkadot-primitives = { path = "../../primitives" } polkadot-statement-table = { path = "../../statement-table" } parity-scale-codec = { version = "1.3.4", default-features = false, features = ["derive"] } diff --git a/node/primitives/src/lib.rs b/node/primitives/src/lib.rs index 2bcc7a3926..2ff704c2dd 100644 --- a/node/primitives/src/lib.rs +++ b/node/primitives/src/lib.rs @@ -20,12 +20,13 @@ //! not shared between the node and the runtime. This crate builds on top of the primitives defined //! there. +use futures::Future; use parity_scale_codec::{Decode, Encode}; use polkadot_primitives::v1::{ Hash, CommittedCandidateReceipt, CandidateReceipt, CompactStatement, EncodeAs, Signed, SigningContext, ValidatorIndex, ValidatorId, UpwardMessage, Balance, ValidationCode, GlobalValidationData, LocalValidationData, - HeadData, + HeadData, PoV, CollatorPair, Id as ParaId, }; use polkadot_statement_table::{ generic::{ @@ -258,3 +259,39 @@ impl std::convert::TryFrom for MisbehaviorReport { } } } + +/// The output of a collator. +/// +/// This differs from `CandidateCommitments` in two ways: +/// +/// - does not contain the erasure root; that's computed at the Polkadot level, not at Cumulus +/// - contains a proof of validity. +#[derive(Clone, Encode, Decode)] +pub struct Collation { + /// Fees paid from the chain to the relay chain validators. + pub fees: Balance, + /// Messages destined to be interpreted by the Relay chain itself. + pub upward_messages: Vec, + /// New validation code. + pub new_validation_code: Option, + /// The head-data produced as a result of execution. + pub head_data: HeadData, + /// Proof that this block is valid. + pub proof_of_validity: PoV, +} + +/// Configuration for the collation generator +pub struct CollationGenerationConfig { + /// Collator's authentication key, so it can sign things. + pub key: CollatorPair, + /// Collation function. + pub collator: Box Box + Unpin + Send> + Send + Sync>, + /// The parachain that this collator collates for + pub para_id: ParaId, +} + +impl std::fmt::Debug for CollationGenerationConfig { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "CollationGenerationConfig {{ ... }}") + } +} diff --git a/node/service/src/lib.rs b/node/service/src/lib.rs index ca350454f0..01b1a24090 100644 --- a/node/service/src/lib.rs +++ b/node/service/src/lib.rs @@ -281,7 +281,6 @@ fn real_overseer( candidate_validation: DummySubsystem, candidate_backing: DummySubsystem, candidate_selection: DummySubsystem, - collator_protocol: DummySubsystem, statement_distribution: DummySubsystem, availability_distribution: DummySubsystem, bitfield_signing: DummySubsystem, @@ -292,6 +291,8 @@ fn real_overseer( availability_store: DummySubsystem, network_bridge: DummySubsystem, chain_api: DummySubsystem, + collation_generation: DummySubsystem, + collator_protocol: DummySubsystem, }; Overseer::new( leaves, diff --git a/node/subsystem-test-helpers/src/lib.rs b/node/subsystem-test-helpers/src/lib.rs index 26c55354fb..eee22dfc6f 100644 --- a/node/subsystem-test-helpers/src/lib.rs +++ b/node/subsystem-test-helpers/src/lib.rs @@ -16,19 +16,21 @@ //! Utilities for testing subsystems. -use polkadot_node_subsystem::{SubsystemContext, FromOverseer, SubsystemResult, SubsystemError}; use polkadot_node_subsystem::messages::AllMessages; +use polkadot_node_subsystem::{FromOverseer, SubsystemContext, SubsystemError, SubsystemResult}; -use futures::prelude::*; use futures::channel::mpsc; use futures::poll; +use futures::prelude::*; +use futures_timer::Delay; use parking_lot::Mutex; -use sp_core::traits::SpawnNamed; +use sp_core::{testing::TaskExecutor, traits::SpawnNamed}; use std::convert::Infallible; use std::pin::Pin; use std::sync::Arc; use std::task::{Context, Poll, Waker}; +use std::time::Duration; enum SinkState { Empty { @@ -50,24 +52,21 @@ pub struct SingleItemStream(Arc>>); impl Sink for SingleItemSink { type Error = Infallible; - fn poll_ready( - self: Pin<&mut Self>, - cx: &mut Context, - ) -> Poll> { + fn poll_ready(self: Pin<&mut Self>, cx: &mut Context) -> Poll> { let mut state = self.0.lock(); match *state { SinkState::Empty { .. } => Poll::Ready(Ok(())), - SinkState::Item { ref mut ready_waker, .. } => { + SinkState::Item { + ref mut ready_waker, + .. + } => { *ready_waker = Some(cx.waker().clone()); Poll::Pending } } } - fn start_send( - self: Pin<&mut Self>, - item: T, - ) -> Result<(), Infallible> { + fn start_send(self: Pin<&mut Self>, item: T) -> Result<(), Infallible> { let mut state = self.0.lock(); match *state { @@ -88,24 +87,21 @@ impl Sink for SingleItemSink { Ok(()) } - fn poll_flush( - self: Pin<&mut Self>, - cx: &mut Context, - ) -> Poll> { + fn poll_flush(self: Pin<&mut Self>, cx: &mut Context) -> Poll> { let mut state = self.0.lock(); match *state { SinkState::Empty { .. } => Poll::Ready(Ok(())), - SinkState::Item { ref mut flush_waker, .. } => { + SinkState::Item { + ref mut flush_waker, + .. + } => { *flush_waker = Some(cx.waker().clone()); Poll::Pending } } } - fn poll_close( - self: Pin<&mut Self>, - cx: &mut Context, - ) -> Poll> { + fn poll_close(self: Pin<&mut Self>, cx: &mut Context) -> Poll> { self.poll_flush(cx) } } @@ -120,7 +116,11 @@ impl Stream for SingleItemStream { match std::mem::replace(&mut *state, SinkState::Empty { read_waker }) { SinkState::Empty { .. } => Poll::Pending, - SinkState::Item { item, ready_waker, flush_waker } => { + SinkState::Item { + item, + ready_waker, + flush_waker, + } => { if let Some(waker) = ready_waker { waker.wake(); } @@ -141,10 +141,7 @@ impl Stream for SingleItemStream { /// not when the item is buffered. pub fn single_item_sink() -> (SingleItemSink, SingleItemStream) { let inner = Arc::new(Mutex::new(SinkState::Empty { read_waker: None })); - ( - SingleItemSink(inner.clone()), - SingleItemStream(inner), - ) + (SingleItemSink(inner.clone()), SingleItemStream(inner)) } /// A test subsystem context. @@ -155,7 +152,9 @@ pub struct TestSubsystemContext { } #[async_trait::async_trait] -impl SubsystemContext for TestSubsystemContext { +impl SubsystemContext + for TestSubsystemContext +{ type Message = M; async fn try_recv(&mut self) -> Result>, ()> { @@ -170,9 +169,11 @@ impl SubsystemContext for Tes self.rx.next().await.ok_or(SubsystemError) } - async fn spawn(&mut self, name: &'static str, s: Pin + Send>>) - -> SubsystemResult<()> - { + async fn spawn( + &mut self, + name: &'static str, + s: Pin + Send>>, + ) -> SubsystemResult<()> { self.spawn.spawn(name, s); Ok(()) } @@ -185,15 +186,23 @@ impl SubsystemContext for Tes } async fn send_message(&mut self, msg: AllMessages) -> SubsystemResult<()> { - self.tx.send(msg).await.expect("test overseer no longer live"); + self.tx + .send(msg) + .await + .expect("test overseer no longer live"); Ok(()) } async fn send_messages(&mut self, msgs: T) -> SubsystemResult<()> - where T: IntoIterator + Send, T::IntoIter: Send + where + T: IntoIterator + Send, + T::IntoIter: Send, { let mut iter = stream::iter(msgs.into_iter().map(Ok)); - self.tx.send_all(&mut iter).await.expect("test overseer no longer live"); + self.tx + .send_all(&mut iter) + .await + .expect("test overseer no longer live"); Ok(()) } @@ -209,19 +218,27 @@ impl TestSubsystemContextHandle { /// Send a message or signal to the subsystem. This resolves at the point in time where the /// subsystem has _read_ the message. pub async fn send(&mut self, from_overseer: FromOverseer) { - self.tx.send(from_overseer).await.expect("Test subsystem no longer live"); + self.tx + .send(from_overseer) + .await + .expect("Test subsystem no longer live"); } /// Receive the next message from the subsystem. pub async fn recv(&mut self) -> AllMessages { - self.rx.next().await.expect("Test subsystem no longer live") + self.try_recv().await.expect("Test subsystem no longer live") + } + + /// Receive the next message from the subsystem, or `None` if the channel has been closed. + pub async fn try_recv(&mut self) -> Option { + self.rx.next().await } } /// Make a test subsystem context. -pub fn make_subsystem_context(spawn: S) - -> (TestSubsystemContext, TestSubsystemContextHandle) -{ +pub fn make_subsystem_context( + spawn: S, +) -> (TestSubsystemContext, TestSubsystemContextHandle) { let (overseer_tx, overseer_rx) = single_item_sink(); let (all_messages_tx, all_messages_rx) = mpsc::unbounded(); @@ -233,7 +250,39 @@ pub fn make_subsystem_context(spawn: S) }, TestSubsystemContextHandle { tx: overseer_tx, - rx: all_messages_rx + rx: all_messages_rx, }, ) -} \ No newline at end of file +} + +/// Test a subsystem, mocking the overseer +/// +/// Pass in two async closures: one mocks the overseer, the other runs the test from the perspective of a subsystem. +/// +/// Times out in two seconds. +pub fn subsystem_test_harness( + overseer_factory: OverseerFactory, + test_factory: TestFactory, +) where + OverseerFactory: FnOnce(TestSubsystemContextHandle) -> Overseer, + Overseer: Future, + TestFactory: FnOnce(TestSubsystemContext) -> Test, + Test: Future, +{ + let pool = TaskExecutor::new(); + let (context, handle) = make_subsystem_context(pool); + let overseer = overseer_factory(handle); + let test = test_factory(context); + + let timeout = Delay::new(Duration::from_secs(2)); + + futures::pin_mut!(overseer, test, timeout); + + futures::executor::block_on(async move { + futures::select! { + _ = overseer.fuse() => (), + _ = test.fuse() => (), + _ = timeout.fuse() => panic!("test timed out instead of completing"), + } + }); +} diff --git a/node/subsystem-util/src/lib.rs b/node/subsystem-util/src/lib.rs index cc8cbd239d..d6998b267f 100644 --- a/node/subsystem-util/src/lib.rs +++ b/node/subsystem-util/src/lib.rs @@ -189,6 +189,89 @@ specialize_requests! { fn request_candidate_events() -> Vec; CandidateEvents; } +/// Request some data from the `RuntimeApi` via a SubsystemContext. +async fn request_from_runtime_ctx( + parent: Hash, + ctx: &mut Context, + request_builder: RequestBuilder, +) -> Result, Error> +where + RequestBuilder: FnOnce(RuntimeApiSender) -> RuntimeApiRequest, + Context: SubsystemContext, +{ + let (tx, rx) = oneshot::channel(); + + ctx + .send_message( + AllMessages::RuntimeApi(RuntimeApiMessage::Request(parent, request_builder(tx))) + .try_into() + .map_err(|err| Error::SenderConversion(format!("{:?}", err)))?, + ) + .await?; + + Ok(rx) +} + + +/// Construct specialized request functions for the runtime. +/// +/// These would otherwise get pretty repetitive. +macro_rules! specialize_requests_ctx { + // expand return type name for documentation purposes + (fn $func_name:ident( $( $param_name:ident : $param_ty:ty ),* ) -> $return_ty:ty ; $request_variant:ident;) => { + specialize_requests_ctx!{ + named stringify!($request_variant) ; fn $func_name( $( $param_name : $param_ty ),* ) -> $return_ty ; $request_variant; + } + }; + + // create a single specialized request function + (named $doc_name:expr ; fn $func_name:ident( $( $param_name:ident : $param_ty:ty ),* ) -> $return_ty:ty ; $request_variant:ident;) => { + #[doc = "Request `"] + #[doc = $doc_name] + #[doc = "` from the runtime via a `SubsystemContext`"] + pub async fn $func_name( + parent: Hash, + $( + $param_name: $param_ty, + )* + ctx: &mut Context, + ) -> Result, Error> { + request_from_runtime_ctx(parent, ctx, |tx| RuntimeApiRequest::$request_variant( + $( $param_name, )* tx + )).await + } + }; + + // recursive decompose + ( + fn $func_name:ident( $( $param_name:ident : $param_ty:ty ),* ) -> $return_ty:ty ; $request_variant:ident; + $( + fn $t_func_name:ident( $( $t_param_name:ident : $t_param_ty:ty ),* ) -> $t_return_ty:ty ; $t_request_variant:ident; + )+ + ) => { + specialize_requests_ctx!{ + fn $func_name( $( $param_name : $param_ty ),* ) -> $return_ty ; $request_variant ; + } + specialize_requests_ctx!{ + $( + fn $t_func_name( $( $t_param_name : $t_param_ty ),* ) -> $t_return_ty ; $t_request_variant ; + )+ + } + }; +} + +specialize_requests_ctx! { + fn request_validators_ctx() -> Vec; Validators; + fn request_validator_groups_ctx() -> (Vec>, GroupRotationInfo); ValidatorGroups; + fn request_availability_cores_ctx() -> Vec; AvailabilityCores; + fn request_global_validation_data_ctx() -> GlobalValidationData; GlobalValidationData; + fn request_local_validation_data_ctx(para_id: ParaId, assumption: OccupiedCoreAssumption) -> Option; LocalValidationData; + fn request_session_index_for_child_ctx() -> SessionIndex; SessionIndexForChild; + fn request_validation_code_ctx(para_id: ParaId, assumption: OccupiedCoreAssumption) -> Option; ValidationCode; + fn request_candidate_pending_availability_ctx(para_id: ParaId) -> Option; CandidatePendingAvailability; + fn request_candidate_events_ctx() -> Vec; CandidateEvents; +} + /// From the given set of validators, find the first key we can sign with, if any. pub fn signing_key(validators: &[ValidatorId], keystore: &KeyStorePtr) -> Option { let keystore = keystore.read(); diff --git a/node/subsystem/src/messages.rs b/node/subsystem/src/messages.rs index 6081312401..ddea2639e1 100644 --- a/node/subsystem/src/messages.rs +++ b/node/subsystem/src/messages.rs @@ -24,20 +24,19 @@ use futures::channel::{mpsc, oneshot}; -use polkadot_primitives::v1::{ - Hash, CommittedCandidateReceipt, CollatorId, - CandidateReceipt, PoV, ErasureChunk, BackedCandidate, Id as ParaId, - SignedAvailabilityBitfield, ValidatorId, ValidationCode, ValidatorIndex, - CoreAssignment, CoreOccupied, CandidateDescriptor, - ValidatorSignature, OmittedValidationData, AvailableData, GroupRotationInfo, - CoreState, LocalValidationData, GlobalValidationData, OccupiedCoreAssumption, - CandidateEvent, SessionIndex, BlockNumber, +use polkadot_node_network_protocol::{ + v1 as protocol_v1, NetworkBridgeEvent, ReputationChange, PeerId, PeerSet, }; use polkadot_node_primitives::{ - MisbehaviorReport, SignedFullStatement, ValidationResult, + CollationGenerationConfig, MisbehaviorReport, SignedFullStatement, ValidationResult, }; -use polkadot_node_network_protocol::{ - v1 as protocol_v1, NetworkBridgeEvent, ReputationChange, PeerId, PeerSet, +use polkadot_primitives::v1::{ + AvailableData, BackedCandidate, BlockNumber, CandidateDescriptor, CandidateEvent, + CandidateReceipt, CollatorId, CommittedCandidateReceipt, + CoreAssignment, CoreOccupied, CoreState, ErasureChunk, GlobalValidationData, GroupRotationInfo, + Hash, Id as ParaId, LocalValidationData, OccupiedCoreAssumption, OmittedValidationData, PoV, + SessionIndex, SignedAvailabilityBitfield, ValidationCode, ValidatorId, ValidatorIndex, + ValidatorSignature, }; use std::sync::Arc; @@ -82,7 +81,6 @@ pub enum CandidateBackingMessage { Statement(Hash, SignedFullStatement), } - impl CandidateBackingMessage { /// If the current variant contains the relay parent hash, return it. pub fn relay_parent(&self) -> Option { @@ -505,6 +503,20 @@ impl PoVDistributionMessage { } } +/// Message to the Collation Generation Subsystem. +#[derive(Debug)] +pub enum CollationGenerationMessage { + /// Initialize the collation generation subsystem + Initialize(CollationGenerationConfig), +} + +impl CollationGenerationMessage { + /// If the current variant contains the relay parent hash, return it. + pub fn relay_parent(&self) -> Option { + None + } +} + /// A message type tying together all message types that are used across Subsystems. #[derive(Debug)] pub enum AllMessages { @@ -536,4 +548,6 @@ pub enum AllMessages { AvailabilityStore(AvailabilityStoreMessage), /// Message for the network bridge subsystem. NetworkBridge(NetworkBridgeMessage), + /// Message for the Collation Generation subsystem + CollationGeneration(CollationGenerationMessage), } diff --git a/roadmap/implementers-guide/src/node/collators/collation-generation.md b/roadmap/implementers-guide/src/node/collators/collation-generation.md index d27ba74085..ab3f80273d 100644 --- a/roadmap/implementers-guide/src/node/collators/collation-generation.md +++ b/roadmap/implementers-guide/src/node/collators/collation-generation.md @@ -4,33 +4,48 @@ The collation generation subsystem is executed on collator nodes and produces ca ## Protocol -Input: None +Input: `CollationGenerationMessage` -Output: CollationDistributionMessage +```rust +enum CollationGenerationMessage { + Initialize(CollationGenerationConfig), +} +``` + +No more than one initialization message should ever be sent to the collation generation subsystem. + +Output: `CollationDistributionMessage` ## Functionality The process of generating a collation for a parachain is very parachain-specific. As such, the details of how to do so are left beyond the scope of this description. The subsystem should be implemented as an abstract wrapper, which is aware of this configuration: ```rust +pub struct Collation { + /// Hash of `CandidateCommitments` as understood by the collator. + pub commitments_hash: Hash, + pub proof_of_validity: PoV, +} + struct CollationGenerationConfig { - key: CollatorPair, - collation_producer: Fn(params) -> async (HeadData, Vec, PoV), + key: CollatorPair, + collator: Box Box>> + para_id: ParaId, } ``` The configuration should be optional, to allow for the case where the node is not run with the capability to collate. On `ActiveLeavesUpdate`: - * If there is no collation generation config, ignore. - * Otherwise, for each `activated` head in the update: - * Determine if the para is scheduled or is next up on any occupied core by fetching the `availability_cores` Runtime API. - * Determine an occupied core assumption to make about the para. The simplest thing to do is to always assume that if the para occupies a core, that the candidate will become available. Further on, this might be determined based on bitfields seen or validator requests. - * Use the Runtime API subsystem to fetch the full validation data. - * Construct validation function params based on validation data. - * Invoke the `collation_producer`. - * Construct a `CommittedCandidateReceipt` using the outputs of the `collation_producer` and signing with the `key`. - * Dispatch a [`CollatorProtocolMessage`][CPM]`::DistributeCollation(receipt, pov)`. + +* If there is no collation generation config, ignore. +* Otherwise, for each `activated` head in the update: + * Determine if the para is scheduled on any core by fetching the `availability_cores` Runtime API. + > TODO: figure out what to do in the case of occupied cores; see [this issue](https://github.com/paritytech/polkadot/issues/1573). + * Determine an occupied core assumption to make about the para. Scheduled cores can make `OccupiedCoreAssumption::Free`. + * Use the Runtime API subsystem to fetch the full validation data. + * Invoke the `collator`, and use its outputs to produce a `CandidateReceipt`, signed with the configuration's `key`. + * Dispatch a [`CollatorProtocolMessage`][CPM]`::DistributeCollation(receipt, pov)`. [CP]: collator-protocol.md [CPM]: ../../types/overseer-protocol.md#collatorprotocolmessage -- GitLab From c435c187aa43804055c4dd2c07591158212063c5 Mon Sep 17 00:00:00 2001 From: Wei Tang Date: Mon, 17 Aug 2020 14:33:30 +0200 Subject: [PATCH 181/192] Companion PR for #6862 (#1564) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Companion PR for #6862 * Check in Cargo.lock for CI * "Update Substrate" * update substrate Co-authored-by: parity-processbot <> Co-authored-by: André Silva --- Cargo.lock | 283 ++++++++++++++++++++-------------------- node/service/src/lib.rs | 4 +- service/src/lib.rs | 4 +- 3 files changed, 148 insertions(+), 143 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index e0ddadbe1e..2159abc16a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1401,7 +1401,7 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "fork-tree" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" dependencies = [ "parity-scale-codec", ] @@ -1409,7 +1409,7 @@ dependencies = [ [[package]] name = "frame-benchmarking" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" dependencies = [ "frame-support", "frame-system", @@ -1426,7 +1426,7 @@ dependencies = [ [[package]] name = "frame-benchmarking-cli" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" dependencies = [ "frame-benchmarking", "parity-scale-codec", @@ -1444,7 +1444,7 @@ dependencies = [ [[package]] name = "frame-executive" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" dependencies = [ "frame-support", "frame-system", @@ -1459,7 +1459,7 @@ dependencies = [ [[package]] name = "frame-metadata" version = "11.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" dependencies = [ "parity-scale-codec", "serde", @@ -1470,7 +1470,7 @@ dependencies = [ [[package]] name = "frame-support" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" dependencies = [ "bitmask", "frame-metadata", @@ -1495,7 +1495,7 @@ dependencies = [ [[package]] name = "frame-support-procedural" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" dependencies = [ "frame-support-procedural-tools", "proc-macro2 1.0.18", @@ -1506,7 +1506,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" dependencies = [ "frame-support-procedural-tools-derive", "proc-macro-crate", @@ -1518,7 +1518,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools-derive" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" dependencies = [ "proc-macro2 1.0.18", "quote 1.0.7", @@ -1528,7 +1528,7 @@ dependencies = [ [[package]] name = "frame-system" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" dependencies = [ "frame-support", "impl-trait-for-tuples", @@ -1544,7 +1544,7 @@ dependencies = [ [[package]] name = "frame-system-benchmarking" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" dependencies = [ "frame-benchmarking", "frame-support", @@ -1558,7 +1558,7 @@ dependencies = [ [[package]] name = "frame-system-rpc-runtime-api" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" dependencies = [ "parity-scale-codec", "sp-api", @@ -3558,7 +3558,7 @@ dependencies = [ [[package]] name = "pallet-authority-discovery" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" dependencies = [ "frame-support", "frame-system", @@ -3574,7 +3574,7 @@ dependencies = [ [[package]] name = "pallet-authorship" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" dependencies = [ "frame-support", "frame-system", @@ -3589,7 +3589,7 @@ dependencies = [ [[package]] name = "pallet-babe" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" dependencies = [ "frame-benchmarking", "frame-support", @@ -3614,7 +3614,7 @@ dependencies = [ [[package]] name = "pallet-balances" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" dependencies = [ "frame-benchmarking", "frame-support", @@ -3628,7 +3628,7 @@ dependencies = [ [[package]] name = "pallet-collective" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" dependencies = [ "frame-benchmarking", "frame-support", @@ -3644,7 +3644,7 @@ dependencies = [ [[package]] name = "pallet-democracy" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" dependencies = [ "frame-benchmarking", "frame-support", @@ -3659,7 +3659,7 @@ dependencies = [ [[package]] name = "pallet-elections-phragmen" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" dependencies = [ "frame-benchmarking", "frame-support", @@ -3674,7 +3674,7 @@ dependencies = [ [[package]] name = "pallet-finality-tracker" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" dependencies = [ "frame-support", "frame-system", @@ -3690,7 +3690,7 @@ dependencies = [ [[package]] name = "pallet-grandpa" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" dependencies = [ "frame-benchmarking", "frame-support", @@ -3712,7 +3712,7 @@ dependencies = [ [[package]] name = "pallet-identity" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" dependencies = [ "enumflags2", "frame-benchmarking", @@ -3728,7 +3728,7 @@ dependencies = [ [[package]] name = "pallet-im-online" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" dependencies = [ "frame-benchmarking", "frame-support", @@ -3748,7 +3748,7 @@ dependencies = [ [[package]] name = "pallet-indices" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" dependencies = [ "frame-support", "frame-system", @@ -3764,7 +3764,7 @@ dependencies = [ [[package]] name = "pallet-membership" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" dependencies = [ "frame-support", "frame-system", @@ -3778,7 +3778,7 @@ dependencies = [ [[package]] name = "pallet-multisig" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" dependencies = [ "frame-support", "frame-system", @@ -3793,7 +3793,7 @@ dependencies = [ [[package]] name = "pallet-nicks" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" dependencies = [ "frame-support", "frame-system", @@ -3807,7 +3807,7 @@ dependencies = [ [[package]] name = "pallet-offences" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" dependencies = [ "frame-support", "frame-system", @@ -3822,7 +3822,7 @@ dependencies = [ [[package]] name = "pallet-offences-benchmarking" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" dependencies = [ "frame-benchmarking", "frame-support", @@ -3843,7 +3843,7 @@ dependencies = [ [[package]] name = "pallet-proxy" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" dependencies = [ "frame-support", "frame-system", @@ -3858,7 +3858,7 @@ dependencies = [ [[package]] name = "pallet-randomness-collective-flip" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" dependencies = [ "frame-support", "frame-system", @@ -3871,7 +3871,7 @@ dependencies = [ [[package]] name = "pallet-recovery" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" dependencies = [ "enumflags2", "frame-support", @@ -3886,7 +3886,7 @@ dependencies = [ [[package]] name = "pallet-scheduler" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" dependencies = [ "frame-benchmarking", "frame-support", @@ -3901,7 +3901,7 @@ dependencies = [ [[package]] name = "pallet-session" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" dependencies = [ "frame-support", "frame-system", @@ -3921,7 +3921,7 @@ dependencies = [ [[package]] name = "pallet-session-benchmarking" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" dependencies = [ "frame-benchmarking", "frame-support", @@ -3937,7 +3937,7 @@ dependencies = [ [[package]] name = "pallet-society" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" dependencies = [ "frame-support", "frame-system", @@ -3951,7 +3951,7 @@ dependencies = [ [[package]] name = "pallet-staking" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" dependencies = [ "frame-benchmarking", "frame-support", @@ -3973,7 +3973,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-curve" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -3984,7 +3984,7 @@ dependencies = [ [[package]] name = "pallet-sudo" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" dependencies = [ "frame-support", "frame-system", @@ -3998,7 +3998,7 @@ dependencies = [ [[package]] name = "pallet-timestamp" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" dependencies = [ "frame-benchmarking", "frame-support", @@ -4016,7 +4016,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" dependencies = [ "frame-support", "frame-system", @@ -4033,7 +4033,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" dependencies = [ "jsonrpc-core", "jsonrpc-core-client", @@ -4051,7 +4051,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc-runtime-api" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" dependencies = [ "frame-support", "parity-scale-codec", @@ -4064,7 +4064,7 @@ dependencies = [ [[package]] name = "pallet-treasury" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" dependencies = [ "frame-benchmarking", "frame-support", @@ -4079,7 +4079,7 @@ dependencies = [ [[package]] name = "pallet-utility" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" dependencies = [ "frame-benchmarking", "frame-support", @@ -4095,7 +4095,7 @@ dependencies = [ [[package]] name = "pallet-vesting" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" dependencies = [ "enumflags2", "frame-benchmarking", @@ -6319,7 +6319,7 @@ dependencies = [ [[package]] name = "sc-authority-discovery" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" dependencies = [ "bytes 0.5.5", "derive_more 0.99.9", @@ -6346,7 +6346,7 @@ dependencies = [ [[package]] name = "sc-basic-authorship" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6370,7 +6370,7 @@ dependencies = [ [[package]] name = "sc-block-builder" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" dependencies = [ "parity-scale-codec", "sc-client-api", @@ -6387,7 +6387,7 @@ dependencies = [ [[package]] name = "sc-chain-spec" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" dependencies = [ "impl-trait-for-tuples", "sc-chain-spec-derive", @@ -6403,7 +6403,7 @@ dependencies = [ [[package]] name = "sc-chain-spec-derive" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -6414,7 +6414,7 @@ dependencies = [ [[package]] name = "sc-cli" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" dependencies = [ "ansi_term 0.12.1", "atty", @@ -6455,7 +6455,7 @@ dependencies = [ [[package]] name = "sc-client-api" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" dependencies = [ "derive_more 0.99.9", "fnv", @@ -6491,7 +6491,7 @@ dependencies = [ [[package]] name = "sc-client-db" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" dependencies = [ "blake2-rfc", "hash-db", @@ -6521,7 +6521,7 @@ dependencies = [ [[package]] name = "sc-consensus" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" dependencies = [ "sc-client-api", "sp-blockchain", @@ -6532,7 +6532,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" dependencies = [ "derive_more 0.99.9", "fork-tree", @@ -6576,7 +6576,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe-rpc" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -6600,7 +6600,7 @@ dependencies = [ [[package]] name = "sc-consensus-epochs" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" dependencies = [ "fork-tree", "parity-scale-codec", @@ -6613,7 +6613,7 @@ dependencies = [ [[package]] name = "sc-consensus-slots" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6636,7 +6636,7 @@ dependencies = [ [[package]] name = "sc-consensus-uncles" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" dependencies = [ "log 0.4.11", "sc-client-api", @@ -6650,7 +6650,7 @@ dependencies = [ [[package]] name = "sc-executor" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" dependencies = [ "derive_more 0.99.9", "lazy_static", @@ -6678,7 +6678,7 @@ dependencies = [ [[package]] name = "sc-executor-common" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" dependencies = [ "derive_more 0.99.9", "log 0.4.11", @@ -6695,7 +6695,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmi" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" dependencies = [ "log 0.4.11", "parity-scale-codec", @@ -6710,7 +6710,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmtime" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" dependencies = [ "log 0.4.11", "parity-scale-codec", @@ -6728,7 +6728,7 @@ dependencies = [ [[package]] name = "sc-finality-grandpa" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" dependencies = [ "derive_more 0.99.9", "finality-grandpa", @@ -6765,7 +6765,7 @@ dependencies = [ [[package]] name = "sc-finality-grandpa-rpc" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" dependencies = [ "derive_more 0.99.9", "finality-grandpa", @@ -6786,7 +6786,7 @@ dependencies = [ [[package]] name = "sc-informant" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" dependencies = [ "ansi_term 0.12.1", "futures 0.3.5", @@ -6804,7 +6804,7 @@ dependencies = [ [[package]] name = "sc-keystore" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" dependencies = [ "derive_more 0.99.9", "hex", @@ -6820,7 +6820,7 @@ dependencies = [ [[package]] name = "sc-light" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" dependencies = [ "hash-db", "lazy_static", @@ -6839,8 +6839,9 @@ dependencies = [ [[package]] name = "sc-network" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" dependencies = [ + "async-std", "bitflags", "bs58", "bytes 0.5.5", @@ -6891,7 +6892,7 @@ dependencies = [ [[package]] name = "sc-network-gossip" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6906,7 +6907,7 @@ dependencies = [ [[package]] name = "sc-network-test" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" dependencies = [ "env_logger", "futures 0.3.5", @@ -6933,7 +6934,7 @@ dependencies = [ [[package]] name = "sc-offchain" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" dependencies = [ "bytes 0.5.5", "fnv", @@ -6960,7 +6961,7 @@ dependencies = [ [[package]] name = "sc-peerset" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" dependencies = [ "futures 0.3.5", "libp2p", @@ -6973,7 +6974,7 @@ dependencies = [ [[package]] name = "sc-proposer-metrics" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" dependencies = [ "log 0.4.11", "substrate-prometheus-endpoint", @@ -6982,7 +6983,7 @@ dependencies = [ [[package]] name = "sc-rpc" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" dependencies = [ "futures 0.3.5", "hash-db", @@ -7014,7 +7015,7 @@ dependencies = [ [[package]] name = "sc-rpc-api" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -7038,7 +7039,7 @@ dependencies = [ [[package]] name = "sc-rpc-server" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" dependencies = [ "jsonrpc-core", "jsonrpc-http-server", @@ -7054,7 +7055,7 @@ dependencies = [ [[package]] name = "sc-service" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" dependencies = [ "derive_more 0.99.9", "directories", @@ -7115,7 +7116,7 @@ dependencies = [ [[package]] name = "sc-state-db" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" dependencies = [ "log 0.4.11", "parity-scale-codec", @@ -7129,7 +7130,7 @@ dependencies = [ [[package]] name = "sc-telemetry" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -7150,7 +7151,7 @@ dependencies = [ [[package]] name = "sc-tracing" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" dependencies = [ "erased-serde", "log 0.4.11", @@ -7168,7 +7169,7 @@ dependencies = [ [[package]] name = "sc-transaction-graph" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -7189,7 +7190,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -7656,7 +7657,7 @@ dependencies = [ [[package]] name = "sp-allocator" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" dependencies = [ "derive_more 0.99.9", "log 0.4.11", @@ -7668,7 +7669,7 @@ dependencies = [ [[package]] name = "sp-api" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" dependencies = [ "hash-db", "parity-scale-codec", @@ -7683,7 +7684,7 @@ dependencies = [ [[package]] name = "sp-api-proc-macro" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" dependencies = [ "blake2-rfc", "proc-macro-crate", @@ -7695,7 +7696,7 @@ dependencies = [ [[package]] name = "sp-application-crypto" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" dependencies = [ "parity-scale-codec", "serde", @@ -7707,7 +7708,7 @@ dependencies = [ [[package]] name = "sp-arithmetic" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" dependencies = [ "integer-sqrt", "num-traits 0.2.12", @@ -7720,7 +7721,7 @@ dependencies = [ [[package]] name = "sp-authority-discovery" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" dependencies = [ "parity-scale-codec", "sp-api", @@ -7732,7 +7733,7 @@ dependencies = [ [[package]] name = "sp-authorship" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" dependencies = [ "parity-scale-codec", "sp-inherents", @@ -7743,7 +7744,7 @@ dependencies = [ [[package]] name = "sp-block-builder" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" dependencies = [ "parity-scale-codec", "sp-api", @@ -7755,7 +7756,7 @@ dependencies = [ [[package]] name = "sp-blockchain" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" dependencies = [ "derive_more 0.99.9", "log 0.4.11", @@ -7772,7 +7773,7 @@ dependencies = [ [[package]] name = "sp-chain-spec" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" dependencies = [ "serde", "serde_json", @@ -7781,7 +7782,7 @@ dependencies = [ [[package]] name = "sp-consensus" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -7807,7 +7808,7 @@ dependencies = [ [[package]] name = "sp-consensus-aura" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" dependencies = [ "parity-scale-codec", "sp-api", @@ -7821,7 +7822,7 @@ dependencies = [ [[package]] name = "sp-consensus-babe" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" dependencies = [ "merlin", "parity-scale-codec", @@ -7840,7 +7841,7 @@ dependencies = [ [[package]] name = "sp-consensus-slots" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" dependencies = [ "parity-scale-codec", "sp-runtime", @@ -7849,7 +7850,7 @@ dependencies = [ [[package]] name = "sp-consensus-vrf" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" dependencies = [ "parity-scale-codec", "schnorrkel", @@ -7861,7 +7862,7 @@ dependencies = [ [[package]] name = "sp-core" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" dependencies = [ "base58", "blake2-rfc", @@ -7905,7 +7906,7 @@ dependencies = [ [[package]] name = "sp-database" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" dependencies = [ "kvdb", "parking_lot 0.10.2", @@ -7914,7 +7915,7 @@ dependencies = [ [[package]] name = "sp-debug-derive" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" dependencies = [ "proc-macro2 1.0.18", "quote 1.0.7", @@ -7924,7 +7925,7 @@ dependencies = [ [[package]] name = "sp-externalities" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" dependencies = [ "environmental", "parity-scale-codec", @@ -7935,7 +7936,7 @@ dependencies = [ [[package]] name = "sp-finality-grandpa" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" dependencies = [ "finality-grandpa", "log 0.4.11", @@ -7951,7 +7952,7 @@ dependencies = [ [[package]] name = "sp-finality-tracker" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" dependencies = [ "parity-scale-codec", "sp-inherents", @@ -7961,7 +7962,7 @@ dependencies = [ [[package]] name = "sp-inherents" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" dependencies = [ "derive_more 0.99.9", "parity-scale-codec", @@ -7973,7 +7974,7 @@ dependencies = [ [[package]] name = "sp-io" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" dependencies = [ "futures 0.3.5", "hash-db", @@ -7994,7 +7995,7 @@ dependencies = [ [[package]] name = "sp-keyring" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" dependencies = [ "lazy_static", "sp-core", @@ -8005,7 +8006,7 @@ dependencies = [ [[package]] name = "sp-npos-elections" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" dependencies = [ "parity-scale-codec", "serde", @@ -8017,7 +8018,7 @@ dependencies = [ [[package]] name = "sp-npos-elections-compact" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -8028,7 +8029,7 @@ dependencies = [ [[package]] name = "sp-offchain" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" dependencies = [ "sp-api", "sp-core", @@ -8038,7 +8039,7 @@ dependencies = [ [[package]] name = "sp-panic-handler" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" dependencies = [ "backtrace", "log 0.4.11", @@ -8047,7 +8048,7 @@ dependencies = [ [[package]] name = "sp-rpc" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" dependencies = [ "serde", "sp-core", @@ -8056,7 +8057,7 @@ dependencies = [ [[package]] name = "sp-runtime" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" dependencies = [ "either", "hash256-std-hasher", @@ -8078,7 +8079,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" dependencies = [ "parity-scale-codec", "primitive-types", @@ -8093,7 +8094,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" dependencies = [ "Inflector", "proc-macro-crate", @@ -8105,7 +8106,7 @@ dependencies = [ [[package]] name = "sp-serializer" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" dependencies = [ "serde", "serde_json", @@ -8114,7 +8115,7 @@ dependencies = [ [[package]] name = "sp-session" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" dependencies = [ "parity-scale-codec", "sp-api", @@ -8127,7 +8128,7 @@ dependencies = [ [[package]] name = "sp-staking" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" dependencies = [ "parity-scale-codec", "sp-runtime", @@ -8137,7 +8138,7 @@ dependencies = [ [[package]] name = "sp-state-machine" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" dependencies = [ "hash-db", "itertools 0.9.0", @@ -8158,12 +8159,12 @@ dependencies = [ [[package]] name = "sp-std" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" [[package]] name = "sp-storage" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" dependencies = [ "impl-serde 0.2.3", "ref-cast", @@ -8175,7 +8176,7 @@ dependencies = [ [[package]] name = "sp-timestamp" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -8189,7 +8190,7 @@ dependencies = [ [[package]] name = "sp-tracing" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" dependencies = [ "log 0.4.11", "rental", @@ -8199,7 +8200,7 @@ dependencies = [ [[package]] name = "sp-transaction-pool" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -8214,7 +8215,7 @@ dependencies = [ [[package]] name = "sp-trie" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" dependencies = [ "hash-db", "memory-db", @@ -8228,7 +8229,7 @@ dependencies = [ [[package]] name = "sp-utils" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" dependencies = [ "futures 0.3.5", "futures-core", @@ -8240,7 +8241,7 @@ dependencies = [ [[package]] name = "sp-version" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" dependencies = [ "impl-serde 0.2.3", "parity-scale-codec", @@ -8252,7 +8253,7 @@ dependencies = [ [[package]] name = "sp-wasm-interface" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -8383,7 +8384,7 @@ dependencies = [ [[package]] name = "substrate-browser-utils" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" dependencies = [ "chrono", "console_error_panic_hook", @@ -8409,7 +8410,7 @@ dependencies = [ [[package]] name = "substrate-build-script-utils" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" dependencies = [ "platforms", ] @@ -8417,7 +8418,7 @@ dependencies = [ [[package]] name = "substrate-frame-rpc-system" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" dependencies = [ "frame-system-rpc-runtime-api", "futures 0.3.5", @@ -8440,7 +8441,7 @@ dependencies = [ [[package]] name = "substrate-prometheus-endpoint" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" dependencies = [ "async-std", "derive_more 0.99.9", @@ -8454,7 +8455,7 @@ dependencies = [ [[package]] name = "substrate-test-client" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" dependencies = [ "futures 0.1.29", "futures 0.3.5", @@ -8480,7 +8481,7 @@ dependencies = [ [[package]] name = "substrate-test-runtime" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" dependencies = [ "cfg-if", "frame-executive", @@ -8520,7 +8521,7 @@ dependencies = [ [[package]] name = "substrate-test-runtime-client" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" dependencies = [ "futures 0.3.5", "parity-scale-codec", @@ -8541,7 +8542,7 @@ dependencies = [ [[package]] name = "substrate-test-utils" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" dependencies = [ "futures 0.3.5", "substrate-test-utils-derive", @@ -8551,7 +8552,7 @@ dependencies = [ [[package]] name = "substrate-test-utils-derive" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" dependencies = [ "proc-macro-crate", "quote 1.0.7", @@ -8561,13 +8562,13 @@ dependencies = [ [[package]] name = "substrate-wasm-builder-runner" version = "1.0.6" -source = "git+https://github.com/paritytech/substrate#cd3b62b74aa416028bb654543b96856f5846e3a7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2a965994514ab35d3893e9260245f2947fd1981cdd4fffd2c6e6d1a9ce02e6a" [[package]] name = "substrate-wasm-builder-runner" version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2a965994514ab35d3893e9260245f2947fd1981cdd4fffd2c6e6d1a9ce02e6a" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" [[package]] name = "subtle" diff --git a/node/service/src/lib.rs b/node/service/src/lib.rs index 01b1a24090..0489cde65b 100644 --- a/node/service/src/lib.rs +++ b/node/service/src/lib.rs @@ -33,6 +33,7 @@ use polkadot_subsystem::DummySubsystem; use polkadot_node_core_proposer::ProposerFactory; use sp_trie::PrefixedMemoryDB; use sp_core::traits::SpawnNamed; +use sc_client_api::ExecutorProvider; pub use service::{ Role, PruningMode, TransactionPoolOptions, Error, RuntimeGenesis, TFullClient, TLightClient, TFullBackend, TLightBackend, TFullCallExecutor, TLightCallExecutor, @@ -225,6 +226,7 @@ fn new_partial(config: &mut Configuration) -> Result< inherent_data_providers.clone(), &task_manager.spawn_handle(), config.prometheus_registry(), + consensus_common::CanAuthorWithNativeVersion::new(client.executor().clone()), )?; let justification_stream = grandpa_link.justification_stream(); @@ -319,7 +321,6 @@ fn new_full( RuntimeApiCollection>, Executor: NativeExecutionDispatch + 'static, { - use sc_client_api::ExecutorProvider; use sp_core::traits::BareCryptoStorePtr; let is_collator = collating_for.is_some(); @@ -576,6 +577,7 @@ fn new_light(mut config: Configuration) -> Result(config: &mut Configuration, test: bool) inherent_data_providers.clone(), &task_manager.spawn_handle(), config.prometheus_registry(), + consensus_common::CanAuthorWithNativeVersion::new(client.executor().clone()), )?; let justification_stream = grandpa_link.justification_stream(); @@ -266,7 +268,6 @@ pub fn new_full( Executor: NativeExecutionDispatch + 'static, { use sc_network::Event; - use sc_client_api::ExecutorProvider; use futures::stream::StreamExt; use sp_core::traits::BareCryptoStorePtr; @@ -615,6 +616,7 @@ fn new_light(mut config: Configuration) -> Result<(TaskManage inherent_data_providers.clone(), &task_manager.spawn_handle(), config.prometheus_registry(), + consensus_common::NeverCanAuthor, )?; let finality_proof_provider = -- GitLab From c61d90764bd112d47ccd507e89a6a850e0165919 Mon Sep 17 00:00:00 2001 From: Andronik Ordian Date: Mon, 17 Aug 2020 18:24:52 +0200 Subject: [PATCH 182/192] overseer: fix build (#1596) * overseer: add a test for CollationGeneration * fix build --- Cargo.lock | 6 +++--- node/overseer/src/lib.rs | 30 ++++++++++++++++++++++++++---- 2 files changed, 29 insertions(+), 7 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 2159abc16a..0e8c4f8d04 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -8562,13 +8562,13 @@ dependencies = [ [[package]] name = "substrate-wasm-builder-runner" version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2a965994514ab35d3893e9260245f2947fd1981cdd4fffd2c6e6d1a9ce02e6a" +source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" [[package]] name = "substrate-wasm-builder-runner" version = "1.0.6" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2a965994514ab35d3893e9260245f2947fd1981cdd4fffd2c6e6d1a9ce02e6a" [[package]] name = "subtle" diff --git a/node/overseer/src/lib.rs b/node/overseer/src/lib.rs index f37a398df4..452ab1f4b6 100644 --- a/node/overseer/src/lib.rs +++ b/node/overseer/src/lib.rs @@ -1087,12 +1087,14 @@ mod tests { use std::sync::atomic; use futures::{executor, pin_mut, select, channel::mpsc, FutureExt}; - use polkadot_primitives::v1::{BlockData, PoV}; + use polkadot_primitives::v1::{BlockData, CollatorPair, PoV}; use polkadot_subsystem::DummySubsystem; use polkadot_subsystem::messages::RuntimeApiRequest; - + use polkadot_node_primitives::{Collation, CollationGenerationConfig}; use polkadot_node_network_protocol::{PeerId, ReputationChange, NetworkBridgeEvent}; + use sp_core::crypto::Pair as _; + use super::*; @@ -1250,7 +1252,6 @@ mod tests { assert_eq!(s1_results, (0..10).collect::>()); }); } - // Spawn a subsystem that immediately exits. // // Should immediately conclude the overseer itself with an error. @@ -1639,6 +1640,25 @@ mod tests { ChainApiMessage::FinalizedBlockNumber(sender) } + fn test_collator_generation_msg() -> CollationGenerationMessage { + CollationGenerationMessage::Initialize(CollationGenerationConfig { + key: CollatorPair::generate().0, + collator: Box::new(|_, _| Box::new(TestCollator)), + para_id: Default::default(), + }) + } + struct TestCollator; + + impl Future for TestCollator { + type Output = Collation; + + fn poll(self: Pin<&mut Self>, _cx: &mut futures::task::Context) -> Poll { + panic!("at the Disco") + } + } + + impl Unpin for TestCollator {} + fn test_collator_protocol_msg() -> CollatorProtocolMessage { CollatorProtocolMessage::CollateOn(Default::default()) } @@ -1702,6 +1722,7 @@ mod tests { candidate_validation: subsystem.clone(), candidate_backing: subsystem.clone(), candidate_selection: subsystem.clone(), + collation_generation: subsystem.clone(), collator_protocol: subsystem.clone(), statement_distribution: subsystem.clone(), availability_distribution: subsystem.clone(), @@ -1735,6 +1756,7 @@ mod tests { handler.send_msg(AllMessages::CandidateValidation(test_candidate_validation_msg())).await.unwrap(); handler.send_msg(AllMessages::CandidateBacking(test_candidate_backing_msg())).await.unwrap(); handler.send_msg(AllMessages::CandidateSelection(test_candidate_selection_msg())).await.unwrap(); + handler.send_msg(AllMessages::CollationGeneration(test_collator_generation_msg())).await.unwrap(); handler.send_msg(AllMessages::CollatorProtocol(test_collator_protocol_msg())).await.unwrap(); handler.send_msg(AllMessages::StatementDistribution(test_statement_distribution_msg())).await.unwrap(); handler.send_msg(AllMessages::AvailabilityDistribution(test_availability_distribution_msg())).await.unwrap(); @@ -1752,7 +1774,7 @@ mod tests { select! { res = overseer_fut => { - const NUM_SUBSYSTEMS: usize = 14; + const NUM_SUBSYSTEMS: usize = 15; assert_eq!(stop_signals_received.load(atomic::Ordering::SeqCst), NUM_SUBSYSTEMS); // x2 because of broadcast_signal on startup -- GitLab From a91b117c5b85bc4698378d05db7c75c3e7ac39e0 Mon Sep 17 00:00:00 2001 From: Andronik Ordian Date: Mon, 17 Aug 2020 19:26:13 +0200 Subject: [PATCH 183/192] move AssignmentKind and CoreAssigment to scheduler (#1571) --- node/subsystem/src/messages.rs | 15 +-------- primitives/src/v1.rs | 47 --------------------------- runtime/parachains/src/inclusion.rs | 6 ++-- runtime/parachains/src/scheduler.rs | 50 ++++++++++++++++++++++++++++- 4 files changed, 53 insertions(+), 65 deletions(-) diff --git a/node/subsystem/src/messages.rs b/node/subsystem/src/messages.rs index ddea2639e1..9891692a06 100644 --- a/node/subsystem/src/messages.rs +++ b/node/subsystem/src/messages.rs @@ -33,7 +33,7 @@ use polkadot_node_primitives::{ use polkadot_primitives::v1::{ AvailableData, BackedCandidate, BlockNumber, CandidateDescriptor, CandidateEvent, CandidateReceipt, CollatorId, CommittedCandidateReceipt, - CoreAssignment, CoreOccupied, CoreState, ErasureChunk, GlobalValidationData, GroupRotationInfo, + CoreState, ErasureChunk, GlobalValidationData, GroupRotationInfo, Hash, Id as ParaId, LocalValidationData, OccupiedCoreAssumption, OmittedValidationData, PoV, SessionIndex, SignedAvailabilityBitfield, ValidationCode, ValidatorId, ValidatorIndex, ValidatorSignature, @@ -345,19 +345,6 @@ impl ChainApiMessage { } } -/// The information on scheduler assignments that some somesystems may be querying. -#[derive(Debug, Clone)] -pub struct SchedulerRoster { - /// Validator-to-groups assignments. - pub validator_groups: Vec>, - /// All scheduled paras. - pub scheduled: Vec, - /// Upcoming paras (chains and threads). - pub upcoming: Vec, - /// Occupied cores. - pub availability_cores: Vec>, -} - /// A sender for the result of a runtime API request. pub type RuntimeApiSender = oneshot::Sender>; diff --git a/primitives/src/v1.rs b/primitives/src/v1.rs index 5436100022..086eface31 100644 --- a/primitives/src/v1.rs +++ b/primitives/src/v1.rs @@ -434,53 +434,6 @@ pub enum CoreOccupied { Parachain, } -/// The assignment type. -#[derive(Clone, Encode, Decode)] -#[cfg_attr(feature = "std", derive(PartialEq, Debug))] -pub enum AssignmentKind { - /// A parachain. - Parachain, - /// A parathread. - Parathread(CollatorId, u32), -} - -/// How a free core is scheduled to be assigned. -#[derive(Clone, Encode, Decode)] -#[cfg_attr(feature = "std", derive(PartialEq, Debug))] -pub struct CoreAssignment { - /// The core that is assigned. - pub core: CoreIndex, - /// The unique ID of the para that is assigned to the core. - pub para_id: Id, - /// The kind of the assignment. - pub kind: AssignmentKind, - /// The index of the validator group assigned to the core. - pub group_idx: GroupIndex, -} - -impl CoreAssignment { - /// Get the ID of a collator who is required to collate this block. - pub fn required_collator(&self) -> Option<&CollatorId> { - match self.kind { - AssignmentKind::Parachain => None, - AssignmentKind::Parathread(ref id, _) => Some(id), - } - } - - /// Get the `CoreOccupied` from this. - pub fn to_core_occupied(&self) -> CoreOccupied { - match self.kind { - AssignmentKind::Parachain => CoreOccupied::Parachain, - AssignmentKind::Parathread(ref collator, retries) => CoreOccupied::Parathread( - ParathreadEntry { - claim: ParathreadClaim(self.para_id, collator.clone()), - retries, - } - ), - } - } -} - /// Validation data omitted from most candidate descriptor structs, as it can be derived from the /// relay-parent. #[derive(Clone, Encode, Decode)] diff --git a/runtime/parachains/src/inclusion.rs b/runtime/parachains/src/inclusion.rs index 07d2df50d1..0050e85724 100644 --- a/runtime/parachains/src/inclusion.rs +++ b/runtime/parachains/src/inclusion.rs @@ -25,7 +25,7 @@ use primitives::v1::{ validation_data_hash, ValidatorId, CandidateCommitments, CandidateDescriptor, ValidatorIndex, Id as ParaId, AvailabilityBitfield as AvailabilityBitfield, SignedAvailabilityBitfields, SigningContext, - BackedCandidate, CoreIndex, GroupIndex, CoreAssignment, CommittedCandidateReceipt, + BackedCandidate, CoreIndex, GroupIndex, CommittedCandidateReceipt, CandidateReceipt, HeadData, }; use frame_support::{ @@ -37,7 +37,7 @@ use bitvec::{order::Lsb0 as BitOrderLsb0, vec::BitVec}; use sp_staking::SessionIndex; use sp_runtime::{DispatchError, traits::{One, Saturating}}; -use crate::{configuration, paras}; +use crate::{configuration, paras, scheduler::CoreAssignment}; /// A bitfield signed by a validator indicating that it is keeping its piece of the erasure-coding /// for any backed candidates referred to by a `1` bit available. @@ -668,7 +668,6 @@ mod tests { use primitives::v1::{ SignedAvailabilityBitfield, CompactStatement as Statement, ValidityAttestation, CollatorId, CandidateCommitments, SignedStatement, CandidateDescriptor, ValidationCode, - AssignmentKind, }; use frame_support::traits::{OnFinalize, OnInitialize}; use keyring::Sr25519Keyring; @@ -680,6 +679,7 @@ mod tests { use crate::initializer::SessionChangeNotification; use crate::configuration::HostConfiguration; use crate::paras::ParaGenesisArgs; + use crate::scheduler::AssignmentKind; fn default_config() -> HostConfiguration { let mut config = HostConfiguration::default(); diff --git a/runtime/parachains/src/scheduler.rs b/runtime/parachains/src/scheduler.rs index a3ed466a2c..455a07f94e 100644 --- a/runtime/parachains/src/scheduler.rs +++ b/runtime/parachains/src/scheduler.rs @@ -38,7 +38,7 @@ use sp_std::prelude::*; use sp_std::convert::TryInto; use primitives::v1::{ - Id as ParaId, ValidatorIndex, CoreAssignment, CoreOccupied, CoreIndex, AssignmentKind, + Id as ParaId, ValidatorIndex, CoreOccupied, CoreIndex, CollatorId, GroupIndex, ParathreadClaim, ParathreadEntry, GroupRotationInfo, ScheduledCore, }; use frame_support::{ @@ -105,6 +105,54 @@ pub enum FreedReason { TimedOut, } + +/// The assignment type. +#[derive(Clone, Encode, Decode)] +#[cfg_attr(feature = "std", derive(PartialEq, Debug))] +pub enum AssignmentKind { + /// A parachain. + Parachain, + /// A parathread. + Parathread(CollatorId, u32), +} + +/// How a free core is scheduled to be assigned. +#[derive(Clone, Encode, Decode)] +#[cfg_attr(feature = "std", derive(PartialEq, Debug))] +pub struct CoreAssignment { + /// The core that is assigned. + pub core: CoreIndex, + /// The unique ID of the para that is assigned to the core. + pub para_id: ParaId, + /// The kind of the assignment. + pub kind: AssignmentKind, + /// The index of the validator group assigned to the core. + pub group_idx: GroupIndex, +} + +impl CoreAssignment { + /// Get the ID of a collator who is required to collate this block. + pub fn required_collator(&self) -> Option<&CollatorId> { + match self.kind { + AssignmentKind::Parachain => None, + AssignmentKind::Parathread(ref id, _) => Some(id), + } + } + + /// Get the `CoreOccupied` from this. + pub fn to_core_occupied(&self) -> CoreOccupied { + match self.kind { + AssignmentKind::Parachain => CoreOccupied::Parachain, + AssignmentKind::Parathread(ref collator, retries) => CoreOccupied::Parathread( + ParathreadEntry { + claim: ParathreadClaim(self.para_id, collator.clone()), + retries, + } + ), + } + } +} + pub trait Trait: frame_system::Trait + configuration::Trait + paras::Trait { } decl_storage! { -- GitLab From 25bf025be9657a2a58ed8f8853671d53e1353849 Mon Sep 17 00:00:00 2001 From: Sergei Shulepov Date: Mon, 17 Aug 2020 19:28:22 +0200 Subject: [PATCH 184/192] Promote `HrmpChannelId` and supply more docs (#1595) --- roadmap/implementers-guide/src/runtime/router.md | 6 ------ roadmap/implementers-guide/src/types/messages.md | 16 ++++++++++++++++ 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/roadmap/implementers-guide/src/runtime/router.md b/roadmap/implementers-guide/src/runtime/router.md index 55013fa03b..2bb4c0a77a 100644 --- a/roadmap/implementers-guide/src/runtime/router.md +++ b/roadmap/implementers-guide/src/runtime/router.md @@ -32,12 +32,6 @@ DownwardMessageQueues: map ParaId => Vec; HRMP related structs: ```rust,ignore -/// A type used to designate a HRMP channel between a (sender, recipient). -struct HrmpChannelId { - sender: ParaId, - recipient: ParaId, -} - /// A description of a request to open an HRMP channel. struct HrmpOpenChannelRequest { /// The sender and the initiator of this request. diff --git a/roadmap/implementers-guide/src/types/messages.md b/roadmap/implementers-guide/src/types/messages.md index af44166707..1bbe3f817d 100644 --- a/roadmap/implementers-guide/src/types/messages.md +++ b/roadmap/implementers-guide/src/types/messages.md @@ -5,6 +5,22 @@ Types of messages that are passed between parachains and the relay chain: UMP, D There is also HRMP (Horizontally Relay-routed Message Passing) which provides the same functionality although with smaller scalability potential. +## HrmpChannelId + +A type that uniquely identifies a HRMP channel. A HRMP channel is established between two paras. +In text, we use the notation `(A, B)` to specify a channel between A and B. The channels are +unidirectional, meaning that `(A, B)` and `(B, A)` refer to different channels. The convention is +that we use the first item tuple for the sender and the second for the recipient. Only one channel +is allowed between two participants in one direction, i.e. there cannot be 2 different channels +identified by `(A, B)`. + +```rust,ignore +struct HrmpChannelId { + sender: ParaId, + recipient: ParaId, +} +``` + ## Upward Message A type of messages dispatched from a parachain to the relay chain. -- GitLab From 62b9d4a575cc6844f589ccfbe3bcdc93a8b254a1 Mon Sep 17 00:00:00 2001 From: Shawn Tabrizi Date: Tue, 18 Aug 2020 10:04:52 +0200 Subject: [PATCH 185/192] Companion for Substrate 6868 (WeightInfo for System, Utility, and Timestamp) (#1606) * fix compile warning * remove tests for weights * add custom weights * "Update Substrate" Co-authored-by: parity-processbot <> --- Cargo.lock | 278 +++++++++--------- runtime/kusama/src/lib.rs | 6 +- runtime/kusama/src/weights/frame_system.rs | 58 ++++ runtime/kusama/src/weights/mod.rs | 3 + .../kusama/src/weights/pallet_timestamp.rs | 34 +++ runtime/kusama/src/weights/pallet_utility.rs | 35 +++ runtime/parachains/src/paras.rs | 1 + runtime/polkadot/src/lib.rs | 6 +- runtime/polkadot/src/weights/frame_system.rs | 58 ++++ runtime/polkadot/src/weights/mod.rs | 3 + .../polkadot/src/weights/pallet_timestamp.rs | 34 +++ .../polkadot/src/weights/pallet_utility.rs | 35 +++ runtime/polkadot/tests/weights.rs | 37 --- runtime/westend/src/lib.rs | 6 +- runtime/westend/src/weights/frame_system.rs | 58 ++++ runtime/westend/src/weights/mod.rs | 3 + .../westend/src/weights/pallet_timestamp.rs | 34 +++ runtime/westend/src/weights/pallet_utility.rs | 35 +++ 18 files changed, 539 insertions(+), 185 deletions(-) create mode 100644 runtime/kusama/src/weights/frame_system.rs create mode 100644 runtime/kusama/src/weights/pallet_timestamp.rs create mode 100644 runtime/kusama/src/weights/pallet_utility.rs create mode 100644 runtime/polkadot/src/weights/frame_system.rs create mode 100644 runtime/polkadot/src/weights/pallet_timestamp.rs create mode 100644 runtime/polkadot/src/weights/pallet_utility.rs create mode 100644 runtime/westend/src/weights/frame_system.rs create mode 100644 runtime/westend/src/weights/pallet_timestamp.rs create mode 100644 runtime/westend/src/weights/pallet_utility.rs diff --git a/Cargo.lock b/Cargo.lock index 0e8c4f8d04..900b257634 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1401,7 +1401,7 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "fork-tree" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" dependencies = [ "parity-scale-codec", ] @@ -1409,7 +1409,7 @@ dependencies = [ [[package]] name = "frame-benchmarking" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" dependencies = [ "frame-support", "frame-system", @@ -1426,7 +1426,7 @@ dependencies = [ [[package]] name = "frame-benchmarking-cli" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" dependencies = [ "frame-benchmarking", "parity-scale-codec", @@ -1444,7 +1444,7 @@ dependencies = [ [[package]] name = "frame-executive" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" dependencies = [ "frame-support", "frame-system", @@ -1459,7 +1459,7 @@ dependencies = [ [[package]] name = "frame-metadata" version = "11.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" dependencies = [ "parity-scale-codec", "serde", @@ -1470,7 +1470,7 @@ dependencies = [ [[package]] name = "frame-support" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" dependencies = [ "bitmask", "frame-metadata", @@ -1495,7 +1495,7 @@ dependencies = [ [[package]] name = "frame-support-procedural" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" dependencies = [ "frame-support-procedural-tools", "proc-macro2 1.0.18", @@ -1506,7 +1506,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" dependencies = [ "frame-support-procedural-tools-derive", "proc-macro-crate", @@ -1518,7 +1518,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools-derive" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" dependencies = [ "proc-macro2 1.0.18", "quote 1.0.7", @@ -1528,7 +1528,7 @@ dependencies = [ [[package]] name = "frame-system" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" dependencies = [ "frame-support", "impl-trait-for-tuples", @@ -1544,7 +1544,7 @@ dependencies = [ [[package]] name = "frame-system-benchmarking" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" dependencies = [ "frame-benchmarking", "frame-support", @@ -1558,7 +1558,7 @@ dependencies = [ [[package]] name = "frame-system-rpc-runtime-api" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" dependencies = [ "parity-scale-codec", "sp-api", @@ -3558,7 +3558,7 @@ dependencies = [ [[package]] name = "pallet-authority-discovery" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" dependencies = [ "frame-support", "frame-system", @@ -3574,7 +3574,7 @@ dependencies = [ [[package]] name = "pallet-authorship" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" dependencies = [ "frame-support", "frame-system", @@ -3589,7 +3589,7 @@ dependencies = [ [[package]] name = "pallet-babe" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" dependencies = [ "frame-benchmarking", "frame-support", @@ -3614,7 +3614,7 @@ dependencies = [ [[package]] name = "pallet-balances" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" dependencies = [ "frame-benchmarking", "frame-support", @@ -3628,7 +3628,7 @@ dependencies = [ [[package]] name = "pallet-collective" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" dependencies = [ "frame-benchmarking", "frame-support", @@ -3644,7 +3644,7 @@ dependencies = [ [[package]] name = "pallet-democracy" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" dependencies = [ "frame-benchmarking", "frame-support", @@ -3659,7 +3659,7 @@ dependencies = [ [[package]] name = "pallet-elections-phragmen" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" dependencies = [ "frame-benchmarking", "frame-support", @@ -3674,7 +3674,7 @@ dependencies = [ [[package]] name = "pallet-finality-tracker" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" dependencies = [ "frame-support", "frame-system", @@ -3690,7 +3690,7 @@ dependencies = [ [[package]] name = "pallet-grandpa" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" dependencies = [ "frame-benchmarking", "frame-support", @@ -3712,7 +3712,7 @@ dependencies = [ [[package]] name = "pallet-identity" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" dependencies = [ "enumflags2", "frame-benchmarking", @@ -3728,7 +3728,7 @@ dependencies = [ [[package]] name = "pallet-im-online" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" dependencies = [ "frame-benchmarking", "frame-support", @@ -3748,7 +3748,7 @@ dependencies = [ [[package]] name = "pallet-indices" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" dependencies = [ "frame-support", "frame-system", @@ -3764,7 +3764,7 @@ dependencies = [ [[package]] name = "pallet-membership" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" dependencies = [ "frame-support", "frame-system", @@ -3778,7 +3778,7 @@ dependencies = [ [[package]] name = "pallet-multisig" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" dependencies = [ "frame-support", "frame-system", @@ -3793,7 +3793,7 @@ dependencies = [ [[package]] name = "pallet-nicks" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" dependencies = [ "frame-support", "frame-system", @@ -3807,7 +3807,7 @@ dependencies = [ [[package]] name = "pallet-offences" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" dependencies = [ "frame-support", "frame-system", @@ -3822,7 +3822,7 @@ dependencies = [ [[package]] name = "pallet-offences-benchmarking" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" dependencies = [ "frame-benchmarking", "frame-support", @@ -3843,7 +3843,7 @@ dependencies = [ [[package]] name = "pallet-proxy" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" dependencies = [ "frame-support", "frame-system", @@ -3858,7 +3858,7 @@ dependencies = [ [[package]] name = "pallet-randomness-collective-flip" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" dependencies = [ "frame-support", "frame-system", @@ -3871,7 +3871,7 @@ dependencies = [ [[package]] name = "pallet-recovery" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" dependencies = [ "enumflags2", "frame-support", @@ -3886,7 +3886,7 @@ dependencies = [ [[package]] name = "pallet-scheduler" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" dependencies = [ "frame-benchmarking", "frame-support", @@ -3901,7 +3901,7 @@ dependencies = [ [[package]] name = "pallet-session" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" dependencies = [ "frame-support", "frame-system", @@ -3921,7 +3921,7 @@ dependencies = [ [[package]] name = "pallet-session-benchmarking" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" dependencies = [ "frame-benchmarking", "frame-support", @@ -3937,7 +3937,7 @@ dependencies = [ [[package]] name = "pallet-society" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" dependencies = [ "frame-support", "frame-system", @@ -3951,7 +3951,7 @@ dependencies = [ [[package]] name = "pallet-staking" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" dependencies = [ "frame-benchmarking", "frame-support", @@ -3973,7 +3973,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-curve" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -3984,7 +3984,7 @@ dependencies = [ [[package]] name = "pallet-sudo" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" dependencies = [ "frame-support", "frame-system", @@ -3998,7 +3998,7 @@ dependencies = [ [[package]] name = "pallet-timestamp" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" dependencies = [ "frame-benchmarking", "frame-support", @@ -4016,7 +4016,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" dependencies = [ "frame-support", "frame-system", @@ -4033,7 +4033,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" dependencies = [ "jsonrpc-core", "jsonrpc-core-client", @@ -4051,7 +4051,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc-runtime-api" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" dependencies = [ "frame-support", "parity-scale-codec", @@ -4064,7 +4064,7 @@ dependencies = [ [[package]] name = "pallet-treasury" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" dependencies = [ "frame-benchmarking", "frame-support", @@ -4079,7 +4079,7 @@ dependencies = [ [[package]] name = "pallet-utility" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" dependencies = [ "frame-benchmarking", "frame-support", @@ -4095,7 +4095,7 @@ dependencies = [ [[package]] name = "pallet-vesting" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" dependencies = [ "enumflags2", "frame-benchmarking", @@ -6319,7 +6319,7 @@ dependencies = [ [[package]] name = "sc-authority-discovery" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" dependencies = [ "bytes 0.5.5", "derive_more 0.99.9", @@ -6346,7 +6346,7 @@ dependencies = [ [[package]] name = "sc-basic-authorship" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6370,7 +6370,7 @@ dependencies = [ [[package]] name = "sc-block-builder" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" dependencies = [ "parity-scale-codec", "sc-client-api", @@ -6387,7 +6387,7 @@ dependencies = [ [[package]] name = "sc-chain-spec" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" dependencies = [ "impl-trait-for-tuples", "sc-chain-spec-derive", @@ -6403,7 +6403,7 @@ dependencies = [ [[package]] name = "sc-chain-spec-derive" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -6414,7 +6414,7 @@ dependencies = [ [[package]] name = "sc-cli" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" dependencies = [ "ansi_term 0.12.1", "atty", @@ -6455,7 +6455,7 @@ dependencies = [ [[package]] name = "sc-client-api" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" dependencies = [ "derive_more 0.99.9", "fnv", @@ -6491,7 +6491,7 @@ dependencies = [ [[package]] name = "sc-client-db" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" dependencies = [ "blake2-rfc", "hash-db", @@ -6521,7 +6521,7 @@ dependencies = [ [[package]] name = "sc-consensus" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" dependencies = [ "sc-client-api", "sp-blockchain", @@ -6532,7 +6532,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" dependencies = [ "derive_more 0.99.9", "fork-tree", @@ -6576,7 +6576,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe-rpc" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -6600,7 +6600,7 @@ dependencies = [ [[package]] name = "sc-consensus-epochs" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" dependencies = [ "fork-tree", "parity-scale-codec", @@ -6613,7 +6613,7 @@ dependencies = [ [[package]] name = "sc-consensus-slots" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6636,7 +6636,7 @@ dependencies = [ [[package]] name = "sc-consensus-uncles" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" dependencies = [ "log 0.4.11", "sc-client-api", @@ -6650,7 +6650,7 @@ dependencies = [ [[package]] name = "sc-executor" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" dependencies = [ "derive_more 0.99.9", "lazy_static", @@ -6678,7 +6678,7 @@ dependencies = [ [[package]] name = "sc-executor-common" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" dependencies = [ "derive_more 0.99.9", "log 0.4.11", @@ -6695,7 +6695,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmi" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" dependencies = [ "log 0.4.11", "parity-scale-codec", @@ -6710,7 +6710,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmtime" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" dependencies = [ "log 0.4.11", "parity-scale-codec", @@ -6728,7 +6728,7 @@ dependencies = [ [[package]] name = "sc-finality-grandpa" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" dependencies = [ "derive_more 0.99.9", "finality-grandpa", @@ -6765,7 +6765,7 @@ dependencies = [ [[package]] name = "sc-finality-grandpa-rpc" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" dependencies = [ "derive_more 0.99.9", "finality-grandpa", @@ -6786,7 +6786,7 @@ dependencies = [ [[package]] name = "sc-informant" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" dependencies = [ "ansi_term 0.12.1", "futures 0.3.5", @@ -6804,7 +6804,7 @@ dependencies = [ [[package]] name = "sc-keystore" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" dependencies = [ "derive_more 0.99.9", "hex", @@ -6820,7 +6820,7 @@ dependencies = [ [[package]] name = "sc-light" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" dependencies = [ "hash-db", "lazy_static", @@ -6839,7 +6839,7 @@ dependencies = [ [[package]] name = "sc-network" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" dependencies = [ "async-std", "bitflags", @@ -6892,7 +6892,7 @@ dependencies = [ [[package]] name = "sc-network-gossip" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6907,7 +6907,7 @@ dependencies = [ [[package]] name = "sc-network-test" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" dependencies = [ "env_logger", "futures 0.3.5", @@ -6934,7 +6934,7 @@ dependencies = [ [[package]] name = "sc-offchain" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" dependencies = [ "bytes 0.5.5", "fnv", @@ -6961,7 +6961,7 @@ dependencies = [ [[package]] name = "sc-peerset" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" dependencies = [ "futures 0.3.5", "libp2p", @@ -6974,7 +6974,7 @@ dependencies = [ [[package]] name = "sc-proposer-metrics" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" dependencies = [ "log 0.4.11", "substrate-prometheus-endpoint", @@ -6983,7 +6983,7 @@ dependencies = [ [[package]] name = "sc-rpc" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" dependencies = [ "futures 0.3.5", "hash-db", @@ -7015,7 +7015,7 @@ dependencies = [ [[package]] name = "sc-rpc-api" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -7039,7 +7039,7 @@ dependencies = [ [[package]] name = "sc-rpc-server" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" dependencies = [ "jsonrpc-core", "jsonrpc-http-server", @@ -7055,7 +7055,7 @@ dependencies = [ [[package]] name = "sc-service" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" dependencies = [ "derive_more 0.99.9", "directories", @@ -7116,7 +7116,7 @@ dependencies = [ [[package]] name = "sc-state-db" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" dependencies = [ "log 0.4.11", "parity-scale-codec", @@ -7130,7 +7130,7 @@ dependencies = [ [[package]] name = "sc-telemetry" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -7151,7 +7151,7 @@ dependencies = [ [[package]] name = "sc-tracing" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" dependencies = [ "erased-serde", "log 0.4.11", @@ -7169,7 +7169,7 @@ dependencies = [ [[package]] name = "sc-transaction-graph" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -7190,7 +7190,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -7657,7 +7657,7 @@ dependencies = [ [[package]] name = "sp-allocator" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" dependencies = [ "derive_more 0.99.9", "log 0.4.11", @@ -7669,7 +7669,7 @@ dependencies = [ [[package]] name = "sp-api" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" dependencies = [ "hash-db", "parity-scale-codec", @@ -7684,7 +7684,7 @@ dependencies = [ [[package]] name = "sp-api-proc-macro" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" dependencies = [ "blake2-rfc", "proc-macro-crate", @@ -7696,7 +7696,7 @@ dependencies = [ [[package]] name = "sp-application-crypto" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" dependencies = [ "parity-scale-codec", "serde", @@ -7708,7 +7708,7 @@ dependencies = [ [[package]] name = "sp-arithmetic" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" dependencies = [ "integer-sqrt", "num-traits 0.2.12", @@ -7721,7 +7721,7 @@ dependencies = [ [[package]] name = "sp-authority-discovery" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" dependencies = [ "parity-scale-codec", "sp-api", @@ -7733,7 +7733,7 @@ dependencies = [ [[package]] name = "sp-authorship" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" dependencies = [ "parity-scale-codec", "sp-inherents", @@ -7744,7 +7744,7 @@ dependencies = [ [[package]] name = "sp-block-builder" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" dependencies = [ "parity-scale-codec", "sp-api", @@ -7756,7 +7756,7 @@ dependencies = [ [[package]] name = "sp-blockchain" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" dependencies = [ "derive_more 0.99.9", "log 0.4.11", @@ -7773,7 +7773,7 @@ dependencies = [ [[package]] name = "sp-chain-spec" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" dependencies = [ "serde", "serde_json", @@ -7782,7 +7782,7 @@ dependencies = [ [[package]] name = "sp-consensus" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -7808,7 +7808,7 @@ dependencies = [ [[package]] name = "sp-consensus-aura" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" dependencies = [ "parity-scale-codec", "sp-api", @@ -7822,7 +7822,7 @@ dependencies = [ [[package]] name = "sp-consensus-babe" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" dependencies = [ "merlin", "parity-scale-codec", @@ -7841,7 +7841,7 @@ dependencies = [ [[package]] name = "sp-consensus-slots" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" dependencies = [ "parity-scale-codec", "sp-runtime", @@ -7850,7 +7850,7 @@ dependencies = [ [[package]] name = "sp-consensus-vrf" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" dependencies = [ "parity-scale-codec", "schnorrkel", @@ -7862,7 +7862,7 @@ dependencies = [ [[package]] name = "sp-core" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" dependencies = [ "base58", "blake2-rfc", @@ -7906,7 +7906,7 @@ dependencies = [ [[package]] name = "sp-database" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" dependencies = [ "kvdb", "parking_lot 0.10.2", @@ -7915,7 +7915,7 @@ dependencies = [ [[package]] name = "sp-debug-derive" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" dependencies = [ "proc-macro2 1.0.18", "quote 1.0.7", @@ -7925,7 +7925,7 @@ dependencies = [ [[package]] name = "sp-externalities" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" dependencies = [ "environmental", "parity-scale-codec", @@ -7936,7 +7936,7 @@ dependencies = [ [[package]] name = "sp-finality-grandpa" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" dependencies = [ "finality-grandpa", "log 0.4.11", @@ -7952,7 +7952,7 @@ dependencies = [ [[package]] name = "sp-finality-tracker" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" dependencies = [ "parity-scale-codec", "sp-inherents", @@ -7962,7 +7962,7 @@ dependencies = [ [[package]] name = "sp-inherents" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" dependencies = [ "derive_more 0.99.9", "parity-scale-codec", @@ -7974,7 +7974,7 @@ dependencies = [ [[package]] name = "sp-io" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" dependencies = [ "futures 0.3.5", "hash-db", @@ -7995,7 +7995,7 @@ dependencies = [ [[package]] name = "sp-keyring" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" dependencies = [ "lazy_static", "sp-core", @@ -8006,7 +8006,7 @@ dependencies = [ [[package]] name = "sp-npos-elections" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" dependencies = [ "parity-scale-codec", "serde", @@ -8018,7 +8018,7 @@ dependencies = [ [[package]] name = "sp-npos-elections-compact" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -8029,7 +8029,7 @@ dependencies = [ [[package]] name = "sp-offchain" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" dependencies = [ "sp-api", "sp-core", @@ -8039,7 +8039,7 @@ dependencies = [ [[package]] name = "sp-panic-handler" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" dependencies = [ "backtrace", "log 0.4.11", @@ -8048,7 +8048,7 @@ dependencies = [ [[package]] name = "sp-rpc" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" dependencies = [ "serde", "sp-core", @@ -8057,7 +8057,7 @@ dependencies = [ [[package]] name = "sp-runtime" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" dependencies = [ "either", "hash256-std-hasher", @@ -8079,7 +8079,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" dependencies = [ "parity-scale-codec", "primitive-types", @@ -8094,7 +8094,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" dependencies = [ "Inflector", "proc-macro-crate", @@ -8106,7 +8106,7 @@ dependencies = [ [[package]] name = "sp-serializer" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" dependencies = [ "serde", "serde_json", @@ -8115,7 +8115,7 @@ dependencies = [ [[package]] name = "sp-session" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" dependencies = [ "parity-scale-codec", "sp-api", @@ -8128,7 +8128,7 @@ dependencies = [ [[package]] name = "sp-staking" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" dependencies = [ "parity-scale-codec", "sp-runtime", @@ -8138,7 +8138,7 @@ dependencies = [ [[package]] name = "sp-state-machine" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" dependencies = [ "hash-db", "itertools 0.9.0", @@ -8159,12 +8159,12 @@ dependencies = [ [[package]] name = "sp-std" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" [[package]] name = "sp-storage" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" dependencies = [ "impl-serde 0.2.3", "ref-cast", @@ -8176,7 +8176,7 @@ dependencies = [ [[package]] name = "sp-timestamp" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -8190,7 +8190,7 @@ dependencies = [ [[package]] name = "sp-tracing" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" dependencies = [ "log 0.4.11", "rental", @@ -8200,7 +8200,7 @@ dependencies = [ [[package]] name = "sp-transaction-pool" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -8215,7 +8215,7 @@ dependencies = [ [[package]] name = "sp-trie" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" dependencies = [ "hash-db", "memory-db", @@ -8229,7 +8229,7 @@ dependencies = [ [[package]] name = "sp-utils" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" dependencies = [ "futures 0.3.5", "futures-core", @@ -8241,7 +8241,7 @@ dependencies = [ [[package]] name = "sp-version" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" dependencies = [ "impl-serde 0.2.3", "parity-scale-codec", @@ -8253,7 +8253,7 @@ dependencies = [ [[package]] name = "sp-wasm-interface" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -8384,7 +8384,7 @@ dependencies = [ [[package]] name = "substrate-browser-utils" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" dependencies = [ "chrono", "console_error_panic_hook", @@ -8410,7 +8410,7 @@ dependencies = [ [[package]] name = "substrate-build-script-utils" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" dependencies = [ "platforms", ] @@ -8418,7 +8418,7 @@ dependencies = [ [[package]] name = "substrate-frame-rpc-system" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" dependencies = [ "frame-system-rpc-runtime-api", "futures 0.3.5", @@ -8441,7 +8441,7 @@ dependencies = [ [[package]] name = "substrate-prometheus-endpoint" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" dependencies = [ "async-std", "derive_more 0.99.9", @@ -8455,7 +8455,7 @@ dependencies = [ [[package]] name = "substrate-test-client" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" dependencies = [ "futures 0.1.29", "futures 0.3.5", @@ -8481,7 +8481,7 @@ dependencies = [ [[package]] name = "substrate-test-runtime" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" dependencies = [ "cfg-if", "frame-executive", @@ -8521,7 +8521,7 @@ dependencies = [ [[package]] name = "substrate-test-runtime-client" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" dependencies = [ "futures 0.3.5", "parity-scale-codec", @@ -8542,7 +8542,7 @@ dependencies = [ [[package]] name = "substrate-test-utils" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" dependencies = [ "futures 0.3.5", "substrate-test-utils-derive", @@ -8552,7 +8552,7 @@ dependencies = [ [[package]] name = "substrate-test-utils-derive" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" dependencies = [ "proc-macro-crate", "quote 1.0.7", @@ -8562,7 +8562,7 @@ dependencies = [ [[package]] name = "substrate-wasm-builder-runner" version = "1.0.6" -source = "git+https://github.com/paritytech/substrate#488b7c7286d4ca9cedd047a5e2c2381736a3f088" +source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" [[package]] name = "substrate-wasm-builder-runner" diff --git a/runtime/kusama/src/lib.rs b/runtime/kusama/src/lib.rs index 8f7c165239..4ad493d35c 100644 --- a/runtime/kusama/src/lib.rs +++ b/runtime/kusama/src/lib.rs @@ -148,7 +148,7 @@ impl frame_system::Trait for Runtime { type AccountData = pallet_balances::AccountData; type OnNewAccount = (); type OnKilledAccount = (); - type SystemWeightInfo = (); + type SystemWeightInfo = weights::frame_system::WeightInfo; } impl pallet_scheduler::Trait for Runtime { @@ -241,7 +241,7 @@ impl pallet_timestamp::Trait for Runtime { type Moment = u64; type OnTimestampSet = Babe; type MinimumPeriod = MinimumPeriod; - type WeightInfo = (); + type WeightInfo = weights::pallet_timestamp::WeightInfo; } parameter_types! { @@ -668,7 +668,7 @@ impl pallet_identity::Trait for Runtime { impl pallet_utility::Trait for Runtime { type Event = Event; type Call = Call; - type WeightInfo = (); + type WeightInfo = weights::pallet_utility::WeightInfo; } parameter_types! { diff --git a/runtime/kusama/src/weights/frame_system.rs b/runtime/kusama/src/weights/frame_system.rs new file mode 100644 index 0000000000..9522fa7520 --- /dev/null +++ b/runtime/kusama/src/weights/frame_system.rs @@ -0,0 +1,58 @@ +// This file is part of Substrate. + +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 2.0.0-rc5 + +#![allow(unused_parens)] + +use frame_support::weights::{Weight, constants::RocksDbWeight as DbWeight}; + +pub struct WeightInfo; +impl frame_system::WeightInfo for WeightInfo { + // WARNING! Some components were not used: ["b"] + fn remark() -> Weight { + (1305000 as Weight) + } + fn set_heap_pages() -> Weight { + (2023000 as Weight) + .saturating_add(DbWeight::get().writes(1 as Weight)) + } + // WARNING! Some components were not used: ["d"] + fn set_changes_trie_config() -> Weight { + (10026000 as Weight) + .saturating_add(DbWeight::get().reads(1 as Weight)) + .saturating_add(DbWeight::get().writes(2 as Weight)) + } + fn set_storage(i: u32, ) -> Weight { + (0 as Weight) + .saturating_add((656000 as Weight).saturating_mul(i as Weight)) + .saturating_add(DbWeight::get().writes((1 as Weight).saturating_mul(i as Weight))) + } + fn kill_storage(i: u32, ) -> Weight { + (4327000 as Weight) + .saturating_add((478000 as Weight).saturating_mul(i as Weight)) + .saturating_add(DbWeight::get().writes((1 as Weight).saturating_mul(i as Weight))) + } + fn kill_prefix(p: u32, ) -> Weight { + (8349000 as Weight) + .saturating_add((838000 as Weight).saturating_mul(p as Weight)) + .saturating_add(DbWeight::get().writes((1 as Weight).saturating_mul(p as Weight))) + } + fn suicide() -> Weight { + (29247000 as Weight) + } +} diff --git a/runtime/kusama/src/weights/mod.rs b/runtime/kusama/src/weights/mod.rs index fb7c53c603..76435a1f67 100644 --- a/runtime/kusama/src/weights/mod.rs +++ b/runtime/kusama/src/weights/mod.rs @@ -16,5 +16,8 @@ /// A collection of weight modules used for pallets in the runtime. +pub mod frame_system; pub mod pallet_balances; pub mod pallet_democracy; +pub mod pallet_timestamp; +pub mod pallet_utility; diff --git a/runtime/kusama/src/weights/pallet_timestamp.rs b/runtime/kusama/src/weights/pallet_timestamp.rs new file mode 100644 index 0000000000..cfd5f192d3 --- /dev/null +++ b/runtime/kusama/src/weights/pallet_timestamp.rs @@ -0,0 +1,34 @@ +// Copyright (C) 2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 2.0.0-rc5 + +#![allow(unused_parens)] + +use frame_support::weights::{Weight, constants::RocksDbWeight as DbWeight}; + +pub struct WeightInfo; +impl pallet_timestamp::WeightInfo for WeightInfo { + // WARNING! Some components were not used: ["t"] + fn set() -> Weight { + (9133000 as Weight) + .saturating_add(DbWeight::get().reads(2 as Weight)) + .saturating_add(DbWeight::get().writes(1 as Weight)) + } + // WARNING! Some components were not used: ["t"] + fn on_finalize() -> Weight { + (5915000 as Weight) + } +} diff --git a/runtime/kusama/src/weights/pallet_utility.rs b/runtime/kusama/src/weights/pallet_utility.rs new file mode 100644 index 0000000000..c9ae0d7d23 --- /dev/null +++ b/runtime/kusama/src/weights/pallet_utility.rs @@ -0,0 +1,35 @@ +// This file is part of Substrate. + +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 2.0.0-rc5 + +#![allow(unused_parens)] +#![allow(unused_imports)] + +use frame_support::weights::{Weight, constants::RocksDbWeight as DbWeight}; + +pub struct WeightInfo; +impl pallet_utility::WeightInfo for WeightInfo { + fn batch(c: u32, ) -> Weight { + (16461000 as Weight) + .saturating_add((1982000 as Weight).saturating_mul(c as Weight)) + } + // WARNING! Some components were not used: ["u"] + fn as_derivative() -> Weight { + (4086000 as Weight) + } +} diff --git a/runtime/parachains/src/paras.rs b/runtime/parachains/src/paras.rs index b1e48ca3ce..abc69d0bce 100644 --- a/runtime/parachains/src/paras.rs +++ b/runtime/parachains/src/paras.rs @@ -24,6 +24,7 @@ //! only occur at session boundaries. use sp_std::prelude::*; +#[cfg(feature = "std")] use sp_std::marker::PhantomData; use sp_runtime::traits::{One, BlakeTwo256, Hash as HashT, Saturating}; use primitives::v1::{ diff --git a/runtime/polkadot/src/lib.rs b/runtime/polkadot/src/lib.rs index f45757ac66..9974d3b154 100644 --- a/runtime/polkadot/src/lib.rs +++ b/runtime/polkadot/src/lib.rs @@ -163,7 +163,7 @@ impl frame_system::Trait for Runtime { type AccountData = pallet_balances::AccountData; type OnNewAccount = (); type OnKilledAccount = (); - type SystemWeightInfo = (); + type SystemWeightInfo = weights::frame_system::WeightInfo; } impl pallet_scheduler::Trait for Runtime { @@ -256,7 +256,7 @@ impl pallet_timestamp::Trait for Runtime { type Moment = u64; type OnTimestampSet = Babe; type MinimumPeriod = MinimumPeriod; - type WeightInfo = (); + type WeightInfo = weights::pallet_timestamp::WeightInfo; } parameter_types! { @@ -714,7 +714,7 @@ impl pallet_vesting::Trait for Runtime { impl pallet_utility::Trait for Runtime { type Event = Event; type Call = Call; - type WeightInfo = (); + type WeightInfo = weights::pallet_utility::WeightInfo; } parameter_types! { diff --git a/runtime/polkadot/src/weights/frame_system.rs b/runtime/polkadot/src/weights/frame_system.rs new file mode 100644 index 0000000000..9522fa7520 --- /dev/null +++ b/runtime/polkadot/src/weights/frame_system.rs @@ -0,0 +1,58 @@ +// This file is part of Substrate. + +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 2.0.0-rc5 + +#![allow(unused_parens)] + +use frame_support::weights::{Weight, constants::RocksDbWeight as DbWeight}; + +pub struct WeightInfo; +impl frame_system::WeightInfo for WeightInfo { + // WARNING! Some components were not used: ["b"] + fn remark() -> Weight { + (1305000 as Weight) + } + fn set_heap_pages() -> Weight { + (2023000 as Weight) + .saturating_add(DbWeight::get().writes(1 as Weight)) + } + // WARNING! Some components were not used: ["d"] + fn set_changes_trie_config() -> Weight { + (10026000 as Weight) + .saturating_add(DbWeight::get().reads(1 as Weight)) + .saturating_add(DbWeight::get().writes(2 as Weight)) + } + fn set_storage(i: u32, ) -> Weight { + (0 as Weight) + .saturating_add((656000 as Weight).saturating_mul(i as Weight)) + .saturating_add(DbWeight::get().writes((1 as Weight).saturating_mul(i as Weight))) + } + fn kill_storage(i: u32, ) -> Weight { + (4327000 as Weight) + .saturating_add((478000 as Weight).saturating_mul(i as Weight)) + .saturating_add(DbWeight::get().writes((1 as Weight).saturating_mul(i as Weight))) + } + fn kill_prefix(p: u32, ) -> Weight { + (8349000 as Weight) + .saturating_add((838000 as Weight).saturating_mul(p as Weight)) + .saturating_add(DbWeight::get().writes((1 as Weight).saturating_mul(p as Weight))) + } + fn suicide() -> Weight { + (29247000 as Weight) + } +} diff --git a/runtime/polkadot/src/weights/mod.rs b/runtime/polkadot/src/weights/mod.rs index fb7c53c603..76435a1f67 100644 --- a/runtime/polkadot/src/weights/mod.rs +++ b/runtime/polkadot/src/weights/mod.rs @@ -16,5 +16,8 @@ /// A collection of weight modules used for pallets in the runtime. +pub mod frame_system; pub mod pallet_balances; pub mod pallet_democracy; +pub mod pallet_timestamp; +pub mod pallet_utility; diff --git a/runtime/polkadot/src/weights/pallet_timestamp.rs b/runtime/polkadot/src/weights/pallet_timestamp.rs new file mode 100644 index 0000000000..cfd5f192d3 --- /dev/null +++ b/runtime/polkadot/src/weights/pallet_timestamp.rs @@ -0,0 +1,34 @@ +// Copyright (C) 2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 2.0.0-rc5 + +#![allow(unused_parens)] + +use frame_support::weights::{Weight, constants::RocksDbWeight as DbWeight}; + +pub struct WeightInfo; +impl pallet_timestamp::WeightInfo for WeightInfo { + // WARNING! Some components were not used: ["t"] + fn set() -> Weight { + (9133000 as Weight) + .saturating_add(DbWeight::get().reads(2 as Weight)) + .saturating_add(DbWeight::get().writes(1 as Weight)) + } + // WARNING! Some components were not used: ["t"] + fn on_finalize() -> Weight { + (5915000 as Weight) + } +} diff --git a/runtime/polkadot/src/weights/pallet_utility.rs b/runtime/polkadot/src/weights/pallet_utility.rs new file mode 100644 index 0000000000..c9ae0d7d23 --- /dev/null +++ b/runtime/polkadot/src/weights/pallet_utility.rs @@ -0,0 +1,35 @@ +// This file is part of Substrate. + +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 2.0.0-rc5 + +#![allow(unused_parens)] +#![allow(unused_imports)] + +use frame_support::weights::{Weight, constants::RocksDbWeight as DbWeight}; + +pub struct WeightInfo; +impl pallet_utility::WeightInfo for WeightInfo { + fn batch(c: u32, ) -> Weight { + (16461000 as Weight) + .saturating_add((1982000 as Weight).saturating_mul(c as Weight)) + } + // WARNING! Some components were not used: ["u"] + fn as_derivative() -> Weight { + (4086000 as Weight) + } +} diff --git a/runtime/polkadot/tests/weights.rs b/runtime/polkadot/tests/weights.rs index 5cbdaf82ab..3583a614e3 100644 --- a/runtime/polkadot/tests/weights.rs +++ b/runtime/polkadot/tests/weights.rs @@ -50,15 +50,6 @@ fn sanity_check_weight_per_time_constants_are_as_expected() { assert_eq!(WEIGHT_PER_NANOS, WEIGHT_PER_MICROS / 1000); } -#[test] -fn weight_of_timestamp_set_is_correct() { - // #[weight = T::DbWeight::get().reads_writes(2, 1) + 8_000_000] - let expected_weight = (2 * DbWeight::get().read) + DbWeight::get().write + 8_000_000; - let weight = polkadot_runtime::TimestampCall::set::(Default::default()).get_dispatch_info().weight; - - assert_eq!(weight, expected_weight); -} - #[test] fn weight_of_staking_bond_is_correct() { let controller: AccountId = AccountKeyring::Alice.into(); @@ -105,34 +96,6 @@ fn weight_of_system_set_code_is_correct() { assert_eq!(weight, expected_weight); } -#[test] -fn weight_of_system_set_storage_is_correct() { - let storage_items = vec![(vec![12], vec![34]), (vec![45], vec![83])]; - let len = storage_items.len() as Weight; - - // #[weight = FunctionOf( - // |(items,): (&Vec,)| { - // T::DbWeight::get().writes(items.len() as Weight) - // .saturating_add((items.len() as Weight).saturating_mul(600_000)) - // }, - // DispatchClass::Operational, - // Pays::Yes, - // )] - let expected_weight = (DbWeight::get().write * len).saturating_add(len.saturating_mul(600_000)); - let weight = SystemCall::set_storage::(storage_items).get_dispatch_info().weight; - - assert_eq!(weight, expected_weight); -} - -#[test] -fn weight_of_system_remark_is_correct() { - // #[weight = 700_000] - let expected_weight = 700_000; - let weight = SystemCall::remark::(vec![]).get_dispatch_info().weight; - - assert_eq!(weight, expected_weight); -} - #[test] fn weight_of_session_set_keys_is_correct() { // #[weight = 200_000_000 diff --git a/runtime/westend/src/lib.rs b/runtime/westend/src/lib.rs index 7c2b40f08c..518bb71d44 100644 --- a/runtime/westend/src/lib.rs +++ b/runtime/westend/src/lib.rs @@ -139,7 +139,7 @@ impl frame_system::Trait for Runtime { type AccountData = pallet_balances::AccountData; type OnNewAccount = (); type OnKilledAccount = (); - type SystemWeightInfo = (); + type SystemWeightInfo = weights::frame_system::WeightInfo; } impl pallet_scheduler::Trait for Runtime { @@ -224,7 +224,7 @@ impl pallet_timestamp::Trait for Runtime { type Moment = u64; type OnTimestampSet = Babe; type MinimumPeriod = MinimumPeriod; - type WeightInfo = (); + type WeightInfo = weights::pallet_timestamp::WeightInfo; } parameter_types! { @@ -482,7 +482,7 @@ impl pallet_identity::Trait for Runtime { impl pallet_utility::Trait for Runtime { type Event = Event; type Call = Call; - type WeightInfo = (); + type WeightInfo = weights::pallet_utility::WeightInfo; } parameter_types! { diff --git a/runtime/westend/src/weights/frame_system.rs b/runtime/westend/src/weights/frame_system.rs new file mode 100644 index 0000000000..9522fa7520 --- /dev/null +++ b/runtime/westend/src/weights/frame_system.rs @@ -0,0 +1,58 @@ +// This file is part of Substrate. + +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 2.0.0-rc5 + +#![allow(unused_parens)] + +use frame_support::weights::{Weight, constants::RocksDbWeight as DbWeight}; + +pub struct WeightInfo; +impl frame_system::WeightInfo for WeightInfo { + // WARNING! Some components were not used: ["b"] + fn remark() -> Weight { + (1305000 as Weight) + } + fn set_heap_pages() -> Weight { + (2023000 as Weight) + .saturating_add(DbWeight::get().writes(1 as Weight)) + } + // WARNING! Some components were not used: ["d"] + fn set_changes_trie_config() -> Weight { + (10026000 as Weight) + .saturating_add(DbWeight::get().reads(1 as Weight)) + .saturating_add(DbWeight::get().writes(2 as Weight)) + } + fn set_storage(i: u32, ) -> Weight { + (0 as Weight) + .saturating_add((656000 as Weight).saturating_mul(i as Weight)) + .saturating_add(DbWeight::get().writes((1 as Weight).saturating_mul(i as Weight))) + } + fn kill_storage(i: u32, ) -> Weight { + (4327000 as Weight) + .saturating_add((478000 as Weight).saturating_mul(i as Weight)) + .saturating_add(DbWeight::get().writes((1 as Weight).saturating_mul(i as Weight))) + } + fn kill_prefix(p: u32, ) -> Weight { + (8349000 as Weight) + .saturating_add((838000 as Weight).saturating_mul(p as Weight)) + .saturating_add(DbWeight::get().writes((1 as Weight).saturating_mul(p as Weight))) + } + fn suicide() -> Weight { + (29247000 as Weight) + } +} diff --git a/runtime/westend/src/weights/mod.rs b/runtime/westend/src/weights/mod.rs index b94314e339..28ffb05612 100644 --- a/runtime/westend/src/weights/mod.rs +++ b/runtime/westend/src/weights/mod.rs @@ -16,4 +16,7 @@ /// A collection of weight modules used for pallets in the runtime. +pub mod frame_system; pub mod pallet_balances; +pub mod pallet_timestamp; +pub mod pallet_utility; diff --git a/runtime/westend/src/weights/pallet_timestamp.rs b/runtime/westend/src/weights/pallet_timestamp.rs new file mode 100644 index 0000000000..cfd5f192d3 --- /dev/null +++ b/runtime/westend/src/weights/pallet_timestamp.rs @@ -0,0 +1,34 @@ +// Copyright (C) 2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 2.0.0-rc5 + +#![allow(unused_parens)] + +use frame_support::weights::{Weight, constants::RocksDbWeight as DbWeight}; + +pub struct WeightInfo; +impl pallet_timestamp::WeightInfo for WeightInfo { + // WARNING! Some components were not used: ["t"] + fn set() -> Weight { + (9133000 as Weight) + .saturating_add(DbWeight::get().reads(2 as Weight)) + .saturating_add(DbWeight::get().writes(1 as Weight)) + } + // WARNING! Some components were not used: ["t"] + fn on_finalize() -> Weight { + (5915000 as Weight) + } +} diff --git a/runtime/westend/src/weights/pallet_utility.rs b/runtime/westend/src/weights/pallet_utility.rs new file mode 100644 index 0000000000..c9ae0d7d23 --- /dev/null +++ b/runtime/westend/src/weights/pallet_utility.rs @@ -0,0 +1,35 @@ +// This file is part of Substrate. + +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 2.0.0-rc5 + +#![allow(unused_parens)] +#![allow(unused_imports)] + +use frame_support::weights::{Weight, constants::RocksDbWeight as DbWeight}; + +pub struct WeightInfo; +impl pallet_utility::WeightInfo for WeightInfo { + fn batch(c: u32, ) -> Weight { + (16461000 as Weight) + .saturating_add((1982000 as Weight).saturating_mul(c as Weight)) + } + // WARNING! Some components were not used: ["u"] + fn as_derivative() -> Weight { + (4086000 as Weight) + } +} -- GitLab From 804958ab4568cb3a379558504e1b164e9c7c7bcc Mon Sep 17 00:00:00 2001 From: Andronik Ordian Date: Tue, 18 Aug 2020 11:18:54 +0200 Subject: [PATCH 186/192] initial prometheus metrics (#1536) * service-new: cosmetic changes * overseer: draft of prometheus metrics * metrics: update active_leaves metrics * metrics: extract into functions * metrics: resolve XXX * metrics: it's ugly, but it works * Bump Substrate * metrics: move a bunch of code around * Bumb substrate again * metrics: fix a warning * fix a warning in runtime * metrics: statements signed * metrics: statements impl RegisterMetrics * metrics: refactor Metrics trait * metrics: add Metrics assoc type to JobTrait * metrics: move Metrics trait to util * metrics: fix overseer * metrics: fix backing * metrics: fix candidate validation * metrics: derive Default * metrics: docs * metrics: add stubs for other subsystems * metrics: add more stubs and fix compilation * metrics: fix doctest * metrics: move to subsystem * metrics: fix candidate validation * metrics: bitfield signing * metrics: av store * metrics: chain API * metrics: runtime API * metrics: stub for avad * metrics: candidates seconded * metrics: ok I gave up * metrics: provisioner * metrics: remove a clone by requiring Metrics: Sync * metrics: YAGNI * metrics: remove another TODO * metrics: for later * metrics: add parachain_ prefix * metrics: s/signed_statement/signed_statements * utils: add a comment for job metrics * metrics: address review comments * metrics: oops * metrics: make sure to save files before commit :sweat_smile: * use _total suffix for requests metrics Co-authored-by: Max Inden * metrics: add tests for overseer * update Cargo.lock * overseer: add a test for CollationGeneration * collation-generation: impl metrics * collation-generation: use kebab-case for name * collation-generation: add a constructor Co-authored-by: Gav Wood Co-authored-by: Ashley Ruglys Co-authored-by: Max Inden --- Cargo.lock | 1 + node/collation-generation/src/lib.rs | 62 +++++- node/core/av-store/src/lib.rs | 66 +++++-- node/core/backing/src/lib.rs | 60 +++++- node/core/bitfield-signing/src/lib.rs | 36 ++++ node/core/candidate-validation/src/lib.rs | 93 +++++++-- node/core/chain-api/src/lib.rs | 69 ++++++- node/core/provisioner/src/lib.rs | 67 +++++-- node/core/runtime-api/src/lib.rs | 90 +++++++-- .../availability-distribution/src/lib.rs | 2 + node/network/bitfield-distribution/src/lib.rs | 2 + node/network/bridge/src/lib.rs | 2 + node/network/pov-distribution/src/lib.rs | 2 + .../network/statement-distribution/src/lib.rs | 2 + node/overseer/examples/minimal-example.rs | 5 + node/overseer/src/lib.rs | 176 +++++++++++++++++- node/service/src/lib.rs | 9 +- node/subsystem-util/src/lib.rs | 53 ++++-- node/subsystem/Cargo.toml | 1 + node/subsystem/src/lib.rs | 50 ++++- 20 files changed, 742 insertions(+), 106 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 900b257634..7c998fc0a5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4861,6 +4861,7 @@ dependencies = [ "sc-network", "smallvec 1.4.1", "sp-core", + "substrate-prometheus-endpoint", ] [[package]] diff --git a/node/collation-generation/src/lib.rs b/node/collation-generation/src/lib.rs index 3ad76ff7f7..793616d907 100644 --- a/node/collation-generation/src/lib.rs +++ b/node/collation-generation/src/lib.rs @@ -31,6 +31,7 @@ use polkadot_node_subsystem::{ errors::RuntimeApiError, messages::{AllMessages, CollationGenerationMessage, CollatorProtocolMessage}, FromOverseer, SpawnedSubsystem, Subsystem, SubsystemContext, SubsystemError, SubsystemResult, + metrics::{self, prometheus}, }; use polkadot_node_subsystem_util::{ self as util, request_availability_cores_ctx, request_global_validation_data_ctx, @@ -47,9 +48,18 @@ use std::sync::Arc; /// Collation Generation Subsystem pub struct CollationGenerationSubsystem { config: Option>, + metrics: Metrics, } impl CollationGenerationSubsystem { + /// Create a new instance of the `CollationGenerationSubsystem`. + pub fn new(metrics: Metrics) -> Self { + Self { + config: None, + metrics, + } + } + /// Run this subsystem /// /// Conceptually, this is very simple: it just loops forever. @@ -112,8 +122,9 @@ impl CollationGenerationSubsystem { Ok(Signal(ActiveLeaves(ActiveLeavesUpdate { activated, .. }))) => { // follow the procedure from the guide if let Some(config) = &self.config { + let metrics = self.metrics.clone(); if let Err(err) = - handle_new_activations(config.clone(), &activated, ctx, sender).await + handle_new_activations(config.clone(), &activated, ctx, metrics, sender).await { log::warn!(target: "collation_generation", "failed to handle new activations: {:?}", err); return true; @@ -146,13 +157,13 @@ impl Subsystem for CollationGenerationSubsystem where Context: SubsystemContext, { - fn start(self, ctx: Context) -> SpawnedSubsystem { - let subsystem = CollationGenerationSubsystem { config: None }; + type Metrics = Metrics; - let future = Box::pin(subsystem.run(ctx)); + fn start(self, ctx: Context) -> SpawnedSubsystem { + let future = Box::pin(self.run(ctx)); SpawnedSubsystem { - name: "CollationGenerationSubsystem", + name: "collation-generation-subsystem", future, } } @@ -178,6 +189,7 @@ async fn handle_new_activations( config: Arc, activated: &[Hash], ctx: &mut Context, + metrics: Metrics, sender: &mpsc::Sender, ) -> Result<()> { // follow the procedure from the guide: @@ -230,6 +242,7 @@ async fn handle_new_activations( let task_global_validation_data = global_validation_data.clone(); let task_config = config.clone(); let mut task_sender = sender.clone(); + let metrics = metrics.clone(); ctx.spawn("collation generation collation builder", Box::pin(async move { let validation_data_hash = validation_data_hash(&task_global_validation_data, &local_validation_data); @@ -273,6 +286,8 @@ async fn handle_new_activations( }, }; + metrics.on_collation_generated(); + if let Err(err) = task_sender.send(AllMessages::CollatorProtocol( CollatorProtocolMessage::DistributeCollation(ccr, collation.proof_of_validity) )).await { @@ -305,6 +320,38 @@ fn erasure_root( Ok(polkadot_erasure_coding::branches(&chunks).root()) } +#[derive(Clone)] +struct MetricsInner { + collations_generated_total: prometheus::Counter, +} + +/// CollationGenerationSubsystem metrics. +#[derive(Default, Clone)] +pub struct Metrics(Option); + +impl Metrics { + fn on_collation_generated(&self) { + if let Some(metrics) = &self.0 { + metrics.collations_generated_total.inc(); + } + } +} + +impl metrics::Metrics for Metrics { + fn try_register(registry: &prometheus::Registry) -> std::result::Result { + let metrics = MetricsInner { + collations_generated_total: prometheus::register( + prometheus::Counter::new( + "parachain_collations_generated_total", + "Number of collations generated." + )?, + registry, + )?, + }; + Ok(Metrics(Some(metrics))) + } +} + #[cfg(test)] mod tests { mod handle_new_activations { @@ -411,6 +458,7 @@ mod tests { test_config(123), &subsystem_activated_hashes, &mut ctx, + Metrics(None), &tx, ) .await @@ -498,7 +546,7 @@ mod tests { let (tx, _rx) = mpsc::channel(0); subsystem_test_harness(overseer, |mut ctx| async move { - handle_new_activations(test_config(16), &activated_hashes, &mut ctx, &tx) + handle_new_activations(test_config(16), &activated_hashes, &mut ctx, Metrics(None), &tx) .await .unwrap(); }); @@ -581,7 +629,7 @@ mod tests { let sent_messages = Arc::new(Mutex::new(Vec::new())); let subsystem_sent_messages = sent_messages.clone(); subsystem_test_harness(overseer, |mut ctx| async move { - handle_new_activations(subsystem_config, &activated_hashes, &mut ctx, &tx) + handle_new_activations(subsystem_config, &activated_hashes, &mut ctx, Metrics(None), &tx) .await .unwrap(); diff --git a/node/core/av-store/src/lib.rs b/node/core/av-store/src/lib.rs index 9c33052afc..84381e438e 100644 --- a/node/core/av-store/src/lib.rs +++ b/node/core/av-store/src/lib.rs @@ -34,6 +34,7 @@ use polkadot_primitives::v1::{ }; use polkadot_subsystem::{ FromOverseer, SubsystemError, Subsystem, SubsystemContext, SpawnedSubsystem, + metrics::{self, prometheus}, }; use polkadot_subsystem::messages::AvailabilityStoreMessage; @@ -59,6 +60,7 @@ enum Error { /// An implementation of the Availability Store subsystem. pub struct AvailabilityStoreSubsystem { inner: Arc, + metrics: Metrics, } fn available_data_key(candidate_hash: &Hash) -> Vec { @@ -85,7 +87,7 @@ pub struct Config { impl AvailabilityStoreSubsystem { /// Create a new `AvailabilityStoreSubsystem` with a given config on disk. - pub fn new_on_disk(config: Config) -> io::Result { + pub fn new_on_disk(config: Config, metrics: Metrics) -> io::Result { let mut db_config = DatabaseConfig::with_columns(columns::NUM_COLUMNS); if let Some(cache_size) = config.cache_size { @@ -106,6 +108,7 @@ impl AvailabilityStoreSubsystem { Ok(Self { inner: Arc::new(db), + metrics, }) } @@ -113,6 +116,7 @@ impl AvailabilityStoreSubsystem { fn new_in_memory(inner: Arc) -> Self { Self { inner, + metrics: Metrics(None), } } } @@ -130,7 +134,7 @@ where Ok(FromOverseer::Signal(Conclude)) => break, Ok(FromOverseer::Signal(_)) => (), Ok(FromOverseer::Communication { msg }) => { - process_message(&subsystem.inner, msg)?; + process_message(&subsystem.inner, &subsystem.metrics, msg)?; } Err(_) => break, } @@ -142,7 +146,7 @@ where Ok(()) } -fn process_message(db: &Arc, msg: AvailabilityStoreMessage) -> Result<(), Error> { +fn process_message(db: &Arc, metrics: &Metrics, msg: AvailabilityStoreMessage) -> Result<(), Error> { use AvailabilityStoreMessage::*; match msg { QueryAvailableData(hash, tx) => { @@ -152,10 +156,10 @@ fn process_message(db: &Arc, msg: AvailabilityStoreMessage) -> R tx.send(available_data(db, &hash).is_some()).map_err(|_| oneshot::Canceled)?; } QueryChunk(hash, id, tx) => { - tx.send(get_chunk(db, &hash, id)?).map_err(|_| oneshot::Canceled)?; + tx.send(get_chunk(db, &hash, id, metrics)?).map_err(|_| oneshot::Canceled)?; } QueryChunkAvailability(hash, id, tx) => { - tx.send(get_chunk(db, &hash, id)?.is_some()).map_err(|_| oneshot::Canceled)?; + tx.send(get_chunk(db, &hash, id, metrics)?.is_some()).map_err(|_| oneshot::Canceled)?; } StoreChunk(hash, id, chunk, tx) => { match store_chunk(db, &hash, id, chunk) { @@ -169,7 +173,7 @@ fn process_message(db: &Arc, msg: AvailabilityStoreMessage) -> R } } StoreAvailableData(hash, id, n_validators, av_data, tx) => { - match store_available_data(db, &hash, id, n_validators, av_data) { + match store_available_data(db, &hash, id, n_validators, av_data, metrics) { Err(e) => { tx.send(Err(())).map_err(|_| oneshot::Canceled)?; return Err(e); @@ -194,11 +198,12 @@ fn store_available_data( id: Option, n_validators: u32, available_data: AvailableData, + metrics: &Metrics, ) -> Result<(), Error> { let mut tx = DBTransaction::new(); if let Some(index) = id { - let chunks = get_chunks(&available_data, n_validators as usize)?; + let chunks = get_chunks(&available_data, n_validators as usize, metrics)?; store_chunk(db, candidate_hash, n_validators, chunks[index as usize].clone())?; } @@ -231,7 +236,7 @@ fn store_chunk(db: &Arc, candidate_hash: &Hash, _n_validators: u Ok(()) } -fn get_chunk(db: &Arc, candidate_hash: &Hash, index: u32) +fn get_chunk(db: &Arc, candidate_hash: &Hash, index: u32, metrics: &Metrics) -> Result, Error> { if let Some(chunk) = query_inner( @@ -242,7 +247,7 @@ fn get_chunk(db: &Arc, candidate_hash: &Hash, index: u32) } if let Some(data) = available_data(db, candidate_hash) { - let mut chunks = get_chunks(&data.data, data.n_validators as usize)?; + let mut chunks = get_chunks(&data.data, data.n_validators as usize, metrics)?; let desired_chunk = chunks.get(index as usize).cloned(); for chunk in chunks.drain(..) { store_chunk(db, candidate_hash, data.n_validators, chunk)?; @@ -271,6 +276,8 @@ impl Subsystem for AvailabilityStoreSubsystem where Context: SubsystemContext, { + type Metrics = Metrics; + fn start(self, ctx: Context) -> SpawnedSubsystem { let future = Box::pin(async move { if let Err(e) = run(self, ctx).await { @@ -285,8 +292,9 @@ impl Subsystem for AvailabilityStoreSubsystem } } -fn get_chunks(data: &AvailableData, n_validators: usize) -> Result, Error> { +fn get_chunks(data: &AvailableData, n_validators: usize, metrics: &Metrics) -> Result, Error> { let chunks = erasure::obtain_chunks_v1(n_validators, data)?; + metrics.on_chunks_received(chunks.len()); let branches = erasure::branches(chunks.as_ref()); Ok(chunks @@ -302,6 +310,41 @@ fn get_chunks(data: &AvailableData, n_validators: usize) -> Result, +} + +/// Availability metrics. +#[derive(Default, Clone)] +pub struct Metrics(Option); + +impl Metrics { + fn on_chunks_received(&self, count: usize) { + if let Some(metrics) = &self.0 { + use core::convert::TryFrom as _; + // assume usize fits into u64 + let by = u64::try_from(count).unwrap_or_default(); + metrics.received_availability_chunks_total.inc_by(by); + } + } +} + +impl metrics::Metrics for Metrics { + fn try_register(registry: &prometheus::Registry) -> Result { + let metrics = MetricsInner { + received_availability_chunks_total: prometheus::register( + prometheus::Counter::new( + "parachain_received_availability_chunks_total", + "Number of availability chunks received.", + )?, + registry, + )?, + }; + Ok(Metrics(Some(metrics))) + } +} + #[cfg(test)] mod tests { use super::*; @@ -501,7 +544,8 @@ mod tests { omitted_validation, }; - let chunks_expected = get_chunks(&available_data, n_validators as usize).unwrap(); + let no_metrics = Metrics(None); + let chunks_expected = get_chunks(&available_data, n_validators as usize, &no_metrics).unwrap(); let (tx, rx) = oneshot::channel(); let block_msg = AvailabilityStoreMessage::StoreAvailableData( diff --git a/node/core/backing/src/lib.rs b/node/core/backing/src/lib.rs index a77d98cd23..30a95965eb 100644 --- a/node/core/backing/src/lib.rs +++ b/node/core/backing/src/lib.rs @@ -45,6 +45,7 @@ use polkadot_subsystem::{ ProvisionerMessage, RuntimeApiMessage, StatementDistributionMessage, ValidationFailed, RuntimeApiRequest, }, + metrics::{self, prometheus}, }; use polkadot_node_subsystem_util::{ self as util, @@ -100,6 +101,7 @@ struct CandidateBackingJob { reported_misbehavior_for: HashSet, table: Table, table_context: TableContext, + metrics: Metrics, } const fn group_quorum(n_validators: usize) -> usize { @@ -432,6 +434,7 @@ impl CandidateBackingJob { &candidate, pov, ).await { + self.metrics.on_candidate_seconded(); self.seconded = Some(candidate_hash); } } @@ -528,7 +531,9 @@ impl CandidateBackingJob { } fn sign_statement(&self, statement: Statement) -> Option { - Some(self.table_context.validator.as_ref()?.sign(statement)) + let signed = self.table_context.validator.as_ref()?.sign(statement); + self.metrics.on_statement_signed(); + Some(signed) } fn check_statement_signature(&self, statement: &SignedFullStatement) -> Result<(), Error> { @@ -672,12 +677,14 @@ impl util::JobTrait for CandidateBackingJob { type FromJob = FromJob; type Error = Error; type RunArgs = KeyStorePtr; + type Metrics = Metrics; const NAME: &'static str = "CandidateBackingJob"; fn run( parent: Hash, keystore: KeyStorePtr, + metrics: Metrics, rx_to: mpsc::Receiver, mut tx_from: mpsc::Sender, ) -> Pin> + Send>> { @@ -764,6 +771,7 @@ impl util::JobTrait for CandidateBackingJob { reported_misbehavior_for: HashSet::new(), table: Table::default(), table_context, + metrics, }; job.run_loop().await @@ -772,7 +780,53 @@ impl util::JobTrait for CandidateBackingJob { } } -delegated_subsystem!(CandidateBackingJob(KeyStorePtr) <- ToJob as CandidateBackingSubsystem); +#[derive(Clone)] +struct MetricsInner { + signed_statements_total: prometheus::Counter, + candidates_seconded_total: prometheus::Counter +} + +/// Candidate backing metrics. +#[derive(Default, Clone)] +pub struct Metrics(Option); + +impl Metrics { + fn on_statement_signed(&self) { + if let Some(metrics) = &self.0 { + metrics.signed_statements_total.inc(); + } + } + + fn on_candidate_seconded(&self) { + if let Some(metrics) = &self.0 { + metrics.candidates_seconded_total.inc(); + } + } +} + +impl metrics::Metrics for Metrics { + fn try_register(registry: &prometheus::Registry) -> Result { + let metrics = MetricsInner { + signed_statements_total: prometheus::register( + prometheus::Counter::new( + "parachain_signed_statements_total", + "Number of statements signed.", + )?, + registry, + )?, + candidates_seconded_total: prometheus::register( + prometheus::Counter::new( + "parachain_candidates_seconded_total", + "Number of candidates seconded.", + )?, + registry, + )?, + }; + Ok(Metrics(Some(metrics))) + } +} + +delegated_subsystem!(CandidateBackingJob(KeyStorePtr, Metrics) <- ToJob as CandidateBackingSubsystem); #[cfg(test)] mod tests { @@ -904,7 +958,7 @@ mod tests { let (context, virtual_overseer) = polkadot_node_subsystem_test_helpers::make_subsystem_context(pool.clone()); - let subsystem = CandidateBackingSubsystem::run(context, keystore, pool.clone()); + let subsystem = CandidateBackingSubsystem::run(context, keystore, Metrics(None), pool.clone()); let test_fut = test(TestHarness { virtual_overseer, diff --git a/node/core/bitfield-signing/src/lib.rs b/node/core/bitfield-signing/src/lib.rs index feca8f0c8f..66badf3d18 100644 --- a/node/core/bitfield-signing/src/lib.rs +++ b/node/core/bitfield-signing/src/lib.rs @@ -29,6 +29,7 @@ use polkadot_node_subsystem::{ BitfieldSigningMessage, CandidateBackingMessage, RuntimeApiMessage, }, errors::RuntimeApiError, + metrics::{self, prometheus}, }; use polkadot_node_subsystem_util::{ self as util, JobManager, JobTrait, ToJobTrait, Validator @@ -252,11 +253,44 @@ async fn construct_availability_bitfield( } } +#[derive(Clone)] +struct MetricsInner { + bitfields_signed_total: prometheus::Counter, +} + +/// Bitfield signing metrics. +#[derive(Default, Clone)] +pub struct Metrics(Option); + +impl Metrics { + fn on_bitfield_signed(&self) { + if let Some(metrics) = &self.0 { + metrics.bitfields_signed_total.inc(); + } + } +} + +impl metrics::Metrics for Metrics { + fn try_register(registry: &prometheus::Registry) -> Result { + let metrics = MetricsInner { + bitfields_signed_total: prometheus::register( + prometheus::Counter::new( + "parachain_bitfields_signed_total", + "Number of bitfields signed.", + )?, + registry, + )?, + }; + Ok(Metrics(Some(metrics))) + } +} + impl JobTrait for BitfieldSigningJob { type ToJob = ToJob; type FromJob = FromJob; type Error = Error; type RunArgs = KeyStorePtr; + type Metrics = Metrics; const NAME: &'static str = "BitfieldSigningJob"; @@ -264,6 +298,7 @@ impl JobTrait for BitfieldSigningJob { fn run( relay_parent: Hash, keystore: Self::RunArgs, + metrics: Self::Metrics, _receiver: mpsc::Receiver, mut sender: mpsc::Sender, ) -> Pin> + Send>> { @@ -295,6 +330,7 @@ impl JobTrait for BitfieldSigningJob { }; let signed_bitfield = validator.sign(bitfield); + metrics.on_bitfield_signed(); // make an anonymous scope to contain some use statements to simplify creating the outbound message { diff --git a/node/core/candidate-validation/src/lib.rs b/node/core/candidate-validation/src/lib.rs index 179f9be309..bb832ee195 100644 --- a/node/core/candidate-validation/src/lib.rs +++ b/node/core/candidate-validation/src/lib.rs @@ -23,9 +23,11 @@ use polkadot_subsystem::{ Subsystem, SubsystemContext, SpawnedSubsystem, SubsystemResult, FromOverseer, OverseerSignal, -}; -use polkadot_subsystem::messages::{ - AllMessages, CandidateValidationMessage, RuntimeApiMessage, ValidationFailed, RuntimeApiRequest, + messages::{ + AllMessages, CandidateValidationMessage, RuntimeApiMessage, + ValidationFailed, RuntimeApiRequest, + }, + metrics::{self, prometheus}, }; use polkadot_subsystem::errors::RuntimeApiError; use polkadot_node_primitives::{ValidationResult, ValidationOutputs, InvalidCandidate}; @@ -45,13 +47,63 @@ use futures::prelude::*; use std::sync::Arc; +const LOG_TARGET: &'static str = "candidate_validation"; + /// The candidate validation subsystem. -pub struct CandidateValidationSubsystem(S); +pub struct CandidateValidationSubsystem { + spawn: S, + metrics: Metrics, +} + +#[derive(Clone)] +struct MetricsInner { + validation_requests: prometheus::CounterVec, +} + +/// Candidate validation metrics. +#[derive(Default, Clone)] +pub struct Metrics(Option); + +impl Metrics { + fn on_validation_event(&self, event: &Result) { + if let Some(metrics) = &self.0 { + match event { + Ok(ValidationResult::Valid(_)) => { + metrics.validation_requests.with_label_values(&["valid"]).inc(); + }, + Ok(ValidationResult::Invalid(_)) => { + metrics.validation_requests.with_label_values(&["invalid"]).inc(); + }, + Err(_) => { + metrics.validation_requests.with_label_values(&["failed"]).inc(); + }, + } + } + } +} + +impl metrics::Metrics for Metrics { + fn try_register(registry: &prometheus::Registry) -> Result { + let metrics = MetricsInner { + validation_requests: prometheus::register( + prometheus::CounterVec::new( + prometheus::Opts::new( + "parachain_validation_requests_total", + "Number of validation requests served.", + ), + &["valid", "invalid", "failed"], + )?, + registry, + )?, + }; + Ok(Metrics(Some(metrics))) + } +} impl CandidateValidationSubsystem { /// Create a new `CandidateValidationSubsystem` with the given task spawner. - pub fn new(spawn: S) -> Self { - CandidateValidationSubsystem(spawn) + pub fn new(spawn: S, metrics: Metrics) -> Self { + CandidateValidationSubsystem { spawn, metrics } } } @@ -59,10 +111,12 @@ impl Subsystem for CandidateValidationSubsystem where C: SubsystemContext, S: SpawnNamed + Clone + 'static, { + type Metrics = Metrics; + fn start(self, ctx: C) -> SpawnedSubsystem { SpawnedSubsystem { name: "candidate-validation-subsystem", - future: run(ctx, self.0).map(|_| ()).boxed(), + future: run(ctx, self.spawn, self.metrics).map(|_| ()).boxed(), } } } @@ -70,6 +124,7 @@ impl Subsystem for CandidateValidationSubsystem where async fn run( mut ctx: impl SubsystemContext, spawn: impl SpawnNamed + Clone + 'static, + metrics: Metrics, ) -> SubsystemResult<()> { @@ -95,8 +150,11 @@ async fn run( ).await; match res { - Ok(x) => { let _ = response_sender.send(x); } - Err(e)=> return Err(e), + Ok(x) => { + metrics.on_validation_event(&x); + let _ = response_sender.send(x); + } + Err(e) => return Err(e), } } CandidateValidationMessage::ValidateFromExhaustive( @@ -117,13 +175,16 @@ async fn run( ).await; match res { - Ok(x) => if let Err(_e) = response_sender.send(x) { - log::warn!( - target: "candidate_validation", - "Requester of candidate validation dropped", - ) + Ok(x) => { + metrics.on_validation_event(&x); + if let Err(_e) = response_sender.send(x) { + log::warn!( + target: LOG_TARGET, + "Requester of candidate validation dropped", + ) + } }, - Err(e)=> return Err(e), + Err(e) => return Err(e), } } } @@ -237,7 +298,7 @@ async fn spawn_validate_from_chain_state( Ok(g) => g, Err(e) => { log::warn!( - target: "candidate_validation", + target: LOG_TARGET, "Error making runtime API request: {:?}", e, ); diff --git a/node/core/chain-api/src/lib.rs b/node/core/chain-api/src/lib.rs index 20213e3c08..d3be1c4bf4 100644 --- a/node/core/chain-api/src/lib.rs +++ b/node/core/chain-api/src/lib.rs @@ -30,6 +30,7 @@ use polkadot_subsystem::{ FromOverseer, OverseerSignal, SpawnedSubsystem, Subsystem, SubsystemResult, SubsystemContext, messages::ChainApiMessage, + metrics::{self, prometheus}, }; use polkadot_primitives::v1::{Block, BlockId}; use sp_blockchain::HeaderBackend; @@ -39,13 +40,15 @@ use futures::prelude::*; /// The Chain API Subsystem implementation. pub struct ChainApiSubsystem { client: Client, + metrics: Metrics, } impl ChainApiSubsystem { /// Create a new Chain API subsystem with the given client. - pub fn new(client: Client) -> Self { + pub fn new(client: Client, metrics: Metrics) -> Self { ChainApiSubsystem { - client + client, + metrics, } } } @@ -54,9 +57,11 @@ impl Subsystem for ChainApiSubsystem where Client: HeaderBackend + 'static, Context: SubsystemContext { + type Metrics = Metrics; + fn start(self, ctx: Context) -> SpawnedSubsystem { SpawnedSubsystem { - future: run(ctx, self.client).map(|_| ()).boxed(), + future: run(ctx, self).map(|_| ()).boxed(), name: "chain-api-subsystem", } } @@ -64,7 +69,7 @@ impl Subsystem for ChainApiSubsystem where async fn run( mut ctx: impl SubsystemContext, - client: Client, + subsystem: ChainApiSubsystem, ) -> SubsystemResult<()> where Client: HeaderBackend, @@ -76,23 +81,27 @@ where FromOverseer::Signal(OverseerSignal::BlockFinalized(_)) => {}, FromOverseer::Communication { msg } => match msg { ChainApiMessage::BlockNumber(hash, response_channel) => { - let result = client.number(hash).map_err(|e| e.to_string().into()); + let result = subsystem.client.number(hash).map_err(|e| e.to_string().into()); + subsystem.metrics.on_request(result.is_ok()); let _ = response_channel.send(result); }, ChainApiMessage::FinalizedBlockHash(number, response_channel) => { // Note: we don't verify it's finalized - let result = client.hash(number).map_err(|e| e.to_string().into()); + let result = subsystem.client.hash(number).map_err(|e| e.to_string().into()); + subsystem.metrics.on_request(result.is_ok()); let _ = response_channel.send(result); }, ChainApiMessage::FinalizedBlockNumber(response_channel) => { - let result = client.info().finalized_number; + let result = subsystem.client.info().finalized_number; + // always succeeds + subsystem.metrics.on_request(true); let _ = response_channel.send(Ok(result)); }, ChainApiMessage::Ancestors { hash, k, response_channel } => { let mut hash = hash; let next_parent = core::iter::from_fn(|| { - let maybe_header = client.header(BlockId::Hash(hash)); + let maybe_header = subsystem.client.header(BlockId::Hash(hash)); match maybe_header { // propagate the error Err(e) => Some(Err(e.to_string().into())), @@ -106,6 +115,7 @@ where }); let result = next_parent.take(k).collect::, _>>(); + subsystem.metrics.on_request(result.is_ok()); let _ = response_channel.send(result); }, } @@ -113,6 +123,46 @@ where } } +#[derive(Clone)] +struct MetricsInner { + chain_api_requests: prometheus::CounterVec, +} + +/// Chain API metrics. +#[derive(Default, Clone)] +pub struct Metrics(Option); + +impl Metrics { + fn on_request(&self, succeeded: bool) { + if let Some(metrics) = &self.0 { + if succeeded { + metrics.chain_api_requests.with_label_values(&["succeeded"]).inc(); + } else { + metrics.chain_api_requests.with_label_values(&["failed"]).inc(); + } + } + } +} + +impl metrics::Metrics for Metrics { + fn try_register(registry: &prometheus::Registry) -> Result { + let metrics = MetricsInner { + chain_api_requests: prometheus::register( + prometheus::CounterVec::new( + prometheus::Opts::new( + "parachain_chain_api_requests_total", + "Number of Chain API requests served.", + ), + &["succeeded", "failed"], + )?, + registry, + )?, + }; + Ok(Metrics(Some(metrics))) + } +} + + #[cfg(test)] mod tests { use super::*; @@ -238,7 +288,8 @@ mod tests { let (ctx, ctx_handle) = make_subsystem_context(TaskExecutor::new()); let client = TestClient::default(); - let chain_api_task = run(ctx, client.clone()).map(|x| x.unwrap()); + let subsystem = ChainApiSubsystem::new(client.clone(), Metrics(None)); + let chain_api_task = run(ctx, subsystem).map(|x| x.unwrap()); let test_task = test(client, ctx_handle); futures::executor::block_on(future::join(chain_api_task, test_task)); diff --git a/node/core/provisioner/src/lib.rs b/node/core/provisioner/src/lib.rs index 9a92858a9e..ef93d15ab8 100644 --- a/node/core/provisioner/src/lib.rs +++ b/node/core/provisioner/src/lib.rs @@ -30,6 +30,7 @@ use polkadot_node_subsystem::{ AllMessages, ChainApiMessage, ProvisionableData, ProvisionerInherentData, ProvisionerMessage, RuntimeApiMessage, }, + metrics::{self, prometheus}, }; use polkadot_node_subsystem_util::{ self as util, @@ -50,6 +51,7 @@ struct ProvisioningJob { provisionable_data_channels: Vec>, backed_candidates: Vec, signed_bitfields: Vec, + metrics: Metrics, } /// This enum defines the messages that the provisioner is prepared to receive. @@ -134,6 +136,7 @@ impl JobTrait for ProvisioningJob { type FromJob = FromJob; type Error = Error; type RunArgs = (); + type Metrics = Metrics; const NAME: &'static str = "ProvisioningJob"; @@ -143,11 +146,12 @@ impl JobTrait for ProvisioningJob { fn run( relay_parent: Hash, _run_args: Self::RunArgs, + metrics: Self::Metrics, receiver: mpsc::Receiver, sender: mpsc::Sender, ) -> Pin> + Send>> { async move { - let job = ProvisioningJob::new(relay_parent, sender, receiver); + let job = ProvisioningJob::new(relay_parent, metrics, sender, receiver); // it isn't necessary to break run_loop into its own function, // but it's convenient to separate the concerns in this way @@ -160,6 +164,7 @@ impl JobTrait for ProvisioningJob { impl ProvisioningJob { pub fn new( relay_parent: Hash, + metrics: Metrics, sender: mpsc::Sender, receiver: mpsc::Receiver, ) -> Self { @@ -170,6 +175,7 @@ impl ProvisioningJob { provisionable_data_channels: Vec::new(), backed_candidates: Vec::new(), signed_bitfields: Vec::new(), + metrics, } } @@ -190,7 +196,10 @@ impl ProvisioningJob { ) .await { - log::warn!(target: "provisioner", "failed to send inherent data: {:?}", err); + log::warn!(target: "provisioner", "failed to assemble or send inherent data: {:?}", err); + self.metrics.on_inherent_data_request(false); + } else { + self.metrics.on_inherent_data_request(true); } } ToJob::Provisioner(RequestBlockAuthorshipData(_, sender)) => { @@ -275,17 +284,9 @@ async fn send_inherent_data( return_sender: oneshot::Sender, mut from_job: mpsc::Sender, ) -> Result<(), Error> { - let availability_cores = match request_availability_cores(relay_parent, &mut from_job) - .await? + let availability_cores = request_availability_cores(relay_parent, &mut from_job) .await? - { - Ok(cores) => cores, - Err(runtime_err) => { - // Don't take down the node on runtime API errors. - log::warn!(target: "provisioner", "Encountered a runtime API error: {:?}", runtime_err); - return Ok(()); - } - }; + .await??; let bitfields = select_availability_bitfields(&availability_cores, bitfields); let candidates = select_candidates( @@ -467,7 +468,47 @@ fn bitfields_indicate_availability( 3 * availability.count_ones() >= 2 * availability.len() } -delegated_subsystem!(ProvisioningJob(()) <- ToJob as ProvisioningSubsystem); +#[derive(Clone)] +struct MetricsInner { + inherent_data_requests: prometheus::CounterVec, +} + +/// Candidate backing metrics. +#[derive(Default, Clone)] +pub struct Metrics(Option); + +impl Metrics { + fn on_inherent_data_request(&self, succeeded: bool) { + if let Some(metrics) = &self.0 { + if succeeded { + metrics.inherent_data_requests.with_label_values(&["succeded"]).inc(); + } else { + metrics.inherent_data_requests.with_label_values(&["failed"]).inc(); + } + } + } +} + +impl metrics::Metrics for Metrics { + fn try_register(registry: &prometheus::Registry) -> Result { + let metrics = MetricsInner { + inherent_data_requests: prometheus::register( + prometheus::CounterVec::new( + prometheus::Opts::new( + "parachain_inherent_data_requests_total", + "Number of InherentData requests served by provisioner.", + ), + &["succeeded", "failed"], + )?, + registry, + )?, + }; + Ok(Metrics(Some(metrics))) + } +} + + +delegated_subsystem!(ProvisioningJob((), Metrics) <- ToJob as ProvisioningSubsystem); #[cfg(test)] mod tests { diff --git a/node/core/runtime-api/src/lib.rs b/node/core/runtime-api/src/lib.rs index 9b93bb914b..dd5f247eb0 100644 --- a/node/core/runtime-api/src/lib.rs +++ b/node/core/runtime-api/src/lib.rs @@ -22,6 +22,7 @@ use polkadot_subsystem::{ Subsystem, SpawnedSubsystem, SubsystemResult, SubsystemContext, FromOverseer, OverseerSignal, + metrics::{self, prometheus}, }; use polkadot_subsystem::messages::{ RuntimeApiMessage, RuntimeApiRequest as Request, @@ -34,12 +35,15 @@ use sp_api::{ProvideRuntimeApi}; use futures::prelude::*; /// The `RuntimeApiSubsystem`. See module docs for more details. -pub struct RuntimeApiSubsystem(Client); +pub struct RuntimeApiSubsystem { + client: Client, + metrics: Metrics, +} impl RuntimeApiSubsystem { - /// Create a new Runtime API subsystem wrapping the given client. - pub fn new(client: Client) -> Self { - RuntimeApiSubsystem(client) + /// Create a new Runtime API subsystem wrapping the given client and metrics. + pub fn new(client: Client, metrics: Metrics) -> Self { + RuntimeApiSubsystem { client, metrics } } } @@ -48,9 +52,11 @@ impl Subsystem for RuntimeApiSubsystem where Client::Api: ParachainHost, Context: SubsystemContext { + type Metrics = Metrics; + fn start(self, ctx: Context) -> SpawnedSubsystem { SpawnedSubsystem { - future: run(ctx, self.0).map(|_| ()).boxed(), + future: run(ctx, self).map(|_| ()).boxed(), name: "runtime-api-subsystem", } } @@ -58,7 +64,7 @@ impl Subsystem for RuntimeApiSubsystem where async fn run( mut ctx: impl SubsystemContext, - client: Client, + subsystem: RuntimeApiSubsystem, ) -> SubsystemResult<()> where Client: ProvideRuntimeApi, Client::Api: ParachainHost, @@ -70,7 +76,8 @@ async fn run( FromOverseer::Signal(OverseerSignal::BlockFinalized(_)) => {}, FromOverseer::Communication { msg } => match msg { RuntimeApiMessage::Request(relay_parent, request) => make_runtime_api_request( - &client, + &subsystem.client, + &subsystem.metrics, relay_parent, request, ), @@ -81,6 +88,7 @@ async fn run( fn make_runtime_api_request( client: &Client, + metrics: &Metrics, relay_parent: Hash, request: Request, ) where @@ -93,7 +101,7 @@ fn make_runtime_api_request( let api = client.runtime_api(); let res = api.$api_name(&BlockId::Hash(relay_parent), $($param),*) .map_err(|e| RuntimeApiError::from(format!("{:?}", e))); - + metrics.on_request(res.is_ok()); let _ = sender.send(res); }} } @@ -114,6 +122,45 @@ fn make_runtime_api_request( } } +#[derive(Clone)] +struct MetricsInner { + chain_api_requests: prometheus::CounterVec, +} + +/// Runtime API metrics. +#[derive(Default, Clone)] +pub struct Metrics(Option); + +impl Metrics { + fn on_request(&self, succeeded: bool) { + if let Some(metrics) = &self.0 { + if succeeded { + metrics.chain_api_requests.with_label_values(&["succeeded"]).inc(); + } else { + metrics.chain_api_requests.with_label_values(&["failed"]).inc(); + } + } + } +} + +impl metrics::Metrics for Metrics { + fn try_register(registry: &prometheus::Registry) -> Result { + let metrics = MetricsInner { + chain_api_requests: prometheus::register( + prometheus::CounterVec::new( + prometheus::Opts::new( + "parachain_runtime_api_requests_total", + "Number of Runtime API requests served.", + ), + &["succeeded", "failed"], + )?, + registry, + )?, + }; + Ok(Metrics(Some(metrics))) + } +} + #[cfg(test)] mod tests { use super::*; @@ -216,7 +263,8 @@ mod tests { let runtime_api = MockRuntimeApi::default(); let relay_parent = [1; 32].into(); - let subsystem_task = run(ctx, runtime_api.clone()).map(|x| x.unwrap()); + let subsystem = RuntimeApiSubsystem::new(runtime_api.clone(), Metrics(None)); + let subsystem_task = run(ctx, subsystem).map(|x| x.unwrap()); let test_task = async move { let (tx, rx) = oneshot::channel(); @@ -238,7 +286,8 @@ mod tests { let runtime_api = MockRuntimeApi::default(); let relay_parent = [1; 32].into(); - let subsystem_task = run(ctx, runtime_api.clone()).map(|x| x.unwrap()); + let subsystem = RuntimeApiSubsystem::new(runtime_api.clone(), Metrics(None)); + let subsystem_task = run(ctx, subsystem).map(|x| x.unwrap()); let test_task = async move { let (tx, rx) = oneshot::channel(); @@ -260,7 +309,8 @@ mod tests { let runtime_api = MockRuntimeApi::default(); let relay_parent = [1; 32].into(); - let subsystem_task = run(ctx, runtime_api.clone()).map(|x| x.unwrap()); + let subsystem = RuntimeApiSubsystem::new(runtime_api.clone(), Metrics(None)); + let subsystem_task = run(ctx, subsystem).map(|x| x.unwrap()); let test_task = async move { let (tx, rx) = oneshot::channel(); @@ -282,7 +332,8 @@ mod tests { let runtime_api = MockRuntimeApi::default(); let relay_parent = [1; 32].into(); - let subsystem_task = run(ctx, runtime_api.clone()).map(|x| x.unwrap()); + let subsystem = RuntimeApiSubsystem::new(runtime_api.clone(), Metrics(None)); + let subsystem_task = run(ctx, subsystem).map(|x| x.unwrap()); let test_task = async move { let (tx, rx) = oneshot::channel(); @@ -308,7 +359,8 @@ mod tests { runtime_api.local_validation_data.insert(para_a, Default::default()); - let subsystem_task = run(ctx, runtime_api.clone()).map(|x| x.unwrap()); + let subsystem = RuntimeApiSubsystem::new(runtime_api.clone(), Metrics(None)); + let subsystem_task = run(ctx, subsystem).map(|x| x.unwrap()); let test_task = async move { let (tx, rx) = oneshot::channel(); @@ -343,7 +395,8 @@ mod tests { let runtime_api = MockRuntimeApi::default(); let relay_parent = [1; 32].into(); - let subsystem_task = run(ctx, runtime_api.clone()).map(|x| x.unwrap()); + let subsystem = RuntimeApiSubsystem::new(runtime_api.clone(), Metrics(None)); + let subsystem_task = run(ctx, subsystem).map(|x| x.unwrap()); let test_task = async move { let (tx, rx) = oneshot::channel(); @@ -369,7 +422,8 @@ mod tests { runtime_api.validation_code.insert(para_a, Default::default()); - let subsystem_task = run(ctx, runtime_api.clone()).map(|x| x.unwrap()); + let subsystem = RuntimeApiSubsystem::new(runtime_api.clone(), Metrics(None)); + let subsystem_task = run(ctx, subsystem).map(|x| x.unwrap()); let test_task = async move { let (tx, rx) = oneshot::channel(); @@ -408,7 +462,8 @@ mod tests { runtime_api.candidate_pending_availability.insert(para_a, Default::default()); - let subsystem_task = run(ctx, runtime_api.clone()).map(|x| x.unwrap()); + let subsystem = RuntimeApiSubsystem::new(runtime_api.clone(), Metrics(None)); + let subsystem_task = run(ctx, subsystem).map(|x| x.unwrap()); let test_task = async move { let (tx, rx) = oneshot::channel(); @@ -444,7 +499,8 @@ mod tests { let runtime_api = MockRuntimeApi::default(); let relay_parent = [1; 32].into(); - let subsystem_task = run(ctx, runtime_api.clone()).map(|x| x.unwrap()); + let subsystem = RuntimeApiSubsystem::new(runtime_api.clone(), Metrics(None)); + let subsystem_task = run(ctx, subsystem).map(|x| x.unwrap()); let test_task = async move { let (tx, rx) = oneshot::channel(); diff --git a/node/network/availability-distribution/src/lib.rs b/node/network/availability-distribution/src/lib.rs index 2a5a086065..32b61f5817 100644 --- a/node/network/availability-distribution/src/lib.rs +++ b/node/network/availability-distribution/src/lib.rs @@ -756,6 +756,8 @@ impl Subsystem for AvailabilityDistributionSubsystem where Context: SubsystemContext + Sync + Send, { + type Metrics = (); + fn start(self, ctx: Context) -> SpawnedSubsystem { SpawnedSubsystem { name: "availability-distribution-subsystem", diff --git a/node/network/bitfield-distribution/src/lib.rs b/node/network/bitfield-distribution/src/lib.rs index 8da071bddd..67475aea15 100644 --- a/node/network/bitfield-distribution/src/lib.rs +++ b/node/network/bitfield-distribution/src/lib.rs @@ -558,6 +558,8 @@ impl Subsystem for BitfieldDistribution where C: SubsystemContext + Sync + Send, { + type Metrics = (); + fn start(self, ctx: C) -> SpawnedSubsystem { SpawnedSubsystem { name: "bitfield-distribution-subsystem", diff --git a/node/network/bridge/src/lib.rs b/node/network/bridge/src/lib.rs index 9f347d39f1..c83e8b7c8b 100644 --- a/node/network/bridge/src/lib.rs +++ b/node/network/bridge/src/lib.rs @@ -205,6 +205,8 @@ impl Subsystem for NetworkBridge Net: Network, Context: SubsystemContext, { + type Metrics = (); + fn start(self, ctx: Context) -> SpawnedSubsystem { // Swallow error because failure is fatal to the node and we log with more precision // within `run_network`. diff --git a/node/network/pov-distribution/src/lib.rs b/node/network/pov-distribution/src/lib.rs index 994090c0d5..552981244d 100644 --- a/node/network/pov-distribution/src/lib.rs +++ b/node/network/pov-distribution/src/lib.rs @@ -51,6 +51,8 @@ pub struct PoVDistribution; impl Subsystem for PoVDistribution where C: SubsystemContext { + type Metrics = (); + fn start(self, ctx: C) -> SpawnedSubsystem { // Swallow error because failure is fatal to the node and we log with more precision // within `run`. diff --git a/node/network/statement-distribution/src/lib.rs b/node/network/statement-distribution/src/lib.rs index 3f8e6842a8..cbdc8e5845 100644 --- a/node/network/statement-distribution/src/lib.rs +++ b/node/network/statement-distribution/src/lib.rs @@ -65,6 +65,8 @@ pub struct StatementDistribution; impl Subsystem for StatementDistribution where C: SubsystemContext { + type Metrics = (); + fn start(self, ctx: C) -> SpawnedSubsystem { // Swallow error because failure is fatal to the node and we log with more precision // within `run`. diff --git a/node/overseer/examples/minimal-example.rs b/node/overseer/examples/minimal-example.rs index 3ebcb34825..4087429e6d 100644 --- a/node/overseer/examples/minimal-example.rs +++ b/node/overseer/examples/minimal-example.rs @@ -76,6 +76,8 @@ impl Subsystem1 { impl Subsystem for Subsystem1 where C: SubsystemContext { + type Metrics = (); // no Prometheus metrics + fn start(self, ctx: C) -> SpawnedSubsystem { let future = Box::pin(async move { Self::run(ctx).await; @@ -121,6 +123,8 @@ impl Subsystem2 { impl Subsystem for Subsystem2 where C: SubsystemContext { + type Metrics = (); // no Prometheus metrics + fn start(self, ctx: C) -> SpawnedSubsystem { let future = Box::pin(async move { Self::run(ctx).await; @@ -161,6 +165,7 @@ fn main() { let (overseer, _handler) = Overseer::new( vec![], all_subsystems, + None, spawner, ).unwrap(); let overseer_fut = overseer.run().fuse(); diff --git a/node/overseer/src/lib.rs b/node/overseer/src/lib.rs index 452ab1f4b6..321a20f568 100644 --- a/node/overseer/src/lib.rs +++ b/node/overseer/src/lib.rs @@ -84,6 +84,7 @@ use polkadot_subsystem::messages::{ pub use polkadot_subsystem::{ Subsystem, SubsystemContext, OverseerSignal, FromOverseer, SubsystemError, SubsystemResult, SpawnedSubsystem, ActiveLeavesUpdate, + metrics::{self, prometheus}, }; use polkadot_node_primitives::SpawnNamed; @@ -92,6 +93,9 @@ use polkadot_node_primitives::SpawnNamed; const CHANNEL_CAPACITY: usize = 1024; // A graceful `Overseer` teardown time delay. const STOP_DELAY: u64 = 1; +// Target for logs. +const LOG_TARGET: &'static str = "overseer"; + /// A type of messages that are sent from [`Subsystem`] to [`Overseer`]. /// @@ -325,10 +329,6 @@ impl SubsystemContext for OverseerSubsystemContext { } } -/// A subsystem compatible with the overseer - one which can be run in the context of the -/// overseer. -pub type CompatibleSubsystem = Box> + Send>; - /// A subsystem that we oversee. /// /// Ties together the [`Subsystem`] itself and it's running instance @@ -336,7 +336,6 @@ pub type CompatibleSubsystem = Box> /// for whatever reason). /// /// [`Subsystem`]: trait.Subsystem.html -#[allow(dead_code)] struct OverseenSubsystem { instance: Option>, } @@ -407,6 +406,9 @@ pub struct Overseer { /// The set of the "active leaves". active_leaves: HashSet<(Hash, BlockNumber)>, + + /// Various Prometheus metrics. + metrics: Metrics, } /// This struct is passed as an argument to create a new instance of an [`Overseer`]. @@ -453,6 +455,52 @@ pub struct AllSubsystems, + deactivated_heads_total: prometheus::Counter, +} + +#[derive(Default, Clone)] +struct Metrics(Option); + +impl Metrics { + fn on_head_activated(&self) { + if let Some(metrics) = &self.0 { + metrics.activated_heads_total.inc(); + } + } + + fn on_head_deactivated(&self) { + if let Some(metrics) = &self.0 { + metrics.deactivated_heads_total.inc(); + } + } +} + +impl metrics::Metrics for Metrics { + fn try_register(registry: &prometheus::Registry) -> Result { + let metrics = MetricsInner { + activated_heads_total: prometheus::register( + prometheus::Counter::new( + "parachain_activated_heads_total", + "Number of activated heads." + )?, + registry, + )?, + deactivated_heads_total: prometheus::register( + prometheus::Counter::new( + "parachain_deactivated_heads_total", + "Number of deactivated heads." + )?, + registry, + )?, + }; + Ok(Metrics(Some(metrics))) + } +} + impl Overseer where S: SpawnNamed, @@ -500,8 +548,10 @@ where /// struct ValidationSubsystem; /// /// impl Subsystem for ValidationSubsystem - /// where C: SubsystemContext + /// where C: SubsystemContext /// { + /// type Metrics = (); + /// /// fn start( /// self, /// mut ctx: C, @@ -539,6 +589,7 @@ where /// let (overseer, _handler) = Overseer::new( /// vec![], /// all_subsystems, + /// None, /// spawner, /// ).unwrap(); /// @@ -558,6 +609,7 @@ where pub fn new( leaves: impl IntoIterator, all_subsystems: AllSubsystems, + prometheus_registry: Option<&prometheus::Registry>, mut s: S, ) -> SubsystemResult<(Self, OverseerHandler)> where @@ -692,13 +744,15 @@ where all_subsystems.collator_protocol, )?; - let active_leaves = HashSet::new(); - let leaves = leaves .into_iter() .map(|BlockInfo { hash, parent_hash: _, number }| (hash, number)) .collect(); + let active_leaves = HashSet::new(); + + let metrics = ::register(prometheus_registry); + let this = Self { candidate_validation_subsystem, candidate_backing_subsystem, @@ -721,6 +775,7 @@ where events_rx, leaves, active_leaves, + metrics, }; Ok((this, handler)) @@ -811,6 +866,7 @@ where for leaf in leaves.into_iter() { update.activated.push(leaf.0); self.active_leaves.insert(leaf); + self.metrics.on_head_activated(); } self.broadcast_signal(OverseerSignal::ActiveLeaves(update)).await?; @@ -850,7 +906,7 @@ where // Some subsystem exited? It's time to panic. if let Poll::Ready(Some(finished)) = poll!(self.running_subsystems.next()) { - log::error!("Subsystem finished unexpectedly {:?}", finished); + log::error!(target: LOG_TARGET, "Subsystem finished unexpectedly {:?}", finished); self.stop().await; return Err(SubsystemError); } @@ -865,11 +921,13 @@ where if let Some(parent) = block.number.checked_sub(1).and_then(|number| self.active_leaves.take(&(block.parent_hash, number))) { update.deactivated.push(parent.0); + self.metrics.on_head_deactivated(); } if !self.active_leaves.contains(&(block.hash, block.number)) { update.activated.push(block.hash); self.active_leaves.insert((block.hash, block.number)); + self.metrics.on_head_activated(); } self.broadcast_signal(OverseerSignal::ActiveLeaves(update)).await?; @@ -879,10 +937,12 @@ where async fn block_finalized(&mut self, block: BlockInfo) -> SubsystemResult<()> { let mut update = ActiveLeavesUpdate::default(); + let metrics = &self.metrics; self.active_leaves.retain(|(h, n)| { if *n <= block.number { update.deactivated.push(*h); + metrics.on_head_deactivated(); false } else { true @@ -1103,6 +1163,8 @@ mod tests { impl Subsystem for TestSubsystem1 where C: SubsystemContext { + type Metrics = (); + fn start(self, mut ctx: C) -> SpawnedSubsystem { let mut sender = self.0; SpawnedSubsystem { @@ -1131,6 +1193,8 @@ mod tests { impl Subsystem for TestSubsystem2 where C: SubsystemContext { + type Metrics = (); + fn start(self, mut ctx: C) -> SpawnedSubsystem { let sender = self.0.clone(); SpawnedSubsystem { @@ -1177,6 +1241,8 @@ mod tests { impl Subsystem for TestSubsystem4 where C: SubsystemContext { + type Metrics = (); + fn start(self, mut _ctx: C) -> SpawnedSubsystem { SpawnedSubsystem { name: "test-subsystem-4", @@ -1187,6 +1253,7 @@ mod tests { } } + // Checks that a minimal configuration of two jobs can run and exchange messages. #[test] fn overseer_works() { @@ -1216,6 +1283,7 @@ mod tests { let (overseer, mut handler) = Overseer::new( vec![], all_subsystems, + None, spawner, ).unwrap(); let overseer_fut = overseer.run().fuse(); @@ -1252,6 +1320,86 @@ mod tests { assert_eq!(s1_results, (0..10).collect::>()); }); } + + // Checks activated/deactivated metrics are updated properly. + #[test] + fn overseer_metrics_work() { + let spawner = sp_core::testing::TaskExecutor::new(); + + executor::block_on(async move { + let first_block_hash = [1; 32].into(); + let second_block_hash = [2; 32].into(); + let third_block_hash = [3; 32].into(); + + let first_block = BlockInfo { + hash: first_block_hash, + parent_hash: [0; 32].into(), + number: 1, + }; + let second_block = BlockInfo { + hash: second_block_hash, + parent_hash: first_block_hash, + number: 2, + }; + let third_block = BlockInfo { + hash: third_block_hash, + parent_hash: second_block_hash, + number: 3, + }; + + let all_subsystems = AllSubsystems { + collation_generation: DummySubsystem, + candidate_validation: DummySubsystem, + candidate_backing: DummySubsystem, + candidate_selection: DummySubsystem, + collator_protocol: DummySubsystem, + statement_distribution: DummySubsystem, + availability_distribution: DummySubsystem, + bitfield_signing: DummySubsystem, + bitfield_distribution: DummySubsystem, + provisioner: DummySubsystem, + pov_distribution: DummySubsystem, + runtime_api: DummySubsystem, + availability_store: DummySubsystem, + network_bridge: DummySubsystem, + chain_api: DummySubsystem, + }; + let registry = prometheus::Registry::new(); + let (overseer, mut handler) = Overseer::new( + vec![first_block], + all_subsystems, + Some(®istry), + spawner, + ).unwrap(); + let overseer_fut = overseer.run().fuse(); + + pin_mut!(overseer_fut); + + handler.block_imported(second_block).await.unwrap(); + handler.block_imported(third_block).await.unwrap(); + handler.stop().await.unwrap(); + + select! { + res = overseer_fut => { + assert!(res.is_ok()); + let (activated, deactivated) = extract_metrics(®istry); + assert_eq!(activated, 3); + assert_eq!(deactivated, 2); + }, + complete => (), + } + }); + } + + fn extract_metrics(registry: &prometheus::Registry) -> (u64, u64) { + let gather = registry.gather(); + assert_eq!(gather[0].get_name(), "parachain_activated_heads_total"); + assert_eq!(gather[1].get_name(), "parachain_deactivated_heads_total"); + let activated = gather[0].get_metric()[0].get_counter().get_value() as u64; + let deactivated = gather[1].get_metric()[0].get_counter().get_value() as u64; + (activated, deactivated) + } + // Spawn a subsystem that immediately exits. // // Should immediately conclude the overseer itself with an error. @@ -1281,6 +1429,7 @@ mod tests { let (overseer, _handle) = Overseer::new( vec![], all_subsystems, + None, spawner, ).unwrap(); let overseer_fut = overseer.run().fuse(); @@ -1298,6 +1447,8 @@ mod tests { impl Subsystem for TestSubsystem5 where C: SubsystemContext { + type Metrics = (); + fn start(self, mut ctx: C) -> SpawnedSubsystem { let mut sender = self.0.clone(); @@ -1327,6 +1478,8 @@ mod tests { impl Subsystem for TestSubsystem6 where C: SubsystemContext { + type Metrics = (); + fn start(self, mut ctx: C) -> SpawnedSubsystem { let mut sender = self.0.clone(); @@ -1400,6 +1553,7 @@ mod tests { let (overseer, mut handler) = Overseer::new( vec![first_block], all_subsystems, + None, spawner, ).unwrap(); @@ -1505,6 +1659,7 @@ mod tests { let (overseer, mut handler) = Overseer::new( vec![first_block, second_block], all_subsystems, + None, spawner, ).unwrap(); @@ -1592,6 +1747,8 @@ mod tests { C: SubsystemContext, M: Send, { + type Metrics = (); + fn start(self, mut ctx: C) -> SpawnedSubsystem { SpawnedSubsystem { name: "counter-subsystem", @@ -1738,6 +1895,7 @@ mod tests { let (overseer, mut handler) = Overseer::new( vec![], all_subsystems, + None, spawner, ).unwrap(); let overseer_fut = overseer.run().fuse(); diff --git a/node/service/src/lib.rs b/node/service/src/lib.rs index 0489cde65b..9c854525c0 100644 --- a/node/service/src/lib.rs +++ b/node/service/src/lib.rs @@ -277,6 +277,7 @@ fn new_partial(config: &mut Configuration) -> Result< fn real_overseer( leaves: impl IntoIterator, + prometheus_registry: Option<&Registry>, s: S, ) -> Result<(Overseer, OverseerHandler), ServiceError> { let all_subsystems = AllSubsystems { @@ -296,9 +297,11 @@ fn real_overseer( collation_generation: DummySubsystem, collator_protocol: DummySubsystem, }; + Overseer::new( leaves, all_subsystems, + prometheus_registry, s, ).map_err(|e| ServiceError::Other(format!("Failed to create an Overseer: {:?}", e))) } @@ -399,7 +402,7 @@ fn new_full( }) .collect(); - let (overseer, handler) = real_overseer(leaves, spawner)?; + let (overseer, handler) = real_overseer(leaves, prometheus_registry.as_ref(), spawner)?; let handler_clone = handler.clone(); task_manager.spawn_essential_handle().spawn_blocking("overseer", Box::pin(async move { @@ -502,7 +505,7 @@ fn new_full( inherent_data_providers: inherent_data_providers.clone(), telemetry_on_connect: Some(telemetry_connection_sinks.on_connect_stream()), voting_rule, - prometheus_registry: prometheus_registry, + prometheus_registry, shared_voter_state, }; @@ -533,7 +536,7 @@ fn new_light(mut config: Configuration) -> Result>, Dispatch: NativeExecutionDispatch + 'static, { - crate::set_prometheus_registry(&mut config)?; + set_prometheus_registry(&mut config)?; use sc_client_api::backend::RemoteBackend; let (client, backend, keystore, mut task_manager, on_demand) = diff --git a/node/subsystem-util/src/lib.rs b/node/subsystem-util/src/lib.rs index d6998b267f..57f1efed3b 100644 --- a/node/subsystem-util/src/lib.rs +++ b/node/subsystem-util/src/lib.rs @@ -24,6 +24,7 @@ use polkadot_node_subsystem::{ errors::{ChainApiError, RuntimeApiError}, messages::{AllMessages, RuntimeApiMessage, RuntimeApiRequest, RuntimeApiSender}, FromOverseer, SpawnedSubsystem, Subsystem, SubsystemContext, SubsystemError, SubsystemResult, + metrics, }; use futures::{ channel::{mpsc, oneshot}, @@ -63,11 +64,13 @@ pub mod reexports { }; } + /// Duration a job will wait after sending a stop signal before hard-aborting. pub const JOB_GRACEFUL_STOP_DURATION: Duration = Duration::from_secs(1); /// Capacity of channels to and from individual jobs pub const JOB_CHANNEL_CAPACITY: usize = 64; + /// Utility errors #[derive(Debug, derive_more::From)] pub enum Error { @@ -446,6 +449,12 @@ pub trait JobTrait: Unpin { /// /// If no extra information is needed, it is perfectly acceptable to set it to `()`. type RunArgs: 'static + Send; + /// Subsystem-specific Prometheus metrics. + /// + /// Jobs spawned by one subsystem should share the same + /// instance of metrics (use `.clone()`). + /// The `delegate_subsystem!` macro should take care of this. + type Metrics: 'static + metrics::Metrics + Send; /// Name of the job, i.e. `CandidateBackingJob` const NAME: &'static str; @@ -454,6 +463,7 @@ pub trait JobTrait: Unpin { fn run( parent: Hash, run_args: Self::RunArgs, + metrics: Self::Metrics, receiver: mpsc::Receiver, sender: mpsc::Sender, ) -> Pin> + Send>>; @@ -532,7 +542,7 @@ impl Jobs { } /// Spawn a new job for this `parent_hash`, with whatever args are appropriate. - fn spawn_job(&mut self, parent_hash: Hash, run_args: Job::RunArgs) -> Result<(), Error> { + fn spawn_job(&mut self, parent_hash: Hash, run_args: Job::RunArgs, metrics: Job::Metrics) -> Result<(), Error> { let (to_job_tx, to_job_rx) = mpsc::channel(JOB_CHANNEL_CAPACITY); let (from_job_tx, from_job_rx) = mpsc::channel(JOB_CHANNEL_CAPACITY); let (finished_tx, finished) = oneshot::channel(); @@ -541,7 +551,7 @@ impl Jobs { let err_tx = self.errors.clone(); let (future, abort_handle) = future::abortable(async move { - if let Err(e) = Job::run(parent_hash, run_args, to_job_rx, from_job_tx).await { + if let Err(e) = Job::run(parent_hash, run_args, metrics, to_job_rx, from_job_tx).await { log::error!( "{}({}) finished with an error {:?}", Job::NAME, @@ -648,6 +658,7 @@ where pub struct JobManager { spawner: Spawner, run_args: Job::RunArgs, + metrics: Job::Metrics, context: std::marker::PhantomData, job: std::marker::PhantomData, errors: Option, JobsError)>>, @@ -662,10 +673,11 @@ where Job::ToJob: TryFrom + TryFrom<::Message> + Sync, { /// Creates a new `Subsystem`. - pub fn new(spawner: Spawner, run_args: Job::RunArgs) -> Self { + pub fn new(spawner: Spawner, run_args: Job::RunArgs, metrics: Job::Metrics) -> Self { Self { spawner, run_args, + metrics, context: std::marker::PhantomData, job: std::marker::PhantomData, errors: None, @@ -703,6 +715,7 @@ where pub async fn run( mut ctx: Context, run_args: Job::RunArgs, + metrics: Job::Metrics, spawner: Spawner, mut err_tx: Option, JobsError)>>, ) { @@ -714,7 +727,7 @@ where loop { select! { - incoming = ctx.recv().fuse() => if Self::handle_incoming(incoming, &mut jobs, &run_args, &mut err_tx).await { break }, + incoming = ctx.recv().fuse() => if Self::handle_incoming(incoming, &mut jobs, &run_args, &metrics, &mut err_tx).await { break }, outgoing = jobs.next().fuse() => if Self::handle_outgoing(outgoing, &mut ctx, &mut err_tx).await { break }, complete => break, } @@ -741,6 +754,7 @@ where incoming: SubsystemResult>, jobs: &mut Jobs, run_args: &Job::RunArgs, + metrics: &Job::Metrics, err_tx: &mut Option, JobsError)>>, ) -> bool { use polkadot_node_subsystem::ActiveLeavesUpdate; @@ -753,7 +767,8 @@ where deactivated, }))) => { for hash in activated { - if let Err(e) = jobs.spawn_job(hash, run_args.clone()) { + let metrics = metrics.clone(); + if let Err(e) = jobs.spawn_job(hash, run_args.clone(), metrics) { log::error!("Failed to spawn a job: {:?}", e); Self::fwd_err(Some(hash), e.into(), err_tx).await; return true; @@ -849,14 +864,18 @@ where Job: 'static + JobTrait + Send, Job::RunArgs: Clone + Sync, Job::ToJob: TryFrom + Sync, + Job::Metrics: Sync, { + type Metrics = Job::Metrics; + fn start(self, ctx: Context) -> SpawnedSubsystem { let spawner = self.spawner.clone(); let run_args = self.run_args.clone(); + let metrics = self.metrics.clone(); let errors = self.errors; let future = Box::pin(async move { - Self::run(ctx, run_args, spawner, errors).await; + Self::run(ctx, run_args, metrics, spawner, errors).await; }); SpawnedSubsystem { @@ -901,11 +920,11 @@ where /// ``` #[macro_export] macro_rules! delegated_subsystem { - ($job:ident($run_args:ty) <- $to_job:ty as $subsystem:ident) => { - delegated_subsystem!($job($run_args) <- $to_job as $subsystem; stringify!($subsystem)); + ($job:ident($run_args:ty, $metrics:ty) <- $to_job:ty as $subsystem:ident) => { + delegated_subsystem!($job($run_args, $metrics) <- $to_job as $subsystem; stringify!($subsystem)); }; - ($job:ident($run_args:ty) <- $to_job:ty as $subsystem:ident; $subsystem_name:expr) => { + ($job:ident($run_args:ty, $metrics:ty) <- $to_job:ty as $subsystem:ident; $subsystem_name:expr) => { #[doc = "Manager type for the "] #[doc = $subsystem_name] type Manager = $crate::JobManager; @@ -924,15 +943,15 @@ macro_rules! delegated_subsystem { { #[doc = "Creates a new "] #[doc = $subsystem_name] - pub fn new(spawner: Spawner, run_args: $run_args) -> Self { + pub fn new(spawner: Spawner, run_args: $run_args, metrics: $metrics) -> Self { $subsystem { - manager: $crate::JobManager::new(spawner, run_args) + manager: $crate::JobManager::new(spawner, run_args, metrics) } } /// Run this subsystem - pub async fn run(ctx: Context, run_args: $run_args, spawner: Spawner) { - >::run(ctx, run_args, spawner, None).await + pub async fn run(ctx: Context, run_args: $run_args, metrics: $metrics, spawner: Spawner) { + >::run(ctx, run_args, metrics, spawner, None).await } } @@ -942,6 +961,8 @@ macro_rules! delegated_subsystem { Context: $crate::reexports::SubsystemContext, ::Message: Into<$to_job>, { + type Metrics = $metrics; + fn start(self, ctx: Context) -> $crate::reexports::SpawnedSubsystem { self.manager.start(ctx) } @@ -1061,6 +1082,7 @@ mod tests { // RunArgs get cloned so that each job gets its own owned copy. If you need that, wrap it in // an Arc. Within a testing context, that efficiency is less important. type RunArgs = HashMap>; + type Metrics = (); const NAME: &'static str = "FakeCandidateSelectionJob"; @@ -1070,6 +1092,7 @@ mod tests { fn run( parent: Hash, mut run_args: Self::RunArgs, + _metrics: Self::Metrics, receiver: mpsc::Receiver, mut sender: mpsc::Sender, ) -> Pin> + Send>> { @@ -1121,7 +1144,7 @@ mod tests { let (context, overseer_handle) = make_subsystem_context(pool.clone()); let (err_tx, err_rx) = mpsc::channel(16); - let subsystem = FakeCandidateSelectionSubsystem::run(context, run_args, pool, Some(err_tx)); + let subsystem = FakeCandidateSelectionSubsystem::run(context, run_args, (), pool, Some(err_tx)); let test_future = test(overseer_handle, err_rx); let timeout = Delay::new(Duration::from_secs(2)); @@ -1196,7 +1219,7 @@ mod tests { let (context, _) = make_subsystem_context::(pool.clone()); let SpawnedSubsystem { name, .. } = - FakeCandidateSelectionSubsystem::new(pool, HashMap::new()).start(context); + FakeCandidateSelectionSubsystem::new(pool, HashMap::new(), ()).start(context); assert_eq!(name, "FakeCandidateSelection"); } } diff --git a/node/subsystem/Cargo.toml b/node/subsystem/Cargo.toml index 6ad013c177..f7283d40aa 100644 --- a/node/subsystem/Cargo.toml +++ b/node/subsystem/Cargo.toml @@ -21,6 +21,7 @@ polkadot-statement-table = { path = "../../statement-table" } sc-network = { git = "https://github.com/paritytech/substrate", branch = "master" } smallvec = "1.4.1" sp-core = { git = "https://github.com/paritytech/substrate", branch = "master" } +substrate-prometheus-endpoint = { git = "https://github.com/paritytech/substrate", branch = "master" } [dev-dependencies] assert_matches = "1.3.0" diff --git a/node/subsystem/src/lib.rs b/node/subsystem/src/lib.rs index 97d09f88cd..77ad27a2c1 100644 --- a/node/subsystem/src/lib.rs +++ b/node/subsystem/src/lib.rs @@ -19,6 +19,8 @@ //! Node-side logic for Polkadot is mostly comprised of Subsystems, which are discrete components //! that communicate via message-passing. They are coordinated by an overseer, provided by a //! separate crate. +//! +//! This crate also reexports Prometheus metric types which are expected to be implemented by subsystems. #![warn(missing_docs)] @@ -128,9 +130,9 @@ impl From for SubsystemError { } impl From for SubsystemError { - fn from(_: futures::task::SpawnError) -> Self { + fn from(_: futures::task::SpawnError) -> Self { Self - } + } } impl From for SubsystemError { @@ -202,6 +204,9 @@ pub trait SubsystemContext: Send + 'static { /// [`Overseer`]: struct.Overseer.html /// [`Subsystem`]: trait.Subsystem.html pub trait Subsystem { + /// Subsystem-specific Prometheus metrics. + type Metrics: metrics::Metrics; + /// Start this `Subsystem` and return `SpawnedSubsystem`. fn start(self, ctx: C) -> SpawnedSubsystem; } @@ -211,6 +216,8 @@ pub trait Subsystem { pub struct DummySubsystem; impl Subsystem for DummySubsystem { + type Metrics = (); + fn start(self, mut ctx: C) -> SpawnedSubsystem { let future = Box::pin(async move { loop { @@ -227,4 +234,41 @@ impl Subsystem for DummySubsystem { future, } } -} \ No newline at end of file +} + +/// This module reexports Prometheus types and defines the [`Metrics`] trait. +pub mod metrics { + /// Reexport Prometheus types. + pub use substrate_prometheus_endpoint as prometheus; + + /// Subsystem- or job-specific Prometheus metrics. + /// + /// Usually implemented as a wrapper for `Option` + /// to ensure `Default` bounds or as a dummy type (). + /// Prometheus metrics internally hold an `Arc` reference, so cloning them is fine. + pub trait Metrics: Default + Clone { + /// Try to register metrics in the Prometheus registry. + fn try_register(registry: &prometheus::Registry) -> Result; + + /// Convience method to register metrics in the optional Prometheus registry. + /// If the registration fails, prints a warning and returns `Default::default()`. + fn register(registry: Option<&prometheus::Registry>) -> Self { + registry.map(|r| { + match Self::try_register(r) { + Err(e) => { + log::warn!("Failed to register metrics: {:?}", e); + Default::default() + }, + Ok(metrics) => metrics, + } + }).unwrap_or_default() + } + } + + // dummy impl + impl Metrics for () { + fn try_register(_registry: &prometheus::Registry) -> Result<(), prometheus::PrometheusError> { + Ok(()) + } + } +} -- GitLab From 31f7ef9bc0ecd5715b321d83a42294f7d1ce5df2 Mon Sep 17 00:00:00 2001 From: Sergei Shulepov Date: Tue, 18 Aug 2020 12:40:48 +0200 Subject: [PATCH 187/192] Implementer's Guide: Make HRMP use upward message kinds (#1591) * Draft HRMP related message types * Make HRMP use upward message kinds * Incorporate changes into messaging.md * Make docs a bit more clear * Clarify remove "D" * Update roadmap/implementers-guide/src/messaging.md Co-authored-by: Bernhard Schuster * Update roadmap/implementers-guide/src/runtime/router.md Co-authored-by: Bernhard Schuster * Update router.md * Update roadmap/implementers-guide/src/runtime/router.md Co-authored-by: Robert Habermeier Co-authored-by: Bernhard Schuster Co-authored-by: Robert Habermeier --- roadmap/implementers-guide/src/messaging.md | 7 +- .../implementers-guide/src/runtime/router.md | 129 +++++++++--------- .../implementers-guide/src/types/messages.md | 20 ++- 3 files changed, 89 insertions(+), 67 deletions(-) diff --git a/roadmap/implementers-guide/src/messaging.md b/roadmap/implementers-guide/src/messaging.md index 6755637589..62fbe3cfea 100644 --- a/roadmap/implementers-guide/src/messaging.md +++ b/roadmap/implementers-guide/src/messaging.md @@ -36,9 +36,10 @@ The weight that processing of the dispatchables can consume is limited by a prec that some dispatchables will be left for later blocks. To make the dispatching more fair, the queues are processed turn-by-turn in a round robin fashion. -Other kinds of upward messages can be introduced in the future as well. Potential candidates are channel management for -horizontal message passing (XCMP and HRMP, both are to be described below), new validation code signalling, or other -requests to the relay chain. +Upward messages are also used by a parachain to request opening and closing HRMP channels (HRMP will be described below). + +Other kinds of upward messages can be introduced in the future as well. Potential candidates are +new validation code signalling, or other requests to the relay chain. ## Horizontal Message Passing diff --git a/roadmap/implementers-guide/src/runtime/router.md b/roadmap/implementers-guide/src/runtime/router.md index 2bb4c0a77a..f160383193 100644 --- a/roadmap/implementers-guide/src/runtime/router.md +++ b/roadmap/implementers-guide/src/runtime/router.md @@ -34,10 +34,6 @@ HRMP related structs: ```rust,ignore /// A description of a request to open an HRMP channel. struct HrmpOpenChannelRequest { - /// The sender and the initiator of this request. - sender: ParaId, - /// The recipient of the opened request. - recipient: ParaId, /// Indicates if this request was confirmed by the recipient. confirmed: bool, /// How many session boundaries ago this request was seen. @@ -50,19 +46,6 @@ struct HrmpOpenChannelRequest { limit_used_bytes: u32, } -/// A description of a request to close an opened HRMP channel. -struct HrmpCloseChannelRequest { - /// The para which initiated closing an existing channel. - /// - /// Invariant: it should be equal to one of the following - /// - `Some(sender)` - /// - `Some(recipient)` - /// - `None` in case the request initiated by the runtime (including governance, migration, etc) - initiator: Option, - /// The identifier of an HRMP channel to be closed. - id: HrmpChannelId, -} - /// A metadata of an HRMP channel. struct HrmpChannel { /// The amount that the sender supplied as a deposit when opening this channel. @@ -92,14 +75,30 @@ struct HrmpChannel { HRMP related storage layout ```rust,ignore -/// Pending HRMP open channel requests. -HrmpOpenChannelRequests: Vec; +/// The set of pending HRMP open channel requests. +/// +/// The set is accompanied by a list for iteration. +/// +/// Invariant: +/// - There are no channels that exists in list but not in the set and vice versa. +HrmpOpenChannelRequests: map HrmpChannelId => Option; +HrmpOpenChannelRequestsList: Vec; + /// This mapping tracks how many open channel requests are inititated by a given sender para. -/// Invariant: `HrmpOpenChannelRequests` should contain the same number of items that has `_.sender == X` +/// Invariant: `HrmpOpenChannelRequestsList` should contain the same number of items that has `(X, _)` /// as the number of `HrmpOpenChannelRequestCount` for `X`. HrmpOpenChannelRequestCount: map ParaId => u32; -/// Pending HRMP close channel requests. -HrmpCloseChannelRequests: Vec; + +/// A set of pending HRMP close channel requests that are going to be closed during the session change. +/// Used for checking if a given channel is registered for closure. +/// +/// The set is accompanied by a list for iteration. +/// +/// Invariant: +/// - There are no channels that exists in list but not in the set and vice versa. +HrmpCloseChannelRequests: map HrmpChannelId => Option<()>; +HrmpCloseChannelRequestsList: Vec; + /// The HRMP watermark associated with each para. HrmpWatermarks: map ParaId => Option; /// HRMP channel data associated with each para. @@ -123,44 +122,32 @@ HrmpChannelDigests: map ParaId => Vec<(BlockNumber, Vec)>; No initialization routine runs for this module. -## Entry points - -The following routines are intended to be invoked by paras' upward messages. - -* `hrmp_init_open_channel(recipient)`: - 1. Check that the origin of this message is a para. We say that the origin of this message is the `sender`. - 1. Check that the `sender` is not `recipient`. - 1. Check that the `recipient` para exists. - 1. Check that there is no existing open channel request from sender to recipient. - 1. Check that the sum of the number of already opened HRMP channels by the `sender` (the size of the set found `HrmpEgressChannelsIndex` for `sender`) and the number of open requests by the `sender` (the value from `HrmpOpenChannelRequestCount` for `sender`) doesn't exceed the limit of channels (`config.hrmp_max_parachain_outbound_channels` or `config.hrmp_max_parathread_outbound_channels`) minus 1. - 1. Reserve the deposit for the `sender` according to `config.hrmp_sender_deposit` - 1. Add a new entry to `HrmpOpenChannelRequests` and increase `HrmpOpenChannelRequestCount` by 1 for the `sender`. - 1. Set `sender_deposit` to `config.hrmp_sender_deposit` - 1. Set `limit_used_places` to `config.hrmp_channel_max_places` - 1. Set `limit_limit_used_bytes` to `config.hrmp_channel_max_size` - -* `hrmp_accept_open_channel(i)`, `i` - is the index of open channel request: - 1. Check that the designated open channel request exists - 1. Check that the request's `recipient` corresponds to the origin of this message. - 1. Reserve the deposit for the `recipient` according to `config.hrmp_recipient_deposit` - 1. Set the request's `confirmed` flag to `true`. - -* `hrmp_close_channel(sender, recipient)`: - 1. Check that the channel between `sender` and `recipient` exists - 1. Check that the origin of the message is either `sender` or `recipient` - 1. Check that there is no existing intention to close the channel between `sender` and `recipient`. - 1. Add a new entry to `HrmpCloseChannelRequests` with initiator set to the `Some` variant with the origin of this message. - ## Routines Candidate Acceptance Function: * `check_upward_messages(P: ParaId, Vec`: 1. Checks that there are at most `config.max_upward_message_num_per_candidate` messages. - 1. Checks each upward message individually depending on its kind: + 1. Checks each upward message `M` individually depending on its kind: 1. If the message kind is `Dispatchable`: 1. Verify that `RelayDispatchQueueSize` for `P` has enough capacity for the message (NOTE that should include all processed upward messages of the `Dispatchable` kind up to this point!) + 1. If the message kind is `HrmpInitOpenChannel(recipient)`: + 1. Check that the `P` is not `recipient`. + 1. Check that `recipient` is a valid para. + 1. Check that there is no existing open channel request (`P`, `recipient`) in `HrmpOpenChannelRequests`. + 1. Check that the sum of the number of already opened HRMP channels by the `sender` (the size + of the set found `HrmpEgressChannelsIndex` for `sender`) and the number of open requests by the + `sender` (the value from `HrmpOpenChannelRequestCount` for `sender`) doesn't exceed the limit of + channels (`config.hrmp_max_parachain_outbound_channels` or `config.hrmp_max_parathread_outbound_channels`) minus 1. + 1. Check that `P`'s balance is more or equal to `config.hrmp_sender_deposit` + 1. If the message kind is `HrmpAcceptOpenChannel(sender)`: + 1. Check that there is existing request between (`sender`, `P`) in `HrmpOpenChannelRequests` + 1. Check that `P`'s balance is more or equal to `config.hrmp_recipient_deposit`. + 1. If the message kind is `HrmpCloseChannel(ch)`: + 1. Check that `P` is either `ch.sender` or `ch.recipient` + 1. Check that `HrmpChannels` for `ch` exists. + 1. Check that `ch` is not in the `HrmpCloseChannelRequests` set. * `check_processed_downward_messages(P: ParaId, processed_downward_messages)`: 1. Checks that `DownwardMessageQueues` for `P` is at least `processed_downward_messages` long. 1. Checks that `processed_downward_messages` is at least 1 if `DownwardMessageQueues` for `P` is not empty. @@ -199,6 +186,20 @@ Candidate Enactment: 1. Append the message to `RelayDispatchQueues` for `P` 1. Increment the size and the count in `RelayDispatchQueueSize` for `P`. 1. Ensure that `P` is present in `NeedsDispatch`. + 1. If the message kind is `HrmpInitOpenChannel(recipient)`: + 1. Increase `HrmpOpenChannelRequestCount` by 1 for the `P`. + 1. Append `(P, recipient)` to `HrmpOpenChannelRequestsList`. + 1. Add a new entry to `HrmpOpenChannelRequests` for `(sender, recipient)` + 1. Set `sender_deposit` to `config.hrmp_sender_deposit` + 1. Set `limit_used_places` to `config.hrmp_channel_max_places` + 1. Set `limit_limit_used_bytes` to `config.hrmp_channel_max_size` + 1. Reserve the deposit for the `P` according to `config.hrmp_sender_deposit` + 1. If the message kind is `HrmpAcceptOpenChannel(sender)`: + 1. Reserve the deposit for the `P` according to `config.hrmp_recipient_deposit` + 1. For the request in `HrmpOpenChannelRequests` identified by `(sender, P)`, set `confirmed` flag to `true`. + 1. If the message kind is `HrmpCloseChannel(ch)`: + 1. Insert a new entry `Some(())` to `HrmpCloseChannelRequests` for `ch`. + 1. Append `ch` to `HrmpCloseChannelRequestsList`. The following routine is intended to be called in the same time when `Paras::schedule_para_cleanup` is called. @@ -236,23 +237,29 @@ any of dispatchables return an error. 1. Remove `RelayDispatchQueues` of `P`. 1. Remove `P` if it exists in `NeedsDispatch`. 1. If `P` is in `NextDispatchRoundStartWith`, then reset it to `None` - - Note that we don't remove the open/close requests since they are gon die out naturally. -1. For each request `R` in `HrmpOpenChannelRequests`: + - Note that if we don't remove the open/close requests since they are going to die out naturally at the end of the session. +1. For each channel designator `D` in `HrmpOpenChannelRequestsList` we query the request `R` from `HrmpOpenChannelRequests`: 1. if `R.confirmed = false`: 1. increment `R.age` by 1. 1. if `R.age` reached a preconfigured time-to-live limit `config.hrmp_open_request_ttl`, then: 1. refund `R.sender_deposit` to the sender - 1. decrement `HrmpOpenChannelRequestCount` for `R.sender` by 1. + 1. decrement `HrmpOpenChannelRequestCount` for `D.sender` by 1. 1. remove `R` + 1. remove `D` 2. if `R.confirmed = true`, - 1. check that `R.sender` and `R.recipient` are not offboarded. - 1. create a new channel `C` between `(R.sender, R.recipient)`. - 1. Initialize the `C.sender_deposit` with `R.sender_deposit` and `C.recipient_deposit` with the value found in the configuration `config.hrmp_recipient_deposit`. - 1. Insert `sender` into the set `HrmpIngressChannelsIndex` for the `recipient`. - 1. Insert `recipient` into the set `HrmpEgressChannelsIndex` for the `sender`. - 1. decrement `HrmpOpenChannelRequestCount` for `R.sender` by 1. + 1. if both `D.sender` and `D.recipient` are not offboarded. + 1. create a new channel `C` between `(D.sender, D.recipient)`. + 1. Initialize the `C.sender_deposit` with `R.sender_deposit` and `C.recipient_deposit` + with the value found in the configuration `config.hrmp_recipient_deposit`. + 1. Insert `sender` into the set `HrmpIngressChannelsIndex` for the `recipient`. + 1. Insert `recipient` into the set `HrmpEgressChannelsIndex` for the `sender`. + 1. decrement `HrmpOpenChannelRequestCount` for `D.sender` by 1. 1. remove `R` -1. For each request `R` in `HrmpCloseChannelRequests` remove the channel identified by `R.id`, if exists. + 1. remove `D` +1. For each channel designator `D` in `HrmpCloseChannelRequestsList` + 1. remove the channel identified by `D`, if exists. + 1. remove `D` from `HrmpCloseChannelRequests`. + 1. remove `D` from `HrmpCloseChannelRequestsList` To remove a channel `C` identified with a tuple `(sender, recipient)`: diff --git a/roadmap/implementers-guide/src/types/messages.md b/roadmap/implementers-guide/src/types/messages.md index 1bbe3f817d..315923e311 100644 --- a/roadmap/implementers-guide/src/types/messages.md +++ b/roadmap/implementers-guide/src/types/messages.md @@ -53,9 +53,23 @@ enum UpwardMessage { /// The dispatchable to be executed in its raw form. dispatchable: RawDispatchable, }, - // Examples: - // HrmpOpenChannel { .. }, - // HrmpCloseChannel { .. }, + /// A message for initiation of opening a new HRMP channel between the origin para and the + /// given `recipient`. + /// + /// Let `origin` be the parachain that sent this upward message. In that case the channel + /// to be opened is (`origin` -> `recipient`). + HrmpInitOpenChannel(ParaId), + /// A message that is meant to confirm the HRMP open channel request initiated earlier by the + /// `HrmpInitOpenChannel` by the given `sender`. + /// + /// Let `origin` be the parachain that sent this upward message. In that case the channel + /// (`origin` -> `sender`) will be opened during the session change. + HrmpAcceptOpenChannel(ParaId), + /// A message for closing the specified existing channel `ch`. + /// + /// The channel to be closed is `(ch.sender -> ch.recipient)`. The parachain that sent this + /// upward message must be either `ch.sender` or `ch.recipient`. + HrmpCloseChannel(HrmpChannelId), } ``` -- GitLab From 8c881e45fdeed41a40d85b84000efeed2d4245f2 Mon Sep 17 00:00:00 2001 From: Robert Habermeier Date: Tue, 18 Aug 2020 14:41:40 +0200 Subject: [PATCH 188/192] Implement validation data refactor (#1585) * update primitives * correct parent_head field * make hrmp field pub * refactor validation data: runtime * refactor validation data: messages * add arguments to full_validation_data runtime API * port runtime API * mostly port over candidate validation * remove some parameters from ValidationParams * guide: update candidate validation * update candidate outputs * update ValidationOutputs in primitives * port over candidate validation * add a new test for no-transient behavior * update util runtime API wrappers * candidate backing * fix missing imports * change some fields of validation data around * runtime API impl * update candidate validation * fix backing tests * grumbles from review * fix av-store tests * fix some more crates * fix provisioner tests * fix availability distribution tests * port collation-generation to new validation data * fix overseer tests * Update roadmap/implementers-guide/src/node/utility/candidate-validation.md Co-authored-by: Peter Goodspeed-Niklaus Co-authored-by: Peter Goodspeed-Niklaus --- Cargo.lock | 14 - Cargo.toml | 1 - node/collation-generation/src/lib.rs | 106 +++---- node/core/av-store/src/lib.rs | 41 +-- node/core/backing/src/lib.rs | 59 ++-- node/core/candidate-validation/src/lib.rs | 292 +++++++++--------- node/core/provisioner/src/lib.rs | 36 +-- node/core/runtime-api/src/lib.rs | 61 ++-- .../availability-distribution/src/tests.rs | 33 +- node/overseer/src/lib.rs | 2 +- node/primitives/src/lib.rs | 12 +- node/subsystem-util/src/lib.rs | 12 +- node/subsystem/src/messages.rs | 34 +- parachain/src/primitives.rs | 22 +- parachain/test-parachains/Cargo.toml | 2 - .../test-parachains/code-upgrader/Cargo.toml | 27 -- .../test-parachains/code-upgrader/build.rs | 25 -- .../test-parachains/code-upgrader/src/lib.rs | 163 ---------- .../code-upgrader/src/wasm_validation.rs | 57 ---- .../code-upgrader/wasm/Cargo.toml | 0 parachain/test-parachains/tests/adder/mod.rs | 12 +- .../tests/code_upgrader/mod.rs | 217 ------------- parachain/test-parachains/tests/lib.rs | 1 - .../tests/wasm_executor/mod.rs | 12 +- primitives/src/v1.rs | 149 +++++---- .../src/node/utility/candidate-validation.md | 4 +- .../implementers-guide/src/types/candidate.md | 44 +-- .../src/types/overseer-protocol.md | 8 +- runtime/parachains/src/configuration.rs | 13 +- runtime/parachains/src/inclusion.rs | 58 ++-- runtime/parachains/src/lib.rs | 2 + runtime/parachains/src/paras.rs | 35 +-- runtime/parachains/src/runtime_api_impl/v1.rs | 86 +++--- runtime/parachains/src/util.rs | 71 +++++ runtime/rococo-v1/src/lib.rs | 15 +- validation/src/pipeline.rs | 4 +- 36 files changed, 598 insertions(+), 1132 deletions(-) delete mode 100644 parachain/test-parachains/code-upgrader/Cargo.toml delete mode 100644 parachain/test-parachains/code-upgrader/build.rs delete mode 100644 parachain/test-parachains/code-upgrader/src/lib.rs delete mode 100644 parachain/test-parachains/code-upgrader/src/wasm_validation.rs delete mode 100644 parachain/test-parachains/code-upgrader/wasm/Cargo.toml delete mode 100644 parachain/test-parachains/tests/code_upgrader/mod.rs create mode 100644 runtime/parachains/src/util.rs diff --git a/Cargo.lock b/Cargo.lock index 7c998fc0a5..287b58f8af 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -8694,19 +8694,6 @@ dependencies = [ "test-parachain-adder", ] -[[package]] -name = "test-parachain-code-upgrader" -version = "0.7.22" -dependencies = [ - "dlmalloc", - "parity-scale-codec", - "polkadot-parachain", - "sp-io", - "sp-std", - "substrate-wasm-builder-runner 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", - "tiny-keccak 1.5.0", -] - [[package]] name = "test-parachain-halt" version = "0.8.22" @@ -8722,7 +8709,6 @@ dependencies = [ "polkadot-parachain", "sp-core", "test-parachain-adder", - "test-parachain-code-upgrader", "test-parachain-halt", "tiny-keccak 1.5.0", ] diff --git a/Cargo.toml b/Cargo.toml index 1c98ca8d0b..817851211f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -70,7 +70,6 @@ members = [ "parachain/test-parachains", "parachain/test-parachains/adder", "parachain/test-parachains/adder/collator", - "parachain/test-parachains/code-upgrader", ] [badges] diff --git a/node/collation-generation/src/lib.rs b/node/collation-generation/src/lib.rs index 793616d907..c2f6f9bc2c 100644 --- a/node/collation-generation/src/lib.rs +++ b/node/collation-generation/src/lib.rs @@ -34,13 +34,13 @@ use polkadot_node_subsystem::{ metrics::{self, prometheus}, }; use polkadot_node_subsystem_util::{ - self as util, request_availability_cores_ctx, request_global_validation_data_ctx, - request_local_validation_data_ctx, request_validators_ctx, + self as util, request_availability_cores_ctx, request_full_validation_data_ctx, + request_validators_ctx, }; use polkadot_primitives::v1::{ - collator_signature_payload, validation_data_hash, AvailableData, CandidateCommitments, - CandidateDescriptor, CandidateReceipt, CoreState, GlobalValidationData, Hash, - LocalValidationData, OccupiedCoreAssumption, PoV, + collator_signature_payload, AvailableData, CandidateCommitments, + CandidateDescriptor, CandidateReceipt, CoreState, Hash, OccupiedCoreAssumption, + PersistedValidationData, PoV, }; use sp_core::crypto::Pair; use std::sync::Arc; @@ -198,13 +198,11 @@ async fn handle_new_activations( for relay_parent in activated.iter().copied() { // double-future magic happens here: the first layer of requests takes a mutable borrow of the context, and // returns a receiver. The second layer of requests actually polls those receivers to completion. - let (global_validation_data, availability_cores, validators) = join!( - request_global_validation_data_ctx(relay_parent, ctx).await?, + let (availability_cores, validators) = join!( request_availability_cores_ctx(relay_parent, ctx).await?, request_validators_ctx(relay_parent, ctx).await?, ); - let global_validation_data = global_validation_data??; let availability_cores = availability_cores??; let n_validators = validators??.len(); @@ -224,9 +222,10 @@ async fn handle_new_activations( continue; } - // we get local validation data synchronously for each core instead of within the subtask loop, - // because we have only a single mutable handle to the context, so the work can't really be distributed - let local_validation_data = match request_local_validation_data_ctx( + // we get validation data synchronously for each core instead of + // within the subtask loop, because we have only a single mutable handle to the + // context, so the work can't really be distributed + let validation_data = match request_full_validation_data_ctx( relay_parent, scheduled_core.para_id, assumption, @@ -235,30 +234,32 @@ async fn handle_new_activations( .await? .await?? { - Some(local_validation_data) => local_validation_data, + Some(v) => v, None => continue, }; - let task_global_validation_data = global_validation_data.clone(); let task_config = config.clone(); let mut task_sender = sender.clone(); let metrics = metrics.clone(); ctx.spawn("collation generation collation builder", Box::pin(async move { - let validation_data_hash = - validation_data_hash(&task_global_validation_data, &local_validation_data); + let persisted_validation_data_hash = validation_data.persisted.hash(); - let collation = (task_config.collator)(&task_global_validation_data, &local_validation_data).await; + let collation = (task_config.collator)(&validation_data).await; let pov_hash = collation.proof_of_validity.hash(); let signature_payload = collator_signature_payload( &relay_parent, &scheduled_core.para_id, - &validation_data_hash, + &persisted_validation_data_hash, &pov_hash, ); - let erasure_root = match erasure_root(n_validators, local_validation_data, task_global_validation_data, collation.proof_of_validity.clone()) { + let erasure_root = match erasure_root( + n_validators, + validation_data.persisted, + collation.proof_of_validity.clone(), + ) { Ok(erasure_root) => erasure_root, Err(err) => { log::error!(target: "collation_generation", "failed to calculate erasure root for para_id {}: {:?}", scheduled_core.para_id, err); @@ -281,7 +282,7 @@ async fn handle_new_activations( para_id: scheduled_core.para_id, relay_parent, collator: task_config.key.public(), - validation_data_hash, + persisted_validation_data_hash, pov_hash, }, }; @@ -302,17 +303,11 @@ async fn handle_new_activations( fn erasure_root( n_validators: usize, - local_validation_data: LocalValidationData, - global_validation_data: GlobalValidationData, + persisted_validation: PersistedValidationData, pov: PoV, ) -> Result { - let omitted_validation = polkadot_primitives::v1::OmittedValidationData { - global_validation: global_validation_data, - local_validation: local_validation_data, - }; - let available_data = AvailableData { - omitted_validation, + validation_data: persisted_validation, pov, }; @@ -369,8 +364,8 @@ mod tests { subsystem_test_harness, TestSubsystemContextHandle, }; use polkadot_primitives::v1::{ - BlockData, BlockNumber, CollatorPair, GlobalValidationData, Id as ParaId, - LocalValidationData, PoV, ScheduledCore, + BlockData, BlockNumber, CollatorPair, Id as ParaId, + PersistedValidationData, PoV, ScheduledCore, ValidationData, }; use std::pin::Pin; @@ -402,7 +397,7 @@ mod tests { fn test_config>(para_id: Id) -> Arc { Arc::new(CollationGenerationConfig { key: CollatorPair::generate().0, - collator: Box::new(|_gvd: &GlobalValidationData, _lvd: &LocalValidationData| { + collator: Box::new(|_vd: &ValidationData| { Box::new(TestCollator) }), para_id: para_id.into(), @@ -417,7 +412,7 @@ mod tests { } #[test] - fn requests_validation_and_availability_per_relay_parent() { + fn requests_availability_per_relay_parent() { let activated_hashes: Vec = vec![ [1; 32].into(), [4; 32].into(), @@ -425,19 +420,13 @@ mod tests { [16; 32].into(), ]; - let requested_validation_data = Arc::new(Mutex::new(Vec::new())); let requested_availability_cores = Arc::new(Mutex::new(Vec::new())); - let overseer_requested_validation_data = requested_validation_data.clone(); let overseer_requested_availability_cores = requested_availability_cores.clone(); let overseer = |mut handle: TestSubsystemContextHandle| async move { loop { match handle.try_recv().await { None => break, - Some(AllMessages::RuntimeApi(RuntimeApiMessage::Request(hash, RuntimeApiRequest::GlobalValidationData(tx)))) => { - overseer_requested_validation_data.lock().await.push(hash); - tx.send(Ok(Default::default())).unwrap(); - } Some(AllMessages::RuntimeApi(RuntimeApiMessage::Request(hash, RuntimeApiRequest::AvailabilityCores(tx)))) => { overseer_requested_availability_cores.lock().await.push(hash); tx.send(Ok(vec![])).unwrap(); @@ -455,7 +444,7 @@ mod tests { let subsystem_activated_hashes = activated_hashes.clone(); subsystem_test_harness(overseer, |mut ctx| async move { handle_new_activations( - test_config(123), + test_config(123u32), &subsystem_activated_hashes, &mut ctx, Metrics(None), @@ -465,21 +454,16 @@ mod tests { .unwrap(); }); - let mut requested_validation_data = Arc::try_unwrap(requested_validation_data) - .expect("overseer should have shut down by now") - .into_inner(); - requested_validation_data.sort(); let mut requested_availability_cores = Arc::try_unwrap(requested_availability_cores) .expect("overseer should have shut down by now") .into_inner(); requested_availability_cores.sort(); - assert_eq!(requested_validation_data, activated_hashes); assert_eq!(requested_availability_cores, activated_hashes); } #[test] - fn requests_local_validation_for_scheduled_matches() { + fn requests_validation_data_for_scheduled_matches() { let activated_hashes: Vec = vec![ Hash::repeat_byte(1), Hash::repeat_byte(4), @@ -487,19 +471,13 @@ mod tests { Hash::repeat_byte(16), ]; - let requested_local_validation_data = Arc::new(Mutex::new(Vec::new())); + let requested_full_validation_data = Arc::new(Mutex::new(Vec::new())); - let overseer_requested_local_validation_data = requested_local_validation_data.clone(); + let overseer_requested_full_validation_data = requested_full_validation_data.clone(); let overseer = |mut handle: TestSubsystemContextHandle| async move { loop { match handle.try_recv().await { None => break, - Some(AllMessages::RuntimeApi(RuntimeApiMessage::Request( - _hash, - RuntimeApiRequest::GlobalValidationData(tx), - ))) => { - tx.send(Ok(Default::default())).unwrap(); - } Some(AllMessages::RuntimeApi(RuntimeApiMessage::Request( hash, RuntimeApiRequest::AvailabilityCores(tx), @@ -518,13 +496,13 @@ mod tests { } Some(AllMessages::RuntimeApi(RuntimeApiMessage::Request( hash, - RuntimeApiRequest::LocalValidationData( + RuntimeApiRequest::FullValidationData( _para_id, _occupied_core_assumption, tx, ), ))) => { - overseer_requested_local_validation_data + overseer_requested_full_validation_data .lock() .await .push(hash); @@ -551,7 +529,7 @@ mod tests { .unwrap(); }); - let requested_local_validation_data = Arc::try_unwrap(requested_local_validation_data) + let requested_full_validation_data = Arc::try_unwrap(requested_full_validation_data) .expect("overseer should have shut down by now") .into_inner(); @@ -559,7 +537,7 @@ mod tests { // each activated hash generates two scheduled cores: one with its value * 4, one with its value * 5 // given that the test configuration has a para_id of 16, there's only one way to get that value: with the 4 // hash. - assert_eq!(requested_local_validation_data, vec![[4; 32].into()]); + assert_eq!(requested_full_validation_data, vec![[4; 32].into()]); } #[test] @@ -575,12 +553,6 @@ mod tests { loop { match handle.try_recv().await { None => break, - Some(AllMessages::RuntimeApi(RuntimeApiMessage::Request( - _hash, - RuntimeApiRequest::GlobalValidationData(tx), - ))) => { - tx.send(Ok(Default::default())).unwrap(); - } Some(AllMessages::RuntimeApi(RuntimeApiMessage::Request( hash, RuntimeApiRequest::AvailabilityCores(tx), @@ -599,7 +571,7 @@ mod tests { } Some(AllMessages::RuntimeApi(RuntimeApiMessage::Request( _hash, - RuntimeApiRequest::LocalValidationData( + RuntimeApiRequest::FullValidationData( _para_id, _occupied_core_assumption, tx, @@ -647,8 +619,8 @@ mod tests { // we don't care too much about the commitments_hash right now, but let's ensure that we've calculated the // correct descriptor let expect_pov_hash = test_collation().proof_of_validity.hash(); - let expect_validation_data_hash = - validation_data_hash::(&Default::default(), &Default::default()); + let expect_validation_data_hash + = PersistedValidationData::::default().hash(); let expect_relay_parent = Hash::repeat_byte(4); let expect_payload = collator_signature_payload( &expect_relay_parent, @@ -661,7 +633,7 @@ mod tests { para_id: config.para_id, relay_parent: expect_relay_parent, collator: config.key.public(), - validation_data_hash: expect_validation_data_hash, + persisted_validation_data_hash: expect_validation_data_hash, pov_hash: expect_pov_hash, }; @@ -680,7 +652,7 @@ mod tests { &collator_signature_payload( &descriptor.relay_parent, &descriptor.para_id, - &descriptor.validation_data_hash, + &descriptor.persisted_validation_data_hash, &descriptor.pov_hash, ) .as_ref(), diff --git a/node/core/av-store/src/lib.rs b/node/core/av-store/src/lib.rs index 84381e438e..5837377dd5 100644 --- a/node/core/av-store/src/lib.rs +++ b/node/core/av-store/src/lib.rs @@ -356,8 +356,7 @@ mod tests { }; use std::cell::RefCell; use polkadot_primitives::v1::{ - AvailableData, BlockData, HeadData, GlobalValidationData, LocalValidationData, PoV, - OmittedValidationData, + AvailableData, BlockData, HeadData, PersistedValidationData, PoV, }; use polkadot_node_subsystem_test_helpers as test_helpers; @@ -370,29 +369,19 @@ mod tests { } struct TestState { - global_validation_schedule: GlobalValidationData, - local_validation_data: LocalValidationData, + persisted_validation_data: PersistedValidationData, } impl Default for TestState { fn default() -> Self { - let local_validation_data = LocalValidationData { + let persisted_validation_data = PersistedValidationData { parent_head: HeadData(vec![7, 8, 9]), - balance: Default::default(), - code_upgrade_allowed: None, - validation_code_hash: Default::default(), - }; - - let global_validation_schedule = GlobalValidationData { - max_code_size: 1000, - max_head_data_size: 1000, block_number: Default::default(), + hrmp_mqc_heads: Vec::new(), }; - Self { - local_validation_data, - global_validation_schedule, + persisted_validation_data, } } } @@ -470,17 +459,9 @@ mod tests { block_data: BlockData(vec![4, 5, 6]), }; - let global_validation = test_state.global_validation_schedule; - let local_validation = test_state.local_validation_data; - - let omitted_validation = OmittedValidationData { - global_validation, - local_validation, - }; - let available_data = AvailableData { pov, - omitted_validation, + validation_data: test_state.persisted_validation_data, }; @@ -531,17 +512,9 @@ mod tests { block_data: BlockData(vec![4, 5, 6]), }; - let global_validation = test_state.global_validation_schedule; - let local_validation = test_state.local_validation_data; - - let omitted_validation = OmittedValidationData { - global_validation, - local_validation, - }; - let available_data = AvailableData { pov, - omitted_validation, + validation_data: test_state.persisted_validation_data, }; let no_metrics = Metrics(None); diff --git a/node/core/backing/src/lib.rs b/node/core/backing/src/lib.rs index 30a95965eb..6ca3b43d14 100644 --- a/node/core/backing/src/lib.rs +++ b/node/core/backing/src/lib.rs @@ -30,7 +30,7 @@ use futures::{ use keystore::KeyStorePtr; use polkadot_primitives::v1::{ CommittedCandidateReceipt, BackedCandidate, Id as ParaId, ValidatorId, - ValidatorIndex, SigningContext, PoV, OmittedValidationData, + ValidatorIndex, SigningContext, PoV, CandidateDescriptor, AvailableData, ValidatorSignature, Hash, CandidateReceipt, CandidateCommitments, CoreState, CoreIndex, }; @@ -623,14 +623,9 @@ impl CandidateBackingJob { outputs: ValidationOutputs, with_commitments: impl FnOnce(CandidateCommitments) -> Result, ) -> Result, Error> { - let omitted_validation = OmittedValidationData { - global_validation: outputs.global_validation_data, - local_validation: outputs.local_validation_data, - }; - let available_data = AvailableData { pov, - omitted_validation, + validation_data: outputs.validation_data, }; let chunks = erasure_coding::obtain_chunks_v1( @@ -835,7 +830,7 @@ mod tests { use futures::{executor, future, Future}; use polkadot_primitives::v1::{ ScheduledCore, BlockData, CandidateCommitments, CollatorId, - LocalValidationData, GlobalValidationData, HeadData, + PersistedValidationData, ValidationData, TransientValidationData, HeadData, ValidatorPair, ValidityAttestation, GroupRotationInfo, }; use polkadot_subsystem::{ @@ -855,8 +850,7 @@ mod tests { keystore: KeyStorePtr, validators: Vec, validator_public: Vec, - global_validation_data: GlobalValidationData, - local_validation_data: LocalValidationData, + validation_data: ValidationData, validator_groups: (Vec>, GroupRotationInfo), availability_cores: Vec, head_data: HashMap, @@ -920,17 +914,18 @@ mod tests { parent_hash: relay_parent, }; - let local_validation_data = LocalValidationData { - parent_head: HeadData(vec![7, 8, 9]), - balance: Default::default(), - code_upgrade_allowed: None, - validation_code_hash: Default::default(), - }; - - let global_validation_data = GlobalValidationData { - max_code_size: 1000, - max_head_data_size: 1000, - block_number: Default::default(), + let validation_data = ValidationData { + persisted: PersistedValidationData { + parent_head: HeadData(vec![7, 8, 9]), + block_number: Default::default(), + hrmp_mqc_heads: Vec::new(), + }, + transient: TransientValidationData { + max_code_size: 1000, + max_head_data_size: 1000, + balance: Default::default(), + code_upgrade_allowed: None, + }, }; Self { @@ -941,8 +936,7 @@ mod tests { validator_groups: (validator_groups, group_rotation_info), availability_cores, head_data, - local_validation_data, - global_validation_data, + validation_data, signing_context, relay_parent, } @@ -971,13 +965,8 @@ mod tests { } fn make_erasure_root(test: &TestState, pov: PoV) -> Hash { - let omitted_validation = OmittedValidationData { - global_validation: test.global_validation_data.clone(), - local_validation: test.local_validation_data.clone(), - }; - let available_data = AvailableData { - omitted_validation, + validation_data: test.validation_data.persisted.clone(), pov, }; @@ -1109,8 +1098,7 @@ mod tests { ) if pov == pov && &c == candidate.descriptor() => { tx.send(Ok( ValidationResult::Valid(ValidationOutputs { - global_validation_data: test_state.global_validation_data, - local_validation_data: test_state.local_validation_data, + validation_data: test_state.validation_data.persisted, head_data: expected_head_data.clone(), upward_messages: Vec::new(), fees: Default::default(), @@ -1221,8 +1209,7 @@ mod tests { ) if pov == pov && &c == candidate_a.descriptor() => { tx.send(Ok( ValidationResult::Valid(ValidationOutputs { - global_validation_data: test_state.global_validation_data, - local_validation_data: test_state.local_validation_data, + validation_data: test_state.validation_data.persisted, head_data: expected_head_data.clone(), upward_messages: Vec::new(), fees: Default::default(), @@ -1351,8 +1338,7 @@ mod tests { ) if pov == pov && &c == candidate_a.descriptor() => { tx.send(Ok( ValidationResult::Valid(ValidationOutputs { - global_validation_data: test_state.global_validation_data, - local_validation_data: test_state.local_validation_data, + validation_data: test_state.validation_data.persisted, head_data: expected_head_data.clone(), upward_messages: Vec::new(), fees: Default::default(), @@ -1508,8 +1494,7 @@ mod tests { ) if pov == pov && &c == candidate_b.descriptor() => { tx.send(Ok( ValidationResult::Valid(ValidationOutputs { - global_validation_data: test_state.global_validation_data, - local_validation_data: test_state.local_validation_data, + validation_data: test_state.validation_data.persisted, head_data: expected_head_data.clone(), upward_messages: Vec::new(), fees: Default::default(), diff --git a/node/core/candidate-validation/src/lib.rs b/node/core/candidate-validation/src/lib.rs index bb832ee195..600dde2c4e 100644 --- a/node/core/candidate-validation/src/lib.rs +++ b/node/core/candidate-validation/src/lib.rs @@ -32,8 +32,8 @@ use polkadot_subsystem::{ use polkadot_subsystem::errors::RuntimeApiError; use polkadot_node_primitives::{ValidationResult, ValidationOutputs, InvalidCandidate}; use polkadot_primitives::v1::{ - ValidationCode, OmittedValidationData, PoV, CandidateDescriptor, LocalValidationData, - GlobalValidationData, OccupiedCoreAssumption, Hash, validation_data_hash, + ValidationCode, PoV, CandidateDescriptor, ValidationData, PersistedValidationData, + TransientValidationData, OccupiedCoreAssumption, Hash, }; use polkadot_parachain::wasm_executor::{self, ValidationPool, ExecutionMode, ValidationError, InvalidCandidate as WasmInvalidCandidate}; @@ -158,7 +158,8 @@ async fn run( } } CandidateValidationMessage::ValidateFromExhaustive( - omitted_validation, + persisted_validation_data, + transient_validation_data, validation_code, descriptor, pov, @@ -167,7 +168,8 @@ async fn run( let res = spawn_validate_exhaustive( &mut ctx, Some(pool.clone()), - omitted_validation, + persisted_validation_data, + transient_validation_data, validation_code, descriptor, pov, @@ -210,7 +212,7 @@ async fn runtime_api_request( #[derive(Debug)] enum AssumptionCheckOutcome { - Matches(OmittedValidationData, ValidationCode), + Matches(ValidationData, ValidationCode), DoesNotMatch, BadRequest, } @@ -218,15 +220,14 @@ enum AssumptionCheckOutcome { async fn check_assumption_validation_data( ctx: &mut impl SubsystemContext, descriptor: &CandidateDescriptor, - global_validation_data: &GlobalValidationData, assumption: OccupiedCoreAssumption, ) -> SubsystemResult { - let local_validation_data = { + let validation_data = { let (tx, rx) = oneshot::channel(); let d = runtime_api_request( ctx, descriptor.relay_parent, - RuntimeApiRequest::LocalValidationData( + RuntimeApiRequest::FullValidationData( descriptor.para_id, assumption, tx, @@ -242,17 +243,9 @@ async fn check_assumption_validation_data( } }; - let validation_data_hash = validation_data_hash( - &global_validation_data, - &local_validation_data, - ); - - SubsystemResult::Ok(if descriptor.validation_data_hash == validation_data_hash { - let omitted_validation = OmittedValidationData { - global_validation: global_validation_data.clone(), - local_validation: local_validation_data, - }; + let persisted_validation_data_hash = validation_data.persisted.hash(); + SubsystemResult::Ok(if descriptor.persisted_validation_data_hash == persisted_validation_data_hash { let (code_tx, code_rx) = oneshot::channel(); let validation_code = runtime_api_request( ctx, @@ -267,7 +260,7 @@ async fn check_assumption_validation_data( match validation_code { Ok(None) | Err(_) => AssumptionCheckOutcome::BadRequest, - Ok(Some(v)) => AssumptionCheckOutcome::Matches(omitted_validation, v), + Ok(Some(v)) => AssumptionCheckOutcome::Matches(validation_data, v), } } else { AssumptionCheckOutcome::DoesNotMatch @@ -281,44 +274,21 @@ async fn spawn_validate_from_chain_state( pov: Arc, spawn: impl SpawnNamed + 'static, ) -> SubsystemResult> { - // The candidate descriptor has a `validation_data_hash` which corresponds to + // The candidate descriptor has a `persisted_validation_data_hash` which corresponds to // one of up to two possible values that we can derive from the state of the - // relay-parent. We can fetch these values by getting the `global_validation_data`, - // and both `local_validation_data` based on the different `OccupiedCoreAssumption`s. - let global_validation_data = { - let (tx, rx) = oneshot::channel(); - let res = runtime_api_request( - ctx, - descriptor.relay_parent, - RuntimeApiRequest::GlobalValidationData(tx), - rx, - ).await?; - - match res { - Ok(g) => g, - Err(e) => { - log::warn!( - target: LOG_TARGET, - "Error making runtime API request: {:?}", - e, - ); - - return Ok(Err(ValidationFailed("Error making API request".into()))); - } - } - }; - + // relay-parent. We can fetch these values by getting the persisted validation data + // based on the different `OccupiedCoreAssumption`s. match check_assumption_validation_data( ctx, &descriptor, - &global_validation_data, OccupiedCoreAssumption::Included, ).await? { - AssumptionCheckOutcome::Matches(omitted_validation, validation_code) => { + AssumptionCheckOutcome::Matches(validation_data, validation_code) => { return spawn_validate_exhaustive( ctx, validation_pool, - omitted_validation, + validation_data.persisted, + Some(validation_data.transient), validation_code, descriptor, pov, @@ -332,14 +302,14 @@ async fn spawn_validate_from_chain_state( match check_assumption_validation_data( ctx, &descriptor, - &global_validation_data, OccupiedCoreAssumption::TimedOut, ).await? { - AssumptionCheckOutcome::Matches(omitted_validation, validation_code) => { + AssumptionCheckOutcome::Matches(validation_data, validation_code) => { return spawn_validate_exhaustive( ctx, validation_pool, - omitted_validation, + validation_data.persisted, + Some(validation_data.transient), validation_code, descriptor, pov, @@ -351,7 +321,7 @@ async fn spawn_validate_from_chain_state( } // If neither the assumption of the occupied core having the para included or the assumption - // of the occupied core timing out are valid, then the validation_data_hash in the descriptor + // of the occupied core timing out are valid, then the persisted_validation_data_hash in the descriptor // is not based on the relay parent and is thus invalid. Ok(Ok(ValidationResult::Invalid(InvalidCandidate::BadParent))) } @@ -359,7 +329,8 @@ async fn spawn_validate_from_chain_state( async fn spawn_validate_exhaustive( ctx: &mut impl SubsystemContext, validation_pool: Option, - omitted_validation: OmittedValidationData, + persisted_validation_data: PersistedValidationData, + transient_validation_data: Option, validation_code: ValidationCode, descriptor: CandidateDescriptor, pov: Arc, @@ -369,7 +340,8 @@ async fn spawn_validate_exhaustive( let fut = async move { let res = validate_candidate_exhaustive::( validation_pool, - omitted_validation, + persisted_validation_data, + transient_validation_data, validation_code, descriptor, pov, @@ -414,16 +386,19 @@ fn perform_basic_checks( /// /// Returns `Ok(())` if checks pass, error otherwise. fn check_wasm_result_against_constraints( - global_validation_data: &GlobalValidationData, - _local_validation_data: &LocalValidationData, + transient_params: &TransientValidationData, result: &WasmValidationResult, ) -> Result<(), InvalidCandidate> { - if result.head_data.0.len() > global_validation_data.max_head_data_size as _ { + if result.head_data.0.len() > transient_params.max_head_data_size as _ { return Err(InvalidCandidate::HeadDataTooLarge(result.head_data.0.len() as u64)) } if let Some(ref code) = result.new_validation_code { - if code.0.len() > global_validation_data.max_code_size as _ { + if transient_params.code_upgrade_allowed.is_none() { + return Err(InvalidCandidate::CodeUpgradeNotAllowed) + } + + if code.0.len() > transient_params.max_code_size as _ { return Err(InvalidCandidate::NewCodeTooLarge(code.0.len() as u64)) } } @@ -471,7 +446,8 @@ impl ValidationBackend for RealValidationBackend { /// Sends the result of validation on the channel once complete. fn validate_candidate_exhaustive( backend_arg: B::Arg, - omitted_validation: OmittedValidationData, + persisted_validation_data: PersistedValidationData, + transient_validation_data: Option, validation_code: ValidationCode, descriptor: CandidateDescriptor, pov: Arc, @@ -481,15 +457,11 @@ fn validate_candidate_exhaustive( return Ok(ValidationResult::Invalid(e)) } - let OmittedValidationData { global_validation, local_validation } = omitted_validation; - let params = ValidationParams { - parent_head: local_validation.parent_head.clone(), + parent_head: persisted_validation_data.parent_head.clone(), block_data: pov.block_data.clone(), - max_code_size: global_validation.max_code_size, - max_head_data_size: global_validation.max_head_data_size, - relay_chain_height: global_validation.block_number, - code_upgrade_allowed: local_validation.code_upgrade_allowed, + relay_chain_height: persisted_validation_data.block_number, + hrmp_mqc_heads: persisted_validation_data.hrmp_mqc_heads.clone(), }; match B::validate(backend_arg, &validation_code, params, spawn) { @@ -507,17 +479,19 @@ fn validate_candidate_exhaustive( Ok(ValidationResult::Invalid(InvalidCandidate::ExecutionError(e.to_string()))), Err(ValidationError::Internal(e)) => Err(ValidationFailed(e.to_string())), Ok(res) => { - let post_check_result = check_wasm_result_against_constraints( - &global_validation, - &local_validation, - &res, - ); + let post_check_result = if let Some(transient) = transient_validation_data { + check_wasm_result_against_constraints( + &transient, + &res, + ) + } else { + Ok(()) + }; Ok(match post_check_result { Ok(()) => ValidationResult::Valid(ValidationOutputs { head_data: res.head_data, - global_validation_data: global_validation, - local_validation_data: local_validation, + validation_data: persisted_validation_data, upward_messages: res.upward_messages, fees: 0, new_validation_code: res.new_validation_code, @@ -562,7 +536,7 @@ mod tests { let payload = polkadot_primitives::v1::collator_signature_payload( &descriptor.relay_parent, &descriptor.para_id, - &descriptor.validation_data_hash, + &descriptor.persisted_validation_data_hash, &descriptor.pov_hash, ); @@ -572,17 +546,16 @@ mod tests { #[test] fn correctly_checks_included_assumption() { - let local_validation_data = LocalValidationData::default(); - let global_validation_data = GlobalValidationData::default(); + let validation_data: ValidationData = Default::default(); let validation_code: ValidationCode = vec![1, 2, 3].into(); - let validation_data_hash = validation_data_hash(&global_validation_data, &local_validation_data); + let persisted_validation_data_hash = validation_data.persisted.hash(); let relay_parent = [2; 32].into(); let para_id = 5.into(); let mut candidate = CandidateDescriptor::default(); candidate.relay_parent = relay_parent; - candidate.validation_data_hash = validation_data_hash; + candidate.persisted_validation_data_hash = persisted_validation_data_hash; candidate.para_id = para_id; let pool = TaskExecutor::new(); @@ -591,22 +564,20 @@ mod tests { let (check_fut, check_result) = check_assumption_validation_data( &mut ctx, &candidate, - &global_validation_data, OccupiedCoreAssumption::Included, ).remote_handle(); - let global_validation_data = global_validation_data.clone(); let test_fut = async move { assert_matches!( ctx_handle.recv().await, AllMessages::RuntimeApi(RuntimeApiMessage::Request( rp, - RuntimeApiRequest::LocalValidationData(p, OccupiedCoreAssumption::Included, tx) + RuntimeApiRequest::FullValidationData(p, OccupiedCoreAssumption::Included, tx) )) => { assert_eq!(rp, relay_parent); assert_eq!(p, para_id); - let _ = tx.send(Ok(Some(local_validation_data.clone()))); + let _ = tx.send(Ok(Some(validation_data.clone()))); } ); @@ -624,11 +595,7 @@ mod tests { ); assert_matches!(check_result.await.unwrap(), AssumptionCheckOutcome::Matches(o, v) => { - assert_eq!(o, OmittedValidationData { - local_validation: local_validation_data, - global_validation: global_validation_data, - }); - + assert_eq!(o, validation_data); assert_eq!(v, validation_code); }); }; @@ -639,17 +606,16 @@ mod tests { #[test] fn correctly_checks_timed_out_assumption() { - let local_validation_data = LocalValidationData::default(); - let global_validation_data = GlobalValidationData::default(); + let validation_data: ValidationData = Default::default(); let validation_code: ValidationCode = vec![1, 2, 3].into(); - let validation_data_hash = validation_data_hash(&global_validation_data, &local_validation_data); + let persisted_validation_data_hash = validation_data.persisted.hash(); let relay_parent = [2; 32].into(); let para_id = 5.into(); let mut candidate = CandidateDescriptor::default(); candidate.relay_parent = relay_parent; - candidate.validation_data_hash = validation_data_hash; + candidate.persisted_validation_data_hash = persisted_validation_data_hash; candidate.para_id = para_id; let pool = TaskExecutor::new(); @@ -658,22 +624,20 @@ mod tests { let (check_fut, check_result) = check_assumption_validation_data( &mut ctx, &candidate, - &global_validation_data, OccupiedCoreAssumption::TimedOut, ).remote_handle(); - let global_validation_data = global_validation_data.clone(); let test_fut = async move { assert_matches!( ctx_handle.recv().await, AllMessages::RuntimeApi(RuntimeApiMessage::Request( rp, - RuntimeApiRequest::LocalValidationData(p, OccupiedCoreAssumption::TimedOut, tx) + RuntimeApiRequest::FullValidationData(p, OccupiedCoreAssumption::TimedOut, tx) )) => { assert_eq!(rp, relay_parent); assert_eq!(p, para_id); - let _ = tx.send(Ok(Some(local_validation_data.clone()))); + let _ = tx.send(Ok(Some(validation_data.clone()))); } ); @@ -691,11 +655,7 @@ mod tests { ); assert_matches!(check_result.await.unwrap(), AssumptionCheckOutcome::Matches(o, v) => { - assert_eq!(o, OmittedValidationData { - local_validation: local_validation_data, - global_validation: global_validation_data, - }); - + assert_eq!(o, validation_data); assert_eq!(v, validation_code); }); }; @@ -706,16 +666,14 @@ mod tests { #[test] fn check_is_bad_request_if_no_validation_data() { - let local_validation_data = LocalValidationData::default(); - let global_validation_data = GlobalValidationData::default(); - - let validation_data_hash = validation_data_hash(&global_validation_data, &local_validation_data); + let validation_data: ValidationData = Default::default(); + let persisted_validation_data_hash = validation_data.persisted.hash(); let relay_parent = [2; 32].into(); let para_id = 5.into(); let mut candidate = CandidateDescriptor::default(); candidate.relay_parent = relay_parent; - candidate.validation_data_hash = validation_data_hash; + candidate.persisted_validation_data_hash = persisted_validation_data_hash; candidate.para_id = para_id; let pool = TaskExecutor::new(); @@ -724,7 +682,6 @@ mod tests { let (check_fut, check_result) = check_assumption_validation_data( &mut ctx, &candidate, - &global_validation_data, OccupiedCoreAssumption::Included, ).remote_handle(); @@ -733,7 +690,7 @@ mod tests { ctx_handle.recv().await, AllMessages::RuntimeApi(RuntimeApiMessage::Request( rp, - RuntimeApiRequest::LocalValidationData(p, OccupiedCoreAssumption::Included, tx) + RuntimeApiRequest::FullValidationData(p, OccupiedCoreAssumption::Included, tx) )) => { assert_eq!(rp, relay_parent); assert_eq!(p, para_id); @@ -751,16 +708,14 @@ mod tests { #[test] fn check_is_bad_request_if_no_validation_code() { - let local_validation_data = LocalValidationData::default(); - let global_validation_data = GlobalValidationData::default(); - - let validation_data_hash = validation_data_hash(&global_validation_data, &local_validation_data); + let validation_data: ValidationData = Default::default(); + let persisted_validation_data_hash = validation_data.persisted.hash(); let relay_parent = [2; 32].into(); let para_id = 5.into(); let mut candidate = CandidateDescriptor::default(); candidate.relay_parent = relay_parent; - candidate.validation_data_hash = validation_data_hash; + candidate.persisted_validation_data_hash = persisted_validation_data_hash; candidate.para_id = para_id; let pool = TaskExecutor::new(); @@ -769,7 +724,6 @@ mod tests { let (check_fut, check_result) = check_assumption_validation_data( &mut ctx, &candidate, - &global_validation_data, OccupiedCoreAssumption::TimedOut, ).remote_handle(); @@ -778,12 +732,12 @@ mod tests { ctx_handle.recv().await, AllMessages::RuntimeApi(RuntimeApiMessage::Request( rp, - RuntimeApiRequest::LocalValidationData(p, OccupiedCoreAssumption::TimedOut, tx) + RuntimeApiRequest::FullValidationData(p, OccupiedCoreAssumption::TimedOut, tx) )) => { assert_eq!(rp, relay_parent); assert_eq!(p, para_id); - let _ = tx.send(Ok(Some(local_validation_data.clone()))); + let _ = tx.send(Ok(Some(validation_data.clone()))); } ); @@ -809,15 +763,13 @@ mod tests { #[test] fn check_does_not_match() { - let local_validation_data = LocalValidationData::default(); - let global_validation_data = GlobalValidationData::default(); - + let validation_data: ValidationData = Default::default(); let relay_parent = [2; 32].into(); let para_id = 5.into(); let mut candidate = CandidateDescriptor::default(); candidate.relay_parent = relay_parent; - candidate.validation_data_hash = [3; 32].into(); + candidate.persisted_validation_data_hash = [3; 32].into(); candidate.para_id = para_id; let pool = TaskExecutor::new(); @@ -826,7 +778,6 @@ mod tests { let (check_fut, check_result) = check_assumption_validation_data( &mut ctx, &candidate, - &global_validation_data, OccupiedCoreAssumption::Included, ).remote_handle(); @@ -835,12 +786,12 @@ mod tests { ctx_handle.recv().await, AllMessages::RuntimeApi(RuntimeApiMessage::Request( rp, - RuntimeApiRequest::LocalValidationData(p, OccupiedCoreAssumption::Included, tx) + RuntimeApiRequest::FullValidationData(p, OccupiedCoreAssumption::Included, tx) )) => { assert_eq!(rp, relay_parent); assert_eq!(p, para_id); - let _ = tx.send(Ok(Some(local_validation_data.clone()))); + let _ = tx.send(Ok(Some(validation_data.clone()))); } ); @@ -853,13 +804,10 @@ mod tests { #[test] fn candidate_validation_ok_is_ok() { - let mut omitted_validation = OmittedValidationData { - local_validation: Default::default(), - global_validation: Default::default(), - }; - - omitted_validation.global_validation.max_head_data_size = 1024; - omitted_validation.global_validation.max_code_size = 1024; + let mut validation_data: ValidationData = Default::default(); + validation_data.transient.max_head_data_size = 1024; + validation_data.transient.max_code_size = 1024; + validation_data.transient.code_upgrade_allowed = Some(20); let pov = PoV { block_data: BlockData(vec![1; 32]) }; @@ -877,14 +825,14 @@ mod tests { }; assert!(check_wasm_result_against_constraints( - &omitted_validation.global_validation, - &omitted_validation.local_validation, + &validation_data.transient, &validation_result, ).is_ok()); let v = validate_candidate_exhaustive::( MockValidationArg { result: Ok(validation_result) }, - omitted_validation.clone(), + validation_data.persisted.clone(), + Some(validation_data.transient), vec![1, 2, 3].into(), descriptor, Arc::new(pov), @@ -893,8 +841,7 @@ mod tests { assert_matches!(v, ValidationResult::Valid(outputs) => { assert_eq!(outputs.head_data, HeadData(vec![1, 1, 1])); - assert_eq!(outputs.global_validation_data, omitted_validation.global_validation); - assert_eq!(outputs.local_validation_data, omitted_validation.local_validation); + assert_eq!(outputs.validation_data, validation_data.persisted); assert_eq!(outputs.upward_messages, Vec::new()); assert_eq!(outputs.fees, 0); assert_eq!(outputs.new_validation_code, Some(vec![2, 2, 2].into())); @@ -903,13 +850,11 @@ mod tests { #[test] fn candidate_validation_bad_return_is_invalid() { - let mut omitted_validation = OmittedValidationData { - local_validation: Default::default(), - global_validation: Default::default(), - }; + let mut validation_data: ValidationData = Default::default(); - omitted_validation.global_validation.max_head_data_size = 1024; - omitted_validation.global_validation.max_code_size = 1024; + validation_data.transient.max_head_data_size = 1024; + validation_data.transient.max_code_size = 1024; + validation_data.transient.code_upgrade_allowed = Some(20); let pov = PoV { block_data: BlockData(vec![1; 32]) }; @@ -927,8 +872,7 @@ mod tests { }; assert!(check_wasm_result_against_constraints( - &omitted_validation.global_validation, - &omitted_validation.local_validation, + &validation_data.transient, &validation_result, ).is_ok()); @@ -938,7 +882,8 @@ mod tests { WasmInvalidCandidate::BadReturn )) }, - omitted_validation.clone(), + validation_data.persisted, + Some(validation_data.transient), vec![1, 2, 3].into(), descriptor, Arc::new(pov), @@ -951,13 +896,11 @@ mod tests { #[test] fn candidate_validation_timeout_is_internal_error() { - let mut omitted_validation = OmittedValidationData { - local_validation: Default::default(), - global_validation: Default::default(), - }; + let mut validation_data: ValidationData = Default::default(); - omitted_validation.global_validation.max_head_data_size = 1024; - omitted_validation.global_validation.max_code_size = 1024; + validation_data.transient.max_head_data_size = 1024; + validation_data.transient.max_code_size = 1024; + validation_data.transient.code_upgrade_allowed = Some(20); let pov = PoV { block_data: BlockData(vec![1; 32]) }; @@ -975,8 +918,7 @@ mod tests { }; assert!(check_wasm_result_against_constraints( - &omitted_validation.global_validation, - &omitted_validation.local_validation, + &validation_data.transient, &validation_result, ).is_ok()); @@ -986,7 +928,8 @@ mod tests { WasmInvalidCandidate::Timeout )) }, - omitted_validation.clone(), + validation_data.persisted, + Some(validation_data.transient), vec![1, 2, 3].into(), descriptor, Arc::new(pov), @@ -995,4 +938,49 @@ mod tests { assert_matches!(v, Ok(ValidationResult::Invalid(InvalidCandidate::Timeout))); } + + #[test] + fn candidate_validation_ok_does_not_validate_outputs_if_no_transient() { + let mut validation_data: ValidationData = Default::default(); + validation_data.transient.max_head_data_size = 1; + validation_data.transient.max_code_size = 1; + + let pov = PoV { block_data: BlockData(vec![1; 32]) }; + + let mut descriptor = CandidateDescriptor::default(); + descriptor.pov_hash = pov.hash(); + collator_sign(&mut descriptor, Sr25519Keyring::Alice); + + assert!(perform_basic_checks(&descriptor, Some(1024), &pov).is_ok()); + + let validation_result = WasmValidationResult { + head_data: HeadData(vec![1, 1, 1]), + new_validation_code: Some(vec![2, 2, 2].into()), + upward_messages: Vec::new(), + processed_downward_messages: 0, + }; + + assert!(check_wasm_result_against_constraints( + &validation_data.transient, + &validation_result, + ).is_err()); + + let v = validate_candidate_exhaustive::( + MockValidationArg { result: Ok(validation_result) }, + validation_data.persisted.clone(), + None, + vec![1, 2, 3].into(), + descriptor, + Arc::new(pov), + TaskExecutor::new(), + ).unwrap(); + + assert_matches!(v, ValidationResult::Valid(outputs) => { + assert_eq!(outputs.head_data, HeadData(vec![1, 1, 1])); + assert_eq!(outputs.validation_data, validation_data.persisted); + assert_eq!(outputs.upward_messages, Vec::new()); + assert_eq!(outputs.fees, 0); + assert_eq!(outputs.new_validation_code, Some(vec![2, 2, 2].into())); + }); + } } diff --git a/node/core/provisioner/src/lib.rs b/node/core/provisioner/src/lib.rs index ef93d15ab8..2425473428 100644 --- a/node/core/provisioner/src/lib.rs +++ b/node/core/provisioner/src/lib.rs @@ -35,11 +35,10 @@ use polkadot_node_subsystem::{ use polkadot_node_subsystem_util::{ self as util, delegated_subsystem, - request_availability_cores, request_global_validation_data, - request_local_validation_data, JobTrait, ToJobTrait, + request_availability_cores, request_persisted_validation_data, JobTrait, ToJobTrait, }; use polkadot_primitives::v1::{ - validation_data_hash, BackedCandidate, BlockNumber, CoreState, Hash, OccupiedCoreAssumption, + BackedCandidate, BlockNumber, CoreState, Hash, OccupiedCoreAssumption, SignedAvailabilityBitfield, }; use std::{collections::HashMap, convert::TryFrom, pin::Pin}; @@ -355,10 +354,6 @@ async fn select_candidates( ) -> Result, Error> { let block_number = get_block_number_under_construction(relay_parent, sender).await?; - let global_validation_data = request_global_validation_data(relay_parent, sender) - .await? - .await??; - let mut selected_candidates = Vec::with_capacity(candidates.len().min(availability_cores.len())); @@ -387,7 +382,7 @@ async fn select_candidates( _ => continue, }; - let local_validation_data = match request_local_validation_data( + let validation_data = match request_persisted_validation_data( relay_parent, scheduled_core.para_id, assumption, @@ -396,18 +391,17 @@ async fn select_candidates( .await? .await?? { - Some(local_validation_data) => local_validation_data, + Some(v) => v, None => continue, }; - let computed_validation_data_hash = - validation_data_hash(&global_validation_data, &local_validation_data); + let computed_validation_data_hash = validation_data.hash(); // we arbitrarily pick the first of the backed candidates which match the appropriate selection criteria if let Some(candidate) = candidates.iter().find(|backed_candidate| { let descriptor = &backed_candidate.candidate.descriptor; descriptor.para_id == scheduled_core.para_id - && descriptor.validation_data_hash == computed_validation_data_hash + && descriptor.persisted_validation_data_hash == computed_validation_data_hash }) { selected_candidates.push(candidate.clone()); } @@ -657,10 +651,10 @@ mod tests { use super::super::*; use super::{build_occupied_core, default_bitvec, occupied_core, scheduled_core}; use polkadot_node_subsystem::messages::RuntimeApiRequest::{ - AvailabilityCores, GlobalValidationData, LocalValidationData, + AvailabilityCores, PersistedValidationData as PersistedValidationDataReq, }; use polkadot_primitives::v1::{ - BlockNumber, CandidateDescriptor, CommittedCandidateReceipt, + BlockNumber, CandidateDescriptor, CommittedCandidateReceipt, PersistedValidationData, }; use FromJob::{ChainApi, Runtime}; @@ -771,12 +765,9 @@ mod tests { ChainApi(BlockNumber(_relay_parent, tx)) => { tx.send(Ok(Some(BLOCK_UNDER_PRODUCTION - 1))).unwrap() } - Runtime(Request(_parent_hash, GlobalValidationData(tx))) => { - tx.send(Ok(Default::default())).unwrap() - } Runtime(Request( _parent_hash, - LocalValidationData(_para_id, _assumption, tx), + PersistedValidationDataReq(_para_id, _assumption, tx), )) => tx.send(Ok(Some(Default::default()))).unwrap(), Runtime(Request(_parent_hash, AvailabilityCores(tx))) => { tx.send(Ok(mock_availability_cores())).unwrap() @@ -823,14 +814,12 @@ mod tests { fn selects_correct_candidates() { let mock_cores = mock_availability_cores(); - let empty_hash = - validation_data_hash::(&Default::default(), &Default::default()); - dbg!(empty_hash); + let empty_hash = PersistedValidationData::::default().hash(); let candidate_template = BackedCandidate { candidate: CommittedCandidateReceipt { descriptor: CandidateDescriptor { - validation_data_hash: empty_hash, + persisted_validation_data_hash: empty_hash, ..Default::default() }, ..Default::default() @@ -855,7 +844,8 @@ mod tests { candidate } else if idx < mock_cores.len() * 2 { // for the second repetition of the candidates, give them the wrong hash - candidate.candidate.descriptor.validation_data_hash = Default::default(); + candidate.candidate.descriptor.persisted_validation_data_hash + = Default::default(); candidate } else { // third go-around: right hash, wrong para_id diff --git a/node/core/runtime-api/src/lib.rs b/node/core/runtime-api/src/lib.rs index dd5f247eb0..3c05b71dd7 100644 --- a/node/core/runtime-api/src/lib.rs +++ b/node/core/runtime-api/src/lib.rs @@ -110,9 +110,10 @@ fn make_runtime_api_request( Request::Validators(sender) => query!(validators(), sender), Request::ValidatorGroups(sender) => query!(validator_groups(), sender), Request::AvailabilityCores(sender) => query!(availability_cores(), sender), - Request::GlobalValidationData(sender) => query!(global_validation_data(), sender), - Request::LocalValidationData(para, assumption, sender) => - query!(local_validation_data(para, assumption), sender), + Request::PersistedValidationData(para, assumption, sender) => + query!(persisted_validation_data(para, assumption), sender), + Request::FullValidationData(para, assumption, sender) => + query!(full_validation_data(para, assumption), sender), Request::SessionIndexForChild(sender) => query!(session_index_for_child(), sender), Request::ValidationCode(para, assumption, sender) => query!(validation_code(para, assumption), sender), @@ -166,8 +167,8 @@ mod tests { use super::*; use polkadot_primitives::v1::{ - ValidatorId, ValidatorIndex, GroupRotationInfo, CoreState, GlobalValidationData, - Id as ParaId, OccupiedCoreAssumption, LocalValidationData, SessionIndex, ValidationCode, + ValidatorId, ValidatorIndex, GroupRotationInfo, CoreState, PersistedValidationData, + Id as ParaId, OccupiedCoreAssumption, ValidationData, SessionIndex, ValidationCode, CommittedCandidateReceipt, CandidateEvent, }; use polkadot_node_subsystem_test_helpers as test_helpers; @@ -181,8 +182,7 @@ mod tests { validators: Vec, validator_groups: Vec>, availability_cores: Vec, - global_validation_data: GlobalValidationData, - local_validation_data: HashMap, + validation_data: HashMap, session_index_for_child: SessionIndex, validation_code: HashMap, candidate_pending_availability: HashMap, @@ -220,16 +220,20 @@ mod tests { self.availability_cores.clone() } - fn global_validation_data(&self) -> GlobalValidationData { - self.global_validation_data.clone() + fn persisted_validation_data( + &self, + para: ParaId, + _assumption: OccupiedCoreAssumption, + ) -> Option { + self.validation_data.get(¶).map(|l| l.persisted.clone()) } - fn local_validation_data( + fn full_validation_data( &self, para: ParaId, _assumption: OccupiedCoreAssumption, - ) -> Option { - self.local_validation_data.get(¶).map(|l| l.clone()) + ) -> Option { + self.validation_data.get(¶).map(|l| l.clone()) } fn session_index_for_child(&self) -> SessionIndex { @@ -327,10 +331,14 @@ mod tests { } #[test] - fn requests_global_validation_data() { + fn requests_persisted_validation_data() { let (ctx, mut ctx_handle) = test_helpers::make_subsystem_context(TaskExecutor::new()); - let runtime_api = MockRuntimeApi::default(); + let mut runtime_api = MockRuntimeApi::default(); let relay_parent = [1; 32].into(); + let para_a = 5.into(); + let para_b = 6.into(); + + runtime_api.validation_data.insert(para_a, Default::default()); let subsystem = RuntimeApiSubsystem::new(runtime_api.clone(), Metrics(None)); let subsystem_task = run(ctx, subsystem).map(|x| x.unwrap()); @@ -338,10 +346,23 @@ mod tests { let (tx, rx) = oneshot::channel(); ctx_handle.send(FromOverseer::Communication { - msg: RuntimeApiMessage::Request(relay_parent, Request::GlobalValidationData(tx)) + msg: RuntimeApiMessage::Request( + relay_parent, + Request::PersistedValidationData(para_a, OccupiedCoreAssumption::Included, tx) + ), }).await; - assert_eq!(rx.await.unwrap().unwrap(), runtime_api.global_validation_data); + assert_eq!(rx.await.unwrap().unwrap(), Some(Default::default())); + + let (tx, rx) = oneshot::channel(); + ctx_handle.send(FromOverseer::Communication { + msg: RuntimeApiMessage::Request( + relay_parent, + Request::PersistedValidationData(para_b, OccupiedCoreAssumption::Included, tx) + ), + }).await; + + assert_eq!(rx.await.unwrap().unwrap(), None); ctx_handle.send(FromOverseer::Signal(OverseerSignal::Conclude)).await; }; @@ -350,14 +371,14 @@ mod tests { } #[test] - fn requests_local_validation_data() { + fn requests_full_validation_data() { let (ctx, mut ctx_handle) = test_helpers::make_subsystem_context(TaskExecutor::new()); let mut runtime_api = MockRuntimeApi::default(); let relay_parent = [1; 32].into(); let para_a = 5.into(); let para_b = 6.into(); - runtime_api.local_validation_data.insert(para_a, Default::default()); + runtime_api.validation_data.insert(para_a, Default::default()); let subsystem = RuntimeApiSubsystem::new(runtime_api.clone(), Metrics(None)); let subsystem_task = run(ctx, subsystem).map(|x| x.unwrap()); @@ -367,7 +388,7 @@ mod tests { ctx_handle.send(FromOverseer::Communication { msg: RuntimeApiMessage::Request( relay_parent, - Request::LocalValidationData(para_a, OccupiedCoreAssumption::Included, tx) + Request::FullValidationData(para_a, OccupiedCoreAssumption::Included, tx) ), }).await; @@ -377,7 +398,7 @@ mod tests { ctx_handle.send(FromOverseer::Communication { msg: RuntimeApiMessage::Request( relay_parent, - Request::LocalValidationData(para_b, OccupiedCoreAssumption::Included, tx) + Request::FullValidationData(para_b, OccupiedCoreAssumption::Included, tx) ), }).await; diff --git a/node/network/availability-distribution/src/tests.rs b/node/network/availability-distribution/src/tests.rs index f4988fd8b7..143fd8b05b 100644 --- a/node/network/availability-distribution/src/tests.rs +++ b/node/network/availability-distribution/src/tests.rs @@ -18,9 +18,9 @@ use super::*; use assert_matches::assert_matches; use polkadot_erasure_coding::{branches, obtain_chunks_v1 as obtain_chunks}; use polkadot_primitives::v1::{ - AvailableData, BlockData, CandidateCommitments, CandidateDescriptor, GlobalValidationData, - GroupIndex, GroupRotationInfo, HeadData, LocalValidationData, OccupiedCore, - OmittedValidationData, PoV, ScheduledCore, ValidatorPair, + AvailableData, BlockData, CandidateCommitments, CandidateDescriptor, GroupIndex, + GroupRotationInfo, HeadData, PersistedValidationData, OccupiedCore, + PoV, ScheduledCore, ValidatorPair, }; use polkadot_subsystem_testhelpers as test_helpers; use polkadot_node_network_protocol::ObservedRole; @@ -148,8 +148,7 @@ struct TestState { relay_parent: Hash, ancestors: Vec, availability_cores: Vec, - global_validation_data: GlobalValidationData, - local_validation_data: LocalValidationData, + persisted_validation_data: PersistedValidationData, } fn validator_pubkeys(val_ids: &[Sr25519Keyring]) -> Vec { @@ -210,17 +209,10 @@ impl Default for TestState { ]; let relay_parent = Hash::repeat_byte(0x05); - let local_validation_data = LocalValidationData { + let persisted_validation_data = PersistedValidationData { parent_head: HeadData(vec![7, 8, 9]), - balance: Default::default(), - code_upgrade_allowed: None, - validation_code_hash: Default::default(), - }; - - let global_validation_data = GlobalValidationData { - max_code_size: 1000, - max_head_data_size: 1000, block_number: Default::default(), + hrmp_mqc_heads: Vec::new(), }; let validator_index = Some((validators.len() - 1) as ValidatorIndex); @@ -233,8 +225,7 @@ impl Default for TestState { validator_groups, availability_cores, head_data, - local_validation_data, - global_validation_data, + persisted_validation_data, relay_parent, ancestors, validator_index, @@ -243,13 +234,8 @@ impl Default for TestState { } fn make_available_data(test: &TestState, pov: PoV) -> AvailableData { - let omitted_validation = OmittedValidationData { - global_validation: test.global_validation_data.clone(), - local_validation: test.local_validation_data.clone(), - }; - AvailableData { - omitted_validation, + validation_data: test.persisted_validation_data.clone(), pov, } } @@ -434,8 +420,7 @@ fn reputation_verification() { validator_groups, availability_cores, head_data: _, - local_validation_data: _, - global_validation_data: _, + persisted_validation_data: _, relay_parent: current, ancestors, validator_index: _, diff --git a/node/overseer/src/lib.rs b/node/overseer/src/lib.rs index 321a20f568..1d4c7bcaf4 100644 --- a/node/overseer/src/lib.rs +++ b/node/overseer/src/lib.rs @@ -1800,7 +1800,7 @@ mod tests { fn test_collator_generation_msg() -> CollationGenerationMessage { CollationGenerationMessage::Initialize(CollationGenerationConfig { key: CollatorPair::generate().0, - collator: Box::new(|_, _| Box::new(TestCollator)), + collator: Box::new(|_| Box::new(TestCollator)), para_id: Default::default(), }) } diff --git a/node/primitives/src/lib.rs b/node/primitives/src/lib.rs index 2ff704c2dd..df8bc22551 100644 --- a/node/primitives/src/lib.rs +++ b/node/primitives/src/lib.rs @@ -25,7 +25,7 @@ use parity_scale_codec::{Decode, Encode}; use polkadot_primitives::v1::{ Hash, CommittedCandidateReceipt, CandidateReceipt, CompactStatement, EncodeAs, Signed, SigningContext, ValidatorIndex, ValidatorId, - UpwardMessage, Balance, ValidationCode, GlobalValidationData, LocalValidationData, + UpwardMessage, Balance, ValidationCode, PersistedValidationData, ValidationData, HeadData, PoV, CollatorPair, Id as ParaId, }; use polkadot_statement_table::{ @@ -118,10 +118,8 @@ pub struct FromTableMisbehavior { pub struct ValidationOutputs { /// The head-data produced by validation. pub head_data: HeadData, - /// The global validation schedule. - pub global_validation_data: GlobalValidationData, - /// The local validation data. - pub local_validation_data: LocalValidationData, + /// The persisted validation data. + pub validation_data: PersistedValidationData, /// Upward messages to the relay chain. pub upward_messages: Vec, /// Fees paid to the validators of the relay-chain. @@ -153,6 +151,8 @@ pub enum InvalidCandidate { NewCodeTooLarge(u64), /// Head-data is over the limit. HeadDataTooLarge(u64), + /// Code upgrade triggered but not allowed. + CodeUpgradeNotAllowed, } /// Result of the validation of the candidate. @@ -285,7 +285,7 @@ pub struct CollationGenerationConfig { /// Collator's authentication key, so it can sign things. pub key: CollatorPair, /// Collation function. - pub collator: Box Box + Unpin + Send> + Send + Sync>, + pub collator: Box Box + Unpin + Send> + Send + Sync>, /// The parachain that this collator collates for pub para_id: ParaId, } diff --git a/node/subsystem-util/src/lib.rs b/node/subsystem-util/src/lib.rs index 57f1efed3b..ab77427153 100644 --- a/node/subsystem-util/src/lib.rs +++ b/node/subsystem-util/src/lib.rs @@ -39,8 +39,8 @@ use keystore::KeyStorePtr; use parity_scale_codec::Encode; use pin_project::{pin_project, pinned_drop}; use polkadot_primitives::v1::{ - CandidateEvent, CommittedCandidateReceipt, CoreState, EncodeAs, GlobalValidationData, - GroupRotationInfo, Hash, Id as ParaId, LocalValidationData, OccupiedCoreAssumption, + CandidateEvent, CommittedCandidateReceipt, CoreState, EncodeAs, PersistedValidationData, + GroupRotationInfo, Hash, Id as ParaId, ValidationData, OccupiedCoreAssumption, SessionIndex, Signed, SigningContext, ValidationCode, ValidatorId, ValidatorIndex, ValidatorPair, }; @@ -184,8 +184,8 @@ specialize_requests! { fn request_validators() -> Vec; Validators; fn request_validator_groups() -> (Vec>, GroupRotationInfo); ValidatorGroups; fn request_availability_cores() -> Vec; AvailabilityCores; - fn request_global_validation_data() -> GlobalValidationData; GlobalValidationData; - fn request_local_validation_data(para_id: ParaId, assumption: OccupiedCoreAssumption) -> Option; LocalValidationData; + fn request_full_validation_data(para_id: ParaId, assumption: OccupiedCoreAssumption) -> Option; FullValidationData; + fn request_persisted_validation_data(para_id: ParaId, assumption: OccupiedCoreAssumption) -> Option; PersistedValidationData; fn request_session_index_for_child() -> SessionIndex; SessionIndexForChild; fn request_validation_code(para_id: ParaId, assumption: OccupiedCoreAssumption) -> Option; ValidationCode; fn request_candidate_pending_availability(para_id: ParaId) -> Option; CandidatePendingAvailability; @@ -267,8 +267,8 @@ specialize_requests_ctx! { fn request_validators_ctx() -> Vec; Validators; fn request_validator_groups_ctx() -> (Vec>, GroupRotationInfo); ValidatorGroups; fn request_availability_cores_ctx() -> Vec; AvailabilityCores; - fn request_global_validation_data_ctx() -> GlobalValidationData; GlobalValidationData; - fn request_local_validation_data_ctx(para_id: ParaId, assumption: OccupiedCoreAssumption) -> Option; LocalValidationData; + fn request_full_validation_data_ctx(para_id: ParaId, assumption: OccupiedCoreAssumption) -> Option; FullValidationData; + fn request_persisted_validation_data_ctx(para_id: ParaId, assumption: OccupiedCoreAssumption) -> Option; PersistedValidationData; fn request_session_index_for_child_ctx() -> SessionIndex; SessionIndexForChild; fn request_validation_code_ctx(para_id: ParaId, assumption: OccupiedCoreAssumption) -> Option; ValidationCode; fn request_candidate_pending_availability_ctx(para_id: ParaId) -> Option; CandidatePendingAvailability; diff --git a/node/subsystem/src/messages.rs b/node/subsystem/src/messages.rs index 9891692a06..39f3dc923f 100644 --- a/node/subsystem/src/messages.rs +++ b/node/subsystem/src/messages.rs @@ -33,9 +33,9 @@ use polkadot_node_primitives::{ use polkadot_primitives::v1::{ AvailableData, BackedCandidate, BlockNumber, CandidateDescriptor, CandidateEvent, CandidateReceipt, CollatorId, CommittedCandidateReceipt, - CoreState, ErasureChunk, GlobalValidationData, GroupRotationInfo, - Hash, Id as ParaId, LocalValidationData, OccupiedCoreAssumption, OmittedValidationData, PoV, - SessionIndex, SignedAvailabilityBitfield, ValidationCode, ValidatorId, ValidatorIndex, + CoreState, ErasureChunk, GroupRotationInfo, Hash, Id as ParaId, + OccupiedCoreAssumption, PersistedValidationData, PoV, SessionIndex, SignedAvailabilityBitfield, + TransientValidationData, ValidationCode, ValidatorId, ValidationData, ValidatorIndex, ValidatorSignature, }; use std::sync::Arc; @@ -107,7 +107,7 @@ pub struct ValidationFailed(pub String); pub enum CandidateValidationMessage { /// Validate a candidate with provided parameters using relay-chain state. /// - /// This will implicitly attempt to gather the `OmittedValidationData` and `ValidationCode` + /// This will implicitly attempt to gather the `PersistedValidationData` and `ValidationCode` /// from the runtime API of the chain, based on the `relay_parent` /// of the `CandidateDescriptor`. /// @@ -120,10 +120,12 @@ pub enum CandidateValidationMessage { ), /// Validate a candidate with provided, exhaustive parameters for validation. /// - /// Explicitly provide the `OmittedValidationData` and `ValidationCode` so this can do full - /// validation without needing to access the state of the relay-chain. + /// Explicitly provide the `PersistedValidationData` and `ValidationCode` so this can do full + /// validation without needing to access the state of the relay-chain. Optionally provide the + /// `TransientValidationData` for further checks on the outputs. ValidateFromExhaustive( - OmittedValidationData, + PersistedValidationData, + Option, ValidationCode, CandidateDescriptor, Arc, @@ -136,7 +138,7 @@ impl CandidateValidationMessage { pub fn relay_parent(&self) -> Option { match self { Self::ValidateFromChainState(_, _, _) => None, - Self::ValidateFromExhaustive(_, _, _, _, _) => None, + Self::ValidateFromExhaustive(_, _, _, _, _, _) => None, } } } @@ -357,15 +359,21 @@ pub enum RuntimeApiRequest { ValidatorGroups(RuntimeApiSender<(Vec>, GroupRotationInfo)>), /// Get information on all availability cores. AvailabilityCores(RuntimeApiSender>), - /// Get the global validation data. - GlobalValidationData(RuntimeApiSender), - /// Get the local validation data for a particular para, taking the given + /// Get the persisted validation data for a particular para, taking the given /// `OccupiedCoreAssumption`, which will inform on how the validation data should be computed /// if the para currently occupies a core. - LocalValidationData( + PersistedValidationData( ParaId, OccupiedCoreAssumption, - RuntimeApiSender>, + RuntimeApiSender>, + ), + /// Get the full validation data for a particular para, taking the given + /// `OccupiedCoreAssumption`, which will inform on how the validation data should be computed + /// if the para currently occupies a core. + FullValidationData( + ParaId, + OccupiedCoreAssumption, + RuntimeApiSender>, ), /// Get the session index that a child of the block will have. SessionIndexForChild(RuntimeApiSender), diff --git a/parachain/src/primitives.rs b/parachain/src/primitives.rs index 955842e30f..3a1ee81bcd 100644 --- a/parachain/src/primitives.rs +++ b/parachain/src/primitives.rs @@ -28,6 +28,8 @@ use serde::{Serialize, Deserialize}; #[cfg(feature = "std")] use sp_core::bytes; +use polkadot_core_primitives::Hash; + /// Block number type used by the relay chain. pub use polkadot_core_primitives::BlockNumber as RelayChainBlockNumber; @@ -228,22 +230,16 @@ pub struct UpwardMessage { #[derive(PartialEq, Eq, Decode)] #[cfg_attr(feature = "std", derive(Debug, Encode))] pub struct ValidationParams { - /// The collation body. - pub block_data: BlockData, /// Previous head-data. pub parent_head: HeadData, - /// The maximum code size permitted, in bytes. - pub max_code_size: u32, - /// The maximum head-data size permitted, in bytes. - pub max_head_data_size: u32, + /// The collation body. + pub block_data: BlockData, /// The current relay-chain block number. - pub relay_chain_height: polkadot_core_primitives::BlockNumber, - /// Whether a code upgrade is allowed or not, and at which height the upgrade - /// would be applied after, if so. The parachain logic should apply any upgrade - /// issued in this block after the first block - /// with `relay_chain_height` at least this value, if `Some`. if `None`, issue - /// no upgrade. - pub code_upgrade_allowed: Option, + pub relay_chain_height: RelayChainBlockNumber, + /// The list of MQC heads for the inbound HRMP channels paired with the sender para ids. This + /// vector is sorted ascending by the para id and doesn't contain multiple entries with the same + /// sender. + pub hrmp_mqc_heads: Vec<(Id, Hash)>, } /// The result of parachain validation. diff --git a/parachain/test-parachains/Cargo.toml b/parachain/test-parachains/Cargo.toml index 044115119d..d391c1b231 100644 --- a/parachain/test-parachains/Cargo.toml +++ b/parachain/test-parachains/Cargo.toml @@ -12,7 +12,6 @@ codec = { package = "parity-scale-codec", version = "1.3.4", default-features = parachain = { package = "polkadot-parachain", path = ".." } adder = { package = "test-parachain-adder", path = "adder" } halt = { package = "test-parachain-halt", path = "halt" } -code-upgrader = { package = "test-parachain-code-upgrader", path = "code-upgrader" } [dev-dependencies] sp-core = { git = "https://github.com/paritytech/substrate", branch = "master" } @@ -22,5 +21,4 @@ default = [ "std" ] std = [ "adder/std", "halt/std", - "code-upgrader/std", ] diff --git a/parachain/test-parachains/code-upgrader/Cargo.toml b/parachain/test-parachains/code-upgrader/Cargo.toml deleted file mode 100644 index 6f673adbf8..0000000000 --- a/parachain/test-parachains/code-upgrader/Cargo.toml +++ /dev/null @@ -1,27 +0,0 @@ -[package] -name = "test-parachain-code-upgrader" -version = "0.7.22" -authors = ["Parity Technologies "] -description = "Test parachain which can upgrade code" -edition = "2018" -build = "build.rs" - -[dependencies] -parachain = { package = "polkadot-parachain", path = "../../", default-features = false, features = [ "wasm-api" ] } -codec = { package = "parity-scale-codec", version = "1.1.0", default-features = false, features = ["derive"] } -sp-std = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -tiny-keccak = "1.5.0" -dlmalloc = { version = "0.1.3", features = [ "global" ] } - -# We need to make sure the global allocator is disabled until we have support of full substrate externalities -runtime-io = { package = "sp-io", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false, features = [ "disable_allocator" ] } - -[build-dependencies] -wasm-builder-runner = { package = "substrate-wasm-builder-runner", version = "1.0.6" } - -[features] -default = [ "std" ] -std = [ - "parachain/std", - "sp-std/std", -] diff --git a/parachain/test-parachains/code-upgrader/build.rs b/parachain/test-parachains/code-upgrader/build.rs deleted file mode 100644 index 2e407bbef3..0000000000 --- a/parachain/test-parachains/code-upgrader/build.rs +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. -// This file is part of Polkadot. - -// 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 . - -use wasm_builder_runner::WasmBuilder; - -fn main() { - WasmBuilder::new() - .with_current_project() - .with_wasm_builder_from_crates("2.0.0") - .export_heap_base() - .build() -} diff --git a/parachain/test-parachains/code-upgrader/src/lib.rs b/parachain/test-parachains/code-upgrader/src/lib.rs deleted file mode 100644 index c0219e0229..0000000000 --- a/parachain/test-parachains/code-upgrader/src/lib.rs +++ /dev/null @@ -1,163 +0,0 @@ -// Copyright 2020 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 . - -//! Test parachain WASM which implements code ugprades. - -#![no_std] - -#![cfg_attr(not(feature = "std"), feature(core_intrinsics, lang_items, core_panic_info, alloc_error_handler))] - -use codec::{Encode, Decode}; -use parachain::primitives::{RelayChainBlockNumber, ValidationCode}; - -#[cfg(not(feature = "std"))] -mod wasm_validation; - -#[cfg(not(feature = "std"))] -#[global_allocator] -static ALLOC: dlmalloc::GlobalDlmalloc = dlmalloc::GlobalDlmalloc; - -// Make the WASM binary available. -#[cfg(feature = "std")] -include!(concat!(env!("OUT_DIR"), "/wasm_binary.rs")); - -#[cfg(feature = "std")] -/// Wasm binary unwrapped. If built with `BUILD_DUMMY_WASM_BINARY`, the function panics. -pub fn wasm_binary_unwrap() -> &'static [u8] { - WASM_BINARY.expect("Development wasm binary is not available. Testing is only \ - supported with the flag disabled.") -} - -#[derive(Encode, Decode, Clone, Default)] -pub struct State { - /// The current code that is "active" in this chain. - pub code: ValidationCode, - /// Code upgrade that is pending. - pub pending_code: Option<(ValidationCode, RelayChainBlockNumber)>, -} - -/// 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: State, - /// Code to upgrade to. - pub new_validation_code: Option, -} - -pub fn hash_state(state: &State) -> [u8; 32] { - tiny_keccak::keccak256(state.encode().as_slice()) -} - -#[derive(Debug)] -pub enum Error { - /// Start state mismatched with parent header's state hash. - StateMismatch, - /// New validation code too large. - NewCodeTooLarge, - /// Code upgrades not allowed at this time. - CodeUpgradeDisallowed, -} - -pub struct ValidationResult { - /// The new head data. - pub head_data: HeadData, - /// The new validation code. - pub new_validation_code: Option, -} - -pub struct RelayChainParams { - /// Whether a code upgrade is allowed and at what relay-chain block number - /// to process it after. - pub code_upgrade_allowed: Option, - /// The maximum code size allowed for an upgrade. - pub max_code_size: u32, - /// The relay-chain block number. - pub relay_chain_block_number: RelayChainBlockNumber, -} - -/// 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, - relay_params: &RelayChainParams, -) -> Result { - debug_assert_eq!(parent_hash, parent_head.hash()); - - if hash_state(&block_data.state) != parent_head.post_state { - return Err(Error::StateMismatch); - } - - let mut new_state = block_data.state; - - if let Some((pending_code, after)) = new_state.pending_code.take() { - if after <= relay_params.relay_chain_block_number { - // code applied. - new_state.code = pending_code; - } else { - // reinstate. - new_state.pending_code = Some((pending_code, after)); - } - } - - let new_validation_code = if let Some(ref new_validation_code) = block_data.new_validation_code { - if new_validation_code.0.len() as u32 > relay_params.max_code_size { - return Err(Error::NewCodeTooLarge); - } - - // replace the code if allowed and we don't have an upgrade pending. - match (new_state.pending_code.is_some(), relay_params.code_upgrade_allowed) { - (_, None) => return Err(Error::CodeUpgradeDisallowed), - (false, Some(after)) => { - new_state.pending_code = Some((new_validation_code.clone(), after)); - Some(new_validation_code.clone()) - } - (true, Some(_)) => None, - } - } else { - None - }; - - let head_data = HeadData { - number: parent_head.number + 1, - parent_hash, - post_state: hash_state(&new_state), - }; - - Ok(ValidationResult { - head_data, - new_validation_code: new_validation_code, - }) -} diff --git a/parachain/test-parachains/code-upgrader/src/wasm_validation.rs b/parachain/test-parachains/code-upgrader/src/wasm_validation.rs deleted file mode 100644 index 3f4d0c44f8..0000000000 --- a/parachain/test-parachains/code-upgrader/src/wasm_validation.rs +++ /dev/null @@ -1,57 +0,0 @@ -// Copyright 2019-2020 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 . - -//! WASM validation for adder parachain. - -use crate::{HeadData, BlockData, RelayChainParams}; -use core::{intrinsics, panic}; -use parachain::primitives::{ValidationResult, HeadData as GenericHeadData}; -use codec::{Encode, Decode}; - -#[no_mangle] -pub extern fn validate_block(params: *const u8, len: usize) -> u64 { - let params = unsafe { parachain::load_params(params, len) }; - let parent_head = HeadData::decode(&mut ¶ms.parent_head.0[..]) - .expect("invalid parent head format."); - - let block_data = BlockData::decode(&mut ¶ms.block_data.0[..]) - .expect("invalid block data format."); - - let parent_hash = tiny_keccak::keccak256(¶ms.parent_head.0[..]); - - let res = crate::execute( - parent_hash, - parent_head, - block_data, - &RelayChainParams { - code_upgrade_allowed: params.code_upgrade_allowed, - max_code_size: params.max_code_size, - relay_chain_block_number: params.relay_chain_height, - }, - ); - - match res { - Ok(output) => parachain::write_result( - &ValidationResult { - head_data: GenericHeadData(output.head_data.encode()), - new_validation_code: output.new_validation_code, - upward_messages: sp_std::vec::Vec::new(), - processed_downward_messages: 0, - } - ), - Err(_) => panic!("execution failure"), - } -} diff --git a/parachain/test-parachains/code-upgrader/wasm/Cargo.toml b/parachain/test-parachains/code-upgrader/wasm/Cargo.toml deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/parachain/test-parachains/tests/adder/mod.rs b/parachain/test-parachains/tests/adder/mod.rs index ecbac12ac5..76924551ba 100644 --- a/parachain/test-parachains/tests/adder/mod.rs +++ b/parachain/test-parachains/tests/adder/mod.rs @@ -72,10 +72,8 @@ pub fn execute_good_on_parent() { ValidationParams { parent_head: GenericHeadData(parent_head.encode()), block_data: GenericBlockData(block_data.encode()), - max_code_size: 1024, - max_head_data_size: 1024, relay_chain_height: 1, - code_upgrade_allowed: None, + hrmp_mqc_heads: Vec::new(), }, parachain::wasm_executor::ExecutionMode::RemoteTest(&pool), sp_core::testing::TaskExecutor::new(), @@ -112,10 +110,8 @@ fn execute_good_chain_on_parent() { ValidationParams { parent_head: GenericHeadData(parent_head.encode()), block_data: GenericBlockData(block_data.encode()), - max_code_size: 1024, - max_head_data_size: 1024, relay_chain_height: number as RelayChainBlockNumber + 1, - code_upgrade_allowed: None, + hrmp_mqc_heads: Vec::new(), }, parachain::wasm_executor::ExecutionMode::RemoteTest(&pool), sp_core::testing::TaskExecutor::new(), @@ -153,10 +149,8 @@ fn execute_bad_on_parent() { ValidationParams { parent_head: GenericHeadData(parent_head.encode()), block_data: GenericBlockData(block_data.encode()), - max_code_size: 1024, - max_head_data_size: 1024, relay_chain_height: 1, - code_upgrade_allowed: None, + hrmp_mqc_heads: Vec::new(), }, parachain::wasm_executor::ExecutionMode::RemoteTest(&pool), sp_core::testing::TaskExecutor::new(), diff --git a/parachain/test-parachains/tests/code_upgrader/mod.rs b/parachain/test-parachains/tests/code_upgrader/mod.rs deleted file mode 100644 index b99a6e9dbf..0000000000 --- a/parachain/test-parachains/tests/code_upgrader/mod.rs +++ /dev/null @@ -1,217 +0,0 @@ -// Copyright 2017-2020 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 . - -//! Basic parachain that adds a number as part of its state. - -use parachain::primitives::{ - BlockData as GenericBlockData, - HeadData as GenericHeadData, - ValidationParams, ValidationCode, -}; -use codec::{Decode, Encode}; -use code_upgrader::{hash_state, HeadData, BlockData, State}; - -#[test] -pub fn execute_good_no_upgrade() { - let pool = parachain::wasm_executor::ValidationPool::new(); - - let parent_head = HeadData { - number: 0, - parent_hash: [0; 32], - post_state: hash_state(&State::default()), - }; - - let block_data = BlockData { - state: State::default(), - new_validation_code: None, - }; - - let ret = parachain::wasm_executor::validate_candidate( - code_upgrader::wasm_binary_unwrap(), - ValidationParams { - parent_head: GenericHeadData(parent_head.encode()), - block_data: GenericBlockData(block_data.encode()), - max_code_size: 1024, - max_head_data_size: 1024, - relay_chain_height: 1, - code_upgrade_allowed: None, - }, - parachain::wasm_executor::ExecutionMode::RemoteTest(&pool), - sp_core::testing::TaskExecutor::new(), - ).unwrap(); - - let new_head = HeadData::decode(&mut &ret.head_data.0[..]).unwrap(); - - assert!(ret.new_validation_code.is_none()); - assert_eq!(new_head.number, 1); - assert_eq!(new_head.parent_hash, parent_head.hash()); - assert_eq!(new_head.post_state, hash_state(&State::default())); -} - -#[test] -pub fn execute_good_with_upgrade() { - let pool = parachain::wasm_executor::ValidationPool::new(); - - let parent_head = HeadData { - number: 0, - parent_hash: [0; 32], - post_state: hash_state(&State::default()), - }; - - let block_data = BlockData { - state: State::default(), - new_validation_code: Some(ValidationCode(vec![1, 2, 3])), - }; - - let ret = parachain::wasm_executor::validate_candidate( - code_upgrader::wasm_binary_unwrap(), - ValidationParams { - parent_head: GenericHeadData(parent_head.encode()), - block_data: GenericBlockData(block_data.encode()), - max_code_size: 1024, - max_head_data_size: 1024, - relay_chain_height: 1, - code_upgrade_allowed: Some(20), - }, - parachain::wasm_executor::ExecutionMode::RemoteTest(&pool), - sp_core::testing::TaskExecutor::new(), - ).unwrap(); - - let new_head = HeadData::decode(&mut &ret.head_data.0[..]).unwrap(); - - assert_eq!(ret.new_validation_code.unwrap(), ValidationCode(vec![1, 2, 3])); - assert_eq!(new_head.number, 1); - assert_eq!(new_head.parent_hash, parent_head.hash()); - assert_eq!( - new_head.post_state, - hash_state(&State { - code: ValidationCode::default(), - pending_code: Some((ValidationCode(vec![1, 2, 3]), 20)), - }), - ); -} - -#[test] -#[should_panic] -pub fn code_upgrade_not_allowed() { - let pool = parachain::wasm_executor::ValidationPool::new(); - - let parent_head = HeadData { - number: 0, - parent_hash: [0; 32], - post_state: hash_state(&State::default()), - }; - - let block_data = BlockData { - state: State::default(), - new_validation_code: Some(ValidationCode(vec![1, 2, 3])), - }; - - parachain::wasm_executor::validate_candidate( - code_upgrader::wasm_binary_unwrap(), - ValidationParams { - parent_head: GenericHeadData(parent_head.encode()), - block_data: GenericBlockData(block_data.encode()), - max_code_size: 1024, - max_head_data_size: 1024, - relay_chain_height: 1, - code_upgrade_allowed: None, - }, - parachain::wasm_executor::ExecutionMode::RemoteTest(&pool), - sp_core::testing::TaskExecutor::new(), - ).unwrap(); -} - -#[test] -pub fn applies_code_upgrade_after_delay() { - let pool = parachain::wasm_executor::ValidationPool::new(); - - let (new_head, state) = { - let parent_head = HeadData { - number: 0, - parent_hash: [0; 32], - post_state: hash_state(&State::default()), - }; - - let block_data = BlockData { - state: State::default(), - new_validation_code: Some(ValidationCode(vec![1, 2, 3])), - }; - - let ret = parachain::wasm_executor::validate_candidate( - code_upgrader::wasm_binary_unwrap(), - ValidationParams { - parent_head: GenericHeadData(parent_head.encode()), - block_data: GenericBlockData(block_data.encode()), - max_code_size: 1024, - max_head_data_size: 1024, - relay_chain_height: 1, - code_upgrade_allowed: Some(2), - }, - parachain::wasm_executor::ExecutionMode::RemoteTest(&pool), - sp_core::testing::TaskExecutor::new(), - ).unwrap(); - - let new_head = HeadData::decode(&mut &ret.head_data.0[..]).unwrap(); - - let parent_hash = parent_head.hash(); - let state = State { - code: ValidationCode::default(), - pending_code: Some((ValidationCode(vec![1, 2, 3]), 2)), - }; - assert_eq!(ret.new_validation_code.unwrap(), ValidationCode(vec![1, 2, 3])); - assert_eq!(new_head.number, 1); - assert_eq!(new_head.parent_hash, parent_hash); - assert_eq!(new_head.post_state, hash_state(&state)); - - (new_head, state) - }; - - { - let parent_head = new_head; - let block_data = BlockData { - state, - new_validation_code: None, - }; - - let ret = parachain::wasm_executor::validate_candidate( - code_upgrader::wasm_binary_unwrap(), - ValidationParams { - parent_head: GenericHeadData(parent_head.encode()), - block_data: GenericBlockData(block_data.encode()), - max_code_size: 1024, - max_head_data_size: 1024, - relay_chain_height: 2, - code_upgrade_allowed: None, - }, - parachain::wasm_executor::ExecutionMode::RemoteTest(&pool), - sp_core::testing::TaskExecutor::new(), - ).unwrap(); - - let new_head = HeadData::decode(&mut &ret.head_data.0[..]).unwrap(); - - assert!(ret.new_validation_code.is_none()); - assert_eq!(new_head.number, 2); - assert_eq!(new_head.parent_hash, parent_head.hash()); - assert_eq!( - new_head.post_state, - hash_state(&State { - code: ValidationCode(vec![1, 2, 3]), - pending_code: None, - }), - ); - } -} diff --git a/parachain/test-parachains/tests/lib.rs b/parachain/test-parachains/tests/lib.rs index 692c04c10c..3ad021a16e 100644 --- a/parachain/test-parachains/tests/lib.rs +++ b/parachain/test-parachains/tests/lib.rs @@ -15,7 +15,6 @@ // along with Polkadot. If not, see . mod adder; -mod code_upgrader; mod wasm_executor; use parachain::wasm_executor::run_worker; diff --git a/parachain/test-parachains/tests/wasm_executor/mod.rs b/parachain/test-parachains/tests/wasm_executor/mod.rs index 769ad737ce..b4f2211baa 100644 --- a/parachain/test-parachains/tests/wasm_executor/mod.rs +++ b/parachain/test-parachains/tests/wasm_executor/mod.rs @@ -31,10 +31,8 @@ fn terminates_on_timeout() { ValidationParams { block_data: BlockData(Vec::new()), parent_head: Default::default(), - max_code_size: 1024, - max_head_data_size: 1024, relay_chain_height: 1, - code_upgrade_allowed: None, + hrmp_mqc_heads: Vec::new(), }, parachain::wasm_executor::ExecutionMode::RemoteTest(&pool), sp_core::testing::TaskExecutor::new(), @@ -61,10 +59,8 @@ fn parallel_execution() { ValidationParams { block_data: BlockData(Vec::new()), parent_head: Default::default(), - max_code_size: 1024, - max_head_data_size: 1024, relay_chain_height: 1, - code_upgrade_allowed: None, + hrmp_mqc_heads: Vec::new(), }, parachain::wasm_executor::ExecutionMode::RemoteTest(&pool2), sp_core::testing::TaskExecutor::new(), @@ -74,10 +70,8 @@ fn parallel_execution() { ValidationParams { block_data: BlockData(Vec::new()), parent_head: Default::default(), - max_code_size: 1024, - max_head_data_size: 1024, relay_chain_height: 1, - code_upgrade_allowed: None, + hrmp_mqc_heads: Vec::new(), }, parachain::wasm_executor::ExecutionMode::RemoteTest(&pool), sp_core::testing::TaskExecutor::new(), diff --git a/primitives/src/v1.rs b/primitives/src/v1.rs index 086eface31..c2a8ec43d5 100644 --- a/primitives/src/v1.rs +++ b/primitives/src/v1.rs @@ -60,7 +60,7 @@ pub const INCLUSION_INHERENT_IDENTIFIER: InherentIdentifier = *b"inclusn0"; pub fn collator_signature_payload>( relay_parent: &H, para_id: &Id, - validation_data_hash: &Hash, + persisted_validation_data_hash: &Hash, pov_hash: &Hash, ) -> [u8; 100] { // 32-byte hash length is protected in a test below. @@ -68,7 +68,7 @@ pub fn collator_signature_payload>( payload[0..32].copy_from_slice(relay_parent.as_ref()); u32::from(*para_id).using_encoded(|s| payload[32..32 + s.len()].copy_from_slice(s)); - payload[36..68].copy_from_slice(validation_data_hash.as_ref()); + payload[36..68].copy_from_slice(persisted_validation_data_hash.as_ref()); payload[68..100].copy_from_slice(pov_hash.as_ref()); payload @@ -77,7 +77,7 @@ pub fn collator_signature_payload>( fn check_collator_signature>( relay_parent: &H, para_id: &Id, - validation_data_hash: &Hash, + persisted_validation_data_hash: &Hash, pov_hash: &Hash, collator: &CollatorId, signature: &CollatorSignature, @@ -85,7 +85,7 @@ fn check_collator_signature>( let payload = collator_signature_payload( relay_parent, para_id, - validation_data_hash, + persisted_validation_data_hash, pov_hash, ); @@ -96,14 +96,6 @@ fn check_collator_signature>( } } -/// Compute the `validation_data_hash` from global & local validation data. -pub fn validation_data_hash( - global: &GlobalValidationData, - local: &LocalValidationData, -) -> Hash { - BlakeTwo256::hash_of(&(global, local)) -} - /// A unique descriptor of the candidate receipt. #[derive(PartialEq, Eq, Clone, Encode, Decode)] #[cfg_attr(feature = "std", derive(Debug, Default, Hash))] @@ -114,16 +106,15 @@ pub struct CandidateDescriptor { pub relay_parent: H, /// The collator's sr25519 public key. pub collator: CollatorId, - /// The blake2-256 hash of the validation data. This is extra data derived from + /// The blake2-256 hash of the persisted validation data. This is extra data derived from /// relay-chain state which may vary based on bitfields included before the candidate. /// Thus it cannot be derived entirely from the relay-parent. - pub validation_data_hash: Hash, + pub persisted_validation_data_hash: Hash, /// The blake2-256 hash of the pov. pub pov_hash: Hash, /// Signature on blake2-256 of components of this receipt: /// The parachain index, the relay parent, the validation data hash, and the pov_hash. pub signature: CollatorSignature, - } impl> CandidateDescriptor { @@ -132,7 +123,7 @@ impl> CandidateDescriptor { check_collator_signature( &self.relay_parent, &self.para_id, - &self.validation_data_hash, + &self.persisted_validation_data_hash, &self.pov_hash, &self.collator, &self.signature, @@ -168,10 +159,11 @@ impl CandidateReceipt { pub struct FullCandidateReceipt { /// The inner candidate receipt. pub inner: CandidateReceipt, - /// The global validation schedule. - pub global_validation: GlobalValidationData, - /// The local validation data. - pub local_validation: LocalValidationData, + /// The validation data derived from the relay-chain state at that + /// point. The hash of the persisted validation data should + /// match the `persisted_validation_data_hash` in the descriptor + /// of the receipt. + pub validation_data: ValidationData, } /// A candidate-receipt with commitments directly included. @@ -224,17 +216,78 @@ impl Ord for CommittedCandidateReceipt { } } -/// Extra data that is needed along with the other fields in a `CandidateReceipt` -/// to fully validate the candidate. These fields are parachain-specific. +/// The validation data provide information about how to validate both the inputs and +/// outputs of a candidate. +/// +/// There are two types of validation data: persisted and transient. +/// Their respective sections of the guide elaborate on their functionality in more detail. +/// +/// This information is derived from the chain state and will vary from para to para, +/// although some of the fields may be the same for every para. +/// +/// Persisted validation data are generally derived from some relay-chain state to form inputs +/// to the validation function, and as such need to be persisted by the availability system to +/// avoid dependence on availability of the relay-chain state. The backing phase of the +/// inclusion pipeline ensures that everything that is included in a valid fork of the +/// relay-chain already adheres to the transient constraints. +/// +/// The validation data also serve the purpose of giving collators a means of ensuring that +/// their produced candidate and the commitments submitted to the relay-chain alongside it +/// will pass the checks done by the relay-chain when backing, and give validators +/// the same understanding when determining whether to second or attest to a candidate. +/// +/// Since the commitments of the validation function are checked by the +/// relay-chain, secondary checkers can rely on the invariant that the relay-chain +/// only includes para-blocks for which these checks have already been done. As such, +/// there is no need for the validation data used to inform validators and collators about +/// the checks the relay-chain will perform to be persisted by the availability system. +/// Nevertheless, we expose it so the backing validators can validate the outputs of a +/// candidate before voting to submit it to the relay-chain and so collators can +/// collate candidates that satisfy the criteria implied these transient validation data. +#[derive(PartialEq, Eq, Clone, Encode, Decode)] +#[cfg_attr(feature = "std", derive(Debug, Default))] +pub struct ValidationData { + /// The persisted validation data. + pub persisted: PersistedValidationData, + /// The transient validation data. + pub transient: TransientValidationData, +} + +/// Validation data that needs to be persisted for secondary checkers. #[derive(PartialEq, Eq, Clone, Encode, Decode)] #[cfg_attr(feature = "std", derive(Debug, Default))] -pub struct LocalValidationData { +pub struct PersistedValidationData { /// The parent head-data. pub parent_head: HeadData, + /// The relay-chain block number this is in the context of. + pub block_number: N, + /// The list of MQC heads for the inbound channels paired with the sender para ids. This + /// vector is sorted ascending by the para id and doesn't contain multiple entries with the same + /// sender. + pub hrmp_mqc_heads: Vec<(Id, Hash)>, +} + +impl PersistedValidationData { + /// Compute the blake2-256 hash of the persisted validation data. + pub fn hash(&self) -> Hash { + BlakeTwo256::hash_of(self) + } +} + +/// Validation data for checking outputs of the validation-function. +/// As such, they also inform the collator about how to construct the candidate. +/// +/// These are transient because they are not necessary beyond the point where the +/// candidate is backed. +#[derive(PartialEq, Eq, Clone, Encode, Decode)] +#[cfg_attr(feature = "std", derive(Debug, Default))] +pub struct TransientValidationData { + /// The maximum code size permitted, in bytes. + pub max_code_size: u32, + /// The maximum head-data size permitted, in bytes. + pub max_head_data_size: u32, /// The balance of the parachain at the moment of validation. pub balance: Balance, - /// The blake2-256 hash of the validation code used to execute the candidate. - pub validation_code_hash: Hash, /// Whether the parachain is allowed to upgrade its validation code. /// /// This is `Some` if so, and contains the number of the minimum relay-chain @@ -249,21 +302,6 @@ pub struct LocalValidationData { pub code_upgrade_allowed: Option, } -/// Extra data that is needed along with the other fields in a `CandidateReceipt` -/// to fully validate the candidate. -/// -/// These are global parameters that apply to all candidates in a block. -#[derive(PartialEq, Eq, Clone, Encode, Decode)] -#[cfg_attr(feature = "std", derive(Debug, Default))] -pub struct GlobalValidationData { - /// The maximum code size permitted, in bytes. - pub max_code_size: u32, - /// The maximum head-data size permitted, in bytes. - pub max_head_data_size: u32, - /// The relay-chain block number this is in the context of. - pub block_number: N, -} - /// Commitments made in a `CandidateReceipt`. Many of these are outputs of validation. #[derive(PartialEq, Eq, Clone, Encode, Decode)] #[cfg_attr(feature = "std", derive(Debug, Default, Hash))] @@ -434,25 +472,14 @@ pub enum CoreOccupied { Parachain, } -/// Validation data omitted from most candidate descriptor structs, as it can be derived from the -/// relay-parent. -#[derive(Clone, Encode, Decode)] -#[cfg_attr(feature = "std", derive(PartialEq, Debug, Default))] -pub struct OmittedValidationData { - /// The global validation schedule. - pub global_validation: GlobalValidationData, - /// The local validation data. - pub local_validation: LocalValidationData, -} - /// This is the data we keep available for each candidate included in the relay chain. #[derive(Clone, Encode, Decode)] #[cfg_attr(feature = "std", derive(PartialEq, Debug))] pub struct AvailableData { /// The Proof-of-Validation of the candidate. pub pov: PoV, - /// The omitted validation data. - pub omitted_validation: OmittedValidationData, + /// The persisted validation data needed for secondary checks. + pub validation_data: PersistedValidationData, } /// A helper data-type for tracking validator-group rotations. @@ -622,17 +649,21 @@ sp_api::decl_runtime_apis! { /// cores can have paras assigned to them. fn availability_cores() -> Vec>; - /// Yields the GlobalValidationData. This applies to all para candidates with the - /// relay-parent equal to the block in which context this is invoked in. - fn global_validation_data() -> GlobalValidationData; + /// Yields the full validation data for the given ParaId along with an assumption that + /// should be used if the para currently occupieds a core. + /// + /// Returns `None` if either the para is not registered or the assumption is `Freed` + /// and the para already occupies a core. + fn full_validation_data(para_id: Id, assumption: OccupiedCoreAssumption) + -> Option>; - /// Yields the LocalValidationData for the given ParaId along with an assumption that + /// Yields the persisted validation data for the given ParaId along with an assumption that /// should be used if the para currently occupies a core. /// /// Returns `None` if either the para is not registered or the assumption is `Freed` /// and the para already occupies a core. - fn local_validation_data(para_id: Id, assumption: OccupiedCoreAssumption) - -> Option>; + fn persisted_validation_data(para_id: Id, assumption: OccupiedCoreAssumption) + -> Option>; /// Returns the session index expected at a child of the block. /// diff --git a/roadmap/implementers-guide/src/node/utility/candidate-validation.md b/roadmap/implementers-guide/src/node/utility/candidate-validation.md index cd4a040fbf..19108bd78e 100644 --- a/roadmap/implementers-guide/src/node/utility/candidate-validation.md +++ b/roadmap/implementers-guide/src/node/utility/candidate-validation.md @@ -24,7 +24,7 @@ Upon receiving a validation request, the first thing the candidate validation su ### Determining Parameters -For a [`CandidateValidationMessage`][CVM]`::ValidateFromExhaustive`, these parameters are exhaustively provided. The [`OmittedValidationData`](../../types/availability.md#omittedvalidationdata) can be deconstructed into the validation data. +For a [`CandidateValidationMessage`][CVM]`::ValidateFromExhaustive`, these parameters are exhaustively provided. The [`TransientValidationData`](../../types/candidate.md#transientvalidationdata) is optional, and is used to perform further checks on the outputs of validation. For a [`CandidateValidationMessage`][CVM]`::ValidateFromChainState`, some more work needs to be done. Due to the uncertainty of Availability Cores (implemented in the [`Scheduler`](../../runtime/scheduler.md) module of the runtime), a candidate at a particular relay-parent and for a particular para may have two different valid validation-data to be executed under depending on what is assumed to happen if the para is occupying a core at the onset of the new block. This is encoded as an `OccupiedCoreAssumption` in the runtime API. @@ -40,7 +40,7 @@ Once we have all parameters, we can spin up a background task to perform the val * The collator signature is valid * The PoV provided matches the `pov_hash` field of the descriptor -After that, we can invoke the validation function. Lastly, we do some final checks on the output: +After that, we can invoke the validation function. Lastly, if available, we do some final checks on the output using the `TransientValidationData`: * The produced head-data is no larger than the maximum allowed. * The produced code upgrade, if any, is no larger than the maximum allowed, and a code upgrade was allowed to be signaled. * The amount and size of produced upward messages is not too large. diff --git a/roadmap/implementers-guide/src/types/candidate.md b/roadmap/implementers-guide/src/types/candidate.md index 02ece10806..70191af973 100644 --- a/roadmap/implementers-guide/src/types/candidate.md +++ b/roadmap/implementers-guide/src/types/candidate.md @@ -77,7 +77,7 @@ struct CandidateDescriptor { /// The blake2-256 hash of the persisted validation data. These are extra parameters /// derived from relay-chain state that influence the validity of the block which /// must also be kept available for secondary checkers. - validation_data_hash: Hash, + persisted_validation_data_hash: Hash, /// The blake2-256 hash of the pov-block. pov_hash: Hash, /// Signature on blake2-256 of components of this receipt: @@ -119,23 +119,13 @@ Validation data that needs to be persisted for secondary checkers. See the secti struct PersistedValidationData { /// The parent head-data. parent_head: HeadData, - /// Whether the parachain is allowed to upgrade its validation code. - /// - /// This is `Some` if so, and contains the number of the minimum relay-chain - /// height at which the upgrade will be applied, if an upgrade is signaled - /// now. - /// - /// A parachain should enact its side of the upgrade at the end of the first - /// parablock executing in the context of a relay-chain block with at least this - /// height. This may be equal to the current perceived relay-chain block height, in - /// which case the code upgrade should be applied at the end of the signaling - /// block. - /// - /// This informs a relay-chain backing check and the parachain logic. - code_upgrade_allowed: Option, - /// The relay-chain block number this is in the context of. This informs the collator. block_number: BlockNumber, + /// The relay-chain + /// The list of MQC heads for the inbound channels paired with the sender para ids. This + /// vector is sorted ascending by the para id and doesn't contain multiple entries with the same + /// sender. + hrmp_mqc_heads: Vec<(ParaId, Hash)>, } ``` @@ -155,10 +145,20 @@ struct TransientValidationData { max_head_data_size: u32, /// The balance of the parachain at the moment of validation. balance: Balance, - /// The list of MQC heads for the inbound channels paired with the sender para ids. This - /// vector is sorted ascending by the para id and doesn't contain multiple entries with the same - /// sender. This informs the collator. - hrmp_mqc_heads: Vec<(ParaId, Hash)>, + /// Whether the parachain is allowed to upgrade its validation code. + /// + /// This is `Some` if so, and contains the number of the minimum relay-chain + /// height at which the upgrade will be applied, if an upgrade is signaled + /// now. + /// + /// A parachain should enact its side of the upgrade at the end of the first + /// parablock executing in the context of a relay-chain block with at least this + /// height. This may be equal to the current perceived relay-chain block height, in + /// which case the code upgrade should be applied at the end of the signaling + /// block. + /// + /// This informs a relay-chain backing check and the parachain logic. + code_upgrade_allowed: Option, } ``` @@ -219,8 +219,8 @@ This struct encapsulates the outputs of candidate validation. struct ValidationOutputs { /// The head-data produced by validation. head_data: HeadData, - /// The validation data, persisted and transient. - validation_data: ValidationData, + /// The validation data, persisted. + validation_data: PersistedValidationData, /// Messages directed to other paras routed via the relay chain. horizontal_messages: Vec, /// Upwards messages to the relay chain. diff --git a/roadmap/implementers-guide/src/types/overseer-protocol.md b/roadmap/implementers-guide/src/types/overseer-protocol.md index e054b82f07..0fdd871e27 100644 --- a/roadmap/implementers-guide/src/types/overseer-protocol.md +++ b/roadmap/implementers-guide/src/types/overseer-protocol.md @@ -393,11 +393,13 @@ enum CandidateValidationMessage { /// the para is not free at the relay-parent, an error is returned. ValidateFromChainState(CandidateDescriptor, PoV, ResponseChannel>), - /// Validate a candidate with provided parameters. Explicitly provide the `OmittedValidationData` + /// Validate a candidate with provided parameters. Explicitly provide the `PersistedValidationData` /// and `ValidationCode` so this can do full validation without needing to access the state of - /// the relay-chain. + /// the relay-chain. Optionally provide the `TransientValidationData` which will lead to checks + /// on the output. ValidateFromExhaustive( - OmittedValidationData, + PersistedValidationData, + Option, ValidationCode, CandidateDescriptor, PoV, diff --git a/runtime/parachains/src/configuration.rs b/runtime/parachains/src/configuration.rs index ae85e751bf..9b51404fc0 100644 --- a/runtime/parachains/src/configuration.rs +++ b/runtime/parachains/src/configuration.rs @@ -19,13 +19,12 @@ //! Configuration can change only at session boundaries and is buffered until then. use sp_std::prelude::*; -use primitives::v1::{ValidatorId, GlobalValidationData}; +use primitives::v1::ValidatorId; use frame_support::{ decl_storage, decl_module, decl_error, dispatch::DispatchResult, weights::{DispatchClass, Weight}, }; -use sp_runtime::traits::One; use codec::{Encode, Decode}; use frame_system::ensure_root; @@ -220,16 +219,6 @@ impl Module { ::PendingConfig::set(Some(prev)); } } - - /// Computes the global validation-data, assuming the context of the parent block. - pub(crate) fn global_validation_data() -> GlobalValidationData { - let config = Self::config(); - GlobalValidationData { - max_code_size: config.max_code_size, - max_head_data_size: config.max_head_data_size, - block_number: >::block_number() - One::one(), - } - } } #[cfg(test)] diff --git a/runtime/parachains/src/inclusion.rs b/runtime/parachains/src/inclusion.rs index 0050e85724..1e04c2a407 100644 --- a/runtime/parachains/src/inclusion.rs +++ b/runtime/parachains/src/inclusion.rs @@ -22,7 +22,6 @@ use sp_std::prelude::*; use primitives::v1::{ - validation_data_hash, ValidatorId, CandidateCommitments, CandidateDescriptor, ValidatorIndex, Id as ParaId, AvailabilityBitfield as AvailabilityBitfield, SignedAvailabilityBitfields, SigningContext, BackedCandidate, CoreIndex, GroupIndex, CommittedCandidateReceipt, @@ -435,9 +434,8 @@ impl Module { { // this should never fail because the para is registered - let (global_validation_data, local_validation_data) = ( - >::global_validation_data(), - match >::local_validation_data(para_id) { + let persisted_validation_data = + match crate::util::make_persisted_validation_data::(para_id) { Some(l) => l, None => { // We don't want to error out here because it will @@ -445,16 +443,12 @@ impl Module { // doing anything. return Ok(Vec::new()); } - } - ); + }; - let expected = validation_data_hash( - &global_validation_data, - &local_validation_data, - ); + let expected = persisted_validation_data.hash(); ensure!( - expected == candidate.descriptor().validation_data_hash, + expected == candidate.descriptor().persisted_validation_data_hash, Error::::ValidationDataHashMismatch, ); } @@ -722,7 +716,7 @@ mod tests { let payload = primitives::v1::collator_signature_payload( &candidate.descriptor.relay_parent, &candidate.descriptor.para_id, - &candidate.descriptor.validation_data_hash, + &candidate.descriptor.persisted_validation_data_hash, &candidate.descriptor.pov_hash, ); @@ -851,7 +845,7 @@ mod tests { head_data: HeadData, pov_hash: Hash, relay_parent: Hash, - validation_data_hash: Hash, + persisted_validation_data_hash: Hash, new_validation_code: Option, } @@ -862,7 +856,7 @@ mod tests { para_id: self.para_id, pov_hash: self.pov_hash, relay_parent: self.relay_parent, - validation_data_hash: self.validation_data_hash, + persisted_validation_data_hash: self.persisted_validation_data_hash, ..Default::default() }, commitments: CandidateCommitments { @@ -875,9 +869,9 @@ mod tests { } fn make_vdata_hash(para_id: ParaId) -> Option { - let global_validation_data = Configuration::global_validation_data(); - let local_validation_data = Paras::local_validation_data(para_id)?; - Some(validation_data_hash(&global_validation_data, &local_validation_data)) + let persisted_validation_data + = crate::util::make_persisted_validation_data::(para_id)?; + Some(persisted_validation_data.hash()) } #[test] @@ -1306,7 +1300,7 @@ mod tests { para_id: chain_a, relay_parent: System::parent_hash(), pov_hash: Hash::from([1; 32]), - validation_data_hash: make_vdata_hash(chain_a).unwrap(), + persisted_validation_data_hash: make_vdata_hash(chain_a).unwrap(), ..Default::default() }.build(); collator_sign_candidate( @@ -1338,14 +1332,14 @@ mod tests { para_id: chain_a, relay_parent: System::parent_hash(), pov_hash: Hash::from([1; 32]), - validation_data_hash: make_vdata_hash(chain_a).unwrap(), + persisted_validation_data_hash: make_vdata_hash(chain_a).unwrap(), ..Default::default() }.build(); let mut candidate_b = TestCandidateBuilder { para_id: chain_b, relay_parent: System::parent_hash(), pov_hash: Hash::from([2; 32]), - validation_data_hash: make_vdata_hash(chain_b).unwrap(), + persisted_validation_data_hash: make_vdata_hash(chain_b).unwrap(), ..Default::default() }.build(); @@ -1392,7 +1386,7 @@ mod tests { para_id: chain_a, relay_parent: System::parent_hash(), pov_hash: Hash::from([1; 32]), - validation_data_hash: make_vdata_hash(chain_a).unwrap(), + persisted_validation_data_hash: make_vdata_hash(chain_a).unwrap(), ..Default::default() }.build(); collator_sign_candidate( @@ -1427,7 +1421,7 @@ mod tests { para_id: chain_a, relay_parent: wrong_parent_hash, pov_hash: Hash::from([1; 32]), - validation_data_hash: make_vdata_hash(chain_a).unwrap(), + persisted_validation_data_hash: make_vdata_hash(chain_a).unwrap(), ..Default::default() }.build(); collator_sign_candidate( @@ -1459,7 +1453,7 @@ mod tests { para_id: thread_a, relay_parent: System::parent_hash(), pov_hash: Hash::from([1; 32]), - validation_data_hash: make_vdata_hash(thread_a).unwrap(), + persisted_validation_data_hash: make_vdata_hash(thread_a).unwrap(), ..Default::default() }.build(); @@ -1497,7 +1491,7 @@ mod tests { para_id: thread_a, relay_parent: System::parent_hash(), pov_hash: Hash::from([1; 32]), - validation_data_hash: make_vdata_hash(thread_a).unwrap(), + persisted_validation_data_hash: make_vdata_hash(thread_a).unwrap(), ..Default::default() }.build(); @@ -1534,7 +1528,7 @@ mod tests { para_id: chain_a, relay_parent: System::parent_hash(), pov_hash: Hash::from([1; 32]), - validation_data_hash: make_vdata_hash(chain_a).unwrap(), + persisted_validation_data_hash: make_vdata_hash(chain_a).unwrap(), ..Default::default() }.build(); @@ -1580,7 +1574,7 @@ mod tests { para_id: chain_a, relay_parent: System::parent_hash(), pov_hash: Hash::from([1; 32]), - validation_data_hash: make_vdata_hash(chain_a).unwrap(), + persisted_validation_data_hash: make_vdata_hash(chain_a).unwrap(), ..Default::default() }.build(); @@ -1619,7 +1613,7 @@ mod tests { relay_parent: System::parent_hash(), pov_hash: Hash::from([1; 32]), new_validation_code: Some(vec![5, 6, 7, 8].into()), - validation_data_hash: make_vdata_hash(chain_a).unwrap(), + persisted_validation_data_hash: make_vdata_hash(chain_a).unwrap(), ..Default::default() }.build(); @@ -1660,7 +1654,7 @@ mod tests { para_id: chain_a, relay_parent: System::parent_hash(), pov_hash: Hash::from([1; 32]), - validation_data_hash: [42u8; 32].into(), + persisted_validation_data_hash: [42u8; 32].into(), ..Default::default() }.build(); @@ -1750,7 +1744,7 @@ mod tests { para_id: chain_a, relay_parent: System::parent_hash(), pov_hash: Hash::from([1; 32]), - validation_data_hash: make_vdata_hash(chain_a).unwrap(), + persisted_validation_data_hash: make_vdata_hash(chain_a).unwrap(), ..Default::default() }.build(); collator_sign_candidate( @@ -1762,7 +1756,7 @@ mod tests { para_id: chain_b, relay_parent: System::parent_hash(), pov_hash: Hash::from([2; 32]), - validation_data_hash: make_vdata_hash(chain_b).unwrap(), + persisted_validation_data_hash: make_vdata_hash(chain_b).unwrap(), ..Default::default() }.build(); collator_sign_candidate( @@ -1774,7 +1768,7 @@ mod tests { para_id: thread_a, relay_parent: System::parent_hash(), pov_hash: Hash::from([3; 32]), - validation_data_hash: make_vdata_hash(thread_a).unwrap(), + persisted_validation_data_hash: make_vdata_hash(thread_a).unwrap(), ..Default::default() }.build(); collator_sign_candidate( @@ -1906,7 +1900,7 @@ mod tests { para_id: chain_a, relay_parent: System::parent_hash(), pov_hash: Hash::from([1; 32]), - validation_data_hash: make_vdata_hash(chain_a).unwrap(), + persisted_validation_data_hash: make_vdata_hash(chain_a).unwrap(), new_validation_code: Some(vec![1, 2, 3].into()), ..Default::default() }.build(); diff --git a/runtime/parachains/src/lib.rs b/runtime/parachains/src/lib.rs index b41968b480..b707c3e39e 100644 --- a/runtime/parachains/src/lib.rs +++ b/runtime/parachains/src/lib.rs @@ -38,6 +38,8 @@ pub mod validity; pub mod runtime_api_impl; +mod util; + #[cfg(test)] mod mock; diff --git a/runtime/parachains/src/paras.rs b/runtime/parachains/src/paras.rs index abc69d0bce..f2a64de6c3 100644 --- a/runtime/parachains/src/paras.rs +++ b/runtime/parachains/src/paras.rs @@ -26,10 +26,10 @@ use sp_std::prelude::*; #[cfg(feature = "std")] use sp_std::marker::PhantomData; -use sp_runtime::traits::{One, BlakeTwo256, Hash as HashT, Saturating}; use primitives::v1::{ - Id as ParaId, ValidationCode, HeadData, LocalValidationData, + Id as ParaId, ValidationCode, HeadData, }; +use sp_runtime::traits::One; use frame_support::{ decl_storage, decl_module, decl_error, traits::Get, @@ -550,37 +550,6 @@ impl Module { Self::past_code_meta(&id).most_recent_change() } - - /// Compute the local-validation data based on the head of the para. This assumes the - /// relay-parent is the parent of the current block. - pub(crate) fn local_validation_data(para_id: ParaId) -> Option> { - let relay_parent_number = >::block_number() - One::one(); - - let config = >::config(); - let freq = config.validation_upgrade_frequency; - let delay = config.validation_upgrade_delay; - - let last_code_upgrade = Self::last_code_upgrade(para_id, true); - let can_upgrade_code = last_code_upgrade.map_or( - true, - |l| { l <= relay_parent_number && relay_parent_number.saturating_sub(l) >= freq }, - ); - - let code_upgrade_allowed = if can_upgrade_code { - Some(relay_parent_number + delay) - } else { - None - }; - - Some(LocalValidationData { - parent_head: Self::para_head(¶_id)?, - balance: 0, - validation_code_hash: BlakeTwo256::hash_of( - &Self::current_code(¶_id)? - ), - code_upgrade_allowed, - }) - } } #[cfg(test)] diff --git a/runtime/parachains/src/runtime_api_impl/v1.rs b/runtime/parachains/src/runtime_api_impl/v1.rs index 0a19e798f1..716d3eed9c 100644 --- a/runtime/parachains/src/runtime_api_impl/v1.rs +++ b/runtime/parachains/src/runtime_api_impl/v1.rs @@ -19,10 +19,10 @@ use sp_std::prelude::*; use primitives::v1::{ - ValidatorId, ValidatorIndex, GroupRotationInfo, CoreState, GlobalValidationData, - Id as ParaId, OccupiedCoreAssumption, LocalValidationData, SessionIndex, ValidationCode, + ValidatorId, ValidatorIndex, GroupRotationInfo, CoreState, ValidationData, + Id as ParaId, OccupiedCoreAssumption, SessionIndex, ValidationCode, CommittedCandidateReceipt, ScheduledCore, OccupiedCore, CoreOccupied, CoreIndex, - GroupIndex, CandidateEvent, + GroupIndex, CandidateEvent, PersistedValidationData, }; use sp_runtime::traits::Zero; use frame_support::debug; @@ -161,36 +161,61 @@ pub fn availability_cores() -> Vec() - -> GlobalValidationData -{ - >::global_validation_data() -} - -/// Implementation for the `local_validation_data` function of the runtime API. -pub fn local_validation_data( +fn with_assumption( para_id: ParaId, assumption: OccupiedCoreAssumption, -) -> Option> { + build: F, +) -> Option where + Trait: inclusion::Trait, + F: FnOnce() -> Option, +{ match assumption { OccupiedCoreAssumption::Included => { - >::force_enact(para_id); - >::local_validation_data(para_id) + >::force_enact(para_id); + build() } OccupiedCoreAssumption::TimedOut => { - >::local_validation_data(para_id) + build() } OccupiedCoreAssumption::Free => { - if >::pending_availability(para_id).is_some() { + if >::pending_availability(para_id).is_some() { None } else { - >::local_validation_data(para_id) + build() } } } } +/// Implementation for the `full_validation_data` function of the runtime API. +pub fn full_validation_data( + para_id: ParaId, + assumption: OccupiedCoreAssumption, +) + -> Option> +{ + with_assumption::( + para_id, + assumption, + || Some(ValidationData { + persisted: crate::util::make_persisted_validation_data::(para_id)?, + transient: crate::util::make_transient_validation_data::(para_id)?, + }), + ) +} + +/// Implementation for the `persisted_validation_data` function of the runtime API. +pub fn persisted_validation_data( + para_id: ParaId, + assumption: OccupiedCoreAssumption, +) -> Option> { + with_assumption::( + para_id, + assumption, + || crate::util::make_persisted_validation_data::(para_id), + ) +} + /// Implementation for the `session_index_for_child` function of the runtime API. pub fn session_index_for_child() -> SessionIndex { // Just returns the session index from `inclusion`. Runtime APIs follow @@ -208,26 +233,11 @@ pub fn validation_code( para_id: ParaId, assumption: OccupiedCoreAssumption, ) -> Option { - let fetch = || { - >::current_code(¶_id) - }; - - match assumption { - OccupiedCoreAssumption::Included => { - >::force_enact(para_id); - fetch() - } - OccupiedCoreAssumption::TimedOut => { - fetch() - } - OccupiedCoreAssumption::Free => { - if >::pending_availability(para_id).is_some() { - None - } else { - fetch() - } - } - } + with_assumption::( + para_id, + assumption, + || >::current_code(¶_id), + ) } /// Implementation for the `candidate_pending_availability` function of the runtime API. diff --git a/runtime/parachains/src/util.rs b/runtime/parachains/src/util.rs new file mode 100644 index 0000000000..028d65c5d9 --- /dev/null +++ b/runtime/parachains/src/util.rs @@ -0,0 +1,71 @@ +// Copyright 2017-2020 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 . + +//! Utilities that don't belong to any particular module but may draw +//! on all modules. + +use sp_runtime::traits::{One, Saturating}; +use primitives::v1::{Id as ParaId, PersistedValidationData, TransientValidationData}; +use sp_std::prelude::*; + +use crate::{configuration, paras}; + +/// Make the persisted validation data for a particular parachain. +/// +/// This ties together the storage of several modules. +pub fn make_persisted_validation_data( + para_id: ParaId, +) -> Option> { + let relay_parent_number = >::block_number() - One::one(); + + Some(PersistedValidationData { + parent_head: >::para_head(¶_id)?, + block_number: relay_parent_number, + hrmp_mqc_heads: Vec::new(), + }) +} + +/// Make the transient validation data for a particular parachain. +/// +/// This ties together the storage of several modules. +pub fn make_transient_validation_data( + para_id: ParaId, +) -> Option> { + let config = >::config(); + let relay_parent_number = >::block_number() - One::one(); + + let freq = config.validation_upgrade_frequency; + let delay = config.validation_upgrade_delay; + + let last_code_upgrade = >::last_code_upgrade(para_id, true); + let can_upgrade_code = last_code_upgrade.map_or( + true, + |l| { l <= relay_parent_number && relay_parent_number.saturating_sub(l) >= freq }, + ); + + let code_upgrade_allowed = if can_upgrade_code { + Some(relay_parent_number + delay) + } else { + None + }; + + Some(TransientValidationData { + max_code_size: config.max_code_size, + max_head_data_size: config.max_head_data_size, + balance: 0, + code_upgrade_allowed, + }) +} diff --git a/runtime/rococo-v1/src/lib.rs b/runtime/rococo-v1/src/lib.rs index f1af47613e..fe812a1389 100644 --- a/runtime/rococo-v1/src/lib.rs +++ b/runtime/rococo-v1/src/lib.rs @@ -24,9 +24,9 @@ use sp_std::prelude::*; use codec::Encode; use primitives::v1::{ AccountId, AccountIndex, Balance, BlockNumber, Hash, Nonce, Signature, Moment, - GroupRotationInfo, CoreState, Id, GlobalValidationData, ValidationCode, CandidateEvent, + GroupRotationInfo, CoreState, Id, ValidationData, ValidationCode, CandidateEvent, ValidatorId, ValidatorIndex, CommittedCandidateReceipt, OccupiedCoreAssumption, - LocalValidationData, + PersistedValidationData, }; use runtime_common::{ SlowAdjustingFeeUpdate, @@ -176,13 +176,14 @@ sp_api::impl_runtime_apis! { runtime_api_impl::availability_cores::() } - fn global_validation_data() -> GlobalValidationData { - runtime_api_impl::global_validation_data::() + fn full_validation_data(para_id: Id, assumption: OccupiedCoreAssumption) + -> Option> { + runtime_api_impl::full_validation_data::(para_id, assumption) } - fn local_validation_data(para_id: Id, assumption: OccupiedCoreAssumption) - -> Option> { - runtime_api_impl::local_validation_data::(para_id, assumption) + fn persisted_validation_data(para_id: Id, assumption: OccupiedCoreAssumption) + -> Option> { + runtime_api_impl::persisted_validation_data::(para_id, assumption) } fn session_index_for_child() -> SessionIndex { diff --git a/validation/src/pipeline.rs b/validation/src/pipeline.rs index 1c826a7bb1..7fe18212f0 100644 --- a/validation/src/pipeline.rs +++ b/validation/src/pipeline.rs @@ -204,10 +204,8 @@ pub fn validate<'a>( let params = ValidationParams { parent_head: local_validation.parent_head.clone(), block_data: pov_block.block_data.clone(), - max_code_size: global_validation.max_code_size, - max_head_data_size: global_validation.max_head_data_size, relay_chain_height: global_validation.block_number, - code_upgrade_allowed: local_validation.code_upgrade_allowed, + hrmp_mqc_heads: Vec::new(), }; // TODO: remove when ext does not do this. -- GitLab From 7fcefb842efa1bebb55a2aea7f721c53a453b133 Mon Sep 17 00:00:00 2001 From: Jeff Burdges Date: Tue, 18 Aug 2020 15:14:55 +0200 Subject: [PATCH 189/192] Initial guide text for approvals and especially approvals assignments (#1518) * Initial guide modifications for approvals * Split approval assignments keys and approval votes keys This should avoid the political problems with validator operators wnting everything to be a remote signer. * Update roadmap/implementers-guide/src/runtime/validity.md Co-authored-by: Robert Habermeier * Update roadmap/implementers-guide/src/node/validity/assignments.md Co-authored-by: Robert Habermeier * Update roadmap/implementers-guide/src/node/validity/assignments.md Co-authored-by: Robert Habermeier * Update roadmap/implementers-guide/src/node/validity/assignments.md Co-authored-by: Robert Habermeier * Update roadmap/implementers-guide/src/node/validity/assignments.md Co-authored-by: Robert Habermeier * Update roadmap/implementers-guide/src/node/validity/assignments.md Co-authored-by: Robert Habermeier * Update roadmap/implementers-guide/src/node/validity/assignments.md Co-authored-by: Robert Habermeier * Update roadmap/implementers-guide/src/node/validity/assignments.md Co-authored-by: Robert Habermeier * Update roadmap/implementers-guide/src/node/validity/approvals.md Co-authored-by: hndnklnc * Update roadmap/implementers-guide/src/node/validity/approvals.md Co-authored-by: hndnklnc * Update roadmap/implementers-guide/src/runtime/validity.md Co-authored-by: Robert Habermeier * Not sure where these go.. * Update roadmap/implementers-guide/src/node/validity/approvals.md Co-authored-by: Robert Habermeier * Local clock leniency * Explain HSM blabla * double word * Clarify okasing things on-chain * Assignments integration with relative time * minor tweaks * Clarify structure and work savings * Use included more * Cleanup and paramaters See https://github.com/w3f/research-internal/issues/515 * More on GRANDPA * Explain relay equivocation relevance * Address postponement and on-chain verification somewhat * small bit more explination * just use ed25519 here: could -> should * spelling Co-authored-by: Robert Habermeier Co-authored-by: hndnklnc --- roadmap/implementers-guide/src/SUMMARY.md | 2 + .../src/node/validity/approvals.md | 50 ++++++ .../src/node/validity/assignments.md | 144 ++++++++++++++++++ .../src/runtime/validity.md | 37 ++++- 4 files changed, 229 insertions(+), 4 deletions(-) create mode 100644 roadmap/implementers-guide/src/node/validity/approvals.md create mode 100644 roadmap/implementers-guide/src/node/validity/assignments.md diff --git a/roadmap/implementers-guide/src/SUMMARY.md b/roadmap/implementers-guide/src/SUMMARY.md index 76a2224238..24e28bfd2b 100644 --- a/roadmap/implementers-guide/src/SUMMARY.md +++ b/roadmap/implementers-guide/src/SUMMARY.md @@ -41,6 +41,8 @@ - [Collation Generation](node/collators/collation-generation.md) - [Collator Protocol](node/collators/collator-protocol.md) - [Validity](node/validity/README.md) + - [Approvals](node/validity/approvals.md) + - [Approval assignments](node/validity/assignmets.md) - [Utility Subsystems](node/utility/README.md) - [Availability Store](node/utility/availability-store.md) - [Candidate Validation](node/utility/candidate-validation.md) diff --git a/roadmap/implementers-guide/src/node/validity/approvals.md b/roadmap/implementers-guide/src/node/validity/approvals.md new file mode 100644 index 0000000000..4ebfb80607 --- /dev/null +++ b/roadmap/implementers-guide/src/node/validity/approvals.md @@ -0,0 +1,50 @@ +# Approvals subsystem + +The approval subsystem determines whether a relay chain block can be considered for finality. It does so by running validity checks on the candidates included in, aka declared available in, that relay chain block. + +These approval validity checks differ from the backing validity checks performed before starting availability: + +- In backing, adversaries could select when they propose invalid candidates based upon when they control the parachain's backing validators who perform the checks. + +- In approvals, we randomly assign individual validators to check specific candidates without giving adversaries' foreknowledge about either which honest validators get assigned to which candidates, or even how many check. Availability prevents adversaries from choosing which validators obtain their possibly invalid candidate. + +As such, approval checks provide significantly more security than backing checks, so Polkadot achieves some fixed security level most efficiently when we perform more approval checks per backing check or per relay chain block. + +... + +Approval has roughly two parts: + +- **Assignments** determines which validators performs approval checks on which candidates. It ensures that each candidate receives enough random checkers, while reducing adversaries' odds for obtaining enough checkers, and limiting adversaries' foreknowledge. It tracks approval votes to identify when "no show" approval check takes suspiciously long, perhaps indicating the node being under attack, and assigns more checks in this case. It tracks relay chain equivocations to determine when adversaries possibly gained foreknowledge about assignments, and adds additional checks in this case. + +- **Approval checks** listens to the assignments subsystem for outgoing assignment notices that we shall check specific candidates. It then performs these checks by first invoking the reconstruction subsystem to obtain the candidate, second invoking the candidate validity utility subsystem upon the candidate, and finally sending out an approval vote, or perhaps initiating a dispute. + +These both run first as off-chain consensus protocols using messages gossiped among all validators, and second as an on-chain record of this off-chain protocols' progress after the fact. We need the on-chain protocol to provide rewards for the on-chain protocol, and doing an on-chain protocol simplify interaction with GRANDPA. + +Approval requires two gossiped message types, assignment notices created by its assignments subsystem, and approval votes sent by our approval checks subsystem when authorized by the candidate validity utility subsystem. + +... + +Any validators resyncing the chain after falling behind should track approvals using only the on-chain protocol. In particular, they should avoid sending their own assignment noticed and thus save themselves considerable validation work util they have a full synced chain. + +### Approval keys + +We need two separate keys for the approval subsystem: + +- **Approval assignment keys** are sr25519/schnorrkel keys used only for the assignment criteria VRFs. We implicitly sign assignment notices with approval assignment keys by including their relay chain context and additional data in the VRF's extra message, but exclude these from its VRF input. + +- **Approval vote keys** would only sign off on candidate parablock validity and has no natural key type restrictions. We could reuse the ed25519 grandpa keys for this purpose since these signatures control access to grandpa, although distant future node configurations might favor separate roles. + +Approval vote keys could relatively easily be handled by some hardened signer tooling, perhaps even HSMs assuming we select ed25519 for approval vote keys. Approval assignment keys might or might not support hardened signer tooling, but doing so sounds far more complex. In fact, assignment keys determine only VRF outputs that determine approval checker assignments, for which they can only act or not act, so they cannot equivocate, lie, etc. and represent little if any slashing risk for validator operators. + +In future, we shall determine which among the several hardening techniques best benefits the netwrok as a whole. We could provide a multi-process multi-machine architecture for validators, perhaps even reminiscent of GNUNet, or perhaps more resembling smart HSM tooling. We might instead design a system that more resembled full systems, like like Cosmos' sentry nodes. In either case, approval assignments might be handled by a slightly hardened machine, but not necessarily nearly as hardened as approval votes, but approval votes machines must similarly run foreign WASM code, which increases their risk, so assignments being separate sounds helpful. + +### Gossip + +Any validator could send their assignment notices and/or approval votes too early. We gossip the approval votes because they represent a major commitment by the validator. We delay gossiping the assignment notices unless their delay tranche exceeds our local clock excessively. + +### Future work + +We could consider additional gossip messages with which nodes claims "slow availability" and/or "slow candidate" to fine tune the assignments "no show" system, but long enough "no show" delays suffice probably. + +We shall develop more practical experience with UDP once the availability system works using direct UDP connections. In this, we should discover if reconstruction performs adequately with a complete graphs or +benefits from topology restrictions. At this point, an assignment notices could implicitly request pieces from a random 1/3rd, perhaps topology restricted, which saves one gossip round. If this preliminary fast reconstruction fails, then nodes' request alternative pieces directly. There is an interesting design space in how this overlaps with "slow availability" claims. diff --git a/roadmap/implementers-guide/src/node/validity/assignments.md b/roadmap/implementers-guide/src/node/validity/assignments.md new file mode 100644 index 0000000000..e2a17d6e7e --- /dev/null +++ b/roadmap/implementers-guide/src/node/validity/assignments.md @@ -0,0 +1,144 @@ +# Approval assignments + +Approval assignment determines on which candidate parachain blocks each validator performs approval checks. An approval session considers only one relay chain block and assigns only those candidates that relay chain block declares available. + +Assignment balances several concerns: + +- limits adversaries' foreknowledge about assignments, +- ensures enough checkers, and +- distributes assignments relatively equitably. + +Assignees determine their own assignments to check specific candidates using two or three assignment criteria. Assignees never reveal their assignments until relevant, and gossip delays assignments sent early, which limits others' foreknowledge. Assignees learn their assignment only with the relay chain block. + +All criteria require the validator evaluate a verifiable random function (VRF) using their VRF secret key. All criteria input specific data called "stories" about the session's relay chain block, and output candidates to check and a precedence called a `DelayTranche`. + +We liberate availability cores when their candidate becomes available of course, but one approval assignment criteria continues associating each candidate with the core number it occupied when it became available. + +Assignment operates in loosely timed rounds determined by this `DelayTranche`s, which proceed roughly 12 times faster than six second block production assuming half second gossip times. If a candidate `C` needs more approval checkers by the time we reach round `t` then any validators with an assignment to `C` in delay tranche `t` gossip their send assignment notice for `C`. We continue until all candidates have enough approval checkers assigned. We take entire tranches together if we do not yet have enough, so we expect strictly more than enough checkers. We also take later tranches if some checkers return their approval votes too slow (see no shows below). + +Assignment ensures validators check those relay chain blocks for which they have delay tranche zero aka the highest precedence, so that adversaries always face honest checkers equal to the expected number of assignments with delay tranche zero. + +Among these criteria, the BABE VRF output provides the story for two, which reduces how frequently adversaries could position their own checkers. We have one criterion whose story consists of the candidate's block hash plus external knowledge that a relay chain equivocation exists with a conflicting candidate. It provides unforeseeable assignments when adversaries gain foreknowledge about the other two by committing an equivocation in relay chain block production. + +## Announcements / Notices + +We gossip assignment notices among nodes so that all validators know which validators should check each candidate, and if any candidate requires more checkers. + +Assignment notices consist of a relay chain context given by a block hash, an assignment criteria, consisting of the criteria identifier and optionally a criteria specific field, an assignee identifier, and a VRF signature by the assignee, which itself consists of a VRF pre-output and a DLEQ proof. Its VRF input consists of the criteria, usually including a criteria specific field, and a "story" about its relay chain context block. + +We never include stories inside the gossip messages containing assignment notices, but require each validator reconstruct them. We never care about assignments in the disputes process, so this does not complicate remote disputes. + +In a Schnorr VRF, there is an extra signed message distinct from this input, which we set to the relay chain block hash. As a result, assignment notices are self signing and can be "politely" gossiped without additional signatures, meaning between nodes who can compute the story from the relay chain context. In other words, if we cannot compute the story required by an assignment notice's VRF part then our self signing property fails and we cannot verify its origin. We could fix this with either another signature layer (64 bytes) or by including the VRF input point computed from the story (32 bytes), but doing so appears unhelpful. + +Any validator could send their assignment notices and/or approval votes too early. We gossip the approval votes early because they represent a major commitment by the validator. We delay gossiping the assignment notices until they agree with our local clock however. We also impose a politeness condition that the recipient knows the relay chain context used by the assignment notice. + +## Stories + +We based assignment criteria upon two possible "stories" about the relay chain block `R` that included the candidate aka declared the candidate available. All stories have an output that attempts to minimize adversarial influence, which then acts as the VRF input for an assignment criteria. + +We first have a `RelayVRFStory` that outputs the randomness from another VRF output produced by the relay chain block producer when creating `R`. Among honest nodes, only this one relay chain block producer who creates `R` knew the story in advance, and even they knew nothing two epochs previously. + +In BABE, we create this value calling `schnorrkel::vrf::VRFInOut::make_bytes` with a context "A&V RC-VRF", with the `VRFInOut` coming from either the VRF that authorized block production for primary blocks, or else from the secondary block VRF for the secondary block type. + +In Sassafras, we shall always use the non-anonymized recycling VRF output, never the anonymized ring VRF that authorizes block production. We do not currently know if Sassafras shall have a separate schnorrkel key, but if it reuses its ring VRF key there is an equivalent `ring_vrf::VRFInOut::make_bytes`. + +We like that `RelayVRFStory` admits relatively few choices, but an adversary who equivocates in relay chain block production could learn assignments that depend upon the `RelayVRFStory` too early because the same relay chain VRF appears in multiple blocks. + +We therefore provide a secondary `RelayEquivocationStory` that outputs the candidate's block hash, but only for candidate equivocations. We say a candidate `C` in `R` is an equivocation when there exists another relay chain block `R1` that equivocates for `R` in the sense that `R` and `R1` have the same `RelayVRFStory`, but `R` contains `C` and `R1` does not contain `C`. + +We want checkers for candidate equivocations that lie outside our preferred relay chain as well, which represents a slightly different usage for the assignments module, and might require more information in the gossip messages. + +## Assignment criteria + +Assignment criteria compute actual assignments using stories and the validators' secret approval assignment key. Assignment criteria output a `Position` consisting of both a `ParaId` to be checked, as well as a precedence `DelayTranche` for when the assignment becomes valid. + +Assignment criteria come in three flavors, `RelayVRFModulo`, `RelayVRFDelay` and `RelayEquivocation`. Among these, both `RelayVRFModulo` and `RelayVRFDelay` run a VRF whose input is the output of a `RelayVRFStory`, while `RelayEquivocation` runs a VRF whose input is the output of a `RelayEquivocationStory`. + +Among these, we have two distinct VRF output computations: + +`RelayVRFModulo` runs several distinct samples whose VRF input is the `RelayVRFStory` and the sample number. It computes the VRF output with `schnorrkel::vrf::VRFInOut::make_bytes` using the context "core", reduces this number modulo the number of availability cores, and outputs the candidate just declared available by, and included by aka leaving, that availability core. We drop any samples that return no candidate because no candidate was leaving the sampled availability core in this relay chain block. We choose three samples initially, but we could make polkadot more secure and efficient by increasing this to four or five, and reducing the backing checks accordingly. All successful `RelayVRFModulo` samples are assigned delay tranche zero. + +There is no sampling process for `RelayVRFDelay` and `RelayEquivocation`. We instead run them on specific candidates and they compute a delay from their VRF output. `RelayVRFDelay` runs for all candidates included under, aka declared available by, a relay chain block, and inputs the associated VRF output via `RelayVRFStory`. `RelayEquivocation` runs only on candidate block equivocations, and inputs their block hashes via the `RelayEquivocation` story. + +`RelayVRFDelay` and `RelayEquivocation` both compute their output with `schnorrkel::vrf::VRFInOut::make_bytes` using the context "tranche" and reduce the result modulo `num_delay_tranches + zeroth_delay_tranche_width`, and consolidate results 0 through `zeroth_delay_tranche_width` to be 0. In this way, they ensure the zeroth delay tranche has `zeroth_delay_tranche_width+1` times as many assignments as any other tranche. + +As future work (or TODO?), we should merge assignment notices with the same delay and story using `vrf_merge`. We cannot merge those with the same delay and different stories because `RelayEquivocationStory`s could change but `RelayVRFStory` never changes. + +## Announcer and Watcher/Tracker + +We track all validators' announced approval assignments for each candidate associated to each relay chain block, which tells us which validators were assigned to which candidates. + +We permit at most one assignment per candidate per story per validator, so one validator could be assigned under both the `RelayVRFDelay` and `RelayEquivocation` criteria, but not under both `RelayVRFModulo` and `RelayVRFDelay` criteria, since those both use the same story. We permit only one approval vote per candidate per validator, which counts for any applicable criteria. + +We announce, and start checking for, our own assignments when their tranche's delay is reached, but only if the tracker says the assignee candidate requires more approval checkers. We never announce an assignment we believe unnecessary because early announcements gives an adversary information. All delay tranche zero assignments always get announced, which includes all `RelayVRFModulo` assignments. + +In other words, if some candidate `C` needs more approval checkers by the time we reach round `t` then any validators with an assignment to `C` in delay tranche `t` gossip their send assignment notice for `C`, and begin reconstruction and validation for 'C. If however `C` reached enough assignments, then validators with later assignments skip announcing their assignments. + +We continue until all candidates have enough approval checkers assigned. We never prioritize assignments within tranches and count all or no assignments for a given tranche together, so we often overshoot the target number of assigned approval checkers. + +### No shows + +We have a "no show" timeout longer than one relay chain slot, so at least 6 seconds, during which we expect approval checks should succeed in reconstructing the candidate block, in redoing its erasure coding to check the candidate receipt, and finally in rechecking the candidate block itself. + +We consider a validator a "no show" if they do not approve or dispute within this "no show" timeout from our receiving their assignment notice. We time this from our receipt of their assignment notice instead of our imagined real time for their tranche because otherwise receiving late assignment notices creates immediate "no shows" and unnecessary work. + +We worry "no shows" represent a validator under denial of service attack, presumably to prevent it from reconstructing the candidate, but perhaps delaying it form gossiping a dispute too. We therefore always replace "no shows" by adding one entire extra delay tranche worth of validators, so such attacks always result in additional checkers. + +As an example, imagine we need 20 checkers, but tranche zero produces only 14, and tranche one only 4, then we take all 5 from tranche two, and thus require 23 checkers for that candidate. If one checker Charlie from tranche one or two does not respond within say 8 seconds, then we add all 7 checkers from tranche three. If again one checker Cindy from tranche three does not respond within 8 seconds then we take all 3 checkers from tranche four. We now have 33 checkers working on the candidate, so this escalated quickly. + +We escalated so quickly because we worried that Charlie and Cindy might be the only honest checkers assigned to that candidate. If therefore either Charlie or Cindy finally return an approval, then we can conclude approval, and abandon the checkers from tranche four. + +We therefore require the "no show" timeout to be longer than a relay chain slot so that we can witness "no shows" on-chain. We discuss below how this helps reward validators who replace "no shows". + +We avoid slashing for "no shows" per se, although being "no show" could enter into some computation that punishes repeated poor performance, presumably replaces ImOnline, and we could reduce their rewards and further rewards those who filled in. + +As future work, we foresee expanding the "no show" scheme to anonymizes the additional checkers, like by using assignment noticed with a new criteria that employs a ring VRF and then all validators providing cover by requesting a couple erasure coded pieces, but such anonymity scheme sound extremely complex and lie far beyond our initial functionality. + +## Assignment postponement + +We expect validators could occasionally overloaded when they randomly acquire too many assignments. All these fluctuations amortize over multiple blocks fairly well, but this slows down finality. + +We therefore permit validators to delay sending their assignment noticed intentionally. If nobody knows about their assignment then they avoid creating "no shows" and the workload progresses normally. + +We strongly prefer if postponements come from tranches higher aka less important than zero because tranche zero checks provide somewhat more security. + +TODO: When? Is this optimal for the network? etc. + +## On-chain verification + +We should verify approval on-chain to reward approval checkers and to simplify integration with GRADPA. We therefore require the "no show" timeout to be longer than a relay chain slot so that we can witness "no shows" on-chain, which helps with both these goals. + +In principle, all validators have some "tranche" at which they're assigned to the parachain candidate, which ensures we reach enough validators eventually. As noted above, we often retract "no shows" when the slow validator eventually shows up, so witnessing their initially being a "no show" helps manage rewards. + +We expect on-chain verification should work in two phases: We first record assignments notices and approval votes on-chain in relay chain block, doing the VRF or regular signature verification again in block verification, and inserting chain authenticated unsigned notes into the relay chain state that contain the checker, tranche, paraid, and relay block height for each assignment notice. We then later have another relay chain block that runs some "approved" intrinsic, which extract all these notes from the state and feeds them into our approval code. + +We now encounter one niche concern in the interaction between postponement and on-chain verification: Any validator with a tranche zero (or other low) assignment could delay sending an assignment notice, like because they postponed their assigned tranche (which is allowed). If they later send this assignment notices right around finality time, then they race with this approved. intrinsic: If their announcement gets on-chain (also allowed), then yes it delays finality. If it does not get on-chain, then yes we've one announcement that the off-chain consensus system says is valid, but the chain ignores for being too slow. + +We need the chain to win in this case, but doing this requires imposing an annoyingly long overarching delay upon finality. We might explore limits on postponement too, but this sounds much harder. + +## Paramaters + +We prefer doing approval checkers assignments under `RelayVRFModulo` as opposed to `RelayVRFDelay` because `RelayVRFModulo` avoids giving individual checkers too many assignments and tranche zero assignments benefit security the most. We suggest assigning at least 16 checkers under `RelayVRFModulo` although assignment levels have never been properly analysed. + +Our delay criteria `RelayVRFDelay` and `RelayEquivocation` both have two primary paramaters, expected checkers per tranche and the zeroth delay tranche width. + +We require expected checkers per tranche to be less than three because otherwise an adversary with 1/3 stake could force all nodes into checking all blocks. We strongly recommend expected checkers per tranche to be less than two, which helps avoid both accedental and intentional explosions. We also suggest expected checkers per tranche be larger than one, which helps prevent adversaries from predicting than advancing one tranche adds only their own validators. + +We improve security more with tranche zero assignments, so `RelayEquivocation` should consolidates its first several tranches into tranche zero. We describe this as the zeroth delay tranche width, which initially we set to 12 for `RelayEquivocation` and `1` for `RelayVRFDelay`. + +## Why VRFs? + +We do assignments with VRFs to give "enough" checkers some meaning beyond merely "expected" checkers: + +We could specify a protocol that used only system randomness, which works because our strongest defense is the expected number of honest checkers who assign themselves. In this, adversaries could trivially flood their own blocks with their own checkers, so this strong defense becomes our only defense, and delay tranches become useless, so some blocks actually have zero approval checkers and possibly only one checker overall. + +VRFs though require adversaries wait far longer between such attacks, which also helps against adversaries with little at stake because they compromised validators. VRFs raise user confidence that no such "drive by" attacks occurred because the delay tranche system ensure at least some minimum number of approval checkers. In this vein, VRFs permit reducing backing checks and increasing approval checks, which makes polkadot more efficient. + +## Gossip + +Any validator could send their assignment notices and/or approval votes too early. We gossip the approval votes because they represent a major commitment by the validator. We retain but delay gossiping the assignment notices until they agree with our local clock. + +Assignment notices being gossiped too early might create a denial of service vector. If so, we might exploite the relative time scheme that synchronises our clocks, which conceivably permits just dropoing excessively early assignments. + + + diff --git a/roadmap/implementers-guide/src/runtime/validity.md b/roadmap/implementers-guide/src/runtime/validity.md index 11907cea77..ee391dd78b 100644 --- a/roadmap/implementers-guide/src/runtime/validity.md +++ b/roadmap/implementers-guide/src/runtime/validity.md @@ -17,8 +17,39 @@ We account for these requirements by having the validity module handle two kinds 1. Local disputes: those contesting the validity of the current fork by disputing a parablock included within it. 1. Remote disputes: a dispute that has partially or fully resolved on another fork which is transplanted to the local fork for completion and eventual slashing. +## Approval + +We begin approval checks upon any candidate immediately once it becomes available. + +Assigning approval checks involve VRF secret keys held by every validator, making it primarily an off-chain process. All assignment criteria require specific data called "stories" about the relay chain block in which the candidate assigned by that criteria became available. Among these criteria, the BABE VRF output provides the story for two, and the other's story consists of the candidate's block hash plus external knowledge that a relay chain equivocation exists with a conflicting candidate. + +We liberate availability cores when their candidate becomes available of course, but one approval assignment criteria continues associating each candidate with the core number it occupied when it became available. + +Assignment proceeds in loosely timed rounds called `DelayTranche`s roughly 12 times faster than block production, in which validators send assignment notices until all candidates have enough checkers assigned. Assignment tracks when approval votes arrive too and assigns more checkers if some checkers run late. + +Approval checks provide more security than backing checks, so polkadot becomes more efficient when validators perform more approval checks per backing check. If validators run 4 approval checks for every backing check, and run almost one backing check per relay chain block, then validators actually check almost 6 blocks per relay chain block. + +We should therefore reward approval checkers correctly because approval checks should actually represent our single largest workload. It follows that both assignment notices and approval votes should be tracked on-chain. + +We might track the assignments and approvals together as pairs in a simple rewards system. There are however two reasons to witness approvals on chain by tracking assignments and approvals on-chain, rewards and finality integration. + +First, an approval that arrives too slowly prompts assigning extra "no show" replacement checkers. Yet, we consider a block valid if the earlier checker completes their work, even if the extra checkers never quite finish, which complicates rewarding these extra checkers. We could support more nuanced rewards for extra checkers if assignments are placed on-chain earlier. Assignment delay tranches progress 12ish times faster than the relay chain, but no shows could still be witness by the relay chain because the no show delay takes longer than a relay chain slot. + +Second, we know off-chain when the approval process completes based upon all gossiped assignment notices, not just the approving ones. We need not-yet-approved assignment notices to appear on-chain if the chain should know about the validity of recently approved blocks. Relay chain blocks become eligible for finality in GRANDPA only once all their included candidates pass approvals checks, meaning all assigned checkers either voted approve or else were declared "no show" and replaced by more assigned checkers. A purely off-chain approvals scheme complicates GRANDPA with additional objections logic. + +Integration with GRANDPA appears simplest if we witness approvals in chain: Aside from inherents for assignment notices and approval votes, we provide an "Approved" inherent by which a relay chain block declares a past relay chain block approved. In other words, it trigger the on-chain approval counting logic in a relay chain block `R1` to rerun the assignment and approval tracker logic for some ancestor `R0`, which then declares `R0` approved. In this case, we could integrate with GRANDPA by gossiping messages that list the descendent `R1`, but then map this into the approved ancestor `R0` for GRANDPA itself. + +Approval votes could be recorded on-chain quickly because they represent a major commitments. + +Assignment notices should be recorded on-chain only when relevant. Any sent too early are retained but ignore until relevant by our off-chain assignment system. Assignments are ignored completely by the dispute system because any dispute immediately escalates into all validators checking, but disputes count existing approval votes of course. + + ## Local Disputes +There is little overlap between the approval system and the disputes systems since disputes cares only that two validators disagree. We do however require that disputes count validity votes from elsewhere, both the backing votes and the approval votes. + +We could approve, and even finalize, a relay chain block which then later disputes due to claims of some parachain being invalid. + > TODO: store all included candidate and attestations on them here. accept additional backing after the fact. accept reports based on VRF. candidate included in session S should only be reported on by validator keys from session S. trigger slashing. probably only slash for session S even if the report was submitted in session S+k because it is hard to unify identity One first question is to ask why different logic for local disputes is necessary. It seems that local disputes are necessary in order to create the first escalation that leads to block producers abandoning the chain and making remote disputes possible. @@ -29,11 +60,9 @@ For each such parablock, it is guaranteed by the inclusion pipeline that the par Disputes may occur against blocks that have happened in the session prior to the current one, from the perspective of the chain. In this case, the prior validator set is responsible for handling the dispute and to do so with their keys from the last session. This means that validator duty actually extends 1 session beyond leaving the validator set. -Validators self-select based on the BABE VRF output included by the block author in the block that the candidate became available. - -> TODO: some more details from Jeff's paper. +... -After enough validators have self-selected, the quorum will be clear and validators on the wrong side will be slashed. After concluding, the dispute will remain open for some time in order to collect further evidence of misbehaving validators, and then issue a signal in the header-chain that this fork should be abandoned along with the hash of the last ancestor before inclusion, which the chain should be reverted to, along with information about the invalid block that should be used to blacklist it from being included. +After concluding with enough validtors voting, the dispute will remain open for some time in order to collect further evidence of misbehaving validators, and then issue a signal in the header-chain that this fork should be abandoned along with the hash of the last ancestor before inclusion, which the chain should be reverted to, along with information about the invalid block that should be used to blacklist it from being included. ## Remote Disputes -- GitLab From c39fbd38b5286b72cddbf8d582f12c3ac3c180aa Mon Sep 17 00:00:00 2001 From: Ximin Luo Date: Tue, 18 Aug 2020 15:11:36 +0100 Subject: [PATCH 190/192] implementers-guide: in TOC move collators before backing, to match protocol pipeline (#1611) --- roadmap/implementers-guide/src/SUMMARY.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/roadmap/implementers-guide/src/SUMMARY.md b/roadmap/implementers-guide/src/SUMMARY.md index 24e28bfd2b..dce85af47d 100644 --- a/roadmap/implementers-guide/src/SUMMARY.md +++ b/roadmap/implementers-guide/src/SUMMARY.md @@ -28,6 +28,9 @@ - [Node Architecture](node/README.md) - [Subsystems and Jobs](node/subsystems-and-jobs.md) - [Overseer](node/overseer.md) + - [Collators](node/collators/README.md) + - [Collation Generation](node/collators/collation-generation.md) + - [Collator Protocol](node/collators/collator-protocol.md) - [Backing Subsystems](node/backing/README.md) - [Candidate Selection](node/backing/candidate-selection.md) - [Candidate Backing](node/backing/candidate-backing.md) @@ -37,9 +40,6 @@ - [Availability Distribution](node/availability/availability-distribution.md) - [Bitfield Distribution](node/availability/bitfield-distribution.md) - [Bitfield Signing](node/availability/bitfield-signing.md) - - [Collators](node/collators/README.md) - - [Collation Generation](node/collators/collation-generation.md) - - [Collator Protocol](node/collators/collator-protocol.md) - [Validity](node/validity/README.md) - [Approvals](node/validity/approvals.md) - [Approval assignments](node/validity/assignmets.md) -- GitLab From 48caed5e8af3c51d1607f054c63c69eef49a6606 Mon Sep 17 00:00:00 2001 From: Robert Habermeier Date: Wed, 19 Aug 2020 16:01:59 +0200 Subject: [PATCH 191/192] Candidate backing respects scheduled collator (#1613) * extract collator assignment from cores * check required collator * test and fix checks --- node/core/backing/src/lib.rs | 192 ++++++++++++++++++++++++++++++----- 1 file changed, 167 insertions(+), 25 deletions(-) diff --git a/node/core/backing/src/lib.rs b/node/core/backing/src/lib.rs index 6ca3b43d14..7e6e64ee47 100644 --- a/node/core/backing/src/lib.rs +++ b/node/core/backing/src/lib.rs @@ -32,7 +32,7 @@ use polkadot_primitives::v1::{ CommittedCandidateReceipt, BackedCandidate, Id as ParaId, ValidatorId, ValidatorIndex, SigningContext, PoV, CandidateDescriptor, AvailableData, ValidatorSignature, Hash, CandidateReceipt, - CandidateCommitments, CoreState, CoreIndex, + CandidateCommitments, CoreState, CoreIndex, CollatorId, }; use polkadot_node_primitives::{ FromTableMisbehavior, Statement, SignedFullStatement, MisbehaviorReport, @@ -91,8 +91,10 @@ struct CandidateBackingJob { rx_to: mpsc::Receiver, /// Outbound message channel sending part. tx_from: mpsc::Sender, - /// The `ParaId`s assigned to this validator. + /// The `ParaId` assigned to this validator assignment: ParaId, + /// The collator required to author the candidate, if any. + required_collator: Option, /// We issued `Valid` or `Invalid` statements on about these candidates. issued_statements: HashSet, /// `Some(h)` if this job has already issues `Seconded` statemt for some candidate with `h` hash. @@ -268,6 +270,14 @@ impl CandidateBackingJob { candidate: &CandidateReceipt, pov: PoV, ) -> Result { + // Check that candidate is collated by the right collator. + if self.required_collator.as_ref() + .map_or(false, |c| c != &candidate.descriptor().collator) + { + self.issue_candidate_invalid_message(candidate.clone()).await?; + return Ok(false); + } + let valid = self.request_candidate_validation( candidate.descriptor().clone(), Arc::new(pov.clone()), @@ -479,6 +489,19 @@ impl CandidateBackingJob { let expected_commitments = candidate.commitments.clone(); let descriptor = candidate.descriptor().clone(); + + // Check that candidate is collated by the right collator. + if self.required_collator.as_ref() + .map_or(false, |c| c != &descriptor.collator) + { + // If not, we've got the statement in the table but we will + // not issue validation work for it. + // + // Act as though we've issued a statement. + self.issued_statements.insert(candidate_hash); + return Ok(()); + } + let pov = self.request_pov_from_distribution(descriptor.clone()).await?; let v = self.request_candidate_validation(descriptor, pov.clone()).await?; @@ -721,34 +744,43 @@ impl util::JobTrait for CandidateBackingJob { let cores = try_runtime_api!(cores); let signing_context = SigningContext { parent_hash: parent, session_index }; - let validator = Validator::construct(&validators, signing_context, keystore.clone())?; + let validator = match Validator::construct( + &validators, + signing_context, + keystore.clone(), + ) { + Ok(v) => v, + Err(util::Error::NotAValidator) => { return Ok(()) }, + Err(e) => { + log::warn!( + target: "candidate_backing", + "Cannot participate in candidate backing: {:?}", + e + ); + + return Ok(()) + } + }; let mut groups = HashMap::new(); let n_cores = cores.len(); + + let mut assignment = None; for (idx, core) in cores.into_iter().enumerate() { // Ignore prospective assignments on occupied cores for the time being. if let CoreState::Scheduled(scheduled) = core { let core_index = CoreIndex(idx as _); let group_index = group_rotation_info.group_for_core(core_index, n_cores); if let Some(g) = validator_groups.get(group_index.0 as usize) { + if g.contains(&validator.index()) { + assignment = Some((scheduled.para_id, scheduled.collator)); + } groups.insert(scheduled.para_id, g.clone()); } } } - let mut assignment = Default::default(); - - if let Some(idx) = validators.iter().position(|k| *k == validator.id()) { - let idx = idx as u32; - for (para_id, group) in groups.iter() { - if group.contains(&idx) { - assignment = *para_id; - break; - } - } - } - let table_context = TableContext { groups, validators, @@ -756,11 +788,17 @@ impl util::JobTrait for CandidateBackingJob { validator: Some(validator), }; + let (assignment, required_collator) = match assignment { + None => return Ok(()), // no need to work. + Some((a, r)) => (a, r), + }; + let job = CandidateBackingJob { parent, rx_to, tx_from, assignment, + required_collator, issued_statements: HashSet::new(), seconded: None, reported_misbehavior_for: HashSet::new(), @@ -829,7 +867,7 @@ mod tests { use assert_matches::assert_matches; use futures::{executor, future, Future}; use polkadot_primitives::v1::{ - ScheduledCore, BlockData, CandidateCommitments, CollatorId, + ScheduledCore, BlockData, CandidateCommitments, PersistedValidationData, ValidationData, TransientValidationData, HeadData, ValidatorPair, ValidityAttestation, GroupRotationInfo, }; @@ -1041,15 +1079,15 @@ mod tests { } ); - // Check that subsystem job issues a request for the availability cores. - assert_matches!( - virtual_overseer.recv().await, - AllMessages::RuntimeApi( - RuntimeApiMessage::Request(parent, RuntimeApiRequest::AvailabilityCores(tx)) - ) if parent == test_state.relay_parent => { - tx.send(Ok(test_state.availability_cores.clone())).unwrap(); - } - ); + // Check that subsystem job issues a request for the availability cores. + assert_matches!( + virtual_overseer.recv().await, + AllMessages::RuntimeApi( + RuntimeApiMessage::Request(parent, RuntimeApiRequest::AvailabilityCores(tx)) + ) if parent == test_state.relay_parent => { + tx.send(Ok(test_state.availability_cores.clone())).unwrap(); + } + ); } // Test that a `CandidateBackingMessage::Second` issues validation work @@ -1747,4 +1785,108 @@ mod tests { assert_eq!(rx.await.unwrap().len(), 0); }); } + + // Test that a `CandidateBackingMessage::Second` issues validation work + // and in case validation is successful issues a `StatementDistributionMessage`. + #[test] + fn backing_doesnt_second_wrong_collator() { + let mut test_state = TestState::default(); + test_state.availability_cores[0] = CoreState::Scheduled(ScheduledCore { + para_id: ParaId::from(1), + collator: Some(Sr25519Keyring::Bob.public().into()), + }); + + test_harness(test_state.keystore.clone(), |test_harness| async move { + let TestHarness { mut virtual_overseer } = test_harness; + + test_startup(&mut virtual_overseer, &test_state).await; + + let pov = PoV { + block_data: BlockData(vec![42, 43, 44]), + }; + + let expected_head_data = test_state.head_data.get(&test_state.chain_ids[0]).unwrap(); + + let pov_hash = pov.hash(); + let candidate = TestCandidateBuilder { + para_id: test_state.chain_ids[0], + relay_parent: test_state.relay_parent, + pov_hash, + head_data: expected_head_data.clone(), + erasure_root: make_erasure_root(&test_state, pov.clone()), + ..Default::default() + }.build(); + + let second = CandidateBackingMessage::Second( + test_state.relay_parent, + candidate.to_plain(), + pov.clone(), + ); + + virtual_overseer.send(FromOverseer::Communication{ msg: second }).await; + + assert_matches!( + virtual_overseer.recv().await, + AllMessages::CandidateSelection( + CandidateSelectionMessage::Invalid(parent, c) + ) if parent == test_state.relay_parent && c == candidate.to_plain() => { + } + ); + + virtual_overseer.send(FromOverseer::Signal( + OverseerSignal::ActiveLeaves(ActiveLeavesUpdate::stop_work(test_state.relay_parent))) + ).await; + }); + } + + #[test] + fn validation_work_ignores_wrong_collator() { + let mut test_state = TestState::default(); + test_state.availability_cores[0] = CoreState::Scheduled(ScheduledCore { + para_id: ParaId::from(1), + collator: Some(Sr25519Keyring::Bob.public().into()), + }); + + test_harness(test_state.keystore.clone(), |test_harness| async move { + let TestHarness { mut virtual_overseer } = test_harness; + + test_startup(&mut virtual_overseer, &test_state).await; + + let pov = PoV { + block_data: BlockData(vec![1, 2, 3]), + }; + + let pov_hash = pov.hash(); + + let expected_head_data = test_state.head_data.get(&test_state.chain_ids[0]).unwrap(); + + let candidate_a = TestCandidateBuilder { + para_id: test_state.chain_ids[0], + relay_parent: test_state.relay_parent, + pov_hash, + head_data: expected_head_data.clone(), + erasure_root: make_erasure_root(&test_state, pov.clone()), + ..Default::default() + }.build(); + + let seconding = SignedFullStatement::sign( + Statement::Seconded(candidate_a.clone()), + &test_state.signing_context, + 2, + &test_state.validators[2].pair().into(), + ); + + let statement = CandidateBackingMessage::Statement( + test_state.relay_parent, + seconding.clone(), + ); + + virtual_overseer.send(FromOverseer::Communication{ msg: statement }).await; + + // The statement will be ignored because it has the wrong collator. + virtual_overseer.send(FromOverseer::Signal( + OverseerSignal::ActiveLeaves(ActiveLeavesUpdate::stop_work(test_state.relay_parent))) + ).await; + }); + } } -- GitLab From 013c4a8041e6f1739cc5b785a2874061919c5db9 Mon Sep 17 00:00:00 2001 From: Shawn Tabrizi Date: Wed, 19 Aug 2020 22:05:33 +0200 Subject: [PATCH 192/192] Companion for Substrate #6815 (Dynamic Whitelist) (#1612) * Enable Dynamic Whitelisting * "Update Substrate" Co-authored-by: parity-processbot <> --- Cargo.lock | 281 +++++++++++++++-------------- parachain/src/wasm_executor/mod.rs | 8 +- runtime/kusama/src/lib.rs | 19 +- runtime/polkadot/src/lib.rs | 19 +- runtime/westend/src/lib.rs | 19 +- 5 files changed, 172 insertions(+), 174 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 287b58f8af..1a1270790d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1401,7 +1401,7 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "fork-tree" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" dependencies = [ "parity-scale-codec", ] @@ -1409,7 +1409,7 @@ dependencies = [ [[package]] name = "frame-benchmarking" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" dependencies = [ "frame-support", "frame-system", @@ -1421,12 +1421,13 @@ dependencies = [ "sp-runtime", "sp-runtime-interface", "sp-std", + "sp-storage", ] [[package]] name = "frame-benchmarking-cli" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" dependencies = [ "frame-benchmarking", "parity-scale-codec", @@ -1444,7 +1445,7 @@ dependencies = [ [[package]] name = "frame-executive" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" dependencies = [ "frame-support", "frame-system", @@ -1459,7 +1460,7 @@ dependencies = [ [[package]] name = "frame-metadata" version = "11.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" dependencies = [ "parity-scale-codec", "serde", @@ -1470,7 +1471,7 @@ dependencies = [ [[package]] name = "frame-support" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" dependencies = [ "bitmask", "frame-metadata", @@ -1495,7 +1496,7 @@ dependencies = [ [[package]] name = "frame-support-procedural" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" dependencies = [ "frame-support-procedural-tools", "proc-macro2 1.0.18", @@ -1506,7 +1507,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" dependencies = [ "frame-support-procedural-tools-derive", "proc-macro-crate", @@ -1518,7 +1519,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools-derive" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" dependencies = [ "proc-macro2 1.0.18", "quote 1.0.7", @@ -1528,7 +1529,7 @@ dependencies = [ [[package]] name = "frame-system" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" dependencies = [ "frame-support", "impl-trait-for-tuples", @@ -1544,7 +1545,7 @@ dependencies = [ [[package]] name = "frame-system-benchmarking" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" dependencies = [ "frame-benchmarking", "frame-support", @@ -1558,7 +1559,7 @@ dependencies = [ [[package]] name = "frame-system-rpc-runtime-api" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" dependencies = [ "parity-scale-codec", "sp-api", @@ -3558,7 +3559,7 @@ dependencies = [ [[package]] name = "pallet-authority-discovery" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" dependencies = [ "frame-support", "frame-system", @@ -3574,7 +3575,7 @@ dependencies = [ [[package]] name = "pallet-authorship" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" dependencies = [ "frame-support", "frame-system", @@ -3589,7 +3590,7 @@ dependencies = [ [[package]] name = "pallet-babe" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" dependencies = [ "frame-benchmarking", "frame-support", @@ -3614,7 +3615,7 @@ dependencies = [ [[package]] name = "pallet-balances" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" dependencies = [ "frame-benchmarking", "frame-support", @@ -3628,7 +3629,7 @@ dependencies = [ [[package]] name = "pallet-collective" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" dependencies = [ "frame-benchmarking", "frame-support", @@ -3644,7 +3645,7 @@ dependencies = [ [[package]] name = "pallet-democracy" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" dependencies = [ "frame-benchmarking", "frame-support", @@ -3659,7 +3660,7 @@ dependencies = [ [[package]] name = "pallet-elections-phragmen" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" dependencies = [ "frame-benchmarking", "frame-support", @@ -3674,7 +3675,7 @@ dependencies = [ [[package]] name = "pallet-finality-tracker" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" dependencies = [ "frame-support", "frame-system", @@ -3690,7 +3691,7 @@ dependencies = [ [[package]] name = "pallet-grandpa" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" dependencies = [ "frame-benchmarking", "frame-support", @@ -3712,7 +3713,7 @@ dependencies = [ [[package]] name = "pallet-identity" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" dependencies = [ "enumflags2", "frame-benchmarking", @@ -3728,7 +3729,7 @@ dependencies = [ [[package]] name = "pallet-im-online" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" dependencies = [ "frame-benchmarking", "frame-support", @@ -3748,7 +3749,7 @@ dependencies = [ [[package]] name = "pallet-indices" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" dependencies = [ "frame-support", "frame-system", @@ -3764,7 +3765,7 @@ dependencies = [ [[package]] name = "pallet-membership" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" dependencies = [ "frame-support", "frame-system", @@ -3778,7 +3779,7 @@ dependencies = [ [[package]] name = "pallet-multisig" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" dependencies = [ "frame-support", "frame-system", @@ -3793,7 +3794,7 @@ dependencies = [ [[package]] name = "pallet-nicks" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" dependencies = [ "frame-support", "frame-system", @@ -3807,7 +3808,7 @@ dependencies = [ [[package]] name = "pallet-offences" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" dependencies = [ "frame-support", "frame-system", @@ -3822,7 +3823,7 @@ dependencies = [ [[package]] name = "pallet-offences-benchmarking" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" dependencies = [ "frame-benchmarking", "frame-support", @@ -3843,7 +3844,7 @@ dependencies = [ [[package]] name = "pallet-proxy" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" dependencies = [ "frame-support", "frame-system", @@ -3858,7 +3859,7 @@ dependencies = [ [[package]] name = "pallet-randomness-collective-flip" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" dependencies = [ "frame-support", "frame-system", @@ -3871,7 +3872,7 @@ dependencies = [ [[package]] name = "pallet-recovery" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" dependencies = [ "enumflags2", "frame-support", @@ -3886,7 +3887,7 @@ dependencies = [ [[package]] name = "pallet-scheduler" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" dependencies = [ "frame-benchmarking", "frame-support", @@ -3901,7 +3902,7 @@ dependencies = [ [[package]] name = "pallet-session" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" dependencies = [ "frame-support", "frame-system", @@ -3921,7 +3922,7 @@ dependencies = [ [[package]] name = "pallet-session-benchmarking" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" dependencies = [ "frame-benchmarking", "frame-support", @@ -3937,7 +3938,7 @@ dependencies = [ [[package]] name = "pallet-society" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" dependencies = [ "frame-support", "frame-system", @@ -3951,7 +3952,7 @@ dependencies = [ [[package]] name = "pallet-staking" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" dependencies = [ "frame-benchmarking", "frame-support", @@ -3973,7 +3974,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-curve" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -3984,7 +3985,7 @@ dependencies = [ [[package]] name = "pallet-sudo" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" dependencies = [ "frame-support", "frame-system", @@ -3998,7 +3999,7 @@ dependencies = [ [[package]] name = "pallet-timestamp" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" dependencies = [ "frame-benchmarking", "frame-support", @@ -4016,7 +4017,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" dependencies = [ "frame-support", "frame-system", @@ -4033,7 +4034,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" dependencies = [ "jsonrpc-core", "jsonrpc-core-client", @@ -4051,7 +4052,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc-runtime-api" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" dependencies = [ "frame-support", "parity-scale-codec", @@ -4064,7 +4065,7 @@ dependencies = [ [[package]] name = "pallet-treasury" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" dependencies = [ "frame-benchmarking", "frame-support", @@ -4079,7 +4080,7 @@ dependencies = [ [[package]] name = "pallet-utility" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" dependencies = [ "frame-benchmarking", "frame-support", @@ -4095,7 +4096,7 @@ dependencies = [ [[package]] name = "pallet-vesting" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" dependencies = [ "enumflags2", "frame-benchmarking", @@ -6320,7 +6321,7 @@ dependencies = [ [[package]] name = "sc-authority-discovery" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" dependencies = [ "bytes 0.5.5", "derive_more 0.99.9", @@ -6347,7 +6348,7 @@ dependencies = [ [[package]] name = "sc-basic-authorship" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6371,7 +6372,7 @@ dependencies = [ [[package]] name = "sc-block-builder" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" dependencies = [ "parity-scale-codec", "sc-client-api", @@ -6388,7 +6389,7 @@ dependencies = [ [[package]] name = "sc-chain-spec" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" dependencies = [ "impl-trait-for-tuples", "sc-chain-spec-derive", @@ -6404,7 +6405,7 @@ dependencies = [ [[package]] name = "sc-chain-spec-derive" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -6415,7 +6416,7 @@ dependencies = [ [[package]] name = "sc-cli" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" dependencies = [ "ansi_term 0.12.1", "atty", @@ -6456,7 +6457,7 @@ dependencies = [ [[package]] name = "sc-client-api" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" dependencies = [ "derive_more 0.99.9", "fnv", @@ -6492,7 +6493,7 @@ dependencies = [ [[package]] name = "sc-client-db" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" dependencies = [ "blake2-rfc", "hash-db", @@ -6522,7 +6523,7 @@ dependencies = [ [[package]] name = "sc-consensus" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" dependencies = [ "sc-client-api", "sp-blockchain", @@ -6533,7 +6534,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" dependencies = [ "derive_more 0.99.9", "fork-tree", @@ -6577,7 +6578,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe-rpc" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -6601,7 +6602,7 @@ dependencies = [ [[package]] name = "sc-consensus-epochs" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" dependencies = [ "fork-tree", "parity-scale-codec", @@ -6614,7 +6615,7 @@ dependencies = [ [[package]] name = "sc-consensus-slots" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6637,7 +6638,7 @@ dependencies = [ [[package]] name = "sc-consensus-uncles" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" dependencies = [ "log 0.4.11", "sc-client-api", @@ -6651,7 +6652,7 @@ dependencies = [ [[package]] name = "sc-executor" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" dependencies = [ "derive_more 0.99.9", "lazy_static", @@ -6679,7 +6680,7 @@ dependencies = [ [[package]] name = "sc-executor-common" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" dependencies = [ "derive_more 0.99.9", "log 0.4.11", @@ -6696,7 +6697,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmi" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" dependencies = [ "log 0.4.11", "parity-scale-codec", @@ -6711,7 +6712,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmtime" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" dependencies = [ "log 0.4.11", "parity-scale-codec", @@ -6729,7 +6730,7 @@ dependencies = [ [[package]] name = "sc-finality-grandpa" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" dependencies = [ "derive_more 0.99.9", "finality-grandpa", @@ -6766,7 +6767,7 @@ dependencies = [ [[package]] name = "sc-finality-grandpa-rpc" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" dependencies = [ "derive_more 0.99.9", "finality-grandpa", @@ -6787,7 +6788,7 @@ dependencies = [ [[package]] name = "sc-informant" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" dependencies = [ "ansi_term 0.12.1", "futures 0.3.5", @@ -6805,7 +6806,7 @@ dependencies = [ [[package]] name = "sc-keystore" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" dependencies = [ "derive_more 0.99.9", "hex", @@ -6821,7 +6822,7 @@ dependencies = [ [[package]] name = "sc-light" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" dependencies = [ "hash-db", "lazy_static", @@ -6840,7 +6841,7 @@ dependencies = [ [[package]] name = "sc-network" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" dependencies = [ "async-std", "bitflags", @@ -6893,7 +6894,7 @@ dependencies = [ [[package]] name = "sc-network-gossip" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -6908,7 +6909,7 @@ dependencies = [ [[package]] name = "sc-network-test" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" dependencies = [ "env_logger", "futures 0.3.5", @@ -6935,7 +6936,7 @@ dependencies = [ [[package]] name = "sc-offchain" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" dependencies = [ "bytes 0.5.5", "fnv", @@ -6962,7 +6963,7 @@ dependencies = [ [[package]] name = "sc-peerset" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" dependencies = [ "futures 0.3.5", "libp2p", @@ -6975,7 +6976,7 @@ dependencies = [ [[package]] name = "sc-proposer-metrics" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" dependencies = [ "log 0.4.11", "substrate-prometheus-endpoint", @@ -6984,7 +6985,7 @@ dependencies = [ [[package]] name = "sc-rpc" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" dependencies = [ "futures 0.3.5", "hash-db", @@ -7016,7 +7017,7 @@ dependencies = [ [[package]] name = "sc-rpc-api" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -7040,7 +7041,7 @@ dependencies = [ [[package]] name = "sc-rpc-server" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" dependencies = [ "jsonrpc-core", "jsonrpc-http-server", @@ -7056,7 +7057,7 @@ dependencies = [ [[package]] name = "sc-service" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" dependencies = [ "derive_more 0.99.9", "directories", @@ -7117,7 +7118,7 @@ dependencies = [ [[package]] name = "sc-state-db" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" dependencies = [ "log 0.4.11", "parity-scale-codec", @@ -7131,7 +7132,7 @@ dependencies = [ [[package]] name = "sc-telemetry" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" dependencies = [ "futures 0.3.5", "futures-timer 3.0.2", @@ -7152,7 +7153,7 @@ dependencies = [ [[package]] name = "sc-tracing" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" dependencies = [ "erased-serde", "log 0.4.11", @@ -7170,7 +7171,7 @@ dependencies = [ [[package]] name = "sc-transaction-graph" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -7191,7 +7192,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -7658,7 +7659,7 @@ dependencies = [ [[package]] name = "sp-allocator" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" dependencies = [ "derive_more 0.99.9", "log 0.4.11", @@ -7670,7 +7671,7 @@ dependencies = [ [[package]] name = "sp-api" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" dependencies = [ "hash-db", "parity-scale-codec", @@ -7685,7 +7686,7 @@ dependencies = [ [[package]] name = "sp-api-proc-macro" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" dependencies = [ "blake2-rfc", "proc-macro-crate", @@ -7697,7 +7698,7 @@ dependencies = [ [[package]] name = "sp-application-crypto" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" dependencies = [ "parity-scale-codec", "serde", @@ -7709,7 +7710,7 @@ dependencies = [ [[package]] name = "sp-arithmetic" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" dependencies = [ "integer-sqrt", "num-traits 0.2.12", @@ -7722,7 +7723,7 @@ dependencies = [ [[package]] name = "sp-authority-discovery" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" dependencies = [ "parity-scale-codec", "sp-api", @@ -7734,7 +7735,7 @@ dependencies = [ [[package]] name = "sp-authorship" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" dependencies = [ "parity-scale-codec", "sp-inherents", @@ -7745,7 +7746,7 @@ dependencies = [ [[package]] name = "sp-block-builder" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" dependencies = [ "parity-scale-codec", "sp-api", @@ -7757,7 +7758,7 @@ dependencies = [ [[package]] name = "sp-blockchain" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" dependencies = [ "derive_more 0.99.9", "log 0.4.11", @@ -7774,7 +7775,7 @@ dependencies = [ [[package]] name = "sp-chain-spec" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" dependencies = [ "serde", "serde_json", @@ -7783,7 +7784,7 @@ dependencies = [ [[package]] name = "sp-consensus" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -7809,7 +7810,7 @@ dependencies = [ [[package]] name = "sp-consensus-aura" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" dependencies = [ "parity-scale-codec", "sp-api", @@ -7823,7 +7824,7 @@ dependencies = [ [[package]] name = "sp-consensus-babe" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" dependencies = [ "merlin", "parity-scale-codec", @@ -7842,7 +7843,7 @@ dependencies = [ [[package]] name = "sp-consensus-slots" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" dependencies = [ "parity-scale-codec", "sp-runtime", @@ -7851,7 +7852,7 @@ dependencies = [ [[package]] name = "sp-consensus-vrf" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" dependencies = [ "parity-scale-codec", "schnorrkel", @@ -7863,7 +7864,7 @@ dependencies = [ [[package]] name = "sp-core" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" dependencies = [ "base58", "blake2-rfc", @@ -7907,7 +7908,7 @@ dependencies = [ [[package]] name = "sp-database" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" dependencies = [ "kvdb", "parking_lot 0.10.2", @@ -7916,7 +7917,7 @@ dependencies = [ [[package]] name = "sp-debug-derive" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" dependencies = [ "proc-macro2 1.0.18", "quote 1.0.7", @@ -7926,7 +7927,7 @@ dependencies = [ [[package]] name = "sp-externalities" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" dependencies = [ "environmental", "parity-scale-codec", @@ -7937,7 +7938,7 @@ dependencies = [ [[package]] name = "sp-finality-grandpa" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" dependencies = [ "finality-grandpa", "log 0.4.11", @@ -7953,7 +7954,7 @@ dependencies = [ [[package]] name = "sp-finality-tracker" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" dependencies = [ "parity-scale-codec", "sp-inherents", @@ -7963,7 +7964,7 @@ dependencies = [ [[package]] name = "sp-inherents" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" dependencies = [ "derive_more 0.99.9", "parity-scale-codec", @@ -7975,7 +7976,7 @@ dependencies = [ [[package]] name = "sp-io" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" dependencies = [ "futures 0.3.5", "hash-db", @@ -7996,7 +7997,7 @@ dependencies = [ [[package]] name = "sp-keyring" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" dependencies = [ "lazy_static", "sp-core", @@ -8007,7 +8008,7 @@ dependencies = [ [[package]] name = "sp-npos-elections" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" dependencies = [ "parity-scale-codec", "serde", @@ -8019,7 +8020,7 @@ dependencies = [ [[package]] name = "sp-npos-elections-compact" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" dependencies = [ "proc-macro-crate", "proc-macro2 1.0.18", @@ -8030,7 +8031,7 @@ dependencies = [ [[package]] name = "sp-offchain" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" dependencies = [ "sp-api", "sp-core", @@ -8040,7 +8041,7 @@ dependencies = [ [[package]] name = "sp-panic-handler" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" dependencies = [ "backtrace", "log 0.4.11", @@ -8049,7 +8050,7 @@ dependencies = [ [[package]] name = "sp-rpc" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" dependencies = [ "serde", "sp-core", @@ -8058,7 +8059,7 @@ dependencies = [ [[package]] name = "sp-runtime" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" dependencies = [ "either", "hash256-std-hasher", @@ -8080,13 +8081,14 @@ dependencies = [ [[package]] name = "sp-runtime-interface" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" dependencies = [ "parity-scale-codec", "primitive-types", "sp-externalities", "sp-runtime-interface-proc-macro", "sp-std", + "sp-storage", "sp-tracing", "sp-wasm-interface", "static_assertions", @@ -8095,7 +8097,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" dependencies = [ "Inflector", "proc-macro-crate", @@ -8107,7 +8109,7 @@ dependencies = [ [[package]] name = "sp-serializer" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" dependencies = [ "serde", "serde_json", @@ -8116,7 +8118,7 @@ dependencies = [ [[package]] name = "sp-session" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" dependencies = [ "parity-scale-codec", "sp-api", @@ -8129,7 +8131,7 @@ dependencies = [ [[package]] name = "sp-staking" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" dependencies = [ "parity-scale-codec", "sp-runtime", @@ -8139,7 +8141,7 @@ dependencies = [ [[package]] name = "sp-state-machine" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" dependencies = [ "hash-db", "itertools 0.9.0", @@ -8160,14 +8162,15 @@ dependencies = [ [[package]] name = "sp-std" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" [[package]] name = "sp-storage" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" dependencies = [ "impl-serde 0.2.3", + "parity-scale-codec", "ref-cast", "serde", "sp-debug-derive", @@ -8177,7 +8180,7 @@ dependencies = [ [[package]] name = "sp-timestamp" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -8191,7 +8194,7 @@ dependencies = [ [[package]] name = "sp-tracing" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" dependencies = [ "log 0.4.11", "rental", @@ -8201,7 +8204,7 @@ dependencies = [ [[package]] name = "sp-transaction-pool" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" dependencies = [ "derive_more 0.99.9", "futures 0.3.5", @@ -8216,7 +8219,7 @@ dependencies = [ [[package]] name = "sp-trie" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" dependencies = [ "hash-db", "memory-db", @@ -8230,7 +8233,7 @@ dependencies = [ [[package]] name = "sp-utils" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" dependencies = [ "futures 0.3.5", "futures-core", @@ -8242,7 +8245,7 @@ dependencies = [ [[package]] name = "sp-version" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" dependencies = [ "impl-serde 0.2.3", "parity-scale-codec", @@ -8254,7 +8257,7 @@ dependencies = [ [[package]] name = "sp-wasm-interface" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -8385,7 +8388,7 @@ dependencies = [ [[package]] name = "substrate-browser-utils" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" dependencies = [ "chrono", "console_error_panic_hook", @@ -8411,7 +8414,7 @@ dependencies = [ [[package]] name = "substrate-build-script-utils" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" dependencies = [ "platforms", ] @@ -8419,7 +8422,7 @@ dependencies = [ [[package]] name = "substrate-frame-rpc-system" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" dependencies = [ "frame-system-rpc-runtime-api", "futures 0.3.5", @@ -8442,7 +8445,7 @@ dependencies = [ [[package]] name = "substrate-prometheus-endpoint" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" dependencies = [ "async-std", "derive_more 0.99.9", @@ -8456,7 +8459,7 @@ dependencies = [ [[package]] name = "substrate-test-client" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" dependencies = [ "futures 0.1.29", "futures 0.3.5", @@ -8482,7 +8485,7 @@ dependencies = [ [[package]] name = "substrate-test-runtime" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" dependencies = [ "cfg-if", "frame-executive", @@ -8522,7 +8525,7 @@ dependencies = [ [[package]] name = "substrate-test-runtime-client" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" dependencies = [ "futures 0.3.5", "parity-scale-codec", @@ -8543,7 +8546,7 @@ dependencies = [ [[package]] name = "substrate-test-utils" version = "2.0.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" dependencies = [ "futures 0.3.5", "substrate-test-utils-derive", @@ -8553,7 +8556,7 @@ dependencies = [ [[package]] name = "substrate-test-utils-derive" version = "0.8.0-rc5" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" dependencies = [ "proc-macro-crate", "quote 1.0.7", @@ -8563,7 +8566,7 @@ dependencies = [ [[package]] name = "substrate-wasm-builder-runner" version = "1.0.6" -source = "git+https://github.com/paritytech/substrate#8e1ed7d96df71688820788eff6939b8cbec8803c" +source = "git+https://github.com/paritytech/substrate#368903f7aa9ef652bf8157d476dc13cb36e3affc" [[package]] name = "substrate-wasm-builder-runner" diff --git a/parachain/src/wasm_executor/mod.rs b/parachain/src/wasm_executor/mod.rs index a19d6150d0..c9ab7587bf 100644 --- a/parachain/src/wasm_executor/mod.rs +++ b/parachain/src/wasm_executor/mod.rs @@ -23,7 +23,7 @@ use std::any::{TypeId, Any}; use crate::primitives::{ValidationParams, ValidationResult}; use codec::{Decode, Encode}; -use sp_core::{storage::ChildInfo, traits::{CallInWasm, SpawnNamed}}; +use sp_core::{storage::{ChildInfo, TrackedStorageKey}, traits::{CallInWasm, SpawnNamed}}; use sp_externalities::Extensions; use sp_wasm_interface::HostFunctions as _; @@ -305,7 +305,11 @@ impl sp_externalities::Externalities for ValidationExternalities { panic!("reset_read_write_count: unsupported feature for parachain validation") } - fn set_whitelist(&mut self, _: Vec>) { + fn get_whitelist(&self) -> Vec { + panic!("get_whitelist: unsupported feature for parachain validation") + } + + fn set_whitelist(&mut self, _: Vec) { panic!("set_whitelist: unsupported feature for parachain validation") } diff --git a/runtime/kusama/src/lib.rs b/runtime/kusama/src/lib.rs index 4ad493d35c..71f6fdaf18 100644 --- a/runtime/kusama/src/lib.rs +++ b/runtime/kusama/src/lib.rs @@ -1204,7 +1204,7 @@ sp_api::impl_runtime_apis! { repeat: u32, extra: bool, ) -> Result, RuntimeString> { - use frame_benchmarking::{Benchmarking, BenchmarkBatch, add_benchmark}; + use frame_benchmarking::{Benchmarking, BenchmarkBatch, add_benchmark, TrackedStorageKey}; // Trying to add benchmarks directly to the Session Pallet caused cyclic dependency issues. // To get around that, we separated the Session benchmarks into its own crate, which is why // we need these two lines below. @@ -1216,22 +1216,19 @@ sp_api::impl_runtime_apis! { impl pallet_offences_benchmarking::Trait for Runtime {} impl frame_system_benchmarking::Trait for Runtime {} - let whitelist: Vec> = vec![ + let whitelist: Vec = vec![ // Block Number - // frame_system::Number::::hashed_key().to_vec(), - hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef702a5c1b19ab7a04f536c519aca4983ac").to_vec(), + hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef702a5c1b19ab7a04f536c519aca4983ac").to_vec().into(), // Total Issuance - hex_literal::hex!("c2261276cc9d1f8598ea4b6a74b15c2f57c875e4cff74148e4628f264b974c80").to_vec(), + hex_literal::hex!("c2261276cc9d1f8598ea4b6a74b15c2f57c875e4cff74148e4628f264b974c80").to_vec().into(), // Execution Phase - hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef7ff553b5a9862a516939d82b3d3d8661a").to_vec(), + hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef7ff553b5a9862a516939d82b3d3d8661a").to_vec().into(), // Event Count - hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef70a98fdbe9ce6c55837576c60c7af3850").to_vec(), + hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef70a98fdbe9ce6c55837576c60c7af3850").to_vec().into(), // System Events - hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef780d41e5e16056765bc8461851072c9d7").to_vec(), - // Caller 0 Account - hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da946c154ffd9992e395af90b5b13cc6f295c77033fce8a9045824a6690bbf99c6db269502f0a8d1d2a008542d5690a0749").to_vec(), + hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef780d41e5e16056765bc8461851072c9d7").to_vec().into(), // Treasury Account - hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da95ecffd7b6c0f78751baa9d281e0bfa3a6d6f646c70792f74727372790000000000000000000000000000000000000000").to_vec(), + hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da95ecffd7b6c0f78751baa9d281e0bfa3a6d6f646c70792f74727372790000000000000000000000000000000000000000").to_vec().into(), ]; let mut batches = Vec::::new(); diff --git a/runtime/polkadot/src/lib.rs b/runtime/polkadot/src/lib.rs index 9974d3b154..8d1e5a79e3 100644 --- a/runtime/polkadot/src/lib.rs +++ b/runtime/polkadot/src/lib.rs @@ -1345,7 +1345,7 @@ sp_api::impl_runtime_apis! { repeat: u32, extra: bool, ) -> Result, RuntimeString> { - use frame_benchmarking::{Benchmarking, BenchmarkBatch, add_benchmark}; + use frame_benchmarking::{Benchmarking, BenchmarkBatch, add_benchmark, TrackedStorageKey}; // Trying to add benchmarks directly to the Session Pallet caused cyclic dependency issues. // To get around that, we separated the Session benchmarks into its own crate, which is why // we need these two lines below. @@ -1357,22 +1357,19 @@ sp_api::impl_runtime_apis! { impl pallet_offences_benchmarking::Trait for Runtime {} impl frame_system_benchmarking::Trait for Runtime {} - let whitelist: Vec> = vec![ + let whitelist: Vec = vec![ // Block Number - // frame_system::Number::::hashed_key().to_vec(), - hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef702a5c1b19ab7a04f536c519aca4983ac").to_vec(), + hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef702a5c1b19ab7a04f536c519aca4983ac").to_vec().into(), // Total Issuance - hex_literal::hex!("c2261276cc9d1f8598ea4b6a74b15c2f57c875e4cff74148e4628f264b974c80").to_vec(), + hex_literal::hex!("c2261276cc9d1f8598ea4b6a74b15c2f57c875e4cff74148e4628f264b974c80").to_vec().into(), // Execution Phase - hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef7ff553b5a9862a516939d82b3d3d8661a").to_vec(), + hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef7ff553b5a9862a516939d82b3d3d8661a").to_vec().into(), // Event Count - hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef70a98fdbe9ce6c55837576c60c7af3850").to_vec(), + hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef70a98fdbe9ce6c55837576c60c7af3850").to_vec().into(), // System Events - hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef780d41e5e16056765bc8461851072c9d7").to_vec(), - // Caller 0 Account - hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da946c154ffd9992e395af90b5b13cc6f295c77033fce8a9045824a6690bbf99c6db269502f0a8d1d2a008542d5690a0749").to_vec(), + hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef780d41e5e16056765bc8461851072c9d7").to_vec().into(), // Treasury Account - hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da95ecffd7b6c0f78751baa9d281e0bfa3a6d6f646c70792f74727372790000000000000000000000000000000000000000").to_vec(), + hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da95ecffd7b6c0f78751baa9d281e0bfa3a6d6f646c70792f74727372790000000000000000000000000000000000000000").to_vec().into(), ]; let mut batches = Vec::::new(); diff --git a/runtime/westend/src/lib.rs b/runtime/westend/src/lib.rs index 518bb71d44..5cb91d5afd 100644 --- a/runtime/westend/src/lib.rs +++ b/runtime/westend/src/lib.rs @@ -1001,7 +1001,7 @@ sp_api::impl_runtime_apis! { repeat: u32, extra: bool, ) -> Result, RuntimeString> { - use frame_benchmarking::{Benchmarking, BenchmarkBatch, add_benchmark}; + use frame_benchmarking::{Benchmarking, BenchmarkBatch, add_benchmark, TrackedStorageKey}; // Trying to add benchmarks directly to the Session Pallet caused cyclic dependency issues. // To get around that, we separated the Session benchmarks into its own crate, which is why // we need these two lines below. @@ -1013,22 +1013,19 @@ sp_api::impl_runtime_apis! { impl pallet_offences_benchmarking::Trait for Runtime {} impl frame_system_benchmarking::Trait for Runtime {} - let whitelist: Vec> = vec![ + let whitelist: Vec = vec![ // Block Number - // frame_system::Number::::hashed_key().to_vec(), - hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef702a5c1b19ab7a04f536c519aca4983ac").to_vec(), + hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef702a5c1b19ab7a04f536c519aca4983ac").to_vec().into(), // Total Issuance - hex_literal::hex!("c2261276cc9d1f8598ea4b6a74b15c2f57c875e4cff74148e4628f264b974c80").to_vec(), + hex_literal::hex!("c2261276cc9d1f8598ea4b6a74b15c2f57c875e4cff74148e4628f264b974c80").to_vec().into(), // Execution Phase - hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef7ff553b5a9862a516939d82b3d3d8661a").to_vec(), + hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef7ff553b5a9862a516939d82b3d3d8661a").to_vec().into(), // Event Count - hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef70a98fdbe9ce6c55837576c60c7af3850").to_vec(), + hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef70a98fdbe9ce6c55837576c60c7af3850").to_vec().into(), // System Events - hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef780d41e5e16056765bc8461851072c9d7").to_vec(), - // Caller 0 Account - hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da946c154ffd9992e395af90b5b13cc6f295c77033fce8a9045824a6690bbf99c6db269502f0a8d1d2a008542d5690a0749").to_vec(), + hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef780d41e5e16056765bc8461851072c9d7").to_vec().into(), // Treasury Account - hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da95ecffd7b6c0f78751baa9d281e0bfa3a6d6f646c70792f74727372790000000000000000000000000000000000000000").to_vec(), + hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da95ecffd7b6c0f78751baa9d281e0bfa3a6d6f646c70792f74727372790000000000000000000000000000000000000000").to_vec().into(), ]; let mut batches = Vec::::new(); -- GitLab